From 0073144e3dc4253e33326fb64b46bb6cb7c2f3b4 Mon Sep 17 00:00:00 2001 From: tsb1995 <47466105+tsb1995@users.noreply.github.com> Date: Tue, 10 Dec 2019 15:03:36 -0800 Subject: [PATCH] test render_template --- .gitignore | 55 + Procfile | 1 + README.md | 0 __pycache__/app.cpython-37.pyc | Bin 0 -> 377 bytes app.py | 9 + env/Include/Python-ast.h | 637 ++ env/Include/Python.h | 159 + env/Include/abstract.h | 1109 +++ env/Include/accu.h | 37 + env/Include/asdl.h | 46 + env/Include/ast.h | 29 + env/Include/bitset.h | 32 + env/Include/bltinmodule.h | 14 + env/Include/boolobject.h | 34 + env/Include/bytearrayobject.h | 62 + env/Include/bytes_methods.h | 69 + env/Include/bytesobject.h | 224 + env/Include/cellobject.h | 29 + env/Include/ceval.h | 239 + env/Include/classobject.h | 58 + env/Include/code.h | 157 + env/Include/codecs.h | 240 + env/Include/compile.h | 93 + env/Include/complexobject.h | 69 + env/Include/context.h | 84 + env/Include/datetime.h | 273 + env/Include/descrobject.h | 110 + env/Include/dictobject.h | 179 + env/Include/dtoa.h | 19 + env/Include/dynamic_annotations.h | 499 + env/Include/enumobject.h | 17 + env/Include/errcode.h | 38 + env/Include/eval.h | 37 + env/Include/fileobject.h | 55 + env/Include/fileutils.h | 201 + env/Include/floatobject.h | 130 + env/Include/frameobject.h | 93 + env/Include/funcobject.h | 103 + env/Include/genobject.h | 105 + env/Include/graminit.h | 89 + env/Include/grammar.h | 94 + env/Include/import.h | 151 + env/Include/internal/ceval.h | 52 + env/Include/internal/condvar.h | 91 + env/Include/internal/context.h | 41 + env/Include/internal/gil.h | 46 + env/Include/internal/hamt.h | 113 + env/Include/internal/hash.h | 6 + env/Include/internal/import.h | 6 + env/Include/internal/mem.h | 175 + env/Include/internal/pygetopt.h | 19 + env/Include/internal/pystate.h | 135 + env/Include/internal/warnings.h | 21 + env/Include/intrcheck.h | 33 + env/Include/iterobject.h | 25 + env/Include/listobject.h | 81 + env/Include/longintrepr.h | 99 + env/Include/longobject.h | 220 + env/Include/marshal.h | 28 + env/Include/memoryobject.h | 72 + env/Include/metagrammar.h | 18 + env/Include/methodobject.h | 135 + env/Include/modsupport.h | 229 + env/Include/moduleobject.h | 89 + env/Include/namespaceobject.h | 19 + env/Include/node.h | 44 + env/Include/object.h | 1105 +++ env/Include/objimpl.h | 374 + env/Include/odictobject.h | 43 + env/Include/opcode.h | 147 + env/Include/osdefs.h | 47 + env/Include/osmodule.h | 17 + env/Include/parsetok.h | 108 + env/Include/patchlevel.h | 35 + env/Include/pgen.h | 18 + env/Include/pgenheaders.h | 43 + env/Include/py_curses.h | 159 + env/Include/pyarena.h | 64 + env/Include/pyatomic.h | 535 ++ env/Include/pycapsule.h | 59 + env/Include/pyconfig.h | 680 ++ env/Include/pyctype.h | 33 + env/Include/pydebug.h | 40 + env/Include/pydtrace.h | 57 + env/Include/pyerrors.h | 504 + env/Include/pyexpat.h | 55 + env/Include/pyfpe.h | 12 + env/Include/pyhash.h | 145 + env/Include/pylifecycle.h | 238 + env/Include/pymacconfig.h | 102 + env/Include/pymacro.h | 100 + env/Include/pymath.h | 230 + env/Include/pymem.h | 244 + env/Include/pyport.h | 793 ++ env/Include/pystate.h | 455 + env/Include/pystrcmp.h | 23 + env/Include/pystrhex.h | 19 + env/Include/pystrtod.h | 45 + env/Include/pythonrun.h | 181 + env/Include/pythread.h | 155 + env/Include/pytime.h | 246 + env/Include/rangeobject.h | 27 + env/Include/setobject.h | 108 + env/Include/sliceobject.h | 63 + env/Include/structmember.h | 74 + env/Include/structseq.h | 49 + env/Include/symtable.h | 118 + env/Include/sysmodule.h | 48 + env/Include/token.h | 92 + env/Include/traceback.h | 119 + env/Include/tupleobject.h | 73 + env/Include/typeslots.h | 85 + env/Include/ucnhash.h | 36 + env/Include/unicodeobject.h | 2334 +++++ env/Include/warnings.h | 67 + env/Include/weakrefobject.h | 86 + env/LICENSE.txt | 603 ++ env/Lib/__future__.py | 146 + env/Lib/__pycache__/__future__.cpython-37.pyc | Bin 0 -> 4141 bytes .../__pycache__/_bootlocale.cpython-37.pyc | Bin 0 -> 1258 bytes .../_collections_abc.cpython-37.pyc | Bin 0 -> 28951 bytes .../__pycache__/_weakrefset.cpython-37.pyc | Bin 0 -> 7471 bytes env/Lib/__pycache__/abc.cpython-37.pyc | Bin 0 -> 6460 bytes env/Lib/__pycache__/base64.cpython-37.pyc | Bin 0 -> 16997 bytes env/Lib/__pycache__/bisect.cpython-37.pyc | Bin 0 -> 2707 bytes env/Lib/__pycache__/codecs.cpython-37.pyc | Bin 0 -> 34084 bytes env/Lib/__pycache__/copy.cpython-37.pyc | Bin 0 -> 7110 bytes env/Lib/__pycache__/copyreg.cpython-37.pyc | Bin 0 -> 4253 bytes env/Lib/__pycache__/enum.cpython-37.pyc | Bin 0 -> 24280 bytes env/Lib/__pycache__/fnmatch.cpython-37.pyc | Bin 0 -> 3346 bytes env/Lib/__pycache__/functools.cpython-37.pyc | Bin 0 -> 24224 bytes .../__pycache__/genericpath.cpython-37.pyc | Bin 0 -> 3757 bytes env/Lib/__pycache__/hashlib.cpython-37.pyc | Bin 0 -> 6600 bytes env/Lib/__pycache__/heapq.cpython-37.pyc | Bin 0 -> 14371 bytes env/Lib/__pycache__/hmac.cpython-37.pyc | Bin 0 -> 6122 bytes env/Lib/__pycache__/io.cpython-37.pyc | Bin 0 -> 3418 bytes env/Lib/__pycache__/keyword.cpython-37.pyc | Bin 0 -> 1818 bytes env/Lib/__pycache__/linecache.cpython-37.pyc | Bin 0 -> 3798 bytes env/Lib/__pycache__/locale.cpython-37.pyc | Bin 0 -> 34564 bytes env/Lib/__pycache__/ntpath.cpython-37.pyc | Bin 0 -> 13013 bytes env/Lib/__pycache__/operator.cpython-37.pyc | Bin 0 -> 13909 bytes env/Lib/__pycache__/os.cpython-37.pyc | Bin 0 -> 29702 bytes env/Lib/__pycache__/posixpath.cpython-37.pyc | Bin 0 -> 10438 bytes env/Lib/__pycache__/random.cpython-37.pyc | Bin 0 -> 19417 bytes env/Lib/__pycache__/re.cpython-37.pyc | Bin 0 -> 13813 bytes env/Lib/__pycache__/reprlib.cpython-37.pyc | Bin 0 -> 5359 bytes env/Lib/__pycache__/shutil.cpython-37.pyc | Bin 0 -> 30989 bytes env/Lib/__pycache__/site.cpython-37.pyc | Bin 0 -> 21788 bytes .../__pycache__/sre_compile.cpython-37.pyc | Bin 0 -> 15212 bytes .../__pycache__/sre_constants.cpython-37.pyc | Bin 0 -> 6300 bytes env/Lib/__pycache__/sre_parse.cpython-37.pyc | Bin 0 -> 21366 bytes env/Lib/__pycache__/stat.cpython-37.pyc | Bin 0 -> 3882 bytes env/Lib/__pycache__/struct.cpython-37.pyc | Bin 0 -> 343 bytes env/Lib/__pycache__/tarfile.cpython-37.pyc | Bin 0 -> 61850 bytes env/Lib/__pycache__/tempfile.cpython-37.pyc | Bin 0 -> 22154 bytes env/Lib/__pycache__/token.cpython-37.pyc | Bin 0 -> 3608 bytes env/Lib/__pycache__/tokenize.cpython-37.pyc | Bin 0 -> 17840 bytes env/Lib/__pycache__/types.cpython-37.pyc | Bin 0 -> 8985 bytes env/Lib/__pycache__/warnings.cpython-37.pyc | Bin 0 -> 13949 bytes env/Lib/__pycache__/weakref.cpython-37.pyc | Bin 0 -> 19583 bytes env/Lib/_bootlocale.py | 46 + env/Lib/_collections_abc.py | 1011 ++ env/Lib/_dummy_thread.py | 193 + env/Lib/_weakrefset.py | 196 + env/Lib/abc.py | 170 + env/Lib/base64.py | 595 ++ env/Lib/bisect.py | 92 + env/Lib/codecs.py | 1120 +++ env/Lib/collections/__init__.py | 1299 +++ .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 47095 bytes .../__pycache__/abc.cpython-37.pyc | Bin 0 -> 224 bytes env/Lib/collections/abc.py | 2 + env/Lib/copy.py | 313 + env/Lib/copyreg.py | 206 + env/Lib/distutils/__init__.py | 134 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 3157 bytes env/Lib/distutils/distutils.cfg | 6 + env/Lib/encodings/__init__.py | 170 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 3966 bytes .../__pycache__/aliases.cpython-37.pyc | Bin 0 -> 6315 bytes .../__pycache__/ascii.cpython-37.pyc | Bin 0 -> 1903 bytes .../encodings/__pycache__/big5.cpython-37.pyc | Bin 0 -> 1463 bytes .../__pycache__/cp1252.cpython-37.pyc | Bin 0 -> 2475 bytes .../__pycache__/cp437.cpython-37.pyc | Bin 0 -> 7862 bytes .../__pycache__/hex_codec.cpython-37.pyc | Bin 0 -> 2429 bytes .../encodings/__pycache__/idna.cpython-37.pyc | Bin 0 -> 5743 bytes .../__pycache__/iso8859_5.cpython-37.pyc | Bin 0 -> 2448 bytes .../__pycache__/latin_1.cpython-37.pyc | Bin 0 -> 1915 bytes .../encodings/__pycache__/mbcs.cpython-37.pyc | Bin 0 -> 1714 bytes .../raw_unicode_escape.cpython-37.pyc | Bin 0 -> 1788 bytes .../__pycache__/unicode_escape.cpython-37.pyc | Bin 0 -> 1768 bytes .../__pycache__/utf_16_be.cpython-37.pyc | Bin 0 -> 1653 bytes .../__pycache__/utf_16_le.cpython-37.pyc | Bin 0 -> 1653 bytes .../__pycache__/utf_8.cpython-37.pyc | Bin 0 -> 1633 bytes env/Lib/encodings/aliases.py | 550 ++ env/Lib/encodings/ascii.py | 50 + env/Lib/encodings/base64_codec.py | 55 + env/Lib/encodings/big5.py | 39 + env/Lib/encodings/big5hkscs.py | 39 + env/Lib/encodings/bz2_codec.py | 78 + env/Lib/encodings/charmap.py | 69 + env/Lib/encodings/cp037.py | 307 + env/Lib/encodings/cp1006.py | 307 + env/Lib/encodings/cp1026.py | 307 + env/Lib/encodings/cp1125.py | 698 ++ env/Lib/encodings/cp1140.py | 307 + env/Lib/encodings/cp1250.py | 307 + env/Lib/encodings/cp1251.py | 307 + env/Lib/encodings/cp1252.py | 307 + env/Lib/encodings/cp1253.py | 307 + env/Lib/encodings/cp1254.py | 307 + env/Lib/encodings/cp1255.py | 307 + env/Lib/encodings/cp1256.py | 307 + env/Lib/encodings/cp1257.py | 307 + env/Lib/encodings/cp1258.py | 307 + env/Lib/encodings/cp273.py | 307 + env/Lib/encodings/cp424.py | 307 + env/Lib/encodings/cp437.py | 698 ++ env/Lib/encodings/cp500.py | 307 + env/Lib/encodings/cp65001.py | 43 + env/Lib/encodings/cp720.py | 309 + env/Lib/encodings/cp737.py | 698 ++ env/Lib/encodings/cp775.py | 697 ++ env/Lib/encodings/cp850.py | 698 ++ env/Lib/encodings/cp852.py | 698 ++ env/Lib/encodings/cp855.py | 698 ++ env/Lib/encodings/cp856.py | 307 + env/Lib/encodings/cp857.py | 694 ++ env/Lib/encodings/cp858.py | 698 ++ env/Lib/encodings/cp860.py | 698 ++ env/Lib/encodings/cp861.py | 698 ++ env/Lib/encodings/cp862.py | 698 ++ env/Lib/encodings/cp863.py | 698 ++ env/Lib/encodings/cp864.py | 690 ++ env/Lib/encodings/cp865.py | 698 ++ env/Lib/encodings/cp866.py | 698 ++ env/Lib/encodings/cp869.py | 689 ++ env/Lib/encodings/cp874.py | 307 + env/Lib/encodings/cp875.py | 307 + env/Lib/encodings/cp932.py | 39 + env/Lib/encodings/cp949.py | 39 + env/Lib/encodings/cp950.py | 39 + env/Lib/encodings/euc_jis_2004.py | 39 + env/Lib/encodings/euc_jisx0213.py | 39 + env/Lib/encodings/euc_jp.py | 39 + env/Lib/encodings/euc_kr.py | 39 + env/Lib/encodings/gb18030.py | 39 + env/Lib/encodings/gb2312.py | 39 + env/Lib/encodings/gbk.py | 39 + env/Lib/encodings/hex_codec.py | 55 + env/Lib/encodings/hp_roman8.py | 314 + env/Lib/encodings/hz.py | 39 + env/Lib/encodings/idna.py | 309 + env/Lib/encodings/iso2022_jp.py | 39 + env/Lib/encodings/iso2022_jp_1.py | 39 + env/Lib/encodings/iso2022_jp_2.py | 39 + env/Lib/encodings/iso2022_jp_2004.py | 39 + env/Lib/encodings/iso2022_jp_3.py | 39 + env/Lib/encodings/iso2022_jp_ext.py | 39 + env/Lib/encodings/iso2022_kr.py | 39 + env/Lib/encodings/iso8859_1.py | 307 + env/Lib/encodings/iso8859_10.py | 307 + env/Lib/encodings/iso8859_11.py | 307 + env/Lib/encodings/iso8859_13.py | 307 + env/Lib/encodings/iso8859_14.py | 307 + env/Lib/encodings/iso8859_15.py | 307 + env/Lib/encodings/iso8859_16.py | 307 + env/Lib/encodings/iso8859_2.py | 307 + env/Lib/encodings/iso8859_3.py | 307 + env/Lib/encodings/iso8859_4.py | 307 + env/Lib/encodings/iso8859_5.py | 307 + env/Lib/encodings/iso8859_6.py | 307 + env/Lib/encodings/iso8859_7.py | 307 + env/Lib/encodings/iso8859_8.py | 307 + env/Lib/encodings/iso8859_9.py | 307 + env/Lib/encodings/johab.py | 39 + env/Lib/encodings/koi8_r.py | 307 + env/Lib/encodings/koi8_t.py | 308 + env/Lib/encodings/koi8_u.py | 307 + env/Lib/encodings/kz1048.py | 307 + env/Lib/encodings/latin_1.py | 50 + env/Lib/encodings/mac_arabic.py | 698 ++ env/Lib/encodings/mac_centeuro.py | 307 + env/Lib/encodings/mac_croatian.py | 307 + env/Lib/encodings/mac_cyrillic.py | 307 + env/Lib/encodings/mac_farsi.py | 307 + env/Lib/encodings/mac_greek.py | 307 + env/Lib/encodings/mac_iceland.py | 307 + env/Lib/encodings/mac_latin2.py | 312 + env/Lib/encodings/mac_roman.py | 307 + env/Lib/encodings/mac_romanian.py | 307 + env/Lib/encodings/mac_turkish.py | 307 + env/Lib/encodings/mbcs.py | 47 + env/Lib/encodings/oem.py | 41 + env/Lib/encodings/palmos.py | 308 + env/Lib/encodings/ptcp154.py | 312 + env/Lib/encodings/punycode.py | 237 + env/Lib/encodings/quopri_codec.py | 56 + env/Lib/encodings/raw_unicode_escape.py | 45 + env/Lib/encodings/rot_13.py | 113 + env/Lib/encodings/shift_jis.py | 39 + env/Lib/encodings/shift_jis_2004.py | 39 + env/Lib/encodings/shift_jisx0213.py | 39 + env/Lib/encodings/tis_620.py | 307 + env/Lib/encodings/undefined.py | 49 + env/Lib/encodings/unicode_escape.py | 45 + env/Lib/encodings/unicode_internal.py | 45 + env/Lib/encodings/utf_16.py | 155 + env/Lib/encodings/utf_16_be.py | 42 + env/Lib/encodings/utf_16_le.py | 42 + env/Lib/encodings/utf_32.py | 150 + env/Lib/encodings/utf_32_be.py | 37 + env/Lib/encodings/utf_32_le.py | 37 + env/Lib/encodings/utf_7.py | 38 + env/Lib/encodings/utf_8.py | 42 + env/Lib/encodings/utf_8_sig.py | 130 + env/Lib/encodings/uu_codec.py | 99 + env/Lib/encodings/zlib_codec.py | 77 + env/Lib/enum.py | 910 ++ env/Lib/fnmatch.py | 128 + env/Lib/functools.py | 849 ++ env/Lib/genericpath.py | 151 + env/Lib/hashlib.py | 252 + env/Lib/heapq.py | 607 ++ env/Lib/hmac.py | 188 + env/Lib/imp.py | 345 + env/Lib/importlib/__init__.py | 176 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 3751 bytes .../importlib/__pycache__/abc.cpython-37.pyc | Bin 0 -> 13506 bytes .../__pycache__/machinery.cpython-37.pyc | Bin 0 -> 991 bytes .../importlib/__pycache__/util.cpython-37.pyc | Bin 0 -> 9375 bytes env/Lib/importlib/_bootstrap.py | 1164 +++ env/Lib/importlib/_bootstrap_external.py | 1562 ++++ env/Lib/importlib/abc.py | 388 + env/Lib/importlib/machinery.py | 21 + env/Lib/importlib/resources.py | 343 + env/Lib/importlib/util.py | 300 + env/Lib/io.py | 99 + env/Lib/keyword.py | 96 + env/Lib/linecache.py | 177 + env/Lib/locale.py | 1749 ++++ env/Lib/no-global-site-packages.txt | 0 env/Lib/ntpath.py | 669 ++ env/Lib/operator.py | 464 + env/Lib/orig-prefix.txt | 1 + env/Lib/os.py | 1078 +++ env/Lib/posixpath.py | 529 ++ env/Lib/random.py | 777 ++ env/Lib/re.py | 366 + env/Lib/reprlib.py | 161 + env/Lib/rlcompleter.py | 205 + env/Lib/shutil.py | 1188 +++ .../Click-7.0.dist-info/INSTALLER | 1 + .../Click-7.0.dist-info/LICENSE.txt | 39 + .../Click-7.0.dist-info/METADATA | 121 + .../site-packages/Click-7.0.dist-info/RECORD | 40 + .../site-packages/Click-7.0.dist-info/WHEEL | 6 + .../Click-7.0.dist-info/top_level.txt | 1 + .../Flask-1.1.1.dist-info/INSTALLER | 1 + .../Flask-1.1.1.dist-info/LICENSE.rst | 28 + .../Flask-1.1.1.dist-info/METADATA | 134 + .../Flask-1.1.1.dist-info/RECORD | 48 + .../site-packages/Flask-1.1.1.dist-info/WHEEL | 6 + .../Flask-1.1.1.dist-info/entry_points.txt | 3 + .../Flask-1.1.1.dist-info/top_level.txt | 1 + .../Jinja2-2.10.3.dist-info/INSTALLER | 1 + .../Jinja2-2.10.3.dist-info/LICENSE.rst | 28 + .../Jinja2-2.10.3.dist-info/METADATA | 103 + .../Jinja2-2.10.3.dist-info/RECORD | 61 + .../Jinja2-2.10.3.dist-info/WHEEL | 6 + .../Jinja2-2.10.3.dist-info/entry_points.txt | 3 + .../Jinja2-2.10.3.dist-info/top_level.txt | 1 + .../MarkupSafe-1.1.1.dist-info/INSTALLER | 1 + .../MarkupSafe-1.1.1.dist-info/LICENSE.rst | 28 + .../MarkupSafe-1.1.1.dist-info/METADATA | 103 + .../MarkupSafe-1.1.1.dist-info/RECORD | 15 + .../MarkupSafe-1.1.1.dist-info/WHEEL | 5 + .../MarkupSafe-1.1.1.dist-info/top_level.txt | 1 + .../Werkzeug-0.16.0.dist-info/INSTALLER | 1 + .../Werkzeug-0.16.0.dist-info/LICENSE.rst | 28 + .../Werkzeug-0.16.0.dist-info/METADATA | 128 + .../Werkzeug-0.16.0.dist-info/RECORD | 119 + .../Werkzeug-0.16.0.dist-info/WHEEL | 6 + .../Werkzeug-0.16.0.dist-info/top_level.txt | 1 + .../__pycache__/easy_install.cpython-37.pyc | Bin 0 -> 308 bytes env/Lib/site-packages/click/__init__.py | 97 + .../click/__pycache__/__init__.cpython-37.pyc | Bin 0 -> 2651 bytes .../__pycache__/_bashcomplete.cpython-37.pyc | Bin 0 -> 9107 bytes .../click/__pycache__/_compat.cpython-37.pyc | Bin 0 -> 16778 bytes .../__pycache__/_termui_impl.cpython-37.pyc | Bin 0 -> 13942 bytes .../__pycache__/_textwrap.cpython-37.pyc | Bin 0 -> 1325 bytes .../__pycache__/_unicodefun.cpython-37.pyc | Bin 0 -> 3315 bytes .../__pycache__/_winconsole.cpython-37.pyc | Bin 0 -> 8722 bytes .../click/__pycache__/core.cpython-37.pyc | Bin 0 -> 59822 bytes .../__pycache__/decorators.cpython-37.pyc | Bin 0 -> 11579 bytes .../__pycache__/exceptions.cpython-37.pyc | Bin 0 -> 8605 bytes .../__pycache__/formatting.cpython-37.pyc | Bin 0 -> 8541 bytes .../click/__pycache__/globals.cpython-37.pyc | Bin 0 -> 1872 bytes .../click/__pycache__/parser.cpython-37.pyc | Bin 0 -> 11449 bytes .../click/__pycache__/termui.cpython-37.pyc | Bin 0 -> 20766 bytes .../click/__pycache__/testing.cpython-37.pyc | Bin 0 -> 11614 bytes .../click/__pycache__/types.cpython-37.pyc | Bin 0 -> 21792 bytes .../click/__pycache__/utils.cpython-37.pyc | Bin 0 -> 15237 bytes env/Lib/site-packages/click/_bashcomplete.py | 293 + env/Lib/site-packages/click/_compat.py | 703 ++ env/Lib/site-packages/click/_termui_impl.py | 621 ++ env/Lib/site-packages/click/_textwrap.py | 38 + env/Lib/site-packages/click/_unicodefun.py | 125 + env/Lib/site-packages/click/_winconsole.py | 307 + env/Lib/site-packages/click/core.py | 1856 ++++ env/Lib/site-packages/click/decorators.py | 311 + env/Lib/site-packages/click/exceptions.py | 235 + env/Lib/site-packages/click/formatting.py | 256 + env/Lib/site-packages/click/globals.py | 48 + env/Lib/site-packages/click/parser.py | 427 + env/Lib/site-packages/click/termui.py | 606 ++ env/Lib/site-packages/click/testing.py | 374 + env/Lib/site-packages/click/types.py | 668 ++ env/Lib/site-packages/click/utils.py | 440 + env/Lib/site-packages/easy_install.py | 5 + env/Lib/site-packages/flask/__init__.py | 60 + env/Lib/site-packages/flask/__main__.py | 15 + .../flask/__pycache__/__init__.cpython-37.pyc | Bin 0 -> 2119 bytes .../flask/__pycache__/__main__.cpython-37.pyc | Bin 0 -> 411 bytes .../flask/__pycache__/_compat.cpython-37.pyc | Bin 0 -> 4616 bytes .../flask/__pycache__/app.cpython-37.pyc | Bin 0 -> 74556 bytes .../__pycache__/blueprints.cpython-37.pyc | Bin 0 -> 22921 bytes .../flask/__pycache__/cli.cpython-37.pyc | Bin 0 -> 26198 bytes .../flask/__pycache__/config.cpython-37.pyc | Bin 0 -> 10156 bytes .../flask/__pycache__/ctx.cpython-37.pyc | Bin 0 -> 14317 bytes .../__pycache__/debughelpers.cpython-37.pyc | Bin 0 -> 6577 bytes .../flask/__pycache__/globals.cpython-37.pyc | Bin 0 -> 1723 bytes .../flask/__pycache__/helpers.cpython-37.pyc | Bin 0 -> 34507 bytes .../flask/__pycache__/logging.cpython-37.pyc | Bin 0 -> 3118 bytes .../flask/__pycache__/sessions.cpython-37.pyc | Bin 0 -> 12215 bytes .../flask/__pycache__/signals.cpython-37.pyc | Bin 0 -> 2396 bytes .../__pycache__/templating.cpython-37.pyc | Bin 0 -> 4975 bytes .../flask/__pycache__/testing.cpython-37.pyc | Bin 0 -> 8682 bytes .../flask/__pycache__/views.cpython-37.pyc | Bin 0 -> 4797 bytes .../flask/__pycache__/wrappers.cpython-37.pyc | Bin 0 -> 4283 bytes env/Lib/site-packages/flask/_compat.py | 145 + env/Lib/site-packages/flask/app.py | 2466 +++++ env/Lib/site-packages/flask/blueprints.py | 569 ++ env/Lib/site-packages/flask/cli.py | 970 ++ env/Lib/site-packages/flask/config.py | 269 + env/Lib/site-packages/flask/ctx.py | 475 + env/Lib/site-packages/flask/debughelpers.py | 183 + env/Lib/site-packages/flask/globals.py | 62 + env/Lib/site-packages/flask/helpers.py | 1153 +++ env/Lib/site-packages/flask/json/__init__.py | 376 + .../json/__pycache__/__init__.cpython-37.pyc | Bin 0 -> 11569 bytes .../flask/json/__pycache__/tag.cpython-37.pyc | Bin 0 -> 11096 bytes env/Lib/site-packages/flask/json/tag.py | 309 + env/Lib/site-packages/flask/logging.py | 109 + env/Lib/site-packages/flask/sessions.py | 388 + env/Lib/site-packages/flask/signals.py | 65 + env/Lib/site-packages/flask/templating.py | 155 + env/Lib/site-packages/flask/testing.py | 283 + env/Lib/site-packages/flask/views.py | 163 + env/Lib/site-packages/flask/wrappers.py | 137 + .../gunicorn-20.0.4.dist-info/INSTALLER | 1 + .../gunicorn-20.0.4.dist-info/LICENSE | 23 + .../gunicorn-20.0.4.dist-info/METADATA | 115 + .../gunicorn-20.0.4.dist-info/RECORD | 74 + .../gunicorn-20.0.4.dist-info/WHEEL | 6 + .../entry_points.txt | 7 + .../gunicorn-20.0.4.dist-info/top_level.txt | 1 + env/Lib/site-packages/gunicorn/__init__.py | 8 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 395 bytes .../__pycache__/arbiter.cpython-37.pyc | Bin 0 -> 16666 bytes .../__pycache__/config.cpython-37.pyc | Bin 0 -> 63096 bytes .../gunicorn/__pycache__/debug.cpython-37.pyc | Bin 0 -> 1989 bytes .../__pycache__/errors.cpython-37.pyc | Bin 0 -> 1048 bytes .../__pycache__/glogging.cpython-37.pyc | Bin 0 -> 11121 bytes .../__pycache__/pidfile.cpython-37.pyc | Bin 0 -> 2265 bytes .../__pycache__/reloader.cpython-37.pyc | Bin 0 -> 3882 bytes .../gunicorn/__pycache__/sock.cpython-37.pyc | Bin 0 -> 6187 bytes .../__pycache__/systemd.cpython-37.pyc | Bin 0 -> 2436 bytes .../gunicorn/__pycache__/util.cpython-37.pyc | Bin 0 -> 14121 bytes .../site-packages/gunicorn/app/__init__.py | 4 + .../app/__pycache__/__init__.cpython-37.pyc | Bin 0 -> 173 bytes .../app/__pycache__/base.cpython-37.pyc | Bin 0 -> 6307 bytes .../app/__pycache__/pasterapp.cpython-37.pyc | Bin 0 -> 2139 bytes .../app/__pycache__/wsgiapp.cpython-37.pyc | Bin 0 -> 1924 bytes env/Lib/site-packages/gunicorn/app/base.py | 228 + .../site-packages/gunicorn/app/pasterapp.py | 75 + env/Lib/site-packages/gunicorn/app/wsgiapp.py | 62 + env/Lib/site-packages/gunicorn/arbiter.py | 646 ++ env/Lib/site-packages/gunicorn/config.py | 2052 +++++ env/Lib/site-packages/gunicorn/debug.py | 69 + env/Lib/site-packages/gunicorn/errors.py | 29 + env/Lib/site-packages/gunicorn/glogging.py | 463 + .../site-packages/gunicorn/http/__init__.py | 9 + .../http/__pycache__/__init__.cpython-37.pyc | Bin 0 -> 339 bytes .../http/__pycache__/body.cpython-37.pyc | Bin 0 -> 6421 bytes .../http/__pycache__/errors.cpython-37.pyc | Bin 0 -> 5869 bytes .../http/__pycache__/message.cpython-37.pyc | Bin 0 -> 8664 bytes .../http/__pycache__/parser.cpython-37.pyc | Bin 0 -> 1334 bytes .../http/__pycache__/unreader.cpython-37.pyc | Bin 0 -> 2395 bytes .../http/__pycache__/wsgi.cpython-37.pyc | Bin 0 -> 9016 bytes env/Lib/site-packages/gunicorn/http/body.py | 262 + env/Lib/site-packages/gunicorn/http/errors.py | 120 + .../site-packages/gunicorn/http/message.py | 368 + env/Lib/site-packages/gunicorn/http/parser.py | 51 + .../site-packages/gunicorn/http/unreader.py | 79 + env/Lib/site-packages/gunicorn/http/wsgi.py | 404 + .../gunicorn/instrument/__init__.py | 0 .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 180 bytes .../__pycache__/statsd.cpython-37.pyc | Bin 0 -> 4506 bytes .../gunicorn/instrument/statsd.py | 129 + env/Lib/site-packages/gunicorn/pidfile.py | 86 + env/Lib/site-packages/gunicorn/reloader.py | 130 + env/Lib/site-packages/gunicorn/sock.py | 212 + env/Lib/site-packages/gunicorn/systemd.py | 77 + env/Lib/site-packages/gunicorn/util.py | 669 ++ .../gunicorn/workers/__init__.py | 15 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 538 bytes .../workers/__pycache__/base.cpython-37.pyc | Bin 0 -> 7470 bytes .../__pycache__/base_async.cpython-37.pyc | Bin 0 -> 3837 bytes .../__pycache__/geventlet.cpython-37.pyc | Bin 0 -> 4528 bytes .../__pycache__/ggevent.cpython-37.pyc | Bin 0 -> 6015 bytes .../__pycache__/gthread.cpython-37.pyc | Bin 0 -> 8597 bytes .../__pycache__/gtornado.cpython-37.pyc | Bin 0 -> 4405 bytes .../workers/__pycache__/sync.cpython-37.pyc | Bin 0 -> 5082 bytes .../__pycache__/workertmp.cpython-37.pyc | Bin 0 -> 1690 bytes .../site-packages/gunicorn/workers/base.py | 269 + .../gunicorn/workers/base_async.py | 146 + .../gunicorn/workers/geventlet.py | 144 + .../site-packages/gunicorn/workers/ggevent.py | 205 + .../site-packages/gunicorn/workers/gthread.py | 359 + .../gunicorn/workers/gtornado.py | 169 + .../site-packages/gunicorn/workers/sync.py | 207 + .../gunicorn/workers/workertmp.py | 55 + .../itsdangerous-1.1.0.dist-info/INSTALLER | 1 + .../itsdangerous-1.1.0.dist-info/LICENSE.rst | 47 + .../itsdangerous-1.1.0.dist-info/METADATA | 98 + .../itsdangerous-1.1.0.dist-info/RECORD | 26 + .../itsdangerous-1.1.0.dist-info/WHEEL | 6 + .../top_level.txt | 1 + .../site-packages/itsdangerous/__init__.py | 22 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 1005 bytes .../__pycache__/_compat.cpython-37.pyc | Bin 0 -> 1167 bytes .../__pycache__/_json.cpython-37.pyc | Bin 0 -> 850 bytes .../__pycache__/encoding.cpython-37.pyc | Bin 0 -> 1632 bytes .../__pycache__/exc.cpython-37.pyc | Bin 0 -> 3221 bytes .../__pycache__/jws.cpython-37.pyc | Bin 0 -> 6680 bytes .../__pycache__/serializer.cpython-37.pyc | Bin 0 -> 8036 bytes .../__pycache__/signer.cpython-37.pyc | Bin 0 -> 5796 bytes .../__pycache__/timed.cpython-37.pyc | Bin 0 -> 4562 bytes .../__pycache__/url_safe.cpython-37.pyc | Bin 0 -> 2551 bytes env/Lib/site-packages/itsdangerous/_compat.py | 46 + env/Lib/site-packages/itsdangerous/_json.py | 18 + .../site-packages/itsdangerous/encoding.py | 49 + env/Lib/site-packages/itsdangerous/exc.py | 98 + env/Lib/site-packages/itsdangerous/jws.py | 218 + .../site-packages/itsdangerous/serializer.py | 233 + env/Lib/site-packages/itsdangerous/signer.py | 179 + env/Lib/site-packages/itsdangerous/timed.py | 147 + .../site-packages/itsdangerous/url_safe.py | 65 + env/Lib/site-packages/jinja2/__init__.py | 83 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 2531 bytes .../jinja2/__pycache__/_compat.cpython-37.pyc | Bin 0 -> 3425 bytes .../__pycache__/_identifier.cpython-37.pyc | Bin 0 -> 1842 bytes .../__pycache__/asyncfilters.cpython-37.pyc | Bin 0 -> 4774 bytes .../__pycache__/asyncsupport.cpython-37.pyc | Bin 0 -> 8122 bytes .../jinja2/__pycache__/bccache.cpython-37.pyc | Bin 0 -> 12636 bytes .../__pycache__/compiler.cpython-37.pyc | Bin 0 -> 46840 bytes .../__pycache__/constants.cpython-37.pyc | Bin 0 -> 1705 bytes .../jinja2/__pycache__/debug.cpython-37.pyc | Bin 0 -> 9482 bytes .../__pycache__/defaults.cpython-37.pyc | Bin 0 -> 1455 bytes .../__pycache__/environment.cpython-37.pyc | Bin 0 -> 43250 bytes .../__pycache__/exceptions.cpython-37.pyc | Bin 0 -> 5019 bytes .../jinja2/__pycache__/ext.cpython-37.pyc | Bin 0 -> 20040 bytes .../jinja2/__pycache__/filters.cpython-37.pyc | Bin 0 -> 34385 bytes .../__pycache__/idtracking.cpython-37.pyc | Bin 0 -> 9955 bytes .../jinja2/__pycache__/lexer.cpython-37.pyc | Bin 0 -> 18512 bytes .../jinja2/__pycache__/loaders.cpython-37.pyc | Bin 0 -> 16575 bytes .../jinja2/__pycache__/meta.cpython-37.pyc | Bin 0 -> 3668 bytes .../__pycache__/nativetypes.cpython-37.pyc | Bin 0 -> 5124 bytes .../jinja2/__pycache__/nodes.cpython-37.pyc | Bin 0 -> 36084 bytes .../__pycache__/optimizer.cpython-37.pyc | Bin 0 -> 2035 bytes .../jinja2/__pycache__/parser.cpython-37.pyc | Bin 0 -> 25179 bytes .../jinja2/__pycache__/runtime.cpython-37.pyc | Bin 0 -> 24522 bytes .../jinja2/__pycache__/sandbox.cpython-37.pyc | Bin 0 -> 14199 bytes .../jinja2/__pycache__/tests.cpython-37.pyc | Bin 0 -> 4393 bytes .../jinja2/__pycache__/utils.cpython-37.pyc | Bin 0 -> 20744 bytes .../jinja2/__pycache__/visitor.cpython-37.pyc | Bin 0 -> 3351 bytes env/Lib/site-packages/jinja2/_compat.py | 105 + env/Lib/site-packages/jinja2/_identifier.py | 2 + env/Lib/site-packages/jinja2/asyncfilters.py | 146 + env/Lib/site-packages/jinja2/asyncsupport.py | 256 + env/Lib/site-packages/jinja2/bccache.py | 361 + env/Lib/site-packages/jinja2/compiler.py | 1721 ++++ env/Lib/site-packages/jinja2/constants.py | 32 + env/Lib/site-packages/jinja2/debug.py | 378 + env/Lib/site-packages/jinja2/defaults.py | 56 + env/Lib/site-packages/jinja2/environment.py | 1276 +++ env/Lib/site-packages/jinja2/exceptions.py | 146 + env/Lib/site-packages/jinja2/ext.py | 627 ++ env/Lib/site-packages/jinja2/filters.py | 1190 +++ env/Lib/site-packages/jinja2/idtracking.py | 286 + env/Lib/site-packages/jinja2/lexer.py | 739 ++ env/Lib/site-packages/jinja2/loaders.py | 481 + env/Lib/site-packages/jinja2/meta.py | 106 + env/Lib/site-packages/jinja2/nativetypes.py | 220 + env/Lib/site-packages/jinja2/nodes.py | 999 ++ env/Lib/site-packages/jinja2/optimizer.py | 49 + env/Lib/site-packages/jinja2/parser.py | 903 ++ env/Lib/site-packages/jinja2/runtime.py | 808 ++ env/Lib/site-packages/jinja2/sandbox.py | 488 + env/Lib/site-packages/jinja2/tests.py | 174 + env/Lib/site-packages/jinja2/utils.py | 642 ++ env/Lib/site-packages/jinja2/visitor.py | 87 + env/Lib/site-packages/markupsafe/__init__.py | 327 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 10851 bytes .../__pycache__/_compat.cpython-37.pyc | Bin 0 -> 758 bytes .../__pycache__/_constants.cpython-37.pyc | Bin 0 -> 4258 bytes .../__pycache__/_native.cpython-37.pyc | Bin 0 -> 2110 bytes env/Lib/site-packages/markupsafe/_compat.py | 33 + .../site-packages/markupsafe/_constants.py | 264 + env/Lib/site-packages/markupsafe/_native.py | 69 + .../markupsafe/_speedups.cp37-win_amd64.pyd | Bin 0 -> 15360 bytes .../pip-19.3.1.dist-info/INSTALLER | 1 + .../pip-19.3.1.dist-info/LICENSE.txt | 20 + .../pip-19.3.1.dist-info/METADATA | 82 + .../site-packages/pip-19.3.1.dist-info/RECORD | 670 ++ .../site-packages/pip-19.3.1.dist-info/WHEEL | 6 + .../pip-19.3.1.dist-info/entry_points.txt | 5 + .../pip-19.3.1.dist-info/top_level.txt | 1 + env/Lib/site-packages/pip/__init__.py | 1 + env/Lib/site-packages/pip/__main__.py | 19 + .../pip/__pycache__/__init__.cpython-37.pyc | Bin 0 -> 181 bytes .../pip/__pycache__/__main__.cpython-37.pyc | Bin 0 -> 438 bytes .../site-packages/pip/_internal/__init__.py | 2 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 228 bytes .../__pycache__/build_env.cpython-37.pyc | Bin 0 -> 7403 bytes .../__pycache__/cache.cpython-37.pyc | Bin 0 -> 7142 bytes .../__pycache__/collector.cpython-37.pyc | Bin 0 -> 14013 bytes .../__pycache__/configuration.cpython-37.pyc | Bin 0 -> 10537 bytes .../__pycache__/download.cpython-37.pyc | Bin 0 -> 11155 bytes .../__pycache__/exceptions.cpython-37.pyc | Bin 0 -> 12713 bytes .../__pycache__/index.cpython-37.pyc | Bin 0 -> 25079 bytes .../__pycache__/legacy_resolve.cpython-37.pyc | Bin 0 -> 10417 bytes .../__pycache__/locations.cpython-37.pyc | Bin 0 -> 3180 bytes .../_internal/__pycache__/main.cpython-37.pyc | Bin 0 -> 1289 bytes .../__pycache__/pep425tags.cpython-37.pyc | Bin 0 -> 9737 bytes .../__pycache__/pyproject.cpython-37.pyc | Bin 0 -> 3174 bytes .../self_outdated_check.cpython-37.pyc | Bin 0 -> 5454 bytes .../__pycache__/wheel.cpython-37.pyc | Bin 0 -> 27704 bytes .../site-packages/pip/_internal/build_env.py | 221 + env/Lib/site-packages/pip/_internal/cache.py | 253 + .../pip/_internal/cli/__init__.py | 4 + .../cli/__pycache__/__init__.cpython-37.pyc | Bin 0 -> 256 bytes .../__pycache__/autocompletion.cpython-37.pyc | Bin 0 -> 4958 bytes .../__pycache__/base_command.cpython-37.pyc | Bin 0 -> 4938 bytes .../cli/__pycache__/cmdoptions.cpython-37.pyc | Bin 0 -> 19130 bytes .../command_context.cpython-37.pyc | Bin 0 -> 1123 bytes .../__pycache__/main_parser.cpython-37.pyc | Bin 0 -> 2163 bytes .../cli/__pycache__/parser.cpython-37.pyc | Bin 0 -> 8920 bytes .../__pycache__/req_command.cpython-37.pyc | Bin 0 -> 7432 bytes .../__pycache__/status_codes.cpython-37.pyc | Bin 0 -> 385 bytes .../pip/_internal/cli/autocompletion.py | 155 + .../pip/_internal/cli/base_command.py | 193 + .../pip/_internal/cli/cmdoptions.py | 909 ++ .../pip/_internal/cli/command_context.py | 29 + .../pip/_internal/cli/main_parser.py | 99 + .../site-packages/pip/_internal/cli/parser.py | 265 + .../pip/_internal/cli/req_command.py | 304 + .../pip/_internal/cli/status_codes.py | 8 + .../site-packages/pip/_internal/collector.py | 548 ++ .../pip/_internal/commands/__init__.py | 114 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 2806 bytes .../commands/__pycache__/check.cpython-37.pyc | Bin 0 -> 1324 bytes .../__pycache__/completion.cpython-37.pyc | Bin 0 -> 2995 bytes .../__pycache__/configuration.cpython-37.pyc | Bin 0 -> 6537 bytes .../commands/__pycache__/debug.cpython-37.pyc | Bin 0 -> 3267 bytes .../__pycache__/download.cpython-37.pyc | Bin 0 -> 4274 bytes .../__pycache__/freeze.cpython-37.pyc | Bin 0 -> 2917 bytes .../commands/__pycache__/hash.cpython-37.pyc | Bin 0 -> 1993 bytes .../commands/__pycache__/help.cpython-37.pyc | Bin 0 -> 1194 bytes .../__pycache__/install.cpython-37.pyc | Bin 0 -> 13749 bytes .../commands/__pycache__/list.cpython-37.pyc | Bin 0 -> 8851 bytes .../__pycache__/search.cpython-37.pyc | Bin 0 -> 4462 bytes .../commands/__pycache__/show.cpython-37.pyc | Bin 0 -> 6349 bytes .../__pycache__/uninstall.cpython-37.pyc | Bin 0 -> 2696 bytes .../commands/__pycache__/wheel.cpython-37.pyc | Bin 0 -> 4589 bytes .../pip/_internal/commands/check.py | 45 + .../pip/_internal/commands/completion.py | 96 + .../pip/_internal/commands/configuration.py | 233 + .../pip/_internal/commands/debug.py | 115 + .../pip/_internal/commands/download.py | 156 + .../pip/_internal/commands/freeze.py | 103 + .../pip/_internal/commands/hash.py | 58 + .../pip/_internal/commands/help.py | 41 + .../pip/_internal/commands/install.py | 631 ++ .../pip/_internal/commands/list.py | 313 + .../pip/_internal/commands/search.py | 145 + .../pip/_internal/commands/show.py | 180 + .../pip/_internal/commands/uninstall.py | 82 + .../pip/_internal/commands/wheel.py | 180 + .../pip/_internal/configuration.py | 422 + .../pip/_internal/distributions/__init__.py | 24 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 836 bytes .../__pycache__/base.cpython-37.pyc | Bin 0 -> 1620 bytes .../__pycache__/installed.cpython-37.pyc | Bin 0 -> 966 bytes .../__pycache__/wheel.cpython-37.pyc | Bin 0 -> 1026 bytes .../pip/_internal/distributions/base.py | 36 + .../pip/_internal/distributions/installed.py | 18 + .../distributions/source/__init__.py | 0 .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 190 bytes .../source/__pycache__/legacy.cpython-37.pyc | Bin 0 -> 3444 bytes .../_internal/distributions/source/legacy.py | 98 + .../pip/_internal/distributions/wheel.py | 20 + .../site-packages/pip/_internal/download.py | 578 ++ .../site-packages/pip/_internal/exceptions.py | 308 + env/Lib/site-packages/pip/_internal/index.py | 992 ++ .../pip/_internal/legacy_resolve.py | 460 + .../site-packages/pip/_internal/locations.py | 156 + env/Lib/site-packages/pip/_internal/main.py | 47 + .../pip/_internal/models/__init__.py | 2 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 244 bytes .../__pycache__/candidate.cpython-37.pyc | Bin 0 -> 1469 bytes .../__pycache__/format_control.cpython-37.pyc | Bin 0 -> 2409 bytes .../models/__pycache__/index.cpython-37.pyc | Bin 0 -> 1148 bytes .../models/__pycache__/link.cpython-37.pyc | Bin 0 -> 6588 bytes .../__pycache__/search_scope.cpython-37.pyc | Bin 0 -> 3238 bytes .../selection_prefs.cpython-37.pyc | Bin 0 -> 1606 bytes .../__pycache__/target_python.cpython-37.pyc | Bin 0 -> 3182 bytes .../pip/_internal/models/candidate.py | 39 + .../pip/_internal/models/format_control.py | 82 + .../pip/_internal/models/index.py | 31 + .../pip/_internal/models/link.py | 227 + .../pip/_internal/models/search_scope.py | 116 + .../pip/_internal/models/selection_prefs.py | 47 + .../pip/_internal/models/target_python.py | 106 + .../pip/_internal/network/__init__.py | 2 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 232 bytes .../network/__pycache__/auth.cpython-37.pyc | Bin 0 -> 6950 bytes .../network/__pycache__/cache.cpython-37.pyc | Bin 0 -> 2455 bytes .../__pycache__/session.cpython-37.pyc | Bin 0 -> 9135 bytes .../network/__pycache__/xmlrpc.cpython-37.pyc | Bin 0 -> 1572 bytes .../pip/_internal/network/auth.py | 298 + .../pip/_internal/network/cache.py | 75 + .../pip/_internal/network/session.py | 426 + .../pip/_internal/network/xmlrpc.py | 44 + .../pip/_internal/operations/__init__.py | 0 .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 180 bytes .../__pycache__/check.cpython-37.pyc | Bin 0 -> 3666 bytes .../__pycache__/freeze.cpython-37.pyc | Bin 0 -> 5670 bytes .../generate_metadata.cpython-37.pyc | Bin 0 -> 3874 bytes .../__pycache__/prepare.cpython-37.pyc | Bin 0 -> 5836 bytes .../pip/_internal/operations/check.py | 163 + .../pip/_internal/operations/freeze.py | 259 + .../_internal/operations/generate_metadata.py | 136 + .../pip/_internal/operations/prepare.py | 295 + .../site-packages/pip/_internal/pep425tags.py | 449 + .../site-packages/pip/_internal/pyproject.py | 171 + .../pip/_internal/req/__init__.py | 82 + .../req/__pycache__/__init__.cpython-37.pyc | Bin 0 -> 1691 bytes .../__pycache__/constructors.cpython-37.pyc | Bin 0 -> 10235 bytes .../req/__pycache__/req_file.cpython-37.pyc | Bin 0 -> 9368 bytes .../__pycache__/req_install.cpython-37.pyc | Bin 0 -> 23627 bytes .../req/__pycache__/req_set.cpython-37.pyc | Bin 0 -> 5985 bytes .../__pycache__/req_tracker.cpython-37.pyc | Bin 0 -> 3183 bytes .../__pycache__/req_uninstall.cpython-37.pyc | Bin 0 -> 17346 bytes .../pip/_internal/req/constructors.py | 436 + .../pip/_internal/req/req_file.py | 403 + .../pip/_internal/req/req_install.py | 966 ++ .../pip/_internal/req/req_set.py | 210 + .../pip/_internal/req/req_tracker.py | 98 + .../pip/_internal/req/req_uninstall.py | 644 ++ .../pip/_internal/self_outdated_check.py | 244 + .../pip/_internal/utils/__init__.py | 0 .../utils/__pycache__/__init__.cpython-37.pyc | Bin 0 -> 175 bytes .../utils/__pycache__/appdirs.cpython-37.pyc | Bin 0 -> 8015 bytes .../utils/__pycache__/compat.cpython-37.pyc | Bin 0 -> 6891 bytes .../__pycache__/deprecation.cpython-37.pyc | Bin 0 -> 2792 bytes .../utils/__pycache__/encoding.cpython-37.pyc | Bin 0 -> 1259 bytes .../__pycache__/filesystem.cpython-37.pyc | Bin 0 -> 2759 bytes .../__pycache__/filetypes.cpython-37.pyc | Bin 0 -> 574 bytes .../utils/__pycache__/glibc.cpython-37.pyc | Bin 0 -> 2239 bytes .../utils/__pycache__/hashes.cpython-37.pyc | Bin 0 -> 4115 bytes .../inject_securetransport.cpython-37.pyc | Bin 0 -> 944 bytes .../utils/__pycache__/logging.cpython-37.pyc | Bin 0 -> 9146 bytes .../__pycache__/marker_files.cpython-37.pyc | Bin 0 -> 940 bytes .../utils/__pycache__/misc.cpython-37.pyc | Bin 0 -> 22718 bytes .../utils/__pycache__/models.cpython-37.pyc | Bin 0 -> 1923 bytes .../__pycache__/packaging.cpython-37.pyc | Bin 0 -> 2610 bytes .../setuptools_build.cpython-37.pyc | Bin 0 -> 1270 bytes .../__pycache__/subprocess.cpython-37.pyc | Bin 0 -> 5555 bytes .../utils/__pycache__/temp_dir.cpython-37.pyc | Bin 0 -> 4957 bytes .../utils/__pycache__/typing.cpython-37.pyc | Bin 0 -> 1305 bytes .../utils/__pycache__/ui.cpython-37.pyc | Bin 0 -> 11724 bytes .../__pycache__/unpacking.cpython-37.pyc | Bin 0 -> 6001 bytes .../utils/__pycache__/urls.cpython-37.pyc | Bin 0 -> 1469 bytes .../__pycache__/virtualenv.cpython-37.pyc | Bin 0 -> 890 bytes .../pip/_internal/utils/appdirs.py | 276 + .../pip/_internal/utils/compat.py | 297 + .../pip/_internal/utils/deprecation.py | 104 + .../pip/_internal/utils/encoding.py | 42 + .../pip/_internal/utils/filesystem.py | 115 + .../pip/_internal/utils/filetypes.py | 16 + .../pip/_internal/utils/glibc.py | 123 + .../pip/_internal/utils/hashes.py | 133 + .../_internal/utils/inject_securetransport.py | 36 + .../pip/_internal/utils/logging.py | 398 + .../pip/_internal/utils/marker_files.py | 27 + .../site-packages/pip/_internal/utils/misc.py | 870 ++ .../pip/_internal/utils/models.py | 42 + .../pip/_internal/utils/packaging.py | 94 + .../pip/_internal/utils/setuptools_build.py | 47 + .../pip/_internal/utils/subprocess.py | 278 + .../pip/_internal/utils/temp_dir.py | 172 + .../pip/_internal/utils/typing.py | 29 + .../site-packages/pip/_internal/utils/ui.py | 428 + .../pip/_internal/utils/unpacking.py | 272 + .../site-packages/pip/_internal/utils/urls.py | 54 + .../pip/_internal/utils/virtualenv.py | 34 + .../pip/_internal/vcs/__init__.py | 15 + .../vcs/__pycache__/__init__.cpython-37.pyc | Bin 0 -> 468 bytes .../vcs/__pycache__/bazaar.cpython-37.pyc | Bin 0 -> 3705 bytes .../vcs/__pycache__/git.cpython-37.pyc | Bin 0 -> 9085 bytes .../vcs/__pycache__/mercurial.cpython-37.pyc | Bin 0 -> 4845 bytes .../vcs/__pycache__/subversion.cpython-37.pyc | Bin 0 -> 8420 bytes .../__pycache__/versioncontrol.cpython-37.pyc | Bin 0 -> 18307 bytes .../site-packages/pip/_internal/vcs/bazaar.py | 120 + .../site-packages/pip/_internal/vcs/git.py | 372 + .../pip/_internal/vcs/mercurial.py | 155 + .../pip/_internal/vcs/subversion.py | 333 + .../pip/_internal/vcs/versioncontrol.py | 665 ++ env/Lib/site-packages/pip/_internal/wheel.py | 1181 +++ env/Lib/site-packages/pip/_vendor/__init__.py | 109 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 2845 bytes .../__pycache__/appdirs.cpython-37.pyc | Bin 0 -> 20592 bytes .../__pycache__/contextlib2.cpython-37.pyc | Bin 0 -> 15350 bytes .../_vendor/__pycache__/distro.cpython-37.pyc | Bin 0 -> 36305 bytes .../__pycache__/ipaddress.cpython-37.pyc | Bin 0 -> 66435 bytes .../__pycache__/pyparsing.cpython-37.pyc | Bin 0 -> 234002 bytes .../__pycache__/retrying.cpython-37.pyc | Bin 0 -> 8073 bytes .../_vendor/__pycache__/six.cpython-37.pyc | Bin 0 -> 26397 bytes env/Lib/site-packages/pip/_vendor/appdirs.py | 604 ++ .../pip/_vendor/cachecontrol/__init__.py | 11 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 533 bytes .../__pycache__/_cmd.cpython-37.pyc | Bin 0 -> 1536 bytes .../__pycache__/adapter.cpython-37.pyc | Bin 0 -> 3019 bytes .../__pycache__/cache.cpython-37.pyc | Bin 0 -> 1749 bytes .../__pycache__/compat.cpython-37.pyc | Bin 0 -> 740 bytes .../__pycache__/controller.cpython-37.pyc | Bin 0 -> 7619 bytes .../__pycache__/filewrapper.cpython-37.pyc | Bin 0 -> 2137 bytes .../__pycache__/heuristics.cpython-37.pyc | Bin 0 -> 4657 bytes .../__pycache__/serialize.cpython-37.pyc | Bin 0 -> 4221 bytes .../__pycache__/wrapper.cpython-37.pyc | Bin 0 -> 641 bytes .../pip/_vendor/cachecontrol/_cmd.py | 57 + .../pip/_vendor/cachecontrol/adapter.py | 133 + .../pip/_vendor/cachecontrol/cache.py | 39 + .../_vendor/cachecontrol/caches/__init__.py | 2 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 277 bytes .../__pycache__/file_cache.cpython-37.pyc | Bin 0 -> 3187 bytes .../__pycache__/redis_cache.cpython-37.pyc | Bin 0 -> 1533 bytes .../_vendor/cachecontrol/caches/file_cache.py | 146 + .../cachecontrol/caches/redis_cache.py | 33 + .../pip/_vendor/cachecontrol/compat.py | 29 + .../pip/_vendor/cachecontrol/controller.py | 367 + .../pip/_vendor/cachecontrol/filewrapper.py | 80 + .../pip/_vendor/cachecontrol/heuristics.py | 135 + .../pip/_vendor/cachecontrol/serialize.py | 186 + .../pip/_vendor/cachecontrol/wrapper.py | 29 + .../pip/_vendor/certifi/__init__.py | 3 + .../pip/_vendor/certifi/__main__.py | 2 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 240 bytes .../__pycache__/__main__.cpython-37.pyc | Bin 0 -> 243 bytes .../certifi/__pycache__/core.cpython-37.pyc | Bin 0 -> 452 bytes .../pip/_vendor/certifi/cacert.pem | 4558 +++++++++ .../site-packages/pip/_vendor/certifi/core.py | 15 + .../pip/_vendor/chardet/__init__.py | 39 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 827 bytes .../__pycache__/big5freq.cpython-37.pyc | Bin 0 -> 27162 bytes .../__pycache__/big5prober.cpython-37.pyc | Bin 0 -> 1103 bytes .../chardistribution.cpython-37.pyc | Bin 0 -> 6289 bytes .../charsetgroupprober.cpython-37.pyc | Bin 0 -> 2210 bytes .../__pycache__/charsetprober.cpython-37.pyc | Bin 0 -> 3420 bytes .../codingstatemachine.cpython-37.pyc | Bin 0 -> 2867 bytes .../chardet/__pycache__/compat.cpython-37.pyc | Bin 0 -> 338 bytes .../__pycache__/cp949prober.cpython-37.pyc | Bin 0 -> 1110 bytes .../chardet/__pycache__/enums.cpython-37.pyc | Bin 0 -> 2601 bytes .../__pycache__/escprober.cpython-37.pyc | Bin 0 -> 2588 bytes .../chardet/__pycache__/escsm.cpython-37.pyc | Bin 0 -> 7049 bytes .../__pycache__/eucjpprober.cpython-37.pyc | Bin 0 -> 2396 bytes .../__pycache__/euckrfreq.cpython-37.pyc | Bin 0 -> 12046 bytes .../__pycache__/euckrprober.cpython-37.pyc | Bin 0 -> 1111 bytes .../__pycache__/euctwfreq.cpython-37.pyc | Bin 0 -> 27166 bytes .../__pycache__/euctwprober.cpython-37.pyc | Bin 0 -> 1111 bytes .../__pycache__/gb2312freq.cpython-37.pyc | Bin 0 -> 19090 bytes .../__pycache__/gb2312prober.cpython-37.pyc | Bin 0 -> 1119 bytes .../__pycache__/hebrewprober.cpython-37.pyc | Bin 0 -> 2953 bytes .../__pycache__/jisfreq.cpython-37.pyc | Bin 0 -> 22118 bytes .../chardet/__pycache__/jpcntx.cpython-37.pyc | Bin 0 -> 37997 bytes .../langbulgarianmodel.cpython-37.pyc | Bin 0 -> 23611 bytes .../langcyrillicmodel.cpython-37.pyc | Bin 0 -> 29067 bytes .../__pycache__/langgreekmodel.cpython-37.pyc | Bin 0 -> 23569 bytes .../langhebrewmodel.cpython-37.pyc | Bin 0 -> 22198 bytes .../langhungarianmodel.cpython-37.pyc | Bin 0 -> 23600 bytes .../__pycache__/langthaimodel.cpython-37.pyc | Bin 0 -> 22177 bytes .../langturkishmodel.cpython-37.pyc | Bin 0 -> 22200 bytes .../__pycache__/latin1prober.cpython-37.pyc | Bin 0 -> 2910 bytes .../mbcharsetprober.cpython-37.pyc | Bin 0 -> 2215 bytes .../mbcsgroupprober.cpython-37.pyc | Bin 0 -> 1106 bytes .../chardet/__pycache__/mbcssm.cpython-37.pyc | Bin 0 -> 15661 bytes .../sbcharsetprober.cpython-37.pyc | Bin 0 -> 2968 bytes .../sbcsgroupprober.cpython-37.pyc | Bin 0 -> 1596 bytes .../__pycache__/sjisprober.cpython-37.pyc | Bin 0 -> 2422 bytes .../universaldetector.cpython-37.pyc | Bin 0 -> 5812 bytes .../__pycache__/utf8prober.cpython-37.pyc | Bin 0 -> 1953 bytes .../__pycache__/version.cpython-37.pyc | Bin 0 -> 422 bytes .../pip/_vendor/chardet/big5freq.py | 386 + .../pip/_vendor/chardet/big5prober.py | 47 + .../pip/_vendor/chardet/chardistribution.py | 233 + .../pip/_vendor/chardet/charsetgroupprober.py | 106 + .../pip/_vendor/chardet/charsetprober.py | 145 + .../pip/_vendor/chardet/cli/__init__.py | 1 + .../cli/__pycache__/__init__.cpython-37.pyc | Bin 0 -> 179 bytes .../cli/__pycache__/chardetect.cpython-37.pyc | Bin 0 -> 2668 bytes .../pip/_vendor/chardet/cli/chardetect.py | 85 + .../pip/_vendor/chardet/codingstatemachine.py | 88 + .../pip/_vendor/chardet/compat.py | 34 + .../pip/_vendor/chardet/cp949prober.py | 49 + .../pip/_vendor/chardet/enums.py | 76 + .../pip/_vendor/chardet/escprober.py | 101 + .../pip/_vendor/chardet/escsm.py | 246 + .../pip/_vendor/chardet/eucjpprober.py | 92 + .../pip/_vendor/chardet/euckrfreq.py | 195 + .../pip/_vendor/chardet/euckrprober.py | 47 + .../pip/_vendor/chardet/euctwfreq.py | 387 + .../pip/_vendor/chardet/euctwprober.py | 46 + .../pip/_vendor/chardet/gb2312freq.py | 283 + .../pip/_vendor/chardet/gb2312prober.py | 46 + .../pip/_vendor/chardet/hebrewprober.py | 292 + .../pip/_vendor/chardet/jisfreq.py | 325 + .../pip/_vendor/chardet/jpcntx.py | 233 + .../pip/_vendor/chardet/langbulgarianmodel.py | 228 + .../pip/_vendor/chardet/langcyrillicmodel.py | 333 + .../pip/_vendor/chardet/langgreekmodel.py | 225 + .../pip/_vendor/chardet/langhebrewmodel.py | 200 + .../pip/_vendor/chardet/langhungarianmodel.py | 225 + .../pip/_vendor/chardet/langthaimodel.py | 199 + .../pip/_vendor/chardet/langturkishmodel.py | 193 + .../pip/_vendor/chardet/latin1prober.py | 145 + .../pip/_vendor/chardet/mbcharsetprober.py | 91 + .../pip/_vendor/chardet/mbcsgroupprober.py | 54 + .../pip/_vendor/chardet/mbcssm.py | 572 ++ .../pip/_vendor/chardet/sbcharsetprober.py | 132 + .../pip/_vendor/chardet/sbcsgroupprober.py | 73 + .../pip/_vendor/chardet/sjisprober.py | 92 + .../pip/_vendor/chardet/universaldetector.py | 286 + .../pip/_vendor/chardet/utf8prober.py | 82 + .../pip/_vendor/chardet/version.py | 9 + .../pip/_vendor/colorama/__init__.py | 6 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 427 bytes .../colorama/__pycache__/ansi.cpython-37.pyc | Bin 0 -> 3325 bytes .../__pycache__/ansitowin32.cpython-37.pyc | Bin 0 -> 7581 bytes .../__pycache__/initialise.cpython-37.pyc | Bin 0 -> 1646 bytes .../colorama/__pycache__/win32.cpython-37.pyc | Bin 0 -> 3840 bytes .../__pycache__/winterm.cpython-37.pyc | Bin 0 -> 4588 bytes .../pip/_vendor/colorama/ansi.py | 102 + .../pip/_vendor/colorama/ansitowin32.py | 257 + .../pip/_vendor/colorama/initialise.py | 80 + .../pip/_vendor/colorama/win32.py | 152 + .../pip/_vendor/colorama/winterm.py | 169 + .../site-packages/pip/_vendor/contextlib2.py | 518 ++ .../pip/_vendor/distlib/__init__.py | 23 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 1031 bytes .../distlib/__pycache__/compat.cpython-37.pyc | Bin 0 -> 32035 bytes .../__pycache__/database.cpython-37.pyc | Bin 0 -> 42556 bytes .../distlib/__pycache__/index.cpython-37.pyc | Bin 0 -> 17314 bytes .../__pycache__/locators.cpython-37.pyc | Bin 0 -> 38686 bytes .../__pycache__/manifest.cpython-37.pyc | Bin 0 -> 10273 bytes .../__pycache__/markers.cpython-37.pyc | Bin 0 -> 4459 bytes .../__pycache__/metadata.cpython-37.pyc | Bin 0 -> 27674 bytes .../__pycache__/resources.cpython-37.pyc | Bin 0 -> 10869 bytes .../__pycache__/scripts.cpython-37.pyc | Bin 0 -> 10669 bytes .../distlib/__pycache__/util.cpython-37.pyc | Bin 0 -> 47982 bytes .../__pycache__/version.cpython-37.pyc | Bin 0 -> 20409 bytes .../distlib/__pycache__/wheel.cpython-37.pyc | Bin 0 -> 25599 bytes .../pip/_vendor/distlib/_backport/__init__.py | 6 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 467 bytes .../_backport/__pycache__/misc.cpython-37.pyc | Bin 0 -> 1064 bytes .../__pycache__/shutil.cpython-37.pyc | Bin 0 -> 21380 bytes .../__pycache__/sysconfig.cpython-37.pyc | Bin 0 -> 15845 bytes .../__pycache__/tarfile.cpython-37.pyc | Bin 0 -> 62710 bytes .../pip/_vendor/distlib/_backport/misc.py | 41 + .../pip/_vendor/distlib/_backport/shutil.py | 761 ++ .../_vendor/distlib/_backport/sysconfig.cfg | 84 + .../_vendor/distlib/_backport/sysconfig.py | 788 ++ .../pip/_vendor/distlib/_backport/tarfile.py | 2607 ++++++ .../pip/_vendor/distlib/compat.py | 1120 +++ .../pip/_vendor/distlib/database.py | 1339 +++ .../pip/_vendor/distlib/index.py | 516 ++ .../pip/_vendor/distlib/locators.py | 1295 +++ .../pip/_vendor/distlib/manifest.py | 393 + .../pip/_vendor/distlib/markers.py | 131 + .../pip/_vendor/distlib/metadata.py | 1096 +++ .../pip/_vendor/distlib/resources.py | 355 + .../pip/_vendor/distlib/scripts.py | 403 + .../site-packages/pip/_vendor/distlib/t32.exe | Bin 0 -> 92672 bytes .../site-packages/pip/_vendor/distlib/t64.exe | Bin 0 -> 102912 bytes .../site-packages/pip/_vendor/distlib/util.py | 1760 ++++ .../pip/_vendor/distlib/version.py | 736 ++ .../site-packages/pip/_vendor/distlib/w32.exe | Bin 0 -> 89088 bytes .../site-packages/pip/_vendor/distlib/w64.exe | Bin 0 -> 99840 bytes .../pip/_vendor/distlib/wheel.py | 1004 ++ env/Lib/site-packages/pip/_vendor/distro.py | 1216 +++ .../pip/_vendor/html5lib/__init__.py | 35 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 1296 bytes .../__pycache__/_ihatexml.cpython-37.pyc | Bin 0 -> 13743 bytes .../__pycache__/_inputstream.cpython-37.pyc | Bin 0 -> 22634 bytes .../__pycache__/_tokenizer.cpython-37.pyc | Bin 0 -> 41535 bytes .../__pycache__/_utils.cpython-37.pyc | Bin 0 -> 3288 bytes .../__pycache__/constants.cpython-37.pyc | Bin 0 -> 66200 bytes .../__pycache__/html5parser.cpython-37.pyc | Bin 0 -> 97797 bytes .../__pycache__/serializer.cpython-37.pyc | Bin 0 -> 10813 bytes .../pip/_vendor/html5lib/_ihatexml.py | 288 + .../pip/_vendor/html5lib/_inputstream.py | 923 ++ .../pip/_vendor/html5lib/_tokenizer.py | 1721 ++++ .../pip/_vendor/html5lib/_trie/__init__.py | 14 + .../_trie/__pycache__/__init__.cpython-37.pyc | Bin 0 -> 409 bytes .../_trie/__pycache__/_base.cpython-37.pyc | Bin 0 -> 1566 bytes .../_trie/__pycache__/datrie.cpython-37.pyc | Bin 0 -> 2011 bytes .../_trie/__pycache__/py.cpython-37.pyc | Bin 0 -> 2214 bytes .../pip/_vendor/html5lib/_trie/_base.py | 40 + .../pip/_vendor/html5lib/_trie/datrie.py | 44 + .../pip/_vendor/html5lib/_trie/py.py | 67 + .../pip/_vendor/html5lib/_utils.py | 124 + .../pip/_vendor/html5lib/constants.py | 2947 ++++++ .../pip/_vendor/html5lib/filters/__init__.py | 0 .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 184 bytes .../alphabeticalattributes.cpython-37.pyc | Bin 0 -> 1300 bytes .../filters/__pycache__/base.cpython-37.pyc | Bin 0 -> 834 bytes .../inject_meta_charset.cpython-37.pyc | Bin 0 -> 1854 bytes .../filters/__pycache__/lint.cpython-37.pyc | Bin 0 -> 2618 bytes .../__pycache__/optionaltags.cpython-37.pyc | Bin 0 -> 2745 bytes .../__pycache__/sanitizer.cpython-37.pyc | Bin 0 -> 16420 bytes .../__pycache__/whitespace.cpython-37.pyc | Bin 0 -> 1338 bytes .../filters/alphabeticalattributes.py | 29 + .../pip/_vendor/html5lib/filters/base.py | 12 + .../html5lib/filters/inject_meta_charset.py | 73 + .../pip/_vendor/html5lib/filters/lint.py | 93 + .../_vendor/html5lib/filters/optionaltags.py | 207 + .../pip/_vendor/html5lib/filters/sanitizer.py | 896 ++ .../_vendor/html5lib/filters/whitespace.py | 38 + .../pip/_vendor/html5lib/html5parser.py | 2791 ++++++ .../pip/_vendor/html5lib/serializer.py | 409 + .../_vendor/html5lib/treeadapters/__init__.py | 30 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 923 bytes .../__pycache__/genshi.cpython-37.pyc | Bin 0 -> 1520 bytes .../__pycache__/sax.cpython-37.pyc | Bin 0 -> 1470 bytes .../_vendor/html5lib/treeadapters/genshi.py | 54 + .../pip/_vendor/html5lib/treeadapters/sax.py | 50 + .../_vendor/html5lib/treebuilders/__init__.py | 88 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 3304 bytes .../__pycache__/base.cpython-37.pyc | Bin 0 -> 11227 bytes .../__pycache__/dom.cpython-37.pyc | Bin 0 -> 9331 bytes .../__pycache__/etree.cpython-37.pyc | Bin 0 -> 11836 bytes .../__pycache__/etree_lxml.cpython-37.pyc | Bin 0 -> 11776 bytes .../pip/_vendor/html5lib/treebuilders/base.py | 417 + .../pip/_vendor/html5lib/treebuilders/dom.py | 239 + .../_vendor/html5lib/treebuilders/etree.py | 340 + .../html5lib/treebuilders/etree_lxml.py | 366 + .../_vendor/html5lib/treewalkers/__init__.py | 154 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 3981 bytes .../__pycache__/base.cpython-37.pyc | Bin 0 -> 6977 bytes .../__pycache__/dom.cpython-37.pyc | Bin 0 -> 1706 bytes .../__pycache__/etree.cpython-37.pyc | Bin 0 -> 3513 bytes .../__pycache__/etree_lxml.cpython-37.pyc | Bin 0 -> 6622 bytes .../__pycache__/genshi.cpython-37.pyc | Bin 0 -> 1880 bytes .../pip/_vendor/html5lib/treewalkers/base.py | 252 + .../pip/_vendor/html5lib/treewalkers/dom.py | 43 + .../pip/_vendor/html5lib/treewalkers/etree.py | 130 + .../html5lib/treewalkers/etree_lxml.py | 213 + .../_vendor/html5lib/treewalkers/genshi.py | 69 + .../pip/_vendor/idna/__init__.py | 2 + .../idna/__pycache__/__init__.cpython-37.pyc | Bin 0 -> 241 bytes .../idna/__pycache__/codec.cpython-37.pyc | Bin 0 -> 3048 bytes .../idna/__pycache__/compat.cpython-37.pyc | Bin 0 -> 601 bytes .../idna/__pycache__/core.cpython-37.pyc | Bin 0 -> 9044 bytes .../idna/__pycache__/idnadata.cpython-37.pyc | Bin 0 -> 21415 bytes .../idna/__pycache__/intranges.cpython-37.pyc | Bin 0 -> 1781 bytes .../__pycache__/package_data.cpython-37.pyc | Bin 0 -> 195 bytes .../idna/__pycache__/uts46data.cpython-37.pyc | Bin 0 -> 176075 bytes .../site-packages/pip/_vendor/idna/codec.py | 118 + .../site-packages/pip/_vendor/idna/compat.py | 12 + .../site-packages/pip/_vendor/idna/core.py | 396 + .../pip/_vendor/idna/idnadata.py | 1979 ++++ .../pip/_vendor/idna/intranges.py | 53 + .../pip/_vendor/idna/package_data.py | 2 + .../pip/_vendor/idna/uts46data.py | 8205 +++++++++++++++++ .../site-packages/pip/_vendor/ipaddress.py | 2419 +++++ .../pip/_vendor/msgpack/__init__.py | 65 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 1920 bytes .../__pycache__/_version.cpython-37.pyc | Bin 0 -> 202 bytes .../__pycache__/exceptions.cpython-37.pyc | Bin 0 -> 1850 bytes .../__pycache__/fallback.cpython-37.pyc | Bin 0 -> 26254 bytes .../pip/_vendor/msgpack/_version.py | 1 + .../pip/_vendor/msgpack/exceptions.py | 48 + .../pip/_vendor/msgpack/fallback.py | 1027 +++ .../pip/_vendor/packaging/__about__.py | 27 + .../pip/_vendor/packaging/__init__.py | 26 + .../__pycache__/__about__.cpython-37.pyc | Bin 0 -> 715 bytes .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 553 bytes .../__pycache__/_compat.cpython-37.pyc | Bin 0 -> 993 bytes .../__pycache__/_structures.cpython-37.pyc | Bin 0 -> 2845 bytes .../__pycache__/markers.cpython-37.pyc | Bin 0 -> 8884 bytes .../__pycache__/requirements.cpython-37.pyc | Bin 0 -> 3966 bytes .../__pycache__/specifiers.cpython-37.pyc | Bin 0 -> 19743 bytes .../packaging/__pycache__/tags.cpython-37.pyc | Bin 0 -> 10792 bytes .../__pycache__/utils.cpython-37.pyc | Bin 0 -> 1431 bytes .../__pycache__/version.cpython-37.pyc | Bin 0 -> 11935 bytes .../pip/_vendor/packaging/_compat.py | 31 + .../pip/_vendor/packaging/_structures.py | 68 + .../pip/_vendor/packaging/markers.py | 296 + .../pip/_vendor/packaging/requirements.py | 138 + .../pip/_vendor/packaging/specifiers.py | 749 ++ .../pip/_vendor/packaging/tags.py | 404 + .../pip/_vendor/packaging/utils.py | 57 + .../pip/_vendor/packaging/version.py | 420 + .../pip/_vendor/pep517/__init__.py | 4 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 266 bytes .../__pycache__/_in_process.cpython-37.pyc | Bin 0 -> 7536 bytes .../pep517/__pycache__/build.cpython-37.pyc | Bin 0 -> 3329 bytes .../pep517/__pycache__/check.cpython-37.pyc | Bin 0 -> 4831 bytes .../__pycache__/colorlog.cpython-37.pyc | Bin 0 -> 2898 bytes .../pep517/__pycache__/compat.cpython-37.pyc | Bin 0 -> 1047 bytes .../__pycache__/dirtools.cpython-37.pyc | Bin 0 -> 1311 bytes .../__pycache__/envbuild.cpython-37.pyc | Bin 0 -> 4320 bytes .../pep517/__pycache__/meta.cpython-37.pyc | Bin 0 -> 2798 bytes .../__pycache__/wrappers.cpython-37.pyc | Bin 0 -> 10094 bytes .../pip/_vendor/pep517/_in_process.py | 257 + .../site-packages/pip/_vendor/pep517/build.py | 124 + .../site-packages/pip/_vendor/pep517/check.py | 203 + .../pip/_vendor/pep517/colorlog.py | 115 + .../pip/_vendor/pep517/compat.py | 34 + .../pip/_vendor/pep517/dirtools.py | 44 + .../pip/_vendor/pep517/envbuild.py | 167 + .../site-packages/pip/_vendor/pep517/meta.py | 92 + .../pip/_vendor/pep517/wrappers.py | 298 + .../pip/_vendor/pkg_resources/__init__.py | 3295 +++++++ .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 99708 bytes .../__pycache__/py31compat.cpython-37.pyc | Bin 0 -> 626 bytes .../pip/_vendor/pkg_resources/py31compat.py | 23 + .../pip/_vendor/progress/__init__.py | 177 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 5542 bytes .../progress/__pycache__/bar.cpython-37.pyc | Bin 0 -> 2634 bytes .../__pycache__/counter.cpython-37.pyc | Bin 0 -> 1446 bytes .../__pycache__/spinner.cpython-37.pyc | Bin 0 -> 1411 bytes .../site-packages/pip/_vendor/progress/bar.py | 91 + .../pip/_vendor/progress/counter.py | 41 + .../pip/_vendor/progress/spinner.py | 43 + .../site-packages/pip/_vendor/pyparsing.py | 6894 ++++++++++++++ .../pip/_vendor/pytoml/__init__.py | 4 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 360 bytes .../pytoml/__pycache__/core.cpython-37.pyc | Bin 0 -> 923 bytes .../pytoml/__pycache__/parser.cpython-37.pyc | Bin 0 -> 10008 bytes .../pytoml/__pycache__/test.cpython-37.pyc | Bin 0 -> 1223 bytes .../pytoml/__pycache__/utils.cpython-37.pyc | Bin 0 -> 2122 bytes .../pytoml/__pycache__/writer.cpython-37.pyc | Bin 0 -> 3702 bytes .../site-packages/pip/_vendor/pytoml/core.py | 13 + .../pip/_vendor/pytoml/parser.py | 342 + .../site-packages/pip/_vendor/pytoml/test.py | 30 + .../site-packages/pip/_vendor/pytoml/utils.py | 67 + .../pip/_vendor/pytoml/writer.py | 114 + .../pip/_vendor/requests/__init__.py | 133 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 3471 bytes .../__pycache__/__version__.cpython-37.pyc | Bin 0 -> 534 bytes .../_internal_utils.cpython-37.pyc | Bin 0 -> 1292 bytes .../__pycache__/adapters.cpython-37.pyc | Bin 0 -> 16869 bytes .../requests/__pycache__/api.cpython-37.pyc | Bin 0 -> 6493 bytes .../requests/__pycache__/auth.cpython-37.pyc | Bin 0 -> 8326 bytes .../requests/__pycache__/certs.cpython-37.pyc | Bin 0 -> 617 bytes .../__pycache__/compat.cpython-37.pyc | Bin 0 -> 1596 bytes .../__pycache__/cookies.cpython-37.pyc | Bin 0 -> 18771 bytes .../__pycache__/exceptions.cpython-37.pyc | Bin 0 -> 5489 bytes .../requests/__pycache__/help.cpython-37.pyc | Bin 0 -> 2670 bytes .../requests/__pycache__/hooks.cpython-37.pyc | Bin 0 -> 964 bytes .../__pycache__/models.cpython-37.pyc | Bin 0 -> 24092 bytes .../__pycache__/packages.cpython-37.pyc | Bin 0 -> 494 bytes .../__pycache__/sessions.cpython-37.pyc | Bin 0 -> 19412 bytes .../__pycache__/status_codes.cpython-37.pyc | Bin 0 -> 4150 bytes .../__pycache__/structures.cpython-37.pyc | Bin 0 -> 4363 bytes .../requests/__pycache__/utils.cpython-37.pyc | Bin 0 -> 22023 bytes .../pip/_vendor/requests/__version__.py | 14 + .../pip/_vendor/requests/_internal_utils.py | 42 + .../pip/_vendor/requests/adapters.py | 533 ++ .../site-packages/pip/_vendor/requests/api.py | 158 + .../pip/_vendor/requests/auth.py | 305 + .../pip/_vendor/requests/certs.py | 18 + .../pip/_vendor/requests/compat.py | 74 + .../pip/_vendor/requests/cookies.py | 549 ++ .../pip/_vendor/requests/exceptions.py | 126 + .../pip/_vendor/requests/help.py | 119 + .../pip/_vendor/requests/hooks.py | 34 + .../pip/_vendor/requests/models.py | 953 ++ .../pip/_vendor/requests/packages.py | 16 + .../pip/_vendor/requests/sessions.py | 770 ++ .../pip/_vendor/requests/status_codes.py | 120 + .../pip/_vendor/requests/structures.py | 103 + .../pip/_vendor/requests/utils.py | 977 ++ env/Lib/site-packages/pip/_vendor/retrying.py | 267 + env/Lib/site-packages/pip/_vendor/six.py | 952 ++ .../pip/_vendor/urllib3/__init__.py | 86 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 2097 bytes .../__pycache__/_collections.cpython-37.pyc | Bin 0 -> 10667 bytes .../__pycache__/connection.cpython-37.pyc | Bin 0 -> 10450 bytes .../__pycache__/connectionpool.cpython-37.pyc | Bin 0 -> 24039 bytes .../__pycache__/exceptions.cpython-37.pyc | Bin 0 -> 10384 bytes .../urllib3/__pycache__/fields.cpython-37.pyc | Bin 0 -> 8078 bytes .../__pycache__/filepost.cpython-37.pyc | Bin 0 -> 2744 bytes .../__pycache__/poolmanager.cpython-37.pyc | Bin 0 -> 12840 bytes .../__pycache__/request.cpython-37.pyc | Bin 0 -> 5576 bytes .../__pycache__/response.cpython-37.pyc | Bin 0 -> 20175 bytes .../pip/_vendor/urllib3/_collections.py | 336 + .../pip/_vendor/urllib3/connection.py | 448 + .../pip/_vendor/urllib3/connectionpool.py | 1051 +++ .../pip/_vendor/urllib3/contrib/__init__.py | 0 .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 183 bytes .../_appengine_environ.cpython-37.pyc | Bin 0 -> 1075 bytes .../__pycache__/appengine.cpython-37.pyc | Bin 0 -> 8320 bytes .../__pycache__/ntlmpool.cpython-37.pyc | Bin 0 -> 3231 bytes .../__pycache__/pyopenssl.cpython-37.pyc | Bin 0 -> 14794 bytes .../securetransport.cpython-37.pyc | Bin 0 -> 19722 bytes .../contrib/__pycache__/socks.cpython-37.pyc | Bin 0 -> 5499 bytes .../urllib3/contrib/_appengine_environ.py | 32 + .../contrib/_securetransport/__init__.py | 0 .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 200 bytes .../__pycache__/bindings.cpython-37.pyc | Bin 0 -> 10147 bytes .../__pycache__/low_level.cpython-37.pyc | Bin 0 -> 7444 bytes .../contrib/_securetransport/bindings.py | 492 + .../contrib/_securetransport/low_level.py | 328 + .../pip/_vendor/urllib3/contrib/appengine.py | 321 + .../pip/_vendor/urllib3/contrib/ntlmpool.py | 123 + .../pip/_vendor/urllib3/contrib/pyopenssl.py | 498 + .../urllib3/contrib/securetransport.py | 870 ++ .../pip/_vendor/urllib3/contrib/socks.py | 210 + .../pip/_vendor/urllib3/exceptions.py | 255 + .../pip/_vendor/urllib3/fields.py | 273 + .../pip/_vendor/urllib3/filepost.py | 98 + .../pip/_vendor/urllib3/packages/__init__.py | 5 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 297 bytes .../packages/__pycache__/six.cpython-37.pyc | Bin 0 -> 26440 bytes .../urllib3/packages/backports/__init__.py | 0 .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 194 bytes .../__pycache__/makefile.cpython-37.pyc | Bin 0 -> 1284 bytes .../urllib3/packages/backports/makefile.py | 52 + .../pip/_vendor/urllib3/packages/six.py | 1021 ++ .../packages/ssl_match_hostname/__init__.py | 19 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 538 bytes .../_implementation.cpython-37.pyc | Bin 0 -> 3303 bytes .../ssl_match_hostname/_implementation.py | 162 + .../pip/_vendor/urllib3/poolmanager.py | 470 + .../pip/_vendor/urllib3/request.py | 171 + .../pip/_vendor/urllib3/response.py | 809 ++ .../pip/_vendor/urllib3/util/__init__.py | 46 + .../util/__pycache__/__init__.cpython-37.pyc | Bin 0 -> 1003 bytes .../__pycache__/connection.cpython-37.pyc | Bin 0 -> 3152 bytes .../util/__pycache__/queue.cpython-37.pyc | Bin 0 -> 1024 bytes .../util/__pycache__/request.cpython-37.pyc | Bin 0 -> 3318 bytes .../util/__pycache__/response.cpython-37.pyc | Bin 0 -> 1951 bytes .../util/__pycache__/retry.cpython-37.pyc | Bin 0 -> 12872 bytes .../util/__pycache__/ssl_.cpython-37.pyc | Bin 0 -> 9745 bytes .../util/__pycache__/timeout.cpython-37.pyc | Bin 0 -> 8811 bytes .../util/__pycache__/url.cpython-37.pyc | Bin 0 -> 10594 bytes .../util/__pycache__/wait.cpython-37.pyc | Bin 0 -> 3116 bytes .../pip/_vendor/urllib3/util/connection.py | 138 + .../pip/_vendor/urllib3/util/queue.py | 21 + .../pip/_vendor/urllib3/util/request.py | 135 + .../pip/_vendor/urllib3/util/response.py | 86 + .../pip/_vendor/urllib3/util/retry.py | 450 + .../pip/_vendor/urllib3/util/ssl_.py | 407 + .../pip/_vendor/urllib3/util/timeout.py | 258 + .../pip/_vendor/urllib3/util/url.py | 439 + .../pip/_vendor/urllib3/util/wait.py | 153 + .../pip/_vendor/webencodings/__init__.py | 342 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 9659 bytes .../__pycache__/labels.cpython-37.pyc | Bin 0 -> 4073 bytes .../__pycache__/mklabels.cpython-37.pyc | Bin 0 -> 1895 bytes .../__pycache__/tests.cpython-37.pyc | Bin 0 -> 5036 bytes .../__pycache__/x_user_defined.cpython-37.pyc | Bin 0 -> 2648 bytes .../pip/_vendor/webencodings/labels.py | 231 + .../pip/_vendor/webencodings/mklabels.py | 59 + .../pip/_vendor/webencodings/tests.py | 153 + .../_vendor/webencodings/x_user_defined.py | 325 + .../site-packages/pkg_resources/__init__.py | 3296 +++++++ .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 99775 bytes .../__pycache__/py31compat.cpython-37.pyc | Bin 0 -> 621 bytes .../pkg_resources/_vendor/__init__.py | 0 .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 184 bytes .../__pycache__/appdirs.cpython-37.pyc | Bin 0 -> 20672 bytes .../__pycache__/pyparsing.cpython-37.pyc | Bin 0 -> 203027 bytes .../_vendor/__pycache__/six.cpython-37.pyc | Bin 0 -> 24385 bytes .../pkg_resources/_vendor/appdirs.py | 608 ++ .../_vendor/packaging/__about__.py | 21 + .../_vendor/packaging/__init__.py | 14 + .../__pycache__/__about__.cpython-37.pyc | Bin 0 -> 720 bytes .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 558 bytes .../__pycache__/_compat.cpython-37.pyc | Bin 0 -> 1010 bytes .../__pycache__/_structures.cpython-37.pyc | Bin 0 -> 2862 bytes .../__pycache__/markers.cpython-37.pyc | Bin 0 -> 8870 bytes .../__pycache__/requirements.cpython-37.pyc | Bin 0 -> 3875 bytes .../__pycache__/specifiers.cpython-37.pyc | Bin 0 -> 19788 bytes .../__pycache__/utils.cpython-37.pyc | Bin 0 -> 489 bytes .../__pycache__/version.cpython-37.pyc | Bin 0 -> 10555 bytes .../_vendor/packaging/_compat.py | 30 + .../_vendor/packaging/_structures.py | 68 + .../_vendor/packaging/markers.py | 301 + .../_vendor/packaging/requirements.py | 127 + .../_vendor/packaging/specifiers.py | 774 ++ .../pkg_resources/_vendor/packaging/utils.py | 14 + .../_vendor/packaging/version.py | 393 + .../pkg_resources/_vendor/pyparsing.py | 5742 ++++++++++++ .../pkg_resources/_vendor/six.py | 868 ++ .../pkg_resources/extern/__init__.py | 73 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 2403 bytes .../site-packages/pkg_resources/py31compat.py | 23 + .../setuptools-42.0.2.dist-info/INSTALLER | 1 + .../setuptools-42.0.2.dist-info/LICENSE | 19 + .../setuptools-42.0.2.dist-info/METADATA | 87 + .../setuptools-42.0.2.dist-info/RECORD | 194 + .../setuptools-42.0.2.dist-info/WHEEL | 6 + .../dependency_links.txt | 2 + .../entry_points.txt | 69 + .../setuptools-42.0.2.dist-info/top_level.txt | 3 + .../setuptools-42.0.2.dist-info/zip-safe | 1 + env/Lib/site-packages/setuptools/__init__.py | 228 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 7685 bytes .../_deprecation_warning.cpython-37.pyc | Bin 0 -> 539 bytes .../__pycache__/_imp.cpython-37.pyc | Bin 0 -> 1920 bytes .../__pycache__/archive_util.cpython-37.pyc | Bin 0 -> 5120 bytes .../__pycache__/build_meta.cpython-37.pyc | Bin 0 -> 8458 bytes .../__pycache__/config.cpython-37.pyc | Bin 0 -> 17802 bytes .../__pycache__/dep_util.cpython-37.pyc | Bin 0 -> 846 bytes .../__pycache__/depends.cpython-37.pyc | Bin 0 -> 5165 bytes .../__pycache__/dist.cpython-37.pyc | Bin 0 -> 42366 bytes .../__pycache__/errors.cpython-37.pyc | Bin 0 -> 839 bytes .../__pycache__/extension.cpython-37.pyc | Bin 0 -> 1966 bytes .../__pycache__/glob.cpython-37.pyc | Bin 0 -> 3741 bytes .../__pycache__/installer.cpython-37.pyc | Bin 0 -> 4059 bytes .../__pycache__/launch.cpython-37.pyc | Bin 0 -> 845 bytes .../__pycache__/lib2to3_ex.cpython-37.pyc | Bin 0 -> 2424 bytes .../__pycache__/monkey.cpython-37.pyc | Bin 0 -> 4625 bytes .../__pycache__/msvc.cpython-37.pyc | Bin 0 -> 39539 bytes .../__pycache__/namespaces.cpython-37.pyc | Bin 0 -> 3603 bytes .../__pycache__/package_index.cpython-37.pyc | Bin 0 -> 32698 bytes .../__pycache__/py27compat.cpython-37.pyc | Bin 0 -> 1755 bytes .../__pycache__/py31compat.cpython-37.pyc | Bin 0 -> 1200 bytes .../__pycache__/py33compat.cpython-37.pyc | Bin 0 -> 1427 bytes .../__pycache__/py34compat.cpython-37.pyc | Bin 0 -> 473 bytes .../__pycache__/sandbox.cpython-37.pyc | Bin 0 -> 15527 bytes .../__pycache__/site-patch.cpython-37.pyc | Bin 0 -> 1493 bytes .../__pycache__/ssl_support.cpython-37.pyc | Bin 0 -> 6783 bytes .../__pycache__/unicode_utils.cpython-37.pyc | Bin 0 -> 1160 bytes .../__pycache__/version.cpython-37.pyc | Bin 0 -> 319 bytes .../__pycache__/wheel.cpython-37.pyc | Bin 0 -> 7300 bytes .../windows_support.cpython-37.pyc | Bin 0 -> 1002 bytes .../setuptools/_deprecation_warning.py | 7 + env/Lib/site-packages/setuptools/_imp.py | 73 + .../setuptools/_vendor/__init__.py | 0 .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 181 bytes .../__pycache__/ordered_set.cpython-37.pyc | Bin 0 -> 16401 bytes .../__pycache__/pyparsing.cpython-37.pyc | Bin 0 -> 203024 bytes .../_vendor/__pycache__/six.cpython-37.pyc | Bin 0 -> 24382 bytes .../setuptools/_vendor/ordered_set.py | 488 + .../setuptools/_vendor/packaging/__about__.py | 27 + .../setuptools/_vendor/packaging/__init__.py | 26 + .../__pycache__/__about__.cpython-37.pyc | Bin 0 -> 729 bytes .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 567 bytes .../__pycache__/_compat.cpython-37.pyc | Bin 0 -> 1007 bytes .../__pycache__/_structures.cpython-37.pyc | Bin 0 -> 2859 bytes .../__pycache__/markers.cpython-37.pyc | Bin 0 -> 8904 bytes .../__pycache__/requirements.cpython-37.pyc | Bin 0 -> 3992 bytes .../__pycache__/specifiers.cpython-37.pyc | Bin 0 -> 19757 bytes .../packaging/__pycache__/tags.cpython-37.pyc | Bin 0 -> 10806 bytes .../__pycache__/utils.cpython-37.pyc | Bin 0 -> 1445 bytes .../__pycache__/version.cpython-37.pyc | Bin 0 -> 11949 bytes .../setuptools/_vendor/packaging/_compat.py | 31 + .../_vendor/packaging/_structures.py | 68 + .../setuptools/_vendor/packaging/markers.py | 296 + .../_vendor/packaging/requirements.py | 138 + .../_vendor/packaging/specifiers.py | 749 ++ .../setuptools/_vendor/packaging/tags.py | 404 + .../setuptools/_vendor/packaging/utils.py | 57 + .../setuptools/_vendor/packaging/version.py | 420 + .../setuptools/_vendor/pyparsing.py | 5742 ++++++++++++ .../site-packages/setuptools/_vendor/six.py | 868 ++ .../site-packages/setuptools/archive_util.py | 173 + .../site-packages/setuptools/build_meta.py | 257 + env/Lib/site-packages/setuptools/cli-32.exe | Bin 0 -> 65536 bytes env/Lib/site-packages/setuptools/cli-64.exe | Bin 0 -> 74752 bytes env/Lib/site-packages/setuptools/cli.exe | Bin 0 -> 65536 bytes .../setuptools/command/__init__.py | 17 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 703 bytes .../command/__pycache__/alias.cpython-37.pyc | Bin 0 -> 2395 bytes .../__pycache__/bdist_egg.cpython-37.pyc | Bin 0 -> 14187 bytes .../__pycache__/bdist_rpm.cpython-37.pyc | Bin 0 -> 1774 bytes .../__pycache__/bdist_wininst.cpython-37.pyc | Bin 0 -> 965 bytes .../__pycache__/build_clib.cpython-37.pyc | Bin 0 -> 2444 bytes .../__pycache__/build_ext.cpython-37.pyc | Bin 0 -> 9747 bytes .../__pycache__/build_py.cpython-37.pyc | Bin 0 -> 8574 bytes .../__pycache__/develop.cpython-37.pyc | Bin 0 -> 6455 bytes .../__pycache__/dist_info.cpython-37.pyc | Bin 0 -> 1370 bytes .../__pycache__/easy_install.cpython-37.pyc | Bin 0 -> 64991 bytes .../__pycache__/egg_info.cpython-37.pyc | Bin 0 -> 21672 bytes .../__pycache__/install.cpython-37.pyc | Bin 0 -> 4027 bytes .../install_egg_info.cpython-37.pyc | Bin 0 -> 2403 bytes .../__pycache__/install_lib.cpython-37.pyc | Bin 0 -> 4097 bytes .../install_scripts.cpython-37.pyc | Bin 0 -> 2282 bytes .../__pycache__/py36compat.cpython-37.pyc | Bin 0 -> 4615 bytes .../__pycache__/register.cpython-37.pyc | Bin 0 -> 828 bytes .../command/__pycache__/rotate.cpython-37.pyc | Bin 0 -> 2521 bytes .../__pycache__/saveopts.cpython-37.pyc | Bin 0 -> 916 bytes .../command/__pycache__/sdist.cpython-37.pyc | Bin 0 -> 7014 bytes .../command/__pycache__/setopt.cpython-37.pyc | Bin 0 -> 4514 bytes .../command/__pycache__/test.cpython-37.pyc | Bin 0 -> 8400 bytes .../command/__pycache__/upload.cpython-37.pyc | Bin 0 -> 801 bytes .../__pycache__/upload_docs.cpython-37.pyc | Bin 0 -> 6125 bytes .../site-packages/setuptools/command/alias.py | 80 + .../setuptools/command/bdist_egg.py | 502 + .../setuptools/command/bdist_rpm.py | 43 + .../setuptools/command/bdist_wininst.py | 21 + .../setuptools/command/build_clib.py | 98 + .../setuptools/command/build_ext.py | 327 + .../setuptools/command/build_py.py | 270 + .../setuptools/command/develop.py | 221 + .../setuptools/command/dist_info.py | 36 + .../setuptools/command/easy_install.py | 2347 +++++ .../setuptools/command/egg_info.py | 717 ++ .../setuptools/command/install.py | 125 + .../setuptools/command/install_egg_info.py | 62 + .../setuptools/command/install_lib.py | 121 + .../setuptools/command/install_scripts.py | 65 + .../setuptools/command/launcher manifest.xml | 15 + .../setuptools/command/py36compat.py | 136 + .../setuptools/command/register.py | 18 + .../setuptools/command/rotate.py | 66 + .../setuptools/command/saveopts.py | 22 + .../site-packages/setuptools/command/sdist.py | 231 + .../setuptools/command/setopt.py | 149 + .../site-packages/setuptools/command/test.py | 279 + .../setuptools/command/upload.py | 17 + .../setuptools/command/upload_docs.py | 206 + env/Lib/site-packages/setuptools/config.py | 659 ++ env/Lib/site-packages/setuptools/dep_util.py | 23 + env/Lib/site-packages/setuptools/depends.py | 176 + env/Lib/site-packages/setuptools/dist.py | 1274 +++ env/Lib/site-packages/setuptools/errors.py | 16 + env/Lib/site-packages/setuptools/extension.py | 57 + .../setuptools/extern/__init__.py | 73 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 2417 bytes env/Lib/site-packages/setuptools/glob.py | 174 + env/Lib/site-packages/setuptools/gui-32.exe | Bin 0 -> 65536 bytes env/Lib/site-packages/setuptools/gui-64.exe | Bin 0 -> 75264 bytes env/Lib/site-packages/setuptools/gui.exe | Bin 0 -> 65536 bytes env/Lib/site-packages/setuptools/installer.py | 150 + env/Lib/site-packages/setuptools/launch.py | 35 + .../site-packages/setuptools/lib2to3_ex.py | 62 + env/Lib/site-packages/setuptools/monkey.py | 179 + env/Lib/site-packages/setuptools/msvc.py | 1679 ++++ .../site-packages/setuptools/namespaces.py | 107 + .../site-packages/setuptools/package_index.py | 1136 +++ .../site-packages/setuptools/py27compat.py | 60 + .../site-packages/setuptools/py31compat.py | 32 + .../site-packages/setuptools/py33compat.py | 59 + .../site-packages/setuptools/py34compat.py | 13 + env/Lib/site-packages/setuptools/sandbox.py | 491 + .../setuptools/script (dev).tmpl | 6 + env/Lib/site-packages/setuptools/script.tmpl | 3 + .../site-packages/setuptools/site-patch.py | 74 + .../site-packages/setuptools/ssl_support.py | 260 + .../site-packages/setuptools/unicode_utils.py | 44 + env/Lib/site-packages/setuptools/version.py | 6 + env/Lib/site-packages/setuptools/wheel.py | 220 + .../setuptools/windows_support.py | 29 + env/Lib/site-packages/werkzeug/__init__.py | 221 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 5425 bytes .../__pycache__/_compat.cpython-37.pyc | Bin 0 -> 7174 bytes .../__pycache__/_internal.cpython-37.pyc | Bin 0 -> 13259 bytes .../__pycache__/_reloader.cpython-37.pyc | Bin 0 -> 9623 bytes .../__pycache__/datastructures.cpython-37.pyc | Bin 0 -> 100812 bytes .../__pycache__/exceptions.cpython-37.pyc | Bin 0 -> 26066 bytes .../__pycache__/filesystem.cpython-37.pyc | Bin 0 -> 2156 bytes .../__pycache__/formparser.cpython-37.pyc | Bin 0 -> 16101 bytes .../werkzeug/__pycache__/http.cpython-37.pyc | Bin 0 -> 33973 bytes .../werkzeug/__pycache__/local.cpython-37.pyc | Bin 0 -> 18597 bytes .../__pycache__/posixemulation.cpython-37.pyc | Bin 0 -> 2728 bytes .../__pycache__/routing.cpython-37.pyc | Bin 0 -> 64526 bytes .../__pycache__/security.cpython-37.pyc | Bin 0 -> 7929 bytes .../__pycache__/serving.cpython-37.pyc | Bin 0 -> 28564 bytes .../werkzeug/__pycache__/test.cpython-37.pyc | Bin 0 -> 33565 bytes .../__pycache__/testapp.cpython-37.pyc | Bin 0 -> 9367 bytes .../werkzeug/__pycache__/urls.cpython-37.pyc | Bin 0 -> 35826 bytes .../__pycache__/useragents.cpython-37.pyc | Bin 0 -> 5483 bytes .../werkzeug/__pycache__/utils.cpython-37.pyc | Bin 0 -> 22572 bytes .../werkzeug/__pycache__/wsgi.cpython-37.pyc | Bin 0 -> 31086 bytes env/Lib/site-packages/werkzeug/_compat.py | 219 + env/Lib/site-packages/werkzeug/_internal.py | 484 + env/Lib/site-packages/werkzeug/_reloader.py | 341 + .../werkzeug/contrib/__init__.py | 16 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 714 bytes .../contrib/__pycache__/atom.cpython-37.pyc | Bin 0 -> 14174 bytes .../contrib/__pycache__/cache.cpython-37.pyc | Bin 0 -> 32574 bytes .../contrib/__pycache__/fixers.cpython-37.pyc | Bin 0 -> 9515 bytes .../contrib/__pycache__/iterio.cpython-37.pyc | Bin 0 -> 11081 bytes .../contrib/__pycache__/lint.cpython-37.pyc | Bin 0 -> 441 bytes .../__pycache__/profiler.cpython-37.pyc | Bin 0 -> 1558 bytes .../__pycache__/securecookie.cpython-37.pyc | Bin 0 -> 10782 bytes .../__pycache__/sessions.cpython-37.pyc | Bin 0 -> 13161 bytes .../__pycache__/wrappers.cpython-37.pyc | Bin 0 -> 12399 bytes .../site-packages/werkzeug/contrib/atom.py | 362 + .../site-packages/werkzeug/contrib/cache.py | 933 ++ .../site-packages/werkzeug/contrib/fixers.py | 262 + .../site-packages/werkzeug/contrib/iterio.py | 358 + .../site-packages/werkzeug/contrib/lint.py | 11 + .../werkzeug/contrib/profiler.py | 42 + .../werkzeug/contrib/securecookie.py | 362 + .../werkzeug/contrib/sessions.py | 389 + .../werkzeug/contrib/wrappers.py | 385 + .../site-packages/werkzeug/datastructures.py | 2852 ++++++ .../site-packages/werkzeug/debug/__init__.py | 524 ++ .../debug/__pycache__/__init__.cpython-37.pyc | Bin 0 -> 13174 bytes .../debug/__pycache__/console.cpython-37.pyc | Bin 0 -> 7280 bytes .../debug/__pycache__/repr.cpython-37.pyc | Bin 0 -> 8592 bytes .../debug/__pycache__/tbtools.cpython-37.pyc | Bin 0 -> 18435 bytes .../site-packages/werkzeug/debug/console.py | 216 + env/Lib/site-packages/werkzeug/debug/repr.py | 297 + .../werkzeug/debug/shared/FONT_LICENSE | 96 + .../werkzeug/debug/shared/console.png | Bin 0 -> 507 bytes .../werkzeug/debug/shared/debugger.js | 210 + .../werkzeug/debug/shared/jquery.js | 2 + .../werkzeug/debug/shared/less.png | Bin 0 -> 191 bytes .../werkzeug/debug/shared/more.png | Bin 0 -> 200 bytes .../werkzeug/debug/shared/source.png | Bin 0 -> 818 bytes .../werkzeug/debug/shared/style.css | 154 + .../werkzeug/debug/shared/ubuntu.ttf | Bin 0 -> 70220 bytes .../site-packages/werkzeug/debug/tbtools.py | 629 ++ env/Lib/site-packages/werkzeug/exceptions.py | 779 ++ env/Lib/site-packages/werkzeug/filesystem.py | 64 + env/Lib/site-packages/werkzeug/formparser.py | 584 ++ env/Lib/site-packages/werkzeug/http.py | 1259 +++ env/Lib/site-packages/werkzeug/local.py | 421 + .../werkzeug/middleware/__init__.py | 25 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 737 bytes .../__pycache__/dispatcher.cpython-37.pyc | Bin 0 -> 2426 bytes .../__pycache__/http_proxy.cpython-37.pyc | Bin 0 -> 6341 bytes .../__pycache__/lint.cpython-37.pyc | Bin 0 -> 11649 bytes .../__pycache__/profiler.cpython-37.pyc | Bin 0 -> 4603 bytes .../__pycache__/proxy_fix.cpython-37.pyc | Bin 0 -> 7746 bytes .../__pycache__/shared_data.cpython-37.pyc | Bin 0 -> 8017 bytes .../werkzeug/middleware/dispatcher.py | 66 + .../werkzeug/middleware/http_proxy.py | 219 + .../site-packages/werkzeug/middleware/lint.py | 408 + .../werkzeug/middleware/profiler.py | 132 + .../werkzeug/middleware/proxy_fix.py | 232 + .../werkzeug/middleware/shared_data.py | 253 + .../site-packages/werkzeug/posixemulation.py | 117 + env/Lib/site-packages/werkzeug/routing.py | 2039 ++++ env/Lib/site-packages/werkzeug/security.py | 249 + env/Lib/site-packages/werkzeug/serving.py | 1075 +++ env/Lib/site-packages/werkzeug/test.py | 1146 +++ env/Lib/site-packages/werkzeug/testapp.py | 241 + env/Lib/site-packages/werkzeug/urls.py | 1138 +++ env/Lib/site-packages/werkzeug/useragents.py | 210 + env/Lib/site-packages/werkzeug/utils.py | 774 ++ .../werkzeug/wrappers/__init__.py | 36 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 1665 bytes .../__pycache__/accept.cpython-37.pyc | Bin 0 -> 2194 bytes .../wrappers/__pycache__/auth.cpython-37.pyc | Bin 0 -> 1681 bytes .../__pycache__/base_request.cpython-37.pyc | Bin 0 -> 22664 bytes .../__pycache__/base_response.cpython-37.pyc | Bin 0 -> 23298 bytes .../common_descriptors.cpython-37.pyc | Bin 0 -> 12180 bytes .../wrappers/__pycache__/etag.cpython-37.pyc | Bin 0 -> 11706 bytes .../wrappers/__pycache__/json.cpython-37.pyc | Bin 0 -> 4296 bytes .../__pycache__/request.cpython-37.pyc | Bin 0 -> 1800 bytes .../__pycache__/response.cpython-37.pyc | Bin 0 -> 3311 bytes .../__pycache__/user_agent.cpython-37.pyc | Bin 0 -> 823 bytes .../site-packages/werkzeug/wrappers/accept.py | 50 + .../site-packages/werkzeug/wrappers/auth.py | 33 + .../werkzeug/wrappers/base_request.py | 695 ++ .../werkzeug/wrappers/base_response.py | 702 ++ .../werkzeug/wrappers/common_descriptors.py | 322 + .../site-packages/werkzeug/wrappers/etag.py | 304 + .../site-packages/werkzeug/wrappers/json.py | 145 + .../werkzeug/wrappers/request.py | 44 + .../werkzeug/wrappers/response.py | 78 + .../werkzeug/wrappers/user_agent.py | 14 + env/Lib/site-packages/werkzeug/wsgi.py | 1013 ++ .../wheel-0.33.6.dist-info/INSTALLER | 1 + .../wheel-0.33.6.dist-info/LICENSE.txt | 22 + .../wheel-0.33.6.dist-info/METADATA | 61 + .../wheel-0.33.6.dist-info/RECORD | 32 + .../wheel-0.33.6.dist-info/WHEEL | 6 + .../wheel-0.33.6.dist-info/entry_points.txt | 6 + .../wheel-0.33.6.dist-info/top_level.txt | 1 + env/Lib/site-packages/wheel/__init__.py | 2 + env/Lib/site-packages/wheel/__main__.py | 19 + .../wheel/__pycache__/__init__.cpython-37.pyc | Bin 0 -> 185 bytes .../wheel/__pycache__/__main__.cpython-37.pyc | Bin 0 -> 578 bytes .../__pycache__/bdist_wheel.cpython-37.pyc | Bin 0 -> 10070 bytes .../wheel/__pycache__/metadata.cpython-37.pyc | Bin 0 -> 3761 bytes .../__pycache__/pep425tags.cpython-37.pyc | Bin 0 -> 4984 bytes .../wheel/__pycache__/pkginfo.cpython-37.pyc | Bin 0 -> 1556 bytes .../wheel/__pycache__/util.cpython-37.pyc | Bin 0 -> 1301 bytes .../__pycache__/wheelfile.cpython-37.pyc | Bin 0 -> 5456 bytes env/Lib/site-packages/wheel/bdist_wheel.py | 372 + env/Lib/site-packages/wheel/cli/__init__.py | 88 + .../cli/__pycache__/__init__.cpython-37.pyc | Bin 0 -> 3027 bytes .../cli/__pycache__/convert.cpython-37.pyc | Bin 0 -> 6197 bytes .../wheel/cli/__pycache__/pack.cpython-37.pyc | Bin 0 -> 2485 bytes .../cli/__pycache__/unpack.cpython-37.pyc | Bin 0 -> 930 bytes env/Lib/site-packages/wheel/cli/convert.py | 269 + env/Lib/site-packages/wheel/cli/pack.py | 58 + env/Lib/site-packages/wheel/cli/unpack.py | 25 + env/Lib/site-packages/wheel/metadata.py | 141 + env/Lib/site-packages/wheel/pep425tags.py | 190 + env/Lib/site-packages/wheel/pkginfo.py | 43 + env/Lib/site-packages/wheel/util.py | 46 + env/Lib/site-packages/wheel/wheelfile.py | 169 + env/Lib/site.py | 829 ++ env/Lib/sre_compile.py | 784 ++ env/Lib/sre_constants.py | 261 + env/Lib/sre_parse.py | 1046 +++ env/Lib/stat.py | 178 + env/Lib/struct.py | 15 + env/Lib/tarfile.py | 2539 +++++ env/Lib/tempfile.py | 809 ++ env/Lib/token.py | 160 + env/Lib/tokenize.py | 736 ++ env/Lib/types.py | 295 + env/Lib/warnings.py | 565 ++ env/Lib/weakref.py | 656 ++ env/Scripts/activate | 84 + env/Scripts/activate.bat | 35 + env/Scripts/activate.ps1 | 60 + env/Scripts/activate.xsh | 46 + env/Scripts/activate_this.py | 46 + env/Scripts/deactivate.bat | 19 + env/Scripts/easy_install-3.7.exe | Bin 0 -> 103308 bytes env/Scripts/easy_install.exe | Bin 0 -> 103308 bytes env/Scripts/flask.exe | Bin 0 -> 103286 bytes env/Scripts/gunicorn.exe | Bin 0 -> 103295 bytes env/Scripts/pip.exe | Bin 0 -> 103295 bytes env/Scripts/pip3.7.exe | Bin 0 -> 103295 bytes env/Scripts/pip3.exe | Bin 0 -> 103295 bytes env/Scripts/python.exe | Bin 0 -> 99856 bytes env/Scripts/python3.dll | Bin 0 -> 58896 bytes env/Scripts/python37.dll | Bin 0 -> 3748368 bytes env/Scripts/pythonw.exe | Bin 0 -> 98320 bytes env/Scripts/wheel.exe | Bin 0 -> 103286 bytes env/tcl/tcl8.6/auto.tcl | 646 ++ env/tcl/tcl8.6/clock.tcl | 4547 +++++++++ env/tcl/tcl8.6/encoding/ascii.enc | 20 + env/tcl/tcl8.6/encoding/big5.enc | 1516 +++ env/tcl/tcl8.6/encoding/cp1250.enc | 20 + env/tcl/tcl8.6/encoding/cp1251.enc | 20 + env/tcl/tcl8.6/encoding/cp1252.enc | 20 + env/tcl/tcl8.6/encoding/cp1253.enc | 20 + env/tcl/tcl8.6/encoding/cp1254.enc | 20 + env/tcl/tcl8.6/encoding/cp1255.enc | 20 + env/tcl/tcl8.6/encoding/cp1256.enc | 20 + env/tcl/tcl8.6/encoding/cp1257.enc | 20 + env/tcl/tcl8.6/encoding/cp1258.enc | 20 + env/tcl/tcl8.6/encoding/cp437.enc | 20 + env/tcl/tcl8.6/encoding/cp737.enc | 20 + env/tcl/tcl8.6/encoding/cp775.enc | 20 + env/tcl/tcl8.6/encoding/cp850.enc | 20 + env/tcl/tcl8.6/encoding/cp852.enc | 20 + env/tcl/tcl8.6/encoding/cp855.enc | 20 + env/tcl/tcl8.6/encoding/cp857.enc | 20 + env/tcl/tcl8.6/encoding/cp860.enc | 20 + env/tcl/tcl8.6/encoding/cp861.enc | 20 + env/tcl/tcl8.6/encoding/cp862.enc | 20 + env/tcl/tcl8.6/encoding/cp863.enc | 20 + env/tcl/tcl8.6/encoding/cp864.enc | 20 + env/tcl/tcl8.6/encoding/cp865.enc | 20 + env/tcl/tcl8.6/encoding/cp866.enc | 20 + env/tcl/tcl8.6/encoding/cp869.enc | 20 + env/tcl/tcl8.6/encoding/cp874.enc | 20 + env/tcl/tcl8.6/encoding/cp932.enc | 801 ++ env/tcl/tcl8.6/encoding/cp936.enc | 2162 +++++ env/tcl/tcl8.6/encoding/cp949.enc | 2128 +++++ env/tcl/tcl8.6/encoding/cp950.enc | 1499 +++ env/tcl/tcl8.6/encoding/dingbats.enc | 20 + env/tcl/tcl8.6/encoding/ebcdic.enc | 19 + env/tcl/tcl8.6/encoding/euc-cn.enc | 1397 +++ env/tcl/tcl8.6/encoding/euc-jp.enc | 1353 +++ env/tcl/tcl8.6/encoding/euc-kr.enc | 1533 +++ env/tcl/tcl8.6/encoding/gb12345.enc | 1414 +++ env/tcl/tcl8.6/encoding/gb1988.enc | 20 + env/tcl/tcl8.6/encoding/gb2312-raw.enc | 1380 +++ env/tcl/tcl8.6/encoding/gb2312.enc | 1397 +++ env/tcl/tcl8.6/encoding/iso2022-jp.enc | 12 + env/tcl/tcl8.6/encoding/iso2022-kr.enc | 7 + env/tcl/tcl8.6/encoding/iso2022.enc | 14 + env/tcl/tcl8.6/encoding/iso8859-1.enc | 20 + env/tcl/tcl8.6/encoding/iso8859-10.enc | 20 + env/tcl/tcl8.6/encoding/iso8859-13.enc | 20 + env/tcl/tcl8.6/encoding/iso8859-14.enc | 20 + env/tcl/tcl8.6/encoding/iso8859-15.enc | 20 + env/tcl/tcl8.6/encoding/iso8859-16.enc | 20 + env/tcl/tcl8.6/encoding/iso8859-2.enc | 20 + env/tcl/tcl8.6/encoding/iso8859-3.enc | 20 + env/tcl/tcl8.6/encoding/iso8859-4.enc | 20 + env/tcl/tcl8.6/encoding/iso8859-5.enc | 20 + env/tcl/tcl8.6/encoding/iso8859-6.enc | 20 + env/tcl/tcl8.6/encoding/iso8859-7.enc | 20 + env/tcl/tcl8.6/encoding/iso8859-8.enc | 20 + env/tcl/tcl8.6/encoding/iso8859-9.enc | 20 + env/tcl/tcl8.6/encoding/jis0201.enc | 20 + env/tcl/tcl8.6/encoding/jis0208.enc | 1319 +++ env/tcl/tcl8.6/encoding/jis0212.enc | 1159 +++ env/tcl/tcl8.6/encoding/koi8-r.enc | 20 + env/tcl/tcl8.6/encoding/koi8-u.enc | 20 + env/tcl/tcl8.6/encoding/ksc5601.enc | 1516 +++ env/tcl/tcl8.6/encoding/macCentEuro.enc | 20 + env/tcl/tcl8.6/encoding/macCroatian.enc | 20 + env/tcl/tcl8.6/encoding/macCyrillic.enc | 20 + env/tcl/tcl8.6/encoding/macDingbats.enc | 20 + env/tcl/tcl8.6/encoding/macGreek.enc | 20 + env/tcl/tcl8.6/encoding/macIceland.enc | 20 + env/tcl/tcl8.6/encoding/macJapan.enc | 785 ++ env/tcl/tcl8.6/encoding/macRoman.enc | 20 + env/tcl/tcl8.6/encoding/macRomania.enc | 20 + env/tcl/tcl8.6/encoding/macThai.enc | 20 + env/tcl/tcl8.6/encoding/macTurkish.enc | 20 + env/tcl/tcl8.6/encoding/macUkraine.enc | 20 + env/tcl/tcl8.6/encoding/shiftjis.enc | 690 ++ env/tcl/tcl8.6/encoding/symbol.enc | 20 + env/tcl/tcl8.6/encoding/tis-620.enc | 20 + env/tcl/tcl8.6/history.tcl | 335 + env/tcl/tcl8.6/http1.0/http.tcl | 377 + env/tcl/tcl8.6/http1.0/pkgIndex.tcl | 11 + env/tcl/tcl8.6/init.tcl | 819 ++ env/tcl/tcl8.6/msgs/af.msg | 49 + env/tcl/tcl8.6/msgs/af_za.msg | 6 + env/tcl/tcl8.6/msgs/ar.msg | 54 + env/tcl/tcl8.6/msgs/ar_in.msg | 6 + env/tcl/tcl8.6/msgs/ar_jo.msg | 39 + env/tcl/tcl8.6/msgs/ar_lb.msg | 39 + env/tcl/tcl8.6/msgs/ar_sy.msg | 39 + env/tcl/tcl8.6/msgs/be.msg | 52 + env/tcl/tcl8.6/msgs/bg.msg | 52 + env/tcl/tcl8.6/msgs/bn.msg | 49 + env/tcl/tcl8.6/msgs/bn_in.msg | 6 + env/tcl/tcl8.6/msgs/ca.msg | 50 + env/tcl/tcl8.6/msgs/cs.msg | 54 + env/tcl/tcl8.6/msgs/da.msg | 52 + env/tcl/tcl8.6/msgs/de.msg | 54 + env/tcl/tcl8.6/msgs/de_at.msg | 35 + env/tcl/tcl8.6/msgs/de_be.msg | 53 + env/tcl/tcl8.6/msgs/el.msg | 52 + env/tcl/tcl8.6/msgs/en_au.msg | 7 + env/tcl/tcl8.6/msgs/en_be.msg | 7 + env/tcl/tcl8.6/msgs/en_bw.msg | 6 + env/tcl/tcl8.6/msgs/en_ca.msg | 7 + env/tcl/tcl8.6/msgs/en_gb.msg | 7 + env/tcl/tcl8.6/msgs/en_hk.msg | 8 + env/tcl/tcl8.6/msgs/en_ie.msg | 7 + env/tcl/tcl8.6/msgs/en_in.msg | 8 + env/tcl/tcl8.6/msgs/en_nz.msg | 7 + env/tcl/tcl8.6/msgs/en_ph.msg | 8 + env/tcl/tcl8.6/msgs/en_sg.msg | 6 + env/tcl/tcl8.6/msgs/en_za.msg | 6 + env/tcl/tcl8.6/msgs/en_zw.msg | 6 + env/tcl/tcl8.6/msgs/eo.msg | 54 + env/tcl/tcl8.6/msgs/es.msg | 52 + env/tcl/tcl8.6/msgs/es_ar.msg | 6 + env/tcl/tcl8.6/msgs/es_bo.msg | 6 + env/tcl/tcl8.6/msgs/es_cl.msg | 6 + env/tcl/tcl8.6/msgs/es_co.msg | 6 + env/tcl/tcl8.6/msgs/es_cr.msg | 6 + env/tcl/tcl8.6/msgs/es_do.msg | 6 + env/tcl/tcl8.6/msgs/es_ec.msg | 6 + env/tcl/tcl8.6/msgs/es_gt.msg | 6 + env/tcl/tcl8.6/msgs/es_hn.msg | 6 + env/tcl/tcl8.6/msgs/es_mx.msg | 6 + env/tcl/tcl8.6/msgs/es_ni.msg | 6 + env/tcl/tcl8.6/msgs/es_pa.msg | 6 + env/tcl/tcl8.6/msgs/es_pe.msg | 6 + env/tcl/tcl8.6/msgs/es_pr.msg | 6 + env/tcl/tcl8.6/msgs/es_py.msg | 6 + env/tcl/tcl8.6/msgs/es_sv.msg | 6 + env/tcl/tcl8.6/msgs/es_uy.msg | 6 + env/tcl/tcl8.6/msgs/es_ve.msg | 6 + env/tcl/tcl8.6/msgs/et.msg | 52 + env/tcl/tcl8.6/msgs/eu.msg | 47 + env/tcl/tcl8.6/msgs/eu_es.msg | 7 + env/tcl/tcl8.6/msgs/fa.msg | 47 + env/tcl/tcl8.6/msgs/fa_in.msg | 52 + env/tcl/tcl8.6/msgs/fa_ir.msg | 9 + env/tcl/tcl8.6/msgs/fi.msg | 50 + env/tcl/tcl8.6/msgs/fo.msg | 47 + env/tcl/tcl8.6/msgs/fo_fo.msg | 7 + env/tcl/tcl8.6/msgs/fr.msg | 52 + env/tcl/tcl8.6/msgs/fr_be.msg | 7 + env/tcl/tcl8.6/msgs/fr_ca.msg | 7 + env/tcl/tcl8.6/msgs/fr_ch.msg | 7 + env/tcl/tcl8.6/msgs/ga.msg | 47 + env/tcl/tcl8.6/msgs/ga_ie.msg | 7 + env/tcl/tcl8.6/msgs/gl.msg | 47 + env/tcl/tcl8.6/msgs/gl_es.msg | 6 + env/tcl/tcl8.6/msgs/gv.msg | 47 + env/tcl/tcl8.6/msgs/gv_gb.msg | 6 + env/tcl/tcl8.6/msgs/he.msg | 52 + env/tcl/tcl8.6/msgs/hi.msg | 39 + env/tcl/tcl8.6/msgs/hi_in.msg | 6 + env/tcl/tcl8.6/msgs/hr.msg | 50 + env/tcl/tcl8.6/msgs/hu.msg | 54 + env/tcl/tcl8.6/msgs/id.msg | 47 + env/tcl/tcl8.6/msgs/id_id.msg | 6 + env/tcl/tcl8.6/msgs/is.msg | 50 + env/tcl/tcl8.6/msgs/it.msg | 54 + env/tcl/tcl8.6/msgs/it_ch.msg | 6 + env/tcl/tcl8.6/msgs/ja.msg | 44 + env/tcl/tcl8.6/msgs/kl.msg | 47 + env/tcl/tcl8.6/msgs/kl_gl.msg | 7 + env/tcl/tcl8.6/msgs/ko.msg | 55 + env/tcl/tcl8.6/msgs/ko_kr.msg | 8 + env/tcl/tcl8.6/msgs/kok.msg | 39 + env/tcl/tcl8.6/msgs/kok_in.msg | 6 + env/tcl/tcl8.6/msgs/kw.msg | 47 + env/tcl/tcl8.6/msgs/kw_gb.msg | 6 + env/tcl/tcl8.6/msgs/lt.msg | 52 + env/tcl/tcl8.6/msgs/lv.msg | 52 + env/tcl/tcl8.6/msgs/mk.msg | 52 + env/tcl/tcl8.6/msgs/mr.msg | 39 + env/tcl/tcl8.6/msgs/mr_in.msg | 6 + env/tcl/tcl8.6/msgs/ms.msg | 47 + env/tcl/tcl8.6/msgs/ms_my.msg | 6 + env/tcl/tcl8.6/msgs/mt.msg | 27 + env/tcl/tcl8.6/msgs/nb.msg | 52 + env/tcl/tcl8.6/msgs/nl.msg | 50 + env/tcl/tcl8.6/msgs/nl_be.msg | 7 + env/tcl/tcl8.6/msgs/nn.msg | 52 + env/tcl/tcl8.6/msgs/pl.msg | 52 + env/tcl/tcl8.6/msgs/pt.msg | 50 + env/tcl/tcl8.6/msgs/pt_br.msg | 7 + env/tcl/tcl8.6/msgs/ro.msg | 52 + env/tcl/tcl8.6/msgs/ru.msg | 52 + env/tcl/tcl8.6/msgs/ru_ua.msg | 6 + env/tcl/tcl8.6/msgs/sh.msg | 52 + env/tcl/tcl8.6/msgs/sk.msg | 52 + env/tcl/tcl8.6/msgs/sl.msg | 52 + env/tcl/tcl8.6/msgs/sq.msg | 54 + env/tcl/tcl8.6/msgs/sr.msg | 52 + env/tcl/tcl8.6/msgs/sv.msg | 52 + env/tcl/tcl8.6/msgs/sw.msg | 49 + env/tcl/tcl8.6/msgs/ta.msg | 39 + env/tcl/tcl8.6/msgs/ta_in.msg | 6 + env/tcl/tcl8.6/msgs/te.msg | 47 + env/tcl/tcl8.6/msgs/te_in.msg | 8 + env/tcl/tcl8.6/msgs/th.msg | 54 + env/tcl/tcl8.6/msgs/tr.msg | 50 + env/tcl/tcl8.6/msgs/uk.msg | 52 + env/tcl/tcl8.6/msgs/vi.msg | 50 + env/tcl/tcl8.6/msgs/zh.msg | 55 + env/tcl/tcl8.6/msgs/zh_cn.msg | 7 + env/tcl/tcl8.6/msgs/zh_hk.msg | 28 + env/tcl/tcl8.6/msgs/zh_sg.msg | 8 + env/tcl/tcl8.6/msgs/zh_tw.msg | 8 + env/tcl/tcl8.6/opt0.4/optparse.tcl | 1072 +++ env/tcl/tcl8.6/opt0.4/pkgIndex.tcl | 12 + env/tcl/tcl8.6/package.tcl | 747 ++ env/tcl/tcl8.6/parray.tcl | 28 + env/tcl/tcl8.6/safe.tcl | 1133 +++ env/tcl/tcl8.6/tclIndex | 75 + env/tcl/tcl8.6/tm.tcl | 375 + env/tcl/tcl8.6/tzdata/Africa/Abidjan | 6 + env/tcl/tcl8.6/tzdata/Africa/Accra | 52 + env/tcl/tcl8.6/tzdata/Africa/Addis_Ababa | 5 + env/tcl/tcl8.6/tzdata/Africa/Algiers | 39 + env/tcl/tcl8.6/tzdata/Africa/Asmara | 5 + env/tcl/tcl8.6/tzdata/Africa/Asmera | 5 + env/tcl/tcl8.6/tzdata/Africa/Bamako | 5 + env/tcl/tcl8.6/tzdata/Africa/Bangui | 5 + env/tcl/tcl8.6/tzdata/Africa/Banjul | 5 + env/tcl/tcl8.6/tzdata/Africa/Bissau | 7 + env/tcl/tcl8.6/tzdata/Africa/Blantyre | 5 + env/tcl/tcl8.6/tzdata/Africa/Brazzaville | 5 + env/tcl/tcl8.6/tzdata/Africa/Bujumbura | 5 + env/tcl/tcl8.6/tzdata/Africa/Cairo | 132 + env/tcl/tcl8.6/tzdata/Africa/Casablanca | 60 + env/tcl/tcl8.6/tzdata/Africa/Ceuta | 259 + env/tcl/tcl8.6/tzdata/Africa/Conakry | 5 + env/tcl/tcl8.6/tzdata/Africa/Dakar | 5 + env/tcl/tcl8.6/tzdata/Africa/Dar_es_Salaam | 5 + env/tcl/tcl8.6/tzdata/Africa/Djibouti | 5 + env/tcl/tcl8.6/tzdata/Africa/Douala | 5 + env/tcl/tcl8.6/tzdata/Africa/El_Aaiun | 49 + env/tcl/tcl8.6/tzdata/Africa/Freetown | 5 + env/tcl/tcl8.6/tzdata/Africa/Gaborone | 5 + env/tcl/tcl8.6/tzdata/Africa/Harare | 5 + env/tcl/tcl8.6/tzdata/Africa/Johannesburg | 11 + env/tcl/tcl8.6/tzdata/Africa/Juba | 39 + env/tcl/tcl8.6/tzdata/Africa/Kampala | 5 + env/tcl/tcl8.6/tzdata/Africa/Khartoum | 40 + env/tcl/tcl8.6/tzdata/Africa/Kigali | 5 + env/tcl/tcl8.6/tzdata/Africa/Kinshasa | 5 + env/tcl/tcl8.6/tzdata/Africa/Lagos | 6 + env/tcl/tcl8.6/tzdata/Africa/Libreville | 5 + env/tcl/tcl8.6/tzdata/Africa/Lome | 5 + env/tcl/tcl8.6/tzdata/Africa/Luanda | 5 + env/tcl/tcl8.6/tzdata/Africa/Lubumbashi | 5 + env/tcl/tcl8.6/tzdata/Africa/Lusaka | 5 + env/tcl/tcl8.6/tzdata/Africa/Malabo | 5 + env/tcl/tcl8.6/tzdata/Africa/Maputo | 6 + env/tcl/tcl8.6/tzdata/Africa/Maseru | 5 + env/tcl/tcl8.6/tzdata/Africa/Mbabane | 5 + env/tcl/tcl8.6/tzdata/Africa/Mogadishu | 5 + env/tcl/tcl8.6/tzdata/Africa/Monrovia | 8 + env/tcl/tcl8.6/tzdata/Africa/Nairobi | 9 + env/tcl/tcl8.6/tzdata/Africa/Ndjamena | 8 + env/tcl/tcl8.6/tzdata/Africa/Niamey | 5 + env/tcl/tcl8.6/tzdata/Africa/Nouakchott | 5 + env/tcl/tcl8.6/tzdata/Africa/Ouagadougou | 5 + env/tcl/tcl8.6/tzdata/Africa/Porto-Novo | 5 + env/tcl/tcl8.6/tzdata/Africa/Sao_Tome | 8 + env/tcl/tcl8.6/tzdata/Africa/Timbuktu | 5 + env/tcl/tcl8.6/tzdata/Africa/Tripoli | 34 + env/tcl/tcl8.6/tzdata/Africa/Tunis | 39 + env/tcl/tcl8.6/tzdata/Africa/Windhoek | 58 + env/tcl/tcl8.6/tzdata/America/Adak | 276 + env/tcl/tcl8.6/tzdata/America/Anchorage | 275 + env/tcl/tcl8.6/tzdata/America/Anguilla | 5 + env/tcl/tcl8.6/tzdata/America/Antigua | 5 + env/tcl/tcl8.6/tzdata/America/Araguaina | 60 + .../tzdata/America/Argentina/Buenos_Aires | 67 + .../tcl8.6/tzdata/America/Argentina/Catamarca | 68 + .../tzdata/America/Argentina/ComodRivadavia | 5 + .../tcl8.6/tzdata/America/Argentina/Cordoba | 67 + env/tcl/tcl8.6/tzdata/America/Argentina/Jujuy | 67 + .../tcl8.6/tzdata/America/Argentina/La_Rioja | 69 + .../tcl8.6/tzdata/America/Argentina/Mendoza | 68 + .../tzdata/America/Argentina/Rio_Gallegos | 68 + env/tcl/tcl8.6/tzdata/America/Argentina/Salta | 66 + .../tcl8.6/tzdata/America/Argentina/San_Juan | 69 + .../tcl8.6/tzdata/America/Argentina/San_Luis | 68 + .../tcl8.6/tzdata/America/Argentina/Tucuman | 69 + .../tcl8.6/tzdata/America/Argentina/Ushuaia | 68 + env/tcl/tcl8.6/tzdata/America/Aruba | 5 + env/tcl/tcl8.6/tzdata/America/Asuncion | 259 + env/tcl/tcl8.6/tzdata/America/Atikokan | 12 + env/tcl/tcl8.6/tzdata/America/Atka | 5 + env/tcl/tcl8.6/tzdata/America/Bahia | 68 + env/tcl/tcl8.6/tzdata/America/Bahia_Banderas | 222 + env/tcl/tcl8.6/tzdata/America/Barbados | 15 + env/tcl/tcl8.6/tzdata/America/Belem | 35 + env/tcl/tcl8.6/tzdata/America/Belize | 60 + env/tcl/tcl8.6/tzdata/America/Blanc-Sablon | 12 + env/tcl/tcl8.6/tzdata/America/Boa_Vista | 40 + env/tcl/tcl8.6/tzdata/America/Bogota | 9 + env/tcl/tcl8.6/tzdata/America/Boise | 281 + env/tcl/tcl8.6/tzdata/America/Buenos_Aires | 5 + env/tcl/tcl8.6/tzdata/America/Cambridge_Bay | 252 + env/tcl/tcl8.6/tzdata/America/Campo_Grande | 257 + env/tcl/tcl8.6/tzdata/America/Cancun | 47 + env/tcl/tcl8.6/tzdata/America/Caracas | 10 + env/tcl/tcl8.6/tzdata/America/Catamarca | 5 + env/tcl/tcl8.6/tzdata/America/Cayenne | 7 + env/tcl/tcl8.6/tzdata/America/Cayman | 5 + env/tcl/tcl8.6/tzdata/America/Chicago | 369 + env/tcl/tcl8.6/tzdata/America/Chihuahua | 221 + env/tcl/tcl8.6/tzdata/America/Coral_Harbour | 5 + env/tcl/tcl8.6/tzdata/America/Cordoba | 5 + env/tcl/tcl8.6/tzdata/America/Costa_Rica | 15 + env/tcl/tcl8.6/tzdata/America/Creston | 8 + env/tcl/tcl8.6/tzdata/America/Cuiaba | 257 + env/tcl/tcl8.6/tzdata/America/Curacao | 7 + env/tcl/tcl8.6/tzdata/America/Danmarkshavn | 39 + env/tcl/tcl8.6/tzdata/America/Dawson | 256 + env/tcl/tcl8.6/tzdata/America/Dawson_Creek | 64 + env/tcl/tcl8.6/tzdata/America/Denver | 291 + env/tcl/tcl8.6/tzdata/America/Detroit | 270 + env/tcl/tcl8.6/tzdata/America/Dominica | 5 + env/tcl/tcl8.6/tzdata/America/Edmonton | 284 + env/tcl/tcl8.6/tzdata/America/Eirunepe | 41 + env/tcl/tcl8.6/tzdata/America/El_Salvador | 10 + env/tcl/tcl8.6/tzdata/America/Ensenada | 5 + env/tcl/tcl8.6/tzdata/America/Fort_Nelson | 151 + env/tcl/tcl8.6/tzdata/America/Fort_Wayne | 5 + env/tcl/tcl8.6/tzdata/America/Fortaleza | 48 + env/tcl/tcl8.6/tzdata/America/Glace_Bay | 273 + env/tcl/tcl8.6/tzdata/America/Godthab | 246 + env/tcl/tcl8.6/tzdata/America/Goose_Bay | 338 + env/tcl/tcl8.6/tzdata/America/Grand_Turk | 246 + env/tcl/tcl8.6/tzdata/America/Grenada | 5 + env/tcl/tcl8.6/tzdata/America/Guadeloupe | 5 + env/tcl/tcl8.6/tzdata/America/Guatemala | 14 + env/tcl/tcl8.6/tzdata/America/Guayaquil | 9 + env/tcl/tcl8.6/tzdata/America/Guyana | 8 + env/tcl/tcl8.6/tzdata/America/Halifax | 361 + env/tcl/tcl8.6/tzdata/America/Havana | 285 + env/tcl/tcl8.6/tzdata/America/Hermosillo | 21 + .../tzdata/America/Indiana/Indianapolis | 234 + env/tcl/tcl8.6/tzdata/America/Indiana/Knox | 285 + env/tcl/tcl8.6/tzdata/America/Indiana/Marengo | 236 + .../tcl8.6/tzdata/America/Indiana/Petersburg | 247 + .../tcl8.6/tzdata/America/Indiana/Tell_City | 234 + env/tcl/tcl8.6/tzdata/America/Indiana/Vevay | 213 + .../tcl8.6/tzdata/America/Indiana/Vincennes | 234 + env/tcl/tcl8.6/tzdata/America/Indiana/Winamac | 240 + env/tcl/tcl8.6/tzdata/America/Indianapolis | 5 + env/tcl/tcl8.6/tzdata/America/Inuvik | 249 + env/tcl/tcl8.6/tzdata/America/Iqaluit | 250 + env/tcl/tcl8.6/tzdata/America/Jamaica | 29 + env/tcl/tcl8.6/tzdata/America/Jujuy | 5 + env/tcl/tcl8.6/tzdata/America/Juneau | 276 + .../tcl8.6/tzdata/America/Kentucky/Louisville | 314 + .../tcl8.6/tzdata/America/Kentucky/Monticello | 279 + env/tcl/tcl8.6/tzdata/America/Knox_IN | 5 + env/tcl/tcl8.6/tzdata/America/Kralendijk | 5 + env/tcl/tcl8.6/tzdata/America/La_Paz | 8 + env/tcl/tcl8.6/tzdata/America/Lima | 16 + env/tcl/tcl8.6/tzdata/America/Los_Angeles | 317 + env/tcl/tcl8.6/tzdata/America/Louisville | 5 + env/tcl/tcl8.6/tzdata/America/Lower_Princes | 5 + env/tcl/tcl8.6/tzdata/America/Maceio | 52 + env/tcl/tcl8.6/tzdata/America/Managua | 21 + env/tcl/tcl8.6/tzdata/America/Manaus | 39 + env/tcl/tcl8.6/tzdata/America/Marigot | 5 + env/tcl/tcl8.6/tzdata/America/Martinique | 9 + env/tcl/tcl8.6/tzdata/America/Matamoros | 219 + env/tcl/tcl8.6/tzdata/America/Mazatlan | 222 + env/tcl/tcl8.6/tzdata/America/Mendoza | 5 + env/tcl/tcl8.6/tzdata/America/Menominee | 274 + env/tcl/tcl8.6/tzdata/America/Merida | 216 + env/tcl/tcl8.6/tzdata/America/Metlakatla | 212 + env/tcl/tcl8.6/tzdata/America/Mexico_City | 228 + env/tcl/tcl8.6/tzdata/America/Miquelon | 234 + env/tcl/tcl8.6/tzdata/America/Moncton | 342 + env/tcl/tcl8.6/tzdata/America/Monterrey | 218 + env/tcl/tcl8.6/tzdata/America/Montevideo | 96 + env/tcl/tcl8.6/tzdata/America/Montreal | 5 + env/tcl/tcl8.6/tzdata/America/Montserrat | 5 + env/tcl/tcl8.6/tzdata/America/Nassau | 279 + env/tcl/tcl8.6/tzdata/America/New_York | 369 + env/tcl/tcl8.6/tzdata/America/Nipigon | 264 + env/tcl/tcl8.6/tzdata/America/Nome | 276 + env/tcl/tcl8.6/tzdata/America/Noronha | 48 + .../tcl8.6/tzdata/America/North_Dakota/Beulah | 279 + .../tcl8.6/tzdata/America/North_Dakota/Center | 279 + .../tzdata/America/North_Dakota/New_Salem | 279 + env/tcl/tcl8.6/tzdata/America/Ojinaga | 222 + env/tcl/tcl8.6/tzdata/America/Panama | 7 + env/tcl/tcl8.6/tzdata/America/Pangnirtung | 252 + env/tcl/tcl8.6/tzdata/America/Paramaribo | 9 + env/tcl/tcl8.6/tzdata/America/Phoenix | 17 + env/tcl/tcl8.6/tzdata/America/Port-au-Prince | 215 + env/tcl/tcl8.6/tzdata/America/Port_of_Spain | 6 + env/tcl/tcl8.6/tzdata/America/Porto_Acre | 5 + env/tcl/tcl8.6/tzdata/America/Porto_Velho | 35 + env/tcl/tcl8.6/tzdata/America/Puerto_Rico | 10 + env/tcl/tcl8.6/tzdata/America/Punta_Arenas | 122 + env/tcl/tcl8.6/tzdata/America/Rainy_River | 264 + env/tcl/tcl8.6/tzdata/America/Rankin_Inlet | 248 + env/tcl/tcl8.6/tzdata/America/Recife | 48 + env/tcl/tcl8.6/tzdata/America/Regina | 58 + env/tcl/tcl8.6/tzdata/America/Resolute | 248 + env/tcl/tcl8.6/tzdata/America/Rio_Branco | 37 + env/tcl/tcl8.6/tzdata/America/Rosario | 5 + env/tcl/tcl8.6/tzdata/America/Santa_Isabel | 5 + env/tcl/tcl8.6/tzdata/America/Santarem | 36 + env/tcl/tcl8.6/tzdata/America/Santiago | 289 + env/tcl/tcl8.6/tzdata/America/Santo_Domingo | 21 + env/tcl/tcl8.6/tzdata/America/Sao_Paulo | 258 + env/tcl/tcl8.6/tzdata/America/Scoresbysund | 246 + env/tcl/tcl8.6/tzdata/America/Shiprock | 5 + env/tcl/tcl8.6/tzdata/America/Sitka | 275 + env/tcl/tcl8.6/tzdata/America/St_Barthelemy | 5 + env/tcl/tcl8.6/tzdata/America/St_Johns | 372 + env/tcl/tcl8.6/tzdata/America/St_Kitts | 5 + env/tcl/tcl8.6/tzdata/America/St_Lucia | 5 + env/tcl/tcl8.6/tzdata/America/St_Thomas | 5 + env/tcl/tcl8.6/tzdata/America/St_Vincent | 5 + env/tcl/tcl8.6/tzdata/America/Swift_Current | 29 + env/tcl/tcl8.6/tzdata/America/Tegucigalpa | 12 + env/tcl/tcl8.6/tzdata/America/Thule | 224 + env/tcl/tcl8.6/tzdata/America/Thunder_Bay | 272 + env/tcl/tcl8.6/tzdata/America/Tijuana | 285 + env/tcl/tcl8.6/tzdata/America/Toronto | 365 + env/tcl/tcl8.6/tzdata/America/Tortola | 5 + env/tcl/tcl8.6/tzdata/America/Vancouver | 320 + env/tcl/tcl8.6/tzdata/America/Virgin | 5 + env/tcl/tcl8.6/tzdata/America/Whitehorse | 256 + env/tcl/tcl8.6/tzdata/America/Winnipeg | 316 + env/tcl/tcl8.6/tzdata/America/Yakutat | 276 + env/tcl/tcl8.6/tzdata/America/Yellowknife | 252 + env/tcl/tcl8.6/tzdata/Antarctica/Casey | 12 + env/tcl/tcl8.6/tzdata/Antarctica/Davis | 12 + .../tcl8.6/tzdata/Antarctica/DumontDUrville | 8 + env/tcl/tcl8.6/tzdata/Antarctica/Macquarie | 97 + env/tcl/tcl8.6/tzdata/Antarctica/Mawson | 7 + env/tcl/tcl8.6/tzdata/Antarctica/McMurdo | 5 + env/tcl/tcl8.6/tzdata/Antarctica/Palmer | 87 + env/tcl/tcl8.6/tzdata/Antarctica/Rothera | 6 + env/tcl/tcl8.6/tzdata/Antarctica/South_Pole | 5 + env/tcl/tcl8.6/tzdata/Antarctica/Syowa | 6 + env/tcl/tcl8.6/tzdata/Antarctica/Troll | 196 + env/tcl/tcl8.6/tzdata/Antarctica/Vostok | 6 + env/tcl/tcl8.6/tzdata/Arctic/Longyearbyen | 5 + env/tcl/tcl8.6/tzdata/Asia/Aden | 5 + env/tcl/tcl8.6/tzdata/Asia/Almaty | 57 + env/tcl/tcl8.6/tzdata/Asia/Amman | 246 + env/tcl/tcl8.6/tzdata/Asia/Anadyr | 72 + env/tcl/tcl8.6/tzdata/Asia/Aqtau | 58 + env/tcl/tcl8.6/tzdata/Asia/Aqtobe | 58 + env/tcl/tcl8.6/tzdata/Asia/Ashgabat | 31 + env/tcl/tcl8.6/tzdata/Asia/Ashkhabad | 5 + env/tcl/tcl8.6/tzdata/Asia/Atyrau | 58 + env/tcl/tcl8.6/tzdata/Asia/Baghdad | 59 + env/tcl/tcl8.6/tzdata/Asia/Bahrain | 5 + env/tcl/tcl8.6/tzdata/Asia/Baku | 74 + env/tcl/tcl8.6/tzdata/Asia/Bangkok | 7 + env/tcl/tcl8.6/tzdata/Asia/Barnaul | 73 + env/tcl/tcl8.6/tzdata/Asia/Beirut | 270 + env/tcl/tcl8.6/tzdata/Asia/Bishkek | 58 + env/tcl/tcl8.6/tzdata/Asia/Brunei | 7 + env/tcl/tcl8.6/tzdata/Asia/Calcutta | 5 + env/tcl/tcl8.6/tzdata/Asia/Chita | 72 + env/tcl/tcl8.6/tzdata/Asia/Choibalsan | 56 + env/tcl/tcl8.6/tzdata/Asia/Chongqing | 5 + env/tcl/tcl8.6/tzdata/Asia/Chungking | 5 + env/tcl/tcl8.6/tzdata/Asia/Colombo | 13 + env/tcl/tcl8.6/tzdata/Asia/Dacca | 5 + env/tcl/tcl8.6/tzdata/Asia/Damascus | 280 + env/tcl/tcl8.6/tzdata/Asia/Dhaka | 13 + env/tcl/tcl8.6/tzdata/Asia/Dili | 9 + env/tcl/tcl8.6/tzdata/Asia/Dubai | 6 + env/tcl/tcl8.6/tzdata/Asia/Dushanbe | 29 + env/tcl/tcl8.6/tzdata/Asia/Famagusta | 256 + env/tcl/tcl8.6/tzdata/Asia/Gaza | 278 + env/tcl/tcl8.6/tzdata/Asia/Harbin | 5 + env/tcl/tcl8.6/tzdata/Asia/Hebron | 277 + env/tcl/tcl8.6/tzdata/Asia/Ho_Chi_Minh | 14 + env/tcl/tcl8.6/tzdata/Asia/Hong_Kong | 75 + env/tcl/tcl8.6/tzdata/Asia/Hovd | 55 + env/tcl/tcl8.6/tzdata/Asia/Irkutsk | 72 + env/tcl/tcl8.6/tzdata/Asia/Istanbul | 5 + env/tcl/tcl8.6/tzdata/Asia/Jakarta | 13 + env/tcl/tcl8.6/tzdata/Asia/Jayapura | 8 + env/tcl/tcl8.6/tzdata/Asia/Jerusalem | 272 + env/tcl/tcl8.6/tzdata/Asia/Kabul | 7 + env/tcl/tcl8.6/tzdata/Asia/Kamchatka | 71 + env/tcl/tcl8.6/tzdata/Asia/Karachi | 16 + env/tcl/tcl8.6/tzdata/Asia/Kashgar | 5 + env/tcl/tcl8.6/tzdata/Asia/Kathmandu | 7 + env/tcl/tcl8.6/tzdata/Asia/Katmandu | 5 + env/tcl/tcl8.6/tzdata/Asia/Khandyga | 73 + env/tcl/tcl8.6/tzdata/Asia/Kolkata | 12 + env/tcl/tcl8.6/tzdata/Asia/Krasnoyarsk | 71 + env/tcl/tcl8.6/tzdata/Asia/Kuala_Lumpur | 13 + env/tcl/tcl8.6/tzdata/Asia/Kuching | 23 + env/tcl/tcl8.6/tzdata/Asia/Kuwait | 5 + env/tcl/tcl8.6/tzdata/Asia/Macao | 5 + env/tcl/tcl8.6/tzdata/Asia/Macau | 76 + env/tcl/tcl8.6/tzdata/Asia/Magadan | 72 + env/tcl/tcl8.6/tzdata/Asia/Makassar | 9 + env/tcl/tcl8.6/tzdata/Asia/Manila | 15 + env/tcl/tcl8.6/tzdata/Asia/Muscat | 5 + env/tcl/tcl8.6/tzdata/Asia/Nicosia | 257 + env/tcl/tcl8.6/tzdata/Asia/Novokuznetsk | 71 + env/tcl/tcl8.6/tzdata/Asia/Novosibirsk | 73 + env/tcl/tcl8.6/tzdata/Asia/Omsk | 71 + env/tcl/tcl8.6/tzdata/Asia/Oral | 58 + env/tcl/tcl8.6/tzdata/Asia/Phnom_Penh | 5 + env/tcl/tcl8.6/tzdata/Asia/Pontianak | 13 + env/tcl/tcl8.6/tzdata/Asia/Pyongyang | 10 + env/tcl/tcl8.6/tzdata/Asia/Qatar | 7 + env/tcl/tcl8.6/tzdata/Asia/Qyzylorda | 57 + env/tcl/tcl8.6/tzdata/Asia/Rangoon | 5 + env/tcl/tcl8.6/tzdata/Asia/Riyadh | 6 + env/tcl/tcl8.6/tzdata/Asia/Saigon | 5 + env/tcl/tcl8.6/tzdata/Asia/Sakhalin | 73 + env/tcl/tcl8.6/tzdata/Asia/Samarkand | 31 + env/tcl/tcl8.6/tzdata/Asia/Seoul | 26 + env/tcl/tcl8.6/tzdata/Asia/Shanghai | 32 + env/tcl/tcl8.6/tzdata/Asia/Singapore | 13 + env/tcl/tcl8.6/tzdata/Asia/Srednekolymsk | 71 + env/tcl/tcl8.6/tzdata/Asia/Taipei | 46 + env/tcl/tcl8.6/tzdata/Asia/Tashkent | 31 + env/tcl/tcl8.6/tzdata/Asia/Tbilisi | 60 + env/tcl/tcl8.6/tzdata/Asia/Tehran | 229 + env/tcl/tcl8.6/tzdata/Asia/Tel_Aviv | 5 + env/tcl/tcl8.6/tzdata/Asia/Thimbu | 5 + env/tcl/tcl8.6/tzdata/Asia/Thimphu | 7 + env/tcl/tcl8.6/tzdata/Asia/Tokyo | 14 + env/tcl/tcl8.6/tzdata/Asia/Tomsk | 73 + env/tcl/tcl8.6/tzdata/Asia/Ujung_Pandang | 5 + env/tcl/tcl8.6/tzdata/Asia/Ulaanbaatar | 55 + env/tcl/tcl8.6/tzdata/Asia/Ulan_Bator | 5 + env/tcl/tcl8.6/tzdata/Asia/Urumqi | 6 + env/tcl/tcl8.6/tzdata/Asia/Ust-Nera | 71 + env/tcl/tcl8.6/tzdata/Asia/Vientiane | 5 + env/tcl/tcl8.6/tzdata/Asia/Vladivostok | 71 + env/tcl/tcl8.6/tzdata/Asia/Yakutsk | 71 + env/tcl/tcl8.6/tzdata/Asia/Yangon | 9 + env/tcl/tcl8.6/tzdata/Asia/Yekaterinburg | 72 + env/tcl/tcl8.6/tzdata/Asia/Yerevan | 70 + env/tcl/tcl8.6/tzdata/Atlantic/Azores | 345 + env/tcl/tcl8.6/tzdata/Atlantic/Bermuda | 259 + env/tcl/tcl8.6/tzdata/Atlantic/Canary | 247 + env/tcl/tcl8.6/tzdata/Atlantic/Cape_Verde | 9 + env/tcl/tcl8.6/tzdata/Atlantic/Faeroe | 5 + env/tcl/tcl8.6/tzdata/Atlantic/Faroe | 245 + env/tcl/tcl8.6/tzdata/Atlantic/Jan_Mayen | 5 + env/tcl/tcl8.6/tzdata/Atlantic/Madeira | 346 + env/tcl/tcl8.6/tzdata/Atlantic/Reykjavik | 73 + env/tcl/tcl8.6/tzdata/Atlantic/South_Georgia | 6 + env/tcl/tcl8.6/tzdata/Atlantic/St_Helena | 5 + env/tcl/tcl8.6/tzdata/Atlantic/Stanley | 75 + env/tcl/tcl8.6/tzdata/Australia/ACT | 5 + env/tcl/tcl8.6/tzdata/Australia/Adelaide | 273 + env/tcl/tcl8.6/tzdata/Australia/Brisbane | 23 + env/tcl/tcl8.6/tzdata/Australia/Broken_Hill | 275 + env/tcl/tcl8.6/tzdata/Australia/Canberra | 5 + env/tcl/tcl8.6/tzdata/Australia/Currie | 273 + env/tcl/tcl8.6/tzdata/Australia/Darwin | 15 + env/tcl/tcl8.6/tzdata/Australia/Eucla | 25 + env/tcl/tcl8.6/tzdata/Australia/Hobart | 281 + env/tcl/tcl8.6/tzdata/Australia/LHI | 5 + env/tcl/tcl8.6/tzdata/Australia/Lindeman | 28 + env/tcl/tcl8.6/tzdata/Australia/Lord_Howe | 245 + env/tcl/tcl8.6/tzdata/Australia/Melbourne | 272 + env/tcl/tcl8.6/tzdata/Australia/NSW | 5 + env/tcl/tcl8.6/tzdata/Australia/North | 5 + env/tcl/tcl8.6/tzdata/Australia/Perth | 25 + env/tcl/tcl8.6/tzdata/Australia/Queensland | 5 + env/tcl/tcl8.6/tzdata/Australia/South | 5 + env/tcl/tcl8.6/tzdata/Australia/Sydney | 272 + env/tcl/tcl8.6/tzdata/Australia/Tasmania | 5 + env/tcl/tcl8.6/tzdata/Australia/Victoria | 5 + env/tcl/tcl8.6/tzdata/Australia/West | 5 + env/tcl/tcl8.6/tzdata/Australia/Yancowinna | 5 + env/tcl/tcl8.6/tzdata/Brazil/Acre | 5 + env/tcl/tcl8.6/tzdata/Brazil/DeNoronha | 5 + env/tcl/tcl8.6/tzdata/Brazil/East | 5 + env/tcl/tcl8.6/tzdata/Brazil/West | 5 + env/tcl/tcl8.6/tzdata/CET | 265 + env/tcl/tcl8.6/tzdata/CST6CDT | 278 + env/tcl/tcl8.6/tzdata/Canada/Atlantic | 5 + env/tcl/tcl8.6/tzdata/Canada/Central | 5 + .../tcl8.6/tzdata/Canada/East-Saskatchewan | 5 + env/tcl/tcl8.6/tzdata/Canada/Eastern | 5 + env/tcl/tcl8.6/tzdata/Canada/Mountain | 5 + env/tcl/tcl8.6/tzdata/Canada/Newfoundland | 5 + env/tcl/tcl8.6/tzdata/Canada/Pacific | 5 + env/tcl/tcl8.6/tzdata/Canada/Saskatchewan | 5 + env/tcl/tcl8.6/tzdata/Canada/Yukon | 5 + env/tcl/tcl8.6/tzdata/Chile/Continental | 5 + env/tcl/tcl8.6/tzdata/Chile/EasterIsland | 5 + env/tcl/tcl8.6/tzdata/Cuba | 5 + env/tcl/tcl8.6/tzdata/EET | 251 + env/tcl/tcl8.6/tzdata/EST | 5 + env/tcl/tcl8.6/tzdata/EST5EDT | 278 + env/tcl/tcl8.6/tzdata/Egypt | 5 + env/tcl/tcl8.6/tzdata/Eire | 5 + env/tcl/tcl8.6/tzdata/Etc/GMT | 5 + env/tcl/tcl8.6/tzdata/Etc/GMT+0 | 5 + env/tcl/tcl8.6/tzdata/Etc/GMT+1 | 5 + env/tcl/tcl8.6/tzdata/Etc/GMT+10 | 5 + env/tcl/tcl8.6/tzdata/Etc/GMT+11 | 5 + env/tcl/tcl8.6/tzdata/Etc/GMT+12 | 5 + env/tcl/tcl8.6/tzdata/Etc/GMT+2 | 5 + env/tcl/tcl8.6/tzdata/Etc/GMT+3 | 5 + env/tcl/tcl8.6/tzdata/Etc/GMT+4 | 5 + env/tcl/tcl8.6/tzdata/Etc/GMT+5 | 5 + env/tcl/tcl8.6/tzdata/Etc/GMT+6 | 5 + env/tcl/tcl8.6/tzdata/Etc/GMT+7 | 5 + env/tcl/tcl8.6/tzdata/Etc/GMT+8 | 5 + env/tcl/tcl8.6/tzdata/Etc/GMT+9 | 5 + env/tcl/tcl8.6/tzdata/Etc/GMT-0 | 5 + env/tcl/tcl8.6/tzdata/Etc/GMT-1 | 5 + env/tcl/tcl8.6/tzdata/Etc/GMT-10 | 5 + env/tcl/tcl8.6/tzdata/Etc/GMT-11 | 5 + env/tcl/tcl8.6/tzdata/Etc/GMT-12 | 5 + env/tcl/tcl8.6/tzdata/Etc/GMT-13 | 5 + env/tcl/tcl8.6/tzdata/Etc/GMT-14 | 5 + env/tcl/tcl8.6/tzdata/Etc/GMT-2 | 5 + env/tcl/tcl8.6/tzdata/Etc/GMT-3 | 5 + env/tcl/tcl8.6/tzdata/Etc/GMT-4 | 5 + env/tcl/tcl8.6/tzdata/Etc/GMT-5 | 5 + env/tcl/tcl8.6/tzdata/Etc/GMT-6 | 5 + env/tcl/tcl8.6/tzdata/Etc/GMT-7 | 5 + env/tcl/tcl8.6/tzdata/Etc/GMT-8 | 5 + env/tcl/tcl8.6/tzdata/Etc/GMT-9 | 5 + env/tcl/tcl8.6/tzdata/Etc/GMT0 | 5 + env/tcl/tcl8.6/tzdata/Etc/Greenwich | 5 + env/tcl/tcl8.6/tzdata/Etc/UCT | 5 + env/tcl/tcl8.6/tzdata/Etc/UTC | 5 + env/tcl/tcl8.6/tzdata/Etc/Universal | 5 + env/tcl/tcl8.6/tzdata/Etc/Zulu | 5 + env/tcl/tcl8.6/tzdata/Europe/Amsterdam | 310 + env/tcl/tcl8.6/tzdata/Europe/Andorra | 237 + env/tcl/tcl8.6/tzdata/Europe/Astrakhan | 71 + env/tcl/tcl8.6/tzdata/Europe/Athens | 268 + env/tcl/tcl8.6/tzdata/Europe/Belfast | 5 + env/tcl/tcl8.6/tzdata/Europe/Belgrade | 250 + env/tcl/tcl8.6/tzdata/Europe/Berlin | 274 + env/tcl/tcl8.6/tzdata/Europe/Bratislava | 5 + env/tcl/tcl8.6/tzdata/Europe/Brussels | 316 + env/tcl/tcl8.6/tzdata/Europe/Bucharest | 268 + env/tcl/tcl8.6/tzdata/Europe/Budapest | 282 + env/tcl/tcl8.6/tzdata/Europe/Busingen | 5 + env/tcl/tcl8.6/tzdata/Europe/Chisinau | 272 + env/tcl/tcl8.6/tzdata/Europe/Copenhagen | 264 + env/tcl/tcl8.6/tzdata/Europe/Dublin | 358 + env/tcl/tcl8.6/tzdata/Europe/Gibraltar | 328 + env/tcl/tcl8.6/tzdata/Europe/Guernsey | 5 + env/tcl/tcl8.6/tzdata/Europe/Helsinki | 248 + env/tcl/tcl8.6/tzdata/Europe/Isle_of_Man | 5 + env/tcl/tcl8.6/tzdata/Europe/Istanbul | 140 + env/tcl/tcl8.6/tzdata/Europe/Jersey | 5 + env/tcl/tcl8.6/tzdata/Europe/Kaliningrad | 85 + env/tcl/tcl8.6/tzdata/Europe/Kiev | 251 + env/tcl/tcl8.6/tzdata/Europe/Kirov | 70 + env/tcl/tcl8.6/tzdata/Europe/Lisbon | 351 + env/tcl/tcl8.6/tzdata/Europe/Ljubljana | 5 + env/tcl/tcl8.6/tzdata/Europe/London | 372 + env/tcl/tcl8.6/tzdata/Europe/Luxembourg | 313 + env/tcl/tcl8.6/tzdata/Europe/Madrid | 292 + env/tcl/tcl8.6/tzdata/Europe/Malta | 299 + env/tcl/tcl8.6/tzdata/Europe/Mariehamn | 5 + env/tcl/tcl8.6/tzdata/Europe/Minsk | 75 + env/tcl/tcl8.6/tzdata/Europe/Monaco | 315 + env/tcl/tcl8.6/tzdata/Europe/Moscow | 83 + env/tcl/tcl8.6/tzdata/Europe/Nicosia | 5 + env/tcl/tcl8.6/tzdata/Europe/Oslo | 271 + env/tcl/tcl8.6/tzdata/Europe/Paris | 314 + env/tcl/tcl8.6/tzdata/Europe/Podgorica | 5 + env/tcl/tcl8.6/tzdata/Europe/Prague | 275 + env/tcl/tcl8.6/tzdata/Europe/Riga | 258 + env/tcl/tcl8.6/tzdata/Europe/Rome | 302 + env/tcl/tcl8.6/tzdata/Europe/Samara | 73 + env/tcl/tcl8.6/tzdata/Europe/San_Marino | 5 + env/tcl/tcl8.6/tzdata/Europe/Sarajevo | 5 + env/tcl/tcl8.6/tzdata/Europe/Saratov | 71 + env/tcl/tcl8.6/tzdata/Europe/Simferopol | 82 + env/tcl/tcl8.6/tzdata/Europe/Skopje | 5 + env/tcl/tcl8.6/tzdata/Europe/Sofia | 258 + env/tcl/tcl8.6/tzdata/Europe/Stockholm | 250 + env/tcl/tcl8.6/tzdata/Europe/Tallinn | 254 + env/tcl/tcl8.6/tzdata/Europe/Tirane | 263 + env/tcl/tcl8.6/tzdata/Europe/Tiraspol | 5 + env/tcl/tcl8.6/tzdata/Europe/Ulyanovsk | 73 + env/tcl/tcl8.6/tzdata/Europe/Uzhgorod | 254 + env/tcl/tcl8.6/tzdata/Europe/Vaduz | 5 + env/tcl/tcl8.6/tzdata/Europe/Vatican | 5 + env/tcl/tcl8.6/tzdata/Europe/Vienna | 271 + env/tcl/tcl8.6/tzdata/Europe/Vilnius | 252 + env/tcl/tcl8.6/tzdata/Europe/Volgograd | 72 + env/tcl/tcl8.6/tzdata/Europe/Warsaw | 296 + env/tcl/tcl8.6/tzdata/Europe/Zagreb | 5 + env/tcl/tcl8.6/tzdata/Europe/Zaporozhye | 252 + env/tcl/tcl8.6/tzdata/Europe/Zurich | 250 + env/tcl/tcl8.6/tzdata/GB | 5 + env/tcl/tcl8.6/tzdata/GB-Eire | 5 + env/tcl/tcl8.6/tzdata/GMT | 5 + env/tcl/tcl8.6/tzdata/GMT+0 | 5 + env/tcl/tcl8.6/tzdata/GMT-0 | 5 + env/tcl/tcl8.6/tzdata/GMT0 | 5 + env/tcl/tcl8.6/tzdata/Greenwich | 5 + env/tcl/tcl8.6/tzdata/HST | 5 + env/tcl/tcl8.6/tzdata/Hongkong | 5 + env/tcl/tcl8.6/tzdata/Iceland | 5 + env/tcl/tcl8.6/tzdata/Indian/Antananarivo | 5 + env/tcl/tcl8.6/tzdata/Indian/Chagos | 7 + env/tcl/tcl8.6/tzdata/Indian/Christmas | 6 + env/tcl/tcl8.6/tzdata/Indian/Cocos | 6 + env/tcl/tcl8.6/tzdata/Indian/Comoro | 5 + env/tcl/tcl8.6/tzdata/Indian/Kerguelen | 6 + env/tcl/tcl8.6/tzdata/Indian/Mahe | 6 + env/tcl/tcl8.6/tzdata/Indian/Maldives | 7 + env/tcl/tcl8.6/tzdata/Indian/Mauritius | 10 + env/tcl/tcl8.6/tzdata/Indian/Mayotte | 5 + env/tcl/tcl8.6/tzdata/Indian/Reunion | 6 + env/tcl/tcl8.6/tzdata/Iran | 5 + env/tcl/tcl8.6/tzdata/Israel | 5 + env/tcl/tcl8.6/tzdata/Jamaica | 5 + env/tcl/tcl8.6/tzdata/Japan | 5 + env/tcl/tcl8.6/tzdata/Kwajalein | 5 + env/tcl/tcl8.6/tzdata/Libya | 5 + env/tcl/tcl8.6/tzdata/MET | 265 + env/tcl/tcl8.6/tzdata/MST | 5 + env/tcl/tcl8.6/tzdata/MST7MDT | 278 + env/tcl/tcl8.6/tzdata/Mexico/BajaNorte | 5 + env/tcl/tcl8.6/tzdata/Mexico/BajaSur | 5 + env/tcl/tcl8.6/tzdata/Mexico/General | 5 + env/tcl/tcl8.6/tzdata/NZ | 5 + env/tcl/tcl8.6/tzdata/NZ-CHAT | 5 + env/tcl/tcl8.6/tzdata/Navajo | 5 + env/tcl/tcl8.6/tzdata/PRC | 5 + env/tcl/tcl8.6/tzdata/PST8PDT | 278 + env/tcl/tcl8.6/tzdata/Pacific/Apia | 188 + env/tcl/tcl8.6/tzdata/Pacific/Auckland | 285 + env/tcl/tcl8.6/tzdata/Pacific/Bougainville | 10 + env/tcl/tcl8.6/tzdata/Pacific/Chatham | 258 + env/tcl/tcl8.6/tzdata/Pacific/Chuuk | 6 + env/tcl/tcl8.6/tzdata/Pacific/Easter | 268 + env/tcl/tcl8.6/tzdata/Pacific/Efate | 26 + env/tcl/tcl8.6/tzdata/Pacific/Enderbury | 8 + env/tcl/tcl8.6/tzdata/Pacific/Fakaofo | 7 + env/tcl/tcl8.6/tzdata/Pacific/Fiji | 191 + env/tcl/tcl8.6/tzdata/Pacific/Funafuti | 6 + env/tcl/tcl8.6/tzdata/Pacific/Galapagos | 9 + env/tcl/tcl8.6/tzdata/Pacific/Gambier | 6 + env/tcl/tcl8.6/tzdata/Pacific/Guadalcanal | 6 + env/tcl/tcl8.6/tzdata/Pacific/Guam | 8 + env/tcl/tcl8.6/tzdata/Pacific/Honolulu | 12 + env/tcl/tcl8.6/tzdata/Pacific/Johnston | 5 + env/tcl/tcl8.6/tzdata/Pacific/Kiritimati | 8 + env/tcl/tcl8.6/tzdata/Pacific/Kosrae | 8 + env/tcl/tcl8.6/tzdata/Pacific/Kwajalein | 8 + env/tcl/tcl8.6/tzdata/Pacific/Majuro | 7 + env/tcl/tcl8.6/tzdata/Pacific/Marquesas | 6 + env/tcl/tcl8.6/tzdata/Pacific/Midway | 5 + env/tcl/tcl8.6/tzdata/Pacific/Nauru | 9 + env/tcl/tcl8.6/tzdata/Pacific/Niue | 8 + env/tcl/tcl8.6/tzdata/Pacific/Norfolk | 10 + env/tcl/tcl8.6/tzdata/Pacific/Noumea | 12 + env/tcl/tcl8.6/tzdata/Pacific/Pago_Pago | 7 + env/tcl/tcl8.6/tzdata/Pacific/Palau | 6 + env/tcl/tcl8.6/tzdata/Pacific/Pitcairn | 7 + env/tcl/tcl8.6/tzdata/Pacific/Pohnpei | 6 + env/tcl/tcl8.6/tzdata/Pacific/Ponape | 5 + env/tcl/tcl8.6/tzdata/Pacific/Port_Moresby | 7 + env/tcl/tcl8.6/tzdata/Pacific/Rarotonga | 32 + env/tcl/tcl8.6/tzdata/Pacific/Saipan | 5 + env/tcl/tcl8.6/tzdata/Pacific/Samoa | 5 + env/tcl/tcl8.6/tzdata/Pacific/Tahiti | 6 + env/tcl/tcl8.6/tzdata/Pacific/Tarawa | 6 + env/tcl/tcl8.6/tzdata/Pacific/Tongatapu | 16 + env/tcl/tcl8.6/tzdata/Pacific/Truk | 5 + env/tcl/tcl8.6/tzdata/Pacific/Wake | 6 + env/tcl/tcl8.6/tzdata/Pacific/Wallis | 6 + env/tcl/tcl8.6/tzdata/Pacific/Yap | 5 + env/tcl/tcl8.6/tzdata/Poland | 5 + env/tcl/tcl8.6/tzdata/Portugal | 5 + env/tcl/tcl8.6/tzdata/ROC | 5 + env/tcl/tcl8.6/tzdata/ROK | 5 + env/tcl/tcl8.6/tzdata/Singapore | 5 + env/tcl/tcl8.6/tzdata/SystemV/AST4 | 5 + env/tcl/tcl8.6/tzdata/SystemV/AST4ADT | 5 + env/tcl/tcl8.6/tzdata/SystemV/CST6 | 5 + env/tcl/tcl8.6/tzdata/SystemV/CST6CDT | 5 + env/tcl/tcl8.6/tzdata/SystemV/EST5 | 5 + env/tcl/tcl8.6/tzdata/SystemV/EST5EDT | 5 + env/tcl/tcl8.6/tzdata/SystemV/HST10 | 5 + env/tcl/tcl8.6/tzdata/SystemV/MST7 | 5 + env/tcl/tcl8.6/tzdata/SystemV/MST7MDT | 5 + env/tcl/tcl8.6/tzdata/SystemV/PST8 | 5 + env/tcl/tcl8.6/tzdata/SystemV/PST8PDT | 5 + env/tcl/tcl8.6/tzdata/SystemV/YST9 | 5 + env/tcl/tcl8.6/tzdata/SystemV/YST9YDT | 5 + env/tcl/tcl8.6/tzdata/Turkey | 5 + env/tcl/tcl8.6/tzdata/UCT | 5 + env/tcl/tcl8.6/tzdata/US/Alaska | 5 + env/tcl/tcl8.6/tzdata/US/Aleutian | 5 + env/tcl/tcl8.6/tzdata/US/Arizona | 5 + env/tcl/tcl8.6/tzdata/US/Central | 5 + env/tcl/tcl8.6/tzdata/US/East-Indiana | 5 + env/tcl/tcl8.6/tzdata/US/Eastern | 5 + env/tcl/tcl8.6/tzdata/US/Hawaii | 5 + env/tcl/tcl8.6/tzdata/US/Indiana-Starke | 5 + env/tcl/tcl8.6/tzdata/US/Michigan | 5 + env/tcl/tcl8.6/tzdata/US/Mountain | 5 + env/tcl/tcl8.6/tzdata/US/Pacific | 5 + env/tcl/tcl8.6/tzdata/US/Pacific-New | 5 + env/tcl/tcl8.6/tzdata/US/Samoa | 5 + env/tcl/tcl8.6/tzdata/UTC | 5 + env/tcl/tcl8.6/tzdata/Universal | 5 + env/tcl/tcl8.6/tzdata/W-SU | 5 + env/tcl/tcl8.6/tzdata/WET | 251 + env/tcl/tcl8.6/tzdata/Zulu | 5 + env/tcl/tcl8.6/word.tcl | 152 + env/tcl/tk8.6/bgerror.tcl | 265 + env/tcl/tk8.6/button.tcl | 778 ++ env/tcl/tk8.6/choosedir.tcl | 308 + env/tcl/tk8.6/clrpick.tcl | 695 ++ env/tcl/tk8.6/comdlg.tcl | 319 + env/tcl/tk8.6/console.tcl | 1150 +++ env/tcl/tk8.6/demos/README | 44 + env/tcl/tk8.6/demos/anilabel.tcl | 160 + env/tcl/tk8.6/demos/aniwave.tcl | 104 + env/tcl/tk8.6/demos/arrow.tcl | 237 + env/tcl/tk8.6/demos/bind.tcl | 78 + env/tcl/tk8.6/demos/bitmap.tcl | 52 + env/tcl/tk8.6/demos/browse | 66 + env/tcl/tk8.6/demos/button.tcl | 47 + env/tcl/tk8.6/demos/check.tcl | 71 + env/tcl/tk8.6/demos/clrpick.tcl | 54 + env/tcl/tk8.6/demos/colors.tcl | 99 + env/tcl/tk8.6/demos/combo.tcl | 61 + env/tcl/tk8.6/demos/cscroll.tcl | 108 + env/tcl/tk8.6/demos/ctext.tcl | 172 + env/tcl/tk8.6/demos/dialog1.tcl | 13 + env/tcl/tk8.6/demos/dialog2.tcl | 17 + env/tcl/tk8.6/demos/en.msg | 97 + env/tcl/tk8.6/demos/entry1.tcl | 34 + env/tcl/tk8.6/demos/entry2.tcl | 46 + env/tcl/tk8.6/demos/entry3.tcl | 185 + env/tcl/tk8.6/demos/filebox.tcl | 81 + env/tcl/tk8.6/demos/floor.tcl | 1366 +++ env/tcl/tk8.6/demos/fontchoose.tcl | 69 + env/tcl/tk8.6/demos/form.tcl | 38 + env/tcl/tk8.6/demos/goldberg.tcl | 1833 ++++ env/tcl/tk8.6/demos/hello | 22 + env/tcl/tk8.6/demos/hscale.tcl | 45 + env/tcl/tk8.6/demos/icon.tcl | 51 + env/tcl/tk8.6/demos/image1.tcl | 35 + env/tcl/tk8.6/demos/image2.tcl | 108 + env/tcl/tk8.6/demos/images/earth.gif | Bin 0 -> 51712 bytes env/tcl/tk8.6/demos/images/earthmenu.png | Bin 0 -> 8157 bytes env/tcl/tk8.6/demos/images/earthris.gif | Bin 0 -> 6343 bytes env/tcl/tk8.6/demos/images/flagdown.xbm | 27 + env/tcl/tk8.6/demos/images/flagup.xbm | 27 + env/tcl/tk8.6/demos/images/gray25.xbm | 6 + env/tcl/tk8.6/demos/images/letters.xbm | 27 + env/tcl/tk8.6/demos/images/noletter.xbm | 27 + env/tcl/tk8.6/demos/images/ouster.png | Bin 0 -> 54257 bytes env/tcl/tk8.6/demos/images/pattern.xbm | 6 + env/tcl/tk8.6/demos/images/tcllogo.gif | Bin 0 -> 2341 bytes env/tcl/tk8.6/demos/images/teapot.ppm | 31 + env/tcl/tk8.6/demos/items.tcl | 291 + env/tcl/tk8.6/demos/ixset | 328 + env/tcl/tk8.6/demos/knightstour.tcl | 268 + env/tcl/tk8.6/demos/label.tcl | 40 + env/tcl/tk8.6/demos/labelframe.tcl | 76 + env/tcl/tk8.6/demos/license.terms | 40 + env/tcl/tk8.6/demos/mclist.tcl | 119 + env/tcl/tk8.6/demos/menu.tcl | 163 + env/tcl/tk8.6/demos/menubu.tcl | 90 + env/tcl/tk8.6/demos/msgbox.tcl | 62 + env/tcl/tk8.6/demos/nl.msg | 125 + env/tcl/tk8.6/demos/paned1.tcl | 32 + env/tcl/tk8.6/demos/paned2.tcl | 74 + env/tcl/tk8.6/demos/pendulum.tcl | 197 + env/tcl/tk8.6/demos/plot.tcl | 97 + env/tcl/tk8.6/demos/puzzle.tcl | 82 + env/tcl/tk8.6/demos/radio.tcl | 66 + env/tcl/tk8.6/demos/rmt | 210 + env/tcl/tk8.6/demos/rolodex | 204 + env/tcl/tk8.6/demos/ruler.tcl | 171 + env/tcl/tk8.6/demos/sayings.tcl | 44 + env/tcl/tk8.6/demos/search.tcl | 139 + env/tcl/tk8.6/demos/spin.tcl | 53 + env/tcl/tk8.6/demos/square | 60 + env/tcl/tk8.6/demos/states.tcl | 54 + env/tcl/tk8.6/demos/style.tcl | 155 + env/tcl/tk8.6/demos/tclIndex | 67 + env/tcl/tk8.6/demos/tcolor | 358 + env/tcl/tk8.6/demos/text.tcl | 111 + env/tcl/tk8.6/demos/textpeer.tcl | 62 + env/tcl/tk8.6/demos/timer | 47 + env/tcl/tk8.6/demos/toolbar.tcl | 92 + env/tcl/tk8.6/demos/tree.tcl | 88 + env/tcl/tk8.6/demos/ttkbut.tcl | 84 + env/tcl/tk8.6/demos/ttkmenu.tcl | 53 + env/tcl/tk8.6/demos/ttknote.tcl | 57 + env/tcl/tk8.6/demos/ttkpane.tcl | 112 + env/tcl/tk8.6/demos/ttkprogress.tcl | 46 + env/tcl/tk8.6/demos/ttkscale.tcl | 39 + env/tcl/tk8.6/demos/twind.tcl | 327 + env/tcl/tk8.6/demos/unicodeout.tcl | 137 + env/tcl/tk8.6/demos/vscale.tcl | 46 + env/tcl/tk8.6/demos/widget | 721 ++ env/tcl/tk8.6/dialog.tcl | 180 + env/tcl/tk8.6/entry.tcl | 654 ++ env/tcl/tk8.6/focus.tcl | 178 + env/tcl/tk8.6/fontchooser.tcl | 452 + env/tcl/tk8.6/iconlist.tcl | 696 ++ env/tcl/tk8.6/icons.tcl | 153 + env/tcl/tk8.6/images/README | 7 + env/tcl/tk8.6/images/logo.eps | 2091 +++++ env/tcl/tk8.6/images/logo100.gif | Bin 0 -> 2341 bytes env/tcl/tk8.6/images/logo64.gif | Bin 0 -> 1670 bytes env/tcl/tk8.6/images/logoLarge.gif | Bin 0 -> 11000 bytes env/tcl/tk8.6/images/logoMed.gif | Bin 0 -> 3889 bytes env/tcl/tk8.6/images/pwrdLogo.eps | 1897 ++++ env/tcl/tk8.6/images/pwrdLogo100.gif | Bin 0 -> 1615 bytes env/tcl/tk8.6/images/pwrdLogo150.gif | Bin 0 -> 2489 bytes env/tcl/tk8.6/images/pwrdLogo175.gif | Bin 0 -> 2981 bytes env/tcl/tk8.6/images/pwrdLogo200.gif | Bin 0 -> 3491 bytes env/tcl/tk8.6/images/pwrdLogo75.gif | Bin 0 -> 1171 bytes env/tcl/tk8.6/images/tai-ku.gif | Bin 0 -> 5473 bytes env/tcl/tk8.6/license.terms | 40 + env/tcl/tk8.6/listbox.tcl | 552 ++ env/tcl/tk8.6/megawidget.tcl | 297 + env/tcl/tk8.6/menu.tcl | 1356 +++ env/tcl/tk8.6/mkpsenc.tcl | 1488 +++ env/tcl/tk8.6/msgbox.tcl | 430 + env/tcl/tk8.6/msgs/cs.msg | 77 + env/tcl/tk8.6/msgs/da.msg | 78 + env/tcl/tk8.6/msgs/de.msg | 91 + env/tcl/tk8.6/msgs/el.msg | 86 + env/tcl/tk8.6/msgs/en.msg | 91 + env/tcl/tk8.6/msgs/en_gb.msg | 3 + env/tcl/tk8.6/msgs/eo.msg | 75 + env/tcl/tk8.6/msgs/es.msg | 76 + env/tcl/tk8.6/msgs/fr.msg | 72 + env/tcl/tk8.6/msgs/hu.msg | 78 + env/tcl/tk8.6/msgs/it.msg | 73 + env/tcl/tk8.6/msgs/nl.msg | 91 + env/tcl/tk8.6/msgs/pl.msg | 91 + env/tcl/tk8.6/msgs/pt.msg | 74 + env/tcl/tk8.6/msgs/ru.msg | 75 + env/tcl/tk8.6/msgs/sv.msg | 76 + env/tcl/tk8.6/obsolete.tcl | 178 + env/tcl/tk8.6/optMenu.tcl | 43 + env/tcl/tk8.6/palette.tcl | 244 + env/tcl/tk8.6/panedwindow.tcl | 194 + env/tcl/tk8.6/pkgIndex.tcl | 7 + env/tcl/tk8.6/safetk.tcl | 262 + env/tcl/tk8.6/scale.tcl | 290 + env/tcl/tk8.6/scrlbar.tcl | 454 + env/tcl/tk8.6/spinbox.tcl | 580 ++ env/tcl/tk8.6/tclIndex | 253 + env/tcl/tk8.6/tearoff.tcl | 180 + env/tcl/tk8.6/text.tcl | 1207 +++ env/tcl/tk8.6/tk.tcl | 695 ++ env/tcl/tk8.6/tkfbox.tcl | 1240 +++ env/tcl/tk8.6/ttk/altTheme.tcl | 111 + env/tcl/tk8.6/ttk/aquaTheme.tcl | 64 + env/tcl/tk8.6/ttk/button.tcl | 83 + env/tcl/tk8.6/ttk/clamTheme.tcl | 149 + env/tcl/tk8.6/ttk/classicTheme.tcl | 117 + env/tcl/tk8.6/ttk/combobox.tcl | 457 + env/tcl/tk8.6/ttk/cursors.tcl | 186 + env/tcl/tk8.6/ttk/defaults.tcl | 145 + env/tcl/tk8.6/ttk/entry.tcl | 607 ++ env/tcl/tk8.6/ttk/fonts.tcl | 157 + env/tcl/tk8.6/ttk/menubutton.tcl | 169 + env/tcl/tk8.6/ttk/notebook.tcl | 197 + env/tcl/tk8.6/ttk/panedwindow.tcl | 82 + env/tcl/tk8.6/ttk/progress.tcl | 49 + env/tcl/tk8.6/ttk/scale.tcl | 94 + env/tcl/tk8.6/ttk/scrollbar.tcl | 123 + env/tcl/tk8.6/ttk/sizegrip.tcl | 102 + env/tcl/tk8.6/ttk/spinbox.tcl | 173 + env/tcl/tk8.6/ttk/treeview.tcl | 363 + env/tcl/tk8.6/ttk/ttk.tcl | 176 + env/tcl/tk8.6/ttk/utils.tcl | 350 + env/tcl/tk8.6/ttk/vistaTheme.tcl | 231 + env/tcl/tk8.6/ttk/winTheme.tcl | 86 + env/tcl/tk8.6/ttk/xpTheme.tcl | 76 + env/tcl/tk8.6/unsupported.tcl | 269 + env/tcl/tk8.6/xmfbox.tcl | 989 ++ requirements.txt | 7 + runtime.txt | 1 + templates/index.html | 15 + templates/layout.html | 84 + 2655 files changed, 416386 insertions(+) create mode 100644 .gitignore create mode 100644 Procfile create mode 100644 README.md create mode 100644 __pycache__/app.cpython-37.pyc create mode 100644 app.py create mode 100644 env/Include/Python-ast.h create mode 100644 env/Include/Python.h create mode 100644 env/Include/abstract.h create mode 100644 env/Include/accu.h create mode 100644 env/Include/asdl.h create mode 100644 env/Include/ast.h create mode 100644 env/Include/bitset.h create mode 100644 env/Include/bltinmodule.h create mode 100644 env/Include/boolobject.h create mode 100644 env/Include/bytearrayobject.h create mode 100644 env/Include/bytes_methods.h create mode 100644 env/Include/bytesobject.h create mode 100644 env/Include/cellobject.h create mode 100644 env/Include/ceval.h create mode 100644 env/Include/classobject.h create mode 100644 env/Include/code.h create mode 100644 env/Include/codecs.h create mode 100644 env/Include/compile.h create mode 100644 env/Include/complexobject.h create mode 100644 env/Include/context.h create mode 100644 env/Include/datetime.h create mode 100644 env/Include/descrobject.h create mode 100644 env/Include/dictobject.h create mode 100644 env/Include/dtoa.h create mode 100644 env/Include/dynamic_annotations.h create mode 100644 env/Include/enumobject.h create mode 100644 env/Include/errcode.h create mode 100644 env/Include/eval.h create mode 100644 env/Include/fileobject.h create mode 100644 env/Include/fileutils.h create mode 100644 env/Include/floatobject.h create mode 100644 env/Include/frameobject.h create mode 100644 env/Include/funcobject.h create mode 100644 env/Include/genobject.h create mode 100644 env/Include/graminit.h create mode 100644 env/Include/grammar.h create mode 100644 env/Include/import.h create mode 100644 env/Include/internal/ceval.h create mode 100644 env/Include/internal/condvar.h create mode 100644 env/Include/internal/context.h create mode 100644 env/Include/internal/gil.h create mode 100644 env/Include/internal/hamt.h create mode 100644 env/Include/internal/hash.h create mode 100644 env/Include/internal/import.h create mode 100644 env/Include/internal/mem.h create mode 100644 env/Include/internal/pygetopt.h create mode 100644 env/Include/internal/pystate.h create mode 100644 env/Include/internal/warnings.h create mode 100644 env/Include/intrcheck.h create mode 100644 env/Include/iterobject.h create mode 100644 env/Include/listobject.h create mode 100644 env/Include/longintrepr.h create mode 100644 env/Include/longobject.h create mode 100644 env/Include/marshal.h create mode 100644 env/Include/memoryobject.h create mode 100644 env/Include/metagrammar.h create mode 100644 env/Include/methodobject.h create mode 100644 env/Include/modsupport.h create mode 100644 env/Include/moduleobject.h create mode 100644 env/Include/namespaceobject.h create mode 100644 env/Include/node.h create mode 100644 env/Include/object.h create mode 100644 env/Include/objimpl.h create mode 100644 env/Include/odictobject.h create mode 100644 env/Include/opcode.h create mode 100644 env/Include/osdefs.h create mode 100644 env/Include/osmodule.h create mode 100644 env/Include/parsetok.h create mode 100644 env/Include/patchlevel.h create mode 100644 env/Include/pgen.h create mode 100644 env/Include/pgenheaders.h create mode 100644 env/Include/py_curses.h create mode 100644 env/Include/pyarena.h create mode 100644 env/Include/pyatomic.h create mode 100644 env/Include/pycapsule.h create mode 100644 env/Include/pyconfig.h create mode 100644 env/Include/pyctype.h create mode 100644 env/Include/pydebug.h create mode 100644 env/Include/pydtrace.h create mode 100644 env/Include/pyerrors.h create mode 100644 env/Include/pyexpat.h create mode 100644 env/Include/pyfpe.h create mode 100644 env/Include/pyhash.h create mode 100644 env/Include/pylifecycle.h create mode 100644 env/Include/pymacconfig.h create mode 100644 env/Include/pymacro.h create mode 100644 env/Include/pymath.h create mode 100644 env/Include/pymem.h create mode 100644 env/Include/pyport.h create mode 100644 env/Include/pystate.h create mode 100644 env/Include/pystrcmp.h create mode 100644 env/Include/pystrhex.h create mode 100644 env/Include/pystrtod.h create mode 100644 env/Include/pythonrun.h create mode 100644 env/Include/pythread.h create mode 100644 env/Include/pytime.h create mode 100644 env/Include/rangeobject.h create mode 100644 env/Include/setobject.h create mode 100644 env/Include/sliceobject.h create mode 100644 env/Include/structmember.h create mode 100644 env/Include/structseq.h create mode 100644 env/Include/symtable.h create mode 100644 env/Include/sysmodule.h create mode 100644 env/Include/token.h create mode 100644 env/Include/traceback.h create mode 100644 env/Include/tupleobject.h create mode 100644 env/Include/typeslots.h create mode 100644 env/Include/ucnhash.h create mode 100644 env/Include/unicodeobject.h create mode 100644 env/Include/warnings.h create mode 100644 env/Include/weakrefobject.h create mode 100644 env/LICENSE.txt create mode 100644 env/Lib/__future__.py create mode 100644 env/Lib/__pycache__/__future__.cpython-37.pyc create mode 100644 env/Lib/__pycache__/_bootlocale.cpython-37.pyc create mode 100644 env/Lib/__pycache__/_collections_abc.cpython-37.pyc create mode 100644 env/Lib/__pycache__/_weakrefset.cpython-37.pyc create mode 100644 env/Lib/__pycache__/abc.cpython-37.pyc create mode 100644 env/Lib/__pycache__/base64.cpython-37.pyc create mode 100644 env/Lib/__pycache__/bisect.cpython-37.pyc create mode 100644 env/Lib/__pycache__/codecs.cpython-37.pyc create mode 100644 env/Lib/__pycache__/copy.cpython-37.pyc create mode 100644 env/Lib/__pycache__/copyreg.cpython-37.pyc create mode 100644 env/Lib/__pycache__/enum.cpython-37.pyc create mode 100644 env/Lib/__pycache__/fnmatch.cpython-37.pyc create mode 100644 env/Lib/__pycache__/functools.cpython-37.pyc create mode 100644 env/Lib/__pycache__/genericpath.cpython-37.pyc create mode 100644 env/Lib/__pycache__/hashlib.cpython-37.pyc create mode 100644 env/Lib/__pycache__/heapq.cpython-37.pyc create mode 100644 env/Lib/__pycache__/hmac.cpython-37.pyc create mode 100644 env/Lib/__pycache__/io.cpython-37.pyc create mode 100644 env/Lib/__pycache__/keyword.cpython-37.pyc create mode 100644 env/Lib/__pycache__/linecache.cpython-37.pyc create mode 100644 env/Lib/__pycache__/locale.cpython-37.pyc create mode 100644 env/Lib/__pycache__/ntpath.cpython-37.pyc create mode 100644 env/Lib/__pycache__/operator.cpython-37.pyc create mode 100644 env/Lib/__pycache__/os.cpython-37.pyc create mode 100644 env/Lib/__pycache__/posixpath.cpython-37.pyc create mode 100644 env/Lib/__pycache__/random.cpython-37.pyc create mode 100644 env/Lib/__pycache__/re.cpython-37.pyc create mode 100644 env/Lib/__pycache__/reprlib.cpython-37.pyc create mode 100644 env/Lib/__pycache__/shutil.cpython-37.pyc create mode 100644 env/Lib/__pycache__/site.cpython-37.pyc create mode 100644 env/Lib/__pycache__/sre_compile.cpython-37.pyc create mode 100644 env/Lib/__pycache__/sre_constants.cpython-37.pyc create mode 100644 env/Lib/__pycache__/sre_parse.cpython-37.pyc create mode 100644 env/Lib/__pycache__/stat.cpython-37.pyc create mode 100644 env/Lib/__pycache__/struct.cpython-37.pyc create mode 100644 env/Lib/__pycache__/tarfile.cpython-37.pyc create mode 100644 env/Lib/__pycache__/tempfile.cpython-37.pyc create mode 100644 env/Lib/__pycache__/token.cpython-37.pyc create mode 100644 env/Lib/__pycache__/tokenize.cpython-37.pyc create mode 100644 env/Lib/__pycache__/types.cpython-37.pyc create mode 100644 env/Lib/__pycache__/warnings.cpython-37.pyc create mode 100644 env/Lib/__pycache__/weakref.cpython-37.pyc create mode 100644 env/Lib/_bootlocale.py create mode 100644 env/Lib/_collections_abc.py create mode 100644 env/Lib/_dummy_thread.py create mode 100644 env/Lib/_weakrefset.py create mode 100644 env/Lib/abc.py create mode 100644 env/Lib/base64.py create mode 100644 env/Lib/bisect.py create mode 100644 env/Lib/codecs.py create mode 100644 env/Lib/collections/__init__.py create mode 100644 env/Lib/collections/__pycache__/__init__.cpython-37.pyc create mode 100644 env/Lib/collections/__pycache__/abc.cpython-37.pyc create mode 100644 env/Lib/collections/abc.py create mode 100644 env/Lib/copy.py create mode 100644 env/Lib/copyreg.py create mode 100644 env/Lib/distutils/__init__.py create mode 100644 env/Lib/distutils/__pycache__/__init__.cpython-37.pyc create mode 100644 env/Lib/distutils/distutils.cfg create mode 100644 env/Lib/encodings/__init__.py create mode 100644 env/Lib/encodings/__pycache__/__init__.cpython-37.pyc create mode 100644 env/Lib/encodings/__pycache__/aliases.cpython-37.pyc create mode 100644 env/Lib/encodings/__pycache__/ascii.cpython-37.pyc create mode 100644 env/Lib/encodings/__pycache__/big5.cpython-37.pyc create mode 100644 env/Lib/encodings/__pycache__/cp1252.cpython-37.pyc create mode 100644 env/Lib/encodings/__pycache__/cp437.cpython-37.pyc create mode 100644 env/Lib/encodings/__pycache__/hex_codec.cpython-37.pyc create mode 100644 env/Lib/encodings/__pycache__/idna.cpython-37.pyc create mode 100644 env/Lib/encodings/__pycache__/iso8859_5.cpython-37.pyc create mode 100644 env/Lib/encodings/__pycache__/latin_1.cpython-37.pyc create mode 100644 env/Lib/encodings/__pycache__/mbcs.cpython-37.pyc create mode 100644 env/Lib/encodings/__pycache__/raw_unicode_escape.cpython-37.pyc create mode 100644 env/Lib/encodings/__pycache__/unicode_escape.cpython-37.pyc create mode 100644 env/Lib/encodings/__pycache__/utf_16_be.cpython-37.pyc create mode 100644 env/Lib/encodings/__pycache__/utf_16_le.cpython-37.pyc create mode 100644 env/Lib/encodings/__pycache__/utf_8.cpython-37.pyc create mode 100644 env/Lib/encodings/aliases.py create mode 100644 env/Lib/encodings/ascii.py create mode 100644 env/Lib/encodings/base64_codec.py create mode 100644 env/Lib/encodings/big5.py create mode 100644 env/Lib/encodings/big5hkscs.py create mode 100644 env/Lib/encodings/bz2_codec.py create mode 100644 env/Lib/encodings/charmap.py create mode 100644 env/Lib/encodings/cp037.py create mode 100644 env/Lib/encodings/cp1006.py create mode 100644 env/Lib/encodings/cp1026.py create mode 100644 env/Lib/encodings/cp1125.py create mode 100644 env/Lib/encodings/cp1140.py create mode 100644 env/Lib/encodings/cp1250.py create mode 100644 env/Lib/encodings/cp1251.py create mode 100644 env/Lib/encodings/cp1252.py create mode 100644 env/Lib/encodings/cp1253.py create mode 100644 env/Lib/encodings/cp1254.py create mode 100644 env/Lib/encodings/cp1255.py create mode 100644 env/Lib/encodings/cp1256.py create mode 100644 env/Lib/encodings/cp1257.py create mode 100644 env/Lib/encodings/cp1258.py create mode 100644 env/Lib/encodings/cp273.py create mode 100644 env/Lib/encodings/cp424.py create mode 100644 env/Lib/encodings/cp437.py create mode 100644 env/Lib/encodings/cp500.py create mode 100644 env/Lib/encodings/cp65001.py create mode 100644 env/Lib/encodings/cp720.py create mode 100644 env/Lib/encodings/cp737.py create mode 100644 env/Lib/encodings/cp775.py create mode 100644 env/Lib/encodings/cp850.py create mode 100644 env/Lib/encodings/cp852.py create mode 100644 env/Lib/encodings/cp855.py create mode 100644 env/Lib/encodings/cp856.py create mode 100644 env/Lib/encodings/cp857.py create mode 100644 env/Lib/encodings/cp858.py create mode 100644 env/Lib/encodings/cp860.py create mode 100644 env/Lib/encodings/cp861.py create mode 100644 env/Lib/encodings/cp862.py create mode 100644 env/Lib/encodings/cp863.py create mode 100644 env/Lib/encodings/cp864.py create mode 100644 env/Lib/encodings/cp865.py create mode 100644 env/Lib/encodings/cp866.py create mode 100644 env/Lib/encodings/cp869.py create mode 100644 env/Lib/encodings/cp874.py create mode 100644 env/Lib/encodings/cp875.py create mode 100644 env/Lib/encodings/cp932.py create mode 100644 env/Lib/encodings/cp949.py create mode 100644 env/Lib/encodings/cp950.py create mode 100644 env/Lib/encodings/euc_jis_2004.py create mode 100644 env/Lib/encodings/euc_jisx0213.py create mode 100644 env/Lib/encodings/euc_jp.py create mode 100644 env/Lib/encodings/euc_kr.py create mode 100644 env/Lib/encodings/gb18030.py create mode 100644 env/Lib/encodings/gb2312.py create mode 100644 env/Lib/encodings/gbk.py create mode 100644 env/Lib/encodings/hex_codec.py create mode 100644 env/Lib/encodings/hp_roman8.py create mode 100644 env/Lib/encodings/hz.py create mode 100644 env/Lib/encodings/idna.py create mode 100644 env/Lib/encodings/iso2022_jp.py create mode 100644 env/Lib/encodings/iso2022_jp_1.py create mode 100644 env/Lib/encodings/iso2022_jp_2.py create mode 100644 env/Lib/encodings/iso2022_jp_2004.py create mode 100644 env/Lib/encodings/iso2022_jp_3.py create mode 100644 env/Lib/encodings/iso2022_jp_ext.py create mode 100644 env/Lib/encodings/iso2022_kr.py create mode 100644 env/Lib/encodings/iso8859_1.py create mode 100644 env/Lib/encodings/iso8859_10.py create mode 100644 env/Lib/encodings/iso8859_11.py create mode 100644 env/Lib/encodings/iso8859_13.py create mode 100644 env/Lib/encodings/iso8859_14.py create mode 100644 env/Lib/encodings/iso8859_15.py create mode 100644 env/Lib/encodings/iso8859_16.py create mode 100644 env/Lib/encodings/iso8859_2.py create mode 100644 env/Lib/encodings/iso8859_3.py create mode 100644 env/Lib/encodings/iso8859_4.py create mode 100644 env/Lib/encodings/iso8859_5.py create mode 100644 env/Lib/encodings/iso8859_6.py create mode 100644 env/Lib/encodings/iso8859_7.py create mode 100644 env/Lib/encodings/iso8859_8.py create mode 100644 env/Lib/encodings/iso8859_9.py create mode 100644 env/Lib/encodings/johab.py create mode 100644 env/Lib/encodings/koi8_r.py create mode 100644 env/Lib/encodings/koi8_t.py create mode 100644 env/Lib/encodings/koi8_u.py create mode 100644 env/Lib/encodings/kz1048.py create mode 100644 env/Lib/encodings/latin_1.py create mode 100644 env/Lib/encodings/mac_arabic.py create mode 100644 env/Lib/encodings/mac_centeuro.py create mode 100644 env/Lib/encodings/mac_croatian.py create mode 100644 env/Lib/encodings/mac_cyrillic.py create mode 100644 env/Lib/encodings/mac_farsi.py create mode 100644 env/Lib/encodings/mac_greek.py create mode 100644 env/Lib/encodings/mac_iceland.py create mode 100644 env/Lib/encodings/mac_latin2.py create mode 100644 env/Lib/encodings/mac_roman.py create mode 100644 env/Lib/encodings/mac_romanian.py create mode 100644 env/Lib/encodings/mac_turkish.py create mode 100644 env/Lib/encodings/mbcs.py create mode 100644 env/Lib/encodings/oem.py create mode 100644 env/Lib/encodings/palmos.py create mode 100644 env/Lib/encodings/ptcp154.py create mode 100644 env/Lib/encodings/punycode.py create mode 100644 env/Lib/encodings/quopri_codec.py create mode 100644 env/Lib/encodings/raw_unicode_escape.py create mode 100644 env/Lib/encodings/rot_13.py create mode 100644 env/Lib/encodings/shift_jis.py create mode 100644 env/Lib/encodings/shift_jis_2004.py create mode 100644 env/Lib/encodings/shift_jisx0213.py create mode 100644 env/Lib/encodings/tis_620.py create mode 100644 env/Lib/encodings/undefined.py create mode 100644 env/Lib/encodings/unicode_escape.py create mode 100644 env/Lib/encodings/unicode_internal.py create mode 100644 env/Lib/encodings/utf_16.py create mode 100644 env/Lib/encodings/utf_16_be.py create mode 100644 env/Lib/encodings/utf_16_le.py create mode 100644 env/Lib/encodings/utf_32.py create mode 100644 env/Lib/encodings/utf_32_be.py create mode 100644 env/Lib/encodings/utf_32_le.py create mode 100644 env/Lib/encodings/utf_7.py create mode 100644 env/Lib/encodings/utf_8.py create mode 100644 env/Lib/encodings/utf_8_sig.py create mode 100644 env/Lib/encodings/uu_codec.py create mode 100644 env/Lib/encodings/zlib_codec.py create mode 100644 env/Lib/enum.py create mode 100644 env/Lib/fnmatch.py create mode 100644 env/Lib/functools.py create mode 100644 env/Lib/genericpath.py create mode 100644 env/Lib/hashlib.py create mode 100644 env/Lib/heapq.py create mode 100644 env/Lib/hmac.py create mode 100644 env/Lib/imp.py create mode 100644 env/Lib/importlib/__init__.py create mode 100644 env/Lib/importlib/__pycache__/__init__.cpython-37.pyc create mode 100644 env/Lib/importlib/__pycache__/abc.cpython-37.pyc create mode 100644 env/Lib/importlib/__pycache__/machinery.cpython-37.pyc create mode 100644 env/Lib/importlib/__pycache__/util.cpython-37.pyc create mode 100644 env/Lib/importlib/_bootstrap.py create mode 100644 env/Lib/importlib/_bootstrap_external.py create mode 100644 env/Lib/importlib/abc.py create mode 100644 env/Lib/importlib/machinery.py create mode 100644 env/Lib/importlib/resources.py create mode 100644 env/Lib/importlib/util.py create mode 100644 env/Lib/io.py create mode 100644 env/Lib/keyword.py create mode 100644 env/Lib/linecache.py create mode 100644 env/Lib/locale.py create mode 100644 env/Lib/no-global-site-packages.txt create mode 100644 env/Lib/ntpath.py create mode 100644 env/Lib/operator.py create mode 100644 env/Lib/orig-prefix.txt create mode 100644 env/Lib/os.py create mode 100644 env/Lib/posixpath.py create mode 100644 env/Lib/random.py create mode 100644 env/Lib/re.py create mode 100644 env/Lib/reprlib.py create mode 100644 env/Lib/rlcompleter.py create mode 100644 env/Lib/shutil.py create mode 100644 env/Lib/site-packages/Click-7.0.dist-info/INSTALLER create mode 100644 env/Lib/site-packages/Click-7.0.dist-info/LICENSE.txt create mode 100644 env/Lib/site-packages/Click-7.0.dist-info/METADATA create mode 100644 env/Lib/site-packages/Click-7.0.dist-info/RECORD create mode 100644 env/Lib/site-packages/Click-7.0.dist-info/WHEEL create mode 100644 env/Lib/site-packages/Click-7.0.dist-info/top_level.txt create mode 100644 env/Lib/site-packages/Flask-1.1.1.dist-info/INSTALLER create mode 100644 env/Lib/site-packages/Flask-1.1.1.dist-info/LICENSE.rst create mode 100644 env/Lib/site-packages/Flask-1.1.1.dist-info/METADATA create mode 100644 env/Lib/site-packages/Flask-1.1.1.dist-info/RECORD create mode 100644 env/Lib/site-packages/Flask-1.1.1.dist-info/WHEEL create mode 100644 env/Lib/site-packages/Flask-1.1.1.dist-info/entry_points.txt create mode 100644 env/Lib/site-packages/Flask-1.1.1.dist-info/top_level.txt create mode 100644 env/Lib/site-packages/Jinja2-2.10.3.dist-info/INSTALLER create mode 100644 env/Lib/site-packages/Jinja2-2.10.3.dist-info/LICENSE.rst create mode 100644 env/Lib/site-packages/Jinja2-2.10.3.dist-info/METADATA create mode 100644 env/Lib/site-packages/Jinja2-2.10.3.dist-info/RECORD create mode 100644 env/Lib/site-packages/Jinja2-2.10.3.dist-info/WHEEL create mode 100644 env/Lib/site-packages/Jinja2-2.10.3.dist-info/entry_points.txt create mode 100644 env/Lib/site-packages/Jinja2-2.10.3.dist-info/top_level.txt create mode 100644 env/Lib/site-packages/MarkupSafe-1.1.1.dist-info/INSTALLER create mode 100644 env/Lib/site-packages/MarkupSafe-1.1.1.dist-info/LICENSE.rst create mode 100644 env/Lib/site-packages/MarkupSafe-1.1.1.dist-info/METADATA create mode 100644 env/Lib/site-packages/MarkupSafe-1.1.1.dist-info/RECORD create mode 100644 env/Lib/site-packages/MarkupSafe-1.1.1.dist-info/WHEEL create mode 100644 env/Lib/site-packages/MarkupSafe-1.1.1.dist-info/top_level.txt create mode 100644 env/Lib/site-packages/Werkzeug-0.16.0.dist-info/INSTALLER create mode 100644 env/Lib/site-packages/Werkzeug-0.16.0.dist-info/LICENSE.rst create mode 100644 env/Lib/site-packages/Werkzeug-0.16.0.dist-info/METADATA create mode 100644 env/Lib/site-packages/Werkzeug-0.16.0.dist-info/RECORD create mode 100644 env/Lib/site-packages/Werkzeug-0.16.0.dist-info/WHEEL create mode 100644 env/Lib/site-packages/Werkzeug-0.16.0.dist-info/top_level.txt create mode 100644 env/Lib/site-packages/__pycache__/easy_install.cpython-37.pyc create mode 100644 env/Lib/site-packages/click/__init__.py create mode 100644 env/Lib/site-packages/click/__pycache__/__init__.cpython-37.pyc create mode 100644 env/Lib/site-packages/click/__pycache__/_bashcomplete.cpython-37.pyc create mode 100644 env/Lib/site-packages/click/__pycache__/_compat.cpython-37.pyc create mode 100644 env/Lib/site-packages/click/__pycache__/_termui_impl.cpython-37.pyc create mode 100644 env/Lib/site-packages/click/__pycache__/_textwrap.cpython-37.pyc create mode 100644 env/Lib/site-packages/click/__pycache__/_unicodefun.cpython-37.pyc create mode 100644 env/Lib/site-packages/click/__pycache__/_winconsole.cpython-37.pyc create mode 100644 env/Lib/site-packages/click/__pycache__/core.cpython-37.pyc create mode 100644 env/Lib/site-packages/click/__pycache__/decorators.cpython-37.pyc create mode 100644 env/Lib/site-packages/click/__pycache__/exceptions.cpython-37.pyc create mode 100644 env/Lib/site-packages/click/__pycache__/formatting.cpython-37.pyc create mode 100644 env/Lib/site-packages/click/__pycache__/globals.cpython-37.pyc create mode 100644 env/Lib/site-packages/click/__pycache__/parser.cpython-37.pyc create mode 100644 env/Lib/site-packages/click/__pycache__/termui.cpython-37.pyc create mode 100644 env/Lib/site-packages/click/__pycache__/testing.cpython-37.pyc create mode 100644 env/Lib/site-packages/click/__pycache__/types.cpython-37.pyc create mode 100644 env/Lib/site-packages/click/__pycache__/utils.cpython-37.pyc create mode 100644 env/Lib/site-packages/click/_bashcomplete.py create mode 100644 env/Lib/site-packages/click/_compat.py create mode 100644 env/Lib/site-packages/click/_termui_impl.py create mode 100644 env/Lib/site-packages/click/_textwrap.py create mode 100644 env/Lib/site-packages/click/_unicodefun.py create mode 100644 env/Lib/site-packages/click/_winconsole.py create mode 100644 env/Lib/site-packages/click/core.py create mode 100644 env/Lib/site-packages/click/decorators.py create mode 100644 env/Lib/site-packages/click/exceptions.py create mode 100644 env/Lib/site-packages/click/formatting.py create mode 100644 env/Lib/site-packages/click/globals.py create mode 100644 env/Lib/site-packages/click/parser.py create mode 100644 env/Lib/site-packages/click/termui.py create mode 100644 env/Lib/site-packages/click/testing.py create mode 100644 env/Lib/site-packages/click/types.py create mode 100644 env/Lib/site-packages/click/utils.py create mode 100644 env/Lib/site-packages/easy_install.py create mode 100644 env/Lib/site-packages/flask/__init__.py create mode 100644 env/Lib/site-packages/flask/__main__.py create mode 100644 env/Lib/site-packages/flask/__pycache__/__init__.cpython-37.pyc create mode 100644 env/Lib/site-packages/flask/__pycache__/__main__.cpython-37.pyc create mode 100644 env/Lib/site-packages/flask/__pycache__/_compat.cpython-37.pyc create mode 100644 env/Lib/site-packages/flask/__pycache__/app.cpython-37.pyc create mode 100644 env/Lib/site-packages/flask/__pycache__/blueprints.cpython-37.pyc create mode 100644 env/Lib/site-packages/flask/__pycache__/cli.cpython-37.pyc create mode 100644 env/Lib/site-packages/flask/__pycache__/config.cpython-37.pyc create mode 100644 env/Lib/site-packages/flask/__pycache__/ctx.cpython-37.pyc create mode 100644 env/Lib/site-packages/flask/__pycache__/debughelpers.cpython-37.pyc create mode 100644 env/Lib/site-packages/flask/__pycache__/globals.cpython-37.pyc create mode 100644 env/Lib/site-packages/flask/__pycache__/helpers.cpython-37.pyc create mode 100644 env/Lib/site-packages/flask/__pycache__/logging.cpython-37.pyc create mode 100644 env/Lib/site-packages/flask/__pycache__/sessions.cpython-37.pyc create mode 100644 env/Lib/site-packages/flask/__pycache__/signals.cpython-37.pyc create mode 100644 env/Lib/site-packages/flask/__pycache__/templating.cpython-37.pyc create mode 100644 env/Lib/site-packages/flask/__pycache__/testing.cpython-37.pyc create mode 100644 env/Lib/site-packages/flask/__pycache__/views.cpython-37.pyc create mode 100644 env/Lib/site-packages/flask/__pycache__/wrappers.cpython-37.pyc create mode 100644 env/Lib/site-packages/flask/_compat.py create mode 100644 env/Lib/site-packages/flask/app.py create mode 100644 env/Lib/site-packages/flask/blueprints.py create mode 100644 env/Lib/site-packages/flask/cli.py create mode 100644 env/Lib/site-packages/flask/config.py create mode 100644 env/Lib/site-packages/flask/ctx.py create mode 100644 env/Lib/site-packages/flask/debughelpers.py create mode 100644 env/Lib/site-packages/flask/globals.py create mode 100644 env/Lib/site-packages/flask/helpers.py create mode 100644 env/Lib/site-packages/flask/json/__init__.py create mode 100644 env/Lib/site-packages/flask/json/__pycache__/__init__.cpython-37.pyc create mode 100644 env/Lib/site-packages/flask/json/__pycache__/tag.cpython-37.pyc create mode 100644 env/Lib/site-packages/flask/json/tag.py create mode 100644 env/Lib/site-packages/flask/logging.py create mode 100644 env/Lib/site-packages/flask/sessions.py create mode 100644 env/Lib/site-packages/flask/signals.py create mode 100644 env/Lib/site-packages/flask/templating.py create mode 100644 env/Lib/site-packages/flask/testing.py create mode 100644 env/Lib/site-packages/flask/views.py create mode 100644 env/Lib/site-packages/flask/wrappers.py create mode 100644 env/Lib/site-packages/gunicorn-20.0.4.dist-info/INSTALLER create mode 100644 env/Lib/site-packages/gunicorn-20.0.4.dist-info/LICENSE create mode 100644 env/Lib/site-packages/gunicorn-20.0.4.dist-info/METADATA create mode 100644 env/Lib/site-packages/gunicorn-20.0.4.dist-info/RECORD create mode 100644 env/Lib/site-packages/gunicorn-20.0.4.dist-info/WHEEL create mode 100644 env/Lib/site-packages/gunicorn-20.0.4.dist-info/entry_points.txt create mode 100644 env/Lib/site-packages/gunicorn-20.0.4.dist-info/top_level.txt create mode 100644 env/Lib/site-packages/gunicorn/__init__.py create mode 100644 env/Lib/site-packages/gunicorn/__pycache__/__init__.cpython-37.pyc create mode 100644 env/Lib/site-packages/gunicorn/__pycache__/arbiter.cpython-37.pyc create mode 100644 env/Lib/site-packages/gunicorn/__pycache__/config.cpython-37.pyc create mode 100644 env/Lib/site-packages/gunicorn/__pycache__/debug.cpython-37.pyc create mode 100644 env/Lib/site-packages/gunicorn/__pycache__/errors.cpython-37.pyc create mode 100644 env/Lib/site-packages/gunicorn/__pycache__/glogging.cpython-37.pyc create mode 100644 env/Lib/site-packages/gunicorn/__pycache__/pidfile.cpython-37.pyc create mode 100644 env/Lib/site-packages/gunicorn/__pycache__/reloader.cpython-37.pyc create mode 100644 env/Lib/site-packages/gunicorn/__pycache__/sock.cpython-37.pyc create mode 100644 env/Lib/site-packages/gunicorn/__pycache__/systemd.cpython-37.pyc create mode 100644 env/Lib/site-packages/gunicorn/__pycache__/util.cpython-37.pyc create mode 100644 env/Lib/site-packages/gunicorn/app/__init__.py create mode 100644 env/Lib/site-packages/gunicorn/app/__pycache__/__init__.cpython-37.pyc create mode 100644 env/Lib/site-packages/gunicorn/app/__pycache__/base.cpython-37.pyc create mode 100644 env/Lib/site-packages/gunicorn/app/__pycache__/pasterapp.cpython-37.pyc create mode 100644 env/Lib/site-packages/gunicorn/app/__pycache__/wsgiapp.cpython-37.pyc create mode 100644 env/Lib/site-packages/gunicorn/app/base.py create mode 100644 env/Lib/site-packages/gunicorn/app/pasterapp.py create mode 100644 env/Lib/site-packages/gunicorn/app/wsgiapp.py create mode 100644 env/Lib/site-packages/gunicorn/arbiter.py create mode 100644 env/Lib/site-packages/gunicorn/config.py create mode 100644 env/Lib/site-packages/gunicorn/debug.py create mode 100644 env/Lib/site-packages/gunicorn/errors.py create mode 100644 env/Lib/site-packages/gunicorn/glogging.py create mode 100644 env/Lib/site-packages/gunicorn/http/__init__.py create mode 100644 env/Lib/site-packages/gunicorn/http/__pycache__/__init__.cpython-37.pyc create mode 100644 env/Lib/site-packages/gunicorn/http/__pycache__/body.cpython-37.pyc create mode 100644 env/Lib/site-packages/gunicorn/http/__pycache__/errors.cpython-37.pyc create mode 100644 env/Lib/site-packages/gunicorn/http/__pycache__/message.cpython-37.pyc create mode 100644 env/Lib/site-packages/gunicorn/http/__pycache__/parser.cpython-37.pyc create mode 100644 env/Lib/site-packages/gunicorn/http/__pycache__/unreader.cpython-37.pyc create mode 100644 env/Lib/site-packages/gunicorn/http/__pycache__/wsgi.cpython-37.pyc create mode 100644 env/Lib/site-packages/gunicorn/http/body.py create mode 100644 env/Lib/site-packages/gunicorn/http/errors.py create mode 100644 env/Lib/site-packages/gunicorn/http/message.py create mode 100644 env/Lib/site-packages/gunicorn/http/parser.py create mode 100644 env/Lib/site-packages/gunicorn/http/unreader.py create mode 100644 env/Lib/site-packages/gunicorn/http/wsgi.py create mode 100644 env/Lib/site-packages/gunicorn/instrument/__init__.py create mode 100644 env/Lib/site-packages/gunicorn/instrument/__pycache__/__init__.cpython-37.pyc create mode 100644 env/Lib/site-packages/gunicorn/instrument/__pycache__/statsd.cpython-37.pyc create mode 100644 env/Lib/site-packages/gunicorn/instrument/statsd.py create mode 100644 env/Lib/site-packages/gunicorn/pidfile.py create mode 100644 env/Lib/site-packages/gunicorn/reloader.py create mode 100644 env/Lib/site-packages/gunicorn/sock.py create mode 100644 env/Lib/site-packages/gunicorn/systemd.py create mode 100644 env/Lib/site-packages/gunicorn/util.py create mode 100644 env/Lib/site-packages/gunicorn/workers/__init__.py create mode 100644 env/Lib/site-packages/gunicorn/workers/__pycache__/__init__.cpython-37.pyc create mode 100644 env/Lib/site-packages/gunicorn/workers/__pycache__/base.cpython-37.pyc create mode 100644 env/Lib/site-packages/gunicorn/workers/__pycache__/base_async.cpython-37.pyc create mode 100644 env/Lib/site-packages/gunicorn/workers/__pycache__/geventlet.cpython-37.pyc create mode 100644 env/Lib/site-packages/gunicorn/workers/__pycache__/ggevent.cpython-37.pyc create mode 100644 env/Lib/site-packages/gunicorn/workers/__pycache__/gthread.cpython-37.pyc create mode 100644 env/Lib/site-packages/gunicorn/workers/__pycache__/gtornado.cpython-37.pyc create mode 100644 env/Lib/site-packages/gunicorn/workers/__pycache__/sync.cpython-37.pyc create mode 100644 env/Lib/site-packages/gunicorn/workers/__pycache__/workertmp.cpython-37.pyc create mode 100644 env/Lib/site-packages/gunicorn/workers/base.py create mode 100644 env/Lib/site-packages/gunicorn/workers/base_async.py create mode 100644 env/Lib/site-packages/gunicorn/workers/geventlet.py create mode 100644 env/Lib/site-packages/gunicorn/workers/ggevent.py create mode 100644 env/Lib/site-packages/gunicorn/workers/gthread.py create mode 100644 env/Lib/site-packages/gunicorn/workers/gtornado.py create mode 100644 env/Lib/site-packages/gunicorn/workers/sync.py create mode 100644 env/Lib/site-packages/gunicorn/workers/workertmp.py create mode 100644 env/Lib/site-packages/itsdangerous-1.1.0.dist-info/INSTALLER create mode 100644 env/Lib/site-packages/itsdangerous-1.1.0.dist-info/LICENSE.rst create mode 100644 env/Lib/site-packages/itsdangerous-1.1.0.dist-info/METADATA create mode 100644 env/Lib/site-packages/itsdangerous-1.1.0.dist-info/RECORD create mode 100644 env/Lib/site-packages/itsdangerous-1.1.0.dist-info/WHEEL create mode 100644 env/Lib/site-packages/itsdangerous-1.1.0.dist-info/top_level.txt create mode 100644 env/Lib/site-packages/itsdangerous/__init__.py create mode 100644 env/Lib/site-packages/itsdangerous/__pycache__/__init__.cpython-37.pyc create mode 100644 env/Lib/site-packages/itsdangerous/__pycache__/_compat.cpython-37.pyc create mode 100644 env/Lib/site-packages/itsdangerous/__pycache__/_json.cpython-37.pyc create mode 100644 env/Lib/site-packages/itsdangerous/__pycache__/encoding.cpython-37.pyc create mode 100644 env/Lib/site-packages/itsdangerous/__pycache__/exc.cpython-37.pyc create mode 100644 env/Lib/site-packages/itsdangerous/__pycache__/jws.cpython-37.pyc create mode 100644 env/Lib/site-packages/itsdangerous/__pycache__/serializer.cpython-37.pyc create mode 100644 env/Lib/site-packages/itsdangerous/__pycache__/signer.cpython-37.pyc create mode 100644 env/Lib/site-packages/itsdangerous/__pycache__/timed.cpython-37.pyc create mode 100644 env/Lib/site-packages/itsdangerous/__pycache__/url_safe.cpython-37.pyc create mode 100644 env/Lib/site-packages/itsdangerous/_compat.py create mode 100644 env/Lib/site-packages/itsdangerous/_json.py create mode 100644 env/Lib/site-packages/itsdangerous/encoding.py create mode 100644 env/Lib/site-packages/itsdangerous/exc.py create mode 100644 env/Lib/site-packages/itsdangerous/jws.py create mode 100644 env/Lib/site-packages/itsdangerous/serializer.py create mode 100644 env/Lib/site-packages/itsdangerous/signer.py create mode 100644 env/Lib/site-packages/itsdangerous/timed.py create mode 100644 env/Lib/site-packages/itsdangerous/url_safe.py create mode 100644 env/Lib/site-packages/jinja2/__init__.py create mode 100644 env/Lib/site-packages/jinja2/__pycache__/__init__.cpython-37.pyc create mode 100644 env/Lib/site-packages/jinja2/__pycache__/_compat.cpython-37.pyc create mode 100644 env/Lib/site-packages/jinja2/__pycache__/_identifier.cpython-37.pyc create mode 100644 env/Lib/site-packages/jinja2/__pycache__/asyncfilters.cpython-37.pyc create mode 100644 env/Lib/site-packages/jinja2/__pycache__/asyncsupport.cpython-37.pyc create mode 100644 env/Lib/site-packages/jinja2/__pycache__/bccache.cpython-37.pyc create mode 100644 env/Lib/site-packages/jinja2/__pycache__/compiler.cpython-37.pyc create mode 100644 env/Lib/site-packages/jinja2/__pycache__/constants.cpython-37.pyc create mode 100644 env/Lib/site-packages/jinja2/__pycache__/debug.cpython-37.pyc create mode 100644 env/Lib/site-packages/jinja2/__pycache__/defaults.cpython-37.pyc create mode 100644 env/Lib/site-packages/jinja2/__pycache__/environment.cpython-37.pyc create mode 100644 env/Lib/site-packages/jinja2/__pycache__/exceptions.cpython-37.pyc create mode 100644 env/Lib/site-packages/jinja2/__pycache__/ext.cpython-37.pyc create mode 100644 env/Lib/site-packages/jinja2/__pycache__/filters.cpython-37.pyc create mode 100644 env/Lib/site-packages/jinja2/__pycache__/idtracking.cpython-37.pyc create mode 100644 env/Lib/site-packages/jinja2/__pycache__/lexer.cpython-37.pyc create mode 100644 env/Lib/site-packages/jinja2/__pycache__/loaders.cpython-37.pyc create mode 100644 env/Lib/site-packages/jinja2/__pycache__/meta.cpython-37.pyc create mode 100644 env/Lib/site-packages/jinja2/__pycache__/nativetypes.cpython-37.pyc create mode 100644 env/Lib/site-packages/jinja2/__pycache__/nodes.cpython-37.pyc create mode 100644 env/Lib/site-packages/jinja2/__pycache__/optimizer.cpython-37.pyc create mode 100644 env/Lib/site-packages/jinja2/__pycache__/parser.cpython-37.pyc create mode 100644 env/Lib/site-packages/jinja2/__pycache__/runtime.cpython-37.pyc create mode 100644 env/Lib/site-packages/jinja2/__pycache__/sandbox.cpython-37.pyc create mode 100644 env/Lib/site-packages/jinja2/__pycache__/tests.cpython-37.pyc create mode 100644 env/Lib/site-packages/jinja2/__pycache__/utils.cpython-37.pyc create mode 100644 env/Lib/site-packages/jinja2/__pycache__/visitor.cpython-37.pyc create mode 100644 env/Lib/site-packages/jinja2/_compat.py create mode 100644 env/Lib/site-packages/jinja2/_identifier.py create mode 100644 env/Lib/site-packages/jinja2/asyncfilters.py create mode 100644 env/Lib/site-packages/jinja2/asyncsupport.py create mode 100644 env/Lib/site-packages/jinja2/bccache.py create mode 100644 env/Lib/site-packages/jinja2/compiler.py create mode 100644 env/Lib/site-packages/jinja2/constants.py create mode 100644 env/Lib/site-packages/jinja2/debug.py create mode 100644 env/Lib/site-packages/jinja2/defaults.py create mode 100644 env/Lib/site-packages/jinja2/environment.py create mode 100644 env/Lib/site-packages/jinja2/exceptions.py create mode 100644 env/Lib/site-packages/jinja2/ext.py create mode 100644 env/Lib/site-packages/jinja2/filters.py create mode 100644 env/Lib/site-packages/jinja2/idtracking.py create mode 100644 env/Lib/site-packages/jinja2/lexer.py create mode 100644 env/Lib/site-packages/jinja2/loaders.py create mode 100644 env/Lib/site-packages/jinja2/meta.py create mode 100644 env/Lib/site-packages/jinja2/nativetypes.py create mode 100644 env/Lib/site-packages/jinja2/nodes.py create mode 100644 env/Lib/site-packages/jinja2/optimizer.py create mode 100644 env/Lib/site-packages/jinja2/parser.py create mode 100644 env/Lib/site-packages/jinja2/runtime.py create mode 100644 env/Lib/site-packages/jinja2/sandbox.py create mode 100644 env/Lib/site-packages/jinja2/tests.py create mode 100644 env/Lib/site-packages/jinja2/utils.py create mode 100644 env/Lib/site-packages/jinja2/visitor.py create mode 100644 env/Lib/site-packages/markupsafe/__init__.py create mode 100644 env/Lib/site-packages/markupsafe/__pycache__/__init__.cpython-37.pyc create mode 100644 env/Lib/site-packages/markupsafe/__pycache__/_compat.cpython-37.pyc create mode 100644 env/Lib/site-packages/markupsafe/__pycache__/_constants.cpython-37.pyc create mode 100644 env/Lib/site-packages/markupsafe/__pycache__/_native.cpython-37.pyc create mode 100644 env/Lib/site-packages/markupsafe/_compat.py create mode 100644 env/Lib/site-packages/markupsafe/_constants.py create mode 100644 env/Lib/site-packages/markupsafe/_native.py create mode 100644 env/Lib/site-packages/markupsafe/_speedups.cp37-win_amd64.pyd create mode 100644 env/Lib/site-packages/pip-19.3.1.dist-info/INSTALLER create mode 100644 env/Lib/site-packages/pip-19.3.1.dist-info/LICENSE.txt create mode 100644 env/Lib/site-packages/pip-19.3.1.dist-info/METADATA create mode 100644 env/Lib/site-packages/pip-19.3.1.dist-info/RECORD create mode 100644 env/Lib/site-packages/pip-19.3.1.dist-info/WHEEL create mode 100644 env/Lib/site-packages/pip-19.3.1.dist-info/entry_points.txt create mode 100644 env/Lib/site-packages/pip-19.3.1.dist-info/top_level.txt create mode 100644 env/Lib/site-packages/pip/__init__.py create mode 100644 env/Lib/site-packages/pip/__main__.py create mode 100644 env/Lib/site-packages/pip/__pycache__/__init__.cpython-37.pyc create mode 100644 env/Lib/site-packages/pip/__pycache__/__main__.cpython-37.pyc create mode 100644 env/Lib/site-packages/pip/_internal/__init__.py create mode 100644 env/Lib/site-packages/pip/_internal/__pycache__/__init__.cpython-37.pyc create mode 100644 env/Lib/site-packages/pip/_internal/__pycache__/build_env.cpython-37.pyc create mode 100644 env/Lib/site-packages/pip/_internal/__pycache__/cache.cpython-37.pyc create mode 100644 env/Lib/site-packages/pip/_internal/__pycache__/collector.cpython-37.pyc create mode 100644 env/Lib/site-packages/pip/_internal/__pycache__/configuration.cpython-37.pyc create mode 100644 env/Lib/site-packages/pip/_internal/__pycache__/download.cpython-37.pyc create mode 100644 env/Lib/site-packages/pip/_internal/__pycache__/exceptions.cpython-37.pyc create mode 100644 env/Lib/site-packages/pip/_internal/__pycache__/index.cpython-37.pyc create mode 100644 env/Lib/site-packages/pip/_internal/__pycache__/legacy_resolve.cpython-37.pyc create mode 100644 env/Lib/site-packages/pip/_internal/__pycache__/locations.cpython-37.pyc create mode 100644 env/Lib/site-packages/pip/_internal/__pycache__/main.cpython-37.pyc create mode 100644 env/Lib/site-packages/pip/_internal/__pycache__/pep425tags.cpython-37.pyc create mode 100644 env/Lib/site-packages/pip/_internal/__pycache__/pyproject.cpython-37.pyc create mode 100644 env/Lib/site-packages/pip/_internal/__pycache__/self_outdated_check.cpython-37.pyc create mode 100644 env/Lib/site-packages/pip/_internal/__pycache__/wheel.cpython-37.pyc create mode 100644 env/Lib/site-packages/pip/_internal/build_env.py create mode 100644 env/Lib/site-packages/pip/_internal/cache.py create mode 100644 env/Lib/site-packages/pip/_internal/cli/__init__.py create mode 100644 env/Lib/site-packages/pip/_internal/cli/__pycache__/__init__.cpython-37.pyc create mode 100644 env/Lib/site-packages/pip/_internal/cli/__pycache__/autocompletion.cpython-37.pyc create mode 100644 env/Lib/site-packages/pip/_internal/cli/__pycache__/base_command.cpython-37.pyc create mode 100644 env/Lib/site-packages/pip/_internal/cli/__pycache__/cmdoptions.cpython-37.pyc create mode 100644 env/Lib/site-packages/pip/_internal/cli/__pycache__/command_context.cpython-37.pyc create mode 100644 env/Lib/site-packages/pip/_internal/cli/__pycache__/main_parser.cpython-37.pyc create mode 100644 env/Lib/site-packages/pip/_internal/cli/__pycache__/parser.cpython-37.pyc create mode 100644 env/Lib/site-packages/pip/_internal/cli/__pycache__/req_command.cpython-37.pyc create mode 100644 env/Lib/site-packages/pip/_internal/cli/__pycache__/status_codes.cpython-37.pyc create mode 100644 env/Lib/site-packages/pip/_internal/cli/autocompletion.py create mode 100644 env/Lib/site-packages/pip/_internal/cli/base_command.py create mode 100644 env/Lib/site-packages/pip/_internal/cli/cmdoptions.py create mode 100644 env/Lib/site-packages/pip/_internal/cli/command_context.py create mode 100644 env/Lib/site-packages/pip/_internal/cli/main_parser.py create mode 100644 env/Lib/site-packages/pip/_internal/cli/parser.py create mode 100644 env/Lib/site-packages/pip/_internal/cli/req_command.py create mode 100644 env/Lib/site-packages/pip/_internal/cli/status_codes.py create mode 100644 env/Lib/site-packages/pip/_internal/collector.py create mode 100644 env/Lib/site-packages/pip/_internal/commands/__init__.py create mode 100644 env/Lib/site-packages/pip/_internal/commands/__pycache__/__init__.cpython-37.pyc create mode 100644 env/Lib/site-packages/pip/_internal/commands/__pycache__/check.cpython-37.pyc create mode 100644 env/Lib/site-packages/pip/_internal/commands/__pycache__/completion.cpython-37.pyc create mode 100644 env/Lib/site-packages/pip/_internal/commands/__pycache__/configuration.cpython-37.pyc create mode 100644 env/Lib/site-packages/pip/_internal/commands/__pycache__/debug.cpython-37.pyc create mode 100644 env/Lib/site-packages/pip/_internal/commands/__pycache__/download.cpython-37.pyc create mode 100644 env/Lib/site-packages/pip/_internal/commands/__pycache__/freeze.cpython-37.pyc create mode 100644 env/Lib/site-packages/pip/_internal/commands/__pycache__/hash.cpython-37.pyc create mode 100644 env/Lib/site-packages/pip/_internal/commands/__pycache__/help.cpython-37.pyc create mode 100644 env/Lib/site-packages/pip/_internal/commands/__pycache__/install.cpython-37.pyc create mode 100644 env/Lib/site-packages/pip/_internal/commands/__pycache__/list.cpython-37.pyc create mode 100644 env/Lib/site-packages/pip/_internal/commands/__pycache__/search.cpython-37.pyc create mode 100644 env/Lib/site-packages/pip/_internal/commands/__pycache__/show.cpython-37.pyc create mode 100644 env/Lib/site-packages/pip/_internal/commands/__pycache__/uninstall.cpython-37.pyc create mode 100644 env/Lib/site-packages/pip/_internal/commands/__pycache__/wheel.cpython-37.pyc create mode 100644 env/Lib/site-packages/pip/_internal/commands/check.py create mode 100644 env/Lib/site-packages/pip/_internal/commands/completion.py create mode 100644 env/Lib/site-packages/pip/_internal/commands/configuration.py create mode 100644 env/Lib/site-packages/pip/_internal/commands/debug.py create mode 100644 env/Lib/site-packages/pip/_internal/commands/download.py create mode 100644 env/Lib/site-packages/pip/_internal/commands/freeze.py create mode 100644 env/Lib/site-packages/pip/_internal/commands/hash.py create mode 100644 env/Lib/site-packages/pip/_internal/commands/help.py create mode 100644 env/Lib/site-packages/pip/_internal/commands/install.py create mode 100644 env/Lib/site-packages/pip/_internal/commands/list.py create mode 100644 env/Lib/site-packages/pip/_internal/commands/search.py create mode 100644 env/Lib/site-packages/pip/_internal/commands/show.py create mode 100644 env/Lib/site-packages/pip/_internal/commands/uninstall.py create mode 100644 env/Lib/site-packages/pip/_internal/commands/wheel.py create mode 100644 env/Lib/site-packages/pip/_internal/configuration.py create mode 100644 env/Lib/site-packages/pip/_internal/distributions/__init__.py create mode 100644 env/Lib/site-packages/pip/_internal/distributions/__pycache__/__init__.cpython-37.pyc create mode 100644 env/Lib/site-packages/pip/_internal/distributions/__pycache__/base.cpython-37.pyc create mode 100644 env/Lib/site-packages/pip/_internal/distributions/__pycache__/installed.cpython-37.pyc create mode 100644 env/Lib/site-packages/pip/_internal/distributions/__pycache__/wheel.cpython-37.pyc create mode 100644 env/Lib/site-packages/pip/_internal/distributions/base.py create mode 100644 env/Lib/site-packages/pip/_internal/distributions/installed.py create mode 100644 env/Lib/site-packages/pip/_internal/distributions/source/__init__.py create mode 100644 env/Lib/site-packages/pip/_internal/distributions/source/__pycache__/__init__.cpython-37.pyc create mode 100644 env/Lib/site-packages/pip/_internal/distributions/source/__pycache__/legacy.cpython-37.pyc create mode 100644 env/Lib/site-packages/pip/_internal/distributions/source/legacy.py create mode 100644 env/Lib/site-packages/pip/_internal/distributions/wheel.py create mode 100644 env/Lib/site-packages/pip/_internal/download.py create mode 100644 env/Lib/site-packages/pip/_internal/exceptions.py create mode 100644 env/Lib/site-packages/pip/_internal/index.py create mode 100644 env/Lib/site-packages/pip/_internal/legacy_resolve.py create mode 100644 env/Lib/site-packages/pip/_internal/locations.py create mode 100644 env/Lib/site-packages/pip/_internal/main.py create mode 100644 env/Lib/site-packages/pip/_internal/models/__init__.py create mode 100644 env/Lib/site-packages/pip/_internal/models/__pycache__/__init__.cpython-37.pyc create mode 100644 env/Lib/site-packages/pip/_internal/models/__pycache__/candidate.cpython-37.pyc create mode 100644 env/Lib/site-packages/pip/_internal/models/__pycache__/format_control.cpython-37.pyc create mode 100644 env/Lib/site-packages/pip/_internal/models/__pycache__/index.cpython-37.pyc create mode 100644 env/Lib/site-packages/pip/_internal/models/__pycache__/link.cpython-37.pyc create mode 100644 env/Lib/site-packages/pip/_internal/models/__pycache__/search_scope.cpython-37.pyc create mode 100644 env/Lib/site-packages/pip/_internal/models/__pycache__/selection_prefs.cpython-37.pyc create mode 100644 env/Lib/site-packages/pip/_internal/models/__pycache__/target_python.cpython-37.pyc create mode 100644 env/Lib/site-packages/pip/_internal/models/candidate.py create mode 100644 env/Lib/site-packages/pip/_internal/models/format_control.py create mode 100644 env/Lib/site-packages/pip/_internal/models/index.py create mode 100644 env/Lib/site-packages/pip/_internal/models/link.py create mode 100644 env/Lib/site-packages/pip/_internal/models/search_scope.py create mode 100644 env/Lib/site-packages/pip/_internal/models/selection_prefs.py create mode 100644 env/Lib/site-packages/pip/_internal/models/target_python.py create mode 100644 env/Lib/site-packages/pip/_internal/network/__init__.py create mode 100644 env/Lib/site-packages/pip/_internal/network/__pycache__/__init__.cpython-37.pyc create mode 100644 env/Lib/site-packages/pip/_internal/network/__pycache__/auth.cpython-37.pyc create mode 100644 env/Lib/site-packages/pip/_internal/network/__pycache__/cache.cpython-37.pyc create mode 100644 env/Lib/site-packages/pip/_internal/network/__pycache__/session.cpython-37.pyc create mode 100644 env/Lib/site-packages/pip/_internal/network/__pycache__/xmlrpc.cpython-37.pyc create mode 100644 env/Lib/site-packages/pip/_internal/network/auth.py create mode 100644 env/Lib/site-packages/pip/_internal/network/cache.py create mode 100644 env/Lib/site-packages/pip/_internal/network/session.py create mode 100644 env/Lib/site-packages/pip/_internal/network/xmlrpc.py create mode 100644 env/Lib/site-packages/pip/_internal/operations/__init__.py create mode 100644 env/Lib/site-packages/pip/_internal/operations/__pycache__/__init__.cpython-37.pyc create mode 100644 env/Lib/site-packages/pip/_internal/operations/__pycache__/check.cpython-37.pyc create mode 100644 env/Lib/site-packages/pip/_internal/operations/__pycache__/freeze.cpython-37.pyc create mode 100644 env/Lib/site-packages/pip/_internal/operations/__pycache__/generate_metadata.cpython-37.pyc create mode 100644 env/Lib/site-packages/pip/_internal/operations/__pycache__/prepare.cpython-37.pyc create mode 100644 env/Lib/site-packages/pip/_internal/operations/check.py create mode 100644 env/Lib/site-packages/pip/_internal/operations/freeze.py create mode 100644 env/Lib/site-packages/pip/_internal/operations/generate_metadata.py create mode 100644 env/Lib/site-packages/pip/_internal/operations/prepare.py create mode 100644 env/Lib/site-packages/pip/_internal/pep425tags.py create mode 100644 env/Lib/site-packages/pip/_internal/pyproject.py create mode 100644 env/Lib/site-packages/pip/_internal/req/__init__.py create mode 100644 env/Lib/site-packages/pip/_internal/req/__pycache__/__init__.cpython-37.pyc create mode 100644 env/Lib/site-packages/pip/_internal/req/__pycache__/constructors.cpython-37.pyc create mode 100644 env/Lib/site-packages/pip/_internal/req/__pycache__/req_file.cpython-37.pyc create mode 100644 env/Lib/site-packages/pip/_internal/req/__pycache__/req_install.cpython-37.pyc create mode 100644 env/Lib/site-packages/pip/_internal/req/__pycache__/req_set.cpython-37.pyc create mode 100644 env/Lib/site-packages/pip/_internal/req/__pycache__/req_tracker.cpython-37.pyc create mode 100644 env/Lib/site-packages/pip/_internal/req/__pycache__/req_uninstall.cpython-37.pyc create mode 100644 env/Lib/site-packages/pip/_internal/req/constructors.py create mode 100644 env/Lib/site-packages/pip/_internal/req/req_file.py create mode 100644 env/Lib/site-packages/pip/_internal/req/req_install.py create mode 100644 env/Lib/site-packages/pip/_internal/req/req_set.py create mode 100644 env/Lib/site-packages/pip/_internal/req/req_tracker.py create mode 100644 env/Lib/site-packages/pip/_internal/req/req_uninstall.py create mode 100644 env/Lib/site-packages/pip/_internal/self_outdated_check.py create mode 100644 env/Lib/site-packages/pip/_internal/utils/__init__.py create mode 100644 env/Lib/site-packages/pip/_internal/utils/__pycache__/__init__.cpython-37.pyc create mode 100644 env/Lib/site-packages/pip/_internal/utils/__pycache__/appdirs.cpython-37.pyc create mode 100644 env/Lib/site-packages/pip/_internal/utils/__pycache__/compat.cpython-37.pyc create mode 100644 env/Lib/site-packages/pip/_internal/utils/__pycache__/deprecation.cpython-37.pyc create mode 100644 env/Lib/site-packages/pip/_internal/utils/__pycache__/encoding.cpython-37.pyc create mode 100644 env/Lib/site-packages/pip/_internal/utils/__pycache__/filesystem.cpython-37.pyc create mode 100644 env/Lib/site-packages/pip/_internal/utils/__pycache__/filetypes.cpython-37.pyc create mode 100644 env/Lib/site-packages/pip/_internal/utils/__pycache__/glibc.cpython-37.pyc create mode 100644 env/Lib/site-packages/pip/_internal/utils/__pycache__/hashes.cpython-37.pyc create mode 100644 env/Lib/site-packages/pip/_internal/utils/__pycache__/inject_securetransport.cpython-37.pyc create mode 100644 env/Lib/site-packages/pip/_internal/utils/__pycache__/logging.cpython-37.pyc create mode 100644 env/Lib/site-packages/pip/_internal/utils/__pycache__/marker_files.cpython-37.pyc create mode 100644 env/Lib/site-packages/pip/_internal/utils/__pycache__/misc.cpython-37.pyc create mode 100644 env/Lib/site-packages/pip/_internal/utils/__pycache__/models.cpython-37.pyc create mode 100644 env/Lib/site-packages/pip/_internal/utils/__pycache__/packaging.cpython-37.pyc create mode 100644 env/Lib/site-packages/pip/_internal/utils/__pycache__/setuptools_build.cpython-37.pyc create mode 100644 env/Lib/site-packages/pip/_internal/utils/__pycache__/subprocess.cpython-37.pyc create mode 100644 env/Lib/site-packages/pip/_internal/utils/__pycache__/temp_dir.cpython-37.pyc create mode 100644 env/Lib/site-packages/pip/_internal/utils/__pycache__/typing.cpython-37.pyc create mode 100644 env/Lib/site-packages/pip/_internal/utils/__pycache__/ui.cpython-37.pyc create mode 100644 env/Lib/site-packages/pip/_internal/utils/__pycache__/unpacking.cpython-37.pyc create mode 100644 env/Lib/site-packages/pip/_internal/utils/__pycache__/urls.cpython-37.pyc create mode 100644 env/Lib/site-packages/pip/_internal/utils/__pycache__/virtualenv.cpython-37.pyc create mode 100644 env/Lib/site-packages/pip/_internal/utils/appdirs.py create mode 100644 env/Lib/site-packages/pip/_internal/utils/compat.py create mode 100644 env/Lib/site-packages/pip/_internal/utils/deprecation.py create mode 100644 env/Lib/site-packages/pip/_internal/utils/encoding.py create mode 100644 env/Lib/site-packages/pip/_internal/utils/filesystem.py create mode 100644 env/Lib/site-packages/pip/_internal/utils/filetypes.py create mode 100644 env/Lib/site-packages/pip/_internal/utils/glibc.py create mode 100644 env/Lib/site-packages/pip/_internal/utils/hashes.py create mode 100644 env/Lib/site-packages/pip/_internal/utils/inject_securetransport.py create mode 100644 env/Lib/site-packages/pip/_internal/utils/logging.py create mode 100644 env/Lib/site-packages/pip/_internal/utils/marker_files.py create mode 100644 env/Lib/site-packages/pip/_internal/utils/misc.py create mode 100644 env/Lib/site-packages/pip/_internal/utils/models.py create mode 100644 env/Lib/site-packages/pip/_internal/utils/packaging.py create mode 100644 env/Lib/site-packages/pip/_internal/utils/setuptools_build.py create mode 100644 env/Lib/site-packages/pip/_internal/utils/subprocess.py create mode 100644 env/Lib/site-packages/pip/_internal/utils/temp_dir.py create mode 100644 env/Lib/site-packages/pip/_internal/utils/typing.py create mode 100644 env/Lib/site-packages/pip/_internal/utils/ui.py create mode 100644 env/Lib/site-packages/pip/_internal/utils/unpacking.py create mode 100644 env/Lib/site-packages/pip/_internal/utils/urls.py create mode 100644 env/Lib/site-packages/pip/_internal/utils/virtualenv.py create mode 100644 env/Lib/site-packages/pip/_internal/vcs/__init__.py create mode 100644 env/Lib/site-packages/pip/_internal/vcs/__pycache__/__init__.cpython-37.pyc create mode 100644 env/Lib/site-packages/pip/_internal/vcs/__pycache__/bazaar.cpython-37.pyc create mode 100644 env/Lib/site-packages/pip/_internal/vcs/__pycache__/git.cpython-37.pyc create mode 100644 env/Lib/site-packages/pip/_internal/vcs/__pycache__/mercurial.cpython-37.pyc create mode 100644 env/Lib/site-packages/pip/_internal/vcs/__pycache__/subversion.cpython-37.pyc create mode 100644 env/Lib/site-packages/pip/_internal/vcs/__pycache__/versioncontrol.cpython-37.pyc create mode 100644 env/Lib/site-packages/pip/_internal/vcs/bazaar.py create mode 100644 env/Lib/site-packages/pip/_internal/vcs/git.py create mode 100644 env/Lib/site-packages/pip/_internal/vcs/mercurial.py create mode 100644 env/Lib/site-packages/pip/_internal/vcs/subversion.py create mode 100644 env/Lib/site-packages/pip/_internal/vcs/versioncontrol.py create mode 100644 env/Lib/site-packages/pip/_internal/wheel.py create mode 100644 env/Lib/site-packages/pip/_vendor/__init__.py create mode 100644 env/Lib/site-packages/pip/_vendor/__pycache__/__init__.cpython-37.pyc create mode 100644 env/Lib/site-packages/pip/_vendor/__pycache__/appdirs.cpython-37.pyc create mode 100644 env/Lib/site-packages/pip/_vendor/__pycache__/contextlib2.cpython-37.pyc create mode 100644 env/Lib/site-packages/pip/_vendor/__pycache__/distro.cpython-37.pyc create mode 100644 env/Lib/site-packages/pip/_vendor/__pycache__/ipaddress.cpython-37.pyc create mode 100644 env/Lib/site-packages/pip/_vendor/__pycache__/pyparsing.cpython-37.pyc create mode 100644 env/Lib/site-packages/pip/_vendor/__pycache__/retrying.cpython-37.pyc create mode 100644 env/Lib/site-packages/pip/_vendor/__pycache__/six.cpython-37.pyc create mode 100644 env/Lib/site-packages/pip/_vendor/appdirs.py create mode 100644 env/Lib/site-packages/pip/_vendor/cachecontrol/__init__.py create mode 100644 env/Lib/site-packages/pip/_vendor/cachecontrol/__pycache__/__init__.cpython-37.pyc create mode 100644 env/Lib/site-packages/pip/_vendor/cachecontrol/__pycache__/_cmd.cpython-37.pyc create mode 100644 env/Lib/site-packages/pip/_vendor/cachecontrol/__pycache__/adapter.cpython-37.pyc create mode 100644 env/Lib/site-packages/pip/_vendor/cachecontrol/__pycache__/cache.cpython-37.pyc create mode 100644 env/Lib/site-packages/pip/_vendor/cachecontrol/__pycache__/compat.cpython-37.pyc create mode 100644 env/Lib/site-packages/pip/_vendor/cachecontrol/__pycache__/controller.cpython-37.pyc create mode 100644 env/Lib/site-packages/pip/_vendor/cachecontrol/__pycache__/filewrapper.cpython-37.pyc create mode 100644 env/Lib/site-packages/pip/_vendor/cachecontrol/__pycache__/heuristics.cpython-37.pyc create mode 100644 env/Lib/site-packages/pip/_vendor/cachecontrol/__pycache__/serialize.cpython-37.pyc create mode 100644 env/Lib/site-packages/pip/_vendor/cachecontrol/__pycache__/wrapper.cpython-37.pyc create mode 100644 env/Lib/site-packages/pip/_vendor/cachecontrol/_cmd.py create mode 100644 env/Lib/site-packages/pip/_vendor/cachecontrol/adapter.py create mode 100644 env/Lib/site-packages/pip/_vendor/cachecontrol/cache.py create mode 100644 env/Lib/site-packages/pip/_vendor/cachecontrol/caches/__init__.py create mode 100644 env/Lib/site-packages/pip/_vendor/cachecontrol/caches/__pycache__/__init__.cpython-37.pyc create mode 100644 env/Lib/site-packages/pip/_vendor/cachecontrol/caches/__pycache__/file_cache.cpython-37.pyc create mode 100644 env/Lib/site-packages/pip/_vendor/cachecontrol/caches/__pycache__/redis_cache.cpython-37.pyc create mode 100644 env/Lib/site-packages/pip/_vendor/cachecontrol/caches/file_cache.py create mode 100644 env/Lib/site-packages/pip/_vendor/cachecontrol/caches/redis_cache.py create mode 100644 env/Lib/site-packages/pip/_vendor/cachecontrol/compat.py create mode 100644 env/Lib/site-packages/pip/_vendor/cachecontrol/controller.py create mode 100644 env/Lib/site-packages/pip/_vendor/cachecontrol/filewrapper.py create mode 100644 env/Lib/site-packages/pip/_vendor/cachecontrol/heuristics.py create mode 100644 env/Lib/site-packages/pip/_vendor/cachecontrol/serialize.py create mode 100644 env/Lib/site-packages/pip/_vendor/cachecontrol/wrapper.py create mode 100644 env/Lib/site-packages/pip/_vendor/certifi/__init__.py create mode 100644 env/Lib/site-packages/pip/_vendor/certifi/__main__.py create mode 100644 env/Lib/site-packages/pip/_vendor/certifi/__pycache__/__init__.cpython-37.pyc create mode 100644 env/Lib/site-packages/pip/_vendor/certifi/__pycache__/__main__.cpython-37.pyc create mode 100644 env/Lib/site-packages/pip/_vendor/certifi/__pycache__/core.cpython-37.pyc create mode 100644 env/Lib/site-packages/pip/_vendor/certifi/cacert.pem create mode 100644 env/Lib/site-packages/pip/_vendor/certifi/core.py create mode 100644 env/Lib/site-packages/pip/_vendor/chardet/__init__.py create mode 100644 env/Lib/site-packages/pip/_vendor/chardet/__pycache__/__init__.cpython-37.pyc create mode 100644 env/Lib/site-packages/pip/_vendor/chardet/__pycache__/big5freq.cpython-37.pyc create mode 100644 env/Lib/site-packages/pip/_vendor/chardet/__pycache__/big5prober.cpython-37.pyc create mode 100644 env/Lib/site-packages/pip/_vendor/chardet/__pycache__/chardistribution.cpython-37.pyc create mode 100644 env/Lib/site-packages/pip/_vendor/chardet/__pycache__/charsetgroupprober.cpython-37.pyc create mode 100644 env/Lib/site-packages/pip/_vendor/chardet/__pycache__/charsetprober.cpython-37.pyc create mode 100644 env/Lib/site-packages/pip/_vendor/chardet/__pycache__/codingstatemachine.cpython-37.pyc create mode 100644 env/Lib/site-packages/pip/_vendor/chardet/__pycache__/compat.cpython-37.pyc create mode 100644 env/Lib/site-packages/pip/_vendor/chardet/__pycache__/cp949prober.cpython-37.pyc create mode 100644 env/Lib/site-packages/pip/_vendor/chardet/__pycache__/enums.cpython-37.pyc create mode 100644 env/Lib/site-packages/pip/_vendor/chardet/__pycache__/escprober.cpython-37.pyc create mode 100644 env/Lib/site-packages/pip/_vendor/chardet/__pycache__/escsm.cpython-37.pyc create mode 100644 env/Lib/site-packages/pip/_vendor/chardet/__pycache__/eucjpprober.cpython-37.pyc create mode 100644 env/Lib/site-packages/pip/_vendor/chardet/__pycache__/euckrfreq.cpython-37.pyc create mode 100644 env/Lib/site-packages/pip/_vendor/chardet/__pycache__/euckrprober.cpython-37.pyc create mode 100644 env/Lib/site-packages/pip/_vendor/chardet/__pycache__/euctwfreq.cpython-37.pyc create mode 100644 env/Lib/site-packages/pip/_vendor/chardet/__pycache__/euctwprober.cpython-37.pyc create mode 100644 env/Lib/site-packages/pip/_vendor/chardet/__pycache__/gb2312freq.cpython-37.pyc create mode 100644 env/Lib/site-packages/pip/_vendor/chardet/__pycache__/gb2312prober.cpython-37.pyc create mode 100644 env/Lib/site-packages/pip/_vendor/chardet/__pycache__/hebrewprober.cpython-37.pyc create mode 100644 env/Lib/site-packages/pip/_vendor/chardet/__pycache__/jisfreq.cpython-37.pyc create mode 100644 env/Lib/site-packages/pip/_vendor/chardet/__pycache__/jpcntx.cpython-37.pyc create mode 100644 env/Lib/site-packages/pip/_vendor/chardet/__pycache__/langbulgarianmodel.cpython-37.pyc create mode 100644 env/Lib/site-packages/pip/_vendor/chardet/__pycache__/langcyrillicmodel.cpython-37.pyc create mode 100644 env/Lib/site-packages/pip/_vendor/chardet/__pycache__/langgreekmodel.cpython-37.pyc create mode 100644 env/Lib/site-packages/pip/_vendor/chardet/__pycache__/langhebrewmodel.cpython-37.pyc create mode 100644 env/Lib/site-packages/pip/_vendor/chardet/__pycache__/langhungarianmodel.cpython-37.pyc create mode 100644 env/Lib/site-packages/pip/_vendor/chardet/__pycache__/langthaimodel.cpython-37.pyc create mode 100644 env/Lib/site-packages/pip/_vendor/chardet/__pycache__/langturkishmodel.cpython-37.pyc create mode 100644 env/Lib/site-packages/pip/_vendor/chardet/__pycache__/latin1prober.cpython-37.pyc create mode 100644 env/Lib/site-packages/pip/_vendor/chardet/__pycache__/mbcharsetprober.cpython-37.pyc create mode 100644 env/Lib/site-packages/pip/_vendor/chardet/__pycache__/mbcsgroupprober.cpython-37.pyc create mode 100644 env/Lib/site-packages/pip/_vendor/chardet/__pycache__/mbcssm.cpython-37.pyc create mode 100644 env/Lib/site-packages/pip/_vendor/chardet/__pycache__/sbcharsetprober.cpython-37.pyc create mode 100644 env/Lib/site-packages/pip/_vendor/chardet/__pycache__/sbcsgroupprober.cpython-37.pyc create mode 100644 env/Lib/site-packages/pip/_vendor/chardet/__pycache__/sjisprober.cpython-37.pyc create mode 100644 env/Lib/site-packages/pip/_vendor/chardet/__pycache__/universaldetector.cpython-37.pyc create mode 100644 env/Lib/site-packages/pip/_vendor/chardet/__pycache__/utf8prober.cpython-37.pyc create mode 100644 env/Lib/site-packages/pip/_vendor/chardet/__pycache__/version.cpython-37.pyc create mode 100644 env/Lib/site-packages/pip/_vendor/chardet/big5freq.py create mode 100644 env/Lib/site-packages/pip/_vendor/chardet/big5prober.py create mode 100644 env/Lib/site-packages/pip/_vendor/chardet/chardistribution.py create mode 100644 env/Lib/site-packages/pip/_vendor/chardet/charsetgroupprober.py create mode 100644 env/Lib/site-packages/pip/_vendor/chardet/charsetprober.py create mode 100644 env/Lib/site-packages/pip/_vendor/chardet/cli/__init__.py create mode 100644 env/Lib/site-packages/pip/_vendor/chardet/cli/__pycache__/__init__.cpython-37.pyc create mode 100644 env/Lib/site-packages/pip/_vendor/chardet/cli/__pycache__/chardetect.cpython-37.pyc create mode 100644 env/Lib/site-packages/pip/_vendor/chardet/cli/chardetect.py create mode 100644 env/Lib/site-packages/pip/_vendor/chardet/codingstatemachine.py create mode 100644 env/Lib/site-packages/pip/_vendor/chardet/compat.py create mode 100644 env/Lib/site-packages/pip/_vendor/chardet/cp949prober.py create mode 100644 env/Lib/site-packages/pip/_vendor/chardet/enums.py create mode 100644 env/Lib/site-packages/pip/_vendor/chardet/escprober.py create mode 100644 env/Lib/site-packages/pip/_vendor/chardet/escsm.py create mode 100644 env/Lib/site-packages/pip/_vendor/chardet/eucjpprober.py create mode 100644 env/Lib/site-packages/pip/_vendor/chardet/euckrfreq.py create mode 100644 env/Lib/site-packages/pip/_vendor/chardet/euckrprober.py create mode 100644 env/Lib/site-packages/pip/_vendor/chardet/euctwfreq.py create mode 100644 env/Lib/site-packages/pip/_vendor/chardet/euctwprober.py create mode 100644 env/Lib/site-packages/pip/_vendor/chardet/gb2312freq.py create mode 100644 env/Lib/site-packages/pip/_vendor/chardet/gb2312prober.py create mode 100644 env/Lib/site-packages/pip/_vendor/chardet/hebrewprober.py create mode 100644 env/Lib/site-packages/pip/_vendor/chardet/jisfreq.py create mode 100644 env/Lib/site-packages/pip/_vendor/chardet/jpcntx.py create mode 100644 env/Lib/site-packages/pip/_vendor/chardet/langbulgarianmodel.py create mode 100644 env/Lib/site-packages/pip/_vendor/chardet/langcyrillicmodel.py create mode 100644 env/Lib/site-packages/pip/_vendor/chardet/langgreekmodel.py create mode 100644 env/Lib/site-packages/pip/_vendor/chardet/langhebrewmodel.py create mode 100644 env/Lib/site-packages/pip/_vendor/chardet/langhungarianmodel.py create mode 100644 env/Lib/site-packages/pip/_vendor/chardet/langthaimodel.py create mode 100644 env/Lib/site-packages/pip/_vendor/chardet/langturkishmodel.py create mode 100644 env/Lib/site-packages/pip/_vendor/chardet/latin1prober.py create mode 100644 env/Lib/site-packages/pip/_vendor/chardet/mbcharsetprober.py create mode 100644 env/Lib/site-packages/pip/_vendor/chardet/mbcsgroupprober.py create mode 100644 env/Lib/site-packages/pip/_vendor/chardet/mbcssm.py create mode 100644 env/Lib/site-packages/pip/_vendor/chardet/sbcharsetprober.py create mode 100644 env/Lib/site-packages/pip/_vendor/chardet/sbcsgroupprober.py create mode 100644 env/Lib/site-packages/pip/_vendor/chardet/sjisprober.py create mode 100644 env/Lib/site-packages/pip/_vendor/chardet/universaldetector.py create mode 100644 env/Lib/site-packages/pip/_vendor/chardet/utf8prober.py create mode 100644 env/Lib/site-packages/pip/_vendor/chardet/version.py create mode 100644 env/Lib/site-packages/pip/_vendor/colorama/__init__.py create mode 100644 env/Lib/site-packages/pip/_vendor/colorama/__pycache__/__init__.cpython-37.pyc create mode 100644 env/Lib/site-packages/pip/_vendor/colorama/__pycache__/ansi.cpython-37.pyc create mode 100644 env/Lib/site-packages/pip/_vendor/colorama/__pycache__/ansitowin32.cpython-37.pyc create mode 100644 env/Lib/site-packages/pip/_vendor/colorama/__pycache__/initialise.cpython-37.pyc create mode 100644 env/Lib/site-packages/pip/_vendor/colorama/__pycache__/win32.cpython-37.pyc create mode 100644 env/Lib/site-packages/pip/_vendor/colorama/__pycache__/winterm.cpython-37.pyc create mode 100644 env/Lib/site-packages/pip/_vendor/colorama/ansi.py create mode 100644 env/Lib/site-packages/pip/_vendor/colorama/ansitowin32.py create mode 100644 env/Lib/site-packages/pip/_vendor/colorama/initialise.py create mode 100644 env/Lib/site-packages/pip/_vendor/colorama/win32.py create mode 100644 env/Lib/site-packages/pip/_vendor/colorama/winterm.py create mode 100644 env/Lib/site-packages/pip/_vendor/contextlib2.py create mode 100644 env/Lib/site-packages/pip/_vendor/distlib/__init__.py create mode 100644 env/Lib/site-packages/pip/_vendor/distlib/__pycache__/__init__.cpython-37.pyc create mode 100644 env/Lib/site-packages/pip/_vendor/distlib/__pycache__/compat.cpython-37.pyc create mode 100644 env/Lib/site-packages/pip/_vendor/distlib/__pycache__/database.cpython-37.pyc create mode 100644 env/Lib/site-packages/pip/_vendor/distlib/__pycache__/index.cpython-37.pyc create mode 100644 env/Lib/site-packages/pip/_vendor/distlib/__pycache__/locators.cpython-37.pyc create mode 100644 env/Lib/site-packages/pip/_vendor/distlib/__pycache__/manifest.cpython-37.pyc create mode 100644 env/Lib/site-packages/pip/_vendor/distlib/__pycache__/markers.cpython-37.pyc create mode 100644 env/Lib/site-packages/pip/_vendor/distlib/__pycache__/metadata.cpython-37.pyc create mode 100644 env/Lib/site-packages/pip/_vendor/distlib/__pycache__/resources.cpython-37.pyc create mode 100644 env/Lib/site-packages/pip/_vendor/distlib/__pycache__/scripts.cpython-37.pyc create mode 100644 env/Lib/site-packages/pip/_vendor/distlib/__pycache__/util.cpython-37.pyc create mode 100644 env/Lib/site-packages/pip/_vendor/distlib/__pycache__/version.cpython-37.pyc create mode 100644 env/Lib/site-packages/pip/_vendor/distlib/__pycache__/wheel.cpython-37.pyc create mode 100644 env/Lib/site-packages/pip/_vendor/distlib/_backport/__init__.py create mode 100644 env/Lib/site-packages/pip/_vendor/distlib/_backport/__pycache__/__init__.cpython-37.pyc create mode 100644 env/Lib/site-packages/pip/_vendor/distlib/_backport/__pycache__/misc.cpython-37.pyc create mode 100644 env/Lib/site-packages/pip/_vendor/distlib/_backport/__pycache__/shutil.cpython-37.pyc create mode 100644 env/Lib/site-packages/pip/_vendor/distlib/_backport/__pycache__/sysconfig.cpython-37.pyc create mode 100644 env/Lib/site-packages/pip/_vendor/distlib/_backport/__pycache__/tarfile.cpython-37.pyc create mode 100644 env/Lib/site-packages/pip/_vendor/distlib/_backport/misc.py create mode 100644 env/Lib/site-packages/pip/_vendor/distlib/_backport/shutil.py create mode 100644 env/Lib/site-packages/pip/_vendor/distlib/_backport/sysconfig.cfg create mode 100644 env/Lib/site-packages/pip/_vendor/distlib/_backport/sysconfig.py create mode 100644 env/Lib/site-packages/pip/_vendor/distlib/_backport/tarfile.py create mode 100644 env/Lib/site-packages/pip/_vendor/distlib/compat.py create mode 100644 env/Lib/site-packages/pip/_vendor/distlib/database.py create mode 100644 env/Lib/site-packages/pip/_vendor/distlib/index.py create mode 100644 env/Lib/site-packages/pip/_vendor/distlib/locators.py create mode 100644 env/Lib/site-packages/pip/_vendor/distlib/manifest.py create mode 100644 env/Lib/site-packages/pip/_vendor/distlib/markers.py create mode 100644 env/Lib/site-packages/pip/_vendor/distlib/metadata.py create mode 100644 env/Lib/site-packages/pip/_vendor/distlib/resources.py create mode 100644 env/Lib/site-packages/pip/_vendor/distlib/scripts.py create mode 100644 env/Lib/site-packages/pip/_vendor/distlib/t32.exe create mode 100644 env/Lib/site-packages/pip/_vendor/distlib/t64.exe create mode 100644 env/Lib/site-packages/pip/_vendor/distlib/util.py create mode 100644 env/Lib/site-packages/pip/_vendor/distlib/version.py create mode 100644 env/Lib/site-packages/pip/_vendor/distlib/w32.exe create mode 100644 env/Lib/site-packages/pip/_vendor/distlib/w64.exe create mode 100644 env/Lib/site-packages/pip/_vendor/distlib/wheel.py create mode 100644 env/Lib/site-packages/pip/_vendor/distro.py create mode 100644 env/Lib/site-packages/pip/_vendor/html5lib/__init__.py create mode 100644 env/Lib/site-packages/pip/_vendor/html5lib/__pycache__/__init__.cpython-37.pyc create mode 100644 env/Lib/site-packages/pip/_vendor/html5lib/__pycache__/_ihatexml.cpython-37.pyc create mode 100644 env/Lib/site-packages/pip/_vendor/html5lib/__pycache__/_inputstream.cpython-37.pyc create mode 100644 env/Lib/site-packages/pip/_vendor/html5lib/__pycache__/_tokenizer.cpython-37.pyc create mode 100644 env/Lib/site-packages/pip/_vendor/html5lib/__pycache__/_utils.cpython-37.pyc create mode 100644 env/Lib/site-packages/pip/_vendor/html5lib/__pycache__/constants.cpython-37.pyc create mode 100644 env/Lib/site-packages/pip/_vendor/html5lib/__pycache__/html5parser.cpython-37.pyc create mode 100644 env/Lib/site-packages/pip/_vendor/html5lib/__pycache__/serializer.cpython-37.pyc create mode 100644 env/Lib/site-packages/pip/_vendor/html5lib/_ihatexml.py create mode 100644 env/Lib/site-packages/pip/_vendor/html5lib/_inputstream.py create mode 100644 env/Lib/site-packages/pip/_vendor/html5lib/_tokenizer.py create mode 100644 env/Lib/site-packages/pip/_vendor/html5lib/_trie/__init__.py create mode 100644 env/Lib/site-packages/pip/_vendor/html5lib/_trie/__pycache__/__init__.cpython-37.pyc create mode 100644 env/Lib/site-packages/pip/_vendor/html5lib/_trie/__pycache__/_base.cpython-37.pyc create mode 100644 env/Lib/site-packages/pip/_vendor/html5lib/_trie/__pycache__/datrie.cpython-37.pyc create mode 100644 env/Lib/site-packages/pip/_vendor/html5lib/_trie/__pycache__/py.cpython-37.pyc create mode 100644 env/Lib/site-packages/pip/_vendor/html5lib/_trie/_base.py create mode 100644 env/Lib/site-packages/pip/_vendor/html5lib/_trie/datrie.py create mode 100644 env/Lib/site-packages/pip/_vendor/html5lib/_trie/py.py create mode 100644 env/Lib/site-packages/pip/_vendor/html5lib/_utils.py create mode 100644 env/Lib/site-packages/pip/_vendor/html5lib/constants.py create mode 100644 env/Lib/site-packages/pip/_vendor/html5lib/filters/__init__.py create mode 100644 env/Lib/site-packages/pip/_vendor/html5lib/filters/__pycache__/__init__.cpython-37.pyc create mode 100644 env/Lib/site-packages/pip/_vendor/html5lib/filters/__pycache__/alphabeticalattributes.cpython-37.pyc create mode 100644 env/Lib/site-packages/pip/_vendor/html5lib/filters/__pycache__/base.cpython-37.pyc create mode 100644 env/Lib/site-packages/pip/_vendor/html5lib/filters/__pycache__/inject_meta_charset.cpython-37.pyc create mode 100644 env/Lib/site-packages/pip/_vendor/html5lib/filters/__pycache__/lint.cpython-37.pyc create mode 100644 env/Lib/site-packages/pip/_vendor/html5lib/filters/__pycache__/optionaltags.cpython-37.pyc create mode 100644 env/Lib/site-packages/pip/_vendor/html5lib/filters/__pycache__/sanitizer.cpython-37.pyc create mode 100644 env/Lib/site-packages/pip/_vendor/html5lib/filters/__pycache__/whitespace.cpython-37.pyc create mode 100644 env/Lib/site-packages/pip/_vendor/html5lib/filters/alphabeticalattributes.py create mode 100644 env/Lib/site-packages/pip/_vendor/html5lib/filters/base.py create mode 100644 env/Lib/site-packages/pip/_vendor/html5lib/filters/inject_meta_charset.py create mode 100644 env/Lib/site-packages/pip/_vendor/html5lib/filters/lint.py create mode 100644 env/Lib/site-packages/pip/_vendor/html5lib/filters/optionaltags.py create mode 100644 env/Lib/site-packages/pip/_vendor/html5lib/filters/sanitizer.py create mode 100644 env/Lib/site-packages/pip/_vendor/html5lib/filters/whitespace.py create mode 100644 env/Lib/site-packages/pip/_vendor/html5lib/html5parser.py create mode 100644 env/Lib/site-packages/pip/_vendor/html5lib/serializer.py create mode 100644 env/Lib/site-packages/pip/_vendor/html5lib/treeadapters/__init__.py create mode 100644 env/Lib/site-packages/pip/_vendor/html5lib/treeadapters/__pycache__/__init__.cpython-37.pyc create mode 100644 env/Lib/site-packages/pip/_vendor/html5lib/treeadapters/__pycache__/genshi.cpython-37.pyc create mode 100644 env/Lib/site-packages/pip/_vendor/html5lib/treeadapters/__pycache__/sax.cpython-37.pyc create mode 100644 env/Lib/site-packages/pip/_vendor/html5lib/treeadapters/genshi.py create mode 100644 env/Lib/site-packages/pip/_vendor/html5lib/treeadapters/sax.py create mode 100644 env/Lib/site-packages/pip/_vendor/html5lib/treebuilders/__init__.py create mode 100644 env/Lib/site-packages/pip/_vendor/html5lib/treebuilders/__pycache__/__init__.cpython-37.pyc create mode 100644 env/Lib/site-packages/pip/_vendor/html5lib/treebuilders/__pycache__/base.cpython-37.pyc create mode 100644 env/Lib/site-packages/pip/_vendor/html5lib/treebuilders/__pycache__/dom.cpython-37.pyc create mode 100644 env/Lib/site-packages/pip/_vendor/html5lib/treebuilders/__pycache__/etree.cpython-37.pyc create mode 100644 env/Lib/site-packages/pip/_vendor/html5lib/treebuilders/__pycache__/etree_lxml.cpython-37.pyc create mode 100644 env/Lib/site-packages/pip/_vendor/html5lib/treebuilders/base.py create mode 100644 env/Lib/site-packages/pip/_vendor/html5lib/treebuilders/dom.py create mode 100644 env/Lib/site-packages/pip/_vendor/html5lib/treebuilders/etree.py create mode 100644 env/Lib/site-packages/pip/_vendor/html5lib/treebuilders/etree_lxml.py create mode 100644 env/Lib/site-packages/pip/_vendor/html5lib/treewalkers/__init__.py create mode 100644 env/Lib/site-packages/pip/_vendor/html5lib/treewalkers/__pycache__/__init__.cpython-37.pyc create mode 100644 env/Lib/site-packages/pip/_vendor/html5lib/treewalkers/__pycache__/base.cpython-37.pyc create mode 100644 env/Lib/site-packages/pip/_vendor/html5lib/treewalkers/__pycache__/dom.cpython-37.pyc create mode 100644 env/Lib/site-packages/pip/_vendor/html5lib/treewalkers/__pycache__/etree.cpython-37.pyc create mode 100644 env/Lib/site-packages/pip/_vendor/html5lib/treewalkers/__pycache__/etree_lxml.cpython-37.pyc create mode 100644 env/Lib/site-packages/pip/_vendor/html5lib/treewalkers/__pycache__/genshi.cpython-37.pyc create mode 100644 env/Lib/site-packages/pip/_vendor/html5lib/treewalkers/base.py create mode 100644 env/Lib/site-packages/pip/_vendor/html5lib/treewalkers/dom.py create mode 100644 env/Lib/site-packages/pip/_vendor/html5lib/treewalkers/etree.py create mode 100644 env/Lib/site-packages/pip/_vendor/html5lib/treewalkers/etree_lxml.py create mode 100644 env/Lib/site-packages/pip/_vendor/html5lib/treewalkers/genshi.py create mode 100644 env/Lib/site-packages/pip/_vendor/idna/__init__.py create mode 100644 env/Lib/site-packages/pip/_vendor/idna/__pycache__/__init__.cpython-37.pyc create mode 100644 env/Lib/site-packages/pip/_vendor/idna/__pycache__/codec.cpython-37.pyc create mode 100644 env/Lib/site-packages/pip/_vendor/idna/__pycache__/compat.cpython-37.pyc create mode 100644 env/Lib/site-packages/pip/_vendor/idna/__pycache__/core.cpython-37.pyc create mode 100644 env/Lib/site-packages/pip/_vendor/idna/__pycache__/idnadata.cpython-37.pyc create mode 100644 env/Lib/site-packages/pip/_vendor/idna/__pycache__/intranges.cpython-37.pyc create mode 100644 env/Lib/site-packages/pip/_vendor/idna/__pycache__/package_data.cpython-37.pyc create mode 100644 env/Lib/site-packages/pip/_vendor/idna/__pycache__/uts46data.cpython-37.pyc create mode 100644 env/Lib/site-packages/pip/_vendor/idna/codec.py create mode 100644 env/Lib/site-packages/pip/_vendor/idna/compat.py create mode 100644 env/Lib/site-packages/pip/_vendor/idna/core.py create mode 100644 env/Lib/site-packages/pip/_vendor/idna/idnadata.py create mode 100644 env/Lib/site-packages/pip/_vendor/idna/intranges.py create mode 100644 env/Lib/site-packages/pip/_vendor/idna/package_data.py create mode 100644 env/Lib/site-packages/pip/_vendor/idna/uts46data.py create mode 100644 env/Lib/site-packages/pip/_vendor/ipaddress.py create mode 100644 env/Lib/site-packages/pip/_vendor/msgpack/__init__.py create mode 100644 env/Lib/site-packages/pip/_vendor/msgpack/__pycache__/__init__.cpython-37.pyc create mode 100644 env/Lib/site-packages/pip/_vendor/msgpack/__pycache__/_version.cpython-37.pyc create mode 100644 env/Lib/site-packages/pip/_vendor/msgpack/__pycache__/exceptions.cpython-37.pyc create mode 100644 env/Lib/site-packages/pip/_vendor/msgpack/__pycache__/fallback.cpython-37.pyc create mode 100644 env/Lib/site-packages/pip/_vendor/msgpack/_version.py create mode 100644 env/Lib/site-packages/pip/_vendor/msgpack/exceptions.py create mode 100644 env/Lib/site-packages/pip/_vendor/msgpack/fallback.py create mode 100644 env/Lib/site-packages/pip/_vendor/packaging/__about__.py create mode 100644 env/Lib/site-packages/pip/_vendor/packaging/__init__.py create mode 100644 env/Lib/site-packages/pip/_vendor/packaging/__pycache__/__about__.cpython-37.pyc create mode 100644 env/Lib/site-packages/pip/_vendor/packaging/__pycache__/__init__.cpython-37.pyc create mode 100644 env/Lib/site-packages/pip/_vendor/packaging/__pycache__/_compat.cpython-37.pyc create mode 100644 env/Lib/site-packages/pip/_vendor/packaging/__pycache__/_structures.cpython-37.pyc create mode 100644 env/Lib/site-packages/pip/_vendor/packaging/__pycache__/markers.cpython-37.pyc create mode 100644 env/Lib/site-packages/pip/_vendor/packaging/__pycache__/requirements.cpython-37.pyc create mode 100644 env/Lib/site-packages/pip/_vendor/packaging/__pycache__/specifiers.cpython-37.pyc create mode 100644 env/Lib/site-packages/pip/_vendor/packaging/__pycache__/tags.cpython-37.pyc create mode 100644 env/Lib/site-packages/pip/_vendor/packaging/__pycache__/utils.cpython-37.pyc create mode 100644 env/Lib/site-packages/pip/_vendor/packaging/__pycache__/version.cpython-37.pyc create mode 100644 env/Lib/site-packages/pip/_vendor/packaging/_compat.py create mode 100644 env/Lib/site-packages/pip/_vendor/packaging/_structures.py create mode 100644 env/Lib/site-packages/pip/_vendor/packaging/markers.py create mode 100644 env/Lib/site-packages/pip/_vendor/packaging/requirements.py create mode 100644 env/Lib/site-packages/pip/_vendor/packaging/specifiers.py create mode 100644 env/Lib/site-packages/pip/_vendor/packaging/tags.py create mode 100644 env/Lib/site-packages/pip/_vendor/packaging/utils.py create mode 100644 env/Lib/site-packages/pip/_vendor/packaging/version.py create mode 100644 env/Lib/site-packages/pip/_vendor/pep517/__init__.py create mode 100644 env/Lib/site-packages/pip/_vendor/pep517/__pycache__/__init__.cpython-37.pyc create mode 100644 env/Lib/site-packages/pip/_vendor/pep517/__pycache__/_in_process.cpython-37.pyc create mode 100644 env/Lib/site-packages/pip/_vendor/pep517/__pycache__/build.cpython-37.pyc create mode 100644 env/Lib/site-packages/pip/_vendor/pep517/__pycache__/check.cpython-37.pyc create mode 100644 env/Lib/site-packages/pip/_vendor/pep517/__pycache__/colorlog.cpython-37.pyc create mode 100644 env/Lib/site-packages/pip/_vendor/pep517/__pycache__/compat.cpython-37.pyc create mode 100644 env/Lib/site-packages/pip/_vendor/pep517/__pycache__/dirtools.cpython-37.pyc create mode 100644 env/Lib/site-packages/pip/_vendor/pep517/__pycache__/envbuild.cpython-37.pyc create mode 100644 env/Lib/site-packages/pip/_vendor/pep517/__pycache__/meta.cpython-37.pyc create mode 100644 env/Lib/site-packages/pip/_vendor/pep517/__pycache__/wrappers.cpython-37.pyc create mode 100644 env/Lib/site-packages/pip/_vendor/pep517/_in_process.py create mode 100644 env/Lib/site-packages/pip/_vendor/pep517/build.py create mode 100644 env/Lib/site-packages/pip/_vendor/pep517/check.py create mode 100644 env/Lib/site-packages/pip/_vendor/pep517/colorlog.py create mode 100644 env/Lib/site-packages/pip/_vendor/pep517/compat.py create mode 100644 env/Lib/site-packages/pip/_vendor/pep517/dirtools.py create mode 100644 env/Lib/site-packages/pip/_vendor/pep517/envbuild.py create mode 100644 env/Lib/site-packages/pip/_vendor/pep517/meta.py create mode 100644 env/Lib/site-packages/pip/_vendor/pep517/wrappers.py create mode 100644 env/Lib/site-packages/pip/_vendor/pkg_resources/__init__.py create mode 100644 env/Lib/site-packages/pip/_vendor/pkg_resources/__pycache__/__init__.cpython-37.pyc create mode 100644 env/Lib/site-packages/pip/_vendor/pkg_resources/__pycache__/py31compat.cpython-37.pyc create mode 100644 env/Lib/site-packages/pip/_vendor/pkg_resources/py31compat.py create mode 100644 env/Lib/site-packages/pip/_vendor/progress/__init__.py create mode 100644 env/Lib/site-packages/pip/_vendor/progress/__pycache__/__init__.cpython-37.pyc create mode 100644 env/Lib/site-packages/pip/_vendor/progress/__pycache__/bar.cpython-37.pyc create mode 100644 env/Lib/site-packages/pip/_vendor/progress/__pycache__/counter.cpython-37.pyc create mode 100644 env/Lib/site-packages/pip/_vendor/progress/__pycache__/spinner.cpython-37.pyc create mode 100644 env/Lib/site-packages/pip/_vendor/progress/bar.py create mode 100644 env/Lib/site-packages/pip/_vendor/progress/counter.py create mode 100644 env/Lib/site-packages/pip/_vendor/progress/spinner.py create mode 100644 env/Lib/site-packages/pip/_vendor/pyparsing.py create mode 100644 env/Lib/site-packages/pip/_vendor/pytoml/__init__.py create mode 100644 env/Lib/site-packages/pip/_vendor/pytoml/__pycache__/__init__.cpython-37.pyc create mode 100644 env/Lib/site-packages/pip/_vendor/pytoml/__pycache__/core.cpython-37.pyc create mode 100644 env/Lib/site-packages/pip/_vendor/pytoml/__pycache__/parser.cpython-37.pyc create mode 100644 env/Lib/site-packages/pip/_vendor/pytoml/__pycache__/test.cpython-37.pyc create mode 100644 env/Lib/site-packages/pip/_vendor/pytoml/__pycache__/utils.cpython-37.pyc create mode 100644 env/Lib/site-packages/pip/_vendor/pytoml/__pycache__/writer.cpython-37.pyc create mode 100644 env/Lib/site-packages/pip/_vendor/pytoml/core.py create mode 100644 env/Lib/site-packages/pip/_vendor/pytoml/parser.py create mode 100644 env/Lib/site-packages/pip/_vendor/pytoml/test.py create mode 100644 env/Lib/site-packages/pip/_vendor/pytoml/utils.py create mode 100644 env/Lib/site-packages/pip/_vendor/pytoml/writer.py create mode 100644 env/Lib/site-packages/pip/_vendor/requests/__init__.py create mode 100644 env/Lib/site-packages/pip/_vendor/requests/__pycache__/__init__.cpython-37.pyc create mode 100644 env/Lib/site-packages/pip/_vendor/requests/__pycache__/__version__.cpython-37.pyc create mode 100644 env/Lib/site-packages/pip/_vendor/requests/__pycache__/_internal_utils.cpython-37.pyc create mode 100644 env/Lib/site-packages/pip/_vendor/requests/__pycache__/adapters.cpython-37.pyc create mode 100644 env/Lib/site-packages/pip/_vendor/requests/__pycache__/api.cpython-37.pyc create mode 100644 env/Lib/site-packages/pip/_vendor/requests/__pycache__/auth.cpython-37.pyc create mode 100644 env/Lib/site-packages/pip/_vendor/requests/__pycache__/certs.cpython-37.pyc create mode 100644 env/Lib/site-packages/pip/_vendor/requests/__pycache__/compat.cpython-37.pyc create mode 100644 env/Lib/site-packages/pip/_vendor/requests/__pycache__/cookies.cpython-37.pyc create mode 100644 env/Lib/site-packages/pip/_vendor/requests/__pycache__/exceptions.cpython-37.pyc create mode 100644 env/Lib/site-packages/pip/_vendor/requests/__pycache__/help.cpython-37.pyc create mode 100644 env/Lib/site-packages/pip/_vendor/requests/__pycache__/hooks.cpython-37.pyc create mode 100644 env/Lib/site-packages/pip/_vendor/requests/__pycache__/models.cpython-37.pyc create mode 100644 env/Lib/site-packages/pip/_vendor/requests/__pycache__/packages.cpython-37.pyc create mode 100644 env/Lib/site-packages/pip/_vendor/requests/__pycache__/sessions.cpython-37.pyc create mode 100644 env/Lib/site-packages/pip/_vendor/requests/__pycache__/status_codes.cpython-37.pyc create mode 100644 env/Lib/site-packages/pip/_vendor/requests/__pycache__/structures.cpython-37.pyc create mode 100644 env/Lib/site-packages/pip/_vendor/requests/__pycache__/utils.cpython-37.pyc create mode 100644 env/Lib/site-packages/pip/_vendor/requests/__version__.py create mode 100644 env/Lib/site-packages/pip/_vendor/requests/_internal_utils.py create mode 100644 env/Lib/site-packages/pip/_vendor/requests/adapters.py create mode 100644 env/Lib/site-packages/pip/_vendor/requests/api.py create mode 100644 env/Lib/site-packages/pip/_vendor/requests/auth.py create mode 100644 env/Lib/site-packages/pip/_vendor/requests/certs.py create mode 100644 env/Lib/site-packages/pip/_vendor/requests/compat.py create mode 100644 env/Lib/site-packages/pip/_vendor/requests/cookies.py create mode 100644 env/Lib/site-packages/pip/_vendor/requests/exceptions.py create mode 100644 env/Lib/site-packages/pip/_vendor/requests/help.py create mode 100644 env/Lib/site-packages/pip/_vendor/requests/hooks.py create mode 100644 env/Lib/site-packages/pip/_vendor/requests/models.py create mode 100644 env/Lib/site-packages/pip/_vendor/requests/packages.py create mode 100644 env/Lib/site-packages/pip/_vendor/requests/sessions.py create mode 100644 env/Lib/site-packages/pip/_vendor/requests/status_codes.py create mode 100644 env/Lib/site-packages/pip/_vendor/requests/structures.py create mode 100644 env/Lib/site-packages/pip/_vendor/requests/utils.py create mode 100644 env/Lib/site-packages/pip/_vendor/retrying.py create mode 100644 env/Lib/site-packages/pip/_vendor/six.py create mode 100644 env/Lib/site-packages/pip/_vendor/urllib3/__init__.py create mode 100644 env/Lib/site-packages/pip/_vendor/urllib3/__pycache__/__init__.cpython-37.pyc create mode 100644 env/Lib/site-packages/pip/_vendor/urllib3/__pycache__/_collections.cpython-37.pyc create mode 100644 env/Lib/site-packages/pip/_vendor/urllib3/__pycache__/connection.cpython-37.pyc create mode 100644 env/Lib/site-packages/pip/_vendor/urllib3/__pycache__/connectionpool.cpython-37.pyc create mode 100644 env/Lib/site-packages/pip/_vendor/urllib3/__pycache__/exceptions.cpython-37.pyc create mode 100644 env/Lib/site-packages/pip/_vendor/urllib3/__pycache__/fields.cpython-37.pyc create mode 100644 env/Lib/site-packages/pip/_vendor/urllib3/__pycache__/filepost.cpython-37.pyc create mode 100644 env/Lib/site-packages/pip/_vendor/urllib3/__pycache__/poolmanager.cpython-37.pyc create mode 100644 env/Lib/site-packages/pip/_vendor/urllib3/__pycache__/request.cpython-37.pyc create mode 100644 env/Lib/site-packages/pip/_vendor/urllib3/__pycache__/response.cpython-37.pyc create mode 100644 env/Lib/site-packages/pip/_vendor/urllib3/_collections.py create mode 100644 env/Lib/site-packages/pip/_vendor/urllib3/connection.py create mode 100644 env/Lib/site-packages/pip/_vendor/urllib3/connectionpool.py create mode 100644 env/Lib/site-packages/pip/_vendor/urllib3/contrib/__init__.py create mode 100644 env/Lib/site-packages/pip/_vendor/urllib3/contrib/__pycache__/__init__.cpython-37.pyc create mode 100644 env/Lib/site-packages/pip/_vendor/urllib3/contrib/__pycache__/_appengine_environ.cpython-37.pyc create mode 100644 env/Lib/site-packages/pip/_vendor/urllib3/contrib/__pycache__/appengine.cpython-37.pyc create mode 100644 env/Lib/site-packages/pip/_vendor/urllib3/contrib/__pycache__/ntlmpool.cpython-37.pyc create mode 100644 env/Lib/site-packages/pip/_vendor/urllib3/contrib/__pycache__/pyopenssl.cpython-37.pyc create mode 100644 env/Lib/site-packages/pip/_vendor/urllib3/contrib/__pycache__/securetransport.cpython-37.pyc create mode 100644 env/Lib/site-packages/pip/_vendor/urllib3/contrib/__pycache__/socks.cpython-37.pyc create mode 100644 env/Lib/site-packages/pip/_vendor/urllib3/contrib/_appengine_environ.py create mode 100644 env/Lib/site-packages/pip/_vendor/urllib3/contrib/_securetransport/__init__.py create mode 100644 env/Lib/site-packages/pip/_vendor/urllib3/contrib/_securetransport/__pycache__/__init__.cpython-37.pyc create mode 100644 env/Lib/site-packages/pip/_vendor/urllib3/contrib/_securetransport/__pycache__/bindings.cpython-37.pyc create mode 100644 env/Lib/site-packages/pip/_vendor/urllib3/contrib/_securetransport/__pycache__/low_level.cpython-37.pyc create mode 100644 env/Lib/site-packages/pip/_vendor/urllib3/contrib/_securetransport/bindings.py create mode 100644 env/Lib/site-packages/pip/_vendor/urllib3/contrib/_securetransport/low_level.py create mode 100644 env/Lib/site-packages/pip/_vendor/urllib3/contrib/appengine.py create mode 100644 env/Lib/site-packages/pip/_vendor/urllib3/contrib/ntlmpool.py create mode 100644 env/Lib/site-packages/pip/_vendor/urllib3/contrib/pyopenssl.py create mode 100644 env/Lib/site-packages/pip/_vendor/urllib3/contrib/securetransport.py create mode 100644 env/Lib/site-packages/pip/_vendor/urllib3/contrib/socks.py create mode 100644 env/Lib/site-packages/pip/_vendor/urllib3/exceptions.py create mode 100644 env/Lib/site-packages/pip/_vendor/urllib3/fields.py create mode 100644 env/Lib/site-packages/pip/_vendor/urllib3/filepost.py create mode 100644 env/Lib/site-packages/pip/_vendor/urllib3/packages/__init__.py create mode 100644 env/Lib/site-packages/pip/_vendor/urllib3/packages/__pycache__/__init__.cpython-37.pyc create mode 100644 env/Lib/site-packages/pip/_vendor/urllib3/packages/__pycache__/six.cpython-37.pyc create mode 100644 env/Lib/site-packages/pip/_vendor/urllib3/packages/backports/__init__.py create mode 100644 env/Lib/site-packages/pip/_vendor/urllib3/packages/backports/__pycache__/__init__.cpython-37.pyc create mode 100644 env/Lib/site-packages/pip/_vendor/urllib3/packages/backports/__pycache__/makefile.cpython-37.pyc create mode 100644 env/Lib/site-packages/pip/_vendor/urllib3/packages/backports/makefile.py create mode 100644 env/Lib/site-packages/pip/_vendor/urllib3/packages/six.py create mode 100644 env/Lib/site-packages/pip/_vendor/urllib3/packages/ssl_match_hostname/__init__.py create mode 100644 env/Lib/site-packages/pip/_vendor/urllib3/packages/ssl_match_hostname/__pycache__/__init__.cpython-37.pyc create mode 100644 env/Lib/site-packages/pip/_vendor/urllib3/packages/ssl_match_hostname/__pycache__/_implementation.cpython-37.pyc create mode 100644 env/Lib/site-packages/pip/_vendor/urllib3/packages/ssl_match_hostname/_implementation.py create mode 100644 env/Lib/site-packages/pip/_vendor/urllib3/poolmanager.py create mode 100644 env/Lib/site-packages/pip/_vendor/urllib3/request.py create mode 100644 env/Lib/site-packages/pip/_vendor/urllib3/response.py create mode 100644 env/Lib/site-packages/pip/_vendor/urllib3/util/__init__.py create mode 100644 env/Lib/site-packages/pip/_vendor/urllib3/util/__pycache__/__init__.cpython-37.pyc create mode 100644 env/Lib/site-packages/pip/_vendor/urllib3/util/__pycache__/connection.cpython-37.pyc create mode 100644 env/Lib/site-packages/pip/_vendor/urllib3/util/__pycache__/queue.cpython-37.pyc create mode 100644 env/Lib/site-packages/pip/_vendor/urllib3/util/__pycache__/request.cpython-37.pyc create mode 100644 env/Lib/site-packages/pip/_vendor/urllib3/util/__pycache__/response.cpython-37.pyc create mode 100644 env/Lib/site-packages/pip/_vendor/urllib3/util/__pycache__/retry.cpython-37.pyc create mode 100644 env/Lib/site-packages/pip/_vendor/urllib3/util/__pycache__/ssl_.cpython-37.pyc create mode 100644 env/Lib/site-packages/pip/_vendor/urllib3/util/__pycache__/timeout.cpython-37.pyc create mode 100644 env/Lib/site-packages/pip/_vendor/urllib3/util/__pycache__/url.cpython-37.pyc create mode 100644 env/Lib/site-packages/pip/_vendor/urllib3/util/__pycache__/wait.cpython-37.pyc create mode 100644 env/Lib/site-packages/pip/_vendor/urllib3/util/connection.py create mode 100644 env/Lib/site-packages/pip/_vendor/urllib3/util/queue.py create mode 100644 env/Lib/site-packages/pip/_vendor/urllib3/util/request.py create mode 100644 env/Lib/site-packages/pip/_vendor/urllib3/util/response.py create mode 100644 env/Lib/site-packages/pip/_vendor/urllib3/util/retry.py create mode 100644 env/Lib/site-packages/pip/_vendor/urllib3/util/ssl_.py create mode 100644 env/Lib/site-packages/pip/_vendor/urllib3/util/timeout.py create mode 100644 env/Lib/site-packages/pip/_vendor/urllib3/util/url.py create mode 100644 env/Lib/site-packages/pip/_vendor/urllib3/util/wait.py create mode 100644 env/Lib/site-packages/pip/_vendor/webencodings/__init__.py create mode 100644 env/Lib/site-packages/pip/_vendor/webencodings/__pycache__/__init__.cpython-37.pyc create mode 100644 env/Lib/site-packages/pip/_vendor/webencodings/__pycache__/labels.cpython-37.pyc create mode 100644 env/Lib/site-packages/pip/_vendor/webencodings/__pycache__/mklabels.cpython-37.pyc create mode 100644 env/Lib/site-packages/pip/_vendor/webencodings/__pycache__/tests.cpython-37.pyc create mode 100644 env/Lib/site-packages/pip/_vendor/webencodings/__pycache__/x_user_defined.cpython-37.pyc create mode 100644 env/Lib/site-packages/pip/_vendor/webencodings/labels.py create mode 100644 env/Lib/site-packages/pip/_vendor/webencodings/mklabels.py create mode 100644 env/Lib/site-packages/pip/_vendor/webencodings/tests.py create mode 100644 env/Lib/site-packages/pip/_vendor/webencodings/x_user_defined.py create mode 100644 env/Lib/site-packages/pkg_resources/__init__.py create mode 100644 env/Lib/site-packages/pkg_resources/__pycache__/__init__.cpython-37.pyc create mode 100644 env/Lib/site-packages/pkg_resources/__pycache__/py31compat.cpython-37.pyc create mode 100644 env/Lib/site-packages/pkg_resources/_vendor/__init__.py create mode 100644 env/Lib/site-packages/pkg_resources/_vendor/__pycache__/__init__.cpython-37.pyc create mode 100644 env/Lib/site-packages/pkg_resources/_vendor/__pycache__/appdirs.cpython-37.pyc create mode 100644 env/Lib/site-packages/pkg_resources/_vendor/__pycache__/pyparsing.cpython-37.pyc create mode 100644 env/Lib/site-packages/pkg_resources/_vendor/__pycache__/six.cpython-37.pyc create mode 100644 env/Lib/site-packages/pkg_resources/_vendor/appdirs.py create mode 100644 env/Lib/site-packages/pkg_resources/_vendor/packaging/__about__.py create mode 100644 env/Lib/site-packages/pkg_resources/_vendor/packaging/__init__.py create mode 100644 env/Lib/site-packages/pkg_resources/_vendor/packaging/__pycache__/__about__.cpython-37.pyc create mode 100644 env/Lib/site-packages/pkg_resources/_vendor/packaging/__pycache__/__init__.cpython-37.pyc create mode 100644 env/Lib/site-packages/pkg_resources/_vendor/packaging/__pycache__/_compat.cpython-37.pyc create mode 100644 env/Lib/site-packages/pkg_resources/_vendor/packaging/__pycache__/_structures.cpython-37.pyc create mode 100644 env/Lib/site-packages/pkg_resources/_vendor/packaging/__pycache__/markers.cpython-37.pyc create mode 100644 env/Lib/site-packages/pkg_resources/_vendor/packaging/__pycache__/requirements.cpython-37.pyc create mode 100644 env/Lib/site-packages/pkg_resources/_vendor/packaging/__pycache__/specifiers.cpython-37.pyc create mode 100644 env/Lib/site-packages/pkg_resources/_vendor/packaging/__pycache__/utils.cpython-37.pyc create mode 100644 env/Lib/site-packages/pkg_resources/_vendor/packaging/__pycache__/version.cpython-37.pyc create mode 100644 env/Lib/site-packages/pkg_resources/_vendor/packaging/_compat.py create mode 100644 env/Lib/site-packages/pkg_resources/_vendor/packaging/_structures.py create mode 100644 env/Lib/site-packages/pkg_resources/_vendor/packaging/markers.py create mode 100644 env/Lib/site-packages/pkg_resources/_vendor/packaging/requirements.py create mode 100644 env/Lib/site-packages/pkg_resources/_vendor/packaging/specifiers.py create mode 100644 env/Lib/site-packages/pkg_resources/_vendor/packaging/utils.py create mode 100644 env/Lib/site-packages/pkg_resources/_vendor/packaging/version.py create mode 100644 env/Lib/site-packages/pkg_resources/_vendor/pyparsing.py create mode 100644 env/Lib/site-packages/pkg_resources/_vendor/six.py create mode 100644 env/Lib/site-packages/pkg_resources/extern/__init__.py create mode 100644 env/Lib/site-packages/pkg_resources/extern/__pycache__/__init__.cpython-37.pyc create mode 100644 env/Lib/site-packages/pkg_resources/py31compat.py create mode 100644 env/Lib/site-packages/setuptools-42.0.2.dist-info/INSTALLER create mode 100644 env/Lib/site-packages/setuptools-42.0.2.dist-info/LICENSE create mode 100644 env/Lib/site-packages/setuptools-42.0.2.dist-info/METADATA create mode 100644 env/Lib/site-packages/setuptools-42.0.2.dist-info/RECORD create mode 100644 env/Lib/site-packages/setuptools-42.0.2.dist-info/WHEEL create mode 100644 env/Lib/site-packages/setuptools-42.0.2.dist-info/dependency_links.txt create mode 100644 env/Lib/site-packages/setuptools-42.0.2.dist-info/entry_points.txt create mode 100644 env/Lib/site-packages/setuptools-42.0.2.dist-info/top_level.txt create mode 100644 env/Lib/site-packages/setuptools-42.0.2.dist-info/zip-safe create mode 100644 env/Lib/site-packages/setuptools/__init__.py create mode 100644 env/Lib/site-packages/setuptools/__pycache__/__init__.cpython-37.pyc create mode 100644 env/Lib/site-packages/setuptools/__pycache__/_deprecation_warning.cpython-37.pyc create mode 100644 env/Lib/site-packages/setuptools/__pycache__/_imp.cpython-37.pyc create mode 100644 env/Lib/site-packages/setuptools/__pycache__/archive_util.cpython-37.pyc create mode 100644 env/Lib/site-packages/setuptools/__pycache__/build_meta.cpython-37.pyc create mode 100644 env/Lib/site-packages/setuptools/__pycache__/config.cpython-37.pyc create mode 100644 env/Lib/site-packages/setuptools/__pycache__/dep_util.cpython-37.pyc create mode 100644 env/Lib/site-packages/setuptools/__pycache__/depends.cpython-37.pyc create mode 100644 env/Lib/site-packages/setuptools/__pycache__/dist.cpython-37.pyc create mode 100644 env/Lib/site-packages/setuptools/__pycache__/errors.cpython-37.pyc create mode 100644 env/Lib/site-packages/setuptools/__pycache__/extension.cpython-37.pyc create mode 100644 env/Lib/site-packages/setuptools/__pycache__/glob.cpython-37.pyc create mode 100644 env/Lib/site-packages/setuptools/__pycache__/installer.cpython-37.pyc create mode 100644 env/Lib/site-packages/setuptools/__pycache__/launch.cpython-37.pyc create mode 100644 env/Lib/site-packages/setuptools/__pycache__/lib2to3_ex.cpython-37.pyc create mode 100644 env/Lib/site-packages/setuptools/__pycache__/monkey.cpython-37.pyc create mode 100644 env/Lib/site-packages/setuptools/__pycache__/msvc.cpython-37.pyc create mode 100644 env/Lib/site-packages/setuptools/__pycache__/namespaces.cpython-37.pyc create mode 100644 env/Lib/site-packages/setuptools/__pycache__/package_index.cpython-37.pyc create mode 100644 env/Lib/site-packages/setuptools/__pycache__/py27compat.cpython-37.pyc create mode 100644 env/Lib/site-packages/setuptools/__pycache__/py31compat.cpython-37.pyc create mode 100644 env/Lib/site-packages/setuptools/__pycache__/py33compat.cpython-37.pyc create mode 100644 env/Lib/site-packages/setuptools/__pycache__/py34compat.cpython-37.pyc create mode 100644 env/Lib/site-packages/setuptools/__pycache__/sandbox.cpython-37.pyc create mode 100644 env/Lib/site-packages/setuptools/__pycache__/site-patch.cpython-37.pyc create mode 100644 env/Lib/site-packages/setuptools/__pycache__/ssl_support.cpython-37.pyc create mode 100644 env/Lib/site-packages/setuptools/__pycache__/unicode_utils.cpython-37.pyc create mode 100644 env/Lib/site-packages/setuptools/__pycache__/version.cpython-37.pyc create mode 100644 env/Lib/site-packages/setuptools/__pycache__/wheel.cpython-37.pyc create mode 100644 env/Lib/site-packages/setuptools/__pycache__/windows_support.cpython-37.pyc create mode 100644 env/Lib/site-packages/setuptools/_deprecation_warning.py create mode 100644 env/Lib/site-packages/setuptools/_imp.py create mode 100644 env/Lib/site-packages/setuptools/_vendor/__init__.py create mode 100644 env/Lib/site-packages/setuptools/_vendor/__pycache__/__init__.cpython-37.pyc create mode 100644 env/Lib/site-packages/setuptools/_vendor/__pycache__/ordered_set.cpython-37.pyc create mode 100644 env/Lib/site-packages/setuptools/_vendor/__pycache__/pyparsing.cpython-37.pyc create mode 100644 env/Lib/site-packages/setuptools/_vendor/__pycache__/six.cpython-37.pyc create mode 100644 env/Lib/site-packages/setuptools/_vendor/ordered_set.py create mode 100644 env/Lib/site-packages/setuptools/_vendor/packaging/__about__.py create mode 100644 env/Lib/site-packages/setuptools/_vendor/packaging/__init__.py create mode 100644 env/Lib/site-packages/setuptools/_vendor/packaging/__pycache__/__about__.cpython-37.pyc create mode 100644 env/Lib/site-packages/setuptools/_vendor/packaging/__pycache__/__init__.cpython-37.pyc create mode 100644 env/Lib/site-packages/setuptools/_vendor/packaging/__pycache__/_compat.cpython-37.pyc create mode 100644 env/Lib/site-packages/setuptools/_vendor/packaging/__pycache__/_structures.cpython-37.pyc create mode 100644 env/Lib/site-packages/setuptools/_vendor/packaging/__pycache__/markers.cpython-37.pyc create mode 100644 env/Lib/site-packages/setuptools/_vendor/packaging/__pycache__/requirements.cpython-37.pyc create mode 100644 env/Lib/site-packages/setuptools/_vendor/packaging/__pycache__/specifiers.cpython-37.pyc create mode 100644 env/Lib/site-packages/setuptools/_vendor/packaging/__pycache__/tags.cpython-37.pyc create mode 100644 env/Lib/site-packages/setuptools/_vendor/packaging/__pycache__/utils.cpython-37.pyc create mode 100644 env/Lib/site-packages/setuptools/_vendor/packaging/__pycache__/version.cpython-37.pyc create mode 100644 env/Lib/site-packages/setuptools/_vendor/packaging/_compat.py create mode 100644 env/Lib/site-packages/setuptools/_vendor/packaging/_structures.py create mode 100644 env/Lib/site-packages/setuptools/_vendor/packaging/markers.py create mode 100644 env/Lib/site-packages/setuptools/_vendor/packaging/requirements.py create mode 100644 env/Lib/site-packages/setuptools/_vendor/packaging/specifiers.py create mode 100644 env/Lib/site-packages/setuptools/_vendor/packaging/tags.py create mode 100644 env/Lib/site-packages/setuptools/_vendor/packaging/utils.py create mode 100644 env/Lib/site-packages/setuptools/_vendor/packaging/version.py create mode 100644 env/Lib/site-packages/setuptools/_vendor/pyparsing.py create mode 100644 env/Lib/site-packages/setuptools/_vendor/six.py create mode 100644 env/Lib/site-packages/setuptools/archive_util.py create mode 100644 env/Lib/site-packages/setuptools/build_meta.py create mode 100644 env/Lib/site-packages/setuptools/cli-32.exe create mode 100644 env/Lib/site-packages/setuptools/cli-64.exe create mode 100644 env/Lib/site-packages/setuptools/cli.exe create mode 100644 env/Lib/site-packages/setuptools/command/__init__.py create mode 100644 env/Lib/site-packages/setuptools/command/__pycache__/__init__.cpython-37.pyc create mode 100644 env/Lib/site-packages/setuptools/command/__pycache__/alias.cpython-37.pyc create mode 100644 env/Lib/site-packages/setuptools/command/__pycache__/bdist_egg.cpython-37.pyc create mode 100644 env/Lib/site-packages/setuptools/command/__pycache__/bdist_rpm.cpython-37.pyc create mode 100644 env/Lib/site-packages/setuptools/command/__pycache__/bdist_wininst.cpython-37.pyc create mode 100644 env/Lib/site-packages/setuptools/command/__pycache__/build_clib.cpython-37.pyc create mode 100644 env/Lib/site-packages/setuptools/command/__pycache__/build_ext.cpython-37.pyc create mode 100644 env/Lib/site-packages/setuptools/command/__pycache__/build_py.cpython-37.pyc create mode 100644 env/Lib/site-packages/setuptools/command/__pycache__/develop.cpython-37.pyc create mode 100644 env/Lib/site-packages/setuptools/command/__pycache__/dist_info.cpython-37.pyc create mode 100644 env/Lib/site-packages/setuptools/command/__pycache__/easy_install.cpython-37.pyc create mode 100644 env/Lib/site-packages/setuptools/command/__pycache__/egg_info.cpython-37.pyc create mode 100644 env/Lib/site-packages/setuptools/command/__pycache__/install.cpython-37.pyc create mode 100644 env/Lib/site-packages/setuptools/command/__pycache__/install_egg_info.cpython-37.pyc create mode 100644 env/Lib/site-packages/setuptools/command/__pycache__/install_lib.cpython-37.pyc create mode 100644 env/Lib/site-packages/setuptools/command/__pycache__/install_scripts.cpython-37.pyc create mode 100644 env/Lib/site-packages/setuptools/command/__pycache__/py36compat.cpython-37.pyc create mode 100644 env/Lib/site-packages/setuptools/command/__pycache__/register.cpython-37.pyc create mode 100644 env/Lib/site-packages/setuptools/command/__pycache__/rotate.cpython-37.pyc create mode 100644 env/Lib/site-packages/setuptools/command/__pycache__/saveopts.cpython-37.pyc create mode 100644 env/Lib/site-packages/setuptools/command/__pycache__/sdist.cpython-37.pyc create mode 100644 env/Lib/site-packages/setuptools/command/__pycache__/setopt.cpython-37.pyc create mode 100644 env/Lib/site-packages/setuptools/command/__pycache__/test.cpython-37.pyc create mode 100644 env/Lib/site-packages/setuptools/command/__pycache__/upload.cpython-37.pyc create mode 100644 env/Lib/site-packages/setuptools/command/__pycache__/upload_docs.cpython-37.pyc create mode 100644 env/Lib/site-packages/setuptools/command/alias.py create mode 100644 env/Lib/site-packages/setuptools/command/bdist_egg.py create mode 100644 env/Lib/site-packages/setuptools/command/bdist_rpm.py create mode 100644 env/Lib/site-packages/setuptools/command/bdist_wininst.py create mode 100644 env/Lib/site-packages/setuptools/command/build_clib.py create mode 100644 env/Lib/site-packages/setuptools/command/build_ext.py create mode 100644 env/Lib/site-packages/setuptools/command/build_py.py create mode 100644 env/Lib/site-packages/setuptools/command/develop.py create mode 100644 env/Lib/site-packages/setuptools/command/dist_info.py create mode 100644 env/Lib/site-packages/setuptools/command/easy_install.py create mode 100644 env/Lib/site-packages/setuptools/command/egg_info.py create mode 100644 env/Lib/site-packages/setuptools/command/install.py create mode 100644 env/Lib/site-packages/setuptools/command/install_egg_info.py create mode 100644 env/Lib/site-packages/setuptools/command/install_lib.py create mode 100644 env/Lib/site-packages/setuptools/command/install_scripts.py create mode 100644 env/Lib/site-packages/setuptools/command/launcher manifest.xml create mode 100644 env/Lib/site-packages/setuptools/command/py36compat.py create mode 100644 env/Lib/site-packages/setuptools/command/register.py create mode 100644 env/Lib/site-packages/setuptools/command/rotate.py create mode 100644 env/Lib/site-packages/setuptools/command/saveopts.py create mode 100644 env/Lib/site-packages/setuptools/command/sdist.py create mode 100644 env/Lib/site-packages/setuptools/command/setopt.py create mode 100644 env/Lib/site-packages/setuptools/command/test.py create mode 100644 env/Lib/site-packages/setuptools/command/upload.py create mode 100644 env/Lib/site-packages/setuptools/command/upload_docs.py create mode 100644 env/Lib/site-packages/setuptools/config.py create mode 100644 env/Lib/site-packages/setuptools/dep_util.py create mode 100644 env/Lib/site-packages/setuptools/depends.py create mode 100644 env/Lib/site-packages/setuptools/dist.py create mode 100644 env/Lib/site-packages/setuptools/errors.py create mode 100644 env/Lib/site-packages/setuptools/extension.py create mode 100644 env/Lib/site-packages/setuptools/extern/__init__.py create mode 100644 env/Lib/site-packages/setuptools/extern/__pycache__/__init__.cpython-37.pyc create mode 100644 env/Lib/site-packages/setuptools/glob.py create mode 100644 env/Lib/site-packages/setuptools/gui-32.exe create mode 100644 env/Lib/site-packages/setuptools/gui-64.exe create mode 100644 env/Lib/site-packages/setuptools/gui.exe create mode 100644 env/Lib/site-packages/setuptools/installer.py create mode 100644 env/Lib/site-packages/setuptools/launch.py create mode 100644 env/Lib/site-packages/setuptools/lib2to3_ex.py create mode 100644 env/Lib/site-packages/setuptools/monkey.py create mode 100644 env/Lib/site-packages/setuptools/msvc.py create mode 100644 env/Lib/site-packages/setuptools/namespaces.py create mode 100644 env/Lib/site-packages/setuptools/package_index.py create mode 100644 env/Lib/site-packages/setuptools/py27compat.py create mode 100644 env/Lib/site-packages/setuptools/py31compat.py create mode 100644 env/Lib/site-packages/setuptools/py33compat.py create mode 100644 env/Lib/site-packages/setuptools/py34compat.py create mode 100644 env/Lib/site-packages/setuptools/sandbox.py create mode 100644 env/Lib/site-packages/setuptools/script (dev).tmpl create mode 100644 env/Lib/site-packages/setuptools/script.tmpl create mode 100644 env/Lib/site-packages/setuptools/site-patch.py create mode 100644 env/Lib/site-packages/setuptools/ssl_support.py create mode 100644 env/Lib/site-packages/setuptools/unicode_utils.py create mode 100644 env/Lib/site-packages/setuptools/version.py create mode 100644 env/Lib/site-packages/setuptools/wheel.py create mode 100644 env/Lib/site-packages/setuptools/windows_support.py create mode 100644 env/Lib/site-packages/werkzeug/__init__.py create mode 100644 env/Lib/site-packages/werkzeug/__pycache__/__init__.cpython-37.pyc create mode 100644 env/Lib/site-packages/werkzeug/__pycache__/_compat.cpython-37.pyc create mode 100644 env/Lib/site-packages/werkzeug/__pycache__/_internal.cpython-37.pyc create mode 100644 env/Lib/site-packages/werkzeug/__pycache__/_reloader.cpython-37.pyc create mode 100644 env/Lib/site-packages/werkzeug/__pycache__/datastructures.cpython-37.pyc create mode 100644 env/Lib/site-packages/werkzeug/__pycache__/exceptions.cpython-37.pyc create mode 100644 env/Lib/site-packages/werkzeug/__pycache__/filesystem.cpython-37.pyc create mode 100644 env/Lib/site-packages/werkzeug/__pycache__/formparser.cpython-37.pyc create mode 100644 env/Lib/site-packages/werkzeug/__pycache__/http.cpython-37.pyc create mode 100644 env/Lib/site-packages/werkzeug/__pycache__/local.cpython-37.pyc create mode 100644 env/Lib/site-packages/werkzeug/__pycache__/posixemulation.cpython-37.pyc create mode 100644 env/Lib/site-packages/werkzeug/__pycache__/routing.cpython-37.pyc create mode 100644 env/Lib/site-packages/werkzeug/__pycache__/security.cpython-37.pyc create mode 100644 env/Lib/site-packages/werkzeug/__pycache__/serving.cpython-37.pyc create mode 100644 env/Lib/site-packages/werkzeug/__pycache__/test.cpython-37.pyc create mode 100644 env/Lib/site-packages/werkzeug/__pycache__/testapp.cpython-37.pyc create mode 100644 env/Lib/site-packages/werkzeug/__pycache__/urls.cpython-37.pyc create mode 100644 env/Lib/site-packages/werkzeug/__pycache__/useragents.cpython-37.pyc create mode 100644 env/Lib/site-packages/werkzeug/__pycache__/utils.cpython-37.pyc create mode 100644 env/Lib/site-packages/werkzeug/__pycache__/wsgi.cpython-37.pyc create mode 100644 env/Lib/site-packages/werkzeug/_compat.py create mode 100644 env/Lib/site-packages/werkzeug/_internal.py create mode 100644 env/Lib/site-packages/werkzeug/_reloader.py create mode 100644 env/Lib/site-packages/werkzeug/contrib/__init__.py create mode 100644 env/Lib/site-packages/werkzeug/contrib/__pycache__/__init__.cpython-37.pyc create mode 100644 env/Lib/site-packages/werkzeug/contrib/__pycache__/atom.cpython-37.pyc create mode 100644 env/Lib/site-packages/werkzeug/contrib/__pycache__/cache.cpython-37.pyc create mode 100644 env/Lib/site-packages/werkzeug/contrib/__pycache__/fixers.cpython-37.pyc create mode 100644 env/Lib/site-packages/werkzeug/contrib/__pycache__/iterio.cpython-37.pyc create mode 100644 env/Lib/site-packages/werkzeug/contrib/__pycache__/lint.cpython-37.pyc create mode 100644 env/Lib/site-packages/werkzeug/contrib/__pycache__/profiler.cpython-37.pyc create mode 100644 env/Lib/site-packages/werkzeug/contrib/__pycache__/securecookie.cpython-37.pyc create mode 100644 env/Lib/site-packages/werkzeug/contrib/__pycache__/sessions.cpython-37.pyc create mode 100644 env/Lib/site-packages/werkzeug/contrib/__pycache__/wrappers.cpython-37.pyc create mode 100644 env/Lib/site-packages/werkzeug/contrib/atom.py create mode 100644 env/Lib/site-packages/werkzeug/contrib/cache.py create mode 100644 env/Lib/site-packages/werkzeug/contrib/fixers.py create mode 100644 env/Lib/site-packages/werkzeug/contrib/iterio.py create mode 100644 env/Lib/site-packages/werkzeug/contrib/lint.py create mode 100644 env/Lib/site-packages/werkzeug/contrib/profiler.py create mode 100644 env/Lib/site-packages/werkzeug/contrib/securecookie.py create mode 100644 env/Lib/site-packages/werkzeug/contrib/sessions.py create mode 100644 env/Lib/site-packages/werkzeug/contrib/wrappers.py create mode 100644 env/Lib/site-packages/werkzeug/datastructures.py create mode 100644 env/Lib/site-packages/werkzeug/debug/__init__.py create mode 100644 env/Lib/site-packages/werkzeug/debug/__pycache__/__init__.cpython-37.pyc create mode 100644 env/Lib/site-packages/werkzeug/debug/__pycache__/console.cpython-37.pyc create mode 100644 env/Lib/site-packages/werkzeug/debug/__pycache__/repr.cpython-37.pyc create mode 100644 env/Lib/site-packages/werkzeug/debug/__pycache__/tbtools.cpython-37.pyc create mode 100644 env/Lib/site-packages/werkzeug/debug/console.py create mode 100644 env/Lib/site-packages/werkzeug/debug/repr.py create mode 100644 env/Lib/site-packages/werkzeug/debug/shared/FONT_LICENSE create mode 100644 env/Lib/site-packages/werkzeug/debug/shared/console.png create mode 100644 env/Lib/site-packages/werkzeug/debug/shared/debugger.js create mode 100644 env/Lib/site-packages/werkzeug/debug/shared/jquery.js create mode 100644 env/Lib/site-packages/werkzeug/debug/shared/less.png create mode 100644 env/Lib/site-packages/werkzeug/debug/shared/more.png create mode 100644 env/Lib/site-packages/werkzeug/debug/shared/source.png create mode 100644 env/Lib/site-packages/werkzeug/debug/shared/style.css create mode 100644 env/Lib/site-packages/werkzeug/debug/shared/ubuntu.ttf create mode 100644 env/Lib/site-packages/werkzeug/debug/tbtools.py create mode 100644 env/Lib/site-packages/werkzeug/exceptions.py create mode 100644 env/Lib/site-packages/werkzeug/filesystem.py create mode 100644 env/Lib/site-packages/werkzeug/formparser.py create mode 100644 env/Lib/site-packages/werkzeug/http.py create mode 100644 env/Lib/site-packages/werkzeug/local.py create mode 100644 env/Lib/site-packages/werkzeug/middleware/__init__.py create mode 100644 env/Lib/site-packages/werkzeug/middleware/__pycache__/__init__.cpython-37.pyc create mode 100644 env/Lib/site-packages/werkzeug/middleware/__pycache__/dispatcher.cpython-37.pyc create mode 100644 env/Lib/site-packages/werkzeug/middleware/__pycache__/http_proxy.cpython-37.pyc create mode 100644 env/Lib/site-packages/werkzeug/middleware/__pycache__/lint.cpython-37.pyc create mode 100644 env/Lib/site-packages/werkzeug/middleware/__pycache__/profiler.cpython-37.pyc create mode 100644 env/Lib/site-packages/werkzeug/middleware/__pycache__/proxy_fix.cpython-37.pyc create mode 100644 env/Lib/site-packages/werkzeug/middleware/__pycache__/shared_data.cpython-37.pyc create mode 100644 env/Lib/site-packages/werkzeug/middleware/dispatcher.py create mode 100644 env/Lib/site-packages/werkzeug/middleware/http_proxy.py create mode 100644 env/Lib/site-packages/werkzeug/middleware/lint.py create mode 100644 env/Lib/site-packages/werkzeug/middleware/profiler.py create mode 100644 env/Lib/site-packages/werkzeug/middleware/proxy_fix.py create mode 100644 env/Lib/site-packages/werkzeug/middleware/shared_data.py create mode 100644 env/Lib/site-packages/werkzeug/posixemulation.py create mode 100644 env/Lib/site-packages/werkzeug/routing.py create mode 100644 env/Lib/site-packages/werkzeug/security.py create mode 100644 env/Lib/site-packages/werkzeug/serving.py create mode 100644 env/Lib/site-packages/werkzeug/test.py create mode 100644 env/Lib/site-packages/werkzeug/testapp.py create mode 100644 env/Lib/site-packages/werkzeug/urls.py create mode 100644 env/Lib/site-packages/werkzeug/useragents.py create mode 100644 env/Lib/site-packages/werkzeug/utils.py create mode 100644 env/Lib/site-packages/werkzeug/wrappers/__init__.py create mode 100644 env/Lib/site-packages/werkzeug/wrappers/__pycache__/__init__.cpython-37.pyc create mode 100644 env/Lib/site-packages/werkzeug/wrappers/__pycache__/accept.cpython-37.pyc create mode 100644 env/Lib/site-packages/werkzeug/wrappers/__pycache__/auth.cpython-37.pyc create mode 100644 env/Lib/site-packages/werkzeug/wrappers/__pycache__/base_request.cpython-37.pyc create mode 100644 env/Lib/site-packages/werkzeug/wrappers/__pycache__/base_response.cpython-37.pyc create mode 100644 env/Lib/site-packages/werkzeug/wrappers/__pycache__/common_descriptors.cpython-37.pyc create mode 100644 env/Lib/site-packages/werkzeug/wrappers/__pycache__/etag.cpython-37.pyc create mode 100644 env/Lib/site-packages/werkzeug/wrappers/__pycache__/json.cpython-37.pyc create mode 100644 env/Lib/site-packages/werkzeug/wrappers/__pycache__/request.cpython-37.pyc create mode 100644 env/Lib/site-packages/werkzeug/wrappers/__pycache__/response.cpython-37.pyc create mode 100644 env/Lib/site-packages/werkzeug/wrappers/__pycache__/user_agent.cpython-37.pyc create mode 100644 env/Lib/site-packages/werkzeug/wrappers/accept.py create mode 100644 env/Lib/site-packages/werkzeug/wrappers/auth.py create mode 100644 env/Lib/site-packages/werkzeug/wrappers/base_request.py create mode 100644 env/Lib/site-packages/werkzeug/wrappers/base_response.py create mode 100644 env/Lib/site-packages/werkzeug/wrappers/common_descriptors.py create mode 100644 env/Lib/site-packages/werkzeug/wrappers/etag.py create mode 100644 env/Lib/site-packages/werkzeug/wrappers/json.py create mode 100644 env/Lib/site-packages/werkzeug/wrappers/request.py create mode 100644 env/Lib/site-packages/werkzeug/wrappers/response.py create mode 100644 env/Lib/site-packages/werkzeug/wrappers/user_agent.py create mode 100644 env/Lib/site-packages/werkzeug/wsgi.py create mode 100644 env/Lib/site-packages/wheel-0.33.6.dist-info/INSTALLER create mode 100644 env/Lib/site-packages/wheel-0.33.6.dist-info/LICENSE.txt create mode 100644 env/Lib/site-packages/wheel-0.33.6.dist-info/METADATA create mode 100644 env/Lib/site-packages/wheel-0.33.6.dist-info/RECORD create mode 100644 env/Lib/site-packages/wheel-0.33.6.dist-info/WHEEL create mode 100644 env/Lib/site-packages/wheel-0.33.6.dist-info/entry_points.txt create mode 100644 env/Lib/site-packages/wheel-0.33.6.dist-info/top_level.txt create mode 100644 env/Lib/site-packages/wheel/__init__.py create mode 100644 env/Lib/site-packages/wheel/__main__.py create mode 100644 env/Lib/site-packages/wheel/__pycache__/__init__.cpython-37.pyc create mode 100644 env/Lib/site-packages/wheel/__pycache__/__main__.cpython-37.pyc create mode 100644 env/Lib/site-packages/wheel/__pycache__/bdist_wheel.cpython-37.pyc create mode 100644 env/Lib/site-packages/wheel/__pycache__/metadata.cpython-37.pyc create mode 100644 env/Lib/site-packages/wheel/__pycache__/pep425tags.cpython-37.pyc create mode 100644 env/Lib/site-packages/wheel/__pycache__/pkginfo.cpython-37.pyc create mode 100644 env/Lib/site-packages/wheel/__pycache__/util.cpython-37.pyc create mode 100644 env/Lib/site-packages/wheel/__pycache__/wheelfile.cpython-37.pyc create mode 100644 env/Lib/site-packages/wheel/bdist_wheel.py create mode 100644 env/Lib/site-packages/wheel/cli/__init__.py create mode 100644 env/Lib/site-packages/wheel/cli/__pycache__/__init__.cpython-37.pyc create mode 100644 env/Lib/site-packages/wheel/cli/__pycache__/convert.cpython-37.pyc create mode 100644 env/Lib/site-packages/wheel/cli/__pycache__/pack.cpython-37.pyc create mode 100644 env/Lib/site-packages/wheel/cli/__pycache__/unpack.cpython-37.pyc create mode 100644 env/Lib/site-packages/wheel/cli/convert.py create mode 100644 env/Lib/site-packages/wheel/cli/pack.py create mode 100644 env/Lib/site-packages/wheel/cli/unpack.py create mode 100644 env/Lib/site-packages/wheel/metadata.py create mode 100644 env/Lib/site-packages/wheel/pep425tags.py create mode 100644 env/Lib/site-packages/wheel/pkginfo.py create mode 100644 env/Lib/site-packages/wheel/util.py create mode 100644 env/Lib/site-packages/wheel/wheelfile.py create mode 100644 env/Lib/site.py create mode 100644 env/Lib/sre_compile.py create mode 100644 env/Lib/sre_constants.py create mode 100644 env/Lib/sre_parse.py create mode 100644 env/Lib/stat.py create mode 100644 env/Lib/struct.py create mode 100644 env/Lib/tarfile.py create mode 100644 env/Lib/tempfile.py create mode 100644 env/Lib/token.py create mode 100644 env/Lib/tokenize.py create mode 100644 env/Lib/types.py create mode 100644 env/Lib/warnings.py create mode 100644 env/Lib/weakref.py create mode 100644 env/Scripts/activate create mode 100644 env/Scripts/activate.bat create mode 100644 env/Scripts/activate.ps1 create mode 100644 env/Scripts/activate.xsh create mode 100644 env/Scripts/activate_this.py create mode 100644 env/Scripts/deactivate.bat create mode 100644 env/Scripts/easy_install-3.7.exe create mode 100644 env/Scripts/easy_install.exe create mode 100644 env/Scripts/flask.exe create mode 100644 env/Scripts/gunicorn.exe create mode 100644 env/Scripts/pip.exe create mode 100644 env/Scripts/pip3.7.exe create mode 100644 env/Scripts/pip3.exe create mode 100644 env/Scripts/python.exe create mode 100644 env/Scripts/python3.dll create mode 100644 env/Scripts/python37.dll create mode 100644 env/Scripts/pythonw.exe create mode 100644 env/Scripts/wheel.exe create mode 100644 env/tcl/tcl8.6/auto.tcl create mode 100644 env/tcl/tcl8.6/clock.tcl create mode 100644 env/tcl/tcl8.6/encoding/ascii.enc create mode 100644 env/tcl/tcl8.6/encoding/big5.enc create mode 100644 env/tcl/tcl8.6/encoding/cp1250.enc create mode 100644 env/tcl/tcl8.6/encoding/cp1251.enc create mode 100644 env/tcl/tcl8.6/encoding/cp1252.enc create mode 100644 env/tcl/tcl8.6/encoding/cp1253.enc create mode 100644 env/tcl/tcl8.6/encoding/cp1254.enc create mode 100644 env/tcl/tcl8.6/encoding/cp1255.enc create mode 100644 env/tcl/tcl8.6/encoding/cp1256.enc create mode 100644 env/tcl/tcl8.6/encoding/cp1257.enc create mode 100644 env/tcl/tcl8.6/encoding/cp1258.enc create mode 100644 env/tcl/tcl8.6/encoding/cp437.enc create mode 100644 env/tcl/tcl8.6/encoding/cp737.enc create mode 100644 env/tcl/tcl8.6/encoding/cp775.enc create mode 100644 env/tcl/tcl8.6/encoding/cp850.enc create mode 100644 env/tcl/tcl8.6/encoding/cp852.enc create mode 100644 env/tcl/tcl8.6/encoding/cp855.enc create mode 100644 env/tcl/tcl8.6/encoding/cp857.enc create mode 100644 env/tcl/tcl8.6/encoding/cp860.enc create mode 100644 env/tcl/tcl8.6/encoding/cp861.enc create mode 100644 env/tcl/tcl8.6/encoding/cp862.enc create mode 100644 env/tcl/tcl8.6/encoding/cp863.enc create mode 100644 env/tcl/tcl8.6/encoding/cp864.enc create mode 100644 env/tcl/tcl8.6/encoding/cp865.enc create mode 100644 env/tcl/tcl8.6/encoding/cp866.enc create mode 100644 env/tcl/tcl8.6/encoding/cp869.enc create mode 100644 env/tcl/tcl8.6/encoding/cp874.enc create mode 100644 env/tcl/tcl8.6/encoding/cp932.enc create mode 100644 env/tcl/tcl8.6/encoding/cp936.enc create mode 100644 env/tcl/tcl8.6/encoding/cp949.enc create mode 100644 env/tcl/tcl8.6/encoding/cp950.enc create mode 100644 env/tcl/tcl8.6/encoding/dingbats.enc create mode 100644 env/tcl/tcl8.6/encoding/ebcdic.enc create mode 100644 env/tcl/tcl8.6/encoding/euc-cn.enc create mode 100644 env/tcl/tcl8.6/encoding/euc-jp.enc create mode 100644 env/tcl/tcl8.6/encoding/euc-kr.enc create mode 100644 env/tcl/tcl8.6/encoding/gb12345.enc create mode 100644 env/tcl/tcl8.6/encoding/gb1988.enc create mode 100644 env/tcl/tcl8.6/encoding/gb2312-raw.enc create mode 100644 env/tcl/tcl8.6/encoding/gb2312.enc create mode 100644 env/tcl/tcl8.6/encoding/iso2022-jp.enc create mode 100644 env/tcl/tcl8.6/encoding/iso2022-kr.enc create mode 100644 env/tcl/tcl8.6/encoding/iso2022.enc create mode 100644 env/tcl/tcl8.6/encoding/iso8859-1.enc create mode 100644 env/tcl/tcl8.6/encoding/iso8859-10.enc create mode 100644 env/tcl/tcl8.6/encoding/iso8859-13.enc create mode 100644 env/tcl/tcl8.6/encoding/iso8859-14.enc create mode 100644 env/tcl/tcl8.6/encoding/iso8859-15.enc create mode 100644 env/tcl/tcl8.6/encoding/iso8859-16.enc create mode 100644 env/tcl/tcl8.6/encoding/iso8859-2.enc create mode 100644 env/tcl/tcl8.6/encoding/iso8859-3.enc create mode 100644 env/tcl/tcl8.6/encoding/iso8859-4.enc create mode 100644 env/tcl/tcl8.6/encoding/iso8859-5.enc create mode 100644 env/tcl/tcl8.6/encoding/iso8859-6.enc create mode 100644 env/tcl/tcl8.6/encoding/iso8859-7.enc create mode 100644 env/tcl/tcl8.6/encoding/iso8859-8.enc create mode 100644 env/tcl/tcl8.6/encoding/iso8859-9.enc create mode 100644 env/tcl/tcl8.6/encoding/jis0201.enc create mode 100644 env/tcl/tcl8.6/encoding/jis0208.enc create mode 100644 env/tcl/tcl8.6/encoding/jis0212.enc create mode 100644 env/tcl/tcl8.6/encoding/koi8-r.enc create mode 100644 env/tcl/tcl8.6/encoding/koi8-u.enc create mode 100644 env/tcl/tcl8.6/encoding/ksc5601.enc create mode 100644 env/tcl/tcl8.6/encoding/macCentEuro.enc create mode 100644 env/tcl/tcl8.6/encoding/macCroatian.enc create mode 100644 env/tcl/tcl8.6/encoding/macCyrillic.enc create mode 100644 env/tcl/tcl8.6/encoding/macDingbats.enc create mode 100644 env/tcl/tcl8.6/encoding/macGreek.enc create mode 100644 env/tcl/tcl8.6/encoding/macIceland.enc create mode 100644 env/tcl/tcl8.6/encoding/macJapan.enc create mode 100644 env/tcl/tcl8.6/encoding/macRoman.enc create mode 100644 env/tcl/tcl8.6/encoding/macRomania.enc create mode 100644 env/tcl/tcl8.6/encoding/macThai.enc create mode 100644 env/tcl/tcl8.6/encoding/macTurkish.enc create mode 100644 env/tcl/tcl8.6/encoding/macUkraine.enc create mode 100644 env/tcl/tcl8.6/encoding/shiftjis.enc create mode 100644 env/tcl/tcl8.6/encoding/symbol.enc create mode 100644 env/tcl/tcl8.6/encoding/tis-620.enc create mode 100644 env/tcl/tcl8.6/history.tcl create mode 100644 env/tcl/tcl8.6/http1.0/http.tcl create mode 100644 env/tcl/tcl8.6/http1.0/pkgIndex.tcl create mode 100644 env/tcl/tcl8.6/init.tcl create mode 100644 env/tcl/tcl8.6/msgs/af.msg create mode 100644 env/tcl/tcl8.6/msgs/af_za.msg create mode 100644 env/tcl/tcl8.6/msgs/ar.msg create mode 100644 env/tcl/tcl8.6/msgs/ar_in.msg create mode 100644 env/tcl/tcl8.6/msgs/ar_jo.msg create mode 100644 env/tcl/tcl8.6/msgs/ar_lb.msg create mode 100644 env/tcl/tcl8.6/msgs/ar_sy.msg create mode 100644 env/tcl/tcl8.6/msgs/be.msg create mode 100644 env/tcl/tcl8.6/msgs/bg.msg create mode 100644 env/tcl/tcl8.6/msgs/bn.msg create mode 100644 env/tcl/tcl8.6/msgs/bn_in.msg create mode 100644 env/tcl/tcl8.6/msgs/ca.msg create mode 100644 env/tcl/tcl8.6/msgs/cs.msg create mode 100644 env/tcl/tcl8.6/msgs/da.msg create mode 100644 env/tcl/tcl8.6/msgs/de.msg create mode 100644 env/tcl/tcl8.6/msgs/de_at.msg create mode 100644 env/tcl/tcl8.6/msgs/de_be.msg create mode 100644 env/tcl/tcl8.6/msgs/el.msg create mode 100644 env/tcl/tcl8.6/msgs/en_au.msg create mode 100644 env/tcl/tcl8.6/msgs/en_be.msg create mode 100644 env/tcl/tcl8.6/msgs/en_bw.msg create mode 100644 env/tcl/tcl8.6/msgs/en_ca.msg create mode 100644 env/tcl/tcl8.6/msgs/en_gb.msg create mode 100644 env/tcl/tcl8.6/msgs/en_hk.msg create mode 100644 env/tcl/tcl8.6/msgs/en_ie.msg create mode 100644 env/tcl/tcl8.6/msgs/en_in.msg create mode 100644 env/tcl/tcl8.6/msgs/en_nz.msg create mode 100644 env/tcl/tcl8.6/msgs/en_ph.msg create mode 100644 env/tcl/tcl8.6/msgs/en_sg.msg create mode 100644 env/tcl/tcl8.6/msgs/en_za.msg create mode 100644 env/tcl/tcl8.6/msgs/en_zw.msg create mode 100644 env/tcl/tcl8.6/msgs/eo.msg create mode 100644 env/tcl/tcl8.6/msgs/es.msg create mode 100644 env/tcl/tcl8.6/msgs/es_ar.msg create mode 100644 env/tcl/tcl8.6/msgs/es_bo.msg create mode 100644 env/tcl/tcl8.6/msgs/es_cl.msg create mode 100644 env/tcl/tcl8.6/msgs/es_co.msg create mode 100644 env/tcl/tcl8.6/msgs/es_cr.msg create mode 100644 env/tcl/tcl8.6/msgs/es_do.msg create mode 100644 env/tcl/tcl8.6/msgs/es_ec.msg create mode 100644 env/tcl/tcl8.6/msgs/es_gt.msg create mode 100644 env/tcl/tcl8.6/msgs/es_hn.msg create mode 100644 env/tcl/tcl8.6/msgs/es_mx.msg create mode 100644 env/tcl/tcl8.6/msgs/es_ni.msg create mode 100644 env/tcl/tcl8.6/msgs/es_pa.msg create mode 100644 env/tcl/tcl8.6/msgs/es_pe.msg create mode 100644 env/tcl/tcl8.6/msgs/es_pr.msg create mode 100644 env/tcl/tcl8.6/msgs/es_py.msg create mode 100644 env/tcl/tcl8.6/msgs/es_sv.msg create mode 100644 env/tcl/tcl8.6/msgs/es_uy.msg create mode 100644 env/tcl/tcl8.6/msgs/es_ve.msg create mode 100644 env/tcl/tcl8.6/msgs/et.msg create mode 100644 env/tcl/tcl8.6/msgs/eu.msg create mode 100644 env/tcl/tcl8.6/msgs/eu_es.msg create mode 100644 env/tcl/tcl8.6/msgs/fa.msg create mode 100644 env/tcl/tcl8.6/msgs/fa_in.msg create mode 100644 env/tcl/tcl8.6/msgs/fa_ir.msg create mode 100644 env/tcl/tcl8.6/msgs/fi.msg create mode 100644 env/tcl/tcl8.6/msgs/fo.msg create mode 100644 env/tcl/tcl8.6/msgs/fo_fo.msg create mode 100644 env/tcl/tcl8.6/msgs/fr.msg create mode 100644 env/tcl/tcl8.6/msgs/fr_be.msg create mode 100644 env/tcl/tcl8.6/msgs/fr_ca.msg create mode 100644 env/tcl/tcl8.6/msgs/fr_ch.msg create mode 100644 env/tcl/tcl8.6/msgs/ga.msg create mode 100644 env/tcl/tcl8.6/msgs/ga_ie.msg create mode 100644 env/tcl/tcl8.6/msgs/gl.msg create mode 100644 env/tcl/tcl8.6/msgs/gl_es.msg create mode 100644 env/tcl/tcl8.6/msgs/gv.msg create mode 100644 env/tcl/tcl8.6/msgs/gv_gb.msg create mode 100644 env/tcl/tcl8.6/msgs/he.msg create mode 100644 env/tcl/tcl8.6/msgs/hi.msg create mode 100644 env/tcl/tcl8.6/msgs/hi_in.msg create mode 100644 env/tcl/tcl8.6/msgs/hr.msg create mode 100644 env/tcl/tcl8.6/msgs/hu.msg create mode 100644 env/tcl/tcl8.6/msgs/id.msg create mode 100644 env/tcl/tcl8.6/msgs/id_id.msg create mode 100644 env/tcl/tcl8.6/msgs/is.msg create mode 100644 env/tcl/tcl8.6/msgs/it.msg create mode 100644 env/tcl/tcl8.6/msgs/it_ch.msg create mode 100644 env/tcl/tcl8.6/msgs/ja.msg create mode 100644 env/tcl/tcl8.6/msgs/kl.msg create mode 100644 env/tcl/tcl8.6/msgs/kl_gl.msg create mode 100644 env/tcl/tcl8.6/msgs/ko.msg create mode 100644 env/tcl/tcl8.6/msgs/ko_kr.msg create mode 100644 env/tcl/tcl8.6/msgs/kok.msg create mode 100644 env/tcl/tcl8.6/msgs/kok_in.msg create mode 100644 env/tcl/tcl8.6/msgs/kw.msg create mode 100644 env/tcl/tcl8.6/msgs/kw_gb.msg create mode 100644 env/tcl/tcl8.6/msgs/lt.msg create mode 100644 env/tcl/tcl8.6/msgs/lv.msg create mode 100644 env/tcl/tcl8.6/msgs/mk.msg create mode 100644 env/tcl/tcl8.6/msgs/mr.msg create mode 100644 env/tcl/tcl8.6/msgs/mr_in.msg create mode 100644 env/tcl/tcl8.6/msgs/ms.msg create mode 100644 env/tcl/tcl8.6/msgs/ms_my.msg create mode 100644 env/tcl/tcl8.6/msgs/mt.msg create mode 100644 env/tcl/tcl8.6/msgs/nb.msg create mode 100644 env/tcl/tcl8.6/msgs/nl.msg create mode 100644 env/tcl/tcl8.6/msgs/nl_be.msg create mode 100644 env/tcl/tcl8.6/msgs/nn.msg create mode 100644 env/tcl/tcl8.6/msgs/pl.msg create mode 100644 env/tcl/tcl8.6/msgs/pt.msg create mode 100644 env/tcl/tcl8.6/msgs/pt_br.msg create mode 100644 env/tcl/tcl8.6/msgs/ro.msg create mode 100644 env/tcl/tcl8.6/msgs/ru.msg create mode 100644 env/tcl/tcl8.6/msgs/ru_ua.msg create mode 100644 env/tcl/tcl8.6/msgs/sh.msg create mode 100644 env/tcl/tcl8.6/msgs/sk.msg create mode 100644 env/tcl/tcl8.6/msgs/sl.msg create mode 100644 env/tcl/tcl8.6/msgs/sq.msg create mode 100644 env/tcl/tcl8.6/msgs/sr.msg create mode 100644 env/tcl/tcl8.6/msgs/sv.msg create mode 100644 env/tcl/tcl8.6/msgs/sw.msg create mode 100644 env/tcl/tcl8.6/msgs/ta.msg create mode 100644 env/tcl/tcl8.6/msgs/ta_in.msg create mode 100644 env/tcl/tcl8.6/msgs/te.msg create mode 100644 env/tcl/tcl8.6/msgs/te_in.msg create mode 100644 env/tcl/tcl8.6/msgs/th.msg create mode 100644 env/tcl/tcl8.6/msgs/tr.msg create mode 100644 env/tcl/tcl8.6/msgs/uk.msg create mode 100644 env/tcl/tcl8.6/msgs/vi.msg create mode 100644 env/tcl/tcl8.6/msgs/zh.msg create mode 100644 env/tcl/tcl8.6/msgs/zh_cn.msg create mode 100644 env/tcl/tcl8.6/msgs/zh_hk.msg create mode 100644 env/tcl/tcl8.6/msgs/zh_sg.msg create mode 100644 env/tcl/tcl8.6/msgs/zh_tw.msg create mode 100644 env/tcl/tcl8.6/opt0.4/optparse.tcl create mode 100644 env/tcl/tcl8.6/opt0.4/pkgIndex.tcl create mode 100644 env/tcl/tcl8.6/package.tcl create mode 100644 env/tcl/tcl8.6/parray.tcl create mode 100644 env/tcl/tcl8.6/safe.tcl create mode 100644 env/tcl/tcl8.6/tclIndex create mode 100644 env/tcl/tcl8.6/tm.tcl create mode 100644 env/tcl/tcl8.6/tzdata/Africa/Abidjan create mode 100644 env/tcl/tcl8.6/tzdata/Africa/Accra create mode 100644 env/tcl/tcl8.6/tzdata/Africa/Addis_Ababa create mode 100644 env/tcl/tcl8.6/tzdata/Africa/Algiers create mode 100644 env/tcl/tcl8.6/tzdata/Africa/Asmara create mode 100644 env/tcl/tcl8.6/tzdata/Africa/Asmera create mode 100644 env/tcl/tcl8.6/tzdata/Africa/Bamako create mode 100644 env/tcl/tcl8.6/tzdata/Africa/Bangui create mode 100644 env/tcl/tcl8.6/tzdata/Africa/Banjul create mode 100644 env/tcl/tcl8.6/tzdata/Africa/Bissau create mode 100644 env/tcl/tcl8.6/tzdata/Africa/Blantyre create mode 100644 env/tcl/tcl8.6/tzdata/Africa/Brazzaville create mode 100644 env/tcl/tcl8.6/tzdata/Africa/Bujumbura create mode 100644 env/tcl/tcl8.6/tzdata/Africa/Cairo create mode 100644 env/tcl/tcl8.6/tzdata/Africa/Casablanca create mode 100644 env/tcl/tcl8.6/tzdata/Africa/Ceuta create mode 100644 env/tcl/tcl8.6/tzdata/Africa/Conakry create mode 100644 env/tcl/tcl8.6/tzdata/Africa/Dakar create mode 100644 env/tcl/tcl8.6/tzdata/Africa/Dar_es_Salaam create mode 100644 env/tcl/tcl8.6/tzdata/Africa/Djibouti create mode 100644 env/tcl/tcl8.6/tzdata/Africa/Douala create mode 100644 env/tcl/tcl8.6/tzdata/Africa/El_Aaiun create mode 100644 env/tcl/tcl8.6/tzdata/Africa/Freetown create mode 100644 env/tcl/tcl8.6/tzdata/Africa/Gaborone create mode 100644 env/tcl/tcl8.6/tzdata/Africa/Harare create mode 100644 env/tcl/tcl8.6/tzdata/Africa/Johannesburg create mode 100644 env/tcl/tcl8.6/tzdata/Africa/Juba create mode 100644 env/tcl/tcl8.6/tzdata/Africa/Kampala create mode 100644 env/tcl/tcl8.6/tzdata/Africa/Khartoum create mode 100644 env/tcl/tcl8.6/tzdata/Africa/Kigali create mode 100644 env/tcl/tcl8.6/tzdata/Africa/Kinshasa create mode 100644 env/tcl/tcl8.6/tzdata/Africa/Lagos create mode 100644 env/tcl/tcl8.6/tzdata/Africa/Libreville create mode 100644 env/tcl/tcl8.6/tzdata/Africa/Lome create mode 100644 env/tcl/tcl8.6/tzdata/Africa/Luanda create mode 100644 env/tcl/tcl8.6/tzdata/Africa/Lubumbashi create mode 100644 env/tcl/tcl8.6/tzdata/Africa/Lusaka create mode 100644 env/tcl/tcl8.6/tzdata/Africa/Malabo create mode 100644 env/tcl/tcl8.6/tzdata/Africa/Maputo create mode 100644 env/tcl/tcl8.6/tzdata/Africa/Maseru create mode 100644 env/tcl/tcl8.6/tzdata/Africa/Mbabane create mode 100644 env/tcl/tcl8.6/tzdata/Africa/Mogadishu create mode 100644 env/tcl/tcl8.6/tzdata/Africa/Monrovia create mode 100644 env/tcl/tcl8.6/tzdata/Africa/Nairobi create mode 100644 env/tcl/tcl8.6/tzdata/Africa/Ndjamena create mode 100644 env/tcl/tcl8.6/tzdata/Africa/Niamey create mode 100644 env/tcl/tcl8.6/tzdata/Africa/Nouakchott create mode 100644 env/tcl/tcl8.6/tzdata/Africa/Ouagadougou create mode 100644 env/tcl/tcl8.6/tzdata/Africa/Porto-Novo create mode 100644 env/tcl/tcl8.6/tzdata/Africa/Sao_Tome create mode 100644 env/tcl/tcl8.6/tzdata/Africa/Timbuktu create mode 100644 env/tcl/tcl8.6/tzdata/Africa/Tripoli create mode 100644 env/tcl/tcl8.6/tzdata/Africa/Tunis create mode 100644 env/tcl/tcl8.6/tzdata/Africa/Windhoek create mode 100644 env/tcl/tcl8.6/tzdata/America/Adak create mode 100644 env/tcl/tcl8.6/tzdata/America/Anchorage create mode 100644 env/tcl/tcl8.6/tzdata/America/Anguilla create mode 100644 env/tcl/tcl8.6/tzdata/America/Antigua create mode 100644 env/tcl/tcl8.6/tzdata/America/Araguaina create mode 100644 env/tcl/tcl8.6/tzdata/America/Argentina/Buenos_Aires create mode 100644 env/tcl/tcl8.6/tzdata/America/Argentina/Catamarca create mode 100644 env/tcl/tcl8.6/tzdata/America/Argentina/ComodRivadavia create mode 100644 env/tcl/tcl8.6/tzdata/America/Argentina/Cordoba create mode 100644 env/tcl/tcl8.6/tzdata/America/Argentina/Jujuy create mode 100644 env/tcl/tcl8.6/tzdata/America/Argentina/La_Rioja create mode 100644 env/tcl/tcl8.6/tzdata/America/Argentina/Mendoza create mode 100644 env/tcl/tcl8.6/tzdata/America/Argentina/Rio_Gallegos create mode 100644 env/tcl/tcl8.6/tzdata/America/Argentina/Salta create mode 100644 env/tcl/tcl8.6/tzdata/America/Argentina/San_Juan create mode 100644 env/tcl/tcl8.6/tzdata/America/Argentina/San_Luis create mode 100644 env/tcl/tcl8.6/tzdata/America/Argentina/Tucuman create mode 100644 env/tcl/tcl8.6/tzdata/America/Argentina/Ushuaia create mode 100644 env/tcl/tcl8.6/tzdata/America/Aruba create mode 100644 env/tcl/tcl8.6/tzdata/America/Asuncion create mode 100644 env/tcl/tcl8.6/tzdata/America/Atikokan create mode 100644 env/tcl/tcl8.6/tzdata/America/Atka create mode 100644 env/tcl/tcl8.6/tzdata/America/Bahia create mode 100644 env/tcl/tcl8.6/tzdata/America/Bahia_Banderas create mode 100644 env/tcl/tcl8.6/tzdata/America/Barbados create mode 100644 env/tcl/tcl8.6/tzdata/America/Belem create mode 100644 env/tcl/tcl8.6/tzdata/America/Belize create mode 100644 env/tcl/tcl8.6/tzdata/America/Blanc-Sablon create mode 100644 env/tcl/tcl8.6/tzdata/America/Boa_Vista create mode 100644 env/tcl/tcl8.6/tzdata/America/Bogota create mode 100644 env/tcl/tcl8.6/tzdata/America/Boise create mode 100644 env/tcl/tcl8.6/tzdata/America/Buenos_Aires create mode 100644 env/tcl/tcl8.6/tzdata/America/Cambridge_Bay create mode 100644 env/tcl/tcl8.6/tzdata/America/Campo_Grande create mode 100644 env/tcl/tcl8.6/tzdata/America/Cancun create mode 100644 env/tcl/tcl8.6/tzdata/America/Caracas create mode 100644 env/tcl/tcl8.6/tzdata/America/Catamarca create mode 100644 env/tcl/tcl8.6/tzdata/America/Cayenne create mode 100644 env/tcl/tcl8.6/tzdata/America/Cayman create mode 100644 env/tcl/tcl8.6/tzdata/America/Chicago create mode 100644 env/tcl/tcl8.6/tzdata/America/Chihuahua create mode 100644 env/tcl/tcl8.6/tzdata/America/Coral_Harbour create mode 100644 env/tcl/tcl8.6/tzdata/America/Cordoba create mode 100644 env/tcl/tcl8.6/tzdata/America/Costa_Rica create mode 100644 env/tcl/tcl8.6/tzdata/America/Creston create mode 100644 env/tcl/tcl8.6/tzdata/America/Cuiaba create mode 100644 env/tcl/tcl8.6/tzdata/America/Curacao create mode 100644 env/tcl/tcl8.6/tzdata/America/Danmarkshavn create mode 100644 env/tcl/tcl8.6/tzdata/America/Dawson create mode 100644 env/tcl/tcl8.6/tzdata/America/Dawson_Creek create mode 100644 env/tcl/tcl8.6/tzdata/America/Denver create mode 100644 env/tcl/tcl8.6/tzdata/America/Detroit create mode 100644 env/tcl/tcl8.6/tzdata/America/Dominica create mode 100644 env/tcl/tcl8.6/tzdata/America/Edmonton create mode 100644 env/tcl/tcl8.6/tzdata/America/Eirunepe create mode 100644 env/tcl/tcl8.6/tzdata/America/El_Salvador create mode 100644 env/tcl/tcl8.6/tzdata/America/Ensenada create mode 100644 env/tcl/tcl8.6/tzdata/America/Fort_Nelson create mode 100644 env/tcl/tcl8.6/tzdata/America/Fort_Wayne create mode 100644 env/tcl/tcl8.6/tzdata/America/Fortaleza create mode 100644 env/tcl/tcl8.6/tzdata/America/Glace_Bay create mode 100644 env/tcl/tcl8.6/tzdata/America/Godthab create mode 100644 env/tcl/tcl8.6/tzdata/America/Goose_Bay create mode 100644 env/tcl/tcl8.6/tzdata/America/Grand_Turk create mode 100644 env/tcl/tcl8.6/tzdata/America/Grenada create mode 100644 env/tcl/tcl8.6/tzdata/America/Guadeloupe create mode 100644 env/tcl/tcl8.6/tzdata/America/Guatemala create mode 100644 env/tcl/tcl8.6/tzdata/America/Guayaquil create mode 100644 env/tcl/tcl8.6/tzdata/America/Guyana create mode 100644 env/tcl/tcl8.6/tzdata/America/Halifax create mode 100644 env/tcl/tcl8.6/tzdata/America/Havana create mode 100644 env/tcl/tcl8.6/tzdata/America/Hermosillo create mode 100644 env/tcl/tcl8.6/tzdata/America/Indiana/Indianapolis create mode 100644 env/tcl/tcl8.6/tzdata/America/Indiana/Knox create mode 100644 env/tcl/tcl8.6/tzdata/America/Indiana/Marengo create mode 100644 env/tcl/tcl8.6/tzdata/America/Indiana/Petersburg create mode 100644 env/tcl/tcl8.6/tzdata/America/Indiana/Tell_City create mode 100644 env/tcl/tcl8.6/tzdata/America/Indiana/Vevay create mode 100644 env/tcl/tcl8.6/tzdata/America/Indiana/Vincennes create mode 100644 env/tcl/tcl8.6/tzdata/America/Indiana/Winamac create mode 100644 env/tcl/tcl8.6/tzdata/America/Indianapolis create mode 100644 env/tcl/tcl8.6/tzdata/America/Inuvik create mode 100644 env/tcl/tcl8.6/tzdata/America/Iqaluit create mode 100644 env/tcl/tcl8.6/tzdata/America/Jamaica create mode 100644 env/tcl/tcl8.6/tzdata/America/Jujuy create mode 100644 env/tcl/tcl8.6/tzdata/America/Juneau create mode 100644 env/tcl/tcl8.6/tzdata/America/Kentucky/Louisville create mode 100644 env/tcl/tcl8.6/tzdata/America/Kentucky/Monticello create mode 100644 env/tcl/tcl8.6/tzdata/America/Knox_IN create mode 100644 env/tcl/tcl8.6/tzdata/America/Kralendijk create mode 100644 env/tcl/tcl8.6/tzdata/America/La_Paz create mode 100644 env/tcl/tcl8.6/tzdata/America/Lima create mode 100644 env/tcl/tcl8.6/tzdata/America/Los_Angeles create mode 100644 env/tcl/tcl8.6/tzdata/America/Louisville create mode 100644 env/tcl/tcl8.6/tzdata/America/Lower_Princes create mode 100644 env/tcl/tcl8.6/tzdata/America/Maceio create mode 100644 env/tcl/tcl8.6/tzdata/America/Managua create mode 100644 env/tcl/tcl8.6/tzdata/America/Manaus create mode 100644 env/tcl/tcl8.6/tzdata/America/Marigot create mode 100644 env/tcl/tcl8.6/tzdata/America/Martinique create mode 100644 env/tcl/tcl8.6/tzdata/America/Matamoros create mode 100644 env/tcl/tcl8.6/tzdata/America/Mazatlan create mode 100644 env/tcl/tcl8.6/tzdata/America/Mendoza create mode 100644 env/tcl/tcl8.6/tzdata/America/Menominee create mode 100644 env/tcl/tcl8.6/tzdata/America/Merida create mode 100644 env/tcl/tcl8.6/tzdata/America/Metlakatla create mode 100644 env/tcl/tcl8.6/tzdata/America/Mexico_City create mode 100644 env/tcl/tcl8.6/tzdata/America/Miquelon create mode 100644 env/tcl/tcl8.6/tzdata/America/Moncton create mode 100644 env/tcl/tcl8.6/tzdata/America/Monterrey create mode 100644 env/tcl/tcl8.6/tzdata/America/Montevideo create mode 100644 env/tcl/tcl8.6/tzdata/America/Montreal create mode 100644 env/tcl/tcl8.6/tzdata/America/Montserrat create mode 100644 env/tcl/tcl8.6/tzdata/America/Nassau create mode 100644 env/tcl/tcl8.6/tzdata/America/New_York create mode 100644 env/tcl/tcl8.6/tzdata/America/Nipigon create mode 100644 env/tcl/tcl8.6/tzdata/America/Nome create mode 100644 env/tcl/tcl8.6/tzdata/America/Noronha create mode 100644 env/tcl/tcl8.6/tzdata/America/North_Dakota/Beulah create mode 100644 env/tcl/tcl8.6/tzdata/America/North_Dakota/Center create mode 100644 env/tcl/tcl8.6/tzdata/America/North_Dakota/New_Salem create mode 100644 env/tcl/tcl8.6/tzdata/America/Ojinaga create mode 100644 env/tcl/tcl8.6/tzdata/America/Panama create mode 100644 env/tcl/tcl8.6/tzdata/America/Pangnirtung create mode 100644 env/tcl/tcl8.6/tzdata/America/Paramaribo create mode 100644 env/tcl/tcl8.6/tzdata/America/Phoenix create mode 100644 env/tcl/tcl8.6/tzdata/America/Port-au-Prince create mode 100644 env/tcl/tcl8.6/tzdata/America/Port_of_Spain create mode 100644 env/tcl/tcl8.6/tzdata/America/Porto_Acre create mode 100644 env/tcl/tcl8.6/tzdata/America/Porto_Velho create mode 100644 env/tcl/tcl8.6/tzdata/America/Puerto_Rico create mode 100644 env/tcl/tcl8.6/tzdata/America/Punta_Arenas create mode 100644 env/tcl/tcl8.6/tzdata/America/Rainy_River create mode 100644 env/tcl/tcl8.6/tzdata/America/Rankin_Inlet create mode 100644 env/tcl/tcl8.6/tzdata/America/Recife create mode 100644 env/tcl/tcl8.6/tzdata/America/Regina create mode 100644 env/tcl/tcl8.6/tzdata/America/Resolute create mode 100644 env/tcl/tcl8.6/tzdata/America/Rio_Branco create mode 100644 env/tcl/tcl8.6/tzdata/America/Rosario create mode 100644 env/tcl/tcl8.6/tzdata/America/Santa_Isabel create mode 100644 env/tcl/tcl8.6/tzdata/America/Santarem create mode 100644 env/tcl/tcl8.6/tzdata/America/Santiago create mode 100644 env/tcl/tcl8.6/tzdata/America/Santo_Domingo create mode 100644 env/tcl/tcl8.6/tzdata/America/Sao_Paulo create mode 100644 env/tcl/tcl8.6/tzdata/America/Scoresbysund create mode 100644 env/tcl/tcl8.6/tzdata/America/Shiprock create mode 100644 env/tcl/tcl8.6/tzdata/America/Sitka create mode 100644 env/tcl/tcl8.6/tzdata/America/St_Barthelemy create mode 100644 env/tcl/tcl8.6/tzdata/America/St_Johns create mode 100644 env/tcl/tcl8.6/tzdata/America/St_Kitts create mode 100644 env/tcl/tcl8.6/tzdata/America/St_Lucia create mode 100644 env/tcl/tcl8.6/tzdata/America/St_Thomas create mode 100644 env/tcl/tcl8.6/tzdata/America/St_Vincent create mode 100644 env/tcl/tcl8.6/tzdata/America/Swift_Current create mode 100644 env/tcl/tcl8.6/tzdata/America/Tegucigalpa create mode 100644 env/tcl/tcl8.6/tzdata/America/Thule create mode 100644 env/tcl/tcl8.6/tzdata/America/Thunder_Bay create mode 100644 env/tcl/tcl8.6/tzdata/America/Tijuana create mode 100644 env/tcl/tcl8.6/tzdata/America/Toronto create mode 100644 env/tcl/tcl8.6/tzdata/America/Tortola create mode 100644 env/tcl/tcl8.6/tzdata/America/Vancouver create mode 100644 env/tcl/tcl8.6/tzdata/America/Virgin create mode 100644 env/tcl/tcl8.6/tzdata/America/Whitehorse create mode 100644 env/tcl/tcl8.6/tzdata/America/Winnipeg create mode 100644 env/tcl/tcl8.6/tzdata/America/Yakutat create mode 100644 env/tcl/tcl8.6/tzdata/America/Yellowknife create mode 100644 env/tcl/tcl8.6/tzdata/Antarctica/Casey create mode 100644 env/tcl/tcl8.6/tzdata/Antarctica/Davis create mode 100644 env/tcl/tcl8.6/tzdata/Antarctica/DumontDUrville create mode 100644 env/tcl/tcl8.6/tzdata/Antarctica/Macquarie create mode 100644 env/tcl/tcl8.6/tzdata/Antarctica/Mawson create mode 100644 env/tcl/tcl8.6/tzdata/Antarctica/McMurdo create mode 100644 env/tcl/tcl8.6/tzdata/Antarctica/Palmer create mode 100644 env/tcl/tcl8.6/tzdata/Antarctica/Rothera create mode 100644 env/tcl/tcl8.6/tzdata/Antarctica/South_Pole create mode 100644 env/tcl/tcl8.6/tzdata/Antarctica/Syowa create mode 100644 env/tcl/tcl8.6/tzdata/Antarctica/Troll create mode 100644 env/tcl/tcl8.6/tzdata/Antarctica/Vostok create mode 100644 env/tcl/tcl8.6/tzdata/Arctic/Longyearbyen create mode 100644 env/tcl/tcl8.6/tzdata/Asia/Aden create mode 100644 env/tcl/tcl8.6/tzdata/Asia/Almaty create mode 100644 env/tcl/tcl8.6/tzdata/Asia/Amman create mode 100644 env/tcl/tcl8.6/tzdata/Asia/Anadyr create mode 100644 env/tcl/tcl8.6/tzdata/Asia/Aqtau create mode 100644 env/tcl/tcl8.6/tzdata/Asia/Aqtobe create mode 100644 env/tcl/tcl8.6/tzdata/Asia/Ashgabat create mode 100644 env/tcl/tcl8.6/tzdata/Asia/Ashkhabad create mode 100644 env/tcl/tcl8.6/tzdata/Asia/Atyrau create mode 100644 env/tcl/tcl8.6/tzdata/Asia/Baghdad create mode 100644 env/tcl/tcl8.6/tzdata/Asia/Bahrain create mode 100644 env/tcl/tcl8.6/tzdata/Asia/Baku create mode 100644 env/tcl/tcl8.6/tzdata/Asia/Bangkok create mode 100644 env/tcl/tcl8.6/tzdata/Asia/Barnaul create mode 100644 env/tcl/tcl8.6/tzdata/Asia/Beirut create mode 100644 env/tcl/tcl8.6/tzdata/Asia/Bishkek create mode 100644 env/tcl/tcl8.6/tzdata/Asia/Brunei create mode 100644 env/tcl/tcl8.6/tzdata/Asia/Calcutta create mode 100644 env/tcl/tcl8.6/tzdata/Asia/Chita create mode 100644 env/tcl/tcl8.6/tzdata/Asia/Choibalsan create mode 100644 env/tcl/tcl8.6/tzdata/Asia/Chongqing create mode 100644 env/tcl/tcl8.6/tzdata/Asia/Chungking create mode 100644 env/tcl/tcl8.6/tzdata/Asia/Colombo create mode 100644 env/tcl/tcl8.6/tzdata/Asia/Dacca create mode 100644 env/tcl/tcl8.6/tzdata/Asia/Damascus create mode 100644 env/tcl/tcl8.6/tzdata/Asia/Dhaka create mode 100644 env/tcl/tcl8.6/tzdata/Asia/Dili create mode 100644 env/tcl/tcl8.6/tzdata/Asia/Dubai create mode 100644 env/tcl/tcl8.6/tzdata/Asia/Dushanbe create mode 100644 env/tcl/tcl8.6/tzdata/Asia/Famagusta create mode 100644 env/tcl/tcl8.6/tzdata/Asia/Gaza create mode 100644 env/tcl/tcl8.6/tzdata/Asia/Harbin create mode 100644 env/tcl/tcl8.6/tzdata/Asia/Hebron create mode 100644 env/tcl/tcl8.6/tzdata/Asia/Ho_Chi_Minh create mode 100644 env/tcl/tcl8.6/tzdata/Asia/Hong_Kong create mode 100644 env/tcl/tcl8.6/tzdata/Asia/Hovd create mode 100644 env/tcl/tcl8.6/tzdata/Asia/Irkutsk create mode 100644 env/tcl/tcl8.6/tzdata/Asia/Istanbul create mode 100644 env/tcl/tcl8.6/tzdata/Asia/Jakarta create mode 100644 env/tcl/tcl8.6/tzdata/Asia/Jayapura create mode 100644 env/tcl/tcl8.6/tzdata/Asia/Jerusalem create mode 100644 env/tcl/tcl8.6/tzdata/Asia/Kabul create mode 100644 env/tcl/tcl8.6/tzdata/Asia/Kamchatka create mode 100644 env/tcl/tcl8.6/tzdata/Asia/Karachi create mode 100644 env/tcl/tcl8.6/tzdata/Asia/Kashgar create mode 100644 env/tcl/tcl8.6/tzdata/Asia/Kathmandu create mode 100644 env/tcl/tcl8.6/tzdata/Asia/Katmandu create mode 100644 env/tcl/tcl8.6/tzdata/Asia/Khandyga create mode 100644 env/tcl/tcl8.6/tzdata/Asia/Kolkata create mode 100644 env/tcl/tcl8.6/tzdata/Asia/Krasnoyarsk create mode 100644 env/tcl/tcl8.6/tzdata/Asia/Kuala_Lumpur create mode 100644 env/tcl/tcl8.6/tzdata/Asia/Kuching create mode 100644 env/tcl/tcl8.6/tzdata/Asia/Kuwait create mode 100644 env/tcl/tcl8.6/tzdata/Asia/Macao create mode 100644 env/tcl/tcl8.6/tzdata/Asia/Macau create mode 100644 env/tcl/tcl8.6/tzdata/Asia/Magadan create mode 100644 env/tcl/tcl8.6/tzdata/Asia/Makassar create mode 100644 env/tcl/tcl8.6/tzdata/Asia/Manila create mode 100644 env/tcl/tcl8.6/tzdata/Asia/Muscat create mode 100644 env/tcl/tcl8.6/tzdata/Asia/Nicosia create mode 100644 env/tcl/tcl8.6/tzdata/Asia/Novokuznetsk create mode 100644 env/tcl/tcl8.6/tzdata/Asia/Novosibirsk create mode 100644 env/tcl/tcl8.6/tzdata/Asia/Omsk create mode 100644 env/tcl/tcl8.6/tzdata/Asia/Oral create mode 100644 env/tcl/tcl8.6/tzdata/Asia/Phnom_Penh create mode 100644 env/tcl/tcl8.6/tzdata/Asia/Pontianak create mode 100644 env/tcl/tcl8.6/tzdata/Asia/Pyongyang create mode 100644 env/tcl/tcl8.6/tzdata/Asia/Qatar create mode 100644 env/tcl/tcl8.6/tzdata/Asia/Qyzylorda create mode 100644 env/tcl/tcl8.6/tzdata/Asia/Rangoon create mode 100644 env/tcl/tcl8.6/tzdata/Asia/Riyadh create mode 100644 env/tcl/tcl8.6/tzdata/Asia/Saigon create mode 100644 env/tcl/tcl8.6/tzdata/Asia/Sakhalin create mode 100644 env/tcl/tcl8.6/tzdata/Asia/Samarkand create mode 100644 env/tcl/tcl8.6/tzdata/Asia/Seoul create mode 100644 env/tcl/tcl8.6/tzdata/Asia/Shanghai create mode 100644 env/tcl/tcl8.6/tzdata/Asia/Singapore create mode 100644 env/tcl/tcl8.6/tzdata/Asia/Srednekolymsk create mode 100644 env/tcl/tcl8.6/tzdata/Asia/Taipei create mode 100644 env/tcl/tcl8.6/tzdata/Asia/Tashkent create mode 100644 env/tcl/tcl8.6/tzdata/Asia/Tbilisi create mode 100644 env/tcl/tcl8.6/tzdata/Asia/Tehran create mode 100644 env/tcl/tcl8.6/tzdata/Asia/Tel_Aviv create mode 100644 env/tcl/tcl8.6/tzdata/Asia/Thimbu create mode 100644 env/tcl/tcl8.6/tzdata/Asia/Thimphu create mode 100644 env/tcl/tcl8.6/tzdata/Asia/Tokyo create mode 100644 env/tcl/tcl8.6/tzdata/Asia/Tomsk create mode 100644 env/tcl/tcl8.6/tzdata/Asia/Ujung_Pandang create mode 100644 env/tcl/tcl8.6/tzdata/Asia/Ulaanbaatar create mode 100644 env/tcl/tcl8.6/tzdata/Asia/Ulan_Bator create mode 100644 env/tcl/tcl8.6/tzdata/Asia/Urumqi create mode 100644 env/tcl/tcl8.6/tzdata/Asia/Ust-Nera create mode 100644 env/tcl/tcl8.6/tzdata/Asia/Vientiane create mode 100644 env/tcl/tcl8.6/tzdata/Asia/Vladivostok create mode 100644 env/tcl/tcl8.6/tzdata/Asia/Yakutsk create mode 100644 env/tcl/tcl8.6/tzdata/Asia/Yangon create mode 100644 env/tcl/tcl8.6/tzdata/Asia/Yekaterinburg create mode 100644 env/tcl/tcl8.6/tzdata/Asia/Yerevan create mode 100644 env/tcl/tcl8.6/tzdata/Atlantic/Azores create mode 100644 env/tcl/tcl8.6/tzdata/Atlantic/Bermuda create mode 100644 env/tcl/tcl8.6/tzdata/Atlantic/Canary create mode 100644 env/tcl/tcl8.6/tzdata/Atlantic/Cape_Verde create mode 100644 env/tcl/tcl8.6/tzdata/Atlantic/Faeroe create mode 100644 env/tcl/tcl8.6/tzdata/Atlantic/Faroe create mode 100644 env/tcl/tcl8.6/tzdata/Atlantic/Jan_Mayen create mode 100644 env/tcl/tcl8.6/tzdata/Atlantic/Madeira create mode 100644 env/tcl/tcl8.6/tzdata/Atlantic/Reykjavik create mode 100644 env/tcl/tcl8.6/tzdata/Atlantic/South_Georgia create mode 100644 env/tcl/tcl8.6/tzdata/Atlantic/St_Helena create mode 100644 env/tcl/tcl8.6/tzdata/Atlantic/Stanley create mode 100644 env/tcl/tcl8.6/tzdata/Australia/ACT create mode 100644 env/tcl/tcl8.6/tzdata/Australia/Adelaide create mode 100644 env/tcl/tcl8.6/tzdata/Australia/Brisbane create mode 100644 env/tcl/tcl8.6/tzdata/Australia/Broken_Hill create mode 100644 env/tcl/tcl8.6/tzdata/Australia/Canberra create mode 100644 env/tcl/tcl8.6/tzdata/Australia/Currie create mode 100644 env/tcl/tcl8.6/tzdata/Australia/Darwin create mode 100644 env/tcl/tcl8.6/tzdata/Australia/Eucla create mode 100644 env/tcl/tcl8.6/tzdata/Australia/Hobart create mode 100644 env/tcl/tcl8.6/tzdata/Australia/LHI create mode 100644 env/tcl/tcl8.6/tzdata/Australia/Lindeman create mode 100644 env/tcl/tcl8.6/tzdata/Australia/Lord_Howe create mode 100644 env/tcl/tcl8.6/tzdata/Australia/Melbourne create mode 100644 env/tcl/tcl8.6/tzdata/Australia/NSW create mode 100644 env/tcl/tcl8.6/tzdata/Australia/North create mode 100644 env/tcl/tcl8.6/tzdata/Australia/Perth create mode 100644 env/tcl/tcl8.6/tzdata/Australia/Queensland create mode 100644 env/tcl/tcl8.6/tzdata/Australia/South create mode 100644 env/tcl/tcl8.6/tzdata/Australia/Sydney create mode 100644 env/tcl/tcl8.6/tzdata/Australia/Tasmania create mode 100644 env/tcl/tcl8.6/tzdata/Australia/Victoria create mode 100644 env/tcl/tcl8.6/tzdata/Australia/West create mode 100644 env/tcl/tcl8.6/tzdata/Australia/Yancowinna create mode 100644 env/tcl/tcl8.6/tzdata/Brazil/Acre create mode 100644 env/tcl/tcl8.6/tzdata/Brazil/DeNoronha create mode 100644 env/tcl/tcl8.6/tzdata/Brazil/East create mode 100644 env/tcl/tcl8.6/tzdata/Brazil/West create mode 100644 env/tcl/tcl8.6/tzdata/CET create mode 100644 env/tcl/tcl8.6/tzdata/CST6CDT create mode 100644 env/tcl/tcl8.6/tzdata/Canada/Atlantic create mode 100644 env/tcl/tcl8.6/tzdata/Canada/Central create mode 100644 env/tcl/tcl8.6/tzdata/Canada/East-Saskatchewan create mode 100644 env/tcl/tcl8.6/tzdata/Canada/Eastern create mode 100644 env/tcl/tcl8.6/tzdata/Canada/Mountain create mode 100644 env/tcl/tcl8.6/tzdata/Canada/Newfoundland create mode 100644 env/tcl/tcl8.6/tzdata/Canada/Pacific create mode 100644 env/tcl/tcl8.6/tzdata/Canada/Saskatchewan create mode 100644 env/tcl/tcl8.6/tzdata/Canada/Yukon create mode 100644 env/tcl/tcl8.6/tzdata/Chile/Continental create mode 100644 env/tcl/tcl8.6/tzdata/Chile/EasterIsland create mode 100644 env/tcl/tcl8.6/tzdata/Cuba create mode 100644 env/tcl/tcl8.6/tzdata/EET create mode 100644 env/tcl/tcl8.6/tzdata/EST create mode 100644 env/tcl/tcl8.6/tzdata/EST5EDT create mode 100644 env/tcl/tcl8.6/tzdata/Egypt create mode 100644 env/tcl/tcl8.6/tzdata/Eire create mode 100644 env/tcl/tcl8.6/tzdata/Etc/GMT create mode 100644 env/tcl/tcl8.6/tzdata/Etc/GMT+0 create mode 100644 env/tcl/tcl8.6/tzdata/Etc/GMT+1 create mode 100644 env/tcl/tcl8.6/tzdata/Etc/GMT+10 create mode 100644 env/tcl/tcl8.6/tzdata/Etc/GMT+11 create mode 100644 env/tcl/tcl8.6/tzdata/Etc/GMT+12 create mode 100644 env/tcl/tcl8.6/tzdata/Etc/GMT+2 create mode 100644 env/tcl/tcl8.6/tzdata/Etc/GMT+3 create mode 100644 env/tcl/tcl8.6/tzdata/Etc/GMT+4 create mode 100644 env/tcl/tcl8.6/tzdata/Etc/GMT+5 create mode 100644 env/tcl/tcl8.6/tzdata/Etc/GMT+6 create mode 100644 env/tcl/tcl8.6/tzdata/Etc/GMT+7 create mode 100644 env/tcl/tcl8.6/tzdata/Etc/GMT+8 create mode 100644 env/tcl/tcl8.6/tzdata/Etc/GMT+9 create mode 100644 env/tcl/tcl8.6/tzdata/Etc/GMT-0 create mode 100644 env/tcl/tcl8.6/tzdata/Etc/GMT-1 create mode 100644 env/tcl/tcl8.6/tzdata/Etc/GMT-10 create mode 100644 env/tcl/tcl8.6/tzdata/Etc/GMT-11 create mode 100644 env/tcl/tcl8.6/tzdata/Etc/GMT-12 create mode 100644 env/tcl/tcl8.6/tzdata/Etc/GMT-13 create mode 100644 env/tcl/tcl8.6/tzdata/Etc/GMT-14 create mode 100644 env/tcl/tcl8.6/tzdata/Etc/GMT-2 create mode 100644 env/tcl/tcl8.6/tzdata/Etc/GMT-3 create mode 100644 env/tcl/tcl8.6/tzdata/Etc/GMT-4 create mode 100644 env/tcl/tcl8.6/tzdata/Etc/GMT-5 create mode 100644 env/tcl/tcl8.6/tzdata/Etc/GMT-6 create mode 100644 env/tcl/tcl8.6/tzdata/Etc/GMT-7 create mode 100644 env/tcl/tcl8.6/tzdata/Etc/GMT-8 create mode 100644 env/tcl/tcl8.6/tzdata/Etc/GMT-9 create mode 100644 env/tcl/tcl8.6/tzdata/Etc/GMT0 create mode 100644 env/tcl/tcl8.6/tzdata/Etc/Greenwich create mode 100644 env/tcl/tcl8.6/tzdata/Etc/UCT create mode 100644 env/tcl/tcl8.6/tzdata/Etc/UTC create mode 100644 env/tcl/tcl8.6/tzdata/Etc/Universal create mode 100644 env/tcl/tcl8.6/tzdata/Etc/Zulu create mode 100644 env/tcl/tcl8.6/tzdata/Europe/Amsterdam create mode 100644 env/tcl/tcl8.6/tzdata/Europe/Andorra create mode 100644 env/tcl/tcl8.6/tzdata/Europe/Astrakhan create mode 100644 env/tcl/tcl8.6/tzdata/Europe/Athens create mode 100644 env/tcl/tcl8.6/tzdata/Europe/Belfast create mode 100644 env/tcl/tcl8.6/tzdata/Europe/Belgrade create mode 100644 env/tcl/tcl8.6/tzdata/Europe/Berlin create mode 100644 env/tcl/tcl8.6/tzdata/Europe/Bratislava create mode 100644 env/tcl/tcl8.6/tzdata/Europe/Brussels create mode 100644 env/tcl/tcl8.6/tzdata/Europe/Bucharest create mode 100644 env/tcl/tcl8.6/tzdata/Europe/Budapest create mode 100644 env/tcl/tcl8.6/tzdata/Europe/Busingen create mode 100644 env/tcl/tcl8.6/tzdata/Europe/Chisinau create mode 100644 env/tcl/tcl8.6/tzdata/Europe/Copenhagen create mode 100644 env/tcl/tcl8.6/tzdata/Europe/Dublin create mode 100644 env/tcl/tcl8.6/tzdata/Europe/Gibraltar create mode 100644 env/tcl/tcl8.6/tzdata/Europe/Guernsey create mode 100644 env/tcl/tcl8.6/tzdata/Europe/Helsinki create mode 100644 env/tcl/tcl8.6/tzdata/Europe/Isle_of_Man create mode 100644 env/tcl/tcl8.6/tzdata/Europe/Istanbul create mode 100644 env/tcl/tcl8.6/tzdata/Europe/Jersey create mode 100644 env/tcl/tcl8.6/tzdata/Europe/Kaliningrad create mode 100644 env/tcl/tcl8.6/tzdata/Europe/Kiev create mode 100644 env/tcl/tcl8.6/tzdata/Europe/Kirov create mode 100644 env/tcl/tcl8.6/tzdata/Europe/Lisbon create mode 100644 env/tcl/tcl8.6/tzdata/Europe/Ljubljana create mode 100644 env/tcl/tcl8.6/tzdata/Europe/London create mode 100644 env/tcl/tcl8.6/tzdata/Europe/Luxembourg create mode 100644 env/tcl/tcl8.6/tzdata/Europe/Madrid create mode 100644 env/tcl/tcl8.6/tzdata/Europe/Malta create mode 100644 env/tcl/tcl8.6/tzdata/Europe/Mariehamn create mode 100644 env/tcl/tcl8.6/tzdata/Europe/Minsk create mode 100644 env/tcl/tcl8.6/tzdata/Europe/Monaco create mode 100644 env/tcl/tcl8.6/tzdata/Europe/Moscow create mode 100644 env/tcl/tcl8.6/tzdata/Europe/Nicosia create mode 100644 env/tcl/tcl8.6/tzdata/Europe/Oslo create mode 100644 env/tcl/tcl8.6/tzdata/Europe/Paris create mode 100644 env/tcl/tcl8.6/tzdata/Europe/Podgorica create mode 100644 env/tcl/tcl8.6/tzdata/Europe/Prague create mode 100644 env/tcl/tcl8.6/tzdata/Europe/Riga create mode 100644 env/tcl/tcl8.6/tzdata/Europe/Rome create mode 100644 env/tcl/tcl8.6/tzdata/Europe/Samara create mode 100644 env/tcl/tcl8.6/tzdata/Europe/San_Marino create mode 100644 env/tcl/tcl8.6/tzdata/Europe/Sarajevo create mode 100644 env/tcl/tcl8.6/tzdata/Europe/Saratov create mode 100644 env/tcl/tcl8.6/tzdata/Europe/Simferopol create mode 100644 env/tcl/tcl8.6/tzdata/Europe/Skopje create mode 100644 env/tcl/tcl8.6/tzdata/Europe/Sofia create mode 100644 env/tcl/tcl8.6/tzdata/Europe/Stockholm create mode 100644 env/tcl/tcl8.6/tzdata/Europe/Tallinn create mode 100644 env/tcl/tcl8.6/tzdata/Europe/Tirane create mode 100644 env/tcl/tcl8.6/tzdata/Europe/Tiraspol create mode 100644 env/tcl/tcl8.6/tzdata/Europe/Ulyanovsk create mode 100644 env/tcl/tcl8.6/tzdata/Europe/Uzhgorod create mode 100644 env/tcl/tcl8.6/tzdata/Europe/Vaduz create mode 100644 env/tcl/tcl8.6/tzdata/Europe/Vatican create mode 100644 env/tcl/tcl8.6/tzdata/Europe/Vienna create mode 100644 env/tcl/tcl8.6/tzdata/Europe/Vilnius create mode 100644 env/tcl/tcl8.6/tzdata/Europe/Volgograd create mode 100644 env/tcl/tcl8.6/tzdata/Europe/Warsaw create mode 100644 env/tcl/tcl8.6/tzdata/Europe/Zagreb create mode 100644 env/tcl/tcl8.6/tzdata/Europe/Zaporozhye create mode 100644 env/tcl/tcl8.6/tzdata/Europe/Zurich create mode 100644 env/tcl/tcl8.6/tzdata/GB create mode 100644 env/tcl/tcl8.6/tzdata/GB-Eire create mode 100644 env/tcl/tcl8.6/tzdata/GMT create mode 100644 env/tcl/tcl8.6/tzdata/GMT+0 create mode 100644 env/tcl/tcl8.6/tzdata/GMT-0 create mode 100644 env/tcl/tcl8.6/tzdata/GMT0 create mode 100644 env/tcl/tcl8.6/tzdata/Greenwich create mode 100644 env/tcl/tcl8.6/tzdata/HST create mode 100644 env/tcl/tcl8.6/tzdata/Hongkong create mode 100644 env/tcl/tcl8.6/tzdata/Iceland create mode 100644 env/tcl/tcl8.6/tzdata/Indian/Antananarivo create mode 100644 env/tcl/tcl8.6/tzdata/Indian/Chagos create mode 100644 env/tcl/tcl8.6/tzdata/Indian/Christmas create mode 100644 env/tcl/tcl8.6/tzdata/Indian/Cocos create mode 100644 env/tcl/tcl8.6/tzdata/Indian/Comoro create mode 100644 env/tcl/tcl8.6/tzdata/Indian/Kerguelen create mode 100644 env/tcl/tcl8.6/tzdata/Indian/Mahe create mode 100644 env/tcl/tcl8.6/tzdata/Indian/Maldives create mode 100644 env/tcl/tcl8.6/tzdata/Indian/Mauritius create mode 100644 env/tcl/tcl8.6/tzdata/Indian/Mayotte create mode 100644 env/tcl/tcl8.6/tzdata/Indian/Reunion create mode 100644 env/tcl/tcl8.6/tzdata/Iran create mode 100644 env/tcl/tcl8.6/tzdata/Israel create mode 100644 env/tcl/tcl8.6/tzdata/Jamaica create mode 100644 env/tcl/tcl8.6/tzdata/Japan create mode 100644 env/tcl/tcl8.6/tzdata/Kwajalein create mode 100644 env/tcl/tcl8.6/tzdata/Libya create mode 100644 env/tcl/tcl8.6/tzdata/MET create mode 100644 env/tcl/tcl8.6/tzdata/MST create mode 100644 env/tcl/tcl8.6/tzdata/MST7MDT create mode 100644 env/tcl/tcl8.6/tzdata/Mexico/BajaNorte create mode 100644 env/tcl/tcl8.6/tzdata/Mexico/BajaSur create mode 100644 env/tcl/tcl8.6/tzdata/Mexico/General create mode 100644 env/tcl/tcl8.6/tzdata/NZ create mode 100644 env/tcl/tcl8.6/tzdata/NZ-CHAT create mode 100644 env/tcl/tcl8.6/tzdata/Navajo create mode 100644 env/tcl/tcl8.6/tzdata/PRC create mode 100644 env/tcl/tcl8.6/tzdata/PST8PDT create mode 100644 env/tcl/tcl8.6/tzdata/Pacific/Apia create mode 100644 env/tcl/tcl8.6/tzdata/Pacific/Auckland create mode 100644 env/tcl/tcl8.6/tzdata/Pacific/Bougainville create mode 100644 env/tcl/tcl8.6/tzdata/Pacific/Chatham create mode 100644 env/tcl/tcl8.6/tzdata/Pacific/Chuuk create mode 100644 env/tcl/tcl8.6/tzdata/Pacific/Easter create mode 100644 env/tcl/tcl8.6/tzdata/Pacific/Efate create mode 100644 env/tcl/tcl8.6/tzdata/Pacific/Enderbury create mode 100644 env/tcl/tcl8.6/tzdata/Pacific/Fakaofo create mode 100644 env/tcl/tcl8.6/tzdata/Pacific/Fiji create mode 100644 env/tcl/tcl8.6/tzdata/Pacific/Funafuti create mode 100644 env/tcl/tcl8.6/tzdata/Pacific/Galapagos create mode 100644 env/tcl/tcl8.6/tzdata/Pacific/Gambier create mode 100644 env/tcl/tcl8.6/tzdata/Pacific/Guadalcanal create mode 100644 env/tcl/tcl8.6/tzdata/Pacific/Guam create mode 100644 env/tcl/tcl8.6/tzdata/Pacific/Honolulu create mode 100644 env/tcl/tcl8.6/tzdata/Pacific/Johnston create mode 100644 env/tcl/tcl8.6/tzdata/Pacific/Kiritimati create mode 100644 env/tcl/tcl8.6/tzdata/Pacific/Kosrae create mode 100644 env/tcl/tcl8.6/tzdata/Pacific/Kwajalein create mode 100644 env/tcl/tcl8.6/tzdata/Pacific/Majuro create mode 100644 env/tcl/tcl8.6/tzdata/Pacific/Marquesas create mode 100644 env/tcl/tcl8.6/tzdata/Pacific/Midway create mode 100644 env/tcl/tcl8.6/tzdata/Pacific/Nauru create mode 100644 env/tcl/tcl8.6/tzdata/Pacific/Niue create mode 100644 env/tcl/tcl8.6/tzdata/Pacific/Norfolk create mode 100644 env/tcl/tcl8.6/tzdata/Pacific/Noumea create mode 100644 env/tcl/tcl8.6/tzdata/Pacific/Pago_Pago create mode 100644 env/tcl/tcl8.6/tzdata/Pacific/Palau create mode 100644 env/tcl/tcl8.6/tzdata/Pacific/Pitcairn create mode 100644 env/tcl/tcl8.6/tzdata/Pacific/Pohnpei create mode 100644 env/tcl/tcl8.6/tzdata/Pacific/Ponape create mode 100644 env/tcl/tcl8.6/tzdata/Pacific/Port_Moresby create mode 100644 env/tcl/tcl8.6/tzdata/Pacific/Rarotonga create mode 100644 env/tcl/tcl8.6/tzdata/Pacific/Saipan create mode 100644 env/tcl/tcl8.6/tzdata/Pacific/Samoa create mode 100644 env/tcl/tcl8.6/tzdata/Pacific/Tahiti create mode 100644 env/tcl/tcl8.6/tzdata/Pacific/Tarawa create mode 100644 env/tcl/tcl8.6/tzdata/Pacific/Tongatapu create mode 100644 env/tcl/tcl8.6/tzdata/Pacific/Truk create mode 100644 env/tcl/tcl8.6/tzdata/Pacific/Wake create mode 100644 env/tcl/tcl8.6/tzdata/Pacific/Wallis create mode 100644 env/tcl/tcl8.6/tzdata/Pacific/Yap create mode 100644 env/tcl/tcl8.6/tzdata/Poland create mode 100644 env/tcl/tcl8.6/tzdata/Portugal create mode 100644 env/tcl/tcl8.6/tzdata/ROC create mode 100644 env/tcl/tcl8.6/tzdata/ROK create mode 100644 env/tcl/tcl8.6/tzdata/Singapore create mode 100644 env/tcl/tcl8.6/tzdata/SystemV/AST4 create mode 100644 env/tcl/tcl8.6/tzdata/SystemV/AST4ADT create mode 100644 env/tcl/tcl8.6/tzdata/SystemV/CST6 create mode 100644 env/tcl/tcl8.6/tzdata/SystemV/CST6CDT create mode 100644 env/tcl/tcl8.6/tzdata/SystemV/EST5 create mode 100644 env/tcl/tcl8.6/tzdata/SystemV/EST5EDT create mode 100644 env/tcl/tcl8.6/tzdata/SystemV/HST10 create mode 100644 env/tcl/tcl8.6/tzdata/SystemV/MST7 create mode 100644 env/tcl/tcl8.6/tzdata/SystemV/MST7MDT create mode 100644 env/tcl/tcl8.6/tzdata/SystemV/PST8 create mode 100644 env/tcl/tcl8.6/tzdata/SystemV/PST8PDT create mode 100644 env/tcl/tcl8.6/tzdata/SystemV/YST9 create mode 100644 env/tcl/tcl8.6/tzdata/SystemV/YST9YDT create mode 100644 env/tcl/tcl8.6/tzdata/Turkey create mode 100644 env/tcl/tcl8.6/tzdata/UCT create mode 100644 env/tcl/tcl8.6/tzdata/US/Alaska create mode 100644 env/tcl/tcl8.6/tzdata/US/Aleutian create mode 100644 env/tcl/tcl8.6/tzdata/US/Arizona create mode 100644 env/tcl/tcl8.6/tzdata/US/Central create mode 100644 env/tcl/tcl8.6/tzdata/US/East-Indiana create mode 100644 env/tcl/tcl8.6/tzdata/US/Eastern create mode 100644 env/tcl/tcl8.6/tzdata/US/Hawaii create mode 100644 env/tcl/tcl8.6/tzdata/US/Indiana-Starke create mode 100644 env/tcl/tcl8.6/tzdata/US/Michigan create mode 100644 env/tcl/tcl8.6/tzdata/US/Mountain create mode 100644 env/tcl/tcl8.6/tzdata/US/Pacific create mode 100644 env/tcl/tcl8.6/tzdata/US/Pacific-New create mode 100644 env/tcl/tcl8.6/tzdata/US/Samoa create mode 100644 env/tcl/tcl8.6/tzdata/UTC create mode 100644 env/tcl/tcl8.6/tzdata/Universal create mode 100644 env/tcl/tcl8.6/tzdata/W-SU create mode 100644 env/tcl/tcl8.6/tzdata/WET create mode 100644 env/tcl/tcl8.6/tzdata/Zulu create mode 100644 env/tcl/tcl8.6/word.tcl create mode 100644 env/tcl/tk8.6/bgerror.tcl create mode 100644 env/tcl/tk8.6/button.tcl create mode 100644 env/tcl/tk8.6/choosedir.tcl create mode 100644 env/tcl/tk8.6/clrpick.tcl create mode 100644 env/tcl/tk8.6/comdlg.tcl create mode 100644 env/tcl/tk8.6/console.tcl create mode 100644 env/tcl/tk8.6/demos/README create mode 100644 env/tcl/tk8.6/demos/anilabel.tcl create mode 100644 env/tcl/tk8.6/demos/aniwave.tcl create mode 100644 env/tcl/tk8.6/demos/arrow.tcl create mode 100644 env/tcl/tk8.6/demos/bind.tcl create mode 100644 env/tcl/tk8.6/demos/bitmap.tcl create mode 100644 env/tcl/tk8.6/demos/browse create mode 100644 env/tcl/tk8.6/demos/button.tcl create mode 100644 env/tcl/tk8.6/demos/check.tcl create mode 100644 env/tcl/tk8.6/demos/clrpick.tcl create mode 100644 env/tcl/tk8.6/demos/colors.tcl create mode 100644 env/tcl/tk8.6/demos/combo.tcl create mode 100644 env/tcl/tk8.6/demos/cscroll.tcl create mode 100644 env/tcl/tk8.6/demos/ctext.tcl create mode 100644 env/tcl/tk8.6/demos/dialog1.tcl create mode 100644 env/tcl/tk8.6/demos/dialog2.tcl create mode 100644 env/tcl/tk8.6/demos/en.msg create mode 100644 env/tcl/tk8.6/demos/entry1.tcl create mode 100644 env/tcl/tk8.6/demos/entry2.tcl create mode 100644 env/tcl/tk8.6/demos/entry3.tcl create mode 100644 env/tcl/tk8.6/demos/filebox.tcl create mode 100644 env/tcl/tk8.6/demos/floor.tcl create mode 100644 env/tcl/tk8.6/demos/fontchoose.tcl create mode 100644 env/tcl/tk8.6/demos/form.tcl create mode 100644 env/tcl/tk8.6/demos/goldberg.tcl create mode 100644 env/tcl/tk8.6/demos/hello create mode 100644 env/tcl/tk8.6/demos/hscale.tcl create mode 100644 env/tcl/tk8.6/demos/icon.tcl create mode 100644 env/tcl/tk8.6/demos/image1.tcl create mode 100644 env/tcl/tk8.6/demos/image2.tcl create mode 100644 env/tcl/tk8.6/demos/images/earth.gif create mode 100644 env/tcl/tk8.6/demos/images/earthmenu.png create mode 100644 env/tcl/tk8.6/demos/images/earthris.gif create mode 100644 env/tcl/tk8.6/demos/images/flagdown.xbm create mode 100644 env/tcl/tk8.6/demos/images/flagup.xbm create mode 100644 env/tcl/tk8.6/demos/images/gray25.xbm create mode 100644 env/tcl/tk8.6/demos/images/letters.xbm create mode 100644 env/tcl/tk8.6/demos/images/noletter.xbm create mode 100644 env/tcl/tk8.6/demos/images/ouster.png create mode 100644 env/tcl/tk8.6/demos/images/pattern.xbm create mode 100644 env/tcl/tk8.6/demos/images/tcllogo.gif create mode 100644 env/tcl/tk8.6/demos/images/teapot.ppm create mode 100644 env/tcl/tk8.6/demos/items.tcl create mode 100644 env/tcl/tk8.6/demos/ixset create mode 100644 env/tcl/tk8.6/demos/knightstour.tcl create mode 100644 env/tcl/tk8.6/demos/label.tcl create mode 100644 env/tcl/tk8.6/demos/labelframe.tcl create mode 100644 env/tcl/tk8.6/demos/license.terms create mode 100644 env/tcl/tk8.6/demos/mclist.tcl create mode 100644 env/tcl/tk8.6/demos/menu.tcl create mode 100644 env/tcl/tk8.6/demos/menubu.tcl create mode 100644 env/tcl/tk8.6/demos/msgbox.tcl create mode 100644 env/tcl/tk8.6/demos/nl.msg create mode 100644 env/tcl/tk8.6/demos/paned1.tcl create mode 100644 env/tcl/tk8.6/demos/paned2.tcl create mode 100644 env/tcl/tk8.6/demos/pendulum.tcl create mode 100644 env/tcl/tk8.6/demos/plot.tcl create mode 100644 env/tcl/tk8.6/demos/puzzle.tcl create mode 100644 env/tcl/tk8.6/demos/radio.tcl create mode 100644 env/tcl/tk8.6/demos/rmt create mode 100644 env/tcl/tk8.6/demos/rolodex create mode 100644 env/tcl/tk8.6/demos/ruler.tcl create mode 100644 env/tcl/tk8.6/demos/sayings.tcl create mode 100644 env/tcl/tk8.6/demos/search.tcl create mode 100644 env/tcl/tk8.6/demos/spin.tcl create mode 100644 env/tcl/tk8.6/demos/square create mode 100644 env/tcl/tk8.6/demos/states.tcl create mode 100644 env/tcl/tk8.6/demos/style.tcl create mode 100644 env/tcl/tk8.6/demos/tclIndex create mode 100644 env/tcl/tk8.6/demos/tcolor create mode 100644 env/tcl/tk8.6/demos/text.tcl create mode 100644 env/tcl/tk8.6/demos/textpeer.tcl create mode 100644 env/tcl/tk8.6/demos/timer create mode 100644 env/tcl/tk8.6/demos/toolbar.tcl create mode 100644 env/tcl/tk8.6/demos/tree.tcl create mode 100644 env/tcl/tk8.6/demos/ttkbut.tcl create mode 100644 env/tcl/tk8.6/demos/ttkmenu.tcl create mode 100644 env/tcl/tk8.6/demos/ttknote.tcl create mode 100644 env/tcl/tk8.6/demos/ttkpane.tcl create mode 100644 env/tcl/tk8.6/demos/ttkprogress.tcl create mode 100644 env/tcl/tk8.6/demos/ttkscale.tcl create mode 100644 env/tcl/tk8.6/demos/twind.tcl create mode 100644 env/tcl/tk8.6/demos/unicodeout.tcl create mode 100644 env/tcl/tk8.6/demos/vscale.tcl create mode 100644 env/tcl/tk8.6/demos/widget create mode 100644 env/tcl/tk8.6/dialog.tcl create mode 100644 env/tcl/tk8.6/entry.tcl create mode 100644 env/tcl/tk8.6/focus.tcl create mode 100644 env/tcl/tk8.6/fontchooser.tcl create mode 100644 env/tcl/tk8.6/iconlist.tcl create mode 100644 env/tcl/tk8.6/icons.tcl create mode 100644 env/tcl/tk8.6/images/README create mode 100644 env/tcl/tk8.6/images/logo.eps create mode 100644 env/tcl/tk8.6/images/logo100.gif create mode 100644 env/tcl/tk8.6/images/logo64.gif create mode 100644 env/tcl/tk8.6/images/logoLarge.gif create mode 100644 env/tcl/tk8.6/images/logoMed.gif create mode 100644 env/tcl/tk8.6/images/pwrdLogo.eps create mode 100644 env/tcl/tk8.6/images/pwrdLogo100.gif create mode 100644 env/tcl/tk8.6/images/pwrdLogo150.gif create mode 100644 env/tcl/tk8.6/images/pwrdLogo175.gif create mode 100644 env/tcl/tk8.6/images/pwrdLogo200.gif create mode 100644 env/tcl/tk8.6/images/pwrdLogo75.gif create mode 100644 env/tcl/tk8.6/images/tai-ku.gif create mode 100644 env/tcl/tk8.6/license.terms create mode 100644 env/tcl/tk8.6/listbox.tcl create mode 100644 env/tcl/tk8.6/megawidget.tcl create mode 100644 env/tcl/tk8.6/menu.tcl create mode 100644 env/tcl/tk8.6/mkpsenc.tcl create mode 100644 env/tcl/tk8.6/msgbox.tcl create mode 100644 env/tcl/tk8.6/msgs/cs.msg create mode 100644 env/tcl/tk8.6/msgs/da.msg create mode 100644 env/tcl/tk8.6/msgs/de.msg create mode 100644 env/tcl/tk8.6/msgs/el.msg create mode 100644 env/tcl/tk8.6/msgs/en.msg create mode 100644 env/tcl/tk8.6/msgs/en_gb.msg create mode 100644 env/tcl/tk8.6/msgs/eo.msg create mode 100644 env/tcl/tk8.6/msgs/es.msg create mode 100644 env/tcl/tk8.6/msgs/fr.msg create mode 100644 env/tcl/tk8.6/msgs/hu.msg create mode 100644 env/tcl/tk8.6/msgs/it.msg create mode 100644 env/tcl/tk8.6/msgs/nl.msg create mode 100644 env/tcl/tk8.6/msgs/pl.msg create mode 100644 env/tcl/tk8.6/msgs/pt.msg create mode 100644 env/tcl/tk8.6/msgs/ru.msg create mode 100644 env/tcl/tk8.6/msgs/sv.msg create mode 100644 env/tcl/tk8.6/obsolete.tcl create mode 100644 env/tcl/tk8.6/optMenu.tcl create mode 100644 env/tcl/tk8.6/palette.tcl create mode 100644 env/tcl/tk8.6/panedwindow.tcl create mode 100644 env/tcl/tk8.6/pkgIndex.tcl create mode 100644 env/tcl/tk8.6/safetk.tcl create mode 100644 env/tcl/tk8.6/scale.tcl create mode 100644 env/tcl/tk8.6/scrlbar.tcl create mode 100644 env/tcl/tk8.6/spinbox.tcl create mode 100644 env/tcl/tk8.6/tclIndex create mode 100644 env/tcl/tk8.6/tearoff.tcl create mode 100644 env/tcl/tk8.6/text.tcl create mode 100644 env/tcl/tk8.6/tk.tcl create mode 100644 env/tcl/tk8.6/tkfbox.tcl create mode 100644 env/tcl/tk8.6/ttk/altTheme.tcl create mode 100644 env/tcl/tk8.6/ttk/aquaTheme.tcl create mode 100644 env/tcl/tk8.6/ttk/button.tcl create mode 100644 env/tcl/tk8.6/ttk/clamTheme.tcl create mode 100644 env/tcl/tk8.6/ttk/classicTheme.tcl create mode 100644 env/tcl/tk8.6/ttk/combobox.tcl create mode 100644 env/tcl/tk8.6/ttk/cursors.tcl create mode 100644 env/tcl/tk8.6/ttk/defaults.tcl create mode 100644 env/tcl/tk8.6/ttk/entry.tcl create mode 100644 env/tcl/tk8.6/ttk/fonts.tcl create mode 100644 env/tcl/tk8.6/ttk/menubutton.tcl create mode 100644 env/tcl/tk8.6/ttk/notebook.tcl create mode 100644 env/tcl/tk8.6/ttk/panedwindow.tcl create mode 100644 env/tcl/tk8.6/ttk/progress.tcl create mode 100644 env/tcl/tk8.6/ttk/scale.tcl create mode 100644 env/tcl/tk8.6/ttk/scrollbar.tcl create mode 100644 env/tcl/tk8.6/ttk/sizegrip.tcl create mode 100644 env/tcl/tk8.6/ttk/spinbox.tcl create mode 100644 env/tcl/tk8.6/ttk/treeview.tcl create mode 100644 env/tcl/tk8.6/ttk/ttk.tcl create mode 100644 env/tcl/tk8.6/ttk/utils.tcl create mode 100644 env/tcl/tk8.6/ttk/vistaTheme.tcl create mode 100644 env/tcl/tk8.6/ttk/winTheme.tcl create mode 100644 env/tcl/tk8.6/ttk/xpTheme.tcl create mode 100644 env/tcl/tk8.6/unsupported.tcl create mode 100644 env/tcl/tk8.6/xmfbox.tcl create mode 100644 requirements.txt create mode 100644 runtime.txt create mode 100644 templates/index.html create mode 100644 templates/layout.html diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..3014311 --- /dev/null +++ b/.gitignore @@ -0,0 +1,55 @@ +# Byte-compiled / optimized / DLL files +__pycache__/ +*.py[cod] + +# C extensions +*.so + +# Distribution / packaging +.Python +env/ +bin/ +build/ +develop-eggs/ +dist/ +eggs/ +lib/ +lib64/ +parts/ +sdist/ +var/ +*.egg-info/ +.installed.cfg +*.egg + +# Installer logs +pip-log.txt +pip-delete-this-directory.txt + +# Unit test / coverage reports +htmlcov/ +.tox/ +.coverage +.cache +nosetests.xml +coverage.xml + +# Translations +*.mo + +# Mr Developer +.mr.developer.cfg +.project +.pydevproject + +# Rope +.ropeproject + +# Django stuff: +*.log +*.pot + +# Sphinx documentation +docs/_build/ + +*.DS_Store diff --git a/Procfile b/Procfile new file mode 100644 index 0000000..ca6e941 --- /dev/null +++ b/Procfile @@ -0,0 +1 @@ +web: gunicorn app:app diff --git a/README.md b/README.md new file mode 100644 index 0000000..e69de29 diff --git a/__pycache__/app.cpython-37.pyc b/__pycache__/app.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..71a4213330ce59087ca7cf4ff8510f56fbc7fcd4 GIT binary patch literal 377 zcmYLEu}%Xq42^S_-lV?DpA(*A#~&u_?4_o zY|Nc-uBx!)XFJb+cBX?tpOF>A-={B%-?2DbLdh+8J0Z|agJBkyVEK{*L%?JY%M{ZO zq4@!HqSJRqFFj1O*l;%{COa@-y0>6O_Cp%1;6dCQ)o#Lt!%Cx*9&KZk$0J-n$Bwgc zN@nD3PT* + +#ifndef UCHAR_MAX +#error "Something's broken. UCHAR_MAX should be defined in limits.h." +#endif + +#if UCHAR_MAX != 255 +#error "Python's source code assumes C's unsigned char is an 8-bit type." +#endif + +#if defined(__sgi) && !defined(_SGI_MP_SOURCE) +#define _SGI_MP_SOURCE +#endif + +#include +#ifndef NULL +# error "Python.h requires that stdio.h define NULL." +#endif + +#include +#ifdef HAVE_ERRNO_H +#include +#endif +#include +#ifdef HAVE_UNISTD_H +#include +#endif +#ifdef HAVE_CRYPT_H +#if defined(HAVE_CRYPT_R) && !defined(_GNU_SOURCE) +/* Required for glibc to expose the crypt_r() function prototype. */ +# define _GNU_SOURCE +# define _Py_GNU_SOURCE_FOR_CRYPT +#endif +#include +#ifdef _Py_GNU_SOURCE_FOR_CRYPT +/* Don't leak the _GNU_SOURCE define to other headers. */ +# undef _GNU_SOURCE +# undef _Py_GNU_SOURCE_FOR_CRYPT +#endif +#endif + +/* For size_t? */ +#ifdef HAVE_STDDEF_H +#include +#endif + +/* CAUTION: Build setups should ensure that NDEBUG is defined on the + * compiler command line when building Python in release mode; else + * assert() calls won't be removed. + */ +#include + +#include "pyport.h" +#include "pymacro.h" + +/* A convenient way for code to know if clang's memory sanitizer is enabled. */ +#if defined(__has_feature) +# if __has_feature(memory_sanitizer) +# if !defined(_Py_MEMORY_SANITIZER) +# define _Py_MEMORY_SANITIZER +# endif +# endif +#endif + +#include "pyatomic.h" + +/* Debug-mode build with pymalloc implies PYMALLOC_DEBUG. + * PYMALLOC_DEBUG is in error if pymalloc is not in use. + */ +#if defined(Py_DEBUG) && defined(WITH_PYMALLOC) && !defined(PYMALLOC_DEBUG) +#define PYMALLOC_DEBUG +#endif +#if defined(PYMALLOC_DEBUG) && !defined(WITH_PYMALLOC) +#error "PYMALLOC_DEBUG requires WITH_PYMALLOC" +#endif +#include "pymath.h" +#include "pytime.h" +#include "pymem.h" + +#include "object.h" +#include "objimpl.h" +#include "typeslots.h" +#include "pyhash.h" + +#include "pydebug.h" + +#include "bytearrayobject.h" +#include "bytesobject.h" +#include "unicodeobject.h" +#include "longobject.h" +#include "longintrepr.h" +#include "boolobject.h" +#include "floatobject.h" +#include "complexobject.h" +#include "rangeobject.h" +#include "memoryobject.h" +#include "tupleobject.h" +#include "listobject.h" +#include "dictobject.h" +#include "odictobject.h" +#include "enumobject.h" +#include "setobject.h" +#include "methodobject.h" +#include "moduleobject.h" +#include "funcobject.h" +#include "classobject.h" +#include "fileobject.h" +#include "pycapsule.h" +#include "traceback.h" +#include "sliceobject.h" +#include "cellobject.h" +#include "iterobject.h" +#include "genobject.h" +#include "descrobject.h" +#include "warnings.h" +#include "weakrefobject.h" +#include "structseq.h" +#include "namespaceobject.h" + +#include "codecs.h" +#include "pyerrors.h" + +#include "pystate.h" +#include "context.h" + +#include "pyarena.h" +#include "modsupport.h" +#include "compile.h" +#include "pythonrun.h" +#include "pylifecycle.h" +#include "ceval.h" +#include "sysmodule.h" +#include "osmodule.h" +#include "intrcheck.h" +#include "import.h" + +#include "abstract.h" +#include "bltinmodule.h" + +#include "eval.h" + +#include "pyctype.h" +#include "pystrtod.h" +#include "pystrcmp.h" +#include "dtoa.h" +#include "fileutils.h" +#include "pyfpe.h" + +#endif /* !Py_PYTHON_H */ diff --git a/env/Include/abstract.h b/env/Include/abstract.h new file mode 100644 index 0000000..3fe5a00 --- /dev/null +++ b/env/Include/abstract.h @@ -0,0 +1,1109 @@ +/* Abstract Object Interface (many thanks to Jim Fulton) */ + +#ifndef Py_ABSTRACTOBJECT_H +#define Py_ABSTRACTOBJECT_H +#ifdef __cplusplus +extern "C" { +#endif + +/* === Object Protocol ================================================== */ + +/* Implemented elsewhere: + + int PyObject_Print(PyObject *o, FILE *fp, int flags); + + Print an object 'o' on file 'fp'. Returns -1 on error. The flags argument + is used to enable certain printing options. The only option currently + supported is Py_Print_RAW. + + (What should be said about Py_Print_RAW?). */ + + +/* Implemented elsewhere: + + int PyObject_HasAttrString(PyObject *o, const char *attr_name); + + Returns 1 if object 'o' has the attribute attr_name, and 0 otherwise. + + This is equivalent to the Python expression: hasattr(o,attr_name). + + This function always succeeds. */ + + +/* Implemented elsewhere: + + PyObject* PyObject_GetAttrString(PyObject *o, const char *attr_name); + + Retrieve an attributed named attr_name form object o. + Returns the attribute value on success, or NULL on failure. + + This is the equivalent of the Python expression: o.attr_name. */ + + +/* Implemented elsewhere: + + int PyObject_HasAttr(PyObject *o, PyObject *attr_name); + + Returns 1 if o has the attribute attr_name, and 0 otherwise. + + This is equivalent to the Python expression: hasattr(o,attr_name). + + This function always succeeds. */ + +/* Implemented elsewhere: + + PyObject* PyObject_GetAttr(PyObject *o, PyObject *attr_name); + + Retrieve an attributed named 'attr_name' form object 'o'. + Returns the attribute value on success, or NULL on failure. + + This is the equivalent of the Python expression: o.attr_name. */ + + +/* Implemented elsewhere: + + int PyObject_SetAttrString(PyObject *o, const char *attr_name, PyObject *v); + + Set the value of the attribute named attr_name, for object 'o', + to the value 'v'. Raise an exception and return -1 on failure; return 0 on + success. + + This is the equivalent of the Python statement o.attr_name=v. */ + + +/* Implemented elsewhere: + + int PyObject_SetAttr(PyObject *o, PyObject *attr_name, PyObject *v); + + Set the value of the attribute named attr_name, for object 'o', to the value + 'v'. an exception and return -1 on failure; return 0 on success. + + This is the equivalent of the Python statement o.attr_name=v. */ + +/* Implemented as a macro: + + int PyObject_DelAttrString(PyObject *o, const char *attr_name); + + Delete attribute named attr_name, for object o. Returns + -1 on failure. + + This is the equivalent of the Python statement: del o.attr_name. */ +#define PyObject_DelAttrString(O,A) PyObject_SetAttrString((O),(A), NULL) + + +/* Implemented as a macro: + + int PyObject_DelAttr(PyObject *o, PyObject *attr_name); + + Delete attribute named attr_name, for object o. Returns -1 + on failure. This is the equivalent of the Python + statement: del o.attr_name. */ +#define PyObject_DelAttr(O,A) PyObject_SetAttr((O),(A), NULL) + + +/* Implemented elsewhere: + + PyObject *PyObject_Repr(PyObject *o); + + Compute the string representation of object 'o'. Returns the + string representation on success, NULL on failure. + + This is the equivalent of the Python expression: repr(o). + + Called by the repr() built-in function. */ + + +/* Implemented elsewhere: + + PyObject *PyObject_Str(PyObject *o); + + Compute the string representation of object, o. Returns the + string representation on success, NULL on failure. + + This is the equivalent of the Python expression: str(o). + + Called by the str() and print() built-in functions. */ + + +/* Declared elsewhere + + PyAPI_FUNC(int) PyCallable_Check(PyObject *o); + + Determine if the object, o, is callable. Return 1 if the object is callable + and 0 otherwise. + + This function always succeeds. */ + + +#ifdef PY_SSIZE_T_CLEAN +# define PyObject_CallFunction _PyObject_CallFunction_SizeT +# define PyObject_CallMethod _PyObject_CallMethod_SizeT +# ifndef Py_LIMITED_API +# define _PyObject_CallMethodId _PyObject_CallMethodId_SizeT +# endif /* !Py_LIMITED_API */ +#endif + + +/* Call a callable Python object 'callable' with arguments given by the + tuple 'args' and keywords arguments given by the dictionary 'kwargs'. + + 'args' must not be *NULL*, use an empty tuple if no arguments are + needed. If no named arguments are needed, 'kwargs' can be NULL. + + This is the equivalent of the Python expression: + callable(*args, **kwargs). */ +PyAPI_FUNC(PyObject *) PyObject_Call(PyObject *callable, + PyObject *args, PyObject *kwargs); + +#ifndef Py_LIMITED_API +PyAPI_FUNC(PyObject*) _PyStack_AsTuple( + PyObject *const *stack, + Py_ssize_t nargs); + +PyAPI_FUNC(PyObject*) _PyStack_AsTupleSlice( + PyObject *const *stack, + Py_ssize_t nargs, + Py_ssize_t start, + Py_ssize_t end); + +/* Convert keyword arguments from the FASTCALL (stack: C array, kwnames: tuple) + format to a Python dictionary ("kwargs" dict). + + The type of kwnames keys is not checked. The final function getting + arguments is responsible to check if all keys are strings, for example using + PyArg_ParseTupleAndKeywords() or PyArg_ValidateKeywordArguments(). + + Duplicate keys are merged using the last value. If duplicate keys must raise + an exception, the caller is responsible to implement an explicit keys on + kwnames. */ +PyAPI_FUNC(PyObject *) _PyStack_AsDict( + PyObject *const *values, + PyObject *kwnames); + +/* Convert (args, nargs, kwargs: dict) into a (stack, nargs, kwnames: tuple). + + Return 0 on success, raise an exception and return -1 on error. + + Write the new stack into *p_stack. If *p_stack is differen than args, it + must be released by PyMem_Free(). + + The stack uses borrowed references. + + The type of keyword keys is not checked, these checks should be done + later (ex: _PyArg_ParseStackAndKeywords). */ +PyAPI_FUNC(int) _PyStack_UnpackDict( + PyObject *const *args, + Py_ssize_t nargs, + PyObject *kwargs, + PyObject *const **p_stack, + PyObject **p_kwnames); + +/* Suggested size (number of positional arguments) for arrays of PyObject* + allocated on a C stack to avoid allocating memory on the heap memory. Such + array is used to pass positional arguments to call functions of the + _PyObject_FastCall() family. + + The size is chosen to not abuse the C stack and so limit the risk of stack + overflow. The size is also chosen to allow using the small stack for most + function calls of the Python standard library. On 64-bit CPU, it allocates + 40 bytes on the stack. */ +#define _PY_FASTCALL_SMALL_STACK 5 + +/* Return 1 if callable supports FASTCALL calling convention for positional + arguments: see _PyObject_FastCallDict() and _PyObject_FastCallKeywords() */ +PyAPI_FUNC(int) _PyObject_HasFastCall(PyObject *callable); + +/* Call the callable object 'callable' with the "fast call" calling convention: + args is a C array for positional arguments (nargs is the number of + positional arguments), kwargs is a dictionary for keyword arguments. + + If nargs is equal to zero, args can be NULL. kwargs can be NULL. + nargs must be greater or equal to zero. + + Return the result on success. Raise an exception and return NULL on + error. */ +PyAPI_FUNC(PyObject *) _PyObject_FastCallDict( + PyObject *callable, + PyObject *const *args, + Py_ssize_t nargs, + PyObject *kwargs); + +/* Call the callable object 'callable' with the "fast call" calling convention: + args is a C array for positional arguments followed by values of + keyword arguments. Keys of keyword arguments are stored as a tuple + of strings in kwnames. nargs is the number of positional parameters at + the beginning of stack. The size of kwnames gives the number of keyword + values in the stack after positional arguments. + + kwnames must only contains str strings, no subclass, and all keys must + be unique. + + If nargs is equal to zero and there is no keyword argument (kwnames is + NULL or its size is zero), args can be NULL. + + Return the result on success. Raise an exception and return NULL on + error. */ +PyAPI_FUNC(PyObject *) _PyObject_FastCallKeywords( + PyObject *callable, + PyObject *const *args, + Py_ssize_t nargs, + PyObject *kwnames); + +#define _PyObject_FastCall(func, args, nargs) \ + _PyObject_FastCallDict((func), (args), (nargs), NULL) + +#define _PyObject_CallNoArg(func) \ + _PyObject_FastCallDict((func), NULL, 0, NULL) + +PyAPI_FUNC(PyObject *) _PyObject_Call_Prepend( + PyObject *callable, + PyObject *obj, + PyObject *args, + PyObject *kwargs); + +PyAPI_FUNC(PyObject *) _PyObject_FastCall_Prepend( + PyObject *callable, + PyObject *obj, + PyObject *const *args, + Py_ssize_t nargs); + +PyAPI_FUNC(PyObject *) _Py_CheckFunctionResult(PyObject *callable, + PyObject *result, + const char *where); +#endif /* Py_LIMITED_API */ + + +/* Call a callable Python object 'callable', with arguments given by the + tuple 'args'. If no arguments are needed, then 'args' can be *NULL*. + + Returns the result of the call on success, or *NULL* on failure. + + This is the equivalent of the Python expression: + callable(*args). */ +PyAPI_FUNC(PyObject *) PyObject_CallObject(PyObject *callable, + PyObject *args); + +/* Call a callable Python object, callable, with a variable number of C + arguments. The C arguments are described using a mkvalue-style format + string. + + The format may be NULL, indicating that no arguments are provided. + + Returns the result of the call on success, or NULL on failure. + + This is the equivalent of the Python expression: + callable(arg1, arg2, ...). */ +PyAPI_FUNC(PyObject *) PyObject_CallFunction(PyObject *callable, + const char *format, ...); + +/* Call the method named 'name' of object 'obj' with a variable number of + C arguments. The C arguments are described by a mkvalue format string. + + The format can be NULL, indicating that no arguments are provided. + + Returns the result of the call on success, or NULL on failure. + + This is the equivalent of the Python expression: + obj.name(arg1, arg2, ...). */ +PyAPI_FUNC(PyObject *) PyObject_CallMethod(PyObject *obj, + const char *name, + const char *format, ...); + +#ifndef Py_LIMITED_API +/* Like PyObject_CallMethod(), but expect a _Py_Identifier* + as the method name. */ +PyAPI_FUNC(PyObject *) _PyObject_CallMethodId(PyObject *obj, + _Py_Identifier *name, + const char *format, ...); +#endif /* !Py_LIMITED_API */ + +PyAPI_FUNC(PyObject *) _PyObject_CallFunction_SizeT(PyObject *callable, + const char *format, + ...); + +PyAPI_FUNC(PyObject *) _PyObject_CallMethod_SizeT(PyObject *obj, + const char *name, + const char *format, + ...); + +#ifndef Py_LIMITED_API +PyAPI_FUNC(PyObject *) _PyObject_CallMethodId_SizeT(PyObject *obj, + _Py_Identifier *name, + const char *format, + ...); +#endif /* !Py_LIMITED_API */ + +/* Call a callable Python object 'callable' with a variable number of C + arguments. The C arguments are provided as PyObject* values, terminated + by a NULL. + + Returns the result of the call on success, or NULL on failure. + + This is the equivalent of the Python expression: + callable(arg1, arg2, ...). */ +PyAPI_FUNC(PyObject *) PyObject_CallFunctionObjArgs(PyObject *callable, + ...); + +/* Call the method named 'name' of object 'obj' with a variable number of + C arguments. The C arguments are provided as PyObject* values, terminated + by NULL. + + Returns the result of the call on success, or NULL on failure. + + This is the equivalent of the Python expression: obj.name(*args). */ + +PyAPI_FUNC(PyObject *) PyObject_CallMethodObjArgs( + PyObject *obj, + PyObject *name, + ...); + +#ifndef Py_LIMITED_API +PyAPI_FUNC(PyObject *) _PyObject_CallMethodIdObjArgs( + PyObject *obj, + struct _Py_Identifier *name, + ...); +#endif /* !Py_LIMITED_API */ + + +/* Implemented elsewhere: + + Py_hash_t PyObject_Hash(PyObject *o); + + Compute and return the hash, hash_value, of an object, o. On + failure, return -1. + + This is the equivalent of the Python expression: hash(o). */ + + +/* Implemented elsewhere: + + int PyObject_IsTrue(PyObject *o); + + Returns 1 if the object, o, is considered to be true, 0 if o is + considered to be false and -1 on failure. + + This is equivalent to the Python expression: not not o. */ + + +/* Implemented elsewhere: + + int PyObject_Not(PyObject *o); + + Returns 0 if the object, o, is considered to be true, 1 if o is + considered to be false and -1 on failure. + + This is equivalent to the Python expression: not o. */ + + +/* Get the type of an object. + + On success, returns a type object corresponding to the object type of object + 'o'. On failure, returns NULL. + + This is equivalent to the Python expression: type(o) */ +PyAPI_FUNC(PyObject *) PyObject_Type(PyObject *o); + + +/* Return the size of object 'o'. If the object 'o' provides both sequence and + mapping protocols, the sequence size is returned. + + On error, -1 is returned. + + This is the equivalent to the Python expression: len(o) */ +PyAPI_FUNC(Py_ssize_t) PyObject_Size(PyObject *o); + + +/* For DLL compatibility */ +#undef PyObject_Length +PyAPI_FUNC(Py_ssize_t) PyObject_Length(PyObject *o); +#define PyObject_Length PyObject_Size + + +#ifndef Py_LIMITED_API +PyAPI_FUNC(int) _PyObject_HasLen(PyObject *o); + +/* Guess the size of object 'o' using len(o) or o.__length_hint__(). + If neither of those return a non-negative value, then return the default + value. If one of the calls fails, this function returns -1. */ +PyAPI_FUNC(Py_ssize_t) PyObject_LengthHint(PyObject *o, Py_ssize_t); +#endif + +/* Return element of 'o' corresponding to the object 'key'. Return NULL + on failure. + + This is the equivalent of the Python expression: o[key] */ +PyAPI_FUNC(PyObject *) PyObject_GetItem(PyObject *o, PyObject *key); + + +/* Map the object 'key' to the value 'v' into 'o'. + + Raise an exception and return -1 on failure; return 0 on success. + + This is the equivalent of the Python statement: o[key]=v. */ +PyAPI_FUNC(int) PyObject_SetItem(PyObject *o, PyObject *key, PyObject *v); + +/* Remove the mapping for the string 'key' from the object 'o'. + Returns -1 on failure. + + This is equivalent to the Python statement: del o[key]. */ +PyAPI_FUNC(int) PyObject_DelItemString(PyObject *o, const char *key); + +/* Delete the mapping for the object 'key' from the object 'o'. + Returns -1 on failure. + + This is the equivalent of the Python statement: del o[key]. */ +PyAPI_FUNC(int) PyObject_DelItem(PyObject *o, PyObject *key); + + +/* === Old Buffer API ============================================ */ + +/* FIXME: usage of these should all be replaced in Python itself + but for backwards compatibility we will implement them. + Their usage without a corresponding "unlock" mechanism + may create issues (but they would already be there). */ + +/* Takes an arbitrary object which must support the (character, single segment) + buffer interface and returns a pointer to a read-only memory location + useable as character based input for subsequent processing. + + Return 0 on success. buffer and buffer_len are only set in case no error + occurs. Otherwise, -1 is returned and an exception set. */ +PyAPI_FUNC(int) PyObject_AsCharBuffer(PyObject *obj, + const char **buffer, + Py_ssize_t *buffer_len) + Py_DEPRECATED(3.0); + +/* Checks whether an arbitrary object supports the (character, single segment) + buffer interface. + + Returns 1 on success, 0 on failure. */ +PyAPI_FUNC(int) PyObject_CheckReadBuffer(PyObject *obj) + Py_DEPRECATED(3.0); + +/* Same as PyObject_AsCharBuffer() except that this API expects (readable, + single segment) buffer interface and returns a pointer to a read-only memory + location which can contain arbitrary data. + + 0 is returned on success. buffer and buffer_len are only set in case no + error occurs. Otherwise, -1 is returned and an exception set. */ +PyAPI_FUNC(int) PyObject_AsReadBuffer(PyObject *obj, + const void **buffer, + Py_ssize_t *buffer_len) + Py_DEPRECATED(3.0); + +/* Takes an arbitrary object which must support the (writable, single segment) + buffer interface and returns a pointer to a writable memory location in + buffer of size 'buffer_len'. + + Return 0 on success. buffer and buffer_len are only set in case no error + occurs. Otherwise, -1 is returned and an exception set. */ +PyAPI_FUNC(int) PyObject_AsWriteBuffer(PyObject *obj, + void **buffer, + Py_ssize_t *buffer_len) + Py_DEPRECATED(3.0); + + +/* === New Buffer API ============================================ */ + +#ifndef Py_LIMITED_API + +/* Return 1 if the getbuffer function is available, otherwise return 0. */ +#define PyObject_CheckBuffer(obj) \ + (((obj)->ob_type->tp_as_buffer != NULL) && \ + ((obj)->ob_type->tp_as_buffer->bf_getbuffer != NULL)) + +/* This is a C-API version of the getbuffer function call. It checks + to make sure object has the required function pointer and issues the + call. + + Returns -1 and raises an error on failure and returns 0 on success. */ +PyAPI_FUNC(int) PyObject_GetBuffer(PyObject *obj, Py_buffer *view, + int flags); + +/* Get the memory area pointed to by the indices for the buffer given. + Note that view->ndim is the assumed size of indices. */ +PyAPI_FUNC(void *) PyBuffer_GetPointer(Py_buffer *view, Py_ssize_t *indices); + +/* Return the implied itemsize of the data-format area from a + struct-style description. */ +PyAPI_FUNC(int) PyBuffer_SizeFromFormat(const char *); + +/* Implementation in memoryobject.c */ +PyAPI_FUNC(int) PyBuffer_ToContiguous(void *buf, Py_buffer *view, + Py_ssize_t len, char order); + +PyAPI_FUNC(int) PyBuffer_FromContiguous(Py_buffer *view, void *buf, + Py_ssize_t len, char order); + +/* Copy len bytes of data from the contiguous chunk of memory + pointed to by buf into the buffer exported by obj. Return + 0 on success and return -1 and raise a PyBuffer_Error on + error (i.e. the object does not have a buffer interface or + it is not working). + + If fort is 'F', then if the object is multi-dimensional, + then the data will be copied into the array in + Fortran-style (first dimension varies the fastest). If + fort is 'C', then the data will be copied into the array + in C-style (last dimension varies the fastest). If fort + is 'A', then it does not matter and the copy will be made + in whatever way is more efficient. */ +PyAPI_FUNC(int) PyObject_CopyData(PyObject *dest, PyObject *src); + +/* Copy the data from the src buffer to the buffer of destination. */ +PyAPI_FUNC(int) PyBuffer_IsContiguous(const Py_buffer *view, char fort); + +/*Fill the strides array with byte-strides of a contiguous + (Fortran-style if fort is 'F' or C-style otherwise) + array of the given shape with the given number of bytes + per element. */ +PyAPI_FUNC(void) PyBuffer_FillContiguousStrides(int ndims, + Py_ssize_t *shape, + Py_ssize_t *strides, + int itemsize, + char fort); + +/* Fills in a buffer-info structure correctly for an exporter + that can only share a contiguous chunk of memory of + "unsigned bytes" of the given length. + + Returns 0 on success and -1 (with raising an error) on error. */ +PyAPI_FUNC(int) PyBuffer_FillInfo(Py_buffer *view, PyObject *o, void *buf, + Py_ssize_t len, int readonly, + int flags); + +/* Releases a Py_buffer obtained from getbuffer ParseTuple's "s*". */ +PyAPI_FUNC(void) PyBuffer_Release(Py_buffer *view); + +#endif /* Py_LIMITED_API */ + +/* Takes an arbitrary object and returns the result of calling + obj.__format__(format_spec). */ +PyAPI_FUNC(PyObject *) PyObject_Format(PyObject *obj, + PyObject *format_spec); + + +/* ==== Iterators ================================================ */ + +/* Takes an object and returns an iterator for it. + This is typically a new iterator but if the argument is an iterator, this + returns itself. */ +PyAPI_FUNC(PyObject *) PyObject_GetIter(PyObject *); + +#define PyIter_Check(obj) \ + ((obj)->ob_type->tp_iternext != NULL && \ + (obj)->ob_type->tp_iternext != &_PyObject_NextNotImplemented) + +/* Takes an iterator object and calls its tp_iternext slot, + returning the next value. + + If the iterator is exhausted, this returns NULL without setting an + exception. + + NULL with an exception means an error occurred. */ +PyAPI_FUNC(PyObject *) PyIter_Next(PyObject *); + + +/* === Number Protocol ================================================== */ + +/* Returns 1 if the object 'o' provides numeric protocols, and 0 otherwise. + + This function always succeeds. */ +PyAPI_FUNC(int) PyNumber_Check(PyObject *o); + +/* Returns the result of adding o1 and o2, or NULL on failure. + + This is the equivalent of the Python expression: o1 + o2. */ +PyAPI_FUNC(PyObject *) PyNumber_Add(PyObject *o1, PyObject *o2); + +/* Returns the result of subtracting o2 from o1, or NULL on failure. + + This is the equivalent of the Python expression: o1 - o2. */ +PyAPI_FUNC(PyObject *) PyNumber_Subtract(PyObject *o1, PyObject *o2); + +/* Returns the result of multiplying o1 and o2, or NULL on failure. + + This is the equivalent of the Python expression: o1 * o2. */ +PyAPI_FUNC(PyObject *) PyNumber_Multiply(PyObject *o1, PyObject *o2); + +#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03050000 +/* This is the equivalent of the Python expression: o1 @ o2. */ +PyAPI_FUNC(PyObject *) PyNumber_MatrixMultiply(PyObject *o1, PyObject *o2); +#endif + +/* Returns the result of dividing o1 by o2 giving an integral result, + or NULL on failure. + + This is the equivalent of the Python expression: o1 // o2. */ +PyAPI_FUNC(PyObject *) PyNumber_FloorDivide(PyObject *o1, PyObject *o2); + +/* Returns the result of dividing o1 by o2 giving a float result, or NULL on + failure. + + This is the equivalent of the Python expression: o1 / o2. */ +PyAPI_FUNC(PyObject *) PyNumber_TrueDivide(PyObject *o1, PyObject *o2); + +/* Returns the remainder of dividing o1 by o2, or NULL on failure. + + This is the equivalent of the Python expression: o1 % o2. */ +PyAPI_FUNC(PyObject *) PyNumber_Remainder(PyObject *o1, PyObject *o2); + +/* See the built-in function divmod. + + Returns NULL on failure. + + This is the equivalent of the Python expression: divmod(o1, o2). */ +PyAPI_FUNC(PyObject *) PyNumber_Divmod(PyObject *o1, PyObject *o2); + +/* See the built-in function pow. Returns NULL on failure. + + This is the equivalent of the Python expression: pow(o1, o2, o3), + where o3 is optional. */ +PyAPI_FUNC(PyObject *) PyNumber_Power(PyObject *o1, PyObject *o2, + PyObject *o3); + +/* Returns the negation of o on success, or NULL on failure. + + This is the equivalent of the Python expression: -o. */ +PyAPI_FUNC(PyObject *) PyNumber_Negative(PyObject *o); + +/* Returns the positive of o on success, or NULL on failure. + + This is the equivalent of the Python expression: +o. */ +PyAPI_FUNC(PyObject *) PyNumber_Positive(PyObject *o); + +/* Returns the absolute value of 'o', or NULL on failure. + + This is the equivalent of the Python expression: abs(o). */ +PyAPI_FUNC(PyObject *) PyNumber_Absolute(PyObject *o); + +/* Returns the bitwise negation of 'o' on success, or NULL on failure. + + This is the equivalent of the Python expression: ~o. */ +PyAPI_FUNC(PyObject *) PyNumber_Invert(PyObject *o); + +/* Returns the result of left shifting o1 by o2 on success, or NULL on failure. + + This is the equivalent of the Python expression: o1 << o2. */ +PyAPI_FUNC(PyObject *) PyNumber_Lshift(PyObject *o1, PyObject *o2); + +/* Returns the result of right shifting o1 by o2 on success, or NULL on + failure. + + This is the equivalent of the Python expression: o1 >> o2. */ +PyAPI_FUNC(PyObject *) PyNumber_Rshift(PyObject *o1, PyObject *o2); + +/* Returns the result of bitwise and of o1 and o2 on success, or NULL on + failure. + + This is the equivalent of the Python expression: o1 & o2. */ +PyAPI_FUNC(PyObject *) PyNumber_And(PyObject *o1, PyObject *o2); + +/* Returns the bitwise exclusive or of o1 by o2 on success, or NULL on failure. + + This is the equivalent of the Python expression: o1 ^ o2. */ +PyAPI_FUNC(PyObject *) PyNumber_Xor(PyObject *o1, PyObject *o2); + +/* Returns the result of bitwise or on o1 and o2 on success, or NULL on + failure. + + This is the equivalent of the Python expression: o1 | o2. */ +PyAPI_FUNC(PyObject *) PyNumber_Or(PyObject *o1, PyObject *o2); + +#define PyIndex_Check(obj) \ + ((obj)->ob_type->tp_as_number != NULL && \ + (obj)->ob_type->tp_as_number->nb_index != NULL) + +/* Returns the object 'o' converted to a Python int, or NULL with an exception + raised on failure. */ +PyAPI_FUNC(PyObject *) PyNumber_Index(PyObject *o); + +/* Returns the object 'o' converted to Py_ssize_t by going through + PyNumber_Index() first. + + If an overflow error occurs while converting the int to Py_ssize_t, then the + second argument 'exc' is the error-type to return. If it is NULL, then the + overflow error is cleared and the value is clipped. */ +PyAPI_FUNC(Py_ssize_t) PyNumber_AsSsize_t(PyObject *o, PyObject *exc); + +/* Returns the object 'o' converted to an integer object on success, or NULL + on failure. + + This is the equivalent of the Python expression: int(o). */ +PyAPI_FUNC(PyObject *) PyNumber_Long(PyObject *o); + +/* Returns the object 'o' converted to a float object on success, or NULL + on failure. + + This is the equivalent of the Python expression: float(o). */ +PyAPI_FUNC(PyObject *) PyNumber_Float(PyObject *o); + + +/* --- In-place variants of (some of) the above number protocol functions -- */ + +/* Returns the result of adding o2 to o1, possibly in-place, or NULL + on failure. + + This is the equivalent of the Python expression: o1 += o2. */ +PyAPI_FUNC(PyObject *) PyNumber_InPlaceAdd(PyObject *o1, PyObject *o2); + +/* Returns the result of subtracting o2 from o1, possibly in-place or + NULL on failure. + + This is the equivalent of the Python expression: o1 -= o2. */ +PyAPI_FUNC(PyObject *) PyNumber_InPlaceSubtract(PyObject *o1, PyObject *o2); + +/* Returns the result of multiplying o1 by o2, possibly in-place, or NULL on + failure. + + This is the equivalent of the Python expression: o1 *= o2. */ +PyAPI_FUNC(PyObject *) PyNumber_InPlaceMultiply(PyObject *o1, PyObject *o2); + +#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03050000 +/* This is the equivalent of the Python expression: o1 @= o2. */ +PyAPI_FUNC(PyObject *) PyNumber_InPlaceMatrixMultiply(PyObject *o1, PyObject *o2); +#endif + +/* Returns the result of dividing o1 by o2 giving an integral result, possibly + in-place, or NULL on failure. + + This is the equivalent of the Python expression: o1 /= o2. */ +PyAPI_FUNC(PyObject *) PyNumber_InPlaceFloorDivide(PyObject *o1, + PyObject *o2); + +/* Returns the result of dividing o1 by o2 giving a float result, possibly + in-place, or null on failure. + + This is the equivalent of the Python expression: o1 /= o2. */ +PyAPI_FUNC(PyObject *) PyNumber_InPlaceTrueDivide(PyObject *o1, + PyObject *o2); + +/* Returns the remainder of dividing o1 by o2, possibly in-place, or NULL on + failure. + + This is the equivalent of the Python expression: o1 %= o2. */ +PyAPI_FUNC(PyObject *) PyNumber_InPlaceRemainder(PyObject *o1, PyObject *o2); + +/* Returns the result of raising o1 to the power of o2, possibly in-place, + or NULL on failure. + + This is the equivalent of the Python expression: o1 **= o2, + or o1 = pow(o1, o2, o3) if o3 is present. */ +PyAPI_FUNC(PyObject *) PyNumber_InPlacePower(PyObject *o1, PyObject *o2, + PyObject *o3); + +/* Returns the result of left shifting o1 by o2, possibly in-place, or NULL + on failure. + + This is the equivalent of the Python expression: o1 <<= o2. */ +PyAPI_FUNC(PyObject *) PyNumber_InPlaceLshift(PyObject *o1, PyObject *o2); + +/* Returns the result of right shifting o1 by o2, possibly in-place or NULL + on failure. + + This is the equivalent of the Python expression: o1 >>= o2. */ +PyAPI_FUNC(PyObject *) PyNumber_InPlaceRshift(PyObject *o1, PyObject *o2); + +/* Returns the result of bitwise and of o1 and o2, possibly in-place, or NULL + on failure. + + This is the equivalent of the Python expression: o1 &= o2. */ +PyAPI_FUNC(PyObject *) PyNumber_InPlaceAnd(PyObject *o1, PyObject *o2); + +/* Returns the bitwise exclusive or of o1 by o2, possibly in-place, or NULL + on failure. + + This is the equivalent of the Python expression: o1 ^= o2. */ +PyAPI_FUNC(PyObject *) PyNumber_InPlaceXor(PyObject *o1, PyObject *o2); + +/* Returns the result of bitwise or of o1 and o2, possibly in-place, + or NULL on failure. + + This is the equivalent of the Python expression: o1 |= o2. */ +PyAPI_FUNC(PyObject *) PyNumber_InPlaceOr(PyObject *o1, PyObject *o2); + +/* Returns the integer n converted to a string with a base, with a base + marker of 0b, 0o or 0x prefixed if applicable. + + If n is not an int object, it is converted with PyNumber_Index first. */ +PyAPI_FUNC(PyObject *) PyNumber_ToBase(PyObject *n, int base); + + +/* === Sequence protocol ================================================ */ + +/* Return 1 if the object provides sequence protocol, and zero + otherwise. + + This function always succeeds. */ +PyAPI_FUNC(int) PySequence_Check(PyObject *o); + +/* Return the size of sequence object o, or -1 on failure. */ +PyAPI_FUNC(Py_ssize_t) PySequence_Size(PyObject *o); + +/* For DLL compatibility */ +#undef PySequence_Length +PyAPI_FUNC(Py_ssize_t) PySequence_Length(PyObject *o); +#define PySequence_Length PySequence_Size + + +/* Return the concatenation of o1 and o2 on success, and NULL on failure. + + This is the equivalent of the Python expression: o1 + o2. */ +PyAPI_FUNC(PyObject *) PySequence_Concat(PyObject *o1, PyObject *o2); + +/* Return the result of repeating sequence object 'o' 'count' times, + or NULL on failure. + + This is the equivalent of the Python expression: o * count. */ +PyAPI_FUNC(PyObject *) PySequence_Repeat(PyObject *o, Py_ssize_t count); + +/* Return the ith element of o, or NULL on failure. + + This is the equivalent of the Python expression: o[i]. */ +PyAPI_FUNC(PyObject *) PySequence_GetItem(PyObject *o, Py_ssize_t i); + +/* Return the slice of sequence object o between i1 and i2, or NULL on failure. + + This is the equivalent of the Python expression: o[i1:i2]. */ +PyAPI_FUNC(PyObject *) PySequence_GetSlice(PyObject *o, Py_ssize_t i1, Py_ssize_t i2); + +/* Assign object 'v' to the ith element of the sequence 'o'. Raise an exception + and return -1 on failure; return 0 on success. + + This is the equivalent of the Python statement o[i] = v. */ +PyAPI_FUNC(int) PySequence_SetItem(PyObject *o, Py_ssize_t i, PyObject *v); + +/* Delete the 'i'-th element of the sequence 'v'. Returns -1 on failure. + + This is the equivalent of the Python statement: del o[i]. */ +PyAPI_FUNC(int) PySequence_DelItem(PyObject *o, Py_ssize_t i); + +/* Assign the sequence object 'v' to the slice in sequence object 'o', + from 'i1' to 'i2'. Returns -1 on failure. + + This is the equivalent of the Python statement: o[i1:i2] = v. */ +PyAPI_FUNC(int) PySequence_SetSlice(PyObject *o, Py_ssize_t i1, Py_ssize_t i2, + PyObject *v); + +/* Delete the slice in sequence object 'o' from 'i1' to 'i2'. + Returns -1 on failure. + + This is the equivalent of the Python statement: del o[i1:i2]. */ +PyAPI_FUNC(int) PySequence_DelSlice(PyObject *o, Py_ssize_t i1, Py_ssize_t i2); + +/* Returns the sequence 'o' as a tuple on success, and NULL on failure. + + This is equivalent to the Python expression: tuple(o). */ +PyAPI_FUNC(PyObject *) PySequence_Tuple(PyObject *o); + +/* Returns the sequence 'o' as a list on success, and NULL on failure. + This is equivalent to the Python expression: list(o) */ +PyAPI_FUNC(PyObject *) PySequence_List(PyObject *o); + +/* Return the sequence 'o' as a list, unless it's already a tuple or list. + + Use PySequence_Fast_GET_ITEM to access the members of this list, and + PySequence_Fast_GET_SIZE to get its length. + + Returns NULL on failure. If the object does not support iteration, raises a + TypeError exception with 'm' as the message text. */ +PyAPI_FUNC(PyObject *) PySequence_Fast(PyObject *o, const char* m); + +/* Return the size of the sequence 'o', assuming that 'o' was returned by + PySequence_Fast and is not NULL. */ +#define PySequence_Fast_GET_SIZE(o) \ + (PyList_Check(o) ? PyList_GET_SIZE(o) : PyTuple_GET_SIZE(o)) + +/* Return the 'i'-th element of the sequence 'o', assuming that o was returned + by PySequence_Fast, and that i is within bounds. */ +#define PySequence_Fast_GET_ITEM(o, i)\ + (PyList_Check(o) ? PyList_GET_ITEM(o, i) : PyTuple_GET_ITEM(o, i)) + +/* Assume tp_as_sequence and sq_item exist and that 'i' does not + need to be corrected for a negative index. */ +#define PySequence_ITEM(o, i)\ + ( Py_TYPE(o)->tp_as_sequence->sq_item(o, i) ) + +/* Return a pointer to the underlying item array for + an object retured by PySequence_Fast */ +#define PySequence_Fast_ITEMS(sf) \ + (PyList_Check(sf) ? ((PyListObject *)(sf))->ob_item \ + : ((PyTupleObject *)(sf))->ob_item) + +/* Return the number of occurrences on value on 'o', that is, return + the number of keys for which o[key] == value. + + On failure, return -1. This is equivalent to the Python expression: + o.count(value). */ +PyAPI_FUNC(Py_ssize_t) PySequence_Count(PyObject *o, PyObject *value); + +/* Return 1 if 'ob' is in the sequence 'seq'; 0 if 'ob' is not in the sequence + 'seq'; -1 on error. + + Use __contains__ if possible, else _PySequence_IterSearch(). */ +PyAPI_FUNC(int) PySequence_Contains(PyObject *seq, PyObject *ob); + +#ifndef Py_LIMITED_API +#define PY_ITERSEARCH_COUNT 1 +#define PY_ITERSEARCH_INDEX 2 +#define PY_ITERSEARCH_CONTAINS 3 + +/* Iterate over seq. + + Result depends on the operation: + + PY_ITERSEARCH_COUNT: return # of times obj appears in seq; -1 if + error. + PY_ITERSEARCH_INDEX: return 0-based index of first occurrence of + obj in seq; set ValueError and return -1 if none found; + also return -1 on error. + PY_ITERSEARCH_CONTAINS: return 1 if obj in seq, else 0; -1 on + error. */ +PyAPI_FUNC(Py_ssize_t) _PySequence_IterSearch(PyObject *seq, + PyObject *obj, int operation); +#endif + + +/* For DLL-level backwards compatibility */ +#undef PySequence_In +/* Determine if the sequence 'o' contains 'value'. If an item in 'o' is equal + to 'value', return 1, otherwise return 0. On error, return -1. + + This is equivalent to the Python expression: value in o. */ +PyAPI_FUNC(int) PySequence_In(PyObject *o, PyObject *value); + +/* For source-level backwards compatibility */ +#define PySequence_In PySequence_Contains + + +/* Return the first index for which o[i] == value. + On error, return -1. + + This is equivalent to the Python expression: o.index(value). */ +PyAPI_FUNC(Py_ssize_t) PySequence_Index(PyObject *o, PyObject *value); + + +/* --- In-place versions of some of the above Sequence functions --- */ + +/* Append sequence 'o2' to sequence 'o1', in-place when possible. Return the + resulting object, which could be 'o1', or NULL on failure. + + This is the equivalent of the Python expression: o1 += o2. */ +PyAPI_FUNC(PyObject *) PySequence_InPlaceConcat(PyObject *o1, PyObject *o2); + +/* Repeat sequence 'o' by 'count', in-place when possible. Return the resulting + object, which could be 'o', or NULL on failure. + + This is the equivalent of the Python expression: o1 *= count. */ +PyAPI_FUNC(PyObject *) PySequence_InPlaceRepeat(PyObject *o, Py_ssize_t count); + + +/* === Mapping protocol ================================================= */ + +/* Return 1 if the object provides mapping protocol, and 0 otherwise. + + This function always succeeds. */ +PyAPI_FUNC(int) PyMapping_Check(PyObject *o); + +/* Returns the number of keys in mapping object 'o' on success, and -1 on + failure. This is equivalent to the Python expression: len(o). */ +PyAPI_FUNC(Py_ssize_t) PyMapping_Size(PyObject *o); + +/* For DLL compatibility */ +#undef PyMapping_Length +PyAPI_FUNC(Py_ssize_t) PyMapping_Length(PyObject *o); +#define PyMapping_Length PyMapping_Size + + +/* Implemented as a macro: + + int PyMapping_DelItemString(PyObject *o, const char *key); + + Remove the mapping for the string 'key' from the mapping 'o'. Returns -1 on + failure. + + This is equivalent to the Python statement: del o[key]. */ +#define PyMapping_DelItemString(O,K) PyObject_DelItemString((O),(K)) + +/* Implemented as a macro: + + int PyMapping_DelItem(PyObject *o, PyObject *key); + + Remove the mapping for the object 'key' from the mapping object 'o'. + Returns -1 on failure. + + This is equivalent to the Python statement: del o[key]. */ +#define PyMapping_DelItem(O,K) PyObject_DelItem((O),(K)) + +/* On success, return 1 if the mapping object 'o' has the key 'key', + and 0 otherwise. + + This is equivalent to the Python expression: key in o. + + This function always succeeds. */ +PyAPI_FUNC(int) PyMapping_HasKeyString(PyObject *o, const char *key); + +/* Return 1 if the mapping object has the key 'key', and 0 otherwise. + + This is equivalent to the Python expression: key in o. + + This function always succeeds. */ +PyAPI_FUNC(int) PyMapping_HasKey(PyObject *o, PyObject *key); + +/* On success, return a list or tuple of the keys in mapping object 'o'. + On failure, return NULL. */ +PyAPI_FUNC(PyObject *) PyMapping_Keys(PyObject *o); + +/* On success, return a list or tuple of the values in mapping object 'o'. + On failure, return NULL. */ +PyAPI_FUNC(PyObject *) PyMapping_Values(PyObject *o); + +/* On success, return a list or tuple of the items in mapping object 'o', + where each item is a tuple containing a key-value pair. On failure, return + NULL. */ +PyAPI_FUNC(PyObject *) PyMapping_Items(PyObject *o); + +/* Return element of 'o' corresponding to the string 'key' or NULL on failure. + + This is the equivalent of the Python expression: o[key]. */ +PyAPI_FUNC(PyObject *) PyMapping_GetItemString(PyObject *o, + const char *key); + +/* Map the string 'key' to the value 'v' in the mapping 'o'. + Returns -1 on failure. + + This is the equivalent of the Python statement: o[key]=v. */ +PyAPI_FUNC(int) PyMapping_SetItemString(PyObject *o, const char *key, + PyObject *value); + +/* isinstance(object, typeorclass) */ +PyAPI_FUNC(int) PyObject_IsInstance(PyObject *object, PyObject *typeorclass); + +/* issubclass(object, typeorclass) */ +PyAPI_FUNC(int) PyObject_IsSubclass(PyObject *object, PyObject *typeorclass); + + +#ifndef Py_LIMITED_API +PyAPI_FUNC(int) _PyObject_RealIsInstance(PyObject *inst, PyObject *cls); + +PyAPI_FUNC(int) _PyObject_RealIsSubclass(PyObject *derived, PyObject *cls); + +PyAPI_FUNC(char *const *) _PySequence_BytesToCharpArray(PyObject* self); + +PyAPI_FUNC(void) _Py_FreeCharPArray(char *const array[]); + +/* For internal use by buffer API functions */ +PyAPI_FUNC(void) _Py_add_one_to_index_F(int nd, Py_ssize_t *index, + const Py_ssize_t *shape); +PyAPI_FUNC(void) _Py_add_one_to_index_C(int nd, Py_ssize_t *index, + const Py_ssize_t *shape); + +/* Convert Python int to Py_ssize_t. Do nothing if the argument is None. */ +PyAPI_FUNC(int) _Py_convert_optional_to_ssize_t(PyObject *, void *); +#endif /* !Py_LIMITED_API */ + + +#ifdef __cplusplus +} +#endif +#endif /* Py_ABSTRACTOBJECT_H */ diff --git a/env/Include/accu.h b/env/Include/accu.h new file mode 100644 index 0000000..3636ea6 --- /dev/null +++ b/env/Include/accu.h @@ -0,0 +1,37 @@ +#ifndef Py_LIMITED_API +#ifndef Py_ACCU_H +#define Py_ACCU_H + +/*** This is a private API for use by the interpreter and the stdlib. + *** Its definition may be changed or removed at any moment. + ***/ + +/* + * A two-level accumulator of unicode objects that avoids both the overhead + * of keeping a huge number of small separate objects, and the quadratic + * behaviour of using a naive repeated concatenation scheme. + */ + +#ifdef __cplusplus +extern "C" { +#endif + +#undef small /* defined by some Windows headers */ + +typedef struct { + PyObject *large; /* A list of previously accumulated large strings */ + PyObject *small; /* Pending small strings */ +} _PyAccu; + +PyAPI_FUNC(int) _PyAccu_Init(_PyAccu *acc); +PyAPI_FUNC(int) _PyAccu_Accumulate(_PyAccu *acc, PyObject *unicode); +PyAPI_FUNC(PyObject *) _PyAccu_FinishAsList(_PyAccu *acc); +PyAPI_FUNC(PyObject *) _PyAccu_Finish(_PyAccu *acc); +PyAPI_FUNC(void) _PyAccu_Destroy(_PyAccu *acc); + +#ifdef __cplusplus +} +#endif + +#endif /* Py_ACCU_H */ +#endif /* Py_LIMITED_API */ diff --git a/env/Include/asdl.h b/env/Include/asdl.h new file mode 100644 index 0000000..35e9fa1 --- /dev/null +++ b/env/Include/asdl.h @@ -0,0 +1,46 @@ +#ifndef Py_ASDL_H +#define Py_ASDL_H + +typedef PyObject * identifier; +typedef PyObject * string; +typedef PyObject * bytes; +typedef PyObject * object; +typedef PyObject * singleton; +typedef PyObject * constant; + +/* It would be nice if the code generated by asdl_c.py was completely + independent of Python, but it is a goal the requires too much work + at this stage. So, for example, I'll represent identifiers as + interned Python strings. +*/ + +/* XXX A sequence should be typed so that its use can be typechecked. */ + +typedef struct { + Py_ssize_t size; + void *elements[1]; +} asdl_seq; + +typedef struct { + Py_ssize_t size; + int elements[1]; +} asdl_int_seq; + +asdl_seq *_Py_asdl_seq_new(Py_ssize_t size, PyArena *arena); +asdl_int_seq *_Py_asdl_int_seq_new(Py_ssize_t size, PyArena *arena); + +#define asdl_seq_GET(S, I) (S)->elements[(I)] +#define asdl_seq_LEN(S) ((S) == NULL ? 0 : (S)->size) +#ifdef Py_DEBUG +#define asdl_seq_SET(S, I, V) \ + do { \ + Py_ssize_t _asdl_i = (I); \ + assert((S) != NULL); \ + assert(_asdl_i < (S)->size); \ + (S)->elements[_asdl_i] = (V); \ + } while (0) +#else +#define asdl_seq_SET(S, I, V) (S)->elements[I] = (V) +#endif + +#endif /* !Py_ASDL_H */ diff --git a/env/Include/ast.h b/env/Include/ast.h new file mode 100644 index 0000000..5bc2b05 --- /dev/null +++ b/env/Include/ast.h @@ -0,0 +1,29 @@ +#ifndef Py_AST_H +#define Py_AST_H +#ifdef __cplusplus +extern "C" { +#endif + +PyAPI_FUNC(int) PyAST_Validate(mod_ty); +PyAPI_FUNC(mod_ty) PyAST_FromNode( + const node *n, + PyCompilerFlags *flags, + const char *filename, /* decoded from the filesystem encoding */ + PyArena *arena); +PyAPI_FUNC(mod_ty) PyAST_FromNodeObject( + const node *n, + PyCompilerFlags *flags, + PyObject *filename, + PyArena *arena); + +#ifndef Py_LIMITED_API + +/* _PyAST_ExprAsUnicode is defined in ast_unparse.c */ +PyAPI_FUNC(PyObject *) _PyAST_ExprAsUnicode(expr_ty); + +#endif /* !Py_LIMITED_API */ + +#ifdef __cplusplus +} +#endif +#endif /* !Py_AST_H */ diff --git a/env/Include/bitset.h b/env/Include/bitset.h new file mode 100644 index 0000000..b22fa77 --- /dev/null +++ b/env/Include/bitset.h @@ -0,0 +1,32 @@ + +#ifndef Py_BITSET_H +#define Py_BITSET_H +#ifdef __cplusplus +extern "C" { +#endif + +/* Bitset interface */ + +#define BYTE char + +typedef BYTE *bitset; + +bitset newbitset(int nbits); +void delbitset(bitset bs); +#define testbit(ss, ibit) (((ss)[BIT2BYTE(ibit)] & BIT2MASK(ibit)) != 0) +int addbit(bitset bs, int ibit); /* Returns 0 if already set */ +int samebitset(bitset bs1, bitset bs2, int nbits); +void mergebitset(bitset bs1, bitset bs2, int nbits); + +#define BITSPERBYTE (8*sizeof(BYTE)) +#define NBYTES(nbits) (((nbits) + BITSPERBYTE - 1) / BITSPERBYTE) + +#define BIT2BYTE(ibit) ((ibit) / BITSPERBYTE) +#define BIT2SHIFT(ibit) ((ibit) % BITSPERBYTE) +#define BIT2MASK(ibit) (1 << BIT2SHIFT(ibit)) +#define BYTE2BIT(ibyte) ((ibyte) * BITSPERBYTE) + +#ifdef __cplusplus +} +#endif +#endif /* !Py_BITSET_H */ diff --git a/env/Include/bltinmodule.h b/env/Include/bltinmodule.h new file mode 100644 index 0000000..868c9e6 --- /dev/null +++ b/env/Include/bltinmodule.h @@ -0,0 +1,14 @@ +#ifndef Py_BLTINMODULE_H +#define Py_BLTINMODULE_H +#ifdef __cplusplus +extern "C" { +#endif + +PyAPI_DATA(PyTypeObject) PyFilter_Type; +PyAPI_DATA(PyTypeObject) PyMap_Type; +PyAPI_DATA(PyTypeObject) PyZip_Type; + +#ifdef __cplusplus +} +#endif +#endif /* !Py_BLTINMODULE_H */ diff --git a/env/Include/boolobject.h b/env/Include/boolobject.h new file mode 100644 index 0000000..7cc2f1f --- /dev/null +++ b/env/Include/boolobject.h @@ -0,0 +1,34 @@ +/* Boolean object interface */ + +#ifndef Py_BOOLOBJECT_H +#define Py_BOOLOBJECT_H +#ifdef __cplusplus +extern "C" { +#endif + + +PyAPI_DATA(PyTypeObject) PyBool_Type; + +#define PyBool_Check(x) (Py_TYPE(x) == &PyBool_Type) + +/* Py_False and Py_True are the only two bools in existence. +Don't forget to apply Py_INCREF() when returning either!!! */ + +/* Don't use these directly */ +PyAPI_DATA(struct _longobject) _Py_FalseStruct, _Py_TrueStruct; + +/* Use these macros */ +#define Py_False ((PyObject *) &_Py_FalseStruct) +#define Py_True ((PyObject *) &_Py_TrueStruct) + +/* Macros for returning Py_True or Py_False, respectively */ +#define Py_RETURN_TRUE return Py_INCREF(Py_True), Py_True +#define Py_RETURN_FALSE return Py_INCREF(Py_False), Py_False + +/* Function to return a bool from a C long */ +PyAPI_FUNC(PyObject *) PyBool_FromLong(long); + +#ifdef __cplusplus +} +#endif +#endif /* !Py_BOOLOBJECT_H */ diff --git a/env/Include/bytearrayobject.h b/env/Include/bytearrayobject.h new file mode 100644 index 0000000..a757b88 --- /dev/null +++ b/env/Include/bytearrayobject.h @@ -0,0 +1,62 @@ +/* ByteArray object interface */ + +#ifndef Py_BYTEARRAYOBJECT_H +#define Py_BYTEARRAYOBJECT_H +#ifdef __cplusplus +extern "C" { +#endif + +#include + +/* Type PyByteArrayObject represents a mutable array of bytes. + * The Python API is that of a sequence; + * the bytes are mapped to ints in [0, 256). + * Bytes are not characters; they may be used to encode characters. + * The only way to go between bytes and str/unicode is via encoding + * and decoding. + * For the convenience of C programmers, the bytes type is considered + * to contain a char pointer, not an unsigned char pointer. + */ + +/* Object layout */ +#ifndef Py_LIMITED_API +typedef struct { + PyObject_VAR_HEAD + Py_ssize_t ob_alloc; /* How many bytes allocated in ob_bytes */ + char *ob_bytes; /* Physical backing buffer */ + char *ob_start; /* Logical start inside ob_bytes */ + /* XXX(nnorwitz): should ob_exports be Py_ssize_t? */ + int ob_exports; /* How many buffer exports */ +} PyByteArrayObject; +#endif + +/* Type object */ +PyAPI_DATA(PyTypeObject) PyByteArray_Type; +PyAPI_DATA(PyTypeObject) PyByteArrayIter_Type; + +/* Type check macros */ +#define PyByteArray_Check(self) PyObject_TypeCheck(self, &PyByteArray_Type) +#define PyByteArray_CheckExact(self) (Py_TYPE(self) == &PyByteArray_Type) + +/* Direct API functions */ +PyAPI_FUNC(PyObject *) PyByteArray_FromObject(PyObject *); +PyAPI_FUNC(PyObject *) PyByteArray_Concat(PyObject *, PyObject *); +PyAPI_FUNC(PyObject *) PyByteArray_FromStringAndSize(const char *, Py_ssize_t); +PyAPI_FUNC(Py_ssize_t) PyByteArray_Size(PyObject *); +PyAPI_FUNC(char *) PyByteArray_AsString(PyObject *); +PyAPI_FUNC(int) PyByteArray_Resize(PyObject *, Py_ssize_t); + +/* Macros, trading safety for speed */ +#ifndef Py_LIMITED_API +#define PyByteArray_AS_STRING(self) \ + (assert(PyByteArray_Check(self)), \ + Py_SIZE(self) ? ((PyByteArrayObject *)(self))->ob_start : _PyByteArray_empty_string) +#define PyByteArray_GET_SIZE(self) (assert(PyByteArray_Check(self)), Py_SIZE(self)) + +PyAPI_DATA(char) _PyByteArray_empty_string[]; +#endif + +#ifdef __cplusplus +} +#endif +#endif /* !Py_BYTEARRAYOBJECT_H */ diff --git a/env/Include/bytes_methods.h b/env/Include/bytes_methods.h new file mode 100644 index 0000000..8434a50 --- /dev/null +++ b/env/Include/bytes_methods.h @@ -0,0 +1,69 @@ +#ifndef Py_LIMITED_API +#ifndef Py_BYTES_CTYPE_H +#define Py_BYTES_CTYPE_H + +/* + * The internal implementation behind PyBytes (bytes) and PyByteArray (bytearray) + * methods of the given names, they operate on ASCII byte strings. + */ +extern PyObject* _Py_bytes_isspace(const char *cptr, Py_ssize_t len); +extern PyObject* _Py_bytes_isalpha(const char *cptr, Py_ssize_t len); +extern PyObject* _Py_bytes_isalnum(const char *cptr, Py_ssize_t len); +extern PyObject* _Py_bytes_isascii(const char *cptr, Py_ssize_t len); +extern PyObject* _Py_bytes_isdigit(const char *cptr, Py_ssize_t len); +extern PyObject* _Py_bytes_islower(const char *cptr, Py_ssize_t len); +extern PyObject* _Py_bytes_isupper(const char *cptr, Py_ssize_t len); +extern PyObject* _Py_bytes_istitle(const char *cptr, Py_ssize_t len); + +/* These store their len sized answer in the given preallocated *result arg. */ +extern void _Py_bytes_lower(char *result, const char *cptr, Py_ssize_t len); +extern void _Py_bytes_upper(char *result, const char *cptr, Py_ssize_t len); +extern void _Py_bytes_title(char *result, const char *s, Py_ssize_t len); +extern void _Py_bytes_capitalize(char *result, const char *s, Py_ssize_t len); +extern void _Py_bytes_swapcase(char *result, const char *s, Py_ssize_t len); + +extern PyObject *_Py_bytes_find(const char *str, Py_ssize_t len, PyObject *args); +extern PyObject *_Py_bytes_index(const char *str, Py_ssize_t len, PyObject *args); +extern PyObject *_Py_bytes_rfind(const char *str, Py_ssize_t len, PyObject *args); +extern PyObject *_Py_bytes_rindex(const char *str, Py_ssize_t len, PyObject *args); +extern PyObject *_Py_bytes_count(const char *str, Py_ssize_t len, PyObject *args); +extern int _Py_bytes_contains(const char *str, Py_ssize_t len, PyObject *arg); +extern PyObject *_Py_bytes_startswith(const char *str, Py_ssize_t len, PyObject *args); +extern PyObject *_Py_bytes_endswith(const char *str, Py_ssize_t len, PyObject *args); + +/* The maketrans() static method. */ +extern PyObject* _Py_bytes_maketrans(Py_buffer *frm, Py_buffer *to); + +/* Shared __doc__ strings. */ +extern const char _Py_isspace__doc__[]; +extern const char _Py_isalpha__doc__[]; +extern const char _Py_isalnum__doc__[]; +extern const char _Py_isascii__doc__[]; +extern const char _Py_isdigit__doc__[]; +extern const char _Py_islower__doc__[]; +extern const char _Py_isupper__doc__[]; +extern const char _Py_istitle__doc__[]; +extern const char _Py_lower__doc__[]; +extern const char _Py_upper__doc__[]; +extern const char _Py_title__doc__[]; +extern const char _Py_capitalize__doc__[]; +extern const char _Py_swapcase__doc__[]; +extern const char _Py_count__doc__[]; +extern const char _Py_find__doc__[]; +extern const char _Py_index__doc__[]; +extern const char _Py_rfind__doc__[]; +extern const char _Py_rindex__doc__[]; +extern const char _Py_startswith__doc__[]; +extern const char _Py_endswith__doc__[]; +extern const char _Py_maketrans__doc__[]; +extern const char _Py_expandtabs__doc__[]; +extern const char _Py_ljust__doc__[]; +extern const char _Py_rjust__doc__[]; +extern const char _Py_center__doc__[]; +extern const char _Py_zfill__doc__[]; + +/* this is needed because some docs are shared from the .o, not static */ +#define PyDoc_STRVAR_shared(name,str) const char name[] = PyDoc_STR(str) + +#endif /* !Py_BYTES_CTYPE_H */ +#endif /* !Py_LIMITED_API */ diff --git a/env/Include/bytesobject.h b/env/Include/bytesobject.h new file mode 100644 index 0000000..3fde4a2 --- /dev/null +++ b/env/Include/bytesobject.h @@ -0,0 +1,224 @@ + +/* Bytes (String) object interface */ + +#ifndef Py_BYTESOBJECT_H +#define Py_BYTESOBJECT_H +#ifdef __cplusplus +extern "C" { +#endif + +#include + +/* +Type PyBytesObject represents a character string. An extra zero byte is +reserved at the end to ensure it is zero-terminated, but a size is +present so strings with null bytes in them can be represented. This +is an immutable object type. + +There are functions to create new string objects, to test +an object for string-ness, and to get the +string value. The latter function returns a null pointer +if the object is not of the proper type. +There is a variant that takes an explicit size as well as a +variant that assumes a zero-terminated string. Note that none of the +functions should be applied to nil objects. +*/ + +/* Caching the hash (ob_shash) saves recalculation of a string's hash value. + This significantly speeds up dict lookups. */ + +#ifndef Py_LIMITED_API +typedef struct { + PyObject_VAR_HEAD + Py_hash_t ob_shash; + char ob_sval[1]; + + /* Invariants: + * ob_sval contains space for 'ob_size+1' elements. + * ob_sval[ob_size] == 0. + * ob_shash is the hash of the string or -1 if not computed yet. + */ +} PyBytesObject; +#endif + +PyAPI_DATA(PyTypeObject) PyBytes_Type; +PyAPI_DATA(PyTypeObject) PyBytesIter_Type; + +#define PyBytes_Check(op) \ + PyType_FastSubclass(Py_TYPE(op), Py_TPFLAGS_BYTES_SUBCLASS) +#define PyBytes_CheckExact(op) (Py_TYPE(op) == &PyBytes_Type) + +PyAPI_FUNC(PyObject *) PyBytes_FromStringAndSize(const char *, Py_ssize_t); +PyAPI_FUNC(PyObject *) PyBytes_FromString(const char *); +PyAPI_FUNC(PyObject *) PyBytes_FromObject(PyObject *); +PyAPI_FUNC(PyObject *) PyBytes_FromFormatV(const char*, va_list) + Py_GCC_ATTRIBUTE((format(printf, 1, 0))); +PyAPI_FUNC(PyObject *) PyBytes_FromFormat(const char*, ...) + Py_GCC_ATTRIBUTE((format(printf, 1, 2))); +PyAPI_FUNC(Py_ssize_t) PyBytes_Size(PyObject *); +PyAPI_FUNC(char *) PyBytes_AsString(PyObject *); +PyAPI_FUNC(PyObject *) PyBytes_Repr(PyObject *, int); +PyAPI_FUNC(void) PyBytes_Concat(PyObject **, PyObject *); +PyAPI_FUNC(void) PyBytes_ConcatAndDel(PyObject **, PyObject *); +#ifndef Py_LIMITED_API +PyAPI_FUNC(int) _PyBytes_Resize(PyObject **, Py_ssize_t); +PyAPI_FUNC(PyObject*) _PyBytes_FormatEx( + const char *format, + Py_ssize_t format_len, + PyObject *args, + int use_bytearray); +PyAPI_FUNC(PyObject*) _PyBytes_FromHex( + PyObject *string, + int use_bytearray); +#endif +PyAPI_FUNC(PyObject *) PyBytes_DecodeEscape(const char *, Py_ssize_t, + const char *, Py_ssize_t, + const char *); +#ifndef Py_LIMITED_API +/* Helper for PyBytes_DecodeEscape that detects invalid escape chars. */ +PyAPI_FUNC(PyObject *) _PyBytes_DecodeEscape(const char *, Py_ssize_t, + const char *, Py_ssize_t, + const char *, + const char **); +#endif + +/* Macro, trading safety for speed */ +#ifndef Py_LIMITED_API +#define PyBytes_AS_STRING(op) (assert(PyBytes_Check(op)), \ + (((PyBytesObject *)(op))->ob_sval)) +#define PyBytes_GET_SIZE(op) (assert(PyBytes_Check(op)),Py_SIZE(op)) +#endif + +/* _PyBytes_Join(sep, x) is like sep.join(x). sep must be PyBytesObject*, + x must be an iterable object. */ +#ifndef Py_LIMITED_API +PyAPI_FUNC(PyObject *) _PyBytes_Join(PyObject *sep, PyObject *x); +#endif + +/* Provides access to the internal data buffer and size of a string + object or the default encoded version of a Unicode object. Passing + NULL as *len parameter will force the string buffer to be + 0-terminated (passing a string with embedded NULL characters will + cause an exception). */ +PyAPI_FUNC(int) PyBytes_AsStringAndSize( + PyObject *obj, /* string or Unicode object */ + char **s, /* pointer to buffer variable */ + Py_ssize_t *len /* pointer to length variable or NULL + (only possible for 0-terminated + strings) */ + ); + +/* Using the current locale, insert the thousands grouping + into the string pointed to by buffer. For the argument descriptions, + see Objects/stringlib/localeutil.h */ +#ifndef Py_LIMITED_API +PyAPI_FUNC(Py_ssize_t) _PyBytes_InsertThousandsGroupingLocale(char *buffer, + Py_ssize_t n_buffer, + char *digits, + Py_ssize_t n_digits, + Py_ssize_t min_width); + +/* Using explicit passed-in values, insert the thousands grouping + into the string pointed to by buffer. For the argument descriptions, + see Objects/stringlib/localeutil.h */ +PyAPI_FUNC(Py_ssize_t) _PyBytes_InsertThousandsGrouping(char *buffer, + Py_ssize_t n_buffer, + char *digits, + Py_ssize_t n_digits, + Py_ssize_t min_width, + const char *grouping, + const char *thousands_sep); +#endif + +/* Flags used by string formatting */ +#define F_LJUST (1<<0) +#define F_SIGN (1<<1) +#define F_BLANK (1<<2) +#define F_ALT (1<<3) +#define F_ZERO (1<<4) + +#ifndef Py_LIMITED_API +/* The _PyBytesWriter structure is big: it contains an embedded "stack buffer". + A _PyBytesWriter variable must be declared at the end of variables in a + function to optimize the memory allocation on the stack. */ +typedef struct { + /* bytes, bytearray or NULL (when the small buffer is used) */ + PyObject *buffer; + + /* Number of allocated size. */ + Py_ssize_t allocated; + + /* Minimum number of allocated bytes, + incremented by _PyBytesWriter_Prepare() */ + Py_ssize_t min_size; + + /* If non-zero, use a bytearray instead of a bytes object for buffer. */ + int use_bytearray; + + /* If non-zero, overallocate the buffer (default: 0). + This flag must be zero if use_bytearray is non-zero. */ + int overallocate; + + /* Stack buffer */ + int use_small_buffer; + char small_buffer[512]; +} _PyBytesWriter; + +/* Initialize a bytes writer + + By default, the overallocation is disabled. Set the overallocate attribute + to control the allocation of the buffer. */ +PyAPI_FUNC(void) _PyBytesWriter_Init(_PyBytesWriter *writer); + +/* Get the buffer content and reset the writer. + Return a bytes object, or a bytearray object if use_bytearray is non-zero. + Raise an exception and return NULL on error. */ +PyAPI_FUNC(PyObject *) _PyBytesWriter_Finish(_PyBytesWriter *writer, + void *str); + +/* Deallocate memory of a writer (clear its internal buffer). */ +PyAPI_FUNC(void) _PyBytesWriter_Dealloc(_PyBytesWriter *writer); + +/* Allocate the buffer to write size bytes. + Return the pointer to the beginning of buffer data. + Raise an exception and return NULL on error. */ +PyAPI_FUNC(void*) _PyBytesWriter_Alloc(_PyBytesWriter *writer, + Py_ssize_t size); + +/* Ensure that the buffer is large enough to write *size* bytes. + Add size to the writer minimum size (min_size attribute). + + str is the current pointer inside the buffer. + Return the updated current pointer inside the buffer. + Raise an exception and return NULL on error. */ +PyAPI_FUNC(void*) _PyBytesWriter_Prepare(_PyBytesWriter *writer, + void *str, + Py_ssize_t size); + +/* Resize the buffer to make it larger. + The new buffer may be larger than size bytes because of overallocation. + Return the updated current pointer inside the buffer. + Raise an exception and return NULL on error. + + Note: size must be greater than the number of allocated bytes in the writer. + + This function doesn't use the writer minimum size (min_size attribute). + + See also _PyBytesWriter_Prepare(). + */ +PyAPI_FUNC(void*) _PyBytesWriter_Resize(_PyBytesWriter *writer, + void *str, + Py_ssize_t size); + +/* Write bytes. + Raise an exception and return NULL on error. */ +PyAPI_FUNC(void*) _PyBytesWriter_WriteBytes(_PyBytesWriter *writer, + void *str, + const void *bytes, + Py_ssize_t size); +#endif /* Py_LIMITED_API */ + +#ifdef __cplusplus +} +#endif +#endif /* !Py_BYTESOBJECT_H */ diff --git a/env/Include/cellobject.h b/env/Include/cellobject.h new file mode 100644 index 0000000..2f9b5b7 --- /dev/null +++ b/env/Include/cellobject.h @@ -0,0 +1,29 @@ +/* Cell object interface */ +#ifndef Py_LIMITED_API +#ifndef Py_CELLOBJECT_H +#define Py_CELLOBJECT_H +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct { + PyObject_HEAD + PyObject *ob_ref; /* Content of the cell or NULL when empty */ +} PyCellObject; + +PyAPI_DATA(PyTypeObject) PyCell_Type; + +#define PyCell_Check(op) (Py_TYPE(op) == &PyCell_Type) + +PyAPI_FUNC(PyObject *) PyCell_New(PyObject *); +PyAPI_FUNC(PyObject *) PyCell_Get(PyObject *); +PyAPI_FUNC(int) PyCell_Set(PyObject *, PyObject *); + +#define PyCell_GET(op) (((PyCellObject *)(op))->ob_ref) +#define PyCell_SET(op, v) (((PyCellObject *)(op))->ob_ref = v) + +#ifdef __cplusplus +} +#endif +#endif /* !Py_TUPLEOBJECT_H */ +#endif /* Py_LIMITED_API */ diff --git a/env/Include/ceval.h b/env/Include/ceval.h new file mode 100644 index 0000000..11283c0 --- /dev/null +++ b/env/Include/ceval.h @@ -0,0 +1,239 @@ +#ifndef Py_CEVAL_H +#define Py_CEVAL_H +#ifdef __cplusplus +extern "C" { +#endif + + +/* Interface to random parts in ceval.c */ + +/* PyEval_CallObjectWithKeywords(), PyEval_CallObject(), PyEval_CallFunction + * and PyEval_CallMethod are kept for backward compatibility: PyObject_Call(), + * PyObject_CallFunction() and PyObject_CallMethod() are recommended to call + * a callable object. + */ + +PyAPI_FUNC(PyObject *) PyEval_CallObjectWithKeywords( + PyObject *callable, + PyObject *args, + PyObject *kwargs); + +/* Inline this */ +#define PyEval_CallObject(callable, arg) \ + PyEval_CallObjectWithKeywords(callable, arg, (PyObject *)NULL) + +PyAPI_FUNC(PyObject *) PyEval_CallFunction(PyObject *callable, + const char *format, ...); +PyAPI_FUNC(PyObject *) PyEval_CallMethod(PyObject *obj, + const char *name, + const char *format, ...); + +#ifndef Py_LIMITED_API +PyAPI_FUNC(void) PyEval_SetProfile(Py_tracefunc, PyObject *); +PyAPI_FUNC(void) PyEval_SetTrace(Py_tracefunc, PyObject *); +PyAPI_FUNC(void) _PyEval_SetCoroutineOriginTrackingDepth(int new_depth); +PyAPI_FUNC(int) _PyEval_GetCoroutineOriginTrackingDepth(void); +PyAPI_FUNC(void) _PyEval_SetCoroutineWrapper(PyObject *); +PyAPI_FUNC(PyObject *) _PyEval_GetCoroutineWrapper(void); +PyAPI_FUNC(void) _PyEval_SetAsyncGenFirstiter(PyObject *); +PyAPI_FUNC(PyObject *) _PyEval_GetAsyncGenFirstiter(void); +PyAPI_FUNC(void) _PyEval_SetAsyncGenFinalizer(PyObject *); +PyAPI_FUNC(PyObject *) _PyEval_GetAsyncGenFinalizer(void); +#endif + +struct _frame; /* Avoid including frameobject.h */ + +PyAPI_FUNC(PyObject *) PyEval_GetBuiltins(void); +PyAPI_FUNC(PyObject *) PyEval_GetGlobals(void); +PyAPI_FUNC(PyObject *) PyEval_GetLocals(void); +PyAPI_FUNC(struct _frame *) PyEval_GetFrame(void); + +#ifndef Py_LIMITED_API +/* Helper to look up a builtin object */ +PyAPI_FUNC(PyObject *) _PyEval_GetBuiltinId(_Py_Identifier *); +/* Look at the current frame's (if any) code's co_flags, and turn on + the corresponding compiler flags in cf->cf_flags. Return 1 if any + flag was set, else return 0. */ +PyAPI_FUNC(int) PyEval_MergeCompilerFlags(PyCompilerFlags *cf); +#endif + +PyAPI_FUNC(int) Py_AddPendingCall(int (*func)(void *), void *arg); +PyAPI_FUNC(void) _PyEval_SignalReceived(void); +PyAPI_FUNC(int) Py_MakePendingCalls(void); + +/* Protection against deeply nested recursive calls + + In Python 3.0, this protection has two levels: + * normal anti-recursion protection is triggered when the recursion level + exceeds the current recursion limit. It raises a RecursionError, and sets + the "overflowed" flag in the thread state structure. This flag + temporarily *disables* the normal protection; this allows cleanup code + to potentially outgrow the recursion limit while processing the + RecursionError. + * "last chance" anti-recursion protection is triggered when the recursion + level exceeds "current recursion limit + 50". By construction, this + protection can only be triggered when the "overflowed" flag is set. It + means the cleanup code has itself gone into an infinite loop, or the + RecursionError has been mistakingly ignored. When this protection is + triggered, the interpreter aborts with a Fatal Error. + + In addition, the "overflowed" flag is automatically reset when the + recursion level drops below "current recursion limit - 50". This heuristic + is meant to ensure that the normal anti-recursion protection doesn't get + disabled too long. + + Please note: this scheme has its own limitations. See: + http://mail.python.org/pipermail/python-dev/2008-August/082106.html + for some observations. +*/ +PyAPI_FUNC(void) Py_SetRecursionLimit(int); +PyAPI_FUNC(int) Py_GetRecursionLimit(void); + +#define Py_EnterRecursiveCall(where) \ + (_Py_MakeRecCheck(PyThreadState_GET()->recursion_depth) && \ + _Py_CheckRecursiveCall(where)) +#define Py_LeaveRecursiveCall() \ + do{ if(_Py_MakeEndRecCheck(PyThreadState_GET()->recursion_depth)) \ + PyThreadState_GET()->overflowed = 0; \ + } while(0) +PyAPI_FUNC(int) _Py_CheckRecursiveCall(const char *where); + +/* Due to the macros in which it's used, _Py_CheckRecursionLimit is in + the stable ABI. It should be removed therefrom when possible. +*/ +PyAPI_DATA(int) _Py_CheckRecursionLimit; + +#ifdef USE_STACKCHECK +/* With USE_STACKCHECK, trigger stack checks in _Py_CheckRecursiveCall() + on every 64th call to Py_EnterRecursiveCall. +*/ +# define _Py_MakeRecCheck(x) \ + (++(x) > _Py_CheckRecursionLimit || \ + ++(PyThreadState_GET()->stackcheck_counter) > 64) +#else +# define _Py_MakeRecCheck(x) (++(x) > _Py_CheckRecursionLimit) +#endif + +/* Compute the "lower-water mark" for a recursion limit. When + * Py_LeaveRecursiveCall() is called with a recursion depth below this mark, + * the overflowed flag is reset to 0. */ +#define _Py_RecursionLimitLowerWaterMark(limit) \ + (((limit) > 200) \ + ? ((limit) - 50) \ + : (3 * ((limit) >> 2))) + +#define _Py_MakeEndRecCheck(x) \ + (--(x) < _Py_RecursionLimitLowerWaterMark(_Py_CheckRecursionLimit)) + +#define Py_ALLOW_RECURSION \ + do { unsigned char _old = PyThreadState_GET()->recursion_critical;\ + PyThreadState_GET()->recursion_critical = 1; + +#define Py_END_ALLOW_RECURSION \ + PyThreadState_GET()->recursion_critical = _old; \ + } while(0); + +PyAPI_FUNC(const char *) PyEval_GetFuncName(PyObject *); +PyAPI_FUNC(const char *) PyEval_GetFuncDesc(PyObject *); + +PyAPI_FUNC(PyObject *) PyEval_EvalFrame(struct _frame *); +PyAPI_FUNC(PyObject *) PyEval_EvalFrameEx(struct _frame *f, int exc); +#ifndef Py_LIMITED_API +PyAPI_FUNC(PyObject *) _PyEval_EvalFrameDefault(struct _frame *f, int exc); +#endif + +/* Interface for threads. + + A module that plans to do a blocking system call (or something else + that lasts a long time and doesn't touch Python data) can allow other + threads to run as follows: + + ...preparations here... + Py_BEGIN_ALLOW_THREADS + ...blocking system call here... + Py_END_ALLOW_THREADS + ...interpret result here... + + The Py_BEGIN_ALLOW_THREADS/Py_END_ALLOW_THREADS pair expands to a + {}-surrounded block. + To leave the block in the middle (e.g., with return), you must insert + a line containing Py_BLOCK_THREADS before the return, e.g. + + if (...premature_exit...) { + Py_BLOCK_THREADS + PyErr_SetFromErrno(PyExc_OSError); + return NULL; + } + + An alternative is: + + Py_BLOCK_THREADS + if (...premature_exit...) { + PyErr_SetFromErrno(PyExc_OSError); + return NULL; + } + Py_UNBLOCK_THREADS + + For convenience, that the value of 'errno' is restored across + Py_END_ALLOW_THREADS and Py_BLOCK_THREADS. + + WARNING: NEVER NEST CALLS TO Py_BEGIN_ALLOW_THREADS AND + Py_END_ALLOW_THREADS!!! + + The function PyEval_InitThreads() should be called only from + init_thread() in "_threadmodule.c". + + Note that not yet all candidates have been converted to use this + mechanism! +*/ + +PyAPI_FUNC(PyThreadState *) PyEval_SaveThread(void); +PyAPI_FUNC(void) PyEval_RestoreThread(PyThreadState *); + +PyAPI_FUNC(int) PyEval_ThreadsInitialized(void); +PyAPI_FUNC(void) PyEval_InitThreads(void); +#ifndef Py_LIMITED_API +PyAPI_FUNC(void) _PyEval_FiniThreads(void); +#endif /* !Py_LIMITED_API */ +PyAPI_FUNC(void) PyEval_AcquireLock(void) Py_DEPRECATED(3.2); +PyAPI_FUNC(void) PyEval_ReleaseLock(void) /* Py_DEPRECATED(3.2) */; +PyAPI_FUNC(void) PyEval_AcquireThread(PyThreadState *tstate); +PyAPI_FUNC(void) PyEval_ReleaseThread(PyThreadState *tstate); +PyAPI_FUNC(void) PyEval_ReInitThreads(void); + +#ifndef Py_LIMITED_API +PyAPI_FUNC(void) _PyEval_SetSwitchInterval(unsigned long microseconds); +PyAPI_FUNC(unsigned long) _PyEval_GetSwitchInterval(void); +#endif + +#ifndef Py_LIMITED_API +PyAPI_FUNC(Py_ssize_t) _PyEval_RequestCodeExtraIndex(freefunc); +#endif + +#define Py_BEGIN_ALLOW_THREADS { \ + PyThreadState *_save; \ + _save = PyEval_SaveThread(); +#define Py_BLOCK_THREADS PyEval_RestoreThread(_save); +#define Py_UNBLOCK_THREADS _save = PyEval_SaveThread(); +#define Py_END_ALLOW_THREADS PyEval_RestoreThread(_save); \ + } + +#ifndef Py_LIMITED_API +PyAPI_FUNC(int) _PyEval_SliceIndex(PyObject *, Py_ssize_t *); +PyAPI_FUNC(int) _PyEval_SliceIndexNotNone(PyObject *, Py_ssize_t *); +PyAPI_FUNC(void) _PyEval_SignalAsyncExc(void); +#endif + +/* Masks and values used by FORMAT_VALUE opcode. */ +#define FVC_MASK 0x3 +#define FVC_NONE 0x0 +#define FVC_STR 0x1 +#define FVC_REPR 0x2 +#define FVC_ASCII 0x3 +#define FVS_MASK 0x4 +#define FVS_HAVE_SPEC 0x4 + +#ifdef __cplusplus +} +#endif +#endif /* !Py_CEVAL_H */ diff --git a/env/Include/classobject.h b/env/Include/classobject.h new file mode 100644 index 0000000..209f0f4 --- /dev/null +++ b/env/Include/classobject.h @@ -0,0 +1,58 @@ +/* Former class object interface -- now only bound methods are here */ + +/* Revealing some structures (not for general use) */ + +#ifndef Py_LIMITED_API +#ifndef Py_CLASSOBJECT_H +#define Py_CLASSOBJECT_H +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct { + PyObject_HEAD + PyObject *im_func; /* The callable object implementing the method */ + PyObject *im_self; /* The instance it is bound to */ + PyObject *im_weakreflist; /* List of weak references */ +} PyMethodObject; + +PyAPI_DATA(PyTypeObject) PyMethod_Type; + +#define PyMethod_Check(op) ((op)->ob_type == &PyMethod_Type) + +PyAPI_FUNC(PyObject *) PyMethod_New(PyObject *, PyObject *); + +PyAPI_FUNC(PyObject *) PyMethod_Function(PyObject *); +PyAPI_FUNC(PyObject *) PyMethod_Self(PyObject *); + +/* Macros for direct access to these values. Type checks are *not* + done, so use with care. */ +#define PyMethod_GET_FUNCTION(meth) \ + (((PyMethodObject *)meth) -> im_func) +#define PyMethod_GET_SELF(meth) \ + (((PyMethodObject *)meth) -> im_self) + +PyAPI_FUNC(int) PyMethod_ClearFreeList(void); + +typedef struct { + PyObject_HEAD + PyObject *func; +} PyInstanceMethodObject; + +PyAPI_DATA(PyTypeObject) PyInstanceMethod_Type; + +#define PyInstanceMethod_Check(op) ((op)->ob_type == &PyInstanceMethod_Type) + +PyAPI_FUNC(PyObject *) PyInstanceMethod_New(PyObject *); +PyAPI_FUNC(PyObject *) PyInstanceMethod_Function(PyObject *); + +/* Macros for direct access to these values. Type checks are *not* + done, so use with care. */ +#define PyInstanceMethod_GET_FUNCTION(meth) \ + (((PyInstanceMethodObject *)meth) -> func) + +#ifdef __cplusplus +} +#endif +#endif /* !Py_CLASSOBJECT_H */ +#endif /* Py_LIMITED_API */ diff --git a/env/Include/code.h b/env/Include/code.h new file mode 100644 index 0000000..2e661e8 --- /dev/null +++ b/env/Include/code.h @@ -0,0 +1,157 @@ +/* Definitions for bytecode */ + +#ifndef Py_LIMITED_API +#ifndef Py_CODE_H +#define Py_CODE_H +#ifdef __cplusplus +extern "C" { +#endif + +typedef uint16_t _Py_CODEUNIT; + +#ifdef WORDS_BIGENDIAN +# define _Py_OPCODE(word) ((word) >> 8) +# define _Py_OPARG(word) ((word) & 255) +#else +# define _Py_OPCODE(word) ((word) & 255) +# define _Py_OPARG(word) ((word) >> 8) +#endif + +/* Bytecode object */ +typedef struct { + PyObject_HEAD + int co_argcount; /* #arguments, except *args */ + int co_kwonlyargcount; /* #keyword only arguments */ + int co_nlocals; /* #local variables */ + int co_stacksize; /* #entries needed for evaluation stack */ + int co_flags; /* CO_..., see below */ + int co_firstlineno; /* first source line number */ + PyObject *co_code; /* instruction opcodes */ + PyObject *co_consts; /* list (constants used) */ + PyObject *co_names; /* list of strings (names used) */ + PyObject *co_varnames; /* tuple of strings (local variable names) */ + PyObject *co_freevars; /* tuple of strings (free variable names) */ + PyObject *co_cellvars; /* tuple of strings (cell variable names) */ + /* The rest aren't used in either hash or comparisons, except for co_name, + used in both. This is done to preserve the name and line number + for tracebacks and debuggers; otherwise, constant de-duplication + would collapse identical functions/lambdas defined on different lines. + */ + Py_ssize_t *co_cell2arg; /* Maps cell vars which are arguments. */ + PyObject *co_filename; /* unicode (where it was loaded from) */ + PyObject *co_name; /* unicode (name, for reference) */ + PyObject *co_lnotab; /* string (encoding addr<->lineno mapping) See + Objects/lnotab_notes.txt for details. */ + void *co_zombieframe; /* for optimization only (see frameobject.c) */ + PyObject *co_weakreflist; /* to support weakrefs to code objects */ + /* Scratch space for extra data relating to the code object. + Type is a void* to keep the format private in codeobject.c to force + people to go through the proper APIs. */ + void *co_extra; +} PyCodeObject; + +/* Masks for co_flags above */ +#define CO_OPTIMIZED 0x0001 +#define CO_NEWLOCALS 0x0002 +#define CO_VARARGS 0x0004 +#define CO_VARKEYWORDS 0x0008 +#define CO_NESTED 0x0010 +#define CO_GENERATOR 0x0020 +/* The CO_NOFREE flag is set if there are no free or cell variables. + This information is redundant, but it allows a single flag test + to determine whether there is any extra work to be done when the + call frame it setup. +*/ +#define CO_NOFREE 0x0040 + +/* The CO_COROUTINE flag is set for coroutine functions (defined with + ``async def`` keywords) */ +#define CO_COROUTINE 0x0080 +#define CO_ITERABLE_COROUTINE 0x0100 +#define CO_ASYNC_GENERATOR 0x0200 + +/* These are no longer used. */ +#if 0 +#define CO_GENERATOR_ALLOWED 0x1000 +#endif +#define CO_FUTURE_DIVISION 0x2000 +#define CO_FUTURE_ABSOLUTE_IMPORT 0x4000 /* do absolute imports by default */ +#define CO_FUTURE_WITH_STATEMENT 0x8000 +#define CO_FUTURE_PRINT_FUNCTION 0x10000 +#define CO_FUTURE_UNICODE_LITERALS 0x20000 + +#define CO_FUTURE_BARRY_AS_BDFL 0x40000 +#define CO_FUTURE_GENERATOR_STOP 0x80000 +#define CO_FUTURE_ANNOTATIONS 0x100000 + +/* This value is found in the co_cell2arg array when the associated cell + variable does not correspond to an argument. */ +#define CO_CELL_NOT_AN_ARG (-1) + +/* This should be defined if a future statement modifies the syntax. + For example, when a keyword is added. +*/ +#define PY_PARSER_REQUIRES_FUTURE_KEYWORD + +#define CO_MAXBLOCKS 20 /* Max static block nesting within a function */ + +PyAPI_DATA(PyTypeObject) PyCode_Type; + +#define PyCode_Check(op) (Py_TYPE(op) == &PyCode_Type) +#define PyCode_GetNumFree(op) (PyTuple_GET_SIZE((op)->co_freevars)) + +/* Public interface */ +PyAPI_FUNC(PyCodeObject *) PyCode_New( + int, int, int, int, int, PyObject *, PyObject *, + PyObject *, PyObject *, PyObject *, PyObject *, + PyObject *, PyObject *, int, PyObject *); + /* same as struct above */ + +/* Creates a new empty code object with the specified source location. */ +PyAPI_FUNC(PyCodeObject *) +PyCode_NewEmpty(const char *filename, const char *funcname, int firstlineno); + +/* Return the line number associated with the specified bytecode index + in this code object. If you just need the line number of a frame, + use PyFrame_GetLineNumber() instead. */ +PyAPI_FUNC(int) PyCode_Addr2Line(PyCodeObject *, int); + +/* for internal use only */ +typedef struct _addr_pair { + int ap_lower; + int ap_upper; +} PyAddrPair; + +#ifndef Py_LIMITED_API +/* Update *bounds to describe the first and one-past-the-last instructions in the + same line as lasti. Return the number of that line. +*/ +PyAPI_FUNC(int) _PyCode_CheckLineNumber(PyCodeObject* co, + int lasti, PyAddrPair *bounds); + +/* Create a comparable key used to compare constants taking in account the + * object type. It is used to make sure types are not coerced (e.g., float and + * complex) _and_ to distinguish 0.0 from -0.0 e.g. on IEEE platforms + * + * Return (type(obj), obj, ...): a tuple with variable size (at least 2 items) + * depending on the type and the value. The type is the first item to not + * compare bytes and str which can raise a BytesWarning exception. */ +PyAPI_FUNC(PyObject*) _PyCode_ConstantKey(PyObject *obj); +#endif + +PyAPI_FUNC(PyObject*) PyCode_Optimize(PyObject *code, PyObject* consts, + PyObject *names, PyObject *lnotab); + + +#ifndef Py_LIMITED_API +PyAPI_FUNC(int) _PyCode_GetExtra(PyObject *code, Py_ssize_t index, + void **extra); +PyAPI_FUNC(int) _PyCode_SetExtra(PyObject *code, Py_ssize_t index, + void *extra); +#endif + +#ifdef __cplusplus +} +#endif +#endif /* !Py_CODE_H */ +#endif /* Py_LIMITED_API */ diff --git a/env/Include/codecs.h b/env/Include/codecs.h new file mode 100644 index 0000000..3ad0f2b --- /dev/null +++ b/env/Include/codecs.h @@ -0,0 +1,240 @@ +#ifndef Py_CODECREGISTRY_H +#define Py_CODECREGISTRY_H +#ifdef __cplusplus +extern "C" { +#endif + +/* ------------------------------------------------------------------------ + + Python Codec Registry and support functions + + +Written by Marc-Andre Lemburg (mal@lemburg.com). + +Copyright (c) Corporation for National Research Initiatives. + + ------------------------------------------------------------------------ */ + +/* Register a new codec search function. + + As side effect, this tries to load the encodings package, if not + yet done, to make sure that it is always first in the list of + search functions. + + The search_function's refcount is incremented by this function. */ + +PyAPI_FUNC(int) PyCodec_Register( + PyObject *search_function + ); + +/* Codec registry lookup API. + + Looks up the given encoding and returns a CodecInfo object with + function attributes which implement the different aspects of + processing the encoding. + + The encoding string is looked up converted to all lower-case + characters. This makes encodings looked up through this mechanism + effectively case-insensitive. + + If no codec is found, a KeyError is set and NULL returned. + + As side effect, this tries to load the encodings package, if not + yet done. This is part of the lazy load strategy for the encodings + package. + + */ + +#ifndef Py_LIMITED_API +PyAPI_FUNC(PyObject *) _PyCodec_Lookup( + const char *encoding + ); + +PyAPI_FUNC(int) _PyCodec_Forget( + const char *encoding + ); +#endif + +/* Codec registry encoding check API. + + Returns 1/0 depending on whether there is a registered codec for + the given encoding. + +*/ + +PyAPI_FUNC(int) PyCodec_KnownEncoding( + const char *encoding + ); + +/* Generic codec based encoding API. + + object is passed through the encoder function found for the given + encoding using the error handling method defined by errors. errors + may be NULL to use the default method defined for the codec. + + Raises a LookupError in case no encoder can be found. + + */ + +PyAPI_FUNC(PyObject *) PyCodec_Encode( + PyObject *object, + const char *encoding, + const char *errors + ); + +/* Generic codec based decoding API. + + object is passed through the decoder function found for the given + encoding using the error handling method defined by errors. errors + may be NULL to use the default method defined for the codec. + + Raises a LookupError in case no encoder can be found. + + */ + +PyAPI_FUNC(PyObject *) PyCodec_Decode( + PyObject *object, + const char *encoding, + const char *errors + ); + +#ifndef Py_LIMITED_API +/* Text codec specific encoding and decoding API. + + Checks the encoding against a list of codecs which do not + implement a str<->bytes encoding before attempting the + operation. + + Please note that these APIs are internal and should not + be used in Python C extensions. + + XXX (ncoghlan): should we make these, or something like them, public + in Python 3.5+? + + */ +PyAPI_FUNC(PyObject *) _PyCodec_LookupTextEncoding( + const char *encoding, + const char *alternate_command + ); + +PyAPI_FUNC(PyObject *) _PyCodec_EncodeText( + PyObject *object, + const char *encoding, + const char *errors + ); + +PyAPI_FUNC(PyObject *) _PyCodec_DecodeText( + PyObject *object, + const char *encoding, + const char *errors + ); + +/* These two aren't actually text encoding specific, but _io.TextIOWrapper + * is the only current API consumer. + */ +PyAPI_FUNC(PyObject *) _PyCodecInfo_GetIncrementalDecoder( + PyObject *codec_info, + const char *errors + ); + +PyAPI_FUNC(PyObject *) _PyCodecInfo_GetIncrementalEncoder( + PyObject *codec_info, + const char *errors + ); +#endif + + + +/* --- Codec Lookup APIs -------------------------------------------------- + + All APIs return a codec object with incremented refcount and are + based on _PyCodec_Lookup(). The same comments w/r to the encoding + name also apply to these APIs. + +*/ + +/* Get an encoder function for the given encoding. */ + +PyAPI_FUNC(PyObject *) PyCodec_Encoder( + const char *encoding + ); + +/* Get a decoder function for the given encoding. */ + +PyAPI_FUNC(PyObject *) PyCodec_Decoder( + const char *encoding + ); + +/* Get an IncrementalEncoder object for the given encoding. */ + +PyAPI_FUNC(PyObject *) PyCodec_IncrementalEncoder( + const char *encoding, + const char *errors + ); + +/* Get an IncrementalDecoder object function for the given encoding. */ + +PyAPI_FUNC(PyObject *) PyCodec_IncrementalDecoder( + const char *encoding, + const char *errors + ); + +/* Get a StreamReader factory function for the given encoding. */ + +PyAPI_FUNC(PyObject *) PyCodec_StreamReader( + const char *encoding, + PyObject *stream, + const char *errors + ); + +/* Get a StreamWriter factory function for the given encoding. */ + +PyAPI_FUNC(PyObject *) PyCodec_StreamWriter( + const char *encoding, + PyObject *stream, + const char *errors + ); + +/* Unicode encoding error handling callback registry API */ + +/* Register the error handling callback function error under the given + name. This function will be called by the codec when it encounters + unencodable characters/undecodable bytes and doesn't know the + callback name, when name is specified as the error parameter + in the call to the encode/decode function. + Return 0 on success, -1 on error */ +PyAPI_FUNC(int) PyCodec_RegisterError(const char *name, PyObject *error); + +/* Lookup the error handling callback function registered under the given + name. As a special case NULL can be passed, in which case + the error handling callback for "strict" will be returned. */ +PyAPI_FUNC(PyObject *) PyCodec_LookupError(const char *name); + +/* raise exc as an exception */ +PyAPI_FUNC(PyObject *) PyCodec_StrictErrors(PyObject *exc); + +/* ignore the unicode error, skipping the faulty input */ +PyAPI_FUNC(PyObject *) PyCodec_IgnoreErrors(PyObject *exc); + +/* replace the unicode encode error with ? or U+FFFD */ +PyAPI_FUNC(PyObject *) PyCodec_ReplaceErrors(PyObject *exc); + +/* replace the unicode encode error with XML character references */ +PyAPI_FUNC(PyObject *) PyCodec_XMLCharRefReplaceErrors(PyObject *exc); + +/* replace the unicode encode error with backslash escapes (\x, \u and \U) */ +PyAPI_FUNC(PyObject *) PyCodec_BackslashReplaceErrors(PyObject *exc); + +#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03050000 +/* replace the unicode encode error with backslash escapes (\N, \x, \u and \U) */ +PyAPI_FUNC(PyObject *) PyCodec_NameReplaceErrors(PyObject *exc); +#endif + +#ifndef Py_LIMITED_API +PyAPI_DATA(const char *) Py_hexdigits; +#endif + +#ifdef __cplusplus +} +#endif +#endif /* !Py_CODECREGISTRY_H */ diff --git a/env/Include/compile.h b/env/Include/compile.h new file mode 100644 index 0000000..edb961f --- /dev/null +++ b/env/Include/compile.h @@ -0,0 +1,93 @@ +#ifndef Py_COMPILE_H +#define Py_COMPILE_H + +#ifndef Py_LIMITED_API +#include "code.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/* Public interface */ +struct _node; /* Declare the existence of this type */ +PyAPI_FUNC(PyCodeObject *) PyNode_Compile(struct _node *, const char *); +/* XXX (ncoghlan): Unprefixed type name in a public API! */ + +#define PyCF_MASK (CO_FUTURE_DIVISION | CO_FUTURE_ABSOLUTE_IMPORT | \ + CO_FUTURE_WITH_STATEMENT | CO_FUTURE_PRINT_FUNCTION | \ + CO_FUTURE_UNICODE_LITERALS | CO_FUTURE_BARRY_AS_BDFL | \ + CO_FUTURE_GENERATOR_STOP | CO_FUTURE_ANNOTATIONS) +#define PyCF_MASK_OBSOLETE (CO_NESTED) +#define PyCF_SOURCE_IS_UTF8 0x0100 +#define PyCF_DONT_IMPLY_DEDENT 0x0200 +#define PyCF_ONLY_AST 0x0400 +#define PyCF_IGNORE_COOKIE 0x0800 + +#ifndef Py_LIMITED_API +typedef struct { + int cf_flags; /* bitmask of CO_xxx flags relevant to future */ +} PyCompilerFlags; +#endif + +/* Future feature support */ + +typedef struct { + int ff_features; /* flags set by future statements */ + int ff_lineno; /* line number of last future statement */ +} PyFutureFeatures; + +#define FUTURE_NESTED_SCOPES "nested_scopes" +#define FUTURE_GENERATORS "generators" +#define FUTURE_DIVISION "division" +#define FUTURE_ABSOLUTE_IMPORT "absolute_import" +#define FUTURE_WITH_STATEMENT "with_statement" +#define FUTURE_PRINT_FUNCTION "print_function" +#define FUTURE_UNICODE_LITERALS "unicode_literals" +#define FUTURE_BARRY_AS_BDFL "barry_as_FLUFL" +#define FUTURE_GENERATOR_STOP "generator_stop" +#define FUTURE_ANNOTATIONS "annotations" + +struct _mod; /* Declare the existence of this type */ +#define PyAST_Compile(mod, s, f, ar) PyAST_CompileEx(mod, s, f, -1, ar) +PyAPI_FUNC(PyCodeObject *) PyAST_CompileEx( + struct _mod *mod, + const char *filename, /* decoded from the filesystem encoding */ + PyCompilerFlags *flags, + int optimize, + PyArena *arena); +PyAPI_FUNC(PyCodeObject *) PyAST_CompileObject( + struct _mod *mod, + PyObject *filename, + PyCompilerFlags *flags, + int optimize, + PyArena *arena); +PyAPI_FUNC(PyFutureFeatures *) PyFuture_FromAST( + struct _mod * mod, + const char *filename /* decoded from the filesystem encoding */ + ); +PyAPI_FUNC(PyFutureFeatures *) PyFuture_FromASTObject( + struct _mod * mod, + PyObject *filename + ); + +/* _Py_Mangle is defined in compile.c */ +PyAPI_FUNC(PyObject*) _Py_Mangle(PyObject *p, PyObject *name); + +#define PY_INVALID_STACK_EFFECT INT_MAX +PyAPI_FUNC(int) PyCompile_OpcodeStackEffect(int opcode, int oparg); + +PyAPI_FUNC(int) _PyAST_Optimize(struct _mod *, PyArena *arena, int optimize); + +#ifdef __cplusplus +} +#endif + +#endif /* !Py_LIMITED_API */ + +/* These definitions must match corresponding definitions in graminit.h. + There's code in compile.c that checks that they are the same. */ +#define Py_single_input 256 +#define Py_file_input 257 +#define Py_eval_input 258 + +#endif /* !Py_COMPILE_H */ diff --git a/env/Include/complexobject.h b/env/Include/complexobject.h new file mode 100644 index 0000000..cb8c52c --- /dev/null +++ b/env/Include/complexobject.h @@ -0,0 +1,69 @@ +/* Complex number structure */ + +#ifndef Py_COMPLEXOBJECT_H +#define Py_COMPLEXOBJECT_H +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef Py_LIMITED_API +typedef struct { + double real; + double imag; +} Py_complex; + +/* Operations on complex numbers from complexmodule.c */ + +PyAPI_FUNC(Py_complex) _Py_c_sum(Py_complex, Py_complex); +PyAPI_FUNC(Py_complex) _Py_c_diff(Py_complex, Py_complex); +PyAPI_FUNC(Py_complex) _Py_c_neg(Py_complex); +PyAPI_FUNC(Py_complex) _Py_c_prod(Py_complex, Py_complex); +PyAPI_FUNC(Py_complex) _Py_c_quot(Py_complex, Py_complex); +PyAPI_FUNC(Py_complex) _Py_c_pow(Py_complex, Py_complex); +PyAPI_FUNC(double) _Py_c_abs(Py_complex); +#endif + +/* Complex object interface */ + +/* +PyComplexObject represents a complex number with double-precision +real and imaginary parts. +*/ +#ifndef Py_LIMITED_API +typedef struct { + PyObject_HEAD + Py_complex cval; +} PyComplexObject; +#endif + +PyAPI_DATA(PyTypeObject) PyComplex_Type; + +#define PyComplex_Check(op) PyObject_TypeCheck(op, &PyComplex_Type) +#define PyComplex_CheckExact(op) (Py_TYPE(op) == &PyComplex_Type) + +#ifndef Py_LIMITED_API +PyAPI_FUNC(PyObject *) PyComplex_FromCComplex(Py_complex); +#endif +PyAPI_FUNC(PyObject *) PyComplex_FromDoubles(double real, double imag); + +PyAPI_FUNC(double) PyComplex_RealAsDouble(PyObject *op); +PyAPI_FUNC(double) PyComplex_ImagAsDouble(PyObject *op); +#ifndef Py_LIMITED_API +PyAPI_FUNC(Py_complex) PyComplex_AsCComplex(PyObject *op); +#endif + +/* Format the object based on the format_spec, as defined in PEP 3101 + (Advanced String Formatting). */ +#ifndef Py_LIMITED_API +PyAPI_FUNC(int) _PyComplex_FormatAdvancedWriter( + _PyUnicodeWriter *writer, + PyObject *obj, + PyObject *format_spec, + Py_ssize_t start, + Py_ssize_t end); +#endif + +#ifdef __cplusplus +} +#endif +#endif /* !Py_COMPLEXOBJECT_H */ diff --git a/env/Include/context.h b/env/Include/context.h new file mode 100644 index 0000000..9581285 --- /dev/null +++ b/env/Include/context.h @@ -0,0 +1,84 @@ +#ifndef Py_CONTEXT_H +#define Py_CONTEXT_H +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef Py_LIMITED_API + + +PyAPI_DATA(PyTypeObject) PyContext_Type; +typedef struct _pycontextobject PyContext; + +PyAPI_DATA(PyTypeObject) PyContextVar_Type; +typedef struct _pycontextvarobject PyContextVar; + +PyAPI_DATA(PyTypeObject) PyContextToken_Type; +typedef struct _pycontexttokenobject PyContextToken; + + +#define PyContext_CheckExact(o) (Py_TYPE(o) == &PyContext_Type) +#define PyContextVar_CheckExact(o) (Py_TYPE(o) == &PyContextVar_Type) +#define PyContextToken_CheckExact(o) (Py_TYPE(o) == &PyContextToken_Type) + + +PyAPI_FUNC(PyObject *) PyContext_New(void); +PyAPI_FUNC(PyObject *) PyContext_Copy(PyObject *); +PyAPI_FUNC(PyObject *) PyContext_CopyCurrent(void); + +PyAPI_FUNC(int) PyContext_Enter(PyObject *); +PyAPI_FUNC(int) PyContext_Exit(PyObject *); + + +/* Create a new context variable. + + default_value can be NULL. +*/ +PyAPI_FUNC(PyObject *) PyContextVar_New( + const char *name, PyObject *default_value); + + +/* Get a value for the variable. + + Returns -1 if an error occurred during lookup. + + Returns 0 if value either was or was not found. + + If value was found, *value will point to it. + If not, it will point to: + + - default_value, if not NULL; + - the default value of "var", if not NULL; + - NULL. + + '*value' will be a new ref, if not NULL. +*/ +PyAPI_FUNC(int) PyContextVar_Get( + PyObject *var, PyObject *default_value, PyObject **value); + + +/* Set a new value for the variable. + Returns NULL if an error occurs. +*/ +PyAPI_FUNC(PyObject *) PyContextVar_Set(PyObject *var, PyObject *value); + + +/* Reset a variable to its previous value. + Returns 0 on success, -1 on error. +*/ +PyAPI_FUNC(int) PyContextVar_Reset(PyObject *var, PyObject *token); + + +/* This method is exposed only for CPython tests. Don not use it. */ +PyAPI_FUNC(PyObject *) _PyContext_NewHamtForTests(void); + + +PyAPI_FUNC(int) PyContext_ClearFreeList(void); + + +#endif /* !Py_LIMITED_API */ + +#ifdef __cplusplus +} +#endif +#endif /* !Py_CONTEXT_H */ diff --git a/env/Include/datetime.h b/env/Include/datetime.h new file mode 100644 index 0000000..059d5ec --- /dev/null +++ b/env/Include/datetime.h @@ -0,0 +1,273 @@ +/* datetime.h + */ +#ifndef Py_LIMITED_API +#ifndef DATETIME_H +#define DATETIME_H +#ifdef __cplusplus +extern "C" { +#endif + +/* Fields are packed into successive bytes, each viewed as unsigned and + * big-endian, unless otherwise noted: + * + * byte offset + * 0 year 2 bytes, 1-9999 + * 2 month 1 byte, 1-12 + * 3 day 1 byte, 1-31 + * 4 hour 1 byte, 0-23 + * 5 minute 1 byte, 0-59 + * 6 second 1 byte, 0-59 + * 7 usecond 3 bytes, 0-999999 + * 10 + */ + +/* # of bytes for year, month, and day. */ +#define _PyDateTime_DATE_DATASIZE 4 + +/* # of bytes for hour, minute, second, and usecond. */ +#define _PyDateTime_TIME_DATASIZE 6 + +/* # of bytes for year, month, day, hour, minute, second, and usecond. */ +#define _PyDateTime_DATETIME_DATASIZE 10 + + +typedef struct +{ + PyObject_HEAD + Py_hash_t hashcode; /* -1 when unknown */ + int days; /* -MAX_DELTA_DAYS <= days <= MAX_DELTA_DAYS */ + int seconds; /* 0 <= seconds < 24*3600 is invariant */ + int microseconds; /* 0 <= microseconds < 1000000 is invariant */ +} PyDateTime_Delta; + +typedef struct +{ + PyObject_HEAD /* a pure abstract base class */ +} PyDateTime_TZInfo; + + +/* The datetime and time types have hashcodes, and an optional tzinfo member, + * present if and only if hastzinfo is true. + */ +#define _PyTZINFO_HEAD \ + PyObject_HEAD \ + Py_hash_t hashcode; \ + char hastzinfo; /* boolean flag */ + +/* No _PyDateTime_BaseTZInfo is allocated; it's just to have something + * convenient to cast to, when getting at the hastzinfo member of objects + * starting with _PyTZINFO_HEAD. + */ +typedef struct +{ + _PyTZINFO_HEAD +} _PyDateTime_BaseTZInfo; + +/* All time objects are of PyDateTime_TimeType, but that can be allocated + * in two ways, with or without a tzinfo member. Without is the same as + * tzinfo == None, but consumes less memory. _PyDateTime_BaseTime is an + * internal struct used to allocate the right amount of space for the + * "without" case. + */ +#define _PyDateTime_TIMEHEAD \ + _PyTZINFO_HEAD \ + unsigned char data[_PyDateTime_TIME_DATASIZE]; + +typedef struct +{ + _PyDateTime_TIMEHEAD +} _PyDateTime_BaseTime; /* hastzinfo false */ + +typedef struct +{ + _PyDateTime_TIMEHEAD + unsigned char fold; + PyObject *tzinfo; +} PyDateTime_Time; /* hastzinfo true */ + + +/* All datetime objects are of PyDateTime_DateTimeType, but that can be + * allocated in two ways too, just like for time objects above. In addition, + * the plain date type is a base class for datetime, so it must also have + * a hastzinfo member (although it's unused there). + */ +typedef struct +{ + _PyTZINFO_HEAD + unsigned char data[_PyDateTime_DATE_DATASIZE]; +} PyDateTime_Date; + +#define _PyDateTime_DATETIMEHEAD \ + _PyTZINFO_HEAD \ + unsigned char data[_PyDateTime_DATETIME_DATASIZE]; + +typedef struct +{ + _PyDateTime_DATETIMEHEAD +} _PyDateTime_BaseDateTime; /* hastzinfo false */ + +typedef struct +{ + _PyDateTime_DATETIMEHEAD + unsigned char fold; + PyObject *tzinfo; +} PyDateTime_DateTime; /* hastzinfo true */ + + +/* Apply for date and datetime instances. */ +#define PyDateTime_GET_YEAR(o) ((((PyDateTime_Date*)o)->data[0] << 8) | \ + ((PyDateTime_Date*)o)->data[1]) +#define PyDateTime_GET_MONTH(o) (((PyDateTime_Date*)o)->data[2]) +#define PyDateTime_GET_DAY(o) (((PyDateTime_Date*)o)->data[3]) + +#define PyDateTime_DATE_GET_HOUR(o) (((PyDateTime_DateTime*)o)->data[4]) +#define PyDateTime_DATE_GET_MINUTE(o) (((PyDateTime_DateTime*)o)->data[5]) +#define PyDateTime_DATE_GET_SECOND(o) (((PyDateTime_DateTime*)o)->data[6]) +#define PyDateTime_DATE_GET_MICROSECOND(o) \ + ((((PyDateTime_DateTime*)o)->data[7] << 16) | \ + (((PyDateTime_DateTime*)o)->data[8] << 8) | \ + ((PyDateTime_DateTime*)o)->data[9]) +#define PyDateTime_DATE_GET_FOLD(o) (((PyDateTime_DateTime*)o)->fold) + +/* Apply for time instances. */ +#define PyDateTime_TIME_GET_HOUR(o) (((PyDateTime_Time*)o)->data[0]) +#define PyDateTime_TIME_GET_MINUTE(o) (((PyDateTime_Time*)o)->data[1]) +#define PyDateTime_TIME_GET_SECOND(o) (((PyDateTime_Time*)o)->data[2]) +#define PyDateTime_TIME_GET_MICROSECOND(o) \ + ((((PyDateTime_Time*)o)->data[3] << 16) | \ + (((PyDateTime_Time*)o)->data[4] << 8) | \ + ((PyDateTime_Time*)o)->data[5]) +#define PyDateTime_TIME_GET_FOLD(o) (((PyDateTime_Time*)o)->fold) + +/* Apply for time delta instances */ +#define PyDateTime_DELTA_GET_DAYS(o) (((PyDateTime_Delta*)o)->days) +#define PyDateTime_DELTA_GET_SECONDS(o) (((PyDateTime_Delta*)o)->seconds) +#define PyDateTime_DELTA_GET_MICROSECONDS(o) \ + (((PyDateTime_Delta*)o)->microseconds) + + +/* Define structure for C API. */ +typedef struct { + /* type objects */ + PyTypeObject *DateType; + PyTypeObject *DateTimeType; + PyTypeObject *TimeType; + PyTypeObject *DeltaType; + PyTypeObject *TZInfoType; + + /* singletons */ + PyObject *TimeZone_UTC; + + /* constructors */ + PyObject *(*Date_FromDate)(int, int, int, PyTypeObject*); + PyObject *(*DateTime_FromDateAndTime)(int, int, int, int, int, int, int, + PyObject*, PyTypeObject*); + PyObject *(*Time_FromTime)(int, int, int, int, PyObject*, PyTypeObject*); + PyObject *(*Delta_FromDelta)(int, int, int, int, PyTypeObject*); + PyObject *(*TimeZone_FromTimeZone)(PyObject *offset, PyObject *name); + + /* constructors for the DB API */ + PyObject *(*DateTime_FromTimestamp)(PyObject*, PyObject*, PyObject*); + PyObject *(*Date_FromTimestamp)(PyObject*, PyObject*); + + /* PEP 495 constructors */ + PyObject *(*DateTime_FromDateAndTimeAndFold)(int, int, int, int, int, int, int, + PyObject*, int, PyTypeObject*); + PyObject *(*Time_FromTimeAndFold)(int, int, int, int, PyObject*, int, PyTypeObject*); + +} PyDateTime_CAPI; + +#define PyDateTime_CAPSULE_NAME "datetime.datetime_CAPI" + + +#ifdef Py_BUILD_CORE + +/* Macros for type checking when building the Python core. */ +#define PyDate_Check(op) PyObject_TypeCheck(op, &PyDateTime_DateType) +#define PyDate_CheckExact(op) (Py_TYPE(op) == &PyDateTime_DateType) + +#define PyDateTime_Check(op) PyObject_TypeCheck(op, &PyDateTime_DateTimeType) +#define PyDateTime_CheckExact(op) (Py_TYPE(op) == &PyDateTime_DateTimeType) + +#define PyTime_Check(op) PyObject_TypeCheck(op, &PyDateTime_TimeType) +#define PyTime_CheckExact(op) (Py_TYPE(op) == &PyDateTime_TimeType) + +#define PyDelta_Check(op) PyObject_TypeCheck(op, &PyDateTime_DeltaType) +#define PyDelta_CheckExact(op) (Py_TYPE(op) == &PyDateTime_DeltaType) + +#define PyTZInfo_Check(op) PyObject_TypeCheck(op, &PyDateTime_TZInfoType) +#define PyTZInfo_CheckExact(op) (Py_TYPE(op) == &PyDateTime_TZInfoType) + +#else + +/* Define global variable for the C API and a macro for setting it. */ +static PyDateTime_CAPI *PyDateTimeAPI = NULL; + +#define PyDateTime_IMPORT \ + PyDateTimeAPI = (PyDateTime_CAPI *)PyCapsule_Import(PyDateTime_CAPSULE_NAME, 0) + +/* Macro for access to the UTC singleton */ +#define PyDateTime_TimeZone_UTC PyDateTimeAPI->TimeZone_UTC + +/* Macros for type checking when not building the Python core. */ +#define PyDate_Check(op) PyObject_TypeCheck(op, PyDateTimeAPI->DateType) +#define PyDate_CheckExact(op) (Py_TYPE(op) == PyDateTimeAPI->DateType) + +#define PyDateTime_Check(op) PyObject_TypeCheck(op, PyDateTimeAPI->DateTimeType) +#define PyDateTime_CheckExact(op) (Py_TYPE(op) == PyDateTimeAPI->DateTimeType) + +#define PyTime_Check(op) PyObject_TypeCheck(op, PyDateTimeAPI->TimeType) +#define PyTime_CheckExact(op) (Py_TYPE(op) == PyDateTimeAPI->TimeType) + +#define PyDelta_Check(op) PyObject_TypeCheck(op, PyDateTimeAPI->DeltaType) +#define PyDelta_CheckExact(op) (Py_TYPE(op) == PyDateTimeAPI->DeltaType) + +#define PyTZInfo_Check(op) PyObject_TypeCheck(op, PyDateTimeAPI->TZInfoType) +#define PyTZInfo_CheckExact(op) (Py_TYPE(op) == PyDateTimeAPI->TZInfoType) + +/* Macros for accessing constructors in a simplified fashion. */ +#define PyDate_FromDate(year, month, day) \ + PyDateTimeAPI->Date_FromDate(year, month, day, PyDateTimeAPI->DateType) + +#define PyDateTime_FromDateAndTime(year, month, day, hour, min, sec, usec) \ + PyDateTimeAPI->DateTime_FromDateAndTime(year, month, day, hour, \ + min, sec, usec, Py_None, PyDateTimeAPI->DateTimeType) + +#define PyDateTime_FromDateAndTimeAndFold(year, month, day, hour, min, sec, usec, fold) \ + PyDateTimeAPI->DateTime_FromDateAndTimeAndFold(year, month, day, hour, \ + min, sec, usec, Py_None, fold, PyDateTimeAPI->DateTimeType) + +#define PyTime_FromTime(hour, minute, second, usecond) \ + PyDateTimeAPI->Time_FromTime(hour, minute, second, usecond, \ + Py_None, PyDateTimeAPI->TimeType) + +#define PyTime_FromTimeAndFold(hour, minute, second, usecond, fold) \ + PyDateTimeAPI->Time_FromTimeAndFold(hour, minute, second, usecond, \ + Py_None, fold, PyDateTimeAPI->TimeType) + +#define PyDelta_FromDSU(days, seconds, useconds) \ + PyDateTimeAPI->Delta_FromDelta(days, seconds, useconds, 1, \ + PyDateTimeAPI->DeltaType) + +#define PyTimeZone_FromOffset(offset) \ + PyDateTimeAPI->TimeZone_FromTimeZone(offset, NULL) + +#define PyTimeZone_FromOffsetAndName(offset, name) \ + PyDateTimeAPI->TimeZone_FromTimeZone(offset, name) + +/* Macros supporting the DB API. */ +#define PyDateTime_FromTimestamp(args) \ + PyDateTimeAPI->DateTime_FromTimestamp( \ + (PyObject*) (PyDateTimeAPI->DateTimeType), args, NULL) + +#define PyDate_FromTimestamp(args) \ + PyDateTimeAPI->Date_FromTimestamp( \ + (PyObject*) (PyDateTimeAPI->DateType), args) + +#endif /* Py_BUILD_CORE */ + +#ifdef __cplusplus +} +#endif +#endif +#endif /* !Py_LIMITED_API */ diff --git a/env/Include/descrobject.h b/env/Include/descrobject.h new file mode 100644 index 0000000..73bbb3f --- /dev/null +++ b/env/Include/descrobject.h @@ -0,0 +1,110 @@ +/* Descriptors */ +#ifndef Py_DESCROBJECT_H +#define Py_DESCROBJECT_H +#ifdef __cplusplus +extern "C" { +#endif + +typedef PyObject *(*getter)(PyObject *, void *); +typedef int (*setter)(PyObject *, PyObject *, void *); + +typedef struct PyGetSetDef { + const char *name; + getter get; + setter set; + const char *doc; + void *closure; +} PyGetSetDef; + +#ifndef Py_LIMITED_API +typedef PyObject *(*wrapperfunc)(PyObject *self, PyObject *args, + void *wrapped); + +typedef PyObject *(*wrapperfunc_kwds)(PyObject *self, PyObject *args, + void *wrapped, PyObject *kwds); + +struct wrapperbase { + const char *name; + int offset; + void *function; + wrapperfunc wrapper; + const char *doc; + int flags; + PyObject *name_strobj; +}; + +/* Flags for above struct */ +#define PyWrapperFlag_KEYWORDS 1 /* wrapper function takes keyword args */ + +/* Various kinds of descriptor objects */ + +typedef struct { + PyObject_HEAD + PyTypeObject *d_type; + PyObject *d_name; + PyObject *d_qualname; +} PyDescrObject; + +#define PyDescr_COMMON PyDescrObject d_common + +#define PyDescr_TYPE(x) (((PyDescrObject *)(x))->d_type) +#define PyDescr_NAME(x) (((PyDescrObject *)(x))->d_name) + +typedef struct { + PyDescr_COMMON; + PyMethodDef *d_method; +} PyMethodDescrObject; + +typedef struct { + PyDescr_COMMON; + struct PyMemberDef *d_member; +} PyMemberDescrObject; + +typedef struct { + PyDescr_COMMON; + PyGetSetDef *d_getset; +} PyGetSetDescrObject; + +typedef struct { + PyDescr_COMMON; + struct wrapperbase *d_base; + void *d_wrapped; /* This can be any function pointer */ +} PyWrapperDescrObject; +#endif /* Py_LIMITED_API */ + +PyAPI_DATA(PyTypeObject) PyClassMethodDescr_Type; +PyAPI_DATA(PyTypeObject) PyGetSetDescr_Type; +PyAPI_DATA(PyTypeObject) PyMemberDescr_Type; +PyAPI_DATA(PyTypeObject) PyMethodDescr_Type; +PyAPI_DATA(PyTypeObject) PyWrapperDescr_Type; +PyAPI_DATA(PyTypeObject) PyDictProxy_Type; +#ifndef Py_LIMITED_API +PyAPI_DATA(PyTypeObject) _PyMethodWrapper_Type; +#endif /* Py_LIMITED_API */ + +PyAPI_FUNC(PyObject *) PyDescr_NewMethod(PyTypeObject *, PyMethodDef *); +PyAPI_FUNC(PyObject *) PyDescr_NewClassMethod(PyTypeObject *, PyMethodDef *); +struct PyMemberDef; /* forward declaration for following prototype */ +PyAPI_FUNC(PyObject *) PyDescr_NewMember(PyTypeObject *, + struct PyMemberDef *); +PyAPI_FUNC(PyObject *) PyDescr_NewGetSet(PyTypeObject *, + struct PyGetSetDef *); +#ifndef Py_LIMITED_API + +PyAPI_FUNC(PyObject *) _PyMethodDescr_FastCallKeywords( + PyObject *descrobj, PyObject *const *stack, Py_ssize_t nargs, PyObject *kwnames); +PyAPI_FUNC(PyObject *) PyDescr_NewWrapper(PyTypeObject *, + struct wrapperbase *, void *); +#define PyDescr_IsData(d) (Py_TYPE(d)->tp_descr_set != NULL) +#endif + +PyAPI_FUNC(PyObject *) PyDictProxy_New(PyObject *); +PyAPI_FUNC(PyObject *) PyWrapper_New(PyObject *, PyObject *); + + +PyAPI_DATA(PyTypeObject) PyProperty_Type; +#ifdef __cplusplus +} +#endif +#endif /* !Py_DESCROBJECT_H */ + diff --git a/env/Include/dictobject.h b/env/Include/dictobject.h new file mode 100644 index 0000000..28930f4 --- /dev/null +++ b/env/Include/dictobject.h @@ -0,0 +1,179 @@ +#ifndef Py_DICTOBJECT_H +#define Py_DICTOBJECT_H +#ifdef __cplusplus +extern "C" { +#endif + + +/* Dictionary object type -- mapping from hashable object to object */ + +/* The distribution includes a separate file, Objects/dictnotes.txt, + describing explorations into dictionary design and optimization. + It covers typical dictionary use patterns, the parameters for + tuning dictionaries, and several ideas for possible optimizations. +*/ + +#ifndef Py_LIMITED_API + +typedef struct _dictkeysobject PyDictKeysObject; + +/* The ma_values pointer is NULL for a combined table + * or points to an array of PyObject* for a split table + */ +typedef struct { + PyObject_HEAD + + /* Number of items in the dictionary */ + Py_ssize_t ma_used; + + /* Dictionary version: globally unique, value change each time + the dictionary is modified */ + uint64_t ma_version_tag; + + PyDictKeysObject *ma_keys; + + /* If ma_values is NULL, the table is "combined": keys and values + are stored in ma_keys. + + If ma_values is not NULL, the table is splitted: + keys are stored in ma_keys and values are stored in ma_values */ + PyObject **ma_values; +} PyDictObject; + +typedef struct { + PyObject_HEAD + PyDictObject *dv_dict; +} _PyDictViewObject; + +#endif /* Py_LIMITED_API */ + +PyAPI_DATA(PyTypeObject) PyDict_Type; +PyAPI_DATA(PyTypeObject) PyDictIterKey_Type; +PyAPI_DATA(PyTypeObject) PyDictIterValue_Type; +PyAPI_DATA(PyTypeObject) PyDictIterItem_Type; +PyAPI_DATA(PyTypeObject) PyDictKeys_Type; +PyAPI_DATA(PyTypeObject) PyDictItems_Type; +PyAPI_DATA(PyTypeObject) PyDictValues_Type; + +#define PyDict_Check(op) \ + PyType_FastSubclass(Py_TYPE(op), Py_TPFLAGS_DICT_SUBCLASS) +#define PyDict_CheckExact(op) (Py_TYPE(op) == &PyDict_Type) +#define PyDictKeys_Check(op) PyObject_TypeCheck(op, &PyDictKeys_Type) +#define PyDictItems_Check(op) PyObject_TypeCheck(op, &PyDictItems_Type) +#define PyDictValues_Check(op) PyObject_TypeCheck(op, &PyDictValues_Type) +/* This excludes Values, since they are not sets. */ +# define PyDictViewSet_Check(op) \ + (PyDictKeys_Check(op) || PyDictItems_Check(op)) + + +PyAPI_FUNC(PyObject *) PyDict_New(void); +PyAPI_FUNC(PyObject *) PyDict_GetItem(PyObject *mp, PyObject *key); +#ifndef Py_LIMITED_API +PyAPI_FUNC(PyObject *) _PyDict_GetItem_KnownHash(PyObject *mp, PyObject *key, + Py_hash_t hash); +#endif +PyAPI_FUNC(PyObject *) PyDict_GetItemWithError(PyObject *mp, PyObject *key); +#ifndef Py_LIMITED_API +PyAPI_FUNC(PyObject *) _PyDict_GetItemIdWithError(PyObject *dp, + struct _Py_Identifier *key); +PyAPI_FUNC(PyObject *) PyDict_SetDefault( + PyObject *mp, PyObject *key, PyObject *defaultobj); +#endif +PyAPI_FUNC(int) PyDict_SetItem(PyObject *mp, PyObject *key, PyObject *item); +#ifndef Py_LIMITED_API +PyAPI_FUNC(int) _PyDict_SetItem_KnownHash(PyObject *mp, PyObject *key, + PyObject *item, Py_hash_t hash); +#endif +PyAPI_FUNC(int) PyDict_DelItem(PyObject *mp, PyObject *key); +#ifndef Py_LIMITED_API +PyAPI_FUNC(int) _PyDict_DelItem_KnownHash(PyObject *mp, PyObject *key, + Py_hash_t hash); +PyAPI_FUNC(int) _PyDict_DelItemIf(PyObject *mp, PyObject *key, + int (*predicate)(PyObject *value)); +#endif +PyAPI_FUNC(void) PyDict_Clear(PyObject *mp); +PyAPI_FUNC(int) PyDict_Next( + PyObject *mp, Py_ssize_t *pos, PyObject **key, PyObject **value); +#ifndef Py_LIMITED_API +PyDictKeysObject *_PyDict_NewKeysForClass(void); +PyAPI_FUNC(PyObject *) PyObject_GenericGetDict(PyObject *, void *); +PyAPI_FUNC(int) _PyDict_Next( + PyObject *mp, Py_ssize_t *pos, PyObject **key, PyObject **value, Py_hash_t *hash); +PyObject *_PyDictView_New(PyObject *, PyTypeObject *); +#endif +PyAPI_FUNC(PyObject *) PyDict_Keys(PyObject *mp); +PyAPI_FUNC(PyObject *) PyDict_Values(PyObject *mp); +PyAPI_FUNC(PyObject *) PyDict_Items(PyObject *mp); +PyAPI_FUNC(Py_ssize_t) PyDict_Size(PyObject *mp); +PyAPI_FUNC(PyObject *) PyDict_Copy(PyObject *mp); +PyAPI_FUNC(int) PyDict_Contains(PyObject *mp, PyObject *key); +#ifndef Py_LIMITED_API +/* Get the number of items of a dictionary. */ +#define PyDict_GET_SIZE(mp) (assert(PyDict_Check(mp)),((PyDictObject *)mp)->ma_used) +PyAPI_FUNC(int) _PyDict_Contains(PyObject *mp, PyObject *key, Py_hash_t hash); +PyAPI_FUNC(PyObject *) _PyDict_NewPresized(Py_ssize_t minused); +PyAPI_FUNC(void) _PyDict_MaybeUntrack(PyObject *mp); +PyAPI_FUNC(int) _PyDict_HasOnlyStringKeys(PyObject *mp); +Py_ssize_t _PyDict_KeysSize(PyDictKeysObject *keys); +PyAPI_FUNC(Py_ssize_t) _PyDict_SizeOf(PyDictObject *); +PyAPI_FUNC(PyObject *) _PyDict_Pop(PyObject *, PyObject *, PyObject *); +PyObject *_PyDict_Pop_KnownHash(PyObject *, PyObject *, Py_hash_t, PyObject *); +PyObject *_PyDict_FromKeys(PyObject *, PyObject *, PyObject *); +#define _PyDict_HasSplitTable(d) ((d)->ma_values != NULL) + +PyAPI_FUNC(int) PyDict_ClearFreeList(void); +#endif + +/* PyDict_Update(mp, other) is equivalent to PyDict_Merge(mp, other, 1). */ +PyAPI_FUNC(int) PyDict_Update(PyObject *mp, PyObject *other); + +/* PyDict_Merge updates/merges from a mapping object (an object that + supports PyMapping_Keys() and PyObject_GetItem()). If override is true, + the last occurrence of a key wins, else the first. The Python + dict.update(other) is equivalent to PyDict_Merge(dict, other, 1). +*/ +PyAPI_FUNC(int) PyDict_Merge(PyObject *mp, + PyObject *other, + int override); + +#ifndef Py_LIMITED_API +/* Like PyDict_Merge, but override can be 0, 1 or 2. If override is 0, + the first occurrence of a key wins, if override is 1, the last occurrence + of a key wins, if override is 2, a KeyError with conflicting key as + argument is raised. +*/ +PyAPI_FUNC(int) _PyDict_MergeEx(PyObject *mp, PyObject *other, int override); +PyAPI_FUNC(PyObject *) _PyDictView_Intersect(PyObject* self, PyObject *other); +#endif + +/* PyDict_MergeFromSeq2 updates/merges from an iterable object producing + iterable objects of length 2. If override is true, the last occurrence + of a key wins, else the first. The Python dict constructor dict(seq2) + is equivalent to dict={}; PyDict_MergeFromSeq(dict, seq2, 1). +*/ +PyAPI_FUNC(int) PyDict_MergeFromSeq2(PyObject *d, + PyObject *seq2, + int override); + +PyAPI_FUNC(PyObject *) PyDict_GetItemString(PyObject *dp, const char *key); +#ifndef Py_LIMITED_API +PyAPI_FUNC(PyObject *) _PyDict_GetItemId(PyObject *dp, struct _Py_Identifier *key); +#endif /* !Py_LIMITED_API */ +PyAPI_FUNC(int) PyDict_SetItemString(PyObject *dp, const char *key, PyObject *item); +#ifndef Py_LIMITED_API +PyAPI_FUNC(int) _PyDict_SetItemId(PyObject *dp, struct _Py_Identifier *key, PyObject *item); +#endif /* !Py_LIMITED_API */ +PyAPI_FUNC(int) PyDict_DelItemString(PyObject *dp, const char *key); + +#ifndef Py_LIMITED_API +PyAPI_FUNC(int) _PyDict_DelItemId(PyObject *mp, struct _Py_Identifier *key); +PyAPI_FUNC(void) _PyDict_DebugMallocStats(FILE *out); + +int _PyObjectDict_SetItem(PyTypeObject *tp, PyObject **dictptr, PyObject *name, PyObject *value); +PyObject *_PyDict_LoadGlobal(PyDictObject *, PyDictObject *, PyObject *); +#endif + +#ifdef __cplusplus +} +#endif +#endif /* !Py_DICTOBJECT_H */ diff --git a/env/Include/dtoa.h b/env/Include/dtoa.h new file mode 100644 index 0000000..9bfb625 --- /dev/null +++ b/env/Include/dtoa.h @@ -0,0 +1,19 @@ +#ifndef Py_LIMITED_API +#ifndef PY_NO_SHORT_FLOAT_REPR +#ifdef __cplusplus +extern "C" { +#endif + +PyAPI_FUNC(double) _Py_dg_strtod(const char *str, char **ptr); +PyAPI_FUNC(char *) _Py_dg_dtoa(double d, int mode, int ndigits, + int *decpt, int *sign, char **rve); +PyAPI_FUNC(void) _Py_dg_freedtoa(char *s); +PyAPI_FUNC(double) _Py_dg_stdnan(int sign); +PyAPI_FUNC(double) _Py_dg_infinity(int sign); + + +#ifdef __cplusplus +} +#endif +#endif +#endif diff --git a/env/Include/dynamic_annotations.h b/env/Include/dynamic_annotations.h new file mode 100644 index 0000000..0bd1a83 --- /dev/null +++ b/env/Include/dynamic_annotations.h @@ -0,0 +1,499 @@ +/* Copyright (c) 2008-2009, Google Inc. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Neither the name of Google Inc. nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * --- + * Author: Kostya Serebryany + * Copied to CPython by Jeffrey Yasskin, with all macros renamed to + * start with _Py_ to avoid colliding with users embedding Python, and + * with deprecated macros removed. + */ + +/* This file defines dynamic annotations for use with dynamic analysis + tool such as valgrind, PIN, etc. + + Dynamic annotation is a source code annotation that affects + the generated code (that is, the annotation is not a comment). + Each such annotation is attached to a particular + instruction and/or to a particular object (address) in the program. + + The annotations that should be used by users are macros in all upper-case + (e.g., _Py_ANNOTATE_NEW_MEMORY). + + Actual implementation of these macros may differ depending on the + dynamic analysis tool being used. + + See http://code.google.com/p/data-race-test/ for more information. + + This file supports the following dynamic analysis tools: + - None (DYNAMIC_ANNOTATIONS_ENABLED is not defined or zero). + Macros are defined empty. + - ThreadSanitizer, Helgrind, DRD (DYNAMIC_ANNOTATIONS_ENABLED is 1). + Macros are defined as calls to non-inlinable empty functions + that are intercepted by Valgrind. */ + +#ifndef __DYNAMIC_ANNOTATIONS_H__ +#define __DYNAMIC_ANNOTATIONS_H__ + +#ifndef DYNAMIC_ANNOTATIONS_ENABLED +# define DYNAMIC_ANNOTATIONS_ENABLED 0 +#endif + +#if DYNAMIC_ANNOTATIONS_ENABLED != 0 + + /* ------------------------------------------------------------- + Annotations useful when implementing condition variables such as CondVar, + using conditional critical sections (Await/LockWhen) and when constructing + user-defined synchronization mechanisms. + + The annotations _Py_ANNOTATE_HAPPENS_BEFORE() and + _Py_ANNOTATE_HAPPENS_AFTER() can be used to define happens-before arcs in + user-defined synchronization mechanisms: the race detector will infer an + arc from the former to the latter when they share the same argument + pointer. + + Example 1 (reference counting): + + void Unref() { + _Py_ANNOTATE_HAPPENS_BEFORE(&refcount_); + if (AtomicDecrementByOne(&refcount_) == 0) { + _Py_ANNOTATE_HAPPENS_AFTER(&refcount_); + delete this; + } + } + + Example 2 (message queue): + + void MyQueue::Put(Type *e) { + MutexLock lock(&mu_); + _Py_ANNOTATE_HAPPENS_BEFORE(e); + PutElementIntoMyQueue(e); + } + + Type *MyQueue::Get() { + MutexLock lock(&mu_); + Type *e = GetElementFromMyQueue(); + _Py_ANNOTATE_HAPPENS_AFTER(e); + return e; + } + + Note: when possible, please use the existing reference counting and message + queue implementations instead of inventing new ones. */ + + /* Report that wait on the condition variable at address "cv" has succeeded + and the lock at address "lock" is held. */ +#define _Py_ANNOTATE_CONDVAR_LOCK_WAIT(cv, lock) \ + AnnotateCondVarWait(__FILE__, __LINE__, cv, lock) + + /* Report that wait on the condition variable at "cv" has succeeded. Variant + w/o lock. */ +#define _Py_ANNOTATE_CONDVAR_WAIT(cv) \ + AnnotateCondVarWait(__FILE__, __LINE__, cv, NULL) + + /* Report that we are about to signal on the condition variable at address + "cv". */ +#define _Py_ANNOTATE_CONDVAR_SIGNAL(cv) \ + AnnotateCondVarSignal(__FILE__, __LINE__, cv) + + /* Report that we are about to signal_all on the condition variable at "cv". */ +#define _Py_ANNOTATE_CONDVAR_SIGNAL_ALL(cv) \ + AnnotateCondVarSignalAll(__FILE__, __LINE__, cv) + + /* Annotations for user-defined synchronization mechanisms. */ +#define _Py_ANNOTATE_HAPPENS_BEFORE(obj) _Py_ANNOTATE_CONDVAR_SIGNAL(obj) +#define _Py_ANNOTATE_HAPPENS_AFTER(obj) _Py_ANNOTATE_CONDVAR_WAIT(obj) + + /* Report that the bytes in the range [pointer, pointer+size) are about + to be published safely. The race checker will create a happens-before + arc from the call _Py_ANNOTATE_PUBLISH_MEMORY_RANGE(pointer, size) to + subsequent accesses to this memory. + Note: this annotation may not work properly if the race detector uses + sampling, i.e. does not observe all memory accesses. + */ +#define _Py_ANNOTATE_PUBLISH_MEMORY_RANGE(pointer, size) \ + AnnotatePublishMemoryRange(__FILE__, __LINE__, pointer, size) + + /* Instruct the tool to create a happens-before arc between mu->Unlock() and + mu->Lock(). This annotation may slow down the race detector and hide real + races. Normally it is used only when it would be difficult to annotate each + of the mutex's critical sections individually using the annotations above. + This annotation makes sense only for hybrid race detectors. For pure + happens-before detectors this is a no-op. For more details see + http://code.google.com/p/data-race-test/wiki/PureHappensBeforeVsHybrid . */ +#define _Py_ANNOTATE_PURE_HAPPENS_BEFORE_MUTEX(mu) \ + AnnotateMutexIsUsedAsCondVar(__FILE__, __LINE__, mu) + + /* ------------------------------------------------------------- + Annotations useful when defining memory allocators, or when memory that + was protected in one way starts to be protected in another. */ + + /* Report that a new memory at "address" of size "size" has been allocated. + This might be used when the memory has been retrieved from a free list and + is about to be reused, or when the locking discipline for a variable + changes. */ +#define _Py_ANNOTATE_NEW_MEMORY(address, size) \ + AnnotateNewMemory(__FILE__, __LINE__, address, size) + + /* ------------------------------------------------------------- + Annotations useful when defining FIFO queues that transfer data between + threads. */ + + /* Report that the producer-consumer queue (such as ProducerConsumerQueue) at + address "pcq" has been created. The _Py_ANNOTATE_PCQ_* annotations should + be used only for FIFO queues. For non-FIFO queues use + _Py_ANNOTATE_HAPPENS_BEFORE (for put) and _Py_ANNOTATE_HAPPENS_AFTER (for + get). */ +#define _Py_ANNOTATE_PCQ_CREATE(pcq) \ + AnnotatePCQCreate(__FILE__, __LINE__, pcq) + + /* Report that the queue at address "pcq" is about to be destroyed. */ +#define _Py_ANNOTATE_PCQ_DESTROY(pcq) \ + AnnotatePCQDestroy(__FILE__, __LINE__, pcq) + + /* Report that we are about to put an element into a FIFO queue at address + "pcq". */ +#define _Py_ANNOTATE_PCQ_PUT(pcq) \ + AnnotatePCQPut(__FILE__, __LINE__, pcq) + + /* Report that we've just got an element from a FIFO queue at address "pcq". */ +#define _Py_ANNOTATE_PCQ_GET(pcq) \ + AnnotatePCQGet(__FILE__, __LINE__, pcq) + + /* ------------------------------------------------------------- + Annotations that suppress errors. It is usually better to express the + program's synchronization using the other annotations, but these can + be used when all else fails. */ + + /* Report that we may have a benign race at "pointer", with size + "sizeof(*(pointer))". "pointer" must be a non-void* pointer. Insert at the + point where "pointer" has been allocated, preferably close to the point + where the race happens. See also _Py_ANNOTATE_BENIGN_RACE_STATIC. */ +#define _Py_ANNOTATE_BENIGN_RACE(pointer, description) \ + AnnotateBenignRaceSized(__FILE__, __LINE__, pointer, \ + sizeof(*(pointer)), description) + + /* Same as _Py_ANNOTATE_BENIGN_RACE(address, description), but applies to + the memory range [address, address+size). */ +#define _Py_ANNOTATE_BENIGN_RACE_SIZED(address, size, description) \ + AnnotateBenignRaceSized(__FILE__, __LINE__, address, size, description) + + /* Request the analysis tool to ignore all reads in the current thread + until _Py_ANNOTATE_IGNORE_READS_END is called. + Useful to ignore intentional racey reads, while still checking + other reads and all writes. + See also _Py_ANNOTATE_UNPROTECTED_READ. */ +#define _Py_ANNOTATE_IGNORE_READS_BEGIN() \ + AnnotateIgnoreReadsBegin(__FILE__, __LINE__) + + /* Stop ignoring reads. */ +#define _Py_ANNOTATE_IGNORE_READS_END() \ + AnnotateIgnoreReadsEnd(__FILE__, __LINE__) + + /* Similar to _Py_ANNOTATE_IGNORE_READS_BEGIN, but ignore writes. */ +#define _Py_ANNOTATE_IGNORE_WRITES_BEGIN() \ + AnnotateIgnoreWritesBegin(__FILE__, __LINE__) + + /* Stop ignoring writes. */ +#define _Py_ANNOTATE_IGNORE_WRITES_END() \ + AnnotateIgnoreWritesEnd(__FILE__, __LINE__) + + /* Start ignoring all memory accesses (reads and writes). */ +#define _Py_ANNOTATE_IGNORE_READS_AND_WRITES_BEGIN() \ + do {\ + _Py_ANNOTATE_IGNORE_READS_BEGIN();\ + _Py_ANNOTATE_IGNORE_WRITES_BEGIN();\ + }while(0)\ + + /* Stop ignoring all memory accesses. */ +#define _Py_ANNOTATE_IGNORE_READS_AND_WRITES_END() \ + do {\ + _Py_ANNOTATE_IGNORE_WRITES_END();\ + _Py_ANNOTATE_IGNORE_READS_END();\ + }while(0)\ + + /* Similar to _Py_ANNOTATE_IGNORE_READS_BEGIN, but ignore synchronization events: + RWLOCK* and CONDVAR*. */ +#define _Py_ANNOTATE_IGNORE_SYNC_BEGIN() \ + AnnotateIgnoreSyncBegin(__FILE__, __LINE__) + + /* Stop ignoring sync events. */ +#define _Py_ANNOTATE_IGNORE_SYNC_END() \ + AnnotateIgnoreSyncEnd(__FILE__, __LINE__) + + + /* Enable (enable!=0) or disable (enable==0) race detection for all threads. + This annotation could be useful if you want to skip expensive race analysis + during some period of program execution, e.g. during initialization. */ +#define _Py_ANNOTATE_ENABLE_RACE_DETECTION(enable) \ + AnnotateEnableRaceDetection(__FILE__, __LINE__, enable) + + /* ------------------------------------------------------------- + Annotations useful for debugging. */ + + /* Request to trace every access to "address". */ +#define _Py_ANNOTATE_TRACE_MEMORY(address) \ + AnnotateTraceMemory(__FILE__, __LINE__, address) + + /* Report the current thread name to a race detector. */ +#define _Py_ANNOTATE_THREAD_NAME(name) \ + AnnotateThreadName(__FILE__, __LINE__, name) + + /* ------------------------------------------------------------- + Annotations useful when implementing locks. They are not + normally needed by modules that merely use locks. + The "lock" argument is a pointer to the lock object. */ + + /* Report that a lock has been created at address "lock". */ +#define _Py_ANNOTATE_RWLOCK_CREATE(lock) \ + AnnotateRWLockCreate(__FILE__, __LINE__, lock) + + /* Report that the lock at address "lock" is about to be destroyed. */ +#define _Py_ANNOTATE_RWLOCK_DESTROY(lock) \ + AnnotateRWLockDestroy(__FILE__, __LINE__, lock) + + /* Report that the lock at address "lock" has been acquired. + is_w=1 for writer lock, is_w=0 for reader lock. */ +#define _Py_ANNOTATE_RWLOCK_ACQUIRED(lock, is_w) \ + AnnotateRWLockAcquired(__FILE__, __LINE__, lock, is_w) + + /* Report that the lock at address "lock" is about to be released. */ +#define _Py_ANNOTATE_RWLOCK_RELEASED(lock, is_w) \ + AnnotateRWLockReleased(__FILE__, __LINE__, lock, is_w) + + /* ------------------------------------------------------------- + Annotations useful when implementing barriers. They are not + normally needed by modules that merely use barriers. + The "barrier" argument is a pointer to the barrier object. */ + + /* Report that the "barrier" has been initialized with initial "count". + If 'reinitialization_allowed' is true, initialization is allowed to happen + multiple times w/o calling barrier_destroy() */ +#define _Py_ANNOTATE_BARRIER_INIT(barrier, count, reinitialization_allowed) \ + AnnotateBarrierInit(__FILE__, __LINE__, barrier, count, \ + reinitialization_allowed) + + /* Report that we are about to enter barrier_wait("barrier"). */ +#define _Py_ANNOTATE_BARRIER_WAIT_BEFORE(barrier) \ + AnnotateBarrierWaitBefore(__FILE__, __LINE__, barrier) + + /* Report that we just exited barrier_wait("barrier"). */ +#define _Py_ANNOTATE_BARRIER_WAIT_AFTER(barrier) \ + AnnotateBarrierWaitAfter(__FILE__, __LINE__, barrier) + + /* Report that the "barrier" has been destroyed. */ +#define _Py_ANNOTATE_BARRIER_DESTROY(barrier) \ + AnnotateBarrierDestroy(__FILE__, __LINE__, barrier) + + /* ------------------------------------------------------------- + Annotations useful for testing race detectors. */ + + /* Report that we expect a race on the variable at "address". + Use only in unit tests for a race detector. */ +#define _Py_ANNOTATE_EXPECT_RACE(address, description) \ + AnnotateExpectRace(__FILE__, __LINE__, address, description) + + /* A no-op. Insert where you like to test the interceptors. */ +#define _Py_ANNOTATE_NO_OP(arg) \ + AnnotateNoOp(__FILE__, __LINE__, arg) + + /* Force the race detector to flush its state. The actual effect depends on + * the implementation of the detector. */ +#define _Py_ANNOTATE_FLUSH_STATE() \ + AnnotateFlushState(__FILE__, __LINE__) + + +#else /* DYNAMIC_ANNOTATIONS_ENABLED == 0 */ + +#define _Py_ANNOTATE_RWLOCK_CREATE(lock) /* empty */ +#define _Py_ANNOTATE_RWLOCK_DESTROY(lock) /* empty */ +#define _Py_ANNOTATE_RWLOCK_ACQUIRED(lock, is_w) /* empty */ +#define _Py_ANNOTATE_RWLOCK_RELEASED(lock, is_w) /* empty */ +#define _Py_ANNOTATE_BARRIER_INIT(barrier, count, reinitialization_allowed) /* */ +#define _Py_ANNOTATE_BARRIER_WAIT_BEFORE(barrier) /* empty */ +#define _Py_ANNOTATE_BARRIER_WAIT_AFTER(barrier) /* empty */ +#define _Py_ANNOTATE_BARRIER_DESTROY(barrier) /* empty */ +#define _Py_ANNOTATE_CONDVAR_LOCK_WAIT(cv, lock) /* empty */ +#define _Py_ANNOTATE_CONDVAR_WAIT(cv) /* empty */ +#define _Py_ANNOTATE_CONDVAR_SIGNAL(cv) /* empty */ +#define _Py_ANNOTATE_CONDVAR_SIGNAL_ALL(cv) /* empty */ +#define _Py_ANNOTATE_HAPPENS_BEFORE(obj) /* empty */ +#define _Py_ANNOTATE_HAPPENS_AFTER(obj) /* empty */ +#define _Py_ANNOTATE_PUBLISH_MEMORY_RANGE(address, size) /* empty */ +#define _Py_ANNOTATE_UNPUBLISH_MEMORY_RANGE(address, size) /* empty */ +#define _Py_ANNOTATE_SWAP_MEMORY_RANGE(address, size) /* empty */ +#define _Py_ANNOTATE_PCQ_CREATE(pcq) /* empty */ +#define _Py_ANNOTATE_PCQ_DESTROY(pcq) /* empty */ +#define _Py_ANNOTATE_PCQ_PUT(pcq) /* empty */ +#define _Py_ANNOTATE_PCQ_GET(pcq) /* empty */ +#define _Py_ANNOTATE_NEW_MEMORY(address, size) /* empty */ +#define _Py_ANNOTATE_EXPECT_RACE(address, description) /* empty */ +#define _Py_ANNOTATE_BENIGN_RACE(address, description) /* empty */ +#define _Py_ANNOTATE_BENIGN_RACE_SIZED(address, size, description) /* empty */ +#define _Py_ANNOTATE_PURE_HAPPENS_BEFORE_MUTEX(mu) /* empty */ +#define _Py_ANNOTATE_MUTEX_IS_USED_AS_CONDVAR(mu) /* empty */ +#define _Py_ANNOTATE_TRACE_MEMORY(arg) /* empty */ +#define _Py_ANNOTATE_THREAD_NAME(name) /* empty */ +#define _Py_ANNOTATE_IGNORE_READS_BEGIN() /* empty */ +#define _Py_ANNOTATE_IGNORE_READS_END() /* empty */ +#define _Py_ANNOTATE_IGNORE_WRITES_BEGIN() /* empty */ +#define _Py_ANNOTATE_IGNORE_WRITES_END() /* empty */ +#define _Py_ANNOTATE_IGNORE_READS_AND_WRITES_BEGIN() /* empty */ +#define _Py_ANNOTATE_IGNORE_READS_AND_WRITES_END() /* empty */ +#define _Py_ANNOTATE_IGNORE_SYNC_BEGIN() /* empty */ +#define _Py_ANNOTATE_IGNORE_SYNC_END() /* empty */ +#define _Py_ANNOTATE_ENABLE_RACE_DETECTION(enable) /* empty */ +#define _Py_ANNOTATE_NO_OP(arg) /* empty */ +#define _Py_ANNOTATE_FLUSH_STATE() /* empty */ + +#endif /* DYNAMIC_ANNOTATIONS_ENABLED */ + +/* Use the macros above rather than using these functions directly. */ +#ifdef __cplusplus +extern "C" { +#endif +void AnnotateRWLockCreate(const char *file, int line, + const volatile void *lock); +void AnnotateRWLockDestroy(const char *file, int line, + const volatile void *lock); +void AnnotateRWLockAcquired(const char *file, int line, + const volatile void *lock, long is_w); +void AnnotateRWLockReleased(const char *file, int line, + const volatile void *lock, long is_w); +void AnnotateBarrierInit(const char *file, int line, + const volatile void *barrier, long count, + long reinitialization_allowed); +void AnnotateBarrierWaitBefore(const char *file, int line, + const volatile void *barrier); +void AnnotateBarrierWaitAfter(const char *file, int line, + const volatile void *barrier); +void AnnotateBarrierDestroy(const char *file, int line, + const volatile void *barrier); +void AnnotateCondVarWait(const char *file, int line, + const volatile void *cv, + const volatile void *lock); +void AnnotateCondVarSignal(const char *file, int line, + const volatile void *cv); +void AnnotateCondVarSignalAll(const char *file, int line, + const volatile void *cv); +void AnnotatePublishMemoryRange(const char *file, int line, + const volatile void *address, + long size); +void AnnotateUnpublishMemoryRange(const char *file, int line, + const volatile void *address, + long size); +void AnnotatePCQCreate(const char *file, int line, + const volatile void *pcq); +void AnnotatePCQDestroy(const char *file, int line, + const volatile void *pcq); +void AnnotatePCQPut(const char *file, int line, + const volatile void *pcq); +void AnnotatePCQGet(const char *file, int line, + const volatile void *pcq); +void AnnotateNewMemory(const char *file, int line, + const volatile void *address, + long size); +void AnnotateExpectRace(const char *file, int line, + const volatile void *address, + const char *description); +void AnnotateBenignRace(const char *file, int line, + const volatile void *address, + const char *description); +void AnnotateBenignRaceSized(const char *file, int line, + const volatile void *address, + long size, + const char *description); +void AnnotateMutexIsUsedAsCondVar(const char *file, int line, + const volatile void *mu); +void AnnotateTraceMemory(const char *file, int line, + const volatile void *arg); +void AnnotateThreadName(const char *file, int line, + const char *name); +void AnnotateIgnoreReadsBegin(const char *file, int line); +void AnnotateIgnoreReadsEnd(const char *file, int line); +void AnnotateIgnoreWritesBegin(const char *file, int line); +void AnnotateIgnoreWritesEnd(const char *file, int line); +void AnnotateEnableRaceDetection(const char *file, int line, int enable); +void AnnotateNoOp(const char *file, int line, + const volatile void *arg); +void AnnotateFlushState(const char *file, int line); + +/* Return non-zero value if running under valgrind. + + If "valgrind.h" is included into dynamic_annotations.c, + the regular valgrind mechanism will be used. + See http://valgrind.org/docs/manual/manual-core-adv.html about + RUNNING_ON_VALGRIND and other valgrind "client requests". + The file "valgrind.h" may be obtained by doing + svn co svn://svn.valgrind.org/valgrind/trunk/include + + If for some reason you can't use "valgrind.h" or want to fake valgrind, + there are two ways to make this function return non-zero: + - Use environment variable: export RUNNING_ON_VALGRIND=1 + - Make your tool intercept the function RunningOnValgrind() and + change its return value. + */ +int RunningOnValgrind(void); + +#ifdef __cplusplus +} +#endif + +#if DYNAMIC_ANNOTATIONS_ENABLED != 0 && defined(__cplusplus) + + /* _Py_ANNOTATE_UNPROTECTED_READ is the preferred way to annotate racey reads. + + Instead of doing + _Py_ANNOTATE_IGNORE_READS_BEGIN(); + ... = x; + _Py_ANNOTATE_IGNORE_READS_END(); + one can use + ... = _Py_ANNOTATE_UNPROTECTED_READ(x); */ + template + inline T _Py_ANNOTATE_UNPROTECTED_READ(const volatile T &x) { + _Py_ANNOTATE_IGNORE_READS_BEGIN(); + T res = x; + _Py_ANNOTATE_IGNORE_READS_END(); + return res; + } + /* Apply _Py_ANNOTATE_BENIGN_RACE_SIZED to a static variable. */ +#define _Py_ANNOTATE_BENIGN_RACE_STATIC(static_var, description) \ + namespace { \ + class static_var ## _annotator { \ + public: \ + static_var ## _annotator() { \ + _Py_ANNOTATE_BENIGN_RACE_SIZED(&static_var, \ + sizeof(static_var), \ + # static_var ": " description); \ + } \ + }; \ + static static_var ## _annotator the ## static_var ## _annotator;\ + } +#else /* DYNAMIC_ANNOTATIONS_ENABLED == 0 */ + +#define _Py_ANNOTATE_UNPROTECTED_READ(x) (x) +#define _Py_ANNOTATE_BENIGN_RACE_STATIC(static_var, description) /* empty */ + +#endif /* DYNAMIC_ANNOTATIONS_ENABLED */ + +#endif /* __DYNAMIC_ANNOTATIONS_H__ */ diff --git a/env/Include/enumobject.h b/env/Include/enumobject.h new file mode 100644 index 0000000..c14dbfc --- /dev/null +++ b/env/Include/enumobject.h @@ -0,0 +1,17 @@ +#ifndef Py_ENUMOBJECT_H +#define Py_ENUMOBJECT_H + +/* Enumerate Object */ + +#ifdef __cplusplus +extern "C" { +#endif + +PyAPI_DATA(PyTypeObject) PyEnum_Type; +PyAPI_DATA(PyTypeObject) PyReversed_Type; + +#ifdef __cplusplus +} +#endif + +#endif /* !Py_ENUMOBJECT_H */ diff --git a/env/Include/errcode.h b/env/Include/errcode.h new file mode 100644 index 0000000..b37cd26 --- /dev/null +++ b/env/Include/errcode.h @@ -0,0 +1,38 @@ +#ifndef Py_ERRCODE_H +#define Py_ERRCODE_H +#ifdef __cplusplus +extern "C" { +#endif + + +/* Error codes passed around between file input, tokenizer, parser and + interpreter. This is necessary so we can turn them into Python + exceptions at a higher level. Note that some errors have a + slightly different meaning when passed from the tokenizer to the + parser than when passed from the parser to the interpreter; e.g. + the parser only returns E_EOF when it hits EOF immediately, and it + never returns E_OK. */ + +#define E_OK 10 /* No error */ +#define E_EOF 11 /* End Of File */ +#define E_INTR 12 /* Interrupted */ +#define E_TOKEN 13 /* Bad token */ +#define E_SYNTAX 14 /* Syntax error */ +#define E_NOMEM 15 /* Ran out of memory */ +#define E_DONE 16 /* Parsing complete */ +#define E_ERROR 17 /* Execution error */ +#define E_TABSPACE 18 /* Inconsistent mixing of tabs and spaces */ +#define E_OVERFLOW 19 /* Node had too many children */ +#define E_TOODEEP 20 /* Too many indentation levels */ +#define E_DEDENT 21 /* No matching outer block for dedent */ +#define E_DECODE 22 /* Error in decoding into Unicode */ +#define E_EOFS 23 /* EOF in triple-quoted string */ +#define E_EOLS 24 /* EOL in single-quoted string */ +#define E_LINECONT 25 /* Unexpected characters after a line continuation */ +#define E_IDENTIFIER 26 /* Invalid characters in identifier */ +#define E_BADSINGLE 27 /* Ill-formed single statement input */ + +#ifdef __cplusplus +} +#endif +#endif /* !Py_ERRCODE_H */ diff --git a/env/Include/eval.h b/env/Include/eval.h new file mode 100644 index 0000000..2c1c2d0 --- /dev/null +++ b/env/Include/eval.h @@ -0,0 +1,37 @@ + +/* Interface to execute compiled code */ + +#ifndef Py_EVAL_H +#define Py_EVAL_H +#ifdef __cplusplus +extern "C" { +#endif + +PyAPI_FUNC(PyObject *) PyEval_EvalCode(PyObject *, PyObject *, PyObject *); + +PyAPI_FUNC(PyObject *) PyEval_EvalCodeEx(PyObject *co, + PyObject *globals, + PyObject *locals, + PyObject *const *args, int argc, + PyObject *const *kwds, int kwdc, + PyObject *const *defs, int defc, + PyObject *kwdefs, PyObject *closure); + +#ifndef Py_LIMITED_API +PyAPI_FUNC(PyObject *) _PyEval_EvalCodeWithName( + PyObject *co, + PyObject *globals, PyObject *locals, + PyObject *const *args, Py_ssize_t argcount, + PyObject *const *kwnames, PyObject *const *kwargs, + Py_ssize_t kwcount, int kwstep, + PyObject *const *defs, Py_ssize_t defcount, + PyObject *kwdefs, PyObject *closure, + PyObject *name, PyObject *qualname); + +PyAPI_FUNC(PyObject *) _PyEval_CallTracing(PyObject *func, PyObject *args); +#endif + +#ifdef __cplusplus +} +#endif +#endif /* !Py_EVAL_H */ diff --git a/env/Include/fileobject.h b/env/Include/fileobject.h new file mode 100644 index 0000000..89e8dd6 --- /dev/null +++ b/env/Include/fileobject.h @@ -0,0 +1,55 @@ +/* File object interface (what's left of it -- see io.py) */ + +#ifndef Py_FILEOBJECT_H +#define Py_FILEOBJECT_H +#ifdef __cplusplus +extern "C" { +#endif + +#define PY_STDIOTEXTMODE "b" + +PyAPI_FUNC(PyObject *) PyFile_FromFd(int, const char *, const char *, int, + const char *, const char *, + const char *, int); +PyAPI_FUNC(PyObject *) PyFile_GetLine(PyObject *, int); +PyAPI_FUNC(int) PyFile_WriteObject(PyObject *, PyObject *, int); +PyAPI_FUNC(int) PyFile_WriteString(const char *, PyObject *); +PyAPI_FUNC(int) PyObject_AsFileDescriptor(PyObject *); +#ifndef Py_LIMITED_API +PyAPI_FUNC(char *) Py_UniversalNewlineFgets(char *, int, FILE*, PyObject *); +#endif + +/* The default encoding used by the platform file system APIs + If non-NULL, this is different than the default encoding for strings +*/ +PyAPI_DATA(const char *) Py_FileSystemDefaultEncoding; +#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03060000 +PyAPI_DATA(const char *) Py_FileSystemDefaultEncodeErrors; +#endif +PyAPI_DATA(int) Py_HasFileSystemDefaultEncoding; + +#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03070000 +PyAPI_DATA(int) Py_UTF8Mode; +#endif + +/* Internal API + + The std printer acts as a preliminary sys.stderr until the new io + infrastructure is in place. */ +#ifndef Py_LIMITED_API +PyAPI_FUNC(PyObject *) PyFile_NewStdPrinter(int); +PyAPI_DATA(PyTypeObject) PyStdPrinter_Type; +#endif /* Py_LIMITED_API */ + +/* A routine to check if a file descriptor can be select()-ed. */ +#ifdef _MSC_VER + /* On Windows, any socket fd can be select()-ed, no matter how high */ + #define _PyIsSelectable_fd(FD) (1) +#else + #define _PyIsSelectable_fd(FD) ((unsigned int)(FD) < (unsigned int)FD_SETSIZE) +#endif + +#ifdef __cplusplus +} +#endif +#endif /* !Py_FILEOBJECT_H */ diff --git a/env/Include/fileutils.h b/env/Include/fileutils.h new file mode 100644 index 0000000..419d49a --- /dev/null +++ b/env/Include/fileutils.h @@ -0,0 +1,201 @@ +#ifndef Py_FILEUTILS_H +#define Py_FILEUTILS_H + +#ifdef __cplusplus +extern "C" { +#endif + +#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03050000 +PyAPI_FUNC(wchar_t *) Py_DecodeLocale( + const char *arg, + size_t *size); + +PyAPI_FUNC(char*) Py_EncodeLocale( + const wchar_t *text, + size_t *error_pos); + +PyAPI_FUNC(char*) _Py_EncodeLocaleRaw( + const wchar_t *text, + size_t *error_pos); +#endif + +#ifdef Py_BUILD_CORE +PyAPI_FUNC(int) _Py_DecodeUTF8Ex( + const char *arg, + Py_ssize_t arglen, + wchar_t **wstr, + size_t *wlen, + const char **reason, + int surrogateescape); + +PyAPI_FUNC(int) _Py_EncodeUTF8Ex( + const wchar_t *text, + char **str, + size_t *error_pos, + const char **reason, + int raw_malloc, + int surrogateescape); + +PyAPI_FUNC(wchar_t*) _Py_DecodeUTF8_surrogateescape( + const char *arg, + Py_ssize_t arglen); + +PyAPI_FUNC(int) _Py_DecodeLocaleEx( + const char *arg, + wchar_t **wstr, + size_t *wlen, + const char **reason, + int current_locale, + int surrogateescape); + +PyAPI_FUNC(int) _Py_EncodeLocaleEx( + const wchar_t *text, + char **str, + size_t *error_pos, + const char **reason, + int current_locale, + int surrogateescape); +#endif + +#ifndef Py_LIMITED_API +PyAPI_FUNC(PyObject *) _Py_device_encoding(int); + +#if defined(MS_WINDOWS) || defined(__APPLE__) + /* On Windows, the count parameter of read() is an int (bpo-9015, bpo-9611). + On macOS 10.13, read() and write() with more than INT_MAX bytes + fail with EINVAL (bpo-24658). */ +# define _PY_READ_MAX INT_MAX +# define _PY_WRITE_MAX INT_MAX +#else + /* write() should truncate the input to PY_SSIZE_T_MAX bytes, + but it's safer to do it ourself to have a portable behaviour */ +# define _PY_READ_MAX PY_SSIZE_T_MAX +# define _PY_WRITE_MAX PY_SSIZE_T_MAX +#endif + +#ifdef MS_WINDOWS +struct _Py_stat_struct { + unsigned long st_dev; + uint64_t st_ino; + unsigned short st_mode; + int st_nlink; + int st_uid; + int st_gid; + unsigned long st_rdev; + __int64 st_size; + time_t st_atime; + int st_atime_nsec; + time_t st_mtime; + int st_mtime_nsec; + time_t st_ctime; + int st_ctime_nsec; + unsigned long st_file_attributes; +}; +#else +# define _Py_stat_struct stat +#endif + +PyAPI_FUNC(int) _Py_fstat( + int fd, + struct _Py_stat_struct *status); + +PyAPI_FUNC(int) _Py_fstat_noraise( + int fd, + struct _Py_stat_struct *status); + +PyAPI_FUNC(int) _Py_stat( + PyObject *path, + struct stat *status); + +PyAPI_FUNC(int) _Py_open( + const char *pathname, + int flags); + +PyAPI_FUNC(int) _Py_open_noraise( + const char *pathname, + int flags); + +PyAPI_FUNC(FILE *) _Py_wfopen( + const wchar_t *path, + const wchar_t *mode); + +PyAPI_FUNC(FILE*) _Py_fopen( + const char *pathname, + const char *mode); + +PyAPI_FUNC(FILE*) _Py_fopen_obj( + PyObject *path, + const char *mode); + +PyAPI_FUNC(Py_ssize_t) _Py_read( + int fd, + void *buf, + size_t count); + +PyAPI_FUNC(Py_ssize_t) _Py_write( + int fd, + const void *buf, + size_t count); + +PyAPI_FUNC(Py_ssize_t) _Py_write_noraise( + int fd, + const void *buf, + size_t count); + +#ifdef HAVE_READLINK +PyAPI_FUNC(int) _Py_wreadlink( + const wchar_t *path, + wchar_t *buf, + size_t bufsiz); +#endif + +#ifdef HAVE_REALPATH +PyAPI_FUNC(wchar_t*) _Py_wrealpath( + const wchar_t *path, + wchar_t *resolved_path, + size_t resolved_path_size); +#endif + +PyAPI_FUNC(wchar_t*) _Py_wgetcwd( + wchar_t *buf, + size_t size); + +PyAPI_FUNC(int) _Py_get_inheritable(int fd); + +PyAPI_FUNC(int) _Py_set_inheritable(int fd, int inheritable, + int *atomic_flag_works); + +PyAPI_FUNC(int) _Py_set_inheritable_async_safe(int fd, int inheritable, + int *atomic_flag_works); + +PyAPI_FUNC(int) _Py_dup(int fd); + +#ifndef MS_WINDOWS +PyAPI_FUNC(int) _Py_get_blocking(int fd); + +PyAPI_FUNC(int) _Py_set_blocking(int fd, int blocking); +#endif /* !MS_WINDOWS */ + +PyAPI_FUNC(int) _Py_GetLocaleconvNumeric( + PyObject **decimal_point, + PyObject **thousands_sep, + const char **grouping); + +#endif /* Py_LIMITED_API */ + +#ifdef Py_BUILD_CORE +PyAPI_FUNC(int) _Py_GetForceASCII(void); + +/* Reset "force ASCII" mode (if it was initialized). + + This function should be called when Python changes the LC_CTYPE locale, + so the "force ASCII" mode can be detected again on the new locale + encoding. */ +PyAPI_FUNC(void) _Py_ResetForceASCII(void); +#endif + +#ifdef __cplusplus +} +#endif + +#endif /* !Py_FILEUTILS_H */ diff --git a/env/Include/floatobject.h b/env/Include/floatobject.h new file mode 100644 index 0000000..f1044d6 --- /dev/null +++ b/env/Include/floatobject.h @@ -0,0 +1,130 @@ + +/* Float object interface */ + +/* +PyFloatObject represents a (double precision) floating point number. +*/ + +#ifndef Py_FLOATOBJECT_H +#define Py_FLOATOBJECT_H +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef Py_LIMITED_API +typedef struct { + PyObject_HEAD + double ob_fval; +} PyFloatObject; +#endif + +PyAPI_DATA(PyTypeObject) PyFloat_Type; + +#define PyFloat_Check(op) PyObject_TypeCheck(op, &PyFloat_Type) +#define PyFloat_CheckExact(op) (Py_TYPE(op) == &PyFloat_Type) + +#ifdef Py_NAN +#define Py_RETURN_NAN return PyFloat_FromDouble(Py_NAN) +#endif + +#define Py_RETURN_INF(sign) do \ + if (copysign(1., sign) == 1.) { \ + return PyFloat_FromDouble(Py_HUGE_VAL); \ + } else { \ + return PyFloat_FromDouble(-Py_HUGE_VAL); \ + } while(0) + +PyAPI_FUNC(double) PyFloat_GetMax(void); +PyAPI_FUNC(double) PyFloat_GetMin(void); +PyAPI_FUNC(PyObject *) PyFloat_GetInfo(void); + +/* Return Python float from string PyObject. */ +PyAPI_FUNC(PyObject *) PyFloat_FromString(PyObject*); + +/* Return Python float from C double. */ +PyAPI_FUNC(PyObject *) PyFloat_FromDouble(double); + +/* Extract C double from Python float. The macro version trades safety for + speed. */ +PyAPI_FUNC(double) PyFloat_AsDouble(PyObject *); +#ifndef Py_LIMITED_API +#define PyFloat_AS_DOUBLE(op) (((PyFloatObject *)(op))->ob_fval) +#endif + +#ifndef Py_LIMITED_API +/* _PyFloat_{Pack,Unpack}{4,8} + * + * The struct and pickle (at least) modules need an efficient platform- + * independent way to store floating-point values as byte strings. + * The Pack routines produce a string from a C double, and the Unpack + * routines produce a C double from such a string. The suffix (4 or 8) + * specifies the number of bytes in the string. + * + * On platforms that appear to use (see _PyFloat_Init()) IEEE-754 formats + * these functions work by copying bits. On other platforms, the formats the + * 4- byte format is identical to the IEEE-754 single precision format, and + * the 8-byte format to the IEEE-754 double precision format, although the + * packing of INFs and NaNs (if such things exist on the platform) isn't + * handled correctly, and attempting to unpack a string containing an IEEE + * INF or NaN will raise an exception. + * + * On non-IEEE platforms with more precision, or larger dynamic range, than + * 754 supports, not all values can be packed; on non-IEEE platforms with less + * precision, or smaller dynamic range, not all values can be unpacked. What + * happens in such cases is partly accidental (alas). + */ + +/* The pack routines write 2, 4 or 8 bytes, starting at p. le is a bool + * argument, true if you want the string in little-endian format (exponent + * last, at p+1, p+3 or p+7), false if you want big-endian format (exponent + * first, at p). + * Return value: 0 if all is OK, -1 if error (and an exception is + * set, most likely OverflowError). + * There are two problems on non-IEEE platforms: + * 1): What this does is undefined if x is a NaN or infinity. + * 2): -0.0 and +0.0 produce the same string. + */ +PyAPI_FUNC(int) _PyFloat_Pack2(double x, unsigned char *p, int le); +PyAPI_FUNC(int) _PyFloat_Pack4(double x, unsigned char *p, int le); +PyAPI_FUNC(int) _PyFloat_Pack8(double x, unsigned char *p, int le); + +/* Needed for the old way for marshal to store a floating point number. + Returns the string length copied into p, -1 on error. + */ +PyAPI_FUNC(int) _PyFloat_Repr(double x, char *p, size_t len); + +/* Used to get the important decimal digits of a double */ +PyAPI_FUNC(int) _PyFloat_Digits(char *buf, double v, int *signum); +PyAPI_FUNC(void) _PyFloat_DigitsInit(void); + +/* The unpack routines read 2, 4 or 8 bytes, starting at p. le is a bool + * argument, true if the string is in little-endian format (exponent + * last, at p+1, p+3 or p+7), false if big-endian (exponent first, at p). + * Return value: The unpacked double. On error, this is -1.0 and + * PyErr_Occurred() is true (and an exception is set, most likely + * OverflowError). Note that on a non-IEEE platform this will refuse + * to unpack a string that represents a NaN or infinity. + */ +PyAPI_FUNC(double) _PyFloat_Unpack2(const unsigned char *p, int le); +PyAPI_FUNC(double) _PyFloat_Unpack4(const unsigned char *p, int le); +PyAPI_FUNC(double) _PyFloat_Unpack8(const unsigned char *p, int le); + +/* free list api */ +PyAPI_FUNC(int) PyFloat_ClearFreeList(void); + +PyAPI_FUNC(void) _PyFloat_DebugMallocStats(FILE* out); + +/* Format the object based on the format_spec, as defined in PEP 3101 + (Advanced String Formatting). */ +PyAPI_FUNC(int) _PyFloat_FormatAdvancedWriter( + _PyUnicodeWriter *writer, + PyObject *obj, + PyObject *format_spec, + Py_ssize_t start, + Py_ssize_t end); +#endif /* Py_LIMITED_API */ + +#ifdef __cplusplus +} +#endif +#endif /* !Py_FLOATOBJECT_H */ diff --git a/env/Include/frameobject.h b/env/Include/frameobject.h new file mode 100644 index 0000000..a95baf8 --- /dev/null +++ b/env/Include/frameobject.h @@ -0,0 +1,93 @@ + +/* Frame object interface */ + +#ifndef Py_LIMITED_API +#ifndef Py_FRAMEOBJECT_H +#define Py_FRAMEOBJECT_H +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct { + int b_type; /* what kind of block this is */ + int b_handler; /* where to jump to find handler */ + int b_level; /* value stack level to pop to */ +} PyTryBlock; + +typedef struct _frame { + PyObject_VAR_HEAD + struct _frame *f_back; /* previous frame, or NULL */ + PyCodeObject *f_code; /* code segment */ + PyObject *f_builtins; /* builtin symbol table (PyDictObject) */ + PyObject *f_globals; /* global symbol table (PyDictObject) */ + PyObject *f_locals; /* local symbol table (any mapping) */ + PyObject **f_valuestack; /* points after the last local */ + /* Next free slot in f_valuestack. Frame creation sets to f_valuestack. + Frame evaluation usually NULLs it, but a frame that yields sets it + to the current stack top. */ + PyObject **f_stacktop; + PyObject *f_trace; /* Trace function */ + char f_trace_lines; /* Emit per-line trace events? */ + char f_trace_opcodes; /* Emit per-opcode trace events? */ + + /* Borrowed reference to a generator, or NULL */ + PyObject *f_gen; + + int f_lasti; /* Last instruction if called */ + /* Call PyFrame_GetLineNumber() instead of reading this field + directly. As of 2.3 f_lineno is only valid when tracing is + active (i.e. when f_trace is set). At other times we use + PyCode_Addr2Line to calculate the line from the current + bytecode index. */ + int f_lineno; /* Current line number */ + int f_iblock; /* index in f_blockstack */ + char f_executing; /* whether the frame is still executing */ + PyTryBlock f_blockstack[CO_MAXBLOCKS]; /* for try and loop blocks */ + PyObject *f_localsplus[1]; /* locals+stack, dynamically sized */ +} PyFrameObject; + + +/* Standard object interface */ + +PyAPI_DATA(PyTypeObject) PyFrame_Type; + +#define PyFrame_Check(op) (Py_TYPE(op) == &PyFrame_Type) + +PyAPI_FUNC(PyFrameObject *) PyFrame_New(PyThreadState *, PyCodeObject *, + PyObject *, PyObject *); + +/* only internal use */ +PyFrameObject* _PyFrame_New_NoTrack(PyThreadState *, PyCodeObject *, + PyObject *, PyObject *); + + +/* The rest of the interface is specific for frame objects */ + +/* Block management functions */ + +PyAPI_FUNC(void) PyFrame_BlockSetup(PyFrameObject *, int, int, int); +PyAPI_FUNC(PyTryBlock *) PyFrame_BlockPop(PyFrameObject *); + +/* Extend the value stack */ + +PyAPI_FUNC(PyObject **) PyFrame_ExtendStack(PyFrameObject *, int, int); + +/* Conversions between "fast locals" and locals in dictionary */ + +PyAPI_FUNC(void) PyFrame_LocalsToFast(PyFrameObject *, int); + +PyAPI_FUNC(int) PyFrame_FastToLocalsWithError(PyFrameObject *f); +PyAPI_FUNC(void) PyFrame_FastToLocals(PyFrameObject *); + +PyAPI_FUNC(int) PyFrame_ClearFreeList(void); + +PyAPI_FUNC(void) _PyFrame_DebugMallocStats(FILE *out); + +/* Return the line of code the frame is currently executing. */ +PyAPI_FUNC(int) PyFrame_GetLineNumber(PyFrameObject *); + +#ifdef __cplusplus +} +#endif +#endif /* !Py_FRAMEOBJECT_H */ +#endif /* Py_LIMITED_API */ diff --git a/env/Include/funcobject.h b/env/Include/funcobject.h new file mode 100644 index 0000000..86674ac --- /dev/null +++ b/env/Include/funcobject.h @@ -0,0 +1,103 @@ + +/* Function object interface */ +#ifndef Py_LIMITED_API +#ifndef Py_FUNCOBJECT_H +#define Py_FUNCOBJECT_H +#ifdef __cplusplus +extern "C" { +#endif + +/* Function objects and code objects should not be confused with each other: + * + * Function objects are created by the execution of the 'def' statement. + * They reference a code object in their __code__ attribute, which is a + * purely syntactic object, i.e. nothing more than a compiled version of some + * source code lines. There is one code object per source code "fragment", + * but each code object can be referenced by zero or many function objects + * depending only on how many times the 'def' statement in the source was + * executed so far. + */ + +typedef struct { + PyObject_HEAD + PyObject *func_code; /* A code object, the __code__ attribute */ + PyObject *func_globals; /* A dictionary (other mappings won't do) */ + PyObject *func_defaults; /* NULL or a tuple */ + PyObject *func_kwdefaults; /* NULL or a dict */ + PyObject *func_closure; /* NULL or a tuple of cell objects */ + PyObject *func_doc; /* The __doc__ attribute, can be anything */ + PyObject *func_name; /* The __name__ attribute, a string object */ + PyObject *func_dict; /* The __dict__ attribute, a dict or NULL */ + PyObject *func_weakreflist; /* List of weak references */ + PyObject *func_module; /* The __module__ attribute, can be anything */ + PyObject *func_annotations; /* Annotations, a dict or NULL */ + PyObject *func_qualname; /* The qualified name */ + + /* Invariant: + * func_closure contains the bindings for func_code->co_freevars, so + * PyTuple_Size(func_closure) == PyCode_GetNumFree(func_code) + * (func_closure may be NULL if PyCode_GetNumFree(func_code) == 0). + */ +} PyFunctionObject; + +PyAPI_DATA(PyTypeObject) PyFunction_Type; + +#define PyFunction_Check(op) (Py_TYPE(op) == &PyFunction_Type) + +PyAPI_FUNC(PyObject *) PyFunction_New(PyObject *, PyObject *); +PyAPI_FUNC(PyObject *) PyFunction_NewWithQualName(PyObject *, PyObject *, PyObject *); +PyAPI_FUNC(PyObject *) PyFunction_GetCode(PyObject *); +PyAPI_FUNC(PyObject *) PyFunction_GetGlobals(PyObject *); +PyAPI_FUNC(PyObject *) PyFunction_GetModule(PyObject *); +PyAPI_FUNC(PyObject *) PyFunction_GetDefaults(PyObject *); +PyAPI_FUNC(int) PyFunction_SetDefaults(PyObject *, PyObject *); +PyAPI_FUNC(PyObject *) PyFunction_GetKwDefaults(PyObject *); +PyAPI_FUNC(int) PyFunction_SetKwDefaults(PyObject *, PyObject *); +PyAPI_FUNC(PyObject *) PyFunction_GetClosure(PyObject *); +PyAPI_FUNC(int) PyFunction_SetClosure(PyObject *, PyObject *); +PyAPI_FUNC(PyObject *) PyFunction_GetAnnotations(PyObject *); +PyAPI_FUNC(int) PyFunction_SetAnnotations(PyObject *, PyObject *); + +#ifndef Py_LIMITED_API +PyAPI_FUNC(PyObject *) _PyFunction_FastCallDict( + PyObject *func, + PyObject *const *args, + Py_ssize_t nargs, + PyObject *kwargs); + +PyAPI_FUNC(PyObject *) _PyFunction_FastCallKeywords( + PyObject *func, + PyObject *const *stack, + Py_ssize_t nargs, + PyObject *kwnames); +#endif + +/* Macros for direct access to these values. Type checks are *not* + done, so use with care. */ +#define PyFunction_GET_CODE(func) \ + (((PyFunctionObject *)func) -> func_code) +#define PyFunction_GET_GLOBALS(func) \ + (((PyFunctionObject *)func) -> func_globals) +#define PyFunction_GET_MODULE(func) \ + (((PyFunctionObject *)func) -> func_module) +#define PyFunction_GET_DEFAULTS(func) \ + (((PyFunctionObject *)func) -> func_defaults) +#define PyFunction_GET_KW_DEFAULTS(func) \ + (((PyFunctionObject *)func) -> func_kwdefaults) +#define PyFunction_GET_CLOSURE(func) \ + (((PyFunctionObject *)func) -> func_closure) +#define PyFunction_GET_ANNOTATIONS(func) \ + (((PyFunctionObject *)func) -> func_annotations) + +/* The classmethod and staticmethod types lives here, too */ +PyAPI_DATA(PyTypeObject) PyClassMethod_Type; +PyAPI_DATA(PyTypeObject) PyStaticMethod_Type; + +PyAPI_FUNC(PyObject *) PyClassMethod_New(PyObject *); +PyAPI_FUNC(PyObject *) PyStaticMethod_New(PyObject *); + +#ifdef __cplusplus +} +#endif +#endif /* !Py_FUNCOBJECT_H */ +#endif /* Py_LIMITED_API */ diff --git a/env/Include/genobject.h b/env/Include/genobject.h new file mode 100644 index 0000000..16b9833 --- /dev/null +++ b/env/Include/genobject.h @@ -0,0 +1,105 @@ + +/* Generator object interface */ + +#ifndef Py_LIMITED_API +#ifndef Py_GENOBJECT_H +#define Py_GENOBJECT_H +#ifdef __cplusplus +extern "C" { +#endif + +struct _frame; /* Avoid including frameobject.h */ + +/* _PyGenObject_HEAD defines the initial segment of generator + and coroutine objects. */ +#define _PyGenObject_HEAD(prefix) \ + PyObject_HEAD \ + /* Note: gi_frame can be NULL if the generator is "finished" */ \ + struct _frame *prefix##_frame; \ + /* True if generator is being executed. */ \ + char prefix##_running; \ + /* The code object backing the generator */ \ + PyObject *prefix##_code; \ + /* List of weak reference. */ \ + PyObject *prefix##_weakreflist; \ + /* Name of the generator. */ \ + PyObject *prefix##_name; \ + /* Qualified name of the generator. */ \ + PyObject *prefix##_qualname; \ + _PyErr_StackItem prefix##_exc_state; + +typedef struct { + /* The gi_ prefix is intended to remind of generator-iterator. */ + _PyGenObject_HEAD(gi) +} PyGenObject; + +PyAPI_DATA(PyTypeObject) PyGen_Type; + +#define PyGen_Check(op) PyObject_TypeCheck(op, &PyGen_Type) +#define PyGen_CheckExact(op) (Py_TYPE(op) == &PyGen_Type) + +PyAPI_FUNC(PyObject *) PyGen_New(struct _frame *); +PyAPI_FUNC(PyObject *) PyGen_NewWithQualName(struct _frame *, + PyObject *name, PyObject *qualname); +PyAPI_FUNC(int) PyGen_NeedsFinalizing(PyGenObject *); +PyAPI_FUNC(int) _PyGen_SetStopIterationValue(PyObject *); +PyAPI_FUNC(int) _PyGen_FetchStopIterationValue(PyObject **); +PyAPI_FUNC(PyObject *) _PyGen_Send(PyGenObject *, PyObject *); +PyObject *_PyGen_yf(PyGenObject *); +PyAPI_FUNC(void) _PyGen_Finalize(PyObject *self); + +#ifndef Py_LIMITED_API +typedef struct { + _PyGenObject_HEAD(cr) + PyObject *cr_origin; +} PyCoroObject; + +PyAPI_DATA(PyTypeObject) PyCoro_Type; +PyAPI_DATA(PyTypeObject) _PyCoroWrapper_Type; + +PyAPI_DATA(PyTypeObject) _PyAIterWrapper_Type; + +#define PyCoro_CheckExact(op) (Py_TYPE(op) == &PyCoro_Type) +PyObject *_PyCoro_GetAwaitableIter(PyObject *o); +PyAPI_FUNC(PyObject *) PyCoro_New(struct _frame *, + PyObject *name, PyObject *qualname); + +/* Asynchronous Generators */ + +typedef struct { + _PyGenObject_HEAD(ag) + PyObject *ag_finalizer; + + /* Flag is set to 1 when hooks set up by sys.set_asyncgen_hooks + were called on the generator, to avoid calling them more + than once. */ + int ag_hooks_inited; + + /* Flag is set to 1 when aclose() is called for the first time, or + when a StopAsyncIteration exception is raised. */ + int ag_closed; +} PyAsyncGenObject; + +PyAPI_DATA(PyTypeObject) PyAsyncGen_Type; +PyAPI_DATA(PyTypeObject) _PyAsyncGenASend_Type; +PyAPI_DATA(PyTypeObject) _PyAsyncGenWrappedValue_Type; +PyAPI_DATA(PyTypeObject) _PyAsyncGenAThrow_Type; + +PyAPI_FUNC(PyObject *) PyAsyncGen_New(struct _frame *, + PyObject *name, PyObject *qualname); + +#define PyAsyncGen_CheckExact(op) (Py_TYPE(op) == &PyAsyncGen_Type) + +PyObject *_PyAsyncGenValueWrapperNew(PyObject *); + +int PyAsyncGen_ClearFreeLists(void); + +#endif + +#undef _PyGenObject_HEAD + +#ifdef __cplusplus +} +#endif +#endif /* !Py_GENOBJECT_H */ +#endif /* Py_LIMITED_API */ diff --git a/env/Include/graminit.h b/env/Include/graminit.h new file mode 100644 index 0000000..bdfe821 --- /dev/null +++ b/env/Include/graminit.h @@ -0,0 +1,89 @@ +/* Generated by Parser/pgen */ + +#define single_input 256 +#define file_input 257 +#define eval_input 258 +#define decorator 259 +#define decorators 260 +#define decorated 261 +#define async_funcdef 262 +#define funcdef 263 +#define parameters 264 +#define typedargslist 265 +#define tfpdef 266 +#define varargslist 267 +#define vfpdef 268 +#define stmt 269 +#define simple_stmt 270 +#define small_stmt 271 +#define expr_stmt 272 +#define annassign 273 +#define testlist_star_expr 274 +#define augassign 275 +#define del_stmt 276 +#define pass_stmt 277 +#define flow_stmt 278 +#define break_stmt 279 +#define continue_stmt 280 +#define return_stmt 281 +#define yield_stmt 282 +#define raise_stmt 283 +#define import_stmt 284 +#define import_name 285 +#define import_from 286 +#define import_as_name 287 +#define dotted_as_name 288 +#define import_as_names 289 +#define dotted_as_names 290 +#define dotted_name 291 +#define global_stmt 292 +#define nonlocal_stmt 293 +#define assert_stmt 294 +#define compound_stmt 295 +#define async_stmt 296 +#define if_stmt 297 +#define while_stmt 298 +#define for_stmt 299 +#define try_stmt 300 +#define with_stmt 301 +#define with_item 302 +#define except_clause 303 +#define suite 304 +#define test 305 +#define test_nocond 306 +#define lambdef 307 +#define lambdef_nocond 308 +#define or_test 309 +#define and_test 310 +#define not_test 311 +#define comparison 312 +#define comp_op 313 +#define star_expr 314 +#define expr 315 +#define xor_expr 316 +#define and_expr 317 +#define shift_expr 318 +#define arith_expr 319 +#define term 320 +#define factor 321 +#define power 322 +#define atom_expr 323 +#define atom 324 +#define testlist_comp 325 +#define trailer 326 +#define subscriptlist 327 +#define subscript 328 +#define sliceop 329 +#define exprlist 330 +#define testlist 331 +#define dictorsetmaker 332 +#define classdef 333 +#define arglist 334 +#define argument 335 +#define comp_iter 336 +#define sync_comp_for 337 +#define comp_for 338 +#define comp_if 339 +#define encoding_decl 340 +#define yield_expr 341 +#define yield_arg 342 diff --git a/env/Include/grammar.h b/env/Include/grammar.h new file mode 100644 index 0000000..e1703f4 --- /dev/null +++ b/env/Include/grammar.h @@ -0,0 +1,94 @@ + +/* Grammar interface */ + +#ifndef Py_GRAMMAR_H +#define Py_GRAMMAR_H +#ifdef __cplusplus +extern "C" { +#endif + +#include "bitset.h" /* Sigh... */ + +/* A label of an arc */ + +typedef struct { + int lb_type; + char *lb_str; +} label; + +#define EMPTY 0 /* Label number 0 is by definition the empty label */ + +/* A list of labels */ + +typedef struct { + int ll_nlabels; + label *ll_label; +} labellist; + +/* An arc from one state to another */ + +typedef struct { + short a_lbl; /* Label of this arc */ + short a_arrow; /* State where this arc goes to */ +} arc; + +/* A state in a DFA */ + +typedef struct { + int s_narcs; + arc *s_arc; /* Array of arcs */ + + /* Optional accelerators */ + int s_lower; /* Lowest label index */ + int s_upper; /* Highest label index */ + int *s_accel; /* Accelerator */ + int s_accept; /* Nonzero for accepting state */ +} state; + +/* A DFA */ + +typedef struct { + int d_type; /* Non-terminal this represents */ + char *d_name; /* For printing */ + int d_initial; /* Initial state */ + int d_nstates; + state *d_state; /* Array of states */ + bitset d_first; +} dfa; + +/* A grammar */ + +typedef struct { + int g_ndfas; + dfa *g_dfa; /* Array of DFAs */ + labellist g_ll; + int g_start; /* Start symbol of the grammar */ + int g_accel; /* Set if accelerators present */ +} grammar; + +/* FUNCTIONS */ + +grammar *newgrammar(int start); +void freegrammar(grammar *g); +dfa *adddfa(grammar *g, int type, const char *name); +int addstate(dfa *d); +void addarc(dfa *d, int from, int to, int lbl); +dfa *PyGrammar_FindDFA(grammar *g, int type); + +int addlabel(labellist *ll, int type, const char *str); +int findlabel(labellist *ll, int type, const char *str); +const char *PyGrammar_LabelRepr(label *lb); +void translatelabels(grammar *g); + +void addfirstsets(grammar *g); + +void PyGrammar_AddAccelerators(grammar *g); +void PyGrammar_RemoveAccelerators(grammar *); + +void printgrammar(grammar *g, FILE *fp); +void printnonterminals(grammar *g, FILE *fp); + +#ifdef __cplusplus +} +#endif +#endif /* !Py_GRAMMAR_H */ diff --git a/env/Include/import.h b/env/Include/import.h new file mode 100644 index 0000000..c664803 --- /dev/null +++ b/env/Include/import.h @@ -0,0 +1,151 @@ + +/* Module definition and import interface */ + +#ifndef Py_IMPORT_H +#define Py_IMPORT_H +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef Py_LIMITED_API +PyAPI_FUNC(_PyInitError) _PyImportZip_Init(void); + +PyMODINIT_FUNC PyInit__imp(void); +#endif /* !Py_LIMITED_API */ +PyAPI_FUNC(long) PyImport_GetMagicNumber(void); +PyAPI_FUNC(const char *) PyImport_GetMagicTag(void); +PyAPI_FUNC(PyObject *) PyImport_ExecCodeModule( + const char *name, /* UTF-8 encoded string */ + PyObject *co + ); +PyAPI_FUNC(PyObject *) PyImport_ExecCodeModuleEx( + const char *name, /* UTF-8 encoded string */ + PyObject *co, + const char *pathname /* decoded from the filesystem encoding */ + ); +PyAPI_FUNC(PyObject *) PyImport_ExecCodeModuleWithPathnames( + const char *name, /* UTF-8 encoded string */ + PyObject *co, + const char *pathname, /* decoded from the filesystem encoding */ + const char *cpathname /* decoded from the filesystem encoding */ + ); +#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03030000 +PyAPI_FUNC(PyObject *) PyImport_ExecCodeModuleObject( + PyObject *name, + PyObject *co, + PyObject *pathname, + PyObject *cpathname + ); +#endif +PyAPI_FUNC(PyObject *) PyImport_GetModuleDict(void); +#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03070000 +PyAPI_FUNC(PyObject *) PyImport_GetModule(PyObject *name); +#endif +#ifndef Py_LIMITED_API +PyAPI_FUNC(int) _PyImport_IsInitialized(PyInterpreterState *); +PyAPI_FUNC(PyObject *) _PyImport_GetModuleId(struct _Py_Identifier *name); +PyAPI_FUNC(PyObject *) _PyImport_AddModuleObject(PyObject *name, + PyObject *modules); +PyAPI_FUNC(int) _PyImport_SetModule(PyObject *name, PyObject *module); +PyAPI_FUNC(int) _PyImport_SetModuleString(const char *name, PyObject* module); +#endif +#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03030000 +PyAPI_FUNC(PyObject *) PyImport_AddModuleObject( + PyObject *name + ); +#endif +PyAPI_FUNC(PyObject *) PyImport_AddModule( + const char *name /* UTF-8 encoded string */ + ); +PyAPI_FUNC(PyObject *) PyImport_ImportModule( + const char *name /* UTF-8 encoded string */ + ); +PyAPI_FUNC(PyObject *) PyImport_ImportModuleNoBlock( + const char *name /* UTF-8 encoded string */ + ); +PyAPI_FUNC(PyObject *) PyImport_ImportModuleLevel( + const char *name, /* UTF-8 encoded string */ + PyObject *globals, + PyObject *locals, + PyObject *fromlist, + int level + ); +#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03050000 +PyAPI_FUNC(PyObject *) PyImport_ImportModuleLevelObject( + PyObject *name, + PyObject *globals, + PyObject *locals, + PyObject *fromlist, + int level + ); +#endif + +#define PyImport_ImportModuleEx(n, g, l, f) \ + PyImport_ImportModuleLevel(n, g, l, f, 0) + +PyAPI_FUNC(PyObject *) PyImport_GetImporter(PyObject *path); +PyAPI_FUNC(PyObject *) PyImport_Import(PyObject *name); +PyAPI_FUNC(PyObject *) PyImport_ReloadModule(PyObject *m); +PyAPI_FUNC(void) PyImport_Cleanup(void); +#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03030000 +PyAPI_FUNC(int) PyImport_ImportFrozenModuleObject( + PyObject *name + ); +#endif +PyAPI_FUNC(int) PyImport_ImportFrozenModule( + const char *name /* UTF-8 encoded string */ + ); + +#ifndef Py_LIMITED_API +PyAPI_FUNC(void) _PyImport_AcquireLock(void); +PyAPI_FUNC(int) _PyImport_ReleaseLock(void); + +PyAPI_FUNC(void) _PyImport_ReInitLock(void); + +PyAPI_FUNC(PyObject *) _PyImport_FindBuiltin( + const char *name, /* UTF-8 encoded string */ + PyObject *modules + ); +PyAPI_FUNC(PyObject *) _PyImport_FindExtensionObject(PyObject *, PyObject *); +PyAPI_FUNC(PyObject *) _PyImport_FindExtensionObjectEx(PyObject *, PyObject *, + PyObject *); +PyAPI_FUNC(int) _PyImport_FixupBuiltin( + PyObject *mod, + const char *name, /* UTF-8 encoded string */ + PyObject *modules + ); +PyAPI_FUNC(int) _PyImport_FixupExtensionObject(PyObject*, PyObject *, + PyObject *, PyObject *); + +struct _inittab { + const char *name; /* ASCII encoded string */ + PyObject* (*initfunc)(void); +}; +PyAPI_DATA(struct _inittab *) PyImport_Inittab; +PyAPI_FUNC(int) PyImport_ExtendInittab(struct _inittab *newtab); +#endif /* Py_LIMITED_API */ + +PyAPI_DATA(PyTypeObject) PyNullImporter_Type; + +PyAPI_FUNC(int) PyImport_AppendInittab( + const char *name, /* ASCII encoded string */ + PyObject* (*initfunc)(void) + ); + +#ifndef Py_LIMITED_API +struct _frozen { + const char *name; /* ASCII encoded string */ + const unsigned char *code; + int size; +}; + +/* Embedding apps may change this pointer to point to their favorite + collection of frozen modules: */ + +PyAPI_DATA(const struct _frozen *) PyImport_FrozenModules; +#endif + +#ifdef __cplusplus +} +#endif +#endif /* !Py_IMPORT_H */ diff --git a/env/Include/internal/ceval.h b/env/Include/internal/ceval.h new file mode 100644 index 0000000..cdabb95 --- /dev/null +++ b/env/Include/internal/ceval.h @@ -0,0 +1,52 @@ +#ifndef Py_INTERNAL_CEVAL_H +#define Py_INTERNAL_CEVAL_H +#ifdef __cplusplus +extern "C" { +#endif + +#include "pyatomic.h" +#include "pythread.h" + +struct _pending_calls { + unsigned long main_thread; + PyThread_type_lock lock; + /* Request for running pending calls. */ + _Py_atomic_int calls_to_do; + /* Request for looking at the `async_exc` field of the current + thread state. + Guarded by the GIL. */ + int async_exc; +#define NPENDINGCALLS 32 + struct { + int (*func)(void *); + void *arg; + } calls[NPENDINGCALLS]; + int first; + int last; +}; + +#include "internal/gil.h" + +struct _ceval_runtime_state { + int recursion_limit; + /* Records whether tracing is on for any thread. Counts the number + of threads for which tstate->c_tracefunc is non-NULL, so if the + value is 0, we know we don't have to check this thread's + c_tracefunc. This speeds up the if statement in + PyEval_EvalFrameEx() after fast_next_opcode. */ + int tracing_possible; + /* This single variable consolidates all requests to break out of + the fast path in the eval loop. */ + _Py_atomic_int eval_breaker; + /* Request for dropping the GIL */ + _Py_atomic_int gil_drop_request; + struct _pending_calls pending; + struct _gil_runtime_state gil; +}; + +PyAPI_FUNC(void) _PyEval_Initialize(struct _ceval_runtime_state *); + +#ifdef __cplusplus +} +#endif +#endif /* !Py_INTERNAL_CEVAL_H */ diff --git a/env/Include/internal/condvar.h b/env/Include/internal/condvar.h new file mode 100644 index 0000000..f933089 --- /dev/null +++ b/env/Include/internal/condvar.h @@ -0,0 +1,91 @@ +#ifndef Py_INTERNAL_CONDVAR_H +#define Py_INTERNAL_CONDVAR_H + +#ifndef _POSIX_THREADS +/* This means pthreads are not implemented in libc headers, hence the macro + not present in unistd.h. But they still can be implemented as an external + library (e.g. gnu pth in pthread emulation) */ +# ifdef HAVE_PTHREAD_H +# include /* _POSIX_THREADS */ +# endif +#endif + +#ifdef _POSIX_THREADS +/* + * POSIX support + */ +#define Py_HAVE_CONDVAR + +#include + +#define PyMUTEX_T pthread_mutex_t +#define PyCOND_T pthread_cond_t + +#elif defined(NT_THREADS) +/* + * Windows (XP, 2003 server and later, as well as (hopefully) CE) support + * + * Emulated condition variables ones that work with XP and later, plus + * example native support on VISTA and onwards. + */ +#define Py_HAVE_CONDVAR + +/* include windows if it hasn't been done before */ +#define WIN32_LEAN_AND_MEAN +#include + +/* options */ +/* non-emulated condition variables are provided for those that want + * to target Windows Vista. Modify this macro to enable them. + */ +#ifndef _PY_EMULATED_WIN_CV +#define _PY_EMULATED_WIN_CV 1 /* use emulated condition variables */ +#endif + +/* fall back to emulation if not targeting Vista */ +#if !defined NTDDI_VISTA || NTDDI_VERSION < NTDDI_VISTA +#undef _PY_EMULATED_WIN_CV +#define _PY_EMULATED_WIN_CV 1 +#endif + +#if _PY_EMULATED_WIN_CV + +typedef CRITICAL_SECTION PyMUTEX_T; + +/* The ConditionVariable object. From XP onwards it is easily emulated + with a Semaphore. + Semaphores are available on Windows XP (2003 server) and later. + We use a Semaphore rather than an auto-reset event, because although + an auto-resent event might appear to solve the lost-wakeup bug (race + condition between releasing the outer lock and waiting) because it + maintains state even though a wait hasn't happened, there is still + a lost wakeup problem if more than one thread are interrupted in the + critical place. A semaphore solves that, because its state is + counted, not Boolean. + Because it is ok to signal a condition variable with no one + waiting, we need to keep track of the number of + waiting threads. Otherwise, the semaphore's state could rise + without bound. This also helps reduce the number of "spurious wakeups" + that would otherwise happen. + */ + +typedef struct _PyCOND_T +{ + HANDLE sem; + int waiting; /* to allow PyCOND_SIGNAL to be a no-op */ +} PyCOND_T; + +#else /* !_PY_EMULATED_WIN_CV */ + +/* Use native Win7 primitives if build target is Win7 or higher */ + +/* SRWLOCK is faster and better than CriticalSection */ +typedef SRWLOCK PyMUTEX_T; + +typedef CONDITION_VARIABLE PyCOND_T; + +#endif /* _PY_EMULATED_WIN_CV */ + +#endif /* _POSIX_THREADS, NT_THREADS */ + +#endif /* Py_INTERNAL_CONDVAR_H */ diff --git a/env/Include/internal/context.h b/env/Include/internal/context.h new file mode 100644 index 0000000..59f88f2 --- /dev/null +++ b/env/Include/internal/context.h @@ -0,0 +1,41 @@ +#ifndef Py_INTERNAL_CONTEXT_H +#define Py_INTERNAL_CONTEXT_H + + +#include "internal/hamt.h" + + +struct _pycontextobject { + PyObject_HEAD + PyContext *ctx_prev; + PyHamtObject *ctx_vars; + PyObject *ctx_weakreflist; + int ctx_entered; +}; + + +struct _pycontextvarobject { + PyObject_HEAD + PyObject *var_name; + PyObject *var_default; + PyObject *var_cached; + uint64_t var_cached_tsid; + uint64_t var_cached_tsver; + Py_hash_t var_hash; +}; + + +struct _pycontexttokenobject { + PyObject_HEAD + PyContext *tok_ctx; + PyContextVar *tok_var; + PyObject *tok_oldval; + int tok_used; +}; + + +int _PyContext_Init(void); +void _PyContext_Fini(void); + + +#endif /* !Py_INTERNAL_CONTEXT_H */ diff --git a/env/Include/internal/gil.h b/env/Include/internal/gil.h new file mode 100644 index 0000000..6139bd2 --- /dev/null +++ b/env/Include/internal/gil.h @@ -0,0 +1,46 @@ +#ifndef Py_INTERNAL_GIL_H +#define Py_INTERNAL_GIL_H +#ifdef __cplusplus +extern "C" { +#endif + +#include "pyatomic.h" + +#include "internal/condvar.h" +#ifndef Py_HAVE_CONDVAR +#error You need either a POSIX-compatible or a Windows system! +#endif + +/* Enable if you want to force the switching of threads at least + every `interval`. */ +#undef FORCE_SWITCHING +#define FORCE_SWITCHING + +struct _gil_runtime_state { + /* microseconds (the Python API uses seconds, though) */ + unsigned long interval; + /* Last PyThreadState holding / having held the GIL. This helps us + know whether anyone else was scheduled after we dropped the GIL. */ + _Py_atomic_address last_holder; + /* Whether the GIL is already taken (-1 if uninitialized). This is + atomic because it can be read without any lock taken in ceval.c. */ + _Py_atomic_int locked; + /* Number of GIL switches since the beginning. */ + unsigned long switch_number; + /* This condition variable allows one or several threads to wait + until the GIL is released. In addition, the mutex also protects + the above variables. */ + PyCOND_T cond; + PyMUTEX_T mutex; +#ifdef FORCE_SWITCHING + /* This condition variable helps the GIL-releasing thread wait for + a GIL-awaiting thread to be scheduled and take the GIL. */ + PyCOND_T switch_cond; + PyMUTEX_T switch_mutex; +#endif +}; + +#ifdef __cplusplus +} +#endif +#endif /* !Py_INTERNAL_GIL_H */ diff --git a/env/Include/internal/hamt.h b/env/Include/internal/hamt.h new file mode 100644 index 0000000..29ad28b --- /dev/null +++ b/env/Include/internal/hamt.h @@ -0,0 +1,113 @@ +#ifndef Py_INTERNAL_HAMT_H +#define Py_INTERNAL_HAMT_H + + +#define _Py_HAMT_MAX_TREE_DEPTH 7 + + +#define PyHamt_Check(o) (Py_TYPE(o) == &_PyHamt_Type) + + +/* Abstract tree node. */ +typedef struct { + PyObject_HEAD +} PyHamtNode; + + +/* An HAMT immutable mapping collection. */ +typedef struct { + PyObject_HEAD + PyHamtNode *h_root; + PyObject *h_weakreflist; + Py_ssize_t h_count; +} PyHamtObject; + + +/* A struct to hold the state of depth-first traverse of the tree. + + HAMT is an immutable collection. Iterators will hold a strong reference + to it, and every node in the HAMT has strong references to its children. + + So for iterators, we can implement zero allocations and zero reference + inc/dec depth-first iteration. + + - i_nodes: an array of seven pointers to tree nodes + - i_level: the current node in i_nodes + - i_pos: an array of positions within nodes in i_nodes. +*/ +typedef struct { + PyHamtNode *i_nodes[_Py_HAMT_MAX_TREE_DEPTH]; + Py_ssize_t i_pos[_Py_HAMT_MAX_TREE_DEPTH]; + int8_t i_level; +} PyHamtIteratorState; + + +/* Base iterator object. + + Contains the iteration state, a pointer to the HAMT tree, + and a pointer to the 'yield function'. The latter is a simple + function that returns a key/value tuple for the 'Items' iterator, + just a key for the 'Keys' iterator, and a value for the 'Values' + iterator. +*/ +typedef struct { + PyObject_HEAD + PyHamtObject *hi_obj; + PyHamtIteratorState hi_iter; + binaryfunc hi_yield; +} PyHamtIterator; + + +PyAPI_DATA(PyTypeObject) _PyHamt_Type; +PyAPI_DATA(PyTypeObject) _PyHamt_ArrayNode_Type; +PyAPI_DATA(PyTypeObject) _PyHamt_BitmapNode_Type; +PyAPI_DATA(PyTypeObject) _PyHamt_CollisionNode_Type; +PyAPI_DATA(PyTypeObject) _PyHamtKeys_Type; +PyAPI_DATA(PyTypeObject) _PyHamtValues_Type; +PyAPI_DATA(PyTypeObject) _PyHamtItems_Type; + + +/* Create a new HAMT immutable mapping. */ +PyHamtObject * _PyHamt_New(void); + +/* Return a new collection based on "o", but with an additional + key/val pair. */ +PyHamtObject * _PyHamt_Assoc(PyHamtObject *o, PyObject *key, PyObject *val); + +/* Return a new collection based on "o", but without "key". */ +PyHamtObject * _PyHamt_Without(PyHamtObject *o, PyObject *key); + +/* Find "key" in the "o" collection. + + Return: + - -1: An error occurred. + - 0: "key" wasn't found in "o". + - 1: "key" is in "o"; "*val" is set to its value (a borrowed ref). +*/ +int _PyHamt_Find(PyHamtObject *o, PyObject *key, PyObject **val); + +/* Check if "v" is equal to "w". + + Return: + - 0: v != w + - 1: v == w + - -1: An error occurred. +*/ +int _PyHamt_Eq(PyHamtObject *v, PyHamtObject *w); + +/* Return the size of "o"; equivalent of "len(o)". */ +Py_ssize_t _PyHamt_Len(PyHamtObject *o); + +/* Return a Keys iterator over "o". */ +PyObject * _PyHamt_NewIterKeys(PyHamtObject *o); + +/* Return a Values iterator over "o". */ +PyObject * _PyHamt_NewIterValues(PyHamtObject *o); + +/* Return a Items iterator over "o". */ +PyObject * _PyHamt_NewIterItems(PyHamtObject *o); + +int _PyHamt_Init(void); +void _PyHamt_Fini(void); + +#endif /* !Py_INTERNAL_HAMT_H */ diff --git a/env/Include/internal/hash.h b/env/Include/internal/hash.h new file mode 100644 index 0000000..e14b80a --- /dev/null +++ b/env/Include/internal/hash.h @@ -0,0 +1,6 @@ +#ifndef Py_INTERNAL_HASH_H +#define Py_INTERNAL_HASH_H + +uint64_t _Py_KeyedHash(uint64_t, const char *, Py_ssize_t); + +#endif diff --git a/env/Include/internal/import.h b/env/Include/internal/import.h new file mode 100644 index 0000000..4746e75 --- /dev/null +++ b/env/Include/internal/import.h @@ -0,0 +1,6 @@ +#ifndef Py_INTERNAL_IMPORT_H +#define Py_INTERNAL_IMPORT_H + +extern const char *_Py_CheckHashBasedPycsMode; + +#endif diff --git a/env/Include/internal/mem.h b/env/Include/internal/mem.h new file mode 100644 index 0000000..5896e4a --- /dev/null +++ b/env/Include/internal/mem.h @@ -0,0 +1,175 @@ +#ifndef Py_INTERNAL_MEM_H +#define Py_INTERNAL_MEM_H +#ifdef __cplusplus +extern "C" { +#endif + +#include "objimpl.h" +#include "pymem.h" + + +/* GC runtime state */ + +/* If we change this, we need to change the default value in the + signature of gc.collect. */ +#define NUM_GENERATIONS 3 + +/* + NOTE: about the counting of long-lived objects. + + To limit the cost of garbage collection, there are two strategies; + - make each collection faster, e.g. by scanning fewer objects + - do less collections + This heuristic is about the latter strategy. + + In addition to the various configurable thresholds, we only trigger a + full collection if the ratio + long_lived_pending / long_lived_total + is above a given value (hardwired to 25%). + + The reason is that, while "non-full" collections (i.e., collections of + the young and middle generations) will always examine roughly the same + number of objects -- determined by the aforementioned thresholds --, + the cost of a full collection is proportional to the total number of + long-lived objects, which is virtually unbounded. + + Indeed, it has been remarked that doing a full collection every + of object creations entails a dramatic performance + degradation in workloads which consist in creating and storing lots of + long-lived objects (e.g. building a large list of GC-tracked objects would + show quadratic performance, instead of linear as expected: see issue #4074). + + Using the above ratio, instead, yields amortized linear performance in + the total number of objects (the effect of which can be summarized + thusly: "each full garbage collection is more and more costly as the + number of objects grows, but we do fewer and fewer of them"). + + This heuristic was suggested by Martin von Löwis on python-dev in + June 2008. His original analysis and proposal can be found at: + http://mail.python.org/pipermail/python-dev/2008-June/080579.html +*/ + +/* + NOTE: about untracking of mutable objects. + + Certain types of container cannot participate in a reference cycle, and + so do not need to be tracked by the garbage collector. Untracking these + objects reduces the cost of garbage collections. However, determining + which objects may be untracked is not free, and the costs must be + weighed against the benefits for garbage collection. + + There are two possible strategies for when to untrack a container: + + i) When the container is created. + ii) When the container is examined by the garbage collector. + + Tuples containing only immutable objects (integers, strings etc, and + recursively, tuples of immutable objects) do not need to be tracked. + The interpreter creates a large number of tuples, many of which will + not survive until garbage collection. It is therefore not worthwhile + to untrack eligible tuples at creation time. + + Instead, all tuples except the empty tuple are tracked when created. + During garbage collection it is determined whether any surviving tuples + can be untracked. A tuple can be untracked if all of its contents are + already not tracked. Tuples are examined for untracking in all garbage + collection cycles. It may take more than one cycle to untrack a tuple. + + Dictionaries containing only immutable objects also do not need to be + tracked. Dictionaries are untracked when created. If a tracked item is + inserted into a dictionary (either as a key or value), the dictionary + becomes tracked. During a full garbage collection (all generations), + the collector will untrack any dictionaries whose contents are not + tracked. + + The module provides the python function is_tracked(obj), which returns + the CURRENT tracking status of the object. Subsequent garbage + collections may change the tracking status of the object. + + Untracking of certain containers was introduced in issue #4688, and + the algorithm was refined in response to issue #14775. +*/ + +struct gc_generation { + PyGC_Head head; + int threshold; /* collection threshold */ + int count; /* count of allocations or collections of younger + generations */ +}; + +/* Running stats per generation */ +struct gc_generation_stats { + /* total number of collections */ + Py_ssize_t collections; + /* total number of collected objects */ + Py_ssize_t collected; + /* total number of uncollectable objects (put into gc.garbage) */ + Py_ssize_t uncollectable; +}; + +struct _gc_runtime_state { + /* List of objects that still need to be cleaned up, singly linked + * via their gc headers' gc_prev pointers. */ + PyObject *trash_delete_later; + /* Current call-stack depth of tp_dealloc calls. */ + int trash_delete_nesting; + + int enabled; + int debug; + /* linked lists of container objects */ + struct gc_generation generations[NUM_GENERATIONS]; + PyGC_Head *generation0; + /* a permanent generation which won't be collected */ + struct gc_generation permanent_generation; + struct gc_generation_stats generation_stats[NUM_GENERATIONS]; + /* true if we are currently running the collector */ + int collecting; + /* list of uncollectable objects */ + PyObject *garbage; + /* a list of callbacks to be invoked when collection is performed */ + PyObject *callbacks; + /* This is the number of objects that survived the last full + collection. It approximates the number of long lived objects + tracked by the GC. + + (by "full collection", we mean a collection of the oldest + generation). */ + Py_ssize_t long_lived_total; + /* This is the number of objects that survived all "non-full" + collections, and are awaiting to undergo a full collection for + the first time. */ + Py_ssize_t long_lived_pending; +}; + +PyAPI_FUNC(void) _PyGC_Initialize(struct _gc_runtime_state *); + +#define _PyGC_generation0 _PyRuntime.gc.generation0 + +/* Heuristic checking if a pointer value is newly allocated + (uninitialized) or newly freed. The pointer is not dereferenced, only the + pointer value is checked. + + The heuristic relies on the debug hooks on Python memory allocators which + fills newly allocated memory with CLEANBYTE (0xCD) and newly freed memory + with DEADBYTE (0xDD). Detect also "untouchable bytes" marked + with FORBIDDENBYTE (0xFD). */ +static inline int _PyMem_IsPtrFreed(void *ptr) +{ + uintptr_t value = (uintptr_t)ptr; +#if SIZEOF_VOID_P == 8 + return (value == (uintptr_t)0xCDCDCDCDCDCDCDCD + || value == (uintptr_t)0xDDDDDDDDDDDDDDDD + || value == (uintptr_t)0xFDFDFDFDFDFDFDFD); +#elif SIZEOF_VOID_P == 4 + return (value == (uintptr_t)0xCDCDCDCD + || value == (uintptr_t)0xDDDDDDDD + || value == (uintptr_t)0xFDFDFDFD); +#else +# error "unknown pointer size" +#endif +} + +#ifdef __cplusplus +} +#endif +#endif /* !Py_INTERNAL_MEM_H */ diff --git a/env/Include/internal/pygetopt.h b/env/Include/internal/pygetopt.h new file mode 100644 index 0000000..8ef2ada --- /dev/null +++ b/env/Include/internal/pygetopt.h @@ -0,0 +1,19 @@ +#ifndef Py_INTERNAL_PYGETOPT_H +#define Py_INTERNAL_PYGETOPT_H + +extern int _PyOS_opterr; +extern int _PyOS_optind; +extern wchar_t *_PyOS_optarg; + +extern void _PyOS_ResetGetOpt(void); + +typedef struct { + const wchar_t *name; + int has_arg; + int val; +} _PyOS_LongOption; + +extern int _PyOS_GetOpt(int argc, wchar_t **argv, wchar_t *optstring, + const _PyOS_LongOption *longopts, int *longindex); + +#endif /* !Py_INTERNAL_PYGETOPT_H */ diff --git a/env/Include/internal/pystate.h b/env/Include/internal/pystate.h new file mode 100644 index 0000000..5891339 --- /dev/null +++ b/env/Include/internal/pystate.h @@ -0,0 +1,135 @@ +#ifndef Py_INTERNAL_PYSTATE_H +#define Py_INTERNAL_PYSTATE_H +#ifdef __cplusplus +extern "C" { +#endif + +#include "pystate.h" +#include "pyatomic.h" +#include "pythread.h" + +#include "internal/mem.h" +#include "internal/ceval.h" +#include "internal/warnings.h" + + +/* GIL state */ + +struct _gilstate_runtime_state { + int check_enabled; + /* Assuming the current thread holds the GIL, this is the + PyThreadState for the current thread. */ + _Py_atomic_address tstate_current; + PyThreadFrameGetter getframe; + /* The single PyInterpreterState used by this process' + GILState implementation + */ + /* TODO: Given interp_main, it may be possible to kill this ref */ + PyInterpreterState *autoInterpreterState; + Py_tss_t autoTSSkey; +}; + +/* hook for PyEval_GetFrame(), requested for Psyco */ +#define _PyThreadState_GetFrame _PyRuntime.gilstate.getframe + +/* Issue #26558: Flag to disable PyGILState_Check(). + If set to non-zero, PyGILState_Check() always return 1. */ +#define _PyGILState_check_enabled _PyRuntime.gilstate.check_enabled + + +typedef struct { + /* Full path to the Python program */ + wchar_t *program_full_path; + wchar_t *prefix; +#ifdef MS_WINDOWS + wchar_t *dll_path; +#else + wchar_t *exec_prefix; +#endif + /* Set by Py_SetPath(), or computed by _PyPathConfig_Init() */ + wchar_t *module_search_path; + /* Python program name */ + wchar_t *program_name; + /* Set by Py_SetPythonHome() or PYTHONHOME environment variable */ + wchar_t *home; +} _PyPathConfig; + +#define _PyPathConfig_INIT {.module_search_path = NULL} +/* Note: _PyPathConfig_INIT sets other fields to 0/NULL */ + +PyAPI_DATA(_PyPathConfig) _Py_path_config; + +PyAPI_FUNC(_PyInitError) _PyPathConfig_Calculate( + _PyPathConfig *config, + const _PyCoreConfig *core_config); +PyAPI_FUNC(void) _PyPathConfig_Clear(_PyPathConfig *config); + + +/* interpreter state */ + +PyAPI_FUNC(PyInterpreterState *) _PyInterpreterState_LookUpID(PY_INT64_T); + +PyAPI_FUNC(int) _PyInterpreterState_IDInitref(PyInterpreterState *); +PyAPI_FUNC(void) _PyInterpreterState_IDIncref(PyInterpreterState *); +PyAPI_FUNC(void) _PyInterpreterState_IDDecref(PyInterpreterState *); + +/* Full Python runtime state */ + +typedef struct pyruntimestate { + int initialized; + int core_initialized; + PyThreadState *finalizing; + + struct pyinterpreters { + PyThread_type_lock mutex; + PyInterpreterState *head; + PyInterpreterState *main; + /* _next_interp_id is an auto-numbered sequence of small + integers. It gets initialized in _PyInterpreterState_Init(), + which is called in Py_Initialize(), and used in + PyInterpreterState_New(). A negative interpreter ID + indicates an error occurred. The main interpreter will + always have an ID of 0. Overflow results in a RuntimeError. + If that becomes a problem later then we can adjust, e.g. by + using a Python int. */ + int64_t next_id; + } interpreters; + +#define NEXITFUNCS 32 + void (*exitfuncs[NEXITFUNCS])(void); + int nexitfuncs; + + struct _gc_runtime_state gc; + struct _warnings_runtime_state warnings; + struct _ceval_runtime_state ceval; + struct _gilstate_runtime_state gilstate; + + // XXX Consolidate globals found via the check-c-globals script. +} _PyRuntimeState; + +#define _PyRuntimeState_INIT {.initialized = 0, .core_initialized = 0} +/* Note: _PyRuntimeState_INIT sets other fields to 0/NULL */ + +PyAPI_DATA(_PyRuntimeState) _PyRuntime; +PyAPI_FUNC(_PyInitError) _PyRuntimeState_Init(_PyRuntimeState *); +PyAPI_FUNC(void) _PyRuntimeState_Fini(_PyRuntimeState *); + +/* Initialize _PyRuntimeState. + Return NULL on success, or return an error message on failure. */ +PyAPI_FUNC(_PyInitError) _PyRuntime_Initialize(void); + +PyAPI_FUNC(void) _PyRuntime_Finalize(void); + + +#define _Py_CURRENTLY_FINALIZING(tstate) \ + (_PyRuntime.finalizing == tstate) + + +/* Other */ + +PyAPI_FUNC(_PyInitError) _PyInterpreterState_Enable(_PyRuntimeState *); + +#ifdef __cplusplus +} +#endif +#endif /* !Py_INTERNAL_PYSTATE_H */ diff --git a/env/Include/internal/warnings.h b/env/Include/internal/warnings.h new file mode 100644 index 0000000..2878a28 --- /dev/null +++ b/env/Include/internal/warnings.h @@ -0,0 +1,21 @@ +#ifndef Py_INTERNAL_WARNINGS_H +#define Py_INTERNAL_WARNINGS_H +#ifdef __cplusplus +extern "C" { +#endif + +#include "object.h" + +struct _warnings_runtime_state { + /* Both 'filters' and 'onceregistry' can be set in warnings.py; + get_warnings_attr() will reset these variables accordingly. */ + PyObject *filters; /* List */ + PyObject *once_registry; /* Dict */ + PyObject *default_action; /* String */ + long filters_version; +}; + +#ifdef __cplusplus +} +#endif +#endif /* !Py_INTERNAL_WARNINGS_H */ diff --git a/env/Include/intrcheck.h b/env/Include/intrcheck.h new file mode 100644 index 0000000..2e17336 --- /dev/null +++ b/env/Include/intrcheck.h @@ -0,0 +1,33 @@ + +#ifndef Py_INTRCHECK_H +#define Py_INTRCHECK_H +#ifdef __cplusplus +extern "C" { +#endif + +PyAPI_FUNC(int) PyOS_InterruptOccurred(void); +PyAPI_FUNC(void) PyOS_InitInterrupts(void); +#ifdef HAVE_FORK +#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03070000 +PyAPI_FUNC(void) PyOS_BeforeFork(void); +PyAPI_FUNC(void) PyOS_AfterFork_Parent(void); +PyAPI_FUNC(void) PyOS_AfterFork_Child(void); +#endif +#endif +/* Deprecated, please use PyOS_AfterFork_Child() instead */ +PyAPI_FUNC(void) PyOS_AfterFork(void) Py_DEPRECATED(3.7); + +#ifndef Py_LIMITED_API +PyAPI_FUNC(int) _PyOS_IsMainThread(void); +PyAPI_FUNC(void) _PySignal_AfterFork(void); + +#ifdef MS_WINDOWS +/* windows.h is not included by Python.h so use void* instead of HANDLE */ +PyAPI_FUNC(void*) _PyOS_SigintEvent(void); +#endif +#endif /* !Py_LIMITED_API */ + +#ifdef __cplusplus +} +#endif +#endif /* !Py_INTRCHECK_H */ diff --git a/env/Include/iterobject.h b/env/Include/iterobject.h new file mode 100644 index 0000000..f61726f --- /dev/null +++ b/env/Include/iterobject.h @@ -0,0 +1,25 @@ +#ifndef Py_ITEROBJECT_H +#define Py_ITEROBJECT_H +/* Iterators (the basic kind, over a sequence) */ +#ifdef __cplusplus +extern "C" { +#endif + +PyAPI_DATA(PyTypeObject) PySeqIter_Type; +PyAPI_DATA(PyTypeObject) PyCallIter_Type; +PyAPI_DATA(PyTypeObject) PyCmpWrapper_Type; + +#define PySeqIter_Check(op) (Py_TYPE(op) == &PySeqIter_Type) + +PyAPI_FUNC(PyObject *) PySeqIter_New(PyObject *); + + +#define PyCallIter_Check(op) (Py_TYPE(op) == &PyCallIter_Type) + +PyAPI_FUNC(PyObject *) PyCallIter_New(PyObject *, PyObject *); + +#ifdef __cplusplus +} +#endif +#endif /* !Py_ITEROBJECT_H */ + diff --git a/env/Include/listobject.h b/env/Include/listobject.h new file mode 100644 index 0000000..6057279 --- /dev/null +++ b/env/Include/listobject.h @@ -0,0 +1,81 @@ + +/* List object interface */ + +/* +Another generally useful object type is a list of object pointers. +This is a mutable type: the list items can be changed, and items can be +added or removed. Out-of-range indices or non-list objects are ignored. + +*** WARNING *** PyList_SetItem does not increment the new item's reference +count, but does decrement the reference count of the item it replaces, +if not nil. It does *decrement* the reference count if it is *not* +inserted in the list. Similarly, PyList_GetItem does not increment the +returned item's reference count. +*/ + +#ifndef Py_LISTOBJECT_H +#define Py_LISTOBJECT_H +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef Py_LIMITED_API +typedef struct { + PyObject_VAR_HEAD + /* Vector of pointers to list elements. list[0] is ob_item[0], etc. */ + PyObject **ob_item; + + /* ob_item contains space for 'allocated' elements. The number + * currently in use is ob_size. + * Invariants: + * 0 <= ob_size <= allocated + * len(list) == ob_size + * ob_item == NULL implies ob_size == allocated == 0 + * list.sort() temporarily sets allocated to -1 to detect mutations. + * + * Items must normally not be NULL, except during construction when + * the list is not yet visible outside the function that builds it. + */ + Py_ssize_t allocated; +} PyListObject; +#endif + +PyAPI_DATA(PyTypeObject) PyList_Type; +PyAPI_DATA(PyTypeObject) PyListIter_Type; +PyAPI_DATA(PyTypeObject) PyListRevIter_Type; +PyAPI_DATA(PyTypeObject) PySortWrapper_Type; + +#define PyList_Check(op) \ + PyType_FastSubclass(Py_TYPE(op), Py_TPFLAGS_LIST_SUBCLASS) +#define PyList_CheckExact(op) (Py_TYPE(op) == &PyList_Type) + +PyAPI_FUNC(PyObject *) PyList_New(Py_ssize_t size); +PyAPI_FUNC(Py_ssize_t) PyList_Size(PyObject *); +PyAPI_FUNC(PyObject *) PyList_GetItem(PyObject *, Py_ssize_t); +PyAPI_FUNC(int) PyList_SetItem(PyObject *, Py_ssize_t, PyObject *); +PyAPI_FUNC(int) PyList_Insert(PyObject *, Py_ssize_t, PyObject *); +PyAPI_FUNC(int) PyList_Append(PyObject *, PyObject *); +PyAPI_FUNC(PyObject *) PyList_GetSlice(PyObject *, Py_ssize_t, Py_ssize_t); +PyAPI_FUNC(int) PyList_SetSlice(PyObject *, Py_ssize_t, Py_ssize_t, PyObject *); +PyAPI_FUNC(int) PyList_Sort(PyObject *); +PyAPI_FUNC(int) PyList_Reverse(PyObject *); +PyAPI_FUNC(PyObject *) PyList_AsTuple(PyObject *); +#ifndef Py_LIMITED_API +PyAPI_FUNC(PyObject *) _PyList_Extend(PyListObject *, PyObject *); + +PyAPI_FUNC(int) PyList_ClearFreeList(void); +PyAPI_FUNC(void) _PyList_DebugMallocStats(FILE *out); +#endif + +/* Macro, trading safety for speed */ +#ifndef Py_LIMITED_API +#define PyList_GET_ITEM(op, i) (((PyListObject *)(op))->ob_item[i]) +#define PyList_SET_ITEM(op, i, v) (((PyListObject *)(op))->ob_item[i] = (v)) +#define PyList_GET_SIZE(op) (assert(PyList_Check(op)),Py_SIZE(op)) +#define _PyList_ITEMS(op) (((PyListObject *)(op))->ob_item) +#endif + +#ifdef __cplusplus +} +#endif +#endif /* !Py_LISTOBJECT_H */ diff --git a/env/Include/longintrepr.h b/env/Include/longintrepr.h new file mode 100644 index 0000000..ff4155f --- /dev/null +++ b/env/Include/longintrepr.h @@ -0,0 +1,99 @@ +#ifndef Py_LIMITED_API +#ifndef Py_LONGINTREPR_H +#define Py_LONGINTREPR_H +#ifdef __cplusplus +extern "C" { +#endif + + +/* This is published for the benefit of "friends" marshal.c and _decimal.c. */ + +/* Parameters of the integer representation. There are two different + sets of parameters: one set for 30-bit digits, stored in an unsigned 32-bit + integer type, and one set for 15-bit digits with each digit stored in an + unsigned short. The value of PYLONG_BITS_IN_DIGIT, defined either at + configure time or in pyport.h, is used to decide which digit size to use. + + Type 'digit' should be able to hold 2*PyLong_BASE-1, and type 'twodigits' + should be an unsigned integer type able to hold all integers up to + PyLong_BASE*PyLong_BASE-1. x_sub assumes that 'digit' is an unsigned type, + and that overflow is handled by taking the result modulo 2**N for some N > + PyLong_SHIFT. The majority of the code doesn't care about the precise + value of PyLong_SHIFT, but there are some notable exceptions: + + - long_pow() requires that PyLong_SHIFT be divisible by 5 + + - PyLong_{As,From}ByteArray require that PyLong_SHIFT be at least 8 + + - long_hash() requires that PyLong_SHIFT is *strictly* less than the number + of bits in an unsigned long, as do the PyLong <-> long (or unsigned long) + conversion functions + + - the Python int <-> size_t/Py_ssize_t conversion functions expect that + PyLong_SHIFT is strictly less than the number of bits in a size_t + + - the marshal code currently expects that PyLong_SHIFT is a multiple of 15 + + - NSMALLNEGINTS and NSMALLPOSINTS should be small enough to fit in a single + digit; with the current values this forces PyLong_SHIFT >= 9 + + The values 15 and 30 should fit all of the above requirements, on any + platform. +*/ + +#if PYLONG_BITS_IN_DIGIT == 30 +typedef uint32_t digit; +typedef int32_t sdigit; /* signed variant of digit */ +typedef uint64_t twodigits; +typedef int64_t stwodigits; /* signed variant of twodigits */ +#define PyLong_SHIFT 30 +#define _PyLong_DECIMAL_SHIFT 9 /* max(e such that 10**e fits in a digit) */ +#define _PyLong_DECIMAL_BASE ((digit)1000000000) /* 10 ** DECIMAL_SHIFT */ +#elif PYLONG_BITS_IN_DIGIT == 15 +typedef unsigned short digit; +typedef short sdigit; /* signed variant of digit */ +typedef unsigned long twodigits; +typedef long stwodigits; /* signed variant of twodigits */ +#define PyLong_SHIFT 15 +#define _PyLong_DECIMAL_SHIFT 4 /* max(e such that 10**e fits in a digit) */ +#define _PyLong_DECIMAL_BASE ((digit)10000) /* 10 ** DECIMAL_SHIFT */ +#else +#error "PYLONG_BITS_IN_DIGIT should be 15 or 30" +#endif +#define PyLong_BASE ((digit)1 << PyLong_SHIFT) +#define PyLong_MASK ((digit)(PyLong_BASE - 1)) + +#if PyLong_SHIFT % 5 != 0 +#error "longobject.c requires that PyLong_SHIFT be divisible by 5" +#endif + +/* Long integer representation. + The absolute value of a number is equal to + SUM(for i=0 through abs(ob_size)-1) ob_digit[i] * 2**(SHIFT*i) + Negative numbers are represented with ob_size < 0; + zero is represented by ob_size == 0. + In a normalized number, ob_digit[abs(ob_size)-1] (the most significant + digit) is never zero. Also, in all cases, for all valid i, + 0 <= ob_digit[i] <= MASK. + The allocation function takes care of allocating extra memory + so that ob_digit[0] ... ob_digit[abs(ob_size)-1] are actually available. + + CAUTION: Generic code manipulating subtypes of PyVarObject has to + aware that ints abuse ob_size's sign bit. +*/ + +struct _longobject { + PyObject_VAR_HEAD + digit ob_digit[1]; +}; + +PyAPI_FUNC(PyLongObject *) _PyLong_New(Py_ssize_t); + +/* Return a copy of src. */ +PyAPI_FUNC(PyObject *) _PyLong_Copy(PyLongObject *src); + +#ifdef __cplusplus +} +#endif +#endif /* !Py_LONGINTREPR_H */ +#endif /* Py_LIMITED_API */ diff --git a/env/Include/longobject.h b/env/Include/longobject.h new file mode 100644 index 0000000..7bdd047 --- /dev/null +++ b/env/Include/longobject.h @@ -0,0 +1,220 @@ +#ifndef Py_LONGOBJECT_H +#define Py_LONGOBJECT_H +#ifdef __cplusplus +extern "C" { +#endif + + +/* Long (arbitrary precision) integer object interface */ + +typedef struct _longobject PyLongObject; /* Revealed in longintrepr.h */ + +PyAPI_DATA(PyTypeObject) PyLong_Type; + +#define PyLong_Check(op) \ + PyType_FastSubclass(Py_TYPE(op), Py_TPFLAGS_LONG_SUBCLASS) +#define PyLong_CheckExact(op) (Py_TYPE(op) == &PyLong_Type) + +PyAPI_FUNC(PyObject *) PyLong_FromLong(long); +PyAPI_FUNC(PyObject *) PyLong_FromUnsignedLong(unsigned long); +PyAPI_FUNC(PyObject *) PyLong_FromSize_t(size_t); +PyAPI_FUNC(PyObject *) PyLong_FromSsize_t(Py_ssize_t); +PyAPI_FUNC(PyObject *) PyLong_FromDouble(double); +PyAPI_FUNC(long) PyLong_AsLong(PyObject *); +PyAPI_FUNC(long) PyLong_AsLongAndOverflow(PyObject *, int *); +PyAPI_FUNC(Py_ssize_t) PyLong_AsSsize_t(PyObject *); +PyAPI_FUNC(size_t) PyLong_AsSize_t(PyObject *); +PyAPI_FUNC(unsigned long) PyLong_AsUnsignedLong(PyObject *); +PyAPI_FUNC(unsigned long) PyLong_AsUnsignedLongMask(PyObject *); +#ifndef Py_LIMITED_API +PyAPI_FUNC(int) _PyLong_AsInt(PyObject *); +#endif +PyAPI_FUNC(PyObject *) PyLong_GetInfo(void); + +/* It may be useful in the future. I've added it in the PyInt -> PyLong + cleanup to keep the extra information. [CH] */ +#define PyLong_AS_LONG(op) PyLong_AsLong(op) + +/* Issue #1983: pid_t can be longer than a C long on some systems */ +#if !defined(SIZEOF_PID_T) || SIZEOF_PID_T == SIZEOF_INT +#define _Py_PARSE_PID "i" +#define PyLong_FromPid PyLong_FromLong +#define PyLong_AsPid PyLong_AsLong +#elif SIZEOF_PID_T == SIZEOF_LONG +#define _Py_PARSE_PID "l" +#define PyLong_FromPid PyLong_FromLong +#define PyLong_AsPid PyLong_AsLong +#elif defined(SIZEOF_LONG_LONG) && SIZEOF_PID_T == SIZEOF_LONG_LONG +#define _Py_PARSE_PID "L" +#define PyLong_FromPid PyLong_FromLongLong +#define PyLong_AsPid PyLong_AsLongLong +#else +#error "sizeof(pid_t) is neither sizeof(int), sizeof(long) or sizeof(long long)" +#endif /* SIZEOF_PID_T */ + +#if SIZEOF_VOID_P == SIZEOF_INT +# define _Py_PARSE_INTPTR "i" +# define _Py_PARSE_UINTPTR "I" +#elif SIZEOF_VOID_P == SIZEOF_LONG +# define _Py_PARSE_INTPTR "l" +# define _Py_PARSE_UINTPTR "k" +#elif defined(SIZEOF_LONG_LONG) && SIZEOF_VOID_P == SIZEOF_LONG_LONG +# define _Py_PARSE_INTPTR "L" +# define _Py_PARSE_UINTPTR "K" +#else +# error "void* different in size from int, long and long long" +#endif /* SIZEOF_VOID_P */ + +/* Used by Python/mystrtoul.c, _PyBytes_FromHex(), + _PyBytes_DecodeEscapeRecode(), etc. */ +#ifndef Py_LIMITED_API +PyAPI_DATA(unsigned char) _PyLong_DigitValue[256]; +#endif + +/* _PyLong_Frexp returns a double x and an exponent e such that the + true value is approximately equal to x * 2**e. e is >= 0. x is + 0.0 if and only if the input is 0 (in which case, e and x are both + zeroes); otherwise, 0.5 <= abs(x) < 1.0. On overflow, which is + possible if the number of bits doesn't fit into a Py_ssize_t, sets + OverflowError and returns -1.0 for x, 0 for e. */ +#ifndef Py_LIMITED_API +PyAPI_FUNC(double) _PyLong_Frexp(PyLongObject *a, Py_ssize_t *e); +#endif + +PyAPI_FUNC(double) PyLong_AsDouble(PyObject *); +PyAPI_FUNC(PyObject *) PyLong_FromVoidPtr(void *); +PyAPI_FUNC(void *) PyLong_AsVoidPtr(PyObject *); + +PyAPI_FUNC(PyObject *) PyLong_FromLongLong(long long); +PyAPI_FUNC(PyObject *) PyLong_FromUnsignedLongLong(unsigned long long); +PyAPI_FUNC(long long) PyLong_AsLongLong(PyObject *); +PyAPI_FUNC(unsigned long long) PyLong_AsUnsignedLongLong(PyObject *); +PyAPI_FUNC(unsigned long long) PyLong_AsUnsignedLongLongMask(PyObject *); +PyAPI_FUNC(long long) PyLong_AsLongLongAndOverflow(PyObject *, int *); + +PyAPI_FUNC(PyObject *) PyLong_FromString(const char *, char **, int); +#ifndef Py_LIMITED_API +PyAPI_FUNC(PyObject *) PyLong_FromUnicode(Py_UNICODE*, Py_ssize_t, int) Py_DEPRECATED(3.3); +PyAPI_FUNC(PyObject *) PyLong_FromUnicodeObject(PyObject *u, int base); +PyAPI_FUNC(PyObject *) _PyLong_FromBytes(const char *, Py_ssize_t, int); +#endif + +#ifndef Py_LIMITED_API +/* _PyLong_Sign. Return 0 if v is 0, -1 if v < 0, +1 if v > 0. + v must not be NULL, and must be a normalized long. + There are no error cases. +*/ +PyAPI_FUNC(int) _PyLong_Sign(PyObject *v); + + +/* _PyLong_NumBits. Return the number of bits needed to represent the + absolute value of a long. For example, this returns 1 for 1 and -1, 2 + for 2 and -2, and 2 for 3 and -3. It returns 0 for 0. + v must not be NULL, and must be a normalized long. + (size_t)-1 is returned and OverflowError set if the true result doesn't + fit in a size_t. +*/ +PyAPI_FUNC(size_t) _PyLong_NumBits(PyObject *v); + +/* _PyLong_DivmodNear. Given integers a and b, compute the nearest + integer q to the exact quotient a / b, rounding to the nearest even integer + in the case of a tie. Return (q, r), where r = a - q*b. The remainder r + will satisfy abs(r) <= abs(b)/2, with equality possible only if q is + even. +*/ +PyAPI_FUNC(PyObject *) _PyLong_DivmodNear(PyObject *, PyObject *); + +/* _PyLong_FromByteArray: View the n unsigned bytes as a binary integer in + base 256, and return a Python int with the same numeric value. + If n is 0, the integer is 0. Else: + If little_endian is 1/true, bytes[n-1] is the MSB and bytes[0] the LSB; + else (little_endian is 0/false) bytes[0] is the MSB and bytes[n-1] the + LSB. + If is_signed is 0/false, view the bytes as a non-negative integer. + If is_signed is 1/true, view the bytes as a 2's-complement integer, + non-negative if bit 0x80 of the MSB is clear, negative if set. + Error returns: + + Return NULL with the appropriate exception set if there's not + enough memory to create the Python int. +*/ +PyAPI_FUNC(PyObject *) _PyLong_FromByteArray( + const unsigned char* bytes, size_t n, + int little_endian, int is_signed); + +/* _PyLong_AsByteArray: Convert the least-significant 8*n bits of long + v to a base-256 integer, stored in array bytes. Normally return 0, + return -1 on error. + If little_endian is 1/true, store the MSB at bytes[n-1] and the LSB at + bytes[0]; else (little_endian is 0/false) store the MSB at bytes[0] and + the LSB at bytes[n-1]. + If is_signed is 0/false, it's an error if v < 0; else (v >= 0) n bytes + are filled and there's nothing special about bit 0x80 of the MSB. + If is_signed is 1/true, bytes is filled with the 2's-complement + representation of v's value. Bit 0x80 of the MSB is the sign bit. + Error returns (-1): + + is_signed is 0 and v < 0. TypeError is set in this case, and bytes + isn't altered. + + n isn't big enough to hold the full mathematical value of v. For + example, if is_signed is 0 and there are more digits in the v than + fit in n; or if is_signed is 1, v < 0, and n is just 1 bit shy of + being large enough to hold a sign bit. OverflowError is set in this + case, but bytes holds the least-significant n bytes of the true value. +*/ +PyAPI_FUNC(int) _PyLong_AsByteArray(PyLongObject* v, + unsigned char* bytes, size_t n, + int little_endian, int is_signed); + +/* _PyLong_FromNbInt: Convert the given object to a PyLongObject + using the nb_int slot, if available. Raise TypeError if either the + nb_int slot is not available or the result of the call to nb_int + returns something not of type int. +*/ +PyAPI_FUNC(PyLongObject *)_PyLong_FromNbInt(PyObject *); + +/* _PyLong_Format: Convert the long to a string object with given base, + appending a base prefix of 0[box] if base is 2, 8 or 16. */ +PyAPI_FUNC(PyObject *) _PyLong_Format(PyObject *obj, int base); + +PyAPI_FUNC(int) _PyLong_FormatWriter( + _PyUnicodeWriter *writer, + PyObject *obj, + int base, + int alternate); + +PyAPI_FUNC(char*) _PyLong_FormatBytesWriter( + _PyBytesWriter *writer, + char *str, + PyObject *obj, + int base, + int alternate); + +/* Format the object based on the format_spec, as defined in PEP 3101 + (Advanced String Formatting). */ +PyAPI_FUNC(int) _PyLong_FormatAdvancedWriter( + _PyUnicodeWriter *writer, + PyObject *obj, + PyObject *format_spec, + Py_ssize_t start, + Py_ssize_t end); +#endif /* Py_LIMITED_API */ + +/* These aren't really part of the int object, but they're handy. The + functions are in Python/mystrtoul.c. + */ +PyAPI_FUNC(unsigned long) PyOS_strtoul(const char *, char **, int); +PyAPI_FUNC(long) PyOS_strtol(const char *, char **, int); + +#ifndef Py_LIMITED_API +/* For use by the gcd function in mathmodule.c */ +PyAPI_FUNC(PyObject *) _PyLong_GCD(PyObject *, PyObject *); +#endif /* !Py_LIMITED_API */ + +#ifndef Py_LIMITED_API +PyAPI_DATA(PyObject *) _PyLong_Zero; +PyAPI_DATA(PyObject *) _PyLong_One; +#endif + +#ifdef __cplusplus +} +#endif +#endif /* !Py_LONGOBJECT_H */ diff --git a/env/Include/marshal.h b/env/Include/marshal.h new file mode 100644 index 0000000..09d9337 --- /dev/null +++ b/env/Include/marshal.h @@ -0,0 +1,28 @@ + +/* Interface for marshal.c */ + +#ifndef Py_MARSHAL_H +#define Py_MARSHAL_H +#ifdef __cplusplus +extern "C" { +#endif + +#define Py_MARSHAL_VERSION 4 + +PyAPI_FUNC(void) PyMarshal_WriteLongToFile(long, FILE *, int); +PyAPI_FUNC(void) PyMarshal_WriteObjectToFile(PyObject *, FILE *, int); +PyAPI_FUNC(PyObject *) PyMarshal_WriteObjectToString(PyObject *, int); + +#ifndef Py_LIMITED_API +PyAPI_FUNC(long) PyMarshal_ReadLongFromFile(FILE *); +PyAPI_FUNC(int) PyMarshal_ReadShortFromFile(FILE *); +PyAPI_FUNC(PyObject *) PyMarshal_ReadObjectFromFile(FILE *); +PyAPI_FUNC(PyObject *) PyMarshal_ReadLastObjectFromFile(FILE *); +#endif +PyAPI_FUNC(PyObject *) PyMarshal_ReadObjectFromString(const char *, + Py_ssize_t); + +#ifdef __cplusplus +} +#endif +#endif /* !Py_MARSHAL_H */ diff --git a/env/Include/memoryobject.h b/env/Include/memoryobject.h new file mode 100644 index 0000000..990a716 --- /dev/null +++ b/env/Include/memoryobject.h @@ -0,0 +1,72 @@ +/* Memory view object. In Python this is available as "memoryview". */ + +#ifndef Py_MEMORYOBJECT_H +#define Py_MEMORYOBJECT_H +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef Py_LIMITED_API +PyAPI_DATA(PyTypeObject) _PyManagedBuffer_Type; +#endif +PyAPI_DATA(PyTypeObject) PyMemoryView_Type; + +#define PyMemoryView_Check(op) (Py_TYPE(op) == &PyMemoryView_Type) + +#ifndef Py_LIMITED_API +/* Get a pointer to the memoryview's private copy of the exporter's buffer. */ +#define PyMemoryView_GET_BUFFER(op) (&((PyMemoryViewObject *)(op))->view) +/* Get a pointer to the exporting object (this may be NULL!). */ +#define PyMemoryView_GET_BASE(op) (((PyMemoryViewObject *)(op))->view.obj) +#endif + +PyAPI_FUNC(PyObject *) PyMemoryView_FromObject(PyObject *base); +#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03030000 +PyAPI_FUNC(PyObject *) PyMemoryView_FromMemory(char *mem, Py_ssize_t size, + int flags); +#endif +#ifndef Py_LIMITED_API +PyAPI_FUNC(PyObject *) PyMemoryView_FromBuffer(Py_buffer *info); +#endif +PyAPI_FUNC(PyObject *) PyMemoryView_GetContiguous(PyObject *base, + int buffertype, + char order); + + +/* The structs are declared here so that macros can work, but they shouldn't + be considered public. Don't access their fields directly, use the macros + and functions instead! */ +#ifndef Py_LIMITED_API +#define _Py_MANAGED_BUFFER_RELEASED 0x001 /* access to exporter blocked */ +#define _Py_MANAGED_BUFFER_FREE_FORMAT 0x002 /* free format */ +typedef struct { + PyObject_HEAD + int flags; /* state flags */ + Py_ssize_t exports; /* number of direct memoryview exports */ + Py_buffer master; /* snapshot buffer obtained from the original exporter */ +} _PyManagedBufferObject; + + +/* memoryview state flags */ +#define _Py_MEMORYVIEW_RELEASED 0x001 /* access to master buffer blocked */ +#define _Py_MEMORYVIEW_C 0x002 /* C-contiguous layout */ +#define _Py_MEMORYVIEW_FORTRAN 0x004 /* Fortran contiguous layout */ +#define _Py_MEMORYVIEW_SCALAR 0x008 /* scalar: ndim = 0 */ +#define _Py_MEMORYVIEW_PIL 0x010 /* PIL-style layout */ + +typedef struct { + PyObject_VAR_HEAD + _PyManagedBufferObject *mbuf; /* managed buffer */ + Py_hash_t hash; /* hash value for read-only views */ + int flags; /* state flags */ + Py_ssize_t exports; /* number of buffer re-exports */ + Py_buffer view; /* private copy of the exporter's view */ + PyObject *weakreflist; + Py_ssize_t ob_array[1]; /* shape, strides, suboffsets */ +} PyMemoryViewObject; +#endif + +#ifdef __cplusplus +} +#endif +#endif /* !Py_MEMORYOBJECT_H */ diff --git a/env/Include/metagrammar.h b/env/Include/metagrammar.h new file mode 100644 index 0000000..15c8ef8 --- /dev/null +++ b/env/Include/metagrammar.h @@ -0,0 +1,18 @@ +#ifndef Py_METAGRAMMAR_H +#define Py_METAGRAMMAR_H +#ifdef __cplusplus +extern "C" { +#endif + + +#define MSTART 256 +#define RULE 257 +#define RHS 258 +#define ALT 259 +#define ITEM 260 +#define ATOM 261 + +#ifdef __cplusplus +} +#endif +#endif /* !Py_METAGRAMMAR_H */ diff --git a/env/Include/methodobject.h b/env/Include/methodobject.h new file mode 100644 index 0000000..ea35d86 --- /dev/null +++ b/env/Include/methodobject.h @@ -0,0 +1,135 @@ + +/* Method object interface */ + +#ifndef Py_METHODOBJECT_H +#define Py_METHODOBJECT_H +#ifdef __cplusplus +extern "C" { +#endif + +/* This is about the type 'builtin_function_or_method', + not Python methods in user-defined classes. See classobject.h + for the latter. */ + +PyAPI_DATA(PyTypeObject) PyCFunction_Type; + +#define PyCFunction_Check(op) (Py_TYPE(op) == &PyCFunction_Type) + +typedef PyObject *(*PyCFunction)(PyObject *, PyObject *); +typedef PyObject *(*_PyCFunctionFast) (PyObject *, PyObject *const *, Py_ssize_t); +typedef PyObject *(*PyCFunctionWithKeywords)(PyObject *, PyObject *, + PyObject *); +typedef PyObject *(*_PyCFunctionFastWithKeywords) (PyObject *, + PyObject *const *, Py_ssize_t, + PyObject *); +typedef PyObject *(*PyNoArgsFunction)(PyObject *); + +PyAPI_FUNC(PyCFunction) PyCFunction_GetFunction(PyObject *); +PyAPI_FUNC(PyObject *) PyCFunction_GetSelf(PyObject *); +PyAPI_FUNC(int) PyCFunction_GetFlags(PyObject *); + +/* Macros for direct access to these values. Type checks are *not* + done, so use with care. */ +#ifndef Py_LIMITED_API +#define PyCFunction_GET_FUNCTION(func) \ + (((PyCFunctionObject *)func) -> m_ml -> ml_meth) +#define PyCFunction_GET_SELF(func) \ + (((PyCFunctionObject *)func) -> m_ml -> ml_flags & METH_STATIC ? \ + NULL : ((PyCFunctionObject *)func) -> m_self) +#define PyCFunction_GET_FLAGS(func) \ + (((PyCFunctionObject *)func) -> m_ml -> ml_flags) +#endif +PyAPI_FUNC(PyObject *) PyCFunction_Call(PyObject *, PyObject *, PyObject *); + +#ifndef Py_LIMITED_API +PyAPI_FUNC(PyObject *) _PyCFunction_FastCallDict(PyObject *func, + PyObject *const *args, + Py_ssize_t nargs, + PyObject *kwargs); + +PyAPI_FUNC(PyObject *) _PyCFunction_FastCallKeywords(PyObject *func, + PyObject *const *stack, + Py_ssize_t nargs, + PyObject *kwnames); +#endif + +struct PyMethodDef { + const char *ml_name; /* The name of the built-in function/method */ + PyCFunction ml_meth; /* The C function that implements it */ + int ml_flags; /* Combination of METH_xxx flags, which mostly + describe the args expected by the C func */ + const char *ml_doc; /* The __doc__ attribute, or NULL */ +}; +typedef struct PyMethodDef PyMethodDef; + +#define PyCFunction_New(ML, SELF) PyCFunction_NewEx((ML), (SELF), NULL) +PyAPI_FUNC(PyObject *) PyCFunction_NewEx(PyMethodDef *, PyObject *, + PyObject *); + +/* Flag passed to newmethodobject */ +/* #define METH_OLDARGS 0x0000 -- unsupported now */ +#define METH_VARARGS 0x0001 +#define METH_KEYWORDS 0x0002 +/* METH_NOARGS and METH_O must not be combined with the flags above. */ +#define METH_NOARGS 0x0004 +#define METH_O 0x0008 + +/* METH_CLASS and METH_STATIC are a little different; these control + the construction of methods for a class. These cannot be used for + functions in modules. */ +#define METH_CLASS 0x0010 +#define METH_STATIC 0x0020 + +/* METH_COEXIST allows a method to be entered even though a slot has + already filled the entry. When defined, the flag allows a separate + method, "__contains__" for example, to coexist with a defined + slot like sq_contains. */ + +#define METH_COEXIST 0x0040 + +#ifndef Py_LIMITED_API +#define METH_FASTCALL 0x0080 +#endif + +/* This bit is preserved for Stackless Python */ +#ifdef STACKLESS +#define METH_STACKLESS 0x0100 +#else +#define METH_STACKLESS 0x0000 +#endif + +#ifndef Py_LIMITED_API +typedef struct { + PyObject_HEAD + PyMethodDef *m_ml; /* Description of the C function to call */ + PyObject *m_self; /* Passed as 'self' arg to the C func, can be NULL */ + PyObject *m_module; /* The __module__ attribute, can be anything */ + PyObject *m_weakreflist; /* List of weak references */ +} PyCFunctionObject; + +PyAPI_FUNC(PyObject *) _PyMethodDef_RawFastCallDict( + PyMethodDef *method, + PyObject *self, + PyObject *const *args, + Py_ssize_t nargs, + PyObject *kwargs); + +PyAPI_FUNC(PyObject *) _PyMethodDef_RawFastCallKeywords( + PyMethodDef *method, + PyObject *self, + PyObject *const *args, + Py_ssize_t nargs, + PyObject *kwnames); +#endif + +PyAPI_FUNC(int) PyCFunction_ClearFreeList(void); + +#ifndef Py_LIMITED_API +PyAPI_FUNC(void) _PyCFunction_DebugMallocStats(FILE *out); +PyAPI_FUNC(void) _PyMethod_DebugMallocStats(FILE *out); +#endif + +#ifdef __cplusplus +} +#endif +#endif /* !Py_METHODOBJECT_H */ diff --git a/env/Include/modsupport.h b/env/Include/modsupport.h new file mode 100644 index 0000000..a238bef --- /dev/null +++ b/env/Include/modsupport.h @@ -0,0 +1,229 @@ + +#ifndef Py_MODSUPPORT_H +#define Py_MODSUPPORT_H +#ifdef __cplusplus +extern "C" { +#endif + +/* Module support interface */ + +#include + +/* If PY_SSIZE_T_CLEAN is defined, each functions treats #-specifier + to mean Py_ssize_t */ +#ifdef PY_SSIZE_T_CLEAN +#define PyArg_Parse _PyArg_Parse_SizeT +#define PyArg_ParseTuple _PyArg_ParseTuple_SizeT +#define PyArg_ParseTupleAndKeywords _PyArg_ParseTupleAndKeywords_SizeT +#define PyArg_VaParse _PyArg_VaParse_SizeT +#define PyArg_VaParseTupleAndKeywords _PyArg_VaParseTupleAndKeywords_SizeT +#define Py_BuildValue _Py_BuildValue_SizeT +#define Py_VaBuildValue _Py_VaBuildValue_SizeT +#ifndef Py_LIMITED_API +#define _Py_VaBuildStack _Py_VaBuildStack_SizeT +#endif +#else +#ifndef Py_LIMITED_API +PyAPI_FUNC(PyObject *) _Py_VaBuildValue_SizeT(const char *, va_list); +PyAPI_FUNC(PyObject **) _Py_VaBuildStack_SizeT( + PyObject **small_stack, + Py_ssize_t small_stack_len, + const char *format, + va_list va, + Py_ssize_t *p_nargs); +#endif /* !Py_LIMITED_API */ +#endif + +/* Due to a glitch in 3.2, the _SizeT versions weren't exported from the DLL. */ +#if !defined(PY_SSIZE_T_CLEAN) || !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03030000 +PyAPI_FUNC(int) PyArg_Parse(PyObject *, const char *, ...); +PyAPI_FUNC(int) PyArg_ParseTuple(PyObject *, const char *, ...); +PyAPI_FUNC(int) PyArg_ParseTupleAndKeywords(PyObject *, PyObject *, + const char *, char **, ...); +PyAPI_FUNC(int) PyArg_VaParse(PyObject *, const char *, va_list); +PyAPI_FUNC(int) PyArg_VaParseTupleAndKeywords(PyObject *, PyObject *, + const char *, char **, va_list); +#endif +PyAPI_FUNC(int) PyArg_ValidateKeywordArguments(PyObject *); +PyAPI_FUNC(int) PyArg_UnpackTuple(PyObject *, const char *, Py_ssize_t, Py_ssize_t, ...); +PyAPI_FUNC(PyObject *) Py_BuildValue(const char *, ...); +PyAPI_FUNC(PyObject *) _Py_BuildValue_SizeT(const char *, ...); + + +#ifndef Py_LIMITED_API +PyAPI_FUNC(int) _PyArg_UnpackStack( + PyObject *const *args, + Py_ssize_t nargs, + const char *name, + Py_ssize_t min, + Py_ssize_t max, + ...); + +PyAPI_FUNC(int) _PyArg_NoKeywords(const char *funcname, PyObject *kwargs); +PyAPI_FUNC(int) _PyArg_NoPositional(const char *funcname, PyObject *args); +#define _PyArg_NoKeywords(funcname, kwargs) \ + ((kwargs) == NULL || _PyArg_NoKeywords((funcname), (kwargs))) +#define _PyArg_NoPositional(funcname, args) \ + ((args) == NULL || _PyArg_NoPositional((funcname), (args))) + +#endif + +PyAPI_FUNC(PyObject *) Py_VaBuildValue(const char *, va_list); +#ifndef Py_LIMITED_API +PyAPI_FUNC(PyObject **) _Py_VaBuildStack( + PyObject **small_stack, + Py_ssize_t small_stack_len, + const char *format, + va_list va, + Py_ssize_t *p_nargs); +#endif + +#ifndef Py_LIMITED_API +typedef struct _PyArg_Parser { + const char *format; + const char * const *keywords; + const char *fname; + const char *custom_msg; + int pos; /* number of positional-only arguments */ + int min; /* minimal number of arguments */ + int max; /* maximal number of positional arguments */ + PyObject *kwtuple; /* tuple of keyword parameter names */ + struct _PyArg_Parser *next; +} _PyArg_Parser; +#ifdef PY_SSIZE_T_CLEAN +#define _PyArg_ParseTupleAndKeywordsFast _PyArg_ParseTupleAndKeywordsFast_SizeT +#define _PyArg_ParseStack _PyArg_ParseStack_SizeT +#define _PyArg_ParseStackAndKeywords _PyArg_ParseStackAndKeywords_SizeT +#define _PyArg_VaParseTupleAndKeywordsFast _PyArg_VaParseTupleAndKeywordsFast_SizeT +#endif +PyAPI_FUNC(int) _PyArg_ParseTupleAndKeywordsFast(PyObject *, PyObject *, + struct _PyArg_Parser *, ...); +PyAPI_FUNC(int) _PyArg_ParseStack( + PyObject *const *args, + Py_ssize_t nargs, + const char *format, + ...); +PyAPI_FUNC(int) _PyArg_ParseStackAndKeywords( + PyObject *const *args, + Py_ssize_t nargs, + PyObject *kwnames, + struct _PyArg_Parser *, + ...); +PyAPI_FUNC(int) _PyArg_VaParseTupleAndKeywordsFast(PyObject *, PyObject *, + struct _PyArg_Parser *, va_list); +void _PyArg_Fini(void); +#endif /* Py_LIMITED_API */ + +PyAPI_FUNC(int) PyModule_AddObject(PyObject *, const char *, PyObject *); +PyAPI_FUNC(int) PyModule_AddIntConstant(PyObject *, const char *, long); +PyAPI_FUNC(int) PyModule_AddStringConstant(PyObject *, const char *, const char *); +#define PyModule_AddIntMacro(m, c) PyModule_AddIntConstant(m, #c, c) +#define PyModule_AddStringMacro(m, c) PyModule_AddStringConstant(m, #c, c) + +#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03050000 +/* New in 3.5 */ +PyAPI_FUNC(int) PyModule_SetDocString(PyObject *, const char *); +PyAPI_FUNC(int) PyModule_AddFunctions(PyObject *, PyMethodDef *); +PyAPI_FUNC(int) PyModule_ExecDef(PyObject *module, PyModuleDef *def); +#endif + +#define Py_CLEANUP_SUPPORTED 0x20000 + +#define PYTHON_API_VERSION 1013 +#define PYTHON_API_STRING "1013" +/* The API version is maintained (independently from the Python version) + so we can detect mismatches between the interpreter and dynamically + loaded modules. These are diagnosed by an error message but + the module is still loaded (because the mismatch can only be tested + after loading the module). The error message is intended to + explain the core dump a few seconds later. + + The symbol PYTHON_API_STRING defines the same value as a string + literal. *** PLEASE MAKE SURE THE DEFINITIONS MATCH. *** + + Please add a line or two to the top of this log for each API + version change: + + 22-Feb-2006 MvL 1013 PEP 353 - long indices for sequence lengths + + 19-Aug-2002 GvR 1012 Changes to string object struct for + interning changes, saving 3 bytes. + + 17-Jul-2001 GvR 1011 Descr-branch, just to be on the safe side + + 25-Jan-2001 FLD 1010 Parameters added to PyCode_New() and + PyFrame_New(); Python 2.1a2 + + 14-Mar-2000 GvR 1009 Unicode API added + + 3-Jan-1999 GvR 1007 Decided to change back! (Don't reuse 1008!) + + 3-Dec-1998 GvR 1008 Python 1.5.2b1 + + 18-Jan-1997 GvR 1007 string interning and other speedups + + 11-Oct-1996 GvR renamed Py_Ellipses to Py_Ellipsis :-( + + 30-Jul-1996 GvR Slice and ellipses syntax added + + 23-Jul-1996 GvR For 1.4 -- better safe than sorry this time :-) + + 7-Nov-1995 GvR Keyword arguments (should've been done at 1.3 :-( ) + + 10-Jan-1995 GvR Renamed globals to new naming scheme + + 9-Jan-1995 GvR Initial version (incompatible with older API) +*/ + +/* The PYTHON_ABI_VERSION is introduced in PEP 384. For the lifetime of + Python 3, it will stay at the value of 3; changes to the limited API + must be performed in a strictly backwards-compatible manner. */ +#define PYTHON_ABI_VERSION 3 +#define PYTHON_ABI_STRING "3" + +#ifdef Py_TRACE_REFS + /* When we are tracing reference counts, rename module creation functions so + modules compiled with incompatible settings will generate a + link-time error. */ + #define PyModule_Create2 PyModule_Create2TraceRefs + #define PyModule_FromDefAndSpec2 PyModule_FromDefAndSpec2TraceRefs +#endif + +PyAPI_FUNC(PyObject *) PyModule_Create2(struct PyModuleDef*, + int apiver); +#ifndef Py_LIMITED_API +PyAPI_FUNC(PyObject *) _PyModule_CreateInitialized(struct PyModuleDef*, + int apiver); +#endif + +#ifdef Py_LIMITED_API +#define PyModule_Create(module) \ + PyModule_Create2(module, PYTHON_ABI_VERSION) +#else +#define PyModule_Create(module) \ + PyModule_Create2(module, PYTHON_API_VERSION) +#endif + +#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03050000 +/* New in 3.5 */ +PyAPI_FUNC(PyObject *) PyModule_FromDefAndSpec2(PyModuleDef *def, + PyObject *spec, + int module_api_version); + +#ifdef Py_LIMITED_API +#define PyModule_FromDefAndSpec(module, spec) \ + PyModule_FromDefAndSpec2(module, spec, PYTHON_ABI_VERSION) +#else +#define PyModule_FromDefAndSpec(module, spec) \ + PyModule_FromDefAndSpec2(module, spec, PYTHON_API_VERSION) +#endif /* Py_LIMITED_API */ +#endif /* New in 3.5 */ + +#ifndef Py_LIMITED_API +PyAPI_DATA(const char *) _Py_PackageContext; +#endif + +#ifdef __cplusplus +} +#endif +#endif /* !Py_MODSUPPORT_H */ diff --git a/env/Include/moduleobject.h b/env/Include/moduleobject.h new file mode 100644 index 0000000..1d8fe46 --- /dev/null +++ b/env/Include/moduleobject.h @@ -0,0 +1,89 @@ + +/* Module object interface */ + +#ifndef Py_MODULEOBJECT_H +#define Py_MODULEOBJECT_H +#ifdef __cplusplus +extern "C" { +#endif + +PyAPI_DATA(PyTypeObject) PyModule_Type; + +#define PyModule_Check(op) PyObject_TypeCheck(op, &PyModule_Type) +#define PyModule_CheckExact(op) (Py_TYPE(op) == &PyModule_Type) + +#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03030000 +PyAPI_FUNC(PyObject *) PyModule_NewObject( + PyObject *name + ); +#endif +PyAPI_FUNC(PyObject *) PyModule_New( + const char *name /* UTF-8 encoded string */ + ); +PyAPI_FUNC(PyObject *) PyModule_GetDict(PyObject *); +#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03030000 +PyAPI_FUNC(PyObject *) PyModule_GetNameObject(PyObject *); +#endif +PyAPI_FUNC(const char *) PyModule_GetName(PyObject *); +PyAPI_FUNC(const char *) PyModule_GetFilename(PyObject *) Py_DEPRECATED(3.2); +PyAPI_FUNC(PyObject *) PyModule_GetFilenameObject(PyObject *); +#ifndef Py_LIMITED_API +PyAPI_FUNC(void) _PyModule_Clear(PyObject *); +PyAPI_FUNC(void) _PyModule_ClearDict(PyObject *); +#endif +PyAPI_FUNC(struct PyModuleDef*) PyModule_GetDef(PyObject*); +PyAPI_FUNC(void*) PyModule_GetState(PyObject*); + +#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03050000 +/* New in 3.5 */ +PyAPI_FUNC(PyObject *) PyModuleDef_Init(struct PyModuleDef*); +PyAPI_DATA(PyTypeObject) PyModuleDef_Type; +#endif + +typedef struct PyModuleDef_Base { + PyObject_HEAD + PyObject* (*m_init)(void); + Py_ssize_t m_index; + PyObject* m_copy; +} PyModuleDef_Base; + +#define PyModuleDef_HEAD_INIT { \ + PyObject_HEAD_INIT(NULL) \ + NULL, /* m_init */ \ + 0, /* m_index */ \ + NULL, /* m_copy */ \ + } + +struct PyModuleDef_Slot; +#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03050000 +/* New in 3.5 */ +typedef struct PyModuleDef_Slot{ + int slot; + void *value; +} PyModuleDef_Slot; + +#define Py_mod_create 1 +#define Py_mod_exec 2 + +#ifndef Py_LIMITED_API +#define _Py_mod_LAST_SLOT 2 +#endif + +#endif /* New in 3.5 */ + +typedef struct PyModuleDef{ + PyModuleDef_Base m_base; + const char* m_name; + const char* m_doc; + Py_ssize_t m_size; + PyMethodDef *m_methods; + struct PyModuleDef_Slot* m_slots; + traverseproc m_traverse; + inquiry m_clear; + freefunc m_free; +} PyModuleDef; + +#ifdef __cplusplus +} +#endif +#endif /* !Py_MODULEOBJECT_H */ diff --git a/env/Include/namespaceobject.h b/env/Include/namespaceobject.h new file mode 100644 index 0000000..0c8d95c --- /dev/null +++ b/env/Include/namespaceobject.h @@ -0,0 +1,19 @@ + +/* simple namespace object interface */ + +#ifndef NAMESPACEOBJECT_H +#define NAMESPACEOBJECT_H +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef Py_LIMITED_API +PyAPI_DATA(PyTypeObject) _PyNamespace_Type; + +PyAPI_FUNC(PyObject *) _PyNamespace_New(PyObject *kwds); +#endif /* !Py_LIMITED_API */ + +#ifdef __cplusplus +} +#endif +#endif /* !NAMESPACEOBJECT_H */ diff --git a/env/Include/node.h b/env/Include/node.h new file mode 100644 index 0000000..40596df --- /dev/null +++ b/env/Include/node.h @@ -0,0 +1,44 @@ + +/* Parse tree node interface */ + +#ifndef Py_NODE_H +#define Py_NODE_H +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct _node { + short n_type; + char *n_str; + int n_lineno; + int n_col_offset; + int n_nchildren; + struct _node *n_child; +} node; + +PyAPI_FUNC(node *) PyNode_New(int type); +PyAPI_FUNC(int) PyNode_AddChild(node *n, int type, + char *str, int lineno, int col_offset); +PyAPI_FUNC(void) PyNode_Free(node *n); +#ifndef Py_LIMITED_API +PyAPI_FUNC(Py_ssize_t) _PyNode_SizeOf(node *n); +#endif + +/* Node access functions */ +#define NCH(n) ((n)->n_nchildren) + +#define CHILD(n, i) (&(n)->n_child[i]) +#define RCHILD(n, i) (CHILD(n, NCH(n) + i)) +#define TYPE(n) ((n)->n_type) +#define STR(n) ((n)->n_str) +#define LINENO(n) ((n)->n_lineno) + +/* Assert that the type of a node is what we expect */ +#define REQ(n, type) assert(TYPE(n) == (type)) + +PyAPI_FUNC(void) PyNode_ListTree(node *); + +#ifdef __cplusplus +} +#endif +#endif /* !Py_NODE_H */ diff --git a/env/Include/object.h b/env/Include/object.h new file mode 100644 index 0000000..bcf78af --- /dev/null +++ b/env/Include/object.h @@ -0,0 +1,1105 @@ +#ifndef Py_OBJECT_H +#define Py_OBJECT_H +#ifdef __cplusplus +extern "C" { +#endif + + +/* Object and type object interface */ + +/* +Objects are structures allocated on the heap. Special rules apply to +the use of objects to ensure they are properly garbage-collected. +Objects are never allocated statically or on the stack; they must be +accessed through special macros and functions only. (Type objects are +exceptions to the first rule; the standard types are represented by +statically initialized type objects, although work on type/class unification +for Python 2.2 made it possible to have heap-allocated type objects too). + +An object has a 'reference count' that is increased or decreased when a +pointer to the object is copied or deleted; when the reference count +reaches zero there are no references to the object left and it can be +removed from the heap. + +An object has a 'type' that determines what it represents and what kind +of data it contains. An object's type is fixed when it is created. +Types themselves are represented as objects; an object contains a +pointer to the corresponding type object. The type itself has a type +pointer pointing to the object representing the type 'type', which +contains a pointer to itself!). + +Objects do not float around in memory; once allocated an object keeps +the same size and address. Objects that must hold variable-size data +can contain pointers to variable-size parts of the object. Not all +objects of the same type have the same size; but the size cannot change +after allocation. (These restrictions are made so a reference to an +object can be simply a pointer -- moving an object would require +updating all the pointers, and changing an object's size would require +moving it if there was another object right next to it.) + +Objects are always accessed through pointers of the type 'PyObject *'. +The type 'PyObject' is a structure that only contains the reference count +and the type pointer. The actual memory allocated for an object +contains other data that can only be accessed after casting the pointer +to a pointer to a longer structure type. This longer type must start +with the reference count and type fields; the macro PyObject_HEAD should be +used for this (to accommodate for future changes). The implementation +of a particular object type can cast the object pointer to the proper +type and back. + +A standard interface exists for objects that contain an array of items +whose size is determined when the object is allocated. +*/ + +/* Py_DEBUG implies Py_TRACE_REFS. */ +#if defined(Py_DEBUG) && !defined(Py_TRACE_REFS) +#define Py_TRACE_REFS +#endif + +/* Py_TRACE_REFS implies Py_REF_DEBUG. */ +#if defined(Py_TRACE_REFS) && !defined(Py_REF_DEBUG) +#define Py_REF_DEBUG +#endif + +#if defined(Py_LIMITED_API) && defined(Py_REF_DEBUG) +#error Py_LIMITED_API is incompatible with Py_DEBUG, Py_TRACE_REFS, and Py_REF_DEBUG +#endif + + +#ifdef Py_TRACE_REFS +/* Define pointers to support a doubly-linked list of all live heap objects. */ +#define _PyObject_HEAD_EXTRA \ + struct _object *_ob_next; \ + struct _object *_ob_prev; + +#define _PyObject_EXTRA_INIT 0, 0, + +#else +#define _PyObject_HEAD_EXTRA +#define _PyObject_EXTRA_INIT +#endif + +/* PyObject_HEAD defines the initial segment of every PyObject. */ +#define PyObject_HEAD PyObject ob_base; + +#define PyObject_HEAD_INIT(type) \ + { _PyObject_EXTRA_INIT \ + 1, type }, + +#define PyVarObject_HEAD_INIT(type, size) \ + { PyObject_HEAD_INIT(type) size }, + +/* PyObject_VAR_HEAD defines the initial segment of all variable-size + * container objects. These end with a declaration of an array with 1 + * element, but enough space is malloc'ed so that the array actually + * has room for ob_size elements. Note that ob_size is an element count, + * not necessarily a byte count. + */ +#define PyObject_VAR_HEAD PyVarObject ob_base; +#define Py_INVALID_SIZE (Py_ssize_t)-1 + +/* Nothing is actually declared to be a PyObject, but every pointer to + * a Python object can be cast to a PyObject*. This is inheritance built + * by hand. Similarly every pointer to a variable-size Python object can, + * in addition, be cast to PyVarObject*. + */ +typedef struct _object { + _PyObject_HEAD_EXTRA + Py_ssize_t ob_refcnt; + struct _typeobject *ob_type; +} PyObject; + +typedef struct { + PyObject ob_base; + Py_ssize_t ob_size; /* Number of items in variable part */ +} PyVarObject; + +#define Py_REFCNT(ob) (((PyObject*)(ob))->ob_refcnt) +#define Py_TYPE(ob) (((PyObject*)(ob))->ob_type) +#define Py_SIZE(ob) (((PyVarObject*)(ob))->ob_size) + +#ifndef Py_LIMITED_API +/********************* String Literals ****************************************/ +/* This structure helps managing static strings. The basic usage goes like this: + Instead of doing + + r = PyObject_CallMethod(o, "foo", "args", ...); + + do + + _Py_IDENTIFIER(foo); + ... + r = _PyObject_CallMethodId(o, &PyId_foo, "args", ...); + + PyId_foo is a static variable, either on block level or file level. On first + usage, the string "foo" is interned, and the structures are linked. On interpreter + shutdown, all strings are released (through _PyUnicode_ClearStaticStrings). + + Alternatively, _Py_static_string allows choosing the variable name. + _PyUnicode_FromId returns a borrowed reference to the interned string. + _PyObject_{Get,Set,Has}AttrId are __getattr__ versions using _Py_Identifier*. +*/ +typedef struct _Py_Identifier { + struct _Py_Identifier *next; + const char* string; + PyObject *object; +} _Py_Identifier; + +#define _Py_static_string_init(value) { .next = NULL, .string = value, .object = NULL } +#define _Py_static_string(varname, value) static _Py_Identifier varname = _Py_static_string_init(value) +#define _Py_IDENTIFIER(varname) _Py_static_string(PyId_##varname, #varname) + +#endif /* !Py_LIMITED_API */ + +/* +Type objects contain a string containing the type name (to help somewhat +in debugging), the allocation parameters (see PyObject_New() and +PyObject_NewVar()), +and methods for accessing objects of the type. Methods are optional, a +nil pointer meaning that particular kind of access is not available for +this type. The Py_DECREF() macro uses the tp_dealloc method without +checking for a nil pointer; it should always be implemented except if +the implementation can guarantee that the reference count will never +reach zero (e.g., for statically allocated type objects). + +NB: the methods for certain type groups are now contained in separate +method blocks. +*/ + +typedef PyObject * (*unaryfunc)(PyObject *); +typedef PyObject * (*binaryfunc)(PyObject *, PyObject *); +typedef PyObject * (*ternaryfunc)(PyObject *, PyObject *, PyObject *); +typedef int (*inquiry)(PyObject *); +typedef Py_ssize_t (*lenfunc)(PyObject *); +typedef PyObject *(*ssizeargfunc)(PyObject *, Py_ssize_t); +typedef PyObject *(*ssizessizeargfunc)(PyObject *, Py_ssize_t, Py_ssize_t); +typedef int(*ssizeobjargproc)(PyObject *, Py_ssize_t, PyObject *); +typedef int(*ssizessizeobjargproc)(PyObject *, Py_ssize_t, Py_ssize_t, PyObject *); +typedef int(*objobjargproc)(PyObject *, PyObject *, PyObject *); + +#ifndef Py_LIMITED_API +/* buffer interface */ +typedef struct bufferinfo { + void *buf; + PyObject *obj; /* owned reference */ + Py_ssize_t len; + Py_ssize_t itemsize; /* This is Py_ssize_t so it can be + pointed to by strides in simple case.*/ + int readonly; + int ndim; + char *format; + Py_ssize_t *shape; + Py_ssize_t *strides; + Py_ssize_t *suboffsets; + void *internal; +} Py_buffer; + +typedef int (*getbufferproc)(PyObject *, Py_buffer *, int); +typedef void (*releasebufferproc)(PyObject *, Py_buffer *); + +/* Maximum number of dimensions */ +#define PyBUF_MAX_NDIM 64 + +/* Flags for getting buffers */ +#define PyBUF_SIMPLE 0 +#define PyBUF_WRITABLE 0x0001 +/* we used to include an E, backwards compatible alias */ +#define PyBUF_WRITEABLE PyBUF_WRITABLE +#define PyBUF_FORMAT 0x0004 +#define PyBUF_ND 0x0008 +#define PyBUF_STRIDES (0x0010 | PyBUF_ND) +#define PyBUF_C_CONTIGUOUS (0x0020 | PyBUF_STRIDES) +#define PyBUF_F_CONTIGUOUS (0x0040 | PyBUF_STRIDES) +#define PyBUF_ANY_CONTIGUOUS (0x0080 | PyBUF_STRIDES) +#define PyBUF_INDIRECT (0x0100 | PyBUF_STRIDES) + +#define PyBUF_CONTIG (PyBUF_ND | PyBUF_WRITABLE) +#define PyBUF_CONTIG_RO (PyBUF_ND) + +#define PyBUF_STRIDED (PyBUF_STRIDES | PyBUF_WRITABLE) +#define PyBUF_STRIDED_RO (PyBUF_STRIDES) + +#define PyBUF_RECORDS (PyBUF_STRIDES | PyBUF_WRITABLE | PyBUF_FORMAT) +#define PyBUF_RECORDS_RO (PyBUF_STRIDES | PyBUF_FORMAT) + +#define PyBUF_FULL (PyBUF_INDIRECT | PyBUF_WRITABLE | PyBUF_FORMAT) +#define PyBUF_FULL_RO (PyBUF_INDIRECT | PyBUF_FORMAT) + + +#define PyBUF_READ 0x100 +#define PyBUF_WRITE 0x200 + +/* End buffer interface */ +#endif /* Py_LIMITED_API */ + +typedef int (*objobjproc)(PyObject *, PyObject *); +typedef int (*visitproc)(PyObject *, void *); +typedef int (*traverseproc)(PyObject *, visitproc, void *); + +#ifndef Py_LIMITED_API +typedef struct { + /* Number implementations must check *both* + arguments for proper type and implement the necessary conversions + in the slot functions themselves. */ + + binaryfunc nb_add; + binaryfunc nb_subtract; + binaryfunc nb_multiply; + binaryfunc nb_remainder; + binaryfunc nb_divmod; + ternaryfunc nb_power; + unaryfunc nb_negative; + unaryfunc nb_positive; + unaryfunc nb_absolute; + inquiry nb_bool; + unaryfunc nb_invert; + binaryfunc nb_lshift; + binaryfunc nb_rshift; + binaryfunc nb_and; + binaryfunc nb_xor; + binaryfunc nb_or; + unaryfunc nb_int; + void *nb_reserved; /* the slot formerly known as nb_long */ + unaryfunc nb_float; + + binaryfunc nb_inplace_add; + binaryfunc nb_inplace_subtract; + binaryfunc nb_inplace_multiply; + binaryfunc nb_inplace_remainder; + ternaryfunc nb_inplace_power; + binaryfunc nb_inplace_lshift; + binaryfunc nb_inplace_rshift; + binaryfunc nb_inplace_and; + binaryfunc nb_inplace_xor; + binaryfunc nb_inplace_or; + + binaryfunc nb_floor_divide; + binaryfunc nb_true_divide; + binaryfunc nb_inplace_floor_divide; + binaryfunc nb_inplace_true_divide; + + unaryfunc nb_index; + + binaryfunc nb_matrix_multiply; + binaryfunc nb_inplace_matrix_multiply; +} PyNumberMethods; + +typedef struct { + lenfunc sq_length; + binaryfunc sq_concat; + ssizeargfunc sq_repeat; + ssizeargfunc sq_item; + void *was_sq_slice; + ssizeobjargproc sq_ass_item; + void *was_sq_ass_slice; + objobjproc sq_contains; + + binaryfunc sq_inplace_concat; + ssizeargfunc sq_inplace_repeat; +} PySequenceMethods; + +typedef struct { + lenfunc mp_length; + binaryfunc mp_subscript; + objobjargproc mp_ass_subscript; +} PyMappingMethods; + +typedef struct { + unaryfunc am_await; + unaryfunc am_aiter; + unaryfunc am_anext; +} PyAsyncMethods; + +typedef struct { + getbufferproc bf_getbuffer; + releasebufferproc bf_releasebuffer; +} PyBufferProcs; +#endif /* Py_LIMITED_API */ + +typedef void (*freefunc)(void *); +typedef void (*destructor)(PyObject *); +#ifndef Py_LIMITED_API +/* We can't provide a full compile-time check that limited-API + users won't implement tp_print. However, not defining printfunc + and making tp_print of a different function pointer type + should at least cause a warning in most cases. */ +typedef int (*printfunc)(PyObject *, FILE *, int); +#endif +typedef PyObject *(*getattrfunc)(PyObject *, char *); +typedef PyObject *(*getattrofunc)(PyObject *, PyObject *); +typedef int (*setattrfunc)(PyObject *, char *, PyObject *); +typedef int (*setattrofunc)(PyObject *, PyObject *, PyObject *); +typedef PyObject *(*reprfunc)(PyObject *); +typedef Py_hash_t (*hashfunc)(PyObject *); +typedef PyObject *(*richcmpfunc) (PyObject *, PyObject *, int); +typedef PyObject *(*getiterfunc) (PyObject *); +typedef PyObject *(*iternextfunc) (PyObject *); +typedef PyObject *(*descrgetfunc) (PyObject *, PyObject *, PyObject *); +typedef int (*descrsetfunc) (PyObject *, PyObject *, PyObject *); +typedef int (*initproc)(PyObject *, PyObject *, PyObject *); +typedef PyObject *(*newfunc)(struct _typeobject *, PyObject *, PyObject *); +typedef PyObject *(*allocfunc)(struct _typeobject *, Py_ssize_t); + +#ifdef Py_LIMITED_API +typedef struct _typeobject PyTypeObject; /* opaque */ +#else +typedef struct _typeobject { + PyObject_VAR_HEAD + const char *tp_name; /* For printing, in format "." */ + Py_ssize_t tp_basicsize, tp_itemsize; /* For allocation */ + + /* Methods to implement standard operations */ + + destructor tp_dealloc; + printfunc tp_print; + getattrfunc tp_getattr; + setattrfunc tp_setattr; + PyAsyncMethods *tp_as_async; /* formerly known as tp_compare (Python 2) + or tp_reserved (Python 3) */ + reprfunc tp_repr; + + /* Method suites for standard classes */ + + PyNumberMethods *tp_as_number; + PySequenceMethods *tp_as_sequence; + PyMappingMethods *tp_as_mapping; + + /* More standard operations (here for binary compatibility) */ + + hashfunc tp_hash; + ternaryfunc tp_call; + reprfunc tp_str; + getattrofunc tp_getattro; + setattrofunc tp_setattro; + + /* Functions to access object as input/output buffer */ + PyBufferProcs *tp_as_buffer; + + /* Flags to define presence of optional/expanded features */ + unsigned long tp_flags; + + const char *tp_doc; /* Documentation string */ + + /* Assigned meaning in release 2.0 */ + /* call function for all accessible objects */ + traverseproc tp_traverse; + + /* delete references to contained objects */ + inquiry tp_clear; + + /* Assigned meaning in release 2.1 */ + /* rich comparisons */ + richcmpfunc tp_richcompare; + + /* weak reference enabler */ + Py_ssize_t tp_weaklistoffset; + + /* Iterators */ + getiterfunc tp_iter; + iternextfunc tp_iternext; + + /* Attribute descriptor and subclassing stuff */ + struct PyMethodDef *tp_methods; + struct PyMemberDef *tp_members; + struct PyGetSetDef *tp_getset; + struct _typeobject *tp_base; + PyObject *tp_dict; + descrgetfunc tp_descr_get; + descrsetfunc tp_descr_set; + Py_ssize_t tp_dictoffset; + initproc tp_init; + allocfunc tp_alloc; + newfunc tp_new; + freefunc tp_free; /* Low-level free-memory routine */ + inquiry tp_is_gc; /* For PyObject_IS_GC */ + PyObject *tp_bases; + PyObject *tp_mro; /* method resolution order */ + PyObject *tp_cache; + PyObject *tp_subclasses; + PyObject *tp_weaklist; + destructor tp_del; + + /* Type attribute cache version tag. Added in version 2.6 */ + unsigned int tp_version_tag; + + destructor tp_finalize; + +#ifdef COUNT_ALLOCS + /* these must be last and never explicitly initialized */ + Py_ssize_t tp_allocs; + Py_ssize_t tp_frees; + Py_ssize_t tp_maxalloc; + struct _typeobject *tp_prev; + struct _typeobject *tp_next; +#endif +} PyTypeObject; +#endif + +typedef struct{ + int slot; /* slot id, see below */ + void *pfunc; /* function pointer */ +} PyType_Slot; + +typedef struct{ + const char* name; + int basicsize; + int itemsize; + unsigned int flags; + PyType_Slot *slots; /* terminated by slot==0. */ +} PyType_Spec; + +PyAPI_FUNC(PyObject*) PyType_FromSpec(PyType_Spec*); +#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03030000 +PyAPI_FUNC(PyObject*) PyType_FromSpecWithBases(PyType_Spec*, PyObject*); +#endif +#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03040000 +PyAPI_FUNC(void*) PyType_GetSlot(PyTypeObject*, int); +#endif + +#ifndef Py_LIMITED_API +/* The *real* layout of a type object when allocated on the heap */ +typedef struct _heaptypeobject { + /* Note: there's a dependency on the order of these members + in slotptr() in typeobject.c . */ + PyTypeObject ht_type; + PyAsyncMethods as_async; + PyNumberMethods as_number; + PyMappingMethods as_mapping; + PySequenceMethods as_sequence; /* as_sequence comes after as_mapping, + so that the mapping wins when both + the mapping and the sequence define + a given operator (e.g. __getitem__). + see add_operators() in typeobject.c . */ + PyBufferProcs as_buffer; + PyObject *ht_name, *ht_slots, *ht_qualname; + struct _dictkeysobject *ht_cached_keys; + /* here are optional user slots, followed by the members. */ +} PyHeapTypeObject; + +/* access macro to the members which are floating "behind" the object */ +#define PyHeapType_GET_MEMBERS(etype) \ + ((PyMemberDef *)(((char *)etype) + Py_TYPE(etype)->tp_basicsize)) +#endif + +/* Generic type check */ +PyAPI_FUNC(int) PyType_IsSubtype(PyTypeObject *, PyTypeObject *); +#define PyObject_TypeCheck(ob, tp) \ + (Py_TYPE(ob) == (tp) || PyType_IsSubtype(Py_TYPE(ob), (tp))) + +PyAPI_DATA(PyTypeObject) PyType_Type; /* built-in 'type' */ +PyAPI_DATA(PyTypeObject) PyBaseObject_Type; /* built-in 'object' */ +PyAPI_DATA(PyTypeObject) PySuper_Type; /* built-in 'super' */ + +PyAPI_FUNC(unsigned long) PyType_GetFlags(PyTypeObject*); + +#define PyType_Check(op) \ + PyType_FastSubclass(Py_TYPE(op), Py_TPFLAGS_TYPE_SUBCLASS) +#define PyType_CheckExact(op) (Py_TYPE(op) == &PyType_Type) + +PyAPI_FUNC(int) PyType_Ready(PyTypeObject *); +PyAPI_FUNC(PyObject *) PyType_GenericAlloc(PyTypeObject *, Py_ssize_t); +PyAPI_FUNC(PyObject *) PyType_GenericNew(PyTypeObject *, + PyObject *, PyObject *); +#ifndef Py_LIMITED_API +PyAPI_FUNC(const char *) _PyType_Name(PyTypeObject *); +PyAPI_FUNC(PyObject *) _PyType_Lookup(PyTypeObject *, PyObject *); +PyAPI_FUNC(PyObject *) _PyType_LookupId(PyTypeObject *, _Py_Identifier *); +PyAPI_FUNC(PyObject *) _PyObject_LookupSpecial(PyObject *, _Py_Identifier *); +PyAPI_FUNC(PyTypeObject *) _PyType_CalculateMetaclass(PyTypeObject *, PyObject *); +#endif +PyAPI_FUNC(unsigned int) PyType_ClearCache(void); +PyAPI_FUNC(void) PyType_Modified(PyTypeObject *); + +#ifndef Py_LIMITED_API +PyAPI_FUNC(PyObject *) _PyType_GetDocFromInternalDoc(const char *, const char *); +PyAPI_FUNC(PyObject *) _PyType_GetTextSignatureFromInternalDoc(const char *, const char *); +#endif + +/* Generic operations on objects */ +#ifndef Py_LIMITED_API +struct _Py_Identifier; +PyAPI_FUNC(int) PyObject_Print(PyObject *, FILE *, int); +PyAPI_FUNC(void) _Py_BreakPoint(void); +PyAPI_FUNC(void) _PyObject_Dump(PyObject *); +PyAPI_FUNC(int) _PyObject_IsFreed(PyObject *); +#endif +PyAPI_FUNC(PyObject *) PyObject_Repr(PyObject *); +PyAPI_FUNC(PyObject *) PyObject_Str(PyObject *); +PyAPI_FUNC(PyObject *) PyObject_ASCII(PyObject *); +PyAPI_FUNC(PyObject *) PyObject_Bytes(PyObject *); +PyAPI_FUNC(PyObject *) PyObject_RichCompare(PyObject *, PyObject *, int); +PyAPI_FUNC(int) PyObject_RichCompareBool(PyObject *, PyObject *, int); +PyAPI_FUNC(PyObject *) PyObject_GetAttrString(PyObject *, const char *); +PyAPI_FUNC(int) PyObject_SetAttrString(PyObject *, const char *, PyObject *); +PyAPI_FUNC(int) PyObject_HasAttrString(PyObject *, const char *); +PyAPI_FUNC(PyObject *) PyObject_GetAttr(PyObject *, PyObject *); +PyAPI_FUNC(int) PyObject_SetAttr(PyObject *, PyObject *, PyObject *); +PyAPI_FUNC(int) PyObject_HasAttr(PyObject *, PyObject *); +#ifndef Py_LIMITED_API +PyAPI_FUNC(int) _PyObject_IsAbstract(PyObject *); +PyAPI_FUNC(PyObject *) _PyObject_GetAttrId(PyObject *, struct _Py_Identifier *); +PyAPI_FUNC(int) _PyObject_SetAttrId(PyObject *, struct _Py_Identifier *, PyObject *); +PyAPI_FUNC(int) _PyObject_HasAttrId(PyObject *, struct _Py_Identifier *); +/* Replacements of PyObject_GetAttr() and _PyObject_GetAttrId() which + don't raise AttributeError. + + Return 1 and set *result != NULL if an attribute is found. + Return 0 and set *result == NULL if an attribute is not found; + an AttributeError is silenced. + Return -1 and set *result == NULL if an error other than AttributeError + is raised. +*/ +PyAPI_FUNC(int) _PyObject_LookupAttr(PyObject *, PyObject *, PyObject **); +PyAPI_FUNC(int) _PyObject_LookupAttrId(PyObject *, struct _Py_Identifier *, PyObject **); +PyAPI_FUNC(PyObject **) _PyObject_GetDictPtr(PyObject *); +#endif +PyAPI_FUNC(PyObject *) PyObject_SelfIter(PyObject *); +#ifndef Py_LIMITED_API +PyAPI_FUNC(PyObject *) _PyObject_NextNotImplemented(PyObject *); +#endif +PyAPI_FUNC(PyObject *) PyObject_GenericGetAttr(PyObject *, PyObject *); +PyAPI_FUNC(int) PyObject_GenericSetAttr(PyObject *, + PyObject *, PyObject *); +#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03030000 +PyAPI_FUNC(int) PyObject_GenericSetDict(PyObject *, PyObject *, void *); +#endif +PyAPI_FUNC(Py_hash_t) PyObject_Hash(PyObject *); +PyAPI_FUNC(Py_hash_t) PyObject_HashNotImplemented(PyObject *); +PyAPI_FUNC(int) PyObject_IsTrue(PyObject *); +PyAPI_FUNC(int) PyObject_Not(PyObject *); +PyAPI_FUNC(int) PyCallable_Check(PyObject *); + +PyAPI_FUNC(void) PyObject_ClearWeakRefs(PyObject *); +#ifndef Py_LIMITED_API +PyAPI_FUNC(void) PyObject_CallFinalizer(PyObject *); +PyAPI_FUNC(int) PyObject_CallFinalizerFromDealloc(PyObject *); +#endif + +#ifndef Py_LIMITED_API +/* Same as PyObject_Generic{Get,Set}Attr, but passing the attributes + dict as the last parameter. */ +PyAPI_FUNC(PyObject *) +_PyObject_GenericGetAttrWithDict(PyObject *, PyObject *, PyObject *, int); +PyAPI_FUNC(int) +_PyObject_GenericSetAttrWithDict(PyObject *, PyObject *, + PyObject *, PyObject *); +#endif /* !Py_LIMITED_API */ + +/* Helper to look up a builtin object */ +#ifndef Py_LIMITED_API +PyAPI_FUNC(PyObject *) +_PyObject_GetBuiltin(const char *name); +#endif + +/* PyObject_Dir(obj) acts like Python builtins.dir(obj), returning a + list of strings. PyObject_Dir(NULL) is like builtins.dir(), + returning the names of the current locals. In this case, if there are + no current locals, NULL is returned, and PyErr_Occurred() is false. +*/ +PyAPI_FUNC(PyObject *) PyObject_Dir(PyObject *); + + +/* Helpers for printing recursive container types */ +PyAPI_FUNC(int) Py_ReprEnter(PyObject *); +PyAPI_FUNC(void) Py_ReprLeave(PyObject *); + +/* Flag bits for printing: */ +#define Py_PRINT_RAW 1 /* No string quotes etc. */ + +/* +`Type flags (tp_flags) + +These flags are used to extend the type structure in a backwards-compatible +fashion. Extensions can use the flags to indicate (and test) when a given +type structure contains a new feature. The Python core will use these when +introducing new functionality between major revisions (to avoid mid-version +changes in the PYTHON_API_VERSION). + +Arbitration of the flag bit positions will need to be coordinated among +all extension writers who publicly release their extensions (this will +be fewer than you might expect!).. + +Most flags were removed as of Python 3.0 to make room for new flags. (Some +flags are not for backwards compatibility but to indicate the presence of an +optional feature; these flags remain of course.) + +Type definitions should use Py_TPFLAGS_DEFAULT for their tp_flags value. + +Code can use PyType_HasFeature(type_ob, flag_value) to test whether the +given type object has a specified feature. +*/ + +/* Set if the type object is dynamically allocated */ +#define Py_TPFLAGS_HEAPTYPE (1UL << 9) + +/* Set if the type allows subclassing */ +#define Py_TPFLAGS_BASETYPE (1UL << 10) + +/* Set if the type is 'ready' -- fully initialized */ +#define Py_TPFLAGS_READY (1UL << 12) + +/* Set while the type is being 'readied', to prevent recursive ready calls */ +#define Py_TPFLAGS_READYING (1UL << 13) + +/* Objects support garbage collection (see objimp.h) */ +#define Py_TPFLAGS_HAVE_GC (1UL << 14) + +/* These two bits are preserved for Stackless Python, next after this is 17 */ +#ifdef STACKLESS +#define Py_TPFLAGS_HAVE_STACKLESS_EXTENSION (3UL << 15) +#else +#define Py_TPFLAGS_HAVE_STACKLESS_EXTENSION 0 +#endif + +/* Objects support type attribute cache */ +#define Py_TPFLAGS_HAVE_VERSION_TAG (1UL << 18) +#define Py_TPFLAGS_VALID_VERSION_TAG (1UL << 19) + +/* Type is abstract and cannot be instantiated */ +#define Py_TPFLAGS_IS_ABSTRACT (1UL << 20) + +/* These flags are used to determine if a type is a subclass. */ +#define Py_TPFLAGS_LONG_SUBCLASS (1UL << 24) +#define Py_TPFLAGS_LIST_SUBCLASS (1UL << 25) +#define Py_TPFLAGS_TUPLE_SUBCLASS (1UL << 26) +#define Py_TPFLAGS_BYTES_SUBCLASS (1UL << 27) +#define Py_TPFLAGS_UNICODE_SUBCLASS (1UL << 28) +#define Py_TPFLAGS_DICT_SUBCLASS (1UL << 29) +#define Py_TPFLAGS_BASE_EXC_SUBCLASS (1UL << 30) +#define Py_TPFLAGS_TYPE_SUBCLASS (1UL << 31) + +#define Py_TPFLAGS_DEFAULT ( \ + Py_TPFLAGS_HAVE_STACKLESS_EXTENSION | \ + Py_TPFLAGS_HAVE_VERSION_TAG | \ + 0) + +/* NOTE: The following flags reuse lower bits (removed as part of the + * Python 3.0 transition). */ + +/* Type structure has tp_finalize member (3.4) */ +#define Py_TPFLAGS_HAVE_FINALIZE (1UL << 0) + +#ifdef Py_LIMITED_API +#define PyType_HasFeature(t,f) ((PyType_GetFlags(t) & (f)) != 0) +#else +#define PyType_HasFeature(t,f) (((t)->tp_flags & (f)) != 0) +#endif +#define PyType_FastSubclass(t,f) PyType_HasFeature(t,f) + + +/* +The macros Py_INCREF(op) and Py_DECREF(op) are used to increment or decrement +reference counts. Py_DECREF calls the object's deallocator function when +the refcount falls to 0; for +objects that don't contain references to other objects or heap memory +this can be the standard function free(). Both macros can be used +wherever a void expression is allowed. The argument must not be a +NULL pointer. If it may be NULL, use Py_XINCREF/Py_XDECREF instead. +The macro _Py_NewReference(op) initialize reference counts to 1, and +in special builds (Py_REF_DEBUG, Py_TRACE_REFS) performs additional +bookkeeping appropriate to the special build. + +We assume that the reference count field can never overflow; this can +be proven when the size of the field is the same as the pointer size, so +we ignore the possibility. Provided a C int is at least 32 bits (which +is implicitly assumed in many parts of this code), that's enough for +about 2**31 references to an object. + +XXX The following became out of date in Python 2.2, but I'm not sure +XXX what the full truth is now. Certainly, heap-allocated type objects +XXX can and should be deallocated. +Type objects should never be deallocated; the type pointer in an object +is not considered to be a reference to the type object, to save +complications in the deallocation function. (This is actually a +decision that's up to the implementer of each new type so if you want, +you can count such references to the type object.) +*/ + +/* First define a pile of simple helper macros, one set per special + * build symbol. These either expand to the obvious things, or to + * nothing at all when the special mode isn't in effect. The main + * macros can later be defined just once then, yet expand to different + * things depending on which special build options are and aren't in effect. + * Trust me : while painful, this is 20x easier to understand than, + * e.g, defining _Py_NewReference five different times in a maze of nested + * #ifdefs (we used to do that -- it was impenetrable). + */ +#ifdef Py_REF_DEBUG +PyAPI_DATA(Py_ssize_t) _Py_RefTotal; +PyAPI_FUNC(void) _Py_NegativeRefcount(const char *fname, + int lineno, PyObject *op); +PyAPI_FUNC(Py_ssize_t) _Py_GetRefTotal(void); +#define _Py_INC_REFTOTAL _Py_RefTotal++ +#define _Py_DEC_REFTOTAL _Py_RefTotal-- +#define _Py_REF_DEBUG_COMMA , +#define _Py_CHECK_REFCNT(OP) \ +{ if (((PyObject*)OP)->ob_refcnt < 0) \ + _Py_NegativeRefcount(__FILE__, __LINE__, \ + (PyObject *)(OP)); \ +} +/* Py_REF_DEBUG also controls the display of refcounts and memory block + * allocations at the interactive prompt and at interpreter shutdown + */ +PyAPI_FUNC(void) _PyDebug_PrintTotalRefs(void); +#else +#define _Py_INC_REFTOTAL +#define _Py_DEC_REFTOTAL +#define _Py_REF_DEBUG_COMMA +#define _Py_CHECK_REFCNT(OP) /* a semicolon */; +#endif /* Py_REF_DEBUG */ + +#ifdef COUNT_ALLOCS +PyAPI_FUNC(void) inc_count(PyTypeObject *); +PyAPI_FUNC(void) dec_count(PyTypeObject *); +#define _Py_INC_TPALLOCS(OP) inc_count(Py_TYPE(OP)) +#define _Py_INC_TPFREES(OP) dec_count(Py_TYPE(OP)) +#define _Py_DEC_TPFREES(OP) Py_TYPE(OP)->tp_frees-- +#define _Py_COUNT_ALLOCS_COMMA , +#else +#define _Py_INC_TPALLOCS(OP) +#define _Py_INC_TPFREES(OP) +#define _Py_DEC_TPFREES(OP) +#define _Py_COUNT_ALLOCS_COMMA +#endif /* COUNT_ALLOCS */ + +#ifdef Py_TRACE_REFS +/* Py_TRACE_REFS is such major surgery that we call external routines. */ +PyAPI_FUNC(void) _Py_NewReference(PyObject *); +PyAPI_FUNC(void) _Py_ForgetReference(PyObject *); +PyAPI_FUNC(void) _Py_Dealloc(PyObject *); +PyAPI_FUNC(void) _Py_PrintReferences(FILE *); +PyAPI_FUNC(void) _Py_PrintReferenceAddresses(FILE *); +PyAPI_FUNC(void) _Py_AddToAllObjects(PyObject *, int force); + +#else +/* Without Py_TRACE_REFS, there's little enough to do that we expand code + * inline. + */ +#define _Py_NewReference(op) ( \ + _Py_INC_TPALLOCS(op) _Py_COUNT_ALLOCS_COMMA \ + _Py_INC_REFTOTAL _Py_REF_DEBUG_COMMA \ + Py_REFCNT(op) = 1) + +#define _Py_ForgetReference(op) _Py_INC_TPFREES(op) + +#ifdef Py_LIMITED_API +PyAPI_FUNC(void) _Py_Dealloc(PyObject *); +#else +#define _Py_Dealloc(op) ( \ + _Py_INC_TPFREES(op) _Py_COUNT_ALLOCS_COMMA \ + (*Py_TYPE(op)->tp_dealloc)((PyObject *)(op))) +#endif +#endif /* !Py_TRACE_REFS */ + +#define Py_INCREF(op) ( \ + _Py_INC_REFTOTAL _Py_REF_DEBUG_COMMA \ + ((PyObject *)(op))->ob_refcnt++) + +#define Py_DECREF(op) \ + do { \ + PyObject *_py_decref_tmp = (PyObject *)(op); \ + if (_Py_DEC_REFTOTAL _Py_REF_DEBUG_COMMA \ + --(_py_decref_tmp)->ob_refcnt != 0) \ + _Py_CHECK_REFCNT(_py_decref_tmp) \ + else \ + _Py_Dealloc(_py_decref_tmp); \ + } while (0) + +/* Safely decref `op` and set `op` to NULL, especially useful in tp_clear + * and tp_dealloc implementations. + * + * Note that "the obvious" code can be deadly: + * + * Py_XDECREF(op); + * op = NULL; + * + * Typically, `op` is something like self->containee, and `self` is done + * using its `containee` member. In the code sequence above, suppose + * `containee` is non-NULL with a refcount of 1. Its refcount falls to + * 0 on the first line, which can trigger an arbitrary amount of code, + * possibly including finalizers (like __del__ methods or weakref callbacks) + * coded in Python, which in turn can release the GIL and allow other threads + * to run, etc. Such code may even invoke methods of `self` again, or cause + * cyclic gc to trigger, but-- oops! --self->containee still points to the + * object being torn down, and it may be in an insane state while being torn + * down. This has in fact been a rich historic source of miserable (rare & + * hard-to-diagnose) segfaulting (and other) bugs. + * + * The safe way is: + * + * Py_CLEAR(op); + * + * That arranges to set `op` to NULL _before_ decref'ing, so that any code + * triggered as a side-effect of `op` getting torn down no longer believes + * `op` points to a valid object. + * + * There are cases where it's safe to use the naive code, but they're brittle. + * For example, if `op` points to a Python integer, you know that destroying + * one of those can't cause problems -- but in part that relies on that + * Python integers aren't currently weakly referencable. Best practice is + * to use Py_CLEAR() even if you can't think of a reason for why you need to. + */ +#define Py_CLEAR(op) \ + do { \ + PyObject *_py_tmp = (PyObject *)(op); \ + if (_py_tmp != NULL) { \ + (op) = NULL; \ + Py_DECREF(_py_tmp); \ + } \ + } while (0) + +/* Macros to use in case the object pointer may be NULL: */ +#define Py_XINCREF(op) \ + do { \ + PyObject *_py_xincref_tmp = (PyObject *)(op); \ + if (_py_xincref_tmp != NULL) \ + Py_INCREF(_py_xincref_tmp); \ + } while (0) + +#define Py_XDECREF(op) \ + do { \ + PyObject *_py_xdecref_tmp = (PyObject *)(op); \ + if (_py_xdecref_tmp != NULL) \ + Py_DECREF(_py_xdecref_tmp); \ + } while (0) + +#ifndef Py_LIMITED_API +/* Safely decref `op` and set `op` to `op2`. + * + * As in case of Py_CLEAR "the obvious" code can be deadly: + * + * Py_DECREF(op); + * op = op2; + * + * The safe way is: + * + * Py_SETREF(op, op2); + * + * That arranges to set `op` to `op2` _before_ decref'ing, so that any code + * triggered as a side-effect of `op` getting torn down no longer believes + * `op` points to a valid object. + * + * Py_XSETREF is a variant of Py_SETREF that uses Py_XDECREF instead of + * Py_DECREF. + */ + +#define Py_SETREF(op, op2) \ + do { \ + PyObject *_py_tmp = (PyObject *)(op); \ + (op) = (op2); \ + Py_DECREF(_py_tmp); \ + } while (0) + +#define Py_XSETREF(op, op2) \ + do { \ + PyObject *_py_tmp = (PyObject *)(op); \ + (op) = (op2); \ + Py_XDECREF(_py_tmp); \ + } while (0) + +#endif /* ifndef Py_LIMITED_API */ + +/* +These are provided as conveniences to Python runtime embedders, so that +they can have object code that is not dependent on Python compilation flags. +*/ +PyAPI_FUNC(void) Py_IncRef(PyObject *); +PyAPI_FUNC(void) Py_DecRef(PyObject *); + +#ifndef Py_LIMITED_API +PyAPI_DATA(PyTypeObject) _PyNone_Type; +PyAPI_DATA(PyTypeObject) _PyNotImplemented_Type; +#endif /* !Py_LIMITED_API */ + +/* +_Py_NoneStruct is an object of undefined type which can be used in contexts +where NULL (nil) is not suitable (since NULL often means 'error'). + +Don't forget to apply Py_INCREF() when returning this value!!! +*/ +PyAPI_DATA(PyObject) _Py_NoneStruct; /* Don't use this directly */ +#define Py_None (&_Py_NoneStruct) + +/* Macro for returning Py_None from a function */ +#define Py_RETURN_NONE return Py_INCREF(Py_None), Py_None + +/* +Py_NotImplemented is a singleton used to signal that an operation is +not implemented for a given type combination. +*/ +PyAPI_DATA(PyObject) _Py_NotImplementedStruct; /* Don't use this directly */ +#define Py_NotImplemented (&_Py_NotImplementedStruct) + +/* Macro for returning Py_NotImplemented from a function */ +#define Py_RETURN_NOTIMPLEMENTED \ + return Py_INCREF(Py_NotImplemented), Py_NotImplemented + +/* Rich comparison opcodes */ +#define Py_LT 0 +#define Py_LE 1 +#define Py_EQ 2 +#define Py_NE 3 +#define Py_GT 4 +#define Py_GE 5 + +/* + * Macro for implementing rich comparisons + * + * Needs to be a macro because any C-comparable type can be used. + */ +#define Py_RETURN_RICHCOMPARE(val1, val2, op) \ + do { \ + switch (op) { \ + case Py_EQ: if ((val1) == (val2)) Py_RETURN_TRUE; Py_RETURN_FALSE; \ + case Py_NE: if ((val1) != (val2)) Py_RETURN_TRUE; Py_RETURN_FALSE; \ + case Py_LT: if ((val1) < (val2)) Py_RETURN_TRUE; Py_RETURN_FALSE; \ + case Py_GT: if ((val1) > (val2)) Py_RETURN_TRUE; Py_RETURN_FALSE; \ + case Py_LE: if ((val1) <= (val2)) Py_RETURN_TRUE; Py_RETURN_FALSE; \ + case Py_GE: if ((val1) >= (val2)) Py_RETURN_TRUE; Py_RETURN_FALSE; \ + default: \ + Py_UNREACHABLE(); \ + } \ + } while (0) + +#ifndef Py_LIMITED_API +/* Maps Py_LT to Py_GT, ..., Py_GE to Py_LE. + * Defined in object.c. + */ +PyAPI_DATA(int) _Py_SwappedOp[]; +#endif /* !Py_LIMITED_API */ + + +/* +More conventions +================ + +Argument Checking +----------------- + +Functions that take objects as arguments normally don't check for nil +arguments, but they do check the type of the argument, and return an +error if the function doesn't apply to the type. + +Failure Modes +------------- + +Functions may fail for a variety of reasons, including running out of +memory. This is communicated to the caller in two ways: an error string +is set (see errors.h), and the function result differs: functions that +normally return a pointer return NULL for failure, functions returning +an integer return -1 (which could be a legal return value too!), and +other functions return 0 for success and -1 for failure. +Callers should always check for errors before using the result. If +an error was set, the caller must either explicitly clear it, or pass +the error on to its caller. + +Reference Counts +---------------- + +It takes a while to get used to the proper usage of reference counts. + +Functions that create an object set the reference count to 1; such new +objects must be stored somewhere or destroyed again with Py_DECREF(). +Some functions that 'store' objects, such as PyTuple_SetItem() and +PyList_SetItem(), +don't increment the reference count of the object, since the most +frequent use is to store a fresh object. Functions that 'retrieve' +objects, such as PyTuple_GetItem() and PyDict_GetItemString(), also +don't increment +the reference count, since most frequently the object is only looked at +quickly. Thus, to retrieve an object and store it again, the caller +must call Py_INCREF() explicitly. + +NOTE: functions that 'consume' a reference count, like +PyList_SetItem(), consume the reference even if the object wasn't +successfully stored, to simplify error handling. + +It seems attractive to make other functions that take an object as +argument consume a reference count; however, this may quickly get +confusing (even the current practice is already confusing). Consider +it carefully, it may save lots of calls to Py_INCREF() and Py_DECREF() at +times. +*/ + + +/* Trashcan mechanism, thanks to Christian Tismer. + +When deallocating a container object, it's possible to trigger an unbounded +chain of deallocations, as each Py_DECREF in turn drops the refcount on "the +next" object in the chain to 0. This can easily lead to stack faults, and +especially in threads (which typically have less stack space to work with). + +A container object that participates in cyclic gc can avoid this by +bracketing the body of its tp_dealloc function with a pair of macros: + +static void +mytype_dealloc(mytype *p) +{ + ... declarations go here ... + + PyObject_GC_UnTrack(p); // must untrack first + Py_TRASHCAN_SAFE_BEGIN(p) + ... The body of the deallocator goes here, including all calls ... + ... to Py_DECREF on contained objects. ... + Py_TRASHCAN_SAFE_END(p) +} + +CAUTION: Never return from the middle of the body! If the body needs to +"get out early", put a label immediately before the Py_TRASHCAN_SAFE_END +call, and goto it. Else the call-depth counter (see below) will stay +above 0 forever, and the trashcan will never get emptied. + +How it works: The BEGIN macro increments a call-depth counter. So long +as this counter is small, the body of the deallocator is run directly without +further ado. But if the counter gets large, it instead adds p to a list of +objects to be deallocated later, skips the body of the deallocator, and +resumes execution after the END macro. The tp_dealloc routine then returns +without deallocating anything (and so unbounded call-stack depth is avoided). + +When the call stack finishes unwinding again, code generated by the END macro +notices this, and calls another routine to deallocate all the objects that +may have been added to the list of deferred deallocations. In effect, a +chain of N deallocations is broken into (N-1)/(PyTrash_UNWIND_LEVEL-1) pieces, +with the call stack never exceeding a depth of PyTrash_UNWIND_LEVEL. +*/ + +#ifndef Py_LIMITED_API +/* This is the old private API, invoked by the macros before 3.2.4. + Kept for binary compatibility of extensions using the stable ABI. */ +PyAPI_FUNC(void) _PyTrash_deposit_object(PyObject*); +PyAPI_FUNC(void) _PyTrash_destroy_chain(void); +#endif /* !Py_LIMITED_API */ + +/* The new thread-safe private API, invoked by the macros below. */ +PyAPI_FUNC(void) _PyTrash_thread_deposit_object(PyObject*); +PyAPI_FUNC(void) _PyTrash_thread_destroy_chain(void); + +#define PyTrash_UNWIND_LEVEL 50 + +#define Py_TRASHCAN_SAFE_BEGIN(op) \ + do { \ + PyThreadState *_tstate = PyThreadState_GET(); \ + if (_tstate->trash_delete_nesting < PyTrash_UNWIND_LEVEL) { \ + ++_tstate->trash_delete_nesting; + /* The body of the deallocator is here. */ +#define Py_TRASHCAN_SAFE_END(op) \ + --_tstate->trash_delete_nesting; \ + if (_tstate->trash_delete_later && _tstate->trash_delete_nesting <= 0) \ + _PyTrash_thread_destroy_chain(); \ + } \ + else \ + _PyTrash_thread_deposit_object((PyObject*)op); \ + } while (0); + +#ifndef Py_LIMITED_API +PyAPI_FUNC(void) +_PyDebugAllocatorStats(FILE *out, const char *block_name, int num_blocks, + size_t sizeof_block); +PyAPI_FUNC(void) +_PyObject_DebugTypeStats(FILE *out); +#endif /* ifndef Py_LIMITED_API */ + +#ifdef __cplusplus +} +#endif +#endif /* !Py_OBJECT_H */ diff --git a/env/Include/objimpl.h b/env/Include/objimpl.h new file mode 100644 index 0000000..0436ba7 --- /dev/null +++ b/env/Include/objimpl.h @@ -0,0 +1,374 @@ +/* The PyObject_ memory family: high-level object memory interfaces. + See pymem.h for the low-level PyMem_ family. +*/ + +#ifndef Py_OBJIMPL_H +#define Py_OBJIMPL_H + +#include "pymem.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/* BEWARE: + + Each interface exports both functions and macros. Extension modules should + use the functions, to ensure binary compatibility across Python versions. + Because the Python implementation is free to change internal details, and + the macros may (or may not) expose details for speed, if you do use the + macros you must recompile your extensions with each Python release. + + Never mix calls to PyObject_ memory functions with calls to the platform + malloc/realloc/ calloc/free, or with calls to PyMem_. +*/ + +/* +Functions and macros for modules that implement new object types. + + - PyObject_New(type, typeobj) allocates memory for a new object of the given + type, and initializes part of it. 'type' must be the C structure type used + to represent the object, and 'typeobj' the address of the corresponding + type object. Reference count and type pointer are filled in; the rest of + the bytes of the object are *undefined*! The resulting expression type is + 'type *'. The size of the object is determined by the tp_basicsize field + of the type object. + + - PyObject_NewVar(type, typeobj, n) is similar but allocates a variable-size + object with room for n items. In addition to the refcount and type pointer + fields, this also fills in the ob_size field. + + - PyObject_Del(op) releases the memory allocated for an object. It does not + run a destructor -- it only frees the memory. PyObject_Free is identical. + + - PyObject_Init(op, typeobj) and PyObject_InitVar(op, typeobj, n) don't + allocate memory. Instead of a 'type' parameter, they take a pointer to a + new object (allocated by an arbitrary allocator), and initialize its object + header fields. + +Note that objects created with PyObject_{New, NewVar} are allocated using the +specialized Python allocator (implemented in obmalloc.c), if WITH_PYMALLOC is +enabled. In addition, a special debugging allocator is used if PYMALLOC_DEBUG +is also #defined. + +In case a specific form of memory management is needed (for example, if you +must use the platform malloc heap(s), or shared memory, or C++ local storage or +operator new), you must first allocate the object with your custom allocator, +then pass its pointer to PyObject_{Init, InitVar} for filling in its Python- +specific fields: reference count, type pointer, possibly others. You should +be aware that Python has no control over these objects because they don't +cooperate with the Python memory manager. Such objects may not be eligible +for automatic garbage collection and you have to make sure that they are +released accordingly whenever their destructor gets called (cf. the specific +form of memory management you're using). + +Unless you have specific memory management requirements, use +PyObject_{New, NewVar, Del}. +*/ + +/* + * Raw object memory interface + * =========================== + */ + +/* Functions to call the same malloc/realloc/free as used by Python's + object allocator. If WITH_PYMALLOC is enabled, these may differ from + the platform malloc/realloc/free. The Python object allocator is + designed for fast, cache-conscious allocation of many "small" objects, + and with low hidden memory overhead. + + PyObject_Malloc(0) returns a unique non-NULL pointer if possible. + + PyObject_Realloc(NULL, n) acts like PyObject_Malloc(n). + PyObject_Realloc(p != NULL, 0) does not return NULL, or free the memory + at p. + + Returned pointers must be checked for NULL explicitly; no action is + performed on failure other than to return NULL (no warning it printed, no + exception is set, etc). + + For allocating objects, use PyObject_{New, NewVar} instead whenever + possible. The PyObject_{Malloc, Realloc, Free} family is exposed + so that you can exploit Python's small-block allocator for non-object + uses. If you must use these routines to allocate object memory, make sure + the object gets initialized via PyObject_{Init, InitVar} after obtaining + the raw memory. +*/ +PyAPI_FUNC(void *) PyObject_Malloc(size_t size); +#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03050000 +PyAPI_FUNC(void *) PyObject_Calloc(size_t nelem, size_t elsize); +#endif +PyAPI_FUNC(void *) PyObject_Realloc(void *ptr, size_t new_size); +PyAPI_FUNC(void) PyObject_Free(void *ptr); + +#ifndef Py_LIMITED_API +/* This function returns the number of allocated memory blocks, regardless of size */ +PyAPI_FUNC(Py_ssize_t) _Py_GetAllocatedBlocks(void); +#endif /* !Py_LIMITED_API */ + +/* Macros */ +#ifdef WITH_PYMALLOC +#ifndef Py_LIMITED_API +PyAPI_FUNC(int) _PyObject_DebugMallocStats(FILE *out); +#endif /* #ifndef Py_LIMITED_API */ +#endif + +/* Macros */ +#define PyObject_MALLOC PyObject_Malloc +#define PyObject_REALLOC PyObject_Realloc +#define PyObject_FREE PyObject_Free +#define PyObject_Del PyObject_Free +#define PyObject_DEL PyObject_Free + + +/* + * Generic object allocator interface + * ================================== + */ + +/* Functions */ +PyAPI_FUNC(PyObject *) PyObject_Init(PyObject *, PyTypeObject *); +PyAPI_FUNC(PyVarObject *) PyObject_InitVar(PyVarObject *, + PyTypeObject *, Py_ssize_t); +PyAPI_FUNC(PyObject *) _PyObject_New(PyTypeObject *); +PyAPI_FUNC(PyVarObject *) _PyObject_NewVar(PyTypeObject *, Py_ssize_t); + +#define PyObject_New(type, typeobj) \ + ( (type *) _PyObject_New(typeobj) ) +#define PyObject_NewVar(type, typeobj, n) \ + ( (type *) _PyObject_NewVar((typeobj), (n)) ) + +/* Macros trading binary compatibility for speed. See also pymem.h. + Note that these macros expect non-NULL object pointers.*/ +#define PyObject_INIT(op, typeobj) \ + ( Py_TYPE(op) = (typeobj), _Py_NewReference((PyObject *)(op)), (op) ) +#define PyObject_INIT_VAR(op, typeobj, size) \ + ( Py_SIZE(op) = (size), PyObject_INIT((op), (typeobj)) ) + +#define _PyObject_SIZE(typeobj) ( (typeobj)->tp_basicsize ) + +/* _PyObject_VAR_SIZE returns the number of bytes (as size_t) allocated for a + vrbl-size object with nitems items, exclusive of gc overhead (if any). The + value is rounded up to the closest multiple of sizeof(void *), in order to + ensure that pointer fields at the end of the object are correctly aligned + for the platform (this is of special importance for subclasses of, e.g., + str or int, so that pointers can be stored after the embedded data). + + Note that there's no memory wastage in doing this, as malloc has to + return (at worst) pointer-aligned memory anyway. +*/ +#if ((SIZEOF_VOID_P - 1) & SIZEOF_VOID_P) != 0 +# error "_PyObject_VAR_SIZE requires SIZEOF_VOID_P be a power of 2" +#endif + +#define _PyObject_VAR_SIZE(typeobj, nitems) \ + _Py_SIZE_ROUND_UP((typeobj)->tp_basicsize + \ + (nitems)*(typeobj)->tp_itemsize, \ + SIZEOF_VOID_P) + +#define PyObject_NEW(type, typeobj) \ +( (type *) PyObject_Init( \ + (PyObject *) PyObject_MALLOC( _PyObject_SIZE(typeobj) ), (typeobj)) ) + +#define PyObject_NEW_VAR(type, typeobj, n) \ +( (type *) PyObject_InitVar( \ + (PyVarObject *) PyObject_MALLOC(_PyObject_VAR_SIZE((typeobj),(n)) ),\ + (typeobj), (n)) ) + +/* This example code implements an object constructor with a custom + allocator, where PyObject_New is inlined, and shows the important + distinction between two steps (at least): + 1) the actual allocation of the object storage; + 2) the initialization of the Python specific fields + in this storage with PyObject_{Init, InitVar}. + + PyObject * + YourObject_New(...) + { + PyObject *op; + + op = (PyObject *) Your_Allocator(_PyObject_SIZE(YourTypeStruct)); + if (op == NULL) + return PyErr_NoMemory(); + + PyObject_Init(op, &YourTypeStruct); + + op->ob_field = value; + ... + return op; + } + + Note that in C++, the use of the new operator usually implies that + the 1st step is performed automatically for you, so in a C++ class + constructor you would start directly with PyObject_Init/InitVar +*/ + +#ifndef Py_LIMITED_API +typedef struct { + /* user context passed as the first argument to the 2 functions */ + void *ctx; + + /* allocate an arena of size bytes */ + void* (*alloc) (void *ctx, size_t size); + + /* free an arena */ + void (*free) (void *ctx, void *ptr, size_t size); +} PyObjectArenaAllocator; + +/* Get the arena allocator. */ +PyAPI_FUNC(void) PyObject_GetArenaAllocator(PyObjectArenaAllocator *allocator); + +/* Set the arena allocator. */ +PyAPI_FUNC(void) PyObject_SetArenaAllocator(PyObjectArenaAllocator *allocator); +#endif + + +/* + * Garbage Collection Support + * ========================== + */ + +/* C equivalent of gc.collect() which ignores the state of gc.enabled. */ +PyAPI_FUNC(Py_ssize_t) PyGC_Collect(void); + +#ifndef Py_LIMITED_API +PyAPI_FUNC(Py_ssize_t) _PyGC_CollectNoFail(void); +PyAPI_FUNC(Py_ssize_t) _PyGC_CollectIfEnabled(void); +#endif + +/* Test if a type has a GC head */ +#define PyType_IS_GC(t) PyType_HasFeature((t), Py_TPFLAGS_HAVE_GC) + +/* Test if an object has a GC head */ +#define PyObject_IS_GC(o) (PyType_IS_GC(Py_TYPE(o)) && \ + (Py_TYPE(o)->tp_is_gc == NULL || Py_TYPE(o)->tp_is_gc(o))) + +PyAPI_FUNC(PyVarObject *) _PyObject_GC_Resize(PyVarObject *, Py_ssize_t); +#define PyObject_GC_Resize(type, op, n) \ + ( (type *) _PyObject_GC_Resize((PyVarObject *)(op), (n)) ) + +/* GC information is stored BEFORE the object structure. */ +#ifndef Py_LIMITED_API +typedef union _gc_head { + struct { + union _gc_head *gc_next; + union _gc_head *gc_prev; + Py_ssize_t gc_refs; + } gc; + long double dummy; /* force worst-case alignment */ + // malloc returns memory block aligned for any built-in types and + // long double is the largest standard C type. + // On amd64 linux, long double requires 16 byte alignment. + // See bpo-27987 for more discussion. +} PyGC_Head; + +extern PyGC_Head *_PyGC_generation0; + +#define _Py_AS_GC(o) ((PyGC_Head *)(o)-1) + +/* Bit 0 is set when tp_finalize is called */ +#define _PyGC_REFS_MASK_FINALIZED (1 << 0) +/* The (N-1) most significant bits contain the gc state / refcount */ +#define _PyGC_REFS_SHIFT (1) +#define _PyGC_REFS_MASK (((size_t) -1) << _PyGC_REFS_SHIFT) + +#define _PyGCHead_REFS(g) ((g)->gc.gc_refs >> _PyGC_REFS_SHIFT) +#define _PyGCHead_SET_REFS(g, v) do { \ + (g)->gc.gc_refs = ((g)->gc.gc_refs & ~_PyGC_REFS_MASK) \ + | (((size_t)(v)) << _PyGC_REFS_SHIFT); \ + } while (0) +#define _PyGCHead_DECREF(g) ((g)->gc.gc_refs -= 1 << _PyGC_REFS_SHIFT) + +#define _PyGCHead_FINALIZED(g) (((g)->gc.gc_refs & _PyGC_REFS_MASK_FINALIZED) != 0) +#define _PyGCHead_SET_FINALIZED(g, v) do { \ + (g)->gc.gc_refs = ((g)->gc.gc_refs & ~_PyGC_REFS_MASK_FINALIZED) \ + | (v != 0); \ + } while (0) + +#define _PyGC_FINALIZED(o) _PyGCHead_FINALIZED(_Py_AS_GC(o)) +#define _PyGC_SET_FINALIZED(o, v) _PyGCHead_SET_FINALIZED(_Py_AS_GC(o), v) + +#define _PyGC_REFS(o) _PyGCHead_REFS(_Py_AS_GC(o)) + +#define _PyGC_REFS_UNTRACKED (-2) +#define _PyGC_REFS_REACHABLE (-3) +#define _PyGC_REFS_TENTATIVELY_UNREACHABLE (-4) + +/* Tell the GC to track this object. NB: While the object is tracked the + * collector it must be safe to call the ob_traverse method. */ +#define _PyObject_GC_TRACK(o) do { \ + PyGC_Head *g = _Py_AS_GC(o); \ + if (_PyGCHead_REFS(g) != _PyGC_REFS_UNTRACKED) \ + Py_FatalError("GC object already tracked"); \ + _PyGCHead_SET_REFS(g, _PyGC_REFS_REACHABLE); \ + g->gc.gc_next = _PyGC_generation0; \ + g->gc.gc_prev = _PyGC_generation0->gc.gc_prev; \ + g->gc.gc_prev->gc.gc_next = g; \ + _PyGC_generation0->gc.gc_prev = g; \ + } while (0); + +/* Tell the GC to stop tracking this object. + * gc_next doesn't need to be set to NULL, but doing so is a good + * way to provoke memory errors if calling code is confused. + */ +#define _PyObject_GC_UNTRACK(o) do { \ + PyGC_Head *g = _Py_AS_GC(o); \ + assert(_PyGCHead_REFS(g) != _PyGC_REFS_UNTRACKED); \ + _PyGCHead_SET_REFS(g, _PyGC_REFS_UNTRACKED); \ + g->gc.gc_prev->gc.gc_next = g->gc.gc_next; \ + g->gc.gc_next->gc.gc_prev = g->gc.gc_prev; \ + g->gc.gc_next = NULL; \ + } while (0); + +/* True if the object is currently tracked by the GC. */ +#define _PyObject_GC_IS_TRACKED(o) \ + (_PyGC_REFS(o) != _PyGC_REFS_UNTRACKED) + +/* True if the object may be tracked by the GC in the future, or already is. + This can be useful to implement some optimizations. */ +#define _PyObject_GC_MAY_BE_TRACKED(obj) \ + (PyObject_IS_GC(obj) && \ + (!PyTuple_CheckExact(obj) || _PyObject_GC_IS_TRACKED(obj))) +#endif /* Py_LIMITED_API */ + +#ifndef Py_LIMITED_API +PyAPI_FUNC(PyObject *) _PyObject_GC_Malloc(size_t size); +PyAPI_FUNC(PyObject *) _PyObject_GC_Calloc(size_t size); +#endif /* !Py_LIMITED_API */ +PyAPI_FUNC(PyObject *) _PyObject_GC_New(PyTypeObject *); +PyAPI_FUNC(PyVarObject *) _PyObject_GC_NewVar(PyTypeObject *, Py_ssize_t); +PyAPI_FUNC(void) PyObject_GC_Track(void *); +PyAPI_FUNC(void) PyObject_GC_UnTrack(void *); +PyAPI_FUNC(void) PyObject_GC_Del(void *); + +#define PyObject_GC_New(type, typeobj) \ + ( (type *) _PyObject_GC_New(typeobj) ) +#define PyObject_GC_NewVar(type, typeobj, n) \ + ( (type *) _PyObject_GC_NewVar((typeobj), (n)) ) + + +/* Utility macro to help write tp_traverse functions. + * To use this macro, the tp_traverse function must name its arguments + * "visit" and "arg". This is intended to keep tp_traverse functions + * looking as much alike as possible. + */ +#define Py_VISIT(op) \ + do { \ + if (op) { \ + int vret = visit((PyObject *)(op), arg); \ + if (vret) \ + return vret; \ + } \ + } while (0) + + +/* Test if a type supports weak references */ +#define PyType_SUPPORTS_WEAKREFS(t) ((t)->tp_weaklistoffset > 0) + +#define PyObject_GET_WEAKREFS_LISTPTR(o) \ + ((PyObject **) (((char *) (o)) + Py_TYPE(o)->tp_weaklistoffset)) + +#ifdef __cplusplus +} +#endif +#endif /* !Py_OBJIMPL_H */ diff --git a/env/Include/odictobject.h b/env/Include/odictobject.h new file mode 100644 index 0000000..8378dc4 --- /dev/null +++ b/env/Include/odictobject.h @@ -0,0 +1,43 @@ +#ifndef Py_ODICTOBJECT_H +#define Py_ODICTOBJECT_H +#ifdef __cplusplus +extern "C" { +#endif + + +/* OrderedDict */ +/* This API is optional and mostly redundant. */ + +#ifndef Py_LIMITED_API + +typedef struct _odictobject PyODictObject; + +PyAPI_DATA(PyTypeObject) PyODict_Type; +PyAPI_DATA(PyTypeObject) PyODictIter_Type; +PyAPI_DATA(PyTypeObject) PyODictKeys_Type; +PyAPI_DATA(PyTypeObject) PyODictItems_Type; +PyAPI_DATA(PyTypeObject) PyODictValues_Type; + +#define PyODict_Check(op) PyObject_TypeCheck(op, &PyODict_Type) +#define PyODict_CheckExact(op) (Py_TYPE(op) == &PyODict_Type) +#define PyODict_SIZE(op) PyDict_GET_SIZE((op)) + +PyAPI_FUNC(PyObject *) PyODict_New(void); +PyAPI_FUNC(int) PyODict_SetItem(PyObject *od, PyObject *key, PyObject *item); +PyAPI_FUNC(int) PyODict_DelItem(PyObject *od, PyObject *key); + +/* wrappers around PyDict* functions */ +#define PyODict_GetItem(od, key) PyDict_GetItem((PyObject *)od, key) +#define PyODict_GetItemWithError(od, key) \ + PyDict_GetItemWithError((PyObject *)od, key) +#define PyODict_Contains(od, key) PyDict_Contains((PyObject *)od, key) +#define PyODict_Size(od) PyDict_Size((PyObject *)od) +#define PyODict_GetItemString(od, key) \ + PyDict_GetItemString((PyObject *)od, key) + +#endif + +#ifdef __cplusplus +} +#endif +#endif /* !Py_ODICTOBJECT_H */ diff --git a/env/Include/opcode.h b/env/Include/opcode.h new file mode 100644 index 0000000..fc6cbf3 --- /dev/null +++ b/env/Include/opcode.h @@ -0,0 +1,147 @@ +/* Auto-generated by Tools/scripts/generate_opcode_h.py */ +#ifndef Py_OPCODE_H +#define Py_OPCODE_H +#ifdef __cplusplus +extern "C" { +#endif + + + /* Instruction opcodes for compiled code */ +#define POP_TOP 1 +#define ROT_TWO 2 +#define ROT_THREE 3 +#define DUP_TOP 4 +#define DUP_TOP_TWO 5 +#define NOP 9 +#define UNARY_POSITIVE 10 +#define UNARY_NEGATIVE 11 +#define UNARY_NOT 12 +#define UNARY_INVERT 15 +#define BINARY_MATRIX_MULTIPLY 16 +#define INPLACE_MATRIX_MULTIPLY 17 +#define BINARY_POWER 19 +#define BINARY_MULTIPLY 20 +#define BINARY_MODULO 22 +#define BINARY_ADD 23 +#define BINARY_SUBTRACT 24 +#define BINARY_SUBSCR 25 +#define BINARY_FLOOR_DIVIDE 26 +#define BINARY_TRUE_DIVIDE 27 +#define INPLACE_FLOOR_DIVIDE 28 +#define INPLACE_TRUE_DIVIDE 29 +#define GET_AITER 50 +#define GET_ANEXT 51 +#define BEFORE_ASYNC_WITH 52 +#define INPLACE_ADD 55 +#define INPLACE_SUBTRACT 56 +#define INPLACE_MULTIPLY 57 +#define INPLACE_MODULO 59 +#define STORE_SUBSCR 60 +#define DELETE_SUBSCR 61 +#define BINARY_LSHIFT 62 +#define BINARY_RSHIFT 63 +#define BINARY_AND 64 +#define BINARY_XOR 65 +#define BINARY_OR 66 +#define INPLACE_POWER 67 +#define GET_ITER 68 +#define GET_YIELD_FROM_ITER 69 +#define PRINT_EXPR 70 +#define LOAD_BUILD_CLASS 71 +#define YIELD_FROM 72 +#define GET_AWAITABLE 73 +#define INPLACE_LSHIFT 75 +#define INPLACE_RSHIFT 76 +#define INPLACE_AND 77 +#define INPLACE_XOR 78 +#define INPLACE_OR 79 +#define BREAK_LOOP 80 +#define WITH_CLEANUP_START 81 +#define WITH_CLEANUP_FINISH 82 +#define RETURN_VALUE 83 +#define IMPORT_STAR 84 +#define SETUP_ANNOTATIONS 85 +#define YIELD_VALUE 86 +#define POP_BLOCK 87 +#define END_FINALLY 88 +#define POP_EXCEPT 89 +#define HAVE_ARGUMENT 90 +#define STORE_NAME 90 +#define DELETE_NAME 91 +#define UNPACK_SEQUENCE 92 +#define FOR_ITER 93 +#define UNPACK_EX 94 +#define STORE_ATTR 95 +#define DELETE_ATTR 96 +#define STORE_GLOBAL 97 +#define DELETE_GLOBAL 98 +#define LOAD_CONST 100 +#define LOAD_NAME 101 +#define BUILD_TUPLE 102 +#define BUILD_LIST 103 +#define BUILD_SET 104 +#define BUILD_MAP 105 +#define LOAD_ATTR 106 +#define COMPARE_OP 107 +#define IMPORT_NAME 108 +#define IMPORT_FROM 109 +#define JUMP_FORWARD 110 +#define JUMP_IF_FALSE_OR_POP 111 +#define JUMP_IF_TRUE_OR_POP 112 +#define JUMP_ABSOLUTE 113 +#define POP_JUMP_IF_FALSE 114 +#define POP_JUMP_IF_TRUE 115 +#define LOAD_GLOBAL 116 +#define CONTINUE_LOOP 119 +#define SETUP_LOOP 120 +#define SETUP_EXCEPT 121 +#define SETUP_FINALLY 122 +#define LOAD_FAST 124 +#define STORE_FAST 125 +#define DELETE_FAST 126 +#define RAISE_VARARGS 130 +#define CALL_FUNCTION 131 +#define MAKE_FUNCTION 132 +#define BUILD_SLICE 133 +#define LOAD_CLOSURE 135 +#define LOAD_DEREF 136 +#define STORE_DEREF 137 +#define DELETE_DEREF 138 +#define CALL_FUNCTION_KW 141 +#define CALL_FUNCTION_EX 142 +#define SETUP_WITH 143 +#define EXTENDED_ARG 144 +#define LIST_APPEND 145 +#define SET_ADD 146 +#define MAP_ADD 147 +#define LOAD_CLASSDEREF 148 +#define BUILD_LIST_UNPACK 149 +#define BUILD_MAP_UNPACK 150 +#define BUILD_MAP_UNPACK_WITH_CALL 151 +#define BUILD_TUPLE_UNPACK 152 +#define BUILD_SET_UNPACK 153 +#define SETUP_ASYNC_WITH 154 +#define FORMAT_VALUE 155 +#define BUILD_CONST_KEY_MAP 156 +#define BUILD_STRING 157 +#define BUILD_TUPLE_UNPACK_WITH_CALL 158 +#define LOAD_METHOD 160 +#define CALL_METHOD 161 + +/* EXCEPT_HANDLER is a special, implicit block type which is created when + entering an except handler. It is not an opcode but we define it here + as we want it to be available to both frameobject.c and ceval.c, while + remaining private.*/ +#define EXCEPT_HANDLER 257 + + +enum cmp_op {PyCmp_LT=Py_LT, PyCmp_LE=Py_LE, PyCmp_EQ=Py_EQ, PyCmp_NE=Py_NE, + PyCmp_GT=Py_GT, PyCmp_GE=Py_GE, PyCmp_IN, PyCmp_NOT_IN, + PyCmp_IS, PyCmp_IS_NOT, PyCmp_EXC_MATCH, PyCmp_BAD}; + +#define HAS_ARG(op) ((op) >= HAVE_ARGUMENT) + +#ifdef __cplusplus +} +#endif +#endif /* !Py_OPCODE_H */ diff --git a/env/Include/osdefs.h b/env/Include/osdefs.h new file mode 100644 index 0000000..bd84c1c --- /dev/null +++ b/env/Include/osdefs.h @@ -0,0 +1,47 @@ +#ifndef Py_OSDEFS_H +#define Py_OSDEFS_H +#ifdef __cplusplus +extern "C" { +#endif + + +/* Operating system dependencies */ + +#ifdef MS_WINDOWS +#define SEP L'\\' +#define ALTSEP L'/' +#define MAXPATHLEN 256 +#define DELIM L';' +#endif + +/* Filename separator */ +#ifndef SEP +#define SEP L'/' +#endif + +/* Max pathname length */ +#ifdef __hpux +#include +#include +#ifndef PATH_MAX +#define PATH_MAX MAXPATHLEN +#endif +#endif + +#ifndef MAXPATHLEN +#if defined(PATH_MAX) && PATH_MAX > 1024 +#define MAXPATHLEN PATH_MAX +#else +#define MAXPATHLEN 1024 +#endif +#endif + +/* Search path entry delimiter */ +#ifndef DELIM +#define DELIM L':' +#endif + +#ifdef __cplusplus +} +#endif +#endif /* !Py_OSDEFS_H */ diff --git a/env/Include/osmodule.h b/env/Include/osmodule.h new file mode 100644 index 0000000..9095c2f --- /dev/null +++ b/env/Include/osmodule.h @@ -0,0 +1,17 @@ + +/* os module interface */ + +#ifndef Py_OSMODULE_H +#define Py_OSMODULE_H +#ifdef __cplusplus +extern "C" { +#endif + +#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03060000 +PyAPI_FUNC(PyObject *) PyOS_FSPath(PyObject *path); +#endif + +#ifdef __cplusplus +} +#endif +#endif /* !Py_OSMODULE_H */ diff --git a/env/Include/parsetok.h b/env/Include/parsetok.h new file mode 100644 index 0000000..c9407a3 --- /dev/null +++ b/env/Include/parsetok.h @@ -0,0 +1,108 @@ + +/* Parser-tokenizer link interface */ +#ifndef Py_LIMITED_API +#ifndef Py_PARSETOK_H +#define Py_PARSETOK_H +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct { + int error; +#ifndef PGEN + /* The filename is useless for pgen, see comment in tok_state structure */ + PyObject *filename; +#endif + int lineno; + int offset; + char *text; /* UTF-8-encoded string */ + int token; + int expected; +} perrdetail; + +#if 0 +#define PyPARSE_YIELD_IS_KEYWORD 0x0001 +#endif + +#define PyPARSE_DONT_IMPLY_DEDENT 0x0002 + +#if 0 +#define PyPARSE_WITH_IS_KEYWORD 0x0003 +#define PyPARSE_PRINT_IS_FUNCTION 0x0004 +#define PyPARSE_UNICODE_LITERALS 0x0008 +#endif + +#define PyPARSE_IGNORE_COOKIE 0x0010 +#define PyPARSE_BARRY_AS_BDFL 0x0020 + +PyAPI_FUNC(node *) PyParser_ParseString(const char *, grammar *, int, + perrdetail *); +PyAPI_FUNC(node *) PyParser_ParseFile (FILE *, const char *, grammar *, int, + const char *, const char *, + perrdetail *); + +PyAPI_FUNC(node *) PyParser_ParseStringFlags(const char *, grammar *, int, + perrdetail *, int); +PyAPI_FUNC(node *) PyParser_ParseFileFlags( + FILE *fp, + const char *filename, /* decoded from the filesystem encoding */ + const char *enc, + grammar *g, + int start, + const char *ps1, + const char *ps2, + perrdetail *err_ret, + int flags); +PyAPI_FUNC(node *) PyParser_ParseFileFlagsEx( + FILE *fp, + const char *filename, /* decoded from the filesystem encoding */ + const char *enc, + grammar *g, + int start, + const char *ps1, + const char *ps2, + perrdetail *err_ret, + int *flags); +PyAPI_FUNC(node *) PyParser_ParseFileObject( + FILE *fp, + PyObject *filename, + const char *enc, + grammar *g, + int start, + const char *ps1, + const char *ps2, + perrdetail *err_ret, + int *flags); + +PyAPI_FUNC(node *) PyParser_ParseStringFlagsFilename( + const char *s, + const char *filename, /* decoded from the filesystem encoding */ + grammar *g, + int start, + perrdetail *err_ret, + int flags); +PyAPI_FUNC(node *) PyParser_ParseStringFlagsFilenameEx( + const char *s, + const char *filename, /* decoded from the filesystem encoding */ + grammar *g, + int start, + perrdetail *err_ret, + int *flags); +PyAPI_FUNC(node *) PyParser_ParseStringObject( + const char *s, + PyObject *filename, + grammar *g, + int start, + perrdetail *err_ret, + int *flags); + +/* Note that the following functions are defined in pythonrun.c, + not in parsetok.c */ +PyAPI_FUNC(void) PyParser_SetError(perrdetail *); +PyAPI_FUNC(void) PyParser_ClearError(perrdetail *); + +#ifdef __cplusplus +} +#endif +#endif /* !Py_PARSETOK_H */ +#endif /* !Py_LIMITED_API */ diff --git a/env/Include/patchlevel.h b/env/Include/patchlevel.h new file mode 100644 index 0000000..a388239 --- /dev/null +++ b/env/Include/patchlevel.h @@ -0,0 +1,35 @@ + +/* Python version identification scheme. + + When the major or minor version changes, the VERSION variable in + configure.ac must also be changed. + + There is also (independent) API version information in modsupport.h. +*/ + +/* Values for PY_RELEASE_LEVEL */ +#define PY_RELEASE_LEVEL_ALPHA 0xA +#define PY_RELEASE_LEVEL_BETA 0xB +#define PY_RELEASE_LEVEL_GAMMA 0xC /* For release candidates */ +#define PY_RELEASE_LEVEL_FINAL 0xF /* Serial should be 0 here */ + /* Higher for patch releases */ + +/* Version parsed out into numeric values */ +/*--start constants--*/ +#define PY_MAJOR_VERSION 3 +#define PY_MINOR_VERSION 7 +#define PY_MICRO_VERSION 4 +#define PY_RELEASE_LEVEL PY_RELEASE_LEVEL_FINAL +#define PY_RELEASE_SERIAL 0 + +/* Version as a string */ +#define PY_VERSION "3.7.4" +/*--end constants--*/ + +/* Version as a single 4-byte hex number, e.g. 0x010502B2 == 1.5.2b2. + Use this for numeric comparisons, e.g. #if PY_VERSION_HEX >= ... */ +#define PY_VERSION_HEX ((PY_MAJOR_VERSION << 24) | \ + (PY_MINOR_VERSION << 16) | \ + (PY_MICRO_VERSION << 8) | \ + (PY_RELEASE_LEVEL << 4) | \ + (PY_RELEASE_SERIAL << 0)) diff --git a/env/Include/pgen.h b/env/Include/pgen.h new file mode 100644 index 0000000..8a325ed --- /dev/null +++ b/env/Include/pgen.h @@ -0,0 +1,18 @@ +#ifndef Py_PGEN_H +#define Py_PGEN_H +#ifdef __cplusplus +extern "C" { +#endif + + +/* Parser generator interface */ + +extern grammar *meta_grammar(void); + +struct _node; +extern grammar *pgen(struct _node *); + +#ifdef __cplusplus +} +#endif +#endif /* !Py_PGEN_H */ diff --git a/env/Include/pgenheaders.h b/env/Include/pgenheaders.h new file mode 100644 index 0000000..dbc5e0a --- /dev/null +++ b/env/Include/pgenheaders.h @@ -0,0 +1,43 @@ +#ifndef Py_PGENHEADERS_H +#define Py_PGENHEADERS_H +#ifdef __cplusplus +extern "C" { +#endif + + +/* Include files and extern declarations used by most of the parser. */ + +#include "Python.h" + +PyAPI_FUNC(void) PySys_WriteStdout(const char *format, ...) + Py_GCC_ATTRIBUTE((format(printf, 1, 2))); +PyAPI_FUNC(void) PySys_WriteStderr(const char *format, ...) + Py_GCC_ATTRIBUTE((format(printf, 1, 2))); + +#define addarc _Py_addarc +#define addbit _Py_addbit +#define adddfa _Py_adddfa +#define addfirstsets _Py_addfirstsets +#define addlabel _Py_addlabel +#define addstate _Py_addstate +#define delbitset _Py_delbitset +#define dumptree _Py_dumptree +#define findlabel _Py_findlabel +#define freegrammar _Py_freegrammar +#define mergebitset _Py_mergebitset +#define meta_grammar _Py_meta_grammar +#define newbitset _Py_newbitset +#define newgrammar _Py_newgrammar +#define pgen _Py_pgen +#define printgrammar _Py_printgrammar +#define printnonterminals _Py_printnonterminals +#define printtree _Py_printtree +#define samebitset _Py_samebitset +#define showtree _Py_showtree +#define tok_dump _Py_tok_dump +#define translatelabels _Py_translatelabels + +#ifdef __cplusplus +} +#endif +#endif /* !Py_PGENHEADERS_H */ diff --git a/env/Include/py_curses.h b/env/Include/py_curses.h new file mode 100644 index 0000000..0eebc36 --- /dev/null +++ b/env/Include/py_curses.h @@ -0,0 +1,159 @@ + +#ifndef Py_CURSES_H +#define Py_CURSES_H + +#ifdef __APPLE__ +/* +** On Mac OS X 10.2 [n]curses.h and stdlib.h use different guards +** against multiple definition of wchar_t. +*/ +#ifdef _BSD_WCHAR_T_DEFINED_ +#define _WCHAR_T +#endif +#endif /* __APPLE__ */ + +/* On FreeBSD, [n]curses.h and stdlib.h/wchar.h use different guards + against multiple definition of wchar_t and wint_t. */ +#if defined(__FreeBSD__) && defined(_XOPEN_SOURCE_EXTENDED) +# ifndef __wchar_t +# define __wchar_t +# endif +# ifndef __wint_t +# define __wint_t +# endif +#endif + +#if !defined(HAVE_CURSES_IS_PAD) && defined(WINDOW_HAS_FLAGS) +/* The following definition is necessary for ncurses 5.7; without it, + some of [n]curses.h set NCURSES_OPAQUE to 1, and then Python + can't get at the WINDOW flags field. */ +#define NCURSES_OPAQUE 0 +#endif + +#ifdef HAVE_NCURSES_H +#include +#else +#include +#endif + +#ifdef HAVE_NCURSES_H +/* configure was checking , but we will + use , which has some or all these features. */ +#if !defined(WINDOW_HAS_FLAGS) && !(NCURSES_OPAQUE+0) +#define WINDOW_HAS_FLAGS 1 +#endif +#if !defined(HAVE_CURSES_IS_PAD) && NCURSES_VERSION_PATCH+0 >= 20090906 +#define HAVE_CURSES_IS_PAD 1 +#endif +#ifndef MVWDELCH_IS_EXPRESSION +#define MVWDELCH_IS_EXPRESSION 1 +#endif +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +#define PyCurses_API_pointers 4 + +/* Type declarations */ + +typedef struct { + PyObject_HEAD + WINDOW *win; + char *encoding; +} PyCursesWindowObject; + +#define PyCursesWindow_Check(v) (Py_TYPE(v) == &PyCursesWindow_Type) + +#define PyCurses_CAPSULE_NAME "_curses._C_API" + + +#ifdef CURSES_MODULE +/* This section is used when compiling _cursesmodule.c */ + +#else +/* This section is used in modules that use the _cursesmodule API */ + +static void **PyCurses_API; + +#define PyCursesWindow_Type (*(PyTypeObject *) PyCurses_API[0]) +#define PyCursesSetupTermCalled {if (! ((int (*)(void))PyCurses_API[1]) () ) return NULL;} +#define PyCursesInitialised {if (! ((int (*)(void))PyCurses_API[2]) () ) return NULL;} +#define PyCursesInitialisedColor {if (! ((int (*)(void))PyCurses_API[3]) () ) return NULL;} + +#define import_curses() \ + PyCurses_API = (void **)PyCapsule_Import(PyCurses_CAPSULE_NAME, 1); + +#endif + +/* general error messages */ +static const char catchall_ERR[] = "curses function returned ERR"; +static const char catchall_NULL[] = "curses function returned NULL"; + +/* Function Prototype Macros - They are ugly but very, very useful. ;-) + + X - function name + TYPE - parameter Type + ERGSTR - format string for construction of the return value + PARSESTR - format string for argument parsing + */ + +#define NoArgNoReturnFunction(X) \ +static PyObject *PyCurses_ ## X (PyObject *self) \ +{ \ + PyCursesInitialised \ + return PyCursesCheckERR(X(), # X); } + +#define NoArgOrFlagNoReturnFunction(X) \ +static PyObject *PyCurses_ ## X (PyObject *self, PyObject *args) \ +{ \ + int flag = 0; \ + PyCursesInitialised \ + switch(PyTuple_Size(args)) { \ + case 0: \ + return PyCursesCheckERR(X(), # X); \ + case 1: \ + if (!PyArg_ParseTuple(args, "i;True(1) or False(0)", &flag)) return NULL; \ + if (flag) return PyCursesCheckERR(X(), # X); \ + else return PyCursesCheckERR(no ## X (), # X); \ + default: \ + PyErr_SetString(PyExc_TypeError, # X " requires 0 or 1 arguments"); \ + return NULL; } } + +#define NoArgReturnIntFunction(X) \ +static PyObject *PyCurses_ ## X (PyObject *self) \ +{ \ + PyCursesInitialised \ + return PyLong_FromLong((long) X()); } + + +#define NoArgReturnStringFunction(X) \ +static PyObject *PyCurses_ ## X (PyObject *self) \ +{ \ + PyCursesInitialised \ + return PyBytes_FromString(X()); } + +#define NoArgTrueFalseFunction(X) \ +static PyObject *PyCurses_ ## X (PyObject *self) \ +{ \ + PyCursesInitialised \ + if (X () == FALSE) { \ + Py_RETURN_FALSE; \ + } \ + Py_RETURN_TRUE; } + +#define NoArgNoReturnVoidFunction(X) \ +static PyObject *PyCurses_ ## X (PyObject *self) \ +{ \ + PyCursesInitialised \ + X(); \ + Py_RETURN_NONE; } + +#ifdef __cplusplus +} +#endif + +#endif /* !defined(Py_CURSES_H) */ + + diff --git a/env/Include/pyarena.h b/env/Include/pyarena.h new file mode 100644 index 0000000..db3ad01 --- /dev/null +++ b/env/Include/pyarena.h @@ -0,0 +1,64 @@ +/* An arena-like memory interface for the compiler. + */ + +#ifndef Py_LIMITED_API +#ifndef Py_PYARENA_H +#define Py_PYARENA_H + +#ifdef __cplusplus +extern "C" { +#endif + + typedef struct _arena PyArena; + + /* PyArena_New() and PyArena_Free() create a new arena and free it, + respectively. Once an arena has been created, it can be used + to allocate memory via PyArena_Malloc(). Pointers to PyObject can + also be registered with the arena via PyArena_AddPyObject(), and the + arena will ensure that the PyObjects stay alive at least until + PyArena_Free() is called. When an arena is freed, all the memory it + allocated is freed, the arena releases internal references to registered + PyObject*, and none of its pointers are valid. + XXX (tim) What does "none of its pointers are valid" mean? Does it + XXX mean that pointers previously obtained via PyArena_Malloc() are + XXX no longer valid? (That's clearly true, but not sure that's what + XXX the text is trying to say.) + + PyArena_New() returns an arena pointer. On error, it + returns a negative number and sets an exception. + XXX (tim): Not true. On error, PyArena_New() actually returns NULL, + XXX and looks like it may or may not set an exception (e.g., if the + XXX internal PyList_New(0) returns NULL, PyArena_New() passes that on + XXX and an exception is set; OTOH, if the internal + XXX block_new(DEFAULT_BLOCK_SIZE) returns NULL, that's passed on but + XXX an exception is not set in that case). + */ + PyAPI_FUNC(PyArena *) PyArena_New(void); + PyAPI_FUNC(void) PyArena_Free(PyArena *); + + /* Mostly like malloc(), return the address of a block of memory spanning + * `size` bytes, or return NULL (without setting an exception) if enough + * new memory can't be obtained. Unlike malloc(0), PyArena_Malloc() with + * size=0 does not guarantee to return a unique pointer (the pointer + * returned may equal one or more other pointers obtained from + * PyArena_Malloc()). + * Note that pointers obtained via PyArena_Malloc() must never be passed to + * the system free() or realloc(), or to any of Python's similar memory- + * management functions. PyArena_Malloc()-obtained pointers remain valid + * until PyArena_Free(ar) is called, at which point all pointers obtained + * from the arena `ar` become invalid simultaneously. + */ + PyAPI_FUNC(void *) PyArena_Malloc(PyArena *, size_t size); + + /* This routine isn't a proper arena allocation routine. It takes + * a PyObject* and records it so that it can be DECREFed when the + * arena is freed. + */ + PyAPI_FUNC(int) PyArena_AddPyObject(PyArena *, PyObject *); + +#ifdef __cplusplus +} +#endif + +#endif /* !Py_PYARENA_H */ +#endif /* Py_LIMITED_API */ diff --git a/env/Include/pyatomic.h b/env/Include/pyatomic.h new file mode 100644 index 0000000..9a497a6 --- /dev/null +++ b/env/Include/pyatomic.h @@ -0,0 +1,535 @@ +#ifndef Py_ATOMIC_H +#define Py_ATOMIC_H +#ifdef Py_BUILD_CORE + +#include "dynamic_annotations.h" + +#include "pyconfig.h" + +#if defined(HAVE_STD_ATOMIC) +#include +#endif + + +#if defined(_MSC_VER) +#include +#include +#endif + +/* This is modeled after the atomics interface from C1x, according to + * the draft at + * http://www.open-std.org/JTC1/SC22/wg14/www/docs/n1425.pdf. + * Operations and types are named the same except with a _Py_ prefix + * and have the same semantics. + * + * Beware, the implementations here are deep magic. + */ + +#if defined(HAVE_STD_ATOMIC) + +typedef enum _Py_memory_order { + _Py_memory_order_relaxed = memory_order_relaxed, + _Py_memory_order_acquire = memory_order_acquire, + _Py_memory_order_release = memory_order_release, + _Py_memory_order_acq_rel = memory_order_acq_rel, + _Py_memory_order_seq_cst = memory_order_seq_cst +} _Py_memory_order; + +typedef struct _Py_atomic_address { + atomic_uintptr_t _value; +} _Py_atomic_address; + +typedef struct _Py_atomic_int { + atomic_int _value; +} _Py_atomic_int; + +#define _Py_atomic_signal_fence(/*memory_order*/ ORDER) \ + atomic_signal_fence(ORDER) + +#define _Py_atomic_thread_fence(/*memory_order*/ ORDER) \ + atomic_thread_fence(ORDER) + +#define _Py_atomic_store_explicit(ATOMIC_VAL, NEW_VAL, ORDER) \ + atomic_store_explicit(&(ATOMIC_VAL)->_value, NEW_VAL, ORDER) + +#define _Py_atomic_load_explicit(ATOMIC_VAL, ORDER) \ + atomic_load_explicit(&(ATOMIC_VAL)->_value, ORDER) + +/* Use builtin atomic operations in GCC >= 4.7 */ +#elif defined(HAVE_BUILTIN_ATOMIC) + +typedef enum _Py_memory_order { + _Py_memory_order_relaxed = __ATOMIC_RELAXED, + _Py_memory_order_acquire = __ATOMIC_ACQUIRE, + _Py_memory_order_release = __ATOMIC_RELEASE, + _Py_memory_order_acq_rel = __ATOMIC_ACQ_REL, + _Py_memory_order_seq_cst = __ATOMIC_SEQ_CST +} _Py_memory_order; + +typedef struct _Py_atomic_address { + uintptr_t _value; +} _Py_atomic_address; + +typedef struct _Py_atomic_int { + int _value; +} _Py_atomic_int; + +#define _Py_atomic_signal_fence(/*memory_order*/ ORDER) \ + __atomic_signal_fence(ORDER) + +#define _Py_atomic_thread_fence(/*memory_order*/ ORDER) \ + __atomic_thread_fence(ORDER) + +#define _Py_atomic_store_explicit(ATOMIC_VAL, NEW_VAL, ORDER) \ + (assert((ORDER) == __ATOMIC_RELAXED \ + || (ORDER) == __ATOMIC_SEQ_CST \ + || (ORDER) == __ATOMIC_RELEASE), \ + __atomic_store_n(&(ATOMIC_VAL)->_value, NEW_VAL, ORDER)) + +#define _Py_atomic_load_explicit(ATOMIC_VAL, ORDER) \ + (assert((ORDER) == __ATOMIC_RELAXED \ + || (ORDER) == __ATOMIC_SEQ_CST \ + || (ORDER) == __ATOMIC_ACQUIRE \ + || (ORDER) == __ATOMIC_CONSUME), \ + __atomic_load_n(&(ATOMIC_VAL)->_value, ORDER)) + +/* Only support GCC (for expression statements) and x86 (for simple + * atomic semantics) and MSVC x86/x64/ARM */ +#elif defined(__GNUC__) && (defined(__i386__) || defined(__amd64)) +typedef enum _Py_memory_order { + _Py_memory_order_relaxed, + _Py_memory_order_acquire, + _Py_memory_order_release, + _Py_memory_order_acq_rel, + _Py_memory_order_seq_cst +} _Py_memory_order; + +typedef struct _Py_atomic_address { + uintptr_t _value; +} _Py_atomic_address; + +typedef struct _Py_atomic_int { + int _value; +} _Py_atomic_int; + + +static __inline__ void +_Py_atomic_signal_fence(_Py_memory_order order) +{ + if (order != _Py_memory_order_relaxed) + __asm__ volatile("":::"memory"); +} + +static __inline__ void +_Py_atomic_thread_fence(_Py_memory_order order) +{ + if (order != _Py_memory_order_relaxed) + __asm__ volatile("mfence":::"memory"); +} + +/* Tell the race checker about this operation's effects. */ +static __inline__ void +_Py_ANNOTATE_MEMORY_ORDER(const volatile void *address, _Py_memory_order order) +{ + (void)address; /* shut up -Wunused-parameter */ + switch(order) { + case _Py_memory_order_release: + case _Py_memory_order_acq_rel: + case _Py_memory_order_seq_cst: + _Py_ANNOTATE_HAPPENS_BEFORE(address); + break; + case _Py_memory_order_relaxed: + case _Py_memory_order_acquire: + break; + } + switch(order) { + case _Py_memory_order_acquire: + case _Py_memory_order_acq_rel: + case _Py_memory_order_seq_cst: + _Py_ANNOTATE_HAPPENS_AFTER(address); + break; + case _Py_memory_order_relaxed: + case _Py_memory_order_release: + break; + } +} + +#define _Py_atomic_store_explicit(ATOMIC_VAL, NEW_VAL, ORDER) \ + __extension__ ({ \ + __typeof__(ATOMIC_VAL) atomic_val = ATOMIC_VAL; \ + __typeof__(atomic_val->_value) new_val = NEW_VAL;\ + volatile __typeof__(new_val) *volatile_data = &atomic_val->_value; \ + _Py_memory_order order = ORDER; \ + _Py_ANNOTATE_MEMORY_ORDER(atomic_val, order); \ + \ + /* Perform the operation. */ \ + _Py_ANNOTATE_IGNORE_WRITES_BEGIN(); \ + switch(order) { \ + case _Py_memory_order_release: \ + _Py_atomic_signal_fence(_Py_memory_order_release); \ + /* fallthrough */ \ + case _Py_memory_order_relaxed: \ + *volatile_data = new_val; \ + break; \ + \ + case _Py_memory_order_acquire: \ + case _Py_memory_order_acq_rel: \ + case _Py_memory_order_seq_cst: \ + __asm__ volatile("xchg %0, %1" \ + : "+r"(new_val) \ + : "m"(atomic_val->_value) \ + : "memory"); \ + break; \ + } \ + _Py_ANNOTATE_IGNORE_WRITES_END(); \ + }) + +#define _Py_atomic_load_explicit(ATOMIC_VAL, ORDER) \ + __extension__ ({ \ + __typeof__(ATOMIC_VAL) atomic_val = ATOMIC_VAL; \ + __typeof__(atomic_val->_value) result; \ + volatile __typeof__(result) *volatile_data = &atomic_val->_value; \ + _Py_memory_order order = ORDER; \ + _Py_ANNOTATE_MEMORY_ORDER(atomic_val, order); \ + \ + /* Perform the operation. */ \ + _Py_ANNOTATE_IGNORE_READS_BEGIN(); \ + switch(order) { \ + case _Py_memory_order_release: \ + case _Py_memory_order_acq_rel: \ + case _Py_memory_order_seq_cst: \ + /* Loads on x86 are not releases by default, so need a */ \ + /* thread fence. */ \ + _Py_atomic_thread_fence(_Py_memory_order_release); \ + break; \ + default: \ + /* No fence */ \ + break; \ + } \ + result = *volatile_data; \ + switch(order) { \ + case _Py_memory_order_acquire: \ + case _Py_memory_order_acq_rel: \ + case _Py_memory_order_seq_cst: \ + /* Loads on x86 are automatically acquire operations so */ \ + /* can get by with just a compiler fence. */ \ + _Py_atomic_signal_fence(_Py_memory_order_acquire); \ + break; \ + default: \ + /* No fence */ \ + break; \ + } \ + _Py_ANNOTATE_IGNORE_READS_END(); \ + result; \ + }) + +#elif defined(_MSC_VER) +/* _Interlocked* functions provide a full memory barrier and are therefore + enough for acq_rel and seq_cst. If the HLE variants aren't available + in hardware they will fall back to a full memory barrier as well. + + This might affect performance but likely only in some very specific and + hard to meassure scenario. +*/ +#if defined(_M_IX86) || defined(_M_X64) +typedef enum _Py_memory_order { + _Py_memory_order_relaxed, + _Py_memory_order_acquire, + _Py_memory_order_release, + _Py_memory_order_acq_rel, + _Py_memory_order_seq_cst +} _Py_memory_order; + +typedef struct _Py_atomic_address { + volatile uintptr_t _value; +} _Py_atomic_address; + +typedef struct _Py_atomic_int { + volatile int _value; +} _Py_atomic_int; + + +#if defined(_M_X64) +#define _Py_atomic_store_64bit(ATOMIC_VAL, NEW_VAL, ORDER) \ + switch (ORDER) { \ + case _Py_memory_order_acquire: \ + _InterlockedExchange64_HLEAcquire((__int64 volatile*)ATOMIC_VAL, (__int64)NEW_VAL); \ + break; \ + case _Py_memory_order_release: \ + _InterlockedExchange64_HLERelease((__int64 volatile*)ATOMIC_VAL, (__int64)NEW_VAL); \ + break; \ + default: \ + _InterlockedExchange64((__int64 volatile*)ATOMIC_VAL, (__int64)NEW_VAL); \ + break; \ + } +#else +#define _Py_atomic_store_64bit(ATOMIC_VAL, NEW_VAL, ORDER) ((void)0); +#endif + +#define _Py_atomic_store_32bit(ATOMIC_VAL, NEW_VAL, ORDER) \ + switch (ORDER) { \ + case _Py_memory_order_acquire: \ + _InterlockedExchange_HLEAcquire((volatile long*)ATOMIC_VAL, (int)NEW_VAL); \ + break; \ + case _Py_memory_order_release: \ + _InterlockedExchange_HLERelease((volatile long*)ATOMIC_VAL, (int)NEW_VAL); \ + break; \ + default: \ + _InterlockedExchange((volatile long*)ATOMIC_VAL, (int)NEW_VAL); \ + break; \ + } + +#if defined(_M_X64) +/* This has to be an intptr_t for now. + gil_created() uses -1 as a sentinel value, if this returns + a uintptr_t it will do an unsigned compare and crash +*/ +inline intptr_t _Py_atomic_load_64bit(volatile uintptr_t* value, int order) { + __int64 old; + switch (order) { + case _Py_memory_order_acquire: + { + do { + old = *value; + } while(_InterlockedCompareExchange64_HLEAcquire((volatile __int64*)value, old, old) != old); + break; + } + case _Py_memory_order_release: + { + do { + old = *value; + } while(_InterlockedCompareExchange64_HLERelease((volatile __int64*)value, old, old) != old); + break; + } + case _Py_memory_order_relaxed: + old = *value; + break; + default: + { + do { + old = *value; + } while(_InterlockedCompareExchange64((volatile __int64*)value, old, old) != old); + break; + } + } + return old; +} + +#else +#define _Py_atomic_load_64bit(ATOMIC_VAL, ORDER) *ATOMIC_VAL +#endif + +inline int _Py_atomic_load_32bit(volatile int* value, int order) { + long old; + switch (order) { + case _Py_memory_order_acquire: + { + do { + old = *value; + } while(_InterlockedCompareExchange_HLEAcquire((volatile long*)value, old, old) != old); + break; + } + case _Py_memory_order_release: + { + do { + old = *value; + } while(_InterlockedCompareExchange_HLERelease((volatile long*)value, old, old) != old); + break; + } + case _Py_memory_order_relaxed: + old = *value; + break; + default: + { + do { + old = *value; + } while(_InterlockedCompareExchange((volatile long*)value, old, old) != old); + break; + } + } + return old; +} + +#define _Py_atomic_store_explicit(ATOMIC_VAL, NEW_VAL, ORDER) \ + if (sizeof(*ATOMIC_VAL._value) == 8) { \ + _Py_atomic_store_64bit((volatile long long*)ATOMIC_VAL._value, NEW_VAL, ORDER) } else { \ + _Py_atomic_store_32bit((volatile long*)ATOMIC_VAL._value, NEW_VAL, ORDER) } + +#define _Py_atomic_load_explicit(ATOMIC_VAL, ORDER) \ + ( \ + sizeof(*(ATOMIC_VAL._value)) == 8 ? \ + _Py_atomic_load_64bit((volatile long long*)ATOMIC_VAL._value, ORDER) : \ + _Py_atomic_load_32bit((volatile long*)ATOMIC_VAL._value, ORDER) \ + ) +#elif defined(_M_ARM) || defined(_M_ARM64) +typedef enum _Py_memory_order { + _Py_memory_order_relaxed, + _Py_memory_order_acquire, + _Py_memory_order_release, + _Py_memory_order_acq_rel, + _Py_memory_order_seq_cst +} _Py_memory_order; + +typedef struct _Py_atomic_address { + volatile uintptr_t _value; +} _Py_atomic_address; + +typedef struct _Py_atomic_int { + volatile int _value; +} _Py_atomic_int; + + +#if defined(_M_ARM64) +#define _Py_atomic_store_64bit(ATOMIC_VAL, NEW_VAL, ORDER) \ + switch (ORDER) { \ + case _Py_memory_order_acquire: \ + _InterlockedExchange64_acq((__int64 volatile*)ATOMIC_VAL, (__int64)NEW_VAL); \ + break; \ + case _Py_memory_order_release: \ + _InterlockedExchange64_rel((__int64 volatile*)ATOMIC_VAL, (__int64)NEW_VAL); \ + break; \ + default: \ + _InterlockedExchange64((__int64 volatile*)ATOMIC_VAL, (__int64)NEW_VAL); \ + break; \ + } +#else +#define _Py_atomic_store_64bit(ATOMIC_VAL, NEW_VAL, ORDER) ((void)0); +#endif + +#define _Py_atomic_store_32bit(ATOMIC_VAL, NEW_VAL, ORDER) \ + switch (ORDER) { \ + case _Py_memory_order_acquire: \ + _InterlockedExchange_acq((volatile long*)ATOMIC_VAL, (int)NEW_VAL); \ + break; \ + case _Py_memory_order_release: \ + _InterlockedExchange_rel((volatile long*)ATOMIC_VAL, (int)NEW_VAL); \ + break; \ + default: \ + _InterlockedExchange((volatile long*)ATOMIC_VAL, (int)NEW_VAL); \ + break; \ + } + +#if defined(_M_ARM64) +/* This has to be an intptr_t for now. + gil_created() uses -1 as a sentinel value, if this returns + a uintptr_t it will do an unsigned compare and crash +*/ +inline intptr_t _Py_atomic_load_64bit(volatile uintptr_t* value, int order) { + uintptr_t old; + switch (order) { + case _Py_memory_order_acquire: + { + do { + old = *value; + } while(_InterlockedCompareExchange64_acq(value, old, old) != old); + break; + } + case _Py_memory_order_release: + { + do { + old = *value; + } while(_InterlockedCompareExchange64_rel(value, old, old) != old); + break; + } + case _Py_memory_order_relaxed: + old = *value; + break; + default: + { + do { + old = *value; + } while(_InterlockedCompareExchange64(value, old, old) != old); + break; + } + } + return old; +} + +#else +#define _Py_atomic_load_64bit(ATOMIC_VAL, ORDER) *ATOMIC_VAL +#endif + +inline int _Py_atomic_load_32bit(volatile int* value, int order) { + int old; + switch (order) { + case _Py_memory_order_acquire: + { + do { + old = *value; + } while(_InterlockedCompareExchange_acq(value, old, old) != old); + break; + } + case _Py_memory_order_release: + { + do { + old = *value; + } while(_InterlockedCompareExchange_rel(value, old, old) != old); + break; + } + case _Py_memory_order_relaxed: + old = *value; + break; + default: + { + do { + old = *value; + } while(_InterlockedCompareExchange(value, old, old) != old); + break; + } + } + return old; +} + +#define _Py_atomic_store_explicit(ATOMIC_VAL, NEW_VAL, ORDER) \ + if (sizeof(*ATOMIC_VAL._value) == 8) { \ + _Py_atomic_store_64bit(ATOMIC_VAL._value, NEW_VAL, ORDER) } else { \ + _Py_atomic_store_32bit(ATOMIC_VAL._value, NEW_VAL, ORDER) } + +#define _Py_atomic_load_explicit(ATOMIC_VAL, ORDER) \ + ( \ + sizeof(*(ATOMIC_VAL._value)) == 8 ? \ + _Py_atomic_load_64bit(ATOMIC_VAL._value, ORDER) : \ + _Py_atomic_load_32bit(ATOMIC_VAL._value, ORDER) \ + ) +#endif +#else /* !gcc x86 !_msc_ver */ +typedef enum _Py_memory_order { + _Py_memory_order_relaxed, + _Py_memory_order_acquire, + _Py_memory_order_release, + _Py_memory_order_acq_rel, + _Py_memory_order_seq_cst +} _Py_memory_order; + +typedef struct _Py_atomic_address { + uintptr_t _value; +} _Py_atomic_address; + +typedef struct _Py_atomic_int { + int _value; +} _Py_atomic_int; +/* Fall back to other compilers and processors by assuming that simple + volatile accesses are atomic. This is false, so people should port + this. */ +#define _Py_atomic_signal_fence(/*memory_order*/ ORDER) ((void)0) +#define _Py_atomic_thread_fence(/*memory_order*/ ORDER) ((void)0) +#define _Py_atomic_store_explicit(ATOMIC_VAL, NEW_VAL, ORDER) \ + ((ATOMIC_VAL)->_value = NEW_VAL) +#define _Py_atomic_load_explicit(ATOMIC_VAL, ORDER) \ + ((ATOMIC_VAL)->_value) +#endif + +/* Standardized shortcuts. */ +#define _Py_atomic_store(ATOMIC_VAL, NEW_VAL) \ + _Py_atomic_store_explicit(ATOMIC_VAL, NEW_VAL, _Py_memory_order_seq_cst) +#define _Py_atomic_load(ATOMIC_VAL) \ + _Py_atomic_load_explicit(ATOMIC_VAL, _Py_memory_order_seq_cst) + +/* Python-local extensions */ + +#define _Py_atomic_store_relaxed(ATOMIC_VAL, NEW_VAL) \ + _Py_atomic_store_explicit(ATOMIC_VAL, NEW_VAL, _Py_memory_order_relaxed) +#define _Py_atomic_load_relaxed(ATOMIC_VAL) \ + _Py_atomic_load_explicit(ATOMIC_VAL, _Py_memory_order_relaxed) +#endif /* Py_BUILD_CORE */ +#endif /* Py_ATOMIC_H */ diff --git a/env/Include/pycapsule.h b/env/Include/pycapsule.h new file mode 100644 index 0000000..d9ecda7 --- /dev/null +++ b/env/Include/pycapsule.h @@ -0,0 +1,59 @@ + +/* Capsule objects let you wrap a C "void *" pointer in a Python + object. They're a way of passing data through the Python interpreter + without creating your own custom type. + + Capsules are used for communication between extension modules. + They provide a way for an extension module to export a C interface + to other extension modules, so that extension modules can use the + Python import mechanism to link to one another. + + For more information, please see "c-api/capsule.html" in the + documentation. +*/ + +#ifndef Py_CAPSULE_H +#define Py_CAPSULE_H +#ifdef __cplusplus +extern "C" { +#endif + +PyAPI_DATA(PyTypeObject) PyCapsule_Type; + +typedef void (*PyCapsule_Destructor)(PyObject *); + +#define PyCapsule_CheckExact(op) (Py_TYPE(op) == &PyCapsule_Type) + + +PyAPI_FUNC(PyObject *) PyCapsule_New( + void *pointer, + const char *name, + PyCapsule_Destructor destructor); + +PyAPI_FUNC(void *) PyCapsule_GetPointer(PyObject *capsule, const char *name); + +PyAPI_FUNC(PyCapsule_Destructor) PyCapsule_GetDestructor(PyObject *capsule); + +PyAPI_FUNC(const char *) PyCapsule_GetName(PyObject *capsule); + +PyAPI_FUNC(void *) PyCapsule_GetContext(PyObject *capsule); + +PyAPI_FUNC(int) PyCapsule_IsValid(PyObject *capsule, const char *name); + +PyAPI_FUNC(int) PyCapsule_SetPointer(PyObject *capsule, void *pointer); + +PyAPI_FUNC(int) PyCapsule_SetDestructor(PyObject *capsule, PyCapsule_Destructor destructor); + +PyAPI_FUNC(int) PyCapsule_SetName(PyObject *capsule, const char *name); + +PyAPI_FUNC(int) PyCapsule_SetContext(PyObject *capsule, void *context); + +PyAPI_FUNC(void *) PyCapsule_Import( + const char *name, /* UTF-8 encoded string */ + int no_block); + + +#ifdef __cplusplus +} +#endif +#endif /* !Py_CAPSULE_H */ diff --git a/env/Include/pyconfig.h b/env/Include/pyconfig.h new file mode 100644 index 0000000..46fc84e --- /dev/null +++ b/env/Include/pyconfig.h @@ -0,0 +1,680 @@ +#ifndef Py_CONFIG_H +#define Py_CONFIG_H + +/* pyconfig.h. NOT Generated automatically by configure. + +This is a manually maintained version used for the Watcom, +Borland and Microsoft Visual C++ compilers. It is a +standard part of the Python distribution. + +WINDOWS DEFINES: +The code specific to Windows should be wrapped around one of +the following #defines + +MS_WIN64 - Code specific to the MS Win64 API +MS_WIN32 - Code specific to the MS Win32 (and Win64) API (obsolete, this covers all supported APIs) +MS_WINDOWS - Code specific to Windows, but all versions. +Py_ENABLE_SHARED - Code if the Python core is built as a DLL. + +Also note that neither "_M_IX86" or "_MSC_VER" should be used for +any purpose other than "Windows Intel x86 specific" and "Microsoft +compiler specific". Therefore, these should be very rare. + + +NOTE: The following symbols are deprecated: +NT, USE_DL_EXPORT, USE_DL_IMPORT, DL_EXPORT, DL_IMPORT +MS_CORE_DLL. + +WIN32 is still required for the locale module. + +*/ + +/* Deprecated USE_DL_EXPORT macro - please use Py_BUILD_CORE */ +#ifdef USE_DL_EXPORT +# define Py_BUILD_CORE +#endif /* USE_DL_EXPORT */ + +/* Visual Studio 2005 introduces deprecation warnings for + "insecure" and POSIX functions. The insecure functions should + be replaced by *_s versions (according to Microsoft); the + POSIX functions by _* versions (which, according to Microsoft, + would be ISO C conforming). Neither renaming is feasible, so + we just silence the warnings. */ + +#ifndef _CRT_SECURE_NO_DEPRECATE +#define _CRT_SECURE_NO_DEPRECATE 1 +#endif +#ifndef _CRT_NONSTDC_NO_DEPRECATE +#define _CRT_NONSTDC_NO_DEPRECATE 1 +#endif + +#define HAVE_IO_H +#define HAVE_SYS_UTIME_H +#define HAVE_TEMPNAM +#define HAVE_TMPFILE +#define HAVE_TMPNAM +#define HAVE_CLOCK +#define HAVE_STRERROR + +#include + +#define HAVE_HYPOT +#define HAVE_STRFTIME +#define DONT_HAVE_SIG_ALARM +#define DONT_HAVE_SIG_PAUSE +#define LONG_BIT 32 +#define WORD_BIT 32 + +#define MS_WIN32 /* only support win32 and greater. */ +#define MS_WINDOWS +#ifndef PYTHONPATH +# define PYTHONPATH L".\\DLLs;.\\lib" +#endif +#define NT_THREADS +#define WITH_THREAD +#ifndef NETSCAPE_PI +#define USE_SOCKET +#endif + + +/* Compiler specific defines */ + +/* ------------------------------------------------------------------------*/ +/* Microsoft C defines _MSC_VER */ +#ifdef _MSC_VER + +/* We want COMPILER to expand to a string containing _MSC_VER's *value*. + * This is horridly tricky, because the stringization operator only works + * on macro arguments, and doesn't evaluate macros passed *as* arguments. + * Attempts simpler than the following appear doomed to produce "_MSC_VER" + * literally in the string. + */ +#define _Py_PASTE_VERSION(SUFFIX) \ + ("[MSC v." _Py_STRINGIZE(_MSC_VER) " " SUFFIX "]") +/* e.g., this produces, after compile-time string catenation, + * ("[MSC v.1200 32 bit (Intel)]") + * + * _Py_STRINGIZE(_MSC_VER) expands to + * _Py_STRINGIZE1((_MSC_VER)) expands to + * _Py_STRINGIZE2(_MSC_VER) but as this call is the result of token-pasting + * it's scanned again for macros and so further expands to (under MSVC 6) + * _Py_STRINGIZE2(1200) which then expands to + * "1200" + */ +#define _Py_STRINGIZE(X) _Py_STRINGIZE1((X)) +#define _Py_STRINGIZE1(X) _Py_STRINGIZE2 ## X +#define _Py_STRINGIZE2(X) #X + +/* MSVC defines _WINxx to differentiate the windows platform types + + Note that for compatibility reasons _WIN32 is defined on Win32 + *and* on Win64. For the same reasons, in Python, MS_WIN32 is + defined on Win32 *and* Win64. Win32 only code must therefore be + guarded as follows: + #if defined(MS_WIN32) && !defined(MS_WIN64) +*/ +#ifdef _WIN64 +#define MS_WIN64 +#endif + +/* set the COMPILER */ +#ifdef MS_WIN64 +#if defined(_M_X64) || defined(_M_AMD64) +#if defined(__INTEL_COMPILER) +#define COMPILER ("[ICC v." _Py_STRINGIZE(__INTEL_COMPILER) " 64 bit (amd64) with MSC v." _Py_STRINGIZE(_MSC_VER) " CRT]") +#else +#define COMPILER _Py_PASTE_VERSION("64 bit (AMD64)") +#endif /* __INTEL_COMPILER */ +#define PYD_PLATFORM_TAG "win_amd64" +#else +#define COMPILER _Py_PASTE_VERSION("64 bit (Unknown)") +#endif +#endif /* MS_WIN64 */ + +/* set the version macros for the windows headers */ +/* Python 3.5+ requires Windows Vista or greater */ +#define Py_WINVER 0x0600 /* _WIN32_WINNT_VISTA */ +#define Py_NTDDI NTDDI_VISTA + +/* We only set these values when building Python - we don't want to force + these values on extensions, as that will affect the prototypes and + structures exposed in the Windows headers. Even when building Python, we + allow a single source file to override this - they may need access to + structures etc so it can optionally use new Windows features if it + determines at runtime they are available. +*/ +#if defined(Py_BUILD_CORE) || defined(Py_BUILD_CORE_BUILTIN) || defined(Py_BUILD_CORE_MODULE) +#ifndef NTDDI_VERSION +#define NTDDI_VERSION Py_NTDDI +#endif +#ifndef WINVER +#define WINVER Py_WINVER +#endif +#ifndef _WIN32_WINNT +#define _WIN32_WINNT Py_WINVER +#endif +#endif + +/* _W64 is not defined for VC6 or eVC4 */ +#ifndef _W64 +#define _W64 +#endif + +/* Define like size_t, omitting the "unsigned" */ +#ifdef MS_WIN64 +typedef __int64 ssize_t; +#else +typedef _W64 int ssize_t; +#endif +#define HAVE_SSIZE_T 1 + +#if defined(MS_WIN32) && !defined(MS_WIN64) +#if defined(_M_IX86) +#if defined(__INTEL_COMPILER) +#define COMPILER ("[ICC v." _Py_STRINGIZE(__INTEL_COMPILER) " 32 bit (Intel) with MSC v." _Py_STRINGIZE(_MSC_VER) " CRT]") +#else +#define COMPILER _Py_PASTE_VERSION("32 bit (Intel)") +#endif /* __INTEL_COMPILER */ +#define PYD_PLATFORM_TAG "win32" +#elif defined(_M_ARM) +#define COMPILER _Py_PASTE_VERSION("32 bit (ARM)") +#define PYD_PLATFORM_TAG "win_arm" +#else +#define COMPILER _Py_PASTE_VERSION("32 bit (Unknown)") +#endif +#endif /* MS_WIN32 && !MS_WIN64 */ + +typedef int pid_t; + +#include +#define Py_IS_NAN _isnan +#define Py_IS_INFINITY(X) (!_finite(X) && !_isnan(X)) +#define Py_IS_FINITE(X) _finite(X) +#define copysign _copysign + +/* Side by Side assemblies supported in VS 2005 and VS 2008 but not 2010*/ +#if _MSC_VER >= 1400 && _MSC_VER < 1600 +#define HAVE_SXS 1 +#endif + +/* define some ANSI types that are not defined in earlier Win headers */ +#if _MSC_VER >= 1200 +/* This file only exists in VC 6.0 or higher */ +#include +#endif + +#endif /* _MSC_VER */ + +/* ------------------------------------------------------------------------*/ +/* egcs/gnu-win32 defines __GNUC__ and _WIN32 */ +#if defined(__GNUC__) && defined(_WIN32) +/* XXX These defines are likely incomplete, but should be easy to fix. + They should be complete enough to build extension modules. */ +/* Suggested by Rene Liebscher to avoid a GCC 2.91.* + bug that requires structure imports. More recent versions of the + compiler don't exhibit this bug. +*/ +#if (__GNUC__==2) && (__GNUC_MINOR__<=91) +#warning "Please use an up-to-date version of gcc! (>2.91 recommended)" +#endif + +#define COMPILER "[gcc]" +#define PY_LONG_LONG long long +#define PY_LLONG_MIN LLONG_MIN +#define PY_LLONG_MAX LLONG_MAX +#define PY_ULLONG_MAX ULLONG_MAX +#endif /* GNUC */ + +/* ------------------------------------------------------------------------*/ +/* lcc-win32 defines __LCC__ */ +#if defined(__LCC__) +/* XXX These defines are likely incomplete, but should be easy to fix. + They should be complete enough to build extension modules. */ + +#define COMPILER "[lcc-win32]" +typedef int pid_t; +/* __declspec() is supported here too - do nothing to get the defaults */ + +#endif /* LCC */ + +/* ------------------------------------------------------------------------*/ +/* End of compilers - finish up */ + +#ifndef NO_STDIO_H +# include +#endif + +/* 64 bit ints are usually spelt __int64 unless compiler has overridden */ +#ifndef PY_LONG_LONG +# define PY_LONG_LONG __int64 +# define PY_LLONG_MAX _I64_MAX +# define PY_LLONG_MIN _I64_MIN +# define PY_ULLONG_MAX _UI64_MAX +#endif + +/* For Windows the Python core is in a DLL by default. Test +Py_NO_ENABLE_SHARED to find out. Also support MS_NO_COREDLL for b/w compat */ +#if !defined(MS_NO_COREDLL) && !defined(Py_NO_ENABLE_SHARED) +# define Py_ENABLE_SHARED 1 /* standard symbol for shared library */ +# define MS_COREDLL /* deprecated old symbol */ +#endif /* !MS_NO_COREDLL && ... */ + +/* All windows compilers that use this header support __declspec */ +#define HAVE_DECLSPEC_DLL + +/* For an MSVC DLL, we can nominate the .lib files used by extensions */ +#ifdef MS_COREDLL +# if !defined(Py_BUILD_CORE) && !defined(Py_BUILD_CORE_BUILTIN) + /* not building the core - must be an ext */ +# if defined(_MSC_VER) + /* So MSVC users need not specify the .lib + file in their Makefile (other compilers are + generally taken care of by distutils.) */ +# if defined(_DEBUG) +# pragma comment(lib,"python37_d.lib") +# elif defined(Py_LIMITED_API) +# pragma comment(lib,"python3.lib") +# else +# pragma comment(lib,"python37.lib") +# endif /* _DEBUG */ +# endif /* _MSC_VER */ +# endif /* Py_BUILD_CORE */ +#endif /* MS_COREDLL */ + +#if defined(MS_WIN64) +/* maintain "win32" sys.platform for backward compatibility of Python code, + the Win64 API should be close enough to the Win32 API to make this + preferable */ +# define PLATFORM "win32" +# define SIZEOF_VOID_P 8 +# define SIZEOF_TIME_T 8 +# define SIZEOF_OFF_T 4 +# define SIZEOF_FPOS_T 8 +# define SIZEOF_HKEY 8 +# define SIZEOF_SIZE_T 8 +/* configure.ac defines HAVE_LARGEFILE_SUPPORT iff HAVE_LONG_LONG, + sizeof(off_t) > sizeof(long), and sizeof(PY_LONG_LONG) >= sizeof(off_t). + On Win64 the second condition is not true, but if fpos_t replaces off_t + then this is true. The uses of HAVE_LARGEFILE_SUPPORT imply that Win64 + should define this. */ +# define HAVE_LARGEFILE_SUPPORT +#elif defined(MS_WIN32) +# define PLATFORM "win32" +# define HAVE_LARGEFILE_SUPPORT +# define SIZEOF_VOID_P 4 +# define SIZEOF_OFF_T 4 +# define SIZEOF_FPOS_T 8 +# define SIZEOF_HKEY 4 +# define SIZEOF_SIZE_T 4 + /* MS VS2005 changes time_t to a 64-bit type on all platforms */ +# if defined(_MSC_VER) && _MSC_VER >= 1400 +# define SIZEOF_TIME_T 8 +# else +# define SIZEOF_TIME_T 4 +# endif +#endif + +#ifdef _DEBUG +# define Py_DEBUG +#endif + + +#ifdef MS_WIN32 + +#define SIZEOF_SHORT 2 +#define SIZEOF_INT 4 +#define SIZEOF_LONG 4 +#define SIZEOF_LONG_LONG 8 +#define SIZEOF_DOUBLE 8 +#define SIZEOF_FLOAT 4 + +/* VC 7.1 has them and VC 6.0 does not. VC 6.0 has a version number of 1200. + Microsoft eMbedded Visual C++ 4.0 has a version number of 1201 and doesn't + define these. + If some compiler does not provide them, modify the #if appropriately. */ +#if defined(_MSC_VER) +#if _MSC_VER > 1300 +#define HAVE_UINTPTR_T 1 +#define HAVE_INTPTR_T 1 +#else +/* VC6, VS 2002 and eVC4 don't support the C99 LL suffix for 64-bit integer literals */ +#define Py_LL(x) x##I64 +#endif /* _MSC_VER > 1300 */ +#endif /* _MSC_VER */ + +#endif + +/* define signed and unsigned exact-width 32-bit and 64-bit types, used in the + implementation of Python integers. */ +#define PY_UINT32_T uint32_t +#define PY_UINT64_T uint64_t +#define PY_INT32_T int32_t +#define PY_INT64_T int64_t + +/* Fairly standard from here! */ + +/* Define to 1 if you have the `copysign' function. */ +#define HAVE_COPYSIGN 1 + +/* Define to 1 if you have the `round' function. */ +#if _MSC_VER >= 1800 +#define HAVE_ROUND 1 +#endif + +/* Define to 1 if you have the `isinf' macro. */ +#define HAVE_DECL_ISINF 1 + +/* Define to 1 if you have the `isnan' function. */ +#define HAVE_DECL_ISNAN 1 + +/* Define if on AIX 3. + System headers sometimes define this. + We just want to avoid a redefinition error message. */ +#ifndef _ALL_SOURCE +/* #undef _ALL_SOURCE */ +#endif + +/* Define to empty if the keyword does not work. */ +/* #define const */ + +/* Define to 1 if you have the header file. */ +#define HAVE_CONIO_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_DIRECT_H 1 + +/* Define if you have dirent.h. */ +/* #define DIRENT 1 */ + +/* Define to the type of elements in the array set by `getgroups'. + Usually this is either `int' or `gid_t'. */ +/* #undef GETGROUPS_T */ + +/* Define to `int' if doesn't define. */ +/* #undef gid_t */ + +/* Define if your struct tm has tm_zone. */ +/* #undef HAVE_TM_ZONE */ + +/* Define if you don't have tm_zone but do have the external array + tzname. */ +#define HAVE_TZNAME + +/* Define to `int' if doesn't define. */ +/* #undef mode_t */ + +/* Define if you don't have dirent.h, but have ndir.h. */ +/* #undef NDIR */ + +/* Define to `long' if doesn't define. */ +/* #undef off_t */ + +/* Define to `int' if doesn't define. */ +/* #undef pid_t */ + +/* Define if the system does not provide POSIX.1 features except + with this defined. */ +/* #undef _POSIX_1_SOURCE */ + +/* Define if you need to in order for stat and other things to work. */ +/* #undef _POSIX_SOURCE */ + +/* Define as the return type of signal handlers (int or void). */ +#define RETSIGTYPE void + +/* Define to `unsigned' if doesn't define. */ +/* #undef size_t */ + +/* Define if you have the ANSI C header files. */ +#define STDC_HEADERS 1 + +/* Define if you don't have dirent.h, but have sys/dir.h. */ +/* #undef SYSDIR */ + +/* Define if you don't have dirent.h, but have sys/ndir.h. */ +/* #undef SYSNDIR */ + +/* Define if you can safely include both and . */ +/* #undef TIME_WITH_SYS_TIME */ + +/* Define if your declares struct tm. */ +/* #define TM_IN_SYS_TIME 1 */ + +/* Define to `int' if doesn't define. */ +/* #undef uid_t */ + +/* Define if the closedir function returns void instead of int. */ +/* #undef VOID_CLOSEDIR */ + +/* Define if getpgrp() must be called as getpgrp(0) + and (consequently) setpgrp() as setpgrp(0, 0). */ +/* #undef GETPGRP_HAVE_ARGS */ + +/* Define this if your time.h defines altzone */ +/* #define HAVE_ALTZONE */ + +/* Define if you have the putenv function. */ +#define HAVE_PUTENV + +/* Define if your compiler supports function prototypes */ +#define HAVE_PROTOTYPES + +/* Define if you can safely include both and + (which you can't on SCO ODT 3.0). */ +/* #undef SYS_SELECT_WITH_SYS_TIME */ + +/* Define if you want documentation strings in extension modules */ +#define WITH_DOC_STRINGS 1 + +/* Define if you want to compile in rudimentary thread support */ +/* #undef WITH_THREAD */ + +/* Define if you want to use the GNU readline library */ +/* #define WITH_READLINE 1 */ + +/* Use Python's own small-block memory-allocator. */ +#define WITH_PYMALLOC 1 + +/* Define if you have clock. */ +/* #define HAVE_CLOCK */ + +/* Define when any dynamic module loading is enabled */ +#define HAVE_DYNAMIC_LOADING + +/* Define if you have ftime. */ +#define HAVE_FTIME + +/* Define if you have getpeername. */ +#define HAVE_GETPEERNAME + +/* Define if you have getpgrp. */ +/* #undef HAVE_GETPGRP */ + +/* Define if you have getpid. */ +#define HAVE_GETPID + +/* Define if you have gettimeofday. */ +/* #undef HAVE_GETTIMEOFDAY */ + +/* Define if you have getwd. */ +/* #undef HAVE_GETWD */ + +/* Define if you have lstat. */ +/* #undef HAVE_LSTAT */ + +/* Define if you have the mktime function. */ +#define HAVE_MKTIME + +/* Define if you have nice. */ +/* #undef HAVE_NICE */ + +/* Define if you have readlink. */ +/* #undef HAVE_READLINK */ + +/* Define if you have setpgid. */ +/* #undef HAVE_SETPGID */ + +/* Define if you have setpgrp. */ +/* #undef HAVE_SETPGRP */ + +/* Define if you have setsid. */ +/* #undef HAVE_SETSID */ + +/* Define if you have setvbuf. */ +#define HAVE_SETVBUF + +/* Define if you have siginterrupt. */ +/* #undef HAVE_SIGINTERRUPT */ + +/* Define if you have symlink. */ +/* #undef HAVE_SYMLINK */ + +/* Define if you have tcgetpgrp. */ +/* #undef HAVE_TCGETPGRP */ + +/* Define if you have tcsetpgrp. */ +/* #undef HAVE_TCSETPGRP */ + +/* Define if you have times. */ +/* #undef HAVE_TIMES */ + +/* Define if you have uname. */ +/* #undef HAVE_UNAME */ + +/* Define if you have waitpid. */ +/* #undef HAVE_WAITPID */ + +/* Define to 1 if you have the `wcsftime' function. */ +#if defined(_MSC_VER) && _MSC_VER >= 1310 +#define HAVE_WCSFTIME 1 +#endif + +/* Define to 1 if you have the `wcscoll' function. */ +#define HAVE_WCSCOLL 1 + +/* Define to 1 if you have the `wcsxfrm' function. */ +#define HAVE_WCSXFRM 1 + +/* Define if the zlib library has inflateCopy */ +#define HAVE_ZLIB_COPY 1 + +/* Define if you have the header file. */ +/* #undef HAVE_DLFCN_H */ + +/* Define to 1 if you have the header file. */ +#define HAVE_ERRNO_H 1 + +/* Define if you have the header file. */ +#define HAVE_FCNTL_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_PROCESS_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_SIGNAL_H 1 + +/* Define if you have the prototypes. */ +#define HAVE_STDARG_PROTOTYPES + +/* Define if you have the header file. */ +#define HAVE_STDDEF_H 1 + +/* Define if you have the header file. */ +/* #undef HAVE_SYS_AUDIOIO_H */ + +/* Define if you have the header file. */ +/* #define HAVE_SYS_PARAM_H 1 */ + +/* Define if you have the header file. */ +/* #define HAVE_SYS_SELECT_H 1 */ + +/* Define to 1 if you have the header file. */ +#define HAVE_SYS_STAT_H 1 + +/* Define if you have the header file. */ +/* #define HAVE_SYS_TIME_H 1 */ + +/* Define if you have the header file. */ +/* #define HAVE_SYS_TIMES_H 1 */ + +/* Define to 1 if you have the header file. */ +#define HAVE_SYS_TYPES_H 1 + +/* Define if you have the header file. */ +/* #define HAVE_SYS_UN_H 1 */ + +/* Define if you have the header file. */ +/* #define HAVE_SYS_UTIME_H 1 */ + +/* Define if you have the header file. */ +/* #define HAVE_SYS_UTSNAME_H 1 */ + +/* Define if you have the header file. */ +/* #define HAVE_UNISTD_H 1 */ + +/* Define if you have the header file. */ +/* #define HAVE_UTIME_H 1 */ + +/* Define if the compiler provides a wchar.h header file. */ +#define HAVE_WCHAR_H 1 + +/* The size of `wchar_t', as computed by sizeof. */ +#define SIZEOF_WCHAR_T 2 + +/* The size of `_Bool', as computed by sizeof. */ +#define SIZEOF__BOOL 1 + +/* The size of `pid_t', as computed by sizeof. */ +#define SIZEOF_PID_T SIZEOF_INT + +/* Define if you have the dl library (-ldl). */ +/* #undef HAVE_LIBDL */ + +/* Define if you have the mpc library (-lmpc). */ +/* #undef HAVE_LIBMPC */ + +/* Define if you have the nsl library (-lnsl). */ +#define HAVE_LIBNSL 1 + +/* Define if you have the seq library (-lseq). */ +/* #undef HAVE_LIBSEQ */ + +/* Define if you have the socket library (-lsocket). */ +#define HAVE_LIBSOCKET 1 + +/* Define if you have the sun library (-lsun). */ +/* #undef HAVE_LIBSUN */ + +/* Define if you have the termcap library (-ltermcap). */ +/* #undef HAVE_LIBTERMCAP */ + +/* Define if you have the termlib library (-ltermlib). */ +/* #undef HAVE_LIBTERMLIB */ + +/* Define if you have the thread library (-lthread). */ +/* #undef HAVE_LIBTHREAD */ + +/* WinSock does not use a bitmask in select, and uses + socket handles greater than FD_SETSIZE */ +#define Py_SOCKET_FD_CAN_BE_GE_FD_SETSIZE + +/* Define if C doubles are 64-bit IEEE 754 binary format, stored with the + least significant byte first */ +#define DOUBLE_IS_LITTLE_ENDIAN_IEEE754 1 + +/* Define to 1 if you have the `erf' function. */ +#define HAVE_ERF 1 + +/* Define to 1 if you have the `erfc' function. */ +#define HAVE_ERFC 1 + +/* Define if you have the 'inet_pton' function. */ +#define HAVE_INET_PTON 1 + +/* framework name */ +#define _PYTHONFRAMEWORK "" + +/* Define if libssl has X509_VERIFY_PARAM_set1_host and related function */ +#define HAVE_X509_VERIFY_PARAM_SET1_HOST 1 + +#endif /* !Py_CONFIG_H */ diff --git a/env/Include/pyctype.h b/env/Include/pyctype.h new file mode 100644 index 0000000..6bce63e --- /dev/null +++ b/env/Include/pyctype.h @@ -0,0 +1,33 @@ +#ifndef Py_LIMITED_API +#ifndef PYCTYPE_H +#define PYCTYPE_H + +#define PY_CTF_LOWER 0x01 +#define PY_CTF_UPPER 0x02 +#define PY_CTF_ALPHA (PY_CTF_LOWER|PY_CTF_UPPER) +#define PY_CTF_DIGIT 0x04 +#define PY_CTF_ALNUM (PY_CTF_ALPHA|PY_CTF_DIGIT) +#define PY_CTF_SPACE 0x08 +#define PY_CTF_XDIGIT 0x10 + +PyAPI_DATA(const unsigned int) _Py_ctype_table[256]; + +/* Unlike their C counterparts, the following macros are not meant to + * handle an int with any of the values [EOF, 0-UCHAR_MAX]. The argument + * must be a signed/unsigned char. */ +#define Py_ISLOWER(c) (_Py_ctype_table[Py_CHARMASK(c)] & PY_CTF_LOWER) +#define Py_ISUPPER(c) (_Py_ctype_table[Py_CHARMASK(c)] & PY_CTF_UPPER) +#define Py_ISALPHA(c) (_Py_ctype_table[Py_CHARMASK(c)] & PY_CTF_ALPHA) +#define Py_ISDIGIT(c) (_Py_ctype_table[Py_CHARMASK(c)] & PY_CTF_DIGIT) +#define Py_ISXDIGIT(c) (_Py_ctype_table[Py_CHARMASK(c)] & PY_CTF_XDIGIT) +#define Py_ISALNUM(c) (_Py_ctype_table[Py_CHARMASK(c)] & PY_CTF_ALNUM) +#define Py_ISSPACE(c) (_Py_ctype_table[Py_CHARMASK(c)] & PY_CTF_SPACE) + +PyAPI_DATA(const unsigned char) _Py_ctype_tolower[256]; +PyAPI_DATA(const unsigned char) _Py_ctype_toupper[256]; + +#define Py_TOLOWER(c) (_Py_ctype_tolower[Py_CHARMASK(c)]) +#define Py_TOUPPER(c) (_Py_ctype_toupper[Py_CHARMASK(c)]) + +#endif /* !PYCTYPE_H */ +#endif /* !Py_LIMITED_API */ diff --git a/env/Include/pydebug.h b/env/Include/pydebug.h new file mode 100644 index 0000000..bd4aafe --- /dev/null +++ b/env/Include/pydebug.h @@ -0,0 +1,40 @@ +#ifndef Py_LIMITED_API +#ifndef Py_PYDEBUG_H +#define Py_PYDEBUG_H +#ifdef __cplusplus +extern "C" { +#endif + +/* These global variable are defined in pylifecycle.c */ +/* XXX (ncoghlan): move these declarations to pylifecycle.h? */ +PyAPI_DATA(int) Py_DebugFlag; +PyAPI_DATA(int) Py_VerboseFlag; +PyAPI_DATA(int) Py_QuietFlag; +PyAPI_DATA(int) Py_InteractiveFlag; +PyAPI_DATA(int) Py_InspectFlag; +PyAPI_DATA(int) Py_OptimizeFlag; +PyAPI_DATA(int) Py_NoSiteFlag; +PyAPI_DATA(int) Py_BytesWarningFlag; +PyAPI_DATA(int) Py_FrozenFlag; +PyAPI_DATA(int) Py_IgnoreEnvironmentFlag; +PyAPI_DATA(int) Py_DontWriteBytecodeFlag; +PyAPI_DATA(int) Py_NoUserSiteDirectory; +PyAPI_DATA(int) Py_UnbufferedStdioFlag; +PyAPI_DATA(int) Py_HashRandomizationFlag; +PyAPI_DATA(int) Py_IsolatedFlag; + +#ifdef MS_WINDOWS +PyAPI_DATA(int) Py_LegacyWindowsFSEncodingFlag; +PyAPI_DATA(int) Py_LegacyWindowsStdioFlag; +#endif + +/* this is a wrapper around getenv() that pays attention to + Py_IgnoreEnvironmentFlag. It should be used for getting variables like + PYTHONPATH and PYTHONHOME from the environment */ +#define Py_GETENV(s) (Py_IgnoreEnvironmentFlag ? NULL : getenv(s)) + +#ifdef __cplusplus +} +#endif +#endif /* !Py_PYDEBUG_H */ +#endif /* Py_LIMITED_API */ diff --git a/env/Include/pydtrace.h b/env/Include/pydtrace.h new file mode 100644 index 0000000..7a04278 --- /dev/null +++ b/env/Include/pydtrace.h @@ -0,0 +1,57 @@ +/* Static DTrace probes interface */ + +#ifndef Py_DTRACE_H +#define Py_DTRACE_H +#ifdef __cplusplus +extern "C" { +#endif + +#ifdef WITH_DTRACE + +#include "pydtrace_probes.h" + +/* pydtrace_probes.h, on systems with DTrace, is auto-generated to include + `PyDTrace_{PROBE}` and `PyDTrace_{PROBE}_ENABLED()` macros for every probe + defined in pydtrace_provider.d. + + Calling these functions must be guarded by a `PyDTrace_{PROBE}_ENABLED()` + check to minimize performance impact when probing is off. For example: + + if (PyDTrace_FUNCTION_ENTRY_ENABLED()) + PyDTrace_FUNCTION_ENTRY(f); +*/ + +#else + +/* Without DTrace, compile to nothing. */ + +static inline void PyDTrace_LINE(const char *arg0, const char *arg1, int arg2) {} +static inline void PyDTrace_FUNCTION_ENTRY(const char *arg0, const char *arg1, int arg2) {} +static inline void PyDTrace_FUNCTION_RETURN(const char *arg0, const char *arg1, int arg2) {} +static inline void PyDTrace_GC_START(int arg0) {} +static inline void PyDTrace_GC_DONE(Py_ssize_t arg0) {} +static inline void PyDTrace_INSTANCE_NEW_START(int arg0) {} +static inline void PyDTrace_INSTANCE_NEW_DONE(int arg0) {} +static inline void PyDTrace_INSTANCE_DELETE_START(int arg0) {} +static inline void PyDTrace_INSTANCE_DELETE_DONE(int arg0) {} +static inline void PyDTrace_IMPORT_FIND_LOAD_START(const char *arg0) {} +static inline void PyDTrace_IMPORT_FIND_LOAD_DONE(const char *arg0, int arg1) {} + +static inline int PyDTrace_LINE_ENABLED(void) { return 0; } +static inline int PyDTrace_FUNCTION_ENTRY_ENABLED(void) { return 0; } +static inline int PyDTrace_FUNCTION_RETURN_ENABLED(void) { return 0; } +static inline int PyDTrace_GC_START_ENABLED(void) { return 0; } +static inline int PyDTrace_GC_DONE_ENABLED(void) { return 0; } +static inline int PyDTrace_INSTANCE_NEW_START_ENABLED(void) { return 0; } +static inline int PyDTrace_INSTANCE_NEW_DONE_ENABLED(void) { return 0; } +static inline int PyDTrace_INSTANCE_DELETE_START_ENABLED(void) { return 0; } +static inline int PyDTrace_INSTANCE_DELETE_DONE_ENABLED(void) { return 0; } +static inline int PyDTrace_IMPORT_FIND_LOAD_START_ENABLED(void) { return 0; } +static inline int PyDTrace_IMPORT_FIND_LOAD_DONE_ENABLED(void) { return 0; } + +#endif /* !WITH_DTRACE */ + +#ifdef __cplusplus +} +#endif +#endif /* !Py_DTRACE_H */ diff --git a/env/Include/pyerrors.h b/env/Include/pyerrors.h new file mode 100644 index 0000000..f49d4e8 --- /dev/null +++ b/env/Include/pyerrors.h @@ -0,0 +1,504 @@ +#ifndef Py_ERRORS_H +#define Py_ERRORS_H +#ifdef __cplusplus +extern "C" { +#endif + +/* Error objects */ + +#ifndef Py_LIMITED_API +/* PyException_HEAD defines the initial segment of every exception class. */ +#define PyException_HEAD PyObject_HEAD PyObject *dict;\ + PyObject *args; PyObject *traceback;\ + PyObject *context; PyObject *cause;\ + char suppress_context; + +typedef struct { + PyException_HEAD +} PyBaseExceptionObject; + +typedef struct { + PyException_HEAD + PyObject *msg; + PyObject *filename; + PyObject *lineno; + PyObject *offset; + PyObject *text; + PyObject *print_file_and_line; +} PySyntaxErrorObject; + +typedef struct { + PyException_HEAD + PyObject *msg; + PyObject *name; + PyObject *path; +} PyImportErrorObject; + +typedef struct { + PyException_HEAD + PyObject *encoding; + PyObject *object; + Py_ssize_t start; + Py_ssize_t end; + PyObject *reason; +} PyUnicodeErrorObject; + +typedef struct { + PyException_HEAD + PyObject *code; +} PySystemExitObject; + +typedef struct { + PyException_HEAD + PyObject *myerrno; + PyObject *strerror; + PyObject *filename; + PyObject *filename2; +#ifdef MS_WINDOWS + PyObject *winerror; +#endif + Py_ssize_t written; /* only for BlockingIOError, -1 otherwise */ +} PyOSErrorObject; + +typedef struct { + PyException_HEAD + PyObject *value; +} PyStopIterationObject; + +/* Compatibility typedefs */ +typedef PyOSErrorObject PyEnvironmentErrorObject; +#ifdef MS_WINDOWS +typedef PyOSErrorObject PyWindowsErrorObject; +#endif +#endif /* !Py_LIMITED_API */ + +/* Error handling definitions */ + +PyAPI_FUNC(void) PyErr_SetNone(PyObject *); +PyAPI_FUNC(void) PyErr_SetObject(PyObject *, PyObject *); +#ifndef Py_LIMITED_API +PyAPI_FUNC(void) _PyErr_SetKeyError(PyObject *); +_PyErr_StackItem *_PyErr_GetTopmostException(PyThreadState *tstate); +#endif +PyAPI_FUNC(void) PyErr_SetString( + PyObject *exception, + const char *string /* decoded from utf-8 */ + ); +PyAPI_FUNC(PyObject *) PyErr_Occurred(void); +PyAPI_FUNC(void) PyErr_Clear(void); +PyAPI_FUNC(void) PyErr_Fetch(PyObject **, PyObject **, PyObject **); +PyAPI_FUNC(void) PyErr_Restore(PyObject *, PyObject *, PyObject *); +#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03030000 +PyAPI_FUNC(void) PyErr_GetExcInfo(PyObject **, PyObject **, PyObject **); +PyAPI_FUNC(void) PyErr_SetExcInfo(PyObject *, PyObject *, PyObject *); +#endif + +#if defined(__clang__) || \ + (defined(__GNUC__) && \ + ((__GNUC__ >= 3) || \ + (__GNUC__ == 2) && (__GNUC_MINOR__ >= 5))) +#define _Py_NO_RETURN __attribute__((__noreturn__)) +#else +#define _Py_NO_RETURN +#endif + +/* Defined in Python/pylifecycle.c */ +PyAPI_FUNC(void) Py_FatalError(const char *message) _Py_NO_RETURN; + +#if defined(Py_DEBUG) || defined(Py_LIMITED_API) +#define _PyErr_OCCURRED() PyErr_Occurred() +#else +#define _PyErr_OCCURRED() (PyThreadState_GET()->curexc_type) +#endif + +/* Error testing and normalization */ +PyAPI_FUNC(int) PyErr_GivenExceptionMatches(PyObject *, PyObject *); +PyAPI_FUNC(int) PyErr_ExceptionMatches(PyObject *); +PyAPI_FUNC(void) PyErr_NormalizeException(PyObject**, PyObject**, PyObject**); + +/* Traceback manipulation (PEP 3134) */ +PyAPI_FUNC(int) PyException_SetTraceback(PyObject *, PyObject *); +PyAPI_FUNC(PyObject *) PyException_GetTraceback(PyObject *); + +/* Cause manipulation (PEP 3134) */ +PyAPI_FUNC(PyObject *) PyException_GetCause(PyObject *); +PyAPI_FUNC(void) PyException_SetCause(PyObject *, PyObject *); + +/* Context manipulation (PEP 3134) */ +PyAPI_FUNC(PyObject *) PyException_GetContext(PyObject *); +PyAPI_FUNC(void) PyException_SetContext(PyObject *, PyObject *); +#ifndef Py_LIMITED_API +PyAPI_FUNC(void) _PyErr_ChainExceptions(PyObject *, PyObject *, PyObject *); +#endif + +/* */ + +#define PyExceptionClass_Check(x) \ + (PyType_Check((x)) && \ + PyType_FastSubclass((PyTypeObject*)(x), Py_TPFLAGS_BASE_EXC_SUBCLASS)) + +#define PyExceptionInstance_Check(x) \ + PyType_FastSubclass((x)->ob_type, Py_TPFLAGS_BASE_EXC_SUBCLASS) + +#define PyExceptionClass_Name(x) \ + ((char *)(((PyTypeObject*)(x))->tp_name)) + +#define PyExceptionInstance_Class(x) ((PyObject*)((x)->ob_type)) + + +/* Predefined exceptions */ + +PyAPI_DATA(PyObject *) PyExc_BaseException; +PyAPI_DATA(PyObject *) PyExc_Exception; +#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03050000 +PyAPI_DATA(PyObject *) PyExc_StopAsyncIteration; +#endif +PyAPI_DATA(PyObject *) PyExc_StopIteration; +PyAPI_DATA(PyObject *) PyExc_GeneratorExit; +PyAPI_DATA(PyObject *) PyExc_ArithmeticError; +PyAPI_DATA(PyObject *) PyExc_LookupError; + +PyAPI_DATA(PyObject *) PyExc_AssertionError; +PyAPI_DATA(PyObject *) PyExc_AttributeError; +PyAPI_DATA(PyObject *) PyExc_BufferError; +PyAPI_DATA(PyObject *) PyExc_EOFError; +PyAPI_DATA(PyObject *) PyExc_FloatingPointError; +PyAPI_DATA(PyObject *) PyExc_OSError; +PyAPI_DATA(PyObject *) PyExc_ImportError; +#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03060000 +PyAPI_DATA(PyObject *) PyExc_ModuleNotFoundError; +#endif +PyAPI_DATA(PyObject *) PyExc_IndexError; +PyAPI_DATA(PyObject *) PyExc_KeyError; +PyAPI_DATA(PyObject *) PyExc_KeyboardInterrupt; +PyAPI_DATA(PyObject *) PyExc_MemoryError; +PyAPI_DATA(PyObject *) PyExc_NameError; +PyAPI_DATA(PyObject *) PyExc_OverflowError; +PyAPI_DATA(PyObject *) PyExc_RuntimeError; +#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03050000 +PyAPI_DATA(PyObject *) PyExc_RecursionError; +#endif +PyAPI_DATA(PyObject *) PyExc_NotImplementedError; +PyAPI_DATA(PyObject *) PyExc_SyntaxError; +PyAPI_DATA(PyObject *) PyExc_IndentationError; +PyAPI_DATA(PyObject *) PyExc_TabError; +PyAPI_DATA(PyObject *) PyExc_ReferenceError; +PyAPI_DATA(PyObject *) PyExc_SystemError; +PyAPI_DATA(PyObject *) PyExc_SystemExit; +PyAPI_DATA(PyObject *) PyExc_TypeError; +PyAPI_DATA(PyObject *) PyExc_UnboundLocalError; +PyAPI_DATA(PyObject *) PyExc_UnicodeError; +PyAPI_DATA(PyObject *) PyExc_UnicodeEncodeError; +PyAPI_DATA(PyObject *) PyExc_UnicodeDecodeError; +PyAPI_DATA(PyObject *) PyExc_UnicodeTranslateError; +PyAPI_DATA(PyObject *) PyExc_ValueError; +PyAPI_DATA(PyObject *) PyExc_ZeroDivisionError; + +#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03030000 +PyAPI_DATA(PyObject *) PyExc_BlockingIOError; +PyAPI_DATA(PyObject *) PyExc_BrokenPipeError; +PyAPI_DATA(PyObject *) PyExc_ChildProcessError; +PyAPI_DATA(PyObject *) PyExc_ConnectionError; +PyAPI_DATA(PyObject *) PyExc_ConnectionAbortedError; +PyAPI_DATA(PyObject *) PyExc_ConnectionRefusedError; +PyAPI_DATA(PyObject *) PyExc_ConnectionResetError; +PyAPI_DATA(PyObject *) PyExc_FileExistsError; +PyAPI_DATA(PyObject *) PyExc_FileNotFoundError; +PyAPI_DATA(PyObject *) PyExc_InterruptedError; +PyAPI_DATA(PyObject *) PyExc_IsADirectoryError; +PyAPI_DATA(PyObject *) PyExc_NotADirectoryError; +PyAPI_DATA(PyObject *) PyExc_PermissionError; +PyAPI_DATA(PyObject *) PyExc_ProcessLookupError; +PyAPI_DATA(PyObject *) PyExc_TimeoutError; +#endif + + +/* Compatibility aliases */ +PyAPI_DATA(PyObject *) PyExc_EnvironmentError; +PyAPI_DATA(PyObject *) PyExc_IOError; +#ifdef MS_WINDOWS +PyAPI_DATA(PyObject *) PyExc_WindowsError; +#endif + +/* Predefined warning categories */ +PyAPI_DATA(PyObject *) PyExc_Warning; +PyAPI_DATA(PyObject *) PyExc_UserWarning; +PyAPI_DATA(PyObject *) PyExc_DeprecationWarning; +PyAPI_DATA(PyObject *) PyExc_PendingDeprecationWarning; +PyAPI_DATA(PyObject *) PyExc_SyntaxWarning; +PyAPI_DATA(PyObject *) PyExc_RuntimeWarning; +PyAPI_DATA(PyObject *) PyExc_FutureWarning; +PyAPI_DATA(PyObject *) PyExc_ImportWarning; +PyAPI_DATA(PyObject *) PyExc_UnicodeWarning; +PyAPI_DATA(PyObject *) PyExc_BytesWarning; +PyAPI_DATA(PyObject *) PyExc_ResourceWarning; + + +/* Convenience functions */ + +PyAPI_FUNC(int) PyErr_BadArgument(void); +PyAPI_FUNC(PyObject *) PyErr_NoMemory(void); +PyAPI_FUNC(PyObject *) PyErr_SetFromErrno(PyObject *); +PyAPI_FUNC(PyObject *) PyErr_SetFromErrnoWithFilenameObject( + PyObject *, PyObject *); +#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03040000 +PyAPI_FUNC(PyObject *) PyErr_SetFromErrnoWithFilenameObjects( + PyObject *, PyObject *, PyObject *); +#endif +PyAPI_FUNC(PyObject *) PyErr_SetFromErrnoWithFilename( + PyObject *exc, + const char *filename /* decoded from the filesystem encoding */ + ); +#if defined(MS_WINDOWS) && !defined(Py_LIMITED_API) +PyAPI_FUNC(PyObject *) PyErr_SetFromErrnoWithUnicodeFilename( + PyObject *, const Py_UNICODE *) Py_DEPRECATED(3.3); +#endif /* MS_WINDOWS */ + +PyAPI_FUNC(PyObject *) PyErr_Format( + PyObject *exception, + const char *format, /* ASCII-encoded string */ + ... + ); +#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03050000 +PyAPI_FUNC(PyObject *) PyErr_FormatV( + PyObject *exception, + const char *format, + va_list vargs); +#endif + +#ifndef Py_LIMITED_API +/* Like PyErr_Format(), but saves current exception as __context__ and + __cause__. + */ +PyAPI_FUNC(PyObject *) _PyErr_FormatFromCause( + PyObject *exception, + const char *format, /* ASCII-encoded string */ + ... + ); +#endif + +#ifdef MS_WINDOWS +PyAPI_FUNC(PyObject *) PyErr_SetFromWindowsErrWithFilename( + int ierr, + const char *filename /* decoded from the filesystem encoding */ + ); +#ifndef Py_LIMITED_API +/* XXX redeclare to use WSTRING */ +PyAPI_FUNC(PyObject *) PyErr_SetFromWindowsErrWithUnicodeFilename( + int, const Py_UNICODE *) Py_DEPRECATED(3.3); +#endif +PyAPI_FUNC(PyObject *) PyErr_SetFromWindowsErr(int); +PyAPI_FUNC(PyObject *) PyErr_SetExcFromWindowsErrWithFilenameObject( + PyObject *,int, PyObject *); +#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03040000 +PyAPI_FUNC(PyObject *) PyErr_SetExcFromWindowsErrWithFilenameObjects( + PyObject *,int, PyObject *, PyObject *); +#endif +PyAPI_FUNC(PyObject *) PyErr_SetExcFromWindowsErrWithFilename( + PyObject *exc, + int ierr, + const char *filename /* decoded from the filesystem encoding */ + ); +#ifndef Py_LIMITED_API +PyAPI_FUNC(PyObject *) PyErr_SetExcFromWindowsErrWithUnicodeFilename( + PyObject *,int, const Py_UNICODE *) Py_DEPRECATED(3.3); +#endif +PyAPI_FUNC(PyObject *) PyErr_SetExcFromWindowsErr(PyObject *, int); +#endif /* MS_WINDOWS */ + +#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03060000 +PyAPI_FUNC(PyObject *) PyErr_SetImportErrorSubclass(PyObject *, PyObject *, + PyObject *, PyObject *); +#endif +#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03030000 +PyAPI_FUNC(PyObject *) PyErr_SetImportError(PyObject *, PyObject *, + PyObject *); +#endif + +/* Export the old function so that the existing API remains available: */ +PyAPI_FUNC(void) PyErr_BadInternalCall(void); +PyAPI_FUNC(void) _PyErr_BadInternalCall(const char *filename, int lineno); +/* Mask the old API with a call to the new API for code compiled under + Python 2.0: */ +#define PyErr_BadInternalCall() _PyErr_BadInternalCall(__FILE__, __LINE__) + +/* Function to create a new exception */ +PyAPI_FUNC(PyObject *) PyErr_NewException( + const char *name, PyObject *base, PyObject *dict); +PyAPI_FUNC(PyObject *) PyErr_NewExceptionWithDoc( + const char *name, const char *doc, PyObject *base, PyObject *dict); +PyAPI_FUNC(void) PyErr_WriteUnraisable(PyObject *); + +/* In exceptions.c */ +#ifndef Py_LIMITED_API +/* Helper that attempts to replace the current exception with one of the + * same type but with a prefix added to the exception text. The resulting + * exception description looks like: + * + * prefix (exc_type: original_exc_str) + * + * Only some exceptions can be safely replaced. If the function determines + * it isn't safe to perform the replacement, it will leave the original + * unmodified exception in place. + * + * Returns a borrowed reference to the new exception (if any), NULL if the + * existing exception was left in place. + */ +PyAPI_FUNC(PyObject *) _PyErr_TrySetFromCause( + const char *prefix_format, /* ASCII-encoded string */ + ... + ); +#endif + + +/* In signalmodule.c */ +PyAPI_FUNC(int) PyErr_CheckSignals(void); +PyAPI_FUNC(void) PyErr_SetInterrupt(void); + +/* In signalmodule.c */ +#ifndef Py_LIMITED_API +int PySignal_SetWakeupFd(int fd); +#endif + +/* Support for adding program text to SyntaxErrors */ +PyAPI_FUNC(void) PyErr_SyntaxLocation( + const char *filename, /* decoded from the filesystem encoding */ + int lineno); +PyAPI_FUNC(void) PyErr_SyntaxLocationEx( + const char *filename, /* decoded from the filesystem encoding */ + int lineno, + int col_offset); +#ifndef Py_LIMITED_API +PyAPI_FUNC(void) PyErr_SyntaxLocationObject( + PyObject *filename, + int lineno, + int col_offset); +#endif +PyAPI_FUNC(PyObject *) PyErr_ProgramText( + const char *filename, /* decoded from the filesystem encoding */ + int lineno); +#ifndef Py_LIMITED_API +PyAPI_FUNC(PyObject *) PyErr_ProgramTextObject( + PyObject *filename, + int lineno); +#endif + +/* The following functions are used to create and modify unicode + exceptions from C */ + +/* create a UnicodeDecodeError object */ +PyAPI_FUNC(PyObject *) PyUnicodeDecodeError_Create( + const char *encoding, /* UTF-8 encoded string */ + const char *object, + Py_ssize_t length, + Py_ssize_t start, + Py_ssize_t end, + const char *reason /* UTF-8 encoded string */ + ); + +/* create a UnicodeEncodeError object */ +#ifndef Py_LIMITED_API +PyAPI_FUNC(PyObject *) PyUnicodeEncodeError_Create( + const char *encoding, /* UTF-8 encoded string */ + const Py_UNICODE *object, + Py_ssize_t length, + Py_ssize_t start, + Py_ssize_t end, + const char *reason /* UTF-8 encoded string */ + ) Py_DEPRECATED(3.3); +#endif + +/* create a UnicodeTranslateError object */ +#ifndef Py_LIMITED_API +PyAPI_FUNC(PyObject *) PyUnicodeTranslateError_Create( + const Py_UNICODE *object, + Py_ssize_t length, + Py_ssize_t start, + Py_ssize_t end, + const char *reason /* UTF-8 encoded string */ + ) Py_DEPRECATED(3.3); +PyAPI_FUNC(PyObject *) _PyUnicodeTranslateError_Create( + PyObject *object, + Py_ssize_t start, + Py_ssize_t end, + const char *reason /* UTF-8 encoded string */ + ); +#endif + +/* get the encoding attribute */ +PyAPI_FUNC(PyObject *) PyUnicodeEncodeError_GetEncoding(PyObject *); +PyAPI_FUNC(PyObject *) PyUnicodeDecodeError_GetEncoding(PyObject *); + +/* get the object attribute */ +PyAPI_FUNC(PyObject *) PyUnicodeEncodeError_GetObject(PyObject *); +PyAPI_FUNC(PyObject *) PyUnicodeDecodeError_GetObject(PyObject *); +PyAPI_FUNC(PyObject *) PyUnicodeTranslateError_GetObject(PyObject *); + +/* get the value of the start attribute (the int * may not be NULL) + return 0 on success, -1 on failure */ +PyAPI_FUNC(int) PyUnicodeEncodeError_GetStart(PyObject *, Py_ssize_t *); +PyAPI_FUNC(int) PyUnicodeDecodeError_GetStart(PyObject *, Py_ssize_t *); +PyAPI_FUNC(int) PyUnicodeTranslateError_GetStart(PyObject *, Py_ssize_t *); + +/* assign a new value to the start attribute + return 0 on success, -1 on failure */ +PyAPI_FUNC(int) PyUnicodeEncodeError_SetStart(PyObject *, Py_ssize_t); +PyAPI_FUNC(int) PyUnicodeDecodeError_SetStart(PyObject *, Py_ssize_t); +PyAPI_FUNC(int) PyUnicodeTranslateError_SetStart(PyObject *, Py_ssize_t); + +/* get the value of the end attribute (the int *may not be NULL) + return 0 on success, -1 on failure */ +PyAPI_FUNC(int) PyUnicodeEncodeError_GetEnd(PyObject *, Py_ssize_t *); +PyAPI_FUNC(int) PyUnicodeDecodeError_GetEnd(PyObject *, Py_ssize_t *); +PyAPI_FUNC(int) PyUnicodeTranslateError_GetEnd(PyObject *, Py_ssize_t *); + +/* assign a new value to the end attribute + return 0 on success, -1 on failure */ +PyAPI_FUNC(int) PyUnicodeEncodeError_SetEnd(PyObject *, Py_ssize_t); +PyAPI_FUNC(int) PyUnicodeDecodeError_SetEnd(PyObject *, Py_ssize_t); +PyAPI_FUNC(int) PyUnicodeTranslateError_SetEnd(PyObject *, Py_ssize_t); + +/* get the value of the reason attribute */ +PyAPI_FUNC(PyObject *) PyUnicodeEncodeError_GetReason(PyObject *); +PyAPI_FUNC(PyObject *) PyUnicodeDecodeError_GetReason(PyObject *); +PyAPI_FUNC(PyObject *) PyUnicodeTranslateError_GetReason(PyObject *); + +/* assign a new value to the reason attribute + return 0 on success, -1 on failure */ +PyAPI_FUNC(int) PyUnicodeEncodeError_SetReason( + PyObject *exc, + const char *reason /* UTF-8 encoded string */ + ); +PyAPI_FUNC(int) PyUnicodeDecodeError_SetReason( + PyObject *exc, + const char *reason /* UTF-8 encoded string */ + ); +PyAPI_FUNC(int) PyUnicodeTranslateError_SetReason( + PyObject *exc, + const char *reason /* UTF-8 encoded string */ + ); + +/* These APIs aren't really part of the error implementation, but + often needed to format error messages; the native C lib APIs are + not available on all platforms, which is why we provide emulations + for those platforms in Python/mysnprintf.c, + WARNING: The return value of snprintf varies across platforms; do + not rely on any particular behavior; eventually the C99 defn may + be reliable. +*/ +#if defined(MS_WIN32) && !defined(HAVE_SNPRINTF) +# define HAVE_SNPRINTF +# define snprintf _snprintf +# define vsnprintf _vsnprintf +#endif + +#include +PyAPI_FUNC(int) PyOS_snprintf(char *str, size_t size, const char *format, ...) + Py_GCC_ATTRIBUTE((format(printf, 3, 4))); +PyAPI_FUNC(int) PyOS_vsnprintf(char *str, size_t size, const char *format, va_list va) + Py_GCC_ATTRIBUTE((format(printf, 3, 0))); + +#ifdef __cplusplus +} +#endif +#endif /* !Py_ERRORS_H */ diff --git a/env/Include/pyexpat.h b/env/Include/pyexpat.h new file mode 100644 index 0000000..07020b5 --- /dev/null +++ b/env/Include/pyexpat.h @@ -0,0 +1,55 @@ +/* Stuff to export relevant 'expat' entry points from pyexpat to other + * parser modules, such as cElementTree. */ + +/* note: you must import expat.h before importing this module! */ + +#define PyExpat_CAPI_MAGIC "pyexpat.expat_CAPI 1.1" +#define PyExpat_CAPSULE_NAME "pyexpat.expat_CAPI" + +struct PyExpat_CAPI +{ + char* magic; /* set to PyExpat_CAPI_MAGIC */ + int size; /* set to sizeof(struct PyExpat_CAPI) */ + int MAJOR_VERSION; + int MINOR_VERSION; + int MICRO_VERSION; + /* pointers to selected expat functions. add new functions at + the end, if needed */ + const XML_LChar * (*ErrorString)(enum XML_Error code); + enum XML_Error (*GetErrorCode)(XML_Parser parser); + XML_Size (*GetErrorColumnNumber)(XML_Parser parser); + XML_Size (*GetErrorLineNumber)(XML_Parser parser); + enum XML_Status (*Parse)( + XML_Parser parser, const char *s, int len, int isFinal); + XML_Parser (*ParserCreate_MM)( + const XML_Char *encoding, const XML_Memory_Handling_Suite *memsuite, + const XML_Char *namespaceSeparator); + void (*ParserFree)(XML_Parser parser); + void (*SetCharacterDataHandler)( + XML_Parser parser, XML_CharacterDataHandler handler); + void (*SetCommentHandler)( + XML_Parser parser, XML_CommentHandler handler); + void (*SetDefaultHandlerExpand)( + XML_Parser parser, XML_DefaultHandler handler); + void (*SetElementHandler)( + XML_Parser parser, XML_StartElementHandler start, + XML_EndElementHandler end); + void (*SetNamespaceDeclHandler)( + XML_Parser parser, XML_StartNamespaceDeclHandler start, + XML_EndNamespaceDeclHandler end); + void (*SetProcessingInstructionHandler)( + XML_Parser parser, XML_ProcessingInstructionHandler handler); + void (*SetUnknownEncodingHandler)( + XML_Parser parser, XML_UnknownEncodingHandler handler, + void *encodingHandlerData); + void (*SetUserData)(XML_Parser parser, void *userData); + void (*SetStartDoctypeDeclHandler)(XML_Parser parser, + XML_StartDoctypeDeclHandler start); + enum XML_Status (*SetEncoding)(XML_Parser parser, const XML_Char *encoding); + int (*DefaultUnknownEncodingHandler)( + void *encodingHandlerData, const XML_Char *name, XML_Encoding *info); + /* might be none for expat < 2.1.0 */ + int (*SetHashSalt)(XML_Parser parser, unsigned long hash_salt); + /* always add new stuff to the end! */ +}; + diff --git a/env/Include/pyfpe.h b/env/Include/pyfpe.h new file mode 100644 index 0000000..5a99e39 --- /dev/null +++ b/env/Include/pyfpe.h @@ -0,0 +1,12 @@ +#ifndef Py_PYFPE_H +#define Py_PYFPE_H + +/* These macros used to do something when Python was built with --with-fpectl, + * but support for that was dropped in 3.7. We continue to define them though, + * to avoid breaking API users. + */ + +#define PyFPE_START_PROTECT(err_string, leave_stmt) +#define PyFPE_END_PROTECT(v) + +#endif /* !Py_PYFPE_H */ diff --git a/env/Include/pyhash.h b/env/Include/pyhash.h new file mode 100644 index 0000000..9cfd071 --- /dev/null +++ b/env/Include/pyhash.h @@ -0,0 +1,145 @@ +#ifndef Py_HASH_H + +#define Py_HASH_H +#ifdef __cplusplus +extern "C" { +#endif + +/* Helpers for hash functions */ +#ifndef Py_LIMITED_API +PyAPI_FUNC(Py_hash_t) _Py_HashDouble(double); +PyAPI_FUNC(Py_hash_t) _Py_HashPointer(void*); +PyAPI_FUNC(Py_hash_t) _Py_HashBytes(const void*, Py_ssize_t); +#endif + +/* Prime multiplier used in string and various other hashes. */ +#define _PyHASH_MULTIPLIER 1000003UL /* 0xf4243 */ + +/* Parameters used for the numeric hash implementation. See notes for + _Py_HashDouble in Python/pyhash.c. Numeric hashes are based on + reduction modulo the prime 2**_PyHASH_BITS - 1. */ + +#if SIZEOF_VOID_P >= 8 +# define _PyHASH_BITS 61 +#else +# define _PyHASH_BITS 31 +#endif + +#define _PyHASH_MODULUS (((size_t)1 << _PyHASH_BITS) - 1) +#define _PyHASH_INF 314159 +#define _PyHASH_NAN 0 +#define _PyHASH_IMAG _PyHASH_MULTIPLIER + + +/* hash secret + * + * memory layout on 64 bit systems + * cccccccc cccccccc cccccccc uc -- unsigned char[24] + * pppppppp ssssssss ........ fnv -- two Py_hash_t + * k0k0k0k0 k1k1k1k1 ........ siphash -- two uint64_t + * ........ ........ ssssssss djbx33a -- 16 bytes padding + one Py_hash_t + * ........ ........ eeeeeeee pyexpat XML hash salt + * + * memory layout on 32 bit systems + * cccccccc cccccccc cccccccc uc + * ppppssss ........ ........ fnv -- two Py_hash_t + * k0k0k0k0 k1k1k1k1 ........ siphash -- two uint64_t (*) + * ........ ........ ssss.... djbx33a -- 16 bytes padding + one Py_hash_t + * ........ ........ eeee.... pyexpat XML hash salt + * + * (*) The siphash member may not be available on 32 bit platforms without + * an unsigned int64 data type. + */ +#ifndef Py_LIMITED_API +typedef union { + /* ensure 24 bytes */ + unsigned char uc[24]; + /* two Py_hash_t for FNV */ + struct { + Py_hash_t prefix; + Py_hash_t suffix; + } fnv; + /* two uint64 for SipHash24 */ + struct { + uint64_t k0; + uint64_t k1; + } siphash; + /* a different (!) Py_hash_t for small string optimization */ + struct { + unsigned char padding[16]; + Py_hash_t suffix; + } djbx33a; + struct { + unsigned char padding[16]; + Py_hash_t hashsalt; + } expat; +} _Py_HashSecret_t; +PyAPI_DATA(_Py_HashSecret_t) _Py_HashSecret; +#endif + +#ifdef Py_DEBUG +PyAPI_DATA(int) _Py_HashSecret_Initialized; +#endif + + +/* hash function definition */ +#ifndef Py_LIMITED_API +typedef struct { + Py_hash_t (*const hash)(const void *, Py_ssize_t); + const char *name; + const int hash_bits; + const int seed_bits; +} PyHash_FuncDef; + +PyAPI_FUNC(PyHash_FuncDef*) PyHash_GetFuncDef(void); +#endif + + +/* cutoff for small string DJBX33A optimization in range [1, cutoff). + * + * About 50% of the strings in a typical Python application are smaller than + * 6 to 7 chars. However DJBX33A is vulnerable to hash collision attacks. + * NEVER use DJBX33A for long strings! + * + * A Py_HASH_CUTOFF of 0 disables small string optimization. 32 bit platforms + * should use a smaller cutoff because it is easier to create colliding + * strings. A cutoff of 7 on 64bit platforms and 5 on 32bit platforms should + * provide a decent safety margin. + */ +#ifndef Py_HASH_CUTOFF +# define Py_HASH_CUTOFF 0 +#elif (Py_HASH_CUTOFF > 7 || Py_HASH_CUTOFF < 0) +# error Py_HASH_CUTOFF must in range 0...7. +#endif /* Py_HASH_CUTOFF */ + + +/* hash algorithm selection + * + * The values for Py_HASH_SIPHASH24 and Py_HASH_FNV are hard-coded in the + * configure script. + * + * - FNV is available on all platforms and architectures. + * - SIPHASH24 only works on plaforms that don't require aligned memory for integers. + * - With EXTERNAL embedders can provide an alternative implementation with:: + * + * PyHash_FuncDef PyHash_Func = {...}; + * + * XXX: Figure out __declspec() for extern PyHash_FuncDef. + */ +#define Py_HASH_EXTERNAL 0 +#define Py_HASH_SIPHASH24 1 +#define Py_HASH_FNV 2 + +#ifndef Py_HASH_ALGORITHM +# ifndef HAVE_ALIGNED_REQUIRED +# define Py_HASH_ALGORITHM Py_HASH_SIPHASH24 +# else +# define Py_HASH_ALGORITHM Py_HASH_FNV +# endif /* uint64_t && uint32_t && aligned */ +#endif /* Py_HASH_ALGORITHM */ + +#ifdef __cplusplus +} +#endif + +#endif /* !Py_HASH_H */ diff --git a/env/Include/pylifecycle.h b/env/Include/pylifecycle.h new file mode 100644 index 0000000..5d9f049 --- /dev/null +++ b/env/Include/pylifecycle.h @@ -0,0 +1,238 @@ + +/* Interfaces to configure, query, create & destroy the Python runtime */ + +#ifndef Py_PYLIFECYCLE_H +#define Py_PYLIFECYCLE_H +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef Py_LIMITED_API +typedef struct { + const char *prefix; + const char *msg; + int user_err; +} _PyInitError; + +/* Almost all errors causing Python initialization to fail */ +#ifdef _MSC_VER + /* Visual Studio 2015 doesn't implement C99 __func__ in C */ +# define _Py_INIT_GET_FUNC() __FUNCTION__ +#else +# define _Py_INIT_GET_FUNC() __func__ +#endif + +#define _Py_INIT_OK() \ + (_PyInitError){.prefix = NULL, .msg = NULL, .user_err = 0} +#define _Py_INIT_ERR(MSG) \ + (_PyInitError){.prefix = _Py_INIT_GET_FUNC(), .msg = (MSG), .user_err = 0} +/* Error that can be fixed by the user like invalid input parameter. + Don't abort() the process on such error. */ +#define _Py_INIT_USER_ERR(MSG) \ + (_PyInitError){.prefix = _Py_INIT_GET_FUNC(), .msg = (MSG), .user_err = 1} +#define _Py_INIT_NO_MEMORY() _Py_INIT_USER_ERR("memory allocation failed") +#define _Py_INIT_FAILED(err) \ + (err.msg != NULL) + +#endif + + +PyAPI_FUNC(void) Py_SetProgramName(const wchar_t *); +PyAPI_FUNC(wchar_t *) Py_GetProgramName(void); + +PyAPI_FUNC(void) Py_SetPythonHome(const wchar_t *); +PyAPI_FUNC(wchar_t *) Py_GetPythonHome(void); + +#ifndef Py_LIMITED_API +PyAPI_FUNC(void) _Py_SetProgramFullPath(const wchar_t *); + +/* Only used by applications that embed the interpreter and need to + * override the standard encoding determination mechanism + */ +PyAPI_FUNC(int) Py_SetStandardStreamEncoding(const char *encoding, + const char *errors); + +/* PEP 432 Multi-phase initialization API (Private while provisional!) */ +PyAPI_FUNC(_PyInitError) _Py_InitializeCore( + PyInterpreterState **interp_p, + const _PyCoreConfig *config); +PyAPI_FUNC(int) _Py_IsCoreInitialized(void); +PyAPI_FUNC(_PyInitError) _Py_InitializeFromConfig( + const _PyCoreConfig *config); +#ifdef Py_BUILD_CORE +PyAPI_FUNC(void) _Py_Initialize_ReadEnvVarsNoAlloc(void); +#endif + +PyAPI_FUNC(PyObject *) _Py_GetGlobalVariablesAsDict(void); + +PyAPI_FUNC(_PyInitError) _PyCoreConfig_Read(_PyCoreConfig *); +PyAPI_FUNC(void) _PyCoreConfig_Clear(_PyCoreConfig *); +PyAPI_FUNC(int) _PyCoreConfig_Copy( + _PyCoreConfig *config, + const _PyCoreConfig *config2); +PyAPI_FUNC(PyObject *) _PyCoreConfig_AsDict(const _PyCoreConfig *config); +PyAPI_FUNC(void) _PyCoreConfig_SetGlobalConfig( + const _PyCoreConfig *config); + + +PyAPI_FUNC(_PyInitError) _PyMainInterpreterConfig_Read( + _PyMainInterpreterConfig *config, + const _PyCoreConfig *core_config); +PyAPI_FUNC(void) _PyMainInterpreterConfig_Clear(_PyMainInterpreterConfig *); +PyAPI_FUNC(int) _PyMainInterpreterConfig_Copy( + _PyMainInterpreterConfig *config, + const _PyMainInterpreterConfig *config2); +/* Used by _testcapi.get_main_config() */ +PyAPI_FUNC(PyObject*) _PyMainInterpreterConfig_AsDict( + const _PyMainInterpreterConfig *config); + +PyAPI_FUNC(_PyInitError) _Py_InitializeMainInterpreter( + PyInterpreterState *interp, + const _PyMainInterpreterConfig *config); +#endif /* !defined(Py_LIMITED_API) */ + + +/* Initialization and finalization */ +PyAPI_FUNC(void) Py_Initialize(void); +PyAPI_FUNC(void) Py_InitializeEx(int); +#ifndef Py_LIMITED_API +PyAPI_FUNC(void) _Py_FatalInitError(_PyInitError err) _Py_NO_RETURN; +#endif +PyAPI_FUNC(void) Py_Finalize(void); +#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03060000 +PyAPI_FUNC(int) Py_FinalizeEx(void); +#endif +PyAPI_FUNC(int) Py_IsInitialized(void); + +/* Subinterpreter support */ +PyAPI_FUNC(PyThreadState *) Py_NewInterpreter(void); +PyAPI_FUNC(void) Py_EndInterpreter(PyThreadState *); + + +/* Py_PyAtExit is for the atexit module, Py_AtExit is for low-level + * exit functions. + */ +#ifndef Py_LIMITED_API +PyAPI_FUNC(void) _Py_PyAtExit(void (*func)(PyObject *), PyObject *); +#endif +PyAPI_FUNC(int) Py_AtExit(void (*func)(void)); + +PyAPI_FUNC(void) Py_Exit(int) _Py_NO_RETURN; + +/* Restore signals that the interpreter has called SIG_IGN on to SIG_DFL. */ +#ifndef Py_LIMITED_API +PyAPI_FUNC(void) _Py_RestoreSignals(void); + +PyAPI_FUNC(int) Py_FdIsInteractive(FILE *, const char *); +#endif + +/* Bootstrap __main__ (defined in Modules/main.c) */ +PyAPI_FUNC(int) Py_Main(int argc, wchar_t **argv); +#ifdef Py_BUILD_CORE +PyAPI_FUNC(int) _Py_UnixMain(int argc, char **argv); +#endif + +/* In getpath.c */ +PyAPI_FUNC(wchar_t *) Py_GetProgramFullPath(void); +PyAPI_FUNC(wchar_t *) Py_GetPrefix(void); +PyAPI_FUNC(wchar_t *) Py_GetExecPrefix(void); +PyAPI_FUNC(wchar_t *) Py_GetPath(void); +#ifdef Py_BUILD_CORE +PyAPI_FUNC(_PyInitError) _PyPathConfig_Init(const _PyCoreConfig *core_config); +PyAPI_FUNC(int) _PyPathConfig_ComputeArgv0( + int argc, wchar_t **argv, + PyObject **argv0_p); +PyAPI_FUNC(int) _Py_FindEnvConfigValue( + FILE *env_file, + const wchar_t *key, + wchar_t *value, + size_t value_size); +#endif +PyAPI_FUNC(void) Py_SetPath(const wchar_t *); +#ifdef MS_WINDOWS +int _Py_CheckPython3(void); +#endif + +/* In their own files */ +PyAPI_FUNC(const char *) Py_GetVersion(void); +PyAPI_FUNC(const char *) Py_GetPlatform(void); +PyAPI_FUNC(const char *) Py_GetCopyright(void); +PyAPI_FUNC(const char *) Py_GetCompiler(void); +PyAPI_FUNC(const char *) Py_GetBuildInfo(void); +#ifndef Py_LIMITED_API +PyAPI_FUNC(const char *) _Py_gitidentifier(void); +PyAPI_FUNC(const char *) _Py_gitversion(void); +#endif + +/* Internal -- various one-time initializations */ +#ifndef Py_LIMITED_API +PyAPI_FUNC(PyObject *) _PyBuiltin_Init(void); +PyAPI_FUNC(_PyInitError) _PySys_BeginInit(PyObject **sysmod); +PyAPI_FUNC(int) _PySys_EndInit(PyObject *sysdict, _PyMainInterpreterConfig *config); +PyAPI_FUNC(_PyInitError) _PyImport_Init(PyInterpreterState *interp); +PyAPI_FUNC(void) _PyExc_Init(PyObject * bltinmod); +PyAPI_FUNC(_PyInitError) _PyImportHooks_Init(void); +PyAPI_FUNC(int) _PyFrame_Init(void); +PyAPI_FUNC(int) _PyFloat_Init(void); +PyAPI_FUNC(int) PyByteArray_Init(void); +PyAPI_FUNC(_PyInitError) _Py_HashRandomization_Init(const _PyCoreConfig *); +#endif +#ifdef Py_BUILD_CORE +PyAPI_FUNC(int) _Py_ReadHashSeed( + const char *seed_text, + int *use_hash_seed, + unsigned long *hash_seed); +#endif + +/* Various internal finalizers */ + +#ifdef Py_BUILD_CORE +PyAPI_FUNC(void) _PyExc_Fini(void); +PyAPI_FUNC(void) _PyImport_Fini(void); +PyAPI_FUNC(void) _PyImport_Fini2(void); +PyAPI_FUNC(void) _PyGC_DumpShutdownStats(void); +PyAPI_FUNC(void) _PyGC_Fini(void); +PyAPI_FUNC(void) _PyType_Fini(void); +PyAPI_FUNC(void) _Py_HashRandomization_Fini(void); +#endif /* Py_BUILD_CORE */ + +#ifndef Py_LIMITED_API +PyAPI_FUNC(void) PyMethod_Fini(void); +PyAPI_FUNC(void) PyFrame_Fini(void); +PyAPI_FUNC(void) PyCFunction_Fini(void); +PyAPI_FUNC(void) PyDict_Fini(void); +PyAPI_FUNC(void) PyTuple_Fini(void); +PyAPI_FUNC(void) PyList_Fini(void); +PyAPI_FUNC(void) PySet_Fini(void); +PyAPI_FUNC(void) PyBytes_Fini(void); +PyAPI_FUNC(void) PyByteArray_Fini(void); +PyAPI_FUNC(void) PyFloat_Fini(void); +PyAPI_FUNC(void) PyOS_FiniInterrupts(void); +PyAPI_FUNC(void) PySlice_Fini(void); +PyAPI_FUNC(void) PyAsyncGen_Fini(void); + +PyAPI_FUNC(int) _Py_IsFinalizing(void); +#endif /* !Py_LIMITED_API */ + +/* Signals */ +typedef void (*PyOS_sighandler_t)(int); +PyAPI_FUNC(PyOS_sighandler_t) PyOS_getsig(int); +PyAPI_FUNC(PyOS_sighandler_t) PyOS_setsig(int, PyOS_sighandler_t); + +#ifndef Py_LIMITED_API +/* Random */ +PyAPI_FUNC(int) _PyOS_URandom(void *buffer, Py_ssize_t size); +PyAPI_FUNC(int) _PyOS_URandomNonblock(void *buffer, Py_ssize_t size); +#endif /* !Py_LIMITED_API */ + +/* Legacy locale support */ +#ifndef Py_LIMITED_API +PyAPI_FUNC(void) _Py_CoerceLegacyLocale(const _PyCoreConfig *config); +PyAPI_FUNC(int) _Py_LegacyLocaleDetected(void); +PyAPI_FUNC(char *) _Py_SetLocaleFromEnv(int category); +#endif + +#ifdef __cplusplus +} +#endif +#endif /* !Py_PYLIFECYCLE_H */ diff --git a/env/Include/pymacconfig.h b/env/Include/pymacconfig.h new file mode 100644 index 0000000..9dde11b --- /dev/null +++ b/env/Include/pymacconfig.h @@ -0,0 +1,102 @@ +#ifndef PYMACCONFIG_H +#define PYMACCONFIG_H + /* + * This file moves some of the autoconf magic to compile-time + * when building on MacOSX. This is needed for building 4-way + * universal binaries and for 64-bit universal binaries because + * the values redefined below aren't configure-time constant but + * only compile-time constant in these scenarios. + */ + +#if defined(__APPLE__) + +# undef SIZEOF_LONG +# undef SIZEOF_PTHREAD_T +# undef SIZEOF_SIZE_T +# undef SIZEOF_TIME_T +# undef SIZEOF_VOID_P +# undef SIZEOF__BOOL +# undef SIZEOF_UINTPTR_T +# undef SIZEOF_PTHREAD_T +# undef WORDS_BIGENDIAN +# undef DOUBLE_IS_ARM_MIXED_ENDIAN_IEEE754 +# undef DOUBLE_IS_BIG_ENDIAN_IEEE754 +# undef DOUBLE_IS_LITTLE_ENDIAN_IEEE754 +# undef HAVE_GCC_ASM_FOR_X87 + +# undef VA_LIST_IS_ARRAY +# if defined(__LP64__) && defined(__x86_64__) +# define VA_LIST_IS_ARRAY 1 +# endif + +# undef HAVE_LARGEFILE_SUPPORT +# ifndef __LP64__ +# define HAVE_LARGEFILE_SUPPORT 1 +# endif + +# undef SIZEOF_LONG +# ifdef __LP64__ +# define SIZEOF__BOOL 1 +# define SIZEOF__BOOL 1 +# define SIZEOF_LONG 8 +# define SIZEOF_PTHREAD_T 8 +# define SIZEOF_SIZE_T 8 +# define SIZEOF_TIME_T 8 +# define SIZEOF_VOID_P 8 +# define SIZEOF_UINTPTR_T 8 +# define SIZEOF_PTHREAD_T 8 +# else +# ifdef __ppc__ +# define SIZEOF__BOOL 4 +# else +# define SIZEOF__BOOL 1 +# endif +# define SIZEOF_LONG 4 +# define SIZEOF_PTHREAD_T 4 +# define SIZEOF_SIZE_T 4 +# define SIZEOF_TIME_T 4 +# define SIZEOF_VOID_P 4 +# define SIZEOF_UINTPTR_T 4 +# define SIZEOF_PTHREAD_T 4 +# endif + +# if defined(__LP64__) + /* MacOSX 10.4 (the first release to support 64-bit code + * at all) only supports 64-bit in the UNIX layer. + * Therefore suppress the toolbox-glue in 64-bit mode. + */ + + /* In 64-bit mode setpgrp always has no arguments, in 32-bit + * mode that depends on the compilation environment + */ +# undef SETPGRP_HAVE_ARG + +# endif + +#ifdef __BIG_ENDIAN__ +#define WORDS_BIGENDIAN 1 +#define DOUBLE_IS_BIG_ENDIAN_IEEE754 +#else +#define DOUBLE_IS_LITTLE_ENDIAN_IEEE754 +#endif /* __BIG_ENDIAN */ + +#ifdef __i386__ +# define HAVE_GCC_ASM_FOR_X87 +#endif + + /* + * The definition in pyconfig.h is only valid on the OS release + * where configure ran on and not necessarily for all systems where + * the executable can be used on. + * + * Specifically: OSX 10.4 has limited supported for '%zd', while + * 10.5 has full support for '%zd'. A binary built on 10.5 won't + * work properly on 10.4 unless we suppress the definition + * of PY_FORMAT_SIZE_T + */ +#undef PY_FORMAT_SIZE_T + + +#endif /* defined(_APPLE__) */ + +#endif /* PYMACCONFIG_H */ diff --git a/env/Include/pymacro.h b/env/Include/pymacro.h new file mode 100644 index 0000000..3f6ddbe --- /dev/null +++ b/env/Include/pymacro.h @@ -0,0 +1,100 @@ +#ifndef Py_PYMACRO_H +#define Py_PYMACRO_H + +/* Minimum value between x and y */ +#define Py_MIN(x, y) (((x) > (y)) ? (y) : (x)) + +/* Maximum value between x and y */ +#define Py_MAX(x, y) (((x) > (y)) ? (x) : (y)) + +/* Absolute value of the number x */ +#define Py_ABS(x) ((x) < 0 ? -(x) : (x)) + +#define _Py_XSTRINGIFY(x) #x + +/* Convert the argument to a string. For example, Py_STRINGIFY(123) is replaced + with "123" by the preprocessor. Defines are also replaced by their value. + For example Py_STRINGIFY(__LINE__) is replaced by the line number, not + by "__LINE__". */ +#define Py_STRINGIFY(x) _Py_XSTRINGIFY(x) + +/* Get the size of a structure member in bytes */ +#define Py_MEMBER_SIZE(type, member) sizeof(((type *)0)->member) + +/* Argument must be a char or an int in [-128, 127] or [0, 255]. */ +#define Py_CHARMASK(c) ((unsigned char)((c) & 0xff)) + +/* Assert a build-time dependency, as an expression. + + Your compile will fail if the condition isn't true, or can't be evaluated + by the compiler. This can be used in an expression: its value is 0. + + Example: + + #define foo_to_char(foo) \ + ((char *)(foo) \ + + Py_BUILD_ASSERT_EXPR(offsetof(struct foo, string) == 0)) + + Written by Rusty Russell, public domain, http://ccodearchive.net/ */ +#define Py_BUILD_ASSERT_EXPR(cond) \ + (sizeof(char [1 - 2*!(cond)]) - 1) + +#define Py_BUILD_ASSERT(cond) do { \ + (void)Py_BUILD_ASSERT_EXPR(cond); \ + } while(0) + +/* Get the number of elements in a visible array + + This does not work on pointers, or arrays declared as [], or function + parameters. With correct compiler support, such usage will cause a build + error (see Py_BUILD_ASSERT_EXPR). + + Written by Rusty Russell, public domain, http://ccodearchive.net/ + + Requires at GCC 3.1+ */ +#if (defined(__GNUC__) && !defined(__STRICT_ANSI__) && \ + (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 1)) || (__GNUC__ >= 4))) +/* Two gcc extensions. + &a[0] degrades to a pointer: a different type from an array */ +#define Py_ARRAY_LENGTH(array) \ + (sizeof(array) / sizeof((array)[0]) \ + + Py_BUILD_ASSERT_EXPR(!__builtin_types_compatible_p(typeof(array), \ + typeof(&(array)[0])))) +#else +#define Py_ARRAY_LENGTH(array) \ + (sizeof(array) / sizeof((array)[0])) +#endif + + +/* Define macros for inline documentation. */ +#define PyDoc_VAR(name) static char name[] +#define PyDoc_STRVAR(name,str) PyDoc_VAR(name) = PyDoc_STR(str) +#ifdef WITH_DOC_STRINGS +#define PyDoc_STR(str) str +#else +#define PyDoc_STR(str) "" +#endif + +/* Below "a" is a power of 2. */ +/* Round down size "n" to be a multiple of "a". */ +#define _Py_SIZE_ROUND_DOWN(n, a) ((size_t)(n) & ~(size_t)((a) - 1)) +/* Round up size "n" to be a multiple of "a". */ +#define _Py_SIZE_ROUND_UP(n, a) (((size_t)(n) + \ + (size_t)((a) - 1)) & ~(size_t)((a) - 1)) +/* Round pointer "p" down to the closest "a"-aligned address <= "p". */ +#define _Py_ALIGN_DOWN(p, a) ((void *)((uintptr_t)(p) & ~(uintptr_t)((a) - 1))) +/* Round pointer "p" up to the closest "a"-aligned address >= "p". */ +#define _Py_ALIGN_UP(p, a) ((void *)(((uintptr_t)(p) + \ + (uintptr_t)((a) - 1)) & ~(uintptr_t)((a) - 1))) +/* Check if pointer "p" is aligned to "a"-bytes boundary. */ +#define _Py_IS_ALIGNED(p, a) (!((uintptr_t)(p) & (uintptr_t)((a) - 1))) + +#ifdef __GNUC__ +#define Py_UNUSED(name) _unused_ ## name __attribute__((unused)) +#else +#define Py_UNUSED(name) _unused_ ## name +#endif + +#define Py_UNREACHABLE() abort() + +#endif /* Py_PYMACRO_H */ diff --git a/env/Include/pymath.h b/env/Include/pymath.h new file mode 100644 index 0000000..6cf69f9 --- /dev/null +++ b/env/Include/pymath.h @@ -0,0 +1,230 @@ +#ifndef Py_PYMATH_H +#define Py_PYMATH_H + +#include "pyconfig.h" /* include for defines */ + +/************************************************************************** +Symbols and macros to supply platform-independent interfaces to mathematical +functions and constants +**************************************************************************/ + +/* Python provides implementations for copysign, round and hypot in + * Python/pymath.c just in case your math library doesn't provide the + * functions. + * + *Note: PC/pyconfig.h defines copysign as _copysign + */ +#ifndef HAVE_COPYSIGN +extern double copysign(double, double); +#endif + +#ifndef HAVE_ROUND +extern double round(double); +#endif + +#ifndef HAVE_HYPOT +extern double hypot(double, double); +#endif + +/* extra declarations */ +#ifndef _MSC_VER +#ifndef __STDC__ +extern double fmod (double, double); +extern double frexp (double, int *); +extern double ldexp (double, int); +extern double modf (double, double *); +extern double pow(double, double); +#endif /* __STDC__ */ +#endif /* _MSC_VER */ + +/* High precision definition of pi and e (Euler) + * The values are taken from libc6's math.h. + */ +#ifndef Py_MATH_PIl +#define Py_MATH_PIl 3.1415926535897932384626433832795029L +#endif +#ifndef Py_MATH_PI +#define Py_MATH_PI 3.14159265358979323846 +#endif + +#ifndef Py_MATH_El +#define Py_MATH_El 2.7182818284590452353602874713526625L +#endif + +#ifndef Py_MATH_E +#define Py_MATH_E 2.7182818284590452354 +#endif + +/* Tau (2pi) to 40 digits, taken from tauday.com/tau-digits. */ +#ifndef Py_MATH_TAU +#define Py_MATH_TAU 6.2831853071795864769252867665590057683943L +#endif + + +/* On x86, Py_FORCE_DOUBLE forces a floating-point number out of an x87 FPU + register and into a 64-bit memory location, rounding from extended + precision to double precision in the process. On other platforms it does + nothing. */ + +/* we take double rounding as evidence of x87 usage */ +#ifndef Py_LIMITED_API +#ifndef Py_FORCE_DOUBLE +# ifdef X87_DOUBLE_ROUNDING +PyAPI_FUNC(double) _Py_force_double(double); +# define Py_FORCE_DOUBLE(X) (_Py_force_double(X)) +# else +# define Py_FORCE_DOUBLE(X) (X) +# endif +#endif +#endif + +#ifndef Py_LIMITED_API +#ifdef HAVE_GCC_ASM_FOR_X87 +PyAPI_FUNC(unsigned short) _Py_get_387controlword(void); +PyAPI_FUNC(void) _Py_set_387controlword(unsigned short); +#endif +#endif + +/* Py_IS_NAN(X) + * Return 1 if float or double arg is a NaN, else 0. + * Caution: + * X is evaluated more than once. + * This may not work on all platforms. Each platform has *some* + * way to spell this, though -- override in pyconfig.h if you have + * a platform where it doesn't work. + * Note: PC/pyconfig.h defines Py_IS_NAN as _isnan + */ +#ifndef Py_IS_NAN +#if defined HAVE_DECL_ISNAN && HAVE_DECL_ISNAN == 1 +#define Py_IS_NAN(X) isnan(X) +#else +#define Py_IS_NAN(X) ((X) != (X)) +#endif +#endif + +/* Py_IS_INFINITY(X) + * Return 1 if float or double arg is an infinity, else 0. + * Caution: + * X is evaluated more than once. + * This implementation may set the underflow flag if |X| is very small; + * it really can't be implemented correctly (& easily) before C99. + * Override in pyconfig.h if you have a better spelling on your platform. + * Py_FORCE_DOUBLE is used to avoid getting false negatives from a + * non-infinite value v sitting in an 80-bit x87 register such that + * v becomes infinite when spilled from the register to 64-bit memory. + * Note: PC/pyconfig.h defines Py_IS_INFINITY as _isinf + */ +#ifndef Py_IS_INFINITY +# if defined HAVE_DECL_ISINF && HAVE_DECL_ISINF == 1 +# define Py_IS_INFINITY(X) isinf(X) +# else +# define Py_IS_INFINITY(X) ((X) && \ + (Py_FORCE_DOUBLE(X)*0.5 == Py_FORCE_DOUBLE(X))) +# endif +#endif + +/* Py_IS_FINITE(X) + * Return 1 if float or double arg is neither infinite nor NAN, else 0. + * Some compilers (e.g. VisualStudio) have intrisics for this, so a special + * macro for this particular test is useful + * Note: PC/pyconfig.h defines Py_IS_FINITE as _finite + */ +#ifndef Py_IS_FINITE +#if defined HAVE_DECL_ISFINITE && HAVE_DECL_ISFINITE == 1 +#define Py_IS_FINITE(X) isfinite(X) +#elif defined HAVE_FINITE +#define Py_IS_FINITE(X) finite(X) +#else +#define Py_IS_FINITE(X) (!Py_IS_INFINITY(X) && !Py_IS_NAN(X)) +#endif +#endif + +/* HUGE_VAL is supposed to expand to a positive double infinity. Python + * uses Py_HUGE_VAL instead because some platforms are broken in this + * respect. We used to embed code in pyport.h to try to worm around that, + * but different platforms are broken in conflicting ways. If you're on + * a platform where HUGE_VAL is defined incorrectly, fiddle your Python + * config to #define Py_HUGE_VAL to something that works on your platform. + */ +#ifndef Py_HUGE_VAL +#define Py_HUGE_VAL HUGE_VAL +#endif + +/* Py_NAN + * A value that evaluates to a NaN. On IEEE 754 platforms INF*0 or + * INF/INF works. Define Py_NO_NAN in pyconfig.h if your platform + * doesn't support NaNs. + */ +#if !defined(Py_NAN) && !defined(Py_NO_NAN) +#if !defined(__INTEL_COMPILER) + #define Py_NAN (Py_HUGE_VAL * 0.) +#else /* __INTEL_COMPILER */ + #if defined(ICC_NAN_STRICT) + #pragma float_control(push) + #pragma float_control(precise, on) + #pragma float_control(except, on) + #if defined(_MSC_VER) + __declspec(noinline) + #else /* Linux */ + __attribute__((noinline)) + #endif /* _MSC_VER */ + static double __icc_nan() + { + return sqrt(-1.0); + } + #pragma float_control (pop) + #define Py_NAN __icc_nan() + #else /* ICC_NAN_RELAXED as default for Intel Compiler */ + static const union { unsigned char buf[8]; double __icc_nan; } __nan_store = {0,0,0,0,0,0,0xf8,0x7f}; + #define Py_NAN (__nan_store.__icc_nan) + #endif /* ICC_NAN_STRICT */ +#endif /* __INTEL_COMPILER */ +#endif + +/* Py_OVERFLOWED(X) + * Return 1 iff a libm function overflowed. Set errno to 0 before calling + * a libm function, and invoke this macro after, passing the function + * result. + * Caution: + * This isn't reliable. C99 no longer requires libm to set errno under + * any exceptional condition, but does require +- HUGE_VAL return + * values on overflow. A 754 box *probably* maps HUGE_VAL to a + * double infinity, and we're cool if that's so, unless the input + * was an infinity and an infinity is the expected result. A C89 + * system sets errno to ERANGE, so we check for that too. We're + * out of luck if a C99 754 box doesn't map HUGE_VAL to +Inf, or + * if the returned result is a NaN, or if a C89 box returns HUGE_VAL + * in non-overflow cases. + * X is evaluated more than once. + * Some platforms have better way to spell this, so expect some #ifdef'ery. + * + * OpenBSD uses 'isinf()' because a compiler bug on that platform causes + * the longer macro version to be mis-compiled. This isn't optimal, and + * should be removed once a newer compiler is available on that platform. + * The system that had the failure was running OpenBSD 3.2 on Intel, with + * gcc 2.95.3. + * + * According to Tim's checkin, the FreeBSD systems use isinf() to work + * around a FPE bug on that platform. + */ +#if defined(__FreeBSD__) || defined(__OpenBSD__) +#define Py_OVERFLOWED(X) isinf(X) +#else +#define Py_OVERFLOWED(X) ((X) != 0.0 && (errno == ERANGE || \ + (X) == Py_HUGE_VAL || \ + (X) == -Py_HUGE_VAL)) +#endif + +/* Return whether integral type *type* is signed or not. */ +#define _Py_IntegralTypeSigned(type) ((type)(-1) < 0) +/* Return the maximum value of integral type *type*. */ +#define _Py_IntegralTypeMax(type) ((_Py_IntegralTypeSigned(type)) ? (((((type)1 << (sizeof(type)*CHAR_BIT - 2)) - 1) << 1) + 1) : ~(type)0) +/* Return the minimum value of integral type *type*. */ +#define _Py_IntegralTypeMin(type) ((_Py_IntegralTypeSigned(type)) ? -_Py_IntegralTypeMax(type) - 1 : 0) +/* Check whether *v* is in the range of integral type *type*. This is most + * useful if *v* is floating-point, since demoting a floating-point *v* to an + * integral type that cannot represent *v*'s integral part is undefined + * behavior. */ +#define _Py_InIntegralTypeRange(type, v) (_Py_IntegralTypeMin(type) <= v && v <= _Py_IntegralTypeMax(type)) + +#endif /* Py_PYMATH_H */ diff --git a/env/Include/pymem.h b/env/Include/pymem.h new file mode 100644 index 0000000..458a648 --- /dev/null +++ b/env/Include/pymem.h @@ -0,0 +1,244 @@ +/* The PyMem_ family: low-level memory allocation interfaces. + See objimpl.h for the PyObject_ memory family. +*/ + +#ifndef Py_PYMEM_H +#define Py_PYMEM_H + +#include "pyport.h" + +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef Py_LIMITED_API +PyAPI_FUNC(void *) PyMem_RawMalloc(size_t size); +PyAPI_FUNC(void *) PyMem_RawCalloc(size_t nelem, size_t elsize); +PyAPI_FUNC(void *) PyMem_RawRealloc(void *ptr, size_t new_size); +PyAPI_FUNC(void) PyMem_RawFree(void *ptr); + +/* Configure the Python memory allocators. Pass NULL to use default + allocators. */ +PyAPI_FUNC(int) _PyMem_SetupAllocators(const char *opt); + +/* Try to get the allocators name set by _PyMem_SetupAllocators(). */ +PyAPI_FUNC(const char*) _PyMem_GetAllocatorsName(void); + +/* Track an allocated memory block in the tracemalloc module. + Return 0 on success, return -1 on error (failed to allocate memory to store + the trace). + + Return -2 if tracemalloc is disabled. + + If memory block is already tracked, update the existing trace. */ +PyAPI_FUNC(int) PyTraceMalloc_Track( + unsigned int domain, + uintptr_t ptr, + size_t size); + +/* Untrack an allocated memory block in the tracemalloc module. + Do nothing if the block was not tracked. + + Return -2 if tracemalloc is disabled, otherwise return 0. */ +PyAPI_FUNC(int) PyTraceMalloc_Untrack( + unsigned int domain, + uintptr_t ptr); + +/* Get the traceback where a memory block was allocated. + + Return a tuple of (filename: str, lineno: int) tuples. + + Return None if the tracemalloc module is disabled or if the memory block + is not tracked by tracemalloc. + + Raise an exception and return NULL on error. */ +PyAPI_FUNC(PyObject*) _PyTraceMalloc_GetTraceback( + unsigned int domain, + uintptr_t ptr); +#endif /* !defined(Py_LIMITED_API) */ + + +/* BEWARE: + + Each interface exports both functions and macros. Extension modules should + use the functions, to ensure binary compatibility across Python versions. + Because the Python implementation is free to change internal details, and + the macros may (or may not) expose details for speed, if you do use the + macros you must recompile your extensions with each Python release. + + Never mix calls to PyMem_ with calls to the platform malloc/realloc/ + calloc/free. For example, on Windows different DLLs may end up using + different heaps, and if you use PyMem_Malloc you'll get the memory from the + heap used by the Python DLL; it could be a disaster if you free()'ed that + directly in your own extension. Using PyMem_Free instead ensures Python + can return the memory to the proper heap. As another example, in + PYMALLOC_DEBUG mode, Python wraps all calls to all PyMem_ and PyObject_ + memory functions in special debugging wrappers that add additional + debugging info to dynamic memory blocks. The system routines have no idea + what to do with that stuff, and the Python wrappers have no idea what to do + with raw blocks obtained directly by the system routines then. + + The GIL must be held when using these APIs. +*/ + +/* + * Raw memory interface + * ==================== + */ + +/* Functions + + Functions supplying platform-independent semantics for malloc/realloc/ + free. These functions make sure that allocating 0 bytes returns a distinct + non-NULL pointer (whenever possible -- if we're flat out of memory, NULL + may be returned), even if the platform malloc and realloc don't. + Returned pointers must be checked for NULL explicitly. No action is + performed on failure (no exception is set, no warning is printed, etc). +*/ + +PyAPI_FUNC(void *) PyMem_Malloc(size_t size); +#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03050000 +PyAPI_FUNC(void *) PyMem_Calloc(size_t nelem, size_t elsize); +#endif +PyAPI_FUNC(void *) PyMem_Realloc(void *ptr, size_t new_size); +PyAPI_FUNC(void) PyMem_Free(void *ptr); + +#ifndef Py_LIMITED_API +/* strdup() using PyMem_RawMalloc() */ +PyAPI_FUNC(char *) _PyMem_RawStrdup(const char *str); + +/* strdup() using PyMem_Malloc() */ +PyAPI_FUNC(char *) _PyMem_Strdup(const char *str); + +/* wcsdup() using PyMem_RawMalloc() */ +PyAPI_FUNC(wchar_t*) _PyMem_RawWcsdup(const wchar_t *str); +#endif + +/* Macros. */ + +/* PyMem_MALLOC(0) means malloc(1). Some systems would return NULL + for malloc(0), which would be treated as an error. Some platforms + would return a pointer with no memory behind it, which would break + pymalloc. To solve these problems, allocate an extra byte. */ +/* Returns NULL to indicate error if a negative size or size larger than + Py_ssize_t can represent is supplied. Helps prevents security holes. */ +#define PyMem_MALLOC(n) PyMem_Malloc(n) +#define PyMem_REALLOC(p, n) PyMem_Realloc(p, n) +#define PyMem_FREE(p) PyMem_Free(p) + +/* + * Type-oriented memory interface + * ============================== + * + * Allocate memory for n objects of the given type. Returns a new pointer + * or NULL if the request was too large or memory allocation failed. Use + * these macros rather than doing the multiplication yourself so that proper + * overflow checking is always done. + */ + +#define PyMem_New(type, n) \ + ( ((size_t)(n) > PY_SSIZE_T_MAX / sizeof(type)) ? NULL : \ + ( (type *) PyMem_Malloc((n) * sizeof(type)) ) ) +#define PyMem_NEW(type, n) \ + ( ((size_t)(n) > PY_SSIZE_T_MAX / sizeof(type)) ? NULL : \ + ( (type *) PyMem_MALLOC((n) * sizeof(type)) ) ) + +/* + * The value of (p) is always clobbered by this macro regardless of success. + * The caller MUST check if (p) is NULL afterwards and deal with the memory + * error if so. This means the original value of (p) MUST be saved for the + * caller's memory error handler to not lose track of it. + */ +#define PyMem_Resize(p, type, n) \ + ( (p) = ((size_t)(n) > PY_SSIZE_T_MAX / sizeof(type)) ? NULL : \ + (type *) PyMem_Realloc((p), (n) * sizeof(type)) ) +#define PyMem_RESIZE(p, type, n) \ + ( (p) = ((size_t)(n) > PY_SSIZE_T_MAX / sizeof(type)) ? NULL : \ + (type *) PyMem_REALLOC((p), (n) * sizeof(type)) ) + +/* PyMem{Del,DEL} are left over from ancient days, and shouldn't be used + * anymore. They're just confusing aliases for PyMem_{Free,FREE} now. + */ +#define PyMem_Del PyMem_Free +#define PyMem_DEL PyMem_FREE + +#ifndef Py_LIMITED_API +typedef enum { + /* PyMem_RawMalloc(), PyMem_RawRealloc() and PyMem_RawFree() */ + PYMEM_DOMAIN_RAW, + + /* PyMem_Malloc(), PyMem_Realloc() and PyMem_Free() */ + PYMEM_DOMAIN_MEM, + + /* PyObject_Malloc(), PyObject_Realloc() and PyObject_Free() */ + PYMEM_DOMAIN_OBJ +} PyMemAllocatorDomain; + +typedef struct { + /* user context passed as the first argument to the 4 functions */ + void *ctx; + + /* allocate a memory block */ + void* (*malloc) (void *ctx, size_t size); + + /* allocate a memory block initialized by zeros */ + void* (*calloc) (void *ctx, size_t nelem, size_t elsize); + + /* allocate or resize a memory block */ + void* (*realloc) (void *ctx, void *ptr, size_t new_size); + + /* release a memory block */ + void (*free) (void *ctx, void *ptr); +} PyMemAllocatorEx; + +/* Get the memory block allocator of the specified domain. */ +PyAPI_FUNC(void) PyMem_GetAllocator(PyMemAllocatorDomain domain, + PyMemAllocatorEx *allocator); + +/* Set the memory block allocator of the specified domain. + + The new allocator must return a distinct non-NULL pointer when requesting + zero bytes. + + For the PYMEM_DOMAIN_RAW domain, the allocator must be thread-safe: the GIL + is not held when the allocator is called. + + If the new allocator is not a hook (don't call the previous allocator), the + PyMem_SetupDebugHooks() function must be called to reinstall the debug hooks + on top on the new allocator. */ +PyAPI_FUNC(void) PyMem_SetAllocator(PyMemAllocatorDomain domain, + PyMemAllocatorEx *allocator); + +/* Setup hooks to detect bugs in the following Python memory allocator + functions: + + - PyMem_RawMalloc(), PyMem_RawRealloc(), PyMem_RawFree() + - PyMem_Malloc(), PyMem_Realloc(), PyMem_Free() + - PyObject_Malloc(), PyObject_Realloc() and PyObject_Free() + + Newly allocated memory is filled with the byte 0xCB, freed memory is filled + with the byte 0xDB. Additional checks: + + - detect API violations, ex: PyObject_Free() called on a buffer allocated + by PyMem_Malloc() + - detect write before the start of the buffer (buffer underflow) + - detect write after the end of the buffer (buffer overflow) + + The function does nothing if Python is not compiled is debug mode. */ +PyAPI_FUNC(void) PyMem_SetupDebugHooks(void); +#endif + +#ifdef Py_BUILD_CORE +/* Set the memory allocator of the specified domain to the default. + Save the old allocator into *old_alloc if it's non-NULL. + Return on success, or return -1 if the domain is unknown. */ +PyAPI_FUNC(int) _PyMem_SetDefaultAllocator( + PyMemAllocatorDomain domain, + PyMemAllocatorEx *old_alloc); +#endif + +#ifdef __cplusplus +} +#endif + +#endif /* !Py_PYMEM_H */ diff --git a/env/Include/pyport.h b/env/Include/pyport.h new file mode 100644 index 0000000..c1f4c7f --- /dev/null +++ b/env/Include/pyport.h @@ -0,0 +1,793 @@ +#ifndef Py_PYPORT_H +#define Py_PYPORT_H + +#include "pyconfig.h" /* include for defines */ + +#include + +/************************************************************************** +Symbols and macros to supply platform-independent interfaces to basic +C language & library operations whose spellings vary across platforms. + +Please try to make documentation here as clear as possible: by definition, +the stuff here is trying to illuminate C's darkest corners. + +Config #defines referenced here: + +SIGNED_RIGHT_SHIFT_ZERO_FILLS +Meaning: To be defined iff i>>j does not extend the sign bit when i is a + signed integral type and i < 0. +Used in: Py_ARITHMETIC_RIGHT_SHIFT + +Py_DEBUG +Meaning: Extra checks compiled in for debug mode. +Used in: Py_SAFE_DOWNCAST + +**************************************************************************/ + +/* typedefs for some C9X-defined synonyms for integral types. + * + * The names in Python are exactly the same as the C9X names, except with a + * Py_ prefix. Until C9X is universally implemented, this is the only way + * to ensure that Python gets reliable names that don't conflict with names + * in non-Python code that are playing their own tricks to define the C9X + * names. + * + * NOTE: don't go nuts here! Python has no use for *most* of the C9X + * integral synonyms. Only define the ones we actually need. + */ + +/* long long is required. Ensure HAVE_LONG_LONG is defined for compatibility. */ +#ifndef HAVE_LONG_LONG +#define HAVE_LONG_LONG 1 +#endif +#ifndef PY_LONG_LONG +#define PY_LONG_LONG long long +/* If LLONG_MAX is defined in limits.h, use that. */ +#define PY_LLONG_MIN LLONG_MIN +#define PY_LLONG_MAX LLONG_MAX +#define PY_ULLONG_MAX ULLONG_MAX +#endif + +#define PY_UINT32_T uint32_t +#define PY_UINT64_T uint64_t + +/* Signed variants of the above */ +#define PY_INT32_T int32_t +#define PY_INT64_T int64_t + +/* If PYLONG_BITS_IN_DIGIT is not defined then we'll use 30-bit digits if all + the necessary integer types are available, and we're on a 64-bit platform + (as determined by SIZEOF_VOID_P); otherwise we use 15-bit digits. */ + +#ifndef PYLONG_BITS_IN_DIGIT +#if SIZEOF_VOID_P >= 8 +#define PYLONG_BITS_IN_DIGIT 30 +#else +#define PYLONG_BITS_IN_DIGIT 15 +#endif +#endif + +/* uintptr_t is the C9X name for an unsigned integral type such that a + * legitimate void* can be cast to uintptr_t and then back to void* again + * without loss of information. Similarly for intptr_t, wrt a signed + * integral type. + */ +typedef uintptr_t Py_uintptr_t; +typedef intptr_t Py_intptr_t; + +/* Py_ssize_t is a signed integral type such that sizeof(Py_ssize_t) == + * sizeof(size_t). C99 doesn't define such a thing directly (size_t is an + * unsigned integral type). See PEP 353 for details. + */ +#ifdef HAVE_SSIZE_T +typedef ssize_t Py_ssize_t; +#elif SIZEOF_VOID_P == SIZEOF_SIZE_T +typedef Py_intptr_t Py_ssize_t; +#else +# error "Python needs a typedef for Py_ssize_t in pyport.h." +#endif + +/* Py_hash_t is the same size as a pointer. */ +#define SIZEOF_PY_HASH_T SIZEOF_SIZE_T +typedef Py_ssize_t Py_hash_t; +/* Py_uhash_t is the unsigned equivalent needed to calculate numeric hash. */ +#define SIZEOF_PY_UHASH_T SIZEOF_SIZE_T +typedef size_t Py_uhash_t; + +/* Only used for compatibility with code that may not be PY_SSIZE_T_CLEAN. */ +#ifdef PY_SSIZE_T_CLEAN +typedef Py_ssize_t Py_ssize_clean_t; +#else +typedef int Py_ssize_clean_t; +#endif + +/* Largest possible value of size_t. */ +#define PY_SIZE_MAX SIZE_MAX + +/* Largest positive value of type Py_ssize_t. */ +#define PY_SSIZE_T_MAX ((Py_ssize_t)(((size_t)-1)>>1)) +/* Smallest negative value of type Py_ssize_t. */ +#define PY_SSIZE_T_MIN (-PY_SSIZE_T_MAX-1) + +/* PY_FORMAT_SIZE_T is a platform-specific modifier for use in a printf + * format to convert an argument with the width of a size_t or Py_ssize_t. + * C99 introduced "z" for this purpose, but not all platforms support that; + * e.g., MS compilers use "I" instead. + * + * These "high level" Python format functions interpret "z" correctly on + * all platforms (Python interprets the format string itself, and does whatever + * the platform C requires to convert a size_t/Py_ssize_t argument): + * + * PyBytes_FromFormat + * PyErr_Format + * PyBytes_FromFormatV + * PyUnicode_FromFormatV + * + * Lower-level uses require that you interpolate the correct format modifier + * yourself (e.g., calling printf, fprintf, sprintf, PyOS_snprintf); for + * example, + * + * Py_ssize_t index; + * fprintf(stderr, "index %" PY_FORMAT_SIZE_T "d sucks\n", index); + * + * That will expand to %ld, or %Id, or to something else correct for a + * Py_ssize_t on the platform. + */ +#ifndef PY_FORMAT_SIZE_T +# if SIZEOF_SIZE_T == SIZEOF_INT && !defined(__APPLE__) +# define PY_FORMAT_SIZE_T "" +# elif SIZEOF_SIZE_T == SIZEOF_LONG +# define PY_FORMAT_SIZE_T "l" +# elif defined(MS_WINDOWS) +# define PY_FORMAT_SIZE_T "I" +# else +# error "This platform's pyconfig.h needs to define PY_FORMAT_SIZE_T" +# endif +#endif + +/* Py_LOCAL can be used instead of static to get the fastest possible calling + * convention for functions that are local to a given module. + * + * Py_LOCAL_INLINE does the same thing, and also explicitly requests inlining, + * for platforms that support that. + * + * If PY_LOCAL_AGGRESSIVE is defined before python.h is included, more + * "aggressive" inlining/optimization is enabled for the entire module. This + * may lead to code bloat, and may slow things down for those reasons. It may + * also lead to errors, if the code relies on pointer aliasing. Use with + * care. + * + * NOTE: You can only use this for functions that are entirely local to a + * module; functions that are exported via method tables, callbacks, etc, + * should keep using static. + */ + +#if defined(_MSC_VER) +#if defined(PY_LOCAL_AGGRESSIVE) +/* enable more aggressive optimization for visual studio */ +#pragma optimize("agtw", on) +#endif +/* ignore warnings if the compiler decides not to inline a function */ +#pragma warning(disable: 4710) +/* fastest possible local call under MSVC */ +#define Py_LOCAL(type) static type __fastcall +#define Py_LOCAL_INLINE(type) static __inline type __fastcall +#else +#define Py_LOCAL(type) static type +#define Py_LOCAL_INLINE(type) static inline type +#endif + +/* Py_MEMCPY is kept for backwards compatibility, + * see https://bugs.python.org/issue28126 */ +#define Py_MEMCPY memcpy + +#include + +#ifdef HAVE_IEEEFP_H +#include /* needed for 'finite' declaration on some platforms */ +#endif + +#include /* Moved here from the math section, before extern "C" */ + +/******************************************** + * WRAPPER FOR and/or * + ********************************************/ + +#ifdef TIME_WITH_SYS_TIME +#include +#include +#else /* !TIME_WITH_SYS_TIME */ +#ifdef HAVE_SYS_TIME_H +#include +#else /* !HAVE_SYS_TIME_H */ +#include +#endif /* !HAVE_SYS_TIME_H */ +#endif /* !TIME_WITH_SYS_TIME */ + + +/****************************** + * WRAPPER FOR * + ******************************/ + +/* NB caller must include */ + +#ifdef HAVE_SYS_SELECT_H +#include +#endif /* !HAVE_SYS_SELECT_H */ + +/******************************* + * stat() and fstat() fiddling * + *******************************/ + +#ifdef HAVE_SYS_STAT_H +#include +#elif defined(HAVE_STAT_H) +#include +#endif + +#ifndef S_IFMT +/* VisualAge C/C++ Failed to Define MountType Field in sys/stat.h */ +#define S_IFMT 0170000 +#endif + +#ifndef S_IFLNK +/* Windows doesn't define S_IFLNK but posixmodule.c maps + * IO_REPARSE_TAG_SYMLINK to S_IFLNK */ +# define S_IFLNK 0120000 +#endif + +#ifndef S_ISREG +#define S_ISREG(x) (((x) & S_IFMT) == S_IFREG) +#endif + +#ifndef S_ISDIR +#define S_ISDIR(x) (((x) & S_IFMT) == S_IFDIR) +#endif + +#ifndef S_ISCHR +#define S_ISCHR(x) (((x) & S_IFMT) == S_IFCHR) +#endif + +#ifdef __cplusplus +/* Move this down here since some C++ #include's don't like to be included + inside an extern "C" */ +extern "C" { +#endif + + +/* Py_ARITHMETIC_RIGHT_SHIFT + * C doesn't define whether a right-shift of a signed integer sign-extends + * or zero-fills. Here a macro to force sign extension: + * Py_ARITHMETIC_RIGHT_SHIFT(TYPE, I, J) + * Return I >> J, forcing sign extension. Arithmetically, return the + * floor of I/2**J. + * Requirements: + * I should have signed integer type. In the terminology of C99, this can + * be either one of the five standard signed integer types (signed char, + * short, int, long, long long) or an extended signed integer type. + * J is an integer >= 0 and strictly less than the number of bits in the + * type of I (because C doesn't define what happens for J outside that + * range either). + * TYPE used to specify the type of I, but is now ignored. It's been left + * in for backwards compatibility with versions <= 2.6 or 3.0. + * Caution: + * I may be evaluated more than once. + */ +#ifdef SIGNED_RIGHT_SHIFT_ZERO_FILLS +#define Py_ARITHMETIC_RIGHT_SHIFT(TYPE, I, J) \ + ((I) < 0 ? -1-((-1-(I)) >> (J)) : (I) >> (J)) +#else +#define Py_ARITHMETIC_RIGHT_SHIFT(TYPE, I, J) ((I) >> (J)) +#endif + +/* Py_FORCE_EXPANSION(X) + * "Simply" returns its argument. However, macro expansions within the + * argument are evaluated. This unfortunate trickery is needed to get + * token-pasting to work as desired in some cases. + */ +#define Py_FORCE_EXPANSION(X) X + +/* Py_SAFE_DOWNCAST(VALUE, WIDE, NARROW) + * Cast VALUE to type NARROW from type WIDE. In Py_DEBUG mode, this + * assert-fails if any information is lost. + * Caution: + * VALUE may be evaluated more than once. + */ +#ifdef Py_DEBUG +#define Py_SAFE_DOWNCAST(VALUE, WIDE, NARROW) \ + (assert((WIDE)(NARROW)(VALUE) == (VALUE)), (NARROW)(VALUE)) +#else +#define Py_SAFE_DOWNCAST(VALUE, WIDE, NARROW) (NARROW)(VALUE) +#endif + +/* Py_SET_ERRNO_ON_MATH_ERROR(x) + * If a libm function did not set errno, but it looks like the result + * overflowed or not-a-number, set errno to ERANGE or EDOM. Set errno + * to 0 before calling a libm function, and invoke this macro after, + * passing the function result. + * Caution: + * This isn't reliable. See Py_OVERFLOWED comments. + * X is evaluated more than once. + */ +#if defined(__FreeBSD__) || defined(__OpenBSD__) || (defined(__hpux) && defined(__ia64)) +#define _Py_SET_EDOM_FOR_NAN(X) if (isnan(X)) errno = EDOM; +#else +#define _Py_SET_EDOM_FOR_NAN(X) ; +#endif +#define Py_SET_ERRNO_ON_MATH_ERROR(X) \ + do { \ + if (errno == 0) { \ + if ((X) == Py_HUGE_VAL || (X) == -Py_HUGE_VAL) \ + errno = ERANGE; \ + else _Py_SET_EDOM_FOR_NAN(X) \ + } \ + } while(0) + +/* Py_SET_ERANGE_ON_OVERFLOW(x) + * An alias of Py_SET_ERRNO_ON_MATH_ERROR for backward-compatibility. + */ +#define Py_SET_ERANGE_IF_OVERFLOW(X) Py_SET_ERRNO_ON_MATH_ERROR(X) + +/* Py_ADJUST_ERANGE1(x) + * Py_ADJUST_ERANGE2(x, y) + * Set errno to 0 before calling a libm function, and invoke one of these + * macros after, passing the function result(s) (Py_ADJUST_ERANGE2 is useful + * for functions returning complex results). This makes two kinds of + * adjustments to errno: (A) If it looks like the platform libm set + * errno=ERANGE due to underflow, clear errno. (B) If it looks like the + * platform libm overflowed but didn't set errno, force errno to ERANGE. In + * effect, we're trying to force a useful implementation of C89 errno + * behavior. + * Caution: + * This isn't reliable. See Py_OVERFLOWED comments. + * X and Y may be evaluated more than once. + */ +#define Py_ADJUST_ERANGE1(X) \ + do { \ + if (errno == 0) { \ + if ((X) == Py_HUGE_VAL || (X) == -Py_HUGE_VAL) \ + errno = ERANGE; \ + } \ + else if (errno == ERANGE && (X) == 0.0) \ + errno = 0; \ + } while(0) + +#define Py_ADJUST_ERANGE2(X, Y) \ + do { \ + if ((X) == Py_HUGE_VAL || (X) == -Py_HUGE_VAL || \ + (Y) == Py_HUGE_VAL || (Y) == -Py_HUGE_VAL) { \ + if (errno == 0) \ + errno = ERANGE; \ + } \ + else if (errno == ERANGE) \ + errno = 0; \ + } while(0) + +/* The functions _Py_dg_strtod and _Py_dg_dtoa in Python/dtoa.c (which are + * required to support the short float repr introduced in Python 3.1) require + * that the floating-point unit that's being used for arithmetic operations + * on C doubles is set to use 53-bit precision. It also requires that the + * FPU rounding mode is round-half-to-even, but that's less often an issue. + * + * If your FPU isn't already set to 53-bit precision/round-half-to-even, and + * you want to make use of _Py_dg_strtod and _Py_dg_dtoa, then you should + * + * #define HAVE_PY_SET_53BIT_PRECISION 1 + * + * and also give appropriate definitions for the following three macros: + * + * _PY_SET_53BIT_PRECISION_START : store original FPU settings, and + * set FPU to 53-bit precision/round-half-to-even + * _PY_SET_53BIT_PRECISION_END : restore original FPU settings + * _PY_SET_53BIT_PRECISION_HEADER : any variable declarations needed to + * use the two macros above. + * + * The macros are designed to be used within a single C function: see + * Python/pystrtod.c for an example of their use. + */ + +/* get and set x87 control word for gcc/x86 */ +#ifdef HAVE_GCC_ASM_FOR_X87 +#define HAVE_PY_SET_53BIT_PRECISION 1 +/* _Py_get/set_387controlword functions are defined in Python/pymath.c */ +#define _Py_SET_53BIT_PRECISION_HEADER \ + unsigned short old_387controlword, new_387controlword +#define _Py_SET_53BIT_PRECISION_START \ + do { \ + old_387controlword = _Py_get_387controlword(); \ + new_387controlword = (old_387controlword & ~0x0f00) | 0x0200; \ + if (new_387controlword != old_387controlword) \ + _Py_set_387controlword(new_387controlword); \ + } while (0) +#define _Py_SET_53BIT_PRECISION_END \ + if (new_387controlword != old_387controlword) \ + _Py_set_387controlword(old_387controlword) +#endif + +/* get and set x87 control word for VisualStudio/x86 */ +#if defined(_MSC_VER) && !defined(_WIN64) /* x87 not supported in 64-bit */ +#define HAVE_PY_SET_53BIT_PRECISION 1 +#define _Py_SET_53BIT_PRECISION_HEADER \ + unsigned int old_387controlword, new_387controlword, out_387controlword +/* We use the __control87_2 function to set only the x87 control word. + The SSE control word is unaffected. */ +#define _Py_SET_53BIT_PRECISION_START \ + do { \ + __control87_2(0, 0, &old_387controlword, NULL); \ + new_387controlword = \ + (old_387controlword & ~(_MCW_PC | _MCW_RC)) | (_PC_53 | _RC_NEAR); \ + if (new_387controlword != old_387controlword) \ + __control87_2(new_387controlword, _MCW_PC | _MCW_RC, \ + &out_387controlword, NULL); \ + } while (0) +#define _Py_SET_53BIT_PRECISION_END \ + do { \ + if (new_387controlword != old_387controlword) \ + __control87_2(old_387controlword, _MCW_PC | _MCW_RC, \ + &out_387controlword, NULL); \ + } while (0) +#endif + +#ifdef HAVE_GCC_ASM_FOR_MC68881 +#define HAVE_PY_SET_53BIT_PRECISION 1 +#define _Py_SET_53BIT_PRECISION_HEADER \ + unsigned int old_fpcr, new_fpcr +#define _Py_SET_53BIT_PRECISION_START \ + do { \ + __asm__ ("fmove.l %%fpcr,%0" : "=g" (old_fpcr)); \ + /* Set double precision / round to nearest. */ \ + new_fpcr = (old_fpcr & ~0xf0) | 0x80; \ + if (new_fpcr != old_fpcr) \ + __asm__ volatile ("fmove.l %0,%%fpcr" : : "g" (new_fpcr)); \ + } while (0) +#define _Py_SET_53BIT_PRECISION_END \ + do { \ + if (new_fpcr != old_fpcr) \ + __asm__ volatile ("fmove.l %0,%%fpcr" : : "g" (old_fpcr)); \ + } while (0) +#endif + +/* default definitions are empty */ +#ifndef HAVE_PY_SET_53BIT_PRECISION +#define _Py_SET_53BIT_PRECISION_HEADER +#define _Py_SET_53BIT_PRECISION_START +#define _Py_SET_53BIT_PRECISION_END +#endif + +/* If we can't guarantee 53-bit precision, don't use the code + in Python/dtoa.c, but fall back to standard code. This + means that repr of a float will be long (17 sig digits). + + Realistically, there are two things that could go wrong: + + (1) doubles aren't IEEE 754 doubles, or + (2) we're on x86 with the rounding precision set to 64-bits + (extended precision), and we don't know how to change + the rounding precision. + */ + +#if !defined(DOUBLE_IS_LITTLE_ENDIAN_IEEE754) && \ + !defined(DOUBLE_IS_BIG_ENDIAN_IEEE754) && \ + !defined(DOUBLE_IS_ARM_MIXED_ENDIAN_IEEE754) +#define PY_NO_SHORT_FLOAT_REPR +#endif + +/* double rounding is symptomatic of use of extended precision on x86. If + we're seeing double rounding, and we don't have any mechanism available for + changing the FPU rounding precision, then don't use Python/dtoa.c. */ +#if defined(X87_DOUBLE_ROUNDING) && !defined(HAVE_PY_SET_53BIT_PRECISION) +#define PY_NO_SHORT_FLOAT_REPR +#endif + + +/* Py_DEPRECATED(version) + * Declare a variable, type, or function deprecated. + * Usage: + * extern int old_var Py_DEPRECATED(2.3); + * typedef int T1 Py_DEPRECATED(2.4); + * extern int x() Py_DEPRECATED(2.5); + */ +#if defined(__GNUC__) \ + && ((__GNUC__ >= 4) || (__GNUC__ == 3) && (__GNUC_MINOR__ >= 1)) +#define Py_DEPRECATED(VERSION_UNUSED) __attribute__((__deprecated__)) +#else +#define Py_DEPRECATED(VERSION_UNUSED) +#endif + + +/* _Py_HOT_FUNCTION + * The hot attribute on a function is used to inform the compiler that the + * function is a hot spot of the compiled program. The function is optimized + * more aggressively and on many target it is placed into special subsection of + * the text section so all hot functions appears close together improving + * locality. + * + * Usage: + * int _Py_HOT_FUNCTION x(void) { return 3; } + * + * Issue #28618: This attribute must not be abused, otherwise it can have a + * negative effect on performance. Only the functions were Python spend most of + * its time must use it. Use a profiler when running performance benchmark + * suite to find these functions. + */ +#if defined(__GNUC__) \ + && ((__GNUC__ >= 5) || (__GNUC__ == 4) && (__GNUC_MINOR__ >= 3)) +#define _Py_HOT_FUNCTION __attribute__((hot)) +#else +#define _Py_HOT_FUNCTION +#endif + +/* _Py_NO_INLINE + * Disable inlining on a function. For example, it helps to reduce the C stack + * consumption. + * + * Usage: + * int _Py_NO_INLINE x(void) { return 3; } + */ +#if defined(__GNUC__) || defined(__clang__) +# define _Py_NO_INLINE __attribute__((noinline)) +#else +# define _Py_NO_INLINE +#endif + +/************************************************************************** +Prototypes that are missing from the standard include files on some systems +(and possibly only some versions of such systems.) + +Please be conservative with adding new ones, document them and enclose them +in platform-specific #ifdefs. +**************************************************************************/ + +#ifdef SOLARIS +/* Unchecked */ +extern int gethostname(char *, int); +#endif + +#ifdef HAVE__GETPTY +#include /* we need to import mode_t */ +extern char * _getpty(int *, int, mode_t, int); +#endif + +/* On QNX 6, struct termio must be declared by including sys/termio.h + if TCGETA, TCSETA, TCSETAW, or TCSETAF are used. sys/termio.h must + be included before termios.h or it will generate an error. */ +#if defined(HAVE_SYS_TERMIO_H) && !defined(__hpux) +#include +#endif + + +/* On 4.4BSD-descendants, ctype functions serves the whole range of + * wchar_t character set rather than single byte code points only. + * This characteristic can break some operations of string object + * including str.upper() and str.split() on UTF-8 locales. This + * workaround was provided by Tim Robbins of FreeBSD project. + */ + +#if defined(__APPLE__) +# define _PY_PORT_CTYPE_UTF8_ISSUE +#endif + +#ifdef _PY_PORT_CTYPE_UTF8_ISSUE +#ifndef __cplusplus + /* The workaround below is unsafe in C++ because + * the defines these symbols as real functions, + * with a slightly different signature. + * See issue #10910 + */ +#include +#include +#undef isalnum +#define isalnum(c) iswalnum(btowc(c)) +#undef isalpha +#define isalpha(c) iswalpha(btowc(c)) +#undef islower +#define islower(c) iswlower(btowc(c)) +#undef isspace +#define isspace(c) iswspace(btowc(c)) +#undef isupper +#define isupper(c) iswupper(btowc(c)) +#undef tolower +#define tolower(c) towlower(btowc(c)) +#undef toupper +#define toupper(c) towupper(btowc(c)) +#endif +#endif + + +/* Declarations for symbol visibility. + + PyAPI_FUNC(type): Declares a public Python API function and return type + PyAPI_DATA(type): Declares public Python data and its type + PyMODINIT_FUNC: A Python module init function. If these functions are + inside the Python core, they are private to the core. + If in an extension module, it may be declared with + external linkage depending on the platform. + + As a number of platforms support/require "__declspec(dllimport/dllexport)", + we support a HAVE_DECLSPEC_DLL macro to save duplication. +*/ + +/* + All windows ports, except cygwin, are handled in PC/pyconfig.h. + + Cygwin is the only other autoconf platform requiring special + linkage handling and it uses __declspec(). +*/ +#if defined(__CYGWIN__) +# define HAVE_DECLSPEC_DLL +#endif + +/* only get special linkage if built as shared or platform is Cygwin */ +#if defined(Py_ENABLE_SHARED) || defined(__CYGWIN__) +# if defined(HAVE_DECLSPEC_DLL) +# if defined(Py_BUILD_CORE) || defined(Py_BUILD_CORE_BUILTIN) +# define PyAPI_FUNC(RTYPE) __declspec(dllexport) RTYPE +# define PyAPI_DATA(RTYPE) extern __declspec(dllexport) RTYPE + /* module init functions inside the core need no external linkage */ + /* except for Cygwin to handle embedding */ +# if defined(__CYGWIN__) +# define PyMODINIT_FUNC __declspec(dllexport) PyObject* +# else /* __CYGWIN__ */ +# define PyMODINIT_FUNC PyObject* +# endif /* __CYGWIN__ */ +# else /* Py_BUILD_CORE */ + /* Building an extension module, or an embedded situation */ + /* public Python functions and data are imported */ + /* Under Cygwin, auto-import functions to prevent compilation */ + /* failures similar to those described at the bottom of 4.1: */ + /* http://docs.python.org/extending/windows.html#a-cookbook-approach */ +# if !defined(__CYGWIN__) +# define PyAPI_FUNC(RTYPE) __declspec(dllimport) RTYPE +# endif /* !__CYGWIN__ */ +# define PyAPI_DATA(RTYPE) extern __declspec(dllimport) RTYPE + /* module init functions outside the core must be exported */ +# if defined(__cplusplus) +# define PyMODINIT_FUNC extern "C" __declspec(dllexport) PyObject* +# else /* __cplusplus */ +# define PyMODINIT_FUNC __declspec(dllexport) PyObject* +# endif /* __cplusplus */ +# endif /* Py_BUILD_CORE */ +# endif /* HAVE_DECLSPEC_DLL */ +#endif /* Py_ENABLE_SHARED */ + +/* If no external linkage macros defined by now, create defaults */ +#ifndef PyAPI_FUNC +# define PyAPI_FUNC(RTYPE) RTYPE +#endif +#ifndef PyAPI_DATA +# define PyAPI_DATA(RTYPE) extern RTYPE +#endif +#ifndef PyMODINIT_FUNC +# if defined(__cplusplus) +# define PyMODINIT_FUNC extern "C" PyObject* +# else /* __cplusplus */ +# define PyMODINIT_FUNC PyObject* +# endif /* __cplusplus */ +#endif + +/* limits.h constants that may be missing */ + +#ifndef INT_MAX +#define INT_MAX 2147483647 +#endif + +#ifndef LONG_MAX +#if SIZEOF_LONG == 4 +#define LONG_MAX 0X7FFFFFFFL +#elif SIZEOF_LONG == 8 +#define LONG_MAX 0X7FFFFFFFFFFFFFFFL +#else +#error "could not set LONG_MAX in pyport.h" +#endif +#endif + +#ifndef LONG_MIN +#define LONG_MIN (-LONG_MAX-1) +#endif + +#ifndef LONG_BIT +#define LONG_BIT (8 * SIZEOF_LONG) +#endif + +#if LONG_BIT != 8 * SIZEOF_LONG +/* 04-Oct-2000 LONG_BIT is apparently (mis)defined as 64 on some recent + * 32-bit platforms using gcc. We try to catch that here at compile-time + * rather than waiting for integer multiplication to trigger bogus + * overflows. + */ +#error "LONG_BIT definition appears wrong for platform (bad gcc/glibc config?)." +#endif + +#ifdef __cplusplus +} +#endif + +/* + * Hide GCC attributes from compilers that don't support them. + */ +#if (!defined(__GNUC__) || __GNUC__ < 2 || \ + (__GNUC__ == 2 && __GNUC_MINOR__ < 7) ) +#define Py_GCC_ATTRIBUTE(x) +#else +#define Py_GCC_ATTRIBUTE(x) __attribute__(x) +#endif + +/* + * Specify alignment on compilers that support it. + */ +#if defined(__GNUC__) && __GNUC__ >= 3 +#define Py_ALIGNED(x) __attribute__((aligned(x))) +#else +#define Py_ALIGNED(x) +#endif + +/* Eliminate end-of-loop code not reached warnings from SunPro C + * when using do{...}while(0) macros + */ +#ifdef __SUNPRO_C +#pragma error_messages (off,E_END_OF_LOOP_CODE_NOT_REACHED) +#endif + +#ifndef Py_LL +#define Py_LL(x) x##LL +#endif + +#ifndef Py_ULL +#define Py_ULL(x) Py_LL(x##U) +#endif + +#define Py_VA_COPY va_copy + +/* + * Convenient macros to deal with endianness of the platform. WORDS_BIGENDIAN is + * detected by configure and defined in pyconfig.h. The code in pyconfig.h + * also takes care of Apple's universal builds. + */ + +#ifdef WORDS_BIGENDIAN +#define PY_BIG_ENDIAN 1 +#define PY_LITTLE_ENDIAN 0 +#else +#define PY_BIG_ENDIAN 0 +#define PY_LITTLE_ENDIAN 1 +#endif + +#if defined(Py_BUILD_CORE) || defined(Py_BUILD_CORE_BUILTIN) +/* + * Macros to protect CRT calls against instant termination when passed an + * invalid parameter (issue23524). + */ +#if defined _MSC_VER && _MSC_VER >= 1900 + +extern _invalid_parameter_handler _Py_silent_invalid_parameter_handler; +#define _Py_BEGIN_SUPPRESS_IPH { _invalid_parameter_handler _Py_old_handler = \ + _set_thread_local_invalid_parameter_handler(_Py_silent_invalid_parameter_handler); +#define _Py_END_SUPPRESS_IPH _set_thread_local_invalid_parameter_handler(_Py_old_handler); } + +#else + +#define _Py_BEGIN_SUPPRESS_IPH +#define _Py_END_SUPPRESS_IPH + +#endif /* _MSC_VER >= 1900 */ +#endif /* Py_BUILD_CORE */ + +#ifdef __ANDROID__ +/* The Android langinfo.h header is not used. */ +#undef HAVE_LANGINFO_H +#undef CODESET +#endif + +/* Maximum value of the Windows DWORD type */ +#define PY_DWORD_MAX 4294967295U + +/* This macro used to tell whether Python was built with multithreading + * enabled. Now multithreading is always enabled, but keep the macro + * for compatibility. + */ +#ifndef WITH_THREAD +#define WITH_THREAD +#endif + +#endif /* Py_PYPORT_H */ diff --git a/env/Include/pystate.h b/env/Include/pystate.h new file mode 100644 index 0000000..f16ffb8 --- /dev/null +++ b/env/Include/pystate.h @@ -0,0 +1,455 @@ + +/* Thread and interpreter state structures and their interfaces */ + + +#ifndef Py_PYSTATE_H +#define Py_PYSTATE_H +#ifdef __cplusplus +extern "C" { +#endif + +#include "pythread.h" + +/* This limitation is for performance and simplicity. If needed it can be +removed (with effort). */ +#define MAX_CO_EXTRA_USERS 255 + +/* State shared between threads */ + +struct _ts; /* Forward */ +struct _is; /* Forward */ +struct _frame; /* Forward declaration for PyFrameObject. */ + +#ifdef Py_LIMITED_API +typedef struct _is PyInterpreterState; +#else +typedef PyObject* (*_PyFrameEvalFunction)(struct _frame *, int); + + +typedef struct { + int install_signal_handlers; /* Install signal handlers? -1 means unset */ + + int ignore_environment; /* -E, Py_IgnoreEnvironmentFlag */ + int use_hash_seed; /* PYTHONHASHSEED=x */ + unsigned long hash_seed; + const char *allocator; /* Memory allocator: _PyMem_SetupAllocators() */ + int dev_mode; /* PYTHONDEVMODE, -X dev */ + int faulthandler; /* PYTHONFAULTHANDLER, -X faulthandler */ + int tracemalloc; /* PYTHONTRACEMALLOC, -X tracemalloc=N */ + int import_time; /* PYTHONPROFILEIMPORTTIME, -X importtime */ + int show_ref_count; /* -X showrefcount */ + int show_alloc_count; /* -X showalloccount */ + int dump_refs; /* PYTHONDUMPREFS */ + int malloc_stats; /* PYTHONMALLOCSTATS */ + int coerce_c_locale; /* PYTHONCOERCECLOCALE, -1 means unknown */ + int coerce_c_locale_warn; /* PYTHONCOERCECLOCALE=warn */ + int utf8_mode; /* PYTHONUTF8, -X utf8; -1 means unknown */ + + wchar_t *program_name; /* Program name, see also Py_GetProgramName() */ + int argc; /* Number of command line arguments, + -1 means unset */ + wchar_t **argv; /* Command line arguments */ + wchar_t *program; /* argv[0] or "" */ + + int nxoption; /* Number of -X options */ + wchar_t **xoptions; /* -X options */ + + int nwarnoption; /* Number of warnings options */ + wchar_t **warnoptions; /* Warnings options */ + + /* Path configuration inputs */ + wchar_t *module_search_path_env; /* PYTHONPATH environment variable */ + wchar_t *home; /* PYTHONHOME environment variable, + see also Py_SetPythonHome(). */ + + /* Path configuration outputs */ + int nmodule_search_path; /* Number of sys.path paths, + -1 means unset */ + wchar_t **module_search_paths; /* sys.path paths */ + wchar_t *executable; /* sys.executable */ + wchar_t *prefix; /* sys.prefix */ + wchar_t *base_prefix; /* sys.base_prefix */ + wchar_t *exec_prefix; /* sys.exec_prefix */ + wchar_t *base_exec_prefix; /* sys.base_exec_prefix */ + + /* Private fields */ + int _disable_importlib; /* Needed by freeze_importlib */ +} _PyCoreConfig; + +#define _PyCoreConfig_INIT \ + (_PyCoreConfig){ \ + .install_signal_handlers = -1, \ + .ignore_environment = -1, \ + .use_hash_seed = -1, \ + .coerce_c_locale = -1, \ + .faulthandler = -1, \ + .tracemalloc = -1, \ + .utf8_mode = -1, \ + .argc = -1, \ + .nmodule_search_path = -1} +/* Note: _PyCoreConfig_INIT sets other fields to 0/NULL */ + +/* Placeholders while working on the new configuration API + * + * See PEP 432 for final anticipated contents + */ +typedef struct { + int install_signal_handlers; /* Install signal handlers? -1 means unset */ + PyObject *argv; /* sys.argv list, can be NULL */ + PyObject *executable; /* sys.executable str */ + PyObject *prefix; /* sys.prefix str */ + PyObject *base_prefix; /* sys.base_prefix str, can be NULL */ + PyObject *exec_prefix; /* sys.exec_prefix str */ + PyObject *base_exec_prefix; /* sys.base_exec_prefix str, can be NULL */ + PyObject *warnoptions; /* sys.warnoptions list, can be NULL */ + PyObject *xoptions; /* sys._xoptions dict, can be NULL */ + PyObject *module_search_path; /* sys.path list */ +} _PyMainInterpreterConfig; + +#define _PyMainInterpreterConfig_INIT \ + (_PyMainInterpreterConfig){.install_signal_handlers = -1} +/* Note: _PyMainInterpreterConfig_INIT sets other fields to 0/NULL */ + +typedef struct _is { + + struct _is *next; + struct _ts *tstate_head; + + int64_t id; + int64_t id_refcount; + PyThread_type_lock id_mutex; + + PyObject *modules; + PyObject *modules_by_index; + PyObject *sysdict; + PyObject *builtins; + PyObject *importlib; + + /* Used in Python/sysmodule.c. */ + int check_interval; + + /* Used in Modules/_threadmodule.c. */ + long num_threads; + /* Support for runtime thread stack size tuning. + A value of 0 means using the platform's default stack size + or the size specified by the THREAD_STACK_SIZE macro. */ + /* Used in Python/thread.c. */ + size_t pythread_stacksize; + + PyObject *codec_search_path; + PyObject *codec_search_cache; + PyObject *codec_error_registry; + int codecs_initialized; + int fscodec_initialized; + + _PyCoreConfig core_config; + _PyMainInterpreterConfig config; +#ifdef HAVE_DLOPEN + int dlopenflags; +#endif + + PyObject *builtins_copy; + PyObject *import_func; + /* Initialized to PyEval_EvalFrameDefault(). */ + _PyFrameEvalFunction eval_frame; + + Py_ssize_t co_extra_user_count; + freefunc co_extra_freefuncs[MAX_CO_EXTRA_USERS]; + +#ifdef HAVE_FORK + PyObject *before_forkers; + PyObject *after_forkers_parent; + PyObject *after_forkers_child; +#endif + /* AtExit module */ + void (*pyexitfunc)(PyObject *); + PyObject *pyexitmodule; + + uint64_t tstate_next_unique_id; +} PyInterpreterState; +#endif /* !Py_LIMITED_API */ + + +/* State unique per thread */ + +#ifndef Py_LIMITED_API +/* Py_tracefunc return -1 when raising an exception, or 0 for success. */ +typedef int (*Py_tracefunc)(PyObject *, struct _frame *, int, PyObject *); + +/* The following values are used for 'what' for tracefunc functions + * + * To add a new kind of trace event, also update "trace_init" in + * Python/sysmodule.c to define the Python level event name + */ +#define PyTrace_CALL 0 +#define PyTrace_EXCEPTION 1 +#define PyTrace_LINE 2 +#define PyTrace_RETURN 3 +#define PyTrace_C_CALL 4 +#define PyTrace_C_EXCEPTION 5 +#define PyTrace_C_RETURN 6 +#define PyTrace_OPCODE 7 +#endif /* Py_LIMITED_API */ + +#ifdef Py_LIMITED_API +typedef struct _ts PyThreadState; +#else + +typedef struct _err_stackitem { + /* This struct represents an entry on the exception stack, which is a + * per-coroutine state. (Coroutine in the computer science sense, + * including the thread and generators). + * This ensures that the exception state is not impacted by "yields" + * from an except handler. + */ + PyObject *exc_type, *exc_value, *exc_traceback; + + struct _err_stackitem *previous_item; + +} _PyErr_StackItem; + + +typedef struct _ts { + /* See Python/ceval.c for comments explaining most fields */ + + struct _ts *prev; + struct _ts *next; + PyInterpreterState *interp; + + struct _frame *frame; + int recursion_depth; + char overflowed; /* The stack has overflowed. Allow 50 more calls + to handle the runtime error. */ + char recursion_critical; /* The current calls must not cause + a stack overflow. */ + int stackcheck_counter; + + /* 'tracing' keeps track of the execution depth when tracing/profiling. + This is to prevent the actual trace/profile code from being recorded in + the trace/profile. */ + int tracing; + int use_tracing; + + Py_tracefunc c_profilefunc; + Py_tracefunc c_tracefunc; + PyObject *c_profileobj; + PyObject *c_traceobj; + + /* The exception currently being raised */ + PyObject *curexc_type; + PyObject *curexc_value; + PyObject *curexc_traceback; + + /* The exception currently being handled, if no coroutines/generators + * are present. Always last element on the stack referred to be exc_info. + */ + _PyErr_StackItem exc_state; + + /* Pointer to the top of the stack of the exceptions currently + * being handled */ + _PyErr_StackItem *exc_info; + + PyObject *dict; /* Stores per-thread state */ + + int gilstate_counter; + + PyObject *async_exc; /* Asynchronous exception to raise */ + unsigned long thread_id; /* Thread id where this tstate was created */ + + int trash_delete_nesting; + PyObject *trash_delete_later; + + /* Called when a thread state is deleted normally, but not when it + * is destroyed after fork(). + * Pain: to prevent rare but fatal shutdown errors (issue 18808), + * Thread.join() must wait for the join'ed thread's tstate to be unlinked + * from the tstate chain. That happens at the end of a thread's life, + * in pystate.c. + * The obvious way doesn't quite work: create a lock which the tstate + * unlinking code releases, and have Thread.join() wait to acquire that + * lock. The problem is that we _are_ at the end of the thread's life: + * if the thread holds the last reference to the lock, decref'ing the + * lock will delete the lock, and that may trigger arbitrary Python code + * if there's a weakref, with a callback, to the lock. But by this time + * _PyThreadState_Current is already NULL, so only the simplest of C code + * can be allowed to run (in particular it must not be possible to + * release the GIL). + * So instead of holding the lock directly, the tstate holds a weakref to + * the lock: that's the value of on_delete_data below. Decref'ing a + * weakref is harmless. + * on_delete points to _threadmodule.c's static release_sentinel() function. + * After the tstate is unlinked, release_sentinel is called with the + * weakref-to-lock (on_delete_data) argument, and release_sentinel releases + * the indirectly held lock. + */ + void (*on_delete)(void *); + void *on_delete_data; + + int coroutine_origin_tracking_depth; + + PyObject *coroutine_wrapper; + int in_coroutine_wrapper; + + PyObject *async_gen_firstiter; + PyObject *async_gen_finalizer; + + PyObject *context; + uint64_t context_ver; + + /* Unique thread state id. */ + uint64_t id; + + /* XXX signal handlers should also be here */ + +} PyThreadState; +#endif /* !Py_LIMITED_API */ + + +PyAPI_FUNC(PyInterpreterState *) PyInterpreterState_New(void); +PyAPI_FUNC(void) PyInterpreterState_Clear(PyInterpreterState *); +PyAPI_FUNC(void) PyInterpreterState_Delete(PyInterpreterState *); +#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03070000 +/* New in 3.7 */ +PyAPI_FUNC(int64_t) PyInterpreterState_GetID(PyInterpreterState *); +#endif +#ifndef Py_LIMITED_API +PyAPI_FUNC(int) _PyState_AddModule(PyObject*, struct PyModuleDef*); +#endif /* !Py_LIMITED_API */ +#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03030000 +/* New in 3.3 */ +PyAPI_FUNC(int) PyState_AddModule(PyObject*, struct PyModuleDef*); +PyAPI_FUNC(int) PyState_RemoveModule(struct PyModuleDef*); +#endif +PyAPI_FUNC(PyObject*) PyState_FindModule(struct PyModuleDef*); +#ifndef Py_LIMITED_API +PyAPI_FUNC(void) _PyState_ClearModules(void); +#endif + +PyAPI_FUNC(PyThreadState *) PyThreadState_New(PyInterpreterState *); +#ifndef Py_LIMITED_API +PyAPI_FUNC(PyThreadState *) _PyThreadState_Prealloc(PyInterpreterState *); +PyAPI_FUNC(void) _PyThreadState_Init(PyThreadState *); +#endif /* !Py_LIMITED_API */ +PyAPI_FUNC(void) PyThreadState_Clear(PyThreadState *); +PyAPI_FUNC(void) PyThreadState_Delete(PyThreadState *); +#ifndef Py_LIMITED_API +PyAPI_FUNC(void) _PyThreadState_DeleteExcept(PyThreadState *tstate); +#endif /* !Py_LIMITED_API */ +PyAPI_FUNC(void) PyThreadState_DeleteCurrent(void); +#ifndef Py_LIMITED_API +PyAPI_FUNC(void) _PyGILState_Reinit(void); +#endif /* !Py_LIMITED_API */ + +/* Return the current thread state. The global interpreter lock must be held. + * When the current thread state is NULL, this issues a fatal error (so that + * the caller needn't check for NULL). */ +PyAPI_FUNC(PyThreadState *) PyThreadState_Get(void); + +#ifndef Py_LIMITED_API +/* Similar to PyThreadState_Get(), but don't issue a fatal error + * if it is NULL. */ +PyAPI_FUNC(PyThreadState *) _PyThreadState_UncheckedGet(void); +#endif /* !Py_LIMITED_API */ + +PyAPI_FUNC(PyThreadState *) PyThreadState_Swap(PyThreadState *); +PyAPI_FUNC(PyObject *) PyThreadState_GetDict(void); +PyAPI_FUNC(int) PyThreadState_SetAsyncExc(unsigned long, PyObject *); + + +/* Variable and macro for in-line access to current thread state */ + +/* Assuming the current thread holds the GIL, this is the + PyThreadState for the current thread. */ +#ifdef Py_BUILD_CORE +# define _PyThreadState_Current _PyRuntime.gilstate.tstate_current +# define PyThreadState_GET() \ + ((PyThreadState*)_Py_atomic_load_relaxed(&_PyThreadState_Current)) +#else +# define PyThreadState_GET() PyThreadState_Get() +#endif + +typedef + enum {PyGILState_LOCKED, PyGILState_UNLOCKED} + PyGILState_STATE; + + +/* Ensure that the current thread is ready to call the Python + C API, regardless of the current state of Python, or of its + thread lock. This may be called as many times as desired + by a thread so long as each call is matched with a call to + PyGILState_Release(). In general, other thread-state APIs may + be used between _Ensure() and _Release() calls, so long as the + thread-state is restored to its previous state before the Release(). + For example, normal use of the Py_BEGIN_ALLOW_THREADS/ + Py_END_ALLOW_THREADS macros are acceptable. + + The return value is an opaque "handle" to the thread state when + PyGILState_Ensure() was called, and must be passed to + PyGILState_Release() to ensure Python is left in the same state. Even + though recursive calls are allowed, these handles can *not* be shared - + each unique call to PyGILState_Ensure must save the handle for its + call to PyGILState_Release. + + When the function returns, the current thread will hold the GIL. + + Failure is a fatal error. +*/ +PyAPI_FUNC(PyGILState_STATE) PyGILState_Ensure(void); + +/* Release any resources previously acquired. After this call, Python's + state will be the same as it was prior to the corresponding + PyGILState_Ensure() call (but generally this state will be unknown to + the caller, hence the use of the GILState API.) + + Every call to PyGILState_Ensure must be matched by a call to + PyGILState_Release on the same thread. +*/ +PyAPI_FUNC(void) PyGILState_Release(PyGILState_STATE); + +/* Helper/diagnostic function - get the current thread state for + this thread. May return NULL if no GILState API has been used + on the current thread. Note that the main thread always has such a + thread-state, even if no auto-thread-state call has been made + on the main thread. +*/ +PyAPI_FUNC(PyThreadState *) PyGILState_GetThisThreadState(void); + +#ifndef Py_LIMITED_API +/* Helper/diagnostic function - return 1 if the current thread + currently holds the GIL, 0 otherwise. + + The function returns 1 if _PyGILState_check_enabled is non-zero. */ +PyAPI_FUNC(int) PyGILState_Check(void); + +/* Unsafe function to get the single PyInterpreterState used by this process' + GILState implementation. + + Return NULL before _PyGILState_Init() is called and after _PyGILState_Fini() + is called. */ +PyAPI_FUNC(PyInterpreterState *) _PyGILState_GetInterpreterStateUnsafe(void); +#endif /* !Py_LIMITED_API */ + + +/* The implementation of sys._current_frames() Returns a dict mapping + thread id to that thread's current frame. +*/ +#ifndef Py_LIMITED_API +PyAPI_FUNC(PyObject *) _PyThread_CurrentFrames(void); +#endif + +/* Routines for advanced debuggers, requested by David Beazley. + Don't use unless you know what you are doing! */ +#ifndef Py_LIMITED_API +PyAPI_FUNC(PyInterpreterState *) PyInterpreterState_Main(void); +PyAPI_FUNC(PyInterpreterState *) PyInterpreterState_Head(void); +PyAPI_FUNC(PyInterpreterState *) PyInterpreterState_Next(PyInterpreterState *); +PyAPI_FUNC(PyThreadState *) PyInterpreterState_ThreadHead(PyInterpreterState *); +PyAPI_FUNC(PyThreadState *) PyThreadState_Next(PyThreadState *); + +typedef struct _frame *(*PyThreadFrameGetter)(PyThreadState *self_); +#endif + +#ifdef __cplusplus +} +#endif +#endif /* !Py_PYSTATE_H */ diff --git a/env/Include/pystrcmp.h b/env/Include/pystrcmp.h new file mode 100644 index 0000000..edb1239 --- /dev/null +++ b/env/Include/pystrcmp.h @@ -0,0 +1,23 @@ +#ifndef Py_STRCMP_H +#define Py_STRCMP_H + +#ifdef __cplusplus +extern "C" { +#endif + +PyAPI_FUNC(int) PyOS_mystrnicmp(const char *, const char *, Py_ssize_t); +PyAPI_FUNC(int) PyOS_mystricmp(const char *, const char *); + +#ifdef MS_WINDOWS +#define PyOS_strnicmp strnicmp +#define PyOS_stricmp stricmp +#else +#define PyOS_strnicmp PyOS_mystrnicmp +#define PyOS_stricmp PyOS_mystricmp +#endif + +#ifdef __cplusplus +} +#endif + +#endif /* !Py_STRCMP_H */ diff --git a/env/Include/pystrhex.h b/env/Include/pystrhex.h new file mode 100644 index 0000000..66a30e2 --- /dev/null +++ b/env/Include/pystrhex.h @@ -0,0 +1,19 @@ +#ifndef Py_STRHEX_H +#define Py_STRHEX_H + +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef Py_LIMITED_API +/* Returns a str() containing the hex representation of argbuf. */ +PyAPI_FUNC(PyObject*) _Py_strhex(const char* argbuf, const Py_ssize_t arglen); +/* Returns a bytes() containing the ASCII hex representation of argbuf. */ +PyAPI_FUNC(PyObject*) _Py_strhex_bytes(const char* argbuf, const Py_ssize_t arglen); +#endif /* !Py_LIMITED_API */ + +#ifdef __cplusplus +} +#endif + +#endif /* !Py_STRHEX_H */ diff --git a/env/Include/pystrtod.h b/env/Include/pystrtod.h new file mode 100644 index 0000000..c1e84de --- /dev/null +++ b/env/Include/pystrtod.h @@ -0,0 +1,45 @@ +#ifndef Py_STRTOD_H +#define Py_STRTOD_H + +#ifdef __cplusplus +extern "C" { +#endif + + +PyAPI_FUNC(double) PyOS_string_to_double(const char *str, + char **endptr, + PyObject *overflow_exception); + +/* The caller is responsible for calling PyMem_Free to free the buffer + that's is returned. */ +PyAPI_FUNC(char *) PyOS_double_to_string(double val, + char format_code, + int precision, + int flags, + int *type); + +#ifndef Py_LIMITED_API +PyAPI_FUNC(PyObject *) _Py_string_to_number_with_underscores( + const char *str, Py_ssize_t len, const char *what, PyObject *obj, void *arg, + PyObject *(*innerfunc)(const char *, Py_ssize_t, void *)); + +PyAPI_FUNC(double) _Py_parse_inf_or_nan(const char *p, char **endptr); +#endif + + +/* PyOS_double_to_string's "flags" parameter can be set to 0 or more of: */ +#define Py_DTSF_SIGN 0x01 /* always add the sign */ +#define Py_DTSF_ADD_DOT_0 0x02 /* if the result is an integer add ".0" */ +#define Py_DTSF_ALT 0x04 /* "alternate" formatting. it's format_code + specific */ + +/* PyOS_double_to_string's "type", if non-NULL, will be set to one of: */ +#define Py_DTST_FINITE 0 +#define Py_DTST_INFINITE 1 +#define Py_DTST_NAN 2 + +#ifdef __cplusplus +} +#endif + +#endif /* !Py_STRTOD_H */ diff --git a/env/Include/pythonrun.h b/env/Include/pythonrun.h new file mode 100644 index 0000000..6f0c6fc --- /dev/null +++ b/env/Include/pythonrun.h @@ -0,0 +1,181 @@ + +/* Interfaces to parse and execute pieces of python code */ + +#ifndef Py_PYTHONRUN_H +#define Py_PYTHONRUN_H +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef Py_LIMITED_API +PyAPI_FUNC(int) PyRun_SimpleStringFlags(const char *, PyCompilerFlags *); +PyAPI_FUNC(int) PyRun_AnyFileFlags(FILE *, const char *, PyCompilerFlags *); +PyAPI_FUNC(int) PyRun_AnyFileExFlags( + FILE *fp, + const char *filename, /* decoded from the filesystem encoding */ + int closeit, + PyCompilerFlags *flags); +PyAPI_FUNC(int) PyRun_SimpleFileExFlags( + FILE *fp, + const char *filename, /* decoded from the filesystem encoding */ + int closeit, + PyCompilerFlags *flags); +PyAPI_FUNC(int) PyRun_InteractiveOneFlags( + FILE *fp, + const char *filename, /* decoded from the filesystem encoding */ + PyCompilerFlags *flags); +PyAPI_FUNC(int) PyRun_InteractiveOneObject( + FILE *fp, + PyObject *filename, + PyCompilerFlags *flags); +PyAPI_FUNC(int) PyRun_InteractiveLoopFlags( + FILE *fp, + const char *filename, /* decoded from the filesystem encoding */ + PyCompilerFlags *flags); + +PyAPI_FUNC(struct _mod *) PyParser_ASTFromString( + const char *s, + const char *filename, /* decoded from the filesystem encoding */ + int start, + PyCompilerFlags *flags, + PyArena *arena); +PyAPI_FUNC(struct _mod *) PyParser_ASTFromStringObject( + const char *s, + PyObject *filename, + int start, + PyCompilerFlags *flags, + PyArena *arena); +PyAPI_FUNC(struct _mod *) PyParser_ASTFromFile( + FILE *fp, + const char *filename, /* decoded from the filesystem encoding */ + const char* enc, + int start, + const char *ps1, + const char *ps2, + PyCompilerFlags *flags, + int *errcode, + PyArena *arena); +PyAPI_FUNC(struct _mod *) PyParser_ASTFromFileObject( + FILE *fp, + PyObject *filename, + const char* enc, + int start, + const char *ps1, + const char *ps2, + PyCompilerFlags *flags, + int *errcode, + PyArena *arena); +#endif + +#ifndef PyParser_SimpleParseString +#define PyParser_SimpleParseString(S, B) \ + PyParser_SimpleParseStringFlags(S, B, 0) +#define PyParser_SimpleParseFile(FP, S, B) \ + PyParser_SimpleParseFileFlags(FP, S, B, 0) +#endif +PyAPI_FUNC(struct _node *) PyParser_SimpleParseStringFlags(const char *, int, + int); +#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03030000 +PyAPI_FUNC(struct _node *) PyParser_SimpleParseStringFlagsFilename(const char *, + const char *, + int, int); +#endif +PyAPI_FUNC(struct _node *) PyParser_SimpleParseFileFlags(FILE *, const char *, + int, int); + +#ifndef Py_LIMITED_API +PyAPI_FUNC(PyObject *) PyRun_StringFlags(const char *, int, PyObject *, + PyObject *, PyCompilerFlags *); + +PyAPI_FUNC(PyObject *) PyRun_FileExFlags( + FILE *fp, + const char *filename, /* decoded from the filesystem encoding */ + int start, + PyObject *globals, + PyObject *locals, + int closeit, + PyCompilerFlags *flags); +#endif + +#ifdef Py_LIMITED_API +PyAPI_FUNC(PyObject *) Py_CompileString(const char *, const char *, int); +#else +#define Py_CompileString(str, p, s) Py_CompileStringExFlags(str, p, s, NULL, -1) +#define Py_CompileStringFlags(str, p, s, f) Py_CompileStringExFlags(str, p, s, f, -1) +PyAPI_FUNC(PyObject *) Py_CompileStringExFlags( + const char *str, + const char *filename, /* decoded from the filesystem encoding */ + int start, + PyCompilerFlags *flags, + int optimize); +PyAPI_FUNC(PyObject *) Py_CompileStringObject( + const char *str, + PyObject *filename, int start, + PyCompilerFlags *flags, + int optimize); +#endif +PyAPI_FUNC(struct symtable *) Py_SymtableString( + const char *str, + const char *filename, /* decoded from the filesystem encoding */ + int start); +#ifndef Py_LIMITED_API +PyAPI_FUNC(struct symtable *) Py_SymtableStringObject( + const char *str, + PyObject *filename, + int start); +#endif + +PyAPI_FUNC(void) PyErr_Print(void); +PyAPI_FUNC(void) PyErr_PrintEx(int); +PyAPI_FUNC(void) PyErr_Display(PyObject *, PyObject *, PyObject *); + +#ifndef Py_LIMITED_API +/* Use macros for a bunch of old variants */ +#define PyRun_String(str, s, g, l) PyRun_StringFlags(str, s, g, l, NULL) +#define PyRun_AnyFile(fp, name) PyRun_AnyFileExFlags(fp, name, 0, NULL) +#define PyRun_AnyFileEx(fp, name, closeit) \ + PyRun_AnyFileExFlags(fp, name, closeit, NULL) +#define PyRun_AnyFileFlags(fp, name, flags) \ + PyRun_AnyFileExFlags(fp, name, 0, flags) +#define PyRun_SimpleString(s) PyRun_SimpleStringFlags(s, NULL) +#define PyRun_SimpleFile(f, p) PyRun_SimpleFileExFlags(f, p, 0, NULL) +#define PyRun_SimpleFileEx(f, p, c) PyRun_SimpleFileExFlags(f, p, c, NULL) +#define PyRun_InteractiveOne(f, p) PyRun_InteractiveOneFlags(f, p, NULL) +#define PyRun_InteractiveLoop(f, p) PyRun_InteractiveLoopFlags(f, p, NULL) +#define PyRun_File(fp, p, s, g, l) \ + PyRun_FileExFlags(fp, p, s, g, l, 0, NULL) +#define PyRun_FileEx(fp, p, s, g, l, c) \ + PyRun_FileExFlags(fp, p, s, g, l, c, NULL) +#define PyRun_FileFlags(fp, p, s, g, l, flags) \ + PyRun_FileExFlags(fp, p, s, g, l, 0, flags) +#endif + +/* Stuff with no proper home (yet) */ +#ifndef Py_LIMITED_API +PyAPI_FUNC(char *) PyOS_Readline(FILE *, FILE *, const char *); +#endif +PyAPI_DATA(int) (*PyOS_InputHook)(void); +PyAPI_DATA(char) *(*PyOS_ReadlineFunctionPointer)(FILE *, FILE *, const char *); +#ifndef Py_LIMITED_API +PyAPI_DATA(PyThreadState*) _PyOS_ReadlineTState; +#endif + +/* Stack size, in "pointers" (so we get extra safety margins + on 64-bit platforms). On a 32-bit platform, this translates + to an 8k margin. */ +#define PYOS_STACK_MARGIN 2048 + +#if defined(WIN32) && !defined(MS_WIN64) && defined(_MSC_VER) && _MSC_VER >= 1300 +/* Enable stack checking under Microsoft C */ +#define USE_STACKCHECK +#endif + +#ifdef USE_STACKCHECK +/* Check that we aren't overflowing our stack */ +PyAPI_FUNC(int) PyOS_CheckStack(void); +#endif + +#ifdef __cplusplus +} +#endif +#endif /* !Py_PYTHONRUN_H */ diff --git a/env/Include/pythread.h b/env/Include/pythread.h new file mode 100644 index 0000000..eb61033 --- /dev/null +++ b/env/Include/pythread.h @@ -0,0 +1,155 @@ + +#ifndef Py_PYTHREAD_H +#define Py_PYTHREAD_H + +typedef void *PyThread_type_lock; +typedef void *PyThread_type_sema; + +#ifdef __cplusplus +extern "C" { +#endif + +/* Return status codes for Python lock acquisition. Chosen for maximum + * backwards compatibility, ie failure -> 0, success -> 1. */ +typedef enum PyLockStatus { + PY_LOCK_FAILURE = 0, + PY_LOCK_ACQUIRED = 1, + PY_LOCK_INTR +} PyLockStatus; + +#ifndef Py_LIMITED_API +#define PYTHREAD_INVALID_THREAD_ID ((unsigned long)-1) +#endif + +PyAPI_FUNC(void) PyThread_init_thread(void); +PyAPI_FUNC(unsigned long) PyThread_start_new_thread(void (*)(void *), void *); +PyAPI_FUNC(void) PyThread_exit_thread(void); +PyAPI_FUNC(unsigned long) PyThread_get_thread_ident(void); + +PyAPI_FUNC(PyThread_type_lock) PyThread_allocate_lock(void); +PyAPI_FUNC(void) PyThread_free_lock(PyThread_type_lock); +PyAPI_FUNC(int) PyThread_acquire_lock(PyThread_type_lock, int); +#define WAIT_LOCK 1 +#define NOWAIT_LOCK 0 + +/* PY_TIMEOUT_T is the integral type used to specify timeouts when waiting + on a lock (see PyThread_acquire_lock_timed() below). + PY_TIMEOUT_MAX is the highest usable value (in microseconds) of that + type, and depends on the system threading API. + + NOTE: this isn't the same value as `_thread.TIMEOUT_MAX`. The _thread + module exposes a higher-level API, with timeouts expressed in seconds + and floating-point numbers allowed. +*/ +#define PY_TIMEOUT_T long long + +#if defined(_POSIX_THREADS) + /* PyThread_acquire_lock_timed() uses _PyTime_FromNanoseconds(us * 1000), + convert microseconds to nanoseconds. */ +# define PY_TIMEOUT_MAX (PY_LLONG_MAX / 1000) +#elif defined (NT_THREADS) + /* In the NT API, the timeout is a DWORD and is expressed in milliseconds */ +# if 0xFFFFFFFFLL * 1000 < PY_LLONG_MAX +# define PY_TIMEOUT_MAX (0xFFFFFFFFLL * 1000) +# else +# define PY_TIMEOUT_MAX PY_LLONG_MAX +# endif +#else +# define PY_TIMEOUT_MAX PY_LLONG_MAX +#endif + + +/* If microseconds == 0, the call is non-blocking: it returns immediately + even when the lock can't be acquired. + If microseconds > 0, the call waits up to the specified duration. + If microseconds < 0, the call waits until success (or abnormal failure) + + microseconds must be less than PY_TIMEOUT_MAX. Behaviour otherwise is + undefined. + + If intr_flag is true and the acquire is interrupted by a signal, then the + call will return PY_LOCK_INTR. The caller may reattempt to acquire the + lock. +*/ +PyAPI_FUNC(PyLockStatus) PyThread_acquire_lock_timed(PyThread_type_lock, + PY_TIMEOUT_T microseconds, + int intr_flag); + +PyAPI_FUNC(void) PyThread_release_lock(PyThread_type_lock); + +PyAPI_FUNC(size_t) PyThread_get_stacksize(void); +PyAPI_FUNC(int) PyThread_set_stacksize(size_t); + +#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03030000 +PyAPI_FUNC(PyObject*) PyThread_GetInfo(void); +#endif + + +/* Thread Local Storage (TLS) API + TLS API is DEPRECATED. Use Thread Specific Storage (TSS) API. + + The existing TLS API has used int to represent TLS keys across all + platforms, but it is not POSIX-compliant. Therefore, the new TSS API uses + opaque data type to represent TSS keys to be compatible (see PEP 539). +*/ +PyAPI_FUNC(int) PyThread_create_key(void) Py_DEPRECATED(3.7); +PyAPI_FUNC(void) PyThread_delete_key(int key) Py_DEPRECATED(3.7); +PyAPI_FUNC(int) PyThread_set_key_value(int key, void *value) Py_DEPRECATED(3.7); +PyAPI_FUNC(void *) PyThread_get_key_value(int key) Py_DEPRECATED(3.7); +PyAPI_FUNC(void) PyThread_delete_key_value(int key) Py_DEPRECATED(3.7); + +/* Cleanup after a fork */ +PyAPI_FUNC(void) PyThread_ReInitTLS(void) Py_DEPRECATED(3.7); + + +#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03070000 +/* New in 3.7 */ +/* Thread Specific Storage (TSS) API */ + +typedef struct _Py_tss_t Py_tss_t; /* opaque */ + +#ifndef Py_LIMITED_API +#if defined(_POSIX_THREADS) + /* Darwin needs pthread.h to know type name the pthread_key_t. */ +# include +# define NATIVE_TSS_KEY_T pthread_key_t +#elif defined(NT_THREADS) + /* In Windows, native TSS key type is DWORD, + but hardcode the unsigned long to avoid errors for include directive. + */ +# define NATIVE_TSS_KEY_T unsigned long +#else +# error "Require native threads. See https://bugs.python.org/issue31370" +#endif + +/* When Py_LIMITED_API is not defined, the type layout of Py_tss_t is + exposed to allow static allocation in the API clients. Even in this case, + you must handle TSS keys through API functions due to compatibility. +*/ +struct _Py_tss_t { + int _is_initialized; + NATIVE_TSS_KEY_T _key; +}; + +#undef NATIVE_TSS_KEY_T + +/* When static allocation, you must initialize with Py_tss_NEEDS_INIT. */ +#define Py_tss_NEEDS_INIT {0} +#endif /* !Py_LIMITED_API */ + +PyAPI_FUNC(Py_tss_t *) PyThread_tss_alloc(void); +PyAPI_FUNC(void) PyThread_tss_free(Py_tss_t *key); + +/* The parameter key must not be NULL. */ +PyAPI_FUNC(int) PyThread_tss_is_created(Py_tss_t *key); +PyAPI_FUNC(int) PyThread_tss_create(Py_tss_t *key); +PyAPI_FUNC(void) PyThread_tss_delete(Py_tss_t *key); +PyAPI_FUNC(int) PyThread_tss_set(Py_tss_t *key, void *value); +PyAPI_FUNC(void *) PyThread_tss_get(Py_tss_t *key); +#endif /* New in 3.7 */ + +#ifdef __cplusplus +} +#endif + +#endif /* !Py_PYTHREAD_H */ diff --git a/env/Include/pytime.h b/env/Include/pytime.h new file mode 100644 index 0000000..4870a9d --- /dev/null +++ b/env/Include/pytime.h @@ -0,0 +1,246 @@ +#ifndef Py_LIMITED_API +#ifndef Py_PYTIME_H +#define Py_PYTIME_H + +#include "pyconfig.h" /* include for defines */ +#include "object.h" + +/************************************************************************** +Symbols and macros to supply platform-independent interfaces to time related +functions and constants +**************************************************************************/ +#ifdef __cplusplus +extern "C" { +#endif + +/* _PyTime_t: Python timestamp with subsecond precision. It can be used to + store a duration, and so indirectly a date (related to another date, like + UNIX epoch). */ +typedef int64_t _PyTime_t; +#define _PyTime_MIN PY_LLONG_MIN +#define _PyTime_MAX PY_LLONG_MAX + +typedef enum { + /* Round towards minus infinity (-inf). + For example, used to read a clock. */ + _PyTime_ROUND_FLOOR=0, + /* Round towards infinity (+inf). + For example, used for timeout to wait "at least" N seconds. */ + _PyTime_ROUND_CEILING=1, + /* Round to nearest with ties going to nearest even integer. + For example, used to round from a Python float. */ + _PyTime_ROUND_HALF_EVEN=2, + /* Round away from zero + For example, used for timeout. _PyTime_ROUND_CEILING rounds + -1e-9 to 0 milliseconds which causes bpo-31786 issue. + _PyTime_ROUND_UP rounds -1e-9 to -1 millisecond which keeps + the timeout sign as expected. select.poll(timeout) must block + for negative values." */ + _PyTime_ROUND_UP=3, + /* _PyTime_ROUND_TIMEOUT (an alias for _PyTime_ROUND_UP) should be + used for timeouts. */ + _PyTime_ROUND_TIMEOUT = _PyTime_ROUND_UP +} _PyTime_round_t; + + +/* Convert a time_t to a PyLong. */ +PyAPI_FUNC(PyObject *) _PyLong_FromTime_t( + time_t sec); + +/* Convert a PyLong to a time_t. */ +PyAPI_FUNC(time_t) _PyLong_AsTime_t( + PyObject *obj); + +/* Convert a number of seconds, int or float, to time_t. */ +PyAPI_FUNC(int) _PyTime_ObjectToTime_t( + PyObject *obj, + time_t *sec, + _PyTime_round_t); + +/* Convert a number of seconds, int or float, to a timeval structure. + usec is in the range [0; 999999] and rounded towards zero. + For example, -1.2 is converted to (-2, 800000). */ +PyAPI_FUNC(int) _PyTime_ObjectToTimeval( + PyObject *obj, + time_t *sec, + long *usec, + _PyTime_round_t); + +/* Convert a number of seconds, int or float, to a timespec structure. + nsec is in the range [0; 999999999] and rounded towards zero. + For example, -1.2 is converted to (-2, 800000000). */ +PyAPI_FUNC(int) _PyTime_ObjectToTimespec( + PyObject *obj, + time_t *sec, + long *nsec, + _PyTime_round_t); + + +/* Create a timestamp from a number of seconds. */ +PyAPI_FUNC(_PyTime_t) _PyTime_FromSeconds(int seconds); + +/* Macro to create a timestamp from a number of seconds, no integer overflow. + Only use the macro for small values, prefer _PyTime_FromSeconds(). */ +#define _PYTIME_FROMSECONDS(seconds) \ + ((_PyTime_t)(seconds) * (1000 * 1000 * 1000)) + +/* Create a timestamp from a number of nanoseconds. */ +PyAPI_FUNC(_PyTime_t) _PyTime_FromNanoseconds(_PyTime_t ns); + +/* Create a timestamp from nanoseconds (Python int). */ +PyAPI_FUNC(int) _PyTime_FromNanosecondsObject(_PyTime_t *t, + PyObject *obj); + +/* Convert a number of seconds (Python float or int) to a timetamp. + Raise an exception and return -1 on error, return 0 on success. */ +PyAPI_FUNC(int) _PyTime_FromSecondsObject(_PyTime_t *t, + PyObject *obj, + _PyTime_round_t round); + +/* Convert a number of milliseconds (Python float or int, 10^-3) to a timetamp. + Raise an exception and return -1 on error, return 0 on success. */ +PyAPI_FUNC(int) _PyTime_FromMillisecondsObject(_PyTime_t *t, + PyObject *obj, + _PyTime_round_t round); + +/* Convert a timestamp to a number of seconds as a C double. */ +PyAPI_FUNC(double) _PyTime_AsSecondsDouble(_PyTime_t t); + +/* Convert timestamp to a number of milliseconds (10^-3 seconds). */ +PyAPI_FUNC(_PyTime_t) _PyTime_AsMilliseconds(_PyTime_t t, + _PyTime_round_t round); + +/* Convert timestamp to a number of microseconds (10^-6 seconds). */ +PyAPI_FUNC(_PyTime_t) _PyTime_AsMicroseconds(_PyTime_t t, + _PyTime_round_t round); + +/* Convert timestamp to a number of nanoseconds (10^-9 seconds) as a Python int + object. */ +PyAPI_FUNC(PyObject *) _PyTime_AsNanosecondsObject(_PyTime_t t); + +/* Create a timestamp from a timeval structure. + Raise an exception and return -1 on overflow, return 0 on success. */ +PyAPI_FUNC(int) _PyTime_FromTimeval(_PyTime_t *tp, struct timeval *tv); + +/* Convert a timestamp to a timeval structure (microsecond resolution). + tv_usec is always positive. + Raise an exception and return -1 if the conversion overflowed, + return 0 on success. */ +PyAPI_FUNC(int) _PyTime_AsTimeval(_PyTime_t t, + struct timeval *tv, + _PyTime_round_t round); + +/* Similar to _PyTime_AsTimeval(), but don't raise an exception on error. */ +PyAPI_FUNC(int) _PyTime_AsTimeval_noraise(_PyTime_t t, + struct timeval *tv, + _PyTime_round_t round); + +/* Convert a timestamp to a number of seconds (secs) and microseconds (us). + us is always positive. This function is similar to _PyTime_AsTimeval() + except that secs is always a time_t type, whereas the timeval structure + uses a C long for tv_sec on Windows. + Raise an exception and return -1 if the conversion overflowed, + return 0 on success. */ +PyAPI_FUNC(int) _PyTime_AsTimevalTime_t( + _PyTime_t t, + time_t *secs, + int *us, + _PyTime_round_t round); + +#if defined(HAVE_CLOCK_GETTIME) || defined(HAVE_KQUEUE) +/* Create a timestamp from a timespec structure. + Raise an exception and return -1 on overflow, return 0 on success. */ +PyAPI_FUNC(int) _PyTime_FromTimespec(_PyTime_t *tp, struct timespec *ts); + +/* Convert a timestamp to a timespec structure (nanosecond resolution). + tv_nsec is always positive. + Raise an exception and return -1 on error, return 0 on success. */ +PyAPI_FUNC(int) _PyTime_AsTimespec(_PyTime_t t, struct timespec *ts); +#endif + +/* Compute ticks * mul / div. + The caller must ensure that ((div - 1) * mul) cannot overflow. */ +PyAPI_FUNC(_PyTime_t) _PyTime_MulDiv(_PyTime_t ticks, + _PyTime_t mul, + _PyTime_t div); + +/* Get the current time from the system clock. + + The function cannot fail. _PyTime_Init() ensures that the system clock + works. */ +PyAPI_FUNC(_PyTime_t) _PyTime_GetSystemClock(void); + +/* Get the time of a monotonic clock, i.e. a clock that cannot go backwards. + The clock is not affected by system clock updates. The reference point of + the returned value is undefined, so that only the difference between the + results of consecutive calls is valid. + + The function cannot fail. _PyTime_Init() ensures that a monotonic clock + is available and works. */ +PyAPI_FUNC(_PyTime_t) _PyTime_GetMonotonicClock(void); + + +/* Structure used by time.get_clock_info() */ +typedef struct { + const char *implementation; + int monotonic; + int adjustable; + double resolution; +} _Py_clock_info_t; + +/* Get the current time from the system clock. + * Fill clock information if info is not NULL. + * Raise an exception and return -1 on error, return 0 on success. + */ +PyAPI_FUNC(int) _PyTime_GetSystemClockWithInfo( + _PyTime_t *t, + _Py_clock_info_t *info); + +/* Get the time of a monotonic clock, i.e. a clock that cannot go backwards. + The clock is not affected by system clock updates. The reference point of + the returned value is undefined, so that only the difference between the + results of consecutive calls is valid. + + Fill info (if set) with information of the function used to get the time. + + Return 0 on success, raise an exception and return -1 on error. */ +PyAPI_FUNC(int) _PyTime_GetMonotonicClockWithInfo( + _PyTime_t *t, + _Py_clock_info_t *info); + + +/* Initialize time. + Return 0 on success, raise an exception and return -1 on error. */ +PyAPI_FUNC(int) _PyTime_Init(void); + +/* Converts a timestamp to the Gregorian time, using the local time zone. + Return 0 on success, raise an exception and return -1 on error. */ +PyAPI_FUNC(int) _PyTime_localtime(time_t t, struct tm *tm); + +/* Converts a timestamp to the Gregorian time, assuming UTC. + Return 0 on success, raise an exception and return -1 on error. */ +PyAPI_FUNC(int) _PyTime_gmtime(time_t t, struct tm *tm); + +/* Get the performance counter: clock with the highest available resolution to + measure a short duration. + + The function cannot fail. _PyTime_Init() ensures that the system clock + works. */ +PyAPI_FUNC(_PyTime_t) _PyTime_GetPerfCounter(void); + +/* Get the performance counter: clock with the highest available resolution to + measure a short duration. + + Fill info (if set) with information of the function used to get the time. + + Return 0 on success, raise an exception and return -1 on error. */ +PyAPI_FUNC(int) _PyTime_GetPerfCounterWithInfo( + _PyTime_t *t, + _Py_clock_info_t *info); + +#ifdef __cplusplus +} +#endif + +#endif /* Py_PYTIME_H */ +#endif /* Py_LIMITED_API */ diff --git a/env/Include/rangeobject.h b/env/Include/rangeobject.h new file mode 100644 index 0000000..7e4dc28 --- /dev/null +++ b/env/Include/rangeobject.h @@ -0,0 +1,27 @@ + +/* Range object interface */ + +#ifndef Py_RANGEOBJECT_H +#define Py_RANGEOBJECT_H +#ifdef __cplusplus +extern "C" { +#endif + +/* +A range object represents an integer range. This is an immutable object; +a range cannot change its value after creation. + +Range objects behave like the corresponding tuple objects except that +they are represented by a start, stop, and step datamembers. +*/ + +PyAPI_DATA(PyTypeObject) PyRange_Type; +PyAPI_DATA(PyTypeObject) PyRangeIter_Type; +PyAPI_DATA(PyTypeObject) PyLongRangeIter_Type; + +#define PyRange_Check(op) (Py_TYPE(op) == &PyRange_Type) + +#ifdef __cplusplus +} +#endif +#endif /* !Py_RANGEOBJECT_H */ diff --git a/env/Include/setobject.h b/env/Include/setobject.h new file mode 100644 index 0000000..fc0ea83 --- /dev/null +++ b/env/Include/setobject.h @@ -0,0 +1,108 @@ +/* Set object interface */ + +#ifndef Py_SETOBJECT_H +#define Py_SETOBJECT_H +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef Py_LIMITED_API + +/* There are three kinds of entries in the table: + +1. Unused: key == NULL and hash == 0 +2. Dummy: key == dummy and hash == -1 +3. Active: key != NULL and key != dummy and hash != -1 + +The hash field of Unused slots is always zero. + +The hash field of Dummy slots are set to -1 +meaning that dummy entries can be detected by +either entry->key==dummy or by entry->hash==-1. +*/ + +#define PySet_MINSIZE 8 + +typedef struct { + PyObject *key; + Py_hash_t hash; /* Cached hash code of the key */ +} setentry; + +/* The SetObject data structure is shared by set and frozenset objects. + +Invariant for sets: + - hash is -1 + +Invariants for frozensets: + - data is immutable. + - hash is the hash of the frozenset or -1 if not computed yet. + +*/ + +typedef struct { + PyObject_HEAD + + Py_ssize_t fill; /* Number active and dummy entries*/ + Py_ssize_t used; /* Number active entries */ + + /* The table contains mask + 1 slots, and that's a power of 2. + * We store the mask instead of the size because the mask is more + * frequently needed. + */ + Py_ssize_t mask; + + /* The table points to a fixed-size smalltable for small tables + * or to additional malloc'ed memory for bigger tables. + * The table pointer is never NULL which saves us from repeated + * runtime null-tests. + */ + setentry *table; + Py_hash_t hash; /* Only used by frozenset objects */ + Py_ssize_t finger; /* Search finger for pop() */ + + setentry smalltable[PySet_MINSIZE]; + PyObject *weakreflist; /* List of weak references */ +} PySetObject; + +#define PySet_GET_SIZE(so) (assert(PyAnySet_Check(so)),(((PySetObject *)(so))->used)) + +PyAPI_DATA(PyObject *) _PySet_Dummy; + +PyAPI_FUNC(int) _PySet_NextEntry(PyObject *set, Py_ssize_t *pos, PyObject **key, Py_hash_t *hash); +PyAPI_FUNC(int) _PySet_Update(PyObject *set, PyObject *iterable); +PyAPI_FUNC(int) PySet_ClearFreeList(void); + +#endif /* Section excluded by Py_LIMITED_API */ + +PyAPI_DATA(PyTypeObject) PySet_Type; +PyAPI_DATA(PyTypeObject) PyFrozenSet_Type; +PyAPI_DATA(PyTypeObject) PySetIter_Type; + +PyAPI_FUNC(PyObject *) PySet_New(PyObject *); +PyAPI_FUNC(PyObject *) PyFrozenSet_New(PyObject *); + +PyAPI_FUNC(int) PySet_Add(PyObject *set, PyObject *key); +PyAPI_FUNC(int) PySet_Clear(PyObject *set); +PyAPI_FUNC(int) PySet_Contains(PyObject *anyset, PyObject *key); +PyAPI_FUNC(int) PySet_Discard(PyObject *set, PyObject *key); +PyAPI_FUNC(PyObject *) PySet_Pop(PyObject *set); +PyAPI_FUNC(Py_ssize_t) PySet_Size(PyObject *anyset); + +#define PyFrozenSet_CheckExact(ob) (Py_TYPE(ob) == &PyFrozenSet_Type) +#define PyAnySet_CheckExact(ob) \ + (Py_TYPE(ob) == &PySet_Type || Py_TYPE(ob) == &PyFrozenSet_Type) +#define PyAnySet_Check(ob) \ + (Py_TYPE(ob) == &PySet_Type || Py_TYPE(ob) == &PyFrozenSet_Type || \ + PyType_IsSubtype(Py_TYPE(ob), &PySet_Type) || \ + PyType_IsSubtype(Py_TYPE(ob), &PyFrozenSet_Type)) +#define PySet_Check(ob) \ + (Py_TYPE(ob) == &PySet_Type || \ + PyType_IsSubtype(Py_TYPE(ob), &PySet_Type)) +#define PyFrozenSet_Check(ob) \ + (Py_TYPE(ob) == &PyFrozenSet_Type || \ + PyType_IsSubtype(Py_TYPE(ob), &PyFrozenSet_Type)) + +#ifdef __cplusplus +} +#endif +#endif /* !Py_SETOBJECT_H */ diff --git a/env/Include/sliceobject.h b/env/Include/sliceobject.h new file mode 100644 index 0000000..c238b09 --- /dev/null +++ b/env/Include/sliceobject.h @@ -0,0 +1,63 @@ +#ifndef Py_SLICEOBJECT_H +#define Py_SLICEOBJECT_H +#ifdef __cplusplus +extern "C" { +#endif + +/* The unique ellipsis object "..." */ + +PyAPI_DATA(PyObject) _Py_EllipsisObject; /* Don't use this directly */ + +#define Py_Ellipsis (&_Py_EllipsisObject) + +/* Slice object interface */ + +/* + +A slice object containing start, stop, and step data members (the +names are from range). After much talk with Guido, it was decided to +let these be any arbitrary python type. Py_None stands for omitted values. +*/ +#ifndef Py_LIMITED_API +typedef struct { + PyObject_HEAD + PyObject *start, *stop, *step; /* not NULL */ +} PySliceObject; +#endif + +PyAPI_DATA(PyTypeObject) PySlice_Type; +PyAPI_DATA(PyTypeObject) PyEllipsis_Type; + +#define PySlice_Check(op) (Py_TYPE(op) == &PySlice_Type) + +PyAPI_FUNC(PyObject *) PySlice_New(PyObject* start, PyObject* stop, + PyObject* step); +#ifndef Py_LIMITED_API +PyAPI_FUNC(PyObject *) _PySlice_FromIndices(Py_ssize_t start, Py_ssize_t stop); +PyAPI_FUNC(int) _PySlice_GetLongIndices(PySliceObject *self, PyObject *length, + PyObject **start_ptr, PyObject **stop_ptr, + PyObject **step_ptr); +#endif +PyAPI_FUNC(int) PySlice_GetIndices(PyObject *r, Py_ssize_t length, + Py_ssize_t *start, Py_ssize_t *stop, Py_ssize_t *step); +PyAPI_FUNC(int) PySlice_GetIndicesEx(PyObject *r, Py_ssize_t length, + Py_ssize_t *start, Py_ssize_t *stop, + Py_ssize_t *step, Py_ssize_t *slicelength) Py_DEPRECATED(3.7); + +#if !defined(Py_LIMITED_API) || (Py_LIMITED_API+0 >= 0x03050400 && Py_LIMITED_API+0 < 0x03060000) || Py_LIMITED_API+0 >= 0x03060100 +#define PySlice_GetIndicesEx(slice, length, start, stop, step, slicelen) ( \ + PySlice_Unpack((slice), (start), (stop), (step)) < 0 ? \ + ((*(slicelen) = 0), -1) : \ + ((*(slicelen) = PySlice_AdjustIndices((length), (start), (stop), *(step))), \ + 0)) +PyAPI_FUNC(int) PySlice_Unpack(PyObject *slice, + Py_ssize_t *start, Py_ssize_t *stop, Py_ssize_t *step); +PyAPI_FUNC(Py_ssize_t) PySlice_AdjustIndices(Py_ssize_t length, + Py_ssize_t *start, Py_ssize_t *stop, + Py_ssize_t step); +#endif + +#ifdef __cplusplus +} +#endif +#endif /* !Py_SLICEOBJECT_H */ diff --git a/env/Include/structmember.h b/env/Include/structmember.h new file mode 100644 index 0000000..b54f708 --- /dev/null +++ b/env/Include/structmember.h @@ -0,0 +1,74 @@ +#ifndef Py_STRUCTMEMBER_H +#define Py_STRUCTMEMBER_H +#ifdef __cplusplus +extern "C" { +#endif + + +/* Interface to map C struct members to Python object attributes */ + +#include /* For offsetof */ + +/* An array of PyMemberDef structures defines the name, type and offset + of selected members of a C structure. These can be read by + PyMember_GetOne() and set by PyMember_SetOne() (except if their READONLY + flag is set). The array must be terminated with an entry whose name + pointer is NULL. */ + +typedef struct PyMemberDef { + const char *name; + int type; + Py_ssize_t offset; + int flags; + const char *doc; +} PyMemberDef; + +/* Types */ +#define T_SHORT 0 +#define T_INT 1 +#define T_LONG 2 +#define T_FLOAT 3 +#define T_DOUBLE 4 +#define T_STRING 5 +#define T_OBJECT 6 +/* XXX the ordering here is weird for binary compatibility */ +#define T_CHAR 7 /* 1-character string */ +#define T_BYTE 8 /* 8-bit signed int */ +/* unsigned variants: */ +#define T_UBYTE 9 +#define T_USHORT 10 +#define T_UINT 11 +#define T_ULONG 12 + +/* Added by Jack: strings contained in the structure */ +#define T_STRING_INPLACE 13 + +/* Added by Lillo: bools contained in the structure (assumed char) */ +#define T_BOOL 14 + +#define T_OBJECT_EX 16 /* Like T_OBJECT, but raises AttributeError + when the value is NULL, instead of + converting to None. */ +#define T_LONGLONG 17 +#define T_ULONGLONG 18 + +#define T_PYSSIZET 19 /* Py_ssize_t */ +#define T_NONE 20 /* Value is always None */ + + +/* Flags */ +#define READONLY 1 +#define READ_RESTRICTED 2 +#define PY_WRITE_RESTRICTED 4 +#define RESTRICTED (READ_RESTRICTED | PY_WRITE_RESTRICTED) + + +/* Current API, use this */ +PyAPI_FUNC(PyObject *) PyMember_GetOne(const char *, struct PyMemberDef *); +PyAPI_FUNC(int) PyMember_SetOne(char *, struct PyMemberDef *, PyObject *); + + +#ifdef __cplusplus +} +#endif +#endif /* !Py_STRUCTMEMBER_H */ diff --git a/env/Include/structseq.h b/env/Include/structseq.h new file mode 100644 index 0000000..e5e5d5c --- /dev/null +++ b/env/Include/structseq.h @@ -0,0 +1,49 @@ + +/* Named tuple object interface */ + +#ifndef Py_STRUCTSEQ_H +#define Py_STRUCTSEQ_H +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct PyStructSequence_Field { + const char *name; + const char *doc; +} PyStructSequence_Field; + +typedef struct PyStructSequence_Desc { + const char *name; + const char *doc; + struct PyStructSequence_Field *fields; + int n_in_sequence; +} PyStructSequence_Desc; + +extern char* PyStructSequence_UnnamedField; + +#ifndef Py_LIMITED_API +PyAPI_FUNC(void) PyStructSequence_InitType(PyTypeObject *type, + PyStructSequence_Desc *desc); +PyAPI_FUNC(int) PyStructSequence_InitType2(PyTypeObject *type, + PyStructSequence_Desc *desc); +#endif +PyAPI_FUNC(PyTypeObject*) PyStructSequence_NewType(PyStructSequence_Desc *desc); + +PyAPI_FUNC(PyObject *) PyStructSequence_New(PyTypeObject* type); + +#ifndef Py_LIMITED_API +typedef PyTupleObject PyStructSequence; + +/* Macro, *only* to be used to fill in brand new objects */ +#define PyStructSequence_SET_ITEM(op, i, v) PyTuple_SET_ITEM(op, i, v) + +#define PyStructSequence_GET_ITEM(op, i) PyTuple_GET_ITEM(op, i) +#endif + +PyAPI_FUNC(void) PyStructSequence_SetItem(PyObject*, Py_ssize_t, PyObject*); +PyAPI_FUNC(PyObject*) PyStructSequence_GetItem(PyObject*, Py_ssize_t); + +#ifdef __cplusplus +} +#endif +#endif /* !Py_STRUCTSEQ_H */ diff --git a/env/Include/symtable.h b/env/Include/symtable.h new file mode 100644 index 0000000..007f88d --- /dev/null +++ b/env/Include/symtable.h @@ -0,0 +1,118 @@ +#ifndef Py_LIMITED_API +#ifndef Py_SYMTABLE_H +#define Py_SYMTABLE_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* XXX(ncoghlan): This is a weird mix of public names and interpreter internal + * names. + */ + +typedef enum _block_type { FunctionBlock, ClassBlock, ModuleBlock } + _Py_block_ty; + +struct _symtable_entry; + +struct symtable { + PyObject *st_filename; /* name of file being compiled, + decoded from the filesystem encoding */ + struct _symtable_entry *st_cur; /* current symbol table entry */ + struct _symtable_entry *st_top; /* symbol table entry for module */ + PyObject *st_blocks; /* dict: map AST node addresses + * to symbol table entries */ + PyObject *st_stack; /* list: stack of namespace info */ + PyObject *st_global; /* borrowed ref to st_top->ste_symbols */ + int st_nblocks; /* number of blocks used. kept for + consistency with the corresponding + compiler structure */ + PyObject *st_private; /* name of current class or NULL */ + PyFutureFeatures *st_future; /* module's future features that affect + the symbol table */ + int recursion_depth; /* current recursion depth */ + int recursion_limit; /* recursion limit */ +}; + +typedef struct _symtable_entry { + PyObject_HEAD + PyObject *ste_id; /* int: key in ste_table->st_blocks */ + PyObject *ste_symbols; /* dict: variable names to flags */ + PyObject *ste_name; /* string: name of current block */ + PyObject *ste_varnames; /* list of function parameters */ + PyObject *ste_children; /* list of child blocks */ + PyObject *ste_directives;/* locations of global and nonlocal statements */ + _Py_block_ty ste_type; /* module, class, or function */ + int ste_nested; /* true if block is nested */ + unsigned ste_free : 1; /* true if block has free variables */ + unsigned ste_child_free : 1; /* true if a child block has free vars, + including free refs to globals */ + unsigned ste_generator : 1; /* true if namespace is a generator */ + unsigned ste_coroutine : 1; /* true if namespace is a coroutine */ + unsigned ste_varargs : 1; /* true if block has varargs */ + unsigned ste_varkeywords : 1; /* true if block has varkeywords */ + unsigned ste_returns_value : 1; /* true if namespace uses return with + an argument */ + unsigned ste_needs_class_closure : 1; /* for class scopes, true if a + closure over __class__ + should be created */ + int ste_lineno; /* first line of block */ + int ste_col_offset; /* offset of first line of block */ + int ste_opt_lineno; /* lineno of last exec or import * */ + int ste_opt_col_offset; /* offset of last exec or import * */ + struct symtable *ste_table; +} PySTEntryObject; + +PyAPI_DATA(PyTypeObject) PySTEntry_Type; + +#define PySTEntry_Check(op) (Py_TYPE(op) == &PySTEntry_Type) + +PyAPI_FUNC(int) PyST_GetScope(PySTEntryObject *, PyObject *); + +PyAPI_FUNC(struct symtable *) PySymtable_Build( + mod_ty mod, + const char *filename, /* decoded from the filesystem encoding */ + PyFutureFeatures *future); +PyAPI_FUNC(struct symtable *) PySymtable_BuildObject( + mod_ty mod, + PyObject *filename, + PyFutureFeatures *future); +PyAPI_FUNC(PySTEntryObject *) PySymtable_Lookup(struct symtable *, void *); + +PyAPI_FUNC(void) PySymtable_Free(struct symtable *); + +/* Flags for def-use information */ + +#define DEF_GLOBAL 1 /* global stmt */ +#define DEF_LOCAL 2 /* assignment in code block */ +#define DEF_PARAM 2<<1 /* formal parameter */ +#define DEF_NONLOCAL 2<<2 /* nonlocal stmt */ +#define USE 2<<3 /* name is used */ +#define DEF_FREE 2<<4 /* name used but not defined in nested block */ +#define DEF_FREE_CLASS 2<<5 /* free variable from class's method */ +#define DEF_IMPORT 2<<6 /* assignment occurred via import */ +#define DEF_ANNOT 2<<7 /* this name is annotated */ + +#define DEF_BOUND (DEF_LOCAL | DEF_PARAM | DEF_IMPORT) + +/* GLOBAL_EXPLICIT and GLOBAL_IMPLICIT are used internally by the symbol + table. GLOBAL is returned from PyST_GetScope() for either of them. + It is stored in ste_symbols at bits 12-15. +*/ +#define SCOPE_OFFSET 11 +#define SCOPE_MASK (DEF_GLOBAL | DEF_LOCAL | DEF_PARAM | DEF_NONLOCAL) + +#define LOCAL 1 +#define GLOBAL_EXPLICIT 2 +#define GLOBAL_IMPLICIT 3 +#define FREE 4 +#define CELL 5 + +#define GENERATOR 1 +#define GENERATOR_EXPRESSION 2 + +#ifdef __cplusplus +} +#endif +#endif /* !Py_SYMTABLE_H */ +#endif /* Py_LIMITED_API */ diff --git a/env/Include/sysmodule.h b/env/Include/sysmodule.h new file mode 100644 index 0000000..719ecfc --- /dev/null +++ b/env/Include/sysmodule.h @@ -0,0 +1,48 @@ + +/* System module interface */ + +#ifndef Py_SYSMODULE_H +#define Py_SYSMODULE_H +#ifdef __cplusplus +extern "C" { +#endif + +PyAPI_FUNC(PyObject *) PySys_GetObject(const char *); +PyAPI_FUNC(int) PySys_SetObject(const char *, PyObject *); +#ifndef Py_LIMITED_API +PyAPI_FUNC(PyObject *) _PySys_GetObjectId(_Py_Identifier *key); +PyAPI_FUNC(int) _PySys_SetObjectId(_Py_Identifier *key, PyObject *); +#endif + +PyAPI_FUNC(void) PySys_SetArgv(int, wchar_t **); +PyAPI_FUNC(void) PySys_SetArgvEx(int, wchar_t **, int); +PyAPI_FUNC(void) PySys_SetPath(const wchar_t *); + +PyAPI_FUNC(void) PySys_WriteStdout(const char *format, ...) + Py_GCC_ATTRIBUTE((format(printf, 1, 2))); +PyAPI_FUNC(void) PySys_WriteStderr(const char *format, ...) + Py_GCC_ATTRIBUTE((format(printf, 1, 2))); +PyAPI_FUNC(void) PySys_FormatStdout(const char *format, ...); +PyAPI_FUNC(void) PySys_FormatStderr(const char *format, ...); + +PyAPI_FUNC(void) PySys_ResetWarnOptions(void); +PyAPI_FUNC(void) PySys_AddWarnOption(const wchar_t *); +PyAPI_FUNC(void) PySys_AddWarnOptionUnicode(PyObject *); +PyAPI_FUNC(int) PySys_HasWarnOptions(void); + +PyAPI_FUNC(void) PySys_AddXOption(const wchar_t *); +PyAPI_FUNC(PyObject *) PySys_GetXOptions(void); + +#ifndef Py_LIMITED_API +PyAPI_FUNC(size_t) _PySys_GetSizeOf(PyObject *); +#endif + +#ifdef Py_BUILD_CORE +PyAPI_FUNC(int) _PySys_AddXOptionWithError(const wchar_t *s); +PyAPI_FUNC(int) _PySys_AddWarnOptionWithError(PyObject *option); +#endif + +#ifdef __cplusplus +} +#endif +#endif /* !Py_SYSMODULE_H */ diff --git a/env/Include/token.h b/env/Include/token.h new file mode 100644 index 0000000..cd1cd00 --- /dev/null +++ b/env/Include/token.h @@ -0,0 +1,92 @@ + +/* Token types */ +#ifndef Py_LIMITED_API +#ifndef Py_TOKEN_H +#define Py_TOKEN_H +#ifdef __cplusplus +extern "C" { +#endif + +#undef TILDE /* Prevent clash of our definition with system macro. Ex AIX, ioctl.h */ + +#define ENDMARKER 0 +#define NAME 1 +#define NUMBER 2 +#define STRING 3 +#define NEWLINE 4 +#define INDENT 5 +#define DEDENT 6 +#define LPAR 7 +#define RPAR 8 +#define LSQB 9 +#define RSQB 10 +#define COLON 11 +#define COMMA 12 +#define SEMI 13 +#define PLUS 14 +#define MINUS 15 +#define STAR 16 +#define SLASH 17 +#define VBAR 18 +#define AMPER 19 +#define LESS 20 +#define GREATER 21 +#define EQUAL 22 +#define DOT 23 +#define PERCENT 24 +#define LBRACE 25 +#define RBRACE 26 +#define EQEQUAL 27 +#define NOTEQUAL 28 +#define LESSEQUAL 29 +#define GREATEREQUAL 30 +#define TILDE 31 +#define CIRCUMFLEX 32 +#define LEFTSHIFT 33 +#define RIGHTSHIFT 34 +#define DOUBLESTAR 35 +#define PLUSEQUAL 36 +#define MINEQUAL 37 +#define STAREQUAL 38 +#define SLASHEQUAL 39 +#define PERCENTEQUAL 40 +#define AMPEREQUAL 41 +#define VBAREQUAL 42 +#define CIRCUMFLEXEQUAL 43 +#define LEFTSHIFTEQUAL 44 +#define RIGHTSHIFTEQUAL 45 +#define DOUBLESTAREQUAL 46 +#define DOUBLESLASH 47 +#define DOUBLESLASHEQUAL 48 +#define AT 49 +#define ATEQUAL 50 +#define RARROW 51 +#define ELLIPSIS 52 +/* Don't forget to update the table _PyParser_TokenNames in tokenizer.c! */ +#define OP 53 +#define ERRORTOKEN 54 +/* These aren't used by the C tokenizer but are needed for tokenize.py */ +#define COMMENT 55 +#define NL 56 +#define ENCODING 57 +#define N_TOKENS 58 + +/* Special definitions for cooperation with parser */ + +#define NT_OFFSET 256 + +#define ISTERMINAL(x) ((x) < NT_OFFSET) +#define ISNONTERMINAL(x) ((x) >= NT_OFFSET) +#define ISEOF(x) ((x) == ENDMARKER) + + +PyAPI_DATA(const char *) _PyParser_TokenNames[]; /* Token names */ +PyAPI_FUNC(int) PyToken_OneChar(int); +PyAPI_FUNC(int) PyToken_TwoChars(int, int); +PyAPI_FUNC(int) PyToken_ThreeChars(int, int, int); + +#ifdef __cplusplus +} +#endif +#endif /* !Py_TOKEN_H */ +#endif /* Py_LIMITED_API */ diff --git a/env/Include/traceback.h b/env/Include/traceback.h new file mode 100644 index 0000000..b587410 --- /dev/null +++ b/env/Include/traceback.h @@ -0,0 +1,119 @@ + +#ifndef Py_TRACEBACK_H +#define Py_TRACEBACK_H +#ifdef __cplusplus +extern "C" { +#endif + +#include "pystate.h" + +struct _frame; + +/* Traceback interface */ +#ifndef Py_LIMITED_API +typedef struct _traceback { + PyObject_HEAD + struct _traceback *tb_next; + struct _frame *tb_frame; + int tb_lasti; + int tb_lineno; +} PyTracebackObject; +#endif + +PyAPI_FUNC(int) PyTraceBack_Here(struct _frame *); +PyAPI_FUNC(int) PyTraceBack_Print(PyObject *, PyObject *); +#ifndef Py_LIMITED_API +PyAPI_FUNC(int) _Py_DisplaySourceLine(PyObject *, PyObject *, int, int); +PyAPI_FUNC(void) _PyTraceback_Add(const char *, const char *, int); +#endif + +/* Reveal traceback type so we can typecheck traceback objects */ +PyAPI_DATA(PyTypeObject) PyTraceBack_Type; +#define PyTraceBack_Check(v) (Py_TYPE(v) == &PyTraceBack_Type) + +#ifndef Py_LIMITED_API +/* Write the Python traceback into the file 'fd'. For example: + + Traceback (most recent call first): + File "xxx", line xxx in + File "xxx", line xxx in + ... + File "xxx", line xxx in + + This function is written for debug purpose only, to dump the traceback in + the worst case: after a segmentation fault, at fatal error, etc. That's why, + it is very limited. Strings are truncated to 100 characters and encoded to + ASCII with backslashreplace. It doesn't write the source code, only the + function name, filename and line number of each frame. Write only the first + 100 frames: if the traceback is truncated, write the line " ...". + + This function is signal safe. */ + +PyAPI_FUNC(void) _Py_DumpTraceback( + int fd, + PyThreadState *tstate); + +/* Write the traceback of all threads into the file 'fd'. current_thread can be + NULL. + + Return NULL on success, or an error message on error. + + This function is written for debug purpose only. It calls + _Py_DumpTraceback() for each thread, and so has the same limitations. It + only write the traceback of the first 100 threads: write "..." if there are + more threads. + + If current_tstate is NULL, the function tries to get the Python thread state + of the current thread. It is not an error if the function is unable to get + the current Python thread state. + + If interp is NULL, the function tries to get the interpreter state from + the current Python thread state, or from + _PyGILState_GetInterpreterStateUnsafe() in last resort. + + It is better to pass NULL to interp and current_tstate, the function tries + different options to retrieve these informations. + + This function is signal safe. */ + +PyAPI_FUNC(const char*) _Py_DumpTracebackThreads( + int fd, + PyInterpreterState *interp, + PyThreadState *current_tstate); +#endif /* !Py_LIMITED_API */ + +#ifndef Py_LIMITED_API + +/* Write a Unicode object into the file descriptor fd. Encode the string to + ASCII using the backslashreplace error handler. + + Do nothing if text is not a Unicode object. The function accepts Unicode + string which is not ready (PyUnicode_WCHAR_KIND). + + This function is signal safe. */ +PyAPI_FUNC(void) _Py_DumpASCII(int fd, PyObject *text); + +/* Format an integer as decimal into the file descriptor fd. + + This function is signal safe. */ +PyAPI_FUNC(void) _Py_DumpDecimal( + int fd, + unsigned long value); + +/* Format an integer as hexadecimal into the file descriptor fd with at least + width digits. + + The maximum width is sizeof(unsigned long)*2 digits. + + This function is signal safe. */ +PyAPI_FUNC(void) _Py_DumpHexadecimal( + int fd, + unsigned long value, + Py_ssize_t width); + +#endif /* !Py_LIMITED_API */ + +#ifdef __cplusplus +} +#endif +#endif /* !Py_TRACEBACK_H */ diff --git a/env/Include/tupleobject.h b/env/Include/tupleobject.h new file mode 100644 index 0000000..72a7d8d --- /dev/null +++ b/env/Include/tupleobject.h @@ -0,0 +1,73 @@ + +/* Tuple object interface */ + +#ifndef Py_TUPLEOBJECT_H +#define Py_TUPLEOBJECT_H +#ifdef __cplusplus +extern "C" { +#endif + +/* +Another generally useful object type is a tuple of object pointers. +For Python, this is an immutable type. C code can change the tuple items +(but not their number), and even use tuples as general-purpose arrays of +object references, but in general only brand new tuples should be mutated, +not ones that might already have been exposed to Python code. + +*** WARNING *** PyTuple_SetItem does not increment the new item's reference +count, but does decrement the reference count of the item it replaces, +if not nil. It does *decrement* the reference count if it is *not* +inserted in the tuple. Similarly, PyTuple_GetItem does not increment the +returned item's reference count. +*/ + +#ifndef Py_LIMITED_API +typedef struct { + PyObject_VAR_HEAD + PyObject *ob_item[1]; + + /* ob_item contains space for 'ob_size' elements. + * Items must normally not be NULL, except during construction when + * the tuple is not yet visible outside the function that builds it. + */ +} PyTupleObject; +#endif + +PyAPI_DATA(PyTypeObject) PyTuple_Type; +PyAPI_DATA(PyTypeObject) PyTupleIter_Type; + +#define PyTuple_Check(op) \ + PyType_FastSubclass(Py_TYPE(op), Py_TPFLAGS_TUPLE_SUBCLASS) +#define PyTuple_CheckExact(op) (Py_TYPE(op) == &PyTuple_Type) + +PyAPI_FUNC(PyObject *) PyTuple_New(Py_ssize_t size); +PyAPI_FUNC(Py_ssize_t) PyTuple_Size(PyObject *); +PyAPI_FUNC(PyObject *) PyTuple_GetItem(PyObject *, Py_ssize_t); +PyAPI_FUNC(int) PyTuple_SetItem(PyObject *, Py_ssize_t, PyObject *); +PyAPI_FUNC(PyObject *) PyTuple_GetSlice(PyObject *, Py_ssize_t, Py_ssize_t); +#ifndef Py_LIMITED_API +PyAPI_FUNC(int) _PyTuple_Resize(PyObject **, Py_ssize_t); +#endif +PyAPI_FUNC(PyObject *) PyTuple_Pack(Py_ssize_t, ...); +#ifndef Py_LIMITED_API +PyAPI_FUNC(void) _PyTuple_MaybeUntrack(PyObject *); +#endif + +/* Macro, trading safety for speed */ +#ifndef Py_LIMITED_API +#define PyTuple_GET_ITEM(op, i) (((PyTupleObject *)(op))->ob_item[i]) +#define PyTuple_GET_SIZE(op) (assert(PyTuple_Check(op)),Py_SIZE(op)) + +/* Macro, *only* to be used to fill in brand new tuples */ +#define PyTuple_SET_ITEM(op, i, v) (((PyTupleObject *)(op))->ob_item[i] = v) +#endif + +PyAPI_FUNC(int) PyTuple_ClearFreeList(void); +#ifndef Py_LIMITED_API +PyAPI_FUNC(void) _PyTuple_DebugMallocStats(FILE *out); +#endif /* Py_LIMITED_API */ + +#ifdef __cplusplus +} +#endif +#endif /* !Py_TUPLEOBJECT_H */ diff --git a/env/Include/typeslots.h b/env/Include/typeslots.h new file mode 100644 index 0000000..0ce6a37 --- /dev/null +++ b/env/Include/typeslots.h @@ -0,0 +1,85 @@ +/* Do not renumber the file; these numbers are part of the stable ABI. */ +/* Disabled, see #10181 */ +#undef Py_bf_getbuffer +#undef Py_bf_releasebuffer +#define Py_mp_ass_subscript 3 +#define Py_mp_length 4 +#define Py_mp_subscript 5 +#define Py_nb_absolute 6 +#define Py_nb_add 7 +#define Py_nb_and 8 +#define Py_nb_bool 9 +#define Py_nb_divmod 10 +#define Py_nb_float 11 +#define Py_nb_floor_divide 12 +#define Py_nb_index 13 +#define Py_nb_inplace_add 14 +#define Py_nb_inplace_and 15 +#define Py_nb_inplace_floor_divide 16 +#define Py_nb_inplace_lshift 17 +#define Py_nb_inplace_multiply 18 +#define Py_nb_inplace_or 19 +#define Py_nb_inplace_power 20 +#define Py_nb_inplace_remainder 21 +#define Py_nb_inplace_rshift 22 +#define Py_nb_inplace_subtract 23 +#define Py_nb_inplace_true_divide 24 +#define Py_nb_inplace_xor 25 +#define Py_nb_int 26 +#define Py_nb_invert 27 +#define Py_nb_lshift 28 +#define Py_nb_multiply 29 +#define Py_nb_negative 30 +#define Py_nb_or 31 +#define Py_nb_positive 32 +#define Py_nb_power 33 +#define Py_nb_remainder 34 +#define Py_nb_rshift 35 +#define Py_nb_subtract 36 +#define Py_nb_true_divide 37 +#define Py_nb_xor 38 +#define Py_sq_ass_item 39 +#define Py_sq_concat 40 +#define Py_sq_contains 41 +#define Py_sq_inplace_concat 42 +#define Py_sq_inplace_repeat 43 +#define Py_sq_item 44 +#define Py_sq_length 45 +#define Py_sq_repeat 46 +#define Py_tp_alloc 47 +#define Py_tp_base 48 +#define Py_tp_bases 49 +#define Py_tp_call 50 +#define Py_tp_clear 51 +#define Py_tp_dealloc 52 +#define Py_tp_del 53 +#define Py_tp_descr_get 54 +#define Py_tp_descr_set 55 +#define Py_tp_doc 56 +#define Py_tp_getattr 57 +#define Py_tp_getattro 58 +#define Py_tp_hash 59 +#define Py_tp_init 60 +#define Py_tp_is_gc 61 +#define Py_tp_iter 62 +#define Py_tp_iternext 63 +#define Py_tp_methods 64 +#define Py_tp_new 65 +#define Py_tp_repr 66 +#define Py_tp_richcompare 67 +#define Py_tp_setattr 68 +#define Py_tp_setattro 69 +#define Py_tp_str 70 +#define Py_tp_traverse 71 +#define Py_tp_members 72 +#define Py_tp_getset 73 +#define Py_tp_free 74 +#define Py_nb_matrix_multiply 75 +#define Py_nb_inplace_matrix_multiply 76 +#define Py_am_await 77 +#define Py_am_aiter 78 +#define Py_am_anext 79 +#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03050000 +/* New in 3.5 */ +#define Py_tp_finalize 80 +#endif diff --git a/env/Include/ucnhash.h b/env/Include/ucnhash.h new file mode 100644 index 0000000..45362e9 --- /dev/null +++ b/env/Include/ucnhash.h @@ -0,0 +1,36 @@ +/* Unicode name database interface */ +#ifndef Py_LIMITED_API +#ifndef Py_UCNHASH_H +#define Py_UCNHASH_H +#ifdef __cplusplus +extern "C" { +#endif + +/* revised ucnhash CAPI interface (exported through a "wrapper") */ + +#define PyUnicodeData_CAPSULE_NAME "unicodedata.ucnhash_CAPI" + +typedef struct { + + /* Size of this struct */ + int size; + + /* Get name for a given character code. Returns non-zero if + success, zero if not. Does not set Python exceptions. + If self is NULL, data come from the default version of the database. + If it is not NULL, it should be a unicodedata.ucd_X_Y_Z object */ + int (*getname)(PyObject *self, Py_UCS4 code, char* buffer, int buflen, + int with_alias_and_seq); + + /* Get character code for a given name. Same error handling + as for getname. */ + int (*getcode)(PyObject *self, const char* name, int namelen, Py_UCS4* code, + int with_named_seq); + +} _PyUnicode_Name_CAPI; + +#ifdef __cplusplus +} +#endif +#endif /* !Py_UCNHASH_H */ +#endif /* !Py_LIMITED_API */ diff --git a/env/Include/unicodeobject.h b/env/Include/unicodeobject.h new file mode 100644 index 0000000..45998a1 --- /dev/null +++ b/env/Include/unicodeobject.h @@ -0,0 +1,2334 @@ +#ifndef Py_UNICODEOBJECT_H +#define Py_UNICODEOBJECT_H + +#include + +/* + +Unicode implementation based on original code by Fredrik Lundh, +modified by Marc-Andre Lemburg (mal@lemburg.com) according to the +Unicode Integration Proposal. (See +http://www.egenix.com/files/python/unicode-proposal.txt). + +Copyright (c) Corporation for National Research Initiatives. + + + Original header: + -------------------------------------------------------------------- + + * Yet another Unicode string type for Python. This type supports the + * 16-bit Basic Multilingual Plane (BMP) only. + * + * Written by Fredrik Lundh, January 1999. + * + * Copyright (c) 1999 by Secret Labs AB. + * Copyright (c) 1999 by Fredrik Lundh. + * + * fredrik@pythonware.com + * http://www.pythonware.com + * + * -------------------------------------------------------------------- + * This Unicode String Type is + * + * Copyright (c) 1999 by Secret Labs AB + * Copyright (c) 1999 by Fredrik Lundh + * + * By obtaining, using, and/or copying this software and/or its + * associated documentation, you agree that you have read, understood, + * and will comply with the following terms and conditions: + * + * Permission to use, copy, modify, and distribute this software and its + * associated documentation for any purpose and without fee is hereby + * granted, provided that the above copyright notice appears in all + * copies, and that both that copyright notice and this permission notice + * appear in supporting documentation, and that the name of Secret Labs + * AB or the author not be used in advertising or publicity pertaining to + * distribution of the software without specific, written prior + * permission. + * + * SECRET LABS AB AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO + * THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS. IN NO EVENT SHALL SECRET LABS AB OR THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT + * OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * -------------------------------------------------------------------- */ + +#include + +/* === Internal API ======================================================= */ + +/* --- Internal Unicode Format -------------------------------------------- */ + +/* Python 3.x requires unicode */ +#define Py_USING_UNICODE + +#ifndef SIZEOF_WCHAR_T +#error Must define SIZEOF_WCHAR_T +#endif + +#define Py_UNICODE_SIZE SIZEOF_WCHAR_T + +/* If wchar_t can be used for UCS-4 storage, set Py_UNICODE_WIDE. + Otherwise, Unicode strings are stored as UCS-2 (with limited support + for UTF-16) */ + +#if Py_UNICODE_SIZE >= 4 +#define Py_UNICODE_WIDE +#endif + +/* Set these flags if the platform has "wchar.h" and the + wchar_t type is a 16-bit unsigned type */ +/* #define HAVE_WCHAR_H */ +/* #define HAVE_USABLE_WCHAR_T */ + +/* Py_UNICODE was the native Unicode storage format (code unit) used by + Python and represents a single Unicode element in the Unicode type. + With PEP 393, Py_UNICODE is deprecated and replaced with a + typedef to wchar_t. */ + +#ifndef Py_LIMITED_API +#define PY_UNICODE_TYPE wchar_t +typedef wchar_t Py_UNICODE /* Py_DEPRECATED(3.3) */; +#endif + +/* If the compiler provides a wchar_t type we try to support it + through the interface functions PyUnicode_FromWideChar(), + PyUnicode_AsWideChar() and PyUnicode_AsWideCharString(). */ + +#ifdef HAVE_USABLE_WCHAR_T +# ifndef HAVE_WCHAR_H +# define HAVE_WCHAR_H +# endif +#endif + +#ifdef HAVE_WCHAR_H +# include +#endif + +/* Py_UCS4 and Py_UCS2 are typedefs for the respective + unicode representations. */ +typedef uint32_t Py_UCS4; +typedef uint16_t Py_UCS2; +typedef uint8_t Py_UCS1; + +/* --- Internal Unicode Operations ---------------------------------------- */ + +/* Since splitting on whitespace is an important use case, and + whitespace in most situations is solely ASCII whitespace, we + optimize for the common case by using a quick look-up table + _Py_ascii_whitespace (see below) with an inlined check. + + */ +#ifndef Py_LIMITED_API +#define Py_UNICODE_ISSPACE(ch) \ + ((ch) < 128U ? _Py_ascii_whitespace[(ch)] : _PyUnicode_IsWhitespace(ch)) + +#define Py_UNICODE_ISLOWER(ch) _PyUnicode_IsLowercase(ch) +#define Py_UNICODE_ISUPPER(ch) _PyUnicode_IsUppercase(ch) +#define Py_UNICODE_ISTITLE(ch) _PyUnicode_IsTitlecase(ch) +#define Py_UNICODE_ISLINEBREAK(ch) _PyUnicode_IsLinebreak(ch) + +#define Py_UNICODE_TOLOWER(ch) _PyUnicode_ToLowercase(ch) +#define Py_UNICODE_TOUPPER(ch) _PyUnicode_ToUppercase(ch) +#define Py_UNICODE_TOTITLE(ch) _PyUnicode_ToTitlecase(ch) + +#define Py_UNICODE_ISDECIMAL(ch) _PyUnicode_IsDecimalDigit(ch) +#define Py_UNICODE_ISDIGIT(ch) _PyUnicode_IsDigit(ch) +#define Py_UNICODE_ISNUMERIC(ch) _PyUnicode_IsNumeric(ch) +#define Py_UNICODE_ISPRINTABLE(ch) _PyUnicode_IsPrintable(ch) + +#define Py_UNICODE_TODECIMAL(ch) _PyUnicode_ToDecimalDigit(ch) +#define Py_UNICODE_TODIGIT(ch) _PyUnicode_ToDigit(ch) +#define Py_UNICODE_TONUMERIC(ch) _PyUnicode_ToNumeric(ch) + +#define Py_UNICODE_ISALPHA(ch) _PyUnicode_IsAlpha(ch) + +#define Py_UNICODE_ISALNUM(ch) \ + (Py_UNICODE_ISALPHA(ch) || \ + Py_UNICODE_ISDECIMAL(ch) || \ + Py_UNICODE_ISDIGIT(ch) || \ + Py_UNICODE_ISNUMERIC(ch)) + +#define Py_UNICODE_COPY(target, source, length) \ + memcpy((target), (source), (length)*sizeof(Py_UNICODE)) + +#define Py_UNICODE_FILL(target, value, length) \ + do {Py_ssize_t i_; Py_UNICODE *t_ = (target); Py_UNICODE v_ = (value);\ + for (i_ = 0; i_ < (length); i_++) t_[i_] = v_;\ + } while (0) + +/* macros to work with surrogates */ +#define Py_UNICODE_IS_SURROGATE(ch) (0xD800 <= (ch) && (ch) <= 0xDFFF) +#define Py_UNICODE_IS_HIGH_SURROGATE(ch) (0xD800 <= (ch) && (ch) <= 0xDBFF) +#define Py_UNICODE_IS_LOW_SURROGATE(ch) (0xDC00 <= (ch) && (ch) <= 0xDFFF) +/* Join two surrogate characters and return a single Py_UCS4 value. */ +#define Py_UNICODE_JOIN_SURROGATES(high, low) \ + (((((Py_UCS4)(high) & 0x03FF) << 10) | \ + ((Py_UCS4)(low) & 0x03FF)) + 0x10000) +/* high surrogate = top 10 bits added to D800 */ +#define Py_UNICODE_HIGH_SURROGATE(ch) (0xD800 - (0x10000 >> 10) + ((ch) >> 10)) +/* low surrogate = bottom 10 bits added to DC00 */ +#define Py_UNICODE_LOW_SURROGATE(ch) (0xDC00 + ((ch) & 0x3FF)) + +/* Check if substring matches at given offset. The offset must be + valid, and the substring must not be empty. */ + +#define Py_UNICODE_MATCH(string, offset, substring) \ + ((*((string)->wstr + (offset)) == *((substring)->wstr)) && \ + ((*((string)->wstr + (offset) + (substring)->wstr_length-1) == *((substring)->wstr + (substring)->wstr_length-1))) && \ + !memcmp((string)->wstr + (offset), (substring)->wstr, (substring)->wstr_length*sizeof(Py_UNICODE))) + +#endif /* Py_LIMITED_API */ + +#ifdef __cplusplus +extern "C" { +#endif + +/* --- Unicode Type ------------------------------------------------------- */ + +#ifndef Py_LIMITED_API + +/* ASCII-only strings created through PyUnicode_New use the PyASCIIObject + structure. state.ascii and state.compact are set, and the data + immediately follow the structure. utf8_length and wstr_length can be found + in the length field; the utf8 pointer is equal to the data pointer. */ +typedef struct { + /* There are 4 forms of Unicode strings: + + - compact ascii: + + * structure = PyASCIIObject + * test: PyUnicode_IS_COMPACT_ASCII(op) + * kind = PyUnicode_1BYTE_KIND + * compact = 1 + * ascii = 1 + * ready = 1 + * (length is the length of the utf8 and wstr strings) + * (data starts just after the structure) + * (since ASCII is decoded from UTF-8, the utf8 string are the data) + + - compact: + + * structure = PyCompactUnicodeObject + * test: PyUnicode_IS_COMPACT(op) && !PyUnicode_IS_ASCII(op) + * kind = PyUnicode_1BYTE_KIND, PyUnicode_2BYTE_KIND or + PyUnicode_4BYTE_KIND + * compact = 1 + * ready = 1 + * ascii = 0 + * utf8 is not shared with data + * utf8_length = 0 if utf8 is NULL + * wstr is shared with data and wstr_length=length + if kind=PyUnicode_2BYTE_KIND and sizeof(wchar_t)=2 + or if kind=PyUnicode_4BYTE_KIND and sizeof(wchar_t)=4 + * wstr_length = 0 if wstr is NULL + * (data starts just after the structure) + + - legacy string, not ready: + + * structure = PyUnicodeObject + * test: kind == PyUnicode_WCHAR_KIND + * length = 0 (use wstr_length) + * hash = -1 + * kind = PyUnicode_WCHAR_KIND + * compact = 0 + * ascii = 0 + * ready = 0 + * interned = SSTATE_NOT_INTERNED + * wstr is not NULL + * data.any is NULL + * utf8 is NULL + * utf8_length = 0 + + - legacy string, ready: + + * structure = PyUnicodeObject structure + * test: !PyUnicode_IS_COMPACT(op) && kind != PyUnicode_WCHAR_KIND + * kind = PyUnicode_1BYTE_KIND, PyUnicode_2BYTE_KIND or + PyUnicode_4BYTE_KIND + * compact = 0 + * ready = 1 + * data.any is not NULL + * utf8 is shared and utf8_length = length with data.any if ascii = 1 + * utf8_length = 0 if utf8 is NULL + * wstr is shared with data.any and wstr_length = length + if kind=PyUnicode_2BYTE_KIND and sizeof(wchar_t)=2 + or if kind=PyUnicode_4BYTE_KIND and sizeof(wchar_4)=4 + * wstr_length = 0 if wstr is NULL + + Compact strings use only one memory block (structure + characters), + whereas legacy strings use one block for the structure and one block + for characters. + + Legacy strings are created by PyUnicode_FromUnicode() and + PyUnicode_FromStringAndSize(NULL, size) functions. They become ready + when PyUnicode_READY() is called. + + See also _PyUnicode_CheckConsistency(). + */ + PyObject_HEAD + Py_ssize_t length; /* Number of code points in the string */ + Py_hash_t hash; /* Hash value; -1 if not set */ + struct { + /* + SSTATE_NOT_INTERNED (0) + SSTATE_INTERNED_MORTAL (1) + SSTATE_INTERNED_IMMORTAL (2) + + If interned != SSTATE_NOT_INTERNED, the two references from the + dictionary to this object are *not* counted in ob_refcnt. + */ + unsigned int interned:2; + /* Character size: + + - PyUnicode_WCHAR_KIND (0): + + * character type = wchar_t (16 or 32 bits, depending on the + platform) + + - PyUnicode_1BYTE_KIND (1): + + * character type = Py_UCS1 (8 bits, unsigned) + * all characters are in the range U+0000-U+00FF (latin1) + * if ascii is set, all characters are in the range U+0000-U+007F + (ASCII), otherwise at least one character is in the range + U+0080-U+00FF + + - PyUnicode_2BYTE_KIND (2): + + * character type = Py_UCS2 (16 bits, unsigned) + * all characters are in the range U+0000-U+FFFF (BMP) + * at least one character is in the range U+0100-U+FFFF + + - PyUnicode_4BYTE_KIND (4): + + * character type = Py_UCS4 (32 bits, unsigned) + * all characters are in the range U+0000-U+10FFFF + * at least one character is in the range U+10000-U+10FFFF + */ + unsigned int kind:3; + /* Compact is with respect to the allocation scheme. Compact unicode + objects only require one memory block while non-compact objects use + one block for the PyUnicodeObject struct and another for its data + buffer. */ + unsigned int compact:1; + /* The string only contains characters in the range U+0000-U+007F (ASCII) + and the kind is PyUnicode_1BYTE_KIND. If ascii is set and compact is + set, use the PyASCIIObject structure. */ + unsigned int ascii:1; + /* The ready flag indicates whether the object layout is initialized + completely. This means that this is either a compact object, or + the data pointer is filled out. The bit is redundant, and helps + to minimize the test in PyUnicode_IS_READY(). */ + unsigned int ready:1; + /* Padding to ensure that PyUnicode_DATA() is always aligned to + 4 bytes (see issue #19537 on m68k). */ + unsigned int :24; + } state; + wchar_t *wstr; /* wchar_t representation (null-terminated) */ +} PyASCIIObject; + +/* Non-ASCII strings allocated through PyUnicode_New use the + PyCompactUnicodeObject structure. state.compact is set, and the data + immediately follow the structure. */ +typedef struct { + PyASCIIObject _base; + Py_ssize_t utf8_length; /* Number of bytes in utf8, excluding the + * terminating \0. */ + char *utf8; /* UTF-8 representation (null-terminated) */ + Py_ssize_t wstr_length; /* Number of code points in wstr, possible + * surrogates count as two code points. */ +} PyCompactUnicodeObject; + +/* Strings allocated through PyUnicode_FromUnicode(NULL, len) use the + PyUnicodeObject structure. The actual string data is initially in the wstr + block, and copied into the data block using _PyUnicode_Ready. */ +typedef struct { + PyCompactUnicodeObject _base; + union { + void *any; + Py_UCS1 *latin1; + Py_UCS2 *ucs2; + Py_UCS4 *ucs4; + } data; /* Canonical, smallest-form Unicode buffer */ +} PyUnicodeObject; +#endif + +PyAPI_DATA(PyTypeObject) PyUnicode_Type; +PyAPI_DATA(PyTypeObject) PyUnicodeIter_Type; + +#define PyUnicode_Check(op) \ + PyType_FastSubclass(Py_TYPE(op), Py_TPFLAGS_UNICODE_SUBCLASS) +#define PyUnicode_CheckExact(op) (Py_TYPE(op) == &PyUnicode_Type) + +/* Fast access macros */ +#ifndef Py_LIMITED_API + +#define PyUnicode_WSTR_LENGTH(op) \ + (PyUnicode_IS_COMPACT_ASCII(op) ? \ + ((PyASCIIObject*)op)->length : \ + ((PyCompactUnicodeObject*)op)->wstr_length) + +/* Returns the deprecated Py_UNICODE representation's size in code units + (this includes surrogate pairs as 2 units). + If the Py_UNICODE representation is not available, it will be computed + on request. Use PyUnicode_GET_LENGTH() for the length in code points. */ + +#define PyUnicode_GET_SIZE(op) \ + (assert(PyUnicode_Check(op)), \ + (((PyASCIIObject *)(op))->wstr) ? \ + PyUnicode_WSTR_LENGTH(op) : \ + ((void)PyUnicode_AsUnicode((PyObject *)(op)), \ + assert(((PyASCIIObject *)(op))->wstr), \ + PyUnicode_WSTR_LENGTH(op))) + /* Py_DEPRECATED(3.3) */ + +#define PyUnicode_GET_DATA_SIZE(op) \ + (PyUnicode_GET_SIZE(op) * Py_UNICODE_SIZE) + /* Py_DEPRECATED(3.3) */ + +/* Alias for PyUnicode_AsUnicode(). This will create a wchar_t/Py_UNICODE + representation on demand. Using this macro is very inefficient now, + try to port your code to use the new PyUnicode_*BYTE_DATA() macros or + use PyUnicode_WRITE() and PyUnicode_READ(). */ + +#define PyUnicode_AS_UNICODE(op) \ + (assert(PyUnicode_Check(op)), \ + (((PyASCIIObject *)(op))->wstr) ? (((PyASCIIObject *)(op))->wstr) : \ + PyUnicode_AsUnicode((PyObject *)(op))) + /* Py_DEPRECATED(3.3) */ + +#define PyUnicode_AS_DATA(op) \ + ((const char *)(PyUnicode_AS_UNICODE(op))) + /* Py_DEPRECATED(3.3) */ + + +/* --- Flexible String Representation Helper Macros (PEP 393) -------------- */ + +/* Values for PyASCIIObject.state: */ + +/* Interning state. */ +#define SSTATE_NOT_INTERNED 0 +#define SSTATE_INTERNED_MORTAL 1 +#define SSTATE_INTERNED_IMMORTAL 2 + +/* Return true if the string contains only ASCII characters, or 0 if not. The + string may be compact (PyUnicode_IS_COMPACT_ASCII) or not, but must be + ready. */ +#define PyUnicode_IS_ASCII(op) \ + (assert(PyUnicode_Check(op)), \ + assert(PyUnicode_IS_READY(op)), \ + ((PyASCIIObject*)op)->state.ascii) + +/* Return true if the string is compact or 0 if not. + No type checks or Ready calls are performed. */ +#define PyUnicode_IS_COMPACT(op) \ + (((PyASCIIObject*)(op))->state.compact) + +/* Return true if the string is a compact ASCII string (use PyASCIIObject + structure), or 0 if not. No type checks or Ready calls are performed. */ +#define PyUnicode_IS_COMPACT_ASCII(op) \ + (((PyASCIIObject*)op)->state.ascii && PyUnicode_IS_COMPACT(op)) + +enum PyUnicode_Kind { +/* String contains only wstr byte characters. This is only possible + when the string was created with a legacy API and _PyUnicode_Ready() + has not been called yet. */ + PyUnicode_WCHAR_KIND = 0, +/* Return values of the PyUnicode_KIND() macro: */ + PyUnicode_1BYTE_KIND = 1, + PyUnicode_2BYTE_KIND = 2, + PyUnicode_4BYTE_KIND = 4 +}; + +/* Return pointers to the canonical representation cast to unsigned char, + Py_UCS2, or Py_UCS4 for direct character access. + No checks are performed, use PyUnicode_KIND() before to ensure + these will work correctly. */ + +#define PyUnicode_1BYTE_DATA(op) ((Py_UCS1*)PyUnicode_DATA(op)) +#define PyUnicode_2BYTE_DATA(op) ((Py_UCS2*)PyUnicode_DATA(op)) +#define PyUnicode_4BYTE_DATA(op) ((Py_UCS4*)PyUnicode_DATA(op)) + +/* Return one of the PyUnicode_*_KIND values defined above. */ +#define PyUnicode_KIND(op) \ + (assert(PyUnicode_Check(op)), \ + assert(PyUnicode_IS_READY(op)), \ + ((PyASCIIObject *)(op))->state.kind) + +/* Return a void pointer to the raw unicode buffer. */ +#define _PyUnicode_COMPACT_DATA(op) \ + (PyUnicode_IS_ASCII(op) ? \ + ((void*)((PyASCIIObject*)(op) + 1)) : \ + ((void*)((PyCompactUnicodeObject*)(op) + 1))) + +#define _PyUnicode_NONCOMPACT_DATA(op) \ + (assert(((PyUnicodeObject*)(op))->data.any), \ + ((((PyUnicodeObject *)(op))->data.any))) + +#define PyUnicode_DATA(op) \ + (assert(PyUnicode_Check(op)), \ + PyUnicode_IS_COMPACT(op) ? _PyUnicode_COMPACT_DATA(op) : \ + _PyUnicode_NONCOMPACT_DATA(op)) + +/* In the access macros below, "kind" may be evaluated more than once. + All other macro parameters are evaluated exactly once, so it is safe + to put side effects into them (such as increasing the index). */ + +/* Write into the canonical representation, this macro does not do any sanity + checks and is intended for usage in loops. The caller should cache the + kind and data pointers obtained from other macro calls. + index is the index in the string (starts at 0) and value is the new + code point value which should be written to that location. */ +#define PyUnicode_WRITE(kind, data, index, value) \ + do { \ + switch ((kind)) { \ + case PyUnicode_1BYTE_KIND: { \ + ((Py_UCS1 *)(data))[(index)] = (Py_UCS1)(value); \ + break; \ + } \ + case PyUnicode_2BYTE_KIND: { \ + ((Py_UCS2 *)(data))[(index)] = (Py_UCS2)(value); \ + break; \ + } \ + default: { \ + assert((kind) == PyUnicode_4BYTE_KIND); \ + ((Py_UCS4 *)(data))[(index)] = (Py_UCS4)(value); \ + } \ + } \ + } while (0) + +/* Read a code point from the string's canonical representation. No checks + or ready calls are performed. */ +#define PyUnicode_READ(kind, data, index) \ + ((Py_UCS4) \ + ((kind) == PyUnicode_1BYTE_KIND ? \ + ((const Py_UCS1 *)(data))[(index)] : \ + ((kind) == PyUnicode_2BYTE_KIND ? \ + ((const Py_UCS2 *)(data))[(index)] : \ + ((const Py_UCS4 *)(data))[(index)] \ + ) \ + )) + +/* PyUnicode_READ_CHAR() is less efficient than PyUnicode_READ() because it + calls PyUnicode_KIND() and might call it twice. For single reads, use + PyUnicode_READ_CHAR, for multiple consecutive reads callers should + cache kind and use PyUnicode_READ instead. */ +#define PyUnicode_READ_CHAR(unicode, index) \ + (assert(PyUnicode_Check(unicode)), \ + assert(PyUnicode_IS_READY(unicode)), \ + (Py_UCS4) \ + (PyUnicode_KIND((unicode)) == PyUnicode_1BYTE_KIND ? \ + ((const Py_UCS1 *)(PyUnicode_DATA((unicode))))[(index)] : \ + (PyUnicode_KIND((unicode)) == PyUnicode_2BYTE_KIND ? \ + ((const Py_UCS2 *)(PyUnicode_DATA((unicode))))[(index)] : \ + ((const Py_UCS4 *)(PyUnicode_DATA((unicode))))[(index)] \ + ) \ + )) + +/* Returns the length of the unicode string. The caller has to make sure that + the string has it's canonical representation set before calling + this macro. Call PyUnicode_(FAST_)Ready to ensure that. */ +#define PyUnicode_GET_LENGTH(op) \ + (assert(PyUnicode_Check(op)), \ + assert(PyUnicode_IS_READY(op)), \ + ((PyASCIIObject *)(op))->length) + + +/* Fast check to determine whether an object is ready. Equivalent to + PyUnicode_IS_COMPACT(op) || ((PyUnicodeObject*)(op))->data.any) */ + +#define PyUnicode_IS_READY(op) (((PyASCIIObject*)op)->state.ready) + +/* PyUnicode_READY() does less work than _PyUnicode_Ready() in the best + case. If the canonical representation is not yet set, it will still call + _PyUnicode_Ready(). + Returns 0 on success and -1 on errors. */ +#define PyUnicode_READY(op) \ + (assert(PyUnicode_Check(op)), \ + (PyUnicode_IS_READY(op) ? \ + 0 : _PyUnicode_Ready((PyObject *)(op)))) + +/* Return a maximum character value which is suitable for creating another + string based on op. This is always an approximation but more efficient + than iterating over the string. */ +#define PyUnicode_MAX_CHAR_VALUE(op) \ + (assert(PyUnicode_IS_READY(op)), \ + (PyUnicode_IS_ASCII(op) ? \ + (0x7f) : \ + (PyUnicode_KIND(op) == PyUnicode_1BYTE_KIND ? \ + (0xffU) : \ + (PyUnicode_KIND(op) == PyUnicode_2BYTE_KIND ? \ + (0xffffU) : \ + (0x10ffffU))))) + +#endif + +/* --- Constants ---------------------------------------------------------- */ + +/* This Unicode character will be used as replacement character during + decoding if the errors argument is set to "replace". Note: the + Unicode character U+FFFD is the official REPLACEMENT CHARACTER in + Unicode 3.0. */ + +#define Py_UNICODE_REPLACEMENT_CHARACTER ((Py_UCS4) 0xFFFD) + +/* === Public API ========================================================= */ + +/* --- Plain Py_UNICODE --------------------------------------------------- */ + +/* With PEP 393, this is the recommended way to allocate a new unicode object. + This function will allocate the object and its buffer in a single memory + block. Objects created using this function are not resizable. */ +#ifndef Py_LIMITED_API +PyAPI_FUNC(PyObject*) PyUnicode_New( + Py_ssize_t size, /* Number of code points in the new string */ + Py_UCS4 maxchar /* maximum code point value in the string */ + ); +#endif + +/* Initializes the canonical string representation from the deprecated + wstr/Py_UNICODE representation. This function is used to convert Unicode + objects which were created using the old API to the new flexible format + introduced with PEP 393. + + Don't call this function directly, use the public PyUnicode_READY() macro + instead. */ +#ifndef Py_LIMITED_API +PyAPI_FUNC(int) _PyUnicode_Ready( + PyObject *unicode /* Unicode object */ + ); +#endif + +/* Get a copy of a Unicode string. */ +#ifndef Py_LIMITED_API +PyAPI_FUNC(PyObject*) _PyUnicode_Copy( + PyObject *unicode + ); +#endif + +/* Copy character from one unicode object into another, this function performs + character conversion when necessary and falls back to memcpy() if possible. + + Fail if to is too small (smaller than *how_many* or smaller than + len(from)-from_start), or if kind(from[from_start:from_start+how_many]) > + kind(to), or if *to* has more than 1 reference. + + Return the number of written character, or return -1 and raise an exception + on error. + + Pseudo-code: + + how_many = min(how_many, len(from) - from_start) + to[to_start:to_start+how_many] = from[from_start:from_start+how_many] + return how_many + + Note: The function doesn't write a terminating null character. + */ +#ifndef Py_LIMITED_API +PyAPI_FUNC(Py_ssize_t) PyUnicode_CopyCharacters( + PyObject *to, + Py_ssize_t to_start, + PyObject *from, + Py_ssize_t from_start, + Py_ssize_t how_many + ); + +/* Unsafe version of PyUnicode_CopyCharacters(): don't check arguments and so + may crash if parameters are invalid (e.g. if the output string + is too short). */ +PyAPI_FUNC(void) _PyUnicode_FastCopyCharacters( + PyObject *to, + Py_ssize_t to_start, + PyObject *from, + Py_ssize_t from_start, + Py_ssize_t how_many + ); +#endif + +#ifndef Py_LIMITED_API +/* Fill a string with a character: write fill_char into + unicode[start:start+length]. + + Fail if fill_char is bigger than the string maximum character, or if the + string has more than 1 reference. + + Return the number of written character, or return -1 and raise an exception + on error. */ +PyAPI_FUNC(Py_ssize_t) PyUnicode_Fill( + PyObject *unicode, + Py_ssize_t start, + Py_ssize_t length, + Py_UCS4 fill_char + ); + +/* Unsafe version of PyUnicode_Fill(): don't check arguments and so may crash + if parameters are invalid (e.g. if length is longer than the string). */ +PyAPI_FUNC(void) _PyUnicode_FastFill( + PyObject *unicode, + Py_ssize_t start, + Py_ssize_t length, + Py_UCS4 fill_char + ); +#endif + +/* Create a Unicode Object from the Py_UNICODE buffer u of the given + size. + + u may be NULL which causes the contents to be undefined. It is the + user's responsibility to fill in the needed data afterwards. Note + that modifying the Unicode object contents after construction is + only allowed if u was set to NULL. + + The buffer is copied into the new object. */ + +#ifndef Py_LIMITED_API +PyAPI_FUNC(PyObject*) PyUnicode_FromUnicode( + const Py_UNICODE *u, /* Unicode buffer */ + Py_ssize_t size /* size of buffer */ + ) /* Py_DEPRECATED(3.3) */; +#endif + +/* Similar to PyUnicode_FromUnicode(), but u points to UTF-8 encoded bytes */ +PyAPI_FUNC(PyObject*) PyUnicode_FromStringAndSize( + const char *u, /* UTF-8 encoded string */ + Py_ssize_t size /* size of buffer */ + ); + +/* Similar to PyUnicode_FromUnicode(), but u points to null-terminated + UTF-8 encoded bytes. The size is determined with strlen(). */ +PyAPI_FUNC(PyObject*) PyUnicode_FromString( + const char *u /* UTF-8 encoded string */ + ); + +#ifndef Py_LIMITED_API +/* Create a new string from a buffer of Py_UCS1, Py_UCS2 or Py_UCS4 characters. + Scan the string to find the maximum character. */ +PyAPI_FUNC(PyObject*) PyUnicode_FromKindAndData( + int kind, + const void *buffer, + Py_ssize_t size); + +/* Create a new string from a buffer of ASCII characters. + WARNING: Don't check if the string contains any non-ASCII character. */ +PyAPI_FUNC(PyObject*) _PyUnicode_FromASCII( + const char *buffer, + Py_ssize_t size); +#endif + +#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03030000 +PyAPI_FUNC(PyObject*) PyUnicode_Substring( + PyObject *str, + Py_ssize_t start, + Py_ssize_t end); +#endif + +#ifndef Py_LIMITED_API +/* Compute the maximum character of the substring unicode[start:end]. + Return 127 for an empty string. */ +PyAPI_FUNC(Py_UCS4) _PyUnicode_FindMaxChar ( + PyObject *unicode, + Py_ssize_t start, + Py_ssize_t end); +#endif + +#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03030000 +/* Copy the string into a UCS4 buffer including the null character if copy_null + is set. Return NULL and raise an exception on error. Raise a SystemError if + the buffer is smaller than the string. Return buffer on success. + + buflen is the length of the buffer in (Py_UCS4) characters. */ +PyAPI_FUNC(Py_UCS4*) PyUnicode_AsUCS4( + PyObject *unicode, + Py_UCS4* buffer, + Py_ssize_t buflen, + int copy_null); + +/* Copy the string into a UCS4 buffer. A new buffer is allocated using + * PyMem_Malloc; if this fails, NULL is returned with a memory error + exception set. */ +PyAPI_FUNC(Py_UCS4*) PyUnicode_AsUCS4Copy(PyObject *unicode); +#endif + +#ifndef Py_LIMITED_API +/* Return a read-only pointer to the Unicode object's internal + Py_UNICODE buffer. + If the wchar_t/Py_UNICODE representation is not yet available, this + function will calculate it. */ + +PyAPI_FUNC(Py_UNICODE *) PyUnicode_AsUnicode( + PyObject *unicode /* Unicode object */ + ) /* Py_DEPRECATED(3.3) */; + +/* Similar to PyUnicode_AsUnicode(), but raises a ValueError if the string + contains null characters. */ +PyAPI_FUNC(const Py_UNICODE *) _PyUnicode_AsUnicode( + PyObject *unicode /* Unicode object */ + ); + +/* Return a read-only pointer to the Unicode object's internal + Py_UNICODE buffer and save the length at size. + If the wchar_t/Py_UNICODE representation is not yet available, this + function will calculate it. */ + +PyAPI_FUNC(Py_UNICODE *) PyUnicode_AsUnicodeAndSize( + PyObject *unicode, /* Unicode object */ + Py_ssize_t *size /* location where to save the length */ + ) /* Py_DEPRECATED(3.3) */; +#endif + +#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03030000 +/* Get the length of the Unicode object. */ + +PyAPI_FUNC(Py_ssize_t) PyUnicode_GetLength( + PyObject *unicode +); +#endif + +/* Get the number of Py_UNICODE units in the + string representation. */ + +PyAPI_FUNC(Py_ssize_t) PyUnicode_GetSize( + PyObject *unicode /* Unicode object */ + ) Py_DEPRECATED(3.3); + +#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03030000 +/* Read a character from the string. */ + +PyAPI_FUNC(Py_UCS4) PyUnicode_ReadChar( + PyObject *unicode, + Py_ssize_t index + ); + +/* Write a character to the string. The string must have been created through + PyUnicode_New, must not be shared, and must not have been hashed yet. + + Return 0 on success, -1 on error. */ + +PyAPI_FUNC(int) PyUnicode_WriteChar( + PyObject *unicode, + Py_ssize_t index, + Py_UCS4 character + ); +#endif + +#ifndef Py_LIMITED_API +/* Get the maximum ordinal for a Unicode character. */ +PyAPI_FUNC(Py_UNICODE) PyUnicode_GetMax(void) Py_DEPRECATED(3.3); +#endif + +/* Resize a Unicode object. The length is the number of characters, except + if the kind of the string is PyUnicode_WCHAR_KIND: in this case, the length + is the number of Py_UNICODE characters. + + *unicode is modified to point to the new (resized) object and 0 + returned on success. + + Try to resize the string in place (which is usually faster than allocating + a new string and copy characters), or create a new string. + + Error handling is implemented as follows: an exception is set, -1 + is returned and *unicode left untouched. + + WARNING: The function doesn't check string content, the result may not be a + string in canonical representation. */ + +PyAPI_FUNC(int) PyUnicode_Resize( + PyObject **unicode, /* Pointer to the Unicode object */ + Py_ssize_t length /* New length */ + ); + +/* Decode obj to a Unicode object. + + bytes, bytearray and other bytes-like objects are decoded according to the + given encoding and error handler. The encoding and error handler can be + NULL to have the interface use UTF-8 and "strict". + + All other objects (including Unicode objects) raise an exception. + + The API returns NULL in case of an error. The caller is responsible + for decref'ing the returned objects. + +*/ + +PyAPI_FUNC(PyObject*) PyUnicode_FromEncodedObject( + PyObject *obj, /* Object */ + const char *encoding, /* encoding */ + const char *errors /* error handling */ + ); + +/* Copy an instance of a Unicode subtype to a new true Unicode object if + necessary. If obj is already a true Unicode object (not a subtype), return + the reference with *incremented* refcount. + + The API returns NULL in case of an error. The caller is responsible + for decref'ing the returned objects. + +*/ + +PyAPI_FUNC(PyObject*) PyUnicode_FromObject( + PyObject *obj /* Object */ + ); + +PyAPI_FUNC(PyObject *) PyUnicode_FromFormatV( + const char *format, /* ASCII-encoded string */ + va_list vargs + ); +PyAPI_FUNC(PyObject *) PyUnicode_FromFormat( + const char *format, /* ASCII-encoded string */ + ... + ); + +#ifndef Py_LIMITED_API +typedef struct { + PyObject *buffer; + void *data; + enum PyUnicode_Kind kind; + Py_UCS4 maxchar; + Py_ssize_t size; + Py_ssize_t pos; + + /* minimum number of allocated characters (default: 0) */ + Py_ssize_t min_length; + + /* minimum character (default: 127, ASCII) */ + Py_UCS4 min_char; + + /* If non-zero, overallocate the buffer (default: 0). */ + unsigned char overallocate; + + /* If readonly is 1, buffer is a shared string (cannot be modified) + and size is set to 0. */ + unsigned char readonly; +} _PyUnicodeWriter ; + +/* Initialize a Unicode writer. + * + * By default, the minimum buffer size is 0 character and overallocation is + * disabled. Set min_length, min_char and overallocate attributes to control + * the allocation of the buffer. */ +PyAPI_FUNC(void) +_PyUnicodeWriter_Init(_PyUnicodeWriter *writer); + +/* Prepare the buffer to write 'length' characters + with the specified maximum character. + + Return 0 on success, raise an exception and return -1 on error. */ +#define _PyUnicodeWriter_Prepare(WRITER, LENGTH, MAXCHAR) \ + (((MAXCHAR) <= (WRITER)->maxchar \ + && (LENGTH) <= (WRITER)->size - (WRITER)->pos) \ + ? 0 \ + : (((LENGTH) == 0) \ + ? 0 \ + : _PyUnicodeWriter_PrepareInternal((WRITER), (LENGTH), (MAXCHAR)))) + +/* Don't call this function directly, use the _PyUnicodeWriter_Prepare() macro + instead. */ +PyAPI_FUNC(int) +_PyUnicodeWriter_PrepareInternal(_PyUnicodeWriter *writer, + Py_ssize_t length, Py_UCS4 maxchar); + +/* Prepare the buffer to have at least the kind KIND. + For example, kind=PyUnicode_2BYTE_KIND ensures that the writer will + support characters in range U+000-U+FFFF. + + Return 0 on success, raise an exception and return -1 on error. */ +#define _PyUnicodeWriter_PrepareKind(WRITER, KIND) \ + (assert((KIND) != PyUnicode_WCHAR_KIND), \ + (KIND) <= (WRITER)->kind \ + ? 0 \ + : _PyUnicodeWriter_PrepareKindInternal((WRITER), (KIND))) + +/* Don't call this function directly, use the _PyUnicodeWriter_PrepareKind() + macro instead. */ +PyAPI_FUNC(int) +_PyUnicodeWriter_PrepareKindInternal(_PyUnicodeWriter *writer, + enum PyUnicode_Kind kind); + +/* Append a Unicode character. + Return 0 on success, raise an exception and return -1 on error. */ +PyAPI_FUNC(int) +_PyUnicodeWriter_WriteChar(_PyUnicodeWriter *writer, + Py_UCS4 ch + ); + +/* Append a Unicode string. + Return 0 on success, raise an exception and return -1 on error. */ +PyAPI_FUNC(int) +_PyUnicodeWriter_WriteStr(_PyUnicodeWriter *writer, + PyObject *str /* Unicode string */ + ); + +/* Append a substring of a Unicode string. + Return 0 on success, raise an exception and return -1 on error. */ +PyAPI_FUNC(int) +_PyUnicodeWriter_WriteSubstring(_PyUnicodeWriter *writer, + PyObject *str, /* Unicode string */ + Py_ssize_t start, + Py_ssize_t end + ); + +/* Append an ASCII-encoded byte string. + Return 0 on success, raise an exception and return -1 on error. */ +PyAPI_FUNC(int) +_PyUnicodeWriter_WriteASCIIString(_PyUnicodeWriter *writer, + const char *str, /* ASCII-encoded byte string */ + Py_ssize_t len /* number of bytes, or -1 if unknown */ + ); + +/* Append a latin1-encoded byte string. + Return 0 on success, raise an exception and return -1 on error. */ +PyAPI_FUNC(int) +_PyUnicodeWriter_WriteLatin1String(_PyUnicodeWriter *writer, + const char *str, /* latin1-encoded byte string */ + Py_ssize_t len /* length in bytes */ + ); + +/* Get the value of the writer as a Unicode string. Clear the + buffer of the writer. Raise an exception and return NULL + on error. */ +PyAPI_FUNC(PyObject *) +_PyUnicodeWriter_Finish(_PyUnicodeWriter *writer); + +/* Deallocate memory of a writer (clear its internal buffer). */ +PyAPI_FUNC(void) +_PyUnicodeWriter_Dealloc(_PyUnicodeWriter *writer); +#endif + +#ifndef Py_LIMITED_API +/* Format the object based on the format_spec, as defined in PEP 3101 + (Advanced String Formatting). */ +PyAPI_FUNC(int) _PyUnicode_FormatAdvancedWriter( + _PyUnicodeWriter *writer, + PyObject *obj, + PyObject *format_spec, + Py_ssize_t start, + Py_ssize_t end); +#endif + +PyAPI_FUNC(void) PyUnicode_InternInPlace(PyObject **); +PyAPI_FUNC(void) PyUnicode_InternImmortal(PyObject **); +PyAPI_FUNC(PyObject *) PyUnicode_InternFromString( + const char *u /* UTF-8 encoded string */ + ); +#ifndef Py_LIMITED_API +PyAPI_FUNC(void) _Py_ReleaseInternedUnicodeStrings(void); +#endif + +/* Use only if you know it's a string */ +#define PyUnicode_CHECK_INTERNED(op) \ + (((PyASCIIObject *)(op))->state.interned) + +/* --- wchar_t support for platforms which support it --------------------- */ + +#ifdef HAVE_WCHAR_H + +/* Create a Unicode Object from the wchar_t buffer w of the given + size. + + The buffer is copied into the new object. */ + +PyAPI_FUNC(PyObject*) PyUnicode_FromWideChar( + const wchar_t *w, /* wchar_t buffer */ + Py_ssize_t size /* size of buffer */ + ); + +/* Copies the Unicode Object contents into the wchar_t buffer w. At + most size wchar_t characters are copied. + + Note that the resulting wchar_t string may or may not be + 0-terminated. It is the responsibility of the caller to make sure + that the wchar_t string is 0-terminated in case this is required by + the application. + + Returns the number of wchar_t characters copied (excluding a + possibly trailing 0-termination character) or -1 in case of an + error. */ + +PyAPI_FUNC(Py_ssize_t) PyUnicode_AsWideChar( + PyObject *unicode, /* Unicode object */ + wchar_t *w, /* wchar_t buffer */ + Py_ssize_t size /* size of buffer */ + ); + +/* Convert the Unicode object to a wide character string. The output string + always ends with a nul character. If size is not NULL, write the number of + wide characters (excluding the null character) into *size. + + Returns a buffer allocated by PyMem_Malloc() (use PyMem_Free() to free it) + on success. On error, returns NULL, *size is undefined and raises a + MemoryError. */ + +PyAPI_FUNC(wchar_t*) PyUnicode_AsWideCharString( + PyObject *unicode, /* Unicode object */ + Py_ssize_t *size /* number of characters of the result */ + ); + +#ifndef Py_LIMITED_API +PyAPI_FUNC(void*) _PyUnicode_AsKind(PyObject *s, unsigned int kind); +#endif + +#endif + +/* --- Unicode ordinals --------------------------------------------------- */ + +/* Create a Unicode Object from the given Unicode code point ordinal. + + The ordinal must be in range(0x110000). A ValueError is + raised in case it is not. + +*/ + +PyAPI_FUNC(PyObject*) PyUnicode_FromOrdinal(int ordinal); + +/* --- Free-list management ----------------------------------------------- */ + +/* Clear the free list used by the Unicode implementation. + + This can be used to release memory used for objects on the free + list back to the Python memory allocator. + +*/ + +PyAPI_FUNC(int) PyUnicode_ClearFreeList(void); + +/* === Builtin Codecs ===================================================== + + Many of these APIs take two arguments encoding and errors. These + parameters encoding and errors have the same semantics as the ones + of the builtin str() API. + + Setting encoding to NULL causes the default encoding (UTF-8) to be used. + + Error handling is set by errors which may also be set to NULL + meaning to use the default handling defined for the codec. Default + error handling for all builtin codecs is "strict" (ValueErrors are + raised). + + The codecs all use a similar interface. Only deviation from the + generic ones are documented. + +*/ + +/* --- Manage the default encoding ---------------------------------------- */ + +/* Returns a pointer to the default encoding (UTF-8) of the + Unicode object unicode and the size of the encoded representation + in bytes stored in *size. + + In case of an error, no *size is set. + + This function caches the UTF-8 encoded string in the unicodeobject + and subsequent calls will return the same string. The memory is released + when the unicodeobject is deallocated. + + _PyUnicode_AsStringAndSize is a #define for PyUnicode_AsUTF8AndSize to + support the previous internal function with the same behaviour. + + *** This API is for interpreter INTERNAL USE ONLY and will likely + *** be removed or changed in the future. + + *** If you need to access the Unicode object as UTF-8 bytes string, + *** please use PyUnicode_AsUTF8String() instead. +*/ + +#ifndef Py_LIMITED_API +PyAPI_FUNC(const char *) PyUnicode_AsUTF8AndSize( + PyObject *unicode, + Py_ssize_t *size); +#define _PyUnicode_AsStringAndSize PyUnicode_AsUTF8AndSize +#endif + +/* Returns a pointer to the default encoding (UTF-8) of the + Unicode object unicode. + + Like PyUnicode_AsUTF8AndSize(), this also caches the UTF-8 representation + in the unicodeobject. + + _PyUnicode_AsString is a #define for PyUnicode_AsUTF8 to + support the previous internal function with the same behaviour. + + Use of this API is DEPRECATED since no size information can be + extracted from the returned data. + + *** This API is for interpreter INTERNAL USE ONLY and will likely + *** be removed or changed for Python 3.1. + + *** If you need to access the Unicode object as UTF-8 bytes string, + *** please use PyUnicode_AsUTF8String() instead. + +*/ + +#ifndef Py_LIMITED_API +PyAPI_FUNC(const char *) PyUnicode_AsUTF8(PyObject *unicode); +#define _PyUnicode_AsString PyUnicode_AsUTF8 +#endif + +/* Returns "utf-8". */ + +PyAPI_FUNC(const char*) PyUnicode_GetDefaultEncoding(void); + +/* --- Generic Codecs ----------------------------------------------------- */ + +/* Create a Unicode object by decoding the encoded string s of the + given size. */ + +PyAPI_FUNC(PyObject*) PyUnicode_Decode( + const char *s, /* encoded string */ + Py_ssize_t size, /* size of buffer */ + const char *encoding, /* encoding */ + const char *errors /* error handling */ + ); + +/* Decode a Unicode object unicode and return the result as Python + object. + + This API is DEPRECATED. The only supported standard encoding is rot13. + Use PyCodec_Decode() to decode with rot13 and non-standard codecs + that decode from str. */ + +PyAPI_FUNC(PyObject*) PyUnicode_AsDecodedObject( + PyObject *unicode, /* Unicode object */ + const char *encoding, /* encoding */ + const char *errors /* error handling */ + ) Py_DEPRECATED(3.6); + +/* Decode a Unicode object unicode and return the result as Unicode + object. + + This API is DEPRECATED. The only supported standard encoding is rot13. + Use PyCodec_Decode() to decode with rot13 and non-standard codecs + that decode from str to str. */ + +PyAPI_FUNC(PyObject*) PyUnicode_AsDecodedUnicode( + PyObject *unicode, /* Unicode object */ + const char *encoding, /* encoding */ + const char *errors /* error handling */ + ) Py_DEPRECATED(3.6); + +/* Encodes a Py_UNICODE buffer of the given size and returns a + Python string object. */ + +#ifndef Py_LIMITED_API +PyAPI_FUNC(PyObject*) PyUnicode_Encode( + const Py_UNICODE *s, /* Unicode char buffer */ + Py_ssize_t size, /* number of Py_UNICODE chars to encode */ + const char *encoding, /* encoding */ + const char *errors /* error handling */ + ) Py_DEPRECATED(3.3); +#endif + +/* Encodes a Unicode object and returns the result as Python + object. + + This API is DEPRECATED. It is superseded by PyUnicode_AsEncodedString() + since all standard encodings (except rot13) encode str to bytes. + Use PyCodec_Encode() for encoding with rot13 and non-standard codecs + that encode form str to non-bytes. */ + +PyAPI_FUNC(PyObject*) PyUnicode_AsEncodedObject( + PyObject *unicode, /* Unicode object */ + const char *encoding, /* encoding */ + const char *errors /* error handling */ + ) Py_DEPRECATED(3.6); + +/* Encodes a Unicode object and returns the result as Python string + object. */ + +PyAPI_FUNC(PyObject*) PyUnicode_AsEncodedString( + PyObject *unicode, /* Unicode object */ + const char *encoding, /* encoding */ + const char *errors /* error handling */ + ); + +/* Encodes a Unicode object and returns the result as Unicode + object. + + This API is DEPRECATED. The only supported standard encodings is rot13. + Use PyCodec_Encode() to encode with rot13 and non-standard codecs + that encode from str to str. */ + +PyAPI_FUNC(PyObject*) PyUnicode_AsEncodedUnicode( + PyObject *unicode, /* Unicode object */ + const char *encoding, /* encoding */ + const char *errors /* error handling */ + ) Py_DEPRECATED(3.6); + +/* Build an encoding map. */ + +PyAPI_FUNC(PyObject*) PyUnicode_BuildEncodingMap( + PyObject* string /* 256 character map */ + ); + +/* --- UTF-7 Codecs ------------------------------------------------------- */ + +PyAPI_FUNC(PyObject*) PyUnicode_DecodeUTF7( + const char *string, /* UTF-7 encoded string */ + Py_ssize_t length, /* size of string */ + const char *errors /* error handling */ + ); + +PyAPI_FUNC(PyObject*) PyUnicode_DecodeUTF7Stateful( + const char *string, /* UTF-7 encoded string */ + Py_ssize_t length, /* size of string */ + const char *errors, /* error handling */ + Py_ssize_t *consumed /* bytes consumed */ + ); + +#ifndef Py_LIMITED_API +PyAPI_FUNC(PyObject*) PyUnicode_EncodeUTF7( + const Py_UNICODE *data, /* Unicode char buffer */ + Py_ssize_t length, /* number of Py_UNICODE chars to encode */ + int base64SetO, /* Encode RFC2152 Set O characters in base64 */ + int base64WhiteSpace, /* Encode whitespace (sp, ht, nl, cr) in base64 */ + const char *errors /* error handling */ + ) Py_DEPRECATED(3.3); +PyAPI_FUNC(PyObject*) _PyUnicode_EncodeUTF7( + PyObject *unicode, /* Unicode object */ + int base64SetO, /* Encode RFC2152 Set O characters in base64 */ + int base64WhiteSpace, /* Encode whitespace (sp, ht, nl, cr) in base64 */ + const char *errors /* error handling */ + ); +#endif + +/* --- UTF-8 Codecs ------------------------------------------------------- */ + +PyAPI_FUNC(PyObject*) PyUnicode_DecodeUTF8( + const char *string, /* UTF-8 encoded string */ + Py_ssize_t length, /* size of string */ + const char *errors /* error handling */ + ); + +PyAPI_FUNC(PyObject*) PyUnicode_DecodeUTF8Stateful( + const char *string, /* UTF-8 encoded string */ + Py_ssize_t length, /* size of string */ + const char *errors, /* error handling */ + Py_ssize_t *consumed /* bytes consumed */ + ); + +PyAPI_FUNC(PyObject*) PyUnicode_AsUTF8String( + PyObject *unicode /* Unicode object */ + ); + +#ifndef Py_LIMITED_API +PyAPI_FUNC(PyObject*) _PyUnicode_AsUTF8String( + PyObject *unicode, + const char *errors); + +PyAPI_FUNC(PyObject*) PyUnicode_EncodeUTF8( + const Py_UNICODE *data, /* Unicode char buffer */ + Py_ssize_t length, /* number of Py_UNICODE chars to encode */ + const char *errors /* error handling */ + ) Py_DEPRECATED(3.3); +#endif + +/* --- UTF-32 Codecs ------------------------------------------------------ */ + +/* Decodes length bytes from a UTF-32 encoded buffer string and returns + the corresponding Unicode object. + + errors (if non-NULL) defines the error handling. It defaults + to "strict". + + If byteorder is non-NULL, the decoder starts decoding using the + given byte order: + + *byteorder == -1: little endian + *byteorder == 0: native order + *byteorder == 1: big endian + + In native mode, the first four bytes of the stream are checked for a + BOM mark. If found, the BOM mark is analysed, the byte order + adjusted and the BOM skipped. In the other modes, no BOM mark + interpretation is done. After completion, *byteorder is set to the + current byte order at the end of input data. + + If byteorder is NULL, the codec starts in native order mode. + +*/ + +PyAPI_FUNC(PyObject*) PyUnicode_DecodeUTF32( + const char *string, /* UTF-32 encoded string */ + Py_ssize_t length, /* size of string */ + const char *errors, /* error handling */ + int *byteorder /* pointer to byteorder to use + 0=native;-1=LE,1=BE; updated on + exit */ + ); + +PyAPI_FUNC(PyObject*) PyUnicode_DecodeUTF32Stateful( + const char *string, /* UTF-32 encoded string */ + Py_ssize_t length, /* size of string */ + const char *errors, /* error handling */ + int *byteorder, /* pointer to byteorder to use + 0=native;-1=LE,1=BE; updated on + exit */ + Py_ssize_t *consumed /* bytes consumed */ + ); + +/* Returns a Python string using the UTF-32 encoding in native byte + order. The string always starts with a BOM mark. */ + +PyAPI_FUNC(PyObject*) PyUnicode_AsUTF32String( + PyObject *unicode /* Unicode object */ + ); + +/* Returns a Python string object holding the UTF-32 encoded value of + the Unicode data. + + If byteorder is not 0, output is written according to the following + byte order: + + byteorder == -1: little endian + byteorder == 0: native byte order (writes a BOM mark) + byteorder == 1: big endian + + If byteorder is 0, the output string will always start with the + Unicode BOM mark (U+FEFF). In the other two modes, no BOM mark is + prepended. + +*/ + +#ifndef Py_LIMITED_API +PyAPI_FUNC(PyObject*) PyUnicode_EncodeUTF32( + const Py_UNICODE *data, /* Unicode char buffer */ + Py_ssize_t length, /* number of Py_UNICODE chars to encode */ + const char *errors, /* error handling */ + int byteorder /* byteorder to use 0=BOM+native;-1=LE,1=BE */ + ) Py_DEPRECATED(3.3); +PyAPI_FUNC(PyObject*) _PyUnicode_EncodeUTF32( + PyObject *object, /* Unicode object */ + const char *errors, /* error handling */ + int byteorder /* byteorder to use 0=BOM+native;-1=LE,1=BE */ + ); +#endif + +/* --- UTF-16 Codecs ------------------------------------------------------ */ + +/* Decodes length bytes from a UTF-16 encoded buffer string and returns + the corresponding Unicode object. + + errors (if non-NULL) defines the error handling. It defaults + to "strict". + + If byteorder is non-NULL, the decoder starts decoding using the + given byte order: + + *byteorder == -1: little endian + *byteorder == 0: native order + *byteorder == 1: big endian + + In native mode, the first two bytes of the stream are checked for a + BOM mark. If found, the BOM mark is analysed, the byte order + adjusted and the BOM skipped. In the other modes, no BOM mark + interpretation is done. After completion, *byteorder is set to the + current byte order at the end of input data. + + If byteorder is NULL, the codec starts in native order mode. + +*/ + +PyAPI_FUNC(PyObject*) PyUnicode_DecodeUTF16( + const char *string, /* UTF-16 encoded string */ + Py_ssize_t length, /* size of string */ + const char *errors, /* error handling */ + int *byteorder /* pointer to byteorder to use + 0=native;-1=LE,1=BE; updated on + exit */ + ); + +PyAPI_FUNC(PyObject*) PyUnicode_DecodeUTF16Stateful( + const char *string, /* UTF-16 encoded string */ + Py_ssize_t length, /* size of string */ + const char *errors, /* error handling */ + int *byteorder, /* pointer to byteorder to use + 0=native;-1=LE,1=BE; updated on + exit */ + Py_ssize_t *consumed /* bytes consumed */ + ); + +/* Returns a Python string using the UTF-16 encoding in native byte + order. The string always starts with a BOM mark. */ + +PyAPI_FUNC(PyObject*) PyUnicode_AsUTF16String( + PyObject *unicode /* Unicode object */ + ); + +/* Returns a Python string object holding the UTF-16 encoded value of + the Unicode data. + + If byteorder is not 0, output is written according to the following + byte order: + + byteorder == -1: little endian + byteorder == 0: native byte order (writes a BOM mark) + byteorder == 1: big endian + + If byteorder is 0, the output string will always start with the + Unicode BOM mark (U+FEFF). In the other two modes, no BOM mark is + prepended. + + Note that Py_UNICODE data is being interpreted as UTF-16 reduced to + UCS-2. This trick makes it possible to add full UTF-16 capabilities + at a later point without compromising the APIs. + +*/ + +#ifndef Py_LIMITED_API +PyAPI_FUNC(PyObject*) PyUnicode_EncodeUTF16( + const Py_UNICODE *data, /* Unicode char buffer */ + Py_ssize_t length, /* number of Py_UNICODE chars to encode */ + const char *errors, /* error handling */ + int byteorder /* byteorder to use 0=BOM+native;-1=LE,1=BE */ + ) Py_DEPRECATED(3.3); +PyAPI_FUNC(PyObject*) _PyUnicode_EncodeUTF16( + PyObject* unicode, /* Unicode object */ + const char *errors, /* error handling */ + int byteorder /* byteorder to use 0=BOM+native;-1=LE,1=BE */ + ); +#endif + +/* --- Unicode-Escape Codecs ---------------------------------------------- */ + +PyAPI_FUNC(PyObject*) PyUnicode_DecodeUnicodeEscape( + const char *string, /* Unicode-Escape encoded string */ + Py_ssize_t length, /* size of string */ + const char *errors /* error handling */ + ); + +#ifndef Py_LIMITED_API +/* Helper for PyUnicode_DecodeUnicodeEscape that detects invalid escape + chars. */ +PyAPI_FUNC(PyObject*) _PyUnicode_DecodeUnicodeEscape( + const char *string, /* Unicode-Escape encoded string */ + Py_ssize_t length, /* size of string */ + const char *errors, /* error handling */ + const char **first_invalid_escape /* on return, points to first + invalid escaped char in + string. */ +); +#endif + +PyAPI_FUNC(PyObject*) PyUnicode_AsUnicodeEscapeString( + PyObject *unicode /* Unicode object */ + ); + +#ifndef Py_LIMITED_API +PyAPI_FUNC(PyObject*) PyUnicode_EncodeUnicodeEscape( + const Py_UNICODE *data, /* Unicode char buffer */ + Py_ssize_t length /* Number of Py_UNICODE chars to encode */ + ) Py_DEPRECATED(3.3); +#endif + +/* --- Raw-Unicode-Escape Codecs ------------------------------------------ */ + +PyAPI_FUNC(PyObject*) PyUnicode_DecodeRawUnicodeEscape( + const char *string, /* Raw-Unicode-Escape encoded string */ + Py_ssize_t length, /* size of string */ + const char *errors /* error handling */ + ); + +PyAPI_FUNC(PyObject*) PyUnicode_AsRawUnicodeEscapeString( + PyObject *unicode /* Unicode object */ + ); + +#ifndef Py_LIMITED_API +PyAPI_FUNC(PyObject*) PyUnicode_EncodeRawUnicodeEscape( + const Py_UNICODE *data, /* Unicode char buffer */ + Py_ssize_t length /* Number of Py_UNICODE chars to encode */ + ) Py_DEPRECATED(3.3); +#endif + +/* --- Unicode Internal Codec --------------------------------------------- + + Only for internal use in _codecsmodule.c */ + +#ifndef Py_LIMITED_API +PyObject *_PyUnicode_DecodeUnicodeInternal( + const char *string, + Py_ssize_t length, + const char *errors + ); +#endif + +/* --- Latin-1 Codecs ----------------------------------------------------- + + Note: Latin-1 corresponds to the first 256 Unicode ordinals. + +*/ + +PyAPI_FUNC(PyObject*) PyUnicode_DecodeLatin1( + const char *string, /* Latin-1 encoded string */ + Py_ssize_t length, /* size of string */ + const char *errors /* error handling */ + ); + +PyAPI_FUNC(PyObject*) PyUnicode_AsLatin1String( + PyObject *unicode /* Unicode object */ + ); + +#ifndef Py_LIMITED_API +PyAPI_FUNC(PyObject*) _PyUnicode_AsLatin1String( + PyObject* unicode, + const char* errors); + +PyAPI_FUNC(PyObject*) PyUnicode_EncodeLatin1( + const Py_UNICODE *data, /* Unicode char buffer */ + Py_ssize_t length, /* Number of Py_UNICODE chars to encode */ + const char *errors /* error handling */ + ) Py_DEPRECATED(3.3); +#endif + +/* --- ASCII Codecs ------------------------------------------------------- + + Only 7-bit ASCII data is excepted. All other codes generate errors. + +*/ + +PyAPI_FUNC(PyObject*) PyUnicode_DecodeASCII( + const char *string, /* ASCII encoded string */ + Py_ssize_t length, /* size of string */ + const char *errors /* error handling */ + ); + +PyAPI_FUNC(PyObject*) PyUnicode_AsASCIIString( + PyObject *unicode /* Unicode object */ + ); + +#ifndef Py_LIMITED_API +PyAPI_FUNC(PyObject*) _PyUnicode_AsASCIIString( + PyObject* unicode, + const char* errors); + +PyAPI_FUNC(PyObject*) PyUnicode_EncodeASCII( + const Py_UNICODE *data, /* Unicode char buffer */ + Py_ssize_t length, /* Number of Py_UNICODE chars to encode */ + const char *errors /* error handling */ + ) Py_DEPRECATED(3.3); +#endif + +/* --- Character Map Codecs ----------------------------------------------- + + This codec uses mappings to encode and decode characters. + + Decoding mappings must map byte ordinals (integers in the range from 0 to + 255) to Unicode strings, integers (which are then interpreted as Unicode + ordinals) or None. Unmapped data bytes (ones which cause a LookupError) + as well as mapped to None, 0xFFFE or '\ufffe' are treated as "undefined + mapping" and cause an error. + + Encoding mappings must map Unicode ordinal integers to bytes objects, + integers in the range from 0 to 255 or None. Unmapped character + ordinals (ones which cause a LookupError) as well as mapped to + None are treated as "undefined mapping" and cause an error. + +*/ + +PyAPI_FUNC(PyObject*) PyUnicode_DecodeCharmap( + const char *string, /* Encoded string */ + Py_ssize_t length, /* size of string */ + PyObject *mapping, /* decoding mapping */ + const char *errors /* error handling */ + ); + +PyAPI_FUNC(PyObject*) PyUnicode_AsCharmapString( + PyObject *unicode, /* Unicode object */ + PyObject *mapping /* encoding mapping */ + ); + +#ifndef Py_LIMITED_API +PyAPI_FUNC(PyObject*) PyUnicode_EncodeCharmap( + const Py_UNICODE *data, /* Unicode char buffer */ + Py_ssize_t length, /* Number of Py_UNICODE chars to encode */ + PyObject *mapping, /* encoding mapping */ + const char *errors /* error handling */ + ) Py_DEPRECATED(3.3); +PyAPI_FUNC(PyObject*) _PyUnicode_EncodeCharmap( + PyObject *unicode, /* Unicode object */ + PyObject *mapping, /* encoding mapping */ + const char *errors /* error handling */ + ); +#endif + +/* Translate a Py_UNICODE buffer of the given length by applying a + character mapping table to it and return the resulting Unicode + object. + + The mapping table must map Unicode ordinal integers to Unicode strings, + Unicode ordinal integers or None (causing deletion of the character). + + Mapping tables may be dictionaries or sequences. Unmapped character + ordinals (ones which cause a LookupError) are left untouched and + are copied as-is. + +*/ + +#ifndef Py_LIMITED_API +PyAPI_FUNC(PyObject *) PyUnicode_TranslateCharmap( + const Py_UNICODE *data, /* Unicode char buffer */ + Py_ssize_t length, /* Number of Py_UNICODE chars to encode */ + PyObject *table, /* Translate table */ + const char *errors /* error handling */ + ) Py_DEPRECATED(3.3); +#endif + +#ifdef MS_WINDOWS + +/* --- MBCS codecs for Windows -------------------------------------------- */ + +PyAPI_FUNC(PyObject*) PyUnicode_DecodeMBCS( + const char *string, /* MBCS encoded string */ + Py_ssize_t length, /* size of string */ + const char *errors /* error handling */ + ); + +PyAPI_FUNC(PyObject*) PyUnicode_DecodeMBCSStateful( + const char *string, /* MBCS encoded string */ + Py_ssize_t length, /* size of string */ + const char *errors, /* error handling */ + Py_ssize_t *consumed /* bytes consumed */ + ); + +#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03030000 +PyAPI_FUNC(PyObject*) PyUnicode_DecodeCodePageStateful( + int code_page, /* code page number */ + const char *string, /* encoded string */ + Py_ssize_t length, /* size of string */ + const char *errors, /* error handling */ + Py_ssize_t *consumed /* bytes consumed */ + ); +#endif + +PyAPI_FUNC(PyObject*) PyUnicode_AsMBCSString( + PyObject *unicode /* Unicode object */ + ); + +#ifndef Py_LIMITED_API +PyAPI_FUNC(PyObject*) PyUnicode_EncodeMBCS( + const Py_UNICODE *data, /* Unicode char buffer */ + Py_ssize_t length, /* number of Py_UNICODE chars to encode */ + const char *errors /* error handling */ + ) Py_DEPRECATED(3.3); +#endif + +#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03030000 +PyAPI_FUNC(PyObject*) PyUnicode_EncodeCodePage( + int code_page, /* code page number */ + PyObject *unicode, /* Unicode object */ + const char *errors /* error handling */ + ); +#endif + +#endif /* MS_WINDOWS */ + +#ifndef Py_LIMITED_API +/* --- Decimal Encoder ---------------------------------------------------- */ + +/* Takes a Unicode string holding a decimal value and writes it into + an output buffer using standard ASCII digit codes. + + The output buffer has to provide at least length+1 bytes of storage + area. The output string is 0-terminated. + + The encoder converts whitespace to ' ', decimal characters to their + corresponding ASCII digit and all other Latin-1 characters except + \0 as-is. Characters outside this range (Unicode ordinals 1-256) + are treated as errors. This includes embedded NULL bytes. + + Error handling is defined by the errors argument: + + NULL or "strict": raise a ValueError + "ignore": ignore the wrong characters (these are not copied to the + output buffer) + "replace": replaces illegal characters with '?' + + Returns 0 on success, -1 on failure. + +*/ + +PyAPI_FUNC(int) PyUnicode_EncodeDecimal( + Py_UNICODE *s, /* Unicode buffer */ + Py_ssize_t length, /* Number of Py_UNICODE chars to encode */ + char *output, /* Output buffer; must have size >= length */ + const char *errors /* error handling */ + ) /* Py_DEPRECATED(3.3) */; + +/* Transforms code points that have decimal digit property to the + corresponding ASCII digit code points. + + Returns a new Unicode string on success, NULL on failure. +*/ + +PyAPI_FUNC(PyObject*) PyUnicode_TransformDecimalToASCII( + Py_UNICODE *s, /* Unicode buffer */ + Py_ssize_t length /* Number of Py_UNICODE chars to transform */ + ) /* Py_DEPRECATED(3.3) */; + +/* Coverts a Unicode object holding a decimal value to an ASCII string + for using in int, float and complex parsers. + Transforms code points that have decimal digit property to the + corresponding ASCII digit code points. Transforms spaces to ASCII. + Transforms code points starting from the first non-ASCII code point that + is neither a decimal digit nor a space to the end into '?'. */ + +PyAPI_FUNC(PyObject*) _PyUnicode_TransformDecimalAndSpaceToASCII( + PyObject *unicode /* Unicode object */ + ); +#endif + +/* --- Locale encoding --------------------------------------------------- */ + +#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03030000 +/* Decode a string from the current locale encoding. The decoder is strict if + *surrogateescape* is equal to zero, otherwise it uses the 'surrogateescape' + error handler (PEP 383) to escape undecodable bytes. If a byte sequence can + be decoded as a surrogate character and *surrogateescape* is not equal to + zero, the byte sequence is escaped using the 'surrogateescape' error handler + instead of being decoded. *str* must end with a null character but cannot + contain embedded null characters. */ + +PyAPI_FUNC(PyObject*) PyUnicode_DecodeLocaleAndSize( + const char *str, + Py_ssize_t len, + const char *errors); + +/* Similar to PyUnicode_DecodeLocaleAndSize(), but compute the string + length using strlen(). */ + +PyAPI_FUNC(PyObject*) PyUnicode_DecodeLocale( + const char *str, + const char *errors); + +/* Encode a Unicode object to the current locale encoding. The encoder is + strict is *surrogateescape* is equal to zero, otherwise the + "surrogateescape" error handler is used. Return a bytes object. The string + cannot contain embedded null characters. */ + +PyAPI_FUNC(PyObject*) PyUnicode_EncodeLocale( + PyObject *unicode, + const char *errors + ); +#endif + +/* --- File system encoding ---------------------------------------------- */ + +/* ParseTuple converter: encode str objects to bytes using + PyUnicode_EncodeFSDefault(); bytes objects are output as-is. */ + +PyAPI_FUNC(int) PyUnicode_FSConverter(PyObject*, void*); + +/* ParseTuple converter: decode bytes objects to unicode using + PyUnicode_DecodeFSDefaultAndSize(); str objects are output as-is. */ + +PyAPI_FUNC(int) PyUnicode_FSDecoder(PyObject*, void*); + +/* Decode a null-terminated string using Py_FileSystemDefaultEncoding + and the "surrogateescape" error handler. + + If Py_FileSystemDefaultEncoding is not set, fall back to the locale + encoding. + + Use PyUnicode_DecodeFSDefaultAndSize() if the string length is known. +*/ + +PyAPI_FUNC(PyObject*) PyUnicode_DecodeFSDefault( + const char *s /* encoded string */ + ); + +/* Decode a string using Py_FileSystemDefaultEncoding + and the "surrogateescape" error handler. + + If Py_FileSystemDefaultEncoding is not set, fall back to the locale + encoding. +*/ + +PyAPI_FUNC(PyObject*) PyUnicode_DecodeFSDefaultAndSize( + const char *s, /* encoded string */ + Py_ssize_t size /* size */ + ); + +/* Encode a Unicode object to Py_FileSystemDefaultEncoding with the + "surrogateescape" error handler, and return bytes. + + If Py_FileSystemDefaultEncoding is not set, fall back to the locale + encoding. +*/ + +PyAPI_FUNC(PyObject*) PyUnicode_EncodeFSDefault( + PyObject *unicode + ); + +/* --- Methods & Slots ---------------------------------------------------- + + These are capable of handling Unicode objects and strings on input + (we refer to them as strings in the descriptions) and return + Unicode objects or integers as appropriate. */ + +/* Concat two strings giving a new Unicode string. */ + +PyAPI_FUNC(PyObject*) PyUnicode_Concat( + PyObject *left, /* Left string */ + PyObject *right /* Right string */ + ); + +/* Concat two strings and put the result in *pleft + (sets *pleft to NULL on error) */ + +PyAPI_FUNC(void) PyUnicode_Append( + PyObject **pleft, /* Pointer to left string */ + PyObject *right /* Right string */ + ); + +/* Concat two strings, put the result in *pleft and drop the right object + (sets *pleft to NULL on error) */ + +PyAPI_FUNC(void) PyUnicode_AppendAndDel( + PyObject **pleft, /* Pointer to left string */ + PyObject *right /* Right string */ + ); + +/* Split a string giving a list of Unicode strings. + + If sep is NULL, splitting will be done at all whitespace + substrings. Otherwise, splits occur at the given separator. + + At most maxsplit splits will be done. If negative, no limit is set. + + Separators are not included in the resulting list. + +*/ + +PyAPI_FUNC(PyObject*) PyUnicode_Split( + PyObject *s, /* String to split */ + PyObject *sep, /* String separator */ + Py_ssize_t maxsplit /* Maxsplit count */ + ); + +/* Dito, but split at line breaks. + + CRLF is considered to be one line break. Line breaks are not + included in the resulting list. */ + +PyAPI_FUNC(PyObject*) PyUnicode_Splitlines( + PyObject *s, /* String to split */ + int keepends /* If true, line end markers are included */ + ); + +/* Partition a string using a given separator. */ + +PyAPI_FUNC(PyObject*) PyUnicode_Partition( + PyObject *s, /* String to partition */ + PyObject *sep /* String separator */ + ); + +/* Partition a string using a given separator, searching from the end of the + string. */ + +PyAPI_FUNC(PyObject*) PyUnicode_RPartition( + PyObject *s, /* String to partition */ + PyObject *sep /* String separator */ + ); + +/* Split a string giving a list of Unicode strings. + + If sep is NULL, splitting will be done at all whitespace + substrings. Otherwise, splits occur at the given separator. + + At most maxsplit splits will be done. But unlike PyUnicode_Split + PyUnicode_RSplit splits from the end of the string. If negative, + no limit is set. + + Separators are not included in the resulting list. + +*/ + +PyAPI_FUNC(PyObject*) PyUnicode_RSplit( + PyObject *s, /* String to split */ + PyObject *sep, /* String separator */ + Py_ssize_t maxsplit /* Maxsplit count */ + ); + +/* Translate a string by applying a character mapping table to it and + return the resulting Unicode object. + + The mapping table must map Unicode ordinal integers to Unicode strings, + Unicode ordinal integers or None (causing deletion of the character). + + Mapping tables may be dictionaries or sequences. Unmapped character + ordinals (ones which cause a LookupError) are left untouched and + are copied as-is. + +*/ + +PyAPI_FUNC(PyObject *) PyUnicode_Translate( + PyObject *str, /* String */ + PyObject *table, /* Translate table */ + const char *errors /* error handling */ + ); + +/* Join a sequence of strings using the given separator and return + the resulting Unicode string. */ + +PyAPI_FUNC(PyObject*) PyUnicode_Join( + PyObject *separator, /* Separator string */ + PyObject *seq /* Sequence object */ + ); + +#ifndef Py_LIMITED_API +PyAPI_FUNC(PyObject *) _PyUnicode_JoinArray( + PyObject *separator, + PyObject *const *items, + Py_ssize_t seqlen + ); +#endif /* Py_LIMITED_API */ + +/* Return 1 if substr matches str[start:end] at the given tail end, 0 + otherwise. */ + +PyAPI_FUNC(Py_ssize_t) PyUnicode_Tailmatch( + PyObject *str, /* String */ + PyObject *substr, /* Prefix or Suffix string */ + Py_ssize_t start, /* Start index */ + Py_ssize_t end, /* Stop index */ + int direction /* Tail end: -1 prefix, +1 suffix */ + ); + +/* Return the first position of substr in str[start:end] using the + given search direction or -1 if not found. -2 is returned in case + an error occurred and an exception is set. */ + +PyAPI_FUNC(Py_ssize_t) PyUnicode_Find( + PyObject *str, /* String */ + PyObject *substr, /* Substring to find */ + Py_ssize_t start, /* Start index */ + Py_ssize_t end, /* Stop index */ + int direction /* Find direction: +1 forward, -1 backward */ + ); + +#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03030000 +/* Like PyUnicode_Find, but search for single character only. */ +PyAPI_FUNC(Py_ssize_t) PyUnicode_FindChar( + PyObject *str, + Py_UCS4 ch, + Py_ssize_t start, + Py_ssize_t end, + int direction + ); +#endif + +/* Count the number of occurrences of substr in str[start:end]. */ + +PyAPI_FUNC(Py_ssize_t) PyUnicode_Count( + PyObject *str, /* String */ + PyObject *substr, /* Substring to count */ + Py_ssize_t start, /* Start index */ + Py_ssize_t end /* Stop index */ + ); + +/* Replace at most maxcount occurrences of substr in str with replstr + and return the resulting Unicode object. */ + +PyAPI_FUNC(PyObject *) PyUnicode_Replace( + PyObject *str, /* String */ + PyObject *substr, /* Substring to find */ + PyObject *replstr, /* Substring to replace */ + Py_ssize_t maxcount /* Max. number of replacements to apply; + -1 = all */ + ); + +/* Compare two strings and return -1, 0, 1 for less than, equal, + greater than resp. + Raise an exception and return -1 on error. */ + +PyAPI_FUNC(int) PyUnicode_Compare( + PyObject *left, /* Left string */ + PyObject *right /* Right string */ + ); + +#ifndef Py_LIMITED_API +/* Test whether a unicode is equal to ASCII identifier. Return 1 if true, + 0 otherwise. The right argument must be ASCII identifier. + Any error occurs inside will be cleared before return. */ + +PyAPI_FUNC(int) _PyUnicode_EqualToASCIIId( + PyObject *left, /* Left string */ + _Py_Identifier *right /* Right identifier */ + ); +#endif + +/* Compare a Unicode object with C string and return -1, 0, 1 for less than, + equal, and greater than, respectively. It is best to pass only + ASCII-encoded strings, but the function interprets the input string as + ISO-8859-1 if it contains non-ASCII characters. + This function does not raise exceptions. */ + +PyAPI_FUNC(int) PyUnicode_CompareWithASCIIString( + PyObject *left, + const char *right /* ASCII-encoded string */ + ); + +#ifndef Py_LIMITED_API +/* Test whether a unicode is equal to ASCII string. Return 1 if true, + 0 otherwise. The right argument must be ASCII-encoded string. + Any error occurs inside will be cleared before return. */ + +PyAPI_FUNC(int) _PyUnicode_EqualToASCIIString( + PyObject *left, + const char *right /* ASCII-encoded string */ + ); +#endif + +/* Rich compare two strings and return one of the following: + + - NULL in case an exception was raised + - Py_True or Py_False for successful comparisons + - Py_NotImplemented in case the type combination is unknown + + Possible values for op: + + Py_GT, Py_GE, Py_EQ, Py_NE, Py_LT, Py_LE + +*/ + +PyAPI_FUNC(PyObject *) PyUnicode_RichCompare( + PyObject *left, /* Left string */ + PyObject *right, /* Right string */ + int op /* Operation: Py_EQ, Py_NE, Py_GT, etc. */ + ); + +/* Apply an argument tuple or dictionary to a format string and return + the resulting Unicode string. */ + +PyAPI_FUNC(PyObject *) PyUnicode_Format( + PyObject *format, /* Format string */ + PyObject *args /* Argument tuple or dictionary */ + ); + +/* Checks whether element is contained in container and return 1/0 + accordingly. + + element has to coerce to a one element Unicode string. -1 is + returned in case of an error. */ + +PyAPI_FUNC(int) PyUnicode_Contains( + PyObject *container, /* Container string */ + PyObject *element /* Element string */ + ); + +/* Checks whether argument is a valid identifier. */ + +PyAPI_FUNC(int) PyUnicode_IsIdentifier(PyObject *s); + +#ifndef Py_LIMITED_API +/* Externally visible for str.strip(unicode) */ +PyAPI_FUNC(PyObject *) _PyUnicode_XStrip( + PyObject *self, + int striptype, + PyObject *sepobj + ); +#endif + +/* Using explicit passed-in values, insert the thousands grouping + into the string pointed to by buffer. For the argument descriptions, + see Objects/stringlib/localeutil.h */ +#ifndef Py_LIMITED_API +PyAPI_FUNC(Py_ssize_t) _PyUnicode_InsertThousandsGrouping( + _PyUnicodeWriter *writer, + Py_ssize_t n_buffer, + PyObject *digits, + Py_ssize_t d_pos, + Py_ssize_t n_digits, + Py_ssize_t min_width, + const char *grouping, + PyObject *thousands_sep, + Py_UCS4 *maxchar); +#endif +/* === Characters Type APIs =============================================== */ + +/* Helper array used by Py_UNICODE_ISSPACE(). */ + +#ifndef Py_LIMITED_API +PyAPI_DATA(const unsigned char) _Py_ascii_whitespace[]; + +/* These should not be used directly. Use the Py_UNICODE_IS* and + Py_UNICODE_TO* macros instead. + + These APIs are implemented in Objects/unicodectype.c. + +*/ + +PyAPI_FUNC(int) _PyUnicode_IsLowercase( + Py_UCS4 ch /* Unicode character */ + ); + +PyAPI_FUNC(int) _PyUnicode_IsUppercase( + Py_UCS4 ch /* Unicode character */ + ); + +PyAPI_FUNC(int) _PyUnicode_IsTitlecase( + Py_UCS4 ch /* Unicode character */ + ); + +PyAPI_FUNC(int) _PyUnicode_IsXidStart( + Py_UCS4 ch /* Unicode character */ + ); + +PyAPI_FUNC(int) _PyUnicode_IsXidContinue( + Py_UCS4 ch /* Unicode character */ + ); + +PyAPI_FUNC(int) _PyUnicode_IsWhitespace( + const Py_UCS4 ch /* Unicode character */ + ); + +PyAPI_FUNC(int) _PyUnicode_IsLinebreak( + const Py_UCS4 ch /* Unicode character */ + ); + +PyAPI_FUNC(Py_UCS4) _PyUnicode_ToLowercase( + Py_UCS4 ch /* Unicode character */ + ) /* Py_DEPRECATED(3.3) */; + +PyAPI_FUNC(Py_UCS4) _PyUnicode_ToUppercase( + Py_UCS4 ch /* Unicode character */ + ) /* Py_DEPRECATED(3.3) */; + +PyAPI_FUNC(Py_UCS4) _PyUnicode_ToTitlecase( + Py_UCS4 ch /* Unicode character */ + ) Py_DEPRECATED(3.3); + +PyAPI_FUNC(int) _PyUnicode_ToLowerFull( + Py_UCS4 ch, /* Unicode character */ + Py_UCS4 *res + ); + +PyAPI_FUNC(int) _PyUnicode_ToTitleFull( + Py_UCS4 ch, /* Unicode character */ + Py_UCS4 *res + ); + +PyAPI_FUNC(int) _PyUnicode_ToUpperFull( + Py_UCS4 ch, /* Unicode character */ + Py_UCS4 *res + ); + +PyAPI_FUNC(int) _PyUnicode_ToFoldedFull( + Py_UCS4 ch, /* Unicode character */ + Py_UCS4 *res + ); + +PyAPI_FUNC(int) _PyUnicode_IsCaseIgnorable( + Py_UCS4 ch /* Unicode character */ + ); + +PyAPI_FUNC(int) _PyUnicode_IsCased( + Py_UCS4 ch /* Unicode character */ + ); + +PyAPI_FUNC(int) _PyUnicode_ToDecimalDigit( + Py_UCS4 ch /* Unicode character */ + ); + +PyAPI_FUNC(int) _PyUnicode_ToDigit( + Py_UCS4 ch /* Unicode character */ + ); + +PyAPI_FUNC(double) _PyUnicode_ToNumeric( + Py_UCS4 ch /* Unicode character */ + ); + +PyAPI_FUNC(int) _PyUnicode_IsDecimalDigit( + Py_UCS4 ch /* Unicode character */ + ); + +PyAPI_FUNC(int) _PyUnicode_IsDigit( + Py_UCS4 ch /* Unicode character */ + ); + +PyAPI_FUNC(int) _PyUnicode_IsNumeric( + Py_UCS4 ch /* Unicode character */ + ); + +PyAPI_FUNC(int) _PyUnicode_IsPrintable( + Py_UCS4 ch /* Unicode character */ + ); + +PyAPI_FUNC(int) _PyUnicode_IsAlpha( + Py_UCS4 ch /* Unicode character */ + ); + +PyAPI_FUNC(size_t) Py_UNICODE_strlen( + const Py_UNICODE *u + ) Py_DEPRECATED(3.3); + +PyAPI_FUNC(Py_UNICODE*) Py_UNICODE_strcpy( + Py_UNICODE *s1, + const Py_UNICODE *s2) Py_DEPRECATED(3.3); + +PyAPI_FUNC(Py_UNICODE*) Py_UNICODE_strcat( + Py_UNICODE *s1, const Py_UNICODE *s2) Py_DEPRECATED(3.3); + +PyAPI_FUNC(Py_UNICODE*) Py_UNICODE_strncpy( + Py_UNICODE *s1, + const Py_UNICODE *s2, + size_t n) Py_DEPRECATED(3.3); + +PyAPI_FUNC(int) Py_UNICODE_strcmp( + const Py_UNICODE *s1, + const Py_UNICODE *s2 + ) Py_DEPRECATED(3.3); + +PyAPI_FUNC(int) Py_UNICODE_strncmp( + const Py_UNICODE *s1, + const Py_UNICODE *s2, + size_t n + ) Py_DEPRECATED(3.3); + +PyAPI_FUNC(Py_UNICODE*) Py_UNICODE_strchr( + const Py_UNICODE *s, + Py_UNICODE c + ) Py_DEPRECATED(3.3); + +PyAPI_FUNC(Py_UNICODE*) Py_UNICODE_strrchr( + const Py_UNICODE *s, + Py_UNICODE c + ) Py_DEPRECATED(3.3); + +PyAPI_FUNC(PyObject*) _PyUnicode_FormatLong(PyObject *, int, int, int); + +/* Create a copy of a unicode string ending with a nul character. Return NULL + and raise a MemoryError exception on memory allocation failure, otherwise + return a new allocated buffer (use PyMem_Free() to free the buffer). */ + +PyAPI_FUNC(Py_UNICODE*) PyUnicode_AsUnicodeCopy( + PyObject *unicode + ) Py_DEPRECATED(3.3); +#endif /* Py_LIMITED_API */ + +#if defined(Py_DEBUG) && !defined(Py_LIMITED_API) +PyAPI_FUNC(int) _PyUnicode_CheckConsistency( + PyObject *op, + int check_content); +#elif !defined(NDEBUG) +/* For asserts that call _PyUnicode_CheckConsistency(), which would + * otherwise be a problem when building with asserts but without Py_DEBUG. */ +#define _PyUnicode_CheckConsistency(op, check_content) PyUnicode_Check(op) +#endif + +#ifndef Py_LIMITED_API +/* Return an interned Unicode object for an Identifier; may fail if there is no memory.*/ +PyAPI_FUNC(PyObject*) _PyUnicode_FromId(_Py_Identifier*); +/* Clear all static strings. */ +PyAPI_FUNC(void) _PyUnicode_ClearStaticStrings(void); + +/* Fast equality check when the inputs are known to be exact unicode types + and where the hash values are equal (i.e. a very probable match) */ +PyAPI_FUNC(int) _PyUnicode_EQ(PyObject *, PyObject *); +#endif /* !Py_LIMITED_API */ + +#ifdef __cplusplus +} +#endif +#endif /* !Py_UNICODEOBJECT_H */ diff --git a/env/Include/warnings.h b/env/Include/warnings.h new file mode 100644 index 0000000..a675bb5 --- /dev/null +++ b/env/Include/warnings.h @@ -0,0 +1,67 @@ +#ifndef Py_WARNINGS_H +#define Py_WARNINGS_H +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef Py_LIMITED_API +PyAPI_FUNC(PyObject*) _PyWarnings_Init(void); +#endif + +PyAPI_FUNC(int) PyErr_WarnEx( + PyObject *category, + const char *message, /* UTF-8 encoded string */ + Py_ssize_t stack_level); +PyAPI_FUNC(int) PyErr_WarnFormat( + PyObject *category, + Py_ssize_t stack_level, + const char *format, /* ASCII-encoded string */ + ...); + +#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03060000 +/* Emit a ResourceWarning warning */ +PyAPI_FUNC(int) PyErr_ResourceWarning( + PyObject *source, + Py_ssize_t stack_level, + const char *format, /* ASCII-encoded string */ + ...); +#endif +#ifndef Py_LIMITED_API +PyAPI_FUNC(int) PyErr_WarnExplicitObject( + PyObject *category, + PyObject *message, + PyObject *filename, + int lineno, + PyObject *module, + PyObject *registry); +#endif +PyAPI_FUNC(int) PyErr_WarnExplicit( + PyObject *category, + const char *message, /* UTF-8 encoded string */ + const char *filename, /* decoded from the filesystem encoding */ + int lineno, + const char *module, /* UTF-8 encoded string */ + PyObject *registry); + +#ifndef Py_LIMITED_API +PyAPI_FUNC(int) +PyErr_WarnExplicitFormat(PyObject *category, + const char *filename, int lineno, + const char *module, PyObject *registry, + const char *format, ...); +#endif + +/* DEPRECATED: Use PyErr_WarnEx() instead. */ +#ifndef Py_LIMITED_API +#define PyErr_Warn(category, msg) PyErr_WarnEx(category, msg, 1) +#endif + +#ifndef Py_LIMITED_API +void _PyErr_WarnUnawaitedCoroutine(PyObject *coro); +#endif + +#ifdef __cplusplus +} +#endif +#endif /* !Py_WARNINGS_H */ + diff --git a/env/Include/weakrefobject.h b/env/Include/weakrefobject.h new file mode 100644 index 0000000..1705156 --- /dev/null +++ b/env/Include/weakrefobject.h @@ -0,0 +1,86 @@ +/* Weak references objects for Python. */ + +#ifndef Py_WEAKREFOBJECT_H +#define Py_WEAKREFOBJECT_H +#ifdef __cplusplus +extern "C" { +#endif + + +typedef struct _PyWeakReference PyWeakReference; + +/* PyWeakReference is the base struct for the Python ReferenceType, ProxyType, + * and CallableProxyType. + */ +#ifndef Py_LIMITED_API +struct _PyWeakReference { + PyObject_HEAD + + /* The object to which this is a weak reference, or Py_None if none. + * Note that this is a stealth reference: wr_object's refcount is + * not incremented to reflect this pointer. + */ + PyObject *wr_object; + + /* A callable to invoke when wr_object dies, or NULL if none. */ + PyObject *wr_callback; + + /* A cache for wr_object's hash code. As usual for hashes, this is -1 + * if the hash code isn't known yet. + */ + Py_hash_t hash; + + /* If wr_object is weakly referenced, wr_object has a doubly-linked NULL- + * terminated list of weak references to it. These are the list pointers. + * If wr_object goes away, wr_object is set to Py_None, and these pointers + * have no meaning then. + */ + PyWeakReference *wr_prev; + PyWeakReference *wr_next; +}; +#endif + +PyAPI_DATA(PyTypeObject) _PyWeakref_RefType; +PyAPI_DATA(PyTypeObject) _PyWeakref_ProxyType; +PyAPI_DATA(PyTypeObject) _PyWeakref_CallableProxyType; + +#define PyWeakref_CheckRef(op) PyObject_TypeCheck(op, &_PyWeakref_RefType) +#define PyWeakref_CheckRefExact(op) \ + (Py_TYPE(op) == &_PyWeakref_RefType) +#define PyWeakref_CheckProxy(op) \ + ((Py_TYPE(op) == &_PyWeakref_ProxyType) || \ + (Py_TYPE(op) == &_PyWeakref_CallableProxyType)) + +#define PyWeakref_Check(op) \ + (PyWeakref_CheckRef(op) || PyWeakref_CheckProxy(op)) + + +PyAPI_FUNC(PyObject *) PyWeakref_NewRef(PyObject *ob, + PyObject *callback); +PyAPI_FUNC(PyObject *) PyWeakref_NewProxy(PyObject *ob, + PyObject *callback); +PyAPI_FUNC(PyObject *) PyWeakref_GetObject(PyObject *ref); + +#ifndef Py_LIMITED_API +PyAPI_FUNC(Py_ssize_t) _PyWeakref_GetWeakrefCount(PyWeakReference *head); + +PyAPI_FUNC(void) _PyWeakref_ClearRef(PyWeakReference *self); +#endif + +/* Explanation for the Py_REFCNT() check: when a weakref's target is part + of a long chain of deallocations which triggers the trashcan mechanism, + clearing the weakrefs can be delayed long after the target's refcount + has dropped to zero. In the meantime, code accessing the weakref will + be able to "see" the target object even though it is supposed to be + unreachable. See issue #16602. */ + +#define PyWeakref_GET_OBJECT(ref) \ + (Py_REFCNT(((PyWeakReference *)(ref))->wr_object) > 0 \ + ? ((PyWeakReference *)(ref))->wr_object \ + : Py_None) + + +#ifdef __cplusplus +} +#endif +#endif /* !Py_WEAKREFOBJECT_H */ diff --git a/env/LICENSE.txt b/env/LICENSE.txt new file mode 100644 index 0000000..43fe0d6 --- /dev/null +++ b/env/LICENSE.txt @@ -0,0 +1,603 @@ +A. HISTORY OF THE SOFTWARE +========================== + +Python was created in the early 1990s by Guido van Rossum at Stichting +Mathematisch Centrum (CWI, see http://www.cwi.nl) in the Netherlands +as a successor of a language called ABC. Guido remains Python's +principal author, although it includes many contributions from others. + +In 1995, Guido continued his work on Python at the Corporation for +National Research Initiatives (CNRI, see http://www.cnri.reston.va.us) +in Reston, Virginia where he released several versions of the +software. + +In May 2000, Guido and the Python core development team moved to +BeOpen.com to form the BeOpen PythonLabs team. In October of the same +year, the PythonLabs team moved to Digital Creations, which became +Zope Corporation. In 2001, the Python Software Foundation (PSF, see +https://www.python.org/psf/) was formed, a non-profit organization +created specifically to own Python-related Intellectual Property. +Zope Corporation was a sponsoring member of the PSF. + +All Python releases are Open Source (see http://www.opensource.org for +the Open Source Definition). Historically, most, but not all, Python +releases have also been GPL-compatible; the table below summarizes +the various releases. + + Release Derived Year Owner GPL- + from compatible? (1) + + 0.9.0 thru 1.2 1991-1995 CWI yes + 1.3 thru 1.5.2 1.2 1995-1999 CNRI yes + 1.6 1.5.2 2000 CNRI no + 2.0 1.6 2000 BeOpen.com no + 1.6.1 1.6 2001 CNRI yes (2) + 2.1 2.0+1.6.1 2001 PSF no + 2.0.1 2.0+1.6.1 2001 PSF yes + 2.1.1 2.1+2.0.1 2001 PSF yes + 2.1.2 2.1.1 2002 PSF yes + 2.1.3 2.1.2 2002 PSF yes + 2.2 and above 2.1.1 2001-now PSF yes + +Footnotes: + +(1) GPL-compatible doesn't mean that we're distributing Python under + the GPL. All Python licenses, unlike the GPL, let you distribute + a modified version without making your changes open source. The + GPL-compatible licenses make it possible to combine Python with + other software that is released under the GPL; the others don't. + +(2) According to Richard Stallman, 1.6.1 is not GPL-compatible, + because its license has a choice of law clause. According to + CNRI, however, Stallman's lawyer has told CNRI's lawyer that 1.6.1 + is "not incompatible" with the GPL. + +Thanks to the many outside volunteers who have worked under Guido's +direction to make these releases possible. + + +B. TERMS AND CONDITIONS FOR ACCESSING OR OTHERWISE USING PYTHON +=============================================================== + +PYTHON SOFTWARE FOUNDATION LICENSE VERSION 2 +-------------------------------------------- + +1. This LICENSE AGREEMENT is between the Python Software Foundation +("PSF"), and the Individual or Organization ("Licensee") accessing and +otherwise using this software ("Python") in source or binary form and +its associated documentation. + +2. Subject to the terms and conditions of this License Agreement, PSF hereby +grants Licensee a nonexclusive, royalty-free, world-wide license to reproduce, +analyze, test, perform and/or display publicly, prepare derivative works, +distribute, and otherwise use Python alone or in any derivative version, +provided, however, that PSF's License Agreement and PSF's notice of copyright, +i.e., "Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, +2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019 Python Software Foundation; +All Rights Reserved" are retained in Python alone or in any derivative version +prepared by Licensee. + +3. In the event Licensee prepares a derivative work that is based on +or incorporates Python or any part thereof, and wants to make +the derivative work available to others as provided herein, then +Licensee hereby agrees to include in any such work a brief summary of +the changes made to Python. + +4. PSF is making Python available to Licensee on an "AS IS" +basis. PSF MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR +IMPLIED. BY WAY OF EXAMPLE, BUT NOT LIMITATION, PSF MAKES NO AND +DISCLAIMS ANY REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS +FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF PYTHON WILL NOT +INFRINGE ANY THIRD PARTY RIGHTS. + +5. PSF SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF PYTHON +FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS AS +A RESULT OF MODIFYING, DISTRIBUTING, OR OTHERWISE USING PYTHON, +OR ANY DERIVATIVE THEREOF, EVEN IF ADVISED OF THE POSSIBILITY THEREOF. + +6. This License Agreement will automatically terminate upon a material +breach of its terms and conditions. + +7. Nothing in this License Agreement shall be deemed to create any +relationship of agency, partnership, or joint venture between PSF and +Licensee. This License Agreement does not grant permission to use PSF +trademarks or trade name in a trademark sense to endorse or promote +products or services of Licensee, or any third party. + +8. By copying, installing or otherwise using Python, Licensee +agrees to be bound by the terms and conditions of this License +Agreement. + + +BEOPEN.COM LICENSE AGREEMENT FOR PYTHON 2.0 +------------------------------------------- + +BEOPEN PYTHON OPEN SOURCE LICENSE AGREEMENT VERSION 1 + +1. This LICENSE AGREEMENT is between BeOpen.com ("BeOpen"), having an +office at 160 Saratoga Avenue, Santa Clara, CA 95051, and the +Individual or Organization ("Licensee") accessing and otherwise using +this software in source or binary form and its associated +documentation ("the Software"). + +2. Subject to the terms and conditions of this BeOpen Python License +Agreement, BeOpen hereby grants Licensee a non-exclusive, +royalty-free, world-wide license to reproduce, analyze, test, perform +and/or display publicly, prepare derivative works, distribute, and +otherwise use the Software alone or in any derivative version, +provided, however, that the BeOpen Python License is retained in the +Software, alone or in any derivative version prepared by Licensee. + +3. BeOpen is making the Software available to Licensee on an "AS IS" +basis. BEOPEN MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR +IMPLIED. BY WAY OF EXAMPLE, BUT NOT LIMITATION, BEOPEN MAKES NO AND +DISCLAIMS ANY REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS +FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF THE SOFTWARE WILL NOT +INFRINGE ANY THIRD PARTY RIGHTS. + +4. BEOPEN SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF THE +SOFTWARE FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS +AS A RESULT OF USING, MODIFYING OR DISTRIBUTING THE SOFTWARE, OR ANY +DERIVATIVE THEREOF, EVEN IF ADVISED OF THE POSSIBILITY THEREOF. + +5. This License Agreement will automatically terminate upon a material +breach of its terms and conditions. + +6. This License Agreement shall be governed by and interpreted in all +respects by the law of the State of California, excluding conflict of +law provisions. Nothing in this License Agreement shall be deemed to +create any relationship of agency, partnership, or joint venture +between BeOpen and Licensee. This License Agreement does not grant +permission to use BeOpen trademarks or trade names in a trademark +sense to endorse or promote products or services of Licensee, or any +third party. As an exception, the "BeOpen Python" logos available at +http://www.pythonlabs.com/logos.html may be used according to the +permissions granted on that web page. + +7. By copying, installing or otherwise using the software, Licensee +agrees to be bound by the terms and conditions of this License +Agreement. + + +CNRI LICENSE AGREEMENT FOR PYTHON 1.6.1 +--------------------------------------- + +1. This LICENSE AGREEMENT is between the Corporation for National +Research Initiatives, having an office at 1895 Preston White Drive, +Reston, VA 20191 ("CNRI"), and the Individual or Organization +("Licensee") accessing and otherwise using Python 1.6.1 software in +source or binary form and its associated documentation. + +2. Subject to the terms and conditions of this License Agreement, CNRI +hereby grants Licensee a nonexclusive, royalty-free, world-wide +license to reproduce, analyze, test, perform and/or display publicly, +prepare derivative works, distribute, and otherwise use Python 1.6.1 +alone or in any derivative version, provided, however, that CNRI's +License Agreement and CNRI's notice of copyright, i.e., "Copyright (c) +1995-2001 Corporation for National Research Initiatives; All Rights +Reserved" are retained in Python 1.6.1 alone or in any derivative +version prepared by Licensee. Alternately, in lieu of CNRI's License +Agreement, Licensee may substitute the following text (omitting the +quotes): "Python 1.6.1 is made available subject to the terms and +conditions in CNRI's License Agreement. This Agreement together with +Python 1.6.1 may be located on the Internet using the following +unique, persistent identifier (known as a handle): 1895.22/1013. This +Agreement may also be obtained from a proxy server on the Internet +using the following URL: http://hdl.handle.net/1895.22/1013". + +3. In the event Licensee prepares a derivative work that is based on +or incorporates Python 1.6.1 or any part thereof, and wants to make +the derivative work available to others as provided herein, then +Licensee hereby agrees to include in any such work a brief summary of +the changes made to Python 1.6.1. + +4. CNRI is making Python 1.6.1 available to Licensee on an "AS IS" +basis. CNRI MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR +IMPLIED. BY WAY OF EXAMPLE, BUT NOT LIMITATION, CNRI MAKES NO AND +DISCLAIMS ANY REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS +FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF PYTHON 1.6.1 WILL NOT +INFRINGE ANY THIRD PARTY RIGHTS. + +5. CNRI SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF PYTHON +1.6.1 FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS AS +A RESULT OF MODIFYING, DISTRIBUTING, OR OTHERWISE USING PYTHON 1.6.1, +OR ANY DERIVATIVE THEREOF, EVEN IF ADVISED OF THE POSSIBILITY THEREOF. + +6. This License Agreement will automatically terminate upon a material +breach of its terms and conditions. + +7. This License Agreement shall be governed by the federal +intellectual property law of the United States, including without +limitation the federal copyright law, and, to the extent such +U.S. federal law does not apply, by the law of the Commonwealth of +Virginia, excluding Virginia's conflict of law provisions. +Notwithstanding the foregoing, with regard to derivative works based +on Python 1.6.1 that incorporate non-separable material that was +previously distributed under the GNU General Public License (GPL), the +law of the Commonwealth of Virginia shall govern this License +Agreement only as to issues arising under or with respect to +Paragraphs 4, 5, and 7 of this License Agreement. Nothing in this +License Agreement shall be deemed to create any relationship of +agency, partnership, or joint venture between CNRI and Licensee. This +License Agreement does not grant permission to use CNRI trademarks or +trade name in a trademark sense to endorse or promote products or +services of Licensee, or any third party. + +8. By clicking on the "ACCEPT" button where indicated, or by copying, +installing or otherwise using Python 1.6.1, Licensee agrees to be +bound by the terms and conditions of this License Agreement. + + ACCEPT + + +CWI LICENSE AGREEMENT FOR PYTHON 0.9.0 THROUGH 1.2 +-------------------------------------------------- + +Copyright (c) 1991 - 1995, Stichting Mathematisch Centrum Amsterdam, +The Netherlands. All rights reserved. + +Permission to use, copy, modify, and distribute this software and its +documentation for any purpose and without fee is hereby granted, +provided that the above copyright notice appear in all copies and that +both that copyright notice and this permission notice appear in +supporting documentation, and that the name of Stichting Mathematisch +Centrum or CWI not be used in advertising or publicity pertaining to +distribution of the software without specific, written prior +permission. + +STICHTING MATHEMATISCH CENTRUM DISCLAIMS ALL WARRANTIES WITH REGARD TO +THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND +FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH CENTRUM BE LIABLE +FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT +OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + + + +Additional Conditions for this Windows binary build +--------------------------------------------------- + +This program is linked with and uses Microsoft Distributable Code, +copyrighted by Microsoft Corporation. The Microsoft Distributable Code +is embedded in each .exe, .dll and .pyd file as a result of running +the code through a linker. + +If you further distribute programs that include the Microsoft +Distributable Code, you must comply with the restrictions on +distribution specified by Microsoft. In particular, you must require +distributors and external end users to agree to terms that protect the +Microsoft Distributable Code at least as much as Microsoft's own +requirements for the Distributable Code. See Microsoft's documentation +(included in its developer tools and on its website at microsoft.com) +for specific details. + +Redistribution of the Windows binary build of the Python interpreter +complies with this agreement, provided that you do not: + +- alter any copyright, trademark or patent notice in Microsoft's +Distributable Code; + +- use Microsoft's trademarks in your programs' names or in a way that +suggests your programs come from or are endorsed by Microsoft; + +- distribute Microsoft's Distributable Code to run on a platform other +than Microsoft operating systems, run-time technologies or application +platforms; or + +- include Microsoft Distributable Code in malicious, deceptive or +unlawful programs. + +These restrictions apply only to the Microsoft Distributable Code as +defined above, not to Python itself or any programs running on the +Python interpreter. The redistribution of the Python interpreter and +libraries is governed by the Python Software License included with this +file, or by other licenses as marked. + + + +-------------------------------------------------------------------------- + +This program, "bzip2", the associated library "libbzip2", and all +documentation, are copyright (C) 1996-2010 Julian R Seward. All +rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: + +1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + +2. The origin of this software must not be misrepresented; you must + not claim that you wrote the original software. If you use this + software in a product, an acknowledgment in the product + documentation would be appreciated but is not required. + +3. Altered source versions must be plainly marked as such, and must + not be misrepresented as being the original software. + +4. The name of the author may not be used to endorse or promote + products derived from this software without specific prior written + permission. + +THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS +OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +Julian Seward, jseward@bzip.org +bzip2/libbzip2 version 1.0.6 of 6 September 2010 + +-------------------------------------------------------------------------- + + + LICENSE ISSUES + ============== + + The OpenSSL toolkit stays under a double license, i.e. both the conditions of + the OpenSSL License and the original SSLeay license apply to the toolkit. + See below for the actual license texts. + + OpenSSL License + --------------- + +/* ==================================================================== + * Copyright (c) 1998-2019 The OpenSSL Project. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. All advertising materials mentioning features or use of this + * software must display the following acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit. (http://www.openssl.org/)" + * + * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to + * endorse or promote products derived from this software without + * prior written permission. For written permission, please contact + * openssl-core@openssl.org. + * + * 5. Products derived from this software may not be called "OpenSSL" + * nor may "OpenSSL" appear in their names without prior written + * permission of the OpenSSL Project. + * + * 6. Redistributions of any form whatsoever must retain the following + * acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit (http://www.openssl.org/)" + * + * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY + * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * ==================================================================== + * + * This product includes cryptographic software written by Eric Young + * (eay@cryptsoft.com). This product includes software written by Tim + * Hudson (tjh@cryptsoft.com). + * + */ + + Original SSLeay License + ----------------------- + +/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) + * All rights reserved. + * + * This package is an SSL implementation written + * by Eric Young (eay@cryptsoft.com). + * The implementation was written so as to conform with Netscapes SSL. + * + * This library is free for commercial and non-commercial use as long as + * the following conditions are aheared to. The following conditions + * apply to all code found in this distribution, be it the RC4, RSA, + * lhash, DES, etc., code; not just the SSL code. The SSL documentation + * included with this distribution is covered by the same copyright terms + * except that the holder is Tim Hudson (tjh@cryptsoft.com). + * + * Copyright remains Eric Young's, and as such any Copyright notices in + * the code are not to be removed. + * If this package is used in a product, Eric Young should be given attribution + * as the author of the parts of the library used. + * This can be in the form of a textual message at program startup or + * in documentation (online or textual) provided with the package. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * "This product includes cryptographic software written by + * Eric Young (eay@cryptsoft.com)" + * The word 'cryptographic' can be left out if the rouines from the library + * being used are not cryptographic related :-). + * 4. If you include any Windows specific code (or a derivative thereof) from + * the apps directory (application code) you must include an acknowledgement: + * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" + * + * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * The licence and distribution terms for any publically available version or + * derivative of this code cannot be changed. i.e. this code cannot simply be + * copied and put under another distribution licence + * [including the GNU Public Licence.] + */ + + +This software is copyrighted by the Regents of the University of +California, Sun Microsystems, Inc., Scriptics Corporation, ActiveState +Corporation and other parties. The following terms apply to all files +associated with the software unless explicitly disclaimed in +individual files. + +The authors hereby grant permission to use, copy, modify, distribute, +and license this software and its documentation for any purpose, provided +that existing copyright notices are retained in all copies and that this +notice is included verbatim in any distributions. No written agreement, +license, or royalty fee is required for any of the authorized uses. +Modifications to this software may be copyrighted by their authors +and need not follow the licensing terms described here, provided that +the new terms are clearly indicated on the first page of each file where +they apply. + +IN NO EVENT SHALL THE AUTHORS OR DISTRIBUTORS BE LIABLE TO ANY PARTY +FOR DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES +ARISING OUT OF THE USE OF THIS SOFTWARE, ITS DOCUMENTATION, OR ANY +DERIVATIVES THEREOF, EVEN IF THE AUTHORS HAVE BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. + +THE AUTHORS AND DISTRIBUTORS SPECIFICALLY DISCLAIM ANY WARRANTIES, +INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE, AND NON-INFRINGEMENT. THIS SOFTWARE +IS PROVIDED ON AN "AS IS" BASIS, AND THE AUTHORS AND DISTRIBUTORS HAVE +NO OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR +MODIFICATIONS. + +GOVERNMENT USE: If you are acquiring this software on behalf of the +U.S. government, the Government shall have only "Restricted Rights" +in the software and related documentation as defined in the Federal +Acquisition Regulations (FARs) in Clause 52.227.19 (c) (2). If you +are acquiring the software on behalf of the Department of Defense, the +software shall be classified as "Commercial Computer Software" and the +Government shall have only "Restricted Rights" as defined in Clause +252.227-7014 (b) (3) of DFARs. Notwithstanding the foregoing, the +authors grant the U.S. Government and others acting in its behalf +permission to use and distribute the software in accordance with the +terms specified in this license. + +This software is copyrighted by the Regents of the University of +California, Sun Microsystems, Inc., Scriptics Corporation, ActiveState +Corporation, Apple Inc. and other parties. The following terms apply to +all files associated with the software unless explicitly disclaimed in +individual files. + +The authors hereby grant permission to use, copy, modify, distribute, +and license this software and its documentation for any purpose, provided +that existing copyright notices are retained in all copies and that this +notice is included verbatim in any distributions. No written agreement, +license, or royalty fee is required for any of the authorized uses. +Modifications to this software may be copyrighted by their authors +and need not follow the licensing terms described here, provided that +the new terms are clearly indicated on the first page of each file where +they apply. + +IN NO EVENT SHALL THE AUTHORS OR DISTRIBUTORS BE LIABLE TO ANY PARTY +FOR DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES +ARISING OUT OF THE USE OF THIS SOFTWARE, ITS DOCUMENTATION, OR ANY +DERIVATIVES THEREOF, EVEN IF THE AUTHORS HAVE BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. + +THE AUTHORS AND DISTRIBUTORS SPECIFICALLY DISCLAIM ANY WARRANTIES, +INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE, AND NON-INFRINGEMENT. THIS SOFTWARE +IS PROVIDED ON AN "AS IS" BASIS, AND THE AUTHORS AND DISTRIBUTORS HAVE +NO OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR +MODIFICATIONS. + +GOVERNMENT USE: If you are acquiring this software on behalf of the +U.S. government, the Government shall have only "Restricted Rights" +in the software and related documentation as defined in the Federal +Acquisition Regulations (FARs) in Clause 52.227.19 (c) (2). If you +are acquiring the software on behalf of the Department of Defense, the +software shall be classified as "Commercial Computer Software" and the +Government shall have only "Restricted Rights" as defined in Clause +252.227-7013 (b) (3) of DFARs. Notwithstanding the foregoing, the +authors grant the U.S. Government and others acting in its behalf +permission to use and distribute the software in accordance with the +terms specified in this license. + +Copyright (c) 1993-1999 Ioi Kim Lam. +Copyright (c) 2000-2001 Tix Project Group. +Copyright (c) 2004 ActiveState + +This software is copyrighted by the above entities +and other parties. The following terms apply to all files associated +with the software unless explicitly disclaimed in individual files. + +The authors hereby grant permission to use, copy, modify, distribute, +and license this software and its documentation for any purpose, provided +that existing copyright notices are retained in all copies and that this +notice is included verbatim in any distributions. No written agreement, +license, or royalty fee is required for any of the authorized uses. +Modifications to this software may be copyrighted by their authors +and need not follow the licensing terms described here, provided that +the new terms are clearly indicated on the first page of each file where +they apply. + +IN NO EVENT SHALL THE AUTHORS OR DISTRIBUTORS BE LIABLE TO ANY PARTY +FOR DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES +ARISING OUT OF THE USE OF THIS SOFTWARE, ITS DOCUMENTATION, OR ANY +DERIVATIVES THEREOF, EVEN IF THE AUTHORS HAVE BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. + +THE AUTHORS AND DISTRIBUTORS SPECIFICALLY DISCLAIM ANY WARRANTIES, +INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE, AND NON-INFRINGEMENT. THIS SOFTWARE +IS PROVIDED ON AN "AS IS" BASIS, AND THE AUTHORS AND DISTRIBUTORS HAVE +NO OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR +MODIFICATIONS. + +GOVERNMENT USE: If you are acquiring this software on behalf of the +U.S. government, the Government shall have only "Restricted Rights" +in the software and related documentation as defined in the Federal +Acquisition Regulations (FARs) in Clause 52.227.19 (c) (2). If you +are acquiring the software on behalf of the Department of Defense, the +software shall be classified as "Commercial Computer Software" and the +Government shall have only "Restricted Rights" as defined in Clause +252.227-7013 (c) (1) of DFARs. Notwithstanding the foregoing, the +authors grant the U.S. Government and others acting in its behalf +permission to use and distribute the software in accordance with the +terms specified in this license. + +---------------------------------------------------------------------- + +Parts of this software are based on the Tcl/Tk software copyrighted by +the Regents of the University of California, Sun Microsystems, Inc., +and other parties. The original license terms of the Tcl/Tk software +distribution is included in the file docs/license.tcltk. + +Parts of this software are based on the HTML Library software +copyrighted by Sun Microsystems, Inc. The original license terms of +the HTML Library software distribution is included in the file +docs/license.html_lib. + diff --git a/env/Lib/__future__.py b/env/Lib/__future__.py new file mode 100644 index 0000000..ce8bed7 --- /dev/null +++ b/env/Lib/__future__.py @@ -0,0 +1,146 @@ +"""Record of phased-in incompatible language changes. + +Each line is of the form: + + FeatureName = "_Feature(" OptionalRelease "," MandatoryRelease "," + CompilerFlag ")" + +where, normally, OptionalRelease < MandatoryRelease, and both are 5-tuples +of the same form as sys.version_info: + + (PY_MAJOR_VERSION, # the 2 in 2.1.0a3; an int + PY_MINOR_VERSION, # the 1; an int + PY_MICRO_VERSION, # the 0; an int + PY_RELEASE_LEVEL, # "alpha", "beta", "candidate" or "final"; string + PY_RELEASE_SERIAL # the 3; an int + ) + +OptionalRelease records the first release in which + + from __future__ import FeatureName + +was accepted. + +In the case of MandatoryReleases that have not yet occurred, +MandatoryRelease predicts the release in which the feature will become part +of the language. + +Else MandatoryRelease records when the feature became part of the language; +in releases at or after that, modules no longer need + + from __future__ import FeatureName + +to use the feature in question, but may continue to use such imports. + +MandatoryRelease may also be None, meaning that a planned feature got +dropped. + +Instances of class _Feature have two corresponding methods, +.getOptionalRelease() and .getMandatoryRelease(). + +CompilerFlag is the (bitfield) flag that should be passed in the fourth +argument to the builtin function compile() to enable the feature in +dynamically compiled code. This flag is stored in the .compiler_flag +attribute on _Future instances. These values must match the appropriate +#defines of CO_xxx flags in Include/compile.h. + +No feature line is ever to be deleted from this file. +""" + +all_feature_names = [ + "nested_scopes", + "generators", + "division", + "absolute_import", + "with_statement", + "print_function", + "unicode_literals", + "barry_as_FLUFL", + "generator_stop", + "annotations", +] + +__all__ = ["all_feature_names"] + all_feature_names + +# The CO_xxx symbols are defined here under the same names defined in +# code.h and used by compile.h, so that an editor search will find them here. +# However, they're not exported in __all__, because they don't really belong to +# this module. +CO_NESTED = 0x0010 # nested_scopes +CO_GENERATOR_ALLOWED = 0 # generators (obsolete, was 0x1000) +CO_FUTURE_DIVISION = 0x2000 # division +CO_FUTURE_ABSOLUTE_IMPORT = 0x4000 # perform absolute imports by default +CO_FUTURE_WITH_STATEMENT = 0x8000 # with statement +CO_FUTURE_PRINT_FUNCTION = 0x10000 # print function +CO_FUTURE_UNICODE_LITERALS = 0x20000 # unicode string literals +CO_FUTURE_BARRY_AS_BDFL = 0x40000 +CO_FUTURE_GENERATOR_STOP = 0x80000 # StopIteration becomes RuntimeError in generators +CO_FUTURE_ANNOTATIONS = 0x100000 # annotations become strings at runtime + +class _Feature: + def __init__(self, optionalRelease, mandatoryRelease, compiler_flag): + self.optional = optionalRelease + self.mandatory = mandatoryRelease + self.compiler_flag = compiler_flag + + def getOptionalRelease(self): + """Return first release in which this feature was recognized. + + This is a 5-tuple, of the same form as sys.version_info. + """ + + return self.optional + + def getMandatoryRelease(self): + """Return release in which this feature will become mandatory. + + This is a 5-tuple, of the same form as sys.version_info, or, if + the feature was dropped, is None. + """ + + return self.mandatory + + def __repr__(self): + return "_Feature" + repr((self.optional, + self.mandatory, + self.compiler_flag)) + +nested_scopes = _Feature((2, 1, 0, "beta", 1), + (2, 2, 0, "alpha", 0), + CO_NESTED) + +generators = _Feature((2, 2, 0, "alpha", 1), + (2, 3, 0, "final", 0), + CO_GENERATOR_ALLOWED) + +division = _Feature((2, 2, 0, "alpha", 2), + (3, 0, 0, "alpha", 0), + CO_FUTURE_DIVISION) + +absolute_import = _Feature((2, 5, 0, "alpha", 1), + (3, 0, 0, "alpha", 0), + CO_FUTURE_ABSOLUTE_IMPORT) + +with_statement = _Feature((2, 5, 0, "alpha", 1), + (2, 6, 0, "alpha", 0), + CO_FUTURE_WITH_STATEMENT) + +print_function = _Feature((2, 6, 0, "alpha", 2), + (3, 0, 0, "alpha", 0), + CO_FUTURE_PRINT_FUNCTION) + +unicode_literals = _Feature((2, 6, 0, "alpha", 2), + (3, 0, 0, "alpha", 0), + CO_FUTURE_UNICODE_LITERALS) + +barry_as_FLUFL = _Feature((3, 1, 0, "alpha", 2), + (3, 9, 0, "alpha", 0), + CO_FUTURE_BARRY_AS_BDFL) + +generator_stop = _Feature((3, 5, 0, "beta", 1), + (3, 7, 0, "alpha", 0), + CO_FUTURE_GENERATOR_STOP) + +annotations = _Feature((3, 7, 0, "beta", 1), + (4, 0, 0, "alpha", 0), + CO_FUTURE_ANNOTATIONS) diff --git a/env/Lib/__pycache__/__future__.cpython-37.pyc b/env/Lib/__pycache__/__future__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2b0eacde91844af36f6bba43610e684e974c701a GIT binary patch literal 4141 zcmbtXTW=f36<%H>QEThstL(%{CUlyL0L?ln`VyywC7DWC(4rO$eIYqJV zEQt+gS!_Bh;)YWaH=R{+%dy36=bE_VT>r`vcg5BZme_iich=;ZxF_z*!n=aA4*Wgw zzAOUY0RBLHAeVq|0{;;BGVmJ)|46O?zX_aSy#)MLimw8{4g6zKmNxJ^z#ocFY8oWxi?~gA4=wHIvI~78$@dSg>5rD`;x~~C0l$f+3#7|O@D8fS$h)uQOJXi3?ziH za<$B!^HA_OQb!Amh7Ga0`q_haejwF;z=y0{Dckm&kyNtELMXw5;HY{@(wCRyR2c-b zeiV-wSCakiQ9PXlQroFLnzSdQ7}rc6>Dp_lG?aJ!a1f=2Zol}}eZKR@cE^2L?{pjO zR+T+8&iEWIWS`eQt3BqweF8c787DT;iAL-4iO;Usw%2K2Wc>KjwobiS-|5!fX8mQo zN%G4)KqSjmR_@E#ygeA|!^g7BBE`xB9}y@&VLDcRIGn4MG3wSkjh$v{$a(E6wtX>z z%A}7@QovU_W-5&>Jn&}Zd!r;L1}Yje*BwkLGhCPX<4L6A#Z*BM;c4!9auQ2{ENg^@ zt4E1~pj^xolF4H>;;$v*9`qKm`y$r%NI-UmzJ1)dwj@Fr#cDW?8vp%%0frQ>qTE2VF5fh@~>tRoOTa zQ)DG9WI=@TQ!JEH{Bobh5t~9+Q=zFg5cvI6YO2I4>rZ1g=10tn!q^X|*qI#AQwT_U>G9n1zc;E zwTUF6@tX)bA(na)A$!4hEaOombk(j6WqctGw=1TYiE>fX?F!UC*D%nt$Q|2#KOXop z5EV9{K4P*-kD_USu0X-k=!R6sNq3v7cw}=moQ`D}lb2|@KlKB+jSZ%uNB)G$rZYhw z?2sX+272E2wm1s;*!QSSW!nW1A#05FMo`XZgSSRgJky|-vQ{q9Z62d~5j>Pe2-lgi zg0iVs4J(Pbzvcl#&Bjv{=9tHbDQUwe6GTG!XbJX1A<+<$KdMtwbt1N@9QXlQErlXv-LNAJaS=FEXnP&btoOi=pu=`XPeW|C)c@wkCH(?&er=} zsUw$bcfWbC-<++_1%XX8nO#FxM&Ji=dUgXraMJ{J5f!OVH!<-~@wI%55qL`AZv?Cy zfjogCff9jD%fsIJlLz(`UtI-|7A^>MHNfTJ2MgB&Tp;i^mk7L<=puplvRK71wr8cR z0K6g&(?f6KxQDO43viMVZf?~B6&jq!Kb>+T*tllnV&@(^jLzkAd_dL-ZS zF(&7s3|}7xe*f^S%hx7HFbfmYk6rgqWCbo9aO5&R$2T&2YuOGjM^rrYrmr!aj+|Jp zjG@PW???;~6x@}g2FXqJll5_o6KcuB&_6a!C%a6TD#J#e4gG4?m49~V*XFm9N=|J+ zE4*&vWt@}%TqLd8&CC7iCDt{C(po-#e{T2XeZRm1|4cn_#RyxpePM>pV~gtjKV1Mv zsVegab3Ti`jmCG{;ju@Xv2f03R9ipcvs+hm?!U~PwsQPn(PP4*q%!+jHQy&7YEU6D@*#JXZGM7WM?-Efl+PiS>v_K2VIdf_JxpO1~ zEI-bUn7s*0;*d%^rSL3}7Nt?4FOU{asZY+67G)8Kg;NWp)7A5&l%dh^;hgjlVW}EK zI$fEQScYYGeVQ$(g;S^0rV|ZF!kNjf%Dvf&>x#%j-dqETe$m8nomEWQR=wM+KXYya z{i@!ocXoRCSFqD;w!gvZO|0%8^bR_8_gUj*gZ^7M_s`aLcDwE7L9gyMp1){!dd|Hw z(l?FX*KW7B)2lzPx6V;sbQ-N5xVH9s#O}SbGY754Ui%sTLo|BOquF(~&S<+kozA!J zPS@Riw%=S7bf$E-*M8yLIXkk`YPF#Ngmg`cDwCU(rOITKahOR26LRBl%4=l;Mt{B+ t(%)2r>8qtLlOp=VW9-l)fMOw^yZBiy*vmx}<%Lgv{Xr3Xm-GJ%{4W}*VvPU* literal 0 HcmV?d00001 diff --git a/env/Lib/__pycache__/_bootlocale.cpython-37.pyc b/env/Lib/__pycache__/_bootlocale.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..909265723d389e974145301bb44dd30779ff2ab1 GIT binary patch literal 1258 zcmZ`&!EO{e5VhSsGo4OnU{`3hTu>tpOG|_UTJ53*Awm)k9N>^aETch9&y*+eq^I2~ zdw_|umxT{Wj{FVc*jG;c0w>Du1OfujxLj3jSG{^=-&c@GM#H!(6TTR(!!>yvJz{QBvWGxw2L~vs^+yuOB=>Ze>7M6+EvJaAiLOHSJGM%EHQ#6IJUQ?cBI?*6+IUqjA^A_LpQ-G>6 zRu*tM{z#0nhfVNORf7q41`W3gnwvDu?<6dn@tME`_zttg^f3c*kr5-o!-LM_!Tt4{ zAKjU((*$N|n$EN=c1^Rgu+y74Q6igO-U1l@lJ80ja#}1(+qyE|B%pKRvbEnbT%lN> zZg2iGdTb<`(O~D^XiJ)XtLqU(Hv8-2<+^-T%>w}_$%!!DnPBEs8uOn$nqN^Tw$JwkQ7HiCQgg?Kr@c+ zetNwX?jrlxzmZ}bk&J%{>CAwp4|$1{v)qCJRtEp^Lw*z%neuw8Gxr_tr>kp!zp!$n895Re7`=49t`z*itEKzi(KxLTEYSya2Kn(C&v`Dkl< zXM4~@by?V{#`#HMO&6u1i}Rz}E>jrOC*f*y-A#DE7xIh`zW!I}9_FAYdESC>sqs9C zCibt>yi|72Gl}P%x4&U6s`0`~kG$#a6{aB9nf#t**YGB~-9G+1t~bWDJ`{vRBs}Q| N9`inrgCsZ~eFpOpD7OFr literal 0 HcmV?d00001 diff --git a/env/Lib/__pycache__/_collections_abc.cpython-37.pyc b/env/Lib/__pycache__/_collections_abc.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..11fa23461aa4e3c1c39c20f00418c27776fa7466 GIT binary patch literal 28951 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 z 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 Ky4T9*_5T8rp7uQe literal 0 HcmV?d00001 diff --git a/env/Lib/__pycache__/bisect.cpython-37.pyc b/env/Lib/__pycache__/bisect.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..cfdcb5337124955829348daf16d12a90dc0d5472 GIT binary patch literal 2707 zcmds&&u`l{6vs(PRvg($Gc;|morvxdZHrO#QXuHMA?bhxC^DeQ*4A}l&?aqhrX-h? zQzuY>q1_*{9ry3-sOwHS47>NV_oUcq({|Xf76>Xs)YE(Pd;Iayms?9q0fFoH7oR?U z2-Y9?GP~+vd=0m4LnBC=h^BCb_cLu%u_S832g?!5VnNiwa>XUFC<3s&!=|93p=}qbpm=%6_KOgmFDgjmo0fwoafd+3kDy zfU5>K+S_nj0Zr}*IwEEzBf@!3pV8bE?x=29MsxC<9=p>Uxs$ul;~qZOi10ok$6gN6 z-20e-|J&R$_eoBEaiBN-)uBYVFgX9{ubsq7lQEUam`#~Vm{vAp z{0qht!A4S!A;fHIGAS6hb`q;($T(B>)Y%FG2G`C2|7~H0Msjh8i6DoXC1+X6vPd$c zhEc}S!P!fkLb>T_mhZ;6Ok6W=hL-7+tqVEe6P>Z^VL6~kow>A3)_EARUOIuHLiTbX zR;#|m3LIyk-d$b0r;|Uaoc#kW?r|fAYjl{*C@Ahjby`7tVgrdrLfUC_^ ziPoeaK?M#VYR$k2G(Fl>k6FYIB)s4Hl1(c@XYq1#`6IPC?{gcdVr&nFg=o&W=`t;=Mmv-uG*;e$-Vr#Az*Vs@Sr{6=0Bf(;UE5Qxw*s3-=d zC9IhRv{CiUA~vXurhyG&TQy5y70n9Cio>hmsW@!Bfx}A>eTBn!p ivRS_sr(&YzZLD8Prso8ggDb&maMgiBdzt#KNB;(7&AL7S literal 0 HcmV?d00001 diff --git a/env/Lib/__pycache__/codecs.cpython-37.pyc b/env/Lib/__pycache__/codecs.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..58a8804ea75ce23cbeacd856eb5c5d6bcc4e20fb GIT binary patch literal 34084 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 literal 0 HcmV?d00001 diff --git a/env/Lib/__pycache__/copyreg.cpython-37.pyc b/env/Lib/__pycache__/copyreg.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8aeb50880f93696e4b8d5126c89ab62ffcf64c53 GIT binary patch literal 4253 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 literal 0 HcmV?d00001 diff --git a/env/Lib/__pycache__/fnmatch.cpython-37.pyc b/env/Lib/__pycache__/fnmatch.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..552d09027fc18fb681c3238d706e584484f98222 GIT binary patch literal 3346 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 P@c;Np4dO9kr literal 0 HcmV?d00001 diff --git a/env/Lib/__pycache__/genericpath.cpython-37.pyc b/env/Lib/__pycache__/genericpath.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..60523da0657a860edbfc6db9c97e6256d4e54c7c GIT binary patch literal 3757 zcmcInO>Y~=8J?M4E>{#K%ZlTVrY#0;jd)W>sEr0i9XCxa*@iDpVJUDyC?-~%p|s+1 zm!26aqOk0tYHvl)MNc-+OaD%fd+jNIA*Vj?P?8nJY7rM%V&+ z(n6MnmY=P+)=F8FPL8dXDl@w0^2v&n8#^>9?MU~se%8ZlYMg5;v*D;T4jX8hjz*>& znJjg>)gKqV*_ZmJ9AY}NN3YP*q1E}Gwkxf#pgH!WZqMM1jP7Uqb)@$*>ueowYX`VP z?OWLHs5SJhCT4ARpzB6vfwPV>+s|^WwdoMspw*@p&Ro16x7e`9>7#f^#we>O_9m*y zqGK<4#a?mFp0VOm$eb9o%yo{X9M)ZDzh_>f!NJ;wwoZPzqj4G|Q#m62&TvCnPqiBx zX!&89LyP^=$SqS2bRq3zxK-v*U!D~M`*0%(YEjxcBwTg#v-JnYlqTVINc;VhnTtU6 z^}W@*o1a^4?B>S${mnIP2d*4#_Vd&ZKHQposQ1(1DA$|1*xSsrt<7y+Xp{A5hn3O9 z1lVGUPUsz32)>A4#80#!Fn6MbpQH0y3sZic794*WRD3sl1)U_~;KrM@0gI>7=OGY2^C0(T zmXpqmwaoh7tx1suJPBv%!w3{J2o`Vatk^z^kl@sd-lO-dVS#uz7%D zi3ykpS=dVbF}$j7Wf~1gLvJSrKI?l zTjRc`D$iINhw?;5*P$l`5K)9E%8JrUrT0L)#6N~^!L!JTZ=Ru8vN;p&*GOp~K=DX_ zjK(o7O@(jqS9}^cK?XgX;r-RO@SfOiMz7xloA%r|&1aZT5tboHN!Stn+bDO=hfY`C za}-OYz(k9;{vYsnzXhI>3y)5gTf4}V?3)fjjCw@3b)!%AImRFKN4Gnu{>up{$J{=1 z0&fS5(XDY3hkr$jy!2ch{x6)Jv(O`H3l zR?R9JFjG|wttO39k_}p+rs<;b0@bgQ7@H8D0T~#;vt)YIQQ>YM51@6AxJoM{16VH z#8kXMN{c?o*xW%sKtBMfVr&<*+!vQY$BO+C>tH}(o>zf+juqi-RDpPt#*>E|2Or$9 zHxrqfZ7^N|1&(11Xb@SNr0jO$G{~3!Hry}=E30YoKGtOWG!N?_5iBVGz#^Fyvt0Rv zg>4cU;tnXNG|@k`y_j_wV*c%|#`3HujPq^D#MG4Vr0MTGn^`sQQICKu~wx2wutw|hEe z>UPsS#}M(KPfZPlqoFj(5Zf4vOhdLZMCd-`4e^nokoH#f+n++{lR`>$>-gU6@6{*t fz9nA_>89`m7B%AexE;^M4gZVc<+zF7VtnO44r!5U literal 0 HcmV?d00001 diff --git a/env/Lib/__pycache__/hashlib.cpython-37.pyc b/env/Lib/__pycache__/hashlib.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..bb36406a2627a79e1d9d7b981b0bf163833312e1 GIT binary patch literal 6600 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 literal 0 HcmV?d00001 diff --git a/env/Lib/__pycache__/heapq.cpython-37.pyc b/env/Lib/__pycache__/heapq.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4a54e4dfed1f033b6135d2b1ccb1430e8d05d292 GIT binary patch literal 14371 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 HdggxvGKT%4 literal 0 HcmV?d00001 diff --git a/env/Lib/__pycache__/hmac.cpython-37.pyc b/env/Lib/__pycache__/hmac.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..657bc9a64fe540b3e61a02e77ff40c9342319dbb GIT binary patch literal 6122 zcmb_gOK%(36`mOm-xMXwj_sytd)w5FnA&XoN)20eBg;t>BvB2=Ng6`IV8pqkMjFmA zcZQZp&{28`{1Zdgy~4hE*Vs4FyNK4} z*IJjb&Z*xRUdbyzF}(7=)mrxIUd5|EF;aZ9nXaPNc-UGLGG@6l;TITZW0>b`w7e8{*zD*^WZdi@ZS~o0ZC2y?!8j7!eB$ z6ug`pbR*>_+dbjN!jo}Z`CHNxTSIaGjdgM5@+;Sxm8YPSvC%NoMW-G0`mU0W=XYhC zv`y;4&%&3(*Txs0MKU%%u0J-%re~}fAAn?^fVjAX^>h=R8-GD5wVJP_<|AdJfs?PU zuixB!Kb9)qeDL0#&AT$*O``s0CvfB4OIyQB@{vpD-<09Q&A{K<-0r#UW`Foqd9^D; z`KYgMpQ7FAD7K-9$xpGd@jsmLRm|PsGc_!gM@1DVnVnP>sY*L6@kF4Cw~@q{=InsQQ9r3)ub>fdby0_UESJ-N)vkIXQc1kTgurVV{LV3uR-cJ~@w;?sQI8lRk0_~<`GEgC{pszZA?r&L2glT3pLPGM&1=F9JqT6z2`;u?~~m_UDwjYBey<^~K( z$;p_T=D=N;E7L<#p21QpaMImrX*FpzrX zCZQP+Zi%%x9`tCj3tsa}x)z<6&NaeixU^XP4kSYv^+ypT7EF>%h#2PRB9(E zf&~tVoa3ZrXU}D+jZ>RS>GIu75MW3?)Lm*3d!;!DS6TwG0}|4-s`&*^BaG7=v_P5% z)+91N43SOyiDqdL9H)D#Gqh5fZ_gd|`vW*aJ(=y4<^ma}1-*2d4|X6YX<^X!AeU)5 zQEnIqR4j4PxxPLvU46BYPwiL+oiqnw!C~XBX6Xuc)ILJSV-2h+fPReb_zn_dv2HF~ zC9{yjhrDD~P+zht$SYP2b+n_5+$x}inq9E!W*vRY_*cx)!ZBzb10o5^I&DQF;gMM} zcFc1Ixmp{eJh@1h;KN)%XKE8?z}d^Fob+X`qs_s`zKmgw%Df{@Xwwe#qnu#RyAf7t zuL+DAnXq_S1gUIQ_BoBYVbja=(vT|X}5c9)sk&>kp7HUX+6p-^OMLmxn8 zNvJefpC}B5Fm(`h&;mtvTeZZ(=8%QkmXD_OBj_~pe0N3HWB6zw{T$UPJv1 zC5F*Jv|+btc|RP;*$RwQ+KrB%ZQypWB8CTn?toBFSDK^0rEY;TYL4KFWbOpXx&KqN z#~dvbOJ*j!nxp>}rQd$X-<6p$TWM$?ByK#cg|@AM(Fry zc?Pbj`gztRRx$Kob_rVhv=5^o+QQHlL#^(NRaDRh00^VZ`KXlx*9yt;+41UCNghO65{T zQGYv!gnpFIBwIUDW61E>+NZ$MbSZ8-7FwLp<0Och*utO28tg_AG9lgyxauAYH)sKk z7mh9vJGc*BpRN5x?d$rzp7eZZ28cb>0Zm{av)-J-@g)ST+479qc~$aJ2J0}|6CH`U zu7b=cR}C|HBF-OMEpwv?6Iw~HG@y# zxHg~FYgwK8bqq{BHm$^lB~K-Qvg%5J@(mZUjUPf6N#RdlviPNobS#OXHY*H9*caq8 z&Y=uYF#qO_EaMSFb%@*3&uGjy%|r@hc@oL(H^h;=&lVoU1Vk7way{~wn_mx3zl#9( zn?h?%fd3~f++hEIrj02mAYgK=^USD=efSe0519h3sQ96bCjXV1D6|-z*QEXK0<353 z_P6P792Y1$xT06dXf%+Bt7M1ZBEZ~NF~H+m7MA9-BXcw zpBB3k-VB0|muVg!gWOZqq~sM!eu1P>oD+8*#Qqz(ZrX8~4s;*=LXi~7hT16LQ tMN^Aa-ch0hs8wwt|yiHzX6>X^b`O9 literal 0 HcmV?d00001 diff --git a/env/Lib/__pycache__/io.cpython-37.pyc b/env/Lib/__pycache__/io.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..fe9e605a6e3fccd7164bb5f25924bd3124a67690 GIT binary patch literal 3418 zcmbtXOLH8z5uVvMhi{3JMLi)ZRTitL%^^3N#eW3Z6EOqX3}lb3>pItK(vx#? zUM|XoPIcG$e#w6>pJ4Vm&Hn8ESUPvEAIn*}+$j~a&u+}JbLTJ5M@z8#8SGy3*Ieh^ ziSJh&`J(6j?CJ~Gq3?H2Jol|*PhBIu;@*j~&iKEoj&s_TOeHKz#2}Qcuahe!q+uz< zZ$@c1iJ6L1sXM$)(uA2*OCGT46-xmf z(1>wvnfUdkF$>;XK|>S&JLV+95ZF9USdo&}0Xx zm#fd0Vufl?!4g(ppl!0lB$XSin+)ZZ)EiLE?fDwE8x|*?k$tYYMctC=P{ItDDPSOj zp=_uX%)6Z0Z$4)#>W4CtacZ|2#oiwD%wu+RvZr;TnX+b%m`HG7%FLkO zPjm{5m+A_~!F4$RIA`xVm9afMx0OI1^IgKUpI>^=bHDyFu1|82Qo0sFqLlPKy&{Qbus1L3il2BiAVVn?Bx&R z2;>-lKpgi~j0_lUu#;3H@&`vAIf2+SHoDl{K|WY?FkfE|D2rIkBM^{cM(KfcOvjah zf}}dCZ4)hzeiDQAwm=ly4Ovg+=OyYIr8SCHEb>%rNj5O(a>IIZG)y$Q<826l;3@yi z^LF?4x6l4`8tk0y@9!N4CkOtX=P|~%E&EwJL8hzNRsj?yR31JEQI{;u5$AWsA*~!& zUg$nG6Yh{IDse@oHOF9qEU#abQnWtoS!FMQHfhn3Kn|seX&RK8b<`13)lZC3;C0h` z_unrE3Pt4#jy{HT5V6fml5F*D{ca}u@{0}jwdzUsjnpEECEJWJYN8a_trBx9h zfa&`{AQ4mX>9%gOO>U(fe(T&F8NcNbu8B7iDP~YJHd}@0rXAVhPMEZNmRz>1W)%v0 zR?A74%}mNlR?DkfRxc7VYm8Z$E!?K=betEM={PSy)A6w_HaEt$RAgSBV{|QL^SAOX zTRDr1N-xFHxWog>-riTi$=+$vdwq6X^!5&S-_z6RaD6_z`vFR7ypkNfNKJ_v+~AI` zQB$X8h8lWo=~-&#&}6Fzaa-p%Rd^_exV7ajl?lbwrQX?l1fTy${p_g=L|ujDnSYxhFNR~Mmb zU8tnlA6X24B%EYH!(Dgr-jgY}srJzZRdR#$1H!aQ%|mJ)p@C@=e(5J9odC~!&qziJ zzQV6S^U(kr*b9$-5Wr$^o4UV_!fN>qDCYkUirHXF_+Ljr8vZ;*u+dHqn25~H*G$T0$Q$MGM9IDr-A;YqUmY2$)R{7N)JxlcqlFlAP^s2L^ z=|kkm8k>1;d_kJbCYnmQQuo}N{mzveZlknWt(9x#ii>acL3zb~y^`m8?ow&NU2;pM K651uVR{9^d*V7#U literal 0 HcmV?d00001 diff --git a/env/Lib/__pycache__/keyword.cpython-37.pyc b/env/Lib/__pycache__/keyword.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b4f905075df272ed4f6c9394a9ca3d443aabb860 GIT binary patch literal 1818 zcmbtU&2tks6qmFgwl|4!fHtL{A_0PFKInyMDZ_Mt_RRJ2Aj__K$m1GjT z>l0Nx!Tz$y{Gr3r{B|!rKO1A`2EkdhvyrF{82Lh zj5S<*hQFC20TL6Szy>U);DHYTgiwPzG$4WnScD~L!U<@>GMt1{a2no#H(>?df-~?o zyaVsTd+BdMg_>aDh;XlG9v-j}K1I45J9jS?$+Nt#ahKq#RTE8tU} zry?+0jgAv>=ZdFd$Fa88Tx9)0YYc z^bE;2z?*s2D-d45hQ7Xq@>0iFKKL`=`b7odXY6@%78JoeI3%<1KEnKKa+f?HMW}x% z!qOA^sOEWiNYGamNinF+YUsmzLZ9!TJ)L7K9MV~RKxU1D>qT&jJiIcCpixA_P`@bZ z^Li2C{z9>UTw{(+Q!LCQV25;tz`_bCYAfWBQu5=A`{cDO8uNuiY=g<=BAhS6;*l1x z6*60_Buht<*;3Ic!eX&lddjY$z1r}JT^dHeQhk@AJtbJD=KKUS%NPZjx5~(rd`A>} zK&o1tC>#2j_q+{a2X)!A5M|ep%kiOS}g%UA|KRe*0A`PMiOQt|M*gYDyqx z5vDYnHdZfw|HJCT58JEL;HQr^`0BL5kH`9yt#3?Et!-`^n`q0A5pOm(r^_f5*eb7y z)=_65EcUW691+G#JSW(&2vh8RK1%dZXcIZQ-#+O)Gck^7>=d+m?7UPc=Vv+61~vth z*%=oYt7YzLy=;^t99?KcqI-KTOmfr&7YuYZ&Yf>cya!T&IB?OoNjesvYn^G-w;;53 z!M>IjLx}@vT~skufOb=#!m{bpNUB6kT$8yiU#+;79W5N|=Po=tgJUX-EVex?%mkECCm_?s@*>J{BW~7*%SxK z2w%Znp&sw1vb+20m2v(E%l8TTFjtTe+G0)GqKhP=zTc!L={YZ=xW>O;&6jB1V<<1R zP>;5}7S)&0($zbi(pRT*yIps+P6x7Hr&BKQA?b89D|H(9l1zm%!n(yy=lJpr?v}{< q*NsX>0%hgNUL)I8kZYq1#;LfzfSkF5#AkJ%(f|L2e#Gh*>hy07X9QIM literal 0 HcmV?d00001 diff --git a/env/Lib/__pycache__/linecache.cpython-37.pyc b/env/Lib/__pycache__/linecache.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..960ce1fca3c14e3a5a442193cefc19a969037688 GIT binary patch literal 3798 zcmZWsO>Z1Y8LsM&nV$A|;(Tm2US+eri`ZnO#4<>H$Z{ff6BaE3v#cEwEJs6os>W_l zPxrX0W}UHmkdSkT5P~2$aI`N-TsZOv_y>ps>ML9#g+GuBJa6@k?alVMs^9LedaLUF zc;3e!&(DVp*FRo=?aBUIjQyJ)W|s@$duTdCC)g$vTsSG;iWQ5W7bwi$>85r_ufHpE2{3LjD^E{QqOgfu7SMGK>v!dYkS z%ZGozA9r_UlqQ+fQBUQA=(Dle&9g}7Bh{5rFG;0d3d4=vL`U?O8JP(wB9li-#^U_U zK`urZ9VLTdt_;T9xfAWm3|f+26kAnUJdh#OWVwlY`6v^&qr^l9Nt#A!p7$e>A7qii zhALf=ma*#YM#I?bV!WDaiMGd~*^Ny^>XyQnFdSPe>pRlWIm)n`(lk04*?45APs_?1zzyscdHywDj#cN#A_b$1UE?SZlT5JCm zLIKD219jCf!;hU4cEl$AY6WIM>o4|~$1UR>`$g@9PwJ0Yb{(Fo!BfAUdJ3BEvV-NHv&?zSkTdnY zdf(N@g$F5s$CqiXyKH~?Q5Ash;ll@s?#4<~9r>3 ztw3^xOA_Tyf!rG}SnuKM#C^nG@T^w(?*&&Il?O4(GxaJD)j!9Vs#S!y$d1^=hsUpB zMqp|^2VVbEH3!~ag|~g-BS!vAYr)GtcIKl()t}+ZapQzNKr9wc&m)bi7Ihby2q^Q7 zw-+AI6%0H556ynMXPSEWhY&TLTxz_hu; zKTd%uK9>q(z>q+#H6xV)q%YbeI}+18J4M3^-fmk=Jhuwr-e73PcBu;HUh~!0{GKAvSv!Ruf<6lEbu@hi-3}c4 zq&Yzm73^*HduQLnv3SWtn-D0G&eAgFVz0b!}rcX>C$SN zBenHC2(z(j0pni&50`o$Qv0oQFdQPgmC*-@*)0Q*7AvW%7*^%zHArP6jSt6Dr2f?M zmI@0(JxmizCjb*fKT1E*@it1k9^=hko@8ZXV?31A@YYAhsAPL&rq6-N`!XYt@baO= zP^uW#VQP^!@D6Qu?yL|fs-t#WWw0IViZpmYytu53L|G2u^oAB|)O8yBE_H+pRc8zG zMLbfy)jvbW{D3c@T3q9v;{jS0@bkP7(k1+APT+a~p?937*TjgXeSZaSsLIqZHUu~k zFkQ7;sBfVuTH_R(YIvXku-Nn)2vcl|zJyJVx^DRr>Ne2nyB3{1WcsQ_C!Zv$=>=EM zMXjJJ^}OK6o~Q$(9E4I0oWV7I;S#SsLOm)RjPTTRQ#-Dst~fvizwmn&4_7O0MjRoG z|BHBCm&8_Q_1~8A8JdH5f>(Z-l7Z_IL)bXuplKcpsVb7Xjq0!aP)KBylul`Ko~7gH z0Ax3saX^q|tB8t`1kI&Vl?(<_Bq(FxR@E{{Txda!1GhM38(v%af>wXY^c zdW3=+SIU4Smf_ncYY|v4wx=XLIC*Dk4uYawM1v8K3MQK}eLB>s>1W?6sEfB#d8%kO z=C(z?ug)SSOWj&jxJf$3^Ol>0jh!POv3%SP?jcs!<@!8*eS?_d2-tBbMU3^n_sI#c{4M_A6 z5r>b2pw+=#l87@Z%2k`eR_!_Xup1-{DTCF@$@eI?HDM&dg#9^ygr?^P^>874H~i@T DtI53L literal 0 HcmV?d00001 diff --git a/env/Lib/__pycache__/locale.cpython-37.pyc b/env/Lib/__pycache__/locale.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6c561a2bfc9c221c0685b1029d167d57016dcf02 GIT binary patch literal 34564 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 nII=xT@#nNifd|hl`RUI{)GP@VONBQ literal 0 HcmV?d00001 diff --git a/env/Lib/__pycache__/ntpath.cpython-37.pyc b/env/Lib/__pycache__/ntpath.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..50d3f36118564053573b8bcb1a6bdfc69c15e766 GIT binary patch literal 13013 zcmcIqTWlQHd7j(O&MueBix`T!SQ^uktd*&itoWkHl49!?E4FFHlC5Myd$Zg#Bv)L{ zF3$`llAcux%Z=q;0;P|AD99oY?MokmJ_Lmyg1)uLLs8^u3Iu3c6!1$?pm`z+wBP@q z*$Y=vY7{7mJ#*&FnKS2{|Np=Lb}kJM=QaHOAnm&GuyW8xK2#C2S}Dn@YKBhHFZ zTqpd(ov+=|{E3Ptz9GiYGAYi9aa{L`*TfXAQ{ueXkL$jTQOx~9WBr;EDGuR!NW3l%<9b-UAzWNtaYxAE;0-U(d`EdSsqI#xA} zRlVRJTrjXQL)z)e-Vw7H>4aJx&-z`wIpdw=Sx=@rVaT%TpYB5LrdImS=A+Bam6c}T zwyM!mP+jrem1S1+0OsqT2 zdXVJ9R-+yXS-*=1Tu&Un`0G*P%%eXoG|6I$RPhQm-hvjUR$uqBi+&W=H+|1RWhJVk z1J$q}X{|=J#IA>pda#_>{(3!(!X(>BE0_uf_V9e6-oRJt;YxEYh?2a&-ogf~g}&_6 z?^b1~7C}o-vRDFF?An^d7>V7g^3@FeR+6PhToL|)>Q-$;)PO1QH7oqP*r7(^NWa?P zF8jl^7EvdxtOfO2Q}`8{6s;OFmOgj#oDlca?iHxkZ219Co!djKJjtg!gc;OyA^`sA zYT|bpzi<*oq{UjKKQLrb=r=WC;HQDb%-Im=q|Ke$H0Dl~j3i$V>tLR0Py==5HzGd- zF)fR!yfk;k50|56Yi^-Y4VO>OZ=Cekt1GRBKj#N`=Nk3- zxgesK%dL%MxB@~|=9|1v;WSOmMxp6>-7@3})OO82hX$VgIx3O2rN`Q~-qtqCk%5(% zSjn+i+p+{8b=%m=Y-2TiZwjk(50N})X^|aeNhGCI0;b-NoCV{75jG-QWMb`3?oNJE zd!P&Z6XO#t6+s*OlijS&f{m*U@SID`Ofp3)A}T@BT>QOLUG^b9jfPuWs>*6D!sfV* z<~?8X3nW+cFvJ!up<_LOe9c#D%V|UTKZ#hUxSW#~>XJyZdAcJ%$4hQiF0QTkLFBHi zg^@e&yI~~VrgWJ?Gj7m~+@o@~G?W<4FtHbyQRPt@inI_hQ>#%WlJc~Y+^vn4e^tt+ zOp0$rk*v?JMd`hXk&|4dQp0S+N+oeB6}fSRMm zgg&kpbql{;B<(Wf8FcQEln8>Y*Y{~{5SHu4vei5tgH88okwq=bL=1ED@GT$fzqjN^ zOTeirQ^EzTK{lHWtl>-AN|`}X%E*&cFH=EEIx!(y%w{EBzCx|U&V6ffaLWwGTxsO> zLT~mo0R6s&Uw8{2**$w^$7!Lr4PmsQ+uK%95Ekw-xU<{V#(%_mcm?axM3%HjZ0v=E zs+G+d?M&NV|8bOwv^#nX5xt^)c)y*+)9eEsPn~uy&dEQCb0Uj3&1D;PC;U;I3I8B= z+L<`lwpTw2PQ;GNKCWjcbmss~_Fg zVjEg+3cb`fvwTOIZz|3}_i4NeYuQvS^nPsbB@xW1E5t4vIZSd60&z~s0>EiUKgWdq^1tyX2^~s>J`#7CJtg)^wIxrZ zlYEg1Vz{JmiSX=pRR&Op$AdL z&ch^AYc`sJSCD?V)`%*s$h@KSjtA3QUbdA!uv-;s8{{>b{#*Ek*H91w0t4}H8&q15 zB1<0y|Bd4}YB=0xah;zUmNBY3dI54ag;qzOM9;3IkxY^VFfSi^j8{q0*oG;RtVI@p z^fb6u2iF?lSreR_!JUn}Y#TkcGBK#NZM3b}0_An4JjR&NmJRu@XwyYbwSm)czh%dG zivAgJN*;Y4f$w3%avxA0Ji>kOw6Ir0KjJ&Cqwg1w^|g77Un-11UyK#oYAkT)5Y^O} zu!+^&%w^bivdAN;7FgbWJqKn}8m=Z_xSM2^q=-U*r(l|?d+Pn!%Wep0_ggSv(1{Ht zvcc~93W36wU#l`eMKXle$r?=3a1nhSc#^i638&7z`WtsvDsj$u%E# zTs1m3@ap$Zf9SrD4)gsNKXfl#a9c`~;e(ivT2rkVMAdrWLwUJ8dAH$5P;E2nE?tUy zuTFYT^>uxipc}9=gGK)2T8m6c+OB#~Ype-ng+h;#1eIOaFE5t+S20~XcM6u(bP1DF z8+aT|(=+b0YX04mBr1`t&F~uf_j~swX@yHos1YJF&y!}z^mWyYp$%E3?w<8Rb4^A| zsp;I58!q4g>OO)R?&^I-{>RpJ>J)wO6zsGXl$3mIkps^MSA2so2-ZhHdcL#QWJnE= zhPS%vb~YmAqAv+f8Cc~DRQm=M+{U)XIl3jh_|l}>Yba*rt0+s^K6pJ#&w3bp3b%>1 z0Ph36F4HqYNcjvEmr!^aGG1D+`~%^y!`!CJnL!jJjk<|nNJ?7UlZU;q8wU&ekqqJ6 zs6J`}2~l%^c;onW(T(m!l0U=wJqS91x(bp^;QsDKt&_Ap#3t0LaBK}rpw*U#_^$5CjRJm^q>UYdmV*>4P3 zc|;MW27PWfHP}u%64Cw$roSd8K?>y?ZT1E_gfaA7|ga z$-a)V0xi{cvvU3B+p}*a*)Xag&f%8~W$+o0jsa#F!J2=AUr2bRSq5NgT(^4=L>ts~ z9_ZbH4Vs`0g8zvy75$U{jgXXri_1^i6cww0g6xp^7O8St^t@~?`@!xF3$NWOnM&T@ z#mD6h6zOW@EovB8&KTPM9Y3`kgO*doa^T;MlZSp6j?@Y?n{sixGC>&I#n}iqT^_*V zNIE(=+re1ITQfG~mDnKP4hU%x~ebZ znK1DKGL$l#)hBHjd4LFQA&}!L6YY4%W|7TiqznS8v2e1=XLUbAE_C`L>>Rc75-Y=7 z*JgL=KL*jgShhma_o?^5mX&H z(=ednOlNTq@O>41R?pwY*24A7f;@NWDl9nSRxl^XA*I$o;?@keUK2LAX62vK*ND^c z2AsrpCWQhAoc@cH)8U?~SW1+Oc{E|~(;mQ;P%#*|9{+~5|)Xu%nmd|~P-jRKT?O&@!u*I3wFlzY$Xno|( zci*{6T6Qg14x0A@*s@Ks^vGgWVVL_n`h5oN#G=05(EB&9zIWrjcduQ4`>N+q(~UQ7 zz3JtscICb6A6!ik?tG#jia=)syFR=JRn3~0V-HCdfw8)528r{QzoB4>z%_9e5cs4R zpd=iIawGTC%S81Cn!Zgv^uTjyAxljJI5TYD4vO{!`W+@NBY&5|F?n_=$*3yo`=PQa zsG)vVD)=-h!|}c!Ic6=D`K<} zj5dVPv^!4Q0pD1HO}BOqZfzdiM*ubS$XpNNd_1(QJ+kC0;HG?>7o&SQn9(l81xO0H zj&t;c+J!~D2S7{T-=K(NJ}!V;^KlOS(W5uQUJde;gA|+q-Vbru;{zoJs;_z;4~fw! zt({kL@yH1N0pnQst|4bT-^G|?YF7M2r{GUqpwa1TxaNbOcltgyM>xKzMCEtQ?(3aF zZ&S|m6YSYjb^|6zn|7m|QpS+K?e0c427f+bM;cGr5mO%f3OjNv-4RoEctCxJb_Fsq zxGTXg`gnG@LuFc(S}{|lu>MM1z-qt1{u#?Q*M^xdp8CckbM@hE#LQD_n({YaVeW_0 zxmz-y?oyVhIXGv`#ga2LKe$YJ@WTL)uKxXPEv7Wq_~t^2(};f~T7bk#y*l4OC>*vj zo6ztTL-z>UXWSznbU}>b!k?J}biA^q4 zu;>l*$Q2bB36aUIFV-pB#2Kkb$~g?7u%80QN&bUsV@<``~{)g&g1p0CX zh38=L6jlhm%<5V*@)1%*J^>DfmzhV7!S`&LUPZIfsH$&yCTtH$-$Hj-aEN#(dMzxmLZGJq_q56Z**#c{uxIU1hd)`8Mey z+;zgCsVxOF*KSig+hFqd5X{tpbFj0vvSgL#r$7qrz!X&Y$=9a!mzp=C?{7qyB42Q3hQ@7+@?X^jgS)gY5jaE#xfxA(_3 zv;yYCbsnD(T##0A@TG1IGKh?oa^zbXm>(HCr*C3dxil&Vk}g`BeHd%>(J8e<;{ zZ%1dXWu8q~SKf6>m@)(_H`p(|H6$c{xSOR`(Br zs7&tU0#e=`XYvPRdQ%LudKWP!QUTE=Zm9vU}6_-T7AYYGff(DJfhDPkD53Xi4oaES7 zqCt5U8BSW4{Fn-I`el;}HABV6yO$}+e;oqbgtTcI8~}pqWDGlXPn{!4Pmsu~G!W^( z8ZjCDQP6-QVa#j-i`>m@|62kSDWUALBhSSq`K#fz2tL3A{S%!>A(YfNevJeuFow3N zo#8rfSsU5=IKzq1Y}-NI=6ViRy+bI9G6yU*<)33rBuZoC`YDtDi4Lz~=u=?fRxUQS z^($y=)4?ff%lEb6C{=rS{d5GsATDt7bsCsnY>!~%B9A}9)I(aIw zd5mO|#1Uev0w+gde6h#c-_&L64%pnppq%VqgwFf00BY(In(rsZD#9~8vBF6bqkKBi z*LzKpByA^uzJUWd1eh1;SR5+>TiZO4o^~mpZ!~KN@m)lv)9?R22ie9a<$Wp!B;ki> zd%5@ho<5P&cv9Na2QXc$Pl*@DfLQJ*8psDASgj=HCKL>(Nyq}}rJdyk+$Q5!d}xar zpW8|^(2_#c@|!41V=S&X4n+|Il}hO;o*cIlLU|5RjcY@yk)r^fiZoOx?&RgUi)znt zT{Wxzw5f?|rYh?!&+uQw?~I3oNsS6O59}80$rSC@ZY`E(t0_MXT?P#W(+paS|H)LO z{PYB#OhB9AiE#+V8kvmyq1U=ZB~YOaBTW|mHFy^A0K^o40lgT966m76k~# z#=$7dt$+da<5mES-ZtSbk|U%cob?x}plSkuAVxkh(x4XL2q!RcMzZrBo{j;Eeu?>y z^ZXGwp!sg)A8HSAOo^e3GDw-NA>8Y2`!gLg+QT!ld5)@Of?Eu3F#sX7`fN1JS7-fF zR3zxbIgw+4DnKFJM8M!aob`ZtH-o(RNX%ifwtWLe=IRU?b%Fp5Z?P+B$J8^5t%o?d z5g>!r29!NCwnk#O%4FbS<)hIUpJdeKU#06Gzq3b7#@fKijS&FV-pwoDLN+{rSrGcG zYlviZ4@z;G6-O0in$jhQ59!}UI>-YYpwo@v+Wbjk)$-<1)j~Jw)DuBeHBedc?$AnH zXTUKkqe;*=U^9043v8=p@uL82=%QfYnu7fUs%`0@3(hKR8QV|~eISN_I*T`(kaUa$ z)&qkH=|9w;!9~d_iwZ%TBuuH2l+Y)EX@`1i`JJ#voKN;F&yXxnp5Ztsi}OUWv86pk zz@>j~X%@#+GrEp9ILC$T4%@A}XEfiNQFl-1i)3_v9lvlI1)zL?=X*G##60p4=Q})iug z90=&DKH`gTcGo&+Eg}5~ld+Csx(>Z>?)vPLr#+|@KE)7?-gMc)*gSlLK8ipwO>L=) zBOk=UbQDt^gy_x&FY>N39S`D$={V6*k=Rf3$*NLq<|^I*2^sfylW?^&C0pC|u`bgb z>U?ant$(HgP(Z>Cm?_37^2q98Av)6Vjb>6T7U^zBtw%oFFlI%|KC zC=}9XEQADh{lm;k|2YgmM`bvdV>o$duj4qUoU^#v`HYjrf590yIGP6U^?-B6S#@4? j#?S&T%A1a3VGQJb&N?p}<|HC+jy{noT1E!(H{*W*ZGfc7 literal 0 HcmV?d00001 diff --git a/env/Lib/__pycache__/operator.cpython-37.pyc b/env/Lib/__pycache__/operator.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..50249a45aea4a484e023db8340e8590c06fe557a GIT binary patch literal 13909 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 RI9=E|d>x+L%=ycv{tr?m6>b0k literal 0 HcmV?d00001 diff --git a/env/Lib/__pycache__/posixpath.cpython-37.pyc b/env/Lib/__pycache__/posixpath.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c57079e6a50a7b44266c2ef1694def51caf6bd71 GIT binary patch literal 10438 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 ZhW`8N#QxHBWk&l-{vT6}HJ+=O{}=zNWkUb} literal 0 HcmV?d00001 diff --git a/env/Lib/__pycache__/re.cpython-37.pyc b/env/Lib/__pycache__/re.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ccdb260d715558d89807ff3f2861e17b5041e90b GIT binary patch literal 13813 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 literal 0 HcmV?d00001 diff --git a/env/Lib/__pycache__/reprlib.cpython-37.pyc b/env/Lib/__pycache__/reprlib.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0e5eceba552abbc32b560624a1d9e1243d2aae75 GIT binary patch literal 5359 zcmbtYTXP&o74Dw0 z-@NyYR~Y*Ty^Mc0DmU<`UxEnMVS)=w*bnRu7mjdqt7D<`a(mP1IGmyG=kBK0@lc-? z4Pigw9sd>+O~IdF?w-{N#EfV?VVy=A?6FQWZLZIBW`w)KqIPlXb}9y;UQ5IK+gYx& zekju|xe$d5RHiEJ>qKXReuRDUr zZK<+HX-w}2I0##gc;#g(&$=mUjR&cYGlA6)?Zw5#E~g>*S$GHldem8vr>w^bfG5F_ zmmDnH#jT~ZJCKPU$WRZ$&154D6T@}b+wOOXS-k0O*$;bJonVH6d-iyH&7W~$?^z{}EmL<)-8OaC)E!gzOx-ngKVy3~ zW_X7AV0p4Bov<<9^rqRgWP4omJ=U}6tk3v{C+D8A750qpW78L$v!eCPqESQZ4pal} zSen}JveE)Jd^vI|D-+VgdX=3BQTZZM-9(DWt{j!-y~^H5cPkH)-Oe={8xxGG7Rf4> z+x>ple^AYCt5n8gME}MPzy1Dus~@3Ft$w(2b9E_I8+x#{+RGEQ@y`9-cha3?b1P3* z)BdB?JiEV2i=kZH+O7OgWwN!E$}`}~2$k_R54gjd+~O^(#fxhb$ry!Myp|6jA$5IG z)S?DM6IQ03qh+gR9B&T9cAmy@<;SrYbWsW7xSwoNQ!9=iZYTNZ?Mxge{r;fVY8A(k zU)d_vl@E$d*{+-DOm+Lqs8#1qVYr2k(Xl=2 zY^%lVf14L?{};!WFV!2;zVbC9rlDp;(&lokQi_zB*{us*D#t(Sy@5yl3M6IlCJdg0 zOpA4FVG9Q({EP5Vy5fr>5Dj<|4}N3@Exu@pS(Jfji!&%2;;eWHWmCK?&Y_$U=fx{1 zTjGMah;mk360f3ci#hQc$}{41@dcD;#T!u6P?Et54znJU;!cJlO5nwy&5 zhW1uIwPi}1rbNmF+KVQUb#>*TLYmS-*^`4J?b92rBGQN3Y1N>9Ey;MyG6PhocL47y zp)oVq)(EX8Mqi+%SwGWp{1!SDDIDY8DgR>jHtcC}Ji1G0(T_?xm_d$Iqh$N61Y+y_ z#mFOAl}onxuKW_Zp~S>S#dl6{B59?s<56a5UNp>xG_y;ZLqCFXvf0OY(b#H_uk#^% zWNE`)T`ui?>jfJ+!h&mZUZ6)qG!UD8k?mRX0}T<4-@vA|2PVNXyklt*!$xe*@*xi^ z9(N4mWTB4Uh5sOUDpzggnXa7mLDsMQwL}@CoujT<;ud%+o%9i9+#2ykGixMhT8A7# z3-$jdk32}vl^PHR5LXq5k5@@*h5)ovHTzjMROLxPOAC`@MTUg}Yg}3jN z4WJp6zOXkeDNB!@(z!@j`=wn5rPH%7kkSXsk{Bu|t{xmSGm(=8FYFf{ghVR7aLA)WeibY&VW9jnNMxTl z-w6e+nnuNqulfnbkB#-rL^os8cZ?rWRl^TOwv+t4pfu11H=i8xdt+AK{5-5Q3@aq~ zpB>?(J>|sc1OY-nQppJ;SMgGE)rQyL>x{G(?%mXeaPa$REv?cx`*q7O=qwjA#v3nO znO9e$Vs`p+HTc|Pe57&pG1Rm0#9L7cDSb*>!AMzoRu(R>jK&kA0z8kB7)TyXX zKr!JzYD8effc1WX(G$KMXzwUyjQjt8u4g7uZy_pJpp^?MY^z=V!^oH4L+{iz*8-oXwi`r@ zhn_iMaq|1rHFdg#jii*gKIeTm15I z@1dtjAmK;O-01ikD)q??a&X!PIUC4{5lTp5K7*WT8zc7_OzKtsB_{GiY$`tj8DSzn zrUnA3*3Yj{?GDK4aLBvVPu}u$NV2~E4LTL+D5ZckB*y{4m}5#c3Hg7-oZa>mk~^$_ z*9Y>~#m3FpQkcb_LgW?Tw)G0p0I)K-Zmh)rb1gAX`%<&AQHRm`g# z%A#;)y2Tt}&hSO?_Ro0gsP9;ChHY+~GA2;66}8NV4EiX7?_CfaSxVKQ6j=`jxsoQq z_G7&!krkP*M&=`eIk8!&<0d478rP|3o?uf2*XmC%*XgEVqe=-07 literal 0 HcmV?d00001 diff --git a/env/Lib/__pycache__/shutil.cpython-37.pyc b/env/Lib/__pycache__/shutil.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..19f86ecac464cf40266184e039e71d3bc255aa72 GIT binary patch literal 30989 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 LM*8r)XB7W8s16B7 literal 0 HcmV?d00001 diff --git a/env/Lib/__pycache__/sre_constants.cpython-37.pyc b/env/Lib/__pycache__/sre_constants.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..345cef4f5a168223a1a64b1faf9942f4fdf1e7c0 GIT binary patch literal 6300 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 inB+CiqfHg=KgG%6|c=-e~v$ literal 0 HcmV?d00001 diff --git a/env/Lib/__pycache__/sre_parse.cpython-37.pyc b/env/Lib/__pycache__/sre_parse.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6975282836c962b50f95661e66cc45dab34dcb20 GIT binary patch literal 21366 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 literal 0 HcmV?d00001 diff --git a/env/Lib/__pycache__/struct.cpython-37.pyc b/env/Lib/__pycache__/struct.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e990ffb2eeb2c6ca232e8a1227a2e00767152100 GIT binary patch literal 343 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 TEj>OdB1hza2OlM{pi2J*7TkS$ literal 0 HcmV?d00001 diff --git a/env/Lib/__pycache__/tokenize.cpython-37.pyc b/env/Lib/__pycache__/tokenize.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..efd57dbaba246ca1fb78f023441bcde285d9fc34 GIT binary patch literal 17840 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

KYm;b_-~&-m#V;_IXm5!nRzIhJrFyyy>p z5CwjnG=ucP)M{E4Jr(E)&8eYR!{|KTC~IUWrcUdsMx|n&s95Gg?P~3UdG-GQb=-7) literal 0 HcmV?d00001 diff --git a/env/Lib/__pycache__/warnings.cpython-37.pyc b/env/Lib/__pycache__/warnings.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..cd1c08408f449217921609b479a28d1baf21d00b GIT binary patch literal 13949 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 Ca8N4% literal 0 HcmV?d00001 diff --git a/env/Lib/__pycache__/weakref.cpython-37.pyc b/env/Lib/__pycache__/weakref.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..93ecca43f6dfeba1bb998ca90a408639a3125cf3 GIT binary patch literal 19583 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 x-Hyk@{ufSd9MS*) literal 0 HcmV?d00001 diff --git a/env/Lib/_bootlocale.py b/env/Lib/_bootlocale.py new file mode 100644 index 0000000..3273a3b --- /dev/null +++ b/env/Lib/_bootlocale.py @@ -0,0 +1,46 @@ +"""A minimal subset of the locale module used at interpreter startup +(imported by the _io module), in order to reduce startup time. + +Don't import directly from third-party code; use the `locale` module instead! +""" + +import sys +import _locale + +if sys.platform.startswith("win"): + def getpreferredencoding(do_setlocale=True): + if sys.flags.utf8_mode: + return 'UTF-8' + return _locale._getdefaultlocale()[1] +else: + try: + _locale.CODESET + except AttributeError: + if hasattr(sys, 'getandroidapilevel'): + # On Android langinfo.h and CODESET are missing, and UTF-8 is + # always used in mbstowcs() and wcstombs(). + def getpreferredencoding(do_setlocale=True): + return 'UTF-8' + else: + def getpreferredencoding(do_setlocale=True): + if sys.flags.utf8_mode: + return 'UTF-8' + # This path for legacy systems needs the more complex + # getdefaultlocale() function, import the full locale module. + import locale + return locale.getpreferredencoding(do_setlocale) + else: + def getpreferredencoding(do_setlocale=True): + assert not do_setlocale + if sys.flags.utf8_mode: + return 'UTF-8' + result = _locale.nl_langinfo(_locale.CODESET) + if not result and sys.platform == 'darwin': + # nl_langinfo can return an empty string + # when the setting has an invalid value. + # Default to UTF-8 in that case because + # UTF-8 is the default charset on OSX and + # returning nothing will crash the + # interpreter. + result = 'UTF-8' + return result diff --git a/env/Lib/_collections_abc.py b/env/Lib/_collections_abc.py new file mode 100644 index 0000000..dbe30df --- /dev/null +++ b/env/Lib/_collections_abc.py @@ -0,0 +1,1011 @@ +# Copyright 2007 Google, Inc. All Rights Reserved. +# Licensed to PSF under a Contributor Agreement. + +"""Abstract Base Classes (ABCs) for collections, according to PEP 3119. + +Unit tests are in test_collections. +""" + +from abc import ABCMeta, abstractmethod +import sys + +__all__ = ["Awaitable", "Coroutine", + "AsyncIterable", "AsyncIterator", "AsyncGenerator", + "Hashable", "Iterable", "Iterator", "Generator", "Reversible", + "Sized", "Container", "Callable", "Collection", + "Set", "MutableSet", + "Mapping", "MutableMapping", + "MappingView", "KeysView", "ItemsView", "ValuesView", + "Sequence", "MutableSequence", + "ByteString", + ] + +# This module has been renamed from collections.abc to _collections_abc to +# speed up interpreter startup. Some of the types such as MutableMapping are +# required early but collections module imports a lot of other modules. +# See issue #19218 +__name__ = "collections.abc" + +# Private list of types that we want to register with the various ABCs +# so that they will pass tests like: +# it = iter(somebytearray) +# assert isinstance(it, Iterable) +# Note: in other implementations, these types might not be distinct +# and they may have their own implementation specific types that +# are not included on this list. +bytes_iterator = type(iter(b'')) +bytearray_iterator = type(iter(bytearray())) +#callable_iterator = ??? +dict_keyiterator = type(iter({}.keys())) +dict_valueiterator = type(iter({}.values())) +dict_itemiterator = type(iter({}.items())) +list_iterator = type(iter([])) +list_reverseiterator = type(iter(reversed([]))) +range_iterator = type(iter(range(0))) +longrange_iterator = type(iter(range(1 << 1000))) +set_iterator = type(iter(set())) +str_iterator = type(iter("")) +tuple_iterator = type(iter(())) +zip_iterator = type(iter(zip())) +## views ## +dict_keys = type({}.keys()) +dict_values = type({}.values()) +dict_items = type({}.items()) +## misc ## +mappingproxy = type(type.__dict__) +generator = type((lambda: (yield))()) +## coroutine ## +async def _coro(): pass +_coro = _coro() +coroutine = type(_coro) +_coro.close() # Prevent ResourceWarning +del _coro +## asynchronous generator ## +async def _ag(): yield +_ag = _ag() +async_generator = type(_ag) +del _ag + + +### ONE-TRICK PONIES ### + +def _check_methods(C, *methods): + mro = C.__mro__ + for method in methods: + for B in mro: + if method in B.__dict__: + if B.__dict__[method] is None: + return NotImplemented + break + else: + return NotImplemented + return True + +class Hashable(metaclass=ABCMeta): + + __slots__ = () + + @abstractmethod + def __hash__(self): + return 0 + + @classmethod + def __subclasshook__(cls, C): + if cls is Hashable: + return _check_methods(C, "__hash__") + return NotImplemented + + +class Awaitable(metaclass=ABCMeta): + + __slots__ = () + + @abstractmethod + def __await__(self): + yield + + @classmethod + def __subclasshook__(cls, C): + if cls is Awaitable: + return _check_methods(C, "__await__") + return NotImplemented + + +class Coroutine(Awaitable): + + __slots__ = () + + @abstractmethod + def send(self, value): + """Send a value into the coroutine. + Return next yielded value or raise StopIteration. + """ + raise StopIteration + + @abstractmethod + def throw(self, typ, val=None, tb=None): + """Raise an exception in the coroutine. + Return next yielded value or raise StopIteration. + """ + if val is None: + if tb is None: + raise typ + val = typ() + if tb is not None: + val = val.with_traceback(tb) + raise val + + def close(self): + """Raise GeneratorExit inside coroutine. + """ + try: + self.throw(GeneratorExit) + except (GeneratorExit, StopIteration): + pass + else: + raise RuntimeError("coroutine ignored GeneratorExit") + + @classmethod + def __subclasshook__(cls, C): + if cls is Coroutine: + return _check_methods(C, '__await__', 'send', 'throw', 'close') + return NotImplemented + + +Coroutine.register(coroutine) + + +class AsyncIterable(metaclass=ABCMeta): + + __slots__ = () + + @abstractmethod + def __aiter__(self): + return AsyncIterator() + + @classmethod + def __subclasshook__(cls, C): + if cls is AsyncIterable: + return _check_methods(C, "__aiter__") + return NotImplemented + + +class AsyncIterator(AsyncIterable): + + __slots__ = () + + @abstractmethod + async def __anext__(self): + """Return the next item or raise StopAsyncIteration when exhausted.""" + raise StopAsyncIteration + + def __aiter__(self): + return self + + @classmethod + def __subclasshook__(cls, C): + if cls is AsyncIterator: + return _check_methods(C, "__anext__", "__aiter__") + return NotImplemented + + +class AsyncGenerator(AsyncIterator): + + __slots__ = () + + async def __anext__(self): + """Return the next item from the asynchronous generator. + When exhausted, raise StopAsyncIteration. + """ + return await self.asend(None) + + @abstractmethod + async def asend(self, value): + """Send a value into the asynchronous generator. + Return next yielded value or raise StopAsyncIteration. + """ + raise StopAsyncIteration + + @abstractmethod + async def athrow(self, typ, val=None, tb=None): + """Raise an exception in the asynchronous generator. + Return next yielded value or raise StopAsyncIteration. + """ + if val is None: + if tb is None: + raise typ + val = typ() + if tb is not None: + val = val.with_traceback(tb) + raise val + + async def aclose(self): + """Raise GeneratorExit inside coroutine. + """ + try: + await self.athrow(GeneratorExit) + except (GeneratorExit, StopAsyncIteration): + pass + else: + raise RuntimeError("asynchronous generator ignored GeneratorExit") + + @classmethod + def __subclasshook__(cls, C): + if cls is AsyncGenerator: + return _check_methods(C, '__aiter__', '__anext__', + 'asend', 'athrow', 'aclose') + return NotImplemented + + +AsyncGenerator.register(async_generator) + + +class Iterable(metaclass=ABCMeta): + + __slots__ = () + + @abstractmethod + def __iter__(self): + while False: + yield None + + @classmethod + def __subclasshook__(cls, C): + if cls is Iterable: + return _check_methods(C, "__iter__") + return NotImplemented + + +class Iterator(Iterable): + + __slots__ = () + + @abstractmethod + def __next__(self): + 'Return the next item from the iterator. When exhausted, raise StopIteration' + raise StopIteration + + def __iter__(self): + return self + + @classmethod + def __subclasshook__(cls, C): + if cls is Iterator: + return _check_methods(C, '__iter__', '__next__') + return NotImplemented + +Iterator.register(bytes_iterator) +Iterator.register(bytearray_iterator) +#Iterator.register(callable_iterator) +Iterator.register(dict_keyiterator) +Iterator.register(dict_valueiterator) +Iterator.register(dict_itemiterator) +Iterator.register(list_iterator) +Iterator.register(list_reverseiterator) +Iterator.register(range_iterator) +Iterator.register(longrange_iterator) +Iterator.register(set_iterator) +Iterator.register(str_iterator) +Iterator.register(tuple_iterator) +Iterator.register(zip_iterator) + + +class Reversible(Iterable): + + __slots__ = () + + @abstractmethod + def __reversed__(self): + while False: + yield None + + @classmethod + def __subclasshook__(cls, C): + if cls is Reversible: + return _check_methods(C, "__reversed__", "__iter__") + return NotImplemented + + +class Generator(Iterator): + + __slots__ = () + + def __next__(self): + """Return the next item from the generator. + When exhausted, raise StopIteration. + """ + return self.send(None) + + @abstractmethod + def send(self, value): + """Send a value into the generator. + Return next yielded value or raise StopIteration. + """ + raise StopIteration + + @abstractmethod + def throw(self, typ, val=None, tb=None): + """Raise an exception in the generator. + Return next yielded value or raise StopIteration. + """ + if val is None: + if tb is None: + raise typ + val = typ() + if tb is not None: + val = val.with_traceback(tb) + raise val + + def close(self): + """Raise GeneratorExit inside generator. + """ + try: + self.throw(GeneratorExit) + except (GeneratorExit, StopIteration): + pass + else: + raise RuntimeError("generator ignored GeneratorExit") + + @classmethod + def __subclasshook__(cls, C): + if cls is Generator: + return _check_methods(C, '__iter__', '__next__', + 'send', 'throw', 'close') + return NotImplemented + +Generator.register(generator) + + +class Sized(metaclass=ABCMeta): + + __slots__ = () + + @abstractmethod + def __len__(self): + return 0 + + @classmethod + def __subclasshook__(cls, C): + if cls is Sized: + return _check_methods(C, "__len__") + return NotImplemented + + +class Container(metaclass=ABCMeta): + + __slots__ = () + + @abstractmethod + def __contains__(self, x): + return False + + @classmethod + def __subclasshook__(cls, C): + if cls is Container: + return _check_methods(C, "__contains__") + return NotImplemented + +class Collection(Sized, Iterable, Container): + + __slots__ = () + + @classmethod + def __subclasshook__(cls, C): + if cls is Collection: + return _check_methods(C, "__len__", "__iter__", "__contains__") + return NotImplemented + +class Callable(metaclass=ABCMeta): + + __slots__ = () + + @abstractmethod + def __call__(self, *args, **kwds): + return False + + @classmethod + def __subclasshook__(cls, C): + if cls is Callable: + return _check_methods(C, "__call__") + return NotImplemented + + +### SETS ### + + +class Set(Collection): + + """A set is a finite, iterable container. + + This class provides concrete generic implementations of all + methods except for __contains__, __iter__ and __len__. + + To override the comparisons (presumably for speed, as the + semantics are fixed), redefine __le__ and __ge__, + then the other operations will automatically follow suit. + """ + + __slots__ = () + + def __le__(self, other): + if not isinstance(other, Set): + return NotImplemented + if len(self) > len(other): + return False + for elem in self: + if elem not in other: + return False + return True + + def __lt__(self, other): + if not isinstance(other, Set): + return NotImplemented + return len(self) < len(other) and self.__le__(other) + + def __gt__(self, other): + if not isinstance(other, Set): + return NotImplemented + return len(self) > len(other) and self.__ge__(other) + + def __ge__(self, other): + if not isinstance(other, Set): + return NotImplemented + if len(self) < len(other): + return False + for elem in other: + if elem not in self: + return False + return True + + def __eq__(self, other): + if not isinstance(other, Set): + return NotImplemented + return len(self) == len(other) and self.__le__(other) + + @classmethod + def _from_iterable(cls, it): + '''Construct an instance of the class from any iterable input. + + Must override this method if the class constructor signature + does not accept an iterable for an input. + ''' + return cls(it) + + def __and__(self, other): + if not isinstance(other, Iterable): + return NotImplemented + return self._from_iterable(value for value in other if value in self) + + __rand__ = __and__ + + def isdisjoint(self, other): + 'Return True if two sets have a null intersection.' + for value in other: + if value in self: + return False + return True + + def __or__(self, other): + if not isinstance(other, Iterable): + return NotImplemented + chain = (e for s in (self, other) for e in s) + return self._from_iterable(chain) + + __ror__ = __or__ + + def __sub__(self, other): + if not isinstance(other, Set): + if not isinstance(other, Iterable): + return NotImplemented + other = self._from_iterable(other) + return self._from_iterable(value for value in self + if value not in other) + + def __rsub__(self, other): + if not isinstance(other, Set): + if not isinstance(other, Iterable): + return NotImplemented + other = self._from_iterable(other) + return self._from_iterable(value for value in other + if value not in self) + + def __xor__(self, other): + if not isinstance(other, Set): + if not isinstance(other, Iterable): + return NotImplemented + other = self._from_iterable(other) + return (self - other) | (other - self) + + __rxor__ = __xor__ + + def _hash(self): + """Compute the hash value of a set. + + Note that we don't define __hash__: not all sets are hashable. + But if you define a hashable set type, its __hash__ should + call this function. + + This must be compatible __eq__. + + All sets ought to compare equal if they contain the same + elements, regardless of how they are implemented, and + regardless of the order of the elements; so there's not much + freedom for __eq__ or __hash__. We match the algorithm used + by the built-in frozenset type. + """ + MAX = sys.maxsize + MASK = 2 * MAX + 1 + n = len(self) + h = 1927868237 * (n + 1) + h &= MASK + for x in self: + hx = hash(x) + h ^= (hx ^ (hx << 16) ^ 89869747) * 3644798167 + h &= MASK + h = h * 69069 + 907133923 + h &= MASK + if h > MAX: + h -= MASK + 1 + if h == -1: + h = 590923713 + return h + +Set.register(frozenset) + + +class MutableSet(Set): + """A mutable set is a finite, iterable container. + + This class provides concrete generic implementations of all + methods except for __contains__, __iter__, __len__, + add(), and discard(). + + To override the comparisons (presumably for speed, as the + semantics are fixed), all you have to do is redefine __le__ and + then the other operations will automatically follow suit. + """ + + __slots__ = () + + @abstractmethod + def add(self, value): + """Add an element.""" + raise NotImplementedError + + @abstractmethod + def discard(self, value): + """Remove an element. Do not raise an exception if absent.""" + raise NotImplementedError + + def remove(self, value): + """Remove an element. If not a member, raise a KeyError.""" + if value not in self: + raise KeyError(value) + self.discard(value) + + def pop(self): + """Return the popped value. Raise KeyError if empty.""" + it = iter(self) + try: + value = next(it) + except StopIteration: + raise KeyError from None + self.discard(value) + return value + + def clear(self): + """This is slow (creates N new iterators!) but effective.""" + try: + while True: + self.pop() + except KeyError: + pass + + def __ior__(self, it): + for value in it: + self.add(value) + return self + + def __iand__(self, it): + for value in (self - it): + self.discard(value) + return self + + def __ixor__(self, it): + if it is self: + self.clear() + else: + if not isinstance(it, Set): + it = self._from_iterable(it) + for value in it: + if value in self: + self.discard(value) + else: + self.add(value) + return self + + def __isub__(self, it): + if it is self: + self.clear() + else: + for value in it: + self.discard(value) + return self + +MutableSet.register(set) + + +### MAPPINGS ### + + +class Mapping(Collection): + + __slots__ = () + + """A Mapping is a generic container for associating key/value + pairs. + + This class provides concrete generic implementations of all + methods except for __getitem__, __iter__, and __len__. + + """ + + @abstractmethod + def __getitem__(self, key): + raise KeyError + + def get(self, key, default=None): + 'D.get(k[,d]) -> D[k] if k in D, else d. d defaults to None.' + try: + return self[key] + except KeyError: + return default + + def __contains__(self, key): + try: + self[key] + except KeyError: + return False + else: + return True + + def keys(self): + "D.keys() -> a set-like object providing a view on D's keys" + return KeysView(self) + + def items(self): + "D.items() -> a set-like object providing a view on D's items" + return ItemsView(self) + + def values(self): + "D.values() -> an object providing a view on D's values" + return ValuesView(self) + + def __eq__(self, other): + if not isinstance(other, Mapping): + return NotImplemented + return dict(self.items()) == dict(other.items()) + + __reversed__ = None + +Mapping.register(mappingproxy) + + +class MappingView(Sized): + + __slots__ = '_mapping', + + def __init__(self, mapping): + self._mapping = mapping + + def __len__(self): + return len(self._mapping) + + def __repr__(self): + return '{0.__class__.__name__}({0._mapping!r})'.format(self) + + +class KeysView(MappingView, Set): + + __slots__ = () + + @classmethod + def _from_iterable(self, it): + return set(it) + + def __contains__(self, key): + return key in self._mapping + + def __iter__(self): + yield from self._mapping + +KeysView.register(dict_keys) + + +class ItemsView(MappingView, Set): + + __slots__ = () + + @classmethod + def _from_iterable(self, it): + return set(it) + + def __contains__(self, item): + key, value = item + try: + v = self._mapping[key] + except KeyError: + return False + else: + return v is value or v == value + + def __iter__(self): + for key in self._mapping: + yield (key, self._mapping[key]) + +ItemsView.register(dict_items) + + +class ValuesView(MappingView, Collection): + + __slots__ = () + + def __contains__(self, value): + for key in self._mapping: + v = self._mapping[key] + if v is value or v == value: + return True + return False + + def __iter__(self): + for key in self._mapping: + yield self._mapping[key] + +ValuesView.register(dict_values) + + +class MutableMapping(Mapping): + + __slots__ = () + + """A MutableMapping is a generic container for associating + key/value pairs. + + This class provides concrete generic implementations of all + methods except for __getitem__, __setitem__, __delitem__, + __iter__, and __len__. + + """ + + @abstractmethod + def __setitem__(self, key, value): + raise KeyError + + @abstractmethod + def __delitem__(self, key): + raise KeyError + + __marker = object() + + def pop(self, key, default=__marker): + '''D.pop(k[,d]) -> v, remove specified key and return the corresponding value. + If key is not found, d is returned if given, otherwise KeyError is raised. + ''' + try: + value = self[key] + except KeyError: + if default is self.__marker: + raise + return default + else: + del self[key] + return value + + def popitem(self): + '''D.popitem() -> (k, v), remove and return some (key, value) pair + as a 2-tuple; but raise KeyError if D is empty. + ''' + try: + key = next(iter(self)) + except StopIteration: + raise KeyError from None + value = self[key] + del self[key] + return key, value + + def clear(self): + 'D.clear() -> None. Remove all items from D.' + try: + while True: + self.popitem() + except KeyError: + pass + + def update(*args, **kwds): + ''' D.update([E, ]**F) -> None. Update D from mapping/iterable E and F. + If E present and has a .keys() method, does: for k in E: D[k] = E[k] + If E present and lacks .keys() method, does: for (k, v) in E: D[k] = v + In either case, this is followed by: for k, v in F.items(): D[k] = v + ''' + if not args: + raise TypeError("descriptor 'update' of 'MutableMapping' object " + "needs an argument") + self, *args = args + if len(args) > 1: + raise TypeError('update expected at most 1 arguments, got %d' % + len(args)) + if args: + other = args[0] + if isinstance(other, Mapping): + 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 + + def setdefault(self, key, default=None): + 'D.setdefault(k[,d]) -> D.get(k,d), also set D[k]=d if k not in D' + try: + return self[key] + except KeyError: + self[key] = default + return default + +MutableMapping.register(dict) + + +### SEQUENCES ### + + +class Sequence(Reversible, Collection): + + """All the operations on a read-only sequence. + + Concrete subclasses must override __new__ or __init__, + __getitem__, and __len__. + """ + + __slots__ = () + + @abstractmethod + def __getitem__(self, index): + raise IndexError + + def __iter__(self): + i = 0 + try: + while True: + v = self[i] + yield v + i += 1 + except IndexError: + return + + def __contains__(self, value): + for v in self: + if v is value or v == value: + return True + return False + + def __reversed__(self): + for i in reversed(range(len(self))): + yield self[i] + + def index(self, value, start=0, stop=None): + '''S.index(value, [start, [stop]]) -> integer -- return first index of value. + Raises ValueError if the value is not present. + + Supporting start and stop arguments is optional, but + recommended. + ''' + if start is not None and start < 0: + start = max(len(self) + start, 0) + if stop is not None and stop < 0: + stop += len(self) + + i = start + while stop is None or i < stop: + try: + v = self[i] + if v is value or v == value: + return i + except IndexError: + break + i += 1 + raise ValueError + + def count(self, value): + 'S.count(value) -> integer -- return number of occurrences of value' + return sum(1 for v in self if v is value or v == value) + +Sequence.register(tuple) +Sequence.register(str) +Sequence.register(range) +Sequence.register(memoryview) + + +class ByteString(Sequence): + + """This unifies bytes and bytearray. + + XXX Should add all their methods. + """ + + __slots__ = () + +ByteString.register(bytes) +ByteString.register(bytearray) + + +class MutableSequence(Sequence): + + __slots__ = () + + """All the operations on a read-write sequence. + + Concrete subclasses must provide __new__ or __init__, + __getitem__, __setitem__, __delitem__, __len__, and insert(). + + """ + + @abstractmethod + def __setitem__(self, index, value): + raise IndexError + + @abstractmethod + def __delitem__(self, index): + raise IndexError + + @abstractmethod + def insert(self, index, value): + 'S.insert(index, value) -- insert value before index' + raise IndexError + + def append(self, value): + 'S.append(value) -- append value to the end of the sequence' + self.insert(len(self), value) + + def clear(self): + 'S.clear() -> None -- remove all items from S' + try: + while True: + self.pop() + except IndexError: + pass + + def reverse(self): + 'S.reverse() -- reverse *IN PLACE*' + n = len(self) + for i in range(n//2): + self[i], self[n-i-1] = self[n-i-1], self[i] + + def extend(self, values): + 'S.extend(iterable) -- extend sequence by appending elements from the iterable' + for v in values: + self.append(v) + + def pop(self, index=-1): + '''S.pop([index]) -> item -- remove and return item at index (default last). + Raise IndexError if list is empty or index is out of range. + ''' + v = self[index] + del self[index] + return v + + def remove(self, value): + '''S.remove(value) -- remove first occurrence of value. + Raise ValueError if the value is not present. + ''' + del self[self.index(value)] + + def __iadd__(self, values): + self.extend(values) + return self + +MutableSequence.register(list) +MutableSequence.register(bytearray) # Multiply inheriting, see ByteString diff --git a/env/Lib/_dummy_thread.py b/env/Lib/_dummy_thread.py new file mode 100644 index 0000000..2e46a07 --- /dev/null +++ b/env/Lib/_dummy_thread.py @@ -0,0 +1,193 @@ +"""Drop-in replacement for the thread module. + +Meant to be used as a brain-dead substitute so that threaded code does +not need to be rewritten for when the thread module is not present. + +Suggested usage is:: + + try: + import _thread + except ImportError: + import _dummy_thread as _thread + +""" +# Exports only things specified by thread documentation; +# skipping obsolete synonyms allocate(), start_new(), exit_thread(). +__all__ = ['error', 'start_new_thread', 'exit', 'get_ident', 'allocate_lock', + 'interrupt_main', 'LockType', 'RLock'] + +# A dummy value +TIMEOUT_MAX = 2**31 + +# NOTE: this module can be imported early in the extension building process, +# and so top level imports of other modules should be avoided. Instead, all +# imports are done when needed on a function-by-function basis. Since threads +# are disabled, the import lock should not be an issue anyway (??). + +error = RuntimeError + +def start_new_thread(function, args, kwargs={}): + """Dummy implementation of _thread.start_new_thread(). + + Compatibility is maintained by making sure that ``args`` is a + tuple and ``kwargs`` is a dictionary. If an exception is raised + and it is SystemExit (which can be done by _thread.exit()) it is + caught and nothing is done; all other exceptions are printed out + by using traceback.print_exc(). + + If the executed function calls interrupt_main the KeyboardInterrupt will be + raised when the function returns. + + """ + if type(args) != type(tuple()): + raise TypeError("2nd arg must be a tuple") + if type(kwargs) != type(dict()): + raise TypeError("3rd arg must be a dict") + global _main + _main = False + try: + function(*args, **kwargs) + except SystemExit: + pass + except: + import traceback + traceback.print_exc() + _main = True + global _interrupt + if _interrupt: + _interrupt = False + raise KeyboardInterrupt + +def exit(): + """Dummy implementation of _thread.exit().""" + raise SystemExit + +def get_ident(): + """Dummy implementation of _thread.get_ident(). + + Since this module should only be used when _threadmodule is not + available, it is safe to assume that the current process is the + only thread. Thus a constant can be safely returned. + """ + return 1 + +def allocate_lock(): + """Dummy implementation of _thread.allocate_lock().""" + return LockType() + +def stack_size(size=None): + """Dummy implementation of _thread.stack_size().""" + if size is not None: + raise error("setting thread stack size not supported") + return 0 + +def _set_sentinel(): + """Dummy implementation of _thread._set_sentinel().""" + return LockType() + +class LockType(object): + """Class implementing dummy implementation of _thread.LockType. + + Compatibility is maintained by maintaining self.locked_status + which is a boolean that stores the state of the lock. Pickling of + the lock, though, should not be done since if the _thread module is + then used with an unpickled ``lock()`` from here problems could + occur from this class not having atomic methods. + + """ + + def __init__(self): + self.locked_status = False + + def acquire(self, waitflag=None, timeout=-1): + """Dummy implementation of acquire(). + + For blocking calls, self.locked_status is automatically set to + True and returned appropriately based on value of + ``waitflag``. If it is non-blocking, then the value is + actually checked and not set if it is already acquired. This + is all done so that threading.Condition's assert statements + aren't triggered and throw a little fit. + + """ + if waitflag is None or waitflag: + self.locked_status = True + return True + else: + if not self.locked_status: + self.locked_status = True + return True + else: + if timeout > 0: + import time + time.sleep(timeout) + return False + + __enter__ = acquire + + def __exit__(self, typ, val, tb): + self.release() + + def release(self): + """Release the dummy lock.""" + # XXX Perhaps shouldn't actually bother to test? Could lead + # to problems for complex, threaded code. + if not self.locked_status: + raise error + self.locked_status = False + return True + + def locked(self): + return self.locked_status + + def __repr__(self): + return "<%s %s.%s object at %s>" % ( + "locked" if self.locked_status else "unlocked", + self.__class__.__module__, + self.__class__.__qualname__, + hex(id(self)) + ) + + +class RLock(LockType): + """Dummy implementation of threading._RLock. + + Re-entrant lock can be aquired multiple times and needs to be released + just as many times. This dummy implemention does not check wheter the + current thread actually owns the lock, but does accounting on the call + counts. + """ + def __init__(self): + super().__init__() + self._levels = 0 + + def acquire(self, waitflag=None, timeout=-1): + """Aquire the lock, can be called multiple times in succession. + """ + locked = super().acquire(waitflag, timeout) + if locked: + self._levels += 1 + return locked + + def release(self): + """Release needs to be called once for every call to acquire(). + """ + if self._levels == 0: + raise error + if self._levels == 1: + super().release() + self._levels -= 1 + +# Used to signal that interrupt_main was called in a "thread" +_interrupt = False +# True when not executing in a "thread" +_main = True + +def interrupt_main(): + """Set _interrupt flag to True to have start_new_thread raise + KeyboardInterrupt upon exiting.""" + if _main: + raise KeyboardInterrupt + else: + global _interrupt + _interrupt = True diff --git a/env/Lib/_weakrefset.py b/env/Lib/_weakrefset.py new file mode 100644 index 0000000..304c66f --- /dev/null +++ b/env/Lib/_weakrefset.py @@ -0,0 +1,196 @@ +# Access WeakSet through the weakref module. +# This code is separated-out because it is needed +# by abc.py to load everything else at startup. + +from _weakref import ref + +__all__ = ['WeakSet'] + + +class _IterationGuard: + # This context manager registers itself in the current iterators of the + # weak container, such as to delay all removals until the context manager + # exits. + # This technique should be relatively thread-safe (since sets are). + + def __init__(self, weakcontainer): + # Don't create cycles + self.weakcontainer = ref(weakcontainer) + + def __enter__(self): + w = self.weakcontainer() + if w is not None: + w._iterating.add(self) + return self + + def __exit__(self, e, t, b): + w = self.weakcontainer() + if w is not None: + s = w._iterating + s.remove(self) + if not s: + w._commit_removals() + + +class WeakSet: + def __init__(self, data=None): + self.data = set() + def _remove(item, selfref=ref(self)): + self = selfref() + if self is not None: + if self._iterating: + self._pending_removals.append(item) + else: + self.data.discard(item) + self._remove = _remove + # A list of keys to be removed + self._pending_removals = [] + self._iterating = set() + if data is not None: + self.update(data) + + def _commit_removals(self): + l = self._pending_removals + discard = self.data.discard + while l: + discard(l.pop()) + + def __iter__(self): + with _IterationGuard(self): + for itemref in self.data: + item = itemref() + if item is not None: + # Caveat: the iterator will keep a strong reference to + # `item` until it is resumed or closed. + yield item + + def __len__(self): + return len(self.data) - len(self._pending_removals) + + def __contains__(self, item): + try: + wr = ref(item) + except TypeError: + return False + return wr in self.data + + def __reduce__(self): + return (self.__class__, (list(self),), + getattr(self, '__dict__', None)) + + def add(self, item): + if self._pending_removals: + self._commit_removals() + self.data.add(ref(item, self._remove)) + + def clear(self): + if self._pending_removals: + self._commit_removals() + self.data.clear() + + def copy(self): + return self.__class__(self) + + def pop(self): + if self._pending_removals: + self._commit_removals() + while True: + try: + itemref = self.data.pop() + except KeyError: + raise KeyError('pop from empty WeakSet') from None + item = itemref() + if item is not None: + return item + + def remove(self, item): + if self._pending_removals: + self._commit_removals() + self.data.remove(ref(item)) + + def discard(self, item): + if self._pending_removals: + self._commit_removals() + self.data.discard(ref(item)) + + def update(self, other): + if self._pending_removals: + self._commit_removals() + for element in other: + self.add(element) + + def __ior__(self, other): + self.update(other) + return self + + def difference(self, other): + newset = self.copy() + newset.difference_update(other) + return newset + __sub__ = difference + + def difference_update(self, other): + self.__isub__(other) + def __isub__(self, other): + if self._pending_removals: + self._commit_removals() + if self is other: + self.data.clear() + else: + self.data.difference_update(ref(item) for item in other) + return self + + def intersection(self, other): + return self.__class__(item for item in other if item in self) + __and__ = intersection + + def intersection_update(self, other): + self.__iand__(other) + def __iand__(self, other): + if self._pending_removals: + self._commit_removals() + self.data.intersection_update(ref(item) for item in other) + return self + + def issubset(self, other): + return self.data.issubset(ref(item) for item in other) + __le__ = issubset + + def __lt__(self, other): + return self.data < set(map(ref, other)) + + def issuperset(self, other): + return self.data.issuperset(ref(item) for item in other) + __ge__ = issuperset + + def __gt__(self, other): + return self.data > set(map(ref, other)) + + def __eq__(self, other): + if not isinstance(other, self.__class__): + return NotImplemented + return self.data == set(map(ref, other)) + + def symmetric_difference(self, other): + newset = self.copy() + newset.symmetric_difference_update(other) + return newset + __xor__ = symmetric_difference + + def symmetric_difference_update(self, other): + self.__ixor__(other) + def __ixor__(self, other): + if self._pending_removals: + self._commit_removals() + if self is other: + self.data.clear() + else: + self.data.symmetric_difference_update(ref(item, self._remove) for item in other) + return self + + def union(self, other): + return self.__class__(e for s in (self, other) for e in s) + __or__ = union + + def isdisjoint(self, other): + return len(self.intersection(other)) == 0 diff --git a/env/Lib/abc.py b/env/Lib/abc.py new file mode 100644 index 0000000..7094141 --- /dev/null +++ b/env/Lib/abc.py @@ -0,0 +1,170 @@ +# Copyright 2007 Google, Inc. All Rights Reserved. +# Licensed to PSF under a Contributor Agreement. + +"""Abstract Base Classes (ABCs) according to PEP 3119.""" + + +def abstractmethod(funcobj): + """A decorator indicating abstract methods. + + Requires that the metaclass is ABCMeta or derived from it. A + class that has a metaclass derived from ABCMeta cannot be + instantiated unless all of its abstract methods are overridden. + The abstract methods can be called using any of the normal + 'super' call mechanisms. + + Usage: + + class C(metaclass=ABCMeta): + @abstractmethod + def my_abstract_method(self, ...): + ... + """ + funcobj.__isabstractmethod__ = True + return funcobj + + +class abstractclassmethod(classmethod): + """A decorator indicating abstract classmethods. + + Similar to abstractmethod. + + Usage: + + class C(metaclass=ABCMeta): + @abstractclassmethod + def my_abstract_classmethod(cls, ...): + ... + + 'abstractclassmethod' is deprecated. Use 'classmethod' with + 'abstractmethod' instead. + """ + + __isabstractmethod__ = True + + def __init__(self, callable): + callable.__isabstractmethod__ = True + super().__init__(callable) + + +class abstractstaticmethod(staticmethod): + """A decorator indicating abstract staticmethods. + + Similar to abstractmethod. + + Usage: + + class C(metaclass=ABCMeta): + @abstractstaticmethod + def my_abstract_staticmethod(...): + ... + + 'abstractstaticmethod' is deprecated. Use 'staticmethod' with + 'abstractmethod' instead. + """ + + __isabstractmethod__ = True + + def __init__(self, callable): + callable.__isabstractmethod__ = True + super().__init__(callable) + + +class abstractproperty(property): + """A decorator indicating abstract properties. + + Requires that the metaclass is ABCMeta or derived from it. A + class that has a metaclass derived from ABCMeta cannot be + instantiated unless all of its abstract properties are overridden. + The abstract properties can be called using any of the normal + 'super' call mechanisms. + + Usage: + + class C(metaclass=ABCMeta): + @abstractproperty + def my_abstract_property(self): + ... + + This defines a read-only property; you can also define a read-write + abstract property using the 'long' form of property declaration: + + class C(metaclass=ABCMeta): + def getx(self): ... + def setx(self, value): ... + x = abstractproperty(getx, setx) + + 'abstractproperty' is deprecated. Use 'property' with 'abstractmethod' + instead. + """ + + __isabstractmethod__ = True + + +try: + from _abc import (get_cache_token, _abc_init, _abc_register, + _abc_instancecheck, _abc_subclasscheck, _get_dump, + _reset_registry, _reset_caches) +except ImportError: + from _py_abc import ABCMeta, get_cache_token + ABCMeta.__module__ = 'abc' +else: + class ABCMeta(type): + """Metaclass for defining Abstract Base Classes (ABCs). + + Use this metaclass to create an ABC. An ABC can be subclassed + directly, and then acts as a mix-in class. You can also register + unrelated concrete classes (even built-in classes) and unrelated + ABCs as 'virtual subclasses' -- these and their descendants will + be considered subclasses of the registering ABC by the built-in + issubclass() function, but the registering ABC won't show up in + their MRO (Method Resolution Order) nor will method + implementations defined by the registering ABC be callable (not + even via super()). + """ + def __new__(mcls, name, bases, namespace, **kwargs): + cls = super().__new__(mcls, name, bases, namespace, **kwargs) + _abc_init(cls) + return cls + + def register(cls, subclass): + """Register a virtual subclass of an ABC. + + Returns the subclass, to allow usage as a class decorator. + """ + return _abc_register(cls, subclass) + + def __instancecheck__(cls, instance): + """Override for isinstance(instance, cls).""" + return _abc_instancecheck(cls, instance) + + def __subclasscheck__(cls, subclass): + """Override for issubclass(subclass, cls).""" + return _abc_subclasscheck(cls, subclass) + + def _dump_registry(cls, file=None): + """Debug helper to print the ABC registry.""" + print(f"Class: {cls.__module__}.{cls.__qualname__}", file=file) + print(f"Inv. counter: {get_cache_token()}", file=file) + (_abc_registry, _abc_cache, _abc_negative_cache, + _abc_negative_cache_version) = _get_dump(cls) + print(f"_abc_registry: {_abc_registry!r}", file=file) + print(f"_abc_cache: {_abc_cache!r}", file=file) + print(f"_abc_negative_cache: {_abc_negative_cache!r}", file=file) + print(f"_abc_negative_cache_version: {_abc_negative_cache_version!r}", + file=file) + + def _abc_registry_clear(cls): + """Clear the registry (for debugging or testing).""" + _reset_registry(cls) + + def _abc_caches_clear(cls): + """Clear the caches (for debugging or testing).""" + _reset_caches(cls) + + +class ABC(metaclass=ABCMeta): + """Helper class that provides a standard way to create an ABC using + inheritance. + """ + __slots__ = () diff --git a/env/Lib/base64.py b/env/Lib/base64.py new file mode 100644 index 0000000..2be9c39 --- /dev/null +++ b/env/Lib/base64.py @@ -0,0 +1,595 @@ +#! /usr/bin/env python3 + +"""Base16, Base32, Base64 (RFC 3548), Base85 and Ascii85 data encodings""" + +# Modified 04-Oct-1995 by Jack Jansen to use binascii module +# Modified 30-Dec-2003 by Barry Warsaw to add full RFC 3548 support +# Modified 22-May-2007 by Guido van Rossum to use bytes everywhere + +import re +import struct +import binascii + + +__all__ = [ + # Legacy interface exports traditional RFC 2045 Base64 encodings + 'encode', 'decode', 'encodebytes', 'decodebytes', + # Generalized interface for other encodings + 'b64encode', 'b64decode', 'b32encode', 'b32decode', + 'b16encode', 'b16decode', + # Base85 and Ascii85 encodings + 'b85encode', 'b85decode', 'a85encode', 'a85decode', + # Standard Base64 encoding + 'standard_b64encode', 'standard_b64decode', + # Some common Base64 alternatives. As referenced by RFC 3458, see thread + # starting at: + # + # http://zgp.org/pipermail/p2p-hackers/2001-September/000316.html + 'urlsafe_b64encode', 'urlsafe_b64decode', + ] + + +bytes_types = (bytes, bytearray) # Types acceptable as binary data + +def _bytes_from_decode_data(s): + if isinstance(s, str): + try: + return s.encode('ascii') + except UnicodeEncodeError: + raise ValueError('string argument should contain only ASCII characters') + if isinstance(s, bytes_types): + return s + try: + return memoryview(s).tobytes() + except TypeError: + raise TypeError("argument should be a bytes-like object or ASCII " + "string, not %r" % s.__class__.__name__) from None + + +# Base64 encoding/decoding uses binascii + +def b64encode(s, altchars=None): + """Encode the bytes-like object s using Base64 and return a bytes object. + + Optional altchars should be a byte string of length 2 which specifies an + alternative alphabet for the '+' and '/' characters. This allows an + application to e.g. generate url or filesystem safe Base64 strings. + """ + encoded = binascii.b2a_base64(s, newline=False) + if altchars is not None: + assert len(altchars) == 2, repr(altchars) + return encoded.translate(bytes.maketrans(b'+/', altchars)) + return encoded + + +def b64decode(s, altchars=None, validate=False): + """Decode the Base64 encoded bytes-like object or ASCII string s. + + Optional altchars must be a bytes-like object or ASCII string of length 2 + which specifies the alternative alphabet used instead of the '+' and '/' + characters. + + The result is returned as a bytes object. A binascii.Error is raised if + s is incorrectly padded. + + If validate is False (the default), characters that are neither in the + normal base-64 alphabet nor the alternative alphabet are discarded prior + to the padding check. If validate is True, these non-alphabet characters + in the input result in a binascii.Error. + """ + s = _bytes_from_decode_data(s) + if altchars is not None: + altchars = _bytes_from_decode_data(altchars) + assert len(altchars) == 2, repr(altchars) + s = s.translate(bytes.maketrans(altchars, b'+/')) + if validate and not re.match(b'^[A-Za-z0-9+/]*={0,2}$', s): + raise binascii.Error('Non-base64 digit found') + return binascii.a2b_base64(s) + + +def standard_b64encode(s): + """Encode bytes-like object s using the standard Base64 alphabet. + + The result is returned as a bytes object. + """ + return b64encode(s) + +def standard_b64decode(s): + """Decode bytes encoded with the standard Base64 alphabet. + + Argument s is a bytes-like object or ASCII string to decode. The result + is returned as a bytes object. A binascii.Error is raised if the input + is incorrectly padded. Characters that are not in the standard alphabet + are discarded prior to the padding check. + """ + return b64decode(s) + + +_urlsafe_encode_translation = bytes.maketrans(b'+/', b'-_') +_urlsafe_decode_translation = bytes.maketrans(b'-_', b'+/') + +def urlsafe_b64encode(s): + """Encode bytes using the URL- and filesystem-safe Base64 alphabet. + + Argument s is a bytes-like object to encode. The result is returned as a + bytes object. The alphabet uses '-' instead of '+' and '_' instead of + '/'. + """ + return b64encode(s).translate(_urlsafe_encode_translation) + +def urlsafe_b64decode(s): + """Decode bytes using the URL- and filesystem-safe Base64 alphabet. + + Argument s is a bytes-like object or ASCII string to decode. The result + is returned as a bytes object. A binascii.Error is raised if the input + is incorrectly padded. Characters that are not in the URL-safe base-64 + alphabet, and are not a plus '+' or slash '/', are discarded prior to the + padding check. + + The alphabet uses '-' instead of '+' and '_' instead of '/'. + """ + s = _bytes_from_decode_data(s) + s = s.translate(_urlsafe_decode_translation) + return b64decode(s) + + + +# Base32 encoding/decoding must be done in Python +_b32alphabet = b'ABCDEFGHIJKLMNOPQRSTUVWXYZ234567' +_b32tab2 = None +_b32rev = None + +def b32encode(s): + """Encode the bytes-like object s using Base32 and return a bytes object. + """ + global _b32tab2 + # Delay the initialization of the table to not waste memory + # if the function is never called + if _b32tab2 is None: + b32tab = [bytes((i,)) for i in _b32alphabet] + _b32tab2 = [a + b for a in b32tab for b in b32tab] + b32tab = None + + if not isinstance(s, bytes_types): + s = memoryview(s).tobytes() + leftover = len(s) % 5 + # Pad the last quantum with zero bits if necessary + if leftover: + s = s + b'\0' * (5 - leftover) # Don't use += ! + encoded = bytearray() + from_bytes = int.from_bytes + b32tab2 = _b32tab2 + for i in range(0, len(s), 5): + c = from_bytes(s[i: i + 5], 'big') + encoded += (b32tab2[c >> 30] + # bits 1 - 10 + b32tab2[(c >> 20) & 0x3ff] + # bits 11 - 20 + b32tab2[(c >> 10) & 0x3ff] + # bits 21 - 30 + b32tab2[c & 0x3ff] # bits 31 - 40 + ) + # Adjust for any leftover partial quanta + if leftover == 1: + encoded[-6:] = b'======' + elif leftover == 2: + encoded[-4:] = b'====' + elif leftover == 3: + encoded[-3:] = b'===' + elif leftover == 4: + encoded[-1:] = b'=' + return bytes(encoded) + +def b32decode(s, casefold=False, map01=None): + """Decode the Base32 encoded bytes-like object or ASCII string s. + + Optional casefold is a flag specifying whether a lowercase alphabet is + acceptable as input. For security purposes, the default is False. + + RFC 3548 allows for optional mapping of the digit 0 (zero) to the + letter O (oh), and for optional mapping of the digit 1 (one) to + either the letter I (eye) or letter L (el). The optional argument + map01 when not None, specifies which letter the digit 1 should be + mapped to (when map01 is not None, the digit 0 is always mapped to + the letter O). For security purposes the default is None, so that + 0 and 1 are not allowed in the input. + + The result is returned as a bytes object. A binascii.Error is raised if + the input is incorrectly padded or if there are non-alphabet + characters present in the input. + """ + global _b32rev + # Delay the initialization of the table to not waste memory + # if the function is never called + if _b32rev is None: + _b32rev = {v: k for k, v in enumerate(_b32alphabet)} + s = _bytes_from_decode_data(s) + if len(s) % 8: + raise binascii.Error('Incorrect padding') + # Handle section 2.4 zero and one mapping. The flag map01 will be either + # False, or the character to map the digit 1 (one) to. It should be + # either L (el) or I (eye). + if map01 is not None: + map01 = _bytes_from_decode_data(map01) + assert len(map01) == 1, repr(map01) + s = s.translate(bytes.maketrans(b'01', b'O' + map01)) + if casefold: + s = s.upper() + # Strip off pad characters from the right. We need to count the pad + # characters because this will tell us how many null bytes to remove from + # the end of the decoded string. + l = len(s) + s = s.rstrip(b'=') + padchars = l - len(s) + # Now decode the full quanta + decoded = bytearray() + b32rev = _b32rev + for i in range(0, len(s), 8): + quanta = s[i: i + 8] + acc = 0 + try: + for c in quanta: + acc = (acc << 5) + b32rev[c] + except KeyError: + raise binascii.Error('Non-base32 digit found') from None + decoded += acc.to_bytes(5, 'big') + # Process the last, partial quanta + if l % 8 or padchars not in {0, 1, 3, 4, 6}: + raise binascii.Error('Incorrect padding') + if padchars and decoded: + acc <<= 5 * padchars + last = acc.to_bytes(5, 'big') + leftover = (43 - 5 * padchars) // 8 # 1: 4, 3: 3, 4: 2, 6: 1 + decoded[-5:] = last[:leftover] + return bytes(decoded) + + +# RFC 3548, Base 16 Alphabet specifies uppercase, but hexlify() returns +# lowercase. The RFC also recommends against accepting input case +# insensitively. +def b16encode(s): + """Encode the bytes-like object s using Base16 and return a bytes object. + """ + return binascii.hexlify(s).upper() + + +def b16decode(s, casefold=False): + """Decode the Base16 encoded bytes-like object or ASCII string s. + + Optional casefold is a flag specifying whether a lowercase alphabet is + acceptable as input. For security purposes, the default is False. + + The result is returned as a bytes object. A binascii.Error is raised if + s is incorrectly padded or if there are non-alphabet characters present + in the input. + """ + s = _bytes_from_decode_data(s) + if casefold: + s = s.upper() + if re.search(b'[^0-9A-F]', s): + raise binascii.Error('Non-base16 digit found') + return binascii.unhexlify(s) + +# +# Ascii85 encoding/decoding +# + +_a85chars = None +_a85chars2 = None +_A85START = b"<~" +_A85END = b"~>" + +def _85encode(b, chars, chars2, pad=False, foldnuls=False, foldspaces=False): + # Helper function for a85encode and b85encode + if not isinstance(b, bytes_types): + b = memoryview(b).tobytes() + + padding = (-len(b)) % 4 + if padding: + b = b + b'\0' * padding + words = struct.Struct('!%dI' % (len(b) // 4)).unpack(b) + + chunks = [b'z' if foldnuls and not word else + b'y' if foldspaces and word == 0x20202020 else + (chars2[word // 614125] + + chars2[word // 85 % 7225] + + chars[word % 85]) + for word in words] + + if padding and not pad: + if chunks[-1] == b'z': + chunks[-1] = chars[0] * 5 + chunks[-1] = chunks[-1][:-padding] + + return b''.join(chunks) + +def a85encode(b, *, foldspaces=False, wrapcol=0, pad=False, adobe=False): + """Encode bytes-like object b using Ascii85 and return a bytes object. + + foldspaces is an optional flag that uses the special short sequence 'y' + instead of 4 consecutive spaces (ASCII 0x20) as supported by 'btoa'. This + feature is not supported by the "standard" Adobe encoding. + + wrapcol controls whether the output should have newline (b'\\n') characters + added to it. If this is non-zero, each output line will be at most this + many characters long. + + pad controls whether the input is padded to a multiple of 4 before + encoding. Note that the btoa implementation always pads. + + adobe controls whether the encoded byte sequence is framed with <~ and ~>, + which is used by the Adobe implementation. + """ + global _a85chars, _a85chars2 + # Delay the initialization of tables to not waste memory + # if the function is never called + if _a85chars is None: + _a85chars = [bytes((i,)) for i in range(33, 118)] + _a85chars2 = [(a + b) for a in _a85chars for b in _a85chars] + + result = _85encode(b, _a85chars, _a85chars2, pad, True, foldspaces) + + if adobe: + result = _A85START + result + if wrapcol: + wrapcol = max(2 if adobe else 1, wrapcol) + chunks = [result[i: i + wrapcol] + for i in range(0, len(result), wrapcol)] + if adobe: + if len(chunks[-1]) + 2 > wrapcol: + chunks.append(b'') + result = b'\n'.join(chunks) + if adobe: + result += _A85END + + return result + +def a85decode(b, *, foldspaces=False, adobe=False, ignorechars=b' \t\n\r\v'): + """Decode the Ascii85 encoded bytes-like object or ASCII string b. + + foldspaces is a flag that specifies whether the 'y' short sequence should be + accepted as shorthand for 4 consecutive spaces (ASCII 0x20). This feature is + not supported by the "standard" Adobe encoding. + + adobe controls whether the input sequence is in Adobe Ascii85 format (i.e. + is framed with <~ and ~>). + + ignorechars should be a byte string containing characters to ignore from the + input. This should only contain whitespace characters, and by default + contains all whitespace characters in ASCII. + + The result is returned as a bytes object. + """ + b = _bytes_from_decode_data(b) + if adobe: + if not b.endswith(_A85END): + raise ValueError( + "Ascii85 encoded byte sequences must end " + "with {!r}".format(_A85END) + ) + if b.startswith(_A85START): + b = b[2:-2] # Strip off start/end markers + else: + b = b[:-2] + # + # We have to go through this stepwise, so as to ignore spaces and handle + # special short sequences + # + packI = struct.Struct('!I').pack + decoded = [] + decoded_append = decoded.append + curr = [] + curr_append = curr.append + curr_clear = curr.clear + for x in b + b'u' * 4: + if b'!'[0] <= x <= b'u'[0]: + curr_append(x) + if len(curr) == 5: + acc = 0 + for x in curr: + acc = 85 * acc + (x - 33) + try: + decoded_append(packI(acc)) + except struct.error: + raise ValueError('Ascii85 overflow') from None + curr_clear() + elif x == b'z'[0]: + if curr: + raise ValueError('z inside Ascii85 5-tuple') + decoded_append(b'\0\0\0\0') + elif foldspaces and x == b'y'[0]: + if curr: + raise ValueError('y inside Ascii85 5-tuple') + decoded_append(b'\x20\x20\x20\x20') + elif x in ignorechars: + # Skip whitespace + continue + else: + raise ValueError('Non-Ascii85 digit found: %c' % x) + + result = b''.join(decoded) + padding = 4 - len(curr) + if padding: + # Throw away the extra padding + result = result[:-padding] + return result + +# The following code is originally taken (with permission) from Mercurial + +_b85alphabet = (b"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ" + b"abcdefghijklmnopqrstuvwxyz!#$%&()*+-;<=>?@^_`{|}~") +_b85chars = None +_b85chars2 = None +_b85dec = None + +def b85encode(b, pad=False): + """Encode bytes-like object b in base85 format and return a bytes object. + + If pad is true, the input is padded with b'\\0' so its length is a multiple of + 4 bytes before encoding. + """ + global _b85chars, _b85chars2 + # Delay the initialization of tables to not waste memory + # if the function is never called + if _b85chars is None: + _b85chars = [bytes((i,)) for i in _b85alphabet] + _b85chars2 = [(a + b) for a in _b85chars for b in _b85chars] + return _85encode(b, _b85chars, _b85chars2, pad) + +def b85decode(b): + """Decode the base85-encoded bytes-like object or ASCII string b + + The result is returned as a bytes object. + """ + global _b85dec + # Delay the initialization of tables to not waste memory + # if the function is never called + if _b85dec is None: + _b85dec = [None] * 256 + for i, c in enumerate(_b85alphabet): + _b85dec[c] = i + + b = _bytes_from_decode_data(b) + padding = (-len(b)) % 5 + b = b + b'~' * padding + out = [] + packI = struct.Struct('!I').pack + for i in range(0, len(b), 5): + chunk = b[i:i + 5] + acc = 0 + try: + for c in chunk: + acc = acc * 85 + _b85dec[c] + except TypeError: + for j, c in enumerate(chunk): + if _b85dec[c] is None: + raise ValueError('bad base85 character at position %d' + % (i + j)) from None + raise + try: + out.append(packI(acc)) + except struct.error: + raise ValueError('base85 overflow in hunk starting at byte %d' + % i) from None + + result = b''.join(out) + if padding: + result = result[:-padding] + return result + +# Legacy interface. This code could be cleaned up since I don't believe +# binascii has any line length limitations. It just doesn't seem worth it +# though. The files should be opened in binary mode. + +MAXLINESIZE = 76 # Excluding the CRLF +MAXBINSIZE = (MAXLINESIZE//4)*3 + +def encode(input, output): + """Encode a file; input and output are binary files.""" + while True: + s = input.read(MAXBINSIZE) + if not s: + break + while len(s) < MAXBINSIZE: + ns = input.read(MAXBINSIZE-len(s)) + if not ns: + break + s += ns + line = binascii.b2a_base64(s) + output.write(line) + + +def decode(input, output): + """Decode a file; input and output are binary files.""" + while True: + line = input.readline() + if not line: + break + s = binascii.a2b_base64(line) + output.write(s) + +def _input_type_check(s): + try: + m = memoryview(s) + except TypeError as err: + msg = "expected bytes-like object, not %s" % s.__class__.__name__ + raise TypeError(msg) from err + if m.format not in ('c', 'b', 'B'): + msg = ("expected single byte elements, not %r from %s" % + (m.format, s.__class__.__name__)) + raise TypeError(msg) + if m.ndim != 1: + msg = ("expected 1-D data, not %d-D data from %s" % + (m.ndim, s.__class__.__name__)) + raise TypeError(msg) + + +def encodebytes(s): + """Encode a bytestring into a bytes object containing multiple lines + of base-64 data.""" + _input_type_check(s) + pieces = [] + for i in range(0, len(s), MAXBINSIZE): + chunk = s[i : i + MAXBINSIZE] + pieces.append(binascii.b2a_base64(chunk)) + return b"".join(pieces) + +def encodestring(s): + """Legacy alias of encodebytes().""" + import warnings + warnings.warn("encodestring() is a deprecated alias since 3.1, " + "use encodebytes()", + DeprecationWarning, 2) + return encodebytes(s) + + +def decodebytes(s): + """Decode a bytestring of base-64 data into a bytes object.""" + _input_type_check(s) + return binascii.a2b_base64(s) + +def decodestring(s): + """Legacy alias of decodebytes().""" + import warnings + warnings.warn("decodestring() is a deprecated alias since Python 3.1, " + "use decodebytes()", + DeprecationWarning, 2) + return decodebytes(s) + + +# Usable as a script... +def main(): + """Small main program""" + import sys, getopt + try: + opts, args = getopt.getopt(sys.argv[1:], 'deut') + except getopt.error as msg: + sys.stdout = sys.stderr + print(msg) + print("""usage: %s [-d|-e|-u|-t] [file|-] + -d, -u: decode + -e: encode (default) + -t: encode and decode string 'Aladdin:open sesame'"""%sys.argv[0]) + sys.exit(2) + func = encode + for o, a in opts: + if o == '-e': func = encode + if o == '-d': func = decode + if o == '-u': func = decode + if o == '-t': test(); return + if args and args[0] != '-': + with open(args[0], 'rb') as f: + func(f, sys.stdout.buffer) + else: + func(sys.stdin.buffer, sys.stdout.buffer) + + +def test(): + s0 = b"Aladdin:open sesame" + print(repr(s0)) + s1 = encodebytes(s0) + print(repr(s1)) + s2 = decodebytes(s1) + print(repr(s2)) + assert s0 == s2 + + +if __name__ == '__main__': + main() diff --git a/env/Lib/bisect.py b/env/Lib/bisect.py new file mode 100644 index 0000000..7732c63 --- /dev/null +++ b/env/Lib/bisect.py @@ -0,0 +1,92 @@ +"""Bisection algorithms.""" + +def insort_right(a, x, lo=0, hi=None): + """Insert item x in list a, and keep it sorted assuming a is sorted. + + If x is already in a, insert it to the right of the rightmost x. + + Optional args lo (default 0) and hi (default len(a)) bound the + slice of a to be searched. + """ + + if lo < 0: + raise ValueError('lo must be non-negative') + if hi is None: + hi = len(a) + while lo < hi: + mid = (lo+hi)//2 + if x < a[mid]: hi = mid + else: lo = mid+1 + a.insert(lo, x) + +def bisect_right(a, x, lo=0, hi=None): + """Return the index where to insert item x in list a, assuming a is sorted. + + The return value i is such that all e in a[:i] have e <= x, and all e in + a[i:] have e > x. So if x already appears in the list, a.insert(x) will + insert just after the rightmost x already there. + + Optional args lo (default 0) and hi (default len(a)) bound the + slice of a to be searched. + """ + + if lo < 0: + raise ValueError('lo must be non-negative') + if hi is None: + hi = len(a) + while lo < hi: + mid = (lo+hi)//2 + if x < a[mid]: hi = mid + else: lo = mid+1 + return lo + +def insort_left(a, x, lo=0, hi=None): + """Insert item x in list a, and keep it sorted assuming a is sorted. + + If x is already in a, insert it to the left of the leftmost x. + + Optional args lo (default 0) and hi (default len(a)) bound the + slice of a to be searched. + """ + + if lo < 0: + raise ValueError('lo must be non-negative') + if hi is None: + hi = len(a) + while lo < hi: + mid = (lo+hi)//2 + if a[mid] < x: lo = mid+1 + else: hi = mid + a.insert(lo, x) + + +def bisect_left(a, x, lo=0, hi=None): + """Return the index where to insert item x in list a, assuming a is sorted. + + The return value i is such that all e in a[:i] have e < x, and all e in + a[i:] have e >= x. So if x already appears in the list, a.insert(x) will + insert just before the leftmost x already there. + + Optional args lo (default 0) and hi (default len(a)) bound the + slice of a to be searched. + """ + + if lo < 0: + raise ValueError('lo must be non-negative') + if hi is None: + hi = len(a) + while lo < hi: + mid = (lo+hi)//2 + if a[mid] < x: lo = mid+1 + else: hi = mid + return lo + +# Overwrite above definitions with a fast C implementation +try: + from _bisect import * +except ImportError: + pass + +# Create aliases +bisect = bisect_right +insort = insort_right diff --git a/env/Lib/codecs.py b/env/Lib/codecs.py new file mode 100644 index 0000000..cfca5d3 --- /dev/null +++ b/env/Lib/codecs.py @@ -0,0 +1,1120 @@ +""" codecs -- Python Codec Registry, API and helpers. + + +Written by Marc-Andre Lemburg (mal@lemburg.com). + +(c) Copyright CNRI, All Rights Reserved. NO WARRANTY. + +""" + +import builtins +import sys + +### Registry and builtin stateless codec functions + +try: + from _codecs import * +except ImportError as why: + raise SystemError('Failed to load the builtin codecs: %s' % why) + +__all__ = ["register", "lookup", "open", "EncodedFile", "BOM", "BOM_BE", + "BOM_LE", "BOM32_BE", "BOM32_LE", "BOM64_BE", "BOM64_LE", + "BOM_UTF8", "BOM_UTF16", "BOM_UTF16_LE", "BOM_UTF16_BE", + "BOM_UTF32", "BOM_UTF32_LE", "BOM_UTF32_BE", + "CodecInfo", "Codec", "IncrementalEncoder", "IncrementalDecoder", + "StreamReader", "StreamWriter", + "StreamReaderWriter", "StreamRecoder", + "getencoder", "getdecoder", "getincrementalencoder", + "getincrementaldecoder", "getreader", "getwriter", + "encode", "decode", "iterencode", "iterdecode", + "strict_errors", "ignore_errors", "replace_errors", + "xmlcharrefreplace_errors", + "backslashreplace_errors", "namereplace_errors", + "register_error", "lookup_error"] + +### Constants + +# +# Byte Order Mark (BOM = ZERO WIDTH NO-BREAK SPACE = U+FEFF) +# and its possible byte string values +# for UTF8/UTF16/UTF32 output and little/big endian machines +# + +# UTF-8 +BOM_UTF8 = b'\xef\xbb\xbf' + +# UTF-16, little endian +BOM_LE = BOM_UTF16_LE = b'\xff\xfe' + +# UTF-16, big endian +BOM_BE = BOM_UTF16_BE = b'\xfe\xff' + +# UTF-32, little endian +BOM_UTF32_LE = b'\xff\xfe\x00\x00' + +# UTF-32, big endian +BOM_UTF32_BE = b'\x00\x00\xfe\xff' + +if sys.byteorder == 'little': + + # UTF-16, native endianness + BOM = BOM_UTF16 = BOM_UTF16_LE + + # UTF-32, native endianness + BOM_UTF32 = BOM_UTF32_LE + +else: + + # UTF-16, native endianness + BOM = BOM_UTF16 = BOM_UTF16_BE + + # UTF-32, native endianness + BOM_UTF32 = BOM_UTF32_BE + +# Old broken names (don't use in new code) +BOM32_LE = BOM_UTF16_LE +BOM32_BE = BOM_UTF16_BE +BOM64_LE = BOM_UTF32_LE +BOM64_BE = BOM_UTF32_BE + + +### Codec base classes (defining the API) + +class CodecInfo(tuple): + """Codec details when looking up the codec registry""" + + # Private API to allow Python 3.4 to blacklist the known non-Unicode + # codecs in the standard library. A more general mechanism to + # reliably distinguish test encodings from other codecs will hopefully + # be defined for Python 3.5 + # + # See http://bugs.python.org/issue19619 + _is_text_encoding = True # Assume codecs are text encodings by default + + def __new__(cls, encode, decode, streamreader=None, streamwriter=None, + incrementalencoder=None, incrementaldecoder=None, name=None, + *, _is_text_encoding=None): + self = tuple.__new__(cls, (encode, decode, streamreader, streamwriter)) + self.name = name + self.encode = encode + self.decode = decode + self.incrementalencoder = incrementalencoder + self.incrementaldecoder = incrementaldecoder + self.streamwriter = streamwriter + self.streamreader = streamreader + if _is_text_encoding is not None: + self._is_text_encoding = _is_text_encoding + return self + + def __repr__(self): + return "<%s.%s object for encoding %s at %#x>" % \ + (self.__class__.__module__, self.__class__.__qualname__, + self.name, id(self)) + +class Codec: + + """ Defines the interface for stateless encoders/decoders. + + The .encode()/.decode() methods may use different error + handling schemes by providing the errors argument. These + string values are predefined: + + 'strict' - raise a ValueError error (or a subclass) + 'ignore' - ignore the character and continue with the next + 'replace' - replace with a suitable replacement character; + Python will use the official U+FFFD REPLACEMENT + CHARACTER for the builtin Unicode codecs on + decoding and '?' on encoding. + 'surrogateescape' - replace with private code points U+DCnn. + 'xmlcharrefreplace' - Replace with the appropriate XML + character reference (only for encoding). + 'backslashreplace' - Replace with backslashed escape sequences. + 'namereplace' - Replace with \\N{...} escape sequences + (only for encoding). + + The set of allowed values can be extended via register_error. + + """ + def encode(self, 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. + + The method may not store state in the Codec instance. Use + StreamWriter for codecs which have to keep state in order to + make encoding efficient. + + The encoder must be able to handle zero length input and + return an empty object of the output object type in this + situation. + + """ + raise NotImplementedError + + def decode(self, 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. + + The method may not store state in the Codec instance. Use + StreamReader for codecs which have to keep state in order to + make decoding efficient. + + The decoder must be able to handle zero length input and + return an empty object of the output object type in this + situation. + + """ + raise NotImplementedError + +class IncrementalEncoder(object): + """ + An IncrementalEncoder encodes an input in multiple steps. The input can + be passed piece by piece to the encode() method. The IncrementalEncoder + remembers the state of the encoding process between calls to encode(). + """ + def __init__(self, errors='strict'): + """ + Creates an IncrementalEncoder instance. + + The IncrementalEncoder may use different error handling schemes by + providing the errors keyword argument. See the module docstring + for a list of possible values. + """ + self.errors = errors + self.buffer = "" + + def encode(self, input, final=False): + """ + Encodes input and returns the resulting object. + """ + raise NotImplementedError + + def reset(self): + """ + Resets the encoder to the initial state. + """ + + def getstate(self): + """ + Return the current state of the encoder. + """ + return 0 + + def setstate(self, state): + """ + Set the current state of the encoder. state must have been + returned by getstate(). + """ + +class BufferedIncrementalEncoder(IncrementalEncoder): + """ + This subclass of IncrementalEncoder can be used as the baseclass for an + incremental encoder if the encoder must keep some of the output in a + buffer between calls to encode(). + """ + def __init__(self, errors='strict'): + IncrementalEncoder.__init__(self, errors) + # unencoded input that is kept between calls to encode() + self.buffer = "" + + def _buffer_encode(self, input, errors, final): + # Overwrite this method in subclasses: It must encode input + # and return an (output, length consumed) tuple + raise NotImplementedError + + def encode(self, input, final=False): + # encode input (taking the buffer into account) + data = self.buffer + input + (result, consumed) = self._buffer_encode(data, self.errors, final) + # keep unencoded input until the next call + self.buffer = data[consumed:] + return result + + def reset(self): + IncrementalEncoder.reset(self) + self.buffer = "" + + def getstate(self): + return self.buffer or 0 + + def setstate(self, state): + self.buffer = state or "" + +class IncrementalDecoder(object): + """ + An IncrementalDecoder decodes an input in multiple steps. The input can + be passed piece by piece to the decode() method. The IncrementalDecoder + remembers the state of the decoding process between calls to decode(). + """ + def __init__(self, errors='strict'): + """ + Create an IncrementalDecoder instance. + + The IncrementalDecoder may use different error handling schemes by + providing the errors keyword argument. See the module docstring + for a list of possible values. + """ + self.errors = errors + + def decode(self, input, final=False): + """ + Decode input and returns the resulting object. + """ + raise NotImplementedError + + def reset(self): + """ + Reset the decoder to the initial state. + """ + + def getstate(self): + """ + Return the current state of the decoder. + + This must be a (buffered_input, additional_state_info) tuple. + buffered_input must be a bytes object containing bytes that + were passed to decode() that have not yet been converted. + additional_state_info must be a non-negative integer + representing the state of the decoder WITHOUT yet having + processed the contents of buffered_input. In the initial state + and after reset(), getstate() must return (b"", 0). + """ + return (b"", 0) + + def setstate(self, state): + """ + Set the current state of the decoder. + + state must have been returned by getstate(). The effect of + setstate((b"", 0)) must be equivalent to reset(). + """ + +class BufferedIncrementalDecoder(IncrementalDecoder): + """ + This subclass of IncrementalDecoder can be used as the baseclass for an + incremental decoder if the decoder must be able to handle incomplete + byte sequences. + """ + def __init__(self, errors='strict'): + IncrementalDecoder.__init__(self, errors) + # undecoded input that is kept between calls to decode() + self.buffer = b"" + + def _buffer_decode(self, input, errors, final): + # Overwrite this method in subclasses: It must decode input + # and return an (output, length consumed) tuple + raise NotImplementedError + + def decode(self, input, final=False): + # decode input (taking the buffer into account) + data = self.buffer + input + (result, consumed) = self._buffer_decode(data, self.errors, final) + # keep undecoded input until the next call + self.buffer = data[consumed:] + return result + + def reset(self): + IncrementalDecoder.reset(self) + self.buffer = b"" + + def getstate(self): + # additional state info is always 0 + return (self.buffer, 0) + + def setstate(self, state): + # ignore additional state info + self.buffer = state[0] + +# +# The StreamWriter and StreamReader class provide generic working +# interfaces which can be used to implement new encoding submodules +# very easily. See encodings/utf_8.py for an example on how this is +# done. +# + +class StreamWriter(Codec): + + def __init__(self, stream, errors='strict'): + + """ Creates a StreamWriter instance. + + stream must be a file-like object open for writing. + + The StreamWriter may use different error handling + schemes by providing the errors keyword argument. These + parameters are predefined: + + 'strict' - raise a ValueError (or a subclass) + 'ignore' - ignore the character and continue with the next + 'replace'- replace with a suitable replacement character + 'xmlcharrefreplace' - Replace with the appropriate XML + character reference. + 'backslashreplace' - Replace with backslashed escape + sequences. + 'namereplace' - Replace with \\N{...} escape sequences. + + The set of allowed parameter values can be extended via + register_error. + """ + self.stream = stream + self.errors = errors + + def write(self, object): + + """ Writes the object's contents encoded to self.stream. + """ + data, consumed = self.encode(object, self.errors) + self.stream.write(data) + + def writelines(self, list): + + """ Writes the concatenated list of strings to the stream + using .write(). + """ + self.write(''.join(list)) + + def reset(self): + + """ Flushes and resets the codec buffers used for keeping state. + + Calling this method should ensure that the data on the + output is put into a clean state, that allows appending + of new fresh data without having to rescan the whole + stream to recover state. + + """ + pass + + def seek(self, offset, whence=0): + self.stream.seek(offset, whence) + if whence == 0 and offset == 0: + self.reset() + + def __getattr__(self, name, + getattr=getattr): + + """ Inherit all other methods from the underlying stream. + """ + return getattr(self.stream, name) + + def __enter__(self): + return self + + def __exit__(self, type, value, tb): + self.stream.close() + +### + +class StreamReader(Codec): + + charbuffertype = str + + def __init__(self, stream, errors='strict'): + + """ Creates a StreamReader instance. + + stream must be a file-like object open for reading. + + The StreamReader may use different error handling + schemes by providing the errors keyword argument. These + parameters are predefined: + + 'strict' - raise a ValueError (or a subclass) + 'ignore' - ignore the character and continue with the next + 'replace'- replace with a suitable replacement character + 'backslashreplace' - Replace with backslashed escape sequences; + + The set of allowed parameter values can be extended via + register_error. + """ + self.stream = stream + self.errors = errors + self.bytebuffer = b"" + self._empty_charbuffer = self.charbuffertype() + self.charbuffer = self._empty_charbuffer + self.linebuffer = None + + def decode(self, input, errors='strict'): + raise NotImplementedError + + def read(self, size=-1, chars=-1, firstline=False): + + """ Decodes data from the stream self.stream and returns the + resulting object. + + chars indicates the number of decoded code points or bytes to + return. read() will never return more data than requested, + but it might return less, if there is not enough available. + + size indicates the approximate maximum number of decoded + bytes or code points to read for decoding. The decoder + can modify this setting as appropriate. The default value + -1 indicates to read and decode as much as possible. size + is intended to prevent having to decode huge files in one + step. + + If firstline is true, and a UnicodeDecodeError happens + after the first line terminator in the input only the first line + will be returned, the rest of the input will be kept until the + next call to read(). + + The method should use a greedy read strategy, meaning that + it should read as much data as is allowed within the + definition of the encoding and the given size, e.g. if + optional encoding endings or state markers are available + on the stream, these should be read too. + """ + # If we have lines cached, first merge them back into characters + if self.linebuffer: + self.charbuffer = self._empty_charbuffer.join(self.linebuffer) + self.linebuffer = None + + if chars < 0: + # For compatibility with other read() methods that take a + # single argument + chars = size + + # read until we get the required number of characters (if available) + while True: + # can the request be satisfied from the character buffer? + if chars >= 0: + if len(self.charbuffer) >= chars: + break + # we need more data + if size < 0: + newdata = self.stream.read() + else: + newdata = self.stream.read(size) + # decode bytes (those remaining from the last call included) + data = self.bytebuffer + newdata + if not data: + break + try: + newchars, decodedbytes = self.decode(data, self.errors) + except UnicodeDecodeError as exc: + if firstline: + newchars, decodedbytes = \ + self.decode(data[:exc.start], self.errors) + lines = newchars.splitlines(keepends=True) + if len(lines)<=1: + raise + else: + raise + # keep undecoded bytes until the next call + self.bytebuffer = data[decodedbytes:] + # put new characters in the character buffer + self.charbuffer += newchars + # there was no data available + if not newdata: + break + if chars < 0: + # Return everything we've got + result = self.charbuffer + self.charbuffer = self._empty_charbuffer + else: + # Return the first chars characters + result = self.charbuffer[:chars] + self.charbuffer = self.charbuffer[chars:] + return result + + def readline(self, size=None, keepends=True): + + """ Read one line from the input stream and return the + decoded data. + + size, if given, is passed as size argument to the + read() method. + + """ + # If we have lines cached from an earlier read, return + # them unconditionally + if self.linebuffer: + line = self.linebuffer[0] + del self.linebuffer[0] + if len(self.linebuffer) == 1: + # revert to charbuffer mode; we might need more data + # next time + self.charbuffer = self.linebuffer[0] + self.linebuffer = None + if not keepends: + line = line.splitlines(keepends=False)[0] + return line + + readsize = size or 72 + line = self._empty_charbuffer + # If size is given, we call read() only once + while True: + data = self.read(readsize, firstline=True) + if data: + # If we're at a "\r" read one extra character (which might + # be a "\n") to get a proper line ending. If the stream is + # temporarily exhausted we return the wrong line ending. + if (isinstance(data, str) and data.endswith("\r")) or \ + (isinstance(data, bytes) and data.endswith(b"\r")): + data += self.read(size=1, chars=1) + + line += data + lines = line.splitlines(keepends=True) + if lines: + if len(lines) > 1: + # More than one line result; the first line is a full line + # to return + line = lines[0] + del lines[0] + if len(lines) > 1: + # cache the remaining lines + lines[-1] += self.charbuffer + self.linebuffer = lines + self.charbuffer = None + else: + # only one remaining line, put it back into charbuffer + self.charbuffer = lines[0] + self.charbuffer + if not keepends: + line = line.splitlines(keepends=False)[0] + break + line0withend = lines[0] + line0withoutend = lines[0].splitlines(keepends=False)[0] + if line0withend != line0withoutend: # We really have a line end + # Put the rest back together and keep it until the next call + self.charbuffer = self._empty_charbuffer.join(lines[1:]) + \ + self.charbuffer + if keepends: + line = line0withend + else: + line = line0withoutend + break + # we didn't get anything or this was our only try + if not data or size is not None: + if line and not keepends: + line = line.splitlines(keepends=False)[0] + break + if readsize < 8000: + readsize *= 2 + return line + + def readlines(self, sizehint=None, keepends=True): + + """ Read all lines available on the input stream + and return them as a list. + + Line breaks are implemented using the codec's decoder + method and are included in the list entries. + + sizehint, if given, is ignored since there is no efficient + way to finding the true end-of-line. + + """ + data = self.read() + return data.splitlines(keepends) + + def reset(self): + + """ Resets the codec buffers used for keeping state. + + Note that no stream repositioning should take place. + This method is primarily intended to be able to recover + from decoding errors. + + """ + self.bytebuffer = b"" + self.charbuffer = self._empty_charbuffer + self.linebuffer = None + + def seek(self, offset, whence=0): + """ Set the input stream's current position. + + Resets the codec buffers used for keeping state. + """ + self.stream.seek(offset, whence) + self.reset() + + def __next__(self): + + """ Return the next decoded line from the input stream.""" + line = self.readline() + if line: + return line + raise StopIteration + + def __iter__(self): + return self + + def __getattr__(self, name, + getattr=getattr): + + """ Inherit all other methods from the underlying stream. + """ + return getattr(self.stream, name) + + def __enter__(self): + return self + + def __exit__(self, type, value, tb): + self.stream.close() + +### + +class StreamReaderWriter: + + """ StreamReaderWriter instances allow wrapping streams which + work in both read and write modes. + + The design is such that one can use the factory functions + returned by the codec.lookup() function to construct the + instance. + + """ + # Optional attributes set by the file wrappers below + encoding = 'unknown' + + def __init__(self, stream, Reader, Writer, errors='strict'): + + """ Creates a StreamReaderWriter instance. + + stream must be a Stream-like object. + + Reader, Writer must be factory functions or classes + providing the StreamReader, StreamWriter interface resp. + + Error handling is done in the same way as defined for the + StreamWriter/Readers. + + """ + self.stream = stream + self.reader = Reader(stream, errors) + self.writer = Writer(stream, errors) + self.errors = errors + + def read(self, size=-1): + + return self.reader.read(size) + + def readline(self, size=None): + + return self.reader.readline(size) + + def readlines(self, sizehint=None): + + return self.reader.readlines(sizehint) + + def __next__(self): + + """ Return the next decoded line from the input stream.""" + return next(self.reader) + + def __iter__(self): + return self + + def write(self, data): + + return self.writer.write(data) + + def writelines(self, list): + + return self.writer.writelines(list) + + def reset(self): + + self.reader.reset() + self.writer.reset() + + def seek(self, offset, whence=0): + self.stream.seek(offset, whence) + self.reader.reset() + if whence == 0 and offset == 0: + self.writer.reset() + + def __getattr__(self, name, + getattr=getattr): + + """ Inherit all other methods from the underlying stream. + """ + return getattr(self.stream, name) + + # these are needed to make "with StreamReaderWriter(...)" work properly + + def __enter__(self): + return self + + def __exit__(self, type, value, tb): + self.stream.close() + +### + +class StreamRecoder: + + """ StreamRecoder instances translate data from one encoding to another. + + They use the complete set of APIs returned by the + codecs.lookup() function to implement their task. + + Data written to the StreamRecoder is first decoded into an + intermediate format (depending on the "decode" codec) and then + written to the underlying stream using an instance of the provided + Writer class. + + In the other direction, data is read from the underlying stream using + a Reader instance and then encoded and returned to the caller. + + """ + # Optional attributes set by the file wrappers below + data_encoding = 'unknown' + file_encoding = 'unknown' + + def __init__(self, stream, encode, decode, Reader, Writer, + errors='strict'): + + """ Creates a StreamRecoder instance which implements a two-way + conversion: encode and decode work on the frontend (the + data visible to .read() and .write()) while Reader and Writer + work on the backend (the data in stream). + + You can use these objects to do transparent + transcodings from e.g. latin-1 to utf-8 and back. + + stream must be a file-like object. + + encode and decode must adhere to the Codec interface; Reader and + Writer must be factory functions or classes providing the + StreamReader and StreamWriter interfaces resp. + + Error handling is done in the same way as defined for the + StreamWriter/Readers. + + """ + self.stream = stream + self.encode = encode + self.decode = decode + self.reader = Reader(stream, errors) + self.writer = Writer(stream, errors) + self.errors = errors + + def read(self, size=-1): + + data = self.reader.read(size) + data, bytesencoded = self.encode(data, self.errors) + return data + + def readline(self, size=None): + + if size is None: + data = self.reader.readline() + else: + data = self.reader.readline(size) + data, bytesencoded = self.encode(data, self.errors) + return data + + def readlines(self, sizehint=None): + + data = self.reader.read() + data, bytesencoded = self.encode(data, self.errors) + return data.splitlines(keepends=True) + + def __next__(self): + + """ Return the next decoded line from the input stream.""" + data = next(self.reader) + data, bytesencoded = self.encode(data, self.errors) + return data + + def __iter__(self): + return self + + def write(self, data): + + data, bytesdecoded = self.decode(data, self.errors) + return self.writer.write(data) + + def writelines(self, list): + + data = b''.join(list) + data, bytesdecoded = self.decode(data, self.errors) + return self.writer.write(data) + + def reset(self): + + self.reader.reset() + self.writer.reset() + + def seek(self, offset, whence=0): + # Seeks must be propagated to both the readers and writers + # as they might need to reset their internal buffers. + self.reader.seek(offset, whence) + self.writer.seek(offset, whence) + + def __getattr__(self, name, + getattr=getattr): + + """ Inherit all other methods from the underlying stream. + """ + return getattr(self.stream, name) + + def __enter__(self): + return self + + def __exit__(self, type, value, tb): + self.stream.close() + +### Shortcuts + +def open(filename, mode='r', encoding=None, errors='strict', buffering=1): + + """ Open an encoded file using the given mode and return + a wrapped version providing transparent encoding/decoding. + + Note: The wrapped version will only accept the object format + defined by the codecs, i.e. Unicode objects for most builtin + codecs. Output is also codec dependent and will usually be + Unicode as well. + + Underlying encoded files are always opened in binary mode. + The default file mode is 'r', meaning to open the file in read mode. + + encoding specifies the encoding which is to be used for the + file. + + errors may be given to define the error handling. It defaults + to 'strict' which causes ValueErrors to be raised in case an + encoding error occurs. + + buffering has the same meaning as for the builtin open() API. + It defaults to line buffered. + + The returned wrapped file object provides an extra attribute + .encoding which allows querying the used encoding. This + attribute is only available if an encoding was specified as + parameter. + + """ + if encoding is not None and \ + 'b' not in mode: + # Force opening of the file in binary mode + mode = mode + 'b' + file = builtins.open(filename, mode, buffering) + if encoding is None: + return file + info = lookup(encoding) + srw = StreamReaderWriter(file, info.streamreader, info.streamwriter, errors) + # Add attributes to simplify introspection + srw.encoding = encoding + return srw + +def EncodedFile(file, data_encoding, file_encoding=None, errors='strict'): + + """ Return a wrapped version of file which provides transparent + encoding translation. + + Data written to the wrapped file is decoded according + to the given data_encoding and then encoded to the underlying + file using file_encoding. The intermediate data type + will usually be Unicode but depends on the specified codecs. + + Bytes read from the file are decoded using file_encoding and then + passed back to the caller encoded using data_encoding. + + If file_encoding is not given, it defaults to data_encoding. + + errors may be given to define the error handling. It defaults + to 'strict' which causes ValueErrors to be raised in case an + encoding error occurs. + + The returned wrapped file object provides two extra attributes + .data_encoding and .file_encoding which reflect the given + parameters of the same name. The attributes can be used for + introspection by Python programs. + + """ + if file_encoding is None: + file_encoding = data_encoding + data_info = lookup(data_encoding) + file_info = lookup(file_encoding) + sr = StreamRecoder(file, data_info.encode, data_info.decode, + file_info.streamreader, file_info.streamwriter, errors) + # Add attributes to simplify introspection + sr.data_encoding = data_encoding + sr.file_encoding = file_encoding + return sr + +### Helpers for codec lookup + +def getencoder(encoding): + + """ Lookup up the codec for the given encoding and return + its encoder function. + + Raises a LookupError in case the encoding cannot be found. + + """ + return lookup(encoding).encode + +def getdecoder(encoding): + + """ Lookup up the codec for the given encoding and return + its decoder function. + + Raises a LookupError in case the encoding cannot be found. + + """ + return lookup(encoding).decode + +def getincrementalencoder(encoding): + + """ Lookup up the codec for the given encoding and return + its IncrementalEncoder class or factory function. + + Raises a LookupError in case the encoding cannot be found + or the codecs doesn't provide an incremental encoder. + + """ + encoder = lookup(encoding).incrementalencoder + if encoder is None: + raise LookupError(encoding) + return encoder + +def getincrementaldecoder(encoding): + + """ Lookup up the codec for the given encoding and return + its IncrementalDecoder class or factory function. + + Raises a LookupError in case the encoding cannot be found + or the codecs doesn't provide an incremental decoder. + + """ + decoder = lookup(encoding).incrementaldecoder + if decoder is None: + raise LookupError(encoding) + return decoder + +def getreader(encoding): + + """ Lookup up the codec for the given encoding and return + its StreamReader class or factory function. + + Raises a LookupError in case the encoding cannot be found. + + """ + return lookup(encoding).streamreader + +def getwriter(encoding): + + """ Lookup up the codec for the given encoding and return + its StreamWriter class or factory function. + + Raises a LookupError in case the encoding cannot be found. + + """ + return lookup(encoding).streamwriter + +def iterencode(iterator, encoding, errors='strict', **kwargs): + """ + Encoding iterator. + + Encodes the input strings from the iterator using an IncrementalEncoder. + + errors and kwargs are passed through to the IncrementalEncoder + constructor. + """ + encoder = getincrementalencoder(encoding)(errors, **kwargs) + for input in iterator: + output = encoder.encode(input) + if output: + yield output + output = encoder.encode("", True) + if output: + yield output + +def iterdecode(iterator, encoding, errors='strict', **kwargs): + """ + Decoding iterator. + + Decodes the input strings from the iterator using an IncrementalDecoder. + + errors and kwargs are passed through to the IncrementalDecoder + constructor. + """ + decoder = getincrementaldecoder(encoding)(errors, **kwargs) + for input in iterator: + output = decoder.decode(input) + if output: + yield output + output = decoder.decode(b"", True) + if output: + yield output + +### Helpers for charmap-based codecs + +def make_identity_dict(rng): + + """ make_identity_dict(rng) -> dict + + Return a dictionary where elements of the rng sequence are + mapped to themselves. + + """ + return {i:i for i in rng} + +def make_encoding_map(decoding_map): + + """ Creates an encoding map from a decoding map. + + If a target mapping in the decoding map occurs multiple + times, then that target is mapped to None (undefined mapping), + causing an exception when encountered by the charmap codec + during translation. + + One example where this happens is cp875.py which decodes + multiple character to \\u001a. + + """ + m = {} + for k,v in decoding_map.items(): + if not v in m: + m[v] = k + else: + m[v] = None + return m + +### error handlers + +try: + strict_errors = lookup_error("strict") + ignore_errors = lookup_error("ignore") + replace_errors = lookup_error("replace") + xmlcharrefreplace_errors = lookup_error("xmlcharrefreplace") + backslashreplace_errors = lookup_error("backslashreplace") + namereplace_errors = lookup_error("namereplace") +except LookupError: + # In --disable-unicode builds, these error handler are missing + strict_errors = None + ignore_errors = None + replace_errors = None + xmlcharrefreplace_errors = None + backslashreplace_errors = None + namereplace_errors = None + +# Tell modulefinder that using codecs probably needs the encodings +# package +_false = 0 +if _false: + import encodings + +### Tests + +if __name__ == '__main__': + + # Make stdout translate Latin-1 output into UTF-8 output + sys.stdout = EncodedFile(sys.stdout, 'latin-1', 'utf-8') + + # Have stdin translate Latin-1 input into UTF-8 input + sys.stdin = EncodedFile(sys.stdin, 'utf-8', 'latin-1') diff --git a/env/Lib/collections/__init__.py b/env/Lib/collections/__init__.py new file mode 100644 index 0000000..64bbee8 --- /dev/null +++ b/env/Lib/collections/__init__.py @@ -0,0 +1,1299 @@ +'''This module implements specialized container datatypes providing +alternatives to Python's general purpose built-in containers, dict, +list, set, and tuple. + +* namedtuple factory function for creating tuple subclasses with named fields +* deque list-like container with fast appends and pops on either end +* ChainMap dict-like class for creating a single view of multiple mappings +* Counter dict subclass for counting hashable objects +* OrderedDict dict subclass that remembers the order entries were added +* defaultdict dict subclass that calls a factory function to supply missing values +* UserDict wrapper around dictionary objects for easier dict subclassing +* UserList wrapper around list objects for easier list subclassing +* UserString wrapper around string objects for easier string subclassing + +''' + +__all__ = ['deque', 'defaultdict', 'namedtuple', 'UserDict', 'UserList', + 'UserString', 'Counter', 'OrderedDict', 'ChainMap'] + +import _collections_abc +from operator import itemgetter as _itemgetter, eq as _eq +from keyword import iskeyword as _iskeyword +import sys as _sys +import heapq as _heapq +from _weakref import proxy as _proxy +from itertools import repeat as _repeat, chain as _chain, starmap as _starmap +from reprlib import recursive_repr as _recursive_repr + +try: + from _collections import deque +except ImportError: + pass +else: + _collections_abc.MutableSequence.register(deque) + +try: + from _collections import defaultdict +except ImportError: + pass + + +def __getattr__(name): + # For backwards compatibility, continue to make the collections ABCs + # through Python 3.6 available through the collections module. + # Note, no new collections ABCs were added in Python 3.7 + if name in _collections_abc.__all__: + obj = getattr(_collections_abc, name) + import warnings + warnings.warn("Using or importing the ABCs from 'collections' instead " + "of from 'collections.abc' is deprecated, " + "and in 3.8 it will stop working", + DeprecationWarning, stacklevel=2) + globals()[name] = obj + return obj + raise AttributeError(f'module {__name__!r} has no attribute {name!r}') + +################################################################################ +### OrderedDict +################################################################################ + +class _OrderedDictKeysView(_collections_abc.KeysView): + + def __reversed__(self): + yield from reversed(self._mapping) + +class _OrderedDictItemsView(_collections_abc.ItemsView): + + def __reversed__(self): + for key in reversed(self._mapping): + yield (key, self._mapping[key]) + +class _OrderedDictValuesView(_collections_abc.ValuesView): + + def __reversed__(self): + for key in reversed(self._mapping): + yield self._mapping[key] + +class _Link(object): + __slots__ = 'prev', 'next', 'key', '__weakref__' + +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 regular dictionaries. + + # The internal self.__map dict 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). + # The sentinel is in self.__hardroot with a weakref proxy in self.__root. + # The prev links are weakref proxies (to prevent circular references). + # Individual links are kept alive by the hard reference in self.__map. + # Those hard references disappear when a key is deleted from an OrderedDict. + + def __init__(*args, **kwds): + '''Initialize an ordered dictionary. The signature is the same as + regular dictionaries. Keyword argument order is preserved. + ''' + if not args: + raise TypeError("descriptor '__init__' of 'OrderedDict' object " + "needs an argument") + self, *args = args + if len(args) > 1: + raise TypeError('expected at most 1 arguments, got %d' % len(args)) + try: + self.__root + except AttributeError: + self.__hardroot = _Link() + self.__root = root = _proxy(self.__hardroot) + root.prev = root.next = root + self.__map = {} + self.__update(*args, **kwds) + + def __setitem__(self, key, value, + dict_setitem=dict.__setitem__, proxy=_proxy, Link=_Link): + 'od.__setitem__(i, y) <==> od[i]=y' + # Setting a new item creates a new link at the end of the linked list, + # and the inherited dictionary is updated with the new key/value pair. + if key not in self: + self.__map[key] = link = Link() + root = self.__root + last = root.prev + link.prev, link.next, link.key = last, root, key + last.next = link + root.prev = proxy(link) + 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 gets + # removed by updating the links in the predecessor and successor nodes. + dict_delitem(self, key) + link = self.__map.pop(key) + link_prev = link.prev + link_next = link.next + link_prev.next = link_next + link_next.prev = link_prev + link.prev = None + link.next = None + + def __iter__(self): + 'od.__iter__() <==> iter(od)' + # Traverse the linked list in order. + root = self.__root + curr = root.next + while curr is not root: + yield curr.key + curr = curr.next + + def __reversed__(self): + 'od.__reversed__() <==> reversed(od)' + # Traverse the linked list in reverse order. + root = self.__root + curr = root.prev + while curr is not root: + yield curr.key + curr = curr.prev + + def clear(self): + 'od.clear() -> None. Remove all items from od.' + root = self.__root + root.prev = root.next = root + self.__map.clear() + dict.clear(self) + + def popitem(self, last=True): + '''Remove and return a (key, value) pair from the dictionary. + + 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.prev + link_prev = link.prev + link_prev.next = root + root.prev = link_prev + else: + link = root.next + link_next = link.next + root.next = link_next + link_next.prev = root + key = link.key + del self.__map[key] + value = dict.pop(self, key) + return key, value + + def move_to_end(self, key, last=True): + '''Move an existing element to the end (or beginning if last is false). + + Raise KeyError if the element does not exist. + ''' + link = self.__map[key] + link_prev = link.prev + link_next = link.next + soft_link = link_next.prev + link_prev.next = link_next + link_next.prev = link_prev + root = self.__root + if last: + last = root.prev + link.prev = last + link.next = root + root.prev = soft_link + last.next = link + else: + first = root.next + link.prev = root + link.next = first + first.prev = soft_link + root.next = link + + def __sizeof__(self): + sizeof = _sys.getsizeof + n = len(self) + 1 # number of links including root + size = sizeof(self.__dict__) # instance dictionary + size += sizeof(self.__map) * 2 # internal dict and inherited dict + size += sizeof(self.__hardroot) * n # link objects + size += sizeof(self.__root) * n # proxy objects + return size + + update = __update = _collections_abc.MutableMapping.update + + def keys(self): + "D.keys() -> a set-like object providing a view on D's keys" + return _OrderedDictKeysView(self) + + def items(self): + "D.items() -> a set-like object providing a view on D's items" + return _OrderedDictItemsView(self) + + def values(self): + "D.values() -> an object providing a view on D's values" + return _OrderedDictValuesView(self) + + __ne__ = _collections_abc.MutableMapping.__ne__ + + __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): + '''Insert key with a value of default if key is not in the dictionary. + + Return the value for key if key is in the dictionary, else default. + ''' + if key in self: + return self[key] + self[key] = default + return default + + @_recursive_repr() + def __repr__(self): + 'od.__repr__() <==> repr(od)' + if not self: + return '%s()' % (self.__class__.__name__,) + return '%s(%r)' % (self.__class__.__name__, list(self.items())) + + def __reduce__(self): + 'Return state information for pickling' + inst_dict = vars(self).copy() + for k in vars(OrderedDict()): + inst_dict.pop(k, None) + return self.__class__, (), inst_dict or None, None, iter(self.items()) + + def copy(self): + 'od.copy() -> a shallow copy of od' + return self.__class__(self) + + @classmethod + def fromkeys(cls, iterable, value=None): + '''Create a new ordered dictionary with keys from iterable and values set to value. + ''' + self = cls() + for key in iterable: + self[key] = value + return self + + 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 dict.__eq__(self, other) and all(map(_eq, self, other)) + return dict.__eq__(self, other) + + +try: + from _collections import OrderedDict +except ImportError: + # Leave the pure Python version in place. + pass + + +################################################################################ +### namedtuple +################################################################################ + +_nt_itemgetters = {} + +def namedtuple(typename, field_names, *, rename=False, defaults=None, module=None): + """Returns a new subclass of tuple with named fields. + + >>> Point = namedtuple('Point', ['x', 'y']) + >>> Point.__doc__ # docstring for the new class + 'Point(x, y)' + >>> p = Point(11, y=22) # instantiate with positional args or keywords + >>> p[0] + p[1] # indexable like a plain tuple + 33 + >>> x, y = p # unpack like a regular tuple + >>> x, y + (11, 22) + >>> p.x + p.y # fields also accessible by name + 33 + >>> d = p._asdict() # convert to a dictionary + >>> d['x'] + 11 + >>> Point(**d) # convert from a dictionary + Point(x=11, y=22) + >>> p._replace(x=100) # _replace() is like str.replace() but targets named fields + Point(x=100, y=22) + + """ + + # Validate the field names. At the user's option, either generate an error + # message or automatically replace the field name with a valid name. + if isinstance(field_names, str): + field_names = field_names.replace(',', ' ').split() + field_names = list(map(str, field_names)) + typename = _sys.intern(str(typename)) + + if rename: + seen = set() + for index, name in enumerate(field_names): + if (not name.isidentifier() + or _iskeyword(name) + or name.startswith('_') + or name in seen): + field_names[index] = f'_{index}' + seen.add(name) + + for name in [typename] + field_names: + if type(name) is not str: + raise TypeError('Type names and field names must be strings') + if not name.isidentifier(): + raise ValueError('Type names and field names must be valid ' + f'identifiers: {name!r}') + if _iskeyword(name): + raise ValueError('Type names and field names cannot be a ' + f'keyword: {name!r}') + + seen = set() + for name in field_names: + if name.startswith('_') and not rename: + raise ValueError('Field names cannot start with an underscore: ' + f'{name!r}') + if name in seen: + raise ValueError(f'Encountered duplicate field name: {name!r}') + seen.add(name) + + field_defaults = {} + if defaults is not None: + defaults = tuple(defaults) + if len(defaults) > len(field_names): + raise TypeError('Got more default values than field names') + field_defaults = dict(reversed(list(zip(reversed(field_names), + reversed(defaults))))) + + # Variables used in the methods and docstrings + field_names = tuple(map(_sys.intern, field_names)) + num_fields = len(field_names) + arg_list = repr(field_names).replace("'", "")[1:-1] + repr_fmt = '(' + ', '.join(f'{name}=%r' for name in field_names) + ')' + tuple_new = tuple.__new__ + _len = len + + # Create all the named tuple methods to be added to the class namespace + + s = f'def __new__(_cls, {arg_list}): return _tuple_new(_cls, ({arg_list}))' + namespace = {'_tuple_new': tuple_new, '__name__': f'namedtuple_{typename}'} + # Note: exec() has the side-effect of interning the field names + exec(s, namespace) + __new__ = namespace['__new__'] + __new__.__doc__ = f'Create new instance of {typename}({arg_list})' + if defaults is not None: + __new__.__defaults__ = defaults + + @classmethod + def _make(cls, iterable): + result = tuple_new(cls, iterable) + if _len(result) != num_fields: + raise TypeError(f'Expected {num_fields} arguments, got {len(result)}') + return result + + _make.__func__.__doc__ = (f'Make a new {typename} object from a sequence ' + 'or iterable') + + def _replace(_self, **kwds): + result = _self._make(map(kwds.pop, field_names, _self)) + if kwds: + raise ValueError(f'Got unexpected field names: {list(kwds)!r}') + return result + + _replace.__doc__ = (f'Return a new {typename} object replacing specified ' + 'fields with new values') + + def __repr__(self): + 'Return a nicely formatted representation string' + return self.__class__.__name__ + repr_fmt % self + + def _asdict(self): + 'Return a new OrderedDict which maps field names to their values.' + return OrderedDict(zip(self._fields, self)) + + def __getnewargs__(self): + 'Return self as a plain tuple. Used by copy and pickle.' + return tuple(self) + + # Modify function metadata to help with introspection and debugging + + for method in (__new__, _make.__func__, _replace, + __repr__, _asdict, __getnewargs__): + method.__qualname__ = f'{typename}.{method.__name__}' + + # Build-up the class namespace dictionary + # and use type() to build the result class + class_namespace = { + '__doc__': f'{typename}({arg_list})', + '__slots__': (), + '_fields': field_names, + '_field_defaults': field_defaults, + # alternate spelling for backward compatiblity + '_fields_defaults': field_defaults, + '__new__': __new__, + '_make': _make, + '_replace': _replace, + '__repr__': __repr__, + '_asdict': _asdict, + '__getnewargs__': __getnewargs__, + } + cache = _nt_itemgetters + for index, name in enumerate(field_names): + try: + itemgetter_object, doc = cache[index] + except KeyError: + itemgetter_object = _itemgetter(index) + doc = f'Alias for field number {index}' + cache[index] = itemgetter_object, doc + class_namespace[name] = property(itemgetter_object, doc=doc) + + result = type(typename, (tuple,), class_namespace) + + # For pickling to work, the __module__ variable needs to be set to the frame + # where the named tuple is created. Bypass this step in environments where + # sys._getframe is not defined (Jython for example) or sys._getframe is not + # defined for arguments greater than 0 (IronPython), or where the user has + # specified a particular module. + if module is None: + try: + module = _sys._getframe(1).f_globals.get('__name__', '__main__') + except (AttributeError, ValueError): + pass + if module is not None: + result.__module__ = module + + return result + + +######################################################################## +### Counter +######################################################################## + +def _count_elements(mapping, iterable): + 'Tally elements from the iterable.' + mapping_get = mapping.get + for elem in iterable: + mapping[elem] = mapping_get(elem, 0) + 1 + +try: # Load C helper function if available + from _collections import _count_elements +except ImportError: + pass + +class Counter(dict): + '''Dict subclass for counting hashable items. Sometimes called a bag + or multiset. Elements are stored as dictionary keys and their counts + are stored as dictionary values. + + >>> c = Counter('abcdeabcdabcaba') # count elements from a string + + >>> c.most_common(3) # three most common elements + [('a', 5), ('b', 4), ('c', 3)] + >>> sorted(c) # list all unique elements + ['a', 'b', 'c', 'd', 'e'] + >>> ''.join(sorted(c.elements())) # list elements with repetitions + 'aaaaabbbbcccdde' + >>> sum(c.values()) # total of all counts + 15 + + >>> c['a'] # count of letter 'a' + 5 + >>> for elem in 'shazam': # update counts from an iterable + ... c[elem] += 1 # by adding 1 to each element's count + >>> c['a'] # now there are seven 'a' + 7 + >>> del c['b'] # remove all 'b' + >>> c['b'] # now there are zero 'b' + 0 + + >>> d = Counter('simsalabim') # make another counter + >>> c.update(d) # add in the second counter + >>> c['a'] # now there are nine 'a' + 9 + + >>> c.clear() # empty the counter + >>> c + Counter() + + Note: If a count is set to zero or reduced to zero, it will remain + in the counter until the entry is deleted or the counter is cleared: + + >>> c = Counter('aaabbc') + >>> c['b'] -= 2 # reduce the count of 'b' by two + >>> c.most_common() # 'b' is still in, but its count is zero + [('a', 3), ('c', 1), ('b', 0)] + + ''' + # References: + # http://en.wikipedia.org/wiki/Multiset + # http://www.gnu.org/software/smalltalk/manual-base/html_node/Bag.html + # http://www.demo2s.com/Tutorial/Cpp/0380__set-multiset/Catalog0380__set-multiset.htm + # http://code.activestate.com/recipes/259174/ + # Knuth, TAOCP Vol. II section 4.6.3 + + def __init__(*args, **kwds): + '''Create a new, empty Counter object. And if given, count elements + from an input iterable. Or, initialize the count from another mapping + of elements to their counts. + + >>> c = Counter() # a new, empty counter + >>> c = Counter('gallahad') # a new counter from an iterable + >>> c = Counter({'a': 4, 'b': 2}) # a new counter from a mapping + >>> c = Counter(a=4, b=2) # a new counter from keyword args + + ''' + if not args: + raise TypeError("descriptor '__init__' of 'Counter' object " + "needs an argument") + self, *args = args + if len(args) > 1: + raise TypeError('expected at most 1 arguments, got %d' % len(args)) + super(Counter, self).__init__() + self.update(*args, **kwds) + + def __missing__(self, key): + 'The count of elements not in the Counter is zero.' + # Needed so that self[missing_item] does not raise KeyError + return 0 + + def most_common(self, n=None): + '''List the n most common elements and their counts from the most + common to the least. If n is None, then list all element counts. + + >>> Counter('abcdeabcdabcaba').most_common(3) + [('a', 5), ('b', 4), ('c', 3)] + + ''' + # Emulate Bag.sortedByCount from Smalltalk + if n is None: + return sorted(self.items(), key=_itemgetter(1), reverse=True) + return _heapq.nlargest(n, self.items(), key=_itemgetter(1)) + + def elements(self): + '''Iterator over elements repeating each as many times as its count. + + >>> c = Counter('ABCABC') + >>> sorted(c.elements()) + ['A', 'A', 'B', 'B', 'C', 'C'] + + # Knuth's example for prime factors of 1836: 2**2 * 3**3 * 17**1 + >>> prime_factors = Counter({2: 2, 3: 3, 17: 1}) + >>> product = 1 + >>> for factor in prime_factors.elements(): # loop over factors + ... product *= factor # and multiply them + >>> product + 1836 + + Note, if an element's count has been set to zero or is a negative + number, elements() will ignore it. + + ''' + # Emulate Bag.do from Smalltalk and Multiset.begin from C++. + return _chain.from_iterable(_starmap(_repeat, self.items())) + + # Override dict methods where necessary + + @classmethod + def fromkeys(cls, iterable, v=None): + # There is no equivalent method for counters because setting v=1 + # means that no element can have a count greater than one. + raise NotImplementedError( + 'Counter.fromkeys() is undefined. Use Counter(iterable) instead.') + + def update(*args, **kwds): + '''Like dict.update() but add counts instead of replacing them. + + Source can be an iterable, a dictionary, or another Counter instance. + + >>> c = Counter('which') + >>> c.update('witch') # add elements from another iterable + >>> d = Counter('watch') + >>> c.update(d) # add elements from another counter + >>> c['h'] # four 'h' in which, witch, and watch + 4 + + ''' + # The regular dict.update() operation makes no sense here because the + # replace behavior results in the some of original untouched counts + # being mixed-in with all of the other counts for a mismash that + # doesn't have a straight-forward interpretation in most counting + # contexts. Instead, we implement straight-addition. Both the inputs + # and outputs are allowed to contain zero and negative counts. + + if not args: + raise TypeError("descriptor 'update' of 'Counter' object " + "needs an argument") + self, *args = args + if len(args) > 1: + raise TypeError('expected at most 1 arguments, got %d' % len(args)) + iterable = args[0] if args else None + if iterable is not None: + if isinstance(iterable, _collections_abc.Mapping): + if self: + self_get = self.get + for elem, count in iterable.items(): + self[elem] = count + self_get(elem, 0) + else: + super(Counter, self).update(iterable) # fast path when counter is empty + else: + _count_elements(self, iterable) + if kwds: + self.update(kwds) + + def subtract(*args, **kwds): + '''Like dict.update() but subtracts counts instead of replacing them. + Counts can be reduced below zero. Both the inputs and outputs are + allowed to contain zero and negative counts. + + Source can be an iterable, a dictionary, or another Counter instance. + + >>> c = Counter('which') + >>> c.subtract('witch') # subtract elements from another iterable + >>> c.subtract(Counter('watch')) # subtract elements from another counter + >>> c['h'] # 2 in which, minus 1 in witch, minus 1 in watch + 0 + >>> c['w'] # 1 in which, minus 1 in witch, minus 1 in watch + -1 + + ''' + if not args: + raise TypeError("descriptor 'subtract' of 'Counter' object " + "needs an argument") + self, *args = args + if len(args) > 1: + raise TypeError('expected at most 1 arguments, got %d' % len(args)) + iterable = args[0] if args else None + if iterable is not None: + self_get = self.get + if isinstance(iterable, _collections_abc.Mapping): + for elem, count in iterable.items(): + self[elem] = self_get(elem, 0) - count + else: + for elem in iterable: + self[elem] = self_get(elem, 0) - 1 + if kwds: + self.subtract(kwds) + + def copy(self): + 'Return a shallow copy.' + return self.__class__(self) + + def __reduce__(self): + return self.__class__, (dict(self),) + + def __delitem__(self, elem): + 'Like dict.__delitem__() but does not raise KeyError for missing values.' + if elem in self: + super().__delitem__(elem) + + def __repr__(self): + if not self: + return '%s()' % self.__class__.__name__ + try: + items = ', '.join(map('%r: %r'.__mod__, self.most_common())) + return '%s({%s})' % (self.__class__.__name__, items) + except TypeError: + # handle case where values are not orderable + return '{0}({1!r})'.format(self.__class__.__name__, dict(self)) + + # Multiset-style mathematical operations discussed in: + # Knuth TAOCP Volume II section 4.6.3 exercise 19 + # and at http://en.wikipedia.org/wiki/Multiset + # + # Outputs guaranteed to only include positive counts. + # + # To strip negative and zero counts, add-in an empty counter: + # c += Counter() + + def __add__(self, other): + '''Add counts from two counters. + + >>> Counter('abbb') + Counter('bcc') + Counter({'b': 4, 'c': 2, 'a': 1}) + + ''' + if not isinstance(other, Counter): + return NotImplemented + result = Counter() + for elem, count in self.items(): + newcount = count + other[elem] + if newcount > 0: + result[elem] = newcount + for elem, count in other.items(): + if elem not in self and count > 0: + result[elem] = count + return result + + def __sub__(self, other): + ''' Subtract count, but keep only results with positive counts. + + >>> Counter('abbbc') - Counter('bccd') + Counter({'b': 2, 'a': 1}) + + ''' + if not isinstance(other, Counter): + return NotImplemented + result = Counter() + for elem, count in self.items(): + newcount = count - other[elem] + if newcount > 0: + result[elem] = newcount + for elem, count in other.items(): + if elem not in self and count < 0: + result[elem] = 0 - count + return result + + def __or__(self, other): + '''Union is the maximum of value in either of the input counters. + + >>> Counter('abbb') | Counter('bcc') + Counter({'b': 3, 'c': 2, 'a': 1}) + + ''' + if not isinstance(other, Counter): + return NotImplemented + result = Counter() + for elem, count in self.items(): + other_count = other[elem] + newcount = other_count if count < other_count else count + if newcount > 0: + result[elem] = newcount + for elem, count in other.items(): + if elem not in self and count > 0: + result[elem] = count + return result + + def __and__(self, other): + ''' Intersection is the minimum of corresponding counts. + + >>> Counter('abbb') & Counter('bcc') + Counter({'b': 1}) + + ''' + if not isinstance(other, Counter): + return NotImplemented + result = Counter() + for elem, count in self.items(): + other_count = other[elem] + newcount = count if count < other_count else other_count + if newcount > 0: + result[elem] = newcount + return result + + def __pos__(self): + 'Adds an empty counter, effectively stripping negative and zero counts' + result = Counter() + for elem, count in self.items(): + if count > 0: + result[elem] = count + return result + + def __neg__(self): + '''Subtracts from an empty counter. Strips positive and zero counts, + and flips the sign on negative counts. + + ''' + result = Counter() + for elem, count in self.items(): + if count < 0: + result[elem] = 0 - count + return result + + def _keep_positive(self): + '''Internal method to strip elements with a negative or zero count''' + nonpositive = [elem for elem, count in self.items() if not count > 0] + for elem in nonpositive: + del self[elem] + return self + + def __iadd__(self, other): + '''Inplace add from another counter, keeping only positive counts. + + >>> c = Counter('abbb') + >>> c += Counter('bcc') + >>> c + Counter({'b': 4, 'c': 2, 'a': 1}) + + ''' + for elem, count in other.items(): + self[elem] += count + return self._keep_positive() + + def __isub__(self, other): + '''Inplace subtract counter, but keep only results with positive counts. + + >>> c = Counter('abbbc') + >>> c -= Counter('bccd') + >>> c + Counter({'b': 2, 'a': 1}) + + ''' + for elem, count in other.items(): + self[elem] -= count + return self._keep_positive() + + def __ior__(self, other): + '''Inplace union is the maximum of value from either counter. + + >>> c = Counter('abbb') + >>> c |= Counter('bcc') + >>> c + Counter({'b': 3, 'c': 2, 'a': 1}) + + ''' + for elem, other_count in other.items(): + count = self[elem] + if other_count > count: + self[elem] = other_count + return self._keep_positive() + + def __iand__(self, other): + '''Inplace intersection is the minimum of corresponding counts. + + >>> c = Counter('abbb') + >>> c &= Counter('bcc') + >>> c + Counter({'b': 1}) + + ''' + for elem, count in self.items(): + other_count = other[elem] + if other_count < count: + self[elem] = other_count + return self._keep_positive() + + +######################################################################## +### ChainMap +######################################################################## + +class ChainMap(_collections_abc.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 + be 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): + d = {} + for mapping in reversed(self.maps): + d.update(mapping) # reuses stored hash values if possible + return iter(d) + + 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, m=None): # like Django's Context.push() + '''New ChainMap with a new map followed by all previous maps. + If no map is provided, an empty dict is used. + ''' + if m is None: + m = {} + return self.__class__(m, *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() + + +################################################################################ +### UserDict +################################################################################ + +class UserDict(_collections_abc.MutableMapping): + + # Start by filling-out the abstract methods + def __init__(*args, **kwargs): + if not args: + raise TypeError("descriptor '__init__' of 'UserDict' object " + "needs an argument") + self, *args = args + if len(args) > 1: + raise TypeError('expected at most 1 arguments, got %d' % len(args)) + if args: + dict = args[0] + elif 'dict' in kwargs: + dict = kwargs.pop('dict') + import warnings + warnings.warn("Passing 'dict' as keyword argument is deprecated", + DeprecationWarning, stacklevel=2) + else: + dict = None + self.data = {} + if dict is not None: + self.update(dict) + if len(kwargs): + self.update(kwargs) + def __len__(self): return len(self.data) + def __getitem__(self, key): + if key in self.data: + return self.data[key] + if hasattr(self.__class__, "__missing__"): + return self.__class__.__missing__(self, key) + raise KeyError(key) + def __setitem__(self, key, item): self.data[key] = item + def __delitem__(self, key): del self.data[key] + def __iter__(self): + return iter(self.data) + + # Modify __contains__ to work correctly when __missing__ is present + def __contains__(self, key): + return key in self.data + + # Now, add the methods in dicts but not in MutableMapping + def __repr__(self): return repr(self.data) + def __copy__(self): + inst = self.__class__.__new__(self.__class__) + inst.__dict__.update(self.__dict__) + # Create a copy and avoid triggering descriptors + inst.__dict__["data"] = self.__dict__["data"].copy() + return inst + + def copy(self): + if self.__class__ is UserDict: + return UserDict(self.data.copy()) + import copy + data = self.data + try: + self.data = {} + c = copy.copy(self) + finally: + self.data = data + c.update(self) + return c + + @classmethod + def fromkeys(cls, iterable, value=None): + d = cls() + for key in iterable: + d[key] = value + return d + + + +################################################################################ +### UserList +################################################################################ + +class UserList(_collections_abc.MutableSequence): + """A more or less complete user-defined wrapper around list objects.""" + def __init__(self, initlist=None): + self.data = [] + if initlist is not None: + # XXX should this accept an arbitrary sequence? + if type(initlist) == type(self.data): + self.data[:] = initlist + elif isinstance(initlist, UserList): + self.data[:] = initlist.data[:] + else: + self.data = list(initlist) + def __repr__(self): return repr(self.data) + def __lt__(self, other): return self.data < self.__cast(other) + def __le__(self, other): return self.data <= self.__cast(other) + def __eq__(self, other): return self.data == self.__cast(other) + def __gt__(self, other): return self.data > self.__cast(other) + def __ge__(self, other): return self.data >= self.__cast(other) + def __cast(self, other): + return other.data if isinstance(other, UserList) else other + def __contains__(self, item): return item in self.data + def __len__(self): return len(self.data) + def __getitem__(self, i): + if isinstance(i, slice): + return self.__class__(self.data[i]) + else: + return self.data[i] + def __setitem__(self, i, item): self.data[i] = item + def __delitem__(self, i): del self.data[i] + def __add__(self, other): + if isinstance(other, UserList): + return self.__class__(self.data + other.data) + elif isinstance(other, type(self.data)): + return self.__class__(self.data + other) + return self.__class__(self.data + list(other)) + def __radd__(self, other): + if isinstance(other, UserList): + return self.__class__(other.data + self.data) + elif isinstance(other, type(self.data)): + return self.__class__(other + self.data) + return self.__class__(list(other) + self.data) + def __iadd__(self, other): + if isinstance(other, UserList): + self.data += other.data + elif isinstance(other, type(self.data)): + self.data += other + else: + self.data += list(other) + return self + def __mul__(self, n): + return self.__class__(self.data*n) + __rmul__ = __mul__ + def __imul__(self, n): + self.data *= n + return self + def __copy__(self): + inst = self.__class__.__new__(self.__class__) + inst.__dict__.update(self.__dict__) + # Create a copy and avoid triggering descriptors + inst.__dict__["data"] = self.__dict__["data"][:] + return inst + def append(self, item): self.data.append(item) + def insert(self, i, item): self.data.insert(i, item) + def pop(self, i=-1): return self.data.pop(i) + def remove(self, item): self.data.remove(item) + def clear(self): self.data.clear() + def copy(self): return self.__class__(self) + def count(self, item): return self.data.count(item) + def index(self, item, *args): return self.data.index(item, *args) + def reverse(self): self.data.reverse() + def sort(self, *args, **kwds): self.data.sort(*args, **kwds) + def extend(self, other): + if isinstance(other, UserList): + self.data.extend(other.data) + else: + self.data.extend(other) + + + +################################################################################ +### UserString +################################################################################ + +class UserString(_collections_abc.Sequence): + def __init__(self, seq): + if isinstance(seq, str): + self.data = seq + elif isinstance(seq, UserString): + self.data = seq.data[:] + else: + self.data = str(seq) + def __str__(self): return str(self.data) + def __repr__(self): return repr(self.data) + def __int__(self): return int(self.data) + def __float__(self): return float(self.data) + def __complex__(self): return complex(self.data) + def __hash__(self): return hash(self.data) + def __getnewargs__(self): + return (self.data[:],) + + def __eq__(self, string): + if isinstance(string, UserString): + return self.data == string.data + return self.data == string + def __lt__(self, string): + if isinstance(string, UserString): + return self.data < string.data + return self.data < string + def __le__(self, string): + if isinstance(string, UserString): + return self.data <= string.data + return self.data <= string + def __gt__(self, string): + if isinstance(string, UserString): + return self.data > string.data + return self.data > string + def __ge__(self, string): + if isinstance(string, UserString): + return self.data >= string.data + return self.data >= string + + def __contains__(self, char): + if isinstance(char, UserString): + char = char.data + return char in self.data + + def __len__(self): return len(self.data) + def __getitem__(self, index): return self.__class__(self.data[index]) + def __add__(self, other): + if isinstance(other, UserString): + return self.__class__(self.data + other.data) + elif isinstance(other, str): + return self.__class__(self.data + other) + return self.__class__(self.data + str(other)) + def __radd__(self, other): + if isinstance(other, str): + return self.__class__(other + self.data) + return self.__class__(str(other) + self.data) + def __mul__(self, n): + return self.__class__(self.data*n) + __rmul__ = __mul__ + def __mod__(self, args): + return self.__class__(self.data % args) + def __rmod__(self, format): + return self.__class__(format % args) + + # the following methods are defined in alphabetical order: + def capitalize(self): return self.__class__(self.data.capitalize()) + def casefold(self): + return self.__class__(self.data.casefold()) + def center(self, width, *args): + return self.__class__(self.data.center(width, *args)) + def count(self, sub, start=0, end=_sys.maxsize): + if isinstance(sub, UserString): + sub = sub.data + return self.data.count(sub, start, end) + def encode(self, encoding=None, errors=None): # XXX improve this? + if encoding: + if errors: + return self.__class__(self.data.encode(encoding, errors)) + return self.__class__(self.data.encode(encoding)) + return self.__class__(self.data.encode()) + def endswith(self, suffix, start=0, end=_sys.maxsize): + return self.data.endswith(suffix, start, end) + def expandtabs(self, tabsize=8): + return self.__class__(self.data.expandtabs(tabsize)) + def find(self, sub, start=0, end=_sys.maxsize): + if isinstance(sub, UserString): + sub = sub.data + return self.data.find(sub, start, end) + def format(self, *args, **kwds): + return self.data.format(*args, **kwds) + def format_map(self, mapping): + return self.data.format_map(mapping) + def index(self, sub, start=0, end=_sys.maxsize): + return self.data.index(sub, start, end) + def isalpha(self): return self.data.isalpha() + def isalnum(self): return self.data.isalnum() + def isascii(self): return self.data.isascii() + def isdecimal(self): return self.data.isdecimal() + def isdigit(self): return self.data.isdigit() + def isidentifier(self): return self.data.isidentifier() + def islower(self): return self.data.islower() + def isnumeric(self): return self.data.isnumeric() + def isprintable(self): return self.data.isprintable() + def isspace(self): return self.data.isspace() + def istitle(self): return self.data.istitle() + def isupper(self): return self.data.isupper() + def join(self, seq): return self.data.join(seq) + def ljust(self, width, *args): + return self.__class__(self.data.ljust(width, *args)) + def lower(self): return self.__class__(self.data.lower()) + def lstrip(self, chars=None): return self.__class__(self.data.lstrip(chars)) + maketrans = str.maketrans + def partition(self, sep): + return self.data.partition(sep) + def replace(self, old, new, maxsplit=-1): + if isinstance(old, UserString): + old = old.data + if isinstance(new, UserString): + new = new.data + return self.__class__(self.data.replace(old, new, maxsplit)) + def rfind(self, sub, start=0, end=_sys.maxsize): + if isinstance(sub, UserString): + sub = sub.data + return self.data.rfind(sub, start, end) + def rindex(self, sub, start=0, end=_sys.maxsize): + return self.data.rindex(sub, start, end) + def rjust(self, width, *args): + return self.__class__(self.data.rjust(width, *args)) + def rpartition(self, sep): + return self.data.rpartition(sep) + def rstrip(self, chars=None): + return self.__class__(self.data.rstrip(chars)) + def split(self, sep=None, maxsplit=-1): + return self.data.split(sep, maxsplit) + def rsplit(self, sep=None, maxsplit=-1): + return self.data.rsplit(sep, maxsplit) + def splitlines(self, keepends=False): return self.data.splitlines(keepends) + def startswith(self, prefix, start=0, end=_sys.maxsize): + return self.data.startswith(prefix, start, end) + def strip(self, chars=None): return self.__class__(self.data.strip(chars)) + def swapcase(self): return self.__class__(self.data.swapcase()) + def title(self): return self.__class__(self.data.title()) + def translate(self, *args): + return self.__class__(self.data.translate(*args)) + def upper(self): return self.__class__(self.data.upper()) + def zfill(self, width): return self.__class__(self.data.zfill(width)) diff --git a/env/Lib/collections/__pycache__/__init__.cpython-37.pyc b/env/Lib/collections/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c368b5fdcfaa9bd5caf84b2fe33f7ef2da7be244 GIT binary patch literal 47095 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 literal 0 HcmV?d00001 diff --git a/env/Lib/collections/abc.py b/env/Lib/collections/abc.py new file mode 100644 index 0000000..891600d --- /dev/null +++ b/env/Lib/collections/abc.py @@ -0,0 +1,2 @@ +from _collections_abc import * +from _collections_abc import __all__ diff --git a/env/Lib/copy.py b/env/Lib/copy.py new file mode 100644 index 0000000..f86040a --- /dev/null +++ b/env/Lib/copy.py @@ -0,0 +1,313 @@ +"""Generic (shallow and deep) copying operations. + +Interface summary: + + import copy + + x = copy.copy(y) # make a shallow copy of y + x = copy.deepcopy(y) # make a deep copy of y + +For module specific errors, copy.Error is raised. + +The difference between shallow and deep copying is only relevant for +compound objects (objects that contain other objects, like lists or +class instances). + +- A shallow copy constructs a new compound object and then (to the + extent possible) inserts *the same objects* into it that the + original contains. + +- A deep copy constructs a new compound object and then, recursively, + inserts *copies* into it of the objects found in the original. + +Two problems often exist with deep copy operations that don't exist +with shallow copy operations: + + a) recursive objects (compound objects that, directly or indirectly, + contain a reference to themselves) may cause a recursive loop + + b) because deep copy copies *everything* it may copy too much, e.g. + administrative data structures that should be shared even between + copies + +Python's deep copy operation avoids these problems by: + + a) keeping a table of objects already copied during the current + copying pass + + b) letting user-defined classes override the copying operation or the + set of components copied + +This version does not copy types like module, class, function, method, +nor stack trace, stack frame, nor file, socket, window, nor array, nor +any similar types. + +Classes can use the same interfaces to control copying that they use +to control pickling: they can define methods called __getinitargs__(), +__getstate__() and __setstate__(). See the documentation for module +"pickle" for information on these methods. +""" + +import types +import weakref +from copyreg import dispatch_table + +class Error(Exception): + pass +error = Error # backward compatibility + +try: + from org.python.core import PyStringMap +except ImportError: + PyStringMap = None + +__all__ = ["Error", "copy", "deepcopy"] + +def copy(x): + """Shallow copy operation on arbitrary Python objects. + + See the module's __doc__ string for more info. + """ + + cls = type(x) + + copier = _copy_dispatch.get(cls) + if copier: + return copier(x) + + try: + issc = issubclass(cls, type) + except TypeError: # cls is not a class + issc = False + if issc: + # treat it as a regular class: + return _copy_immutable(x) + + copier = getattr(cls, "__copy__", None) + if copier: + return copier(x) + + reductor = dispatch_table.get(cls) + if reductor: + rv = reductor(x) + else: + reductor = getattr(x, "__reduce_ex__", None) + if reductor: + rv = reductor(4) + else: + reductor = getattr(x, "__reduce__", None) + if reductor: + rv = reductor() + else: + raise Error("un(shallow)copyable object of type %s" % cls) + + if isinstance(rv, str): + return x + return _reconstruct(x, None, *rv) + + +_copy_dispatch = d = {} + +def _copy_immutable(x): + return x +for t in (type(None), int, float, bool, complex, str, tuple, + bytes, frozenset, type, range, slice, + types.BuiltinFunctionType, type(Ellipsis), type(NotImplemented), + types.FunctionType, weakref.ref): + d[t] = _copy_immutable +t = getattr(types, "CodeType", None) +if t is not None: + d[t] = _copy_immutable + +d[list] = list.copy +d[dict] = dict.copy +d[set] = set.copy +d[bytearray] = bytearray.copy + +if PyStringMap is not None: + d[PyStringMap] = PyStringMap.copy + +del d, t + +def deepcopy(x, memo=None, _nil=[]): + """Deep copy operation on arbitrary Python objects. + + See the module's __doc__ string for more info. + """ + + if memo is None: + memo = {} + + d = id(x) + y = memo.get(d, _nil) + if y is not _nil: + return y + + cls = type(x) + + copier = _deepcopy_dispatch.get(cls) + if copier: + y = copier(x, memo) + else: + try: + issc = issubclass(cls, type) + except TypeError: # cls is not a class (old Boost; see SF #502085) + issc = 0 + if issc: + y = _deepcopy_atomic(x, memo) + else: + copier = getattr(x, "__deepcopy__", None) + if copier: + y = copier(memo) + else: + reductor = dispatch_table.get(cls) + if reductor: + rv = reductor(x) + else: + reductor = getattr(x, "__reduce_ex__", None) + if reductor: + rv = reductor(4) + else: + reductor = getattr(x, "__reduce__", None) + if reductor: + rv = reductor() + else: + raise Error( + "un(deep)copyable object of type %s" % cls) + if isinstance(rv, str): + y = x + else: + y = _reconstruct(x, memo, *rv) + + # If is its own copy, don't memoize. + if y is not x: + memo[d] = y + _keep_alive(x, memo) # Make sure x lives at least as long as d + return y + +_deepcopy_dispatch = d = {} + +def _deepcopy_atomic(x, memo): + return x +d[type(None)] = _deepcopy_atomic +d[type(Ellipsis)] = _deepcopy_atomic +d[type(NotImplemented)] = _deepcopy_atomic +d[int] = _deepcopy_atomic +d[float] = _deepcopy_atomic +d[bool] = _deepcopy_atomic +d[complex] = _deepcopy_atomic +d[bytes] = _deepcopy_atomic +d[str] = _deepcopy_atomic +try: + d[types.CodeType] = _deepcopy_atomic +except AttributeError: + pass +d[type] = _deepcopy_atomic +d[types.BuiltinFunctionType] = _deepcopy_atomic +d[types.FunctionType] = _deepcopy_atomic +d[weakref.ref] = _deepcopy_atomic + +def _deepcopy_list(x, memo, deepcopy=deepcopy): + y = [] + memo[id(x)] = y + append = y.append + for a in x: + append(deepcopy(a, memo)) + return y +d[list] = _deepcopy_list + +def _deepcopy_tuple(x, memo, deepcopy=deepcopy): + y = [deepcopy(a, memo) for a in x] + # We're not going to put the tuple in the memo, but it's still important we + # check for it, in case the tuple contains recursive mutable structures. + try: + return memo[id(x)] + except KeyError: + pass + for k, j in zip(x, y): + if k is not j: + y = tuple(y) + break + else: + y = x + return y +d[tuple] = _deepcopy_tuple + +def _deepcopy_dict(x, memo, deepcopy=deepcopy): + y = {} + memo[id(x)] = y + for key, value in x.items(): + y[deepcopy(key, memo)] = deepcopy(value, memo) + return y +d[dict] = _deepcopy_dict +if PyStringMap is not None: + d[PyStringMap] = _deepcopy_dict + +def _deepcopy_method(x, memo): # Copy instance methods + return type(x)(x.__func__, deepcopy(x.__self__, memo)) +d[types.MethodType] = _deepcopy_method + +del d + +def _keep_alive(x, memo): + """Keeps a reference to the object x in the memo. + + Because we remember objects by their id, we have + to assure that possibly temporary objects are kept + alive by referencing them. + We store a reference at the id of the memo, which should + normally not be used unless someone tries to deepcopy + the memo itself... + """ + try: + memo[id(memo)].append(x) + except KeyError: + # aha, this is the first one :-) + memo[id(memo)]=[x] + +def _reconstruct(x, memo, func, args, + state=None, listiter=None, dictiter=None, + deepcopy=deepcopy): + deep = memo is not None + if deep and args: + args = (deepcopy(arg, memo) for arg in args) + y = func(*args) + if deep: + memo[id(x)] = y + + if state is not None: + if deep: + state = deepcopy(state, memo) + if hasattr(y, '__setstate__'): + y.__setstate__(state) + else: + if isinstance(state, tuple) and len(state) == 2: + state, slotstate = state + else: + slotstate = None + if state is not None: + y.__dict__.update(state) + if slotstate is not None: + for key, value in slotstate.items(): + setattr(y, key, value) + + if listiter is not None: + if deep: + for item in listiter: + item = deepcopy(item, memo) + y.append(item) + else: + for item in listiter: + y.append(item) + if dictiter is not None: + if deep: + for key, value in dictiter: + key = deepcopy(key, memo) + value = deepcopy(value, memo) + y[key] = value + else: + for key, value in dictiter: + y[key] = value + return y + +del types, weakref, PyStringMap diff --git a/env/Lib/copyreg.py b/env/Lib/copyreg.py new file mode 100644 index 0000000..bbe1af4 --- /dev/null +++ b/env/Lib/copyreg.py @@ -0,0 +1,206 @@ +"""Helper to provide extensibility for pickle. + +This is only useful to add pickle support for extension types defined in +C, not for instances of user-defined classes. +""" + +__all__ = ["pickle", "constructor", + "add_extension", "remove_extension", "clear_extension_cache"] + +dispatch_table = {} + +def pickle(ob_type, pickle_function, constructor_ob=None): + if not callable(pickle_function): + raise TypeError("reduction functions must be callable") + dispatch_table[ob_type] = pickle_function + + # The constructor_ob function is a vestige of safe for unpickling. + # There is no reason for the caller to pass it anymore. + if constructor_ob is not None: + constructor(constructor_ob) + +def constructor(object): + if not callable(object): + raise TypeError("constructors must be callable") + +# Example: provide pickling support for complex numbers. + +try: + complex +except NameError: + pass +else: + + def pickle_complex(c): + return complex, (c.real, c.imag) + + pickle(complex, pickle_complex, complex) + +# Support for pickling new-style objects + +def _reconstructor(cls, base, state): + if base is object: + obj = object.__new__(cls) + else: + obj = base.__new__(cls, state) + if base.__init__ != object.__init__: + base.__init__(obj, state) + return obj + +_HEAPTYPE = 1<<9 + +# Python code for object.__reduce_ex__ for protocols 0 and 1 + +def _reduce_ex(self, proto): + assert proto < 2 + for base in self.__class__.__mro__: + if hasattr(base, '__flags__') and not base.__flags__ & _HEAPTYPE: + break + else: + base = object # not really reachable + if base is object: + state = None + else: + if base is self.__class__: + raise TypeError("can't pickle %s objects" % base.__name__) + state = base(self) + args = (self.__class__, base, state) + try: + getstate = self.__getstate__ + except AttributeError: + if getattr(self, "__slots__", None): + raise TypeError("a class that defines __slots__ without " + "defining __getstate__ cannot be pickled") from None + try: + dict = self.__dict__ + except AttributeError: + dict = None + else: + dict = getstate() + if dict: + return _reconstructor, args, dict + else: + return _reconstructor, args + +# Helper for __reduce_ex__ protocol 2 + +def __newobj__(cls, *args): + return cls.__new__(cls, *args) + +def __newobj_ex__(cls, args, kwargs): + """Used by pickle protocol 4, instead of __newobj__ to allow classes with + keyword-only arguments to be pickled correctly. + """ + return cls.__new__(cls, *args, **kwargs) + +def _slotnames(cls): + """Return a list of slot names for a given class. + + This needs to find slots defined by the class and its bases, so we + can't simply return the __slots__ attribute. We must walk down + the Method Resolution Order and concatenate the __slots__ of each + class found there. (This assumes classes don't modify their + __slots__ attribute to misrepresent their slots after the class is + defined.) + """ + + # Get the value from a cache in the class if possible + names = cls.__dict__.get("__slotnames__") + if names is not None: + return names + + # Not cached -- calculate the value + names = [] + if not hasattr(cls, "__slots__"): + # This class has no slots + pass + else: + # Slots found -- gather slot names from all base classes + for c in cls.__mro__: + if "__slots__" in c.__dict__: + slots = c.__dict__['__slots__'] + # if class has a single slot, it can be given as a string + if isinstance(slots, str): + slots = (slots,) + for name in slots: + # special descriptors + if name in ("__dict__", "__weakref__"): + continue + # mangled names + elif name.startswith('__') and not name.endswith('__'): + stripped = c.__name__.lstrip('_') + if stripped: + names.append('_%s%s' % (stripped, name)) + else: + names.append(name) + else: + names.append(name) + + # Cache the outcome in the class if at all possible + try: + cls.__slotnames__ = names + except: + pass # But don't die if we can't + + return names + +# A registry of extension codes. This is an ad-hoc compression +# mechanism. Whenever a global reference to , is about +# to be pickled, the (, ) tuple is looked up here to see +# if it is a registered extension code for it. Extension codes are +# universal, so that the meaning of a pickle does not depend on +# context. (There are also some codes reserved for local use that +# don't have this restriction.) Codes are positive ints; 0 is +# reserved. + +_extension_registry = {} # key -> code +_inverted_registry = {} # code -> key +_extension_cache = {} # code -> object +# Don't ever rebind those names: pickling grabs a reference to them when +# it's initialized, and won't see a rebinding. + +def add_extension(module, name, code): + """Register an extension code.""" + code = int(code) + if not 1 <= code <= 0x7fffffff: + raise ValueError("code out of range") + key = (module, name) + if (_extension_registry.get(key) == code and + _inverted_registry.get(code) == key): + return # Redundant registrations are benign + if key in _extension_registry: + raise ValueError("key %s is already registered with code %s" % + (key, _extension_registry[key])) + if code in _inverted_registry: + raise ValueError("code %s is already in use for key %s" % + (code, _inverted_registry[code])) + _extension_registry[key] = code + _inverted_registry[code] = key + +def remove_extension(module, name, code): + """Unregister an extension code. For testing only.""" + key = (module, name) + if (_extension_registry.get(key) != code or + _inverted_registry.get(code) != key): + raise ValueError("key %s is not registered with code %s" % + (key, code)) + del _extension_registry[key] + del _inverted_registry[code] + if code in _extension_cache: + del _extension_cache[code] + +def clear_extension_cache(): + _extension_cache.clear() + +# Standard extension code assignments + +# Reserved ranges + +# First Last Count Purpose +# 1 127 127 Reserved for Python standard library +# 128 191 64 Reserved for Zope +# 192 239 48 Reserved for 3rd parties +# 240 255 16 Reserved for private use (will never be assigned) +# 256 Inf Inf Reserved for future assignment + +# Extension codes are assigned by the Python Software Foundation. diff --git a/env/Lib/distutils/__init__.py b/env/Lib/distutils/__init__.py new file mode 100644 index 0000000..b9b0f24 --- /dev/null +++ b/env/Lib/distutils/__init__.py @@ -0,0 +1,134 @@ +import os +import sys +import warnings + +# opcode is not a virtualenv module, so we can use it to find the stdlib +# Important! To work on pypy, this must be a module that resides in the +# lib-python/modified-x.y.z directory +import opcode + +dirname = os.path.dirname + +distutils_path = os.path.join(os.path.dirname(opcode.__file__), "distutils") +if os.path.normpath(distutils_path) == os.path.dirname(os.path.normpath(__file__)): + warnings.warn("The virtualenv distutils package at %s appears to be in the same location as the system distutils?") +else: + __path__.insert(0, distutils_path) # noqa: F821 + if sys.version_info < (3, 4): + import imp + + real_distutils = imp.load_module("_virtualenv_distutils", None, distutils_path, ("", "", imp.PKG_DIRECTORY)) + else: + import importlib.machinery + + distutils_path = os.path.join(distutils_path, "__init__.py") + loader = importlib.machinery.SourceFileLoader("_virtualenv_distutils", distutils_path) + if sys.version_info < (3, 5): + import types + + real_distutils = types.ModuleType(loader.name) + else: + import importlib.util + + spec = importlib.util.spec_from_loader(loader.name, loader) + real_distutils = importlib.util.module_from_spec(spec) + loader.exec_module(real_distutils) + + # Copy the relevant attributes + try: + __revision__ = real_distutils.__revision__ + except AttributeError: + pass + __version__ = real_distutils.__version__ + +from distutils import dist, sysconfig # isort:skip + +try: + basestring +except NameError: + basestring = str + +# patch build_ext (distutils doesn't know how to get the libs directory +# path on windows - it hardcodes the paths around the patched sys.prefix) + +if sys.platform == "win32": + from distutils.command.build_ext import build_ext as old_build_ext + + class build_ext(old_build_ext): + def finalize_options(self): + if self.library_dirs is None: + self.library_dirs = [] + elif isinstance(self.library_dirs, basestring): + self.library_dirs = self.library_dirs.split(os.pathsep) + + self.library_dirs.insert(0, os.path.join(sys.real_prefix, "Libs")) + old_build_ext.finalize_options(self) + + from distutils.command import build_ext as build_ext_module + + build_ext_module.build_ext = build_ext + +# distutils.dist patches: + +old_find_config_files = dist.Distribution.find_config_files + + +def find_config_files(self): + found = old_find_config_files(self) + if os.name == "posix": + user_filename = ".pydistutils.cfg" + else: + user_filename = "pydistutils.cfg" + user_filename = os.path.join(sys.prefix, user_filename) + if os.path.isfile(user_filename): + for item in list(found): + if item.endswith("pydistutils.cfg"): + found.remove(item) + found.append(user_filename) + return found + + +dist.Distribution.find_config_files = find_config_files + +# distutils.sysconfig patches: + +old_get_python_inc = sysconfig.get_python_inc + + +def sysconfig_get_python_inc(plat_specific=0, prefix=None): + if prefix is None: + prefix = sys.real_prefix + return old_get_python_inc(plat_specific, prefix) + + +sysconfig_get_python_inc.__doc__ = old_get_python_inc.__doc__ +sysconfig.get_python_inc = sysconfig_get_python_inc + +old_get_python_lib = sysconfig.get_python_lib + + +def sysconfig_get_python_lib(plat_specific=0, standard_lib=0, prefix=None): + if standard_lib and prefix is None: + prefix = sys.real_prefix + return old_get_python_lib(plat_specific, standard_lib, prefix) + + +sysconfig_get_python_lib.__doc__ = old_get_python_lib.__doc__ +sysconfig.get_python_lib = sysconfig_get_python_lib + +old_get_config_vars = sysconfig.get_config_vars + + +def sysconfig_get_config_vars(*args): + real_vars = old_get_config_vars(*args) + if sys.platform == "win32": + lib_dir = os.path.join(sys.real_prefix, "libs") + if isinstance(real_vars, dict) and "LIBDIR" not in real_vars: + real_vars["LIBDIR"] = lib_dir # asked for all + elif isinstance(real_vars, list) and "LIBDIR" in args: + real_vars = real_vars + [lib_dir] # asked for list + return real_vars + + +sysconfig_get_config_vars.__doc__ = old_get_config_vars.__doc__ +sysconfig.get_config_vars = sysconfig_get_config_vars diff --git a/env/Lib/distutils/__pycache__/__init__.cpython-37.pyc b/env/Lib/distutils/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..aa83f81403aa2abb14f89f449bade05292bf2390 GIT binary patch literal 3157 zcma)8+in}j8Q$4lE|(NZQId7Aa$;R64I`Uz?bPuJZYw)Ag1TxEyG=7tx>$0C(vr(v zW_Be@0u2<9uZunc1@xvspP>)Y%el=>eA5T$Rlk2o)3S2WF0pg?PxJ48_=elnYT3f` z=YRhDo0SF2`i?fQA0LZf;LRGgWeH2L*y59!ac1^5x6SNuM_N6%SKtMj$DSDr(&-h? zn6S@m?i)%;`e$s)Be{|U|BUr*6-#?u7S0)CR`M@7H?9Z^vNp3M>s5u@x76RvNi|-R zweh?t2qt~u2~XB~^{#W~@`XehiABCN^}!cKbMjK}(s)@E$R1xY_I%j;-bkWq~yx@1GzxH9+%}pufZE%S;>lP$shI0 ze`V?xv*`D=mDqo@z`w$;z-lS}@nC~*3^w^D^nCdtv!JyOt)CdJ;Y3S*#6O&BvR+e^ z`!+281Nw9E$Ac|?m06E1Q4!UbmZ-|Brw-pTylddK5UnlQ3by1%?~~qj{!>vC^Dixa zU0x?ja9wWpZt$C8MbyQ@OU6HyH+w&mp9Xm4W^e=CTl_PzDi*~OxVPnJ;NAxJHn_LI zy~FQ{OJW%o@5#I1-2?9)cy|PQYBkqhQQhq5l8CbWAdlkgr2TAPHVz||AB3??4jVI0 zV;FY&;ht=Sd1Etcgu|f>Ro2MUMq4(bq>)1}3kR|hr=2j5(xefBOT^`XcVB)w6#lex&*_WH0efry6`+oZr*4z zU1}dhu?XZ*-ht@sK`%_Y;u03pqE0{;pvn;!M>vRttEi_sY^p+Y5${91*&i^BtRC8^ z@2kZD2tLT50j46<#w3KELTy2&&`H$lxsW9ba5Ew`1vAT%wnYL-6#p;=tKtTkW!W*gl;C|?%yr7 z2EYFE@ZsIv-@|UU`|RoV?jxD?^K`h|jl-;et$ln=9)*KpEO${TyYPH>mcQL|$x|z^ zbQf<{!Cu3q?oJ5OLCqfA>! zZ<%?v%j!sT4QqPUN8ofQ74*byNeA7ad-kfyD*&HiR<|1NrSSwS`rOe4~fv zS(&_#&4{VR5$;a{0^_Sa@pWXM5{mo}Z_y(7nvY?JSE#K;s6;>=-vH_V^BB?zgr^=? z$m46+ckr6$wa1UK%l?Fc3i~hCxx(hTgIm0SqV@=sP|n2>%YDGu1L2HVzo;IJY~;ha zPasFU5_lXutM4g3Vk3Kxt-|88lvN3*aFkd(A>{O6%c0KE9Xbl6G7q~UZCPMG$i&Lgm*W(xvd zn{{+xz}QdlwG&t-LnKMNAW-C!t{ehi0lp~aZmOMVFw}E#8j306>FV!({Ww5WKY#e_ zw_kqEYbFx2BlHp!Qk5eptwGq?j}oblb!kS_r8m_2)AT@fRn-IH8L{Akq${{G13f zp{|k$H71`Y&beAtEn-pKovUAhKt;Ef_U})E^?*t->tgVMOMbz(eS3{HSjDcOZhd$VNOIx80{(5aUzw&(heKkvJqQ}%##_M6$C^Vxp^(pXCJ literal 0 HcmV?d00001 diff --git a/env/Lib/distutils/distutils.cfg b/env/Lib/distutils/distutils.cfg new file mode 100644 index 0000000..1af230e --- /dev/null +++ b/env/Lib/distutils/distutils.cfg @@ -0,0 +1,6 @@ +# This is a config file local to this virtualenv installation +# You may include options that will be used by all distutils commands, +# and by easy_install. For instance: +# +# [easy_install] +# find_links = http://mylocalsite diff --git a/env/Lib/encodings/__init__.py b/env/Lib/encodings/__init__.py new file mode 100644 index 0000000..025b7a8 --- /dev/null +++ b/env/Lib/encodings/__init__.py @@ -0,0 +1,170 @@ +""" Standard "encodings" Package + + Standard Python encoding modules are stored in this package + directory. + + Codec modules must have names corresponding to normalized encoding + names as defined in the normalize_encoding() function below, e.g. + 'utf-8' must be implemented by the module 'utf_8.py'. + + Each codec module must export the following interface: + + * getregentry() -> codecs.CodecInfo object + The getregentry() API must return a CodecInfo object with encoder, decoder, + incrementalencoder, incrementaldecoder, streamwriter and streamreader + atttributes which adhere to the Python Codec Interface Standard. + + In addition, a module may optionally also define the following + APIs which are then used by the package's codec search function: + + * getaliases() -> sequence of encoding name strings to use as aliases + + Alias names returned by getaliases() must be normalized encoding + names as defined by normalize_encoding(). + +Written by Marc-Andre Lemburg (mal@lemburg.com). + +(c) Copyright CNRI, All Rights Reserved. NO WARRANTY. + +"""#" + +import codecs +import sys +from . import aliases + +_cache = {} +_unknown = '--unknown--' +_import_tail = ['*'] +_aliases = aliases.aliases + +class CodecRegistryError(LookupError, SystemError): + pass + +def normalize_encoding(encoding): + + """ Normalize an encoding name. + + Normalization works as follows: all non-alphanumeric + characters except the dot used for Python package names are + collapsed and replaced with a single underscore, e.g. ' -;#' + becomes '_'. Leading and trailing underscores are removed. + + Note that encoding names should be ASCII only; if they do use + non-ASCII characters, these must be Latin-1 compatible. + + """ + if isinstance(encoding, bytes): + encoding = str(encoding, "ascii") + + chars = [] + punct = False + for c in encoding: + if c.isalnum() or c == '.': + if punct and chars: + chars.append('_') + chars.append(c) + punct = False + else: + punct = True + return ''.join(chars) + +def search_function(encoding): + + # Cache lookup + entry = _cache.get(encoding, _unknown) + if entry is not _unknown: + return entry + + # Import the module: + # + # First try to find an alias for the normalized encoding + # name and lookup the module using the aliased name, then try to + # lookup the module using the standard import scheme, i.e. first + # try in the encodings package, then at top-level. + # + norm_encoding = normalize_encoding(encoding) + aliased_encoding = _aliases.get(norm_encoding) or \ + _aliases.get(norm_encoding.replace('.', '_')) + if aliased_encoding is not None: + modnames = [aliased_encoding, + norm_encoding] + else: + modnames = [norm_encoding] + for modname in modnames: + if not modname or '.' in modname: + continue + try: + # Import is absolute to prevent the possibly malicious import of a + # module with side-effects that is not in the 'encodings' package. + mod = __import__('encodings.' + modname, fromlist=_import_tail, + level=0) + except ImportError: + # ImportError may occur because 'encodings.(modname)' does not exist, + # or because it imports a name that does not exist (see mbcs and oem) + pass + else: + break + else: + mod = None + + try: + getregentry = mod.getregentry + except AttributeError: + # Not a codec module + mod = None + + if mod is None: + # Cache misses + _cache[encoding] = None + return None + + # Now ask the module for the registry entry + entry = getregentry() + if not isinstance(entry, codecs.CodecInfo): + if not 4 <= len(entry) <= 7: + raise CodecRegistryError('module "%s" (%s) failed to register' + % (mod.__name__, mod.__file__)) + if not callable(entry[0]) or not callable(entry[1]) or \ + (entry[2] is not None and not callable(entry[2])) or \ + (entry[3] is not None and not callable(entry[3])) or \ + (len(entry) > 4 and entry[4] is not None and not callable(entry[4])) or \ + (len(entry) > 5 and entry[5] is not None and not callable(entry[5])): + raise CodecRegistryError('incompatible codecs in module "%s" (%s)' + % (mod.__name__, mod.__file__)) + if len(entry)<7 or entry[6] is None: + entry += (None,)*(6-len(entry)) + (mod.__name__.split(".", 1)[1],) + entry = codecs.CodecInfo(*entry) + + # Cache the codec registry entry + _cache[encoding] = entry + + # Register its aliases (without overwriting previously registered + # aliases) + try: + codecaliases = mod.getaliases() + except AttributeError: + pass + else: + for alias in codecaliases: + if alias not in _aliases: + _aliases[alias] = modname + + # Return the registry entry + return entry + +# Register the search_function in the Python codec registry +codecs.register(search_function) + +if sys.platform == 'win32': + def _alias_mbcs(encoding): + try: + import _winapi + ansi_code_page = "cp%s" % _winapi.GetACP() + if encoding == ansi_code_page: + import encodings.mbcs + return encodings.mbcs.getregentry() + except ImportError: + # Imports may fail while we are shutting down + pass + + codecs.register(_alias_mbcs) diff --git a/env/Lib/encodings/__pycache__/__init__.cpython-37.pyc b/env/Lib/encodings/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..cd91845395d02a90eeea712db68062000a04950f GIT binary patch literal 3966 zcmai1L2ul~6`movT<%I*DXwEXfLjdgrqZgCkk~*II7VPuNn8PnDo74&6AB25GrOXe zORk1o%WH6fqRO>}Pd%p6vG@Lj9(wAbN5Z$9^bZQ3`puBLvYkU$;BbcX=FOWo-}~Ov z!@0R8!S6qBZh!ypYlQry29sY6od3V(Fx?ZPppaK^DUJ0}&-B zD@?3)*R+rfb6LJM!Ql`oktuKrNsZZ%g+DS^_t#1=q+^Q6Q z|3rqco&hJ-2YiGot;x@_Ooj);3|Dt@7{VhyKNJ82ZcaI`!i+YKZBD!}#Z=|WO&oyp zP~Ff9j#2`P_5Be`2I`|9MI+`%X;NMGyWZ7?z#&r$)b@uWX2bOI7Ar(9Duk&kONB3C z?F1Na-wV*@ry?z{B^Ad*_(-s%GsT~Vs`7=37Iji=#DK(VVR^;tN=pUm@{&qpaF3T8 zOkg(!?f(NgFgcZd3*hkM6WmgULqpDuofi!HdZVJ zZJ=f_l418SV;kGMn=5QRirB6ir)*cGLOvIKjcxydJz3w~UEhBE49hOSUS#`%qHWWn zULEG;%8-8@T9Y71Oej_upI>p8O0Tija|_V;n307QYLb{ zZ5EE_sR;MHqUm`hAkd%nyyKxCl{0@QvH^X%dGqbYz5VZCaJv6^@8SOXVDOcn`TJW* z;79vAGU-acpYE4vtX_9N+mFJ7{RvB?`<@rZVdi;=ajCd^Nm*>5ai|^#>KN(=-qgN&HxrHEPeaDXmsLn9=A8)nn)*%> z*#kyXR?<>>4|t7$rg+tl28Vt;>|jp9W$0O+nWR z>OC$<+b)_RoRA^~2coDQjKHFWi7+VYVG5KF`-SZf1|sH#b(Dm0+bWz1T-};7A$4m5 zmD&m#T*iV_B}j4Q=REOSh1VNs$Xt^)4U1Z|Nf)Stwn=RRFu#tuDa@4`6<`|XIRYUg zXB0p;&W$n6X=d~q@Db6D%p2!)aIfs0)l_A3jxP%QoIrj%H*=$FjIG$l zn~tp)Te*escrdQzHR*Di*Lt>$j@{9<%;siZyH2t?w|MQ(=GcBh;;R@yM@Pf2dW5=RzXhwXi=+ar1X6yci9 z;8e3mbEn2DBVFcp*2?KAwTMZ2^c9s&URQ6Bx#cC0}bvjFn{i8n(~<%=U7hdXGTjzgXSUtDRSdWEjo!R_To!9B z;5cE2UMHU^|G{@T{R?{VBPj7c8O`SQ+0}D0c5oxt${T^k$CKNOfBlraV7UVX+!#0V zMrQTunBUK9nUy#0lUK&^{u9ums#mwA${unK&CBK_4AM2J6OmCk9hvkaB$1*PiRU7^ zP%M2>SJJnug5uW4sBM=%PEiknI6y>5-6+DaMo6iM{z5mV>Zt_qauG$*G>oeXP1U&X z>$|Wa-KN{^4-4B1P#22AM4m?yt5Tv4EDWn;S=1{oRLKn`CkjTL+^TK{>x!98{aq)- zV&<*tuV}4LYA!t~=dpQV>#`Al%FU=YpBxi-kCC=f{uenGv5|EqdP!5iF8Uw zlBVb68W|(i=LQn_Cwk6M9Cu`%S?A!Bim7VgpKqpE2lpthX`9;`voEb+04&-?-NWww zAaw0VB3s|saa)(@?jHoHYpGUyR4&4pwxzE~eu}=^^5Zo0l%Kr;{$+C;)3xtAdZt95 zr{efdi$NpGUD YaK|uMCodbfc*S&XI^Q*Mo6gMt0G_r~IRF3v literal 0 HcmV?d00001 diff --git a/env/Lib/encodings/__pycache__/aliases.cpython-37.pyc b/env/Lib/encodings/__pycache__/aliases.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9eed6a5f34c8b34a7c82fbf571dada2fdd9ae09a GIT binary patch literal 6315 zcma)A+j`r^5td0x6lFba-){Wlfw&=)$2%{dMz7;?I&ZJzT&C+Y=U$dZRZ=;Ro1)0e`ryF9zYiB_ z<*ahqWQhZ+sS@eTpE~s-aS}bTa*8NkMrVmrB~ckKoYQ6<*J-|X>YQz?qQX*MM=LB+ z=f*1YchzbS^E!d;sOAN(n_K7QD$3GJnr^M{D2wytG%pigQ0BBB(#i6C*%YrhRn9Ct zDQM_C%`#^ZeS*c{2i)73mTbUmO`CqUvk&rhoviEXHRZdCR^puIS(cyED)5y9DpL+e zR6ccL%!$%9LaIEeoct7ene*Pghxd4CG7~SNGK%Y@L_}-t12*TJFH(e;_Vws#y+D9t z?AXcDc}cd5GXEr%N!6OkWfE6+o%hyGBxS0PgyvVtD^BE`Cg;XbRU~nGn#Qn*IU5UR z2OO#>Lloyp!qyUrBfHv-syI!>;T-$)$01J^y?J^z5d-?WSXOZb^3u~|yKylbO~qbZ zxI@op?0OT0$3w>6#9&wRp2j1M#~Q17-bC5)Cd#fi2?Un$rXxaQZ_Egbf}0G7gr?I8 zp#Uo}@)XiS)(n)Dz*j21%PPLo^x1Uav+2NB^L$^a%m~d!tT`Ji4htP7O&mT+tI!(` z#~bcq=(*Syj};0pOVK}@yTNdTIGoMBk?V=>*?cJmi{wIwaj+=DGG9gOKy((D;vlVZ zZ|Hg9lR_M}bm(qzp15U=DK{*^NE};Sa#6Qt;Swzo1e00l4lUZX=#fQ_EqY?nz8Dxg zUQ3Qza@>-*LPpn`Hf^OrOCrio@t>9gYLh&!ReAQy^AR9L7&eeE4ZB z2E?6}NwO3-iA>`pi`G&c5W`d89?=|RrBgTMGOZR@z119dx?j||!xNn3Uz)rqQ++Ud zWnPCk(LuFHPis1Fal9eb(YL%l{2HG+^!oS{`W_CwsZT=}dsaA{CmS+L)F^HjkB+>} zC`gR%(i~i1LV?(C8tvD?C9;H~UwVMvM0EYJe|a3Ot2DeA-5rPS%nyX&L&a~82YkOr z{#5kiN`3cx>3l^3Iw;r+o9gm5$Po11wEP4{XRg>MNm_=!=rk2vszN{jaY_zX3ZV5Y_cVru*~0*`7A?(thrN`1zWN}bSYg@KnSbQ64j;jsaT?{ z_$_b~p-$577>95>u8KII0#Kk6APElxcPZ&A8$?+)aIq~eUhovs=~99|B8wpAQC8!V zC37V1Qr3Q+SDOr14aPFm+9t|ag9f4D(SikKc+?I|Bn#H zD6ff9V#J9Gf);~fF)+kjAVPe{W)#(nY+(SSp18v<`yOYPMKUiFTy$0-*HBT+JarBv zf!IW!D5Z^fQ^hgbdLxiP>~F*QHc zRF?}FhEd15%_4?A0=x?W&_1%8N?`}6UtqYT+|+e$!)&y6NvjaOhO**r!^x3ks4hs` zWfHALAN|6_AG%_&tim{C@_0icp9IK0%j&`%YMl$zBanx>U{Z#~ml!Y7HF_Lz3*T~; zPXbj%1DqE*7q0~^3q&itjBh&*oxxaTx*~FbcV#-(=6IW+NiBfF^I!TBei}qvR-HN7e{fYs}jo^91K$ zZA90c){;7xmLF};R;*r?ngHq%{Q>_^$hE#551=oMxy%c-$UP zfpGEpbu!#sJ*|g_Kx$8R)y~vpmv*M&5Gu(Cv+)7*?5RC(Y|o?8Hp3~=wovscwJ=Q% z%w{lwkDW~fwuuP_@YV3Z%pUM<+rIM2*z?fgb~7|gstW;Og+=e1U00o%+J>iYxv}A5 zkDUxzjFJh%%-E--%#v1J2J6MPOh08!yFztbA*3Cs#bY89R^fHjA1jD#H%PoeN~6VW_`=7 ze=Slef)ZSSEsN z+aBRowI)<+tQMPDv(RPFf?0bn(a3f(WP08dFgni>>dM}#VvK%_+FraHmX|ngXz!Iv z#z$4HD7u*FE@)f)N^xd_2z8@wXuDFAe*S*O&Up`~uttEgNi61_M-G|+~te5ExJS~+9=_bU>W87s<1oDH z>mM^d-6{L{WtRVZ_Wpy{PClxVvO4+j@%@u~Me$ZtM zY;D`v=Iyc1qyN7dM$2I1EAh5vvpXX-d^^w9ZfRrB#%7MP(dvG_yp4xF=YP@4s?ylD ryKT$XQ$8xmVCy`M9kQfA*;LUmHWY3nWO%ir(K0h_Z06WHL~H&(t@Gfr literal 0 HcmV?d00001 diff --git a/env/Lib/encodings/__pycache__/ascii.cpython-37.pyc b/env/Lib/encodings/__pycache__/ascii.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..184c311ee7e36a7f160a2b5c2189b49ffd1caeea GIT binary patch literal 1903 zcmbtU&yU+g6rS<#c(c20SP(0Lu;9>If?PNtA%wC7iWY%EDN;q`%JO<AQazSp7(`zO4^AeNljz&;uj7_SgR9XIt^oGzClZPK`?vb2bos+y^EQO8To z=KAse2XT>~#o9w&&gxiu9)cnRr|wgP7L;c>Tq8F~F!9fbK6wplLjo$p5auPHqGmvW z(+*C{Ov!~To3!{$N2Km$w3QY;$-x*>51<|$nplVMk9yP2W=*UsEBL#d?J*f2x(4Q8$yh={zZovvy6_ZubC1@*U75rTLj zAKM_d4qw4BZ(MUo_J4Iak*RoThm`lXt~n%ox5IxK5rS5@cr3E@0n3+>yZ$; ztwmF+YX)-O4)SedckQEYU|r#;wqNUX{-D#jv5;VJ9rkojw>>>3Ps{U4PnoR~-BOCG zM^Q!vvx(M-6O*PNB#SI8)`l&a8g}v5I5>aJI(hU@v3OoG}Z+gp4 ckKRY!6#tlVqTN~Cvj*kvVYx0x{!xK>z>% literal 0 HcmV?d00001 diff --git a/env/Lib/encodings/__pycache__/big5.cpython-37.pyc b/env/Lib/encodings/__pycache__/big5.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3e6288b0e270bac097776993cf58365d78663fd5 GIT binary patch literal 1463 zcmbVM&u`N(6t)v5b<^~RCMG6LLI_U1a6xDiLTF+jv;#e`1CkXKrLifklC(Ikrk=Yi z{{aU$^6zlWl@tHMPQ2%|Yp3E>IIe;?&Zlyo;W&)r zZ}TKueeqJPu6$MCpzSa$PhUp!Qt2`>6!H47k_2f#F6%J!&C_?AW<Ub1{_w(R zmE<2)BGq2Z9biK1)XJ&G{65T|^w{jj+y$oNEoRJbF*gA?!-B^U44F_#jk6>Z*G6VM z0iNHcN$@4^zRRr!A~K?qcQfhjroI!(k`8yJBTut3({$ r^w>6-6?o@cZGl=h&VHwO{;K}Vd5veWM9=pqcLL{tbtrf7IfDB?FoZK3 literal 0 HcmV?d00001 diff --git a/env/Lib/encodings/__pycache__/cp1252.cpython-37.pyc b/env/Lib/encodings/__pycache__/cp1252.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..deade5d81ff8712a1d846fc42941f25bae73fcc4 GIT binary patch literal 2475 zcmbtVS$Gsh5T0v~Y&Hpm07g+3QE@#I0TD%nz=mLiERhWa*Tr?RGf6h?MehU*qO2t1 zi3cD80w&?U?;FDRb$#)LHy`J5ee%h7o~)Y5CIRF3$w$xE)!o(AT~&Wo*DNk6@d()d zxHo<6y*YyLCoKxifs-2S*&ZaC5Ee91lM-TBTqQh_A?z=0%>@;yID$)Jn9{9wF?~%EEZIw@7#Q ziD8c>g#`b&jq81lT}FF4V>K(ops4CBfPiD?`-{^?^`bQ+0DaE}KKufkrx3)wHH*hHpdMXr~Ke zbYWGdtIFf~3lR{4F`|Vg?A)`vtF!XhFhq0f>g_lRLxb8Cv`z?q^s(efhGVcBOo zvj&UDj2IoKMk4_oz@9BdVhFwBCUKKwNPRLM6oY=*bXull&C(cpom4YX+c>k-8qxWv zp|&J+lvJ{MqSbW7Q<+Y~bn1+yS@yWVD9HDg1?ELoWp$Q~G=&yN7G*NEs-Z@fr();P*L=0Y*%CQ?L%ys`$O!Jj;4t0MXi81$(WvQ(Mw4l+ zGeL82G`g-+P1rlkOG?U!jHt6_q?3{BWJ{Jja7!N9;>2(<+(=~&_Ut4i!-?V;P80>B z>@>^kQ!%C|^^~C|mRQiTy0I~=z-xw*MCgzVxlh)_N&zpCf=t9czhc43D64FooWzw! z&@&ya@syev<&fnId0LLW0AA(4O&SU=B3XxO#*v2cMCh1})L0-*z+DovE_REI){h8L zt(78=3Q-A}ZKV<=&1i@iq5L2~lm!&Tu>cw}sA@RX#sKI)vuGk-O1%IO&F=$<;#xxj z6r#bRbRXp}MugT6t8k^RYX4i|WK=L^ltNnH zr;wr$AORl|L+B7S(U7`@4%woL;V_(r%W!MbHWzv=2eBqvmEP|%6?&;7@6;@hk31#2 z7_s|!c8Hki#ZrvGVMjj-s|^;6{vx|16q9i);ldO+TMPBDFin1ulio@x07kP@kC8cHK#+Og1m^f+j zW0j9TG3CjpruwEmJ^h(ypPTW#|AiM{dbz6lm6@|)%(A$Q8*F@yq-Qzsj%i>-+}4$#3!7e1PA99DEL2pc{JN3)l)@!dLJ$ zd;{OYcd!kfF@fVw}XjDtbqEWlH(z6+r z0`z?BJfJ`_Dkf%0;a}a-8Bb`8YVeo|;+}8+coxVgVf`Z%$*q*T%awAaLauPQ%aqN+ HX2J0f6}f<= literal 0 HcmV?d00001 diff --git a/env/Lib/encodings/__pycache__/cp437.cpython-37.pyc b/env/Lib/encodings/__pycache__/cp437.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..85b4ded00ba4064b09b22dd1d2bb06bbf296b86d GIT binary patch literal 7862 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 literal 0 HcmV?d00001 diff --git a/env/Lib/encodings/__pycache__/iso8859_5.cpython-37.pyc b/env/Lib/encodings/__pycache__/iso8859_5.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..29bd83b442e8fbf9b3975ccc8e71301712767900 GIT binary patch literal 2448 zcmbtVS$7mw5bkZ(OcDqIj3N%A;-~}_B8!NDuo#sg5)>Q<+s@ohGI2I;_lSuogbe$> zg&h(%M8$ny&$+*#+Q)v>C;tLZR`q0(fbkqTbe~&&?{}A~`l@dAit6gHgwG$>XKxNK zkfgt8P45z`a8uGdL_K!c1wGVw3uM zqHVo)cRm+w={C5LvP~XcYZMCUTvxOu&&*UbZRHm&YFex}MZ3(L$qn0N(N3PvM(3Hp5D9XuEXWMkU*1PN z-egjFA|8`DF<$xj+@P-KjI62aZdli|c~;C&Kceefibke9!y}}mmc*DkuSYsLxlXoN zkk^Z!}jl47A^^Yt5y&nKg5^ky+(Y%U4g#VLcu*k|$D+ zVynX{lN%&FM2T}5=VF>iC#S?J^W-N~9b?b+b*6JhW}HKwFXU+*whDO-|2AnPxX9#c zR5OV*OeR6w%1li}(iEJfW!}L-nbY_-DO%~J$n8>8O=f$kL`gHAB2FydOb}%O1#u#R zMht2kO|=OK`p+zyiic9G5JdeO2%@+)(*laoXb#B~bT`s&bJNIfJMq9|;sM`p6E3`jkyCpFt=`|W@o zWXhocdacI$LL=p9Zc{AaYIIr0uBuy?9=lEDdc<$Q%2DEO1Pd~9hYek+jJA4A#zN() z6!NNCYpyfzUF|U?UK(=>6(?^z4##E8XpL~Ix=hr9{}h||&cc-z-5W{PWJUJlt9UP; ziCD3p0xc`5=JN-Fp>S2Cx~6v0RV8qv6iGX52mVp6IN5XWw`K19KjXJ@oJ+ za~tP9`q<<17c@PwaM9u=PcD6G+0)I-SG25LwR+7nt z9@q=}U_TsygW?(-h9htkj=^y_0Vm-U48mzR183nJoQDf=5iY@H7=mGV7v6*S;RE;( zuE0ld6+VVf;8VB;pTXzw1$+r#!PoE&d<);f_wWP!2tUEk@C*D3zrpX$4yWJQ=?pj} zXP2|v+2ibW_Bs2V1I|I`kaO5M@@Hw#Ip!R9PBQ_i4s+BxH#bchHimv}`AeThu^-66ql!Pzx}MAZZa4Qk14J;Ie_7BB;QEpt);>0!2DQ zI)RPc>_ad85ACskr$=6U>R-sIGfTaks%VO?FhlMq?#|3Nk4KxEF2nWv+fRSIZ8G); zZRQL2tcOzmgi5dx6I^H+AMtOP(1mfugdzDvyVOS-BBrnqu@KP_(GjtQgNTEOfrx=f zOSp)*QbWwVG)5+38={R^TVWPr7Gj%X3$ZO}N$=Y&tty#&$LHR+F(iBaT!8cr<@ERr#@^j&ob|G1(@l!0-*w%) ziI1mG&mkSZsJuZiJowD(XPGyoed!HlDdCkAT`%~~d)^-o`@ypx@YtV72@4X^^TqL{ zhf;ooO0p40$~37@Fig}IhQZN&tu~djf$!8#6y@<$Mp5lX(Xs=&D!+SR=P6L%=SX?33sL=7B9)0p5syP){ zA)3&y_y}tUiLmOGB{vSN_->ka+u^M=>h1vMRg6A^fwA zy{88kt+Xs2Jh=D8-o9_w2F4W1KW_?&C)#)ji_|*HB2)4=858RohV{ uiX@7fp+b{k#f~zej1hP0$Xbie!)Bg;MR`%?4DJ{myJK{W9eqdd*na`lvU+0x literal 0 HcmV?d00001 diff --git a/env/Lib/encodings/__pycache__/mbcs.cpython-37.pyc b/env/Lib/encodings/__pycache__/mbcs.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..520c3a2a8a6f926193ebe6640642d3fe03b0c0f8 GIT binary patch literal 1714 zcmbVMPmkL~6!+MUlX$b+ZHj<`K!cEIEtOn2R6+=48z`&<0i~5zSV5NKnIvxgC%l=k zO10v$d*y@hbvU89a)OW06Yq_)B`d-K#(LvkCJ;Md!*99m$>rmtGto z(iI^hAtG%=I*1&I9wI$Nx`=cUITS~T93c`S5{g^m_{xb7g!jaW`Y(Rt-){7>uK2xj zmZ^JuR12B$c@6w5uS9*W!Y~{abtMI#ZTQzIJm+7gWm#8(-!GTVYN(#)t5se}J;>^E zkgg*>hq~mc%JO`$+B^u)mwC42=c(f7kZUcg?P1x6CzSxnzmnx_4GTOnErvy-&{@$S z4DV+VvRZ8*Uo15rjVGrM_(@Ul3F(SYq>}KX6azl~hM%2GCMV;k-{Eh6V04|xH3#HZ zBC8A?+bZZGDq|BU4SA+Bm$u@dH)UspqIx)K=fb&Qf?ZOq-0{!XL$BA-nyy}Vke zDY3c}#dyL;)`97tRvE}rRyr*{ zw_$+C8U0Fw-XtRwb&M0b%r2Z~?9vtNu4CN>hIr%x(SU%~p7E6|=FmdLwB~u07B&FQ z)FCuzBK{_>xBOq+{U?z@vuhl&$B}P3Nm8YyOcE0&Nm+|^LF-_7&A8tx4gYpuhqo}vC~kQYM~>*jT|q=!Am$juvZ`pi}cjH4DD;V*EDCJK+uzd1@~ z>-k(l(j;jwpWC?mZIo+1r2i*Ay(b!ETApFU$bC#~I{q~rchKCsJLXCMKjtSg6?@Hl zc%UuGz1~yZzPDqZ^c&`>m`AjMDnw(!38r1`XS_Ph}y=d0%+1t z|C)aOcUd=81UIm4YD^EC9K(o$eq3vG3rUDNCZL-jQ>JV0z0(RWJ{wXpVM_=oZ$R{c zLb%UabFh$TV}Tt8n-6f4tuTlA%-wn59sGh92wgBy&$N?7)LD`M)kxD?HljDJo3|d> tLX%>rcecgZFtemAJvx6cz0N01FMUc*sXk7=ckFh2-wnOK-}mro{RO*1dJ6ym literal 0 HcmV?d00001 diff --git a/env/Lib/encodings/__pycache__/raw_unicode_escape.cpython-37.pyc b/env/Lib/encodings/__pycache__/raw_unicode_escape.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..678295338f2d3963963dd754803092a6e6c885d6 GIT binary patch literal 1788 zcmbtU&u<$=6rR~%-fWx}+<=HcVkMB;m547KkWhsj0<9v!f?T8sYtd@6GjVOLcg@VY zRifUSEBzbVWB(nFdqq9)FZ9IsX6-m3J`^$5d$aHJ%)EKudvCto*$EiNpKm|=?Ty3O zUu3L?i;n?BKYs!AJZd6Sio~1;iB|5D$nA#0Jt4J`f*>1H=Kc zB?2IUw1BzKoskP{TXcbS4dwy!#E!Ui!A2cnJz~-A^B3XIXZ7Q%4DYJ!>Heae!R-VG07E z9>PwSVW(}_sVwQw##_#tmSC@0($24$+Q#LKdV8FIoh%TYPHKIUWb?Vm>MSX$JS&p9 zs>Ujt>11w5Urt|sl@ybc#JHQ3W1ZZ*Qy)xPaIr%~ppuyHc-$b@xU%ujfR=m+wc-l3 zV+s3$k5E-$%4>Q@Wv=8*mUUKqZ(>ysa@tCRW^!-{(LJb|z2wjMGd8teS%U8|B0E-; zmB>~eCe?ugTS`?*M|R_AS)4ZRq?|A6#yy>sS+S-^b!mqW^#MdvOpKrJ-Mmr1Wj~Ji zgUC^ID@E5*)HY`Sl`{?b=3wGy7h(?fxgtAO z*^Hh6sbU22uY9b7SUbFfV?Md!knI2Ja40kJ&JHQ>pI&iD_BDr;g+p3E*Q(i+3tn4O z8{*V%?bV&y7uFvg6u2Fq_inz2QKxa}`Dn|Jm~MKLbt|<6tFB>fs#Md}hQOzWz?B6` z5nZ%px~SPQ@7GazTA99HJ26G9C|`;=R20{y6gS&r2`^*xwL1G8i!@ak;|{kVr0J(V u28Ktnlcu7|)3j}2>cfqGX!S;C{{8l4{f2s3Q*ArkcY2+k({pz1UH2d3AbLUo literal 0 HcmV?d00001 diff --git a/env/Lib/encodings/__pycache__/unicode_escape.cpython-37.pyc b/env/Lib/encodings/__pycache__/unicode_escape.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..758faa630a383e90f6ab10db565efd4d4a58e51d GIT binary patch literal 1768 zcmbtU&yU+g6rS;~c)i&zge_tP5|%(}Ezw+hsDx0J?LyH?U{DsRA~LePp4l{!V}}{1 z)vkK$o+|M_z>zPPd*EeiXt4+ScgNYrFtesKa9T%pBxQ`NAV9oV%y)~fyFuLRpa;>K=cPt zl8rccvZOtQZ_pmR;PAp~Tyxnt@*6)*%WNjov&jXh?%?SE%#7nd^X^=bZjvVd1Qsr6Zs&F3Pkv!tlWn3|MhoowEv5B4k^zemm^bC~aV+#nnL*q9m6lJ}uj{2*5>VPEkP zvIy*WP4A@4m7K}4&Wf*$kLqzwTd7e`296=R2UW9Q`3wGnO|9Q7!4DY`94m@MWGfGy z>Og@dr7EQ(yK%HE&Kq}9&KGs#o=?iGSW~0Aw8MwG4bkKiSMMPfbPFqji(^|=FMx`%R z3@6@*$J&Xt!S`^?M>h=8_`ez)%1peqL5lmwHw@Bv!yrZBm=@5rYBuG9*VfdAIJH}Q zb*J`)^-Bi{ZpWAVo9|!LX&ibk+SDVKo8DwyMs2dH4Xh25YP#Bx_uP=T8i7uD7VVe{ zYIe+fbyA*Jrl!|MOad#4l_LHW`Lr#(&F)yj${01REjVD9UymH7)9*2Npdf1Zn|6fdnXuz_QX522wVVT?7>v5EOT%$e>7d zxJn=+x4Or^Lv!rw^tjia`U*L9W+~e;>J(^~*x}CXa_5_GW_Y;09WWe!y!-scLx-_H zNx2xPvjd#<0)=2BCb+N)KH`#}S|eNR3P-r-eB^w~geO|(Otf&v{n;M5Xz@iGEp4=T zXlbD(5FNC1(Bh-TN6VJjM$0x@+GuHu9dYZNjRIjEv*`BOFX6M5dRdj>-KCoB-+!<_ zmUqKJC1f51!E=}?CChNU3ct%B-|v?KWcXCh$4i)o_vTq~P&7&}ujWxN2=3((e!W=1 zZ2D4#gLruKMc6Nja7cO`4rMLjl@z@&{yu!(9}fHR$&dKiUl=@#wO1>c<2_#5_y3;xzd_*Q%pS=!49ZmoAQg7p4_bSzWU(T02OtXwRW_9Q?B_3sQ? zc+0zZ@Ky2yBB_&;DmOQQUtVo_gHHBiTBRRX`Nj9 z>Md5}*PJ!U8YjysVJbb6B$gI$7WcC}N>Vgf|2b|;R>4 z!x!ZP$RSXVP*BF3&yAj=emN+v1Dq!G3kIcq>Wo~$DfDaXJvJo(apVEz1$If?CPBmi z@u+vw@p3Yeu&$RIVG$%s*##`p|0AreV+AssQ#Z-?0_xzs?fdNFwRvoLa#CI0Zz>BYk3azc zad}g?x-*sNV2aHMtIzOIO*O>0!>x@6h>(Z_^?lUQtuz%?o~BKeT_u$QGmiBqhojVD9Uymr77y72Npdf1Y!X}fCMOl!m`p722wVVT?7>v5HxqC$e>7d zxN0FIx46f?Lv!rw^tjiY@(MY1W+~e;>J(^~*db?jx%168GrPaJ8894wefa9-BZskf zq?`}b*&fb%jzX{z6I@sYA92Y~tdT9Yg(KWEK61We!V|4CCR(`SzOhFxT71z)OB*d7 zT3TocLl zI(enSK|DOT7xs%H9Fks#Ls?7sMT%Y+{}8_D4~PBu=qLQ`JqFKW?bQmVxymh4anRev zIlx(Op-}7({+hk!g1@y9z7-!umiBUjTkCC%Aie)EEo6#1+HlRCmh*+uo&>0%{*yrq zPx%lJzD|BbBz1ChxS#ar^Cy|gl4n((70Gj`CXmhQq~T@tdhjSIrpJja@!V-Ssgny| zz4=mmjlUZN(_rV&#_t^G#jx>f4`=-;3du$slWhrCSi;8i+QPwjJl#DgbC5Gxs;u~y zoJn|^)2}q>P4zOsS$9zwI*^bP>#ZgD4l|Sh$Cbzi+P%(+!7jlwtJ^(6h0CD62`3u~wOAvRdq8)?K{>82&o`9?lt-Wd zfVjLaT-}*SbTGkYgyomGsiqoY+~L;R14Kx~f%-n`=vJDFDo@j<$}W>iff>j8^LmcxC=vjV&8bZvaxzX98!U-19{ literal 0 HcmV?d00001 diff --git a/env/Lib/encodings/__pycache__/utf_8.cpython-37.pyc b/env/Lib/encodings/__pycache__/utf_8.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a136c5bbba342aa354fec02a2d04de4ef0633b1a GIT binary patch literal 1633 zcmbVMPmj|^6rb_GI8Jtf0ByJG!4(Iv1i5ekA%r#?pxTP2D7y$Xa%FivlaQ5Thvx|> zD=t;{+V23zew`lY+Ec#*r@l8%*sQu#YR8)Ad2hz^e((3*^WN50z;OKW@y5?zI*k2E z%6g#Ac5zm76oQSI;KIuJh)aHKjcjpQIKn;UBj-CNJkdC1qJcZ^ulC4Ai!YjJX`;nL zO9L%|XrZNr79TA>TH0a@En8@5qNORe#idg=3WRmQqAMrAgwL1iRat~L7ixUx{>`vo z3Yi5#@Dip<$s#;jhCif`-RTtqWcWEx9P z`-9>B?XZ{U;gIwy9Lh?<8!5Ws;K%S~Z#e7?4u8VW{=&f7Kzo&fX{IuZR2=knarSXm z+b9%!&)>0kT<{MzLbnEok)^$i;8wbg=#%>iu2Dz3J1yo5r9BByLiIa?2Hx=T`~HLY z1)`|p!-KuJH=jRFRT@7lvow#NLpgzTR>d_RtJmFoaXvkYWr6oji%At5Ki&CKd$q4i z1kYgR(8P6y^V6_#wTrX*0)=EFjtRDeD=cASN^Rj_9G>p%7a7QzEL565Ax9FPX7niy zdQ*+`aaJ7^h6W_!*!o}zzQYU^z;P$CfljZvFqkEHW=A`f%*Q~4YIi&>(%djo3!kiB zef}!0SMi+e{1aHWJ~fE=)5y_&k`(DoCW#J`WLAnrPV07(yk4Yvy#tiG4PTT8AcsIb zK>-N!29XDp6Sz#`3JD?wh(o=d94*FU z39CA}5EenAbgf~L{vTnr4;09BMja$S3#f(nex96bxVy7~g7p7~VklEAsDGoy)a`{_ zTt~0pY@i_h915!VJ{|Z9g<{9poXS$Ra+Iq))ezQi4NR0hIC0J2C2DAg%A$^&KGvP- zS@Ewb_MENmGSF@OJs_tzF`BjZ)-W9Tb=^1n^e@;i#^u@lrmBE)2m~I8$BRPMt%*bj z6Kq0Qev5}HsvpK3Zf!h3WJDaO-=mgpB#9`qB&jRxETI&bajd`IGxa9LMklQbwFYJI f7-V$yg~1 +# + +import _codecs_tw, codecs +import _multibytecodec as mbc + +codec = _codecs_tw.getcodec('big5') + +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='big5', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) diff --git a/env/Lib/encodings/big5hkscs.py b/env/Lib/encodings/big5hkscs.py new file mode 100644 index 0000000..350df37 --- /dev/null +++ b/env/Lib/encodings/big5hkscs.py @@ -0,0 +1,39 @@ +# +# big5hkscs.py: Python Unicode Codec for BIG5HKSCS +# +# Written by Hye-Shik Chang +# + +import _codecs_hk, codecs +import _multibytecodec as mbc + +codec = _codecs_hk.getcodec('big5hkscs') + +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='big5hkscs', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) diff --git a/env/Lib/encodings/bz2_codec.py b/env/Lib/encodings/bz2_codec.py new file mode 100644 index 0000000..fd9495e --- /dev/null +++ b/env/Lib/encodings/bz2_codec.py @@ -0,0 +1,78 @@ +"""Python 'bz2_codec' Codec - bz2 compression encoding. + +This codec de/encodes from bytes to bytes and is therefore usable with +bytes.transform() and bytes.untransform(). + +Adapted by Raymond Hettinger from zlib_codec.py which was written +by Marc-Andre Lemburg (mal@lemburg.com). +""" + +import codecs +import bz2 # this codec needs the optional bz2 module ! + +### Codec APIs + +def bz2_encode(input, errors='strict'): + assert errors == 'strict' + return (bz2.compress(input), len(input)) + +def bz2_decode(input, errors='strict'): + assert errors == 'strict' + return (bz2.decompress(input), len(input)) + +class Codec(codecs.Codec): + def encode(self, input, errors='strict'): + return bz2_encode(input, errors) + def decode(self, input, errors='strict'): + return bz2_decode(input, errors) + +class IncrementalEncoder(codecs.IncrementalEncoder): + def __init__(self, errors='strict'): + assert errors == 'strict' + self.errors = errors + self.compressobj = bz2.BZ2Compressor() + + 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 = bz2.BZ2Compressor() + +class IncrementalDecoder(codecs.IncrementalDecoder): + def __init__(self, errors='strict'): + assert errors == 'strict' + self.errors = errors + self.decompressobj = bz2.BZ2Decompressor() + + def decode(self, input, final=False): + try: + return self.decompressobj.decompress(input) + except EOFError: + return '' + + def reset(self): + self.decompressobj = bz2.BZ2Decompressor() + +class StreamWriter(Codec, codecs.StreamWriter): + charbuffertype = bytes + +class StreamReader(Codec, codecs.StreamReader): + charbuffertype = bytes + +### encodings module API + +def getregentry(): + return codecs.CodecInfo( + name="bz2", + encode=bz2_encode, + decode=bz2_decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamwriter=StreamWriter, + streamreader=StreamReader, + _is_text_encoding=False, + ) diff --git a/env/Lib/encodings/charmap.py b/env/Lib/encodings/charmap.py new file mode 100644 index 0000000..81189b1 --- /dev/null +++ b/env/Lib/encodings/charmap.py @@ -0,0 +1,69 @@ +""" Generic Python Character Mapping Codec. + + Use this codec directly rather than through the automatic + conversion mechanisms supplied by unicode() and .encode(). + + +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.charmap_encode + decode = codecs.charmap_decode + +class IncrementalEncoder(codecs.IncrementalEncoder): + def __init__(self, errors='strict', mapping=None): + codecs.IncrementalEncoder.__init__(self, errors) + self.mapping = mapping + + def encode(self, input, final=False): + return codecs.charmap_encode(input, self.errors, self.mapping)[0] + +class IncrementalDecoder(codecs.IncrementalDecoder): + def __init__(self, errors='strict', mapping=None): + codecs.IncrementalDecoder.__init__(self, errors) + self.mapping = mapping + + def decode(self, input, final=False): + return codecs.charmap_decode(input, self.errors, self.mapping)[0] + +class StreamWriter(Codec,codecs.StreamWriter): + + def __init__(self,stream,errors='strict',mapping=None): + codecs.StreamWriter.__init__(self,stream,errors) + self.mapping = mapping + + def encode(self,input,errors='strict'): + return Codec.encode(input,errors,self.mapping) + +class StreamReader(Codec,codecs.StreamReader): + + def __init__(self,stream,errors='strict',mapping=None): + codecs.StreamReader.__init__(self,stream,errors) + self.mapping = mapping + + def decode(self,input,errors='strict'): + return Codec.decode(input,errors,self.mapping) + +### encodings module API + +def getregentry(): + return codecs.CodecInfo( + name='charmap', + encode=Codec.encode, + decode=Codec.decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamwriter=StreamWriter, + streamreader=StreamReader, + ) diff --git a/env/Lib/encodings/cp037.py b/env/Lib/encodings/cp037.py new file mode 100644 index 0000000..4edd708 --- /dev/null +++ b/env/Lib/encodings/cp037.py @@ -0,0 +1,307 @@ +""" Python Character Mapping Codec cp037 generated from 'MAPPINGS/VENDORS/MICSFT/EBCDIC/CP037.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='cp037', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) + + +### Decoding Table + +decoding_table = ( + '\x00' # 0x00 -> NULL + '\x01' # 0x01 -> START OF HEADING + '\x02' # 0x02 -> START OF TEXT + '\x03' # 0x03 -> END OF TEXT + '\x9c' # 0x04 -> CONTROL + '\t' # 0x05 -> HORIZONTAL TABULATION + '\x86' # 0x06 -> CONTROL + '\x7f' # 0x07 -> DELETE + '\x97' # 0x08 -> CONTROL + '\x8d' # 0x09 -> CONTROL + '\x8e' # 0x0A -> CONTROL + '\x0b' # 0x0B -> VERTICAL TABULATION + '\x0c' # 0x0C -> FORM FEED + '\r' # 0x0D -> CARRIAGE RETURN + '\x0e' # 0x0E -> SHIFT OUT + '\x0f' # 0x0F -> SHIFT IN + '\x10' # 0x10 -> DATA LINK ESCAPE + '\x11' # 0x11 -> DEVICE CONTROL ONE + '\x12' # 0x12 -> DEVICE CONTROL TWO + '\x13' # 0x13 -> DEVICE CONTROL THREE + '\x9d' # 0x14 -> CONTROL + '\x85' # 0x15 -> CONTROL + '\x08' # 0x16 -> BACKSPACE + '\x87' # 0x17 -> CONTROL + '\x18' # 0x18 -> CANCEL + '\x19' # 0x19 -> END OF MEDIUM + '\x92' # 0x1A -> CONTROL + '\x8f' # 0x1B -> CONTROL + '\x1c' # 0x1C -> FILE SEPARATOR + '\x1d' # 0x1D -> GROUP SEPARATOR + '\x1e' # 0x1E -> RECORD SEPARATOR + '\x1f' # 0x1F -> UNIT SEPARATOR + '\x80' # 0x20 -> CONTROL + '\x81' # 0x21 -> CONTROL + '\x82' # 0x22 -> CONTROL + '\x83' # 0x23 -> CONTROL + '\x84' # 0x24 -> CONTROL + '\n' # 0x25 -> LINE FEED + '\x17' # 0x26 -> END OF TRANSMISSION BLOCK + '\x1b' # 0x27 -> ESCAPE + '\x88' # 0x28 -> CONTROL + '\x89' # 0x29 -> CONTROL + '\x8a' # 0x2A -> CONTROL + '\x8b' # 0x2B -> CONTROL + '\x8c' # 0x2C -> CONTROL + '\x05' # 0x2D -> ENQUIRY + '\x06' # 0x2E -> ACKNOWLEDGE + '\x07' # 0x2F -> BELL + '\x90' # 0x30 -> CONTROL + '\x91' # 0x31 -> CONTROL + '\x16' # 0x32 -> SYNCHRONOUS IDLE + '\x93' # 0x33 -> CONTROL + '\x94' # 0x34 -> CONTROL + '\x95' # 0x35 -> CONTROL + '\x96' # 0x36 -> CONTROL + '\x04' # 0x37 -> END OF TRANSMISSION + '\x98' # 0x38 -> CONTROL + '\x99' # 0x39 -> CONTROL + '\x9a' # 0x3A -> CONTROL + '\x9b' # 0x3B -> CONTROL + '\x14' # 0x3C -> DEVICE CONTROL FOUR + '\x15' # 0x3D -> NEGATIVE ACKNOWLEDGE + '\x9e' # 0x3E -> CONTROL + '\x1a' # 0x3F -> SUBSTITUTE + ' ' # 0x40 -> SPACE + '\xa0' # 0x41 -> NO-BREAK SPACE + '\xe2' # 0x42 -> LATIN SMALL LETTER A WITH CIRCUMFLEX + '\xe4' # 0x43 -> LATIN SMALL LETTER A WITH DIAERESIS + '\xe0' # 0x44 -> LATIN SMALL LETTER A WITH GRAVE + '\xe1' # 0x45 -> LATIN SMALL LETTER A WITH ACUTE + '\xe3' # 0x46 -> LATIN SMALL LETTER A WITH TILDE + '\xe5' # 0x47 -> LATIN SMALL LETTER A WITH RING ABOVE + '\xe7' # 0x48 -> LATIN SMALL LETTER C WITH CEDILLA + '\xf1' # 0x49 -> LATIN SMALL LETTER N WITH TILDE + '\xa2' # 0x4A -> CENT SIGN + '.' # 0x4B -> FULL STOP + '<' # 0x4C -> LESS-THAN SIGN + '(' # 0x4D -> LEFT PARENTHESIS + '+' # 0x4E -> PLUS SIGN + '|' # 0x4F -> VERTICAL LINE + '&' # 0x50 -> AMPERSAND + '\xe9' # 0x51 -> LATIN SMALL LETTER E WITH ACUTE + '\xea' # 0x52 -> LATIN SMALL LETTER E WITH CIRCUMFLEX + '\xeb' # 0x53 -> LATIN SMALL LETTER E WITH DIAERESIS + '\xe8' # 0x54 -> LATIN SMALL LETTER E WITH GRAVE + '\xed' # 0x55 -> LATIN SMALL LETTER I WITH ACUTE + '\xee' # 0x56 -> LATIN SMALL LETTER I WITH CIRCUMFLEX + '\xef' # 0x57 -> LATIN SMALL LETTER I WITH DIAERESIS + '\xec' # 0x58 -> LATIN SMALL LETTER I WITH GRAVE + '\xdf' # 0x59 -> LATIN SMALL LETTER SHARP S (GERMAN) + '!' # 0x5A -> EXCLAMATION MARK + '$' # 0x5B -> DOLLAR SIGN + '*' # 0x5C -> ASTERISK + ')' # 0x5D -> RIGHT PARENTHESIS + ';' # 0x5E -> SEMICOLON + '\xac' # 0x5F -> NOT SIGN + '-' # 0x60 -> HYPHEN-MINUS + '/' # 0x61 -> SOLIDUS + '\xc2' # 0x62 -> LATIN CAPITAL LETTER A WITH CIRCUMFLEX + '\xc4' # 0x63 -> LATIN CAPITAL LETTER A WITH DIAERESIS + '\xc0' # 0x64 -> LATIN CAPITAL LETTER A WITH GRAVE + '\xc1' # 0x65 -> LATIN CAPITAL LETTER A WITH ACUTE + '\xc3' # 0x66 -> LATIN CAPITAL LETTER A WITH TILDE + '\xc5' # 0x67 -> LATIN CAPITAL LETTER A WITH RING ABOVE + '\xc7' # 0x68 -> LATIN CAPITAL LETTER C WITH CEDILLA + '\xd1' # 0x69 -> LATIN CAPITAL LETTER N WITH TILDE + '\xa6' # 0x6A -> BROKEN BAR + ',' # 0x6B -> COMMA + '%' # 0x6C -> PERCENT SIGN + '_' # 0x6D -> LOW LINE + '>' # 0x6E -> GREATER-THAN SIGN + '?' # 0x6F -> QUESTION MARK + '\xf8' # 0x70 -> LATIN SMALL LETTER O WITH STROKE + '\xc9' # 0x71 -> LATIN CAPITAL LETTER E WITH ACUTE + '\xca' # 0x72 -> LATIN CAPITAL LETTER E WITH CIRCUMFLEX + '\xcb' # 0x73 -> LATIN CAPITAL LETTER E WITH DIAERESIS + '\xc8' # 0x74 -> LATIN CAPITAL LETTER E WITH GRAVE + '\xcd' # 0x75 -> LATIN CAPITAL LETTER I WITH ACUTE + '\xce' # 0x76 -> LATIN CAPITAL LETTER I WITH CIRCUMFLEX + '\xcf' # 0x77 -> LATIN CAPITAL LETTER I WITH DIAERESIS + '\xcc' # 0x78 -> LATIN CAPITAL LETTER I WITH GRAVE + '`' # 0x79 -> GRAVE ACCENT + ':' # 0x7A -> COLON + '#' # 0x7B -> NUMBER SIGN + '@' # 0x7C -> COMMERCIAL AT + "'" # 0x7D -> APOSTROPHE + '=' # 0x7E -> EQUALS SIGN + '"' # 0x7F -> QUOTATION MARK + '\xd8' # 0x80 -> LATIN CAPITAL LETTER O WITH STROKE + 'a' # 0x81 -> LATIN SMALL LETTER A + 'b' # 0x82 -> LATIN SMALL LETTER B + 'c' # 0x83 -> LATIN SMALL LETTER C + 'd' # 0x84 -> LATIN SMALL LETTER D + 'e' # 0x85 -> LATIN SMALL LETTER E + 'f' # 0x86 -> LATIN SMALL LETTER F + 'g' # 0x87 -> LATIN SMALL LETTER G + 'h' # 0x88 -> LATIN SMALL LETTER H + 'i' # 0x89 -> LATIN SMALL LETTER I + '\xab' # 0x8A -> LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + '\xbb' # 0x8B -> RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + '\xf0' # 0x8C -> LATIN SMALL LETTER ETH (ICELANDIC) + '\xfd' # 0x8D -> LATIN SMALL LETTER Y WITH ACUTE + '\xfe' # 0x8E -> LATIN SMALL LETTER THORN (ICELANDIC) + '\xb1' # 0x8F -> PLUS-MINUS SIGN + '\xb0' # 0x90 -> DEGREE SIGN + 'j' # 0x91 -> LATIN SMALL LETTER J + 'k' # 0x92 -> LATIN SMALL LETTER K + 'l' # 0x93 -> LATIN SMALL LETTER L + 'm' # 0x94 -> LATIN SMALL LETTER M + 'n' # 0x95 -> LATIN SMALL LETTER N + 'o' # 0x96 -> LATIN SMALL LETTER O + 'p' # 0x97 -> LATIN SMALL LETTER P + 'q' # 0x98 -> LATIN SMALL LETTER Q + 'r' # 0x99 -> LATIN SMALL LETTER R + '\xaa' # 0x9A -> FEMININE ORDINAL INDICATOR + '\xba' # 0x9B -> MASCULINE ORDINAL INDICATOR + '\xe6' # 0x9C -> LATIN SMALL LIGATURE AE + '\xb8' # 0x9D -> CEDILLA + '\xc6' # 0x9E -> LATIN CAPITAL LIGATURE AE + '\xa4' # 0x9F -> CURRENCY SIGN + '\xb5' # 0xA0 -> MICRO SIGN + '~' # 0xA1 -> TILDE + 's' # 0xA2 -> LATIN SMALL LETTER S + 't' # 0xA3 -> LATIN SMALL LETTER T + 'u' # 0xA4 -> LATIN SMALL LETTER U + 'v' # 0xA5 -> LATIN SMALL LETTER V + 'w' # 0xA6 -> LATIN SMALL LETTER W + 'x' # 0xA7 -> LATIN SMALL LETTER X + 'y' # 0xA8 -> LATIN SMALL LETTER Y + 'z' # 0xA9 -> LATIN SMALL LETTER Z + '\xa1' # 0xAA -> INVERTED EXCLAMATION MARK + '\xbf' # 0xAB -> INVERTED QUESTION MARK + '\xd0' # 0xAC -> LATIN CAPITAL LETTER ETH (ICELANDIC) + '\xdd' # 0xAD -> LATIN CAPITAL LETTER Y WITH ACUTE + '\xde' # 0xAE -> LATIN CAPITAL LETTER THORN (ICELANDIC) + '\xae' # 0xAF -> REGISTERED SIGN + '^' # 0xB0 -> CIRCUMFLEX ACCENT + '\xa3' # 0xB1 -> POUND SIGN + '\xa5' # 0xB2 -> YEN SIGN + '\xb7' # 0xB3 -> MIDDLE DOT + '\xa9' # 0xB4 -> COPYRIGHT SIGN + '\xa7' # 0xB5 -> SECTION SIGN + '\xb6' # 0xB6 -> PILCROW SIGN + '\xbc' # 0xB7 -> VULGAR FRACTION ONE QUARTER + '\xbd' # 0xB8 -> VULGAR FRACTION ONE HALF + '\xbe' # 0xB9 -> VULGAR FRACTION THREE QUARTERS + '[' # 0xBA -> LEFT SQUARE BRACKET + ']' # 0xBB -> RIGHT SQUARE BRACKET + '\xaf' # 0xBC -> MACRON + '\xa8' # 0xBD -> DIAERESIS + '\xb4' # 0xBE -> ACUTE ACCENT + '\xd7' # 0xBF -> MULTIPLICATION SIGN + '{' # 0xC0 -> LEFT CURLY BRACKET + 'A' # 0xC1 -> LATIN CAPITAL LETTER A + 'B' # 0xC2 -> LATIN CAPITAL LETTER B + 'C' # 0xC3 -> LATIN CAPITAL LETTER C + 'D' # 0xC4 -> LATIN CAPITAL LETTER D + 'E' # 0xC5 -> LATIN CAPITAL LETTER E + 'F' # 0xC6 -> LATIN CAPITAL LETTER F + 'G' # 0xC7 -> LATIN CAPITAL LETTER G + 'H' # 0xC8 -> LATIN CAPITAL LETTER H + 'I' # 0xC9 -> LATIN CAPITAL LETTER I + '\xad' # 0xCA -> SOFT HYPHEN + '\xf4' # 0xCB -> LATIN SMALL LETTER O WITH CIRCUMFLEX + '\xf6' # 0xCC -> LATIN SMALL LETTER O WITH DIAERESIS + '\xf2' # 0xCD -> LATIN SMALL LETTER O WITH GRAVE + '\xf3' # 0xCE -> LATIN SMALL LETTER O WITH ACUTE + '\xf5' # 0xCF -> LATIN SMALL LETTER O WITH TILDE + '}' # 0xD0 -> RIGHT CURLY BRACKET + 'J' # 0xD1 -> LATIN CAPITAL LETTER J + 'K' # 0xD2 -> LATIN CAPITAL LETTER K + 'L' # 0xD3 -> LATIN CAPITAL LETTER L + 'M' # 0xD4 -> LATIN CAPITAL LETTER M + 'N' # 0xD5 -> LATIN CAPITAL LETTER N + 'O' # 0xD6 -> LATIN CAPITAL LETTER O + 'P' # 0xD7 -> LATIN CAPITAL LETTER P + 'Q' # 0xD8 -> LATIN CAPITAL LETTER Q + 'R' # 0xD9 -> LATIN CAPITAL LETTER R + '\xb9' # 0xDA -> SUPERSCRIPT ONE + '\xfb' # 0xDB -> LATIN SMALL LETTER U WITH CIRCUMFLEX + '\xfc' # 0xDC -> LATIN SMALL LETTER U WITH DIAERESIS + '\xf9' # 0xDD -> LATIN SMALL LETTER U WITH GRAVE + '\xfa' # 0xDE -> LATIN SMALL LETTER U WITH ACUTE + '\xff' # 0xDF -> LATIN SMALL LETTER Y WITH DIAERESIS + '\\' # 0xE0 -> REVERSE SOLIDUS + '\xf7' # 0xE1 -> DIVISION SIGN + 'S' # 0xE2 -> LATIN CAPITAL LETTER S + 'T' # 0xE3 -> LATIN CAPITAL LETTER T + 'U' # 0xE4 -> LATIN CAPITAL LETTER U + 'V' # 0xE5 -> LATIN CAPITAL LETTER V + 'W' # 0xE6 -> LATIN CAPITAL LETTER W + 'X' # 0xE7 -> LATIN CAPITAL LETTER X + 'Y' # 0xE8 -> LATIN CAPITAL LETTER Y + 'Z' # 0xE9 -> LATIN CAPITAL LETTER Z + '\xb2' # 0xEA -> SUPERSCRIPT TWO + '\xd4' # 0xEB -> LATIN CAPITAL LETTER O WITH CIRCUMFLEX + '\xd6' # 0xEC -> LATIN CAPITAL LETTER O WITH DIAERESIS + '\xd2' # 0xED -> LATIN CAPITAL LETTER O WITH GRAVE + '\xd3' # 0xEE -> LATIN CAPITAL LETTER O WITH ACUTE + '\xd5' # 0xEF -> LATIN CAPITAL LETTER O WITH TILDE + '0' # 0xF0 -> DIGIT ZERO + '1' # 0xF1 -> DIGIT ONE + '2' # 0xF2 -> DIGIT TWO + '3' # 0xF3 -> DIGIT THREE + '4' # 0xF4 -> DIGIT FOUR + '5' # 0xF5 -> DIGIT FIVE + '6' # 0xF6 -> DIGIT SIX + '7' # 0xF7 -> DIGIT SEVEN + '8' # 0xF8 -> DIGIT EIGHT + '9' # 0xF9 -> DIGIT NINE + '\xb3' # 0xFA -> SUPERSCRIPT THREE + '\xdb' # 0xFB -> LATIN CAPITAL LETTER U WITH CIRCUMFLEX + '\xdc' # 0xFC -> LATIN CAPITAL LETTER U WITH DIAERESIS + '\xd9' # 0xFD -> LATIN CAPITAL LETTER U WITH GRAVE + '\xda' # 0xFE -> LATIN CAPITAL LETTER U WITH ACUTE + '\x9f' # 0xFF -> CONTROL +) + +### Encoding table +encoding_table=codecs.charmap_build(decoding_table) diff --git a/env/Lib/encodings/cp1006.py b/env/Lib/encodings/cp1006.py new file mode 100644 index 0000000..a1221c3 --- /dev/null +++ b/env/Lib/encodings/cp1006.py @@ -0,0 +1,307 @@ +""" Python Character Mapping Codec cp1006 generated from 'MAPPINGS/VENDORS/MISC/CP1006.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='cp1006', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) + + +### Decoding Table + +decoding_table = ( + '\x00' # 0x00 -> NULL + '\x01' # 0x01 -> START OF HEADING + '\x02' # 0x02 -> START OF TEXT + '\x03' # 0x03 -> END OF TEXT + '\x04' # 0x04 -> END OF TRANSMISSION + '\x05' # 0x05 -> ENQUIRY + '\x06' # 0x06 -> ACKNOWLEDGE + '\x07' # 0x07 -> BELL + '\x08' # 0x08 -> BACKSPACE + '\t' # 0x09 -> HORIZONTAL TABULATION + '\n' # 0x0A -> LINE FEED + '\x0b' # 0x0B -> VERTICAL TABULATION + '\x0c' # 0x0C -> FORM FEED + '\r' # 0x0D -> CARRIAGE RETURN + '\x0e' # 0x0E -> SHIFT OUT + '\x0f' # 0x0F -> SHIFT IN + '\x10' # 0x10 -> DATA LINK ESCAPE + '\x11' # 0x11 -> DEVICE CONTROL ONE + '\x12' # 0x12 -> DEVICE CONTROL TWO + '\x13' # 0x13 -> DEVICE CONTROL THREE + '\x14' # 0x14 -> DEVICE CONTROL FOUR + '\x15' # 0x15 -> NEGATIVE ACKNOWLEDGE + '\x16' # 0x16 -> SYNCHRONOUS IDLE + '\x17' # 0x17 -> END OF TRANSMISSION BLOCK + '\x18' # 0x18 -> CANCEL + '\x19' # 0x19 -> END OF MEDIUM + '\x1a' # 0x1A -> SUBSTITUTE + '\x1b' # 0x1B -> ESCAPE + '\x1c' # 0x1C -> FILE SEPARATOR + '\x1d' # 0x1D -> GROUP SEPARATOR + '\x1e' # 0x1E -> RECORD SEPARATOR + '\x1f' # 0x1F -> UNIT SEPARATOR + ' ' # 0x20 -> SPACE + '!' # 0x21 -> EXCLAMATION MARK + '"' # 0x22 -> QUOTATION MARK + '#' # 0x23 -> NUMBER SIGN + '$' # 0x24 -> DOLLAR SIGN + '%' # 0x25 -> PERCENT SIGN + '&' # 0x26 -> AMPERSAND + "'" # 0x27 -> APOSTROPHE + '(' # 0x28 -> LEFT PARENTHESIS + ')' # 0x29 -> RIGHT PARENTHESIS + '*' # 0x2A -> ASTERISK + '+' # 0x2B -> PLUS SIGN + ',' # 0x2C -> COMMA + '-' # 0x2D -> HYPHEN-MINUS + '.' # 0x2E -> FULL STOP + '/' # 0x2F -> SOLIDUS + '0' # 0x30 -> DIGIT ZERO + '1' # 0x31 -> DIGIT ONE + '2' # 0x32 -> DIGIT TWO + '3' # 0x33 -> DIGIT THREE + '4' # 0x34 -> DIGIT FOUR + '5' # 0x35 -> DIGIT FIVE + '6' # 0x36 -> DIGIT SIX + '7' # 0x37 -> DIGIT SEVEN + '8' # 0x38 -> DIGIT EIGHT + '9' # 0x39 -> DIGIT NINE + ':' # 0x3A -> COLON + ';' # 0x3B -> SEMICOLON + '<' # 0x3C -> LESS-THAN SIGN + '=' # 0x3D -> EQUALS SIGN + '>' # 0x3E -> GREATER-THAN SIGN + '?' # 0x3F -> QUESTION MARK + '@' # 0x40 -> COMMERCIAL AT + 'A' # 0x41 -> LATIN CAPITAL LETTER A + 'B' # 0x42 -> LATIN CAPITAL LETTER B + 'C' # 0x43 -> LATIN CAPITAL LETTER C + 'D' # 0x44 -> LATIN CAPITAL LETTER D + 'E' # 0x45 -> LATIN CAPITAL LETTER E + 'F' # 0x46 -> LATIN CAPITAL LETTER F + 'G' # 0x47 -> LATIN CAPITAL LETTER G + 'H' # 0x48 -> LATIN CAPITAL LETTER H + 'I' # 0x49 -> LATIN CAPITAL LETTER I + 'J' # 0x4A -> LATIN CAPITAL LETTER J + 'K' # 0x4B -> LATIN CAPITAL LETTER K + 'L' # 0x4C -> LATIN CAPITAL LETTER L + 'M' # 0x4D -> LATIN CAPITAL LETTER M + 'N' # 0x4E -> LATIN CAPITAL LETTER N + 'O' # 0x4F -> LATIN CAPITAL LETTER O + 'P' # 0x50 -> LATIN CAPITAL LETTER P + 'Q' # 0x51 -> LATIN CAPITAL LETTER Q + 'R' # 0x52 -> LATIN CAPITAL LETTER R + 'S' # 0x53 -> LATIN CAPITAL LETTER S + 'T' # 0x54 -> LATIN CAPITAL LETTER T + 'U' # 0x55 -> LATIN CAPITAL LETTER U + 'V' # 0x56 -> LATIN CAPITAL LETTER V + 'W' # 0x57 -> LATIN CAPITAL LETTER W + 'X' # 0x58 -> LATIN CAPITAL LETTER X + 'Y' # 0x59 -> LATIN CAPITAL LETTER Y + 'Z' # 0x5A -> LATIN CAPITAL LETTER Z + '[' # 0x5B -> LEFT SQUARE BRACKET + '\\' # 0x5C -> REVERSE SOLIDUS + ']' # 0x5D -> RIGHT SQUARE BRACKET + '^' # 0x5E -> CIRCUMFLEX ACCENT + '_' # 0x5F -> LOW LINE + '`' # 0x60 -> GRAVE ACCENT + 'a' # 0x61 -> LATIN SMALL LETTER A + 'b' # 0x62 -> LATIN SMALL LETTER B + 'c' # 0x63 -> LATIN SMALL LETTER C + 'd' # 0x64 -> LATIN SMALL LETTER D + 'e' # 0x65 -> LATIN SMALL LETTER E + 'f' # 0x66 -> LATIN SMALL LETTER F + 'g' # 0x67 -> LATIN SMALL LETTER G + 'h' # 0x68 -> LATIN SMALL LETTER H + 'i' # 0x69 -> LATIN SMALL LETTER I + 'j' # 0x6A -> LATIN SMALL LETTER J + 'k' # 0x6B -> LATIN SMALL LETTER K + 'l' # 0x6C -> LATIN SMALL LETTER L + 'm' # 0x6D -> LATIN SMALL LETTER M + 'n' # 0x6E -> LATIN SMALL LETTER N + 'o' # 0x6F -> LATIN SMALL LETTER O + 'p' # 0x70 -> LATIN SMALL LETTER P + 'q' # 0x71 -> LATIN SMALL LETTER Q + 'r' # 0x72 -> LATIN SMALL LETTER R + 's' # 0x73 -> LATIN SMALL LETTER S + 't' # 0x74 -> LATIN SMALL LETTER T + 'u' # 0x75 -> LATIN SMALL LETTER U + 'v' # 0x76 -> LATIN SMALL LETTER V + 'w' # 0x77 -> LATIN SMALL LETTER W + 'x' # 0x78 -> LATIN SMALL LETTER X + 'y' # 0x79 -> LATIN SMALL LETTER Y + 'z' # 0x7A -> LATIN SMALL LETTER Z + '{' # 0x7B -> LEFT CURLY BRACKET + '|' # 0x7C -> VERTICAL LINE + '}' # 0x7D -> RIGHT CURLY BRACKET + '~' # 0x7E -> TILDE + '\x7f' # 0x7F -> DELETE + '\x80' # 0x80 -> + '\x81' # 0x81 -> + '\x82' # 0x82 -> + '\x83' # 0x83 -> + '\x84' # 0x84 -> + '\x85' # 0x85 -> + '\x86' # 0x86 -> + '\x87' # 0x87 -> + '\x88' # 0x88 -> + '\x89' # 0x89 -> + '\x8a' # 0x8A -> + '\x8b' # 0x8B -> + '\x8c' # 0x8C -> + '\x8d' # 0x8D -> + '\x8e' # 0x8E -> + '\x8f' # 0x8F -> + '\x90' # 0x90 -> + '\x91' # 0x91 -> + '\x92' # 0x92 -> + '\x93' # 0x93 -> + '\x94' # 0x94 -> + '\x95' # 0x95 -> + '\x96' # 0x96 -> + '\x97' # 0x97 -> + '\x98' # 0x98 -> + '\x99' # 0x99 -> + '\x9a' # 0x9A -> + '\x9b' # 0x9B -> + '\x9c' # 0x9C -> + '\x9d' # 0x9D -> + '\x9e' # 0x9E -> + '\x9f' # 0x9F -> + '\xa0' # 0xA0 -> NO-BREAK SPACE + '\u06f0' # 0xA1 -> EXTENDED ARABIC-INDIC DIGIT ZERO + '\u06f1' # 0xA2 -> EXTENDED ARABIC-INDIC DIGIT ONE + '\u06f2' # 0xA3 -> EXTENDED ARABIC-INDIC DIGIT TWO + '\u06f3' # 0xA4 -> EXTENDED ARABIC-INDIC DIGIT THREE + '\u06f4' # 0xA5 -> EXTENDED ARABIC-INDIC DIGIT FOUR + '\u06f5' # 0xA6 -> EXTENDED ARABIC-INDIC DIGIT FIVE + '\u06f6' # 0xA7 -> EXTENDED ARABIC-INDIC DIGIT SIX + '\u06f7' # 0xA8 -> EXTENDED ARABIC-INDIC DIGIT SEVEN + '\u06f8' # 0xA9 -> EXTENDED ARABIC-INDIC DIGIT EIGHT + '\u06f9' # 0xAA -> EXTENDED ARABIC-INDIC DIGIT NINE + '\u060c' # 0xAB -> ARABIC COMMA + '\u061b' # 0xAC -> ARABIC SEMICOLON + '\xad' # 0xAD -> SOFT HYPHEN + '\u061f' # 0xAE -> ARABIC QUESTION MARK + '\ufe81' # 0xAF -> ARABIC LETTER ALEF WITH MADDA ABOVE ISOLATED FORM + '\ufe8d' # 0xB0 -> ARABIC LETTER ALEF ISOLATED FORM + '\ufe8e' # 0xB1 -> ARABIC LETTER ALEF FINAL FORM + '\ufe8e' # 0xB2 -> ARABIC LETTER ALEF FINAL FORM + '\ufe8f' # 0xB3 -> ARABIC LETTER BEH ISOLATED FORM + '\ufe91' # 0xB4 -> ARABIC LETTER BEH INITIAL FORM + '\ufb56' # 0xB5 -> ARABIC LETTER PEH ISOLATED FORM + '\ufb58' # 0xB6 -> ARABIC LETTER PEH INITIAL FORM + '\ufe93' # 0xB7 -> ARABIC LETTER TEH MARBUTA ISOLATED FORM + '\ufe95' # 0xB8 -> ARABIC LETTER TEH ISOLATED FORM + '\ufe97' # 0xB9 -> ARABIC LETTER TEH INITIAL FORM + '\ufb66' # 0xBA -> ARABIC LETTER TTEH ISOLATED FORM + '\ufb68' # 0xBB -> ARABIC LETTER TTEH INITIAL FORM + '\ufe99' # 0xBC -> ARABIC LETTER THEH ISOLATED FORM + '\ufe9b' # 0xBD -> ARABIC LETTER THEH INITIAL FORM + '\ufe9d' # 0xBE -> ARABIC LETTER JEEM ISOLATED FORM + '\ufe9f' # 0xBF -> ARABIC LETTER JEEM INITIAL FORM + '\ufb7a' # 0xC0 -> ARABIC LETTER TCHEH ISOLATED FORM + '\ufb7c' # 0xC1 -> ARABIC LETTER TCHEH INITIAL FORM + '\ufea1' # 0xC2 -> ARABIC LETTER HAH ISOLATED FORM + '\ufea3' # 0xC3 -> ARABIC LETTER HAH INITIAL FORM + '\ufea5' # 0xC4 -> ARABIC LETTER KHAH ISOLATED FORM + '\ufea7' # 0xC5 -> ARABIC LETTER KHAH INITIAL FORM + '\ufea9' # 0xC6 -> ARABIC LETTER DAL ISOLATED FORM + '\ufb84' # 0xC7 -> ARABIC LETTER DAHAL ISOLATED FORMN + '\ufeab' # 0xC8 -> ARABIC LETTER THAL ISOLATED FORM + '\ufead' # 0xC9 -> ARABIC LETTER REH ISOLATED FORM + '\ufb8c' # 0xCA -> ARABIC LETTER RREH ISOLATED FORM + '\ufeaf' # 0xCB -> ARABIC LETTER ZAIN ISOLATED FORM + '\ufb8a' # 0xCC -> ARABIC LETTER JEH ISOLATED FORM + '\ufeb1' # 0xCD -> ARABIC LETTER SEEN ISOLATED FORM + '\ufeb3' # 0xCE -> ARABIC LETTER SEEN INITIAL FORM + '\ufeb5' # 0xCF -> ARABIC LETTER SHEEN ISOLATED FORM + '\ufeb7' # 0xD0 -> ARABIC LETTER SHEEN INITIAL FORM + '\ufeb9' # 0xD1 -> ARABIC LETTER SAD ISOLATED FORM + '\ufebb' # 0xD2 -> ARABIC LETTER SAD INITIAL FORM + '\ufebd' # 0xD3 -> ARABIC LETTER DAD ISOLATED FORM + '\ufebf' # 0xD4 -> ARABIC LETTER DAD INITIAL FORM + '\ufec1' # 0xD5 -> ARABIC LETTER TAH ISOLATED FORM + '\ufec5' # 0xD6 -> ARABIC LETTER ZAH ISOLATED FORM + '\ufec9' # 0xD7 -> ARABIC LETTER AIN ISOLATED FORM + '\ufeca' # 0xD8 -> ARABIC LETTER AIN FINAL FORM + '\ufecb' # 0xD9 -> ARABIC LETTER AIN INITIAL FORM + '\ufecc' # 0xDA -> ARABIC LETTER AIN MEDIAL FORM + '\ufecd' # 0xDB -> ARABIC LETTER GHAIN ISOLATED FORM + '\ufece' # 0xDC -> ARABIC LETTER GHAIN FINAL FORM + '\ufecf' # 0xDD -> ARABIC LETTER GHAIN INITIAL FORM + '\ufed0' # 0xDE -> ARABIC LETTER GHAIN MEDIAL FORM + '\ufed1' # 0xDF -> ARABIC LETTER FEH ISOLATED FORM + '\ufed3' # 0xE0 -> ARABIC LETTER FEH INITIAL FORM + '\ufed5' # 0xE1 -> ARABIC LETTER QAF ISOLATED FORM + '\ufed7' # 0xE2 -> ARABIC LETTER QAF INITIAL FORM + '\ufed9' # 0xE3 -> ARABIC LETTER KAF ISOLATED FORM + '\ufedb' # 0xE4 -> ARABIC LETTER KAF INITIAL FORM + '\ufb92' # 0xE5 -> ARABIC LETTER GAF ISOLATED FORM + '\ufb94' # 0xE6 -> ARABIC LETTER GAF INITIAL FORM + '\ufedd' # 0xE7 -> ARABIC LETTER LAM ISOLATED FORM + '\ufedf' # 0xE8 -> ARABIC LETTER LAM INITIAL FORM + '\ufee0' # 0xE9 -> ARABIC LETTER LAM MEDIAL FORM + '\ufee1' # 0xEA -> ARABIC LETTER MEEM ISOLATED FORM + '\ufee3' # 0xEB -> ARABIC LETTER MEEM INITIAL FORM + '\ufb9e' # 0xEC -> ARABIC LETTER NOON GHUNNA ISOLATED FORM + '\ufee5' # 0xED -> ARABIC LETTER NOON ISOLATED FORM + '\ufee7' # 0xEE -> ARABIC LETTER NOON INITIAL FORM + '\ufe85' # 0xEF -> ARABIC LETTER WAW WITH HAMZA ABOVE ISOLATED FORM + '\ufeed' # 0xF0 -> ARABIC LETTER WAW ISOLATED FORM + '\ufba6' # 0xF1 -> ARABIC LETTER HEH GOAL ISOLATED FORM + '\ufba8' # 0xF2 -> ARABIC LETTER HEH GOAL INITIAL FORM + '\ufba9' # 0xF3 -> ARABIC LETTER HEH GOAL MEDIAL FORM + '\ufbaa' # 0xF4 -> ARABIC LETTER HEH DOACHASHMEE ISOLATED FORM + '\ufe80' # 0xF5 -> ARABIC LETTER HAMZA ISOLATED FORM + '\ufe89' # 0xF6 -> ARABIC LETTER YEH WITH HAMZA ABOVE ISOLATED FORM + '\ufe8a' # 0xF7 -> ARABIC LETTER YEH WITH HAMZA ABOVE FINAL FORM + '\ufe8b' # 0xF8 -> ARABIC LETTER YEH WITH HAMZA ABOVE INITIAL FORM + '\ufef1' # 0xF9 -> ARABIC LETTER YEH ISOLATED FORM + '\ufef2' # 0xFA -> ARABIC LETTER YEH FINAL FORM + '\ufef3' # 0xFB -> ARABIC LETTER YEH INITIAL FORM + '\ufbb0' # 0xFC -> ARABIC LETTER YEH BARREE WITH HAMZA ABOVE ISOLATED FORM + '\ufbae' # 0xFD -> ARABIC LETTER YEH BARREE ISOLATED FORM + '\ufe7c' # 0xFE -> ARABIC SHADDA ISOLATED FORM + '\ufe7d' # 0xFF -> ARABIC SHADDA MEDIAL FORM +) + +### Encoding table +encoding_table=codecs.charmap_build(decoding_table) diff --git a/env/Lib/encodings/cp1026.py b/env/Lib/encodings/cp1026.py new file mode 100644 index 0000000..46f71f7 --- /dev/null +++ b/env/Lib/encodings/cp1026.py @@ -0,0 +1,307 @@ +""" Python Character Mapping Codec cp1026 generated from 'MAPPINGS/VENDORS/MICSFT/EBCDIC/CP1026.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='cp1026', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) + + +### Decoding Table + +decoding_table = ( + '\x00' # 0x00 -> NULL + '\x01' # 0x01 -> START OF HEADING + '\x02' # 0x02 -> START OF TEXT + '\x03' # 0x03 -> END OF TEXT + '\x9c' # 0x04 -> CONTROL + '\t' # 0x05 -> HORIZONTAL TABULATION + '\x86' # 0x06 -> CONTROL + '\x7f' # 0x07 -> DELETE + '\x97' # 0x08 -> CONTROL + '\x8d' # 0x09 -> CONTROL + '\x8e' # 0x0A -> CONTROL + '\x0b' # 0x0B -> VERTICAL TABULATION + '\x0c' # 0x0C -> FORM FEED + '\r' # 0x0D -> CARRIAGE RETURN + '\x0e' # 0x0E -> SHIFT OUT + '\x0f' # 0x0F -> SHIFT IN + '\x10' # 0x10 -> DATA LINK ESCAPE + '\x11' # 0x11 -> DEVICE CONTROL ONE + '\x12' # 0x12 -> DEVICE CONTROL TWO + '\x13' # 0x13 -> DEVICE CONTROL THREE + '\x9d' # 0x14 -> CONTROL + '\x85' # 0x15 -> CONTROL + '\x08' # 0x16 -> BACKSPACE + '\x87' # 0x17 -> CONTROL + '\x18' # 0x18 -> CANCEL + '\x19' # 0x19 -> END OF MEDIUM + '\x92' # 0x1A -> CONTROL + '\x8f' # 0x1B -> CONTROL + '\x1c' # 0x1C -> FILE SEPARATOR + '\x1d' # 0x1D -> GROUP SEPARATOR + '\x1e' # 0x1E -> RECORD SEPARATOR + '\x1f' # 0x1F -> UNIT SEPARATOR + '\x80' # 0x20 -> CONTROL + '\x81' # 0x21 -> CONTROL + '\x82' # 0x22 -> CONTROL + '\x83' # 0x23 -> CONTROL + '\x84' # 0x24 -> CONTROL + '\n' # 0x25 -> LINE FEED + '\x17' # 0x26 -> END OF TRANSMISSION BLOCK + '\x1b' # 0x27 -> ESCAPE + '\x88' # 0x28 -> CONTROL + '\x89' # 0x29 -> CONTROL + '\x8a' # 0x2A -> CONTROL + '\x8b' # 0x2B -> CONTROL + '\x8c' # 0x2C -> CONTROL + '\x05' # 0x2D -> ENQUIRY + '\x06' # 0x2E -> ACKNOWLEDGE + '\x07' # 0x2F -> BELL + '\x90' # 0x30 -> CONTROL + '\x91' # 0x31 -> CONTROL + '\x16' # 0x32 -> SYNCHRONOUS IDLE + '\x93' # 0x33 -> CONTROL + '\x94' # 0x34 -> CONTROL + '\x95' # 0x35 -> CONTROL + '\x96' # 0x36 -> CONTROL + '\x04' # 0x37 -> END OF TRANSMISSION + '\x98' # 0x38 -> CONTROL + '\x99' # 0x39 -> CONTROL + '\x9a' # 0x3A -> CONTROL + '\x9b' # 0x3B -> CONTROL + '\x14' # 0x3C -> DEVICE CONTROL FOUR + '\x15' # 0x3D -> NEGATIVE ACKNOWLEDGE + '\x9e' # 0x3E -> CONTROL + '\x1a' # 0x3F -> SUBSTITUTE + ' ' # 0x40 -> SPACE + '\xa0' # 0x41 -> NO-BREAK SPACE + '\xe2' # 0x42 -> LATIN SMALL LETTER A WITH CIRCUMFLEX + '\xe4' # 0x43 -> LATIN SMALL LETTER A WITH DIAERESIS + '\xe0' # 0x44 -> LATIN SMALL LETTER A WITH GRAVE + '\xe1' # 0x45 -> LATIN SMALL LETTER A WITH ACUTE + '\xe3' # 0x46 -> LATIN SMALL LETTER A WITH TILDE + '\xe5' # 0x47 -> LATIN SMALL LETTER A WITH RING ABOVE + '{' # 0x48 -> LEFT CURLY BRACKET + '\xf1' # 0x49 -> LATIN SMALL LETTER N WITH TILDE + '\xc7' # 0x4A -> LATIN CAPITAL LETTER C WITH CEDILLA + '.' # 0x4B -> FULL STOP + '<' # 0x4C -> LESS-THAN SIGN + '(' # 0x4D -> LEFT PARENTHESIS + '+' # 0x4E -> PLUS SIGN + '!' # 0x4F -> EXCLAMATION MARK + '&' # 0x50 -> AMPERSAND + '\xe9' # 0x51 -> LATIN SMALL LETTER E WITH ACUTE + '\xea' # 0x52 -> LATIN SMALL LETTER E WITH CIRCUMFLEX + '\xeb' # 0x53 -> LATIN SMALL LETTER E WITH DIAERESIS + '\xe8' # 0x54 -> LATIN SMALL LETTER E WITH GRAVE + '\xed' # 0x55 -> LATIN SMALL LETTER I WITH ACUTE + '\xee' # 0x56 -> LATIN SMALL LETTER I WITH CIRCUMFLEX + '\xef' # 0x57 -> LATIN SMALL LETTER I WITH DIAERESIS + '\xec' # 0x58 -> LATIN SMALL LETTER I WITH GRAVE + '\xdf' # 0x59 -> LATIN SMALL LETTER SHARP S (GERMAN) + '\u011e' # 0x5A -> LATIN CAPITAL LETTER G WITH BREVE + '\u0130' # 0x5B -> LATIN CAPITAL LETTER I WITH DOT ABOVE + '*' # 0x5C -> ASTERISK + ')' # 0x5D -> RIGHT PARENTHESIS + ';' # 0x5E -> SEMICOLON + '^' # 0x5F -> CIRCUMFLEX ACCENT + '-' # 0x60 -> HYPHEN-MINUS + '/' # 0x61 -> SOLIDUS + '\xc2' # 0x62 -> LATIN CAPITAL LETTER A WITH CIRCUMFLEX + '\xc4' # 0x63 -> LATIN CAPITAL LETTER A WITH DIAERESIS + '\xc0' # 0x64 -> LATIN CAPITAL LETTER A WITH GRAVE + '\xc1' # 0x65 -> LATIN CAPITAL LETTER A WITH ACUTE + '\xc3' # 0x66 -> LATIN CAPITAL LETTER A WITH TILDE + '\xc5' # 0x67 -> LATIN CAPITAL LETTER A WITH RING ABOVE + '[' # 0x68 -> LEFT SQUARE BRACKET + '\xd1' # 0x69 -> LATIN CAPITAL LETTER N WITH TILDE + '\u015f' # 0x6A -> LATIN SMALL LETTER S WITH CEDILLA + ',' # 0x6B -> COMMA + '%' # 0x6C -> PERCENT SIGN + '_' # 0x6D -> LOW LINE + '>' # 0x6E -> GREATER-THAN SIGN + '?' # 0x6F -> QUESTION MARK + '\xf8' # 0x70 -> LATIN SMALL LETTER O WITH STROKE + '\xc9' # 0x71 -> LATIN CAPITAL LETTER E WITH ACUTE + '\xca' # 0x72 -> LATIN CAPITAL LETTER E WITH CIRCUMFLEX + '\xcb' # 0x73 -> LATIN CAPITAL LETTER E WITH DIAERESIS + '\xc8' # 0x74 -> LATIN CAPITAL LETTER E WITH GRAVE + '\xcd' # 0x75 -> LATIN CAPITAL LETTER I WITH ACUTE + '\xce' # 0x76 -> LATIN CAPITAL LETTER I WITH CIRCUMFLEX + '\xcf' # 0x77 -> LATIN CAPITAL LETTER I WITH DIAERESIS + '\xcc' # 0x78 -> LATIN CAPITAL LETTER I WITH GRAVE + '\u0131' # 0x79 -> LATIN SMALL LETTER DOTLESS I + ':' # 0x7A -> COLON + '\xd6' # 0x7B -> LATIN CAPITAL LETTER O WITH DIAERESIS + '\u015e' # 0x7C -> LATIN CAPITAL LETTER S WITH CEDILLA + "'" # 0x7D -> APOSTROPHE + '=' # 0x7E -> EQUALS SIGN + '\xdc' # 0x7F -> LATIN CAPITAL LETTER U WITH DIAERESIS + '\xd8' # 0x80 -> LATIN CAPITAL LETTER O WITH STROKE + 'a' # 0x81 -> LATIN SMALL LETTER A + 'b' # 0x82 -> LATIN SMALL LETTER B + 'c' # 0x83 -> LATIN SMALL LETTER C + 'd' # 0x84 -> LATIN SMALL LETTER D + 'e' # 0x85 -> LATIN SMALL LETTER E + 'f' # 0x86 -> LATIN SMALL LETTER F + 'g' # 0x87 -> LATIN SMALL LETTER G + 'h' # 0x88 -> LATIN SMALL LETTER H + 'i' # 0x89 -> LATIN SMALL LETTER I + '\xab' # 0x8A -> LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + '\xbb' # 0x8B -> RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + '}' # 0x8C -> RIGHT CURLY BRACKET + '`' # 0x8D -> GRAVE ACCENT + '\xa6' # 0x8E -> BROKEN BAR + '\xb1' # 0x8F -> PLUS-MINUS SIGN + '\xb0' # 0x90 -> DEGREE SIGN + 'j' # 0x91 -> LATIN SMALL LETTER J + 'k' # 0x92 -> LATIN SMALL LETTER K + 'l' # 0x93 -> LATIN SMALL LETTER L + 'm' # 0x94 -> LATIN SMALL LETTER M + 'n' # 0x95 -> LATIN SMALL LETTER N + 'o' # 0x96 -> LATIN SMALL LETTER O + 'p' # 0x97 -> LATIN SMALL LETTER P + 'q' # 0x98 -> LATIN SMALL LETTER Q + 'r' # 0x99 -> LATIN SMALL LETTER R + '\xaa' # 0x9A -> FEMININE ORDINAL INDICATOR + '\xba' # 0x9B -> MASCULINE ORDINAL INDICATOR + '\xe6' # 0x9C -> LATIN SMALL LIGATURE AE + '\xb8' # 0x9D -> CEDILLA + '\xc6' # 0x9E -> LATIN CAPITAL LIGATURE AE + '\xa4' # 0x9F -> CURRENCY SIGN + '\xb5' # 0xA0 -> MICRO SIGN + '\xf6' # 0xA1 -> LATIN SMALL LETTER O WITH DIAERESIS + 's' # 0xA2 -> LATIN SMALL LETTER S + 't' # 0xA3 -> LATIN SMALL LETTER T + 'u' # 0xA4 -> LATIN SMALL LETTER U + 'v' # 0xA5 -> LATIN SMALL LETTER V + 'w' # 0xA6 -> LATIN SMALL LETTER W + 'x' # 0xA7 -> LATIN SMALL LETTER X + 'y' # 0xA8 -> LATIN SMALL LETTER Y + 'z' # 0xA9 -> LATIN SMALL LETTER Z + '\xa1' # 0xAA -> INVERTED EXCLAMATION MARK + '\xbf' # 0xAB -> INVERTED QUESTION MARK + ']' # 0xAC -> RIGHT SQUARE BRACKET + '$' # 0xAD -> DOLLAR SIGN + '@' # 0xAE -> COMMERCIAL AT + '\xae' # 0xAF -> REGISTERED SIGN + '\xa2' # 0xB0 -> CENT SIGN + '\xa3' # 0xB1 -> POUND SIGN + '\xa5' # 0xB2 -> YEN SIGN + '\xb7' # 0xB3 -> MIDDLE DOT + '\xa9' # 0xB4 -> COPYRIGHT SIGN + '\xa7' # 0xB5 -> SECTION SIGN + '\xb6' # 0xB6 -> PILCROW SIGN + '\xbc' # 0xB7 -> VULGAR FRACTION ONE QUARTER + '\xbd' # 0xB8 -> VULGAR FRACTION ONE HALF + '\xbe' # 0xB9 -> VULGAR FRACTION THREE QUARTERS + '\xac' # 0xBA -> NOT SIGN + '|' # 0xBB -> VERTICAL LINE + '\xaf' # 0xBC -> MACRON + '\xa8' # 0xBD -> DIAERESIS + '\xb4' # 0xBE -> ACUTE ACCENT + '\xd7' # 0xBF -> MULTIPLICATION SIGN + '\xe7' # 0xC0 -> LATIN SMALL LETTER C WITH CEDILLA + 'A' # 0xC1 -> LATIN CAPITAL LETTER A + 'B' # 0xC2 -> LATIN CAPITAL LETTER B + 'C' # 0xC3 -> LATIN CAPITAL LETTER C + 'D' # 0xC4 -> LATIN CAPITAL LETTER D + 'E' # 0xC5 -> LATIN CAPITAL LETTER E + 'F' # 0xC6 -> LATIN CAPITAL LETTER F + 'G' # 0xC7 -> LATIN CAPITAL LETTER G + 'H' # 0xC8 -> LATIN CAPITAL LETTER H + 'I' # 0xC9 -> LATIN CAPITAL LETTER I + '\xad' # 0xCA -> SOFT HYPHEN + '\xf4' # 0xCB -> LATIN SMALL LETTER O WITH CIRCUMFLEX + '~' # 0xCC -> TILDE + '\xf2' # 0xCD -> LATIN SMALL LETTER O WITH GRAVE + '\xf3' # 0xCE -> LATIN SMALL LETTER O WITH ACUTE + '\xf5' # 0xCF -> LATIN SMALL LETTER O WITH TILDE + '\u011f' # 0xD0 -> LATIN SMALL LETTER G WITH BREVE + 'J' # 0xD1 -> LATIN CAPITAL LETTER J + 'K' # 0xD2 -> LATIN CAPITAL LETTER K + 'L' # 0xD3 -> LATIN CAPITAL LETTER L + 'M' # 0xD4 -> LATIN CAPITAL LETTER M + 'N' # 0xD5 -> LATIN CAPITAL LETTER N + 'O' # 0xD6 -> LATIN CAPITAL LETTER O + 'P' # 0xD7 -> LATIN CAPITAL LETTER P + 'Q' # 0xD8 -> LATIN CAPITAL LETTER Q + 'R' # 0xD9 -> LATIN CAPITAL LETTER R + '\xb9' # 0xDA -> SUPERSCRIPT ONE + '\xfb' # 0xDB -> LATIN SMALL LETTER U WITH CIRCUMFLEX + '\\' # 0xDC -> REVERSE SOLIDUS + '\xf9' # 0xDD -> LATIN SMALL LETTER U WITH GRAVE + '\xfa' # 0xDE -> LATIN SMALL LETTER U WITH ACUTE + '\xff' # 0xDF -> LATIN SMALL LETTER Y WITH DIAERESIS + '\xfc' # 0xE0 -> LATIN SMALL LETTER U WITH DIAERESIS + '\xf7' # 0xE1 -> DIVISION SIGN + 'S' # 0xE2 -> LATIN CAPITAL LETTER S + 'T' # 0xE3 -> LATIN CAPITAL LETTER T + 'U' # 0xE4 -> LATIN CAPITAL LETTER U + 'V' # 0xE5 -> LATIN CAPITAL LETTER V + 'W' # 0xE6 -> LATIN CAPITAL LETTER W + 'X' # 0xE7 -> LATIN CAPITAL LETTER X + 'Y' # 0xE8 -> LATIN CAPITAL LETTER Y + 'Z' # 0xE9 -> LATIN CAPITAL LETTER Z + '\xb2' # 0xEA -> SUPERSCRIPT TWO + '\xd4' # 0xEB -> LATIN CAPITAL LETTER O WITH CIRCUMFLEX + '#' # 0xEC -> NUMBER SIGN + '\xd2' # 0xED -> LATIN CAPITAL LETTER O WITH GRAVE + '\xd3' # 0xEE -> LATIN CAPITAL LETTER O WITH ACUTE + '\xd5' # 0xEF -> LATIN CAPITAL LETTER O WITH TILDE + '0' # 0xF0 -> DIGIT ZERO + '1' # 0xF1 -> DIGIT ONE + '2' # 0xF2 -> DIGIT TWO + '3' # 0xF3 -> DIGIT THREE + '4' # 0xF4 -> DIGIT FOUR + '5' # 0xF5 -> DIGIT FIVE + '6' # 0xF6 -> DIGIT SIX + '7' # 0xF7 -> DIGIT SEVEN + '8' # 0xF8 -> DIGIT EIGHT + '9' # 0xF9 -> DIGIT NINE + '\xb3' # 0xFA -> SUPERSCRIPT THREE + '\xdb' # 0xFB -> LATIN CAPITAL LETTER U WITH CIRCUMFLEX + '"' # 0xFC -> QUOTATION MARK + '\xd9' # 0xFD -> LATIN CAPITAL LETTER U WITH GRAVE + '\xda' # 0xFE -> LATIN CAPITAL LETTER U WITH ACUTE + '\x9f' # 0xFF -> CONTROL +) + +### Encoding table +encoding_table=codecs.charmap_build(decoding_table) diff --git a/env/Lib/encodings/cp1125.py b/env/Lib/encodings/cp1125.py new file mode 100644 index 0000000..b1fd69d --- /dev/null +++ b/env/Lib/encodings/cp1125.py @@ -0,0 +1,698 @@ +""" Python Character Mapping Codec for CP1125 + +"""#" + +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_table) + +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_table)[0] + +class StreamWriter(Codec,codecs.StreamWriter): + pass + +class StreamReader(Codec,codecs.StreamReader): + pass + +### encodings module API + +def getregentry(): + return codecs.CodecInfo( + name='cp1125', + 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: 0x0410, # CYRILLIC CAPITAL LETTER A + 0x0081: 0x0411, # CYRILLIC CAPITAL LETTER BE + 0x0082: 0x0412, # CYRILLIC CAPITAL LETTER VE + 0x0083: 0x0413, # CYRILLIC CAPITAL LETTER GHE + 0x0084: 0x0414, # CYRILLIC CAPITAL LETTER DE + 0x0085: 0x0415, # CYRILLIC CAPITAL LETTER IE + 0x0086: 0x0416, # CYRILLIC CAPITAL LETTER ZHE + 0x0087: 0x0417, # CYRILLIC CAPITAL LETTER ZE + 0x0088: 0x0418, # CYRILLIC CAPITAL LETTER I + 0x0089: 0x0419, # CYRILLIC CAPITAL LETTER SHORT I + 0x008a: 0x041a, # CYRILLIC CAPITAL LETTER KA + 0x008b: 0x041b, # CYRILLIC CAPITAL LETTER EL + 0x008c: 0x041c, # CYRILLIC CAPITAL LETTER EM + 0x008d: 0x041d, # CYRILLIC CAPITAL LETTER EN + 0x008e: 0x041e, # CYRILLIC CAPITAL LETTER O + 0x008f: 0x041f, # CYRILLIC CAPITAL LETTER PE + 0x0090: 0x0420, # CYRILLIC CAPITAL LETTER ER + 0x0091: 0x0421, # CYRILLIC CAPITAL LETTER ES + 0x0092: 0x0422, # CYRILLIC CAPITAL LETTER TE + 0x0093: 0x0423, # CYRILLIC CAPITAL LETTER U + 0x0094: 0x0424, # CYRILLIC CAPITAL LETTER EF + 0x0095: 0x0425, # CYRILLIC CAPITAL LETTER HA + 0x0096: 0x0426, # CYRILLIC CAPITAL LETTER TSE + 0x0097: 0x0427, # CYRILLIC CAPITAL LETTER CHE + 0x0098: 0x0428, # CYRILLIC CAPITAL LETTER SHA + 0x0099: 0x0429, # CYRILLIC CAPITAL LETTER SHCHA + 0x009a: 0x042a, # CYRILLIC CAPITAL LETTER HARD SIGN + 0x009b: 0x042b, # CYRILLIC CAPITAL LETTER YERU + 0x009c: 0x042c, # CYRILLIC CAPITAL LETTER SOFT SIGN + 0x009d: 0x042d, # CYRILLIC CAPITAL LETTER E + 0x009e: 0x042e, # CYRILLIC CAPITAL LETTER YU + 0x009f: 0x042f, # CYRILLIC CAPITAL LETTER YA + 0x00a0: 0x0430, # CYRILLIC SMALL LETTER A + 0x00a1: 0x0431, # CYRILLIC SMALL LETTER BE + 0x00a2: 0x0432, # CYRILLIC SMALL LETTER VE + 0x00a3: 0x0433, # CYRILLIC SMALL LETTER GHE + 0x00a4: 0x0434, # CYRILLIC SMALL LETTER DE + 0x00a5: 0x0435, # CYRILLIC SMALL LETTER IE + 0x00a6: 0x0436, # CYRILLIC SMALL LETTER ZHE + 0x00a7: 0x0437, # CYRILLIC SMALL LETTER ZE + 0x00a8: 0x0438, # CYRILLIC SMALL LETTER I + 0x00a9: 0x0439, # CYRILLIC SMALL LETTER SHORT I + 0x00aa: 0x043a, # CYRILLIC SMALL LETTER KA + 0x00ab: 0x043b, # CYRILLIC SMALL LETTER EL + 0x00ac: 0x043c, # CYRILLIC SMALL LETTER EM + 0x00ad: 0x043d, # CYRILLIC SMALL LETTER EN + 0x00ae: 0x043e, # CYRILLIC SMALL LETTER O + 0x00af: 0x043f, # CYRILLIC SMALL LETTER PE + 0x00b0: 0x2591, # LIGHT SHADE + 0x00b1: 0x2592, # MEDIUM SHADE + 0x00b2: 0x2593, # DARK SHADE + 0x00b3: 0x2502, # BOX DRAWINGS LIGHT VERTICAL + 0x00b4: 0x2524, # BOX DRAWINGS LIGHT VERTICAL AND LEFT + 0x00b5: 0x2561, # BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE + 0x00b6: 0x2562, # BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE + 0x00b7: 0x2556, # BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE + 0x00b8: 0x2555, # BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE + 0x00b9: 0x2563, # BOX DRAWINGS DOUBLE VERTICAL AND LEFT + 0x00ba: 0x2551, # BOX DRAWINGS DOUBLE VERTICAL + 0x00bb: 0x2557, # BOX DRAWINGS DOUBLE DOWN AND LEFT + 0x00bc: 0x255d, # BOX DRAWINGS DOUBLE UP AND LEFT + 0x00bd: 0x255c, # BOX DRAWINGS UP DOUBLE AND LEFT SINGLE + 0x00be: 0x255b, # BOX DRAWINGS UP SINGLE AND LEFT DOUBLE + 0x00bf: 0x2510, # BOX DRAWINGS LIGHT DOWN AND LEFT + 0x00c0: 0x2514, # BOX DRAWINGS LIGHT UP AND RIGHT + 0x00c1: 0x2534, # BOX DRAWINGS LIGHT UP AND HORIZONTAL + 0x00c2: 0x252c, # BOX DRAWINGS LIGHT DOWN AND HORIZONTAL + 0x00c3: 0x251c, # BOX DRAWINGS LIGHT VERTICAL AND RIGHT + 0x00c4: 0x2500, # BOX DRAWINGS LIGHT HORIZONTAL + 0x00c5: 0x253c, # BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL + 0x00c6: 0x255e, # BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE + 0x00c7: 0x255f, # BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE + 0x00c8: 0x255a, # BOX DRAWINGS DOUBLE UP AND RIGHT + 0x00c9: 0x2554, # BOX DRAWINGS DOUBLE DOWN AND RIGHT + 0x00ca: 0x2569, # BOX DRAWINGS DOUBLE UP AND HORIZONTAL + 0x00cb: 0x2566, # BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL + 0x00cc: 0x2560, # BOX DRAWINGS DOUBLE VERTICAL AND RIGHT + 0x00cd: 0x2550, # BOX DRAWINGS DOUBLE HORIZONTAL + 0x00ce: 0x256c, # BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL + 0x00cf: 0x2567, # BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE + 0x00d0: 0x2568, # BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE + 0x00d1: 0x2564, # BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE + 0x00d2: 0x2565, # BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE + 0x00d3: 0x2559, # BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE + 0x00d4: 0x2558, # BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE + 0x00d5: 0x2552, # BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE + 0x00d6: 0x2553, # BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE + 0x00d7: 0x256b, # BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE + 0x00d8: 0x256a, # BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE + 0x00d9: 0x2518, # BOX DRAWINGS LIGHT UP AND LEFT + 0x00da: 0x250c, # BOX DRAWINGS LIGHT DOWN AND RIGHT + 0x00db: 0x2588, # FULL BLOCK + 0x00dc: 0x2584, # LOWER HALF BLOCK + 0x00dd: 0x258c, # LEFT HALF BLOCK + 0x00de: 0x2590, # RIGHT HALF BLOCK + 0x00df: 0x2580, # UPPER HALF BLOCK + 0x00e0: 0x0440, # CYRILLIC SMALL LETTER ER + 0x00e1: 0x0441, # CYRILLIC SMALL LETTER ES + 0x00e2: 0x0442, # CYRILLIC SMALL LETTER TE + 0x00e3: 0x0443, # CYRILLIC SMALL LETTER U + 0x00e4: 0x0444, # CYRILLIC SMALL LETTER EF + 0x00e5: 0x0445, # CYRILLIC SMALL LETTER HA + 0x00e6: 0x0446, # CYRILLIC SMALL LETTER TSE + 0x00e7: 0x0447, # CYRILLIC SMALL LETTER CHE + 0x00e8: 0x0448, # CYRILLIC SMALL LETTER SHA + 0x00e9: 0x0449, # CYRILLIC SMALL LETTER SHCHA + 0x00ea: 0x044a, # CYRILLIC SMALL LETTER HARD SIGN + 0x00eb: 0x044b, # CYRILLIC SMALL LETTER YERU + 0x00ec: 0x044c, # CYRILLIC SMALL LETTER SOFT SIGN + 0x00ed: 0x044d, # CYRILLIC SMALL LETTER E + 0x00ee: 0x044e, # CYRILLIC SMALL LETTER YU + 0x00ef: 0x044f, # CYRILLIC SMALL LETTER YA + 0x00f0: 0x0401, # CYRILLIC CAPITAL LETTER IO + 0x00f1: 0x0451, # CYRILLIC SMALL LETTER IO + 0x00f2: 0x0490, # CYRILLIC CAPITAL LETTER GHE WITH UPTURN + 0x00f3: 0x0491, # CYRILLIC SMALL LETTER GHE WITH UPTURN + 0x00f4: 0x0404, # CYRILLIC CAPITAL LETTER UKRAINIAN IE + 0x00f5: 0x0454, # CYRILLIC SMALL LETTER UKRAINIAN IE + 0x00f6: 0x0406, # CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I + 0x00f7: 0x0456, # CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I + 0x00f8: 0x0407, # CYRILLIC CAPITAL LETTER YI + 0x00f9: 0x0457, # CYRILLIC SMALL LETTER YI + 0x00fa: 0x00b7, # MIDDLE DOT + 0x00fb: 0x221a, # SQUARE ROOT + 0x00fc: 0x2116, # NUMERO SIGN + 0x00fd: 0x00a4, # CURRENCY SIGN + 0x00fe: 0x25a0, # BLACK SQUARE + 0x00ff: 0x00a0, # NO-BREAK SPACE +}) + +### Decoding Table + +decoding_table = ( + '\x00' # 0x0000 -> NULL + '\x01' # 0x0001 -> START OF HEADING + '\x02' # 0x0002 -> START OF TEXT + '\x03' # 0x0003 -> END OF TEXT + '\x04' # 0x0004 -> END OF TRANSMISSION + '\x05' # 0x0005 -> ENQUIRY + '\x06' # 0x0006 -> ACKNOWLEDGE + '\x07' # 0x0007 -> BELL + '\x08' # 0x0008 -> BACKSPACE + '\t' # 0x0009 -> HORIZONTAL TABULATION + '\n' # 0x000a -> LINE FEED + '\x0b' # 0x000b -> VERTICAL TABULATION + '\x0c' # 0x000c -> FORM FEED + '\r' # 0x000d -> CARRIAGE RETURN + '\x0e' # 0x000e -> SHIFT OUT + '\x0f' # 0x000f -> SHIFT IN + '\x10' # 0x0010 -> DATA LINK ESCAPE + '\x11' # 0x0011 -> DEVICE CONTROL ONE + '\x12' # 0x0012 -> DEVICE CONTROL TWO + '\x13' # 0x0013 -> DEVICE CONTROL THREE + '\x14' # 0x0014 -> DEVICE CONTROL FOUR + '\x15' # 0x0015 -> NEGATIVE ACKNOWLEDGE + '\x16' # 0x0016 -> SYNCHRONOUS IDLE + '\x17' # 0x0017 -> END OF TRANSMISSION BLOCK + '\x18' # 0x0018 -> CANCEL + '\x19' # 0x0019 -> END OF MEDIUM + '\x1a' # 0x001a -> SUBSTITUTE + '\x1b' # 0x001b -> ESCAPE + '\x1c' # 0x001c -> FILE SEPARATOR + '\x1d' # 0x001d -> GROUP SEPARATOR + '\x1e' # 0x001e -> RECORD SEPARATOR + '\x1f' # 0x001f -> UNIT SEPARATOR + ' ' # 0x0020 -> SPACE + '!' # 0x0021 -> EXCLAMATION MARK + '"' # 0x0022 -> QUOTATION MARK + '#' # 0x0023 -> NUMBER SIGN + '$' # 0x0024 -> DOLLAR SIGN + '%' # 0x0025 -> PERCENT SIGN + '&' # 0x0026 -> AMPERSAND + "'" # 0x0027 -> APOSTROPHE + '(' # 0x0028 -> LEFT PARENTHESIS + ')' # 0x0029 -> RIGHT PARENTHESIS + '*' # 0x002a -> ASTERISK + '+' # 0x002b -> PLUS SIGN + ',' # 0x002c -> COMMA + '-' # 0x002d -> HYPHEN-MINUS + '.' # 0x002e -> FULL STOP + '/' # 0x002f -> SOLIDUS + '0' # 0x0030 -> DIGIT ZERO + '1' # 0x0031 -> DIGIT ONE + '2' # 0x0032 -> DIGIT TWO + '3' # 0x0033 -> DIGIT THREE + '4' # 0x0034 -> DIGIT FOUR + '5' # 0x0035 -> DIGIT FIVE + '6' # 0x0036 -> DIGIT SIX + '7' # 0x0037 -> DIGIT SEVEN + '8' # 0x0038 -> DIGIT EIGHT + '9' # 0x0039 -> DIGIT NINE + ':' # 0x003a -> COLON + ';' # 0x003b -> SEMICOLON + '<' # 0x003c -> LESS-THAN SIGN + '=' # 0x003d -> EQUALS SIGN + '>' # 0x003e -> GREATER-THAN SIGN + '?' # 0x003f -> QUESTION MARK + '@' # 0x0040 -> COMMERCIAL AT + 'A' # 0x0041 -> LATIN CAPITAL LETTER A + 'B' # 0x0042 -> LATIN CAPITAL LETTER B + 'C' # 0x0043 -> LATIN CAPITAL LETTER C + 'D' # 0x0044 -> LATIN CAPITAL LETTER D + 'E' # 0x0045 -> LATIN CAPITAL LETTER E + 'F' # 0x0046 -> LATIN CAPITAL LETTER F + 'G' # 0x0047 -> LATIN CAPITAL LETTER G + 'H' # 0x0048 -> LATIN CAPITAL LETTER H + 'I' # 0x0049 -> LATIN CAPITAL LETTER I + 'J' # 0x004a -> LATIN CAPITAL LETTER J + 'K' # 0x004b -> LATIN CAPITAL LETTER K + 'L' # 0x004c -> LATIN CAPITAL LETTER L + 'M' # 0x004d -> LATIN CAPITAL LETTER M + 'N' # 0x004e -> LATIN CAPITAL LETTER N + 'O' # 0x004f -> LATIN CAPITAL LETTER O + 'P' # 0x0050 -> LATIN CAPITAL LETTER P + 'Q' # 0x0051 -> LATIN CAPITAL LETTER Q + 'R' # 0x0052 -> LATIN CAPITAL LETTER R + 'S' # 0x0053 -> LATIN CAPITAL LETTER S + 'T' # 0x0054 -> LATIN CAPITAL LETTER T + 'U' # 0x0055 -> LATIN CAPITAL LETTER U + 'V' # 0x0056 -> LATIN CAPITAL LETTER V + 'W' # 0x0057 -> LATIN CAPITAL LETTER W + 'X' # 0x0058 -> LATIN CAPITAL LETTER X + 'Y' # 0x0059 -> LATIN CAPITAL LETTER Y + 'Z' # 0x005a -> LATIN CAPITAL LETTER Z + '[' # 0x005b -> LEFT SQUARE BRACKET + '\\' # 0x005c -> REVERSE SOLIDUS + ']' # 0x005d -> RIGHT SQUARE BRACKET + '^' # 0x005e -> CIRCUMFLEX ACCENT + '_' # 0x005f -> LOW LINE + '`' # 0x0060 -> GRAVE ACCENT + 'a' # 0x0061 -> LATIN SMALL LETTER A + 'b' # 0x0062 -> LATIN SMALL LETTER B + 'c' # 0x0063 -> LATIN SMALL LETTER C + 'd' # 0x0064 -> LATIN SMALL LETTER D + 'e' # 0x0065 -> LATIN SMALL LETTER E + 'f' # 0x0066 -> LATIN SMALL LETTER F + 'g' # 0x0067 -> LATIN SMALL LETTER G + 'h' # 0x0068 -> LATIN SMALL LETTER H + 'i' # 0x0069 -> LATIN SMALL LETTER I + 'j' # 0x006a -> LATIN SMALL LETTER J + 'k' # 0x006b -> LATIN SMALL LETTER K + 'l' # 0x006c -> LATIN SMALL LETTER L + 'm' # 0x006d -> LATIN SMALL LETTER M + 'n' # 0x006e -> LATIN SMALL LETTER N + 'o' # 0x006f -> LATIN SMALL LETTER O + 'p' # 0x0070 -> LATIN SMALL LETTER P + 'q' # 0x0071 -> LATIN SMALL LETTER Q + 'r' # 0x0072 -> LATIN SMALL LETTER R + 's' # 0x0073 -> LATIN SMALL LETTER S + 't' # 0x0074 -> LATIN SMALL LETTER T + 'u' # 0x0075 -> LATIN SMALL LETTER U + 'v' # 0x0076 -> LATIN SMALL LETTER V + 'w' # 0x0077 -> LATIN SMALL LETTER W + 'x' # 0x0078 -> LATIN SMALL LETTER X + 'y' # 0x0079 -> LATIN SMALL LETTER Y + 'z' # 0x007a -> LATIN SMALL LETTER Z + '{' # 0x007b -> LEFT CURLY BRACKET + '|' # 0x007c -> VERTICAL LINE + '}' # 0x007d -> RIGHT CURLY BRACKET + '~' # 0x007e -> TILDE + '\x7f' # 0x007f -> DELETE + '\u0410' # 0x0080 -> CYRILLIC CAPITAL LETTER A + '\u0411' # 0x0081 -> CYRILLIC CAPITAL LETTER BE + '\u0412' # 0x0082 -> CYRILLIC CAPITAL LETTER VE + '\u0413' # 0x0083 -> CYRILLIC CAPITAL LETTER GHE + '\u0414' # 0x0084 -> CYRILLIC CAPITAL LETTER DE + '\u0415' # 0x0085 -> CYRILLIC CAPITAL LETTER IE + '\u0416' # 0x0086 -> CYRILLIC CAPITAL LETTER ZHE + '\u0417' # 0x0087 -> CYRILLIC CAPITAL LETTER ZE + '\u0418' # 0x0088 -> CYRILLIC CAPITAL LETTER I + '\u0419' # 0x0089 -> CYRILLIC CAPITAL LETTER SHORT I + '\u041a' # 0x008a -> CYRILLIC CAPITAL LETTER KA + '\u041b' # 0x008b -> CYRILLIC CAPITAL LETTER EL + '\u041c' # 0x008c -> CYRILLIC CAPITAL LETTER EM + '\u041d' # 0x008d -> CYRILLIC CAPITAL LETTER EN + '\u041e' # 0x008e -> CYRILLIC CAPITAL LETTER O + '\u041f' # 0x008f -> CYRILLIC CAPITAL LETTER PE + '\u0420' # 0x0090 -> CYRILLIC CAPITAL LETTER ER + '\u0421' # 0x0091 -> CYRILLIC CAPITAL LETTER ES + '\u0422' # 0x0092 -> CYRILLIC CAPITAL LETTER TE + '\u0423' # 0x0093 -> CYRILLIC CAPITAL LETTER U + '\u0424' # 0x0094 -> CYRILLIC CAPITAL LETTER EF + '\u0425' # 0x0095 -> CYRILLIC CAPITAL LETTER HA + '\u0426' # 0x0096 -> CYRILLIC CAPITAL LETTER TSE + '\u0427' # 0x0097 -> CYRILLIC CAPITAL LETTER CHE + '\u0428' # 0x0098 -> CYRILLIC CAPITAL LETTER SHA + '\u0429' # 0x0099 -> CYRILLIC CAPITAL LETTER SHCHA + '\u042a' # 0x009a -> CYRILLIC CAPITAL LETTER HARD SIGN + '\u042b' # 0x009b -> CYRILLIC CAPITAL LETTER YERU + '\u042c' # 0x009c -> CYRILLIC CAPITAL LETTER SOFT SIGN + '\u042d' # 0x009d -> CYRILLIC CAPITAL LETTER E + '\u042e' # 0x009e -> CYRILLIC CAPITAL LETTER YU + '\u042f' # 0x009f -> CYRILLIC CAPITAL LETTER YA + '\u0430' # 0x00a0 -> CYRILLIC SMALL LETTER A + '\u0431' # 0x00a1 -> CYRILLIC SMALL LETTER BE + '\u0432' # 0x00a2 -> CYRILLIC SMALL LETTER VE + '\u0433' # 0x00a3 -> CYRILLIC SMALL LETTER GHE + '\u0434' # 0x00a4 -> CYRILLIC SMALL LETTER DE + '\u0435' # 0x00a5 -> CYRILLIC SMALL LETTER IE + '\u0436' # 0x00a6 -> CYRILLIC SMALL LETTER ZHE + '\u0437' # 0x00a7 -> CYRILLIC SMALL LETTER ZE + '\u0438' # 0x00a8 -> CYRILLIC SMALL LETTER I + '\u0439' # 0x00a9 -> CYRILLIC SMALL LETTER SHORT I + '\u043a' # 0x00aa -> CYRILLIC SMALL LETTER KA + '\u043b' # 0x00ab -> CYRILLIC SMALL LETTER EL + '\u043c' # 0x00ac -> CYRILLIC SMALL LETTER EM + '\u043d' # 0x00ad -> CYRILLIC SMALL LETTER EN + '\u043e' # 0x00ae -> CYRILLIC SMALL LETTER O + '\u043f' # 0x00af -> CYRILLIC SMALL LETTER PE + '\u2591' # 0x00b0 -> LIGHT SHADE + '\u2592' # 0x00b1 -> MEDIUM SHADE + '\u2593' # 0x00b2 -> DARK SHADE + '\u2502' # 0x00b3 -> BOX DRAWINGS LIGHT VERTICAL + '\u2524' # 0x00b4 -> BOX DRAWINGS LIGHT VERTICAL AND LEFT + '\u2561' # 0x00b5 -> BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE + '\u2562' # 0x00b6 -> BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE + '\u2556' # 0x00b7 -> BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE + '\u2555' # 0x00b8 -> BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE + '\u2563' # 0x00b9 -> BOX DRAWINGS DOUBLE VERTICAL AND LEFT + '\u2551' # 0x00ba -> BOX DRAWINGS DOUBLE VERTICAL + '\u2557' # 0x00bb -> BOX DRAWINGS DOUBLE DOWN AND LEFT + '\u255d' # 0x00bc -> BOX DRAWINGS DOUBLE UP AND LEFT + '\u255c' # 0x00bd -> BOX DRAWINGS UP DOUBLE AND LEFT SINGLE + '\u255b' # 0x00be -> BOX DRAWINGS UP SINGLE AND LEFT DOUBLE + '\u2510' # 0x00bf -> BOX DRAWINGS LIGHT DOWN AND LEFT + '\u2514' # 0x00c0 -> BOX DRAWINGS LIGHT UP AND RIGHT + '\u2534' # 0x00c1 -> BOX DRAWINGS LIGHT UP AND HORIZONTAL + '\u252c' # 0x00c2 -> BOX DRAWINGS LIGHT DOWN AND HORIZONTAL + '\u251c' # 0x00c3 -> BOX DRAWINGS LIGHT VERTICAL AND RIGHT + '\u2500' # 0x00c4 -> BOX DRAWINGS LIGHT HORIZONTAL + '\u253c' # 0x00c5 -> BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL + '\u255e' # 0x00c6 -> BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE + '\u255f' # 0x00c7 -> BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE + '\u255a' # 0x00c8 -> BOX DRAWINGS DOUBLE UP AND RIGHT + '\u2554' # 0x00c9 -> BOX DRAWINGS DOUBLE DOWN AND RIGHT + '\u2569' # 0x00ca -> BOX DRAWINGS DOUBLE UP AND HORIZONTAL + '\u2566' # 0x00cb -> BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL + '\u2560' # 0x00cc -> BOX DRAWINGS DOUBLE VERTICAL AND RIGHT + '\u2550' # 0x00cd -> BOX DRAWINGS DOUBLE HORIZONTAL + '\u256c' # 0x00ce -> BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL + '\u2567' # 0x00cf -> BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE + '\u2568' # 0x00d0 -> BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE + '\u2564' # 0x00d1 -> BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE + '\u2565' # 0x00d2 -> BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE + '\u2559' # 0x00d3 -> BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE + '\u2558' # 0x00d4 -> BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE + '\u2552' # 0x00d5 -> BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE + '\u2553' # 0x00d6 -> BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE + '\u256b' # 0x00d7 -> BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE + '\u256a' # 0x00d8 -> BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE + '\u2518' # 0x00d9 -> BOX DRAWINGS LIGHT UP AND LEFT + '\u250c' # 0x00da -> BOX DRAWINGS LIGHT DOWN AND RIGHT + '\u2588' # 0x00db -> FULL BLOCK + '\u2584' # 0x00dc -> LOWER HALF BLOCK + '\u258c' # 0x00dd -> LEFT HALF BLOCK + '\u2590' # 0x00de -> RIGHT HALF BLOCK + '\u2580' # 0x00df -> UPPER HALF BLOCK + '\u0440' # 0x00e0 -> CYRILLIC SMALL LETTER ER + '\u0441' # 0x00e1 -> CYRILLIC SMALL LETTER ES + '\u0442' # 0x00e2 -> CYRILLIC SMALL LETTER TE + '\u0443' # 0x00e3 -> CYRILLIC SMALL LETTER U + '\u0444' # 0x00e4 -> CYRILLIC SMALL LETTER EF + '\u0445' # 0x00e5 -> CYRILLIC SMALL LETTER HA + '\u0446' # 0x00e6 -> CYRILLIC SMALL LETTER TSE + '\u0447' # 0x00e7 -> CYRILLIC SMALL LETTER CHE + '\u0448' # 0x00e8 -> CYRILLIC SMALL LETTER SHA + '\u0449' # 0x00e9 -> CYRILLIC SMALL LETTER SHCHA + '\u044a' # 0x00ea -> CYRILLIC SMALL LETTER HARD SIGN + '\u044b' # 0x00eb -> CYRILLIC SMALL LETTER YERU + '\u044c' # 0x00ec -> CYRILLIC SMALL LETTER SOFT SIGN + '\u044d' # 0x00ed -> CYRILLIC SMALL LETTER E + '\u044e' # 0x00ee -> CYRILLIC SMALL LETTER YU + '\u044f' # 0x00ef -> CYRILLIC SMALL LETTER YA + '\u0401' # 0x00f0 -> CYRILLIC CAPITAL LETTER IO + '\u0451' # 0x00f1 -> CYRILLIC SMALL LETTER IO + '\u0490' # 0x00f2 -> CYRILLIC CAPITAL LETTER GHE WITH UPTURN + '\u0491' # 0x00f3 -> CYRILLIC SMALL LETTER GHE WITH UPTURN + '\u0404' # 0x00f4 -> CYRILLIC CAPITAL LETTER UKRAINIAN IE + '\u0454' # 0x00f5 -> CYRILLIC SMALL LETTER UKRAINIAN IE + '\u0406' # 0x00f6 -> CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I + '\u0456' # 0x00f7 -> CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I + '\u0407' # 0x00f8 -> CYRILLIC CAPITAL LETTER YI + '\u0457' # 0x00f9 -> CYRILLIC SMALL LETTER YI + '\xb7' # 0x00fa -> MIDDLE DOT + '\u221a' # 0x00fb -> SQUARE ROOT + '\u2116' # 0x00fc -> NUMERO SIGN + '\xa4' # 0x00fd -> CURRENCY SIGN + '\u25a0' # 0x00fe -> BLACK SQUARE + '\xa0' # 0x00ff -> NO-BREAK SPACE +) + +### Encoding Map + +encoding_map = { + 0x0000: 0x0000, # NULL + 0x0001: 0x0001, # START OF HEADING + 0x0002: 0x0002, # START OF TEXT + 0x0003: 0x0003, # END OF TEXT + 0x0004: 0x0004, # END OF TRANSMISSION + 0x0005: 0x0005, # ENQUIRY + 0x0006: 0x0006, # ACKNOWLEDGE + 0x0007: 0x0007, # BELL + 0x0008: 0x0008, # BACKSPACE + 0x0009: 0x0009, # HORIZONTAL TABULATION + 0x000a: 0x000a, # LINE FEED + 0x000b: 0x000b, # VERTICAL TABULATION + 0x000c: 0x000c, # FORM FEED + 0x000d: 0x000d, # CARRIAGE RETURN + 0x000e: 0x000e, # SHIFT OUT + 0x000f: 0x000f, # SHIFT IN + 0x0010: 0x0010, # DATA LINK ESCAPE + 0x0011: 0x0011, # DEVICE CONTROL ONE + 0x0012: 0x0012, # DEVICE CONTROL TWO + 0x0013: 0x0013, # DEVICE CONTROL THREE + 0x0014: 0x0014, # DEVICE CONTROL FOUR + 0x0015: 0x0015, # NEGATIVE ACKNOWLEDGE + 0x0016: 0x0016, # SYNCHRONOUS IDLE + 0x0017: 0x0017, # END OF TRANSMISSION BLOCK + 0x0018: 0x0018, # CANCEL + 0x0019: 0x0019, # END OF MEDIUM + 0x001a: 0x001a, # SUBSTITUTE + 0x001b: 0x001b, # ESCAPE + 0x001c: 0x001c, # FILE SEPARATOR + 0x001d: 0x001d, # GROUP SEPARATOR + 0x001e: 0x001e, # RECORD SEPARATOR + 0x001f: 0x001f, # UNIT SEPARATOR + 0x0020: 0x0020, # SPACE + 0x0021: 0x0021, # EXCLAMATION MARK + 0x0022: 0x0022, # QUOTATION MARK + 0x0023: 0x0023, # NUMBER SIGN + 0x0024: 0x0024, # DOLLAR SIGN + 0x0025: 0x0025, # PERCENT SIGN + 0x0026: 0x0026, # AMPERSAND + 0x0027: 0x0027, # APOSTROPHE + 0x0028: 0x0028, # LEFT PARENTHESIS + 0x0029: 0x0029, # RIGHT PARENTHESIS + 0x002a: 0x002a, # ASTERISK + 0x002b: 0x002b, # PLUS SIGN + 0x002c: 0x002c, # COMMA + 0x002d: 0x002d, # HYPHEN-MINUS + 0x002e: 0x002e, # FULL STOP + 0x002f: 0x002f, # SOLIDUS + 0x0030: 0x0030, # DIGIT ZERO + 0x0031: 0x0031, # DIGIT ONE + 0x0032: 0x0032, # DIGIT TWO + 0x0033: 0x0033, # DIGIT THREE + 0x0034: 0x0034, # DIGIT FOUR + 0x0035: 0x0035, # DIGIT FIVE + 0x0036: 0x0036, # DIGIT SIX + 0x0037: 0x0037, # DIGIT SEVEN + 0x0038: 0x0038, # DIGIT EIGHT + 0x0039: 0x0039, # DIGIT NINE + 0x003a: 0x003a, # COLON + 0x003b: 0x003b, # SEMICOLON + 0x003c: 0x003c, # LESS-THAN SIGN + 0x003d: 0x003d, # EQUALS SIGN + 0x003e: 0x003e, # GREATER-THAN SIGN + 0x003f: 0x003f, # QUESTION MARK + 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 + 0x005c: 0x005c, # REVERSE SOLIDUS + 0x005d: 0x005d, # RIGHT SQUARE BRACKET + 0x005e: 0x005e, # CIRCUMFLEX ACCENT + 0x005f: 0x005f, # LOW LINE + 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 + 0x007c: 0x007c, # VERTICAL LINE + 0x007d: 0x007d, # RIGHT CURLY BRACKET + 0x007e: 0x007e, # TILDE + 0x007f: 0x007f, # DELETE + 0x00a0: 0x00ff, # NO-BREAK SPACE + 0x00a4: 0x00fd, # CURRENCY SIGN + 0x00b7: 0x00fa, # MIDDLE DOT + 0x0401: 0x00f0, # CYRILLIC CAPITAL LETTER IO + 0x0404: 0x00f4, # CYRILLIC CAPITAL LETTER UKRAINIAN IE + 0x0406: 0x00f6, # CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I + 0x0407: 0x00f8, # CYRILLIC CAPITAL LETTER YI + 0x0410: 0x0080, # CYRILLIC CAPITAL LETTER A + 0x0411: 0x0081, # CYRILLIC CAPITAL LETTER BE + 0x0412: 0x0082, # CYRILLIC CAPITAL LETTER VE + 0x0413: 0x0083, # CYRILLIC CAPITAL LETTER GHE + 0x0414: 0x0084, # CYRILLIC CAPITAL LETTER DE + 0x0415: 0x0085, # CYRILLIC CAPITAL LETTER IE + 0x0416: 0x0086, # CYRILLIC CAPITAL LETTER ZHE + 0x0417: 0x0087, # CYRILLIC CAPITAL LETTER ZE + 0x0418: 0x0088, # CYRILLIC CAPITAL LETTER I + 0x0419: 0x0089, # CYRILLIC CAPITAL LETTER SHORT I + 0x041a: 0x008a, # CYRILLIC CAPITAL LETTER KA + 0x041b: 0x008b, # CYRILLIC CAPITAL LETTER EL + 0x041c: 0x008c, # CYRILLIC CAPITAL LETTER EM + 0x041d: 0x008d, # CYRILLIC CAPITAL LETTER EN + 0x041e: 0x008e, # CYRILLIC CAPITAL LETTER O + 0x041f: 0x008f, # CYRILLIC CAPITAL LETTER PE + 0x0420: 0x0090, # CYRILLIC CAPITAL LETTER ER + 0x0421: 0x0091, # CYRILLIC CAPITAL LETTER ES + 0x0422: 0x0092, # CYRILLIC CAPITAL LETTER TE + 0x0423: 0x0093, # CYRILLIC CAPITAL LETTER U + 0x0424: 0x0094, # CYRILLIC CAPITAL LETTER EF + 0x0425: 0x0095, # CYRILLIC CAPITAL LETTER HA + 0x0426: 0x0096, # CYRILLIC CAPITAL LETTER TSE + 0x0427: 0x0097, # CYRILLIC CAPITAL LETTER CHE + 0x0428: 0x0098, # CYRILLIC CAPITAL LETTER SHA + 0x0429: 0x0099, # CYRILLIC CAPITAL LETTER SHCHA + 0x042a: 0x009a, # CYRILLIC CAPITAL LETTER HARD SIGN + 0x042b: 0x009b, # CYRILLIC CAPITAL LETTER YERU + 0x042c: 0x009c, # CYRILLIC CAPITAL LETTER SOFT SIGN + 0x042d: 0x009d, # CYRILLIC CAPITAL LETTER E + 0x042e: 0x009e, # CYRILLIC CAPITAL LETTER YU + 0x042f: 0x009f, # CYRILLIC CAPITAL LETTER YA + 0x0430: 0x00a0, # CYRILLIC SMALL LETTER A + 0x0431: 0x00a1, # CYRILLIC SMALL LETTER BE + 0x0432: 0x00a2, # CYRILLIC SMALL LETTER VE + 0x0433: 0x00a3, # CYRILLIC SMALL LETTER GHE + 0x0434: 0x00a4, # CYRILLIC SMALL LETTER DE + 0x0435: 0x00a5, # CYRILLIC SMALL LETTER IE + 0x0436: 0x00a6, # CYRILLIC SMALL LETTER ZHE + 0x0437: 0x00a7, # CYRILLIC SMALL LETTER ZE + 0x0438: 0x00a8, # CYRILLIC SMALL LETTER I + 0x0439: 0x00a9, # CYRILLIC SMALL LETTER SHORT I + 0x043a: 0x00aa, # CYRILLIC SMALL LETTER KA + 0x043b: 0x00ab, # CYRILLIC SMALL LETTER EL + 0x043c: 0x00ac, # CYRILLIC SMALL LETTER EM + 0x043d: 0x00ad, # CYRILLIC SMALL LETTER EN + 0x043e: 0x00ae, # CYRILLIC SMALL LETTER O + 0x043f: 0x00af, # CYRILLIC SMALL LETTER PE + 0x0440: 0x00e0, # CYRILLIC SMALL LETTER ER + 0x0441: 0x00e1, # CYRILLIC SMALL LETTER ES + 0x0442: 0x00e2, # CYRILLIC SMALL LETTER TE + 0x0443: 0x00e3, # CYRILLIC SMALL LETTER U + 0x0444: 0x00e4, # CYRILLIC SMALL LETTER EF + 0x0445: 0x00e5, # CYRILLIC SMALL LETTER HA + 0x0446: 0x00e6, # CYRILLIC SMALL LETTER TSE + 0x0447: 0x00e7, # CYRILLIC SMALL LETTER CHE + 0x0448: 0x00e8, # CYRILLIC SMALL LETTER SHA + 0x0449: 0x00e9, # CYRILLIC SMALL LETTER SHCHA + 0x044a: 0x00ea, # CYRILLIC SMALL LETTER HARD SIGN + 0x044b: 0x00eb, # CYRILLIC SMALL LETTER YERU + 0x044c: 0x00ec, # CYRILLIC SMALL LETTER SOFT SIGN + 0x044d: 0x00ed, # CYRILLIC SMALL LETTER E + 0x044e: 0x00ee, # CYRILLIC SMALL LETTER YU + 0x044f: 0x00ef, # CYRILLIC SMALL LETTER YA + 0x0451: 0x00f1, # CYRILLIC SMALL LETTER IO + 0x0454: 0x00f5, # CYRILLIC SMALL LETTER UKRAINIAN IE + 0x0456: 0x00f7, # CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I + 0x0457: 0x00f9, # CYRILLIC SMALL LETTER YI + 0x0490: 0x00f2, # CYRILLIC CAPITAL LETTER GHE WITH UPTURN + 0x0491: 0x00f3, # CYRILLIC SMALL LETTER GHE WITH UPTURN + 0x2116: 0x00fc, # NUMERO SIGN + 0x221a: 0x00fb, # SQUARE ROOT + 0x2500: 0x00c4, # BOX DRAWINGS LIGHT HORIZONTAL + 0x2502: 0x00b3, # BOX DRAWINGS LIGHT VERTICAL + 0x250c: 0x00da, # BOX DRAWINGS LIGHT DOWN AND RIGHT + 0x2510: 0x00bf, # BOX DRAWINGS LIGHT DOWN AND LEFT + 0x2514: 0x00c0, # BOX DRAWINGS LIGHT UP AND RIGHT + 0x2518: 0x00d9, # BOX DRAWINGS LIGHT UP AND LEFT + 0x251c: 0x00c3, # BOX DRAWINGS LIGHT VERTICAL AND RIGHT + 0x2524: 0x00b4, # BOX DRAWINGS LIGHT VERTICAL AND LEFT + 0x252c: 0x00c2, # BOX DRAWINGS LIGHT DOWN AND HORIZONTAL + 0x2534: 0x00c1, # BOX DRAWINGS LIGHT UP AND HORIZONTAL + 0x253c: 0x00c5, # BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL + 0x2550: 0x00cd, # BOX DRAWINGS DOUBLE HORIZONTAL + 0x2551: 0x00ba, # BOX DRAWINGS DOUBLE VERTICAL + 0x2552: 0x00d5, # BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE + 0x2553: 0x00d6, # BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE + 0x2554: 0x00c9, # BOX DRAWINGS DOUBLE DOWN AND RIGHT + 0x2555: 0x00b8, # BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE + 0x2556: 0x00b7, # BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE + 0x2557: 0x00bb, # BOX DRAWINGS DOUBLE DOWN AND LEFT + 0x2558: 0x00d4, # BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE + 0x2559: 0x00d3, # BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE + 0x255a: 0x00c8, # BOX DRAWINGS DOUBLE UP AND RIGHT + 0x255b: 0x00be, # BOX DRAWINGS UP SINGLE AND LEFT DOUBLE + 0x255c: 0x00bd, # BOX DRAWINGS UP DOUBLE AND LEFT SINGLE + 0x255d: 0x00bc, # BOX DRAWINGS DOUBLE UP AND LEFT + 0x255e: 0x00c6, # BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE + 0x255f: 0x00c7, # BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE + 0x2560: 0x00cc, # BOX DRAWINGS DOUBLE VERTICAL AND RIGHT + 0x2561: 0x00b5, # BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE + 0x2562: 0x00b6, # BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE + 0x2563: 0x00b9, # BOX DRAWINGS DOUBLE VERTICAL AND LEFT + 0x2564: 0x00d1, # BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE + 0x2565: 0x00d2, # BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE + 0x2566: 0x00cb, # BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL + 0x2567: 0x00cf, # BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE + 0x2568: 0x00d0, # BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE + 0x2569: 0x00ca, # BOX DRAWINGS DOUBLE UP AND HORIZONTAL + 0x256a: 0x00d8, # BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE + 0x256b: 0x00d7, # BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE + 0x256c: 0x00ce, # BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL + 0x2580: 0x00df, # UPPER HALF BLOCK + 0x2584: 0x00dc, # LOWER HALF BLOCK + 0x2588: 0x00db, # FULL BLOCK + 0x258c: 0x00dd, # LEFT HALF BLOCK + 0x2590: 0x00de, # RIGHT HALF BLOCK + 0x2591: 0x00b0, # LIGHT SHADE + 0x2592: 0x00b1, # MEDIUM SHADE + 0x2593: 0x00b2, # DARK SHADE + 0x25a0: 0x00fe, # BLACK SQUARE +} diff --git a/env/Lib/encodings/cp1140.py b/env/Lib/encodings/cp1140.py new file mode 100644 index 0000000..0a919d8 --- /dev/null +++ b/env/Lib/encodings/cp1140.py @@ -0,0 +1,307 @@ +""" Python Character Mapping Codec cp1140 generated from 'python-mappings/CP1140.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='cp1140', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) + + +### Decoding Table + +decoding_table = ( + '\x00' # 0x00 -> NULL + '\x01' # 0x01 -> START OF HEADING + '\x02' # 0x02 -> START OF TEXT + '\x03' # 0x03 -> END OF TEXT + '\x9c' # 0x04 -> CONTROL + '\t' # 0x05 -> HORIZONTAL TABULATION + '\x86' # 0x06 -> CONTROL + '\x7f' # 0x07 -> DELETE + '\x97' # 0x08 -> CONTROL + '\x8d' # 0x09 -> CONTROL + '\x8e' # 0x0A -> CONTROL + '\x0b' # 0x0B -> VERTICAL TABULATION + '\x0c' # 0x0C -> FORM FEED + '\r' # 0x0D -> CARRIAGE RETURN + '\x0e' # 0x0E -> SHIFT OUT + '\x0f' # 0x0F -> SHIFT IN + '\x10' # 0x10 -> DATA LINK ESCAPE + '\x11' # 0x11 -> DEVICE CONTROL ONE + '\x12' # 0x12 -> DEVICE CONTROL TWO + '\x13' # 0x13 -> DEVICE CONTROL THREE + '\x9d' # 0x14 -> CONTROL + '\x85' # 0x15 -> CONTROL + '\x08' # 0x16 -> BACKSPACE + '\x87' # 0x17 -> CONTROL + '\x18' # 0x18 -> CANCEL + '\x19' # 0x19 -> END OF MEDIUM + '\x92' # 0x1A -> CONTROL + '\x8f' # 0x1B -> CONTROL + '\x1c' # 0x1C -> FILE SEPARATOR + '\x1d' # 0x1D -> GROUP SEPARATOR + '\x1e' # 0x1E -> RECORD SEPARATOR + '\x1f' # 0x1F -> UNIT SEPARATOR + '\x80' # 0x20 -> CONTROL + '\x81' # 0x21 -> CONTROL + '\x82' # 0x22 -> CONTROL + '\x83' # 0x23 -> CONTROL + '\x84' # 0x24 -> CONTROL + '\n' # 0x25 -> LINE FEED + '\x17' # 0x26 -> END OF TRANSMISSION BLOCK + '\x1b' # 0x27 -> ESCAPE + '\x88' # 0x28 -> CONTROL + '\x89' # 0x29 -> CONTROL + '\x8a' # 0x2A -> CONTROL + '\x8b' # 0x2B -> CONTROL + '\x8c' # 0x2C -> CONTROL + '\x05' # 0x2D -> ENQUIRY + '\x06' # 0x2E -> ACKNOWLEDGE + '\x07' # 0x2F -> BELL + '\x90' # 0x30 -> CONTROL + '\x91' # 0x31 -> CONTROL + '\x16' # 0x32 -> SYNCHRONOUS IDLE + '\x93' # 0x33 -> CONTROL + '\x94' # 0x34 -> CONTROL + '\x95' # 0x35 -> CONTROL + '\x96' # 0x36 -> CONTROL + '\x04' # 0x37 -> END OF TRANSMISSION + '\x98' # 0x38 -> CONTROL + '\x99' # 0x39 -> CONTROL + '\x9a' # 0x3A -> CONTROL + '\x9b' # 0x3B -> CONTROL + '\x14' # 0x3C -> DEVICE CONTROL FOUR + '\x15' # 0x3D -> NEGATIVE ACKNOWLEDGE + '\x9e' # 0x3E -> CONTROL + '\x1a' # 0x3F -> SUBSTITUTE + ' ' # 0x40 -> SPACE + '\xa0' # 0x41 -> NO-BREAK SPACE + '\xe2' # 0x42 -> LATIN SMALL LETTER A WITH CIRCUMFLEX + '\xe4' # 0x43 -> LATIN SMALL LETTER A WITH DIAERESIS + '\xe0' # 0x44 -> LATIN SMALL LETTER A WITH GRAVE + '\xe1' # 0x45 -> LATIN SMALL LETTER A WITH ACUTE + '\xe3' # 0x46 -> LATIN SMALL LETTER A WITH TILDE + '\xe5' # 0x47 -> LATIN SMALL LETTER A WITH RING ABOVE + '\xe7' # 0x48 -> LATIN SMALL LETTER C WITH CEDILLA + '\xf1' # 0x49 -> LATIN SMALL LETTER N WITH TILDE + '\xa2' # 0x4A -> CENT SIGN + '.' # 0x4B -> FULL STOP + '<' # 0x4C -> LESS-THAN SIGN + '(' # 0x4D -> LEFT PARENTHESIS + '+' # 0x4E -> PLUS SIGN + '|' # 0x4F -> VERTICAL LINE + '&' # 0x50 -> AMPERSAND + '\xe9' # 0x51 -> LATIN SMALL LETTER E WITH ACUTE + '\xea' # 0x52 -> LATIN SMALL LETTER E WITH CIRCUMFLEX + '\xeb' # 0x53 -> LATIN SMALL LETTER E WITH DIAERESIS + '\xe8' # 0x54 -> LATIN SMALL LETTER E WITH GRAVE + '\xed' # 0x55 -> LATIN SMALL LETTER I WITH ACUTE + '\xee' # 0x56 -> LATIN SMALL LETTER I WITH CIRCUMFLEX + '\xef' # 0x57 -> LATIN SMALL LETTER I WITH DIAERESIS + '\xec' # 0x58 -> LATIN SMALL LETTER I WITH GRAVE + '\xdf' # 0x59 -> LATIN SMALL LETTER SHARP S (GERMAN) + '!' # 0x5A -> EXCLAMATION MARK + '$' # 0x5B -> DOLLAR SIGN + '*' # 0x5C -> ASTERISK + ')' # 0x5D -> RIGHT PARENTHESIS + ';' # 0x5E -> SEMICOLON + '\xac' # 0x5F -> NOT SIGN + '-' # 0x60 -> HYPHEN-MINUS + '/' # 0x61 -> SOLIDUS + '\xc2' # 0x62 -> LATIN CAPITAL LETTER A WITH CIRCUMFLEX + '\xc4' # 0x63 -> LATIN CAPITAL LETTER A WITH DIAERESIS + '\xc0' # 0x64 -> LATIN CAPITAL LETTER A WITH GRAVE + '\xc1' # 0x65 -> LATIN CAPITAL LETTER A WITH ACUTE + '\xc3' # 0x66 -> LATIN CAPITAL LETTER A WITH TILDE + '\xc5' # 0x67 -> LATIN CAPITAL LETTER A WITH RING ABOVE + '\xc7' # 0x68 -> LATIN CAPITAL LETTER C WITH CEDILLA + '\xd1' # 0x69 -> LATIN CAPITAL LETTER N WITH TILDE + '\xa6' # 0x6A -> BROKEN BAR + ',' # 0x6B -> COMMA + '%' # 0x6C -> PERCENT SIGN + '_' # 0x6D -> LOW LINE + '>' # 0x6E -> GREATER-THAN SIGN + '?' # 0x6F -> QUESTION MARK + '\xf8' # 0x70 -> LATIN SMALL LETTER O WITH STROKE + '\xc9' # 0x71 -> LATIN CAPITAL LETTER E WITH ACUTE + '\xca' # 0x72 -> LATIN CAPITAL LETTER E WITH CIRCUMFLEX + '\xcb' # 0x73 -> LATIN CAPITAL LETTER E WITH DIAERESIS + '\xc8' # 0x74 -> LATIN CAPITAL LETTER E WITH GRAVE + '\xcd' # 0x75 -> LATIN CAPITAL LETTER I WITH ACUTE + '\xce' # 0x76 -> LATIN CAPITAL LETTER I WITH CIRCUMFLEX + '\xcf' # 0x77 -> LATIN CAPITAL LETTER I WITH DIAERESIS + '\xcc' # 0x78 -> LATIN CAPITAL LETTER I WITH GRAVE + '`' # 0x79 -> GRAVE ACCENT + ':' # 0x7A -> COLON + '#' # 0x7B -> NUMBER SIGN + '@' # 0x7C -> COMMERCIAL AT + "'" # 0x7D -> APOSTROPHE + '=' # 0x7E -> EQUALS SIGN + '"' # 0x7F -> QUOTATION MARK + '\xd8' # 0x80 -> LATIN CAPITAL LETTER O WITH STROKE + 'a' # 0x81 -> LATIN SMALL LETTER A + 'b' # 0x82 -> LATIN SMALL LETTER B + 'c' # 0x83 -> LATIN SMALL LETTER C + 'd' # 0x84 -> LATIN SMALL LETTER D + 'e' # 0x85 -> LATIN SMALL LETTER E + 'f' # 0x86 -> LATIN SMALL LETTER F + 'g' # 0x87 -> LATIN SMALL LETTER G + 'h' # 0x88 -> LATIN SMALL LETTER H + 'i' # 0x89 -> LATIN SMALL LETTER I + '\xab' # 0x8A -> LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + '\xbb' # 0x8B -> RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + '\xf0' # 0x8C -> LATIN SMALL LETTER ETH (ICELANDIC) + '\xfd' # 0x8D -> LATIN SMALL LETTER Y WITH ACUTE + '\xfe' # 0x8E -> LATIN SMALL LETTER THORN (ICELANDIC) + '\xb1' # 0x8F -> PLUS-MINUS SIGN + '\xb0' # 0x90 -> DEGREE SIGN + 'j' # 0x91 -> LATIN SMALL LETTER J + 'k' # 0x92 -> LATIN SMALL LETTER K + 'l' # 0x93 -> LATIN SMALL LETTER L + 'm' # 0x94 -> LATIN SMALL LETTER M + 'n' # 0x95 -> LATIN SMALL LETTER N + 'o' # 0x96 -> LATIN SMALL LETTER O + 'p' # 0x97 -> LATIN SMALL LETTER P + 'q' # 0x98 -> LATIN SMALL LETTER Q + 'r' # 0x99 -> LATIN SMALL LETTER R + '\xaa' # 0x9A -> FEMININE ORDINAL INDICATOR + '\xba' # 0x9B -> MASCULINE ORDINAL INDICATOR + '\xe6' # 0x9C -> LATIN SMALL LIGATURE AE + '\xb8' # 0x9D -> CEDILLA + '\xc6' # 0x9E -> LATIN CAPITAL LIGATURE AE + '\u20ac' # 0x9F -> EURO SIGN + '\xb5' # 0xA0 -> MICRO SIGN + '~' # 0xA1 -> TILDE + 's' # 0xA2 -> LATIN SMALL LETTER S + 't' # 0xA3 -> LATIN SMALL LETTER T + 'u' # 0xA4 -> LATIN SMALL LETTER U + 'v' # 0xA5 -> LATIN SMALL LETTER V + 'w' # 0xA6 -> LATIN SMALL LETTER W + 'x' # 0xA7 -> LATIN SMALL LETTER X + 'y' # 0xA8 -> LATIN SMALL LETTER Y + 'z' # 0xA9 -> LATIN SMALL LETTER Z + '\xa1' # 0xAA -> INVERTED EXCLAMATION MARK + '\xbf' # 0xAB -> INVERTED QUESTION MARK + '\xd0' # 0xAC -> LATIN CAPITAL LETTER ETH (ICELANDIC) + '\xdd' # 0xAD -> LATIN CAPITAL LETTER Y WITH ACUTE + '\xde' # 0xAE -> LATIN CAPITAL LETTER THORN (ICELANDIC) + '\xae' # 0xAF -> REGISTERED SIGN + '^' # 0xB0 -> CIRCUMFLEX ACCENT + '\xa3' # 0xB1 -> POUND SIGN + '\xa5' # 0xB2 -> YEN SIGN + '\xb7' # 0xB3 -> MIDDLE DOT + '\xa9' # 0xB4 -> COPYRIGHT SIGN + '\xa7' # 0xB5 -> SECTION SIGN + '\xb6' # 0xB6 -> PILCROW SIGN + '\xbc' # 0xB7 -> VULGAR FRACTION ONE QUARTER + '\xbd' # 0xB8 -> VULGAR FRACTION ONE HALF + '\xbe' # 0xB9 -> VULGAR FRACTION THREE QUARTERS + '[' # 0xBA -> LEFT SQUARE BRACKET + ']' # 0xBB -> RIGHT SQUARE BRACKET + '\xaf' # 0xBC -> MACRON + '\xa8' # 0xBD -> DIAERESIS + '\xb4' # 0xBE -> ACUTE ACCENT + '\xd7' # 0xBF -> MULTIPLICATION SIGN + '{' # 0xC0 -> LEFT CURLY BRACKET + 'A' # 0xC1 -> LATIN CAPITAL LETTER A + 'B' # 0xC2 -> LATIN CAPITAL LETTER B + 'C' # 0xC3 -> LATIN CAPITAL LETTER C + 'D' # 0xC4 -> LATIN CAPITAL LETTER D + 'E' # 0xC5 -> LATIN CAPITAL LETTER E + 'F' # 0xC6 -> LATIN CAPITAL LETTER F + 'G' # 0xC7 -> LATIN CAPITAL LETTER G + 'H' # 0xC8 -> LATIN CAPITAL LETTER H + 'I' # 0xC9 -> LATIN CAPITAL LETTER I + '\xad' # 0xCA -> SOFT HYPHEN + '\xf4' # 0xCB -> LATIN SMALL LETTER O WITH CIRCUMFLEX + '\xf6' # 0xCC -> LATIN SMALL LETTER O WITH DIAERESIS + '\xf2' # 0xCD -> LATIN SMALL LETTER O WITH GRAVE + '\xf3' # 0xCE -> LATIN SMALL LETTER O WITH ACUTE + '\xf5' # 0xCF -> LATIN SMALL LETTER O WITH TILDE + '}' # 0xD0 -> RIGHT CURLY BRACKET + 'J' # 0xD1 -> LATIN CAPITAL LETTER J + 'K' # 0xD2 -> LATIN CAPITAL LETTER K + 'L' # 0xD3 -> LATIN CAPITAL LETTER L + 'M' # 0xD4 -> LATIN CAPITAL LETTER M + 'N' # 0xD5 -> LATIN CAPITAL LETTER N + 'O' # 0xD6 -> LATIN CAPITAL LETTER O + 'P' # 0xD7 -> LATIN CAPITAL LETTER P + 'Q' # 0xD8 -> LATIN CAPITAL LETTER Q + 'R' # 0xD9 -> LATIN CAPITAL LETTER R + '\xb9' # 0xDA -> SUPERSCRIPT ONE + '\xfb' # 0xDB -> LATIN SMALL LETTER U WITH CIRCUMFLEX + '\xfc' # 0xDC -> LATIN SMALL LETTER U WITH DIAERESIS + '\xf9' # 0xDD -> LATIN SMALL LETTER U WITH GRAVE + '\xfa' # 0xDE -> LATIN SMALL LETTER U WITH ACUTE + '\xff' # 0xDF -> LATIN SMALL LETTER Y WITH DIAERESIS + '\\' # 0xE0 -> REVERSE SOLIDUS + '\xf7' # 0xE1 -> DIVISION SIGN + 'S' # 0xE2 -> LATIN CAPITAL LETTER S + 'T' # 0xE3 -> LATIN CAPITAL LETTER T + 'U' # 0xE4 -> LATIN CAPITAL LETTER U + 'V' # 0xE5 -> LATIN CAPITAL LETTER V + 'W' # 0xE6 -> LATIN CAPITAL LETTER W + 'X' # 0xE7 -> LATIN CAPITAL LETTER X + 'Y' # 0xE8 -> LATIN CAPITAL LETTER Y + 'Z' # 0xE9 -> LATIN CAPITAL LETTER Z + '\xb2' # 0xEA -> SUPERSCRIPT TWO + '\xd4' # 0xEB -> LATIN CAPITAL LETTER O WITH CIRCUMFLEX + '\xd6' # 0xEC -> LATIN CAPITAL LETTER O WITH DIAERESIS + '\xd2' # 0xED -> LATIN CAPITAL LETTER O WITH GRAVE + '\xd3' # 0xEE -> LATIN CAPITAL LETTER O WITH ACUTE + '\xd5' # 0xEF -> LATIN CAPITAL LETTER O WITH TILDE + '0' # 0xF0 -> DIGIT ZERO + '1' # 0xF1 -> DIGIT ONE + '2' # 0xF2 -> DIGIT TWO + '3' # 0xF3 -> DIGIT THREE + '4' # 0xF4 -> DIGIT FOUR + '5' # 0xF5 -> DIGIT FIVE + '6' # 0xF6 -> DIGIT SIX + '7' # 0xF7 -> DIGIT SEVEN + '8' # 0xF8 -> DIGIT EIGHT + '9' # 0xF9 -> DIGIT NINE + '\xb3' # 0xFA -> SUPERSCRIPT THREE + '\xdb' # 0xFB -> LATIN CAPITAL LETTER U WITH CIRCUMFLEX + '\xdc' # 0xFC -> LATIN CAPITAL LETTER U WITH DIAERESIS + '\xd9' # 0xFD -> LATIN CAPITAL LETTER U WITH GRAVE + '\xda' # 0xFE -> LATIN CAPITAL LETTER U WITH ACUTE + '\x9f' # 0xFF -> CONTROL +) + +### Encoding table +encoding_table=codecs.charmap_build(decoding_table) diff --git a/env/Lib/encodings/cp1250.py b/env/Lib/encodings/cp1250.py new file mode 100644 index 0000000..c2c83aa --- /dev/null +++ b/env/Lib/encodings/cp1250.py @@ -0,0 +1,307 @@ +""" Python Character Mapping Codec cp1250 generated from 'MAPPINGS/VENDORS/MICSFT/WINDOWS/CP1250.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='cp1250', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) + + +### Decoding Table + +decoding_table = ( + '\x00' # 0x00 -> NULL + '\x01' # 0x01 -> START OF HEADING + '\x02' # 0x02 -> START OF TEXT + '\x03' # 0x03 -> END OF TEXT + '\x04' # 0x04 -> END OF TRANSMISSION + '\x05' # 0x05 -> ENQUIRY + '\x06' # 0x06 -> ACKNOWLEDGE + '\x07' # 0x07 -> BELL + '\x08' # 0x08 -> BACKSPACE + '\t' # 0x09 -> HORIZONTAL TABULATION + '\n' # 0x0A -> LINE FEED + '\x0b' # 0x0B -> VERTICAL TABULATION + '\x0c' # 0x0C -> FORM FEED + '\r' # 0x0D -> CARRIAGE RETURN + '\x0e' # 0x0E -> SHIFT OUT + '\x0f' # 0x0F -> SHIFT IN + '\x10' # 0x10 -> DATA LINK ESCAPE + '\x11' # 0x11 -> DEVICE CONTROL ONE + '\x12' # 0x12 -> DEVICE CONTROL TWO + '\x13' # 0x13 -> DEVICE CONTROL THREE + '\x14' # 0x14 -> DEVICE CONTROL FOUR + '\x15' # 0x15 -> NEGATIVE ACKNOWLEDGE + '\x16' # 0x16 -> SYNCHRONOUS IDLE + '\x17' # 0x17 -> END OF TRANSMISSION BLOCK + '\x18' # 0x18 -> CANCEL + '\x19' # 0x19 -> END OF MEDIUM + '\x1a' # 0x1A -> SUBSTITUTE + '\x1b' # 0x1B -> ESCAPE + '\x1c' # 0x1C -> FILE SEPARATOR + '\x1d' # 0x1D -> GROUP SEPARATOR + '\x1e' # 0x1E -> RECORD SEPARATOR + '\x1f' # 0x1F -> UNIT SEPARATOR + ' ' # 0x20 -> SPACE + '!' # 0x21 -> EXCLAMATION MARK + '"' # 0x22 -> QUOTATION MARK + '#' # 0x23 -> NUMBER SIGN + '$' # 0x24 -> DOLLAR SIGN + '%' # 0x25 -> PERCENT SIGN + '&' # 0x26 -> AMPERSAND + "'" # 0x27 -> APOSTROPHE + '(' # 0x28 -> LEFT PARENTHESIS + ')' # 0x29 -> RIGHT PARENTHESIS + '*' # 0x2A -> ASTERISK + '+' # 0x2B -> PLUS SIGN + ',' # 0x2C -> COMMA + '-' # 0x2D -> HYPHEN-MINUS + '.' # 0x2E -> FULL STOP + '/' # 0x2F -> SOLIDUS + '0' # 0x30 -> DIGIT ZERO + '1' # 0x31 -> DIGIT ONE + '2' # 0x32 -> DIGIT TWO + '3' # 0x33 -> DIGIT THREE + '4' # 0x34 -> DIGIT FOUR + '5' # 0x35 -> DIGIT FIVE + '6' # 0x36 -> DIGIT SIX + '7' # 0x37 -> DIGIT SEVEN + '8' # 0x38 -> DIGIT EIGHT + '9' # 0x39 -> DIGIT NINE + ':' # 0x3A -> COLON + ';' # 0x3B -> SEMICOLON + '<' # 0x3C -> LESS-THAN SIGN + '=' # 0x3D -> EQUALS SIGN + '>' # 0x3E -> GREATER-THAN SIGN + '?' # 0x3F -> QUESTION MARK + '@' # 0x40 -> COMMERCIAL AT + 'A' # 0x41 -> LATIN CAPITAL LETTER A + 'B' # 0x42 -> LATIN CAPITAL LETTER B + 'C' # 0x43 -> LATIN CAPITAL LETTER C + 'D' # 0x44 -> LATIN CAPITAL LETTER D + 'E' # 0x45 -> LATIN CAPITAL LETTER E + 'F' # 0x46 -> LATIN CAPITAL LETTER F + 'G' # 0x47 -> LATIN CAPITAL LETTER G + 'H' # 0x48 -> LATIN CAPITAL LETTER H + 'I' # 0x49 -> LATIN CAPITAL LETTER I + 'J' # 0x4A -> LATIN CAPITAL LETTER J + 'K' # 0x4B -> LATIN CAPITAL LETTER K + 'L' # 0x4C -> LATIN CAPITAL LETTER L + 'M' # 0x4D -> LATIN CAPITAL LETTER M + 'N' # 0x4E -> LATIN CAPITAL LETTER N + 'O' # 0x4F -> LATIN CAPITAL LETTER O + 'P' # 0x50 -> LATIN CAPITAL LETTER P + 'Q' # 0x51 -> LATIN CAPITAL LETTER Q + 'R' # 0x52 -> LATIN CAPITAL LETTER R + 'S' # 0x53 -> LATIN CAPITAL LETTER S + 'T' # 0x54 -> LATIN CAPITAL LETTER T + 'U' # 0x55 -> LATIN CAPITAL LETTER U + 'V' # 0x56 -> LATIN CAPITAL LETTER V + 'W' # 0x57 -> LATIN CAPITAL LETTER W + 'X' # 0x58 -> LATIN CAPITAL LETTER X + 'Y' # 0x59 -> LATIN CAPITAL LETTER Y + 'Z' # 0x5A -> LATIN CAPITAL LETTER Z + '[' # 0x5B -> LEFT SQUARE BRACKET + '\\' # 0x5C -> REVERSE SOLIDUS + ']' # 0x5D -> RIGHT SQUARE BRACKET + '^' # 0x5E -> CIRCUMFLEX ACCENT + '_' # 0x5F -> LOW LINE + '`' # 0x60 -> GRAVE ACCENT + 'a' # 0x61 -> LATIN SMALL LETTER A + 'b' # 0x62 -> LATIN SMALL LETTER B + 'c' # 0x63 -> LATIN SMALL LETTER C + 'd' # 0x64 -> LATIN SMALL LETTER D + 'e' # 0x65 -> LATIN SMALL LETTER E + 'f' # 0x66 -> LATIN SMALL LETTER F + 'g' # 0x67 -> LATIN SMALL LETTER G + 'h' # 0x68 -> LATIN SMALL LETTER H + 'i' # 0x69 -> LATIN SMALL LETTER I + 'j' # 0x6A -> LATIN SMALL LETTER J + 'k' # 0x6B -> LATIN SMALL LETTER K + 'l' # 0x6C -> LATIN SMALL LETTER L + 'm' # 0x6D -> LATIN SMALL LETTER M + 'n' # 0x6E -> LATIN SMALL LETTER N + 'o' # 0x6F -> LATIN SMALL LETTER O + 'p' # 0x70 -> LATIN SMALL LETTER P + 'q' # 0x71 -> LATIN SMALL LETTER Q + 'r' # 0x72 -> LATIN SMALL LETTER R + 's' # 0x73 -> LATIN SMALL LETTER S + 't' # 0x74 -> LATIN SMALL LETTER T + 'u' # 0x75 -> LATIN SMALL LETTER U + 'v' # 0x76 -> LATIN SMALL LETTER V + 'w' # 0x77 -> LATIN SMALL LETTER W + 'x' # 0x78 -> LATIN SMALL LETTER X + 'y' # 0x79 -> LATIN SMALL LETTER Y + 'z' # 0x7A -> LATIN SMALL LETTER Z + '{' # 0x7B -> LEFT CURLY BRACKET + '|' # 0x7C -> VERTICAL LINE + '}' # 0x7D -> RIGHT CURLY BRACKET + '~' # 0x7E -> TILDE + '\x7f' # 0x7F -> DELETE + '\u20ac' # 0x80 -> EURO SIGN + '\ufffe' # 0x81 -> UNDEFINED + '\u201a' # 0x82 -> SINGLE LOW-9 QUOTATION MARK + '\ufffe' # 0x83 -> UNDEFINED + '\u201e' # 0x84 -> DOUBLE LOW-9 QUOTATION MARK + '\u2026' # 0x85 -> HORIZONTAL ELLIPSIS + '\u2020' # 0x86 -> DAGGER + '\u2021' # 0x87 -> DOUBLE DAGGER + '\ufffe' # 0x88 -> UNDEFINED + '\u2030' # 0x89 -> PER MILLE SIGN + '\u0160' # 0x8A -> LATIN CAPITAL LETTER S WITH CARON + '\u2039' # 0x8B -> SINGLE LEFT-POINTING ANGLE QUOTATION MARK + '\u015a' # 0x8C -> LATIN CAPITAL LETTER S WITH ACUTE + '\u0164' # 0x8D -> LATIN CAPITAL LETTER T WITH CARON + '\u017d' # 0x8E -> LATIN CAPITAL LETTER Z WITH CARON + '\u0179' # 0x8F -> LATIN CAPITAL LETTER Z WITH ACUTE + '\ufffe' # 0x90 -> UNDEFINED + '\u2018' # 0x91 -> LEFT SINGLE QUOTATION MARK + '\u2019' # 0x92 -> RIGHT SINGLE QUOTATION MARK + '\u201c' # 0x93 -> LEFT DOUBLE QUOTATION MARK + '\u201d' # 0x94 -> RIGHT DOUBLE QUOTATION MARK + '\u2022' # 0x95 -> BULLET + '\u2013' # 0x96 -> EN DASH + '\u2014' # 0x97 -> EM DASH + '\ufffe' # 0x98 -> UNDEFINED + '\u2122' # 0x99 -> TRADE MARK SIGN + '\u0161' # 0x9A -> LATIN SMALL LETTER S WITH CARON + '\u203a' # 0x9B -> SINGLE RIGHT-POINTING ANGLE QUOTATION MARK + '\u015b' # 0x9C -> LATIN SMALL LETTER S WITH ACUTE + '\u0165' # 0x9D -> LATIN SMALL LETTER T WITH CARON + '\u017e' # 0x9E -> LATIN SMALL LETTER Z WITH CARON + '\u017a' # 0x9F -> LATIN SMALL LETTER Z WITH ACUTE + '\xa0' # 0xA0 -> NO-BREAK SPACE + '\u02c7' # 0xA1 -> CARON + '\u02d8' # 0xA2 -> BREVE + '\u0141' # 0xA3 -> LATIN CAPITAL LETTER L WITH STROKE + '\xa4' # 0xA4 -> CURRENCY SIGN + '\u0104' # 0xA5 -> LATIN CAPITAL LETTER A WITH OGONEK + '\xa6' # 0xA6 -> BROKEN BAR + '\xa7' # 0xA7 -> SECTION SIGN + '\xa8' # 0xA8 -> DIAERESIS + '\xa9' # 0xA9 -> COPYRIGHT SIGN + '\u015e' # 0xAA -> LATIN CAPITAL LETTER S WITH CEDILLA + '\xab' # 0xAB -> LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + '\xac' # 0xAC -> NOT SIGN + '\xad' # 0xAD -> SOFT HYPHEN + '\xae' # 0xAE -> REGISTERED SIGN + '\u017b' # 0xAF -> LATIN CAPITAL LETTER Z WITH DOT ABOVE + '\xb0' # 0xB0 -> DEGREE SIGN + '\xb1' # 0xB1 -> PLUS-MINUS SIGN + '\u02db' # 0xB2 -> OGONEK + '\u0142' # 0xB3 -> LATIN SMALL LETTER L WITH STROKE + '\xb4' # 0xB4 -> ACUTE ACCENT + '\xb5' # 0xB5 -> MICRO SIGN + '\xb6' # 0xB6 -> PILCROW SIGN + '\xb7' # 0xB7 -> MIDDLE DOT + '\xb8' # 0xB8 -> CEDILLA + '\u0105' # 0xB9 -> LATIN SMALL LETTER A WITH OGONEK + '\u015f' # 0xBA -> LATIN SMALL LETTER S WITH CEDILLA + '\xbb' # 0xBB -> RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + '\u013d' # 0xBC -> LATIN CAPITAL LETTER L WITH CARON + '\u02dd' # 0xBD -> DOUBLE ACUTE ACCENT + '\u013e' # 0xBE -> LATIN SMALL LETTER L WITH CARON + '\u017c' # 0xBF -> LATIN SMALL LETTER Z WITH DOT ABOVE + '\u0154' # 0xC0 -> LATIN CAPITAL LETTER R WITH ACUTE + '\xc1' # 0xC1 -> LATIN CAPITAL LETTER A WITH ACUTE + '\xc2' # 0xC2 -> LATIN CAPITAL LETTER A WITH CIRCUMFLEX + '\u0102' # 0xC3 -> LATIN CAPITAL LETTER A WITH BREVE + '\xc4' # 0xC4 -> LATIN CAPITAL LETTER A WITH DIAERESIS + '\u0139' # 0xC5 -> LATIN CAPITAL LETTER L WITH ACUTE + '\u0106' # 0xC6 -> LATIN CAPITAL LETTER C WITH ACUTE + '\xc7' # 0xC7 -> LATIN CAPITAL LETTER C WITH CEDILLA + '\u010c' # 0xC8 -> LATIN CAPITAL LETTER C WITH CARON + '\xc9' # 0xC9 -> LATIN CAPITAL LETTER E WITH ACUTE + '\u0118' # 0xCA -> LATIN CAPITAL LETTER E WITH OGONEK + '\xcb' # 0xCB -> LATIN CAPITAL LETTER E WITH DIAERESIS + '\u011a' # 0xCC -> LATIN CAPITAL LETTER E WITH CARON + '\xcd' # 0xCD -> LATIN CAPITAL LETTER I WITH ACUTE + '\xce' # 0xCE -> LATIN CAPITAL LETTER I WITH CIRCUMFLEX + '\u010e' # 0xCF -> LATIN CAPITAL LETTER D WITH CARON + '\u0110' # 0xD0 -> LATIN CAPITAL LETTER D WITH STROKE + '\u0143' # 0xD1 -> LATIN CAPITAL LETTER N WITH ACUTE + '\u0147' # 0xD2 -> LATIN CAPITAL LETTER N WITH CARON + '\xd3' # 0xD3 -> LATIN CAPITAL LETTER O WITH ACUTE + '\xd4' # 0xD4 -> LATIN CAPITAL LETTER O WITH CIRCUMFLEX + '\u0150' # 0xD5 -> LATIN CAPITAL LETTER O WITH DOUBLE ACUTE + '\xd6' # 0xD6 -> LATIN CAPITAL LETTER O WITH DIAERESIS + '\xd7' # 0xD7 -> MULTIPLICATION SIGN + '\u0158' # 0xD8 -> LATIN CAPITAL LETTER R WITH CARON + '\u016e' # 0xD9 -> LATIN CAPITAL LETTER U WITH RING ABOVE + '\xda' # 0xDA -> LATIN CAPITAL LETTER U WITH ACUTE + '\u0170' # 0xDB -> LATIN CAPITAL LETTER U WITH DOUBLE ACUTE + '\xdc' # 0xDC -> LATIN CAPITAL LETTER U WITH DIAERESIS + '\xdd' # 0xDD -> LATIN CAPITAL LETTER Y WITH ACUTE + '\u0162' # 0xDE -> LATIN CAPITAL LETTER T WITH CEDILLA + '\xdf' # 0xDF -> LATIN SMALL LETTER SHARP S + '\u0155' # 0xE0 -> LATIN SMALL LETTER R WITH ACUTE + '\xe1' # 0xE1 -> LATIN SMALL LETTER A WITH ACUTE + '\xe2' # 0xE2 -> LATIN SMALL LETTER A WITH CIRCUMFLEX + '\u0103' # 0xE3 -> LATIN SMALL LETTER A WITH BREVE + '\xe4' # 0xE4 -> LATIN SMALL LETTER A WITH DIAERESIS + '\u013a' # 0xE5 -> LATIN SMALL LETTER L WITH ACUTE + '\u0107' # 0xE6 -> LATIN SMALL LETTER C WITH ACUTE + '\xe7' # 0xE7 -> LATIN SMALL LETTER C WITH CEDILLA + '\u010d' # 0xE8 -> LATIN SMALL LETTER C WITH CARON + '\xe9' # 0xE9 -> LATIN SMALL LETTER E WITH ACUTE + '\u0119' # 0xEA -> LATIN SMALL LETTER E WITH OGONEK + '\xeb' # 0xEB -> LATIN SMALL LETTER E WITH DIAERESIS + '\u011b' # 0xEC -> LATIN SMALL LETTER E WITH CARON + '\xed' # 0xED -> LATIN SMALL LETTER I WITH ACUTE + '\xee' # 0xEE -> LATIN SMALL LETTER I WITH CIRCUMFLEX + '\u010f' # 0xEF -> LATIN SMALL LETTER D WITH CARON + '\u0111' # 0xF0 -> LATIN SMALL LETTER D WITH STROKE + '\u0144' # 0xF1 -> LATIN SMALL LETTER N WITH ACUTE + '\u0148' # 0xF2 -> LATIN SMALL LETTER N WITH CARON + '\xf3' # 0xF3 -> LATIN SMALL LETTER O WITH ACUTE + '\xf4' # 0xF4 -> LATIN SMALL LETTER O WITH CIRCUMFLEX + '\u0151' # 0xF5 -> LATIN SMALL LETTER O WITH DOUBLE ACUTE + '\xf6' # 0xF6 -> LATIN SMALL LETTER O WITH DIAERESIS + '\xf7' # 0xF7 -> DIVISION SIGN + '\u0159' # 0xF8 -> LATIN SMALL LETTER R WITH CARON + '\u016f' # 0xF9 -> LATIN SMALL LETTER U WITH RING ABOVE + '\xfa' # 0xFA -> LATIN SMALL LETTER U WITH ACUTE + '\u0171' # 0xFB -> LATIN SMALL LETTER U WITH DOUBLE ACUTE + '\xfc' # 0xFC -> LATIN SMALL LETTER U WITH DIAERESIS + '\xfd' # 0xFD -> LATIN SMALL LETTER Y WITH ACUTE + '\u0163' # 0xFE -> LATIN SMALL LETTER T WITH CEDILLA + '\u02d9' # 0xFF -> DOT ABOVE +) + +### Encoding table +encoding_table=codecs.charmap_build(decoding_table) diff --git a/env/Lib/encodings/cp1251.py b/env/Lib/encodings/cp1251.py new file mode 100644 index 0000000..22bc660 --- /dev/null +++ b/env/Lib/encodings/cp1251.py @@ -0,0 +1,307 @@ +""" Python Character Mapping Codec cp1251 generated from 'MAPPINGS/VENDORS/MICSFT/WINDOWS/CP1251.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='cp1251', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) + + +### Decoding Table + +decoding_table = ( + '\x00' # 0x00 -> NULL + '\x01' # 0x01 -> START OF HEADING + '\x02' # 0x02 -> START OF TEXT + '\x03' # 0x03 -> END OF TEXT + '\x04' # 0x04 -> END OF TRANSMISSION + '\x05' # 0x05 -> ENQUIRY + '\x06' # 0x06 -> ACKNOWLEDGE + '\x07' # 0x07 -> BELL + '\x08' # 0x08 -> BACKSPACE + '\t' # 0x09 -> HORIZONTAL TABULATION + '\n' # 0x0A -> LINE FEED + '\x0b' # 0x0B -> VERTICAL TABULATION + '\x0c' # 0x0C -> FORM FEED + '\r' # 0x0D -> CARRIAGE RETURN + '\x0e' # 0x0E -> SHIFT OUT + '\x0f' # 0x0F -> SHIFT IN + '\x10' # 0x10 -> DATA LINK ESCAPE + '\x11' # 0x11 -> DEVICE CONTROL ONE + '\x12' # 0x12 -> DEVICE CONTROL TWO + '\x13' # 0x13 -> DEVICE CONTROL THREE + '\x14' # 0x14 -> DEVICE CONTROL FOUR + '\x15' # 0x15 -> NEGATIVE ACKNOWLEDGE + '\x16' # 0x16 -> SYNCHRONOUS IDLE + '\x17' # 0x17 -> END OF TRANSMISSION BLOCK + '\x18' # 0x18 -> CANCEL + '\x19' # 0x19 -> END OF MEDIUM + '\x1a' # 0x1A -> SUBSTITUTE + '\x1b' # 0x1B -> ESCAPE + '\x1c' # 0x1C -> FILE SEPARATOR + '\x1d' # 0x1D -> GROUP SEPARATOR + '\x1e' # 0x1E -> RECORD SEPARATOR + '\x1f' # 0x1F -> UNIT SEPARATOR + ' ' # 0x20 -> SPACE + '!' # 0x21 -> EXCLAMATION MARK + '"' # 0x22 -> QUOTATION MARK + '#' # 0x23 -> NUMBER SIGN + '$' # 0x24 -> DOLLAR SIGN + '%' # 0x25 -> PERCENT SIGN + '&' # 0x26 -> AMPERSAND + "'" # 0x27 -> APOSTROPHE + '(' # 0x28 -> LEFT PARENTHESIS + ')' # 0x29 -> RIGHT PARENTHESIS + '*' # 0x2A -> ASTERISK + '+' # 0x2B -> PLUS SIGN + ',' # 0x2C -> COMMA + '-' # 0x2D -> HYPHEN-MINUS + '.' # 0x2E -> FULL STOP + '/' # 0x2F -> SOLIDUS + '0' # 0x30 -> DIGIT ZERO + '1' # 0x31 -> DIGIT ONE + '2' # 0x32 -> DIGIT TWO + '3' # 0x33 -> DIGIT THREE + '4' # 0x34 -> DIGIT FOUR + '5' # 0x35 -> DIGIT FIVE + '6' # 0x36 -> DIGIT SIX + '7' # 0x37 -> DIGIT SEVEN + '8' # 0x38 -> DIGIT EIGHT + '9' # 0x39 -> DIGIT NINE + ':' # 0x3A -> COLON + ';' # 0x3B -> SEMICOLON + '<' # 0x3C -> LESS-THAN SIGN + '=' # 0x3D -> EQUALS SIGN + '>' # 0x3E -> GREATER-THAN SIGN + '?' # 0x3F -> QUESTION MARK + '@' # 0x40 -> COMMERCIAL AT + 'A' # 0x41 -> LATIN CAPITAL LETTER A + 'B' # 0x42 -> LATIN CAPITAL LETTER B + 'C' # 0x43 -> LATIN CAPITAL LETTER C + 'D' # 0x44 -> LATIN CAPITAL LETTER D + 'E' # 0x45 -> LATIN CAPITAL LETTER E + 'F' # 0x46 -> LATIN CAPITAL LETTER F + 'G' # 0x47 -> LATIN CAPITAL LETTER G + 'H' # 0x48 -> LATIN CAPITAL LETTER H + 'I' # 0x49 -> LATIN CAPITAL LETTER I + 'J' # 0x4A -> LATIN CAPITAL LETTER J + 'K' # 0x4B -> LATIN CAPITAL LETTER K + 'L' # 0x4C -> LATIN CAPITAL LETTER L + 'M' # 0x4D -> LATIN CAPITAL LETTER M + 'N' # 0x4E -> LATIN CAPITAL LETTER N + 'O' # 0x4F -> LATIN CAPITAL LETTER O + 'P' # 0x50 -> LATIN CAPITAL LETTER P + 'Q' # 0x51 -> LATIN CAPITAL LETTER Q + 'R' # 0x52 -> LATIN CAPITAL LETTER R + 'S' # 0x53 -> LATIN CAPITAL LETTER S + 'T' # 0x54 -> LATIN CAPITAL LETTER T + 'U' # 0x55 -> LATIN CAPITAL LETTER U + 'V' # 0x56 -> LATIN CAPITAL LETTER V + 'W' # 0x57 -> LATIN CAPITAL LETTER W + 'X' # 0x58 -> LATIN CAPITAL LETTER X + 'Y' # 0x59 -> LATIN CAPITAL LETTER Y + 'Z' # 0x5A -> LATIN CAPITAL LETTER Z + '[' # 0x5B -> LEFT SQUARE BRACKET + '\\' # 0x5C -> REVERSE SOLIDUS + ']' # 0x5D -> RIGHT SQUARE BRACKET + '^' # 0x5E -> CIRCUMFLEX ACCENT + '_' # 0x5F -> LOW LINE + '`' # 0x60 -> GRAVE ACCENT + 'a' # 0x61 -> LATIN SMALL LETTER A + 'b' # 0x62 -> LATIN SMALL LETTER B + 'c' # 0x63 -> LATIN SMALL LETTER C + 'd' # 0x64 -> LATIN SMALL LETTER D + 'e' # 0x65 -> LATIN SMALL LETTER E + 'f' # 0x66 -> LATIN SMALL LETTER F + 'g' # 0x67 -> LATIN SMALL LETTER G + 'h' # 0x68 -> LATIN SMALL LETTER H + 'i' # 0x69 -> LATIN SMALL LETTER I + 'j' # 0x6A -> LATIN SMALL LETTER J + 'k' # 0x6B -> LATIN SMALL LETTER K + 'l' # 0x6C -> LATIN SMALL LETTER L + 'm' # 0x6D -> LATIN SMALL LETTER M + 'n' # 0x6E -> LATIN SMALL LETTER N + 'o' # 0x6F -> LATIN SMALL LETTER O + 'p' # 0x70 -> LATIN SMALL LETTER P + 'q' # 0x71 -> LATIN SMALL LETTER Q + 'r' # 0x72 -> LATIN SMALL LETTER R + 's' # 0x73 -> LATIN SMALL LETTER S + 't' # 0x74 -> LATIN SMALL LETTER T + 'u' # 0x75 -> LATIN SMALL LETTER U + 'v' # 0x76 -> LATIN SMALL LETTER V + 'w' # 0x77 -> LATIN SMALL LETTER W + 'x' # 0x78 -> LATIN SMALL LETTER X + 'y' # 0x79 -> LATIN SMALL LETTER Y + 'z' # 0x7A -> LATIN SMALL LETTER Z + '{' # 0x7B -> LEFT CURLY BRACKET + '|' # 0x7C -> VERTICAL LINE + '}' # 0x7D -> RIGHT CURLY BRACKET + '~' # 0x7E -> TILDE + '\x7f' # 0x7F -> DELETE + '\u0402' # 0x80 -> CYRILLIC CAPITAL LETTER DJE + '\u0403' # 0x81 -> CYRILLIC CAPITAL LETTER GJE + '\u201a' # 0x82 -> SINGLE LOW-9 QUOTATION MARK + '\u0453' # 0x83 -> CYRILLIC SMALL LETTER GJE + '\u201e' # 0x84 -> DOUBLE LOW-9 QUOTATION MARK + '\u2026' # 0x85 -> HORIZONTAL ELLIPSIS + '\u2020' # 0x86 -> DAGGER + '\u2021' # 0x87 -> DOUBLE DAGGER + '\u20ac' # 0x88 -> EURO SIGN + '\u2030' # 0x89 -> PER MILLE SIGN + '\u0409' # 0x8A -> CYRILLIC CAPITAL LETTER LJE + '\u2039' # 0x8B -> SINGLE LEFT-POINTING ANGLE QUOTATION MARK + '\u040a' # 0x8C -> CYRILLIC CAPITAL LETTER NJE + '\u040c' # 0x8D -> CYRILLIC CAPITAL LETTER KJE + '\u040b' # 0x8E -> CYRILLIC CAPITAL LETTER TSHE + '\u040f' # 0x8F -> CYRILLIC CAPITAL LETTER DZHE + '\u0452' # 0x90 -> CYRILLIC SMALL LETTER DJE + '\u2018' # 0x91 -> LEFT SINGLE QUOTATION MARK + '\u2019' # 0x92 -> RIGHT SINGLE QUOTATION MARK + '\u201c' # 0x93 -> LEFT DOUBLE QUOTATION MARK + '\u201d' # 0x94 -> RIGHT DOUBLE QUOTATION MARK + '\u2022' # 0x95 -> BULLET + '\u2013' # 0x96 -> EN DASH + '\u2014' # 0x97 -> EM DASH + '\ufffe' # 0x98 -> UNDEFINED + '\u2122' # 0x99 -> TRADE MARK SIGN + '\u0459' # 0x9A -> CYRILLIC SMALL LETTER LJE + '\u203a' # 0x9B -> SINGLE RIGHT-POINTING ANGLE QUOTATION MARK + '\u045a' # 0x9C -> CYRILLIC SMALL LETTER NJE + '\u045c' # 0x9D -> CYRILLIC SMALL LETTER KJE + '\u045b' # 0x9E -> CYRILLIC SMALL LETTER TSHE + '\u045f' # 0x9F -> CYRILLIC SMALL LETTER DZHE + '\xa0' # 0xA0 -> NO-BREAK SPACE + '\u040e' # 0xA1 -> CYRILLIC CAPITAL LETTER SHORT U + '\u045e' # 0xA2 -> CYRILLIC SMALL LETTER SHORT U + '\u0408' # 0xA3 -> CYRILLIC CAPITAL LETTER JE + '\xa4' # 0xA4 -> CURRENCY SIGN + '\u0490' # 0xA5 -> CYRILLIC CAPITAL LETTER GHE WITH UPTURN + '\xa6' # 0xA6 -> BROKEN BAR + '\xa7' # 0xA7 -> SECTION SIGN + '\u0401' # 0xA8 -> CYRILLIC CAPITAL LETTER IO + '\xa9' # 0xA9 -> COPYRIGHT SIGN + '\u0404' # 0xAA -> CYRILLIC CAPITAL LETTER UKRAINIAN IE + '\xab' # 0xAB -> LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + '\xac' # 0xAC -> NOT SIGN + '\xad' # 0xAD -> SOFT HYPHEN + '\xae' # 0xAE -> REGISTERED SIGN + '\u0407' # 0xAF -> CYRILLIC CAPITAL LETTER YI + '\xb0' # 0xB0 -> DEGREE SIGN + '\xb1' # 0xB1 -> PLUS-MINUS SIGN + '\u0406' # 0xB2 -> CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I + '\u0456' # 0xB3 -> CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I + '\u0491' # 0xB4 -> CYRILLIC SMALL LETTER GHE WITH UPTURN + '\xb5' # 0xB5 -> MICRO SIGN + '\xb6' # 0xB6 -> PILCROW SIGN + '\xb7' # 0xB7 -> MIDDLE DOT + '\u0451' # 0xB8 -> CYRILLIC SMALL LETTER IO + '\u2116' # 0xB9 -> NUMERO SIGN + '\u0454' # 0xBA -> CYRILLIC SMALL LETTER UKRAINIAN IE + '\xbb' # 0xBB -> RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + '\u0458' # 0xBC -> CYRILLIC SMALL LETTER JE + '\u0405' # 0xBD -> CYRILLIC CAPITAL LETTER DZE + '\u0455' # 0xBE -> CYRILLIC SMALL LETTER DZE + '\u0457' # 0xBF -> CYRILLIC SMALL LETTER YI + '\u0410' # 0xC0 -> CYRILLIC CAPITAL LETTER A + '\u0411' # 0xC1 -> CYRILLIC CAPITAL LETTER BE + '\u0412' # 0xC2 -> CYRILLIC CAPITAL LETTER VE + '\u0413' # 0xC3 -> CYRILLIC CAPITAL LETTER GHE + '\u0414' # 0xC4 -> CYRILLIC CAPITAL LETTER DE + '\u0415' # 0xC5 -> CYRILLIC CAPITAL LETTER IE + '\u0416' # 0xC6 -> CYRILLIC CAPITAL LETTER ZHE + '\u0417' # 0xC7 -> CYRILLIC CAPITAL LETTER ZE + '\u0418' # 0xC8 -> CYRILLIC CAPITAL LETTER I + '\u0419' # 0xC9 -> CYRILLIC CAPITAL LETTER SHORT I + '\u041a' # 0xCA -> CYRILLIC CAPITAL LETTER KA + '\u041b' # 0xCB -> CYRILLIC CAPITAL LETTER EL + '\u041c' # 0xCC -> CYRILLIC CAPITAL LETTER EM + '\u041d' # 0xCD -> CYRILLIC CAPITAL LETTER EN + '\u041e' # 0xCE -> CYRILLIC CAPITAL LETTER O + '\u041f' # 0xCF -> CYRILLIC CAPITAL LETTER PE + '\u0420' # 0xD0 -> CYRILLIC CAPITAL LETTER ER + '\u0421' # 0xD1 -> CYRILLIC CAPITAL LETTER ES + '\u0422' # 0xD2 -> CYRILLIC CAPITAL LETTER TE + '\u0423' # 0xD3 -> CYRILLIC CAPITAL LETTER U + '\u0424' # 0xD4 -> CYRILLIC CAPITAL LETTER EF + '\u0425' # 0xD5 -> CYRILLIC CAPITAL LETTER HA + '\u0426' # 0xD6 -> CYRILLIC CAPITAL LETTER TSE + '\u0427' # 0xD7 -> CYRILLIC CAPITAL LETTER CHE + '\u0428' # 0xD8 -> CYRILLIC CAPITAL LETTER SHA + '\u0429' # 0xD9 -> CYRILLIC CAPITAL LETTER SHCHA + '\u042a' # 0xDA -> CYRILLIC CAPITAL LETTER HARD SIGN + '\u042b' # 0xDB -> CYRILLIC CAPITAL LETTER YERU + '\u042c' # 0xDC -> CYRILLIC CAPITAL LETTER SOFT SIGN + '\u042d' # 0xDD -> CYRILLIC CAPITAL LETTER E + '\u042e' # 0xDE -> CYRILLIC CAPITAL LETTER YU + '\u042f' # 0xDF -> CYRILLIC CAPITAL LETTER YA + '\u0430' # 0xE0 -> CYRILLIC SMALL LETTER A + '\u0431' # 0xE1 -> CYRILLIC SMALL LETTER BE + '\u0432' # 0xE2 -> CYRILLIC SMALL LETTER VE + '\u0433' # 0xE3 -> CYRILLIC SMALL LETTER GHE + '\u0434' # 0xE4 -> CYRILLIC SMALL LETTER DE + '\u0435' # 0xE5 -> CYRILLIC SMALL LETTER IE + '\u0436' # 0xE6 -> CYRILLIC SMALL LETTER ZHE + '\u0437' # 0xE7 -> CYRILLIC SMALL LETTER ZE + '\u0438' # 0xE8 -> CYRILLIC SMALL LETTER I + '\u0439' # 0xE9 -> CYRILLIC SMALL LETTER SHORT I + '\u043a' # 0xEA -> CYRILLIC SMALL LETTER KA + '\u043b' # 0xEB -> CYRILLIC SMALL LETTER EL + '\u043c' # 0xEC -> CYRILLIC SMALL LETTER EM + '\u043d' # 0xED -> CYRILLIC SMALL LETTER EN + '\u043e' # 0xEE -> CYRILLIC SMALL LETTER O + '\u043f' # 0xEF -> CYRILLIC SMALL LETTER PE + '\u0440' # 0xF0 -> CYRILLIC SMALL LETTER ER + '\u0441' # 0xF1 -> CYRILLIC SMALL LETTER ES + '\u0442' # 0xF2 -> CYRILLIC SMALL LETTER TE + '\u0443' # 0xF3 -> CYRILLIC SMALL LETTER U + '\u0444' # 0xF4 -> CYRILLIC SMALL LETTER EF + '\u0445' # 0xF5 -> CYRILLIC SMALL LETTER HA + '\u0446' # 0xF6 -> CYRILLIC SMALL LETTER TSE + '\u0447' # 0xF7 -> CYRILLIC SMALL LETTER CHE + '\u0448' # 0xF8 -> CYRILLIC SMALL LETTER SHA + '\u0449' # 0xF9 -> CYRILLIC SMALL LETTER SHCHA + '\u044a' # 0xFA -> CYRILLIC SMALL LETTER HARD SIGN + '\u044b' # 0xFB -> CYRILLIC SMALL LETTER YERU + '\u044c' # 0xFC -> CYRILLIC SMALL LETTER SOFT SIGN + '\u044d' # 0xFD -> CYRILLIC SMALL LETTER E + '\u044e' # 0xFE -> CYRILLIC SMALL LETTER YU + '\u044f' # 0xFF -> CYRILLIC SMALL LETTER YA +) + +### Encoding table +encoding_table=codecs.charmap_build(decoding_table) diff --git a/env/Lib/encodings/cp1252.py b/env/Lib/encodings/cp1252.py new file mode 100644 index 0000000..c0e8088 --- /dev/null +++ b/env/Lib/encodings/cp1252.py @@ -0,0 +1,307 @@ +""" Python Character Mapping Codec cp1252 generated from 'MAPPINGS/VENDORS/MICSFT/WINDOWS/CP1252.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='cp1252', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) + + +### Decoding Table + +decoding_table = ( + '\x00' # 0x00 -> NULL + '\x01' # 0x01 -> START OF HEADING + '\x02' # 0x02 -> START OF TEXT + '\x03' # 0x03 -> END OF TEXT + '\x04' # 0x04 -> END OF TRANSMISSION + '\x05' # 0x05 -> ENQUIRY + '\x06' # 0x06 -> ACKNOWLEDGE + '\x07' # 0x07 -> BELL + '\x08' # 0x08 -> BACKSPACE + '\t' # 0x09 -> HORIZONTAL TABULATION + '\n' # 0x0A -> LINE FEED + '\x0b' # 0x0B -> VERTICAL TABULATION + '\x0c' # 0x0C -> FORM FEED + '\r' # 0x0D -> CARRIAGE RETURN + '\x0e' # 0x0E -> SHIFT OUT + '\x0f' # 0x0F -> SHIFT IN + '\x10' # 0x10 -> DATA LINK ESCAPE + '\x11' # 0x11 -> DEVICE CONTROL ONE + '\x12' # 0x12 -> DEVICE CONTROL TWO + '\x13' # 0x13 -> DEVICE CONTROL THREE + '\x14' # 0x14 -> DEVICE CONTROL FOUR + '\x15' # 0x15 -> NEGATIVE ACKNOWLEDGE + '\x16' # 0x16 -> SYNCHRONOUS IDLE + '\x17' # 0x17 -> END OF TRANSMISSION BLOCK + '\x18' # 0x18 -> CANCEL + '\x19' # 0x19 -> END OF MEDIUM + '\x1a' # 0x1A -> SUBSTITUTE + '\x1b' # 0x1B -> ESCAPE + '\x1c' # 0x1C -> FILE SEPARATOR + '\x1d' # 0x1D -> GROUP SEPARATOR + '\x1e' # 0x1E -> RECORD SEPARATOR + '\x1f' # 0x1F -> UNIT SEPARATOR + ' ' # 0x20 -> SPACE + '!' # 0x21 -> EXCLAMATION MARK + '"' # 0x22 -> QUOTATION MARK + '#' # 0x23 -> NUMBER SIGN + '$' # 0x24 -> DOLLAR SIGN + '%' # 0x25 -> PERCENT SIGN + '&' # 0x26 -> AMPERSAND + "'" # 0x27 -> APOSTROPHE + '(' # 0x28 -> LEFT PARENTHESIS + ')' # 0x29 -> RIGHT PARENTHESIS + '*' # 0x2A -> ASTERISK + '+' # 0x2B -> PLUS SIGN + ',' # 0x2C -> COMMA + '-' # 0x2D -> HYPHEN-MINUS + '.' # 0x2E -> FULL STOP + '/' # 0x2F -> SOLIDUS + '0' # 0x30 -> DIGIT ZERO + '1' # 0x31 -> DIGIT ONE + '2' # 0x32 -> DIGIT TWO + '3' # 0x33 -> DIGIT THREE + '4' # 0x34 -> DIGIT FOUR + '5' # 0x35 -> DIGIT FIVE + '6' # 0x36 -> DIGIT SIX + '7' # 0x37 -> DIGIT SEVEN + '8' # 0x38 -> DIGIT EIGHT + '9' # 0x39 -> DIGIT NINE + ':' # 0x3A -> COLON + ';' # 0x3B -> SEMICOLON + '<' # 0x3C -> LESS-THAN SIGN + '=' # 0x3D -> EQUALS SIGN + '>' # 0x3E -> GREATER-THAN SIGN + '?' # 0x3F -> QUESTION MARK + '@' # 0x40 -> COMMERCIAL AT + 'A' # 0x41 -> LATIN CAPITAL LETTER A + 'B' # 0x42 -> LATIN CAPITAL LETTER B + 'C' # 0x43 -> LATIN CAPITAL LETTER C + 'D' # 0x44 -> LATIN CAPITAL LETTER D + 'E' # 0x45 -> LATIN CAPITAL LETTER E + 'F' # 0x46 -> LATIN CAPITAL LETTER F + 'G' # 0x47 -> LATIN CAPITAL LETTER G + 'H' # 0x48 -> LATIN CAPITAL LETTER H + 'I' # 0x49 -> LATIN CAPITAL LETTER I + 'J' # 0x4A -> LATIN CAPITAL LETTER J + 'K' # 0x4B -> LATIN CAPITAL LETTER K + 'L' # 0x4C -> LATIN CAPITAL LETTER L + 'M' # 0x4D -> LATIN CAPITAL LETTER M + 'N' # 0x4E -> LATIN CAPITAL LETTER N + 'O' # 0x4F -> LATIN CAPITAL LETTER O + 'P' # 0x50 -> LATIN CAPITAL LETTER P + 'Q' # 0x51 -> LATIN CAPITAL LETTER Q + 'R' # 0x52 -> LATIN CAPITAL LETTER R + 'S' # 0x53 -> LATIN CAPITAL LETTER S + 'T' # 0x54 -> LATIN CAPITAL LETTER T + 'U' # 0x55 -> LATIN CAPITAL LETTER U + 'V' # 0x56 -> LATIN CAPITAL LETTER V + 'W' # 0x57 -> LATIN CAPITAL LETTER W + 'X' # 0x58 -> LATIN CAPITAL LETTER X + 'Y' # 0x59 -> LATIN CAPITAL LETTER Y + 'Z' # 0x5A -> LATIN CAPITAL LETTER Z + '[' # 0x5B -> LEFT SQUARE BRACKET + '\\' # 0x5C -> REVERSE SOLIDUS + ']' # 0x5D -> RIGHT SQUARE BRACKET + '^' # 0x5E -> CIRCUMFLEX ACCENT + '_' # 0x5F -> LOW LINE + '`' # 0x60 -> GRAVE ACCENT + 'a' # 0x61 -> LATIN SMALL LETTER A + 'b' # 0x62 -> LATIN SMALL LETTER B + 'c' # 0x63 -> LATIN SMALL LETTER C + 'd' # 0x64 -> LATIN SMALL LETTER D + 'e' # 0x65 -> LATIN SMALL LETTER E + 'f' # 0x66 -> LATIN SMALL LETTER F + 'g' # 0x67 -> LATIN SMALL LETTER G + 'h' # 0x68 -> LATIN SMALL LETTER H + 'i' # 0x69 -> LATIN SMALL LETTER I + 'j' # 0x6A -> LATIN SMALL LETTER J + 'k' # 0x6B -> LATIN SMALL LETTER K + 'l' # 0x6C -> LATIN SMALL LETTER L + 'm' # 0x6D -> LATIN SMALL LETTER M + 'n' # 0x6E -> LATIN SMALL LETTER N + 'o' # 0x6F -> LATIN SMALL LETTER O + 'p' # 0x70 -> LATIN SMALL LETTER P + 'q' # 0x71 -> LATIN SMALL LETTER Q + 'r' # 0x72 -> LATIN SMALL LETTER R + 's' # 0x73 -> LATIN SMALL LETTER S + 't' # 0x74 -> LATIN SMALL LETTER T + 'u' # 0x75 -> LATIN SMALL LETTER U + 'v' # 0x76 -> LATIN SMALL LETTER V + 'w' # 0x77 -> LATIN SMALL LETTER W + 'x' # 0x78 -> LATIN SMALL LETTER X + 'y' # 0x79 -> LATIN SMALL LETTER Y + 'z' # 0x7A -> LATIN SMALL LETTER Z + '{' # 0x7B -> LEFT CURLY BRACKET + '|' # 0x7C -> VERTICAL LINE + '}' # 0x7D -> RIGHT CURLY BRACKET + '~' # 0x7E -> TILDE + '\x7f' # 0x7F -> DELETE + '\u20ac' # 0x80 -> EURO SIGN + '\ufffe' # 0x81 -> UNDEFINED + '\u201a' # 0x82 -> SINGLE LOW-9 QUOTATION MARK + '\u0192' # 0x83 -> LATIN SMALL LETTER F WITH HOOK + '\u201e' # 0x84 -> DOUBLE LOW-9 QUOTATION MARK + '\u2026' # 0x85 -> HORIZONTAL ELLIPSIS + '\u2020' # 0x86 -> DAGGER + '\u2021' # 0x87 -> DOUBLE DAGGER + '\u02c6' # 0x88 -> MODIFIER LETTER CIRCUMFLEX ACCENT + '\u2030' # 0x89 -> PER MILLE SIGN + '\u0160' # 0x8A -> LATIN CAPITAL LETTER S WITH CARON + '\u2039' # 0x8B -> SINGLE LEFT-POINTING ANGLE QUOTATION MARK + '\u0152' # 0x8C -> LATIN CAPITAL LIGATURE OE + '\ufffe' # 0x8D -> UNDEFINED + '\u017d' # 0x8E -> LATIN CAPITAL LETTER Z WITH CARON + '\ufffe' # 0x8F -> UNDEFINED + '\ufffe' # 0x90 -> UNDEFINED + '\u2018' # 0x91 -> LEFT SINGLE QUOTATION MARK + '\u2019' # 0x92 -> RIGHT SINGLE QUOTATION MARK + '\u201c' # 0x93 -> LEFT DOUBLE QUOTATION MARK + '\u201d' # 0x94 -> RIGHT DOUBLE QUOTATION MARK + '\u2022' # 0x95 -> BULLET + '\u2013' # 0x96 -> EN DASH + '\u2014' # 0x97 -> EM DASH + '\u02dc' # 0x98 -> SMALL TILDE + '\u2122' # 0x99 -> TRADE MARK SIGN + '\u0161' # 0x9A -> LATIN SMALL LETTER S WITH CARON + '\u203a' # 0x9B -> SINGLE RIGHT-POINTING ANGLE QUOTATION MARK + '\u0153' # 0x9C -> LATIN SMALL LIGATURE OE + '\ufffe' # 0x9D -> UNDEFINED + '\u017e' # 0x9E -> LATIN SMALL LETTER Z WITH CARON + '\u0178' # 0x9F -> LATIN CAPITAL LETTER Y WITH DIAERESIS + '\xa0' # 0xA0 -> NO-BREAK SPACE + '\xa1' # 0xA1 -> INVERTED EXCLAMATION MARK + '\xa2' # 0xA2 -> CENT SIGN + '\xa3' # 0xA3 -> POUND SIGN + '\xa4' # 0xA4 -> CURRENCY SIGN + '\xa5' # 0xA5 -> YEN SIGN + '\xa6' # 0xA6 -> BROKEN BAR + '\xa7' # 0xA7 -> SECTION SIGN + '\xa8' # 0xA8 -> DIAERESIS + '\xa9' # 0xA9 -> COPYRIGHT SIGN + '\xaa' # 0xAA -> FEMININE ORDINAL INDICATOR + '\xab' # 0xAB -> LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + '\xac' # 0xAC -> NOT SIGN + '\xad' # 0xAD -> SOFT HYPHEN + '\xae' # 0xAE -> REGISTERED SIGN + '\xaf' # 0xAF -> MACRON + '\xb0' # 0xB0 -> DEGREE SIGN + '\xb1' # 0xB1 -> PLUS-MINUS SIGN + '\xb2' # 0xB2 -> SUPERSCRIPT TWO + '\xb3' # 0xB3 -> SUPERSCRIPT THREE + '\xb4' # 0xB4 -> ACUTE ACCENT + '\xb5' # 0xB5 -> MICRO SIGN + '\xb6' # 0xB6 -> PILCROW SIGN + '\xb7' # 0xB7 -> MIDDLE DOT + '\xb8' # 0xB8 -> CEDILLA + '\xb9' # 0xB9 -> SUPERSCRIPT ONE + '\xba' # 0xBA -> MASCULINE ORDINAL INDICATOR + '\xbb' # 0xBB -> RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + '\xbc' # 0xBC -> VULGAR FRACTION ONE QUARTER + '\xbd' # 0xBD -> VULGAR FRACTION ONE HALF + '\xbe' # 0xBE -> VULGAR FRACTION THREE QUARTERS + '\xbf' # 0xBF -> INVERTED QUESTION MARK + '\xc0' # 0xC0 -> LATIN CAPITAL LETTER A WITH GRAVE + '\xc1' # 0xC1 -> LATIN CAPITAL LETTER A WITH ACUTE + '\xc2' # 0xC2 -> LATIN CAPITAL LETTER A WITH CIRCUMFLEX + '\xc3' # 0xC3 -> LATIN CAPITAL LETTER A WITH TILDE + '\xc4' # 0xC4 -> LATIN CAPITAL LETTER A WITH DIAERESIS + '\xc5' # 0xC5 -> LATIN CAPITAL LETTER A WITH RING ABOVE + '\xc6' # 0xC6 -> LATIN CAPITAL LETTER AE + '\xc7' # 0xC7 -> LATIN CAPITAL LETTER C WITH CEDILLA + '\xc8' # 0xC8 -> LATIN CAPITAL LETTER E WITH GRAVE + '\xc9' # 0xC9 -> LATIN CAPITAL LETTER E WITH ACUTE + '\xca' # 0xCA -> LATIN CAPITAL LETTER E WITH CIRCUMFLEX + '\xcb' # 0xCB -> LATIN CAPITAL LETTER E WITH DIAERESIS + '\xcc' # 0xCC -> LATIN CAPITAL LETTER I WITH GRAVE + '\xcd' # 0xCD -> LATIN CAPITAL LETTER I WITH ACUTE + '\xce' # 0xCE -> LATIN CAPITAL LETTER I WITH CIRCUMFLEX + '\xcf' # 0xCF -> LATIN CAPITAL LETTER I WITH DIAERESIS + '\xd0' # 0xD0 -> LATIN CAPITAL LETTER ETH + '\xd1' # 0xD1 -> LATIN CAPITAL LETTER N WITH TILDE + '\xd2' # 0xD2 -> LATIN CAPITAL LETTER O WITH GRAVE + '\xd3' # 0xD3 -> LATIN CAPITAL LETTER O WITH ACUTE + '\xd4' # 0xD4 -> LATIN CAPITAL LETTER O WITH CIRCUMFLEX + '\xd5' # 0xD5 -> LATIN CAPITAL LETTER O WITH TILDE + '\xd6' # 0xD6 -> LATIN CAPITAL LETTER O WITH DIAERESIS + '\xd7' # 0xD7 -> MULTIPLICATION SIGN + '\xd8' # 0xD8 -> LATIN CAPITAL LETTER O WITH STROKE + '\xd9' # 0xD9 -> LATIN CAPITAL LETTER U WITH GRAVE + '\xda' # 0xDA -> LATIN CAPITAL LETTER U WITH ACUTE + '\xdb' # 0xDB -> LATIN CAPITAL LETTER U WITH CIRCUMFLEX + '\xdc' # 0xDC -> LATIN CAPITAL LETTER U WITH DIAERESIS + '\xdd' # 0xDD -> LATIN CAPITAL LETTER Y WITH ACUTE + '\xde' # 0xDE -> LATIN CAPITAL LETTER THORN + '\xdf' # 0xDF -> LATIN SMALL LETTER SHARP S + '\xe0' # 0xE0 -> LATIN SMALL LETTER A WITH GRAVE + '\xe1' # 0xE1 -> LATIN SMALL LETTER A WITH ACUTE + '\xe2' # 0xE2 -> LATIN SMALL LETTER A WITH CIRCUMFLEX + '\xe3' # 0xE3 -> LATIN SMALL LETTER A WITH TILDE + '\xe4' # 0xE4 -> LATIN SMALL LETTER A WITH DIAERESIS + '\xe5' # 0xE5 -> LATIN SMALL LETTER A WITH RING ABOVE + '\xe6' # 0xE6 -> LATIN SMALL LETTER AE + '\xe7' # 0xE7 -> LATIN SMALL LETTER C WITH CEDILLA + '\xe8' # 0xE8 -> LATIN SMALL LETTER E WITH GRAVE + '\xe9' # 0xE9 -> LATIN SMALL LETTER E WITH ACUTE + '\xea' # 0xEA -> LATIN SMALL LETTER E WITH CIRCUMFLEX + '\xeb' # 0xEB -> LATIN SMALL LETTER E WITH DIAERESIS + '\xec' # 0xEC -> LATIN SMALL LETTER I WITH GRAVE + '\xed' # 0xED -> LATIN SMALL LETTER I WITH ACUTE + '\xee' # 0xEE -> LATIN SMALL LETTER I WITH CIRCUMFLEX + '\xef' # 0xEF -> LATIN SMALL LETTER I WITH DIAERESIS + '\xf0' # 0xF0 -> LATIN SMALL LETTER ETH + '\xf1' # 0xF1 -> LATIN SMALL LETTER N WITH TILDE + '\xf2' # 0xF2 -> LATIN SMALL LETTER O WITH GRAVE + '\xf3' # 0xF3 -> LATIN SMALL LETTER O WITH ACUTE + '\xf4' # 0xF4 -> LATIN SMALL LETTER O WITH CIRCUMFLEX + '\xf5' # 0xF5 -> LATIN SMALL LETTER O WITH TILDE + '\xf6' # 0xF6 -> LATIN SMALL LETTER O WITH DIAERESIS + '\xf7' # 0xF7 -> DIVISION SIGN + '\xf8' # 0xF8 -> LATIN SMALL LETTER O WITH STROKE + '\xf9' # 0xF9 -> LATIN SMALL LETTER U WITH GRAVE + '\xfa' # 0xFA -> LATIN SMALL LETTER U WITH ACUTE + '\xfb' # 0xFB -> LATIN SMALL LETTER U WITH CIRCUMFLEX + '\xfc' # 0xFC -> LATIN SMALL LETTER U WITH DIAERESIS + '\xfd' # 0xFD -> LATIN SMALL LETTER Y WITH ACUTE + '\xfe' # 0xFE -> LATIN SMALL LETTER THORN + '\xff' # 0xFF -> LATIN SMALL LETTER Y WITH DIAERESIS +) + +### Encoding table +encoding_table=codecs.charmap_build(decoding_table) diff --git a/env/Lib/encodings/cp1253.py b/env/Lib/encodings/cp1253.py new file mode 100644 index 0000000..ec9c097 --- /dev/null +++ b/env/Lib/encodings/cp1253.py @@ -0,0 +1,307 @@ +""" Python Character Mapping Codec cp1253 generated from 'MAPPINGS/VENDORS/MICSFT/WINDOWS/CP1253.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='cp1253', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) + + +### Decoding Table + +decoding_table = ( + '\x00' # 0x00 -> NULL + '\x01' # 0x01 -> START OF HEADING + '\x02' # 0x02 -> START OF TEXT + '\x03' # 0x03 -> END OF TEXT + '\x04' # 0x04 -> END OF TRANSMISSION + '\x05' # 0x05 -> ENQUIRY + '\x06' # 0x06 -> ACKNOWLEDGE + '\x07' # 0x07 -> BELL + '\x08' # 0x08 -> BACKSPACE + '\t' # 0x09 -> HORIZONTAL TABULATION + '\n' # 0x0A -> LINE FEED + '\x0b' # 0x0B -> VERTICAL TABULATION + '\x0c' # 0x0C -> FORM FEED + '\r' # 0x0D -> CARRIAGE RETURN + '\x0e' # 0x0E -> SHIFT OUT + '\x0f' # 0x0F -> SHIFT IN + '\x10' # 0x10 -> DATA LINK ESCAPE + '\x11' # 0x11 -> DEVICE CONTROL ONE + '\x12' # 0x12 -> DEVICE CONTROL TWO + '\x13' # 0x13 -> DEVICE CONTROL THREE + '\x14' # 0x14 -> DEVICE CONTROL FOUR + '\x15' # 0x15 -> NEGATIVE ACKNOWLEDGE + '\x16' # 0x16 -> SYNCHRONOUS IDLE + '\x17' # 0x17 -> END OF TRANSMISSION BLOCK + '\x18' # 0x18 -> CANCEL + '\x19' # 0x19 -> END OF MEDIUM + '\x1a' # 0x1A -> SUBSTITUTE + '\x1b' # 0x1B -> ESCAPE + '\x1c' # 0x1C -> FILE SEPARATOR + '\x1d' # 0x1D -> GROUP SEPARATOR + '\x1e' # 0x1E -> RECORD SEPARATOR + '\x1f' # 0x1F -> UNIT SEPARATOR + ' ' # 0x20 -> SPACE + '!' # 0x21 -> EXCLAMATION MARK + '"' # 0x22 -> QUOTATION MARK + '#' # 0x23 -> NUMBER SIGN + '$' # 0x24 -> DOLLAR SIGN + '%' # 0x25 -> PERCENT SIGN + '&' # 0x26 -> AMPERSAND + "'" # 0x27 -> APOSTROPHE + '(' # 0x28 -> LEFT PARENTHESIS + ')' # 0x29 -> RIGHT PARENTHESIS + '*' # 0x2A -> ASTERISK + '+' # 0x2B -> PLUS SIGN + ',' # 0x2C -> COMMA + '-' # 0x2D -> HYPHEN-MINUS + '.' # 0x2E -> FULL STOP + '/' # 0x2F -> SOLIDUS + '0' # 0x30 -> DIGIT ZERO + '1' # 0x31 -> DIGIT ONE + '2' # 0x32 -> DIGIT TWO + '3' # 0x33 -> DIGIT THREE + '4' # 0x34 -> DIGIT FOUR + '5' # 0x35 -> DIGIT FIVE + '6' # 0x36 -> DIGIT SIX + '7' # 0x37 -> DIGIT SEVEN + '8' # 0x38 -> DIGIT EIGHT + '9' # 0x39 -> DIGIT NINE + ':' # 0x3A -> COLON + ';' # 0x3B -> SEMICOLON + '<' # 0x3C -> LESS-THAN SIGN + '=' # 0x3D -> EQUALS SIGN + '>' # 0x3E -> GREATER-THAN SIGN + '?' # 0x3F -> QUESTION MARK + '@' # 0x40 -> COMMERCIAL AT + 'A' # 0x41 -> LATIN CAPITAL LETTER A + 'B' # 0x42 -> LATIN CAPITAL LETTER B + 'C' # 0x43 -> LATIN CAPITAL LETTER C + 'D' # 0x44 -> LATIN CAPITAL LETTER D + 'E' # 0x45 -> LATIN CAPITAL LETTER E + 'F' # 0x46 -> LATIN CAPITAL LETTER F + 'G' # 0x47 -> LATIN CAPITAL LETTER G + 'H' # 0x48 -> LATIN CAPITAL LETTER H + 'I' # 0x49 -> LATIN CAPITAL LETTER I + 'J' # 0x4A -> LATIN CAPITAL LETTER J + 'K' # 0x4B -> LATIN CAPITAL LETTER K + 'L' # 0x4C -> LATIN CAPITAL LETTER L + 'M' # 0x4D -> LATIN CAPITAL LETTER M + 'N' # 0x4E -> LATIN CAPITAL LETTER N + 'O' # 0x4F -> LATIN CAPITAL LETTER O + 'P' # 0x50 -> LATIN CAPITAL LETTER P + 'Q' # 0x51 -> LATIN CAPITAL LETTER Q + 'R' # 0x52 -> LATIN CAPITAL LETTER R + 'S' # 0x53 -> LATIN CAPITAL LETTER S + 'T' # 0x54 -> LATIN CAPITAL LETTER T + 'U' # 0x55 -> LATIN CAPITAL LETTER U + 'V' # 0x56 -> LATIN CAPITAL LETTER V + 'W' # 0x57 -> LATIN CAPITAL LETTER W + 'X' # 0x58 -> LATIN CAPITAL LETTER X + 'Y' # 0x59 -> LATIN CAPITAL LETTER Y + 'Z' # 0x5A -> LATIN CAPITAL LETTER Z + '[' # 0x5B -> LEFT SQUARE BRACKET + '\\' # 0x5C -> REVERSE SOLIDUS + ']' # 0x5D -> RIGHT SQUARE BRACKET + '^' # 0x5E -> CIRCUMFLEX ACCENT + '_' # 0x5F -> LOW LINE + '`' # 0x60 -> GRAVE ACCENT + 'a' # 0x61 -> LATIN SMALL LETTER A + 'b' # 0x62 -> LATIN SMALL LETTER B + 'c' # 0x63 -> LATIN SMALL LETTER C + 'd' # 0x64 -> LATIN SMALL LETTER D + 'e' # 0x65 -> LATIN SMALL LETTER E + 'f' # 0x66 -> LATIN SMALL LETTER F + 'g' # 0x67 -> LATIN SMALL LETTER G + 'h' # 0x68 -> LATIN SMALL LETTER H + 'i' # 0x69 -> LATIN SMALL LETTER I + 'j' # 0x6A -> LATIN SMALL LETTER J + 'k' # 0x6B -> LATIN SMALL LETTER K + 'l' # 0x6C -> LATIN SMALL LETTER L + 'm' # 0x6D -> LATIN SMALL LETTER M + 'n' # 0x6E -> LATIN SMALL LETTER N + 'o' # 0x6F -> LATIN SMALL LETTER O + 'p' # 0x70 -> LATIN SMALL LETTER P + 'q' # 0x71 -> LATIN SMALL LETTER Q + 'r' # 0x72 -> LATIN SMALL LETTER R + 's' # 0x73 -> LATIN SMALL LETTER S + 't' # 0x74 -> LATIN SMALL LETTER T + 'u' # 0x75 -> LATIN SMALL LETTER U + 'v' # 0x76 -> LATIN SMALL LETTER V + 'w' # 0x77 -> LATIN SMALL LETTER W + 'x' # 0x78 -> LATIN SMALL LETTER X + 'y' # 0x79 -> LATIN SMALL LETTER Y + 'z' # 0x7A -> LATIN SMALL LETTER Z + '{' # 0x7B -> LEFT CURLY BRACKET + '|' # 0x7C -> VERTICAL LINE + '}' # 0x7D -> RIGHT CURLY BRACKET + '~' # 0x7E -> TILDE + '\x7f' # 0x7F -> DELETE + '\u20ac' # 0x80 -> EURO SIGN + '\ufffe' # 0x81 -> UNDEFINED + '\u201a' # 0x82 -> SINGLE LOW-9 QUOTATION MARK + '\u0192' # 0x83 -> LATIN SMALL LETTER F WITH HOOK + '\u201e' # 0x84 -> DOUBLE LOW-9 QUOTATION MARK + '\u2026' # 0x85 -> HORIZONTAL ELLIPSIS + '\u2020' # 0x86 -> DAGGER + '\u2021' # 0x87 -> DOUBLE DAGGER + '\ufffe' # 0x88 -> UNDEFINED + '\u2030' # 0x89 -> PER MILLE SIGN + '\ufffe' # 0x8A -> UNDEFINED + '\u2039' # 0x8B -> SINGLE LEFT-POINTING ANGLE QUOTATION MARK + '\ufffe' # 0x8C -> UNDEFINED + '\ufffe' # 0x8D -> UNDEFINED + '\ufffe' # 0x8E -> UNDEFINED + '\ufffe' # 0x8F -> UNDEFINED + '\ufffe' # 0x90 -> UNDEFINED + '\u2018' # 0x91 -> LEFT SINGLE QUOTATION MARK + '\u2019' # 0x92 -> RIGHT SINGLE QUOTATION MARK + '\u201c' # 0x93 -> LEFT DOUBLE QUOTATION MARK + '\u201d' # 0x94 -> RIGHT DOUBLE QUOTATION MARK + '\u2022' # 0x95 -> BULLET + '\u2013' # 0x96 -> EN DASH + '\u2014' # 0x97 -> EM DASH + '\ufffe' # 0x98 -> UNDEFINED + '\u2122' # 0x99 -> TRADE MARK SIGN + '\ufffe' # 0x9A -> UNDEFINED + '\u203a' # 0x9B -> SINGLE RIGHT-POINTING ANGLE QUOTATION MARK + '\ufffe' # 0x9C -> UNDEFINED + '\ufffe' # 0x9D -> UNDEFINED + '\ufffe' # 0x9E -> UNDEFINED + '\ufffe' # 0x9F -> UNDEFINED + '\xa0' # 0xA0 -> NO-BREAK SPACE + '\u0385' # 0xA1 -> GREEK DIALYTIKA TONOS + '\u0386' # 0xA2 -> GREEK CAPITAL LETTER ALPHA WITH TONOS + '\xa3' # 0xA3 -> POUND SIGN + '\xa4' # 0xA4 -> CURRENCY SIGN + '\xa5' # 0xA5 -> YEN SIGN + '\xa6' # 0xA6 -> BROKEN BAR + '\xa7' # 0xA7 -> SECTION SIGN + '\xa8' # 0xA8 -> DIAERESIS + '\xa9' # 0xA9 -> COPYRIGHT SIGN + '\ufffe' # 0xAA -> UNDEFINED + '\xab' # 0xAB -> LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + '\xac' # 0xAC -> NOT SIGN + '\xad' # 0xAD -> SOFT HYPHEN + '\xae' # 0xAE -> REGISTERED SIGN + '\u2015' # 0xAF -> HORIZONTAL BAR + '\xb0' # 0xB0 -> DEGREE SIGN + '\xb1' # 0xB1 -> PLUS-MINUS SIGN + '\xb2' # 0xB2 -> SUPERSCRIPT TWO + '\xb3' # 0xB3 -> SUPERSCRIPT THREE + '\u0384' # 0xB4 -> GREEK TONOS + '\xb5' # 0xB5 -> MICRO SIGN + '\xb6' # 0xB6 -> PILCROW SIGN + '\xb7' # 0xB7 -> MIDDLE DOT + '\u0388' # 0xB8 -> GREEK CAPITAL LETTER EPSILON WITH TONOS + '\u0389' # 0xB9 -> GREEK CAPITAL LETTER ETA WITH TONOS + '\u038a' # 0xBA -> GREEK CAPITAL LETTER IOTA WITH TONOS + '\xbb' # 0xBB -> RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + '\u038c' # 0xBC -> GREEK CAPITAL LETTER OMICRON WITH TONOS + '\xbd' # 0xBD -> VULGAR FRACTION ONE HALF + '\u038e' # 0xBE -> GREEK CAPITAL LETTER UPSILON WITH TONOS + '\u038f' # 0xBF -> GREEK CAPITAL LETTER OMEGA WITH TONOS + '\u0390' # 0xC0 -> GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS + '\u0391' # 0xC1 -> GREEK CAPITAL LETTER ALPHA + '\u0392' # 0xC2 -> GREEK CAPITAL LETTER BETA + '\u0393' # 0xC3 -> GREEK CAPITAL LETTER GAMMA + '\u0394' # 0xC4 -> GREEK CAPITAL LETTER DELTA + '\u0395' # 0xC5 -> GREEK CAPITAL LETTER EPSILON + '\u0396' # 0xC6 -> GREEK CAPITAL LETTER ZETA + '\u0397' # 0xC7 -> GREEK CAPITAL LETTER ETA + '\u0398' # 0xC8 -> GREEK CAPITAL LETTER THETA + '\u0399' # 0xC9 -> GREEK CAPITAL LETTER IOTA + '\u039a' # 0xCA -> GREEK CAPITAL LETTER KAPPA + '\u039b' # 0xCB -> GREEK CAPITAL LETTER LAMDA + '\u039c' # 0xCC -> GREEK CAPITAL LETTER MU + '\u039d' # 0xCD -> GREEK CAPITAL LETTER NU + '\u039e' # 0xCE -> GREEK CAPITAL LETTER XI + '\u039f' # 0xCF -> GREEK CAPITAL LETTER OMICRON + '\u03a0' # 0xD0 -> GREEK CAPITAL LETTER PI + '\u03a1' # 0xD1 -> GREEK CAPITAL LETTER RHO + '\ufffe' # 0xD2 -> UNDEFINED + '\u03a3' # 0xD3 -> GREEK CAPITAL LETTER SIGMA + '\u03a4' # 0xD4 -> GREEK CAPITAL LETTER TAU + '\u03a5' # 0xD5 -> GREEK CAPITAL LETTER UPSILON + '\u03a6' # 0xD6 -> GREEK CAPITAL LETTER PHI + '\u03a7' # 0xD7 -> GREEK CAPITAL LETTER CHI + '\u03a8' # 0xD8 -> GREEK CAPITAL LETTER PSI + '\u03a9' # 0xD9 -> GREEK CAPITAL LETTER OMEGA + '\u03aa' # 0xDA -> GREEK CAPITAL LETTER IOTA WITH DIALYTIKA + '\u03ab' # 0xDB -> GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA + '\u03ac' # 0xDC -> GREEK SMALL LETTER ALPHA WITH TONOS + '\u03ad' # 0xDD -> GREEK SMALL LETTER EPSILON WITH TONOS + '\u03ae' # 0xDE -> GREEK SMALL LETTER ETA WITH TONOS + '\u03af' # 0xDF -> GREEK SMALL LETTER IOTA WITH TONOS + '\u03b0' # 0xE0 -> GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS + '\u03b1' # 0xE1 -> GREEK SMALL LETTER ALPHA + '\u03b2' # 0xE2 -> GREEK SMALL LETTER BETA + '\u03b3' # 0xE3 -> GREEK SMALL LETTER GAMMA + '\u03b4' # 0xE4 -> GREEK SMALL LETTER DELTA + '\u03b5' # 0xE5 -> GREEK SMALL LETTER EPSILON + '\u03b6' # 0xE6 -> GREEK SMALL LETTER ZETA + '\u03b7' # 0xE7 -> GREEK SMALL LETTER ETA + '\u03b8' # 0xE8 -> GREEK SMALL LETTER THETA + '\u03b9' # 0xE9 -> GREEK SMALL LETTER IOTA + '\u03ba' # 0xEA -> GREEK SMALL LETTER KAPPA + '\u03bb' # 0xEB -> GREEK SMALL LETTER LAMDA + '\u03bc' # 0xEC -> GREEK SMALL LETTER MU + '\u03bd' # 0xED -> GREEK SMALL LETTER NU + '\u03be' # 0xEE -> GREEK SMALL LETTER XI + '\u03bf' # 0xEF -> GREEK SMALL LETTER OMICRON + '\u03c0' # 0xF0 -> GREEK SMALL LETTER PI + '\u03c1' # 0xF1 -> GREEK SMALL LETTER RHO + '\u03c2' # 0xF2 -> GREEK SMALL LETTER FINAL SIGMA + '\u03c3' # 0xF3 -> GREEK SMALL LETTER SIGMA + '\u03c4' # 0xF4 -> GREEK SMALL LETTER TAU + '\u03c5' # 0xF5 -> GREEK SMALL LETTER UPSILON + '\u03c6' # 0xF6 -> GREEK SMALL LETTER PHI + '\u03c7' # 0xF7 -> GREEK SMALL LETTER CHI + '\u03c8' # 0xF8 -> GREEK SMALL LETTER PSI + '\u03c9' # 0xF9 -> GREEK SMALL LETTER OMEGA + '\u03ca' # 0xFA -> GREEK SMALL LETTER IOTA WITH DIALYTIKA + '\u03cb' # 0xFB -> GREEK SMALL LETTER UPSILON WITH DIALYTIKA + '\u03cc' # 0xFC -> GREEK SMALL LETTER OMICRON WITH TONOS + '\u03cd' # 0xFD -> GREEK SMALL LETTER UPSILON WITH TONOS + '\u03ce' # 0xFE -> GREEK SMALL LETTER OMEGA WITH TONOS + '\ufffe' # 0xFF -> UNDEFINED +) + +### Encoding table +encoding_table=codecs.charmap_build(decoding_table) diff --git a/env/Lib/encodings/cp1254.py b/env/Lib/encodings/cp1254.py new file mode 100644 index 0000000..4912327 --- /dev/null +++ b/env/Lib/encodings/cp1254.py @@ -0,0 +1,307 @@ +""" Python Character Mapping Codec cp1254 generated from 'MAPPINGS/VENDORS/MICSFT/WINDOWS/CP1254.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='cp1254', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) + + +### Decoding Table + +decoding_table = ( + '\x00' # 0x00 -> NULL + '\x01' # 0x01 -> START OF HEADING + '\x02' # 0x02 -> START OF TEXT + '\x03' # 0x03 -> END OF TEXT + '\x04' # 0x04 -> END OF TRANSMISSION + '\x05' # 0x05 -> ENQUIRY + '\x06' # 0x06 -> ACKNOWLEDGE + '\x07' # 0x07 -> BELL + '\x08' # 0x08 -> BACKSPACE + '\t' # 0x09 -> HORIZONTAL TABULATION + '\n' # 0x0A -> LINE FEED + '\x0b' # 0x0B -> VERTICAL TABULATION + '\x0c' # 0x0C -> FORM FEED + '\r' # 0x0D -> CARRIAGE RETURN + '\x0e' # 0x0E -> SHIFT OUT + '\x0f' # 0x0F -> SHIFT IN + '\x10' # 0x10 -> DATA LINK ESCAPE + '\x11' # 0x11 -> DEVICE CONTROL ONE + '\x12' # 0x12 -> DEVICE CONTROL TWO + '\x13' # 0x13 -> DEVICE CONTROL THREE + '\x14' # 0x14 -> DEVICE CONTROL FOUR + '\x15' # 0x15 -> NEGATIVE ACKNOWLEDGE + '\x16' # 0x16 -> SYNCHRONOUS IDLE + '\x17' # 0x17 -> END OF TRANSMISSION BLOCK + '\x18' # 0x18 -> CANCEL + '\x19' # 0x19 -> END OF MEDIUM + '\x1a' # 0x1A -> SUBSTITUTE + '\x1b' # 0x1B -> ESCAPE + '\x1c' # 0x1C -> FILE SEPARATOR + '\x1d' # 0x1D -> GROUP SEPARATOR + '\x1e' # 0x1E -> RECORD SEPARATOR + '\x1f' # 0x1F -> UNIT SEPARATOR + ' ' # 0x20 -> SPACE + '!' # 0x21 -> EXCLAMATION MARK + '"' # 0x22 -> QUOTATION MARK + '#' # 0x23 -> NUMBER SIGN + '$' # 0x24 -> DOLLAR SIGN + '%' # 0x25 -> PERCENT SIGN + '&' # 0x26 -> AMPERSAND + "'" # 0x27 -> APOSTROPHE + '(' # 0x28 -> LEFT PARENTHESIS + ')' # 0x29 -> RIGHT PARENTHESIS + '*' # 0x2A -> ASTERISK + '+' # 0x2B -> PLUS SIGN + ',' # 0x2C -> COMMA + '-' # 0x2D -> HYPHEN-MINUS + '.' # 0x2E -> FULL STOP + '/' # 0x2F -> SOLIDUS + '0' # 0x30 -> DIGIT ZERO + '1' # 0x31 -> DIGIT ONE + '2' # 0x32 -> DIGIT TWO + '3' # 0x33 -> DIGIT THREE + '4' # 0x34 -> DIGIT FOUR + '5' # 0x35 -> DIGIT FIVE + '6' # 0x36 -> DIGIT SIX + '7' # 0x37 -> DIGIT SEVEN + '8' # 0x38 -> DIGIT EIGHT + '9' # 0x39 -> DIGIT NINE + ':' # 0x3A -> COLON + ';' # 0x3B -> SEMICOLON + '<' # 0x3C -> LESS-THAN SIGN + '=' # 0x3D -> EQUALS SIGN + '>' # 0x3E -> GREATER-THAN SIGN + '?' # 0x3F -> QUESTION MARK + '@' # 0x40 -> COMMERCIAL AT + 'A' # 0x41 -> LATIN CAPITAL LETTER A + 'B' # 0x42 -> LATIN CAPITAL LETTER B + 'C' # 0x43 -> LATIN CAPITAL LETTER C + 'D' # 0x44 -> LATIN CAPITAL LETTER D + 'E' # 0x45 -> LATIN CAPITAL LETTER E + 'F' # 0x46 -> LATIN CAPITAL LETTER F + 'G' # 0x47 -> LATIN CAPITAL LETTER G + 'H' # 0x48 -> LATIN CAPITAL LETTER H + 'I' # 0x49 -> LATIN CAPITAL LETTER I + 'J' # 0x4A -> LATIN CAPITAL LETTER J + 'K' # 0x4B -> LATIN CAPITAL LETTER K + 'L' # 0x4C -> LATIN CAPITAL LETTER L + 'M' # 0x4D -> LATIN CAPITAL LETTER M + 'N' # 0x4E -> LATIN CAPITAL LETTER N + 'O' # 0x4F -> LATIN CAPITAL LETTER O + 'P' # 0x50 -> LATIN CAPITAL LETTER P + 'Q' # 0x51 -> LATIN CAPITAL LETTER Q + 'R' # 0x52 -> LATIN CAPITAL LETTER R + 'S' # 0x53 -> LATIN CAPITAL LETTER S + 'T' # 0x54 -> LATIN CAPITAL LETTER T + 'U' # 0x55 -> LATIN CAPITAL LETTER U + 'V' # 0x56 -> LATIN CAPITAL LETTER V + 'W' # 0x57 -> LATIN CAPITAL LETTER W + 'X' # 0x58 -> LATIN CAPITAL LETTER X + 'Y' # 0x59 -> LATIN CAPITAL LETTER Y + 'Z' # 0x5A -> LATIN CAPITAL LETTER Z + '[' # 0x5B -> LEFT SQUARE BRACKET + '\\' # 0x5C -> REVERSE SOLIDUS + ']' # 0x5D -> RIGHT SQUARE BRACKET + '^' # 0x5E -> CIRCUMFLEX ACCENT + '_' # 0x5F -> LOW LINE + '`' # 0x60 -> GRAVE ACCENT + 'a' # 0x61 -> LATIN SMALL LETTER A + 'b' # 0x62 -> LATIN SMALL LETTER B + 'c' # 0x63 -> LATIN SMALL LETTER C + 'd' # 0x64 -> LATIN SMALL LETTER D + 'e' # 0x65 -> LATIN SMALL LETTER E + 'f' # 0x66 -> LATIN SMALL LETTER F + 'g' # 0x67 -> LATIN SMALL LETTER G + 'h' # 0x68 -> LATIN SMALL LETTER H + 'i' # 0x69 -> LATIN SMALL LETTER I + 'j' # 0x6A -> LATIN SMALL LETTER J + 'k' # 0x6B -> LATIN SMALL LETTER K + 'l' # 0x6C -> LATIN SMALL LETTER L + 'm' # 0x6D -> LATIN SMALL LETTER M + 'n' # 0x6E -> LATIN SMALL LETTER N + 'o' # 0x6F -> LATIN SMALL LETTER O + 'p' # 0x70 -> LATIN SMALL LETTER P + 'q' # 0x71 -> LATIN SMALL LETTER Q + 'r' # 0x72 -> LATIN SMALL LETTER R + 's' # 0x73 -> LATIN SMALL LETTER S + 't' # 0x74 -> LATIN SMALL LETTER T + 'u' # 0x75 -> LATIN SMALL LETTER U + 'v' # 0x76 -> LATIN SMALL LETTER V + 'w' # 0x77 -> LATIN SMALL LETTER W + 'x' # 0x78 -> LATIN SMALL LETTER X + 'y' # 0x79 -> LATIN SMALL LETTER Y + 'z' # 0x7A -> LATIN SMALL LETTER Z + '{' # 0x7B -> LEFT CURLY BRACKET + '|' # 0x7C -> VERTICAL LINE + '}' # 0x7D -> RIGHT CURLY BRACKET + '~' # 0x7E -> TILDE + '\x7f' # 0x7F -> DELETE + '\u20ac' # 0x80 -> EURO SIGN + '\ufffe' # 0x81 -> UNDEFINED + '\u201a' # 0x82 -> SINGLE LOW-9 QUOTATION MARK + '\u0192' # 0x83 -> LATIN SMALL LETTER F WITH HOOK + '\u201e' # 0x84 -> DOUBLE LOW-9 QUOTATION MARK + '\u2026' # 0x85 -> HORIZONTAL ELLIPSIS + '\u2020' # 0x86 -> DAGGER + '\u2021' # 0x87 -> DOUBLE DAGGER + '\u02c6' # 0x88 -> MODIFIER LETTER CIRCUMFLEX ACCENT + '\u2030' # 0x89 -> PER MILLE SIGN + '\u0160' # 0x8A -> LATIN CAPITAL LETTER S WITH CARON + '\u2039' # 0x8B -> SINGLE LEFT-POINTING ANGLE QUOTATION MARK + '\u0152' # 0x8C -> LATIN CAPITAL LIGATURE OE + '\ufffe' # 0x8D -> UNDEFINED + '\ufffe' # 0x8E -> UNDEFINED + '\ufffe' # 0x8F -> UNDEFINED + '\ufffe' # 0x90 -> UNDEFINED + '\u2018' # 0x91 -> LEFT SINGLE QUOTATION MARK + '\u2019' # 0x92 -> RIGHT SINGLE QUOTATION MARK + '\u201c' # 0x93 -> LEFT DOUBLE QUOTATION MARK + '\u201d' # 0x94 -> RIGHT DOUBLE QUOTATION MARK + '\u2022' # 0x95 -> BULLET + '\u2013' # 0x96 -> EN DASH + '\u2014' # 0x97 -> EM DASH + '\u02dc' # 0x98 -> SMALL TILDE + '\u2122' # 0x99 -> TRADE MARK SIGN + '\u0161' # 0x9A -> LATIN SMALL LETTER S WITH CARON + '\u203a' # 0x9B -> SINGLE RIGHT-POINTING ANGLE QUOTATION MARK + '\u0153' # 0x9C -> LATIN SMALL LIGATURE OE + '\ufffe' # 0x9D -> UNDEFINED + '\ufffe' # 0x9E -> UNDEFINED + '\u0178' # 0x9F -> LATIN CAPITAL LETTER Y WITH DIAERESIS + '\xa0' # 0xA0 -> NO-BREAK SPACE + '\xa1' # 0xA1 -> INVERTED EXCLAMATION MARK + '\xa2' # 0xA2 -> CENT SIGN + '\xa3' # 0xA3 -> POUND SIGN + '\xa4' # 0xA4 -> CURRENCY SIGN + '\xa5' # 0xA5 -> YEN SIGN + '\xa6' # 0xA6 -> BROKEN BAR + '\xa7' # 0xA7 -> SECTION SIGN + '\xa8' # 0xA8 -> DIAERESIS + '\xa9' # 0xA9 -> COPYRIGHT SIGN + '\xaa' # 0xAA -> FEMININE ORDINAL INDICATOR + '\xab' # 0xAB -> LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + '\xac' # 0xAC -> NOT SIGN + '\xad' # 0xAD -> SOFT HYPHEN + '\xae' # 0xAE -> REGISTERED SIGN + '\xaf' # 0xAF -> MACRON + '\xb0' # 0xB0 -> DEGREE SIGN + '\xb1' # 0xB1 -> PLUS-MINUS SIGN + '\xb2' # 0xB2 -> SUPERSCRIPT TWO + '\xb3' # 0xB3 -> SUPERSCRIPT THREE + '\xb4' # 0xB4 -> ACUTE ACCENT + '\xb5' # 0xB5 -> MICRO SIGN + '\xb6' # 0xB6 -> PILCROW SIGN + '\xb7' # 0xB7 -> MIDDLE DOT + '\xb8' # 0xB8 -> CEDILLA + '\xb9' # 0xB9 -> SUPERSCRIPT ONE + '\xba' # 0xBA -> MASCULINE ORDINAL INDICATOR + '\xbb' # 0xBB -> RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + '\xbc' # 0xBC -> VULGAR FRACTION ONE QUARTER + '\xbd' # 0xBD -> VULGAR FRACTION ONE HALF + '\xbe' # 0xBE -> VULGAR FRACTION THREE QUARTERS + '\xbf' # 0xBF -> INVERTED QUESTION MARK + '\xc0' # 0xC0 -> LATIN CAPITAL LETTER A WITH GRAVE + '\xc1' # 0xC1 -> LATIN CAPITAL LETTER A WITH ACUTE + '\xc2' # 0xC2 -> LATIN CAPITAL LETTER A WITH CIRCUMFLEX + '\xc3' # 0xC3 -> LATIN CAPITAL LETTER A WITH TILDE + '\xc4' # 0xC4 -> LATIN CAPITAL LETTER A WITH DIAERESIS + '\xc5' # 0xC5 -> LATIN CAPITAL LETTER A WITH RING ABOVE + '\xc6' # 0xC6 -> LATIN CAPITAL LETTER AE + '\xc7' # 0xC7 -> LATIN CAPITAL LETTER C WITH CEDILLA + '\xc8' # 0xC8 -> LATIN CAPITAL LETTER E WITH GRAVE + '\xc9' # 0xC9 -> LATIN CAPITAL LETTER E WITH ACUTE + '\xca' # 0xCA -> LATIN CAPITAL LETTER E WITH CIRCUMFLEX + '\xcb' # 0xCB -> LATIN CAPITAL LETTER E WITH DIAERESIS + '\xcc' # 0xCC -> LATIN CAPITAL LETTER I WITH GRAVE + '\xcd' # 0xCD -> LATIN CAPITAL LETTER I WITH ACUTE + '\xce' # 0xCE -> LATIN CAPITAL LETTER I WITH CIRCUMFLEX + '\xcf' # 0xCF -> LATIN CAPITAL LETTER I WITH DIAERESIS + '\u011e' # 0xD0 -> LATIN CAPITAL LETTER G WITH BREVE + '\xd1' # 0xD1 -> LATIN CAPITAL LETTER N WITH TILDE + '\xd2' # 0xD2 -> LATIN CAPITAL LETTER O WITH GRAVE + '\xd3' # 0xD3 -> LATIN CAPITAL LETTER O WITH ACUTE + '\xd4' # 0xD4 -> LATIN CAPITAL LETTER O WITH CIRCUMFLEX + '\xd5' # 0xD5 -> LATIN CAPITAL LETTER O WITH TILDE + '\xd6' # 0xD6 -> LATIN CAPITAL LETTER O WITH DIAERESIS + '\xd7' # 0xD7 -> MULTIPLICATION SIGN + '\xd8' # 0xD8 -> LATIN CAPITAL LETTER O WITH STROKE + '\xd9' # 0xD9 -> LATIN CAPITAL LETTER U WITH GRAVE + '\xda' # 0xDA -> LATIN CAPITAL LETTER U WITH ACUTE + '\xdb' # 0xDB -> LATIN CAPITAL LETTER U WITH CIRCUMFLEX + '\xdc' # 0xDC -> LATIN CAPITAL LETTER U WITH DIAERESIS + '\u0130' # 0xDD -> LATIN CAPITAL LETTER I WITH DOT ABOVE + '\u015e' # 0xDE -> LATIN CAPITAL LETTER S WITH CEDILLA + '\xdf' # 0xDF -> LATIN SMALL LETTER SHARP S + '\xe0' # 0xE0 -> LATIN SMALL LETTER A WITH GRAVE + '\xe1' # 0xE1 -> LATIN SMALL LETTER A WITH ACUTE + '\xe2' # 0xE2 -> LATIN SMALL LETTER A WITH CIRCUMFLEX + '\xe3' # 0xE3 -> LATIN SMALL LETTER A WITH TILDE + '\xe4' # 0xE4 -> LATIN SMALL LETTER A WITH DIAERESIS + '\xe5' # 0xE5 -> LATIN SMALL LETTER A WITH RING ABOVE + '\xe6' # 0xE6 -> LATIN SMALL LETTER AE + '\xe7' # 0xE7 -> LATIN SMALL LETTER C WITH CEDILLA + '\xe8' # 0xE8 -> LATIN SMALL LETTER E WITH GRAVE + '\xe9' # 0xE9 -> LATIN SMALL LETTER E WITH ACUTE + '\xea' # 0xEA -> LATIN SMALL LETTER E WITH CIRCUMFLEX + '\xeb' # 0xEB -> LATIN SMALL LETTER E WITH DIAERESIS + '\xec' # 0xEC -> LATIN SMALL LETTER I WITH GRAVE + '\xed' # 0xED -> LATIN SMALL LETTER I WITH ACUTE + '\xee' # 0xEE -> LATIN SMALL LETTER I WITH CIRCUMFLEX + '\xef' # 0xEF -> LATIN SMALL LETTER I WITH DIAERESIS + '\u011f' # 0xF0 -> LATIN SMALL LETTER G WITH BREVE + '\xf1' # 0xF1 -> LATIN SMALL LETTER N WITH TILDE + '\xf2' # 0xF2 -> LATIN SMALL LETTER O WITH GRAVE + '\xf3' # 0xF3 -> LATIN SMALL LETTER O WITH ACUTE + '\xf4' # 0xF4 -> LATIN SMALL LETTER O WITH CIRCUMFLEX + '\xf5' # 0xF5 -> LATIN SMALL LETTER O WITH TILDE + '\xf6' # 0xF6 -> LATIN SMALL LETTER O WITH DIAERESIS + '\xf7' # 0xF7 -> DIVISION SIGN + '\xf8' # 0xF8 -> LATIN SMALL LETTER O WITH STROKE + '\xf9' # 0xF9 -> LATIN SMALL LETTER U WITH GRAVE + '\xfa' # 0xFA -> LATIN SMALL LETTER U WITH ACUTE + '\xfb' # 0xFB -> LATIN SMALL LETTER U WITH CIRCUMFLEX + '\xfc' # 0xFC -> LATIN SMALL LETTER U WITH DIAERESIS + '\u0131' # 0xFD -> LATIN SMALL LETTER DOTLESS I + '\u015f' # 0xFE -> LATIN SMALL LETTER S WITH CEDILLA + '\xff' # 0xFF -> LATIN SMALL LETTER Y WITH DIAERESIS +) + +### Encoding table +encoding_table=codecs.charmap_build(decoding_table) diff --git a/env/Lib/encodings/cp1255.py b/env/Lib/encodings/cp1255.py new file mode 100644 index 0000000..91ce26b --- /dev/null +++ b/env/Lib/encodings/cp1255.py @@ -0,0 +1,307 @@ +""" Python Character Mapping Codec cp1255 generated from 'MAPPINGS/VENDORS/MICSFT/WINDOWS/CP1255.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='cp1255', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) + + +### Decoding Table + +decoding_table = ( + '\x00' # 0x00 -> NULL + '\x01' # 0x01 -> START OF HEADING + '\x02' # 0x02 -> START OF TEXT + '\x03' # 0x03 -> END OF TEXT + '\x04' # 0x04 -> END OF TRANSMISSION + '\x05' # 0x05 -> ENQUIRY + '\x06' # 0x06 -> ACKNOWLEDGE + '\x07' # 0x07 -> BELL + '\x08' # 0x08 -> BACKSPACE + '\t' # 0x09 -> HORIZONTAL TABULATION + '\n' # 0x0A -> LINE FEED + '\x0b' # 0x0B -> VERTICAL TABULATION + '\x0c' # 0x0C -> FORM FEED + '\r' # 0x0D -> CARRIAGE RETURN + '\x0e' # 0x0E -> SHIFT OUT + '\x0f' # 0x0F -> SHIFT IN + '\x10' # 0x10 -> DATA LINK ESCAPE + '\x11' # 0x11 -> DEVICE CONTROL ONE + '\x12' # 0x12 -> DEVICE CONTROL TWO + '\x13' # 0x13 -> DEVICE CONTROL THREE + '\x14' # 0x14 -> DEVICE CONTROL FOUR + '\x15' # 0x15 -> NEGATIVE ACKNOWLEDGE + '\x16' # 0x16 -> SYNCHRONOUS IDLE + '\x17' # 0x17 -> END OF TRANSMISSION BLOCK + '\x18' # 0x18 -> CANCEL + '\x19' # 0x19 -> END OF MEDIUM + '\x1a' # 0x1A -> SUBSTITUTE + '\x1b' # 0x1B -> ESCAPE + '\x1c' # 0x1C -> FILE SEPARATOR + '\x1d' # 0x1D -> GROUP SEPARATOR + '\x1e' # 0x1E -> RECORD SEPARATOR + '\x1f' # 0x1F -> UNIT SEPARATOR + ' ' # 0x20 -> SPACE + '!' # 0x21 -> EXCLAMATION MARK + '"' # 0x22 -> QUOTATION MARK + '#' # 0x23 -> NUMBER SIGN + '$' # 0x24 -> DOLLAR SIGN + '%' # 0x25 -> PERCENT SIGN + '&' # 0x26 -> AMPERSAND + "'" # 0x27 -> APOSTROPHE + '(' # 0x28 -> LEFT PARENTHESIS + ')' # 0x29 -> RIGHT PARENTHESIS + '*' # 0x2A -> ASTERISK + '+' # 0x2B -> PLUS SIGN + ',' # 0x2C -> COMMA + '-' # 0x2D -> HYPHEN-MINUS + '.' # 0x2E -> FULL STOP + '/' # 0x2F -> SOLIDUS + '0' # 0x30 -> DIGIT ZERO + '1' # 0x31 -> DIGIT ONE + '2' # 0x32 -> DIGIT TWO + '3' # 0x33 -> DIGIT THREE + '4' # 0x34 -> DIGIT FOUR + '5' # 0x35 -> DIGIT FIVE + '6' # 0x36 -> DIGIT SIX + '7' # 0x37 -> DIGIT SEVEN + '8' # 0x38 -> DIGIT EIGHT + '9' # 0x39 -> DIGIT NINE + ':' # 0x3A -> COLON + ';' # 0x3B -> SEMICOLON + '<' # 0x3C -> LESS-THAN SIGN + '=' # 0x3D -> EQUALS SIGN + '>' # 0x3E -> GREATER-THAN SIGN + '?' # 0x3F -> QUESTION MARK + '@' # 0x40 -> COMMERCIAL AT + 'A' # 0x41 -> LATIN CAPITAL LETTER A + 'B' # 0x42 -> LATIN CAPITAL LETTER B + 'C' # 0x43 -> LATIN CAPITAL LETTER C + 'D' # 0x44 -> LATIN CAPITAL LETTER D + 'E' # 0x45 -> LATIN CAPITAL LETTER E + 'F' # 0x46 -> LATIN CAPITAL LETTER F + 'G' # 0x47 -> LATIN CAPITAL LETTER G + 'H' # 0x48 -> LATIN CAPITAL LETTER H + 'I' # 0x49 -> LATIN CAPITAL LETTER I + 'J' # 0x4A -> LATIN CAPITAL LETTER J + 'K' # 0x4B -> LATIN CAPITAL LETTER K + 'L' # 0x4C -> LATIN CAPITAL LETTER L + 'M' # 0x4D -> LATIN CAPITAL LETTER M + 'N' # 0x4E -> LATIN CAPITAL LETTER N + 'O' # 0x4F -> LATIN CAPITAL LETTER O + 'P' # 0x50 -> LATIN CAPITAL LETTER P + 'Q' # 0x51 -> LATIN CAPITAL LETTER Q + 'R' # 0x52 -> LATIN CAPITAL LETTER R + 'S' # 0x53 -> LATIN CAPITAL LETTER S + 'T' # 0x54 -> LATIN CAPITAL LETTER T + 'U' # 0x55 -> LATIN CAPITAL LETTER U + 'V' # 0x56 -> LATIN CAPITAL LETTER V + 'W' # 0x57 -> LATIN CAPITAL LETTER W + 'X' # 0x58 -> LATIN CAPITAL LETTER X + 'Y' # 0x59 -> LATIN CAPITAL LETTER Y + 'Z' # 0x5A -> LATIN CAPITAL LETTER Z + '[' # 0x5B -> LEFT SQUARE BRACKET + '\\' # 0x5C -> REVERSE SOLIDUS + ']' # 0x5D -> RIGHT SQUARE BRACKET + '^' # 0x5E -> CIRCUMFLEX ACCENT + '_' # 0x5F -> LOW LINE + '`' # 0x60 -> GRAVE ACCENT + 'a' # 0x61 -> LATIN SMALL LETTER A + 'b' # 0x62 -> LATIN SMALL LETTER B + 'c' # 0x63 -> LATIN SMALL LETTER C + 'd' # 0x64 -> LATIN SMALL LETTER D + 'e' # 0x65 -> LATIN SMALL LETTER E + 'f' # 0x66 -> LATIN SMALL LETTER F + 'g' # 0x67 -> LATIN SMALL LETTER G + 'h' # 0x68 -> LATIN SMALL LETTER H + 'i' # 0x69 -> LATIN SMALL LETTER I + 'j' # 0x6A -> LATIN SMALL LETTER J + 'k' # 0x6B -> LATIN SMALL LETTER K + 'l' # 0x6C -> LATIN SMALL LETTER L + 'm' # 0x6D -> LATIN SMALL LETTER M + 'n' # 0x6E -> LATIN SMALL LETTER N + 'o' # 0x6F -> LATIN SMALL LETTER O + 'p' # 0x70 -> LATIN SMALL LETTER P + 'q' # 0x71 -> LATIN SMALL LETTER Q + 'r' # 0x72 -> LATIN SMALL LETTER R + 's' # 0x73 -> LATIN SMALL LETTER S + 't' # 0x74 -> LATIN SMALL LETTER T + 'u' # 0x75 -> LATIN SMALL LETTER U + 'v' # 0x76 -> LATIN SMALL LETTER V + 'w' # 0x77 -> LATIN SMALL LETTER W + 'x' # 0x78 -> LATIN SMALL LETTER X + 'y' # 0x79 -> LATIN SMALL LETTER Y + 'z' # 0x7A -> LATIN SMALL LETTER Z + '{' # 0x7B -> LEFT CURLY BRACKET + '|' # 0x7C -> VERTICAL LINE + '}' # 0x7D -> RIGHT CURLY BRACKET + '~' # 0x7E -> TILDE + '\x7f' # 0x7F -> DELETE + '\u20ac' # 0x80 -> EURO SIGN + '\ufffe' # 0x81 -> UNDEFINED + '\u201a' # 0x82 -> SINGLE LOW-9 QUOTATION MARK + '\u0192' # 0x83 -> LATIN SMALL LETTER F WITH HOOK + '\u201e' # 0x84 -> DOUBLE LOW-9 QUOTATION MARK + '\u2026' # 0x85 -> HORIZONTAL ELLIPSIS + '\u2020' # 0x86 -> DAGGER + '\u2021' # 0x87 -> DOUBLE DAGGER + '\u02c6' # 0x88 -> MODIFIER LETTER CIRCUMFLEX ACCENT + '\u2030' # 0x89 -> PER MILLE SIGN + '\ufffe' # 0x8A -> UNDEFINED + '\u2039' # 0x8B -> SINGLE LEFT-POINTING ANGLE QUOTATION MARK + '\ufffe' # 0x8C -> UNDEFINED + '\ufffe' # 0x8D -> UNDEFINED + '\ufffe' # 0x8E -> UNDEFINED + '\ufffe' # 0x8F -> UNDEFINED + '\ufffe' # 0x90 -> UNDEFINED + '\u2018' # 0x91 -> LEFT SINGLE QUOTATION MARK + '\u2019' # 0x92 -> RIGHT SINGLE QUOTATION MARK + '\u201c' # 0x93 -> LEFT DOUBLE QUOTATION MARK + '\u201d' # 0x94 -> RIGHT DOUBLE QUOTATION MARK + '\u2022' # 0x95 -> BULLET + '\u2013' # 0x96 -> EN DASH + '\u2014' # 0x97 -> EM DASH + '\u02dc' # 0x98 -> SMALL TILDE + '\u2122' # 0x99 -> TRADE MARK SIGN + '\ufffe' # 0x9A -> UNDEFINED + '\u203a' # 0x9B -> SINGLE RIGHT-POINTING ANGLE QUOTATION MARK + '\ufffe' # 0x9C -> UNDEFINED + '\ufffe' # 0x9D -> UNDEFINED + '\ufffe' # 0x9E -> UNDEFINED + '\ufffe' # 0x9F -> UNDEFINED + '\xa0' # 0xA0 -> NO-BREAK SPACE + '\xa1' # 0xA1 -> INVERTED EXCLAMATION MARK + '\xa2' # 0xA2 -> CENT SIGN + '\xa3' # 0xA3 -> POUND SIGN + '\u20aa' # 0xA4 -> NEW SHEQEL SIGN + '\xa5' # 0xA5 -> YEN SIGN + '\xa6' # 0xA6 -> BROKEN BAR + '\xa7' # 0xA7 -> SECTION SIGN + '\xa8' # 0xA8 -> DIAERESIS + '\xa9' # 0xA9 -> COPYRIGHT SIGN + '\xd7' # 0xAA -> MULTIPLICATION SIGN + '\xab' # 0xAB -> LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + '\xac' # 0xAC -> NOT SIGN + '\xad' # 0xAD -> SOFT HYPHEN + '\xae' # 0xAE -> REGISTERED SIGN + '\xaf' # 0xAF -> MACRON + '\xb0' # 0xB0 -> DEGREE SIGN + '\xb1' # 0xB1 -> PLUS-MINUS SIGN + '\xb2' # 0xB2 -> SUPERSCRIPT TWO + '\xb3' # 0xB3 -> SUPERSCRIPT THREE + '\xb4' # 0xB4 -> ACUTE ACCENT + '\xb5' # 0xB5 -> MICRO SIGN + '\xb6' # 0xB6 -> PILCROW SIGN + '\xb7' # 0xB7 -> MIDDLE DOT + '\xb8' # 0xB8 -> CEDILLA + '\xb9' # 0xB9 -> SUPERSCRIPT ONE + '\xf7' # 0xBA -> DIVISION SIGN + '\xbb' # 0xBB -> RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + '\xbc' # 0xBC -> VULGAR FRACTION ONE QUARTER + '\xbd' # 0xBD -> VULGAR FRACTION ONE HALF + '\xbe' # 0xBE -> VULGAR FRACTION THREE QUARTERS + '\xbf' # 0xBF -> INVERTED QUESTION MARK + '\u05b0' # 0xC0 -> HEBREW POINT SHEVA + '\u05b1' # 0xC1 -> HEBREW POINT HATAF SEGOL + '\u05b2' # 0xC2 -> HEBREW POINT HATAF PATAH + '\u05b3' # 0xC3 -> HEBREW POINT HATAF QAMATS + '\u05b4' # 0xC4 -> HEBREW POINT HIRIQ + '\u05b5' # 0xC5 -> HEBREW POINT TSERE + '\u05b6' # 0xC6 -> HEBREW POINT SEGOL + '\u05b7' # 0xC7 -> HEBREW POINT PATAH + '\u05b8' # 0xC8 -> HEBREW POINT QAMATS + '\u05b9' # 0xC9 -> HEBREW POINT HOLAM + '\ufffe' # 0xCA -> UNDEFINED + '\u05bb' # 0xCB -> HEBREW POINT QUBUTS + '\u05bc' # 0xCC -> HEBREW POINT DAGESH OR MAPIQ + '\u05bd' # 0xCD -> HEBREW POINT METEG + '\u05be' # 0xCE -> HEBREW PUNCTUATION MAQAF + '\u05bf' # 0xCF -> HEBREW POINT RAFE + '\u05c0' # 0xD0 -> HEBREW PUNCTUATION PASEQ + '\u05c1' # 0xD1 -> HEBREW POINT SHIN DOT + '\u05c2' # 0xD2 -> HEBREW POINT SIN DOT + '\u05c3' # 0xD3 -> HEBREW PUNCTUATION SOF PASUQ + '\u05f0' # 0xD4 -> HEBREW LIGATURE YIDDISH DOUBLE VAV + '\u05f1' # 0xD5 -> HEBREW LIGATURE YIDDISH VAV YOD + '\u05f2' # 0xD6 -> HEBREW LIGATURE YIDDISH DOUBLE YOD + '\u05f3' # 0xD7 -> HEBREW PUNCTUATION GERESH + '\u05f4' # 0xD8 -> HEBREW PUNCTUATION GERSHAYIM + '\ufffe' # 0xD9 -> UNDEFINED + '\ufffe' # 0xDA -> UNDEFINED + '\ufffe' # 0xDB -> UNDEFINED + '\ufffe' # 0xDC -> UNDEFINED + '\ufffe' # 0xDD -> UNDEFINED + '\ufffe' # 0xDE -> UNDEFINED + '\ufffe' # 0xDF -> UNDEFINED + '\u05d0' # 0xE0 -> HEBREW LETTER ALEF + '\u05d1' # 0xE1 -> HEBREW LETTER BET + '\u05d2' # 0xE2 -> HEBREW LETTER GIMEL + '\u05d3' # 0xE3 -> HEBREW LETTER DALET + '\u05d4' # 0xE4 -> HEBREW LETTER HE + '\u05d5' # 0xE5 -> HEBREW LETTER VAV + '\u05d6' # 0xE6 -> HEBREW LETTER ZAYIN + '\u05d7' # 0xE7 -> HEBREW LETTER HET + '\u05d8' # 0xE8 -> HEBREW LETTER TET + '\u05d9' # 0xE9 -> HEBREW LETTER YOD + '\u05da' # 0xEA -> HEBREW LETTER FINAL KAF + '\u05db' # 0xEB -> HEBREW LETTER KAF + '\u05dc' # 0xEC -> HEBREW LETTER LAMED + '\u05dd' # 0xED -> HEBREW LETTER FINAL MEM + '\u05de' # 0xEE -> HEBREW LETTER MEM + '\u05df' # 0xEF -> HEBREW LETTER FINAL NUN + '\u05e0' # 0xF0 -> HEBREW LETTER NUN + '\u05e1' # 0xF1 -> HEBREW LETTER SAMEKH + '\u05e2' # 0xF2 -> HEBREW LETTER AYIN + '\u05e3' # 0xF3 -> HEBREW LETTER FINAL PE + '\u05e4' # 0xF4 -> HEBREW LETTER PE + '\u05e5' # 0xF5 -> HEBREW LETTER FINAL TSADI + '\u05e6' # 0xF6 -> HEBREW LETTER TSADI + '\u05e7' # 0xF7 -> HEBREW LETTER QOF + '\u05e8' # 0xF8 -> HEBREW LETTER RESH + '\u05e9' # 0xF9 -> HEBREW LETTER SHIN + '\u05ea' # 0xFA -> HEBREW LETTER TAV + '\ufffe' # 0xFB -> UNDEFINED + '\ufffe' # 0xFC -> UNDEFINED + '\u200e' # 0xFD -> LEFT-TO-RIGHT MARK + '\u200f' # 0xFE -> RIGHT-TO-LEFT MARK + '\ufffe' # 0xFF -> UNDEFINED +) + +### Encoding table +encoding_table=codecs.charmap_build(decoding_table) diff --git a/env/Lib/encodings/cp1256.py b/env/Lib/encodings/cp1256.py new file mode 100644 index 0000000..fd6afab --- /dev/null +++ b/env/Lib/encodings/cp1256.py @@ -0,0 +1,307 @@ +""" Python Character Mapping Codec cp1256 generated from 'MAPPINGS/VENDORS/MICSFT/WINDOWS/CP1256.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='cp1256', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) + + +### Decoding Table + +decoding_table = ( + '\x00' # 0x00 -> NULL + '\x01' # 0x01 -> START OF HEADING + '\x02' # 0x02 -> START OF TEXT + '\x03' # 0x03 -> END OF TEXT + '\x04' # 0x04 -> END OF TRANSMISSION + '\x05' # 0x05 -> ENQUIRY + '\x06' # 0x06 -> ACKNOWLEDGE + '\x07' # 0x07 -> BELL + '\x08' # 0x08 -> BACKSPACE + '\t' # 0x09 -> HORIZONTAL TABULATION + '\n' # 0x0A -> LINE FEED + '\x0b' # 0x0B -> VERTICAL TABULATION + '\x0c' # 0x0C -> FORM FEED + '\r' # 0x0D -> CARRIAGE RETURN + '\x0e' # 0x0E -> SHIFT OUT + '\x0f' # 0x0F -> SHIFT IN + '\x10' # 0x10 -> DATA LINK ESCAPE + '\x11' # 0x11 -> DEVICE CONTROL ONE + '\x12' # 0x12 -> DEVICE CONTROL TWO + '\x13' # 0x13 -> DEVICE CONTROL THREE + '\x14' # 0x14 -> DEVICE CONTROL FOUR + '\x15' # 0x15 -> NEGATIVE ACKNOWLEDGE + '\x16' # 0x16 -> SYNCHRONOUS IDLE + '\x17' # 0x17 -> END OF TRANSMISSION BLOCK + '\x18' # 0x18 -> CANCEL + '\x19' # 0x19 -> END OF MEDIUM + '\x1a' # 0x1A -> SUBSTITUTE + '\x1b' # 0x1B -> ESCAPE + '\x1c' # 0x1C -> FILE SEPARATOR + '\x1d' # 0x1D -> GROUP SEPARATOR + '\x1e' # 0x1E -> RECORD SEPARATOR + '\x1f' # 0x1F -> UNIT SEPARATOR + ' ' # 0x20 -> SPACE + '!' # 0x21 -> EXCLAMATION MARK + '"' # 0x22 -> QUOTATION MARK + '#' # 0x23 -> NUMBER SIGN + '$' # 0x24 -> DOLLAR SIGN + '%' # 0x25 -> PERCENT SIGN + '&' # 0x26 -> AMPERSAND + "'" # 0x27 -> APOSTROPHE + '(' # 0x28 -> LEFT PARENTHESIS + ')' # 0x29 -> RIGHT PARENTHESIS + '*' # 0x2A -> ASTERISK + '+' # 0x2B -> PLUS SIGN + ',' # 0x2C -> COMMA + '-' # 0x2D -> HYPHEN-MINUS + '.' # 0x2E -> FULL STOP + '/' # 0x2F -> SOLIDUS + '0' # 0x30 -> DIGIT ZERO + '1' # 0x31 -> DIGIT ONE + '2' # 0x32 -> DIGIT TWO + '3' # 0x33 -> DIGIT THREE + '4' # 0x34 -> DIGIT FOUR + '5' # 0x35 -> DIGIT FIVE + '6' # 0x36 -> DIGIT SIX + '7' # 0x37 -> DIGIT SEVEN + '8' # 0x38 -> DIGIT EIGHT + '9' # 0x39 -> DIGIT NINE + ':' # 0x3A -> COLON + ';' # 0x3B -> SEMICOLON + '<' # 0x3C -> LESS-THAN SIGN + '=' # 0x3D -> EQUALS SIGN + '>' # 0x3E -> GREATER-THAN SIGN + '?' # 0x3F -> QUESTION MARK + '@' # 0x40 -> COMMERCIAL AT + 'A' # 0x41 -> LATIN CAPITAL LETTER A + 'B' # 0x42 -> LATIN CAPITAL LETTER B + 'C' # 0x43 -> LATIN CAPITAL LETTER C + 'D' # 0x44 -> LATIN CAPITAL LETTER D + 'E' # 0x45 -> LATIN CAPITAL LETTER E + 'F' # 0x46 -> LATIN CAPITAL LETTER F + 'G' # 0x47 -> LATIN CAPITAL LETTER G + 'H' # 0x48 -> LATIN CAPITAL LETTER H + 'I' # 0x49 -> LATIN CAPITAL LETTER I + 'J' # 0x4A -> LATIN CAPITAL LETTER J + 'K' # 0x4B -> LATIN CAPITAL LETTER K + 'L' # 0x4C -> LATIN CAPITAL LETTER L + 'M' # 0x4D -> LATIN CAPITAL LETTER M + 'N' # 0x4E -> LATIN CAPITAL LETTER N + 'O' # 0x4F -> LATIN CAPITAL LETTER O + 'P' # 0x50 -> LATIN CAPITAL LETTER P + 'Q' # 0x51 -> LATIN CAPITAL LETTER Q + 'R' # 0x52 -> LATIN CAPITAL LETTER R + 'S' # 0x53 -> LATIN CAPITAL LETTER S + 'T' # 0x54 -> LATIN CAPITAL LETTER T + 'U' # 0x55 -> LATIN CAPITAL LETTER U + 'V' # 0x56 -> LATIN CAPITAL LETTER V + 'W' # 0x57 -> LATIN CAPITAL LETTER W + 'X' # 0x58 -> LATIN CAPITAL LETTER X + 'Y' # 0x59 -> LATIN CAPITAL LETTER Y + 'Z' # 0x5A -> LATIN CAPITAL LETTER Z + '[' # 0x5B -> LEFT SQUARE BRACKET + '\\' # 0x5C -> REVERSE SOLIDUS + ']' # 0x5D -> RIGHT SQUARE BRACKET + '^' # 0x5E -> CIRCUMFLEX ACCENT + '_' # 0x5F -> LOW LINE + '`' # 0x60 -> GRAVE ACCENT + 'a' # 0x61 -> LATIN SMALL LETTER A + 'b' # 0x62 -> LATIN SMALL LETTER B + 'c' # 0x63 -> LATIN SMALL LETTER C + 'd' # 0x64 -> LATIN SMALL LETTER D + 'e' # 0x65 -> LATIN SMALL LETTER E + 'f' # 0x66 -> LATIN SMALL LETTER F + 'g' # 0x67 -> LATIN SMALL LETTER G + 'h' # 0x68 -> LATIN SMALL LETTER H + 'i' # 0x69 -> LATIN SMALL LETTER I + 'j' # 0x6A -> LATIN SMALL LETTER J + 'k' # 0x6B -> LATIN SMALL LETTER K + 'l' # 0x6C -> LATIN SMALL LETTER L + 'm' # 0x6D -> LATIN SMALL LETTER M + 'n' # 0x6E -> LATIN SMALL LETTER N + 'o' # 0x6F -> LATIN SMALL LETTER O + 'p' # 0x70 -> LATIN SMALL LETTER P + 'q' # 0x71 -> LATIN SMALL LETTER Q + 'r' # 0x72 -> LATIN SMALL LETTER R + 's' # 0x73 -> LATIN SMALL LETTER S + 't' # 0x74 -> LATIN SMALL LETTER T + 'u' # 0x75 -> LATIN SMALL LETTER U + 'v' # 0x76 -> LATIN SMALL LETTER V + 'w' # 0x77 -> LATIN SMALL LETTER W + 'x' # 0x78 -> LATIN SMALL LETTER X + 'y' # 0x79 -> LATIN SMALL LETTER Y + 'z' # 0x7A -> LATIN SMALL LETTER Z + '{' # 0x7B -> LEFT CURLY BRACKET + '|' # 0x7C -> VERTICAL LINE + '}' # 0x7D -> RIGHT CURLY BRACKET + '~' # 0x7E -> TILDE + '\x7f' # 0x7F -> DELETE + '\u20ac' # 0x80 -> EURO SIGN + '\u067e' # 0x81 -> ARABIC LETTER PEH + '\u201a' # 0x82 -> SINGLE LOW-9 QUOTATION MARK + '\u0192' # 0x83 -> LATIN SMALL LETTER F WITH HOOK + '\u201e' # 0x84 -> DOUBLE LOW-9 QUOTATION MARK + '\u2026' # 0x85 -> HORIZONTAL ELLIPSIS + '\u2020' # 0x86 -> DAGGER + '\u2021' # 0x87 -> DOUBLE DAGGER + '\u02c6' # 0x88 -> MODIFIER LETTER CIRCUMFLEX ACCENT + '\u2030' # 0x89 -> PER MILLE SIGN + '\u0679' # 0x8A -> ARABIC LETTER TTEH + '\u2039' # 0x8B -> SINGLE LEFT-POINTING ANGLE QUOTATION MARK + '\u0152' # 0x8C -> LATIN CAPITAL LIGATURE OE + '\u0686' # 0x8D -> ARABIC LETTER TCHEH + '\u0698' # 0x8E -> ARABIC LETTER JEH + '\u0688' # 0x8F -> ARABIC LETTER DDAL + '\u06af' # 0x90 -> ARABIC LETTER GAF + '\u2018' # 0x91 -> LEFT SINGLE QUOTATION MARK + '\u2019' # 0x92 -> RIGHT SINGLE QUOTATION MARK + '\u201c' # 0x93 -> LEFT DOUBLE QUOTATION MARK + '\u201d' # 0x94 -> RIGHT DOUBLE QUOTATION MARK + '\u2022' # 0x95 -> BULLET + '\u2013' # 0x96 -> EN DASH + '\u2014' # 0x97 -> EM DASH + '\u06a9' # 0x98 -> ARABIC LETTER KEHEH + '\u2122' # 0x99 -> TRADE MARK SIGN + '\u0691' # 0x9A -> ARABIC LETTER RREH + '\u203a' # 0x9B -> SINGLE RIGHT-POINTING ANGLE QUOTATION MARK + '\u0153' # 0x9C -> LATIN SMALL LIGATURE OE + '\u200c' # 0x9D -> ZERO WIDTH NON-JOINER + '\u200d' # 0x9E -> ZERO WIDTH JOINER + '\u06ba' # 0x9F -> ARABIC LETTER NOON GHUNNA + '\xa0' # 0xA0 -> NO-BREAK SPACE + '\u060c' # 0xA1 -> ARABIC COMMA + '\xa2' # 0xA2 -> CENT SIGN + '\xa3' # 0xA3 -> POUND SIGN + '\xa4' # 0xA4 -> CURRENCY SIGN + '\xa5' # 0xA5 -> YEN SIGN + '\xa6' # 0xA6 -> BROKEN BAR + '\xa7' # 0xA7 -> SECTION SIGN + '\xa8' # 0xA8 -> DIAERESIS + '\xa9' # 0xA9 -> COPYRIGHT SIGN + '\u06be' # 0xAA -> ARABIC LETTER HEH DOACHASHMEE + '\xab' # 0xAB -> LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + '\xac' # 0xAC -> NOT SIGN + '\xad' # 0xAD -> SOFT HYPHEN + '\xae' # 0xAE -> REGISTERED SIGN + '\xaf' # 0xAF -> MACRON + '\xb0' # 0xB0 -> DEGREE SIGN + '\xb1' # 0xB1 -> PLUS-MINUS SIGN + '\xb2' # 0xB2 -> SUPERSCRIPT TWO + '\xb3' # 0xB3 -> SUPERSCRIPT THREE + '\xb4' # 0xB4 -> ACUTE ACCENT + '\xb5' # 0xB5 -> MICRO SIGN + '\xb6' # 0xB6 -> PILCROW SIGN + '\xb7' # 0xB7 -> MIDDLE DOT + '\xb8' # 0xB8 -> CEDILLA + '\xb9' # 0xB9 -> SUPERSCRIPT ONE + '\u061b' # 0xBA -> ARABIC SEMICOLON + '\xbb' # 0xBB -> RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + '\xbc' # 0xBC -> VULGAR FRACTION ONE QUARTER + '\xbd' # 0xBD -> VULGAR FRACTION ONE HALF + '\xbe' # 0xBE -> VULGAR FRACTION THREE QUARTERS + '\u061f' # 0xBF -> ARABIC QUESTION MARK + '\u06c1' # 0xC0 -> ARABIC LETTER HEH GOAL + '\u0621' # 0xC1 -> ARABIC LETTER HAMZA + '\u0622' # 0xC2 -> ARABIC LETTER ALEF WITH MADDA ABOVE + '\u0623' # 0xC3 -> ARABIC LETTER ALEF WITH HAMZA ABOVE + '\u0624' # 0xC4 -> ARABIC LETTER WAW WITH HAMZA ABOVE + '\u0625' # 0xC5 -> ARABIC LETTER ALEF WITH HAMZA BELOW + '\u0626' # 0xC6 -> ARABIC LETTER YEH WITH HAMZA ABOVE + '\u0627' # 0xC7 -> ARABIC LETTER ALEF + '\u0628' # 0xC8 -> ARABIC LETTER BEH + '\u0629' # 0xC9 -> ARABIC LETTER TEH MARBUTA + '\u062a' # 0xCA -> ARABIC LETTER TEH + '\u062b' # 0xCB -> ARABIC LETTER THEH + '\u062c' # 0xCC -> ARABIC LETTER JEEM + '\u062d' # 0xCD -> ARABIC LETTER HAH + '\u062e' # 0xCE -> ARABIC LETTER KHAH + '\u062f' # 0xCF -> ARABIC LETTER DAL + '\u0630' # 0xD0 -> ARABIC LETTER THAL + '\u0631' # 0xD1 -> ARABIC LETTER REH + '\u0632' # 0xD2 -> ARABIC LETTER ZAIN + '\u0633' # 0xD3 -> ARABIC LETTER SEEN + '\u0634' # 0xD4 -> ARABIC LETTER SHEEN + '\u0635' # 0xD5 -> ARABIC LETTER SAD + '\u0636' # 0xD6 -> ARABIC LETTER DAD + '\xd7' # 0xD7 -> MULTIPLICATION SIGN + '\u0637' # 0xD8 -> ARABIC LETTER TAH + '\u0638' # 0xD9 -> ARABIC LETTER ZAH + '\u0639' # 0xDA -> ARABIC LETTER AIN + '\u063a' # 0xDB -> ARABIC LETTER GHAIN + '\u0640' # 0xDC -> ARABIC TATWEEL + '\u0641' # 0xDD -> ARABIC LETTER FEH + '\u0642' # 0xDE -> ARABIC LETTER QAF + '\u0643' # 0xDF -> ARABIC LETTER KAF + '\xe0' # 0xE0 -> LATIN SMALL LETTER A WITH GRAVE + '\u0644' # 0xE1 -> ARABIC LETTER LAM + '\xe2' # 0xE2 -> LATIN SMALL LETTER A WITH CIRCUMFLEX + '\u0645' # 0xE3 -> ARABIC LETTER MEEM + '\u0646' # 0xE4 -> ARABIC LETTER NOON + '\u0647' # 0xE5 -> ARABIC LETTER HEH + '\u0648' # 0xE6 -> ARABIC LETTER WAW + '\xe7' # 0xE7 -> LATIN SMALL LETTER C WITH CEDILLA + '\xe8' # 0xE8 -> LATIN SMALL LETTER E WITH GRAVE + '\xe9' # 0xE9 -> LATIN SMALL LETTER E WITH ACUTE + '\xea' # 0xEA -> LATIN SMALL LETTER E WITH CIRCUMFLEX + '\xeb' # 0xEB -> LATIN SMALL LETTER E WITH DIAERESIS + '\u0649' # 0xEC -> ARABIC LETTER ALEF MAKSURA + '\u064a' # 0xED -> ARABIC LETTER YEH + '\xee' # 0xEE -> LATIN SMALL LETTER I WITH CIRCUMFLEX + '\xef' # 0xEF -> LATIN SMALL LETTER I WITH DIAERESIS + '\u064b' # 0xF0 -> ARABIC FATHATAN + '\u064c' # 0xF1 -> ARABIC DAMMATAN + '\u064d' # 0xF2 -> ARABIC KASRATAN + '\u064e' # 0xF3 -> ARABIC FATHA + '\xf4' # 0xF4 -> LATIN SMALL LETTER O WITH CIRCUMFLEX + '\u064f' # 0xF5 -> ARABIC DAMMA + '\u0650' # 0xF6 -> ARABIC KASRA + '\xf7' # 0xF7 -> DIVISION SIGN + '\u0651' # 0xF8 -> ARABIC SHADDA + '\xf9' # 0xF9 -> LATIN SMALL LETTER U WITH GRAVE + '\u0652' # 0xFA -> ARABIC SUKUN + '\xfb' # 0xFB -> LATIN SMALL LETTER U WITH CIRCUMFLEX + '\xfc' # 0xFC -> LATIN SMALL LETTER U WITH DIAERESIS + '\u200e' # 0xFD -> LEFT-TO-RIGHT MARK + '\u200f' # 0xFE -> RIGHT-TO-LEFT MARK + '\u06d2' # 0xFF -> ARABIC LETTER YEH BARREE +) + +### Encoding table +encoding_table=codecs.charmap_build(decoding_table) diff --git a/env/Lib/encodings/cp1257.py b/env/Lib/encodings/cp1257.py new file mode 100644 index 0000000..9ebc90d --- /dev/null +++ b/env/Lib/encodings/cp1257.py @@ -0,0 +1,307 @@ +""" Python Character Mapping Codec cp1257 generated from 'MAPPINGS/VENDORS/MICSFT/WINDOWS/CP1257.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='cp1257', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) + + +### Decoding Table + +decoding_table = ( + '\x00' # 0x00 -> NULL + '\x01' # 0x01 -> START OF HEADING + '\x02' # 0x02 -> START OF TEXT + '\x03' # 0x03 -> END OF TEXT + '\x04' # 0x04 -> END OF TRANSMISSION + '\x05' # 0x05 -> ENQUIRY + '\x06' # 0x06 -> ACKNOWLEDGE + '\x07' # 0x07 -> BELL + '\x08' # 0x08 -> BACKSPACE + '\t' # 0x09 -> HORIZONTAL TABULATION + '\n' # 0x0A -> LINE FEED + '\x0b' # 0x0B -> VERTICAL TABULATION + '\x0c' # 0x0C -> FORM FEED + '\r' # 0x0D -> CARRIAGE RETURN + '\x0e' # 0x0E -> SHIFT OUT + '\x0f' # 0x0F -> SHIFT IN + '\x10' # 0x10 -> DATA LINK ESCAPE + '\x11' # 0x11 -> DEVICE CONTROL ONE + '\x12' # 0x12 -> DEVICE CONTROL TWO + '\x13' # 0x13 -> DEVICE CONTROL THREE + '\x14' # 0x14 -> DEVICE CONTROL FOUR + '\x15' # 0x15 -> NEGATIVE ACKNOWLEDGE + '\x16' # 0x16 -> SYNCHRONOUS IDLE + '\x17' # 0x17 -> END OF TRANSMISSION BLOCK + '\x18' # 0x18 -> CANCEL + '\x19' # 0x19 -> END OF MEDIUM + '\x1a' # 0x1A -> SUBSTITUTE + '\x1b' # 0x1B -> ESCAPE + '\x1c' # 0x1C -> FILE SEPARATOR + '\x1d' # 0x1D -> GROUP SEPARATOR + '\x1e' # 0x1E -> RECORD SEPARATOR + '\x1f' # 0x1F -> UNIT SEPARATOR + ' ' # 0x20 -> SPACE + '!' # 0x21 -> EXCLAMATION MARK + '"' # 0x22 -> QUOTATION MARK + '#' # 0x23 -> NUMBER SIGN + '$' # 0x24 -> DOLLAR SIGN + '%' # 0x25 -> PERCENT SIGN + '&' # 0x26 -> AMPERSAND + "'" # 0x27 -> APOSTROPHE + '(' # 0x28 -> LEFT PARENTHESIS + ')' # 0x29 -> RIGHT PARENTHESIS + '*' # 0x2A -> ASTERISK + '+' # 0x2B -> PLUS SIGN + ',' # 0x2C -> COMMA + '-' # 0x2D -> HYPHEN-MINUS + '.' # 0x2E -> FULL STOP + '/' # 0x2F -> SOLIDUS + '0' # 0x30 -> DIGIT ZERO + '1' # 0x31 -> DIGIT ONE + '2' # 0x32 -> DIGIT TWO + '3' # 0x33 -> DIGIT THREE + '4' # 0x34 -> DIGIT FOUR + '5' # 0x35 -> DIGIT FIVE + '6' # 0x36 -> DIGIT SIX + '7' # 0x37 -> DIGIT SEVEN + '8' # 0x38 -> DIGIT EIGHT + '9' # 0x39 -> DIGIT NINE + ':' # 0x3A -> COLON + ';' # 0x3B -> SEMICOLON + '<' # 0x3C -> LESS-THAN SIGN + '=' # 0x3D -> EQUALS SIGN + '>' # 0x3E -> GREATER-THAN SIGN + '?' # 0x3F -> QUESTION MARK + '@' # 0x40 -> COMMERCIAL AT + 'A' # 0x41 -> LATIN CAPITAL LETTER A + 'B' # 0x42 -> LATIN CAPITAL LETTER B + 'C' # 0x43 -> LATIN CAPITAL LETTER C + 'D' # 0x44 -> LATIN CAPITAL LETTER D + 'E' # 0x45 -> LATIN CAPITAL LETTER E + 'F' # 0x46 -> LATIN CAPITAL LETTER F + 'G' # 0x47 -> LATIN CAPITAL LETTER G + 'H' # 0x48 -> LATIN CAPITAL LETTER H + 'I' # 0x49 -> LATIN CAPITAL LETTER I + 'J' # 0x4A -> LATIN CAPITAL LETTER J + 'K' # 0x4B -> LATIN CAPITAL LETTER K + 'L' # 0x4C -> LATIN CAPITAL LETTER L + 'M' # 0x4D -> LATIN CAPITAL LETTER M + 'N' # 0x4E -> LATIN CAPITAL LETTER N + 'O' # 0x4F -> LATIN CAPITAL LETTER O + 'P' # 0x50 -> LATIN CAPITAL LETTER P + 'Q' # 0x51 -> LATIN CAPITAL LETTER Q + 'R' # 0x52 -> LATIN CAPITAL LETTER R + 'S' # 0x53 -> LATIN CAPITAL LETTER S + 'T' # 0x54 -> LATIN CAPITAL LETTER T + 'U' # 0x55 -> LATIN CAPITAL LETTER U + 'V' # 0x56 -> LATIN CAPITAL LETTER V + 'W' # 0x57 -> LATIN CAPITAL LETTER W + 'X' # 0x58 -> LATIN CAPITAL LETTER X + 'Y' # 0x59 -> LATIN CAPITAL LETTER Y + 'Z' # 0x5A -> LATIN CAPITAL LETTER Z + '[' # 0x5B -> LEFT SQUARE BRACKET + '\\' # 0x5C -> REVERSE SOLIDUS + ']' # 0x5D -> RIGHT SQUARE BRACKET + '^' # 0x5E -> CIRCUMFLEX ACCENT + '_' # 0x5F -> LOW LINE + '`' # 0x60 -> GRAVE ACCENT + 'a' # 0x61 -> LATIN SMALL LETTER A + 'b' # 0x62 -> LATIN SMALL LETTER B + 'c' # 0x63 -> LATIN SMALL LETTER C + 'd' # 0x64 -> LATIN SMALL LETTER D + 'e' # 0x65 -> LATIN SMALL LETTER E + 'f' # 0x66 -> LATIN SMALL LETTER F + 'g' # 0x67 -> LATIN SMALL LETTER G + 'h' # 0x68 -> LATIN SMALL LETTER H + 'i' # 0x69 -> LATIN SMALL LETTER I + 'j' # 0x6A -> LATIN SMALL LETTER J + 'k' # 0x6B -> LATIN SMALL LETTER K + 'l' # 0x6C -> LATIN SMALL LETTER L + 'm' # 0x6D -> LATIN SMALL LETTER M + 'n' # 0x6E -> LATIN SMALL LETTER N + 'o' # 0x6F -> LATIN SMALL LETTER O + 'p' # 0x70 -> LATIN SMALL LETTER P + 'q' # 0x71 -> LATIN SMALL LETTER Q + 'r' # 0x72 -> LATIN SMALL LETTER R + 's' # 0x73 -> LATIN SMALL LETTER S + 't' # 0x74 -> LATIN SMALL LETTER T + 'u' # 0x75 -> LATIN SMALL LETTER U + 'v' # 0x76 -> LATIN SMALL LETTER V + 'w' # 0x77 -> LATIN SMALL LETTER W + 'x' # 0x78 -> LATIN SMALL LETTER X + 'y' # 0x79 -> LATIN SMALL LETTER Y + 'z' # 0x7A -> LATIN SMALL LETTER Z + '{' # 0x7B -> LEFT CURLY BRACKET + '|' # 0x7C -> VERTICAL LINE + '}' # 0x7D -> RIGHT CURLY BRACKET + '~' # 0x7E -> TILDE + '\x7f' # 0x7F -> DELETE + '\u20ac' # 0x80 -> EURO SIGN + '\ufffe' # 0x81 -> UNDEFINED + '\u201a' # 0x82 -> SINGLE LOW-9 QUOTATION MARK + '\ufffe' # 0x83 -> UNDEFINED + '\u201e' # 0x84 -> DOUBLE LOW-9 QUOTATION MARK + '\u2026' # 0x85 -> HORIZONTAL ELLIPSIS + '\u2020' # 0x86 -> DAGGER + '\u2021' # 0x87 -> DOUBLE DAGGER + '\ufffe' # 0x88 -> UNDEFINED + '\u2030' # 0x89 -> PER MILLE SIGN + '\ufffe' # 0x8A -> UNDEFINED + '\u2039' # 0x8B -> SINGLE LEFT-POINTING ANGLE QUOTATION MARK + '\ufffe' # 0x8C -> UNDEFINED + '\xa8' # 0x8D -> DIAERESIS + '\u02c7' # 0x8E -> CARON + '\xb8' # 0x8F -> CEDILLA + '\ufffe' # 0x90 -> UNDEFINED + '\u2018' # 0x91 -> LEFT SINGLE QUOTATION MARK + '\u2019' # 0x92 -> RIGHT SINGLE QUOTATION MARK + '\u201c' # 0x93 -> LEFT DOUBLE QUOTATION MARK + '\u201d' # 0x94 -> RIGHT DOUBLE QUOTATION MARK + '\u2022' # 0x95 -> BULLET + '\u2013' # 0x96 -> EN DASH + '\u2014' # 0x97 -> EM DASH + '\ufffe' # 0x98 -> UNDEFINED + '\u2122' # 0x99 -> TRADE MARK SIGN + '\ufffe' # 0x9A -> UNDEFINED + '\u203a' # 0x9B -> SINGLE RIGHT-POINTING ANGLE QUOTATION MARK + '\ufffe' # 0x9C -> UNDEFINED + '\xaf' # 0x9D -> MACRON + '\u02db' # 0x9E -> OGONEK + '\ufffe' # 0x9F -> UNDEFINED + '\xa0' # 0xA0 -> NO-BREAK SPACE + '\ufffe' # 0xA1 -> UNDEFINED + '\xa2' # 0xA2 -> CENT SIGN + '\xa3' # 0xA3 -> POUND SIGN + '\xa4' # 0xA4 -> CURRENCY SIGN + '\ufffe' # 0xA5 -> UNDEFINED + '\xa6' # 0xA6 -> BROKEN BAR + '\xa7' # 0xA7 -> SECTION SIGN + '\xd8' # 0xA8 -> LATIN CAPITAL LETTER O WITH STROKE + '\xa9' # 0xA9 -> COPYRIGHT SIGN + '\u0156' # 0xAA -> LATIN CAPITAL LETTER R WITH CEDILLA + '\xab' # 0xAB -> LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + '\xac' # 0xAC -> NOT SIGN + '\xad' # 0xAD -> SOFT HYPHEN + '\xae' # 0xAE -> REGISTERED SIGN + '\xc6' # 0xAF -> LATIN CAPITAL LETTER AE + '\xb0' # 0xB0 -> DEGREE SIGN + '\xb1' # 0xB1 -> PLUS-MINUS SIGN + '\xb2' # 0xB2 -> SUPERSCRIPT TWO + '\xb3' # 0xB3 -> SUPERSCRIPT THREE + '\xb4' # 0xB4 -> ACUTE ACCENT + '\xb5' # 0xB5 -> MICRO SIGN + '\xb6' # 0xB6 -> PILCROW SIGN + '\xb7' # 0xB7 -> MIDDLE DOT + '\xf8' # 0xB8 -> LATIN SMALL LETTER O WITH STROKE + '\xb9' # 0xB9 -> SUPERSCRIPT ONE + '\u0157' # 0xBA -> LATIN SMALL LETTER R WITH CEDILLA + '\xbb' # 0xBB -> RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + '\xbc' # 0xBC -> VULGAR FRACTION ONE QUARTER + '\xbd' # 0xBD -> VULGAR FRACTION ONE HALF + '\xbe' # 0xBE -> VULGAR FRACTION THREE QUARTERS + '\xe6' # 0xBF -> LATIN SMALL LETTER AE + '\u0104' # 0xC0 -> LATIN CAPITAL LETTER A WITH OGONEK + '\u012e' # 0xC1 -> LATIN CAPITAL LETTER I WITH OGONEK + '\u0100' # 0xC2 -> LATIN CAPITAL LETTER A WITH MACRON + '\u0106' # 0xC3 -> LATIN CAPITAL LETTER C WITH ACUTE + '\xc4' # 0xC4 -> LATIN CAPITAL LETTER A WITH DIAERESIS + '\xc5' # 0xC5 -> LATIN CAPITAL LETTER A WITH RING ABOVE + '\u0118' # 0xC6 -> LATIN CAPITAL LETTER E WITH OGONEK + '\u0112' # 0xC7 -> LATIN CAPITAL LETTER E WITH MACRON + '\u010c' # 0xC8 -> LATIN CAPITAL LETTER C WITH CARON + '\xc9' # 0xC9 -> LATIN CAPITAL LETTER E WITH ACUTE + '\u0179' # 0xCA -> LATIN CAPITAL LETTER Z WITH ACUTE + '\u0116' # 0xCB -> LATIN CAPITAL LETTER E WITH DOT ABOVE + '\u0122' # 0xCC -> LATIN CAPITAL LETTER G WITH CEDILLA + '\u0136' # 0xCD -> LATIN CAPITAL LETTER K WITH CEDILLA + '\u012a' # 0xCE -> LATIN CAPITAL LETTER I WITH MACRON + '\u013b' # 0xCF -> LATIN CAPITAL LETTER L WITH CEDILLA + '\u0160' # 0xD0 -> LATIN CAPITAL LETTER S WITH CARON + '\u0143' # 0xD1 -> LATIN CAPITAL LETTER N WITH ACUTE + '\u0145' # 0xD2 -> LATIN CAPITAL LETTER N WITH CEDILLA + '\xd3' # 0xD3 -> LATIN CAPITAL LETTER O WITH ACUTE + '\u014c' # 0xD4 -> LATIN CAPITAL LETTER O WITH MACRON + '\xd5' # 0xD5 -> LATIN CAPITAL LETTER O WITH TILDE + '\xd6' # 0xD6 -> LATIN CAPITAL LETTER O WITH DIAERESIS + '\xd7' # 0xD7 -> MULTIPLICATION SIGN + '\u0172' # 0xD8 -> LATIN CAPITAL LETTER U WITH OGONEK + '\u0141' # 0xD9 -> LATIN CAPITAL LETTER L WITH STROKE + '\u015a' # 0xDA -> LATIN CAPITAL LETTER S WITH ACUTE + '\u016a' # 0xDB -> LATIN CAPITAL LETTER U WITH MACRON + '\xdc' # 0xDC -> LATIN CAPITAL LETTER U WITH DIAERESIS + '\u017b' # 0xDD -> LATIN CAPITAL LETTER Z WITH DOT ABOVE + '\u017d' # 0xDE -> LATIN CAPITAL LETTER Z WITH CARON + '\xdf' # 0xDF -> LATIN SMALL LETTER SHARP S + '\u0105' # 0xE0 -> LATIN SMALL LETTER A WITH OGONEK + '\u012f' # 0xE1 -> LATIN SMALL LETTER I WITH OGONEK + '\u0101' # 0xE2 -> LATIN SMALL LETTER A WITH MACRON + '\u0107' # 0xE3 -> LATIN SMALL LETTER C WITH ACUTE + '\xe4' # 0xE4 -> LATIN SMALL LETTER A WITH DIAERESIS + '\xe5' # 0xE5 -> LATIN SMALL LETTER A WITH RING ABOVE + '\u0119' # 0xE6 -> LATIN SMALL LETTER E WITH OGONEK + '\u0113' # 0xE7 -> LATIN SMALL LETTER E WITH MACRON + '\u010d' # 0xE8 -> LATIN SMALL LETTER C WITH CARON + '\xe9' # 0xE9 -> LATIN SMALL LETTER E WITH ACUTE + '\u017a' # 0xEA -> LATIN SMALL LETTER Z WITH ACUTE + '\u0117' # 0xEB -> LATIN SMALL LETTER E WITH DOT ABOVE + '\u0123' # 0xEC -> LATIN SMALL LETTER G WITH CEDILLA + '\u0137' # 0xED -> LATIN SMALL LETTER K WITH CEDILLA + '\u012b' # 0xEE -> LATIN SMALL LETTER I WITH MACRON + '\u013c' # 0xEF -> LATIN SMALL LETTER L WITH CEDILLA + '\u0161' # 0xF0 -> LATIN SMALL LETTER S WITH CARON + '\u0144' # 0xF1 -> LATIN SMALL LETTER N WITH ACUTE + '\u0146' # 0xF2 -> LATIN SMALL LETTER N WITH CEDILLA + '\xf3' # 0xF3 -> LATIN SMALL LETTER O WITH ACUTE + '\u014d' # 0xF4 -> LATIN SMALL LETTER O WITH MACRON + '\xf5' # 0xF5 -> LATIN SMALL LETTER O WITH TILDE + '\xf6' # 0xF6 -> LATIN SMALL LETTER O WITH DIAERESIS + '\xf7' # 0xF7 -> DIVISION SIGN + '\u0173' # 0xF8 -> LATIN SMALL LETTER U WITH OGONEK + '\u0142' # 0xF9 -> LATIN SMALL LETTER L WITH STROKE + '\u015b' # 0xFA -> LATIN SMALL LETTER S WITH ACUTE + '\u016b' # 0xFB -> LATIN SMALL LETTER U WITH MACRON + '\xfc' # 0xFC -> LATIN SMALL LETTER U WITH DIAERESIS + '\u017c' # 0xFD -> LATIN SMALL LETTER Z WITH DOT ABOVE + '\u017e' # 0xFE -> LATIN SMALL LETTER Z WITH CARON + '\u02d9' # 0xFF -> DOT ABOVE +) + +### Encoding table +encoding_table=codecs.charmap_build(decoding_table) diff --git a/env/Lib/encodings/cp1258.py b/env/Lib/encodings/cp1258.py new file mode 100644 index 0000000..784378a --- /dev/null +++ b/env/Lib/encodings/cp1258.py @@ -0,0 +1,307 @@ +""" Python Character Mapping Codec cp1258 generated from 'MAPPINGS/VENDORS/MICSFT/WINDOWS/CP1258.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='cp1258', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) + + +### Decoding Table + +decoding_table = ( + '\x00' # 0x00 -> NULL + '\x01' # 0x01 -> START OF HEADING + '\x02' # 0x02 -> START OF TEXT + '\x03' # 0x03 -> END OF TEXT + '\x04' # 0x04 -> END OF TRANSMISSION + '\x05' # 0x05 -> ENQUIRY + '\x06' # 0x06 -> ACKNOWLEDGE + '\x07' # 0x07 -> BELL + '\x08' # 0x08 -> BACKSPACE + '\t' # 0x09 -> HORIZONTAL TABULATION + '\n' # 0x0A -> LINE FEED + '\x0b' # 0x0B -> VERTICAL TABULATION + '\x0c' # 0x0C -> FORM FEED + '\r' # 0x0D -> CARRIAGE RETURN + '\x0e' # 0x0E -> SHIFT OUT + '\x0f' # 0x0F -> SHIFT IN + '\x10' # 0x10 -> DATA LINK ESCAPE + '\x11' # 0x11 -> DEVICE CONTROL ONE + '\x12' # 0x12 -> DEVICE CONTROL TWO + '\x13' # 0x13 -> DEVICE CONTROL THREE + '\x14' # 0x14 -> DEVICE CONTROL FOUR + '\x15' # 0x15 -> NEGATIVE ACKNOWLEDGE + '\x16' # 0x16 -> SYNCHRONOUS IDLE + '\x17' # 0x17 -> END OF TRANSMISSION BLOCK + '\x18' # 0x18 -> CANCEL + '\x19' # 0x19 -> END OF MEDIUM + '\x1a' # 0x1A -> SUBSTITUTE + '\x1b' # 0x1B -> ESCAPE + '\x1c' # 0x1C -> FILE SEPARATOR + '\x1d' # 0x1D -> GROUP SEPARATOR + '\x1e' # 0x1E -> RECORD SEPARATOR + '\x1f' # 0x1F -> UNIT SEPARATOR + ' ' # 0x20 -> SPACE + '!' # 0x21 -> EXCLAMATION MARK + '"' # 0x22 -> QUOTATION MARK + '#' # 0x23 -> NUMBER SIGN + '$' # 0x24 -> DOLLAR SIGN + '%' # 0x25 -> PERCENT SIGN + '&' # 0x26 -> AMPERSAND + "'" # 0x27 -> APOSTROPHE + '(' # 0x28 -> LEFT PARENTHESIS + ')' # 0x29 -> RIGHT PARENTHESIS + '*' # 0x2A -> ASTERISK + '+' # 0x2B -> PLUS SIGN + ',' # 0x2C -> COMMA + '-' # 0x2D -> HYPHEN-MINUS + '.' # 0x2E -> FULL STOP + '/' # 0x2F -> SOLIDUS + '0' # 0x30 -> DIGIT ZERO + '1' # 0x31 -> DIGIT ONE + '2' # 0x32 -> DIGIT TWO + '3' # 0x33 -> DIGIT THREE + '4' # 0x34 -> DIGIT FOUR + '5' # 0x35 -> DIGIT FIVE + '6' # 0x36 -> DIGIT SIX + '7' # 0x37 -> DIGIT SEVEN + '8' # 0x38 -> DIGIT EIGHT + '9' # 0x39 -> DIGIT NINE + ':' # 0x3A -> COLON + ';' # 0x3B -> SEMICOLON + '<' # 0x3C -> LESS-THAN SIGN + '=' # 0x3D -> EQUALS SIGN + '>' # 0x3E -> GREATER-THAN SIGN + '?' # 0x3F -> QUESTION MARK + '@' # 0x40 -> COMMERCIAL AT + 'A' # 0x41 -> LATIN CAPITAL LETTER A + 'B' # 0x42 -> LATIN CAPITAL LETTER B + 'C' # 0x43 -> LATIN CAPITAL LETTER C + 'D' # 0x44 -> LATIN CAPITAL LETTER D + 'E' # 0x45 -> LATIN CAPITAL LETTER E + 'F' # 0x46 -> LATIN CAPITAL LETTER F + 'G' # 0x47 -> LATIN CAPITAL LETTER G + 'H' # 0x48 -> LATIN CAPITAL LETTER H + 'I' # 0x49 -> LATIN CAPITAL LETTER I + 'J' # 0x4A -> LATIN CAPITAL LETTER J + 'K' # 0x4B -> LATIN CAPITAL LETTER K + 'L' # 0x4C -> LATIN CAPITAL LETTER L + 'M' # 0x4D -> LATIN CAPITAL LETTER M + 'N' # 0x4E -> LATIN CAPITAL LETTER N + 'O' # 0x4F -> LATIN CAPITAL LETTER O + 'P' # 0x50 -> LATIN CAPITAL LETTER P + 'Q' # 0x51 -> LATIN CAPITAL LETTER Q + 'R' # 0x52 -> LATIN CAPITAL LETTER R + 'S' # 0x53 -> LATIN CAPITAL LETTER S + 'T' # 0x54 -> LATIN CAPITAL LETTER T + 'U' # 0x55 -> LATIN CAPITAL LETTER U + 'V' # 0x56 -> LATIN CAPITAL LETTER V + 'W' # 0x57 -> LATIN CAPITAL LETTER W + 'X' # 0x58 -> LATIN CAPITAL LETTER X + 'Y' # 0x59 -> LATIN CAPITAL LETTER Y + 'Z' # 0x5A -> LATIN CAPITAL LETTER Z + '[' # 0x5B -> LEFT SQUARE BRACKET + '\\' # 0x5C -> REVERSE SOLIDUS + ']' # 0x5D -> RIGHT SQUARE BRACKET + '^' # 0x5E -> CIRCUMFLEX ACCENT + '_' # 0x5F -> LOW LINE + '`' # 0x60 -> GRAVE ACCENT + 'a' # 0x61 -> LATIN SMALL LETTER A + 'b' # 0x62 -> LATIN SMALL LETTER B + 'c' # 0x63 -> LATIN SMALL LETTER C + 'd' # 0x64 -> LATIN SMALL LETTER D + 'e' # 0x65 -> LATIN SMALL LETTER E + 'f' # 0x66 -> LATIN SMALL LETTER F + 'g' # 0x67 -> LATIN SMALL LETTER G + 'h' # 0x68 -> LATIN SMALL LETTER H + 'i' # 0x69 -> LATIN SMALL LETTER I + 'j' # 0x6A -> LATIN SMALL LETTER J + 'k' # 0x6B -> LATIN SMALL LETTER K + 'l' # 0x6C -> LATIN SMALL LETTER L + 'm' # 0x6D -> LATIN SMALL LETTER M + 'n' # 0x6E -> LATIN SMALL LETTER N + 'o' # 0x6F -> LATIN SMALL LETTER O + 'p' # 0x70 -> LATIN SMALL LETTER P + 'q' # 0x71 -> LATIN SMALL LETTER Q + 'r' # 0x72 -> LATIN SMALL LETTER R + 's' # 0x73 -> LATIN SMALL LETTER S + 't' # 0x74 -> LATIN SMALL LETTER T + 'u' # 0x75 -> LATIN SMALL LETTER U + 'v' # 0x76 -> LATIN SMALL LETTER V + 'w' # 0x77 -> LATIN SMALL LETTER W + 'x' # 0x78 -> LATIN SMALL LETTER X + 'y' # 0x79 -> LATIN SMALL LETTER Y + 'z' # 0x7A -> LATIN SMALL LETTER Z + '{' # 0x7B -> LEFT CURLY BRACKET + '|' # 0x7C -> VERTICAL LINE + '}' # 0x7D -> RIGHT CURLY BRACKET + '~' # 0x7E -> TILDE + '\x7f' # 0x7F -> DELETE + '\u20ac' # 0x80 -> EURO SIGN + '\ufffe' # 0x81 -> UNDEFINED + '\u201a' # 0x82 -> SINGLE LOW-9 QUOTATION MARK + '\u0192' # 0x83 -> LATIN SMALL LETTER F WITH HOOK + '\u201e' # 0x84 -> DOUBLE LOW-9 QUOTATION MARK + '\u2026' # 0x85 -> HORIZONTAL ELLIPSIS + '\u2020' # 0x86 -> DAGGER + '\u2021' # 0x87 -> DOUBLE DAGGER + '\u02c6' # 0x88 -> MODIFIER LETTER CIRCUMFLEX ACCENT + '\u2030' # 0x89 -> PER MILLE SIGN + '\ufffe' # 0x8A -> UNDEFINED + '\u2039' # 0x8B -> SINGLE LEFT-POINTING ANGLE QUOTATION MARK + '\u0152' # 0x8C -> LATIN CAPITAL LIGATURE OE + '\ufffe' # 0x8D -> UNDEFINED + '\ufffe' # 0x8E -> UNDEFINED + '\ufffe' # 0x8F -> UNDEFINED + '\ufffe' # 0x90 -> UNDEFINED + '\u2018' # 0x91 -> LEFT SINGLE QUOTATION MARK + '\u2019' # 0x92 -> RIGHT SINGLE QUOTATION MARK + '\u201c' # 0x93 -> LEFT DOUBLE QUOTATION MARK + '\u201d' # 0x94 -> RIGHT DOUBLE QUOTATION MARK + '\u2022' # 0x95 -> BULLET + '\u2013' # 0x96 -> EN DASH + '\u2014' # 0x97 -> EM DASH + '\u02dc' # 0x98 -> SMALL TILDE + '\u2122' # 0x99 -> TRADE MARK SIGN + '\ufffe' # 0x9A -> UNDEFINED + '\u203a' # 0x9B -> SINGLE RIGHT-POINTING ANGLE QUOTATION MARK + '\u0153' # 0x9C -> LATIN SMALL LIGATURE OE + '\ufffe' # 0x9D -> UNDEFINED + '\ufffe' # 0x9E -> UNDEFINED + '\u0178' # 0x9F -> LATIN CAPITAL LETTER Y WITH DIAERESIS + '\xa0' # 0xA0 -> NO-BREAK SPACE + '\xa1' # 0xA1 -> INVERTED EXCLAMATION MARK + '\xa2' # 0xA2 -> CENT SIGN + '\xa3' # 0xA3 -> POUND SIGN + '\xa4' # 0xA4 -> CURRENCY SIGN + '\xa5' # 0xA5 -> YEN SIGN + '\xa6' # 0xA6 -> BROKEN BAR + '\xa7' # 0xA7 -> SECTION SIGN + '\xa8' # 0xA8 -> DIAERESIS + '\xa9' # 0xA9 -> COPYRIGHT SIGN + '\xaa' # 0xAA -> FEMININE ORDINAL INDICATOR + '\xab' # 0xAB -> LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + '\xac' # 0xAC -> NOT SIGN + '\xad' # 0xAD -> SOFT HYPHEN + '\xae' # 0xAE -> REGISTERED SIGN + '\xaf' # 0xAF -> MACRON + '\xb0' # 0xB0 -> DEGREE SIGN + '\xb1' # 0xB1 -> PLUS-MINUS SIGN + '\xb2' # 0xB2 -> SUPERSCRIPT TWO + '\xb3' # 0xB3 -> SUPERSCRIPT THREE + '\xb4' # 0xB4 -> ACUTE ACCENT + '\xb5' # 0xB5 -> MICRO SIGN + '\xb6' # 0xB6 -> PILCROW SIGN + '\xb7' # 0xB7 -> MIDDLE DOT + '\xb8' # 0xB8 -> CEDILLA + '\xb9' # 0xB9 -> SUPERSCRIPT ONE + '\xba' # 0xBA -> MASCULINE ORDINAL INDICATOR + '\xbb' # 0xBB -> RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + '\xbc' # 0xBC -> VULGAR FRACTION ONE QUARTER + '\xbd' # 0xBD -> VULGAR FRACTION ONE HALF + '\xbe' # 0xBE -> VULGAR FRACTION THREE QUARTERS + '\xbf' # 0xBF -> INVERTED QUESTION MARK + '\xc0' # 0xC0 -> LATIN CAPITAL LETTER A WITH GRAVE + '\xc1' # 0xC1 -> LATIN CAPITAL LETTER A WITH ACUTE + '\xc2' # 0xC2 -> LATIN CAPITAL LETTER A WITH CIRCUMFLEX + '\u0102' # 0xC3 -> LATIN CAPITAL LETTER A WITH BREVE + '\xc4' # 0xC4 -> LATIN CAPITAL LETTER A WITH DIAERESIS + '\xc5' # 0xC5 -> LATIN CAPITAL LETTER A WITH RING ABOVE + '\xc6' # 0xC6 -> LATIN CAPITAL LETTER AE + '\xc7' # 0xC7 -> LATIN CAPITAL LETTER C WITH CEDILLA + '\xc8' # 0xC8 -> LATIN CAPITAL LETTER E WITH GRAVE + '\xc9' # 0xC9 -> LATIN CAPITAL LETTER E WITH ACUTE + '\xca' # 0xCA -> LATIN CAPITAL LETTER E WITH CIRCUMFLEX + '\xcb' # 0xCB -> LATIN CAPITAL LETTER E WITH DIAERESIS + '\u0300' # 0xCC -> COMBINING GRAVE ACCENT + '\xcd' # 0xCD -> LATIN CAPITAL LETTER I WITH ACUTE + '\xce' # 0xCE -> LATIN CAPITAL LETTER I WITH CIRCUMFLEX + '\xcf' # 0xCF -> LATIN CAPITAL LETTER I WITH DIAERESIS + '\u0110' # 0xD0 -> LATIN CAPITAL LETTER D WITH STROKE + '\xd1' # 0xD1 -> LATIN CAPITAL LETTER N WITH TILDE + '\u0309' # 0xD2 -> COMBINING HOOK ABOVE + '\xd3' # 0xD3 -> LATIN CAPITAL LETTER O WITH ACUTE + '\xd4' # 0xD4 -> LATIN CAPITAL LETTER O WITH CIRCUMFLEX + '\u01a0' # 0xD5 -> LATIN CAPITAL LETTER O WITH HORN + '\xd6' # 0xD6 -> LATIN CAPITAL LETTER O WITH DIAERESIS + '\xd7' # 0xD7 -> MULTIPLICATION SIGN + '\xd8' # 0xD8 -> LATIN CAPITAL LETTER O WITH STROKE + '\xd9' # 0xD9 -> LATIN CAPITAL LETTER U WITH GRAVE + '\xda' # 0xDA -> LATIN CAPITAL LETTER U WITH ACUTE + '\xdb' # 0xDB -> LATIN CAPITAL LETTER U WITH CIRCUMFLEX + '\xdc' # 0xDC -> LATIN CAPITAL LETTER U WITH DIAERESIS + '\u01af' # 0xDD -> LATIN CAPITAL LETTER U WITH HORN + '\u0303' # 0xDE -> COMBINING TILDE + '\xdf' # 0xDF -> LATIN SMALL LETTER SHARP S + '\xe0' # 0xE0 -> LATIN SMALL LETTER A WITH GRAVE + '\xe1' # 0xE1 -> LATIN SMALL LETTER A WITH ACUTE + '\xe2' # 0xE2 -> LATIN SMALL LETTER A WITH CIRCUMFLEX + '\u0103' # 0xE3 -> LATIN SMALL LETTER A WITH BREVE + '\xe4' # 0xE4 -> LATIN SMALL LETTER A WITH DIAERESIS + '\xe5' # 0xE5 -> LATIN SMALL LETTER A WITH RING ABOVE + '\xe6' # 0xE6 -> LATIN SMALL LETTER AE + '\xe7' # 0xE7 -> LATIN SMALL LETTER C WITH CEDILLA + '\xe8' # 0xE8 -> LATIN SMALL LETTER E WITH GRAVE + '\xe9' # 0xE9 -> LATIN SMALL LETTER E WITH ACUTE + '\xea' # 0xEA -> LATIN SMALL LETTER E WITH CIRCUMFLEX + '\xeb' # 0xEB -> LATIN SMALL LETTER E WITH DIAERESIS + '\u0301' # 0xEC -> COMBINING ACUTE ACCENT + '\xed' # 0xED -> LATIN SMALL LETTER I WITH ACUTE + '\xee' # 0xEE -> LATIN SMALL LETTER I WITH CIRCUMFLEX + '\xef' # 0xEF -> LATIN SMALL LETTER I WITH DIAERESIS + '\u0111' # 0xF0 -> LATIN SMALL LETTER D WITH STROKE + '\xf1' # 0xF1 -> LATIN SMALL LETTER N WITH TILDE + '\u0323' # 0xF2 -> COMBINING DOT BELOW + '\xf3' # 0xF3 -> LATIN SMALL LETTER O WITH ACUTE + '\xf4' # 0xF4 -> LATIN SMALL LETTER O WITH CIRCUMFLEX + '\u01a1' # 0xF5 -> LATIN SMALL LETTER O WITH HORN + '\xf6' # 0xF6 -> LATIN SMALL LETTER O WITH DIAERESIS + '\xf7' # 0xF7 -> DIVISION SIGN + '\xf8' # 0xF8 -> LATIN SMALL LETTER O WITH STROKE + '\xf9' # 0xF9 -> LATIN SMALL LETTER U WITH GRAVE + '\xfa' # 0xFA -> LATIN SMALL LETTER U WITH ACUTE + '\xfb' # 0xFB -> LATIN SMALL LETTER U WITH CIRCUMFLEX + '\xfc' # 0xFC -> LATIN SMALL LETTER U WITH DIAERESIS + '\u01b0' # 0xFD -> LATIN SMALL LETTER U WITH HORN + '\u20ab' # 0xFE -> DONG SIGN + '\xff' # 0xFF -> LATIN SMALL LETTER Y WITH DIAERESIS +) + +### Encoding table +encoding_table=codecs.charmap_build(decoding_table) diff --git a/env/Lib/encodings/cp273.py b/env/Lib/encodings/cp273.py new file mode 100644 index 0000000..69c6d77 --- /dev/null +++ b/env/Lib/encodings/cp273.py @@ -0,0 +1,307 @@ +""" Python Character Mapping Codec cp273 generated from 'python-mappings/CP273.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='cp273', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) + + +### Decoding Table + +decoding_table = ( + '\x00' # 0x00 -> NULL (NUL) + '\x01' # 0x01 -> START OF HEADING (SOH) + '\x02' # 0x02 -> START OF TEXT (STX) + '\x03' # 0x03 -> END OF TEXT (ETX) + '\x9c' # 0x04 -> STRING TERMINATOR (ST) + '\t' # 0x05 -> CHARACTER TABULATION (HT) + '\x86' # 0x06 -> START OF SELECTED AREA (SSA) + '\x7f' # 0x07 -> DELETE (DEL) + '\x97' # 0x08 -> END OF GUARDED AREA (EPA) + '\x8d' # 0x09 -> REVERSE LINE FEED (RI) + '\x8e' # 0x0A -> SINGLE-SHIFT TWO (SS2) + '\x0b' # 0x0B -> LINE TABULATION (VT) + '\x0c' # 0x0C -> FORM FEED (FF) + '\r' # 0x0D -> CARRIAGE RETURN (CR) + '\x0e' # 0x0E -> SHIFT OUT (SO) + '\x0f' # 0x0F -> SHIFT IN (SI) + '\x10' # 0x10 -> DATALINK ESCAPE (DLE) + '\x11' # 0x11 -> DEVICE CONTROL ONE (DC1) + '\x12' # 0x12 -> DEVICE CONTROL TWO (DC2) + '\x13' # 0x13 -> DEVICE CONTROL THREE (DC3) + '\x9d' # 0x14 -> OPERATING SYSTEM COMMAND (OSC) + '\x85' # 0x15 -> NEXT LINE (NEL) + '\x08' # 0x16 -> BACKSPACE (BS) + '\x87' # 0x17 -> END OF SELECTED AREA (ESA) + '\x18' # 0x18 -> CANCEL (CAN) + '\x19' # 0x19 -> END OF MEDIUM (EM) + '\x92' # 0x1A -> PRIVATE USE TWO (PU2) + '\x8f' # 0x1B -> SINGLE-SHIFT THREE (SS3) + '\x1c' # 0x1C -> FILE SEPARATOR (IS4) + '\x1d' # 0x1D -> GROUP SEPARATOR (IS3) + '\x1e' # 0x1E -> RECORD SEPARATOR (IS2) + '\x1f' # 0x1F -> UNIT SEPARATOR (IS1) + '\x80' # 0x20 -> PADDING CHARACTER (PAD) + '\x81' # 0x21 -> HIGH OCTET PRESET (HOP) + '\x82' # 0x22 -> BREAK PERMITTED HERE (BPH) + '\x83' # 0x23 -> NO BREAK HERE (NBH) + '\x84' # 0x24 -> INDEX (IND) + '\n' # 0x25 -> LINE FEED (LF) + '\x17' # 0x26 -> END OF TRANSMISSION BLOCK (ETB) + '\x1b' # 0x27 -> ESCAPE (ESC) + '\x88' # 0x28 -> CHARACTER TABULATION SET (HTS) + '\x89' # 0x29 -> CHARACTER TABULATION WITH JUSTIFICATION (HTJ) + '\x8a' # 0x2A -> LINE TABULATION SET (VTS) + '\x8b' # 0x2B -> PARTIAL LINE FORWARD (PLD) + '\x8c' # 0x2C -> PARTIAL LINE BACKWARD (PLU) + '\x05' # 0x2D -> ENQUIRY (ENQ) + '\x06' # 0x2E -> ACKNOWLEDGE (ACK) + '\x07' # 0x2F -> BELL (BEL) + '\x90' # 0x30 -> DEVICE CONTROL STRING (DCS) + '\x91' # 0x31 -> PRIVATE USE ONE (PU1) + '\x16' # 0x32 -> SYNCHRONOUS IDLE (SYN) + '\x93' # 0x33 -> SET TRANSMIT STATE (STS) + '\x94' # 0x34 -> CANCEL CHARACTER (CCH) + '\x95' # 0x35 -> MESSAGE WAITING (MW) + '\x96' # 0x36 -> START OF GUARDED AREA (SPA) + '\x04' # 0x37 -> END OF TRANSMISSION (EOT) + '\x98' # 0x38 -> START OF STRING (SOS) + '\x99' # 0x39 -> SINGLE GRAPHIC CHARACTER INTRODUCER (SGCI) + '\x9a' # 0x3A -> SINGLE CHARACTER INTRODUCER (SCI) + '\x9b' # 0x3B -> CONTROL SEQUENCE INTRODUCER (CSI) + '\x14' # 0x3C -> DEVICE CONTROL FOUR (DC4) + '\x15' # 0x3D -> NEGATIVE ACKNOWLEDGE (NAK) + '\x9e' # 0x3E -> PRIVACY MESSAGE (PM) + '\x1a' # 0x3F -> SUBSTITUTE (SUB) + ' ' # 0x40 -> SPACE + '\xa0' # 0x41 -> NO-BREAK SPACE + '\xe2' # 0x42 -> LATIN SMALL LETTER A WITH CIRCUMFLEX + '{' # 0x43 -> LEFT CURLY BRACKET + '\xe0' # 0x44 -> LATIN SMALL LETTER A WITH GRAVE + '\xe1' # 0x45 -> LATIN SMALL LETTER A WITH ACUTE + '\xe3' # 0x46 -> LATIN SMALL LETTER A WITH TILDE + '\xe5' # 0x47 -> LATIN SMALL LETTER A WITH RING ABOVE + '\xe7' # 0x48 -> LATIN SMALL LETTER C WITH CEDILLA + '\xf1' # 0x49 -> LATIN SMALL LETTER N WITH TILDE + '\xc4' # 0x4A -> LATIN CAPITAL LETTER A WITH DIAERESIS + '.' # 0x4B -> FULL STOP + '<' # 0x4C -> LESS-THAN SIGN + '(' # 0x4D -> LEFT PARENTHESIS + '+' # 0x4E -> PLUS SIGN + '!' # 0x4F -> EXCLAMATION MARK + '&' # 0x50 -> AMPERSAND + '\xe9' # 0x51 -> LATIN SMALL LETTER E WITH ACUTE + '\xea' # 0x52 -> LATIN SMALL LETTER E WITH CIRCUMFLEX + '\xeb' # 0x53 -> LATIN SMALL LETTER E WITH DIAERESIS + '\xe8' # 0x54 -> LATIN SMALL LETTER E WITH GRAVE + '\xed' # 0x55 -> LATIN SMALL LETTER I WITH ACUTE + '\xee' # 0x56 -> LATIN SMALL LETTER I WITH CIRCUMFLEX + '\xef' # 0x57 -> LATIN SMALL LETTER I WITH DIAERESIS + '\xec' # 0x58 -> LATIN SMALL LETTER I WITH GRAVE + '~' # 0x59 -> TILDE + '\xdc' # 0x5A -> LATIN CAPITAL LETTER U WITH DIAERESIS + '$' # 0x5B -> DOLLAR SIGN + '*' # 0x5C -> ASTERISK + ')' # 0x5D -> RIGHT PARENTHESIS + ';' # 0x5E -> SEMICOLON + '^' # 0x5F -> CIRCUMFLEX ACCENT + '-' # 0x60 -> HYPHEN-MINUS + '/' # 0x61 -> SOLIDUS + '\xc2' # 0x62 -> LATIN CAPITAL LETTER A WITH CIRCUMFLEX + '[' # 0x63 -> LEFT SQUARE BRACKET + '\xc0' # 0x64 -> LATIN CAPITAL LETTER A WITH GRAVE + '\xc1' # 0x65 -> LATIN CAPITAL LETTER A WITH ACUTE + '\xc3' # 0x66 -> LATIN CAPITAL LETTER A WITH TILDE + '\xc5' # 0x67 -> LATIN CAPITAL LETTER A WITH RING ABOVE + '\xc7' # 0x68 -> LATIN CAPITAL LETTER C WITH CEDILLA + '\xd1' # 0x69 -> LATIN CAPITAL LETTER N WITH TILDE + '\xf6' # 0x6A -> LATIN SMALL LETTER O WITH DIAERESIS + ',' # 0x6B -> COMMA + '%' # 0x6C -> PERCENT SIGN + '_' # 0x6D -> LOW LINE + '>' # 0x6E -> GREATER-THAN SIGN + '?' # 0x6F -> QUESTION MARK + '\xf8' # 0x70 -> LATIN SMALL LETTER O WITH STROKE + '\xc9' # 0x71 -> LATIN CAPITAL LETTER E WITH ACUTE + '\xca' # 0x72 -> LATIN CAPITAL LETTER E WITH CIRCUMFLEX + '\xcb' # 0x73 -> LATIN CAPITAL LETTER E WITH DIAERESIS + '\xc8' # 0x74 -> LATIN CAPITAL LETTER E WITH GRAVE + '\xcd' # 0x75 -> LATIN CAPITAL LETTER I WITH ACUTE + '\xce' # 0x76 -> LATIN CAPITAL LETTER I WITH CIRCUMFLEX + '\xcf' # 0x77 -> LATIN CAPITAL LETTER I WITH DIAERESIS + '\xcc' # 0x78 -> LATIN CAPITAL LETTER I WITH GRAVE + '`' # 0x79 -> GRAVE ACCENT + ':' # 0x7A -> COLON + '#' # 0x7B -> NUMBER SIGN + '\xa7' # 0x7C -> SECTION SIGN + "'" # 0x7D -> APOSTROPHE + '=' # 0x7E -> EQUALS SIGN + '"' # 0x7F -> QUOTATION MARK + '\xd8' # 0x80 -> LATIN CAPITAL LETTER O WITH STROKE + 'a' # 0x81 -> LATIN SMALL LETTER A + 'b' # 0x82 -> LATIN SMALL LETTER B + 'c' # 0x83 -> LATIN SMALL LETTER C + 'd' # 0x84 -> LATIN SMALL LETTER D + 'e' # 0x85 -> LATIN SMALL LETTER E + 'f' # 0x86 -> LATIN SMALL LETTER F + 'g' # 0x87 -> LATIN SMALL LETTER G + 'h' # 0x88 -> LATIN SMALL LETTER H + 'i' # 0x89 -> LATIN SMALL LETTER I + '\xab' # 0x8A -> LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + '\xbb' # 0x8B -> RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + '\xf0' # 0x8C -> LATIN SMALL LETTER ETH (Icelandic) + '\xfd' # 0x8D -> LATIN SMALL LETTER Y WITH ACUTE + '\xfe' # 0x8E -> LATIN SMALL LETTER THORN (Icelandic) + '\xb1' # 0x8F -> PLUS-MINUS SIGN + '\xb0' # 0x90 -> DEGREE SIGN + 'j' # 0x91 -> LATIN SMALL LETTER J + 'k' # 0x92 -> LATIN SMALL LETTER K + 'l' # 0x93 -> LATIN SMALL LETTER L + 'm' # 0x94 -> LATIN SMALL LETTER M + 'n' # 0x95 -> LATIN SMALL LETTER N + 'o' # 0x96 -> LATIN SMALL LETTER O + 'p' # 0x97 -> LATIN SMALL LETTER P + 'q' # 0x98 -> LATIN SMALL LETTER Q + 'r' # 0x99 -> LATIN SMALL LETTER R + '\xaa' # 0x9A -> FEMININE ORDINAL INDICATOR + '\xba' # 0x9B -> MASCULINE ORDINAL INDICATOR + '\xe6' # 0x9C -> LATIN SMALL LETTER AE + '\xb8' # 0x9D -> CEDILLA + '\xc6' # 0x9E -> LATIN CAPITAL LETTER AE + '\xa4' # 0x9F -> CURRENCY SIGN + '\xb5' # 0xA0 -> MICRO SIGN + '\xdf' # 0xA1 -> LATIN SMALL LETTER SHARP S (German) + 's' # 0xA2 -> LATIN SMALL LETTER S + 't' # 0xA3 -> LATIN SMALL LETTER T + 'u' # 0xA4 -> LATIN SMALL LETTER U + 'v' # 0xA5 -> LATIN SMALL LETTER V + 'w' # 0xA6 -> LATIN SMALL LETTER W + 'x' # 0xA7 -> LATIN SMALL LETTER X + 'y' # 0xA8 -> LATIN SMALL LETTER Y + 'z' # 0xA9 -> LATIN SMALL LETTER Z + '\xa1' # 0xAA -> INVERTED EXCLAMATION MARK + '\xbf' # 0xAB -> INVERTED QUESTION MARK + '\xd0' # 0xAC -> LATIN CAPITAL LETTER ETH (Icelandic) + '\xdd' # 0xAD -> LATIN CAPITAL LETTER Y WITH ACUTE + '\xde' # 0xAE -> LATIN CAPITAL LETTER THORN (Icelandic) + '\xae' # 0xAF -> REGISTERED SIGN + '\xa2' # 0xB0 -> CENT SIGN + '\xa3' # 0xB1 -> POUND SIGN + '\xa5' # 0xB2 -> YEN SIGN + '\xb7' # 0xB3 -> MIDDLE DOT + '\xa9' # 0xB4 -> COPYRIGHT SIGN + '@' # 0xB5 -> COMMERCIAL AT + '\xb6' # 0xB6 -> PILCROW SIGN + '\xbc' # 0xB7 -> VULGAR FRACTION ONE QUARTER + '\xbd' # 0xB8 -> VULGAR FRACTION ONE HALF + '\xbe' # 0xB9 -> VULGAR FRACTION THREE QUARTERS + '\xac' # 0xBA -> NOT SIGN + '|' # 0xBB -> VERTICAL LINE + '\u203e' # 0xBC -> OVERLINE + '\xa8' # 0xBD -> DIAERESIS + '\xb4' # 0xBE -> ACUTE ACCENT + '\xd7' # 0xBF -> MULTIPLICATION SIGN + '\xe4' # 0xC0 -> LATIN SMALL LETTER A WITH DIAERESIS + 'A' # 0xC1 -> LATIN CAPITAL LETTER A + 'B' # 0xC2 -> LATIN CAPITAL LETTER B + 'C' # 0xC3 -> LATIN CAPITAL LETTER C + 'D' # 0xC4 -> LATIN CAPITAL LETTER D + 'E' # 0xC5 -> LATIN CAPITAL LETTER E + 'F' # 0xC6 -> LATIN CAPITAL LETTER F + 'G' # 0xC7 -> LATIN CAPITAL LETTER G + 'H' # 0xC8 -> LATIN CAPITAL LETTER H + 'I' # 0xC9 -> LATIN CAPITAL LETTER I + '\xad' # 0xCA -> SOFT HYPHEN + '\xf4' # 0xCB -> LATIN SMALL LETTER O WITH CIRCUMFLEX + '\xa6' # 0xCC -> BROKEN BAR + '\xf2' # 0xCD -> LATIN SMALL LETTER O WITH GRAVE + '\xf3' # 0xCE -> LATIN SMALL LETTER O WITH ACUTE + '\xf5' # 0xCF -> LATIN SMALL LETTER O WITH TILDE + '\xfc' # 0xD0 -> LATIN SMALL LETTER U WITH DIAERESIS + 'J' # 0xD1 -> LATIN CAPITAL LETTER J + 'K' # 0xD2 -> LATIN CAPITAL LETTER K + 'L' # 0xD3 -> LATIN CAPITAL LETTER L + 'M' # 0xD4 -> LATIN CAPITAL LETTER M + 'N' # 0xD5 -> LATIN CAPITAL LETTER N + 'O' # 0xD6 -> LATIN CAPITAL LETTER O + 'P' # 0xD7 -> LATIN CAPITAL LETTER P + 'Q' # 0xD8 -> LATIN CAPITAL LETTER Q + 'R' # 0xD9 -> LATIN CAPITAL LETTER R + '\xb9' # 0xDA -> SUPERSCRIPT ONE + '\xfb' # 0xDB -> LATIN SMALL LETTER U WITH CIRCUMFLEX + '}' # 0xDC -> RIGHT CURLY BRACKET + '\xf9' # 0xDD -> LATIN SMALL LETTER U WITH GRAVE + '\xfa' # 0xDE -> LATIN SMALL LETTER U WITH ACUTE + '\xff' # 0xDF -> LATIN SMALL LETTER Y WITH DIAERESIS + '\xd6' # 0xE0 -> LATIN CAPITAL LETTER O WITH DIAERESIS + '\xf7' # 0xE1 -> DIVISION SIGN + 'S' # 0xE2 -> LATIN CAPITAL LETTER S + 'T' # 0xE3 -> LATIN CAPITAL LETTER T + 'U' # 0xE4 -> LATIN CAPITAL LETTER U + 'V' # 0xE5 -> LATIN CAPITAL LETTER V + 'W' # 0xE6 -> LATIN CAPITAL LETTER W + 'X' # 0xE7 -> LATIN CAPITAL LETTER X + 'Y' # 0xE8 -> LATIN CAPITAL LETTER Y + 'Z' # 0xE9 -> LATIN CAPITAL LETTER Z + '\xb2' # 0xEA -> SUPERSCRIPT TWO + '\xd4' # 0xEB -> LATIN CAPITAL LETTER O WITH CIRCUMFLEX + '\\' # 0xEC -> REVERSE SOLIDUS + '\xd2' # 0xED -> LATIN CAPITAL LETTER O WITH GRAVE + '\xd3' # 0xEE -> LATIN CAPITAL LETTER O WITH ACUTE + '\xd5' # 0xEF -> LATIN CAPITAL LETTER O WITH TILDE + '0' # 0xF0 -> DIGIT ZERO + '1' # 0xF1 -> DIGIT ONE + '2' # 0xF2 -> DIGIT TWO + '3' # 0xF3 -> DIGIT THREE + '4' # 0xF4 -> DIGIT FOUR + '5' # 0xF5 -> DIGIT FIVE + '6' # 0xF6 -> DIGIT SIX + '7' # 0xF7 -> DIGIT SEVEN + '8' # 0xF8 -> DIGIT EIGHT + '9' # 0xF9 -> DIGIT NINE + '\xb3' # 0xFA -> SUPERSCRIPT THREE + '\xdb' # 0xFB -> LATIN CAPITAL LETTER U WITH CIRCUMFLEX + ']' # 0xFC -> RIGHT SQUARE BRACKET + '\xd9' # 0xFD -> LATIN CAPITAL LETTER U WITH GRAVE + '\xda' # 0xFE -> LATIN CAPITAL LETTER U WITH ACUTE + '\x9f' # 0xFF -> APPLICATION PROGRAM COMMAND (APC) +) + +### Encoding table +encoding_table=codecs.charmap_build(decoding_table) diff --git a/env/Lib/encodings/cp424.py b/env/Lib/encodings/cp424.py new file mode 100644 index 0000000..6753daf --- /dev/null +++ b/env/Lib/encodings/cp424.py @@ -0,0 +1,307 @@ +""" Python Character Mapping Codec cp424 generated from 'MAPPINGS/VENDORS/MISC/CP424.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='cp424', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) + + +### Decoding Table + +decoding_table = ( + '\x00' # 0x00 -> NULL + '\x01' # 0x01 -> START OF HEADING + '\x02' # 0x02 -> START OF TEXT + '\x03' # 0x03 -> END OF TEXT + '\x9c' # 0x04 -> SELECT + '\t' # 0x05 -> HORIZONTAL TABULATION + '\x86' # 0x06 -> REQUIRED NEW LINE + '\x7f' # 0x07 -> DELETE + '\x97' # 0x08 -> GRAPHIC ESCAPE + '\x8d' # 0x09 -> SUPERSCRIPT + '\x8e' # 0x0A -> REPEAT + '\x0b' # 0x0B -> VERTICAL TABULATION + '\x0c' # 0x0C -> FORM FEED + '\r' # 0x0D -> CARRIAGE RETURN + '\x0e' # 0x0E -> SHIFT OUT + '\x0f' # 0x0F -> SHIFT IN + '\x10' # 0x10 -> DATA LINK ESCAPE + '\x11' # 0x11 -> DEVICE CONTROL ONE + '\x12' # 0x12 -> DEVICE CONTROL TWO + '\x13' # 0x13 -> DEVICE CONTROL THREE + '\x9d' # 0x14 -> RESTORE/ENABLE PRESENTATION + '\x85' # 0x15 -> NEW LINE + '\x08' # 0x16 -> BACKSPACE + '\x87' # 0x17 -> PROGRAM OPERATOR COMMUNICATION + '\x18' # 0x18 -> CANCEL + '\x19' # 0x19 -> END OF MEDIUM + '\x92' # 0x1A -> UNIT BACK SPACE + '\x8f' # 0x1B -> CUSTOMER USE ONE + '\x1c' # 0x1C -> FILE SEPARATOR + '\x1d' # 0x1D -> GROUP SEPARATOR + '\x1e' # 0x1E -> RECORD SEPARATOR + '\x1f' # 0x1F -> UNIT SEPARATOR + '\x80' # 0x20 -> DIGIT SELECT + '\x81' # 0x21 -> START OF SIGNIFICANCE + '\x82' # 0x22 -> FIELD SEPARATOR + '\x83' # 0x23 -> WORD UNDERSCORE + '\x84' # 0x24 -> BYPASS OR INHIBIT PRESENTATION + '\n' # 0x25 -> LINE FEED + '\x17' # 0x26 -> END OF TRANSMISSION BLOCK + '\x1b' # 0x27 -> ESCAPE + '\x88' # 0x28 -> SET ATTRIBUTE + '\x89' # 0x29 -> START FIELD EXTENDED + '\x8a' # 0x2A -> SET MODE OR SWITCH + '\x8b' # 0x2B -> CONTROL SEQUENCE PREFIX + '\x8c' # 0x2C -> MODIFY FIELD ATTRIBUTE + '\x05' # 0x2D -> ENQUIRY + '\x06' # 0x2E -> ACKNOWLEDGE + '\x07' # 0x2F -> BELL + '\x90' # 0x30 -> + '\x91' # 0x31 -> + '\x16' # 0x32 -> SYNCHRONOUS IDLE + '\x93' # 0x33 -> INDEX RETURN + '\x94' # 0x34 -> PRESENTATION POSITION + '\x95' # 0x35 -> TRANSPARENT + '\x96' # 0x36 -> NUMERIC BACKSPACE + '\x04' # 0x37 -> END OF TRANSMISSION + '\x98' # 0x38 -> SUBSCRIPT + '\x99' # 0x39 -> INDENT TABULATION + '\x9a' # 0x3A -> REVERSE FORM FEED + '\x9b' # 0x3B -> CUSTOMER USE THREE + '\x14' # 0x3C -> DEVICE CONTROL FOUR + '\x15' # 0x3D -> NEGATIVE ACKNOWLEDGE + '\x9e' # 0x3E -> + '\x1a' # 0x3F -> SUBSTITUTE + ' ' # 0x40 -> SPACE + '\u05d0' # 0x41 -> HEBREW LETTER ALEF + '\u05d1' # 0x42 -> HEBREW LETTER BET + '\u05d2' # 0x43 -> HEBREW LETTER GIMEL + '\u05d3' # 0x44 -> HEBREW LETTER DALET + '\u05d4' # 0x45 -> HEBREW LETTER HE + '\u05d5' # 0x46 -> HEBREW LETTER VAV + '\u05d6' # 0x47 -> HEBREW LETTER ZAYIN + '\u05d7' # 0x48 -> HEBREW LETTER HET + '\u05d8' # 0x49 -> HEBREW LETTER TET + '\xa2' # 0x4A -> CENT SIGN + '.' # 0x4B -> FULL STOP + '<' # 0x4C -> LESS-THAN SIGN + '(' # 0x4D -> LEFT PARENTHESIS + '+' # 0x4E -> PLUS SIGN + '|' # 0x4F -> VERTICAL LINE + '&' # 0x50 -> AMPERSAND + '\u05d9' # 0x51 -> HEBREW LETTER YOD + '\u05da' # 0x52 -> HEBREW LETTER FINAL KAF + '\u05db' # 0x53 -> HEBREW LETTER KAF + '\u05dc' # 0x54 -> HEBREW LETTER LAMED + '\u05dd' # 0x55 -> HEBREW LETTER FINAL MEM + '\u05de' # 0x56 -> HEBREW LETTER MEM + '\u05df' # 0x57 -> HEBREW LETTER FINAL NUN + '\u05e0' # 0x58 -> HEBREW LETTER NUN + '\u05e1' # 0x59 -> HEBREW LETTER SAMEKH + '!' # 0x5A -> EXCLAMATION MARK + '$' # 0x5B -> DOLLAR SIGN + '*' # 0x5C -> ASTERISK + ')' # 0x5D -> RIGHT PARENTHESIS + ';' # 0x5E -> SEMICOLON + '\xac' # 0x5F -> NOT SIGN + '-' # 0x60 -> HYPHEN-MINUS + '/' # 0x61 -> SOLIDUS + '\u05e2' # 0x62 -> HEBREW LETTER AYIN + '\u05e3' # 0x63 -> HEBREW LETTER FINAL PE + '\u05e4' # 0x64 -> HEBREW LETTER PE + '\u05e5' # 0x65 -> HEBREW LETTER FINAL TSADI + '\u05e6' # 0x66 -> HEBREW LETTER TSADI + '\u05e7' # 0x67 -> HEBREW LETTER QOF + '\u05e8' # 0x68 -> HEBREW LETTER RESH + '\u05e9' # 0x69 -> HEBREW LETTER SHIN + '\xa6' # 0x6A -> BROKEN BAR + ',' # 0x6B -> COMMA + '%' # 0x6C -> PERCENT SIGN + '_' # 0x6D -> LOW LINE + '>' # 0x6E -> GREATER-THAN SIGN + '?' # 0x6F -> QUESTION MARK + '\ufffe' # 0x70 -> UNDEFINED + '\u05ea' # 0x71 -> HEBREW LETTER TAV + '\ufffe' # 0x72 -> UNDEFINED + '\ufffe' # 0x73 -> UNDEFINED + '\xa0' # 0x74 -> NO-BREAK SPACE + '\ufffe' # 0x75 -> UNDEFINED + '\ufffe' # 0x76 -> UNDEFINED + '\ufffe' # 0x77 -> UNDEFINED + '\u2017' # 0x78 -> DOUBLE LOW LINE + '`' # 0x79 -> GRAVE ACCENT + ':' # 0x7A -> COLON + '#' # 0x7B -> NUMBER SIGN + '@' # 0x7C -> COMMERCIAL AT + "'" # 0x7D -> APOSTROPHE + '=' # 0x7E -> EQUALS SIGN + '"' # 0x7F -> QUOTATION MARK + '\ufffe' # 0x80 -> UNDEFINED + 'a' # 0x81 -> LATIN SMALL LETTER A + 'b' # 0x82 -> LATIN SMALL LETTER B + 'c' # 0x83 -> LATIN SMALL LETTER C + 'd' # 0x84 -> LATIN SMALL LETTER D + 'e' # 0x85 -> LATIN SMALL LETTER E + 'f' # 0x86 -> LATIN SMALL LETTER F + 'g' # 0x87 -> LATIN SMALL LETTER G + 'h' # 0x88 -> LATIN SMALL LETTER H + 'i' # 0x89 -> LATIN SMALL LETTER I + '\xab' # 0x8A -> LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + '\xbb' # 0x8B -> RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + '\ufffe' # 0x8C -> UNDEFINED + '\ufffe' # 0x8D -> UNDEFINED + '\ufffe' # 0x8E -> UNDEFINED + '\xb1' # 0x8F -> PLUS-MINUS SIGN + '\xb0' # 0x90 -> DEGREE SIGN + 'j' # 0x91 -> LATIN SMALL LETTER J + 'k' # 0x92 -> LATIN SMALL LETTER K + 'l' # 0x93 -> LATIN SMALL LETTER L + 'm' # 0x94 -> LATIN SMALL LETTER M + 'n' # 0x95 -> LATIN SMALL LETTER N + 'o' # 0x96 -> LATIN SMALL LETTER O + 'p' # 0x97 -> LATIN SMALL LETTER P + 'q' # 0x98 -> LATIN SMALL LETTER Q + 'r' # 0x99 -> LATIN SMALL LETTER R + '\ufffe' # 0x9A -> UNDEFINED + '\ufffe' # 0x9B -> UNDEFINED + '\ufffe' # 0x9C -> UNDEFINED + '\xb8' # 0x9D -> CEDILLA + '\ufffe' # 0x9E -> UNDEFINED + '\xa4' # 0x9F -> CURRENCY SIGN + '\xb5' # 0xA0 -> MICRO SIGN + '~' # 0xA1 -> TILDE + 's' # 0xA2 -> LATIN SMALL LETTER S + 't' # 0xA3 -> LATIN SMALL LETTER T + 'u' # 0xA4 -> LATIN SMALL LETTER U + 'v' # 0xA5 -> LATIN SMALL LETTER V + 'w' # 0xA6 -> LATIN SMALL LETTER W + 'x' # 0xA7 -> LATIN SMALL LETTER X + 'y' # 0xA8 -> LATIN SMALL LETTER Y + 'z' # 0xA9 -> LATIN SMALL LETTER Z + '\ufffe' # 0xAA -> UNDEFINED + '\ufffe' # 0xAB -> UNDEFINED + '\ufffe' # 0xAC -> UNDEFINED + '\ufffe' # 0xAD -> UNDEFINED + '\ufffe' # 0xAE -> UNDEFINED + '\xae' # 0xAF -> REGISTERED SIGN + '^' # 0xB0 -> CIRCUMFLEX ACCENT + '\xa3' # 0xB1 -> POUND SIGN + '\xa5' # 0xB2 -> YEN SIGN + '\xb7' # 0xB3 -> MIDDLE DOT + '\xa9' # 0xB4 -> COPYRIGHT SIGN + '\xa7' # 0xB5 -> SECTION SIGN + '\xb6' # 0xB6 -> PILCROW SIGN + '\xbc' # 0xB7 -> VULGAR FRACTION ONE QUARTER + '\xbd' # 0xB8 -> VULGAR FRACTION ONE HALF + '\xbe' # 0xB9 -> VULGAR FRACTION THREE QUARTERS + '[' # 0xBA -> LEFT SQUARE BRACKET + ']' # 0xBB -> RIGHT SQUARE BRACKET + '\xaf' # 0xBC -> MACRON + '\xa8' # 0xBD -> DIAERESIS + '\xb4' # 0xBE -> ACUTE ACCENT + '\xd7' # 0xBF -> MULTIPLICATION SIGN + '{' # 0xC0 -> LEFT CURLY BRACKET + 'A' # 0xC1 -> LATIN CAPITAL LETTER A + 'B' # 0xC2 -> LATIN CAPITAL LETTER B + 'C' # 0xC3 -> LATIN CAPITAL LETTER C + 'D' # 0xC4 -> LATIN CAPITAL LETTER D + 'E' # 0xC5 -> LATIN CAPITAL LETTER E + 'F' # 0xC6 -> LATIN CAPITAL LETTER F + 'G' # 0xC7 -> LATIN CAPITAL LETTER G + 'H' # 0xC8 -> LATIN CAPITAL LETTER H + 'I' # 0xC9 -> LATIN CAPITAL LETTER I + '\xad' # 0xCA -> SOFT HYPHEN + '\ufffe' # 0xCB -> UNDEFINED + '\ufffe' # 0xCC -> UNDEFINED + '\ufffe' # 0xCD -> UNDEFINED + '\ufffe' # 0xCE -> UNDEFINED + '\ufffe' # 0xCF -> UNDEFINED + '}' # 0xD0 -> RIGHT CURLY BRACKET + 'J' # 0xD1 -> LATIN CAPITAL LETTER J + 'K' # 0xD2 -> LATIN CAPITAL LETTER K + 'L' # 0xD3 -> LATIN CAPITAL LETTER L + 'M' # 0xD4 -> LATIN CAPITAL LETTER M + 'N' # 0xD5 -> LATIN CAPITAL LETTER N + 'O' # 0xD6 -> LATIN CAPITAL LETTER O + 'P' # 0xD7 -> LATIN CAPITAL LETTER P + 'Q' # 0xD8 -> LATIN CAPITAL LETTER Q + 'R' # 0xD9 -> LATIN CAPITAL LETTER R + '\xb9' # 0xDA -> SUPERSCRIPT ONE + '\ufffe' # 0xDB -> UNDEFINED + '\ufffe' # 0xDC -> UNDEFINED + '\ufffe' # 0xDD -> UNDEFINED + '\ufffe' # 0xDE -> UNDEFINED + '\ufffe' # 0xDF -> UNDEFINED + '\\' # 0xE0 -> REVERSE SOLIDUS + '\xf7' # 0xE1 -> DIVISION SIGN + 'S' # 0xE2 -> LATIN CAPITAL LETTER S + 'T' # 0xE3 -> LATIN CAPITAL LETTER T + 'U' # 0xE4 -> LATIN CAPITAL LETTER U + 'V' # 0xE5 -> LATIN CAPITAL LETTER V + 'W' # 0xE6 -> LATIN CAPITAL LETTER W + 'X' # 0xE7 -> LATIN CAPITAL LETTER X + 'Y' # 0xE8 -> LATIN CAPITAL LETTER Y + 'Z' # 0xE9 -> LATIN CAPITAL LETTER Z + '\xb2' # 0xEA -> SUPERSCRIPT TWO + '\ufffe' # 0xEB -> UNDEFINED + '\ufffe' # 0xEC -> UNDEFINED + '\ufffe' # 0xED -> UNDEFINED + '\ufffe' # 0xEE -> UNDEFINED + '\ufffe' # 0xEF -> UNDEFINED + '0' # 0xF0 -> DIGIT ZERO + '1' # 0xF1 -> DIGIT ONE + '2' # 0xF2 -> DIGIT TWO + '3' # 0xF3 -> DIGIT THREE + '4' # 0xF4 -> DIGIT FOUR + '5' # 0xF5 -> DIGIT FIVE + '6' # 0xF6 -> DIGIT SIX + '7' # 0xF7 -> DIGIT SEVEN + '8' # 0xF8 -> DIGIT EIGHT + '9' # 0xF9 -> DIGIT NINE + '\xb3' # 0xFA -> SUPERSCRIPT THREE + '\ufffe' # 0xFB -> UNDEFINED + '\ufffe' # 0xFC -> UNDEFINED + '\ufffe' # 0xFD -> UNDEFINED + '\ufffe' # 0xFE -> UNDEFINED + '\x9f' # 0xFF -> EIGHT ONES +) + +### Encoding table +encoding_table=codecs.charmap_build(decoding_table) diff --git a/env/Lib/encodings/cp437.py b/env/Lib/encodings/cp437.py new file mode 100644 index 0000000..b6c75e2 --- /dev/null +++ b/env/Lib/encodings/cp437.py @@ -0,0 +1,698 @@ +""" Python Character Mapping Codec cp437 generated from 'VENDORS/MICSFT/PC/CP437.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_map) + + 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_map)[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='cp437', + 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: 0x00c7, # LATIN CAPITAL LETTER C WITH CEDILLA + 0x0081: 0x00fc, # LATIN SMALL LETTER U WITH DIAERESIS + 0x0082: 0x00e9, # LATIN SMALL LETTER E WITH ACUTE + 0x0083: 0x00e2, # LATIN SMALL LETTER A WITH CIRCUMFLEX + 0x0084: 0x00e4, # LATIN SMALL LETTER A WITH DIAERESIS + 0x0085: 0x00e0, # LATIN SMALL LETTER A WITH GRAVE + 0x0086: 0x00e5, # LATIN SMALL LETTER A WITH RING ABOVE + 0x0087: 0x00e7, # LATIN SMALL LETTER C WITH CEDILLA + 0x0088: 0x00ea, # LATIN SMALL LETTER E WITH CIRCUMFLEX + 0x0089: 0x00eb, # LATIN SMALL LETTER E WITH DIAERESIS + 0x008a: 0x00e8, # LATIN SMALL LETTER E WITH GRAVE + 0x008b: 0x00ef, # LATIN SMALL LETTER I WITH DIAERESIS + 0x008c: 0x00ee, # LATIN SMALL LETTER I WITH CIRCUMFLEX + 0x008d: 0x00ec, # LATIN SMALL LETTER I WITH GRAVE + 0x008e: 0x00c4, # LATIN CAPITAL LETTER A WITH DIAERESIS + 0x008f: 0x00c5, # LATIN CAPITAL LETTER A WITH RING ABOVE + 0x0090: 0x00c9, # LATIN CAPITAL LETTER E WITH ACUTE + 0x0091: 0x00e6, # LATIN SMALL LIGATURE AE + 0x0092: 0x00c6, # LATIN CAPITAL LIGATURE AE + 0x0093: 0x00f4, # LATIN SMALL LETTER O WITH CIRCUMFLEX + 0x0094: 0x00f6, # LATIN SMALL LETTER O WITH DIAERESIS + 0x0095: 0x00f2, # LATIN SMALL LETTER O WITH GRAVE + 0x0096: 0x00fb, # LATIN SMALL LETTER U WITH CIRCUMFLEX + 0x0097: 0x00f9, # LATIN SMALL LETTER U WITH GRAVE + 0x0098: 0x00ff, # LATIN SMALL LETTER Y WITH DIAERESIS + 0x0099: 0x00d6, # LATIN CAPITAL LETTER O WITH DIAERESIS + 0x009a: 0x00dc, # LATIN CAPITAL LETTER U WITH DIAERESIS + 0x009b: 0x00a2, # CENT SIGN + 0x009c: 0x00a3, # POUND SIGN + 0x009d: 0x00a5, # YEN SIGN + 0x009e: 0x20a7, # PESETA SIGN + 0x009f: 0x0192, # LATIN SMALL LETTER F WITH HOOK + 0x00a0: 0x00e1, # LATIN SMALL LETTER A WITH ACUTE + 0x00a1: 0x00ed, # LATIN SMALL LETTER I WITH ACUTE + 0x00a2: 0x00f3, # LATIN SMALL LETTER O WITH ACUTE + 0x00a3: 0x00fa, # LATIN SMALL LETTER U WITH ACUTE + 0x00a4: 0x00f1, # LATIN SMALL LETTER N WITH TILDE + 0x00a5: 0x00d1, # LATIN CAPITAL LETTER N WITH TILDE + 0x00a6: 0x00aa, # FEMININE ORDINAL INDICATOR + 0x00a7: 0x00ba, # MASCULINE ORDINAL INDICATOR + 0x00a8: 0x00bf, # INVERTED QUESTION MARK + 0x00a9: 0x2310, # REVERSED NOT SIGN + 0x00aa: 0x00ac, # NOT SIGN + 0x00ab: 0x00bd, # VULGAR FRACTION ONE HALF + 0x00ac: 0x00bc, # VULGAR FRACTION ONE QUARTER + 0x00ad: 0x00a1, # INVERTED EXCLAMATION MARK + 0x00ae: 0x00ab, # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00af: 0x00bb, # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00b0: 0x2591, # LIGHT SHADE + 0x00b1: 0x2592, # MEDIUM SHADE + 0x00b2: 0x2593, # DARK SHADE + 0x00b3: 0x2502, # BOX DRAWINGS LIGHT VERTICAL + 0x00b4: 0x2524, # BOX DRAWINGS LIGHT VERTICAL AND LEFT + 0x00b5: 0x2561, # BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE + 0x00b6: 0x2562, # BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE + 0x00b7: 0x2556, # BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE + 0x00b8: 0x2555, # BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE + 0x00b9: 0x2563, # BOX DRAWINGS DOUBLE VERTICAL AND LEFT + 0x00ba: 0x2551, # BOX DRAWINGS DOUBLE VERTICAL + 0x00bb: 0x2557, # BOX DRAWINGS DOUBLE DOWN AND LEFT + 0x00bc: 0x255d, # BOX DRAWINGS DOUBLE UP AND LEFT + 0x00bd: 0x255c, # BOX DRAWINGS UP DOUBLE AND LEFT SINGLE + 0x00be: 0x255b, # BOX DRAWINGS UP SINGLE AND LEFT DOUBLE + 0x00bf: 0x2510, # BOX DRAWINGS LIGHT DOWN AND LEFT + 0x00c0: 0x2514, # BOX DRAWINGS LIGHT UP AND RIGHT + 0x00c1: 0x2534, # BOX DRAWINGS LIGHT UP AND HORIZONTAL + 0x00c2: 0x252c, # BOX DRAWINGS LIGHT DOWN AND HORIZONTAL + 0x00c3: 0x251c, # BOX DRAWINGS LIGHT VERTICAL AND RIGHT + 0x00c4: 0x2500, # BOX DRAWINGS LIGHT HORIZONTAL + 0x00c5: 0x253c, # BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL + 0x00c6: 0x255e, # BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE + 0x00c7: 0x255f, # BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE + 0x00c8: 0x255a, # BOX DRAWINGS DOUBLE UP AND RIGHT + 0x00c9: 0x2554, # BOX DRAWINGS DOUBLE DOWN AND RIGHT + 0x00ca: 0x2569, # BOX DRAWINGS DOUBLE UP AND HORIZONTAL + 0x00cb: 0x2566, # BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL + 0x00cc: 0x2560, # BOX DRAWINGS DOUBLE VERTICAL AND RIGHT + 0x00cd: 0x2550, # BOX DRAWINGS DOUBLE HORIZONTAL + 0x00ce: 0x256c, # BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL + 0x00cf: 0x2567, # BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE + 0x00d0: 0x2568, # BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE + 0x00d1: 0x2564, # BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE + 0x00d2: 0x2565, # BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE + 0x00d3: 0x2559, # BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE + 0x00d4: 0x2558, # BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE + 0x00d5: 0x2552, # BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE + 0x00d6: 0x2553, # BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE + 0x00d7: 0x256b, # BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE + 0x00d8: 0x256a, # BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE + 0x00d9: 0x2518, # BOX DRAWINGS LIGHT UP AND LEFT + 0x00da: 0x250c, # BOX DRAWINGS LIGHT DOWN AND RIGHT + 0x00db: 0x2588, # FULL BLOCK + 0x00dc: 0x2584, # LOWER HALF BLOCK + 0x00dd: 0x258c, # LEFT HALF BLOCK + 0x00de: 0x2590, # RIGHT HALF BLOCK + 0x00df: 0x2580, # UPPER HALF BLOCK + 0x00e0: 0x03b1, # GREEK SMALL LETTER ALPHA + 0x00e1: 0x00df, # LATIN SMALL LETTER SHARP S + 0x00e2: 0x0393, # GREEK CAPITAL LETTER GAMMA + 0x00e3: 0x03c0, # GREEK SMALL LETTER PI + 0x00e4: 0x03a3, # GREEK CAPITAL LETTER SIGMA + 0x00e5: 0x03c3, # GREEK SMALL LETTER SIGMA + 0x00e6: 0x00b5, # MICRO SIGN + 0x00e7: 0x03c4, # GREEK SMALL LETTER TAU + 0x00e8: 0x03a6, # GREEK CAPITAL LETTER PHI + 0x00e9: 0x0398, # GREEK CAPITAL LETTER THETA + 0x00ea: 0x03a9, # GREEK CAPITAL LETTER OMEGA + 0x00eb: 0x03b4, # GREEK SMALL LETTER DELTA + 0x00ec: 0x221e, # INFINITY + 0x00ed: 0x03c6, # GREEK SMALL LETTER PHI + 0x00ee: 0x03b5, # GREEK SMALL LETTER EPSILON + 0x00ef: 0x2229, # INTERSECTION + 0x00f0: 0x2261, # IDENTICAL TO + 0x00f1: 0x00b1, # PLUS-MINUS SIGN + 0x00f2: 0x2265, # GREATER-THAN OR EQUAL TO + 0x00f3: 0x2264, # LESS-THAN OR EQUAL TO + 0x00f4: 0x2320, # TOP HALF INTEGRAL + 0x00f5: 0x2321, # BOTTOM HALF INTEGRAL + 0x00f6: 0x00f7, # DIVISION SIGN + 0x00f7: 0x2248, # ALMOST EQUAL TO + 0x00f8: 0x00b0, # DEGREE SIGN + 0x00f9: 0x2219, # BULLET OPERATOR + 0x00fa: 0x00b7, # MIDDLE DOT + 0x00fb: 0x221a, # SQUARE ROOT + 0x00fc: 0x207f, # SUPERSCRIPT LATIN SMALL LETTER N + 0x00fd: 0x00b2, # SUPERSCRIPT TWO + 0x00fe: 0x25a0, # BLACK SQUARE + 0x00ff: 0x00a0, # NO-BREAK SPACE +}) + +### Decoding Table + +decoding_table = ( + '\x00' # 0x0000 -> NULL + '\x01' # 0x0001 -> START OF HEADING + '\x02' # 0x0002 -> START OF TEXT + '\x03' # 0x0003 -> END OF TEXT + '\x04' # 0x0004 -> END OF TRANSMISSION + '\x05' # 0x0005 -> ENQUIRY + '\x06' # 0x0006 -> ACKNOWLEDGE + '\x07' # 0x0007 -> BELL + '\x08' # 0x0008 -> BACKSPACE + '\t' # 0x0009 -> HORIZONTAL TABULATION + '\n' # 0x000a -> LINE FEED + '\x0b' # 0x000b -> VERTICAL TABULATION + '\x0c' # 0x000c -> FORM FEED + '\r' # 0x000d -> CARRIAGE RETURN + '\x0e' # 0x000e -> SHIFT OUT + '\x0f' # 0x000f -> SHIFT IN + '\x10' # 0x0010 -> DATA LINK ESCAPE + '\x11' # 0x0011 -> DEVICE CONTROL ONE + '\x12' # 0x0012 -> DEVICE CONTROL TWO + '\x13' # 0x0013 -> DEVICE CONTROL THREE + '\x14' # 0x0014 -> DEVICE CONTROL FOUR + '\x15' # 0x0015 -> NEGATIVE ACKNOWLEDGE + '\x16' # 0x0016 -> SYNCHRONOUS IDLE + '\x17' # 0x0017 -> END OF TRANSMISSION BLOCK + '\x18' # 0x0018 -> CANCEL + '\x19' # 0x0019 -> END OF MEDIUM + '\x1a' # 0x001a -> SUBSTITUTE + '\x1b' # 0x001b -> ESCAPE + '\x1c' # 0x001c -> FILE SEPARATOR + '\x1d' # 0x001d -> GROUP SEPARATOR + '\x1e' # 0x001e -> RECORD SEPARATOR + '\x1f' # 0x001f -> UNIT SEPARATOR + ' ' # 0x0020 -> SPACE + '!' # 0x0021 -> EXCLAMATION MARK + '"' # 0x0022 -> QUOTATION MARK + '#' # 0x0023 -> NUMBER SIGN + '$' # 0x0024 -> DOLLAR SIGN + '%' # 0x0025 -> PERCENT SIGN + '&' # 0x0026 -> AMPERSAND + "'" # 0x0027 -> APOSTROPHE + '(' # 0x0028 -> LEFT PARENTHESIS + ')' # 0x0029 -> RIGHT PARENTHESIS + '*' # 0x002a -> ASTERISK + '+' # 0x002b -> PLUS SIGN + ',' # 0x002c -> COMMA + '-' # 0x002d -> HYPHEN-MINUS + '.' # 0x002e -> FULL STOP + '/' # 0x002f -> SOLIDUS + '0' # 0x0030 -> DIGIT ZERO + '1' # 0x0031 -> DIGIT ONE + '2' # 0x0032 -> DIGIT TWO + '3' # 0x0033 -> DIGIT THREE + '4' # 0x0034 -> DIGIT FOUR + '5' # 0x0035 -> DIGIT FIVE + '6' # 0x0036 -> DIGIT SIX + '7' # 0x0037 -> DIGIT SEVEN + '8' # 0x0038 -> DIGIT EIGHT + '9' # 0x0039 -> DIGIT NINE + ':' # 0x003a -> COLON + ';' # 0x003b -> SEMICOLON + '<' # 0x003c -> LESS-THAN SIGN + '=' # 0x003d -> EQUALS SIGN + '>' # 0x003e -> GREATER-THAN SIGN + '?' # 0x003f -> QUESTION MARK + '@' # 0x0040 -> COMMERCIAL AT + 'A' # 0x0041 -> LATIN CAPITAL LETTER A + 'B' # 0x0042 -> LATIN CAPITAL LETTER B + 'C' # 0x0043 -> LATIN CAPITAL LETTER C + 'D' # 0x0044 -> LATIN CAPITAL LETTER D + 'E' # 0x0045 -> LATIN CAPITAL LETTER E + 'F' # 0x0046 -> LATIN CAPITAL LETTER F + 'G' # 0x0047 -> LATIN CAPITAL LETTER G + 'H' # 0x0048 -> LATIN CAPITAL LETTER H + 'I' # 0x0049 -> LATIN CAPITAL LETTER I + 'J' # 0x004a -> LATIN CAPITAL LETTER J + 'K' # 0x004b -> LATIN CAPITAL LETTER K + 'L' # 0x004c -> LATIN CAPITAL LETTER L + 'M' # 0x004d -> LATIN CAPITAL LETTER M + 'N' # 0x004e -> LATIN CAPITAL LETTER N + 'O' # 0x004f -> LATIN CAPITAL LETTER O + 'P' # 0x0050 -> LATIN CAPITAL LETTER P + 'Q' # 0x0051 -> LATIN CAPITAL LETTER Q + 'R' # 0x0052 -> LATIN CAPITAL LETTER R + 'S' # 0x0053 -> LATIN CAPITAL LETTER S + 'T' # 0x0054 -> LATIN CAPITAL LETTER T + 'U' # 0x0055 -> LATIN CAPITAL LETTER U + 'V' # 0x0056 -> LATIN CAPITAL LETTER V + 'W' # 0x0057 -> LATIN CAPITAL LETTER W + 'X' # 0x0058 -> LATIN CAPITAL LETTER X + 'Y' # 0x0059 -> LATIN CAPITAL LETTER Y + 'Z' # 0x005a -> LATIN CAPITAL LETTER Z + '[' # 0x005b -> LEFT SQUARE BRACKET + '\\' # 0x005c -> REVERSE SOLIDUS + ']' # 0x005d -> RIGHT SQUARE BRACKET + '^' # 0x005e -> CIRCUMFLEX ACCENT + '_' # 0x005f -> LOW LINE + '`' # 0x0060 -> GRAVE ACCENT + 'a' # 0x0061 -> LATIN SMALL LETTER A + 'b' # 0x0062 -> LATIN SMALL LETTER B + 'c' # 0x0063 -> LATIN SMALL LETTER C + 'd' # 0x0064 -> LATIN SMALL LETTER D + 'e' # 0x0065 -> LATIN SMALL LETTER E + 'f' # 0x0066 -> LATIN SMALL LETTER F + 'g' # 0x0067 -> LATIN SMALL LETTER G + 'h' # 0x0068 -> LATIN SMALL LETTER H + 'i' # 0x0069 -> LATIN SMALL LETTER I + 'j' # 0x006a -> LATIN SMALL LETTER J + 'k' # 0x006b -> LATIN SMALL LETTER K + 'l' # 0x006c -> LATIN SMALL LETTER L + 'm' # 0x006d -> LATIN SMALL LETTER M + 'n' # 0x006e -> LATIN SMALL LETTER N + 'o' # 0x006f -> LATIN SMALL LETTER O + 'p' # 0x0070 -> LATIN SMALL LETTER P + 'q' # 0x0071 -> LATIN SMALL LETTER Q + 'r' # 0x0072 -> LATIN SMALL LETTER R + 's' # 0x0073 -> LATIN SMALL LETTER S + 't' # 0x0074 -> LATIN SMALL LETTER T + 'u' # 0x0075 -> LATIN SMALL LETTER U + 'v' # 0x0076 -> LATIN SMALL LETTER V + 'w' # 0x0077 -> LATIN SMALL LETTER W + 'x' # 0x0078 -> LATIN SMALL LETTER X + 'y' # 0x0079 -> LATIN SMALL LETTER Y + 'z' # 0x007a -> LATIN SMALL LETTER Z + '{' # 0x007b -> LEFT CURLY BRACKET + '|' # 0x007c -> VERTICAL LINE + '}' # 0x007d -> RIGHT CURLY BRACKET + '~' # 0x007e -> TILDE + '\x7f' # 0x007f -> DELETE + '\xc7' # 0x0080 -> LATIN CAPITAL LETTER C WITH CEDILLA + '\xfc' # 0x0081 -> LATIN SMALL LETTER U WITH DIAERESIS + '\xe9' # 0x0082 -> LATIN SMALL LETTER E WITH ACUTE + '\xe2' # 0x0083 -> LATIN SMALL LETTER A WITH CIRCUMFLEX + '\xe4' # 0x0084 -> LATIN SMALL LETTER A WITH DIAERESIS + '\xe0' # 0x0085 -> LATIN SMALL LETTER A WITH GRAVE + '\xe5' # 0x0086 -> LATIN SMALL LETTER A WITH RING ABOVE + '\xe7' # 0x0087 -> LATIN SMALL LETTER C WITH CEDILLA + '\xea' # 0x0088 -> LATIN SMALL LETTER E WITH CIRCUMFLEX + '\xeb' # 0x0089 -> LATIN SMALL LETTER E WITH DIAERESIS + '\xe8' # 0x008a -> LATIN SMALL LETTER E WITH GRAVE + '\xef' # 0x008b -> LATIN SMALL LETTER I WITH DIAERESIS + '\xee' # 0x008c -> LATIN SMALL LETTER I WITH CIRCUMFLEX + '\xec' # 0x008d -> LATIN SMALL LETTER I WITH GRAVE + '\xc4' # 0x008e -> LATIN CAPITAL LETTER A WITH DIAERESIS + '\xc5' # 0x008f -> LATIN CAPITAL LETTER A WITH RING ABOVE + '\xc9' # 0x0090 -> LATIN CAPITAL LETTER E WITH ACUTE + '\xe6' # 0x0091 -> LATIN SMALL LIGATURE AE + '\xc6' # 0x0092 -> LATIN CAPITAL LIGATURE AE + '\xf4' # 0x0093 -> LATIN SMALL LETTER O WITH CIRCUMFLEX + '\xf6' # 0x0094 -> LATIN SMALL LETTER O WITH DIAERESIS + '\xf2' # 0x0095 -> LATIN SMALL LETTER O WITH GRAVE + '\xfb' # 0x0096 -> LATIN SMALL LETTER U WITH CIRCUMFLEX + '\xf9' # 0x0097 -> LATIN SMALL LETTER U WITH GRAVE + '\xff' # 0x0098 -> LATIN SMALL LETTER Y WITH DIAERESIS + '\xd6' # 0x0099 -> LATIN CAPITAL LETTER O WITH DIAERESIS + '\xdc' # 0x009a -> LATIN CAPITAL LETTER U WITH DIAERESIS + '\xa2' # 0x009b -> CENT SIGN + '\xa3' # 0x009c -> POUND SIGN + '\xa5' # 0x009d -> YEN SIGN + '\u20a7' # 0x009e -> PESETA SIGN + '\u0192' # 0x009f -> LATIN SMALL LETTER F WITH HOOK + '\xe1' # 0x00a0 -> LATIN SMALL LETTER A WITH ACUTE + '\xed' # 0x00a1 -> LATIN SMALL LETTER I WITH ACUTE + '\xf3' # 0x00a2 -> LATIN SMALL LETTER O WITH ACUTE + '\xfa' # 0x00a3 -> LATIN SMALL LETTER U WITH ACUTE + '\xf1' # 0x00a4 -> LATIN SMALL LETTER N WITH TILDE + '\xd1' # 0x00a5 -> LATIN CAPITAL LETTER N WITH TILDE + '\xaa' # 0x00a6 -> FEMININE ORDINAL INDICATOR + '\xba' # 0x00a7 -> MASCULINE ORDINAL INDICATOR + '\xbf' # 0x00a8 -> INVERTED QUESTION MARK + '\u2310' # 0x00a9 -> REVERSED NOT SIGN + '\xac' # 0x00aa -> NOT SIGN + '\xbd' # 0x00ab -> VULGAR FRACTION ONE HALF + '\xbc' # 0x00ac -> VULGAR FRACTION ONE QUARTER + '\xa1' # 0x00ad -> INVERTED EXCLAMATION MARK + '\xab' # 0x00ae -> LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + '\xbb' # 0x00af -> RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + '\u2591' # 0x00b0 -> LIGHT SHADE + '\u2592' # 0x00b1 -> MEDIUM SHADE + '\u2593' # 0x00b2 -> DARK SHADE + '\u2502' # 0x00b3 -> BOX DRAWINGS LIGHT VERTICAL + '\u2524' # 0x00b4 -> BOX DRAWINGS LIGHT VERTICAL AND LEFT + '\u2561' # 0x00b5 -> BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE + '\u2562' # 0x00b6 -> BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE + '\u2556' # 0x00b7 -> BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE + '\u2555' # 0x00b8 -> BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE + '\u2563' # 0x00b9 -> BOX DRAWINGS DOUBLE VERTICAL AND LEFT + '\u2551' # 0x00ba -> BOX DRAWINGS DOUBLE VERTICAL + '\u2557' # 0x00bb -> BOX DRAWINGS DOUBLE DOWN AND LEFT + '\u255d' # 0x00bc -> BOX DRAWINGS DOUBLE UP AND LEFT + '\u255c' # 0x00bd -> BOX DRAWINGS UP DOUBLE AND LEFT SINGLE + '\u255b' # 0x00be -> BOX DRAWINGS UP SINGLE AND LEFT DOUBLE + '\u2510' # 0x00bf -> BOX DRAWINGS LIGHT DOWN AND LEFT + '\u2514' # 0x00c0 -> BOX DRAWINGS LIGHT UP AND RIGHT + '\u2534' # 0x00c1 -> BOX DRAWINGS LIGHT UP AND HORIZONTAL + '\u252c' # 0x00c2 -> BOX DRAWINGS LIGHT DOWN AND HORIZONTAL + '\u251c' # 0x00c3 -> BOX DRAWINGS LIGHT VERTICAL AND RIGHT + '\u2500' # 0x00c4 -> BOX DRAWINGS LIGHT HORIZONTAL + '\u253c' # 0x00c5 -> BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL + '\u255e' # 0x00c6 -> BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE + '\u255f' # 0x00c7 -> BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE + '\u255a' # 0x00c8 -> BOX DRAWINGS DOUBLE UP AND RIGHT + '\u2554' # 0x00c9 -> BOX DRAWINGS DOUBLE DOWN AND RIGHT + '\u2569' # 0x00ca -> BOX DRAWINGS DOUBLE UP AND HORIZONTAL + '\u2566' # 0x00cb -> BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL + '\u2560' # 0x00cc -> BOX DRAWINGS DOUBLE VERTICAL AND RIGHT + '\u2550' # 0x00cd -> BOX DRAWINGS DOUBLE HORIZONTAL + '\u256c' # 0x00ce -> BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL + '\u2567' # 0x00cf -> BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE + '\u2568' # 0x00d0 -> BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE + '\u2564' # 0x00d1 -> BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE + '\u2565' # 0x00d2 -> BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE + '\u2559' # 0x00d3 -> BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE + '\u2558' # 0x00d4 -> BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE + '\u2552' # 0x00d5 -> BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE + '\u2553' # 0x00d6 -> BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE + '\u256b' # 0x00d7 -> BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE + '\u256a' # 0x00d8 -> BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE + '\u2518' # 0x00d9 -> BOX DRAWINGS LIGHT UP AND LEFT + '\u250c' # 0x00da -> BOX DRAWINGS LIGHT DOWN AND RIGHT + '\u2588' # 0x00db -> FULL BLOCK + '\u2584' # 0x00dc -> LOWER HALF BLOCK + '\u258c' # 0x00dd -> LEFT HALF BLOCK + '\u2590' # 0x00de -> RIGHT HALF BLOCK + '\u2580' # 0x00df -> UPPER HALF BLOCK + '\u03b1' # 0x00e0 -> GREEK SMALL LETTER ALPHA + '\xdf' # 0x00e1 -> LATIN SMALL LETTER SHARP S + '\u0393' # 0x00e2 -> GREEK CAPITAL LETTER GAMMA + '\u03c0' # 0x00e3 -> GREEK SMALL LETTER PI + '\u03a3' # 0x00e4 -> GREEK CAPITAL LETTER SIGMA + '\u03c3' # 0x00e5 -> GREEK SMALL LETTER SIGMA + '\xb5' # 0x00e6 -> MICRO SIGN + '\u03c4' # 0x00e7 -> GREEK SMALL LETTER TAU + '\u03a6' # 0x00e8 -> GREEK CAPITAL LETTER PHI + '\u0398' # 0x00e9 -> GREEK CAPITAL LETTER THETA + '\u03a9' # 0x00ea -> GREEK CAPITAL LETTER OMEGA + '\u03b4' # 0x00eb -> GREEK SMALL LETTER DELTA + '\u221e' # 0x00ec -> INFINITY + '\u03c6' # 0x00ed -> GREEK SMALL LETTER PHI + '\u03b5' # 0x00ee -> GREEK SMALL LETTER EPSILON + '\u2229' # 0x00ef -> INTERSECTION + '\u2261' # 0x00f0 -> IDENTICAL TO + '\xb1' # 0x00f1 -> PLUS-MINUS SIGN + '\u2265' # 0x00f2 -> GREATER-THAN OR EQUAL TO + '\u2264' # 0x00f3 -> LESS-THAN OR EQUAL TO + '\u2320' # 0x00f4 -> TOP HALF INTEGRAL + '\u2321' # 0x00f5 -> BOTTOM HALF INTEGRAL + '\xf7' # 0x00f6 -> DIVISION SIGN + '\u2248' # 0x00f7 -> ALMOST EQUAL TO + '\xb0' # 0x00f8 -> DEGREE SIGN + '\u2219' # 0x00f9 -> BULLET OPERATOR + '\xb7' # 0x00fa -> MIDDLE DOT + '\u221a' # 0x00fb -> SQUARE ROOT + '\u207f' # 0x00fc -> SUPERSCRIPT LATIN SMALL LETTER N + '\xb2' # 0x00fd -> SUPERSCRIPT TWO + '\u25a0' # 0x00fe -> BLACK SQUARE + '\xa0' # 0x00ff -> NO-BREAK SPACE +) + +### Encoding Map + +encoding_map = { + 0x0000: 0x0000, # NULL + 0x0001: 0x0001, # START OF HEADING + 0x0002: 0x0002, # START OF TEXT + 0x0003: 0x0003, # END OF TEXT + 0x0004: 0x0004, # END OF TRANSMISSION + 0x0005: 0x0005, # ENQUIRY + 0x0006: 0x0006, # ACKNOWLEDGE + 0x0007: 0x0007, # BELL + 0x0008: 0x0008, # BACKSPACE + 0x0009: 0x0009, # HORIZONTAL TABULATION + 0x000a: 0x000a, # LINE FEED + 0x000b: 0x000b, # VERTICAL TABULATION + 0x000c: 0x000c, # FORM FEED + 0x000d: 0x000d, # CARRIAGE RETURN + 0x000e: 0x000e, # SHIFT OUT + 0x000f: 0x000f, # SHIFT IN + 0x0010: 0x0010, # DATA LINK ESCAPE + 0x0011: 0x0011, # DEVICE CONTROL ONE + 0x0012: 0x0012, # DEVICE CONTROL TWO + 0x0013: 0x0013, # DEVICE CONTROL THREE + 0x0014: 0x0014, # DEVICE CONTROL FOUR + 0x0015: 0x0015, # NEGATIVE ACKNOWLEDGE + 0x0016: 0x0016, # SYNCHRONOUS IDLE + 0x0017: 0x0017, # END OF TRANSMISSION BLOCK + 0x0018: 0x0018, # CANCEL + 0x0019: 0x0019, # END OF MEDIUM + 0x001a: 0x001a, # SUBSTITUTE + 0x001b: 0x001b, # ESCAPE + 0x001c: 0x001c, # FILE SEPARATOR + 0x001d: 0x001d, # GROUP SEPARATOR + 0x001e: 0x001e, # RECORD SEPARATOR + 0x001f: 0x001f, # UNIT SEPARATOR + 0x0020: 0x0020, # SPACE + 0x0021: 0x0021, # EXCLAMATION MARK + 0x0022: 0x0022, # QUOTATION MARK + 0x0023: 0x0023, # NUMBER SIGN + 0x0024: 0x0024, # DOLLAR SIGN + 0x0025: 0x0025, # PERCENT SIGN + 0x0026: 0x0026, # AMPERSAND + 0x0027: 0x0027, # APOSTROPHE + 0x0028: 0x0028, # LEFT PARENTHESIS + 0x0029: 0x0029, # RIGHT PARENTHESIS + 0x002a: 0x002a, # ASTERISK + 0x002b: 0x002b, # PLUS SIGN + 0x002c: 0x002c, # COMMA + 0x002d: 0x002d, # HYPHEN-MINUS + 0x002e: 0x002e, # FULL STOP + 0x002f: 0x002f, # SOLIDUS + 0x0030: 0x0030, # DIGIT ZERO + 0x0031: 0x0031, # DIGIT ONE + 0x0032: 0x0032, # DIGIT TWO + 0x0033: 0x0033, # DIGIT THREE + 0x0034: 0x0034, # DIGIT FOUR + 0x0035: 0x0035, # DIGIT FIVE + 0x0036: 0x0036, # DIGIT SIX + 0x0037: 0x0037, # DIGIT SEVEN + 0x0038: 0x0038, # DIGIT EIGHT + 0x0039: 0x0039, # DIGIT NINE + 0x003a: 0x003a, # COLON + 0x003b: 0x003b, # SEMICOLON + 0x003c: 0x003c, # LESS-THAN SIGN + 0x003d: 0x003d, # EQUALS SIGN + 0x003e: 0x003e, # GREATER-THAN SIGN + 0x003f: 0x003f, # QUESTION MARK + 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 + 0x005c: 0x005c, # REVERSE SOLIDUS + 0x005d: 0x005d, # RIGHT SQUARE BRACKET + 0x005e: 0x005e, # CIRCUMFLEX ACCENT + 0x005f: 0x005f, # LOW LINE + 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 + 0x007c: 0x007c, # VERTICAL LINE + 0x007d: 0x007d, # RIGHT CURLY BRACKET + 0x007e: 0x007e, # TILDE + 0x007f: 0x007f, # DELETE + 0x00a0: 0x00ff, # NO-BREAK SPACE + 0x00a1: 0x00ad, # INVERTED EXCLAMATION MARK + 0x00a2: 0x009b, # CENT SIGN + 0x00a3: 0x009c, # POUND SIGN + 0x00a5: 0x009d, # YEN SIGN + 0x00aa: 0x00a6, # FEMININE ORDINAL INDICATOR + 0x00ab: 0x00ae, # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00ac: 0x00aa, # NOT SIGN + 0x00b0: 0x00f8, # DEGREE SIGN + 0x00b1: 0x00f1, # PLUS-MINUS SIGN + 0x00b2: 0x00fd, # SUPERSCRIPT TWO + 0x00b5: 0x00e6, # MICRO SIGN + 0x00b7: 0x00fa, # MIDDLE DOT + 0x00ba: 0x00a7, # MASCULINE ORDINAL INDICATOR + 0x00bb: 0x00af, # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00bc: 0x00ac, # VULGAR FRACTION ONE QUARTER + 0x00bd: 0x00ab, # VULGAR FRACTION ONE HALF + 0x00bf: 0x00a8, # INVERTED QUESTION MARK + 0x00c4: 0x008e, # LATIN CAPITAL LETTER A WITH DIAERESIS + 0x00c5: 0x008f, # LATIN CAPITAL LETTER A WITH RING ABOVE + 0x00c6: 0x0092, # LATIN CAPITAL LIGATURE AE + 0x00c7: 0x0080, # LATIN CAPITAL LETTER C WITH CEDILLA + 0x00c9: 0x0090, # LATIN CAPITAL LETTER E WITH ACUTE + 0x00d1: 0x00a5, # LATIN CAPITAL LETTER N WITH TILDE + 0x00d6: 0x0099, # LATIN CAPITAL LETTER O WITH DIAERESIS + 0x00dc: 0x009a, # LATIN CAPITAL LETTER U WITH DIAERESIS + 0x00df: 0x00e1, # LATIN SMALL LETTER SHARP S + 0x00e0: 0x0085, # LATIN SMALL LETTER A WITH GRAVE + 0x00e1: 0x00a0, # LATIN SMALL LETTER A WITH ACUTE + 0x00e2: 0x0083, # LATIN SMALL LETTER A WITH CIRCUMFLEX + 0x00e4: 0x0084, # LATIN SMALL LETTER A WITH DIAERESIS + 0x00e5: 0x0086, # LATIN SMALL LETTER A WITH RING ABOVE + 0x00e6: 0x0091, # LATIN SMALL LIGATURE AE + 0x00e7: 0x0087, # LATIN SMALL LETTER C WITH CEDILLA + 0x00e8: 0x008a, # LATIN SMALL LETTER E WITH GRAVE + 0x00e9: 0x0082, # LATIN SMALL LETTER E WITH ACUTE + 0x00ea: 0x0088, # LATIN SMALL LETTER E WITH CIRCUMFLEX + 0x00eb: 0x0089, # LATIN SMALL LETTER E WITH DIAERESIS + 0x00ec: 0x008d, # LATIN SMALL LETTER I WITH GRAVE + 0x00ed: 0x00a1, # LATIN SMALL LETTER I WITH ACUTE + 0x00ee: 0x008c, # LATIN SMALL LETTER I WITH CIRCUMFLEX + 0x00ef: 0x008b, # LATIN SMALL LETTER I WITH DIAERESIS + 0x00f1: 0x00a4, # LATIN SMALL LETTER N WITH TILDE + 0x00f2: 0x0095, # LATIN SMALL LETTER O WITH GRAVE + 0x00f3: 0x00a2, # LATIN SMALL LETTER O WITH ACUTE + 0x00f4: 0x0093, # LATIN SMALL LETTER O WITH CIRCUMFLEX + 0x00f6: 0x0094, # LATIN SMALL LETTER O WITH DIAERESIS + 0x00f7: 0x00f6, # DIVISION SIGN + 0x00f9: 0x0097, # LATIN SMALL LETTER U WITH GRAVE + 0x00fa: 0x00a3, # LATIN SMALL LETTER U WITH ACUTE + 0x00fb: 0x0096, # LATIN SMALL LETTER U WITH CIRCUMFLEX + 0x00fc: 0x0081, # LATIN SMALL LETTER U WITH DIAERESIS + 0x00ff: 0x0098, # LATIN SMALL LETTER Y WITH DIAERESIS + 0x0192: 0x009f, # LATIN SMALL LETTER F WITH HOOK + 0x0393: 0x00e2, # GREEK CAPITAL LETTER GAMMA + 0x0398: 0x00e9, # GREEK CAPITAL LETTER THETA + 0x03a3: 0x00e4, # GREEK CAPITAL LETTER SIGMA + 0x03a6: 0x00e8, # GREEK CAPITAL LETTER PHI + 0x03a9: 0x00ea, # GREEK CAPITAL LETTER OMEGA + 0x03b1: 0x00e0, # GREEK SMALL LETTER ALPHA + 0x03b4: 0x00eb, # GREEK SMALL LETTER DELTA + 0x03b5: 0x00ee, # GREEK SMALL LETTER EPSILON + 0x03c0: 0x00e3, # GREEK SMALL LETTER PI + 0x03c3: 0x00e5, # GREEK SMALL LETTER SIGMA + 0x03c4: 0x00e7, # GREEK SMALL LETTER TAU + 0x03c6: 0x00ed, # GREEK SMALL LETTER PHI + 0x207f: 0x00fc, # SUPERSCRIPT LATIN SMALL LETTER N + 0x20a7: 0x009e, # PESETA SIGN + 0x2219: 0x00f9, # BULLET OPERATOR + 0x221a: 0x00fb, # SQUARE ROOT + 0x221e: 0x00ec, # INFINITY + 0x2229: 0x00ef, # INTERSECTION + 0x2248: 0x00f7, # ALMOST EQUAL TO + 0x2261: 0x00f0, # IDENTICAL TO + 0x2264: 0x00f3, # LESS-THAN OR EQUAL TO + 0x2265: 0x00f2, # GREATER-THAN OR EQUAL TO + 0x2310: 0x00a9, # REVERSED NOT SIGN + 0x2320: 0x00f4, # TOP HALF INTEGRAL + 0x2321: 0x00f5, # BOTTOM HALF INTEGRAL + 0x2500: 0x00c4, # BOX DRAWINGS LIGHT HORIZONTAL + 0x2502: 0x00b3, # BOX DRAWINGS LIGHT VERTICAL + 0x250c: 0x00da, # BOX DRAWINGS LIGHT DOWN AND RIGHT + 0x2510: 0x00bf, # BOX DRAWINGS LIGHT DOWN AND LEFT + 0x2514: 0x00c0, # BOX DRAWINGS LIGHT UP AND RIGHT + 0x2518: 0x00d9, # BOX DRAWINGS LIGHT UP AND LEFT + 0x251c: 0x00c3, # BOX DRAWINGS LIGHT VERTICAL AND RIGHT + 0x2524: 0x00b4, # BOX DRAWINGS LIGHT VERTICAL AND LEFT + 0x252c: 0x00c2, # BOX DRAWINGS LIGHT DOWN AND HORIZONTAL + 0x2534: 0x00c1, # BOX DRAWINGS LIGHT UP AND HORIZONTAL + 0x253c: 0x00c5, # BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL + 0x2550: 0x00cd, # BOX DRAWINGS DOUBLE HORIZONTAL + 0x2551: 0x00ba, # BOX DRAWINGS DOUBLE VERTICAL + 0x2552: 0x00d5, # BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE + 0x2553: 0x00d6, # BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE + 0x2554: 0x00c9, # BOX DRAWINGS DOUBLE DOWN AND RIGHT + 0x2555: 0x00b8, # BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE + 0x2556: 0x00b7, # BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE + 0x2557: 0x00bb, # BOX DRAWINGS DOUBLE DOWN AND LEFT + 0x2558: 0x00d4, # BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE + 0x2559: 0x00d3, # BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE + 0x255a: 0x00c8, # BOX DRAWINGS DOUBLE UP AND RIGHT + 0x255b: 0x00be, # BOX DRAWINGS UP SINGLE AND LEFT DOUBLE + 0x255c: 0x00bd, # BOX DRAWINGS UP DOUBLE AND LEFT SINGLE + 0x255d: 0x00bc, # BOX DRAWINGS DOUBLE UP AND LEFT + 0x255e: 0x00c6, # BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE + 0x255f: 0x00c7, # BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE + 0x2560: 0x00cc, # BOX DRAWINGS DOUBLE VERTICAL AND RIGHT + 0x2561: 0x00b5, # BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE + 0x2562: 0x00b6, # BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE + 0x2563: 0x00b9, # BOX DRAWINGS DOUBLE VERTICAL AND LEFT + 0x2564: 0x00d1, # BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE + 0x2565: 0x00d2, # BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE + 0x2566: 0x00cb, # BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL + 0x2567: 0x00cf, # BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE + 0x2568: 0x00d0, # BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE + 0x2569: 0x00ca, # BOX DRAWINGS DOUBLE UP AND HORIZONTAL + 0x256a: 0x00d8, # BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE + 0x256b: 0x00d7, # BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE + 0x256c: 0x00ce, # BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL + 0x2580: 0x00df, # UPPER HALF BLOCK + 0x2584: 0x00dc, # LOWER HALF BLOCK + 0x2588: 0x00db, # FULL BLOCK + 0x258c: 0x00dd, # LEFT HALF BLOCK + 0x2590: 0x00de, # RIGHT HALF BLOCK + 0x2591: 0x00b0, # LIGHT SHADE + 0x2592: 0x00b1, # MEDIUM SHADE + 0x2593: 0x00b2, # DARK SHADE + 0x25a0: 0x00fe, # BLACK SQUARE +} diff --git a/env/Lib/encodings/cp500.py b/env/Lib/encodings/cp500.py new file mode 100644 index 0000000..5f61535 --- /dev/null +++ b/env/Lib/encodings/cp500.py @@ -0,0 +1,307 @@ +""" Python Character Mapping Codec cp500 generated from 'MAPPINGS/VENDORS/MICSFT/EBCDIC/CP500.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='cp500', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) + + +### Decoding Table + +decoding_table = ( + '\x00' # 0x00 -> NULL + '\x01' # 0x01 -> START OF HEADING + '\x02' # 0x02 -> START OF TEXT + '\x03' # 0x03 -> END OF TEXT + '\x9c' # 0x04 -> CONTROL + '\t' # 0x05 -> HORIZONTAL TABULATION + '\x86' # 0x06 -> CONTROL + '\x7f' # 0x07 -> DELETE + '\x97' # 0x08 -> CONTROL + '\x8d' # 0x09 -> CONTROL + '\x8e' # 0x0A -> CONTROL + '\x0b' # 0x0B -> VERTICAL TABULATION + '\x0c' # 0x0C -> FORM FEED + '\r' # 0x0D -> CARRIAGE RETURN + '\x0e' # 0x0E -> SHIFT OUT + '\x0f' # 0x0F -> SHIFT IN + '\x10' # 0x10 -> DATA LINK ESCAPE + '\x11' # 0x11 -> DEVICE CONTROL ONE + '\x12' # 0x12 -> DEVICE CONTROL TWO + '\x13' # 0x13 -> DEVICE CONTROL THREE + '\x9d' # 0x14 -> CONTROL + '\x85' # 0x15 -> CONTROL + '\x08' # 0x16 -> BACKSPACE + '\x87' # 0x17 -> CONTROL + '\x18' # 0x18 -> CANCEL + '\x19' # 0x19 -> END OF MEDIUM + '\x92' # 0x1A -> CONTROL + '\x8f' # 0x1B -> CONTROL + '\x1c' # 0x1C -> FILE SEPARATOR + '\x1d' # 0x1D -> GROUP SEPARATOR + '\x1e' # 0x1E -> RECORD SEPARATOR + '\x1f' # 0x1F -> UNIT SEPARATOR + '\x80' # 0x20 -> CONTROL + '\x81' # 0x21 -> CONTROL + '\x82' # 0x22 -> CONTROL + '\x83' # 0x23 -> CONTROL + '\x84' # 0x24 -> CONTROL + '\n' # 0x25 -> LINE FEED + '\x17' # 0x26 -> END OF TRANSMISSION BLOCK + '\x1b' # 0x27 -> ESCAPE + '\x88' # 0x28 -> CONTROL + '\x89' # 0x29 -> CONTROL + '\x8a' # 0x2A -> CONTROL + '\x8b' # 0x2B -> CONTROL + '\x8c' # 0x2C -> CONTROL + '\x05' # 0x2D -> ENQUIRY + '\x06' # 0x2E -> ACKNOWLEDGE + '\x07' # 0x2F -> BELL + '\x90' # 0x30 -> CONTROL + '\x91' # 0x31 -> CONTROL + '\x16' # 0x32 -> SYNCHRONOUS IDLE + '\x93' # 0x33 -> CONTROL + '\x94' # 0x34 -> CONTROL + '\x95' # 0x35 -> CONTROL + '\x96' # 0x36 -> CONTROL + '\x04' # 0x37 -> END OF TRANSMISSION + '\x98' # 0x38 -> CONTROL + '\x99' # 0x39 -> CONTROL + '\x9a' # 0x3A -> CONTROL + '\x9b' # 0x3B -> CONTROL + '\x14' # 0x3C -> DEVICE CONTROL FOUR + '\x15' # 0x3D -> NEGATIVE ACKNOWLEDGE + '\x9e' # 0x3E -> CONTROL + '\x1a' # 0x3F -> SUBSTITUTE + ' ' # 0x40 -> SPACE + '\xa0' # 0x41 -> NO-BREAK SPACE + '\xe2' # 0x42 -> LATIN SMALL LETTER A WITH CIRCUMFLEX + '\xe4' # 0x43 -> LATIN SMALL LETTER A WITH DIAERESIS + '\xe0' # 0x44 -> LATIN SMALL LETTER A WITH GRAVE + '\xe1' # 0x45 -> LATIN SMALL LETTER A WITH ACUTE + '\xe3' # 0x46 -> LATIN SMALL LETTER A WITH TILDE + '\xe5' # 0x47 -> LATIN SMALL LETTER A WITH RING ABOVE + '\xe7' # 0x48 -> LATIN SMALL LETTER C WITH CEDILLA + '\xf1' # 0x49 -> LATIN SMALL LETTER N WITH TILDE + '[' # 0x4A -> LEFT SQUARE BRACKET + '.' # 0x4B -> FULL STOP + '<' # 0x4C -> LESS-THAN SIGN + '(' # 0x4D -> LEFT PARENTHESIS + '+' # 0x4E -> PLUS SIGN + '!' # 0x4F -> EXCLAMATION MARK + '&' # 0x50 -> AMPERSAND + '\xe9' # 0x51 -> LATIN SMALL LETTER E WITH ACUTE + '\xea' # 0x52 -> LATIN SMALL LETTER E WITH CIRCUMFLEX + '\xeb' # 0x53 -> LATIN SMALL LETTER E WITH DIAERESIS + '\xe8' # 0x54 -> LATIN SMALL LETTER E WITH GRAVE + '\xed' # 0x55 -> LATIN SMALL LETTER I WITH ACUTE + '\xee' # 0x56 -> LATIN SMALL LETTER I WITH CIRCUMFLEX + '\xef' # 0x57 -> LATIN SMALL LETTER I WITH DIAERESIS + '\xec' # 0x58 -> LATIN SMALL LETTER I WITH GRAVE + '\xdf' # 0x59 -> LATIN SMALL LETTER SHARP S (GERMAN) + ']' # 0x5A -> RIGHT SQUARE BRACKET + '$' # 0x5B -> DOLLAR SIGN + '*' # 0x5C -> ASTERISK + ')' # 0x5D -> RIGHT PARENTHESIS + ';' # 0x5E -> SEMICOLON + '^' # 0x5F -> CIRCUMFLEX ACCENT + '-' # 0x60 -> HYPHEN-MINUS + '/' # 0x61 -> SOLIDUS + '\xc2' # 0x62 -> LATIN CAPITAL LETTER A WITH CIRCUMFLEX + '\xc4' # 0x63 -> LATIN CAPITAL LETTER A WITH DIAERESIS + '\xc0' # 0x64 -> LATIN CAPITAL LETTER A WITH GRAVE + '\xc1' # 0x65 -> LATIN CAPITAL LETTER A WITH ACUTE + '\xc3' # 0x66 -> LATIN CAPITAL LETTER A WITH TILDE + '\xc5' # 0x67 -> LATIN CAPITAL LETTER A WITH RING ABOVE + '\xc7' # 0x68 -> LATIN CAPITAL LETTER C WITH CEDILLA + '\xd1' # 0x69 -> LATIN CAPITAL LETTER N WITH TILDE + '\xa6' # 0x6A -> BROKEN BAR + ',' # 0x6B -> COMMA + '%' # 0x6C -> PERCENT SIGN + '_' # 0x6D -> LOW LINE + '>' # 0x6E -> GREATER-THAN SIGN + '?' # 0x6F -> QUESTION MARK + '\xf8' # 0x70 -> LATIN SMALL LETTER O WITH STROKE + '\xc9' # 0x71 -> LATIN CAPITAL LETTER E WITH ACUTE + '\xca' # 0x72 -> LATIN CAPITAL LETTER E WITH CIRCUMFLEX + '\xcb' # 0x73 -> LATIN CAPITAL LETTER E WITH DIAERESIS + '\xc8' # 0x74 -> LATIN CAPITAL LETTER E WITH GRAVE + '\xcd' # 0x75 -> LATIN CAPITAL LETTER I WITH ACUTE + '\xce' # 0x76 -> LATIN CAPITAL LETTER I WITH CIRCUMFLEX + '\xcf' # 0x77 -> LATIN CAPITAL LETTER I WITH DIAERESIS + '\xcc' # 0x78 -> LATIN CAPITAL LETTER I WITH GRAVE + '`' # 0x79 -> GRAVE ACCENT + ':' # 0x7A -> COLON + '#' # 0x7B -> NUMBER SIGN + '@' # 0x7C -> COMMERCIAL AT + "'" # 0x7D -> APOSTROPHE + '=' # 0x7E -> EQUALS SIGN + '"' # 0x7F -> QUOTATION MARK + '\xd8' # 0x80 -> LATIN CAPITAL LETTER O WITH STROKE + 'a' # 0x81 -> LATIN SMALL LETTER A + 'b' # 0x82 -> LATIN SMALL LETTER B + 'c' # 0x83 -> LATIN SMALL LETTER C + 'd' # 0x84 -> LATIN SMALL LETTER D + 'e' # 0x85 -> LATIN SMALL LETTER E + 'f' # 0x86 -> LATIN SMALL LETTER F + 'g' # 0x87 -> LATIN SMALL LETTER G + 'h' # 0x88 -> LATIN SMALL LETTER H + 'i' # 0x89 -> LATIN SMALL LETTER I + '\xab' # 0x8A -> LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + '\xbb' # 0x8B -> RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + '\xf0' # 0x8C -> LATIN SMALL LETTER ETH (ICELANDIC) + '\xfd' # 0x8D -> LATIN SMALL LETTER Y WITH ACUTE + '\xfe' # 0x8E -> LATIN SMALL LETTER THORN (ICELANDIC) + '\xb1' # 0x8F -> PLUS-MINUS SIGN + '\xb0' # 0x90 -> DEGREE SIGN + 'j' # 0x91 -> LATIN SMALL LETTER J + 'k' # 0x92 -> LATIN SMALL LETTER K + 'l' # 0x93 -> LATIN SMALL LETTER L + 'm' # 0x94 -> LATIN SMALL LETTER M + 'n' # 0x95 -> LATIN SMALL LETTER N + 'o' # 0x96 -> LATIN SMALL LETTER O + 'p' # 0x97 -> LATIN SMALL LETTER P + 'q' # 0x98 -> LATIN SMALL LETTER Q + 'r' # 0x99 -> LATIN SMALL LETTER R + '\xaa' # 0x9A -> FEMININE ORDINAL INDICATOR + '\xba' # 0x9B -> MASCULINE ORDINAL INDICATOR + '\xe6' # 0x9C -> LATIN SMALL LIGATURE AE + '\xb8' # 0x9D -> CEDILLA + '\xc6' # 0x9E -> LATIN CAPITAL LIGATURE AE + '\xa4' # 0x9F -> CURRENCY SIGN + '\xb5' # 0xA0 -> MICRO SIGN + '~' # 0xA1 -> TILDE + 's' # 0xA2 -> LATIN SMALL LETTER S + 't' # 0xA3 -> LATIN SMALL LETTER T + 'u' # 0xA4 -> LATIN SMALL LETTER U + 'v' # 0xA5 -> LATIN SMALL LETTER V + 'w' # 0xA6 -> LATIN SMALL LETTER W + 'x' # 0xA7 -> LATIN SMALL LETTER X + 'y' # 0xA8 -> LATIN SMALL LETTER Y + 'z' # 0xA9 -> LATIN SMALL LETTER Z + '\xa1' # 0xAA -> INVERTED EXCLAMATION MARK + '\xbf' # 0xAB -> INVERTED QUESTION MARK + '\xd0' # 0xAC -> LATIN CAPITAL LETTER ETH (ICELANDIC) + '\xdd' # 0xAD -> LATIN CAPITAL LETTER Y WITH ACUTE + '\xde' # 0xAE -> LATIN CAPITAL LETTER THORN (ICELANDIC) + '\xae' # 0xAF -> REGISTERED SIGN + '\xa2' # 0xB0 -> CENT SIGN + '\xa3' # 0xB1 -> POUND SIGN + '\xa5' # 0xB2 -> YEN SIGN + '\xb7' # 0xB3 -> MIDDLE DOT + '\xa9' # 0xB4 -> COPYRIGHT SIGN + '\xa7' # 0xB5 -> SECTION SIGN + '\xb6' # 0xB6 -> PILCROW SIGN + '\xbc' # 0xB7 -> VULGAR FRACTION ONE QUARTER + '\xbd' # 0xB8 -> VULGAR FRACTION ONE HALF + '\xbe' # 0xB9 -> VULGAR FRACTION THREE QUARTERS + '\xac' # 0xBA -> NOT SIGN + '|' # 0xBB -> VERTICAL LINE + '\xaf' # 0xBC -> MACRON + '\xa8' # 0xBD -> DIAERESIS + '\xb4' # 0xBE -> ACUTE ACCENT + '\xd7' # 0xBF -> MULTIPLICATION SIGN + '{' # 0xC0 -> LEFT CURLY BRACKET + 'A' # 0xC1 -> LATIN CAPITAL LETTER A + 'B' # 0xC2 -> LATIN CAPITAL LETTER B + 'C' # 0xC3 -> LATIN CAPITAL LETTER C + 'D' # 0xC4 -> LATIN CAPITAL LETTER D + 'E' # 0xC5 -> LATIN CAPITAL LETTER E + 'F' # 0xC6 -> LATIN CAPITAL LETTER F + 'G' # 0xC7 -> LATIN CAPITAL LETTER G + 'H' # 0xC8 -> LATIN CAPITAL LETTER H + 'I' # 0xC9 -> LATIN CAPITAL LETTER I + '\xad' # 0xCA -> SOFT HYPHEN + '\xf4' # 0xCB -> LATIN SMALL LETTER O WITH CIRCUMFLEX + '\xf6' # 0xCC -> LATIN SMALL LETTER O WITH DIAERESIS + '\xf2' # 0xCD -> LATIN SMALL LETTER O WITH GRAVE + '\xf3' # 0xCE -> LATIN SMALL LETTER O WITH ACUTE + '\xf5' # 0xCF -> LATIN SMALL LETTER O WITH TILDE + '}' # 0xD0 -> RIGHT CURLY BRACKET + 'J' # 0xD1 -> LATIN CAPITAL LETTER J + 'K' # 0xD2 -> LATIN CAPITAL LETTER K + 'L' # 0xD3 -> LATIN CAPITAL LETTER L + 'M' # 0xD4 -> LATIN CAPITAL LETTER M + 'N' # 0xD5 -> LATIN CAPITAL LETTER N + 'O' # 0xD6 -> LATIN CAPITAL LETTER O + 'P' # 0xD7 -> LATIN CAPITAL LETTER P + 'Q' # 0xD8 -> LATIN CAPITAL LETTER Q + 'R' # 0xD9 -> LATIN CAPITAL LETTER R + '\xb9' # 0xDA -> SUPERSCRIPT ONE + '\xfb' # 0xDB -> LATIN SMALL LETTER U WITH CIRCUMFLEX + '\xfc' # 0xDC -> LATIN SMALL LETTER U WITH DIAERESIS + '\xf9' # 0xDD -> LATIN SMALL LETTER U WITH GRAVE + '\xfa' # 0xDE -> LATIN SMALL LETTER U WITH ACUTE + '\xff' # 0xDF -> LATIN SMALL LETTER Y WITH DIAERESIS + '\\' # 0xE0 -> REVERSE SOLIDUS + '\xf7' # 0xE1 -> DIVISION SIGN + 'S' # 0xE2 -> LATIN CAPITAL LETTER S + 'T' # 0xE3 -> LATIN CAPITAL LETTER T + 'U' # 0xE4 -> LATIN CAPITAL LETTER U + 'V' # 0xE5 -> LATIN CAPITAL LETTER V + 'W' # 0xE6 -> LATIN CAPITAL LETTER W + 'X' # 0xE7 -> LATIN CAPITAL LETTER X + 'Y' # 0xE8 -> LATIN CAPITAL LETTER Y + 'Z' # 0xE9 -> LATIN CAPITAL LETTER Z + '\xb2' # 0xEA -> SUPERSCRIPT TWO + '\xd4' # 0xEB -> LATIN CAPITAL LETTER O WITH CIRCUMFLEX + '\xd6' # 0xEC -> LATIN CAPITAL LETTER O WITH DIAERESIS + '\xd2' # 0xED -> LATIN CAPITAL LETTER O WITH GRAVE + '\xd3' # 0xEE -> LATIN CAPITAL LETTER O WITH ACUTE + '\xd5' # 0xEF -> LATIN CAPITAL LETTER O WITH TILDE + '0' # 0xF0 -> DIGIT ZERO + '1' # 0xF1 -> DIGIT ONE + '2' # 0xF2 -> DIGIT TWO + '3' # 0xF3 -> DIGIT THREE + '4' # 0xF4 -> DIGIT FOUR + '5' # 0xF5 -> DIGIT FIVE + '6' # 0xF6 -> DIGIT SIX + '7' # 0xF7 -> DIGIT SEVEN + '8' # 0xF8 -> DIGIT EIGHT + '9' # 0xF9 -> DIGIT NINE + '\xb3' # 0xFA -> SUPERSCRIPT THREE + '\xdb' # 0xFB -> LATIN CAPITAL LETTER U WITH CIRCUMFLEX + '\xdc' # 0xFC -> LATIN CAPITAL LETTER U WITH DIAERESIS + '\xd9' # 0xFD -> LATIN CAPITAL LETTER U WITH GRAVE + '\xda' # 0xFE -> LATIN CAPITAL LETTER U WITH ACUTE + '\x9f' # 0xFF -> CONTROL +) + +### Encoding table +encoding_table=codecs.charmap_build(decoding_table) diff --git a/env/Lib/encodings/cp65001.py b/env/Lib/encodings/cp65001.py new file mode 100644 index 0000000..95cb2ae --- /dev/null +++ b/env/Lib/encodings/cp65001.py @@ -0,0 +1,43 @@ +""" +Code page 65001: Windows UTF-8 (CP_UTF8). +""" + +import codecs +import functools + +if not hasattr(codecs, 'code_page_encode'): + raise LookupError("cp65001 encoding is only available on Windows") + +### Codec APIs + +encode = functools.partial(codecs.code_page_encode, 65001) +_decode = functools.partial(codecs.code_page_decode, 65001) + +def decode(input, errors='strict'): + return codecs.code_page_decode(65001, input, errors, True) + +class IncrementalEncoder(codecs.IncrementalEncoder): + def encode(self, input, final=False): + return encode(input, self.errors)[0] + +class IncrementalDecoder(codecs.BufferedIncrementalDecoder): + _buffer_decode = _decode + +class StreamWriter(codecs.StreamWriter): + encode = encode + +class StreamReader(codecs.StreamReader): + decode = _decode + +### encodings module API + +def getregentry(): + return codecs.CodecInfo( + name='cp65001', + encode=encode, + decode=decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) diff --git a/env/Lib/encodings/cp720.py b/env/Lib/encodings/cp720.py new file mode 100644 index 0000000..96d6096 --- /dev/null +++ b/env/Lib/encodings/cp720.py @@ -0,0 +1,309 @@ +"""Python Character Mapping Codec cp720 generated on Windows: +Vista 6.0.6002 SP2 Multiprocessor Free with the command: + python Tools/unicode/genwincodec.py 720 +"""#" + + +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='cp720', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) + + +### Decoding Table + +decoding_table = ( + '\x00' # 0x00 -> CONTROL CHARACTER + '\x01' # 0x01 -> CONTROL CHARACTER + '\x02' # 0x02 -> CONTROL CHARACTER + '\x03' # 0x03 -> CONTROL CHARACTER + '\x04' # 0x04 -> CONTROL CHARACTER + '\x05' # 0x05 -> CONTROL CHARACTER + '\x06' # 0x06 -> CONTROL CHARACTER + '\x07' # 0x07 -> CONTROL CHARACTER + '\x08' # 0x08 -> CONTROL CHARACTER + '\t' # 0x09 -> CONTROL CHARACTER + '\n' # 0x0A -> CONTROL CHARACTER + '\x0b' # 0x0B -> CONTROL CHARACTER + '\x0c' # 0x0C -> CONTROL CHARACTER + '\r' # 0x0D -> CONTROL CHARACTER + '\x0e' # 0x0E -> CONTROL CHARACTER + '\x0f' # 0x0F -> CONTROL CHARACTER + '\x10' # 0x10 -> CONTROL CHARACTER + '\x11' # 0x11 -> CONTROL CHARACTER + '\x12' # 0x12 -> CONTROL CHARACTER + '\x13' # 0x13 -> CONTROL CHARACTER + '\x14' # 0x14 -> CONTROL CHARACTER + '\x15' # 0x15 -> CONTROL CHARACTER + '\x16' # 0x16 -> CONTROL CHARACTER + '\x17' # 0x17 -> CONTROL CHARACTER + '\x18' # 0x18 -> CONTROL CHARACTER + '\x19' # 0x19 -> CONTROL CHARACTER + '\x1a' # 0x1A -> CONTROL CHARACTER + '\x1b' # 0x1B -> CONTROL CHARACTER + '\x1c' # 0x1C -> CONTROL CHARACTER + '\x1d' # 0x1D -> CONTROL CHARACTER + '\x1e' # 0x1E -> CONTROL CHARACTER + '\x1f' # 0x1F -> CONTROL CHARACTER + ' ' # 0x20 -> SPACE + '!' # 0x21 -> EXCLAMATION MARK + '"' # 0x22 -> QUOTATION MARK + '#' # 0x23 -> NUMBER SIGN + '$' # 0x24 -> DOLLAR SIGN + '%' # 0x25 -> PERCENT SIGN + '&' # 0x26 -> AMPERSAND + "'" # 0x27 -> APOSTROPHE + '(' # 0x28 -> LEFT PARENTHESIS + ')' # 0x29 -> RIGHT PARENTHESIS + '*' # 0x2A -> ASTERISK + '+' # 0x2B -> PLUS SIGN + ',' # 0x2C -> COMMA + '-' # 0x2D -> HYPHEN-MINUS + '.' # 0x2E -> FULL STOP + '/' # 0x2F -> SOLIDUS + '0' # 0x30 -> DIGIT ZERO + '1' # 0x31 -> DIGIT ONE + '2' # 0x32 -> DIGIT TWO + '3' # 0x33 -> DIGIT THREE + '4' # 0x34 -> DIGIT FOUR + '5' # 0x35 -> DIGIT FIVE + '6' # 0x36 -> DIGIT SIX + '7' # 0x37 -> DIGIT SEVEN + '8' # 0x38 -> DIGIT EIGHT + '9' # 0x39 -> DIGIT NINE + ':' # 0x3A -> COLON + ';' # 0x3B -> SEMICOLON + '<' # 0x3C -> LESS-THAN SIGN + '=' # 0x3D -> EQUALS SIGN + '>' # 0x3E -> GREATER-THAN SIGN + '?' # 0x3F -> QUESTION MARK + '@' # 0x40 -> COMMERCIAL AT + 'A' # 0x41 -> LATIN CAPITAL LETTER A + 'B' # 0x42 -> LATIN CAPITAL LETTER B + 'C' # 0x43 -> LATIN CAPITAL LETTER C + 'D' # 0x44 -> LATIN CAPITAL LETTER D + 'E' # 0x45 -> LATIN CAPITAL LETTER E + 'F' # 0x46 -> LATIN CAPITAL LETTER F + 'G' # 0x47 -> LATIN CAPITAL LETTER G + 'H' # 0x48 -> LATIN CAPITAL LETTER H + 'I' # 0x49 -> LATIN CAPITAL LETTER I + 'J' # 0x4A -> LATIN CAPITAL LETTER J + 'K' # 0x4B -> LATIN CAPITAL LETTER K + 'L' # 0x4C -> LATIN CAPITAL LETTER L + 'M' # 0x4D -> LATIN CAPITAL LETTER M + 'N' # 0x4E -> LATIN CAPITAL LETTER N + 'O' # 0x4F -> LATIN CAPITAL LETTER O + 'P' # 0x50 -> LATIN CAPITAL LETTER P + 'Q' # 0x51 -> LATIN CAPITAL LETTER Q + 'R' # 0x52 -> LATIN CAPITAL LETTER R + 'S' # 0x53 -> LATIN CAPITAL LETTER S + 'T' # 0x54 -> LATIN CAPITAL LETTER T + 'U' # 0x55 -> LATIN CAPITAL LETTER U + 'V' # 0x56 -> LATIN CAPITAL LETTER V + 'W' # 0x57 -> LATIN CAPITAL LETTER W + 'X' # 0x58 -> LATIN CAPITAL LETTER X + 'Y' # 0x59 -> LATIN CAPITAL LETTER Y + 'Z' # 0x5A -> LATIN CAPITAL LETTER Z + '[' # 0x5B -> LEFT SQUARE BRACKET + '\\' # 0x5C -> REVERSE SOLIDUS + ']' # 0x5D -> RIGHT SQUARE BRACKET + '^' # 0x5E -> CIRCUMFLEX ACCENT + '_' # 0x5F -> LOW LINE + '`' # 0x60 -> GRAVE ACCENT + 'a' # 0x61 -> LATIN SMALL LETTER A + 'b' # 0x62 -> LATIN SMALL LETTER B + 'c' # 0x63 -> LATIN SMALL LETTER C + 'd' # 0x64 -> LATIN SMALL LETTER D + 'e' # 0x65 -> LATIN SMALL LETTER E + 'f' # 0x66 -> LATIN SMALL LETTER F + 'g' # 0x67 -> LATIN SMALL LETTER G + 'h' # 0x68 -> LATIN SMALL LETTER H + 'i' # 0x69 -> LATIN SMALL LETTER I + 'j' # 0x6A -> LATIN SMALL LETTER J + 'k' # 0x6B -> LATIN SMALL LETTER K + 'l' # 0x6C -> LATIN SMALL LETTER L + 'm' # 0x6D -> LATIN SMALL LETTER M + 'n' # 0x6E -> LATIN SMALL LETTER N + 'o' # 0x6F -> LATIN SMALL LETTER O + 'p' # 0x70 -> LATIN SMALL LETTER P + 'q' # 0x71 -> LATIN SMALL LETTER Q + 'r' # 0x72 -> LATIN SMALL LETTER R + 's' # 0x73 -> LATIN SMALL LETTER S + 't' # 0x74 -> LATIN SMALL LETTER T + 'u' # 0x75 -> LATIN SMALL LETTER U + 'v' # 0x76 -> LATIN SMALL LETTER V + 'w' # 0x77 -> LATIN SMALL LETTER W + 'x' # 0x78 -> LATIN SMALL LETTER X + 'y' # 0x79 -> LATIN SMALL LETTER Y + 'z' # 0x7A -> LATIN SMALL LETTER Z + '{' # 0x7B -> LEFT CURLY BRACKET + '|' # 0x7C -> VERTICAL LINE + '}' # 0x7D -> RIGHT CURLY BRACKET + '~' # 0x7E -> TILDE + '\x7f' # 0x7F -> CONTROL CHARACTER + '\x80' + '\x81' + '\xe9' # 0x82 -> LATIN SMALL LETTER E WITH ACUTE + '\xe2' # 0x83 -> LATIN SMALL LETTER A WITH CIRCUMFLEX + '\x84' + '\xe0' # 0x85 -> LATIN SMALL LETTER A WITH GRAVE + '\x86' + '\xe7' # 0x87 -> LATIN SMALL LETTER C WITH CEDILLA + '\xea' # 0x88 -> LATIN SMALL LETTER E WITH CIRCUMFLEX + '\xeb' # 0x89 -> LATIN SMALL LETTER E WITH DIAERESIS + '\xe8' # 0x8A -> LATIN SMALL LETTER E WITH GRAVE + '\xef' # 0x8B -> LATIN SMALL LETTER I WITH DIAERESIS + '\xee' # 0x8C -> LATIN SMALL LETTER I WITH CIRCUMFLEX + '\x8d' + '\x8e' + '\x8f' + '\x90' + '\u0651' # 0x91 -> ARABIC SHADDA + '\u0652' # 0x92 -> ARABIC SUKUN + '\xf4' # 0x93 -> LATIN SMALL LETTER O WITH CIRCUMFLEX + '\xa4' # 0x94 -> CURRENCY SIGN + '\u0640' # 0x95 -> ARABIC TATWEEL + '\xfb' # 0x96 -> LATIN SMALL LETTER U WITH CIRCUMFLEX + '\xf9' # 0x97 -> LATIN SMALL LETTER U WITH GRAVE + '\u0621' # 0x98 -> ARABIC LETTER HAMZA + '\u0622' # 0x99 -> ARABIC LETTER ALEF WITH MADDA ABOVE + '\u0623' # 0x9A -> ARABIC LETTER ALEF WITH HAMZA ABOVE + '\u0624' # 0x9B -> ARABIC LETTER WAW WITH HAMZA ABOVE + '\xa3' # 0x9C -> POUND SIGN + '\u0625' # 0x9D -> ARABIC LETTER ALEF WITH HAMZA BELOW + '\u0626' # 0x9E -> ARABIC LETTER YEH WITH HAMZA ABOVE + '\u0627' # 0x9F -> ARABIC LETTER ALEF + '\u0628' # 0xA0 -> ARABIC LETTER BEH + '\u0629' # 0xA1 -> ARABIC LETTER TEH MARBUTA + '\u062a' # 0xA2 -> ARABIC LETTER TEH + '\u062b' # 0xA3 -> ARABIC LETTER THEH + '\u062c' # 0xA4 -> ARABIC LETTER JEEM + '\u062d' # 0xA5 -> ARABIC LETTER HAH + '\u062e' # 0xA6 -> ARABIC LETTER KHAH + '\u062f' # 0xA7 -> ARABIC LETTER DAL + '\u0630' # 0xA8 -> ARABIC LETTER THAL + '\u0631' # 0xA9 -> ARABIC LETTER REH + '\u0632' # 0xAA -> ARABIC LETTER ZAIN + '\u0633' # 0xAB -> ARABIC LETTER SEEN + '\u0634' # 0xAC -> ARABIC LETTER SHEEN + '\u0635' # 0xAD -> ARABIC LETTER SAD + '\xab' # 0xAE -> LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + '\xbb' # 0xAF -> RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + '\u2591' # 0xB0 -> LIGHT SHADE + '\u2592' # 0xB1 -> MEDIUM SHADE + '\u2593' # 0xB2 -> DARK SHADE + '\u2502' # 0xB3 -> BOX DRAWINGS LIGHT VERTICAL + '\u2524' # 0xB4 -> BOX DRAWINGS LIGHT VERTICAL AND LEFT + '\u2561' # 0xB5 -> BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE + '\u2562' # 0xB6 -> BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE + '\u2556' # 0xB7 -> BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE + '\u2555' # 0xB8 -> BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE + '\u2563' # 0xB9 -> BOX DRAWINGS DOUBLE VERTICAL AND LEFT + '\u2551' # 0xBA -> BOX DRAWINGS DOUBLE VERTICAL + '\u2557' # 0xBB -> BOX DRAWINGS DOUBLE DOWN AND LEFT + '\u255d' # 0xBC -> BOX DRAWINGS DOUBLE UP AND LEFT + '\u255c' # 0xBD -> BOX DRAWINGS UP DOUBLE AND LEFT SINGLE + '\u255b' # 0xBE -> BOX DRAWINGS UP SINGLE AND LEFT DOUBLE + '\u2510' # 0xBF -> BOX DRAWINGS LIGHT DOWN AND LEFT + '\u2514' # 0xC0 -> BOX DRAWINGS LIGHT UP AND RIGHT + '\u2534' # 0xC1 -> BOX DRAWINGS LIGHT UP AND HORIZONTAL + '\u252c' # 0xC2 -> BOX DRAWINGS LIGHT DOWN AND HORIZONTAL + '\u251c' # 0xC3 -> BOX DRAWINGS LIGHT VERTICAL AND RIGHT + '\u2500' # 0xC4 -> BOX DRAWINGS LIGHT HORIZONTAL + '\u253c' # 0xC5 -> BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL + '\u255e' # 0xC6 -> BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE + '\u255f' # 0xC7 -> BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE + '\u255a' # 0xC8 -> BOX DRAWINGS DOUBLE UP AND RIGHT + '\u2554' # 0xC9 -> BOX DRAWINGS DOUBLE DOWN AND RIGHT + '\u2569' # 0xCA -> BOX DRAWINGS DOUBLE UP AND HORIZONTAL + '\u2566' # 0xCB -> BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL + '\u2560' # 0xCC -> BOX DRAWINGS DOUBLE VERTICAL AND RIGHT + '\u2550' # 0xCD -> BOX DRAWINGS DOUBLE HORIZONTAL + '\u256c' # 0xCE -> BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL + '\u2567' # 0xCF -> BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE + '\u2568' # 0xD0 -> BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE + '\u2564' # 0xD1 -> BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE + '\u2565' # 0xD2 -> BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE + '\u2559' # 0xD3 -> BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE + '\u2558' # 0xD4 -> BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE + '\u2552' # 0xD5 -> BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE + '\u2553' # 0xD6 -> BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE + '\u256b' # 0xD7 -> BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE + '\u256a' # 0xD8 -> BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE + '\u2518' # 0xD9 -> BOX DRAWINGS LIGHT UP AND LEFT + '\u250c' # 0xDA -> BOX DRAWINGS LIGHT DOWN AND RIGHT + '\u2588' # 0xDB -> FULL BLOCK + '\u2584' # 0xDC -> LOWER HALF BLOCK + '\u258c' # 0xDD -> LEFT HALF BLOCK + '\u2590' # 0xDE -> RIGHT HALF BLOCK + '\u2580' # 0xDF -> UPPER HALF BLOCK + '\u0636' # 0xE0 -> ARABIC LETTER DAD + '\u0637' # 0xE1 -> ARABIC LETTER TAH + '\u0638' # 0xE2 -> ARABIC LETTER ZAH + '\u0639' # 0xE3 -> ARABIC LETTER AIN + '\u063a' # 0xE4 -> ARABIC LETTER GHAIN + '\u0641' # 0xE5 -> ARABIC LETTER FEH + '\xb5' # 0xE6 -> MICRO SIGN + '\u0642' # 0xE7 -> ARABIC LETTER QAF + '\u0643' # 0xE8 -> ARABIC LETTER KAF + '\u0644' # 0xE9 -> ARABIC LETTER LAM + '\u0645' # 0xEA -> ARABIC LETTER MEEM + '\u0646' # 0xEB -> ARABIC LETTER NOON + '\u0647' # 0xEC -> ARABIC LETTER HEH + '\u0648' # 0xED -> ARABIC LETTER WAW + '\u0649' # 0xEE -> ARABIC LETTER ALEF MAKSURA + '\u064a' # 0xEF -> ARABIC LETTER YEH + '\u2261' # 0xF0 -> IDENTICAL TO + '\u064b' # 0xF1 -> ARABIC FATHATAN + '\u064c' # 0xF2 -> ARABIC DAMMATAN + '\u064d' # 0xF3 -> ARABIC KASRATAN + '\u064e' # 0xF4 -> ARABIC FATHA + '\u064f' # 0xF5 -> ARABIC DAMMA + '\u0650' # 0xF6 -> ARABIC KASRA + '\u2248' # 0xF7 -> ALMOST EQUAL TO + '\xb0' # 0xF8 -> DEGREE SIGN + '\u2219' # 0xF9 -> BULLET OPERATOR + '\xb7' # 0xFA -> MIDDLE DOT + '\u221a' # 0xFB -> SQUARE ROOT + '\u207f' # 0xFC -> SUPERSCRIPT LATIN SMALL LETTER N + '\xb2' # 0xFD -> SUPERSCRIPT TWO + '\u25a0' # 0xFE -> BLACK SQUARE + '\xa0' # 0xFF -> NO-BREAK SPACE +) + +### Encoding table +encoding_table=codecs.charmap_build(decoding_table) diff --git a/env/Lib/encodings/cp737.py b/env/Lib/encodings/cp737.py new file mode 100644 index 0000000..9685bae --- /dev/null +++ b/env/Lib/encodings/cp737.py @@ -0,0 +1,698 @@ +""" Python Character Mapping Codec cp737 generated from 'VENDORS/MICSFT/PC/CP737.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_map) + + 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_map)[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='cp737', + 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: 0x0391, # GREEK CAPITAL LETTER ALPHA + 0x0081: 0x0392, # GREEK CAPITAL LETTER BETA + 0x0082: 0x0393, # GREEK CAPITAL LETTER GAMMA + 0x0083: 0x0394, # GREEK CAPITAL LETTER DELTA + 0x0084: 0x0395, # GREEK CAPITAL LETTER EPSILON + 0x0085: 0x0396, # GREEK CAPITAL LETTER ZETA + 0x0086: 0x0397, # GREEK CAPITAL LETTER ETA + 0x0087: 0x0398, # GREEK CAPITAL LETTER THETA + 0x0088: 0x0399, # GREEK CAPITAL LETTER IOTA + 0x0089: 0x039a, # GREEK CAPITAL LETTER KAPPA + 0x008a: 0x039b, # GREEK CAPITAL LETTER LAMDA + 0x008b: 0x039c, # GREEK CAPITAL LETTER MU + 0x008c: 0x039d, # GREEK CAPITAL LETTER NU + 0x008d: 0x039e, # GREEK CAPITAL LETTER XI + 0x008e: 0x039f, # GREEK CAPITAL LETTER OMICRON + 0x008f: 0x03a0, # GREEK CAPITAL LETTER PI + 0x0090: 0x03a1, # GREEK CAPITAL LETTER RHO + 0x0091: 0x03a3, # GREEK CAPITAL LETTER SIGMA + 0x0092: 0x03a4, # GREEK CAPITAL LETTER TAU + 0x0093: 0x03a5, # GREEK CAPITAL LETTER UPSILON + 0x0094: 0x03a6, # GREEK CAPITAL LETTER PHI + 0x0095: 0x03a7, # GREEK CAPITAL LETTER CHI + 0x0096: 0x03a8, # GREEK CAPITAL LETTER PSI + 0x0097: 0x03a9, # GREEK CAPITAL LETTER OMEGA + 0x0098: 0x03b1, # GREEK SMALL LETTER ALPHA + 0x0099: 0x03b2, # GREEK SMALL LETTER BETA + 0x009a: 0x03b3, # GREEK SMALL LETTER GAMMA + 0x009b: 0x03b4, # GREEK SMALL LETTER DELTA + 0x009c: 0x03b5, # GREEK SMALL LETTER EPSILON + 0x009d: 0x03b6, # GREEK SMALL LETTER ZETA + 0x009e: 0x03b7, # GREEK SMALL LETTER ETA + 0x009f: 0x03b8, # GREEK SMALL LETTER THETA + 0x00a0: 0x03b9, # GREEK SMALL LETTER IOTA + 0x00a1: 0x03ba, # GREEK SMALL LETTER KAPPA + 0x00a2: 0x03bb, # GREEK SMALL LETTER LAMDA + 0x00a3: 0x03bc, # GREEK SMALL LETTER MU + 0x00a4: 0x03bd, # GREEK SMALL LETTER NU + 0x00a5: 0x03be, # GREEK SMALL LETTER XI + 0x00a6: 0x03bf, # GREEK SMALL LETTER OMICRON + 0x00a7: 0x03c0, # GREEK SMALL LETTER PI + 0x00a8: 0x03c1, # GREEK SMALL LETTER RHO + 0x00a9: 0x03c3, # GREEK SMALL LETTER SIGMA + 0x00aa: 0x03c2, # GREEK SMALL LETTER FINAL SIGMA + 0x00ab: 0x03c4, # GREEK SMALL LETTER TAU + 0x00ac: 0x03c5, # GREEK SMALL LETTER UPSILON + 0x00ad: 0x03c6, # GREEK SMALL LETTER PHI + 0x00ae: 0x03c7, # GREEK SMALL LETTER CHI + 0x00af: 0x03c8, # GREEK SMALL LETTER PSI + 0x00b0: 0x2591, # LIGHT SHADE + 0x00b1: 0x2592, # MEDIUM SHADE + 0x00b2: 0x2593, # DARK SHADE + 0x00b3: 0x2502, # BOX DRAWINGS LIGHT VERTICAL + 0x00b4: 0x2524, # BOX DRAWINGS LIGHT VERTICAL AND LEFT + 0x00b5: 0x2561, # BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE + 0x00b6: 0x2562, # BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE + 0x00b7: 0x2556, # BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE + 0x00b8: 0x2555, # BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE + 0x00b9: 0x2563, # BOX DRAWINGS DOUBLE VERTICAL AND LEFT + 0x00ba: 0x2551, # BOX DRAWINGS DOUBLE VERTICAL + 0x00bb: 0x2557, # BOX DRAWINGS DOUBLE DOWN AND LEFT + 0x00bc: 0x255d, # BOX DRAWINGS DOUBLE UP AND LEFT + 0x00bd: 0x255c, # BOX DRAWINGS UP DOUBLE AND LEFT SINGLE + 0x00be: 0x255b, # BOX DRAWINGS UP SINGLE AND LEFT DOUBLE + 0x00bf: 0x2510, # BOX DRAWINGS LIGHT DOWN AND LEFT + 0x00c0: 0x2514, # BOX DRAWINGS LIGHT UP AND RIGHT + 0x00c1: 0x2534, # BOX DRAWINGS LIGHT UP AND HORIZONTAL + 0x00c2: 0x252c, # BOX DRAWINGS LIGHT DOWN AND HORIZONTAL + 0x00c3: 0x251c, # BOX DRAWINGS LIGHT VERTICAL AND RIGHT + 0x00c4: 0x2500, # BOX DRAWINGS LIGHT HORIZONTAL + 0x00c5: 0x253c, # BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL + 0x00c6: 0x255e, # BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE + 0x00c7: 0x255f, # BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE + 0x00c8: 0x255a, # BOX DRAWINGS DOUBLE UP AND RIGHT + 0x00c9: 0x2554, # BOX DRAWINGS DOUBLE DOWN AND RIGHT + 0x00ca: 0x2569, # BOX DRAWINGS DOUBLE UP AND HORIZONTAL + 0x00cb: 0x2566, # BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL + 0x00cc: 0x2560, # BOX DRAWINGS DOUBLE VERTICAL AND RIGHT + 0x00cd: 0x2550, # BOX DRAWINGS DOUBLE HORIZONTAL + 0x00ce: 0x256c, # BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL + 0x00cf: 0x2567, # BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE + 0x00d0: 0x2568, # BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE + 0x00d1: 0x2564, # BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE + 0x00d2: 0x2565, # BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE + 0x00d3: 0x2559, # BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE + 0x00d4: 0x2558, # BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE + 0x00d5: 0x2552, # BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE + 0x00d6: 0x2553, # BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE + 0x00d7: 0x256b, # BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE + 0x00d8: 0x256a, # BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE + 0x00d9: 0x2518, # BOX DRAWINGS LIGHT UP AND LEFT + 0x00da: 0x250c, # BOX DRAWINGS LIGHT DOWN AND RIGHT + 0x00db: 0x2588, # FULL BLOCK + 0x00dc: 0x2584, # LOWER HALF BLOCK + 0x00dd: 0x258c, # LEFT HALF BLOCK + 0x00de: 0x2590, # RIGHT HALF BLOCK + 0x00df: 0x2580, # UPPER HALF BLOCK + 0x00e0: 0x03c9, # GREEK SMALL LETTER OMEGA + 0x00e1: 0x03ac, # GREEK SMALL LETTER ALPHA WITH TONOS + 0x00e2: 0x03ad, # GREEK SMALL LETTER EPSILON WITH TONOS + 0x00e3: 0x03ae, # GREEK SMALL LETTER ETA WITH TONOS + 0x00e4: 0x03ca, # GREEK SMALL LETTER IOTA WITH DIALYTIKA + 0x00e5: 0x03af, # GREEK SMALL LETTER IOTA WITH TONOS + 0x00e6: 0x03cc, # GREEK SMALL LETTER OMICRON WITH TONOS + 0x00e7: 0x03cd, # GREEK SMALL LETTER UPSILON WITH TONOS + 0x00e8: 0x03cb, # GREEK SMALL LETTER UPSILON WITH DIALYTIKA + 0x00e9: 0x03ce, # GREEK SMALL LETTER OMEGA WITH TONOS + 0x00ea: 0x0386, # GREEK CAPITAL LETTER ALPHA WITH TONOS + 0x00eb: 0x0388, # GREEK CAPITAL LETTER EPSILON WITH TONOS + 0x00ec: 0x0389, # GREEK CAPITAL LETTER ETA WITH TONOS + 0x00ed: 0x038a, # GREEK CAPITAL LETTER IOTA WITH TONOS + 0x00ee: 0x038c, # GREEK CAPITAL LETTER OMICRON WITH TONOS + 0x00ef: 0x038e, # GREEK CAPITAL LETTER UPSILON WITH TONOS + 0x00f0: 0x038f, # GREEK CAPITAL LETTER OMEGA WITH TONOS + 0x00f1: 0x00b1, # PLUS-MINUS SIGN + 0x00f2: 0x2265, # GREATER-THAN OR EQUAL TO + 0x00f3: 0x2264, # LESS-THAN OR EQUAL TO + 0x00f4: 0x03aa, # GREEK CAPITAL LETTER IOTA WITH DIALYTIKA + 0x00f5: 0x03ab, # GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA + 0x00f6: 0x00f7, # DIVISION SIGN + 0x00f7: 0x2248, # ALMOST EQUAL TO + 0x00f8: 0x00b0, # DEGREE SIGN + 0x00f9: 0x2219, # BULLET OPERATOR + 0x00fa: 0x00b7, # MIDDLE DOT + 0x00fb: 0x221a, # SQUARE ROOT + 0x00fc: 0x207f, # SUPERSCRIPT LATIN SMALL LETTER N + 0x00fd: 0x00b2, # SUPERSCRIPT TWO + 0x00fe: 0x25a0, # BLACK SQUARE + 0x00ff: 0x00a0, # NO-BREAK SPACE +}) + +### Decoding Table + +decoding_table = ( + '\x00' # 0x0000 -> NULL + '\x01' # 0x0001 -> START OF HEADING + '\x02' # 0x0002 -> START OF TEXT + '\x03' # 0x0003 -> END OF TEXT + '\x04' # 0x0004 -> END OF TRANSMISSION + '\x05' # 0x0005 -> ENQUIRY + '\x06' # 0x0006 -> ACKNOWLEDGE + '\x07' # 0x0007 -> BELL + '\x08' # 0x0008 -> BACKSPACE + '\t' # 0x0009 -> HORIZONTAL TABULATION + '\n' # 0x000a -> LINE FEED + '\x0b' # 0x000b -> VERTICAL TABULATION + '\x0c' # 0x000c -> FORM FEED + '\r' # 0x000d -> CARRIAGE RETURN + '\x0e' # 0x000e -> SHIFT OUT + '\x0f' # 0x000f -> SHIFT IN + '\x10' # 0x0010 -> DATA LINK ESCAPE + '\x11' # 0x0011 -> DEVICE CONTROL ONE + '\x12' # 0x0012 -> DEVICE CONTROL TWO + '\x13' # 0x0013 -> DEVICE CONTROL THREE + '\x14' # 0x0014 -> DEVICE CONTROL FOUR + '\x15' # 0x0015 -> NEGATIVE ACKNOWLEDGE + '\x16' # 0x0016 -> SYNCHRONOUS IDLE + '\x17' # 0x0017 -> END OF TRANSMISSION BLOCK + '\x18' # 0x0018 -> CANCEL + '\x19' # 0x0019 -> END OF MEDIUM + '\x1a' # 0x001a -> SUBSTITUTE + '\x1b' # 0x001b -> ESCAPE + '\x1c' # 0x001c -> FILE SEPARATOR + '\x1d' # 0x001d -> GROUP SEPARATOR + '\x1e' # 0x001e -> RECORD SEPARATOR + '\x1f' # 0x001f -> UNIT SEPARATOR + ' ' # 0x0020 -> SPACE + '!' # 0x0021 -> EXCLAMATION MARK + '"' # 0x0022 -> QUOTATION MARK + '#' # 0x0023 -> NUMBER SIGN + '$' # 0x0024 -> DOLLAR SIGN + '%' # 0x0025 -> PERCENT SIGN + '&' # 0x0026 -> AMPERSAND + "'" # 0x0027 -> APOSTROPHE + '(' # 0x0028 -> LEFT PARENTHESIS + ')' # 0x0029 -> RIGHT PARENTHESIS + '*' # 0x002a -> ASTERISK + '+' # 0x002b -> PLUS SIGN + ',' # 0x002c -> COMMA + '-' # 0x002d -> HYPHEN-MINUS + '.' # 0x002e -> FULL STOP + '/' # 0x002f -> SOLIDUS + '0' # 0x0030 -> DIGIT ZERO + '1' # 0x0031 -> DIGIT ONE + '2' # 0x0032 -> DIGIT TWO + '3' # 0x0033 -> DIGIT THREE + '4' # 0x0034 -> DIGIT FOUR + '5' # 0x0035 -> DIGIT FIVE + '6' # 0x0036 -> DIGIT SIX + '7' # 0x0037 -> DIGIT SEVEN + '8' # 0x0038 -> DIGIT EIGHT + '9' # 0x0039 -> DIGIT NINE + ':' # 0x003a -> COLON + ';' # 0x003b -> SEMICOLON + '<' # 0x003c -> LESS-THAN SIGN + '=' # 0x003d -> EQUALS SIGN + '>' # 0x003e -> GREATER-THAN SIGN + '?' # 0x003f -> QUESTION MARK + '@' # 0x0040 -> COMMERCIAL AT + 'A' # 0x0041 -> LATIN CAPITAL LETTER A + 'B' # 0x0042 -> LATIN CAPITAL LETTER B + 'C' # 0x0043 -> LATIN CAPITAL LETTER C + 'D' # 0x0044 -> LATIN CAPITAL LETTER D + 'E' # 0x0045 -> LATIN CAPITAL LETTER E + 'F' # 0x0046 -> LATIN CAPITAL LETTER F + 'G' # 0x0047 -> LATIN CAPITAL LETTER G + 'H' # 0x0048 -> LATIN CAPITAL LETTER H + 'I' # 0x0049 -> LATIN CAPITAL LETTER I + 'J' # 0x004a -> LATIN CAPITAL LETTER J + 'K' # 0x004b -> LATIN CAPITAL LETTER K + 'L' # 0x004c -> LATIN CAPITAL LETTER L + 'M' # 0x004d -> LATIN CAPITAL LETTER M + 'N' # 0x004e -> LATIN CAPITAL LETTER N + 'O' # 0x004f -> LATIN CAPITAL LETTER O + 'P' # 0x0050 -> LATIN CAPITAL LETTER P + 'Q' # 0x0051 -> LATIN CAPITAL LETTER Q + 'R' # 0x0052 -> LATIN CAPITAL LETTER R + 'S' # 0x0053 -> LATIN CAPITAL LETTER S + 'T' # 0x0054 -> LATIN CAPITAL LETTER T + 'U' # 0x0055 -> LATIN CAPITAL LETTER U + 'V' # 0x0056 -> LATIN CAPITAL LETTER V + 'W' # 0x0057 -> LATIN CAPITAL LETTER W + 'X' # 0x0058 -> LATIN CAPITAL LETTER X + 'Y' # 0x0059 -> LATIN CAPITAL LETTER Y + 'Z' # 0x005a -> LATIN CAPITAL LETTER Z + '[' # 0x005b -> LEFT SQUARE BRACKET + '\\' # 0x005c -> REVERSE SOLIDUS + ']' # 0x005d -> RIGHT SQUARE BRACKET + '^' # 0x005e -> CIRCUMFLEX ACCENT + '_' # 0x005f -> LOW LINE + '`' # 0x0060 -> GRAVE ACCENT + 'a' # 0x0061 -> LATIN SMALL LETTER A + 'b' # 0x0062 -> LATIN SMALL LETTER B + 'c' # 0x0063 -> LATIN SMALL LETTER C + 'd' # 0x0064 -> LATIN SMALL LETTER D + 'e' # 0x0065 -> LATIN SMALL LETTER E + 'f' # 0x0066 -> LATIN SMALL LETTER F + 'g' # 0x0067 -> LATIN SMALL LETTER G + 'h' # 0x0068 -> LATIN SMALL LETTER H + 'i' # 0x0069 -> LATIN SMALL LETTER I + 'j' # 0x006a -> LATIN SMALL LETTER J + 'k' # 0x006b -> LATIN SMALL LETTER K + 'l' # 0x006c -> LATIN SMALL LETTER L + 'm' # 0x006d -> LATIN SMALL LETTER M + 'n' # 0x006e -> LATIN SMALL LETTER N + 'o' # 0x006f -> LATIN SMALL LETTER O + 'p' # 0x0070 -> LATIN SMALL LETTER P + 'q' # 0x0071 -> LATIN SMALL LETTER Q + 'r' # 0x0072 -> LATIN SMALL LETTER R + 's' # 0x0073 -> LATIN SMALL LETTER S + 't' # 0x0074 -> LATIN SMALL LETTER T + 'u' # 0x0075 -> LATIN SMALL LETTER U + 'v' # 0x0076 -> LATIN SMALL LETTER V + 'w' # 0x0077 -> LATIN SMALL LETTER W + 'x' # 0x0078 -> LATIN SMALL LETTER X + 'y' # 0x0079 -> LATIN SMALL LETTER Y + 'z' # 0x007a -> LATIN SMALL LETTER Z + '{' # 0x007b -> LEFT CURLY BRACKET + '|' # 0x007c -> VERTICAL LINE + '}' # 0x007d -> RIGHT CURLY BRACKET + '~' # 0x007e -> TILDE + '\x7f' # 0x007f -> DELETE + '\u0391' # 0x0080 -> GREEK CAPITAL LETTER ALPHA + '\u0392' # 0x0081 -> GREEK CAPITAL LETTER BETA + '\u0393' # 0x0082 -> GREEK CAPITAL LETTER GAMMA + '\u0394' # 0x0083 -> GREEK CAPITAL LETTER DELTA + '\u0395' # 0x0084 -> GREEK CAPITAL LETTER EPSILON + '\u0396' # 0x0085 -> GREEK CAPITAL LETTER ZETA + '\u0397' # 0x0086 -> GREEK CAPITAL LETTER ETA + '\u0398' # 0x0087 -> GREEK CAPITAL LETTER THETA + '\u0399' # 0x0088 -> GREEK CAPITAL LETTER IOTA + '\u039a' # 0x0089 -> GREEK CAPITAL LETTER KAPPA + '\u039b' # 0x008a -> GREEK CAPITAL LETTER LAMDA + '\u039c' # 0x008b -> GREEK CAPITAL LETTER MU + '\u039d' # 0x008c -> GREEK CAPITAL LETTER NU + '\u039e' # 0x008d -> GREEK CAPITAL LETTER XI + '\u039f' # 0x008e -> GREEK CAPITAL LETTER OMICRON + '\u03a0' # 0x008f -> GREEK CAPITAL LETTER PI + '\u03a1' # 0x0090 -> GREEK CAPITAL LETTER RHO + '\u03a3' # 0x0091 -> GREEK CAPITAL LETTER SIGMA + '\u03a4' # 0x0092 -> GREEK CAPITAL LETTER TAU + '\u03a5' # 0x0093 -> GREEK CAPITAL LETTER UPSILON + '\u03a6' # 0x0094 -> GREEK CAPITAL LETTER PHI + '\u03a7' # 0x0095 -> GREEK CAPITAL LETTER CHI + '\u03a8' # 0x0096 -> GREEK CAPITAL LETTER PSI + '\u03a9' # 0x0097 -> GREEK CAPITAL LETTER OMEGA + '\u03b1' # 0x0098 -> GREEK SMALL LETTER ALPHA + '\u03b2' # 0x0099 -> GREEK SMALL LETTER BETA + '\u03b3' # 0x009a -> GREEK SMALL LETTER GAMMA + '\u03b4' # 0x009b -> GREEK SMALL LETTER DELTA + '\u03b5' # 0x009c -> GREEK SMALL LETTER EPSILON + '\u03b6' # 0x009d -> GREEK SMALL LETTER ZETA + '\u03b7' # 0x009e -> GREEK SMALL LETTER ETA + '\u03b8' # 0x009f -> GREEK SMALL LETTER THETA + '\u03b9' # 0x00a0 -> GREEK SMALL LETTER IOTA + '\u03ba' # 0x00a1 -> GREEK SMALL LETTER KAPPA + '\u03bb' # 0x00a2 -> GREEK SMALL LETTER LAMDA + '\u03bc' # 0x00a3 -> GREEK SMALL LETTER MU + '\u03bd' # 0x00a4 -> GREEK SMALL LETTER NU + '\u03be' # 0x00a5 -> GREEK SMALL LETTER XI + '\u03bf' # 0x00a6 -> GREEK SMALL LETTER OMICRON + '\u03c0' # 0x00a7 -> GREEK SMALL LETTER PI + '\u03c1' # 0x00a8 -> GREEK SMALL LETTER RHO + '\u03c3' # 0x00a9 -> GREEK SMALL LETTER SIGMA + '\u03c2' # 0x00aa -> GREEK SMALL LETTER FINAL SIGMA + '\u03c4' # 0x00ab -> GREEK SMALL LETTER TAU + '\u03c5' # 0x00ac -> GREEK SMALL LETTER UPSILON + '\u03c6' # 0x00ad -> GREEK SMALL LETTER PHI + '\u03c7' # 0x00ae -> GREEK SMALL LETTER CHI + '\u03c8' # 0x00af -> GREEK SMALL LETTER PSI + '\u2591' # 0x00b0 -> LIGHT SHADE + '\u2592' # 0x00b1 -> MEDIUM SHADE + '\u2593' # 0x00b2 -> DARK SHADE + '\u2502' # 0x00b3 -> BOX DRAWINGS LIGHT VERTICAL + '\u2524' # 0x00b4 -> BOX DRAWINGS LIGHT VERTICAL AND LEFT + '\u2561' # 0x00b5 -> BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE + '\u2562' # 0x00b6 -> BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE + '\u2556' # 0x00b7 -> BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE + '\u2555' # 0x00b8 -> BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE + '\u2563' # 0x00b9 -> BOX DRAWINGS DOUBLE VERTICAL AND LEFT + '\u2551' # 0x00ba -> BOX DRAWINGS DOUBLE VERTICAL + '\u2557' # 0x00bb -> BOX DRAWINGS DOUBLE DOWN AND LEFT + '\u255d' # 0x00bc -> BOX DRAWINGS DOUBLE UP AND LEFT + '\u255c' # 0x00bd -> BOX DRAWINGS UP DOUBLE AND LEFT SINGLE + '\u255b' # 0x00be -> BOX DRAWINGS UP SINGLE AND LEFT DOUBLE + '\u2510' # 0x00bf -> BOX DRAWINGS LIGHT DOWN AND LEFT + '\u2514' # 0x00c0 -> BOX DRAWINGS LIGHT UP AND RIGHT + '\u2534' # 0x00c1 -> BOX DRAWINGS LIGHT UP AND HORIZONTAL + '\u252c' # 0x00c2 -> BOX DRAWINGS LIGHT DOWN AND HORIZONTAL + '\u251c' # 0x00c3 -> BOX DRAWINGS LIGHT VERTICAL AND RIGHT + '\u2500' # 0x00c4 -> BOX DRAWINGS LIGHT HORIZONTAL + '\u253c' # 0x00c5 -> BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL + '\u255e' # 0x00c6 -> BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE + '\u255f' # 0x00c7 -> BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE + '\u255a' # 0x00c8 -> BOX DRAWINGS DOUBLE UP AND RIGHT + '\u2554' # 0x00c9 -> BOX DRAWINGS DOUBLE DOWN AND RIGHT + '\u2569' # 0x00ca -> BOX DRAWINGS DOUBLE UP AND HORIZONTAL + '\u2566' # 0x00cb -> BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL + '\u2560' # 0x00cc -> BOX DRAWINGS DOUBLE VERTICAL AND RIGHT + '\u2550' # 0x00cd -> BOX DRAWINGS DOUBLE HORIZONTAL + '\u256c' # 0x00ce -> BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL + '\u2567' # 0x00cf -> BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE + '\u2568' # 0x00d0 -> BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE + '\u2564' # 0x00d1 -> BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE + '\u2565' # 0x00d2 -> BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE + '\u2559' # 0x00d3 -> BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE + '\u2558' # 0x00d4 -> BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE + '\u2552' # 0x00d5 -> BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE + '\u2553' # 0x00d6 -> BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE + '\u256b' # 0x00d7 -> BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE + '\u256a' # 0x00d8 -> BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE + '\u2518' # 0x00d9 -> BOX DRAWINGS LIGHT UP AND LEFT + '\u250c' # 0x00da -> BOX DRAWINGS LIGHT DOWN AND RIGHT + '\u2588' # 0x00db -> FULL BLOCK + '\u2584' # 0x00dc -> LOWER HALF BLOCK + '\u258c' # 0x00dd -> LEFT HALF BLOCK + '\u2590' # 0x00de -> RIGHT HALF BLOCK + '\u2580' # 0x00df -> UPPER HALF BLOCK + '\u03c9' # 0x00e0 -> GREEK SMALL LETTER OMEGA + '\u03ac' # 0x00e1 -> GREEK SMALL LETTER ALPHA WITH TONOS + '\u03ad' # 0x00e2 -> GREEK SMALL LETTER EPSILON WITH TONOS + '\u03ae' # 0x00e3 -> GREEK SMALL LETTER ETA WITH TONOS + '\u03ca' # 0x00e4 -> GREEK SMALL LETTER IOTA WITH DIALYTIKA + '\u03af' # 0x00e5 -> GREEK SMALL LETTER IOTA WITH TONOS + '\u03cc' # 0x00e6 -> GREEK SMALL LETTER OMICRON WITH TONOS + '\u03cd' # 0x00e7 -> GREEK SMALL LETTER UPSILON WITH TONOS + '\u03cb' # 0x00e8 -> GREEK SMALL LETTER UPSILON WITH DIALYTIKA + '\u03ce' # 0x00e9 -> GREEK SMALL LETTER OMEGA WITH TONOS + '\u0386' # 0x00ea -> GREEK CAPITAL LETTER ALPHA WITH TONOS + '\u0388' # 0x00eb -> GREEK CAPITAL LETTER EPSILON WITH TONOS + '\u0389' # 0x00ec -> GREEK CAPITAL LETTER ETA WITH TONOS + '\u038a' # 0x00ed -> GREEK CAPITAL LETTER IOTA WITH TONOS + '\u038c' # 0x00ee -> GREEK CAPITAL LETTER OMICRON WITH TONOS + '\u038e' # 0x00ef -> GREEK CAPITAL LETTER UPSILON WITH TONOS + '\u038f' # 0x00f0 -> GREEK CAPITAL LETTER OMEGA WITH TONOS + '\xb1' # 0x00f1 -> PLUS-MINUS SIGN + '\u2265' # 0x00f2 -> GREATER-THAN OR EQUAL TO + '\u2264' # 0x00f3 -> LESS-THAN OR EQUAL TO + '\u03aa' # 0x00f4 -> GREEK CAPITAL LETTER IOTA WITH DIALYTIKA + '\u03ab' # 0x00f5 -> GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA + '\xf7' # 0x00f6 -> DIVISION SIGN + '\u2248' # 0x00f7 -> ALMOST EQUAL TO + '\xb0' # 0x00f8 -> DEGREE SIGN + '\u2219' # 0x00f9 -> BULLET OPERATOR + '\xb7' # 0x00fa -> MIDDLE DOT + '\u221a' # 0x00fb -> SQUARE ROOT + '\u207f' # 0x00fc -> SUPERSCRIPT LATIN SMALL LETTER N + '\xb2' # 0x00fd -> SUPERSCRIPT TWO + '\u25a0' # 0x00fe -> BLACK SQUARE + '\xa0' # 0x00ff -> NO-BREAK SPACE +) + +### Encoding Map + +encoding_map = { + 0x0000: 0x0000, # NULL + 0x0001: 0x0001, # START OF HEADING + 0x0002: 0x0002, # START OF TEXT + 0x0003: 0x0003, # END OF TEXT + 0x0004: 0x0004, # END OF TRANSMISSION + 0x0005: 0x0005, # ENQUIRY + 0x0006: 0x0006, # ACKNOWLEDGE + 0x0007: 0x0007, # BELL + 0x0008: 0x0008, # BACKSPACE + 0x0009: 0x0009, # HORIZONTAL TABULATION + 0x000a: 0x000a, # LINE FEED + 0x000b: 0x000b, # VERTICAL TABULATION + 0x000c: 0x000c, # FORM FEED + 0x000d: 0x000d, # CARRIAGE RETURN + 0x000e: 0x000e, # SHIFT OUT + 0x000f: 0x000f, # SHIFT IN + 0x0010: 0x0010, # DATA LINK ESCAPE + 0x0011: 0x0011, # DEVICE CONTROL ONE + 0x0012: 0x0012, # DEVICE CONTROL TWO + 0x0013: 0x0013, # DEVICE CONTROL THREE + 0x0014: 0x0014, # DEVICE CONTROL FOUR + 0x0015: 0x0015, # NEGATIVE ACKNOWLEDGE + 0x0016: 0x0016, # SYNCHRONOUS IDLE + 0x0017: 0x0017, # END OF TRANSMISSION BLOCK + 0x0018: 0x0018, # CANCEL + 0x0019: 0x0019, # END OF MEDIUM + 0x001a: 0x001a, # SUBSTITUTE + 0x001b: 0x001b, # ESCAPE + 0x001c: 0x001c, # FILE SEPARATOR + 0x001d: 0x001d, # GROUP SEPARATOR + 0x001e: 0x001e, # RECORD SEPARATOR + 0x001f: 0x001f, # UNIT SEPARATOR + 0x0020: 0x0020, # SPACE + 0x0021: 0x0021, # EXCLAMATION MARK + 0x0022: 0x0022, # QUOTATION MARK + 0x0023: 0x0023, # NUMBER SIGN + 0x0024: 0x0024, # DOLLAR SIGN + 0x0025: 0x0025, # PERCENT SIGN + 0x0026: 0x0026, # AMPERSAND + 0x0027: 0x0027, # APOSTROPHE + 0x0028: 0x0028, # LEFT PARENTHESIS + 0x0029: 0x0029, # RIGHT PARENTHESIS + 0x002a: 0x002a, # ASTERISK + 0x002b: 0x002b, # PLUS SIGN + 0x002c: 0x002c, # COMMA + 0x002d: 0x002d, # HYPHEN-MINUS + 0x002e: 0x002e, # FULL STOP + 0x002f: 0x002f, # SOLIDUS + 0x0030: 0x0030, # DIGIT ZERO + 0x0031: 0x0031, # DIGIT ONE + 0x0032: 0x0032, # DIGIT TWO + 0x0033: 0x0033, # DIGIT THREE + 0x0034: 0x0034, # DIGIT FOUR + 0x0035: 0x0035, # DIGIT FIVE + 0x0036: 0x0036, # DIGIT SIX + 0x0037: 0x0037, # DIGIT SEVEN + 0x0038: 0x0038, # DIGIT EIGHT + 0x0039: 0x0039, # DIGIT NINE + 0x003a: 0x003a, # COLON + 0x003b: 0x003b, # SEMICOLON + 0x003c: 0x003c, # LESS-THAN SIGN + 0x003d: 0x003d, # EQUALS SIGN + 0x003e: 0x003e, # GREATER-THAN SIGN + 0x003f: 0x003f, # QUESTION MARK + 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 + 0x005c: 0x005c, # REVERSE SOLIDUS + 0x005d: 0x005d, # RIGHT SQUARE BRACKET + 0x005e: 0x005e, # CIRCUMFLEX ACCENT + 0x005f: 0x005f, # LOW LINE + 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 + 0x007c: 0x007c, # VERTICAL LINE + 0x007d: 0x007d, # RIGHT CURLY BRACKET + 0x007e: 0x007e, # TILDE + 0x007f: 0x007f, # DELETE + 0x00a0: 0x00ff, # NO-BREAK SPACE + 0x00b0: 0x00f8, # DEGREE SIGN + 0x00b1: 0x00f1, # PLUS-MINUS SIGN + 0x00b2: 0x00fd, # SUPERSCRIPT TWO + 0x00b7: 0x00fa, # MIDDLE DOT + 0x00f7: 0x00f6, # DIVISION SIGN + 0x0386: 0x00ea, # GREEK CAPITAL LETTER ALPHA WITH TONOS + 0x0388: 0x00eb, # GREEK CAPITAL LETTER EPSILON WITH TONOS + 0x0389: 0x00ec, # GREEK CAPITAL LETTER ETA WITH TONOS + 0x038a: 0x00ed, # GREEK CAPITAL LETTER IOTA WITH TONOS + 0x038c: 0x00ee, # GREEK CAPITAL LETTER OMICRON WITH TONOS + 0x038e: 0x00ef, # GREEK CAPITAL LETTER UPSILON WITH TONOS + 0x038f: 0x00f0, # GREEK CAPITAL LETTER OMEGA WITH TONOS + 0x0391: 0x0080, # GREEK CAPITAL LETTER ALPHA + 0x0392: 0x0081, # GREEK CAPITAL LETTER BETA + 0x0393: 0x0082, # GREEK CAPITAL LETTER GAMMA + 0x0394: 0x0083, # GREEK CAPITAL LETTER DELTA + 0x0395: 0x0084, # GREEK CAPITAL LETTER EPSILON + 0x0396: 0x0085, # GREEK CAPITAL LETTER ZETA + 0x0397: 0x0086, # GREEK CAPITAL LETTER ETA + 0x0398: 0x0087, # GREEK CAPITAL LETTER THETA + 0x0399: 0x0088, # GREEK CAPITAL LETTER IOTA + 0x039a: 0x0089, # GREEK CAPITAL LETTER KAPPA + 0x039b: 0x008a, # GREEK CAPITAL LETTER LAMDA + 0x039c: 0x008b, # GREEK CAPITAL LETTER MU + 0x039d: 0x008c, # GREEK CAPITAL LETTER NU + 0x039e: 0x008d, # GREEK CAPITAL LETTER XI + 0x039f: 0x008e, # GREEK CAPITAL LETTER OMICRON + 0x03a0: 0x008f, # GREEK CAPITAL LETTER PI + 0x03a1: 0x0090, # GREEK CAPITAL LETTER RHO + 0x03a3: 0x0091, # GREEK CAPITAL LETTER SIGMA + 0x03a4: 0x0092, # GREEK CAPITAL LETTER TAU + 0x03a5: 0x0093, # GREEK CAPITAL LETTER UPSILON + 0x03a6: 0x0094, # GREEK CAPITAL LETTER PHI + 0x03a7: 0x0095, # GREEK CAPITAL LETTER CHI + 0x03a8: 0x0096, # GREEK CAPITAL LETTER PSI + 0x03a9: 0x0097, # GREEK CAPITAL LETTER OMEGA + 0x03aa: 0x00f4, # GREEK CAPITAL LETTER IOTA WITH DIALYTIKA + 0x03ab: 0x00f5, # GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA + 0x03ac: 0x00e1, # GREEK SMALL LETTER ALPHA WITH TONOS + 0x03ad: 0x00e2, # GREEK SMALL LETTER EPSILON WITH TONOS + 0x03ae: 0x00e3, # GREEK SMALL LETTER ETA WITH TONOS + 0x03af: 0x00e5, # GREEK SMALL LETTER IOTA WITH TONOS + 0x03b1: 0x0098, # GREEK SMALL LETTER ALPHA + 0x03b2: 0x0099, # GREEK SMALL LETTER BETA + 0x03b3: 0x009a, # GREEK SMALL LETTER GAMMA + 0x03b4: 0x009b, # GREEK SMALL LETTER DELTA + 0x03b5: 0x009c, # GREEK SMALL LETTER EPSILON + 0x03b6: 0x009d, # GREEK SMALL LETTER ZETA + 0x03b7: 0x009e, # GREEK SMALL LETTER ETA + 0x03b8: 0x009f, # GREEK SMALL LETTER THETA + 0x03b9: 0x00a0, # GREEK SMALL LETTER IOTA + 0x03ba: 0x00a1, # GREEK SMALL LETTER KAPPA + 0x03bb: 0x00a2, # GREEK SMALL LETTER LAMDA + 0x03bc: 0x00a3, # GREEK SMALL LETTER MU + 0x03bd: 0x00a4, # GREEK SMALL LETTER NU + 0x03be: 0x00a5, # GREEK SMALL LETTER XI + 0x03bf: 0x00a6, # GREEK SMALL LETTER OMICRON + 0x03c0: 0x00a7, # GREEK SMALL LETTER PI + 0x03c1: 0x00a8, # GREEK SMALL LETTER RHO + 0x03c2: 0x00aa, # GREEK SMALL LETTER FINAL SIGMA + 0x03c3: 0x00a9, # GREEK SMALL LETTER SIGMA + 0x03c4: 0x00ab, # GREEK SMALL LETTER TAU + 0x03c5: 0x00ac, # GREEK SMALL LETTER UPSILON + 0x03c6: 0x00ad, # GREEK SMALL LETTER PHI + 0x03c7: 0x00ae, # GREEK SMALL LETTER CHI + 0x03c8: 0x00af, # GREEK SMALL LETTER PSI + 0x03c9: 0x00e0, # GREEK SMALL LETTER OMEGA + 0x03ca: 0x00e4, # GREEK SMALL LETTER IOTA WITH DIALYTIKA + 0x03cb: 0x00e8, # GREEK SMALL LETTER UPSILON WITH DIALYTIKA + 0x03cc: 0x00e6, # GREEK SMALL LETTER OMICRON WITH TONOS + 0x03cd: 0x00e7, # GREEK SMALL LETTER UPSILON WITH TONOS + 0x03ce: 0x00e9, # GREEK SMALL LETTER OMEGA WITH TONOS + 0x207f: 0x00fc, # SUPERSCRIPT LATIN SMALL LETTER N + 0x2219: 0x00f9, # BULLET OPERATOR + 0x221a: 0x00fb, # SQUARE ROOT + 0x2248: 0x00f7, # ALMOST EQUAL TO + 0x2264: 0x00f3, # LESS-THAN OR EQUAL TO + 0x2265: 0x00f2, # GREATER-THAN OR EQUAL TO + 0x2500: 0x00c4, # BOX DRAWINGS LIGHT HORIZONTAL + 0x2502: 0x00b3, # BOX DRAWINGS LIGHT VERTICAL + 0x250c: 0x00da, # BOX DRAWINGS LIGHT DOWN AND RIGHT + 0x2510: 0x00bf, # BOX DRAWINGS LIGHT DOWN AND LEFT + 0x2514: 0x00c0, # BOX DRAWINGS LIGHT UP AND RIGHT + 0x2518: 0x00d9, # BOX DRAWINGS LIGHT UP AND LEFT + 0x251c: 0x00c3, # BOX DRAWINGS LIGHT VERTICAL AND RIGHT + 0x2524: 0x00b4, # BOX DRAWINGS LIGHT VERTICAL AND LEFT + 0x252c: 0x00c2, # BOX DRAWINGS LIGHT DOWN AND HORIZONTAL + 0x2534: 0x00c1, # BOX DRAWINGS LIGHT UP AND HORIZONTAL + 0x253c: 0x00c5, # BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL + 0x2550: 0x00cd, # BOX DRAWINGS DOUBLE HORIZONTAL + 0x2551: 0x00ba, # BOX DRAWINGS DOUBLE VERTICAL + 0x2552: 0x00d5, # BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE + 0x2553: 0x00d6, # BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE + 0x2554: 0x00c9, # BOX DRAWINGS DOUBLE DOWN AND RIGHT + 0x2555: 0x00b8, # BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE + 0x2556: 0x00b7, # BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE + 0x2557: 0x00bb, # BOX DRAWINGS DOUBLE DOWN AND LEFT + 0x2558: 0x00d4, # BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE + 0x2559: 0x00d3, # BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE + 0x255a: 0x00c8, # BOX DRAWINGS DOUBLE UP AND RIGHT + 0x255b: 0x00be, # BOX DRAWINGS UP SINGLE AND LEFT DOUBLE + 0x255c: 0x00bd, # BOX DRAWINGS UP DOUBLE AND LEFT SINGLE + 0x255d: 0x00bc, # BOX DRAWINGS DOUBLE UP AND LEFT + 0x255e: 0x00c6, # BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE + 0x255f: 0x00c7, # BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE + 0x2560: 0x00cc, # BOX DRAWINGS DOUBLE VERTICAL AND RIGHT + 0x2561: 0x00b5, # BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE + 0x2562: 0x00b6, # BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE + 0x2563: 0x00b9, # BOX DRAWINGS DOUBLE VERTICAL AND LEFT + 0x2564: 0x00d1, # BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE + 0x2565: 0x00d2, # BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE + 0x2566: 0x00cb, # BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL + 0x2567: 0x00cf, # BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE + 0x2568: 0x00d0, # BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE + 0x2569: 0x00ca, # BOX DRAWINGS DOUBLE UP AND HORIZONTAL + 0x256a: 0x00d8, # BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE + 0x256b: 0x00d7, # BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE + 0x256c: 0x00ce, # BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL + 0x2580: 0x00df, # UPPER HALF BLOCK + 0x2584: 0x00dc, # LOWER HALF BLOCK + 0x2588: 0x00db, # FULL BLOCK + 0x258c: 0x00dd, # LEFT HALF BLOCK + 0x2590: 0x00de, # RIGHT HALF BLOCK + 0x2591: 0x00b0, # LIGHT SHADE + 0x2592: 0x00b1, # MEDIUM SHADE + 0x2593: 0x00b2, # DARK SHADE + 0x25a0: 0x00fe, # BLACK SQUARE +} diff --git a/env/Lib/encodings/cp775.py b/env/Lib/encodings/cp775.py new file mode 100644 index 0000000..fe06e7b --- /dev/null +++ b/env/Lib/encodings/cp775.py @@ -0,0 +1,697 @@ +""" Python Character Mapping Codec cp775 generated from 'VENDORS/MICSFT/PC/CP775.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_map) + + 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_map)[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='cp775', + 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: 0x0106, # LATIN CAPITAL LETTER C WITH ACUTE + 0x0081: 0x00fc, # LATIN SMALL LETTER U WITH DIAERESIS + 0x0082: 0x00e9, # LATIN SMALL LETTER E WITH ACUTE + 0x0083: 0x0101, # LATIN SMALL LETTER A WITH MACRON + 0x0084: 0x00e4, # LATIN SMALL LETTER A WITH DIAERESIS + 0x0085: 0x0123, # LATIN SMALL LETTER G WITH CEDILLA + 0x0086: 0x00e5, # LATIN SMALL LETTER A WITH RING ABOVE + 0x0087: 0x0107, # LATIN SMALL LETTER C WITH ACUTE + 0x0088: 0x0142, # LATIN SMALL LETTER L WITH STROKE + 0x0089: 0x0113, # LATIN SMALL LETTER E WITH MACRON + 0x008a: 0x0156, # LATIN CAPITAL LETTER R WITH CEDILLA + 0x008b: 0x0157, # LATIN SMALL LETTER R WITH CEDILLA + 0x008c: 0x012b, # LATIN SMALL LETTER I WITH MACRON + 0x008d: 0x0179, # LATIN CAPITAL LETTER Z WITH ACUTE + 0x008e: 0x00c4, # LATIN CAPITAL LETTER A WITH DIAERESIS + 0x008f: 0x00c5, # LATIN CAPITAL LETTER A WITH RING ABOVE + 0x0090: 0x00c9, # LATIN CAPITAL LETTER E WITH ACUTE + 0x0091: 0x00e6, # LATIN SMALL LIGATURE AE + 0x0092: 0x00c6, # LATIN CAPITAL LIGATURE AE + 0x0093: 0x014d, # LATIN SMALL LETTER O WITH MACRON + 0x0094: 0x00f6, # LATIN SMALL LETTER O WITH DIAERESIS + 0x0095: 0x0122, # LATIN CAPITAL LETTER G WITH CEDILLA + 0x0096: 0x00a2, # CENT SIGN + 0x0097: 0x015a, # LATIN CAPITAL LETTER S WITH ACUTE + 0x0098: 0x015b, # LATIN SMALL LETTER S WITH ACUTE + 0x0099: 0x00d6, # LATIN CAPITAL LETTER O WITH DIAERESIS + 0x009a: 0x00dc, # LATIN CAPITAL LETTER U WITH DIAERESIS + 0x009b: 0x00f8, # LATIN SMALL LETTER O WITH STROKE + 0x009c: 0x00a3, # POUND SIGN + 0x009d: 0x00d8, # LATIN CAPITAL LETTER O WITH STROKE + 0x009e: 0x00d7, # MULTIPLICATION SIGN + 0x009f: 0x00a4, # CURRENCY SIGN + 0x00a0: 0x0100, # LATIN CAPITAL LETTER A WITH MACRON + 0x00a1: 0x012a, # LATIN CAPITAL LETTER I WITH MACRON + 0x00a2: 0x00f3, # LATIN SMALL LETTER O WITH ACUTE + 0x00a3: 0x017b, # LATIN CAPITAL LETTER Z WITH DOT ABOVE + 0x00a4: 0x017c, # LATIN SMALL LETTER Z WITH DOT ABOVE + 0x00a5: 0x017a, # LATIN SMALL LETTER Z WITH ACUTE + 0x00a6: 0x201d, # RIGHT DOUBLE QUOTATION MARK + 0x00a7: 0x00a6, # BROKEN BAR + 0x00a8: 0x00a9, # COPYRIGHT SIGN + 0x00a9: 0x00ae, # REGISTERED SIGN + 0x00aa: 0x00ac, # NOT SIGN + 0x00ab: 0x00bd, # VULGAR FRACTION ONE HALF + 0x00ac: 0x00bc, # VULGAR FRACTION ONE QUARTER + 0x00ad: 0x0141, # LATIN CAPITAL LETTER L WITH STROKE + 0x00ae: 0x00ab, # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00af: 0x00bb, # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00b0: 0x2591, # LIGHT SHADE + 0x00b1: 0x2592, # MEDIUM SHADE + 0x00b2: 0x2593, # DARK SHADE + 0x00b3: 0x2502, # BOX DRAWINGS LIGHT VERTICAL + 0x00b4: 0x2524, # BOX DRAWINGS LIGHT VERTICAL AND LEFT + 0x00b5: 0x0104, # LATIN CAPITAL LETTER A WITH OGONEK + 0x00b6: 0x010c, # LATIN CAPITAL LETTER C WITH CARON + 0x00b7: 0x0118, # LATIN CAPITAL LETTER E WITH OGONEK + 0x00b8: 0x0116, # LATIN CAPITAL LETTER E WITH DOT ABOVE + 0x00b9: 0x2563, # BOX DRAWINGS DOUBLE VERTICAL AND LEFT + 0x00ba: 0x2551, # BOX DRAWINGS DOUBLE VERTICAL + 0x00bb: 0x2557, # BOX DRAWINGS DOUBLE DOWN AND LEFT + 0x00bc: 0x255d, # BOX DRAWINGS DOUBLE UP AND LEFT + 0x00bd: 0x012e, # LATIN CAPITAL LETTER I WITH OGONEK + 0x00be: 0x0160, # LATIN CAPITAL LETTER S WITH CARON + 0x00bf: 0x2510, # BOX DRAWINGS LIGHT DOWN AND LEFT + 0x00c0: 0x2514, # BOX DRAWINGS LIGHT UP AND RIGHT + 0x00c1: 0x2534, # BOX DRAWINGS LIGHT UP AND HORIZONTAL + 0x00c2: 0x252c, # BOX DRAWINGS LIGHT DOWN AND HORIZONTAL + 0x00c3: 0x251c, # BOX DRAWINGS LIGHT VERTICAL AND RIGHT + 0x00c4: 0x2500, # BOX DRAWINGS LIGHT HORIZONTAL + 0x00c5: 0x253c, # BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL + 0x00c6: 0x0172, # LATIN CAPITAL LETTER U WITH OGONEK + 0x00c7: 0x016a, # LATIN CAPITAL LETTER U WITH MACRON + 0x00c8: 0x255a, # BOX DRAWINGS DOUBLE UP AND RIGHT + 0x00c9: 0x2554, # BOX DRAWINGS DOUBLE DOWN AND RIGHT + 0x00ca: 0x2569, # BOX DRAWINGS DOUBLE UP AND HORIZONTAL + 0x00cb: 0x2566, # BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL + 0x00cc: 0x2560, # BOX DRAWINGS DOUBLE VERTICAL AND RIGHT + 0x00cd: 0x2550, # BOX DRAWINGS DOUBLE HORIZONTAL + 0x00ce: 0x256c, # BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL + 0x00cf: 0x017d, # LATIN CAPITAL LETTER Z WITH CARON + 0x00d0: 0x0105, # LATIN SMALL LETTER A WITH OGONEK + 0x00d1: 0x010d, # LATIN SMALL LETTER C WITH CARON + 0x00d2: 0x0119, # LATIN SMALL LETTER E WITH OGONEK + 0x00d3: 0x0117, # LATIN SMALL LETTER E WITH DOT ABOVE + 0x00d4: 0x012f, # LATIN SMALL LETTER I WITH OGONEK + 0x00d5: 0x0161, # LATIN SMALL LETTER S WITH CARON + 0x00d6: 0x0173, # LATIN SMALL LETTER U WITH OGONEK + 0x00d7: 0x016b, # LATIN SMALL LETTER U WITH MACRON + 0x00d8: 0x017e, # LATIN SMALL LETTER Z WITH CARON + 0x00d9: 0x2518, # BOX DRAWINGS LIGHT UP AND LEFT + 0x00da: 0x250c, # BOX DRAWINGS LIGHT DOWN AND RIGHT + 0x00db: 0x2588, # FULL BLOCK + 0x00dc: 0x2584, # LOWER HALF BLOCK + 0x00dd: 0x258c, # LEFT HALF BLOCK + 0x00de: 0x2590, # RIGHT HALF BLOCK + 0x00df: 0x2580, # UPPER HALF BLOCK + 0x00e0: 0x00d3, # LATIN CAPITAL LETTER O WITH ACUTE + 0x00e1: 0x00df, # LATIN SMALL LETTER SHARP S (GERMAN) + 0x00e2: 0x014c, # LATIN CAPITAL LETTER O WITH MACRON + 0x00e3: 0x0143, # LATIN CAPITAL LETTER N WITH ACUTE + 0x00e4: 0x00f5, # LATIN SMALL LETTER O WITH TILDE + 0x00e5: 0x00d5, # LATIN CAPITAL LETTER O WITH TILDE + 0x00e6: 0x00b5, # MICRO SIGN + 0x00e7: 0x0144, # LATIN SMALL LETTER N WITH ACUTE + 0x00e8: 0x0136, # LATIN CAPITAL LETTER K WITH CEDILLA + 0x00e9: 0x0137, # LATIN SMALL LETTER K WITH CEDILLA + 0x00ea: 0x013b, # LATIN CAPITAL LETTER L WITH CEDILLA + 0x00eb: 0x013c, # LATIN SMALL LETTER L WITH CEDILLA + 0x00ec: 0x0146, # LATIN SMALL LETTER N WITH CEDILLA + 0x00ed: 0x0112, # LATIN CAPITAL LETTER E WITH MACRON + 0x00ee: 0x0145, # LATIN CAPITAL LETTER N WITH CEDILLA + 0x00ef: 0x2019, # RIGHT SINGLE QUOTATION MARK + 0x00f0: 0x00ad, # SOFT HYPHEN + 0x00f1: 0x00b1, # PLUS-MINUS SIGN + 0x00f2: 0x201c, # LEFT DOUBLE QUOTATION MARK + 0x00f3: 0x00be, # VULGAR FRACTION THREE QUARTERS + 0x00f4: 0x00b6, # PILCROW SIGN + 0x00f5: 0x00a7, # SECTION SIGN + 0x00f6: 0x00f7, # DIVISION SIGN + 0x00f7: 0x201e, # DOUBLE LOW-9 QUOTATION MARK + 0x00f8: 0x00b0, # DEGREE SIGN + 0x00f9: 0x2219, # BULLET OPERATOR + 0x00fa: 0x00b7, # MIDDLE DOT + 0x00fb: 0x00b9, # SUPERSCRIPT ONE + 0x00fc: 0x00b3, # SUPERSCRIPT THREE + 0x00fd: 0x00b2, # SUPERSCRIPT TWO + 0x00fe: 0x25a0, # BLACK SQUARE + 0x00ff: 0x00a0, # NO-BREAK SPACE +}) + +### Decoding Table + +decoding_table = ( + '\x00' # 0x0000 -> NULL + '\x01' # 0x0001 -> START OF HEADING + '\x02' # 0x0002 -> START OF TEXT + '\x03' # 0x0003 -> END OF TEXT + '\x04' # 0x0004 -> END OF TRANSMISSION + '\x05' # 0x0005 -> ENQUIRY + '\x06' # 0x0006 -> ACKNOWLEDGE + '\x07' # 0x0007 -> BELL + '\x08' # 0x0008 -> BACKSPACE + '\t' # 0x0009 -> HORIZONTAL TABULATION + '\n' # 0x000a -> LINE FEED + '\x0b' # 0x000b -> VERTICAL TABULATION + '\x0c' # 0x000c -> FORM FEED + '\r' # 0x000d -> CARRIAGE RETURN + '\x0e' # 0x000e -> SHIFT OUT + '\x0f' # 0x000f -> SHIFT IN + '\x10' # 0x0010 -> DATA LINK ESCAPE + '\x11' # 0x0011 -> DEVICE CONTROL ONE + '\x12' # 0x0012 -> DEVICE CONTROL TWO + '\x13' # 0x0013 -> DEVICE CONTROL THREE + '\x14' # 0x0014 -> DEVICE CONTROL FOUR + '\x15' # 0x0015 -> NEGATIVE ACKNOWLEDGE + '\x16' # 0x0016 -> SYNCHRONOUS IDLE + '\x17' # 0x0017 -> END OF TRANSMISSION BLOCK + '\x18' # 0x0018 -> CANCEL + '\x19' # 0x0019 -> END OF MEDIUM + '\x1a' # 0x001a -> SUBSTITUTE + '\x1b' # 0x001b -> ESCAPE + '\x1c' # 0x001c -> FILE SEPARATOR + '\x1d' # 0x001d -> GROUP SEPARATOR + '\x1e' # 0x001e -> RECORD SEPARATOR + '\x1f' # 0x001f -> UNIT SEPARATOR + ' ' # 0x0020 -> SPACE + '!' # 0x0021 -> EXCLAMATION MARK + '"' # 0x0022 -> QUOTATION MARK + '#' # 0x0023 -> NUMBER SIGN + '$' # 0x0024 -> DOLLAR SIGN + '%' # 0x0025 -> PERCENT SIGN + '&' # 0x0026 -> AMPERSAND + "'" # 0x0027 -> APOSTROPHE + '(' # 0x0028 -> LEFT PARENTHESIS + ')' # 0x0029 -> RIGHT PARENTHESIS + '*' # 0x002a -> ASTERISK + '+' # 0x002b -> PLUS SIGN + ',' # 0x002c -> COMMA + '-' # 0x002d -> HYPHEN-MINUS + '.' # 0x002e -> FULL STOP + '/' # 0x002f -> SOLIDUS + '0' # 0x0030 -> DIGIT ZERO + '1' # 0x0031 -> DIGIT ONE + '2' # 0x0032 -> DIGIT TWO + '3' # 0x0033 -> DIGIT THREE + '4' # 0x0034 -> DIGIT FOUR + '5' # 0x0035 -> DIGIT FIVE + '6' # 0x0036 -> DIGIT SIX + '7' # 0x0037 -> DIGIT SEVEN + '8' # 0x0038 -> DIGIT EIGHT + '9' # 0x0039 -> DIGIT NINE + ':' # 0x003a -> COLON + ';' # 0x003b -> SEMICOLON + '<' # 0x003c -> LESS-THAN SIGN + '=' # 0x003d -> EQUALS SIGN + '>' # 0x003e -> GREATER-THAN SIGN + '?' # 0x003f -> QUESTION MARK + '@' # 0x0040 -> COMMERCIAL AT + 'A' # 0x0041 -> LATIN CAPITAL LETTER A + 'B' # 0x0042 -> LATIN CAPITAL LETTER B + 'C' # 0x0043 -> LATIN CAPITAL LETTER C + 'D' # 0x0044 -> LATIN CAPITAL LETTER D + 'E' # 0x0045 -> LATIN CAPITAL LETTER E + 'F' # 0x0046 -> LATIN CAPITAL LETTER F + 'G' # 0x0047 -> LATIN CAPITAL LETTER G + 'H' # 0x0048 -> LATIN CAPITAL LETTER H + 'I' # 0x0049 -> LATIN CAPITAL LETTER I + 'J' # 0x004a -> LATIN CAPITAL LETTER J + 'K' # 0x004b -> LATIN CAPITAL LETTER K + 'L' # 0x004c -> LATIN CAPITAL LETTER L + 'M' # 0x004d -> LATIN CAPITAL LETTER M + 'N' # 0x004e -> LATIN CAPITAL LETTER N + 'O' # 0x004f -> LATIN CAPITAL LETTER O + 'P' # 0x0050 -> LATIN CAPITAL LETTER P + 'Q' # 0x0051 -> LATIN CAPITAL LETTER Q + 'R' # 0x0052 -> LATIN CAPITAL LETTER R + 'S' # 0x0053 -> LATIN CAPITAL LETTER S + 'T' # 0x0054 -> LATIN CAPITAL LETTER T + 'U' # 0x0055 -> LATIN CAPITAL LETTER U + 'V' # 0x0056 -> LATIN CAPITAL LETTER V + 'W' # 0x0057 -> LATIN CAPITAL LETTER W + 'X' # 0x0058 -> LATIN CAPITAL LETTER X + 'Y' # 0x0059 -> LATIN CAPITAL LETTER Y + 'Z' # 0x005a -> LATIN CAPITAL LETTER Z + '[' # 0x005b -> LEFT SQUARE BRACKET + '\\' # 0x005c -> REVERSE SOLIDUS + ']' # 0x005d -> RIGHT SQUARE BRACKET + '^' # 0x005e -> CIRCUMFLEX ACCENT + '_' # 0x005f -> LOW LINE + '`' # 0x0060 -> GRAVE ACCENT + 'a' # 0x0061 -> LATIN SMALL LETTER A + 'b' # 0x0062 -> LATIN SMALL LETTER B + 'c' # 0x0063 -> LATIN SMALL LETTER C + 'd' # 0x0064 -> LATIN SMALL LETTER D + 'e' # 0x0065 -> LATIN SMALL LETTER E + 'f' # 0x0066 -> LATIN SMALL LETTER F + 'g' # 0x0067 -> LATIN SMALL LETTER G + 'h' # 0x0068 -> LATIN SMALL LETTER H + 'i' # 0x0069 -> LATIN SMALL LETTER I + 'j' # 0x006a -> LATIN SMALL LETTER J + 'k' # 0x006b -> LATIN SMALL LETTER K + 'l' # 0x006c -> LATIN SMALL LETTER L + 'm' # 0x006d -> LATIN SMALL LETTER M + 'n' # 0x006e -> LATIN SMALL LETTER N + 'o' # 0x006f -> LATIN SMALL LETTER O + 'p' # 0x0070 -> LATIN SMALL LETTER P + 'q' # 0x0071 -> LATIN SMALL LETTER Q + 'r' # 0x0072 -> LATIN SMALL LETTER R + 's' # 0x0073 -> LATIN SMALL LETTER S + 't' # 0x0074 -> LATIN SMALL LETTER T + 'u' # 0x0075 -> LATIN SMALL LETTER U + 'v' # 0x0076 -> LATIN SMALL LETTER V + 'w' # 0x0077 -> LATIN SMALL LETTER W + 'x' # 0x0078 -> LATIN SMALL LETTER X + 'y' # 0x0079 -> LATIN SMALL LETTER Y + 'z' # 0x007a -> LATIN SMALL LETTER Z + '{' # 0x007b -> LEFT CURLY BRACKET + '|' # 0x007c -> VERTICAL LINE + '}' # 0x007d -> RIGHT CURLY BRACKET + '~' # 0x007e -> TILDE + '\x7f' # 0x007f -> DELETE + '\u0106' # 0x0080 -> LATIN CAPITAL LETTER C WITH ACUTE + '\xfc' # 0x0081 -> LATIN SMALL LETTER U WITH DIAERESIS + '\xe9' # 0x0082 -> LATIN SMALL LETTER E WITH ACUTE + '\u0101' # 0x0083 -> LATIN SMALL LETTER A WITH MACRON + '\xe4' # 0x0084 -> LATIN SMALL LETTER A WITH DIAERESIS + '\u0123' # 0x0085 -> LATIN SMALL LETTER G WITH CEDILLA + '\xe5' # 0x0086 -> LATIN SMALL LETTER A WITH RING ABOVE + '\u0107' # 0x0087 -> LATIN SMALL LETTER C WITH ACUTE + '\u0142' # 0x0088 -> LATIN SMALL LETTER L WITH STROKE + '\u0113' # 0x0089 -> LATIN SMALL LETTER E WITH MACRON + '\u0156' # 0x008a -> LATIN CAPITAL LETTER R WITH CEDILLA + '\u0157' # 0x008b -> LATIN SMALL LETTER R WITH CEDILLA + '\u012b' # 0x008c -> LATIN SMALL LETTER I WITH MACRON + '\u0179' # 0x008d -> LATIN CAPITAL LETTER Z WITH ACUTE + '\xc4' # 0x008e -> LATIN CAPITAL LETTER A WITH DIAERESIS + '\xc5' # 0x008f -> LATIN CAPITAL LETTER A WITH RING ABOVE + '\xc9' # 0x0090 -> LATIN CAPITAL LETTER E WITH ACUTE + '\xe6' # 0x0091 -> LATIN SMALL LIGATURE AE + '\xc6' # 0x0092 -> LATIN CAPITAL LIGATURE AE + '\u014d' # 0x0093 -> LATIN SMALL LETTER O WITH MACRON + '\xf6' # 0x0094 -> LATIN SMALL LETTER O WITH DIAERESIS + '\u0122' # 0x0095 -> LATIN CAPITAL LETTER G WITH CEDILLA + '\xa2' # 0x0096 -> CENT SIGN + '\u015a' # 0x0097 -> LATIN CAPITAL LETTER S WITH ACUTE + '\u015b' # 0x0098 -> LATIN SMALL LETTER S WITH ACUTE + '\xd6' # 0x0099 -> LATIN CAPITAL LETTER O WITH DIAERESIS + '\xdc' # 0x009a -> LATIN CAPITAL LETTER U WITH DIAERESIS + '\xf8' # 0x009b -> LATIN SMALL LETTER O WITH STROKE + '\xa3' # 0x009c -> POUND SIGN + '\xd8' # 0x009d -> LATIN CAPITAL LETTER O WITH STROKE + '\xd7' # 0x009e -> MULTIPLICATION SIGN + '\xa4' # 0x009f -> CURRENCY SIGN + '\u0100' # 0x00a0 -> LATIN CAPITAL LETTER A WITH MACRON + '\u012a' # 0x00a1 -> LATIN CAPITAL LETTER I WITH MACRON + '\xf3' # 0x00a2 -> LATIN SMALL LETTER O WITH ACUTE + '\u017b' # 0x00a3 -> LATIN CAPITAL LETTER Z WITH DOT ABOVE + '\u017c' # 0x00a4 -> LATIN SMALL LETTER Z WITH DOT ABOVE + '\u017a' # 0x00a5 -> LATIN SMALL LETTER Z WITH ACUTE + '\u201d' # 0x00a6 -> RIGHT DOUBLE QUOTATION MARK + '\xa6' # 0x00a7 -> BROKEN BAR + '\xa9' # 0x00a8 -> COPYRIGHT SIGN + '\xae' # 0x00a9 -> REGISTERED SIGN + '\xac' # 0x00aa -> NOT SIGN + '\xbd' # 0x00ab -> VULGAR FRACTION ONE HALF + '\xbc' # 0x00ac -> VULGAR FRACTION ONE QUARTER + '\u0141' # 0x00ad -> LATIN CAPITAL LETTER L WITH STROKE + '\xab' # 0x00ae -> LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + '\xbb' # 0x00af -> RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + '\u2591' # 0x00b0 -> LIGHT SHADE + '\u2592' # 0x00b1 -> MEDIUM SHADE + '\u2593' # 0x00b2 -> DARK SHADE + '\u2502' # 0x00b3 -> BOX DRAWINGS LIGHT VERTICAL + '\u2524' # 0x00b4 -> BOX DRAWINGS LIGHT VERTICAL AND LEFT + '\u0104' # 0x00b5 -> LATIN CAPITAL LETTER A WITH OGONEK + '\u010c' # 0x00b6 -> LATIN CAPITAL LETTER C WITH CARON + '\u0118' # 0x00b7 -> LATIN CAPITAL LETTER E WITH OGONEK + '\u0116' # 0x00b8 -> LATIN CAPITAL LETTER E WITH DOT ABOVE + '\u2563' # 0x00b9 -> BOX DRAWINGS DOUBLE VERTICAL AND LEFT + '\u2551' # 0x00ba -> BOX DRAWINGS DOUBLE VERTICAL + '\u2557' # 0x00bb -> BOX DRAWINGS DOUBLE DOWN AND LEFT + '\u255d' # 0x00bc -> BOX DRAWINGS DOUBLE UP AND LEFT + '\u012e' # 0x00bd -> LATIN CAPITAL LETTER I WITH OGONEK + '\u0160' # 0x00be -> LATIN CAPITAL LETTER S WITH CARON + '\u2510' # 0x00bf -> BOX DRAWINGS LIGHT DOWN AND LEFT + '\u2514' # 0x00c0 -> BOX DRAWINGS LIGHT UP AND RIGHT + '\u2534' # 0x00c1 -> BOX DRAWINGS LIGHT UP AND HORIZONTAL + '\u252c' # 0x00c2 -> BOX DRAWINGS LIGHT DOWN AND HORIZONTAL + '\u251c' # 0x00c3 -> BOX DRAWINGS LIGHT VERTICAL AND RIGHT + '\u2500' # 0x00c4 -> BOX DRAWINGS LIGHT HORIZONTAL + '\u253c' # 0x00c5 -> BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL + '\u0172' # 0x00c6 -> LATIN CAPITAL LETTER U WITH OGONEK + '\u016a' # 0x00c7 -> LATIN CAPITAL LETTER U WITH MACRON + '\u255a' # 0x00c8 -> BOX DRAWINGS DOUBLE UP AND RIGHT + '\u2554' # 0x00c9 -> BOX DRAWINGS DOUBLE DOWN AND RIGHT + '\u2569' # 0x00ca -> BOX DRAWINGS DOUBLE UP AND HORIZONTAL + '\u2566' # 0x00cb -> BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL + '\u2560' # 0x00cc -> BOX DRAWINGS DOUBLE VERTICAL AND RIGHT + '\u2550' # 0x00cd -> BOX DRAWINGS DOUBLE HORIZONTAL + '\u256c' # 0x00ce -> BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL + '\u017d' # 0x00cf -> LATIN CAPITAL LETTER Z WITH CARON + '\u0105' # 0x00d0 -> LATIN SMALL LETTER A WITH OGONEK + '\u010d' # 0x00d1 -> LATIN SMALL LETTER C WITH CARON + '\u0119' # 0x00d2 -> LATIN SMALL LETTER E WITH OGONEK + '\u0117' # 0x00d3 -> LATIN SMALL LETTER E WITH DOT ABOVE + '\u012f' # 0x00d4 -> LATIN SMALL LETTER I WITH OGONEK + '\u0161' # 0x00d5 -> LATIN SMALL LETTER S WITH CARON + '\u0173' # 0x00d6 -> LATIN SMALL LETTER U WITH OGONEK + '\u016b' # 0x00d7 -> LATIN SMALL LETTER U WITH MACRON + '\u017e' # 0x00d8 -> LATIN SMALL LETTER Z WITH CARON + '\u2518' # 0x00d9 -> BOX DRAWINGS LIGHT UP AND LEFT + '\u250c' # 0x00da -> BOX DRAWINGS LIGHT DOWN AND RIGHT + '\u2588' # 0x00db -> FULL BLOCK + '\u2584' # 0x00dc -> LOWER HALF BLOCK + '\u258c' # 0x00dd -> LEFT HALF BLOCK + '\u2590' # 0x00de -> RIGHT HALF BLOCK + '\u2580' # 0x00df -> UPPER HALF BLOCK + '\xd3' # 0x00e0 -> LATIN CAPITAL LETTER O WITH ACUTE + '\xdf' # 0x00e1 -> LATIN SMALL LETTER SHARP S (GERMAN) + '\u014c' # 0x00e2 -> LATIN CAPITAL LETTER O WITH MACRON + '\u0143' # 0x00e3 -> LATIN CAPITAL LETTER N WITH ACUTE + '\xf5' # 0x00e4 -> LATIN SMALL LETTER O WITH TILDE + '\xd5' # 0x00e5 -> LATIN CAPITAL LETTER O WITH TILDE + '\xb5' # 0x00e6 -> MICRO SIGN + '\u0144' # 0x00e7 -> LATIN SMALL LETTER N WITH ACUTE + '\u0136' # 0x00e8 -> LATIN CAPITAL LETTER K WITH CEDILLA + '\u0137' # 0x00e9 -> LATIN SMALL LETTER K WITH CEDILLA + '\u013b' # 0x00ea -> LATIN CAPITAL LETTER L WITH CEDILLA + '\u013c' # 0x00eb -> LATIN SMALL LETTER L WITH CEDILLA + '\u0146' # 0x00ec -> LATIN SMALL LETTER N WITH CEDILLA + '\u0112' # 0x00ed -> LATIN CAPITAL LETTER E WITH MACRON + '\u0145' # 0x00ee -> LATIN CAPITAL LETTER N WITH CEDILLA + '\u2019' # 0x00ef -> RIGHT SINGLE QUOTATION MARK + '\xad' # 0x00f0 -> SOFT HYPHEN + '\xb1' # 0x00f1 -> PLUS-MINUS SIGN + '\u201c' # 0x00f2 -> LEFT DOUBLE QUOTATION MARK + '\xbe' # 0x00f3 -> VULGAR FRACTION THREE QUARTERS + '\xb6' # 0x00f4 -> PILCROW SIGN + '\xa7' # 0x00f5 -> SECTION SIGN + '\xf7' # 0x00f6 -> DIVISION SIGN + '\u201e' # 0x00f7 -> DOUBLE LOW-9 QUOTATION MARK + '\xb0' # 0x00f8 -> DEGREE SIGN + '\u2219' # 0x00f9 -> BULLET OPERATOR + '\xb7' # 0x00fa -> MIDDLE DOT + '\xb9' # 0x00fb -> SUPERSCRIPT ONE + '\xb3' # 0x00fc -> SUPERSCRIPT THREE + '\xb2' # 0x00fd -> SUPERSCRIPT TWO + '\u25a0' # 0x00fe -> BLACK SQUARE + '\xa0' # 0x00ff -> NO-BREAK SPACE +) + +### Encoding Map + +encoding_map = { + 0x0000: 0x0000, # NULL + 0x0001: 0x0001, # START OF HEADING + 0x0002: 0x0002, # START OF TEXT + 0x0003: 0x0003, # END OF TEXT + 0x0004: 0x0004, # END OF TRANSMISSION + 0x0005: 0x0005, # ENQUIRY + 0x0006: 0x0006, # ACKNOWLEDGE + 0x0007: 0x0007, # BELL + 0x0008: 0x0008, # BACKSPACE + 0x0009: 0x0009, # HORIZONTAL TABULATION + 0x000a: 0x000a, # LINE FEED + 0x000b: 0x000b, # VERTICAL TABULATION + 0x000c: 0x000c, # FORM FEED + 0x000d: 0x000d, # CARRIAGE RETURN + 0x000e: 0x000e, # SHIFT OUT + 0x000f: 0x000f, # SHIFT IN + 0x0010: 0x0010, # DATA LINK ESCAPE + 0x0011: 0x0011, # DEVICE CONTROL ONE + 0x0012: 0x0012, # DEVICE CONTROL TWO + 0x0013: 0x0013, # DEVICE CONTROL THREE + 0x0014: 0x0014, # DEVICE CONTROL FOUR + 0x0015: 0x0015, # NEGATIVE ACKNOWLEDGE + 0x0016: 0x0016, # SYNCHRONOUS IDLE + 0x0017: 0x0017, # END OF TRANSMISSION BLOCK + 0x0018: 0x0018, # CANCEL + 0x0019: 0x0019, # END OF MEDIUM + 0x001a: 0x001a, # SUBSTITUTE + 0x001b: 0x001b, # ESCAPE + 0x001c: 0x001c, # FILE SEPARATOR + 0x001d: 0x001d, # GROUP SEPARATOR + 0x001e: 0x001e, # RECORD SEPARATOR + 0x001f: 0x001f, # UNIT SEPARATOR + 0x0020: 0x0020, # SPACE + 0x0021: 0x0021, # EXCLAMATION MARK + 0x0022: 0x0022, # QUOTATION MARK + 0x0023: 0x0023, # NUMBER SIGN + 0x0024: 0x0024, # DOLLAR SIGN + 0x0025: 0x0025, # PERCENT SIGN + 0x0026: 0x0026, # AMPERSAND + 0x0027: 0x0027, # APOSTROPHE + 0x0028: 0x0028, # LEFT PARENTHESIS + 0x0029: 0x0029, # RIGHT PARENTHESIS + 0x002a: 0x002a, # ASTERISK + 0x002b: 0x002b, # PLUS SIGN + 0x002c: 0x002c, # COMMA + 0x002d: 0x002d, # HYPHEN-MINUS + 0x002e: 0x002e, # FULL STOP + 0x002f: 0x002f, # SOLIDUS + 0x0030: 0x0030, # DIGIT ZERO + 0x0031: 0x0031, # DIGIT ONE + 0x0032: 0x0032, # DIGIT TWO + 0x0033: 0x0033, # DIGIT THREE + 0x0034: 0x0034, # DIGIT FOUR + 0x0035: 0x0035, # DIGIT FIVE + 0x0036: 0x0036, # DIGIT SIX + 0x0037: 0x0037, # DIGIT SEVEN + 0x0038: 0x0038, # DIGIT EIGHT + 0x0039: 0x0039, # DIGIT NINE + 0x003a: 0x003a, # COLON + 0x003b: 0x003b, # SEMICOLON + 0x003c: 0x003c, # LESS-THAN SIGN + 0x003d: 0x003d, # EQUALS SIGN + 0x003e: 0x003e, # GREATER-THAN SIGN + 0x003f: 0x003f, # QUESTION MARK + 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 + 0x005c: 0x005c, # REVERSE SOLIDUS + 0x005d: 0x005d, # RIGHT SQUARE BRACKET + 0x005e: 0x005e, # CIRCUMFLEX ACCENT + 0x005f: 0x005f, # LOW LINE + 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 + 0x007c: 0x007c, # VERTICAL LINE + 0x007d: 0x007d, # RIGHT CURLY BRACKET + 0x007e: 0x007e, # TILDE + 0x007f: 0x007f, # DELETE + 0x00a0: 0x00ff, # NO-BREAK SPACE + 0x00a2: 0x0096, # CENT SIGN + 0x00a3: 0x009c, # POUND SIGN + 0x00a4: 0x009f, # CURRENCY SIGN + 0x00a6: 0x00a7, # BROKEN BAR + 0x00a7: 0x00f5, # SECTION SIGN + 0x00a9: 0x00a8, # COPYRIGHT SIGN + 0x00ab: 0x00ae, # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00ac: 0x00aa, # NOT SIGN + 0x00ad: 0x00f0, # SOFT HYPHEN + 0x00ae: 0x00a9, # REGISTERED SIGN + 0x00b0: 0x00f8, # DEGREE SIGN + 0x00b1: 0x00f1, # PLUS-MINUS SIGN + 0x00b2: 0x00fd, # SUPERSCRIPT TWO + 0x00b3: 0x00fc, # SUPERSCRIPT THREE + 0x00b5: 0x00e6, # MICRO SIGN + 0x00b6: 0x00f4, # PILCROW SIGN + 0x00b7: 0x00fa, # MIDDLE DOT + 0x00b9: 0x00fb, # SUPERSCRIPT ONE + 0x00bb: 0x00af, # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00bc: 0x00ac, # VULGAR FRACTION ONE QUARTER + 0x00bd: 0x00ab, # VULGAR FRACTION ONE HALF + 0x00be: 0x00f3, # VULGAR FRACTION THREE QUARTERS + 0x00c4: 0x008e, # LATIN CAPITAL LETTER A WITH DIAERESIS + 0x00c5: 0x008f, # LATIN CAPITAL LETTER A WITH RING ABOVE + 0x00c6: 0x0092, # LATIN CAPITAL LIGATURE AE + 0x00c9: 0x0090, # LATIN CAPITAL LETTER E WITH ACUTE + 0x00d3: 0x00e0, # LATIN CAPITAL LETTER O WITH ACUTE + 0x00d5: 0x00e5, # LATIN CAPITAL LETTER O WITH TILDE + 0x00d6: 0x0099, # LATIN CAPITAL LETTER O WITH DIAERESIS + 0x00d7: 0x009e, # MULTIPLICATION SIGN + 0x00d8: 0x009d, # LATIN CAPITAL LETTER O WITH STROKE + 0x00dc: 0x009a, # LATIN CAPITAL LETTER U WITH DIAERESIS + 0x00df: 0x00e1, # LATIN SMALL LETTER SHARP S (GERMAN) + 0x00e4: 0x0084, # LATIN SMALL LETTER A WITH DIAERESIS + 0x00e5: 0x0086, # LATIN SMALL LETTER A WITH RING ABOVE + 0x00e6: 0x0091, # LATIN SMALL LIGATURE AE + 0x00e9: 0x0082, # LATIN SMALL LETTER E WITH ACUTE + 0x00f3: 0x00a2, # LATIN SMALL LETTER O WITH ACUTE + 0x00f5: 0x00e4, # LATIN SMALL LETTER O WITH TILDE + 0x00f6: 0x0094, # LATIN SMALL LETTER O WITH DIAERESIS + 0x00f7: 0x00f6, # DIVISION SIGN + 0x00f8: 0x009b, # LATIN SMALL LETTER O WITH STROKE + 0x00fc: 0x0081, # LATIN SMALL LETTER U WITH DIAERESIS + 0x0100: 0x00a0, # LATIN CAPITAL LETTER A WITH MACRON + 0x0101: 0x0083, # LATIN SMALL LETTER A WITH MACRON + 0x0104: 0x00b5, # LATIN CAPITAL LETTER A WITH OGONEK + 0x0105: 0x00d0, # LATIN SMALL LETTER A WITH OGONEK + 0x0106: 0x0080, # LATIN CAPITAL LETTER C WITH ACUTE + 0x0107: 0x0087, # LATIN SMALL LETTER C WITH ACUTE + 0x010c: 0x00b6, # LATIN CAPITAL LETTER C WITH CARON + 0x010d: 0x00d1, # LATIN SMALL LETTER C WITH CARON + 0x0112: 0x00ed, # LATIN CAPITAL LETTER E WITH MACRON + 0x0113: 0x0089, # LATIN SMALL LETTER E WITH MACRON + 0x0116: 0x00b8, # LATIN CAPITAL LETTER E WITH DOT ABOVE + 0x0117: 0x00d3, # LATIN SMALL LETTER E WITH DOT ABOVE + 0x0118: 0x00b7, # LATIN CAPITAL LETTER E WITH OGONEK + 0x0119: 0x00d2, # LATIN SMALL LETTER E WITH OGONEK + 0x0122: 0x0095, # LATIN CAPITAL LETTER G WITH CEDILLA + 0x0123: 0x0085, # LATIN SMALL LETTER G WITH CEDILLA + 0x012a: 0x00a1, # LATIN CAPITAL LETTER I WITH MACRON + 0x012b: 0x008c, # LATIN SMALL LETTER I WITH MACRON + 0x012e: 0x00bd, # LATIN CAPITAL LETTER I WITH OGONEK + 0x012f: 0x00d4, # LATIN SMALL LETTER I WITH OGONEK + 0x0136: 0x00e8, # LATIN CAPITAL LETTER K WITH CEDILLA + 0x0137: 0x00e9, # LATIN SMALL LETTER K WITH CEDILLA + 0x013b: 0x00ea, # LATIN CAPITAL LETTER L WITH CEDILLA + 0x013c: 0x00eb, # LATIN SMALL LETTER L WITH CEDILLA + 0x0141: 0x00ad, # LATIN CAPITAL LETTER L WITH STROKE + 0x0142: 0x0088, # LATIN SMALL LETTER L WITH STROKE + 0x0143: 0x00e3, # LATIN CAPITAL LETTER N WITH ACUTE + 0x0144: 0x00e7, # LATIN SMALL LETTER N WITH ACUTE + 0x0145: 0x00ee, # LATIN CAPITAL LETTER N WITH CEDILLA + 0x0146: 0x00ec, # LATIN SMALL LETTER N WITH CEDILLA + 0x014c: 0x00e2, # LATIN CAPITAL LETTER O WITH MACRON + 0x014d: 0x0093, # LATIN SMALL LETTER O WITH MACRON + 0x0156: 0x008a, # LATIN CAPITAL LETTER R WITH CEDILLA + 0x0157: 0x008b, # LATIN SMALL LETTER R WITH CEDILLA + 0x015a: 0x0097, # LATIN CAPITAL LETTER S WITH ACUTE + 0x015b: 0x0098, # LATIN SMALL LETTER S WITH ACUTE + 0x0160: 0x00be, # LATIN CAPITAL LETTER S WITH CARON + 0x0161: 0x00d5, # LATIN SMALL LETTER S WITH CARON + 0x016a: 0x00c7, # LATIN CAPITAL LETTER U WITH MACRON + 0x016b: 0x00d7, # LATIN SMALL LETTER U WITH MACRON + 0x0172: 0x00c6, # LATIN CAPITAL LETTER U WITH OGONEK + 0x0173: 0x00d6, # LATIN SMALL LETTER U WITH OGONEK + 0x0179: 0x008d, # LATIN CAPITAL LETTER Z WITH ACUTE + 0x017a: 0x00a5, # LATIN SMALL LETTER Z WITH ACUTE + 0x017b: 0x00a3, # LATIN CAPITAL LETTER Z WITH DOT ABOVE + 0x017c: 0x00a4, # LATIN SMALL LETTER Z WITH DOT ABOVE + 0x017d: 0x00cf, # LATIN CAPITAL LETTER Z WITH CARON + 0x017e: 0x00d8, # LATIN SMALL LETTER Z WITH CARON + 0x2019: 0x00ef, # RIGHT SINGLE QUOTATION MARK + 0x201c: 0x00f2, # LEFT DOUBLE QUOTATION MARK + 0x201d: 0x00a6, # RIGHT DOUBLE QUOTATION MARK + 0x201e: 0x00f7, # DOUBLE LOW-9 QUOTATION MARK + 0x2219: 0x00f9, # BULLET OPERATOR + 0x2500: 0x00c4, # BOX DRAWINGS LIGHT HORIZONTAL + 0x2502: 0x00b3, # BOX DRAWINGS LIGHT VERTICAL + 0x250c: 0x00da, # BOX DRAWINGS LIGHT DOWN AND RIGHT + 0x2510: 0x00bf, # BOX DRAWINGS LIGHT DOWN AND LEFT + 0x2514: 0x00c0, # BOX DRAWINGS LIGHT UP AND RIGHT + 0x2518: 0x00d9, # BOX DRAWINGS LIGHT UP AND LEFT + 0x251c: 0x00c3, # BOX DRAWINGS LIGHT VERTICAL AND RIGHT + 0x2524: 0x00b4, # BOX DRAWINGS LIGHT VERTICAL AND LEFT + 0x252c: 0x00c2, # BOX DRAWINGS LIGHT DOWN AND HORIZONTAL + 0x2534: 0x00c1, # BOX DRAWINGS LIGHT UP AND HORIZONTAL + 0x253c: 0x00c5, # BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL + 0x2550: 0x00cd, # BOX DRAWINGS DOUBLE HORIZONTAL + 0x2551: 0x00ba, # BOX DRAWINGS DOUBLE VERTICAL + 0x2554: 0x00c9, # BOX DRAWINGS DOUBLE DOWN AND RIGHT + 0x2557: 0x00bb, # BOX DRAWINGS DOUBLE DOWN AND LEFT + 0x255a: 0x00c8, # BOX DRAWINGS DOUBLE UP AND RIGHT + 0x255d: 0x00bc, # BOX DRAWINGS DOUBLE UP AND LEFT + 0x2560: 0x00cc, # BOX DRAWINGS DOUBLE VERTICAL AND RIGHT + 0x2563: 0x00b9, # BOX DRAWINGS DOUBLE VERTICAL AND LEFT + 0x2566: 0x00cb, # BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL + 0x2569: 0x00ca, # BOX DRAWINGS DOUBLE UP AND HORIZONTAL + 0x256c: 0x00ce, # BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL + 0x2580: 0x00df, # UPPER HALF BLOCK + 0x2584: 0x00dc, # LOWER HALF BLOCK + 0x2588: 0x00db, # FULL BLOCK + 0x258c: 0x00dd, # LEFT HALF BLOCK + 0x2590: 0x00de, # RIGHT HALF BLOCK + 0x2591: 0x00b0, # LIGHT SHADE + 0x2592: 0x00b1, # MEDIUM SHADE + 0x2593: 0x00b2, # DARK SHADE + 0x25a0: 0x00fe, # BLACK SQUARE +} diff --git a/env/Lib/encodings/cp850.py b/env/Lib/encodings/cp850.py new file mode 100644 index 0000000..f98aef9 --- /dev/null +++ b/env/Lib/encodings/cp850.py @@ -0,0 +1,698 @@ +""" Python Character Mapping Codec generated from 'VENDORS/MICSFT/PC/CP850.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_map) + + 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_map)[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='cp850', + 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: 0x00c7, # LATIN CAPITAL LETTER C WITH CEDILLA + 0x0081: 0x00fc, # LATIN SMALL LETTER U WITH DIAERESIS + 0x0082: 0x00e9, # LATIN SMALL LETTER E WITH ACUTE + 0x0083: 0x00e2, # LATIN SMALL LETTER A WITH CIRCUMFLEX + 0x0084: 0x00e4, # LATIN SMALL LETTER A WITH DIAERESIS + 0x0085: 0x00e0, # LATIN SMALL LETTER A WITH GRAVE + 0x0086: 0x00e5, # LATIN SMALL LETTER A WITH RING ABOVE + 0x0087: 0x00e7, # LATIN SMALL LETTER C WITH CEDILLA + 0x0088: 0x00ea, # LATIN SMALL LETTER E WITH CIRCUMFLEX + 0x0089: 0x00eb, # LATIN SMALL LETTER E WITH DIAERESIS + 0x008a: 0x00e8, # LATIN SMALL LETTER E WITH GRAVE + 0x008b: 0x00ef, # LATIN SMALL LETTER I WITH DIAERESIS + 0x008c: 0x00ee, # LATIN SMALL LETTER I WITH CIRCUMFLEX + 0x008d: 0x00ec, # LATIN SMALL LETTER I WITH GRAVE + 0x008e: 0x00c4, # LATIN CAPITAL LETTER A WITH DIAERESIS + 0x008f: 0x00c5, # LATIN CAPITAL LETTER A WITH RING ABOVE + 0x0090: 0x00c9, # LATIN CAPITAL LETTER E WITH ACUTE + 0x0091: 0x00e6, # LATIN SMALL LIGATURE AE + 0x0092: 0x00c6, # LATIN CAPITAL LIGATURE AE + 0x0093: 0x00f4, # LATIN SMALL LETTER O WITH CIRCUMFLEX + 0x0094: 0x00f6, # LATIN SMALL LETTER O WITH DIAERESIS + 0x0095: 0x00f2, # LATIN SMALL LETTER O WITH GRAVE + 0x0096: 0x00fb, # LATIN SMALL LETTER U WITH CIRCUMFLEX + 0x0097: 0x00f9, # LATIN SMALL LETTER U WITH GRAVE + 0x0098: 0x00ff, # LATIN SMALL LETTER Y WITH DIAERESIS + 0x0099: 0x00d6, # LATIN CAPITAL LETTER O WITH DIAERESIS + 0x009a: 0x00dc, # LATIN CAPITAL LETTER U WITH DIAERESIS + 0x009b: 0x00f8, # LATIN SMALL LETTER O WITH STROKE + 0x009c: 0x00a3, # POUND SIGN + 0x009d: 0x00d8, # LATIN CAPITAL LETTER O WITH STROKE + 0x009e: 0x00d7, # MULTIPLICATION SIGN + 0x009f: 0x0192, # LATIN SMALL LETTER F WITH HOOK + 0x00a0: 0x00e1, # LATIN SMALL LETTER A WITH ACUTE + 0x00a1: 0x00ed, # LATIN SMALL LETTER I WITH ACUTE + 0x00a2: 0x00f3, # LATIN SMALL LETTER O WITH ACUTE + 0x00a3: 0x00fa, # LATIN SMALL LETTER U WITH ACUTE + 0x00a4: 0x00f1, # LATIN SMALL LETTER N WITH TILDE + 0x00a5: 0x00d1, # LATIN CAPITAL LETTER N WITH TILDE + 0x00a6: 0x00aa, # FEMININE ORDINAL INDICATOR + 0x00a7: 0x00ba, # MASCULINE ORDINAL INDICATOR + 0x00a8: 0x00bf, # INVERTED QUESTION MARK + 0x00a9: 0x00ae, # REGISTERED SIGN + 0x00aa: 0x00ac, # NOT SIGN + 0x00ab: 0x00bd, # VULGAR FRACTION ONE HALF + 0x00ac: 0x00bc, # VULGAR FRACTION ONE QUARTER + 0x00ad: 0x00a1, # INVERTED EXCLAMATION MARK + 0x00ae: 0x00ab, # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00af: 0x00bb, # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00b0: 0x2591, # LIGHT SHADE + 0x00b1: 0x2592, # MEDIUM SHADE + 0x00b2: 0x2593, # DARK SHADE + 0x00b3: 0x2502, # BOX DRAWINGS LIGHT VERTICAL + 0x00b4: 0x2524, # BOX DRAWINGS LIGHT VERTICAL AND LEFT + 0x00b5: 0x00c1, # LATIN CAPITAL LETTER A WITH ACUTE + 0x00b6: 0x00c2, # LATIN CAPITAL LETTER A WITH CIRCUMFLEX + 0x00b7: 0x00c0, # LATIN CAPITAL LETTER A WITH GRAVE + 0x00b8: 0x00a9, # COPYRIGHT SIGN + 0x00b9: 0x2563, # BOX DRAWINGS DOUBLE VERTICAL AND LEFT + 0x00ba: 0x2551, # BOX DRAWINGS DOUBLE VERTICAL + 0x00bb: 0x2557, # BOX DRAWINGS DOUBLE DOWN AND LEFT + 0x00bc: 0x255d, # BOX DRAWINGS DOUBLE UP AND LEFT + 0x00bd: 0x00a2, # CENT SIGN + 0x00be: 0x00a5, # YEN SIGN + 0x00bf: 0x2510, # BOX DRAWINGS LIGHT DOWN AND LEFT + 0x00c0: 0x2514, # BOX DRAWINGS LIGHT UP AND RIGHT + 0x00c1: 0x2534, # BOX DRAWINGS LIGHT UP AND HORIZONTAL + 0x00c2: 0x252c, # BOX DRAWINGS LIGHT DOWN AND HORIZONTAL + 0x00c3: 0x251c, # BOX DRAWINGS LIGHT VERTICAL AND RIGHT + 0x00c4: 0x2500, # BOX DRAWINGS LIGHT HORIZONTAL + 0x00c5: 0x253c, # BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL + 0x00c6: 0x00e3, # LATIN SMALL LETTER A WITH TILDE + 0x00c7: 0x00c3, # LATIN CAPITAL LETTER A WITH TILDE + 0x00c8: 0x255a, # BOX DRAWINGS DOUBLE UP AND RIGHT + 0x00c9: 0x2554, # BOX DRAWINGS DOUBLE DOWN AND RIGHT + 0x00ca: 0x2569, # BOX DRAWINGS DOUBLE UP AND HORIZONTAL + 0x00cb: 0x2566, # BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL + 0x00cc: 0x2560, # BOX DRAWINGS DOUBLE VERTICAL AND RIGHT + 0x00cd: 0x2550, # BOX DRAWINGS DOUBLE HORIZONTAL + 0x00ce: 0x256c, # BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL + 0x00cf: 0x00a4, # CURRENCY SIGN + 0x00d0: 0x00f0, # LATIN SMALL LETTER ETH + 0x00d1: 0x00d0, # LATIN CAPITAL LETTER ETH + 0x00d2: 0x00ca, # LATIN CAPITAL LETTER E WITH CIRCUMFLEX + 0x00d3: 0x00cb, # LATIN CAPITAL LETTER E WITH DIAERESIS + 0x00d4: 0x00c8, # LATIN CAPITAL LETTER E WITH GRAVE + 0x00d5: 0x0131, # LATIN SMALL LETTER DOTLESS I + 0x00d6: 0x00cd, # LATIN CAPITAL LETTER I WITH ACUTE + 0x00d7: 0x00ce, # LATIN CAPITAL LETTER I WITH CIRCUMFLEX + 0x00d8: 0x00cf, # LATIN CAPITAL LETTER I WITH DIAERESIS + 0x00d9: 0x2518, # BOX DRAWINGS LIGHT UP AND LEFT + 0x00da: 0x250c, # BOX DRAWINGS LIGHT DOWN AND RIGHT + 0x00db: 0x2588, # FULL BLOCK + 0x00dc: 0x2584, # LOWER HALF BLOCK + 0x00dd: 0x00a6, # BROKEN BAR + 0x00de: 0x00cc, # LATIN CAPITAL LETTER I WITH GRAVE + 0x00df: 0x2580, # UPPER HALF BLOCK + 0x00e0: 0x00d3, # LATIN CAPITAL LETTER O WITH ACUTE + 0x00e1: 0x00df, # LATIN SMALL LETTER SHARP S + 0x00e2: 0x00d4, # LATIN CAPITAL LETTER O WITH CIRCUMFLEX + 0x00e3: 0x00d2, # LATIN CAPITAL LETTER O WITH GRAVE + 0x00e4: 0x00f5, # LATIN SMALL LETTER O WITH TILDE + 0x00e5: 0x00d5, # LATIN CAPITAL LETTER O WITH TILDE + 0x00e6: 0x00b5, # MICRO SIGN + 0x00e7: 0x00fe, # LATIN SMALL LETTER THORN + 0x00e8: 0x00de, # LATIN CAPITAL LETTER THORN + 0x00e9: 0x00da, # LATIN CAPITAL LETTER U WITH ACUTE + 0x00ea: 0x00db, # LATIN CAPITAL LETTER U WITH CIRCUMFLEX + 0x00eb: 0x00d9, # LATIN CAPITAL LETTER U WITH GRAVE + 0x00ec: 0x00fd, # LATIN SMALL LETTER Y WITH ACUTE + 0x00ed: 0x00dd, # LATIN CAPITAL LETTER Y WITH ACUTE + 0x00ee: 0x00af, # MACRON + 0x00ef: 0x00b4, # ACUTE ACCENT + 0x00f0: 0x00ad, # SOFT HYPHEN + 0x00f1: 0x00b1, # PLUS-MINUS SIGN + 0x00f2: 0x2017, # DOUBLE LOW LINE + 0x00f3: 0x00be, # VULGAR FRACTION THREE QUARTERS + 0x00f4: 0x00b6, # PILCROW SIGN + 0x00f5: 0x00a7, # SECTION SIGN + 0x00f6: 0x00f7, # DIVISION SIGN + 0x00f7: 0x00b8, # CEDILLA + 0x00f8: 0x00b0, # DEGREE SIGN + 0x00f9: 0x00a8, # DIAERESIS + 0x00fa: 0x00b7, # MIDDLE DOT + 0x00fb: 0x00b9, # SUPERSCRIPT ONE + 0x00fc: 0x00b3, # SUPERSCRIPT THREE + 0x00fd: 0x00b2, # SUPERSCRIPT TWO + 0x00fe: 0x25a0, # BLACK SQUARE + 0x00ff: 0x00a0, # NO-BREAK SPACE +}) + +### Decoding Table + +decoding_table = ( + '\x00' # 0x0000 -> NULL + '\x01' # 0x0001 -> START OF HEADING + '\x02' # 0x0002 -> START OF TEXT + '\x03' # 0x0003 -> END OF TEXT + '\x04' # 0x0004 -> END OF TRANSMISSION + '\x05' # 0x0005 -> ENQUIRY + '\x06' # 0x0006 -> ACKNOWLEDGE + '\x07' # 0x0007 -> BELL + '\x08' # 0x0008 -> BACKSPACE + '\t' # 0x0009 -> HORIZONTAL TABULATION + '\n' # 0x000a -> LINE FEED + '\x0b' # 0x000b -> VERTICAL TABULATION + '\x0c' # 0x000c -> FORM FEED + '\r' # 0x000d -> CARRIAGE RETURN + '\x0e' # 0x000e -> SHIFT OUT + '\x0f' # 0x000f -> SHIFT IN + '\x10' # 0x0010 -> DATA LINK ESCAPE + '\x11' # 0x0011 -> DEVICE CONTROL ONE + '\x12' # 0x0012 -> DEVICE CONTROL TWO + '\x13' # 0x0013 -> DEVICE CONTROL THREE + '\x14' # 0x0014 -> DEVICE CONTROL FOUR + '\x15' # 0x0015 -> NEGATIVE ACKNOWLEDGE + '\x16' # 0x0016 -> SYNCHRONOUS IDLE + '\x17' # 0x0017 -> END OF TRANSMISSION BLOCK + '\x18' # 0x0018 -> CANCEL + '\x19' # 0x0019 -> END OF MEDIUM + '\x1a' # 0x001a -> SUBSTITUTE + '\x1b' # 0x001b -> ESCAPE + '\x1c' # 0x001c -> FILE SEPARATOR + '\x1d' # 0x001d -> GROUP SEPARATOR + '\x1e' # 0x001e -> RECORD SEPARATOR + '\x1f' # 0x001f -> UNIT SEPARATOR + ' ' # 0x0020 -> SPACE + '!' # 0x0021 -> EXCLAMATION MARK + '"' # 0x0022 -> QUOTATION MARK + '#' # 0x0023 -> NUMBER SIGN + '$' # 0x0024 -> DOLLAR SIGN + '%' # 0x0025 -> PERCENT SIGN + '&' # 0x0026 -> AMPERSAND + "'" # 0x0027 -> APOSTROPHE + '(' # 0x0028 -> LEFT PARENTHESIS + ')' # 0x0029 -> RIGHT PARENTHESIS + '*' # 0x002a -> ASTERISK + '+' # 0x002b -> PLUS SIGN + ',' # 0x002c -> COMMA + '-' # 0x002d -> HYPHEN-MINUS + '.' # 0x002e -> FULL STOP + '/' # 0x002f -> SOLIDUS + '0' # 0x0030 -> DIGIT ZERO + '1' # 0x0031 -> DIGIT ONE + '2' # 0x0032 -> DIGIT TWO + '3' # 0x0033 -> DIGIT THREE + '4' # 0x0034 -> DIGIT FOUR + '5' # 0x0035 -> DIGIT FIVE + '6' # 0x0036 -> DIGIT SIX + '7' # 0x0037 -> DIGIT SEVEN + '8' # 0x0038 -> DIGIT EIGHT + '9' # 0x0039 -> DIGIT NINE + ':' # 0x003a -> COLON + ';' # 0x003b -> SEMICOLON + '<' # 0x003c -> LESS-THAN SIGN + '=' # 0x003d -> EQUALS SIGN + '>' # 0x003e -> GREATER-THAN SIGN + '?' # 0x003f -> QUESTION MARK + '@' # 0x0040 -> COMMERCIAL AT + 'A' # 0x0041 -> LATIN CAPITAL LETTER A + 'B' # 0x0042 -> LATIN CAPITAL LETTER B + 'C' # 0x0043 -> LATIN CAPITAL LETTER C + 'D' # 0x0044 -> LATIN CAPITAL LETTER D + 'E' # 0x0045 -> LATIN CAPITAL LETTER E + 'F' # 0x0046 -> LATIN CAPITAL LETTER F + 'G' # 0x0047 -> LATIN CAPITAL LETTER G + 'H' # 0x0048 -> LATIN CAPITAL LETTER H + 'I' # 0x0049 -> LATIN CAPITAL LETTER I + 'J' # 0x004a -> LATIN CAPITAL LETTER J + 'K' # 0x004b -> LATIN CAPITAL LETTER K + 'L' # 0x004c -> LATIN CAPITAL LETTER L + 'M' # 0x004d -> LATIN CAPITAL LETTER M + 'N' # 0x004e -> LATIN CAPITAL LETTER N + 'O' # 0x004f -> LATIN CAPITAL LETTER O + 'P' # 0x0050 -> LATIN CAPITAL LETTER P + 'Q' # 0x0051 -> LATIN CAPITAL LETTER Q + 'R' # 0x0052 -> LATIN CAPITAL LETTER R + 'S' # 0x0053 -> LATIN CAPITAL LETTER S + 'T' # 0x0054 -> LATIN CAPITAL LETTER T + 'U' # 0x0055 -> LATIN CAPITAL LETTER U + 'V' # 0x0056 -> LATIN CAPITAL LETTER V + 'W' # 0x0057 -> LATIN CAPITAL LETTER W + 'X' # 0x0058 -> LATIN CAPITAL LETTER X + 'Y' # 0x0059 -> LATIN CAPITAL LETTER Y + 'Z' # 0x005a -> LATIN CAPITAL LETTER Z + '[' # 0x005b -> LEFT SQUARE BRACKET + '\\' # 0x005c -> REVERSE SOLIDUS + ']' # 0x005d -> RIGHT SQUARE BRACKET + '^' # 0x005e -> CIRCUMFLEX ACCENT + '_' # 0x005f -> LOW LINE + '`' # 0x0060 -> GRAVE ACCENT + 'a' # 0x0061 -> LATIN SMALL LETTER A + 'b' # 0x0062 -> LATIN SMALL LETTER B + 'c' # 0x0063 -> LATIN SMALL LETTER C + 'd' # 0x0064 -> LATIN SMALL LETTER D + 'e' # 0x0065 -> LATIN SMALL LETTER E + 'f' # 0x0066 -> LATIN SMALL LETTER F + 'g' # 0x0067 -> LATIN SMALL LETTER G + 'h' # 0x0068 -> LATIN SMALL LETTER H + 'i' # 0x0069 -> LATIN SMALL LETTER I + 'j' # 0x006a -> LATIN SMALL LETTER J + 'k' # 0x006b -> LATIN SMALL LETTER K + 'l' # 0x006c -> LATIN SMALL LETTER L + 'm' # 0x006d -> LATIN SMALL LETTER M + 'n' # 0x006e -> LATIN SMALL LETTER N + 'o' # 0x006f -> LATIN SMALL LETTER O + 'p' # 0x0070 -> LATIN SMALL LETTER P + 'q' # 0x0071 -> LATIN SMALL LETTER Q + 'r' # 0x0072 -> LATIN SMALL LETTER R + 's' # 0x0073 -> LATIN SMALL LETTER S + 't' # 0x0074 -> LATIN SMALL LETTER T + 'u' # 0x0075 -> LATIN SMALL LETTER U + 'v' # 0x0076 -> LATIN SMALL LETTER V + 'w' # 0x0077 -> LATIN SMALL LETTER W + 'x' # 0x0078 -> LATIN SMALL LETTER X + 'y' # 0x0079 -> LATIN SMALL LETTER Y + 'z' # 0x007a -> LATIN SMALL LETTER Z + '{' # 0x007b -> LEFT CURLY BRACKET + '|' # 0x007c -> VERTICAL LINE + '}' # 0x007d -> RIGHT CURLY BRACKET + '~' # 0x007e -> TILDE + '\x7f' # 0x007f -> DELETE + '\xc7' # 0x0080 -> LATIN CAPITAL LETTER C WITH CEDILLA + '\xfc' # 0x0081 -> LATIN SMALL LETTER U WITH DIAERESIS + '\xe9' # 0x0082 -> LATIN SMALL LETTER E WITH ACUTE + '\xe2' # 0x0083 -> LATIN SMALL LETTER A WITH CIRCUMFLEX + '\xe4' # 0x0084 -> LATIN SMALL LETTER A WITH DIAERESIS + '\xe0' # 0x0085 -> LATIN SMALL LETTER A WITH GRAVE + '\xe5' # 0x0086 -> LATIN SMALL LETTER A WITH RING ABOVE + '\xe7' # 0x0087 -> LATIN SMALL LETTER C WITH CEDILLA + '\xea' # 0x0088 -> LATIN SMALL LETTER E WITH CIRCUMFLEX + '\xeb' # 0x0089 -> LATIN SMALL LETTER E WITH DIAERESIS + '\xe8' # 0x008a -> LATIN SMALL LETTER E WITH GRAVE + '\xef' # 0x008b -> LATIN SMALL LETTER I WITH DIAERESIS + '\xee' # 0x008c -> LATIN SMALL LETTER I WITH CIRCUMFLEX + '\xec' # 0x008d -> LATIN SMALL LETTER I WITH GRAVE + '\xc4' # 0x008e -> LATIN CAPITAL LETTER A WITH DIAERESIS + '\xc5' # 0x008f -> LATIN CAPITAL LETTER A WITH RING ABOVE + '\xc9' # 0x0090 -> LATIN CAPITAL LETTER E WITH ACUTE + '\xe6' # 0x0091 -> LATIN SMALL LIGATURE AE + '\xc6' # 0x0092 -> LATIN CAPITAL LIGATURE AE + '\xf4' # 0x0093 -> LATIN SMALL LETTER O WITH CIRCUMFLEX + '\xf6' # 0x0094 -> LATIN SMALL LETTER O WITH DIAERESIS + '\xf2' # 0x0095 -> LATIN SMALL LETTER O WITH GRAVE + '\xfb' # 0x0096 -> LATIN SMALL LETTER U WITH CIRCUMFLEX + '\xf9' # 0x0097 -> LATIN SMALL LETTER U WITH GRAVE + '\xff' # 0x0098 -> LATIN SMALL LETTER Y WITH DIAERESIS + '\xd6' # 0x0099 -> LATIN CAPITAL LETTER O WITH DIAERESIS + '\xdc' # 0x009a -> LATIN CAPITAL LETTER U WITH DIAERESIS + '\xf8' # 0x009b -> LATIN SMALL LETTER O WITH STROKE + '\xa3' # 0x009c -> POUND SIGN + '\xd8' # 0x009d -> LATIN CAPITAL LETTER O WITH STROKE + '\xd7' # 0x009e -> MULTIPLICATION SIGN + '\u0192' # 0x009f -> LATIN SMALL LETTER F WITH HOOK + '\xe1' # 0x00a0 -> LATIN SMALL LETTER A WITH ACUTE + '\xed' # 0x00a1 -> LATIN SMALL LETTER I WITH ACUTE + '\xf3' # 0x00a2 -> LATIN SMALL LETTER O WITH ACUTE + '\xfa' # 0x00a3 -> LATIN SMALL LETTER U WITH ACUTE + '\xf1' # 0x00a4 -> LATIN SMALL LETTER N WITH TILDE + '\xd1' # 0x00a5 -> LATIN CAPITAL LETTER N WITH TILDE + '\xaa' # 0x00a6 -> FEMININE ORDINAL INDICATOR + '\xba' # 0x00a7 -> MASCULINE ORDINAL INDICATOR + '\xbf' # 0x00a8 -> INVERTED QUESTION MARK + '\xae' # 0x00a9 -> REGISTERED SIGN + '\xac' # 0x00aa -> NOT SIGN + '\xbd' # 0x00ab -> VULGAR FRACTION ONE HALF + '\xbc' # 0x00ac -> VULGAR FRACTION ONE QUARTER + '\xa1' # 0x00ad -> INVERTED EXCLAMATION MARK + '\xab' # 0x00ae -> LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + '\xbb' # 0x00af -> RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + '\u2591' # 0x00b0 -> LIGHT SHADE + '\u2592' # 0x00b1 -> MEDIUM SHADE + '\u2593' # 0x00b2 -> DARK SHADE + '\u2502' # 0x00b3 -> BOX DRAWINGS LIGHT VERTICAL + '\u2524' # 0x00b4 -> BOX DRAWINGS LIGHT VERTICAL AND LEFT + '\xc1' # 0x00b5 -> LATIN CAPITAL LETTER A WITH ACUTE + '\xc2' # 0x00b6 -> LATIN CAPITAL LETTER A WITH CIRCUMFLEX + '\xc0' # 0x00b7 -> LATIN CAPITAL LETTER A WITH GRAVE + '\xa9' # 0x00b8 -> COPYRIGHT SIGN + '\u2563' # 0x00b9 -> BOX DRAWINGS DOUBLE VERTICAL AND LEFT + '\u2551' # 0x00ba -> BOX DRAWINGS DOUBLE VERTICAL + '\u2557' # 0x00bb -> BOX DRAWINGS DOUBLE DOWN AND LEFT + '\u255d' # 0x00bc -> BOX DRAWINGS DOUBLE UP AND LEFT + '\xa2' # 0x00bd -> CENT SIGN + '\xa5' # 0x00be -> YEN SIGN + '\u2510' # 0x00bf -> BOX DRAWINGS LIGHT DOWN AND LEFT + '\u2514' # 0x00c0 -> BOX DRAWINGS LIGHT UP AND RIGHT + '\u2534' # 0x00c1 -> BOX DRAWINGS LIGHT UP AND HORIZONTAL + '\u252c' # 0x00c2 -> BOX DRAWINGS LIGHT DOWN AND HORIZONTAL + '\u251c' # 0x00c3 -> BOX DRAWINGS LIGHT VERTICAL AND RIGHT + '\u2500' # 0x00c4 -> BOX DRAWINGS LIGHT HORIZONTAL + '\u253c' # 0x00c5 -> BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL + '\xe3' # 0x00c6 -> LATIN SMALL LETTER A WITH TILDE + '\xc3' # 0x00c7 -> LATIN CAPITAL LETTER A WITH TILDE + '\u255a' # 0x00c8 -> BOX DRAWINGS DOUBLE UP AND RIGHT + '\u2554' # 0x00c9 -> BOX DRAWINGS DOUBLE DOWN AND RIGHT + '\u2569' # 0x00ca -> BOX DRAWINGS DOUBLE UP AND HORIZONTAL + '\u2566' # 0x00cb -> BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL + '\u2560' # 0x00cc -> BOX DRAWINGS DOUBLE VERTICAL AND RIGHT + '\u2550' # 0x00cd -> BOX DRAWINGS DOUBLE HORIZONTAL + '\u256c' # 0x00ce -> BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL + '\xa4' # 0x00cf -> CURRENCY SIGN + '\xf0' # 0x00d0 -> LATIN SMALL LETTER ETH + '\xd0' # 0x00d1 -> LATIN CAPITAL LETTER ETH + '\xca' # 0x00d2 -> LATIN CAPITAL LETTER E WITH CIRCUMFLEX + '\xcb' # 0x00d3 -> LATIN CAPITAL LETTER E WITH DIAERESIS + '\xc8' # 0x00d4 -> LATIN CAPITAL LETTER E WITH GRAVE + '\u0131' # 0x00d5 -> LATIN SMALL LETTER DOTLESS I + '\xcd' # 0x00d6 -> LATIN CAPITAL LETTER I WITH ACUTE + '\xce' # 0x00d7 -> LATIN CAPITAL LETTER I WITH CIRCUMFLEX + '\xcf' # 0x00d8 -> LATIN CAPITAL LETTER I WITH DIAERESIS + '\u2518' # 0x00d9 -> BOX DRAWINGS LIGHT UP AND LEFT + '\u250c' # 0x00da -> BOX DRAWINGS LIGHT DOWN AND RIGHT + '\u2588' # 0x00db -> FULL BLOCK + '\u2584' # 0x00dc -> LOWER HALF BLOCK + '\xa6' # 0x00dd -> BROKEN BAR + '\xcc' # 0x00de -> LATIN CAPITAL LETTER I WITH GRAVE + '\u2580' # 0x00df -> UPPER HALF BLOCK + '\xd3' # 0x00e0 -> LATIN CAPITAL LETTER O WITH ACUTE + '\xdf' # 0x00e1 -> LATIN SMALL LETTER SHARP S + '\xd4' # 0x00e2 -> LATIN CAPITAL LETTER O WITH CIRCUMFLEX + '\xd2' # 0x00e3 -> LATIN CAPITAL LETTER O WITH GRAVE + '\xf5' # 0x00e4 -> LATIN SMALL LETTER O WITH TILDE + '\xd5' # 0x00e5 -> LATIN CAPITAL LETTER O WITH TILDE + '\xb5' # 0x00e6 -> MICRO SIGN + '\xfe' # 0x00e7 -> LATIN SMALL LETTER THORN + '\xde' # 0x00e8 -> LATIN CAPITAL LETTER THORN + '\xda' # 0x00e9 -> LATIN CAPITAL LETTER U WITH ACUTE + '\xdb' # 0x00ea -> LATIN CAPITAL LETTER U WITH CIRCUMFLEX + '\xd9' # 0x00eb -> LATIN CAPITAL LETTER U WITH GRAVE + '\xfd' # 0x00ec -> LATIN SMALL LETTER Y WITH ACUTE + '\xdd' # 0x00ed -> LATIN CAPITAL LETTER Y WITH ACUTE + '\xaf' # 0x00ee -> MACRON + '\xb4' # 0x00ef -> ACUTE ACCENT + '\xad' # 0x00f0 -> SOFT HYPHEN + '\xb1' # 0x00f1 -> PLUS-MINUS SIGN + '\u2017' # 0x00f2 -> DOUBLE LOW LINE + '\xbe' # 0x00f3 -> VULGAR FRACTION THREE QUARTERS + '\xb6' # 0x00f4 -> PILCROW SIGN + '\xa7' # 0x00f5 -> SECTION SIGN + '\xf7' # 0x00f6 -> DIVISION SIGN + '\xb8' # 0x00f7 -> CEDILLA + '\xb0' # 0x00f8 -> DEGREE SIGN + '\xa8' # 0x00f9 -> DIAERESIS + '\xb7' # 0x00fa -> MIDDLE DOT + '\xb9' # 0x00fb -> SUPERSCRIPT ONE + '\xb3' # 0x00fc -> SUPERSCRIPT THREE + '\xb2' # 0x00fd -> SUPERSCRIPT TWO + '\u25a0' # 0x00fe -> BLACK SQUARE + '\xa0' # 0x00ff -> NO-BREAK SPACE +) + +### Encoding Map + +encoding_map = { + 0x0000: 0x0000, # NULL + 0x0001: 0x0001, # START OF HEADING + 0x0002: 0x0002, # START OF TEXT + 0x0003: 0x0003, # END OF TEXT + 0x0004: 0x0004, # END OF TRANSMISSION + 0x0005: 0x0005, # ENQUIRY + 0x0006: 0x0006, # ACKNOWLEDGE + 0x0007: 0x0007, # BELL + 0x0008: 0x0008, # BACKSPACE + 0x0009: 0x0009, # HORIZONTAL TABULATION + 0x000a: 0x000a, # LINE FEED + 0x000b: 0x000b, # VERTICAL TABULATION + 0x000c: 0x000c, # FORM FEED + 0x000d: 0x000d, # CARRIAGE RETURN + 0x000e: 0x000e, # SHIFT OUT + 0x000f: 0x000f, # SHIFT IN + 0x0010: 0x0010, # DATA LINK ESCAPE + 0x0011: 0x0011, # DEVICE CONTROL ONE + 0x0012: 0x0012, # DEVICE CONTROL TWO + 0x0013: 0x0013, # DEVICE CONTROL THREE + 0x0014: 0x0014, # DEVICE CONTROL FOUR + 0x0015: 0x0015, # NEGATIVE ACKNOWLEDGE + 0x0016: 0x0016, # SYNCHRONOUS IDLE + 0x0017: 0x0017, # END OF TRANSMISSION BLOCK + 0x0018: 0x0018, # CANCEL + 0x0019: 0x0019, # END OF MEDIUM + 0x001a: 0x001a, # SUBSTITUTE + 0x001b: 0x001b, # ESCAPE + 0x001c: 0x001c, # FILE SEPARATOR + 0x001d: 0x001d, # GROUP SEPARATOR + 0x001e: 0x001e, # RECORD SEPARATOR + 0x001f: 0x001f, # UNIT SEPARATOR + 0x0020: 0x0020, # SPACE + 0x0021: 0x0021, # EXCLAMATION MARK + 0x0022: 0x0022, # QUOTATION MARK + 0x0023: 0x0023, # NUMBER SIGN + 0x0024: 0x0024, # DOLLAR SIGN + 0x0025: 0x0025, # PERCENT SIGN + 0x0026: 0x0026, # AMPERSAND + 0x0027: 0x0027, # APOSTROPHE + 0x0028: 0x0028, # LEFT PARENTHESIS + 0x0029: 0x0029, # RIGHT PARENTHESIS + 0x002a: 0x002a, # ASTERISK + 0x002b: 0x002b, # PLUS SIGN + 0x002c: 0x002c, # COMMA + 0x002d: 0x002d, # HYPHEN-MINUS + 0x002e: 0x002e, # FULL STOP + 0x002f: 0x002f, # SOLIDUS + 0x0030: 0x0030, # DIGIT ZERO + 0x0031: 0x0031, # DIGIT ONE + 0x0032: 0x0032, # DIGIT TWO + 0x0033: 0x0033, # DIGIT THREE + 0x0034: 0x0034, # DIGIT FOUR + 0x0035: 0x0035, # DIGIT FIVE + 0x0036: 0x0036, # DIGIT SIX + 0x0037: 0x0037, # DIGIT SEVEN + 0x0038: 0x0038, # DIGIT EIGHT + 0x0039: 0x0039, # DIGIT NINE + 0x003a: 0x003a, # COLON + 0x003b: 0x003b, # SEMICOLON + 0x003c: 0x003c, # LESS-THAN SIGN + 0x003d: 0x003d, # EQUALS SIGN + 0x003e: 0x003e, # GREATER-THAN SIGN + 0x003f: 0x003f, # QUESTION MARK + 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 + 0x005c: 0x005c, # REVERSE SOLIDUS + 0x005d: 0x005d, # RIGHT SQUARE BRACKET + 0x005e: 0x005e, # CIRCUMFLEX ACCENT + 0x005f: 0x005f, # LOW LINE + 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 + 0x007c: 0x007c, # VERTICAL LINE + 0x007d: 0x007d, # RIGHT CURLY BRACKET + 0x007e: 0x007e, # TILDE + 0x007f: 0x007f, # DELETE + 0x00a0: 0x00ff, # NO-BREAK SPACE + 0x00a1: 0x00ad, # INVERTED EXCLAMATION MARK + 0x00a2: 0x00bd, # CENT SIGN + 0x00a3: 0x009c, # POUND SIGN + 0x00a4: 0x00cf, # CURRENCY SIGN + 0x00a5: 0x00be, # YEN SIGN + 0x00a6: 0x00dd, # BROKEN BAR + 0x00a7: 0x00f5, # SECTION SIGN + 0x00a8: 0x00f9, # DIAERESIS + 0x00a9: 0x00b8, # COPYRIGHT SIGN + 0x00aa: 0x00a6, # FEMININE ORDINAL INDICATOR + 0x00ab: 0x00ae, # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00ac: 0x00aa, # NOT SIGN + 0x00ad: 0x00f0, # SOFT HYPHEN + 0x00ae: 0x00a9, # REGISTERED SIGN + 0x00af: 0x00ee, # MACRON + 0x00b0: 0x00f8, # DEGREE SIGN + 0x00b1: 0x00f1, # PLUS-MINUS SIGN + 0x00b2: 0x00fd, # SUPERSCRIPT TWO + 0x00b3: 0x00fc, # SUPERSCRIPT THREE + 0x00b4: 0x00ef, # ACUTE ACCENT + 0x00b5: 0x00e6, # MICRO SIGN + 0x00b6: 0x00f4, # PILCROW SIGN + 0x00b7: 0x00fa, # MIDDLE DOT + 0x00b8: 0x00f7, # CEDILLA + 0x00b9: 0x00fb, # SUPERSCRIPT ONE + 0x00ba: 0x00a7, # MASCULINE ORDINAL INDICATOR + 0x00bb: 0x00af, # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00bc: 0x00ac, # VULGAR FRACTION ONE QUARTER + 0x00bd: 0x00ab, # VULGAR FRACTION ONE HALF + 0x00be: 0x00f3, # VULGAR FRACTION THREE QUARTERS + 0x00bf: 0x00a8, # INVERTED QUESTION MARK + 0x00c0: 0x00b7, # LATIN CAPITAL LETTER A WITH GRAVE + 0x00c1: 0x00b5, # LATIN CAPITAL LETTER A WITH ACUTE + 0x00c2: 0x00b6, # LATIN CAPITAL LETTER A WITH CIRCUMFLEX + 0x00c3: 0x00c7, # LATIN CAPITAL LETTER A WITH TILDE + 0x00c4: 0x008e, # LATIN CAPITAL LETTER A WITH DIAERESIS + 0x00c5: 0x008f, # LATIN CAPITAL LETTER A WITH RING ABOVE + 0x00c6: 0x0092, # LATIN CAPITAL LIGATURE AE + 0x00c7: 0x0080, # LATIN CAPITAL LETTER C WITH CEDILLA + 0x00c8: 0x00d4, # LATIN CAPITAL LETTER E WITH GRAVE + 0x00c9: 0x0090, # LATIN CAPITAL LETTER E WITH ACUTE + 0x00ca: 0x00d2, # LATIN CAPITAL LETTER E WITH CIRCUMFLEX + 0x00cb: 0x00d3, # LATIN CAPITAL LETTER E WITH DIAERESIS + 0x00cc: 0x00de, # LATIN CAPITAL LETTER I WITH GRAVE + 0x00cd: 0x00d6, # LATIN CAPITAL LETTER I WITH ACUTE + 0x00ce: 0x00d7, # LATIN CAPITAL LETTER I WITH CIRCUMFLEX + 0x00cf: 0x00d8, # LATIN CAPITAL LETTER I WITH DIAERESIS + 0x00d0: 0x00d1, # LATIN CAPITAL LETTER ETH + 0x00d1: 0x00a5, # LATIN CAPITAL LETTER N WITH TILDE + 0x00d2: 0x00e3, # LATIN CAPITAL LETTER O WITH GRAVE + 0x00d3: 0x00e0, # LATIN CAPITAL LETTER O WITH ACUTE + 0x00d4: 0x00e2, # LATIN CAPITAL LETTER O WITH CIRCUMFLEX + 0x00d5: 0x00e5, # LATIN CAPITAL LETTER O WITH TILDE + 0x00d6: 0x0099, # LATIN CAPITAL LETTER O WITH DIAERESIS + 0x00d7: 0x009e, # MULTIPLICATION SIGN + 0x00d8: 0x009d, # LATIN CAPITAL LETTER O WITH STROKE + 0x00d9: 0x00eb, # LATIN CAPITAL LETTER U WITH GRAVE + 0x00da: 0x00e9, # LATIN CAPITAL LETTER U WITH ACUTE + 0x00db: 0x00ea, # LATIN CAPITAL LETTER U WITH CIRCUMFLEX + 0x00dc: 0x009a, # LATIN CAPITAL LETTER U WITH DIAERESIS + 0x00dd: 0x00ed, # LATIN CAPITAL LETTER Y WITH ACUTE + 0x00de: 0x00e8, # LATIN CAPITAL LETTER THORN + 0x00df: 0x00e1, # LATIN SMALL LETTER SHARP S + 0x00e0: 0x0085, # LATIN SMALL LETTER A WITH GRAVE + 0x00e1: 0x00a0, # LATIN SMALL LETTER A WITH ACUTE + 0x00e2: 0x0083, # LATIN SMALL LETTER A WITH CIRCUMFLEX + 0x00e3: 0x00c6, # LATIN SMALL LETTER A WITH TILDE + 0x00e4: 0x0084, # LATIN SMALL LETTER A WITH DIAERESIS + 0x00e5: 0x0086, # LATIN SMALL LETTER A WITH RING ABOVE + 0x00e6: 0x0091, # LATIN SMALL LIGATURE AE + 0x00e7: 0x0087, # LATIN SMALL LETTER C WITH CEDILLA + 0x00e8: 0x008a, # LATIN SMALL LETTER E WITH GRAVE + 0x00e9: 0x0082, # LATIN SMALL LETTER E WITH ACUTE + 0x00ea: 0x0088, # LATIN SMALL LETTER E WITH CIRCUMFLEX + 0x00eb: 0x0089, # LATIN SMALL LETTER E WITH DIAERESIS + 0x00ec: 0x008d, # LATIN SMALL LETTER I WITH GRAVE + 0x00ed: 0x00a1, # LATIN SMALL LETTER I WITH ACUTE + 0x00ee: 0x008c, # LATIN SMALL LETTER I WITH CIRCUMFLEX + 0x00ef: 0x008b, # LATIN SMALL LETTER I WITH DIAERESIS + 0x00f0: 0x00d0, # LATIN SMALL LETTER ETH + 0x00f1: 0x00a4, # LATIN SMALL LETTER N WITH TILDE + 0x00f2: 0x0095, # LATIN SMALL LETTER O WITH GRAVE + 0x00f3: 0x00a2, # LATIN SMALL LETTER O WITH ACUTE + 0x00f4: 0x0093, # LATIN SMALL LETTER O WITH CIRCUMFLEX + 0x00f5: 0x00e4, # LATIN SMALL LETTER O WITH TILDE + 0x00f6: 0x0094, # LATIN SMALL LETTER O WITH DIAERESIS + 0x00f7: 0x00f6, # DIVISION SIGN + 0x00f8: 0x009b, # LATIN SMALL LETTER O WITH STROKE + 0x00f9: 0x0097, # LATIN SMALL LETTER U WITH GRAVE + 0x00fa: 0x00a3, # LATIN SMALL LETTER U WITH ACUTE + 0x00fb: 0x0096, # LATIN SMALL LETTER U WITH CIRCUMFLEX + 0x00fc: 0x0081, # LATIN SMALL LETTER U WITH DIAERESIS + 0x00fd: 0x00ec, # LATIN SMALL LETTER Y WITH ACUTE + 0x00fe: 0x00e7, # LATIN SMALL LETTER THORN + 0x00ff: 0x0098, # LATIN SMALL LETTER Y WITH DIAERESIS + 0x0131: 0x00d5, # LATIN SMALL LETTER DOTLESS I + 0x0192: 0x009f, # LATIN SMALL LETTER F WITH HOOK + 0x2017: 0x00f2, # DOUBLE LOW LINE + 0x2500: 0x00c4, # BOX DRAWINGS LIGHT HORIZONTAL + 0x2502: 0x00b3, # BOX DRAWINGS LIGHT VERTICAL + 0x250c: 0x00da, # BOX DRAWINGS LIGHT DOWN AND RIGHT + 0x2510: 0x00bf, # BOX DRAWINGS LIGHT DOWN AND LEFT + 0x2514: 0x00c0, # BOX DRAWINGS LIGHT UP AND RIGHT + 0x2518: 0x00d9, # BOX DRAWINGS LIGHT UP AND LEFT + 0x251c: 0x00c3, # BOX DRAWINGS LIGHT VERTICAL AND RIGHT + 0x2524: 0x00b4, # BOX DRAWINGS LIGHT VERTICAL AND LEFT + 0x252c: 0x00c2, # BOX DRAWINGS LIGHT DOWN AND HORIZONTAL + 0x2534: 0x00c1, # BOX DRAWINGS LIGHT UP AND HORIZONTAL + 0x253c: 0x00c5, # BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL + 0x2550: 0x00cd, # BOX DRAWINGS DOUBLE HORIZONTAL + 0x2551: 0x00ba, # BOX DRAWINGS DOUBLE VERTICAL + 0x2554: 0x00c9, # BOX DRAWINGS DOUBLE DOWN AND RIGHT + 0x2557: 0x00bb, # BOX DRAWINGS DOUBLE DOWN AND LEFT + 0x255a: 0x00c8, # BOX DRAWINGS DOUBLE UP AND RIGHT + 0x255d: 0x00bc, # BOX DRAWINGS DOUBLE UP AND LEFT + 0x2560: 0x00cc, # BOX DRAWINGS DOUBLE VERTICAL AND RIGHT + 0x2563: 0x00b9, # BOX DRAWINGS DOUBLE VERTICAL AND LEFT + 0x2566: 0x00cb, # BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL + 0x2569: 0x00ca, # BOX DRAWINGS DOUBLE UP AND HORIZONTAL + 0x256c: 0x00ce, # BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL + 0x2580: 0x00df, # UPPER HALF BLOCK + 0x2584: 0x00dc, # LOWER HALF BLOCK + 0x2588: 0x00db, # FULL BLOCK + 0x2591: 0x00b0, # LIGHT SHADE + 0x2592: 0x00b1, # MEDIUM SHADE + 0x2593: 0x00b2, # DARK SHADE + 0x25a0: 0x00fe, # BLACK SQUARE +} diff --git a/env/Lib/encodings/cp852.py b/env/Lib/encodings/cp852.py new file mode 100644 index 0000000..34d8a0e --- /dev/null +++ b/env/Lib/encodings/cp852.py @@ -0,0 +1,698 @@ +""" Python Character Mapping Codec generated from 'VENDORS/MICSFT/PC/CP852.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_map) + + 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_map)[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='cp852', + 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: 0x00c7, # LATIN CAPITAL LETTER C WITH CEDILLA + 0x0081: 0x00fc, # LATIN SMALL LETTER U WITH DIAERESIS + 0x0082: 0x00e9, # LATIN SMALL LETTER E WITH ACUTE + 0x0083: 0x00e2, # LATIN SMALL LETTER A WITH CIRCUMFLEX + 0x0084: 0x00e4, # LATIN SMALL LETTER A WITH DIAERESIS + 0x0085: 0x016f, # LATIN SMALL LETTER U WITH RING ABOVE + 0x0086: 0x0107, # LATIN SMALL LETTER C WITH ACUTE + 0x0087: 0x00e7, # LATIN SMALL LETTER C WITH CEDILLA + 0x0088: 0x0142, # LATIN SMALL LETTER L WITH STROKE + 0x0089: 0x00eb, # LATIN SMALL LETTER E WITH DIAERESIS + 0x008a: 0x0150, # LATIN CAPITAL LETTER O WITH DOUBLE ACUTE + 0x008b: 0x0151, # LATIN SMALL LETTER O WITH DOUBLE ACUTE + 0x008c: 0x00ee, # LATIN SMALL LETTER I WITH CIRCUMFLEX + 0x008d: 0x0179, # LATIN CAPITAL LETTER Z WITH ACUTE + 0x008e: 0x00c4, # LATIN CAPITAL LETTER A WITH DIAERESIS + 0x008f: 0x0106, # LATIN CAPITAL LETTER C WITH ACUTE + 0x0090: 0x00c9, # LATIN CAPITAL LETTER E WITH ACUTE + 0x0091: 0x0139, # LATIN CAPITAL LETTER L WITH ACUTE + 0x0092: 0x013a, # LATIN SMALL LETTER L WITH ACUTE + 0x0093: 0x00f4, # LATIN SMALL LETTER O WITH CIRCUMFLEX + 0x0094: 0x00f6, # LATIN SMALL LETTER O WITH DIAERESIS + 0x0095: 0x013d, # LATIN CAPITAL LETTER L WITH CARON + 0x0096: 0x013e, # LATIN SMALL LETTER L WITH CARON + 0x0097: 0x015a, # LATIN CAPITAL LETTER S WITH ACUTE + 0x0098: 0x015b, # LATIN SMALL LETTER S WITH ACUTE + 0x0099: 0x00d6, # LATIN CAPITAL LETTER O WITH DIAERESIS + 0x009a: 0x00dc, # LATIN CAPITAL LETTER U WITH DIAERESIS + 0x009b: 0x0164, # LATIN CAPITAL LETTER T WITH CARON + 0x009c: 0x0165, # LATIN SMALL LETTER T WITH CARON + 0x009d: 0x0141, # LATIN CAPITAL LETTER L WITH STROKE + 0x009e: 0x00d7, # MULTIPLICATION SIGN + 0x009f: 0x010d, # LATIN SMALL LETTER C WITH CARON + 0x00a0: 0x00e1, # LATIN SMALL LETTER A WITH ACUTE + 0x00a1: 0x00ed, # LATIN SMALL LETTER I WITH ACUTE + 0x00a2: 0x00f3, # LATIN SMALL LETTER O WITH ACUTE + 0x00a3: 0x00fa, # LATIN SMALL LETTER U WITH ACUTE + 0x00a4: 0x0104, # LATIN CAPITAL LETTER A WITH OGONEK + 0x00a5: 0x0105, # LATIN SMALL LETTER A WITH OGONEK + 0x00a6: 0x017d, # LATIN CAPITAL LETTER Z WITH CARON + 0x00a7: 0x017e, # LATIN SMALL LETTER Z WITH CARON + 0x00a8: 0x0118, # LATIN CAPITAL LETTER E WITH OGONEK + 0x00a9: 0x0119, # LATIN SMALL LETTER E WITH OGONEK + 0x00aa: 0x00ac, # NOT SIGN + 0x00ab: 0x017a, # LATIN SMALL LETTER Z WITH ACUTE + 0x00ac: 0x010c, # LATIN CAPITAL LETTER C WITH CARON + 0x00ad: 0x015f, # LATIN SMALL LETTER S WITH CEDILLA + 0x00ae: 0x00ab, # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00af: 0x00bb, # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00b0: 0x2591, # LIGHT SHADE + 0x00b1: 0x2592, # MEDIUM SHADE + 0x00b2: 0x2593, # DARK SHADE + 0x00b3: 0x2502, # BOX DRAWINGS LIGHT VERTICAL + 0x00b4: 0x2524, # BOX DRAWINGS LIGHT VERTICAL AND LEFT + 0x00b5: 0x00c1, # LATIN CAPITAL LETTER A WITH ACUTE + 0x00b6: 0x00c2, # LATIN CAPITAL LETTER A WITH CIRCUMFLEX + 0x00b7: 0x011a, # LATIN CAPITAL LETTER E WITH CARON + 0x00b8: 0x015e, # LATIN CAPITAL LETTER S WITH CEDILLA + 0x00b9: 0x2563, # BOX DRAWINGS DOUBLE VERTICAL AND LEFT + 0x00ba: 0x2551, # BOX DRAWINGS DOUBLE VERTICAL + 0x00bb: 0x2557, # BOX DRAWINGS DOUBLE DOWN AND LEFT + 0x00bc: 0x255d, # BOX DRAWINGS DOUBLE UP AND LEFT + 0x00bd: 0x017b, # LATIN CAPITAL LETTER Z WITH DOT ABOVE + 0x00be: 0x017c, # LATIN SMALL LETTER Z WITH DOT ABOVE + 0x00bf: 0x2510, # BOX DRAWINGS LIGHT DOWN AND LEFT + 0x00c0: 0x2514, # BOX DRAWINGS LIGHT UP AND RIGHT + 0x00c1: 0x2534, # BOX DRAWINGS LIGHT UP AND HORIZONTAL + 0x00c2: 0x252c, # BOX DRAWINGS LIGHT DOWN AND HORIZONTAL + 0x00c3: 0x251c, # BOX DRAWINGS LIGHT VERTICAL AND RIGHT + 0x00c4: 0x2500, # BOX DRAWINGS LIGHT HORIZONTAL + 0x00c5: 0x253c, # BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL + 0x00c6: 0x0102, # LATIN CAPITAL LETTER A WITH BREVE + 0x00c7: 0x0103, # LATIN SMALL LETTER A WITH BREVE + 0x00c8: 0x255a, # BOX DRAWINGS DOUBLE UP AND RIGHT + 0x00c9: 0x2554, # BOX DRAWINGS DOUBLE DOWN AND RIGHT + 0x00ca: 0x2569, # BOX DRAWINGS DOUBLE UP AND HORIZONTAL + 0x00cb: 0x2566, # BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL + 0x00cc: 0x2560, # BOX DRAWINGS DOUBLE VERTICAL AND RIGHT + 0x00cd: 0x2550, # BOX DRAWINGS DOUBLE HORIZONTAL + 0x00ce: 0x256c, # BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL + 0x00cf: 0x00a4, # CURRENCY SIGN + 0x00d0: 0x0111, # LATIN SMALL LETTER D WITH STROKE + 0x00d1: 0x0110, # LATIN CAPITAL LETTER D WITH STROKE + 0x00d2: 0x010e, # LATIN CAPITAL LETTER D WITH CARON + 0x00d3: 0x00cb, # LATIN CAPITAL LETTER E WITH DIAERESIS + 0x00d4: 0x010f, # LATIN SMALL LETTER D WITH CARON + 0x00d5: 0x0147, # LATIN CAPITAL LETTER N WITH CARON + 0x00d6: 0x00cd, # LATIN CAPITAL LETTER I WITH ACUTE + 0x00d7: 0x00ce, # LATIN CAPITAL LETTER I WITH CIRCUMFLEX + 0x00d8: 0x011b, # LATIN SMALL LETTER E WITH CARON + 0x00d9: 0x2518, # BOX DRAWINGS LIGHT UP AND LEFT + 0x00da: 0x250c, # BOX DRAWINGS LIGHT DOWN AND RIGHT + 0x00db: 0x2588, # FULL BLOCK + 0x00dc: 0x2584, # LOWER HALF BLOCK + 0x00dd: 0x0162, # LATIN CAPITAL LETTER T WITH CEDILLA + 0x00de: 0x016e, # LATIN CAPITAL LETTER U WITH RING ABOVE + 0x00df: 0x2580, # UPPER HALF BLOCK + 0x00e0: 0x00d3, # LATIN CAPITAL LETTER O WITH ACUTE + 0x00e1: 0x00df, # LATIN SMALL LETTER SHARP S + 0x00e2: 0x00d4, # LATIN CAPITAL LETTER O WITH CIRCUMFLEX + 0x00e3: 0x0143, # LATIN CAPITAL LETTER N WITH ACUTE + 0x00e4: 0x0144, # LATIN SMALL LETTER N WITH ACUTE + 0x00e5: 0x0148, # LATIN SMALL LETTER N WITH CARON + 0x00e6: 0x0160, # LATIN CAPITAL LETTER S WITH CARON + 0x00e7: 0x0161, # LATIN SMALL LETTER S WITH CARON + 0x00e8: 0x0154, # LATIN CAPITAL LETTER R WITH ACUTE + 0x00e9: 0x00da, # LATIN CAPITAL LETTER U WITH ACUTE + 0x00ea: 0x0155, # LATIN SMALL LETTER R WITH ACUTE + 0x00eb: 0x0170, # LATIN CAPITAL LETTER U WITH DOUBLE ACUTE + 0x00ec: 0x00fd, # LATIN SMALL LETTER Y WITH ACUTE + 0x00ed: 0x00dd, # LATIN CAPITAL LETTER Y WITH ACUTE + 0x00ee: 0x0163, # LATIN SMALL LETTER T WITH CEDILLA + 0x00ef: 0x00b4, # ACUTE ACCENT + 0x00f0: 0x00ad, # SOFT HYPHEN + 0x00f1: 0x02dd, # DOUBLE ACUTE ACCENT + 0x00f2: 0x02db, # OGONEK + 0x00f3: 0x02c7, # CARON + 0x00f4: 0x02d8, # BREVE + 0x00f5: 0x00a7, # SECTION SIGN + 0x00f6: 0x00f7, # DIVISION SIGN + 0x00f7: 0x00b8, # CEDILLA + 0x00f8: 0x00b0, # DEGREE SIGN + 0x00f9: 0x00a8, # DIAERESIS + 0x00fa: 0x02d9, # DOT ABOVE + 0x00fb: 0x0171, # LATIN SMALL LETTER U WITH DOUBLE ACUTE + 0x00fc: 0x0158, # LATIN CAPITAL LETTER R WITH CARON + 0x00fd: 0x0159, # LATIN SMALL LETTER R WITH CARON + 0x00fe: 0x25a0, # BLACK SQUARE + 0x00ff: 0x00a0, # NO-BREAK SPACE +}) + +### Decoding Table + +decoding_table = ( + '\x00' # 0x0000 -> NULL + '\x01' # 0x0001 -> START OF HEADING + '\x02' # 0x0002 -> START OF TEXT + '\x03' # 0x0003 -> END OF TEXT + '\x04' # 0x0004 -> END OF TRANSMISSION + '\x05' # 0x0005 -> ENQUIRY + '\x06' # 0x0006 -> ACKNOWLEDGE + '\x07' # 0x0007 -> BELL + '\x08' # 0x0008 -> BACKSPACE + '\t' # 0x0009 -> HORIZONTAL TABULATION + '\n' # 0x000a -> LINE FEED + '\x0b' # 0x000b -> VERTICAL TABULATION + '\x0c' # 0x000c -> FORM FEED + '\r' # 0x000d -> CARRIAGE RETURN + '\x0e' # 0x000e -> SHIFT OUT + '\x0f' # 0x000f -> SHIFT IN + '\x10' # 0x0010 -> DATA LINK ESCAPE + '\x11' # 0x0011 -> DEVICE CONTROL ONE + '\x12' # 0x0012 -> DEVICE CONTROL TWO + '\x13' # 0x0013 -> DEVICE CONTROL THREE + '\x14' # 0x0014 -> DEVICE CONTROL FOUR + '\x15' # 0x0015 -> NEGATIVE ACKNOWLEDGE + '\x16' # 0x0016 -> SYNCHRONOUS IDLE + '\x17' # 0x0017 -> END OF TRANSMISSION BLOCK + '\x18' # 0x0018 -> CANCEL + '\x19' # 0x0019 -> END OF MEDIUM + '\x1a' # 0x001a -> SUBSTITUTE + '\x1b' # 0x001b -> ESCAPE + '\x1c' # 0x001c -> FILE SEPARATOR + '\x1d' # 0x001d -> GROUP SEPARATOR + '\x1e' # 0x001e -> RECORD SEPARATOR + '\x1f' # 0x001f -> UNIT SEPARATOR + ' ' # 0x0020 -> SPACE + '!' # 0x0021 -> EXCLAMATION MARK + '"' # 0x0022 -> QUOTATION MARK + '#' # 0x0023 -> NUMBER SIGN + '$' # 0x0024 -> DOLLAR SIGN + '%' # 0x0025 -> PERCENT SIGN + '&' # 0x0026 -> AMPERSAND + "'" # 0x0027 -> APOSTROPHE + '(' # 0x0028 -> LEFT PARENTHESIS + ')' # 0x0029 -> RIGHT PARENTHESIS + '*' # 0x002a -> ASTERISK + '+' # 0x002b -> PLUS SIGN + ',' # 0x002c -> COMMA + '-' # 0x002d -> HYPHEN-MINUS + '.' # 0x002e -> FULL STOP + '/' # 0x002f -> SOLIDUS + '0' # 0x0030 -> DIGIT ZERO + '1' # 0x0031 -> DIGIT ONE + '2' # 0x0032 -> DIGIT TWO + '3' # 0x0033 -> DIGIT THREE + '4' # 0x0034 -> DIGIT FOUR + '5' # 0x0035 -> DIGIT FIVE + '6' # 0x0036 -> DIGIT SIX + '7' # 0x0037 -> DIGIT SEVEN + '8' # 0x0038 -> DIGIT EIGHT + '9' # 0x0039 -> DIGIT NINE + ':' # 0x003a -> COLON + ';' # 0x003b -> SEMICOLON + '<' # 0x003c -> LESS-THAN SIGN + '=' # 0x003d -> EQUALS SIGN + '>' # 0x003e -> GREATER-THAN SIGN + '?' # 0x003f -> QUESTION MARK + '@' # 0x0040 -> COMMERCIAL AT + 'A' # 0x0041 -> LATIN CAPITAL LETTER A + 'B' # 0x0042 -> LATIN CAPITAL LETTER B + 'C' # 0x0043 -> LATIN CAPITAL LETTER C + 'D' # 0x0044 -> LATIN CAPITAL LETTER D + 'E' # 0x0045 -> LATIN CAPITAL LETTER E + 'F' # 0x0046 -> LATIN CAPITAL LETTER F + 'G' # 0x0047 -> LATIN CAPITAL LETTER G + 'H' # 0x0048 -> LATIN CAPITAL LETTER H + 'I' # 0x0049 -> LATIN CAPITAL LETTER I + 'J' # 0x004a -> LATIN CAPITAL LETTER J + 'K' # 0x004b -> LATIN CAPITAL LETTER K + 'L' # 0x004c -> LATIN CAPITAL LETTER L + 'M' # 0x004d -> LATIN CAPITAL LETTER M + 'N' # 0x004e -> LATIN CAPITAL LETTER N + 'O' # 0x004f -> LATIN CAPITAL LETTER O + 'P' # 0x0050 -> LATIN CAPITAL LETTER P + 'Q' # 0x0051 -> LATIN CAPITAL LETTER Q + 'R' # 0x0052 -> LATIN CAPITAL LETTER R + 'S' # 0x0053 -> LATIN CAPITAL LETTER S + 'T' # 0x0054 -> LATIN CAPITAL LETTER T + 'U' # 0x0055 -> LATIN CAPITAL LETTER U + 'V' # 0x0056 -> LATIN CAPITAL LETTER V + 'W' # 0x0057 -> LATIN CAPITAL LETTER W + 'X' # 0x0058 -> LATIN CAPITAL LETTER X + 'Y' # 0x0059 -> LATIN CAPITAL LETTER Y + 'Z' # 0x005a -> LATIN CAPITAL LETTER Z + '[' # 0x005b -> LEFT SQUARE BRACKET + '\\' # 0x005c -> REVERSE SOLIDUS + ']' # 0x005d -> RIGHT SQUARE BRACKET + '^' # 0x005e -> CIRCUMFLEX ACCENT + '_' # 0x005f -> LOW LINE + '`' # 0x0060 -> GRAVE ACCENT + 'a' # 0x0061 -> LATIN SMALL LETTER A + 'b' # 0x0062 -> LATIN SMALL LETTER B + 'c' # 0x0063 -> LATIN SMALL LETTER C + 'd' # 0x0064 -> LATIN SMALL LETTER D + 'e' # 0x0065 -> LATIN SMALL LETTER E + 'f' # 0x0066 -> LATIN SMALL LETTER F + 'g' # 0x0067 -> LATIN SMALL LETTER G + 'h' # 0x0068 -> LATIN SMALL LETTER H + 'i' # 0x0069 -> LATIN SMALL LETTER I + 'j' # 0x006a -> LATIN SMALL LETTER J + 'k' # 0x006b -> LATIN SMALL LETTER K + 'l' # 0x006c -> LATIN SMALL LETTER L + 'm' # 0x006d -> LATIN SMALL LETTER M + 'n' # 0x006e -> LATIN SMALL LETTER N + 'o' # 0x006f -> LATIN SMALL LETTER O + 'p' # 0x0070 -> LATIN SMALL LETTER P + 'q' # 0x0071 -> LATIN SMALL LETTER Q + 'r' # 0x0072 -> LATIN SMALL LETTER R + 's' # 0x0073 -> LATIN SMALL LETTER S + 't' # 0x0074 -> LATIN SMALL LETTER T + 'u' # 0x0075 -> LATIN SMALL LETTER U + 'v' # 0x0076 -> LATIN SMALL LETTER V + 'w' # 0x0077 -> LATIN SMALL LETTER W + 'x' # 0x0078 -> LATIN SMALL LETTER X + 'y' # 0x0079 -> LATIN SMALL LETTER Y + 'z' # 0x007a -> LATIN SMALL LETTER Z + '{' # 0x007b -> LEFT CURLY BRACKET + '|' # 0x007c -> VERTICAL LINE + '}' # 0x007d -> RIGHT CURLY BRACKET + '~' # 0x007e -> TILDE + '\x7f' # 0x007f -> DELETE + '\xc7' # 0x0080 -> LATIN CAPITAL LETTER C WITH CEDILLA + '\xfc' # 0x0081 -> LATIN SMALL LETTER U WITH DIAERESIS + '\xe9' # 0x0082 -> LATIN SMALL LETTER E WITH ACUTE + '\xe2' # 0x0083 -> LATIN SMALL LETTER A WITH CIRCUMFLEX + '\xe4' # 0x0084 -> LATIN SMALL LETTER A WITH DIAERESIS + '\u016f' # 0x0085 -> LATIN SMALL LETTER U WITH RING ABOVE + '\u0107' # 0x0086 -> LATIN SMALL LETTER C WITH ACUTE + '\xe7' # 0x0087 -> LATIN SMALL LETTER C WITH CEDILLA + '\u0142' # 0x0088 -> LATIN SMALL LETTER L WITH STROKE + '\xeb' # 0x0089 -> LATIN SMALL LETTER E WITH DIAERESIS + '\u0150' # 0x008a -> LATIN CAPITAL LETTER O WITH DOUBLE ACUTE + '\u0151' # 0x008b -> LATIN SMALL LETTER O WITH DOUBLE ACUTE + '\xee' # 0x008c -> LATIN SMALL LETTER I WITH CIRCUMFLEX + '\u0179' # 0x008d -> LATIN CAPITAL LETTER Z WITH ACUTE + '\xc4' # 0x008e -> LATIN CAPITAL LETTER A WITH DIAERESIS + '\u0106' # 0x008f -> LATIN CAPITAL LETTER C WITH ACUTE + '\xc9' # 0x0090 -> LATIN CAPITAL LETTER E WITH ACUTE + '\u0139' # 0x0091 -> LATIN CAPITAL LETTER L WITH ACUTE + '\u013a' # 0x0092 -> LATIN SMALL LETTER L WITH ACUTE + '\xf4' # 0x0093 -> LATIN SMALL LETTER O WITH CIRCUMFLEX + '\xf6' # 0x0094 -> LATIN SMALL LETTER O WITH DIAERESIS + '\u013d' # 0x0095 -> LATIN CAPITAL LETTER L WITH CARON + '\u013e' # 0x0096 -> LATIN SMALL LETTER L WITH CARON + '\u015a' # 0x0097 -> LATIN CAPITAL LETTER S WITH ACUTE + '\u015b' # 0x0098 -> LATIN SMALL LETTER S WITH ACUTE + '\xd6' # 0x0099 -> LATIN CAPITAL LETTER O WITH DIAERESIS + '\xdc' # 0x009a -> LATIN CAPITAL LETTER U WITH DIAERESIS + '\u0164' # 0x009b -> LATIN CAPITAL LETTER T WITH CARON + '\u0165' # 0x009c -> LATIN SMALL LETTER T WITH CARON + '\u0141' # 0x009d -> LATIN CAPITAL LETTER L WITH STROKE + '\xd7' # 0x009e -> MULTIPLICATION SIGN + '\u010d' # 0x009f -> LATIN SMALL LETTER C WITH CARON + '\xe1' # 0x00a0 -> LATIN SMALL LETTER A WITH ACUTE + '\xed' # 0x00a1 -> LATIN SMALL LETTER I WITH ACUTE + '\xf3' # 0x00a2 -> LATIN SMALL LETTER O WITH ACUTE + '\xfa' # 0x00a3 -> LATIN SMALL LETTER U WITH ACUTE + '\u0104' # 0x00a4 -> LATIN CAPITAL LETTER A WITH OGONEK + '\u0105' # 0x00a5 -> LATIN SMALL LETTER A WITH OGONEK + '\u017d' # 0x00a6 -> LATIN CAPITAL LETTER Z WITH CARON + '\u017e' # 0x00a7 -> LATIN SMALL LETTER Z WITH CARON + '\u0118' # 0x00a8 -> LATIN CAPITAL LETTER E WITH OGONEK + '\u0119' # 0x00a9 -> LATIN SMALL LETTER E WITH OGONEK + '\xac' # 0x00aa -> NOT SIGN + '\u017a' # 0x00ab -> LATIN SMALL LETTER Z WITH ACUTE + '\u010c' # 0x00ac -> LATIN CAPITAL LETTER C WITH CARON + '\u015f' # 0x00ad -> LATIN SMALL LETTER S WITH CEDILLA + '\xab' # 0x00ae -> LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + '\xbb' # 0x00af -> RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + '\u2591' # 0x00b0 -> LIGHT SHADE + '\u2592' # 0x00b1 -> MEDIUM SHADE + '\u2593' # 0x00b2 -> DARK SHADE + '\u2502' # 0x00b3 -> BOX DRAWINGS LIGHT VERTICAL + '\u2524' # 0x00b4 -> BOX DRAWINGS LIGHT VERTICAL AND LEFT + '\xc1' # 0x00b5 -> LATIN CAPITAL LETTER A WITH ACUTE + '\xc2' # 0x00b6 -> LATIN CAPITAL LETTER A WITH CIRCUMFLEX + '\u011a' # 0x00b7 -> LATIN CAPITAL LETTER E WITH CARON + '\u015e' # 0x00b8 -> LATIN CAPITAL LETTER S WITH CEDILLA + '\u2563' # 0x00b9 -> BOX DRAWINGS DOUBLE VERTICAL AND LEFT + '\u2551' # 0x00ba -> BOX DRAWINGS DOUBLE VERTICAL + '\u2557' # 0x00bb -> BOX DRAWINGS DOUBLE DOWN AND LEFT + '\u255d' # 0x00bc -> BOX DRAWINGS DOUBLE UP AND LEFT + '\u017b' # 0x00bd -> LATIN CAPITAL LETTER Z WITH DOT ABOVE + '\u017c' # 0x00be -> LATIN SMALL LETTER Z WITH DOT ABOVE + '\u2510' # 0x00bf -> BOX DRAWINGS LIGHT DOWN AND LEFT + '\u2514' # 0x00c0 -> BOX DRAWINGS LIGHT UP AND RIGHT + '\u2534' # 0x00c1 -> BOX DRAWINGS LIGHT UP AND HORIZONTAL + '\u252c' # 0x00c2 -> BOX DRAWINGS LIGHT DOWN AND HORIZONTAL + '\u251c' # 0x00c3 -> BOX DRAWINGS LIGHT VERTICAL AND RIGHT + '\u2500' # 0x00c4 -> BOX DRAWINGS LIGHT HORIZONTAL + '\u253c' # 0x00c5 -> BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL + '\u0102' # 0x00c6 -> LATIN CAPITAL LETTER A WITH BREVE + '\u0103' # 0x00c7 -> LATIN SMALL LETTER A WITH BREVE + '\u255a' # 0x00c8 -> BOX DRAWINGS DOUBLE UP AND RIGHT + '\u2554' # 0x00c9 -> BOX DRAWINGS DOUBLE DOWN AND RIGHT + '\u2569' # 0x00ca -> BOX DRAWINGS DOUBLE UP AND HORIZONTAL + '\u2566' # 0x00cb -> BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL + '\u2560' # 0x00cc -> BOX DRAWINGS DOUBLE VERTICAL AND RIGHT + '\u2550' # 0x00cd -> BOX DRAWINGS DOUBLE HORIZONTAL + '\u256c' # 0x00ce -> BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL + '\xa4' # 0x00cf -> CURRENCY SIGN + '\u0111' # 0x00d0 -> LATIN SMALL LETTER D WITH STROKE + '\u0110' # 0x00d1 -> LATIN CAPITAL LETTER D WITH STROKE + '\u010e' # 0x00d2 -> LATIN CAPITAL LETTER D WITH CARON + '\xcb' # 0x00d3 -> LATIN CAPITAL LETTER E WITH DIAERESIS + '\u010f' # 0x00d4 -> LATIN SMALL LETTER D WITH CARON + '\u0147' # 0x00d5 -> LATIN CAPITAL LETTER N WITH CARON + '\xcd' # 0x00d6 -> LATIN CAPITAL LETTER I WITH ACUTE + '\xce' # 0x00d7 -> LATIN CAPITAL LETTER I WITH CIRCUMFLEX + '\u011b' # 0x00d8 -> LATIN SMALL LETTER E WITH CARON + '\u2518' # 0x00d9 -> BOX DRAWINGS LIGHT UP AND LEFT + '\u250c' # 0x00da -> BOX DRAWINGS LIGHT DOWN AND RIGHT + '\u2588' # 0x00db -> FULL BLOCK + '\u2584' # 0x00dc -> LOWER HALF BLOCK + '\u0162' # 0x00dd -> LATIN CAPITAL LETTER T WITH CEDILLA + '\u016e' # 0x00de -> LATIN CAPITAL LETTER U WITH RING ABOVE + '\u2580' # 0x00df -> UPPER HALF BLOCK + '\xd3' # 0x00e0 -> LATIN CAPITAL LETTER O WITH ACUTE + '\xdf' # 0x00e1 -> LATIN SMALL LETTER SHARP S + '\xd4' # 0x00e2 -> LATIN CAPITAL LETTER O WITH CIRCUMFLEX + '\u0143' # 0x00e3 -> LATIN CAPITAL LETTER N WITH ACUTE + '\u0144' # 0x00e4 -> LATIN SMALL LETTER N WITH ACUTE + '\u0148' # 0x00e5 -> LATIN SMALL LETTER N WITH CARON + '\u0160' # 0x00e6 -> LATIN CAPITAL LETTER S WITH CARON + '\u0161' # 0x00e7 -> LATIN SMALL LETTER S WITH CARON + '\u0154' # 0x00e8 -> LATIN CAPITAL LETTER R WITH ACUTE + '\xda' # 0x00e9 -> LATIN CAPITAL LETTER U WITH ACUTE + '\u0155' # 0x00ea -> LATIN SMALL LETTER R WITH ACUTE + '\u0170' # 0x00eb -> LATIN CAPITAL LETTER U WITH DOUBLE ACUTE + '\xfd' # 0x00ec -> LATIN SMALL LETTER Y WITH ACUTE + '\xdd' # 0x00ed -> LATIN CAPITAL LETTER Y WITH ACUTE + '\u0163' # 0x00ee -> LATIN SMALL LETTER T WITH CEDILLA + '\xb4' # 0x00ef -> ACUTE ACCENT + '\xad' # 0x00f0 -> SOFT HYPHEN + '\u02dd' # 0x00f1 -> DOUBLE ACUTE ACCENT + '\u02db' # 0x00f2 -> OGONEK + '\u02c7' # 0x00f3 -> CARON + '\u02d8' # 0x00f4 -> BREVE + '\xa7' # 0x00f5 -> SECTION SIGN + '\xf7' # 0x00f6 -> DIVISION SIGN + '\xb8' # 0x00f7 -> CEDILLA + '\xb0' # 0x00f8 -> DEGREE SIGN + '\xa8' # 0x00f9 -> DIAERESIS + '\u02d9' # 0x00fa -> DOT ABOVE + '\u0171' # 0x00fb -> LATIN SMALL LETTER U WITH DOUBLE ACUTE + '\u0158' # 0x00fc -> LATIN CAPITAL LETTER R WITH CARON + '\u0159' # 0x00fd -> LATIN SMALL LETTER R WITH CARON + '\u25a0' # 0x00fe -> BLACK SQUARE + '\xa0' # 0x00ff -> NO-BREAK SPACE +) + +### Encoding Map + +encoding_map = { + 0x0000: 0x0000, # NULL + 0x0001: 0x0001, # START OF HEADING + 0x0002: 0x0002, # START OF TEXT + 0x0003: 0x0003, # END OF TEXT + 0x0004: 0x0004, # END OF TRANSMISSION + 0x0005: 0x0005, # ENQUIRY + 0x0006: 0x0006, # ACKNOWLEDGE + 0x0007: 0x0007, # BELL + 0x0008: 0x0008, # BACKSPACE + 0x0009: 0x0009, # HORIZONTAL TABULATION + 0x000a: 0x000a, # LINE FEED + 0x000b: 0x000b, # VERTICAL TABULATION + 0x000c: 0x000c, # FORM FEED + 0x000d: 0x000d, # CARRIAGE RETURN + 0x000e: 0x000e, # SHIFT OUT + 0x000f: 0x000f, # SHIFT IN + 0x0010: 0x0010, # DATA LINK ESCAPE + 0x0011: 0x0011, # DEVICE CONTROL ONE + 0x0012: 0x0012, # DEVICE CONTROL TWO + 0x0013: 0x0013, # DEVICE CONTROL THREE + 0x0014: 0x0014, # DEVICE CONTROL FOUR + 0x0015: 0x0015, # NEGATIVE ACKNOWLEDGE + 0x0016: 0x0016, # SYNCHRONOUS IDLE + 0x0017: 0x0017, # END OF TRANSMISSION BLOCK + 0x0018: 0x0018, # CANCEL + 0x0019: 0x0019, # END OF MEDIUM + 0x001a: 0x001a, # SUBSTITUTE + 0x001b: 0x001b, # ESCAPE + 0x001c: 0x001c, # FILE SEPARATOR + 0x001d: 0x001d, # GROUP SEPARATOR + 0x001e: 0x001e, # RECORD SEPARATOR + 0x001f: 0x001f, # UNIT SEPARATOR + 0x0020: 0x0020, # SPACE + 0x0021: 0x0021, # EXCLAMATION MARK + 0x0022: 0x0022, # QUOTATION MARK + 0x0023: 0x0023, # NUMBER SIGN + 0x0024: 0x0024, # DOLLAR SIGN + 0x0025: 0x0025, # PERCENT SIGN + 0x0026: 0x0026, # AMPERSAND + 0x0027: 0x0027, # APOSTROPHE + 0x0028: 0x0028, # LEFT PARENTHESIS + 0x0029: 0x0029, # RIGHT PARENTHESIS + 0x002a: 0x002a, # ASTERISK + 0x002b: 0x002b, # PLUS SIGN + 0x002c: 0x002c, # COMMA + 0x002d: 0x002d, # HYPHEN-MINUS + 0x002e: 0x002e, # FULL STOP + 0x002f: 0x002f, # SOLIDUS + 0x0030: 0x0030, # DIGIT ZERO + 0x0031: 0x0031, # DIGIT ONE + 0x0032: 0x0032, # DIGIT TWO + 0x0033: 0x0033, # DIGIT THREE + 0x0034: 0x0034, # DIGIT FOUR + 0x0035: 0x0035, # DIGIT FIVE + 0x0036: 0x0036, # DIGIT SIX + 0x0037: 0x0037, # DIGIT SEVEN + 0x0038: 0x0038, # DIGIT EIGHT + 0x0039: 0x0039, # DIGIT NINE + 0x003a: 0x003a, # COLON + 0x003b: 0x003b, # SEMICOLON + 0x003c: 0x003c, # LESS-THAN SIGN + 0x003d: 0x003d, # EQUALS SIGN + 0x003e: 0x003e, # GREATER-THAN SIGN + 0x003f: 0x003f, # QUESTION MARK + 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 + 0x005c: 0x005c, # REVERSE SOLIDUS + 0x005d: 0x005d, # RIGHT SQUARE BRACKET + 0x005e: 0x005e, # CIRCUMFLEX ACCENT + 0x005f: 0x005f, # LOW LINE + 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 + 0x007c: 0x007c, # VERTICAL LINE + 0x007d: 0x007d, # RIGHT CURLY BRACKET + 0x007e: 0x007e, # TILDE + 0x007f: 0x007f, # DELETE + 0x00a0: 0x00ff, # NO-BREAK SPACE + 0x00a4: 0x00cf, # CURRENCY SIGN + 0x00a7: 0x00f5, # SECTION SIGN + 0x00a8: 0x00f9, # DIAERESIS + 0x00ab: 0x00ae, # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00ac: 0x00aa, # NOT SIGN + 0x00ad: 0x00f0, # SOFT HYPHEN + 0x00b0: 0x00f8, # DEGREE SIGN + 0x00b4: 0x00ef, # ACUTE ACCENT + 0x00b8: 0x00f7, # CEDILLA + 0x00bb: 0x00af, # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00c1: 0x00b5, # LATIN CAPITAL LETTER A WITH ACUTE + 0x00c2: 0x00b6, # LATIN CAPITAL LETTER A WITH CIRCUMFLEX + 0x00c4: 0x008e, # LATIN CAPITAL LETTER A WITH DIAERESIS + 0x00c7: 0x0080, # LATIN CAPITAL LETTER C WITH CEDILLA + 0x00c9: 0x0090, # LATIN CAPITAL LETTER E WITH ACUTE + 0x00cb: 0x00d3, # LATIN CAPITAL LETTER E WITH DIAERESIS + 0x00cd: 0x00d6, # LATIN CAPITAL LETTER I WITH ACUTE + 0x00ce: 0x00d7, # LATIN CAPITAL LETTER I WITH CIRCUMFLEX + 0x00d3: 0x00e0, # LATIN CAPITAL LETTER O WITH ACUTE + 0x00d4: 0x00e2, # LATIN CAPITAL LETTER O WITH CIRCUMFLEX + 0x00d6: 0x0099, # LATIN CAPITAL LETTER O WITH DIAERESIS + 0x00d7: 0x009e, # MULTIPLICATION SIGN + 0x00da: 0x00e9, # LATIN CAPITAL LETTER U WITH ACUTE + 0x00dc: 0x009a, # LATIN CAPITAL LETTER U WITH DIAERESIS + 0x00dd: 0x00ed, # LATIN CAPITAL LETTER Y WITH ACUTE + 0x00df: 0x00e1, # LATIN SMALL LETTER SHARP S + 0x00e1: 0x00a0, # LATIN SMALL LETTER A WITH ACUTE + 0x00e2: 0x0083, # LATIN SMALL LETTER A WITH CIRCUMFLEX + 0x00e4: 0x0084, # LATIN SMALL LETTER A WITH DIAERESIS + 0x00e7: 0x0087, # LATIN SMALL LETTER C WITH CEDILLA + 0x00e9: 0x0082, # LATIN SMALL LETTER E WITH ACUTE + 0x00eb: 0x0089, # LATIN SMALL LETTER E WITH DIAERESIS + 0x00ed: 0x00a1, # LATIN SMALL LETTER I WITH ACUTE + 0x00ee: 0x008c, # LATIN SMALL LETTER I WITH CIRCUMFLEX + 0x00f3: 0x00a2, # LATIN SMALL LETTER O WITH ACUTE + 0x00f4: 0x0093, # LATIN SMALL LETTER O WITH CIRCUMFLEX + 0x00f6: 0x0094, # LATIN SMALL LETTER O WITH DIAERESIS + 0x00f7: 0x00f6, # DIVISION SIGN + 0x00fa: 0x00a3, # LATIN SMALL LETTER U WITH ACUTE + 0x00fc: 0x0081, # LATIN SMALL LETTER U WITH DIAERESIS + 0x00fd: 0x00ec, # LATIN SMALL LETTER Y WITH ACUTE + 0x0102: 0x00c6, # LATIN CAPITAL LETTER A WITH BREVE + 0x0103: 0x00c7, # LATIN SMALL LETTER A WITH BREVE + 0x0104: 0x00a4, # LATIN CAPITAL LETTER A WITH OGONEK + 0x0105: 0x00a5, # LATIN SMALL LETTER A WITH OGONEK + 0x0106: 0x008f, # LATIN CAPITAL LETTER C WITH ACUTE + 0x0107: 0x0086, # LATIN SMALL LETTER C WITH ACUTE + 0x010c: 0x00ac, # LATIN CAPITAL LETTER C WITH CARON + 0x010d: 0x009f, # LATIN SMALL LETTER C WITH CARON + 0x010e: 0x00d2, # LATIN CAPITAL LETTER D WITH CARON + 0x010f: 0x00d4, # LATIN SMALL LETTER D WITH CARON + 0x0110: 0x00d1, # LATIN CAPITAL LETTER D WITH STROKE + 0x0111: 0x00d0, # LATIN SMALL LETTER D WITH STROKE + 0x0118: 0x00a8, # LATIN CAPITAL LETTER E WITH OGONEK + 0x0119: 0x00a9, # LATIN SMALL LETTER E WITH OGONEK + 0x011a: 0x00b7, # LATIN CAPITAL LETTER E WITH CARON + 0x011b: 0x00d8, # LATIN SMALL LETTER E WITH CARON + 0x0139: 0x0091, # LATIN CAPITAL LETTER L WITH ACUTE + 0x013a: 0x0092, # LATIN SMALL LETTER L WITH ACUTE + 0x013d: 0x0095, # LATIN CAPITAL LETTER L WITH CARON + 0x013e: 0x0096, # LATIN SMALL LETTER L WITH CARON + 0x0141: 0x009d, # LATIN CAPITAL LETTER L WITH STROKE + 0x0142: 0x0088, # LATIN SMALL LETTER L WITH STROKE + 0x0143: 0x00e3, # LATIN CAPITAL LETTER N WITH ACUTE + 0x0144: 0x00e4, # LATIN SMALL LETTER N WITH ACUTE + 0x0147: 0x00d5, # LATIN CAPITAL LETTER N WITH CARON + 0x0148: 0x00e5, # LATIN SMALL LETTER N WITH CARON + 0x0150: 0x008a, # LATIN CAPITAL LETTER O WITH DOUBLE ACUTE + 0x0151: 0x008b, # LATIN SMALL LETTER O WITH DOUBLE ACUTE + 0x0154: 0x00e8, # LATIN CAPITAL LETTER R WITH ACUTE + 0x0155: 0x00ea, # LATIN SMALL LETTER R WITH ACUTE + 0x0158: 0x00fc, # LATIN CAPITAL LETTER R WITH CARON + 0x0159: 0x00fd, # LATIN SMALL LETTER R WITH CARON + 0x015a: 0x0097, # LATIN CAPITAL LETTER S WITH ACUTE + 0x015b: 0x0098, # LATIN SMALL LETTER S WITH ACUTE + 0x015e: 0x00b8, # LATIN CAPITAL LETTER S WITH CEDILLA + 0x015f: 0x00ad, # LATIN SMALL LETTER S WITH CEDILLA + 0x0160: 0x00e6, # LATIN CAPITAL LETTER S WITH CARON + 0x0161: 0x00e7, # LATIN SMALL LETTER S WITH CARON + 0x0162: 0x00dd, # LATIN CAPITAL LETTER T WITH CEDILLA + 0x0163: 0x00ee, # LATIN SMALL LETTER T WITH CEDILLA + 0x0164: 0x009b, # LATIN CAPITAL LETTER T WITH CARON + 0x0165: 0x009c, # LATIN SMALL LETTER T WITH CARON + 0x016e: 0x00de, # LATIN CAPITAL LETTER U WITH RING ABOVE + 0x016f: 0x0085, # LATIN SMALL LETTER U WITH RING ABOVE + 0x0170: 0x00eb, # LATIN CAPITAL LETTER U WITH DOUBLE ACUTE + 0x0171: 0x00fb, # LATIN SMALL LETTER U WITH DOUBLE ACUTE + 0x0179: 0x008d, # LATIN CAPITAL LETTER Z WITH ACUTE + 0x017a: 0x00ab, # LATIN SMALL LETTER Z WITH ACUTE + 0x017b: 0x00bd, # LATIN CAPITAL LETTER Z WITH DOT ABOVE + 0x017c: 0x00be, # LATIN SMALL LETTER Z WITH DOT ABOVE + 0x017d: 0x00a6, # LATIN CAPITAL LETTER Z WITH CARON + 0x017e: 0x00a7, # LATIN SMALL LETTER Z WITH CARON + 0x02c7: 0x00f3, # CARON + 0x02d8: 0x00f4, # BREVE + 0x02d9: 0x00fa, # DOT ABOVE + 0x02db: 0x00f2, # OGONEK + 0x02dd: 0x00f1, # DOUBLE ACUTE ACCENT + 0x2500: 0x00c4, # BOX DRAWINGS LIGHT HORIZONTAL + 0x2502: 0x00b3, # BOX DRAWINGS LIGHT VERTICAL + 0x250c: 0x00da, # BOX DRAWINGS LIGHT DOWN AND RIGHT + 0x2510: 0x00bf, # BOX DRAWINGS LIGHT DOWN AND LEFT + 0x2514: 0x00c0, # BOX DRAWINGS LIGHT UP AND RIGHT + 0x2518: 0x00d9, # BOX DRAWINGS LIGHT UP AND LEFT + 0x251c: 0x00c3, # BOX DRAWINGS LIGHT VERTICAL AND RIGHT + 0x2524: 0x00b4, # BOX DRAWINGS LIGHT VERTICAL AND LEFT + 0x252c: 0x00c2, # BOX DRAWINGS LIGHT DOWN AND HORIZONTAL + 0x2534: 0x00c1, # BOX DRAWINGS LIGHT UP AND HORIZONTAL + 0x253c: 0x00c5, # BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL + 0x2550: 0x00cd, # BOX DRAWINGS DOUBLE HORIZONTAL + 0x2551: 0x00ba, # BOX DRAWINGS DOUBLE VERTICAL + 0x2554: 0x00c9, # BOX DRAWINGS DOUBLE DOWN AND RIGHT + 0x2557: 0x00bb, # BOX DRAWINGS DOUBLE DOWN AND LEFT + 0x255a: 0x00c8, # BOX DRAWINGS DOUBLE UP AND RIGHT + 0x255d: 0x00bc, # BOX DRAWINGS DOUBLE UP AND LEFT + 0x2560: 0x00cc, # BOX DRAWINGS DOUBLE VERTICAL AND RIGHT + 0x2563: 0x00b9, # BOX DRAWINGS DOUBLE VERTICAL AND LEFT + 0x2566: 0x00cb, # BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL + 0x2569: 0x00ca, # BOX DRAWINGS DOUBLE UP AND HORIZONTAL + 0x256c: 0x00ce, # BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL + 0x2580: 0x00df, # UPPER HALF BLOCK + 0x2584: 0x00dc, # LOWER HALF BLOCK + 0x2588: 0x00db, # FULL BLOCK + 0x2591: 0x00b0, # LIGHT SHADE + 0x2592: 0x00b1, # MEDIUM SHADE + 0x2593: 0x00b2, # DARK SHADE + 0x25a0: 0x00fe, # BLACK SQUARE +} diff --git a/env/Lib/encodings/cp855.py b/env/Lib/encodings/cp855.py new file mode 100644 index 0000000..4fe9210 --- /dev/null +++ b/env/Lib/encodings/cp855.py @@ -0,0 +1,698 @@ +""" Python Character Mapping Codec generated from 'VENDORS/MICSFT/PC/CP855.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_map) + + 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_map)[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='cp855', + 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: 0x0452, # CYRILLIC SMALL LETTER DJE + 0x0081: 0x0402, # CYRILLIC CAPITAL LETTER DJE + 0x0082: 0x0453, # CYRILLIC SMALL LETTER GJE + 0x0083: 0x0403, # CYRILLIC CAPITAL LETTER GJE + 0x0084: 0x0451, # CYRILLIC SMALL LETTER IO + 0x0085: 0x0401, # CYRILLIC CAPITAL LETTER IO + 0x0086: 0x0454, # CYRILLIC SMALL LETTER UKRAINIAN IE + 0x0087: 0x0404, # CYRILLIC CAPITAL LETTER UKRAINIAN IE + 0x0088: 0x0455, # CYRILLIC SMALL LETTER DZE + 0x0089: 0x0405, # CYRILLIC CAPITAL LETTER DZE + 0x008a: 0x0456, # CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I + 0x008b: 0x0406, # CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I + 0x008c: 0x0457, # CYRILLIC SMALL LETTER YI + 0x008d: 0x0407, # CYRILLIC CAPITAL LETTER YI + 0x008e: 0x0458, # CYRILLIC SMALL LETTER JE + 0x008f: 0x0408, # CYRILLIC CAPITAL LETTER JE + 0x0090: 0x0459, # CYRILLIC SMALL LETTER LJE + 0x0091: 0x0409, # CYRILLIC CAPITAL LETTER LJE + 0x0092: 0x045a, # CYRILLIC SMALL LETTER NJE + 0x0093: 0x040a, # CYRILLIC CAPITAL LETTER NJE + 0x0094: 0x045b, # CYRILLIC SMALL LETTER TSHE + 0x0095: 0x040b, # CYRILLIC CAPITAL LETTER TSHE + 0x0096: 0x045c, # CYRILLIC SMALL LETTER KJE + 0x0097: 0x040c, # CYRILLIC CAPITAL LETTER KJE + 0x0098: 0x045e, # CYRILLIC SMALL LETTER SHORT U + 0x0099: 0x040e, # CYRILLIC CAPITAL LETTER SHORT U + 0x009a: 0x045f, # CYRILLIC SMALL LETTER DZHE + 0x009b: 0x040f, # CYRILLIC CAPITAL LETTER DZHE + 0x009c: 0x044e, # CYRILLIC SMALL LETTER YU + 0x009d: 0x042e, # CYRILLIC CAPITAL LETTER YU + 0x009e: 0x044a, # CYRILLIC SMALL LETTER HARD SIGN + 0x009f: 0x042a, # CYRILLIC CAPITAL LETTER HARD SIGN + 0x00a0: 0x0430, # CYRILLIC SMALL LETTER A + 0x00a1: 0x0410, # CYRILLIC CAPITAL LETTER A + 0x00a2: 0x0431, # CYRILLIC SMALL LETTER BE + 0x00a3: 0x0411, # CYRILLIC CAPITAL LETTER BE + 0x00a4: 0x0446, # CYRILLIC SMALL LETTER TSE + 0x00a5: 0x0426, # CYRILLIC CAPITAL LETTER TSE + 0x00a6: 0x0434, # CYRILLIC SMALL LETTER DE + 0x00a7: 0x0414, # CYRILLIC CAPITAL LETTER DE + 0x00a8: 0x0435, # CYRILLIC SMALL LETTER IE + 0x00a9: 0x0415, # CYRILLIC CAPITAL LETTER IE + 0x00aa: 0x0444, # CYRILLIC SMALL LETTER EF + 0x00ab: 0x0424, # CYRILLIC CAPITAL LETTER EF + 0x00ac: 0x0433, # CYRILLIC SMALL LETTER GHE + 0x00ad: 0x0413, # CYRILLIC CAPITAL LETTER GHE + 0x00ae: 0x00ab, # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00af: 0x00bb, # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00b0: 0x2591, # LIGHT SHADE + 0x00b1: 0x2592, # MEDIUM SHADE + 0x00b2: 0x2593, # DARK SHADE + 0x00b3: 0x2502, # BOX DRAWINGS LIGHT VERTICAL + 0x00b4: 0x2524, # BOX DRAWINGS LIGHT VERTICAL AND LEFT + 0x00b5: 0x0445, # CYRILLIC SMALL LETTER HA + 0x00b6: 0x0425, # CYRILLIC CAPITAL LETTER HA + 0x00b7: 0x0438, # CYRILLIC SMALL LETTER I + 0x00b8: 0x0418, # CYRILLIC CAPITAL LETTER I + 0x00b9: 0x2563, # BOX DRAWINGS DOUBLE VERTICAL AND LEFT + 0x00ba: 0x2551, # BOX DRAWINGS DOUBLE VERTICAL + 0x00bb: 0x2557, # BOX DRAWINGS DOUBLE DOWN AND LEFT + 0x00bc: 0x255d, # BOX DRAWINGS DOUBLE UP AND LEFT + 0x00bd: 0x0439, # CYRILLIC SMALL LETTER SHORT I + 0x00be: 0x0419, # CYRILLIC CAPITAL LETTER SHORT I + 0x00bf: 0x2510, # BOX DRAWINGS LIGHT DOWN AND LEFT + 0x00c0: 0x2514, # BOX DRAWINGS LIGHT UP AND RIGHT + 0x00c1: 0x2534, # BOX DRAWINGS LIGHT UP AND HORIZONTAL + 0x00c2: 0x252c, # BOX DRAWINGS LIGHT DOWN AND HORIZONTAL + 0x00c3: 0x251c, # BOX DRAWINGS LIGHT VERTICAL AND RIGHT + 0x00c4: 0x2500, # BOX DRAWINGS LIGHT HORIZONTAL + 0x00c5: 0x253c, # BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL + 0x00c6: 0x043a, # CYRILLIC SMALL LETTER KA + 0x00c7: 0x041a, # CYRILLIC CAPITAL LETTER KA + 0x00c8: 0x255a, # BOX DRAWINGS DOUBLE UP AND RIGHT + 0x00c9: 0x2554, # BOX DRAWINGS DOUBLE DOWN AND RIGHT + 0x00ca: 0x2569, # BOX DRAWINGS DOUBLE UP AND HORIZONTAL + 0x00cb: 0x2566, # BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL + 0x00cc: 0x2560, # BOX DRAWINGS DOUBLE VERTICAL AND RIGHT + 0x00cd: 0x2550, # BOX DRAWINGS DOUBLE HORIZONTAL + 0x00ce: 0x256c, # BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL + 0x00cf: 0x00a4, # CURRENCY SIGN + 0x00d0: 0x043b, # CYRILLIC SMALL LETTER EL + 0x00d1: 0x041b, # CYRILLIC CAPITAL LETTER EL + 0x00d2: 0x043c, # CYRILLIC SMALL LETTER EM + 0x00d3: 0x041c, # CYRILLIC CAPITAL LETTER EM + 0x00d4: 0x043d, # CYRILLIC SMALL LETTER EN + 0x00d5: 0x041d, # CYRILLIC CAPITAL LETTER EN + 0x00d6: 0x043e, # CYRILLIC SMALL LETTER O + 0x00d7: 0x041e, # CYRILLIC CAPITAL LETTER O + 0x00d8: 0x043f, # CYRILLIC SMALL LETTER PE + 0x00d9: 0x2518, # BOX DRAWINGS LIGHT UP AND LEFT + 0x00da: 0x250c, # BOX DRAWINGS LIGHT DOWN AND RIGHT + 0x00db: 0x2588, # FULL BLOCK + 0x00dc: 0x2584, # LOWER HALF BLOCK + 0x00dd: 0x041f, # CYRILLIC CAPITAL LETTER PE + 0x00de: 0x044f, # CYRILLIC SMALL LETTER YA + 0x00df: 0x2580, # UPPER HALF BLOCK + 0x00e0: 0x042f, # CYRILLIC CAPITAL LETTER YA + 0x00e1: 0x0440, # CYRILLIC SMALL LETTER ER + 0x00e2: 0x0420, # CYRILLIC CAPITAL LETTER ER + 0x00e3: 0x0441, # CYRILLIC SMALL LETTER ES + 0x00e4: 0x0421, # CYRILLIC CAPITAL LETTER ES + 0x00e5: 0x0442, # CYRILLIC SMALL LETTER TE + 0x00e6: 0x0422, # CYRILLIC CAPITAL LETTER TE + 0x00e7: 0x0443, # CYRILLIC SMALL LETTER U + 0x00e8: 0x0423, # CYRILLIC CAPITAL LETTER U + 0x00e9: 0x0436, # CYRILLIC SMALL LETTER ZHE + 0x00ea: 0x0416, # CYRILLIC CAPITAL LETTER ZHE + 0x00eb: 0x0432, # CYRILLIC SMALL LETTER VE + 0x00ec: 0x0412, # CYRILLIC CAPITAL LETTER VE + 0x00ed: 0x044c, # CYRILLIC SMALL LETTER SOFT SIGN + 0x00ee: 0x042c, # CYRILLIC CAPITAL LETTER SOFT SIGN + 0x00ef: 0x2116, # NUMERO SIGN + 0x00f0: 0x00ad, # SOFT HYPHEN + 0x00f1: 0x044b, # CYRILLIC SMALL LETTER YERU + 0x00f2: 0x042b, # CYRILLIC CAPITAL LETTER YERU + 0x00f3: 0x0437, # CYRILLIC SMALL LETTER ZE + 0x00f4: 0x0417, # CYRILLIC CAPITAL LETTER ZE + 0x00f5: 0x0448, # CYRILLIC SMALL LETTER SHA + 0x00f6: 0x0428, # CYRILLIC CAPITAL LETTER SHA + 0x00f7: 0x044d, # CYRILLIC SMALL LETTER E + 0x00f8: 0x042d, # CYRILLIC CAPITAL LETTER E + 0x00f9: 0x0449, # CYRILLIC SMALL LETTER SHCHA + 0x00fa: 0x0429, # CYRILLIC CAPITAL LETTER SHCHA + 0x00fb: 0x0447, # CYRILLIC SMALL LETTER CHE + 0x00fc: 0x0427, # CYRILLIC CAPITAL LETTER CHE + 0x00fd: 0x00a7, # SECTION SIGN + 0x00fe: 0x25a0, # BLACK SQUARE + 0x00ff: 0x00a0, # NO-BREAK SPACE +}) + +### Decoding Table + +decoding_table = ( + '\x00' # 0x0000 -> NULL + '\x01' # 0x0001 -> START OF HEADING + '\x02' # 0x0002 -> START OF TEXT + '\x03' # 0x0003 -> END OF TEXT + '\x04' # 0x0004 -> END OF TRANSMISSION + '\x05' # 0x0005 -> ENQUIRY + '\x06' # 0x0006 -> ACKNOWLEDGE + '\x07' # 0x0007 -> BELL + '\x08' # 0x0008 -> BACKSPACE + '\t' # 0x0009 -> HORIZONTAL TABULATION + '\n' # 0x000a -> LINE FEED + '\x0b' # 0x000b -> VERTICAL TABULATION + '\x0c' # 0x000c -> FORM FEED + '\r' # 0x000d -> CARRIAGE RETURN + '\x0e' # 0x000e -> SHIFT OUT + '\x0f' # 0x000f -> SHIFT IN + '\x10' # 0x0010 -> DATA LINK ESCAPE + '\x11' # 0x0011 -> DEVICE CONTROL ONE + '\x12' # 0x0012 -> DEVICE CONTROL TWO + '\x13' # 0x0013 -> DEVICE CONTROL THREE + '\x14' # 0x0014 -> DEVICE CONTROL FOUR + '\x15' # 0x0015 -> NEGATIVE ACKNOWLEDGE + '\x16' # 0x0016 -> SYNCHRONOUS IDLE + '\x17' # 0x0017 -> END OF TRANSMISSION BLOCK + '\x18' # 0x0018 -> CANCEL + '\x19' # 0x0019 -> END OF MEDIUM + '\x1a' # 0x001a -> SUBSTITUTE + '\x1b' # 0x001b -> ESCAPE + '\x1c' # 0x001c -> FILE SEPARATOR + '\x1d' # 0x001d -> GROUP SEPARATOR + '\x1e' # 0x001e -> RECORD SEPARATOR + '\x1f' # 0x001f -> UNIT SEPARATOR + ' ' # 0x0020 -> SPACE + '!' # 0x0021 -> EXCLAMATION MARK + '"' # 0x0022 -> QUOTATION MARK + '#' # 0x0023 -> NUMBER SIGN + '$' # 0x0024 -> DOLLAR SIGN + '%' # 0x0025 -> PERCENT SIGN + '&' # 0x0026 -> AMPERSAND + "'" # 0x0027 -> APOSTROPHE + '(' # 0x0028 -> LEFT PARENTHESIS + ')' # 0x0029 -> RIGHT PARENTHESIS + '*' # 0x002a -> ASTERISK + '+' # 0x002b -> PLUS SIGN + ',' # 0x002c -> COMMA + '-' # 0x002d -> HYPHEN-MINUS + '.' # 0x002e -> FULL STOP + '/' # 0x002f -> SOLIDUS + '0' # 0x0030 -> DIGIT ZERO + '1' # 0x0031 -> DIGIT ONE + '2' # 0x0032 -> DIGIT TWO + '3' # 0x0033 -> DIGIT THREE + '4' # 0x0034 -> DIGIT FOUR + '5' # 0x0035 -> DIGIT FIVE + '6' # 0x0036 -> DIGIT SIX + '7' # 0x0037 -> DIGIT SEVEN + '8' # 0x0038 -> DIGIT EIGHT + '9' # 0x0039 -> DIGIT NINE + ':' # 0x003a -> COLON + ';' # 0x003b -> SEMICOLON + '<' # 0x003c -> LESS-THAN SIGN + '=' # 0x003d -> EQUALS SIGN + '>' # 0x003e -> GREATER-THAN SIGN + '?' # 0x003f -> QUESTION MARK + '@' # 0x0040 -> COMMERCIAL AT + 'A' # 0x0041 -> LATIN CAPITAL LETTER A + 'B' # 0x0042 -> LATIN CAPITAL LETTER B + 'C' # 0x0043 -> LATIN CAPITAL LETTER C + 'D' # 0x0044 -> LATIN CAPITAL LETTER D + 'E' # 0x0045 -> LATIN CAPITAL LETTER E + 'F' # 0x0046 -> LATIN CAPITAL LETTER F + 'G' # 0x0047 -> LATIN CAPITAL LETTER G + 'H' # 0x0048 -> LATIN CAPITAL LETTER H + 'I' # 0x0049 -> LATIN CAPITAL LETTER I + 'J' # 0x004a -> LATIN CAPITAL LETTER J + 'K' # 0x004b -> LATIN CAPITAL LETTER K + 'L' # 0x004c -> LATIN CAPITAL LETTER L + 'M' # 0x004d -> LATIN CAPITAL LETTER M + 'N' # 0x004e -> LATIN CAPITAL LETTER N + 'O' # 0x004f -> LATIN CAPITAL LETTER O + 'P' # 0x0050 -> LATIN CAPITAL LETTER P + 'Q' # 0x0051 -> LATIN CAPITAL LETTER Q + 'R' # 0x0052 -> LATIN CAPITAL LETTER R + 'S' # 0x0053 -> LATIN CAPITAL LETTER S + 'T' # 0x0054 -> LATIN CAPITAL LETTER T + 'U' # 0x0055 -> LATIN CAPITAL LETTER U + 'V' # 0x0056 -> LATIN CAPITAL LETTER V + 'W' # 0x0057 -> LATIN CAPITAL LETTER W + 'X' # 0x0058 -> LATIN CAPITAL LETTER X + 'Y' # 0x0059 -> LATIN CAPITAL LETTER Y + 'Z' # 0x005a -> LATIN CAPITAL LETTER Z + '[' # 0x005b -> LEFT SQUARE BRACKET + '\\' # 0x005c -> REVERSE SOLIDUS + ']' # 0x005d -> RIGHT SQUARE BRACKET + '^' # 0x005e -> CIRCUMFLEX ACCENT + '_' # 0x005f -> LOW LINE + '`' # 0x0060 -> GRAVE ACCENT + 'a' # 0x0061 -> LATIN SMALL LETTER A + 'b' # 0x0062 -> LATIN SMALL LETTER B + 'c' # 0x0063 -> LATIN SMALL LETTER C + 'd' # 0x0064 -> LATIN SMALL LETTER D + 'e' # 0x0065 -> LATIN SMALL LETTER E + 'f' # 0x0066 -> LATIN SMALL LETTER F + 'g' # 0x0067 -> LATIN SMALL LETTER G + 'h' # 0x0068 -> LATIN SMALL LETTER H + 'i' # 0x0069 -> LATIN SMALL LETTER I + 'j' # 0x006a -> LATIN SMALL LETTER J + 'k' # 0x006b -> LATIN SMALL LETTER K + 'l' # 0x006c -> LATIN SMALL LETTER L + 'm' # 0x006d -> LATIN SMALL LETTER M + 'n' # 0x006e -> LATIN SMALL LETTER N + 'o' # 0x006f -> LATIN SMALL LETTER O + 'p' # 0x0070 -> LATIN SMALL LETTER P + 'q' # 0x0071 -> LATIN SMALL LETTER Q + 'r' # 0x0072 -> LATIN SMALL LETTER R + 's' # 0x0073 -> LATIN SMALL LETTER S + 't' # 0x0074 -> LATIN SMALL LETTER T + 'u' # 0x0075 -> LATIN SMALL LETTER U + 'v' # 0x0076 -> LATIN SMALL LETTER V + 'w' # 0x0077 -> LATIN SMALL LETTER W + 'x' # 0x0078 -> LATIN SMALL LETTER X + 'y' # 0x0079 -> LATIN SMALL LETTER Y + 'z' # 0x007a -> LATIN SMALL LETTER Z + '{' # 0x007b -> LEFT CURLY BRACKET + '|' # 0x007c -> VERTICAL LINE + '}' # 0x007d -> RIGHT CURLY BRACKET + '~' # 0x007e -> TILDE + '\x7f' # 0x007f -> DELETE + '\u0452' # 0x0080 -> CYRILLIC SMALL LETTER DJE + '\u0402' # 0x0081 -> CYRILLIC CAPITAL LETTER DJE + '\u0453' # 0x0082 -> CYRILLIC SMALL LETTER GJE + '\u0403' # 0x0083 -> CYRILLIC CAPITAL LETTER GJE + '\u0451' # 0x0084 -> CYRILLIC SMALL LETTER IO + '\u0401' # 0x0085 -> CYRILLIC CAPITAL LETTER IO + '\u0454' # 0x0086 -> CYRILLIC SMALL LETTER UKRAINIAN IE + '\u0404' # 0x0087 -> CYRILLIC CAPITAL LETTER UKRAINIAN IE + '\u0455' # 0x0088 -> CYRILLIC SMALL LETTER DZE + '\u0405' # 0x0089 -> CYRILLIC CAPITAL LETTER DZE + '\u0456' # 0x008a -> CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I + '\u0406' # 0x008b -> CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I + '\u0457' # 0x008c -> CYRILLIC SMALL LETTER YI + '\u0407' # 0x008d -> CYRILLIC CAPITAL LETTER YI + '\u0458' # 0x008e -> CYRILLIC SMALL LETTER JE + '\u0408' # 0x008f -> CYRILLIC CAPITAL LETTER JE + '\u0459' # 0x0090 -> CYRILLIC SMALL LETTER LJE + '\u0409' # 0x0091 -> CYRILLIC CAPITAL LETTER LJE + '\u045a' # 0x0092 -> CYRILLIC SMALL LETTER NJE + '\u040a' # 0x0093 -> CYRILLIC CAPITAL LETTER NJE + '\u045b' # 0x0094 -> CYRILLIC SMALL LETTER TSHE + '\u040b' # 0x0095 -> CYRILLIC CAPITAL LETTER TSHE + '\u045c' # 0x0096 -> CYRILLIC SMALL LETTER KJE + '\u040c' # 0x0097 -> CYRILLIC CAPITAL LETTER KJE + '\u045e' # 0x0098 -> CYRILLIC SMALL LETTER SHORT U + '\u040e' # 0x0099 -> CYRILLIC CAPITAL LETTER SHORT U + '\u045f' # 0x009a -> CYRILLIC SMALL LETTER DZHE + '\u040f' # 0x009b -> CYRILLIC CAPITAL LETTER DZHE + '\u044e' # 0x009c -> CYRILLIC SMALL LETTER YU + '\u042e' # 0x009d -> CYRILLIC CAPITAL LETTER YU + '\u044a' # 0x009e -> CYRILLIC SMALL LETTER HARD SIGN + '\u042a' # 0x009f -> CYRILLIC CAPITAL LETTER HARD SIGN + '\u0430' # 0x00a0 -> CYRILLIC SMALL LETTER A + '\u0410' # 0x00a1 -> CYRILLIC CAPITAL LETTER A + '\u0431' # 0x00a2 -> CYRILLIC SMALL LETTER BE + '\u0411' # 0x00a3 -> CYRILLIC CAPITAL LETTER BE + '\u0446' # 0x00a4 -> CYRILLIC SMALL LETTER TSE + '\u0426' # 0x00a5 -> CYRILLIC CAPITAL LETTER TSE + '\u0434' # 0x00a6 -> CYRILLIC SMALL LETTER DE + '\u0414' # 0x00a7 -> CYRILLIC CAPITAL LETTER DE + '\u0435' # 0x00a8 -> CYRILLIC SMALL LETTER IE + '\u0415' # 0x00a9 -> CYRILLIC CAPITAL LETTER IE + '\u0444' # 0x00aa -> CYRILLIC SMALL LETTER EF + '\u0424' # 0x00ab -> CYRILLIC CAPITAL LETTER EF + '\u0433' # 0x00ac -> CYRILLIC SMALL LETTER GHE + '\u0413' # 0x00ad -> CYRILLIC CAPITAL LETTER GHE + '\xab' # 0x00ae -> LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + '\xbb' # 0x00af -> RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + '\u2591' # 0x00b0 -> LIGHT SHADE + '\u2592' # 0x00b1 -> MEDIUM SHADE + '\u2593' # 0x00b2 -> DARK SHADE + '\u2502' # 0x00b3 -> BOX DRAWINGS LIGHT VERTICAL + '\u2524' # 0x00b4 -> BOX DRAWINGS LIGHT VERTICAL AND LEFT + '\u0445' # 0x00b5 -> CYRILLIC SMALL LETTER HA + '\u0425' # 0x00b6 -> CYRILLIC CAPITAL LETTER HA + '\u0438' # 0x00b7 -> CYRILLIC SMALL LETTER I + '\u0418' # 0x00b8 -> CYRILLIC CAPITAL LETTER I + '\u2563' # 0x00b9 -> BOX DRAWINGS DOUBLE VERTICAL AND LEFT + '\u2551' # 0x00ba -> BOX DRAWINGS DOUBLE VERTICAL + '\u2557' # 0x00bb -> BOX DRAWINGS DOUBLE DOWN AND LEFT + '\u255d' # 0x00bc -> BOX DRAWINGS DOUBLE UP AND LEFT + '\u0439' # 0x00bd -> CYRILLIC SMALL LETTER SHORT I + '\u0419' # 0x00be -> CYRILLIC CAPITAL LETTER SHORT I + '\u2510' # 0x00bf -> BOX DRAWINGS LIGHT DOWN AND LEFT + '\u2514' # 0x00c0 -> BOX DRAWINGS LIGHT UP AND RIGHT + '\u2534' # 0x00c1 -> BOX DRAWINGS LIGHT UP AND HORIZONTAL + '\u252c' # 0x00c2 -> BOX DRAWINGS LIGHT DOWN AND HORIZONTAL + '\u251c' # 0x00c3 -> BOX DRAWINGS LIGHT VERTICAL AND RIGHT + '\u2500' # 0x00c4 -> BOX DRAWINGS LIGHT HORIZONTAL + '\u253c' # 0x00c5 -> BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL + '\u043a' # 0x00c6 -> CYRILLIC SMALL LETTER KA + '\u041a' # 0x00c7 -> CYRILLIC CAPITAL LETTER KA + '\u255a' # 0x00c8 -> BOX DRAWINGS DOUBLE UP AND RIGHT + '\u2554' # 0x00c9 -> BOX DRAWINGS DOUBLE DOWN AND RIGHT + '\u2569' # 0x00ca -> BOX DRAWINGS DOUBLE UP AND HORIZONTAL + '\u2566' # 0x00cb -> BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL + '\u2560' # 0x00cc -> BOX DRAWINGS DOUBLE VERTICAL AND RIGHT + '\u2550' # 0x00cd -> BOX DRAWINGS DOUBLE HORIZONTAL + '\u256c' # 0x00ce -> BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL + '\xa4' # 0x00cf -> CURRENCY SIGN + '\u043b' # 0x00d0 -> CYRILLIC SMALL LETTER EL + '\u041b' # 0x00d1 -> CYRILLIC CAPITAL LETTER EL + '\u043c' # 0x00d2 -> CYRILLIC SMALL LETTER EM + '\u041c' # 0x00d3 -> CYRILLIC CAPITAL LETTER EM + '\u043d' # 0x00d4 -> CYRILLIC SMALL LETTER EN + '\u041d' # 0x00d5 -> CYRILLIC CAPITAL LETTER EN + '\u043e' # 0x00d6 -> CYRILLIC SMALL LETTER O + '\u041e' # 0x00d7 -> CYRILLIC CAPITAL LETTER O + '\u043f' # 0x00d8 -> CYRILLIC SMALL LETTER PE + '\u2518' # 0x00d9 -> BOX DRAWINGS LIGHT UP AND LEFT + '\u250c' # 0x00da -> BOX DRAWINGS LIGHT DOWN AND RIGHT + '\u2588' # 0x00db -> FULL BLOCK + '\u2584' # 0x00dc -> LOWER HALF BLOCK + '\u041f' # 0x00dd -> CYRILLIC CAPITAL LETTER PE + '\u044f' # 0x00de -> CYRILLIC SMALL LETTER YA + '\u2580' # 0x00df -> UPPER HALF BLOCK + '\u042f' # 0x00e0 -> CYRILLIC CAPITAL LETTER YA + '\u0440' # 0x00e1 -> CYRILLIC SMALL LETTER ER + '\u0420' # 0x00e2 -> CYRILLIC CAPITAL LETTER ER + '\u0441' # 0x00e3 -> CYRILLIC SMALL LETTER ES + '\u0421' # 0x00e4 -> CYRILLIC CAPITAL LETTER ES + '\u0442' # 0x00e5 -> CYRILLIC SMALL LETTER TE + '\u0422' # 0x00e6 -> CYRILLIC CAPITAL LETTER TE + '\u0443' # 0x00e7 -> CYRILLIC SMALL LETTER U + '\u0423' # 0x00e8 -> CYRILLIC CAPITAL LETTER U + '\u0436' # 0x00e9 -> CYRILLIC SMALL LETTER ZHE + '\u0416' # 0x00ea -> CYRILLIC CAPITAL LETTER ZHE + '\u0432' # 0x00eb -> CYRILLIC SMALL LETTER VE + '\u0412' # 0x00ec -> CYRILLIC CAPITAL LETTER VE + '\u044c' # 0x00ed -> CYRILLIC SMALL LETTER SOFT SIGN + '\u042c' # 0x00ee -> CYRILLIC CAPITAL LETTER SOFT SIGN + '\u2116' # 0x00ef -> NUMERO SIGN + '\xad' # 0x00f0 -> SOFT HYPHEN + '\u044b' # 0x00f1 -> CYRILLIC SMALL LETTER YERU + '\u042b' # 0x00f2 -> CYRILLIC CAPITAL LETTER YERU + '\u0437' # 0x00f3 -> CYRILLIC SMALL LETTER ZE + '\u0417' # 0x00f4 -> CYRILLIC CAPITAL LETTER ZE + '\u0448' # 0x00f5 -> CYRILLIC SMALL LETTER SHA + '\u0428' # 0x00f6 -> CYRILLIC CAPITAL LETTER SHA + '\u044d' # 0x00f7 -> CYRILLIC SMALL LETTER E + '\u042d' # 0x00f8 -> CYRILLIC CAPITAL LETTER E + '\u0449' # 0x00f9 -> CYRILLIC SMALL LETTER SHCHA + '\u0429' # 0x00fa -> CYRILLIC CAPITAL LETTER SHCHA + '\u0447' # 0x00fb -> CYRILLIC SMALL LETTER CHE + '\u0427' # 0x00fc -> CYRILLIC CAPITAL LETTER CHE + '\xa7' # 0x00fd -> SECTION SIGN + '\u25a0' # 0x00fe -> BLACK SQUARE + '\xa0' # 0x00ff -> NO-BREAK SPACE +) + +### Encoding Map + +encoding_map = { + 0x0000: 0x0000, # NULL + 0x0001: 0x0001, # START OF HEADING + 0x0002: 0x0002, # START OF TEXT + 0x0003: 0x0003, # END OF TEXT + 0x0004: 0x0004, # END OF TRANSMISSION + 0x0005: 0x0005, # ENQUIRY + 0x0006: 0x0006, # ACKNOWLEDGE + 0x0007: 0x0007, # BELL + 0x0008: 0x0008, # BACKSPACE + 0x0009: 0x0009, # HORIZONTAL TABULATION + 0x000a: 0x000a, # LINE FEED + 0x000b: 0x000b, # VERTICAL TABULATION + 0x000c: 0x000c, # FORM FEED + 0x000d: 0x000d, # CARRIAGE RETURN + 0x000e: 0x000e, # SHIFT OUT + 0x000f: 0x000f, # SHIFT IN + 0x0010: 0x0010, # DATA LINK ESCAPE + 0x0011: 0x0011, # DEVICE CONTROL ONE + 0x0012: 0x0012, # DEVICE CONTROL TWO + 0x0013: 0x0013, # DEVICE CONTROL THREE + 0x0014: 0x0014, # DEVICE CONTROL FOUR + 0x0015: 0x0015, # NEGATIVE ACKNOWLEDGE + 0x0016: 0x0016, # SYNCHRONOUS IDLE + 0x0017: 0x0017, # END OF TRANSMISSION BLOCK + 0x0018: 0x0018, # CANCEL + 0x0019: 0x0019, # END OF MEDIUM + 0x001a: 0x001a, # SUBSTITUTE + 0x001b: 0x001b, # ESCAPE + 0x001c: 0x001c, # FILE SEPARATOR + 0x001d: 0x001d, # GROUP SEPARATOR + 0x001e: 0x001e, # RECORD SEPARATOR + 0x001f: 0x001f, # UNIT SEPARATOR + 0x0020: 0x0020, # SPACE + 0x0021: 0x0021, # EXCLAMATION MARK + 0x0022: 0x0022, # QUOTATION MARK + 0x0023: 0x0023, # NUMBER SIGN + 0x0024: 0x0024, # DOLLAR SIGN + 0x0025: 0x0025, # PERCENT SIGN + 0x0026: 0x0026, # AMPERSAND + 0x0027: 0x0027, # APOSTROPHE + 0x0028: 0x0028, # LEFT PARENTHESIS + 0x0029: 0x0029, # RIGHT PARENTHESIS + 0x002a: 0x002a, # ASTERISK + 0x002b: 0x002b, # PLUS SIGN + 0x002c: 0x002c, # COMMA + 0x002d: 0x002d, # HYPHEN-MINUS + 0x002e: 0x002e, # FULL STOP + 0x002f: 0x002f, # SOLIDUS + 0x0030: 0x0030, # DIGIT ZERO + 0x0031: 0x0031, # DIGIT ONE + 0x0032: 0x0032, # DIGIT TWO + 0x0033: 0x0033, # DIGIT THREE + 0x0034: 0x0034, # DIGIT FOUR + 0x0035: 0x0035, # DIGIT FIVE + 0x0036: 0x0036, # DIGIT SIX + 0x0037: 0x0037, # DIGIT SEVEN + 0x0038: 0x0038, # DIGIT EIGHT + 0x0039: 0x0039, # DIGIT NINE + 0x003a: 0x003a, # COLON + 0x003b: 0x003b, # SEMICOLON + 0x003c: 0x003c, # LESS-THAN SIGN + 0x003d: 0x003d, # EQUALS SIGN + 0x003e: 0x003e, # GREATER-THAN SIGN + 0x003f: 0x003f, # QUESTION MARK + 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 + 0x005c: 0x005c, # REVERSE SOLIDUS + 0x005d: 0x005d, # RIGHT SQUARE BRACKET + 0x005e: 0x005e, # CIRCUMFLEX ACCENT + 0x005f: 0x005f, # LOW LINE + 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 + 0x007c: 0x007c, # VERTICAL LINE + 0x007d: 0x007d, # RIGHT CURLY BRACKET + 0x007e: 0x007e, # TILDE + 0x007f: 0x007f, # DELETE + 0x00a0: 0x00ff, # NO-BREAK SPACE + 0x00a4: 0x00cf, # CURRENCY SIGN + 0x00a7: 0x00fd, # SECTION SIGN + 0x00ab: 0x00ae, # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00ad: 0x00f0, # SOFT HYPHEN + 0x00bb: 0x00af, # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x0401: 0x0085, # CYRILLIC CAPITAL LETTER IO + 0x0402: 0x0081, # CYRILLIC CAPITAL LETTER DJE + 0x0403: 0x0083, # CYRILLIC CAPITAL LETTER GJE + 0x0404: 0x0087, # CYRILLIC CAPITAL LETTER UKRAINIAN IE + 0x0405: 0x0089, # CYRILLIC CAPITAL LETTER DZE + 0x0406: 0x008b, # CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I + 0x0407: 0x008d, # CYRILLIC CAPITAL LETTER YI + 0x0408: 0x008f, # CYRILLIC CAPITAL LETTER JE + 0x0409: 0x0091, # CYRILLIC CAPITAL LETTER LJE + 0x040a: 0x0093, # CYRILLIC CAPITAL LETTER NJE + 0x040b: 0x0095, # CYRILLIC CAPITAL LETTER TSHE + 0x040c: 0x0097, # CYRILLIC CAPITAL LETTER KJE + 0x040e: 0x0099, # CYRILLIC CAPITAL LETTER SHORT U + 0x040f: 0x009b, # CYRILLIC CAPITAL LETTER DZHE + 0x0410: 0x00a1, # CYRILLIC CAPITAL LETTER A + 0x0411: 0x00a3, # CYRILLIC CAPITAL LETTER BE + 0x0412: 0x00ec, # CYRILLIC CAPITAL LETTER VE + 0x0413: 0x00ad, # CYRILLIC CAPITAL LETTER GHE + 0x0414: 0x00a7, # CYRILLIC CAPITAL LETTER DE + 0x0415: 0x00a9, # CYRILLIC CAPITAL LETTER IE + 0x0416: 0x00ea, # CYRILLIC CAPITAL LETTER ZHE + 0x0417: 0x00f4, # CYRILLIC CAPITAL LETTER ZE + 0x0418: 0x00b8, # CYRILLIC CAPITAL LETTER I + 0x0419: 0x00be, # CYRILLIC CAPITAL LETTER SHORT I + 0x041a: 0x00c7, # CYRILLIC CAPITAL LETTER KA + 0x041b: 0x00d1, # CYRILLIC CAPITAL LETTER EL + 0x041c: 0x00d3, # CYRILLIC CAPITAL LETTER EM + 0x041d: 0x00d5, # CYRILLIC CAPITAL LETTER EN + 0x041e: 0x00d7, # CYRILLIC CAPITAL LETTER O + 0x041f: 0x00dd, # CYRILLIC CAPITAL LETTER PE + 0x0420: 0x00e2, # CYRILLIC CAPITAL LETTER ER + 0x0421: 0x00e4, # CYRILLIC CAPITAL LETTER ES + 0x0422: 0x00e6, # CYRILLIC CAPITAL LETTER TE + 0x0423: 0x00e8, # CYRILLIC CAPITAL LETTER U + 0x0424: 0x00ab, # CYRILLIC CAPITAL LETTER EF + 0x0425: 0x00b6, # CYRILLIC CAPITAL LETTER HA + 0x0426: 0x00a5, # CYRILLIC CAPITAL LETTER TSE + 0x0427: 0x00fc, # CYRILLIC CAPITAL LETTER CHE + 0x0428: 0x00f6, # CYRILLIC CAPITAL LETTER SHA + 0x0429: 0x00fa, # CYRILLIC CAPITAL LETTER SHCHA + 0x042a: 0x009f, # CYRILLIC CAPITAL LETTER HARD SIGN + 0x042b: 0x00f2, # CYRILLIC CAPITAL LETTER YERU + 0x042c: 0x00ee, # CYRILLIC CAPITAL LETTER SOFT SIGN + 0x042d: 0x00f8, # CYRILLIC CAPITAL LETTER E + 0x042e: 0x009d, # CYRILLIC CAPITAL LETTER YU + 0x042f: 0x00e0, # CYRILLIC CAPITAL LETTER YA + 0x0430: 0x00a0, # CYRILLIC SMALL LETTER A + 0x0431: 0x00a2, # CYRILLIC SMALL LETTER BE + 0x0432: 0x00eb, # CYRILLIC SMALL LETTER VE + 0x0433: 0x00ac, # CYRILLIC SMALL LETTER GHE + 0x0434: 0x00a6, # CYRILLIC SMALL LETTER DE + 0x0435: 0x00a8, # CYRILLIC SMALL LETTER IE + 0x0436: 0x00e9, # CYRILLIC SMALL LETTER ZHE + 0x0437: 0x00f3, # CYRILLIC SMALL LETTER ZE + 0x0438: 0x00b7, # CYRILLIC SMALL LETTER I + 0x0439: 0x00bd, # CYRILLIC SMALL LETTER SHORT I + 0x043a: 0x00c6, # CYRILLIC SMALL LETTER KA + 0x043b: 0x00d0, # CYRILLIC SMALL LETTER EL + 0x043c: 0x00d2, # CYRILLIC SMALL LETTER EM + 0x043d: 0x00d4, # CYRILLIC SMALL LETTER EN + 0x043e: 0x00d6, # CYRILLIC SMALL LETTER O + 0x043f: 0x00d8, # CYRILLIC SMALL LETTER PE + 0x0440: 0x00e1, # CYRILLIC SMALL LETTER ER + 0x0441: 0x00e3, # CYRILLIC SMALL LETTER ES + 0x0442: 0x00e5, # CYRILLIC SMALL LETTER TE + 0x0443: 0x00e7, # CYRILLIC SMALL LETTER U + 0x0444: 0x00aa, # CYRILLIC SMALL LETTER EF + 0x0445: 0x00b5, # CYRILLIC SMALL LETTER HA + 0x0446: 0x00a4, # CYRILLIC SMALL LETTER TSE + 0x0447: 0x00fb, # CYRILLIC SMALL LETTER CHE + 0x0448: 0x00f5, # CYRILLIC SMALL LETTER SHA + 0x0449: 0x00f9, # CYRILLIC SMALL LETTER SHCHA + 0x044a: 0x009e, # CYRILLIC SMALL LETTER HARD SIGN + 0x044b: 0x00f1, # CYRILLIC SMALL LETTER YERU + 0x044c: 0x00ed, # CYRILLIC SMALL LETTER SOFT SIGN + 0x044d: 0x00f7, # CYRILLIC SMALL LETTER E + 0x044e: 0x009c, # CYRILLIC SMALL LETTER YU + 0x044f: 0x00de, # CYRILLIC SMALL LETTER YA + 0x0451: 0x0084, # CYRILLIC SMALL LETTER IO + 0x0452: 0x0080, # CYRILLIC SMALL LETTER DJE + 0x0453: 0x0082, # CYRILLIC SMALL LETTER GJE + 0x0454: 0x0086, # CYRILLIC SMALL LETTER UKRAINIAN IE + 0x0455: 0x0088, # CYRILLIC SMALL LETTER DZE + 0x0456: 0x008a, # CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I + 0x0457: 0x008c, # CYRILLIC SMALL LETTER YI + 0x0458: 0x008e, # CYRILLIC SMALL LETTER JE + 0x0459: 0x0090, # CYRILLIC SMALL LETTER LJE + 0x045a: 0x0092, # CYRILLIC SMALL LETTER NJE + 0x045b: 0x0094, # CYRILLIC SMALL LETTER TSHE + 0x045c: 0x0096, # CYRILLIC SMALL LETTER KJE + 0x045e: 0x0098, # CYRILLIC SMALL LETTER SHORT U + 0x045f: 0x009a, # CYRILLIC SMALL LETTER DZHE + 0x2116: 0x00ef, # NUMERO SIGN + 0x2500: 0x00c4, # BOX DRAWINGS LIGHT HORIZONTAL + 0x2502: 0x00b3, # BOX DRAWINGS LIGHT VERTICAL + 0x250c: 0x00da, # BOX DRAWINGS LIGHT DOWN AND RIGHT + 0x2510: 0x00bf, # BOX DRAWINGS LIGHT DOWN AND LEFT + 0x2514: 0x00c0, # BOX DRAWINGS LIGHT UP AND RIGHT + 0x2518: 0x00d9, # BOX DRAWINGS LIGHT UP AND LEFT + 0x251c: 0x00c3, # BOX DRAWINGS LIGHT VERTICAL AND RIGHT + 0x2524: 0x00b4, # BOX DRAWINGS LIGHT VERTICAL AND LEFT + 0x252c: 0x00c2, # BOX DRAWINGS LIGHT DOWN AND HORIZONTAL + 0x2534: 0x00c1, # BOX DRAWINGS LIGHT UP AND HORIZONTAL + 0x253c: 0x00c5, # BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL + 0x2550: 0x00cd, # BOX DRAWINGS DOUBLE HORIZONTAL + 0x2551: 0x00ba, # BOX DRAWINGS DOUBLE VERTICAL + 0x2554: 0x00c9, # BOX DRAWINGS DOUBLE DOWN AND RIGHT + 0x2557: 0x00bb, # BOX DRAWINGS DOUBLE DOWN AND LEFT + 0x255a: 0x00c8, # BOX DRAWINGS DOUBLE UP AND RIGHT + 0x255d: 0x00bc, # BOX DRAWINGS DOUBLE UP AND LEFT + 0x2560: 0x00cc, # BOX DRAWINGS DOUBLE VERTICAL AND RIGHT + 0x2563: 0x00b9, # BOX DRAWINGS DOUBLE VERTICAL AND LEFT + 0x2566: 0x00cb, # BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL + 0x2569: 0x00ca, # BOX DRAWINGS DOUBLE UP AND HORIZONTAL + 0x256c: 0x00ce, # BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL + 0x2580: 0x00df, # UPPER HALF BLOCK + 0x2584: 0x00dc, # LOWER HALF BLOCK + 0x2588: 0x00db, # FULL BLOCK + 0x2591: 0x00b0, # LIGHT SHADE + 0x2592: 0x00b1, # MEDIUM SHADE + 0x2593: 0x00b2, # DARK SHADE + 0x25a0: 0x00fe, # BLACK SQUARE +} diff --git a/env/Lib/encodings/cp856.py b/env/Lib/encodings/cp856.py new file mode 100644 index 0000000..cacbfb2 --- /dev/null +++ b/env/Lib/encodings/cp856.py @@ -0,0 +1,307 @@ +""" Python Character Mapping Codec cp856 generated from 'MAPPINGS/VENDORS/MISC/CP856.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='cp856', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) + + +### Decoding Table + +decoding_table = ( + '\x00' # 0x00 -> NULL + '\x01' # 0x01 -> START OF HEADING + '\x02' # 0x02 -> START OF TEXT + '\x03' # 0x03 -> END OF TEXT + '\x04' # 0x04 -> END OF TRANSMISSION + '\x05' # 0x05 -> ENQUIRY + '\x06' # 0x06 -> ACKNOWLEDGE + '\x07' # 0x07 -> BELL + '\x08' # 0x08 -> BACKSPACE + '\t' # 0x09 -> HORIZONTAL TABULATION + '\n' # 0x0A -> LINE FEED + '\x0b' # 0x0B -> VERTICAL TABULATION + '\x0c' # 0x0C -> FORM FEED + '\r' # 0x0D -> CARRIAGE RETURN + '\x0e' # 0x0E -> SHIFT OUT + '\x0f' # 0x0F -> SHIFT IN + '\x10' # 0x10 -> DATA LINK ESCAPE + '\x11' # 0x11 -> DEVICE CONTROL ONE + '\x12' # 0x12 -> DEVICE CONTROL TWO + '\x13' # 0x13 -> DEVICE CONTROL THREE + '\x14' # 0x14 -> DEVICE CONTROL FOUR + '\x15' # 0x15 -> NEGATIVE ACKNOWLEDGE + '\x16' # 0x16 -> SYNCHRONOUS IDLE + '\x17' # 0x17 -> END OF TRANSMISSION BLOCK + '\x18' # 0x18 -> CANCEL + '\x19' # 0x19 -> END OF MEDIUM + '\x1a' # 0x1A -> SUBSTITUTE + '\x1b' # 0x1B -> ESCAPE + '\x1c' # 0x1C -> FILE SEPARATOR + '\x1d' # 0x1D -> GROUP SEPARATOR + '\x1e' # 0x1E -> RECORD SEPARATOR + '\x1f' # 0x1F -> UNIT SEPARATOR + ' ' # 0x20 -> SPACE + '!' # 0x21 -> EXCLAMATION MARK + '"' # 0x22 -> QUOTATION MARK + '#' # 0x23 -> NUMBER SIGN + '$' # 0x24 -> DOLLAR SIGN + '%' # 0x25 -> PERCENT SIGN + '&' # 0x26 -> AMPERSAND + "'" # 0x27 -> APOSTROPHE + '(' # 0x28 -> LEFT PARENTHESIS + ')' # 0x29 -> RIGHT PARENTHESIS + '*' # 0x2A -> ASTERISK + '+' # 0x2B -> PLUS SIGN + ',' # 0x2C -> COMMA + '-' # 0x2D -> HYPHEN-MINUS + '.' # 0x2E -> FULL STOP + '/' # 0x2F -> SOLIDUS + '0' # 0x30 -> DIGIT ZERO + '1' # 0x31 -> DIGIT ONE + '2' # 0x32 -> DIGIT TWO + '3' # 0x33 -> DIGIT THREE + '4' # 0x34 -> DIGIT FOUR + '5' # 0x35 -> DIGIT FIVE + '6' # 0x36 -> DIGIT SIX + '7' # 0x37 -> DIGIT SEVEN + '8' # 0x38 -> DIGIT EIGHT + '9' # 0x39 -> DIGIT NINE + ':' # 0x3A -> COLON + ';' # 0x3B -> SEMICOLON + '<' # 0x3C -> LESS-THAN SIGN + '=' # 0x3D -> EQUALS SIGN + '>' # 0x3E -> GREATER-THAN SIGN + '?' # 0x3F -> QUESTION MARK + '@' # 0x40 -> COMMERCIAL AT + 'A' # 0x41 -> LATIN CAPITAL LETTER A + 'B' # 0x42 -> LATIN CAPITAL LETTER B + 'C' # 0x43 -> LATIN CAPITAL LETTER C + 'D' # 0x44 -> LATIN CAPITAL LETTER D + 'E' # 0x45 -> LATIN CAPITAL LETTER E + 'F' # 0x46 -> LATIN CAPITAL LETTER F + 'G' # 0x47 -> LATIN CAPITAL LETTER G + 'H' # 0x48 -> LATIN CAPITAL LETTER H + 'I' # 0x49 -> LATIN CAPITAL LETTER I + 'J' # 0x4A -> LATIN CAPITAL LETTER J + 'K' # 0x4B -> LATIN CAPITAL LETTER K + 'L' # 0x4C -> LATIN CAPITAL LETTER L + 'M' # 0x4D -> LATIN CAPITAL LETTER M + 'N' # 0x4E -> LATIN CAPITAL LETTER N + 'O' # 0x4F -> LATIN CAPITAL LETTER O + 'P' # 0x50 -> LATIN CAPITAL LETTER P + 'Q' # 0x51 -> LATIN CAPITAL LETTER Q + 'R' # 0x52 -> LATIN CAPITAL LETTER R + 'S' # 0x53 -> LATIN CAPITAL LETTER S + 'T' # 0x54 -> LATIN CAPITAL LETTER T + 'U' # 0x55 -> LATIN CAPITAL LETTER U + 'V' # 0x56 -> LATIN CAPITAL LETTER V + 'W' # 0x57 -> LATIN CAPITAL LETTER W + 'X' # 0x58 -> LATIN CAPITAL LETTER X + 'Y' # 0x59 -> LATIN CAPITAL LETTER Y + 'Z' # 0x5A -> LATIN CAPITAL LETTER Z + '[' # 0x5B -> LEFT SQUARE BRACKET + '\\' # 0x5C -> REVERSE SOLIDUS + ']' # 0x5D -> RIGHT SQUARE BRACKET + '^' # 0x5E -> CIRCUMFLEX ACCENT + '_' # 0x5F -> LOW LINE + '`' # 0x60 -> GRAVE ACCENT + 'a' # 0x61 -> LATIN SMALL LETTER A + 'b' # 0x62 -> LATIN SMALL LETTER B + 'c' # 0x63 -> LATIN SMALL LETTER C + 'd' # 0x64 -> LATIN SMALL LETTER D + 'e' # 0x65 -> LATIN SMALL LETTER E + 'f' # 0x66 -> LATIN SMALL LETTER F + 'g' # 0x67 -> LATIN SMALL LETTER G + 'h' # 0x68 -> LATIN SMALL LETTER H + 'i' # 0x69 -> LATIN SMALL LETTER I + 'j' # 0x6A -> LATIN SMALL LETTER J + 'k' # 0x6B -> LATIN SMALL LETTER K + 'l' # 0x6C -> LATIN SMALL LETTER L + 'm' # 0x6D -> LATIN SMALL LETTER M + 'n' # 0x6E -> LATIN SMALL LETTER N + 'o' # 0x6F -> LATIN SMALL LETTER O + 'p' # 0x70 -> LATIN SMALL LETTER P + 'q' # 0x71 -> LATIN SMALL LETTER Q + 'r' # 0x72 -> LATIN SMALL LETTER R + 's' # 0x73 -> LATIN SMALL LETTER S + 't' # 0x74 -> LATIN SMALL LETTER T + 'u' # 0x75 -> LATIN SMALL LETTER U + 'v' # 0x76 -> LATIN SMALL LETTER V + 'w' # 0x77 -> LATIN SMALL LETTER W + 'x' # 0x78 -> LATIN SMALL LETTER X + 'y' # 0x79 -> LATIN SMALL LETTER Y + 'z' # 0x7A -> LATIN SMALL LETTER Z + '{' # 0x7B -> LEFT CURLY BRACKET + '|' # 0x7C -> VERTICAL LINE + '}' # 0x7D -> RIGHT CURLY BRACKET + '~' # 0x7E -> TILDE + '\x7f' # 0x7F -> DELETE + '\u05d0' # 0x80 -> HEBREW LETTER ALEF + '\u05d1' # 0x81 -> HEBREW LETTER BET + '\u05d2' # 0x82 -> HEBREW LETTER GIMEL + '\u05d3' # 0x83 -> HEBREW LETTER DALET + '\u05d4' # 0x84 -> HEBREW LETTER HE + '\u05d5' # 0x85 -> HEBREW LETTER VAV + '\u05d6' # 0x86 -> HEBREW LETTER ZAYIN + '\u05d7' # 0x87 -> HEBREW LETTER HET + '\u05d8' # 0x88 -> HEBREW LETTER TET + '\u05d9' # 0x89 -> HEBREW LETTER YOD + '\u05da' # 0x8A -> HEBREW LETTER FINAL KAF + '\u05db' # 0x8B -> HEBREW LETTER KAF + '\u05dc' # 0x8C -> HEBREW LETTER LAMED + '\u05dd' # 0x8D -> HEBREW LETTER FINAL MEM + '\u05de' # 0x8E -> HEBREW LETTER MEM + '\u05df' # 0x8F -> HEBREW LETTER FINAL NUN + '\u05e0' # 0x90 -> HEBREW LETTER NUN + '\u05e1' # 0x91 -> HEBREW LETTER SAMEKH + '\u05e2' # 0x92 -> HEBREW LETTER AYIN + '\u05e3' # 0x93 -> HEBREW LETTER FINAL PE + '\u05e4' # 0x94 -> HEBREW LETTER PE + '\u05e5' # 0x95 -> HEBREW LETTER FINAL TSADI + '\u05e6' # 0x96 -> HEBREW LETTER TSADI + '\u05e7' # 0x97 -> HEBREW LETTER QOF + '\u05e8' # 0x98 -> HEBREW LETTER RESH + '\u05e9' # 0x99 -> HEBREW LETTER SHIN + '\u05ea' # 0x9A -> HEBREW LETTER TAV + '\ufffe' # 0x9B -> UNDEFINED + '\xa3' # 0x9C -> POUND SIGN + '\ufffe' # 0x9D -> UNDEFINED + '\xd7' # 0x9E -> MULTIPLICATION SIGN + '\ufffe' # 0x9F -> UNDEFINED + '\ufffe' # 0xA0 -> UNDEFINED + '\ufffe' # 0xA1 -> UNDEFINED + '\ufffe' # 0xA2 -> UNDEFINED + '\ufffe' # 0xA3 -> UNDEFINED + '\ufffe' # 0xA4 -> UNDEFINED + '\ufffe' # 0xA5 -> UNDEFINED + '\ufffe' # 0xA6 -> UNDEFINED + '\ufffe' # 0xA7 -> UNDEFINED + '\ufffe' # 0xA8 -> UNDEFINED + '\xae' # 0xA9 -> REGISTERED SIGN + '\xac' # 0xAA -> NOT SIGN + '\xbd' # 0xAB -> VULGAR FRACTION ONE HALF + '\xbc' # 0xAC -> VULGAR FRACTION ONE QUARTER + '\ufffe' # 0xAD -> UNDEFINED + '\xab' # 0xAE -> LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + '\xbb' # 0xAF -> RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + '\u2591' # 0xB0 -> LIGHT SHADE + '\u2592' # 0xB1 -> MEDIUM SHADE + '\u2593' # 0xB2 -> DARK SHADE + '\u2502' # 0xB3 -> BOX DRAWINGS LIGHT VERTICAL + '\u2524' # 0xB4 -> BOX DRAWINGS LIGHT VERTICAL AND LEFT + '\ufffe' # 0xB5 -> UNDEFINED + '\ufffe' # 0xB6 -> UNDEFINED + '\ufffe' # 0xB7 -> UNDEFINED + '\xa9' # 0xB8 -> COPYRIGHT SIGN + '\u2563' # 0xB9 -> BOX DRAWINGS DOUBLE VERTICAL AND LEFT + '\u2551' # 0xBA -> BOX DRAWINGS DOUBLE VERTICAL + '\u2557' # 0xBB -> BOX DRAWINGS DOUBLE DOWN AND LEFT + '\u255d' # 0xBC -> BOX DRAWINGS DOUBLE UP AND LEFT + '\xa2' # 0xBD -> CENT SIGN + '\xa5' # 0xBE -> YEN SIGN + '\u2510' # 0xBF -> BOX DRAWINGS LIGHT DOWN AND LEFT + '\u2514' # 0xC0 -> BOX DRAWINGS LIGHT UP AND RIGHT + '\u2534' # 0xC1 -> BOX DRAWINGS LIGHT UP AND HORIZONTAL + '\u252c' # 0xC2 -> BOX DRAWINGS LIGHT DOWN AND HORIZONTAL + '\u251c' # 0xC3 -> BOX DRAWINGS LIGHT VERTICAL AND RIGHT + '\u2500' # 0xC4 -> BOX DRAWINGS LIGHT HORIZONTAL + '\u253c' # 0xC5 -> BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL + '\ufffe' # 0xC6 -> UNDEFINED + '\ufffe' # 0xC7 -> UNDEFINED + '\u255a' # 0xC8 -> BOX DRAWINGS DOUBLE UP AND RIGHT + '\u2554' # 0xC9 -> BOX DRAWINGS DOUBLE DOWN AND RIGHT + '\u2569' # 0xCA -> BOX DRAWINGS DOUBLE UP AND HORIZONTAL + '\u2566' # 0xCB -> BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL + '\u2560' # 0xCC -> BOX DRAWINGS DOUBLE VERTICAL AND RIGHT + '\u2550' # 0xCD -> BOX DRAWINGS DOUBLE HORIZONTAL + '\u256c' # 0xCE -> BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL + '\xa4' # 0xCF -> CURRENCY SIGN + '\ufffe' # 0xD0 -> UNDEFINED + '\ufffe' # 0xD1 -> UNDEFINED + '\ufffe' # 0xD2 -> UNDEFINED + '\ufffe' # 0xD3 -> UNDEFINEDS + '\ufffe' # 0xD4 -> UNDEFINED + '\ufffe' # 0xD5 -> UNDEFINED + '\ufffe' # 0xD6 -> UNDEFINEDE + '\ufffe' # 0xD7 -> UNDEFINED + '\ufffe' # 0xD8 -> UNDEFINED + '\u2518' # 0xD9 -> BOX DRAWINGS LIGHT UP AND LEFT + '\u250c' # 0xDA -> BOX DRAWINGS LIGHT DOWN AND RIGHT + '\u2588' # 0xDB -> FULL BLOCK + '\u2584' # 0xDC -> LOWER HALF BLOCK + '\xa6' # 0xDD -> BROKEN BAR + '\ufffe' # 0xDE -> UNDEFINED + '\u2580' # 0xDF -> UPPER HALF BLOCK + '\ufffe' # 0xE0 -> UNDEFINED + '\ufffe' # 0xE1 -> UNDEFINED + '\ufffe' # 0xE2 -> UNDEFINED + '\ufffe' # 0xE3 -> UNDEFINED + '\ufffe' # 0xE4 -> UNDEFINED + '\ufffe' # 0xE5 -> UNDEFINED + '\xb5' # 0xE6 -> MICRO SIGN + '\ufffe' # 0xE7 -> UNDEFINED + '\ufffe' # 0xE8 -> UNDEFINED + '\ufffe' # 0xE9 -> UNDEFINED + '\ufffe' # 0xEA -> UNDEFINED + '\ufffe' # 0xEB -> UNDEFINED + '\ufffe' # 0xEC -> UNDEFINED + '\ufffe' # 0xED -> UNDEFINED + '\xaf' # 0xEE -> MACRON + '\xb4' # 0xEF -> ACUTE ACCENT + '\xad' # 0xF0 -> SOFT HYPHEN + '\xb1' # 0xF1 -> PLUS-MINUS SIGN + '\u2017' # 0xF2 -> DOUBLE LOW LINE + '\xbe' # 0xF3 -> VULGAR FRACTION THREE QUARTERS + '\xb6' # 0xF4 -> PILCROW SIGN + '\xa7' # 0xF5 -> SECTION SIGN + '\xf7' # 0xF6 -> DIVISION SIGN + '\xb8' # 0xF7 -> CEDILLA + '\xb0' # 0xF8 -> DEGREE SIGN + '\xa8' # 0xF9 -> DIAERESIS + '\xb7' # 0xFA -> MIDDLE DOT + '\xb9' # 0xFB -> SUPERSCRIPT ONE + '\xb3' # 0xFC -> SUPERSCRIPT THREE + '\xb2' # 0xFD -> SUPERSCRIPT TWO + '\u25a0' # 0xFE -> BLACK SQUARE + '\xa0' # 0xFF -> NO-BREAK SPACE +) + +### Encoding table +encoding_table=codecs.charmap_build(decoding_table) diff --git a/env/Lib/encodings/cp857.py b/env/Lib/encodings/cp857.py new file mode 100644 index 0000000..741b059 --- /dev/null +++ b/env/Lib/encodings/cp857.py @@ -0,0 +1,694 @@ +""" Python Character Mapping Codec generated from 'VENDORS/MICSFT/PC/CP857.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_map) + + 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_map)[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='cp857', + 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: 0x00c7, # LATIN CAPITAL LETTER C WITH CEDILLA + 0x0081: 0x00fc, # LATIN SMALL LETTER U WITH DIAERESIS + 0x0082: 0x00e9, # LATIN SMALL LETTER E WITH ACUTE + 0x0083: 0x00e2, # LATIN SMALL LETTER A WITH CIRCUMFLEX + 0x0084: 0x00e4, # LATIN SMALL LETTER A WITH DIAERESIS + 0x0085: 0x00e0, # LATIN SMALL LETTER A WITH GRAVE + 0x0086: 0x00e5, # LATIN SMALL LETTER A WITH RING ABOVE + 0x0087: 0x00e7, # LATIN SMALL LETTER C WITH CEDILLA + 0x0088: 0x00ea, # LATIN SMALL LETTER E WITH CIRCUMFLEX + 0x0089: 0x00eb, # LATIN SMALL LETTER E WITH DIAERESIS + 0x008a: 0x00e8, # LATIN SMALL LETTER E WITH GRAVE + 0x008b: 0x00ef, # LATIN SMALL LETTER I WITH DIAERESIS + 0x008c: 0x00ee, # LATIN SMALL LETTER I WITH CIRCUMFLEX + 0x008d: 0x0131, # LATIN SMALL LETTER DOTLESS I + 0x008e: 0x00c4, # LATIN CAPITAL LETTER A WITH DIAERESIS + 0x008f: 0x00c5, # LATIN CAPITAL LETTER A WITH RING ABOVE + 0x0090: 0x00c9, # LATIN CAPITAL LETTER E WITH ACUTE + 0x0091: 0x00e6, # LATIN SMALL LIGATURE AE + 0x0092: 0x00c6, # LATIN CAPITAL LIGATURE AE + 0x0093: 0x00f4, # LATIN SMALL LETTER O WITH CIRCUMFLEX + 0x0094: 0x00f6, # LATIN SMALL LETTER O WITH DIAERESIS + 0x0095: 0x00f2, # LATIN SMALL LETTER O WITH GRAVE + 0x0096: 0x00fb, # LATIN SMALL LETTER U WITH CIRCUMFLEX + 0x0097: 0x00f9, # LATIN SMALL LETTER U WITH GRAVE + 0x0098: 0x0130, # LATIN CAPITAL LETTER I WITH DOT ABOVE + 0x0099: 0x00d6, # LATIN CAPITAL LETTER O WITH DIAERESIS + 0x009a: 0x00dc, # LATIN CAPITAL LETTER U WITH DIAERESIS + 0x009b: 0x00f8, # LATIN SMALL LETTER O WITH STROKE + 0x009c: 0x00a3, # POUND SIGN + 0x009d: 0x00d8, # LATIN CAPITAL LETTER O WITH STROKE + 0x009e: 0x015e, # LATIN CAPITAL LETTER S WITH CEDILLA + 0x009f: 0x015f, # LATIN SMALL LETTER S WITH CEDILLA + 0x00a0: 0x00e1, # LATIN SMALL LETTER A WITH ACUTE + 0x00a1: 0x00ed, # LATIN SMALL LETTER I WITH ACUTE + 0x00a2: 0x00f3, # LATIN SMALL LETTER O WITH ACUTE + 0x00a3: 0x00fa, # LATIN SMALL LETTER U WITH ACUTE + 0x00a4: 0x00f1, # LATIN SMALL LETTER N WITH TILDE + 0x00a5: 0x00d1, # LATIN CAPITAL LETTER N WITH TILDE + 0x00a6: 0x011e, # LATIN CAPITAL LETTER G WITH BREVE + 0x00a7: 0x011f, # LATIN SMALL LETTER G WITH BREVE + 0x00a8: 0x00bf, # INVERTED QUESTION MARK + 0x00a9: 0x00ae, # REGISTERED SIGN + 0x00aa: 0x00ac, # NOT SIGN + 0x00ab: 0x00bd, # VULGAR FRACTION ONE HALF + 0x00ac: 0x00bc, # VULGAR FRACTION ONE QUARTER + 0x00ad: 0x00a1, # INVERTED EXCLAMATION MARK + 0x00ae: 0x00ab, # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00af: 0x00bb, # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00b0: 0x2591, # LIGHT SHADE + 0x00b1: 0x2592, # MEDIUM SHADE + 0x00b2: 0x2593, # DARK SHADE + 0x00b3: 0x2502, # BOX DRAWINGS LIGHT VERTICAL + 0x00b4: 0x2524, # BOX DRAWINGS LIGHT VERTICAL AND LEFT + 0x00b5: 0x00c1, # LATIN CAPITAL LETTER A WITH ACUTE + 0x00b6: 0x00c2, # LATIN CAPITAL LETTER A WITH CIRCUMFLEX + 0x00b7: 0x00c0, # LATIN CAPITAL LETTER A WITH GRAVE + 0x00b8: 0x00a9, # COPYRIGHT SIGN + 0x00b9: 0x2563, # BOX DRAWINGS DOUBLE VERTICAL AND LEFT + 0x00ba: 0x2551, # BOX DRAWINGS DOUBLE VERTICAL + 0x00bb: 0x2557, # BOX DRAWINGS DOUBLE DOWN AND LEFT + 0x00bc: 0x255d, # BOX DRAWINGS DOUBLE UP AND LEFT + 0x00bd: 0x00a2, # CENT SIGN + 0x00be: 0x00a5, # YEN SIGN + 0x00bf: 0x2510, # BOX DRAWINGS LIGHT DOWN AND LEFT + 0x00c0: 0x2514, # BOX DRAWINGS LIGHT UP AND RIGHT + 0x00c1: 0x2534, # BOX DRAWINGS LIGHT UP AND HORIZONTAL + 0x00c2: 0x252c, # BOX DRAWINGS LIGHT DOWN AND HORIZONTAL + 0x00c3: 0x251c, # BOX DRAWINGS LIGHT VERTICAL AND RIGHT + 0x00c4: 0x2500, # BOX DRAWINGS LIGHT HORIZONTAL + 0x00c5: 0x253c, # BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL + 0x00c6: 0x00e3, # LATIN SMALL LETTER A WITH TILDE + 0x00c7: 0x00c3, # LATIN CAPITAL LETTER A WITH TILDE + 0x00c8: 0x255a, # BOX DRAWINGS DOUBLE UP AND RIGHT + 0x00c9: 0x2554, # BOX DRAWINGS DOUBLE DOWN AND RIGHT + 0x00ca: 0x2569, # BOX DRAWINGS DOUBLE UP AND HORIZONTAL + 0x00cb: 0x2566, # BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL + 0x00cc: 0x2560, # BOX DRAWINGS DOUBLE VERTICAL AND RIGHT + 0x00cd: 0x2550, # BOX DRAWINGS DOUBLE HORIZONTAL + 0x00ce: 0x256c, # BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL + 0x00cf: 0x00a4, # CURRENCY SIGN + 0x00d0: 0x00ba, # MASCULINE ORDINAL INDICATOR + 0x00d1: 0x00aa, # FEMININE ORDINAL INDICATOR + 0x00d2: 0x00ca, # LATIN CAPITAL LETTER E WITH CIRCUMFLEX + 0x00d3: 0x00cb, # LATIN CAPITAL LETTER E WITH DIAERESIS + 0x00d4: 0x00c8, # LATIN CAPITAL LETTER E WITH GRAVE + 0x00d5: None, # UNDEFINED + 0x00d6: 0x00cd, # LATIN CAPITAL LETTER I WITH ACUTE + 0x00d7: 0x00ce, # LATIN CAPITAL LETTER I WITH CIRCUMFLEX + 0x00d8: 0x00cf, # LATIN CAPITAL LETTER I WITH DIAERESIS + 0x00d9: 0x2518, # BOX DRAWINGS LIGHT UP AND LEFT + 0x00da: 0x250c, # BOX DRAWINGS LIGHT DOWN AND RIGHT + 0x00db: 0x2588, # FULL BLOCK + 0x00dc: 0x2584, # LOWER HALF BLOCK + 0x00dd: 0x00a6, # BROKEN BAR + 0x00de: 0x00cc, # LATIN CAPITAL LETTER I WITH GRAVE + 0x00df: 0x2580, # UPPER HALF BLOCK + 0x00e0: 0x00d3, # LATIN CAPITAL LETTER O WITH ACUTE + 0x00e1: 0x00df, # LATIN SMALL LETTER SHARP S + 0x00e2: 0x00d4, # LATIN CAPITAL LETTER O WITH CIRCUMFLEX + 0x00e3: 0x00d2, # LATIN CAPITAL LETTER O WITH GRAVE + 0x00e4: 0x00f5, # LATIN SMALL LETTER O WITH TILDE + 0x00e5: 0x00d5, # LATIN CAPITAL LETTER O WITH TILDE + 0x00e6: 0x00b5, # MICRO SIGN + 0x00e7: None, # UNDEFINED + 0x00e8: 0x00d7, # MULTIPLICATION SIGN + 0x00e9: 0x00da, # LATIN CAPITAL LETTER U WITH ACUTE + 0x00ea: 0x00db, # LATIN CAPITAL LETTER U WITH CIRCUMFLEX + 0x00eb: 0x00d9, # LATIN CAPITAL LETTER U WITH GRAVE + 0x00ed: 0x00ff, # LATIN SMALL LETTER Y WITH DIAERESIS + 0x00ee: 0x00af, # MACRON + 0x00ef: 0x00b4, # ACUTE ACCENT + 0x00f0: 0x00ad, # SOFT HYPHEN + 0x00f1: 0x00b1, # PLUS-MINUS SIGN + 0x00f2: None, # UNDEFINED + 0x00f3: 0x00be, # VULGAR FRACTION THREE QUARTERS + 0x00f4: 0x00b6, # PILCROW SIGN + 0x00f5: 0x00a7, # SECTION SIGN + 0x00f6: 0x00f7, # DIVISION SIGN + 0x00f7: 0x00b8, # CEDILLA + 0x00f8: 0x00b0, # DEGREE SIGN + 0x00f9: 0x00a8, # DIAERESIS + 0x00fa: 0x00b7, # MIDDLE DOT + 0x00fb: 0x00b9, # SUPERSCRIPT ONE + 0x00fc: 0x00b3, # SUPERSCRIPT THREE + 0x00fd: 0x00b2, # SUPERSCRIPT TWO + 0x00fe: 0x25a0, # BLACK SQUARE + 0x00ff: 0x00a0, # NO-BREAK SPACE +}) + +### Decoding Table + +decoding_table = ( + '\x00' # 0x0000 -> NULL + '\x01' # 0x0001 -> START OF HEADING + '\x02' # 0x0002 -> START OF TEXT + '\x03' # 0x0003 -> END OF TEXT + '\x04' # 0x0004 -> END OF TRANSMISSION + '\x05' # 0x0005 -> ENQUIRY + '\x06' # 0x0006 -> ACKNOWLEDGE + '\x07' # 0x0007 -> BELL + '\x08' # 0x0008 -> BACKSPACE + '\t' # 0x0009 -> HORIZONTAL TABULATION + '\n' # 0x000a -> LINE FEED + '\x0b' # 0x000b -> VERTICAL TABULATION + '\x0c' # 0x000c -> FORM FEED + '\r' # 0x000d -> CARRIAGE RETURN + '\x0e' # 0x000e -> SHIFT OUT + '\x0f' # 0x000f -> SHIFT IN + '\x10' # 0x0010 -> DATA LINK ESCAPE + '\x11' # 0x0011 -> DEVICE CONTROL ONE + '\x12' # 0x0012 -> DEVICE CONTROL TWO + '\x13' # 0x0013 -> DEVICE CONTROL THREE + '\x14' # 0x0014 -> DEVICE CONTROL FOUR + '\x15' # 0x0015 -> NEGATIVE ACKNOWLEDGE + '\x16' # 0x0016 -> SYNCHRONOUS IDLE + '\x17' # 0x0017 -> END OF TRANSMISSION BLOCK + '\x18' # 0x0018 -> CANCEL + '\x19' # 0x0019 -> END OF MEDIUM + '\x1a' # 0x001a -> SUBSTITUTE + '\x1b' # 0x001b -> ESCAPE + '\x1c' # 0x001c -> FILE SEPARATOR + '\x1d' # 0x001d -> GROUP SEPARATOR + '\x1e' # 0x001e -> RECORD SEPARATOR + '\x1f' # 0x001f -> UNIT SEPARATOR + ' ' # 0x0020 -> SPACE + '!' # 0x0021 -> EXCLAMATION MARK + '"' # 0x0022 -> QUOTATION MARK + '#' # 0x0023 -> NUMBER SIGN + '$' # 0x0024 -> DOLLAR SIGN + '%' # 0x0025 -> PERCENT SIGN + '&' # 0x0026 -> AMPERSAND + "'" # 0x0027 -> APOSTROPHE + '(' # 0x0028 -> LEFT PARENTHESIS + ')' # 0x0029 -> RIGHT PARENTHESIS + '*' # 0x002a -> ASTERISK + '+' # 0x002b -> PLUS SIGN + ',' # 0x002c -> COMMA + '-' # 0x002d -> HYPHEN-MINUS + '.' # 0x002e -> FULL STOP + '/' # 0x002f -> SOLIDUS + '0' # 0x0030 -> DIGIT ZERO + '1' # 0x0031 -> DIGIT ONE + '2' # 0x0032 -> DIGIT TWO + '3' # 0x0033 -> DIGIT THREE + '4' # 0x0034 -> DIGIT FOUR + '5' # 0x0035 -> DIGIT FIVE + '6' # 0x0036 -> DIGIT SIX + '7' # 0x0037 -> DIGIT SEVEN + '8' # 0x0038 -> DIGIT EIGHT + '9' # 0x0039 -> DIGIT NINE + ':' # 0x003a -> COLON + ';' # 0x003b -> SEMICOLON + '<' # 0x003c -> LESS-THAN SIGN + '=' # 0x003d -> EQUALS SIGN + '>' # 0x003e -> GREATER-THAN SIGN + '?' # 0x003f -> QUESTION MARK + '@' # 0x0040 -> COMMERCIAL AT + 'A' # 0x0041 -> LATIN CAPITAL LETTER A + 'B' # 0x0042 -> LATIN CAPITAL LETTER B + 'C' # 0x0043 -> LATIN CAPITAL LETTER C + 'D' # 0x0044 -> LATIN CAPITAL LETTER D + 'E' # 0x0045 -> LATIN CAPITAL LETTER E + 'F' # 0x0046 -> LATIN CAPITAL LETTER F + 'G' # 0x0047 -> LATIN CAPITAL LETTER G + 'H' # 0x0048 -> LATIN CAPITAL LETTER H + 'I' # 0x0049 -> LATIN CAPITAL LETTER I + 'J' # 0x004a -> LATIN CAPITAL LETTER J + 'K' # 0x004b -> LATIN CAPITAL LETTER K + 'L' # 0x004c -> LATIN CAPITAL LETTER L + 'M' # 0x004d -> LATIN CAPITAL LETTER M + 'N' # 0x004e -> LATIN CAPITAL LETTER N + 'O' # 0x004f -> LATIN CAPITAL LETTER O + 'P' # 0x0050 -> LATIN CAPITAL LETTER P + 'Q' # 0x0051 -> LATIN CAPITAL LETTER Q + 'R' # 0x0052 -> LATIN CAPITAL LETTER R + 'S' # 0x0053 -> LATIN CAPITAL LETTER S + 'T' # 0x0054 -> LATIN CAPITAL LETTER T + 'U' # 0x0055 -> LATIN CAPITAL LETTER U + 'V' # 0x0056 -> LATIN CAPITAL LETTER V + 'W' # 0x0057 -> LATIN CAPITAL LETTER W + 'X' # 0x0058 -> LATIN CAPITAL LETTER X + 'Y' # 0x0059 -> LATIN CAPITAL LETTER Y + 'Z' # 0x005a -> LATIN CAPITAL LETTER Z + '[' # 0x005b -> LEFT SQUARE BRACKET + '\\' # 0x005c -> REVERSE SOLIDUS + ']' # 0x005d -> RIGHT SQUARE BRACKET + '^' # 0x005e -> CIRCUMFLEX ACCENT + '_' # 0x005f -> LOW LINE + '`' # 0x0060 -> GRAVE ACCENT + 'a' # 0x0061 -> LATIN SMALL LETTER A + 'b' # 0x0062 -> LATIN SMALL LETTER B + 'c' # 0x0063 -> LATIN SMALL LETTER C + 'd' # 0x0064 -> LATIN SMALL LETTER D + 'e' # 0x0065 -> LATIN SMALL LETTER E + 'f' # 0x0066 -> LATIN SMALL LETTER F + 'g' # 0x0067 -> LATIN SMALL LETTER G + 'h' # 0x0068 -> LATIN SMALL LETTER H + 'i' # 0x0069 -> LATIN SMALL LETTER I + 'j' # 0x006a -> LATIN SMALL LETTER J + 'k' # 0x006b -> LATIN SMALL LETTER K + 'l' # 0x006c -> LATIN SMALL LETTER L + 'm' # 0x006d -> LATIN SMALL LETTER M + 'n' # 0x006e -> LATIN SMALL LETTER N + 'o' # 0x006f -> LATIN SMALL LETTER O + 'p' # 0x0070 -> LATIN SMALL LETTER P + 'q' # 0x0071 -> LATIN SMALL LETTER Q + 'r' # 0x0072 -> LATIN SMALL LETTER R + 's' # 0x0073 -> LATIN SMALL LETTER S + 't' # 0x0074 -> LATIN SMALL LETTER T + 'u' # 0x0075 -> LATIN SMALL LETTER U + 'v' # 0x0076 -> LATIN SMALL LETTER V + 'w' # 0x0077 -> LATIN SMALL LETTER W + 'x' # 0x0078 -> LATIN SMALL LETTER X + 'y' # 0x0079 -> LATIN SMALL LETTER Y + 'z' # 0x007a -> LATIN SMALL LETTER Z + '{' # 0x007b -> LEFT CURLY BRACKET + '|' # 0x007c -> VERTICAL LINE + '}' # 0x007d -> RIGHT CURLY BRACKET + '~' # 0x007e -> TILDE + '\x7f' # 0x007f -> DELETE + '\xc7' # 0x0080 -> LATIN CAPITAL LETTER C WITH CEDILLA + '\xfc' # 0x0081 -> LATIN SMALL LETTER U WITH DIAERESIS + '\xe9' # 0x0082 -> LATIN SMALL LETTER E WITH ACUTE + '\xe2' # 0x0083 -> LATIN SMALL LETTER A WITH CIRCUMFLEX + '\xe4' # 0x0084 -> LATIN SMALL LETTER A WITH DIAERESIS + '\xe0' # 0x0085 -> LATIN SMALL LETTER A WITH GRAVE + '\xe5' # 0x0086 -> LATIN SMALL LETTER A WITH RING ABOVE + '\xe7' # 0x0087 -> LATIN SMALL LETTER C WITH CEDILLA + '\xea' # 0x0088 -> LATIN SMALL LETTER E WITH CIRCUMFLEX + '\xeb' # 0x0089 -> LATIN SMALL LETTER E WITH DIAERESIS + '\xe8' # 0x008a -> LATIN SMALL LETTER E WITH GRAVE + '\xef' # 0x008b -> LATIN SMALL LETTER I WITH DIAERESIS + '\xee' # 0x008c -> LATIN SMALL LETTER I WITH CIRCUMFLEX + '\u0131' # 0x008d -> LATIN SMALL LETTER DOTLESS I + '\xc4' # 0x008e -> LATIN CAPITAL LETTER A WITH DIAERESIS + '\xc5' # 0x008f -> LATIN CAPITAL LETTER A WITH RING ABOVE + '\xc9' # 0x0090 -> LATIN CAPITAL LETTER E WITH ACUTE + '\xe6' # 0x0091 -> LATIN SMALL LIGATURE AE + '\xc6' # 0x0092 -> LATIN CAPITAL LIGATURE AE + '\xf4' # 0x0093 -> LATIN SMALL LETTER O WITH CIRCUMFLEX + '\xf6' # 0x0094 -> LATIN SMALL LETTER O WITH DIAERESIS + '\xf2' # 0x0095 -> LATIN SMALL LETTER O WITH GRAVE + '\xfb' # 0x0096 -> LATIN SMALL LETTER U WITH CIRCUMFLEX + '\xf9' # 0x0097 -> LATIN SMALL LETTER U WITH GRAVE + '\u0130' # 0x0098 -> LATIN CAPITAL LETTER I WITH DOT ABOVE + '\xd6' # 0x0099 -> LATIN CAPITAL LETTER O WITH DIAERESIS + '\xdc' # 0x009a -> LATIN CAPITAL LETTER U WITH DIAERESIS + '\xf8' # 0x009b -> LATIN SMALL LETTER O WITH STROKE + '\xa3' # 0x009c -> POUND SIGN + '\xd8' # 0x009d -> LATIN CAPITAL LETTER O WITH STROKE + '\u015e' # 0x009e -> LATIN CAPITAL LETTER S WITH CEDILLA + '\u015f' # 0x009f -> LATIN SMALL LETTER S WITH CEDILLA + '\xe1' # 0x00a0 -> LATIN SMALL LETTER A WITH ACUTE + '\xed' # 0x00a1 -> LATIN SMALL LETTER I WITH ACUTE + '\xf3' # 0x00a2 -> LATIN SMALL LETTER O WITH ACUTE + '\xfa' # 0x00a3 -> LATIN SMALL LETTER U WITH ACUTE + '\xf1' # 0x00a4 -> LATIN SMALL LETTER N WITH TILDE + '\xd1' # 0x00a5 -> LATIN CAPITAL LETTER N WITH TILDE + '\u011e' # 0x00a6 -> LATIN CAPITAL LETTER G WITH BREVE + '\u011f' # 0x00a7 -> LATIN SMALL LETTER G WITH BREVE + '\xbf' # 0x00a8 -> INVERTED QUESTION MARK + '\xae' # 0x00a9 -> REGISTERED SIGN + '\xac' # 0x00aa -> NOT SIGN + '\xbd' # 0x00ab -> VULGAR FRACTION ONE HALF + '\xbc' # 0x00ac -> VULGAR FRACTION ONE QUARTER + '\xa1' # 0x00ad -> INVERTED EXCLAMATION MARK + '\xab' # 0x00ae -> LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + '\xbb' # 0x00af -> RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + '\u2591' # 0x00b0 -> LIGHT SHADE + '\u2592' # 0x00b1 -> MEDIUM SHADE + '\u2593' # 0x00b2 -> DARK SHADE + '\u2502' # 0x00b3 -> BOX DRAWINGS LIGHT VERTICAL + '\u2524' # 0x00b4 -> BOX DRAWINGS LIGHT VERTICAL AND LEFT + '\xc1' # 0x00b5 -> LATIN CAPITAL LETTER A WITH ACUTE + '\xc2' # 0x00b6 -> LATIN CAPITAL LETTER A WITH CIRCUMFLEX + '\xc0' # 0x00b7 -> LATIN CAPITAL LETTER A WITH GRAVE + '\xa9' # 0x00b8 -> COPYRIGHT SIGN + '\u2563' # 0x00b9 -> BOX DRAWINGS DOUBLE VERTICAL AND LEFT + '\u2551' # 0x00ba -> BOX DRAWINGS DOUBLE VERTICAL + '\u2557' # 0x00bb -> BOX DRAWINGS DOUBLE DOWN AND LEFT + '\u255d' # 0x00bc -> BOX DRAWINGS DOUBLE UP AND LEFT + '\xa2' # 0x00bd -> CENT SIGN + '\xa5' # 0x00be -> YEN SIGN + '\u2510' # 0x00bf -> BOX DRAWINGS LIGHT DOWN AND LEFT + '\u2514' # 0x00c0 -> BOX DRAWINGS LIGHT UP AND RIGHT + '\u2534' # 0x00c1 -> BOX DRAWINGS LIGHT UP AND HORIZONTAL + '\u252c' # 0x00c2 -> BOX DRAWINGS LIGHT DOWN AND HORIZONTAL + '\u251c' # 0x00c3 -> BOX DRAWINGS LIGHT VERTICAL AND RIGHT + '\u2500' # 0x00c4 -> BOX DRAWINGS LIGHT HORIZONTAL + '\u253c' # 0x00c5 -> BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL + '\xe3' # 0x00c6 -> LATIN SMALL LETTER A WITH TILDE + '\xc3' # 0x00c7 -> LATIN CAPITAL LETTER A WITH TILDE + '\u255a' # 0x00c8 -> BOX DRAWINGS DOUBLE UP AND RIGHT + '\u2554' # 0x00c9 -> BOX DRAWINGS DOUBLE DOWN AND RIGHT + '\u2569' # 0x00ca -> BOX DRAWINGS DOUBLE UP AND HORIZONTAL + '\u2566' # 0x00cb -> BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL + '\u2560' # 0x00cc -> BOX DRAWINGS DOUBLE VERTICAL AND RIGHT + '\u2550' # 0x00cd -> BOX DRAWINGS DOUBLE HORIZONTAL + '\u256c' # 0x00ce -> BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL + '\xa4' # 0x00cf -> CURRENCY SIGN + '\xba' # 0x00d0 -> MASCULINE ORDINAL INDICATOR + '\xaa' # 0x00d1 -> FEMININE ORDINAL INDICATOR + '\xca' # 0x00d2 -> LATIN CAPITAL LETTER E WITH CIRCUMFLEX + '\xcb' # 0x00d3 -> LATIN CAPITAL LETTER E WITH DIAERESIS + '\xc8' # 0x00d4 -> LATIN CAPITAL LETTER E WITH GRAVE + '\ufffe' # 0x00d5 -> UNDEFINED + '\xcd' # 0x00d6 -> LATIN CAPITAL LETTER I WITH ACUTE + '\xce' # 0x00d7 -> LATIN CAPITAL LETTER I WITH CIRCUMFLEX + '\xcf' # 0x00d8 -> LATIN CAPITAL LETTER I WITH DIAERESIS + '\u2518' # 0x00d9 -> BOX DRAWINGS LIGHT UP AND LEFT + '\u250c' # 0x00da -> BOX DRAWINGS LIGHT DOWN AND RIGHT + '\u2588' # 0x00db -> FULL BLOCK + '\u2584' # 0x00dc -> LOWER HALF BLOCK + '\xa6' # 0x00dd -> BROKEN BAR + '\xcc' # 0x00de -> LATIN CAPITAL LETTER I WITH GRAVE + '\u2580' # 0x00df -> UPPER HALF BLOCK + '\xd3' # 0x00e0 -> LATIN CAPITAL LETTER O WITH ACUTE + '\xdf' # 0x00e1 -> LATIN SMALL LETTER SHARP S + '\xd4' # 0x00e2 -> LATIN CAPITAL LETTER O WITH CIRCUMFLEX + '\xd2' # 0x00e3 -> LATIN CAPITAL LETTER O WITH GRAVE + '\xf5' # 0x00e4 -> LATIN SMALL LETTER O WITH TILDE + '\xd5' # 0x00e5 -> LATIN CAPITAL LETTER O WITH TILDE + '\xb5' # 0x00e6 -> MICRO SIGN + '\ufffe' # 0x00e7 -> UNDEFINED + '\xd7' # 0x00e8 -> MULTIPLICATION SIGN + '\xda' # 0x00e9 -> LATIN CAPITAL LETTER U WITH ACUTE + '\xdb' # 0x00ea -> LATIN CAPITAL LETTER U WITH CIRCUMFLEX + '\xd9' # 0x00eb -> LATIN CAPITAL LETTER U WITH GRAVE + '\xec' # 0x00ec -> LATIN SMALL LETTER I WITH GRAVE + '\xff' # 0x00ed -> LATIN SMALL LETTER Y WITH DIAERESIS + '\xaf' # 0x00ee -> MACRON + '\xb4' # 0x00ef -> ACUTE ACCENT + '\xad' # 0x00f0 -> SOFT HYPHEN + '\xb1' # 0x00f1 -> PLUS-MINUS SIGN + '\ufffe' # 0x00f2 -> UNDEFINED + '\xbe' # 0x00f3 -> VULGAR FRACTION THREE QUARTERS + '\xb6' # 0x00f4 -> PILCROW SIGN + '\xa7' # 0x00f5 -> SECTION SIGN + '\xf7' # 0x00f6 -> DIVISION SIGN + '\xb8' # 0x00f7 -> CEDILLA + '\xb0' # 0x00f8 -> DEGREE SIGN + '\xa8' # 0x00f9 -> DIAERESIS + '\xb7' # 0x00fa -> MIDDLE DOT + '\xb9' # 0x00fb -> SUPERSCRIPT ONE + '\xb3' # 0x00fc -> SUPERSCRIPT THREE + '\xb2' # 0x00fd -> SUPERSCRIPT TWO + '\u25a0' # 0x00fe -> BLACK SQUARE + '\xa0' # 0x00ff -> NO-BREAK SPACE +) + +### Encoding Map + +encoding_map = { + 0x0000: 0x0000, # NULL + 0x0001: 0x0001, # START OF HEADING + 0x0002: 0x0002, # START OF TEXT + 0x0003: 0x0003, # END OF TEXT + 0x0004: 0x0004, # END OF TRANSMISSION + 0x0005: 0x0005, # ENQUIRY + 0x0006: 0x0006, # ACKNOWLEDGE + 0x0007: 0x0007, # BELL + 0x0008: 0x0008, # BACKSPACE + 0x0009: 0x0009, # HORIZONTAL TABULATION + 0x000a: 0x000a, # LINE FEED + 0x000b: 0x000b, # VERTICAL TABULATION + 0x000c: 0x000c, # FORM FEED + 0x000d: 0x000d, # CARRIAGE RETURN + 0x000e: 0x000e, # SHIFT OUT + 0x000f: 0x000f, # SHIFT IN + 0x0010: 0x0010, # DATA LINK ESCAPE + 0x0011: 0x0011, # DEVICE CONTROL ONE + 0x0012: 0x0012, # DEVICE CONTROL TWO + 0x0013: 0x0013, # DEVICE CONTROL THREE + 0x0014: 0x0014, # DEVICE CONTROL FOUR + 0x0015: 0x0015, # NEGATIVE ACKNOWLEDGE + 0x0016: 0x0016, # SYNCHRONOUS IDLE + 0x0017: 0x0017, # END OF TRANSMISSION BLOCK + 0x0018: 0x0018, # CANCEL + 0x0019: 0x0019, # END OF MEDIUM + 0x001a: 0x001a, # SUBSTITUTE + 0x001b: 0x001b, # ESCAPE + 0x001c: 0x001c, # FILE SEPARATOR + 0x001d: 0x001d, # GROUP SEPARATOR + 0x001e: 0x001e, # RECORD SEPARATOR + 0x001f: 0x001f, # UNIT SEPARATOR + 0x0020: 0x0020, # SPACE + 0x0021: 0x0021, # EXCLAMATION MARK + 0x0022: 0x0022, # QUOTATION MARK + 0x0023: 0x0023, # NUMBER SIGN + 0x0024: 0x0024, # DOLLAR SIGN + 0x0025: 0x0025, # PERCENT SIGN + 0x0026: 0x0026, # AMPERSAND + 0x0027: 0x0027, # APOSTROPHE + 0x0028: 0x0028, # LEFT PARENTHESIS + 0x0029: 0x0029, # RIGHT PARENTHESIS + 0x002a: 0x002a, # ASTERISK + 0x002b: 0x002b, # PLUS SIGN + 0x002c: 0x002c, # COMMA + 0x002d: 0x002d, # HYPHEN-MINUS + 0x002e: 0x002e, # FULL STOP + 0x002f: 0x002f, # SOLIDUS + 0x0030: 0x0030, # DIGIT ZERO + 0x0031: 0x0031, # DIGIT ONE + 0x0032: 0x0032, # DIGIT TWO + 0x0033: 0x0033, # DIGIT THREE + 0x0034: 0x0034, # DIGIT FOUR + 0x0035: 0x0035, # DIGIT FIVE + 0x0036: 0x0036, # DIGIT SIX + 0x0037: 0x0037, # DIGIT SEVEN + 0x0038: 0x0038, # DIGIT EIGHT + 0x0039: 0x0039, # DIGIT NINE + 0x003a: 0x003a, # COLON + 0x003b: 0x003b, # SEMICOLON + 0x003c: 0x003c, # LESS-THAN SIGN + 0x003d: 0x003d, # EQUALS SIGN + 0x003e: 0x003e, # GREATER-THAN SIGN + 0x003f: 0x003f, # QUESTION MARK + 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 + 0x005c: 0x005c, # REVERSE SOLIDUS + 0x005d: 0x005d, # RIGHT SQUARE BRACKET + 0x005e: 0x005e, # CIRCUMFLEX ACCENT + 0x005f: 0x005f, # LOW LINE + 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 + 0x007c: 0x007c, # VERTICAL LINE + 0x007d: 0x007d, # RIGHT CURLY BRACKET + 0x007e: 0x007e, # TILDE + 0x007f: 0x007f, # DELETE + 0x00a0: 0x00ff, # NO-BREAK SPACE + 0x00a1: 0x00ad, # INVERTED EXCLAMATION MARK + 0x00a2: 0x00bd, # CENT SIGN + 0x00a3: 0x009c, # POUND SIGN + 0x00a4: 0x00cf, # CURRENCY SIGN + 0x00a5: 0x00be, # YEN SIGN + 0x00a6: 0x00dd, # BROKEN BAR + 0x00a7: 0x00f5, # SECTION SIGN + 0x00a8: 0x00f9, # DIAERESIS + 0x00a9: 0x00b8, # COPYRIGHT SIGN + 0x00aa: 0x00d1, # FEMININE ORDINAL INDICATOR + 0x00ab: 0x00ae, # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00ac: 0x00aa, # NOT SIGN + 0x00ad: 0x00f0, # SOFT HYPHEN + 0x00ae: 0x00a9, # REGISTERED SIGN + 0x00af: 0x00ee, # MACRON + 0x00b0: 0x00f8, # DEGREE SIGN + 0x00b1: 0x00f1, # PLUS-MINUS SIGN + 0x00b2: 0x00fd, # SUPERSCRIPT TWO + 0x00b3: 0x00fc, # SUPERSCRIPT THREE + 0x00b4: 0x00ef, # ACUTE ACCENT + 0x00b5: 0x00e6, # MICRO SIGN + 0x00b6: 0x00f4, # PILCROW SIGN + 0x00b7: 0x00fa, # MIDDLE DOT + 0x00b8: 0x00f7, # CEDILLA + 0x00b9: 0x00fb, # SUPERSCRIPT ONE + 0x00ba: 0x00d0, # MASCULINE ORDINAL INDICATOR + 0x00bb: 0x00af, # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00bc: 0x00ac, # VULGAR FRACTION ONE QUARTER + 0x00bd: 0x00ab, # VULGAR FRACTION ONE HALF + 0x00be: 0x00f3, # VULGAR FRACTION THREE QUARTERS + 0x00bf: 0x00a8, # INVERTED QUESTION MARK + 0x00c0: 0x00b7, # LATIN CAPITAL LETTER A WITH GRAVE + 0x00c1: 0x00b5, # LATIN CAPITAL LETTER A WITH ACUTE + 0x00c2: 0x00b6, # LATIN CAPITAL LETTER A WITH CIRCUMFLEX + 0x00c3: 0x00c7, # LATIN CAPITAL LETTER A WITH TILDE + 0x00c4: 0x008e, # LATIN CAPITAL LETTER A WITH DIAERESIS + 0x00c5: 0x008f, # LATIN CAPITAL LETTER A WITH RING ABOVE + 0x00c6: 0x0092, # LATIN CAPITAL LIGATURE AE + 0x00c7: 0x0080, # LATIN CAPITAL LETTER C WITH CEDILLA + 0x00c8: 0x00d4, # LATIN CAPITAL LETTER E WITH GRAVE + 0x00c9: 0x0090, # LATIN CAPITAL LETTER E WITH ACUTE + 0x00ca: 0x00d2, # LATIN CAPITAL LETTER E WITH CIRCUMFLEX + 0x00cb: 0x00d3, # LATIN CAPITAL LETTER E WITH DIAERESIS + 0x00cc: 0x00de, # LATIN CAPITAL LETTER I WITH GRAVE + 0x00cd: 0x00d6, # LATIN CAPITAL LETTER I WITH ACUTE + 0x00ce: 0x00d7, # LATIN CAPITAL LETTER I WITH CIRCUMFLEX + 0x00cf: 0x00d8, # LATIN CAPITAL LETTER I WITH DIAERESIS + 0x00d1: 0x00a5, # LATIN CAPITAL LETTER N WITH TILDE + 0x00d2: 0x00e3, # LATIN CAPITAL LETTER O WITH GRAVE + 0x00d3: 0x00e0, # LATIN CAPITAL LETTER O WITH ACUTE + 0x00d4: 0x00e2, # LATIN CAPITAL LETTER O WITH CIRCUMFLEX + 0x00d5: 0x00e5, # LATIN CAPITAL LETTER O WITH TILDE + 0x00d6: 0x0099, # LATIN CAPITAL LETTER O WITH DIAERESIS + 0x00d7: 0x00e8, # MULTIPLICATION SIGN + 0x00d8: 0x009d, # LATIN CAPITAL LETTER O WITH STROKE + 0x00d9: 0x00eb, # LATIN CAPITAL LETTER U WITH GRAVE + 0x00da: 0x00e9, # LATIN CAPITAL LETTER U WITH ACUTE + 0x00db: 0x00ea, # LATIN CAPITAL LETTER U WITH CIRCUMFLEX + 0x00dc: 0x009a, # LATIN CAPITAL LETTER U WITH DIAERESIS + 0x00df: 0x00e1, # LATIN SMALL LETTER SHARP S + 0x00e0: 0x0085, # LATIN SMALL LETTER A WITH GRAVE + 0x00e1: 0x00a0, # LATIN SMALL LETTER A WITH ACUTE + 0x00e2: 0x0083, # LATIN SMALL LETTER A WITH CIRCUMFLEX + 0x00e3: 0x00c6, # LATIN SMALL LETTER A WITH TILDE + 0x00e4: 0x0084, # LATIN SMALL LETTER A WITH DIAERESIS + 0x00e5: 0x0086, # LATIN SMALL LETTER A WITH RING ABOVE + 0x00e6: 0x0091, # LATIN SMALL LIGATURE AE + 0x00e7: 0x0087, # LATIN SMALL LETTER C WITH CEDILLA + 0x00e8: 0x008a, # LATIN SMALL LETTER E WITH GRAVE + 0x00e9: 0x0082, # LATIN SMALL LETTER E WITH ACUTE + 0x00ea: 0x0088, # LATIN SMALL LETTER E WITH CIRCUMFLEX + 0x00eb: 0x0089, # LATIN SMALL LETTER E WITH DIAERESIS + 0x00ec: 0x00ec, # LATIN SMALL LETTER I WITH GRAVE + 0x00ed: 0x00a1, # LATIN SMALL LETTER I WITH ACUTE + 0x00ee: 0x008c, # LATIN SMALL LETTER I WITH CIRCUMFLEX + 0x00ef: 0x008b, # LATIN SMALL LETTER I WITH DIAERESIS + 0x00f1: 0x00a4, # LATIN SMALL LETTER N WITH TILDE + 0x00f2: 0x0095, # LATIN SMALL LETTER O WITH GRAVE + 0x00f3: 0x00a2, # LATIN SMALL LETTER O WITH ACUTE + 0x00f4: 0x0093, # LATIN SMALL LETTER O WITH CIRCUMFLEX + 0x00f5: 0x00e4, # LATIN SMALL LETTER O WITH TILDE + 0x00f6: 0x0094, # LATIN SMALL LETTER O WITH DIAERESIS + 0x00f7: 0x00f6, # DIVISION SIGN + 0x00f8: 0x009b, # LATIN SMALL LETTER O WITH STROKE + 0x00f9: 0x0097, # LATIN SMALL LETTER U WITH GRAVE + 0x00fa: 0x00a3, # LATIN SMALL LETTER U WITH ACUTE + 0x00fb: 0x0096, # LATIN SMALL LETTER U WITH CIRCUMFLEX + 0x00fc: 0x0081, # LATIN SMALL LETTER U WITH DIAERESIS + 0x00ff: 0x00ed, # LATIN SMALL LETTER Y WITH DIAERESIS + 0x011e: 0x00a6, # LATIN CAPITAL LETTER G WITH BREVE + 0x011f: 0x00a7, # LATIN SMALL LETTER G WITH BREVE + 0x0130: 0x0098, # LATIN CAPITAL LETTER I WITH DOT ABOVE + 0x0131: 0x008d, # LATIN SMALL LETTER DOTLESS I + 0x015e: 0x009e, # LATIN CAPITAL LETTER S WITH CEDILLA + 0x015f: 0x009f, # LATIN SMALL LETTER S WITH CEDILLA + 0x2500: 0x00c4, # BOX DRAWINGS LIGHT HORIZONTAL + 0x2502: 0x00b3, # BOX DRAWINGS LIGHT VERTICAL + 0x250c: 0x00da, # BOX DRAWINGS LIGHT DOWN AND RIGHT + 0x2510: 0x00bf, # BOX DRAWINGS LIGHT DOWN AND LEFT + 0x2514: 0x00c0, # BOX DRAWINGS LIGHT UP AND RIGHT + 0x2518: 0x00d9, # BOX DRAWINGS LIGHT UP AND LEFT + 0x251c: 0x00c3, # BOX DRAWINGS LIGHT VERTICAL AND RIGHT + 0x2524: 0x00b4, # BOX DRAWINGS LIGHT VERTICAL AND LEFT + 0x252c: 0x00c2, # BOX DRAWINGS LIGHT DOWN AND HORIZONTAL + 0x2534: 0x00c1, # BOX DRAWINGS LIGHT UP AND HORIZONTAL + 0x253c: 0x00c5, # BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL + 0x2550: 0x00cd, # BOX DRAWINGS DOUBLE HORIZONTAL + 0x2551: 0x00ba, # BOX DRAWINGS DOUBLE VERTICAL + 0x2554: 0x00c9, # BOX DRAWINGS DOUBLE DOWN AND RIGHT + 0x2557: 0x00bb, # BOX DRAWINGS DOUBLE DOWN AND LEFT + 0x255a: 0x00c8, # BOX DRAWINGS DOUBLE UP AND RIGHT + 0x255d: 0x00bc, # BOX DRAWINGS DOUBLE UP AND LEFT + 0x2560: 0x00cc, # BOX DRAWINGS DOUBLE VERTICAL AND RIGHT + 0x2563: 0x00b9, # BOX DRAWINGS DOUBLE VERTICAL AND LEFT + 0x2566: 0x00cb, # BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL + 0x2569: 0x00ca, # BOX DRAWINGS DOUBLE UP AND HORIZONTAL + 0x256c: 0x00ce, # BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL + 0x2580: 0x00df, # UPPER HALF BLOCK + 0x2584: 0x00dc, # LOWER HALF BLOCK + 0x2588: 0x00db, # FULL BLOCK + 0x2591: 0x00b0, # LIGHT SHADE + 0x2592: 0x00b1, # MEDIUM SHADE + 0x2593: 0x00b2, # DARK SHADE + 0x25a0: 0x00fe, # BLACK SQUARE +} diff --git a/env/Lib/encodings/cp858.py b/env/Lib/encodings/cp858.py new file mode 100644 index 0000000..7579f52 --- /dev/null +++ b/env/Lib/encodings/cp858.py @@ -0,0 +1,698 @@ +""" Python Character Mapping Codec for CP858, modified from cp850. + +""" + +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_table) + +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_table)[0] + +class StreamWriter(Codec,codecs.StreamWriter): + pass + +class StreamReader(Codec,codecs.StreamReader): + pass + +### encodings module API + +def getregentry(): + return codecs.CodecInfo( + name='cp858', + 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: 0x00c7, # LATIN CAPITAL LETTER C WITH CEDILLA + 0x0081: 0x00fc, # LATIN SMALL LETTER U WITH DIAERESIS + 0x0082: 0x00e9, # LATIN SMALL LETTER E WITH ACUTE + 0x0083: 0x00e2, # LATIN SMALL LETTER A WITH CIRCUMFLEX + 0x0084: 0x00e4, # LATIN SMALL LETTER A WITH DIAERESIS + 0x0085: 0x00e0, # LATIN SMALL LETTER A WITH GRAVE + 0x0086: 0x00e5, # LATIN SMALL LETTER A WITH RING ABOVE + 0x0087: 0x00e7, # LATIN SMALL LETTER C WITH CEDILLA + 0x0088: 0x00ea, # LATIN SMALL LETTER E WITH CIRCUMFLEX + 0x0089: 0x00eb, # LATIN SMALL LETTER E WITH DIAERESIS + 0x008a: 0x00e8, # LATIN SMALL LETTER E WITH GRAVE + 0x008b: 0x00ef, # LATIN SMALL LETTER I WITH DIAERESIS + 0x008c: 0x00ee, # LATIN SMALL LETTER I WITH CIRCUMFLEX + 0x008d: 0x00ec, # LATIN SMALL LETTER I WITH GRAVE + 0x008e: 0x00c4, # LATIN CAPITAL LETTER A WITH DIAERESIS + 0x008f: 0x00c5, # LATIN CAPITAL LETTER A WITH RING ABOVE + 0x0090: 0x00c9, # LATIN CAPITAL LETTER E WITH ACUTE + 0x0091: 0x00e6, # LATIN SMALL LIGATURE AE + 0x0092: 0x00c6, # LATIN CAPITAL LIGATURE AE + 0x0093: 0x00f4, # LATIN SMALL LETTER O WITH CIRCUMFLEX + 0x0094: 0x00f6, # LATIN SMALL LETTER O WITH DIAERESIS + 0x0095: 0x00f2, # LATIN SMALL LETTER O WITH GRAVE + 0x0096: 0x00fb, # LATIN SMALL LETTER U WITH CIRCUMFLEX + 0x0097: 0x00f9, # LATIN SMALL LETTER U WITH GRAVE + 0x0098: 0x00ff, # LATIN SMALL LETTER Y WITH DIAERESIS + 0x0099: 0x00d6, # LATIN CAPITAL LETTER O WITH DIAERESIS + 0x009a: 0x00dc, # LATIN CAPITAL LETTER U WITH DIAERESIS + 0x009b: 0x00f8, # LATIN SMALL LETTER O WITH STROKE + 0x009c: 0x00a3, # POUND SIGN + 0x009d: 0x00d8, # LATIN CAPITAL LETTER O WITH STROKE + 0x009e: 0x00d7, # MULTIPLICATION SIGN + 0x009f: 0x0192, # LATIN SMALL LETTER F WITH HOOK + 0x00a0: 0x00e1, # LATIN SMALL LETTER A WITH ACUTE + 0x00a1: 0x00ed, # LATIN SMALL LETTER I WITH ACUTE + 0x00a2: 0x00f3, # LATIN SMALL LETTER O WITH ACUTE + 0x00a3: 0x00fa, # LATIN SMALL LETTER U WITH ACUTE + 0x00a4: 0x00f1, # LATIN SMALL LETTER N WITH TILDE + 0x00a5: 0x00d1, # LATIN CAPITAL LETTER N WITH TILDE + 0x00a6: 0x00aa, # FEMININE ORDINAL INDICATOR + 0x00a7: 0x00ba, # MASCULINE ORDINAL INDICATOR + 0x00a8: 0x00bf, # INVERTED QUESTION MARK + 0x00a9: 0x00ae, # REGISTERED SIGN + 0x00aa: 0x00ac, # NOT SIGN + 0x00ab: 0x00bd, # VULGAR FRACTION ONE HALF + 0x00ac: 0x00bc, # VULGAR FRACTION ONE QUARTER + 0x00ad: 0x00a1, # INVERTED EXCLAMATION MARK + 0x00ae: 0x00ab, # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00af: 0x00bb, # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00b0: 0x2591, # LIGHT SHADE + 0x00b1: 0x2592, # MEDIUM SHADE + 0x00b2: 0x2593, # DARK SHADE + 0x00b3: 0x2502, # BOX DRAWINGS LIGHT VERTICAL + 0x00b4: 0x2524, # BOX DRAWINGS LIGHT VERTICAL AND LEFT + 0x00b5: 0x00c1, # LATIN CAPITAL LETTER A WITH ACUTE + 0x00b6: 0x00c2, # LATIN CAPITAL LETTER A WITH CIRCUMFLEX + 0x00b7: 0x00c0, # LATIN CAPITAL LETTER A WITH GRAVE + 0x00b8: 0x00a9, # COPYRIGHT SIGN + 0x00b9: 0x2563, # BOX DRAWINGS DOUBLE VERTICAL AND LEFT + 0x00ba: 0x2551, # BOX DRAWINGS DOUBLE VERTICAL + 0x00bb: 0x2557, # BOX DRAWINGS DOUBLE DOWN AND LEFT + 0x00bc: 0x255d, # BOX DRAWINGS DOUBLE UP AND LEFT + 0x00bd: 0x00a2, # CENT SIGN + 0x00be: 0x00a5, # YEN SIGN + 0x00bf: 0x2510, # BOX DRAWINGS LIGHT DOWN AND LEFT + 0x00c0: 0x2514, # BOX DRAWINGS LIGHT UP AND RIGHT + 0x00c1: 0x2534, # BOX DRAWINGS LIGHT UP AND HORIZONTAL + 0x00c2: 0x252c, # BOX DRAWINGS LIGHT DOWN AND HORIZONTAL + 0x00c3: 0x251c, # BOX DRAWINGS LIGHT VERTICAL AND RIGHT + 0x00c4: 0x2500, # BOX DRAWINGS LIGHT HORIZONTAL + 0x00c5: 0x253c, # BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL + 0x00c6: 0x00e3, # LATIN SMALL LETTER A WITH TILDE + 0x00c7: 0x00c3, # LATIN CAPITAL LETTER A WITH TILDE + 0x00c8: 0x255a, # BOX DRAWINGS DOUBLE UP AND RIGHT + 0x00c9: 0x2554, # BOX DRAWINGS DOUBLE DOWN AND RIGHT + 0x00ca: 0x2569, # BOX DRAWINGS DOUBLE UP AND HORIZONTAL + 0x00cb: 0x2566, # BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL + 0x00cc: 0x2560, # BOX DRAWINGS DOUBLE VERTICAL AND RIGHT + 0x00cd: 0x2550, # BOX DRAWINGS DOUBLE HORIZONTAL + 0x00ce: 0x256c, # BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL + 0x00cf: 0x00a4, # CURRENCY SIGN + 0x00d0: 0x00f0, # LATIN SMALL LETTER ETH + 0x00d1: 0x00d0, # LATIN CAPITAL LETTER ETH + 0x00d2: 0x00ca, # LATIN CAPITAL LETTER E WITH CIRCUMFLEX + 0x00d3: 0x00cb, # LATIN CAPITAL LETTER E WITH DIAERESIS + 0x00d4: 0x00c8, # LATIN CAPITAL LETTER E WITH GRAVE + 0x00d5: 0x20ac, # EURO SIGN + 0x00d6: 0x00cd, # LATIN CAPITAL LETTER I WITH ACUTE + 0x00d7: 0x00ce, # LATIN CAPITAL LETTER I WITH CIRCUMFLEX + 0x00d8: 0x00cf, # LATIN CAPITAL LETTER I WITH DIAERESIS + 0x00d9: 0x2518, # BOX DRAWINGS LIGHT UP AND LEFT + 0x00da: 0x250c, # BOX DRAWINGS LIGHT DOWN AND RIGHT + 0x00db: 0x2588, # FULL BLOCK + 0x00dc: 0x2584, # LOWER HALF BLOCK + 0x00dd: 0x00a6, # BROKEN BAR + 0x00de: 0x00cc, # LATIN CAPITAL LETTER I WITH GRAVE + 0x00df: 0x2580, # UPPER HALF BLOCK + 0x00e0: 0x00d3, # LATIN CAPITAL LETTER O WITH ACUTE + 0x00e1: 0x00df, # LATIN SMALL LETTER SHARP S + 0x00e2: 0x00d4, # LATIN CAPITAL LETTER O WITH CIRCUMFLEX + 0x00e3: 0x00d2, # LATIN CAPITAL LETTER O WITH GRAVE + 0x00e4: 0x00f5, # LATIN SMALL LETTER O WITH TILDE + 0x00e5: 0x00d5, # LATIN CAPITAL LETTER O WITH TILDE + 0x00e6: 0x00b5, # MICRO SIGN + 0x00e7: 0x00fe, # LATIN SMALL LETTER THORN + 0x00e8: 0x00de, # LATIN CAPITAL LETTER THORN + 0x00e9: 0x00da, # LATIN CAPITAL LETTER U WITH ACUTE + 0x00ea: 0x00db, # LATIN CAPITAL LETTER U WITH CIRCUMFLEX + 0x00eb: 0x00d9, # LATIN CAPITAL LETTER U WITH GRAVE + 0x00ec: 0x00fd, # LATIN SMALL LETTER Y WITH ACUTE + 0x00ed: 0x00dd, # LATIN CAPITAL LETTER Y WITH ACUTE + 0x00ee: 0x00af, # MACRON + 0x00ef: 0x00b4, # ACUTE ACCENT + 0x00f0: 0x00ad, # SOFT HYPHEN + 0x00f1: 0x00b1, # PLUS-MINUS SIGN + 0x00f2: 0x2017, # DOUBLE LOW LINE + 0x00f3: 0x00be, # VULGAR FRACTION THREE QUARTERS + 0x00f4: 0x00b6, # PILCROW SIGN + 0x00f5: 0x00a7, # SECTION SIGN + 0x00f6: 0x00f7, # DIVISION SIGN + 0x00f7: 0x00b8, # CEDILLA + 0x00f8: 0x00b0, # DEGREE SIGN + 0x00f9: 0x00a8, # DIAERESIS + 0x00fa: 0x00b7, # MIDDLE DOT + 0x00fb: 0x00b9, # SUPERSCRIPT ONE + 0x00fc: 0x00b3, # SUPERSCRIPT THREE + 0x00fd: 0x00b2, # SUPERSCRIPT TWO + 0x00fe: 0x25a0, # BLACK SQUARE + 0x00ff: 0x00a0, # NO-BREAK SPACE +}) + +### Decoding Table + +decoding_table = ( + '\x00' # 0x0000 -> NULL + '\x01' # 0x0001 -> START OF HEADING + '\x02' # 0x0002 -> START OF TEXT + '\x03' # 0x0003 -> END OF TEXT + '\x04' # 0x0004 -> END OF TRANSMISSION + '\x05' # 0x0005 -> ENQUIRY + '\x06' # 0x0006 -> ACKNOWLEDGE + '\x07' # 0x0007 -> BELL + '\x08' # 0x0008 -> BACKSPACE + '\t' # 0x0009 -> HORIZONTAL TABULATION + '\n' # 0x000a -> LINE FEED + '\x0b' # 0x000b -> VERTICAL TABULATION + '\x0c' # 0x000c -> FORM FEED + '\r' # 0x000d -> CARRIAGE RETURN + '\x0e' # 0x000e -> SHIFT OUT + '\x0f' # 0x000f -> SHIFT IN + '\x10' # 0x0010 -> DATA LINK ESCAPE + '\x11' # 0x0011 -> DEVICE CONTROL ONE + '\x12' # 0x0012 -> DEVICE CONTROL TWO + '\x13' # 0x0013 -> DEVICE CONTROL THREE + '\x14' # 0x0014 -> DEVICE CONTROL FOUR + '\x15' # 0x0015 -> NEGATIVE ACKNOWLEDGE + '\x16' # 0x0016 -> SYNCHRONOUS IDLE + '\x17' # 0x0017 -> END OF TRANSMISSION BLOCK + '\x18' # 0x0018 -> CANCEL + '\x19' # 0x0019 -> END OF MEDIUM + '\x1a' # 0x001a -> SUBSTITUTE + '\x1b' # 0x001b -> ESCAPE + '\x1c' # 0x001c -> FILE SEPARATOR + '\x1d' # 0x001d -> GROUP SEPARATOR + '\x1e' # 0x001e -> RECORD SEPARATOR + '\x1f' # 0x001f -> UNIT SEPARATOR + ' ' # 0x0020 -> SPACE + '!' # 0x0021 -> EXCLAMATION MARK + '"' # 0x0022 -> QUOTATION MARK + '#' # 0x0023 -> NUMBER SIGN + '$' # 0x0024 -> DOLLAR SIGN + '%' # 0x0025 -> PERCENT SIGN + '&' # 0x0026 -> AMPERSAND + "'" # 0x0027 -> APOSTROPHE + '(' # 0x0028 -> LEFT PARENTHESIS + ')' # 0x0029 -> RIGHT PARENTHESIS + '*' # 0x002a -> ASTERISK + '+' # 0x002b -> PLUS SIGN + ',' # 0x002c -> COMMA + '-' # 0x002d -> HYPHEN-MINUS + '.' # 0x002e -> FULL STOP + '/' # 0x002f -> SOLIDUS + '0' # 0x0030 -> DIGIT ZERO + '1' # 0x0031 -> DIGIT ONE + '2' # 0x0032 -> DIGIT TWO + '3' # 0x0033 -> DIGIT THREE + '4' # 0x0034 -> DIGIT FOUR + '5' # 0x0035 -> DIGIT FIVE + '6' # 0x0036 -> DIGIT SIX + '7' # 0x0037 -> DIGIT SEVEN + '8' # 0x0038 -> DIGIT EIGHT + '9' # 0x0039 -> DIGIT NINE + ':' # 0x003a -> COLON + ';' # 0x003b -> SEMICOLON + '<' # 0x003c -> LESS-THAN SIGN + '=' # 0x003d -> EQUALS SIGN + '>' # 0x003e -> GREATER-THAN SIGN + '?' # 0x003f -> QUESTION MARK + '@' # 0x0040 -> COMMERCIAL AT + 'A' # 0x0041 -> LATIN CAPITAL LETTER A + 'B' # 0x0042 -> LATIN CAPITAL LETTER B + 'C' # 0x0043 -> LATIN CAPITAL LETTER C + 'D' # 0x0044 -> LATIN CAPITAL LETTER D + 'E' # 0x0045 -> LATIN CAPITAL LETTER E + 'F' # 0x0046 -> LATIN CAPITAL LETTER F + 'G' # 0x0047 -> LATIN CAPITAL LETTER G + 'H' # 0x0048 -> LATIN CAPITAL LETTER H + 'I' # 0x0049 -> LATIN CAPITAL LETTER I + 'J' # 0x004a -> LATIN CAPITAL LETTER J + 'K' # 0x004b -> LATIN CAPITAL LETTER K + 'L' # 0x004c -> LATIN CAPITAL LETTER L + 'M' # 0x004d -> LATIN CAPITAL LETTER M + 'N' # 0x004e -> LATIN CAPITAL LETTER N + 'O' # 0x004f -> LATIN CAPITAL LETTER O + 'P' # 0x0050 -> LATIN CAPITAL LETTER P + 'Q' # 0x0051 -> LATIN CAPITAL LETTER Q + 'R' # 0x0052 -> LATIN CAPITAL LETTER R + 'S' # 0x0053 -> LATIN CAPITAL LETTER S + 'T' # 0x0054 -> LATIN CAPITAL LETTER T + 'U' # 0x0055 -> LATIN CAPITAL LETTER U + 'V' # 0x0056 -> LATIN CAPITAL LETTER V + 'W' # 0x0057 -> LATIN CAPITAL LETTER W + 'X' # 0x0058 -> LATIN CAPITAL LETTER X + 'Y' # 0x0059 -> LATIN CAPITAL LETTER Y + 'Z' # 0x005a -> LATIN CAPITAL LETTER Z + '[' # 0x005b -> LEFT SQUARE BRACKET + '\\' # 0x005c -> REVERSE SOLIDUS + ']' # 0x005d -> RIGHT SQUARE BRACKET + '^' # 0x005e -> CIRCUMFLEX ACCENT + '_' # 0x005f -> LOW LINE + '`' # 0x0060 -> GRAVE ACCENT + 'a' # 0x0061 -> LATIN SMALL LETTER A + 'b' # 0x0062 -> LATIN SMALL LETTER B + 'c' # 0x0063 -> LATIN SMALL LETTER C + 'd' # 0x0064 -> LATIN SMALL LETTER D + 'e' # 0x0065 -> LATIN SMALL LETTER E + 'f' # 0x0066 -> LATIN SMALL LETTER F + 'g' # 0x0067 -> LATIN SMALL LETTER G + 'h' # 0x0068 -> LATIN SMALL LETTER H + 'i' # 0x0069 -> LATIN SMALL LETTER I + 'j' # 0x006a -> LATIN SMALL LETTER J + 'k' # 0x006b -> LATIN SMALL LETTER K + 'l' # 0x006c -> LATIN SMALL LETTER L + 'm' # 0x006d -> LATIN SMALL LETTER M + 'n' # 0x006e -> LATIN SMALL LETTER N + 'o' # 0x006f -> LATIN SMALL LETTER O + 'p' # 0x0070 -> LATIN SMALL LETTER P + 'q' # 0x0071 -> LATIN SMALL LETTER Q + 'r' # 0x0072 -> LATIN SMALL LETTER R + 's' # 0x0073 -> LATIN SMALL LETTER S + 't' # 0x0074 -> LATIN SMALL LETTER T + 'u' # 0x0075 -> LATIN SMALL LETTER U + 'v' # 0x0076 -> LATIN SMALL LETTER V + 'w' # 0x0077 -> LATIN SMALL LETTER W + 'x' # 0x0078 -> LATIN SMALL LETTER X + 'y' # 0x0079 -> LATIN SMALL LETTER Y + 'z' # 0x007a -> LATIN SMALL LETTER Z + '{' # 0x007b -> LEFT CURLY BRACKET + '|' # 0x007c -> VERTICAL LINE + '}' # 0x007d -> RIGHT CURLY BRACKET + '~' # 0x007e -> TILDE + '\x7f' # 0x007f -> DELETE + '\xc7' # 0x0080 -> LATIN CAPITAL LETTER C WITH CEDILLA + '\xfc' # 0x0081 -> LATIN SMALL LETTER U WITH DIAERESIS + '\xe9' # 0x0082 -> LATIN SMALL LETTER E WITH ACUTE + '\xe2' # 0x0083 -> LATIN SMALL LETTER A WITH CIRCUMFLEX + '\xe4' # 0x0084 -> LATIN SMALL LETTER A WITH DIAERESIS + '\xe0' # 0x0085 -> LATIN SMALL LETTER A WITH GRAVE + '\xe5' # 0x0086 -> LATIN SMALL LETTER A WITH RING ABOVE + '\xe7' # 0x0087 -> LATIN SMALL LETTER C WITH CEDILLA + '\xea' # 0x0088 -> LATIN SMALL LETTER E WITH CIRCUMFLEX + '\xeb' # 0x0089 -> LATIN SMALL LETTER E WITH DIAERESIS + '\xe8' # 0x008a -> LATIN SMALL LETTER E WITH GRAVE + '\xef' # 0x008b -> LATIN SMALL LETTER I WITH DIAERESIS + '\xee' # 0x008c -> LATIN SMALL LETTER I WITH CIRCUMFLEX + '\xec' # 0x008d -> LATIN SMALL LETTER I WITH GRAVE + '\xc4' # 0x008e -> LATIN CAPITAL LETTER A WITH DIAERESIS + '\xc5' # 0x008f -> LATIN CAPITAL LETTER A WITH RING ABOVE + '\xc9' # 0x0090 -> LATIN CAPITAL LETTER E WITH ACUTE + '\xe6' # 0x0091 -> LATIN SMALL LIGATURE AE + '\xc6' # 0x0092 -> LATIN CAPITAL LIGATURE AE + '\xf4' # 0x0093 -> LATIN SMALL LETTER O WITH CIRCUMFLEX + '\xf6' # 0x0094 -> LATIN SMALL LETTER O WITH DIAERESIS + '\xf2' # 0x0095 -> LATIN SMALL LETTER O WITH GRAVE + '\xfb' # 0x0096 -> LATIN SMALL LETTER U WITH CIRCUMFLEX + '\xf9' # 0x0097 -> LATIN SMALL LETTER U WITH GRAVE + '\xff' # 0x0098 -> LATIN SMALL LETTER Y WITH DIAERESIS + '\xd6' # 0x0099 -> LATIN CAPITAL LETTER O WITH DIAERESIS + '\xdc' # 0x009a -> LATIN CAPITAL LETTER U WITH DIAERESIS + '\xf8' # 0x009b -> LATIN SMALL LETTER O WITH STROKE + '\xa3' # 0x009c -> POUND SIGN + '\xd8' # 0x009d -> LATIN CAPITAL LETTER O WITH STROKE + '\xd7' # 0x009e -> MULTIPLICATION SIGN + '\u0192' # 0x009f -> LATIN SMALL LETTER F WITH HOOK + '\xe1' # 0x00a0 -> LATIN SMALL LETTER A WITH ACUTE + '\xed' # 0x00a1 -> LATIN SMALL LETTER I WITH ACUTE + '\xf3' # 0x00a2 -> LATIN SMALL LETTER O WITH ACUTE + '\xfa' # 0x00a3 -> LATIN SMALL LETTER U WITH ACUTE + '\xf1' # 0x00a4 -> LATIN SMALL LETTER N WITH TILDE + '\xd1' # 0x00a5 -> LATIN CAPITAL LETTER N WITH TILDE + '\xaa' # 0x00a6 -> FEMININE ORDINAL INDICATOR + '\xba' # 0x00a7 -> MASCULINE ORDINAL INDICATOR + '\xbf' # 0x00a8 -> INVERTED QUESTION MARK + '\xae' # 0x00a9 -> REGISTERED SIGN + '\xac' # 0x00aa -> NOT SIGN + '\xbd' # 0x00ab -> VULGAR FRACTION ONE HALF + '\xbc' # 0x00ac -> VULGAR FRACTION ONE QUARTER + '\xa1' # 0x00ad -> INVERTED EXCLAMATION MARK + '\xab' # 0x00ae -> LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + '\xbb' # 0x00af -> RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + '\u2591' # 0x00b0 -> LIGHT SHADE + '\u2592' # 0x00b1 -> MEDIUM SHADE + '\u2593' # 0x00b2 -> DARK SHADE + '\u2502' # 0x00b3 -> BOX DRAWINGS LIGHT VERTICAL + '\u2524' # 0x00b4 -> BOX DRAWINGS LIGHT VERTICAL AND LEFT + '\xc1' # 0x00b5 -> LATIN CAPITAL LETTER A WITH ACUTE + '\xc2' # 0x00b6 -> LATIN CAPITAL LETTER A WITH CIRCUMFLEX + '\xc0' # 0x00b7 -> LATIN CAPITAL LETTER A WITH GRAVE + '\xa9' # 0x00b8 -> COPYRIGHT SIGN + '\u2563' # 0x00b9 -> BOX DRAWINGS DOUBLE VERTICAL AND LEFT + '\u2551' # 0x00ba -> BOX DRAWINGS DOUBLE VERTICAL + '\u2557' # 0x00bb -> BOX DRAWINGS DOUBLE DOWN AND LEFT + '\u255d' # 0x00bc -> BOX DRAWINGS DOUBLE UP AND LEFT + '\xa2' # 0x00bd -> CENT SIGN + '\xa5' # 0x00be -> YEN SIGN + '\u2510' # 0x00bf -> BOX DRAWINGS LIGHT DOWN AND LEFT + '\u2514' # 0x00c0 -> BOX DRAWINGS LIGHT UP AND RIGHT + '\u2534' # 0x00c1 -> BOX DRAWINGS LIGHT UP AND HORIZONTAL + '\u252c' # 0x00c2 -> BOX DRAWINGS LIGHT DOWN AND HORIZONTAL + '\u251c' # 0x00c3 -> BOX DRAWINGS LIGHT VERTICAL AND RIGHT + '\u2500' # 0x00c4 -> BOX DRAWINGS LIGHT HORIZONTAL + '\u253c' # 0x00c5 -> BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL + '\xe3' # 0x00c6 -> LATIN SMALL LETTER A WITH TILDE + '\xc3' # 0x00c7 -> LATIN CAPITAL LETTER A WITH TILDE + '\u255a' # 0x00c8 -> BOX DRAWINGS DOUBLE UP AND RIGHT + '\u2554' # 0x00c9 -> BOX DRAWINGS DOUBLE DOWN AND RIGHT + '\u2569' # 0x00ca -> BOX DRAWINGS DOUBLE UP AND HORIZONTAL + '\u2566' # 0x00cb -> BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL + '\u2560' # 0x00cc -> BOX DRAWINGS DOUBLE VERTICAL AND RIGHT + '\u2550' # 0x00cd -> BOX DRAWINGS DOUBLE HORIZONTAL + '\u256c' # 0x00ce -> BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL + '\xa4' # 0x00cf -> CURRENCY SIGN + '\xf0' # 0x00d0 -> LATIN SMALL LETTER ETH + '\xd0' # 0x00d1 -> LATIN CAPITAL LETTER ETH + '\xca' # 0x00d2 -> LATIN CAPITAL LETTER E WITH CIRCUMFLEX + '\xcb' # 0x00d3 -> LATIN CAPITAL LETTER E WITH DIAERESIS + '\xc8' # 0x00d4 -> LATIN CAPITAL LETTER E WITH GRAVE + '\u20ac' # 0x00d5 -> EURO SIGN + '\xcd' # 0x00d6 -> LATIN CAPITAL LETTER I WITH ACUTE + '\xce' # 0x00d7 -> LATIN CAPITAL LETTER I WITH CIRCUMFLEX + '\xcf' # 0x00d8 -> LATIN CAPITAL LETTER I WITH DIAERESIS + '\u2518' # 0x00d9 -> BOX DRAWINGS LIGHT UP AND LEFT + '\u250c' # 0x00da -> BOX DRAWINGS LIGHT DOWN AND RIGHT + '\u2588' # 0x00db -> FULL BLOCK + '\u2584' # 0x00dc -> LOWER HALF BLOCK + '\xa6' # 0x00dd -> BROKEN BAR + '\xcc' # 0x00de -> LATIN CAPITAL LETTER I WITH GRAVE + '\u2580' # 0x00df -> UPPER HALF BLOCK + '\xd3' # 0x00e0 -> LATIN CAPITAL LETTER O WITH ACUTE + '\xdf' # 0x00e1 -> LATIN SMALL LETTER SHARP S + '\xd4' # 0x00e2 -> LATIN CAPITAL LETTER O WITH CIRCUMFLEX + '\xd2' # 0x00e3 -> LATIN CAPITAL LETTER O WITH GRAVE + '\xf5' # 0x00e4 -> LATIN SMALL LETTER O WITH TILDE + '\xd5' # 0x00e5 -> LATIN CAPITAL LETTER O WITH TILDE + '\xb5' # 0x00e6 -> MICRO SIGN + '\xfe' # 0x00e7 -> LATIN SMALL LETTER THORN + '\xde' # 0x00e8 -> LATIN CAPITAL LETTER THORN + '\xda' # 0x00e9 -> LATIN CAPITAL LETTER U WITH ACUTE + '\xdb' # 0x00ea -> LATIN CAPITAL LETTER U WITH CIRCUMFLEX + '\xd9' # 0x00eb -> LATIN CAPITAL LETTER U WITH GRAVE + '\xfd' # 0x00ec -> LATIN SMALL LETTER Y WITH ACUTE + '\xdd' # 0x00ed -> LATIN CAPITAL LETTER Y WITH ACUTE + '\xaf' # 0x00ee -> MACRON + '\xb4' # 0x00ef -> ACUTE ACCENT + '\xad' # 0x00f0 -> SOFT HYPHEN + '\xb1' # 0x00f1 -> PLUS-MINUS SIGN + '\u2017' # 0x00f2 -> DOUBLE LOW LINE + '\xbe' # 0x00f3 -> VULGAR FRACTION THREE QUARTERS + '\xb6' # 0x00f4 -> PILCROW SIGN + '\xa7' # 0x00f5 -> SECTION SIGN + '\xf7' # 0x00f6 -> DIVISION SIGN + '\xb8' # 0x00f7 -> CEDILLA + '\xb0' # 0x00f8 -> DEGREE SIGN + '\xa8' # 0x00f9 -> DIAERESIS + '\xb7' # 0x00fa -> MIDDLE DOT + '\xb9' # 0x00fb -> SUPERSCRIPT ONE + '\xb3' # 0x00fc -> SUPERSCRIPT THREE + '\xb2' # 0x00fd -> SUPERSCRIPT TWO + '\u25a0' # 0x00fe -> BLACK SQUARE + '\xa0' # 0x00ff -> NO-BREAK SPACE +) + +### Encoding Map + +encoding_map = { + 0x0000: 0x0000, # NULL + 0x0001: 0x0001, # START OF HEADING + 0x0002: 0x0002, # START OF TEXT + 0x0003: 0x0003, # END OF TEXT + 0x0004: 0x0004, # END OF TRANSMISSION + 0x0005: 0x0005, # ENQUIRY + 0x0006: 0x0006, # ACKNOWLEDGE + 0x0007: 0x0007, # BELL + 0x0008: 0x0008, # BACKSPACE + 0x0009: 0x0009, # HORIZONTAL TABULATION + 0x000a: 0x000a, # LINE FEED + 0x000b: 0x000b, # VERTICAL TABULATION + 0x000c: 0x000c, # FORM FEED + 0x000d: 0x000d, # CARRIAGE RETURN + 0x000e: 0x000e, # SHIFT OUT + 0x000f: 0x000f, # SHIFT IN + 0x0010: 0x0010, # DATA LINK ESCAPE + 0x0011: 0x0011, # DEVICE CONTROL ONE + 0x0012: 0x0012, # DEVICE CONTROL TWO + 0x0013: 0x0013, # DEVICE CONTROL THREE + 0x0014: 0x0014, # DEVICE CONTROL FOUR + 0x0015: 0x0015, # NEGATIVE ACKNOWLEDGE + 0x0016: 0x0016, # SYNCHRONOUS IDLE + 0x0017: 0x0017, # END OF TRANSMISSION BLOCK + 0x0018: 0x0018, # CANCEL + 0x0019: 0x0019, # END OF MEDIUM + 0x001a: 0x001a, # SUBSTITUTE + 0x001b: 0x001b, # ESCAPE + 0x001c: 0x001c, # FILE SEPARATOR + 0x001d: 0x001d, # GROUP SEPARATOR + 0x001e: 0x001e, # RECORD SEPARATOR + 0x001f: 0x001f, # UNIT SEPARATOR + 0x0020: 0x0020, # SPACE + 0x0021: 0x0021, # EXCLAMATION MARK + 0x0022: 0x0022, # QUOTATION MARK + 0x0023: 0x0023, # NUMBER SIGN + 0x0024: 0x0024, # DOLLAR SIGN + 0x0025: 0x0025, # PERCENT SIGN + 0x0026: 0x0026, # AMPERSAND + 0x0027: 0x0027, # APOSTROPHE + 0x0028: 0x0028, # LEFT PARENTHESIS + 0x0029: 0x0029, # RIGHT PARENTHESIS + 0x002a: 0x002a, # ASTERISK + 0x002b: 0x002b, # PLUS SIGN + 0x002c: 0x002c, # COMMA + 0x002d: 0x002d, # HYPHEN-MINUS + 0x002e: 0x002e, # FULL STOP + 0x002f: 0x002f, # SOLIDUS + 0x0030: 0x0030, # DIGIT ZERO + 0x0031: 0x0031, # DIGIT ONE + 0x0032: 0x0032, # DIGIT TWO + 0x0033: 0x0033, # DIGIT THREE + 0x0034: 0x0034, # DIGIT FOUR + 0x0035: 0x0035, # DIGIT FIVE + 0x0036: 0x0036, # DIGIT SIX + 0x0037: 0x0037, # DIGIT SEVEN + 0x0038: 0x0038, # DIGIT EIGHT + 0x0039: 0x0039, # DIGIT NINE + 0x003a: 0x003a, # COLON + 0x003b: 0x003b, # SEMICOLON + 0x003c: 0x003c, # LESS-THAN SIGN + 0x003d: 0x003d, # EQUALS SIGN + 0x003e: 0x003e, # GREATER-THAN SIGN + 0x003f: 0x003f, # QUESTION MARK + 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 + 0x005c: 0x005c, # REVERSE SOLIDUS + 0x005d: 0x005d, # RIGHT SQUARE BRACKET + 0x005e: 0x005e, # CIRCUMFLEX ACCENT + 0x005f: 0x005f, # LOW LINE + 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 + 0x007c: 0x007c, # VERTICAL LINE + 0x007d: 0x007d, # RIGHT CURLY BRACKET + 0x007e: 0x007e, # TILDE + 0x007f: 0x007f, # DELETE + 0x00a0: 0x00ff, # NO-BREAK SPACE + 0x00a1: 0x00ad, # INVERTED EXCLAMATION MARK + 0x00a2: 0x00bd, # CENT SIGN + 0x00a3: 0x009c, # POUND SIGN + 0x00a4: 0x00cf, # CURRENCY SIGN + 0x00a5: 0x00be, # YEN SIGN + 0x00a6: 0x00dd, # BROKEN BAR + 0x00a7: 0x00f5, # SECTION SIGN + 0x00a8: 0x00f9, # DIAERESIS + 0x00a9: 0x00b8, # COPYRIGHT SIGN + 0x00aa: 0x00a6, # FEMININE ORDINAL INDICATOR + 0x00ab: 0x00ae, # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00ac: 0x00aa, # NOT SIGN + 0x00ad: 0x00f0, # SOFT HYPHEN + 0x00ae: 0x00a9, # REGISTERED SIGN + 0x00af: 0x00ee, # MACRON + 0x00b0: 0x00f8, # DEGREE SIGN + 0x00b1: 0x00f1, # PLUS-MINUS SIGN + 0x00b2: 0x00fd, # SUPERSCRIPT TWO + 0x00b3: 0x00fc, # SUPERSCRIPT THREE + 0x00b4: 0x00ef, # ACUTE ACCENT + 0x00b5: 0x00e6, # MICRO SIGN + 0x00b6: 0x00f4, # PILCROW SIGN + 0x00b7: 0x00fa, # MIDDLE DOT + 0x00b8: 0x00f7, # CEDILLA + 0x00b9: 0x00fb, # SUPERSCRIPT ONE + 0x00ba: 0x00a7, # MASCULINE ORDINAL INDICATOR + 0x00bb: 0x00af, # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00bc: 0x00ac, # VULGAR FRACTION ONE QUARTER + 0x00bd: 0x00ab, # VULGAR FRACTION ONE HALF + 0x00be: 0x00f3, # VULGAR FRACTION THREE QUARTERS + 0x00bf: 0x00a8, # INVERTED QUESTION MARK + 0x00c0: 0x00b7, # LATIN CAPITAL LETTER A WITH GRAVE + 0x00c1: 0x00b5, # LATIN CAPITAL LETTER A WITH ACUTE + 0x00c2: 0x00b6, # LATIN CAPITAL LETTER A WITH CIRCUMFLEX + 0x00c3: 0x00c7, # LATIN CAPITAL LETTER A WITH TILDE + 0x00c4: 0x008e, # LATIN CAPITAL LETTER A WITH DIAERESIS + 0x00c5: 0x008f, # LATIN CAPITAL LETTER A WITH RING ABOVE + 0x00c6: 0x0092, # LATIN CAPITAL LIGATURE AE + 0x00c7: 0x0080, # LATIN CAPITAL LETTER C WITH CEDILLA + 0x00c8: 0x00d4, # LATIN CAPITAL LETTER E WITH GRAVE + 0x00c9: 0x0090, # LATIN CAPITAL LETTER E WITH ACUTE + 0x00ca: 0x00d2, # LATIN CAPITAL LETTER E WITH CIRCUMFLEX + 0x00cb: 0x00d3, # LATIN CAPITAL LETTER E WITH DIAERESIS + 0x00cc: 0x00de, # LATIN CAPITAL LETTER I WITH GRAVE + 0x00cd: 0x00d6, # LATIN CAPITAL LETTER I WITH ACUTE + 0x00ce: 0x00d7, # LATIN CAPITAL LETTER I WITH CIRCUMFLEX + 0x00cf: 0x00d8, # LATIN CAPITAL LETTER I WITH DIAERESIS + 0x00d0: 0x00d1, # LATIN CAPITAL LETTER ETH + 0x00d1: 0x00a5, # LATIN CAPITAL LETTER N WITH TILDE + 0x00d2: 0x00e3, # LATIN CAPITAL LETTER O WITH GRAVE + 0x00d3: 0x00e0, # LATIN CAPITAL LETTER O WITH ACUTE + 0x00d4: 0x00e2, # LATIN CAPITAL LETTER O WITH CIRCUMFLEX + 0x00d5: 0x00e5, # LATIN CAPITAL LETTER O WITH TILDE + 0x00d6: 0x0099, # LATIN CAPITAL LETTER O WITH DIAERESIS + 0x00d7: 0x009e, # MULTIPLICATION SIGN + 0x00d8: 0x009d, # LATIN CAPITAL LETTER O WITH STROKE + 0x00d9: 0x00eb, # LATIN CAPITAL LETTER U WITH GRAVE + 0x00da: 0x00e9, # LATIN CAPITAL LETTER U WITH ACUTE + 0x00db: 0x00ea, # LATIN CAPITAL LETTER U WITH CIRCUMFLEX + 0x00dc: 0x009a, # LATIN CAPITAL LETTER U WITH DIAERESIS + 0x00dd: 0x00ed, # LATIN CAPITAL LETTER Y WITH ACUTE + 0x00de: 0x00e8, # LATIN CAPITAL LETTER THORN + 0x00df: 0x00e1, # LATIN SMALL LETTER SHARP S + 0x00e0: 0x0085, # LATIN SMALL LETTER A WITH GRAVE + 0x00e1: 0x00a0, # LATIN SMALL LETTER A WITH ACUTE + 0x00e2: 0x0083, # LATIN SMALL LETTER A WITH CIRCUMFLEX + 0x00e3: 0x00c6, # LATIN SMALL LETTER A WITH TILDE + 0x00e4: 0x0084, # LATIN SMALL LETTER A WITH DIAERESIS + 0x00e5: 0x0086, # LATIN SMALL LETTER A WITH RING ABOVE + 0x00e6: 0x0091, # LATIN SMALL LIGATURE AE + 0x00e7: 0x0087, # LATIN SMALL LETTER C WITH CEDILLA + 0x00e8: 0x008a, # LATIN SMALL LETTER E WITH GRAVE + 0x00e9: 0x0082, # LATIN SMALL LETTER E WITH ACUTE + 0x00ea: 0x0088, # LATIN SMALL LETTER E WITH CIRCUMFLEX + 0x00eb: 0x0089, # LATIN SMALL LETTER E WITH DIAERESIS + 0x00ec: 0x008d, # LATIN SMALL LETTER I WITH GRAVE + 0x00ed: 0x00a1, # LATIN SMALL LETTER I WITH ACUTE + 0x00ee: 0x008c, # LATIN SMALL LETTER I WITH CIRCUMFLEX + 0x00ef: 0x008b, # LATIN SMALL LETTER I WITH DIAERESIS + 0x00f0: 0x00d0, # LATIN SMALL LETTER ETH + 0x00f1: 0x00a4, # LATIN SMALL LETTER N WITH TILDE + 0x00f2: 0x0095, # LATIN SMALL LETTER O WITH GRAVE + 0x00f3: 0x00a2, # LATIN SMALL LETTER O WITH ACUTE + 0x00f4: 0x0093, # LATIN SMALL LETTER O WITH CIRCUMFLEX + 0x00f5: 0x00e4, # LATIN SMALL LETTER O WITH TILDE + 0x00f6: 0x0094, # LATIN SMALL LETTER O WITH DIAERESIS + 0x00f7: 0x00f6, # DIVISION SIGN + 0x00f8: 0x009b, # LATIN SMALL LETTER O WITH STROKE + 0x00f9: 0x0097, # LATIN SMALL LETTER U WITH GRAVE + 0x00fa: 0x00a3, # LATIN SMALL LETTER U WITH ACUTE + 0x00fb: 0x0096, # LATIN SMALL LETTER U WITH CIRCUMFLEX + 0x00fc: 0x0081, # LATIN SMALL LETTER U WITH DIAERESIS + 0x00fd: 0x00ec, # LATIN SMALL LETTER Y WITH ACUTE + 0x00fe: 0x00e7, # LATIN SMALL LETTER THORN + 0x00ff: 0x0098, # LATIN SMALL LETTER Y WITH DIAERESIS + 0x20ac: 0x00d5, # EURO SIGN + 0x0192: 0x009f, # LATIN SMALL LETTER F WITH HOOK + 0x2017: 0x00f2, # DOUBLE LOW LINE + 0x2500: 0x00c4, # BOX DRAWINGS LIGHT HORIZONTAL + 0x2502: 0x00b3, # BOX DRAWINGS LIGHT VERTICAL + 0x250c: 0x00da, # BOX DRAWINGS LIGHT DOWN AND RIGHT + 0x2510: 0x00bf, # BOX DRAWINGS LIGHT DOWN AND LEFT + 0x2514: 0x00c0, # BOX DRAWINGS LIGHT UP AND RIGHT + 0x2518: 0x00d9, # BOX DRAWINGS LIGHT UP AND LEFT + 0x251c: 0x00c3, # BOX DRAWINGS LIGHT VERTICAL AND RIGHT + 0x2524: 0x00b4, # BOX DRAWINGS LIGHT VERTICAL AND LEFT + 0x252c: 0x00c2, # BOX DRAWINGS LIGHT DOWN AND HORIZONTAL + 0x2534: 0x00c1, # BOX DRAWINGS LIGHT UP AND HORIZONTAL + 0x253c: 0x00c5, # BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL + 0x2550: 0x00cd, # BOX DRAWINGS DOUBLE HORIZONTAL + 0x2551: 0x00ba, # BOX DRAWINGS DOUBLE VERTICAL + 0x2554: 0x00c9, # BOX DRAWINGS DOUBLE DOWN AND RIGHT + 0x2557: 0x00bb, # BOX DRAWINGS DOUBLE DOWN AND LEFT + 0x255a: 0x00c8, # BOX DRAWINGS DOUBLE UP AND RIGHT + 0x255d: 0x00bc, # BOX DRAWINGS DOUBLE UP AND LEFT + 0x2560: 0x00cc, # BOX DRAWINGS DOUBLE VERTICAL AND RIGHT + 0x2563: 0x00b9, # BOX DRAWINGS DOUBLE VERTICAL AND LEFT + 0x2566: 0x00cb, # BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL + 0x2569: 0x00ca, # BOX DRAWINGS DOUBLE UP AND HORIZONTAL + 0x256c: 0x00ce, # BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL + 0x2580: 0x00df, # UPPER HALF BLOCK + 0x2584: 0x00dc, # LOWER HALF BLOCK + 0x2588: 0x00db, # FULL BLOCK + 0x2591: 0x00b0, # LIGHT SHADE + 0x2592: 0x00b1, # MEDIUM SHADE + 0x2593: 0x00b2, # DARK SHADE + 0x25a0: 0x00fe, # BLACK SQUARE +} diff --git a/env/Lib/encodings/cp860.py b/env/Lib/encodings/cp860.py new file mode 100644 index 0000000..65903e7 --- /dev/null +++ b/env/Lib/encodings/cp860.py @@ -0,0 +1,698 @@ +""" Python Character Mapping Codec generated from 'VENDORS/MICSFT/PC/CP860.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_map) + + 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_map)[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='cp860', + 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: 0x00c7, # LATIN CAPITAL LETTER C WITH CEDILLA + 0x0081: 0x00fc, # LATIN SMALL LETTER U WITH DIAERESIS + 0x0082: 0x00e9, # LATIN SMALL LETTER E WITH ACUTE + 0x0083: 0x00e2, # LATIN SMALL LETTER A WITH CIRCUMFLEX + 0x0084: 0x00e3, # LATIN SMALL LETTER A WITH TILDE + 0x0085: 0x00e0, # LATIN SMALL LETTER A WITH GRAVE + 0x0086: 0x00c1, # LATIN CAPITAL LETTER A WITH ACUTE + 0x0087: 0x00e7, # LATIN SMALL LETTER C WITH CEDILLA + 0x0088: 0x00ea, # LATIN SMALL LETTER E WITH CIRCUMFLEX + 0x0089: 0x00ca, # LATIN CAPITAL LETTER E WITH CIRCUMFLEX + 0x008a: 0x00e8, # LATIN SMALL LETTER E WITH GRAVE + 0x008b: 0x00cd, # LATIN CAPITAL LETTER I WITH ACUTE + 0x008c: 0x00d4, # LATIN CAPITAL LETTER O WITH CIRCUMFLEX + 0x008d: 0x00ec, # LATIN SMALL LETTER I WITH GRAVE + 0x008e: 0x00c3, # LATIN CAPITAL LETTER A WITH TILDE + 0x008f: 0x00c2, # LATIN CAPITAL LETTER A WITH CIRCUMFLEX + 0x0090: 0x00c9, # LATIN CAPITAL LETTER E WITH ACUTE + 0x0091: 0x00c0, # LATIN CAPITAL LETTER A WITH GRAVE + 0x0092: 0x00c8, # LATIN CAPITAL LETTER E WITH GRAVE + 0x0093: 0x00f4, # LATIN SMALL LETTER O WITH CIRCUMFLEX + 0x0094: 0x00f5, # LATIN SMALL LETTER O WITH TILDE + 0x0095: 0x00f2, # LATIN SMALL LETTER O WITH GRAVE + 0x0096: 0x00da, # LATIN CAPITAL LETTER U WITH ACUTE + 0x0097: 0x00f9, # LATIN SMALL LETTER U WITH GRAVE + 0x0098: 0x00cc, # LATIN CAPITAL LETTER I WITH GRAVE + 0x0099: 0x00d5, # LATIN CAPITAL LETTER O WITH TILDE + 0x009a: 0x00dc, # LATIN CAPITAL LETTER U WITH DIAERESIS + 0x009b: 0x00a2, # CENT SIGN + 0x009c: 0x00a3, # POUND SIGN + 0x009d: 0x00d9, # LATIN CAPITAL LETTER U WITH GRAVE + 0x009e: 0x20a7, # PESETA SIGN + 0x009f: 0x00d3, # LATIN CAPITAL LETTER O WITH ACUTE + 0x00a0: 0x00e1, # LATIN SMALL LETTER A WITH ACUTE + 0x00a1: 0x00ed, # LATIN SMALL LETTER I WITH ACUTE + 0x00a2: 0x00f3, # LATIN SMALL LETTER O WITH ACUTE + 0x00a3: 0x00fa, # LATIN SMALL LETTER U WITH ACUTE + 0x00a4: 0x00f1, # LATIN SMALL LETTER N WITH TILDE + 0x00a5: 0x00d1, # LATIN CAPITAL LETTER N WITH TILDE + 0x00a6: 0x00aa, # FEMININE ORDINAL INDICATOR + 0x00a7: 0x00ba, # MASCULINE ORDINAL INDICATOR + 0x00a8: 0x00bf, # INVERTED QUESTION MARK + 0x00a9: 0x00d2, # LATIN CAPITAL LETTER O WITH GRAVE + 0x00aa: 0x00ac, # NOT SIGN + 0x00ab: 0x00bd, # VULGAR FRACTION ONE HALF + 0x00ac: 0x00bc, # VULGAR FRACTION ONE QUARTER + 0x00ad: 0x00a1, # INVERTED EXCLAMATION MARK + 0x00ae: 0x00ab, # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00af: 0x00bb, # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00b0: 0x2591, # LIGHT SHADE + 0x00b1: 0x2592, # MEDIUM SHADE + 0x00b2: 0x2593, # DARK SHADE + 0x00b3: 0x2502, # BOX DRAWINGS LIGHT VERTICAL + 0x00b4: 0x2524, # BOX DRAWINGS LIGHT VERTICAL AND LEFT + 0x00b5: 0x2561, # BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE + 0x00b6: 0x2562, # BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE + 0x00b7: 0x2556, # BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE + 0x00b8: 0x2555, # BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE + 0x00b9: 0x2563, # BOX DRAWINGS DOUBLE VERTICAL AND LEFT + 0x00ba: 0x2551, # BOX DRAWINGS DOUBLE VERTICAL + 0x00bb: 0x2557, # BOX DRAWINGS DOUBLE DOWN AND LEFT + 0x00bc: 0x255d, # BOX DRAWINGS DOUBLE UP AND LEFT + 0x00bd: 0x255c, # BOX DRAWINGS UP DOUBLE AND LEFT SINGLE + 0x00be: 0x255b, # BOX DRAWINGS UP SINGLE AND LEFT DOUBLE + 0x00bf: 0x2510, # BOX DRAWINGS LIGHT DOWN AND LEFT + 0x00c0: 0x2514, # BOX DRAWINGS LIGHT UP AND RIGHT + 0x00c1: 0x2534, # BOX DRAWINGS LIGHT UP AND HORIZONTAL + 0x00c2: 0x252c, # BOX DRAWINGS LIGHT DOWN AND HORIZONTAL + 0x00c3: 0x251c, # BOX DRAWINGS LIGHT VERTICAL AND RIGHT + 0x00c4: 0x2500, # BOX DRAWINGS LIGHT HORIZONTAL + 0x00c5: 0x253c, # BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL + 0x00c6: 0x255e, # BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE + 0x00c7: 0x255f, # BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE + 0x00c8: 0x255a, # BOX DRAWINGS DOUBLE UP AND RIGHT + 0x00c9: 0x2554, # BOX DRAWINGS DOUBLE DOWN AND RIGHT + 0x00ca: 0x2569, # BOX DRAWINGS DOUBLE UP AND HORIZONTAL + 0x00cb: 0x2566, # BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL + 0x00cc: 0x2560, # BOX DRAWINGS DOUBLE VERTICAL AND RIGHT + 0x00cd: 0x2550, # BOX DRAWINGS DOUBLE HORIZONTAL + 0x00ce: 0x256c, # BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL + 0x00cf: 0x2567, # BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE + 0x00d0: 0x2568, # BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE + 0x00d1: 0x2564, # BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE + 0x00d2: 0x2565, # BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE + 0x00d3: 0x2559, # BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE + 0x00d4: 0x2558, # BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE + 0x00d5: 0x2552, # BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE + 0x00d6: 0x2553, # BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE + 0x00d7: 0x256b, # BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE + 0x00d8: 0x256a, # BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE + 0x00d9: 0x2518, # BOX DRAWINGS LIGHT UP AND LEFT + 0x00da: 0x250c, # BOX DRAWINGS LIGHT DOWN AND RIGHT + 0x00db: 0x2588, # FULL BLOCK + 0x00dc: 0x2584, # LOWER HALF BLOCK + 0x00dd: 0x258c, # LEFT HALF BLOCK + 0x00de: 0x2590, # RIGHT HALF BLOCK + 0x00df: 0x2580, # UPPER HALF BLOCK + 0x00e0: 0x03b1, # GREEK SMALL LETTER ALPHA + 0x00e1: 0x00df, # LATIN SMALL LETTER SHARP S + 0x00e2: 0x0393, # GREEK CAPITAL LETTER GAMMA + 0x00e3: 0x03c0, # GREEK SMALL LETTER PI + 0x00e4: 0x03a3, # GREEK CAPITAL LETTER SIGMA + 0x00e5: 0x03c3, # GREEK SMALL LETTER SIGMA + 0x00e6: 0x00b5, # MICRO SIGN + 0x00e7: 0x03c4, # GREEK SMALL LETTER TAU + 0x00e8: 0x03a6, # GREEK CAPITAL LETTER PHI + 0x00e9: 0x0398, # GREEK CAPITAL LETTER THETA + 0x00ea: 0x03a9, # GREEK CAPITAL LETTER OMEGA + 0x00eb: 0x03b4, # GREEK SMALL LETTER DELTA + 0x00ec: 0x221e, # INFINITY + 0x00ed: 0x03c6, # GREEK SMALL LETTER PHI + 0x00ee: 0x03b5, # GREEK SMALL LETTER EPSILON + 0x00ef: 0x2229, # INTERSECTION + 0x00f0: 0x2261, # IDENTICAL TO + 0x00f1: 0x00b1, # PLUS-MINUS SIGN + 0x00f2: 0x2265, # GREATER-THAN OR EQUAL TO + 0x00f3: 0x2264, # LESS-THAN OR EQUAL TO + 0x00f4: 0x2320, # TOP HALF INTEGRAL + 0x00f5: 0x2321, # BOTTOM HALF INTEGRAL + 0x00f6: 0x00f7, # DIVISION SIGN + 0x00f7: 0x2248, # ALMOST EQUAL TO + 0x00f8: 0x00b0, # DEGREE SIGN + 0x00f9: 0x2219, # BULLET OPERATOR + 0x00fa: 0x00b7, # MIDDLE DOT + 0x00fb: 0x221a, # SQUARE ROOT + 0x00fc: 0x207f, # SUPERSCRIPT LATIN SMALL LETTER N + 0x00fd: 0x00b2, # SUPERSCRIPT TWO + 0x00fe: 0x25a0, # BLACK SQUARE + 0x00ff: 0x00a0, # NO-BREAK SPACE +}) + +### Decoding Table + +decoding_table = ( + '\x00' # 0x0000 -> NULL + '\x01' # 0x0001 -> START OF HEADING + '\x02' # 0x0002 -> START OF TEXT + '\x03' # 0x0003 -> END OF TEXT + '\x04' # 0x0004 -> END OF TRANSMISSION + '\x05' # 0x0005 -> ENQUIRY + '\x06' # 0x0006 -> ACKNOWLEDGE + '\x07' # 0x0007 -> BELL + '\x08' # 0x0008 -> BACKSPACE + '\t' # 0x0009 -> HORIZONTAL TABULATION + '\n' # 0x000a -> LINE FEED + '\x0b' # 0x000b -> VERTICAL TABULATION + '\x0c' # 0x000c -> FORM FEED + '\r' # 0x000d -> CARRIAGE RETURN + '\x0e' # 0x000e -> SHIFT OUT + '\x0f' # 0x000f -> SHIFT IN + '\x10' # 0x0010 -> DATA LINK ESCAPE + '\x11' # 0x0011 -> DEVICE CONTROL ONE + '\x12' # 0x0012 -> DEVICE CONTROL TWO + '\x13' # 0x0013 -> DEVICE CONTROL THREE + '\x14' # 0x0014 -> DEVICE CONTROL FOUR + '\x15' # 0x0015 -> NEGATIVE ACKNOWLEDGE + '\x16' # 0x0016 -> SYNCHRONOUS IDLE + '\x17' # 0x0017 -> END OF TRANSMISSION BLOCK + '\x18' # 0x0018 -> CANCEL + '\x19' # 0x0019 -> END OF MEDIUM + '\x1a' # 0x001a -> SUBSTITUTE + '\x1b' # 0x001b -> ESCAPE + '\x1c' # 0x001c -> FILE SEPARATOR + '\x1d' # 0x001d -> GROUP SEPARATOR + '\x1e' # 0x001e -> RECORD SEPARATOR + '\x1f' # 0x001f -> UNIT SEPARATOR + ' ' # 0x0020 -> SPACE + '!' # 0x0021 -> EXCLAMATION MARK + '"' # 0x0022 -> QUOTATION MARK + '#' # 0x0023 -> NUMBER SIGN + '$' # 0x0024 -> DOLLAR SIGN + '%' # 0x0025 -> PERCENT SIGN + '&' # 0x0026 -> AMPERSAND + "'" # 0x0027 -> APOSTROPHE + '(' # 0x0028 -> LEFT PARENTHESIS + ')' # 0x0029 -> RIGHT PARENTHESIS + '*' # 0x002a -> ASTERISK + '+' # 0x002b -> PLUS SIGN + ',' # 0x002c -> COMMA + '-' # 0x002d -> HYPHEN-MINUS + '.' # 0x002e -> FULL STOP + '/' # 0x002f -> SOLIDUS + '0' # 0x0030 -> DIGIT ZERO + '1' # 0x0031 -> DIGIT ONE + '2' # 0x0032 -> DIGIT TWO + '3' # 0x0033 -> DIGIT THREE + '4' # 0x0034 -> DIGIT FOUR + '5' # 0x0035 -> DIGIT FIVE + '6' # 0x0036 -> DIGIT SIX + '7' # 0x0037 -> DIGIT SEVEN + '8' # 0x0038 -> DIGIT EIGHT + '9' # 0x0039 -> DIGIT NINE + ':' # 0x003a -> COLON + ';' # 0x003b -> SEMICOLON + '<' # 0x003c -> LESS-THAN SIGN + '=' # 0x003d -> EQUALS SIGN + '>' # 0x003e -> GREATER-THAN SIGN + '?' # 0x003f -> QUESTION MARK + '@' # 0x0040 -> COMMERCIAL AT + 'A' # 0x0041 -> LATIN CAPITAL LETTER A + 'B' # 0x0042 -> LATIN CAPITAL LETTER B + 'C' # 0x0043 -> LATIN CAPITAL LETTER C + 'D' # 0x0044 -> LATIN CAPITAL LETTER D + 'E' # 0x0045 -> LATIN CAPITAL LETTER E + 'F' # 0x0046 -> LATIN CAPITAL LETTER F + 'G' # 0x0047 -> LATIN CAPITAL LETTER G + 'H' # 0x0048 -> LATIN CAPITAL LETTER H + 'I' # 0x0049 -> LATIN CAPITAL LETTER I + 'J' # 0x004a -> LATIN CAPITAL LETTER J + 'K' # 0x004b -> LATIN CAPITAL LETTER K + 'L' # 0x004c -> LATIN CAPITAL LETTER L + 'M' # 0x004d -> LATIN CAPITAL LETTER M + 'N' # 0x004e -> LATIN CAPITAL LETTER N + 'O' # 0x004f -> LATIN CAPITAL LETTER O + 'P' # 0x0050 -> LATIN CAPITAL LETTER P + 'Q' # 0x0051 -> LATIN CAPITAL LETTER Q + 'R' # 0x0052 -> LATIN CAPITAL LETTER R + 'S' # 0x0053 -> LATIN CAPITAL LETTER S + 'T' # 0x0054 -> LATIN CAPITAL LETTER T + 'U' # 0x0055 -> LATIN CAPITAL LETTER U + 'V' # 0x0056 -> LATIN CAPITAL LETTER V + 'W' # 0x0057 -> LATIN CAPITAL LETTER W + 'X' # 0x0058 -> LATIN CAPITAL LETTER X + 'Y' # 0x0059 -> LATIN CAPITAL LETTER Y + 'Z' # 0x005a -> LATIN CAPITAL LETTER Z + '[' # 0x005b -> LEFT SQUARE BRACKET + '\\' # 0x005c -> REVERSE SOLIDUS + ']' # 0x005d -> RIGHT SQUARE BRACKET + '^' # 0x005e -> CIRCUMFLEX ACCENT + '_' # 0x005f -> LOW LINE + '`' # 0x0060 -> GRAVE ACCENT + 'a' # 0x0061 -> LATIN SMALL LETTER A + 'b' # 0x0062 -> LATIN SMALL LETTER B + 'c' # 0x0063 -> LATIN SMALL LETTER C + 'd' # 0x0064 -> LATIN SMALL LETTER D + 'e' # 0x0065 -> LATIN SMALL LETTER E + 'f' # 0x0066 -> LATIN SMALL LETTER F + 'g' # 0x0067 -> LATIN SMALL LETTER G + 'h' # 0x0068 -> LATIN SMALL LETTER H + 'i' # 0x0069 -> LATIN SMALL LETTER I + 'j' # 0x006a -> LATIN SMALL LETTER J + 'k' # 0x006b -> LATIN SMALL LETTER K + 'l' # 0x006c -> LATIN SMALL LETTER L + 'm' # 0x006d -> LATIN SMALL LETTER M + 'n' # 0x006e -> LATIN SMALL LETTER N + 'o' # 0x006f -> LATIN SMALL LETTER O + 'p' # 0x0070 -> LATIN SMALL LETTER P + 'q' # 0x0071 -> LATIN SMALL LETTER Q + 'r' # 0x0072 -> LATIN SMALL LETTER R + 's' # 0x0073 -> LATIN SMALL LETTER S + 't' # 0x0074 -> LATIN SMALL LETTER T + 'u' # 0x0075 -> LATIN SMALL LETTER U + 'v' # 0x0076 -> LATIN SMALL LETTER V + 'w' # 0x0077 -> LATIN SMALL LETTER W + 'x' # 0x0078 -> LATIN SMALL LETTER X + 'y' # 0x0079 -> LATIN SMALL LETTER Y + 'z' # 0x007a -> LATIN SMALL LETTER Z + '{' # 0x007b -> LEFT CURLY BRACKET + '|' # 0x007c -> VERTICAL LINE + '}' # 0x007d -> RIGHT CURLY BRACKET + '~' # 0x007e -> TILDE + '\x7f' # 0x007f -> DELETE + '\xc7' # 0x0080 -> LATIN CAPITAL LETTER C WITH CEDILLA + '\xfc' # 0x0081 -> LATIN SMALL LETTER U WITH DIAERESIS + '\xe9' # 0x0082 -> LATIN SMALL LETTER E WITH ACUTE + '\xe2' # 0x0083 -> LATIN SMALL LETTER A WITH CIRCUMFLEX + '\xe3' # 0x0084 -> LATIN SMALL LETTER A WITH TILDE + '\xe0' # 0x0085 -> LATIN SMALL LETTER A WITH GRAVE + '\xc1' # 0x0086 -> LATIN CAPITAL LETTER A WITH ACUTE + '\xe7' # 0x0087 -> LATIN SMALL LETTER C WITH CEDILLA + '\xea' # 0x0088 -> LATIN SMALL LETTER E WITH CIRCUMFLEX + '\xca' # 0x0089 -> LATIN CAPITAL LETTER E WITH CIRCUMFLEX + '\xe8' # 0x008a -> LATIN SMALL LETTER E WITH GRAVE + '\xcd' # 0x008b -> LATIN CAPITAL LETTER I WITH ACUTE + '\xd4' # 0x008c -> LATIN CAPITAL LETTER O WITH CIRCUMFLEX + '\xec' # 0x008d -> LATIN SMALL LETTER I WITH GRAVE + '\xc3' # 0x008e -> LATIN CAPITAL LETTER A WITH TILDE + '\xc2' # 0x008f -> LATIN CAPITAL LETTER A WITH CIRCUMFLEX + '\xc9' # 0x0090 -> LATIN CAPITAL LETTER E WITH ACUTE + '\xc0' # 0x0091 -> LATIN CAPITAL LETTER A WITH GRAVE + '\xc8' # 0x0092 -> LATIN CAPITAL LETTER E WITH GRAVE + '\xf4' # 0x0093 -> LATIN SMALL LETTER O WITH CIRCUMFLEX + '\xf5' # 0x0094 -> LATIN SMALL LETTER O WITH TILDE + '\xf2' # 0x0095 -> LATIN SMALL LETTER O WITH GRAVE + '\xda' # 0x0096 -> LATIN CAPITAL LETTER U WITH ACUTE + '\xf9' # 0x0097 -> LATIN SMALL LETTER U WITH GRAVE + '\xcc' # 0x0098 -> LATIN CAPITAL LETTER I WITH GRAVE + '\xd5' # 0x0099 -> LATIN CAPITAL LETTER O WITH TILDE + '\xdc' # 0x009a -> LATIN CAPITAL LETTER U WITH DIAERESIS + '\xa2' # 0x009b -> CENT SIGN + '\xa3' # 0x009c -> POUND SIGN + '\xd9' # 0x009d -> LATIN CAPITAL LETTER U WITH GRAVE + '\u20a7' # 0x009e -> PESETA SIGN + '\xd3' # 0x009f -> LATIN CAPITAL LETTER O WITH ACUTE + '\xe1' # 0x00a0 -> LATIN SMALL LETTER A WITH ACUTE + '\xed' # 0x00a1 -> LATIN SMALL LETTER I WITH ACUTE + '\xf3' # 0x00a2 -> LATIN SMALL LETTER O WITH ACUTE + '\xfa' # 0x00a3 -> LATIN SMALL LETTER U WITH ACUTE + '\xf1' # 0x00a4 -> LATIN SMALL LETTER N WITH TILDE + '\xd1' # 0x00a5 -> LATIN CAPITAL LETTER N WITH TILDE + '\xaa' # 0x00a6 -> FEMININE ORDINAL INDICATOR + '\xba' # 0x00a7 -> MASCULINE ORDINAL INDICATOR + '\xbf' # 0x00a8 -> INVERTED QUESTION MARK + '\xd2' # 0x00a9 -> LATIN CAPITAL LETTER O WITH GRAVE + '\xac' # 0x00aa -> NOT SIGN + '\xbd' # 0x00ab -> VULGAR FRACTION ONE HALF + '\xbc' # 0x00ac -> VULGAR FRACTION ONE QUARTER + '\xa1' # 0x00ad -> INVERTED EXCLAMATION MARK + '\xab' # 0x00ae -> LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + '\xbb' # 0x00af -> RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + '\u2591' # 0x00b0 -> LIGHT SHADE + '\u2592' # 0x00b1 -> MEDIUM SHADE + '\u2593' # 0x00b2 -> DARK SHADE + '\u2502' # 0x00b3 -> BOX DRAWINGS LIGHT VERTICAL + '\u2524' # 0x00b4 -> BOX DRAWINGS LIGHT VERTICAL AND LEFT + '\u2561' # 0x00b5 -> BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE + '\u2562' # 0x00b6 -> BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE + '\u2556' # 0x00b7 -> BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE + '\u2555' # 0x00b8 -> BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE + '\u2563' # 0x00b9 -> BOX DRAWINGS DOUBLE VERTICAL AND LEFT + '\u2551' # 0x00ba -> BOX DRAWINGS DOUBLE VERTICAL + '\u2557' # 0x00bb -> BOX DRAWINGS DOUBLE DOWN AND LEFT + '\u255d' # 0x00bc -> BOX DRAWINGS DOUBLE UP AND LEFT + '\u255c' # 0x00bd -> BOX DRAWINGS UP DOUBLE AND LEFT SINGLE + '\u255b' # 0x00be -> BOX DRAWINGS UP SINGLE AND LEFT DOUBLE + '\u2510' # 0x00bf -> BOX DRAWINGS LIGHT DOWN AND LEFT + '\u2514' # 0x00c0 -> BOX DRAWINGS LIGHT UP AND RIGHT + '\u2534' # 0x00c1 -> BOX DRAWINGS LIGHT UP AND HORIZONTAL + '\u252c' # 0x00c2 -> BOX DRAWINGS LIGHT DOWN AND HORIZONTAL + '\u251c' # 0x00c3 -> BOX DRAWINGS LIGHT VERTICAL AND RIGHT + '\u2500' # 0x00c4 -> BOX DRAWINGS LIGHT HORIZONTAL + '\u253c' # 0x00c5 -> BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL + '\u255e' # 0x00c6 -> BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE + '\u255f' # 0x00c7 -> BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE + '\u255a' # 0x00c8 -> BOX DRAWINGS DOUBLE UP AND RIGHT + '\u2554' # 0x00c9 -> BOX DRAWINGS DOUBLE DOWN AND RIGHT + '\u2569' # 0x00ca -> BOX DRAWINGS DOUBLE UP AND HORIZONTAL + '\u2566' # 0x00cb -> BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL + '\u2560' # 0x00cc -> BOX DRAWINGS DOUBLE VERTICAL AND RIGHT + '\u2550' # 0x00cd -> BOX DRAWINGS DOUBLE HORIZONTAL + '\u256c' # 0x00ce -> BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL + '\u2567' # 0x00cf -> BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE + '\u2568' # 0x00d0 -> BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE + '\u2564' # 0x00d1 -> BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE + '\u2565' # 0x00d2 -> BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE + '\u2559' # 0x00d3 -> BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE + '\u2558' # 0x00d4 -> BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE + '\u2552' # 0x00d5 -> BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE + '\u2553' # 0x00d6 -> BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE + '\u256b' # 0x00d7 -> BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE + '\u256a' # 0x00d8 -> BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE + '\u2518' # 0x00d9 -> BOX DRAWINGS LIGHT UP AND LEFT + '\u250c' # 0x00da -> BOX DRAWINGS LIGHT DOWN AND RIGHT + '\u2588' # 0x00db -> FULL BLOCK + '\u2584' # 0x00dc -> LOWER HALF BLOCK + '\u258c' # 0x00dd -> LEFT HALF BLOCK + '\u2590' # 0x00de -> RIGHT HALF BLOCK + '\u2580' # 0x00df -> UPPER HALF BLOCK + '\u03b1' # 0x00e0 -> GREEK SMALL LETTER ALPHA + '\xdf' # 0x00e1 -> LATIN SMALL LETTER SHARP S + '\u0393' # 0x00e2 -> GREEK CAPITAL LETTER GAMMA + '\u03c0' # 0x00e3 -> GREEK SMALL LETTER PI + '\u03a3' # 0x00e4 -> GREEK CAPITAL LETTER SIGMA + '\u03c3' # 0x00e5 -> GREEK SMALL LETTER SIGMA + '\xb5' # 0x00e6 -> MICRO SIGN + '\u03c4' # 0x00e7 -> GREEK SMALL LETTER TAU + '\u03a6' # 0x00e8 -> GREEK CAPITAL LETTER PHI + '\u0398' # 0x00e9 -> GREEK CAPITAL LETTER THETA + '\u03a9' # 0x00ea -> GREEK CAPITAL LETTER OMEGA + '\u03b4' # 0x00eb -> GREEK SMALL LETTER DELTA + '\u221e' # 0x00ec -> INFINITY + '\u03c6' # 0x00ed -> GREEK SMALL LETTER PHI + '\u03b5' # 0x00ee -> GREEK SMALL LETTER EPSILON + '\u2229' # 0x00ef -> INTERSECTION + '\u2261' # 0x00f0 -> IDENTICAL TO + '\xb1' # 0x00f1 -> PLUS-MINUS SIGN + '\u2265' # 0x00f2 -> GREATER-THAN OR EQUAL TO + '\u2264' # 0x00f3 -> LESS-THAN OR EQUAL TO + '\u2320' # 0x00f4 -> TOP HALF INTEGRAL + '\u2321' # 0x00f5 -> BOTTOM HALF INTEGRAL + '\xf7' # 0x00f6 -> DIVISION SIGN + '\u2248' # 0x00f7 -> ALMOST EQUAL TO + '\xb0' # 0x00f8 -> DEGREE SIGN + '\u2219' # 0x00f9 -> BULLET OPERATOR + '\xb7' # 0x00fa -> MIDDLE DOT + '\u221a' # 0x00fb -> SQUARE ROOT + '\u207f' # 0x00fc -> SUPERSCRIPT LATIN SMALL LETTER N + '\xb2' # 0x00fd -> SUPERSCRIPT TWO + '\u25a0' # 0x00fe -> BLACK SQUARE + '\xa0' # 0x00ff -> NO-BREAK SPACE +) + +### Encoding Map + +encoding_map = { + 0x0000: 0x0000, # NULL + 0x0001: 0x0001, # START OF HEADING + 0x0002: 0x0002, # START OF TEXT + 0x0003: 0x0003, # END OF TEXT + 0x0004: 0x0004, # END OF TRANSMISSION + 0x0005: 0x0005, # ENQUIRY + 0x0006: 0x0006, # ACKNOWLEDGE + 0x0007: 0x0007, # BELL + 0x0008: 0x0008, # BACKSPACE + 0x0009: 0x0009, # HORIZONTAL TABULATION + 0x000a: 0x000a, # LINE FEED + 0x000b: 0x000b, # VERTICAL TABULATION + 0x000c: 0x000c, # FORM FEED + 0x000d: 0x000d, # CARRIAGE RETURN + 0x000e: 0x000e, # SHIFT OUT + 0x000f: 0x000f, # SHIFT IN + 0x0010: 0x0010, # DATA LINK ESCAPE + 0x0011: 0x0011, # DEVICE CONTROL ONE + 0x0012: 0x0012, # DEVICE CONTROL TWO + 0x0013: 0x0013, # DEVICE CONTROL THREE + 0x0014: 0x0014, # DEVICE CONTROL FOUR + 0x0015: 0x0015, # NEGATIVE ACKNOWLEDGE + 0x0016: 0x0016, # SYNCHRONOUS IDLE + 0x0017: 0x0017, # END OF TRANSMISSION BLOCK + 0x0018: 0x0018, # CANCEL + 0x0019: 0x0019, # END OF MEDIUM + 0x001a: 0x001a, # SUBSTITUTE + 0x001b: 0x001b, # ESCAPE + 0x001c: 0x001c, # FILE SEPARATOR + 0x001d: 0x001d, # GROUP SEPARATOR + 0x001e: 0x001e, # RECORD SEPARATOR + 0x001f: 0x001f, # UNIT SEPARATOR + 0x0020: 0x0020, # SPACE + 0x0021: 0x0021, # EXCLAMATION MARK + 0x0022: 0x0022, # QUOTATION MARK + 0x0023: 0x0023, # NUMBER SIGN + 0x0024: 0x0024, # DOLLAR SIGN + 0x0025: 0x0025, # PERCENT SIGN + 0x0026: 0x0026, # AMPERSAND + 0x0027: 0x0027, # APOSTROPHE + 0x0028: 0x0028, # LEFT PARENTHESIS + 0x0029: 0x0029, # RIGHT PARENTHESIS + 0x002a: 0x002a, # ASTERISK + 0x002b: 0x002b, # PLUS SIGN + 0x002c: 0x002c, # COMMA + 0x002d: 0x002d, # HYPHEN-MINUS + 0x002e: 0x002e, # FULL STOP + 0x002f: 0x002f, # SOLIDUS + 0x0030: 0x0030, # DIGIT ZERO + 0x0031: 0x0031, # DIGIT ONE + 0x0032: 0x0032, # DIGIT TWO + 0x0033: 0x0033, # DIGIT THREE + 0x0034: 0x0034, # DIGIT FOUR + 0x0035: 0x0035, # DIGIT FIVE + 0x0036: 0x0036, # DIGIT SIX + 0x0037: 0x0037, # DIGIT SEVEN + 0x0038: 0x0038, # DIGIT EIGHT + 0x0039: 0x0039, # DIGIT NINE + 0x003a: 0x003a, # COLON + 0x003b: 0x003b, # SEMICOLON + 0x003c: 0x003c, # LESS-THAN SIGN + 0x003d: 0x003d, # EQUALS SIGN + 0x003e: 0x003e, # GREATER-THAN SIGN + 0x003f: 0x003f, # QUESTION MARK + 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 + 0x005c: 0x005c, # REVERSE SOLIDUS + 0x005d: 0x005d, # RIGHT SQUARE BRACKET + 0x005e: 0x005e, # CIRCUMFLEX ACCENT + 0x005f: 0x005f, # LOW LINE + 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 + 0x007c: 0x007c, # VERTICAL LINE + 0x007d: 0x007d, # RIGHT CURLY BRACKET + 0x007e: 0x007e, # TILDE + 0x007f: 0x007f, # DELETE + 0x00a0: 0x00ff, # NO-BREAK SPACE + 0x00a1: 0x00ad, # INVERTED EXCLAMATION MARK + 0x00a2: 0x009b, # CENT SIGN + 0x00a3: 0x009c, # POUND SIGN + 0x00aa: 0x00a6, # FEMININE ORDINAL INDICATOR + 0x00ab: 0x00ae, # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00ac: 0x00aa, # NOT SIGN + 0x00b0: 0x00f8, # DEGREE SIGN + 0x00b1: 0x00f1, # PLUS-MINUS SIGN + 0x00b2: 0x00fd, # SUPERSCRIPT TWO + 0x00b5: 0x00e6, # MICRO SIGN + 0x00b7: 0x00fa, # MIDDLE DOT + 0x00ba: 0x00a7, # MASCULINE ORDINAL INDICATOR + 0x00bb: 0x00af, # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00bc: 0x00ac, # VULGAR FRACTION ONE QUARTER + 0x00bd: 0x00ab, # VULGAR FRACTION ONE HALF + 0x00bf: 0x00a8, # INVERTED QUESTION MARK + 0x00c0: 0x0091, # LATIN CAPITAL LETTER A WITH GRAVE + 0x00c1: 0x0086, # LATIN CAPITAL LETTER A WITH ACUTE + 0x00c2: 0x008f, # LATIN CAPITAL LETTER A WITH CIRCUMFLEX + 0x00c3: 0x008e, # LATIN CAPITAL LETTER A WITH TILDE + 0x00c7: 0x0080, # LATIN CAPITAL LETTER C WITH CEDILLA + 0x00c8: 0x0092, # LATIN CAPITAL LETTER E WITH GRAVE + 0x00c9: 0x0090, # LATIN CAPITAL LETTER E WITH ACUTE + 0x00ca: 0x0089, # LATIN CAPITAL LETTER E WITH CIRCUMFLEX + 0x00cc: 0x0098, # LATIN CAPITAL LETTER I WITH GRAVE + 0x00cd: 0x008b, # LATIN CAPITAL LETTER I WITH ACUTE + 0x00d1: 0x00a5, # LATIN CAPITAL LETTER N WITH TILDE + 0x00d2: 0x00a9, # LATIN CAPITAL LETTER O WITH GRAVE + 0x00d3: 0x009f, # LATIN CAPITAL LETTER O WITH ACUTE + 0x00d4: 0x008c, # LATIN CAPITAL LETTER O WITH CIRCUMFLEX + 0x00d5: 0x0099, # LATIN CAPITAL LETTER O WITH TILDE + 0x00d9: 0x009d, # LATIN CAPITAL LETTER U WITH GRAVE + 0x00da: 0x0096, # LATIN CAPITAL LETTER U WITH ACUTE + 0x00dc: 0x009a, # LATIN CAPITAL LETTER U WITH DIAERESIS + 0x00df: 0x00e1, # LATIN SMALL LETTER SHARP S + 0x00e0: 0x0085, # LATIN SMALL LETTER A WITH GRAVE + 0x00e1: 0x00a0, # LATIN SMALL LETTER A WITH ACUTE + 0x00e2: 0x0083, # LATIN SMALL LETTER A WITH CIRCUMFLEX + 0x00e3: 0x0084, # LATIN SMALL LETTER A WITH TILDE + 0x00e7: 0x0087, # LATIN SMALL LETTER C WITH CEDILLA + 0x00e8: 0x008a, # LATIN SMALL LETTER E WITH GRAVE + 0x00e9: 0x0082, # LATIN SMALL LETTER E WITH ACUTE + 0x00ea: 0x0088, # LATIN SMALL LETTER E WITH CIRCUMFLEX + 0x00ec: 0x008d, # LATIN SMALL LETTER I WITH GRAVE + 0x00ed: 0x00a1, # LATIN SMALL LETTER I WITH ACUTE + 0x00f1: 0x00a4, # LATIN SMALL LETTER N WITH TILDE + 0x00f2: 0x0095, # LATIN SMALL LETTER O WITH GRAVE + 0x00f3: 0x00a2, # LATIN SMALL LETTER O WITH ACUTE + 0x00f4: 0x0093, # LATIN SMALL LETTER O WITH CIRCUMFLEX + 0x00f5: 0x0094, # LATIN SMALL LETTER O WITH TILDE + 0x00f7: 0x00f6, # DIVISION SIGN + 0x00f9: 0x0097, # LATIN SMALL LETTER U WITH GRAVE + 0x00fa: 0x00a3, # LATIN SMALL LETTER U WITH ACUTE + 0x00fc: 0x0081, # LATIN SMALL LETTER U WITH DIAERESIS + 0x0393: 0x00e2, # GREEK CAPITAL LETTER GAMMA + 0x0398: 0x00e9, # GREEK CAPITAL LETTER THETA + 0x03a3: 0x00e4, # GREEK CAPITAL LETTER SIGMA + 0x03a6: 0x00e8, # GREEK CAPITAL LETTER PHI + 0x03a9: 0x00ea, # GREEK CAPITAL LETTER OMEGA + 0x03b1: 0x00e0, # GREEK SMALL LETTER ALPHA + 0x03b4: 0x00eb, # GREEK SMALL LETTER DELTA + 0x03b5: 0x00ee, # GREEK SMALL LETTER EPSILON + 0x03c0: 0x00e3, # GREEK SMALL LETTER PI + 0x03c3: 0x00e5, # GREEK SMALL LETTER SIGMA + 0x03c4: 0x00e7, # GREEK SMALL LETTER TAU + 0x03c6: 0x00ed, # GREEK SMALL LETTER PHI + 0x207f: 0x00fc, # SUPERSCRIPT LATIN SMALL LETTER N + 0x20a7: 0x009e, # PESETA SIGN + 0x2219: 0x00f9, # BULLET OPERATOR + 0x221a: 0x00fb, # SQUARE ROOT + 0x221e: 0x00ec, # INFINITY + 0x2229: 0x00ef, # INTERSECTION + 0x2248: 0x00f7, # ALMOST EQUAL TO + 0x2261: 0x00f0, # IDENTICAL TO + 0x2264: 0x00f3, # LESS-THAN OR EQUAL TO + 0x2265: 0x00f2, # GREATER-THAN OR EQUAL TO + 0x2320: 0x00f4, # TOP HALF INTEGRAL + 0x2321: 0x00f5, # BOTTOM HALF INTEGRAL + 0x2500: 0x00c4, # BOX DRAWINGS LIGHT HORIZONTAL + 0x2502: 0x00b3, # BOX DRAWINGS LIGHT VERTICAL + 0x250c: 0x00da, # BOX DRAWINGS LIGHT DOWN AND RIGHT + 0x2510: 0x00bf, # BOX DRAWINGS LIGHT DOWN AND LEFT + 0x2514: 0x00c0, # BOX DRAWINGS LIGHT UP AND RIGHT + 0x2518: 0x00d9, # BOX DRAWINGS LIGHT UP AND LEFT + 0x251c: 0x00c3, # BOX DRAWINGS LIGHT VERTICAL AND RIGHT + 0x2524: 0x00b4, # BOX DRAWINGS LIGHT VERTICAL AND LEFT + 0x252c: 0x00c2, # BOX DRAWINGS LIGHT DOWN AND HORIZONTAL + 0x2534: 0x00c1, # BOX DRAWINGS LIGHT UP AND HORIZONTAL + 0x253c: 0x00c5, # BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL + 0x2550: 0x00cd, # BOX DRAWINGS DOUBLE HORIZONTAL + 0x2551: 0x00ba, # BOX DRAWINGS DOUBLE VERTICAL + 0x2552: 0x00d5, # BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE + 0x2553: 0x00d6, # BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE + 0x2554: 0x00c9, # BOX DRAWINGS DOUBLE DOWN AND RIGHT + 0x2555: 0x00b8, # BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE + 0x2556: 0x00b7, # BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE + 0x2557: 0x00bb, # BOX DRAWINGS DOUBLE DOWN AND LEFT + 0x2558: 0x00d4, # BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE + 0x2559: 0x00d3, # BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE + 0x255a: 0x00c8, # BOX DRAWINGS DOUBLE UP AND RIGHT + 0x255b: 0x00be, # BOX DRAWINGS UP SINGLE AND LEFT DOUBLE + 0x255c: 0x00bd, # BOX DRAWINGS UP DOUBLE AND LEFT SINGLE + 0x255d: 0x00bc, # BOX DRAWINGS DOUBLE UP AND LEFT + 0x255e: 0x00c6, # BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE + 0x255f: 0x00c7, # BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE + 0x2560: 0x00cc, # BOX DRAWINGS DOUBLE VERTICAL AND RIGHT + 0x2561: 0x00b5, # BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE + 0x2562: 0x00b6, # BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE + 0x2563: 0x00b9, # BOX DRAWINGS DOUBLE VERTICAL AND LEFT + 0x2564: 0x00d1, # BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE + 0x2565: 0x00d2, # BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE + 0x2566: 0x00cb, # BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL + 0x2567: 0x00cf, # BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE + 0x2568: 0x00d0, # BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE + 0x2569: 0x00ca, # BOX DRAWINGS DOUBLE UP AND HORIZONTAL + 0x256a: 0x00d8, # BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE + 0x256b: 0x00d7, # BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE + 0x256c: 0x00ce, # BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL + 0x2580: 0x00df, # UPPER HALF BLOCK + 0x2584: 0x00dc, # LOWER HALF BLOCK + 0x2588: 0x00db, # FULL BLOCK + 0x258c: 0x00dd, # LEFT HALF BLOCK + 0x2590: 0x00de, # RIGHT HALF BLOCK + 0x2591: 0x00b0, # LIGHT SHADE + 0x2592: 0x00b1, # MEDIUM SHADE + 0x2593: 0x00b2, # DARK SHADE + 0x25a0: 0x00fe, # BLACK SQUARE +} diff --git a/env/Lib/encodings/cp861.py b/env/Lib/encodings/cp861.py new file mode 100644 index 0000000..860a05f --- /dev/null +++ b/env/Lib/encodings/cp861.py @@ -0,0 +1,698 @@ +""" Python Character Mapping Codec generated from 'VENDORS/MICSFT/PC/CP861.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_map) + + 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_map)[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='cp861', + 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: 0x00c7, # LATIN CAPITAL LETTER C WITH CEDILLA + 0x0081: 0x00fc, # LATIN SMALL LETTER U WITH DIAERESIS + 0x0082: 0x00e9, # LATIN SMALL LETTER E WITH ACUTE + 0x0083: 0x00e2, # LATIN SMALL LETTER A WITH CIRCUMFLEX + 0x0084: 0x00e4, # LATIN SMALL LETTER A WITH DIAERESIS + 0x0085: 0x00e0, # LATIN SMALL LETTER A WITH GRAVE + 0x0086: 0x00e5, # LATIN SMALL LETTER A WITH RING ABOVE + 0x0087: 0x00e7, # LATIN SMALL LETTER C WITH CEDILLA + 0x0088: 0x00ea, # LATIN SMALL LETTER E WITH CIRCUMFLEX + 0x0089: 0x00eb, # LATIN SMALL LETTER E WITH DIAERESIS + 0x008a: 0x00e8, # LATIN SMALL LETTER E WITH GRAVE + 0x008b: 0x00d0, # LATIN CAPITAL LETTER ETH + 0x008c: 0x00f0, # LATIN SMALL LETTER ETH + 0x008d: 0x00de, # LATIN CAPITAL LETTER THORN + 0x008e: 0x00c4, # LATIN CAPITAL LETTER A WITH DIAERESIS + 0x008f: 0x00c5, # LATIN CAPITAL LETTER A WITH RING ABOVE + 0x0090: 0x00c9, # LATIN CAPITAL LETTER E WITH ACUTE + 0x0091: 0x00e6, # LATIN SMALL LIGATURE AE + 0x0092: 0x00c6, # LATIN CAPITAL LIGATURE AE + 0x0093: 0x00f4, # LATIN SMALL LETTER O WITH CIRCUMFLEX + 0x0094: 0x00f6, # LATIN SMALL LETTER O WITH DIAERESIS + 0x0095: 0x00fe, # LATIN SMALL LETTER THORN + 0x0096: 0x00fb, # LATIN SMALL LETTER U WITH CIRCUMFLEX + 0x0097: 0x00dd, # LATIN CAPITAL LETTER Y WITH ACUTE + 0x0098: 0x00fd, # LATIN SMALL LETTER Y WITH ACUTE + 0x0099: 0x00d6, # LATIN CAPITAL LETTER O WITH DIAERESIS + 0x009a: 0x00dc, # LATIN CAPITAL LETTER U WITH DIAERESIS + 0x009b: 0x00f8, # LATIN SMALL LETTER O WITH STROKE + 0x009c: 0x00a3, # POUND SIGN + 0x009d: 0x00d8, # LATIN CAPITAL LETTER O WITH STROKE + 0x009e: 0x20a7, # PESETA SIGN + 0x009f: 0x0192, # LATIN SMALL LETTER F WITH HOOK + 0x00a0: 0x00e1, # LATIN SMALL LETTER A WITH ACUTE + 0x00a1: 0x00ed, # LATIN SMALL LETTER I WITH ACUTE + 0x00a2: 0x00f3, # LATIN SMALL LETTER O WITH ACUTE + 0x00a3: 0x00fa, # LATIN SMALL LETTER U WITH ACUTE + 0x00a4: 0x00c1, # LATIN CAPITAL LETTER A WITH ACUTE + 0x00a5: 0x00cd, # LATIN CAPITAL LETTER I WITH ACUTE + 0x00a6: 0x00d3, # LATIN CAPITAL LETTER O WITH ACUTE + 0x00a7: 0x00da, # LATIN CAPITAL LETTER U WITH ACUTE + 0x00a8: 0x00bf, # INVERTED QUESTION MARK + 0x00a9: 0x2310, # REVERSED NOT SIGN + 0x00aa: 0x00ac, # NOT SIGN + 0x00ab: 0x00bd, # VULGAR FRACTION ONE HALF + 0x00ac: 0x00bc, # VULGAR FRACTION ONE QUARTER + 0x00ad: 0x00a1, # INVERTED EXCLAMATION MARK + 0x00ae: 0x00ab, # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00af: 0x00bb, # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00b0: 0x2591, # LIGHT SHADE + 0x00b1: 0x2592, # MEDIUM SHADE + 0x00b2: 0x2593, # DARK SHADE + 0x00b3: 0x2502, # BOX DRAWINGS LIGHT VERTICAL + 0x00b4: 0x2524, # BOX DRAWINGS LIGHT VERTICAL AND LEFT + 0x00b5: 0x2561, # BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE + 0x00b6: 0x2562, # BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE + 0x00b7: 0x2556, # BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE + 0x00b8: 0x2555, # BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE + 0x00b9: 0x2563, # BOX DRAWINGS DOUBLE VERTICAL AND LEFT + 0x00ba: 0x2551, # BOX DRAWINGS DOUBLE VERTICAL + 0x00bb: 0x2557, # BOX DRAWINGS DOUBLE DOWN AND LEFT + 0x00bc: 0x255d, # BOX DRAWINGS DOUBLE UP AND LEFT + 0x00bd: 0x255c, # BOX DRAWINGS UP DOUBLE AND LEFT SINGLE + 0x00be: 0x255b, # BOX DRAWINGS UP SINGLE AND LEFT DOUBLE + 0x00bf: 0x2510, # BOX DRAWINGS LIGHT DOWN AND LEFT + 0x00c0: 0x2514, # BOX DRAWINGS LIGHT UP AND RIGHT + 0x00c1: 0x2534, # BOX DRAWINGS LIGHT UP AND HORIZONTAL + 0x00c2: 0x252c, # BOX DRAWINGS LIGHT DOWN AND HORIZONTAL + 0x00c3: 0x251c, # BOX DRAWINGS LIGHT VERTICAL AND RIGHT + 0x00c4: 0x2500, # BOX DRAWINGS LIGHT HORIZONTAL + 0x00c5: 0x253c, # BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL + 0x00c6: 0x255e, # BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE + 0x00c7: 0x255f, # BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE + 0x00c8: 0x255a, # BOX DRAWINGS DOUBLE UP AND RIGHT + 0x00c9: 0x2554, # BOX DRAWINGS DOUBLE DOWN AND RIGHT + 0x00ca: 0x2569, # BOX DRAWINGS DOUBLE UP AND HORIZONTAL + 0x00cb: 0x2566, # BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL + 0x00cc: 0x2560, # BOX DRAWINGS DOUBLE VERTICAL AND RIGHT + 0x00cd: 0x2550, # BOX DRAWINGS DOUBLE HORIZONTAL + 0x00ce: 0x256c, # BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL + 0x00cf: 0x2567, # BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE + 0x00d0: 0x2568, # BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE + 0x00d1: 0x2564, # BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE + 0x00d2: 0x2565, # BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE + 0x00d3: 0x2559, # BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE + 0x00d4: 0x2558, # BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE + 0x00d5: 0x2552, # BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE + 0x00d6: 0x2553, # BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE + 0x00d7: 0x256b, # BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE + 0x00d8: 0x256a, # BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE + 0x00d9: 0x2518, # BOX DRAWINGS LIGHT UP AND LEFT + 0x00da: 0x250c, # BOX DRAWINGS LIGHT DOWN AND RIGHT + 0x00db: 0x2588, # FULL BLOCK + 0x00dc: 0x2584, # LOWER HALF BLOCK + 0x00dd: 0x258c, # LEFT HALF BLOCK + 0x00de: 0x2590, # RIGHT HALF BLOCK + 0x00df: 0x2580, # UPPER HALF BLOCK + 0x00e0: 0x03b1, # GREEK SMALL LETTER ALPHA + 0x00e1: 0x00df, # LATIN SMALL LETTER SHARP S + 0x00e2: 0x0393, # GREEK CAPITAL LETTER GAMMA + 0x00e3: 0x03c0, # GREEK SMALL LETTER PI + 0x00e4: 0x03a3, # GREEK CAPITAL LETTER SIGMA + 0x00e5: 0x03c3, # GREEK SMALL LETTER SIGMA + 0x00e6: 0x00b5, # MICRO SIGN + 0x00e7: 0x03c4, # GREEK SMALL LETTER TAU + 0x00e8: 0x03a6, # GREEK CAPITAL LETTER PHI + 0x00e9: 0x0398, # GREEK CAPITAL LETTER THETA + 0x00ea: 0x03a9, # GREEK CAPITAL LETTER OMEGA + 0x00eb: 0x03b4, # GREEK SMALL LETTER DELTA + 0x00ec: 0x221e, # INFINITY + 0x00ed: 0x03c6, # GREEK SMALL LETTER PHI + 0x00ee: 0x03b5, # GREEK SMALL LETTER EPSILON + 0x00ef: 0x2229, # INTERSECTION + 0x00f0: 0x2261, # IDENTICAL TO + 0x00f1: 0x00b1, # PLUS-MINUS SIGN + 0x00f2: 0x2265, # GREATER-THAN OR EQUAL TO + 0x00f3: 0x2264, # LESS-THAN OR EQUAL TO + 0x00f4: 0x2320, # TOP HALF INTEGRAL + 0x00f5: 0x2321, # BOTTOM HALF INTEGRAL + 0x00f6: 0x00f7, # DIVISION SIGN + 0x00f7: 0x2248, # ALMOST EQUAL TO + 0x00f8: 0x00b0, # DEGREE SIGN + 0x00f9: 0x2219, # BULLET OPERATOR + 0x00fa: 0x00b7, # MIDDLE DOT + 0x00fb: 0x221a, # SQUARE ROOT + 0x00fc: 0x207f, # SUPERSCRIPT LATIN SMALL LETTER N + 0x00fd: 0x00b2, # SUPERSCRIPT TWO + 0x00fe: 0x25a0, # BLACK SQUARE + 0x00ff: 0x00a0, # NO-BREAK SPACE +}) + +### Decoding Table + +decoding_table = ( + '\x00' # 0x0000 -> NULL + '\x01' # 0x0001 -> START OF HEADING + '\x02' # 0x0002 -> START OF TEXT + '\x03' # 0x0003 -> END OF TEXT + '\x04' # 0x0004 -> END OF TRANSMISSION + '\x05' # 0x0005 -> ENQUIRY + '\x06' # 0x0006 -> ACKNOWLEDGE + '\x07' # 0x0007 -> BELL + '\x08' # 0x0008 -> BACKSPACE + '\t' # 0x0009 -> HORIZONTAL TABULATION + '\n' # 0x000a -> LINE FEED + '\x0b' # 0x000b -> VERTICAL TABULATION + '\x0c' # 0x000c -> FORM FEED + '\r' # 0x000d -> CARRIAGE RETURN + '\x0e' # 0x000e -> SHIFT OUT + '\x0f' # 0x000f -> SHIFT IN + '\x10' # 0x0010 -> DATA LINK ESCAPE + '\x11' # 0x0011 -> DEVICE CONTROL ONE + '\x12' # 0x0012 -> DEVICE CONTROL TWO + '\x13' # 0x0013 -> DEVICE CONTROL THREE + '\x14' # 0x0014 -> DEVICE CONTROL FOUR + '\x15' # 0x0015 -> NEGATIVE ACKNOWLEDGE + '\x16' # 0x0016 -> SYNCHRONOUS IDLE + '\x17' # 0x0017 -> END OF TRANSMISSION BLOCK + '\x18' # 0x0018 -> CANCEL + '\x19' # 0x0019 -> END OF MEDIUM + '\x1a' # 0x001a -> SUBSTITUTE + '\x1b' # 0x001b -> ESCAPE + '\x1c' # 0x001c -> FILE SEPARATOR + '\x1d' # 0x001d -> GROUP SEPARATOR + '\x1e' # 0x001e -> RECORD SEPARATOR + '\x1f' # 0x001f -> UNIT SEPARATOR + ' ' # 0x0020 -> SPACE + '!' # 0x0021 -> EXCLAMATION MARK + '"' # 0x0022 -> QUOTATION MARK + '#' # 0x0023 -> NUMBER SIGN + '$' # 0x0024 -> DOLLAR SIGN + '%' # 0x0025 -> PERCENT SIGN + '&' # 0x0026 -> AMPERSAND + "'" # 0x0027 -> APOSTROPHE + '(' # 0x0028 -> LEFT PARENTHESIS + ')' # 0x0029 -> RIGHT PARENTHESIS + '*' # 0x002a -> ASTERISK + '+' # 0x002b -> PLUS SIGN + ',' # 0x002c -> COMMA + '-' # 0x002d -> HYPHEN-MINUS + '.' # 0x002e -> FULL STOP + '/' # 0x002f -> SOLIDUS + '0' # 0x0030 -> DIGIT ZERO + '1' # 0x0031 -> DIGIT ONE + '2' # 0x0032 -> DIGIT TWO + '3' # 0x0033 -> DIGIT THREE + '4' # 0x0034 -> DIGIT FOUR + '5' # 0x0035 -> DIGIT FIVE + '6' # 0x0036 -> DIGIT SIX + '7' # 0x0037 -> DIGIT SEVEN + '8' # 0x0038 -> DIGIT EIGHT + '9' # 0x0039 -> DIGIT NINE + ':' # 0x003a -> COLON + ';' # 0x003b -> SEMICOLON + '<' # 0x003c -> LESS-THAN SIGN + '=' # 0x003d -> EQUALS SIGN + '>' # 0x003e -> GREATER-THAN SIGN + '?' # 0x003f -> QUESTION MARK + '@' # 0x0040 -> COMMERCIAL AT + 'A' # 0x0041 -> LATIN CAPITAL LETTER A + 'B' # 0x0042 -> LATIN CAPITAL LETTER B + 'C' # 0x0043 -> LATIN CAPITAL LETTER C + 'D' # 0x0044 -> LATIN CAPITAL LETTER D + 'E' # 0x0045 -> LATIN CAPITAL LETTER E + 'F' # 0x0046 -> LATIN CAPITAL LETTER F + 'G' # 0x0047 -> LATIN CAPITAL LETTER G + 'H' # 0x0048 -> LATIN CAPITAL LETTER H + 'I' # 0x0049 -> LATIN CAPITAL LETTER I + 'J' # 0x004a -> LATIN CAPITAL LETTER J + 'K' # 0x004b -> LATIN CAPITAL LETTER K + 'L' # 0x004c -> LATIN CAPITAL LETTER L + 'M' # 0x004d -> LATIN CAPITAL LETTER M + 'N' # 0x004e -> LATIN CAPITAL LETTER N + 'O' # 0x004f -> LATIN CAPITAL LETTER O + 'P' # 0x0050 -> LATIN CAPITAL LETTER P + 'Q' # 0x0051 -> LATIN CAPITAL LETTER Q + 'R' # 0x0052 -> LATIN CAPITAL LETTER R + 'S' # 0x0053 -> LATIN CAPITAL LETTER S + 'T' # 0x0054 -> LATIN CAPITAL LETTER T + 'U' # 0x0055 -> LATIN CAPITAL LETTER U + 'V' # 0x0056 -> LATIN CAPITAL LETTER V + 'W' # 0x0057 -> LATIN CAPITAL LETTER W + 'X' # 0x0058 -> LATIN CAPITAL LETTER X + 'Y' # 0x0059 -> LATIN CAPITAL LETTER Y + 'Z' # 0x005a -> LATIN CAPITAL LETTER Z + '[' # 0x005b -> LEFT SQUARE BRACKET + '\\' # 0x005c -> REVERSE SOLIDUS + ']' # 0x005d -> RIGHT SQUARE BRACKET + '^' # 0x005e -> CIRCUMFLEX ACCENT + '_' # 0x005f -> LOW LINE + '`' # 0x0060 -> GRAVE ACCENT + 'a' # 0x0061 -> LATIN SMALL LETTER A + 'b' # 0x0062 -> LATIN SMALL LETTER B + 'c' # 0x0063 -> LATIN SMALL LETTER C + 'd' # 0x0064 -> LATIN SMALL LETTER D + 'e' # 0x0065 -> LATIN SMALL LETTER E + 'f' # 0x0066 -> LATIN SMALL LETTER F + 'g' # 0x0067 -> LATIN SMALL LETTER G + 'h' # 0x0068 -> LATIN SMALL LETTER H + 'i' # 0x0069 -> LATIN SMALL LETTER I + 'j' # 0x006a -> LATIN SMALL LETTER J + 'k' # 0x006b -> LATIN SMALL LETTER K + 'l' # 0x006c -> LATIN SMALL LETTER L + 'm' # 0x006d -> LATIN SMALL LETTER M + 'n' # 0x006e -> LATIN SMALL LETTER N + 'o' # 0x006f -> LATIN SMALL LETTER O + 'p' # 0x0070 -> LATIN SMALL LETTER P + 'q' # 0x0071 -> LATIN SMALL LETTER Q + 'r' # 0x0072 -> LATIN SMALL LETTER R + 's' # 0x0073 -> LATIN SMALL LETTER S + 't' # 0x0074 -> LATIN SMALL LETTER T + 'u' # 0x0075 -> LATIN SMALL LETTER U + 'v' # 0x0076 -> LATIN SMALL LETTER V + 'w' # 0x0077 -> LATIN SMALL LETTER W + 'x' # 0x0078 -> LATIN SMALL LETTER X + 'y' # 0x0079 -> LATIN SMALL LETTER Y + 'z' # 0x007a -> LATIN SMALL LETTER Z + '{' # 0x007b -> LEFT CURLY BRACKET + '|' # 0x007c -> VERTICAL LINE + '}' # 0x007d -> RIGHT CURLY BRACKET + '~' # 0x007e -> TILDE + '\x7f' # 0x007f -> DELETE + '\xc7' # 0x0080 -> LATIN CAPITAL LETTER C WITH CEDILLA + '\xfc' # 0x0081 -> LATIN SMALL LETTER U WITH DIAERESIS + '\xe9' # 0x0082 -> LATIN SMALL LETTER E WITH ACUTE + '\xe2' # 0x0083 -> LATIN SMALL LETTER A WITH CIRCUMFLEX + '\xe4' # 0x0084 -> LATIN SMALL LETTER A WITH DIAERESIS + '\xe0' # 0x0085 -> LATIN SMALL LETTER A WITH GRAVE + '\xe5' # 0x0086 -> LATIN SMALL LETTER A WITH RING ABOVE + '\xe7' # 0x0087 -> LATIN SMALL LETTER C WITH CEDILLA + '\xea' # 0x0088 -> LATIN SMALL LETTER E WITH CIRCUMFLEX + '\xeb' # 0x0089 -> LATIN SMALL LETTER E WITH DIAERESIS + '\xe8' # 0x008a -> LATIN SMALL LETTER E WITH GRAVE + '\xd0' # 0x008b -> LATIN CAPITAL LETTER ETH + '\xf0' # 0x008c -> LATIN SMALL LETTER ETH + '\xde' # 0x008d -> LATIN CAPITAL LETTER THORN + '\xc4' # 0x008e -> LATIN CAPITAL LETTER A WITH DIAERESIS + '\xc5' # 0x008f -> LATIN CAPITAL LETTER A WITH RING ABOVE + '\xc9' # 0x0090 -> LATIN CAPITAL LETTER E WITH ACUTE + '\xe6' # 0x0091 -> LATIN SMALL LIGATURE AE + '\xc6' # 0x0092 -> LATIN CAPITAL LIGATURE AE + '\xf4' # 0x0093 -> LATIN SMALL LETTER O WITH CIRCUMFLEX + '\xf6' # 0x0094 -> LATIN SMALL LETTER O WITH DIAERESIS + '\xfe' # 0x0095 -> LATIN SMALL LETTER THORN + '\xfb' # 0x0096 -> LATIN SMALL LETTER U WITH CIRCUMFLEX + '\xdd' # 0x0097 -> LATIN CAPITAL LETTER Y WITH ACUTE + '\xfd' # 0x0098 -> LATIN SMALL LETTER Y WITH ACUTE + '\xd6' # 0x0099 -> LATIN CAPITAL LETTER O WITH DIAERESIS + '\xdc' # 0x009a -> LATIN CAPITAL LETTER U WITH DIAERESIS + '\xf8' # 0x009b -> LATIN SMALL LETTER O WITH STROKE + '\xa3' # 0x009c -> POUND SIGN + '\xd8' # 0x009d -> LATIN CAPITAL LETTER O WITH STROKE + '\u20a7' # 0x009e -> PESETA SIGN + '\u0192' # 0x009f -> LATIN SMALL LETTER F WITH HOOK + '\xe1' # 0x00a0 -> LATIN SMALL LETTER A WITH ACUTE + '\xed' # 0x00a1 -> LATIN SMALL LETTER I WITH ACUTE + '\xf3' # 0x00a2 -> LATIN SMALL LETTER O WITH ACUTE + '\xfa' # 0x00a3 -> LATIN SMALL LETTER U WITH ACUTE + '\xc1' # 0x00a4 -> LATIN CAPITAL LETTER A WITH ACUTE + '\xcd' # 0x00a5 -> LATIN CAPITAL LETTER I WITH ACUTE + '\xd3' # 0x00a6 -> LATIN CAPITAL LETTER O WITH ACUTE + '\xda' # 0x00a7 -> LATIN CAPITAL LETTER U WITH ACUTE + '\xbf' # 0x00a8 -> INVERTED QUESTION MARK + '\u2310' # 0x00a9 -> REVERSED NOT SIGN + '\xac' # 0x00aa -> NOT SIGN + '\xbd' # 0x00ab -> VULGAR FRACTION ONE HALF + '\xbc' # 0x00ac -> VULGAR FRACTION ONE QUARTER + '\xa1' # 0x00ad -> INVERTED EXCLAMATION MARK + '\xab' # 0x00ae -> LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + '\xbb' # 0x00af -> RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + '\u2591' # 0x00b0 -> LIGHT SHADE + '\u2592' # 0x00b1 -> MEDIUM SHADE + '\u2593' # 0x00b2 -> DARK SHADE + '\u2502' # 0x00b3 -> BOX DRAWINGS LIGHT VERTICAL + '\u2524' # 0x00b4 -> BOX DRAWINGS LIGHT VERTICAL AND LEFT + '\u2561' # 0x00b5 -> BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE + '\u2562' # 0x00b6 -> BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE + '\u2556' # 0x00b7 -> BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE + '\u2555' # 0x00b8 -> BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE + '\u2563' # 0x00b9 -> BOX DRAWINGS DOUBLE VERTICAL AND LEFT + '\u2551' # 0x00ba -> BOX DRAWINGS DOUBLE VERTICAL + '\u2557' # 0x00bb -> BOX DRAWINGS DOUBLE DOWN AND LEFT + '\u255d' # 0x00bc -> BOX DRAWINGS DOUBLE UP AND LEFT + '\u255c' # 0x00bd -> BOX DRAWINGS UP DOUBLE AND LEFT SINGLE + '\u255b' # 0x00be -> BOX DRAWINGS UP SINGLE AND LEFT DOUBLE + '\u2510' # 0x00bf -> BOX DRAWINGS LIGHT DOWN AND LEFT + '\u2514' # 0x00c0 -> BOX DRAWINGS LIGHT UP AND RIGHT + '\u2534' # 0x00c1 -> BOX DRAWINGS LIGHT UP AND HORIZONTAL + '\u252c' # 0x00c2 -> BOX DRAWINGS LIGHT DOWN AND HORIZONTAL + '\u251c' # 0x00c3 -> BOX DRAWINGS LIGHT VERTICAL AND RIGHT + '\u2500' # 0x00c4 -> BOX DRAWINGS LIGHT HORIZONTAL + '\u253c' # 0x00c5 -> BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL + '\u255e' # 0x00c6 -> BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE + '\u255f' # 0x00c7 -> BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE + '\u255a' # 0x00c8 -> BOX DRAWINGS DOUBLE UP AND RIGHT + '\u2554' # 0x00c9 -> BOX DRAWINGS DOUBLE DOWN AND RIGHT + '\u2569' # 0x00ca -> BOX DRAWINGS DOUBLE UP AND HORIZONTAL + '\u2566' # 0x00cb -> BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL + '\u2560' # 0x00cc -> BOX DRAWINGS DOUBLE VERTICAL AND RIGHT + '\u2550' # 0x00cd -> BOX DRAWINGS DOUBLE HORIZONTAL + '\u256c' # 0x00ce -> BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL + '\u2567' # 0x00cf -> BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE + '\u2568' # 0x00d0 -> BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE + '\u2564' # 0x00d1 -> BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE + '\u2565' # 0x00d2 -> BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE + '\u2559' # 0x00d3 -> BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE + '\u2558' # 0x00d4 -> BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE + '\u2552' # 0x00d5 -> BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE + '\u2553' # 0x00d6 -> BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE + '\u256b' # 0x00d7 -> BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE + '\u256a' # 0x00d8 -> BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE + '\u2518' # 0x00d9 -> BOX DRAWINGS LIGHT UP AND LEFT + '\u250c' # 0x00da -> BOX DRAWINGS LIGHT DOWN AND RIGHT + '\u2588' # 0x00db -> FULL BLOCK + '\u2584' # 0x00dc -> LOWER HALF BLOCK + '\u258c' # 0x00dd -> LEFT HALF BLOCK + '\u2590' # 0x00de -> RIGHT HALF BLOCK + '\u2580' # 0x00df -> UPPER HALF BLOCK + '\u03b1' # 0x00e0 -> GREEK SMALL LETTER ALPHA + '\xdf' # 0x00e1 -> LATIN SMALL LETTER SHARP S + '\u0393' # 0x00e2 -> GREEK CAPITAL LETTER GAMMA + '\u03c0' # 0x00e3 -> GREEK SMALL LETTER PI + '\u03a3' # 0x00e4 -> GREEK CAPITAL LETTER SIGMA + '\u03c3' # 0x00e5 -> GREEK SMALL LETTER SIGMA + '\xb5' # 0x00e6 -> MICRO SIGN + '\u03c4' # 0x00e7 -> GREEK SMALL LETTER TAU + '\u03a6' # 0x00e8 -> GREEK CAPITAL LETTER PHI + '\u0398' # 0x00e9 -> GREEK CAPITAL LETTER THETA + '\u03a9' # 0x00ea -> GREEK CAPITAL LETTER OMEGA + '\u03b4' # 0x00eb -> GREEK SMALL LETTER DELTA + '\u221e' # 0x00ec -> INFINITY + '\u03c6' # 0x00ed -> GREEK SMALL LETTER PHI + '\u03b5' # 0x00ee -> GREEK SMALL LETTER EPSILON + '\u2229' # 0x00ef -> INTERSECTION + '\u2261' # 0x00f0 -> IDENTICAL TO + '\xb1' # 0x00f1 -> PLUS-MINUS SIGN + '\u2265' # 0x00f2 -> GREATER-THAN OR EQUAL TO + '\u2264' # 0x00f3 -> LESS-THAN OR EQUAL TO + '\u2320' # 0x00f4 -> TOP HALF INTEGRAL + '\u2321' # 0x00f5 -> BOTTOM HALF INTEGRAL + '\xf7' # 0x00f6 -> DIVISION SIGN + '\u2248' # 0x00f7 -> ALMOST EQUAL TO + '\xb0' # 0x00f8 -> DEGREE SIGN + '\u2219' # 0x00f9 -> BULLET OPERATOR + '\xb7' # 0x00fa -> MIDDLE DOT + '\u221a' # 0x00fb -> SQUARE ROOT + '\u207f' # 0x00fc -> SUPERSCRIPT LATIN SMALL LETTER N + '\xb2' # 0x00fd -> SUPERSCRIPT TWO + '\u25a0' # 0x00fe -> BLACK SQUARE + '\xa0' # 0x00ff -> NO-BREAK SPACE +) + +### Encoding Map + +encoding_map = { + 0x0000: 0x0000, # NULL + 0x0001: 0x0001, # START OF HEADING + 0x0002: 0x0002, # START OF TEXT + 0x0003: 0x0003, # END OF TEXT + 0x0004: 0x0004, # END OF TRANSMISSION + 0x0005: 0x0005, # ENQUIRY + 0x0006: 0x0006, # ACKNOWLEDGE + 0x0007: 0x0007, # BELL + 0x0008: 0x0008, # BACKSPACE + 0x0009: 0x0009, # HORIZONTAL TABULATION + 0x000a: 0x000a, # LINE FEED + 0x000b: 0x000b, # VERTICAL TABULATION + 0x000c: 0x000c, # FORM FEED + 0x000d: 0x000d, # CARRIAGE RETURN + 0x000e: 0x000e, # SHIFT OUT + 0x000f: 0x000f, # SHIFT IN + 0x0010: 0x0010, # DATA LINK ESCAPE + 0x0011: 0x0011, # DEVICE CONTROL ONE + 0x0012: 0x0012, # DEVICE CONTROL TWO + 0x0013: 0x0013, # DEVICE CONTROL THREE + 0x0014: 0x0014, # DEVICE CONTROL FOUR + 0x0015: 0x0015, # NEGATIVE ACKNOWLEDGE + 0x0016: 0x0016, # SYNCHRONOUS IDLE + 0x0017: 0x0017, # END OF TRANSMISSION BLOCK + 0x0018: 0x0018, # CANCEL + 0x0019: 0x0019, # END OF MEDIUM + 0x001a: 0x001a, # SUBSTITUTE + 0x001b: 0x001b, # ESCAPE + 0x001c: 0x001c, # FILE SEPARATOR + 0x001d: 0x001d, # GROUP SEPARATOR + 0x001e: 0x001e, # RECORD SEPARATOR + 0x001f: 0x001f, # UNIT SEPARATOR + 0x0020: 0x0020, # SPACE + 0x0021: 0x0021, # EXCLAMATION MARK + 0x0022: 0x0022, # QUOTATION MARK + 0x0023: 0x0023, # NUMBER SIGN + 0x0024: 0x0024, # DOLLAR SIGN + 0x0025: 0x0025, # PERCENT SIGN + 0x0026: 0x0026, # AMPERSAND + 0x0027: 0x0027, # APOSTROPHE + 0x0028: 0x0028, # LEFT PARENTHESIS + 0x0029: 0x0029, # RIGHT PARENTHESIS + 0x002a: 0x002a, # ASTERISK + 0x002b: 0x002b, # PLUS SIGN + 0x002c: 0x002c, # COMMA + 0x002d: 0x002d, # HYPHEN-MINUS + 0x002e: 0x002e, # FULL STOP + 0x002f: 0x002f, # SOLIDUS + 0x0030: 0x0030, # DIGIT ZERO + 0x0031: 0x0031, # DIGIT ONE + 0x0032: 0x0032, # DIGIT TWO + 0x0033: 0x0033, # DIGIT THREE + 0x0034: 0x0034, # DIGIT FOUR + 0x0035: 0x0035, # DIGIT FIVE + 0x0036: 0x0036, # DIGIT SIX + 0x0037: 0x0037, # DIGIT SEVEN + 0x0038: 0x0038, # DIGIT EIGHT + 0x0039: 0x0039, # DIGIT NINE + 0x003a: 0x003a, # COLON + 0x003b: 0x003b, # SEMICOLON + 0x003c: 0x003c, # LESS-THAN SIGN + 0x003d: 0x003d, # EQUALS SIGN + 0x003e: 0x003e, # GREATER-THAN SIGN + 0x003f: 0x003f, # QUESTION MARK + 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 + 0x005c: 0x005c, # REVERSE SOLIDUS + 0x005d: 0x005d, # RIGHT SQUARE BRACKET + 0x005e: 0x005e, # CIRCUMFLEX ACCENT + 0x005f: 0x005f, # LOW LINE + 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 + 0x007c: 0x007c, # VERTICAL LINE + 0x007d: 0x007d, # RIGHT CURLY BRACKET + 0x007e: 0x007e, # TILDE + 0x007f: 0x007f, # DELETE + 0x00a0: 0x00ff, # NO-BREAK SPACE + 0x00a1: 0x00ad, # INVERTED EXCLAMATION MARK + 0x00a3: 0x009c, # POUND SIGN + 0x00ab: 0x00ae, # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00ac: 0x00aa, # NOT SIGN + 0x00b0: 0x00f8, # DEGREE SIGN + 0x00b1: 0x00f1, # PLUS-MINUS SIGN + 0x00b2: 0x00fd, # SUPERSCRIPT TWO + 0x00b5: 0x00e6, # MICRO SIGN + 0x00b7: 0x00fa, # MIDDLE DOT + 0x00bb: 0x00af, # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00bc: 0x00ac, # VULGAR FRACTION ONE QUARTER + 0x00bd: 0x00ab, # VULGAR FRACTION ONE HALF + 0x00bf: 0x00a8, # INVERTED QUESTION MARK + 0x00c1: 0x00a4, # LATIN CAPITAL LETTER A WITH ACUTE + 0x00c4: 0x008e, # LATIN CAPITAL LETTER A WITH DIAERESIS + 0x00c5: 0x008f, # LATIN CAPITAL LETTER A WITH RING ABOVE + 0x00c6: 0x0092, # LATIN CAPITAL LIGATURE AE + 0x00c7: 0x0080, # LATIN CAPITAL LETTER C WITH CEDILLA + 0x00c9: 0x0090, # LATIN CAPITAL LETTER E WITH ACUTE + 0x00cd: 0x00a5, # LATIN CAPITAL LETTER I WITH ACUTE + 0x00d0: 0x008b, # LATIN CAPITAL LETTER ETH + 0x00d3: 0x00a6, # LATIN CAPITAL LETTER O WITH ACUTE + 0x00d6: 0x0099, # LATIN CAPITAL LETTER O WITH DIAERESIS + 0x00d8: 0x009d, # LATIN CAPITAL LETTER O WITH STROKE + 0x00da: 0x00a7, # LATIN CAPITAL LETTER U WITH ACUTE + 0x00dc: 0x009a, # LATIN CAPITAL LETTER U WITH DIAERESIS + 0x00dd: 0x0097, # LATIN CAPITAL LETTER Y WITH ACUTE + 0x00de: 0x008d, # LATIN CAPITAL LETTER THORN + 0x00df: 0x00e1, # LATIN SMALL LETTER SHARP S + 0x00e0: 0x0085, # LATIN SMALL LETTER A WITH GRAVE + 0x00e1: 0x00a0, # LATIN SMALL LETTER A WITH ACUTE + 0x00e2: 0x0083, # LATIN SMALL LETTER A WITH CIRCUMFLEX + 0x00e4: 0x0084, # LATIN SMALL LETTER A WITH DIAERESIS + 0x00e5: 0x0086, # LATIN SMALL LETTER A WITH RING ABOVE + 0x00e6: 0x0091, # LATIN SMALL LIGATURE AE + 0x00e7: 0x0087, # LATIN SMALL LETTER C WITH CEDILLA + 0x00e8: 0x008a, # LATIN SMALL LETTER E WITH GRAVE + 0x00e9: 0x0082, # LATIN SMALL LETTER E WITH ACUTE + 0x00ea: 0x0088, # LATIN SMALL LETTER E WITH CIRCUMFLEX + 0x00eb: 0x0089, # LATIN SMALL LETTER E WITH DIAERESIS + 0x00ed: 0x00a1, # LATIN SMALL LETTER I WITH ACUTE + 0x00f0: 0x008c, # LATIN SMALL LETTER ETH + 0x00f3: 0x00a2, # LATIN SMALL LETTER O WITH ACUTE + 0x00f4: 0x0093, # LATIN SMALL LETTER O WITH CIRCUMFLEX + 0x00f6: 0x0094, # LATIN SMALL LETTER O WITH DIAERESIS + 0x00f7: 0x00f6, # DIVISION SIGN + 0x00f8: 0x009b, # LATIN SMALL LETTER O WITH STROKE + 0x00fa: 0x00a3, # LATIN SMALL LETTER U WITH ACUTE + 0x00fb: 0x0096, # LATIN SMALL LETTER U WITH CIRCUMFLEX + 0x00fc: 0x0081, # LATIN SMALL LETTER U WITH DIAERESIS + 0x00fd: 0x0098, # LATIN SMALL LETTER Y WITH ACUTE + 0x00fe: 0x0095, # LATIN SMALL LETTER THORN + 0x0192: 0x009f, # LATIN SMALL LETTER F WITH HOOK + 0x0393: 0x00e2, # GREEK CAPITAL LETTER GAMMA + 0x0398: 0x00e9, # GREEK CAPITAL LETTER THETA + 0x03a3: 0x00e4, # GREEK CAPITAL LETTER SIGMA + 0x03a6: 0x00e8, # GREEK CAPITAL LETTER PHI + 0x03a9: 0x00ea, # GREEK CAPITAL LETTER OMEGA + 0x03b1: 0x00e0, # GREEK SMALL LETTER ALPHA + 0x03b4: 0x00eb, # GREEK SMALL LETTER DELTA + 0x03b5: 0x00ee, # GREEK SMALL LETTER EPSILON + 0x03c0: 0x00e3, # GREEK SMALL LETTER PI + 0x03c3: 0x00e5, # GREEK SMALL LETTER SIGMA + 0x03c4: 0x00e7, # GREEK SMALL LETTER TAU + 0x03c6: 0x00ed, # GREEK SMALL LETTER PHI + 0x207f: 0x00fc, # SUPERSCRIPT LATIN SMALL LETTER N + 0x20a7: 0x009e, # PESETA SIGN + 0x2219: 0x00f9, # BULLET OPERATOR + 0x221a: 0x00fb, # SQUARE ROOT + 0x221e: 0x00ec, # INFINITY + 0x2229: 0x00ef, # INTERSECTION + 0x2248: 0x00f7, # ALMOST EQUAL TO + 0x2261: 0x00f0, # IDENTICAL TO + 0x2264: 0x00f3, # LESS-THAN OR EQUAL TO + 0x2265: 0x00f2, # GREATER-THAN OR EQUAL TO + 0x2310: 0x00a9, # REVERSED NOT SIGN + 0x2320: 0x00f4, # TOP HALF INTEGRAL + 0x2321: 0x00f5, # BOTTOM HALF INTEGRAL + 0x2500: 0x00c4, # BOX DRAWINGS LIGHT HORIZONTAL + 0x2502: 0x00b3, # BOX DRAWINGS LIGHT VERTICAL + 0x250c: 0x00da, # BOX DRAWINGS LIGHT DOWN AND RIGHT + 0x2510: 0x00bf, # BOX DRAWINGS LIGHT DOWN AND LEFT + 0x2514: 0x00c0, # BOX DRAWINGS LIGHT UP AND RIGHT + 0x2518: 0x00d9, # BOX DRAWINGS LIGHT UP AND LEFT + 0x251c: 0x00c3, # BOX DRAWINGS LIGHT VERTICAL AND RIGHT + 0x2524: 0x00b4, # BOX DRAWINGS LIGHT VERTICAL AND LEFT + 0x252c: 0x00c2, # BOX DRAWINGS LIGHT DOWN AND HORIZONTAL + 0x2534: 0x00c1, # BOX DRAWINGS LIGHT UP AND HORIZONTAL + 0x253c: 0x00c5, # BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL + 0x2550: 0x00cd, # BOX DRAWINGS DOUBLE HORIZONTAL + 0x2551: 0x00ba, # BOX DRAWINGS DOUBLE VERTICAL + 0x2552: 0x00d5, # BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE + 0x2553: 0x00d6, # BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE + 0x2554: 0x00c9, # BOX DRAWINGS DOUBLE DOWN AND RIGHT + 0x2555: 0x00b8, # BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE + 0x2556: 0x00b7, # BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE + 0x2557: 0x00bb, # BOX DRAWINGS DOUBLE DOWN AND LEFT + 0x2558: 0x00d4, # BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE + 0x2559: 0x00d3, # BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE + 0x255a: 0x00c8, # BOX DRAWINGS DOUBLE UP AND RIGHT + 0x255b: 0x00be, # BOX DRAWINGS UP SINGLE AND LEFT DOUBLE + 0x255c: 0x00bd, # BOX DRAWINGS UP DOUBLE AND LEFT SINGLE + 0x255d: 0x00bc, # BOX DRAWINGS DOUBLE UP AND LEFT + 0x255e: 0x00c6, # BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE + 0x255f: 0x00c7, # BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE + 0x2560: 0x00cc, # BOX DRAWINGS DOUBLE VERTICAL AND RIGHT + 0x2561: 0x00b5, # BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE + 0x2562: 0x00b6, # BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE + 0x2563: 0x00b9, # BOX DRAWINGS DOUBLE VERTICAL AND LEFT + 0x2564: 0x00d1, # BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE + 0x2565: 0x00d2, # BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE + 0x2566: 0x00cb, # BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL + 0x2567: 0x00cf, # BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE + 0x2568: 0x00d0, # BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE + 0x2569: 0x00ca, # BOX DRAWINGS DOUBLE UP AND HORIZONTAL + 0x256a: 0x00d8, # BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE + 0x256b: 0x00d7, # BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE + 0x256c: 0x00ce, # BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL + 0x2580: 0x00df, # UPPER HALF BLOCK + 0x2584: 0x00dc, # LOWER HALF BLOCK + 0x2588: 0x00db, # FULL BLOCK + 0x258c: 0x00dd, # LEFT HALF BLOCK + 0x2590: 0x00de, # RIGHT HALF BLOCK + 0x2591: 0x00b0, # LIGHT SHADE + 0x2592: 0x00b1, # MEDIUM SHADE + 0x2593: 0x00b2, # DARK SHADE + 0x25a0: 0x00fe, # BLACK SQUARE +} diff --git a/env/Lib/encodings/cp862.py b/env/Lib/encodings/cp862.py new file mode 100644 index 0000000..3df22f9 --- /dev/null +++ b/env/Lib/encodings/cp862.py @@ -0,0 +1,698 @@ +""" Python Character Mapping Codec generated from 'VENDORS/MICSFT/PC/CP862.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_map) + + 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_map)[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='cp862', + 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: 0x05d0, # HEBREW LETTER ALEF + 0x0081: 0x05d1, # HEBREW LETTER BET + 0x0082: 0x05d2, # HEBREW LETTER GIMEL + 0x0083: 0x05d3, # HEBREW LETTER DALET + 0x0084: 0x05d4, # HEBREW LETTER HE + 0x0085: 0x05d5, # HEBREW LETTER VAV + 0x0086: 0x05d6, # HEBREW LETTER ZAYIN + 0x0087: 0x05d7, # HEBREW LETTER HET + 0x0088: 0x05d8, # HEBREW LETTER TET + 0x0089: 0x05d9, # HEBREW LETTER YOD + 0x008a: 0x05da, # HEBREW LETTER FINAL KAF + 0x008b: 0x05db, # HEBREW LETTER KAF + 0x008c: 0x05dc, # HEBREW LETTER LAMED + 0x008d: 0x05dd, # HEBREW LETTER FINAL MEM + 0x008e: 0x05de, # HEBREW LETTER MEM + 0x008f: 0x05df, # HEBREW LETTER FINAL NUN + 0x0090: 0x05e0, # HEBREW LETTER NUN + 0x0091: 0x05e1, # HEBREW LETTER SAMEKH + 0x0092: 0x05e2, # HEBREW LETTER AYIN + 0x0093: 0x05e3, # HEBREW LETTER FINAL PE + 0x0094: 0x05e4, # HEBREW LETTER PE + 0x0095: 0x05e5, # HEBREW LETTER FINAL TSADI + 0x0096: 0x05e6, # HEBREW LETTER TSADI + 0x0097: 0x05e7, # HEBREW LETTER QOF + 0x0098: 0x05e8, # HEBREW LETTER RESH + 0x0099: 0x05e9, # HEBREW LETTER SHIN + 0x009a: 0x05ea, # HEBREW LETTER TAV + 0x009b: 0x00a2, # CENT SIGN + 0x009c: 0x00a3, # POUND SIGN + 0x009d: 0x00a5, # YEN SIGN + 0x009e: 0x20a7, # PESETA SIGN + 0x009f: 0x0192, # LATIN SMALL LETTER F WITH HOOK + 0x00a0: 0x00e1, # LATIN SMALL LETTER A WITH ACUTE + 0x00a1: 0x00ed, # LATIN SMALL LETTER I WITH ACUTE + 0x00a2: 0x00f3, # LATIN SMALL LETTER O WITH ACUTE + 0x00a3: 0x00fa, # LATIN SMALL LETTER U WITH ACUTE + 0x00a4: 0x00f1, # LATIN SMALL LETTER N WITH TILDE + 0x00a5: 0x00d1, # LATIN CAPITAL LETTER N WITH TILDE + 0x00a6: 0x00aa, # FEMININE ORDINAL INDICATOR + 0x00a7: 0x00ba, # MASCULINE ORDINAL INDICATOR + 0x00a8: 0x00bf, # INVERTED QUESTION MARK + 0x00a9: 0x2310, # REVERSED NOT SIGN + 0x00aa: 0x00ac, # NOT SIGN + 0x00ab: 0x00bd, # VULGAR FRACTION ONE HALF + 0x00ac: 0x00bc, # VULGAR FRACTION ONE QUARTER + 0x00ad: 0x00a1, # INVERTED EXCLAMATION MARK + 0x00ae: 0x00ab, # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00af: 0x00bb, # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00b0: 0x2591, # LIGHT SHADE + 0x00b1: 0x2592, # MEDIUM SHADE + 0x00b2: 0x2593, # DARK SHADE + 0x00b3: 0x2502, # BOX DRAWINGS LIGHT VERTICAL + 0x00b4: 0x2524, # BOX DRAWINGS LIGHT VERTICAL AND LEFT + 0x00b5: 0x2561, # BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE + 0x00b6: 0x2562, # BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE + 0x00b7: 0x2556, # BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE + 0x00b8: 0x2555, # BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE + 0x00b9: 0x2563, # BOX DRAWINGS DOUBLE VERTICAL AND LEFT + 0x00ba: 0x2551, # BOX DRAWINGS DOUBLE VERTICAL + 0x00bb: 0x2557, # BOX DRAWINGS DOUBLE DOWN AND LEFT + 0x00bc: 0x255d, # BOX DRAWINGS DOUBLE UP AND LEFT + 0x00bd: 0x255c, # BOX DRAWINGS UP DOUBLE AND LEFT SINGLE + 0x00be: 0x255b, # BOX DRAWINGS UP SINGLE AND LEFT DOUBLE + 0x00bf: 0x2510, # BOX DRAWINGS LIGHT DOWN AND LEFT + 0x00c0: 0x2514, # BOX DRAWINGS LIGHT UP AND RIGHT + 0x00c1: 0x2534, # BOX DRAWINGS LIGHT UP AND HORIZONTAL + 0x00c2: 0x252c, # BOX DRAWINGS LIGHT DOWN AND HORIZONTAL + 0x00c3: 0x251c, # BOX DRAWINGS LIGHT VERTICAL AND RIGHT + 0x00c4: 0x2500, # BOX DRAWINGS LIGHT HORIZONTAL + 0x00c5: 0x253c, # BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL + 0x00c6: 0x255e, # BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE + 0x00c7: 0x255f, # BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE + 0x00c8: 0x255a, # BOX DRAWINGS DOUBLE UP AND RIGHT + 0x00c9: 0x2554, # BOX DRAWINGS DOUBLE DOWN AND RIGHT + 0x00ca: 0x2569, # BOX DRAWINGS DOUBLE UP AND HORIZONTAL + 0x00cb: 0x2566, # BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL + 0x00cc: 0x2560, # BOX DRAWINGS DOUBLE VERTICAL AND RIGHT + 0x00cd: 0x2550, # BOX DRAWINGS DOUBLE HORIZONTAL + 0x00ce: 0x256c, # BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL + 0x00cf: 0x2567, # BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE + 0x00d0: 0x2568, # BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE + 0x00d1: 0x2564, # BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE + 0x00d2: 0x2565, # BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE + 0x00d3: 0x2559, # BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE + 0x00d4: 0x2558, # BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE + 0x00d5: 0x2552, # BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE + 0x00d6: 0x2553, # BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE + 0x00d7: 0x256b, # BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE + 0x00d8: 0x256a, # BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE + 0x00d9: 0x2518, # BOX DRAWINGS LIGHT UP AND LEFT + 0x00da: 0x250c, # BOX DRAWINGS LIGHT DOWN AND RIGHT + 0x00db: 0x2588, # FULL BLOCK + 0x00dc: 0x2584, # LOWER HALF BLOCK + 0x00dd: 0x258c, # LEFT HALF BLOCK + 0x00de: 0x2590, # RIGHT HALF BLOCK + 0x00df: 0x2580, # UPPER HALF BLOCK + 0x00e0: 0x03b1, # GREEK SMALL LETTER ALPHA + 0x00e1: 0x00df, # LATIN SMALL LETTER SHARP S (GERMAN) + 0x00e2: 0x0393, # GREEK CAPITAL LETTER GAMMA + 0x00e3: 0x03c0, # GREEK SMALL LETTER PI + 0x00e4: 0x03a3, # GREEK CAPITAL LETTER SIGMA + 0x00e5: 0x03c3, # GREEK SMALL LETTER SIGMA + 0x00e6: 0x00b5, # MICRO SIGN + 0x00e7: 0x03c4, # GREEK SMALL LETTER TAU + 0x00e8: 0x03a6, # GREEK CAPITAL LETTER PHI + 0x00e9: 0x0398, # GREEK CAPITAL LETTER THETA + 0x00ea: 0x03a9, # GREEK CAPITAL LETTER OMEGA + 0x00eb: 0x03b4, # GREEK SMALL LETTER DELTA + 0x00ec: 0x221e, # INFINITY + 0x00ed: 0x03c6, # GREEK SMALL LETTER PHI + 0x00ee: 0x03b5, # GREEK SMALL LETTER EPSILON + 0x00ef: 0x2229, # INTERSECTION + 0x00f0: 0x2261, # IDENTICAL TO + 0x00f1: 0x00b1, # PLUS-MINUS SIGN + 0x00f2: 0x2265, # GREATER-THAN OR EQUAL TO + 0x00f3: 0x2264, # LESS-THAN OR EQUAL TO + 0x00f4: 0x2320, # TOP HALF INTEGRAL + 0x00f5: 0x2321, # BOTTOM HALF INTEGRAL + 0x00f6: 0x00f7, # DIVISION SIGN + 0x00f7: 0x2248, # ALMOST EQUAL TO + 0x00f8: 0x00b0, # DEGREE SIGN + 0x00f9: 0x2219, # BULLET OPERATOR + 0x00fa: 0x00b7, # MIDDLE DOT + 0x00fb: 0x221a, # SQUARE ROOT + 0x00fc: 0x207f, # SUPERSCRIPT LATIN SMALL LETTER N + 0x00fd: 0x00b2, # SUPERSCRIPT TWO + 0x00fe: 0x25a0, # BLACK SQUARE + 0x00ff: 0x00a0, # NO-BREAK SPACE +}) + +### Decoding Table + +decoding_table = ( + '\x00' # 0x0000 -> NULL + '\x01' # 0x0001 -> START OF HEADING + '\x02' # 0x0002 -> START OF TEXT + '\x03' # 0x0003 -> END OF TEXT + '\x04' # 0x0004 -> END OF TRANSMISSION + '\x05' # 0x0005 -> ENQUIRY + '\x06' # 0x0006 -> ACKNOWLEDGE + '\x07' # 0x0007 -> BELL + '\x08' # 0x0008 -> BACKSPACE + '\t' # 0x0009 -> HORIZONTAL TABULATION + '\n' # 0x000a -> LINE FEED + '\x0b' # 0x000b -> VERTICAL TABULATION + '\x0c' # 0x000c -> FORM FEED + '\r' # 0x000d -> CARRIAGE RETURN + '\x0e' # 0x000e -> SHIFT OUT + '\x0f' # 0x000f -> SHIFT IN + '\x10' # 0x0010 -> DATA LINK ESCAPE + '\x11' # 0x0011 -> DEVICE CONTROL ONE + '\x12' # 0x0012 -> DEVICE CONTROL TWO + '\x13' # 0x0013 -> DEVICE CONTROL THREE + '\x14' # 0x0014 -> DEVICE CONTROL FOUR + '\x15' # 0x0015 -> NEGATIVE ACKNOWLEDGE + '\x16' # 0x0016 -> SYNCHRONOUS IDLE + '\x17' # 0x0017 -> END OF TRANSMISSION BLOCK + '\x18' # 0x0018 -> CANCEL + '\x19' # 0x0019 -> END OF MEDIUM + '\x1a' # 0x001a -> SUBSTITUTE + '\x1b' # 0x001b -> ESCAPE + '\x1c' # 0x001c -> FILE SEPARATOR + '\x1d' # 0x001d -> GROUP SEPARATOR + '\x1e' # 0x001e -> RECORD SEPARATOR + '\x1f' # 0x001f -> UNIT SEPARATOR + ' ' # 0x0020 -> SPACE + '!' # 0x0021 -> EXCLAMATION MARK + '"' # 0x0022 -> QUOTATION MARK + '#' # 0x0023 -> NUMBER SIGN + '$' # 0x0024 -> DOLLAR SIGN + '%' # 0x0025 -> PERCENT SIGN + '&' # 0x0026 -> AMPERSAND + "'" # 0x0027 -> APOSTROPHE + '(' # 0x0028 -> LEFT PARENTHESIS + ')' # 0x0029 -> RIGHT PARENTHESIS + '*' # 0x002a -> ASTERISK + '+' # 0x002b -> PLUS SIGN + ',' # 0x002c -> COMMA + '-' # 0x002d -> HYPHEN-MINUS + '.' # 0x002e -> FULL STOP + '/' # 0x002f -> SOLIDUS + '0' # 0x0030 -> DIGIT ZERO + '1' # 0x0031 -> DIGIT ONE + '2' # 0x0032 -> DIGIT TWO + '3' # 0x0033 -> DIGIT THREE + '4' # 0x0034 -> DIGIT FOUR + '5' # 0x0035 -> DIGIT FIVE + '6' # 0x0036 -> DIGIT SIX + '7' # 0x0037 -> DIGIT SEVEN + '8' # 0x0038 -> DIGIT EIGHT + '9' # 0x0039 -> DIGIT NINE + ':' # 0x003a -> COLON + ';' # 0x003b -> SEMICOLON + '<' # 0x003c -> LESS-THAN SIGN + '=' # 0x003d -> EQUALS SIGN + '>' # 0x003e -> GREATER-THAN SIGN + '?' # 0x003f -> QUESTION MARK + '@' # 0x0040 -> COMMERCIAL AT + 'A' # 0x0041 -> LATIN CAPITAL LETTER A + 'B' # 0x0042 -> LATIN CAPITAL LETTER B + 'C' # 0x0043 -> LATIN CAPITAL LETTER C + 'D' # 0x0044 -> LATIN CAPITAL LETTER D + 'E' # 0x0045 -> LATIN CAPITAL LETTER E + 'F' # 0x0046 -> LATIN CAPITAL LETTER F + 'G' # 0x0047 -> LATIN CAPITAL LETTER G + 'H' # 0x0048 -> LATIN CAPITAL LETTER H + 'I' # 0x0049 -> LATIN CAPITAL LETTER I + 'J' # 0x004a -> LATIN CAPITAL LETTER J + 'K' # 0x004b -> LATIN CAPITAL LETTER K + 'L' # 0x004c -> LATIN CAPITAL LETTER L + 'M' # 0x004d -> LATIN CAPITAL LETTER M + 'N' # 0x004e -> LATIN CAPITAL LETTER N + 'O' # 0x004f -> LATIN CAPITAL LETTER O + 'P' # 0x0050 -> LATIN CAPITAL LETTER P + 'Q' # 0x0051 -> LATIN CAPITAL LETTER Q + 'R' # 0x0052 -> LATIN CAPITAL LETTER R + 'S' # 0x0053 -> LATIN CAPITAL LETTER S + 'T' # 0x0054 -> LATIN CAPITAL LETTER T + 'U' # 0x0055 -> LATIN CAPITAL LETTER U + 'V' # 0x0056 -> LATIN CAPITAL LETTER V + 'W' # 0x0057 -> LATIN CAPITAL LETTER W + 'X' # 0x0058 -> LATIN CAPITAL LETTER X + 'Y' # 0x0059 -> LATIN CAPITAL LETTER Y + 'Z' # 0x005a -> LATIN CAPITAL LETTER Z + '[' # 0x005b -> LEFT SQUARE BRACKET + '\\' # 0x005c -> REVERSE SOLIDUS + ']' # 0x005d -> RIGHT SQUARE BRACKET + '^' # 0x005e -> CIRCUMFLEX ACCENT + '_' # 0x005f -> LOW LINE + '`' # 0x0060 -> GRAVE ACCENT + 'a' # 0x0061 -> LATIN SMALL LETTER A + 'b' # 0x0062 -> LATIN SMALL LETTER B + 'c' # 0x0063 -> LATIN SMALL LETTER C + 'd' # 0x0064 -> LATIN SMALL LETTER D + 'e' # 0x0065 -> LATIN SMALL LETTER E + 'f' # 0x0066 -> LATIN SMALL LETTER F + 'g' # 0x0067 -> LATIN SMALL LETTER G + 'h' # 0x0068 -> LATIN SMALL LETTER H + 'i' # 0x0069 -> LATIN SMALL LETTER I + 'j' # 0x006a -> LATIN SMALL LETTER J + 'k' # 0x006b -> LATIN SMALL LETTER K + 'l' # 0x006c -> LATIN SMALL LETTER L + 'm' # 0x006d -> LATIN SMALL LETTER M + 'n' # 0x006e -> LATIN SMALL LETTER N + 'o' # 0x006f -> LATIN SMALL LETTER O + 'p' # 0x0070 -> LATIN SMALL LETTER P + 'q' # 0x0071 -> LATIN SMALL LETTER Q + 'r' # 0x0072 -> LATIN SMALL LETTER R + 's' # 0x0073 -> LATIN SMALL LETTER S + 't' # 0x0074 -> LATIN SMALL LETTER T + 'u' # 0x0075 -> LATIN SMALL LETTER U + 'v' # 0x0076 -> LATIN SMALL LETTER V + 'w' # 0x0077 -> LATIN SMALL LETTER W + 'x' # 0x0078 -> LATIN SMALL LETTER X + 'y' # 0x0079 -> LATIN SMALL LETTER Y + 'z' # 0x007a -> LATIN SMALL LETTER Z + '{' # 0x007b -> LEFT CURLY BRACKET + '|' # 0x007c -> VERTICAL LINE + '}' # 0x007d -> RIGHT CURLY BRACKET + '~' # 0x007e -> TILDE + '\x7f' # 0x007f -> DELETE + '\u05d0' # 0x0080 -> HEBREW LETTER ALEF + '\u05d1' # 0x0081 -> HEBREW LETTER BET + '\u05d2' # 0x0082 -> HEBREW LETTER GIMEL + '\u05d3' # 0x0083 -> HEBREW LETTER DALET + '\u05d4' # 0x0084 -> HEBREW LETTER HE + '\u05d5' # 0x0085 -> HEBREW LETTER VAV + '\u05d6' # 0x0086 -> HEBREW LETTER ZAYIN + '\u05d7' # 0x0087 -> HEBREW LETTER HET + '\u05d8' # 0x0088 -> HEBREW LETTER TET + '\u05d9' # 0x0089 -> HEBREW LETTER YOD + '\u05da' # 0x008a -> HEBREW LETTER FINAL KAF + '\u05db' # 0x008b -> HEBREW LETTER KAF + '\u05dc' # 0x008c -> HEBREW LETTER LAMED + '\u05dd' # 0x008d -> HEBREW LETTER FINAL MEM + '\u05de' # 0x008e -> HEBREW LETTER MEM + '\u05df' # 0x008f -> HEBREW LETTER FINAL NUN + '\u05e0' # 0x0090 -> HEBREW LETTER NUN + '\u05e1' # 0x0091 -> HEBREW LETTER SAMEKH + '\u05e2' # 0x0092 -> HEBREW LETTER AYIN + '\u05e3' # 0x0093 -> HEBREW LETTER FINAL PE + '\u05e4' # 0x0094 -> HEBREW LETTER PE + '\u05e5' # 0x0095 -> HEBREW LETTER FINAL TSADI + '\u05e6' # 0x0096 -> HEBREW LETTER TSADI + '\u05e7' # 0x0097 -> HEBREW LETTER QOF + '\u05e8' # 0x0098 -> HEBREW LETTER RESH + '\u05e9' # 0x0099 -> HEBREW LETTER SHIN + '\u05ea' # 0x009a -> HEBREW LETTER TAV + '\xa2' # 0x009b -> CENT SIGN + '\xa3' # 0x009c -> POUND SIGN + '\xa5' # 0x009d -> YEN SIGN + '\u20a7' # 0x009e -> PESETA SIGN + '\u0192' # 0x009f -> LATIN SMALL LETTER F WITH HOOK + '\xe1' # 0x00a0 -> LATIN SMALL LETTER A WITH ACUTE + '\xed' # 0x00a1 -> LATIN SMALL LETTER I WITH ACUTE + '\xf3' # 0x00a2 -> LATIN SMALL LETTER O WITH ACUTE + '\xfa' # 0x00a3 -> LATIN SMALL LETTER U WITH ACUTE + '\xf1' # 0x00a4 -> LATIN SMALL LETTER N WITH TILDE + '\xd1' # 0x00a5 -> LATIN CAPITAL LETTER N WITH TILDE + '\xaa' # 0x00a6 -> FEMININE ORDINAL INDICATOR + '\xba' # 0x00a7 -> MASCULINE ORDINAL INDICATOR + '\xbf' # 0x00a8 -> INVERTED QUESTION MARK + '\u2310' # 0x00a9 -> REVERSED NOT SIGN + '\xac' # 0x00aa -> NOT SIGN + '\xbd' # 0x00ab -> VULGAR FRACTION ONE HALF + '\xbc' # 0x00ac -> VULGAR FRACTION ONE QUARTER + '\xa1' # 0x00ad -> INVERTED EXCLAMATION MARK + '\xab' # 0x00ae -> LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + '\xbb' # 0x00af -> RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + '\u2591' # 0x00b0 -> LIGHT SHADE + '\u2592' # 0x00b1 -> MEDIUM SHADE + '\u2593' # 0x00b2 -> DARK SHADE + '\u2502' # 0x00b3 -> BOX DRAWINGS LIGHT VERTICAL + '\u2524' # 0x00b4 -> BOX DRAWINGS LIGHT VERTICAL AND LEFT + '\u2561' # 0x00b5 -> BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE + '\u2562' # 0x00b6 -> BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE + '\u2556' # 0x00b7 -> BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE + '\u2555' # 0x00b8 -> BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE + '\u2563' # 0x00b9 -> BOX DRAWINGS DOUBLE VERTICAL AND LEFT + '\u2551' # 0x00ba -> BOX DRAWINGS DOUBLE VERTICAL + '\u2557' # 0x00bb -> BOX DRAWINGS DOUBLE DOWN AND LEFT + '\u255d' # 0x00bc -> BOX DRAWINGS DOUBLE UP AND LEFT + '\u255c' # 0x00bd -> BOX DRAWINGS UP DOUBLE AND LEFT SINGLE + '\u255b' # 0x00be -> BOX DRAWINGS UP SINGLE AND LEFT DOUBLE + '\u2510' # 0x00bf -> BOX DRAWINGS LIGHT DOWN AND LEFT + '\u2514' # 0x00c0 -> BOX DRAWINGS LIGHT UP AND RIGHT + '\u2534' # 0x00c1 -> BOX DRAWINGS LIGHT UP AND HORIZONTAL + '\u252c' # 0x00c2 -> BOX DRAWINGS LIGHT DOWN AND HORIZONTAL + '\u251c' # 0x00c3 -> BOX DRAWINGS LIGHT VERTICAL AND RIGHT + '\u2500' # 0x00c4 -> BOX DRAWINGS LIGHT HORIZONTAL + '\u253c' # 0x00c5 -> BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL + '\u255e' # 0x00c6 -> BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE + '\u255f' # 0x00c7 -> BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE + '\u255a' # 0x00c8 -> BOX DRAWINGS DOUBLE UP AND RIGHT + '\u2554' # 0x00c9 -> BOX DRAWINGS DOUBLE DOWN AND RIGHT + '\u2569' # 0x00ca -> BOX DRAWINGS DOUBLE UP AND HORIZONTAL + '\u2566' # 0x00cb -> BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL + '\u2560' # 0x00cc -> BOX DRAWINGS DOUBLE VERTICAL AND RIGHT + '\u2550' # 0x00cd -> BOX DRAWINGS DOUBLE HORIZONTAL + '\u256c' # 0x00ce -> BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL + '\u2567' # 0x00cf -> BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE + '\u2568' # 0x00d0 -> BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE + '\u2564' # 0x00d1 -> BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE + '\u2565' # 0x00d2 -> BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE + '\u2559' # 0x00d3 -> BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE + '\u2558' # 0x00d4 -> BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE + '\u2552' # 0x00d5 -> BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE + '\u2553' # 0x00d6 -> BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE + '\u256b' # 0x00d7 -> BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE + '\u256a' # 0x00d8 -> BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE + '\u2518' # 0x00d9 -> BOX DRAWINGS LIGHT UP AND LEFT + '\u250c' # 0x00da -> BOX DRAWINGS LIGHT DOWN AND RIGHT + '\u2588' # 0x00db -> FULL BLOCK + '\u2584' # 0x00dc -> LOWER HALF BLOCK + '\u258c' # 0x00dd -> LEFT HALF BLOCK + '\u2590' # 0x00de -> RIGHT HALF BLOCK + '\u2580' # 0x00df -> UPPER HALF BLOCK + '\u03b1' # 0x00e0 -> GREEK SMALL LETTER ALPHA + '\xdf' # 0x00e1 -> LATIN SMALL LETTER SHARP S (GERMAN) + '\u0393' # 0x00e2 -> GREEK CAPITAL LETTER GAMMA + '\u03c0' # 0x00e3 -> GREEK SMALL LETTER PI + '\u03a3' # 0x00e4 -> GREEK CAPITAL LETTER SIGMA + '\u03c3' # 0x00e5 -> GREEK SMALL LETTER SIGMA + '\xb5' # 0x00e6 -> MICRO SIGN + '\u03c4' # 0x00e7 -> GREEK SMALL LETTER TAU + '\u03a6' # 0x00e8 -> GREEK CAPITAL LETTER PHI + '\u0398' # 0x00e9 -> GREEK CAPITAL LETTER THETA + '\u03a9' # 0x00ea -> GREEK CAPITAL LETTER OMEGA + '\u03b4' # 0x00eb -> GREEK SMALL LETTER DELTA + '\u221e' # 0x00ec -> INFINITY + '\u03c6' # 0x00ed -> GREEK SMALL LETTER PHI + '\u03b5' # 0x00ee -> GREEK SMALL LETTER EPSILON + '\u2229' # 0x00ef -> INTERSECTION + '\u2261' # 0x00f0 -> IDENTICAL TO + '\xb1' # 0x00f1 -> PLUS-MINUS SIGN + '\u2265' # 0x00f2 -> GREATER-THAN OR EQUAL TO + '\u2264' # 0x00f3 -> LESS-THAN OR EQUAL TO + '\u2320' # 0x00f4 -> TOP HALF INTEGRAL + '\u2321' # 0x00f5 -> BOTTOM HALF INTEGRAL + '\xf7' # 0x00f6 -> DIVISION SIGN + '\u2248' # 0x00f7 -> ALMOST EQUAL TO + '\xb0' # 0x00f8 -> DEGREE SIGN + '\u2219' # 0x00f9 -> BULLET OPERATOR + '\xb7' # 0x00fa -> MIDDLE DOT + '\u221a' # 0x00fb -> SQUARE ROOT + '\u207f' # 0x00fc -> SUPERSCRIPT LATIN SMALL LETTER N + '\xb2' # 0x00fd -> SUPERSCRIPT TWO + '\u25a0' # 0x00fe -> BLACK SQUARE + '\xa0' # 0x00ff -> NO-BREAK SPACE +) + +### Encoding Map + +encoding_map = { + 0x0000: 0x0000, # NULL + 0x0001: 0x0001, # START OF HEADING + 0x0002: 0x0002, # START OF TEXT + 0x0003: 0x0003, # END OF TEXT + 0x0004: 0x0004, # END OF TRANSMISSION + 0x0005: 0x0005, # ENQUIRY + 0x0006: 0x0006, # ACKNOWLEDGE + 0x0007: 0x0007, # BELL + 0x0008: 0x0008, # BACKSPACE + 0x0009: 0x0009, # HORIZONTAL TABULATION + 0x000a: 0x000a, # LINE FEED + 0x000b: 0x000b, # VERTICAL TABULATION + 0x000c: 0x000c, # FORM FEED + 0x000d: 0x000d, # CARRIAGE RETURN + 0x000e: 0x000e, # SHIFT OUT + 0x000f: 0x000f, # SHIFT IN + 0x0010: 0x0010, # DATA LINK ESCAPE + 0x0011: 0x0011, # DEVICE CONTROL ONE + 0x0012: 0x0012, # DEVICE CONTROL TWO + 0x0013: 0x0013, # DEVICE CONTROL THREE + 0x0014: 0x0014, # DEVICE CONTROL FOUR + 0x0015: 0x0015, # NEGATIVE ACKNOWLEDGE + 0x0016: 0x0016, # SYNCHRONOUS IDLE + 0x0017: 0x0017, # END OF TRANSMISSION BLOCK + 0x0018: 0x0018, # CANCEL + 0x0019: 0x0019, # END OF MEDIUM + 0x001a: 0x001a, # SUBSTITUTE + 0x001b: 0x001b, # ESCAPE + 0x001c: 0x001c, # FILE SEPARATOR + 0x001d: 0x001d, # GROUP SEPARATOR + 0x001e: 0x001e, # RECORD SEPARATOR + 0x001f: 0x001f, # UNIT SEPARATOR + 0x0020: 0x0020, # SPACE + 0x0021: 0x0021, # EXCLAMATION MARK + 0x0022: 0x0022, # QUOTATION MARK + 0x0023: 0x0023, # NUMBER SIGN + 0x0024: 0x0024, # DOLLAR SIGN + 0x0025: 0x0025, # PERCENT SIGN + 0x0026: 0x0026, # AMPERSAND + 0x0027: 0x0027, # APOSTROPHE + 0x0028: 0x0028, # LEFT PARENTHESIS + 0x0029: 0x0029, # RIGHT PARENTHESIS + 0x002a: 0x002a, # ASTERISK + 0x002b: 0x002b, # PLUS SIGN + 0x002c: 0x002c, # COMMA + 0x002d: 0x002d, # HYPHEN-MINUS + 0x002e: 0x002e, # FULL STOP + 0x002f: 0x002f, # SOLIDUS + 0x0030: 0x0030, # DIGIT ZERO + 0x0031: 0x0031, # DIGIT ONE + 0x0032: 0x0032, # DIGIT TWO + 0x0033: 0x0033, # DIGIT THREE + 0x0034: 0x0034, # DIGIT FOUR + 0x0035: 0x0035, # DIGIT FIVE + 0x0036: 0x0036, # DIGIT SIX + 0x0037: 0x0037, # DIGIT SEVEN + 0x0038: 0x0038, # DIGIT EIGHT + 0x0039: 0x0039, # DIGIT NINE + 0x003a: 0x003a, # COLON + 0x003b: 0x003b, # SEMICOLON + 0x003c: 0x003c, # LESS-THAN SIGN + 0x003d: 0x003d, # EQUALS SIGN + 0x003e: 0x003e, # GREATER-THAN SIGN + 0x003f: 0x003f, # QUESTION MARK + 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 + 0x005c: 0x005c, # REVERSE SOLIDUS + 0x005d: 0x005d, # RIGHT SQUARE BRACKET + 0x005e: 0x005e, # CIRCUMFLEX ACCENT + 0x005f: 0x005f, # LOW LINE + 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 + 0x007c: 0x007c, # VERTICAL LINE + 0x007d: 0x007d, # RIGHT CURLY BRACKET + 0x007e: 0x007e, # TILDE + 0x007f: 0x007f, # DELETE + 0x00a0: 0x00ff, # NO-BREAK SPACE + 0x00a1: 0x00ad, # INVERTED EXCLAMATION MARK + 0x00a2: 0x009b, # CENT SIGN + 0x00a3: 0x009c, # POUND SIGN + 0x00a5: 0x009d, # YEN SIGN + 0x00aa: 0x00a6, # FEMININE ORDINAL INDICATOR + 0x00ab: 0x00ae, # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00ac: 0x00aa, # NOT SIGN + 0x00b0: 0x00f8, # DEGREE SIGN + 0x00b1: 0x00f1, # PLUS-MINUS SIGN + 0x00b2: 0x00fd, # SUPERSCRIPT TWO + 0x00b5: 0x00e6, # MICRO SIGN + 0x00b7: 0x00fa, # MIDDLE DOT + 0x00ba: 0x00a7, # MASCULINE ORDINAL INDICATOR + 0x00bb: 0x00af, # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00bc: 0x00ac, # VULGAR FRACTION ONE QUARTER + 0x00bd: 0x00ab, # VULGAR FRACTION ONE HALF + 0x00bf: 0x00a8, # INVERTED QUESTION MARK + 0x00d1: 0x00a5, # LATIN CAPITAL LETTER N WITH TILDE + 0x00df: 0x00e1, # LATIN SMALL LETTER SHARP S (GERMAN) + 0x00e1: 0x00a0, # LATIN SMALL LETTER A WITH ACUTE + 0x00ed: 0x00a1, # LATIN SMALL LETTER I WITH ACUTE + 0x00f1: 0x00a4, # LATIN SMALL LETTER N WITH TILDE + 0x00f3: 0x00a2, # LATIN SMALL LETTER O WITH ACUTE + 0x00f7: 0x00f6, # DIVISION SIGN + 0x00fa: 0x00a3, # LATIN SMALL LETTER U WITH ACUTE + 0x0192: 0x009f, # LATIN SMALL LETTER F WITH HOOK + 0x0393: 0x00e2, # GREEK CAPITAL LETTER GAMMA + 0x0398: 0x00e9, # GREEK CAPITAL LETTER THETA + 0x03a3: 0x00e4, # GREEK CAPITAL LETTER SIGMA + 0x03a6: 0x00e8, # GREEK CAPITAL LETTER PHI + 0x03a9: 0x00ea, # GREEK CAPITAL LETTER OMEGA + 0x03b1: 0x00e0, # GREEK SMALL LETTER ALPHA + 0x03b4: 0x00eb, # GREEK SMALL LETTER DELTA + 0x03b5: 0x00ee, # GREEK SMALL LETTER EPSILON + 0x03c0: 0x00e3, # GREEK SMALL LETTER PI + 0x03c3: 0x00e5, # GREEK SMALL LETTER SIGMA + 0x03c4: 0x00e7, # GREEK SMALL LETTER TAU + 0x03c6: 0x00ed, # GREEK SMALL LETTER PHI + 0x05d0: 0x0080, # HEBREW LETTER ALEF + 0x05d1: 0x0081, # HEBREW LETTER BET + 0x05d2: 0x0082, # HEBREW LETTER GIMEL + 0x05d3: 0x0083, # HEBREW LETTER DALET + 0x05d4: 0x0084, # HEBREW LETTER HE + 0x05d5: 0x0085, # HEBREW LETTER VAV + 0x05d6: 0x0086, # HEBREW LETTER ZAYIN + 0x05d7: 0x0087, # HEBREW LETTER HET + 0x05d8: 0x0088, # HEBREW LETTER TET + 0x05d9: 0x0089, # HEBREW LETTER YOD + 0x05da: 0x008a, # HEBREW LETTER FINAL KAF + 0x05db: 0x008b, # HEBREW LETTER KAF + 0x05dc: 0x008c, # HEBREW LETTER LAMED + 0x05dd: 0x008d, # HEBREW LETTER FINAL MEM + 0x05de: 0x008e, # HEBREW LETTER MEM + 0x05df: 0x008f, # HEBREW LETTER FINAL NUN + 0x05e0: 0x0090, # HEBREW LETTER NUN + 0x05e1: 0x0091, # HEBREW LETTER SAMEKH + 0x05e2: 0x0092, # HEBREW LETTER AYIN + 0x05e3: 0x0093, # HEBREW LETTER FINAL PE + 0x05e4: 0x0094, # HEBREW LETTER PE + 0x05e5: 0x0095, # HEBREW LETTER FINAL TSADI + 0x05e6: 0x0096, # HEBREW LETTER TSADI + 0x05e7: 0x0097, # HEBREW LETTER QOF + 0x05e8: 0x0098, # HEBREW LETTER RESH + 0x05e9: 0x0099, # HEBREW LETTER SHIN + 0x05ea: 0x009a, # HEBREW LETTER TAV + 0x207f: 0x00fc, # SUPERSCRIPT LATIN SMALL LETTER N + 0x20a7: 0x009e, # PESETA SIGN + 0x2219: 0x00f9, # BULLET OPERATOR + 0x221a: 0x00fb, # SQUARE ROOT + 0x221e: 0x00ec, # INFINITY + 0x2229: 0x00ef, # INTERSECTION + 0x2248: 0x00f7, # ALMOST EQUAL TO + 0x2261: 0x00f0, # IDENTICAL TO + 0x2264: 0x00f3, # LESS-THAN OR EQUAL TO + 0x2265: 0x00f2, # GREATER-THAN OR EQUAL TO + 0x2310: 0x00a9, # REVERSED NOT SIGN + 0x2320: 0x00f4, # TOP HALF INTEGRAL + 0x2321: 0x00f5, # BOTTOM HALF INTEGRAL + 0x2500: 0x00c4, # BOX DRAWINGS LIGHT HORIZONTAL + 0x2502: 0x00b3, # BOX DRAWINGS LIGHT VERTICAL + 0x250c: 0x00da, # BOX DRAWINGS LIGHT DOWN AND RIGHT + 0x2510: 0x00bf, # BOX DRAWINGS LIGHT DOWN AND LEFT + 0x2514: 0x00c0, # BOX DRAWINGS LIGHT UP AND RIGHT + 0x2518: 0x00d9, # BOX DRAWINGS LIGHT UP AND LEFT + 0x251c: 0x00c3, # BOX DRAWINGS LIGHT VERTICAL AND RIGHT + 0x2524: 0x00b4, # BOX DRAWINGS LIGHT VERTICAL AND LEFT + 0x252c: 0x00c2, # BOX DRAWINGS LIGHT DOWN AND HORIZONTAL + 0x2534: 0x00c1, # BOX DRAWINGS LIGHT UP AND HORIZONTAL + 0x253c: 0x00c5, # BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL + 0x2550: 0x00cd, # BOX DRAWINGS DOUBLE HORIZONTAL + 0x2551: 0x00ba, # BOX DRAWINGS DOUBLE VERTICAL + 0x2552: 0x00d5, # BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE + 0x2553: 0x00d6, # BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE + 0x2554: 0x00c9, # BOX DRAWINGS DOUBLE DOWN AND RIGHT + 0x2555: 0x00b8, # BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE + 0x2556: 0x00b7, # BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE + 0x2557: 0x00bb, # BOX DRAWINGS DOUBLE DOWN AND LEFT + 0x2558: 0x00d4, # BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE + 0x2559: 0x00d3, # BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE + 0x255a: 0x00c8, # BOX DRAWINGS DOUBLE UP AND RIGHT + 0x255b: 0x00be, # BOX DRAWINGS UP SINGLE AND LEFT DOUBLE + 0x255c: 0x00bd, # BOX DRAWINGS UP DOUBLE AND LEFT SINGLE + 0x255d: 0x00bc, # BOX DRAWINGS DOUBLE UP AND LEFT + 0x255e: 0x00c6, # BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE + 0x255f: 0x00c7, # BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE + 0x2560: 0x00cc, # BOX DRAWINGS DOUBLE VERTICAL AND RIGHT + 0x2561: 0x00b5, # BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE + 0x2562: 0x00b6, # BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE + 0x2563: 0x00b9, # BOX DRAWINGS DOUBLE VERTICAL AND LEFT + 0x2564: 0x00d1, # BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE + 0x2565: 0x00d2, # BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE + 0x2566: 0x00cb, # BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL + 0x2567: 0x00cf, # BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE + 0x2568: 0x00d0, # BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE + 0x2569: 0x00ca, # BOX DRAWINGS DOUBLE UP AND HORIZONTAL + 0x256a: 0x00d8, # BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE + 0x256b: 0x00d7, # BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE + 0x256c: 0x00ce, # BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL + 0x2580: 0x00df, # UPPER HALF BLOCK + 0x2584: 0x00dc, # LOWER HALF BLOCK + 0x2588: 0x00db, # FULL BLOCK + 0x258c: 0x00dd, # LEFT HALF BLOCK + 0x2590: 0x00de, # RIGHT HALF BLOCK + 0x2591: 0x00b0, # LIGHT SHADE + 0x2592: 0x00b1, # MEDIUM SHADE + 0x2593: 0x00b2, # DARK SHADE + 0x25a0: 0x00fe, # BLACK SQUARE +} diff --git a/env/Lib/encodings/cp863.py b/env/Lib/encodings/cp863.py new file mode 100644 index 0000000..764180b --- /dev/null +++ b/env/Lib/encodings/cp863.py @@ -0,0 +1,698 @@ +""" Python Character Mapping Codec generated from 'VENDORS/MICSFT/PC/CP863.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_map) + + 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_map)[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='cp863', + 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: 0x00c7, # LATIN CAPITAL LETTER C WITH CEDILLA + 0x0081: 0x00fc, # LATIN SMALL LETTER U WITH DIAERESIS + 0x0082: 0x00e9, # LATIN SMALL LETTER E WITH ACUTE + 0x0083: 0x00e2, # LATIN SMALL LETTER A WITH CIRCUMFLEX + 0x0084: 0x00c2, # LATIN CAPITAL LETTER A WITH CIRCUMFLEX + 0x0085: 0x00e0, # LATIN SMALL LETTER A WITH GRAVE + 0x0086: 0x00b6, # PILCROW SIGN + 0x0087: 0x00e7, # LATIN SMALL LETTER C WITH CEDILLA + 0x0088: 0x00ea, # LATIN SMALL LETTER E WITH CIRCUMFLEX + 0x0089: 0x00eb, # LATIN SMALL LETTER E WITH DIAERESIS + 0x008a: 0x00e8, # LATIN SMALL LETTER E WITH GRAVE + 0x008b: 0x00ef, # LATIN SMALL LETTER I WITH DIAERESIS + 0x008c: 0x00ee, # LATIN SMALL LETTER I WITH CIRCUMFLEX + 0x008d: 0x2017, # DOUBLE LOW LINE + 0x008e: 0x00c0, # LATIN CAPITAL LETTER A WITH GRAVE + 0x008f: 0x00a7, # SECTION SIGN + 0x0090: 0x00c9, # LATIN CAPITAL LETTER E WITH ACUTE + 0x0091: 0x00c8, # LATIN CAPITAL LETTER E WITH GRAVE + 0x0092: 0x00ca, # LATIN CAPITAL LETTER E WITH CIRCUMFLEX + 0x0093: 0x00f4, # LATIN SMALL LETTER O WITH CIRCUMFLEX + 0x0094: 0x00cb, # LATIN CAPITAL LETTER E WITH DIAERESIS + 0x0095: 0x00cf, # LATIN CAPITAL LETTER I WITH DIAERESIS + 0x0096: 0x00fb, # LATIN SMALL LETTER U WITH CIRCUMFLEX + 0x0097: 0x00f9, # LATIN SMALL LETTER U WITH GRAVE + 0x0098: 0x00a4, # CURRENCY SIGN + 0x0099: 0x00d4, # LATIN CAPITAL LETTER O WITH CIRCUMFLEX + 0x009a: 0x00dc, # LATIN CAPITAL LETTER U WITH DIAERESIS + 0x009b: 0x00a2, # CENT SIGN + 0x009c: 0x00a3, # POUND SIGN + 0x009d: 0x00d9, # LATIN CAPITAL LETTER U WITH GRAVE + 0x009e: 0x00db, # LATIN CAPITAL LETTER U WITH CIRCUMFLEX + 0x009f: 0x0192, # LATIN SMALL LETTER F WITH HOOK + 0x00a0: 0x00a6, # BROKEN BAR + 0x00a1: 0x00b4, # ACUTE ACCENT + 0x00a2: 0x00f3, # LATIN SMALL LETTER O WITH ACUTE + 0x00a3: 0x00fa, # LATIN SMALL LETTER U WITH ACUTE + 0x00a4: 0x00a8, # DIAERESIS + 0x00a5: 0x00b8, # CEDILLA + 0x00a6: 0x00b3, # SUPERSCRIPT THREE + 0x00a7: 0x00af, # MACRON + 0x00a8: 0x00ce, # LATIN CAPITAL LETTER I WITH CIRCUMFLEX + 0x00a9: 0x2310, # REVERSED NOT SIGN + 0x00aa: 0x00ac, # NOT SIGN + 0x00ab: 0x00bd, # VULGAR FRACTION ONE HALF + 0x00ac: 0x00bc, # VULGAR FRACTION ONE QUARTER + 0x00ad: 0x00be, # VULGAR FRACTION THREE QUARTERS + 0x00ae: 0x00ab, # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00af: 0x00bb, # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00b0: 0x2591, # LIGHT SHADE + 0x00b1: 0x2592, # MEDIUM SHADE + 0x00b2: 0x2593, # DARK SHADE + 0x00b3: 0x2502, # BOX DRAWINGS LIGHT VERTICAL + 0x00b4: 0x2524, # BOX DRAWINGS LIGHT VERTICAL AND LEFT + 0x00b5: 0x2561, # BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE + 0x00b6: 0x2562, # BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE + 0x00b7: 0x2556, # BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE + 0x00b8: 0x2555, # BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE + 0x00b9: 0x2563, # BOX DRAWINGS DOUBLE VERTICAL AND LEFT + 0x00ba: 0x2551, # BOX DRAWINGS DOUBLE VERTICAL + 0x00bb: 0x2557, # BOX DRAWINGS DOUBLE DOWN AND LEFT + 0x00bc: 0x255d, # BOX DRAWINGS DOUBLE UP AND LEFT + 0x00bd: 0x255c, # BOX DRAWINGS UP DOUBLE AND LEFT SINGLE + 0x00be: 0x255b, # BOX DRAWINGS UP SINGLE AND LEFT DOUBLE + 0x00bf: 0x2510, # BOX DRAWINGS LIGHT DOWN AND LEFT + 0x00c0: 0x2514, # BOX DRAWINGS LIGHT UP AND RIGHT + 0x00c1: 0x2534, # BOX DRAWINGS LIGHT UP AND HORIZONTAL + 0x00c2: 0x252c, # BOX DRAWINGS LIGHT DOWN AND HORIZONTAL + 0x00c3: 0x251c, # BOX DRAWINGS LIGHT VERTICAL AND RIGHT + 0x00c4: 0x2500, # BOX DRAWINGS LIGHT HORIZONTAL + 0x00c5: 0x253c, # BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL + 0x00c6: 0x255e, # BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE + 0x00c7: 0x255f, # BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE + 0x00c8: 0x255a, # BOX DRAWINGS DOUBLE UP AND RIGHT + 0x00c9: 0x2554, # BOX DRAWINGS DOUBLE DOWN AND RIGHT + 0x00ca: 0x2569, # BOX DRAWINGS DOUBLE UP AND HORIZONTAL + 0x00cb: 0x2566, # BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL + 0x00cc: 0x2560, # BOX DRAWINGS DOUBLE VERTICAL AND RIGHT + 0x00cd: 0x2550, # BOX DRAWINGS DOUBLE HORIZONTAL + 0x00ce: 0x256c, # BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL + 0x00cf: 0x2567, # BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE + 0x00d0: 0x2568, # BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE + 0x00d1: 0x2564, # BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE + 0x00d2: 0x2565, # BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE + 0x00d3: 0x2559, # BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE + 0x00d4: 0x2558, # BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE + 0x00d5: 0x2552, # BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE + 0x00d6: 0x2553, # BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE + 0x00d7: 0x256b, # BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE + 0x00d8: 0x256a, # BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE + 0x00d9: 0x2518, # BOX DRAWINGS LIGHT UP AND LEFT + 0x00da: 0x250c, # BOX DRAWINGS LIGHT DOWN AND RIGHT + 0x00db: 0x2588, # FULL BLOCK + 0x00dc: 0x2584, # LOWER HALF BLOCK + 0x00dd: 0x258c, # LEFT HALF BLOCK + 0x00de: 0x2590, # RIGHT HALF BLOCK + 0x00df: 0x2580, # UPPER HALF BLOCK + 0x00e0: 0x03b1, # GREEK SMALL LETTER ALPHA + 0x00e1: 0x00df, # LATIN SMALL LETTER SHARP S + 0x00e2: 0x0393, # GREEK CAPITAL LETTER GAMMA + 0x00e3: 0x03c0, # GREEK SMALL LETTER PI + 0x00e4: 0x03a3, # GREEK CAPITAL LETTER SIGMA + 0x00e5: 0x03c3, # GREEK SMALL LETTER SIGMA + 0x00e6: 0x00b5, # MICRO SIGN + 0x00e7: 0x03c4, # GREEK SMALL LETTER TAU + 0x00e8: 0x03a6, # GREEK CAPITAL LETTER PHI + 0x00e9: 0x0398, # GREEK CAPITAL LETTER THETA + 0x00ea: 0x03a9, # GREEK CAPITAL LETTER OMEGA + 0x00eb: 0x03b4, # GREEK SMALL LETTER DELTA + 0x00ec: 0x221e, # INFINITY + 0x00ed: 0x03c6, # GREEK SMALL LETTER PHI + 0x00ee: 0x03b5, # GREEK SMALL LETTER EPSILON + 0x00ef: 0x2229, # INTERSECTION + 0x00f0: 0x2261, # IDENTICAL TO + 0x00f1: 0x00b1, # PLUS-MINUS SIGN + 0x00f2: 0x2265, # GREATER-THAN OR EQUAL TO + 0x00f3: 0x2264, # LESS-THAN OR EQUAL TO + 0x00f4: 0x2320, # TOP HALF INTEGRAL + 0x00f5: 0x2321, # BOTTOM HALF INTEGRAL + 0x00f6: 0x00f7, # DIVISION SIGN + 0x00f7: 0x2248, # ALMOST EQUAL TO + 0x00f8: 0x00b0, # DEGREE SIGN + 0x00f9: 0x2219, # BULLET OPERATOR + 0x00fa: 0x00b7, # MIDDLE DOT + 0x00fb: 0x221a, # SQUARE ROOT + 0x00fc: 0x207f, # SUPERSCRIPT LATIN SMALL LETTER N + 0x00fd: 0x00b2, # SUPERSCRIPT TWO + 0x00fe: 0x25a0, # BLACK SQUARE + 0x00ff: 0x00a0, # NO-BREAK SPACE +}) + +### Decoding Table + +decoding_table = ( + '\x00' # 0x0000 -> NULL + '\x01' # 0x0001 -> START OF HEADING + '\x02' # 0x0002 -> START OF TEXT + '\x03' # 0x0003 -> END OF TEXT + '\x04' # 0x0004 -> END OF TRANSMISSION + '\x05' # 0x0005 -> ENQUIRY + '\x06' # 0x0006 -> ACKNOWLEDGE + '\x07' # 0x0007 -> BELL + '\x08' # 0x0008 -> BACKSPACE + '\t' # 0x0009 -> HORIZONTAL TABULATION + '\n' # 0x000a -> LINE FEED + '\x0b' # 0x000b -> VERTICAL TABULATION + '\x0c' # 0x000c -> FORM FEED + '\r' # 0x000d -> CARRIAGE RETURN + '\x0e' # 0x000e -> SHIFT OUT + '\x0f' # 0x000f -> SHIFT IN + '\x10' # 0x0010 -> DATA LINK ESCAPE + '\x11' # 0x0011 -> DEVICE CONTROL ONE + '\x12' # 0x0012 -> DEVICE CONTROL TWO + '\x13' # 0x0013 -> DEVICE CONTROL THREE + '\x14' # 0x0014 -> DEVICE CONTROL FOUR + '\x15' # 0x0015 -> NEGATIVE ACKNOWLEDGE + '\x16' # 0x0016 -> SYNCHRONOUS IDLE + '\x17' # 0x0017 -> END OF TRANSMISSION BLOCK + '\x18' # 0x0018 -> CANCEL + '\x19' # 0x0019 -> END OF MEDIUM + '\x1a' # 0x001a -> SUBSTITUTE + '\x1b' # 0x001b -> ESCAPE + '\x1c' # 0x001c -> FILE SEPARATOR + '\x1d' # 0x001d -> GROUP SEPARATOR + '\x1e' # 0x001e -> RECORD SEPARATOR + '\x1f' # 0x001f -> UNIT SEPARATOR + ' ' # 0x0020 -> SPACE + '!' # 0x0021 -> EXCLAMATION MARK + '"' # 0x0022 -> QUOTATION MARK + '#' # 0x0023 -> NUMBER SIGN + '$' # 0x0024 -> DOLLAR SIGN + '%' # 0x0025 -> PERCENT SIGN + '&' # 0x0026 -> AMPERSAND + "'" # 0x0027 -> APOSTROPHE + '(' # 0x0028 -> LEFT PARENTHESIS + ')' # 0x0029 -> RIGHT PARENTHESIS + '*' # 0x002a -> ASTERISK + '+' # 0x002b -> PLUS SIGN + ',' # 0x002c -> COMMA + '-' # 0x002d -> HYPHEN-MINUS + '.' # 0x002e -> FULL STOP + '/' # 0x002f -> SOLIDUS + '0' # 0x0030 -> DIGIT ZERO + '1' # 0x0031 -> DIGIT ONE + '2' # 0x0032 -> DIGIT TWO + '3' # 0x0033 -> DIGIT THREE + '4' # 0x0034 -> DIGIT FOUR + '5' # 0x0035 -> DIGIT FIVE + '6' # 0x0036 -> DIGIT SIX + '7' # 0x0037 -> DIGIT SEVEN + '8' # 0x0038 -> DIGIT EIGHT + '9' # 0x0039 -> DIGIT NINE + ':' # 0x003a -> COLON + ';' # 0x003b -> SEMICOLON + '<' # 0x003c -> LESS-THAN SIGN + '=' # 0x003d -> EQUALS SIGN + '>' # 0x003e -> GREATER-THAN SIGN + '?' # 0x003f -> QUESTION MARK + '@' # 0x0040 -> COMMERCIAL AT + 'A' # 0x0041 -> LATIN CAPITAL LETTER A + 'B' # 0x0042 -> LATIN CAPITAL LETTER B + 'C' # 0x0043 -> LATIN CAPITAL LETTER C + 'D' # 0x0044 -> LATIN CAPITAL LETTER D + 'E' # 0x0045 -> LATIN CAPITAL LETTER E + 'F' # 0x0046 -> LATIN CAPITAL LETTER F + 'G' # 0x0047 -> LATIN CAPITAL LETTER G + 'H' # 0x0048 -> LATIN CAPITAL LETTER H + 'I' # 0x0049 -> LATIN CAPITAL LETTER I + 'J' # 0x004a -> LATIN CAPITAL LETTER J + 'K' # 0x004b -> LATIN CAPITAL LETTER K + 'L' # 0x004c -> LATIN CAPITAL LETTER L + 'M' # 0x004d -> LATIN CAPITAL LETTER M + 'N' # 0x004e -> LATIN CAPITAL LETTER N + 'O' # 0x004f -> LATIN CAPITAL LETTER O + 'P' # 0x0050 -> LATIN CAPITAL LETTER P + 'Q' # 0x0051 -> LATIN CAPITAL LETTER Q + 'R' # 0x0052 -> LATIN CAPITAL LETTER R + 'S' # 0x0053 -> LATIN CAPITAL LETTER S + 'T' # 0x0054 -> LATIN CAPITAL LETTER T + 'U' # 0x0055 -> LATIN CAPITAL LETTER U + 'V' # 0x0056 -> LATIN CAPITAL LETTER V + 'W' # 0x0057 -> LATIN CAPITAL LETTER W + 'X' # 0x0058 -> LATIN CAPITAL LETTER X + 'Y' # 0x0059 -> LATIN CAPITAL LETTER Y + 'Z' # 0x005a -> LATIN CAPITAL LETTER Z + '[' # 0x005b -> LEFT SQUARE BRACKET + '\\' # 0x005c -> REVERSE SOLIDUS + ']' # 0x005d -> RIGHT SQUARE BRACKET + '^' # 0x005e -> CIRCUMFLEX ACCENT + '_' # 0x005f -> LOW LINE + '`' # 0x0060 -> GRAVE ACCENT + 'a' # 0x0061 -> LATIN SMALL LETTER A + 'b' # 0x0062 -> LATIN SMALL LETTER B + 'c' # 0x0063 -> LATIN SMALL LETTER C + 'd' # 0x0064 -> LATIN SMALL LETTER D + 'e' # 0x0065 -> LATIN SMALL LETTER E + 'f' # 0x0066 -> LATIN SMALL LETTER F + 'g' # 0x0067 -> LATIN SMALL LETTER G + 'h' # 0x0068 -> LATIN SMALL LETTER H + 'i' # 0x0069 -> LATIN SMALL LETTER I + 'j' # 0x006a -> LATIN SMALL LETTER J + 'k' # 0x006b -> LATIN SMALL LETTER K + 'l' # 0x006c -> LATIN SMALL LETTER L + 'm' # 0x006d -> LATIN SMALL LETTER M + 'n' # 0x006e -> LATIN SMALL LETTER N + 'o' # 0x006f -> LATIN SMALL LETTER O + 'p' # 0x0070 -> LATIN SMALL LETTER P + 'q' # 0x0071 -> LATIN SMALL LETTER Q + 'r' # 0x0072 -> LATIN SMALL LETTER R + 's' # 0x0073 -> LATIN SMALL LETTER S + 't' # 0x0074 -> LATIN SMALL LETTER T + 'u' # 0x0075 -> LATIN SMALL LETTER U + 'v' # 0x0076 -> LATIN SMALL LETTER V + 'w' # 0x0077 -> LATIN SMALL LETTER W + 'x' # 0x0078 -> LATIN SMALL LETTER X + 'y' # 0x0079 -> LATIN SMALL LETTER Y + 'z' # 0x007a -> LATIN SMALL LETTER Z + '{' # 0x007b -> LEFT CURLY BRACKET + '|' # 0x007c -> VERTICAL LINE + '}' # 0x007d -> RIGHT CURLY BRACKET + '~' # 0x007e -> TILDE + '\x7f' # 0x007f -> DELETE + '\xc7' # 0x0080 -> LATIN CAPITAL LETTER C WITH CEDILLA + '\xfc' # 0x0081 -> LATIN SMALL LETTER U WITH DIAERESIS + '\xe9' # 0x0082 -> LATIN SMALL LETTER E WITH ACUTE + '\xe2' # 0x0083 -> LATIN SMALL LETTER A WITH CIRCUMFLEX + '\xc2' # 0x0084 -> LATIN CAPITAL LETTER A WITH CIRCUMFLEX + '\xe0' # 0x0085 -> LATIN SMALL LETTER A WITH GRAVE + '\xb6' # 0x0086 -> PILCROW SIGN + '\xe7' # 0x0087 -> LATIN SMALL LETTER C WITH CEDILLA + '\xea' # 0x0088 -> LATIN SMALL LETTER E WITH CIRCUMFLEX + '\xeb' # 0x0089 -> LATIN SMALL LETTER E WITH DIAERESIS + '\xe8' # 0x008a -> LATIN SMALL LETTER E WITH GRAVE + '\xef' # 0x008b -> LATIN SMALL LETTER I WITH DIAERESIS + '\xee' # 0x008c -> LATIN SMALL LETTER I WITH CIRCUMFLEX + '\u2017' # 0x008d -> DOUBLE LOW LINE + '\xc0' # 0x008e -> LATIN CAPITAL LETTER A WITH GRAVE + '\xa7' # 0x008f -> SECTION SIGN + '\xc9' # 0x0090 -> LATIN CAPITAL LETTER E WITH ACUTE + '\xc8' # 0x0091 -> LATIN CAPITAL LETTER E WITH GRAVE + '\xca' # 0x0092 -> LATIN CAPITAL LETTER E WITH CIRCUMFLEX + '\xf4' # 0x0093 -> LATIN SMALL LETTER O WITH CIRCUMFLEX + '\xcb' # 0x0094 -> LATIN CAPITAL LETTER E WITH DIAERESIS + '\xcf' # 0x0095 -> LATIN CAPITAL LETTER I WITH DIAERESIS + '\xfb' # 0x0096 -> LATIN SMALL LETTER U WITH CIRCUMFLEX + '\xf9' # 0x0097 -> LATIN SMALL LETTER U WITH GRAVE + '\xa4' # 0x0098 -> CURRENCY SIGN + '\xd4' # 0x0099 -> LATIN CAPITAL LETTER O WITH CIRCUMFLEX + '\xdc' # 0x009a -> LATIN CAPITAL LETTER U WITH DIAERESIS + '\xa2' # 0x009b -> CENT SIGN + '\xa3' # 0x009c -> POUND SIGN + '\xd9' # 0x009d -> LATIN CAPITAL LETTER U WITH GRAVE + '\xdb' # 0x009e -> LATIN CAPITAL LETTER U WITH CIRCUMFLEX + '\u0192' # 0x009f -> LATIN SMALL LETTER F WITH HOOK + '\xa6' # 0x00a0 -> BROKEN BAR + '\xb4' # 0x00a1 -> ACUTE ACCENT + '\xf3' # 0x00a2 -> LATIN SMALL LETTER O WITH ACUTE + '\xfa' # 0x00a3 -> LATIN SMALL LETTER U WITH ACUTE + '\xa8' # 0x00a4 -> DIAERESIS + '\xb8' # 0x00a5 -> CEDILLA + '\xb3' # 0x00a6 -> SUPERSCRIPT THREE + '\xaf' # 0x00a7 -> MACRON + '\xce' # 0x00a8 -> LATIN CAPITAL LETTER I WITH CIRCUMFLEX + '\u2310' # 0x00a9 -> REVERSED NOT SIGN + '\xac' # 0x00aa -> NOT SIGN + '\xbd' # 0x00ab -> VULGAR FRACTION ONE HALF + '\xbc' # 0x00ac -> VULGAR FRACTION ONE QUARTER + '\xbe' # 0x00ad -> VULGAR FRACTION THREE QUARTERS + '\xab' # 0x00ae -> LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + '\xbb' # 0x00af -> RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + '\u2591' # 0x00b0 -> LIGHT SHADE + '\u2592' # 0x00b1 -> MEDIUM SHADE + '\u2593' # 0x00b2 -> DARK SHADE + '\u2502' # 0x00b3 -> BOX DRAWINGS LIGHT VERTICAL + '\u2524' # 0x00b4 -> BOX DRAWINGS LIGHT VERTICAL AND LEFT + '\u2561' # 0x00b5 -> BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE + '\u2562' # 0x00b6 -> BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE + '\u2556' # 0x00b7 -> BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE + '\u2555' # 0x00b8 -> BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE + '\u2563' # 0x00b9 -> BOX DRAWINGS DOUBLE VERTICAL AND LEFT + '\u2551' # 0x00ba -> BOX DRAWINGS DOUBLE VERTICAL + '\u2557' # 0x00bb -> BOX DRAWINGS DOUBLE DOWN AND LEFT + '\u255d' # 0x00bc -> BOX DRAWINGS DOUBLE UP AND LEFT + '\u255c' # 0x00bd -> BOX DRAWINGS UP DOUBLE AND LEFT SINGLE + '\u255b' # 0x00be -> BOX DRAWINGS UP SINGLE AND LEFT DOUBLE + '\u2510' # 0x00bf -> BOX DRAWINGS LIGHT DOWN AND LEFT + '\u2514' # 0x00c0 -> BOX DRAWINGS LIGHT UP AND RIGHT + '\u2534' # 0x00c1 -> BOX DRAWINGS LIGHT UP AND HORIZONTAL + '\u252c' # 0x00c2 -> BOX DRAWINGS LIGHT DOWN AND HORIZONTAL + '\u251c' # 0x00c3 -> BOX DRAWINGS LIGHT VERTICAL AND RIGHT + '\u2500' # 0x00c4 -> BOX DRAWINGS LIGHT HORIZONTAL + '\u253c' # 0x00c5 -> BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL + '\u255e' # 0x00c6 -> BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE + '\u255f' # 0x00c7 -> BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE + '\u255a' # 0x00c8 -> BOX DRAWINGS DOUBLE UP AND RIGHT + '\u2554' # 0x00c9 -> BOX DRAWINGS DOUBLE DOWN AND RIGHT + '\u2569' # 0x00ca -> BOX DRAWINGS DOUBLE UP AND HORIZONTAL + '\u2566' # 0x00cb -> BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL + '\u2560' # 0x00cc -> BOX DRAWINGS DOUBLE VERTICAL AND RIGHT + '\u2550' # 0x00cd -> BOX DRAWINGS DOUBLE HORIZONTAL + '\u256c' # 0x00ce -> BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL + '\u2567' # 0x00cf -> BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE + '\u2568' # 0x00d0 -> BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE + '\u2564' # 0x00d1 -> BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE + '\u2565' # 0x00d2 -> BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE + '\u2559' # 0x00d3 -> BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE + '\u2558' # 0x00d4 -> BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE + '\u2552' # 0x00d5 -> BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE + '\u2553' # 0x00d6 -> BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE + '\u256b' # 0x00d7 -> BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE + '\u256a' # 0x00d8 -> BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE + '\u2518' # 0x00d9 -> BOX DRAWINGS LIGHT UP AND LEFT + '\u250c' # 0x00da -> BOX DRAWINGS LIGHT DOWN AND RIGHT + '\u2588' # 0x00db -> FULL BLOCK + '\u2584' # 0x00dc -> LOWER HALF BLOCK + '\u258c' # 0x00dd -> LEFT HALF BLOCK + '\u2590' # 0x00de -> RIGHT HALF BLOCK + '\u2580' # 0x00df -> UPPER HALF BLOCK + '\u03b1' # 0x00e0 -> GREEK SMALL LETTER ALPHA + '\xdf' # 0x00e1 -> LATIN SMALL LETTER SHARP S + '\u0393' # 0x00e2 -> GREEK CAPITAL LETTER GAMMA + '\u03c0' # 0x00e3 -> GREEK SMALL LETTER PI + '\u03a3' # 0x00e4 -> GREEK CAPITAL LETTER SIGMA + '\u03c3' # 0x00e5 -> GREEK SMALL LETTER SIGMA + '\xb5' # 0x00e6 -> MICRO SIGN + '\u03c4' # 0x00e7 -> GREEK SMALL LETTER TAU + '\u03a6' # 0x00e8 -> GREEK CAPITAL LETTER PHI + '\u0398' # 0x00e9 -> GREEK CAPITAL LETTER THETA + '\u03a9' # 0x00ea -> GREEK CAPITAL LETTER OMEGA + '\u03b4' # 0x00eb -> GREEK SMALL LETTER DELTA + '\u221e' # 0x00ec -> INFINITY + '\u03c6' # 0x00ed -> GREEK SMALL LETTER PHI + '\u03b5' # 0x00ee -> GREEK SMALL LETTER EPSILON + '\u2229' # 0x00ef -> INTERSECTION + '\u2261' # 0x00f0 -> IDENTICAL TO + '\xb1' # 0x00f1 -> PLUS-MINUS SIGN + '\u2265' # 0x00f2 -> GREATER-THAN OR EQUAL TO + '\u2264' # 0x00f3 -> LESS-THAN OR EQUAL TO + '\u2320' # 0x00f4 -> TOP HALF INTEGRAL + '\u2321' # 0x00f5 -> BOTTOM HALF INTEGRAL + '\xf7' # 0x00f6 -> DIVISION SIGN + '\u2248' # 0x00f7 -> ALMOST EQUAL TO + '\xb0' # 0x00f8 -> DEGREE SIGN + '\u2219' # 0x00f9 -> BULLET OPERATOR + '\xb7' # 0x00fa -> MIDDLE DOT + '\u221a' # 0x00fb -> SQUARE ROOT + '\u207f' # 0x00fc -> SUPERSCRIPT LATIN SMALL LETTER N + '\xb2' # 0x00fd -> SUPERSCRIPT TWO + '\u25a0' # 0x00fe -> BLACK SQUARE + '\xa0' # 0x00ff -> NO-BREAK SPACE +) + +### Encoding Map + +encoding_map = { + 0x0000: 0x0000, # NULL + 0x0001: 0x0001, # START OF HEADING + 0x0002: 0x0002, # START OF TEXT + 0x0003: 0x0003, # END OF TEXT + 0x0004: 0x0004, # END OF TRANSMISSION + 0x0005: 0x0005, # ENQUIRY + 0x0006: 0x0006, # ACKNOWLEDGE + 0x0007: 0x0007, # BELL + 0x0008: 0x0008, # BACKSPACE + 0x0009: 0x0009, # HORIZONTAL TABULATION + 0x000a: 0x000a, # LINE FEED + 0x000b: 0x000b, # VERTICAL TABULATION + 0x000c: 0x000c, # FORM FEED + 0x000d: 0x000d, # CARRIAGE RETURN + 0x000e: 0x000e, # SHIFT OUT + 0x000f: 0x000f, # SHIFT IN + 0x0010: 0x0010, # DATA LINK ESCAPE + 0x0011: 0x0011, # DEVICE CONTROL ONE + 0x0012: 0x0012, # DEVICE CONTROL TWO + 0x0013: 0x0013, # DEVICE CONTROL THREE + 0x0014: 0x0014, # DEVICE CONTROL FOUR + 0x0015: 0x0015, # NEGATIVE ACKNOWLEDGE + 0x0016: 0x0016, # SYNCHRONOUS IDLE + 0x0017: 0x0017, # END OF TRANSMISSION BLOCK + 0x0018: 0x0018, # CANCEL + 0x0019: 0x0019, # END OF MEDIUM + 0x001a: 0x001a, # SUBSTITUTE + 0x001b: 0x001b, # ESCAPE + 0x001c: 0x001c, # FILE SEPARATOR + 0x001d: 0x001d, # GROUP SEPARATOR + 0x001e: 0x001e, # RECORD SEPARATOR + 0x001f: 0x001f, # UNIT SEPARATOR + 0x0020: 0x0020, # SPACE + 0x0021: 0x0021, # EXCLAMATION MARK + 0x0022: 0x0022, # QUOTATION MARK + 0x0023: 0x0023, # NUMBER SIGN + 0x0024: 0x0024, # DOLLAR SIGN + 0x0025: 0x0025, # PERCENT SIGN + 0x0026: 0x0026, # AMPERSAND + 0x0027: 0x0027, # APOSTROPHE + 0x0028: 0x0028, # LEFT PARENTHESIS + 0x0029: 0x0029, # RIGHT PARENTHESIS + 0x002a: 0x002a, # ASTERISK + 0x002b: 0x002b, # PLUS SIGN + 0x002c: 0x002c, # COMMA + 0x002d: 0x002d, # HYPHEN-MINUS + 0x002e: 0x002e, # FULL STOP + 0x002f: 0x002f, # SOLIDUS + 0x0030: 0x0030, # DIGIT ZERO + 0x0031: 0x0031, # DIGIT ONE + 0x0032: 0x0032, # DIGIT TWO + 0x0033: 0x0033, # DIGIT THREE + 0x0034: 0x0034, # DIGIT FOUR + 0x0035: 0x0035, # DIGIT FIVE + 0x0036: 0x0036, # DIGIT SIX + 0x0037: 0x0037, # DIGIT SEVEN + 0x0038: 0x0038, # DIGIT EIGHT + 0x0039: 0x0039, # DIGIT NINE + 0x003a: 0x003a, # COLON + 0x003b: 0x003b, # SEMICOLON + 0x003c: 0x003c, # LESS-THAN SIGN + 0x003d: 0x003d, # EQUALS SIGN + 0x003e: 0x003e, # GREATER-THAN SIGN + 0x003f: 0x003f, # QUESTION MARK + 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 + 0x005c: 0x005c, # REVERSE SOLIDUS + 0x005d: 0x005d, # RIGHT SQUARE BRACKET + 0x005e: 0x005e, # CIRCUMFLEX ACCENT + 0x005f: 0x005f, # LOW LINE + 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 + 0x007c: 0x007c, # VERTICAL LINE + 0x007d: 0x007d, # RIGHT CURLY BRACKET + 0x007e: 0x007e, # TILDE + 0x007f: 0x007f, # DELETE + 0x00a0: 0x00ff, # NO-BREAK SPACE + 0x00a2: 0x009b, # CENT SIGN + 0x00a3: 0x009c, # POUND SIGN + 0x00a4: 0x0098, # CURRENCY SIGN + 0x00a6: 0x00a0, # BROKEN BAR + 0x00a7: 0x008f, # SECTION SIGN + 0x00a8: 0x00a4, # DIAERESIS + 0x00ab: 0x00ae, # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00ac: 0x00aa, # NOT SIGN + 0x00af: 0x00a7, # MACRON + 0x00b0: 0x00f8, # DEGREE SIGN + 0x00b1: 0x00f1, # PLUS-MINUS SIGN + 0x00b2: 0x00fd, # SUPERSCRIPT TWO + 0x00b3: 0x00a6, # SUPERSCRIPT THREE + 0x00b4: 0x00a1, # ACUTE ACCENT + 0x00b5: 0x00e6, # MICRO SIGN + 0x00b6: 0x0086, # PILCROW SIGN + 0x00b7: 0x00fa, # MIDDLE DOT + 0x00b8: 0x00a5, # CEDILLA + 0x00bb: 0x00af, # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00bc: 0x00ac, # VULGAR FRACTION ONE QUARTER + 0x00bd: 0x00ab, # VULGAR FRACTION ONE HALF + 0x00be: 0x00ad, # VULGAR FRACTION THREE QUARTERS + 0x00c0: 0x008e, # LATIN CAPITAL LETTER A WITH GRAVE + 0x00c2: 0x0084, # LATIN CAPITAL LETTER A WITH CIRCUMFLEX + 0x00c7: 0x0080, # LATIN CAPITAL LETTER C WITH CEDILLA + 0x00c8: 0x0091, # LATIN CAPITAL LETTER E WITH GRAVE + 0x00c9: 0x0090, # LATIN CAPITAL LETTER E WITH ACUTE + 0x00ca: 0x0092, # LATIN CAPITAL LETTER E WITH CIRCUMFLEX + 0x00cb: 0x0094, # LATIN CAPITAL LETTER E WITH DIAERESIS + 0x00ce: 0x00a8, # LATIN CAPITAL LETTER I WITH CIRCUMFLEX + 0x00cf: 0x0095, # LATIN CAPITAL LETTER I WITH DIAERESIS + 0x00d4: 0x0099, # LATIN CAPITAL LETTER O WITH CIRCUMFLEX + 0x00d9: 0x009d, # LATIN CAPITAL LETTER U WITH GRAVE + 0x00db: 0x009e, # LATIN CAPITAL LETTER U WITH CIRCUMFLEX + 0x00dc: 0x009a, # LATIN CAPITAL LETTER U WITH DIAERESIS + 0x00df: 0x00e1, # LATIN SMALL LETTER SHARP S + 0x00e0: 0x0085, # LATIN SMALL LETTER A WITH GRAVE + 0x00e2: 0x0083, # LATIN SMALL LETTER A WITH CIRCUMFLEX + 0x00e7: 0x0087, # LATIN SMALL LETTER C WITH CEDILLA + 0x00e8: 0x008a, # LATIN SMALL LETTER E WITH GRAVE + 0x00e9: 0x0082, # LATIN SMALL LETTER E WITH ACUTE + 0x00ea: 0x0088, # LATIN SMALL LETTER E WITH CIRCUMFLEX + 0x00eb: 0x0089, # LATIN SMALL LETTER E WITH DIAERESIS + 0x00ee: 0x008c, # LATIN SMALL LETTER I WITH CIRCUMFLEX + 0x00ef: 0x008b, # LATIN SMALL LETTER I WITH DIAERESIS + 0x00f3: 0x00a2, # LATIN SMALL LETTER O WITH ACUTE + 0x00f4: 0x0093, # LATIN SMALL LETTER O WITH CIRCUMFLEX + 0x00f7: 0x00f6, # DIVISION SIGN + 0x00f9: 0x0097, # LATIN SMALL LETTER U WITH GRAVE + 0x00fa: 0x00a3, # LATIN SMALL LETTER U WITH ACUTE + 0x00fb: 0x0096, # LATIN SMALL LETTER U WITH CIRCUMFLEX + 0x00fc: 0x0081, # LATIN SMALL LETTER U WITH DIAERESIS + 0x0192: 0x009f, # LATIN SMALL LETTER F WITH HOOK + 0x0393: 0x00e2, # GREEK CAPITAL LETTER GAMMA + 0x0398: 0x00e9, # GREEK CAPITAL LETTER THETA + 0x03a3: 0x00e4, # GREEK CAPITAL LETTER SIGMA + 0x03a6: 0x00e8, # GREEK CAPITAL LETTER PHI + 0x03a9: 0x00ea, # GREEK CAPITAL LETTER OMEGA + 0x03b1: 0x00e0, # GREEK SMALL LETTER ALPHA + 0x03b4: 0x00eb, # GREEK SMALL LETTER DELTA + 0x03b5: 0x00ee, # GREEK SMALL LETTER EPSILON + 0x03c0: 0x00e3, # GREEK SMALL LETTER PI + 0x03c3: 0x00e5, # GREEK SMALL LETTER SIGMA + 0x03c4: 0x00e7, # GREEK SMALL LETTER TAU + 0x03c6: 0x00ed, # GREEK SMALL LETTER PHI + 0x2017: 0x008d, # DOUBLE LOW LINE + 0x207f: 0x00fc, # SUPERSCRIPT LATIN SMALL LETTER N + 0x2219: 0x00f9, # BULLET OPERATOR + 0x221a: 0x00fb, # SQUARE ROOT + 0x221e: 0x00ec, # INFINITY + 0x2229: 0x00ef, # INTERSECTION + 0x2248: 0x00f7, # ALMOST EQUAL TO + 0x2261: 0x00f0, # IDENTICAL TO + 0x2264: 0x00f3, # LESS-THAN OR EQUAL TO + 0x2265: 0x00f2, # GREATER-THAN OR EQUAL TO + 0x2310: 0x00a9, # REVERSED NOT SIGN + 0x2320: 0x00f4, # TOP HALF INTEGRAL + 0x2321: 0x00f5, # BOTTOM HALF INTEGRAL + 0x2500: 0x00c4, # BOX DRAWINGS LIGHT HORIZONTAL + 0x2502: 0x00b3, # BOX DRAWINGS LIGHT VERTICAL + 0x250c: 0x00da, # BOX DRAWINGS LIGHT DOWN AND RIGHT + 0x2510: 0x00bf, # BOX DRAWINGS LIGHT DOWN AND LEFT + 0x2514: 0x00c0, # BOX DRAWINGS LIGHT UP AND RIGHT + 0x2518: 0x00d9, # BOX DRAWINGS LIGHT UP AND LEFT + 0x251c: 0x00c3, # BOX DRAWINGS LIGHT VERTICAL AND RIGHT + 0x2524: 0x00b4, # BOX DRAWINGS LIGHT VERTICAL AND LEFT + 0x252c: 0x00c2, # BOX DRAWINGS LIGHT DOWN AND HORIZONTAL + 0x2534: 0x00c1, # BOX DRAWINGS LIGHT UP AND HORIZONTAL + 0x253c: 0x00c5, # BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL + 0x2550: 0x00cd, # BOX DRAWINGS DOUBLE HORIZONTAL + 0x2551: 0x00ba, # BOX DRAWINGS DOUBLE VERTICAL + 0x2552: 0x00d5, # BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE + 0x2553: 0x00d6, # BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE + 0x2554: 0x00c9, # BOX DRAWINGS DOUBLE DOWN AND RIGHT + 0x2555: 0x00b8, # BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE + 0x2556: 0x00b7, # BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE + 0x2557: 0x00bb, # BOX DRAWINGS DOUBLE DOWN AND LEFT + 0x2558: 0x00d4, # BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE + 0x2559: 0x00d3, # BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE + 0x255a: 0x00c8, # BOX DRAWINGS DOUBLE UP AND RIGHT + 0x255b: 0x00be, # BOX DRAWINGS UP SINGLE AND LEFT DOUBLE + 0x255c: 0x00bd, # BOX DRAWINGS UP DOUBLE AND LEFT SINGLE + 0x255d: 0x00bc, # BOX DRAWINGS DOUBLE UP AND LEFT + 0x255e: 0x00c6, # BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE + 0x255f: 0x00c7, # BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE + 0x2560: 0x00cc, # BOX DRAWINGS DOUBLE VERTICAL AND RIGHT + 0x2561: 0x00b5, # BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE + 0x2562: 0x00b6, # BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE + 0x2563: 0x00b9, # BOX DRAWINGS DOUBLE VERTICAL AND LEFT + 0x2564: 0x00d1, # BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE + 0x2565: 0x00d2, # BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE + 0x2566: 0x00cb, # BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL + 0x2567: 0x00cf, # BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE + 0x2568: 0x00d0, # BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE + 0x2569: 0x00ca, # BOX DRAWINGS DOUBLE UP AND HORIZONTAL + 0x256a: 0x00d8, # BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE + 0x256b: 0x00d7, # BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE + 0x256c: 0x00ce, # BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL + 0x2580: 0x00df, # UPPER HALF BLOCK + 0x2584: 0x00dc, # LOWER HALF BLOCK + 0x2588: 0x00db, # FULL BLOCK + 0x258c: 0x00dd, # LEFT HALF BLOCK + 0x2590: 0x00de, # RIGHT HALF BLOCK + 0x2591: 0x00b0, # LIGHT SHADE + 0x2592: 0x00b1, # MEDIUM SHADE + 0x2593: 0x00b2, # DARK SHADE + 0x25a0: 0x00fe, # BLACK SQUARE +} diff --git a/env/Lib/encodings/cp864.py b/env/Lib/encodings/cp864.py new file mode 100644 index 0000000..53df482 --- /dev/null +++ b/env/Lib/encodings/cp864.py @@ -0,0 +1,690 @@ +""" Python Character Mapping Codec generated from 'VENDORS/MICSFT/PC/CP864.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_map) + + 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_map)[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='cp864', + 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({ + 0x0025: 0x066a, # ARABIC PERCENT SIGN + 0x0080: 0x00b0, # DEGREE SIGN + 0x0081: 0x00b7, # MIDDLE DOT + 0x0082: 0x2219, # BULLET OPERATOR + 0x0083: 0x221a, # SQUARE ROOT + 0x0084: 0x2592, # MEDIUM SHADE + 0x0085: 0x2500, # FORMS LIGHT HORIZONTAL + 0x0086: 0x2502, # FORMS LIGHT VERTICAL + 0x0087: 0x253c, # FORMS LIGHT VERTICAL AND HORIZONTAL + 0x0088: 0x2524, # FORMS LIGHT VERTICAL AND LEFT + 0x0089: 0x252c, # FORMS LIGHT DOWN AND HORIZONTAL + 0x008a: 0x251c, # FORMS LIGHT VERTICAL AND RIGHT + 0x008b: 0x2534, # FORMS LIGHT UP AND HORIZONTAL + 0x008c: 0x2510, # FORMS LIGHT DOWN AND LEFT + 0x008d: 0x250c, # FORMS LIGHT DOWN AND RIGHT + 0x008e: 0x2514, # FORMS LIGHT UP AND RIGHT + 0x008f: 0x2518, # FORMS LIGHT UP AND LEFT + 0x0090: 0x03b2, # GREEK SMALL BETA + 0x0091: 0x221e, # INFINITY + 0x0092: 0x03c6, # GREEK SMALL PHI + 0x0093: 0x00b1, # PLUS-OR-MINUS SIGN + 0x0094: 0x00bd, # FRACTION 1/2 + 0x0095: 0x00bc, # FRACTION 1/4 + 0x0096: 0x2248, # ALMOST EQUAL TO + 0x0097: 0x00ab, # LEFT POINTING GUILLEMET + 0x0098: 0x00bb, # RIGHT POINTING GUILLEMET + 0x0099: 0xfef7, # ARABIC LIGATURE LAM WITH ALEF WITH HAMZA ABOVE ISOLATED FORM + 0x009a: 0xfef8, # ARABIC LIGATURE LAM WITH ALEF WITH HAMZA ABOVE FINAL FORM + 0x009b: None, # UNDEFINED + 0x009c: None, # UNDEFINED + 0x009d: 0xfefb, # ARABIC LIGATURE LAM WITH ALEF ISOLATED FORM + 0x009e: 0xfefc, # ARABIC LIGATURE LAM WITH ALEF FINAL FORM + 0x009f: None, # UNDEFINED + 0x00a1: 0x00ad, # SOFT HYPHEN + 0x00a2: 0xfe82, # ARABIC LETTER ALEF WITH MADDA ABOVE FINAL FORM + 0x00a5: 0xfe84, # ARABIC LETTER ALEF WITH HAMZA ABOVE FINAL FORM + 0x00a6: None, # UNDEFINED + 0x00a7: None, # UNDEFINED + 0x00a8: 0xfe8e, # ARABIC LETTER ALEF FINAL FORM + 0x00a9: 0xfe8f, # ARABIC LETTER BEH ISOLATED FORM + 0x00aa: 0xfe95, # ARABIC LETTER TEH ISOLATED FORM + 0x00ab: 0xfe99, # ARABIC LETTER THEH ISOLATED FORM + 0x00ac: 0x060c, # ARABIC COMMA + 0x00ad: 0xfe9d, # ARABIC LETTER JEEM ISOLATED FORM + 0x00ae: 0xfea1, # ARABIC LETTER HAH ISOLATED FORM + 0x00af: 0xfea5, # ARABIC LETTER KHAH ISOLATED FORM + 0x00b0: 0x0660, # ARABIC-INDIC DIGIT ZERO + 0x00b1: 0x0661, # ARABIC-INDIC DIGIT ONE + 0x00b2: 0x0662, # ARABIC-INDIC DIGIT TWO + 0x00b3: 0x0663, # ARABIC-INDIC DIGIT THREE + 0x00b4: 0x0664, # ARABIC-INDIC DIGIT FOUR + 0x00b5: 0x0665, # ARABIC-INDIC DIGIT FIVE + 0x00b6: 0x0666, # ARABIC-INDIC DIGIT SIX + 0x00b7: 0x0667, # ARABIC-INDIC DIGIT SEVEN + 0x00b8: 0x0668, # ARABIC-INDIC DIGIT EIGHT + 0x00b9: 0x0669, # ARABIC-INDIC DIGIT NINE + 0x00ba: 0xfed1, # ARABIC LETTER FEH ISOLATED FORM + 0x00bb: 0x061b, # ARABIC SEMICOLON + 0x00bc: 0xfeb1, # ARABIC LETTER SEEN ISOLATED FORM + 0x00bd: 0xfeb5, # ARABIC LETTER SHEEN ISOLATED FORM + 0x00be: 0xfeb9, # ARABIC LETTER SAD ISOLATED FORM + 0x00bf: 0x061f, # ARABIC QUESTION MARK + 0x00c0: 0x00a2, # CENT SIGN + 0x00c1: 0xfe80, # ARABIC LETTER HAMZA ISOLATED FORM + 0x00c2: 0xfe81, # ARABIC LETTER ALEF WITH MADDA ABOVE ISOLATED FORM + 0x00c3: 0xfe83, # ARABIC LETTER ALEF WITH HAMZA ABOVE ISOLATED FORM + 0x00c4: 0xfe85, # ARABIC LETTER WAW WITH HAMZA ABOVE ISOLATED FORM + 0x00c5: 0xfeca, # ARABIC LETTER AIN FINAL FORM + 0x00c6: 0xfe8b, # ARABIC LETTER YEH WITH HAMZA ABOVE INITIAL FORM + 0x00c7: 0xfe8d, # ARABIC LETTER ALEF ISOLATED FORM + 0x00c8: 0xfe91, # ARABIC LETTER BEH INITIAL FORM + 0x00c9: 0xfe93, # ARABIC LETTER TEH MARBUTA ISOLATED FORM + 0x00ca: 0xfe97, # ARABIC LETTER TEH INITIAL FORM + 0x00cb: 0xfe9b, # ARABIC LETTER THEH INITIAL FORM + 0x00cc: 0xfe9f, # ARABIC LETTER JEEM INITIAL FORM + 0x00cd: 0xfea3, # ARABIC LETTER HAH INITIAL FORM + 0x00ce: 0xfea7, # ARABIC LETTER KHAH INITIAL FORM + 0x00cf: 0xfea9, # ARABIC LETTER DAL ISOLATED FORM + 0x00d0: 0xfeab, # ARABIC LETTER THAL ISOLATED FORM + 0x00d1: 0xfead, # ARABIC LETTER REH ISOLATED FORM + 0x00d2: 0xfeaf, # ARABIC LETTER ZAIN ISOLATED FORM + 0x00d3: 0xfeb3, # ARABIC LETTER SEEN INITIAL FORM + 0x00d4: 0xfeb7, # ARABIC LETTER SHEEN INITIAL FORM + 0x00d5: 0xfebb, # ARABIC LETTER SAD INITIAL FORM + 0x00d6: 0xfebf, # ARABIC LETTER DAD INITIAL FORM + 0x00d7: 0xfec1, # ARABIC LETTER TAH ISOLATED FORM + 0x00d8: 0xfec5, # ARABIC LETTER ZAH ISOLATED FORM + 0x00d9: 0xfecb, # ARABIC LETTER AIN INITIAL FORM + 0x00da: 0xfecf, # ARABIC LETTER GHAIN INITIAL FORM + 0x00db: 0x00a6, # BROKEN VERTICAL BAR + 0x00dc: 0x00ac, # NOT SIGN + 0x00dd: 0x00f7, # DIVISION SIGN + 0x00de: 0x00d7, # MULTIPLICATION SIGN + 0x00df: 0xfec9, # ARABIC LETTER AIN ISOLATED FORM + 0x00e0: 0x0640, # ARABIC TATWEEL + 0x00e1: 0xfed3, # ARABIC LETTER FEH INITIAL FORM + 0x00e2: 0xfed7, # ARABIC LETTER QAF INITIAL FORM + 0x00e3: 0xfedb, # ARABIC LETTER KAF INITIAL FORM + 0x00e4: 0xfedf, # ARABIC LETTER LAM INITIAL FORM + 0x00e5: 0xfee3, # ARABIC LETTER MEEM INITIAL FORM + 0x00e6: 0xfee7, # ARABIC LETTER NOON INITIAL FORM + 0x00e7: 0xfeeb, # ARABIC LETTER HEH INITIAL FORM + 0x00e8: 0xfeed, # ARABIC LETTER WAW ISOLATED FORM + 0x00e9: 0xfeef, # ARABIC LETTER ALEF MAKSURA ISOLATED FORM + 0x00ea: 0xfef3, # ARABIC LETTER YEH INITIAL FORM + 0x00eb: 0xfebd, # ARABIC LETTER DAD ISOLATED FORM + 0x00ec: 0xfecc, # ARABIC LETTER AIN MEDIAL FORM + 0x00ed: 0xfece, # ARABIC LETTER GHAIN FINAL FORM + 0x00ee: 0xfecd, # ARABIC LETTER GHAIN ISOLATED FORM + 0x00ef: 0xfee1, # ARABIC LETTER MEEM ISOLATED FORM + 0x00f0: 0xfe7d, # ARABIC SHADDA MEDIAL FORM + 0x00f1: 0x0651, # ARABIC SHADDAH + 0x00f2: 0xfee5, # ARABIC LETTER NOON ISOLATED FORM + 0x00f3: 0xfee9, # ARABIC LETTER HEH ISOLATED FORM + 0x00f4: 0xfeec, # ARABIC LETTER HEH MEDIAL FORM + 0x00f5: 0xfef0, # ARABIC LETTER ALEF MAKSURA FINAL FORM + 0x00f6: 0xfef2, # ARABIC LETTER YEH FINAL FORM + 0x00f7: 0xfed0, # ARABIC LETTER GHAIN MEDIAL FORM + 0x00f8: 0xfed5, # ARABIC LETTER QAF ISOLATED FORM + 0x00f9: 0xfef5, # ARABIC LIGATURE LAM WITH ALEF WITH MADDA ABOVE ISOLATED FORM + 0x00fa: 0xfef6, # ARABIC LIGATURE LAM WITH ALEF WITH MADDA ABOVE FINAL FORM + 0x00fb: 0xfedd, # ARABIC LETTER LAM ISOLATED FORM + 0x00fc: 0xfed9, # ARABIC LETTER KAF ISOLATED FORM + 0x00fd: 0xfef1, # ARABIC LETTER YEH ISOLATED FORM + 0x00fe: 0x25a0, # BLACK SQUARE + 0x00ff: None, # UNDEFINED +}) + +### Decoding Table + +decoding_table = ( + '\x00' # 0x0000 -> NULL + '\x01' # 0x0001 -> START OF HEADING + '\x02' # 0x0002 -> START OF TEXT + '\x03' # 0x0003 -> END OF TEXT + '\x04' # 0x0004 -> END OF TRANSMISSION + '\x05' # 0x0005 -> ENQUIRY + '\x06' # 0x0006 -> ACKNOWLEDGE + '\x07' # 0x0007 -> BELL + '\x08' # 0x0008 -> BACKSPACE + '\t' # 0x0009 -> HORIZONTAL TABULATION + '\n' # 0x000a -> LINE FEED + '\x0b' # 0x000b -> VERTICAL TABULATION + '\x0c' # 0x000c -> FORM FEED + '\r' # 0x000d -> CARRIAGE RETURN + '\x0e' # 0x000e -> SHIFT OUT + '\x0f' # 0x000f -> SHIFT IN + '\x10' # 0x0010 -> DATA LINK ESCAPE + '\x11' # 0x0011 -> DEVICE CONTROL ONE + '\x12' # 0x0012 -> DEVICE CONTROL TWO + '\x13' # 0x0013 -> DEVICE CONTROL THREE + '\x14' # 0x0014 -> DEVICE CONTROL FOUR + '\x15' # 0x0015 -> NEGATIVE ACKNOWLEDGE + '\x16' # 0x0016 -> SYNCHRONOUS IDLE + '\x17' # 0x0017 -> END OF TRANSMISSION BLOCK + '\x18' # 0x0018 -> CANCEL + '\x19' # 0x0019 -> END OF MEDIUM + '\x1a' # 0x001a -> SUBSTITUTE + '\x1b' # 0x001b -> ESCAPE + '\x1c' # 0x001c -> FILE SEPARATOR + '\x1d' # 0x001d -> GROUP SEPARATOR + '\x1e' # 0x001e -> RECORD SEPARATOR + '\x1f' # 0x001f -> UNIT SEPARATOR + ' ' # 0x0020 -> SPACE + '!' # 0x0021 -> EXCLAMATION MARK + '"' # 0x0022 -> QUOTATION MARK + '#' # 0x0023 -> NUMBER SIGN + '$' # 0x0024 -> DOLLAR SIGN + '\u066a' # 0x0025 -> ARABIC PERCENT SIGN + '&' # 0x0026 -> AMPERSAND + "'" # 0x0027 -> APOSTROPHE + '(' # 0x0028 -> LEFT PARENTHESIS + ')' # 0x0029 -> RIGHT PARENTHESIS + '*' # 0x002a -> ASTERISK + '+' # 0x002b -> PLUS SIGN + ',' # 0x002c -> COMMA + '-' # 0x002d -> HYPHEN-MINUS + '.' # 0x002e -> FULL STOP + '/' # 0x002f -> SOLIDUS + '0' # 0x0030 -> DIGIT ZERO + '1' # 0x0031 -> DIGIT ONE + '2' # 0x0032 -> DIGIT TWO + '3' # 0x0033 -> DIGIT THREE + '4' # 0x0034 -> DIGIT FOUR + '5' # 0x0035 -> DIGIT FIVE + '6' # 0x0036 -> DIGIT SIX + '7' # 0x0037 -> DIGIT SEVEN + '8' # 0x0038 -> DIGIT EIGHT + '9' # 0x0039 -> DIGIT NINE + ':' # 0x003a -> COLON + ';' # 0x003b -> SEMICOLON + '<' # 0x003c -> LESS-THAN SIGN + '=' # 0x003d -> EQUALS SIGN + '>' # 0x003e -> GREATER-THAN SIGN + '?' # 0x003f -> QUESTION MARK + '@' # 0x0040 -> COMMERCIAL AT + 'A' # 0x0041 -> LATIN CAPITAL LETTER A + 'B' # 0x0042 -> LATIN CAPITAL LETTER B + 'C' # 0x0043 -> LATIN CAPITAL LETTER C + 'D' # 0x0044 -> LATIN CAPITAL LETTER D + 'E' # 0x0045 -> LATIN CAPITAL LETTER E + 'F' # 0x0046 -> LATIN CAPITAL LETTER F + 'G' # 0x0047 -> LATIN CAPITAL LETTER G + 'H' # 0x0048 -> LATIN CAPITAL LETTER H + 'I' # 0x0049 -> LATIN CAPITAL LETTER I + 'J' # 0x004a -> LATIN CAPITAL LETTER J + 'K' # 0x004b -> LATIN CAPITAL LETTER K + 'L' # 0x004c -> LATIN CAPITAL LETTER L + 'M' # 0x004d -> LATIN CAPITAL LETTER M + 'N' # 0x004e -> LATIN CAPITAL LETTER N + 'O' # 0x004f -> LATIN CAPITAL LETTER O + 'P' # 0x0050 -> LATIN CAPITAL LETTER P + 'Q' # 0x0051 -> LATIN CAPITAL LETTER Q + 'R' # 0x0052 -> LATIN CAPITAL LETTER R + 'S' # 0x0053 -> LATIN CAPITAL LETTER S + 'T' # 0x0054 -> LATIN CAPITAL LETTER T + 'U' # 0x0055 -> LATIN CAPITAL LETTER U + 'V' # 0x0056 -> LATIN CAPITAL LETTER V + 'W' # 0x0057 -> LATIN CAPITAL LETTER W + 'X' # 0x0058 -> LATIN CAPITAL LETTER X + 'Y' # 0x0059 -> LATIN CAPITAL LETTER Y + 'Z' # 0x005a -> LATIN CAPITAL LETTER Z + '[' # 0x005b -> LEFT SQUARE BRACKET + '\\' # 0x005c -> REVERSE SOLIDUS + ']' # 0x005d -> RIGHT SQUARE BRACKET + '^' # 0x005e -> CIRCUMFLEX ACCENT + '_' # 0x005f -> LOW LINE + '`' # 0x0060 -> GRAVE ACCENT + 'a' # 0x0061 -> LATIN SMALL LETTER A + 'b' # 0x0062 -> LATIN SMALL LETTER B + 'c' # 0x0063 -> LATIN SMALL LETTER C + 'd' # 0x0064 -> LATIN SMALL LETTER D + 'e' # 0x0065 -> LATIN SMALL LETTER E + 'f' # 0x0066 -> LATIN SMALL LETTER F + 'g' # 0x0067 -> LATIN SMALL LETTER G + 'h' # 0x0068 -> LATIN SMALL LETTER H + 'i' # 0x0069 -> LATIN SMALL LETTER I + 'j' # 0x006a -> LATIN SMALL LETTER J + 'k' # 0x006b -> LATIN SMALL LETTER K + 'l' # 0x006c -> LATIN SMALL LETTER L + 'm' # 0x006d -> LATIN SMALL LETTER M + 'n' # 0x006e -> LATIN SMALL LETTER N + 'o' # 0x006f -> LATIN SMALL LETTER O + 'p' # 0x0070 -> LATIN SMALL LETTER P + 'q' # 0x0071 -> LATIN SMALL LETTER Q + 'r' # 0x0072 -> LATIN SMALL LETTER R + 's' # 0x0073 -> LATIN SMALL LETTER S + 't' # 0x0074 -> LATIN SMALL LETTER T + 'u' # 0x0075 -> LATIN SMALL LETTER U + 'v' # 0x0076 -> LATIN SMALL LETTER V + 'w' # 0x0077 -> LATIN SMALL LETTER W + 'x' # 0x0078 -> LATIN SMALL LETTER X + 'y' # 0x0079 -> LATIN SMALL LETTER Y + 'z' # 0x007a -> LATIN SMALL LETTER Z + '{' # 0x007b -> LEFT CURLY BRACKET + '|' # 0x007c -> VERTICAL LINE + '}' # 0x007d -> RIGHT CURLY BRACKET + '~' # 0x007e -> TILDE + '\x7f' # 0x007f -> DELETE + '\xb0' # 0x0080 -> DEGREE SIGN + '\xb7' # 0x0081 -> MIDDLE DOT + '\u2219' # 0x0082 -> BULLET OPERATOR + '\u221a' # 0x0083 -> SQUARE ROOT + '\u2592' # 0x0084 -> MEDIUM SHADE + '\u2500' # 0x0085 -> FORMS LIGHT HORIZONTAL + '\u2502' # 0x0086 -> FORMS LIGHT VERTICAL + '\u253c' # 0x0087 -> FORMS LIGHT VERTICAL AND HORIZONTAL + '\u2524' # 0x0088 -> FORMS LIGHT VERTICAL AND LEFT + '\u252c' # 0x0089 -> FORMS LIGHT DOWN AND HORIZONTAL + '\u251c' # 0x008a -> FORMS LIGHT VERTICAL AND RIGHT + '\u2534' # 0x008b -> FORMS LIGHT UP AND HORIZONTAL + '\u2510' # 0x008c -> FORMS LIGHT DOWN AND LEFT + '\u250c' # 0x008d -> FORMS LIGHT DOWN AND RIGHT + '\u2514' # 0x008e -> FORMS LIGHT UP AND RIGHT + '\u2518' # 0x008f -> FORMS LIGHT UP AND LEFT + '\u03b2' # 0x0090 -> GREEK SMALL BETA + '\u221e' # 0x0091 -> INFINITY + '\u03c6' # 0x0092 -> GREEK SMALL PHI + '\xb1' # 0x0093 -> PLUS-OR-MINUS SIGN + '\xbd' # 0x0094 -> FRACTION 1/2 + '\xbc' # 0x0095 -> FRACTION 1/4 + '\u2248' # 0x0096 -> ALMOST EQUAL TO + '\xab' # 0x0097 -> LEFT POINTING GUILLEMET + '\xbb' # 0x0098 -> RIGHT POINTING GUILLEMET + '\ufef7' # 0x0099 -> ARABIC LIGATURE LAM WITH ALEF WITH HAMZA ABOVE ISOLATED FORM + '\ufef8' # 0x009a -> ARABIC LIGATURE LAM WITH ALEF WITH HAMZA ABOVE FINAL FORM + '\ufffe' # 0x009b -> UNDEFINED + '\ufffe' # 0x009c -> UNDEFINED + '\ufefb' # 0x009d -> ARABIC LIGATURE LAM WITH ALEF ISOLATED FORM + '\ufefc' # 0x009e -> ARABIC LIGATURE LAM WITH ALEF FINAL FORM + '\ufffe' # 0x009f -> UNDEFINED + '\xa0' # 0x00a0 -> NON-BREAKING SPACE + '\xad' # 0x00a1 -> SOFT HYPHEN + '\ufe82' # 0x00a2 -> ARABIC LETTER ALEF WITH MADDA ABOVE FINAL FORM + '\xa3' # 0x00a3 -> POUND SIGN + '\xa4' # 0x00a4 -> CURRENCY SIGN + '\ufe84' # 0x00a5 -> ARABIC LETTER ALEF WITH HAMZA ABOVE FINAL FORM + '\ufffe' # 0x00a6 -> UNDEFINED + '\ufffe' # 0x00a7 -> UNDEFINED + '\ufe8e' # 0x00a8 -> ARABIC LETTER ALEF FINAL FORM + '\ufe8f' # 0x00a9 -> ARABIC LETTER BEH ISOLATED FORM + '\ufe95' # 0x00aa -> ARABIC LETTER TEH ISOLATED FORM + '\ufe99' # 0x00ab -> ARABIC LETTER THEH ISOLATED FORM + '\u060c' # 0x00ac -> ARABIC COMMA + '\ufe9d' # 0x00ad -> ARABIC LETTER JEEM ISOLATED FORM + '\ufea1' # 0x00ae -> ARABIC LETTER HAH ISOLATED FORM + '\ufea5' # 0x00af -> ARABIC LETTER KHAH ISOLATED FORM + '\u0660' # 0x00b0 -> ARABIC-INDIC DIGIT ZERO + '\u0661' # 0x00b1 -> ARABIC-INDIC DIGIT ONE + '\u0662' # 0x00b2 -> ARABIC-INDIC DIGIT TWO + '\u0663' # 0x00b3 -> ARABIC-INDIC DIGIT THREE + '\u0664' # 0x00b4 -> ARABIC-INDIC DIGIT FOUR + '\u0665' # 0x00b5 -> ARABIC-INDIC DIGIT FIVE + '\u0666' # 0x00b6 -> ARABIC-INDIC DIGIT SIX + '\u0667' # 0x00b7 -> ARABIC-INDIC DIGIT SEVEN + '\u0668' # 0x00b8 -> ARABIC-INDIC DIGIT EIGHT + '\u0669' # 0x00b9 -> ARABIC-INDIC DIGIT NINE + '\ufed1' # 0x00ba -> ARABIC LETTER FEH ISOLATED FORM + '\u061b' # 0x00bb -> ARABIC SEMICOLON + '\ufeb1' # 0x00bc -> ARABIC LETTER SEEN ISOLATED FORM + '\ufeb5' # 0x00bd -> ARABIC LETTER SHEEN ISOLATED FORM + '\ufeb9' # 0x00be -> ARABIC LETTER SAD ISOLATED FORM + '\u061f' # 0x00bf -> ARABIC QUESTION MARK + '\xa2' # 0x00c0 -> CENT SIGN + '\ufe80' # 0x00c1 -> ARABIC LETTER HAMZA ISOLATED FORM + '\ufe81' # 0x00c2 -> ARABIC LETTER ALEF WITH MADDA ABOVE ISOLATED FORM + '\ufe83' # 0x00c3 -> ARABIC LETTER ALEF WITH HAMZA ABOVE ISOLATED FORM + '\ufe85' # 0x00c4 -> ARABIC LETTER WAW WITH HAMZA ABOVE ISOLATED FORM + '\ufeca' # 0x00c5 -> ARABIC LETTER AIN FINAL FORM + '\ufe8b' # 0x00c6 -> ARABIC LETTER YEH WITH HAMZA ABOVE INITIAL FORM + '\ufe8d' # 0x00c7 -> ARABIC LETTER ALEF ISOLATED FORM + '\ufe91' # 0x00c8 -> ARABIC LETTER BEH INITIAL FORM + '\ufe93' # 0x00c9 -> ARABIC LETTER TEH MARBUTA ISOLATED FORM + '\ufe97' # 0x00ca -> ARABIC LETTER TEH INITIAL FORM + '\ufe9b' # 0x00cb -> ARABIC LETTER THEH INITIAL FORM + '\ufe9f' # 0x00cc -> ARABIC LETTER JEEM INITIAL FORM + '\ufea3' # 0x00cd -> ARABIC LETTER HAH INITIAL FORM + '\ufea7' # 0x00ce -> ARABIC LETTER KHAH INITIAL FORM + '\ufea9' # 0x00cf -> ARABIC LETTER DAL ISOLATED FORM + '\ufeab' # 0x00d0 -> ARABIC LETTER THAL ISOLATED FORM + '\ufead' # 0x00d1 -> ARABIC LETTER REH ISOLATED FORM + '\ufeaf' # 0x00d2 -> ARABIC LETTER ZAIN ISOLATED FORM + '\ufeb3' # 0x00d3 -> ARABIC LETTER SEEN INITIAL FORM + '\ufeb7' # 0x00d4 -> ARABIC LETTER SHEEN INITIAL FORM + '\ufebb' # 0x00d5 -> ARABIC LETTER SAD INITIAL FORM + '\ufebf' # 0x00d6 -> ARABIC LETTER DAD INITIAL FORM + '\ufec1' # 0x00d7 -> ARABIC LETTER TAH ISOLATED FORM + '\ufec5' # 0x00d8 -> ARABIC LETTER ZAH ISOLATED FORM + '\ufecb' # 0x00d9 -> ARABIC LETTER AIN INITIAL FORM + '\ufecf' # 0x00da -> ARABIC LETTER GHAIN INITIAL FORM + '\xa6' # 0x00db -> BROKEN VERTICAL BAR + '\xac' # 0x00dc -> NOT SIGN + '\xf7' # 0x00dd -> DIVISION SIGN + '\xd7' # 0x00de -> MULTIPLICATION SIGN + '\ufec9' # 0x00df -> ARABIC LETTER AIN ISOLATED FORM + '\u0640' # 0x00e0 -> ARABIC TATWEEL + '\ufed3' # 0x00e1 -> ARABIC LETTER FEH INITIAL FORM + '\ufed7' # 0x00e2 -> ARABIC LETTER QAF INITIAL FORM + '\ufedb' # 0x00e3 -> ARABIC LETTER KAF INITIAL FORM + '\ufedf' # 0x00e4 -> ARABIC LETTER LAM INITIAL FORM + '\ufee3' # 0x00e5 -> ARABIC LETTER MEEM INITIAL FORM + '\ufee7' # 0x00e6 -> ARABIC LETTER NOON INITIAL FORM + '\ufeeb' # 0x00e7 -> ARABIC LETTER HEH INITIAL FORM + '\ufeed' # 0x00e8 -> ARABIC LETTER WAW ISOLATED FORM + '\ufeef' # 0x00e9 -> ARABIC LETTER ALEF MAKSURA ISOLATED FORM + '\ufef3' # 0x00ea -> ARABIC LETTER YEH INITIAL FORM + '\ufebd' # 0x00eb -> ARABIC LETTER DAD ISOLATED FORM + '\ufecc' # 0x00ec -> ARABIC LETTER AIN MEDIAL FORM + '\ufece' # 0x00ed -> ARABIC LETTER GHAIN FINAL FORM + '\ufecd' # 0x00ee -> ARABIC LETTER GHAIN ISOLATED FORM + '\ufee1' # 0x00ef -> ARABIC LETTER MEEM ISOLATED FORM + '\ufe7d' # 0x00f0 -> ARABIC SHADDA MEDIAL FORM + '\u0651' # 0x00f1 -> ARABIC SHADDAH + '\ufee5' # 0x00f2 -> ARABIC LETTER NOON ISOLATED FORM + '\ufee9' # 0x00f3 -> ARABIC LETTER HEH ISOLATED FORM + '\ufeec' # 0x00f4 -> ARABIC LETTER HEH MEDIAL FORM + '\ufef0' # 0x00f5 -> ARABIC LETTER ALEF MAKSURA FINAL FORM + '\ufef2' # 0x00f6 -> ARABIC LETTER YEH FINAL FORM + '\ufed0' # 0x00f7 -> ARABIC LETTER GHAIN MEDIAL FORM + '\ufed5' # 0x00f8 -> ARABIC LETTER QAF ISOLATED FORM + '\ufef5' # 0x00f9 -> ARABIC LIGATURE LAM WITH ALEF WITH MADDA ABOVE ISOLATED FORM + '\ufef6' # 0x00fa -> ARABIC LIGATURE LAM WITH ALEF WITH MADDA ABOVE FINAL FORM + '\ufedd' # 0x00fb -> ARABIC LETTER LAM ISOLATED FORM + '\ufed9' # 0x00fc -> ARABIC LETTER KAF ISOLATED FORM + '\ufef1' # 0x00fd -> ARABIC LETTER YEH ISOLATED FORM + '\u25a0' # 0x00fe -> BLACK SQUARE + '\ufffe' # 0x00ff -> UNDEFINED +) + +### Encoding Map + +encoding_map = { + 0x0000: 0x0000, # NULL + 0x0001: 0x0001, # START OF HEADING + 0x0002: 0x0002, # START OF TEXT + 0x0003: 0x0003, # END OF TEXT + 0x0004: 0x0004, # END OF TRANSMISSION + 0x0005: 0x0005, # ENQUIRY + 0x0006: 0x0006, # ACKNOWLEDGE + 0x0007: 0x0007, # BELL + 0x0008: 0x0008, # BACKSPACE + 0x0009: 0x0009, # HORIZONTAL TABULATION + 0x000a: 0x000a, # LINE FEED + 0x000b: 0x000b, # VERTICAL TABULATION + 0x000c: 0x000c, # FORM FEED + 0x000d: 0x000d, # CARRIAGE RETURN + 0x000e: 0x000e, # SHIFT OUT + 0x000f: 0x000f, # SHIFT IN + 0x0010: 0x0010, # DATA LINK ESCAPE + 0x0011: 0x0011, # DEVICE CONTROL ONE + 0x0012: 0x0012, # DEVICE CONTROL TWO + 0x0013: 0x0013, # DEVICE CONTROL THREE + 0x0014: 0x0014, # DEVICE CONTROL FOUR + 0x0015: 0x0015, # NEGATIVE ACKNOWLEDGE + 0x0016: 0x0016, # SYNCHRONOUS IDLE + 0x0017: 0x0017, # END OF TRANSMISSION BLOCK + 0x0018: 0x0018, # CANCEL + 0x0019: 0x0019, # END OF MEDIUM + 0x001a: 0x001a, # SUBSTITUTE + 0x001b: 0x001b, # ESCAPE + 0x001c: 0x001c, # FILE SEPARATOR + 0x001d: 0x001d, # GROUP SEPARATOR + 0x001e: 0x001e, # RECORD SEPARATOR + 0x001f: 0x001f, # UNIT SEPARATOR + 0x0020: 0x0020, # SPACE + 0x0021: 0x0021, # EXCLAMATION MARK + 0x0022: 0x0022, # QUOTATION MARK + 0x0023: 0x0023, # NUMBER SIGN + 0x0024: 0x0024, # DOLLAR SIGN + 0x0026: 0x0026, # AMPERSAND + 0x0027: 0x0027, # APOSTROPHE + 0x0028: 0x0028, # LEFT PARENTHESIS + 0x0029: 0x0029, # RIGHT PARENTHESIS + 0x002a: 0x002a, # ASTERISK + 0x002b: 0x002b, # PLUS SIGN + 0x002c: 0x002c, # COMMA + 0x002d: 0x002d, # HYPHEN-MINUS + 0x002e: 0x002e, # FULL STOP + 0x002f: 0x002f, # SOLIDUS + 0x0030: 0x0030, # DIGIT ZERO + 0x0031: 0x0031, # DIGIT ONE + 0x0032: 0x0032, # DIGIT TWO + 0x0033: 0x0033, # DIGIT THREE + 0x0034: 0x0034, # DIGIT FOUR + 0x0035: 0x0035, # DIGIT FIVE + 0x0036: 0x0036, # DIGIT SIX + 0x0037: 0x0037, # DIGIT SEVEN + 0x0038: 0x0038, # DIGIT EIGHT + 0x0039: 0x0039, # DIGIT NINE + 0x003a: 0x003a, # COLON + 0x003b: 0x003b, # SEMICOLON + 0x003c: 0x003c, # LESS-THAN SIGN + 0x003d: 0x003d, # EQUALS SIGN + 0x003e: 0x003e, # GREATER-THAN SIGN + 0x003f: 0x003f, # QUESTION MARK + 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 + 0x005c: 0x005c, # REVERSE SOLIDUS + 0x005d: 0x005d, # RIGHT SQUARE BRACKET + 0x005e: 0x005e, # CIRCUMFLEX ACCENT + 0x005f: 0x005f, # LOW LINE + 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 + 0x007c: 0x007c, # VERTICAL LINE + 0x007d: 0x007d, # RIGHT CURLY BRACKET + 0x007e: 0x007e, # TILDE + 0x007f: 0x007f, # DELETE + 0x00a0: 0x00a0, # NON-BREAKING SPACE + 0x00a2: 0x00c0, # CENT SIGN + 0x00a3: 0x00a3, # POUND SIGN + 0x00a4: 0x00a4, # CURRENCY SIGN + 0x00a6: 0x00db, # BROKEN VERTICAL BAR + 0x00ab: 0x0097, # LEFT POINTING GUILLEMET + 0x00ac: 0x00dc, # NOT SIGN + 0x00ad: 0x00a1, # SOFT HYPHEN + 0x00b0: 0x0080, # DEGREE SIGN + 0x00b1: 0x0093, # PLUS-OR-MINUS SIGN + 0x00b7: 0x0081, # MIDDLE DOT + 0x00bb: 0x0098, # RIGHT POINTING GUILLEMET + 0x00bc: 0x0095, # FRACTION 1/4 + 0x00bd: 0x0094, # FRACTION 1/2 + 0x00d7: 0x00de, # MULTIPLICATION SIGN + 0x00f7: 0x00dd, # DIVISION SIGN + 0x03b2: 0x0090, # GREEK SMALL BETA + 0x03c6: 0x0092, # GREEK SMALL PHI + 0x060c: 0x00ac, # ARABIC COMMA + 0x061b: 0x00bb, # ARABIC SEMICOLON + 0x061f: 0x00bf, # ARABIC QUESTION MARK + 0x0640: 0x00e0, # ARABIC TATWEEL + 0x0651: 0x00f1, # ARABIC SHADDAH + 0x0660: 0x00b0, # ARABIC-INDIC DIGIT ZERO + 0x0661: 0x00b1, # ARABIC-INDIC DIGIT ONE + 0x0662: 0x00b2, # ARABIC-INDIC DIGIT TWO + 0x0663: 0x00b3, # ARABIC-INDIC DIGIT THREE + 0x0664: 0x00b4, # ARABIC-INDIC DIGIT FOUR + 0x0665: 0x00b5, # ARABIC-INDIC DIGIT FIVE + 0x0666: 0x00b6, # ARABIC-INDIC DIGIT SIX + 0x0667: 0x00b7, # ARABIC-INDIC DIGIT SEVEN + 0x0668: 0x00b8, # ARABIC-INDIC DIGIT EIGHT + 0x0669: 0x00b9, # ARABIC-INDIC DIGIT NINE + 0x066a: 0x0025, # ARABIC PERCENT SIGN + 0x2219: 0x0082, # BULLET OPERATOR + 0x221a: 0x0083, # SQUARE ROOT + 0x221e: 0x0091, # INFINITY + 0x2248: 0x0096, # ALMOST EQUAL TO + 0x2500: 0x0085, # FORMS LIGHT HORIZONTAL + 0x2502: 0x0086, # FORMS LIGHT VERTICAL + 0x250c: 0x008d, # FORMS LIGHT DOWN AND RIGHT + 0x2510: 0x008c, # FORMS LIGHT DOWN AND LEFT + 0x2514: 0x008e, # FORMS LIGHT UP AND RIGHT + 0x2518: 0x008f, # FORMS LIGHT UP AND LEFT + 0x251c: 0x008a, # FORMS LIGHT VERTICAL AND RIGHT + 0x2524: 0x0088, # FORMS LIGHT VERTICAL AND LEFT + 0x252c: 0x0089, # FORMS LIGHT DOWN AND HORIZONTAL + 0x2534: 0x008b, # FORMS LIGHT UP AND HORIZONTAL + 0x253c: 0x0087, # FORMS LIGHT VERTICAL AND HORIZONTAL + 0x2592: 0x0084, # MEDIUM SHADE + 0x25a0: 0x00fe, # BLACK SQUARE + 0xfe7d: 0x00f0, # ARABIC SHADDA MEDIAL FORM + 0xfe80: 0x00c1, # ARABIC LETTER HAMZA ISOLATED FORM + 0xfe81: 0x00c2, # ARABIC LETTER ALEF WITH MADDA ABOVE ISOLATED FORM + 0xfe82: 0x00a2, # ARABIC LETTER ALEF WITH MADDA ABOVE FINAL FORM + 0xfe83: 0x00c3, # ARABIC LETTER ALEF WITH HAMZA ABOVE ISOLATED FORM + 0xfe84: 0x00a5, # ARABIC LETTER ALEF WITH HAMZA ABOVE FINAL FORM + 0xfe85: 0x00c4, # ARABIC LETTER WAW WITH HAMZA ABOVE ISOLATED FORM + 0xfe8b: 0x00c6, # ARABIC LETTER YEH WITH HAMZA ABOVE INITIAL FORM + 0xfe8d: 0x00c7, # ARABIC LETTER ALEF ISOLATED FORM + 0xfe8e: 0x00a8, # ARABIC LETTER ALEF FINAL FORM + 0xfe8f: 0x00a9, # ARABIC LETTER BEH ISOLATED FORM + 0xfe91: 0x00c8, # ARABIC LETTER BEH INITIAL FORM + 0xfe93: 0x00c9, # ARABIC LETTER TEH MARBUTA ISOLATED FORM + 0xfe95: 0x00aa, # ARABIC LETTER TEH ISOLATED FORM + 0xfe97: 0x00ca, # ARABIC LETTER TEH INITIAL FORM + 0xfe99: 0x00ab, # ARABIC LETTER THEH ISOLATED FORM + 0xfe9b: 0x00cb, # ARABIC LETTER THEH INITIAL FORM + 0xfe9d: 0x00ad, # ARABIC LETTER JEEM ISOLATED FORM + 0xfe9f: 0x00cc, # ARABIC LETTER JEEM INITIAL FORM + 0xfea1: 0x00ae, # ARABIC LETTER HAH ISOLATED FORM + 0xfea3: 0x00cd, # ARABIC LETTER HAH INITIAL FORM + 0xfea5: 0x00af, # ARABIC LETTER KHAH ISOLATED FORM + 0xfea7: 0x00ce, # ARABIC LETTER KHAH INITIAL FORM + 0xfea9: 0x00cf, # ARABIC LETTER DAL ISOLATED FORM + 0xfeab: 0x00d0, # ARABIC LETTER THAL ISOLATED FORM + 0xfead: 0x00d1, # ARABIC LETTER REH ISOLATED FORM + 0xfeaf: 0x00d2, # ARABIC LETTER ZAIN ISOLATED FORM + 0xfeb1: 0x00bc, # ARABIC LETTER SEEN ISOLATED FORM + 0xfeb3: 0x00d3, # ARABIC LETTER SEEN INITIAL FORM + 0xfeb5: 0x00bd, # ARABIC LETTER SHEEN ISOLATED FORM + 0xfeb7: 0x00d4, # ARABIC LETTER SHEEN INITIAL FORM + 0xfeb9: 0x00be, # ARABIC LETTER SAD ISOLATED FORM + 0xfebb: 0x00d5, # ARABIC LETTER SAD INITIAL FORM + 0xfebd: 0x00eb, # ARABIC LETTER DAD ISOLATED FORM + 0xfebf: 0x00d6, # ARABIC LETTER DAD INITIAL FORM + 0xfec1: 0x00d7, # ARABIC LETTER TAH ISOLATED FORM + 0xfec5: 0x00d8, # ARABIC LETTER ZAH ISOLATED FORM + 0xfec9: 0x00df, # ARABIC LETTER AIN ISOLATED FORM + 0xfeca: 0x00c5, # ARABIC LETTER AIN FINAL FORM + 0xfecb: 0x00d9, # ARABIC LETTER AIN INITIAL FORM + 0xfecc: 0x00ec, # ARABIC LETTER AIN MEDIAL FORM + 0xfecd: 0x00ee, # ARABIC LETTER GHAIN ISOLATED FORM + 0xfece: 0x00ed, # ARABIC LETTER GHAIN FINAL FORM + 0xfecf: 0x00da, # ARABIC LETTER GHAIN INITIAL FORM + 0xfed0: 0x00f7, # ARABIC LETTER GHAIN MEDIAL FORM + 0xfed1: 0x00ba, # ARABIC LETTER FEH ISOLATED FORM + 0xfed3: 0x00e1, # ARABIC LETTER FEH INITIAL FORM + 0xfed5: 0x00f8, # ARABIC LETTER QAF ISOLATED FORM + 0xfed7: 0x00e2, # ARABIC LETTER QAF INITIAL FORM + 0xfed9: 0x00fc, # ARABIC LETTER KAF ISOLATED FORM + 0xfedb: 0x00e3, # ARABIC LETTER KAF INITIAL FORM + 0xfedd: 0x00fb, # ARABIC LETTER LAM ISOLATED FORM + 0xfedf: 0x00e4, # ARABIC LETTER LAM INITIAL FORM + 0xfee1: 0x00ef, # ARABIC LETTER MEEM ISOLATED FORM + 0xfee3: 0x00e5, # ARABIC LETTER MEEM INITIAL FORM + 0xfee5: 0x00f2, # ARABIC LETTER NOON ISOLATED FORM + 0xfee7: 0x00e6, # ARABIC LETTER NOON INITIAL FORM + 0xfee9: 0x00f3, # ARABIC LETTER HEH ISOLATED FORM + 0xfeeb: 0x00e7, # ARABIC LETTER HEH INITIAL FORM + 0xfeec: 0x00f4, # ARABIC LETTER HEH MEDIAL FORM + 0xfeed: 0x00e8, # ARABIC LETTER WAW ISOLATED FORM + 0xfeef: 0x00e9, # ARABIC LETTER ALEF MAKSURA ISOLATED FORM + 0xfef0: 0x00f5, # ARABIC LETTER ALEF MAKSURA FINAL FORM + 0xfef1: 0x00fd, # ARABIC LETTER YEH ISOLATED FORM + 0xfef2: 0x00f6, # ARABIC LETTER YEH FINAL FORM + 0xfef3: 0x00ea, # ARABIC LETTER YEH INITIAL FORM + 0xfef5: 0x00f9, # ARABIC LIGATURE LAM WITH ALEF WITH MADDA ABOVE ISOLATED FORM + 0xfef6: 0x00fa, # ARABIC LIGATURE LAM WITH ALEF WITH MADDA ABOVE FINAL FORM + 0xfef7: 0x0099, # ARABIC LIGATURE LAM WITH ALEF WITH HAMZA ABOVE ISOLATED FORM + 0xfef8: 0x009a, # ARABIC LIGATURE LAM WITH ALEF WITH HAMZA ABOVE FINAL FORM + 0xfefb: 0x009d, # ARABIC LIGATURE LAM WITH ALEF ISOLATED FORM + 0xfefc: 0x009e, # ARABIC LIGATURE LAM WITH ALEF FINAL FORM +} diff --git a/env/Lib/encodings/cp865.py b/env/Lib/encodings/cp865.py new file mode 100644 index 0000000..6726cf3 --- /dev/null +++ b/env/Lib/encodings/cp865.py @@ -0,0 +1,698 @@ +""" Python Character Mapping Codec generated from 'VENDORS/MICSFT/PC/CP865.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_map) + + 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_map)[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='cp865', + 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: 0x00c7, # LATIN CAPITAL LETTER C WITH CEDILLA + 0x0081: 0x00fc, # LATIN SMALL LETTER U WITH DIAERESIS + 0x0082: 0x00e9, # LATIN SMALL LETTER E WITH ACUTE + 0x0083: 0x00e2, # LATIN SMALL LETTER A WITH CIRCUMFLEX + 0x0084: 0x00e4, # LATIN SMALL LETTER A WITH DIAERESIS + 0x0085: 0x00e0, # LATIN SMALL LETTER A WITH GRAVE + 0x0086: 0x00e5, # LATIN SMALL LETTER A WITH RING ABOVE + 0x0087: 0x00e7, # LATIN SMALL LETTER C WITH CEDILLA + 0x0088: 0x00ea, # LATIN SMALL LETTER E WITH CIRCUMFLEX + 0x0089: 0x00eb, # LATIN SMALL LETTER E WITH DIAERESIS + 0x008a: 0x00e8, # LATIN SMALL LETTER E WITH GRAVE + 0x008b: 0x00ef, # LATIN SMALL LETTER I WITH DIAERESIS + 0x008c: 0x00ee, # LATIN SMALL LETTER I WITH CIRCUMFLEX + 0x008d: 0x00ec, # LATIN SMALL LETTER I WITH GRAVE + 0x008e: 0x00c4, # LATIN CAPITAL LETTER A WITH DIAERESIS + 0x008f: 0x00c5, # LATIN CAPITAL LETTER A WITH RING ABOVE + 0x0090: 0x00c9, # LATIN CAPITAL LETTER E WITH ACUTE + 0x0091: 0x00e6, # LATIN SMALL LIGATURE AE + 0x0092: 0x00c6, # LATIN CAPITAL LIGATURE AE + 0x0093: 0x00f4, # LATIN SMALL LETTER O WITH CIRCUMFLEX + 0x0094: 0x00f6, # LATIN SMALL LETTER O WITH DIAERESIS + 0x0095: 0x00f2, # LATIN SMALL LETTER O WITH GRAVE + 0x0096: 0x00fb, # LATIN SMALL LETTER U WITH CIRCUMFLEX + 0x0097: 0x00f9, # LATIN SMALL LETTER U WITH GRAVE + 0x0098: 0x00ff, # LATIN SMALL LETTER Y WITH DIAERESIS + 0x0099: 0x00d6, # LATIN CAPITAL LETTER O WITH DIAERESIS + 0x009a: 0x00dc, # LATIN CAPITAL LETTER U WITH DIAERESIS + 0x009b: 0x00f8, # LATIN SMALL LETTER O WITH STROKE + 0x009c: 0x00a3, # POUND SIGN + 0x009d: 0x00d8, # LATIN CAPITAL LETTER O WITH STROKE + 0x009e: 0x20a7, # PESETA SIGN + 0x009f: 0x0192, # LATIN SMALL LETTER F WITH HOOK + 0x00a0: 0x00e1, # LATIN SMALL LETTER A WITH ACUTE + 0x00a1: 0x00ed, # LATIN SMALL LETTER I WITH ACUTE + 0x00a2: 0x00f3, # LATIN SMALL LETTER O WITH ACUTE + 0x00a3: 0x00fa, # LATIN SMALL LETTER U WITH ACUTE + 0x00a4: 0x00f1, # LATIN SMALL LETTER N WITH TILDE + 0x00a5: 0x00d1, # LATIN CAPITAL LETTER N WITH TILDE + 0x00a6: 0x00aa, # FEMININE ORDINAL INDICATOR + 0x00a7: 0x00ba, # MASCULINE ORDINAL INDICATOR + 0x00a8: 0x00bf, # INVERTED QUESTION MARK + 0x00a9: 0x2310, # REVERSED NOT SIGN + 0x00aa: 0x00ac, # NOT SIGN + 0x00ab: 0x00bd, # VULGAR FRACTION ONE HALF + 0x00ac: 0x00bc, # VULGAR FRACTION ONE QUARTER + 0x00ad: 0x00a1, # INVERTED EXCLAMATION MARK + 0x00ae: 0x00ab, # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00af: 0x00a4, # CURRENCY SIGN + 0x00b0: 0x2591, # LIGHT SHADE + 0x00b1: 0x2592, # MEDIUM SHADE + 0x00b2: 0x2593, # DARK SHADE + 0x00b3: 0x2502, # BOX DRAWINGS LIGHT VERTICAL + 0x00b4: 0x2524, # BOX DRAWINGS LIGHT VERTICAL AND LEFT + 0x00b5: 0x2561, # BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE + 0x00b6: 0x2562, # BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE + 0x00b7: 0x2556, # BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE + 0x00b8: 0x2555, # BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE + 0x00b9: 0x2563, # BOX DRAWINGS DOUBLE VERTICAL AND LEFT + 0x00ba: 0x2551, # BOX DRAWINGS DOUBLE VERTICAL + 0x00bb: 0x2557, # BOX DRAWINGS DOUBLE DOWN AND LEFT + 0x00bc: 0x255d, # BOX DRAWINGS DOUBLE UP AND LEFT + 0x00bd: 0x255c, # BOX DRAWINGS UP DOUBLE AND LEFT SINGLE + 0x00be: 0x255b, # BOX DRAWINGS UP SINGLE AND LEFT DOUBLE + 0x00bf: 0x2510, # BOX DRAWINGS LIGHT DOWN AND LEFT + 0x00c0: 0x2514, # BOX DRAWINGS LIGHT UP AND RIGHT + 0x00c1: 0x2534, # BOX DRAWINGS LIGHT UP AND HORIZONTAL + 0x00c2: 0x252c, # BOX DRAWINGS LIGHT DOWN AND HORIZONTAL + 0x00c3: 0x251c, # BOX DRAWINGS LIGHT VERTICAL AND RIGHT + 0x00c4: 0x2500, # BOX DRAWINGS LIGHT HORIZONTAL + 0x00c5: 0x253c, # BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL + 0x00c6: 0x255e, # BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE + 0x00c7: 0x255f, # BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE + 0x00c8: 0x255a, # BOX DRAWINGS DOUBLE UP AND RIGHT + 0x00c9: 0x2554, # BOX DRAWINGS DOUBLE DOWN AND RIGHT + 0x00ca: 0x2569, # BOX DRAWINGS DOUBLE UP AND HORIZONTAL + 0x00cb: 0x2566, # BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL + 0x00cc: 0x2560, # BOX DRAWINGS DOUBLE VERTICAL AND RIGHT + 0x00cd: 0x2550, # BOX DRAWINGS DOUBLE HORIZONTAL + 0x00ce: 0x256c, # BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL + 0x00cf: 0x2567, # BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE + 0x00d0: 0x2568, # BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE + 0x00d1: 0x2564, # BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE + 0x00d2: 0x2565, # BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE + 0x00d3: 0x2559, # BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE + 0x00d4: 0x2558, # BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE + 0x00d5: 0x2552, # BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE + 0x00d6: 0x2553, # BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE + 0x00d7: 0x256b, # BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE + 0x00d8: 0x256a, # BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE + 0x00d9: 0x2518, # BOX DRAWINGS LIGHT UP AND LEFT + 0x00da: 0x250c, # BOX DRAWINGS LIGHT DOWN AND RIGHT + 0x00db: 0x2588, # FULL BLOCK + 0x00dc: 0x2584, # LOWER HALF BLOCK + 0x00dd: 0x258c, # LEFT HALF BLOCK + 0x00de: 0x2590, # RIGHT HALF BLOCK + 0x00df: 0x2580, # UPPER HALF BLOCK + 0x00e0: 0x03b1, # GREEK SMALL LETTER ALPHA + 0x00e1: 0x00df, # LATIN SMALL LETTER SHARP S + 0x00e2: 0x0393, # GREEK CAPITAL LETTER GAMMA + 0x00e3: 0x03c0, # GREEK SMALL LETTER PI + 0x00e4: 0x03a3, # GREEK CAPITAL LETTER SIGMA + 0x00e5: 0x03c3, # GREEK SMALL LETTER SIGMA + 0x00e6: 0x00b5, # MICRO SIGN + 0x00e7: 0x03c4, # GREEK SMALL LETTER TAU + 0x00e8: 0x03a6, # GREEK CAPITAL LETTER PHI + 0x00e9: 0x0398, # GREEK CAPITAL LETTER THETA + 0x00ea: 0x03a9, # GREEK CAPITAL LETTER OMEGA + 0x00eb: 0x03b4, # GREEK SMALL LETTER DELTA + 0x00ec: 0x221e, # INFINITY + 0x00ed: 0x03c6, # GREEK SMALL LETTER PHI + 0x00ee: 0x03b5, # GREEK SMALL LETTER EPSILON + 0x00ef: 0x2229, # INTERSECTION + 0x00f0: 0x2261, # IDENTICAL TO + 0x00f1: 0x00b1, # PLUS-MINUS SIGN + 0x00f2: 0x2265, # GREATER-THAN OR EQUAL TO + 0x00f3: 0x2264, # LESS-THAN OR EQUAL TO + 0x00f4: 0x2320, # TOP HALF INTEGRAL + 0x00f5: 0x2321, # BOTTOM HALF INTEGRAL + 0x00f6: 0x00f7, # DIVISION SIGN + 0x00f7: 0x2248, # ALMOST EQUAL TO + 0x00f8: 0x00b0, # DEGREE SIGN + 0x00f9: 0x2219, # BULLET OPERATOR + 0x00fa: 0x00b7, # MIDDLE DOT + 0x00fb: 0x221a, # SQUARE ROOT + 0x00fc: 0x207f, # SUPERSCRIPT LATIN SMALL LETTER N + 0x00fd: 0x00b2, # SUPERSCRIPT TWO + 0x00fe: 0x25a0, # BLACK SQUARE + 0x00ff: 0x00a0, # NO-BREAK SPACE +}) + +### Decoding Table + +decoding_table = ( + '\x00' # 0x0000 -> NULL + '\x01' # 0x0001 -> START OF HEADING + '\x02' # 0x0002 -> START OF TEXT + '\x03' # 0x0003 -> END OF TEXT + '\x04' # 0x0004 -> END OF TRANSMISSION + '\x05' # 0x0005 -> ENQUIRY + '\x06' # 0x0006 -> ACKNOWLEDGE + '\x07' # 0x0007 -> BELL + '\x08' # 0x0008 -> BACKSPACE + '\t' # 0x0009 -> HORIZONTAL TABULATION + '\n' # 0x000a -> LINE FEED + '\x0b' # 0x000b -> VERTICAL TABULATION + '\x0c' # 0x000c -> FORM FEED + '\r' # 0x000d -> CARRIAGE RETURN + '\x0e' # 0x000e -> SHIFT OUT + '\x0f' # 0x000f -> SHIFT IN + '\x10' # 0x0010 -> DATA LINK ESCAPE + '\x11' # 0x0011 -> DEVICE CONTROL ONE + '\x12' # 0x0012 -> DEVICE CONTROL TWO + '\x13' # 0x0013 -> DEVICE CONTROL THREE + '\x14' # 0x0014 -> DEVICE CONTROL FOUR + '\x15' # 0x0015 -> NEGATIVE ACKNOWLEDGE + '\x16' # 0x0016 -> SYNCHRONOUS IDLE + '\x17' # 0x0017 -> END OF TRANSMISSION BLOCK + '\x18' # 0x0018 -> CANCEL + '\x19' # 0x0019 -> END OF MEDIUM + '\x1a' # 0x001a -> SUBSTITUTE + '\x1b' # 0x001b -> ESCAPE + '\x1c' # 0x001c -> FILE SEPARATOR + '\x1d' # 0x001d -> GROUP SEPARATOR + '\x1e' # 0x001e -> RECORD SEPARATOR + '\x1f' # 0x001f -> UNIT SEPARATOR + ' ' # 0x0020 -> SPACE + '!' # 0x0021 -> EXCLAMATION MARK + '"' # 0x0022 -> QUOTATION MARK + '#' # 0x0023 -> NUMBER SIGN + '$' # 0x0024 -> DOLLAR SIGN + '%' # 0x0025 -> PERCENT SIGN + '&' # 0x0026 -> AMPERSAND + "'" # 0x0027 -> APOSTROPHE + '(' # 0x0028 -> LEFT PARENTHESIS + ')' # 0x0029 -> RIGHT PARENTHESIS + '*' # 0x002a -> ASTERISK + '+' # 0x002b -> PLUS SIGN + ',' # 0x002c -> COMMA + '-' # 0x002d -> HYPHEN-MINUS + '.' # 0x002e -> FULL STOP + '/' # 0x002f -> SOLIDUS + '0' # 0x0030 -> DIGIT ZERO + '1' # 0x0031 -> DIGIT ONE + '2' # 0x0032 -> DIGIT TWO + '3' # 0x0033 -> DIGIT THREE + '4' # 0x0034 -> DIGIT FOUR + '5' # 0x0035 -> DIGIT FIVE + '6' # 0x0036 -> DIGIT SIX + '7' # 0x0037 -> DIGIT SEVEN + '8' # 0x0038 -> DIGIT EIGHT + '9' # 0x0039 -> DIGIT NINE + ':' # 0x003a -> COLON + ';' # 0x003b -> SEMICOLON + '<' # 0x003c -> LESS-THAN SIGN + '=' # 0x003d -> EQUALS SIGN + '>' # 0x003e -> GREATER-THAN SIGN + '?' # 0x003f -> QUESTION MARK + '@' # 0x0040 -> COMMERCIAL AT + 'A' # 0x0041 -> LATIN CAPITAL LETTER A + 'B' # 0x0042 -> LATIN CAPITAL LETTER B + 'C' # 0x0043 -> LATIN CAPITAL LETTER C + 'D' # 0x0044 -> LATIN CAPITAL LETTER D + 'E' # 0x0045 -> LATIN CAPITAL LETTER E + 'F' # 0x0046 -> LATIN CAPITAL LETTER F + 'G' # 0x0047 -> LATIN CAPITAL LETTER G + 'H' # 0x0048 -> LATIN CAPITAL LETTER H + 'I' # 0x0049 -> LATIN CAPITAL LETTER I + 'J' # 0x004a -> LATIN CAPITAL LETTER J + 'K' # 0x004b -> LATIN CAPITAL LETTER K + 'L' # 0x004c -> LATIN CAPITAL LETTER L + 'M' # 0x004d -> LATIN CAPITAL LETTER M + 'N' # 0x004e -> LATIN CAPITAL LETTER N + 'O' # 0x004f -> LATIN CAPITAL LETTER O + 'P' # 0x0050 -> LATIN CAPITAL LETTER P + 'Q' # 0x0051 -> LATIN CAPITAL LETTER Q + 'R' # 0x0052 -> LATIN CAPITAL LETTER R + 'S' # 0x0053 -> LATIN CAPITAL LETTER S + 'T' # 0x0054 -> LATIN CAPITAL LETTER T + 'U' # 0x0055 -> LATIN CAPITAL LETTER U + 'V' # 0x0056 -> LATIN CAPITAL LETTER V + 'W' # 0x0057 -> LATIN CAPITAL LETTER W + 'X' # 0x0058 -> LATIN CAPITAL LETTER X + 'Y' # 0x0059 -> LATIN CAPITAL LETTER Y + 'Z' # 0x005a -> LATIN CAPITAL LETTER Z + '[' # 0x005b -> LEFT SQUARE BRACKET + '\\' # 0x005c -> REVERSE SOLIDUS + ']' # 0x005d -> RIGHT SQUARE BRACKET + '^' # 0x005e -> CIRCUMFLEX ACCENT + '_' # 0x005f -> LOW LINE + '`' # 0x0060 -> GRAVE ACCENT + 'a' # 0x0061 -> LATIN SMALL LETTER A + 'b' # 0x0062 -> LATIN SMALL LETTER B + 'c' # 0x0063 -> LATIN SMALL LETTER C + 'd' # 0x0064 -> LATIN SMALL LETTER D + 'e' # 0x0065 -> LATIN SMALL LETTER E + 'f' # 0x0066 -> LATIN SMALL LETTER F + 'g' # 0x0067 -> LATIN SMALL LETTER G + 'h' # 0x0068 -> LATIN SMALL LETTER H + 'i' # 0x0069 -> LATIN SMALL LETTER I + 'j' # 0x006a -> LATIN SMALL LETTER J + 'k' # 0x006b -> LATIN SMALL LETTER K + 'l' # 0x006c -> LATIN SMALL LETTER L + 'm' # 0x006d -> LATIN SMALL LETTER M + 'n' # 0x006e -> LATIN SMALL LETTER N + 'o' # 0x006f -> LATIN SMALL LETTER O + 'p' # 0x0070 -> LATIN SMALL LETTER P + 'q' # 0x0071 -> LATIN SMALL LETTER Q + 'r' # 0x0072 -> LATIN SMALL LETTER R + 's' # 0x0073 -> LATIN SMALL LETTER S + 't' # 0x0074 -> LATIN SMALL LETTER T + 'u' # 0x0075 -> LATIN SMALL LETTER U + 'v' # 0x0076 -> LATIN SMALL LETTER V + 'w' # 0x0077 -> LATIN SMALL LETTER W + 'x' # 0x0078 -> LATIN SMALL LETTER X + 'y' # 0x0079 -> LATIN SMALL LETTER Y + 'z' # 0x007a -> LATIN SMALL LETTER Z + '{' # 0x007b -> LEFT CURLY BRACKET + '|' # 0x007c -> VERTICAL LINE + '}' # 0x007d -> RIGHT CURLY BRACKET + '~' # 0x007e -> TILDE + '\x7f' # 0x007f -> DELETE + '\xc7' # 0x0080 -> LATIN CAPITAL LETTER C WITH CEDILLA + '\xfc' # 0x0081 -> LATIN SMALL LETTER U WITH DIAERESIS + '\xe9' # 0x0082 -> LATIN SMALL LETTER E WITH ACUTE + '\xe2' # 0x0083 -> LATIN SMALL LETTER A WITH CIRCUMFLEX + '\xe4' # 0x0084 -> LATIN SMALL LETTER A WITH DIAERESIS + '\xe0' # 0x0085 -> LATIN SMALL LETTER A WITH GRAVE + '\xe5' # 0x0086 -> LATIN SMALL LETTER A WITH RING ABOVE + '\xe7' # 0x0087 -> LATIN SMALL LETTER C WITH CEDILLA + '\xea' # 0x0088 -> LATIN SMALL LETTER E WITH CIRCUMFLEX + '\xeb' # 0x0089 -> LATIN SMALL LETTER E WITH DIAERESIS + '\xe8' # 0x008a -> LATIN SMALL LETTER E WITH GRAVE + '\xef' # 0x008b -> LATIN SMALL LETTER I WITH DIAERESIS + '\xee' # 0x008c -> LATIN SMALL LETTER I WITH CIRCUMFLEX + '\xec' # 0x008d -> LATIN SMALL LETTER I WITH GRAVE + '\xc4' # 0x008e -> LATIN CAPITAL LETTER A WITH DIAERESIS + '\xc5' # 0x008f -> LATIN CAPITAL LETTER A WITH RING ABOVE + '\xc9' # 0x0090 -> LATIN CAPITAL LETTER E WITH ACUTE + '\xe6' # 0x0091 -> LATIN SMALL LIGATURE AE + '\xc6' # 0x0092 -> LATIN CAPITAL LIGATURE AE + '\xf4' # 0x0093 -> LATIN SMALL LETTER O WITH CIRCUMFLEX + '\xf6' # 0x0094 -> LATIN SMALL LETTER O WITH DIAERESIS + '\xf2' # 0x0095 -> LATIN SMALL LETTER O WITH GRAVE + '\xfb' # 0x0096 -> LATIN SMALL LETTER U WITH CIRCUMFLEX + '\xf9' # 0x0097 -> LATIN SMALL LETTER U WITH GRAVE + '\xff' # 0x0098 -> LATIN SMALL LETTER Y WITH DIAERESIS + '\xd6' # 0x0099 -> LATIN CAPITAL LETTER O WITH DIAERESIS + '\xdc' # 0x009a -> LATIN CAPITAL LETTER U WITH DIAERESIS + '\xf8' # 0x009b -> LATIN SMALL LETTER O WITH STROKE + '\xa3' # 0x009c -> POUND SIGN + '\xd8' # 0x009d -> LATIN CAPITAL LETTER O WITH STROKE + '\u20a7' # 0x009e -> PESETA SIGN + '\u0192' # 0x009f -> LATIN SMALL LETTER F WITH HOOK + '\xe1' # 0x00a0 -> LATIN SMALL LETTER A WITH ACUTE + '\xed' # 0x00a1 -> LATIN SMALL LETTER I WITH ACUTE + '\xf3' # 0x00a2 -> LATIN SMALL LETTER O WITH ACUTE + '\xfa' # 0x00a3 -> LATIN SMALL LETTER U WITH ACUTE + '\xf1' # 0x00a4 -> LATIN SMALL LETTER N WITH TILDE + '\xd1' # 0x00a5 -> LATIN CAPITAL LETTER N WITH TILDE + '\xaa' # 0x00a6 -> FEMININE ORDINAL INDICATOR + '\xba' # 0x00a7 -> MASCULINE ORDINAL INDICATOR + '\xbf' # 0x00a8 -> INVERTED QUESTION MARK + '\u2310' # 0x00a9 -> REVERSED NOT SIGN + '\xac' # 0x00aa -> NOT SIGN + '\xbd' # 0x00ab -> VULGAR FRACTION ONE HALF + '\xbc' # 0x00ac -> VULGAR FRACTION ONE QUARTER + '\xa1' # 0x00ad -> INVERTED EXCLAMATION MARK + '\xab' # 0x00ae -> LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + '\xa4' # 0x00af -> CURRENCY SIGN + '\u2591' # 0x00b0 -> LIGHT SHADE + '\u2592' # 0x00b1 -> MEDIUM SHADE + '\u2593' # 0x00b2 -> DARK SHADE + '\u2502' # 0x00b3 -> BOX DRAWINGS LIGHT VERTICAL + '\u2524' # 0x00b4 -> BOX DRAWINGS LIGHT VERTICAL AND LEFT + '\u2561' # 0x00b5 -> BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE + '\u2562' # 0x00b6 -> BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE + '\u2556' # 0x00b7 -> BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE + '\u2555' # 0x00b8 -> BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE + '\u2563' # 0x00b9 -> BOX DRAWINGS DOUBLE VERTICAL AND LEFT + '\u2551' # 0x00ba -> BOX DRAWINGS DOUBLE VERTICAL + '\u2557' # 0x00bb -> BOX DRAWINGS DOUBLE DOWN AND LEFT + '\u255d' # 0x00bc -> BOX DRAWINGS DOUBLE UP AND LEFT + '\u255c' # 0x00bd -> BOX DRAWINGS UP DOUBLE AND LEFT SINGLE + '\u255b' # 0x00be -> BOX DRAWINGS UP SINGLE AND LEFT DOUBLE + '\u2510' # 0x00bf -> BOX DRAWINGS LIGHT DOWN AND LEFT + '\u2514' # 0x00c0 -> BOX DRAWINGS LIGHT UP AND RIGHT + '\u2534' # 0x00c1 -> BOX DRAWINGS LIGHT UP AND HORIZONTAL + '\u252c' # 0x00c2 -> BOX DRAWINGS LIGHT DOWN AND HORIZONTAL + '\u251c' # 0x00c3 -> BOX DRAWINGS LIGHT VERTICAL AND RIGHT + '\u2500' # 0x00c4 -> BOX DRAWINGS LIGHT HORIZONTAL + '\u253c' # 0x00c5 -> BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL + '\u255e' # 0x00c6 -> BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE + '\u255f' # 0x00c7 -> BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE + '\u255a' # 0x00c8 -> BOX DRAWINGS DOUBLE UP AND RIGHT + '\u2554' # 0x00c9 -> BOX DRAWINGS DOUBLE DOWN AND RIGHT + '\u2569' # 0x00ca -> BOX DRAWINGS DOUBLE UP AND HORIZONTAL + '\u2566' # 0x00cb -> BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL + '\u2560' # 0x00cc -> BOX DRAWINGS DOUBLE VERTICAL AND RIGHT + '\u2550' # 0x00cd -> BOX DRAWINGS DOUBLE HORIZONTAL + '\u256c' # 0x00ce -> BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL + '\u2567' # 0x00cf -> BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE + '\u2568' # 0x00d0 -> BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE + '\u2564' # 0x00d1 -> BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE + '\u2565' # 0x00d2 -> BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE + '\u2559' # 0x00d3 -> BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE + '\u2558' # 0x00d4 -> BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE + '\u2552' # 0x00d5 -> BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE + '\u2553' # 0x00d6 -> BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE + '\u256b' # 0x00d7 -> BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE + '\u256a' # 0x00d8 -> BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE + '\u2518' # 0x00d9 -> BOX DRAWINGS LIGHT UP AND LEFT + '\u250c' # 0x00da -> BOX DRAWINGS LIGHT DOWN AND RIGHT + '\u2588' # 0x00db -> FULL BLOCK + '\u2584' # 0x00dc -> LOWER HALF BLOCK + '\u258c' # 0x00dd -> LEFT HALF BLOCK + '\u2590' # 0x00de -> RIGHT HALF BLOCK + '\u2580' # 0x00df -> UPPER HALF BLOCK + '\u03b1' # 0x00e0 -> GREEK SMALL LETTER ALPHA + '\xdf' # 0x00e1 -> LATIN SMALL LETTER SHARP S + '\u0393' # 0x00e2 -> GREEK CAPITAL LETTER GAMMA + '\u03c0' # 0x00e3 -> GREEK SMALL LETTER PI + '\u03a3' # 0x00e4 -> GREEK CAPITAL LETTER SIGMA + '\u03c3' # 0x00e5 -> GREEK SMALL LETTER SIGMA + '\xb5' # 0x00e6 -> MICRO SIGN + '\u03c4' # 0x00e7 -> GREEK SMALL LETTER TAU + '\u03a6' # 0x00e8 -> GREEK CAPITAL LETTER PHI + '\u0398' # 0x00e9 -> GREEK CAPITAL LETTER THETA + '\u03a9' # 0x00ea -> GREEK CAPITAL LETTER OMEGA + '\u03b4' # 0x00eb -> GREEK SMALL LETTER DELTA + '\u221e' # 0x00ec -> INFINITY + '\u03c6' # 0x00ed -> GREEK SMALL LETTER PHI + '\u03b5' # 0x00ee -> GREEK SMALL LETTER EPSILON + '\u2229' # 0x00ef -> INTERSECTION + '\u2261' # 0x00f0 -> IDENTICAL TO + '\xb1' # 0x00f1 -> PLUS-MINUS SIGN + '\u2265' # 0x00f2 -> GREATER-THAN OR EQUAL TO + '\u2264' # 0x00f3 -> LESS-THAN OR EQUAL TO + '\u2320' # 0x00f4 -> TOP HALF INTEGRAL + '\u2321' # 0x00f5 -> BOTTOM HALF INTEGRAL + '\xf7' # 0x00f6 -> DIVISION SIGN + '\u2248' # 0x00f7 -> ALMOST EQUAL TO + '\xb0' # 0x00f8 -> DEGREE SIGN + '\u2219' # 0x00f9 -> BULLET OPERATOR + '\xb7' # 0x00fa -> MIDDLE DOT + '\u221a' # 0x00fb -> SQUARE ROOT + '\u207f' # 0x00fc -> SUPERSCRIPT LATIN SMALL LETTER N + '\xb2' # 0x00fd -> SUPERSCRIPT TWO + '\u25a0' # 0x00fe -> BLACK SQUARE + '\xa0' # 0x00ff -> NO-BREAK SPACE +) + +### Encoding Map + +encoding_map = { + 0x0000: 0x0000, # NULL + 0x0001: 0x0001, # START OF HEADING + 0x0002: 0x0002, # START OF TEXT + 0x0003: 0x0003, # END OF TEXT + 0x0004: 0x0004, # END OF TRANSMISSION + 0x0005: 0x0005, # ENQUIRY + 0x0006: 0x0006, # ACKNOWLEDGE + 0x0007: 0x0007, # BELL + 0x0008: 0x0008, # BACKSPACE + 0x0009: 0x0009, # HORIZONTAL TABULATION + 0x000a: 0x000a, # LINE FEED + 0x000b: 0x000b, # VERTICAL TABULATION + 0x000c: 0x000c, # FORM FEED + 0x000d: 0x000d, # CARRIAGE RETURN + 0x000e: 0x000e, # SHIFT OUT + 0x000f: 0x000f, # SHIFT IN + 0x0010: 0x0010, # DATA LINK ESCAPE + 0x0011: 0x0011, # DEVICE CONTROL ONE + 0x0012: 0x0012, # DEVICE CONTROL TWO + 0x0013: 0x0013, # DEVICE CONTROL THREE + 0x0014: 0x0014, # DEVICE CONTROL FOUR + 0x0015: 0x0015, # NEGATIVE ACKNOWLEDGE + 0x0016: 0x0016, # SYNCHRONOUS IDLE + 0x0017: 0x0017, # END OF TRANSMISSION BLOCK + 0x0018: 0x0018, # CANCEL + 0x0019: 0x0019, # END OF MEDIUM + 0x001a: 0x001a, # SUBSTITUTE + 0x001b: 0x001b, # ESCAPE + 0x001c: 0x001c, # FILE SEPARATOR + 0x001d: 0x001d, # GROUP SEPARATOR + 0x001e: 0x001e, # RECORD SEPARATOR + 0x001f: 0x001f, # UNIT SEPARATOR + 0x0020: 0x0020, # SPACE + 0x0021: 0x0021, # EXCLAMATION MARK + 0x0022: 0x0022, # QUOTATION MARK + 0x0023: 0x0023, # NUMBER SIGN + 0x0024: 0x0024, # DOLLAR SIGN + 0x0025: 0x0025, # PERCENT SIGN + 0x0026: 0x0026, # AMPERSAND + 0x0027: 0x0027, # APOSTROPHE + 0x0028: 0x0028, # LEFT PARENTHESIS + 0x0029: 0x0029, # RIGHT PARENTHESIS + 0x002a: 0x002a, # ASTERISK + 0x002b: 0x002b, # PLUS SIGN + 0x002c: 0x002c, # COMMA + 0x002d: 0x002d, # HYPHEN-MINUS + 0x002e: 0x002e, # FULL STOP + 0x002f: 0x002f, # SOLIDUS + 0x0030: 0x0030, # DIGIT ZERO + 0x0031: 0x0031, # DIGIT ONE + 0x0032: 0x0032, # DIGIT TWO + 0x0033: 0x0033, # DIGIT THREE + 0x0034: 0x0034, # DIGIT FOUR + 0x0035: 0x0035, # DIGIT FIVE + 0x0036: 0x0036, # DIGIT SIX + 0x0037: 0x0037, # DIGIT SEVEN + 0x0038: 0x0038, # DIGIT EIGHT + 0x0039: 0x0039, # DIGIT NINE + 0x003a: 0x003a, # COLON + 0x003b: 0x003b, # SEMICOLON + 0x003c: 0x003c, # LESS-THAN SIGN + 0x003d: 0x003d, # EQUALS SIGN + 0x003e: 0x003e, # GREATER-THAN SIGN + 0x003f: 0x003f, # QUESTION MARK + 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 + 0x005c: 0x005c, # REVERSE SOLIDUS + 0x005d: 0x005d, # RIGHT SQUARE BRACKET + 0x005e: 0x005e, # CIRCUMFLEX ACCENT + 0x005f: 0x005f, # LOW LINE + 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 + 0x007c: 0x007c, # VERTICAL LINE + 0x007d: 0x007d, # RIGHT CURLY BRACKET + 0x007e: 0x007e, # TILDE + 0x007f: 0x007f, # DELETE + 0x00a0: 0x00ff, # NO-BREAK SPACE + 0x00a1: 0x00ad, # INVERTED EXCLAMATION MARK + 0x00a3: 0x009c, # POUND SIGN + 0x00a4: 0x00af, # CURRENCY SIGN + 0x00aa: 0x00a6, # FEMININE ORDINAL INDICATOR + 0x00ab: 0x00ae, # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00ac: 0x00aa, # NOT SIGN + 0x00b0: 0x00f8, # DEGREE SIGN + 0x00b1: 0x00f1, # PLUS-MINUS SIGN + 0x00b2: 0x00fd, # SUPERSCRIPT TWO + 0x00b5: 0x00e6, # MICRO SIGN + 0x00b7: 0x00fa, # MIDDLE DOT + 0x00ba: 0x00a7, # MASCULINE ORDINAL INDICATOR + 0x00bc: 0x00ac, # VULGAR FRACTION ONE QUARTER + 0x00bd: 0x00ab, # VULGAR FRACTION ONE HALF + 0x00bf: 0x00a8, # INVERTED QUESTION MARK + 0x00c4: 0x008e, # LATIN CAPITAL LETTER A WITH DIAERESIS + 0x00c5: 0x008f, # LATIN CAPITAL LETTER A WITH RING ABOVE + 0x00c6: 0x0092, # LATIN CAPITAL LIGATURE AE + 0x00c7: 0x0080, # LATIN CAPITAL LETTER C WITH CEDILLA + 0x00c9: 0x0090, # LATIN CAPITAL LETTER E WITH ACUTE + 0x00d1: 0x00a5, # LATIN CAPITAL LETTER N WITH TILDE + 0x00d6: 0x0099, # LATIN CAPITAL LETTER O WITH DIAERESIS + 0x00d8: 0x009d, # LATIN CAPITAL LETTER O WITH STROKE + 0x00dc: 0x009a, # LATIN CAPITAL LETTER U WITH DIAERESIS + 0x00df: 0x00e1, # LATIN SMALL LETTER SHARP S + 0x00e0: 0x0085, # LATIN SMALL LETTER A WITH GRAVE + 0x00e1: 0x00a0, # LATIN SMALL LETTER A WITH ACUTE + 0x00e2: 0x0083, # LATIN SMALL LETTER A WITH CIRCUMFLEX + 0x00e4: 0x0084, # LATIN SMALL LETTER A WITH DIAERESIS + 0x00e5: 0x0086, # LATIN SMALL LETTER A WITH RING ABOVE + 0x00e6: 0x0091, # LATIN SMALL LIGATURE AE + 0x00e7: 0x0087, # LATIN SMALL LETTER C WITH CEDILLA + 0x00e8: 0x008a, # LATIN SMALL LETTER E WITH GRAVE + 0x00e9: 0x0082, # LATIN SMALL LETTER E WITH ACUTE + 0x00ea: 0x0088, # LATIN SMALL LETTER E WITH CIRCUMFLEX + 0x00eb: 0x0089, # LATIN SMALL LETTER E WITH DIAERESIS + 0x00ec: 0x008d, # LATIN SMALL LETTER I WITH GRAVE + 0x00ed: 0x00a1, # LATIN SMALL LETTER I WITH ACUTE + 0x00ee: 0x008c, # LATIN SMALL LETTER I WITH CIRCUMFLEX + 0x00ef: 0x008b, # LATIN SMALL LETTER I WITH DIAERESIS + 0x00f1: 0x00a4, # LATIN SMALL LETTER N WITH TILDE + 0x00f2: 0x0095, # LATIN SMALL LETTER O WITH GRAVE + 0x00f3: 0x00a2, # LATIN SMALL LETTER O WITH ACUTE + 0x00f4: 0x0093, # LATIN SMALL LETTER O WITH CIRCUMFLEX + 0x00f6: 0x0094, # LATIN SMALL LETTER O WITH DIAERESIS + 0x00f7: 0x00f6, # DIVISION SIGN + 0x00f8: 0x009b, # LATIN SMALL LETTER O WITH STROKE + 0x00f9: 0x0097, # LATIN SMALL LETTER U WITH GRAVE + 0x00fa: 0x00a3, # LATIN SMALL LETTER U WITH ACUTE + 0x00fb: 0x0096, # LATIN SMALL LETTER U WITH CIRCUMFLEX + 0x00fc: 0x0081, # LATIN SMALL LETTER U WITH DIAERESIS + 0x00ff: 0x0098, # LATIN SMALL LETTER Y WITH DIAERESIS + 0x0192: 0x009f, # LATIN SMALL LETTER F WITH HOOK + 0x0393: 0x00e2, # GREEK CAPITAL LETTER GAMMA + 0x0398: 0x00e9, # GREEK CAPITAL LETTER THETA + 0x03a3: 0x00e4, # GREEK CAPITAL LETTER SIGMA + 0x03a6: 0x00e8, # GREEK CAPITAL LETTER PHI + 0x03a9: 0x00ea, # GREEK CAPITAL LETTER OMEGA + 0x03b1: 0x00e0, # GREEK SMALL LETTER ALPHA + 0x03b4: 0x00eb, # GREEK SMALL LETTER DELTA + 0x03b5: 0x00ee, # GREEK SMALL LETTER EPSILON + 0x03c0: 0x00e3, # GREEK SMALL LETTER PI + 0x03c3: 0x00e5, # GREEK SMALL LETTER SIGMA + 0x03c4: 0x00e7, # GREEK SMALL LETTER TAU + 0x03c6: 0x00ed, # GREEK SMALL LETTER PHI + 0x207f: 0x00fc, # SUPERSCRIPT LATIN SMALL LETTER N + 0x20a7: 0x009e, # PESETA SIGN + 0x2219: 0x00f9, # BULLET OPERATOR + 0x221a: 0x00fb, # SQUARE ROOT + 0x221e: 0x00ec, # INFINITY + 0x2229: 0x00ef, # INTERSECTION + 0x2248: 0x00f7, # ALMOST EQUAL TO + 0x2261: 0x00f0, # IDENTICAL TO + 0x2264: 0x00f3, # LESS-THAN OR EQUAL TO + 0x2265: 0x00f2, # GREATER-THAN OR EQUAL TO + 0x2310: 0x00a9, # REVERSED NOT SIGN + 0x2320: 0x00f4, # TOP HALF INTEGRAL + 0x2321: 0x00f5, # BOTTOM HALF INTEGRAL + 0x2500: 0x00c4, # BOX DRAWINGS LIGHT HORIZONTAL + 0x2502: 0x00b3, # BOX DRAWINGS LIGHT VERTICAL + 0x250c: 0x00da, # BOX DRAWINGS LIGHT DOWN AND RIGHT + 0x2510: 0x00bf, # BOX DRAWINGS LIGHT DOWN AND LEFT + 0x2514: 0x00c0, # BOX DRAWINGS LIGHT UP AND RIGHT + 0x2518: 0x00d9, # BOX DRAWINGS LIGHT UP AND LEFT + 0x251c: 0x00c3, # BOX DRAWINGS LIGHT VERTICAL AND RIGHT + 0x2524: 0x00b4, # BOX DRAWINGS LIGHT VERTICAL AND LEFT + 0x252c: 0x00c2, # BOX DRAWINGS LIGHT DOWN AND HORIZONTAL + 0x2534: 0x00c1, # BOX DRAWINGS LIGHT UP AND HORIZONTAL + 0x253c: 0x00c5, # BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL + 0x2550: 0x00cd, # BOX DRAWINGS DOUBLE HORIZONTAL + 0x2551: 0x00ba, # BOX DRAWINGS DOUBLE VERTICAL + 0x2552: 0x00d5, # BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE + 0x2553: 0x00d6, # BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE + 0x2554: 0x00c9, # BOX DRAWINGS DOUBLE DOWN AND RIGHT + 0x2555: 0x00b8, # BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE + 0x2556: 0x00b7, # BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE + 0x2557: 0x00bb, # BOX DRAWINGS DOUBLE DOWN AND LEFT + 0x2558: 0x00d4, # BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE + 0x2559: 0x00d3, # BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE + 0x255a: 0x00c8, # BOX DRAWINGS DOUBLE UP AND RIGHT + 0x255b: 0x00be, # BOX DRAWINGS UP SINGLE AND LEFT DOUBLE + 0x255c: 0x00bd, # BOX DRAWINGS UP DOUBLE AND LEFT SINGLE + 0x255d: 0x00bc, # BOX DRAWINGS DOUBLE UP AND LEFT + 0x255e: 0x00c6, # BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE + 0x255f: 0x00c7, # BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE + 0x2560: 0x00cc, # BOX DRAWINGS DOUBLE VERTICAL AND RIGHT + 0x2561: 0x00b5, # BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE + 0x2562: 0x00b6, # BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE + 0x2563: 0x00b9, # BOX DRAWINGS DOUBLE VERTICAL AND LEFT + 0x2564: 0x00d1, # BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE + 0x2565: 0x00d2, # BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE + 0x2566: 0x00cb, # BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL + 0x2567: 0x00cf, # BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE + 0x2568: 0x00d0, # BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE + 0x2569: 0x00ca, # BOX DRAWINGS DOUBLE UP AND HORIZONTAL + 0x256a: 0x00d8, # BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE + 0x256b: 0x00d7, # BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE + 0x256c: 0x00ce, # BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL + 0x2580: 0x00df, # UPPER HALF BLOCK + 0x2584: 0x00dc, # LOWER HALF BLOCK + 0x2588: 0x00db, # FULL BLOCK + 0x258c: 0x00dd, # LEFT HALF BLOCK + 0x2590: 0x00de, # RIGHT HALF BLOCK + 0x2591: 0x00b0, # LIGHT SHADE + 0x2592: 0x00b1, # MEDIUM SHADE + 0x2593: 0x00b2, # DARK SHADE + 0x25a0: 0x00fe, # BLACK SQUARE +} diff --git a/env/Lib/encodings/cp866.py b/env/Lib/encodings/cp866.py new file mode 100644 index 0000000..bec7ae3 --- /dev/null +++ b/env/Lib/encodings/cp866.py @@ -0,0 +1,698 @@ +""" Python Character Mapping Codec generated from 'VENDORS/MICSFT/PC/CP866.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_map) + + 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_map)[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='cp866', + 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: 0x0410, # CYRILLIC CAPITAL LETTER A + 0x0081: 0x0411, # CYRILLIC CAPITAL LETTER BE + 0x0082: 0x0412, # CYRILLIC CAPITAL LETTER VE + 0x0083: 0x0413, # CYRILLIC CAPITAL LETTER GHE + 0x0084: 0x0414, # CYRILLIC CAPITAL LETTER DE + 0x0085: 0x0415, # CYRILLIC CAPITAL LETTER IE + 0x0086: 0x0416, # CYRILLIC CAPITAL LETTER ZHE + 0x0087: 0x0417, # CYRILLIC CAPITAL LETTER ZE + 0x0088: 0x0418, # CYRILLIC CAPITAL LETTER I + 0x0089: 0x0419, # CYRILLIC CAPITAL LETTER SHORT I + 0x008a: 0x041a, # CYRILLIC CAPITAL LETTER KA + 0x008b: 0x041b, # CYRILLIC CAPITAL LETTER EL + 0x008c: 0x041c, # CYRILLIC CAPITAL LETTER EM + 0x008d: 0x041d, # CYRILLIC CAPITAL LETTER EN + 0x008e: 0x041e, # CYRILLIC CAPITAL LETTER O + 0x008f: 0x041f, # CYRILLIC CAPITAL LETTER PE + 0x0090: 0x0420, # CYRILLIC CAPITAL LETTER ER + 0x0091: 0x0421, # CYRILLIC CAPITAL LETTER ES + 0x0092: 0x0422, # CYRILLIC CAPITAL LETTER TE + 0x0093: 0x0423, # CYRILLIC CAPITAL LETTER U + 0x0094: 0x0424, # CYRILLIC CAPITAL LETTER EF + 0x0095: 0x0425, # CYRILLIC CAPITAL LETTER HA + 0x0096: 0x0426, # CYRILLIC CAPITAL LETTER TSE + 0x0097: 0x0427, # CYRILLIC CAPITAL LETTER CHE + 0x0098: 0x0428, # CYRILLIC CAPITAL LETTER SHA + 0x0099: 0x0429, # CYRILLIC CAPITAL LETTER SHCHA + 0x009a: 0x042a, # CYRILLIC CAPITAL LETTER HARD SIGN + 0x009b: 0x042b, # CYRILLIC CAPITAL LETTER YERU + 0x009c: 0x042c, # CYRILLIC CAPITAL LETTER SOFT SIGN + 0x009d: 0x042d, # CYRILLIC CAPITAL LETTER E + 0x009e: 0x042e, # CYRILLIC CAPITAL LETTER YU + 0x009f: 0x042f, # CYRILLIC CAPITAL LETTER YA + 0x00a0: 0x0430, # CYRILLIC SMALL LETTER A + 0x00a1: 0x0431, # CYRILLIC SMALL LETTER BE + 0x00a2: 0x0432, # CYRILLIC SMALL LETTER VE + 0x00a3: 0x0433, # CYRILLIC SMALL LETTER GHE + 0x00a4: 0x0434, # CYRILLIC SMALL LETTER DE + 0x00a5: 0x0435, # CYRILLIC SMALL LETTER IE + 0x00a6: 0x0436, # CYRILLIC SMALL LETTER ZHE + 0x00a7: 0x0437, # CYRILLIC SMALL LETTER ZE + 0x00a8: 0x0438, # CYRILLIC SMALL LETTER I + 0x00a9: 0x0439, # CYRILLIC SMALL LETTER SHORT I + 0x00aa: 0x043a, # CYRILLIC SMALL LETTER KA + 0x00ab: 0x043b, # CYRILLIC SMALL LETTER EL + 0x00ac: 0x043c, # CYRILLIC SMALL LETTER EM + 0x00ad: 0x043d, # CYRILLIC SMALL LETTER EN + 0x00ae: 0x043e, # CYRILLIC SMALL LETTER O + 0x00af: 0x043f, # CYRILLIC SMALL LETTER PE + 0x00b0: 0x2591, # LIGHT SHADE + 0x00b1: 0x2592, # MEDIUM SHADE + 0x00b2: 0x2593, # DARK SHADE + 0x00b3: 0x2502, # BOX DRAWINGS LIGHT VERTICAL + 0x00b4: 0x2524, # BOX DRAWINGS LIGHT VERTICAL AND LEFT + 0x00b5: 0x2561, # BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE + 0x00b6: 0x2562, # BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE + 0x00b7: 0x2556, # BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE + 0x00b8: 0x2555, # BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE + 0x00b9: 0x2563, # BOX DRAWINGS DOUBLE VERTICAL AND LEFT + 0x00ba: 0x2551, # BOX DRAWINGS DOUBLE VERTICAL + 0x00bb: 0x2557, # BOX DRAWINGS DOUBLE DOWN AND LEFT + 0x00bc: 0x255d, # BOX DRAWINGS DOUBLE UP AND LEFT + 0x00bd: 0x255c, # BOX DRAWINGS UP DOUBLE AND LEFT SINGLE + 0x00be: 0x255b, # BOX DRAWINGS UP SINGLE AND LEFT DOUBLE + 0x00bf: 0x2510, # BOX DRAWINGS LIGHT DOWN AND LEFT + 0x00c0: 0x2514, # BOX DRAWINGS LIGHT UP AND RIGHT + 0x00c1: 0x2534, # BOX DRAWINGS LIGHT UP AND HORIZONTAL + 0x00c2: 0x252c, # BOX DRAWINGS LIGHT DOWN AND HORIZONTAL + 0x00c3: 0x251c, # BOX DRAWINGS LIGHT VERTICAL AND RIGHT + 0x00c4: 0x2500, # BOX DRAWINGS LIGHT HORIZONTAL + 0x00c5: 0x253c, # BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL + 0x00c6: 0x255e, # BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE + 0x00c7: 0x255f, # BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE + 0x00c8: 0x255a, # BOX DRAWINGS DOUBLE UP AND RIGHT + 0x00c9: 0x2554, # BOX DRAWINGS DOUBLE DOWN AND RIGHT + 0x00ca: 0x2569, # BOX DRAWINGS DOUBLE UP AND HORIZONTAL + 0x00cb: 0x2566, # BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL + 0x00cc: 0x2560, # BOX DRAWINGS DOUBLE VERTICAL AND RIGHT + 0x00cd: 0x2550, # BOX DRAWINGS DOUBLE HORIZONTAL + 0x00ce: 0x256c, # BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL + 0x00cf: 0x2567, # BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE + 0x00d0: 0x2568, # BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE + 0x00d1: 0x2564, # BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE + 0x00d2: 0x2565, # BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE + 0x00d3: 0x2559, # BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE + 0x00d4: 0x2558, # BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE + 0x00d5: 0x2552, # BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE + 0x00d6: 0x2553, # BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE + 0x00d7: 0x256b, # BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE + 0x00d8: 0x256a, # BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE + 0x00d9: 0x2518, # BOX DRAWINGS LIGHT UP AND LEFT + 0x00da: 0x250c, # BOX DRAWINGS LIGHT DOWN AND RIGHT + 0x00db: 0x2588, # FULL BLOCK + 0x00dc: 0x2584, # LOWER HALF BLOCK + 0x00dd: 0x258c, # LEFT HALF BLOCK + 0x00de: 0x2590, # RIGHT HALF BLOCK + 0x00df: 0x2580, # UPPER HALF BLOCK + 0x00e0: 0x0440, # CYRILLIC SMALL LETTER ER + 0x00e1: 0x0441, # CYRILLIC SMALL LETTER ES + 0x00e2: 0x0442, # CYRILLIC SMALL LETTER TE + 0x00e3: 0x0443, # CYRILLIC SMALL LETTER U + 0x00e4: 0x0444, # CYRILLIC SMALL LETTER EF + 0x00e5: 0x0445, # CYRILLIC SMALL LETTER HA + 0x00e6: 0x0446, # CYRILLIC SMALL LETTER TSE + 0x00e7: 0x0447, # CYRILLIC SMALL LETTER CHE + 0x00e8: 0x0448, # CYRILLIC SMALL LETTER SHA + 0x00e9: 0x0449, # CYRILLIC SMALL LETTER SHCHA + 0x00ea: 0x044a, # CYRILLIC SMALL LETTER HARD SIGN + 0x00eb: 0x044b, # CYRILLIC SMALL LETTER YERU + 0x00ec: 0x044c, # CYRILLIC SMALL LETTER SOFT SIGN + 0x00ed: 0x044d, # CYRILLIC SMALL LETTER E + 0x00ee: 0x044e, # CYRILLIC SMALL LETTER YU + 0x00ef: 0x044f, # CYRILLIC SMALL LETTER YA + 0x00f0: 0x0401, # CYRILLIC CAPITAL LETTER IO + 0x00f1: 0x0451, # CYRILLIC SMALL LETTER IO + 0x00f2: 0x0404, # CYRILLIC CAPITAL LETTER UKRAINIAN IE + 0x00f3: 0x0454, # CYRILLIC SMALL LETTER UKRAINIAN IE + 0x00f4: 0x0407, # CYRILLIC CAPITAL LETTER YI + 0x00f5: 0x0457, # CYRILLIC SMALL LETTER YI + 0x00f6: 0x040e, # CYRILLIC CAPITAL LETTER SHORT U + 0x00f7: 0x045e, # CYRILLIC SMALL LETTER SHORT U + 0x00f8: 0x00b0, # DEGREE SIGN + 0x00f9: 0x2219, # BULLET OPERATOR + 0x00fa: 0x00b7, # MIDDLE DOT + 0x00fb: 0x221a, # SQUARE ROOT + 0x00fc: 0x2116, # NUMERO SIGN + 0x00fd: 0x00a4, # CURRENCY SIGN + 0x00fe: 0x25a0, # BLACK SQUARE + 0x00ff: 0x00a0, # NO-BREAK SPACE +}) + +### Decoding Table + +decoding_table = ( + '\x00' # 0x0000 -> NULL + '\x01' # 0x0001 -> START OF HEADING + '\x02' # 0x0002 -> START OF TEXT + '\x03' # 0x0003 -> END OF TEXT + '\x04' # 0x0004 -> END OF TRANSMISSION + '\x05' # 0x0005 -> ENQUIRY + '\x06' # 0x0006 -> ACKNOWLEDGE + '\x07' # 0x0007 -> BELL + '\x08' # 0x0008 -> BACKSPACE + '\t' # 0x0009 -> HORIZONTAL TABULATION + '\n' # 0x000a -> LINE FEED + '\x0b' # 0x000b -> VERTICAL TABULATION + '\x0c' # 0x000c -> FORM FEED + '\r' # 0x000d -> CARRIAGE RETURN + '\x0e' # 0x000e -> SHIFT OUT + '\x0f' # 0x000f -> SHIFT IN + '\x10' # 0x0010 -> DATA LINK ESCAPE + '\x11' # 0x0011 -> DEVICE CONTROL ONE + '\x12' # 0x0012 -> DEVICE CONTROL TWO + '\x13' # 0x0013 -> DEVICE CONTROL THREE + '\x14' # 0x0014 -> DEVICE CONTROL FOUR + '\x15' # 0x0015 -> NEGATIVE ACKNOWLEDGE + '\x16' # 0x0016 -> SYNCHRONOUS IDLE + '\x17' # 0x0017 -> END OF TRANSMISSION BLOCK + '\x18' # 0x0018 -> CANCEL + '\x19' # 0x0019 -> END OF MEDIUM + '\x1a' # 0x001a -> SUBSTITUTE + '\x1b' # 0x001b -> ESCAPE + '\x1c' # 0x001c -> FILE SEPARATOR + '\x1d' # 0x001d -> GROUP SEPARATOR + '\x1e' # 0x001e -> RECORD SEPARATOR + '\x1f' # 0x001f -> UNIT SEPARATOR + ' ' # 0x0020 -> SPACE + '!' # 0x0021 -> EXCLAMATION MARK + '"' # 0x0022 -> QUOTATION MARK + '#' # 0x0023 -> NUMBER SIGN + '$' # 0x0024 -> DOLLAR SIGN + '%' # 0x0025 -> PERCENT SIGN + '&' # 0x0026 -> AMPERSAND + "'" # 0x0027 -> APOSTROPHE + '(' # 0x0028 -> LEFT PARENTHESIS + ')' # 0x0029 -> RIGHT PARENTHESIS + '*' # 0x002a -> ASTERISK + '+' # 0x002b -> PLUS SIGN + ',' # 0x002c -> COMMA + '-' # 0x002d -> HYPHEN-MINUS + '.' # 0x002e -> FULL STOP + '/' # 0x002f -> SOLIDUS + '0' # 0x0030 -> DIGIT ZERO + '1' # 0x0031 -> DIGIT ONE + '2' # 0x0032 -> DIGIT TWO + '3' # 0x0033 -> DIGIT THREE + '4' # 0x0034 -> DIGIT FOUR + '5' # 0x0035 -> DIGIT FIVE + '6' # 0x0036 -> DIGIT SIX + '7' # 0x0037 -> DIGIT SEVEN + '8' # 0x0038 -> DIGIT EIGHT + '9' # 0x0039 -> DIGIT NINE + ':' # 0x003a -> COLON + ';' # 0x003b -> SEMICOLON + '<' # 0x003c -> LESS-THAN SIGN + '=' # 0x003d -> EQUALS SIGN + '>' # 0x003e -> GREATER-THAN SIGN + '?' # 0x003f -> QUESTION MARK + '@' # 0x0040 -> COMMERCIAL AT + 'A' # 0x0041 -> LATIN CAPITAL LETTER A + 'B' # 0x0042 -> LATIN CAPITAL LETTER B + 'C' # 0x0043 -> LATIN CAPITAL LETTER C + 'D' # 0x0044 -> LATIN CAPITAL LETTER D + 'E' # 0x0045 -> LATIN CAPITAL LETTER E + 'F' # 0x0046 -> LATIN CAPITAL LETTER F + 'G' # 0x0047 -> LATIN CAPITAL LETTER G + 'H' # 0x0048 -> LATIN CAPITAL LETTER H + 'I' # 0x0049 -> LATIN CAPITAL LETTER I + 'J' # 0x004a -> LATIN CAPITAL LETTER J + 'K' # 0x004b -> LATIN CAPITAL LETTER K + 'L' # 0x004c -> LATIN CAPITAL LETTER L + 'M' # 0x004d -> LATIN CAPITAL LETTER M + 'N' # 0x004e -> LATIN CAPITAL LETTER N + 'O' # 0x004f -> LATIN CAPITAL LETTER O + 'P' # 0x0050 -> LATIN CAPITAL LETTER P + 'Q' # 0x0051 -> LATIN CAPITAL LETTER Q + 'R' # 0x0052 -> LATIN CAPITAL LETTER R + 'S' # 0x0053 -> LATIN CAPITAL LETTER S + 'T' # 0x0054 -> LATIN CAPITAL LETTER T + 'U' # 0x0055 -> LATIN CAPITAL LETTER U + 'V' # 0x0056 -> LATIN CAPITAL LETTER V + 'W' # 0x0057 -> LATIN CAPITAL LETTER W + 'X' # 0x0058 -> LATIN CAPITAL LETTER X + 'Y' # 0x0059 -> LATIN CAPITAL LETTER Y + 'Z' # 0x005a -> LATIN CAPITAL LETTER Z + '[' # 0x005b -> LEFT SQUARE BRACKET + '\\' # 0x005c -> REVERSE SOLIDUS + ']' # 0x005d -> RIGHT SQUARE BRACKET + '^' # 0x005e -> CIRCUMFLEX ACCENT + '_' # 0x005f -> LOW LINE + '`' # 0x0060 -> GRAVE ACCENT + 'a' # 0x0061 -> LATIN SMALL LETTER A + 'b' # 0x0062 -> LATIN SMALL LETTER B + 'c' # 0x0063 -> LATIN SMALL LETTER C + 'd' # 0x0064 -> LATIN SMALL LETTER D + 'e' # 0x0065 -> LATIN SMALL LETTER E + 'f' # 0x0066 -> LATIN SMALL LETTER F + 'g' # 0x0067 -> LATIN SMALL LETTER G + 'h' # 0x0068 -> LATIN SMALL LETTER H + 'i' # 0x0069 -> LATIN SMALL LETTER I + 'j' # 0x006a -> LATIN SMALL LETTER J + 'k' # 0x006b -> LATIN SMALL LETTER K + 'l' # 0x006c -> LATIN SMALL LETTER L + 'm' # 0x006d -> LATIN SMALL LETTER M + 'n' # 0x006e -> LATIN SMALL LETTER N + 'o' # 0x006f -> LATIN SMALL LETTER O + 'p' # 0x0070 -> LATIN SMALL LETTER P + 'q' # 0x0071 -> LATIN SMALL LETTER Q + 'r' # 0x0072 -> LATIN SMALL LETTER R + 's' # 0x0073 -> LATIN SMALL LETTER S + 't' # 0x0074 -> LATIN SMALL LETTER T + 'u' # 0x0075 -> LATIN SMALL LETTER U + 'v' # 0x0076 -> LATIN SMALL LETTER V + 'w' # 0x0077 -> LATIN SMALL LETTER W + 'x' # 0x0078 -> LATIN SMALL LETTER X + 'y' # 0x0079 -> LATIN SMALL LETTER Y + 'z' # 0x007a -> LATIN SMALL LETTER Z + '{' # 0x007b -> LEFT CURLY BRACKET + '|' # 0x007c -> VERTICAL LINE + '}' # 0x007d -> RIGHT CURLY BRACKET + '~' # 0x007e -> TILDE + '\x7f' # 0x007f -> DELETE + '\u0410' # 0x0080 -> CYRILLIC CAPITAL LETTER A + '\u0411' # 0x0081 -> CYRILLIC CAPITAL LETTER BE + '\u0412' # 0x0082 -> CYRILLIC CAPITAL LETTER VE + '\u0413' # 0x0083 -> CYRILLIC CAPITAL LETTER GHE + '\u0414' # 0x0084 -> CYRILLIC CAPITAL LETTER DE + '\u0415' # 0x0085 -> CYRILLIC CAPITAL LETTER IE + '\u0416' # 0x0086 -> CYRILLIC CAPITAL LETTER ZHE + '\u0417' # 0x0087 -> CYRILLIC CAPITAL LETTER ZE + '\u0418' # 0x0088 -> CYRILLIC CAPITAL LETTER I + '\u0419' # 0x0089 -> CYRILLIC CAPITAL LETTER SHORT I + '\u041a' # 0x008a -> CYRILLIC CAPITAL LETTER KA + '\u041b' # 0x008b -> CYRILLIC CAPITAL LETTER EL + '\u041c' # 0x008c -> CYRILLIC CAPITAL LETTER EM + '\u041d' # 0x008d -> CYRILLIC CAPITAL LETTER EN + '\u041e' # 0x008e -> CYRILLIC CAPITAL LETTER O + '\u041f' # 0x008f -> CYRILLIC CAPITAL LETTER PE + '\u0420' # 0x0090 -> CYRILLIC CAPITAL LETTER ER + '\u0421' # 0x0091 -> CYRILLIC CAPITAL LETTER ES + '\u0422' # 0x0092 -> CYRILLIC CAPITAL LETTER TE + '\u0423' # 0x0093 -> CYRILLIC CAPITAL LETTER U + '\u0424' # 0x0094 -> CYRILLIC CAPITAL LETTER EF + '\u0425' # 0x0095 -> CYRILLIC CAPITAL LETTER HA + '\u0426' # 0x0096 -> CYRILLIC CAPITAL LETTER TSE + '\u0427' # 0x0097 -> CYRILLIC CAPITAL LETTER CHE + '\u0428' # 0x0098 -> CYRILLIC CAPITAL LETTER SHA + '\u0429' # 0x0099 -> CYRILLIC CAPITAL LETTER SHCHA + '\u042a' # 0x009a -> CYRILLIC CAPITAL LETTER HARD SIGN + '\u042b' # 0x009b -> CYRILLIC CAPITAL LETTER YERU + '\u042c' # 0x009c -> CYRILLIC CAPITAL LETTER SOFT SIGN + '\u042d' # 0x009d -> CYRILLIC CAPITAL LETTER E + '\u042e' # 0x009e -> CYRILLIC CAPITAL LETTER YU + '\u042f' # 0x009f -> CYRILLIC CAPITAL LETTER YA + '\u0430' # 0x00a0 -> CYRILLIC SMALL LETTER A + '\u0431' # 0x00a1 -> CYRILLIC SMALL LETTER BE + '\u0432' # 0x00a2 -> CYRILLIC SMALL LETTER VE + '\u0433' # 0x00a3 -> CYRILLIC SMALL LETTER GHE + '\u0434' # 0x00a4 -> CYRILLIC SMALL LETTER DE + '\u0435' # 0x00a5 -> CYRILLIC SMALL LETTER IE + '\u0436' # 0x00a6 -> CYRILLIC SMALL LETTER ZHE + '\u0437' # 0x00a7 -> CYRILLIC SMALL LETTER ZE + '\u0438' # 0x00a8 -> CYRILLIC SMALL LETTER I + '\u0439' # 0x00a9 -> CYRILLIC SMALL LETTER SHORT I + '\u043a' # 0x00aa -> CYRILLIC SMALL LETTER KA + '\u043b' # 0x00ab -> CYRILLIC SMALL LETTER EL + '\u043c' # 0x00ac -> CYRILLIC SMALL LETTER EM + '\u043d' # 0x00ad -> CYRILLIC SMALL LETTER EN + '\u043e' # 0x00ae -> CYRILLIC SMALL LETTER O + '\u043f' # 0x00af -> CYRILLIC SMALL LETTER PE + '\u2591' # 0x00b0 -> LIGHT SHADE + '\u2592' # 0x00b1 -> MEDIUM SHADE + '\u2593' # 0x00b2 -> DARK SHADE + '\u2502' # 0x00b3 -> BOX DRAWINGS LIGHT VERTICAL + '\u2524' # 0x00b4 -> BOX DRAWINGS LIGHT VERTICAL AND LEFT + '\u2561' # 0x00b5 -> BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE + '\u2562' # 0x00b6 -> BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE + '\u2556' # 0x00b7 -> BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE + '\u2555' # 0x00b8 -> BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE + '\u2563' # 0x00b9 -> BOX DRAWINGS DOUBLE VERTICAL AND LEFT + '\u2551' # 0x00ba -> BOX DRAWINGS DOUBLE VERTICAL + '\u2557' # 0x00bb -> BOX DRAWINGS DOUBLE DOWN AND LEFT + '\u255d' # 0x00bc -> BOX DRAWINGS DOUBLE UP AND LEFT + '\u255c' # 0x00bd -> BOX DRAWINGS UP DOUBLE AND LEFT SINGLE + '\u255b' # 0x00be -> BOX DRAWINGS UP SINGLE AND LEFT DOUBLE + '\u2510' # 0x00bf -> BOX DRAWINGS LIGHT DOWN AND LEFT + '\u2514' # 0x00c0 -> BOX DRAWINGS LIGHT UP AND RIGHT + '\u2534' # 0x00c1 -> BOX DRAWINGS LIGHT UP AND HORIZONTAL + '\u252c' # 0x00c2 -> BOX DRAWINGS LIGHT DOWN AND HORIZONTAL + '\u251c' # 0x00c3 -> BOX DRAWINGS LIGHT VERTICAL AND RIGHT + '\u2500' # 0x00c4 -> BOX DRAWINGS LIGHT HORIZONTAL + '\u253c' # 0x00c5 -> BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL + '\u255e' # 0x00c6 -> BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE + '\u255f' # 0x00c7 -> BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE + '\u255a' # 0x00c8 -> BOX DRAWINGS DOUBLE UP AND RIGHT + '\u2554' # 0x00c9 -> BOX DRAWINGS DOUBLE DOWN AND RIGHT + '\u2569' # 0x00ca -> BOX DRAWINGS DOUBLE UP AND HORIZONTAL + '\u2566' # 0x00cb -> BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL + '\u2560' # 0x00cc -> BOX DRAWINGS DOUBLE VERTICAL AND RIGHT + '\u2550' # 0x00cd -> BOX DRAWINGS DOUBLE HORIZONTAL + '\u256c' # 0x00ce -> BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL + '\u2567' # 0x00cf -> BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE + '\u2568' # 0x00d0 -> BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE + '\u2564' # 0x00d1 -> BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE + '\u2565' # 0x00d2 -> BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE + '\u2559' # 0x00d3 -> BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE + '\u2558' # 0x00d4 -> BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE + '\u2552' # 0x00d5 -> BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE + '\u2553' # 0x00d6 -> BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE + '\u256b' # 0x00d7 -> BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE + '\u256a' # 0x00d8 -> BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE + '\u2518' # 0x00d9 -> BOX DRAWINGS LIGHT UP AND LEFT + '\u250c' # 0x00da -> BOX DRAWINGS LIGHT DOWN AND RIGHT + '\u2588' # 0x00db -> FULL BLOCK + '\u2584' # 0x00dc -> LOWER HALF BLOCK + '\u258c' # 0x00dd -> LEFT HALF BLOCK + '\u2590' # 0x00de -> RIGHT HALF BLOCK + '\u2580' # 0x00df -> UPPER HALF BLOCK + '\u0440' # 0x00e0 -> CYRILLIC SMALL LETTER ER + '\u0441' # 0x00e1 -> CYRILLIC SMALL LETTER ES + '\u0442' # 0x00e2 -> CYRILLIC SMALL LETTER TE + '\u0443' # 0x00e3 -> CYRILLIC SMALL LETTER U + '\u0444' # 0x00e4 -> CYRILLIC SMALL LETTER EF + '\u0445' # 0x00e5 -> CYRILLIC SMALL LETTER HA + '\u0446' # 0x00e6 -> CYRILLIC SMALL LETTER TSE + '\u0447' # 0x00e7 -> CYRILLIC SMALL LETTER CHE + '\u0448' # 0x00e8 -> CYRILLIC SMALL LETTER SHA + '\u0449' # 0x00e9 -> CYRILLIC SMALL LETTER SHCHA + '\u044a' # 0x00ea -> CYRILLIC SMALL LETTER HARD SIGN + '\u044b' # 0x00eb -> CYRILLIC SMALL LETTER YERU + '\u044c' # 0x00ec -> CYRILLIC SMALL LETTER SOFT SIGN + '\u044d' # 0x00ed -> CYRILLIC SMALL LETTER E + '\u044e' # 0x00ee -> CYRILLIC SMALL LETTER YU + '\u044f' # 0x00ef -> CYRILLIC SMALL LETTER YA + '\u0401' # 0x00f0 -> CYRILLIC CAPITAL LETTER IO + '\u0451' # 0x00f1 -> CYRILLIC SMALL LETTER IO + '\u0404' # 0x00f2 -> CYRILLIC CAPITAL LETTER UKRAINIAN IE + '\u0454' # 0x00f3 -> CYRILLIC SMALL LETTER UKRAINIAN IE + '\u0407' # 0x00f4 -> CYRILLIC CAPITAL LETTER YI + '\u0457' # 0x00f5 -> CYRILLIC SMALL LETTER YI + '\u040e' # 0x00f6 -> CYRILLIC CAPITAL LETTER SHORT U + '\u045e' # 0x00f7 -> CYRILLIC SMALL LETTER SHORT U + '\xb0' # 0x00f8 -> DEGREE SIGN + '\u2219' # 0x00f9 -> BULLET OPERATOR + '\xb7' # 0x00fa -> MIDDLE DOT + '\u221a' # 0x00fb -> SQUARE ROOT + '\u2116' # 0x00fc -> NUMERO SIGN + '\xa4' # 0x00fd -> CURRENCY SIGN + '\u25a0' # 0x00fe -> BLACK SQUARE + '\xa0' # 0x00ff -> NO-BREAK SPACE +) + +### Encoding Map + +encoding_map = { + 0x0000: 0x0000, # NULL + 0x0001: 0x0001, # START OF HEADING + 0x0002: 0x0002, # START OF TEXT + 0x0003: 0x0003, # END OF TEXT + 0x0004: 0x0004, # END OF TRANSMISSION + 0x0005: 0x0005, # ENQUIRY + 0x0006: 0x0006, # ACKNOWLEDGE + 0x0007: 0x0007, # BELL + 0x0008: 0x0008, # BACKSPACE + 0x0009: 0x0009, # HORIZONTAL TABULATION + 0x000a: 0x000a, # LINE FEED + 0x000b: 0x000b, # VERTICAL TABULATION + 0x000c: 0x000c, # FORM FEED + 0x000d: 0x000d, # CARRIAGE RETURN + 0x000e: 0x000e, # SHIFT OUT + 0x000f: 0x000f, # SHIFT IN + 0x0010: 0x0010, # DATA LINK ESCAPE + 0x0011: 0x0011, # DEVICE CONTROL ONE + 0x0012: 0x0012, # DEVICE CONTROL TWO + 0x0013: 0x0013, # DEVICE CONTROL THREE + 0x0014: 0x0014, # DEVICE CONTROL FOUR + 0x0015: 0x0015, # NEGATIVE ACKNOWLEDGE + 0x0016: 0x0016, # SYNCHRONOUS IDLE + 0x0017: 0x0017, # END OF TRANSMISSION BLOCK + 0x0018: 0x0018, # CANCEL + 0x0019: 0x0019, # END OF MEDIUM + 0x001a: 0x001a, # SUBSTITUTE + 0x001b: 0x001b, # ESCAPE + 0x001c: 0x001c, # FILE SEPARATOR + 0x001d: 0x001d, # GROUP SEPARATOR + 0x001e: 0x001e, # RECORD SEPARATOR + 0x001f: 0x001f, # UNIT SEPARATOR + 0x0020: 0x0020, # SPACE + 0x0021: 0x0021, # EXCLAMATION MARK + 0x0022: 0x0022, # QUOTATION MARK + 0x0023: 0x0023, # NUMBER SIGN + 0x0024: 0x0024, # DOLLAR SIGN + 0x0025: 0x0025, # PERCENT SIGN + 0x0026: 0x0026, # AMPERSAND + 0x0027: 0x0027, # APOSTROPHE + 0x0028: 0x0028, # LEFT PARENTHESIS + 0x0029: 0x0029, # RIGHT PARENTHESIS + 0x002a: 0x002a, # ASTERISK + 0x002b: 0x002b, # PLUS SIGN + 0x002c: 0x002c, # COMMA + 0x002d: 0x002d, # HYPHEN-MINUS + 0x002e: 0x002e, # FULL STOP + 0x002f: 0x002f, # SOLIDUS + 0x0030: 0x0030, # DIGIT ZERO + 0x0031: 0x0031, # DIGIT ONE + 0x0032: 0x0032, # DIGIT TWO + 0x0033: 0x0033, # DIGIT THREE + 0x0034: 0x0034, # DIGIT FOUR + 0x0035: 0x0035, # DIGIT FIVE + 0x0036: 0x0036, # DIGIT SIX + 0x0037: 0x0037, # DIGIT SEVEN + 0x0038: 0x0038, # DIGIT EIGHT + 0x0039: 0x0039, # DIGIT NINE + 0x003a: 0x003a, # COLON + 0x003b: 0x003b, # SEMICOLON + 0x003c: 0x003c, # LESS-THAN SIGN + 0x003d: 0x003d, # EQUALS SIGN + 0x003e: 0x003e, # GREATER-THAN SIGN + 0x003f: 0x003f, # QUESTION MARK + 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 + 0x005c: 0x005c, # REVERSE SOLIDUS + 0x005d: 0x005d, # RIGHT SQUARE BRACKET + 0x005e: 0x005e, # CIRCUMFLEX ACCENT + 0x005f: 0x005f, # LOW LINE + 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 + 0x007c: 0x007c, # VERTICAL LINE + 0x007d: 0x007d, # RIGHT CURLY BRACKET + 0x007e: 0x007e, # TILDE + 0x007f: 0x007f, # DELETE + 0x00a0: 0x00ff, # NO-BREAK SPACE + 0x00a4: 0x00fd, # CURRENCY SIGN + 0x00b0: 0x00f8, # DEGREE SIGN + 0x00b7: 0x00fa, # MIDDLE DOT + 0x0401: 0x00f0, # CYRILLIC CAPITAL LETTER IO + 0x0404: 0x00f2, # CYRILLIC CAPITAL LETTER UKRAINIAN IE + 0x0407: 0x00f4, # CYRILLIC CAPITAL LETTER YI + 0x040e: 0x00f6, # CYRILLIC CAPITAL LETTER SHORT U + 0x0410: 0x0080, # CYRILLIC CAPITAL LETTER A + 0x0411: 0x0081, # CYRILLIC CAPITAL LETTER BE + 0x0412: 0x0082, # CYRILLIC CAPITAL LETTER VE + 0x0413: 0x0083, # CYRILLIC CAPITAL LETTER GHE + 0x0414: 0x0084, # CYRILLIC CAPITAL LETTER DE + 0x0415: 0x0085, # CYRILLIC CAPITAL LETTER IE + 0x0416: 0x0086, # CYRILLIC CAPITAL LETTER ZHE + 0x0417: 0x0087, # CYRILLIC CAPITAL LETTER ZE + 0x0418: 0x0088, # CYRILLIC CAPITAL LETTER I + 0x0419: 0x0089, # CYRILLIC CAPITAL LETTER SHORT I + 0x041a: 0x008a, # CYRILLIC CAPITAL LETTER KA + 0x041b: 0x008b, # CYRILLIC CAPITAL LETTER EL + 0x041c: 0x008c, # CYRILLIC CAPITAL LETTER EM + 0x041d: 0x008d, # CYRILLIC CAPITAL LETTER EN + 0x041e: 0x008e, # CYRILLIC CAPITAL LETTER O + 0x041f: 0x008f, # CYRILLIC CAPITAL LETTER PE + 0x0420: 0x0090, # CYRILLIC CAPITAL LETTER ER + 0x0421: 0x0091, # CYRILLIC CAPITAL LETTER ES + 0x0422: 0x0092, # CYRILLIC CAPITAL LETTER TE + 0x0423: 0x0093, # CYRILLIC CAPITAL LETTER U + 0x0424: 0x0094, # CYRILLIC CAPITAL LETTER EF + 0x0425: 0x0095, # CYRILLIC CAPITAL LETTER HA + 0x0426: 0x0096, # CYRILLIC CAPITAL LETTER TSE + 0x0427: 0x0097, # CYRILLIC CAPITAL LETTER CHE + 0x0428: 0x0098, # CYRILLIC CAPITAL LETTER SHA + 0x0429: 0x0099, # CYRILLIC CAPITAL LETTER SHCHA + 0x042a: 0x009a, # CYRILLIC CAPITAL LETTER HARD SIGN + 0x042b: 0x009b, # CYRILLIC CAPITAL LETTER YERU + 0x042c: 0x009c, # CYRILLIC CAPITAL LETTER SOFT SIGN + 0x042d: 0x009d, # CYRILLIC CAPITAL LETTER E + 0x042e: 0x009e, # CYRILLIC CAPITAL LETTER YU + 0x042f: 0x009f, # CYRILLIC CAPITAL LETTER YA + 0x0430: 0x00a0, # CYRILLIC SMALL LETTER A + 0x0431: 0x00a1, # CYRILLIC SMALL LETTER BE + 0x0432: 0x00a2, # CYRILLIC SMALL LETTER VE + 0x0433: 0x00a3, # CYRILLIC SMALL LETTER GHE + 0x0434: 0x00a4, # CYRILLIC SMALL LETTER DE + 0x0435: 0x00a5, # CYRILLIC SMALL LETTER IE + 0x0436: 0x00a6, # CYRILLIC SMALL LETTER ZHE + 0x0437: 0x00a7, # CYRILLIC SMALL LETTER ZE + 0x0438: 0x00a8, # CYRILLIC SMALL LETTER I + 0x0439: 0x00a9, # CYRILLIC SMALL LETTER SHORT I + 0x043a: 0x00aa, # CYRILLIC SMALL LETTER KA + 0x043b: 0x00ab, # CYRILLIC SMALL LETTER EL + 0x043c: 0x00ac, # CYRILLIC SMALL LETTER EM + 0x043d: 0x00ad, # CYRILLIC SMALL LETTER EN + 0x043e: 0x00ae, # CYRILLIC SMALL LETTER O + 0x043f: 0x00af, # CYRILLIC SMALL LETTER PE + 0x0440: 0x00e0, # CYRILLIC SMALL LETTER ER + 0x0441: 0x00e1, # CYRILLIC SMALL LETTER ES + 0x0442: 0x00e2, # CYRILLIC SMALL LETTER TE + 0x0443: 0x00e3, # CYRILLIC SMALL LETTER U + 0x0444: 0x00e4, # CYRILLIC SMALL LETTER EF + 0x0445: 0x00e5, # CYRILLIC SMALL LETTER HA + 0x0446: 0x00e6, # CYRILLIC SMALL LETTER TSE + 0x0447: 0x00e7, # CYRILLIC SMALL LETTER CHE + 0x0448: 0x00e8, # CYRILLIC SMALL LETTER SHA + 0x0449: 0x00e9, # CYRILLIC SMALL LETTER SHCHA + 0x044a: 0x00ea, # CYRILLIC SMALL LETTER HARD SIGN + 0x044b: 0x00eb, # CYRILLIC SMALL LETTER YERU + 0x044c: 0x00ec, # CYRILLIC SMALL LETTER SOFT SIGN + 0x044d: 0x00ed, # CYRILLIC SMALL LETTER E + 0x044e: 0x00ee, # CYRILLIC SMALL LETTER YU + 0x044f: 0x00ef, # CYRILLIC SMALL LETTER YA + 0x0451: 0x00f1, # CYRILLIC SMALL LETTER IO + 0x0454: 0x00f3, # CYRILLIC SMALL LETTER UKRAINIAN IE + 0x0457: 0x00f5, # CYRILLIC SMALL LETTER YI + 0x045e: 0x00f7, # CYRILLIC SMALL LETTER SHORT U + 0x2116: 0x00fc, # NUMERO SIGN + 0x2219: 0x00f9, # BULLET OPERATOR + 0x221a: 0x00fb, # SQUARE ROOT + 0x2500: 0x00c4, # BOX DRAWINGS LIGHT HORIZONTAL + 0x2502: 0x00b3, # BOX DRAWINGS LIGHT VERTICAL + 0x250c: 0x00da, # BOX DRAWINGS LIGHT DOWN AND RIGHT + 0x2510: 0x00bf, # BOX DRAWINGS LIGHT DOWN AND LEFT + 0x2514: 0x00c0, # BOX DRAWINGS LIGHT UP AND RIGHT + 0x2518: 0x00d9, # BOX DRAWINGS LIGHT UP AND LEFT + 0x251c: 0x00c3, # BOX DRAWINGS LIGHT VERTICAL AND RIGHT + 0x2524: 0x00b4, # BOX DRAWINGS LIGHT VERTICAL AND LEFT + 0x252c: 0x00c2, # BOX DRAWINGS LIGHT DOWN AND HORIZONTAL + 0x2534: 0x00c1, # BOX DRAWINGS LIGHT UP AND HORIZONTAL + 0x253c: 0x00c5, # BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL + 0x2550: 0x00cd, # BOX DRAWINGS DOUBLE HORIZONTAL + 0x2551: 0x00ba, # BOX DRAWINGS DOUBLE VERTICAL + 0x2552: 0x00d5, # BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE + 0x2553: 0x00d6, # BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE + 0x2554: 0x00c9, # BOX DRAWINGS DOUBLE DOWN AND RIGHT + 0x2555: 0x00b8, # BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE + 0x2556: 0x00b7, # BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE + 0x2557: 0x00bb, # BOX DRAWINGS DOUBLE DOWN AND LEFT + 0x2558: 0x00d4, # BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE + 0x2559: 0x00d3, # BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE + 0x255a: 0x00c8, # BOX DRAWINGS DOUBLE UP AND RIGHT + 0x255b: 0x00be, # BOX DRAWINGS UP SINGLE AND LEFT DOUBLE + 0x255c: 0x00bd, # BOX DRAWINGS UP DOUBLE AND LEFT SINGLE + 0x255d: 0x00bc, # BOX DRAWINGS DOUBLE UP AND LEFT + 0x255e: 0x00c6, # BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE + 0x255f: 0x00c7, # BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE + 0x2560: 0x00cc, # BOX DRAWINGS DOUBLE VERTICAL AND RIGHT + 0x2561: 0x00b5, # BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE + 0x2562: 0x00b6, # BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE + 0x2563: 0x00b9, # BOX DRAWINGS DOUBLE VERTICAL AND LEFT + 0x2564: 0x00d1, # BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE + 0x2565: 0x00d2, # BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE + 0x2566: 0x00cb, # BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL + 0x2567: 0x00cf, # BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE + 0x2568: 0x00d0, # BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE + 0x2569: 0x00ca, # BOX DRAWINGS DOUBLE UP AND HORIZONTAL + 0x256a: 0x00d8, # BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE + 0x256b: 0x00d7, # BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE + 0x256c: 0x00ce, # BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL + 0x2580: 0x00df, # UPPER HALF BLOCK + 0x2584: 0x00dc, # LOWER HALF BLOCK + 0x2588: 0x00db, # FULL BLOCK + 0x258c: 0x00dd, # LEFT HALF BLOCK + 0x2590: 0x00de, # RIGHT HALF BLOCK + 0x2591: 0x00b0, # LIGHT SHADE + 0x2592: 0x00b1, # MEDIUM SHADE + 0x2593: 0x00b2, # DARK SHADE + 0x25a0: 0x00fe, # BLACK SQUARE +} diff --git a/env/Lib/encodings/cp869.py b/env/Lib/encodings/cp869.py new file mode 100644 index 0000000..8d8a29b --- /dev/null +++ b/env/Lib/encodings/cp869.py @@ -0,0 +1,689 @@ +""" Python Character Mapping Codec generated from 'VENDORS/MICSFT/PC/CP869.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_map) + + 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_map)[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='cp869', + 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: None, # UNDEFINED + 0x0081: None, # UNDEFINED + 0x0082: None, # UNDEFINED + 0x0083: None, # UNDEFINED + 0x0084: None, # UNDEFINED + 0x0085: None, # UNDEFINED + 0x0086: 0x0386, # GREEK CAPITAL LETTER ALPHA WITH TONOS + 0x0087: None, # UNDEFINED + 0x0088: 0x00b7, # MIDDLE DOT + 0x0089: 0x00ac, # NOT SIGN + 0x008a: 0x00a6, # BROKEN BAR + 0x008b: 0x2018, # LEFT SINGLE QUOTATION MARK + 0x008c: 0x2019, # RIGHT SINGLE QUOTATION MARK + 0x008d: 0x0388, # GREEK CAPITAL LETTER EPSILON WITH TONOS + 0x008e: 0x2015, # HORIZONTAL BAR + 0x008f: 0x0389, # GREEK CAPITAL LETTER ETA WITH TONOS + 0x0090: 0x038a, # GREEK CAPITAL LETTER IOTA WITH TONOS + 0x0091: 0x03aa, # GREEK CAPITAL LETTER IOTA WITH DIALYTIKA + 0x0092: 0x038c, # GREEK CAPITAL LETTER OMICRON WITH TONOS + 0x0093: None, # UNDEFINED + 0x0094: None, # UNDEFINED + 0x0095: 0x038e, # GREEK CAPITAL LETTER UPSILON WITH TONOS + 0x0096: 0x03ab, # GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA + 0x0097: 0x00a9, # COPYRIGHT SIGN + 0x0098: 0x038f, # GREEK CAPITAL LETTER OMEGA WITH TONOS + 0x0099: 0x00b2, # SUPERSCRIPT TWO + 0x009a: 0x00b3, # SUPERSCRIPT THREE + 0x009b: 0x03ac, # GREEK SMALL LETTER ALPHA WITH TONOS + 0x009c: 0x00a3, # POUND SIGN + 0x009d: 0x03ad, # GREEK SMALL LETTER EPSILON WITH TONOS + 0x009e: 0x03ae, # GREEK SMALL LETTER ETA WITH TONOS + 0x009f: 0x03af, # GREEK SMALL LETTER IOTA WITH TONOS + 0x00a0: 0x03ca, # GREEK SMALL LETTER IOTA WITH DIALYTIKA + 0x00a1: 0x0390, # GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS + 0x00a2: 0x03cc, # GREEK SMALL LETTER OMICRON WITH TONOS + 0x00a3: 0x03cd, # GREEK SMALL LETTER UPSILON WITH TONOS + 0x00a4: 0x0391, # GREEK CAPITAL LETTER ALPHA + 0x00a5: 0x0392, # GREEK CAPITAL LETTER BETA + 0x00a6: 0x0393, # GREEK CAPITAL LETTER GAMMA + 0x00a7: 0x0394, # GREEK CAPITAL LETTER DELTA + 0x00a8: 0x0395, # GREEK CAPITAL LETTER EPSILON + 0x00a9: 0x0396, # GREEK CAPITAL LETTER ZETA + 0x00aa: 0x0397, # GREEK CAPITAL LETTER ETA + 0x00ab: 0x00bd, # VULGAR FRACTION ONE HALF + 0x00ac: 0x0398, # GREEK CAPITAL LETTER THETA + 0x00ad: 0x0399, # GREEK CAPITAL LETTER IOTA + 0x00ae: 0x00ab, # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00af: 0x00bb, # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00b0: 0x2591, # LIGHT SHADE + 0x00b1: 0x2592, # MEDIUM SHADE + 0x00b2: 0x2593, # DARK SHADE + 0x00b3: 0x2502, # BOX DRAWINGS LIGHT VERTICAL + 0x00b4: 0x2524, # BOX DRAWINGS LIGHT VERTICAL AND LEFT + 0x00b5: 0x039a, # GREEK CAPITAL LETTER KAPPA + 0x00b6: 0x039b, # GREEK CAPITAL LETTER LAMDA + 0x00b7: 0x039c, # GREEK CAPITAL LETTER MU + 0x00b8: 0x039d, # GREEK CAPITAL LETTER NU + 0x00b9: 0x2563, # BOX DRAWINGS DOUBLE VERTICAL AND LEFT + 0x00ba: 0x2551, # BOX DRAWINGS DOUBLE VERTICAL + 0x00bb: 0x2557, # BOX DRAWINGS DOUBLE DOWN AND LEFT + 0x00bc: 0x255d, # BOX DRAWINGS DOUBLE UP AND LEFT + 0x00bd: 0x039e, # GREEK CAPITAL LETTER XI + 0x00be: 0x039f, # GREEK CAPITAL LETTER OMICRON + 0x00bf: 0x2510, # BOX DRAWINGS LIGHT DOWN AND LEFT + 0x00c0: 0x2514, # BOX DRAWINGS LIGHT UP AND RIGHT + 0x00c1: 0x2534, # BOX DRAWINGS LIGHT UP AND HORIZONTAL + 0x00c2: 0x252c, # BOX DRAWINGS LIGHT DOWN AND HORIZONTAL + 0x00c3: 0x251c, # BOX DRAWINGS LIGHT VERTICAL AND RIGHT + 0x00c4: 0x2500, # BOX DRAWINGS LIGHT HORIZONTAL + 0x00c5: 0x253c, # BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL + 0x00c6: 0x03a0, # GREEK CAPITAL LETTER PI + 0x00c7: 0x03a1, # GREEK CAPITAL LETTER RHO + 0x00c8: 0x255a, # BOX DRAWINGS DOUBLE UP AND RIGHT + 0x00c9: 0x2554, # BOX DRAWINGS DOUBLE DOWN AND RIGHT + 0x00ca: 0x2569, # BOX DRAWINGS DOUBLE UP AND HORIZONTAL + 0x00cb: 0x2566, # BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL + 0x00cc: 0x2560, # BOX DRAWINGS DOUBLE VERTICAL AND RIGHT + 0x00cd: 0x2550, # BOX DRAWINGS DOUBLE HORIZONTAL + 0x00ce: 0x256c, # BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL + 0x00cf: 0x03a3, # GREEK CAPITAL LETTER SIGMA + 0x00d0: 0x03a4, # GREEK CAPITAL LETTER TAU + 0x00d1: 0x03a5, # GREEK CAPITAL LETTER UPSILON + 0x00d2: 0x03a6, # GREEK CAPITAL LETTER PHI + 0x00d3: 0x03a7, # GREEK CAPITAL LETTER CHI + 0x00d4: 0x03a8, # GREEK CAPITAL LETTER PSI + 0x00d5: 0x03a9, # GREEK CAPITAL LETTER OMEGA + 0x00d6: 0x03b1, # GREEK SMALL LETTER ALPHA + 0x00d7: 0x03b2, # GREEK SMALL LETTER BETA + 0x00d8: 0x03b3, # GREEK SMALL LETTER GAMMA + 0x00d9: 0x2518, # BOX DRAWINGS LIGHT UP AND LEFT + 0x00da: 0x250c, # BOX DRAWINGS LIGHT DOWN AND RIGHT + 0x00db: 0x2588, # FULL BLOCK + 0x00dc: 0x2584, # LOWER HALF BLOCK + 0x00dd: 0x03b4, # GREEK SMALL LETTER DELTA + 0x00de: 0x03b5, # GREEK SMALL LETTER EPSILON + 0x00df: 0x2580, # UPPER HALF BLOCK + 0x00e0: 0x03b6, # GREEK SMALL LETTER ZETA + 0x00e1: 0x03b7, # GREEK SMALL LETTER ETA + 0x00e2: 0x03b8, # GREEK SMALL LETTER THETA + 0x00e3: 0x03b9, # GREEK SMALL LETTER IOTA + 0x00e4: 0x03ba, # GREEK SMALL LETTER KAPPA + 0x00e5: 0x03bb, # GREEK SMALL LETTER LAMDA + 0x00e6: 0x03bc, # GREEK SMALL LETTER MU + 0x00e7: 0x03bd, # GREEK SMALL LETTER NU + 0x00e8: 0x03be, # GREEK SMALL LETTER XI + 0x00e9: 0x03bf, # GREEK SMALL LETTER OMICRON + 0x00ea: 0x03c0, # GREEK SMALL LETTER PI + 0x00eb: 0x03c1, # GREEK SMALL LETTER RHO + 0x00ec: 0x03c3, # GREEK SMALL LETTER SIGMA + 0x00ed: 0x03c2, # GREEK SMALL LETTER FINAL SIGMA + 0x00ee: 0x03c4, # GREEK SMALL LETTER TAU + 0x00ef: 0x0384, # GREEK TONOS + 0x00f0: 0x00ad, # SOFT HYPHEN + 0x00f1: 0x00b1, # PLUS-MINUS SIGN + 0x00f2: 0x03c5, # GREEK SMALL LETTER UPSILON + 0x00f3: 0x03c6, # GREEK SMALL LETTER PHI + 0x00f4: 0x03c7, # GREEK SMALL LETTER CHI + 0x00f5: 0x00a7, # SECTION SIGN + 0x00f6: 0x03c8, # GREEK SMALL LETTER PSI + 0x00f7: 0x0385, # GREEK DIALYTIKA TONOS + 0x00f8: 0x00b0, # DEGREE SIGN + 0x00f9: 0x00a8, # DIAERESIS + 0x00fa: 0x03c9, # GREEK SMALL LETTER OMEGA + 0x00fb: 0x03cb, # GREEK SMALL LETTER UPSILON WITH DIALYTIKA + 0x00fc: 0x03b0, # GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS + 0x00fd: 0x03ce, # GREEK SMALL LETTER OMEGA WITH TONOS + 0x00fe: 0x25a0, # BLACK SQUARE + 0x00ff: 0x00a0, # NO-BREAK SPACE +}) + +### Decoding Table + +decoding_table = ( + '\x00' # 0x0000 -> NULL + '\x01' # 0x0001 -> START OF HEADING + '\x02' # 0x0002 -> START OF TEXT + '\x03' # 0x0003 -> END OF TEXT + '\x04' # 0x0004 -> END OF TRANSMISSION + '\x05' # 0x0005 -> ENQUIRY + '\x06' # 0x0006 -> ACKNOWLEDGE + '\x07' # 0x0007 -> BELL + '\x08' # 0x0008 -> BACKSPACE + '\t' # 0x0009 -> HORIZONTAL TABULATION + '\n' # 0x000a -> LINE FEED + '\x0b' # 0x000b -> VERTICAL TABULATION + '\x0c' # 0x000c -> FORM FEED + '\r' # 0x000d -> CARRIAGE RETURN + '\x0e' # 0x000e -> SHIFT OUT + '\x0f' # 0x000f -> SHIFT IN + '\x10' # 0x0010 -> DATA LINK ESCAPE + '\x11' # 0x0011 -> DEVICE CONTROL ONE + '\x12' # 0x0012 -> DEVICE CONTROL TWO + '\x13' # 0x0013 -> DEVICE CONTROL THREE + '\x14' # 0x0014 -> DEVICE CONTROL FOUR + '\x15' # 0x0015 -> NEGATIVE ACKNOWLEDGE + '\x16' # 0x0016 -> SYNCHRONOUS IDLE + '\x17' # 0x0017 -> END OF TRANSMISSION BLOCK + '\x18' # 0x0018 -> CANCEL + '\x19' # 0x0019 -> END OF MEDIUM + '\x1a' # 0x001a -> SUBSTITUTE + '\x1b' # 0x001b -> ESCAPE + '\x1c' # 0x001c -> FILE SEPARATOR + '\x1d' # 0x001d -> GROUP SEPARATOR + '\x1e' # 0x001e -> RECORD SEPARATOR + '\x1f' # 0x001f -> UNIT SEPARATOR + ' ' # 0x0020 -> SPACE + '!' # 0x0021 -> EXCLAMATION MARK + '"' # 0x0022 -> QUOTATION MARK + '#' # 0x0023 -> NUMBER SIGN + '$' # 0x0024 -> DOLLAR SIGN + '%' # 0x0025 -> PERCENT SIGN + '&' # 0x0026 -> AMPERSAND + "'" # 0x0027 -> APOSTROPHE + '(' # 0x0028 -> LEFT PARENTHESIS + ')' # 0x0029 -> RIGHT PARENTHESIS + '*' # 0x002a -> ASTERISK + '+' # 0x002b -> PLUS SIGN + ',' # 0x002c -> COMMA + '-' # 0x002d -> HYPHEN-MINUS + '.' # 0x002e -> FULL STOP + '/' # 0x002f -> SOLIDUS + '0' # 0x0030 -> DIGIT ZERO + '1' # 0x0031 -> DIGIT ONE + '2' # 0x0032 -> DIGIT TWO + '3' # 0x0033 -> DIGIT THREE + '4' # 0x0034 -> DIGIT FOUR + '5' # 0x0035 -> DIGIT FIVE + '6' # 0x0036 -> DIGIT SIX + '7' # 0x0037 -> DIGIT SEVEN + '8' # 0x0038 -> DIGIT EIGHT + '9' # 0x0039 -> DIGIT NINE + ':' # 0x003a -> COLON + ';' # 0x003b -> SEMICOLON + '<' # 0x003c -> LESS-THAN SIGN + '=' # 0x003d -> EQUALS SIGN + '>' # 0x003e -> GREATER-THAN SIGN + '?' # 0x003f -> QUESTION MARK + '@' # 0x0040 -> COMMERCIAL AT + 'A' # 0x0041 -> LATIN CAPITAL LETTER A + 'B' # 0x0042 -> LATIN CAPITAL LETTER B + 'C' # 0x0043 -> LATIN CAPITAL LETTER C + 'D' # 0x0044 -> LATIN CAPITAL LETTER D + 'E' # 0x0045 -> LATIN CAPITAL LETTER E + 'F' # 0x0046 -> LATIN CAPITAL LETTER F + 'G' # 0x0047 -> LATIN CAPITAL LETTER G + 'H' # 0x0048 -> LATIN CAPITAL LETTER H + 'I' # 0x0049 -> LATIN CAPITAL LETTER I + 'J' # 0x004a -> LATIN CAPITAL LETTER J + 'K' # 0x004b -> LATIN CAPITAL LETTER K + 'L' # 0x004c -> LATIN CAPITAL LETTER L + 'M' # 0x004d -> LATIN CAPITAL LETTER M + 'N' # 0x004e -> LATIN CAPITAL LETTER N + 'O' # 0x004f -> LATIN CAPITAL LETTER O + 'P' # 0x0050 -> LATIN CAPITAL LETTER P + 'Q' # 0x0051 -> LATIN CAPITAL LETTER Q + 'R' # 0x0052 -> LATIN CAPITAL LETTER R + 'S' # 0x0053 -> LATIN CAPITAL LETTER S + 'T' # 0x0054 -> LATIN CAPITAL LETTER T + 'U' # 0x0055 -> LATIN CAPITAL LETTER U + 'V' # 0x0056 -> LATIN CAPITAL LETTER V + 'W' # 0x0057 -> LATIN CAPITAL LETTER W + 'X' # 0x0058 -> LATIN CAPITAL LETTER X + 'Y' # 0x0059 -> LATIN CAPITAL LETTER Y + 'Z' # 0x005a -> LATIN CAPITAL LETTER Z + '[' # 0x005b -> LEFT SQUARE BRACKET + '\\' # 0x005c -> REVERSE SOLIDUS + ']' # 0x005d -> RIGHT SQUARE BRACKET + '^' # 0x005e -> CIRCUMFLEX ACCENT + '_' # 0x005f -> LOW LINE + '`' # 0x0060 -> GRAVE ACCENT + 'a' # 0x0061 -> LATIN SMALL LETTER A + 'b' # 0x0062 -> LATIN SMALL LETTER B + 'c' # 0x0063 -> LATIN SMALL LETTER C + 'd' # 0x0064 -> LATIN SMALL LETTER D + 'e' # 0x0065 -> LATIN SMALL LETTER E + 'f' # 0x0066 -> LATIN SMALL LETTER F + 'g' # 0x0067 -> LATIN SMALL LETTER G + 'h' # 0x0068 -> LATIN SMALL LETTER H + 'i' # 0x0069 -> LATIN SMALL LETTER I + 'j' # 0x006a -> LATIN SMALL LETTER J + 'k' # 0x006b -> LATIN SMALL LETTER K + 'l' # 0x006c -> LATIN SMALL LETTER L + 'm' # 0x006d -> LATIN SMALL LETTER M + 'n' # 0x006e -> LATIN SMALL LETTER N + 'o' # 0x006f -> LATIN SMALL LETTER O + 'p' # 0x0070 -> LATIN SMALL LETTER P + 'q' # 0x0071 -> LATIN SMALL LETTER Q + 'r' # 0x0072 -> LATIN SMALL LETTER R + 's' # 0x0073 -> LATIN SMALL LETTER S + 't' # 0x0074 -> LATIN SMALL LETTER T + 'u' # 0x0075 -> LATIN SMALL LETTER U + 'v' # 0x0076 -> LATIN SMALL LETTER V + 'w' # 0x0077 -> LATIN SMALL LETTER W + 'x' # 0x0078 -> LATIN SMALL LETTER X + 'y' # 0x0079 -> LATIN SMALL LETTER Y + 'z' # 0x007a -> LATIN SMALL LETTER Z + '{' # 0x007b -> LEFT CURLY BRACKET + '|' # 0x007c -> VERTICAL LINE + '}' # 0x007d -> RIGHT CURLY BRACKET + '~' # 0x007e -> TILDE + '\x7f' # 0x007f -> DELETE + '\ufffe' # 0x0080 -> UNDEFINED + '\ufffe' # 0x0081 -> UNDEFINED + '\ufffe' # 0x0082 -> UNDEFINED + '\ufffe' # 0x0083 -> UNDEFINED + '\ufffe' # 0x0084 -> UNDEFINED + '\ufffe' # 0x0085 -> UNDEFINED + '\u0386' # 0x0086 -> GREEK CAPITAL LETTER ALPHA WITH TONOS + '\ufffe' # 0x0087 -> UNDEFINED + '\xb7' # 0x0088 -> MIDDLE DOT + '\xac' # 0x0089 -> NOT SIGN + '\xa6' # 0x008a -> BROKEN BAR + '\u2018' # 0x008b -> LEFT SINGLE QUOTATION MARK + '\u2019' # 0x008c -> RIGHT SINGLE QUOTATION MARK + '\u0388' # 0x008d -> GREEK CAPITAL LETTER EPSILON WITH TONOS + '\u2015' # 0x008e -> HORIZONTAL BAR + '\u0389' # 0x008f -> GREEK CAPITAL LETTER ETA WITH TONOS + '\u038a' # 0x0090 -> GREEK CAPITAL LETTER IOTA WITH TONOS + '\u03aa' # 0x0091 -> GREEK CAPITAL LETTER IOTA WITH DIALYTIKA + '\u038c' # 0x0092 -> GREEK CAPITAL LETTER OMICRON WITH TONOS + '\ufffe' # 0x0093 -> UNDEFINED + '\ufffe' # 0x0094 -> UNDEFINED + '\u038e' # 0x0095 -> GREEK CAPITAL LETTER UPSILON WITH TONOS + '\u03ab' # 0x0096 -> GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA + '\xa9' # 0x0097 -> COPYRIGHT SIGN + '\u038f' # 0x0098 -> GREEK CAPITAL LETTER OMEGA WITH TONOS + '\xb2' # 0x0099 -> SUPERSCRIPT TWO + '\xb3' # 0x009a -> SUPERSCRIPT THREE + '\u03ac' # 0x009b -> GREEK SMALL LETTER ALPHA WITH TONOS + '\xa3' # 0x009c -> POUND SIGN + '\u03ad' # 0x009d -> GREEK SMALL LETTER EPSILON WITH TONOS + '\u03ae' # 0x009e -> GREEK SMALL LETTER ETA WITH TONOS + '\u03af' # 0x009f -> GREEK SMALL LETTER IOTA WITH TONOS + '\u03ca' # 0x00a0 -> GREEK SMALL LETTER IOTA WITH DIALYTIKA + '\u0390' # 0x00a1 -> GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS + '\u03cc' # 0x00a2 -> GREEK SMALL LETTER OMICRON WITH TONOS + '\u03cd' # 0x00a3 -> GREEK SMALL LETTER UPSILON WITH TONOS + '\u0391' # 0x00a4 -> GREEK CAPITAL LETTER ALPHA + '\u0392' # 0x00a5 -> GREEK CAPITAL LETTER BETA + '\u0393' # 0x00a6 -> GREEK CAPITAL LETTER GAMMA + '\u0394' # 0x00a7 -> GREEK CAPITAL LETTER DELTA + '\u0395' # 0x00a8 -> GREEK CAPITAL LETTER EPSILON + '\u0396' # 0x00a9 -> GREEK CAPITAL LETTER ZETA + '\u0397' # 0x00aa -> GREEK CAPITAL LETTER ETA + '\xbd' # 0x00ab -> VULGAR FRACTION ONE HALF + '\u0398' # 0x00ac -> GREEK CAPITAL LETTER THETA + '\u0399' # 0x00ad -> GREEK CAPITAL LETTER IOTA + '\xab' # 0x00ae -> LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + '\xbb' # 0x00af -> RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + '\u2591' # 0x00b0 -> LIGHT SHADE + '\u2592' # 0x00b1 -> MEDIUM SHADE + '\u2593' # 0x00b2 -> DARK SHADE + '\u2502' # 0x00b3 -> BOX DRAWINGS LIGHT VERTICAL + '\u2524' # 0x00b4 -> BOX DRAWINGS LIGHT VERTICAL AND LEFT + '\u039a' # 0x00b5 -> GREEK CAPITAL LETTER KAPPA + '\u039b' # 0x00b6 -> GREEK CAPITAL LETTER LAMDA + '\u039c' # 0x00b7 -> GREEK CAPITAL LETTER MU + '\u039d' # 0x00b8 -> GREEK CAPITAL LETTER NU + '\u2563' # 0x00b9 -> BOX DRAWINGS DOUBLE VERTICAL AND LEFT + '\u2551' # 0x00ba -> BOX DRAWINGS DOUBLE VERTICAL + '\u2557' # 0x00bb -> BOX DRAWINGS DOUBLE DOWN AND LEFT + '\u255d' # 0x00bc -> BOX DRAWINGS DOUBLE UP AND LEFT + '\u039e' # 0x00bd -> GREEK CAPITAL LETTER XI + '\u039f' # 0x00be -> GREEK CAPITAL LETTER OMICRON + '\u2510' # 0x00bf -> BOX DRAWINGS LIGHT DOWN AND LEFT + '\u2514' # 0x00c0 -> BOX DRAWINGS LIGHT UP AND RIGHT + '\u2534' # 0x00c1 -> BOX DRAWINGS LIGHT UP AND HORIZONTAL + '\u252c' # 0x00c2 -> BOX DRAWINGS LIGHT DOWN AND HORIZONTAL + '\u251c' # 0x00c3 -> BOX DRAWINGS LIGHT VERTICAL AND RIGHT + '\u2500' # 0x00c4 -> BOX DRAWINGS LIGHT HORIZONTAL + '\u253c' # 0x00c5 -> BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL + '\u03a0' # 0x00c6 -> GREEK CAPITAL LETTER PI + '\u03a1' # 0x00c7 -> GREEK CAPITAL LETTER RHO + '\u255a' # 0x00c8 -> BOX DRAWINGS DOUBLE UP AND RIGHT + '\u2554' # 0x00c9 -> BOX DRAWINGS DOUBLE DOWN AND RIGHT + '\u2569' # 0x00ca -> BOX DRAWINGS DOUBLE UP AND HORIZONTAL + '\u2566' # 0x00cb -> BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL + '\u2560' # 0x00cc -> BOX DRAWINGS DOUBLE VERTICAL AND RIGHT + '\u2550' # 0x00cd -> BOX DRAWINGS DOUBLE HORIZONTAL + '\u256c' # 0x00ce -> BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL + '\u03a3' # 0x00cf -> GREEK CAPITAL LETTER SIGMA + '\u03a4' # 0x00d0 -> GREEK CAPITAL LETTER TAU + '\u03a5' # 0x00d1 -> GREEK CAPITAL LETTER UPSILON + '\u03a6' # 0x00d2 -> GREEK CAPITAL LETTER PHI + '\u03a7' # 0x00d3 -> GREEK CAPITAL LETTER CHI + '\u03a8' # 0x00d4 -> GREEK CAPITAL LETTER PSI + '\u03a9' # 0x00d5 -> GREEK CAPITAL LETTER OMEGA + '\u03b1' # 0x00d6 -> GREEK SMALL LETTER ALPHA + '\u03b2' # 0x00d7 -> GREEK SMALL LETTER BETA + '\u03b3' # 0x00d8 -> GREEK SMALL LETTER GAMMA + '\u2518' # 0x00d9 -> BOX DRAWINGS LIGHT UP AND LEFT + '\u250c' # 0x00da -> BOX DRAWINGS LIGHT DOWN AND RIGHT + '\u2588' # 0x00db -> FULL BLOCK + '\u2584' # 0x00dc -> LOWER HALF BLOCK + '\u03b4' # 0x00dd -> GREEK SMALL LETTER DELTA + '\u03b5' # 0x00de -> GREEK SMALL LETTER EPSILON + '\u2580' # 0x00df -> UPPER HALF BLOCK + '\u03b6' # 0x00e0 -> GREEK SMALL LETTER ZETA + '\u03b7' # 0x00e1 -> GREEK SMALL LETTER ETA + '\u03b8' # 0x00e2 -> GREEK SMALL LETTER THETA + '\u03b9' # 0x00e3 -> GREEK SMALL LETTER IOTA + '\u03ba' # 0x00e4 -> GREEK SMALL LETTER KAPPA + '\u03bb' # 0x00e5 -> GREEK SMALL LETTER LAMDA + '\u03bc' # 0x00e6 -> GREEK SMALL LETTER MU + '\u03bd' # 0x00e7 -> GREEK SMALL LETTER NU + '\u03be' # 0x00e8 -> GREEK SMALL LETTER XI + '\u03bf' # 0x00e9 -> GREEK SMALL LETTER OMICRON + '\u03c0' # 0x00ea -> GREEK SMALL LETTER PI + '\u03c1' # 0x00eb -> GREEK SMALL LETTER RHO + '\u03c3' # 0x00ec -> GREEK SMALL LETTER SIGMA + '\u03c2' # 0x00ed -> GREEK SMALL LETTER FINAL SIGMA + '\u03c4' # 0x00ee -> GREEK SMALL LETTER TAU + '\u0384' # 0x00ef -> GREEK TONOS + '\xad' # 0x00f0 -> SOFT HYPHEN + '\xb1' # 0x00f1 -> PLUS-MINUS SIGN + '\u03c5' # 0x00f2 -> GREEK SMALL LETTER UPSILON + '\u03c6' # 0x00f3 -> GREEK SMALL LETTER PHI + '\u03c7' # 0x00f4 -> GREEK SMALL LETTER CHI + '\xa7' # 0x00f5 -> SECTION SIGN + '\u03c8' # 0x00f6 -> GREEK SMALL LETTER PSI + '\u0385' # 0x00f7 -> GREEK DIALYTIKA TONOS + '\xb0' # 0x00f8 -> DEGREE SIGN + '\xa8' # 0x00f9 -> DIAERESIS + '\u03c9' # 0x00fa -> GREEK SMALL LETTER OMEGA + '\u03cb' # 0x00fb -> GREEK SMALL LETTER UPSILON WITH DIALYTIKA + '\u03b0' # 0x00fc -> GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS + '\u03ce' # 0x00fd -> GREEK SMALL LETTER OMEGA WITH TONOS + '\u25a0' # 0x00fe -> BLACK SQUARE + '\xa0' # 0x00ff -> NO-BREAK SPACE +) + +### Encoding Map + +encoding_map = { + 0x0000: 0x0000, # NULL + 0x0001: 0x0001, # START OF HEADING + 0x0002: 0x0002, # START OF TEXT + 0x0003: 0x0003, # END OF TEXT + 0x0004: 0x0004, # END OF TRANSMISSION + 0x0005: 0x0005, # ENQUIRY + 0x0006: 0x0006, # ACKNOWLEDGE + 0x0007: 0x0007, # BELL + 0x0008: 0x0008, # BACKSPACE + 0x0009: 0x0009, # HORIZONTAL TABULATION + 0x000a: 0x000a, # LINE FEED + 0x000b: 0x000b, # VERTICAL TABULATION + 0x000c: 0x000c, # FORM FEED + 0x000d: 0x000d, # CARRIAGE RETURN + 0x000e: 0x000e, # SHIFT OUT + 0x000f: 0x000f, # SHIFT IN + 0x0010: 0x0010, # DATA LINK ESCAPE + 0x0011: 0x0011, # DEVICE CONTROL ONE + 0x0012: 0x0012, # DEVICE CONTROL TWO + 0x0013: 0x0013, # DEVICE CONTROL THREE + 0x0014: 0x0014, # DEVICE CONTROL FOUR + 0x0015: 0x0015, # NEGATIVE ACKNOWLEDGE + 0x0016: 0x0016, # SYNCHRONOUS IDLE + 0x0017: 0x0017, # END OF TRANSMISSION BLOCK + 0x0018: 0x0018, # CANCEL + 0x0019: 0x0019, # END OF MEDIUM + 0x001a: 0x001a, # SUBSTITUTE + 0x001b: 0x001b, # ESCAPE + 0x001c: 0x001c, # FILE SEPARATOR + 0x001d: 0x001d, # GROUP SEPARATOR + 0x001e: 0x001e, # RECORD SEPARATOR + 0x001f: 0x001f, # UNIT SEPARATOR + 0x0020: 0x0020, # SPACE + 0x0021: 0x0021, # EXCLAMATION MARK + 0x0022: 0x0022, # QUOTATION MARK + 0x0023: 0x0023, # NUMBER SIGN + 0x0024: 0x0024, # DOLLAR SIGN + 0x0025: 0x0025, # PERCENT SIGN + 0x0026: 0x0026, # AMPERSAND + 0x0027: 0x0027, # APOSTROPHE + 0x0028: 0x0028, # LEFT PARENTHESIS + 0x0029: 0x0029, # RIGHT PARENTHESIS + 0x002a: 0x002a, # ASTERISK + 0x002b: 0x002b, # PLUS SIGN + 0x002c: 0x002c, # COMMA + 0x002d: 0x002d, # HYPHEN-MINUS + 0x002e: 0x002e, # FULL STOP + 0x002f: 0x002f, # SOLIDUS + 0x0030: 0x0030, # DIGIT ZERO + 0x0031: 0x0031, # DIGIT ONE + 0x0032: 0x0032, # DIGIT TWO + 0x0033: 0x0033, # DIGIT THREE + 0x0034: 0x0034, # DIGIT FOUR + 0x0035: 0x0035, # DIGIT FIVE + 0x0036: 0x0036, # DIGIT SIX + 0x0037: 0x0037, # DIGIT SEVEN + 0x0038: 0x0038, # DIGIT EIGHT + 0x0039: 0x0039, # DIGIT NINE + 0x003a: 0x003a, # COLON + 0x003b: 0x003b, # SEMICOLON + 0x003c: 0x003c, # LESS-THAN SIGN + 0x003d: 0x003d, # EQUALS SIGN + 0x003e: 0x003e, # GREATER-THAN SIGN + 0x003f: 0x003f, # QUESTION MARK + 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 + 0x005c: 0x005c, # REVERSE SOLIDUS + 0x005d: 0x005d, # RIGHT SQUARE BRACKET + 0x005e: 0x005e, # CIRCUMFLEX ACCENT + 0x005f: 0x005f, # LOW LINE + 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 + 0x007c: 0x007c, # VERTICAL LINE + 0x007d: 0x007d, # RIGHT CURLY BRACKET + 0x007e: 0x007e, # TILDE + 0x007f: 0x007f, # DELETE + 0x00a0: 0x00ff, # NO-BREAK SPACE + 0x00a3: 0x009c, # POUND SIGN + 0x00a6: 0x008a, # BROKEN BAR + 0x00a7: 0x00f5, # SECTION SIGN + 0x00a8: 0x00f9, # DIAERESIS + 0x00a9: 0x0097, # COPYRIGHT SIGN + 0x00ab: 0x00ae, # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00ac: 0x0089, # NOT SIGN + 0x00ad: 0x00f0, # SOFT HYPHEN + 0x00b0: 0x00f8, # DEGREE SIGN + 0x00b1: 0x00f1, # PLUS-MINUS SIGN + 0x00b2: 0x0099, # SUPERSCRIPT TWO + 0x00b3: 0x009a, # SUPERSCRIPT THREE + 0x00b7: 0x0088, # MIDDLE DOT + 0x00bb: 0x00af, # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00bd: 0x00ab, # VULGAR FRACTION ONE HALF + 0x0384: 0x00ef, # GREEK TONOS + 0x0385: 0x00f7, # GREEK DIALYTIKA TONOS + 0x0386: 0x0086, # GREEK CAPITAL LETTER ALPHA WITH TONOS + 0x0388: 0x008d, # GREEK CAPITAL LETTER EPSILON WITH TONOS + 0x0389: 0x008f, # GREEK CAPITAL LETTER ETA WITH TONOS + 0x038a: 0x0090, # GREEK CAPITAL LETTER IOTA WITH TONOS + 0x038c: 0x0092, # GREEK CAPITAL LETTER OMICRON WITH TONOS + 0x038e: 0x0095, # GREEK CAPITAL LETTER UPSILON WITH TONOS + 0x038f: 0x0098, # GREEK CAPITAL LETTER OMEGA WITH TONOS + 0x0390: 0x00a1, # GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS + 0x0391: 0x00a4, # GREEK CAPITAL LETTER ALPHA + 0x0392: 0x00a5, # GREEK CAPITAL LETTER BETA + 0x0393: 0x00a6, # GREEK CAPITAL LETTER GAMMA + 0x0394: 0x00a7, # GREEK CAPITAL LETTER DELTA + 0x0395: 0x00a8, # GREEK CAPITAL LETTER EPSILON + 0x0396: 0x00a9, # GREEK CAPITAL LETTER ZETA + 0x0397: 0x00aa, # GREEK CAPITAL LETTER ETA + 0x0398: 0x00ac, # GREEK CAPITAL LETTER THETA + 0x0399: 0x00ad, # GREEK CAPITAL LETTER IOTA + 0x039a: 0x00b5, # GREEK CAPITAL LETTER KAPPA + 0x039b: 0x00b6, # GREEK CAPITAL LETTER LAMDA + 0x039c: 0x00b7, # GREEK CAPITAL LETTER MU + 0x039d: 0x00b8, # GREEK CAPITAL LETTER NU + 0x039e: 0x00bd, # GREEK CAPITAL LETTER XI + 0x039f: 0x00be, # GREEK CAPITAL LETTER OMICRON + 0x03a0: 0x00c6, # GREEK CAPITAL LETTER PI + 0x03a1: 0x00c7, # GREEK CAPITAL LETTER RHO + 0x03a3: 0x00cf, # GREEK CAPITAL LETTER SIGMA + 0x03a4: 0x00d0, # GREEK CAPITAL LETTER TAU + 0x03a5: 0x00d1, # GREEK CAPITAL LETTER UPSILON + 0x03a6: 0x00d2, # GREEK CAPITAL LETTER PHI + 0x03a7: 0x00d3, # GREEK CAPITAL LETTER CHI + 0x03a8: 0x00d4, # GREEK CAPITAL LETTER PSI + 0x03a9: 0x00d5, # GREEK CAPITAL LETTER OMEGA + 0x03aa: 0x0091, # GREEK CAPITAL LETTER IOTA WITH DIALYTIKA + 0x03ab: 0x0096, # GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA + 0x03ac: 0x009b, # GREEK SMALL LETTER ALPHA WITH TONOS + 0x03ad: 0x009d, # GREEK SMALL LETTER EPSILON WITH TONOS + 0x03ae: 0x009e, # GREEK SMALL LETTER ETA WITH TONOS + 0x03af: 0x009f, # GREEK SMALL LETTER IOTA WITH TONOS + 0x03b0: 0x00fc, # GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS + 0x03b1: 0x00d6, # GREEK SMALL LETTER ALPHA + 0x03b2: 0x00d7, # GREEK SMALL LETTER BETA + 0x03b3: 0x00d8, # GREEK SMALL LETTER GAMMA + 0x03b4: 0x00dd, # GREEK SMALL LETTER DELTA + 0x03b5: 0x00de, # GREEK SMALL LETTER EPSILON + 0x03b6: 0x00e0, # GREEK SMALL LETTER ZETA + 0x03b7: 0x00e1, # GREEK SMALL LETTER ETA + 0x03b8: 0x00e2, # GREEK SMALL LETTER THETA + 0x03b9: 0x00e3, # GREEK SMALL LETTER IOTA + 0x03ba: 0x00e4, # GREEK SMALL LETTER KAPPA + 0x03bb: 0x00e5, # GREEK SMALL LETTER LAMDA + 0x03bc: 0x00e6, # GREEK SMALL LETTER MU + 0x03bd: 0x00e7, # GREEK SMALL LETTER NU + 0x03be: 0x00e8, # GREEK SMALL LETTER XI + 0x03bf: 0x00e9, # GREEK SMALL LETTER OMICRON + 0x03c0: 0x00ea, # GREEK SMALL LETTER PI + 0x03c1: 0x00eb, # GREEK SMALL LETTER RHO + 0x03c2: 0x00ed, # GREEK SMALL LETTER FINAL SIGMA + 0x03c3: 0x00ec, # GREEK SMALL LETTER SIGMA + 0x03c4: 0x00ee, # GREEK SMALL LETTER TAU + 0x03c5: 0x00f2, # GREEK SMALL LETTER UPSILON + 0x03c6: 0x00f3, # GREEK SMALL LETTER PHI + 0x03c7: 0x00f4, # GREEK SMALL LETTER CHI + 0x03c8: 0x00f6, # GREEK SMALL LETTER PSI + 0x03c9: 0x00fa, # GREEK SMALL LETTER OMEGA + 0x03ca: 0x00a0, # GREEK SMALL LETTER IOTA WITH DIALYTIKA + 0x03cb: 0x00fb, # GREEK SMALL LETTER UPSILON WITH DIALYTIKA + 0x03cc: 0x00a2, # GREEK SMALL LETTER OMICRON WITH TONOS + 0x03cd: 0x00a3, # GREEK SMALL LETTER UPSILON WITH TONOS + 0x03ce: 0x00fd, # GREEK SMALL LETTER OMEGA WITH TONOS + 0x2015: 0x008e, # HORIZONTAL BAR + 0x2018: 0x008b, # LEFT SINGLE QUOTATION MARK + 0x2019: 0x008c, # RIGHT SINGLE QUOTATION MARK + 0x2500: 0x00c4, # BOX DRAWINGS LIGHT HORIZONTAL + 0x2502: 0x00b3, # BOX DRAWINGS LIGHT VERTICAL + 0x250c: 0x00da, # BOX DRAWINGS LIGHT DOWN AND RIGHT + 0x2510: 0x00bf, # BOX DRAWINGS LIGHT DOWN AND LEFT + 0x2514: 0x00c0, # BOX DRAWINGS LIGHT UP AND RIGHT + 0x2518: 0x00d9, # BOX DRAWINGS LIGHT UP AND LEFT + 0x251c: 0x00c3, # BOX DRAWINGS LIGHT VERTICAL AND RIGHT + 0x2524: 0x00b4, # BOX DRAWINGS LIGHT VERTICAL AND LEFT + 0x252c: 0x00c2, # BOX DRAWINGS LIGHT DOWN AND HORIZONTAL + 0x2534: 0x00c1, # BOX DRAWINGS LIGHT UP AND HORIZONTAL + 0x253c: 0x00c5, # BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL + 0x2550: 0x00cd, # BOX DRAWINGS DOUBLE HORIZONTAL + 0x2551: 0x00ba, # BOX DRAWINGS DOUBLE VERTICAL + 0x2554: 0x00c9, # BOX DRAWINGS DOUBLE DOWN AND RIGHT + 0x2557: 0x00bb, # BOX DRAWINGS DOUBLE DOWN AND LEFT + 0x255a: 0x00c8, # BOX DRAWINGS DOUBLE UP AND RIGHT + 0x255d: 0x00bc, # BOX DRAWINGS DOUBLE UP AND LEFT + 0x2560: 0x00cc, # BOX DRAWINGS DOUBLE VERTICAL AND RIGHT + 0x2563: 0x00b9, # BOX DRAWINGS DOUBLE VERTICAL AND LEFT + 0x2566: 0x00cb, # BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL + 0x2569: 0x00ca, # BOX DRAWINGS DOUBLE UP AND HORIZONTAL + 0x256c: 0x00ce, # BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL + 0x2580: 0x00df, # UPPER HALF BLOCK + 0x2584: 0x00dc, # LOWER HALF BLOCK + 0x2588: 0x00db, # FULL BLOCK + 0x2591: 0x00b0, # LIGHT SHADE + 0x2592: 0x00b1, # MEDIUM SHADE + 0x2593: 0x00b2, # DARK SHADE + 0x25a0: 0x00fe, # BLACK SQUARE +} diff --git a/env/Lib/encodings/cp874.py b/env/Lib/encodings/cp874.py new file mode 100644 index 0000000..59bfcbc --- /dev/null +++ b/env/Lib/encodings/cp874.py @@ -0,0 +1,307 @@ +""" Python Character Mapping Codec cp874 generated from 'MAPPINGS/VENDORS/MICSFT/WINDOWS/CP874.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='cp874', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) + + +### Decoding Table + +decoding_table = ( + '\x00' # 0x00 -> NULL + '\x01' # 0x01 -> START OF HEADING + '\x02' # 0x02 -> START OF TEXT + '\x03' # 0x03 -> END OF TEXT + '\x04' # 0x04 -> END OF TRANSMISSION + '\x05' # 0x05 -> ENQUIRY + '\x06' # 0x06 -> ACKNOWLEDGE + '\x07' # 0x07 -> BELL + '\x08' # 0x08 -> BACKSPACE + '\t' # 0x09 -> HORIZONTAL TABULATION + '\n' # 0x0A -> LINE FEED + '\x0b' # 0x0B -> VERTICAL TABULATION + '\x0c' # 0x0C -> FORM FEED + '\r' # 0x0D -> CARRIAGE RETURN + '\x0e' # 0x0E -> SHIFT OUT + '\x0f' # 0x0F -> SHIFT IN + '\x10' # 0x10 -> DATA LINK ESCAPE + '\x11' # 0x11 -> DEVICE CONTROL ONE + '\x12' # 0x12 -> DEVICE CONTROL TWO + '\x13' # 0x13 -> DEVICE CONTROL THREE + '\x14' # 0x14 -> DEVICE CONTROL FOUR + '\x15' # 0x15 -> NEGATIVE ACKNOWLEDGE + '\x16' # 0x16 -> SYNCHRONOUS IDLE + '\x17' # 0x17 -> END OF TRANSMISSION BLOCK + '\x18' # 0x18 -> CANCEL + '\x19' # 0x19 -> END OF MEDIUM + '\x1a' # 0x1A -> SUBSTITUTE + '\x1b' # 0x1B -> ESCAPE + '\x1c' # 0x1C -> FILE SEPARATOR + '\x1d' # 0x1D -> GROUP SEPARATOR + '\x1e' # 0x1E -> RECORD SEPARATOR + '\x1f' # 0x1F -> UNIT SEPARATOR + ' ' # 0x20 -> SPACE + '!' # 0x21 -> EXCLAMATION MARK + '"' # 0x22 -> QUOTATION MARK + '#' # 0x23 -> NUMBER SIGN + '$' # 0x24 -> DOLLAR SIGN + '%' # 0x25 -> PERCENT SIGN + '&' # 0x26 -> AMPERSAND + "'" # 0x27 -> APOSTROPHE + '(' # 0x28 -> LEFT PARENTHESIS + ')' # 0x29 -> RIGHT PARENTHESIS + '*' # 0x2A -> ASTERISK + '+' # 0x2B -> PLUS SIGN + ',' # 0x2C -> COMMA + '-' # 0x2D -> HYPHEN-MINUS + '.' # 0x2E -> FULL STOP + '/' # 0x2F -> SOLIDUS + '0' # 0x30 -> DIGIT ZERO + '1' # 0x31 -> DIGIT ONE + '2' # 0x32 -> DIGIT TWO + '3' # 0x33 -> DIGIT THREE + '4' # 0x34 -> DIGIT FOUR + '5' # 0x35 -> DIGIT FIVE + '6' # 0x36 -> DIGIT SIX + '7' # 0x37 -> DIGIT SEVEN + '8' # 0x38 -> DIGIT EIGHT + '9' # 0x39 -> DIGIT NINE + ':' # 0x3A -> COLON + ';' # 0x3B -> SEMICOLON + '<' # 0x3C -> LESS-THAN SIGN + '=' # 0x3D -> EQUALS SIGN + '>' # 0x3E -> GREATER-THAN SIGN + '?' # 0x3F -> QUESTION MARK + '@' # 0x40 -> COMMERCIAL AT + 'A' # 0x41 -> LATIN CAPITAL LETTER A + 'B' # 0x42 -> LATIN CAPITAL LETTER B + 'C' # 0x43 -> LATIN CAPITAL LETTER C + 'D' # 0x44 -> LATIN CAPITAL LETTER D + 'E' # 0x45 -> LATIN CAPITAL LETTER E + 'F' # 0x46 -> LATIN CAPITAL LETTER F + 'G' # 0x47 -> LATIN CAPITAL LETTER G + 'H' # 0x48 -> LATIN CAPITAL LETTER H + 'I' # 0x49 -> LATIN CAPITAL LETTER I + 'J' # 0x4A -> LATIN CAPITAL LETTER J + 'K' # 0x4B -> LATIN CAPITAL LETTER K + 'L' # 0x4C -> LATIN CAPITAL LETTER L + 'M' # 0x4D -> LATIN CAPITAL LETTER M + 'N' # 0x4E -> LATIN CAPITAL LETTER N + 'O' # 0x4F -> LATIN CAPITAL LETTER O + 'P' # 0x50 -> LATIN CAPITAL LETTER P + 'Q' # 0x51 -> LATIN CAPITAL LETTER Q + 'R' # 0x52 -> LATIN CAPITAL LETTER R + 'S' # 0x53 -> LATIN CAPITAL LETTER S + 'T' # 0x54 -> LATIN CAPITAL LETTER T + 'U' # 0x55 -> LATIN CAPITAL LETTER U + 'V' # 0x56 -> LATIN CAPITAL LETTER V + 'W' # 0x57 -> LATIN CAPITAL LETTER W + 'X' # 0x58 -> LATIN CAPITAL LETTER X + 'Y' # 0x59 -> LATIN CAPITAL LETTER Y + 'Z' # 0x5A -> LATIN CAPITAL LETTER Z + '[' # 0x5B -> LEFT SQUARE BRACKET + '\\' # 0x5C -> REVERSE SOLIDUS + ']' # 0x5D -> RIGHT SQUARE BRACKET + '^' # 0x5E -> CIRCUMFLEX ACCENT + '_' # 0x5F -> LOW LINE + '`' # 0x60 -> GRAVE ACCENT + 'a' # 0x61 -> LATIN SMALL LETTER A + 'b' # 0x62 -> LATIN SMALL LETTER B + 'c' # 0x63 -> LATIN SMALL LETTER C + 'd' # 0x64 -> LATIN SMALL LETTER D + 'e' # 0x65 -> LATIN SMALL LETTER E + 'f' # 0x66 -> LATIN SMALL LETTER F + 'g' # 0x67 -> LATIN SMALL LETTER G + 'h' # 0x68 -> LATIN SMALL LETTER H + 'i' # 0x69 -> LATIN SMALL LETTER I + 'j' # 0x6A -> LATIN SMALL LETTER J + 'k' # 0x6B -> LATIN SMALL LETTER K + 'l' # 0x6C -> LATIN SMALL LETTER L + 'm' # 0x6D -> LATIN SMALL LETTER M + 'n' # 0x6E -> LATIN SMALL LETTER N + 'o' # 0x6F -> LATIN SMALL LETTER O + 'p' # 0x70 -> LATIN SMALL LETTER P + 'q' # 0x71 -> LATIN SMALL LETTER Q + 'r' # 0x72 -> LATIN SMALL LETTER R + 's' # 0x73 -> LATIN SMALL LETTER S + 't' # 0x74 -> LATIN SMALL LETTER T + 'u' # 0x75 -> LATIN SMALL LETTER U + 'v' # 0x76 -> LATIN SMALL LETTER V + 'w' # 0x77 -> LATIN SMALL LETTER W + 'x' # 0x78 -> LATIN SMALL LETTER X + 'y' # 0x79 -> LATIN SMALL LETTER Y + 'z' # 0x7A -> LATIN SMALL LETTER Z + '{' # 0x7B -> LEFT CURLY BRACKET + '|' # 0x7C -> VERTICAL LINE + '}' # 0x7D -> RIGHT CURLY BRACKET + '~' # 0x7E -> TILDE + '\x7f' # 0x7F -> DELETE + '\u20ac' # 0x80 -> EURO SIGN + '\ufffe' # 0x81 -> UNDEFINED + '\ufffe' # 0x82 -> UNDEFINED + '\ufffe' # 0x83 -> UNDEFINED + '\ufffe' # 0x84 -> UNDEFINED + '\u2026' # 0x85 -> HORIZONTAL ELLIPSIS + '\ufffe' # 0x86 -> UNDEFINED + '\ufffe' # 0x87 -> UNDEFINED + '\ufffe' # 0x88 -> UNDEFINED + '\ufffe' # 0x89 -> UNDEFINED + '\ufffe' # 0x8A -> UNDEFINED + '\ufffe' # 0x8B -> UNDEFINED + '\ufffe' # 0x8C -> UNDEFINED + '\ufffe' # 0x8D -> UNDEFINED + '\ufffe' # 0x8E -> UNDEFINED + '\ufffe' # 0x8F -> UNDEFINED + '\ufffe' # 0x90 -> UNDEFINED + '\u2018' # 0x91 -> LEFT SINGLE QUOTATION MARK + '\u2019' # 0x92 -> RIGHT SINGLE QUOTATION MARK + '\u201c' # 0x93 -> LEFT DOUBLE QUOTATION MARK + '\u201d' # 0x94 -> RIGHT DOUBLE QUOTATION MARK + '\u2022' # 0x95 -> BULLET + '\u2013' # 0x96 -> EN DASH + '\u2014' # 0x97 -> EM DASH + '\ufffe' # 0x98 -> UNDEFINED + '\ufffe' # 0x99 -> UNDEFINED + '\ufffe' # 0x9A -> UNDEFINED + '\ufffe' # 0x9B -> UNDEFINED + '\ufffe' # 0x9C -> UNDEFINED + '\ufffe' # 0x9D -> UNDEFINED + '\ufffe' # 0x9E -> UNDEFINED + '\ufffe' # 0x9F -> UNDEFINED + '\xa0' # 0xA0 -> NO-BREAK SPACE + '\u0e01' # 0xA1 -> THAI CHARACTER KO KAI + '\u0e02' # 0xA2 -> THAI CHARACTER KHO KHAI + '\u0e03' # 0xA3 -> THAI CHARACTER KHO KHUAT + '\u0e04' # 0xA4 -> THAI CHARACTER KHO KHWAI + '\u0e05' # 0xA5 -> THAI CHARACTER KHO KHON + '\u0e06' # 0xA6 -> THAI CHARACTER KHO RAKHANG + '\u0e07' # 0xA7 -> THAI CHARACTER NGO NGU + '\u0e08' # 0xA8 -> THAI CHARACTER CHO CHAN + '\u0e09' # 0xA9 -> THAI CHARACTER CHO CHING + '\u0e0a' # 0xAA -> THAI CHARACTER CHO CHANG + '\u0e0b' # 0xAB -> THAI CHARACTER SO SO + '\u0e0c' # 0xAC -> THAI CHARACTER CHO CHOE + '\u0e0d' # 0xAD -> THAI CHARACTER YO YING + '\u0e0e' # 0xAE -> THAI CHARACTER DO CHADA + '\u0e0f' # 0xAF -> THAI CHARACTER TO PATAK + '\u0e10' # 0xB0 -> THAI CHARACTER THO THAN + '\u0e11' # 0xB1 -> THAI CHARACTER THO NANGMONTHO + '\u0e12' # 0xB2 -> THAI CHARACTER THO PHUTHAO + '\u0e13' # 0xB3 -> THAI CHARACTER NO NEN + '\u0e14' # 0xB4 -> THAI CHARACTER DO DEK + '\u0e15' # 0xB5 -> THAI CHARACTER TO TAO + '\u0e16' # 0xB6 -> THAI CHARACTER THO THUNG + '\u0e17' # 0xB7 -> THAI CHARACTER THO THAHAN + '\u0e18' # 0xB8 -> THAI CHARACTER THO THONG + '\u0e19' # 0xB9 -> THAI CHARACTER NO NU + '\u0e1a' # 0xBA -> THAI CHARACTER BO BAIMAI + '\u0e1b' # 0xBB -> THAI CHARACTER PO PLA + '\u0e1c' # 0xBC -> THAI CHARACTER PHO PHUNG + '\u0e1d' # 0xBD -> THAI CHARACTER FO FA + '\u0e1e' # 0xBE -> THAI CHARACTER PHO PHAN + '\u0e1f' # 0xBF -> THAI CHARACTER FO FAN + '\u0e20' # 0xC0 -> THAI CHARACTER PHO SAMPHAO + '\u0e21' # 0xC1 -> THAI CHARACTER MO MA + '\u0e22' # 0xC2 -> THAI CHARACTER YO YAK + '\u0e23' # 0xC3 -> THAI CHARACTER RO RUA + '\u0e24' # 0xC4 -> THAI CHARACTER RU + '\u0e25' # 0xC5 -> THAI CHARACTER LO LING + '\u0e26' # 0xC6 -> THAI CHARACTER LU + '\u0e27' # 0xC7 -> THAI CHARACTER WO WAEN + '\u0e28' # 0xC8 -> THAI CHARACTER SO SALA + '\u0e29' # 0xC9 -> THAI CHARACTER SO RUSI + '\u0e2a' # 0xCA -> THAI CHARACTER SO SUA + '\u0e2b' # 0xCB -> THAI CHARACTER HO HIP + '\u0e2c' # 0xCC -> THAI CHARACTER LO CHULA + '\u0e2d' # 0xCD -> THAI CHARACTER O ANG + '\u0e2e' # 0xCE -> THAI CHARACTER HO NOKHUK + '\u0e2f' # 0xCF -> THAI CHARACTER PAIYANNOI + '\u0e30' # 0xD0 -> THAI CHARACTER SARA A + '\u0e31' # 0xD1 -> THAI CHARACTER MAI HAN-AKAT + '\u0e32' # 0xD2 -> THAI CHARACTER SARA AA + '\u0e33' # 0xD3 -> THAI CHARACTER SARA AM + '\u0e34' # 0xD4 -> THAI CHARACTER SARA I + '\u0e35' # 0xD5 -> THAI CHARACTER SARA II + '\u0e36' # 0xD6 -> THAI CHARACTER SARA UE + '\u0e37' # 0xD7 -> THAI CHARACTER SARA UEE + '\u0e38' # 0xD8 -> THAI CHARACTER SARA U + '\u0e39' # 0xD9 -> THAI CHARACTER SARA UU + '\u0e3a' # 0xDA -> THAI CHARACTER PHINTHU + '\ufffe' # 0xDB -> UNDEFINED + '\ufffe' # 0xDC -> UNDEFINED + '\ufffe' # 0xDD -> UNDEFINED + '\ufffe' # 0xDE -> UNDEFINED + '\u0e3f' # 0xDF -> THAI CURRENCY SYMBOL BAHT + '\u0e40' # 0xE0 -> THAI CHARACTER SARA E + '\u0e41' # 0xE1 -> THAI CHARACTER SARA AE + '\u0e42' # 0xE2 -> THAI CHARACTER SARA O + '\u0e43' # 0xE3 -> THAI CHARACTER SARA AI MAIMUAN + '\u0e44' # 0xE4 -> THAI CHARACTER SARA AI MAIMALAI + '\u0e45' # 0xE5 -> THAI CHARACTER LAKKHANGYAO + '\u0e46' # 0xE6 -> THAI CHARACTER MAIYAMOK + '\u0e47' # 0xE7 -> THAI CHARACTER MAITAIKHU + '\u0e48' # 0xE8 -> THAI CHARACTER MAI EK + '\u0e49' # 0xE9 -> THAI CHARACTER MAI THO + '\u0e4a' # 0xEA -> THAI CHARACTER MAI TRI + '\u0e4b' # 0xEB -> THAI CHARACTER MAI CHATTAWA + '\u0e4c' # 0xEC -> THAI CHARACTER THANTHAKHAT + '\u0e4d' # 0xED -> THAI CHARACTER NIKHAHIT + '\u0e4e' # 0xEE -> THAI CHARACTER YAMAKKAN + '\u0e4f' # 0xEF -> THAI CHARACTER FONGMAN + '\u0e50' # 0xF0 -> THAI DIGIT ZERO + '\u0e51' # 0xF1 -> THAI DIGIT ONE + '\u0e52' # 0xF2 -> THAI DIGIT TWO + '\u0e53' # 0xF3 -> THAI DIGIT THREE + '\u0e54' # 0xF4 -> THAI DIGIT FOUR + '\u0e55' # 0xF5 -> THAI DIGIT FIVE + '\u0e56' # 0xF6 -> THAI DIGIT SIX + '\u0e57' # 0xF7 -> THAI DIGIT SEVEN + '\u0e58' # 0xF8 -> THAI DIGIT EIGHT + '\u0e59' # 0xF9 -> THAI DIGIT NINE + '\u0e5a' # 0xFA -> THAI CHARACTER ANGKHANKHU + '\u0e5b' # 0xFB -> THAI CHARACTER KHOMUT + '\ufffe' # 0xFC -> UNDEFINED + '\ufffe' # 0xFD -> UNDEFINED + '\ufffe' # 0xFE -> UNDEFINED + '\ufffe' # 0xFF -> UNDEFINED +) + +### Encoding table +encoding_table=codecs.charmap_build(decoding_table) diff --git a/env/Lib/encodings/cp875.py b/env/Lib/encodings/cp875.py new file mode 100644 index 0000000..c25a5a4 --- /dev/null +++ b/env/Lib/encodings/cp875.py @@ -0,0 +1,307 @@ +""" Python Character Mapping Codec cp875 generated from 'MAPPINGS/VENDORS/MICSFT/EBCDIC/CP875.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='cp875', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) + + +### Decoding Table + +decoding_table = ( + '\x00' # 0x00 -> NULL + '\x01' # 0x01 -> START OF HEADING + '\x02' # 0x02 -> START OF TEXT + '\x03' # 0x03 -> END OF TEXT + '\x9c' # 0x04 -> CONTROL + '\t' # 0x05 -> HORIZONTAL TABULATION + '\x86' # 0x06 -> CONTROL + '\x7f' # 0x07 -> DELETE + '\x97' # 0x08 -> CONTROL + '\x8d' # 0x09 -> CONTROL + '\x8e' # 0x0A -> CONTROL + '\x0b' # 0x0B -> VERTICAL TABULATION + '\x0c' # 0x0C -> FORM FEED + '\r' # 0x0D -> CARRIAGE RETURN + '\x0e' # 0x0E -> SHIFT OUT + '\x0f' # 0x0F -> SHIFT IN + '\x10' # 0x10 -> DATA LINK ESCAPE + '\x11' # 0x11 -> DEVICE CONTROL ONE + '\x12' # 0x12 -> DEVICE CONTROL TWO + '\x13' # 0x13 -> DEVICE CONTROL THREE + '\x9d' # 0x14 -> CONTROL + '\x85' # 0x15 -> CONTROL + '\x08' # 0x16 -> BACKSPACE + '\x87' # 0x17 -> CONTROL + '\x18' # 0x18 -> CANCEL + '\x19' # 0x19 -> END OF MEDIUM + '\x92' # 0x1A -> CONTROL + '\x8f' # 0x1B -> CONTROL + '\x1c' # 0x1C -> FILE SEPARATOR + '\x1d' # 0x1D -> GROUP SEPARATOR + '\x1e' # 0x1E -> RECORD SEPARATOR + '\x1f' # 0x1F -> UNIT SEPARATOR + '\x80' # 0x20 -> CONTROL + '\x81' # 0x21 -> CONTROL + '\x82' # 0x22 -> CONTROL + '\x83' # 0x23 -> CONTROL + '\x84' # 0x24 -> CONTROL + '\n' # 0x25 -> LINE FEED + '\x17' # 0x26 -> END OF TRANSMISSION BLOCK + '\x1b' # 0x27 -> ESCAPE + '\x88' # 0x28 -> CONTROL + '\x89' # 0x29 -> CONTROL + '\x8a' # 0x2A -> CONTROL + '\x8b' # 0x2B -> CONTROL + '\x8c' # 0x2C -> CONTROL + '\x05' # 0x2D -> ENQUIRY + '\x06' # 0x2E -> ACKNOWLEDGE + '\x07' # 0x2F -> BELL + '\x90' # 0x30 -> CONTROL + '\x91' # 0x31 -> CONTROL + '\x16' # 0x32 -> SYNCHRONOUS IDLE + '\x93' # 0x33 -> CONTROL + '\x94' # 0x34 -> CONTROL + '\x95' # 0x35 -> CONTROL + '\x96' # 0x36 -> CONTROL + '\x04' # 0x37 -> END OF TRANSMISSION + '\x98' # 0x38 -> CONTROL + '\x99' # 0x39 -> CONTROL + '\x9a' # 0x3A -> CONTROL + '\x9b' # 0x3B -> CONTROL + '\x14' # 0x3C -> DEVICE CONTROL FOUR + '\x15' # 0x3D -> NEGATIVE ACKNOWLEDGE + '\x9e' # 0x3E -> CONTROL + '\x1a' # 0x3F -> SUBSTITUTE + ' ' # 0x40 -> SPACE + '\u0391' # 0x41 -> GREEK CAPITAL LETTER ALPHA + '\u0392' # 0x42 -> GREEK CAPITAL LETTER BETA + '\u0393' # 0x43 -> GREEK CAPITAL LETTER GAMMA + '\u0394' # 0x44 -> GREEK CAPITAL LETTER DELTA + '\u0395' # 0x45 -> GREEK CAPITAL LETTER EPSILON + '\u0396' # 0x46 -> GREEK CAPITAL LETTER ZETA + '\u0397' # 0x47 -> GREEK CAPITAL LETTER ETA + '\u0398' # 0x48 -> GREEK CAPITAL LETTER THETA + '\u0399' # 0x49 -> GREEK CAPITAL LETTER IOTA + '[' # 0x4A -> LEFT SQUARE BRACKET + '.' # 0x4B -> FULL STOP + '<' # 0x4C -> LESS-THAN SIGN + '(' # 0x4D -> LEFT PARENTHESIS + '+' # 0x4E -> PLUS SIGN + '!' # 0x4F -> EXCLAMATION MARK + '&' # 0x50 -> AMPERSAND + '\u039a' # 0x51 -> GREEK CAPITAL LETTER KAPPA + '\u039b' # 0x52 -> GREEK CAPITAL LETTER LAMDA + '\u039c' # 0x53 -> GREEK CAPITAL LETTER MU + '\u039d' # 0x54 -> GREEK CAPITAL LETTER NU + '\u039e' # 0x55 -> GREEK CAPITAL LETTER XI + '\u039f' # 0x56 -> GREEK CAPITAL LETTER OMICRON + '\u03a0' # 0x57 -> GREEK CAPITAL LETTER PI + '\u03a1' # 0x58 -> GREEK CAPITAL LETTER RHO + '\u03a3' # 0x59 -> GREEK CAPITAL LETTER SIGMA + ']' # 0x5A -> RIGHT SQUARE BRACKET + '$' # 0x5B -> DOLLAR SIGN + '*' # 0x5C -> ASTERISK + ')' # 0x5D -> RIGHT PARENTHESIS + ';' # 0x5E -> SEMICOLON + '^' # 0x5F -> CIRCUMFLEX ACCENT + '-' # 0x60 -> HYPHEN-MINUS + '/' # 0x61 -> SOLIDUS + '\u03a4' # 0x62 -> GREEK CAPITAL LETTER TAU + '\u03a5' # 0x63 -> GREEK CAPITAL LETTER UPSILON + '\u03a6' # 0x64 -> GREEK CAPITAL LETTER PHI + '\u03a7' # 0x65 -> GREEK CAPITAL LETTER CHI + '\u03a8' # 0x66 -> GREEK CAPITAL LETTER PSI + '\u03a9' # 0x67 -> GREEK CAPITAL LETTER OMEGA + '\u03aa' # 0x68 -> GREEK CAPITAL LETTER IOTA WITH DIALYTIKA + '\u03ab' # 0x69 -> GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA + '|' # 0x6A -> VERTICAL LINE + ',' # 0x6B -> COMMA + '%' # 0x6C -> PERCENT SIGN + '_' # 0x6D -> LOW LINE + '>' # 0x6E -> GREATER-THAN SIGN + '?' # 0x6F -> QUESTION MARK + '\xa8' # 0x70 -> DIAERESIS + '\u0386' # 0x71 -> GREEK CAPITAL LETTER ALPHA WITH TONOS + '\u0388' # 0x72 -> GREEK CAPITAL LETTER EPSILON WITH TONOS + '\u0389' # 0x73 -> GREEK CAPITAL LETTER ETA WITH TONOS + '\xa0' # 0x74 -> NO-BREAK SPACE + '\u038a' # 0x75 -> GREEK CAPITAL LETTER IOTA WITH TONOS + '\u038c' # 0x76 -> GREEK CAPITAL LETTER OMICRON WITH TONOS + '\u038e' # 0x77 -> GREEK CAPITAL LETTER UPSILON WITH TONOS + '\u038f' # 0x78 -> GREEK CAPITAL LETTER OMEGA WITH TONOS + '`' # 0x79 -> GRAVE ACCENT + ':' # 0x7A -> COLON + '#' # 0x7B -> NUMBER SIGN + '@' # 0x7C -> COMMERCIAL AT + "'" # 0x7D -> APOSTROPHE + '=' # 0x7E -> EQUALS SIGN + '"' # 0x7F -> QUOTATION MARK + '\u0385' # 0x80 -> GREEK DIALYTIKA TONOS + 'a' # 0x81 -> LATIN SMALL LETTER A + 'b' # 0x82 -> LATIN SMALL LETTER B + 'c' # 0x83 -> LATIN SMALL LETTER C + 'd' # 0x84 -> LATIN SMALL LETTER D + 'e' # 0x85 -> LATIN SMALL LETTER E + 'f' # 0x86 -> LATIN SMALL LETTER F + 'g' # 0x87 -> LATIN SMALL LETTER G + 'h' # 0x88 -> LATIN SMALL LETTER H + 'i' # 0x89 -> LATIN SMALL LETTER I + '\u03b1' # 0x8A -> GREEK SMALL LETTER ALPHA + '\u03b2' # 0x8B -> GREEK SMALL LETTER BETA + '\u03b3' # 0x8C -> GREEK SMALL LETTER GAMMA + '\u03b4' # 0x8D -> GREEK SMALL LETTER DELTA + '\u03b5' # 0x8E -> GREEK SMALL LETTER EPSILON + '\u03b6' # 0x8F -> GREEK SMALL LETTER ZETA + '\xb0' # 0x90 -> DEGREE SIGN + 'j' # 0x91 -> LATIN SMALL LETTER J + 'k' # 0x92 -> LATIN SMALL LETTER K + 'l' # 0x93 -> LATIN SMALL LETTER L + 'm' # 0x94 -> LATIN SMALL LETTER M + 'n' # 0x95 -> LATIN SMALL LETTER N + 'o' # 0x96 -> LATIN SMALL LETTER O + 'p' # 0x97 -> LATIN SMALL LETTER P + 'q' # 0x98 -> LATIN SMALL LETTER Q + 'r' # 0x99 -> LATIN SMALL LETTER R + '\u03b7' # 0x9A -> GREEK SMALL LETTER ETA + '\u03b8' # 0x9B -> GREEK SMALL LETTER THETA + '\u03b9' # 0x9C -> GREEK SMALL LETTER IOTA + '\u03ba' # 0x9D -> GREEK SMALL LETTER KAPPA + '\u03bb' # 0x9E -> GREEK SMALL LETTER LAMDA + '\u03bc' # 0x9F -> GREEK SMALL LETTER MU + '\xb4' # 0xA0 -> ACUTE ACCENT + '~' # 0xA1 -> TILDE + 's' # 0xA2 -> LATIN SMALL LETTER S + 't' # 0xA3 -> LATIN SMALL LETTER T + 'u' # 0xA4 -> LATIN SMALL LETTER U + 'v' # 0xA5 -> LATIN SMALL LETTER V + 'w' # 0xA6 -> LATIN SMALL LETTER W + 'x' # 0xA7 -> LATIN SMALL LETTER X + 'y' # 0xA8 -> LATIN SMALL LETTER Y + 'z' # 0xA9 -> LATIN SMALL LETTER Z + '\u03bd' # 0xAA -> GREEK SMALL LETTER NU + '\u03be' # 0xAB -> GREEK SMALL LETTER XI + '\u03bf' # 0xAC -> GREEK SMALL LETTER OMICRON + '\u03c0' # 0xAD -> GREEK SMALL LETTER PI + '\u03c1' # 0xAE -> GREEK SMALL LETTER RHO + '\u03c3' # 0xAF -> GREEK SMALL LETTER SIGMA + '\xa3' # 0xB0 -> POUND SIGN + '\u03ac' # 0xB1 -> GREEK SMALL LETTER ALPHA WITH TONOS + '\u03ad' # 0xB2 -> GREEK SMALL LETTER EPSILON WITH TONOS + '\u03ae' # 0xB3 -> GREEK SMALL LETTER ETA WITH TONOS + '\u03ca' # 0xB4 -> GREEK SMALL LETTER IOTA WITH DIALYTIKA + '\u03af' # 0xB5 -> GREEK SMALL LETTER IOTA WITH TONOS + '\u03cc' # 0xB6 -> GREEK SMALL LETTER OMICRON WITH TONOS + '\u03cd' # 0xB7 -> GREEK SMALL LETTER UPSILON WITH TONOS + '\u03cb' # 0xB8 -> GREEK SMALL LETTER UPSILON WITH DIALYTIKA + '\u03ce' # 0xB9 -> GREEK SMALL LETTER OMEGA WITH TONOS + '\u03c2' # 0xBA -> GREEK SMALL LETTER FINAL SIGMA + '\u03c4' # 0xBB -> GREEK SMALL LETTER TAU + '\u03c5' # 0xBC -> GREEK SMALL LETTER UPSILON + '\u03c6' # 0xBD -> GREEK SMALL LETTER PHI + '\u03c7' # 0xBE -> GREEK SMALL LETTER CHI + '\u03c8' # 0xBF -> GREEK SMALL LETTER PSI + '{' # 0xC0 -> LEFT CURLY BRACKET + 'A' # 0xC1 -> LATIN CAPITAL LETTER A + 'B' # 0xC2 -> LATIN CAPITAL LETTER B + 'C' # 0xC3 -> LATIN CAPITAL LETTER C + 'D' # 0xC4 -> LATIN CAPITAL LETTER D + 'E' # 0xC5 -> LATIN CAPITAL LETTER E + 'F' # 0xC6 -> LATIN CAPITAL LETTER F + 'G' # 0xC7 -> LATIN CAPITAL LETTER G + 'H' # 0xC8 -> LATIN CAPITAL LETTER H + 'I' # 0xC9 -> LATIN CAPITAL LETTER I + '\xad' # 0xCA -> SOFT HYPHEN + '\u03c9' # 0xCB -> GREEK SMALL LETTER OMEGA + '\u0390' # 0xCC -> GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS + '\u03b0' # 0xCD -> GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS + '\u2018' # 0xCE -> LEFT SINGLE QUOTATION MARK + '\u2015' # 0xCF -> HORIZONTAL BAR + '}' # 0xD0 -> RIGHT CURLY BRACKET + 'J' # 0xD1 -> LATIN CAPITAL LETTER J + 'K' # 0xD2 -> LATIN CAPITAL LETTER K + 'L' # 0xD3 -> LATIN CAPITAL LETTER L + 'M' # 0xD4 -> LATIN CAPITAL LETTER M + 'N' # 0xD5 -> LATIN CAPITAL LETTER N + 'O' # 0xD6 -> LATIN CAPITAL LETTER O + 'P' # 0xD7 -> LATIN CAPITAL LETTER P + 'Q' # 0xD8 -> LATIN CAPITAL LETTER Q + 'R' # 0xD9 -> LATIN CAPITAL LETTER R + '\xb1' # 0xDA -> PLUS-MINUS SIGN + '\xbd' # 0xDB -> VULGAR FRACTION ONE HALF + '\x1a' # 0xDC -> SUBSTITUTE + '\u0387' # 0xDD -> GREEK ANO TELEIA + '\u2019' # 0xDE -> RIGHT SINGLE QUOTATION MARK + '\xa6' # 0xDF -> BROKEN BAR + '\\' # 0xE0 -> REVERSE SOLIDUS + '\x1a' # 0xE1 -> SUBSTITUTE + 'S' # 0xE2 -> LATIN CAPITAL LETTER S + 'T' # 0xE3 -> LATIN CAPITAL LETTER T + 'U' # 0xE4 -> LATIN CAPITAL LETTER U + 'V' # 0xE5 -> LATIN CAPITAL LETTER V + 'W' # 0xE6 -> LATIN CAPITAL LETTER W + 'X' # 0xE7 -> LATIN CAPITAL LETTER X + 'Y' # 0xE8 -> LATIN CAPITAL LETTER Y + 'Z' # 0xE9 -> LATIN CAPITAL LETTER Z + '\xb2' # 0xEA -> SUPERSCRIPT TWO + '\xa7' # 0xEB -> SECTION SIGN + '\x1a' # 0xEC -> SUBSTITUTE + '\x1a' # 0xED -> SUBSTITUTE + '\xab' # 0xEE -> LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + '\xac' # 0xEF -> NOT SIGN + '0' # 0xF0 -> DIGIT ZERO + '1' # 0xF1 -> DIGIT ONE + '2' # 0xF2 -> DIGIT TWO + '3' # 0xF3 -> DIGIT THREE + '4' # 0xF4 -> DIGIT FOUR + '5' # 0xF5 -> DIGIT FIVE + '6' # 0xF6 -> DIGIT SIX + '7' # 0xF7 -> DIGIT SEVEN + '8' # 0xF8 -> DIGIT EIGHT + '9' # 0xF9 -> DIGIT NINE + '\xb3' # 0xFA -> SUPERSCRIPT THREE + '\xa9' # 0xFB -> COPYRIGHT SIGN + '\x1a' # 0xFC -> SUBSTITUTE + '\x1a' # 0xFD -> SUBSTITUTE + '\xbb' # 0xFE -> RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + '\x9f' # 0xFF -> CONTROL +) + +### Encoding table +encoding_table=codecs.charmap_build(decoding_table) diff --git a/env/Lib/encodings/cp932.py b/env/Lib/encodings/cp932.py new file mode 100644 index 0000000..e01f59b --- /dev/null +++ b/env/Lib/encodings/cp932.py @@ -0,0 +1,39 @@ +# +# cp932.py: Python Unicode Codec for CP932 +# +# Written by Hye-Shik Chang +# + +import _codecs_jp, codecs +import _multibytecodec as mbc + +codec = _codecs_jp.getcodec('cp932') + +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='cp932', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) diff --git a/env/Lib/encodings/cp949.py b/env/Lib/encodings/cp949.py new file mode 100644 index 0000000..627c871 --- /dev/null +++ b/env/Lib/encodings/cp949.py @@ -0,0 +1,39 @@ +# +# cp949.py: Python Unicode Codec for CP949 +# +# Written by Hye-Shik Chang +# + +import _codecs_kr, codecs +import _multibytecodec as mbc + +codec = _codecs_kr.getcodec('cp949') + +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='cp949', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) diff --git a/env/Lib/encodings/cp950.py b/env/Lib/encodings/cp950.py new file mode 100644 index 0000000..39eec5e --- /dev/null +++ b/env/Lib/encodings/cp950.py @@ -0,0 +1,39 @@ +# +# cp950.py: Python Unicode Codec for CP950 +# +# Written by Hye-Shik Chang +# + +import _codecs_tw, codecs +import _multibytecodec as mbc + +codec = _codecs_tw.getcodec('cp950') + +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='cp950', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) diff --git a/env/Lib/encodings/euc_jis_2004.py b/env/Lib/encodings/euc_jis_2004.py new file mode 100644 index 0000000..72b87ae --- /dev/null +++ b/env/Lib/encodings/euc_jis_2004.py @@ -0,0 +1,39 @@ +# +# euc_jis_2004.py: Python Unicode Codec for EUC_JIS_2004 +# +# Written by Hye-Shik Chang +# + +import _codecs_jp, codecs +import _multibytecodec as mbc + +codec = _codecs_jp.getcodec('euc_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='euc_jis_2004', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) diff --git a/env/Lib/encodings/euc_jisx0213.py b/env/Lib/encodings/euc_jisx0213.py new file mode 100644 index 0000000..cc47d04 --- /dev/null +++ b/env/Lib/encodings/euc_jisx0213.py @@ -0,0 +1,39 @@ +# +# euc_jisx0213.py: Python Unicode Codec for EUC_JISX0213 +# +# Written by Hye-Shik Chang +# + +import _codecs_jp, codecs +import _multibytecodec as mbc + +codec = _codecs_jp.getcodec('euc_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='euc_jisx0213', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) diff --git a/env/Lib/encodings/euc_jp.py b/env/Lib/encodings/euc_jp.py new file mode 100644 index 0000000..7bcbe41 --- /dev/null +++ b/env/Lib/encodings/euc_jp.py @@ -0,0 +1,39 @@ +# +# euc_jp.py: Python Unicode Codec for EUC_JP +# +# Written by Hye-Shik Chang +# + +import _codecs_jp, codecs +import _multibytecodec as mbc + +codec = _codecs_jp.getcodec('euc_jp') + +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='euc_jp', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) diff --git a/env/Lib/encodings/euc_kr.py b/env/Lib/encodings/euc_kr.py new file mode 100644 index 0000000..c1fb126 --- /dev/null +++ b/env/Lib/encodings/euc_kr.py @@ -0,0 +1,39 @@ +# +# euc_kr.py: Python Unicode Codec for EUC_KR +# +# Written by Hye-Shik Chang +# + +import _codecs_kr, codecs +import _multibytecodec as mbc + +codec = _codecs_kr.getcodec('euc_kr') + +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='euc_kr', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) diff --git a/env/Lib/encodings/gb18030.py b/env/Lib/encodings/gb18030.py new file mode 100644 index 0000000..34fb6c3 --- /dev/null +++ b/env/Lib/encodings/gb18030.py @@ -0,0 +1,39 @@ +# +# gb18030.py: Python Unicode Codec for GB18030 +# +# Written by Hye-Shik Chang +# + +import _codecs_cn, codecs +import _multibytecodec as mbc + +codec = _codecs_cn.getcodec('gb18030') + +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='gb18030', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) diff --git a/env/Lib/encodings/gb2312.py b/env/Lib/encodings/gb2312.py new file mode 100644 index 0000000..3c3b837 --- /dev/null +++ b/env/Lib/encodings/gb2312.py @@ -0,0 +1,39 @@ +# +# gb2312.py: Python Unicode Codec for GB2312 +# +# Written by Hye-Shik Chang +# + +import _codecs_cn, codecs +import _multibytecodec as mbc + +codec = _codecs_cn.getcodec('gb2312') + +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='gb2312', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) diff --git a/env/Lib/encodings/gbk.py b/env/Lib/encodings/gbk.py new file mode 100644 index 0000000..1b45db8 --- /dev/null +++ b/env/Lib/encodings/gbk.py @@ -0,0 +1,39 @@ +# +# gbk.py: Python Unicode Codec for GBK +# +# Written by Hye-Shik Chang +# + +import _codecs_cn, codecs +import _multibytecodec as mbc + +codec = _codecs_cn.getcodec('gbk') + +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='gbk', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) diff --git a/env/Lib/encodings/hex_codec.py b/env/Lib/encodings/hex_codec.py new file mode 100644 index 0000000..9fb1072 --- /dev/null +++ b/env/Lib/encodings/hex_codec.py @@ -0,0 +1,55 @@ +"""Python 'hex_codec' Codec - 2-digit hex content transfer encoding. + +This codec de/encodes from bytes to bytes. + +Written by Marc-Andre Lemburg (mal@lemburg.com). +""" + +import codecs +import binascii + +### Codec APIs + +def hex_encode(input, errors='strict'): + assert errors == 'strict' + return (binascii.b2a_hex(input), len(input)) + +def hex_decode(input, errors='strict'): + assert errors == 'strict' + return (binascii.a2b_hex(input), len(input)) + +class Codec(codecs.Codec): + def encode(self, input, errors='strict'): + return hex_encode(input, errors) + def decode(self, input, errors='strict'): + return hex_decode(input, errors) + +class IncrementalEncoder(codecs.IncrementalEncoder): + def encode(self, input, final=False): + assert self.errors == 'strict' + return binascii.b2a_hex(input) + +class IncrementalDecoder(codecs.IncrementalDecoder): + def decode(self, input, final=False): + assert self.errors == 'strict' + return binascii.a2b_hex(input) + +class StreamWriter(Codec, codecs.StreamWriter): + charbuffertype = bytes + +class StreamReader(Codec, codecs.StreamReader): + charbuffertype = bytes + +### encodings module API + +def getregentry(): + return codecs.CodecInfo( + name='hex', + encode=hex_encode, + decode=hex_decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamwriter=StreamWriter, + streamreader=StreamReader, + _is_text_encoding=False, + ) diff --git a/env/Lib/encodings/hp_roman8.py b/env/Lib/encodings/hp_roman8.py new file mode 100644 index 0000000..58de103 --- /dev/null +++ b/env/Lib/encodings/hp_roman8.py @@ -0,0 +1,314 @@ +""" Python Character Mapping Codec generated from 'hp_roman8.txt' with gencodec.py. + + Based on data from ftp://dkuug.dk/i18n/charmaps/HP-ROMAN8 (Keld Simonsen) + + Original source: LaserJet IIP Printer User's Manual HP part no + 33471-90901, Hewlet-Packard, June 1989. + + (Used with permission) + +"""#" + +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='hp-roman8', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamwriter=StreamWriter, + streamreader=StreamReader, + ) + + +### Decoding Table + +decoding_table = ( + '\x00' # 0x00 -> NULL + '\x01' # 0x01 -> START OF HEADING + '\x02' # 0x02 -> START OF TEXT + '\x03' # 0x03 -> END OF TEXT + '\x04' # 0x04 -> END OF TRANSMISSION + '\x05' # 0x05 -> ENQUIRY + '\x06' # 0x06 -> ACKNOWLEDGE + '\x07' # 0x07 -> BELL + '\x08' # 0x08 -> BACKSPACE + '\t' # 0x09 -> HORIZONTAL TABULATION + '\n' # 0x0A -> LINE FEED + '\x0b' # 0x0B -> VERTICAL TABULATION + '\x0c' # 0x0C -> FORM FEED + '\r' # 0x0D -> CARRIAGE RETURN + '\x0e' # 0x0E -> SHIFT OUT + '\x0f' # 0x0F -> SHIFT IN + '\x10' # 0x10 -> DATA LINK ESCAPE + '\x11' # 0x11 -> DEVICE CONTROL ONE + '\x12' # 0x12 -> DEVICE CONTROL TWO + '\x13' # 0x13 -> DEVICE CONTROL THREE + '\x14' # 0x14 -> DEVICE CONTROL FOUR + '\x15' # 0x15 -> NEGATIVE ACKNOWLEDGE + '\x16' # 0x16 -> SYNCHRONOUS IDLE + '\x17' # 0x17 -> END OF TRANSMISSION BLOCK + '\x18' # 0x18 -> CANCEL + '\x19' # 0x19 -> END OF MEDIUM + '\x1a' # 0x1A -> SUBSTITUTE + '\x1b' # 0x1B -> ESCAPE + '\x1c' # 0x1C -> FILE SEPARATOR + '\x1d' # 0x1D -> GROUP SEPARATOR + '\x1e' # 0x1E -> RECORD SEPARATOR + '\x1f' # 0x1F -> UNIT SEPARATOR + ' ' # 0x20 -> SPACE + '!' # 0x21 -> EXCLAMATION MARK + '"' # 0x22 -> QUOTATION MARK + '#' # 0x23 -> NUMBER SIGN + '$' # 0x24 -> DOLLAR SIGN + '%' # 0x25 -> PERCENT SIGN + '&' # 0x26 -> AMPERSAND + "'" # 0x27 -> APOSTROPHE + '(' # 0x28 -> LEFT PARENTHESIS + ')' # 0x29 -> RIGHT PARENTHESIS + '*' # 0x2A -> ASTERISK + '+' # 0x2B -> PLUS SIGN + ',' # 0x2C -> COMMA + '-' # 0x2D -> HYPHEN-MINUS + '.' # 0x2E -> FULL STOP + '/' # 0x2F -> SOLIDUS + '0' # 0x30 -> DIGIT ZERO + '1' # 0x31 -> DIGIT ONE + '2' # 0x32 -> DIGIT TWO + '3' # 0x33 -> DIGIT THREE + '4' # 0x34 -> DIGIT FOUR + '5' # 0x35 -> DIGIT FIVE + '6' # 0x36 -> DIGIT SIX + '7' # 0x37 -> DIGIT SEVEN + '8' # 0x38 -> DIGIT EIGHT + '9' # 0x39 -> DIGIT NINE + ':' # 0x3A -> COLON + ';' # 0x3B -> SEMICOLON + '<' # 0x3C -> LESS-THAN SIGN + '=' # 0x3D -> EQUALS SIGN + '>' # 0x3E -> GREATER-THAN SIGN + '?' # 0x3F -> QUESTION MARK + '@' # 0x40 -> COMMERCIAL AT + 'A' # 0x41 -> LATIN CAPITAL LETTER A + 'B' # 0x42 -> LATIN CAPITAL LETTER B + 'C' # 0x43 -> LATIN CAPITAL LETTER C + 'D' # 0x44 -> LATIN CAPITAL LETTER D + 'E' # 0x45 -> LATIN CAPITAL LETTER E + 'F' # 0x46 -> LATIN CAPITAL LETTER F + 'G' # 0x47 -> LATIN CAPITAL LETTER G + 'H' # 0x48 -> LATIN CAPITAL LETTER H + 'I' # 0x49 -> LATIN CAPITAL LETTER I + 'J' # 0x4A -> LATIN CAPITAL LETTER J + 'K' # 0x4B -> LATIN CAPITAL LETTER K + 'L' # 0x4C -> LATIN CAPITAL LETTER L + 'M' # 0x4D -> LATIN CAPITAL LETTER M + 'N' # 0x4E -> LATIN CAPITAL LETTER N + 'O' # 0x4F -> LATIN CAPITAL LETTER O + 'P' # 0x50 -> LATIN CAPITAL LETTER P + 'Q' # 0x51 -> LATIN CAPITAL LETTER Q + 'R' # 0x52 -> LATIN CAPITAL LETTER R + 'S' # 0x53 -> LATIN CAPITAL LETTER S + 'T' # 0x54 -> LATIN CAPITAL LETTER T + 'U' # 0x55 -> LATIN CAPITAL LETTER U + 'V' # 0x56 -> LATIN CAPITAL LETTER V + 'W' # 0x57 -> LATIN CAPITAL LETTER W + 'X' # 0x58 -> LATIN CAPITAL LETTER X + 'Y' # 0x59 -> LATIN CAPITAL LETTER Y + 'Z' # 0x5A -> LATIN CAPITAL LETTER Z + '[' # 0x5B -> LEFT SQUARE BRACKET + '\\' # 0x5C -> REVERSE SOLIDUS + ']' # 0x5D -> RIGHT SQUARE BRACKET + '^' # 0x5E -> CIRCUMFLEX ACCENT + '_' # 0x5F -> LOW LINE + '`' # 0x60 -> GRAVE ACCENT + 'a' # 0x61 -> LATIN SMALL LETTER A + 'b' # 0x62 -> LATIN SMALL LETTER B + 'c' # 0x63 -> LATIN SMALL LETTER C + 'd' # 0x64 -> LATIN SMALL LETTER D + 'e' # 0x65 -> LATIN SMALL LETTER E + 'f' # 0x66 -> LATIN SMALL LETTER F + 'g' # 0x67 -> LATIN SMALL LETTER G + 'h' # 0x68 -> LATIN SMALL LETTER H + 'i' # 0x69 -> LATIN SMALL LETTER I + 'j' # 0x6A -> LATIN SMALL LETTER J + 'k' # 0x6B -> LATIN SMALL LETTER K + 'l' # 0x6C -> LATIN SMALL LETTER L + 'm' # 0x6D -> LATIN SMALL LETTER M + 'n' # 0x6E -> LATIN SMALL LETTER N + 'o' # 0x6F -> LATIN SMALL LETTER O + 'p' # 0x70 -> LATIN SMALL LETTER P + 'q' # 0x71 -> LATIN SMALL LETTER Q + 'r' # 0x72 -> LATIN SMALL LETTER R + 's' # 0x73 -> LATIN SMALL LETTER S + 't' # 0x74 -> LATIN SMALL LETTER T + 'u' # 0x75 -> LATIN SMALL LETTER U + 'v' # 0x76 -> LATIN SMALL LETTER V + 'w' # 0x77 -> LATIN SMALL LETTER W + 'x' # 0x78 -> LATIN SMALL LETTER X + 'y' # 0x79 -> LATIN SMALL LETTER Y + 'z' # 0x7A -> LATIN SMALL LETTER Z + '{' # 0x7B -> LEFT CURLY BRACKET + '|' # 0x7C -> VERTICAL LINE + '}' # 0x7D -> RIGHT CURLY BRACKET + '~' # 0x7E -> TILDE + '\x7f' # 0x7F -> DELETE + '\x80' # 0x80 -> + '\x81' # 0x81 -> + '\x82' # 0x82 -> + '\x83' # 0x83 -> + '\x84' # 0x84 -> + '\x85' # 0x85 -> + '\x86' # 0x86 -> + '\x87' # 0x87 -> + '\x88' # 0x88 -> + '\x89' # 0x89 -> + '\x8a' # 0x8A -> + '\x8b' # 0x8B -> + '\x8c' # 0x8C -> + '\x8d' # 0x8D -> + '\x8e' # 0x8E -> + '\x8f' # 0x8F -> + '\x90' # 0x90 -> + '\x91' # 0x91 -> + '\x92' # 0x92 -> + '\x93' # 0x93 -> + '\x94' # 0x94 -> + '\x95' # 0x95 -> + '\x96' # 0x96 -> + '\x97' # 0x97 -> + '\x98' # 0x98 -> + '\x99' # 0x99 -> + '\x9a' # 0x9A -> + '\x9b' # 0x9B -> + '\x9c' # 0x9C -> + '\x9d' # 0x9D -> + '\x9e' # 0x9E -> + '\x9f' # 0x9F -> + '\xa0' # 0xA0 -> NO-BREAK SPACE + '\xc0' # 0xA1 -> LATIN CAPITAL LETTER A WITH GRAVE + '\xc2' # 0xA2 -> LATIN CAPITAL LETTER A WITH CIRCUMFLEX + '\xc8' # 0xA3 -> LATIN CAPITAL LETTER E WITH GRAVE + '\xca' # 0xA4 -> LATIN CAPITAL LETTER E WITH CIRCUMFLEX + '\xcb' # 0xA5 -> LATIN CAPITAL LETTER E WITH DIAERESIS + '\xce' # 0xA6 -> LATIN CAPITAL LETTER I WITH CIRCUMFLEX + '\xcf' # 0xA7 -> LATIN CAPITAL LETTER I WITH DIAERESIS + '\xb4' # 0xA8 -> ACUTE ACCENT + '\u02cb' # 0xA9 -> MODIFIER LETTER GRAVE ACCENT (MANDARIN CHINESE FOURTH TONE) + '\u02c6' # 0xAA -> MODIFIER LETTER CIRCUMFLEX ACCENT + '\xa8' # 0xAB -> DIAERESIS + '\u02dc' # 0xAC -> SMALL TILDE + '\xd9' # 0xAD -> LATIN CAPITAL LETTER U WITH GRAVE + '\xdb' # 0xAE -> LATIN CAPITAL LETTER U WITH CIRCUMFLEX + '\u20a4' # 0xAF -> LIRA SIGN + '\xaf' # 0xB0 -> MACRON + '\xdd' # 0xB1 -> LATIN CAPITAL LETTER Y WITH ACUTE + '\xfd' # 0xB2 -> LATIN SMALL LETTER Y WITH ACUTE + '\xb0' # 0xB3 -> DEGREE SIGN + '\xc7' # 0xB4 -> LATIN CAPITAL LETTER C WITH CEDILLA + '\xe7' # 0xB5 -> LATIN SMALL LETTER C WITH CEDILLA + '\xd1' # 0xB6 -> LATIN CAPITAL LETTER N WITH TILDE + '\xf1' # 0xB7 -> LATIN SMALL LETTER N WITH TILDE + '\xa1' # 0xB8 -> INVERTED EXCLAMATION MARK + '\xbf' # 0xB9 -> INVERTED QUESTION MARK + '\xa4' # 0xBA -> CURRENCY SIGN + '\xa3' # 0xBB -> POUND SIGN + '\xa5' # 0xBC -> YEN SIGN + '\xa7' # 0xBD -> SECTION SIGN + '\u0192' # 0xBE -> LATIN SMALL LETTER F WITH HOOK + '\xa2' # 0xBF -> CENT SIGN + '\xe2' # 0xC0 -> LATIN SMALL LETTER A WITH CIRCUMFLEX + '\xea' # 0xC1 -> LATIN SMALL LETTER E WITH CIRCUMFLEX + '\xf4' # 0xC2 -> LATIN SMALL LETTER O WITH CIRCUMFLEX + '\xfb' # 0xC3 -> LATIN SMALL LETTER U WITH CIRCUMFLEX + '\xe1' # 0xC4 -> LATIN SMALL LETTER A WITH ACUTE + '\xe9' # 0xC5 -> LATIN SMALL LETTER E WITH ACUTE + '\xf3' # 0xC6 -> LATIN SMALL LETTER O WITH ACUTE + '\xfa' # 0xC7 -> LATIN SMALL LETTER U WITH ACUTE + '\xe0' # 0xC8 -> LATIN SMALL LETTER A WITH GRAVE + '\xe8' # 0xC9 -> LATIN SMALL LETTER E WITH GRAVE + '\xf2' # 0xCA -> LATIN SMALL LETTER O WITH GRAVE + '\xf9' # 0xCB -> LATIN SMALL LETTER U WITH GRAVE + '\xe4' # 0xCC -> LATIN SMALL LETTER A WITH DIAERESIS + '\xeb' # 0xCD -> LATIN SMALL LETTER E WITH DIAERESIS + '\xf6' # 0xCE -> LATIN SMALL LETTER O WITH DIAERESIS + '\xfc' # 0xCF -> LATIN SMALL LETTER U WITH DIAERESIS + '\xc5' # 0xD0 -> LATIN CAPITAL LETTER A WITH RING ABOVE + '\xee' # 0xD1 -> LATIN SMALL LETTER I WITH CIRCUMFLEX + '\xd8' # 0xD2 -> LATIN CAPITAL LETTER O WITH STROKE + '\xc6' # 0xD3 -> LATIN CAPITAL LETTER AE + '\xe5' # 0xD4 -> LATIN SMALL LETTER A WITH RING ABOVE + '\xed' # 0xD5 -> LATIN SMALL LETTER I WITH ACUTE + '\xf8' # 0xD6 -> LATIN SMALL LETTER O WITH STROKE + '\xe6' # 0xD7 -> LATIN SMALL LETTER AE + '\xc4' # 0xD8 -> LATIN CAPITAL LETTER A WITH DIAERESIS + '\xec' # 0xD9 -> LATIN SMALL LETTER I WITH GRAVE + '\xd6' # 0xDA -> LATIN CAPITAL LETTER O WITH DIAERESIS + '\xdc' # 0xDB -> LATIN CAPITAL LETTER U WITH DIAERESIS + '\xc9' # 0xDC -> LATIN CAPITAL LETTER E WITH ACUTE + '\xef' # 0xDD -> LATIN SMALL LETTER I WITH DIAERESIS + '\xdf' # 0xDE -> LATIN SMALL LETTER SHARP S (GERMAN) + '\xd4' # 0xDF -> LATIN CAPITAL LETTER O WITH CIRCUMFLEX + '\xc1' # 0xE0 -> LATIN CAPITAL LETTER A WITH ACUTE + '\xc3' # 0xE1 -> LATIN CAPITAL LETTER A WITH TILDE + '\xe3' # 0xE2 -> LATIN SMALL LETTER A WITH TILDE + '\xd0' # 0xE3 -> LATIN CAPITAL LETTER ETH (ICELANDIC) + '\xf0' # 0xE4 -> LATIN SMALL LETTER ETH (ICELANDIC) + '\xcd' # 0xE5 -> LATIN CAPITAL LETTER I WITH ACUTE + '\xcc' # 0xE6 -> LATIN CAPITAL LETTER I WITH GRAVE + '\xd3' # 0xE7 -> LATIN CAPITAL LETTER O WITH ACUTE + '\xd2' # 0xE8 -> LATIN CAPITAL LETTER O WITH GRAVE + '\xd5' # 0xE9 -> LATIN CAPITAL LETTER O WITH TILDE + '\xf5' # 0xEA -> LATIN SMALL LETTER O WITH TILDE + '\u0160' # 0xEB -> LATIN CAPITAL LETTER S WITH CARON + '\u0161' # 0xEC -> LATIN SMALL LETTER S WITH CARON + '\xda' # 0xED -> LATIN CAPITAL LETTER U WITH ACUTE + '\u0178' # 0xEE -> LATIN CAPITAL LETTER Y WITH DIAERESIS + '\xff' # 0xEF -> LATIN SMALL LETTER Y WITH DIAERESIS + '\xde' # 0xF0 -> LATIN CAPITAL LETTER THORN (ICELANDIC) + '\xfe' # 0xF1 -> LATIN SMALL LETTER THORN (ICELANDIC) + '\xb7' # 0xF2 -> MIDDLE DOT + '\xb5' # 0xF3 -> MICRO SIGN + '\xb6' # 0xF4 -> PILCROW SIGN + '\xbe' # 0xF5 -> VULGAR FRACTION THREE QUARTERS + '\u2014' # 0xF6 -> EM DASH + '\xbc' # 0xF7 -> VULGAR FRACTION ONE QUARTER + '\xbd' # 0xF8 -> VULGAR FRACTION ONE HALF + '\xaa' # 0xF9 -> FEMININE ORDINAL INDICATOR + '\xba' # 0xFA -> MASCULINE ORDINAL INDICATOR + '\xab' # 0xFB -> LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + '\u25a0' # 0xFC -> BLACK SQUARE + '\xbb' # 0xFD -> RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + '\xb1' # 0xFE -> PLUS-MINUS SIGN + '\ufffe' +) + +### Encoding table +encoding_table=codecs.charmap_build(decoding_table) diff --git a/env/Lib/encodings/hz.py b/env/Lib/encodings/hz.py new file mode 100644 index 0000000..383442a --- /dev/null +++ b/env/Lib/encodings/hz.py @@ -0,0 +1,39 @@ +# +# hz.py: Python Unicode Codec for HZ +# +# Written by Hye-Shik Chang +# + +import _codecs_cn, codecs +import _multibytecodec as mbc + +codec = _codecs_cn.getcodec('hz') + +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='hz', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) diff --git a/env/Lib/encodings/idna.py b/env/Lib/encodings/idna.py new file mode 100644 index 0000000..ea40585 --- /dev/null +++ b/env/Lib/encodings/idna.py @@ -0,0 +1,309 @@ +# This module implements the RFCs 3490 (IDNA) and 3491 (Nameprep) + +import stringprep, re, codecs +from unicodedata import ucd_3_2_0 as unicodedata + +# IDNA section 3.1 +dots = re.compile("[\u002E\u3002\uFF0E\uFF61]") + +# IDNA section 5 +ace_prefix = b"xn--" +sace_prefix = "xn--" + +# This assumes query strings, so AllowUnassigned is true +def nameprep(label): + # Map + newlabel = [] + for c in label: + if stringprep.in_table_b1(c): + # Map to nothing + continue + newlabel.append(stringprep.map_table_b2(c)) + label = "".join(newlabel) + + # Normalize + label = unicodedata.normalize("NFKC", label) + + # Prohibit + for c in label: + if stringprep.in_table_c12(c) or \ + stringprep.in_table_c22(c) or \ + stringprep.in_table_c3(c) or \ + stringprep.in_table_c4(c) or \ + stringprep.in_table_c5(c) or \ + stringprep.in_table_c6(c) or \ + stringprep.in_table_c7(c) or \ + stringprep.in_table_c8(c) or \ + stringprep.in_table_c9(c): + raise UnicodeError("Invalid character %r" % c) + + # Check bidi + RandAL = [stringprep.in_table_d1(x) for x in label] + for c in RandAL: + if c: + # There is a RandAL char in the string. Must perform further + # tests: + # 1) The characters in section 5.8 MUST be prohibited. + # This is table C.8, which was already checked + # 2) If a string contains any RandALCat character, the string + # MUST NOT contain any LCat character. + if any(stringprep.in_table_d2(x) for x in label): + raise UnicodeError("Violation of BIDI requirement 2") + + # 3) If a string contains any RandALCat character, a + # RandALCat character MUST be the first character of the + # string, and a RandALCat character MUST be the last + # character of the string. + if not RandAL[0] or not RandAL[-1]: + raise UnicodeError("Violation of BIDI requirement 3") + + return label + +def ToASCII(label): + try: + # Step 1: try ASCII + label = label.encode("ascii") + except UnicodeError: + pass + else: + # Skip to step 3: UseSTD3ASCIIRules is false, so + # Skip to step 8. + if 0 < len(label) < 64: + return label + raise UnicodeError("label empty or too long") + + # Step 2: nameprep + label = nameprep(label) + + # Step 3: UseSTD3ASCIIRules is false + # Step 4: try ASCII + try: + label = label.encode("ascii") + except UnicodeError: + pass + else: + # Skip to step 8. + if 0 < len(label) < 64: + return label + raise UnicodeError("label empty or too long") + + # Step 5: Check ACE prefix + if label.startswith(sace_prefix): + raise UnicodeError("Label starts with ACE prefix") + + # Step 6: Encode with PUNYCODE + label = label.encode("punycode") + + # Step 7: Prepend ACE prefix + label = ace_prefix + label + + # Step 8: Check size + if 0 < len(label) < 64: + return label + raise UnicodeError("label empty or too long") + +def ToUnicode(label): + # Step 1: Check for ASCII + if isinstance(label, bytes): + pure_ascii = True + else: + try: + label = label.encode("ascii") + pure_ascii = True + except UnicodeError: + pure_ascii = False + if not pure_ascii: + # Step 2: Perform nameprep + label = nameprep(label) + # It doesn't say this, but apparently, it should be ASCII now + try: + label = label.encode("ascii") + except UnicodeError: + raise UnicodeError("Invalid character in IDN label") + # Step 3: Check for ACE prefix + if not label.startswith(ace_prefix): + return str(label, "ascii") + + # Step 4: Remove ACE prefix + label1 = label[len(ace_prefix):] + + # Step 5: Decode using PUNYCODE + result = label1.decode("punycode") + + # Step 6: Apply ToASCII + label2 = ToASCII(result) + + # Step 7: Compare the result of step 6 with the one of step 3 + # label2 will already be in lower case. + if str(label, "ascii").lower() != str(label2, "ascii"): + raise UnicodeError("IDNA does not round-trip", label, label2) + + # Step 8: return the result of step 5 + return result + +### Codec APIs + +class Codec(codecs.Codec): + def encode(self, input, errors='strict'): + + if errors != 'strict': + # IDNA is quite clear that implementations must be strict + raise UnicodeError("unsupported error handling "+errors) + + if not input: + return b'', 0 + + try: + result = input.encode('ascii') + except UnicodeEncodeError: + pass + else: + # ASCII name: fast path + labels = result.split(b'.') + for label in labels[:-1]: + if not (0 < len(label) < 64): + raise UnicodeError("label empty or too long") + if len(labels[-1]) >= 64: + raise UnicodeError("label too long") + return result, len(input) + + result = bytearray() + labels = dots.split(input) + if labels and not labels[-1]: + trailing_dot = b'.' + del labels[-1] + else: + trailing_dot = b'' + for label in labels: + if result: + # Join with U+002E + result.extend(b'.') + result.extend(ToASCII(label)) + return bytes(result+trailing_dot), len(input) + + def decode(self, input, errors='strict'): + + if errors != 'strict': + raise UnicodeError("Unsupported error handling "+errors) + + if not input: + return "", 0 + + # IDNA allows decoding to operate on Unicode strings, too. + if not isinstance(input, bytes): + # XXX obviously wrong, see #3232 + input = bytes(input) + + if ace_prefix not in input: + # Fast path + try: + return input.decode('ascii'), len(input) + except UnicodeDecodeError: + pass + + labels = input.split(b".") + + if labels and len(labels[-1]) == 0: + trailing_dot = '.' + del labels[-1] + else: + trailing_dot = '' + + result = [] + for label in labels: + result.append(ToUnicode(label)) + + return ".".join(result)+trailing_dot, len(input) + +class IncrementalEncoder(codecs.BufferedIncrementalEncoder): + def _buffer_encode(self, input, errors, final): + if errors != 'strict': + # IDNA is quite clear that implementations must be strict + raise UnicodeError("unsupported error handling "+errors) + + if not input: + return (b'', 0) + + labels = dots.split(input) + trailing_dot = b'' + if labels: + if not labels[-1]: + trailing_dot = b'.' + del labels[-1] + elif not final: + # Keep potentially unfinished label until the next call + del labels[-1] + if labels: + trailing_dot = b'.' + + result = bytearray() + size = 0 + for label in labels: + if size: + # Join with U+002E + result.extend(b'.') + size += 1 + result.extend(ToASCII(label)) + size += len(label) + + result += trailing_dot + size += len(trailing_dot) + return (bytes(result), size) + +class IncrementalDecoder(codecs.BufferedIncrementalDecoder): + def _buffer_decode(self, input, errors, final): + if errors != 'strict': + raise UnicodeError("Unsupported error handling "+errors) + + if not input: + return ("", 0) + + # IDNA allows decoding to operate on Unicode strings, too. + if isinstance(input, str): + labels = dots.split(input) + else: + # Must be ASCII string + input = str(input, "ascii") + labels = input.split(".") + + trailing_dot = '' + if labels: + if not labels[-1]: + trailing_dot = '.' + del labels[-1] + elif not final: + # Keep potentially unfinished label until the next call + del labels[-1] + if labels: + trailing_dot = '.' + + result = [] + size = 0 + for label in labels: + result.append(ToUnicode(label)) + if size: + size += 1 + size += len(label) + + result = ".".join(result) + trailing_dot + size += len(trailing_dot) + return (result, size) + +class StreamWriter(Codec,codecs.StreamWriter): + pass + +class StreamReader(Codec,codecs.StreamReader): + pass + +### encodings module API + +def getregentry(): + return codecs.CodecInfo( + name='idna', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamwriter=StreamWriter, + streamreader=StreamReader, + ) diff --git a/env/Lib/encodings/iso2022_jp.py b/env/Lib/encodings/iso2022_jp.py new file mode 100644 index 0000000..ab04060 --- /dev/null +++ b/env/Lib/encodings/iso2022_jp.py @@ -0,0 +1,39 @@ +# +# iso2022_jp.py: Python Unicode Codec for ISO2022_JP +# +# Written by Hye-Shik Chang +# + +import _codecs_iso2022, codecs +import _multibytecodec as mbc + +codec = _codecs_iso2022.getcodec('iso2022_jp') + +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='iso2022_jp', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) diff --git a/env/Lib/encodings/iso2022_jp_1.py b/env/Lib/encodings/iso2022_jp_1.py new file mode 100644 index 0000000..997044d --- /dev/null +++ b/env/Lib/encodings/iso2022_jp_1.py @@ -0,0 +1,39 @@ +# +# iso2022_jp_1.py: Python Unicode Codec for ISO2022_JP_1 +# +# Written by Hye-Shik Chang +# + +import _codecs_iso2022, codecs +import _multibytecodec as mbc + +codec = _codecs_iso2022.getcodec('iso2022_jp_1') + +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='iso2022_jp_1', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) diff --git a/env/Lib/encodings/iso2022_jp_2.py b/env/Lib/encodings/iso2022_jp_2.py new file mode 100644 index 0000000..9106bf7 --- /dev/null +++ b/env/Lib/encodings/iso2022_jp_2.py @@ -0,0 +1,39 @@ +# +# iso2022_jp_2.py: Python Unicode Codec for ISO2022_JP_2 +# +# Written by Hye-Shik Chang +# + +import _codecs_iso2022, codecs +import _multibytecodec as mbc + +codec = _codecs_iso2022.getcodec('iso2022_jp_2') + +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='iso2022_jp_2', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) diff --git a/env/Lib/encodings/iso2022_jp_2004.py b/env/Lib/encodings/iso2022_jp_2004.py new file mode 100644 index 0000000..40198bf --- /dev/null +++ b/env/Lib/encodings/iso2022_jp_2004.py @@ -0,0 +1,39 @@ +# +# iso2022_jp_2004.py: Python Unicode Codec for ISO2022_JP_2004 +# +# Written by Hye-Shik Chang +# + +import _codecs_iso2022, codecs +import _multibytecodec as mbc + +codec = _codecs_iso2022.getcodec('iso2022_jp_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='iso2022_jp_2004', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) diff --git a/env/Lib/encodings/iso2022_jp_3.py b/env/Lib/encodings/iso2022_jp_3.py new file mode 100644 index 0000000..346e08b --- /dev/null +++ b/env/Lib/encodings/iso2022_jp_3.py @@ -0,0 +1,39 @@ +# +# iso2022_jp_3.py: Python Unicode Codec for ISO2022_JP_3 +# +# Written by Hye-Shik Chang +# + +import _codecs_iso2022, codecs +import _multibytecodec as mbc + +codec = _codecs_iso2022.getcodec('iso2022_jp_3') + +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='iso2022_jp_3', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) diff --git a/env/Lib/encodings/iso2022_jp_ext.py b/env/Lib/encodings/iso2022_jp_ext.py new file mode 100644 index 0000000..752bab9 --- /dev/null +++ b/env/Lib/encodings/iso2022_jp_ext.py @@ -0,0 +1,39 @@ +# +# iso2022_jp_ext.py: Python Unicode Codec for ISO2022_JP_EXT +# +# Written by Hye-Shik Chang +# + +import _codecs_iso2022, codecs +import _multibytecodec as mbc + +codec = _codecs_iso2022.getcodec('iso2022_jp_ext') + +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='iso2022_jp_ext', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) diff --git a/env/Lib/encodings/iso2022_kr.py b/env/Lib/encodings/iso2022_kr.py new file mode 100644 index 0000000..bf70187 --- /dev/null +++ b/env/Lib/encodings/iso2022_kr.py @@ -0,0 +1,39 @@ +# +# iso2022_kr.py: Python Unicode Codec for ISO2022_KR +# +# Written by Hye-Shik Chang +# + +import _codecs_iso2022, codecs +import _multibytecodec as mbc + +codec = _codecs_iso2022.getcodec('iso2022_kr') + +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='iso2022_kr', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) diff --git a/env/Lib/encodings/iso8859_1.py b/env/Lib/encodings/iso8859_1.py new file mode 100644 index 0000000..8cfc01f --- /dev/null +++ b/env/Lib/encodings/iso8859_1.py @@ -0,0 +1,307 @@ +""" Python Character Mapping Codec iso8859_1 generated from 'MAPPINGS/ISO8859/8859-1.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='iso8859-1', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) + + +### Decoding Table + +decoding_table = ( + '\x00' # 0x00 -> NULL + '\x01' # 0x01 -> START OF HEADING + '\x02' # 0x02 -> START OF TEXT + '\x03' # 0x03 -> END OF TEXT + '\x04' # 0x04 -> END OF TRANSMISSION + '\x05' # 0x05 -> ENQUIRY + '\x06' # 0x06 -> ACKNOWLEDGE + '\x07' # 0x07 -> BELL + '\x08' # 0x08 -> BACKSPACE + '\t' # 0x09 -> HORIZONTAL TABULATION + '\n' # 0x0A -> LINE FEED + '\x0b' # 0x0B -> VERTICAL TABULATION + '\x0c' # 0x0C -> FORM FEED + '\r' # 0x0D -> CARRIAGE RETURN + '\x0e' # 0x0E -> SHIFT OUT + '\x0f' # 0x0F -> SHIFT IN + '\x10' # 0x10 -> DATA LINK ESCAPE + '\x11' # 0x11 -> DEVICE CONTROL ONE + '\x12' # 0x12 -> DEVICE CONTROL TWO + '\x13' # 0x13 -> DEVICE CONTROL THREE + '\x14' # 0x14 -> DEVICE CONTROL FOUR + '\x15' # 0x15 -> NEGATIVE ACKNOWLEDGE + '\x16' # 0x16 -> SYNCHRONOUS IDLE + '\x17' # 0x17 -> END OF TRANSMISSION BLOCK + '\x18' # 0x18 -> CANCEL + '\x19' # 0x19 -> END OF MEDIUM + '\x1a' # 0x1A -> SUBSTITUTE + '\x1b' # 0x1B -> ESCAPE + '\x1c' # 0x1C -> FILE SEPARATOR + '\x1d' # 0x1D -> GROUP SEPARATOR + '\x1e' # 0x1E -> RECORD SEPARATOR + '\x1f' # 0x1F -> UNIT SEPARATOR + ' ' # 0x20 -> SPACE + '!' # 0x21 -> EXCLAMATION MARK + '"' # 0x22 -> QUOTATION MARK + '#' # 0x23 -> NUMBER SIGN + '$' # 0x24 -> DOLLAR SIGN + '%' # 0x25 -> PERCENT SIGN + '&' # 0x26 -> AMPERSAND + "'" # 0x27 -> APOSTROPHE + '(' # 0x28 -> LEFT PARENTHESIS + ')' # 0x29 -> RIGHT PARENTHESIS + '*' # 0x2A -> ASTERISK + '+' # 0x2B -> PLUS SIGN + ',' # 0x2C -> COMMA + '-' # 0x2D -> HYPHEN-MINUS + '.' # 0x2E -> FULL STOP + '/' # 0x2F -> SOLIDUS + '0' # 0x30 -> DIGIT ZERO + '1' # 0x31 -> DIGIT ONE + '2' # 0x32 -> DIGIT TWO + '3' # 0x33 -> DIGIT THREE + '4' # 0x34 -> DIGIT FOUR + '5' # 0x35 -> DIGIT FIVE + '6' # 0x36 -> DIGIT SIX + '7' # 0x37 -> DIGIT SEVEN + '8' # 0x38 -> DIGIT EIGHT + '9' # 0x39 -> DIGIT NINE + ':' # 0x3A -> COLON + ';' # 0x3B -> SEMICOLON + '<' # 0x3C -> LESS-THAN SIGN + '=' # 0x3D -> EQUALS SIGN + '>' # 0x3E -> GREATER-THAN SIGN + '?' # 0x3F -> QUESTION MARK + '@' # 0x40 -> COMMERCIAL AT + 'A' # 0x41 -> LATIN CAPITAL LETTER A + 'B' # 0x42 -> LATIN CAPITAL LETTER B + 'C' # 0x43 -> LATIN CAPITAL LETTER C + 'D' # 0x44 -> LATIN CAPITAL LETTER D + 'E' # 0x45 -> LATIN CAPITAL LETTER E + 'F' # 0x46 -> LATIN CAPITAL LETTER F + 'G' # 0x47 -> LATIN CAPITAL LETTER G + 'H' # 0x48 -> LATIN CAPITAL LETTER H + 'I' # 0x49 -> LATIN CAPITAL LETTER I + 'J' # 0x4A -> LATIN CAPITAL LETTER J + 'K' # 0x4B -> LATIN CAPITAL LETTER K + 'L' # 0x4C -> LATIN CAPITAL LETTER L + 'M' # 0x4D -> LATIN CAPITAL LETTER M + 'N' # 0x4E -> LATIN CAPITAL LETTER N + 'O' # 0x4F -> LATIN CAPITAL LETTER O + 'P' # 0x50 -> LATIN CAPITAL LETTER P + 'Q' # 0x51 -> LATIN CAPITAL LETTER Q + 'R' # 0x52 -> LATIN CAPITAL LETTER R + 'S' # 0x53 -> LATIN CAPITAL LETTER S + 'T' # 0x54 -> LATIN CAPITAL LETTER T + 'U' # 0x55 -> LATIN CAPITAL LETTER U + 'V' # 0x56 -> LATIN CAPITAL LETTER V + 'W' # 0x57 -> LATIN CAPITAL LETTER W + 'X' # 0x58 -> LATIN CAPITAL LETTER X + 'Y' # 0x59 -> LATIN CAPITAL LETTER Y + 'Z' # 0x5A -> LATIN CAPITAL LETTER Z + '[' # 0x5B -> LEFT SQUARE BRACKET + '\\' # 0x5C -> REVERSE SOLIDUS + ']' # 0x5D -> RIGHT SQUARE BRACKET + '^' # 0x5E -> CIRCUMFLEX ACCENT + '_' # 0x5F -> LOW LINE + '`' # 0x60 -> GRAVE ACCENT + 'a' # 0x61 -> LATIN SMALL LETTER A + 'b' # 0x62 -> LATIN SMALL LETTER B + 'c' # 0x63 -> LATIN SMALL LETTER C + 'd' # 0x64 -> LATIN SMALL LETTER D + 'e' # 0x65 -> LATIN SMALL LETTER E + 'f' # 0x66 -> LATIN SMALL LETTER F + 'g' # 0x67 -> LATIN SMALL LETTER G + 'h' # 0x68 -> LATIN SMALL LETTER H + 'i' # 0x69 -> LATIN SMALL LETTER I + 'j' # 0x6A -> LATIN SMALL LETTER J + 'k' # 0x6B -> LATIN SMALL LETTER K + 'l' # 0x6C -> LATIN SMALL LETTER L + 'm' # 0x6D -> LATIN SMALL LETTER M + 'n' # 0x6E -> LATIN SMALL LETTER N + 'o' # 0x6F -> LATIN SMALL LETTER O + 'p' # 0x70 -> LATIN SMALL LETTER P + 'q' # 0x71 -> LATIN SMALL LETTER Q + 'r' # 0x72 -> LATIN SMALL LETTER R + 's' # 0x73 -> LATIN SMALL LETTER S + 't' # 0x74 -> LATIN SMALL LETTER T + 'u' # 0x75 -> LATIN SMALL LETTER U + 'v' # 0x76 -> LATIN SMALL LETTER V + 'w' # 0x77 -> LATIN SMALL LETTER W + 'x' # 0x78 -> LATIN SMALL LETTER X + 'y' # 0x79 -> LATIN SMALL LETTER Y + 'z' # 0x7A -> LATIN SMALL LETTER Z + '{' # 0x7B -> LEFT CURLY BRACKET + '|' # 0x7C -> VERTICAL LINE + '}' # 0x7D -> RIGHT CURLY BRACKET + '~' # 0x7E -> TILDE + '\x7f' # 0x7F -> DELETE + '\x80' # 0x80 -> + '\x81' # 0x81 -> + '\x82' # 0x82 -> + '\x83' # 0x83 -> + '\x84' # 0x84 -> + '\x85' # 0x85 -> + '\x86' # 0x86 -> + '\x87' # 0x87 -> + '\x88' # 0x88 -> + '\x89' # 0x89 -> + '\x8a' # 0x8A -> + '\x8b' # 0x8B -> + '\x8c' # 0x8C -> + '\x8d' # 0x8D -> + '\x8e' # 0x8E -> + '\x8f' # 0x8F -> + '\x90' # 0x90 -> + '\x91' # 0x91 -> + '\x92' # 0x92 -> + '\x93' # 0x93 -> + '\x94' # 0x94 -> + '\x95' # 0x95 -> + '\x96' # 0x96 -> + '\x97' # 0x97 -> + '\x98' # 0x98 -> + '\x99' # 0x99 -> + '\x9a' # 0x9A -> + '\x9b' # 0x9B -> + '\x9c' # 0x9C -> + '\x9d' # 0x9D -> + '\x9e' # 0x9E -> + '\x9f' # 0x9F -> + '\xa0' # 0xA0 -> NO-BREAK SPACE + '\xa1' # 0xA1 -> INVERTED EXCLAMATION MARK + '\xa2' # 0xA2 -> CENT SIGN + '\xa3' # 0xA3 -> POUND SIGN + '\xa4' # 0xA4 -> CURRENCY SIGN + '\xa5' # 0xA5 -> YEN SIGN + '\xa6' # 0xA6 -> BROKEN BAR + '\xa7' # 0xA7 -> SECTION SIGN + '\xa8' # 0xA8 -> DIAERESIS + '\xa9' # 0xA9 -> COPYRIGHT SIGN + '\xaa' # 0xAA -> FEMININE ORDINAL INDICATOR + '\xab' # 0xAB -> LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + '\xac' # 0xAC -> NOT SIGN + '\xad' # 0xAD -> SOFT HYPHEN + '\xae' # 0xAE -> REGISTERED SIGN + '\xaf' # 0xAF -> MACRON + '\xb0' # 0xB0 -> DEGREE SIGN + '\xb1' # 0xB1 -> PLUS-MINUS SIGN + '\xb2' # 0xB2 -> SUPERSCRIPT TWO + '\xb3' # 0xB3 -> SUPERSCRIPT THREE + '\xb4' # 0xB4 -> ACUTE ACCENT + '\xb5' # 0xB5 -> MICRO SIGN + '\xb6' # 0xB6 -> PILCROW SIGN + '\xb7' # 0xB7 -> MIDDLE DOT + '\xb8' # 0xB8 -> CEDILLA + '\xb9' # 0xB9 -> SUPERSCRIPT ONE + '\xba' # 0xBA -> MASCULINE ORDINAL INDICATOR + '\xbb' # 0xBB -> RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + '\xbc' # 0xBC -> VULGAR FRACTION ONE QUARTER + '\xbd' # 0xBD -> VULGAR FRACTION ONE HALF + '\xbe' # 0xBE -> VULGAR FRACTION THREE QUARTERS + '\xbf' # 0xBF -> INVERTED QUESTION MARK + '\xc0' # 0xC0 -> LATIN CAPITAL LETTER A WITH GRAVE + '\xc1' # 0xC1 -> LATIN CAPITAL LETTER A WITH ACUTE + '\xc2' # 0xC2 -> LATIN CAPITAL LETTER A WITH CIRCUMFLEX + '\xc3' # 0xC3 -> LATIN CAPITAL LETTER A WITH TILDE + '\xc4' # 0xC4 -> LATIN CAPITAL LETTER A WITH DIAERESIS + '\xc5' # 0xC5 -> LATIN CAPITAL LETTER A WITH RING ABOVE + '\xc6' # 0xC6 -> LATIN CAPITAL LETTER AE + '\xc7' # 0xC7 -> LATIN CAPITAL LETTER C WITH CEDILLA + '\xc8' # 0xC8 -> LATIN CAPITAL LETTER E WITH GRAVE + '\xc9' # 0xC9 -> LATIN CAPITAL LETTER E WITH ACUTE + '\xca' # 0xCA -> LATIN CAPITAL LETTER E WITH CIRCUMFLEX + '\xcb' # 0xCB -> LATIN CAPITAL LETTER E WITH DIAERESIS + '\xcc' # 0xCC -> LATIN CAPITAL LETTER I WITH GRAVE + '\xcd' # 0xCD -> LATIN CAPITAL LETTER I WITH ACUTE + '\xce' # 0xCE -> LATIN CAPITAL LETTER I WITH CIRCUMFLEX + '\xcf' # 0xCF -> LATIN CAPITAL LETTER I WITH DIAERESIS + '\xd0' # 0xD0 -> LATIN CAPITAL LETTER ETH (Icelandic) + '\xd1' # 0xD1 -> LATIN CAPITAL LETTER N WITH TILDE + '\xd2' # 0xD2 -> LATIN CAPITAL LETTER O WITH GRAVE + '\xd3' # 0xD3 -> LATIN CAPITAL LETTER O WITH ACUTE + '\xd4' # 0xD4 -> LATIN CAPITAL LETTER O WITH CIRCUMFLEX + '\xd5' # 0xD5 -> LATIN CAPITAL LETTER O WITH TILDE + '\xd6' # 0xD6 -> LATIN CAPITAL LETTER O WITH DIAERESIS + '\xd7' # 0xD7 -> MULTIPLICATION SIGN + '\xd8' # 0xD8 -> LATIN CAPITAL LETTER O WITH STROKE + '\xd9' # 0xD9 -> LATIN CAPITAL LETTER U WITH GRAVE + '\xda' # 0xDA -> LATIN CAPITAL LETTER U WITH ACUTE + '\xdb' # 0xDB -> LATIN CAPITAL LETTER U WITH CIRCUMFLEX + '\xdc' # 0xDC -> LATIN CAPITAL LETTER U WITH DIAERESIS + '\xdd' # 0xDD -> LATIN CAPITAL LETTER Y WITH ACUTE + '\xde' # 0xDE -> LATIN CAPITAL LETTER THORN (Icelandic) + '\xdf' # 0xDF -> LATIN SMALL LETTER SHARP S (German) + '\xe0' # 0xE0 -> LATIN SMALL LETTER A WITH GRAVE + '\xe1' # 0xE1 -> LATIN SMALL LETTER A WITH ACUTE + '\xe2' # 0xE2 -> LATIN SMALL LETTER A WITH CIRCUMFLEX + '\xe3' # 0xE3 -> LATIN SMALL LETTER A WITH TILDE + '\xe4' # 0xE4 -> LATIN SMALL LETTER A WITH DIAERESIS + '\xe5' # 0xE5 -> LATIN SMALL LETTER A WITH RING ABOVE + '\xe6' # 0xE6 -> LATIN SMALL LETTER AE + '\xe7' # 0xE7 -> LATIN SMALL LETTER C WITH CEDILLA + '\xe8' # 0xE8 -> LATIN SMALL LETTER E WITH GRAVE + '\xe9' # 0xE9 -> LATIN SMALL LETTER E WITH ACUTE + '\xea' # 0xEA -> LATIN SMALL LETTER E WITH CIRCUMFLEX + '\xeb' # 0xEB -> LATIN SMALL LETTER E WITH DIAERESIS + '\xec' # 0xEC -> LATIN SMALL LETTER I WITH GRAVE + '\xed' # 0xED -> LATIN SMALL LETTER I WITH ACUTE + '\xee' # 0xEE -> LATIN SMALL LETTER I WITH CIRCUMFLEX + '\xef' # 0xEF -> LATIN SMALL LETTER I WITH DIAERESIS + '\xf0' # 0xF0 -> LATIN SMALL LETTER ETH (Icelandic) + '\xf1' # 0xF1 -> LATIN SMALL LETTER N WITH TILDE + '\xf2' # 0xF2 -> LATIN SMALL LETTER O WITH GRAVE + '\xf3' # 0xF3 -> LATIN SMALL LETTER O WITH ACUTE + '\xf4' # 0xF4 -> LATIN SMALL LETTER O WITH CIRCUMFLEX + '\xf5' # 0xF5 -> LATIN SMALL LETTER O WITH TILDE + '\xf6' # 0xF6 -> LATIN SMALL LETTER O WITH DIAERESIS + '\xf7' # 0xF7 -> DIVISION SIGN + '\xf8' # 0xF8 -> LATIN SMALL LETTER O WITH STROKE + '\xf9' # 0xF9 -> LATIN SMALL LETTER U WITH GRAVE + '\xfa' # 0xFA -> LATIN SMALL LETTER U WITH ACUTE + '\xfb' # 0xFB -> LATIN SMALL LETTER U WITH CIRCUMFLEX + '\xfc' # 0xFC -> LATIN SMALL LETTER U WITH DIAERESIS + '\xfd' # 0xFD -> LATIN SMALL LETTER Y WITH ACUTE + '\xfe' # 0xFE -> LATIN SMALL LETTER THORN (Icelandic) + '\xff' # 0xFF -> LATIN SMALL LETTER Y WITH DIAERESIS +) + +### Encoding table +encoding_table=codecs.charmap_build(decoding_table) diff --git a/env/Lib/encodings/iso8859_10.py b/env/Lib/encodings/iso8859_10.py new file mode 100644 index 0000000..b4fb041 --- /dev/null +++ b/env/Lib/encodings/iso8859_10.py @@ -0,0 +1,307 @@ +""" Python Character Mapping Codec iso8859_10 generated from 'MAPPINGS/ISO8859/8859-10.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='iso8859-10', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) + + +### Decoding Table + +decoding_table = ( + '\x00' # 0x00 -> NULL + '\x01' # 0x01 -> START OF HEADING + '\x02' # 0x02 -> START OF TEXT + '\x03' # 0x03 -> END OF TEXT + '\x04' # 0x04 -> END OF TRANSMISSION + '\x05' # 0x05 -> ENQUIRY + '\x06' # 0x06 -> ACKNOWLEDGE + '\x07' # 0x07 -> BELL + '\x08' # 0x08 -> BACKSPACE + '\t' # 0x09 -> HORIZONTAL TABULATION + '\n' # 0x0A -> LINE FEED + '\x0b' # 0x0B -> VERTICAL TABULATION + '\x0c' # 0x0C -> FORM FEED + '\r' # 0x0D -> CARRIAGE RETURN + '\x0e' # 0x0E -> SHIFT OUT + '\x0f' # 0x0F -> SHIFT IN + '\x10' # 0x10 -> DATA LINK ESCAPE + '\x11' # 0x11 -> DEVICE CONTROL ONE + '\x12' # 0x12 -> DEVICE CONTROL TWO + '\x13' # 0x13 -> DEVICE CONTROL THREE + '\x14' # 0x14 -> DEVICE CONTROL FOUR + '\x15' # 0x15 -> NEGATIVE ACKNOWLEDGE + '\x16' # 0x16 -> SYNCHRONOUS IDLE + '\x17' # 0x17 -> END OF TRANSMISSION BLOCK + '\x18' # 0x18 -> CANCEL + '\x19' # 0x19 -> END OF MEDIUM + '\x1a' # 0x1A -> SUBSTITUTE + '\x1b' # 0x1B -> ESCAPE + '\x1c' # 0x1C -> FILE SEPARATOR + '\x1d' # 0x1D -> GROUP SEPARATOR + '\x1e' # 0x1E -> RECORD SEPARATOR + '\x1f' # 0x1F -> UNIT SEPARATOR + ' ' # 0x20 -> SPACE + '!' # 0x21 -> EXCLAMATION MARK + '"' # 0x22 -> QUOTATION MARK + '#' # 0x23 -> NUMBER SIGN + '$' # 0x24 -> DOLLAR SIGN + '%' # 0x25 -> PERCENT SIGN + '&' # 0x26 -> AMPERSAND + "'" # 0x27 -> APOSTROPHE + '(' # 0x28 -> LEFT PARENTHESIS + ')' # 0x29 -> RIGHT PARENTHESIS + '*' # 0x2A -> ASTERISK + '+' # 0x2B -> PLUS SIGN + ',' # 0x2C -> COMMA + '-' # 0x2D -> HYPHEN-MINUS + '.' # 0x2E -> FULL STOP + '/' # 0x2F -> SOLIDUS + '0' # 0x30 -> DIGIT ZERO + '1' # 0x31 -> DIGIT ONE + '2' # 0x32 -> DIGIT TWO + '3' # 0x33 -> DIGIT THREE + '4' # 0x34 -> DIGIT FOUR + '5' # 0x35 -> DIGIT FIVE + '6' # 0x36 -> DIGIT SIX + '7' # 0x37 -> DIGIT SEVEN + '8' # 0x38 -> DIGIT EIGHT + '9' # 0x39 -> DIGIT NINE + ':' # 0x3A -> COLON + ';' # 0x3B -> SEMICOLON + '<' # 0x3C -> LESS-THAN SIGN + '=' # 0x3D -> EQUALS SIGN + '>' # 0x3E -> GREATER-THAN SIGN + '?' # 0x3F -> QUESTION MARK + '@' # 0x40 -> COMMERCIAL AT + 'A' # 0x41 -> LATIN CAPITAL LETTER A + 'B' # 0x42 -> LATIN CAPITAL LETTER B + 'C' # 0x43 -> LATIN CAPITAL LETTER C + 'D' # 0x44 -> LATIN CAPITAL LETTER D + 'E' # 0x45 -> LATIN CAPITAL LETTER E + 'F' # 0x46 -> LATIN CAPITAL LETTER F + 'G' # 0x47 -> LATIN CAPITAL LETTER G + 'H' # 0x48 -> LATIN CAPITAL LETTER H + 'I' # 0x49 -> LATIN CAPITAL LETTER I + 'J' # 0x4A -> LATIN CAPITAL LETTER J + 'K' # 0x4B -> LATIN CAPITAL LETTER K + 'L' # 0x4C -> LATIN CAPITAL LETTER L + 'M' # 0x4D -> LATIN CAPITAL LETTER M + 'N' # 0x4E -> LATIN CAPITAL LETTER N + 'O' # 0x4F -> LATIN CAPITAL LETTER O + 'P' # 0x50 -> LATIN CAPITAL LETTER P + 'Q' # 0x51 -> LATIN CAPITAL LETTER Q + 'R' # 0x52 -> LATIN CAPITAL LETTER R + 'S' # 0x53 -> LATIN CAPITAL LETTER S + 'T' # 0x54 -> LATIN CAPITAL LETTER T + 'U' # 0x55 -> LATIN CAPITAL LETTER U + 'V' # 0x56 -> LATIN CAPITAL LETTER V + 'W' # 0x57 -> LATIN CAPITAL LETTER W + 'X' # 0x58 -> LATIN CAPITAL LETTER X + 'Y' # 0x59 -> LATIN CAPITAL LETTER Y + 'Z' # 0x5A -> LATIN CAPITAL LETTER Z + '[' # 0x5B -> LEFT SQUARE BRACKET + '\\' # 0x5C -> REVERSE SOLIDUS + ']' # 0x5D -> RIGHT SQUARE BRACKET + '^' # 0x5E -> CIRCUMFLEX ACCENT + '_' # 0x5F -> LOW LINE + '`' # 0x60 -> GRAVE ACCENT + 'a' # 0x61 -> LATIN SMALL LETTER A + 'b' # 0x62 -> LATIN SMALL LETTER B + 'c' # 0x63 -> LATIN SMALL LETTER C + 'd' # 0x64 -> LATIN SMALL LETTER D + 'e' # 0x65 -> LATIN SMALL LETTER E + 'f' # 0x66 -> LATIN SMALL LETTER F + 'g' # 0x67 -> LATIN SMALL LETTER G + 'h' # 0x68 -> LATIN SMALL LETTER H + 'i' # 0x69 -> LATIN SMALL LETTER I + 'j' # 0x6A -> LATIN SMALL LETTER J + 'k' # 0x6B -> LATIN SMALL LETTER K + 'l' # 0x6C -> LATIN SMALL LETTER L + 'm' # 0x6D -> LATIN SMALL LETTER M + 'n' # 0x6E -> LATIN SMALL LETTER N + 'o' # 0x6F -> LATIN SMALL LETTER O + 'p' # 0x70 -> LATIN SMALL LETTER P + 'q' # 0x71 -> LATIN SMALL LETTER Q + 'r' # 0x72 -> LATIN SMALL LETTER R + 's' # 0x73 -> LATIN SMALL LETTER S + 't' # 0x74 -> LATIN SMALL LETTER T + 'u' # 0x75 -> LATIN SMALL LETTER U + 'v' # 0x76 -> LATIN SMALL LETTER V + 'w' # 0x77 -> LATIN SMALL LETTER W + 'x' # 0x78 -> LATIN SMALL LETTER X + 'y' # 0x79 -> LATIN SMALL LETTER Y + 'z' # 0x7A -> LATIN SMALL LETTER Z + '{' # 0x7B -> LEFT CURLY BRACKET + '|' # 0x7C -> VERTICAL LINE + '}' # 0x7D -> RIGHT CURLY BRACKET + '~' # 0x7E -> TILDE + '\x7f' # 0x7F -> DELETE + '\x80' # 0x80 -> + '\x81' # 0x81 -> + '\x82' # 0x82 -> + '\x83' # 0x83 -> + '\x84' # 0x84 -> + '\x85' # 0x85 -> + '\x86' # 0x86 -> + '\x87' # 0x87 -> + '\x88' # 0x88 -> + '\x89' # 0x89 -> + '\x8a' # 0x8A -> + '\x8b' # 0x8B -> + '\x8c' # 0x8C -> + '\x8d' # 0x8D -> + '\x8e' # 0x8E -> + '\x8f' # 0x8F -> + '\x90' # 0x90 -> + '\x91' # 0x91 -> + '\x92' # 0x92 -> + '\x93' # 0x93 -> + '\x94' # 0x94 -> + '\x95' # 0x95 -> + '\x96' # 0x96 -> + '\x97' # 0x97 -> + '\x98' # 0x98 -> + '\x99' # 0x99 -> + '\x9a' # 0x9A -> + '\x9b' # 0x9B -> + '\x9c' # 0x9C -> + '\x9d' # 0x9D -> + '\x9e' # 0x9E -> + '\x9f' # 0x9F -> + '\xa0' # 0xA0 -> NO-BREAK SPACE + '\u0104' # 0xA1 -> LATIN CAPITAL LETTER A WITH OGONEK + '\u0112' # 0xA2 -> LATIN CAPITAL LETTER E WITH MACRON + '\u0122' # 0xA3 -> LATIN CAPITAL LETTER G WITH CEDILLA + '\u012a' # 0xA4 -> LATIN CAPITAL LETTER I WITH MACRON + '\u0128' # 0xA5 -> LATIN CAPITAL LETTER I WITH TILDE + '\u0136' # 0xA6 -> LATIN CAPITAL LETTER K WITH CEDILLA + '\xa7' # 0xA7 -> SECTION SIGN + '\u013b' # 0xA8 -> LATIN CAPITAL LETTER L WITH CEDILLA + '\u0110' # 0xA9 -> LATIN CAPITAL LETTER D WITH STROKE + '\u0160' # 0xAA -> LATIN CAPITAL LETTER S WITH CARON + '\u0166' # 0xAB -> LATIN CAPITAL LETTER T WITH STROKE + '\u017d' # 0xAC -> LATIN CAPITAL LETTER Z WITH CARON + '\xad' # 0xAD -> SOFT HYPHEN + '\u016a' # 0xAE -> LATIN CAPITAL LETTER U WITH MACRON + '\u014a' # 0xAF -> LATIN CAPITAL LETTER ENG + '\xb0' # 0xB0 -> DEGREE SIGN + '\u0105' # 0xB1 -> LATIN SMALL LETTER A WITH OGONEK + '\u0113' # 0xB2 -> LATIN SMALL LETTER E WITH MACRON + '\u0123' # 0xB3 -> LATIN SMALL LETTER G WITH CEDILLA + '\u012b' # 0xB4 -> LATIN SMALL LETTER I WITH MACRON + '\u0129' # 0xB5 -> LATIN SMALL LETTER I WITH TILDE + '\u0137' # 0xB6 -> LATIN SMALL LETTER K WITH CEDILLA + '\xb7' # 0xB7 -> MIDDLE DOT + '\u013c' # 0xB8 -> LATIN SMALL LETTER L WITH CEDILLA + '\u0111' # 0xB9 -> LATIN SMALL LETTER D WITH STROKE + '\u0161' # 0xBA -> LATIN SMALL LETTER S WITH CARON + '\u0167' # 0xBB -> LATIN SMALL LETTER T WITH STROKE + '\u017e' # 0xBC -> LATIN SMALL LETTER Z WITH CARON + '\u2015' # 0xBD -> HORIZONTAL BAR + '\u016b' # 0xBE -> LATIN SMALL LETTER U WITH MACRON + '\u014b' # 0xBF -> LATIN SMALL LETTER ENG + '\u0100' # 0xC0 -> LATIN CAPITAL LETTER A WITH MACRON + '\xc1' # 0xC1 -> LATIN CAPITAL LETTER A WITH ACUTE + '\xc2' # 0xC2 -> LATIN CAPITAL LETTER A WITH CIRCUMFLEX + '\xc3' # 0xC3 -> LATIN CAPITAL LETTER A WITH TILDE + '\xc4' # 0xC4 -> LATIN CAPITAL LETTER A WITH DIAERESIS + '\xc5' # 0xC5 -> LATIN CAPITAL LETTER A WITH RING ABOVE + '\xc6' # 0xC6 -> LATIN CAPITAL LETTER AE + '\u012e' # 0xC7 -> LATIN CAPITAL LETTER I WITH OGONEK + '\u010c' # 0xC8 -> LATIN CAPITAL LETTER C WITH CARON + '\xc9' # 0xC9 -> LATIN CAPITAL LETTER E WITH ACUTE + '\u0118' # 0xCA -> LATIN CAPITAL LETTER E WITH OGONEK + '\xcb' # 0xCB -> LATIN CAPITAL LETTER E WITH DIAERESIS + '\u0116' # 0xCC -> LATIN CAPITAL LETTER E WITH DOT ABOVE + '\xcd' # 0xCD -> LATIN CAPITAL LETTER I WITH ACUTE + '\xce' # 0xCE -> LATIN CAPITAL LETTER I WITH CIRCUMFLEX + '\xcf' # 0xCF -> LATIN CAPITAL LETTER I WITH DIAERESIS + '\xd0' # 0xD0 -> LATIN CAPITAL LETTER ETH (Icelandic) + '\u0145' # 0xD1 -> LATIN CAPITAL LETTER N WITH CEDILLA + '\u014c' # 0xD2 -> LATIN CAPITAL LETTER O WITH MACRON + '\xd3' # 0xD3 -> LATIN CAPITAL LETTER O WITH ACUTE + '\xd4' # 0xD4 -> LATIN CAPITAL LETTER O WITH CIRCUMFLEX + '\xd5' # 0xD5 -> LATIN CAPITAL LETTER O WITH TILDE + '\xd6' # 0xD6 -> LATIN CAPITAL LETTER O WITH DIAERESIS + '\u0168' # 0xD7 -> LATIN CAPITAL LETTER U WITH TILDE + '\xd8' # 0xD8 -> LATIN CAPITAL LETTER O WITH STROKE + '\u0172' # 0xD9 -> LATIN CAPITAL LETTER U WITH OGONEK + '\xda' # 0xDA -> LATIN CAPITAL LETTER U WITH ACUTE + '\xdb' # 0xDB -> LATIN CAPITAL LETTER U WITH CIRCUMFLEX + '\xdc' # 0xDC -> LATIN CAPITAL LETTER U WITH DIAERESIS + '\xdd' # 0xDD -> LATIN CAPITAL LETTER Y WITH ACUTE + '\xde' # 0xDE -> LATIN CAPITAL LETTER THORN (Icelandic) + '\xdf' # 0xDF -> LATIN SMALL LETTER SHARP S (German) + '\u0101' # 0xE0 -> LATIN SMALL LETTER A WITH MACRON + '\xe1' # 0xE1 -> LATIN SMALL LETTER A WITH ACUTE + '\xe2' # 0xE2 -> LATIN SMALL LETTER A WITH CIRCUMFLEX + '\xe3' # 0xE3 -> LATIN SMALL LETTER A WITH TILDE + '\xe4' # 0xE4 -> LATIN SMALL LETTER A WITH DIAERESIS + '\xe5' # 0xE5 -> LATIN SMALL LETTER A WITH RING ABOVE + '\xe6' # 0xE6 -> LATIN SMALL LETTER AE + '\u012f' # 0xE7 -> LATIN SMALL LETTER I WITH OGONEK + '\u010d' # 0xE8 -> LATIN SMALL LETTER C WITH CARON + '\xe9' # 0xE9 -> LATIN SMALL LETTER E WITH ACUTE + '\u0119' # 0xEA -> LATIN SMALL LETTER E WITH OGONEK + '\xeb' # 0xEB -> LATIN SMALL LETTER E WITH DIAERESIS + '\u0117' # 0xEC -> LATIN SMALL LETTER E WITH DOT ABOVE + '\xed' # 0xED -> LATIN SMALL LETTER I WITH ACUTE + '\xee' # 0xEE -> LATIN SMALL LETTER I WITH CIRCUMFLEX + '\xef' # 0xEF -> LATIN SMALL LETTER I WITH DIAERESIS + '\xf0' # 0xF0 -> LATIN SMALL LETTER ETH (Icelandic) + '\u0146' # 0xF1 -> LATIN SMALL LETTER N WITH CEDILLA + '\u014d' # 0xF2 -> LATIN SMALL LETTER O WITH MACRON + '\xf3' # 0xF3 -> LATIN SMALL LETTER O WITH ACUTE + '\xf4' # 0xF4 -> LATIN SMALL LETTER O WITH CIRCUMFLEX + '\xf5' # 0xF5 -> LATIN SMALL LETTER O WITH TILDE + '\xf6' # 0xF6 -> LATIN SMALL LETTER O WITH DIAERESIS + '\u0169' # 0xF7 -> LATIN SMALL LETTER U WITH TILDE + '\xf8' # 0xF8 -> LATIN SMALL LETTER O WITH STROKE + '\u0173' # 0xF9 -> LATIN SMALL LETTER U WITH OGONEK + '\xfa' # 0xFA -> LATIN SMALL LETTER U WITH ACUTE + '\xfb' # 0xFB -> LATIN SMALL LETTER U WITH CIRCUMFLEX + '\xfc' # 0xFC -> LATIN SMALL LETTER U WITH DIAERESIS + '\xfd' # 0xFD -> LATIN SMALL LETTER Y WITH ACUTE + '\xfe' # 0xFE -> LATIN SMALL LETTER THORN (Icelandic) + '\u0138' # 0xFF -> LATIN SMALL LETTER KRA +) + +### Encoding table +encoding_table=codecs.charmap_build(decoding_table) diff --git a/env/Lib/encodings/iso8859_11.py b/env/Lib/encodings/iso8859_11.py new file mode 100644 index 0000000..c7258ec --- /dev/null +++ b/env/Lib/encodings/iso8859_11.py @@ -0,0 +1,307 @@ +""" Python Character Mapping Codec iso8859_11 generated from 'MAPPINGS/ISO8859/8859-11.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='iso8859-11', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) + + +### Decoding Table + +decoding_table = ( + '\x00' # 0x00 -> NULL + '\x01' # 0x01 -> START OF HEADING + '\x02' # 0x02 -> START OF TEXT + '\x03' # 0x03 -> END OF TEXT + '\x04' # 0x04 -> END OF TRANSMISSION + '\x05' # 0x05 -> ENQUIRY + '\x06' # 0x06 -> ACKNOWLEDGE + '\x07' # 0x07 -> BELL + '\x08' # 0x08 -> BACKSPACE + '\t' # 0x09 -> HORIZONTAL TABULATION + '\n' # 0x0A -> LINE FEED + '\x0b' # 0x0B -> VERTICAL TABULATION + '\x0c' # 0x0C -> FORM FEED + '\r' # 0x0D -> CARRIAGE RETURN + '\x0e' # 0x0E -> SHIFT OUT + '\x0f' # 0x0F -> SHIFT IN + '\x10' # 0x10 -> DATA LINK ESCAPE + '\x11' # 0x11 -> DEVICE CONTROL ONE + '\x12' # 0x12 -> DEVICE CONTROL TWO + '\x13' # 0x13 -> DEVICE CONTROL THREE + '\x14' # 0x14 -> DEVICE CONTROL FOUR + '\x15' # 0x15 -> NEGATIVE ACKNOWLEDGE + '\x16' # 0x16 -> SYNCHRONOUS IDLE + '\x17' # 0x17 -> END OF TRANSMISSION BLOCK + '\x18' # 0x18 -> CANCEL + '\x19' # 0x19 -> END OF MEDIUM + '\x1a' # 0x1A -> SUBSTITUTE + '\x1b' # 0x1B -> ESCAPE + '\x1c' # 0x1C -> FILE SEPARATOR + '\x1d' # 0x1D -> GROUP SEPARATOR + '\x1e' # 0x1E -> RECORD SEPARATOR + '\x1f' # 0x1F -> UNIT SEPARATOR + ' ' # 0x20 -> SPACE + '!' # 0x21 -> EXCLAMATION MARK + '"' # 0x22 -> QUOTATION MARK + '#' # 0x23 -> NUMBER SIGN + '$' # 0x24 -> DOLLAR SIGN + '%' # 0x25 -> PERCENT SIGN + '&' # 0x26 -> AMPERSAND + "'" # 0x27 -> APOSTROPHE + '(' # 0x28 -> LEFT PARENTHESIS + ')' # 0x29 -> RIGHT PARENTHESIS + '*' # 0x2A -> ASTERISK + '+' # 0x2B -> PLUS SIGN + ',' # 0x2C -> COMMA + '-' # 0x2D -> HYPHEN-MINUS + '.' # 0x2E -> FULL STOP + '/' # 0x2F -> SOLIDUS + '0' # 0x30 -> DIGIT ZERO + '1' # 0x31 -> DIGIT ONE + '2' # 0x32 -> DIGIT TWO + '3' # 0x33 -> DIGIT THREE + '4' # 0x34 -> DIGIT FOUR + '5' # 0x35 -> DIGIT FIVE + '6' # 0x36 -> DIGIT SIX + '7' # 0x37 -> DIGIT SEVEN + '8' # 0x38 -> DIGIT EIGHT + '9' # 0x39 -> DIGIT NINE + ':' # 0x3A -> COLON + ';' # 0x3B -> SEMICOLON + '<' # 0x3C -> LESS-THAN SIGN + '=' # 0x3D -> EQUALS SIGN + '>' # 0x3E -> GREATER-THAN SIGN + '?' # 0x3F -> QUESTION MARK + '@' # 0x40 -> COMMERCIAL AT + 'A' # 0x41 -> LATIN CAPITAL LETTER A + 'B' # 0x42 -> LATIN CAPITAL LETTER B + 'C' # 0x43 -> LATIN CAPITAL LETTER C + 'D' # 0x44 -> LATIN CAPITAL LETTER D + 'E' # 0x45 -> LATIN CAPITAL LETTER E + 'F' # 0x46 -> LATIN CAPITAL LETTER F + 'G' # 0x47 -> LATIN CAPITAL LETTER G + 'H' # 0x48 -> LATIN CAPITAL LETTER H + 'I' # 0x49 -> LATIN CAPITAL LETTER I + 'J' # 0x4A -> LATIN CAPITAL LETTER J + 'K' # 0x4B -> LATIN CAPITAL LETTER K + 'L' # 0x4C -> LATIN CAPITAL LETTER L + 'M' # 0x4D -> LATIN CAPITAL LETTER M + 'N' # 0x4E -> LATIN CAPITAL LETTER N + 'O' # 0x4F -> LATIN CAPITAL LETTER O + 'P' # 0x50 -> LATIN CAPITAL LETTER P + 'Q' # 0x51 -> LATIN CAPITAL LETTER Q + 'R' # 0x52 -> LATIN CAPITAL LETTER R + 'S' # 0x53 -> LATIN CAPITAL LETTER S + 'T' # 0x54 -> LATIN CAPITAL LETTER T + 'U' # 0x55 -> LATIN CAPITAL LETTER U + 'V' # 0x56 -> LATIN CAPITAL LETTER V + 'W' # 0x57 -> LATIN CAPITAL LETTER W + 'X' # 0x58 -> LATIN CAPITAL LETTER X + 'Y' # 0x59 -> LATIN CAPITAL LETTER Y + 'Z' # 0x5A -> LATIN CAPITAL LETTER Z + '[' # 0x5B -> LEFT SQUARE BRACKET + '\\' # 0x5C -> REVERSE SOLIDUS + ']' # 0x5D -> RIGHT SQUARE BRACKET + '^' # 0x5E -> CIRCUMFLEX ACCENT + '_' # 0x5F -> LOW LINE + '`' # 0x60 -> GRAVE ACCENT + 'a' # 0x61 -> LATIN SMALL LETTER A + 'b' # 0x62 -> LATIN SMALL LETTER B + 'c' # 0x63 -> LATIN SMALL LETTER C + 'd' # 0x64 -> LATIN SMALL LETTER D + 'e' # 0x65 -> LATIN SMALL LETTER E + 'f' # 0x66 -> LATIN SMALL LETTER F + 'g' # 0x67 -> LATIN SMALL LETTER G + 'h' # 0x68 -> LATIN SMALL LETTER H + 'i' # 0x69 -> LATIN SMALL LETTER I + 'j' # 0x6A -> LATIN SMALL LETTER J + 'k' # 0x6B -> LATIN SMALL LETTER K + 'l' # 0x6C -> LATIN SMALL LETTER L + 'm' # 0x6D -> LATIN SMALL LETTER M + 'n' # 0x6E -> LATIN SMALL LETTER N + 'o' # 0x6F -> LATIN SMALL LETTER O + 'p' # 0x70 -> LATIN SMALL LETTER P + 'q' # 0x71 -> LATIN SMALL LETTER Q + 'r' # 0x72 -> LATIN SMALL LETTER R + 's' # 0x73 -> LATIN SMALL LETTER S + 't' # 0x74 -> LATIN SMALL LETTER T + 'u' # 0x75 -> LATIN SMALL LETTER U + 'v' # 0x76 -> LATIN SMALL LETTER V + 'w' # 0x77 -> LATIN SMALL LETTER W + 'x' # 0x78 -> LATIN SMALL LETTER X + 'y' # 0x79 -> LATIN SMALL LETTER Y + 'z' # 0x7A -> LATIN SMALL LETTER Z + '{' # 0x7B -> LEFT CURLY BRACKET + '|' # 0x7C -> VERTICAL LINE + '}' # 0x7D -> RIGHT CURLY BRACKET + '~' # 0x7E -> TILDE + '\x7f' # 0x7F -> DELETE + '\x80' # 0x80 -> + '\x81' # 0x81 -> + '\x82' # 0x82 -> + '\x83' # 0x83 -> + '\x84' # 0x84 -> + '\x85' # 0x85 -> + '\x86' # 0x86 -> + '\x87' # 0x87 -> + '\x88' # 0x88 -> + '\x89' # 0x89 -> + '\x8a' # 0x8A -> + '\x8b' # 0x8B -> + '\x8c' # 0x8C -> + '\x8d' # 0x8D -> + '\x8e' # 0x8E -> + '\x8f' # 0x8F -> + '\x90' # 0x90 -> + '\x91' # 0x91 -> + '\x92' # 0x92 -> + '\x93' # 0x93 -> + '\x94' # 0x94 -> + '\x95' # 0x95 -> + '\x96' # 0x96 -> + '\x97' # 0x97 -> + '\x98' # 0x98 -> + '\x99' # 0x99 -> + '\x9a' # 0x9A -> + '\x9b' # 0x9B -> + '\x9c' # 0x9C -> + '\x9d' # 0x9D -> + '\x9e' # 0x9E -> + '\x9f' # 0x9F -> + '\xa0' # 0xA0 -> NO-BREAK SPACE + '\u0e01' # 0xA1 -> THAI CHARACTER KO KAI + '\u0e02' # 0xA2 -> THAI CHARACTER KHO KHAI + '\u0e03' # 0xA3 -> THAI CHARACTER KHO KHUAT + '\u0e04' # 0xA4 -> THAI CHARACTER KHO KHWAI + '\u0e05' # 0xA5 -> THAI CHARACTER KHO KHON + '\u0e06' # 0xA6 -> THAI CHARACTER KHO RAKHANG + '\u0e07' # 0xA7 -> THAI CHARACTER NGO NGU + '\u0e08' # 0xA8 -> THAI CHARACTER CHO CHAN + '\u0e09' # 0xA9 -> THAI CHARACTER CHO CHING + '\u0e0a' # 0xAA -> THAI CHARACTER CHO CHANG + '\u0e0b' # 0xAB -> THAI CHARACTER SO SO + '\u0e0c' # 0xAC -> THAI CHARACTER CHO CHOE + '\u0e0d' # 0xAD -> THAI CHARACTER YO YING + '\u0e0e' # 0xAE -> THAI CHARACTER DO CHADA + '\u0e0f' # 0xAF -> THAI CHARACTER TO PATAK + '\u0e10' # 0xB0 -> THAI CHARACTER THO THAN + '\u0e11' # 0xB1 -> THAI CHARACTER THO NANGMONTHO + '\u0e12' # 0xB2 -> THAI CHARACTER THO PHUTHAO + '\u0e13' # 0xB3 -> THAI CHARACTER NO NEN + '\u0e14' # 0xB4 -> THAI CHARACTER DO DEK + '\u0e15' # 0xB5 -> THAI CHARACTER TO TAO + '\u0e16' # 0xB6 -> THAI CHARACTER THO THUNG + '\u0e17' # 0xB7 -> THAI CHARACTER THO THAHAN + '\u0e18' # 0xB8 -> THAI CHARACTER THO THONG + '\u0e19' # 0xB9 -> THAI CHARACTER NO NU + '\u0e1a' # 0xBA -> THAI CHARACTER BO BAIMAI + '\u0e1b' # 0xBB -> THAI CHARACTER PO PLA + '\u0e1c' # 0xBC -> THAI CHARACTER PHO PHUNG + '\u0e1d' # 0xBD -> THAI CHARACTER FO FA + '\u0e1e' # 0xBE -> THAI CHARACTER PHO PHAN + '\u0e1f' # 0xBF -> THAI CHARACTER FO FAN + '\u0e20' # 0xC0 -> THAI CHARACTER PHO SAMPHAO + '\u0e21' # 0xC1 -> THAI CHARACTER MO MA + '\u0e22' # 0xC2 -> THAI CHARACTER YO YAK + '\u0e23' # 0xC3 -> THAI CHARACTER RO RUA + '\u0e24' # 0xC4 -> THAI CHARACTER RU + '\u0e25' # 0xC5 -> THAI CHARACTER LO LING + '\u0e26' # 0xC6 -> THAI CHARACTER LU + '\u0e27' # 0xC7 -> THAI CHARACTER WO WAEN + '\u0e28' # 0xC8 -> THAI CHARACTER SO SALA + '\u0e29' # 0xC9 -> THAI CHARACTER SO RUSI + '\u0e2a' # 0xCA -> THAI CHARACTER SO SUA + '\u0e2b' # 0xCB -> THAI CHARACTER HO HIP + '\u0e2c' # 0xCC -> THAI CHARACTER LO CHULA + '\u0e2d' # 0xCD -> THAI CHARACTER O ANG + '\u0e2e' # 0xCE -> THAI CHARACTER HO NOKHUK + '\u0e2f' # 0xCF -> THAI CHARACTER PAIYANNOI + '\u0e30' # 0xD0 -> THAI CHARACTER SARA A + '\u0e31' # 0xD1 -> THAI CHARACTER MAI HAN-AKAT + '\u0e32' # 0xD2 -> THAI CHARACTER SARA AA + '\u0e33' # 0xD3 -> THAI CHARACTER SARA AM + '\u0e34' # 0xD4 -> THAI CHARACTER SARA I + '\u0e35' # 0xD5 -> THAI CHARACTER SARA II + '\u0e36' # 0xD6 -> THAI CHARACTER SARA UE + '\u0e37' # 0xD7 -> THAI CHARACTER SARA UEE + '\u0e38' # 0xD8 -> THAI CHARACTER SARA U + '\u0e39' # 0xD9 -> THAI CHARACTER SARA UU + '\u0e3a' # 0xDA -> THAI CHARACTER PHINTHU + '\ufffe' + '\ufffe' + '\ufffe' + '\ufffe' + '\u0e3f' # 0xDF -> THAI CURRENCY SYMBOL BAHT + '\u0e40' # 0xE0 -> THAI CHARACTER SARA E + '\u0e41' # 0xE1 -> THAI CHARACTER SARA AE + '\u0e42' # 0xE2 -> THAI CHARACTER SARA O + '\u0e43' # 0xE3 -> THAI CHARACTER SARA AI MAIMUAN + '\u0e44' # 0xE4 -> THAI CHARACTER SARA AI MAIMALAI + '\u0e45' # 0xE5 -> THAI CHARACTER LAKKHANGYAO + '\u0e46' # 0xE6 -> THAI CHARACTER MAIYAMOK + '\u0e47' # 0xE7 -> THAI CHARACTER MAITAIKHU + '\u0e48' # 0xE8 -> THAI CHARACTER MAI EK + '\u0e49' # 0xE9 -> THAI CHARACTER MAI THO + '\u0e4a' # 0xEA -> THAI CHARACTER MAI TRI + '\u0e4b' # 0xEB -> THAI CHARACTER MAI CHATTAWA + '\u0e4c' # 0xEC -> THAI CHARACTER THANTHAKHAT + '\u0e4d' # 0xED -> THAI CHARACTER NIKHAHIT + '\u0e4e' # 0xEE -> THAI CHARACTER YAMAKKAN + '\u0e4f' # 0xEF -> THAI CHARACTER FONGMAN + '\u0e50' # 0xF0 -> THAI DIGIT ZERO + '\u0e51' # 0xF1 -> THAI DIGIT ONE + '\u0e52' # 0xF2 -> THAI DIGIT TWO + '\u0e53' # 0xF3 -> THAI DIGIT THREE + '\u0e54' # 0xF4 -> THAI DIGIT FOUR + '\u0e55' # 0xF5 -> THAI DIGIT FIVE + '\u0e56' # 0xF6 -> THAI DIGIT SIX + '\u0e57' # 0xF7 -> THAI DIGIT SEVEN + '\u0e58' # 0xF8 -> THAI DIGIT EIGHT + '\u0e59' # 0xF9 -> THAI DIGIT NINE + '\u0e5a' # 0xFA -> THAI CHARACTER ANGKHANKHU + '\u0e5b' # 0xFB -> THAI CHARACTER KHOMUT + '\ufffe' + '\ufffe' + '\ufffe' + '\ufffe' +) + +### Encoding table +encoding_table=codecs.charmap_build(decoding_table) diff --git a/env/Lib/encodings/iso8859_13.py b/env/Lib/encodings/iso8859_13.py new file mode 100644 index 0000000..6f8eab2 --- /dev/null +++ b/env/Lib/encodings/iso8859_13.py @@ -0,0 +1,307 @@ +""" Python Character Mapping Codec iso8859_13 generated from 'MAPPINGS/ISO8859/8859-13.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='iso8859-13', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) + + +### Decoding Table + +decoding_table = ( + '\x00' # 0x00 -> NULL + '\x01' # 0x01 -> START OF HEADING + '\x02' # 0x02 -> START OF TEXT + '\x03' # 0x03 -> END OF TEXT + '\x04' # 0x04 -> END OF TRANSMISSION + '\x05' # 0x05 -> ENQUIRY + '\x06' # 0x06 -> ACKNOWLEDGE + '\x07' # 0x07 -> BELL + '\x08' # 0x08 -> BACKSPACE + '\t' # 0x09 -> HORIZONTAL TABULATION + '\n' # 0x0A -> LINE FEED + '\x0b' # 0x0B -> VERTICAL TABULATION + '\x0c' # 0x0C -> FORM FEED + '\r' # 0x0D -> CARRIAGE RETURN + '\x0e' # 0x0E -> SHIFT OUT + '\x0f' # 0x0F -> SHIFT IN + '\x10' # 0x10 -> DATA LINK ESCAPE + '\x11' # 0x11 -> DEVICE CONTROL ONE + '\x12' # 0x12 -> DEVICE CONTROL TWO + '\x13' # 0x13 -> DEVICE CONTROL THREE + '\x14' # 0x14 -> DEVICE CONTROL FOUR + '\x15' # 0x15 -> NEGATIVE ACKNOWLEDGE + '\x16' # 0x16 -> SYNCHRONOUS IDLE + '\x17' # 0x17 -> END OF TRANSMISSION BLOCK + '\x18' # 0x18 -> CANCEL + '\x19' # 0x19 -> END OF MEDIUM + '\x1a' # 0x1A -> SUBSTITUTE + '\x1b' # 0x1B -> ESCAPE + '\x1c' # 0x1C -> FILE SEPARATOR + '\x1d' # 0x1D -> GROUP SEPARATOR + '\x1e' # 0x1E -> RECORD SEPARATOR + '\x1f' # 0x1F -> UNIT SEPARATOR + ' ' # 0x20 -> SPACE + '!' # 0x21 -> EXCLAMATION MARK + '"' # 0x22 -> QUOTATION MARK + '#' # 0x23 -> NUMBER SIGN + '$' # 0x24 -> DOLLAR SIGN + '%' # 0x25 -> PERCENT SIGN + '&' # 0x26 -> AMPERSAND + "'" # 0x27 -> APOSTROPHE + '(' # 0x28 -> LEFT PARENTHESIS + ')' # 0x29 -> RIGHT PARENTHESIS + '*' # 0x2A -> ASTERISK + '+' # 0x2B -> PLUS SIGN + ',' # 0x2C -> COMMA + '-' # 0x2D -> HYPHEN-MINUS + '.' # 0x2E -> FULL STOP + '/' # 0x2F -> SOLIDUS + '0' # 0x30 -> DIGIT ZERO + '1' # 0x31 -> DIGIT ONE + '2' # 0x32 -> DIGIT TWO + '3' # 0x33 -> DIGIT THREE + '4' # 0x34 -> DIGIT FOUR + '5' # 0x35 -> DIGIT FIVE + '6' # 0x36 -> DIGIT SIX + '7' # 0x37 -> DIGIT SEVEN + '8' # 0x38 -> DIGIT EIGHT + '9' # 0x39 -> DIGIT NINE + ':' # 0x3A -> COLON + ';' # 0x3B -> SEMICOLON + '<' # 0x3C -> LESS-THAN SIGN + '=' # 0x3D -> EQUALS SIGN + '>' # 0x3E -> GREATER-THAN SIGN + '?' # 0x3F -> QUESTION MARK + '@' # 0x40 -> COMMERCIAL AT + 'A' # 0x41 -> LATIN CAPITAL LETTER A + 'B' # 0x42 -> LATIN CAPITAL LETTER B + 'C' # 0x43 -> LATIN CAPITAL LETTER C + 'D' # 0x44 -> LATIN CAPITAL LETTER D + 'E' # 0x45 -> LATIN CAPITAL LETTER E + 'F' # 0x46 -> LATIN CAPITAL LETTER F + 'G' # 0x47 -> LATIN CAPITAL LETTER G + 'H' # 0x48 -> LATIN CAPITAL LETTER H + 'I' # 0x49 -> LATIN CAPITAL LETTER I + 'J' # 0x4A -> LATIN CAPITAL LETTER J + 'K' # 0x4B -> LATIN CAPITAL LETTER K + 'L' # 0x4C -> LATIN CAPITAL LETTER L + 'M' # 0x4D -> LATIN CAPITAL LETTER M + 'N' # 0x4E -> LATIN CAPITAL LETTER N + 'O' # 0x4F -> LATIN CAPITAL LETTER O + 'P' # 0x50 -> LATIN CAPITAL LETTER P + 'Q' # 0x51 -> LATIN CAPITAL LETTER Q + 'R' # 0x52 -> LATIN CAPITAL LETTER R + 'S' # 0x53 -> LATIN CAPITAL LETTER S + 'T' # 0x54 -> LATIN CAPITAL LETTER T + 'U' # 0x55 -> LATIN CAPITAL LETTER U + 'V' # 0x56 -> LATIN CAPITAL LETTER V + 'W' # 0x57 -> LATIN CAPITAL LETTER W + 'X' # 0x58 -> LATIN CAPITAL LETTER X + 'Y' # 0x59 -> LATIN CAPITAL LETTER Y + 'Z' # 0x5A -> LATIN CAPITAL LETTER Z + '[' # 0x5B -> LEFT SQUARE BRACKET + '\\' # 0x5C -> REVERSE SOLIDUS + ']' # 0x5D -> RIGHT SQUARE BRACKET + '^' # 0x5E -> CIRCUMFLEX ACCENT + '_' # 0x5F -> LOW LINE + '`' # 0x60 -> GRAVE ACCENT + 'a' # 0x61 -> LATIN SMALL LETTER A + 'b' # 0x62 -> LATIN SMALL LETTER B + 'c' # 0x63 -> LATIN SMALL LETTER C + 'd' # 0x64 -> LATIN SMALL LETTER D + 'e' # 0x65 -> LATIN SMALL LETTER E + 'f' # 0x66 -> LATIN SMALL LETTER F + 'g' # 0x67 -> LATIN SMALL LETTER G + 'h' # 0x68 -> LATIN SMALL LETTER H + 'i' # 0x69 -> LATIN SMALL LETTER I + 'j' # 0x6A -> LATIN SMALL LETTER J + 'k' # 0x6B -> LATIN SMALL LETTER K + 'l' # 0x6C -> LATIN SMALL LETTER L + 'm' # 0x6D -> LATIN SMALL LETTER M + 'n' # 0x6E -> LATIN SMALL LETTER N + 'o' # 0x6F -> LATIN SMALL LETTER O + 'p' # 0x70 -> LATIN SMALL LETTER P + 'q' # 0x71 -> LATIN SMALL LETTER Q + 'r' # 0x72 -> LATIN SMALL LETTER R + 's' # 0x73 -> LATIN SMALL LETTER S + 't' # 0x74 -> LATIN SMALL LETTER T + 'u' # 0x75 -> LATIN SMALL LETTER U + 'v' # 0x76 -> LATIN SMALL LETTER V + 'w' # 0x77 -> LATIN SMALL LETTER W + 'x' # 0x78 -> LATIN SMALL LETTER X + 'y' # 0x79 -> LATIN SMALL LETTER Y + 'z' # 0x7A -> LATIN SMALL LETTER Z + '{' # 0x7B -> LEFT CURLY BRACKET + '|' # 0x7C -> VERTICAL LINE + '}' # 0x7D -> RIGHT CURLY BRACKET + '~' # 0x7E -> TILDE + '\x7f' # 0x7F -> DELETE + '\x80' # 0x80 -> + '\x81' # 0x81 -> + '\x82' # 0x82 -> + '\x83' # 0x83 -> + '\x84' # 0x84 -> + '\x85' # 0x85 -> + '\x86' # 0x86 -> + '\x87' # 0x87 -> + '\x88' # 0x88 -> + '\x89' # 0x89 -> + '\x8a' # 0x8A -> + '\x8b' # 0x8B -> + '\x8c' # 0x8C -> + '\x8d' # 0x8D -> + '\x8e' # 0x8E -> + '\x8f' # 0x8F -> + '\x90' # 0x90 -> + '\x91' # 0x91 -> + '\x92' # 0x92 -> + '\x93' # 0x93 -> + '\x94' # 0x94 -> + '\x95' # 0x95 -> + '\x96' # 0x96 -> + '\x97' # 0x97 -> + '\x98' # 0x98 -> + '\x99' # 0x99 -> + '\x9a' # 0x9A -> + '\x9b' # 0x9B -> + '\x9c' # 0x9C -> + '\x9d' # 0x9D -> + '\x9e' # 0x9E -> + '\x9f' # 0x9F -> + '\xa0' # 0xA0 -> NO-BREAK SPACE + '\u201d' # 0xA1 -> RIGHT DOUBLE QUOTATION MARK + '\xa2' # 0xA2 -> CENT SIGN + '\xa3' # 0xA3 -> POUND SIGN + '\xa4' # 0xA4 -> CURRENCY SIGN + '\u201e' # 0xA5 -> DOUBLE LOW-9 QUOTATION MARK + '\xa6' # 0xA6 -> BROKEN BAR + '\xa7' # 0xA7 -> SECTION SIGN + '\xd8' # 0xA8 -> LATIN CAPITAL LETTER O WITH STROKE + '\xa9' # 0xA9 -> COPYRIGHT SIGN + '\u0156' # 0xAA -> LATIN CAPITAL LETTER R WITH CEDILLA + '\xab' # 0xAB -> LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + '\xac' # 0xAC -> NOT SIGN + '\xad' # 0xAD -> SOFT HYPHEN + '\xae' # 0xAE -> REGISTERED SIGN + '\xc6' # 0xAF -> LATIN CAPITAL LETTER AE + '\xb0' # 0xB0 -> DEGREE SIGN + '\xb1' # 0xB1 -> PLUS-MINUS SIGN + '\xb2' # 0xB2 -> SUPERSCRIPT TWO + '\xb3' # 0xB3 -> SUPERSCRIPT THREE + '\u201c' # 0xB4 -> LEFT DOUBLE QUOTATION MARK + '\xb5' # 0xB5 -> MICRO SIGN + '\xb6' # 0xB6 -> PILCROW SIGN + '\xb7' # 0xB7 -> MIDDLE DOT + '\xf8' # 0xB8 -> LATIN SMALL LETTER O WITH STROKE + '\xb9' # 0xB9 -> SUPERSCRIPT ONE + '\u0157' # 0xBA -> LATIN SMALL LETTER R WITH CEDILLA + '\xbb' # 0xBB -> RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + '\xbc' # 0xBC -> VULGAR FRACTION ONE QUARTER + '\xbd' # 0xBD -> VULGAR FRACTION ONE HALF + '\xbe' # 0xBE -> VULGAR FRACTION THREE QUARTERS + '\xe6' # 0xBF -> LATIN SMALL LETTER AE + '\u0104' # 0xC0 -> LATIN CAPITAL LETTER A WITH OGONEK + '\u012e' # 0xC1 -> LATIN CAPITAL LETTER I WITH OGONEK + '\u0100' # 0xC2 -> LATIN CAPITAL LETTER A WITH MACRON + '\u0106' # 0xC3 -> LATIN CAPITAL LETTER C WITH ACUTE + '\xc4' # 0xC4 -> LATIN CAPITAL LETTER A WITH DIAERESIS + '\xc5' # 0xC5 -> LATIN CAPITAL LETTER A WITH RING ABOVE + '\u0118' # 0xC6 -> LATIN CAPITAL LETTER E WITH OGONEK + '\u0112' # 0xC7 -> LATIN CAPITAL LETTER E WITH MACRON + '\u010c' # 0xC8 -> LATIN CAPITAL LETTER C WITH CARON + '\xc9' # 0xC9 -> LATIN CAPITAL LETTER E WITH ACUTE + '\u0179' # 0xCA -> LATIN CAPITAL LETTER Z WITH ACUTE + '\u0116' # 0xCB -> LATIN CAPITAL LETTER E WITH DOT ABOVE + '\u0122' # 0xCC -> LATIN CAPITAL LETTER G WITH CEDILLA + '\u0136' # 0xCD -> LATIN CAPITAL LETTER K WITH CEDILLA + '\u012a' # 0xCE -> LATIN CAPITAL LETTER I WITH MACRON + '\u013b' # 0xCF -> LATIN CAPITAL LETTER L WITH CEDILLA + '\u0160' # 0xD0 -> LATIN CAPITAL LETTER S WITH CARON + '\u0143' # 0xD1 -> LATIN CAPITAL LETTER N WITH ACUTE + '\u0145' # 0xD2 -> LATIN CAPITAL LETTER N WITH CEDILLA + '\xd3' # 0xD3 -> LATIN CAPITAL LETTER O WITH ACUTE + '\u014c' # 0xD4 -> LATIN CAPITAL LETTER O WITH MACRON + '\xd5' # 0xD5 -> LATIN CAPITAL LETTER O WITH TILDE + '\xd6' # 0xD6 -> LATIN CAPITAL LETTER O WITH DIAERESIS + '\xd7' # 0xD7 -> MULTIPLICATION SIGN + '\u0172' # 0xD8 -> LATIN CAPITAL LETTER U WITH OGONEK + '\u0141' # 0xD9 -> LATIN CAPITAL LETTER L WITH STROKE + '\u015a' # 0xDA -> LATIN CAPITAL LETTER S WITH ACUTE + '\u016a' # 0xDB -> LATIN CAPITAL LETTER U WITH MACRON + '\xdc' # 0xDC -> LATIN CAPITAL LETTER U WITH DIAERESIS + '\u017b' # 0xDD -> LATIN CAPITAL LETTER Z WITH DOT ABOVE + '\u017d' # 0xDE -> LATIN CAPITAL LETTER Z WITH CARON + '\xdf' # 0xDF -> LATIN SMALL LETTER SHARP S (German) + '\u0105' # 0xE0 -> LATIN SMALL LETTER A WITH OGONEK + '\u012f' # 0xE1 -> LATIN SMALL LETTER I WITH OGONEK + '\u0101' # 0xE2 -> LATIN SMALL LETTER A WITH MACRON + '\u0107' # 0xE3 -> LATIN SMALL LETTER C WITH ACUTE + '\xe4' # 0xE4 -> LATIN SMALL LETTER A WITH DIAERESIS + '\xe5' # 0xE5 -> LATIN SMALL LETTER A WITH RING ABOVE + '\u0119' # 0xE6 -> LATIN SMALL LETTER E WITH OGONEK + '\u0113' # 0xE7 -> LATIN SMALL LETTER E WITH MACRON + '\u010d' # 0xE8 -> LATIN SMALL LETTER C WITH CARON + '\xe9' # 0xE9 -> LATIN SMALL LETTER E WITH ACUTE + '\u017a' # 0xEA -> LATIN SMALL LETTER Z WITH ACUTE + '\u0117' # 0xEB -> LATIN SMALL LETTER E WITH DOT ABOVE + '\u0123' # 0xEC -> LATIN SMALL LETTER G WITH CEDILLA + '\u0137' # 0xED -> LATIN SMALL LETTER K WITH CEDILLA + '\u012b' # 0xEE -> LATIN SMALL LETTER I WITH MACRON + '\u013c' # 0xEF -> LATIN SMALL LETTER L WITH CEDILLA + '\u0161' # 0xF0 -> LATIN SMALL LETTER S WITH CARON + '\u0144' # 0xF1 -> LATIN SMALL LETTER N WITH ACUTE + '\u0146' # 0xF2 -> LATIN SMALL LETTER N WITH CEDILLA + '\xf3' # 0xF3 -> LATIN SMALL LETTER O WITH ACUTE + '\u014d' # 0xF4 -> LATIN SMALL LETTER O WITH MACRON + '\xf5' # 0xF5 -> LATIN SMALL LETTER O WITH TILDE + '\xf6' # 0xF6 -> LATIN SMALL LETTER O WITH DIAERESIS + '\xf7' # 0xF7 -> DIVISION SIGN + '\u0173' # 0xF8 -> LATIN SMALL LETTER U WITH OGONEK + '\u0142' # 0xF9 -> LATIN SMALL LETTER L WITH STROKE + '\u015b' # 0xFA -> LATIN SMALL LETTER S WITH ACUTE + '\u016b' # 0xFB -> LATIN SMALL LETTER U WITH MACRON + '\xfc' # 0xFC -> LATIN SMALL LETTER U WITH DIAERESIS + '\u017c' # 0xFD -> LATIN SMALL LETTER Z WITH DOT ABOVE + '\u017e' # 0xFE -> LATIN SMALL LETTER Z WITH CARON + '\u2019' # 0xFF -> RIGHT SINGLE QUOTATION MARK +) + +### Encoding table +encoding_table=codecs.charmap_build(decoding_table) diff --git a/env/Lib/encodings/iso8859_14.py b/env/Lib/encodings/iso8859_14.py new file mode 100644 index 0000000..7568d4e --- /dev/null +++ b/env/Lib/encodings/iso8859_14.py @@ -0,0 +1,307 @@ +""" Python Character Mapping Codec iso8859_14 generated from 'MAPPINGS/ISO8859/8859-14.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='iso8859-14', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) + + +### Decoding Table + +decoding_table = ( + '\x00' # 0x00 -> NULL + '\x01' # 0x01 -> START OF HEADING + '\x02' # 0x02 -> START OF TEXT + '\x03' # 0x03 -> END OF TEXT + '\x04' # 0x04 -> END OF TRANSMISSION + '\x05' # 0x05 -> ENQUIRY + '\x06' # 0x06 -> ACKNOWLEDGE + '\x07' # 0x07 -> BELL + '\x08' # 0x08 -> BACKSPACE + '\t' # 0x09 -> HORIZONTAL TABULATION + '\n' # 0x0A -> LINE FEED + '\x0b' # 0x0B -> VERTICAL TABULATION + '\x0c' # 0x0C -> FORM FEED + '\r' # 0x0D -> CARRIAGE RETURN + '\x0e' # 0x0E -> SHIFT OUT + '\x0f' # 0x0F -> SHIFT IN + '\x10' # 0x10 -> DATA LINK ESCAPE + '\x11' # 0x11 -> DEVICE CONTROL ONE + '\x12' # 0x12 -> DEVICE CONTROL TWO + '\x13' # 0x13 -> DEVICE CONTROL THREE + '\x14' # 0x14 -> DEVICE CONTROL FOUR + '\x15' # 0x15 -> NEGATIVE ACKNOWLEDGE + '\x16' # 0x16 -> SYNCHRONOUS IDLE + '\x17' # 0x17 -> END OF TRANSMISSION BLOCK + '\x18' # 0x18 -> CANCEL + '\x19' # 0x19 -> END OF MEDIUM + '\x1a' # 0x1A -> SUBSTITUTE + '\x1b' # 0x1B -> ESCAPE + '\x1c' # 0x1C -> FILE SEPARATOR + '\x1d' # 0x1D -> GROUP SEPARATOR + '\x1e' # 0x1E -> RECORD SEPARATOR + '\x1f' # 0x1F -> UNIT SEPARATOR + ' ' # 0x20 -> SPACE + '!' # 0x21 -> EXCLAMATION MARK + '"' # 0x22 -> QUOTATION MARK + '#' # 0x23 -> NUMBER SIGN + '$' # 0x24 -> DOLLAR SIGN + '%' # 0x25 -> PERCENT SIGN + '&' # 0x26 -> AMPERSAND + "'" # 0x27 -> APOSTROPHE + '(' # 0x28 -> LEFT PARENTHESIS + ')' # 0x29 -> RIGHT PARENTHESIS + '*' # 0x2A -> ASTERISK + '+' # 0x2B -> PLUS SIGN + ',' # 0x2C -> COMMA + '-' # 0x2D -> HYPHEN-MINUS + '.' # 0x2E -> FULL STOP + '/' # 0x2F -> SOLIDUS + '0' # 0x30 -> DIGIT ZERO + '1' # 0x31 -> DIGIT ONE + '2' # 0x32 -> DIGIT TWO + '3' # 0x33 -> DIGIT THREE + '4' # 0x34 -> DIGIT FOUR + '5' # 0x35 -> DIGIT FIVE + '6' # 0x36 -> DIGIT SIX + '7' # 0x37 -> DIGIT SEVEN + '8' # 0x38 -> DIGIT EIGHT + '9' # 0x39 -> DIGIT NINE + ':' # 0x3A -> COLON + ';' # 0x3B -> SEMICOLON + '<' # 0x3C -> LESS-THAN SIGN + '=' # 0x3D -> EQUALS SIGN + '>' # 0x3E -> GREATER-THAN SIGN + '?' # 0x3F -> QUESTION MARK + '@' # 0x40 -> COMMERCIAL AT + 'A' # 0x41 -> LATIN CAPITAL LETTER A + 'B' # 0x42 -> LATIN CAPITAL LETTER B + 'C' # 0x43 -> LATIN CAPITAL LETTER C + 'D' # 0x44 -> LATIN CAPITAL LETTER D + 'E' # 0x45 -> LATIN CAPITAL LETTER E + 'F' # 0x46 -> LATIN CAPITAL LETTER F + 'G' # 0x47 -> LATIN CAPITAL LETTER G + 'H' # 0x48 -> LATIN CAPITAL LETTER H + 'I' # 0x49 -> LATIN CAPITAL LETTER I + 'J' # 0x4A -> LATIN CAPITAL LETTER J + 'K' # 0x4B -> LATIN CAPITAL LETTER K + 'L' # 0x4C -> LATIN CAPITAL LETTER L + 'M' # 0x4D -> LATIN CAPITAL LETTER M + 'N' # 0x4E -> LATIN CAPITAL LETTER N + 'O' # 0x4F -> LATIN CAPITAL LETTER O + 'P' # 0x50 -> LATIN CAPITAL LETTER P + 'Q' # 0x51 -> LATIN CAPITAL LETTER Q + 'R' # 0x52 -> LATIN CAPITAL LETTER R + 'S' # 0x53 -> LATIN CAPITAL LETTER S + 'T' # 0x54 -> LATIN CAPITAL LETTER T + 'U' # 0x55 -> LATIN CAPITAL LETTER U + 'V' # 0x56 -> LATIN CAPITAL LETTER V + 'W' # 0x57 -> LATIN CAPITAL LETTER W + 'X' # 0x58 -> LATIN CAPITAL LETTER X + 'Y' # 0x59 -> LATIN CAPITAL LETTER Y + 'Z' # 0x5A -> LATIN CAPITAL LETTER Z + '[' # 0x5B -> LEFT SQUARE BRACKET + '\\' # 0x5C -> REVERSE SOLIDUS + ']' # 0x5D -> RIGHT SQUARE BRACKET + '^' # 0x5E -> CIRCUMFLEX ACCENT + '_' # 0x5F -> LOW LINE + '`' # 0x60 -> GRAVE ACCENT + 'a' # 0x61 -> LATIN SMALL LETTER A + 'b' # 0x62 -> LATIN SMALL LETTER B + 'c' # 0x63 -> LATIN SMALL LETTER C + 'd' # 0x64 -> LATIN SMALL LETTER D + 'e' # 0x65 -> LATIN SMALL LETTER E + 'f' # 0x66 -> LATIN SMALL LETTER F + 'g' # 0x67 -> LATIN SMALL LETTER G + 'h' # 0x68 -> LATIN SMALL LETTER H + 'i' # 0x69 -> LATIN SMALL LETTER I + 'j' # 0x6A -> LATIN SMALL LETTER J + 'k' # 0x6B -> LATIN SMALL LETTER K + 'l' # 0x6C -> LATIN SMALL LETTER L + 'm' # 0x6D -> LATIN SMALL LETTER M + 'n' # 0x6E -> LATIN SMALL LETTER N + 'o' # 0x6F -> LATIN SMALL LETTER O + 'p' # 0x70 -> LATIN SMALL LETTER P + 'q' # 0x71 -> LATIN SMALL LETTER Q + 'r' # 0x72 -> LATIN SMALL LETTER R + 's' # 0x73 -> LATIN SMALL LETTER S + 't' # 0x74 -> LATIN SMALL LETTER T + 'u' # 0x75 -> LATIN SMALL LETTER U + 'v' # 0x76 -> LATIN SMALL LETTER V + 'w' # 0x77 -> LATIN SMALL LETTER W + 'x' # 0x78 -> LATIN SMALL LETTER X + 'y' # 0x79 -> LATIN SMALL LETTER Y + 'z' # 0x7A -> LATIN SMALL LETTER Z + '{' # 0x7B -> LEFT CURLY BRACKET + '|' # 0x7C -> VERTICAL LINE + '}' # 0x7D -> RIGHT CURLY BRACKET + '~' # 0x7E -> TILDE + '\x7f' # 0x7F -> DELETE + '\x80' # 0x80 -> + '\x81' # 0x81 -> + '\x82' # 0x82 -> + '\x83' # 0x83 -> + '\x84' # 0x84 -> + '\x85' # 0x85 -> + '\x86' # 0x86 -> + '\x87' # 0x87 -> + '\x88' # 0x88 -> + '\x89' # 0x89 -> + '\x8a' # 0x8A -> + '\x8b' # 0x8B -> + '\x8c' # 0x8C -> + '\x8d' # 0x8D -> + '\x8e' # 0x8E -> + '\x8f' # 0x8F -> + '\x90' # 0x90 -> + '\x91' # 0x91 -> + '\x92' # 0x92 -> + '\x93' # 0x93 -> + '\x94' # 0x94 -> + '\x95' # 0x95 -> + '\x96' # 0x96 -> + '\x97' # 0x97 -> + '\x98' # 0x98 -> + '\x99' # 0x99 -> + '\x9a' # 0x9A -> + '\x9b' # 0x9B -> + '\x9c' # 0x9C -> + '\x9d' # 0x9D -> + '\x9e' # 0x9E -> + '\x9f' # 0x9F -> + '\xa0' # 0xA0 -> NO-BREAK SPACE + '\u1e02' # 0xA1 -> LATIN CAPITAL LETTER B WITH DOT ABOVE + '\u1e03' # 0xA2 -> LATIN SMALL LETTER B WITH DOT ABOVE + '\xa3' # 0xA3 -> POUND SIGN + '\u010a' # 0xA4 -> LATIN CAPITAL LETTER C WITH DOT ABOVE + '\u010b' # 0xA5 -> LATIN SMALL LETTER C WITH DOT ABOVE + '\u1e0a' # 0xA6 -> LATIN CAPITAL LETTER D WITH DOT ABOVE + '\xa7' # 0xA7 -> SECTION SIGN + '\u1e80' # 0xA8 -> LATIN CAPITAL LETTER W WITH GRAVE + '\xa9' # 0xA9 -> COPYRIGHT SIGN + '\u1e82' # 0xAA -> LATIN CAPITAL LETTER W WITH ACUTE + '\u1e0b' # 0xAB -> LATIN SMALL LETTER D WITH DOT ABOVE + '\u1ef2' # 0xAC -> LATIN CAPITAL LETTER Y WITH GRAVE + '\xad' # 0xAD -> SOFT HYPHEN + '\xae' # 0xAE -> REGISTERED SIGN + '\u0178' # 0xAF -> LATIN CAPITAL LETTER Y WITH DIAERESIS + '\u1e1e' # 0xB0 -> LATIN CAPITAL LETTER F WITH DOT ABOVE + '\u1e1f' # 0xB1 -> LATIN SMALL LETTER F WITH DOT ABOVE + '\u0120' # 0xB2 -> LATIN CAPITAL LETTER G WITH DOT ABOVE + '\u0121' # 0xB3 -> LATIN SMALL LETTER G WITH DOT ABOVE + '\u1e40' # 0xB4 -> LATIN CAPITAL LETTER M WITH DOT ABOVE + '\u1e41' # 0xB5 -> LATIN SMALL LETTER M WITH DOT ABOVE + '\xb6' # 0xB6 -> PILCROW SIGN + '\u1e56' # 0xB7 -> LATIN CAPITAL LETTER P WITH DOT ABOVE + '\u1e81' # 0xB8 -> LATIN SMALL LETTER W WITH GRAVE + '\u1e57' # 0xB9 -> LATIN SMALL LETTER P WITH DOT ABOVE + '\u1e83' # 0xBA -> LATIN SMALL LETTER W WITH ACUTE + '\u1e60' # 0xBB -> LATIN CAPITAL LETTER S WITH DOT ABOVE + '\u1ef3' # 0xBC -> LATIN SMALL LETTER Y WITH GRAVE + '\u1e84' # 0xBD -> LATIN CAPITAL LETTER W WITH DIAERESIS + '\u1e85' # 0xBE -> LATIN SMALL LETTER W WITH DIAERESIS + '\u1e61' # 0xBF -> LATIN SMALL LETTER S WITH DOT ABOVE + '\xc0' # 0xC0 -> LATIN CAPITAL LETTER A WITH GRAVE + '\xc1' # 0xC1 -> LATIN CAPITAL LETTER A WITH ACUTE + '\xc2' # 0xC2 -> LATIN CAPITAL LETTER A WITH CIRCUMFLEX + '\xc3' # 0xC3 -> LATIN CAPITAL LETTER A WITH TILDE + '\xc4' # 0xC4 -> LATIN CAPITAL LETTER A WITH DIAERESIS + '\xc5' # 0xC5 -> LATIN CAPITAL LETTER A WITH RING ABOVE + '\xc6' # 0xC6 -> LATIN CAPITAL LETTER AE + '\xc7' # 0xC7 -> LATIN CAPITAL LETTER C WITH CEDILLA + '\xc8' # 0xC8 -> LATIN CAPITAL LETTER E WITH GRAVE + '\xc9' # 0xC9 -> LATIN CAPITAL LETTER E WITH ACUTE + '\xca' # 0xCA -> LATIN CAPITAL LETTER E WITH CIRCUMFLEX + '\xcb' # 0xCB -> LATIN CAPITAL LETTER E WITH DIAERESIS + '\xcc' # 0xCC -> LATIN CAPITAL LETTER I WITH GRAVE + '\xcd' # 0xCD -> LATIN CAPITAL LETTER I WITH ACUTE + '\xce' # 0xCE -> LATIN CAPITAL LETTER I WITH CIRCUMFLEX + '\xcf' # 0xCF -> LATIN CAPITAL LETTER I WITH DIAERESIS + '\u0174' # 0xD0 -> LATIN CAPITAL LETTER W WITH CIRCUMFLEX + '\xd1' # 0xD1 -> LATIN CAPITAL LETTER N WITH TILDE + '\xd2' # 0xD2 -> LATIN CAPITAL LETTER O WITH GRAVE + '\xd3' # 0xD3 -> LATIN CAPITAL LETTER O WITH ACUTE + '\xd4' # 0xD4 -> LATIN CAPITAL LETTER O WITH CIRCUMFLEX + '\xd5' # 0xD5 -> LATIN CAPITAL LETTER O WITH TILDE + '\xd6' # 0xD6 -> LATIN CAPITAL LETTER O WITH DIAERESIS + '\u1e6a' # 0xD7 -> LATIN CAPITAL LETTER T WITH DOT ABOVE + '\xd8' # 0xD8 -> LATIN CAPITAL LETTER O WITH STROKE + '\xd9' # 0xD9 -> LATIN CAPITAL LETTER U WITH GRAVE + '\xda' # 0xDA -> LATIN CAPITAL LETTER U WITH ACUTE + '\xdb' # 0xDB -> LATIN CAPITAL LETTER U WITH CIRCUMFLEX + '\xdc' # 0xDC -> LATIN CAPITAL LETTER U WITH DIAERESIS + '\xdd' # 0xDD -> LATIN CAPITAL LETTER Y WITH ACUTE + '\u0176' # 0xDE -> LATIN CAPITAL LETTER Y WITH CIRCUMFLEX + '\xdf' # 0xDF -> LATIN SMALL LETTER SHARP S + '\xe0' # 0xE0 -> LATIN SMALL LETTER A WITH GRAVE + '\xe1' # 0xE1 -> LATIN SMALL LETTER A WITH ACUTE + '\xe2' # 0xE2 -> LATIN SMALL LETTER A WITH CIRCUMFLEX + '\xe3' # 0xE3 -> LATIN SMALL LETTER A WITH TILDE + '\xe4' # 0xE4 -> LATIN SMALL LETTER A WITH DIAERESIS + '\xe5' # 0xE5 -> LATIN SMALL LETTER A WITH RING ABOVE + '\xe6' # 0xE6 -> LATIN SMALL LETTER AE + '\xe7' # 0xE7 -> LATIN SMALL LETTER C WITH CEDILLA + '\xe8' # 0xE8 -> LATIN SMALL LETTER E WITH GRAVE + '\xe9' # 0xE9 -> LATIN SMALL LETTER E WITH ACUTE + '\xea' # 0xEA -> LATIN SMALL LETTER E WITH CIRCUMFLEX + '\xeb' # 0xEB -> LATIN SMALL LETTER E WITH DIAERESIS + '\xec' # 0xEC -> LATIN SMALL LETTER I WITH GRAVE + '\xed' # 0xED -> LATIN SMALL LETTER I WITH ACUTE + '\xee' # 0xEE -> LATIN SMALL LETTER I WITH CIRCUMFLEX + '\xef' # 0xEF -> LATIN SMALL LETTER I WITH DIAERESIS + '\u0175' # 0xF0 -> LATIN SMALL LETTER W WITH CIRCUMFLEX + '\xf1' # 0xF1 -> LATIN SMALL LETTER N WITH TILDE + '\xf2' # 0xF2 -> LATIN SMALL LETTER O WITH GRAVE + '\xf3' # 0xF3 -> LATIN SMALL LETTER O WITH ACUTE + '\xf4' # 0xF4 -> LATIN SMALL LETTER O WITH CIRCUMFLEX + '\xf5' # 0xF5 -> LATIN SMALL LETTER O WITH TILDE + '\xf6' # 0xF6 -> LATIN SMALL LETTER O WITH DIAERESIS + '\u1e6b' # 0xF7 -> LATIN SMALL LETTER T WITH DOT ABOVE + '\xf8' # 0xF8 -> LATIN SMALL LETTER O WITH STROKE + '\xf9' # 0xF9 -> LATIN SMALL LETTER U WITH GRAVE + '\xfa' # 0xFA -> LATIN SMALL LETTER U WITH ACUTE + '\xfb' # 0xFB -> LATIN SMALL LETTER U WITH CIRCUMFLEX + '\xfc' # 0xFC -> LATIN SMALL LETTER U WITH DIAERESIS + '\xfd' # 0xFD -> LATIN SMALL LETTER Y WITH ACUTE + '\u0177' # 0xFE -> LATIN SMALL LETTER Y WITH CIRCUMFLEX + '\xff' # 0xFF -> LATIN SMALL LETTER Y WITH DIAERESIS +) + +### Encoding table +encoding_table=codecs.charmap_build(decoding_table) diff --git a/env/Lib/encodings/iso8859_15.py b/env/Lib/encodings/iso8859_15.py new file mode 100644 index 0000000..43bdecd --- /dev/null +++ b/env/Lib/encodings/iso8859_15.py @@ -0,0 +1,307 @@ +""" Python Character Mapping Codec iso8859_15 generated from 'MAPPINGS/ISO8859/8859-15.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='iso8859-15', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) + + +### Decoding Table + +decoding_table = ( + '\x00' # 0x00 -> NULL + '\x01' # 0x01 -> START OF HEADING + '\x02' # 0x02 -> START OF TEXT + '\x03' # 0x03 -> END OF TEXT + '\x04' # 0x04 -> END OF TRANSMISSION + '\x05' # 0x05 -> ENQUIRY + '\x06' # 0x06 -> ACKNOWLEDGE + '\x07' # 0x07 -> BELL + '\x08' # 0x08 -> BACKSPACE + '\t' # 0x09 -> HORIZONTAL TABULATION + '\n' # 0x0A -> LINE FEED + '\x0b' # 0x0B -> VERTICAL TABULATION + '\x0c' # 0x0C -> FORM FEED + '\r' # 0x0D -> CARRIAGE RETURN + '\x0e' # 0x0E -> SHIFT OUT + '\x0f' # 0x0F -> SHIFT IN + '\x10' # 0x10 -> DATA LINK ESCAPE + '\x11' # 0x11 -> DEVICE CONTROL ONE + '\x12' # 0x12 -> DEVICE CONTROL TWO + '\x13' # 0x13 -> DEVICE CONTROL THREE + '\x14' # 0x14 -> DEVICE CONTROL FOUR + '\x15' # 0x15 -> NEGATIVE ACKNOWLEDGE + '\x16' # 0x16 -> SYNCHRONOUS IDLE + '\x17' # 0x17 -> END OF TRANSMISSION BLOCK + '\x18' # 0x18 -> CANCEL + '\x19' # 0x19 -> END OF MEDIUM + '\x1a' # 0x1A -> SUBSTITUTE + '\x1b' # 0x1B -> ESCAPE + '\x1c' # 0x1C -> FILE SEPARATOR + '\x1d' # 0x1D -> GROUP SEPARATOR + '\x1e' # 0x1E -> RECORD SEPARATOR + '\x1f' # 0x1F -> UNIT SEPARATOR + ' ' # 0x20 -> SPACE + '!' # 0x21 -> EXCLAMATION MARK + '"' # 0x22 -> QUOTATION MARK + '#' # 0x23 -> NUMBER SIGN + '$' # 0x24 -> DOLLAR SIGN + '%' # 0x25 -> PERCENT SIGN + '&' # 0x26 -> AMPERSAND + "'" # 0x27 -> APOSTROPHE + '(' # 0x28 -> LEFT PARENTHESIS + ')' # 0x29 -> RIGHT PARENTHESIS + '*' # 0x2A -> ASTERISK + '+' # 0x2B -> PLUS SIGN + ',' # 0x2C -> COMMA + '-' # 0x2D -> HYPHEN-MINUS + '.' # 0x2E -> FULL STOP + '/' # 0x2F -> SOLIDUS + '0' # 0x30 -> DIGIT ZERO + '1' # 0x31 -> DIGIT ONE + '2' # 0x32 -> DIGIT TWO + '3' # 0x33 -> DIGIT THREE + '4' # 0x34 -> DIGIT FOUR + '5' # 0x35 -> DIGIT FIVE + '6' # 0x36 -> DIGIT SIX + '7' # 0x37 -> DIGIT SEVEN + '8' # 0x38 -> DIGIT EIGHT + '9' # 0x39 -> DIGIT NINE + ':' # 0x3A -> COLON + ';' # 0x3B -> SEMICOLON + '<' # 0x3C -> LESS-THAN SIGN + '=' # 0x3D -> EQUALS SIGN + '>' # 0x3E -> GREATER-THAN SIGN + '?' # 0x3F -> QUESTION MARK + '@' # 0x40 -> COMMERCIAL AT + 'A' # 0x41 -> LATIN CAPITAL LETTER A + 'B' # 0x42 -> LATIN CAPITAL LETTER B + 'C' # 0x43 -> LATIN CAPITAL LETTER C + 'D' # 0x44 -> LATIN CAPITAL LETTER D + 'E' # 0x45 -> LATIN CAPITAL LETTER E + 'F' # 0x46 -> LATIN CAPITAL LETTER F + 'G' # 0x47 -> LATIN CAPITAL LETTER G + 'H' # 0x48 -> LATIN CAPITAL LETTER H + 'I' # 0x49 -> LATIN CAPITAL LETTER I + 'J' # 0x4A -> LATIN CAPITAL LETTER J + 'K' # 0x4B -> LATIN CAPITAL LETTER K + 'L' # 0x4C -> LATIN CAPITAL LETTER L + 'M' # 0x4D -> LATIN CAPITAL LETTER M + 'N' # 0x4E -> LATIN CAPITAL LETTER N + 'O' # 0x4F -> LATIN CAPITAL LETTER O + 'P' # 0x50 -> LATIN CAPITAL LETTER P + 'Q' # 0x51 -> LATIN CAPITAL LETTER Q + 'R' # 0x52 -> LATIN CAPITAL LETTER R + 'S' # 0x53 -> LATIN CAPITAL LETTER S + 'T' # 0x54 -> LATIN CAPITAL LETTER T + 'U' # 0x55 -> LATIN CAPITAL LETTER U + 'V' # 0x56 -> LATIN CAPITAL LETTER V + 'W' # 0x57 -> LATIN CAPITAL LETTER W + 'X' # 0x58 -> LATIN CAPITAL LETTER X + 'Y' # 0x59 -> LATIN CAPITAL LETTER Y + 'Z' # 0x5A -> LATIN CAPITAL LETTER Z + '[' # 0x5B -> LEFT SQUARE BRACKET + '\\' # 0x5C -> REVERSE SOLIDUS + ']' # 0x5D -> RIGHT SQUARE BRACKET + '^' # 0x5E -> CIRCUMFLEX ACCENT + '_' # 0x5F -> LOW LINE + '`' # 0x60 -> GRAVE ACCENT + 'a' # 0x61 -> LATIN SMALL LETTER A + 'b' # 0x62 -> LATIN SMALL LETTER B + 'c' # 0x63 -> LATIN SMALL LETTER C + 'd' # 0x64 -> LATIN SMALL LETTER D + 'e' # 0x65 -> LATIN SMALL LETTER E + 'f' # 0x66 -> LATIN SMALL LETTER F + 'g' # 0x67 -> LATIN SMALL LETTER G + 'h' # 0x68 -> LATIN SMALL LETTER H + 'i' # 0x69 -> LATIN SMALL LETTER I + 'j' # 0x6A -> LATIN SMALL LETTER J + 'k' # 0x6B -> LATIN SMALL LETTER K + 'l' # 0x6C -> LATIN SMALL LETTER L + 'm' # 0x6D -> LATIN SMALL LETTER M + 'n' # 0x6E -> LATIN SMALL LETTER N + 'o' # 0x6F -> LATIN SMALL LETTER O + 'p' # 0x70 -> LATIN SMALL LETTER P + 'q' # 0x71 -> LATIN SMALL LETTER Q + 'r' # 0x72 -> LATIN SMALL LETTER R + 's' # 0x73 -> LATIN SMALL LETTER S + 't' # 0x74 -> LATIN SMALL LETTER T + 'u' # 0x75 -> LATIN SMALL LETTER U + 'v' # 0x76 -> LATIN SMALL LETTER V + 'w' # 0x77 -> LATIN SMALL LETTER W + 'x' # 0x78 -> LATIN SMALL LETTER X + 'y' # 0x79 -> LATIN SMALL LETTER Y + 'z' # 0x7A -> LATIN SMALL LETTER Z + '{' # 0x7B -> LEFT CURLY BRACKET + '|' # 0x7C -> VERTICAL LINE + '}' # 0x7D -> RIGHT CURLY BRACKET + '~' # 0x7E -> TILDE + '\x7f' # 0x7F -> DELETE + '\x80' # 0x80 -> + '\x81' # 0x81 -> + '\x82' # 0x82 -> + '\x83' # 0x83 -> + '\x84' # 0x84 -> + '\x85' # 0x85 -> + '\x86' # 0x86 -> + '\x87' # 0x87 -> + '\x88' # 0x88 -> + '\x89' # 0x89 -> + '\x8a' # 0x8A -> + '\x8b' # 0x8B -> + '\x8c' # 0x8C -> + '\x8d' # 0x8D -> + '\x8e' # 0x8E -> + '\x8f' # 0x8F -> + '\x90' # 0x90 -> + '\x91' # 0x91 -> + '\x92' # 0x92 -> + '\x93' # 0x93 -> + '\x94' # 0x94 -> + '\x95' # 0x95 -> + '\x96' # 0x96 -> + '\x97' # 0x97 -> + '\x98' # 0x98 -> + '\x99' # 0x99 -> + '\x9a' # 0x9A -> + '\x9b' # 0x9B -> + '\x9c' # 0x9C -> + '\x9d' # 0x9D -> + '\x9e' # 0x9E -> + '\x9f' # 0x9F -> + '\xa0' # 0xA0 -> NO-BREAK SPACE + '\xa1' # 0xA1 -> INVERTED EXCLAMATION MARK + '\xa2' # 0xA2 -> CENT SIGN + '\xa3' # 0xA3 -> POUND SIGN + '\u20ac' # 0xA4 -> EURO SIGN + '\xa5' # 0xA5 -> YEN SIGN + '\u0160' # 0xA6 -> LATIN CAPITAL LETTER S WITH CARON + '\xa7' # 0xA7 -> SECTION SIGN + '\u0161' # 0xA8 -> LATIN SMALL LETTER S WITH CARON + '\xa9' # 0xA9 -> COPYRIGHT SIGN + '\xaa' # 0xAA -> FEMININE ORDINAL INDICATOR + '\xab' # 0xAB -> LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + '\xac' # 0xAC -> NOT SIGN + '\xad' # 0xAD -> SOFT HYPHEN + '\xae' # 0xAE -> REGISTERED SIGN + '\xaf' # 0xAF -> MACRON + '\xb0' # 0xB0 -> DEGREE SIGN + '\xb1' # 0xB1 -> PLUS-MINUS SIGN + '\xb2' # 0xB2 -> SUPERSCRIPT TWO + '\xb3' # 0xB3 -> SUPERSCRIPT THREE + '\u017d' # 0xB4 -> LATIN CAPITAL LETTER Z WITH CARON + '\xb5' # 0xB5 -> MICRO SIGN + '\xb6' # 0xB6 -> PILCROW SIGN + '\xb7' # 0xB7 -> MIDDLE DOT + '\u017e' # 0xB8 -> LATIN SMALL LETTER Z WITH CARON + '\xb9' # 0xB9 -> SUPERSCRIPT ONE + '\xba' # 0xBA -> MASCULINE ORDINAL INDICATOR + '\xbb' # 0xBB -> RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + '\u0152' # 0xBC -> LATIN CAPITAL LIGATURE OE + '\u0153' # 0xBD -> LATIN SMALL LIGATURE OE + '\u0178' # 0xBE -> LATIN CAPITAL LETTER Y WITH DIAERESIS + '\xbf' # 0xBF -> INVERTED QUESTION MARK + '\xc0' # 0xC0 -> LATIN CAPITAL LETTER A WITH GRAVE + '\xc1' # 0xC1 -> LATIN CAPITAL LETTER A WITH ACUTE + '\xc2' # 0xC2 -> LATIN CAPITAL LETTER A WITH CIRCUMFLEX + '\xc3' # 0xC3 -> LATIN CAPITAL LETTER A WITH TILDE + '\xc4' # 0xC4 -> LATIN CAPITAL LETTER A WITH DIAERESIS + '\xc5' # 0xC5 -> LATIN CAPITAL LETTER A WITH RING ABOVE + '\xc6' # 0xC6 -> LATIN CAPITAL LETTER AE + '\xc7' # 0xC7 -> LATIN CAPITAL LETTER C WITH CEDILLA + '\xc8' # 0xC8 -> LATIN CAPITAL LETTER E WITH GRAVE + '\xc9' # 0xC9 -> LATIN CAPITAL LETTER E WITH ACUTE + '\xca' # 0xCA -> LATIN CAPITAL LETTER E WITH CIRCUMFLEX + '\xcb' # 0xCB -> LATIN CAPITAL LETTER E WITH DIAERESIS + '\xcc' # 0xCC -> LATIN CAPITAL LETTER I WITH GRAVE + '\xcd' # 0xCD -> LATIN CAPITAL LETTER I WITH ACUTE + '\xce' # 0xCE -> LATIN CAPITAL LETTER I WITH CIRCUMFLEX + '\xcf' # 0xCF -> LATIN CAPITAL LETTER I WITH DIAERESIS + '\xd0' # 0xD0 -> LATIN CAPITAL LETTER ETH + '\xd1' # 0xD1 -> LATIN CAPITAL LETTER N WITH TILDE + '\xd2' # 0xD2 -> LATIN CAPITAL LETTER O WITH GRAVE + '\xd3' # 0xD3 -> LATIN CAPITAL LETTER O WITH ACUTE + '\xd4' # 0xD4 -> LATIN CAPITAL LETTER O WITH CIRCUMFLEX + '\xd5' # 0xD5 -> LATIN CAPITAL LETTER O WITH TILDE + '\xd6' # 0xD6 -> LATIN CAPITAL LETTER O WITH DIAERESIS + '\xd7' # 0xD7 -> MULTIPLICATION SIGN + '\xd8' # 0xD8 -> LATIN CAPITAL LETTER O WITH STROKE + '\xd9' # 0xD9 -> LATIN CAPITAL LETTER U WITH GRAVE + '\xda' # 0xDA -> LATIN CAPITAL LETTER U WITH ACUTE + '\xdb' # 0xDB -> LATIN CAPITAL LETTER U WITH CIRCUMFLEX + '\xdc' # 0xDC -> LATIN CAPITAL LETTER U WITH DIAERESIS + '\xdd' # 0xDD -> LATIN CAPITAL LETTER Y WITH ACUTE + '\xde' # 0xDE -> LATIN CAPITAL LETTER THORN + '\xdf' # 0xDF -> LATIN SMALL LETTER SHARP S + '\xe0' # 0xE0 -> LATIN SMALL LETTER A WITH GRAVE + '\xe1' # 0xE1 -> LATIN SMALL LETTER A WITH ACUTE + '\xe2' # 0xE2 -> LATIN SMALL LETTER A WITH CIRCUMFLEX + '\xe3' # 0xE3 -> LATIN SMALL LETTER A WITH TILDE + '\xe4' # 0xE4 -> LATIN SMALL LETTER A WITH DIAERESIS + '\xe5' # 0xE5 -> LATIN SMALL LETTER A WITH RING ABOVE + '\xe6' # 0xE6 -> LATIN SMALL LETTER AE + '\xe7' # 0xE7 -> LATIN SMALL LETTER C WITH CEDILLA + '\xe8' # 0xE8 -> LATIN SMALL LETTER E WITH GRAVE + '\xe9' # 0xE9 -> LATIN SMALL LETTER E WITH ACUTE + '\xea' # 0xEA -> LATIN SMALL LETTER E WITH CIRCUMFLEX + '\xeb' # 0xEB -> LATIN SMALL LETTER E WITH DIAERESIS + '\xec' # 0xEC -> LATIN SMALL LETTER I WITH GRAVE + '\xed' # 0xED -> LATIN SMALL LETTER I WITH ACUTE + '\xee' # 0xEE -> LATIN SMALL LETTER I WITH CIRCUMFLEX + '\xef' # 0xEF -> LATIN SMALL LETTER I WITH DIAERESIS + '\xf0' # 0xF0 -> LATIN SMALL LETTER ETH + '\xf1' # 0xF1 -> LATIN SMALL LETTER N WITH TILDE + '\xf2' # 0xF2 -> LATIN SMALL LETTER O WITH GRAVE + '\xf3' # 0xF3 -> LATIN SMALL LETTER O WITH ACUTE + '\xf4' # 0xF4 -> LATIN SMALL LETTER O WITH CIRCUMFLEX + '\xf5' # 0xF5 -> LATIN SMALL LETTER O WITH TILDE + '\xf6' # 0xF6 -> LATIN SMALL LETTER O WITH DIAERESIS + '\xf7' # 0xF7 -> DIVISION SIGN + '\xf8' # 0xF8 -> LATIN SMALL LETTER O WITH STROKE + '\xf9' # 0xF9 -> LATIN SMALL LETTER U WITH GRAVE + '\xfa' # 0xFA -> LATIN SMALL LETTER U WITH ACUTE + '\xfb' # 0xFB -> LATIN SMALL LETTER U WITH CIRCUMFLEX + '\xfc' # 0xFC -> LATIN SMALL LETTER U WITH DIAERESIS + '\xfd' # 0xFD -> LATIN SMALL LETTER Y WITH ACUTE + '\xfe' # 0xFE -> LATIN SMALL LETTER THORN + '\xff' # 0xFF -> LATIN SMALL LETTER Y WITH DIAERESIS +) + +### Encoding table +encoding_table=codecs.charmap_build(decoding_table) diff --git a/env/Lib/encodings/iso8859_16.py b/env/Lib/encodings/iso8859_16.py new file mode 100644 index 0000000..e70c96e --- /dev/null +++ b/env/Lib/encodings/iso8859_16.py @@ -0,0 +1,307 @@ +""" Python Character Mapping Codec iso8859_16 generated from 'MAPPINGS/ISO8859/8859-16.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='iso8859-16', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) + + +### Decoding Table + +decoding_table = ( + '\x00' # 0x00 -> NULL + '\x01' # 0x01 -> START OF HEADING + '\x02' # 0x02 -> START OF TEXT + '\x03' # 0x03 -> END OF TEXT + '\x04' # 0x04 -> END OF TRANSMISSION + '\x05' # 0x05 -> ENQUIRY + '\x06' # 0x06 -> ACKNOWLEDGE + '\x07' # 0x07 -> BELL + '\x08' # 0x08 -> BACKSPACE + '\t' # 0x09 -> HORIZONTAL TABULATION + '\n' # 0x0A -> LINE FEED + '\x0b' # 0x0B -> VERTICAL TABULATION + '\x0c' # 0x0C -> FORM FEED + '\r' # 0x0D -> CARRIAGE RETURN + '\x0e' # 0x0E -> SHIFT OUT + '\x0f' # 0x0F -> SHIFT IN + '\x10' # 0x10 -> DATA LINK ESCAPE + '\x11' # 0x11 -> DEVICE CONTROL ONE + '\x12' # 0x12 -> DEVICE CONTROL TWO + '\x13' # 0x13 -> DEVICE CONTROL THREE + '\x14' # 0x14 -> DEVICE CONTROL FOUR + '\x15' # 0x15 -> NEGATIVE ACKNOWLEDGE + '\x16' # 0x16 -> SYNCHRONOUS IDLE + '\x17' # 0x17 -> END OF TRANSMISSION BLOCK + '\x18' # 0x18 -> CANCEL + '\x19' # 0x19 -> END OF MEDIUM + '\x1a' # 0x1A -> SUBSTITUTE + '\x1b' # 0x1B -> ESCAPE + '\x1c' # 0x1C -> FILE SEPARATOR + '\x1d' # 0x1D -> GROUP SEPARATOR + '\x1e' # 0x1E -> RECORD SEPARATOR + '\x1f' # 0x1F -> UNIT SEPARATOR + ' ' # 0x20 -> SPACE + '!' # 0x21 -> EXCLAMATION MARK + '"' # 0x22 -> QUOTATION MARK + '#' # 0x23 -> NUMBER SIGN + '$' # 0x24 -> DOLLAR SIGN + '%' # 0x25 -> PERCENT SIGN + '&' # 0x26 -> AMPERSAND + "'" # 0x27 -> APOSTROPHE + '(' # 0x28 -> LEFT PARENTHESIS + ')' # 0x29 -> RIGHT PARENTHESIS + '*' # 0x2A -> ASTERISK + '+' # 0x2B -> PLUS SIGN + ',' # 0x2C -> COMMA + '-' # 0x2D -> HYPHEN-MINUS + '.' # 0x2E -> FULL STOP + '/' # 0x2F -> SOLIDUS + '0' # 0x30 -> DIGIT ZERO + '1' # 0x31 -> DIGIT ONE + '2' # 0x32 -> DIGIT TWO + '3' # 0x33 -> DIGIT THREE + '4' # 0x34 -> DIGIT FOUR + '5' # 0x35 -> DIGIT FIVE + '6' # 0x36 -> DIGIT SIX + '7' # 0x37 -> DIGIT SEVEN + '8' # 0x38 -> DIGIT EIGHT + '9' # 0x39 -> DIGIT NINE + ':' # 0x3A -> COLON + ';' # 0x3B -> SEMICOLON + '<' # 0x3C -> LESS-THAN SIGN + '=' # 0x3D -> EQUALS SIGN + '>' # 0x3E -> GREATER-THAN SIGN + '?' # 0x3F -> QUESTION MARK + '@' # 0x40 -> COMMERCIAL AT + 'A' # 0x41 -> LATIN CAPITAL LETTER A + 'B' # 0x42 -> LATIN CAPITAL LETTER B + 'C' # 0x43 -> LATIN CAPITAL LETTER C + 'D' # 0x44 -> LATIN CAPITAL LETTER D + 'E' # 0x45 -> LATIN CAPITAL LETTER E + 'F' # 0x46 -> LATIN CAPITAL LETTER F + 'G' # 0x47 -> LATIN CAPITAL LETTER G + 'H' # 0x48 -> LATIN CAPITAL LETTER H + 'I' # 0x49 -> LATIN CAPITAL LETTER I + 'J' # 0x4A -> LATIN CAPITAL LETTER J + 'K' # 0x4B -> LATIN CAPITAL LETTER K + 'L' # 0x4C -> LATIN CAPITAL LETTER L + 'M' # 0x4D -> LATIN CAPITAL LETTER M + 'N' # 0x4E -> LATIN CAPITAL LETTER N + 'O' # 0x4F -> LATIN CAPITAL LETTER O + 'P' # 0x50 -> LATIN CAPITAL LETTER P + 'Q' # 0x51 -> LATIN CAPITAL LETTER Q + 'R' # 0x52 -> LATIN CAPITAL LETTER R + 'S' # 0x53 -> LATIN CAPITAL LETTER S + 'T' # 0x54 -> LATIN CAPITAL LETTER T + 'U' # 0x55 -> LATIN CAPITAL LETTER U + 'V' # 0x56 -> LATIN CAPITAL LETTER V + 'W' # 0x57 -> LATIN CAPITAL LETTER W + 'X' # 0x58 -> LATIN CAPITAL LETTER X + 'Y' # 0x59 -> LATIN CAPITAL LETTER Y + 'Z' # 0x5A -> LATIN CAPITAL LETTER Z + '[' # 0x5B -> LEFT SQUARE BRACKET + '\\' # 0x5C -> REVERSE SOLIDUS + ']' # 0x5D -> RIGHT SQUARE BRACKET + '^' # 0x5E -> CIRCUMFLEX ACCENT + '_' # 0x5F -> LOW LINE + '`' # 0x60 -> GRAVE ACCENT + 'a' # 0x61 -> LATIN SMALL LETTER A + 'b' # 0x62 -> LATIN SMALL LETTER B + 'c' # 0x63 -> LATIN SMALL LETTER C + 'd' # 0x64 -> LATIN SMALL LETTER D + 'e' # 0x65 -> LATIN SMALL LETTER E + 'f' # 0x66 -> LATIN SMALL LETTER F + 'g' # 0x67 -> LATIN SMALL LETTER G + 'h' # 0x68 -> LATIN SMALL LETTER H + 'i' # 0x69 -> LATIN SMALL LETTER I + 'j' # 0x6A -> LATIN SMALL LETTER J + 'k' # 0x6B -> LATIN SMALL LETTER K + 'l' # 0x6C -> LATIN SMALL LETTER L + 'm' # 0x6D -> LATIN SMALL LETTER M + 'n' # 0x6E -> LATIN SMALL LETTER N + 'o' # 0x6F -> LATIN SMALL LETTER O + 'p' # 0x70 -> LATIN SMALL LETTER P + 'q' # 0x71 -> LATIN SMALL LETTER Q + 'r' # 0x72 -> LATIN SMALL LETTER R + 's' # 0x73 -> LATIN SMALL LETTER S + 't' # 0x74 -> LATIN SMALL LETTER T + 'u' # 0x75 -> LATIN SMALL LETTER U + 'v' # 0x76 -> LATIN SMALL LETTER V + 'w' # 0x77 -> LATIN SMALL LETTER W + 'x' # 0x78 -> LATIN SMALL LETTER X + 'y' # 0x79 -> LATIN SMALL LETTER Y + 'z' # 0x7A -> LATIN SMALL LETTER Z + '{' # 0x7B -> LEFT CURLY BRACKET + '|' # 0x7C -> VERTICAL LINE + '}' # 0x7D -> RIGHT CURLY BRACKET + '~' # 0x7E -> TILDE + '\x7f' # 0x7F -> DELETE + '\x80' # 0x80 -> + '\x81' # 0x81 -> + '\x82' # 0x82 -> + '\x83' # 0x83 -> + '\x84' # 0x84 -> + '\x85' # 0x85 -> + '\x86' # 0x86 -> + '\x87' # 0x87 -> + '\x88' # 0x88 -> + '\x89' # 0x89 -> + '\x8a' # 0x8A -> + '\x8b' # 0x8B -> + '\x8c' # 0x8C -> + '\x8d' # 0x8D -> + '\x8e' # 0x8E -> + '\x8f' # 0x8F -> + '\x90' # 0x90 -> + '\x91' # 0x91 -> + '\x92' # 0x92 -> + '\x93' # 0x93 -> + '\x94' # 0x94 -> + '\x95' # 0x95 -> + '\x96' # 0x96 -> + '\x97' # 0x97 -> + '\x98' # 0x98 -> + '\x99' # 0x99 -> + '\x9a' # 0x9A -> + '\x9b' # 0x9B -> + '\x9c' # 0x9C -> + '\x9d' # 0x9D -> + '\x9e' # 0x9E -> + '\x9f' # 0x9F -> + '\xa0' # 0xA0 -> NO-BREAK SPACE + '\u0104' # 0xA1 -> LATIN CAPITAL LETTER A WITH OGONEK + '\u0105' # 0xA2 -> LATIN SMALL LETTER A WITH OGONEK + '\u0141' # 0xA3 -> LATIN CAPITAL LETTER L WITH STROKE + '\u20ac' # 0xA4 -> EURO SIGN + '\u201e' # 0xA5 -> DOUBLE LOW-9 QUOTATION MARK + '\u0160' # 0xA6 -> LATIN CAPITAL LETTER S WITH CARON + '\xa7' # 0xA7 -> SECTION SIGN + '\u0161' # 0xA8 -> LATIN SMALL LETTER S WITH CARON + '\xa9' # 0xA9 -> COPYRIGHT SIGN + '\u0218' # 0xAA -> LATIN CAPITAL LETTER S WITH COMMA BELOW + '\xab' # 0xAB -> LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + '\u0179' # 0xAC -> LATIN CAPITAL LETTER Z WITH ACUTE + '\xad' # 0xAD -> SOFT HYPHEN + '\u017a' # 0xAE -> LATIN SMALL LETTER Z WITH ACUTE + '\u017b' # 0xAF -> LATIN CAPITAL LETTER Z WITH DOT ABOVE + '\xb0' # 0xB0 -> DEGREE SIGN + '\xb1' # 0xB1 -> PLUS-MINUS SIGN + '\u010c' # 0xB2 -> LATIN CAPITAL LETTER C WITH CARON + '\u0142' # 0xB3 -> LATIN SMALL LETTER L WITH STROKE + '\u017d' # 0xB4 -> LATIN CAPITAL LETTER Z WITH CARON + '\u201d' # 0xB5 -> RIGHT DOUBLE QUOTATION MARK + '\xb6' # 0xB6 -> PILCROW SIGN + '\xb7' # 0xB7 -> MIDDLE DOT + '\u017e' # 0xB8 -> LATIN SMALL LETTER Z WITH CARON + '\u010d' # 0xB9 -> LATIN SMALL LETTER C WITH CARON + '\u0219' # 0xBA -> LATIN SMALL LETTER S WITH COMMA BELOW + '\xbb' # 0xBB -> RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + '\u0152' # 0xBC -> LATIN CAPITAL LIGATURE OE + '\u0153' # 0xBD -> LATIN SMALL LIGATURE OE + '\u0178' # 0xBE -> LATIN CAPITAL LETTER Y WITH DIAERESIS + '\u017c' # 0xBF -> LATIN SMALL LETTER Z WITH DOT ABOVE + '\xc0' # 0xC0 -> LATIN CAPITAL LETTER A WITH GRAVE + '\xc1' # 0xC1 -> LATIN CAPITAL LETTER A WITH ACUTE + '\xc2' # 0xC2 -> LATIN CAPITAL LETTER A WITH CIRCUMFLEX + '\u0102' # 0xC3 -> LATIN CAPITAL LETTER A WITH BREVE + '\xc4' # 0xC4 -> LATIN CAPITAL LETTER A WITH DIAERESIS + '\u0106' # 0xC5 -> LATIN CAPITAL LETTER C WITH ACUTE + '\xc6' # 0xC6 -> LATIN CAPITAL LETTER AE + '\xc7' # 0xC7 -> LATIN CAPITAL LETTER C WITH CEDILLA + '\xc8' # 0xC8 -> LATIN CAPITAL LETTER E WITH GRAVE + '\xc9' # 0xC9 -> LATIN CAPITAL LETTER E WITH ACUTE + '\xca' # 0xCA -> LATIN CAPITAL LETTER E WITH CIRCUMFLEX + '\xcb' # 0xCB -> LATIN CAPITAL LETTER E WITH DIAERESIS + '\xcc' # 0xCC -> LATIN CAPITAL LETTER I WITH GRAVE + '\xcd' # 0xCD -> LATIN CAPITAL LETTER I WITH ACUTE + '\xce' # 0xCE -> LATIN CAPITAL LETTER I WITH CIRCUMFLEX + '\xcf' # 0xCF -> LATIN CAPITAL LETTER I WITH DIAERESIS + '\u0110' # 0xD0 -> LATIN CAPITAL LETTER D WITH STROKE + '\u0143' # 0xD1 -> LATIN CAPITAL LETTER N WITH ACUTE + '\xd2' # 0xD2 -> LATIN CAPITAL LETTER O WITH GRAVE + '\xd3' # 0xD3 -> LATIN CAPITAL LETTER O WITH ACUTE + '\xd4' # 0xD4 -> LATIN CAPITAL LETTER O WITH CIRCUMFLEX + '\u0150' # 0xD5 -> LATIN CAPITAL LETTER O WITH DOUBLE ACUTE + '\xd6' # 0xD6 -> LATIN CAPITAL LETTER O WITH DIAERESIS + '\u015a' # 0xD7 -> LATIN CAPITAL LETTER S WITH ACUTE + '\u0170' # 0xD8 -> LATIN CAPITAL LETTER U WITH DOUBLE ACUTE + '\xd9' # 0xD9 -> LATIN CAPITAL LETTER U WITH GRAVE + '\xda' # 0xDA -> LATIN CAPITAL LETTER U WITH ACUTE + '\xdb' # 0xDB -> LATIN CAPITAL LETTER U WITH CIRCUMFLEX + '\xdc' # 0xDC -> LATIN CAPITAL LETTER U WITH DIAERESIS + '\u0118' # 0xDD -> LATIN CAPITAL LETTER E WITH OGONEK + '\u021a' # 0xDE -> LATIN CAPITAL LETTER T WITH COMMA BELOW + '\xdf' # 0xDF -> LATIN SMALL LETTER SHARP S + '\xe0' # 0xE0 -> LATIN SMALL LETTER A WITH GRAVE + '\xe1' # 0xE1 -> LATIN SMALL LETTER A WITH ACUTE + '\xe2' # 0xE2 -> LATIN SMALL LETTER A WITH CIRCUMFLEX + '\u0103' # 0xE3 -> LATIN SMALL LETTER A WITH BREVE + '\xe4' # 0xE4 -> LATIN SMALL LETTER A WITH DIAERESIS + '\u0107' # 0xE5 -> LATIN SMALL LETTER C WITH ACUTE + '\xe6' # 0xE6 -> LATIN SMALL LETTER AE + '\xe7' # 0xE7 -> LATIN SMALL LETTER C WITH CEDILLA + '\xe8' # 0xE8 -> LATIN SMALL LETTER E WITH GRAVE + '\xe9' # 0xE9 -> LATIN SMALL LETTER E WITH ACUTE + '\xea' # 0xEA -> LATIN SMALL LETTER E WITH CIRCUMFLEX + '\xeb' # 0xEB -> LATIN SMALL LETTER E WITH DIAERESIS + '\xec' # 0xEC -> LATIN SMALL LETTER I WITH GRAVE + '\xed' # 0xED -> LATIN SMALL LETTER I WITH ACUTE + '\xee' # 0xEE -> LATIN SMALL LETTER I WITH CIRCUMFLEX + '\xef' # 0xEF -> LATIN SMALL LETTER I WITH DIAERESIS + '\u0111' # 0xF0 -> LATIN SMALL LETTER D WITH STROKE + '\u0144' # 0xF1 -> LATIN SMALL LETTER N WITH ACUTE + '\xf2' # 0xF2 -> LATIN SMALL LETTER O WITH GRAVE + '\xf3' # 0xF3 -> LATIN SMALL LETTER O WITH ACUTE + '\xf4' # 0xF4 -> LATIN SMALL LETTER O WITH CIRCUMFLEX + '\u0151' # 0xF5 -> LATIN SMALL LETTER O WITH DOUBLE ACUTE + '\xf6' # 0xF6 -> LATIN SMALL LETTER O WITH DIAERESIS + '\u015b' # 0xF7 -> LATIN SMALL LETTER S WITH ACUTE + '\u0171' # 0xF8 -> LATIN SMALL LETTER U WITH DOUBLE ACUTE + '\xf9' # 0xF9 -> LATIN SMALL LETTER U WITH GRAVE + '\xfa' # 0xFA -> LATIN SMALL LETTER U WITH ACUTE + '\xfb' # 0xFB -> LATIN SMALL LETTER U WITH CIRCUMFLEX + '\xfc' # 0xFC -> LATIN SMALL LETTER U WITH DIAERESIS + '\u0119' # 0xFD -> LATIN SMALL LETTER E WITH OGONEK + '\u021b' # 0xFE -> LATIN SMALL LETTER T WITH COMMA BELOW + '\xff' # 0xFF -> LATIN SMALL LETTER Y WITH DIAERESIS +) + +### Encoding table +encoding_table=codecs.charmap_build(decoding_table) diff --git a/env/Lib/encodings/iso8859_2.py b/env/Lib/encodings/iso8859_2.py new file mode 100644 index 0000000..3698747 --- /dev/null +++ b/env/Lib/encodings/iso8859_2.py @@ -0,0 +1,307 @@ +""" Python Character Mapping Codec iso8859_2 generated from 'MAPPINGS/ISO8859/8859-2.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='iso8859-2', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) + + +### Decoding Table + +decoding_table = ( + '\x00' # 0x00 -> NULL + '\x01' # 0x01 -> START OF HEADING + '\x02' # 0x02 -> START OF TEXT + '\x03' # 0x03 -> END OF TEXT + '\x04' # 0x04 -> END OF TRANSMISSION + '\x05' # 0x05 -> ENQUIRY + '\x06' # 0x06 -> ACKNOWLEDGE + '\x07' # 0x07 -> BELL + '\x08' # 0x08 -> BACKSPACE + '\t' # 0x09 -> HORIZONTAL TABULATION + '\n' # 0x0A -> LINE FEED + '\x0b' # 0x0B -> VERTICAL TABULATION + '\x0c' # 0x0C -> FORM FEED + '\r' # 0x0D -> CARRIAGE RETURN + '\x0e' # 0x0E -> SHIFT OUT + '\x0f' # 0x0F -> SHIFT IN + '\x10' # 0x10 -> DATA LINK ESCAPE + '\x11' # 0x11 -> DEVICE CONTROL ONE + '\x12' # 0x12 -> DEVICE CONTROL TWO + '\x13' # 0x13 -> DEVICE CONTROL THREE + '\x14' # 0x14 -> DEVICE CONTROL FOUR + '\x15' # 0x15 -> NEGATIVE ACKNOWLEDGE + '\x16' # 0x16 -> SYNCHRONOUS IDLE + '\x17' # 0x17 -> END OF TRANSMISSION BLOCK + '\x18' # 0x18 -> CANCEL + '\x19' # 0x19 -> END OF MEDIUM + '\x1a' # 0x1A -> SUBSTITUTE + '\x1b' # 0x1B -> ESCAPE + '\x1c' # 0x1C -> FILE SEPARATOR + '\x1d' # 0x1D -> GROUP SEPARATOR + '\x1e' # 0x1E -> RECORD SEPARATOR + '\x1f' # 0x1F -> UNIT SEPARATOR + ' ' # 0x20 -> SPACE + '!' # 0x21 -> EXCLAMATION MARK + '"' # 0x22 -> QUOTATION MARK + '#' # 0x23 -> NUMBER SIGN + '$' # 0x24 -> DOLLAR SIGN + '%' # 0x25 -> PERCENT SIGN + '&' # 0x26 -> AMPERSAND + "'" # 0x27 -> APOSTROPHE + '(' # 0x28 -> LEFT PARENTHESIS + ')' # 0x29 -> RIGHT PARENTHESIS + '*' # 0x2A -> ASTERISK + '+' # 0x2B -> PLUS SIGN + ',' # 0x2C -> COMMA + '-' # 0x2D -> HYPHEN-MINUS + '.' # 0x2E -> FULL STOP + '/' # 0x2F -> SOLIDUS + '0' # 0x30 -> DIGIT ZERO + '1' # 0x31 -> DIGIT ONE + '2' # 0x32 -> DIGIT TWO + '3' # 0x33 -> DIGIT THREE + '4' # 0x34 -> DIGIT FOUR + '5' # 0x35 -> DIGIT FIVE + '6' # 0x36 -> DIGIT SIX + '7' # 0x37 -> DIGIT SEVEN + '8' # 0x38 -> DIGIT EIGHT + '9' # 0x39 -> DIGIT NINE + ':' # 0x3A -> COLON + ';' # 0x3B -> SEMICOLON + '<' # 0x3C -> LESS-THAN SIGN + '=' # 0x3D -> EQUALS SIGN + '>' # 0x3E -> GREATER-THAN SIGN + '?' # 0x3F -> QUESTION MARK + '@' # 0x40 -> COMMERCIAL AT + 'A' # 0x41 -> LATIN CAPITAL LETTER A + 'B' # 0x42 -> LATIN CAPITAL LETTER B + 'C' # 0x43 -> LATIN CAPITAL LETTER C + 'D' # 0x44 -> LATIN CAPITAL LETTER D + 'E' # 0x45 -> LATIN CAPITAL LETTER E + 'F' # 0x46 -> LATIN CAPITAL LETTER F + 'G' # 0x47 -> LATIN CAPITAL LETTER G + 'H' # 0x48 -> LATIN CAPITAL LETTER H + 'I' # 0x49 -> LATIN CAPITAL LETTER I + 'J' # 0x4A -> LATIN CAPITAL LETTER J + 'K' # 0x4B -> LATIN CAPITAL LETTER K + 'L' # 0x4C -> LATIN CAPITAL LETTER L + 'M' # 0x4D -> LATIN CAPITAL LETTER M + 'N' # 0x4E -> LATIN CAPITAL LETTER N + 'O' # 0x4F -> LATIN CAPITAL LETTER O + 'P' # 0x50 -> LATIN CAPITAL LETTER P + 'Q' # 0x51 -> LATIN CAPITAL LETTER Q + 'R' # 0x52 -> LATIN CAPITAL LETTER R + 'S' # 0x53 -> LATIN CAPITAL LETTER S + 'T' # 0x54 -> LATIN CAPITAL LETTER T + 'U' # 0x55 -> LATIN CAPITAL LETTER U + 'V' # 0x56 -> LATIN CAPITAL LETTER V + 'W' # 0x57 -> LATIN CAPITAL LETTER W + 'X' # 0x58 -> LATIN CAPITAL LETTER X + 'Y' # 0x59 -> LATIN CAPITAL LETTER Y + 'Z' # 0x5A -> LATIN CAPITAL LETTER Z + '[' # 0x5B -> LEFT SQUARE BRACKET + '\\' # 0x5C -> REVERSE SOLIDUS + ']' # 0x5D -> RIGHT SQUARE BRACKET + '^' # 0x5E -> CIRCUMFLEX ACCENT + '_' # 0x5F -> LOW LINE + '`' # 0x60 -> GRAVE ACCENT + 'a' # 0x61 -> LATIN SMALL LETTER A + 'b' # 0x62 -> LATIN SMALL LETTER B + 'c' # 0x63 -> LATIN SMALL LETTER C + 'd' # 0x64 -> LATIN SMALL LETTER D + 'e' # 0x65 -> LATIN SMALL LETTER E + 'f' # 0x66 -> LATIN SMALL LETTER F + 'g' # 0x67 -> LATIN SMALL LETTER G + 'h' # 0x68 -> LATIN SMALL LETTER H + 'i' # 0x69 -> LATIN SMALL LETTER I + 'j' # 0x6A -> LATIN SMALL LETTER J + 'k' # 0x6B -> LATIN SMALL LETTER K + 'l' # 0x6C -> LATIN SMALL LETTER L + 'm' # 0x6D -> LATIN SMALL LETTER M + 'n' # 0x6E -> LATIN SMALL LETTER N + 'o' # 0x6F -> LATIN SMALL LETTER O + 'p' # 0x70 -> LATIN SMALL LETTER P + 'q' # 0x71 -> LATIN SMALL LETTER Q + 'r' # 0x72 -> LATIN SMALL LETTER R + 's' # 0x73 -> LATIN SMALL LETTER S + 't' # 0x74 -> LATIN SMALL LETTER T + 'u' # 0x75 -> LATIN SMALL LETTER U + 'v' # 0x76 -> LATIN SMALL LETTER V + 'w' # 0x77 -> LATIN SMALL LETTER W + 'x' # 0x78 -> LATIN SMALL LETTER X + 'y' # 0x79 -> LATIN SMALL LETTER Y + 'z' # 0x7A -> LATIN SMALL LETTER Z + '{' # 0x7B -> LEFT CURLY BRACKET + '|' # 0x7C -> VERTICAL LINE + '}' # 0x7D -> RIGHT CURLY BRACKET + '~' # 0x7E -> TILDE + '\x7f' # 0x7F -> DELETE + '\x80' # 0x80 -> + '\x81' # 0x81 -> + '\x82' # 0x82 -> + '\x83' # 0x83 -> + '\x84' # 0x84 -> + '\x85' # 0x85 -> + '\x86' # 0x86 -> + '\x87' # 0x87 -> + '\x88' # 0x88 -> + '\x89' # 0x89 -> + '\x8a' # 0x8A -> + '\x8b' # 0x8B -> + '\x8c' # 0x8C -> + '\x8d' # 0x8D -> + '\x8e' # 0x8E -> + '\x8f' # 0x8F -> + '\x90' # 0x90 -> + '\x91' # 0x91 -> + '\x92' # 0x92 -> + '\x93' # 0x93 -> + '\x94' # 0x94 -> + '\x95' # 0x95 -> + '\x96' # 0x96 -> + '\x97' # 0x97 -> + '\x98' # 0x98 -> + '\x99' # 0x99 -> + '\x9a' # 0x9A -> + '\x9b' # 0x9B -> + '\x9c' # 0x9C -> + '\x9d' # 0x9D -> + '\x9e' # 0x9E -> + '\x9f' # 0x9F -> + '\xa0' # 0xA0 -> NO-BREAK SPACE + '\u0104' # 0xA1 -> LATIN CAPITAL LETTER A WITH OGONEK + '\u02d8' # 0xA2 -> BREVE + '\u0141' # 0xA3 -> LATIN CAPITAL LETTER L WITH STROKE + '\xa4' # 0xA4 -> CURRENCY SIGN + '\u013d' # 0xA5 -> LATIN CAPITAL LETTER L WITH CARON + '\u015a' # 0xA6 -> LATIN CAPITAL LETTER S WITH ACUTE + '\xa7' # 0xA7 -> SECTION SIGN + '\xa8' # 0xA8 -> DIAERESIS + '\u0160' # 0xA9 -> LATIN CAPITAL LETTER S WITH CARON + '\u015e' # 0xAA -> LATIN CAPITAL LETTER S WITH CEDILLA + '\u0164' # 0xAB -> LATIN CAPITAL LETTER T WITH CARON + '\u0179' # 0xAC -> LATIN CAPITAL LETTER Z WITH ACUTE + '\xad' # 0xAD -> SOFT HYPHEN + '\u017d' # 0xAE -> LATIN CAPITAL LETTER Z WITH CARON + '\u017b' # 0xAF -> LATIN CAPITAL LETTER Z WITH DOT ABOVE + '\xb0' # 0xB0 -> DEGREE SIGN + '\u0105' # 0xB1 -> LATIN SMALL LETTER A WITH OGONEK + '\u02db' # 0xB2 -> OGONEK + '\u0142' # 0xB3 -> LATIN SMALL LETTER L WITH STROKE + '\xb4' # 0xB4 -> ACUTE ACCENT + '\u013e' # 0xB5 -> LATIN SMALL LETTER L WITH CARON + '\u015b' # 0xB6 -> LATIN SMALL LETTER S WITH ACUTE + '\u02c7' # 0xB7 -> CARON + '\xb8' # 0xB8 -> CEDILLA + '\u0161' # 0xB9 -> LATIN SMALL LETTER S WITH CARON + '\u015f' # 0xBA -> LATIN SMALL LETTER S WITH CEDILLA + '\u0165' # 0xBB -> LATIN SMALL LETTER T WITH CARON + '\u017a' # 0xBC -> LATIN SMALL LETTER Z WITH ACUTE + '\u02dd' # 0xBD -> DOUBLE ACUTE ACCENT + '\u017e' # 0xBE -> LATIN SMALL LETTER Z WITH CARON + '\u017c' # 0xBF -> LATIN SMALL LETTER Z WITH DOT ABOVE + '\u0154' # 0xC0 -> LATIN CAPITAL LETTER R WITH ACUTE + '\xc1' # 0xC1 -> LATIN CAPITAL LETTER A WITH ACUTE + '\xc2' # 0xC2 -> LATIN CAPITAL LETTER A WITH CIRCUMFLEX + '\u0102' # 0xC3 -> LATIN CAPITAL LETTER A WITH BREVE + '\xc4' # 0xC4 -> LATIN CAPITAL LETTER A WITH DIAERESIS + '\u0139' # 0xC5 -> LATIN CAPITAL LETTER L WITH ACUTE + '\u0106' # 0xC6 -> LATIN CAPITAL LETTER C WITH ACUTE + '\xc7' # 0xC7 -> LATIN CAPITAL LETTER C WITH CEDILLA + '\u010c' # 0xC8 -> LATIN CAPITAL LETTER C WITH CARON + '\xc9' # 0xC9 -> LATIN CAPITAL LETTER E WITH ACUTE + '\u0118' # 0xCA -> LATIN CAPITAL LETTER E WITH OGONEK + '\xcb' # 0xCB -> LATIN CAPITAL LETTER E WITH DIAERESIS + '\u011a' # 0xCC -> LATIN CAPITAL LETTER E WITH CARON + '\xcd' # 0xCD -> LATIN CAPITAL LETTER I WITH ACUTE + '\xce' # 0xCE -> LATIN CAPITAL LETTER I WITH CIRCUMFLEX + '\u010e' # 0xCF -> LATIN CAPITAL LETTER D WITH CARON + '\u0110' # 0xD0 -> LATIN CAPITAL LETTER D WITH STROKE + '\u0143' # 0xD1 -> LATIN CAPITAL LETTER N WITH ACUTE + '\u0147' # 0xD2 -> LATIN CAPITAL LETTER N WITH CARON + '\xd3' # 0xD3 -> LATIN CAPITAL LETTER O WITH ACUTE + '\xd4' # 0xD4 -> LATIN CAPITAL LETTER O WITH CIRCUMFLEX + '\u0150' # 0xD5 -> LATIN CAPITAL LETTER O WITH DOUBLE ACUTE + '\xd6' # 0xD6 -> LATIN CAPITAL LETTER O WITH DIAERESIS + '\xd7' # 0xD7 -> MULTIPLICATION SIGN + '\u0158' # 0xD8 -> LATIN CAPITAL LETTER R WITH CARON + '\u016e' # 0xD9 -> LATIN CAPITAL LETTER U WITH RING ABOVE + '\xda' # 0xDA -> LATIN CAPITAL LETTER U WITH ACUTE + '\u0170' # 0xDB -> LATIN CAPITAL LETTER U WITH DOUBLE ACUTE + '\xdc' # 0xDC -> LATIN CAPITAL LETTER U WITH DIAERESIS + '\xdd' # 0xDD -> LATIN CAPITAL LETTER Y WITH ACUTE + '\u0162' # 0xDE -> LATIN CAPITAL LETTER T WITH CEDILLA + '\xdf' # 0xDF -> LATIN SMALL LETTER SHARP S + '\u0155' # 0xE0 -> LATIN SMALL LETTER R WITH ACUTE + '\xe1' # 0xE1 -> LATIN SMALL LETTER A WITH ACUTE + '\xe2' # 0xE2 -> LATIN SMALL LETTER A WITH CIRCUMFLEX + '\u0103' # 0xE3 -> LATIN SMALL LETTER A WITH BREVE + '\xe4' # 0xE4 -> LATIN SMALL LETTER A WITH DIAERESIS + '\u013a' # 0xE5 -> LATIN SMALL LETTER L WITH ACUTE + '\u0107' # 0xE6 -> LATIN SMALL LETTER C WITH ACUTE + '\xe7' # 0xE7 -> LATIN SMALL LETTER C WITH CEDILLA + '\u010d' # 0xE8 -> LATIN SMALL LETTER C WITH CARON + '\xe9' # 0xE9 -> LATIN SMALL LETTER E WITH ACUTE + '\u0119' # 0xEA -> LATIN SMALL LETTER E WITH OGONEK + '\xeb' # 0xEB -> LATIN SMALL LETTER E WITH DIAERESIS + '\u011b' # 0xEC -> LATIN SMALL LETTER E WITH CARON + '\xed' # 0xED -> LATIN SMALL LETTER I WITH ACUTE + '\xee' # 0xEE -> LATIN SMALL LETTER I WITH CIRCUMFLEX + '\u010f' # 0xEF -> LATIN SMALL LETTER D WITH CARON + '\u0111' # 0xF0 -> LATIN SMALL LETTER D WITH STROKE + '\u0144' # 0xF1 -> LATIN SMALL LETTER N WITH ACUTE + '\u0148' # 0xF2 -> LATIN SMALL LETTER N WITH CARON + '\xf3' # 0xF3 -> LATIN SMALL LETTER O WITH ACUTE + '\xf4' # 0xF4 -> LATIN SMALL LETTER O WITH CIRCUMFLEX + '\u0151' # 0xF5 -> LATIN SMALL LETTER O WITH DOUBLE ACUTE + '\xf6' # 0xF6 -> LATIN SMALL LETTER O WITH DIAERESIS + '\xf7' # 0xF7 -> DIVISION SIGN + '\u0159' # 0xF8 -> LATIN SMALL LETTER R WITH CARON + '\u016f' # 0xF9 -> LATIN SMALL LETTER U WITH RING ABOVE + '\xfa' # 0xFA -> LATIN SMALL LETTER U WITH ACUTE + '\u0171' # 0xFB -> LATIN SMALL LETTER U WITH DOUBLE ACUTE + '\xfc' # 0xFC -> LATIN SMALL LETTER U WITH DIAERESIS + '\xfd' # 0xFD -> LATIN SMALL LETTER Y WITH ACUTE + '\u0163' # 0xFE -> LATIN SMALL LETTER T WITH CEDILLA + '\u02d9' # 0xFF -> DOT ABOVE +) + +### Encoding table +encoding_table=codecs.charmap_build(decoding_table) diff --git a/env/Lib/encodings/iso8859_3.py b/env/Lib/encodings/iso8859_3.py new file mode 100644 index 0000000..96d3063 --- /dev/null +++ b/env/Lib/encodings/iso8859_3.py @@ -0,0 +1,307 @@ +""" Python Character Mapping Codec iso8859_3 generated from 'MAPPINGS/ISO8859/8859-3.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='iso8859-3', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) + + +### Decoding Table + +decoding_table = ( + '\x00' # 0x00 -> NULL + '\x01' # 0x01 -> START OF HEADING + '\x02' # 0x02 -> START OF TEXT + '\x03' # 0x03 -> END OF TEXT + '\x04' # 0x04 -> END OF TRANSMISSION + '\x05' # 0x05 -> ENQUIRY + '\x06' # 0x06 -> ACKNOWLEDGE + '\x07' # 0x07 -> BELL + '\x08' # 0x08 -> BACKSPACE + '\t' # 0x09 -> HORIZONTAL TABULATION + '\n' # 0x0A -> LINE FEED + '\x0b' # 0x0B -> VERTICAL TABULATION + '\x0c' # 0x0C -> FORM FEED + '\r' # 0x0D -> CARRIAGE RETURN + '\x0e' # 0x0E -> SHIFT OUT + '\x0f' # 0x0F -> SHIFT IN + '\x10' # 0x10 -> DATA LINK ESCAPE + '\x11' # 0x11 -> DEVICE CONTROL ONE + '\x12' # 0x12 -> DEVICE CONTROL TWO + '\x13' # 0x13 -> DEVICE CONTROL THREE + '\x14' # 0x14 -> DEVICE CONTROL FOUR + '\x15' # 0x15 -> NEGATIVE ACKNOWLEDGE + '\x16' # 0x16 -> SYNCHRONOUS IDLE + '\x17' # 0x17 -> END OF TRANSMISSION BLOCK + '\x18' # 0x18 -> CANCEL + '\x19' # 0x19 -> END OF MEDIUM + '\x1a' # 0x1A -> SUBSTITUTE + '\x1b' # 0x1B -> ESCAPE + '\x1c' # 0x1C -> FILE SEPARATOR + '\x1d' # 0x1D -> GROUP SEPARATOR + '\x1e' # 0x1E -> RECORD SEPARATOR + '\x1f' # 0x1F -> UNIT SEPARATOR + ' ' # 0x20 -> SPACE + '!' # 0x21 -> EXCLAMATION MARK + '"' # 0x22 -> QUOTATION MARK + '#' # 0x23 -> NUMBER SIGN + '$' # 0x24 -> DOLLAR SIGN + '%' # 0x25 -> PERCENT SIGN + '&' # 0x26 -> AMPERSAND + "'" # 0x27 -> APOSTROPHE + '(' # 0x28 -> LEFT PARENTHESIS + ')' # 0x29 -> RIGHT PARENTHESIS + '*' # 0x2A -> ASTERISK + '+' # 0x2B -> PLUS SIGN + ',' # 0x2C -> COMMA + '-' # 0x2D -> HYPHEN-MINUS + '.' # 0x2E -> FULL STOP + '/' # 0x2F -> SOLIDUS + '0' # 0x30 -> DIGIT ZERO + '1' # 0x31 -> DIGIT ONE + '2' # 0x32 -> DIGIT TWO + '3' # 0x33 -> DIGIT THREE + '4' # 0x34 -> DIGIT FOUR + '5' # 0x35 -> DIGIT FIVE + '6' # 0x36 -> DIGIT SIX + '7' # 0x37 -> DIGIT SEVEN + '8' # 0x38 -> DIGIT EIGHT + '9' # 0x39 -> DIGIT NINE + ':' # 0x3A -> COLON + ';' # 0x3B -> SEMICOLON + '<' # 0x3C -> LESS-THAN SIGN + '=' # 0x3D -> EQUALS SIGN + '>' # 0x3E -> GREATER-THAN SIGN + '?' # 0x3F -> QUESTION MARK + '@' # 0x40 -> COMMERCIAL AT + 'A' # 0x41 -> LATIN CAPITAL LETTER A + 'B' # 0x42 -> LATIN CAPITAL LETTER B + 'C' # 0x43 -> LATIN CAPITAL LETTER C + 'D' # 0x44 -> LATIN CAPITAL LETTER D + 'E' # 0x45 -> LATIN CAPITAL LETTER E + 'F' # 0x46 -> LATIN CAPITAL LETTER F + 'G' # 0x47 -> LATIN CAPITAL LETTER G + 'H' # 0x48 -> LATIN CAPITAL LETTER H + 'I' # 0x49 -> LATIN CAPITAL LETTER I + 'J' # 0x4A -> LATIN CAPITAL LETTER J + 'K' # 0x4B -> LATIN CAPITAL LETTER K + 'L' # 0x4C -> LATIN CAPITAL LETTER L + 'M' # 0x4D -> LATIN CAPITAL LETTER M + 'N' # 0x4E -> LATIN CAPITAL LETTER N + 'O' # 0x4F -> LATIN CAPITAL LETTER O + 'P' # 0x50 -> LATIN CAPITAL LETTER P + 'Q' # 0x51 -> LATIN CAPITAL LETTER Q + 'R' # 0x52 -> LATIN CAPITAL LETTER R + 'S' # 0x53 -> LATIN CAPITAL LETTER S + 'T' # 0x54 -> LATIN CAPITAL LETTER T + 'U' # 0x55 -> LATIN CAPITAL LETTER U + 'V' # 0x56 -> LATIN CAPITAL LETTER V + 'W' # 0x57 -> LATIN CAPITAL LETTER W + 'X' # 0x58 -> LATIN CAPITAL LETTER X + 'Y' # 0x59 -> LATIN CAPITAL LETTER Y + 'Z' # 0x5A -> LATIN CAPITAL LETTER Z + '[' # 0x5B -> LEFT SQUARE BRACKET + '\\' # 0x5C -> REVERSE SOLIDUS + ']' # 0x5D -> RIGHT SQUARE BRACKET + '^' # 0x5E -> CIRCUMFLEX ACCENT + '_' # 0x5F -> LOW LINE + '`' # 0x60 -> GRAVE ACCENT + 'a' # 0x61 -> LATIN SMALL LETTER A + 'b' # 0x62 -> LATIN SMALL LETTER B + 'c' # 0x63 -> LATIN SMALL LETTER C + 'd' # 0x64 -> LATIN SMALL LETTER D + 'e' # 0x65 -> LATIN SMALL LETTER E + 'f' # 0x66 -> LATIN SMALL LETTER F + 'g' # 0x67 -> LATIN SMALL LETTER G + 'h' # 0x68 -> LATIN SMALL LETTER H + 'i' # 0x69 -> LATIN SMALL LETTER I + 'j' # 0x6A -> LATIN SMALL LETTER J + 'k' # 0x6B -> LATIN SMALL LETTER K + 'l' # 0x6C -> LATIN SMALL LETTER L + 'm' # 0x6D -> LATIN SMALL LETTER M + 'n' # 0x6E -> LATIN SMALL LETTER N + 'o' # 0x6F -> LATIN SMALL LETTER O + 'p' # 0x70 -> LATIN SMALL LETTER P + 'q' # 0x71 -> LATIN SMALL LETTER Q + 'r' # 0x72 -> LATIN SMALL LETTER R + 's' # 0x73 -> LATIN SMALL LETTER S + 't' # 0x74 -> LATIN SMALL LETTER T + 'u' # 0x75 -> LATIN SMALL LETTER U + 'v' # 0x76 -> LATIN SMALL LETTER V + 'w' # 0x77 -> LATIN SMALL LETTER W + 'x' # 0x78 -> LATIN SMALL LETTER X + 'y' # 0x79 -> LATIN SMALL LETTER Y + 'z' # 0x7A -> LATIN SMALL LETTER Z + '{' # 0x7B -> LEFT CURLY BRACKET + '|' # 0x7C -> VERTICAL LINE + '}' # 0x7D -> RIGHT CURLY BRACKET + '~' # 0x7E -> TILDE + '\x7f' # 0x7F -> DELETE + '\x80' # 0x80 -> + '\x81' # 0x81 -> + '\x82' # 0x82 -> + '\x83' # 0x83 -> + '\x84' # 0x84 -> + '\x85' # 0x85 -> + '\x86' # 0x86 -> + '\x87' # 0x87 -> + '\x88' # 0x88 -> + '\x89' # 0x89 -> + '\x8a' # 0x8A -> + '\x8b' # 0x8B -> + '\x8c' # 0x8C -> + '\x8d' # 0x8D -> + '\x8e' # 0x8E -> + '\x8f' # 0x8F -> + '\x90' # 0x90 -> + '\x91' # 0x91 -> + '\x92' # 0x92 -> + '\x93' # 0x93 -> + '\x94' # 0x94 -> + '\x95' # 0x95 -> + '\x96' # 0x96 -> + '\x97' # 0x97 -> + '\x98' # 0x98 -> + '\x99' # 0x99 -> + '\x9a' # 0x9A -> + '\x9b' # 0x9B -> + '\x9c' # 0x9C -> + '\x9d' # 0x9D -> + '\x9e' # 0x9E -> + '\x9f' # 0x9F -> + '\xa0' # 0xA0 -> NO-BREAK SPACE + '\u0126' # 0xA1 -> LATIN CAPITAL LETTER H WITH STROKE + '\u02d8' # 0xA2 -> BREVE + '\xa3' # 0xA3 -> POUND SIGN + '\xa4' # 0xA4 -> CURRENCY SIGN + '\ufffe' + '\u0124' # 0xA6 -> LATIN CAPITAL LETTER H WITH CIRCUMFLEX + '\xa7' # 0xA7 -> SECTION SIGN + '\xa8' # 0xA8 -> DIAERESIS + '\u0130' # 0xA9 -> LATIN CAPITAL LETTER I WITH DOT ABOVE + '\u015e' # 0xAA -> LATIN CAPITAL LETTER S WITH CEDILLA + '\u011e' # 0xAB -> LATIN CAPITAL LETTER G WITH BREVE + '\u0134' # 0xAC -> LATIN CAPITAL LETTER J WITH CIRCUMFLEX + '\xad' # 0xAD -> SOFT HYPHEN + '\ufffe' + '\u017b' # 0xAF -> LATIN CAPITAL LETTER Z WITH DOT ABOVE + '\xb0' # 0xB0 -> DEGREE SIGN + '\u0127' # 0xB1 -> LATIN SMALL LETTER H WITH STROKE + '\xb2' # 0xB2 -> SUPERSCRIPT TWO + '\xb3' # 0xB3 -> SUPERSCRIPT THREE + '\xb4' # 0xB4 -> ACUTE ACCENT + '\xb5' # 0xB5 -> MICRO SIGN + '\u0125' # 0xB6 -> LATIN SMALL LETTER H WITH CIRCUMFLEX + '\xb7' # 0xB7 -> MIDDLE DOT + '\xb8' # 0xB8 -> CEDILLA + '\u0131' # 0xB9 -> LATIN SMALL LETTER DOTLESS I + '\u015f' # 0xBA -> LATIN SMALL LETTER S WITH CEDILLA + '\u011f' # 0xBB -> LATIN SMALL LETTER G WITH BREVE + '\u0135' # 0xBC -> LATIN SMALL LETTER J WITH CIRCUMFLEX + '\xbd' # 0xBD -> VULGAR FRACTION ONE HALF + '\ufffe' + '\u017c' # 0xBF -> LATIN SMALL LETTER Z WITH DOT ABOVE + '\xc0' # 0xC0 -> LATIN CAPITAL LETTER A WITH GRAVE + '\xc1' # 0xC1 -> LATIN CAPITAL LETTER A WITH ACUTE + '\xc2' # 0xC2 -> LATIN CAPITAL LETTER A WITH CIRCUMFLEX + '\ufffe' + '\xc4' # 0xC4 -> LATIN CAPITAL LETTER A WITH DIAERESIS + '\u010a' # 0xC5 -> LATIN CAPITAL LETTER C WITH DOT ABOVE + '\u0108' # 0xC6 -> LATIN CAPITAL LETTER C WITH CIRCUMFLEX + '\xc7' # 0xC7 -> LATIN CAPITAL LETTER C WITH CEDILLA + '\xc8' # 0xC8 -> LATIN CAPITAL LETTER E WITH GRAVE + '\xc9' # 0xC9 -> LATIN CAPITAL LETTER E WITH ACUTE + '\xca' # 0xCA -> LATIN CAPITAL LETTER E WITH CIRCUMFLEX + '\xcb' # 0xCB -> LATIN CAPITAL LETTER E WITH DIAERESIS + '\xcc' # 0xCC -> LATIN CAPITAL LETTER I WITH GRAVE + '\xcd' # 0xCD -> LATIN CAPITAL LETTER I WITH ACUTE + '\xce' # 0xCE -> LATIN CAPITAL LETTER I WITH CIRCUMFLEX + '\xcf' # 0xCF -> LATIN CAPITAL LETTER I WITH DIAERESIS + '\ufffe' + '\xd1' # 0xD1 -> LATIN CAPITAL LETTER N WITH TILDE + '\xd2' # 0xD2 -> LATIN CAPITAL LETTER O WITH GRAVE + '\xd3' # 0xD3 -> LATIN CAPITAL LETTER O WITH ACUTE + '\xd4' # 0xD4 -> LATIN CAPITAL LETTER O WITH CIRCUMFLEX + '\u0120' # 0xD5 -> LATIN CAPITAL LETTER G WITH DOT ABOVE + '\xd6' # 0xD6 -> LATIN CAPITAL LETTER O WITH DIAERESIS + '\xd7' # 0xD7 -> MULTIPLICATION SIGN + '\u011c' # 0xD8 -> LATIN CAPITAL LETTER G WITH CIRCUMFLEX + '\xd9' # 0xD9 -> LATIN CAPITAL LETTER U WITH GRAVE + '\xda' # 0xDA -> LATIN CAPITAL LETTER U WITH ACUTE + '\xdb' # 0xDB -> LATIN CAPITAL LETTER U WITH CIRCUMFLEX + '\xdc' # 0xDC -> LATIN CAPITAL LETTER U WITH DIAERESIS + '\u016c' # 0xDD -> LATIN CAPITAL LETTER U WITH BREVE + '\u015c' # 0xDE -> LATIN CAPITAL LETTER S WITH CIRCUMFLEX + '\xdf' # 0xDF -> LATIN SMALL LETTER SHARP S + '\xe0' # 0xE0 -> LATIN SMALL LETTER A WITH GRAVE + '\xe1' # 0xE1 -> LATIN SMALL LETTER A WITH ACUTE + '\xe2' # 0xE2 -> LATIN SMALL LETTER A WITH CIRCUMFLEX + '\ufffe' + '\xe4' # 0xE4 -> LATIN SMALL LETTER A WITH DIAERESIS + '\u010b' # 0xE5 -> LATIN SMALL LETTER C WITH DOT ABOVE + '\u0109' # 0xE6 -> LATIN SMALL LETTER C WITH CIRCUMFLEX + '\xe7' # 0xE7 -> LATIN SMALL LETTER C WITH CEDILLA + '\xe8' # 0xE8 -> LATIN SMALL LETTER E WITH GRAVE + '\xe9' # 0xE9 -> LATIN SMALL LETTER E WITH ACUTE + '\xea' # 0xEA -> LATIN SMALL LETTER E WITH CIRCUMFLEX + '\xeb' # 0xEB -> LATIN SMALL LETTER E WITH DIAERESIS + '\xec' # 0xEC -> LATIN SMALL LETTER I WITH GRAVE + '\xed' # 0xED -> LATIN SMALL LETTER I WITH ACUTE + '\xee' # 0xEE -> LATIN SMALL LETTER I WITH CIRCUMFLEX + '\xef' # 0xEF -> LATIN SMALL LETTER I WITH DIAERESIS + '\ufffe' + '\xf1' # 0xF1 -> LATIN SMALL LETTER N WITH TILDE + '\xf2' # 0xF2 -> LATIN SMALL LETTER O WITH GRAVE + '\xf3' # 0xF3 -> LATIN SMALL LETTER O WITH ACUTE + '\xf4' # 0xF4 -> LATIN SMALL LETTER O WITH CIRCUMFLEX + '\u0121' # 0xF5 -> LATIN SMALL LETTER G WITH DOT ABOVE + '\xf6' # 0xF6 -> LATIN SMALL LETTER O WITH DIAERESIS + '\xf7' # 0xF7 -> DIVISION SIGN + '\u011d' # 0xF8 -> LATIN SMALL LETTER G WITH CIRCUMFLEX + '\xf9' # 0xF9 -> LATIN SMALL LETTER U WITH GRAVE + '\xfa' # 0xFA -> LATIN SMALL LETTER U WITH ACUTE + '\xfb' # 0xFB -> LATIN SMALL LETTER U WITH CIRCUMFLEX + '\xfc' # 0xFC -> LATIN SMALL LETTER U WITH DIAERESIS + '\u016d' # 0xFD -> LATIN SMALL LETTER U WITH BREVE + '\u015d' # 0xFE -> LATIN SMALL LETTER S WITH CIRCUMFLEX + '\u02d9' # 0xFF -> DOT ABOVE +) + +### Encoding table +encoding_table=codecs.charmap_build(decoding_table) diff --git a/env/Lib/encodings/iso8859_4.py b/env/Lib/encodings/iso8859_4.py new file mode 100644 index 0000000..65c1e00 --- /dev/null +++ b/env/Lib/encodings/iso8859_4.py @@ -0,0 +1,307 @@ +""" Python Character Mapping Codec iso8859_4 generated from 'MAPPINGS/ISO8859/8859-4.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='iso8859-4', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) + + +### Decoding Table + +decoding_table = ( + '\x00' # 0x00 -> NULL + '\x01' # 0x01 -> START OF HEADING + '\x02' # 0x02 -> START OF TEXT + '\x03' # 0x03 -> END OF TEXT + '\x04' # 0x04 -> END OF TRANSMISSION + '\x05' # 0x05 -> ENQUIRY + '\x06' # 0x06 -> ACKNOWLEDGE + '\x07' # 0x07 -> BELL + '\x08' # 0x08 -> BACKSPACE + '\t' # 0x09 -> HORIZONTAL TABULATION + '\n' # 0x0A -> LINE FEED + '\x0b' # 0x0B -> VERTICAL TABULATION + '\x0c' # 0x0C -> FORM FEED + '\r' # 0x0D -> CARRIAGE RETURN + '\x0e' # 0x0E -> SHIFT OUT + '\x0f' # 0x0F -> SHIFT IN + '\x10' # 0x10 -> DATA LINK ESCAPE + '\x11' # 0x11 -> DEVICE CONTROL ONE + '\x12' # 0x12 -> DEVICE CONTROL TWO + '\x13' # 0x13 -> DEVICE CONTROL THREE + '\x14' # 0x14 -> DEVICE CONTROL FOUR + '\x15' # 0x15 -> NEGATIVE ACKNOWLEDGE + '\x16' # 0x16 -> SYNCHRONOUS IDLE + '\x17' # 0x17 -> END OF TRANSMISSION BLOCK + '\x18' # 0x18 -> CANCEL + '\x19' # 0x19 -> END OF MEDIUM + '\x1a' # 0x1A -> SUBSTITUTE + '\x1b' # 0x1B -> ESCAPE + '\x1c' # 0x1C -> FILE SEPARATOR + '\x1d' # 0x1D -> GROUP SEPARATOR + '\x1e' # 0x1E -> RECORD SEPARATOR + '\x1f' # 0x1F -> UNIT SEPARATOR + ' ' # 0x20 -> SPACE + '!' # 0x21 -> EXCLAMATION MARK + '"' # 0x22 -> QUOTATION MARK + '#' # 0x23 -> NUMBER SIGN + '$' # 0x24 -> DOLLAR SIGN + '%' # 0x25 -> PERCENT SIGN + '&' # 0x26 -> AMPERSAND + "'" # 0x27 -> APOSTROPHE + '(' # 0x28 -> LEFT PARENTHESIS + ')' # 0x29 -> RIGHT PARENTHESIS + '*' # 0x2A -> ASTERISK + '+' # 0x2B -> PLUS SIGN + ',' # 0x2C -> COMMA + '-' # 0x2D -> HYPHEN-MINUS + '.' # 0x2E -> FULL STOP + '/' # 0x2F -> SOLIDUS + '0' # 0x30 -> DIGIT ZERO + '1' # 0x31 -> DIGIT ONE + '2' # 0x32 -> DIGIT TWO + '3' # 0x33 -> DIGIT THREE + '4' # 0x34 -> DIGIT FOUR + '5' # 0x35 -> DIGIT FIVE + '6' # 0x36 -> DIGIT SIX + '7' # 0x37 -> DIGIT SEVEN + '8' # 0x38 -> DIGIT EIGHT + '9' # 0x39 -> DIGIT NINE + ':' # 0x3A -> COLON + ';' # 0x3B -> SEMICOLON + '<' # 0x3C -> LESS-THAN SIGN + '=' # 0x3D -> EQUALS SIGN + '>' # 0x3E -> GREATER-THAN SIGN + '?' # 0x3F -> QUESTION MARK + '@' # 0x40 -> COMMERCIAL AT + 'A' # 0x41 -> LATIN CAPITAL LETTER A + 'B' # 0x42 -> LATIN CAPITAL LETTER B + 'C' # 0x43 -> LATIN CAPITAL LETTER C + 'D' # 0x44 -> LATIN CAPITAL LETTER D + 'E' # 0x45 -> LATIN CAPITAL LETTER E + 'F' # 0x46 -> LATIN CAPITAL LETTER F + 'G' # 0x47 -> LATIN CAPITAL LETTER G + 'H' # 0x48 -> LATIN CAPITAL LETTER H + 'I' # 0x49 -> LATIN CAPITAL LETTER I + 'J' # 0x4A -> LATIN CAPITAL LETTER J + 'K' # 0x4B -> LATIN CAPITAL LETTER K + 'L' # 0x4C -> LATIN CAPITAL LETTER L + 'M' # 0x4D -> LATIN CAPITAL LETTER M + 'N' # 0x4E -> LATIN CAPITAL LETTER N + 'O' # 0x4F -> LATIN CAPITAL LETTER O + 'P' # 0x50 -> LATIN CAPITAL LETTER P + 'Q' # 0x51 -> LATIN CAPITAL LETTER Q + 'R' # 0x52 -> LATIN CAPITAL LETTER R + 'S' # 0x53 -> LATIN CAPITAL LETTER S + 'T' # 0x54 -> LATIN CAPITAL LETTER T + 'U' # 0x55 -> LATIN CAPITAL LETTER U + 'V' # 0x56 -> LATIN CAPITAL LETTER V + 'W' # 0x57 -> LATIN CAPITAL LETTER W + 'X' # 0x58 -> LATIN CAPITAL LETTER X + 'Y' # 0x59 -> LATIN CAPITAL LETTER Y + 'Z' # 0x5A -> LATIN CAPITAL LETTER Z + '[' # 0x5B -> LEFT SQUARE BRACKET + '\\' # 0x5C -> REVERSE SOLIDUS + ']' # 0x5D -> RIGHT SQUARE BRACKET + '^' # 0x5E -> CIRCUMFLEX ACCENT + '_' # 0x5F -> LOW LINE + '`' # 0x60 -> GRAVE ACCENT + 'a' # 0x61 -> LATIN SMALL LETTER A + 'b' # 0x62 -> LATIN SMALL LETTER B + 'c' # 0x63 -> LATIN SMALL LETTER C + 'd' # 0x64 -> LATIN SMALL LETTER D + 'e' # 0x65 -> LATIN SMALL LETTER E + 'f' # 0x66 -> LATIN SMALL LETTER F + 'g' # 0x67 -> LATIN SMALL LETTER G + 'h' # 0x68 -> LATIN SMALL LETTER H + 'i' # 0x69 -> LATIN SMALL LETTER I + 'j' # 0x6A -> LATIN SMALL LETTER J + 'k' # 0x6B -> LATIN SMALL LETTER K + 'l' # 0x6C -> LATIN SMALL LETTER L + 'm' # 0x6D -> LATIN SMALL LETTER M + 'n' # 0x6E -> LATIN SMALL LETTER N + 'o' # 0x6F -> LATIN SMALL LETTER O + 'p' # 0x70 -> LATIN SMALL LETTER P + 'q' # 0x71 -> LATIN SMALL LETTER Q + 'r' # 0x72 -> LATIN SMALL LETTER R + 's' # 0x73 -> LATIN SMALL LETTER S + 't' # 0x74 -> LATIN SMALL LETTER T + 'u' # 0x75 -> LATIN SMALL LETTER U + 'v' # 0x76 -> LATIN SMALL LETTER V + 'w' # 0x77 -> LATIN SMALL LETTER W + 'x' # 0x78 -> LATIN SMALL LETTER X + 'y' # 0x79 -> LATIN SMALL LETTER Y + 'z' # 0x7A -> LATIN SMALL LETTER Z + '{' # 0x7B -> LEFT CURLY BRACKET + '|' # 0x7C -> VERTICAL LINE + '}' # 0x7D -> RIGHT CURLY BRACKET + '~' # 0x7E -> TILDE + '\x7f' # 0x7F -> DELETE + '\x80' # 0x80 -> + '\x81' # 0x81 -> + '\x82' # 0x82 -> + '\x83' # 0x83 -> + '\x84' # 0x84 -> + '\x85' # 0x85 -> + '\x86' # 0x86 -> + '\x87' # 0x87 -> + '\x88' # 0x88 -> + '\x89' # 0x89 -> + '\x8a' # 0x8A -> + '\x8b' # 0x8B -> + '\x8c' # 0x8C -> + '\x8d' # 0x8D -> + '\x8e' # 0x8E -> + '\x8f' # 0x8F -> + '\x90' # 0x90 -> + '\x91' # 0x91 -> + '\x92' # 0x92 -> + '\x93' # 0x93 -> + '\x94' # 0x94 -> + '\x95' # 0x95 -> + '\x96' # 0x96 -> + '\x97' # 0x97 -> + '\x98' # 0x98 -> + '\x99' # 0x99 -> + '\x9a' # 0x9A -> + '\x9b' # 0x9B -> + '\x9c' # 0x9C -> + '\x9d' # 0x9D -> + '\x9e' # 0x9E -> + '\x9f' # 0x9F -> + '\xa0' # 0xA0 -> NO-BREAK SPACE + '\u0104' # 0xA1 -> LATIN CAPITAL LETTER A WITH OGONEK + '\u0138' # 0xA2 -> LATIN SMALL LETTER KRA + '\u0156' # 0xA3 -> LATIN CAPITAL LETTER R WITH CEDILLA + '\xa4' # 0xA4 -> CURRENCY SIGN + '\u0128' # 0xA5 -> LATIN CAPITAL LETTER I WITH TILDE + '\u013b' # 0xA6 -> LATIN CAPITAL LETTER L WITH CEDILLA + '\xa7' # 0xA7 -> SECTION SIGN + '\xa8' # 0xA8 -> DIAERESIS + '\u0160' # 0xA9 -> LATIN CAPITAL LETTER S WITH CARON + '\u0112' # 0xAA -> LATIN CAPITAL LETTER E WITH MACRON + '\u0122' # 0xAB -> LATIN CAPITAL LETTER G WITH CEDILLA + '\u0166' # 0xAC -> LATIN CAPITAL LETTER T WITH STROKE + '\xad' # 0xAD -> SOFT HYPHEN + '\u017d' # 0xAE -> LATIN CAPITAL LETTER Z WITH CARON + '\xaf' # 0xAF -> MACRON + '\xb0' # 0xB0 -> DEGREE SIGN + '\u0105' # 0xB1 -> LATIN SMALL LETTER A WITH OGONEK + '\u02db' # 0xB2 -> OGONEK + '\u0157' # 0xB3 -> LATIN SMALL LETTER R WITH CEDILLA + '\xb4' # 0xB4 -> ACUTE ACCENT + '\u0129' # 0xB5 -> LATIN SMALL LETTER I WITH TILDE + '\u013c' # 0xB6 -> LATIN SMALL LETTER L WITH CEDILLA + '\u02c7' # 0xB7 -> CARON + '\xb8' # 0xB8 -> CEDILLA + '\u0161' # 0xB9 -> LATIN SMALL LETTER S WITH CARON + '\u0113' # 0xBA -> LATIN SMALL LETTER E WITH MACRON + '\u0123' # 0xBB -> LATIN SMALL LETTER G WITH CEDILLA + '\u0167' # 0xBC -> LATIN SMALL LETTER T WITH STROKE + '\u014a' # 0xBD -> LATIN CAPITAL LETTER ENG + '\u017e' # 0xBE -> LATIN SMALL LETTER Z WITH CARON + '\u014b' # 0xBF -> LATIN SMALL LETTER ENG + '\u0100' # 0xC0 -> LATIN CAPITAL LETTER A WITH MACRON + '\xc1' # 0xC1 -> LATIN CAPITAL LETTER A WITH ACUTE + '\xc2' # 0xC2 -> LATIN CAPITAL LETTER A WITH CIRCUMFLEX + '\xc3' # 0xC3 -> LATIN CAPITAL LETTER A WITH TILDE + '\xc4' # 0xC4 -> LATIN CAPITAL LETTER A WITH DIAERESIS + '\xc5' # 0xC5 -> LATIN CAPITAL LETTER A WITH RING ABOVE + '\xc6' # 0xC6 -> LATIN CAPITAL LETTER AE + '\u012e' # 0xC7 -> LATIN CAPITAL LETTER I WITH OGONEK + '\u010c' # 0xC8 -> LATIN CAPITAL LETTER C WITH CARON + '\xc9' # 0xC9 -> LATIN CAPITAL LETTER E WITH ACUTE + '\u0118' # 0xCA -> LATIN CAPITAL LETTER E WITH OGONEK + '\xcb' # 0xCB -> LATIN CAPITAL LETTER E WITH DIAERESIS + '\u0116' # 0xCC -> LATIN CAPITAL LETTER E WITH DOT ABOVE + '\xcd' # 0xCD -> LATIN CAPITAL LETTER I WITH ACUTE + '\xce' # 0xCE -> LATIN CAPITAL LETTER I WITH CIRCUMFLEX + '\u012a' # 0xCF -> LATIN CAPITAL LETTER I WITH MACRON + '\u0110' # 0xD0 -> LATIN CAPITAL LETTER D WITH STROKE + '\u0145' # 0xD1 -> LATIN CAPITAL LETTER N WITH CEDILLA + '\u014c' # 0xD2 -> LATIN CAPITAL LETTER O WITH MACRON + '\u0136' # 0xD3 -> LATIN CAPITAL LETTER K WITH CEDILLA + '\xd4' # 0xD4 -> LATIN CAPITAL LETTER O WITH CIRCUMFLEX + '\xd5' # 0xD5 -> LATIN CAPITAL LETTER O WITH TILDE + '\xd6' # 0xD6 -> LATIN CAPITAL LETTER O WITH DIAERESIS + '\xd7' # 0xD7 -> MULTIPLICATION SIGN + '\xd8' # 0xD8 -> LATIN CAPITAL LETTER O WITH STROKE + '\u0172' # 0xD9 -> LATIN CAPITAL LETTER U WITH OGONEK + '\xda' # 0xDA -> LATIN CAPITAL LETTER U WITH ACUTE + '\xdb' # 0xDB -> LATIN CAPITAL LETTER U WITH CIRCUMFLEX + '\xdc' # 0xDC -> LATIN CAPITAL LETTER U WITH DIAERESIS + '\u0168' # 0xDD -> LATIN CAPITAL LETTER U WITH TILDE + '\u016a' # 0xDE -> LATIN CAPITAL LETTER U WITH MACRON + '\xdf' # 0xDF -> LATIN SMALL LETTER SHARP S + '\u0101' # 0xE0 -> LATIN SMALL LETTER A WITH MACRON + '\xe1' # 0xE1 -> LATIN SMALL LETTER A WITH ACUTE + '\xe2' # 0xE2 -> LATIN SMALL LETTER A WITH CIRCUMFLEX + '\xe3' # 0xE3 -> LATIN SMALL LETTER A WITH TILDE + '\xe4' # 0xE4 -> LATIN SMALL LETTER A WITH DIAERESIS + '\xe5' # 0xE5 -> LATIN SMALL LETTER A WITH RING ABOVE + '\xe6' # 0xE6 -> LATIN SMALL LETTER AE + '\u012f' # 0xE7 -> LATIN SMALL LETTER I WITH OGONEK + '\u010d' # 0xE8 -> LATIN SMALL LETTER C WITH CARON + '\xe9' # 0xE9 -> LATIN SMALL LETTER E WITH ACUTE + '\u0119' # 0xEA -> LATIN SMALL LETTER E WITH OGONEK + '\xeb' # 0xEB -> LATIN SMALL LETTER E WITH DIAERESIS + '\u0117' # 0xEC -> LATIN SMALL LETTER E WITH DOT ABOVE + '\xed' # 0xED -> LATIN SMALL LETTER I WITH ACUTE + '\xee' # 0xEE -> LATIN SMALL LETTER I WITH CIRCUMFLEX + '\u012b' # 0xEF -> LATIN SMALL LETTER I WITH MACRON + '\u0111' # 0xF0 -> LATIN SMALL LETTER D WITH STROKE + '\u0146' # 0xF1 -> LATIN SMALL LETTER N WITH CEDILLA + '\u014d' # 0xF2 -> LATIN SMALL LETTER O WITH MACRON + '\u0137' # 0xF3 -> LATIN SMALL LETTER K WITH CEDILLA + '\xf4' # 0xF4 -> LATIN SMALL LETTER O WITH CIRCUMFLEX + '\xf5' # 0xF5 -> LATIN SMALL LETTER O WITH TILDE + '\xf6' # 0xF6 -> LATIN SMALL LETTER O WITH DIAERESIS + '\xf7' # 0xF7 -> DIVISION SIGN + '\xf8' # 0xF8 -> LATIN SMALL LETTER O WITH STROKE + '\u0173' # 0xF9 -> LATIN SMALL LETTER U WITH OGONEK + '\xfa' # 0xFA -> LATIN SMALL LETTER U WITH ACUTE + '\xfb' # 0xFB -> LATIN SMALL LETTER U WITH CIRCUMFLEX + '\xfc' # 0xFC -> LATIN SMALL LETTER U WITH DIAERESIS + '\u0169' # 0xFD -> LATIN SMALL LETTER U WITH TILDE + '\u016b' # 0xFE -> LATIN SMALL LETTER U WITH MACRON + '\u02d9' # 0xFF -> DOT ABOVE +) + +### Encoding table +encoding_table=codecs.charmap_build(decoding_table) diff --git a/env/Lib/encodings/iso8859_5.py b/env/Lib/encodings/iso8859_5.py new file mode 100644 index 0000000..a3c868a --- /dev/null +++ b/env/Lib/encodings/iso8859_5.py @@ -0,0 +1,307 @@ +""" Python Character Mapping Codec iso8859_5 generated from 'MAPPINGS/ISO8859/8859-5.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='iso8859-5', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) + + +### Decoding Table + +decoding_table = ( + '\x00' # 0x00 -> NULL + '\x01' # 0x01 -> START OF HEADING + '\x02' # 0x02 -> START OF TEXT + '\x03' # 0x03 -> END OF TEXT + '\x04' # 0x04 -> END OF TRANSMISSION + '\x05' # 0x05 -> ENQUIRY + '\x06' # 0x06 -> ACKNOWLEDGE + '\x07' # 0x07 -> BELL + '\x08' # 0x08 -> BACKSPACE + '\t' # 0x09 -> HORIZONTAL TABULATION + '\n' # 0x0A -> LINE FEED + '\x0b' # 0x0B -> VERTICAL TABULATION + '\x0c' # 0x0C -> FORM FEED + '\r' # 0x0D -> CARRIAGE RETURN + '\x0e' # 0x0E -> SHIFT OUT + '\x0f' # 0x0F -> SHIFT IN + '\x10' # 0x10 -> DATA LINK ESCAPE + '\x11' # 0x11 -> DEVICE CONTROL ONE + '\x12' # 0x12 -> DEVICE CONTROL TWO + '\x13' # 0x13 -> DEVICE CONTROL THREE + '\x14' # 0x14 -> DEVICE CONTROL FOUR + '\x15' # 0x15 -> NEGATIVE ACKNOWLEDGE + '\x16' # 0x16 -> SYNCHRONOUS IDLE + '\x17' # 0x17 -> END OF TRANSMISSION BLOCK + '\x18' # 0x18 -> CANCEL + '\x19' # 0x19 -> END OF MEDIUM + '\x1a' # 0x1A -> SUBSTITUTE + '\x1b' # 0x1B -> ESCAPE + '\x1c' # 0x1C -> FILE SEPARATOR + '\x1d' # 0x1D -> GROUP SEPARATOR + '\x1e' # 0x1E -> RECORD SEPARATOR + '\x1f' # 0x1F -> UNIT SEPARATOR + ' ' # 0x20 -> SPACE + '!' # 0x21 -> EXCLAMATION MARK + '"' # 0x22 -> QUOTATION MARK + '#' # 0x23 -> NUMBER SIGN + '$' # 0x24 -> DOLLAR SIGN + '%' # 0x25 -> PERCENT SIGN + '&' # 0x26 -> AMPERSAND + "'" # 0x27 -> APOSTROPHE + '(' # 0x28 -> LEFT PARENTHESIS + ')' # 0x29 -> RIGHT PARENTHESIS + '*' # 0x2A -> ASTERISK + '+' # 0x2B -> PLUS SIGN + ',' # 0x2C -> COMMA + '-' # 0x2D -> HYPHEN-MINUS + '.' # 0x2E -> FULL STOP + '/' # 0x2F -> SOLIDUS + '0' # 0x30 -> DIGIT ZERO + '1' # 0x31 -> DIGIT ONE + '2' # 0x32 -> DIGIT TWO + '3' # 0x33 -> DIGIT THREE + '4' # 0x34 -> DIGIT FOUR + '5' # 0x35 -> DIGIT FIVE + '6' # 0x36 -> DIGIT SIX + '7' # 0x37 -> DIGIT SEVEN + '8' # 0x38 -> DIGIT EIGHT + '9' # 0x39 -> DIGIT NINE + ':' # 0x3A -> COLON + ';' # 0x3B -> SEMICOLON + '<' # 0x3C -> LESS-THAN SIGN + '=' # 0x3D -> EQUALS SIGN + '>' # 0x3E -> GREATER-THAN SIGN + '?' # 0x3F -> QUESTION MARK + '@' # 0x40 -> COMMERCIAL AT + 'A' # 0x41 -> LATIN CAPITAL LETTER A + 'B' # 0x42 -> LATIN CAPITAL LETTER B + 'C' # 0x43 -> LATIN CAPITAL LETTER C + 'D' # 0x44 -> LATIN CAPITAL LETTER D + 'E' # 0x45 -> LATIN CAPITAL LETTER E + 'F' # 0x46 -> LATIN CAPITAL LETTER F + 'G' # 0x47 -> LATIN CAPITAL LETTER G + 'H' # 0x48 -> LATIN CAPITAL LETTER H + 'I' # 0x49 -> LATIN CAPITAL LETTER I + 'J' # 0x4A -> LATIN CAPITAL LETTER J + 'K' # 0x4B -> LATIN CAPITAL LETTER K + 'L' # 0x4C -> LATIN CAPITAL LETTER L + 'M' # 0x4D -> LATIN CAPITAL LETTER M + 'N' # 0x4E -> LATIN CAPITAL LETTER N + 'O' # 0x4F -> LATIN CAPITAL LETTER O + 'P' # 0x50 -> LATIN CAPITAL LETTER P + 'Q' # 0x51 -> LATIN CAPITAL LETTER Q + 'R' # 0x52 -> LATIN CAPITAL LETTER R + 'S' # 0x53 -> LATIN CAPITAL LETTER S + 'T' # 0x54 -> LATIN CAPITAL LETTER T + 'U' # 0x55 -> LATIN CAPITAL LETTER U + 'V' # 0x56 -> LATIN CAPITAL LETTER V + 'W' # 0x57 -> LATIN CAPITAL LETTER W + 'X' # 0x58 -> LATIN CAPITAL LETTER X + 'Y' # 0x59 -> LATIN CAPITAL LETTER Y + 'Z' # 0x5A -> LATIN CAPITAL LETTER Z + '[' # 0x5B -> LEFT SQUARE BRACKET + '\\' # 0x5C -> REVERSE SOLIDUS + ']' # 0x5D -> RIGHT SQUARE BRACKET + '^' # 0x5E -> CIRCUMFLEX ACCENT + '_' # 0x5F -> LOW LINE + '`' # 0x60 -> GRAVE ACCENT + 'a' # 0x61 -> LATIN SMALL LETTER A + 'b' # 0x62 -> LATIN SMALL LETTER B + 'c' # 0x63 -> LATIN SMALL LETTER C + 'd' # 0x64 -> LATIN SMALL LETTER D + 'e' # 0x65 -> LATIN SMALL LETTER E + 'f' # 0x66 -> LATIN SMALL LETTER F + 'g' # 0x67 -> LATIN SMALL LETTER G + 'h' # 0x68 -> LATIN SMALL LETTER H + 'i' # 0x69 -> LATIN SMALL LETTER I + 'j' # 0x6A -> LATIN SMALL LETTER J + 'k' # 0x6B -> LATIN SMALL LETTER K + 'l' # 0x6C -> LATIN SMALL LETTER L + 'm' # 0x6D -> LATIN SMALL LETTER M + 'n' # 0x6E -> LATIN SMALL LETTER N + 'o' # 0x6F -> LATIN SMALL LETTER O + 'p' # 0x70 -> LATIN SMALL LETTER P + 'q' # 0x71 -> LATIN SMALL LETTER Q + 'r' # 0x72 -> LATIN SMALL LETTER R + 's' # 0x73 -> LATIN SMALL LETTER S + 't' # 0x74 -> LATIN SMALL LETTER T + 'u' # 0x75 -> LATIN SMALL LETTER U + 'v' # 0x76 -> LATIN SMALL LETTER V + 'w' # 0x77 -> LATIN SMALL LETTER W + 'x' # 0x78 -> LATIN SMALL LETTER X + 'y' # 0x79 -> LATIN SMALL LETTER Y + 'z' # 0x7A -> LATIN SMALL LETTER Z + '{' # 0x7B -> LEFT CURLY BRACKET + '|' # 0x7C -> VERTICAL LINE + '}' # 0x7D -> RIGHT CURLY BRACKET + '~' # 0x7E -> TILDE + '\x7f' # 0x7F -> DELETE + '\x80' # 0x80 -> + '\x81' # 0x81 -> + '\x82' # 0x82 -> + '\x83' # 0x83 -> + '\x84' # 0x84 -> + '\x85' # 0x85 -> + '\x86' # 0x86 -> + '\x87' # 0x87 -> + '\x88' # 0x88 -> + '\x89' # 0x89 -> + '\x8a' # 0x8A -> + '\x8b' # 0x8B -> + '\x8c' # 0x8C -> + '\x8d' # 0x8D -> + '\x8e' # 0x8E -> + '\x8f' # 0x8F -> + '\x90' # 0x90 -> + '\x91' # 0x91 -> + '\x92' # 0x92 -> + '\x93' # 0x93 -> + '\x94' # 0x94 -> + '\x95' # 0x95 -> + '\x96' # 0x96 -> + '\x97' # 0x97 -> + '\x98' # 0x98 -> + '\x99' # 0x99 -> + '\x9a' # 0x9A -> + '\x9b' # 0x9B -> + '\x9c' # 0x9C -> + '\x9d' # 0x9D -> + '\x9e' # 0x9E -> + '\x9f' # 0x9F -> + '\xa0' # 0xA0 -> NO-BREAK SPACE + '\u0401' # 0xA1 -> CYRILLIC CAPITAL LETTER IO + '\u0402' # 0xA2 -> CYRILLIC CAPITAL LETTER DJE + '\u0403' # 0xA3 -> CYRILLIC CAPITAL LETTER GJE + '\u0404' # 0xA4 -> CYRILLIC CAPITAL LETTER UKRAINIAN IE + '\u0405' # 0xA5 -> CYRILLIC CAPITAL LETTER DZE + '\u0406' # 0xA6 -> CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I + '\u0407' # 0xA7 -> CYRILLIC CAPITAL LETTER YI + '\u0408' # 0xA8 -> CYRILLIC CAPITAL LETTER JE + '\u0409' # 0xA9 -> CYRILLIC CAPITAL LETTER LJE + '\u040a' # 0xAA -> CYRILLIC CAPITAL LETTER NJE + '\u040b' # 0xAB -> CYRILLIC CAPITAL LETTER TSHE + '\u040c' # 0xAC -> CYRILLIC CAPITAL LETTER KJE + '\xad' # 0xAD -> SOFT HYPHEN + '\u040e' # 0xAE -> CYRILLIC CAPITAL LETTER SHORT U + '\u040f' # 0xAF -> CYRILLIC CAPITAL LETTER DZHE + '\u0410' # 0xB0 -> CYRILLIC CAPITAL LETTER A + '\u0411' # 0xB1 -> CYRILLIC CAPITAL LETTER BE + '\u0412' # 0xB2 -> CYRILLIC CAPITAL LETTER VE + '\u0413' # 0xB3 -> CYRILLIC CAPITAL LETTER GHE + '\u0414' # 0xB4 -> CYRILLIC CAPITAL LETTER DE + '\u0415' # 0xB5 -> CYRILLIC CAPITAL LETTER IE + '\u0416' # 0xB6 -> CYRILLIC CAPITAL LETTER ZHE + '\u0417' # 0xB7 -> CYRILLIC CAPITAL LETTER ZE + '\u0418' # 0xB8 -> CYRILLIC CAPITAL LETTER I + '\u0419' # 0xB9 -> CYRILLIC CAPITAL LETTER SHORT I + '\u041a' # 0xBA -> CYRILLIC CAPITAL LETTER KA + '\u041b' # 0xBB -> CYRILLIC CAPITAL LETTER EL + '\u041c' # 0xBC -> CYRILLIC CAPITAL LETTER EM + '\u041d' # 0xBD -> CYRILLIC CAPITAL LETTER EN + '\u041e' # 0xBE -> CYRILLIC CAPITAL LETTER O + '\u041f' # 0xBF -> CYRILLIC CAPITAL LETTER PE + '\u0420' # 0xC0 -> CYRILLIC CAPITAL LETTER ER + '\u0421' # 0xC1 -> CYRILLIC CAPITAL LETTER ES + '\u0422' # 0xC2 -> CYRILLIC CAPITAL LETTER TE + '\u0423' # 0xC3 -> CYRILLIC CAPITAL LETTER U + '\u0424' # 0xC4 -> CYRILLIC CAPITAL LETTER EF + '\u0425' # 0xC5 -> CYRILLIC CAPITAL LETTER HA + '\u0426' # 0xC6 -> CYRILLIC CAPITAL LETTER TSE + '\u0427' # 0xC7 -> CYRILLIC CAPITAL LETTER CHE + '\u0428' # 0xC8 -> CYRILLIC CAPITAL LETTER SHA + '\u0429' # 0xC9 -> CYRILLIC CAPITAL LETTER SHCHA + '\u042a' # 0xCA -> CYRILLIC CAPITAL LETTER HARD SIGN + '\u042b' # 0xCB -> CYRILLIC CAPITAL LETTER YERU + '\u042c' # 0xCC -> CYRILLIC CAPITAL LETTER SOFT SIGN + '\u042d' # 0xCD -> CYRILLIC CAPITAL LETTER E + '\u042e' # 0xCE -> CYRILLIC CAPITAL LETTER YU + '\u042f' # 0xCF -> CYRILLIC CAPITAL LETTER YA + '\u0430' # 0xD0 -> CYRILLIC SMALL LETTER A + '\u0431' # 0xD1 -> CYRILLIC SMALL LETTER BE + '\u0432' # 0xD2 -> CYRILLIC SMALL LETTER VE + '\u0433' # 0xD3 -> CYRILLIC SMALL LETTER GHE + '\u0434' # 0xD4 -> CYRILLIC SMALL LETTER DE + '\u0435' # 0xD5 -> CYRILLIC SMALL LETTER IE + '\u0436' # 0xD6 -> CYRILLIC SMALL LETTER ZHE + '\u0437' # 0xD7 -> CYRILLIC SMALL LETTER ZE + '\u0438' # 0xD8 -> CYRILLIC SMALL LETTER I + '\u0439' # 0xD9 -> CYRILLIC SMALL LETTER SHORT I + '\u043a' # 0xDA -> CYRILLIC SMALL LETTER KA + '\u043b' # 0xDB -> CYRILLIC SMALL LETTER EL + '\u043c' # 0xDC -> CYRILLIC SMALL LETTER EM + '\u043d' # 0xDD -> CYRILLIC SMALL LETTER EN + '\u043e' # 0xDE -> CYRILLIC SMALL LETTER O + '\u043f' # 0xDF -> CYRILLIC SMALL LETTER PE + '\u0440' # 0xE0 -> CYRILLIC SMALL LETTER ER + '\u0441' # 0xE1 -> CYRILLIC SMALL LETTER ES + '\u0442' # 0xE2 -> CYRILLIC SMALL LETTER TE + '\u0443' # 0xE3 -> CYRILLIC SMALL LETTER U + '\u0444' # 0xE4 -> CYRILLIC SMALL LETTER EF + '\u0445' # 0xE5 -> CYRILLIC SMALL LETTER HA + '\u0446' # 0xE6 -> CYRILLIC SMALL LETTER TSE + '\u0447' # 0xE7 -> CYRILLIC SMALL LETTER CHE + '\u0448' # 0xE8 -> CYRILLIC SMALL LETTER SHA + '\u0449' # 0xE9 -> CYRILLIC SMALL LETTER SHCHA + '\u044a' # 0xEA -> CYRILLIC SMALL LETTER HARD SIGN + '\u044b' # 0xEB -> CYRILLIC SMALL LETTER YERU + '\u044c' # 0xEC -> CYRILLIC SMALL LETTER SOFT SIGN + '\u044d' # 0xED -> CYRILLIC SMALL LETTER E + '\u044e' # 0xEE -> CYRILLIC SMALL LETTER YU + '\u044f' # 0xEF -> CYRILLIC SMALL LETTER YA + '\u2116' # 0xF0 -> NUMERO SIGN + '\u0451' # 0xF1 -> CYRILLIC SMALL LETTER IO + '\u0452' # 0xF2 -> CYRILLIC SMALL LETTER DJE + '\u0453' # 0xF3 -> CYRILLIC SMALL LETTER GJE + '\u0454' # 0xF4 -> CYRILLIC SMALL LETTER UKRAINIAN IE + '\u0455' # 0xF5 -> CYRILLIC SMALL LETTER DZE + '\u0456' # 0xF6 -> CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I + '\u0457' # 0xF7 -> CYRILLIC SMALL LETTER YI + '\u0458' # 0xF8 -> CYRILLIC SMALL LETTER JE + '\u0459' # 0xF9 -> CYRILLIC SMALL LETTER LJE + '\u045a' # 0xFA -> CYRILLIC SMALL LETTER NJE + '\u045b' # 0xFB -> CYRILLIC SMALL LETTER TSHE + '\u045c' # 0xFC -> CYRILLIC SMALL LETTER KJE + '\xa7' # 0xFD -> SECTION SIGN + '\u045e' # 0xFE -> CYRILLIC SMALL LETTER SHORT U + '\u045f' # 0xFF -> CYRILLIC SMALL LETTER DZHE +) + +### Encoding table +encoding_table=codecs.charmap_build(decoding_table) diff --git a/env/Lib/encodings/iso8859_6.py b/env/Lib/encodings/iso8859_6.py new file mode 100644 index 0000000..b02ade6 --- /dev/null +++ b/env/Lib/encodings/iso8859_6.py @@ -0,0 +1,307 @@ +""" Python Character Mapping Codec iso8859_6 generated from 'MAPPINGS/ISO8859/8859-6.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='iso8859-6', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) + + +### Decoding Table + +decoding_table = ( + '\x00' # 0x00 -> NULL + '\x01' # 0x01 -> START OF HEADING + '\x02' # 0x02 -> START OF TEXT + '\x03' # 0x03 -> END OF TEXT + '\x04' # 0x04 -> END OF TRANSMISSION + '\x05' # 0x05 -> ENQUIRY + '\x06' # 0x06 -> ACKNOWLEDGE + '\x07' # 0x07 -> BELL + '\x08' # 0x08 -> BACKSPACE + '\t' # 0x09 -> HORIZONTAL TABULATION + '\n' # 0x0A -> LINE FEED + '\x0b' # 0x0B -> VERTICAL TABULATION + '\x0c' # 0x0C -> FORM FEED + '\r' # 0x0D -> CARRIAGE RETURN + '\x0e' # 0x0E -> SHIFT OUT + '\x0f' # 0x0F -> SHIFT IN + '\x10' # 0x10 -> DATA LINK ESCAPE + '\x11' # 0x11 -> DEVICE CONTROL ONE + '\x12' # 0x12 -> DEVICE CONTROL TWO + '\x13' # 0x13 -> DEVICE CONTROL THREE + '\x14' # 0x14 -> DEVICE CONTROL FOUR + '\x15' # 0x15 -> NEGATIVE ACKNOWLEDGE + '\x16' # 0x16 -> SYNCHRONOUS IDLE + '\x17' # 0x17 -> END OF TRANSMISSION BLOCK + '\x18' # 0x18 -> CANCEL + '\x19' # 0x19 -> END OF MEDIUM + '\x1a' # 0x1A -> SUBSTITUTE + '\x1b' # 0x1B -> ESCAPE + '\x1c' # 0x1C -> FILE SEPARATOR + '\x1d' # 0x1D -> GROUP SEPARATOR + '\x1e' # 0x1E -> RECORD SEPARATOR + '\x1f' # 0x1F -> UNIT SEPARATOR + ' ' # 0x20 -> SPACE + '!' # 0x21 -> EXCLAMATION MARK + '"' # 0x22 -> QUOTATION MARK + '#' # 0x23 -> NUMBER SIGN + '$' # 0x24 -> DOLLAR SIGN + '%' # 0x25 -> PERCENT SIGN + '&' # 0x26 -> AMPERSAND + "'" # 0x27 -> APOSTROPHE + '(' # 0x28 -> LEFT PARENTHESIS + ')' # 0x29 -> RIGHT PARENTHESIS + '*' # 0x2A -> ASTERISK + '+' # 0x2B -> PLUS SIGN + ',' # 0x2C -> COMMA + '-' # 0x2D -> HYPHEN-MINUS + '.' # 0x2E -> FULL STOP + '/' # 0x2F -> SOLIDUS + '0' # 0x30 -> DIGIT ZERO + '1' # 0x31 -> DIGIT ONE + '2' # 0x32 -> DIGIT TWO + '3' # 0x33 -> DIGIT THREE + '4' # 0x34 -> DIGIT FOUR + '5' # 0x35 -> DIGIT FIVE + '6' # 0x36 -> DIGIT SIX + '7' # 0x37 -> DIGIT SEVEN + '8' # 0x38 -> DIGIT EIGHT + '9' # 0x39 -> DIGIT NINE + ':' # 0x3A -> COLON + ';' # 0x3B -> SEMICOLON + '<' # 0x3C -> LESS-THAN SIGN + '=' # 0x3D -> EQUALS SIGN + '>' # 0x3E -> GREATER-THAN SIGN + '?' # 0x3F -> QUESTION MARK + '@' # 0x40 -> COMMERCIAL AT + 'A' # 0x41 -> LATIN CAPITAL LETTER A + 'B' # 0x42 -> LATIN CAPITAL LETTER B + 'C' # 0x43 -> LATIN CAPITAL LETTER C + 'D' # 0x44 -> LATIN CAPITAL LETTER D + 'E' # 0x45 -> LATIN CAPITAL LETTER E + 'F' # 0x46 -> LATIN CAPITAL LETTER F + 'G' # 0x47 -> LATIN CAPITAL LETTER G + 'H' # 0x48 -> LATIN CAPITAL LETTER H + 'I' # 0x49 -> LATIN CAPITAL LETTER I + 'J' # 0x4A -> LATIN CAPITAL LETTER J + 'K' # 0x4B -> LATIN CAPITAL LETTER K + 'L' # 0x4C -> LATIN CAPITAL LETTER L + 'M' # 0x4D -> LATIN CAPITAL LETTER M + 'N' # 0x4E -> LATIN CAPITAL LETTER N + 'O' # 0x4F -> LATIN CAPITAL LETTER O + 'P' # 0x50 -> LATIN CAPITAL LETTER P + 'Q' # 0x51 -> LATIN CAPITAL LETTER Q + 'R' # 0x52 -> LATIN CAPITAL LETTER R + 'S' # 0x53 -> LATIN CAPITAL LETTER S + 'T' # 0x54 -> LATIN CAPITAL LETTER T + 'U' # 0x55 -> LATIN CAPITAL LETTER U + 'V' # 0x56 -> LATIN CAPITAL LETTER V + 'W' # 0x57 -> LATIN CAPITAL LETTER W + 'X' # 0x58 -> LATIN CAPITAL LETTER X + 'Y' # 0x59 -> LATIN CAPITAL LETTER Y + 'Z' # 0x5A -> LATIN CAPITAL LETTER Z + '[' # 0x5B -> LEFT SQUARE BRACKET + '\\' # 0x5C -> REVERSE SOLIDUS + ']' # 0x5D -> RIGHT SQUARE BRACKET + '^' # 0x5E -> CIRCUMFLEX ACCENT + '_' # 0x5F -> LOW LINE + '`' # 0x60 -> GRAVE ACCENT + 'a' # 0x61 -> LATIN SMALL LETTER A + 'b' # 0x62 -> LATIN SMALL LETTER B + 'c' # 0x63 -> LATIN SMALL LETTER C + 'd' # 0x64 -> LATIN SMALL LETTER D + 'e' # 0x65 -> LATIN SMALL LETTER E + 'f' # 0x66 -> LATIN SMALL LETTER F + 'g' # 0x67 -> LATIN SMALL LETTER G + 'h' # 0x68 -> LATIN SMALL LETTER H + 'i' # 0x69 -> LATIN SMALL LETTER I + 'j' # 0x6A -> LATIN SMALL LETTER J + 'k' # 0x6B -> LATIN SMALL LETTER K + 'l' # 0x6C -> LATIN SMALL LETTER L + 'm' # 0x6D -> LATIN SMALL LETTER M + 'n' # 0x6E -> LATIN SMALL LETTER N + 'o' # 0x6F -> LATIN SMALL LETTER O + 'p' # 0x70 -> LATIN SMALL LETTER P + 'q' # 0x71 -> LATIN SMALL LETTER Q + 'r' # 0x72 -> LATIN SMALL LETTER R + 's' # 0x73 -> LATIN SMALL LETTER S + 't' # 0x74 -> LATIN SMALL LETTER T + 'u' # 0x75 -> LATIN SMALL LETTER U + 'v' # 0x76 -> LATIN SMALL LETTER V + 'w' # 0x77 -> LATIN SMALL LETTER W + 'x' # 0x78 -> LATIN SMALL LETTER X + 'y' # 0x79 -> LATIN SMALL LETTER Y + 'z' # 0x7A -> LATIN SMALL LETTER Z + '{' # 0x7B -> LEFT CURLY BRACKET + '|' # 0x7C -> VERTICAL LINE + '}' # 0x7D -> RIGHT CURLY BRACKET + '~' # 0x7E -> TILDE + '\x7f' # 0x7F -> DELETE + '\x80' # 0x80 -> + '\x81' # 0x81 -> + '\x82' # 0x82 -> + '\x83' # 0x83 -> + '\x84' # 0x84 -> + '\x85' # 0x85 -> + '\x86' # 0x86 -> + '\x87' # 0x87 -> + '\x88' # 0x88 -> + '\x89' # 0x89 -> + '\x8a' # 0x8A -> + '\x8b' # 0x8B -> + '\x8c' # 0x8C -> + '\x8d' # 0x8D -> + '\x8e' # 0x8E -> + '\x8f' # 0x8F -> + '\x90' # 0x90 -> + '\x91' # 0x91 -> + '\x92' # 0x92 -> + '\x93' # 0x93 -> + '\x94' # 0x94 -> + '\x95' # 0x95 -> + '\x96' # 0x96 -> + '\x97' # 0x97 -> + '\x98' # 0x98 -> + '\x99' # 0x99 -> + '\x9a' # 0x9A -> + '\x9b' # 0x9B -> + '\x9c' # 0x9C -> + '\x9d' # 0x9D -> + '\x9e' # 0x9E -> + '\x9f' # 0x9F -> + '\xa0' # 0xA0 -> NO-BREAK SPACE + '\ufffe' + '\ufffe' + '\ufffe' + '\xa4' # 0xA4 -> CURRENCY SIGN + '\ufffe' + '\ufffe' + '\ufffe' + '\ufffe' + '\ufffe' + '\ufffe' + '\ufffe' + '\u060c' # 0xAC -> ARABIC COMMA + '\xad' # 0xAD -> SOFT HYPHEN + '\ufffe' + '\ufffe' + '\ufffe' + '\ufffe' + '\ufffe' + '\ufffe' + '\ufffe' + '\ufffe' + '\ufffe' + '\ufffe' + '\ufffe' + '\ufffe' + '\ufffe' + '\u061b' # 0xBB -> ARABIC SEMICOLON + '\ufffe' + '\ufffe' + '\ufffe' + '\u061f' # 0xBF -> ARABIC QUESTION MARK + '\ufffe' + '\u0621' # 0xC1 -> ARABIC LETTER HAMZA + '\u0622' # 0xC2 -> ARABIC LETTER ALEF WITH MADDA ABOVE + '\u0623' # 0xC3 -> ARABIC LETTER ALEF WITH HAMZA ABOVE + '\u0624' # 0xC4 -> ARABIC LETTER WAW WITH HAMZA ABOVE + '\u0625' # 0xC5 -> ARABIC LETTER ALEF WITH HAMZA BELOW + '\u0626' # 0xC6 -> ARABIC LETTER YEH WITH HAMZA ABOVE + '\u0627' # 0xC7 -> ARABIC LETTER ALEF + '\u0628' # 0xC8 -> ARABIC LETTER BEH + '\u0629' # 0xC9 -> ARABIC LETTER TEH MARBUTA + '\u062a' # 0xCA -> ARABIC LETTER TEH + '\u062b' # 0xCB -> ARABIC LETTER THEH + '\u062c' # 0xCC -> ARABIC LETTER JEEM + '\u062d' # 0xCD -> ARABIC LETTER HAH + '\u062e' # 0xCE -> ARABIC LETTER KHAH + '\u062f' # 0xCF -> ARABIC LETTER DAL + '\u0630' # 0xD0 -> ARABIC LETTER THAL + '\u0631' # 0xD1 -> ARABIC LETTER REH + '\u0632' # 0xD2 -> ARABIC LETTER ZAIN + '\u0633' # 0xD3 -> ARABIC LETTER SEEN + '\u0634' # 0xD4 -> ARABIC LETTER SHEEN + '\u0635' # 0xD5 -> ARABIC LETTER SAD + '\u0636' # 0xD6 -> ARABIC LETTER DAD + '\u0637' # 0xD7 -> ARABIC LETTER TAH + '\u0638' # 0xD8 -> ARABIC LETTER ZAH + '\u0639' # 0xD9 -> ARABIC LETTER AIN + '\u063a' # 0xDA -> ARABIC LETTER GHAIN + '\ufffe' + '\ufffe' + '\ufffe' + '\ufffe' + '\ufffe' + '\u0640' # 0xE0 -> ARABIC TATWEEL + '\u0641' # 0xE1 -> ARABIC LETTER FEH + '\u0642' # 0xE2 -> ARABIC LETTER QAF + '\u0643' # 0xE3 -> ARABIC LETTER KAF + '\u0644' # 0xE4 -> ARABIC LETTER LAM + '\u0645' # 0xE5 -> ARABIC LETTER MEEM + '\u0646' # 0xE6 -> ARABIC LETTER NOON + '\u0647' # 0xE7 -> ARABIC LETTER HEH + '\u0648' # 0xE8 -> ARABIC LETTER WAW + '\u0649' # 0xE9 -> ARABIC LETTER ALEF MAKSURA + '\u064a' # 0xEA -> ARABIC LETTER YEH + '\u064b' # 0xEB -> ARABIC FATHATAN + '\u064c' # 0xEC -> ARABIC DAMMATAN + '\u064d' # 0xED -> ARABIC KASRATAN + '\u064e' # 0xEE -> ARABIC FATHA + '\u064f' # 0xEF -> ARABIC DAMMA + '\u0650' # 0xF0 -> ARABIC KASRA + '\u0651' # 0xF1 -> ARABIC SHADDA + '\u0652' # 0xF2 -> ARABIC SUKUN + '\ufffe' + '\ufffe' + '\ufffe' + '\ufffe' + '\ufffe' + '\ufffe' + '\ufffe' + '\ufffe' + '\ufffe' + '\ufffe' + '\ufffe' + '\ufffe' + '\ufffe' +) + +### Encoding table +encoding_table=codecs.charmap_build(decoding_table) diff --git a/env/Lib/encodings/iso8859_7.py b/env/Lib/encodings/iso8859_7.py new file mode 100644 index 0000000..d7b39cb --- /dev/null +++ b/env/Lib/encodings/iso8859_7.py @@ -0,0 +1,307 @@ +""" Python Character Mapping Codec iso8859_7 generated from 'MAPPINGS/ISO8859/8859-7.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='iso8859-7', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) + + +### Decoding Table + +decoding_table = ( + '\x00' # 0x00 -> NULL + '\x01' # 0x01 -> START OF HEADING + '\x02' # 0x02 -> START OF TEXT + '\x03' # 0x03 -> END OF TEXT + '\x04' # 0x04 -> END OF TRANSMISSION + '\x05' # 0x05 -> ENQUIRY + '\x06' # 0x06 -> ACKNOWLEDGE + '\x07' # 0x07 -> BELL + '\x08' # 0x08 -> BACKSPACE + '\t' # 0x09 -> HORIZONTAL TABULATION + '\n' # 0x0A -> LINE FEED + '\x0b' # 0x0B -> VERTICAL TABULATION + '\x0c' # 0x0C -> FORM FEED + '\r' # 0x0D -> CARRIAGE RETURN + '\x0e' # 0x0E -> SHIFT OUT + '\x0f' # 0x0F -> SHIFT IN + '\x10' # 0x10 -> DATA LINK ESCAPE + '\x11' # 0x11 -> DEVICE CONTROL ONE + '\x12' # 0x12 -> DEVICE CONTROL TWO + '\x13' # 0x13 -> DEVICE CONTROL THREE + '\x14' # 0x14 -> DEVICE CONTROL FOUR + '\x15' # 0x15 -> NEGATIVE ACKNOWLEDGE + '\x16' # 0x16 -> SYNCHRONOUS IDLE + '\x17' # 0x17 -> END OF TRANSMISSION BLOCK + '\x18' # 0x18 -> CANCEL + '\x19' # 0x19 -> END OF MEDIUM + '\x1a' # 0x1A -> SUBSTITUTE + '\x1b' # 0x1B -> ESCAPE + '\x1c' # 0x1C -> FILE SEPARATOR + '\x1d' # 0x1D -> GROUP SEPARATOR + '\x1e' # 0x1E -> RECORD SEPARATOR + '\x1f' # 0x1F -> UNIT SEPARATOR + ' ' # 0x20 -> SPACE + '!' # 0x21 -> EXCLAMATION MARK + '"' # 0x22 -> QUOTATION MARK + '#' # 0x23 -> NUMBER SIGN + '$' # 0x24 -> DOLLAR SIGN + '%' # 0x25 -> PERCENT SIGN + '&' # 0x26 -> AMPERSAND + "'" # 0x27 -> APOSTROPHE + '(' # 0x28 -> LEFT PARENTHESIS + ')' # 0x29 -> RIGHT PARENTHESIS + '*' # 0x2A -> ASTERISK + '+' # 0x2B -> PLUS SIGN + ',' # 0x2C -> COMMA + '-' # 0x2D -> HYPHEN-MINUS + '.' # 0x2E -> FULL STOP + '/' # 0x2F -> SOLIDUS + '0' # 0x30 -> DIGIT ZERO + '1' # 0x31 -> DIGIT ONE + '2' # 0x32 -> DIGIT TWO + '3' # 0x33 -> DIGIT THREE + '4' # 0x34 -> DIGIT FOUR + '5' # 0x35 -> DIGIT FIVE + '6' # 0x36 -> DIGIT SIX + '7' # 0x37 -> DIGIT SEVEN + '8' # 0x38 -> DIGIT EIGHT + '9' # 0x39 -> DIGIT NINE + ':' # 0x3A -> COLON + ';' # 0x3B -> SEMICOLON + '<' # 0x3C -> LESS-THAN SIGN + '=' # 0x3D -> EQUALS SIGN + '>' # 0x3E -> GREATER-THAN SIGN + '?' # 0x3F -> QUESTION MARK + '@' # 0x40 -> COMMERCIAL AT + 'A' # 0x41 -> LATIN CAPITAL LETTER A + 'B' # 0x42 -> LATIN CAPITAL LETTER B + 'C' # 0x43 -> LATIN CAPITAL LETTER C + 'D' # 0x44 -> LATIN CAPITAL LETTER D + 'E' # 0x45 -> LATIN CAPITAL LETTER E + 'F' # 0x46 -> LATIN CAPITAL LETTER F + 'G' # 0x47 -> LATIN CAPITAL LETTER G + 'H' # 0x48 -> LATIN CAPITAL LETTER H + 'I' # 0x49 -> LATIN CAPITAL LETTER I + 'J' # 0x4A -> LATIN CAPITAL LETTER J + 'K' # 0x4B -> LATIN CAPITAL LETTER K + 'L' # 0x4C -> LATIN CAPITAL LETTER L + 'M' # 0x4D -> LATIN CAPITAL LETTER M + 'N' # 0x4E -> LATIN CAPITAL LETTER N + 'O' # 0x4F -> LATIN CAPITAL LETTER O + 'P' # 0x50 -> LATIN CAPITAL LETTER P + 'Q' # 0x51 -> LATIN CAPITAL LETTER Q + 'R' # 0x52 -> LATIN CAPITAL LETTER R + 'S' # 0x53 -> LATIN CAPITAL LETTER S + 'T' # 0x54 -> LATIN CAPITAL LETTER T + 'U' # 0x55 -> LATIN CAPITAL LETTER U + 'V' # 0x56 -> LATIN CAPITAL LETTER V + 'W' # 0x57 -> LATIN CAPITAL LETTER W + 'X' # 0x58 -> LATIN CAPITAL LETTER X + 'Y' # 0x59 -> LATIN CAPITAL LETTER Y + 'Z' # 0x5A -> LATIN CAPITAL LETTER Z + '[' # 0x5B -> LEFT SQUARE BRACKET + '\\' # 0x5C -> REVERSE SOLIDUS + ']' # 0x5D -> RIGHT SQUARE BRACKET + '^' # 0x5E -> CIRCUMFLEX ACCENT + '_' # 0x5F -> LOW LINE + '`' # 0x60 -> GRAVE ACCENT + 'a' # 0x61 -> LATIN SMALL LETTER A + 'b' # 0x62 -> LATIN SMALL LETTER B + 'c' # 0x63 -> LATIN SMALL LETTER C + 'd' # 0x64 -> LATIN SMALL LETTER D + 'e' # 0x65 -> LATIN SMALL LETTER E + 'f' # 0x66 -> LATIN SMALL LETTER F + 'g' # 0x67 -> LATIN SMALL LETTER G + 'h' # 0x68 -> LATIN SMALL LETTER H + 'i' # 0x69 -> LATIN SMALL LETTER I + 'j' # 0x6A -> LATIN SMALL LETTER J + 'k' # 0x6B -> LATIN SMALL LETTER K + 'l' # 0x6C -> LATIN SMALL LETTER L + 'm' # 0x6D -> LATIN SMALL LETTER M + 'n' # 0x6E -> LATIN SMALL LETTER N + 'o' # 0x6F -> LATIN SMALL LETTER O + 'p' # 0x70 -> LATIN SMALL LETTER P + 'q' # 0x71 -> LATIN SMALL LETTER Q + 'r' # 0x72 -> LATIN SMALL LETTER R + 's' # 0x73 -> LATIN SMALL LETTER S + 't' # 0x74 -> LATIN SMALL LETTER T + 'u' # 0x75 -> LATIN SMALL LETTER U + 'v' # 0x76 -> LATIN SMALL LETTER V + 'w' # 0x77 -> LATIN SMALL LETTER W + 'x' # 0x78 -> LATIN SMALL LETTER X + 'y' # 0x79 -> LATIN SMALL LETTER Y + 'z' # 0x7A -> LATIN SMALL LETTER Z + '{' # 0x7B -> LEFT CURLY BRACKET + '|' # 0x7C -> VERTICAL LINE + '}' # 0x7D -> RIGHT CURLY BRACKET + '~' # 0x7E -> TILDE + '\x7f' # 0x7F -> DELETE + '\x80' # 0x80 -> + '\x81' # 0x81 -> + '\x82' # 0x82 -> + '\x83' # 0x83 -> + '\x84' # 0x84 -> + '\x85' # 0x85 -> + '\x86' # 0x86 -> + '\x87' # 0x87 -> + '\x88' # 0x88 -> + '\x89' # 0x89 -> + '\x8a' # 0x8A -> + '\x8b' # 0x8B -> + '\x8c' # 0x8C -> + '\x8d' # 0x8D -> + '\x8e' # 0x8E -> + '\x8f' # 0x8F -> + '\x90' # 0x90 -> + '\x91' # 0x91 -> + '\x92' # 0x92 -> + '\x93' # 0x93 -> + '\x94' # 0x94 -> + '\x95' # 0x95 -> + '\x96' # 0x96 -> + '\x97' # 0x97 -> + '\x98' # 0x98 -> + '\x99' # 0x99 -> + '\x9a' # 0x9A -> + '\x9b' # 0x9B -> + '\x9c' # 0x9C -> + '\x9d' # 0x9D -> + '\x9e' # 0x9E -> + '\x9f' # 0x9F -> + '\xa0' # 0xA0 -> NO-BREAK SPACE + '\u2018' # 0xA1 -> LEFT SINGLE QUOTATION MARK + '\u2019' # 0xA2 -> RIGHT SINGLE QUOTATION MARK + '\xa3' # 0xA3 -> POUND SIGN + '\u20ac' # 0xA4 -> EURO SIGN + '\u20af' # 0xA5 -> DRACHMA SIGN + '\xa6' # 0xA6 -> BROKEN BAR + '\xa7' # 0xA7 -> SECTION SIGN + '\xa8' # 0xA8 -> DIAERESIS + '\xa9' # 0xA9 -> COPYRIGHT SIGN + '\u037a' # 0xAA -> GREEK YPOGEGRAMMENI + '\xab' # 0xAB -> LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + '\xac' # 0xAC -> NOT SIGN + '\xad' # 0xAD -> SOFT HYPHEN + '\ufffe' + '\u2015' # 0xAF -> HORIZONTAL BAR + '\xb0' # 0xB0 -> DEGREE SIGN + '\xb1' # 0xB1 -> PLUS-MINUS SIGN + '\xb2' # 0xB2 -> SUPERSCRIPT TWO + '\xb3' # 0xB3 -> SUPERSCRIPT THREE + '\u0384' # 0xB4 -> GREEK TONOS + '\u0385' # 0xB5 -> GREEK DIALYTIKA TONOS + '\u0386' # 0xB6 -> GREEK CAPITAL LETTER ALPHA WITH TONOS + '\xb7' # 0xB7 -> MIDDLE DOT + '\u0388' # 0xB8 -> GREEK CAPITAL LETTER EPSILON WITH TONOS + '\u0389' # 0xB9 -> GREEK CAPITAL LETTER ETA WITH TONOS + '\u038a' # 0xBA -> GREEK CAPITAL LETTER IOTA WITH TONOS + '\xbb' # 0xBB -> RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + '\u038c' # 0xBC -> GREEK CAPITAL LETTER OMICRON WITH TONOS + '\xbd' # 0xBD -> VULGAR FRACTION ONE HALF + '\u038e' # 0xBE -> GREEK CAPITAL LETTER UPSILON WITH TONOS + '\u038f' # 0xBF -> GREEK CAPITAL LETTER OMEGA WITH TONOS + '\u0390' # 0xC0 -> GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS + '\u0391' # 0xC1 -> GREEK CAPITAL LETTER ALPHA + '\u0392' # 0xC2 -> GREEK CAPITAL LETTER BETA + '\u0393' # 0xC3 -> GREEK CAPITAL LETTER GAMMA + '\u0394' # 0xC4 -> GREEK CAPITAL LETTER DELTA + '\u0395' # 0xC5 -> GREEK CAPITAL LETTER EPSILON + '\u0396' # 0xC6 -> GREEK CAPITAL LETTER ZETA + '\u0397' # 0xC7 -> GREEK CAPITAL LETTER ETA + '\u0398' # 0xC8 -> GREEK CAPITAL LETTER THETA + '\u0399' # 0xC9 -> GREEK CAPITAL LETTER IOTA + '\u039a' # 0xCA -> GREEK CAPITAL LETTER KAPPA + '\u039b' # 0xCB -> GREEK CAPITAL LETTER LAMDA + '\u039c' # 0xCC -> GREEK CAPITAL LETTER MU + '\u039d' # 0xCD -> GREEK CAPITAL LETTER NU + '\u039e' # 0xCE -> GREEK CAPITAL LETTER XI + '\u039f' # 0xCF -> GREEK CAPITAL LETTER OMICRON + '\u03a0' # 0xD0 -> GREEK CAPITAL LETTER PI + '\u03a1' # 0xD1 -> GREEK CAPITAL LETTER RHO + '\ufffe' + '\u03a3' # 0xD3 -> GREEK CAPITAL LETTER SIGMA + '\u03a4' # 0xD4 -> GREEK CAPITAL LETTER TAU + '\u03a5' # 0xD5 -> GREEK CAPITAL LETTER UPSILON + '\u03a6' # 0xD6 -> GREEK CAPITAL LETTER PHI + '\u03a7' # 0xD7 -> GREEK CAPITAL LETTER CHI + '\u03a8' # 0xD8 -> GREEK CAPITAL LETTER PSI + '\u03a9' # 0xD9 -> GREEK CAPITAL LETTER OMEGA + '\u03aa' # 0xDA -> GREEK CAPITAL LETTER IOTA WITH DIALYTIKA + '\u03ab' # 0xDB -> GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA + '\u03ac' # 0xDC -> GREEK SMALL LETTER ALPHA WITH TONOS + '\u03ad' # 0xDD -> GREEK SMALL LETTER EPSILON WITH TONOS + '\u03ae' # 0xDE -> GREEK SMALL LETTER ETA WITH TONOS + '\u03af' # 0xDF -> GREEK SMALL LETTER IOTA WITH TONOS + '\u03b0' # 0xE0 -> GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS + '\u03b1' # 0xE1 -> GREEK SMALL LETTER ALPHA + '\u03b2' # 0xE2 -> GREEK SMALL LETTER BETA + '\u03b3' # 0xE3 -> GREEK SMALL LETTER GAMMA + '\u03b4' # 0xE4 -> GREEK SMALL LETTER DELTA + '\u03b5' # 0xE5 -> GREEK SMALL LETTER EPSILON + '\u03b6' # 0xE6 -> GREEK SMALL LETTER ZETA + '\u03b7' # 0xE7 -> GREEK SMALL LETTER ETA + '\u03b8' # 0xE8 -> GREEK SMALL LETTER THETA + '\u03b9' # 0xE9 -> GREEK SMALL LETTER IOTA + '\u03ba' # 0xEA -> GREEK SMALL LETTER KAPPA + '\u03bb' # 0xEB -> GREEK SMALL LETTER LAMDA + '\u03bc' # 0xEC -> GREEK SMALL LETTER MU + '\u03bd' # 0xED -> GREEK SMALL LETTER NU + '\u03be' # 0xEE -> GREEK SMALL LETTER XI + '\u03bf' # 0xEF -> GREEK SMALL LETTER OMICRON + '\u03c0' # 0xF0 -> GREEK SMALL LETTER PI + '\u03c1' # 0xF1 -> GREEK SMALL LETTER RHO + '\u03c2' # 0xF2 -> GREEK SMALL LETTER FINAL SIGMA + '\u03c3' # 0xF3 -> GREEK SMALL LETTER SIGMA + '\u03c4' # 0xF4 -> GREEK SMALL LETTER TAU + '\u03c5' # 0xF5 -> GREEK SMALL LETTER UPSILON + '\u03c6' # 0xF6 -> GREEK SMALL LETTER PHI + '\u03c7' # 0xF7 -> GREEK SMALL LETTER CHI + '\u03c8' # 0xF8 -> GREEK SMALL LETTER PSI + '\u03c9' # 0xF9 -> GREEK SMALL LETTER OMEGA + '\u03ca' # 0xFA -> GREEK SMALL LETTER IOTA WITH DIALYTIKA + '\u03cb' # 0xFB -> GREEK SMALL LETTER UPSILON WITH DIALYTIKA + '\u03cc' # 0xFC -> GREEK SMALL LETTER OMICRON WITH TONOS + '\u03cd' # 0xFD -> GREEK SMALL LETTER UPSILON WITH TONOS + '\u03ce' # 0xFE -> GREEK SMALL LETTER OMEGA WITH TONOS + '\ufffe' +) + +### Encoding table +encoding_table=codecs.charmap_build(decoding_table) diff --git a/env/Lib/encodings/iso8859_8.py b/env/Lib/encodings/iso8859_8.py new file mode 100644 index 0000000..8184902 --- /dev/null +++ b/env/Lib/encodings/iso8859_8.py @@ -0,0 +1,307 @@ +""" Python Character Mapping Codec iso8859_8 generated from 'MAPPINGS/ISO8859/8859-8.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='iso8859-8', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) + + +### Decoding Table + +decoding_table = ( + '\x00' # 0x00 -> NULL + '\x01' # 0x01 -> START OF HEADING + '\x02' # 0x02 -> START OF TEXT + '\x03' # 0x03 -> END OF TEXT + '\x04' # 0x04 -> END OF TRANSMISSION + '\x05' # 0x05 -> ENQUIRY + '\x06' # 0x06 -> ACKNOWLEDGE + '\x07' # 0x07 -> BELL + '\x08' # 0x08 -> BACKSPACE + '\t' # 0x09 -> HORIZONTAL TABULATION + '\n' # 0x0A -> LINE FEED + '\x0b' # 0x0B -> VERTICAL TABULATION + '\x0c' # 0x0C -> FORM FEED + '\r' # 0x0D -> CARRIAGE RETURN + '\x0e' # 0x0E -> SHIFT OUT + '\x0f' # 0x0F -> SHIFT IN + '\x10' # 0x10 -> DATA LINK ESCAPE + '\x11' # 0x11 -> DEVICE CONTROL ONE + '\x12' # 0x12 -> DEVICE CONTROL TWO + '\x13' # 0x13 -> DEVICE CONTROL THREE + '\x14' # 0x14 -> DEVICE CONTROL FOUR + '\x15' # 0x15 -> NEGATIVE ACKNOWLEDGE + '\x16' # 0x16 -> SYNCHRONOUS IDLE + '\x17' # 0x17 -> END OF TRANSMISSION BLOCK + '\x18' # 0x18 -> CANCEL + '\x19' # 0x19 -> END OF MEDIUM + '\x1a' # 0x1A -> SUBSTITUTE + '\x1b' # 0x1B -> ESCAPE + '\x1c' # 0x1C -> FILE SEPARATOR + '\x1d' # 0x1D -> GROUP SEPARATOR + '\x1e' # 0x1E -> RECORD SEPARATOR + '\x1f' # 0x1F -> UNIT SEPARATOR + ' ' # 0x20 -> SPACE + '!' # 0x21 -> EXCLAMATION MARK + '"' # 0x22 -> QUOTATION MARK + '#' # 0x23 -> NUMBER SIGN + '$' # 0x24 -> DOLLAR SIGN + '%' # 0x25 -> PERCENT SIGN + '&' # 0x26 -> AMPERSAND + "'" # 0x27 -> APOSTROPHE + '(' # 0x28 -> LEFT PARENTHESIS + ')' # 0x29 -> RIGHT PARENTHESIS + '*' # 0x2A -> ASTERISK + '+' # 0x2B -> PLUS SIGN + ',' # 0x2C -> COMMA + '-' # 0x2D -> HYPHEN-MINUS + '.' # 0x2E -> FULL STOP + '/' # 0x2F -> SOLIDUS + '0' # 0x30 -> DIGIT ZERO + '1' # 0x31 -> DIGIT ONE + '2' # 0x32 -> DIGIT TWO + '3' # 0x33 -> DIGIT THREE + '4' # 0x34 -> DIGIT FOUR + '5' # 0x35 -> DIGIT FIVE + '6' # 0x36 -> DIGIT SIX + '7' # 0x37 -> DIGIT SEVEN + '8' # 0x38 -> DIGIT EIGHT + '9' # 0x39 -> DIGIT NINE + ':' # 0x3A -> COLON + ';' # 0x3B -> SEMICOLON + '<' # 0x3C -> LESS-THAN SIGN + '=' # 0x3D -> EQUALS SIGN + '>' # 0x3E -> GREATER-THAN SIGN + '?' # 0x3F -> QUESTION MARK + '@' # 0x40 -> COMMERCIAL AT + 'A' # 0x41 -> LATIN CAPITAL LETTER A + 'B' # 0x42 -> LATIN CAPITAL LETTER B + 'C' # 0x43 -> LATIN CAPITAL LETTER C + 'D' # 0x44 -> LATIN CAPITAL LETTER D + 'E' # 0x45 -> LATIN CAPITAL LETTER E + 'F' # 0x46 -> LATIN CAPITAL LETTER F + 'G' # 0x47 -> LATIN CAPITAL LETTER G + 'H' # 0x48 -> LATIN CAPITAL LETTER H + 'I' # 0x49 -> LATIN CAPITAL LETTER I + 'J' # 0x4A -> LATIN CAPITAL LETTER J + 'K' # 0x4B -> LATIN CAPITAL LETTER K + 'L' # 0x4C -> LATIN CAPITAL LETTER L + 'M' # 0x4D -> LATIN CAPITAL LETTER M + 'N' # 0x4E -> LATIN CAPITAL LETTER N + 'O' # 0x4F -> LATIN CAPITAL LETTER O + 'P' # 0x50 -> LATIN CAPITAL LETTER P + 'Q' # 0x51 -> LATIN CAPITAL LETTER Q + 'R' # 0x52 -> LATIN CAPITAL LETTER R + 'S' # 0x53 -> LATIN CAPITAL LETTER S + 'T' # 0x54 -> LATIN CAPITAL LETTER T + 'U' # 0x55 -> LATIN CAPITAL LETTER U + 'V' # 0x56 -> LATIN CAPITAL LETTER V + 'W' # 0x57 -> LATIN CAPITAL LETTER W + 'X' # 0x58 -> LATIN CAPITAL LETTER X + 'Y' # 0x59 -> LATIN CAPITAL LETTER Y + 'Z' # 0x5A -> LATIN CAPITAL LETTER Z + '[' # 0x5B -> LEFT SQUARE BRACKET + '\\' # 0x5C -> REVERSE SOLIDUS + ']' # 0x5D -> RIGHT SQUARE BRACKET + '^' # 0x5E -> CIRCUMFLEX ACCENT + '_' # 0x5F -> LOW LINE + '`' # 0x60 -> GRAVE ACCENT + 'a' # 0x61 -> LATIN SMALL LETTER A + 'b' # 0x62 -> LATIN SMALL LETTER B + 'c' # 0x63 -> LATIN SMALL LETTER C + 'd' # 0x64 -> LATIN SMALL LETTER D + 'e' # 0x65 -> LATIN SMALL LETTER E + 'f' # 0x66 -> LATIN SMALL LETTER F + 'g' # 0x67 -> LATIN SMALL LETTER G + 'h' # 0x68 -> LATIN SMALL LETTER H + 'i' # 0x69 -> LATIN SMALL LETTER I + 'j' # 0x6A -> LATIN SMALL LETTER J + 'k' # 0x6B -> LATIN SMALL LETTER K + 'l' # 0x6C -> LATIN SMALL LETTER L + 'm' # 0x6D -> LATIN SMALL LETTER M + 'n' # 0x6E -> LATIN SMALL LETTER N + 'o' # 0x6F -> LATIN SMALL LETTER O + 'p' # 0x70 -> LATIN SMALL LETTER P + 'q' # 0x71 -> LATIN SMALL LETTER Q + 'r' # 0x72 -> LATIN SMALL LETTER R + 's' # 0x73 -> LATIN SMALL LETTER S + 't' # 0x74 -> LATIN SMALL LETTER T + 'u' # 0x75 -> LATIN SMALL LETTER U + 'v' # 0x76 -> LATIN SMALL LETTER V + 'w' # 0x77 -> LATIN SMALL LETTER W + 'x' # 0x78 -> LATIN SMALL LETTER X + 'y' # 0x79 -> LATIN SMALL LETTER Y + 'z' # 0x7A -> LATIN SMALL LETTER Z + '{' # 0x7B -> LEFT CURLY BRACKET + '|' # 0x7C -> VERTICAL LINE + '}' # 0x7D -> RIGHT CURLY BRACKET + '~' # 0x7E -> TILDE + '\x7f' # 0x7F -> DELETE + '\x80' # 0x80 -> + '\x81' # 0x81 -> + '\x82' # 0x82 -> + '\x83' # 0x83 -> + '\x84' # 0x84 -> + '\x85' # 0x85 -> + '\x86' # 0x86 -> + '\x87' # 0x87 -> + '\x88' # 0x88 -> + '\x89' # 0x89 -> + '\x8a' # 0x8A -> + '\x8b' # 0x8B -> + '\x8c' # 0x8C -> + '\x8d' # 0x8D -> + '\x8e' # 0x8E -> + '\x8f' # 0x8F -> + '\x90' # 0x90 -> + '\x91' # 0x91 -> + '\x92' # 0x92 -> + '\x93' # 0x93 -> + '\x94' # 0x94 -> + '\x95' # 0x95 -> + '\x96' # 0x96 -> + '\x97' # 0x97 -> + '\x98' # 0x98 -> + '\x99' # 0x99 -> + '\x9a' # 0x9A -> + '\x9b' # 0x9B -> + '\x9c' # 0x9C -> + '\x9d' # 0x9D -> + '\x9e' # 0x9E -> + '\x9f' # 0x9F -> + '\xa0' # 0xA0 -> NO-BREAK SPACE + '\ufffe' + '\xa2' # 0xA2 -> CENT SIGN + '\xa3' # 0xA3 -> POUND SIGN + '\xa4' # 0xA4 -> CURRENCY SIGN + '\xa5' # 0xA5 -> YEN SIGN + '\xa6' # 0xA6 -> BROKEN BAR + '\xa7' # 0xA7 -> SECTION SIGN + '\xa8' # 0xA8 -> DIAERESIS + '\xa9' # 0xA9 -> COPYRIGHT SIGN + '\xd7' # 0xAA -> MULTIPLICATION SIGN + '\xab' # 0xAB -> LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + '\xac' # 0xAC -> NOT SIGN + '\xad' # 0xAD -> SOFT HYPHEN + '\xae' # 0xAE -> REGISTERED SIGN + '\xaf' # 0xAF -> MACRON + '\xb0' # 0xB0 -> DEGREE SIGN + '\xb1' # 0xB1 -> PLUS-MINUS SIGN + '\xb2' # 0xB2 -> SUPERSCRIPT TWO + '\xb3' # 0xB3 -> SUPERSCRIPT THREE + '\xb4' # 0xB4 -> ACUTE ACCENT + '\xb5' # 0xB5 -> MICRO SIGN + '\xb6' # 0xB6 -> PILCROW SIGN + '\xb7' # 0xB7 -> MIDDLE DOT + '\xb8' # 0xB8 -> CEDILLA + '\xb9' # 0xB9 -> SUPERSCRIPT ONE + '\xf7' # 0xBA -> DIVISION SIGN + '\xbb' # 0xBB -> RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + '\xbc' # 0xBC -> VULGAR FRACTION ONE QUARTER + '\xbd' # 0xBD -> VULGAR FRACTION ONE HALF + '\xbe' # 0xBE -> VULGAR FRACTION THREE QUARTERS + '\ufffe' + '\ufffe' + '\ufffe' + '\ufffe' + '\ufffe' + '\ufffe' + '\ufffe' + '\ufffe' + '\ufffe' + '\ufffe' + '\ufffe' + '\ufffe' + '\ufffe' + '\ufffe' + '\ufffe' + '\ufffe' + '\ufffe' + '\ufffe' + '\ufffe' + '\ufffe' + '\ufffe' + '\ufffe' + '\ufffe' + '\ufffe' + '\ufffe' + '\ufffe' + '\ufffe' + '\ufffe' + '\ufffe' + '\ufffe' + '\ufffe' + '\ufffe' + '\u2017' # 0xDF -> DOUBLE LOW LINE + '\u05d0' # 0xE0 -> HEBREW LETTER ALEF + '\u05d1' # 0xE1 -> HEBREW LETTER BET + '\u05d2' # 0xE2 -> HEBREW LETTER GIMEL + '\u05d3' # 0xE3 -> HEBREW LETTER DALET + '\u05d4' # 0xE4 -> HEBREW LETTER HE + '\u05d5' # 0xE5 -> HEBREW LETTER VAV + '\u05d6' # 0xE6 -> HEBREW LETTER ZAYIN + '\u05d7' # 0xE7 -> HEBREW LETTER HET + '\u05d8' # 0xE8 -> HEBREW LETTER TET + '\u05d9' # 0xE9 -> HEBREW LETTER YOD + '\u05da' # 0xEA -> HEBREW LETTER FINAL KAF + '\u05db' # 0xEB -> HEBREW LETTER KAF + '\u05dc' # 0xEC -> HEBREW LETTER LAMED + '\u05dd' # 0xED -> HEBREW LETTER FINAL MEM + '\u05de' # 0xEE -> HEBREW LETTER MEM + '\u05df' # 0xEF -> HEBREW LETTER FINAL NUN + '\u05e0' # 0xF0 -> HEBREW LETTER NUN + '\u05e1' # 0xF1 -> HEBREW LETTER SAMEKH + '\u05e2' # 0xF2 -> HEBREW LETTER AYIN + '\u05e3' # 0xF3 -> HEBREW LETTER FINAL PE + '\u05e4' # 0xF4 -> HEBREW LETTER PE + '\u05e5' # 0xF5 -> HEBREW LETTER FINAL TSADI + '\u05e6' # 0xF6 -> HEBREW LETTER TSADI + '\u05e7' # 0xF7 -> HEBREW LETTER QOF + '\u05e8' # 0xF8 -> HEBREW LETTER RESH + '\u05e9' # 0xF9 -> HEBREW LETTER SHIN + '\u05ea' # 0xFA -> HEBREW LETTER TAV + '\ufffe' + '\ufffe' + '\u200e' # 0xFD -> LEFT-TO-RIGHT MARK + '\u200f' # 0xFE -> RIGHT-TO-LEFT MARK + '\ufffe' +) + +### Encoding table +encoding_table=codecs.charmap_build(decoding_table) diff --git a/env/Lib/encodings/iso8859_9.py b/env/Lib/encodings/iso8859_9.py new file mode 100644 index 0000000..e539fdd --- /dev/null +++ b/env/Lib/encodings/iso8859_9.py @@ -0,0 +1,307 @@ +""" Python Character Mapping Codec iso8859_9 generated from 'MAPPINGS/ISO8859/8859-9.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='iso8859-9', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) + + +### Decoding Table + +decoding_table = ( + '\x00' # 0x00 -> NULL + '\x01' # 0x01 -> START OF HEADING + '\x02' # 0x02 -> START OF TEXT + '\x03' # 0x03 -> END OF TEXT + '\x04' # 0x04 -> END OF TRANSMISSION + '\x05' # 0x05 -> ENQUIRY + '\x06' # 0x06 -> ACKNOWLEDGE + '\x07' # 0x07 -> BELL + '\x08' # 0x08 -> BACKSPACE + '\t' # 0x09 -> HORIZONTAL TABULATION + '\n' # 0x0A -> LINE FEED + '\x0b' # 0x0B -> VERTICAL TABULATION + '\x0c' # 0x0C -> FORM FEED + '\r' # 0x0D -> CARRIAGE RETURN + '\x0e' # 0x0E -> SHIFT OUT + '\x0f' # 0x0F -> SHIFT IN + '\x10' # 0x10 -> DATA LINK ESCAPE + '\x11' # 0x11 -> DEVICE CONTROL ONE + '\x12' # 0x12 -> DEVICE CONTROL TWO + '\x13' # 0x13 -> DEVICE CONTROL THREE + '\x14' # 0x14 -> DEVICE CONTROL FOUR + '\x15' # 0x15 -> NEGATIVE ACKNOWLEDGE + '\x16' # 0x16 -> SYNCHRONOUS IDLE + '\x17' # 0x17 -> END OF TRANSMISSION BLOCK + '\x18' # 0x18 -> CANCEL + '\x19' # 0x19 -> END OF MEDIUM + '\x1a' # 0x1A -> SUBSTITUTE + '\x1b' # 0x1B -> ESCAPE + '\x1c' # 0x1C -> FILE SEPARATOR + '\x1d' # 0x1D -> GROUP SEPARATOR + '\x1e' # 0x1E -> RECORD SEPARATOR + '\x1f' # 0x1F -> UNIT SEPARATOR + ' ' # 0x20 -> SPACE + '!' # 0x21 -> EXCLAMATION MARK + '"' # 0x22 -> QUOTATION MARK + '#' # 0x23 -> NUMBER SIGN + '$' # 0x24 -> DOLLAR SIGN + '%' # 0x25 -> PERCENT SIGN + '&' # 0x26 -> AMPERSAND + "'" # 0x27 -> APOSTROPHE + '(' # 0x28 -> LEFT PARENTHESIS + ')' # 0x29 -> RIGHT PARENTHESIS + '*' # 0x2A -> ASTERISK + '+' # 0x2B -> PLUS SIGN + ',' # 0x2C -> COMMA + '-' # 0x2D -> HYPHEN-MINUS + '.' # 0x2E -> FULL STOP + '/' # 0x2F -> SOLIDUS + '0' # 0x30 -> DIGIT ZERO + '1' # 0x31 -> DIGIT ONE + '2' # 0x32 -> DIGIT TWO + '3' # 0x33 -> DIGIT THREE + '4' # 0x34 -> DIGIT FOUR + '5' # 0x35 -> DIGIT FIVE + '6' # 0x36 -> DIGIT SIX + '7' # 0x37 -> DIGIT SEVEN + '8' # 0x38 -> DIGIT EIGHT + '9' # 0x39 -> DIGIT NINE + ':' # 0x3A -> COLON + ';' # 0x3B -> SEMICOLON + '<' # 0x3C -> LESS-THAN SIGN + '=' # 0x3D -> EQUALS SIGN + '>' # 0x3E -> GREATER-THAN SIGN + '?' # 0x3F -> QUESTION MARK + '@' # 0x40 -> COMMERCIAL AT + 'A' # 0x41 -> LATIN CAPITAL LETTER A + 'B' # 0x42 -> LATIN CAPITAL LETTER B + 'C' # 0x43 -> LATIN CAPITAL LETTER C + 'D' # 0x44 -> LATIN CAPITAL LETTER D + 'E' # 0x45 -> LATIN CAPITAL LETTER E + 'F' # 0x46 -> LATIN CAPITAL LETTER F + 'G' # 0x47 -> LATIN CAPITAL LETTER G + 'H' # 0x48 -> LATIN CAPITAL LETTER H + 'I' # 0x49 -> LATIN CAPITAL LETTER I + 'J' # 0x4A -> LATIN CAPITAL LETTER J + 'K' # 0x4B -> LATIN CAPITAL LETTER K + 'L' # 0x4C -> LATIN CAPITAL LETTER L + 'M' # 0x4D -> LATIN CAPITAL LETTER M + 'N' # 0x4E -> LATIN CAPITAL LETTER N + 'O' # 0x4F -> LATIN CAPITAL LETTER O + 'P' # 0x50 -> LATIN CAPITAL LETTER P + 'Q' # 0x51 -> LATIN CAPITAL LETTER Q + 'R' # 0x52 -> LATIN CAPITAL LETTER R + 'S' # 0x53 -> LATIN CAPITAL LETTER S + 'T' # 0x54 -> LATIN CAPITAL LETTER T + 'U' # 0x55 -> LATIN CAPITAL LETTER U + 'V' # 0x56 -> LATIN CAPITAL LETTER V + 'W' # 0x57 -> LATIN CAPITAL LETTER W + 'X' # 0x58 -> LATIN CAPITAL LETTER X + 'Y' # 0x59 -> LATIN CAPITAL LETTER Y + 'Z' # 0x5A -> LATIN CAPITAL LETTER Z + '[' # 0x5B -> LEFT SQUARE BRACKET + '\\' # 0x5C -> REVERSE SOLIDUS + ']' # 0x5D -> RIGHT SQUARE BRACKET + '^' # 0x5E -> CIRCUMFLEX ACCENT + '_' # 0x5F -> LOW LINE + '`' # 0x60 -> GRAVE ACCENT + 'a' # 0x61 -> LATIN SMALL LETTER A + 'b' # 0x62 -> LATIN SMALL LETTER B + 'c' # 0x63 -> LATIN SMALL LETTER C + 'd' # 0x64 -> LATIN SMALL LETTER D + 'e' # 0x65 -> LATIN SMALL LETTER E + 'f' # 0x66 -> LATIN SMALL LETTER F + 'g' # 0x67 -> LATIN SMALL LETTER G + 'h' # 0x68 -> LATIN SMALL LETTER H + 'i' # 0x69 -> LATIN SMALL LETTER I + 'j' # 0x6A -> LATIN SMALL LETTER J + 'k' # 0x6B -> LATIN SMALL LETTER K + 'l' # 0x6C -> LATIN SMALL LETTER L + 'm' # 0x6D -> LATIN SMALL LETTER M + 'n' # 0x6E -> LATIN SMALL LETTER N + 'o' # 0x6F -> LATIN SMALL LETTER O + 'p' # 0x70 -> LATIN SMALL LETTER P + 'q' # 0x71 -> LATIN SMALL LETTER Q + 'r' # 0x72 -> LATIN SMALL LETTER R + 's' # 0x73 -> LATIN SMALL LETTER S + 't' # 0x74 -> LATIN SMALL LETTER T + 'u' # 0x75 -> LATIN SMALL LETTER U + 'v' # 0x76 -> LATIN SMALL LETTER V + 'w' # 0x77 -> LATIN SMALL LETTER W + 'x' # 0x78 -> LATIN SMALL LETTER X + 'y' # 0x79 -> LATIN SMALL LETTER Y + 'z' # 0x7A -> LATIN SMALL LETTER Z + '{' # 0x7B -> LEFT CURLY BRACKET + '|' # 0x7C -> VERTICAL LINE + '}' # 0x7D -> RIGHT CURLY BRACKET + '~' # 0x7E -> TILDE + '\x7f' # 0x7F -> DELETE + '\x80' # 0x80 -> + '\x81' # 0x81 -> + '\x82' # 0x82 -> + '\x83' # 0x83 -> + '\x84' # 0x84 -> + '\x85' # 0x85 -> + '\x86' # 0x86 -> + '\x87' # 0x87 -> + '\x88' # 0x88 -> + '\x89' # 0x89 -> + '\x8a' # 0x8A -> + '\x8b' # 0x8B -> + '\x8c' # 0x8C -> + '\x8d' # 0x8D -> + '\x8e' # 0x8E -> + '\x8f' # 0x8F -> + '\x90' # 0x90 -> + '\x91' # 0x91 -> + '\x92' # 0x92 -> + '\x93' # 0x93 -> + '\x94' # 0x94 -> + '\x95' # 0x95 -> + '\x96' # 0x96 -> + '\x97' # 0x97 -> + '\x98' # 0x98 -> + '\x99' # 0x99 -> + '\x9a' # 0x9A -> + '\x9b' # 0x9B -> + '\x9c' # 0x9C -> + '\x9d' # 0x9D -> + '\x9e' # 0x9E -> + '\x9f' # 0x9F -> + '\xa0' # 0xA0 -> NO-BREAK SPACE + '\xa1' # 0xA1 -> INVERTED EXCLAMATION MARK + '\xa2' # 0xA2 -> CENT SIGN + '\xa3' # 0xA3 -> POUND SIGN + '\xa4' # 0xA4 -> CURRENCY SIGN + '\xa5' # 0xA5 -> YEN SIGN + '\xa6' # 0xA6 -> BROKEN BAR + '\xa7' # 0xA7 -> SECTION SIGN + '\xa8' # 0xA8 -> DIAERESIS + '\xa9' # 0xA9 -> COPYRIGHT SIGN + '\xaa' # 0xAA -> FEMININE ORDINAL INDICATOR + '\xab' # 0xAB -> LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + '\xac' # 0xAC -> NOT SIGN + '\xad' # 0xAD -> SOFT HYPHEN + '\xae' # 0xAE -> REGISTERED SIGN + '\xaf' # 0xAF -> MACRON + '\xb0' # 0xB0 -> DEGREE SIGN + '\xb1' # 0xB1 -> PLUS-MINUS SIGN + '\xb2' # 0xB2 -> SUPERSCRIPT TWO + '\xb3' # 0xB3 -> SUPERSCRIPT THREE + '\xb4' # 0xB4 -> ACUTE ACCENT + '\xb5' # 0xB5 -> MICRO SIGN + '\xb6' # 0xB6 -> PILCROW SIGN + '\xb7' # 0xB7 -> MIDDLE DOT + '\xb8' # 0xB8 -> CEDILLA + '\xb9' # 0xB9 -> SUPERSCRIPT ONE + '\xba' # 0xBA -> MASCULINE ORDINAL INDICATOR + '\xbb' # 0xBB -> RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + '\xbc' # 0xBC -> VULGAR FRACTION ONE QUARTER + '\xbd' # 0xBD -> VULGAR FRACTION ONE HALF + '\xbe' # 0xBE -> VULGAR FRACTION THREE QUARTERS + '\xbf' # 0xBF -> INVERTED QUESTION MARK + '\xc0' # 0xC0 -> LATIN CAPITAL LETTER A WITH GRAVE + '\xc1' # 0xC1 -> LATIN CAPITAL LETTER A WITH ACUTE + '\xc2' # 0xC2 -> LATIN CAPITAL LETTER A WITH CIRCUMFLEX + '\xc3' # 0xC3 -> LATIN CAPITAL LETTER A WITH TILDE + '\xc4' # 0xC4 -> LATIN CAPITAL LETTER A WITH DIAERESIS + '\xc5' # 0xC5 -> LATIN CAPITAL LETTER A WITH RING ABOVE + '\xc6' # 0xC6 -> LATIN CAPITAL LETTER AE + '\xc7' # 0xC7 -> LATIN CAPITAL LETTER C WITH CEDILLA + '\xc8' # 0xC8 -> LATIN CAPITAL LETTER E WITH GRAVE + '\xc9' # 0xC9 -> LATIN CAPITAL LETTER E WITH ACUTE + '\xca' # 0xCA -> LATIN CAPITAL LETTER E WITH CIRCUMFLEX + '\xcb' # 0xCB -> LATIN CAPITAL LETTER E WITH DIAERESIS + '\xcc' # 0xCC -> LATIN CAPITAL LETTER I WITH GRAVE + '\xcd' # 0xCD -> LATIN CAPITAL LETTER I WITH ACUTE + '\xce' # 0xCE -> LATIN CAPITAL LETTER I WITH CIRCUMFLEX + '\xcf' # 0xCF -> LATIN CAPITAL LETTER I WITH DIAERESIS + '\u011e' # 0xD0 -> LATIN CAPITAL LETTER G WITH BREVE + '\xd1' # 0xD1 -> LATIN CAPITAL LETTER N WITH TILDE + '\xd2' # 0xD2 -> LATIN CAPITAL LETTER O WITH GRAVE + '\xd3' # 0xD3 -> LATIN CAPITAL LETTER O WITH ACUTE + '\xd4' # 0xD4 -> LATIN CAPITAL LETTER O WITH CIRCUMFLEX + '\xd5' # 0xD5 -> LATIN CAPITAL LETTER O WITH TILDE + '\xd6' # 0xD6 -> LATIN CAPITAL LETTER O WITH DIAERESIS + '\xd7' # 0xD7 -> MULTIPLICATION SIGN + '\xd8' # 0xD8 -> LATIN CAPITAL LETTER O WITH STROKE + '\xd9' # 0xD9 -> LATIN CAPITAL LETTER U WITH GRAVE + '\xda' # 0xDA -> LATIN CAPITAL LETTER U WITH ACUTE + '\xdb' # 0xDB -> LATIN CAPITAL LETTER U WITH CIRCUMFLEX + '\xdc' # 0xDC -> LATIN CAPITAL LETTER U WITH DIAERESIS + '\u0130' # 0xDD -> LATIN CAPITAL LETTER I WITH DOT ABOVE + '\u015e' # 0xDE -> LATIN CAPITAL LETTER S WITH CEDILLA + '\xdf' # 0xDF -> LATIN SMALL LETTER SHARP S + '\xe0' # 0xE0 -> LATIN SMALL LETTER A WITH GRAVE + '\xe1' # 0xE1 -> LATIN SMALL LETTER A WITH ACUTE + '\xe2' # 0xE2 -> LATIN SMALL LETTER A WITH CIRCUMFLEX + '\xe3' # 0xE3 -> LATIN SMALL LETTER A WITH TILDE + '\xe4' # 0xE4 -> LATIN SMALL LETTER A WITH DIAERESIS + '\xe5' # 0xE5 -> LATIN SMALL LETTER A WITH RING ABOVE + '\xe6' # 0xE6 -> LATIN SMALL LETTER AE + '\xe7' # 0xE7 -> LATIN SMALL LETTER C WITH CEDILLA + '\xe8' # 0xE8 -> LATIN SMALL LETTER E WITH GRAVE + '\xe9' # 0xE9 -> LATIN SMALL LETTER E WITH ACUTE + '\xea' # 0xEA -> LATIN SMALL LETTER E WITH CIRCUMFLEX + '\xeb' # 0xEB -> LATIN SMALL LETTER E WITH DIAERESIS + '\xec' # 0xEC -> LATIN SMALL LETTER I WITH GRAVE + '\xed' # 0xED -> LATIN SMALL LETTER I WITH ACUTE + '\xee' # 0xEE -> LATIN SMALL LETTER I WITH CIRCUMFLEX + '\xef' # 0xEF -> LATIN SMALL LETTER I WITH DIAERESIS + '\u011f' # 0xF0 -> LATIN SMALL LETTER G WITH BREVE + '\xf1' # 0xF1 -> LATIN SMALL LETTER N WITH TILDE + '\xf2' # 0xF2 -> LATIN SMALL LETTER O WITH GRAVE + '\xf3' # 0xF3 -> LATIN SMALL LETTER O WITH ACUTE + '\xf4' # 0xF4 -> LATIN SMALL LETTER O WITH CIRCUMFLEX + '\xf5' # 0xF5 -> LATIN SMALL LETTER O WITH TILDE + '\xf6' # 0xF6 -> LATIN SMALL LETTER O WITH DIAERESIS + '\xf7' # 0xF7 -> DIVISION SIGN + '\xf8' # 0xF8 -> LATIN SMALL LETTER O WITH STROKE + '\xf9' # 0xF9 -> LATIN SMALL LETTER U WITH GRAVE + '\xfa' # 0xFA -> LATIN SMALL LETTER U WITH ACUTE + '\xfb' # 0xFB -> LATIN SMALL LETTER U WITH CIRCUMFLEX + '\xfc' # 0xFC -> LATIN SMALL LETTER U WITH DIAERESIS + '\u0131' # 0xFD -> LATIN SMALL LETTER DOTLESS I + '\u015f' # 0xFE -> LATIN SMALL LETTER S WITH CEDILLA + '\xff' # 0xFF -> LATIN SMALL LETTER Y WITH DIAERESIS +) + +### Encoding table +encoding_table=codecs.charmap_build(decoding_table) diff --git a/env/Lib/encodings/johab.py b/env/Lib/encodings/johab.py new file mode 100644 index 0000000..512aeeb --- /dev/null +++ b/env/Lib/encodings/johab.py @@ -0,0 +1,39 @@ +# +# johab.py: Python Unicode Codec for JOHAB +# +# Written by Hye-Shik Chang +# + +import _codecs_kr, codecs +import _multibytecodec as mbc + +codec = _codecs_kr.getcodec('johab') + +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='johab', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) diff --git a/env/Lib/encodings/koi8_r.py b/env/Lib/encodings/koi8_r.py new file mode 100644 index 0000000..41ddde8 --- /dev/null +++ b/env/Lib/encodings/koi8_r.py @@ -0,0 +1,307 @@ +""" Python Character Mapping Codec koi8_r generated from 'MAPPINGS/VENDORS/MISC/KOI8-R.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-r', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) + + +### Decoding Table + +decoding_table = ( + '\x00' # 0x00 -> NULL + '\x01' # 0x01 -> START OF HEADING + '\x02' # 0x02 -> START OF TEXT + '\x03' # 0x03 -> END OF TEXT + '\x04' # 0x04 -> END OF TRANSMISSION + '\x05' # 0x05 -> ENQUIRY + '\x06' # 0x06 -> ACKNOWLEDGE + '\x07' # 0x07 -> BELL + '\x08' # 0x08 -> BACKSPACE + '\t' # 0x09 -> HORIZONTAL TABULATION + '\n' # 0x0A -> LINE FEED + '\x0b' # 0x0B -> VERTICAL TABULATION + '\x0c' # 0x0C -> FORM FEED + '\r' # 0x0D -> CARRIAGE RETURN + '\x0e' # 0x0E -> SHIFT OUT + '\x0f' # 0x0F -> SHIFT IN + '\x10' # 0x10 -> DATA LINK ESCAPE + '\x11' # 0x11 -> DEVICE CONTROL ONE + '\x12' # 0x12 -> DEVICE CONTROL TWO + '\x13' # 0x13 -> DEVICE CONTROL THREE + '\x14' # 0x14 -> DEVICE CONTROL FOUR + '\x15' # 0x15 -> NEGATIVE ACKNOWLEDGE + '\x16' # 0x16 -> SYNCHRONOUS IDLE + '\x17' # 0x17 -> END OF TRANSMISSION BLOCK + '\x18' # 0x18 -> CANCEL + '\x19' # 0x19 -> END OF MEDIUM + '\x1a' # 0x1A -> SUBSTITUTE + '\x1b' # 0x1B -> ESCAPE + '\x1c' # 0x1C -> FILE SEPARATOR + '\x1d' # 0x1D -> GROUP SEPARATOR + '\x1e' # 0x1E -> RECORD SEPARATOR + '\x1f' # 0x1F -> UNIT SEPARATOR + ' ' # 0x20 -> SPACE + '!' # 0x21 -> EXCLAMATION MARK + '"' # 0x22 -> QUOTATION MARK + '#' # 0x23 -> NUMBER SIGN + '$' # 0x24 -> DOLLAR SIGN + '%' # 0x25 -> PERCENT SIGN + '&' # 0x26 -> AMPERSAND + "'" # 0x27 -> APOSTROPHE + '(' # 0x28 -> LEFT PARENTHESIS + ')' # 0x29 -> RIGHT PARENTHESIS + '*' # 0x2A -> ASTERISK + '+' # 0x2B -> PLUS SIGN + ',' # 0x2C -> COMMA + '-' # 0x2D -> HYPHEN-MINUS + '.' # 0x2E -> FULL STOP + '/' # 0x2F -> SOLIDUS + '0' # 0x30 -> DIGIT ZERO + '1' # 0x31 -> DIGIT ONE + '2' # 0x32 -> DIGIT TWO + '3' # 0x33 -> DIGIT THREE + '4' # 0x34 -> DIGIT FOUR + '5' # 0x35 -> DIGIT FIVE + '6' # 0x36 -> DIGIT SIX + '7' # 0x37 -> DIGIT SEVEN + '8' # 0x38 -> DIGIT EIGHT + '9' # 0x39 -> DIGIT NINE + ':' # 0x3A -> COLON + ';' # 0x3B -> SEMICOLON + '<' # 0x3C -> LESS-THAN SIGN + '=' # 0x3D -> EQUALS SIGN + '>' # 0x3E -> GREATER-THAN SIGN + '?' # 0x3F -> QUESTION MARK + '@' # 0x40 -> COMMERCIAL AT + 'A' # 0x41 -> LATIN CAPITAL LETTER A + 'B' # 0x42 -> LATIN CAPITAL LETTER B + 'C' # 0x43 -> LATIN CAPITAL LETTER C + 'D' # 0x44 -> LATIN CAPITAL LETTER D + 'E' # 0x45 -> LATIN CAPITAL LETTER E + 'F' # 0x46 -> LATIN CAPITAL LETTER F + 'G' # 0x47 -> LATIN CAPITAL LETTER G + 'H' # 0x48 -> LATIN CAPITAL LETTER H + 'I' # 0x49 -> LATIN CAPITAL LETTER I + 'J' # 0x4A -> LATIN CAPITAL LETTER J + 'K' # 0x4B -> LATIN CAPITAL LETTER K + 'L' # 0x4C -> LATIN CAPITAL LETTER L + 'M' # 0x4D -> LATIN CAPITAL LETTER M + 'N' # 0x4E -> LATIN CAPITAL LETTER N + 'O' # 0x4F -> LATIN CAPITAL LETTER O + 'P' # 0x50 -> LATIN CAPITAL LETTER P + 'Q' # 0x51 -> LATIN CAPITAL LETTER Q + 'R' # 0x52 -> LATIN CAPITAL LETTER R + 'S' # 0x53 -> LATIN CAPITAL LETTER S + 'T' # 0x54 -> LATIN CAPITAL LETTER T + 'U' # 0x55 -> LATIN CAPITAL LETTER U + 'V' # 0x56 -> LATIN CAPITAL LETTER V + 'W' # 0x57 -> LATIN CAPITAL LETTER W + 'X' # 0x58 -> LATIN CAPITAL LETTER X + 'Y' # 0x59 -> LATIN CAPITAL LETTER Y + 'Z' # 0x5A -> LATIN CAPITAL LETTER Z + '[' # 0x5B -> LEFT SQUARE BRACKET + '\\' # 0x5C -> REVERSE SOLIDUS + ']' # 0x5D -> RIGHT SQUARE BRACKET + '^' # 0x5E -> CIRCUMFLEX ACCENT + '_' # 0x5F -> LOW LINE + '`' # 0x60 -> GRAVE ACCENT + 'a' # 0x61 -> LATIN SMALL LETTER A + 'b' # 0x62 -> LATIN SMALL LETTER B + 'c' # 0x63 -> LATIN SMALL LETTER C + 'd' # 0x64 -> LATIN SMALL LETTER D + 'e' # 0x65 -> LATIN SMALL LETTER E + 'f' # 0x66 -> LATIN SMALL LETTER F + 'g' # 0x67 -> LATIN SMALL LETTER G + 'h' # 0x68 -> LATIN SMALL LETTER H + 'i' # 0x69 -> LATIN SMALL LETTER I + 'j' # 0x6A -> LATIN SMALL LETTER J + 'k' # 0x6B -> LATIN SMALL LETTER K + 'l' # 0x6C -> LATIN SMALL LETTER L + 'm' # 0x6D -> LATIN SMALL LETTER M + 'n' # 0x6E -> LATIN SMALL LETTER N + 'o' # 0x6F -> LATIN SMALL LETTER O + 'p' # 0x70 -> LATIN SMALL LETTER P + 'q' # 0x71 -> LATIN SMALL LETTER Q + 'r' # 0x72 -> LATIN SMALL LETTER R + 's' # 0x73 -> LATIN SMALL LETTER S + 't' # 0x74 -> LATIN SMALL LETTER T + 'u' # 0x75 -> LATIN SMALL LETTER U + 'v' # 0x76 -> LATIN SMALL LETTER V + 'w' # 0x77 -> LATIN SMALL LETTER W + 'x' # 0x78 -> LATIN SMALL LETTER X + 'y' # 0x79 -> LATIN SMALL LETTER Y + 'z' # 0x7A -> LATIN SMALL LETTER Z + '{' # 0x7B -> LEFT CURLY BRACKET + '|' # 0x7C -> VERTICAL LINE + '}' # 0x7D -> RIGHT CURLY BRACKET + '~' # 0x7E -> TILDE + '\x7f' # 0x7F -> DELETE + '\u2500' # 0x80 -> BOX DRAWINGS LIGHT HORIZONTAL + '\u2502' # 0x81 -> BOX DRAWINGS LIGHT VERTICAL + '\u250c' # 0x82 -> BOX DRAWINGS LIGHT DOWN AND RIGHT + '\u2510' # 0x83 -> BOX DRAWINGS LIGHT DOWN AND LEFT + '\u2514' # 0x84 -> BOX DRAWINGS LIGHT UP AND RIGHT + '\u2518' # 0x85 -> BOX DRAWINGS LIGHT UP AND LEFT + '\u251c' # 0x86 -> BOX DRAWINGS LIGHT VERTICAL AND RIGHT + '\u2524' # 0x87 -> BOX DRAWINGS LIGHT VERTICAL AND LEFT + '\u252c' # 0x88 -> BOX DRAWINGS LIGHT DOWN AND HORIZONTAL + '\u2534' # 0x89 -> BOX DRAWINGS LIGHT UP AND HORIZONTAL + '\u253c' # 0x8A -> BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL + '\u2580' # 0x8B -> UPPER HALF BLOCK + '\u2584' # 0x8C -> LOWER HALF BLOCK + '\u2588' # 0x8D -> FULL BLOCK + '\u258c' # 0x8E -> LEFT HALF BLOCK + '\u2590' # 0x8F -> RIGHT HALF BLOCK + '\u2591' # 0x90 -> LIGHT SHADE + '\u2592' # 0x91 -> MEDIUM SHADE + '\u2593' # 0x92 -> DARK SHADE + '\u2320' # 0x93 -> TOP HALF INTEGRAL + '\u25a0' # 0x94 -> BLACK SQUARE + '\u2219' # 0x95 -> BULLET OPERATOR + '\u221a' # 0x96 -> SQUARE ROOT + '\u2248' # 0x97 -> ALMOST EQUAL TO + '\u2264' # 0x98 -> LESS-THAN OR EQUAL TO + '\u2265' # 0x99 -> GREATER-THAN OR EQUAL TO + '\xa0' # 0x9A -> NO-BREAK SPACE + '\u2321' # 0x9B -> BOTTOM HALF INTEGRAL + '\xb0' # 0x9C -> DEGREE SIGN + '\xb2' # 0x9D -> SUPERSCRIPT TWO + '\xb7' # 0x9E -> MIDDLE DOT + '\xf7' # 0x9F -> DIVISION SIGN + '\u2550' # 0xA0 -> BOX DRAWINGS DOUBLE HORIZONTAL + '\u2551' # 0xA1 -> BOX DRAWINGS DOUBLE VERTICAL + '\u2552' # 0xA2 -> BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE + '\u0451' # 0xA3 -> CYRILLIC SMALL LETTER IO + '\u2553' # 0xA4 -> BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE + '\u2554' # 0xA5 -> BOX DRAWINGS DOUBLE DOWN AND RIGHT + '\u2555' # 0xA6 -> BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE + '\u2556' # 0xA7 -> BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE + '\u2557' # 0xA8 -> BOX DRAWINGS DOUBLE DOWN AND LEFT + '\u2558' # 0xA9 -> BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE + '\u2559' # 0xAA -> BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE + '\u255a' # 0xAB -> BOX DRAWINGS DOUBLE UP AND RIGHT + '\u255b' # 0xAC -> BOX DRAWINGS UP SINGLE AND LEFT DOUBLE + '\u255c' # 0xAD -> BOX DRAWINGS UP DOUBLE AND LEFT SINGLE + '\u255d' # 0xAE -> BOX DRAWINGS DOUBLE UP AND LEFT + '\u255e' # 0xAF -> BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE + '\u255f' # 0xB0 -> BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE + '\u2560' # 0xB1 -> BOX DRAWINGS DOUBLE VERTICAL AND RIGHT + '\u2561' # 0xB2 -> BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE + '\u0401' # 0xB3 -> CYRILLIC CAPITAL LETTER IO + '\u2562' # 0xB4 -> BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE + '\u2563' # 0xB5 -> BOX DRAWINGS DOUBLE VERTICAL AND LEFT + '\u2564' # 0xB6 -> BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE + '\u2565' # 0xB7 -> BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE + '\u2566' # 0xB8 -> BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL + '\u2567' # 0xB9 -> BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE + '\u2568' # 0xBA -> BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE + '\u2569' # 0xBB -> BOX DRAWINGS DOUBLE UP AND HORIZONTAL + '\u256a' # 0xBC -> BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE + '\u256b' # 0xBD -> BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE + '\u256c' # 0xBE -> BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL + '\xa9' # 0xBF -> COPYRIGHT SIGN + '\u044e' # 0xC0 -> CYRILLIC SMALL LETTER YU + '\u0430' # 0xC1 -> CYRILLIC SMALL LETTER A + '\u0431' # 0xC2 -> CYRILLIC SMALL LETTER BE + '\u0446' # 0xC3 -> CYRILLIC SMALL LETTER TSE + '\u0434' # 0xC4 -> CYRILLIC SMALL LETTER DE + '\u0435' # 0xC5 -> CYRILLIC SMALL LETTER IE + '\u0444' # 0xC6 -> CYRILLIC SMALL LETTER EF + '\u0433' # 0xC7 -> CYRILLIC SMALL LETTER GHE + '\u0445' # 0xC8 -> CYRILLIC SMALL LETTER HA + '\u0438' # 0xC9 -> CYRILLIC SMALL LETTER I + '\u0439' # 0xCA -> CYRILLIC SMALL LETTER SHORT I + '\u043a' # 0xCB -> CYRILLIC SMALL LETTER KA + '\u043b' # 0xCC -> CYRILLIC SMALL LETTER EL + '\u043c' # 0xCD -> CYRILLIC SMALL LETTER EM + '\u043d' # 0xCE -> CYRILLIC SMALL LETTER EN + '\u043e' # 0xCF -> CYRILLIC SMALL LETTER O + '\u043f' # 0xD0 -> CYRILLIC SMALL LETTER PE + '\u044f' # 0xD1 -> CYRILLIC SMALL LETTER YA + '\u0440' # 0xD2 -> CYRILLIC SMALL LETTER ER + '\u0441' # 0xD3 -> CYRILLIC SMALL LETTER ES + '\u0442' # 0xD4 -> CYRILLIC SMALL LETTER TE + '\u0443' # 0xD5 -> CYRILLIC SMALL LETTER U + '\u0436' # 0xD6 -> CYRILLIC SMALL LETTER ZHE + '\u0432' # 0xD7 -> CYRILLIC SMALL LETTER VE + '\u044c' # 0xD8 -> CYRILLIC SMALL LETTER SOFT SIGN + '\u044b' # 0xD9 -> CYRILLIC SMALL LETTER YERU + '\u0437' # 0xDA -> CYRILLIC SMALL LETTER ZE + '\u0448' # 0xDB -> CYRILLIC SMALL LETTER SHA + '\u044d' # 0xDC -> CYRILLIC SMALL LETTER E + '\u0449' # 0xDD -> CYRILLIC SMALL LETTER SHCHA + '\u0447' # 0xDE -> CYRILLIC SMALL LETTER CHE + '\u044a' # 0xDF -> CYRILLIC SMALL LETTER HARD SIGN + '\u042e' # 0xE0 -> CYRILLIC CAPITAL LETTER YU + '\u0410' # 0xE1 -> CYRILLIC CAPITAL LETTER A + '\u0411' # 0xE2 -> CYRILLIC CAPITAL LETTER BE + '\u0426' # 0xE3 -> CYRILLIC CAPITAL LETTER TSE + '\u0414' # 0xE4 -> CYRILLIC CAPITAL LETTER DE + '\u0415' # 0xE5 -> CYRILLIC CAPITAL LETTER IE + '\u0424' # 0xE6 -> CYRILLIC CAPITAL LETTER EF + '\u0413' # 0xE7 -> CYRILLIC CAPITAL LETTER GHE + '\u0425' # 0xE8 -> CYRILLIC CAPITAL LETTER HA + '\u0418' # 0xE9 -> CYRILLIC CAPITAL LETTER I + '\u0419' # 0xEA -> CYRILLIC CAPITAL LETTER SHORT I + '\u041a' # 0xEB -> CYRILLIC CAPITAL LETTER KA + '\u041b' # 0xEC -> CYRILLIC CAPITAL LETTER EL + '\u041c' # 0xED -> CYRILLIC CAPITAL LETTER EM + '\u041d' # 0xEE -> CYRILLIC CAPITAL LETTER EN + '\u041e' # 0xEF -> CYRILLIC CAPITAL LETTER O + '\u041f' # 0xF0 -> CYRILLIC CAPITAL LETTER PE + '\u042f' # 0xF1 -> CYRILLIC CAPITAL LETTER YA + '\u0420' # 0xF2 -> CYRILLIC CAPITAL LETTER ER + '\u0421' # 0xF3 -> CYRILLIC CAPITAL LETTER ES + '\u0422' # 0xF4 -> CYRILLIC CAPITAL LETTER TE + '\u0423' # 0xF5 -> CYRILLIC CAPITAL LETTER U + '\u0416' # 0xF6 -> CYRILLIC CAPITAL LETTER ZHE + '\u0412' # 0xF7 -> CYRILLIC CAPITAL LETTER VE + '\u042c' # 0xF8 -> CYRILLIC CAPITAL LETTER SOFT SIGN + '\u042b' # 0xF9 -> CYRILLIC CAPITAL LETTER YERU + '\u0417' # 0xFA -> CYRILLIC CAPITAL LETTER ZE + '\u0428' # 0xFB -> CYRILLIC CAPITAL LETTER SHA + '\u042d' # 0xFC -> CYRILLIC CAPITAL LETTER E + '\u0429' # 0xFD -> CYRILLIC CAPITAL LETTER SHCHA + '\u0427' # 0xFE -> CYRILLIC CAPITAL LETTER CHE + '\u042a' # 0xFF -> CYRILLIC CAPITAL LETTER HARD SIGN +) + +### Encoding table +encoding_table=codecs.charmap_build(decoding_table) diff --git a/env/Lib/encodings/koi8_t.py b/env/Lib/encodings/koi8_t.py new file mode 100644 index 0000000..b5415ba --- /dev/null +++ b/env/Lib/encodings/koi8_t.py @@ -0,0 +1,308 @@ +""" Python Character Mapping Codec koi8_t +""" +# http://ru.wikipedia.org/wiki/КОИ-8 +# http://www.opensource.apple.com/source/libiconv/libiconv-4/libiconv/tests/KOI8-T.TXT + +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-t', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) + + +### Decoding Table + +decoding_table = ( + '\x00' # 0x00 -> NULL + '\x01' # 0x01 -> START OF HEADING + '\x02' # 0x02 -> START OF TEXT + '\x03' # 0x03 -> END OF TEXT + '\x04' # 0x04 -> END OF TRANSMISSION + '\x05' # 0x05 -> ENQUIRY + '\x06' # 0x06 -> ACKNOWLEDGE + '\x07' # 0x07 -> BELL + '\x08' # 0x08 -> BACKSPACE + '\t' # 0x09 -> HORIZONTAL TABULATION + '\n' # 0x0A -> LINE FEED + '\x0b' # 0x0B -> VERTICAL TABULATION + '\x0c' # 0x0C -> FORM FEED + '\r' # 0x0D -> CARRIAGE RETURN + '\x0e' # 0x0E -> SHIFT OUT + '\x0f' # 0x0F -> SHIFT IN + '\x10' # 0x10 -> DATA LINK ESCAPE + '\x11' # 0x11 -> DEVICE CONTROL ONE + '\x12' # 0x12 -> DEVICE CONTROL TWO + '\x13' # 0x13 -> DEVICE CONTROL THREE + '\x14' # 0x14 -> DEVICE CONTROL FOUR + '\x15' # 0x15 -> NEGATIVE ACKNOWLEDGE + '\x16' # 0x16 -> SYNCHRONOUS IDLE + '\x17' # 0x17 -> END OF TRANSMISSION BLOCK + '\x18' # 0x18 -> CANCEL + '\x19' # 0x19 -> END OF MEDIUM + '\x1a' # 0x1A -> SUBSTITUTE + '\x1b' # 0x1B -> ESCAPE + '\x1c' # 0x1C -> FILE SEPARATOR + '\x1d' # 0x1D -> GROUP SEPARATOR + '\x1e' # 0x1E -> RECORD SEPARATOR + '\x1f' # 0x1F -> UNIT SEPARATOR + ' ' # 0x20 -> SPACE + '!' # 0x21 -> EXCLAMATION MARK + '"' # 0x22 -> QUOTATION MARK + '#' # 0x23 -> NUMBER SIGN + '$' # 0x24 -> DOLLAR SIGN + '%' # 0x25 -> PERCENT SIGN + '&' # 0x26 -> AMPERSAND + "'" # 0x27 -> APOSTROPHE + '(' # 0x28 -> LEFT PARENTHESIS + ')' # 0x29 -> RIGHT PARENTHESIS + '*' # 0x2A -> ASTERISK + '+' # 0x2B -> PLUS SIGN + ',' # 0x2C -> COMMA + '-' # 0x2D -> HYPHEN-MINUS + '.' # 0x2E -> FULL STOP + '/' # 0x2F -> SOLIDUS + '0' # 0x30 -> DIGIT ZERO + '1' # 0x31 -> DIGIT ONE + '2' # 0x32 -> DIGIT TWO + '3' # 0x33 -> DIGIT THREE + '4' # 0x34 -> DIGIT FOUR + '5' # 0x35 -> DIGIT FIVE + '6' # 0x36 -> DIGIT SIX + '7' # 0x37 -> DIGIT SEVEN + '8' # 0x38 -> DIGIT EIGHT + '9' # 0x39 -> DIGIT NINE + ':' # 0x3A -> COLON + ';' # 0x3B -> SEMICOLON + '<' # 0x3C -> LESS-THAN SIGN + '=' # 0x3D -> EQUALS SIGN + '>' # 0x3E -> GREATER-THAN SIGN + '?' # 0x3F -> QUESTION MARK + '@' # 0x40 -> COMMERCIAL AT + 'A' # 0x41 -> LATIN CAPITAL LETTER A + 'B' # 0x42 -> LATIN CAPITAL LETTER B + 'C' # 0x43 -> LATIN CAPITAL LETTER C + 'D' # 0x44 -> LATIN CAPITAL LETTER D + 'E' # 0x45 -> LATIN CAPITAL LETTER E + 'F' # 0x46 -> LATIN CAPITAL LETTER F + 'G' # 0x47 -> LATIN CAPITAL LETTER G + 'H' # 0x48 -> LATIN CAPITAL LETTER H + 'I' # 0x49 -> LATIN CAPITAL LETTER I + 'J' # 0x4A -> LATIN CAPITAL LETTER J + 'K' # 0x4B -> LATIN CAPITAL LETTER K + 'L' # 0x4C -> LATIN CAPITAL LETTER L + 'M' # 0x4D -> LATIN CAPITAL LETTER M + 'N' # 0x4E -> LATIN CAPITAL LETTER N + 'O' # 0x4F -> LATIN CAPITAL LETTER O + 'P' # 0x50 -> LATIN CAPITAL LETTER P + 'Q' # 0x51 -> LATIN CAPITAL LETTER Q + 'R' # 0x52 -> LATIN CAPITAL LETTER R + 'S' # 0x53 -> LATIN CAPITAL LETTER S + 'T' # 0x54 -> LATIN CAPITAL LETTER T + 'U' # 0x55 -> LATIN CAPITAL LETTER U + 'V' # 0x56 -> LATIN CAPITAL LETTER V + 'W' # 0x57 -> LATIN CAPITAL LETTER W + 'X' # 0x58 -> LATIN CAPITAL LETTER X + 'Y' # 0x59 -> LATIN CAPITAL LETTER Y + 'Z' # 0x5A -> LATIN CAPITAL LETTER Z + '[' # 0x5B -> LEFT SQUARE BRACKET + '\\' # 0x5C -> REVERSE SOLIDUS + ']' # 0x5D -> RIGHT SQUARE BRACKET + '^' # 0x5E -> CIRCUMFLEX ACCENT + '_' # 0x5F -> LOW LINE + '`' # 0x60 -> GRAVE ACCENT + 'a' # 0x61 -> LATIN SMALL LETTER A + 'b' # 0x62 -> LATIN SMALL LETTER B + 'c' # 0x63 -> LATIN SMALL LETTER C + 'd' # 0x64 -> LATIN SMALL LETTER D + 'e' # 0x65 -> LATIN SMALL LETTER E + 'f' # 0x66 -> LATIN SMALL LETTER F + 'g' # 0x67 -> LATIN SMALL LETTER G + 'h' # 0x68 -> LATIN SMALL LETTER H + 'i' # 0x69 -> LATIN SMALL LETTER I + 'j' # 0x6A -> LATIN SMALL LETTER J + 'k' # 0x6B -> LATIN SMALL LETTER K + 'l' # 0x6C -> LATIN SMALL LETTER L + 'm' # 0x6D -> LATIN SMALL LETTER M + 'n' # 0x6E -> LATIN SMALL LETTER N + 'o' # 0x6F -> LATIN SMALL LETTER O + 'p' # 0x70 -> LATIN SMALL LETTER P + 'q' # 0x71 -> LATIN SMALL LETTER Q + 'r' # 0x72 -> LATIN SMALL LETTER R + 's' # 0x73 -> LATIN SMALL LETTER S + 't' # 0x74 -> LATIN SMALL LETTER T + 'u' # 0x75 -> LATIN SMALL LETTER U + 'v' # 0x76 -> LATIN SMALL LETTER V + 'w' # 0x77 -> LATIN SMALL LETTER W + 'x' # 0x78 -> LATIN SMALL LETTER X + 'y' # 0x79 -> LATIN SMALL LETTER Y + 'z' # 0x7A -> LATIN SMALL LETTER Z + '{' # 0x7B -> LEFT CURLY BRACKET + '|' # 0x7C -> VERTICAL LINE + '}' # 0x7D -> RIGHT CURLY BRACKET + '~' # 0x7E -> TILDE + '\x7f' # 0x7F -> DELETE + '\u049b' # 0x80 -> CYRILLIC SMALL LETTER KA WITH DESCENDER + '\u0493' # 0x81 -> CYRILLIC SMALL LETTER GHE WITH STROKE + '\u201a' # 0x82 -> SINGLE LOW-9 QUOTATION MARK + '\u0492' # 0x83 -> CYRILLIC CAPITAL LETTER GHE WITH STROKE + '\u201e' # 0x84 -> DOUBLE LOW-9 QUOTATION MARK + '\u2026' # 0x85 -> HORIZONTAL ELLIPSIS + '\u2020' # 0x86 -> DAGGER + '\u2021' # 0x87 -> DOUBLE DAGGER + '\ufffe' # 0x88 -> UNDEFINED + '\u2030' # 0x89 -> PER MILLE SIGN + '\u04b3' # 0x8A -> CYRILLIC SMALL LETTER HA WITH DESCENDER + '\u2039' # 0x8B -> SINGLE LEFT-POINTING ANGLE QUOTATION MARK + '\u04b2' # 0x8C -> CYRILLIC CAPITAL LETTER HA WITH DESCENDER + '\u04b7' # 0x8D -> CYRILLIC SMALL LETTER CHE WITH DESCENDER + '\u04b6' # 0x8E -> CYRILLIC CAPITAL LETTER CHE WITH DESCENDER + '\ufffe' # 0x8F -> UNDEFINED + '\u049a' # 0x90 -> CYRILLIC CAPITAL LETTER KA WITH DESCENDER + '\u2018' # 0x91 -> LEFT SINGLE QUOTATION MARK + '\u2019' # 0x92 -> RIGHT SINGLE QUOTATION MARK + '\u201c' # 0x93 -> LEFT DOUBLE QUOTATION MARK + '\u201d' # 0x94 -> RIGHT DOUBLE QUOTATION MARK + '\u2022' # 0x95 -> BULLET + '\u2013' # 0x96 -> EN DASH + '\u2014' # 0x97 -> EM DASH + '\ufffe' # 0x98 -> UNDEFINED + '\u2122' # 0x99 -> TRADE MARK SIGN + '\ufffe' # 0x9A -> UNDEFINED + '\u203a' # 0x9B -> SINGLE RIGHT-POINTING ANGLE QUOTATION MARK + '\ufffe' # 0x9C -> UNDEFINED + '\ufffe' # 0x9D -> UNDEFINED + '\ufffe' # 0x9E -> UNDEFINED + '\ufffe' # 0x9F -> UNDEFINED + '\ufffe' # 0xA0 -> UNDEFINED + '\u04ef' # 0xA1 -> CYRILLIC SMALL LETTER U WITH MACRON + '\u04ee' # 0xA2 -> CYRILLIC CAPITAL LETTER U WITH MACRON + '\u0451' # 0xA3 -> CYRILLIC SMALL LETTER IO + '\xa4' # 0xA4 -> CURRENCY SIGN + '\u04e3' # 0xA5 -> CYRILLIC SMALL LETTER I WITH MACRON + '\xa6' # 0xA6 -> BROKEN BAR + '\xa7' # 0xA7 -> SECTION SIGN + '\ufffe' # 0xA8 -> UNDEFINED + '\ufffe' # 0xA9 -> UNDEFINED + '\ufffe' # 0xAA -> UNDEFINED + '\xab' # 0xAB -> LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + '\xac' # 0xAC -> NOT SIGN + '\xad' # 0xAD -> SOFT HYPHEN + '\xae' # 0xAE -> REGISTERED SIGN + '\ufffe' # 0xAF -> UNDEFINED + '\xb0' # 0xB0 -> DEGREE SIGN + '\xb1' # 0xB1 -> PLUS-MINUS SIGN + '\xb2' # 0xB2 -> SUPERSCRIPT TWO + '\u0401' # 0xB3 -> CYRILLIC CAPITAL LETTER IO + '\ufffe' # 0xB4 -> UNDEFINED + '\u04e2' # 0xB5 -> CYRILLIC CAPITAL LETTER I WITH MACRON + '\xb6' # 0xB6 -> PILCROW SIGN + '\xb7' # 0xB7 -> MIDDLE DOT + '\ufffe' # 0xB8 -> UNDEFINED + '\u2116' # 0xB9 -> NUMERO SIGN + '\ufffe' # 0xBA -> UNDEFINED + '\xbb' # 0xBB -> RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + '\ufffe' # 0xBC -> UNDEFINED + '\ufffe' # 0xBD -> UNDEFINED + '\ufffe' # 0xBE -> UNDEFINED + '\xa9' # 0xBF -> COPYRIGHT SIGN + '\u044e' # 0xC0 -> CYRILLIC SMALL LETTER YU + '\u0430' # 0xC1 -> CYRILLIC SMALL LETTER A + '\u0431' # 0xC2 -> CYRILLIC SMALL LETTER BE + '\u0446' # 0xC3 -> CYRILLIC SMALL LETTER TSE + '\u0434' # 0xC4 -> CYRILLIC SMALL LETTER DE + '\u0435' # 0xC5 -> CYRILLIC SMALL LETTER IE + '\u0444' # 0xC6 -> CYRILLIC SMALL LETTER EF + '\u0433' # 0xC7 -> CYRILLIC SMALL LETTER GHE + '\u0445' # 0xC8 -> CYRILLIC SMALL LETTER HA + '\u0438' # 0xC9 -> CYRILLIC SMALL LETTER I + '\u0439' # 0xCA -> CYRILLIC SMALL LETTER SHORT I + '\u043a' # 0xCB -> CYRILLIC SMALL LETTER KA + '\u043b' # 0xCC -> CYRILLIC SMALL LETTER EL + '\u043c' # 0xCD -> CYRILLIC SMALL LETTER EM + '\u043d' # 0xCE -> CYRILLIC SMALL LETTER EN + '\u043e' # 0xCF -> CYRILLIC SMALL LETTER O + '\u043f' # 0xD0 -> CYRILLIC SMALL LETTER PE + '\u044f' # 0xD1 -> CYRILLIC SMALL LETTER YA + '\u0440' # 0xD2 -> CYRILLIC SMALL LETTER ER + '\u0441' # 0xD3 -> CYRILLIC SMALL LETTER ES + '\u0442' # 0xD4 -> CYRILLIC SMALL LETTER TE + '\u0443' # 0xD5 -> CYRILLIC SMALL LETTER U + '\u0436' # 0xD6 -> CYRILLIC SMALL LETTER ZHE + '\u0432' # 0xD7 -> CYRILLIC SMALL LETTER VE + '\u044c' # 0xD8 -> CYRILLIC SMALL LETTER SOFT SIGN + '\u044b' # 0xD9 -> CYRILLIC SMALL LETTER YERU + '\u0437' # 0xDA -> CYRILLIC SMALL LETTER ZE + '\u0448' # 0xDB -> CYRILLIC SMALL LETTER SHA + '\u044d' # 0xDC -> CYRILLIC SMALL LETTER E + '\u0449' # 0xDD -> CYRILLIC SMALL LETTER SHCHA + '\u0447' # 0xDE -> CYRILLIC SMALL LETTER CHE + '\u044a' # 0xDF -> CYRILLIC SMALL LETTER HARD SIGN + '\u042e' # 0xE0 -> CYRILLIC CAPITAL LETTER YU + '\u0410' # 0xE1 -> CYRILLIC CAPITAL LETTER A + '\u0411' # 0xE2 -> CYRILLIC CAPITAL LETTER BE + '\u0426' # 0xE3 -> CYRILLIC CAPITAL LETTER TSE + '\u0414' # 0xE4 -> CYRILLIC CAPITAL LETTER DE + '\u0415' # 0xE5 -> CYRILLIC CAPITAL LETTER IE + '\u0424' # 0xE6 -> CYRILLIC CAPITAL LETTER EF + '\u0413' # 0xE7 -> CYRILLIC CAPITAL LETTER GHE + '\u0425' # 0xE8 -> CYRILLIC CAPITAL LETTER HA + '\u0418' # 0xE9 -> CYRILLIC CAPITAL LETTER I + '\u0419' # 0xEA -> CYRILLIC CAPITAL LETTER SHORT I + '\u041a' # 0xEB -> CYRILLIC CAPITAL LETTER KA + '\u041b' # 0xEC -> CYRILLIC CAPITAL LETTER EL + '\u041c' # 0xED -> CYRILLIC CAPITAL LETTER EM + '\u041d' # 0xEE -> CYRILLIC CAPITAL LETTER EN + '\u041e' # 0xEF -> CYRILLIC CAPITAL LETTER O + '\u041f' # 0xF0 -> CYRILLIC CAPITAL LETTER PE + '\u042f' # 0xF1 -> CYRILLIC CAPITAL LETTER YA + '\u0420' # 0xF2 -> CYRILLIC CAPITAL LETTER ER + '\u0421' # 0xF3 -> CYRILLIC CAPITAL LETTER ES + '\u0422' # 0xF4 -> CYRILLIC CAPITAL LETTER TE + '\u0423' # 0xF5 -> CYRILLIC CAPITAL LETTER U + '\u0416' # 0xF6 -> CYRILLIC CAPITAL LETTER ZHE + '\u0412' # 0xF7 -> CYRILLIC CAPITAL LETTER VE + '\u042c' # 0xF8 -> CYRILLIC CAPITAL LETTER SOFT SIGN + '\u042b' # 0xF9 -> CYRILLIC CAPITAL LETTER YERU + '\u0417' # 0xFA -> CYRILLIC CAPITAL LETTER ZE + '\u0428' # 0xFB -> CYRILLIC CAPITAL LETTER SHA + '\u042d' # 0xFC -> CYRILLIC CAPITAL LETTER E + '\u0429' # 0xFD -> CYRILLIC CAPITAL LETTER SHCHA + '\u0427' # 0xFE -> CYRILLIC CAPITAL LETTER CHE + '\u042a' # 0xFF -> CYRILLIC CAPITAL LETTER HARD SIGN +) + +### Encoding table +encoding_table=codecs.charmap_build(decoding_table) diff --git a/env/Lib/encodings/koi8_u.py b/env/Lib/encodings/koi8_u.py new file mode 100644 index 0000000..f9e3fae --- /dev/null +++ b/env/Lib/encodings/koi8_u.py @@ -0,0 +1,307 @@ +""" 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 = ( + '\x00' # 0x00 -> NULL + '\x01' # 0x01 -> START OF HEADING + '\x02' # 0x02 -> START OF TEXT + '\x03' # 0x03 -> END OF TEXT + '\x04' # 0x04 -> END OF TRANSMISSION + '\x05' # 0x05 -> ENQUIRY + '\x06' # 0x06 -> ACKNOWLEDGE + '\x07' # 0x07 -> BELL + '\x08' # 0x08 -> BACKSPACE + '\t' # 0x09 -> HORIZONTAL TABULATION + '\n' # 0x0A -> LINE FEED + '\x0b' # 0x0B -> VERTICAL TABULATION + '\x0c' # 0x0C -> FORM FEED + '\r' # 0x0D -> CARRIAGE RETURN + '\x0e' # 0x0E -> SHIFT OUT + '\x0f' # 0x0F -> SHIFT IN + '\x10' # 0x10 -> DATA LINK ESCAPE + '\x11' # 0x11 -> DEVICE CONTROL ONE + '\x12' # 0x12 -> DEVICE CONTROL TWO + '\x13' # 0x13 -> DEVICE CONTROL THREE + '\x14' # 0x14 -> DEVICE CONTROL FOUR + '\x15' # 0x15 -> NEGATIVE ACKNOWLEDGE + '\x16' # 0x16 -> SYNCHRONOUS IDLE + '\x17' # 0x17 -> END OF TRANSMISSION BLOCK + '\x18' # 0x18 -> CANCEL + '\x19' # 0x19 -> END OF MEDIUM + '\x1a' # 0x1A -> SUBSTITUTE + '\x1b' # 0x1B -> ESCAPE + '\x1c' # 0x1C -> FILE SEPARATOR + '\x1d' # 0x1D -> GROUP SEPARATOR + '\x1e' # 0x1E -> RECORD SEPARATOR + '\x1f' # 0x1F -> UNIT SEPARATOR + ' ' # 0x20 -> SPACE + '!' # 0x21 -> EXCLAMATION MARK + '"' # 0x22 -> QUOTATION MARK + '#' # 0x23 -> NUMBER SIGN + '$' # 0x24 -> DOLLAR SIGN + '%' # 0x25 -> PERCENT SIGN + '&' # 0x26 -> AMPERSAND + "'" # 0x27 -> APOSTROPHE + '(' # 0x28 -> LEFT PARENTHESIS + ')' # 0x29 -> RIGHT PARENTHESIS + '*' # 0x2A -> ASTERISK + '+' # 0x2B -> PLUS SIGN + ',' # 0x2C -> COMMA + '-' # 0x2D -> HYPHEN-MINUS + '.' # 0x2E -> FULL STOP + '/' # 0x2F -> SOLIDUS + '0' # 0x30 -> DIGIT ZERO + '1' # 0x31 -> DIGIT ONE + '2' # 0x32 -> DIGIT TWO + '3' # 0x33 -> DIGIT THREE + '4' # 0x34 -> DIGIT FOUR + '5' # 0x35 -> DIGIT FIVE + '6' # 0x36 -> DIGIT SIX + '7' # 0x37 -> DIGIT SEVEN + '8' # 0x38 -> DIGIT EIGHT + '9' # 0x39 -> DIGIT NINE + ':' # 0x3A -> COLON + ';' # 0x3B -> SEMICOLON + '<' # 0x3C -> LESS-THAN SIGN + '=' # 0x3D -> EQUALS SIGN + '>' # 0x3E -> GREATER-THAN SIGN + '?' # 0x3F -> QUESTION MARK + '@' # 0x40 -> COMMERCIAL AT + 'A' # 0x41 -> LATIN CAPITAL LETTER A + 'B' # 0x42 -> LATIN CAPITAL LETTER B + 'C' # 0x43 -> LATIN CAPITAL LETTER C + 'D' # 0x44 -> LATIN CAPITAL LETTER D + 'E' # 0x45 -> LATIN CAPITAL LETTER E + 'F' # 0x46 -> LATIN CAPITAL LETTER F + 'G' # 0x47 -> LATIN CAPITAL LETTER G + 'H' # 0x48 -> LATIN CAPITAL LETTER H + 'I' # 0x49 -> LATIN CAPITAL LETTER I + 'J' # 0x4A -> LATIN CAPITAL LETTER J + 'K' # 0x4B -> LATIN CAPITAL LETTER K + 'L' # 0x4C -> LATIN CAPITAL LETTER L + 'M' # 0x4D -> LATIN CAPITAL LETTER M + 'N' # 0x4E -> LATIN CAPITAL LETTER N + 'O' # 0x4F -> LATIN CAPITAL LETTER O + 'P' # 0x50 -> LATIN CAPITAL LETTER P + 'Q' # 0x51 -> LATIN CAPITAL LETTER Q + 'R' # 0x52 -> LATIN CAPITAL LETTER R + 'S' # 0x53 -> LATIN CAPITAL LETTER S + 'T' # 0x54 -> LATIN CAPITAL LETTER T + 'U' # 0x55 -> LATIN CAPITAL LETTER U + 'V' # 0x56 -> LATIN CAPITAL LETTER V + 'W' # 0x57 -> LATIN CAPITAL LETTER W + 'X' # 0x58 -> LATIN CAPITAL LETTER X + 'Y' # 0x59 -> LATIN CAPITAL LETTER Y + 'Z' # 0x5A -> LATIN CAPITAL LETTER Z + '[' # 0x5B -> LEFT SQUARE BRACKET + '\\' # 0x5C -> REVERSE SOLIDUS + ']' # 0x5D -> RIGHT SQUARE BRACKET + '^' # 0x5E -> CIRCUMFLEX ACCENT + '_' # 0x5F -> LOW LINE + '`' # 0x60 -> GRAVE ACCENT + 'a' # 0x61 -> LATIN SMALL LETTER A + 'b' # 0x62 -> LATIN SMALL LETTER B + 'c' # 0x63 -> LATIN SMALL LETTER C + 'd' # 0x64 -> LATIN SMALL LETTER D + 'e' # 0x65 -> LATIN SMALL LETTER E + 'f' # 0x66 -> LATIN SMALL LETTER F + 'g' # 0x67 -> LATIN SMALL LETTER G + 'h' # 0x68 -> LATIN SMALL LETTER H + 'i' # 0x69 -> LATIN SMALL LETTER I + 'j' # 0x6A -> LATIN SMALL LETTER J + 'k' # 0x6B -> LATIN SMALL LETTER K + 'l' # 0x6C -> LATIN SMALL LETTER L + 'm' # 0x6D -> LATIN SMALL LETTER M + 'n' # 0x6E -> LATIN SMALL LETTER N + 'o' # 0x6F -> LATIN SMALL LETTER O + 'p' # 0x70 -> LATIN SMALL LETTER P + 'q' # 0x71 -> LATIN SMALL LETTER Q + 'r' # 0x72 -> LATIN SMALL LETTER R + 's' # 0x73 -> LATIN SMALL LETTER S + 't' # 0x74 -> LATIN SMALL LETTER T + 'u' # 0x75 -> LATIN SMALL LETTER U + 'v' # 0x76 -> LATIN SMALL LETTER V + 'w' # 0x77 -> LATIN SMALL LETTER W + 'x' # 0x78 -> LATIN SMALL LETTER X + 'y' # 0x79 -> LATIN SMALL LETTER Y + 'z' # 0x7A -> LATIN SMALL LETTER Z + '{' # 0x7B -> LEFT CURLY BRACKET + '|' # 0x7C -> VERTICAL LINE + '}' # 0x7D -> RIGHT CURLY BRACKET + '~' # 0x7E -> TILDE + '\x7f' # 0x7F -> DELETE + '\u2500' # 0x80 -> BOX DRAWINGS LIGHT HORIZONTAL + '\u2502' # 0x81 -> BOX DRAWINGS LIGHT VERTICAL + '\u250c' # 0x82 -> BOX DRAWINGS LIGHT DOWN AND RIGHT + '\u2510' # 0x83 -> BOX DRAWINGS LIGHT DOWN AND LEFT + '\u2514' # 0x84 -> BOX DRAWINGS LIGHT UP AND RIGHT + '\u2518' # 0x85 -> BOX DRAWINGS LIGHT UP AND LEFT + '\u251c' # 0x86 -> BOX DRAWINGS LIGHT VERTICAL AND RIGHT + '\u2524' # 0x87 -> BOX DRAWINGS LIGHT VERTICAL AND LEFT + '\u252c' # 0x88 -> BOX DRAWINGS LIGHT DOWN AND HORIZONTAL + '\u2534' # 0x89 -> BOX DRAWINGS LIGHT UP AND HORIZONTAL + '\u253c' # 0x8A -> BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL + '\u2580' # 0x8B -> UPPER HALF BLOCK + '\u2584' # 0x8C -> LOWER HALF BLOCK + '\u2588' # 0x8D -> FULL BLOCK + '\u258c' # 0x8E -> LEFT HALF BLOCK + '\u2590' # 0x8F -> RIGHT HALF BLOCK + '\u2591' # 0x90 -> LIGHT SHADE + '\u2592' # 0x91 -> MEDIUM SHADE + '\u2593' # 0x92 -> DARK SHADE + '\u2320' # 0x93 -> TOP HALF INTEGRAL + '\u25a0' # 0x94 -> BLACK SQUARE + '\u2219' # 0x95 -> BULLET OPERATOR + '\u221a' # 0x96 -> SQUARE ROOT + '\u2248' # 0x97 -> ALMOST EQUAL TO + '\u2264' # 0x98 -> LESS-THAN OR EQUAL TO + '\u2265' # 0x99 -> GREATER-THAN OR EQUAL TO + '\xa0' # 0x9A -> NO-BREAK SPACE + '\u2321' # 0x9B -> BOTTOM HALF INTEGRAL + '\xb0' # 0x9C -> DEGREE SIGN + '\xb2' # 0x9D -> SUPERSCRIPT TWO + '\xb7' # 0x9E -> MIDDLE DOT + '\xf7' # 0x9F -> DIVISION SIGN + '\u2550' # 0xA0 -> BOX DRAWINGS DOUBLE HORIZONTAL + '\u2551' # 0xA1 -> BOX DRAWINGS DOUBLE VERTICAL + '\u2552' # 0xA2 -> BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE + '\u0451' # 0xA3 -> CYRILLIC SMALL LETTER IO + '\u0454' # 0xA4 -> CYRILLIC SMALL LETTER UKRAINIAN IE + '\u2554' # 0xA5 -> BOX DRAWINGS DOUBLE DOWN AND RIGHT + '\u0456' # 0xA6 -> CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I + '\u0457' # 0xA7 -> CYRILLIC SMALL LETTER YI (UKRAINIAN) + '\u2557' # 0xA8 -> BOX DRAWINGS DOUBLE DOWN AND LEFT + '\u2558' # 0xA9 -> BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE + '\u2559' # 0xAA -> BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE + '\u255a' # 0xAB -> BOX DRAWINGS DOUBLE UP AND RIGHT + '\u255b' # 0xAC -> BOX DRAWINGS UP SINGLE AND LEFT DOUBLE + '\u0491' # 0xAD -> CYRILLIC SMALL LETTER UKRAINIAN GHE WITH UPTURN + '\u255d' # 0xAE -> BOX DRAWINGS DOUBLE UP AND LEFT + '\u255e' # 0xAF -> BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE + '\u255f' # 0xB0 -> BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE + '\u2560' # 0xB1 -> BOX DRAWINGS DOUBLE VERTICAL AND RIGHT + '\u2561' # 0xB2 -> BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE + '\u0401' # 0xB3 -> CYRILLIC CAPITAL LETTER IO + '\u0404' # 0xB4 -> CYRILLIC CAPITAL LETTER UKRAINIAN IE + '\u2563' # 0xB5 -> BOX DRAWINGS DOUBLE VERTICAL AND LEFT + '\u0406' # 0xB6 -> CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I + '\u0407' # 0xB7 -> CYRILLIC CAPITAL LETTER YI (UKRAINIAN) + '\u2566' # 0xB8 -> BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL + '\u2567' # 0xB9 -> BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE + '\u2568' # 0xBA -> BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE + '\u2569' # 0xBB -> BOX DRAWINGS DOUBLE UP AND HORIZONTAL + '\u256a' # 0xBC -> BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE + '\u0490' # 0xBD -> CYRILLIC CAPITAL LETTER UKRAINIAN GHE WITH UPTURN + '\u256c' # 0xBE -> BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL + '\xa9' # 0xBF -> COPYRIGHT SIGN + '\u044e' # 0xC0 -> CYRILLIC SMALL LETTER YU + '\u0430' # 0xC1 -> CYRILLIC SMALL LETTER A + '\u0431' # 0xC2 -> CYRILLIC SMALL LETTER BE + '\u0446' # 0xC3 -> CYRILLIC SMALL LETTER TSE + '\u0434' # 0xC4 -> CYRILLIC SMALL LETTER DE + '\u0435' # 0xC5 -> CYRILLIC SMALL LETTER IE + '\u0444' # 0xC6 -> CYRILLIC SMALL LETTER EF + '\u0433' # 0xC7 -> CYRILLIC SMALL LETTER GHE + '\u0445' # 0xC8 -> CYRILLIC SMALL LETTER HA + '\u0438' # 0xC9 -> CYRILLIC SMALL LETTER I + '\u0439' # 0xCA -> CYRILLIC SMALL LETTER SHORT I + '\u043a' # 0xCB -> CYRILLIC SMALL LETTER KA + '\u043b' # 0xCC -> CYRILLIC SMALL LETTER EL + '\u043c' # 0xCD -> CYRILLIC SMALL LETTER EM + '\u043d' # 0xCE -> CYRILLIC SMALL LETTER EN + '\u043e' # 0xCF -> CYRILLIC SMALL LETTER O + '\u043f' # 0xD0 -> CYRILLIC SMALL LETTER PE + '\u044f' # 0xD1 -> CYRILLIC SMALL LETTER YA + '\u0440' # 0xD2 -> CYRILLIC SMALL LETTER ER + '\u0441' # 0xD3 -> CYRILLIC SMALL LETTER ES + '\u0442' # 0xD4 -> CYRILLIC SMALL LETTER TE + '\u0443' # 0xD5 -> CYRILLIC SMALL LETTER U + '\u0436' # 0xD6 -> CYRILLIC SMALL LETTER ZHE + '\u0432' # 0xD7 -> CYRILLIC SMALL LETTER VE + '\u044c' # 0xD8 -> CYRILLIC SMALL LETTER SOFT SIGN + '\u044b' # 0xD9 -> CYRILLIC SMALL LETTER YERU + '\u0437' # 0xDA -> CYRILLIC SMALL LETTER ZE + '\u0448' # 0xDB -> CYRILLIC SMALL LETTER SHA + '\u044d' # 0xDC -> CYRILLIC SMALL LETTER E + '\u0449' # 0xDD -> CYRILLIC SMALL LETTER SHCHA + '\u0447' # 0xDE -> CYRILLIC SMALL LETTER CHE + '\u044a' # 0xDF -> CYRILLIC SMALL LETTER HARD SIGN + '\u042e' # 0xE0 -> CYRILLIC CAPITAL LETTER YU + '\u0410' # 0xE1 -> CYRILLIC CAPITAL LETTER A + '\u0411' # 0xE2 -> CYRILLIC CAPITAL LETTER BE + '\u0426' # 0xE3 -> CYRILLIC CAPITAL LETTER TSE + '\u0414' # 0xE4 -> CYRILLIC CAPITAL LETTER DE + '\u0415' # 0xE5 -> CYRILLIC CAPITAL LETTER IE + '\u0424' # 0xE6 -> CYRILLIC CAPITAL LETTER EF + '\u0413' # 0xE7 -> CYRILLIC CAPITAL LETTER GHE + '\u0425' # 0xE8 -> CYRILLIC CAPITAL LETTER HA + '\u0418' # 0xE9 -> CYRILLIC CAPITAL LETTER I + '\u0419' # 0xEA -> CYRILLIC CAPITAL LETTER SHORT I + '\u041a' # 0xEB -> CYRILLIC CAPITAL LETTER KA + '\u041b' # 0xEC -> CYRILLIC CAPITAL LETTER EL + '\u041c' # 0xED -> CYRILLIC CAPITAL LETTER EM + '\u041d' # 0xEE -> CYRILLIC CAPITAL LETTER EN + '\u041e' # 0xEF -> CYRILLIC CAPITAL LETTER O + '\u041f' # 0xF0 -> CYRILLIC CAPITAL LETTER PE + '\u042f' # 0xF1 -> CYRILLIC CAPITAL LETTER YA + '\u0420' # 0xF2 -> CYRILLIC CAPITAL LETTER ER + '\u0421' # 0xF3 -> CYRILLIC CAPITAL LETTER ES + '\u0422' # 0xF4 -> CYRILLIC CAPITAL LETTER TE + '\u0423' # 0xF5 -> CYRILLIC CAPITAL LETTER U + '\u0416' # 0xF6 -> CYRILLIC CAPITAL LETTER ZHE + '\u0412' # 0xF7 -> CYRILLIC CAPITAL LETTER VE + '\u042c' # 0xF8 -> CYRILLIC CAPITAL LETTER SOFT SIGN + '\u042b' # 0xF9 -> CYRILLIC CAPITAL LETTER YERU + '\u0417' # 0xFA -> CYRILLIC CAPITAL LETTER ZE + '\u0428' # 0xFB -> CYRILLIC CAPITAL LETTER SHA + '\u042d' # 0xFC -> CYRILLIC CAPITAL LETTER E + '\u0429' # 0xFD -> CYRILLIC CAPITAL LETTER SHCHA + '\u0427' # 0xFE -> CYRILLIC CAPITAL LETTER CHE + '\u042a' # 0xFF -> CYRILLIC CAPITAL LETTER HARD SIGN +) + +### Encoding table +encoding_table=codecs.charmap_build(decoding_table) diff --git a/env/Lib/encodings/kz1048.py b/env/Lib/encodings/kz1048.py new file mode 100644 index 0000000..712aee6 --- /dev/null +++ b/env/Lib/encodings/kz1048.py @@ -0,0 +1,307 @@ +""" Python Character Mapping Codec kz1048 generated from 'MAPPINGS/VENDORS/MISC/KZ1048.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='kz1048', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) + + +### Decoding Table + +decoding_table = ( + '\x00' # 0x00 -> NULL + '\x01' # 0x01 -> START OF HEADING + '\x02' # 0x02 -> START OF TEXT + '\x03' # 0x03 -> END OF TEXT + '\x04' # 0x04 -> END OF TRANSMISSION + '\x05' # 0x05 -> ENQUIRY + '\x06' # 0x06 -> ACKNOWLEDGE + '\x07' # 0x07 -> BELL + '\x08' # 0x08 -> BACKSPACE + '\t' # 0x09 -> HORIZONTAL TABULATION + '\n' # 0x0A -> LINE FEED + '\x0b' # 0x0B -> VERTICAL TABULATION + '\x0c' # 0x0C -> FORM FEED + '\r' # 0x0D -> CARRIAGE RETURN + '\x0e' # 0x0E -> SHIFT OUT + '\x0f' # 0x0F -> SHIFT IN + '\x10' # 0x10 -> DATA LINK ESCAPE + '\x11' # 0x11 -> DEVICE CONTROL ONE + '\x12' # 0x12 -> DEVICE CONTROL TWO + '\x13' # 0x13 -> DEVICE CONTROL THREE + '\x14' # 0x14 -> DEVICE CONTROL FOUR + '\x15' # 0x15 -> NEGATIVE ACKNOWLEDGE + '\x16' # 0x16 -> SYNCHRONOUS IDLE + '\x17' # 0x17 -> END OF TRANSMISSION BLOCK + '\x18' # 0x18 -> CANCEL + '\x19' # 0x19 -> END OF MEDIUM + '\x1a' # 0x1A -> SUBSTITUTE + '\x1b' # 0x1B -> ESCAPE + '\x1c' # 0x1C -> FILE SEPARATOR + '\x1d' # 0x1D -> GROUP SEPARATOR + '\x1e' # 0x1E -> RECORD SEPARATOR + '\x1f' # 0x1F -> UNIT SEPARATOR + ' ' # 0x20 -> SPACE + '!' # 0x21 -> EXCLAMATION MARK + '"' # 0x22 -> QUOTATION MARK + '#' # 0x23 -> NUMBER SIGN + '$' # 0x24 -> DOLLAR SIGN + '%' # 0x25 -> PERCENT SIGN + '&' # 0x26 -> AMPERSAND + "'" # 0x27 -> APOSTROPHE + '(' # 0x28 -> LEFT PARENTHESIS + ')' # 0x29 -> RIGHT PARENTHESIS + '*' # 0x2A -> ASTERISK + '+' # 0x2B -> PLUS SIGN + ',' # 0x2C -> COMMA + '-' # 0x2D -> HYPHEN-MINUS + '.' # 0x2E -> FULL STOP + '/' # 0x2F -> SOLIDUS + '0' # 0x30 -> DIGIT ZERO + '1' # 0x31 -> DIGIT ONE + '2' # 0x32 -> DIGIT TWO + '3' # 0x33 -> DIGIT THREE + '4' # 0x34 -> DIGIT FOUR + '5' # 0x35 -> DIGIT FIVE + '6' # 0x36 -> DIGIT SIX + '7' # 0x37 -> DIGIT SEVEN + '8' # 0x38 -> DIGIT EIGHT + '9' # 0x39 -> DIGIT NINE + ':' # 0x3A -> COLON + ';' # 0x3B -> SEMICOLON + '<' # 0x3C -> LESS-THAN SIGN + '=' # 0x3D -> EQUALS SIGN + '>' # 0x3E -> GREATER-THAN SIGN + '?' # 0x3F -> QUESTION MARK + '@' # 0x40 -> COMMERCIAL AT + 'A' # 0x41 -> LATIN CAPITAL LETTER A + 'B' # 0x42 -> LATIN CAPITAL LETTER B + 'C' # 0x43 -> LATIN CAPITAL LETTER C + 'D' # 0x44 -> LATIN CAPITAL LETTER D + 'E' # 0x45 -> LATIN CAPITAL LETTER E + 'F' # 0x46 -> LATIN CAPITAL LETTER F + 'G' # 0x47 -> LATIN CAPITAL LETTER G + 'H' # 0x48 -> LATIN CAPITAL LETTER H + 'I' # 0x49 -> LATIN CAPITAL LETTER I + 'J' # 0x4A -> LATIN CAPITAL LETTER J + 'K' # 0x4B -> LATIN CAPITAL LETTER K + 'L' # 0x4C -> LATIN CAPITAL LETTER L + 'M' # 0x4D -> LATIN CAPITAL LETTER M + 'N' # 0x4E -> LATIN CAPITAL LETTER N + 'O' # 0x4F -> LATIN CAPITAL LETTER O + 'P' # 0x50 -> LATIN CAPITAL LETTER P + 'Q' # 0x51 -> LATIN CAPITAL LETTER Q + 'R' # 0x52 -> LATIN CAPITAL LETTER R + 'S' # 0x53 -> LATIN CAPITAL LETTER S + 'T' # 0x54 -> LATIN CAPITAL LETTER T + 'U' # 0x55 -> LATIN CAPITAL LETTER U + 'V' # 0x56 -> LATIN CAPITAL LETTER V + 'W' # 0x57 -> LATIN CAPITAL LETTER W + 'X' # 0x58 -> LATIN CAPITAL LETTER X + 'Y' # 0x59 -> LATIN CAPITAL LETTER Y + 'Z' # 0x5A -> LATIN CAPITAL LETTER Z + '[' # 0x5B -> LEFT SQUARE BRACKET + '\\' # 0x5C -> REVERSE SOLIDUS + ']' # 0x5D -> RIGHT SQUARE BRACKET + '^' # 0x5E -> CIRCUMFLEX ACCENT + '_' # 0x5F -> LOW LINE + '`' # 0x60 -> GRAVE ACCENT + 'a' # 0x61 -> LATIN SMALL LETTER A + 'b' # 0x62 -> LATIN SMALL LETTER B + 'c' # 0x63 -> LATIN SMALL LETTER C + 'd' # 0x64 -> LATIN SMALL LETTER D + 'e' # 0x65 -> LATIN SMALL LETTER E + 'f' # 0x66 -> LATIN SMALL LETTER F + 'g' # 0x67 -> LATIN SMALL LETTER G + 'h' # 0x68 -> LATIN SMALL LETTER H + 'i' # 0x69 -> LATIN SMALL LETTER I + 'j' # 0x6A -> LATIN SMALL LETTER J + 'k' # 0x6B -> LATIN SMALL LETTER K + 'l' # 0x6C -> LATIN SMALL LETTER L + 'm' # 0x6D -> LATIN SMALL LETTER M + 'n' # 0x6E -> LATIN SMALL LETTER N + 'o' # 0x6F -> LATIN SMALL LETTER O + 'p' # 0x70 -> LATIN SMALL LETTER P + 'q' # 0x71 -> LATIN SMALL LETTER Q + 'r' # 0x72 -> LATIN SMALL LETTER R + 's' # 0x73 -> LATIN SMALL LETTER S + 't' # 0x74 -> LATIN SMALL LETTER T + 'u' # 0x75 -> LATIN SMALL LETTER U + 'v' # 0x76 -> LATIN SMALL LETTER V + 'w' # 0x77 -> LATIN SMALL LETTER W + 'x' # 0x78 -> LATIN SMALL LETTER X + 'y' # 0x79 -> LATIN SMALL LETTER Y + 'z' # 0x7A -> LATIN SMALL LETTER Z + '{' # 0x7B -> LEFT CURLY BRACKET + '|' # 0x7C -> VERTICAL LINE + '}' # 0x7D -> RIGHT CURLY BRACKET + '~' # 0x7E -> TILDE + '\x7f' # 0x7F -> DELETE + '\u0402' # 0x80 -> CYRILLIC CAPITAL LETTER DJE + '\u0403' # 0x81 -> CYRILLIC CAPITAL LETTER GJE + '\u201a' # 0x82 -> SINGLE LOW-9 QUOTATION MARK + '\u0453' # 0x83 -> CYRILLIC SMALL LETTER GJE + '\u201e' # 0x84 -> DOUBLE LOW-9 QUOTATION MARK + '\u2026' # 0x85 -> HORIZONTAL ELLIPSIS + '\u2020' # 0x86 -> DAGGER + '\u2021' # 0x87 -> DOUBLE DAGGER + '\u20ac' # 0x88 -> EURO SIGN + '\u2030' # 0x89 -> PER MILLE SIGN + '\u0409' # 0x8A -> CYRILLIC CAPITAL LETTER LJE + '\u2039' # 0x8B -> SINGLE LEFT-POINTING ANGLE QUOTATION MARK + '\u040a' # 0x8C -> CYRILLIC CAPITAL LETTER NJE + '\u049a' # 0x8D -> CYRILLIC CAPITAL LETTER KA WITH DESCENDER + '\u04ba' # 0x8E -> CYRILLIC CAPITAL LETTER SHHA + '\u040f' # 0x8F -> CYRILLIC CAPITAL LETTER DZHE + '\u0452' # 0x90 -> CYRILLIC SMALL LETTER DJE + '\u2018' # 0x91 -> LEFT SINGLE QUOTATION MARK + '\u2019' # 0x92 -> RIGHT SINGLE QUOTATION MARK + '\u201c' # 0x93 -> LEFT DOUBLE QUOTATION MARK + '\u201d' # 0x94 -> RIGHT DOUBLE QUOTATION MARK + '\u2022' # 0x95 -> BULLET + '\u2013' # 0x96 -> EN DASH + '\u2014' # 0x97 -> EM DASH + '\ufffe' # 0x98 -> UNDEFINED + '\u2122' # 0x99 -> TRADE MARK SIGN + '\u0459' # 0x9A -> CYRILLIC SMALL LETTER LJE + '\u203a' # 0x9B -> SINGLE RIGHT-POINTING ANGLE QUOTATION MARK + '\u045a' # 0x9C -> CYRILLIC SMALL LETTER NJE + '\u049b' # 0x9D -> CYRILLIC SMALL LETTER KA WITH DESCENDER + '\u04bb' # 0x9E -> CYRILLIC SMALL LETTER SHHA + '\u045f' # 0x9F -> CYRILLIC SMALL LETTER DZHE + '\xa0' # 0xA0 -> NO-BREAK SPACE + '\u04b0' # 0xA1 -> CYRILLIC CAPITAL LETTER STRAIGHT U WITH STROKE + '\u04b1' # 0xA2 -> CYRILLIC SMALL LETTER STRAIGHT U WITH STROKE + '\u04d8' # 0xA3 -> CYRILLIC CAPITAL LETTER SCHWA + '\xa4' # 0xA4 -> CURRENCY SIGN + '\u04e8' # 0xA5 -> CYRILLIC CAPITAL LETTER BARRED O + '\xa6' # 0xA6 -> BROKEN BAR + '\xa7' # 0xA7 -> SECTION SIGN + '\u0401' # 0xA8 -> CYRILLIC CAPITAL LETTER IO + '\xa9' # 0xA9 -> COPYRIGHT SIGN + '\u0492' # 0xAA -> CYRILLIC CAPITAL LETTER GHE WITH STROKE + '\xab' # 0xAB -> LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + '\xac' # 0xAC -> NOT SIGN + '\xad' # 0xAD -> SOFT HYPHEN + '\xae' # 0xAE -> REGISTERED SIGN + '\u04ae' # 0xAF -> CYRILLIC CAPITAL LETTER STRAIGHT U + '\xb0' # 0xB0 -> DEGREE SIGN + '\xb1' # 0xB1 -> PLUS-MINUS SIGN + '\u0406' # 0xB2 -> CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I + '\u0456' # 0xB3 -> CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I + '\u04e9' # 0xB4 -> CYRILLIC SMALL LETTER BARRED O + '\xb5' # 0xB5 -> MICRO SIGN + '\xb6' # 0xB6 -> PILCROW SIGN + '\xb7' # 0xB7 -> MIDDLE DOT + '\u0451' # 0xB8 -> CYRILLIC SMALL LETTER IO + '\u2116' # 0xB9 -> NUMERO SIGN + '\u0493' # 0xBA -> CYRILLIC SMALL LETTER GHE WITH STROKE + '\xbb' # 0xBB -> RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + '\u04d9' # 0xBC -> CYRILLIC SMALL LETTER SCHWA + '\u04a2' # 0xBD -> CYRILLIC CAPITAL LETTER EN WITH DESCENDER + '\u04a3' # 0xBE -> CYRILLIC SMALL LETTER EN WITH DESCENDER + '\u04af' # 0xBF -> CYRILLIC SMALL LETTER STRAIGHT U + '\u0410' # 0xC0 -> CYRILLIC CAPITAL LETTER A + '\u0411' # 0xC1 -> CYRILLIC CAPITAL LETTER BE + '\u0412' # 0xC2 -> CYRILLIC CAPITAL LETTER VE + '\u0413' # 0xC3 -> CYRILLIC CAPITAL LETTER GHE + '\u0414' # 0xC4 -> CYRILLIC CAPITAL LETTER DE + '\u0415' # 0xC5 -> CYRILLIC CAPITAL LETTER IE + '\u0416' # 0xC6 -> CYRILLIC CAPITAL LETTER ZHE + '\u0417' # 0xC7 -> CYRILLIC CAPITAL LETTER ZE + '\u0418' # 0xC8 -> CYRILLIC CAPITAL LETTER I + '\u0419' # 0xC9 -> CYRILLIC CAPITAL LETTER SHORT I + '\u041a' # 0xCA -> CYRILLIC CAPITAL LETTER KA + '\u041b' # 0xCB -> CYRILLIC CAPITAL LETTER EL + '\u041c' # 0xCC -> CYRILLIC CAPITAL LETTER EM + '\u041d' # 0xCD -> CYRILLIC CAPITAL LETTER EN + '\u041e' # 0xCE -> CYRILLIC CAPITAL LETTER O + '\u041f' # 0xCF -> CYRILLIC CAPITAL LETTER PE + '\u0420' # 0xD0 -> CYRILLIC CAPITAL LETTER ER + '\u0421' # 0xD1 -> CYRILLIC CAPITAL LETTER ES + '\u0422' # 0xD2 -> CYRILLIC CAPITAL LETTER TE + '\u0423' # 0xD3 -> CYRILLIC CAPITAL LETTER U + '\u0424' # 0xD4 -> CYRILLIC CAPITAL LETTER EF + '\u0425' # 0xD5 -> CYRILLIC CAPITAL LETTER HA + '\u0426' # 0xD6 -> CYRILLIC CAPITAL LETTER TSE + '\u0427' # 0xD7 -> CYRILLIC CAPITAL LETTER CHE + '\u0428' # 0xD8 -> CYRILLIC CAPITAL LETTER SHA + '\u0429' # 0xD9 -> CYRILLIC CAPITAL LETTER SHCHA + '\u042a' # 0xDA -> CYRILLIC CAPITAL LETTER HARD SIGN + '\u042b' # 0xDB -> CYRILLIC CAPITAL LETTER YERU + '\u042c' # 0xDC -> CYRILLIC CAPITAL LETTER SOFT SIGN + '\u042d' # 0xDD -> CYRILLIC CAPITAL LETTER E + '\u042e' # 0xDE -> CYRILLIC CAPITAL LETTER YU + '\u042f' # 0xDF -> CYRILLIC CAPITAL LETTER YA + '\u0430' # 0xE0 -> CYRILLIC SMALL LETTER A + '\u0431' # 0xE1 -> CYRILLIC SMALL LETTER BE + '\u0432' # 0xE2 -> CYRILLIC SMALL LETTER VE + '\u0433' # 0xE3 -> CYRILLIC SMALL LETTER GHE + '\u0434' # 0xE4 -> CYRILLIC SMALL LETTER DE + '\u0435' # 0xE5 -> CYRILLIC SMALL LETTER IE + '\u0436' # 0xE6 -> CYRILLIC SMALL LETTER ZHE + '\u0437' # 0xE7 -> CYRILLIC SMALL LETTER ZE + '\u0438' # 0xE8 -> CYRILLIC SMALL LETTER I + '\u0439' # 0xE9 -> CYRILLIC SMALL LETTER SHORT I + '\u043a' # 0xEA -> CYRILLIC SMALL LETTER KA + '\u043b' # 0xEB -> CYRILLIC SMALL LETTER EL + '\u043c' # 0xEC -> CYRILLIC SMALL LETTER EM + '\u043d' # 0xED -> CYRILLIC SMALL LETTER EN + '\u043e' # 0xEE -> CYRILLIC SMALL LETTER O + '\u043f' # 0xEF -> CYRILLIC SMALL LETTER PE + '\u0440' # 0xF0 -> CYRILLIC SMALL LETTER ER + '\u0441' # 0xF1 -> CYRILLIC SMALL LETTER ES + '\u0442' # 0xF2 -> CYRILLIC SMALL LETTER TE + '\u0443' # 0xF3 -> CYRILLIC SMALL LETTER U + '\u0444' # 0xF4 -> CYRILLIC SMALL LETTER EF + '\u0445' # 0xF5 -> CYRILLIC SMALL LETTER HA + '\u0446' # 0xF6 -> CYRILLIC SMALL LETTER TSE + '\u0447' # 0xF7 -> CYRILLIC SMALL LETTER CHE + '\u0448' # 0xF8 -> CYRILLIC SMALL LETTER SHA + '\u0449' # 0xF9 -> CYRILLIC SMALL LETTER SHCHA + '\u044a' # 0xFA -> CYRILLIC SMALL LETTER HARD SIGN + '\u044b' # 0xFB -> CYRILLIC SMALL LETTER YERU + '\u044c' # 0xFC -> CYRILLIC SMALL LETTER SOFT SIGN + '\u044d' # 0xFD -> CYRILLIC SMALL LETTER E + '\u044e' # 0xFE -> CYRILLIC SMALL LETTER YU + '\u044f' # 0xFF -> CYRILLIC SMALL LETTER YA +) + +### Encoding table +encoding_table = codecs.charmap_build(decoding_table) diff --git a/env/Lib/encodings/latin_1.py b/env/Lib/encodings/latin_1.py new file mode 100644 index 0000000..370160c --- /dev/null +++ b/env/Lib/encodings/latin_1.py @@ -0,0 +1,50 @@ +""" Python 'latin-1' 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.latin_1_encode + decode = codecs.latin_1_decode + +class IncrementalEncoder(codecs.IncrementalEncoder): + def encode(self, input, final=False): + return codecs.latin_1_encode(input,self.errors)[0] + +class IncrementalDecoder(codecs.IncrementalDecoder): + def decode(self, input, final=False): + return codecs.latin_1_decode(input,self.errors)[0] + +class StreamWriter(Codec,codecs.StreamWriter): + pass + +class StreamReader(Codec,codecs.StreamReader): + pass + +class StreamConverter(StreamWriter,StreamReader): + + encode = codecs.latin_1_decode + decode = codecs.latin_1_encode + +### encodings module API + +def getregentry(): + return codecs.CodecInfo( + name='iso8859-1', + encode=Codec.encode, + decode=Codec.decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) diff --git a/env/Lib/encodings/mac_arabic.py b/env/Lib/encodings/mac_arabic.py new file mode 100644 index 0000000..72847e8 --- /dev/null +++ b/env/Lib/encodings/mac_arabic.py @@ -0,0 +1,698 @@ +""" Python Character Mapping Codec generated from 'VENDORS/APPLE/ARABIC.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_map) + + 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_map)[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-arabic', + 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: 0x00c4, # LATIN CAPITAL LETTER A WITH DIAERESIS + 0x0081: 0x00a0, # NO-BREAK SPACE, right-left + 0x0082: 0x00c7, # LATIN CAPITAL LETTER C WITH CEDILLA + 0x0083: 0x00c9, # LATIN CAPITAL LETTER E WITH ACUTE + 0x0084: 0x00d1, # LATIN CAPITAL LETTER N WITH TILDE + 0x0085: 0x00d6, # LATIN CAPITAL LETTER O WITH DIAERESIS + 0x0086: 0x00dc, # LATIN CAPITAL LETTER U WITH DIAERESIS + 0x0087: 0x00e1, # LATIN SMALL LETTER A WITH ACUTE + 0x0088: 0x00e0, # LATIN SMALL LETTER A WITH GRAVE + 0x0089: 0x00e2, # LATIN SMALL LETTER A WITH CIRCUMFLEX + 0x008a: 0x00e4, # LATIN SMALL LETTER A WITH DIAERESIS + 0x008b: 0x06ba, # ARABIC LETTER NOON GHUNNA + 0x008c: 0x00ab, # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK, right-left + 0x008d: 0x00e7, # LATIN SMALL LETTER C WITH CEDILLA + 0x008e: 0x00e9, # LATIN SMALL LETTER E WITH ACUTE + 0x008f: 0x00e8, # LATIN SMALL LETTER E WITH GRAVE + 0x0090: 0x00ea, # LATIN SMALL LETTER E WITH CIRCUMFLEX + 0x0091: 0x00eb, # LATIN SMALL LETTER E WITH DIAERESIS + 0x0092: 0x00ed, # LATIN SMALL LETTER I WITH ACUTE + 0x0093: 0x2026, # HORIZONTAL ELLIPSIS, right-left + 0x0094: 0x00ee, # LATIN SMALL LETTER I WITH CIRCUMFLEX + 0x0095: 0x00ef, # LATIN SMALL LETTER I WITH DIAERESIS + 0x0096: 0x00f1, # LATIN SMALL LETTER N WITH TILDE + 0x0097: 0x00f3, # LATIN SMALL LETTER O WITH ACUTE + 0x0098: 0x00bb, # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK, right-left + 0x0099: 0x00f4, # LATIN SMALL LETTER O WITH CIRCUMFLEX + 0x009a: 0x00f6, # LATIN SMALL LETTER O WITH DIAERESIS + 0x009b: 0x00f7, # DIVISION SIGN, right-left + 0x009c: 0x00fa, # LATIN SMALL LETTER U WITH ACUTE + 0x009d: 0x00f9, # LATIN SMALL LETTER U WITH GRAVE + 0x009e: 0x00fb, # LATIN SMALL LETTER U WITH CIRCUMFLEX + 0x009f: 0x00fc, # LATIN SMALL LETTER U WITH DIAERESIS + 0x00a0: 0x0020, # SPACE, right-left + 0x00a1: 0x0021, # EXCLAMATION MARK, right-left + 0x00a2: 0x0022, # QUOTATION MARK, right-left + 0x00a3: 0x0023, # NUMBER SIGN, right-left + 0x00a4: 0x0024, # DOLLAR SIGN, right-left + 0x00a5: 0x066a, # ARABIC PERCENT SIGN + 0x00a6: 0x0026, # AMPERSAND, right-left + 0x00a7: 0x0027, # APOSTROPHE, right-left + 0x00a8: 0x0028, # LEFT PARENTHESIS, right-left + 0x00a9: 0x0029, # RIGHT PARENTHESIS, right-left + 0x00aa: 0x002a, # ASTERISK, right-left + 0x00ab: 0x002b, # PLUS SIGN, right-left + 0x00ac: 0x060c, # ARABIC COMMA + 0x00ad: 0x002d, # HYPHEN-MINUS, right-left + 0x00ae: 0x002e, # FULL STOP, right-left + 0x00af: 0x002f, # SOLIDUS, right-left + 0x00b0: 0x0660, # ARABIC-INDIC DIGIT ZERO, right-left (need override) + 0x00b1: 0x0661, # ARABIC-INDIC DIGIT ONE, right-left (need override) + 0x00b2: 0x0662, # ARABIC-INDIC DIGIT TWO, right-left (need override) + 0x00b3: 0x0663, # ARABIC-INDIC DIGIT THREE, right-left (need override) + 0x00b4: 0x0664, # ARABIC-INDIC DIGIT FOUR, right-left (need override) + 0x00b5: 0x0665, # ARABIC-INDIC DIGIT FIVE, right-left (need override) + 0x00b6: 0x0666, # ARABIC-INDIC DIGIT SIX, right-left (need override) + 0x00b7: 0x0667, # ARABIC-INDIC DIGIT SEVEN, right-left (need override) + 0x00b8: 0x0668, # ARABIC-INDIC DIGIT EIGHT, right-left (need override) + 0x00b9: 0x0669, # ARABIC-INDIC DIGIT NINE, right-left (need override) + 0x00ba: 0x003a, # COLON, right-left + 0x00bb: 0x061b, # ARABIC SEMICOLON + 0x00bc: 0x003c, # LESS-THAN SIGN, right-left + 0x00bd: 0x003d, # EQUALS SIGN, right-left + 0x00be: 0x003e, # GREATER-THAN SIGN, right-left + 0x00bf: 0x061f, # ARABIC QUESTION MARK + 0x00c0: 0x274a, # EIGHT TEARDROP-SPOKED PROPELLER ASTERISK, right-left + 0x00c1: 0x0621, # ARABIC LETTER HAMZA + 0x00c2: 0x0622, # ARABIC LETTER ALEF WITH MADDA ABOVE + 0x00c3: 0x0623, # ARABIC LETTER ALEF WITH HAMZA ABOVE + 0x00c4: 0x0624, # ARABIC LETTER WAW WITH HAMZA ABOVE + 0x00c5: 0x0625, # ARABIC LETTER ALEF WITH HAMZA BELOW + 0x00c6: 0x0626, # ARABIC LETTER YEH WITH HAMZA ABOVE + 0x00c7: 0x0627, # ARABIC LETTER ALEF + 0x00c8: 0x0628, # ARABIC LETTER BEH + 0x00c9: 0x0629, # ARABIC LETTER TEH MARBUTA + 0x00ca: 0x062a, # ARABIC LETTER TEH + 0x00cb: 0x062b, # ARABIC LETTER THEH + 0x00cc: 0x062c, # ARABIC LETTER JEEM + 0x00cd: 0x062d, # ARABIC LETTER HAH + 0x00ce: 0x062e, # ARABIC LETTER KHAH + 0x00cf: 0x062f, # ARABIC LETTER DAL + 0x00d0: 0x0630, # ARABIC LETTER THAL + 0x00d1: 0x0631, # ARABIC LETTER REH + 0x00d2: 0x0632, # ARABIC LETTER ZAIN + 0x00d3: 0x0633, # ARABIC LETTER SEEN + 0x00d4: 0x0634, # ARABIC LETTER SHEEN + 0x00d5: 0x0635, # ARABIC LETTER SAD + 0x00d6: 0x0636, # ARABIC LETTER DAD + 0x00d7: 0x0637, # ARABIC LETTER TAH + 0x00d8: 0x0638, # ARABIC LETTER ZAH + 0x00d9: 0x0639, # ARABIC LETTER AIN + 0x00da: 0x063a, # ARABIC LETTER GHAIN + 0x00db: 0x005b, # LEFT SQUARE BRACKET, right-left + 0x00dc: 0x005c, # REVERSE SOLIDUS, right-left + 0x00dd: 0x005d, # RIGHT SQUARE BRACKET, right-left + 0x00de: 0x005e, # CIRCUMFLEX ACCENT, right-left + 0x00df: 0x005f, # LOW LINE, right-left + 0x00e0: 0x0640, # ARABIC TATWEEL + 0x00e1: 0x0641, # ARABIC LETTER FEH + 0x00e2: 0x0642, # ARABIC LETTER QAF + 0x00e3: 0x0643, # ARABIC LETTER KAF + 0x00e4: 0x0644, # ARABIC LETTER LAM + 0x00e5: 0x0645, # ARABIC LETTER MEEM + 0x00e6: 0x0646, # ARABIC LETTER NOON + 0x00e7: 0x0647, # ARABIC LETTER HEH + 0x00e8: 0x0648, # ARABIC LETTER WAW + 0x00e9: 0x0649, # ARABIC LETTER ALEF MAKSURA + 0x00ea: 0x064a, # ARABIC LETTER YEH + 0x00eb: 0x064b, # ARABIC FATHATAN + 0x00ec: 0x064c, # ARABIC DAMMATAN + 0x00ed: 0x064d, # ARABIC KASRATAN + 0x00ee: 0x064e, # ARABIC FATHA + 0x00ef: 0x064f, # ARABIC DAMMA + 0x00f0: 0x0650, # ARABIC KASRA + 0x00f1: 0x0651, # ARABIC SHADDA + 0x00f2: 0x0652, # ARABIC SUKUN + 0x00f3: 0x067e, # ARABIC LETTER PEH + 0x00f4: 0x0679, # ARABIC LETTER TTEH + 0x00f5: 0x0686, # ARABIC LETTER TCHEH + 0x00f6: 0x06d5, # ARABIC LETTER AE + 0x00f7: 0x06a4, # ARABIC LETTER VEH + 0x00f8: 0x06af, # ARABIC LETTER GAF + 0x00f9: 0x0688, # ARABIC LETTER DDAL + 0x00fa: 0x0691, # ARABIC LETTER RREH + 0x00fb: 0x007b, # LEFT CURLY BRACKET, right-left + 0x00fc: 0x007c, # VERTICAL LINE, right-left + 0x00fd: 0x007d, # RIGHT CURLY BRACKET, right-left + 0x00fe: 0x0698, # ARABIC LETTER JEH + 0x00ff: 0x06d2, # ARABIC LETTER YEH BARREE +}) + +### Decoding Table + +decoding_table = ( + '\x00' # 0x0000 -> CONTROL CHARACTER + '\x01' # 0x0001 -> CONTROL CHARACTER + '\x02' # 0x0002 -> CONTROL CHARACTER + '\x03' # 0x0003 -> CONTROL CHARACTER + '\x04' # 0x0004 -> CONTROL CHARACTER + '\x05' # 0x0005 -> CONTROL CHARACTER + '\x06' # 0x0006 -> CONTROL CHARACTER + '\x07' # 0x0007 -> CONTROL CHARACTER + '\x08' # 0x0008 -> CONTROL CHARACTER + '\t' # 0x0009 -> CONTROL CHARACTER + '\n' # 0x000a -> CONTROL CHARACTER + '\x0b' # 0x000b -> CONTROL CHARACTER + '\x0c' # 0x000c -> CONTROL CHARACTER + '\r' # 0x000d -> CONTROL CHARACTER + '\x0e' # 0x000e -> CONTROL CHARACTER + '\x0f' # 0x000f -> CONTROL CHARACTER + '\x10' # 0x0010 -> CONTROL CHARACTER + '\x11' # 0x0011 -> CONTROL CHARACTER + '\x12' # 0x0012 -> CONTROL CHARACTER + '\x13' # 0x0013 -> CONTROL CHARACTER + '\x14' # 0x0014 -> CONTROL CHARACTER + '\x15' # 0x0015 -> CONTROL CHARACTER + '\x16' # 0x0016 -> CONTROL CHARACTER + '\x17' # 0x0017 -> CONTROL CHARACTER + '\x18' # 0x0018 -> CONTROL CHARACTER + '\x19' # 0x0019 -> CONTROL CHARACTER + '\x1a' # 0x001a -> CONTROL CHARACTER + '\x1b' # 0x001b -> CONTROL CHARACTER + '\x1c' # 0x001c -> CONTROL CHARACTER + '\x1d' # 0x001d -> CONTROL CHARACTER + '\x1e' # 0x001e -> CONTROL CHARACTER + '\x1f' # 0x001f -> CONTROL CHARACTER + ' ' # 0x0020 -> SPACE, left-right + '!' # 0x0021 -> EXCLAMATION MARK, left-right + '"' # 0x0022 -> QUOTATION MARK, left-right + '#' # 0x0023 -> NUMBER SIGN, left-right + '$' # 0x0024 -> DOLLAR SIGN, left-right + '%' # 0x0025 -> PERCENT SIGN, left-right + '&' # 0x0026 -> AMPERSAND, left-right + "'" # 0x0027 -> APOSTROPHE, left-right + '(' # 0x0028 -> LEFT PARENTHESIS, left-right + ')' # 0x0029 -> RIGHT PARENTHESIS, left-right + '*' # 0x002a -> ASTERISK, left-right + '+' # 0x002b -> PLUS SIGN, left-right + ',' # 0x002c -> COMMA, left-right; in Arabic-script context, displayed as 0x066C ARABIC THOUSANDS SEPARATOR + '-' # 0x002d -> HYPHEN-MINUS, left-right + '.' # 0x002e -> FULL STOP, left-right; in Arabic-script context, displayed as 0x066B ARABIC DECIMAL SEPARATOR + '/' # 0x002f -> SOLIDUS, left-right + '0' # 0x0030 -> DIGIT ZERO; in Arabic-script context, displayed as 0x0660 ARABIC-INDIC DIGIT ZERO + '1' # 0x0031 -> DIGIT ONE; in Arabic-script context, displayed as 0x0661 ARABIC-INDIC DIGIT ONE + '2' # 0x0032 -> DIGIT TWO; in Arabic-script context, displayed as 0x0662 ARABIC-INDIC DIGIT TWO + '3' # 0x0033 -> DIGIT THREE; in Arabic-script context, displayed as 0x0663 ARABIC-INDIC DIGIT THREE + '4' # 0x0034 -> DIGIT FOUR; in Arabic-script context, displayed as 0x0664 ARABIC-INDIC DIGIT FOUR + '5' # 0x0035 -> DIGIT FIVE; in Arabic-script context, displayed as 0x0665 ARABIC-INDIC DIGIT FIVE + '6' # 0x0036 -> DIGIT SIX; in Arabic-script context, displayed as 0x0666 ARABIC-INDIC DIGIT SIX + '7' # 0x0037 -> DIGIT SEVEN; in Arabic-script context, displayed as 0x0667 ARABIC-INDIC DIGIT SEVEN + '8' # 0x0038 -> DIGIT EIGHT; in Arabic-script context, displayed as 0x0668 ARABIC-INDIC DIGIT EIGHT + '9' # 0x0039 -> DIGIT NINE; in Arabic-script context, displayed as 0x0669 ARABIC-INDIC DIGIT NINE + ':' # 0x003a -> COLON, left-right + ';' # 0x003b -> SEMICOLON, left-right + '<' # 0x003c -> LESS-THAN SIGN, left-right + '=' # 0x003d -> EQUALS SIGN, left-right + '>' # 0x003e -> GREATER-THAN SIGN, left-right + '?' # 0x003f -> QUESTION MARK, left-right + '@' # 0x0040 -> COMMERCIAL AT + 'A' # 0x0041 -> LATIN CAPITAL LETTER A + 'B' # 0x0042 -> LATIN CAPITAL LETTER B + 'C' # 0x0043 -> LATIN CAPITAL LETTER C + 'D' # 0x0044 -> LATIN CAPITAL LETTER D + 'E' # 0x0045 -> LATIN CAPITAL LETTER E + 'F' # 0x0046 -> LATIN CAPITAL LETTER F + 'G' # 0x0047 -> LATIN CAPITAL LETTER G + 'H' # 0x0048 -> LATIN CAPITAL LETTER H + 'I' # 0x0049 -> LATIN CAPITAL LETTER I + 'J' # 0x004a -> LATIN CAPITAL LETTER J + 'K' # 0x004b -> LATIN CAPITAL LETTER K + 'L' # 0x004c -> LATIN CAPITAL LETTER L + 'M' # 0x004d -> LATIN CAPITAL LETTER M + 'N' # 0x004e -> LATIN CAPITAL LETTER N + 'O' # 0x004f -> LATIN CAPITAL LETTER O + 'P' # 0x0050 -> LATIN CAPITAL LETTER P + 'Q' # 0x0051 -> LATIN CAPITAL LETTER Q + 'R' # 0x0052 -> LATIN CAPITAL LETTER R + 'S' # 0x0053 -> LATIN CAPITAL LETTER S + 'T' # 0x0054 -> LATIN CAPITAL LETTER T + 'U' # 0x0055 -> LATIN CAPITAL LETTER U + 'V' # 0x0056 -> LATIN CAPITAL LETTER V + 'W' # 0x0057 -> LATIN CAPITAL LETTER W + 'X' # 0x0058 -> LATIN CAPITAL LETTER X + 'Y' # 0x0059 -> LATIN CAPITAL LETTER Y + 'Z' # 0x005a -> LATIN CAPITAL LETTER Z + '[' # 0x005b -> LEFT SQUARE BRACKET, left-right + '\\' # 0x005c -> REVERSE SOLIDUS, left-right + ']' # 0x005d -> RIGHT SQUARE BRACKET, left-right + '^' # 0x005e -> CIRCUMFLEX ACCENT, left-right + '_' # 0x005f -> LOW LINE, left-right + '`' # 0x0060 -> GRAVE ACCENT + 'a' # 0x0061 -> LATIN SMALL LETTER A + 'b' # 0x0062 -> LATIN SMALL LETTER B + 'c' # 0x0063 -> LATIN SMALL LETTER C + 'd' # 0x0064 -> LATIN SMALL LETTER D + 'e' # 0x0065 -> LATIN SMALL LETTER E + 'f' # 0x0066 -> LATIN SMALL LETTER F + 'g' # 0x0067 -> LATIN SMALL LETTER G + 'h' # 0x0068 -> LATIN SMALL LETTER H + 'i' # 0x0069 -> LATIN SMALL LETTER I + 'j' # 0x006a -> LATIN SMALL LETTER J + 'k' # 0x006b -> LATIN SMALL LETTER K + 'l' # 0x006c -> LATIN SMALL LETTER L + 'm' # 0x006d -> LATIN SMALL LETTER M + 'n' # 0x006e -> LATIN SMALL LETTER N + 'o' # 0x006f -> LATIN SMALL LETTER O + 'p' # 0x0070 -> LATIN SMALL LETTER P + 'q' # 0x0071 -> LATIN SMALL LETTER Q + 'r' # 0x0072 -> LATIN SMALL LETTER R + 's' # 0x0073 -> LATIN SMALL LETTER S + 't' # 0x0074 -> LATIN SMALL LETTER T + 'u' # 0x0075 -> LATIN SMALL LETTER U + 'v' # 0x0076 -> LATIN SMALL LETTER V + 'w' # 0x0077 -> LATIN SMALL LETTER W + 'x' # 0x0078 -> LATIN SMALL LETTER X + 'y' # 0x0079 -> LATIN SMALL LETTER Y + 'z' # 0x007a -> LATIN SMALL LETTER Z + '{' # 0x007b -> LEFT CURLY BRACKET, left-right + '|' # 0x007c -> VERTICAL LINE, left-right + '}' # 0x007d -> RIGHT CURLY BRACKET, left-right + '~' # 0x007e -> TILDE + '\x7f' # 0x007f -> CONTROL CHARACTER + '\xc4' # 0x0080 -> LATIN CAPITAL LETTER A WITH DIAERESIS + '\xa0' # 0x0081 -> NO-BREAK SPACE, right-left + '\xc7' # 0x0082 -> LATIN CAPITAL LETTER C WITH CEDILLA + '\xc9' # 0x0083 -> LATIN CAPITAL LETTER E WITH ACUTE + '\xd1' # 0x0084 -> LATIN CAPITAL LETTER N WITH TILDE + '\xd6' # 0x0085 -> LATIN CAPITAL LETTER O WITH DIAERESIS + '\xdc' # 0x0086 -> LATIN CAPITAL LETTER U WITH DIAERESIS + '\xe1' # 0x0087 -> LATIN SMALL LETTER A WITH ACUTE + '\xe0' # 0x0088 -> LATIN SMALL LETTER A WITH GRAVE + '\xe2' # 0x0089 -> LATIN SMALL LETTER A WITH CIRCUMFLEX + '\xe4' # 0x008a -> LATIN SMALL LETTER A WITH DIAERESIS + '\u06ba' # 0x008b -> ARABIC LETTER NOON GHUNNA + '\xab' # 0x008c -> LEFT-POINTING DOUBLE ANGLE QUOTATION MARK, right-left + '\xe7' # 0x008d -> LATIN SMALL LETTER C WITH CEDILLA + '\xe9' # 0x008e -> LATIN SMALL LETTER E WITH ACUTE + '\xe8' # 0x008f -> LATIN SMALL LETTER E WITH GRAVE + '\xea' # 0x0090 -> LATIN SMALL LETTER E WITH CIRCUMFLEX + '\xeb' # 0x0091 -> LATIN SMALL LETTER E WITH DIAERESIS + '\xed' # 0x0092 -> LATIN SMALL LETTER I WITH ACUTE + '\u2026' # 0x0093 -> HORIZONTAL ELLIPSIS, right-left + '\xee' # 0x0094 -> LATIN SMALL LETTER I WITH CIRCUMFLEX + '\xef' # 0x0095 -> LATIN SMALL LETTER I WITH DIAERESIS + '\xf1' # 0x0096 -> LATIN SMALL LETTER N WITH TILDE + '\xf3' # 0x0097 -> LATIN SMALL LETTER O WITH ACUTE + '\xbb' # 0x0098 -> RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK, right-left + '\xf4' # 0x0099 -> LATIN SMALL LETTER O WITH CIRCUMFLEX + '\xf6' # 0x009a -> LATIN SMALL LETTER O WITH DIAERESIS + '\xf7' # 0x009b -> DIVISION SIGN, right-left + '\xfa' # 0x009c -> LATIN SMALL LETTER U WITH ACUTE + '\xf9' # 0x009d -> LATIN SMALL LETTER U WITH GRAVE + '\xfb' # 0x009e -> LATIN SMALL LETTER U WITH CIRCUMFLEX + '\xfc' # 0x009f -> LATIN SMALL LETTER U WITH DIAERESIS + ' ' # 0x00a0 -> SPACE, right-left + '!' # 0x00a1 -> EXCLAMATION MARK, right-left + '"' # 0x00a2 -> QUOTATION MARK, right-left + '#' # 0x00a3 -> NUMBER SIGN, right-left + '$' # 0x00a4 -> DOLLAR SIGN, right-left + '\u066a' # 0x00a5 -> ARABIC PERCENT SIGN + '&' # 0x00a6 -> AMPERSAND, right-left + "'" # 0x00a7 -> APOSTROPHE, right-left + '(' # 0x00a8 -> LEFT PARENTHESIS, right-left + ')' # 0x00a9 -> RIGHT PARENTHESIS, right-left + '*' # 0x00aa -> ASTERISK, right-left + '+' # 0x00ab -> PLUS SIGN, right-left + '\u060c' # 0x00ac -> ARABIC COMMA + '-' # 0x00ad -> HYPHEN-MINUS, right-left + '.' # 0x00ae -> FULL STOP, right-left + '/' # 0x00af -> SOLIDUS, right-left + '\u0660' # 0x00b0 -> ARABIC-INDIC DIGIT ZERO, right-left (need override) + '\u0661' # 0x00b1 -> ARABIC-INDIC DIGIT ONE, right-left (need override) + '\u0662' # 0x00b2 -> ARABIC-INDIC DIGIT TWO, right-left (need override) + '\u0663' # 0x00b3 -> ARABIC-INDIC DIGIT THREE, right-left (need override) + '\u0664' # 0x00b4 -> ARABIC-INDIC DIGIT FOUR, right-left (need override) + '\u0665' # 0x00b5 -> ARABIC-INDIC DIGIT FIVE, right-left (need override) + '\u0666' # 0x00b6 -> ARABIC-INDIC DIGIT SIX, right-left (need override) + '\u0667' # 0x00b7 -> ARABIC-INDIC DIGIT SEVEN, right-left (need override) + '\u0668' # 0x00b8 -> ARABIC-INDIC DIGIT EIGHT, right-left (need override) + '\u0669' # 0x00b9 -> ARABIC-INDIC DIGIT NINE, right-left (need override) + ':' # 0x00ba -> COLON, right-left + '\u061b' # 0x00bb -> ARABIC SEMICOLON + '<' # 0x00bc -> LESS-THAN SIGN, right-left + '=' # 0x00bd -> EQUALS SIGN, right-left + '>' # 0x00be -> GREATER-THAN SIGN, right-left + '\u061f' # 0x00bf -> ARABIC QUESTION MARK + '\u274a' # 0x00c0 -> EIGHT TEARDROP-SPOKED PROPELLER ASTERISK, right-left + '\u0621' # 0x00c1 -> ARABIC LETTER HAMZA + '\u0622' # 0x00c2 -> ARABIC LETTER ALEF WITH MADDA ABOVE + '\u0623' # 0x00c3 -> ARABIC LETTER ALEF WITH HAMZA ABOVE + '\u0624' # 0x00c4 -> ARABIC LETTER WAW WITH HAMZA ABOVE + '\u0625' # 0x00c5 -> ARABIC LETTER ALEF WITH HAMZA BELOW + '\u0626' # 0x00c6 -> ARABIC LETTER YEH WITH HAMZA ABOVE + '\u0627' # 0x00c7 -> ARABIC LETTER ALEF + '\u0628' # 0x00c8 -> ARABIC LETTER BEH + '\u0629' # 0x00c9 -> ARABIC LETTER TEH MARBUTA + '\u062a' # 0x00ca -> ARABIC LETTER TEH + '\u062b' # 0x00cb -> ARABIC LETTER THEH + '\u062c' # 0x00cc -> ARABIC LETTER JEEM + '\u062d' # 0x00cd -> ARABIC LETTER HAH + '\u062e' # 0x00ce -> ARABIC LETTER KHAH + '\u062f' # 0x00cf -> ARABIC LETTER DAL + '\u0630' # 0x00d0 -> ARABIC LETTER THAL + '\u0631' # 0x00d1 -> ARABIC LETTER REH + '\u0632' # 0x00d2 -> ARABIC LETTER ZAIN + '\u0633' # 0x00d3 -> ARABIC LETTER SEEN + '\u0634' # 0x00d4 -> ARABIC LETTER SHEEN + '\u0635' # 0x00d5 -> ARABIC LETTER SAD + '\u0636' # 0x00d6 -> ARABIC LETTER DAD + '\u0637' # 0x00d7 -> ARABIC LETTER TAH + '\u0638' # 0x00d8 -> ARABIC LETTER ZAH + '\u0639' # 0x00d9 -> ARABIC LETTER AIN + '\u063a' # 0x00da -> ARABIC LETTER GHAIN + '[' # 0x00db -> LEFT SQUARE BRACKET, right-left + '\\' # 0x00dc -> REVERSE SOLIDUS, right-left + ']' # 0x00dd -> RIGHT SQUARE BRACKET, right-left + '^' # 0x00de -> CIRCUMFLEX ACCENT, right-left + '_' # 0x00df -> LOW LINE, right-left + '\u0640' # 0x00e0 -> ARABIC TATWEEL + '\u0641' # 0x00e1 -> ARABIC LETTER FEH + '\u0642' # 0x00e2 -> ARABIC LETTER QAF + '\u0643' # 0x00e3 -> ARABIC LETTER KAF + '\u0644' # 0x00e4 -> ARABIC LETTER LAM + '\u0645' # 0x00e5 -> ARABIC LETTER MEEM + '\u0646' # 0x00e6 -> ARABIC LETTER NOON + '\u0647' # 0x00e7 -> ARABIC LETTER HEH + '\u0648' # 0x00e8 -> ARABIC LETTER WAW + '\u0649' # 0x00e9 -> ARABIC LETTER ALEF MAKSURA + '\u064a' # 0x00ea -> ARABIC LETTER YEH + '\u064b' # 0x00eb -> ARABIC FATHATAN + '\u064c' # 0x00ec -> ARABIC DAMMATAN + '\u064d' # 0x00ed -> ARABIC KASRATAN + '\u064e' # 0x00ee -> ARABIC FATHA + '\u064f' # 0x00ef -> ARABIC DAMMA + '\u0650' # 0x00f0 -> ARABIC KASRA + '\u0651' # 0x00f1 -> ARABIC SHADDA + '\u0652' # 0x00f2 -> ARABIC SUKUN + '\u067e' # 0x00f3 -> ARABIC LETTER PEH + '\u0679' # 0x00f4 -> ARABIC LETTER TTEH + '\u0686' # 0x00f5 -> ARABIC LETTER TCHEH + '\u06d5' # 0x00f6 -> ARABIC LETTER AE + '\u06a4' # 0x00f7 -> ARABIC LETTER VEH + '\u06af' # 0x00f8 -> ARABIC LETTER GAF + '\u0688' # 0x00f9 -> ARABIC LETTER DDAL + '\u0691' # 0x00fa -> ARABIC LETTER RREH + '{' # 0x00fb -> LEFT CURLY BRACKET, right-left + '|' # 0x00fc -> VERTICAL LINE, right-left + '}' # 0x00fd -> RIGHT CURLY BRACKET, right-left + '\u0698' # 0x00fe -> ARABIC LETTER JEH + '\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/env/Lib/encodings/mac_centeuro.py b/env/Lib/encodings/mac_centeuro.py new file mode 100644 index 0000000..5785a0e --- /dev/null +++ b/env/Lib/encodings/mac_centeuro.py @@ -0,0 +1,307 @@ +""" Python Character Mapping Codec mac_centeuro generated from 'MAPPINGS/VENDORS/APPLE/CENTEURO.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-centeuro', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) + + +### Decoding Table + +decoding_table = ( + '\x00' # 0x00 -> CONTROL CHARACTER + '\x01' # 0x01 -> CONTROL CHARACTER + '\x02' # 0x02 -> CONTROL CHARACTER + '\x03' # 0x03 -> CONTROL CHARACTER + '\x04' # 0x04 -> CONTROL CHARACTER + '\x05' # 0x05 -> CONTROL CHARACTER + '\x06' # 0x06 -> CONTROL CHARACTER + '\x07' # 0x07 -> CONTROL CHARACTER + '\x08' # 0x08 -> CONTROL CHARACTER + '\t' # 0x09 -> CONTROL CHARACTER + '\n' # 0x0A -> CONTROL CHARACTER + '\x0b' # 0x0B -> CONTROL CHARACTER + '\x0c' # 0x0C -> CONTROL CHARACTER + '\r' # 0x0D -> CONTROL CHARACTER + '\x0e' # 0x0E -> CONTROL CHARACTER + '\x0f' # 0x0F -> CONTROL CHARACTER + '\x10' # 0x10 -> CONTROL CHARACTER + '\x11' # 0x11 -> CONTROL CHARACTER + '\x12' # 0x12 -> CONTROL CHARACTER + '\x13' # 0x13 -> CONTROL CHARACTER + '\x14' # 0x14 -> CONTROL CHARACTER + '\x15' # 0x15 -> CONTROL CHARACTER + '\x16' # 0x16 -> CONTROL CHARACTER + '\x17' # 0x17 -> CONTROL CHARACTER + '\x18' # 0x18 -> CONTROL CHARACTER + '\x19' # 0x19 -> CONTROL CHARACTER + '\x1a' # 0x1A -> CONTROL CHARACTER + '\x1b' # 0x1B -> CONTROL CHARACTER + '\x1c' # 0x1C -> CONTROL CHARACTER + '\x1d' # 0x1D -> CONTROL CHARACTER + '\x1e' # 0x1E -> CONTROL CHARACTER + '\x1f' # 0x1F -> CONTROL CHARACTER + ' ' # 0x20 -> SPACE + '!' # 0x21 -> EXCLAMATION MARK + '"' # 0x22 -> QUOTATION MARK + '#' # 0x23 -> NUMBER SIGN + '$' # 0x24 -> DOLLAR SIGN + '%' # 0x25 -> PERCENT SIGN + '&' # 0x26 -> AMPERSAND + "'" # 0x27 -> APOSTROPHE + '(' # 0x28 -> LEFT PARENTHESIS + ')' # 0x29 -> RIGHT PARENTHESIS + '*' # 0x2A -> ASTERISK + '+' # 0x2B -> PLUS SIGN + ',' # 0x2C -> COMMA + '-' # 0x2D -> HYPHEN-MINUS + '.' # 0x2E -> FULL STOP + '/' # 0x2F -> SOLIDUS + '0' # 0x30 -> DIGIT ZERO + '1' # 0x31 -> DIGIT ONE + '2' # 0x32 -> DIGIT TWO + '3' # 0x33 -> DIGIT THREE + '4' # 0x34 -> DIGIT FOUR + '5' # 0x35 -> DIGIT FIVE + '6' # 0x36 -> DIGIT SIX + '7' # 0x37 -> DIGIT SEVEN + '8' # 0x38 -> DIGIT EIGHT + '9' # 0x39 -> DIGIT NINE + ':' # 0x3A -> COLON + ';' # 0x3B -> SEMICOLON + '<' # 0x3C -> LESS-THAN SIGN + '=' # 0x3D -> EQUALS SIGN + '>' # 0x3E -> GREATER-THAN SIGN + '?' # 0x3F -> QUESTION MARK + '@' # 0x40 -> COMMERCIAL AT + 'A' # 0x41 -> LATIN CAPITAL LETTER A + 'B' # 0x42 -> LATIN CAPITAL LETTER B + 'C' # 0x43 -> LATIN CAPITAL LETTER C + 'D' # 0x44 -> LATIN CAPITAL LETTER D + 'E' # 0x45 -> LATIN CAPITAL LETTER E + 'F' # 0x46 -> LATIN CAPITAL LETTER F + 'G' # 0x47 -> LATIN CAPITAL LETTER G + 'H' # 0x48 -> LATIN CAPITAL LETTER H + 'I' # 0x49 -> LATIN CAPITAL LETTER I + 'J' # 0x4A -> LATIN CAPITAL LETTER J + 'K' # 0x4B -> LATIN CAPITAL LETTER K + 'L' # 0x4C -> LATIN CAPITAL LETTER L + 'M' # 0x4D -> LATIN CAPITAL LETTER M + 'N' # 0x4E -> LATIN CAPITAL LETTER N + 'O' # 0x4F -> LATIN CAPITAL LETTER O + 'P' # 0x50 -> LATIN CAPITAL LETTER P + 'Q' # 0x51 -> LATIN CAPITAL LETTER Q + 'R' # 0x52 -> LATIN CAPITAL LETTER R + 'S' # 0x53 -> LATIN CAPITAL LETTER S + 'T' # 0x54 -> LATIN CAPITAL LETTER T + 'U' # 0x55 -> LATIN CAPITAL LETTER U + 'V' # 0x56 -> LATIN CAPITAL LETTER V + 'W' # 0x57 -> LATIN CAPITAL LETTER W + 'X' # 0x58 -> LATIN CAPITAL LETTER X + 'Y' # 0x59 -> LATIN CAPITAL LETTER Y + 'Z' # 0x5A -> LATIN CAPITAL LETTER Z + '[' # 0x5B -> LEFT SQUARE BRACKET + '\\' # 0x5C -> REVERSE SOLIDUS + ']' # 0x5D -> RIGHT SQUARE BRACKET + '^' # 0x5E -> CIRCUMFLEX ACCENT + '_' # 0x5F -> LOW LINE + '`' # 0x60 -> GRAVE ACCENT + 'a' # 0x61 -> LATIN SMALL LETTER A + 'b' # 0x62 -> LATIN SMALL LETTER B + 'c' # 0x63 -> LATIN SMALL LETTER C + 'd' # 0x64 -> LATIN SMALL LETTER D + 'e' # 0x65 -> LATIN SMALL LETTER E + 'f' # 0x66 -> LATIN SMALL LETTER F + 'g' # 0x67 -> LATIN SMALL LETTER G + 'h' # 0x68 -> LATIN SMALL LETTER H + 'i' # 0x69 -> LATIN SMALL LETTER I + 'j' # 0x6A -> LATIN SMALL LETTER J + 'k' # 0x6B -> LATIN SMALL LETTER K + 'l' # 0x6C -> LATIN SMALL LETTER L + 'm' # 0x6D -> LATIN SMALL LETTER M + 'n' # 0x6E -> LATIN SMALL LETTER N + 'o' # 0x6F -> LATIN SMALL LETTER O + 'p' # 0x70 -> LATIN SMALL LETTER P + 'q' # 0x71 -> LATIN SMALL LETTER Q + 'r' # 0x72 -> LATIN SMALL LETTER R + 's' # 0x73 -> LATIN SMALL LETTER S + 't' # 0x74 -> LATIN SMALL LETTER T + 'u' # 0x75 -> LATIN SMALL LETTER U + 'v' # 0x76 -> LATIN SMALL LETTER V + 'w' # 0x77 -> LATIN SMALL LETTER W + 'x' # 0x78 -> LATIN SMALL LETTER X + 'y' # 0x79 -> LATIN SMALL LETTER Y + 'z' # 0x7A -> LATIN SMALL LETTER Z + '{' # 0x7B -> LEFT CURLY BRACKET + '|' # 0x7C -> VERTICAL LINE + '}' # 0x7D -> RIGHT CURLY BRACKET + '~' # 0x7E -> TILDE + '\x7f' # 0x7F -> CONTROL CHARACTER + '\xc4' # 0x80 -> LATIN CAPITAL LETTER A WITH DIAERESIS + '\u0100' # 0x81 -> LATIN CAPITAL LETTER A WITH MACRON + '\u0101' # 0x82 -> LATIN SMALL LETTER A WITH MACRON + '\xc9' # 0x83 -> LATIN CAPITAL LETTER E WITH ACUTE + '\u0104' # 0x84 -> LATIN CAPITAL LETTER A WITH OGONEK + '\xd6' # 0x85 -> LATIN CAPITAL LETTER O WITH DIAERESIS + '\xdc' # 0x86 -> LATIN CAPITAL LETTER U WITH DIAERESIS + '\xe1' # 0x87 -> LATIN SMALL LETTER A WITH ACUTE + '\u0105' # 0x88 -> LATIN SMALL LETTER A WITH OGONEK + '\u010c' # 0x89 -> LATIN CAPITAL LETTER C WITH CARON + '\xe4' # 0x8A -> LATIN SMALL LETTER A WITH DIAERESIS + '\u010d' # 0x8B -> LATIN SMALL LETTER C WITH CARON + '\u0106' # 0x8C -> LATIN CAPITAL LETTER C WITH ACUTE + '\u0107' # 0x8D -> LATIN SMALL LETTER C WITH ACUTE + '\xe9' # 0x8E -> LATIN SMALL LETTER E WITH ACUTE + '\u0179' # 0x8F -> LATIN CAPITAL LETTER Z WITH ACUTE + '\u017a' # 0x90 -> LATIN SMALL LETTER Z WITH ACUTE + '\u010e' # 0x91 -> LATIN CAPITAL LETTER D WITH CARON + '\xed' # 0x92 -> LATIN SMALL LETTER I WITH ACUTE + '\u010f' # 0x93 -> LATIN SMALL LETTER D WITH CARON + '\u0112' # 0x94 -> LATIN CAPITAL LETTER E WITH MACRON + '\u0113' # 0x95 -> LATIN SMALL LETTER E WITH MACRON + '\u0116' # 0x96 -> LATIN CAPITAL LETTER E WITH DOT ABOVE + '\xf3' # 0x97 -> LATIN SMALL LETTER O WITH ACUTE + '\u0117' # 0x98 -> LATIN SMALL LETTER E WITH DOT ABOVE + '\xf4' # 0x99 -> LATIN SMALL LETTER O WITH CIRCUMFLEX + '\xf6' # 0x9A -> LATIN SMALL LETTER O WITH DIAERESIS + '\xf5' # 0x9B -> LATIN SMALL LETTER O WITH TILDE + '\xfa' # 0x9C -> LATIN SMALL LETTER U WITH ACUTE + '\u011a' # 0x9D -> LATIN CAPITAL LETTER E WITH CARON + '\u011b' # 0x9E -> LATIN SMALL LETTER E WITH CARON + '\xfc' # 0x9F -> LATIN SMALL LETTER U WITH DIAERESIS + '\u2020' # 0xA0 -> DAGGER + '\xb0' # 0xA1 -> DEGREE SIGN + '\u0118' # 0xA2 -> LATIN CAPITAL LETTER E WITH OGONEK + '\xa3' # 0xA3 -> POUND SIGN + '\xa7' # 0xA4 -> SECTION SIGN + '\u2022' # 0xA5 -> BULLET + '\xb6' # 0xA6 -> PILCROW SIGN + '\xdf' # 0xA7 -> LATIN SMALL LETTER SHARP S + '\xae' # 0xA8 -> REGISTERED SIGN + '\xa9' # 0xA9 -> COPYRIGHT SIGN + '\u2122' # 0xAA -> TRADE MARK SIGN + '\u0119' # 0xAB -> LATIN SMALL LETTER E WITH OGONEK + '\xa8' # 0xAC -> DIAERESIS + '\u2260' # 0xAD -> NOT EQUAL TO + '\u0123' # 0xAE -> LATIN SMALL LETTER G WITH CEDILLA + '\u012e' # 0xAF -> LATIN CAPITAL LETTER I WITH OGONEK + '\u012f' # 0xB0 -> LATIN SMALL LETTER I WITH OGONEK + '\u012a' # 0xB1 -> LATIN CAPITAL LETTER I WITH MACRON + '\u2264' # 0xB2 -> LESS-THAN OR EQUAL TO + '\u2265' # 0xB3 -> GREATER-THAN OR EQUAL TO + '\u012b' # 0xB4 -> LATIN SMALL LETTER I WITH MACRON + '\u0136' # 0xB5 -> LATIN CAPITAL LETTER K WITH CEDILLA + '\u2202' # 0xB6 -> PARTIAL DIFFERENTIAL + '\u2211' # 0xB7 -> N-ARY SUMMATION + '\u0142' # 0xB8 -> LATIN SMALL LETTER L WITH STROKE + '\u013b' # 0xB9 -> LATIN CAPITAL LETTER L WITH CEDILLA + '\u013c' # 0xBA -> LATIN SMALL LETTER L WITH CEDILLA + '\u013d' # 0xBB -> LATIN CAPITAL LETTER L WITH CARON + '\u013e' # 0xBC -> LATIN SMALL LETTER L WITH CARON + '\u0139' # 0xBD -> LATIN CAPITAL LETTER L WITH ACUTE + '\u013a' # 0xBE -> LATIN SMALL LETTER L WITH ACUTE + '\u0145' # 0xBF -> LATIN CAPITAL LETTER N WITH CEDILLA + '\u0146' # 0xC0 -> LATIN SMALL LETTER N WITH CEDILLA + '\u0143' # 0xC1 -> LATIN CAPITAL LETTER N WITH ACUTE + '\xac' # 0xC2 -> NOT SIGN + '\u221a' # 0xC3 -> SQUARE ROOT + '\u0144' # 0xC4 -> LATIN SMALL LETTER N WITH ACUTE + '\u0147' # 0xC5 -> LATIN CAPITAL LETTER N WITH CARON + '\u2206' # 0xC6 -> INCREMENT + '\xab' # 0xC7 -> LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + '\xbb' # 0xC8 -> RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + '\u2026' # 0xC9 -> HORIZONTAL ELLIPSIS + '\xa0' # 0xCA -> NO-BREAK SPACE + '\u0148' # 0xCB -> LATIN SMALL LETTER N WITH CARON + '\u0150' # 0xCC -> LATIN CAPITAL LETTER O WITH DOUBLE ACUTE + '\xd5' # 0xCD -> LATIN CAPITAL LETTER O WITH TILDE + '\u0151' # 0xCE -> LATIN SMALL LETTER O WITH DOUBLE ACUTE + '\u014c' # 0xCF -> LATIN CAPITAL LETTER O WITH MACRON + '\u2013' # 0xD0 -> EN DASH + '\u2014' # 0xD1 -> EM DASH + '\u201c' # 0xD2 -> LEFT DOUBLE QUOTATION MARK + '\u201d' # 0xD3 -> RIGHT DOUBLE QUOTATION MARK + '\u2018' # 0xD4 -> LEFT SINGLE QUOTATION MARK + '\u2019' # 0xD5 -> RIGHT SINGLE QUOTATION MARK + '\xf7' # 0xD6 -> DIVISION SIGN + '\u25ca' # 0xD7 -> LOZENGE + '\u014d' # 0xD8 -> LATIN SMALL LETTER O WITH MACRON + '\u0154' # 0xD9 -> LATIN CAPITAL LETTER R WITH ACUTE + '\u0155' # 0xDA -> LATIN SMALL LETTER R WITH ACUTE + '\u0158' # 0xDB -> LATIN CAPITAL LETTER R WITH CARON + '\u2039' # 0xDC -> SINGLE LEFT-POINTING ANGLE QUOTATION MARK + '\u203a' # 0xDD -> SINGLE RIGHT-POINTING ANGLE QUOTATION MARK + '\u0159' # 0xDE -> LATIN SMALL LETTER R WITH CARON + '\u0156' # 0xDF -> LATIN CAPITAL LETTER R WITH CEDILLA + '\u0157' # 0xE0 -> LATIN SMALL LETTER R WITH CEDILLA + '\u0160' # 0xE1 -> LATIN CAPITAL LETTER S WITH CARON + '\u201a' # 0xE2 -> SINGLE LOW-9 QUOTATION MARK + '\u201e' # 0xE3 -> DOUBLE LOW-9 QUOTATION MARK + '\u0161' # 0xE4 -> LATIN SMALL LETTER S WITH CARON + '\u015a' # 0xE5 -> LATIN CAPITAL LETTER S WITH ACUTE + '\u015b' # 0xE6 -> LATIN SMALL LETTER S WITH ACUTE + '\xc1' # 0xE7 -> LATIN CAPITAL LETTER A WITH ACUTE + '\u0164' # 0xE8 -> LATIN CAPITAL LETTER T WITH CARON + '\u0165' # 0xE9 -> LATIN SMALL LETTER T WITH CARON + '\xcd' # 0xEA -> LATIN CAPITAL LETTER I WITH ACUTE + '\u017d' # 0xEB -> LATIN CAPITAL LETTER Z WITH CARON + '\u017e' # 0xEC -> LATIN SMALL LETTER Z WITH CARON + '\u016a' # 0xED -> LATIN CAPITAL LETTER U WITH MACRON + '\xd3' # 0xEE -> LATIN CAPITAL LETTER O WITH ACUTE + '\xd4' # 0xEF -> LATIN CAPITAL LETTER O WITH CIRCUMFLEX + '\u016b' # 0xF0 -> LATIN SMALL LETTER U WITH MACRON + '\u016e' # 0xF1 -> LATIN CAPITAL LETTER U WITH RING ABOVE + '\xda' # 0xF2 -> LATIN CAPITAL LETTER U WITH ACUTE + '\u016f' # 0xF3 -> LATIN SMALL LETTER U WITH RING ABOVE + '\u0170' # 0xF4 -> LATIN CAPITAL LETTER U WITH DOUBLE ACUTE + '\u0171' # 0xF5 -> LATIN SMALL LETTER U WITH DOUBLE ACUTE + '\u0172' # 0xF6 -> LATIN CAPITAL LETTER U WITH OGONEK + '\u0173' # 0xF7 -> LATIN SMALL LETTER U WITH OGONEK + '\xdd' # 0xF8 -> LATIN CAPITAL LETTER Y WITH ACUTE + '\xfd' # 0xF9 -> LATIN SMALL LETTER Y WITH ACUTE + '\u0137' # 0xFA -> LATIN SMALL LETTER K WITH CEDILLA + '\u017b' # 0xFB -> LATIN CAPITAL LETTER Z WITH DOT ABOVE + '\u0141' # 0xFC -> LATIN CAPITAL LETTER L WITH STROKE + '\u017c' # 0xFD -> LATIN SMALL LETTER Z WITH DOT ABOVE + '\u0122' # 0xFE -> LATIN CAPITAL LETTER G WITH CEDILLA + '\u02c7' # 0xFF -> CARON +) + +### Encoding table +encoding_table=codecs.charmap_build(decoding_table) diff --git a/env/Lib/encodings/mac_croatian.py b/env/Lib/encodings/mac_croatian.py new file mode 100644 index 0000000..4a92fe6 --- /dev/null +++ b/env/Lib/encodings/mac_croatian.py @@ -0,0 +1,307 @@ +""" 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 = ( + '\x00' # 0x00 -> CONTROL CHARACTER + '\x01' # 0x01 -> CONTROL CHARACTER + '\x02' # 0x02 -> CONTROL CHARACTER + '\x03' # 0x03 -> CONTROL CHARACTER + '\x04' # 0x04 -> CONTROL CHARACTER + '\x05' # 0x05 -> CONTROL CHARACTER + '\x06' # 0x06 -> CONTROL CHARACTER + '\x07' # 0x07 -> CONTROL CHARACTER + '\x08' # 0x08 -> CONTROL CHARACTER + '\t' # 0x09 -> CONTROL CHARACTER + '\n' # 0x0A -> CONTROL CHARACTER + '\x0b' # 0x0B -> CONTROL CHARACTER + '\x0c' # 0x0C -> CONTROL CHARACTER + '\r' # 0x0D -> CONTROL CHARACTER + '\x0e' # 0x0E -> CONTROL CHARACTER + '\x0f' # 0x0F -> CONTROL CHARACTER + '\x10' # 0x10 -> CONTROL CHARACTER + '\x11' # 0x11 -> CONTROL CHARACTER + '\x12' # 0x12 -> CONTROL CHARACTER + '\x13' # 0x13 -> CONTROL CHARACTER + '\x14' # 0x14 -> CONTROL CHARACTER + '\x15' # 0x15 -> CONTROL CHARACTER + '\x16' # 0x16 -> CONTROL CHARACTER + '\x17' # 0x17 -> CONTROL CHARACTER + '\x18' # 0x18 -> CONTROL CHARACTER + '\x19' # 0x19 -> CONTROL CHARACTER + '\x1a' # 0x1A -> CONTROL CHARACTER + '\x1b' # 0x1B -> CONTROL CHARACTER + '\x1c' # 0x1C -> CONTROL CHARACTER + '\x1d' # 0x1D -> CONTROL CHARACTER + '\x1e' # 0x1E -> CONTROL CHARACTER + '\x1f' # 0x1F -> CONTROL CHARACTER + ' ' # 0x20 -> SPACE + '!' # 0x21 -> EXCLAMATION MARK + '"' # 0x22 -> QUOTATION MARK + '#' # 0x23 -> NUMBER SIGN + '$' # 0x24 -> DOLLAR SIGN + '%' # 0x25 -> PERCENT SIGN + '&' # 0x26 -> AMPERSAND + "'" # 0x27 -> APOSTROPHE + '(' # 0x28 -> LEFT PARENTHESIS + ')' # 0x29 -> RIGHT PARENTHESIS + '*' # 0x2A -> ASTERISK + '+' # 0x2B -> PLUS SIGN + ',' # 0x2C -> COMMA + '-' # 0x2D -> HYPHEN-MINUS + '.' # 0x2E -> FULL STOP + '/' # 0x2F -> SOLIDUS + '0' # 0x30 -> DIGIT ZERO + '1' # 0x31 -> DIGIT ONE + '2' # 0x32 -> DIGIT TWO + '3' # 0x33 -> DIGIT THREE + '4' # 0x34 -> DIGIT FOUR + '5' # 0x35 -> DIGIT FIVE + '6' # 0x36 -> DIGIT SIX + '7' # 0x37 -> DIGIT SEVEN + '8' # 0x38 -> DIGIT EIGHT + '9' # 0x39 -> DIGIT NINE + ':' # 0x3A -> COLON + ';' # 0x3B -> SEMICOLON + '<' # 0x3C -> LESS-THAN SIGN + '=' # 0x3D -> EQUALS SIGN + '>' # 0x3E -> GREATER-THAN SIGN + '?' # 0x3F -> QUESTION MARK + '@' # 0x40 -> COMMERCIAL AT + 'A' # 0x41 -> LATIN CAPITAL LETTER A + 'B' # 0x42 -> LATIN CAPITAL LETTER B + 'C' # 0x43 -> LATIN CAPITAL LETTER C + 'D' # 0x44 -> LATIN CAPITAL LETTER D + 'E' # 0x45 -> LATIN CAPITAL LETTER E + 'F' # 0x46 -> LATIN CAPITAL LETTER F + 'G' # 0x47 -> LATIN CAPITAL LETTER G + 'H' # 0x48 -> LATIN CAPITAL LETTER H + 'I' # 0x49 -> LATIN CAPITAL LETTER I + 'J' # 0x4A -> LATIN CAPITAL LETTER J + 'K' # 0x4B -> LATIN CAPITAL LETTER K + 'L' # 0x4C -> LATIN CAPITAL LETTER L + 'M' # 0x4D -> LATIN CAPITAL LETTER M + 'N' # 0x4E -> LATIN CAPITAL LETTER N + 'O' # 0x4F -> LATIN CAPITAL LETTER O + 'P' # 0x50 -> LATIN CAPITAL LETTER P + 'Q' # 0x51 -> LATIN CAPITAL LETTER Q + 'R' # 0x52 -> LATIN CAPITAL LETTER R + 'S' # 0x53 -> LATIN CAPITAL LETTER S + 'T' # 0x54 -> LATIN CAPITAL LETTER T + 'U' # 0x55 -> LATIN CAPITAL LETTER U + 'V' # 0x56 -> LATIN CAPITAL LETTER V + 'W' # 0x57 -> LATIN CAPITAL LETTER W + 'X' # 0x58 -> LATIN CAPITAL LETTER X + 'Y' # 0x59 -> LATIN CAPITAL LETTER Y + 'Z' # 0x5A -> LATIN CAPITAL LETTER Z + '[' # 0x5B -> LEFT SQUARE BRACKET + '\\' # 0x5C -> REVERSE SOLIDUS + ']' # 0x5D -> RIGHT SQUARE BRACKET + '^' # 0x5E -> CIRCUMFLEX ACCENT + '_' # 0x5F -> LOW LINE + '`' # 0x60 -> GRAVE ACCENT + 'a' # 0x61 -> LATIN SMALL LETTER A + 'b' # 0x62 -> LATIN SMALL LETTER B + 'c' # 0x63 -> LATIN SMALL LETTER C + 'd' # 0x64 -> LATIN SMALL LETTER D + 'e' # 0x65 -> LATIN SMALL LETTER E + 'f' # 0x66 -> LATIN SMALL LETTER F + 'g' # 0x67 -> LATIN SMALL LETTER G + 'h' # 0x68 -> LATIN SMALL LETTER H + 'i' # 0x69 -> LATIN SMALL LETTER I + 'j' # 0x6A -> LATIN SMALL LETTER J + 'k' # 0x6B -> LATIN SMALL LETTER K + 'l' # 0x6C -> LATIN SMALL LETTER L + 'm' # 0x6D -> LATIN SMALL LETTER M + 'n' # 0x6E -> LATIN SMALL LETTER N + 'o' # 0x6F -> LATIN SMALL LETTER O + 'p' # 0x70 -> LATIN SMALL LETTER P + 'q' # 0x71 -> LATIN SMALL LETTER Q + 'r' # 0x72 -> LATIN SMALL LETTER R + 's' # 0x73 -> LATIN SMALL LETTER S + 't' # 0x74 -> LATIN SMALL LETTER T + 'u' # 0x75 -> LATIN SMALL LETTER U + 'v' # 0x76 -> LATIN SMALL LETTER V + 'w' # 0x77 -> LATIN SMALL LETTER W + 'x' # 0x78 -> LATIN SMALL LETTER X + 'y' # 0x79 -> LATIN SMALL LETTER Y + 'z' # 0x7A -> LATIN SMALL LETTER Z + '{' # 0x7B -> LEFT CURLY BRACKET + '|' # 0x7C -> VERTICAL LINE + '}' # 0x7D -> RIGHT CURLY BRACKET + '~' # 0x7E -> TILDE + '\x7f' # 0x7F -> CONTROL CHARACTER + '\xc4' # 0x80 -> LATIN CAPITAL LETTER A WITH DIAERESIS + '\xc5' # 0x81 -> LATIN CAPITAL LETTER A WITH RING ABOVE + '\xc7' # 0x82 -> LATIN CAPITAL LETTER C WITH CEDILLA + '\xc9' # 0x83 -> LATIN CAPITAL LETTER E WITH ACUTE + '\xd1' # 0x84 -> LATIN CAPITAL LETTER N WITH TILDE + '\xd6' # 0x85 -> LATIN CAPITAL LETTER O WITH DIAERESIS + '\xdc' # 0x86 -> LATIN CAPITAL LETTER U WITH DIAERESIS + '\xe1' # 0x87 -> LATIN SMALL LETTER A WITH ACUTE + '\xe0' # 0x88 -> LATIN SMALL LETTER A WITH GRAVE + '\xe2' # 0x89 -> LATIN SMALL LETTER A WITH CIRCUMFLEX + '\xe4' # 0x8A -> LATIN SMALL LETTER A WITH DIAERESIS + '\xe3' # 0x8B -> LATIN SMALL LETTER A WITH TILDE + '\xe5' # 0x8C -> LATIN SMALL LETTER A WITH RING ABOVE + '\xe7' # 0x8D -> LATIN SMALL LETTER C WITH CEDILLA + '\xe9' # 0x8E -> LATIN SMALL LETTER E WITH ACUTE + '\xe8' # 0x8F -> LATIN SMALL LETTER E WITH GRAVE + '\xea' # 0x90 -> LATIN SMALL LETTER E WITH CIRCUMFLEX + '\xeb' # 0x91 -> LATIN SMALL LETTER E WITH DIAERESIS + '\xed' # 0x92 -> LATIN SMALL LETTER I WITH ACUTE + '\xec' # 0x93 -> LATIN SMALL LETTER I WITH GRAVE + '\xee' # 0x94 -> LATIN SMALL LETTER I WITH CIRCUMFLEX + '\xef' # 0x95 -> LATIN SMALL LETTER I WITH DIAERESIS + '\xf1' # 0x96 -> LATIN SMALL LETTER N WITH TILDE + '\xf3' # 0x97 -> LATIN SMALL LETTER O WITH ACUTE + '\xf2' # 0x98 -> LATIN SMALL LETTER O WITH GRAVE + '\xf4' # 0x99 -> LATIN SMALL LETTER O WITH CIRCUMFLEX + '\xf6' # 0x9A -> LATIN SMALL LETTER O WITH DIAERESIS + '\xf5' # 0x9B -> LATIN SMALL LETTER O WITH TILDE + '\xfa' # 0x9C -> LATIN SMALL LETTER U WITH ACUTE + '\xf9' # 0x9D -> LATIN SMALL LETTER U WITH GRAVE + '\xfb' # 0x9E -> LATIN SMALL LETTER U WITH CIRCUMFLEX + '\xfc' # 0x9F -> LATIN SMALL LETTER U WITH DIAERESIS + '\u2020' # 0xA0 -> DAGGER + '\xb0' # 0xA1 -> DEGREE SIGN + '\xa2' # 0xA2 -> CENT SIGN + '\xa3' # 0xA3 -> POUND SIGN + '\xa7' # 0xA4 -> SECTION SIGN + '\u2022' # 0xA5 -> BULLET + '\xb6' # 0xA6 -> PILCROW SIGN + '\xdf' # 0xA7 -> LATIN SMALL LETTER SHARP S + '\xae' # 0xA8 -> REGISTERED SIGN + '\u0160' # 0xA9 -> LATIN CAPITAL LETTER S WITH CARON + '\u2122' # 0xAA -> TRADE MARK SIGN + '\xb4' # 0xAB -> ACUTE ACCENT + '\xa8' # 0xAC -> DIAERESIS + '\u2260' # 0xAD -> NOT EQUAL TO + '\u017d' # 0xAE -> LATIN CAPITAL LETTER Z WITH CARON + '\xd8' # 0xAF -> LATIN CAPITAL LETTER O WITH STROKE + '\u221e' # 0xB0 -> INFINITY + '\xb1' # 0xB1 -> PLUS-MINUS SIGN + '\u2264' # 0xB2 -> LESS-THAN OR EQUAL TO + '\u2265' # 0xB3 -> GREATER-THAN OR EQUAL TO + '\u2206' # 0xB4 -> INCREMENT + '\xb5' # 0xB5 -> MICRO SIGN + '\u2202' # 0xB6 -> PARTIAL DIFFERENTIAL + '\u2211' # 0xB7 -> N-ARY SUMMATION + '\u220f' # 0xB8 -> N-ARY PRODUCT + '\u0161' # 0xB9 -> LATIN SMALL LETTER S WITH CARON + '\u222b' # 0xBA -> INTEGRAL + '\xaa' # 0xBB -> FEMININE ORDINAL INDICATOR + '\xba' # 0xBC -> MASCULINE ORDINAL INDICATOR + '\u03a9' # 0xBD -> GREEK CAPITAL LETTER OMEGA + '\u017e' # 0xBE -> LATIN SMALL LETTER Z WITH CARON + '\xf8' # 0xBF -> LATIN SMALL LETTER O WITH STROKE + '\xbf' # 0xC0 -> INVERTED QUESTION MARK + '\xa1' # 0xC1 -> INVERTED EXCLAMATION MARK + '\xac' # 0xC2 -> NOT SIGN + '\u221a' # 0xC3 -> SQUARE ROOT + '\u0192' # 0xC4 -> LATIN SMALL LETTER F WITH HOOK + '\u2248' # 0xC5 -> ALMOST EQUAL TO + '\u0106' # 0xC6 -> LATIN CAPITAL LETTER C WITH ACUTE + '\xab' # 0xC7 -> LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + '\u010c' # 0xC8 -> LATIN CAPITAL LETTER C WITH CARON + '\u2026' # 0xC9 -> HORIZONTAL ELLIPSIS + '\xa0' # 0xCA -> NO-BREAK SPACE + '\xc0' # 0xCB -> LATIN CAPITAL LETTER A WITH GRAVE + '\xc3' # 0xCC -> LATIN CAPITAL LETTER A WITH TILDE + '\xd5' # 0xCD -> LATIN CAPITAL LETTER O WITH TILDE + '\u0152' # 0xCE -> LATIN CAPITAL LIGATURE OE + '\u0153' # 0xCF -> LATIN SMALL LIGATURE OE + '\u0110' # 0xD0 -> LATIN CAPITAL LETTER D WITH STROKE + '\u2014' # 0xD1 -> EM DASH + '\u201c' # 0xD2 -> LEFT DOUBLE QUOTATION MARK + '\u201d' # 0xD3 -> RIGHT DOUBLE QUOTATION MARK + '\u2018' # 0xD4 -> LEFT SINGLE QUOTATION MARK + '\u2019' # 0xD5 -> RIGHT SINGLE QUOTATION MARK + '\xf7' # 0xD6 -> DIVISION SIGN + '\u25ca' # 0xD7 -> LOZENGE + '\uf8ff' # 0xD8 -> Apple logo + '\xa9' # 0xD9 -> COPYRIGHT SIGN + '\u2044' # 0xDA -> FRACTION SLASH + '\u20ac' # 0xDB -> EURO SIGN + '\u2039' # 0xDC -> SINGLE LEFT-POINTING ANGLE QUOTATION MARK + '\u203a' # 0xDD -> SINGLE RIGHT-POINTING ANGLE QUOTATION MARK + '\xc6' # 0xDE -> LATIN CAPITAL LETTER AE + '\xbb' # 0xDF -> RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + '\u2013' # 0xE0 -> EN DASH + '\xb7' # 0xE1 -> MIDDLE DOT + '\u201a' # 0xE2 -> SINGLE LOW-9 QUOTATION MARK + '\u201e' # 0xE3 -> DOUBLE LOW-9 QUOTATION MARK + '\u2030' # 0xE4 -> PER MILLE SIGN + '\xc2' # 0xE5 -> LATIN CAPITAL LETTER A WITH CIRCUMFLEX + '\u0107' # 0xE6 -> LATIN SMALL LETTER C WITH ACUTE + '\xc1' # 0xE7 -> LATIN CAPITAL LETTER A WITH ACUTE + '\u010d' # 0xE8 -> LATIN SMALL LETTER C WITH CARON + '\xc8' # 0xE9 -> LATIN CAPITAL LETTER E WITH GRAVE + '\xcd' # 0xEA -> LATIN CAPITAL LETTER I WITH ACUTE + '\xce' # 0xEB -> LATIN CAPITAL LETTER I WITH CIRCUMFLEX + '\xcf' # 0xEC -> LATIN CAPITAL LETTER I WITH DIAERESIS + '\xcc' # 0xED -> LATIN CAPITAL LETTER I WITH GRAVE + '\xd3' # 0xEE -> LATIN CAPITAL LETTER O WITH ACUTE + '\xd4' # 0xEF -> LATIN CAPITAL LETTER O WITH CIRCUMFLEX + '\u0111' # 0xF0 -> LATIN SMALL LETTER D WITH STROKE + '\xd2' # 0xF1 -> LATIN CAPITAL LETTER O WITH GRAVE + '\xda' # 0xF2 -> LATIN CAPITAL LETTER U WITH ACUTE + '\xdb' # 0xF3 -> LATIN CAPITAL LETTER U WITH CIRCUMFLEX + '\xd9' # 0xF4 -> LATIN CAPITAL LETTER U WITH GRAVE + '\u0131' # 0xF5 -> LATIN SMALL LETTER DOTLESS I + '\u02c6' # 0xF6 -> MODIFIER LETTER CIRCUMFLEX ACCENT + '\u02dc' # 0xF7 -> SMALL TILDE + '\xaf' # 0xF8 -> MACRON + '\u03c0' # 0xF9 -> GREEK SMALL LETTER PI + '\xcb' # 0xFA -> LATIN CAPITAL LETTER E WITH DIAERESIS + '\u02da' # 0xFB -> RING ABOVE + '\xb8' # 0xFC -> CEDILLA + '\xca' # 0xFD -> LATIN CAPITAL LETTER E WITH CIRCUMFLEX + '\xe6' # 0xFE -> LATIN SMALL LETTER AE + '\u02c7' # 0xFF -> CARON +) + +### Encoding table +encoding_table=codecs.charmap_build(decoding_table) diff --git a/env/Lib/encodings/mac_cyrillic.py b/env/Lib/encodings/mac_cyrillic.py new file mode 100644 index 0000000..d20272a --- /dev/null +++ b/env/Lib/encodings/mac_cyrillic.py @@ -0,0 +1,307 @@ +""" 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 = ( + '\x00' # 0x00 -> CONTROL CHARACTER + '\x01' # 0x01 -> CONTROL CHARACTER + '\x02' # 0x02 -> CONTROL CHARACTER + '\x03' # 0x03 -> CONTROL CHARACTER + '\x04' # 0x04 -> CONTROL CHARACTER + '\x05' # 0x05 -> CONTROL CHARACTER + '\x06' # 0x06 -> CONTROL CHARACTER + '\x07' # 0x07 -> CONTROL CHARACTER + '\x08' # 0x08 -> CONTROL CHARACTER + '\t' # 0x09 -> CONTROL CHARACTER + '\n' # 0x0A -> CONTROL CHARACTER + '\x0b' # 0x0B -> CONTROL CHARACTER + '\x0c' # 0x0C -> CONTROL CHARACTER + '\r' # 0x0D -> CONTROL CHARACTER + '\x0e' # 0x0E -> CONTROL CHARACTER + '\x0f' # 0x0F -> CONTROL CHARACTER + '\x10' # 0x10 -> CONTROL CHARACTER + '\x11' # 0x11 -> CONTROL CHARACTER + '\x12' # 0x12 -> CONTROL CHARACTER + '\x13' # 0x13 -> CONTROL CHARACTER + '\x14' # 0x14 -> CONTROL CHARACTER + '\x15' # 0x15 -> CONTROL CHARACTER + '\x16' # 0x16 -> CONTROL CHARACTER + '\x17' # 0x17 -> CONTROL CHARACTER + '\x18' # 0x18 -> CONTROL CHARACTER + '\x19' # 0x19 -> CONTROL CHARACTER + '\x1a' # 0x1A -> CONTROL CHARACTER + '\x1b' # 0x1B -> CONTROL CHARACTER + '\x1c' # 0x1C -> CONTROL CHARACTER + '\x1d' # 0x1D -> CONTROL CHARACTER + '\x1e' # 0x1E -> CONTROL CHARACTER + '\x1f' # 0x1F -> CONTROL CHARACTER + ' ' # 0x20 -> SPACE + '!' # 0x21 -> EXCLAMATION MARK + '"' # 0x22 -> QUOTATION MARK + '#' # 0x23 -> NUMBER SIGN + '$' # 0x24 -> DOLLAR SIGN + '%' # 0x25 -> PERCENT SIGN + '&' # 0x26 -> AMPERSAND + "'" # 0x27 -> APOSTROPHE + '(' # 0x28 -> LEFT PARENTHESIS + ')' # 0x29 -> RIGHT PARENTHESIS + '*' # 0x2A -> ASTERISK + '+' # 0x2B -> PLUS SIGN + ',' # 0x2C -> COMMA + '-' # 0x2D -> HYPHEN-MINUS + '.' # 0x2E -> FULL STOP + '/' # 0x2F -> SOLIDUS + '0' # 0x30 -> DIGIT ZERO + '1' # 0x31 -> DIGIT ONE + '2' # 0x32 -> DIGIT TWO + '3' # 0x33 -> DIGIT THREE + '4' # 0x34 -> DIGIT FOUR + '5' # 0x35 -> DIGIT FIVE + '6' # 0x36 -> DIGIT SIX + '7' # 0x37 -> DIGIT SEVEN + '8' # 0x38 -> DIGIT EIGHT + '9' # 0x39 -> DIGIT NINE + ':' # 0x3A -> COLON + ';' # 0x3B -> SEMICOLON + '<' # 0x3C -> LESS-THAN SIGN + '=' # 0x3D -> EQUALS SIGN + '>' # 0x3E -> GREATER-THAN SIGN + '?' # 0x3F -> QUESTION MARK + '@' # 0x40 -> COMMERCIAL AT + 'A' # 0x41 -> LATIN CAPITAL LETTER A + 'B' # 0x42 -> LATIN CAPITAL LETTER B + 'C' # 0x43 -> LATIN CAPITAL LETTER C + 'D' # 0x44 -> LATIN CAPITAL LETTER D + 'E' # 0x45 -> LATIN CAPITAL LETTER E + 'F' # 0x46 -> LATIN CAPITAL LETTER F + 'G' # 0x47 -> LATIN CAPITAL LETTER G + 'H' # 0x48 -> LATIN CAPITAL LETTER H + 'I' # 0x49 -> LATIN CAPITAL LETTER I + 'J' # 0x4A -> LATIN CAPITAL LETTER J + 'K' # 0x4B -> LATIN CAPITAL LETTER K + 'L' # 0x4C -> LATIN CAPITAL LETTER L + 'M' # 0x4D -> LATIN CAPITAL LETTER M + 'N' # 0x4E -> LATIN CAPITAL LETTER N + 'O' # 0x4F -> LATIN CAPITAL LETTER O + 'P' # 0x50 -> LATIN CAPITAL LETTER P + 'Q' # 0x51 -> LATIN CAPITAL LETTER Q + 'R' # 0x52 -> LATIN CAPITAL LETTER R + 'S' # 0x53 -> LATIN CAPITAL LETTER S + 'T' # 0x54 -> LATIN CAPITAL LETTER T + 'U' # 0x55 -> LATIN CAPITAL LETTER U + 'V' # 0x56 -> LATIN CAPITAL LETTER V + 'W' # 0x57 -> LATIN CAPITAL LETTER W + 'X' # 0x58 -> LATIN CAPITAL LETTER X + 'Y' # 0x59 -> LATIN CAPITAL LETTER Y + 'Z' # 0x5A -> LATIN CAPITAL LETTER Z + '[' # 0x5B -> LEFT SQUARE BRACKET + '\\' # 0x5C -> REVERSE SOLIDUS + ']' # 0x5D -> RIGHT SQUARE BRACKET + '^' # 0x5E -> CIRCUMFLEX ACCENT + '_' # 0x5F -> LOW LINE + '`' # 0x60 -> GRAVE ACCENT + 'a' # 0x61 -> LATIN SMALL LETTER A + 'b' # 0x62 -> LATIN SMALL LETTER B + 'c' # 0x63 -> LATIN SMALL LETTER C + 'd' # 0x64 -> LATIN SMALL LETTER D + 'e' # 0x65 -> LATIN SMALL LETTER E + 'f' # 0x66 -> LATIN SMALL LETTER F + 'g' # 0x67 -> LATIN SMALL LETTER G + 'h' # 0x68 -> LATIN SMALL LETTER H + 'i' # 0x69 -> LATIN SMALL LETTER I + 'j' # 0x6A -> LATIN SMALL LETTER J + 'k' # 0x6B -> LATIN SMALL LETTER K + 'l' # 0x6C -> LATIN SMALL LETTER L + 'm' # 0x6D -> LATIN SMALL LETTER M + 'n' # 0x6E -> LATIN SMALL LETTER N + 'o' # 0x6F -> LATIN SMALL LETTER O + 'p' # 0x70 -> LATIN SMALL LETTER P + 'q' # 0x71 -> LATIN SMALL LETTER Q + 'r' # 0x72 -> LATIN SMALL LETTER R + 's' # 0x73 -> LATIN SMALL LETTER S + 't' # 0x74 -> LATIN SMALL LETTER T + 'u' # 0x75 -> LATIN SMALL LETTER U + 'v' # 0x76 -> LATIN SMALL LETTER V + 'w' # 0x77 -> LATIN SMALL LETTER W + 'x' # 0x78 -> LATIN SMALL LETTER X + 'y' # 0x79 -> LATIN SMALL LETTER Y + 'z' # 0x7A -> LATIN SMALL LETTER Z + '{' # 0x7B -> LEFT CURLY BRACKET + '|' # 0x7C -> VERTICAL LINE + '}' # 0x7D -> RIGHT CURLY BRACKET + '~' # 0x7E -> TILDE + '\x7f' # 0x7F -> CONTROL CHARACTER + '\u0410' # 0x80 -> CYRILLIC CAPITAL LETTER A + '\u0411' # 0x81 -> CYRILLIC CAPITAL LETTER BE + '\u0412' # 0x82 -> CYRILLIC CAPITAL LETTER VE + '\u0413' # 0x83 -> CYRILLIC CAPITAL LETTER GHE + '\u0414' # 0x84 -> CYRILLIC CAPITAL LETTER DE + '\u0415' # 0x85 -> CYRILLIC CAPITAL LETTER IE + '\u0416' # 0x86 -> CYRILLIC CAPITAL LETTER ZHE + '\u0417' # 0x87 -> CYRILLIC CAPITAL LETTER ZE + '\u0418' # 0x88 -> CYRILLIC CAPITAL LETTER I + '\u0419' # 0x89 -> CYRILLIC CAPITAL LETTER SHORT I + '\u041a' # 0x8A -> CYRILLIC CAPITAL LETTER KA + '\u041b' # 0x8B -> CYRILLIC CAPITAL LETTER EL + '\u041c' # 0x8C -> CYRILLIC CAPITAL LETTER EM + '\u041d' # 0x8D -> CYRILLIC CAPITAL LETTER EN + '\u041e' # 0x8E -> CYRILLIC CAPITAL LETTER O + '\u041f' # 0x8F -> CYRILLIC CAPITAL LETTER PE + '\u0420' # 0x90 -> CYRILLIC CAPITAL LETTER ER + '\u0421' # 0x91 -> CYRILLIC CAPITAL LETTER ES + '\u0422' # 0x92 -> CYRILLIC CAPITAL LETTER TE + '\u0423' # 0x93 -> CYRILLIC CAPITAL LETTER U + '\u0424' # 0x94 -> CYRILLIC CAPITAL LETTER EF + '\u0425' # 0x95 -> CYRILLIC CAPITAL LETTER HA + '\u0426' # 0x96 -> CYRILLIC CAPITAL LETTER TSE + '\u0427' # 0x97 -> CYRILLIC CAPITAL LETTER CHE + '\u0428' # 0x98 -> CYRILLIC CAPITAL LETTER SHA + '\u0429' # 0x99 -> CYRILLIC CAPITAL LETTER SHCHA + '\u042a' # 0x9A -> CYRILLIC CAPITAL LETTER HARD SIGN + '\u042b' # 0x9B -> CYRILLIC CAPITAL LETTER YERU + '\u042c' # 0x9C -> CYRILLIC CAPITAL LETTER SOFT SIGN + '\u042d' # 0x9D -> CYRILLIC CAPITAL LETTER E + '\u042e' # 0x9E -> CYRILLIC CAPITAL LETTER YU + '\u042f' # 0x9F -> CYRILLIC CAPITAL LETTER YA + '\u2020' # 0xA0 -> DAGGER + '\xb0' # 0xA1 -> DEGREE SIGN + '\u0490' # 0xA2 -> CYRILLIC CAPITAL LETTER GHE WITH UPTURN + '\xa3' # 0xA3 -> POUND SIGN + '\xa7' # 0xA4 -> SECTION SIGN + '\u2022' # 0xA5 -> BULLET + '\xb6' # 0xA6 -> PILCROW SIGN + '\u0406' # 0xA7 -> CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I + '\xae' # 0xA8 -> REGISTERED SIGN + '\xa9' # 0xA9 -> COPYRIGHT SIGN + '\u2122' # 0xAA -> TRADE MARK SIGN + '\u0402' # 0xAB -> CYRILLIC CAPITAL LETTER DJE + '\u0452' # 0xAC -> CYRILLIC SMALL LETTER DJE + '\u2260' # 0xAD -> NOT EQUAL TO + '\u0403' # 0xAE -> CYRILLIC CAPITAL LETTER GJE + '\u0453' # 0xAF -> CYRILLIC SMALL LETTER GJE + '\u221e' # 0xB0 -> INFINITY + '\xb1' # 0xB1 -> PLUS-MINUS SIGN + '\u2264' # 0xB2 -> LESS-THAN OR EQUAL TO + '\u2265' # 0xB3 -> GREATER-THAN OR EQUAL TO + '\u0456' # 0xB4 -> CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I + '\xb5' # 0xB5 -> MICRO SIGN + '\u0491' # 0xB6 -> CYRILLIC SMALL LETTER GHE WITH UPTURN + '\u0408' # 0xB7 -> CYRILLIC CAPITAL LETTER JE + '\u0404' # 0xB8 -> CYRILLIC CAPITAL LETTER UKRAINIAN IE + '\u0454' # 0xB9 -> CYRILLIC SMALL LETTER UKRAINIAN IE + '\u0407' # 0xBA -> CYRILLIC CAPITAL LETTER YI + '\u0457' # 0xBB -> CYRILLIC SMALL LETTER YI + '\u0409' # 0xBC -> CYRILLIC CAPITAL LETTER LJE + '\u0459' # 0xBD -> CYRILLIC SMALL LETTER LJE + '\u040a' # 0xBE -> CYRILLIC CAPITAL LETTER NJE + '\u045a' # 0xBF -> CYRILLIC SMALL LETTER NJE + '\u0458' # 0xC0 -> CYRILLIC SMALL LETTER JE + '\u0405' # 0xC1 -> CYRILLIC CAPITAL LETTER DZE + '\xac' # 0xC2 -> NOT SIGN + '\u221a' # 0xC3 -> SQUARE ROOT + '\u0192' # 0xC4 -> LATIN SMALL LETTER F WITH HOOK + '\u2248' # 0xC5 -> ALMOST EQUAL TO + '\u2206' # 0xC6 -> INCREMENT + '\xab' # 0xC7 -> LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + '\xbb' # 0xC8 -> RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + '\u2026' # 0xC9 -> HORIZONTAL ELLIPSIS + '\xa0' # 0xCA -> NO-BREAK SPACE + '\u040b' # 0xCB -> CYRILLIC CAPITAL LETTER TSHE + '\u045b' # 0xCC -> CYRILLIC SMALL LETTER TSHE + '\u040c' # 0xCD -> CYRILLIC CAPITAL LETTER KJE + '\u045c' # 0xCE -> CYRILLIC SMALL LETTER KJE + '\u0455' # 0xCF -> CYRILLIC SMALL LETTER DZE + '\u2013' # 0xD0 -> EN DASH + '\u2014' # 0xD1 -> EM DASH + '\u201c' # 0xD2 -> LEFT DOUBLE QUOTATION MARK + '\u201d' # 0xD3 -> RIGHT DOUBLE QUOTATION MARK + '\u2018' # 0xD4 -> LEFT SINGLE QUOTATION MARK + '\u2019' # 0xD5 -> RIGHT SINGLE QUOTATION MARK + '\xf7' # 0xD6 -> DIVISION SIGN + '\u201e' # 0xD7 -> DOUBLE LOW-9 QUOTATION MARK + '\u040e' # 0xD8 -> CYRILLIC CAPITAL LETTER SHORT U + '\u045e' # 0xD9 -> CYRILLIC SMALL LETTER SHORT U + '\u040f' # 0xDA -> CYRILLIC CAPITAL LETTER DZHE + '\u045f' # 0xDB -> CYRILLIC SMALL LETTER DZHE + '\u2116' # 0xDC -> NUMERO SIGN + '\u0401' # 0xDD -> CYRILLIC CAPITAL LETTER IO + '\u0451' # 0xDE -> CYRILLIC SMALL LETTER IO + '\u044f' # 0xDF -> CYRILLIC SMALL LETTER YA + '\u0430' # 0xE0 -> CYRILLIC SMALL LETTER A + '\u0431' # 0xE1 -> CYRILLIC SMALL LETTER BE + '\u0432' # 0xE2 -> CYRILLIC SMALL LETTER VE + '\u0433' # 0xE3 -> CYRILLIC SMALL LETTER GHE + '\u0434' # 0xE4 -> CYRILLIC SMALL LETTER DE + '\u0435' # 0xE5 -> CYRILLIC SMALL LETTER IE + '\u0436' # 0xE6 -> CYRILLIC SMALL LETTER ZHE + '\u0437' # 0xE7 -> CYRILLIC SMALL LETTER ZE + '\u0438' # 0xE8 -> CYRILLIC SMALL LETTER I + '\u0439' # 0xE9 -> CYRILLIC SMALL LETTER SHORT I + '\u043a' # 0xEA -> CYRILLIC SMALL LETTER KA + '\u043b' # 0xEB -> CYRILLIC SMALL LETTER EL + '\u043c' # 0xEC -> CYRILLIC SMALL LETTER EM + '\u043d' # 0xED -> CYRILLIC SMALL LETTER EN + '\u043e' # 0xEE -> CYRILLIC SMALL LETTER O + '\u043f' # 0xEF -> CYRILLIC SMALL LETTER PE + '\u0440' # 0xF0 -> CYRILLIC SMALL LETTER ER + '\u0441' # 0xF1 -> CYRILLIC SMALL LETTER ES + '\u0442' # 0xF2 -> CYRILLIC SMALL LETTER TE + '\u0443' # 0xF3 -> CYRILLIC SMALL LETTER U + '\u0444' # 0xF4 -> CYRILLIC SMALL LETTER EF + '\u0445' # 0xF5 -> CYRILLIC SMALL LETTER HA + '\u0446' # 0xF6 -> CYRILLIC SMALL LETTER TSE + '\u0447' # 0xF7 -> CYRILLIC SMALL LETTER CHE + '\u0448' # 0xF8 -> CYRILLIC SMALL LETTER SHA + '\u0449' # 0xF9 -> CYRILLIC SMALL LETTER SHCHA + '\u044a' # 0xFA -> CYRILLIC SMALL LETTER HARD SIGN + '\u044b' # 0xFB -> CYRILLIC SMALL LETTER YERU + '\u044c' # 0xFC -> CYRILLIC SMALL LETTER SOFT SIGN + '\u044d' # 0xFD -> CYRILLIC SMALL LETTER E + '\u044e' # 0xFE -> CYRILLIC SMALL LETTER YU + '\u20ac' # 0xFF -> EURO SIGN +) + +### Encoding table +encoding_table=codecs.charmap_build(decoding_table) diff --git a/env/Lib/encodings/mac_farsi.py b/env/Lib/encodings/mac_farsi.py new file mode 100644 index 0000000..e357d43 --- /dev/null +++ b/env/Lib/encodings/mac_farsi.py @@ -0,0 +1,307 @@ +""" 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 = ( + '\x00' # 0x00 -> CONTROL CHARACTER + '\x01' # 0x01 -> CONTROL CHARACTER + '\x02' # 0x02 -> CONTROL CHARACTER + '\x03' # 0x03 -> CONTROL CHARACTER + '\x04' # 0x04 -> CONTROL CHARACTER + '\x05' # 0x05 -> CONTROL CHARACTER + '\x06' # 0x06 -> CONTROL CHARACTER + '\x07' # 0x07 -> CONTROL CHARACTER + '\x08' # 0x08 -> CONTROL CHARACTER + '\t' # 0x09 -> CONTROL CHARACTER + '\n' # 0x0A -> CONTROL CHARACTER + '\x0b' # 0x0B -> CONTROL CHARACTER + '\x0c' # 0x0C -> CONTROL CHARACTER + '\r' # 0x0D -> CONTROL CHARACTER + '\x0e' # 0x0E -> CONTROL CHARACTER + '\x0f' # 0x0F -> CONTROL CHARACTER + '\x10' # 0x10 -> CONTROL CHARACTER + '\x11' # 0x11 -> CONTROL CHARACTER + '\x12' # 0x12 -> CONTROL CHARACTER + '\x13' # 0x13 -> CONTROL CHARACTER + '\x14' # 0x14 -> CONTROL CHARACTER + '\x15' # 0x15 -> CONTROL CHARACTER + '\x16' # 0x16 -> CONTROL CHARACTER + '\x17' # 0x17 -> CONTROL CHARACTER + '\x18' # 0x18 -> CONTROL CHARACTER + '\x19' # 0x19 -> CONTROL CHARACTER + '\x1a' # 0x1A -> CONTROL CHARACTER + '\x1b' # 0x1B -> CONTROL CHARACTER + '\x1c' # 0x1C -> CONTROL CHARACTER + '\x1d' # 0x1D -> CONTROL CHARACTER + '\x1e' # 0x1E -> CONTROL CHARACTER + '\x1f' # 0x1F -> CONTROL CHARACTER + ' ' # 0x20 -> SPACE, left-right + '!' # 0x21 -> EXCLAMATION MARK, left-right + '"' # 0x22 -> QUOTATION MARK, left-right + '#' # 0x23 -> NUMBER SIGN, left-right + '$' # 0x24 -> DOLLAR SIGN, left-right + '%' # 0x25 -> PERCENT SIGN, left-right + '&' # 0x26 -> AMPERSAND, left-right + "'" # 0x27 -> APOSTROPHE, left-right + '(' # 0x28 -> LEFT PARENTHESIS, left-right + ')' # 0x29 -> RIGHT PARENTHESIS, left-right + '*' # 0x2A -> ASTERISK, left-right + '+' # 0x2B -> PLUS SIGN, left-right + ',' # 0x2C -> COMMA, left-right; in Arabic-script context, displayed as 0x066C ARABIC THOUSANDS SEPARATOR + '-' # 0x2D -> HYPHEN-MINUS, left-right + '.' # 0x2E -> FULL STOP, left-right; in Arabic-script context, displayed as 0x066B ARABIC DECIMAL SEPARATOR + '/' # 0x2F -> SOLIDUS, left-right + '0' # 0x30 -> DIGIT ZERO; in Arabic-script context, displayed as 0x06F0 EXTENDED ARABIC-INDIC DIGIT ZERO + '1' # 0x31 -> DIGIT ONE; in Arabic-script context, displayed as 0x06F1 EXTENDED ARABIC-INDIC DIGIT ONE + '2' # 0x32 -> DIGIT TWO; in Arabic-script context, displayed as 0x06F2 EXTENDED ARABIC-INDIC DIGIT TWO + '3' # 0x33 -> DIGIT THREE; in Arabic-script context, displayed as 0x06F3 EXTENDED ARABIC-INDIC DIGIT THREE + '4' # 0x34 -> DIGIT FOUR; in Arabic-script context, displayed as 0x06F4 EXTENDED ARABIC-INDIC DIGIT FOUR + '5' # 0x35 -> DIGIT FIVE; in Arabic-script context, displayed as 0x06F5 EXTENDED ARABIC-INDIC DIGIT FIVE + '6' # 0x36 -> DIGIT SIX; in Arabic-script context, displayed as 0x06F6 EXTENDED ARABIC-INDIC DIGIT SIX + '7' # 0x37 -> DIGIT SEVEN; in Arabic-script context, displayed as 0x06F7 EXTENDED ARABIC-INDIC DIGIT SEVEN + '8' # 0x38 -> DIGIT EIGHT; in Arabic-script context, displayed as 0x06F8 EXTENDED ARABIC-INDIC DIGIT EIGHT + '9' # 0x39 -> DIGIT NINE; in Arabic-script context, displayed as 0x06F9 EXTENDED ARABIC-INDIC DIGIT NINE + ':' # 0x3A -> COLON, left-right + ';' # 0x3B -> SEMICOLON, left-right + '<' # 0x3C -> LESS-THAN SIGN, left-right + '=' # 0x3D -> EQUALS SIGN, left-right + '>' # 0x3E -> GREATER-THAN SIGN, left-right + '?' # 0x3F -> QUESTION MARK, left-right + '@' # 0x40 -> COMMERCIAL AT + 'A' # 0x41 -> LATIN CAPITAL LETTER A + 'B' # 0x42 -> LATIN CAPITAL LETTER B + 'C' # 0x43 -> LATIN CAPITAL LETTER C + 'D' # 0x44 -> LATIN CAPITAL LETTER D + 'E' # 0x45 -> LATIN CAPITAL LETTER E + 'F' # 0x46 -> LATIN CAPITAL LETTER F + 'G' # 0x47 -> LATIN CAPITAL LETTER G + 'H' # 0x48 -> LATIN CAPITAL LETTER H + 'I' # 0x49 -> LATIN CAPITAL LETTER I + 'J' # 0x4A -> LATIN CAPITAL LETTER J + 'K' # 0x4B -> LATIN CAPITAL LETTER K + 'L' # 0x4C -> LATIN CAPITAL LETTER L + 'M' # 0x4D -> LATIN CAPITAL LETTER M + 'N' # 0x4E -> LATIN CAPITAL LETTER N + 'O' # 0x4F -> LATIN CAPITAL LETTER O + 'P' # 0x50 -> LATIN CAPITAL LETTER P + 'Q' # 0x51 -> LATIN CAPITAL LETTER Q + 'R' # 0x52 -> LATIN CAPITAL LETTER R + 'S' # 0x53 -> LATIN CAPITAL LETTER S + 'T' # 0x54 -> LATIN CAPITAL LETTER T + 'U' # 0x55 -> LATIN CAPITAL LETTER U + 'V' # 0x56 -> LATIN CAPITAL LETTER V + 'W' # 0x57 -> LATIN CAPITAL LETTER W + 'X' # 0x58 -> LATIN CAPITAL LETTER X + 'Y' # 0x59 -> LATIN CAPITAL LETTER Y + 'Z' # 0x5A -> LATIN CAPITAL LETTER Z + '[' # 0x5B -> LEFT SQUARE BRACKET, left-right + '\\' # 0x5C -> REVERSE SOLIDUS, left-right + ']' # 0x5D -> RIGHT SQUARE BRACKET, left-right + '^' # 0x5E -> CIRCUMFLEX ACCENT, left-right + '_' # 0x5F -> LOW LINE, left-right + '`' # 0x60 -> GRAVE ACCENT + 'a' # 0x61 -> LATIN SMALL LETTER A + 'b' # 0x62 -> LATIN SMALL LETTER B + 'c' # 0x63 -> LATIN SMALL LETTER C + 'd' # 0x64 -> LATIN SMALL LETTER D + 'e' # 0x65 -> LATIN SMALL LETTER E + 'f' # 0x66 -> LATIN SMALL LETTER F + 'g' # 0x67 -> LATIN SMALL LETTER G + 'h' # 0x68 -> LATIN SMALL LETTER H + 'i' # 0x69 -> LATIN SMALL LETTER I + 'j' # 0x6A -> LATIN SMALL LETTER J + 'k' # 0x6B -> LATIN SMALL LETTER K + 'l' # 0x6C -> LATIN SMALL LETTER L + 'm' # 0x6D -> LATIN SMALL LETTER M + 'n' # 0x6E -> LATIN SMALL LETTER N + 'o' # 0x6F -> LATIN SMALL LETTER O + 'p' # 0x70 -> LATIN SMALL LETTER P + 'q' # 0x71 -> LATIN SMALL LETTER Q + 'r' # 0x72 -> LATIN SMALL LETTER R + 's' # 0x73 -> LATIN SMALL LETTER S + 't' # 0x74 -> LATIN SMALL LETTER T + 'u' # 0x75 -> LATIN SMALL LETTER U + 'v' # 0x76 -> LATIN SMALL LETTER V + 'w' # 0x77 -> LATIN SMALL LETTER W + 'x' # 0x78 -> LATIN SMALL LETTER X + 'y' # 0x79 -> LATIN SMALL LETTER Y + 'z' # 0x7A -> LATIN SMALL LETTER Z + '{' # 0x7B -> LEFT CURLY BRACKET, left-right + '|' # 0x7C -> VERTICAL LINE, left-right + '}' # 0x7D -> RIGHT CURLY BRACKET, left-right + '~' # 0x7E -> TILDE + '\x7f' # 0x7F -> CONTROL CHARACTER + '\xc4' # 0x80 -> LATIN CAPITAL LETTER A WITH DIAERESIS + '\xa0' # 0x81 -> NO-BREAK SPACE, right-left + '\xc7' # 0x82 -> LATIN CAPITAL LETTER C WITH CEDILLA + '\xc9' # 0x83 -> LATIN CAPITAL LETTER E WITH ACUTE + '\xd1' # 0x84 -> LATIN CAPITAL LETTER N WITH TILDE + '\xd6' # 0x85 -> LATIN CAPITAL LETTER O WITH DIAERESIS + '\xdc' # 0x86 -> LATIN CAPITAL LETTER U WITH DIAERESIS + '\xe1' # 0x87 -> LATIN SMALL LETTER A WITH ACUTE + '\xe0' # 0x88 -> LATIN SMALL LETTER A WITH GRAVE + '\xe2' # 0x89 -> LATIN SMALL LETTER A WITH CIRCUMFLEX + '\xe4' # 0x8A -> LATIN SMALL LETTER A WITH DIAERESIS + '\u06ba' # 0x8B -> ARABIC LETTER NOON GHUNNA + '\xab' # 0x8C -> LEFT-POINTING DOUBLE ANGLE QUOTATION MARK, right-left + '\xe7' # 0x8D -> LATIN SMALL LETTER C WITH CEDILLA + '\xe9' # 0x8E -> LATIN SMALL LETTER E WITH ACUTE + '\xe8' # 0x8F -> LATIN SMALL LETTER E WITH GRAVE + '\xea' # 0x90 -> LATIN SMALL LETTER E WITH CIRCUMFLEX + '\xeb' # 0x91 -> LATIN SMALL LETTER E WITH DIAERESIS + '\xed' # 0x92 -> LATIN SMALL LETTER I WITH ACUTE + '\u2026' # 0x93 -> HORIZONTAL ELLIPSIS, right-left + '\xee' # 0x94 -> LATIN SMALL LETTER I WITH CIRCUMFLEX + '\xef' # 0x95 -> LATIN SMALL LETTER I WITH DIAERESIS + '\xf1' # 0x96 -> LATIN SMALL LETTER N WITH TILDE + '\xf3' # 0x97 -> LATIN SMALL LETTER O WITH ACUTE + '\xbb' # 0x98 -> RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK, right-left + '\xf4' # 0x99 -> LATIN SMALL LETTER O WITH CIRCUMFLEX + '\xf6' # 0x9A -> LATIN SMALL LETTER O WITH DIAERESIS + '\xf7' # 0x9B -> DIVISION SIGN, right-left + '\xfa' # 0x9C -> LATIN SMALL LETTER U WITH ACUTE + '\xf9' # 0x9D -> LATIN SMALL LETTER U WITH GRAVE + '\xfb' # 0x9E -> LATIN SMALL LETTER U WITH CIRCUMFLEX + '\xfc' # 0x9F -> LATIN SMALL LETTER U WITH DIAERESIS + ' ' # 0xA0 -> SPACE, right-left + '!' # 0xA1 -> EXCLAMATION MARK, right-left + '"' # 0xA2 -> QUOTATION MARK, right-left + '#' # 0xA3 -> NUMBER SIGN, right-left + '$' # 0xA4 -> DOLLAR SIGN, right-left + '\u066a' # 0xA5 -> ARABIC PERCENT SIGN + '&' # 0xA6 -> AMPERSAND, right-left + "'" # 0xA7 -> APOSTROPHE, right-left + '(' # 0xA8 -> LEFT PARENTHESIS, right-left + ')' # 0xA9 -> RIGHT PARENTHESIS, right-left + '*' # 0xAA -> ASTERISK, right-left + '+' # 0xAB -> PLUS SIGN, right-left + '\u060c' # 0xAC -> ARABIC COMMA + '-' # 0xAD -> HYPHEN-MINUS, right-left + '.' # 0xAE -> FULL STOP, right-left + '/' # 0xAF -> SOLIDUS, right-left + '\u06f0' # 0xB0 -> EXTENDED ARABIC-INDIC DIGIT ZERO, right-left (need override) + '\u06f1' # 0xB1 -> EXTENDED ARABIC-INDIC DIGIT ONE, right-left (need override) + '\u06f2' # 0xB2 -> EXTENDED ARABIC-INDIC DIGIT TWO, right-left (need override) + '\u06f3' # 0xB3 -> EXTENDED ARABIC-INDIC DIGIT THREE, right-left (need override) + '\u06f4' # 0xB4 -> EXTENDED ARABIC-INDIC DIGIT FOUR, right-left (need override) + '\u06f5' # 0xB5 -> EXTENDED ARABIC-INDIC DIGIT FIVE, right-left (need override) + '\u06f6' # 0xB6 -> EXTENDED ARABIC-INDIC DIGIT SIX, right-left (need override) + '\u06f7' # 0xB7 -> EXTENDED ARABIC-INDIC DIGIT SEVEN, right-left (need override) + '\u06f8' # 0xB8 -> EXTENDED ARABIC-INDIC DIGIT EIGHT, right-left (need override) + '\u06f9' # 0xB9 -> EXTENDED ARABIC-INDIC DIGIT NINE, right-left (need override) + ':' # 0xBA -> COLON, right-left + '\u061b' # 0xBB -> ARABIC SEMICOLON + '<' # 0xBC -> LESS-THAN SIGN, right-left + '=' # 0xBD -> EQUALS SIGN, right-left + '>' # 0xBE -> GREATER-THAN SIGN, right-left + '\u061f' # 0xBF -> ARABIC QUESTION MARK + '\u274a' # 0xC0 -> EIGHT TEARDROP-SPOKED PROPELLER ASTERISK, right-left + '\u0621' # 0xC1 -> ARABIC LETTER HAMZA + '\u0622' # 0xC2 -> ARABIC LETTER ALEF WITH MADDA ABOVE + '\u0623' # 0xC3 -> ARABIC LETTER ALEF WITH HAMZA ABOVE + '\u0624' # 0xC4 -> ARABIC LETTER WAW WITH HAMZA ABOVE + '\u0625' # 0xC5 -> ARABIC LETTER ALEF WITH HAMZA BELOW + '\u0626' # 0xC6 -> ARABIC LETTER YEH WITH HAMZA ABOVE + '\u0627' # 0xC7 -> ARABIC LETTER ALEF + '\u0628' # 0xC8 -> ARABIC LETTER BEH + '\u0629' # 0xC9 -> ARABIC LETTER TEH MARBUTA + '\u062a' # 0xCA -> ARABIC LETTER TEH + '\u062b' # 0xCB -> ARABIC LETTER THEH + '\u062c' # 0xCC -> ARABIC LETTER JEEM + '\u062d' # 0xCD -> ARABIC LETTER HAH + '\u062e' # 0xCE -> ARABIC LETTER KHAH + '\u062f' # 0xCF -> ARABIC LETTER DAL + '\u0630' # 0xD0 -> ARABIC LETTER THAL + '\u0631' # 0xD1 -> ARABIC LETTER REH + '\u0632' # 0xD2 -> ARABIC LETTER ZAIN + '\u0633' # 0xD3 -> ARABIC LETTER SEEN + '\u0634' # 0xD4 -> ARABIC LETTER SHEEN + '\u0635' # 0xD5 -> ARABIC LETTER SAD + '\u0636' # 0xD6 -> ARABIC LETTER DAD + '\u0637' # 0xD7 -> ARABIC LETTER TAH + '\u0638' # 0xD8 -> ARABIC LETTER ZAH + '\u0639' # 0xD9 -> ARABIC LETTER AIN + '\u063a' # 0xDA -> ARABIC LETTER GHAIN + '[' # 0xDB -> LEFT SQUARE BRACKET, right-left + '\\' # 0xDC -> REVERSE SOLIDUS, right-left + ']' # 0xDD -> RIGHT SQUARE BRACKET, right-left + '^' # 0xDE -> CIRCUMFLEX ACCENT, right-left + '_' # 0xDF -> LOW LINE, right-left + '\u0640' # 0xE0 -> ARABIC TATWEEL + '\u0641' # 0xE1 -> ARABIC LETTER FEH + '\u0642' # 0xE2 -> ARABIC LETTER QAF + '\u0643' # 0xE3 -> ARABIC LETTER KAF + '\u0644' # 0xE4 -> ARABIC LETTER LAM + '\u0645' # 0xE5 -> ARABIC LETTER MEEM + '\u0646' # 0xE6 -> ARABIC LETTER NOON + '\u0647' # 0xE7 -> ARABIC LETTER HEH + '\u0648' # 0xE8 -> ARABIC LETTER WAW + '\u0649' # 0xE9 -> ARABIC LETTER ALEF MAKSURA + '\u064a' # 0xEA -> ARABIC LETTER YEH + '\u064b' # 0xEB -> ARABIC FATHATAN + '\u064c' # 0xEC -> ARABIC DAMMATAN + '\u064d' # 0xED -> ARABIC KASRATAN + '\u064e' # 0xEE -> ARABIC FATHA + '\u064f' # 0xEF -> ARABIC DAMMA + '\u0650' # 0xF0 -> ARABIC KASRA + '\u0651' # 0xF1 -> ARABIC SHADDA + '\u0652' # 0xF2 -> ARABIC SUKUN + '\u067e' # 0xF3 -> ARABIC LETTER PEH + '\u0679' # 0xF4 -> ARABIC LETTER TTEH + '\u0686' # 0xF5 -> ARABIC LETTER TCHEH + '\u06d5' # 0xF6 -> ARABIC LETTER AE + '\u06a4' # 0xF7 -> ARABIC LETTER VEH + '\u06af' # 0xF8 -> ARABIC LETTER GAF + '\u0688' # 0xF9 -> ARABIC LETTER DDAL + '\u0691' # 0xFA -> ARABIC LETTER RREH + '{' # 0xFB -> LEFT CURLY BRACKET, right-left + '|' # 0xFC -> VERTICAL LINE, right-left + '}' # 0xFD -> RIGHT CURLY BRACKET, right-left + '\u0698' # 0xFE -> ARABIC LETTER JEH + '\u06d2' # 0xFF -> ARABIC LETTER YEH BARREE +) + +### Encoding table +encoding_table=codecs.charmap_build(decoding_table) diff --git a/env/Lib/encodings/mac_greek.py b/env/Lib/encodings/mac_greek.py new file mode 100644 index 0000000..d3d0c4f --- /dev/null +++ b/env/Lib/encodings/mac_greek.py @@ -0,0 +1,307 @@ +""" Python Character Mapping Codec mac_greek generated from 'MAPPINGS/VENDORS/APPLE/GREEK.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-greek', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) + + +### Decoding Table + +decoding_table = ( + '\x00' # 0x00 -> CONTROL CHARACTER + '\x01' # 0x01 -> CONTROL CHARACTER + '\x02' # 0x02 -> CONTROL CHARACTER + '\x03' # 0x03 -> CONTROL CHARACTER + '\x04' # 0x04 -> CONTROL CHARACTER + '\x05' # 0x05 -> CONTROL CHARACTER + '\x06' # 0x06 -> CONTROL CHARACTER + '\x07' # 0x07 -> CONTROL CHARACTER + '\x08' # 0x08 -> CONTROL CHARACTER + '\t' # 0x09 -> CONTROL CHARACTER + '\n' # 0x0A -> CONTROL CHARACTER + '\x0b' # 0x0B -> CONTROL CHARACTER + '\x0c' # 0x0C -> CONTROL CHARACTER + '\r' # 0x0D -> CONTROL CHARACTER + '\x0e' # 0x0E -> CONTROL CHARACTER + '\x0f' # 0x0F -> CONTROL CHARACTER + '\x10' # 0x10 -> CONTROL CHARACTER + '\x11' # 0x11 -> CONTROL CHARACTER + '\x12' # 0x12 -> CONTROL CHARACTER + '\x13' # 0x13 -> CONTROL CHARACTER + '\x14' # 0x14 -> CONTROL CHARACTER + '\x15' # 0x15 -> CONTROL CHARACTER + '\x16' # 0x16 -> CONTROL CHARACTER + '\x17' # 0x17 -> CONTROL CHARACTER + '\x18' # 0x18 -> CONTROL CHARACTER + '\x19' # 0x19 -> CONTROL CHARACTER + '\x1a' # 0x1A -> CONTROL CHARACTER + '\x1b' # 0x1B -> CONTROL CHARACTER + '\x1c' # 0x1C -> CONTROL CHARACTER + '\x1d' # 0x1D -> CONTROL CHARACTER + '\x1e' # 0x1E -> CONTROL CHARACTER + '\x1f' # 0x1F -> CONTROL CHARACTER + ' ' # 0x20 -> SPACE + '!' # 0x21 -> EXCLAMATION MARK + '"' # 0x22 -> QUOTATION MARK + '#' # 0x23 -> NUMBER SIGN + '$' # 0x24 -> DOLLAR SIGN + '%' # 0x25 -> PERCENT SIGN + '&' # 0x26 -> AMPERSAND + "'" # 0x27 -> APOSTROPHE + '(' # 0x28 -> LEFT PARENTHESIS + ')' # 0x29 -> RIGHT PARENTHESIS + '*' # 0x2A -> ASTERISK + '+' # 0x2B -> PLUS SIGN + ',' # 0x2C -> COMMA + '-' # 0x2D -> HYPHEN-MINUS + '.' # 0x2E -> FULL STOP + '/' # 0x2F -> SOLIDUS + '0' # 0x30 -> DIGIT ZERO + '1' # 0x31 -> DIGIT ONE + '2' # 0x32 -> DIGIT TWO + '3' # 0x33 -> DIGIT THREE + '4' # 0x34 -> DIGIT FOUR + '5' # 0x35 -> DIGIT FIVE + '6' # 0x36 -> DIGIT SIX + '7' # 0x37 -> DIGIT SEVEN + '8' # 0x38 -> DIGIT EIGHT + '9' # 0x39 -> DIGIT NINE + ':' # 0x3A -> COLON + ';' # 0x3B -> SEMICOLON + '<' # 0x3C -> LESS-THAN SIGN + '=' # 0x3D -> EQUALS SIGN + '>' # 0x3E -> GREATER-THAN SIGN + '?' # 0x3F -> QUESTION MARK + '@' # 0x40 -> COMMERCIAL AT + 'A' # 0x41 -> LATIN CAPITAL LETTER A + 'B' # 0x42 -> LATIN CAPITAL LETTER B + 'C' # 0x43 -> LATIN CAPITAL LETTER C + 'D' # 0x44 -> LATIN CAPITAL LETTER D + 'E' # 0x45 -> LATIN CAPITAL LETTER E + 'F' # 0x46 -> LATIN CAPITAL LETTER F + 'G' # 0x47 -> LATIN CAPITAL LETTER G + 'H' # 0x48 -> LATIN CAPITAL LETTER H + 'I' # 0x49 -> LATIN CAPITAL LETTER I + 'J' # 0x4A -> LATIN CAPITAL LETTER J + 'K' # 0x4B -> LATIN CAPITAL LETTER K + 'L' # 0x4C -> LATIN CAPITAL LETTER L + 'M' # 0x4D -> LATIN CAPITAL LETTER M + 'N' # 0x4E -> LATIN CAPITAL LETTER N + 'O' # 0x4F -> LATIN CAPITAL LETTER O + 'P' # 0x50 -> LATIN CAPITAL LETTER P + 'Q' # 0x51 -> LATIN CAPITAL LETTER Q + 'R' # 0x52 -> LATIN CAPITAL LETTER R + 'S' # 0x53 -> LATIN CAPITAL LETTER S + 'T' # 0x54 -> LATIN CAPITAL LETTER T + 'U' # 0x55 -> LATIN CAPITAL LETTER U + 'V' # 0x56 -> LATIN CAPITAL LETTER V + 'W' # 0x57 -> LATIN CAPITAL LETTER W + 'X' # 0x58 -> LATIN CAPITAL LETTER X + 'Y' # 0x59 -> LATIN CAPITAL LETTER Y + 'Z' # 0x5A -> LATIN CAPITAL LETTER Z + '[' # 0x5B -> LEFT SQUARE BRACKET + '\\' # 0x5C -> REVERSE SOLIDUS + ']' # 0x5D -> RIGHT SQUARE BRACKET + '^' # 0x5E -> CIRCUMFLEX ACCENT + '_' # 0x5F -> LOW LINE + '`' # 0x60 -> GRAVE ACCENT + 'a' # 0x61 -> LATIN SMALL LETTER A + 'b' # 0x62 -> LATIN SMALL LETTER B + 'c' # 0x63 -> LATIN SMALL LETTER C + 'd' # 0x64 -> LATIN SMALL LETTER D + 'e' # 0x65 -> LATIN SMALL LETTER E + 'f' # 0x66 -> LATIN SMALL LETTER F + 'g' # 0x67 -> LATIN SMALL LETTER G + 'h' # 0x68 -> LATIN SMALL LETTER H + 'i' # 0x69 -> LATIN SMALL LETTER I + 'j' # 0x6A -> LATIN SMALL LETTER J + 'k' # 0x6B -> LATIN SMALL LETTER K + 'l' # 0x6C -> LATIN SMALL LETTER L + 'm' # 0x6D -> LATIN SMALL LETTER M + 'n' # 0x6E -> LATIN SMALL LETTER N + 'o' # 0x6F -> LATIN SMALL LETTER O + 'p' # 0x70 -> LATIN SMALL LETTER P + 'q' # 0x71 -> LATIN SMALL LETTER Q + 'r' # 0x72 -> LATIN SMALL LETTER R + 's' # 0x73 -> LATIN SMALL LETTER S + 't' # 0x74 -> LATIN SMALL LETTER T + 'u' # 0x75 -> LATIN SMALL LETTER U + 'v' # 0x76 -> LATIN SMALL LETTER V + 'w' # 0x77 -> LATIN SMALL LETTER W + 'x' # 0x78 -> LATIN SMALL LETTER X + 'y' # 0x79 -> LATIN SMALL LETTER Y + 'z' # 0x7A -> LATIN SMALL LETTER Z + '{' # 0x7B -> LEFT CURLY BRACKET + '|' # 0x7C -> VERTICAL LINE + '}' # 0x7D -> RIGHT CURLY BRACKET + '~' # 0x7E -> TILDE + '\x7f' # 0x7F -> CONTROL CHARACTER + '\xc4' # 0x80 -> LATIN CAPITAL LETTER A WITH DIAERESIS + '\xb9' # 0x81 -> SUPERSCRIPT ONE + '\xb2' # 0x82 -> SUPERSCRIPT TWO + '\xc9' # 0x83 -> LATIN CAPITAL LETTER E WITH ACUTE + '\xb3' # 0x84 -> SUPERSCRIPT THREE + '\xd6' # 0x85 -> LATIN CAPITAL LETTER O WITH DIAERESIS + '\xdc' # 0x86 -> LATIN CAPITAL LETTER U WITH DIAERESIS + '\u0385' # 0x87 -> GREEK DIALYTIKA TONOS + '\xe0' # 0x88 -> LATIN SMALL LETTER A WITH GRAVE + '\xe2' # 0x89 -> LATIN SMALL LETTER A WITH CIRCUMFLEX + '\xe4' # 0x8A -> LATIN SMALL LETTER A WITH DIAERESIS + '\u0384' # 0x8B -> GREEK TONOS + '\xa8' # 0x8C -> DIAERESIS + '\xe7' # 0x8D -> LATIN SMALL LETTER C WITH CEDILLA + '\xe9' # 0x8E -> LATIN SMALL LETTER E WITH ACUTE + '\xe8' # 0x8F -> LATIN SMALL LETTER E WITH GRAVE + '\xea' # 0x90 -> LATIN SMALL LETTER E WITH CIRCUMFLEX + '\xeb' # 0x91 -> LATIN SMALL LETTER E WITH DIAERESIS + '\xa3' # 0x92 -> POUND SIGN + '\u2122' # 0x93 -> TRADE MARK SIGN + '\xee' # 0x94 -> LATIN SMALL LETTER I WITH CIRCUMFLEX + '\xef' # 0x95 -> LATIN SMALL LETTER I WITH DIAERESIS + '\u2022' # 0x96 -> BULLET + '\xbd' # 0x97 -> VULGAR FRACTION ONE HALF + '\u2030' # 0x98 -> PER MILLE SIGN + '\xf4' # 0x99 -> LATIN SMALL LETTER O WITH CIRCUMFLEX + '\xf6' # 0x9A -> LATIN SMALL LETTER O WITH DIAERESIS + '\xa6' # 0x9B -> BROKEN BAR + '\u20ac' # 0x9C -> EURO SIGN # before Mac OS 9.2.2, was SOFT HYPHEN + '\xf9' # 0x9D -> LATIN SMALL LETTER U WITH GRAVE + '\xfb' # 0x9E -> LATIN SMALL LETTER U WITH CIRCUMFLEX + '\xfc' # 0x9F -> LATIN SMALL LETTER U WITH DIAERESIS + '\u2020' # 0xA0 -> DAGGER + '\u0393' # 0xA1 -> GREEK CAPITAL LETTER GAMMA + '\u0394' # 0xA2 -> GREEK CAPITAL LETTER DELTA + '\u0398' # 0xA3 -> GREEK CAPITAL LETTER THETA + '\u039b' # 0xA4 -> GREEK CAPITAL LETTER LAMDA + '\u039e' # 0xA5 -> GREEK CAPITAL LETTER XI + '\u03a0' # 0xA6 -> GREEK CAPITAL LETTER PI + '\xdf' # 0xA7 -> LATIN SMALL LETTER SHARP S + '\xae' # 0xA8 -> REGISTERED SIGN + '\xa9' # 0xA9 -> COPYRIGHT SIGN + '\u03a3' # 0xAA -> GREEK CAPITAL LETTER SIGMA + '\u03aa' # 0xAB -> GREEK CAPITAL LETTER IOTA WITH DIALYTIKA + '\xa7' # 0xAC -> SECTION SIGN + '\u2260' # 0xAD -> NOT EQUAL TO + '\xb0' # 0xAE -> DEGREE SIGN + '\xb7' # 0xAF -> MIDDLE DOT + '\u0391' # 0xB0 -> GREEK CAPITAL LETTER ALPHA + '\xb1' # 0xB1 -> PLUS-MINUS SIGN + '\u2264' # 0xB2 -> LESS-THAN OR EQUAL TO + '\u2265' # 0xB3 -> GREATER-THAN OR EQUAL TO + '\xa5' # 0xB4 -> YEN SIGN + '\u0392' # 0xB5 -> GREEK CAPITAL LETTER BETA + '\u0395' # 0xB6 -> GREEK CAPITAL LETTER EPSILON + '\u0396' # 0xB7 -> GREEK CAPITAL LETTER ZETA + '\u0397' # 0xB8 -> GREEK CAPITAL LETTER ETA + '\u0399' # 0xB9 -> GREEK CAPITAL LETTER IOTA + '\u039a' # 0xBA -> GREEK CAPITAL LETTER KAPPA + '\u039c' # 0xBB -> GREEK CAPITAL LETTER MU + '\u03a6' # 0xBC -> GREEK CAPITAL LETTER PHI + '\u03ab' # 0xBD -> GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA + '\u03a8' # 0xBE -> GREEK CAPITAL LETTER PSI + '\u03a9' # 0xBF -> GREEK CAPITAL LETTER OMEGA + '\u03ac' # 0xC0 -> GREEK SMALL LETTER ALPHA WITH TONOS + '\u039d' # 0xC1 -> GREEK CAPITAL LETTER NU + '\xac' # 0xC2 -> NOT SIGN + '\u039f' # 0xC3 -> GREEK CAPITAL LETTER OMICRON + '\u03a1' # 0xC4 -> GREEK CAPITAL LETTER RHO + '\u2248' # 0xC5 -> ALMOST EQUAL TO + '\u03a4' # 0xC6 -> GREEK CAPITAL LETTER TAU + '\xab' # 0xC7 -> LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + '\xbb' # 0xC8 -> RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + '\u2026' # 0xC9 -> HORIZONTAL ELLIPSIS + '\xa0' # 0xCA -> NO-BREAK SPACE + '\u03a5' # 0xCB -> GREEK CAPITAL LETTER UPSILON + '\u03a7' # 0xCC -> GREEK CAPITAL LETTER CHI + '\u0386' # 0xCD -> GREEK CAPITAL LETTER ALPHA WITH TONOS + '\u0388' # 0xCE -> GREEK CAPITAL LETTER EPSILON WITH TONOS + '\u0153' # 0xCF -> LATIN SMALL LIGATURE OE + '\u2013' # 0xD0 -> EN DASH + '\u2015' # 0xD1 -> HORIZONTAL BAR + '\u201c' # 0xD2 -> LEFT DOUBLE QUOTATION MARK + '\u201d' # 0xD3 -> RIGHT DOUBLE QUOTATION MARK + '\u2018' # 0xD4 -> LEFT SINGLE QUOTATION MARK + '\u2019' # 0xD5 -> RIGHT SINGLE QUOTATION MARK + '\xf7' # 0xD6 -> DIVISION SIGN + '\u0389' # 0xD7 -> GREEK CAPITAL LETTER ETA WITH TONOS + '\u038a' # 0xD8 -> GREEK CAPITAL LETTER IOTA WITH TONOS + '\u038c' # 0xD9 -> GREEK CAPITAL LETTER OMICRON WITH TONOS + '\u038e' # 0xDA -> GREEK CAPITAL LETTER UPSILON WITH TONOS + '\u03ad' # 0xDB -> GREEK SMALL LETTER EPSILON WITH TONOS + '\u03ae' # 0xDC -> GREEK SMALL LETTER ETA WITH TONOS + '\u03af' # 0xDD -> GREEK SMALL LETTER IOTA WITH TONOS + '\u03cc' # 0xDE -> GREEK SMALL LETTER OMICRON WITH TONOS + '\u038f' # 0xDF -> GREEK CAPITAL LETTER OMEGA WITH TONOS + '\u03cd' # 0xE0 -> GREEK SMALL LETTER UPSILON WITH TONOS + '\u03b1' # 0xE1 -> GREEK SMALL LETTER ALPHA + '\u03b2' # 0xE2 -> GREEK SMALL LETTER BETA + '\u03c8' # 0xE3 -> GREEK SMALL LETTER PSI + '\u03b4' # 0xE4 -> GREEK SMALL LETTER DELTA + '\u03b5' # 0xE5 -> GREEK SMALL LETTER EPSILON + '\u03c6' # 0xE6 -> GREEK SMALL LETTER PHI + '\u03b3' # 0xE7 -> GREEK SMALL LETTER GAMMA + '\u03b7' # 0xE8 -> GREEK SMALL LETTER ETA + '\u03b9' # 0xE9 -> GREEK SMALL LETTER IOTA + '\u03be' # 0xEA -> GREEK SMALL LETTER XI + '\u03ba' # 0xEB -> GREEK SMALL LETTER KAPPA + '\u03bb' # 0xEC -> GREEK SMALL LETTER LAMDA + '\u03bc' # 0xED -> GREEK SMALL LETTER MU + '\u03bd' # 0xEE -> GREEK SMALL LETTER NU + '\u03bf' # 0xEF -> GREEK SMALL LETTER OMICRON + '\u03c0' # 0xF0 -> GREEK SMALL LETTER PI + '\u03ce' # 0xF1 -> GREEK SMALL LETTER OMEGA WITH TONOS + '\u03c1' # 0xF2 -> GREEK SMALL LETTER RHO + '\u03c3' # 0xF3 -> GREEK SMALL LETTER SIGMA + '\u03c4' # 0xF4 -> GREEK SMALL LETTER TAU + '\u03b8' # 0xF5 -> GREEK SMALL LETTER THETA + '\u03c9' # 0xF6 -> GREEK SMALL LETTER OMEGA + '\u03c2' # 0xF7 -> GREEK SMALL LETTER FINAL SIGMA + '\u03c7' # 0xF8 -> GREEK SMALL LETTER CHI + '\u03c5' # 0xF9 -> GREEK SMALL LETTER UPSILON + '\u03b6' # 0xFA -> GREEK SMALL LETTER ZETA + '\u03ca' # 0xFB -> GREEK SMALL LETTER IOTA WITH DIALYTIKA + '\u03cb' # 0xFC -> GREEK SMALL LETTER UPSILON WITH DIALYTIKA + '\u0390' # 0xFD -> GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS + '\u03b0' # 0xFE -> GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS + '\xad' # 0xFF -> SOFT HYPHEN # before Mac OS 9.2.2, was undefined +) + +### Encoding table +encoding_table=codecs.charmap_build(decoding_table) diff --git a/env/Lib/encodings/mac_iceland.py b/env/Lib/encodings/mac_iceland.py new file mode 100644 index 0000000..add10f4 --- /dev/null +++ b/env/Lib/encodings/mac_iceland.py @@ -0,0 +1,307 @@ +""" 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 = ( + '\x00' # 0x00 -> CONTROL CHARACTER + '\x01' # 0x01 -> CONTROL CHARACTER + '\x02' # 0x02 -> CONTROL CHARACTER + '\x03' # 0x03 -> CONTROL CHARACTER + '\x04' # 0x04 -> CONTROL CHARACTER + '\x05' # 0x05 -> CONTROL CHARACTER + '\x06' # 0x06 -> CONTROL CHARACTER + '\x07' # 0x07 -> CONTROL CHARACTER + '\x08' # 0x08 -> CONTROL CHARACTER + '\t' # 0x09 -> CONTROL CHARACTER + '\n' # 0x0A -> CONTROL CHARACTER + '\x0b' # 0x0B -> CONTROL CHARACTER + '\x0c' # 0x0C -> CONTROL CHARACTER + '\r' # 0x0D -> CONTROL CHARACTER + '\x0e' # 0x0E -> CONTROL CHARACTER + '\x0f' # 0x0F -> CONTROL CHARACTER + '\x10' # 0x10 -> CONTROL CHARACTER + '\x11' # 0x11 -> CONTROL CHARACTER + '\x12' # 0x12 -> CONTROL CHARACTER + '\x13' # 0x13 -> CONTROL CHARACTER + '\x14' # 0x14 -> CONTROL CHARACTER + '\x15' # 0x15 -> CONTROL CHARACTER + '\x16' # 0x16 -> CONTROL CHARACTER + '\x17' # 0x17 -> CONTROL CHARACTER + '\x18' # 0x18 -> CONTROL CHARACTER + '\x19' # 0x19 -> CONTROL CHARACTER + '\x1a' # 0x1A -> CONTROL CHARACTER + '\x1b' # 0x1B -> CONTROL CHARACTER + '\x1c' # 0x1C -> CONTROL CHARACTER + '\x1d' # 0x1D -> CONTROL CHARACTER + '\x1e' # 0x1E -> CONTROL CHARACTER + '\x1f' # 0x1F -> CONTROL CHARACTER + ' ' # 0x20 -> SPACE + '!' # 0x21 -> EXCLAMATION MARK + '"' # 0x22 -> QUOTATION MARK + '#' # 0x23 -> NUMBER SIGN + '$' # 0x24 -> DOLLAR SIGN + '%' # 0x25 -> PERCENT SIGN + '&' # 0x26 -> AMPERSAND + "'" # 0x27 -> APOSTROPHE + '(' # 0x28 -> LEFT PARENTHESIS + ')' # 0x29 -> RIGHT PARENTHESIS + '*' # 0x2A -> ASTERISK + '+' # 0x2B -> PLUS SIGN + ',' # 0x2C -> COMMA + '-' # 0x2D -> HYPHEN-MINUS + '.' # 0x2E -> FULL STOP + '/' # 0x2F -> SOLIDUS + '0' # 0x30 -> DIGIT ZERO + '1' # 0x31 -> DIGIT ONE + '2' # 0x32 -> DIGIT TWO + '3' # 0x33 -> DIGIT THREE + '4' # 0x34 -> DIGIT FOUR + '5' # 0x35 -> DIGIT FIVE + '6' # 0x36 -> DIGIT SIX + '7' # 0x37 -> DIGIT SEVEN + '8' # 0x38 -> DIGIT EIGHT + '9' # 0x39 -> DIGIT NINE + ':' # 0x3A -> COLON + ';' # 0x3B -> SEMICOLON + '<' # 0x3C -> LESS-THAN SIGN + '=' # 0x3D -> EQUALS SIGN + '>' # 0x3E -> GREATER-THAN SIGN + '?' # 0x3F -> QUESTION MARK + '@' # 0x40 -> COMMERCIAL AT + 'A' # 0x41 -> LATIN CAPITAL LETTER A + 'B' # 0x42 -> LATIN CAPITAL LETTER B + 'C' # 0x43 -> LATIN CAPITAL LETTER C + 'D' # 0x44 -> LATIN CAPITAL LETTER D + 'E' # 0x45 -> LATIN CAPITAL LETTER E + 'F' # 0x46 -> LATIN CAPITAL LETTER F + 'G' # 0x47 -> LATIN CAPITAL LETTER G + 'H' # 0x48 -> LATIN CAPITAL LETTER H + 'I' # 0x49 -> LATIN CAPITAL LETTER I + 'J' # 0x4A -> LATIN CAPITAL LETTER J + 'K' # 0x4B -> LATIN CAPITAL LETTER K + 'L' # 0x4C -> LATIN CAPITAL LETTER L + 'M' # 0x4D -> LATIN CAPITAL LETTER M + 'N' # 0x4E -> LATIN CAPITAL LETTER N + 'O' # 0x4F -> LATIN CAPITAL LETTER O + 'P' # 0x50 -> LATIN CAPITAL LETTER P + 'Q' # 0x51 -> LATIN CAPITAL LETTER Q + 'R' # 0x52 -> LATIN CAPITAL LETTER R + 'S' # 0x53 -> LATIN CAPITAL LETTER S + 'T' # 0x54 -> LATIN CAPITAL LETTER T + 'U' # 0x55 -> LATIN CAPITAL LETTER U + 'V' # 0x56 -> LATIN CAPITAL LETTER V + 'W' # 0x57 -> LATIN CAPITAL LETTER W + 'X' # 0x58 -> LATIN CAPITAL LETTER X + 'Y' # 0x59 -> LATIN CAPITAL LETTER Y + 'Z' # 0x5A -> LATIN CAPITAL LETTER Z + '[' # 0x5B -> LEFT SQUARE BRACKET + '\\' # 0x5C -> REVERSE SOLIDUS + ']' # 0x5D -> RIGHT SQUARE BRACKET + '^' # 0x5E -> CIRCUMFLEX ACCENT + '_' # 0x5F -> LOW LINE + '`' # 0x60 -> GRAVE ACCENT + 'a' # 0x61 -> LATIN SMALL LETTER A + 'b' # 0x62 -> LATIN SMALL LETTER B + 'c' # 0x63 -> LATIN SMALL LETTER C + 'd' # 0x64 -> LATIN SMALL LETTER D + 'e' # 0x65 -> LATIN SMALL LETTER E + 'f' # 0x66 -> LATIN SMALL LETTER F + 'g' # 0x67 -> LATIN SMALL LETTER G + 'h' # 0x68 -> LATIN SMALL LETTER H + 'i' # 0x69 -> LATIN SMALL LETTER I + 'j' # 0x6A -> LATIN SMALL LETTER J + 'k' # 0x6B -> LATIN SMALL LETTER K + 'l' # 0x6C -> LATIN SMALL LETTER L + 'm' # 0x6D -> LATIN SMALL LETTER M + 'n' # 0x6E -> LATIN SMALL LETTER N + 'o' # 0x6F -> LATIN SMALL LETTER O + 'p' # 0x70 -> LATIN SMALL LETTER P + 'q' # 0x71 -> LATIN SMALL LETTER Q + 'r' # 0x72 -> LATIN SMALL LETTER R + 's' # 0x73 -> LATIN SMALL LETTER S + 't' # 0x74 -> LATIN SMALL LETTER T + 'u' # 0x75 -> LATIN SMALL LETTER U + 'v' # 0x76 -> LATIN SMALL LETTER V + 'w' # 0x77 -> LATIN SMALL LETTER W + 'x' # 0x78 -> LATIN SMALL LETTER X + 'y' # 0x79 -> LATIN SMALL LETTER Y + 'z' # 0x7A -> LATIN SMALL LETTER Z + '{' # 0x7B -> LEFT CURLY BRACKET + '|' # 0x7C -> VERTICAL LINE + '}' # 0x7D -> RIGHT CURLY BRACKET + '~' # 0x7E -> TILDE + '\x7f' # 0x7F -> CONTROL CHARACTER + '\xc4' # 0x80 -> LATIN CAPITAL LETTER A WITH DIAERESIS + '\xc5' # 0x81 -> LATIN CAPITAL LETTER A WITH RING ABOVE + '\xc7' # 0x82 -> LATIN CAPITAL LETTER C WITH CEDILLA + '\xc9' # 0x83 -> LATIN CAPITAL LETTER E WITH ACUTE + '\xd1' # 0x84 -> LATIN CAPITAL LETTER N WITH TILDE + '\xd6' # 0x85 -> LATIN CAPITAL LETTER O WITH DIAERESIS + '\xdc' # 0x86 -> LATIN CAPITAL LETTER U WITH DIAERESIS + '\xe1' # 0x87 -> LATIN SMALL LETTER A WITH ACUTE + '\xe0' # 0x88 -> LATIN SMALL LETTER A WITH GRAVE + '\xe2' # 0x89 -> LATIN SMALL LETTER A WITH CIRCUMFLEX + '\xe4' # 0x8A -> LATIN SMALL LETTER A WITH DIAERESIS + '\xe3' # 0x8B -> LATIN SMALL LETTER A WITH TILDE + '\xe5' # 0x8C -> LATIN SMALL LETTER A WITH RING ABOVE + '\xe7' # 0x8D -> LATIN SMALL LETTER C WITH CEDILLA + '\xe9' # 0x8E -> LATIN SMALL LETTER E WITH ACUTE + '\xe8' # 0x8F -> LATIN SMALL LETTER E WITH GRAVE + '\xea' # 0x90 -> LATIN SMALL LETTER E WITH CIRCUMFLEX + '\xeb' # 0x91 -> LATIN SMALL LETTER E WITH DIAERESIS + '\xed' # 0x92 -> LATIN SMALL LETTER I WITH ACUTE + '\xec' # 0x93 -> LATIN SMALL LETTER I WITH GRAVE + '\xee' # 0x94 -> LATIN SMALL LETTER I WITH CIRCUMFLEX + '\xef' # 0x95 -> LATIN SMALL LETTER I WITH DIAERESIS + '\xf1' # 0x96 -> LATIN SMALL LETTER N WITH TILDE + '\xf3' # 0x97 -> LATIN SMALL LETTER O WITH ACUTE + '\xf2' # 0x98 -> LATIN SMALL LETTER O WITH GRAVE + '\xf4' # 0x99 -> LATIN SMALL LETTER O WITH CIRCUMFLEX + '\xf6' # 0x9A -> LATIN SMALL LETTER O WITH DIAERESIS + '\xf5' # 0x9B -> LATIN SMALL LETTER O WITH TILDE + '\xfa' # 0x9C -> LATIN SMALL LETTER U WITH ACUTE + '\xf9' # 0x9D -> LATIN SMALL LETTER U WITH GRAVE + '\xfb' # 0x9E -> LATIN SMALL LETTER U WITH CIRCUMFLEX + '\xfc' # 0x9F -> LATIN SMALL LETTER U WITH DIAERESIS + '\xdd' # 0xA0 -> LATIN CAPITAL LETTER Y WITH ACUTE + '\xb0' # 0xA1 -> DEGREE SIGN + '\xa2' # 0xA2 -> CENT SIGN + '\xa3' # 0xA3 -> POUND SIGN + '\xa7' # 0xA4 -> SECTION SIGN + '\u2022' # 0xA5 -> BULLET + '\xb6' # 0xA6 -> PILCROW SIGN + '\xdf' # 0xA7 -> LATIN SMALL LETTER SHARP S + '\xae' # 0xA8 -> REGISTERED SIGN + '\xa9' # 0xA9 -> COPYRIGHT SIGN + '\u2122' # 0xAA -> TRADE MARK SIGN + '\xb4' # 0xAB -> ACUTE ACCENT + '\xa8' # 0xAC -> DIAERESIS + '\u2260' # 0xAD -> NOT EQUAL TO + '\xc6' # 0xAE -> LATIN CAPITAL LETTER AE + '\xd8' # 0xAF -> LATIN CAPITAL LETTER O WITH STROKE + '\u221e' # 0xB0 -> INFINITY + '\xb1' # 0xB1 -> PLUS-MINUS SIGN + '\u2264' # 0xB2 -> LESS-THAN OR EQUAL TO + '\u2265' # 0xB3 -> GREATER-THAN OR EQUAL TO + '\xa5' # 0xB4 -> YEN SIGN + '\xb5' # 0xB5 -> MICRO SIGN + '\u2202' # 0xB6 -> PARTIAL DIFFERENTIAL + '\u2211' # 0xB7 -> N-ARY SUMMATION + '\u220f' # 0xB8 -> N-ARY PRODUCT + '\u03c0' # 0xB9 -> GREEK SMALL LETTER PI + '\u222b' # 0xBA -> INTEGRAL + '\xaa' # 0xBB -> FEMININE ORDINAL INDICATOR + '\xba' # 0xBC -> MASCULINE ORDINAL INDICATOR + '\u03a9' # 0xBD -> GREEK CAPITAL LETTER OMEGA + '\xe6' # 0xBE -> LATIN SMALL LETTER AE + '\xf8' # 0xBF -> LATIN SMALL LETTER O WITH STROKE + '\xbf' # 0xC0 -> INVERTED QUESTION MARK + '\xa1' # 0xC1 -> INVERTED EXCLAMATION MARK + '\xac' # 0xC2 -> NOT SIGN + '\u221a' # 0xC3 -> SQUARE ROOT + '\u0192' # 0xC4 -> LATIN SMALL LETTER F WITH HOOK + '\u2248' # 0xC5 -> ALMOST EQUAL TO + '\u2206' # 0xC6 -> INCREMENT + '\xab' # 0xC7 -> LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + '\xbb' # 0xC8 -> RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + '\u2026' # 0xC9 -> HORIZONTAL ELLIPSIS + '\xa0' # 0xCA -> NO-BREAK SPACE + '\xc0' # 0xCB -> LATIN CAPITAL LETTER A WITH GRAVE + '\xc3' # 0xCC -> LATIN CAPITAL LETTER A WITH TILDE + '\xd5' # 0xCD -> LATIN CAPITAL LETTER O WITH TILDE + '\u0152' # 0xCE -> LATIN CAPITAL LIGATURE OE + '\u0153' # 0xCF -> LATIN SMALL LIGATURE OE + '\u2013' # 0xD0 -> EN DASH + '\u2014' # 0xD1 -> EM DASH + '\u201c' # 0xD2 -> LEFT DOUBLE QUOTATION MARK + '\u201d' # 0xD3 -> RIGHT DOUBLE QUOTATION MARK + '\u2018' # 0xD4 -> LEFT SINGLE QUOTATION MARK + '\u2019' # 0xD5 -> RIGHT SINGLE QUOTATION MARK + '\xf7' # 0xD6 -> DIVISION SIGN + '\u25ca' # 0xD7 -> LOZENGE + '\xff' # 0xD8 -> LATIN SMALL LETTER Y WITH DIAERESIS + '\u0178' # 0xD9 -> LATIN CAPITAL LETTER Y WITH DIAERESIS + '\u2044' # 0xDA -> FRACTION SLASH + '\u20ac' # 0xDB -> EURO SIGN + '\xd0' # 0xDC -> LATIN CAPITAL LETTER ETH + '\xf0' # 0xDD -> LATIN SMALL LETTER ETH + '\xde' # 0xDE -> LATIN CAPITAL LETTER THORN + '\xfe' # 0xDF -> LATIN SMALL LETTER THORN + '\xfd' # 0xE0 -> LATIN SMALL LETTER Y WITH ACUTE + '\xb7' # 0xE1 -> MIDDLE DOT + '\u201a' # 0xE2 -> SINGLE LOW-9 QUOTATION MARK + '\u201e' # 0xE3 -> DOUBLE LOW-9 QUOTATION MARK + '\u2030' # 0xE4 -> PER MILLE SIGN + '\xc2' # 0xE5 -> LATIN CAPITAL LETTER A WITH CIRCUMFLEX + '\xca' # 0xE6 -> LATIN CAPITAL LETTER E WITH CIRCUMFLEX + '\xc1' # 0xE7 -> LATIN CAPITAL LETTER A WITH ACUTE + '\xcb' # 0xE8 -> LATIN CAPITAL LETTER E WITH DIAERESIS + '\xc8' # 0xE9 -> LATIN CAPITAL LETTER E WITH GRAVE + '\xcd' # 0xEA -> LATIN CAPITAL LETTER I WITH ACUTE + '\xce' # 0xEB -> LATIN CAPITAL LETTER I WITH CIRCUMFLEX + '\xcf' # 0xEC -> LATIN CAPITAL LETTER I WITH DIAERESIS + '\xcc' # 0xED -> LATIN CAPITAL LETTER I WITH GRAVE + '\xd3' # 0xEE -> LATIN CAPITAL LETTER O WITH ACUTE + '\xd4' # 0xEF -> LATIN CAPITAL LETTER O WITH CIRCUMFLEX + '\uf8ff' # 0xF0 -> Apple logo + '\xd2' # 0xF1 -> LATIN CAPITAL LETTER O WITH GRAVE + '\xda' # 0xF2 -> LATIN CAPITAL LETTER U WITH ACUTE + '\xdb' # 0xF3 -> LATIN CAPITAL LETTER U WITH CIRCUMFLEX + '\xd9' # 0xF4 -> LATIN CAPITAL LETTER U WITH GRAVE + '\u0131' # 0xF5 -> LATIN SMALL LETTER DOTLESS I + '\u02c6' # 0xF6 -> MODIFIER LETTER CIRCUMFLEX ACCENT + '\u02dc' # 0xF7 -> SMALL TILDE + '\xaf' # 0xF8 -> MACRON + '\u02d8' # 0xF9 -> BREVE + '\u02d9' # 0xFA -> DOT ABOVE + '\u02da' # 0xFB -> RING ABOVE + '\xb8' # 0xFC -> CEDILLA + '\u02dd' # 0xFD -> DOUBLE ACUTE ACCENT + '\u02db' # 0xFE -> OGONEK + '\u02c7' # 0xFF -> CARON +) + +### Encoding table +encoding_table=codecs.charmap_build(decoding_table) diff --git a/env/Lib/encodings/mac_latin2.py b/env/Lib/encodings/mac_latin2.py new file mode 100644 index 0000000..da9d4b1 --- /dev/null +++ b/env/Lib/encodings/mac_latin2.py @@ -0,0 +1,312 @@ +""" Python Character Mapping Codec mac_latin2 generated from 'MAPPINGS/VENDORS/MICSFT/MAC/LATIN2.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_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-latin2', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) + + +### Decoding Table + +decoding_table = ( + '\x00' # 0x00 -> NULL + '\x01' # 0x01 -> START OF HEADING + '\x02' # 0x02 -> START OF TEXT + '\x03' # 0x03 -> END OF TEXT + '\x04' # 0x04 -> END OF TRANSMISSION + '\x05' # 0x05 -> ENQUIRY + '\x06' # 0x06 -> ACKNOWLEDGE + '\x07' # 0x07 -> BELL + '\x08' # 0x08 -> BACKSPACE + '\t' # 0x09 -> HORIZONTAL TABULATION + '\n' # 0x0A -> LINE FEED + '\x0b' # 0x0B -> VERTICAL TABULATION + '\x0c' # 0x0C -> FORM FEED + '\r' # 0x0D -> CARRIAGE RETURN + '\x0e' # 0x0E -> SHIFT OUT + '\x0f' # 0x0F -> SHIFT IN + '\x10' # 0x10 -> DATA LINK ESCAPE + '\x11' # 0x11 -> DEVICE CONTROL ONE + '\x12' # 0x12 -> DEVICE CONTROL TWO + '\x13' # 0x13 -> DEVICE CONTROL THREE + '\x14' # 0x14 -> DEVICE CONTROL FOUR + '\x15' # 0x15 -> NEGATIVE ACKNOWLEDGE + '\x16' # 0x16 -> SYNCHRONOUS IDLE + '\x17' # 0x17 -> END OF TRANSMISSION BLOCK + '\x18' # 0x18 -> CANCEL + '\x19' # 0x19 -> END OF MEDIUM + '\x1a' # 0x1A -> SUBSTITUTE + '\x1b' # 0x1B -> ESCAPE + '\x1c' # 0x1C -> FILE SEPARATOR + '\x1d' # 0x1D -> GROUP SEPARATOR + '\x1e' # 0x1E -> RECORD SEPARATOR + '\x1f' # 0x1F -> UNIT SEPARATOR + ' ' # 0x20 -> SPACE + '!' # 0x21 -> EXCLAMATION MARK + '"' # 0x22 -> QUOTATION MARK + '#' # 0x23 -> NUMBER SIGN + '$' # 0x24 -> DOLLAR SIGN + '%' # 0x25 -> PERCENT SIGN + '&' # 0x26 -> AMPERSAND + "'" # 0x27 -> APOSTROPHE + '(' # 0x28 -> LEFT PARENTHESIS + ')' # 0x29 -> RIGHT PARENTHESIS + '*' # 0x2A -> ASTERISK + '+' # 0x2B -> PLUS SIGN + ',' # 0x2C -> COMMA + '-' # 0x2D -> HYPHEN-MINUS + '.' # 0x2E -> FULL STOP + '/' # 0x2F -> SOLIDUS + '0' # 0x30 -> DIGIT ZERO + '1' # 0x31 -> DIGIT ONE + '2' # 0x32 -> DIGIT TWO + '3' # 0x33 -> DIGIT THREE + '4' # 0x34 -> DIGIT FOUR + '5' # 0x35 -> DIGIT FIVE + '6' # 0x36 -> DIGIT SIX + '7' # 0x37 -> DIGIT SEVEN + '8' # 0x38 -> DIGIT EIGHT + '9' # 0x39 -> DIGIT NINE + ':' # 0x3A -> COLON + ';' # 0x3B -> SEMICOLON + '<' # 0x3C -> LESS-THAN SIGN + '=' # 0x3D -> EQUALS SIGN + '>' # 0x3E -> GREATER-THAN SIGN + '?' # 0x3F -> QUESTION MARK + '@' # 0x40 -> COMMERCIAL AT + 'A' # 0x41 -> LATIN CAPITAL LETTER A + 'B' # 0x42 -> LATIN CAPITAL LETTER B + 'C' # 0x43 -> LATIN CAPITAL LETTER C + 'D' # 0x44 -> LATIN CAPITAL LETTER D + 'E' # 0x45 -> LATIN CAPITAL LETTER E + 'F' # 0x46 -> LATIN CAPITAL LETTER F + 'G' # 0x47 -> LATIN CAPITAL LETTER G + 'H' # 0x48 -> LATIN CAPITAL LETTER H + 'I' # 0x49 -> LATIN CAPITAL LETTER I + 'J' # 0x4A -> LATIN CAPITAL LETTER J + 'K' # 0x4B -> LATIN CAPITAL LETTER K + 'L' # 0x4C -> LATIN CAPITAL LETTER L + 'M' # 0x4D -> LATIN CAPITAL LETTER M + 'N' # 0x4E -> LATIN CAPITAL LETTER N + 'O' # 0x4F -> LATIN CAPITAL LETTER O + 'P' # 0x50 -> LATIN CAPITAL LETTER P + 'Q' # 0x51 -> LATIN CAPITAL LETTER Q + 'R' # 0x52 -> LATIN CAPITAL LETTER R + 'S' # 0x53 -> LATIN CAPITAL LETTER S + 'T' # 0x54 -> LATIN CAPITAL LETTER T + 'U' # 0x55 -> LATIN CAPITAL LETTER U + 'V' # 0x56 -> LATIN CAPITAL LETTER V + 'W' # 0x57 -> LATIN CAPITAL LETTER W + 'X' # 0x58 -> LATIN CAPITAL LETTER X + 'Y' # 0x59 -> LATIN CAPITAL LETTER Y + 'Z' # 0x5A -> LATIN CAPITAL LETTER Z + '[' # 0x5B -> LEFT SQUARE BRACKET + '\\' # 0x5C -> REVERSE SOLIDUS + ']' # 0x5D -> RIGHT SQUARE BRACKET + '^' # 0x5E -> CIRCUMFLEX ACCENT + '_' # 0x5F -> LOW LINE + '`' # 0x60 -> GRAVE ACCENT + 'a' # 0x61 -> LATIN SMALL LETTER A + 'b' # 0x62 -> LATIN SMALL LETTER B + 'c' # 0x63 -> LATIN SMALL LETTER C + 'd' # 0x64 -> LATIN SMALL LETTER D + 'e' # 0x65 -> LATIN SMALL LETTER E + 'f' # 0x66 -> LATIN SMALL LETTER F + 'g' # 0x67 -> LATIN SMALL LETTER G + 'h' # 0x68 -> LATIN SMALL LETTER H + 'i' # 0x69 -> LATIN SMALL LETTER I + 'j' # 0x6A -> LATIN SMALL LETTER J + 'k' # 0x6B -> LATIN SMALL LETTER K + 'l' # 0x6C -> LATIN SMALL LETTER L + 'm' # 0x6D -> LATIN SMALL LETTER M + 'n' # 0x6E -> LATIN SMALL LETTER N + 'o' # 0x6F -> LATIN SMALL LETTER O + 'p' # 0x70 -> LATIN SMALL LETTER P + 'q' # 0x71 -> LATIN SMALL LETTER Q + 'r' # 0x72 -> LATIN SMALL LETTER R + 's' # 0x73 -> LATIN SMALL LETTER S + 't' # 0x74 -> LATIN SMALL LETTER T + 'u' # 0x75 -> LATIN SMALL LETTER U + 'v' # 0x76 -> LATIN SMALL LETTER V + 'w' # 0x77 -> LATIN SMALL LETTER W + 'x' # 0x78 -> LATIN SMALL LETTER X + 'y' # 0x79 -> LATIN SMALL LETTER Y + 'z' # 0x7A -> LATIN SMALL LETTER Z + '{' # 0x7B -> LEFT CURLY BRACKET + '|' # 0x7C -> VERTICAL LINE + '}' # 0x7D -> RIGHT CURLY BRACKET + '~' # 0x7E -> TILDE + '\x7f' # 0x7F -> DELETE + '\xc4' # 0x80 -> LATIN CAPITAL LETTER A WITH DIAERESIS + '\u0100' # 0x81 -> LATIN CAPITAL LETTER A WITH MACRON + '\u0101' # 0x82 -> LATIN SMALL LETTER A WITH MACRON + '\xc9' # 0x83 -> LATIN CAPITAL LETTER E WITH ACUTE + '\u0104' # 0x84 -> LATIN CAPITAL LETTER A WITH OGONEK + '\xd6' # 0x85 -> LATIN CAPITAL LETTER O WITH DIAERESIS + '\xdc' # 0x86 -> LATIN CAPITAL LETTER U WITH DIAERESIS + '\xe1' # 0x87 -> LATIN SMALL LETTER A WITH ACUTE + '\u0105' # 0x88 -> LATIN SMALL LETTER A WITH OGONEK + '\u010c' # 0x89 -> LATIN CAPITAL LETTER C WITH CARON + '\xe4' # 0x8A -> LATIN SMALL LETTER A WITH DIAERESIS + '\u010d' # 0x8B -> LATIN SMALL LETTER C WITH CARON + '\u0106' # 0x8C -> LATIN CAPITAL LETTER C WITH ACUTE + '\u0107' # 0x8D -> LATIN SMALL LETTER C WITH ACUTE + '\xe9' # 0x8E -> LATIN SMALL LETTER E WITH ACUTE + '\u0179' # 0x8F -> LATIN CAPITAL LETTER Z WITH ACUTE + '\u017a' # 0x90 -> LATIN SMALL LETTER Z WITH ACUTE + '\u010e' # 0x91 -> LATIN CAPITAL LETTER D WITH CARON + '\xed' # 0x92 -> LATIN SMALL LETTER I WITH ACUTE + '\u010f' # 0x93 -> LATIN SMALL LETTER D WITH CARON + '\u0112' # 0x94 -> LATIN CAPITAL LETTER E WITH MACRON + '\u0113' # 0x95 -> LATIN SMALL LETTER E WITH MACRON + '\u0116' # 0x96 -> LATIN CAPITAL LETTER E WITH DOT ABOVE + '\xf3' # 0x97 -> LATIN SMALL LETTER O WITH ACUTE + '\u0117' # 0x98 -> LATIN SMALL LETTER E WITH DOT ABOVE + '\xf4' # 0x99 -> LATIN SMALL LETTER O WITH CIRCUMFLEX + '\xf6' # 0x9A -> LATIN SMALL LETTER O WITH DIAERESIS + '\xf5' # 0x9B -> LATIN SMALL LETTER O WITH TILDE + '\xfa' # 0x9C -> LATIN SMALL LETTER U WITH ACUTE + '\u011a' # 0x9D -> LATIN CAPITAL LETTER E WITH CARON + '\u011b' # 0x9E -> LATIN SMALL LETTER E WITH CARON + '\xfc' # 0x9F -> LATIN SMALL LETTER U WITH DIAERESIS + '\u2020' # 0xA0 -> DAGGER + '\xb0' # 0xA1 -> DEGREE SIGN + '\u0118' # 0xA2 -> LATIN CAPITAL LETTER E WITH OGONEK + '\xa3' # 0xA3 -> POUND SIGN + '\xa7' # 0xA4 -> SECTION SIGN + '\u2022' # 0xA5 -> BULLET + '\xb6' # 0xA6 -> PILCROW SIGN + '\xdf' # 0xA7 -> LATIN SMALL LETTER SHARP S + '\xae' # 0xA8 -> REGISTERED SIGN + '\xa9' # 0xA9 -> COPYRIGHT SIGN + '\u2122' # 0xAA -> TRADE MARK SIGN + '\u0119' # 0xAB -> LATIN SMALL LETTER E WITH OGONEK + '\xa8' # 0xAC -> DIAERESIS + '\u2260' # 0xAD -> NOT EQUAL TO + '\u0123' # 0xAE -> LATIN SMALL LETTER G WITH CEDILLA + '\u012e' # 0xAF -> LATIN CAPITAL LETTER I WITH OGONEK + '\u012f' # 0xB0 -> LATIN SMALL LETTER I WITH OGONEK + '\u012a' # 0xB1 -> LATIN CAPITAL LETTER I WITH MACRON + '\u2264' # 0xB2 -> LESS-THAN OR EQUAL TO + '\u2265' # 0xB3 -> GREATER-THAN OR EQUAL TO + '\u012b' # 0xB4 -> LATIN SMALL LETTER I WITH MACRON + '\u0136' # 0xB5 -> LATIN CAPITAL LETTER K WITH CEDILLA + '\u2202' # 0xB6 -> PARTIAL DIFFERENTIAL + '\u2211' # 0xB7 -> N-ARY SUMMATION + '\u0142' # 0xB8 -> LATIN SMALL LETTER L WITH STROKE + '\u013b' # 0xB9 -> LATIN CAPITAL LETTER L WITH CEDILLA + '\u013c' # 0xBA -> LATIN SMALL LETTER L WITH CEDILLA + '\u013d' # 0xBB -> LATIN CAPITAL LETTER L WITH CARON + '\u013e' # 0xBC -> LATIN SMALL LETTER L WITH CARON + '\u0139' # 0xBD -> LATIN CAPITAL LETTER L WITH ACUTE + '\u013a' # 0xBE -> LATIN SMALL LETTER L WITH ACUTE + '\u0145' # 0xBF -> LATIN CAPITAL LETTER N WITH CEDILLA + '\u0146' # 0xC0 -> LATIN SMALL LETTER N WITH CEDILLA + '\u0143' # 0xC1 -> LATIN CAPITAL LETTER N WITH ACUTE + '\xac' # 0xC2 -> NOT SIGN + '\u221a' # 0xC3 -> SQUARE ROOT + '\u0144' # 0xC4 -> LATIN SMALL LETTER N WITH ACUTE + '\u0147' # 0xC5 -> LATIN CAPITAL LETTER N WITH CARON + '\u2206' # 0xC6 -> INCREMENT + '\xab' # 0xC7 -> LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + '\xbb' # 0xC8 -> RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + '\u2026' # 0xC9 -> HORIZONTAL ELLIPSIS + '\xa0' # 0xCA -> NO-BREAK SPACE + '\u0148' # 0xCB -> LATIN SMALL LETTER N WITH CARON + '\u0150' # 0xCC -> LATIN CAPITAL LETTER O WITH DOUBLE ACUTE + '\xd5' # 0xCD -> LATIN CAPITAL LETTER O WITH TILDE + '\u0151' # 0xCE -> LATIN SMALL LETTER O WITH DOUBLE ACUTE + '\u014c' # 0xCF -> LATIN CAPITAL LETTER O WITH MACRON + '\u2013' # 0xD0 -> EN DASH + '\u2014' # 0xD1 -> EM DASH + '\u201c' # 0xD2 -> LEFT DOUBLE QUOTATION MARK + '\u201d' # 0xD3 -> RIGHT DOUBLE QUOTATION MARK + '\u2018' # 0xD4 -> LEFT SINGLE QUOTATION MARK + '\u2019' # 0xD5 -> RIGHT SINGLE QUOTATION MARK + '\xf7' # 0xD6 -> DIVISION SIGN + '\u25ca' # 0xD7 -> LOZENGE + '\u014d' # 0xD8 -> LATIN SMALL LETTER O WITH MACRON + '\u0154' # 0xD9 -> LATIN CAPITAL LETTER R WITH ACUTE + '\u0155' # 0xDA -> LATIN SMALL LETTER R WITH ACUTE + '\u0158' # 0xDB -> LATIN CAPITAL LETTER R WITH CARON + '\u2039' # 0xDC -> SINGLE LEFT-POINTING ANGLE QUOTATION MARK + '\u203a' # 0xDD -> SINGLE RIGHT-POINTING ANGLE QUOTATION MARK + '\u0159' # 0xDE -> LATIN SMALL LETTER R WITH CARON + '\u0156' # 0xDF -> LATIN CAPITAL LETTER R WITH CEDILLA + '\u0157' # 0xE0 -> LATIN SMALL LETTER R WITH CEDILLA + '\u0160' # 0xE1 -> LATIN CAPITAL LETTER S WITH CARON + '\u201a' # 0xE2 -> SINGLE LOW-9 QUOTATION MARK + '\u201e' # 0xE3 -> DOUBLE LOW-9 QUOTATION MARK + '\u0161' # 0xE4 -> LATIN SMALL LETTER S WITH CARON + '\u015a' # 0xE5 -> LATIN CAPITAL LETTER S WITH ACUTE + '\u015b' # 0xE6 -> LATIN SMALL LETTER S WITH ACUTE + '\xc1' # 0xE7 -> LATIN CAPITAL LETTER A WITH ACUTE + '\u0164' # 0xE8 -> LATIN CAPITAL LETTER T WITH CARON + '\u0165' # 0xE9 -> LATIN SMALL LETTER T WITH CARON + '\xcd' # 0xEA -> LATIN CAPITAL LETTER I WITH ACUTE + '\u017d' # 0xEB -> LATIN CAPITAL LETTER Z WITH CARON + '\u017e' # 0xEC -> LATIN SMALL LETTER Z WITH CARON + '\u016a' # 0xED -> LATIN CAPITAL LETTER U WITH MACRON + '\xd3' # 0xEE -> LATIN CAPITAL LETTER O WITH ACUTE + '\xd4' # 0xEF -> LATIN CAPITAL LETTER O WITH CIRCUMFLEX + '\u016b' # 0xF0 -> LATIN SMALL LETTER U WITH MACRON + '\u016e' # 0xF1 -> LATIN CAPITAL LETTER U WITH RING ABOVE + '\xda' # 0xF2 -> LATIN CAPITAL LETTER U WITH ACUTE + '\u016f' # 0xF3 -> LATIN SMALL LETTER U WITH RING ABOVE + '\u0170' # 0xF4 -> LATIN CAPITAL LETTER U WITH DOUBLE ACUTE + '\u0171' # 0xF5 -> LATIN SMALL LETTER U WITH DOUBLE ACUTE + '\u0172' # 0xF6 -> LATIN CAPITAL LETTER U WITH OGONEK + '\u0173' # 0xF7 -> LATIN SMALL LETTER U WITH OGONEK + '\xdd' # 0xF8 -> LATIN CAPITAL LETTER Y WITH ACUTE + '\xfd' # 0xF9 -> LATIN SMALL LETTER Y WITH ACUTE + '\u0137' # 0xFA -> LATIN SMALL LETTER K WITH CEDILLA + '\u017b' # 0xFB -> LATIN CAPITAL LETTER Z WITH DOT ABOVE + '\u0141' # 0xFC -> LATIN CAPITAL LETTER L WITH STROKE + '\u017c' # 0xFD -> LATIN SMALL LETTER Z WITH DOT ABOVE + '\u0122' # 0xFE -> LATIN CAPITAL LETTER G WITH CEDILLA + '\u02c7' # 0xFF -> CARON +) + +### Encoding table +encoding_table=codecs.charmap_build(decoding_table) diff --git a/env/Lib/encodings/mac_roman.py b/env/Lib/encodings/mac_roman.py new file mode 100644 index 0000000..b74b002 --- /dev/null +++ b/env/Lib/encodings/mac_roman.py @@ -0,0 +1,307 @@ +""" Python Character Mapping Codec mac_roman generated from 'MAPPINGS/VENDORS/APPLE/ROMAN.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-roman', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) + + +### Decoding Table + +decoding_table = ( + '\x00' # 0x00 -> CONTROL CHARACTER + '\x01' # 0x01 -> CONTROL CHARACTER + '\x02' # 0x02 -> CONTROL CHARACTER + '\x03' # 0x03 -> CONTROL CHARACTER + '\x04' # 0x04 -> CONTROL CHARACTER + '\x05' # 0x05 -> CONTROL CHARACTER + '\x06' # 0x06 -> CONTROL CHARACTER + '\x07' # 0x07 -> CONTROL CHARACTER + '\x08' # 0x08 -> CONTROL CHARACTER + '\t' # 0x09 -> CONTROL CHARACTER + '\n' # 0x0A -> CONTROL CHARACTER + '\x0b' # 0x0B -> CONTROL CHARACTER + '\x0c' # 0x0C -> CONTROL CHARACTER + '\r' # 0x0D -> CONTROL CHARACTER + '\x0e' # 0x0E -> CONTROL CHARACTER + '\x0f' # 0x0F -> CONTROL CHARACTER + '\x10' # 0x10 -> CONTROL CHARACTER + '\x11' # 0x11 -> CONTROL CHARACTER + '\x12' # 0x12 -> CONTROL CHARACTER + '\x13' # 0x13 -> CONTROL CHARACTER + '\x14' # 0x14 -> CONTROL CHARACTER + '\x15' # 0x15 -> CONTROL CHARACTER + '\x16' # 0x16 -> CONTROL CHARACTER + '\x17' # 0x17 -> CONTROL CHARACTER + '\x18' # 0x18 -> CONTROL CHARACTER + '\x19' # 0x19 -> CONTROL CHARACTER + '\x1a' # 0x1A -> CONTROL CHARACTER + '\x1b' # 0x1B -> CONTROL CHARACTER + '\x1c' # 0x1C -> CONTROL CHARACTER + '\x1d' # 0x1D -> CONTROL CHARACTER + '\x1e' # 0x1E -> CONTROL CHARACTER + '\x1f' # 0x1F -> CONTROL CHARACTER + ' ' # 0x20 -> SPACE + '!' # 0x21 -> EXCLAMATION MARK + '"' # 0x22 -> QUOTATION MARK + '#' # 0x23 -> NUMBER SIGN + '$' # 0x24 -> DOLLAR SIGN + '%' # 0x25 -> PERCENT SIGN + '&' # 0x26 -> AMPERSAND + "'" # 0x27 -> APOSTROPHE + '(' # 0x28 -> LEFT PARENTHESIS + ')' # 0x29 -> RIGHT PARENTHESIS + '*' # 0x2A -> ASTERISK + '+' # 0x2B -> PLUS SIGN + ',' # 0x2C -> COMMA + '-' # 0x2D -> HYPHEN-MINUS + '.' # 0x2E -> FULL STOP + '/' # 0x2F -> SOLIDUS + '0' # 0x30 -> DIGIT ZERO + '1' # 0x31 -> DIGIT ONE + '2' # 0x32 -> DIGIT TWO + '3' # 0x33 -> DIGIT THREE + '4' # 0x34 -> DIGIT FOUR + '5' # 0x35 -> DIGIT FIVE + '6' # 0x36 -> DIGIT SIX + '7' # 0x37 -> DIGIT SEVEN + '8' # 0x38 -> DIGIT EIGHT + '9' # 0x39 -> DIGIT NINE + ':' # 0x3A -> COLON + ';' # 0x3B -> SEMICOLON + '<' # 0x3C -> LESS-THAN SIGN + '=' # 0x3D -> EQUALS SIGN + '>' # 0x3E -> GREATER-THAN SIGN + '?' # 0x3F -> QUESTION MARK + '@' # 0x40 -> COMMERCIAL AT + 'A' # 0x41 -> LATIN CAPITAL LETTER A + 'B' # 0x42 -> LATIN CAPITAL LETTER B + 'C' # 0x43 -> LATIN CAPITAL LETTER C + 'D' # 0x44 -> LATIN CAPITAL LETTER D + 'E' # 0x45 -> LATIN CAPITAL LETTER E + 'F' # 0x46 -> LATIN CAPITAL LETTER F + 'G' # 0x47 -> LATIN CAPITAL LETTER G + 'H' # 0x48 -> LATIN CAPITAL LETTER H + 'I' # 0x49 -> LATIN CAPITAL LETTER I + 'J' # 0x4A -> LATIN CAPITAL LETTER J + 'K' # 0x4B -> LATIN CAPITAL LETTER K + 'L' # 0x4C -> LATIN CAPITAL LETTER L + 'M' # 0x4D -> LATIN CAPITAL LETTER M + 'N' # 0x4E -> LATIN CAPITAL LETTER N + 'O' # 0x4F -> LATIN CAPITAL LETTER O + 'P' # 0x50 -> LATIN CAPITAL LETTER P + 'Q' # 0x51 -> LATIN CAPITAL LETTER Q + 'R' # 0x52 -> LATIN CAPITAL LETTER R + 'S' # 0x53 -> LATIN CAPITAL LETTER S + 'T' # 0x54 -> LATIN CAPITAL LETTER T + 'U' # 0x55 -> LATIN CAPITAL LETTER U + 'V' # 0x56 -> LATIN CAPITAL LETTER V + 'W' # 0x57 -> LATIN CAPITAL LETTER W + 'X' # 0x58 -> LATIN CAPITAL LETTER X + 'Y' # 0x59 -> LATIN CAPITAL LETTER Y + 'Z' # 0x5A -> LATIN CAPITAL LETTER Z + '[' # 0x5B -> LEFT SQUARE BRACKET + '\\' # 0x5C -> REVERSE SOLIDUS + ']' # 0x5D -> RIGHT SQUARE BRACKET + '^' # 0x5E -> CIRCUMFLEX ACCENT + '_' # 0x5F -> LOW LINE + '`' # 0x60 -> GRAVE ACCENT + 'a' # 0x61 -> LATIN SMALL LETTER A + 'b' # 0x62 -> LATIN SMALL LETTER B + 'c' # 0x63 -> LATIN SMALL LETTER C + 'd' # 0x64 -> LATIN SMALL LETTER D + 'e' # 0x65 -> LATIN SMALL LETTER E + 'f' # 0x66 -> LATIN SMALL LETTER F + 'g' # 0x67 -> LATIN SMALL LETTER G + 'h' # 0x68 -> LATIN SMALL LETTER H + 'i' # 0x69 -> LATIN SMALL LETTER I + 'j' # 0x6A -> LATIN SMALL LETTER J + 'k' # 0x6B -> LATIN SMALL LETTER K + 'l' # 0x6C -> LATIN SMALL LETTER L + 'm' # 0x6D -> LATIN SMALL LETTER M + 'n' # 0x6E -> LATIN SMALL LETTER N + 'o' # 0x6F -> LATIN SMALL LETTER O + 'p' # 0x70 -> LATIN SMALL LETTER P + 'q' # 0x71 -> LATIN SMALL LETTER Q + 'r' # 0x72 -> LATIN SMALL LETTER R + 's' # 0x73 -> LATIN SMALL LETTER S + 't' # 0x74 -> LATIN SMALL LETTER T + 'u' # 0x75 -> LATIN SMALL LETTER U + 'v' # 0x76 -> LATIN SMALL LETTER V + 'w' # 0x77 -> LATIN SMALL LETTER W + 'x' # 0x78 -> LATIN SMALL LETTER X + 'y' # 0x79 -> LATIN SMALL LETTER Y + 'z' # 0x7A -> LATIN SMALL LETTER Z + '{' # 0x7B -> LEFT CURLY BRACKET + '|' # 0x7C -> VERTICAL LINE + '}' # 0x7D -> RIGHT CURLY BRACKET + '~' # 0x7E -> TILDE + '\x7f' # 0x7F -> CONTROL CHARACTER + '\xc4' # 0x80 -> LATIN CAPITAL LETTER A WITH DIAERESIS + '\xc5' # 0x81 -> LATIN CAPITAL LETTER A WITH RING ABOVE + '\xc7' # 0x82 -> LATIN CAPITAL LETTER C WITH CEDILLA + '\xc9' # 0x83 -> LATIN CAPITAL LETTER E WITH ACUTE + '\xd1' # 0x84 -> LATIN CAPITAL LETTER N WITH TILDE + '\xd6' # 0x85 -> LATIN CAPITAL LETTER O WITH DIAERESIS + '\xdc' # 0x86 -> LATIN CAPITAL LETTER U WITH DIAERESIS + '\xe1' # 0x87 -> LATIN SMALL LETTER A WITH ACUTE + '\xe0' # 0x88 -> LATIN SMALL LETTER A WITH GRAVE + '\xe2' # 0x89 -> LATIN SMALL LETTER A WITH CIRCUMFLEX + '\xe4' # 0x8A -> LATIN SMALL LETTER A WITH DIAERESIS + '\xe3' # 0x8B -> LATIN SMALL LETTER A WITH TILDE + '\xe5' # 0x8C -> LATIN SMALL LETTER A WITH RING ABOVE + '\xe7' # 0x8D -> LATIN SMALL LETTER C WITH CEDILLA + '\xe9' # 0x8E -> LATIN SMALL LETTER E WITH ACUTE + '\xe8' # 0x8F -> LATIN SMALL LETTER E WITH GRAVE + '\xea' # 0x90 -> LATIN SMALL LETTER E WITH CIRCUMFLEX + '\xeb' # 0x91 -> LATIN SMALL LETTER E WITH DIAERESIS + '\xed' # 0x92 -> LATIN SMALL LETTER I WITH ACUTE + '\xec' # 0x93 -> LATIN SMALL LETTER I WITH GRAVE + '\xee' # 0x94 -> LATIN SMALL LETTER I WITH CIRCUMFLEX + '\xef' # 0x95 -> LATIN SMALL LETTER I WITH DIAERESIS + '\xf1' # 0x96 -> LATIN SMALL LETTER N WITH TILDE + '\xf3' # 0x97 -> LATIN SMALL LETTER O WITH ACUTE + '\xf2' # 0x98 -> LATIN SMALL LETTER O WITH GRAVE + '\xf4' # 0x99 -> LATIN SMALL LETTER O WITH CIRCUMFLEX + '\xf6' # 0x9A -> LATIN SMALL LETTER O WITH DIAERESIS + '\xf5' # 0x9B -> LATIN SMALL LETTER O WITH TILDE + '\xfa' # 0x9C -> LATIN SMALL LETTER U WITH ACUTE + '\xf9' # 0x9D -> LATIN SMALL LETTER U WITH GRAVE + '\xfb' # 0x9E -> LATIN SMALL LETTER U WITH CIRCUMFLEX + '\xfc' # 0x9F -> LATIN SMALL LETTER U WITH DIAERESIS + '\u2020' # 0xA0 -> DAGGER + '\xb0' # 0xA1 -> DEGREE SIGN + '\xa2' # 0xA2 -> CENT SIGN + '\xa3' # 0xA3 -> POUND SIGN + '\xa7' # 0xA4 -> SECTION SIGN + '\u2022' # 0xA5 -> BULLET + '\xb6' # 0xA6 -> PILCROW SIGN + '\xdf' # 0xA7 -> LATIN SMALL LETTER SHARP S + '\xae' # 0xA8 -> REGISTERED SIGN + '\xa9' # 0xA9 -> COPYRIGHT SIGN + '\u2122' # 0xAA -> TRADE MARK SIGN + '\xb4' # 0xAB -> ACUTE ACCENT + '\xa8' # 0xAC -> DIAERESIS + '\u2260' # 0xAD -> NOT EQUAL TO + '\xc6' # 0xAE -> LATIN CAPITAL LETTER AE + '\xd8' # 0xAF -> LATIN CAPITAL LETTER O WITH STROKE + '\u221e' # 0xB0 -> INFINITY + '\xb1' # 0xB1 -> PLUS-MINUS SIGN + '\u2264' # 0xB2 -> LESS-THAN OR EQUAL TO + '\u2265' # 0xB3 -> GREATER-THAN OR EQUAL TO + '\xa5' # 0xB4 -> YEN SIGN + '\xb5' # 0xB5 -> MICRO SIGN + '\u2202' # 0xB6 -> PARTIAL DIFFERENTIAL + '\u2211' # 0xB7 -> N-ARY SUMMATION + '\u220f' # 0xB8 -> N-ARY PRODUCT + '\u03c0' # 0xB9 -> GREEK SMALL LETTER PI + '\u222b' # 0xBA -> INTEGRAL + '\xaa' # 0xBB -> FEMININE ORDINAL INDICATOR + '\xba' # 0xBC -> MASCULINE ORDINAL INDICATOR + '\u03a9' # 0xBD -> GREEK CAPITAL LETTER OMEGA + '\xe6' # 0xBE -> LATIN SMALL LETTER AE + '\xf8' # 0xBF -> LATIN SMALL LETTER O WITH STROKE + '\xbf' # 0xC0 -> INVERTED QUESTION MARK + '\xa1' # 0xC1 -> INVERTED EXCLAMATION MARK + '\xac' # 0xC2 -> NOT SIGN + '\u221a' # 0xC3 -> SQUARE ROOT + '\u0192' # 0xC4 -> LATIN SMALL LETTER F WITH HOOK + '\u2248' # 0xC5 -> ALMOST EQUAL TO + '\u2206' # 0xC6 -> INCREMENT + '\xab' # 0xC7 -> LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + '\xbb' # 0xC8 -> RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + '\u2026' # 0xC9 -> HORIZONTAL ELLIPSIS + '\xa0' # 0xCA -> NO-BREAK SPACE + '\xc0' # 0xCB -> LATIN CAPITAL LETTER A WITH GRAVE + '\xc3' # 0xCC -> LATIN CAPITAL LETTER A WITH TILDE + '\xd5' # 0xCD -> LATIN CAPITAL LETTER O WITH TILDE + '\u0152' # 0xCE -> LATIN CAPITAL LIGATURE OE + '\u0153' # 0xCF -> LATIN SMALL LIGATURE OE + '\u2013' # 0xD0 -> EN DASH + '\u2014' # 0xD1 -> EM DASH + '\u201c' # 0xD2 -> LEFT DOUBLE QUOTATION MARK + '\u201d' # 0xD3 -> RIGHT DOUBLE QUOTATION MARK + '\u2018' # 0xD4 -> LEFT SINGLE QUOTATION MARK + '\u2019' # 0xD5 -> RIGHT SINGLE QUOTATION MARK + '\xf7' # 0xD6 -> DIVISION SIGN + '\u25ca' # 0xD7 -> LOZENGE + '\xff' # 0xD8 -> LATIN SMALL LETTER Y WITH DIAERESIS + '\u0178' # 0xD9 -> LATIN CAPITAL LETTER Y WITH DIAERESIS + '\u2044' # 0xDA -> FRACTION SLASH + '\u20ac' # 0xDB -> EURO SIGN + '\u2039' # 0xDC -> SINGLE LEFT-POINTING ANGLE QUOTATION MARK + '\u203a' # 0xDD -> SINGLE RIGHT-POINTING ANGLE QUOTATION MARK + '\ufb01' # 0xDE -> LATIN SMALL LIGATURE FI + '\ufb02' # 0xDF -> LATIN SMALL LIGATURE FL + '\u2021' # 0xE0 -> DOUBLE DAGGER + '\xb7' # 0xE1 -> MIDDLE DOT + '\u201a' # 0xE2 -> SINGLE LOW-9 QUOTATION MARK + '\u201e' # 0xE3 -> DOUBLE LOW-9 QUOTATION MARK + '\u2030' # 0xE4 -> PER MILLE SIGN + '\xc2' # 0xE5 -> LATIN CAPITAL LETTER A WITH CIRCUMFLEX + '\xca' # 0xE6 -> LATIN CAPITAL LETTER E WITH CIRCUMFLEX + '\xc1' # 0xE7 -> LATIN CAPITAL LETTER A WITH ACUTE + '\xcb' # 0xE8 -> LATIN CAPITAL LETTER E WITH DIAERESIS + '\xc8' # 0xE9 -> LATIN CAPITAL LETTER E WITH GRAVE + '\xcd' # 0xEA -> LATIN CAPITAL LETTER I WITH ACUTE + '\xce' # 0xEB -> LATIN CAPITAL LETTER I WITH CIRCUMFLEX + '\xcf' # 0xEC -> LATIN CAPITAL LETTER I WITH DIAERESIS + '\xcc' # 0xED -> LATIN CAPITAL LETTER I WITH GRAVE + '\xd3' # 0xEE -> LATIN CAPITAL LETTER O WITH ACUTE + '\xd4' # 0xEF -> LATIN CAPITAL LETTER O WITH CIRCUMFLEX + '\uf8ff' # 0xF0 -> Apple logo + '\xd2' # 0xF1 -> LATIN CAPITAL LETTER O WITH GRAVE + '\xda' # 0xF2 -> LATIN CAPITAL LETTER U WITH ACUTE + '\xdb' # 0xF3 -> LATIN CAPITAL LETTER U WITH CIRCUMFLEX + '\xd9' # 0xF4 -> LATIN CAPITAL LETTER U WITH GRAVE + '\u0131' # 0xF5 -> LATIN SMALL LETTER DOTLESS I + '\u02c6' # 0xF6 -> MODIFIER LETTER CIRCUMFLEX ACCENT + '\u02dc' # 0xF7 -> SMALL TILDE + '\xaf' # 0xF8 -> MACRON + '\u02d8' # 0xF9 -> BREVE + '\u02d9' # 0xFA -> DOT ABOVE + '\u02da' # 0xFB -> RING ABOVE + '\xb8' # 0xFC -> CEDILLA + '\u02dd' # 0xFD -> DOUBLE ACUTE ACCENT + '\u02db' # 0xFE -> OGONEK + '\u02c7' # 0xFF -> CARON +) + +### Encoding table +encoding_table=codecs.charmap_build(decoding_table) diff --git a/env/Lib/encodings/mac_romanian.py b/env/Lib/encodings/mac_romanian.py new file mode 100644 index 0000000..d141b4c --- /dev/null +++ b/env/Lib/encodings/mac_romanian.py @@ -0,0 +1,307 @@ +""" 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 = ( + '\x00' # 0x00 -> CONTROL CHARACTER + '\x01' # 0x01 -> CONTROL CHARACTER + '\x02' # 0x02 -> CONTROL CHARACTER + '\x03' # 0x03 -> CONTROL CHARACTER + '\x04' # 0x04 -> CONTROL CHARACTER + '\x05' # 0x05 -> CONTROL CHARACTER + '\x06' # 0x06 -> CONTROL CHARACTER + '\x07' # 0x07 -> CONTROL CHARACTER + '\x08' # 0x08 -> CONTROL CHARACTER + '\t' # 0x09 -> CONTROL CHARACTER + '\n' # 0x0A -> CONTROL CHARACTER + '\x0b' # 0x0B -> CONTROL CHARACTER + '\x0c' # 0x0C -> CONTROL CHARACTER + '\r' # 0x0D -> CONTROL CHARACTER + '\x0e' # 0x0E -> CONTROL CHARACTER + '\x0f' # 0x0F -> CONTROL CHARACTER + '\x10' # 0x10 -> CONTROL CHARACTER + '\x11' # 0x11 -> CONTROL CHARACTER + '\x12' # 0x12 -> CONTROL CHARACTER + '\x13' # 0x13 -> CONTROL CHARACTER + '\x14' # 0x14 -> CONTROL CHARACTER + '\x15' # 0x15 -> CONTROL CHARACTER + '\x16' # 0x16 -> CONTROL CHARACTER + '\x17' # 0x17 -> CONTROL CHARACTER + '\x18' # 0x18 -> CONTROL CHARACTER + '\x19' # 0x19 -> CONTROL CHARACTER + '\x1a' # 0x1A -> CONTROL CHARACTER + '\x1b' # 0x1B -> CONTROL CHARACTER + '\x1c' # 0x1C -> CONTROL CHARACTER + '\x1d' # 0x1D -> CONTROL CHARACTER + '\x1e' # 0x1E -> CONTROL CHARACTER + '\x1f' # 0x1F -> CONTROL CHARACTER + ' ' # 0x20 -> SPACE + '!' # 0x21 -> EXCLAMATION MARK + '"' # 0x22 -> QUOTATION MARK + '#' # 0x23 -> NUMBER SIGN + '$' # 0x24 -> DOLLAR SIGN + '%' # 0x25 -> PERCENT SIGN + '&' # 0x26 -> AMPERSAND + "'" # 0x27 -> APOSTROPHE + '(' # 0x28 -> LEFT PARENTHESIS + ')' # 0x29 -> RIGHT PARENTHESIS + '*' # 0x2A -> ASTERISK + '+' # 0x2B -> PLUS SIGN + ',' # 0x2C -> COMMA + '-' # 0x2D -> HYPHEN-MINUS + '.' # 0x2E -> FULL STOP + '/' # 0x2F -> SOLIDUS + '0' # 0x30 -> DIGIT ZERO + '1' # 0x31 -> DIGIT ONE + '2' # 0x32 -> DIGIT TWO + '3' # 0x33 -> DIGIT THREE + '4' # 0x34 -> DIGIT FOUR + '5' # 0x35 -> DIGIT FIVE + '6' # 0x36 -> DIGIT SIX + '7' # 0x37 -> DIGIT SEVEN + '8' # 0x38 -> DIGIT EIGHT + '9' # 0x39 -> DIGIT NINE + ':' # 0x3A -> COLON + ';' # 0x3B -> SEMICOLON + '<' # 0x3C -> LESS-THAN SIGN + '=' # 0x3D -> EQUALS SIGN + '>' # 0x3E -> GREATER-THAN SIGN + '?' # 0x3F -> QUESTION MARK + '@' # 0x40 -> COMMERCIAL AT + 'A' # 0x41 -> LATIN CAPITAL LETTER A + 'B' # 0x42 -> LATIN CAPITAL LETTER B + 'C' # 0x43 -> LATIN CAPITAL LETTER C + 'D' # 0x44 -> LATIN CAPITAL LETTER D + 'E' # 0x45 -> LATIN CAPITAL LETTER E + 'F' # 0x46 -> LATIN CAPITAL LETTER F + 'G' # 0x47 -> LATIN CAPITAL LETTER G + 'H' # 0x48 -> LATIN CAPITAL LETTER H + 'I' # 0x49 -> LATIN CAPITAL LETTER I + 'J' # 0x4A -> LATIN CAPITAL LETTER J + 'K' # 0x4B -> LATIN CAPITAL LETTER K + 'L' # 0x4C -> LATIN CAPITAL LETTER L + 'M' # 0x4D -> LATIN CAPITAL LETTER M + 'N' # 0x4E -> LATIN CAPITAL LETTER N + 'O' # 0x4F -> LATIN CAPITAL LETTER O + 'P' # 0x50 -> LATIN CAPITAL LETTER P + 'Q' # 0x51 -> LATIN CAPITAL LETTER Q + 'R' # 0x52 -> LATIN CAPITAL LETTER R + 'S' # 0x53 -> LATIN CAPITAL LETTER S + 'T' # 0x54 -> LATIN CAPITAL LETTER T + 'U' # 0x55 -> LATIN CAPITAL LETTER U + 'V' # 0x56 -> LATIN CAPITAL LETTER V + 'W' # 0x57 -> LATIN CAPITAL LETTER W + 'X' # 0x58 -> LATIN CAPITAL LETTER X + 'Y' # 0x59 -> LATIN CAPITAL LETTER Y + 'Z' # 0x5A -> LATIN CAPITAL LETTER Z + '[' # 0x5B -> LEFT SQUARE BRACKET + '\\' # 0x5C -> REVERSE SOLIDUS + ']' # 0x5D -> RIGHT SQUARE BRACKET + '^' # 0x5E -> CIRCUMFLEX ACCENT + '_' # 0x5F -> LOW LINE + '`' # 0x60 -> GRAVE ACCENT + 'a' # 0x61 -> LATIN SMALL LETTER A + 'b' # 0x62 -> LATIN SMALL LETTER B + 'c' # 0x63 -> LATIN SMALL LETTER C + 'd' # 0x64 -> LATIN SMALL LETTER D + 'e' # 0x65 -> LATIN SMALL LETTER E + 'f' # 0x66 -> LATIN SMALL LETTER F + 'g' # 0x67 -> LATIN SMALL LETTER G + 'h' # 0x68 -> LATIN SMALL LETTER H + 'i' # 0x69 -> LATIN SMALL LETTER I + 'j' # 0x6A -> LATIN SMALL LETTER J + 'k' # 0x6B -> LATIN SMALL LETTER K + 'l' # 0x6C -> LATIN SMALL LETTER L + 'm' # 0x6D -> LATIN SMALL LETTER M + 'n' # 0x6E -> LATIN SMALL LETTER N + 'o' # 0x6F -> LATIN SMALL LETTER O + 'p' # 0x70 -> LATIN SMALL LETTER P + 'q' # 0x71 -> LATIN SMALL LETTER Q + 'r' # 0x72 -> LATIN SMALL LETTER R + 's' # 0x73 -> LATIN SMALL LETTER S + 't' # 0x74 -> LATIN SMALL LETTER T + 'u' # 0x75 -> LATIN SMALL LETTER U + 'v' # 0x76 -> LATIN SMALL LETTER V + 'w' # 0x77 -> LATIN SMALL LETTER W + 'x' # 0x78 -> LATIN SMALL LETTER X + 'y' # 0x79 -> LATIN SMALL LETTER Y + 'z' # 0x7A -> LATIN SMALL LETTER Z + '{' # 0x7B -> LEFT CURLY BRACKET + '|' # 0x7C -> VERTICAL LINE + '}' # 0x7D -> RIGHT CURLY BRACKET + '~' # 0x7E -> TILDE + '\x7f' # 0x7F -> CONTROL CHARACTER + '\xc4' # 0x80 -> LATIN CAPITAL LETTER A WITH DIAERESIS + '\xc5' # 0x81 -> LATIN CAPITAL LETTER A WITH RING ABOVE + '\xc7' # 0x82 -> LATIN CAPITAL LETTER C WITH CEDILLA + '\xc9' # 0x83 -> LATIN CAPITAL LETTER E WITH ACUTE + '\xd1' # 0x84 -> LATIN CAPITAL LETTER N WITH TILDE + '\xd6' # 0x85 -> LATIN CAPITAL LETTER O WITH DIAERESIS + '\xdc' # 0x86 -> LATIN CAPITAL LETTER U WITH DIAERESIS + '\xe1' # 0x87 -> LATIN SMALL LETTER A WITH ACUTE + '\xe0' # 0x88 -> LATIN SMALL LETTER A WITH GRAVE + '\xe2' # 0x89 -> LATIN SMALL LETTER A WITH CIRCUMFLEX + '\xe4' # 0x8A -> LATIN SMALL LETTER A WITH DIAERESIS + '\xe3' # 0x8B -> LATIN SMALL LETTER A WITH TILDE + '\xe5' # 0x8C -> LATIN SMALL LETTER A WITH RING ABOVE + '\xe7' # 0x8D -> LATIN SMALL LETTER C WITH CEDILLA + '\xe9' # 0x8E -> LATIN SMALL LETTER E WITH ACUTE + '\xe8' # 0x8F -> LATIN SMALL LETTER E WITH GRAVE + '\xea' # 0x90 -> LATIN SMALL LETTER E WITH CIRCUMFLEX + '\xeb' # 0x91 -> LATIN SMALL LETTER E WITH DIAERESIS + '\xed' # 0x92 -> LATIN SMALL LETTER I WITH ACUTE + '\xec' # 0x93 -> LATIN SMALL LETTER I WITH GRAVE + '\xee' # 0x94 -> LATIN SMALL LETTER I WITH CIRCUMFLEX + '\xef' # 0x95 -> LATIN SMALL LETTER I WITH DIAERESIS + '\xf1' # 0x96 -> LATIN SMALL LETTER N WITH TILDE + '\xf3' # 0x97 -> LATIN SMALL LETTER O WITH ACUTE + '\xf2' # 0x98 -> LATIN SMALL LETTER O WITH GRAVE + '\xf4' # 0x99 -> LATIN SMALL LETTER O WITH CIRCUMFLEX + '\xf6' # 0x9A -> LATIN SMALL LETTER O WITH DIAERESIS + '\xf5' # 0x9B -> LATIN SMALL LETTER O WITH TILDE + '\xfa' # 0x9C -> LATIN SMALL LETTER U WITH ACUTE + '\xf9' # 0x9D -> LATIN SMALL LETTER U WITH GRAVE + '\xfb' # 0x9E -> LATIN SMALL LETTER U WITH CIRCUMFLEX + '\xfc' # 0x9F -> LATIN SMALL LETTER U WITH DIAERESIS + '\u2020' # 0xA0 -> DAGGER + '\xb0' # 0xA1 -> DEGREE SIGN + '\xa2' # 0xA2 -> CENT SIGN + '\xa3' # 0xA3 -> POUND SIGN + '\xa7' # 0xA4 -> SECTION SIGN + '\u2022' # 0xA5 -> BULLET + '\xb6' # 0xA6 -> PILCROW SIGN + '\xdf' # 0xA7 -> LATIN SMALL LETTER SHARP S + '\xae' # 0xA8 -> REGISTERED SIGN + '\xa9' # 0xA9 -> COPYRIGHT SIGN + '\u2122' # 0xAA -> TRADE MARK SIGN + '\xb4' # 0xAB -> ACUTE ACCENT + '\xa8' # 0xAC -> DIAERESIS + '\u2260' # 0xAD -> NOT EQUAL TO + '\u0102' # 0xAE -> LATIN CAPITAL LETTER A WITH BREVE + '\u0218' # 0xAF -> LATIN CAPITAL LETTER S WITH COMMA BELOW # for Unicode 3.0 and later + '\u221e' # 0xB0 -> INFINITY + '\xb1' # 0xB1 -> PLUS-MINUS SIGN + '\u2264' # 0xB2 -> LESS-THAN OR EQUAL TO + '\u2265' # 0xB3 -> GREATER-THAN OR EQUAL TO + '\xa5' # 0xB4 -> YEN SIGN + '\xb5' # 0xB5 -> MICRO SIGN + '\u2202' # 0xB6 -> PARTIAL DIFFERENTIAL + '\u2211' # 0xB7 -> N-ARY SUMMATION + '\u220f' # 0xB8 -> N-ARY PRODUCT + '\u03c0' # 0xB9 -> GREEK SMALL LETTER PI + '\u222b' # 0xBA -> INTEGRAL + '\xaa' # 0xBB -> FEMININE ORDINAL INDICATOR + '\xba' # 0xBC -> MASCULINE ORDINAL INDICATOR + '\u03a9' # 0xBD -> GREEK CAPITAL LETTER OMEGA + '\u0103' # 0xBE -> LATIN SMALL LETTER A WITH BREVE + '\u0219' # 0xBF -> LATIN SMALL LETTER S WITH COMMA BELOW # for Unicode 3.0 and later + '\xbf' # 0xC0 -> INVERTED QUESTION MARK + '\xa1' # 0xC1 -> INVERTED EXCLAMATION MARK + '\xac' # 0xC2 -> NOT SIGN + '\u221a' # 0xC3 -> SQUARE ROOT + '\u0192' # 0xC4 -> LATIN SMALL LETTER F WITH HOOK + '\u2248' # 0xC5 -> ALMOST EQUAL TO + '\u2206' # 0xC6 -> INCREMENT + '\xab' # 0xC7 -> LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + '\xbb' # 0xC8 -> RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + '\u2026' # 0xC9 -> HORIZONTAL ELLIPSIS + '\xa0' # 0xCA -> NO-BREAK SPACE + '\xc0' # 0xCB -> LATIN CAPITAL LETTER A WITH GRAVE + '\xc3' # 0xCC -> LATIN CAPITAL LETTER A WITH TILDE + '\xd5' # 0xCD -> LATIN CAPITAL LETTER O WITH TILDE + '\u0152' # 0xCE -> LATIN CAPITAL LIGATURE OE + '\u0153' # 0xCF -> LATIN SMALL LIGATURE OE + '\u2013' # 0xD0 -> EN DASH + '\u2014' # 0xD1 -> EM DASH + '\u201c' # 0xD2 -> LEFT DOUBLE QUOTATION MARK + '\u201d' # 0xD3 -> RIGHT DOUBLE QUOTATION MARK + '\u2018' # 0xD4 -> LEFT SINGLE QUOTATION MARK + '\u2019' # 0xD5 -> RIGHT SINGLE QUOTATION MARK + '\xf7' # 0xD6 -> DIVISION SIGN + '\u25ca' # 0xD7 -> LOZENGE + '\xff' # 0xD8 -> LATIN SMALL LETTER Y WITH DIAERESIS + '\u0178' # 0xD9 -> LATIN CAPITAL LETTER Y WITH DIAERESIS + '\u2044' # 0xDA -> FRACTION SLASH + '\u20ac' # 0xDB -> EURO SIGN + '\u2039' # 0xDC -> SINGLE LEFT-POINTING ANGLE QUOTATION MARK + '\u203a' # 0xDD -> SINGLE RIGHT-POINTING ANGLE QUOTATION MARK + '\u021a' # 0xDE -> LATIN CAPITAL LETTER T WITH COMMA BELOW # for Unicode 3.0 and later + '\u021b' # 0xDF -> LATIN SMALL LETTER T WITH COMMA BELOW # for Unicode 3.0 and later + '\u2021' # 0xE0 -> DOUBLE DAGGER + '\xb7' # 0xE1 -> MIDDLE DOT + '\u201a' # 0xE2 -> SINGLE LOW-9 QUOTATION MARK + '\u201e' # 0xE3 -> DOUBLE LOW-9 QUOTATION MARK + '\u2030' # 0xE4 -> PER MILLE SIGN + '\xc2' # 0xE5 -> LATIN CAPITAL LETTER A WITH CIRCUMFLEX + '\xca' # 0xE6 -> LATIN CAPITAL LETTER E WITH CIRCUMFLEX + '\xc1' # 0xE7 -> LATIN CAPITAL LETTER A WITH ACUTE + '\xcb' # 0xE8 -> LATIN CAPITAL LETTER E WITH DIAERESIS + '\xc8' # 0xE9 -> LATIN CAPITAL LETTER E WITH GRAVE + '\xcd' # 0xEA -> LATIN CAPITAL LETTER I WITH ACUTE + '\xce' # 0xEB -> LATIN CAPITAL LETTER I WITH CIRCUMFLEX + '\xcf' # 0xEC -> LATIN CAPITAL LETTER I WITH DIAERESIS + '\xcc' # 0xED -> LATIN CAPITAL LETTER I WITH GRAVE + '\xd3' # 0xEE -> LATIN CAPITAL LETTER O WITH ACUTE + '\xd4' # 0xEF -> LATIN CAPITAL LETTER O WITH CIRCUMFLEX + '\uf8ff' # 0xF0 -> Apple logo + '\xd2' # 0xF1 -> LATIN CAPITAL LETTER O WITH GRAVE + '\xda' # 0xF2 -> LATIN CAPITAL LETTER U WITH ACUTE + '\xdb' # 0xF3 -> LATIN CAPITAL LETTER U WITH CIRCUMFLEX + '\xd9' # 0xF4 -> LATIN CAPITAL LETTER U WITH GRAVE + '\u0131' # 0xF5 -> LATIN SMALL LETTER DOTLESS I + '\u02c6' # 0xF6 -> MODIFIER LETTER CIRCUMFLEX ACCENT + '\u02dc' # 0xF7 -> SMALL TILDE + '\xaf' # 0xF8 -> MACRON + '\u02d8' # 0xF9 -> BREVE + '\u02d9' # 0xFA -> DOT ABOVE + '\u02da' # 0xFB -> RING ABOVE + '\xb8' # 0xFC -> CEDILLA + '\u02dd' # 0xFD -> DOUBLE ACUTE ACCENT + '\u02db' # 0xFE -> OGONEK + '\u02c7' # 0xFF -> CARON +) + +### Encoding table +encoding_table=codecs.charmap_build(decoding_table) diff --git a/env/Lib/encodings/mac_turkish.py b/env/Lib/encodings/mac_turkish.py new file mode 100644 index 0000000..044d4cb --- /dev/null +++ b/env/Lib/encodings/mac_turkish.py @@ -0,0 +1,307 @@ +""" Python Character Mapping Codec mac_turkish generated from 'MAPPINGS/VENDORS/APPLE/TURKISH.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-turkish', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) + + +### Decoding Table + +decoding_table = ( + '\x00' # 0x00 -> CONTROL CHARACTER + '\x01' # 0x01 -> CONTROL CHARACTER + '\x02' # 0x02 -> CONTROL CHARACTER + '\x03' # 0x03 -> CONTROL CHARACTER + '\x04' # 0x04 -> CONTROL CHARACTER + '\x05' # 0x05 -> CONTROL CHARACTER + '\x06' # 0x06 -> CONTROL CHARACTER + '\x07' # 0x07 -> CONTROL CHARACTER + '\x08' # 0x08 -> CONTROL CHARACTER + '\t' # 0x09 -> CONTROL CHARACTER + '\n' # 0x0A -> CONTROL CHARACTER + '\x0b' # 0x0B -> CONTROL CHARACTER + '\x0c' # 0x0C -> CONTROL CHARACTER + '\r' # 0x0D -> CONTROL CHARACTER + '\x0e' # 0x0E -> CONTROL CHARACTER + '\x0f' # 0x0F -> CONTROL CHARACTER + '\x10' # 0x10 -> CONTROL CHARACTER + '\x11' # 0x11 -> CONTROL CHARACTER + '\x12' # 0x12 -> CONTROL CHARACTER + '\x13' # 0x13 -> CONTROL CHARACTER + '\x14' # 0x14 -> CONTROL CHARACTER + '\x15' # 0x15 -> CONTROL CHARACTER + '\x16' # 0x16 -> CONTROL CHARACTER + '\x17' # 0x17 -> CONTROL CHARACTER + '\x18' # 0x18 -> CONTROL CHARACTER + '\x19' # 0x19 -> CONTROL CHARACTER + '\x1a' # 0x1A -> CONTROL CHARACTER + '\x1b' # 0x1B -> CONTROL CHARACTER + '\x1c' # 0x1C -> CONTROL CHARACTER + '\x1d' # 0x1D -> CONTROL CHARACTER + '\x1e' # 0x1E -> CONTROL CHARACTER + '\x1f' # 0x1F -> CONTROL CHARACTER + ' ' # 0x20 -> SPACE + '!' # 0x21 -> EXCLAMATION MARK + '"' # 0x22 -> QUOTATION MARK + '#' # 0x23 -> NUMBER SIGN + '$' # 0x24 -> DOLLAR SIGN + '%' # 0x25 -> PERCENT SIGN + '&' # 0x26 -> AMPERSAND + "'" # 0x27 -> APOSTROPHE + '(' # 0x28 -> LEFT PARENTHESIS + ')' # 0x29 -> RIGHT PARENTHESIS + '*' # 0x2A -> ASTERISK + '+' # 0x2B -> PLUS SIGN + ',' # 0x2C -> COMMA + '-' # 0x2D -> HYPHEN-MINUS + '.' # 0x2E -> FULL STOP + '/' # 0x2F -> SOLIDUS + '0' # 0x30 -> DIGIT ZERO + '1' # 0x31 -> DIGIT ONE + '2' # 0x32 -> DIGIT TWO + '3' # 0x33 -> DIGIT THREE + '4' # 0x34 -> DIGIT FOUR + '5' # 0x35 -> DIGIT FIVE + '6' # 0x36 -> DIGIT SIX + '7' # 0x37 -> DIGIT SEVEN + '8' # 0x38 -> DIGIT EIGHT + '9' # 0x39 -> DIGIT NINE + ':' # 0x3A -> COLON + ';' # 0x3B -> SEMICOLON + '<' # 0x3C -> LESS-THAN SIGN + '=' # 0x3D -> EQUALS SIGN + '>' # 0x3E -> GREATER-THAN SIGN + '?' # 0x3F -> QUESTION MARK + '@' # 0x40 -> COMMERCIAL AT + 'A' # 0x41 -> LATIN CAPITAL LETTER A + 'B' # 0x42 -> LATIN CAPITAL LETTER B + 'C' # 0x43 -> LATIN CAPITAL LETTER C + 'D' # 0x44 -> LATIN CAPITAL LETTER D + 'E' # 0x45 -> LATIN CAPITAL LETTER E + 'F' # 0x46 -> LATIN CAPITAL LETTER F + 'G' # 0x47 -> LATIN CAPITAL LETTER G + 'H' # 0x48 -> LATIN CAPITAL LETTER H + 'I' # 0x49 -> LATIN CAPITAL LETTER I + 'J' # 0x4A -> LATIN CAPITAL LETTER J + 'K' # 0x4B -> LATIN CAPITAL LETTER K + 'L' # 0x4C -> LATIN CAPITAL LETTER L + 'M' # 0x4D -> LATIN CAPITAL LETTER M + 'N' # 0x4E -> LATIN CAPITAL LETTER N + 'O' # 0x4F -> LATIN CAPITAL LETTER O + 'P' # 0x50 -> LATIN CAPITAL LETTER P + 'Q' # 0x51 -> LATIN CAPITAL LETTER Q + 'R' # 0x52 -> LATIN CAPITAL LETTER R + 'S' # 0x53 -> LATIN CAPITAL LETTER S + 'T' # 0x54 -> LATIN CAPITAL LETTER T + 'U' # 0x55 -> LATIN CAPITAL LETTER U + 'V' # 0x56 -> LATIN CAPITAL LETTER V + 'W' # 0x57 -> LATIN CAPITAL LETTER W + 'X' # 0x58 -> LATIN CAPITAL LETTER X + 'Y' # 0x59 -> LATIN CAPITAL LETTER Y + 'Z' # 0x5A -> LATIN CAPITAL LETTER Z + '[' # 0x5B -> LEFT SQUARE BRACKET + '\\' # 0x5C -> REVERSE SOLIDUS + ']' # 0x5D -> RIGHT SQUARE BRACKET + '^' # 0x5E -> CIRCUMFLEX ACCENT + '_' # 0x5F -> LOW LINE + '`' # 0x60 -> GRAVE ACCENT + 'a' # 0x61 -> LATIN SMALL LETTER A + 'b' # 0x62 -> LATIN SMALL LETTER B + 'c' # 0x63 -> LATIN SMALL LETTER C + 'd' # 0x64 -> LATIN SMALL LETTER D + 'e' # 0x65 -> LATIN SMALL LETTER E + 'f' # 0x66 -> LATIN SMALL LETTER F + 'g' # 0x67 -> LATIN SMALL LETTER G + 'h' # 0x68 -> LATIN SMALL LETTER H + 'i' # 0x69 -> LATIN SMALL LETTER I + 'j' # 0x6A -> LATIN SMALL LETTER J + 'k' # 0x6B -> LATIN SMALL LETTER K + 'l' # 0x6C -> LATIN SMALL LETTER L + 'm' # 0x6D -> LATIN SMALL LETTER M + 'n' # 0x6E -> LATIN SMALL LETTER N + 'o' # 0x6F -> LATIN SMALL LETTER O + 'p' # 0x70 -> LATIN SMALL LETTER P + 'q' # 0x71 -> LATIN SMALL LETTER Q + 'r' # 0x72 -> LATIN SMALL LETTER R + 's' # 0x73 -> LATIN SMALL LETTER S + 't' # 0x74 -> LATIN SMALL LETTER T + 'u' # 0x75 -> LATIN SMALL LETTER U + 'v' # 0x76 -> LATIN SMALL LETTER V + 'w' # 0x77 -> LATIN SMALL LETTER W + 'x' # 0x78 -> LATIN SMALL LETTER X + 'y' # 0x79 -> LATIN SMALL LETTER Y + 'z' # 0x7A -> LATIN SMALL LETTER Z + '{' # 0x7B -> LEFT CURLY BRACKET + '|' # 0x7C -> VERTICAL LINE + '}' # 0x7D -> RIGHT CURLY BRACKET + '~' # 0x7E -> TILDE + '\x7f' # 0x7F -> CONTROL CHARACTER + '\xc4' # 0x80 -> LATIN CAPITAL LETTER A WITH DIAERESIS + '\xc5' # 0x81 -> LATIN CAPITAL LETTER A WITH RING ABOVE + '\xc7' # 0x82 -> LATIN CAPITAL LETTER C WITH CEDILLA + '\xc9' # 0x83 -> LATIN CAPITAL LETTER E WITH ACUTE + '\xd1' # 0x84 -> LATIN CAPITAL LETTER N WITH TILDE + '\xd6' # 0x85 -> LATIN CAPITAL LETTER O WITH DIAERESIS + '\xdc' # 0x86 -> LATIN CAPITAL LETTER U WITH DIAERESIS + '\xe1' # 0x87 -> LATIN SMALL LETTER A WITH ACUTE + '\xe0' # 0x88 -> LATIN SMALL LETTER A WITH GRAVE + '\xe2' # 0x89 -> LATIN SMALL LETTER A WITH CIRCUMFLEX + '\xe4' # 0x8A -> LATIN SMALL LETTER A WITH DIAERESIS + '\xe3' # 0x8B -> LATIN SMALL LETTER A WITH TILDE + '\xe5' # 0x8C -> LATIN SMALL LETTER A WITH RING ABOVE + '\xe7' # 0x8D -> LATIN SMALL LETTER C WITH CEDILLA + '\xe9' # 0x8E -> LATIN SMALL LETTER E WITH ACUTE + '\xe8' # 0x8F -> LATIN SMALL LETTER E WITH GRAVE + '\xea' # 0x90 -> LATIN SMALL LETTER E WITH CIRCUMFLEX + '\xeb' # 0x91 -> LATIN SMALL LETTER E WITH DIAERESIS + '\xed' # 0x92 -> LATIN SMALL LETTER I WITH ACUTE + '\xec' # 0x93 -> LATIN SMALL LETTER I WITH GRAVE + '\xee' # 0x94 -> LATIN SMALL LETTER I WITH CIRCUMFLEX + '\xef' # 0x95 -> LATIN SMALL LETTER I WITH DIAERESIS + '\xf1' # 0x96 -> LATIN SMALL LETTER N WITH TILDE + '\xf3' # 0x97 -> LATIN SMALL LETTER O WITH ACUTE + '\xf2' # 0x98 -> LATIN SMALL LETTER O WITH GRAVE + '\xf4' # 0x99 -> LATIN SMALL LETTER O WITH CIRCUMFLEX + '\xf6' # 0x9A -> LATIN SMALL LETTER O WITH DIAERESIS + '\xf5' # 0x9B -> LATIN SMALL LETTER O WITH TILDE + '\xfa' # 0x9C -> LATIN SMALL LETTER U WITH ACUTE + '\xf9' # 0x9D -> LATIN SMALL LETTER U WITH GRAVE + '\xfb' # 0x9E -> LATIN SMALL LETTER U WITH CIRCUMFLEX + '\xfc' # 0x9F -> LATIN SMALL LETTER U WITH DIAERESIS + '\u2020' # 0xA0 -> DAGGER + '\xb0' # 0xA1 -> DEGREE SIGN + '\xa2' # 0xA2 -> CENT SIGN + '\xa3' # 0xA3 -> POUND SIGN + '\xa7' # 0xA4 -> SECTION SIGN + '\u2022' # 0xA5 -> BULLET + '\xb6' # 0xA6 -> PILCROW SIGN + '\xdf' # 0xA7 -> LATIN SMALL LETTER SHARP S + '\xae' # 0xA8 -> REGISTERED SIGN + '\xa9' # 0xA9 -> COPYRIGHT SIGN + '\u2122' # 0xAA -> TRADE MARK SIGN + '\xb4' # 0xAB -> ACUTE ACCENT + '\xa8' # 0xAC -> DIAERESIS + '\u2260' # 0xAD -> NOT EQUAL TO + '\xc6' # 0xAE -> LATIN CAPITAL LETTER AE + '\xd8' # 0xAF -> LATIN CAPITAL LETTER O WITH STROKE + '\u221e' # 0xB0 -> INFINITY + '\xb1' # 0xB1 -> PLUS-MINUS SIGN + '\u2264' # 0xB2 -> LESS-THAN OR EQUAL TO + '\u2265' # 0xB3 -> GREATER-THAN OR EQUAL TO + '\xa5' # 0xB4 -> YEN SIGN + '\xb5' # 0xB5 -> MICRO SIGN + '\u2202' # 0xB6 -> PARTIAL DIFFERENTIAL + '\u2211' # 0xB7 -> N-ARY SUMMATION + '\u220f' # 0xB8 -> N-ARY PRODUCT + '\u03c0' # 0xB9 -> GREEK SMALL LETTER PI + '\u222b' # 0xBA -> INTEGRAL + '\xaa' # 0xBB -> FEMININE ORDINAL INDICATOR + '\xba' # 0xBC -> MASCULINE ORDINAL INDICATOR + '\u03a9' # 0xBD -> GREEK CAPITAL LETTER OMEGA + '\xe6' # 0xBE -> LATIN SMALL LETTER AE + '\xf8' # 0xBF -> LATIN SMALL LETTER O WITH STROKE + '\xbf' # 0xC0 -> INVERTED QUESTION MARK + '\xa1' # 0xC1 -> INVERTED EXCLAMATION MARK + '\xac' # 0xC2 -> NOT SIGN + '\u221a' # 0xC3 -> SQUARE ROOT + '\u0192' # 0xC4 -> LATIN SMALL LETTER F WITH HOOK + '\u2248' # 0xC5 -> ALMOST EQUAL TO + '\u2206' # 0xC6 -> INCREMENT + '\xab' # 0xC7 -> LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + '\xbb' # 0xC8 -> RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + '\u2026' # 0xC9 -> HORIZONTAL ELLIPSIS + '\xa0' # 0xCA -> NO-BREAK SPACE + '\xc0' # 0xCB -> LATIN CAPITAL LETTER A WITH GRAVE + '\xc3' # 0xCC -> LATIN CAPITAL LETTER A WITH TILDE + '\xd5' # 0xCD -> LATIN CAPITAL LETTER O WITH TILDE + '\u0152' # 0xCE -> LATIN CAPITAL LIGATURE OE + '\u0153' # 0xCF -> LATIN SMALL LIGATURE OE + '\u2013' # 0xD0 -> EN DASH + '\u2014' # 0xD1 -> EM DASH + '\u201c' # 0xD2 -> LEFT DOUBLE QUOTATION MARK + '\u201d' # 0xD3 -> RIGHT DOUBLE QUOTATION MARK + '\u2018' # 0xD4 -> LEFT SINGLE QUOTATION MARK + '\u2019' # 0xD5 -> RIGHT SINGLE QUOTATION MARK + '\xf7' # 0xD6 -> DIVISION SIGN + '\u25ca' # 0xD7 -> LOZENGE + '\xff' # 0xD8 -> LATIN SMALL LETTER Y WITH DIAERESIS + '\u0178' # 0xD9 -> LATIN CAPITAL LETTER Y WITH DIAERESIS + '\u011e' # 0xDA -> LATIN CAPITAL LETTER G WITH BREVE + '\u011f' # 0xDB -> LATIN SMALL LETTER G WITH BREVE + '\u0130' # 0xDC -> LATIN CAPITAL LETTER I WITH DOT ABOVE + '\u0131' # 0xDD -> LATIN SMALL LETTER DOTLESS I + '\u015e' # 0xDE -> LATIN CAPITAL LETTER S WITH CEDILLA + '\u015f' # 0xDF -> LATIN SMALL LETTER S WITH CEDILLA + '\u2021' # 0xE0 -> DOUBLE DAGGER + '\xb7' # 0xE1 -> MIDDLE DOT + '\u201a' # 0xE2 -> SINGLE LOW-9 QUOTATION MARK + '\u201e' # 0xE3 -> DOUBLE LOW-9 QUOTATION MARK + '\u2030' # 0xE4 -> PER MILLE SIGN + '\xc2' # 0xE5 -> LATIN CAPITAL LETTER A WITH CIRCUMFLEX + '\xca' # 0xE6 -> LATIN CAPITAL LETTER E WITH CIRCUMFLEX + '\xc1' # 0xE7 -> LATIN CAPITAL LETTER A WITH ACUTE + '\xcb' # 0xE8 -> LATIN CAPITAL LETTER E WITH DIAERESIS + '\xc8' # 0xE9 -> LATIN CAPITAL LETTER E WITH GRAVE + '\xcd' # 0xEA -> LATIN CAPITAL LETTER I WITH ACUTE + '\xce' # 0xEB -> LATIN CAPITAL LETTER I WITH CIRCUMFLEX + '\xcf' # 0xEC -> LATIN CAPITAL LETTER I WITH DIAERESIS + '\xcc' # 0xED -> LATIN CAPITAL LETTER I WITH GRAVE + '\xd3' # 0xEE -> LATIN CAPITAL LETTER O WITH ACUTE + '\xd4' # 0xEF -> LATIN CAPITAL LETTER O WITH CIRCUMFLEX + '\uf8ff' # 0xF0 -> Apple logo + '\xd2' # 0xF1 -> LATIN CAPITAL LETTER O WITH GRAVE + '\xda' # 0xF2 -> LATIN CAPITAL LETTER U WITH ACUTE + '\xdb' # 0xF3 -> LATIN CAPITAL LETTER U WITH CIRCUMFLEX + '\xd9' # 0xF4 -> LATIN CAPITAL LETTER U WITH GRAVE + '\uf8a0' # 0xF5 -> undefined1 + '\u02c6' # 0xF6 -> MODIFIER LETTER CIRCUMFLEX ACCENT + '\u02dc' # 0xF7 -> SMALL TILDE + '\xaf' # 0xF8 -> MACRON + '\u02d8' # 0xF9 -> BREVE + '\u02d9' # 0xFA -> DOT ABOVE + '\u02da' # 0xFB -> RING ABOVE + '\xb8' # 0xFC -> CEDILLA + '\u02dd' # 0xFD -> DOUBLE ACUTE ACCENT + '\u02db' # 0xFE -> OGONEK + '\u02c7' # 0xFF -> CARON +) + +### Encoding table +encoding_table=codecs.charmap_build(decoding_table) diff --git a/env/Lib/encodings/mbcs.py b/env/Lib/encodings/mbcs.py new file mode 100644 index 0000000..baf46cb --- /dev/null +++ b/env/Lib/encodings/mbcs.py @@ -0,0 +1,47 @@ +""" Python 'mbcs' Codec for Windows + + +Cloned by Mark Hammond (mhammond@skippinet.com.au) from ascii.py, +which was written by Marc-Andre Lemburg (mal@lemburg.com). + +(c) Copyright CNRI, All Rights Reserved. NO WARRANTY. + +""" +# Import them explicitly to cause an ImportError +# on non-Windows systems +from codecs import mbcs_encode, mbcs_decode +# for IncrementalDecoder, IncrementalEncoder, ... +import codecs + +### Codec APIs + +encode = mbcs_encode + +def decode(input, errors='strict'): + return mbcs_decode(input, errors, True) + +class IncrementalEncoder(codecs.IncrementalEncoder): + def encode(self, input, final=False): + return mbcs_encode(input, self.errors)[0] + +class IncrementalDecoder(codecs.BufferedIncrementalDecoder): + _buffer_decode = mbcs_decode + +class StreamWriter(codecs.StreamWriter): + encode = mbcs_encode + +class StreamReader(codecs.StreamReader): + decode = mbcs_decode + +### encodings module API + +def getregentry(): + return codecs.CodecInfo( + name='mbcs', + encode=encode, + decode=decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) diff --git a/env/Lib/encodings/oem.py b/env/Lib/encodings/oem.py new file mode 100644 index 0000000..2c3426b --- /dev/null +++ b/env/Lib/encodings/oem.py @@ -0,0 +1,41 @@ +""" Python 'oem' Codec for Windows + +""" +# Import them explicitly to cause an ImportError +# on non-Windows systems +from codecs import oem_encode, oem_decode +# for IncrementalDecoder, IncrementalEncoder, ... +import codecs + +### Codec APIs + +encode = oem_encode + +def decode(input, errors='strict'): + return oem_decode(input, errors, True) + +class IncrementalEncoder(codecs.IncrementalEncoder): + def encode(self, input, final=False): + return oem_encode(input, self.errors)[0] + +class IncrementalDecoder(codecs.BufferedIncrementalDecoder): + _buffer_decode = oem_decode + +class StreamWriter(codecs.StreamWriter): + encode = oem_encode + +class StreamReader(codecs.StreamReader): + decode = oem_decode + +### encodings module API + +def getregentry(): + return codecs.CodecInfo( + name='oem', + encode=encode, + decode=decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) diff --git a/env/Lib/encodings/palmos.py b/env/Lib/encodings/palmos.py new file mode 100644 index 0000000..c506d65 --- /dev/null +++ b/env/Lib/encodings/palmos.py @@ -0,0 +1,308 @@ +""" 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_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='palmos', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) + + +### Decoding Table + +decoding_table = ( + '\x00' # 0x00 -> NULL + '\x01' # 0x01 -> START OF HEADING + '\x02' # 0x02 -> START OF TEXT + '\x03' # 0x03 -> END OF TEXT + '\x04' # 0x04 -> END OF TRANSMISSION + '\x05' # 0x05 -> ENQUIRY + '\x06' # 0x06 -> ACKNOWLEDGE + '\x07' # 0x07 -> BELL + '\x08' # 0x08 -> BACKSPACE + '\t' # 0x09 -> HORIZONTAL TABULATION + '\n' # 0x0A -> LINE FEED + '\x0b' # 0x0B -> VERTICAL TABULATION + '\x0c' # 0x0C -> FORM FEED + '\r' # 0x0D -> CARRIAGE RETURN + '\x0e' # 0x0E -> SHIFT OUT + '\x0f' # 0x0F -> SHIFT IN + '\x10' # 0x10 -> DATA LINK ESCAPE + '\x11' # 0x11 -> DEVICE CONTROL ONE + '\x12' # 0x12 -> DEVICE CONTROL TWO + '\x13' # 0x13 -> DEVICE CONTROL THREE + '\x14' # 0x14 -> DEVICE CONTROL FOUR + '\x15' # 0x15 -> NEGATIVE ACKNOWLEDGE + '\x16' # 0x16 -> SYNCHRONOUS IDLE + '\x17' # 0x17 -> END OF TRANSMISSION BLOCK + '\x18' # 0x18 -> CANCEL + '\x19' # 0x19 -> END OF MEDIUM + '\x1a' # 0x1A -> SUBSTITUTE + '\x1b' # 0x1B -> ESCAPE + '\x1c' # 0x1C -> FILE SEPARATOR + '\x1d' # 0x1D -> GROUP SEPARATOR + '\x1e' # 0x1E -> RECORD SEPARATOR + '\x1f' # 0x1F -> UNIT SEPARATOR + ' ' # 0x20 -> SPACE + '!' # 0x21 -> EXCLAMATION MARK + '"' # 0x22 -> QUOTATION MARK + '#' # 0x23 -> NUMBER SIGN + '$' # 0x24 -> DOLLAR SIGN + '%' # 0x25 -> PERCENT SIGN + '&' # 0x26 -> AMPERSAND + "'" # 0x27 -> APOSTROPHE + '(' # 0x28 -> LEFT PARENTHESIS + ')' # 0x29 -> RIGHT PARENTHESIS + '*' # 0x2A -> ASTERISK + '+' # 0x2B -> PLUS SIGN + ',' # 0x2C -> COMMA + '-' # 0x2D -> HYPHEN-MINUS + '.' # 0x2E -> FULL STOP + '/' # 0x2F -> SOLIDUS + '0' # 0x30 -> DIGIT ZERO + '1' # 0x31 -> DIGIT ONE + '2' # 0x32 -> DIGIT TWO + '3' # 0x33 -> DIGIT THREE + '4' # 0x34 -> DIGIT FOUR + '5' # 0x35 -> DIGIT FIVE + '6' # 0x36 -> DIGIT SIX + '7' # 0x37 -> DIGIT SEVEN + '8' # 0x38 -> DIGIT EIGHT + '9' # 0x39 -> DIGIT NINE + ':' # 0x3A -> COLON + ';' # 0x3B -> SEMICOLON + '<' # 0x3C -> LESS-THAN SIGN + '=' # 0x3D -> EQUALS SIGN + '>' # 0x3E -> GREATER-THAN SIGN + '?' # 0x3F -> QUESTION MARK + '@' # 0x40 -> COMMERCIAL AT + 'A' # 0x41 -> LATIN CAPITAL LETTER A + 'B' # 0x42 -> LATIN CAPITAL LETTER B + 'C' # 0x43 -> LATIN CAPITAL LETTER C + 'D' # 0x44 -> LATIN CAPITAL LETTER D + 'E' # 0x45 -> LATIN CAPITAL LETTER E + 'F' # 0x46 -> LATIN CAPITAL LETTER F + 'G' # 0x47 -> LATIN CAPITAL LETTER G + 'H' # 0x48 -> LATIN CAPITAL LETTER H + 'I' # 0x49 -> LATIN CAPITAL LETTER I + 'J' # 0x4A -> LATIN CAPITAL LETTER J + 'K' # 0x4B -> LATIN CAPITAL LETTER K + 'L' # 0x4C -> LATIN CAPITAL LETTER L + 'M' # 0x4D -> LATIN CAPITAL LETTER M + 'N' # 0x4E -> LATIN CAPITAL LETTER N + 'O' # 0x4F -> LATIN CAPITAL LETTER O + 'P' # 0x50 -> LATIN CAPITAL LETTER P + 'Q' # 0x51 -> LATIN CAPITAL LETTER Q + 'R' # 0x52 -> LATIN CAPITAL LETTER R + 'S' # 0x53 -> LATIN CAPITAL LETTER S + 'T' # 0x54 -> LATIN CAPITAL LETTER T + 'U' # 0x55 -> LATIN CAPITAL LETTER U + 'V' # 0x56 -> LATIN CAPITAL LETTER V + 'W' # 0x57 -> LATIN CAPITAL LETTER W + 'X' # 0x58 -> LATIN CAPITAL LETTER X + 'Y' # 0x59 -> LATIN CAPITAL LETTER Y + 'Z' # 0x5A -> LATIN CAPITAL LETTER Z + '[' # 0x5B -> LEFT SQUARE BRACKET + '\\' # 0x5C -> REVERSE SOLIDUS + ']' # 0x5D -> RIGHT SQUARE BRACKET + '^' # 0x5E -> CIRCUMFLEX ACCENT + '_' # 0x5F -> LOW LINE + '`' # 0x60 -> GRAVE ACCENT + 'a' # 0x61 -> LATIN SMALL LETTER A + 'b' # 0x62 -> LATIN SMALL LETTER B + 'c' # 0x63 -> LATIN SMALL LETTER C + 'd' # 0x64 -> LATIN SMALL LETTER D + 'e' # 0x65 -> LATIN SMALL LETTER E + 'f' # 0x66 -> LATIN SMALL LETTER F + 'g' # 0x67 -> LATIN SMALL LETTER G + 'h' # 0x68 -> LATIN SMALL LETTER H + 'i' # 0x69 -> LATIN SMALL LETTER I + 'j' # 0x6A -> LATIN SMALL LETTER J + 'k' # 0x6B -> LATIN SMALL LETTER K + 'l' # 0x6C -> LATIN SMALL LETTER L + 'm' # 0x6D -> LATIN SMALL LETTER M + 'n' # 0x6E -> LATIN SMALL LETTER N + 'o' # 0x6F -> LATIN SMALL LETTER O + 'p' # 0x70 -> LATIN SMALL LETTER P + 'q' # 0x71 -> LATIN SMALL LETTER Q + 'r' # 0x72 -> LATIN SMALL LETTER R + 's' # 0x73 -> LATIN SMALL LETTER S + 't' # 0x74 -> LATIN SMALL LETTER T + 'u' # 0x75 -> LATIN SMALL LETTER U + 'v' # 0x76 -> LATIN SMALL LETTER V + 'w' # 0x77 -> LATIN SMALL LETTER W + 'x' # 0x78 -> LATIN SMALL LETTER X + 'y' # 0x79 -> LATIN SMALL LETTER Y + 'z' # 0x7A -> LATIN SMALL LETTER Z + '{' # 0x7B -> LEFT CURLY BRACKET + '|' # 0x7C -> VERTICAL LINE + '}' # 0x7D -> RIGHT CURLY BRACKET + '~' # 0x7E -> TILDE + '\x7f' # 0x7F -> DELETE + '\u20ac' # 0x80 -> EURO SIGN + '\x81' # 0x81 -> + '\u201a' # 0x82 -> SINGLE LOW-9 QUOTATION MARK + '\u0192' # 0x83 -> LATIN SMALL LETTER F WITH HOOK + '\u201e' # 0x84 -> DOUBLE LOW-9 QUOTATION MARK + '\u2026' # 0x85 -> HORIZONTAL ELLIPSIS + '\u2020' # 0x86 -> DAGGER + '\u2021' # 0x87 -> DOUBLE DAGGER + '\u02c6' # 0x88 -> MODIFIER LETTER CIRCUMFLEX ACCENT + '\u2030' # 0x89 -> PER MILLE SIGN + '\u0160' # 0x8A -> LATIN CAPITAL LETTER S WITH CARON + '\u2039' # 0x8B -> SINGLE LEFT-POINTING ANGLE QUOTATION MARK + '\u0152' # 0x8C -> LATIN CAPITAL LIGATURE OE + '\u2666' # 0x8D -> BLACK DIAMOND SUIT + '\u2663' # 0x8E -> BLACK CLUB SUIT + '\u2665' # 0x8F -> BLACK HEART SUIT + '\u2660' # 0x90 -> BLACK SPADE SUIT + '\u2018' # 0x91 -> LEFT SINGLE QUOTATION MARK + '\u2019' # 0x92 -> RIGHT SINGLE QUOTATION MARK + '\u201c' # 0x93 -> LEFT DOUBLE QUOTATION MARK + '\u201d' # 0x94 -> RIGHT DOUBLE QUOTATION MARK + '\u2022' # 0x95 -> BULLET + '\u2013' # 0x96 -> EN DASH + '\u2014' # 0x97 -> EM DASH + '\u02dc' # 0x98 -> SMALL TILDE + '\u2122' # 0x99 -> TRADE MARK SIGN + '\u0161' # 0x9A -> LATIN SMALL LETTER S WITH CARON + '\x9b' # 0x9B -> + '\u0153' # 0x9C -> LATIN SMALL LIGATURE OE + '\x9d' # 0x9D -> + '\x9e' # 0x9E -> + '\u0178' # 0x9F -> LATIN CAPITAL LETTER Y WITH DIAERESIS + '\xa0' # 0xA0 -> NO-BREAK SPACE + '\xa1' # 0xA1 -> INVERTED EXCLAMATION MARK + '\xa2' # 0xA2 -> CENT SIGN + '\xa3' # 0xA3 -> POUND SIGN + '\xa4' # 0xA4 -> CURRENCY SIGN + '\xa5' # 0xA5 -> YEN SIGN + '\xa6' # 0xA6 -> BROKEN BAR + '\xa7' # 0xA7 -> SECTION SIGN + '\xa8' # 0xA8 -> DIAERESIS + '\xa9' # 0xA9 -> COPYRIGHT SIGN + '\xaa' # 0xAA -> FEMININE ORDINAL INDICATOR + '\xab' # 0xAB -> LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + '\xac' # 0xAC -> NOT SIGN + '\xad' # 0xAD -> SOFT HYPHEN + '\xae' # 0xAE -> REGISTERED SIGN + '\xaf' # 0xAF -> MACRON + '\xb0' # 0xB0 -> DEGREE SIGN + '\xb1' # 0xB1 -> PLUS-MINUS SIGN + '\xb2' # 0xB2 -> SUPERSCRIPT TWO + '\xb3' # 0xB3 -> SUPERSCRIPT THREE + '\xb4' # 0xB4 -> ACUTE ACCENT + '\xb5' # 0xB5 -> MICRO SIGN + '\xb6' # 0xB6 -> PILCROW SIGN + '\xb7' # 0xB7 -> MIDDLE DOT + '\xb8' # 0xB8 -> CEDILLA + '\xb9' # 0xB9 -> SUPERSCRIPT ONE + '\xba' # 0xBA -> MASCULINE ORDINAL INDICATOR + '\xbb' # 0xBB -> RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + '\xbc' # 0xBC -> VULGAR FRACTION ONE QUARTER + '\xbd' # 0xBD -> VULGAR FRACTION ONE HALF + '\xbe' # 0xBE -> VULGAR FRACTION THREE QUARTERS + '\xbf' # 0xBF -> INVERTED QUESTION MARK + '\xc0' # 0xC0 -> LATIN CAPITAL LETTER A WITH GRAVE + '\xc1' # 0xC1 -> LATIN CAPITAL LETTER A WITH ACUTE + '\xc2' # 0xC2 -> LATIN CAPITAL LETTER A WITH CIRCUMFLEX + '\xc3' # 0xC3 -> LATIN CAPITAL LETTER A WITH TILDE + '\xc4' # 0xC4 -> LATIN CAPITAL LETTER A WITH DIAERESIS + '\xc5' # 0xC5 -> LATIN CAPITAL LETTER A WITH RING ABOVE + '\xc6' # 0xC6 -> LATIN CAPITAL LETTER AE + '\xc7' # 0xC7 -> LATIN CAPITAL LETTER C WITH CEDILLA + '\xc8' # 0xC8 -> LATIN CAPITAL LETTER E WITH GRAVE + '\xc9' # 0xC9 -> LATIN CAPITAL LETTER E WITH ACUTE + '\xca' # 0xCA -> LATIN CAPITAL LETTER E WITH CIRCUMFLEX + '\xcb' # 0xCB -> LATIN CAPITAL LETTER E WITH DIAERESIS + '\xcc' # 0xCC -> LATIN CAPITAL LETTER I WITH GRAVE + '\xcd' # 0xCD -> LATIN CAPITAL LETTER I WITH ACUTE + '\xce' # 0xCE -> LATIN CAPITAL LETTER I WITH CIRCUMFLEX + '\xcf' # 0xCF -> LATIN CAPITAL LETTER I WITH DIAERESIS + '\xd0' # 0xD0 -> LATIN CAPITAL LETTER ETH (Icelandic) + '\xd1' # 0xD1 -> LATIN CAPITAL LETTER N WITH TILDE + '\xd2' # 0xD2 -> LATIN CAPITAL LETTER O WITH GRAVE + '\xd3' # 0xD3 -> LATIN CAPITAL LETTER O WITH ACUTE + '\xd4' # 0xD4 -> LATIN CAPITAL LETTER O WITH CIRCUMFLEX + '\xd5' # 0xD5 -> LATIN CAPITAL LETTER O WITH TILDE + '\xd6' # 0xD6 -> LATIN CAPITAL LETTER O WITH DIAERESIS + '\xd7' # 0xD7 -> MULTIPLICATION SIGN + '\xd8' # 0xD8 -> LATIN CAPITAL LETTER O WITH STROKE + '\xd9' # 0xD9 -> LATIN CAPITAL LETTER U WITH GRAVE + '\xda' # 0xDA -> LATIN CAPITAL LETTER U WITH ACUTE + '\xdb' # 0xDB -> LATIN CAPITAL LETTER U WITH CIRCUMFLEX + '\xdc' # 0xDC -> LATIN CAPITAL LETTER U WITH DIAERESIS + '\xdd' # 0xDD -> LATIN CAPITAL LETTER Y WITH ACUTE + '\xde' # 0xDE -> LATIN CAPITAL LETTER THORN (Icelandic) + '\xdf' # 0xDF -> LATIN SMALL LETTER SHARP S (German) + '\xe0' # 0xE0 -> LATIN SMALL LETTER A WITH GRAVE + '\xe1' # 0xE1 -> LATIN SMALL LETTER A WITH ACUTE + '\xe2' # 0xE2 -> LATIN SMALL LETTER A WITH CIRCUMFLEX + '\xe3' # 0xE3 -> LATIN SMALL LETTER A WITH TILDE + '\xe4' # 0xE4 -> LATIN SMALL LETTER A WITH DIAERESIS + '\xe5' # 0xE5 -> LATIN SMALL LETTER A WITH RING ABOVE + '\xe6' # 0xE6 -> LATIN SMALL LETTER AE + '\xe7' # 0xE7 -> LATIN SMALL LETTER C WITH CEDILLA + '\xe8' # 0xE8 -> LATIN SMALL LETTER E WITH GRAVE + '\xe9' # 0xE9 -> LATIN SMALL LETTER E WITH ACUTE + '\xea' # 0xEA -> LATIN SMALL LETTER E WITH CIRCUMFLEX + '\xeb' # 0xEB -> LATIN SMALL LETTER E WITH DIAERESIS + '\xec' # 0xEC -> LATIN SMALL LETTER I WITH GRAVE + '\xed' # 0xED -> LATIN SMALL LETTER I WITH ACUTE + '\xee' # 0xEE -> LATIN SMALL LETTER I WITH CIRCUMFLEX + '\xef' # 0xEF -> LATIN SMALL LETTER I WITH DIAERESIS + '\xf0' # 0xF0 -> LATIN SMALL LETTER ETH (Icelandic) + '\xf1' # 0xF1 -> LATIN SMALL LETTER N WITH TILDE + '\xf2' # 0xF2 -> LATIN SMALL LETTER O WITH GRAVE + '\xf3' # 0xF3 -> LATIN SMALL LETTER O WITH ACUTE + '\xf4' # 0xF4 -> LATIN SMALL LETTER O WITH CIRCUMFLEX + '\xf5' # 0xF5 -> LATIN SMALL LETTER O WITH TILDE + '\xf6' # 0xF6 -> LATIN SMALL LETTER O WITH DIAERESIS + '\xf7' # 0xF7 -> DIVISION SIGN + '\xf8' # 0xF8 -> LATIN SMALL LETTER O WITH STROKE + '\xf9' # 0xF9 -> LATIN SMALL LETTER U WITH GRAVE + '\xfa' # 0xFA -> LATIN SMALL LETTER U WITH ACUTE + '\xfb' # 0xFB -> LATIN SMALL LETTER U WITH CIRCUMFLEX + '\xfc' # 0xFC -> LATIN SMALL LETTER U WITH DIAERESIS + '\xfd' # 0xFD -> LATIN SMALL LETTER Y WITH ACUTE + '\xfe' # 0xFE -> LATIN SMALL LETTER THORN (Icelandic) + '\xff' # 0xFF -> LATIN SMALL LETTER Y WITH DIAERESIS +) + +### Encoding table +encoding_table=codecs.charmap_build(decoding_table) diff --git a/env/Lib/encodings/ptcp154.py b/env/Lib/encodings/ptcp154.py new file mode 100644 index 0000000..656b79d --- /dev/null +++ b/env/Lib/encodings/ptcp154.py @@ -0,0 +1,312 @@ +""" 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_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='ptcp154', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) + + +### Decoding Table + +decoding_table = ( + '\x00' # 0x00 -> NULL + '\x01' # 0x01 -> START OF HEADING + '\x02' # 0x02 -> START OF TEXT + '\x03' # 0x03 -> END OF TEXT + '\x04' # 0x04 -> END OF TRANSMISSION + '\x05' # 0x05 -> ENQUIRY + '\x06' # 0x06 -> ACKNOWLEDGE + '\x07' # 0x07 -> BELL + '\x08' # 0x08 -> BACKSPACE + '\t' # 0x09 -> HORIZONTAL TABULATION + '\n' # 0x0A -> LINE FEED + '\x0b' # 0x0B -> VERTICAL TABULATION + '\x0c' # 0x0C -> FORM FEED + '\r' # 0x0D -> CARRIAGE RETURN + '\x0e' # 0x0E -> SHIFT OUT + '\x0f' # 0x0F -> SHIFT IN + '\x10' # 0x10 -> DATA LINK ESCAPE + '\x11' # 0x11 -> DEVICE CONTROL ONE + '\x12' # 0x12 -> DEVICE CONTROL TWO + '\x13' # 0x13 -> DEVICE CONTROL THREE + '\x14' # 0x14 -> DEVICE CONTROL FOUR + '\x15' # 0x15 -> NEGATIVE ACKNOWLEDGE + '\x16' # 0x16 -> SYNCHRONOUS IDLE + '\x17' # 0x17 -> END OF TRANSMISSION BLOCK + '\x18' # 0x18 -> CANCEL + '\x19' # 0x19 -> END OF MEDIUM + '\x1a' # 0x1A -> SUBSTITUTE + '\x1b' # 0x1B -> ESCAPE + '\x1c' # 0x1C -> FILE SEPARATOR + '\x1d' # 0x1D -> GROUP SEPARATOR + '\x1e' # 0x1E -> RECORD SEPARATOR + '\x1f' # 0x1F -> UNIT SEPARATOR + ' ' # 0x20 -> SPACE + '!' # 0x21 -> EXCLAMATION MARK + '"' # 0x22 -> QUOTATION MARK + '#' # 0x23 -> NUMBER SIGN + '$' # 0x24 -> DOLLAR SIGN + '%' # 0x25 -> PERCENT SIGN + '&' # 0x26 -> AMPERSAND + "'" # 0x27 -> APOSTROPHE + '(' # 0x28 -> LEFT PARENTHESIS + ')' # 0x29 -> RIGHT PARENTHESIS + '*' # 0x2A -> ASTERISK + '+' # 0x2B -> PLUS SIGN + ',' # 0x2C -> COMMA + '-' # 0x2D -> HYPHEN-MINUS + '.' # 0x2E -> FULL STOP + '/' # 0x2F -> SOLIDUS + '0' # 0x30 -> DIGIT ZERO + '1' # 0x31 -> DIGIT ONE + '2' # 0x32 -> DIGIT TWO + '3' # 0x33 -> DIGIT THREE + '4' # 0x34 -> DIGIT FOUR + '5' # 0x35 -> DIGIT FIVE + '6' # 0x36 -> DIGIT SIX + '7' # 0x37 -> DIGIT SEVEN + '8' # 0x38 -> DIGIT EIGHT + '9' # 0x39 -> DIGIT NINE + ':' # 0x3A -> COLON + ';' # 0x3B -> SEMICOLON + '<' # 0x3C -> LESS-THAN SIGN + '=' # 0x3D -> EQUALS SIGN + '>' # 0x3E -> GREATER-THAN SIGN + '?' # 0x3F -> QUESTION MARK + '@' # 0x40 -> COMMERCIAL AT + 'A' # 0x41 -> LATIN CAPITAL LETTER A + 'B' # 0x42 -> LATIN CAPITAL LETTER B + 'C' # 0x43 -> LATIN CAPITAL LETTER C + 'D' # 0x44 -> LATIN CAPITAL LETTER D + 'E' # 0x45 -> LATIN CAPITAL LETTER E + 'F' # 0x46 -> LATIN CAPITAL LETTER F + 'G' # 0x47 -> LATIN CAPITAL LETTER G + 'H' # 0x48 -> LATIN CAPITAL LETTER H + 'I' # 0x49 -> LATIN CAPITAL LETTER I + 'J' # 0x4A -> LATIN CAPITAL LETTER J + 'K' # 0x4B -> LATIN CAPITAL LETTER K + 'L' # 0x4C -> LATIN CAPITAL LETTER L + 'M' # 0x4D -> LATIN CAPITAL LETTER M + 'N' # 0x4E -> LATIN CAPITAL LETTER N + 'O' # 0x4F -> LATIN CAPITAL LETTER O + 'P' # 0x50 -> LATIN CAPITAL LETTER P + 'Q' # 0x51 -> LATIN CAPITAL LETTER Q + 'R' # 0x52 -> LATIN CAPITAL LETTER R + 'S' # 0x53 -> LATIN CAPITAL LETTER S + 'T' # 0x54 -> LATIN CAPITAL LETTER T + 'U' # 0x55 -> LATIN CAPITAL LETTER U + 'V' # 0x56 -> LATIN CAPITAL LETTER V + 'W' # 0x57 -> LATIN CAPITAL LETTER W + 'X' # 0x58 -> LATIN CAPITAL LETTER X + 'Y' # 0x59 -> LATIN CAPITAL LETTER Y + 'Z' # 0x5A -> LATIN CAPITAL LETTER Z + '[' # 0x5B -> LEFT SQUARE BRACKET + '\\' # 0x5C -> REVERSE SOLIDUS + ']' # 0x5D -> RIGHT SQUARE BRACKET + '^' # 0x5E -> CIRCUMFLEX ACCENT + '_' # 0x5F -> LOW LINE + '`' # 0x60 -> GRAVE ACCENT + 'a' # 0x61 -> LATIN SMALL LETTER A + 'b' # 0x62 -> LATIN SMALL LETTER B + 'c' # 0x63 -> LATIN SMALL LETTER C + 'd' # 0x64 -> LATIN SMALL LETTER D + 'e' # 0x65 -> LATIN SMALL LETTER E + 'f' # 0x66 -> LATIN SMALL LETTER F + 'g' # 0x67 -> LATIN SMALL LETTER G + 'h' # 0x68 -> LATIN SMALL LETTER H + 'i' # 0x69 -> LATIN SMALL LETTER I + 'j' # 0x6A -> LATIN SMALL LETTER J + 'k' # 0x6B -> LATIN SMALL LETTER K + 'l' # 0x6C -> LATIN SMALL LETTER L + 'm' # 0x6D -> LATIN SMALL LETTER M + 'n' # 0x6E -> LATIN SMALL LETTER N + 'o' # 0x6F -> LATIN SMALL LETTER O + 'p' # 0x70 -> LATIN SMALL LETTER P + 'q' # 0x71 -> LATIN SMALL LETTER Q + 'r' # 0x72 -> LATIN SMALL LETTER R + 's' # 0x73 -> LATIN SMALL LETTER S + 't' # 0x74 -> LATIN SMALL LETTER T + 'u' # 0x75 -> LATIN SMALL LETTER U + 'v' # 0x76 -> LATIN SMALL LETTER V + 'w' # 0x77 -> LATIN SMALL LETTER W + 'x' # 0x78 -> LATIN SMALL LETTER X + 'y' # 0x79 -> LATIN SMALL LETTER Y + 'z' # 0x7A -> LATIN SMALL LETTER Z + '{' # 0x7B -> LEFT CURLY BRACKET + '|' # 0x7C -> VERTICAL LINE + '}' # 0x7D -> RIGHT CURLY BRACKET + '~' # 0x7E -> TILDE + '\x7f' # 0x7F -> DELETE (DEL) + '\u0496' # 0x80 -> CYRILLIC CAPITAL LETTER ZHE WITH DESCENDER + '\u0492' # 0x81 -> CYRILLIC CAPITAL LETTER GHE WITH STROKE + '\u04ee' # 0x82 -> CYRILLIC CAPITAL LETTER U WITH MACRON + '\u0493' # 0x83 -> CYRILLIC SMALL LETTER GHE WITH STROKE + '\u201e' # 0x84 -> DOUBLE LOW-9 QUOTATION MARK + '\u2026' # 0x85 -> HORIZONTAL ELLIPSIS + '\u04b6' # 0x86 -> CYRILLIC CAPITAL LETTER CHE WITH DESCENDER + '\u04ae' # 0x87 -> CYRILLIC CAPITAL LETTER STRAIGHT U + '\u04b2' # 0x88 -> CYRILLIC CAPITAL LETTER HA WITH DESCENDER + '\u04af' # 0x89 -> CYRILLIC SMALL LETTER STRAIGHT U + '\u04a0' # 0x8A -> CYRILLIC CAPITAL LETTER BASHKIR KA + '\u04e2' # 0x8B -> CYRILLIC CAPITAL LETTER I WITH MACRON + '\u04a2' # 0x8C -> CYRILLIC CAPITAL LETTER EN WITH DESCENDER + '\u049a' # 0x8D -> CYRILLIC CAPITAL LETTER KA WITH DESCENDER + '\u04ba' # 0x8E -> CYRILLIC CAPITAL LETTER SHHA + '\u04b8' # 0x8F -> CYRILLIC CAPITAL LETTER CHE WITH VERTICAL STROKE + '\u0497' # 0x90 -> CYRILLIC SMALL LETTER ZHE WITH DESCENDER + '\u2018' # 0x91 -> LEFT SINGLE QUOTATION MARK + '\u2019' # 0x92 -> RIGHT SINGLE QUOTATION MARK + '\u201c' # 0x93 -> LEFT DOUBLE QUOTATION MARK + '\u201d' # 0x94 -> RIGHT DOUBLE QUOTATION MARK + '\u2022' # 0x95 -> BULLET + '\u2013' # 0x96 -> EN DASH + '\u2014' # 0x97 -> EM DASH + '\u04b3' # 0x98 -> CYRILLIC SMALL LETTER HA WITH DESCENDER + '\u04b7' # 0x99 -> CYRILLIC SMALL LETTER CHE WITH DESCENDER + '\u04a1' # 0x9A -> CYRILLIC SMALL LETTER BASHKIR KA + '\u04e3' # 0x9B -> CYRILLIC SMALL LETTER I WITH MACRON + '\u04a3' # 0x9C -> CYRILLIC SMALL LETTER EN WITH DESCENDER + '\u049b' # 0x9D -> CYRILLIC SMALL LETTER KA WITH DESCENDER + '\u04bb' # 0x9E -> CYRILLIC SMALL LETTER SHHA + '\u04b9' # 0x9F -> CYRILLIC SMALL LETTER CHE WITH VERTICAL STROKE + '\xa0' # 0xA0 -> NO-BREAK SPACE + '\u040e' # 0xA1 -> CYRILLIC CAPITAL LETTER SHORT U (Byelorussian) + '\u045e' # 0xA2 -> CYRILLIC SMALL LETTER SHORT U (Byelorussian) + '\u0408' # 0xA3 -> CYRILLIC CAPITAL LETTER JE + '\u04e8' # 0xA4 -> CYRILLIC CAPITAL LETTER BARRED O + '\u0498' # 0xA5 -> CYRILLIC CAPITAL LETTER ZE WITH DESCENDER + '\u04b0' # 0xA6 -> CYRILLIC CAPITAL LETTER STRAIGHT U WITH STROKE + '\xa7' # 0xA7 -> SECTION SIGN + '\u0401' # 0xA8 -> CYRILLIC CAPITAL LETTER IO + '\xa9' # 0xA9 -> COPYRIGHT SIGN + '\u04d8' # 0xAA -> CYRILLIC CAPITAL LETTER SCHWA + '\xab' # 0xAB -> LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + '\xac' # 0xAC -> NOT SIGN + '\u04ef' # 0xAD -> CYRILLIC SMALL LETTER U WITH MACRON + '\xae' # 0xAE -> REGISTERED SIGN + '\u049c' # 0xAF -> CYRILLIC CAPITAL LETTER KA WITH VERTICAL STROKE + '\xb0' # 0xB0 -> DEGREE SIGN + '\u04b1' # 0xB1 -> CYRILLIC SMALL LETTER STRAIGHT U WITH STROKE + '\u0406' # 0xB2 -> CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I + '\u0456' # 0xB3 -> CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I + '\u0499' # 0xB4 -> CYRILLIC SMALL LETTER ZE WITH DESCENDER + '\u04e9' # 0xB5 -> CYRILLIC SMALL LETTER BARRED O + '\xb6' # 0xB6 -> PILCROW SIGN + '\xb7' # 0xB7 -> MIDDLE DOT + '\u0451' # 0xB8 -> CYRILLIC SMALL LETTER IO + '\u2116' # 0xB9 -> NUMERO SIGN + '\u04d9' # 0xBA -> CYRILLIC SMALL LETTER SCHWA + '\xbb' # 0xBB -> RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + '\u0458' # 0xBC -> CYRILLIC SMALL LETTER JE + '\u04aa' # 0xBD -> CYRILLIC CAPITAL LETTER ES WITH DESCENDER + '\u04ab' # 0xBE -> CYRILLIC SMALL LETTER ES WITH DESCENDER + '\u049d' # 0xBF -> CYRILLIC SMALL LETTER KA WITH VERTICAL STROKE + '\u0410' # 0xC0 -> CYRILLIC CAPITAL LETTER A + '\u0411' # 0xC1 -> CYRILLIC CAPITAL LETTER BE + '\u0412' # 0xC2 -> CYRILLIC CAPITAL LETTER VE + '\u0413' # 0xC3 -> CYRILLIC CAPITAL LETTER GHE + '\u0414' # 0xC4 -> CYRILLIC CAPITAL LETTER DE + '\u0415' # 0xC5 -> CYRILLIC CAPITAL LETTER IE + '\u0416' # 0xC6 -> CYRILLIC CAPITAL LETTER ZHE + '\u0417' # 0xC7 -> CYRILLIC CAPITAL LETTER ZE + '\u0418' # 0xC8 -> CYRILLIC CAPITAL LETTER I + '\u0419' # 0xC9 -> CYRILLIC CAPITAL LETTER SHORT I + '\u041a' # 0xCA -> CYRILLIC CAPITAL LETTER KA + '\u041b' # 0xCB -> CYRILLIC CAPITAL LETTER EL + '\u041c' # 0xCC -> CYRILLIC CAPITAL LETTER EM + '\u041d' # 0xCD -> CYRILLIC CAPITAL LETTER EN + '\u041e' # 0xCE -> CYRILLIC CAPITAL LETTER O + '\u041f' # 0xCF -> CYRILLIC CAPITAL LETTER PE + '\u0420' # 0xD0 -> CYRILLIC CAPITAL LETTER ER + '\u0421' # 0xD1 -> CYRILLIC CAPITAL LETTER ES + '\u0422' # 0xD2 -> CYRILLIC CAPITAL LETTER TE + '\u0423' # 0xD3 -> CYRILLIC CAPITAL LETTER U + '\u0424' # 0xD4 -> CYRILLIC CAPITAL LETTER EF + '\u0425' # 0xD5 -> CYRILLIC CAPITAL LETTER HA + '\u0426' # 0xD6 -> CYRILLIC CAPITAL LETTER TSE + '\u0427' # 0xD7 -> CYRILLIC CAPITAL LETTER CHE + '\u0428' # 0xD8 -> CYRILLIC CAPITAL LETTER SHA + '\u0429' # 0xD9 -> CYRILLIC CAPITAL LETTER SHCHA + '\u042a' # 0xDA -> CYRILLIC CAPITAL LETTER HARD SIGN + '\u042b' # 0xDB -> CYRILLIC CAPITAL LETTER YERU + '\u042c' # 0xDC -> CYRILLIC CAPITAL LETTER SOFT SIGN + '\u042d' # 0xDD -> CYRILLIC CAPITAL LETTER E + '\u042e' # 0xDE -> CYRILLIC CAPITAL LETTER YU + '\u042f' # 0xDF -> CYRILLIC CAPITAL LETTER YA + '\u0430' # 0xE0 -> CYRILLIC SMALL LETTER A + '\u0431' # 0xE1 -> CYRILLIC SMALL LETTER BE + '\u0432' # 0xE2 -> CYRILLIC SMALL LETTER VE + '\u0433' # 0xE3 -> CYRILLIC SMALL LETTER GHE + '\u0434' # 0xE4 -> CYRILLIC SMALL LETTER DE + '\u0435' # 0xE5 -> CYRILLIC SMALL LETTER IE + '\u0436' # 0xE6 -> CYRILLIC SMALL LETTER ZHE + '\u0437' # 0xE7 -> CYRILLIC SMALL LETTER ZE + '\u0438' # 0xE8 -> CYRILLIC SMALL LETTER I + '\u0439' # 0xE9 -> CYRILLIC SMALL LETTER SHORT I + '\u043a' # 0xEA -> CYRILLIC SMALL LETTER KA + '\u043b' # 0xEB -> CYRILLIC SMALL LETTER EL + '\u043c' # 0xEC -> CYRILLIC SMALL LETTER EM + '\u043d' # 0xED -> CYRILLIC SMALL LETTER EN + '\u043e' # 0xEE -> CYRILLIC SMALL LETTER O + '\u043f' # 0xEF -> CYRILLIC SMALL LETTER PE + '\u0440' # 0xF0 -> CYRILLIC SMALL LETTER ER + '\u0441' # 0xF1 -> CYRILLIC SMALL LETTER ES + '\u0442' # 0xF2 -> CYRILLIC SMALL LETTER TE + '\u0443' # 0xF3 -> CYRILLIC SMALL LETTER U + '\u0444' # 0xF4 -> CYRILLIC SMALL LETTER EF + '\u0445' # 0xF5 -> CYRILLIC SMALL LETTER HA + '\u0446' # 0xF6 -> CYRILLIC SMALL LETTER TSE + '\u0447' # 0xF7 -> CYRILLIC SMALL LETTER CHE + '\u0448' # 0xF8 -> CYRILLIC SMALL LETTER SHA + '\u0449' # 0xF9 -> CYRILLIC SMALL LETTER SHCHA + '\u044a' # 0xFA -> CYRILLIC SMALL LETTER HARD SIGN + '\u044b' # 0xFB -> CYRILLIC SMALL LETTER YERU + '\u044c' # 0xFC -> CYRILLIC SMALL LETTER SOFT SIGN + '\u044d' # 0xFD -> CYRILLIC SMALL LETTER E + '\u044e' # 0xFE -> CYRILLIC SMALL LETTER YU + '\u044f' # 0xFF -> CYRILLIC SMALL LETTER YA +) + +### Encoding table +encoding_table=codecs.charmap_build(decoding_table) diff --git a/env/Lib/encodings/punycode.py b/env/Lib/encodings/punycode.py new file mode 100644 index 0000000..66c5101 --- /dev/null +++ b/env/Lib/encodings/punycode.py @@ -0,0 +1,237 @@ +""" Codec for the Punicode encoding, as specified in RFC 3492 + +Written by Martin v. Löwis. +""" + +import codecs + +##################### Encoding ##################################### + +def segregate(str): + """3.1 Basic code point segregation""" + base = bytearray() + extended = set() + for c in str: + if ord(c) < 128: + base.append(ord(c)) + else: + extended.add(c) + extended = sorted(extended) + return bytes(base), 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 = b"abcdefghijklmnopqrstuvwxyz0123456789" +def generate_generalized_integer(N, bias): + """3.3 Generalized variable-length integers""" + result = bytearray() + j = 0 + while 1: + t = T(j, bias) + if N < t: + result.append(digits[N]) + return bytes(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 = bytearray() + 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 bytes(result) + +def punycode_encode(text): + base, extended = segregate(text) + deltas = insertion_unsort(text, extended) + extended = generate_integers(len(base), deltas) + if base: + return base + b"-" + 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] + chr(char) + base[pos:] + bias = adapt(delta, (extpos == 0), len(base)) + extpos = newpos + return base + +def punycode_decode(text, errors): + if isinstance(text, str): + text = text.encode("ascii") + if isinstance(text, memoryview): + text = bytes(text) + pos = text.rfind(b"-") + if pos == -1: + base = "" + extended = str(text, "ascii").upper() + else: + base = str(text[:pos], "ascii", errors) + extended = str(text[pos+1:], "ascii").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/env/Lib/encodings/quopri_codec.py b/env/Lib/encodings/quopri_codec.py new file mode 100644 index 0000000..496cb76 --- /dev/null +++ b/env/Lib/encodings/quopri_codec.py @@ -0,0 +1,56 @@ +"""Codec for quoted-printable encoding. + +This codec de/encodes from bytes to bytes. +""" + +import codecs +import quopri +from io import BytesIO + +def quopri_encode(input, errors='strict'): + assert errors == 'strict' + f = BytesIO(input) + g = BytesIO() + quopri.encode(f, g, quotetabs=True) + return (g.getvalue(), len(input)) + +def quopri_decode(input, errors='strict'): + assert errors == 'strict' + f = BytesIO(input) + g = BytesIO() + quopri.decode(f, g) + return (g.getvalue(), 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): + charbuffertype = bytes + +class StreamReader(Codec, codecs.StreamReader): + charbuffertype = bytes + +# encodings module API + +def getregentry(): + return codecs.CodecInfo( + name='quopri', + encode=quopri_encode, + decode=quopri_decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamwriter=StreamWriter, + streamreader=StreamReader, + _is_text_encoding=False, + ) diff --git a/env/Lib/encodings/raw_unicode_escape.py b/env/Lib/encodings/raw_unicode_escape.py new file mode 100644 index 0000000..2b919b4 --- /dev/null +++ b/env/Lib/encodings/raw_unicode_escape.py @@ -0,0 +1,45 @@ +""" Python 'raw-unicode-escape' 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.raw_unicode_escape_encode + decode = codecs.raw_unicode_escape_decode + +class IncrementalEncoder(codecs.IncrementalEncoder): + def encode(self, input, final=False): + return codecs.raw_unicode_escape_encode(input, self.errors)[0] + +class IncrementalDecoder(codecs.IncrementalDecoder): + def decode(self, input, final=False): + return codecs.raw_unicode_escape_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='raw-unicode-escape', + encode=Codec.encode, + decode=Codec.decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamwriter=StreamWriter, + streamreader=StreamReader, + ) diff --git a/env/Lib/encodings/rot_13.py b/env/Lib/encodings/rot_13.py new file mode 100644 index 0000000..5627bfb --- /dev/null +++ b/env/Lib/encodings/rot_13.py @@ -0,0 +1,113 @@ +#!/usr/bin/env python +""" Python Character Mapping Codec for ROT13. + +This codec de/encodes from str to str. + +Written by Marc-Andre Lemburg (mal@lemburg.com). +""" + +import codecs + +### Codec APIs + +class Codec(codecs.Codec): + def encode(self, input, errors='strict'): + return (str.translate(input, rot13_map), len(input)) + + def decode(self, input, errors='strict'): + return (str.translate(input, rot13_map), len(input)) + +class IncrementalEncoder(codecs.IncrementalEncoder): + def encode(self, input, final=False): + return str.translate(input, rot13_map) + +class IncrementalDecoder(codecs.IncrementalDecoder): + def decode(self, input, final=False): + return str.translate(input, rot13_map) + +class StreamWriter(Codec,codecs.StreamWriter): + pass + +class StreamReader(Codec,codecs.StreamReader): + pass + +### encodings module API + +def getregentry(): + return codecs.CodecInfo( + name='rot-13', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamwriter=StreamWriter, + streamreader=StreamReader, + _is_text_encoding=False, + ) + +### Map + +rot13_map = codecs.make_identity_dict(range(256)) +rot13_map.update({ + 0x0041: 0x004e, + 0x0042: 0x004f, + 0x0043: 0x0050, + 0x0044: 0x0051, + 0x0045: 0x0052, + 0x0046: 0x0053, + 0x0047: 0x0054, + 0x0048: 0x0055, + 0x0049: 0x0056, + 0x004a: 0x0057, + 0x004b: 0x0058, + 0x004c: 0x0059, + 0x004d: 0x005a, + 0x004e: 0x0041, + 0x004f: 0x0042, + 0x0050: 0x0043, + 0x0051: 0x0044, + 0x0052: 0x0045, + 0x0053: 0x0046, + 0x0054: 0x0047, + 0x0055: 0x0048, + 0x0056: 0x0049, + 0x0057: 0x004a, + 0x0058: 0x004b, + 0x0059: 0x004c, + 0x005a: 0x004d, + 0x0061: 0x006e, + 0x0062: 0x006f, + 0x0063: 0x0070, + 0x0064: 0x0071, + 0x0065: 0x0072, + 0x0066: 0x0073, + 0x0067: 0x0074, + 0x0068: 0x0075, + 0x0069: 0x0076, + 0x006a: 0x0077, + 0x006b: 0x0078, + 0x006c: 0x0079, + 0x006d: 0x007a, + 0x006e: 0x0061, + 0x006f: 0x0062, + 0x0070: 0x0063, + 0x0071: 0x0064, + 0x0072: 0x0065, + 0x0073: 0x0066, + 0x0074: 0x0067, + 0x0075: 0x0068, + 0x0076: 0x0069, + 0x0077: 0x006a, + 0x0078: 0x006b, + 0x0079: 0x006c, + 0x007a: 0x006d, +}) + +### Filter API + +def rot13(infile, outfile): + outfile.write(codecs.encode(infile.read(), 'rot-13')) + +if __name__ == '__main__': + import sys + rot13(sys.stdin, sys.stdout) diff --git a/env/Lib/encodings/shift_jis.py b/env/Lib/encodings/shift_jis.py new file mode 100644 index 0000000..8338117 --- /dev/null +++ b/env/Lib/encodings/shift_jis.py @@ -0,0 +1,39 @@ +# +# 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/env/Lib/encodings/shift_jis_2004.py b/env/Lib/encodings/shift_jis_2004.py new file mode 100644 index 0000000..161b1e8 --- /dev/null +++ b/env/Lib/encodings/shift_jis_2004.py @@ -0,0 +1,39 @@ +# +# 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/env/Lib/encodings/shift_jisx0213.py b/env/Lib/encodings/shift_jisx0213.py new file mode 100644 index 0000000..cb653f5 --- /dev/null +++ b/env/Lib/encodings/shift_jisx0213.py @@ -0,0 +1,39 @@ +# +# 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/env/Lib/encodings/tis_620.py b/env/Lib/encodings/tis_620.py new file mode 100644 index 0000000..e288386 --- /dev/null +++ b/env/Lib/encodings/tis_620.py @@ -0,0 +1,307 @@ +""" 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 = ( + '\x00' # 0x00 -> NULL + '\x01' # 0x01 -> START OF HEADING + '\x02' # 0x02 -> START OF TEXT + '\x03' # 0x03 -> END OF TEXT + '\x04' # 0x04 -> END OF TRANSMISSION + '\x05' # 0x05 -> ENQUIRY + '\x06' # 0x06 -> ACKNOWLEDGE + '\x07' # 0x07 -> BELL + '\x08' # 0x08 -> BACKSPACE + '\t' # 0x09 -> HORIZONTAL TABULATION + '\n' # 0x0A -> LINE FEED + '\x0b' # 0x0B -> VERTICAL TABULATION + '\x0c' # 0x0C -> FORM FEED + '\r' # 0x0D -> CARRIAGE RETURN + '\x0e' # 0x0E -> SHIFT OUT + '\x0f' # 0x0F -> SHIFT IN + '\x10' # 0x10 -> DATA LINK ESCAPE + '\x11' # 0x11 -> DEVICE CONTROL ONE + '\x12' # 0x12 -> DEVICE CONTROL TWO + '\x13' # 0x13 -> DEVICE CONTROL THREE + '\x14' # 0x14 -> DEVICE CONTROL FOUR + '\x15' # 0x15 -> NEGATIVE ACKNOWLEDGE + '\x16' # 0x16 -> SYNCHRONOUS IDLE + '\x17' # 0x17 -> END OF TRANSMISSION BLOCK + '\x18' # 0x18 -> CANCEL + '\x19' # 0x19 -> END OF MEDIUM + '\x1a' # 0x1A -> SUBSTITUTE + '\x1b' # 0x1B -> ESCAPE + '\x1c' # 0x1C -> FILE SEPARATOR + '\x1d' # 0x1D -> GROUP SEPARATOR + '\x1e' # 0x1E -> RECORD SEPARATOR + '\x1f' # 0x1F -> UNIT SEPARATOR + ' ' # 0x20 -> SPACE + '!' # 0x21 -> EXCLAMATION MARK + '"' # 0x22 -> QUOTATION MARK + '#' # 0x23 -> NUMBER SIGN + '$' # 0x24 -> DOLLAR SIGN + '%' # 0x25 -> PERCENT SIGN + '&' # 0x26 -> AMPERSAND + "'" # 0x27 -> APOSTROPHE + '(' # 0x28 -> LEFT PARENTHESIS + ')' # 0x29 -> RIGHT PARENTHESIS + '*' # 0x2A -> ASTERISK + '+' # 0x2B -> PLUS SIGN + ',' # 0x2C -> COMMA + '-' # 0x2D -> HYPHEN-MINUS + '.' # 0x2E -> FULL STOP + '/' # 0x2F -> SOLIDUS + '0' # 0x30 -> DIGIT ZERO + '1' # 0x31 -> DIGIT ONE + '2' # 0x32 -> DIGIT TWO + '3' # 0x33 -> DIGIT THREE + '4' # 0x34 -> DIGIT FOUR + '5' # 0x35 -> DIGIT FIVE + '6' # 0x36 -> DIGIT SIX + '7' # 0x37 -> DIGIT SEVEN + '8' # 0x38 -> DIGIT EIGHT + '9' # 0x39 -> DIGIT NINE + ':' # 0x3A -> COLON + ';' # 0x3B -> SEMICOLON + '<' # 0x3C -> LESS-THAN SIGN + '=' # 0x3D -> EQUALS SIGN + '>' # 0x3E -> GREATER-THAN SIGN + '?' # 0x3F -> QUESTION MARK + '@' # 0x40 -> COMMERCIAL AT + 'A' # 0x41 -> LATIN CAPITAL LETTER A + 'B' # 0x42 -> LATIN CAPITAL LETTER B + 'C' # 0x43 -> LATIN CAPITAL LETTER C + 'D' # 0x44 -> LATIN CAPITAL LETTER D + 'E' # 0x45 -> LATIN CAPITAL LETTER E + 'F' # 0x46 -> LATIN CAPITAL LETTER F + 'G' # 0x47 -> LATIN CAPITAL LETTER G + 'H' # 0x48 -> LATIN CAPITAL LETTER H + 'I' # 0x49 -> LATIN CAPITAL LETTER I + 'J' # 0x4A -> LATIN CAPITAL LETTER J + 'K' # 0x4B -> LATIN CAPITAL LETTER K + 'L' # 0x4C -> LATIN CAPITAL LETTER L + 'M' # 0x4D -> LATIN CAPITAL LETTER M + 'N' # 0x4E -> LATIN CAPITAL LETTER N + 'O' # 0x4F -> LATIN CAPITAL LETTER O + 'P' # 0x50 -> LATIN CAPITAL LETTER P + 'Q' # 0x51 -> LATIN CAPITAL LETTER Q + 'R' # 0x52 -> LATIN CAPITAL LETTER R + 'S' # 0x53 -> LATIN CAPITAL LETTER S + 'T' # 0x54 -> LATIN CAPITAL LETTER T + 'U' # 0x55 -> LATIN CAPITAL LETTER U + 'V' # 0x56 -> LATIN CAPITAL LETTER V + 'W' # 0x57 -> LATIN CAPITAL LETTER W + 'X' # 0x58 -> LATIN CAPITAL LETTER X + 'Y' # 0x59 -> LATIN CAPITAL LETTER Y + 'Z' # 0x5A -> LATIN CAPITAL LETTER Z + '[' # 0x5B -> LEFT SQUARE BRACKET + '\\' # 0x5C -> REVERSE SOLIDUS + ']' # 0x5D -> RIGHT SQUARE BRACKET + '^' # 0x5E -> CIRCUMFLEX ACCENT + '_' # 0x5F -> LOW LINE + '`' # 0x60 -> GRAVE ACCENT + 'a' # 0x61 -> LATIN SMALL LETTER A + 'b' # 0x62 -> LATIN SMALL LETTER B + 'c' # 0x63 -> LATIN SMALL LETTER C + 'd' # 0x64 -> LATIN SMALL LETTER D + 'e' # 0x65 -> LATIN SMALL LETTER E + 'f' # 0x66 -> LATIN SMALL LETTER F + 'g' # 0x67 -> LATIN SMALL LETTER G + 'h' # 0x68 -> LATIN SMALL LETTER H + 'i' # 0x69 -> LATIN SMALL LETTER I + 'j' # 0x6A -> LATIN SMALL LETTER J + 'k' # 0x6B -> LATIN SMALL LETTER K + 'l' # 0x6C -> LATIN SMALL LETTER L + 'm' # 0x6D -> LATIN SMALL LETTER M + 'n' # 0x6E -> LATIN SMALL LETTER N + 'o' # 0x6F -> LATIN SMALL LETTER O + 'p' # 0x70 -> LATIN SMALL LETTER P + 'q' # 0x71 -> LATIN SMALL LETTER Q + 'r' # 0x72 -> LATIN SMALL LETTER R + 's' # 0x73 -> LATIN SMALL LETTER S + 't' # 0x74 -> LATIN SMALL LETTER T + 'u' # 0x75 -> LATIN SMALL LETTER U + 'v' # 0x76 -> LATIN SMALL LETTER V + 'w' # 0x77 -> LATIN SMALL LETTER W + 'x' # 0x78 -> LATIN SMALL LETTER X + 'y' # 0x79 -> LATIN SMALL LETTER Y + 'z' # 0x7A -> LATIN SMALL LETTER Z + '{' # 0x7B -> LEFT CURLY BRACKET + '|' # 0x7C -> VERTICAL LINE + '}' # 0x7D -> RIGHT CURLY BRACKET + '~' # 0x7E -> TILDE + '\x7f' # 0x7F -> DELETE + '\x80' # 0x80 -> + '\x81' # 0x81 -> + '\x82' # 0x82 -> + '\x83' # 0x83 -> + '\x84' # 0x84 -> + '\x85' # 0x85 -> + '\x86' # 0x86 -> + '\x87' # 0x87 -> + '\x88' # 0x88 -> + '\x89' # 0x89 -> + '\x8a' # 0x8A -> + '\x8b' # 0x8B -> + '\x8c' # 0x8C -> + '\x8d' # 0x8D -> + '\x8e' # 0x8E -> + '\x8f' # 0x8F -> + '\x90' # 0x90 -> + '\x91' # 0x91 -> + '\x92' # 0x92 -> + '\x93' # 0x93 -> + '\x94' # 0x94 -> + '\x95' # 0x95 -> + '\x96' # 0x96 -> + '\x97' # 0x97 -> + '\x98' # 0x98 -> + '\x99' # 0x99 -> + '\x9a' # 0x9A -> + '\x9b' # 0x9B -> + '\x9c' # 0x9C -> + '\x9d' # 0x9D -> + '\x9e' # 0x9E -> + '\x9f' # 0x9F -> + '\ufffe' + '\u0e01' # 0xA1 -> THAI CHARACTER KO KAI + '\u0e02' # 0xA2 -> THAI CHARACTER KHO KHAI + '\u0e03' # 0xA3 -> THAI CHARACTER KHO KHUAT + '\u0e04' # 0xA4 -> THAI CHARACTER KHO KHWAI + '\u0e05' # 0xA5 -> THAI CHARACTER KHO KHON + '\u0e06' # 0xA6 -> THAI CHARACTER KHO RAKHANG + '\u0e07' # 0xA7 -> THAI CHARACTER NGO NGU + '\u0e08' # 0xA8 -> THAI CHARACTER CHO CHAN + '\u0e09' # 0xA9 -> THAI CHARACTER CHO CHING + '\u0e0a' # 0xAA -> THAI CHARACTER CHO CHANG + '\u0e0b' # 0xAB -> THAI CHARACTER SO SO + '\u0e0c' # 0xAC -> THAI CHARACTER CHO CHOE + '\u0e0d' # 0xAD -> THAI CHARACTER YO YING + '\u0e0e' # 0xAE -> THAI CHARACTER DO CHADA + '\u0e0f' # 0xAF -> THAI CHARACTER TO PATAK + '\u0e10' # 0xB0 -> THAI CHARACTER THO THAN + '\u0e11' # 0xB1 -> THAI CHARACTER THO NANGMONTHO + '\u0e12' # 0xB2 -> THAI CHARACTER THO PHUTHAO + '\u0e13' # 0xB3 -> THAI CHARACTER NO NEN + '\u0e14' # 0xB4 -> THAI CHARACTER DO DEK + '\u0e15' # 0xB5 -> THAI CHARACTER TO TAO + '\u0e16' # 0xB6 -> THAI CHARACTER THO THUNG + '\u0e17' # 0xB7 -> THAI CHARACTER THO THAHAN + '\u0e18' # 0xB8 -> THAI CHARACTER THO THONG + '\u0e19' # 0xB9 -> THAI CHARACTER NO NU + '\u0e1a' # 0xBA -> THAI CHARACTER BO BAIMAI + '\u0e1b' # 0xBB -> THAI CHARACTER PO PLA + '\u0e1c' # 0xBC -> THAI CHARACTER PHO PHUNG + '\u0e1d' # 0xBD -> THAI CHARACTER FO FA + '\u0e1e' # 0xBE -> THAI CHARACTER PHO PHAN + '\u0e1f' # 0xBF -> THAI CHARACTER FO FAN + '\u0e20' # 0xC0 -> THAI CHARACTER PHO SAMPHAO + '\u0e21' # 0xC1 -> THAI CHARACTER MO MA + '\u0e22' # 0xC2 -> THAI CHARACTER YO YAK + '\u0e23' # 0xC3 -> THAI CHARACTER RO RUA + '\u0e24' # 0xC4 -> THAI CHARACTER RU + '\u0e25' # 0xC5 -> THAI CHARACTER LO LING + '\u0e26' # 0xC6 -> THAI CHARACTER LU + '\u0e27' # 0xC7 -> THAI CHARACTER WO WAEN + '\u0e28' # 0xC8 -> THAI CHARACTER SO SALA + '\u0e29' # 0xC9 -> THAI CHARACTER SO RUSI + '\u0e2a' # 0xCA -> THAI CHARACTER SO SUA + '\u0e2b' # 0xCB -> THAI CHARACTER HO HIP + '\u0e2c' # 0xCC -> THAI CHARACTER LO CHULA + '\u0e2d' # 0xCD -> THAI CHARACTER O ANG + '\u0e2e' # 0xCE -> THAI CHARACTER HO NOKHUK + '\u0e2f' # 0xCF -> THAI CHARACTER PAIYANNOI + '\u0e30' # 0xD0 -> THAI CHARACTER SARA A + '\u0e31' # 0xD1 -> THAI CHARACTER MAI HAN-AKAT + '\u0e32' # 0xD2 -> THAI CHARACTER SARA AA + '\u0e33' # 0xD3 -> THAI CHARACTER SARA AM + '\u0e34' # 0xD4 -> THAI CHARACTER SARA I + '\u0e35' # 0xD5 -> THAI CHARACTER SARA II + '\u0e36' # 0xD6 -> THAI CHARACTER SARA UE + '\u0e37' # 0xD7 -> THAI CHARACTER SARA UEE + '\u0e38' # 0xD8 -> THAI CHARACTER SARA U + '\u0e39' # 0xD9 -> THAI CHARACTER SARA UU + '\u0e3a' # 0xDA -> THAI CHARACTER PHINTHU + '\ufffe' + '\ufffe' + '\ufffe' + '\ufffe' + '\u0e3f' # 0xDF -> THAI CURRENCY SYMBOL BAHT + '\u0e40' # 0xE0 -> THAI CHARACTER SARA E + '\u0e41' # 0xE1 -> THAI CHARACTER SARA AE + '\u0e42' # 0xE2 -> THAI CHARACTER SARA O + '\u0e43' # 0xE3 -> THAI CHARACTER SARA AI MAIMUAN + '\u0e44' # 0xE4 -> THAI CHARACTER SARA AI MAIMALAI + '\u0e45' # 0xE5 -> THAI CHARACTER LAKKHANGYAO + '\u0e46' # 0xE6 -> THAI CHARACTER MAIYAMOK + '\u0e47' # 0xE7 -> THAI CHARACTER MAITAIKHU + '\u0e48' # 0xE8 -> THAI CHARACTER MAI EK + '\u0e49' # 0xE9 -> THAI CHARACTER MAI THO + '\u0e4a' # 0xEA -> THAI CHARACTER MAI TRI + '\u0e4b' # 0xEB -> THAI CHARACTER MAI CHATTAWA + '\u0e4c' # 0xEC -> THAI CHARACTER THANTHAKHAT + '\u0e4d' # 0xED -> THAI CHARACTER NIKHAHIT + '\u0e4e' # 0xEE -> THAI CHARACTER YAMAKKAN + '\u0e4f' # 0xEF -> THAI CHARACTER FONGMAN + '\u0e50' # 0xF0 -> THAI DIGIT ZERO + '\u0e51' # 0xF1 -> THAI DIGIT ONE + '\u0e52' # 0xF2 -> THAI DIGIT TWO + '\u0e53' # 0xF3 -> THAI DIGIT THREE + '\u0e54' # 0xF4 -> THAI DIGIT FOUR + '\u0e55' # 0xF5 -> THAI DIGIT FIVE + '\u0e56' # 0xF6 -> THAI DIGIT SIX + '\u0e57' # 0xF7 -> THAI DIGIT SEVEN + '\u0e58' # 0xF8 -> THAI DIGIT EIGHT + '\u0e59' # 0xF9 -> THAI DIGIT NINE + '\u0e5a' # 0xFA -> THAI CHARACTER ANGKHANKHU + '\u0e5b' # 0xFB -> THAI CHARACTER KHOMUT + '\ufffe' + '\ufffe' + '\ufffe' + '\ufffe' +) + +### Encoding table +encoding_table=codecs.charmap_build(decoding_table) diff --git a/env/Lib/encodings/undefined.py b/env/Lib/encodings/undefined.py new file mode 100644 index 0000000..4690288 --- /dev/null +++ b/env/Lib/encodings/undefined.py @@ -0,0 +1,49 @@ +""" Python 'undefined' Codec + + This codec will always raise a ValueError exception when being + used. It is intended for use by the site.py file to switch off + automatic string to Unicode coercion. + +Written by Marc-Andre Lemburg (mal@lemburg.com). + +(c) Copyright CNRI, All Rights Reserved. NO WARRANTY. + +""" +import codecs + +### Codec APIs + +class Codec(codecs.Codec): + + def encode(self,input,errors='strict'): + raise UnicodeError("undefined encoding") + + def decode(self,input,errors='strict'): + raise UnicodeError("undefined encoding") + +class IncrementalEncoder(codecs.IncrementalEncoder): + def encode(self, input, final=False): + raise UnicodeError("undefined encoding") + +class IncrementalDecoder(codecs.IncrementalDecoder): + def decode(self, input, final=False): + raise UnicodeError("undefined encoding") + +class StreamWriter(Codec,codecs.StreamWriter): + pass + +class StreamReader(Codec,codecs.StreamReader): + pass + +### encodings module API + +def getregentry(): + return codecs.CodecInfo( + name='undefined', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamwriter=StreamWriter, + streamreader=StreamReader, + ) diff --git a/env/Lib/encodings/unicode_escape.py b/env/Lib/encodings/unicode_escape.py new file mode 100644 index 0000000..817f932 --- /dev/null +++ b/env/Lib/encodings/unicode_escape.py @@ -0,0 +1,45 @@ +""" Python 'unicode-escape' 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_escape_encode + decode = codecs.unicode_escape_decode + +class IncrementalEncoder(codecs.IncrementalEncoder): + def encode(self, input, final=False): + return codecs.unicode_escape_encode(input, self.errors)[0] + +class IncrementalDecoder(codecs.IncrementalDecoder): + def decode(self, input, final=False): + return codecs.unicode_escape_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-escape', + encode=Codec.encode, + decode=Codec.decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamwriter=StreamWriter, + streamreader=StreamReader, + ) diff --git a/env/Lib/encodings/unicode_internal.py b/env/Lib/encodings/unicode_internal.py new file mode 100644 index 0000000..df3e775 --- /dev/null +++ b/env/Lib/encodings/unicode_internal.py @@ -0,0 +1,45 @@ +""" 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/env/Lib/encodings/utf_16.py b/env/Lib/encodings/utf_16.py new file mode 100644 index 0000000..c612482 --- /dev/null +++ b/env/Lib/encodings/utf_16.py @@ -0,0 +1,155 @@ +""" 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 + + def getstate(self): + # additional 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_16_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_16_be_decode + if sys.byteorder == "big" + else codecs.utf_16_le_decode) + elif state == 1: + self.decoder = (codecs.utf_16_le_decode + if sys.byteorder == "big" + else codecs.utf_16_be_decode) + else: + 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/env/Lib/encodings/utf_16_be.py b/env/Lib/encodings/utf_16_be.py new file mode 100644 index 0000000..86b458e --- /dev/null +++ b/env/Lib/encodings/utf_16_be.py @@ -0,0 +1,42 @@ +""" 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/env/Lib/encodings/utf_16_le.py b/env/Lib/encodings/utf_16_le.py new file mode 100644 index 0000000..ec45414 --- /dev/null +++ b/env/Lib/encodings/utf_16_le.py @@ -0,0 +1,42 @@ +""" 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/env/Lib/encodings/utf_32.py b/env/Lib/encodings/utf_32.py new file mode 100644 index 0000000..cdf84d1 --- /dev/null +++ b/env/Lib/encodings/utf_32.py @@ -0,0 +1,150 @@ +""" +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): + # additional 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/env/Lib/encodings/utf_32_be.py b/env/Lib/encodings/utf_32_be.py new file mode 100644 index 0000000..fe272b5 --- /dev/null +++ b/env/Lib/encodings/utf_32_be.py @@ -0,0 +1,37 @@ +""" +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/env/Lib/encodings/utf_32_le.py b/env/Lib/encodings/utf_32_le.py new file mode 100644 index 0000000..9e48210 --- /dev/null +++ b/env/Lib/encodings/utf_32_le.py @@ -0,0 +1,37 @@ +""" +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/env/Lib/encodings/utf_7.py b/env/Lib/encodings/utf_7.py new file mode 100644 index 0000000..8e0567f --- /dev/null +++ b/env/Lib/encodings/utf_7.py @@ -0,0 +1,38 @@ +""" 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/env/Lib/encodings/utf_8.py b/env/Lib/encodings/utf_8.py new file mode 100644 index 0000000..1bf6336 --- /dev/null +++ b/env/Lib/encodings/utf_8.py @@ -0,0 +1,42 @@ +""" 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/env/Lib/encodings/utf_8_sig.py b/env/Lib/encodings/utf_8_sig.py new file mode 100644 index 0000000..1bb4792 --- /dev/null +++ b/env/Lib/encodings/utf_8_sig.py @@ -0,0 +1,130 @@ +""" 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 = 1 + + 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 ("", 0) + else: + self.first = 0 + else: + self.first = 0 + 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 = 1 + + def getstate(self): + state = codecs.BufferedIncrementalDecoder.getstate(self) + # state[1] must be 0 here, as it isn't passed along to the caller + return (state[0], self.first) + + def setstate(self, state): + # state[1] will be ignored by BufferedIncrementalDecoder.setstate() + codecs.BufferedIncrementalDecoder.setstate(self, state) + self.first = state[1] + +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 ("", 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/env/Lib/encodings/uu_codec.py b/env/Lib/encodings/uu_codec.py new file mode 100644 index 0000000..2a5728f --- /dev/null +++ b/env/Lib/encodings/uu_codec.py @@ -0,0 +1,99 @@ +"""Python 'uu_codec' Codec - UU content transfer encoding. + +This codec de/encodes from bytes to bytes. + +Written by Marc-Andre Lemburg (mal@lemburg.com). Some details were +adapted from uu.py which was written by Lance Ellinghouse and +modified by Jack Jansen and Fredrik Lundh. +""" + +import codecs +import binascii +from io import BytesIO + +### Codec APIs + +def uu_encode(input, errors='strict', filename='', mode=0o666): + assert errors == 'strict' + infile = BytesIO(input) + outfile = BytesIO() + read = infile.read + write = outfile.write + + # Encode + write(('begin %o %s\n' % (mode & 0o777, filename)).encode('ascii')) + chunk = read(45) + while chunk: + write(binascii.b2a_uu(chunk)) + chunk = read(45) + write(b' \nend\n') + + return (outfile.getvalue(), len(input)) + +def uu_decode(input, errors='strict'): + assert errors == 'strict' + infile = BytesIO(input) + outfile = BytesIO() + readline = infile.readline + write = outfile.write + + # Find start of encoded data + while 1: + s = readline() + if not s: + raise ValueError('Missing "begin" line in input data') + if s[:5] == b'begin': + break + + # Decode + while True: + s = readline() + if not s or s == b'end\n': + break + try: + data = binascii.a2b_uu(s) + except binascii.Error as v: + # Workaround for broken uuencoders by /Fredrik Lundh + nbytes = (((s[0]-32) & 63) * 4 + 5) // 3 + data = binascii.a2b_uu(s[:nbytes]) + #sys.stderr.write("Warning: %s\n" % str(v)) + write(data) + if not s: + raise ValueError('Truncated input data') + + return (outfile.getvalue(), len(input)) + +class Codec(codecs.Codec): + def encode(self, input, errors='strict'): + return uu_encode(input, errors) + + def decode(self, input, errors='strict'): + return uu_decode(input, errors) + +class IncrementalEncoder(codecs.IncrementalEncoder): + def encode(self, input, final=False): + return uu_encode(input, self.errors)[0] + +class IncrementalDecoder(codecs.IncrementalDecoder): + def decode(self, input, final=False): + return uu_decode(input, self.errors)[0] + +class StreamWriter(Codec, codecs.StreamWriter): + charbuffertype = bytes + +class StreamReader(Codec, codecs.StreamReader): + charbuffertype = bytes + +### encodings module API + +def getregentry(): + return codecs.CodecInfo( + name='uu', + encode=uu_encode, + decode=uu_decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + _is_text_encoding=False, + ) diff --git a/env/Lib/encodings/zlib_codec.py b/env/Lib/encodings/zlib_codec.py new file mode 100644 index 0000000..95908a4 --- /dev/null +++ b/env/Lib/encodings/zlib_codec.py @@ -0,0 +1,77 @@ +"""Python 'zlib_codec' Codec - zlib compression encoding. + +This codec de/encodes from bytes to bytes. + +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'): + assert errors == 'strict' + return (zlib.compress(input), len(input)) + +def zlib_decode(input, errors='strict'): + assert errors == 'strict' + return (zlib.decompress(input), 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): + charbuffertype = bytes + +class StreamReader(Codec, codecs.StreamReader): + charbuffertype = bytes + +### encodings module API + +def getregentry(): + return codecs.CodecInfo( + name='zlib', + encode=zlib_encode, + decode=zlib_decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + _is_text_encoding=False, + ) diff --git a/env/Lib/enum.py b/env/Lib/enum.py new file mode 100644 index 0000000..5e97a9e --- /dev/null +++ b/env/Lib/enum.py @@ -0,0 +1,910 @@ +import sys +from types import MappingProxyType, DynamicClassAttribute + +# try _collections first to reduce startup cost +try: + from _collections import OrderedDict +except ImportError: + from collections import OrderedDict + + +__all__ = [ + 'EnumMeta', + 'Enum', 'IntEnum', 'Flag', 'IntFlag', + 'auto', 'unique', + ] + + +def _is_descriptor(obj): + """Returns True if obj is a descriptor, False otherwise.""" + return ( + hasattr(obj, '__get__') or + hasattr(obj, '__set__') or + hasattr(obj, '__delete__')) + + +def _is_dunder(name): + """Returns True if a __dunder__ name, False otherwise.""" + return (len(name) > 4 and + name[:2] == name[-2:] == '__' and + name[2] != '_' and + name[-3] != '_') + + +def _is_sunder(name): + """Returns True if a _sunder_ name, False otherwise.""" + return (len(name) > 2 and + name[0] == name[-1] == '_' and + name[1:2] != '_' and + name[-2:-1] != '_') + + +def _make_class_unpicklable(cls): + """Make the given class un-picklable.""" + def _break_on_call_reduce(self, proto): + raise TypeError('%r cannot be pickled' % self) + cls.__reduce_ex__ = _break_on_call_reduce + cls.__module__ = '' + +_auto_null = object() +class auto: + """ + Instances are replaced with an appropriate value in Enum class suites. + """ + value = _auto_null + + +class _EnumDict(dict): + """Track enum member order and ensure member names are not reused. + + EnumMeta will use the names found in self._member_names as the + enumeration member names. + + """ + def __init__(self): + super().__init__() + self._member_names = [] + self._last_values = [] + self._ignore = [] + + def __setitem__(self, key, value): + """Changes anything not dundered or not a descriptor. + + If an enum member name is used twice, an error is raised; duplicate + values are not checked for. + + Single underscore (sunder) names are reserved. + + """ + if _is_sunder(key): + if key not in ( + '_order_', '_create_pseudo_member_', + '_generate_next_value_', '_missing_', '_ignore_', + ): + raise ValueError('_names_ are reserved for future Enum use') + if key == '_generate_next_value_': + setattr(self, '_generate_next_value', value) + elif key == '_ignore_': + if isinstance(value, str): + value = value.replace(',',' ').split() + else: + value = list(value) + self._ignore = value + already = set(value) & set(self._member_names) + if already: + raise ValueError('_ignore_ cannot specify already set names: %r' % (already, )) + elif _is_dunder(key): + if key == '__order__': + key = '_order_' + elif key in self._member_names: + # descriptor overwriting an enum? + raise TypeError('Attempted to reuse key: %r' % key) + elif key in self._ignore: + pass + elif not _is_descriptor(value): + if key in self: + # enum overwriting a descriptor? + raise TypeError('%r already defined as: %r' % (key, self[key])) + if isinstance(value, auto): + if value.value == _auto_null: + value.value = self._generate_next_value(key, 1, len(self._member_names), self._last_values[:]) + value = value.value + self._member_names.append(key) + self._last_values.append(value) + super().__setitem__(key, value) + + +# Dummy value for Enum as EnumMeta explicitly checks for it, but of course +# until EnumMeta finishes running the first time the Enum class doesn't exist. +# This is also why there are checks in EnumMeta like `if Enum is not None` +Enum = None + + +class EnumMeta(type): + """Metaclass for Enum""" + @classmethod + def __prepare__(metacls, cls, bases): + # create the namespace dict + enum_dict = _EnumDict() + # inherit previous flags and _generate_next_value_ function + member_type, first_enum = metacls._get_mixins_(bases) + if first_enum is not None: + enum_dict['_generate_next_value_'] = getattr(first_enum, '_generate_next_value_', None) + return enum_dict + + def __new__(metacls, cls, bases, classdict): + # an Enum class is final once enumeration items have been defined; it + # cannot be mixed with other types (int, float, etc.) if it has an + # inherited __new__ unless a new __new__ is defined (or the resulting + # class will fail). + # + # remove any keys listed in _ignore_ + classdict.setdefault('_ignore_', []).append('_ignore_') + ignore = classdict['_ignore_'] + for key in ignore: + classdict.pop(key, None) + member_type, first_enum = metacls._get_mixins_(bases) + __new__, save_new, use_args = metacls._find_new_(classdict, member_type, + first_enum) + + # save enum items into separate mapping so they don't get baked into + # the new class + enum_members = {k: classdict[k] for k in classdict._member_names} + for name in classdict._member_names: + del classdict[name] + + # adjust the sunders + _order_ = classdict.pop('_order_', None) + + # check for illegal enum names (any others?) + invalid_names = set(enum_members) & {'mro', ''} + if invalid_names: + raise ValueError('Invalid enum member name: {0}'.format( + ','.join(invalid_names))) + + # create a default docstring if one has not been provided + if '__doc__' not in classdict: + classdict['__doc__'] = 'An enumeration.' + + # create our new Enum type + enum_class = super().__new__(metacls, cls, bases, classdict) + enum_class._member_names_ = [] # names in definition order + enum_class._member_map_ = OrderedDict() # name->value map + enum_class._member_type_ = member_type + + # save DynamicClassAttribute attributes from super classes so we know + # if we can take the shortcut of storing members in the class dict + dynamic_attributes = {k for c in enum_class.mro() + for k, v in c.__dict__.items() + if isinstance(v, DynamicClassAttribute)} + + # Reverse value->name map for hashable values. + enum_class._value2member_map_ = {} + + # If a custom type is mixed into the Enum, and it does not know how + # to pickle itself, pickle.dumps will succeed but pickle.loads will + # fail. Rather than have the error show up later and possibly far + # from the source, sabotage the pickle protocol for this class so + # that pickle.dumps also fails. + # + # However, if the new class implements its own __reduce_ex__, do not + # sabotage -- it's on them to make sure it works correctly. We use + # __reduce_ex__ instead of any of the others as it is preferred by + # pickle over __reduce__, and it handles all pickle protocols. + if '__reduce_ex__' not in classdict: + if member_type is not object: + methods = ('__getnewargs_ex__', '__getnewargs__', + '__reduce_ex__', '__reduce__') + if not any(m in member_type.__dict__ for m in methods): + _make_class_unpicklable(enum_class) + + # instantiate them, checking for duplicates as we go + # we instantiate first instead of checking for duplicates first in case + # a custom __new__ is doing something funky with the values -- such as + # auto-numbering ;) + for member_name in classdict._member_names: + value = enum_members[member_name] + if not isinstance(value, tuple): + args = (value, ) + else: + args = value + if member_type is tuple: # special case for tuple enums + args = (args, ) # wrap it one more time + if not use_args: + enum_member = __new__(enum_class) + if not hasattr(enum_member, '_value_'): + enum_member._value_ = value + else: + enum_member = __new__(enum_class, *args) + if not hasattr(enum_member, '_value_'): + if member_type is object: + enum_member._value_ = value + else: + enum_member._value_ = member_type(*args) + value = enum_member._value_ + enum_member._name_ = member_name + enum_member.__objclass__ = enum_class + enum_member.__init__(*args) + # If another member with the same value was already defined, the + # new member becomes an alias to the existing one. + for name, canonical_member in enum_class._member_map_.items(): + if canonical_member._value_ == enum_member._value_: + enum_member = canonical_member + break + else: + # Aliases don't appear in member names (only in __members__). + enum_class._member_names_.append(member_name) + # performance boost for any member that would not shadow + # a DynamicClassAttribute + if member_name not in dynamic_attributes: + setattr(enum_class, member_name, enum_member) + # now add to _member_map_ + enum_class._member_map_[member_name] = enum_member + try: + # This may fail if value is not hashable. We can't add the value + # to the map, and by-value lookups for this value will be + # linear. + enum_class._value2member_map_[value] = enum_member + except TypeError: + pass + + # double check that repr and friends are not the mixin's or various + # things break (such as pickle) + for name in ('__repr__', '__str__', '__format__', '__reduce_ex__'): + class_method = getattr(enum_class, name) + obj_method = getattr(member_type, name, None) + enum_method = getattr(first_enum, name, None) + if obj_method is not None and obj_method is class_method: + setattr(enum_class, name, enum_method) + + # replace any other __new__ with our own (as long as Enum is not None, + # anyway) -- again, this is to support pickle + if Enum is not None: + # if the user defined their own __new__, save it before it gets + # clobbered in case they subclass later + if save_new: + enum_class.__new_member__ = __new__ + enum_class.__new__ = Enum.__new__ + + # py3 support for definition order (helps keep py2/py3 code in sync) + if _order_ is not None: + if isinstance(_order_, str): + _order_ = _order_.replace(',', ' ').split() + if _order_ != enum_class._member_names_: + raise TypeError('member order does not match _order_') + + return enum_class + + def __bool__(self): + """ + classes/types should always be True. + """ + return True + + def __call__(cls, value, names=None, *, module=None, qualname=None, type=None, start=1): + """Either returns an existing member, or creates a new enum class. + + This method is used both when an enum class is given a value to match + to an enumeration member (i.e. Color(3)) and for the functional API + (i.e. Color = Enum('Color', names='RED GREEN BLUE')). + + When used for the functional API: + + `value` will be the name of the new class. + + `names` should be either a string of white-space/comma delimited names + (values will start at `start`), or an iterator/mapping of name, value pairs. + + `module` should be set to the module this class is being created in; + if it is not set, an attempt to find that module will be made, but if + it fails the class will not be picklable. + + `qualname` should be set to the actual location this class can be found + at in its module; by default it is set to the global scope. If this is + not correct, unpickling will fail in some circumstances. + + `type`, if set, will be mixed in as the first base class. + + """ + if names is None: # simple value lookup + return cls.__new__(cls, value) + # otherwise, functional API: we're creating a new Enum type + return cls._create_(value, names, module=module, qualname=qualname, type=type, start=start) + + def __contains__(cls, member): + if not isinstance(member, Enum): + import warnings + warnings.warn( + "using non-Enums in containment checks will raise " + "TypeError in Python 3.8", + DeprecationWarning, 2) + return isinstance(member, cls) and member._name_ in cls._member_map_ + + def __delattr__(cls, attr): + # nicer error message when someone tries to delete an attribute + # (see issue19025). + if attr in cls._member_map_: + raise AttributeError( + "%s: cannot delete Enum member." % cls.__name__) + super().__delattr__(attr) + + def __dir__(self): + return (['__class__', '__doc__', '__members__', '__module__'] + + self._member_names_) + + def __getattr__(cls, name): + """Return the enum member matching `name` + + We use __getattr__ instead of descriptors or inserting into the enum + class' __dict__ in order to support `name` and `value` being both + properties for enum members (which live in the class' __dict__) and + enum members themselves. + + """ + if _is_dunder(name): + raise AttributeError(name) + try: + return cls._member_map_[name] + except KeyError: + raise AttributeError(name) from None + + def __getitem__(cls, name): + return cls._member_map_[name] + + def __iter__(cls): + return (cls._member_map_[name] for name in cls._member_names_) + + def __len__(cls): + return len(cls._member_names_) + + @property + def __members__(cls): + """Returns a mapping of member name->value. + + This mapping lists all enum members, including aliases. Note that this + is a read-only view of the internal mapping. + + """ + return MappingProxyType(cls._member_map_) + + def __repr__(cls): + return "" % cls.__name__ + + def __reversed__(cls): + return (cls._member_map_[name] for name in reversed(cls._member_names_)) + + def __setattr__(cls, name, value): + """Block attempts to reassign Enum members. + + A simple assignment to the class namespace only changes one of the + several possible ways to get an Enum member from the Enum class, + resulting in an inconsistent Enumeration. + + """ + member_map = cls.__dict__.get('_member_map_', {}) + if name in member_map: + raise AttributeError('Cannot reassign members.') + super().__setattr__(name, value) + + def _create_(cls, class_name, names, *, module=None, qualname=None, type=None, start=1): + """Convenience method to create a new Enum class. + + `names` can be: + + * A string containing member names, separated either with spaces or + commas. Values are incremented by 1 from `start`. + * An iterable of member names. Values are incremented by 1 from `start`. + * An iterable of (member name, value) pairs. + * A mapping of member name -> value pairs. + + """ + metacls = cls.__class__ + bases = (cls, ) if type is None else (type, cls) + _, first_enum = cls._get_mixins_(bases) + classdict = metacls.__prepare__(class_name, bases) + + # special processing needed for names? + if isinstance(names, str): + names = names.replace(',', ' ').split() + if isinstance(names, (tuple, list)) and names and isinstance(names[0], str): + original_names, names = names, [] + last_values = [] + for count, name in enumerate(original_names): + value = first_enum._generate_next_value_(name, start, count, last_values[:]) + last_values.append(value) + names.append((name, value)) + + # Here, names is either an iterable of (name, value) or a mapping. + for item in names: + if isinstance(item, str): + member_name, member_value = item, names[item] + else: + member_name, member_value = item + classdict[member_name] = member_value + enum_class = metacls.__new__(metacls, class_name, bases, classdict) + + # TODO: replace the frame hack if a blessed way to know the calling + # module is ever developed + if module is None: + try: + module = sys._getframe(2).f_globals['__name__'] + except (AttributeError, ValueError, KeyError) as exc: + pass + if module is None: + _make_class_unpicklable(enum_class) + else: + enum_class.__module__ = module + if qualname is not None: + enum_class.__qualname__ = qualname + + return enum_class + + @staticmethod + def _get_mixins_(bases): + """Returns the type for creating enum members, and the first inherited + enum class. + + bases: the tuple of bases that was given to __new__ + + """ + if not bases: + return object, Enum + + def _find_data_type(bases): + for chain in bases: + for base in chain.__mro__: + if base is object: + continue + elif '__new__' in base.__dict__: + if issubclass(base, Enum): + continue + return base + + # ensure final parent class is an Enum derivative, find any concrete + # data type, and check that Enum has no members + first_enum = bases[-1] + if not issubclass(first_enum, Enum): + raise TypeError("new enumerations should be created as " + "`EnumName([mixin_type, ...] [data_type,] enum_type)`") + member_type = _find_data_type(bases) or object + if first_enum._member_names_: + raise TypeError("Cannot extend enumerations") + return member_type, first_enum + + @staticmethod + def _find_new_(classdict, member_type, first_enum): + """Returns the __new__ to be used for creating the enum members. + + classdict: the class dictionary given to __new__ + member_type: the data type whose __new__ will be used by default + first_enum: enumeration to check for an overriding __new__ + + """ + # now find the correct __new__, checking to see of one was defined + # by the user; also check earlier enum classes in case a __new__ was + # saved as __new_member__ + __new__ = classdict.get('__new__', None) + + # should __new__ be saved as __new_member__ later? + save_new = __new__ is not None + + if __new__ is None: + # check all possibles for __new_member__ before falling back to + # __new__ + for method in ('__new_member__', '__new__'): + for possible in (member_type, first_enum): + target = getattr(possible, method, None) + if target not in { + None, + None.__new__, + object.__new__, + Enum.__new__, + }: + __new__ = target + break + if __new__ is not None: + break + else: + __new__ = object.__new__ + + # if a non-object.__new__ is used then whatever value/tuple was + # assigned to the enum member name will be passed to __new__ and to the + # new enum member's __init__ + if __new__ is object.__new__: + use_args = False + else: + use_args = True + return __new__, save_new, use_args + + +class Enum(metaclass=EnumMeta): + """Generic enumeration. + + Derive from this class to define new enumerations. + + """ + def __new__(cls, value): + # all enum instances are actually created during class construction + # without calling this method; this method is called by the metaclass' + # __call__ (i.e. Color(3) ), and by pickle + if type(value) is cls: + # For lookups like Color(Color.RED) + return value + # by-value search for a matching enum member + # see if it's in the reverse mapping (for hashable values) + try: + return cls._value2member_map_[value] + except KeyError: + # Not found, no need to do long O(n) search + pass + except TypeError: + # not there, now do long search -- O(n) behavior + for member in cls._member_map_.values(): + if member._value_ == value: + return member + # still not found -- try _missing_ hook + try: + exc = None + result = cls._missing_(value) + except Exception as e: + exc = e + result = None + if isinstance(result, cls): + return result + else: + ve_exc = ValueError("%r is not a valid %s" % (value, cls.__name__)) + if result is None and exc is None: + raise ve_exc + elif exc is None: + exc = TypeError( + 'error in %s._missing_: returned %r instead of None or a valid member' + % (cls.__name__, result) + ) + exc.__context__ = ve_exc + raise exc + + def _generate_next_value_(name, start, count, last_values): + for last_value in reversed(last_values): + try: + return last_value + 1 + except TypeError: + pass + else: + return start + + @classmethod + def _missing_(cls, value): + raise ValueError("%r is not a valid %s" % (value, cls.__name__)) + + def __repr__(self): + return "<%s.%s: %r>" % ( + self.__class__.__name__, self._name_, self._value_) + + def __str__(self): + return "%s.%s" % (self.__class__.__name__, self._name_) + + def __dir__(self): + added_behavior = [ + m + for cls in self.__class__.mro() + for m in cls.__dict__ + if m[0] != '_' and m not in self._member_map_ + ] + return (['__class__', '__doc__', '__module__'] + added_behavior) + + def __format__(self, format_spec): + # mixed-in Enums should use the mixed-in type's __format__, otherwise + # we can get strange results with the Enum name showing up instead of + # the value + + # pure Enum branch + if self._member_type_ is object: + cls = str + val = str(self) + # mix-in branch + else: + cls = self._member_type_ + val = self._value_ + return cls.__format__(val, format_spec) + + def __hash__(self): + return hash(self._name_) + + def __reduce_ex__(self, proto): + return self.__class__, (self._value_, ) + + # DynamicClassAttribute is used to provide access to the `name` and + # `value` properties of enum members while keeping some measure of + # protection from modification, while still allowing for an enumeration + # to have members named `name` and `value`. This works because enumeration + # members are not set directly on the enum class -- __getattr__ is + # used to look them up. + + @DynamicClassAttribute + def name(self): + """The name of the Enum member.""" + return self._name_ + + @DynamicClassAttribute + def value(self): + """The value of the Enum member.""" + return self._value_ + + @classmethod + def _convert(cls, name, module, filter, source=None): + """ + Create a new Enum subclass that replaces a collection of global constants + """ + # convert all constants from source (or module) that pass filter() to + # a new Enum called name, and export the enum and its members back to + # module; + # also, replace the __reduce_ex__ method so unpickling works in + # previous Python versions + module_globals = vars(sys.modules[module]) + if source: + source = vars(source) + else: + source = module_globals + # We use an OrderedDict of sorted source keys so that the + # _value2member_map is populated in the same order every time + # for a consistent reverse mapping of number to name when there + # are multiple names for the same number rather than varying + # between runs due to hash randomization of the module dictionary. + members = [ + (name, source[name]) + for name in source.keys() + if filter(name)] + try: + # sort by value + members.sort(key=lambda t: (t[1], t[0])) + except TypeError: + # unless some values aren't comparable, in which case sort by name + members.sort(key=lambda t: t[0]) + cls = cls(name, members, module=module) + cls.__reduce_ex__ = _reduce_ex_by_name + module_globals.update(cls.__members__) + module_globals[name] = cls + return cls + + +class IntEnum(int, Enum): + """Enum where members are also (and must be) ints""" + + +def _reduce_ex_by_name(self, proto): + return self.name + +class Flag(Enum): + """Support for flags""" + + def _generate_next_value_(name, start, count, last_values): + """ + Generate the next value when not given. + + name: the name of the member + start: the initital start value or None + count: the number of existing members + last_value: the last value assigned or None + """ + if not count: + return start if start is not None else 1 + for last_value in reversed(last_values): + try: + high_bit = _high_bit(last_value) + break + except Exception: + raise TypeError('Invalid Flag value: %r' % last_value) from None + return 2 ** (high_bit+1) + + @classmethod + def _missing_(cls, value): + original_value = value + if value < 0: + value = ~value + possible_member = cls._create_pseudo_member_(value) + if original_value < 0: + possible_member = ~possible_member + return possible_member + + @classmethod + def _create_pseudo_member_(cls, value): + """ + Create a composite member iff value contains only members. + """ + pseudo_member = cls._value2member_map_.get(value, None) + if pseudo_member is None: + # verify all bits are accounted for + _, extra_flags = _decompose(cls, value) + if extra_flags: + raise ValueError("%r is not a valid %s" % (value, cls.__name__)) + # construct a singleton enum pseudo-member + pseudo_member = object.__new__(cls) + pseudo_member._name_ = None + pseudo_member._value_ = value + # use setdefault in case another thread already created a composite + # with this value + pseudo_member = cls._value2member_map_.setdefault(value, pseudo_member) + return pseudo_member + + def __contains__(self, other): + if not isinstance(other, self.__class__): + import warnings + warnings.warn( + "using non-Flags in containment checks will raise " + "TypeError in Python 3.8", + DeprecationWarning, 2) + return False + return other._value_ & self._value_ == other._value_ + + def __repr__(self): + cls = self.__class__ + if self._name_ is not None: + return '<%s.%s: %r>' % (cls.__name__, self._name_, self._value_) + members, uncovered = _decompose(cls, self._value_) + return '<%s.%s: %r>' % ( + cls.__name__, + '|'.join([str(m._name_ or m._value_) for m in members]), + self._value_, + ) + + def __str__(self): + cls = self.__class__ + if self._name_ is not None: + return '%s.%s' % (cls.__name__, self._name_) + members, uncovered = _decompose(cls, self._value_) + if len(members) == 1 and members[0]._name_ is None: + return '%s.%r' % (cls.__name__, members[0]._value_) + else: + return '%s.%s' % ( + cls.__name__, + '|'.join([str(m._name_ or m._value_) for m in members]), + ) + + def __bool__(self): + return bool(self._value_) + + def __or__(self, other): + if not isinstance(other, self.__class__): + return NotImplemented + return self.__class__(self._value_ | other._value_) + + def __and__(self, other): + if not isinstance(other, self.__class__): + return NotImplemented + return self.__class__(self._value_ & other._value_) + + def __xor__(self, other): + if not isinstance(other, self.__class__): + return NotImplemented + return self.__class__(self._value_ ^ other._value_) + + def __invert__(self): + members, uncovered = _decompose(self.__class__, self._value_) + inverted = self.__class__(0) + for m in self.__class__: + if m not in members and not (m._value_ & self._value_): + inverted = inverted | m + return self.__class__(inverted) + + +class IntFlag(int, Flag): + """Support for integer-based Flags""" + + @classmethod + def _missing_(cls, value): + if not isinstance(value, int): + raise ValueError("%r is not a valid %s" % (value, cls.__name__)) + new_member = cls._create_pseudo_member_(value) + return new_member + + @classmethod + def _create_pseudo_member_(cls, value): + pseudo_member = cls._value2member_map_.get(value, None) + if pseudo_member is None: + need_to_create = [value] + # get unaccounted for bits + _, extra_flags = _decompose(cls, value) + # timer = 10 + while extra_flags: + # timer -= 1 + bit = _high_bit(extra_flags) + flag_value = 2 ** bit + if (flag_value not in cls._value2member_map_ and + flag_value not in need_to_create + ): + need_to_create.append(flag_value) + if extra_flags == -flag_value: + extra_flags = 0 + else: + extra_flags ^= flag_value + for value in reversed(need_to_create): + # construct singleton pseudo-members + pseudo_member = int.__new__(cls, value) + pseudo_member._name_ = None + pseudo_member._value_ = value + # use setdefault in case another thread already created a composite + # with this value + pseudo_member = cls._value2member_map_.setdefault(value, pseudo_member) + return pseudo_member + + def __or__(self, other): + if not isinstance(other, (self.__class__, int)): + return NotImplemented + result = self.__class__(self._value_ | self.__class__(other)._value_) + return result + + def __and__(self, other): + if not isinstance(other, (self.__class__, int)): + return NotImplemented + return self.__class__(self._value_ & self.__class__(other)._value_) + + def __xor__(self, other): + if not isinstance(other, (self.__class__, int)): + return NotImplemented + return self.__class__(self._value_ ^ self.__class__(other)._value_) + + __ror__ = __or__ + __rand__ = __and__ + __rxor__ = __xor__ + + def __invert__(self): + result = self.__class__(~self._value_) + return result + + +def _high_bit(value): + """returns index of highest bit, or -1 if value is zero or negative""" + return value.bit_length() - 1 + +def unique(enumeration): + """Class decorator for enumerations ensuring unique member values.""" + duplicates = [] + for name, member in enumeration.__members__.items(): + if name != member.name: + duplicates.append((name, member.name)) + if duplicates: + alias_details = ', '.join( + ["%s -> %s" % (alias, name) for (alias, name) in duplicates]) + raise ValueError('duplicate values found in %r: %s' % + (enumeration, alias_details)) + return enumeration + +def _decompose(flag, value): + """Extract all members from the value.""" + # _decompose is only called if the value is not named + not_covered = value + negative = value < 0 + # issue29167: wrap accesses to _value2member_map_ in a list to avoid race + # conditions between iterating over it and having more pseudo- + # members added to it + if negative: + # only check for named flags + flags_to_check = [ + (m, v) + for v, m in list(flag._value2member_map_.items()) + if m.name is not None + ] + else: + # check for named flags and powers-of-two flags + flags_to_check = [ + (m, v) + for v, m in list(flag._value2member_map_.items()) + if m.name is not None or _power_of_two(v) + ] + members = [] + for member, member_value in flags_to_check: + if member_value and member_value & value == member_value: + members.append(member) + not_covered &= ~member_value + if not members and value in flag._value2member_map_: + members.append(flag._value2member_map_[value]) + members.sort(key=lambda m: m._value_, reverse=True) + if len(members) > 1 and members[0].value == value: + # we have the breakdown, don't need the value member itself + members.pop(0) + return members, not_covered + +def _power_of_two(value): + if value < 1: + return False + return value == 2 ** _high_bit(value) diff --git a/env/Lib/fnmatch.py b/env/Lib/fnmatch.py new file mode 100644 index 0000000..b98e641 --- /dev/null +++ b/env/Lib/fnmatch.py @@ -0,0 +1,128 @@ +"""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 os +import posixpath +import re +import functools + +__all__ = ["filter", "fnmatch", "fnmatchcase", "translate"] + +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). + """ + name = os.path.normcase(name) + pat = os.path.normcase(pat) + return fnmatchcase(name, pat) + +@functools.lru_cache(maxsize=256, typed=True) +def _compile_pattern(pat): + if isinstance(pat, bytes): + pat_str = str(pat, 'ISO-8859-1') + res_str = translate(pat_str) + res = bytes(res_str, 'ISO-8859-1') + else: + res = translate(pat) + return re.compile(res).match + +def filter(names, pat): + """Return the subset of the list NAMES that match PAT.""" + result = [] + pat = os.path.normcase(pat) + match = _compile_pattern(pat) + 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. + """ + match = _compile_pattern(pat) + return 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] + if '--' not in stuff: + stuff = stuff.replace('\\', r'\\') + else: + chunks = [] + k = i+2 if pat[i] == '!' else i+1 + while True: + k = pat.find('-', k, j) + if k < 0: + break + chunks.append(pat[i:k]) + i = k+1 + k = k+3 + chunks.append(pat[i:j]) + # Escape backslashes and hyphens for set difference (--). + # Hyphens that create ranges shouldn't be escaped. + stuff = '-'.join(s.replace('\\', r'\\').replace('-', r'\-') + for s in chunks) + # Escape set operations (&&, ~~ and ||). + stuff = re.sub(r'([&~|])', r'\\\1', stuff) + i = j+1 + if stuff[0] == '!': + stuff = '^' + stuff[1:] + elif stuff[0] in ('^', '['): + stuff = '\\' + stuff + res = '%s[%s]' % (res, stuff) + else: + res = res + re.escape(c) + return r'(?s:%s)\Z' % res diff --git a/env/Lib/functools.py b/env/Lib/functools.py new file mode 100644 index 0000000..1daa1d1 --- /dev/null +++ b/env/Lib/functools.py @@ -0,0 +1,849 @@ +"""functools.py - Tools for working with functions and callable objects +""" +# Python module wrapper for _functools C module +# to allow utilities written in Python to be added +# to the functools module. +# Written by Nick Coghlan , +# Raymond Hettinger , +# and Åukasz Langa . +# Copyright (C) 2006-2013 Python Software Foundation. +# See C source code for _functools credits/copyright + +__all__ = ['update_wrapper', 'wraps', 'WRAPPER_ASSIGNMENTS', 'WRAPPER_UPDATES', + 'total_ordering', 'cmp_to_key', 'lru_cache', 'reduce', 'partial', + 'partialmethod', 'singledispatch'] + +try: + from _functools import reduce +except ImportError: + pass +from abc import get_cache_token +from collections import namedtuple +# import types, weakref # Deferred to single_dispatch() +from reprlib import recursive_repr +from _thread import RLock + + +################################################################################ +### update_wrapper() and wraps() decorator +################################################################################ + +# update_wrapper() and wraps() are tools to help write +# wrapper functions that can handle naive introspection + +WRAPPER_ASSIGNMENTS = ('__module__', '__name__', '__qualname__', '__doc__', + '__annotations__') +WRAPPER_UPDATES = ('__dict__',) +def update_wrapper(wrapper, + wrapped, + assigned = WRAPPER_ASSIGNMENTS, + updated = WRAPPER_UPDATES): + """Update a wrapper function to look like the wrapped function + + wrapper is the function to be updated + wrapped is the original function + assigned is a tuple naming the attributes assigned directly + from the wrapped function to the wrapper function (defaults to + functools.WRAPPER_ASSIGNMENTS) + updated is a tuple naming the attributes of the wrapper that + are updated with the corresponding attribute from the wrapped + function (defaults to functools.WRAPPER_UPDATES) + """ + for attr in assigned: + try: + value = getattr(wrapped, attr) + except AttributeError: + pass + else: + setattr(wrapper, attr, value) + for attr in updated: + getattr(wrapper, attr).update(getattr(wrapped, attr, {})) + # Issue #17482: set __wrapped__ last so we don't inadvertently copy it + # from the wrapped function when updating __dict__ + wrapper.__wrapped__ = wrapped + # Return the wrapper so this can be used as a decorator via partial() + return wrapper + +def wraps(wrapped, + assigned = WRAPPER_ASSIGNMENTS, + updated = WRAPPER_UPDATES): + """Decorator factory to apply update_wrapper() to a wrapper function + + Returns a decorator that invokes update_wrapper() with the decorated + function as the wrapper argument and the arguments to wraps() as the + remaining arguments. Default arguments are as for update_wrapper(). + This is a convenience function to simplify applying partial() to + update_wrapper(). + """ + return partial(update_wrapper, wrapped=wrapped, + assigned=assigned, updated=updated) + + +################################################################################ +### total_ordering class decorator +################################################################################ + +# The total ordering functions all invoke the root magic method directly +# rather than using the corresponding operator. This avoids possible +# infinite recursion that could occur when the operator dispatch logic +# detects a NotImplemented result and then calls a reflected method. + +def _gt_from_lt(self, other, NotImplemented=NotImplemented): + 'Return a > b. Computed by @total_ordering from (not a < b) and (a != b).' + op_result = self.__lt__(other) + if op_result is NotImplemented: + return op_result + return not op_result and self != other + +def _le_from_lt(self, other, NotImplemented=NotImplemented): + 'Return a <= b. Computed by @total_ordering from (a < b) or (a == b).' + op_result = self.__lt__(other) + return op_result or self == other + +def _ge_from_lt(self, other, NotImplemented=NotImplemented): + 'Return a >= b. Computed by @total_ordering from (not a < b).' + op_result = self.__lt__(other) + if op_result is NotImplemented: + return op_result + return not op_result + +def _ge_from_le(self, other, NotImplemented=NotImplemented): + 'Return a >= b. Computed by @total_ordering from (not a <= b) or (a == b).' + op_result = self.__le__(other) + if op_result is NotImplemented: + return op_result + return not op_result or self == other + +def _lt_from_le(self, other, NotImplemented=NotImplemented): + 'Return a < b. Computed by @total_ordering from (a <= b) and (a != b).' + op_result = self.__le__(other) + if op_result is NotImplemented: + return op_result + return op_result and self != other + +def _gt_from_le(self, other, NotImplemented=NotImplemented): + 'Return a > b. Computed by @total_ordering from (not a <= b).' + op_result = self.__le__(other) + if op_result is NotImplemented: + return op_result + return not op_result + +def _lt_from_gt(self, other, NotImplemented=NotImplemented): + 'Return a < b. Computed by @total_ordering from (not a > b) and (a != b).' + op_result = self.__gt__(other) + if op_result is NotImplemented: + return op_result + return not op_result and self != other + +def _ge_from_gt(self, other, NotImplemented=NotImplemented): + 'Return a >= b. Computed by @total_ordering from (a > b) or (a == b).' + op_result = self.__gt__(other) + return op_result or self == other + +def _le_from_gt(self, other, NotImplemented=NotImplemented): + 'Return a <= b. Computed by @total_ordering from (not a > b).' + op_result = self.__gt__(other) + if op_result is NotImplemented: + return op_result + return not op_result + +def _le_from_ge(self, other, NotImplemented=NotImplemented): + 'Return a <= b. Computed by @total_ordering from (not a >= b) or (a == b).' + op_result = self.__ge__(other) + if op_result is NotImplemented: + return op_result + return not op_result or self == other + +def _gt_from_ge(self, other, NotImplemented=NotImplemented): + 'Return a > b. Computed by @total_ordering from (a >= b) and (a != b).' + op_result = self.__ge__(other) + if op_result is NotImplemented: + return op_result + return op_result and self != other + +def _lt_from_ge(self, other, NotImplemented=NotImplemented): + 'Return a < b. Computed by @total_ordering from (not a >= b).' + op_result = self.__ge__(other) + if op_result is NotImplemented: + return op_result + return not op_result + +_convert = { + '__lt__': [('__gt__', _gt_from_lt), + ('__le__', _le_from_lt), + ('__ge__', _ge_from_lt)], + '__le__': [('__ge__', _ge_from_le), + ('__lt__', _lt_from_le), + ('__gt__', _gt_from_le)], + '__gt__': [('__lt__', _lt_from_gt), + ('__ge__', _ge_from_gt), + ('__le__', _le_from_gt)], + '__ge__': [('__le__', _le_from_ge), + ('__gt__', _gt_from_ge), + ('__lt__', _lt_from_ge)] +} + +def total_ordering(cls): + """Class decorator that fills in missing ordering methods""" + # Find user-defined comparisons (not those inherited from object). + roots = {op for op in _convert if getattr(cls, op, None) is not getattr(object, op, None)} + if not roots: + raise ValueError('must define at least one ordering operation: < > <= >=') + root = max(roots) # prefer __lt__ to __le__ to __gt__ to __ge__ + for opname, opfunc in _convert[root]: + if opname not in roots: + opfunc.__name__ = opname + setattr(cls, opname, opfunc) + return cls + + +################################################################################ +### cmp_to_key() function converter +################################################################################ + +def cmp_to_key(mycmp): + """Convert a cmp= function into a key= function""" + class K(object): + __slots__ = ['obj'] + def __init__(self, obj): + self.obj = obj + def __lt__(self, other): + return mycmp(self.obj, other.obj) < 0 + def __gt__(self, other): + return mycmp(self.obj, other.obj) > 0 + def __eq__(self, other): + return mycmp(self.obj, other.obj) == 0 + def __le__(self, other): + return mycmp(self.obj, other.obj) <= 0 + def __ge__(self, other): + return mycmp(self.obj, other.obj) >= 0 + __hash__ = None + return K + +try: + from _functools import cmp_to_key +except ImportError: + pass + + +################################################################################ +### partial() argument application +################################################################################ + +# Purely functional, no descriptor behaviour +class partial: + """New function with partial application of the given arguments + and keywords. + """ + + __slots__ = "func", "args", "keywords", "__dict__", "__weakref__" + + def __new__(*args, **keywords): + if not args: + raise TypeError("descriptor '__new__' of partial needs an argument") + if len(args) < 2: + raise TypeError("type 'partial' takes at least one argument") + cls, func, *args = args + if not callable(func): + raise TypeError("the first argument must be callable") + args = tuple(args) + + if hasattr(func, "func"): + args = func.args + args + tmpkw = func.keywords.copy() + tmpkw.update(keywords) + keywords = tmpkw + del tmpkw + func = func.func + + self = super(partial, cls).__new__(cls) + + self.func = func + self.args = args + self.keywords = keywords + return self + + def __call__(*args, **keywords): + if not args: + raise TypeError("descriptor '__call__' of partial needs an argument") + self, *args = args + newkeywords = self.keywords.copy() + newkeywords.update(keywords) + return self.func(*self.args, *args, **newkeywords) + + @recursive_repr() + def __repr__(self): + qualname = type(self).__qualname__ + args = [repr(self.func)] + args.extend(repr(x) for x in self.args) + args.extend(f"{k}={v!r}" for (k, v) in self.keywords.items()) + if type(self).__module__ == "functools": + return f"functools.{qualname}({', '.join(args)})" + return f"{qualname}({', '.join(args)})" + + def __reduce__(self): + return type(self), (self.func,), (self.func, self.args, + self.keywords or None, self.__dict__ or None) + + def __setstate__(self, state): + if not isinstance(state, tuple): + raise TypeError("argument to __setstate__ must be a tuple") + if len(state) != 4: + raise TypeError(f"expected 4 items in state, got {len(state)}") + func, args, kwds, namespace = state + if (not callable(func) or not isinstance(args, tuple) or + (kwds is not None and not isinstance(kwds, dict)) or + (namespace is not None and not isinstance(namespace, dict))): + raise TypeError("invalid partial state") + + args = tuple(args) # just in case it's a subclass + if kwds is None: + kwds = {} + elif type(kwds) is not dict: # XXX does it need to be *exactly* dict? + kwds = dict(kwds) + if namespace is None: + namespace = {} + + self.__dict__ = namespace + self.func = func + self.args = args + self.keywords = kwds + +try: + from _functools import partial +except ImportError: + pass + +# Descriptor version +class partialmethod(object): + """Method descriptor with partial application of the given arguments + and keywords. + + Supports wrapping existing descriptors and handles non-descriptor + callables as instance methods. + """ + + def __init__(*args, **keywords): + if len(args) >= 2: + self, func, *args = args + elif not args: + raise TypeError("descriptor '__init__' of partialmethod " + "needs an argument") + elif 'func' in keywords: + func = keywords.pop('func') + self, *args = args + else: + raise TypeError("type 'partialmethod' takes at least one argument, " + "got %d" % (len(args)-1)) + args = tuple(args) + + if not callable(func) and not hasattr(func, "__get__"): + raise TypeError("{!r} is not callable or a descriptor" + .format(func)) + + # func could be a descriptor like classmethod which isn't callable, + # so we can't inherit from partial (it verifies func is callable) + if isinstance(func, partialmethod): + # flattening is mandatory in order to place cls/self before all + # other arguments + # it's also more efficient since only one function will be called + self.func = func.func + self.args = func.args + args + self.keywords = func.keywords.copy() + self.keywords.update(keywords) + else: + self.func = func + self.args = args + self.keywords = keywords + + def __repr__(self): + args = ", ".join(map(repr, self.args)) + keywords = ", ".join("{}={!r}".format(k, v) + for k, v in self.keywords.items()) + format_string = "{module}.{cls}({func}, {args}, {keywords})" + return format_string.format(module=self.__class__.__module__, + cls=self.__class__.__qualname__, + func=self.func, + args=args, + keywords=keywords) + + def _make_unbound_method(self): + def _method(*args, **keywords): + call_keywords = self.keywords.copy() + call_keywords.update(keywords) + cls_or_self, *rest = args + call_args = (cls_or_self,) + self.args + tuple(rest) + return self.func(*call_args, **call_keywords) + _method.__isabstractmethod__ = self.__isabstractmethod__ + _method._partialmethod = self + return _method + + def __get__(self, obj, cls): + get = getattr(self.func, "__get__", None) + result = None + if get is not None: + new_func = get(obj, cls) + if new_func is not self.func: + # Assume __get__ returning something new indicates the + # creation of an appropriate callable + result = partial(new_func, *self.args, **self.keywords) + try: + result.__self__ = new_func.__self__ + except AttributeError: + pass + if result is None: + # If the underlying descriptor didn't do anything, treat this + # like an instance method + result = self._make_unbound_method().__get__(obj, cls) + return result + + @property + def __isabstractmethod__(self): + return getattr(self.func, "__isabstractmethod__", False) + + +################################################################################ +### LRU Cache function decorator +################################################################################ + +_CacheInfo = namedtuple("CacheInfo", ["hits", "misses", "maxsize", "currsize"]) + +class _HashedSeq(list): + """ This class guarantees that hash() will be called no more than once + per element. This is important because the lru_cache() will hash + the key multiple times on a cache miss. + + """ + + __slots__ = 'hashvalue' + + def __init__(self, tup, hash=hash): + self[:] = tup + self.hashvalue = hash(tup) + + def __hash__(self): + return self.hashvalue + +def _make_key(args, kwds, typed, + kwd_mark = (object(),), + fasttypes = {int, str}, + tuple=tuple, type=type, len=len): + """Make a cache key from optionally typed positional and keyword arguments + + The key is constructed in a way that is flat as possible rather than + as a nested structure that would take more memory. + + If there is only a single argument and its data type is known to cache + its hash value, then that argument is returned without a wrapper. This + saves space and improves lookup speed. + + """ + # All of code below relies on kwds preserving the order input by the user. + # Formerly, we sorted() the kwds before looping. The new way is *much* + # faster; however, it means that f(x=1, y=2) will now be treated as a + # distinct call from f(y=2, x=1) which will be cached separately. + key = args + if kwds: + key += kwd_mark + for item in kwds.items(): + key += item + if typed: + key += tuple(type(v) for v in args) + if kwds: + key += tuple(type(v) for v in kwds.values()) + elif len(key) == 1 and type(key[0]) in fasttypes: + return key[0] + return _HashedSeq(key) + +def lru_cache(maxsize=128, typed=False): + """Least-recently-used cache decorator. + + If *maxsize* is set to None, the LRU features are disabled and the cache + can grow without bound. + + If *typed* is True, arguments of different types will be cached separately. + For example, f(3.0) and f(3) will be treated as distinct calls with + distinct results. + + Arguments to the cached function must be hashable. + + View the cache statistics named tuple (hits, misses, maxsize, currsize) + with f.cache_info(). Clear the cache and statistics with f.cache_clear(). + Access the underlying function with f.__wrapped__. + + See: http://en.wikipedia.org/wiki/Cache_algorithms#Least_Recently_Used + + """ + + # Users should only access the lru_cache through its public API: + # cache_info, cache_clear, and f.__wrapped__ + # The internals of the lru_cache are encapsulated for thread safety and + # to allow the implementation to change (including a possible C version). + + # Early detection of an erroneous call to @lru_cache without any arguments + # resulting in the inner function being passed to maxsize instead of an + # integer or None. Negative maxsize is treated as 0. + if isinstance(maxsize, int): + if maxsize < 0: + maxsize = 0 + elif maxsize is not None: + raise TypeError('Expected maxsize to be an integer or None') + + def decorating_function(user_function): + wrapper = _lru_cache_wrapper(user_function, maxsize, typed, _CacheInfo) + return update_wrapper(wrapper, user_function) + + return decorating_function + +def _lru_cache_wrapper(user_function, maxsize, typed, _CacheInfo): + # Constants shared by all lru cache instances: + sentinel = object() # unique object used to signal cache misses + make_key = _make_key # build a key from the function arguments + PREV, NEXT, KEY, RESULT = 0, 1, 2, 3 # names for the link fields + + cache = {} + hits = misses = 0 + full = False + cache_get = cache.get # bound method to lookup a key or return None + cache_len = cache.__len__ # get cache size without calling len() + lock = RLock() # because linkedlist updates aren't threadsafe + root = [] # root of the circular doubly linked list + root[:] = [root, root, None, None] # initialize by pointing to self + + if maxsize == 0: + + def wrapper(*args, **kwds): + # No caching -- just a statistics update + nonlocal misses + misses += 1 + result = user_function(*args, **kwds) + return result + + elif maxsize is None: + + def wrapper(*args, **kwds): + # Simple caching without ordering or size limit + nonlocal hits, misses + key = make_key(args, kwds, typed) + result = cache_get(key, sentinel) + if result is not sentinel: + hits += 1 + return result + misses += 1 + result = user_function(*args, **kwds) + cache[key] = result + return result + + else: + + def wrapper(*args, **kwds): + # Size limited caching that tracks accesses by recency + nonlocal root, hits, misses, full + key = make_key(args, kwds, typed) + with lock: + link = cache_get(key) + if link is not None: + # Move the link to the front of the circular queue + link_prev, link_next, _key, result = link + link_prev[NEXT] = link_next + link_next[PREV] = link_prev + last = root[PREV] + last[NEXT] = root[PREV] = link + link[PREV] = last + link[NEXT] = root + hits += 1 + return result + misses += 1 + result = user_function(*args, **kwds) + with lock: + if key in cache: + # Getting here means that this same key was added to the + # cache while the lock was released. Since the link + # update is already done, we need only return the + # computed result and update the count of misses. + pass + elif full: + # Use the old root to store the new key and result. + oldroot = root + oldroot[KEY] = key + oldroot[RESULT] = result + # Empty the oldest link and make it the new root. + # Keep a reference to the old key and old result to + # prevent their ref counts from going to zero during the + # update. That will prevent potentially arbitrary object + # clean-up code (i.e. __del__) from running while we're + # still adjusting the links. + root = oldroot[NEXT] + oldkey = root[KEY] + oldresult = root[RESULT] + root[KEY] = root[RESULT] = None + # Now update the cache dictionary. + del cache[oldkey] + # Save the potentially reentrant cache[key] assignment + # for last, after the root and links have been put in + # a consistent state. + cache[key] = oldroot + else: + # Put result in a new link at the front of the queue. + last = root[PREV] + link = [last, root, key, result] + last[NEXT] = root[PREV] = cache[key] = link + # Use the cache_len bound method instead of the len() function + # which could potentially be wrapped in an lru_cache itself. + full = (cache_len() >= maxsize) + return result + + def cache_info(): + """Report cache statistics""" + with lock: + return _CacheInfo(hits, misses, maxsize, cache_len()) + + def cache_clear(): + """Clear the cache and cache statistics""" + nonlocal hits, misses, full + with lock: + cache.clear() + root[:] = [root, root, None, None] + hits = misses = 0 + full = False + + wrapper.cache_info = cache_info + wrapper.cache_clear = cache_clear + return wrapper + +try: + from _functools import _lru_cache_wrapper +except ImportError: + pass + + +################################################################################ +### singledispatch() - single-dispatch generic function decorator +################################################################################ + +def _c3_merge(sequences): + """Merges MROs in *sequences* to a single MRO using the C3 algorithm. + + Adapted from http://www.python.org/download/releases/2.3/mro/. + + """ + result = [] + while True: + sequences = [s for s in sequences if s] # purge empty sequences + if not sequences: + return result + for s1 in sequences: # find merge candidates among seq heads + candidate = s1[0] + for s2 in sequences: + if candidate in s2[1:]: + candidate = None + break # reject the current head, it appears later + else: + break + if candidate is None: + raise RuntimeError("Inconsistent hierarchy") + result.append(candidate) + # remove the chosen candidate + for seq in sequences: + if seq[0] == candidate: + del seq[0] + +def _c3_mro(cls, abcs=None): + """Computes the method resolution order using extended C3 linearization. + + If no *abcs* are given, the algorithm works exactly like the built-in C3 + linearization used for method resolution. + + If given, *abcs* is a list of abstract base classes that should be inserted + into the resulting MRO. Unrelated ABCs are ignored and don't end up in the + result. The algorithm inserts ABCs where their functionality is introduced, + i.e. issubclass(cls, abc) returns True for the class itself but returns + False for all its direct base classes. Implicit ABCs for a given class + (either registered or inferred from the presence of a special method like + __len__) are inserted directly after the last ABC explicitly listed in the + MRO of said class. If two implicit ABCs end up next to each other in the + resulting MRO, their ordering depends on the order of types in *abcs*. + + """ + for i, base in enumerate(reversed(cls.__bases__)): + if hasattr(base, '__abstractmethods__'): + boundary = len(cls.__bases__) - i + break # Bases up to the last explicit ABC are considered first. + else: + boundary = 0 + abcs = list(abcs) if abcs else [] + explicit_bases = list(cls.__bases__[:boundary]) + abstract_bases = [] + other_bases = list(cls.__bases__[boundary:]) + for base in abcs: + if issubclass(cls, base) and not any( + issubclass(b, base) for b in cls.__bases__ + ): + # If *cls* is the class that introduces behaviour described by + # an ABC *base*, insert said ABC to its MRO. + abstract_bases.append(base) + for base in abstract_bases: + abcs.remove(base) + explicit_c3_mros = [_c3_mro(base, abcs=abcs) for base in explicit_bases] + abstract_c3_mros = [_c3_mro(base, abcs=abcs) for base in abstract_bases] + other_c3_mros = [_c3_mro(base, abcs=abcs) for base in other_bases] + return _c3_merge( + [[cls]] + + explicit_c3_mros + abstract_c3_mros + other_c3_mros + + [explicit_bases] + [abstract_bases] + [other_bases] + ) + +def _compose_mro(cls, types): + """Calculates the method resolution order for a given class *cls*. + + Includes relevant abstract base classes (with their respective bases) from + the *types* iterable. Uses a modified C3 linearization algorithm. + + """ + bases = set(cls.__mro__) + # Remove entries which are already present in the __mro__ or unrelated. + def is_related(typ): + return (typ not in bases and hasattr(typ, '__mro__') + and issubclass(cls, typ)) + types = [n for n in types if is_related(n)] + # Remove entries which are strict bases of other entries (they will end up + # in the MRO anyway. + def is_strict_base(typ): + for other in types: + if typ != other and typ in other.__mro__: + return True + return False + types = [n for n in types if not is_strict_base(n)] + # Subclasses of the ABCs in *types* which are also implemented by + # *cls* can be used to stabilize ABC ordering. + type_set = set(types) + mro = [] + for typ in types: + found = [] + for sub in typ.__subclasses__(): + if sub not in bases and issubclass(cls, sub): + found.append([s for s in sub.__mro__ if s in type_set]) + if not found: + mro.append(typ) + continue + # Favor subclasses with the biggest number of useful bases + found.sort(key=len, reverse=True) + for sub in found: + for subcls in sub: + if subcls not in mro: + mro.append(subcls) + return _c3_mro(cls, abcs=mro) + +def _find_impl(cls, registry): + """Returns the best matching implementation from *registry* for type *cls*. + + Where there is no registered implementation for a specific type, its method + resolution order is used to find a more generic implementation. + + Note: if *registry* does not contain an implementation for the base + *object* type, this function may return None. + + """ + mro = _compose_mro(cls, registry.keys()) + match = None + for t in mro: + if match is not None: + # If *match* is an implicit ABC but there is another unrelated, + # equally matching implicit ABC, refuse the temptation to guess. + if (t in registry and t not in cls.__mro__ + and match not in cls.__mro__ + and not issubclass(match, t)): + raise RuntimeError("Ambiguous dispatch: {} or {}".format( + match, t)) + break + if t in registry: + match = t + return registry.get(match) + +def singledispatch(func): + """Single-dispatch generic function decorator. + + Transforms a function into a generic function, which can have different + behaviours depending upon the type of its first argument. The decorated + function acts as the default implementation, and additional + implementations can be registered using the register() attribute of the + generic function. + """ + # There are many programs that use functools without singledispatch, so we + # trade-off making singledispatch marginally slower for the benefit of + # making start-up of such applications slightly faster. + import types, weakref + + registry = {} + dispatch_cache = weakref.WeakKeyDictionary() + cache_token = None + + def dispatch(cls): + """generic_func.dispatch(cls) -> + + Runs the dispatch algorithm to return the best available implementation + for the given *cls* registered on *generic_func*. + + """ + nonlocal cache_token + if cache_token is not None: + current_token = get_cache_token() + if cache_token != current_token: + dispatch_cache.clear() + cache_token = current_token + try: + impl = dispatch_cache[cls] + except KeyError: + try: + impl = registry[cls] + except KeyError: + impl = _find_impl(cls, registry) + dispatch_cache[cls] = impl + return impl + + def register(cls, func=None): + """generic_func.register(cls, func) -> func + + Registers a new implementation for the given *cls* on a *generic_func*. + + """ + nonlocal cache_token + if func is None: + if isinstance(cls, type): + return lambda f: register(cls, f) + ann = getattr(cls, '__annotations__', {}) + if not ann: + raise TypeError( + f"Invalid first argument to `register()`: {cls!r}. " + f"Use either `@register(some_class)` or plain `@register` " + f"on an annotated function." + ) + func = cls + + # only import typing if annotation parsing is necessary + from typing import get_type_hints + argname, cls = next(iter(get_type_hints(func).items())) + assert isinstance(cls, type), ( + f"Invalid annotation for {argname!r}. {cls!r} is not a class." + ) + registry[cls] = func + if cache_token is None and hasattr(cls, '__abstractmethods__'): + cache_token = get_cache_token() + dispatch_cache.clear() + return func + + def wrapper(*args, **kw): + if not args: + raise TypeError(f'{funcname} requires at least ' + '1 positional argument') + + return dispatch(args[0].__class__)(*args, **kw) + + funcname = getattr(func, '__name__', 'singledispatch function') + registry[object] = func + wrapper.register = register + wrapper.dispatch = dispatch + wrapper.registry = types.MappingProxyType(registry) + wrapper._clear_cache = dispatch_cache.clear + update_wrapper(wrapper, func) + return wrapper diff --git a/env/Lib/genericpath.py b/env/Lib/genericpath.py new file mode 100644 index 0000000..303b3b3 --- /dev/null +++ b/env/Lib/genericpath.py @@ -0,0 +1,151 @@ +""" +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', 'samefile', 'sameopenfile', + 'samestat'] + + +# 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 OSError: + return False + return True + + +# This follows symbolic links, so both islink() and isdir() can be true +# for the same path on systems that support symlinks +def isfile(path): + """Test whether a path is a regular file""" + try: + st = os.stat(path) + except OSError: + 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 OSError: + 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 '' + # Some people pass in a list of pathname parts to operate in an OS-agnostic + # fashion; don't try to translate in that case as that's an abuse of the + # API and they are already doing what they need to be OS-agnostic and so + # they most likely won't be using an os.PathLike object in the sublists. + if not isinstance(m[0], (list, tuple)): + m = tuple(map(os.fspath, m)) + s1 = min(m) + s2 = max(m) + for i, c in enumerate(s1): + if c != s2[i]: + return s1[:i] + return s1 + +# 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) + + +# 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) + + +# 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.""" + # NOTE: This code must work for text and bytes strings. + + 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:filenameIndex+1] != extsep: + return p[:dotIndex], p[dotIndex:] + filenameIndex += 1 + + return p, p[:0] + +def _check_arg_types(funcname, *args): + hasstr = hasbytes = False + for s in args: + if isinstance(s, str): + hasstr = True + elif isinstance(s, bytes): + hasbytes = True + else: + raise TypeError('%s() argument must be str or bytes, not %r' % + (funcname, s.__class__.__name__)) from None + if hasstr and hasbytes: + raise TypeError("Can't mix strings and bytes in path components") from None diff --git a/env/Lib/hashlib.py b/env/Lib/hashlib.py new file mode 100644 index 0000000..4e783a8 --- /dev/null +++ b/env/Lib/hashlib.py @@ -0,0 +1,252 @@ +#. Copyright (C) 2005-2010 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, data=b'', **kwargs) - returns a new hash object implementing the + given hash function; initializing the hash + using the given binary data. + +Named constructor functions are also available, these are faster +than using new(name): + +md5(), sha1(), sha224(), sha256(), sha384(), sha512(), blake2b(), blake2s(), +sha3_224, sha3_256, sha3_384, sha3_512, shake_128, and shake_256. + +More algorithms may be available on your platform but the above are guaranteed +to exist. See the algorithms_guaranteed and algorithms_available attributes +to find out what algorithm names can be passed to new(). + +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(data): Update the hash object with the bytes in data. Repeated calls + are equivalent to a single call with the concatenation of all + the arguments. + - digest(): Return the digest of the bytes passed to the update() method + so far as a bytes object. + - 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 datas that share a common + initial substring. + +For example, to obtain the digest of the byte string 'Nobody inspects the +spammish repetition': + + >>> import hashlib + >>> m = hashlib.md5() + >>> m.update(b"Nobody inspects") + >>> m.update(b" the spammish repetition") + >>> m.digest() + b'\\xbbd\\x9c\\x83\\xdd\\x1e\\xa5\\xc9\\xd9\\xde\\xc9\\xa1\\x8d\\xf0\\xff\\xe9' + +More condensed: + + >>> hashlib.sha224(b"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', + 'blake2b', 'blake2s', + 'sha3_224', 'sha3_256', 'sha3_384', 'sha3_512', + 'shake_128', 'shake_256') + + +algorithms_guaranteed = set(__always_supported) +algorithms_available = set(__always_supported) + +__all__ = __always_supported + ('new', 'algorithms_guaranteed', + 'algorithms_available', 'pbkdf2_hmac') + + +__builtin_constructor_cache = {} + +def __get_builtin_constructor(name): + cache = __builtin_constructor_cache + constructor = cache.get(name) + if constructor is not None: + return constructor + try: + if name in ('SHA1', 'sha1'): + import _sha1 + cache['SHA1'] = cache['sha1'] = _sha1.sha1 + elif name in ('MD5', 'md5'): + import _md5 + cache['MD5'] = cache['md5'] = _md5.md5 + elif name in ('SHA256', 'sha256', 'SHA224', 'sha224'): + import _sha256 + cache['SHA224'] = cache['sha224'] = _sha256.sha224 + cache['SHA256'] = cache['sha256'] = _sha256.sha256 + elif name in ('SHA512', 'sha512', 'SHA384', 'sha384'): + import _sha512 + cache['SHA384'] = cache['sha384'] = _sha512.sha384 + cache['SHA512'] = cache['sha512'] = _sha512.sha512 + elif name in ('blake2b', 'blake2s'): + import _blake2 + cache['blake2b'] = _blake2.blake2b + cache['blake2s'] = _blake2.blake2s + elif name in {'sha3_224', 'sha3_256', 'sha3_384', 'sha3_512', + 'shake_128', 'shake_256'}: + import _sha3 + cache['sha3_224'] = _sha3.sha3_224 + cache['sha3_256'] = _sha3.sha3_256 + cache['sha3_384'] = _sha3.sha3_384 + cache['sha3_512'] = _sha3.sha3_512 + cache['shake_128'] = _sha3.shake_128 + cache['shake_256'] = _sha3.shake_256 + except ImportError: + pass # no extension module, this hash is unsupported. + + constructor = cache.get(name) + if constructor is not None: + return constructor + + raise ValueError('unsupported hash type ' + name) + + +def __get_openssl_constructor(name): + if name in {'blake2b', 'blake2s'}: + # Prefer our blake2 implementation. + return __get_builtin_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, data=b'', **kwargs): + """new(name, data=b'', **kwargs) - Return a new hashing object using the + named algorithm; optionally initialized with data (which must be + a bytes-like object). + """ + return __get_builtin_constructor(name)(data, **kwargs) + + +def __hash_new(name, data=b'', **kwargs): + """new(name, data=b'') - Return a new hashing object using the named algorithm; + optionally initialized with data (which must be a bytes-like object). + """ + if name in {'blake2b', 'blake2s'}: + # Prefer our blake2 implementation. + # OpenSSL 1.1.0 comes with a limited implementation of blake2b/s. + # It does neither support keyed blake2 nor advanced features like + # salt, personal, tree hashing or SSE. + return __get_builtin_constructor(name)(data, **kwargs) + try: + return _hashlib.new(name, data) + 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)(data) + + +try: + import _hashlib + new = __hash_new + __get_hash = __get_openssl_constructor + algorithms_available = algorithms_available.union( + _hashlib.openssl_md_meth_names) +except ImportError: + new = __py_new + __get_hash = __get_builtin_constructor + +try: + # OpenSSL's PKCS5_PBKDF2_HMAC requires OpenSSL 1.0+ with HMAC and SHA + from _hashlib import pbkdf2_hmac +except ImportError: + _trans_5C = bytes((x ^ 0x5C) for x in range(256)) + _trans_36 = bytes((x ^ 0x36) for x in range(256)) + + def pbkdf2_hmac(hash_name, password, salt, iterations, dklen=None): + """Password based key derivation function 2 (PKCS #5 v2.0) + + This Python implementations based on the hmac module about as fast + as OpenSSL's PKCS5_PBKDF2_HMAC for short passwords and much faster + for long passwords. + """ + if not isinstance(hash_name, str): + raise TypeError(hash_name) + + if not isinstance(password, (bytes, bytearray)): + password = bytes(memoryview(password)) + if not isinstance(salt, (bytes, bytearray)): + salt = bytes(memoryview(salt)) + + # Fast inline HMAC implementation + inner = new(hash_name) + outer = new(hash_name) + blocksize = getattr(inner, 'block_size', 64) + if len(password) > blocksize: + password = new(hash_name, password).digest() + password = password + b'\x00' * (blocksize - len(password)) + inner.update(password.translate(_trans_36)) + outer.update(password.translate(_trans_5C)) + + def prf(msg, inner=inner, outer=outer): + # PBKDF2_HMAC uses the password as key. We can re-use the same + # digest objects and just update copies to skip initialization. + icpy = inner.copy() + ocpy = outer.copy() + icpy.update(msg) + ocpy.update(icpy.digest()) + return ocpy.digest() + + if iterations < 1: + raise ValueError(iterations) + if dklen is None: + dklen = outer.digest_size + if dklen < 1: + raise ValueError(dklen) + + dkey = b'' + loop = 1 + from_bytes = int.from_bytes + while len(dkey) < dklen: + prev = prf(salt + loop.to_bytes(4, 'big')) + # endianness doesn't matter here as long to / from use the same + rkey = int.from_bytes(prev, 'big') + for i in range(iterations - 1): + prev = prf(prev) + # rkey = rkey ^ prev + rkey ^= from_bytes(prev, 'big') + loop += 1 + dkey += rkey.to_bytes(inner.digest_size, 'big') + + return dkey[:dklen] + +try: + # OpenSSL's scrypt requires OpenSSL 1.1+ + from _hashlib import scrypt +except ImportError: + pass + + +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/env/Lib/heapq.py b/env/Lib/heapq.py new file mode 100644 index 0000000..b31f418 --- /dev/null +++ b/env/Lib/heapq.py @@ -0,0 +1,607 @@ +"""Heap queue algorithm (a.k.a. priority queue). + +Heaps are arrays for which a[k] <= a[2*k+1] and a[k] <= a[2*k+2] for +all k, counting elements from 0. For the sake of comparison, +non-existing elements are considered to be infinite. The interesting +property of a heap is that a[0] is always its smallest element. + +Usage: + +heap = [] # creates an empty heap +heappush(heap, item) # pushes a new item on the heap +item = heappop(heap) # pops the smallest item from the heap +item = heap[0] # smallest item on the heap without popping it +heapify(x) # transforms list into a heap, in-place, in linear time +item = heapreplace(heap, item) # pops and returns smallest item, and adds + # new item; the heap size is unchanged + +Our API differs from textbook heap algorithms as follows: + +- We use 0-based indexing. This makes the relationship between the + index for a node and the indexes for its children slightly less + obvious, but is more suitable since Python uses 0-based indexing. + +- Our heappop() method returns the smallest item, not the largest. + +These two make it possible to view the heap as a regular Python list +without surprises: heap[0] is the smallest item, and heap.sort() +maintains the heap invariant! +""" + +# Original code by Kevin O'Connor, augmented by Tim Peters and Raymond Hettinger + +__about__ = """Heap queues + +[explanation by François Pinard] + +Heaps are arrays for which a[k] <= a[2*k+1] and a[k] <= a[2*k+2] for +all k, counting elements from 0. For the sake of comparison, +non-existing elements are considered to be infinite. The interesting +property of a heap is that a[0] is always its smallest element. + +The strange invariant above is meant to be an efficient memory +representation for a tournament. The numbers below are `k', not a[k]: + + 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 30 + + +In the tree above, each cell `k' is topping `2*k+1' and `2*k+2'. In +a usual binary tournament we see in sports, each cell is the winner +over the two cells it tops, and we can trace the winner down the tree +to see all opponents s/he had. However, in many computer applications +of such tournaments, we do not need to trace the history of a winner. +To be more memory efficient, when a winner is promoted, we try to +replace it by something else at a lower level, and the rule becomes +that a cell and the two cells it tops contain three different items, +but the top cell "wins" over the two topped cells. + +If this heap invariant is protected at all time, index 0 is clearly +the overall winner. The simplest algorithmic way to remove it and +find the "next" winner is to move some loser (let's say cell 30 in the +diagram above) into the 0 position, and then percolate this new 0 down +the tree, exchanging values, until the invariant is re-established. +This is clearly logarithmic on the total number of items in the tree. +By iterating over all items, you get an O(n ln n) sort. + +A nice feature of this sort is that you can efficiently insert new +items while the sort is going on, provided that the inserted items are +not "better" than the last 0'th element you extracted. This is +especially useful in simulation contexts, where the tree holds all +incoming events, and the "win" condition means the smallest scheduled +time. When an event schedule other events for execution, they are +scheduled into the future, so they can easily go into the heap. So, a +heap is a good structure for implementing schedulers (this is what I +used for my MIDI sequencer :-). + +Various structures for implementing schedulers have been extensively +studied, and heaps are good for this, as they are reasonably speedy, +the speed is almost constant, and the worst case is not much different +than the average case. However, there are other representations which +are more efficient overall, yet the worst cases might be terrible. + +Heaps are also very useful in big disk sorts. You most probably all +know that a big sort implies producing "runs" (which are pre-sorted +sequences, which size is usually related to the amount of CPU memory), +followed by a merging passes for these runs, which merging is often +very cleverly organised[1]. It is very important that the initial +sort produces the longest runs possible. Tournaments are a good way +to that. If, using all the memory available to hold a tournament, you +replace and percolate items that happen to fit the current run, you'll +produce runs which are twice the size of the memory for random input, +and much better for input fuzzily ordered. + +Moreover, if you output the 0'th item on disk and get an input which +may not fit in the current tournament (because the value "wins" over +the last output value), it cannot fit in the heap, so the size of the +heap decreases. The freed memory could be cleverly reused immediately +for progressively building a second heap, which grows at exactly the +same rate the first heap is melting. When the first heap completely +vanishes, you switch heaps and start a new run. Clever and quite +effective! + +In a word, heaps are useful memory structures to know. I use them in +a few applications, and I think it is good to keep a `heap' module +around. :-) + +-------------------- +[1] The disk balancing algorithms which are current, nowadays, are +more annoying than clever, and this is a consequence of the seeking +capabilities of the disks. On devices which cannot seek, like big +tape drives, the story was quite different, and one had to be very +clever to ensure (far in advance) that each tape movement will be the +most effective possible (that is, will best participate at +"progressing" the merge). Some tapes were even able to read +backwards, and this was also used to avoid the rewinding time. +Believe me, real good tape sorts were quite spectacular to watch! +From all times, sorting has always been a Great Art! :-) +""" + +__all__ = ['heappush', 'heappop', 'heapify', 'heapreplace', 'merge', + 'nlargest', 'nsmallest', 'heappushpop'] + +def heappush(heap, item): + """Push item onto heap, maintaining the heap invariant.""" + heap.append(item) + _siftdown(heap, 0, len(heap)-1) + +def heappop(heap): + """Pop the smallest item off the heap, maintaining the heap invariant.""" + lastelt = heap.pop() # raises appropriate IndexError if heap is empty + if heap: + returnitem = heap[0] + heap[0] = lastelt + _siftup(heap, 0) + return returnitem + return lastelt + +def heapreplace(heap, item): + """Pop and return the current smallest value, and add the new item. + + This is more efficient than heappop() followed by heappush(), and can be + more appropriate when using a fixed-size heap. Note that the value + returned may be larger than item! That constrains reasonable uses of + this routine unless written as part of a conditional replacement: + + if item > heap[0]: + item = heapreplace(heap, item) + """ + returnitem = heap[0] # raises appropriate IndexError if heap is empty + heap[0] = item + _siftup(heap, 0) + return returnitem + +def heappushpop(heap, item): + """Fast version of a heappush followed by a heappop.""" + if heap and heap[0] < item: + item, heap[0] = heap[0], item + _siftup(heap, 0) + return item + +def heapify(x): + """Transform list into a heap, in-place, in O(len(x)) time.""" + n = len(x) + # Transform bottom-up. The largest index there's any point to looking at + # is the largest with a child index in-range, so must have 2*i + 1 < n, + # or i < (n-1)/2. If n is even = 2*j, this is (2*j-1)/2 = j-1/2 so + # j-1 is the largest, which is n//2 - 1. If n is odd = 2*j+1, this is + # (2*j+1-1)/2 = j so j-1 is the largest, and that's again n//2-1. + for i in reversed(range(n//2)): + _siftup(x, i) + +def _heappop_max(heap): + """Maxheap version of a heappop.""" + lastelt = heap.pop() # raises appropriate IndexError if heap is empty + if heap: + returnitem = heap[0] + heap[0] = lastelt + _siftup_max(heap, 0) + return returnitem + return lastelt + +def _heapreplace_max(heap, item): + """Maxheap version of a heappop followed by a heappush.""" + returnitem = heap[0] # raises appropriate IndexError if heap is empty + heap[0] = item + _siftup_max(heap, 0) + return returnitem + +def _heapify_max(x): + """Transform list into a maxheap, in-place, in O(len(x)) time.""" + n = len(x) + for i in reversed(range(n//2)): + _siftup_max(x, i) + +# 'heap' is a heap at all indices >= startpos, except possibly for pos. pos +# is the index of a leaf with a possibly out-of-order value. Restore the +# heap invariant. +def _siftdown(heap, startpos, pos): + newitem = heap[pos] + # Follow the path to the root, moving parents down until finding a place + # newitem fits. + while pos > startpos: + parentpos = (pos - 1) >> 1 + parent = heap[parentpos] + if newitem < parent: + heap[pos] = parent + pos = parentpos + continue + break + heap[pos] = newitem + +# The child indices of heap index pos are already heaps, and we want to make +# a heap at index pos too. We do this by bubbling the smaller child of +# pos up (and so on with that child's children, etc) until hitting a leaf, +# then using _siftdown to move the oddball originally at index pos into place. +# +# We *could* break out of the loop as soon as we find a pos where newitem <= +# both its children, but turns out that's not a good idea, and despite that +# many books write the algorithm that way. During a heap pop, the last array +# element is sifted in, and that tends to be large, so that comparing it +# against values starting from the root usually doesn't pay (= usually doesn't +# get us out of the loop early). See Knuth, Volume 3, where this is +# explained and quantified in an exercise. +# +# Cutting the # of comparisons is important, since these routines have no +# way to extract "the priority" from an array element, so that intelligence +# is likely to be hiding in custom comparison methods, or in array elements +# storing (priority, record) tuples. Comparisons are thus potentially +# expensive. +# +# On random arrays of length 1000, making this change cut the number of +# comparisons made by heapify() a little, and those made by exhaustive +# heappop() a lot, in accord with theory. Here are typical results from 3 +# runs (3 just to demonstrate how small the variance is): +# +# Compares needed by heapify Compares needed by 1000 heappops +# -------------------------- -------------------------------- +# 1837 cut to 1663 14996 cut to 8680 +# 1855 cut to 1659 14966 cut to 8678 +# 1847 cut to 1660 15024 cut to 8703 +# +# Building the heap by using heappush() 1000 times instead required +# 2198, 2148, and 2219 compares: heapify() is more efficient, when +# you can use it. +# +# The total compares needed by list.sort() on the same lists were 8627, +# 8627, and 8632 (this should be compared to the sum of heapify() and +# heappop() compares): list.sort() is (unsurprisingly!) more efficient +# for sorting. + +def _siftup(heap, pos): + endpos = len(heap) + startpos = pos + newitem = heap[pos] + # Bubble up the smaller child until hitting a leaf. + childpos = 2*pos + 1 # leftmost child position + while childpos < endpos: + # Set childpos to index of smaller child. + rightpos = childpos + 1 + if rightpos < endpos and not heap[childpos] < heap[rightpos]: + childpos = rightpos + # Move the smaller child up. + heap[pos] = heap[childpos] + pos = childpos + childpos = 2*pos + 1 + # The leaf at pos is empty now. Put newitem there, and bubble it up + # to its final resting place (by sifting its parents down). + heap[pos] = newitem + _siftdown(heap, startpos, pos) + +def _siftdown_max(heap, startpos, pos): + 'Maxheap variant of _siftdown' + newitem = heap[pos] + # Follow the path to the root, moving parents down until finding a place + # newitem fits. + while pos > startpos: + parentpos = (pos - 1) >> 1 + parent = heap[parentpos] + if parent < newitem: + heap[pos] = parent + pos = parentpos + continue + break + heap[pos] = newitem + +def _siftup_max(heap, pos): + 'Maxheap variant of _siftup' + endpos = len(heap) + startpos = pos + newitem = heap[pos] + # Bubble up the larger child until hitting a leaf. + childpos = 2*pos + 1 # leftmost child position + while childpos < endpos: + # Set childpos to index of larger child. + rightpos = childpos + 1 + if rightpos < endpos and not heap[rightpos] < heap[childpos]: + childpos = rightpos + # Move the larger child up. + heap[pos] = heap[childpos] + pos = childpos + childpos = 2*pos + 1 + # The leaf at pos is empty now. Put newitem there, and bubble it up + # to its final resting place (by sifting its parents down). + heap[pos] = newitem + _siftdown_max(heap, startpos, pos) + +def merge(*iterables, key=None, reverse=False): + '''Merge multiple sorted inputs into a single sorted output. + + Similar to sorted(itertools.chain(*iterables)) but returns a generator, + does not pull the data into memory all at once, and assumes that each of + the input streams is already sorted (smallest to largest). + + >>> list(merge([1,3,5,7], [0,2,4,8], [5,10,15,20], [], [25])) + [0, 1, 2, 3, 4, 5, 5, 7, 8, 10, 15, 20, 25] + + If *key* is not None, applies a key function to each element to determine + its sort order. + + >>> list(merge(['dog', 'horse'], ['cat', 'fish', 'kangaroo'], key=len)) + ['dog', 'cat', 'fish', 'horse', 'kangaroo'] + + ''' + + h = [] + h_append = h.append + + if reverse: + _heapify = _heapify_max + _heappop = _heappop_max + _heapreplace = _heapreplace_max + direction = -1 + else: + _heapify = heapify + _heappop = heappop + _heapreplace = heapreplace + direction = 1 + + if key is None: + for order, it in enumerate(map(iter, iterables)): + try: + next = it.__next__ + h_append([next(), order * direction, next]) + except StopIteration: + pass + _heapify(h) + while len(h) > 1: + try: + while True: + value, order, next = s = h[0] + yield value + s[0] = next() # raises StopIteration when exhausted + _heapreplace(h, s) # restore heap condition + except StopIteration: + _heappop(h) # remove empty iterator + if h: + # fast case when only a single iterator remains + value, order, next = h[0] + yield value + yield from next.__self__ + return + + for order, it in enumerate(map(iter, iterables)): + try: + next = it.__next__ + value = next() + h_append([key(value), order * direction, value, next]) + except StopIteration: + pass + _heapify(h) + while len(h) > 1: + try: + while True: + key_value, order, value, next = s = h[0] + yield value + value = next() + s[0] = key(value) + s[2] = value + _heapreplace(h, s) + except StopIteration: + _heappop(h) + if h: + key_value, order, value, next = h[0] + yield value + yield from next.__self__ + + +# Algorithm notes for nlargest() and nsmallest() +# ============================================== +# +# Make a single pass over the data while keeping the k most extreme values +# in a heap. Memory consumption is limited to keeping k values in a list. +# +# Measured performance for random inputs: +# +# number of comparisons +# n inputs k-extreme values (average of 5 trials) % more than min() +# ------------- ---------------- --------------------- ----------------- +# 1,000 100 3,317 231.7% +# 10,000 100 14,046 40.5% +# 100,000 100 105,749 5.7% +# 1,000,000 100 1,007,751 0.8% +# 10,000,000 100 10,009,401 0.1% +# +# Theoretical number of comparisons for k smallest of n random inputs: +# +# Step Comparisons Action +# ---- -------------------------- --------------------------- +# 1 1.66 * k heapify the first k-inputs +# 2 n - k compare remaining elements to top of heap +# 3 k * (1 + lg2(k)) * ln(n/k) replace the topmost value on the heap +# 4 k * lg2(k) - (k/2) final sort of the k most extreme values +# +# Combining and simplifying for a rough estimate gives: +# +# comparisons = n + k * (log(k, 2) * log(n/k) + log(k, 2) + log(n/k)) +# +# Computing the number of comparisons for step 3: +# ----------------------------------------------- +# * For the i-th new value from the iterable, the probability of being in the +# k most extreme values is k/i. For example, the probability of the 101st +# value seen being in the 100 most extreme values is 100/101. +# * If the value is a new extreme value, the cost of inserting it into the +# heap is 1 + log(k, 2). +# * The probability times the cost gives: +# (k/i) * (1 + log(k, 2)) +# * Summing across the remaining n-k elements gives: +# sum((k/i) * (1 + log(k, 2)) for i in range(k+1, n+1)) +# * This reduces to: +# (H(n) - H(k)) * k * (1 + log(k, 2)) +# * Where H(n) is the n-th harmonic number estimated by: +# gamma = 0.5772156649 +# H(n) = log(n, e) + gamma + 1 / (2 * n) +# http://en.wikipedia.org/wiki/Harmonic_series_(mathematics)#Rate_of_divergence +# * Substituting the H(n) formula: +# comparisons = k * (1 + log(k, 2)) * (log(n/k, e) + (1/n - 1/k) / 2) +# +# Worst-case for step 3: +# ---------------------- +# In the worst case, the input data is reversed sorted so that every new element +# must be inserted in the heap: +# +# comparisons = 1.66 * k + log(k, 2) * (n - k) +# +# Alternative Algorithms +# ---------------------- +# Other algorithms were not used because they: +# 1) Took much more auxiliary memory, +# 2) Made multiple passes over the data. +# 3) Made more comparisons in common cases (small k, large n, semi-random input). +# See the more detailed comparison of approach at: +# http://code.activestate.com/recipes/577573-compare-algorithms-for-heapqsmallest + +def nsmallest(n, iterable, key=None): + """Find the n smallest elements in a dataset. + + Equivalent to: sorted(iterable, key=key)[:n] + """ + + # Short-cut for n==1 is to use min() + if n == 1: + it = iter(iterable) + sentinel = object() + if key is None: + result = min(it, default=sentinel) + else: + result = min(it, default=sentinel, key=key) + return [] if result is sentinel else [result] + + # When n>=size, it's faster to use sorted() + try: + size = len(iterable) + except (TypeError, AttributeError): + pass + else: + if n >= size: + return sorted(iterable, key=key)[:n] + + # When key is none, use simpler decoration + if key is None: + it = iter(iterable) + # put the range(n) first so that zip() doesn't + # consume one too many elements from the iterator + result = [(elem, i) for i, elem in zip(range(n), it)] + if not result: + return result + _heapify_max(result) + top = result[0][0] + order = n + _heapreplace = _heapreplace_max + for elem in it: + if elem < top: + _heapreplace(result, (elem, order)) + top, _order = result[0] + order += 1 + result.sort() + return [elem for (elem, order) in result] + + # General case, slowest method + it = iter(iterable) + result = [(key(elem), i, elem) for i, elem in zip(range(n), it)] + if not result: + return result + _heapify_max(result) + top = result[0][0] + order = n + _heapreplace = _heapreplace_max + for elem in it: + k = key(elem) + if k < top: + _heapreplace(result, (k, order, elem)) + top, _order, _elem = result[0] + order += 1 + result.sort() + return [elem for (k, order, elem) in result] + +def nlargest(n, iterable, key=None): + """Find the n largest elements in a dataset. + + Equivalent to: sorted(iterable, key=key, reverse=True)[:n] + """ + + # Short-cut for n==1 is to use max() + if n == 1: + it = iter(iterable) + sentinel = object() + if key is None: + result = max(it, default=sentinel) + else: + result = max(it, default=sentinel, key=key) + return [] if result is sentinel else [result] + + # When n>=size, it's faster to use sorted() + try: + size = len(iterable) + except (TypeError, AttributeError): + pass + else: + if n >= size: + return sorted(iterable, key=key, reverse=True)[:n] + + # When key is none, use simpler decoration + if key is None: + it = iter(iterable) + result = [(elem, i) for i, elem in zip(range(0, -n, -1), it)] + if not result: + return result + heapify(result) + top = result[0][0] + order = -n + _heapreplace = heapreplace + for elem in it: + if top < elem: + _heapreplace(result, (elem, order)) + top, _order = result[0] + order -= 1 + result.sort(reverse=True) + return [elem for (elem, order) in result] + + # General case, slowest method + it = iter(iterable) + result = [(key(elem), i, elem) for i, elem in zip(range(0, -n, -1), it)] + if not result: + return result + heapify(result) + top = result[0][0] + order = -n + _heapreplace = heapreplace + for elem in it: + k = key(elem) + if top < k: + _heapreplace(result, (k, order, elem)) + top, _order, _elem = result[0] + order -= 1 + result.sort(reverse=True) + return [elem for (k, order, elem) in result] + +# If available, use C implementation +try: + from _heapq import * +except ImportError: + pass +try: + from _heapq import _heapreplace_max +except ImportError: + pass +try: + from _heapq import _heapify_max +except ImportError: + pass +try: + from _heapq import _heappop_max +except ImportError: + pass + + +if __name__ == "__main__": + + import doctest + print(doctest.testmod()) diff --git a/env/Lib/hmac.py b/env/Lib/hmac.py new file mode 100644 index 0000000..43b7212 --- /dev/null +++ b/env/Lib/hmac.py @@ -0,0 +1,188 @@ +"""HMAC (Keyed-Hashing for Message Authentication) Python module. + +Implements the HMAC algorithm as described by RFC 2104. +""" + +import warnings as _warnings +from _operator import _compare_digest as compare_digest +try: + import _hashlib as _hashopenssl +except ImportError: + _hashopenssl = None + _openssl_md_meths = None +else: + _openssl_md_meths = frozenset(_hashopenssl.openssl_md_meth_names) +import hashlib as _hashlib + +trans_5C = bytes((x ^ 0x5C) for x in range(256)) +trans_36 = bytes((x ^ 0x36) for x in range(256)) + +# The size of the digests returned by HMAC depends on the underlying +# hashing module used. Use digest_size from the instance of HMAC instead. +digest_size = None + + + +class HMAC: + """RFC 2104 HMAC class. Also complies with RFC 4231. + + This supports the API for Cryptographic Hash Functions (PEP 247). + """ + blocksize = 64 # 512-bit HMAC; can be changed in subclasses. + + def __init__(self, key, msg = None, digestmod = None): + """Create a new HMAC object. + + key: key for the keyed hash object. + msg: Initial input for the hash, if provided. + digestmod: A module supporting PEP 247. *OR* + A hashlib constructor returning a new hash object. *OR* + A hash name suitable for hashlib.new(). + Defaults to hashlib.md5. + Implicit default to hashlib.md5 is deprecated since Python + 3.4 and will be removed in Python 3.8. + + Note: key and msg must be a bytes or bytearray objects. + """ + + if not isinstance(key, (bytes, bytearray)): + raise TypeError("key: expected bytes or bytearray, but got %r" % type(key).__name__) + + if digestmod is None: + _warnings.warn("HMAC() without an explicit digestmod argument " + "is deprecated since Python 3.4, and will be removed " + "in 3.8", + DeprecationWarning, 2) + digestmod = _hashlib.md5 + + if callable(digestmod): + self.digest_cons = digestmod + elif isinstance(digestmod, str): + self.digest_cons = lambda d=b'': _hashlib.new(digestmod, d) + else: + self.digest_cons = lambda d=b'': digestmod.new(d) + + self.outer = self.digest_cons() + self.inner = self.digest_cons() + self.digest_size = self.inner.digest_size + + if hasattr(self.inner, 'block_size'): + blocksize = self.inner.block_size + if blocksize < 16: + _warnings.warn('block_size of %d seems too small; using our ' + 'default of %d.' % (blocksize, self.blocksize), + RuntimeWarning, 2) + blocksize = self.blocksize + else: + _warnings.warn('No block_size attribute on given digest object; ' + 'Assuming %d.' % (self.blocksize), + RuntimeWarning, 2) + blocksize = self.blocksize + + # self.blocksize is the default blocksize. self.block_size is + # effective block size as well as the public API attribute. + self.block_size = blocksize + + if len(key) > blocksize: + key = self.digest_cons(key).digest() + + key = key.ljust(blocksize, b'\0') + self.outer.update(key.translate(trans_5C)) + self.inner.update(key.translate(trans_36)) + if msg is not None: + self.update(msg) + + @property + def name(self): + return "hmac-" + self.inner.name + + def update(self, msg): + """Update this hashing object with the string msg. + """ + self.inner.update(msg) + + def copy(self): + """Return a separate copy of this hashing object. + + An update to this copy won't affect the original object. + """ + # Call __new__ directly to avoid the expensive __init__. + other = self.__class__.__new__(self.__class__) + other.digest_cons = self.digest_cons + other.digest_size = self.digest_size + other.inner = self.inner.copy() + other.outer = self.outer.copy() + return other + + def _current(self): + """Return a hash object for the current state. + + To be used only internally with digest() and hexdigest(). + """ + h = self.outer.copy() + h.update(self.inner.digest()) + return h + + def digest(self): + """Return the hash value of this hashing object. + + This returns a string containing 8-bit data. The object is + not altered in any way by this function; you can continue + updating the object after calling this function. + """ + h = self._current() + return h.digest() + + def hexdigest(self): + """Like digest(), but returns a string of hexadecimal digits instead. + """ + h = self._current() + return h.hexdigest() + +def new(key, msg = None, digestmod = None): + """Create a new hashing object and return it. + + key: The starting key for the hash. + msg: if available, will immediately be hashed into the object's starting + state. + + You can now feed arbitrary strings into the object using its update() + method, and can ask for the hash value at any time by calling its digest() + method. + """ + return HMAC(key, msg, digestmod) + + +def digest(key, msg, digest): + """Fast inline implementation of HMAC + + key: key for the keyed hash object. + msg: input message + digest: A hash name suitable for hashlib.new() for best performance. *OR* + A hashlib constructor returning a new hash object. *OR* + A module supporting PEP 247. + + Note: key and msg must be a bytes or bytearray objects. + """ + if (_hashopenssl is not None and + isinstance(digest, str) and digest in _openssl_md_meths): + return _hashopenssl.hmac_digest(key, msg, digest) + + if callable(digest): + digest_cons = digest + elif isinstance(digest, str): + digest_cons = lambda d=b'': _hashlib.new(digest, d) + else: + digest_cons = lambda d=b'': digest.new(d) + + inner = digest_cons() + outer = digest_cons() + blocksize = getattr(inner, 'block_size', 64) + if len(key) > blocksize: + key = digest_cons(key).digest() + key = key + b'\x00' * (blocksize - len(key)) + inner.update(key.translate(trans_36)) + outer.update(key.translate(trans_5C)) + inner.update(msg) + outer.update(inner.digest()) + return outer.digest() diff --git a/env/Lib/imp.py b/env/Lib/imp.py new file mode 100644 index 0000000..31f8c76 --- /dev/null +++ b/env/Lib/imp.py @@ -0,0 +1,345 @@ +"""This module provides the components needed to build your own __import__ +function. Undocumented functions are obsolete. + +In most cases it is preferred you consider using the importlib module's +functionality over this module. + +""" +# (Probably) need to stay in _imp +from _imp import (lock_held, acquire_lock, release_lock, + get_frozen_object, is_frozen_package, + init_frozen, is_builtin, is_frozen, + _fix_co_filename) +try: + from _imp import create_dynamic +except ImportError: + # Platform doesn't support dynamic loading. + create_dynamic = None + +from importlib._bootstrap import _ERR_MSG, _exec, _load, _builtin_from_name +from importlib._bootstrap_external import SourcelessFileLoader + +from importlib import machinery +from importlib import util +import importlib +import os +import sys +import tokenize +import types +import warnings + +warnings.warn("the imp module is deprecated in favour of importlib; " + "see the module's documentation for alternative uses", + DeprecationWarning, stacklevel=2) + +# DEPRECATED +SEARCH_ERROR = 0 +PY_SOURCE = 1 +PY_COMPILED = 2 +C_EXTENSION = 3 +PY_RESOURCE = 4 +PKG_DIRECTORY = 5 +C_BUILTIN = 6 +PY_FROZEN = 7 +PY_CODERESOURCE = 8 +IMP_HOOK = 9 + + +def new_module(name): + """**DEPRECATED** + + Create a new module. + + The module is not entered into sys.modules. + + """ + return types.ModuleType(name) + + +def get_magic(): + """**DEPRECATED** + + Return the magic number for .pyc files. + """ + return util.MAGIC_NUMBER + + +def get_tag(): + """Return the magic tag for .pyc files.""" + return sys.implementation.cache_tag + + +def cache_from_source(path, debug_override=None): + """**DEPRECATED** + + Given the path to a .py file, return the path to its .pyc file. + + The .py file does not need to exist; this simply returns the path to the + .pyc file calculated as if the .py file were imported. + + If debug_override is not None, then it must be a boolean and is used in + place of sys.flags.optimize. + + If sys.implementation.cache_tag is None then NotImplementedError is raised. + + """ + with warnings.catch_warnings(): + warnings.simplefilter('ignore') + return util.cache_from_source(path, debug_override) + + +def source_from_cache(path): + """**DEPRECATED** + + Given the path to a .pyc. file, return the path to its .py file. + + The .pyc file does not need to exist; this simply returns the path to + the .py file calculated to correspond to the .pyc file. If path does + not conform to PEP 3147 format, ValueError will be raised. If + sys.implementation.cache_tag is None then NotImplementedError is raised. + + """ + return util.source_from_cache(path) + + +def get_suffixes(): + """**DEPRECATED**""" + extensions = [(s, 'rb', C_EXTENSION) for s in machinery.EXTENSION_SUFFIXES] + source = [(s, 'r', PY_SOURCE) for s in machinery.SOURCE_SUFFIXES] + bytecode = [(s, 'rb', PY_COMPILED) for s in machinery.BYTECODE_SUFFIXES] + + return extensions + source + bytecode + + +class NullImporter: + + """**DEPRECATED** + + Null import object. + + """ + + def __init__(self, path): + if path == '': + raise ImportError('empty pathname', path='') + elif os.path.isdir(path): + raise ImportError('existing directory', path=path) + + def find_module(self, fullname): + """Always returns None.""" + return None + + +class _HackedGetData: + + """Compatibility support for 'file' arguments of various load_*() + functions.""" + + def __init__(self, fullname, path, file=None): + super().__init__(fullname, path) + self.file = file + + def get_data(self, path): + """Gross hack to contort loader to deal w/ load_*()'s bad API.""" + if self.file and path == self.path: + # The contract of get_data() requires us to return bytes. Reopen the + # file in binary mode if needed. + if not self.file.closed: + file = self.file + if 'b' not in file.mode: + file.close() + if self.file.closed: + self.file = file = open(self.path, 'rb') + + with file: + return file.read() + else: + return super().get_data(path) + + +class _LoadSourceCompatibility(_HackedGetData, machinery.SourceFileLoader): + + """Compatibility support for implementing load_source().""" + + +def load_source(name, pathname, file=None): + loader = _LoadSourceCompatibility(name, pathname, file) + spec = util.spec_from_file_location(name, pathname, loader=loader) + if name in sys.modules: + module = _exec(spec, sys.modules[name]) + else: + module = _load(spec) + # To allow reloading to potentially work, use a non-hacked loader which + # won't rely on a now-closed file object. + module.__loader__ = machinery.SourceFileLoader(name, pathname) + module.__spec__.loader = module.__loader__ + return module + + +class _LoadCompiledCompatibility(_HackedGetData, SourcelessFileLoader): + + """Compatibility support for implementing load_compiled().""" + + +def load_compiled(name, pathname, file=None): + """**DEPRECATED**""" + loader = _LoadCompiledCompatibility(name, pathname, file) + spec = util.spec_from_file_location(name, pathname, loader=loader) + if name in sys.modules: + module = _exec(spec, sys.modules[name]) + else: + module = _load(spec) + # To allow reloading to potentially work, use a non-hacked loader which + # won't rely on a now-closed file object. + module.__loader__ = SourcelessFileLoader(name, pathname) + module.__spec__.loader = module.__loader__ + return module + + +def load_package(name, path): + """**DEPRECATED**""" + if os.path.isdir(path): + extensions = (machinery.SOURCE_SUFFIXES[:] + + machinery.BYTECODE_SUFFIXES[:]) + for extension in extensions: + init_path = os.path.join(path, '__init__' + extension) + if os.path.exists(init_path): + path = init_path + break + else: + raise ValueError('{!r} is not a package'.format(path)) + spec = util.spec_from_file_location(name, path, + submodule_search_locations=[]) + if name in sys.modules: + return _exec(spec, sys.modules[name]) + else: + return _load(spec) + + +def load_module(name, file, filename, details): + """**DEPRECATED** + + Load a module, given information returned by find_module(). + + The module name must include the full package name, if any. + + """ + suffix, mode, type_ = details + if mode and (not mode.startswith(('r', 'U')) or '+' in mode): + raise ValueError('invalid file open mode {!r}'.format(mode)) + elif file is None and type_ in {PY_SOURCE, PY_COMPILED}: + msg = 'file object required for import (type code {})'.format(type_) + raise ValueError(msg) + elif type_ == PY_SOURCE: + return load_source(name, filename, file) + elif type_ == PY_COMPILED: + return load_compiled(name, filename, file) + elif type_ == C_EXTENSION and load_dynamic is not None: + if file is None: + with open(filename, 'rb') as opened_file: + return load_dynamic(name, filename, opened_file) + else: + return load_dynamic(name, filename, file) + elif type_ == PKG_DIRECTORY: + return load_package(name, filename) + elif type_ == C_BUILTIN: + return init_builtin(name) + elif type_ == PY_FROZEN: + return init_frozen(name) + else: + msg = "Don't know how to import {} (type code {})".format(name, type_) + raise ImportError(msg, name=name) + + +def find_module(name, path=None): + """**DEPRECATED** + + Search for a module. + + If path is omitted or None, search for a built-in, frozen or special + module and continue search in sys.path. The module name cannot + contain '.'; to search for a submodule of a package, pass the + submodule name and the package's __path__. + + """ + if not isinstance(name, str): + raise TypeError("'name' must be a str, not {}".format(type(name))) + elif not isinstance(path, (type(None), list)): + # Backwards-compatibility + raise RuntimeError("'path' must be None or a list, " + "not {}".format(type(path))) + + if path is None: + if is_builtin(name): + return None, None, ('', '', C_BUILTIN) + elif is_frozen(name): + return None, None, ('', '', PY_FROZEN) + else: + path = sys.path + + for entry in path: + package_directory = os.path.join(entry, name) + for suffix in ['.py', machinery.BYTECODE_SUFFIXES[0]]: + package_file_name = '__init__' + suffix + file_path = os.path.join(package_directory, package_file_name) + if os.path.isfile(file_path): + return None, package_directory, ('', '', PKG_DIRECTORY) + for suffix, mode, type_ in get_suffixes(): + file_name = name + suffix + file_path = os.path.join(entry, file_name) + if os.path.isfile(file_path): + break + else: + continue + break # Break out of outer loop when breaking out of inner loop. + else: + raise ImportError(_ERR_MSG.format(name), name=name) + + encoding = None + if 'b' not in mode: + with open(file_path, 'rb') as file: + encoding = tokenize.detect_encoding(file.readline)[0] + file = open(file_path, mode, encoding=encoding) + return file, file_path, (suffix, mode, type_) + + +def reload(module): + """**DEPRECATED** + + Reload the module and return it. + + The module must have been successfully imported before. + + """ + return importlib.reload(module) + + +def init_builtin(name): + """**DEPRECATED** + + Load and return a built-in module by name, or None is such module doesn't + exist + """ + try: + return _builtin_from_name(name) + except ImportError: + return None + + +if create_dynamic: + def load_dynamic(name, path, file=None): + """**DEPRECATED** + + Load an extension module. + """ + import importlib.machinery + loader = importlib.machinery.ExtensionFileLoader(name, path) + + # Issue #24748: Skip the sys.modules check in _load_module_shim; + # always load new extension + spec = importlib.machinery.ModuleSpec( + name=name, loader=loader, origin=path) + return _load(spec) + +else: + load_dynamic = None diff --git a/env/Lib/importlib/__init__.py b/env/Lib/importlib/__init__.py new file mode 100644 index 0000000..cb37d24 --- /dev/null +++ b/env/Lib/importlib/__init__.py @@ -0,0 +1,176 @@ +"""A pure Python implementation of import.""" +__all__ = ['__import__', 'import_module', 'invalidate_caches', 'reload'] + +# Bootstrap help ##################################################### + +# Until bootstrapping is complete, DO NOT import any modules that attempt +# to import importlib._bootstrap (directly or indirectly). Since this +# partially initialised package would be present in sys.modules, those +# modules would get an uninitialised copy of the source version, instead +# of a fully initialised version (either the frozen one or the one +# initialised below if the frozen one is not available). +import _imp # Just the builtin component, NOT the full Python module +import sys + +try: + import _frozen_importlib as _bootstrap +except ImportError: + from . import _bootstrap + _bootstrap._setup(sys, _imp) +else: + # importlib._bootstrap is the built-in import, ensure we don't create + # a second copy of the module. + _bootstrap.__name__ = 'importlib._bootstrap' + _bootstrap.__package__ = 'importlib' + try: + _bootstrap.__file__ = __file__.replace('__init__.py', '_bootstrap.py') + except NameError: + # __file__ is not guaranteed to be defined, e.g. if this code gets + # frozen by a tool like cx_Freeze. + pass + sys.modules['importlib._bootstrap'] = _bootstrap + +try: + import _frozen_importlib_external as _bootstrap_external +except ImportError: + from . import _bootstrap_external + _bootstrap_external._setup(_bootstrap) + _bootstrap._bootstrap_external = _bootstrap_external +else: + _bootstrap_external.__name__ = 'importlib._bootstrap_external' + _bootstrap_external.__package__ = 'importlib' + try: + _bootstrap_external.__file__ = __file__.replace('__init__.py', '_bootstrap_external.py') + except NameError: + # __file__ is not guaranteed to be defined, e.g. if this code gets + # frozen by a tool like cx_Freeze. + pass + sys.modules['importlib._bootstrap_external'] = _bootstrap_external + +# To simplify imports in test code +_w_long = _bootstrap_external._w_long +_r_long = _bootstrap_external._r_long + +# Fully bootstrapped at this point, import whatever you like, circular +# dependencies and startup overhead minimisation permitting :) + +import types +import warnings + + +# Public API ######################################################### + +from ._bootstrap import __import__ + + +def invalidate_caches(): + """Call the invalidate_caches() method on all meta path finders stored in + sys.meta_path (where implemented).""" + for finder in sys.meta_path: + if hasattr(finder, 'invalidate_caches'): + finder.invalidate_caches() + + +def find_loader(name, path=None): + """Return the loader for the specified module. + + This is a backward-compatible wrapper around find_spec(). + + This function is deprecated in favor of importlib.util.find_spec(). + + """ + warnings.warn('Deprecated since Python 3.4. ' + 'Use importlib.util.find_spec() instead.', + DeprecationWarning, stacklevel=2) + try: + loader = sys.modules[name].__loader__ + if loader is None: + raise ValueError('{}.__loader__ is None'.format(name)) + else: + return loader + except KeyError: + pass + except AttributeError: + raise ValueError('{}.__loader__ is not set'.format(name)) from None + + spec = _bootstrap._find_spec(name, path) + # We won't worry about malformed specs (missing attributes). + if spec is None: + return None + if spec.loader is None: + if spec.submodule_search_locations is None: + raise ImportError('spec for {} missing loader'.format(name), + name=name) + raise ImportError('namespace packages do not have loaders', + name=name) + return spec.loader + + +def import_module(name, package=None): + """Import a module. + + The 'package' argument is required when performing a relative import. It + specifies the package to use as the anchor point from which to resolve the + relative import to an absolute import. + + """ + level = 0 + if name.startswith('.'): + if not package: + msg = ("the 'package' argument is required to perform a relative " + "import for {!r}") + raise TypeError(msg.format(name)) + for character in name: + if character != '.': + break + level += 1 + return _bootstrap._gcd_import(name[level:], package, level) + + +_RELOADING = {} + + +def reload(module): + """Reload the module and return it. + + The module must have been successfully imported before. + + """ + if not module or not isinstance(module, types.ModuleType): + raise TypeError("reload() argument must be a module") + try: + name = module.__spec__.name + except AttributeError: + name = module.__name__ + + if sys.modules.get(name) is not module: + msg = "module {} not in sys.modules" + raise ImportError(msg.format(name), name=name) + if name in _RELOADING: + return _RELOADING[name] + _RELOADING[name] = module + try: + parent_name = name.rpartition('.')[0] + if parent_name: + try: + parent = sys.modules[parent_name] + except KeyError: + msg = "parent {!r} not in sys.modules" + raise ImportError(msg.format(parent_name), + name=parent_name) from None + else: + pkgpath = parent.__path__ + else: + pkgpath = None + target = module + spec = module.__spec__ = _bootstrap._find_spec(name, pkgpath, target) + if spec is None: + raise ModuleNotFoundError(f"spec not found for the module {name!r}", name=name) + _bootstrap._exec(spec, module) + # The module may have replaced itself in sys.modules! + return sys.modules[name] + finally: + try: + del _RELOADING[name] + except KeyError: + pass diff --git a/env/Lib/importlib/__pycache__/__init__.cpython-37.pyc b/env/Lib/importlib/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..44995bcf7d32b53012a6fd7091e2e35ebb7cbe02 GIT binary patch literal 3751 zcmai0&2JmW6`$E%F3A-|Q=hSwk8a{LHq(>{kRmAxw}@@Ity@PmY`1m^1&bADB(B6S z&kk*qUS90vmH@pM1t_4GTzl)KryhGMiXQgROHck6a_aBRtSHAe(4}@X^LFOFnfKoB z_vXs-a=`HX^V{>EUpvd#e`#>?RM7bpZ+gfX6Rgby7mjd+ci^?TC<(vkv>o%`ZM&12 z>3QwaT{if@W70ng)IHAVC(5GIEB8z75@)hBuSi!q#|~$|XM<1gF;SJJs44=q!DLk~ z&1+&w)Q%mDm!NAMx|X5qE2|4@oO{qB-NU-5USfsaGwlZEepuN3*TU{H>^9mB*loaW z>6lXwnj6q_1-9$5VQe>^vwa4(8^-pgwfzUKg6~*w80+;*&~>=dUO~IsUNz@mYp+N-%y3s53H`*KUz>09cVC_w@DOSbW7rgzNculMe2feciYo8Mv!o&A1;ooM>v(pQg z!_ipD@a9B!hl4Qbk9x8%2RhaXhQoc543%!>K@{0;6y?iBuRj#yp3GO0!GpM$h*-<0 z6L-2Y&3z?%!&p3{0Pj3QP+5~h#olnJQ?26Bbls}xC3~$?X`Qo9gzzfO!YB?$vF?WZ z$v{YzhN&JZDX=sM@uZWqMROuE=i^o2hPgE!@Qy=WJmf}#wsGa((IH0)t{npR*Dhz1543yeW$YX~ zEX|zE5#CWneXM;^nwK+n%%AcneBfnpFCh1^$8-hoytx3#yO2~NK>+E8b^ggZ;XQFI zfORlm%2>vaotc|~QefdL;oWALdss80zoEBmdVkS%QMMWo=E~R36AnrBq)#gl=wSNS zTT+kJz=WF8T&i$?sLU`O$xgDLAdnUut-yryPB%$I{Kes3+&Ov}EAhk5u#ea#dp#LG z1R_RI606~OAWTL?r08Pv`Q`iLLC2sHdW0M)*#Y1vVZ#0R0n9JJN}w9+q}QUre^=3T zd;4@{nhZJ%`UUoP=~41(=9rpaopos*iTYy=ODD}q1zk8eK~!P+H@3SpJ_W(coQLn<) zJD9ydV+jL#4I10%2oB7#Iq2({tL==Z?+SP3YM!}s$SwLFy_GRTeO~4X=g3t*zR3uu zpRk#8|NXm6yK~?dlG2yXIiM_aj$L5HpZ>=l7a9Ko5M+3v2;~JN{K1&24P}dx_s0n_ zAh>Q20uB@gN{JYsdT=7bZ7HY~Ue}f+3$UdIdWF_d55qC?IJVMw(CGpkqhSIw`)b&S z{-o2TSxTnE9<+k7jk*`i(3BW#y@y!{{fTi4XhojPd29Mh;`{$|A}A`(^YURV0Nz$J zMFhIjEE!ZOojy!-H?Q8AjEbZ?htD?imZF1>D5`O@WHYH;oIWoZIOc9YJ!n@u-B`sP zl*bnmOA&zkc++(>tU_tyanGrn)S=YsP#L6$_?zm6$(kFGW=u6STFnogr%rlSyC{g@ z=}9ePhaPyGgR8f|%ycdLnPp~tDbIMp$CbnCJOCf_j2%_gzHnxaUdo(#&B!<^19&&% zdils#5A<@z&oQtyquwPp{d30Wb>SW3T6m5TqpN>U>KZyT7h?~$aV6AeVEZ4|w(uAF zUD$LYK?85AJ63}jcN>vLNJK7CaZ`=J?FW^F022QHe&Mk9OG8t@< zf}|73O;ceKy{G`P08-c=rv>}%NgyR1cRDgn_s6~7q{vZ#Xiow@vRFKQ$6m*93t1q} zXxRfy3boTW3hN+aqF0m^a|bb3ytK(pnyK^11e5yHw??rdGoOWw@zl6)9 z>@+L6Z#QlC(8T=ql0AMz8_9h;XqQJv2c$XoHT;YXy-oTFJ*S+m=u-40-t-C@<~P98 z1h_h{ISqht6=V82hS#Yjeh-N09YBvM9Hl?QO!$(IIw!Rwc>vQ%>`mEe4^;ko|< DZ9E3T literal 0 HcmV?d00001 diff --git a/env/Lib/importlib/__pycache__/abc.cpython-37.pyc b/env/Lib/importlib/__pycache__/abc.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..14e28543aeaabe885d70ecfa45ef2e51bb445508 GIT binary patch literal 13506 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 literal 0 HcmV?d00001 diff --git a/env/Lib/importlib/__pycache__/machinery.cpython-37.pyc b/env/Lib/importlib/__pycache__/machinery.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..dad698fe81d849d1bf6635c04067c884cd707819 GIT binary patch literal 991 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 0 + self.count -= 1 + if self.count == 0: + self.owner = None + if self.waiters: + self.waiters -= 1 + self.wakeup.release() + + def __repr__(self): + return '_ModuleLock({!r}) at {}'.format(self.name, id(self)) + + +class _DummyModuleLock: + """A simple _ModuleLock equivalent for Python builds without + multi-threading support.""" + + def __init__(self, name): + self.name = name + self.count = 0 + + def acquire(self): + self.count += 1 + return True + + def release(self): + if self.count == 0: + raise RuntimeError('cannot release un-acquired lock') + self.count -= 1 + + def __repr__(self): + return '_DummyModuleLock({!r}) at {}'.format(self.name, id(self)) + + +class _ModuleLockManager: + + def __init__(self, name): + self._name = name + self._lock = None + + def __enter__(self): + self._lock = _get_module_lock(self._name) + self._lock.acquire() + + def __exit__(self, *args, **kwargs): + self._lock.release() + + +# The following two functions are for consumption by Python/import.c. + +def _get_module_lock(name): + """Get or create the module lock for a given module name. + + Acquire/release internally the global import lock to protect + _module_locks.""" + + _imp.acquire_lock() + try: + try: + lock = _module_locks[name]() + except KeyError: + lock = None + + if lock is None: + if _thread is None: + lock = _DummyModuleLock(name) + else: + lock = _ModuleLock(name) + + def cb(ref, name=name): + _imp.acquire_lock() + try: + # bpo-31070: Check if another thread created a new lock + # after the previous lock was destroyed + # but before the weakref callback was called. + if _module_locks.get(name) is ref: + del _module_locks[name] + finally: + _imp.release_lock() + + _module_locks[name] = _weakref.ref(lock, cb) + finally: + _imp.release_lock() + + return lock + + +def _lock_unlock_module(name): + """Acquires then releases the module lock for a given module name. + + This is used to ensure a module is completely initialized, in the + event it is being imported by another thread. + """ + lock = _get_module_lock(name) + try: + lock.acquire() + except _DeadlockError: + # Concurrent circular import, we'll accept a partially initialized + # module object. + pass + else: + lock.release() + +# Frame stripping magic ############################################### +def _call_with_frames_removed(f, *args, **kwds): + """remove_importlib_frames in import.c will always remove sequences + of importlib frames that end with a call to this function + + Use it instead of a normal call in places where including the importlib + frames introduces unwanted noise into the traceback (e.g. when executing + module code) + """ + return f(*args, **kwds) + + +def _verbose_message(message, *args, verbosity=1): + """Print the message to stderr if -v/PYTHONVERBOSE is turned on.""" + if sys.flags.verbose >= verbosity: + if not message.startswith(('#', 'import ')): + message = '# ' + message + print(message.format(*args), file=sys.stderr) + + +def _requires_builtin(fxn): + """Decorator to verify the named module is built-in.""" + def _requires_builtin_wrapper(self, fullname): + if fullname not in sys.builtin_module_names: + raise ImportError('{!r} is not a built-in module'.format(fullname), + name=fullname) + return fxn(self, fullname) + _wrap(_requires_builtin_wrapper, fxn) + return _requires_builtin_wrapper + + +def _requires_frozen(fxn): + """Decorator to verify the named module is frozen.""" + def _requires_frozen_wrapper(self, fullname): + if not _imp.is_frozen(fullname): + raise ImportError('{!r} is not a frozen module'.format(fullname), + name=fullname) + return fxn(self, fullname) + _wrap(_requires_frozen_wrapper, fxn) + return _requires_frozen_wrapper + + +# Typically used by loader classes as a method replacement. +def _load_module_shim(self, fullname): + """Load the specified module into sys.modules and return it. + + This method is deprecated. Use loader.exec_module instead. + + """ + spec = spec_from_loader(fullname, self) + if fullname in sys.modules: + module = sys.modules[fullname] + _exec(spec, module) + return sys.modules[fullname] + else: + return _load(spec) + +# Module specifications ####################################################### + +def _module_repr(module): + # The implementation of ModuleType.__repr__(). + loader = getattr(module, '__loader__', None) + if hasattr(loader, 'module_repr'): + # As soon as BuiltinImporter, FrozenImporter, and NamespaceLoader + # drop their implementations for module_repr. we can add a + # deprecation warning here. + try: + return loader.module_repr(module) + except Exception: + pass + try: + spec = module.__spec__ + except AttributeError: + pass + else: + if spec is not None: + return _module_repr_from_spec(spec) + + # We could use module.__class__.__name__ instead of 'module' in the + # various repr permutations. + try: + name = module.__name__ + except AttributeError: + name = '?' + try: + filename = module.__file__ + except AttributeError: + if loader is None: + return ''.format(name) + else: + return ''.format(name, loader) + else: + return ''.format(name, filename) + + +class _installed_safely: + + def __init__(self, module): + self._module = module + self._spec = module.__spec__ + + def __enter__(self): + # This must be done before putting the module in sys.modules + # (otherwise an optimization shortcut in import.c becomes + # wrong) + self._spec._initializing = True + sys.modules[self._spec.name] = self._module + + def __exit__(self, *args): + try: + spec = self._spec + if any(arg is not None for arg in args): + try: + del sys.modules[spec.name] + except KeyError: + pass + else: + _verbose_message('import {!r} # {!r}', spec.name, spec.loader) + finally: + self._spec._initializing = False + + +class ModuleSpec: + """The specification for a module, used for loading. + + A module's spec is the source for information about the module. For + data associated with the module, including source, use the spec's + loader. + + `name` is the absolute name of the module. `loader` is the loader + to use when loading the module. `parent` is the name of the + package the module is in. The parent is derived from the name. + + `is_package` determines if the module is considered a package or + not. On modules this is reflected by the `__path__` attribute. + + `origin` is the specific location used by the loader from which to + load the module, if that information is available. When filename is + set, origin will match. + + `has_location` indicates that a spec's "origin" reflects a location. + When this is True, `__file__` attribute of the module is set. + + `cached` is the location of the cached bytecode file, if any. It + corresponds to the `__cached__` attribute. + + `submodule_search_locations` is the sequence of path entries to + search when importing submodules. If set, is_package should be + True--and False otherwise. + + Packages are simply modules that (may) have submodules. If a spec + has a non-None value in `submodule_search_locations`, the import + system will consider modules loaded from the spec as packages. + + Only finders (see importlib.abc.MetaPathFinder and + importlib.abc.PathEntryFinder) should modify ModuleSpec instances. + + """ + + def __init__(self, name, loader, *, origin=None, loader_state=None, + is_package=None): + self.name = name + self.loader = loader + self.origin = origin + self.loader_state = loader_state + self.submodule_search_locations = [] if is_package else None + + # file-location attributes + self._set_fileattr = False + self._cached = None + + def __repr__(self): + args = ['name={!r}'.format(self.name), + 'loader={!r}'.format(self.loader)] + if self.origin is not None: + args.append('origin={!r}'.format(self.origin)) + if self.submodule_search_locations is not None: + args.append('submodule_search_locations={}' + .format(self.submodule_search_locations)) + return '{}({})'.format(self.__class__.__name__, ', '.join(args)) + + def __eq__(self, other): + smsl = self.submodule_search_locations + try: + return (self.name == other.name and + self.loader == other.loader and + self.origin == other.origin and + smsl == other.submodule_search_locations and + self.cached == other.cached and + self.has_location == other.has_location) + except AttributeError: + return False + + @property + def cached(self): + if self._cached is None: + if self.origin is not None and self._set_fileattr: + if _bootstrap_external is None: + raise NotImplementedError + self._cached = _bootstrap_external._get_cached(self.origin) + return self._cached + + @cached.setter + def cached(self, cached): + self._cached = cached + + @property + def parent(self): + """The name of the module's parent.""" + if self.submodule_search_locations is None: + return self.name.rpartition('.')[0] + else: + return self.name + + @property + def has_location(self): + return self._set_fileattr + + @has_location.setter + def has_location(self, value): + self._set_fileattr = bool(value) + + +def spec_from_loader(name, loader, *, origin=None, is_package=None): + """Return a module spec based on various loader methods.""" + if hasattr(loader, 'get_filename'): + if _bootstrap_external is None: + raise NotImplementedError + spec_from_file_location = _bootstrap_external.spec_from_file_location + + if is_package is None: + return spec_from_file_location(name, loader=loader) + search = [] if is_package else None + return spec_from_file_location(name, loader=loader, + submodule_search_locations=search) + + if is_package is None: + if hasattr(loader, 'is_package'): + try: + is_package = loader.is_package(name) + except ImportError: + is_package = None # aka, undefined + else: + # the default + is_package = False + + return ModuleSpec(name, loader, origin=origin, is_package=is_package) + + +def _spec_from_module(module, loader=None, origin=None): + # This function is meant for use in _setup(). + try: + spec = module.__spec__ + except AttributeError: + pass + else: + if spec is not None: + return spec + + name = module.__name__ + if loader is None: + try: + loader = module.__loader__ + except AttributeError: + # loader will stay None. + pass + try: + location = module.__file__ + except AttributeError: + location = None + if origin is None: + if location is None: + try: + origin = loader._ORIGIN + except AttributeError: + origin = None + else: + origin = location + try: + cached = module.__cached__ + except AttributeError: + cached = None + try: + submodule_search_locations = list(module.__path__) + except AttributeError: + submodule_search_locations = None + + spec = ModuleSpec(name, loader, origin=origin) + spec._set_fileattr = False if location is None else True + spec.cached = cached + spec.submodule_search_locations = submodule_search_locations + return spec + + +def _init_module_attrs(spec, module, *, override=False): + # The passed-in module may be not support attribute assignment, + # in which case we simply don't set the attributes. + # __name__ + if (override or getattr(module, '__name__', None) is None): + try: + module.__name__ = spec.name + except AttributeError: + pass + # __loader__ + if override or getattr(module, '__loader__', None) is None: + loader = spec.loader + if loader is None: + # A backward compatibility hack. + if spec.submodule_search_locations is not None: + if _bootstrap_external is None: + raise NotImplementedError + _NamespaceLoader = _bootstrap_external._NamespaceLoader + + loader = _NamespaceLoader.__new__(_NamespaceLoader) + loader._path = spec.submodule_search_locations + spec.loader = loader + # While the docs say that module.__file__ is not set for + # built-in modules, and the code below will avoid setting it if + # spec.has_location is false, this is incorrect for namespace + # packages. Namespace packages have no location, but their + # __spec__.origin is None, and thus their module.__file__ + # should also be None for consistency. While a bit of a hack, + # this is the best place to ensure this consistency. + # + # See # https://docs.python.org/3/library/importlib.html#importlib.abc.Loader.load_module + # and bpo-32305 + module.__file__ = None + try: + module.__loader__ = loader + except AttributeError: + pass + # __package__ + if override or getattr(module, '__package__', None) is None: + try: + module.__package__ = spec.parent + except AttributeError: + pass + # __spec__ + try: + module.__spec__ = spec + except AttributeError: + pass + # __path__ + if override or getattr(module, '__path__', None) is None: + if spec.submodule_search_locations is not None: + try: + module.__path__ = spec.submodule_search_locations + except AttributeError: + pass + # __file__/__cached__ + if spec.has_location: + if override or getattr(module, '__file__', None) is None: + try: + module.__file__ = spec.origin + except AttributeError: + pass + + if override or getattr(module, '__cached__', None) is None: + if spec.cached is not None: + try: + module.__cached__ = spec.cached + except AttributeError: + pass + return module + + +def module_from_spec(spec): + """Create a module based on the provided spec.""" + # Typically loaders will not implement create_module(). + module = None + if hasattr(spec.loader, 'create_module'): + # If create_module() returns `None` then it means default + # module creation should be used. + module = spec.loader.create_module(spec) + elif hasattr(spec.loader, 'exec_module'): + raise ImportError('loaders that define exec_module() ' + 'must also define create_module()') + if module is None: + module = _new_module(spec.name) + _init_module_attrs(spec, module) + return module + + +def _module_repr_from_spec(spec): + """Return the repr to use for the module.""" + # We mostly replicate _module_repr() using the spec attributes. + name = '?' if spec.name is None else spec.name + if spec.origin is None: + if spec.loader is None: + return ''.format(name) + else: + return ''.format(name, spec.loader) + else: + if spec.has_location: + return ''.format(name, spec.origin) + else: + return ''.format(spec.name, spec.origin) + + +# Used by importlib.reload() and _load_module_shim(). +def _exec(spec, module): + """Execute the spec's specified module in an existing module's namespace.""" + name = spec.name + with _ModuleLockManager(name): + if sys.modules.get(name) is not module: + msg = 'module {!r} not in sys.modules'.format(name) + raise ImportError(msg, name=name) + if spec.loader is None: + if spec.submodule_search_locations is None: + raise ImportError('missing loader', name=spec.name) + # namespace package + _init_module_attrs(spec, module, override=True) + return module + _init_module_attrs(spec, module, override=True) + if not hasattr(spec.loader, 'exec_module'): + # (issue19713) Once BuiltinImporter and ExtensionFileLoader + # have exec_module() implemented, we can add a deprecation + # warning here. + spec.loader.load_module(name) + else: + spec.loader.exec_module(module) + return sys.modules[name] + + +def _load_backward_compatible(spec): + # (issue19713) Once BuiltinImporter and ExtensionFileLoader + # have exec_module() implemented, we can add a deprecation + # warning here. + spec.loader.load_module(spec.name) + # The module must be in sys.modules at this point! + module = sys.modules[spec.name] + if getattr(module, '__loader__', None) is None: + try: + module.__loader__ = spec.loader + except AttributeError: + pass + if getattr(module, '__package__', None) is None: + try: + # Since module.__path__ may not line up with + # spec.submodule_search_paths, we can't necessarily rely + # on spec.parent here. + module.__package__ = module.__name__ + if not hasattr(module, '__path__'): + module.__package__ = spec.name.rpartition('.')[0] + except AttributeError: + pass + if getattr(module, '__spec__', None) is None: + try: + module.__spec__ = spec + except AttributeError: + pass + return module + +def _load_unlocked(spec): + # A helper for direct use by the import system. + if spec.loader is not None: + # not a namespace package + if not hasattr(spec.loader, 'exec_module'): + return _load_backward_compatible(spec) + + module = module_from_spec(spec) + with _installed_safely(module): + if spec.loader is None: + if spec.submodule_search_locations is None: + raise ImportError('missing loader', name=spec.name) + # A namespace package so do nothing. + else: + spec.loader.exec_module(module) + + # We don't ensure that the import-related module attributes get + # set in the sys.modules replacement case. Such modules are on + # their own. + return sys.modules[spec.name] + +# A method used during testing of _load_unlocked() and by +# _load_module_shim(). +def _load(spec): + """Return a new module object, loaded by the spec's loader. + + The module is not added to its parent. + + If a module is already in sys.modules, that existing module gets + clobbered. + + """ + with _ModuleLockManager(spec.name): + return _load_unlocked(spec) + + +# Loaders ##################################################################### + +class BuiltinImporter: + + """Meta path import for built-in modules. + + All methods are either class or static methods to avoid the need to + instantiate the class. + + """ + + @staticmethod + def module_repr(module): + """Return repr for the module. + + The method is deprecated. The import machinery does the job itself. + + """ + return ''.format(module.__name__) + + @classmethod + def find_spec(cls, fullname, path=None, target=None): + if path is not None: + return None + if _imp.is_builtin(fullname): + return spec_from_loader(fullname, cls, origin='built-in') + else: + return None + + @classmethod + def find_module(cls, fullname, path=None): + """Find the built-in module. + + If 'path' is ever specified then the search is considered a failure. + + This method is deprecated. Use find_spec() instead. + + """ + spec = cls.find_spec(fullname, path) + return spec.loader if spec is not None else None + + @classmethod + def create_module(self, spec): + """Create a built-in module""" + if spec.name not in sys.builtin_module_names: + raise ImportError('{!r} is not a built-in module'.format(spec.name), + name=spec.name) + return _call_with_frames_removed(_imp.create_builtin, spec) + + @classmethod + def exec_module(self, module): + """Exec a built-in module""" + _call_with_frames_removed(_imp.exec_builtin, module) + + @classmethod + @_requires_builtin + def get_code(cls, fullname): + """Return None as built-in modules do not have code objects.""" + return None + + @classmethod + @_requires_builtin + def get_source(cls, fullname): + """Return None as built-in modules do not have source code.""" + return None + + @classmethod + @_requires_builtin + def is_package(cls, fullname): + """Return False as built-in modules are never packages.""" + return False + + load_module = classmethod(_load_module_shim) + + +class FrozenImporter: + + """Meta path import for frozen modules. + + All methods are either class or static methods to avoid the need to + instantiate the class. + + """ + + @staticmethod + def module_repr(m): + """Return repr for the module. + + The method is deprecated. The import machinery does the job itself. + + """ + return ''.format(m.__name__) + + @classmethod + def find_spec(cls, fullname, path=None, target=None): + if _imp.is_frozen(fullname): + return spec_from_loader(fullname, cls, origin='frozen') + else: + return None + + @classmethod + def find_module(cls, fullname, path=None): + """Find a frozen module. + + This method is deprecated. Use find_spec() instead. + + """ + return cls if _imp.is_frozen(fullname) else None + + @classmethod + def create_module(cls, spec): + """Use default semantics for module creation.""" + + @staticmethod + def exec_module(module): + name = module.__spec__.name + if not _imp.is_frozen(name): + raise ImportError('{!r} is not a frozen module'.format(name), + name=name) + code = _call_with_frames_removed(_imp.get_frozen_object, name) + exec(code, module.__dict__) + + @classmethod + def load_module(cls, fullname): + """Load a frozen module. + + This method is deprecated. Use exec_module() instead. + + """ + return _load_module_shim(cls, fullname) + + @classmethod + @_requires_frozen + def get_code(cls, fullname): + """Return the code object for the frozen module.""" + return _imp.get_frozen_object(fullname) + + @classmethod + @_requires_frozen + def get_source(cls, fullname): + """Return None as frozen modules do not have source code.""" + return None + + @classmethod + @_requires_frozen + def is_package(cls, fullname): + """Return True if the frozen module is a package.""" + return _imp.is_frozen_package(fullname) + + +# Import itself ############################################################### + +class _ImportLockContext: + + """Context manager for the import lock.""" + + def __enter__(self): + """Acquire the import lock.""" + _imp.acquire_lock() + + def __exit__(self, exc_type, exc_value, exc_traceback): + """Release the import lock regardless of any raised exceptions.""" + _imp.release_lock() + + +def _resolve_name(name, package, level): + """Resolve a relative module name to an absolute one.""" + bits = package.rsplit('.', level - 1) + if len(bits) < level: + raise ValueError('attempted relative import beyond top-level package') + base = bits[0] + return '{}.{}'.format(base, name) if name else base + + +def _find_spec_legacy(finder, name, path): + # This would be a good place for a DeprecationWarning if + # we ended up going that route. + loader = finder.find_module(name, path) + if loader is None: + return None + return spec_from_loader(name, loader) + + +def _find_spec(name, path, target=None): + """Find a module's spec.""" + meta_path = sys.meta_path + if meta_path is None: + # PyImport_Cleanup() is running or has been called. + raise ImportError("sys.meta_path is None, Python is likely " + "shutting down") + + if not meta_path: + _warnings.warn('sys.meta_path is empty', ImportWarning) + + # We check sys.modules here for the reload case. While a passed-in + # target will usually indicate a reload there is no guarantee, whereas + # sys.modules provides one. + is_reload = name in sys.modules + for finder in meta_path: + with _ImportLockContext(): + try: + find_spec = finder.find_spec + except AttributeError: + spec = _find_spec_legacy(finder, name, path) + if spec is None: + continue + else: + spec = find_spec(name, path, target) + if spec is not None: + # The parent import may have already imported this module. + if not is_reload and name in sys.modules: + module = sys.modules[name] + try: + __spec__ = module.__spec__ + except AttributeError: + # We use the found spec since that is the one that + # we would have used if the parent module hadn't + # beaten us to the punch. + return spec + else: + if __spec__ is None: + return spec + else: + return __spec__ + else: + return spec + else: + return None + + +def _sanity_check(name, package, level): + """Verify arguments are "sane".""" + if not isinstance(name, str): + raise TypeError('module name must be str, not {}'.format(type(name))) + if level < 0: + raise ValueError('level must be >= 0') + if level > 0: + if not isinstance(package, str): + raise TypeError('__package__ not set to a string') + elif not package: + raise ImportError('attempted relative import with no known parent ' + 'package') + if not name and level == 0: + raise ValueError('Empty module name') + + +_ERR_MSG_PREFIX = 'No module named ' +_ERR_MSG = _ERR_MSG_PREFIX + '{!r}' + +def _find_and_load_unlocked(name, import_): + path = None + parent = name.rpartition('.')[0] + if parent: + if parent not in sys.modules: + _call_with_frames_removed(import_, parent) + # Crazy side-effects! + if name in sys.modules: + return sys.modules[name] + parent_module = sys.modules[parent] + try: + path = parent_module.__path__ + except AttributeError: + msg = (_ERR_MSG + '; {!r} is not a package').format(name, parent) + raise ModuleNotFoundError(msg, name=name) from None + spec = _find_spec(name, path) + if spec is None: + raise ModuleNotFoundError(_ERR_MSG.format(name), name=name) + else: + module = _load_unlocked(spec) + if parent: + # Set the module as an attribute on its parent. + parent_module = sys.modules[parent] + setattr(parent_module, name.rpartition('.')[2], module) + return module + + +_NEEDS_LOADING = object() + + +def _find_and_load(name, import_): + """Find and load the module.""" + with _ModuleLockManager(name): + module = sys.modules.get(name, _NEEDS_LOADING) + if module is _NEEDS_LOADING: + return _find_and_load_unlocked(name, import_) + + if module is None: + message = ('import of {} halted; ' + 'None in sys.modules'.format(name)) + raise ModuleNotFoundError(message, name=name) + + _lock_unlock_module(name) + return module + + +def _gcd_import(name, package=None, level=0): + """Import and return the module based on its name, the package the call is + being made from, and the level adjustment. + + This function represents the greatest common denominator of functionality + between import_module and __import__. This includes setting __package__ if + the loader did not. + + """ + _sanity_check(name, package, level) + if level > 0: + name = _resolve_name(name, package, level) + return _find_and_load(name, _gcd_import) + + +def _handle_fromlist(module, fromlist, import_, *, recursive=False): + """Figure out what __import__ should return. + + The import_ parameter is a callable which takes the name of module to + import. It is required to decouple the function from assuming importlib's + import implementation is desired. + + """ + # The hell that is fromlist ... + # If a package was imported, try to import stuff from fromlist. + if hasattr(module, '__path__'): + for x in fromlist: + if not isinstance(x, str): + if recursive: + where = module.__name__ + '.__all__' + else: + where = "``from list''" + raise TypeError(f"Item in {where} must be str, " + f"not {type(x).__name__}") + elif x == '*': + if not recursive and hasattr(module, '__all__'): + _handle_fromlist(module, module.__all__, import_, + recursive=True) + elif not hasattr(module, x): + from_name = '{}.{}'.format(module.__name__, x) + try: + _call_with_frames_removed(import_, from_name) + except ModuleNotFoundError as exc: + # Backwards-compatibility dictates we ignore failed + # imports triggered by fromlist for modules that don't + # exist. + if (exc.name == from_name and + sys.modules.get(from_name, _NEEDS_LOADING) is not None): + continue + raise + return module + + +def _calc___package__(globals): + """Calculate what __package__ should be. + + __package__ is not guaranteed to be defined or could be set to None + to represent that its proper value is unknown. + + """ + package = globals.get('__package__') + spec = globals.get('__spec__') + if package is not None: + if spec is not None and package != spec.parent: + _warnings.warn("__package__ != __spec__.parent " + f"({package!r} != {spec.parent!r})", + ImportWarning, stacklevel=3) + return package + elif spec is not None: + return spec.parent + else: + _warnings.warn("can't resolve package from __spec__ or __package__, " + "falling back on __name__ and __path__", + ImportWarning, stacklevel=3) + package = globals['__name__'] + if '__path__' not in globals: + package = package.rpartition('.')[0] + return package + + +def __import__(name, globals=None, locals=None, fromlist=(), level=0): + """Import a module. + + The 'globals' argument is used to infer where the import is occurring from + to handle relative imports. The 'locals' argument is ignored. The + 'fromlist' argument specifies what should exist as attributes on the module + being imported (e.g. ``from module import ``). The 'level' + argument represents the package location to import from in a relative + import (e.g. ``from ..pkg import mod`` would have a 'level' of 2). + + """ + if level == 0: + module = _gcd_import(name) + else: + globals_ = globals if globals is not None else {} + package = _calc___package__(globals_) + module = _gcd_import(name, package, level) + if not fromlist: + # Return up to the first dot in 'name'. This is complicated by the fact + # that 'name' may be relative. + if level == 0: + return _gcd_import(name.partition('.')[0]) + elif not name: + return module + else: + # Figure out where to slice the module's name up to the first dot + # in 'name'. + cut_off = len(name) - len(name.partition('.')[0]) + # Slice end needs to be positive to alleviate need to special-case + # when ``'.' not in name``. + return sys.modules[module.__name__[:len(module.__name__)-cut_off]] + else: + return _handle_fromlist(module, fromlist, _gcd_import) + + +def _builtin_from_name(name): + spec = BuiltinImporter.find_spec(name) + if spec is None: + raise ImportError('no built-in module named ' + name) + return _load_unlocked(spec) + + +def _setup(sys_module, _imp_module): + """Setup importlib by importing needed built-in modules and injecting them + into the global namespace. + + As sys is needed for sys.modules access and _imp is needed to load built-in + modules, those two modules must be explicitly passed in. + + """ + global _imp, sys + _imp = _imp_module + sys = sys_module + + # Set up the spec for existing builtin/frozen modules. + module_type = type(sys) + for name, module in sys.modules.items(): + if isinstance(module, module_type): + if name in sys.builtin_module_names: + loader = BuiltinImporter + elif _imp.is_frozen(name): + loader = FrozenImporter + else: + continue + spec = _spec_from_module(module, loader) + _init_module_attrs(spec, module) + + # Directly load built-in modules needed during bootstrap. + self_module = sys.modules[__name__] + for builtin_name in ('_thread', '_warnings', '_weakref'): + if builtin_name not in sys.modules: + builtin_module = _builtin_from_name(builtin_name) + else: + builtin_module = sys.modules[builtin_name] + setattr(self_module, builtin_name, builtin_module) + + +def _install(sys_module, _imp_module): + """Install importers for builtin and frozen modules""" + _setup(sys_module, _imp_module) + + sys.meta_path.append(BuiltinImporter) + sys.meta_path.append(FrozenImporter) + + +def _install_external_importers(): + """Install importers that require external filesystem access""" + global _bootstrap_external + import _frozen_importlib_external + _bootstrap_external = _frozen_importlib_external + _frozen_importlib_external._install(sys.modules[__name__]) diff --git a/env/Lib/importlib/_bootstrap_external.py b/env/Lib/importlib/_bootstrap_external.py new file mode 100644 index 0000000..53b24ff --- /dev/null +++ b/env/Lib/importlib/_bootstrap_external.py @@ -0,0 +1,1562 @@ +"""Core implementation of path-based import. + +This module is NOT meant to be directly imported! It has been designed such +that it can be bootstrapped into Python as the implementation of import. As +such it requires the injection of specific modules and attributes in order to +work. One should use importlib as the public-facing version of this module. + +""" +# IMPORTANT: Whenever making changes to this module, be sure to run a top-level +# `make regen-importlib` followed by `make` in order to get the frozen version +# of the module updated. Not doing so will result in the Makefile to fail for +# all others who don't have a ./python around to freeze the module in the early +# stages of compilation. +# + +# See importlib._setup() for what is injected into the global namespace. + +# When editing this code be aware that code executed at import time CANNOT +# reference any injected objects! This includes not only global code but also +# anything specified at the class level. + +# Bootstrap-related code ###################################################### +_CASE_INSENSITIVE_PLATFORMS_STR_KEY = 'win', +_CASE_INSENSITIVE_PLATFORMS_BYTES_KEY = 'cygwin', 'darwin' +_CASE_INSENSITIVE_PLATFORMS = (_CASE_INSENSITIVE_PLATFORMS_BYTES_KEY + + _CASE_INSENSITIVE_PLATFORMS_STR_KEY) + + +def _make_relax_case(): + if sys.platform.startswith(_CASE_INSENSITIVE_PLATFORMS): + if sys.platform.startswith(_CASE_INSENSITIVE_PLATFORMS_STR_KEY): + key = 'PYTHONCASEOK' + else: + key = b'PYTHONCASEOK' + + def _relax_case(): + """True if filenames must be checked case-insensitively.""" + return key in _os.environ + else: + def _relax_case(): + """True if filenames must be checked case-insensitively.""" + return False + return _relax_case + + +def _w_long(x): + """Convert a 32-bit integer to little-endian.""" + return (int(x) & 0xFFFFFFFF).to_bytes(4, 'little') + + +def _r_long(int_bytes): + """Convert 4 bytes in little-endian to an integer.""" + return int.from_bytes(int_bytes, 'little') + + +def _path_join(*path_parts): + """Replacement for os.path.join().""" + return path_sep.join([part.rstrip(path_separators) + for part in path_parts if part]) + + +def _path_split(path): + """Replacement for os.path.split().""" + if len(path_separators) == 1: + front, _, tail = path.rpartition(path_sep) + return front, tail + for x in reversed(path): + if x in path_separators: + front, tail = path.rsplit(x, maxsplit=1) + return front, tail + return '', path + + +def _path_stat(path): + """Stat the path. + + Made a separate function to make it easier to override in experiments + (e.g. cache stat results). + + """ + return _os.stat(path) + + +def _path_is_mode_type(path, mode): + """Test whether the path is the specified mode type.""" + try: + stat_info = _path_stat(path) + except OSError: + return False + return (stat_info.st_mode & 0o170000) == mode + + +def _path_isfile(path): + """Replacement for os.path.isfile.""" + return _path_is_mode_type(path, 0o100000) + + +def _path_isdir(path): + """Replacement for os.path.isdir.""" + if not path: + path = _os.getcwd() + return _path_is_mode_type(path, 0o040000) + + +def _write_atomic(path, data, mode=0o666): + """Best-effort function to write data to a path atomically. + Be prepared to handle a FileExistsError if concurrent writing of the + temporary file is attempted.""" + # id() is used to generate a pseudo-random filename. + path_tmp = '{}.{}'.format(path, id(path)) + fd = _os.open(path_tmp, + _os.O_EXCL | _os.O_CREAT | _os.O_WRONLY, mode & 0o666) + try: + # We first write data to a temporary file, and then use os.replace() to + # perform an atomic rename. + with _io.FileIO(fd, 'wb') as file: + file.write(data) + _os.replace(path_tmp, path) + except OSError: + try: + _os.unlink(path_tmp) + except OSError: + pass + raise + + +_code_type = type(_write_atomic.__code__) + + +# Finder/loader utility code ############################################### + +# Magic word to reject .pyc files generated by other Python versions. +# It should change for each incompatible change to the bytecode. +# +# The value of CR and LF is incorporated so if you ever read or write +# a .pyc file in text mode the magic number will be wrong; also, the +# Apple MPW compiler swaps their values, botching string constants. +# +# There were a variety of old schemes for setting the magic number. +# The current working scheme is to increment the previous value by +# 10. +# +# Starting with the adoption of PEP 3147 in Python 3.2, every bump in magic +# number also includes a new "magic tag", i.e. a human readable string used +# to represent the magic number in __pycache__ directories. When you change +# the magic number, you must also set a new unique magic tag. Generally this +# can be named after the Python major version of the magic number bump, but +# it can really be anything, as long as it's different than anything else +# that's come before. The tags are included in the following table, starting +# with Python 3.2a0. +# +# Known values: +# Python 1.5: 20121 +# Python 1.5.1: 20121 +# Python 1.5.2: 20121 +# Python 1.6: 50428 +# Python 2.0: 50823 +# Python 2.0.1: 50823 +# Python 2.1: 60202 +# Python 2.1.1: 60202 +# Python 2.1.2: 60202 +# Python 2.2: 60717 +# Python 2.3a0: 62011 +# Python 2.3a0: 62021 +# Python 2.3a0: 62011 (!) +# Python 2.4a0: 62041 +# Python 2.4a3: 62051 +# Python 2.4b1: 62061 +# Python 2.5a0: 62071 +# Python 2.5a0: 62081 (ast-branch) +# Python 2.5a0: 62091 (with) +# Python 2.5a0: 62092 (changed WITH_CLEANUP opcode) +# Python 2.5b3: 62101 (fix wrong code: for x, in ...) +# Python 2.5b3: 62111 (fix wrong code: x += yield) +# Python 2.5c1: 62121 (fix wrong lnotab with for loops and +# storing constants that should have been removed) +# Python 2.5c2: 62131 (fix wrong code: for x, in ... in listcomp/genexp) +# Python 2.6a0: 62151 (peephole optimizations and STORE_MAP opcode) +# Python 2.6a1: 62161 (WITH_CLEANUP optimization) +# Python 2.7a0: 62171 (optimize list comprehensions/change LIST_APPEND) +# Python 2.7a0: 62181 (optimize conditional branches: +# introduce POP_JUMP_IF_FALSE and POP_JUMP_IF_TRUE) +# Python 2.7a0 62191 (introduce SETUP_WITH) +# Python 2.7a0 62201 (introduce BUILD_SET) +# Python 2.7a0 62211 (introduce MAP_ADD and SET_ADD) +# Python 3000: 3000 +# 3010 (removed UNARY_CONVERT) +# 3020 (added BUILD_SET) +# 3030 (added keyword-only parameters) +# 3040 (added signature annotations) +# 3050 (print becomes a function) +# 3060 (PEP 3115 metaclass syntax) +# 3061 (string literals become unicode) +# 3071 (PEP 3109 raise changes) +# 3081 (PEP 3137 make __file__ and __name__ unicode) +# 3091 (kill str8 interning) +# 3101 (merge from 2.6a0, see 62151) +# 3103 (__file__ points to source file) +# Python 3.0a4: 3111 (WITH_CLEANUP optimization). +# Python 3.0b1: 3131 (lexical exception stacking, including POP_EXCEPT + #3021) +# Python 3.1a1: 3141 (optimize list, set and dict comprehensions: +# change LIST_APPEND and SET_ADD, add MAP_ADD #2183) +# Python 3.1a1: 3151 (optimize conditional branches: +# introduce POP_JUMP_IF_FALSE and POP_JUMP_IF_TRUE + #4715) +# Python 3.2a1: 3160 (add SETUP_WITH #6101) +# tag: cpython-32 +# Python 3.2a2: 3170 (add DUP_TOP_TWO, remove DUP_TOPX and ROT_FOUR #9225) +# tag: cpython-32 +# Python 3.2a3 3180 (add DELETE_DEREF #4617) +# Python 3.3a1 3190 (__class__ super closure changed) +# Python 3.3a1 3200 (PEP 3155 __qualname__ added #13448) +# Python 3.3a1 3210 (added size modulo 2**32 to the pyc header #13645) +# Python 3.3a2 3220 (changed PEP 380 implementation #14230) +# Python 3.3a4 3230 (revert changes to implicit __class__ closure #14857) +# Python 3.4a1 3250 (evaluate positional default arguments before +# keyword-only defaults #16967) +# Python 3.4a1 3260 (add LOAD_CLASSDEREF; allow locals of class to override +# free vars #17853) +# Python 3.4a1 3270 (various tweaks to the __class__ closure #12370) +# Python 3.4a1 3280 (remove implicit class argument) +# Python 3.4a4 3290 (changes to __qualname__ computation #19301) +# Python 3.4a4 3300 (more changes to __qualname__ computation #19301) +# Python 3.4rc2 3310 (alter __qualname__ computation #20625) +# Python 3.5a1 3320 (PEP 465: Matrix multiplication operator #21176) +# Python 3.5b1 3330 (PEP 448: Additional Unpacking Generalizations #2292) +# Python 3.5b2 3340 (fix dictionary display evaluation order #11205) +# Python 3.5b3 3350 (add GET_YIELD_FROM_ITER opcode #24400) +# Python 3.5.2 3351 (fix BUILD_MAP_UNPACK_WITH_CALL opcode #27286) +# Python 3.6a0 3360 (add FORMAT_VALUE opcode #25483) +# Python 3.6a1 3361 (lineno delta of code.co_lnotab becomes signed #26107) +# Python 3.6a2 3370 (16 bit wordcode #26647) +# Python 3.6a2 3371 (add BUILD_CONST_KEY_MAP opcode #27140) +# Python 3.6a2 3372 (MAKE_FUNCTION simplification, remove MAKE_CLOSURE +# #27095) +# Python 3.6b1 3373 (add BUILD_STRING opcode #27078) +# Python 3.6b1 3375 (add SETUP_ANNOTATIONS and STORE_ANNOTATION opcodes +# #27985) +# Python 3.6b1 3376 (simplify CALL_FUNCTIONs & BUILD_MAP_UNPACK_WITH_CALL + #27213) +# Python 3.6b1 3377 (set __class__ cell from type.__new__ #23722) +# Python 3.6b2 3378 (add BUILD_TUPLE_UNPACK_WITH_CALL #28257) +# Python 3.6rc1 3379 (more thorough __class__ validation #23722) +# Python 3.7a1 3390 (add LOAD_METHOD and CALL_METHOD opcodes #26110) +# Python 3.7a2 3391 (update GET_AITER #31709) +# Python 3.7a4 3392 (PEP 552: Deterministic pycs #31650) +# Python 3.7b1 3393 (remove STORE_ANNOTATION opcode #32550) +# Python 3.7b5 3394 (restored docstring as the firts stmt in the body; +# this might affected the first line number #32911) +# +# MAGIC must change whenever the bytecode emitted by the compiler may no +# longer be understood by older implementations of the eval loop (usually +# due to the addition of new opcodes). +# +# Whenever MAGIC_NUMBER is changed, the ranges in the magic_values array +# in PC/launcher.c must also be updated. + +MAGIC_NUMBER = (3394).to_bytes(2, 'little') + b'\r\n' +_RAW_MAGIC_NUMBER = int.from_bytes(MAGIC_NUMBER, 'little') # For import.c + +_PYCACHE = '__pycache__' +_OPT = 'opt-' + +SOURCE_SUFFIXES = ['.py'] # _setup() adds .pyw as needed. + +BYTECODE_SUFFIXES = ['.pyc'] +# Deprecated. +DEBUG_BYTECODE_SUFFIXES = OPTIMIZED_BYTECODE_SUFFIXES = BYTECODE_SUFFIXES + +def cache_from_source(path, debug_override=None, *, optimization=None): + """Given the path to a .py file, return the path to its .pyc file. + + The .py file does not need to exist; this simply returns the path to the + .pyc file calculated as if the .py file were imported. + + The 'optimization' parameter controls the presumed optimization level of + the bytecode file. If 'optimization' is not None, the string representation + of the argument is taken and verified to be alphanumeric (else ValueError + is raised). + + The debug_override parameter is deprecated. If debug_override is not None, + a True value is the same as setting 'optimization' to the empty string + while a False value is equivalent to setting 'optimization' to '1'. + + If sys.implementation.cache_tag is None then NotImplementedError is raised. + + """ + if debug_override is not None: + _warnings.warn('the debug_override parameter is deprecated; use ' + "'optimization' instead", DeprecationWarning) + if optimization is not None: + message = 'debug_override or optimization must be set to None' + raise TypeError(message) + optimization = '' if debug_override else 1 + path = _os.fspath(path) + head, tail = _path_split(path) + base, sep, rest = tail.rpartition('.') + tag = sys.implementation.cache_tag + if tag is None: + raise NotImplementedError('sys.implementation.cache_tag is None') + almost_filename = ''.join([(base if base else rest), sep, tag]) + if optimization is None: + if sys.flags.optimize == 0: + optimization = '' + else: + optimization = sys.flags.optimize + optimization = str(optimization) + if optimization != '': + if not optimization.isalnum(): + raise ValueError('{!r} is not alphanumeric'.format(optimization)) + almost_filename = '{}.{}{}'.format(almost_filename, _OPT, optimization) + return _path_join(head, _PYCACHE, almost_filename + BYTECODE_SUFFIXES[0]) + + +def source_from_cache(path): + """Given the path to a .pyc. file, return the path to its .py file. + + The .pyc file does not need to exist; this simply returns the path to + the .py file calculated to correspond to the .pyc file. If path does + not conform to PEP 3147/488 format, ValueError will be raised. If + sys.implementation.cache_tag is None then NotImplementedError is raised. + + """ + if sys.implementation.cache_tag is None: + raise NotImplementedError('sys.implementation.cache_tag is None') + path = _os.fspath(path) + head, pycache_filename = _path_split(path) + head, pycache = _path_split(head) + if pycache != _PYCACHE: + raise ValueError('{} not bottom-level directory in ' + '{!r}'.format(_PYCACHE, path)) + dot_count = pycache_filename.count('.') + if dot_count not in {2, 3}: + raise ValueError('expected only 2 or 3 dots in ' + '{!r}'.format(pycache_filename)) + elif dot_count == 3: + optimization = pycache_filename.rsplit('.', 2)[-2] + if not optimization.startswith(_OPT): + raise ValueError("optimization portion of filename does not start " + "with {!r}".format(_OPT)) + opt_level = optimization[len(_OPT):] + if not opt_level.isalnum(): + raise ValueError("optimization level {!r} is not an alphanumeric " + "value".format(optimization)) + base_filename = pycache_filename.partition('.')[0] + return _path_join(head, base_filename + SOURCE_SUFFIXES[0]) + + +def _get_sourcefile(bytecode_path): + """Convert a bytecode file path to a source path (if possible). + + This function exists purely for backwards-compatibility for + PyImport_ExecCodeModuleWithFilenames() in the C API. + + """ + if len(bytecode_path) == 0: + return None + rest, _, extension = bytecode_path.rpartition('.') + if not rest or extension.lower()[-3:-1] != 'py': + return bytecode_path + try: + source_path = source_from_cache(bytecode_path) + except (NotImplementedError, ValueError): + source_path = bytecode_path[:-1] + return source_path if _path_isfile(source_path) else bytecode_path + + +def _get_cached(filename): + if filename.endswith(tuple(SOURCE_SUFFIXES)): + try: + return cache_from_source(filename) + except NotImplementedError: + pass + elif filename.endswith(tuple(BYTECODE_SUFFIXES)): + return filename + else: + return None + + +def _calc_mode(path): + """Calculate the mode permissions for a bytecode file.""" + try: + mode = _path_stat(path).st_mode + except OSError: + mode = 0o666 + # We always ensure write access so we can update cached files + # later even when the source files are read-only on Windows (#6074) + mode |= 0o200 + return mode + + +def _check_name(method): + """Decorator to verify that the module being requested matches the one the + loader can handle. + + The first argument (self) must define _name which the second argument is + compared against. If the comparison fails then ImportError is raised. + + """ + def _check_name_wrapper(self, name=None, *args, **kwargs): + if name is None: + name = self.name + elif self.name != name: + raise ImportError('loader for %s cannot handle %s' % + (self.name, name), name=name) + return method(self, name, *args, **kwargs) + try: + _wrap = _bootstrap._wrap + except NameError: + # XXX yuck + def _wrap(new, old): + for replace in ['__module__', '__name__', '__qualname__', '__doc__']: + if hasattr(old, replace): + setattr(new, replace, getattr(old, replace)) + new.__dict__.update(old.__dict__) + _wrap(_check_name_wrapper, method) + return _check_name_wrapper + + +def _find_module_shim(self, fullname): + """Try to find a loader for the specified module by delegating to + self.find_loader(). + + This method is deprecated in favor of finder.find_spec(). + + """ + # Call find_loader(). If it returns a string (indicating this + # is a namespace package portion), generate a warning and + # return None. + loader, portions = self.find_loader(fullname) + if loader is None and len(portions): + msg = 'Not importing directory {}: missing __init__' + _warnings.warn(msg.format(portions[0]), ImportWarning) + return loader + + +def _classify_pyc(data, name, exc_details): + """Perform basic validity checking of a pyc header and return the flags field, + which determines how the pyc should be further validated against the source. + + *data* is the contents of the pyc file. (Only the first 16 bytes are + required, though.) + + *name* is the name of the module being imported. It is used for logging. + + *exc_details* is a dictionary passed to ImportError if it raised for + improved debugging. + + ImportError is raised when the magic number is incorrect or when the flags + field is invalid. EOFError is raised when the data is found to be truncated. + + """ + magic = data[:4] + if magic != MAGIC_NUMBER: + message = f'bad magic number in {name!r}: {magic!r}' + _bootstrap._verbose_message('{}', message) + raise ImportError(message, **exc_details) + if len(data) < 16: + message = f'reached EOF while reading pyc header of {name!r}' + _bootstrap._verbose_message('{}', message) + raise EOFError(message) + flags = _r_long(data[4:8]) + # Only the first two flags are defined. + if flags & ~0b11: + message = f'invalid flags {flags!r} in {name!r}' + raise ImportError(message, **exc_details) + return flags + + +def _validate_timestamp_pyc(data, source_mtime, source_size, name, + exc_details): + """Validate a pyc against the source last-modified time. + + *data* is the contents of the pyc file. (Only the first 16 bytes are + required.) + + *source_mtime* is the last modified timestamp of the source file. + + *source_size* is None or the size of the source file in bytes. + + *name* is the name of the module being imported. It is used for logging. + + *exc_details* is a dictionary passed to ImportError if it raised for + improved debugging. + + An ImportError is raised if the bytecode is stale. + + """ + if _r_long(data[8:12]) != (source_mtime & 0xFFFFFFFF): + message = f'bytecode is stale for {name!r}' + _bootstrap._verbose_message('{}', message) + raise ImportError(message, **exc_details) + if (source_size is not None and + _r_long(data[12:16]) != (source_size & 0xFFFFFFFF)): + raise ImportError(f'bytecode is stale for {name!r}', **exc_details) + + +def _validate_hash_pyc(data, source_hash, name, exc_details): + """Validate a hash-based pyc by checking the real source hash against the one in + the pyc header. + + *data* is the contents of the pyc file. (Only the first 16 bytes are + required.) + + *source_hash* is the importlib.util.source_hash() of the source file. + + *name* is the name of the module being imported. It is used for logging. + + *exc_details* is a dictionary passed to ImportError if it raised for + improved debugging. + + An ImportError is raised if the bytecode is stale. + + """ + if data[8:16] != source_hash: + raise ImportError( + f'hash in bytecode doesn\'t match hash of source {name!r}', + **exc_details, + ) + + +def _compile_bytecode(data, name=None, bytecode_path=None, source_path=None): + """Compile bytecode as found in a pyc.""" + code = marshal.loads(data) + if isinstance(code, _code_type): + _bootstrap._verbose_message('code object from {!r}', bytecode_path) + if source_path is not None: + _imp._fix_co_filename(code, source_path) + return code + else: + raise ImportError('Non-code object in {!r}'.format(bytecode_path), + name=name, path=bytecode_path) + + +def _code_to_timestamp_pyc(code, mtime=0, source_size=0): + "Produce the data for a timestamp-based pyc." + data = bytearray(MAGIC_NUMBER) + data.extend(_w_long(0)) + data.extend(_w_long(mtime)) + data.extend(_w_long(source_size)) + data.extend(marshal.dumps(code)) + return data + + +def _code_to_hash_pyc(code, source_hash, checked=True): + "Produce the data for a hash-based pyc." + data = bytearray(MAGIC_NUMBER) + flags = 0b1 | checked << 1 + data.extend(_w_long(flags)) + assert len(source_hash) == 8 + data.extend(source_hash) + data.extend(marshal.dumps(code)) + return data + + +def decode_source(source_bytes): + """Decode bytes representing source code and return the string. + + Universal newline support is used in the decoding. + """ + import tokenize # To avoid bootstrap issues. + source_bytes_readline = _io.BytesIO(source_bytes).readline + encoding = tokenize.detect_encoding(source_bytes_readline) + newline_decoder = _io.IncrementalNewlineDecoder(None, True) + return newline_decoder.decode(source_bytes.decode(encoding[0])) + + +# Module specifications ####################################################### + +_POPULATE = object() + + +def spec_from_file_location(name, location=None, *, loader=None, + submodule_search_locations=_POPULATE): + """Return a module spec based on a file location. + + To indicate that the module is a package, set + submodule_search_locations to a list of directory paths. An + empty list is sufficient, though its not otherwise useful to the + import system. + + The loader must take a spec as its only __init__() arg. + + """ + if location is None: + # The caller may simply want a partially populated location- + # oriented spec. So we set the location to a bogus value and + # fill in as much as we can. + location = '' + if hasattr(loader, 'get_filename'): + # ExecutionLoader + try: + location = loader.get_filename(name) + except ImportError: + pass + else: + location = _os.fspath(location) + + # If the location is on the filesystem, but doesn't actually exist, + # we could return None here, indicating that the location is not + # valid. However, we don't have a good way of testing since an + # indirect location (e.g. a zip file or URL) will look like a + # non-existent file relative to the filesystem. + + spec = _bootstrap.ModuleSpec(name, loader, origin=location) + spec._set_fileattr = True + + # Pick a loader if one wasn't provided. + if loader is None: + for loader_class, suffixes in _get_supported_file_loaders(): + if location.endswith(tuple(suffixes)): + loader = loader_class(name, location) + spec.loader = loader + break + else: + return None + + # Set submodule_search_paths appropriately. + if submodule_search_locations is _POPULATE: + # Check the loader. + if hasattr(loader, 'is_package'): + try: + is_package = loader.is_package(name) + except ImportError: + pass + else: + if is_package: + spec.submodule_search_locations = [] + else: + spec.submodule_search_locations = submodule_search_locations + if spec.submodule_search_locations == []: + if location: + dirname = _path_split(location)[0] + spec.submodule_search_locations.append(dirname) + + return spec + + +# Loaders ##################################################################### + +class WindowsRegistryFinder: + + """Meta path finder for modules declared in the Windows registry.""" + + REGISTRY_KEY = ( + 'Software\\Python\\PythonCore\\{sys_version}' + '\\Modules\\{fullname}') + REGISTRY_KEY_DEBUG = ( + 'Software\\Python\\PythonCore\\{sys_version}' + '\\Modules\\{fullname}\\Debug') + DEBUG_BUILD = False # Changed in _setup() + + @classmethod + def _open_registry(cls, key): + try: + return _winreg.OpenKey(_winreg.HKEY_CURRENT_USER, key) + except OSError: + return _winreg.OpenKey(_winreg.HKEY_LOCAL_MACHINE, key) + + @classmethod + def _search_registry(cls, fullname): + if cls.DEBUG_BUILD: + registry_key = cls.REGISTRY_KEY_DEBUG + else: + registry_key = cls.REGISTRY_KEY + key = registry_key.format(fullname=fullname, + sys_version='%d.%d' % sys.version_info[:2]) + try: + with cls._open_registry(key) as hkey: + filepath = _winreg.QueryValue(hkey, '') + except OSError: + return None + return filepath + + @classmethod + def find_spec(cls, fullname, path=None, target=None): + filepath = cls._search_registry(fullname) + if filepath is None: + return None + try: + _path_stat(filepath) + except OSError: + return None + for loader, suffixes in _get_supported_file_loaders(): + if filepath.endswith(tuple(suffixes)): + spec = _bootstrap.spec_from_loader(fullname, + loader(fullname, filepath), + origin=filepath) + return spec + + @classmethod + def find_module(cls, fullname, path=None): + """Find module named in the registry. + + This method is deprecated. Use exec_module() instead. + + """ + spec = cls.find_spec(fullname, path) + if spec is not None: + return spec.loader + else: + return None + + +class _LoaderBasics: + + """Base class of common code needed by both SourceLoader and + SourcelessFileLoader.""" + + def is_package(self, fullname): + """Concrete implementation of InspectLoader.is_package by checking if + the path returned by get_filename has a filename of '__init__.py'.""" + filename = _path_split(self.get_filename(fullname))[1] + filename_base = filename.rsplit('.', 1)[0] + tail_name = fullname.rpartition('.')[2] + return filename_base == '__init__' and tail_name != '__init__' + + def create_module(self, spec): + """Use default semantics for module creation.""" + + def exec_module(self, module): + """Execute the module.""" + code = self.get_code(module.__name__) + if code is None: + raise ImportError('cannot load module {!r} when get_code() ' + 'returns None'.format(module.__name__)) + _bootstrap._call_with_frames_removed(exec, code, module.__dict__) + + def load_module(self, fullname): + """This module is deprecated.""" + return _bootstrap._load_module_shim(self, fullname) + + +class SourceLoader(_LoaderBasics): + + def path_mtime(self, path): + """Optional method that returns the modification time (an int) for the + specified path, where path is a str. + + Raises OSError when the path cannot be handled. + """ + raise OSError + + def path_stats(self, path): + """Optional method returning a metadata dict for the specified path + to by the path (str). + Possible keys: + - 'mtime' (mandatory) is the numeric timestamp of last source + code modification; + - 'size' (optional) is the size in bytes of the source code. + + Implementing this method allows the loader to read bytecode files. + Raises OSError when the path cannot be handled. + """ + return {'mtime': self.path_mtime(path)} + + def _cache_bytecode(self, source_path, cache_path, data): + """Optional method which writes data (bytes) to a file path (a str). + + Implementing this method allows for the writing of bytecode files. + + The source path is needed in order to correctly transfer permissions + """ + # For backwards compatibility, we delegate to set_data() + return self.set_data(cache_path, data) + + def set_data(self, path, data): + """Optional method which writes data (bytes) to a file path (a str). + + Implementing this method allows for the writing of bytecode files. + """ + + + def get_source(self, fullname): + """Concrete implementation of InspectLoader.get_source.""" + path = self.get_filename(fullname) + try: + source_bytes = self.get_data(path) + except OSError as exc: + raise ImportError('source not available through get_data()', + name=fullname) from exc + return decode_source(source_bytes) + + def source_to_code(self, data, path, *, _optimize=-1): + """Return the code object compiled from source. + + The 'data' argument can be any object type that compile() supports. + """ + return _bootstrap._call_with_frames_removed(compile, data, path, 'exec', + dont_inherit=True, optimize=_optimize) + + def get_code(self, fullname): + """Concrete implementation of InspectLoader.get_code. + + Reading of bytecode requires path_stats to be implemented. To write + bytecode, set_data must also be implemented. + + """ + source_path = self.get_filename(fullname) + source_mtime = None + source_bytes = None + source_hash = None + hash_based = False + check_source = True + try: + bytecode_path = cache_from_source(source_path) + except NotImplementedError: + bytecode_path = None + else: + try: + st = self.path_stats(source_path) + except OSError: + pass + else: + source_mtime = int(st['mtime']) + try: + data = self.get_data(bytecode_path) + except OSError: + pass + else: + exc_details = { + 'name': fullname, + 'path': bytecode_path, + } + try: + flags = _classify_pyc(data, fullname, exc_details) + bytes_data = memoryview(data)[16:] + hash_based = flags & 0b1 != 0 + if hash_based: + check_source = flags & 0b10 != 0 + if (_imp.check_hash_based_pycs != 'never' and + (check_source or + _imp.check_hash_based_pycs == 'always')): + source_bytes = self.get_data(source_path) + source_hash = _imp.source_hash( + _RAW_MAGIC_NUMBER, + source_bytes, + ) + _validate_hash_pyc(data, source_hash, fullname, + exc_details) + else: + _validate_timestamp_pyc( + data, + source_mtime, + st['size'], + fullname, + exc_details, + ) + except (ImportError, EOFError): + pass + else: + _bootstrap._verbose_message('{} matches {}', bytecode_path, + source_path) + return _compile_bytecode(bytes_data, name=fullname, + bytecode_path=bytecode_path, + source_path=source_path) + if source_bytes is None: + source_bytes = self.get_data(source_path) + code_object = self.source_to_code(source_bytes, source_path) + _bootstrap._verbose_message('code object from {}', source_path) + if (not sys.dont_write_bytecode and bytecode_path is not None and + source_mtime is not None): + if hash_based: + if source_hash is None: + source_hash = _imp.source_hash(source_bytes) + data = _code_to_hash_pyc(code_object, source_hash, check_source) + else: + data = _code_to_timestamp_pyc(code_object, source_mtime, + len(source_bytes)) + try: + self._cache_bytecode(source_path, bytecode_path, data) + _bootstrap._verbose_message('wrote {!r}', bytecode_path) + except NotImplementedError: + pass + return code_object + + +class FileLoader: + + """Base file loader class which implements the loader protocol methods that + require file system usage.""" + + def __init__(self, fullname, path): + """Cache the module name and the path to the file found by the + finder.""" + self.name = fullname + self.path = path + + def __eq__(self, other): + return (self.__class__ == other.__class__ and + self.__dict__ == other.__dict__) + + def __hash__(self): + return hash(self.name) ^ hash(self.path) + + @_check_name + def load_module(self, fullname): + """Load a module from a file. + + This method is deprecated. Use exec_module() instead. + + """ + # The only reason for this method is for the name check. + # Issue #14857: Avoid the zero-argument form of super so the implementation + # of that form can be updated without breaking the frozen module + return super(FileLoader, self).load_module(fullname) + + @_check_name + def get_filename(self, fullname): + """Return the path to the source file as found by the finder.""" + return self.path + + def get_data(self, path): + """Return the data from path as raw bytes.""" + with _io.FileIO(path, 'r') as file: + return file.read() + + # ResourceReader ABC API. + + @_check_name + def get_resource_reader(self, module): + if self.is_package(module): + return self + return None + + def open_resource(self, resource): + path = _path_join(_path_split(self.path)[0], resource) + return _io.FileIO(path, 'r') + + def resource_path(self, resource): + if not self.is_resource(resource): + raise FileNotFoundError + path = _path_join(_path_split(self.path)[0], resource) + return path + + def is_resource(self, name): + if path_sep in name: + return False + path = _path_join(_path_split(self.path)[0], name) + return _path_isfile(path) + + def contents(self): + return iter(_os.listdir(_path_split(self.path)[0])) + + +class SourceFileLoader(FileLoader, SourceLoader): + + """Concrete implementation of SourceLoader using the file system.""" + + def path_stats(self, path): + """Return the metadata for the path.""" + st = _path_stat(path) + return {'mtime': st.st_mtime, 'size': st.st_size} + + def _cache_bytecode(self, source_path, bytecode_path, data): + # Adapt between the two APIs + mode = _calc_mode(source_path) + return self.set_data(bytecode_path, data, _mode=mode) + + def set_data(self, path, data, *, _mode=0o666): + """Write bytes data to a file.""" + parent, filename = _path_split(path) + path_parts = [] + # Figure out what directories are missing. + while parent and not _path_isdir(parent): + parent, part = _path_split(parent) + path_parts.append(part) + # Create needed directories. + for part in reversed(path_parts): + parent = _path_join(parent, part) + try: + _os.mkdir(parent) + except FileExistsError: + # Probably another Python process already created the dir. + continue + except OSError as exc: + # Could be a permission error, read-only filesystem: just forget + # about writing the data. + _bootstrap._verbose_message('could not create {!r}: {!r}', + parent, exc) + return + try: + _write_atomic(path, data, _mode) + _bootstrap._verbose_message('created {!r}', path) + except OSError as exc: + # Same as above: just don't write the bytecode. + _bootstrap._verbose_message('could not create {!r}: {!r}', path, + exc) + + +class SourcelessFileLoader(FileLoader, _LoaderBasics): + + """Loader which handles sourceless file imports.""" + + def get_code(self, fullname): + path = self.get_filename(fullname) + data = self.get_data(path) + # Call _classify_pyc to do basic validation of the pyc but ignore the + # result. There's no source to check against. + exc_details = { + 'name': fullname, + 'path': path, + } + _classify_pyc(data, fullname, exc_details) + return _compile_bytecode( + memoryview(data)[16:], + name=fullname, + bytecode_path=path, + ) + + def get_source(self, fullname): + """Return None as there is no source code.""" + return None + + +# Filled in by _setup(). +EXTENSION_SUFFIXES = [] + + +class ExtensionFileLoader(FileLoader, _LoaderBasics): + + """Loader for extension modules. + + The constructor is designed to work with FileFinder. + + """ + + def __init__(self, name, path): + self.name = name + self.path = path + + def __eq__(self, other): + return (self.__class__ == other.__class__ and + self.__dict__ == other.__dict__) + + def __hash__(self): + return hash(self.name) ^ hash(self.path) + + def create_module(self, spec): + """Create an unitialized extension module""" + module = _bootstrap._call_with_frames_removed( + _imp.create_dynamic, spec) + _bootstrap._verbose_message('extension module {!r} loaded from {!r}', + spec.name, self.path) + return module + + def exec_module(self, module): + """Initialize an extension module""" + _bootstrap._call_with_frames_removed(_imp.exec_dynamic, module) + _bootstrap._verbose_message('extension module {!r} executed from {!r}', + self.name, self.path) + + def is_package(self, fullname): + """Return True if the extension module is a package.""" + file_name = _path_split(self.path)[1] + return any(file_name == '__init__' + suffix + for suffix in EXTENSION_SUFFIXES) + + def get_code(self, fullname): + """Return None as an extension module cannot create a code object.""" + return None + + def get_source(self, fullname): + """Return None as extension modules have no source code.""" + return None + + @_check_name + def get_filename(self, fullname): + """Return the path to the source file as found by the finder.""" + return self.path + + +class _NamespacePath: + """Represents a namespace package's path. It uses the module name + to find its parent module, and from there it looks up the parent's + __path__. When this changes, the module's own path is recomputed, + using path_finder. For top-level modules, the parent module's path + is sys.path.""" + + def __init__(self, name, path, path_finder): + self._name = name + self._path = path + self._last_parent_path = tuple(self._get_parent_path()) + self._path_finder = path_finder + + def _find_parent_path_names(self): + """Returns a tuple of (parent-module-name, parent-path-attr-name)""" + parent, dot, me = self._name.rpartition('.') + if dot == '': + # This is a top-level module. sys.path contains the parent path. + return 'sys', 'path' + # Not a top-level module. parent-module.__path__ contains the + # parent path. + return parent, '__path__' + + def _get_parent_path(self): + parent_module_name, path_attr_name = self._find_parent_path_names() + return getattr(sys.modules[parent_module_name], path_attr_name) + + def _recalculate(self): + # If the parent's path has changed, recalculate _path + parent_path = tuple(self._get_parent_path()) # Make a copy + if parent_path != self._last_parent_path: + spec = self._path_finder(self._name, parent_path) + # Note that no changes are made if a loader is returned, but we + # do remember the new parent path + if spec is not None and spec.loader is None: + if spec.submodule_search_locations: + self._path = spec.submodule_search_locations + self._last_parent_path = parent_path # Save the copy + return self._path + + def __iter__(self): + return iter(self._recalculate()) + + def __setitem__(self, index, path): + self._path[index] = path + + def __len__(self): + return len(self._recalculate()) + + def __repr__(self): + return '_NamespacePath({!r})'.format(self._path) + + def __contains__(self, item): + return item in self._recalculate() + + def append(self, item): + self._path.append(item) + + +# We use this exclusively in module_from_spec() for backward-compatibility. +class _NamespaceLoader: + def __init__(self, name, path, path_finder): + self._path = _NamespacePath(name, path, path_finder) + + @classmethod + def module_repr(cls, module): + """Return repr for the module. + + The method is deprecated. The import machinery does the job itself. + + """ + return ''.format(module.__name__) + + def is_package(self, fullname): + return True + + def get_source(self, fullname): + return '' + + def get_code(self, fullname): + return compile('', '', 'exec', dont_inherit=True) + + def create_module(self, spec): + """Use default semantics for module creation.""" + + def exec_module(self, module): + pass + + def load_module(self, fullname): + """Load a namespace module. + + This method is deprecated. Use exec_module() instead. + + """ + # The import system never calls this method. + _bootstrap._verbose_message('namespace module loaded with path {!r}', + self._path) + return _bootstrap._load_module_shim(self, fullname) + + +# Finders ##################################################################### + +class PathFinder: + + """Meta path finder for sys.path and package __path__ attributes.""" + + @classmethod + def invalidate_caches(cls): + """Call the invalidate_caches() method on all path entry finders + stored in sys.path_importer_caches (where implemented).""" + for name, finder in list(sys.path_importer_cache.items()): + if finder is None: + del sys.path_importer_cache[name] + elif hasattr(finder, 'invalidate_caches'): + finder.invalidate_caches() + + @classmethod + def _path_hooks(cls, path): + """Search sys.path_hooks for a finder for 'path'.""" + if sys.path_hooks is not None and not sys.path_hooks: + _warnings.warn('sys.path_hooks is empty', ImportWarning) + for hook in sys.path_hooks: + try: + return hook(path) + except ImportError: + continue + else: + return None + + @classmethod + def _path_importer_cache(cls, path): + """Get the finder for the path entry from sys.path_importer_cache. + + If the path entry is not in the cache, find the appropriate finder + and cache it. If no finder is available, store None. + + """ + if path == '': + try: + path = _os.getcwd() + except FileNotFoundError: + # Don't cache the failure as the cwd can easily change to + # a valid directory later on. + return None + try: + finder = sys.path_importer_cache[path] + except KeyError: + finder = cls._path_hooks(path) + sys.path_importer_cache[path] = finder + return finder + + @classmethod + def _legacy_get_spec(cls, fullname, finder): + # This would be a good place for a DeprecationWarning if + # we ended up going that route. + if hasattr(finder, 'find_loader'): + loader, portions = finder.find_loader(fullname) + else: + loader = finder.find_module(fullname) + portions = [] + if loader is not None: + return _bootstrap.spec_from_loader(fullname, loader) + spec = _bootstrap.ModuleSpec(fullname, None) + spec.submodule_search_locations = portions + return spec + + @classmethod + def _get_spec(cls, fullname, path, target=None): + """Find the loader or namespace_path for this module/package name.""" + # If this ends up being a namespace package, namespace_path is + # the list of paths that will become its __path__ + namespace_path = [] + for entry in path: + if not isinstance(entry, (str, bytes)): + continue + finder = cls._path_importer_cache(entry) + if finder is not None: + if hasattr(finder, 'find_spec'): + spec = finder.find_spec(fullname, target) + else: + spec = cls._legacy_get_spec(fullname, finder) + if spec is None: + continue + if spec.loader is not None: + return spec + portions = spec.submodule_search_locations + if portions is None: + raise ImportError('spec missing loader') + # This is possibly part of a namespace package. + # Remember these path entries (if any) for when we + # create a namespace package, and continue iterating + # on path. + namespace_path.extend(portions) + else: + spec = _bootstrap.ModuleSpec(fullname, None) + spec.submodule_search_locations = namespace_path + return spec + + @classmethod + def find_spec(cls, fullname, path=None, target=None): + """Try to find a spec for 'fullname' on sys.path or 'path'. + + The search is based on sys.path_hooks and sys.path_importer_cache. + """ + if path is None: + path = sys.path + spec = cls._get_spec(fullname, path, target) + if spec is None: + return None + elif spec.loader is None: + namespace_path = spec.submodule_search_locations + if namespace_path: + # We found at least one namespace path. Return a spec which + # can create the namespace package. + spec.origin = None + spec.submodule_search_locations = _NamespacePath(fullname, namespace_path, cls._get_spec) + return spec + else: + return None + else: + return spec + + @classmethod + def find_module(cls, fullname, path=None): + """find the module on sys.path or 'path' based on sys.path_hooks and + sys.path_importer_cache. + + This method is deprecated. Use find_spec() instead. + + """ + spec = cls.find_spec(fullname, path) + if spec is None: + return None + return spec.loader + + +class FileFinder: + + """File-based finder. + + Interactions with the file system are cached for performance, being + refreshed when the directory the finder is handling has been modified. + + """ + + def __init__(self, path, *loader_details): + """Initialize with the path to search on and a variable number of + 2-tuples containing the loader and the file suffixes the loader + recognizes.""" + loaders = [] + for loader, suffixes in loader_details: + loaders.extend((suffix, loader) for suffix in suffixes) + self._loaders = loaders + # Base (directory) path + self.path = path or '.' + self._path_mtime = -1 + self._path_cache = set() + self._relaxed_path_cache = set() + + def invalidate_caches(self): + """Invalidate the directory mtime.""" + self._path_mtime = -1 + + find_module = _find_module_shim + + def find_loader(self, fullname): + """Try to find a loader for the specified module, or the namespace + package portions. Returns (loader, list-of-portions). + + This method is deprecated. Use find_spec() instead. + + """ + spec = self.find_spec(fullname) + if spec is None: + return None, [] + return spec.loader, spec.submodule_search_locations or [] + + def _get_spec(self, loader_class, fullname, path, smsl, target): + loader = loader_class(fullname, path) + return spec_from_file_location(fullname, path, loader=loader, + submodule_search_locations=smsl) + + def find_spec(self, fullname, target=None): + """Try to find a spec for the specified module. + + Returns the matching spec, or None if not found. + """ + is_namespace = False + tail_module = fullname.rpartition('.')[2] + try: + mtime = _path_stat(self.path or _os.getcwd()).st_mtime + except OSError: + mtime = -1 + if mtime != self._path_mtime: + self._fill_cache() + self._path_mtime = mtime + # tail_module keeps the original casing, for __file__ and friends + if _relax_case(): + cache = self._relaxed_path_cache + cache_module = tail_module.lower() + else: + cache = self._path_cache + cache_module = tail_module + # Check if the module is the name of a directory (and thus a package). + if cache_module in cache: + base_path = _path_join(self.path, tail_module) + for suffix, loader_class in self._loaders: + init_filename = '__init__' + suffix + full_path = _path_join(base_path, init_filename) + if _path_isfile(full_path): + return self._get_spec(loader_class, fullname, full_path, [base_path], target) + else: + # If a namespace package, return the path if we don't + # find a module in the next section. + is_namespace = _path_isdir(base_path) + # Check for a file w/ a proper suffix exists. + for suffix, loader_class in self._loaders: + full_path = _path_join(self.path, tail_module + suffix) + _bootstrap._verbose_message('trying {}', full_path, verbosity=2) + if cache_module + suffix in cache: + if _path_isfile(full_path): + return self._get_spec(loader_class, fullname, full_path, + None, target) + if is_namespace: + _bootstrap._verbose_message('possible namespace for {}', base_path) + spec = _bootstrap.ModuleSpec(fullname, None) + spec.submodule_search_locations = [base_path] + return spec + return None + + def _fill_cache(self): + """Fill the cache of potential modules and packages for this directory.""" + path = self.path + try: + contents = _os.listdir(path or _os.getcwd()) + except (FileNotFoundError, PermissionError, NotADirectoryError): + # Directory has either been removed, turned into a file, or made + # unreadable. + contents = [] + # We store two cached versions, to handle runtime changes of the + # PYTHONCASEOK environment variable. + if not sys.platform.startswith('win'): + self._path_cache = set(contents) + else: + # Windows users can import modules with case-insensitive file + # suffixes (for legacy reasons). Make the suffix lowercase here + # so it's done once instead of for every import. This is safe as + # the specified suffixes to check against are always specified in a + # case-sensitive manner. + lower_suffix_contents = set() + for item in contents: + name, dot, suffix = item.partition('.') + if dot: + new_name = '{}.{}'.format(name, suffix.lower()) + else: + new_name = name + lower_suffix_contents.add(new_name) + self._path_cache = lower_suffix_contents + if sys.platform.startswith(_CASE_INSENSITIVE_PLATFORMS): + self._relaxed_path_cache = {fn.lower() for fn in contents} + + @classmethod + def path_hook(cls, *loader_details): + """A class method which returns a closure to use on sys.path_hook + which will return an instance using the specified loaders and the path + called on the closure. + + If the path called on the closure is not a directory, ImportError is + raised. + + """ + def path_hook_for_FileFinder(path): + """Path hook for importlib.machinery.FileFinder.""" + if not _path_isdir(path): + raise ImportError('only directories are supported', path=path) + return cls(path, *loader_details) + + return path_hook_for_FileFinder + + def __repr__(self): + return 'FileFinder({!r})'.format(self.path) + + +# Import setup ############################################################### + +def _fix_up_module(ns, name, pathname, cpathname=None): + # This function is used by PyImport_ExecCodeModuleObject(). + loader = ns.get('__loader__') + spec = ns.get('__spec__') + if not loader: + if spec: + loader = spec.loader + elif pathname == cpathname: + loader = SourcelessFileLoader(name, pathname) + else: + loader = SourceFileLoader(name, pathname) + if not spec: + spec = spec_from_file_location(name, pathname, loader=loader) + try: + ns['__spec__'] = spec + ns['__loader__'] = loader + ns['__file__'] = pathname + ns['__cached__'] = cpathname + except Exception: + # Not important enough to report. + pass + + +def _get_supported_file_loaders(): + """Returns a list of file-based module loaders. + + Each item is a tuple (loader, suffixes). + """ + extensions = ExtensionFileLoader, _imp.extension_suffixes() + source = SourceFileLoader, SOURCE_SUFFIXES + bytecode = SourcelessFileLoader, BYTECODE_SUFFIXES + return [extensions, source, bytecode] + + +def _setup(_bootstrap_module): + """Setup the path-based importers for importlib by importing needed + built-in modules and injecting them into the global namespace. + + Other components are extracted from the core bootstrap module. + + """ + global sys, _imp, _bootstrap + _bootstrap = _bootstrap_module + sys = _bootstrap.sys + _imp = _bootstrap._imp + + # Directly load built-in modules needed during bootstrap. + self_module = sys.modules[__name__] + for builtin_name in ('_io', '_warnings', 'builtins', 'marshal'): + if builtin_name not in sys.modules: + builtin_module = _bootstrap._builtin_from_name(builtin_name) + else: + builtin_module = sys.modules[builtin_name] + setattr(self_module, builtin_name, builtin_module) + + # Directly load the os module (needed during bootstrap). + os_details = ('posix', ['/']), ('nt', ['\\', '/']) + for builtin_os, path_separators in os_details: + # Assumption made in _path_join() + assert all(len(sep) == 1 for sep in path_separators) + path_sep = path_separators[0] + if builtin_os in sys.modules: + os_module = sys.modules[builtin_os] + break + else: + try: + os_module = _bootstrap._builtin_from_name(builtin_os) + break + except ImportError: + continue + else: + raise ImportError('importlib requires posix or nt') + setattr(self_module, '_os', os_module) + setattr(self_module, 'path_sep', path_sep) + setattr(self_module, 'path_separators', ''.join(path_separators)) + + # Directly load the _thread module (needed during bootstrap). + thread_module = _bootstrap._builtin_from_name('_thread') + setattr(self_module, '_thread', thread_module) + + # Directly load the _weakref module (needed during bootstrap). + weakref_module = _bootstrap._builtin_from_name('_weakref') + setattr(self_module, '_weakref', weakref_module) + + # Directly load the winreg module (needed during bootstrap). + if builtin_os == 'nt': + winreg_module = _bootstrap._builtin_from_name('winreg') + setattr(self_module, '_winreg', winreg_module) + + # Constants + setattr(self_module, '_relax_case', _make_relax_case()) + EXTENSION_SUFFIXES.extend(_imp.extension_suffixes()) + if builtin_os == 'nt': + SOURCE_SUFFIXES.append('.pyw') + if '_d.pyd' in EXTENSION_SUFFIXES: + WindowsRegistryFinder.DEBUG_BUILD = True + + +def _install(_bootstrap_module): + """Install the path-based import components.""" + _setup(_bootstrap_module) + supported_loaders = _get_supported_file_loaders() + sys.path_hooks.extend([FileFinder.path_hook(*supported_loaders)]) + sys.meta_path.append(PathFinder) diff --git a/env/Lib/importlib/abc.py b/env/Lib/importlib/abc.py new file mode 100644 index 0000000..4b2d3de --- /dev/null +++ b/env/Lib/importlib/abc.py @@ -0,0 +1,388 @@ +"""Abstract base classes related to import.""" +from . import _bootstrap +from . import _bootstrap_external +from . import machinery +try: + import _frozen_importlib +except ImportError as exc: + if exc.name != '_frozen_importlib': + raise + _frozen_importlib = None +try: + import _frozen_importlib_external +except ImportError as exc: + _frozen_importlib_external = _bootstrap_external +import abc +import warnings + + +def _register(abstract_cls, *classes): + for cls in classes: + abstract_cls.register(cls) + if _frozen_importlib is not None: + try: + frozen_cls = getattr(_frozen_importlib, cls.__name__) + except AttributeError: + frozen_cls = getattr(_frozen_importlib_external, cls.__name__) + abstract_cls.register(frozen_cls) + + +class Finder(metaclass=abc.ABCMeta): + + """Legacy abstract base class for import finders. + + It may be subclassed for compatibility with legacy third party + reimplementations of the import system. Otherwise, finder + implementations should derive from the more specific MetaPathFinder + or PathEntryFinder ABCs. + + Deprecated since Python 3.3 + """ + + @abc.abstractmethod + def find_module(self, fullname, path=None): + """An abstract method that should find a module. + The fullname is a str and the optional path is a str or None. + Returns a Loader object or None. + """ + + +class MetaPathFinder(Finder): + + """Abstract base class for import finders on sys.meta_path.""" + + # We don't define find_spec() here since that would break + # hasattr checks we do to support backward compatibility. + + def find_module(self, fullname, path): + """Return a loader for the module. + + If no module is found, return None. The fullname is a str and + the path is a list of strings or None. + + This method is deprecated since Python 3.4 in favor of + finder.find_spec(). If find_spec() exists then backwards-compatible + functionality is provided for this method. + + """ + warnings.warn("MetaPathFinder.find_module() is deprecated since Python " + "3.4 in favor of MetaPathFinder.find_spec() " + "(available since 3.4)", + DeprecationWarning, + stacklevel=2) + if not hasattr(self, 'find_spec'): + return None + found = self.find_spec(fullname, path) + return found.loader if found is not None else None + + def invalidate_caches(self): + """An optional method for clearing the finder's cache, if any. + This method is used by importlib.invalidate_caches(). + """ + +_register(MetaPathFinder, machinery.BuiltinImporter, machinery.FrozenImporter, + machinery.PathFinder, machinery.WindowsRegistryFinder) + + +class PathEntryFinder(Finder): + + """Abstract base class for path entry finders used by PathFinder.""" + + # We don't define find_spec() here since that would break + # hasattr checks we do to support backward compatibility. + + def find_loader(self, fullname): + """Return (loader, namespace portion) for the path entry. + + The fullname is a str. The namespace portion is a sequence of + path entries contributing to part of a namespace package. The + sequence may be empty. If loader is not None, the portion will + be ignored. + + The portion will be discarded if another path entry finder + locates the module as a normal module or package. + + This method is deprecated since Python 3.4 in favor of + finder.find_spec(). If find_spec() is provided than backwards-compatible + functionality is provided. + """ + warnings.warn("PathEntryFinder.find_loader() is deprecated since Python " + "3.4 in favor of PathEntryFinder.find_spec() " + "(available since 3.4)", + DeprecationWarning, + stacklevel=2) + if not hasattr(self, 'find_spec'): + return None, [] + found = self.find_spec(fullname) + if found is not None: + if not found.submodule_search_locations: + portions = [] + else: + portions = found.submodule_search_locations + return found.loader, portions + else: + return None, [] + + find_module = _bootstrap_external._find_module_shim + + def invalidate_caches(self): + """An optional method for clearing the finder's cache, if any. + This method is used by PathFinder.invalidate_caches(). + """ + +_register(PathEntryFinder, machinery.FileFinder) + + +class Loader(metaclass=abc.ABCMeta): + + """Abstract base class for import loaders.""" + + def create_module(self, spec): + """Return a module to initialize and into which to load. + + This method should raise ImportError if anything prevents it + from creating a new module. It may return None to indicate + that the spec should create the new module. + """ + # By default, defer to default semantics for the new module. + return None + + # We don't define exec_module() here since that would break + # hasattr checks we do to support backward compatibility. + + def load_module(self, fullname): + """Return the loaded module. + + The module must be added to sys.modules and have import-related + attributes set properly. The fullname is a str. + + ImportError is raised on failure. + + This method is deprecated in favor of loader.exec_module(). If + exec_module() exists then it is used to provide a backwards-compatible + functionality for this method. + + """ + if not hasattr(self, 'exec_module'): + raise ImportError + return _bootstrap._load_module_shim(self, fullname) + + def module_repr(self, module): + """Return a module's repr. + + Used by the module type when the method does not raise + NotImplementedError. + + This method is deprecated. + + """ + # The exception will cause ModuleType.__repr__ to ignore this method. + raise NotImplementedError + + +class ResourceLoader(Loader): + + """Abstract base class for loaders which can return data from their + back-end storage. + + This ABC represents one of the optional protocols specified by PEP 302. + + """ + + @abc.abstractmethod + def get_data(self, path): + """Abstract method which when implemented should return the bytes for + the specified path. The path must be a str.""" + raise OSError + + +class InspectLoader(Loader): + + """Abstract base class for loaders which support inspection about the + modules they can load. + + This ABC represents one of the optional protocols specified by PEP 302. + + """ + + def is_package(self, fullname): + """Optional method which when implemented should return whether the + module is a package. The fullname is a str. Returns a bool. + + Raises ImportError if the module cannot be found. + """ + raise ImportError + + def get_code(self, fullname): + """Method which returns the code object for the module. + + The fullname is a str. Returns a types.CodeType if possible, else + returns None if a code object does not make sense + (e.g. built-in module). Raises ImportError if the module cannot be + found. + """ + source = self.get_source(fullname) + if source is None: + return None + return self.source_to_code(source) + + @abc.abstractmethod + def get_source(self, fullname): + """Abstract method which should return the source code for the + module. The fullname is a str. Returns a str. + + Raises ImportError if the module cannot be found. + """ + raise ImportError + + @staticmethod + def source_to_code(data, path=''): + """Compile 'data' into a code object. + + The 'data' argument can be anything that compile() can handle. The'path' + argument should be where the data was retrieved (when applicable).""" + return compile(data, path, 'exec', dont_inherit=True) + + exec_module = _bootstrap_external._LoaderBasics.exec_module + load_module = _bootstrap_external._LoaderBasics.load_module + +_register(InspectLoader, machinery.BuiltinImporter, machinery.FrozenImporter) + + +class ExecutionLoader(InspectLoader): + + """Abstract base class for loaders that wish to support the execution of + modules as scripts. + + This ABC represents one of the optional protocols specified in PEP 302. + + """ + + @abc.abstractmethod + def get_filename(self, fullname): + """Abstract method which should return the value that __file__ is to be + set to. + + Raises ImportError if the module cannot be found. + """ + raise ImportError + + def get_code(self, fullname): + """Method to return the code object for fullname. + + Should return None if not applicable (e.g. built-in module). + Raise ImportError if the module cannot be found. + """ + source = self.get_source(fullname) + if source is None: + return None + try: + path = self.get_filename(fullname) + except ImportError: + return self.source_to_code(source) + else: + return self.source_to_code(source, path) + +_register(ExecutionLoader, machinery.ExtensionFileLoader) + + +class FileLoader(_bootstrap_external.FileLoader, ResourceLoader, ExecutionLoader): + + """Abstract base class partially implementing the ResourceLoader and + ExecutionLoader ABCs.""" + +_register(FileLoader, machinery.SourceFileLoader, + machinery.SourcelessFileLoader) + + +class SourceLoader(_bootstrap_external.SourceLoader, ResourceLoader, ExecutionLoader): + + """Abstract base class for loading source code (and optionally any + corresponding bytecode). + + To support loading from source code, the abstractmethods inherited from + ResourceLoader and ExecutionLoader need to be implemented. To also support + loading from bytecode, the optional methods specified directly by this ABC + is required. + + Inherited abstractmethods not implemented in this ABC: + + * ResourceLoader.get_data + * ExecutionLoader.get_filename + + """ + + def path_mtime(self, path): + """Return the (int) modification time for the path (str).""" + if self.path_stats.__func__ is SourceLoader.path_stats: + raise OSError + return int(self.path_stats(path)['mtime']) + + def path_stats(self, path): + """Return a metadata dict for the source pointed to by the path (str). + Possible keys: + - 'mtime' (mandatory) is the numeric timestamp of last source + code modification; + - 'size' (optional) is the size in bytes of the source code. + """ + if self.path_mtime.__func__ is SourceLoader.path_mtime: + raise OSError + return {'mtime': self.path_mtime(path)} + + def set_data(self, path, data): + """Write the bytes to the path (if possible). + + Accepts a str path and data as bytes. + + Any needed intermediary directories are to be created. If for some + reason the file cannot be written because of permissions, fail + silently. + """ + +_register(SourceLoader, machinery.SourceFileLoader) + + +class ResourceReader(metaclass=abc.ABCMeta): + + """Abstract base class to provide resource-reading support. + + Loaders that support resource reading are expected to implement + the ``get_resource_reader(fullname)`` method and have it either return None + or an object compatible with this ABC. + """ + + @abc.abstractmethod + def open_resource(self, resource): + """Return an opened, file-like object for binary reading. + + The 'resource' argument is expected to represent only a file name + and thus not contain any subdirectory components. + + If the resource cannot be found, FileNotFoundError is raised. + """ + raise FileNotFoundError + + @abc.abstractmethod + def resource_path(self, resource): + """Return the file system path to the specified resource. + + The 'resource' argument is expected to represent only a file name + and thus not contain any subdirectory components. + + If the resource does not exist on the file system, raise + FileNotFoundError. + """ + raise FileNotFoundError + + @abc.abstractmethod + def is_resource(self, name): + """Return True if the named 'name' is consider a resource.""" + raise FileNotFoundError + + @abc.abstractmethod + def contents(self): + """Return an iterable of strings over the contents of the package.""" + return [] + + +_register(ResourceReader, machinery.SourceFileLoader) diff --git a/env/Lib/importlib/machinery.py b/env/Lib/importlib/machinery.py new file mode 100644 index 0000000..1b2b5c9 --- /dev/null +++ b/env/Lib/importlib/machinery.py @@ -0,0 +1,21 @@ +"""The machinery of importlib: finders, loaders, hooks, etc.""" + +import _imp + +from ._bootstrap import ModuleSpec +from ._bootstrap import BuiltinImporter +from ._bootstrap import FrozenImporter +from ._bootstrap_external import (SOURCE_SUFFIXES, DEBUG_BYTECODE_SUFFIXES, + OPTIMIZED_BYTECODE_SUFFIXES, BYTECODE_SUFFIXES, + EXTENSION_SUFFIXES) +from ._bootstrap_external import WindowsRegistryFinder +from ._bootstrap_external import PathFinder +from ._bootstrap_external import FileFinder +from ._bootstrap_external import SourceFileLoader +from ._bootstrap_external import SourcelessFileLoader +from ._bootstrap_external import ExtensionFileLoader + + +def all_suffixes(): + """Returns a list of all recognized module suffixes for this process""" + return SOURCE_SUFFIXES + BYTECODE_SUFFIXES + EXTENSION_SUFFIXES diff --git a/env/Lib/importlib/resources.py b/env/Lib/importlib/resources.py new file mode 100644 index 0000000..cbefdd5 --- /dev/null +++ b/env/Lib/importlib/resources.py @@ -0,0 +1,343 @@ +import os +import tempfile + +from . import abc as resources_abc +from contextlib import contextmanager, suppress +from importlib import import_module +from importlib.abc import ResourceLoader +from io import BytesIO, TextIOWrapper +from pathlib import Path +from types import ModuleType +from typing import Iterable, Iterator, Optional, Set, Union # noqa: F401 +from typing import cast +from typing.io import BinaryIO, TextIO +from zipimport import ZipImportError + + +__all__ = [ + 'Package', + 'Resource', + 'contents', + 'is_resource', + 'open_binary', + 'open_text', + 'path', + 'read_binary', + 'read_text', + ] + + +Package = Union[str, ModuleType] +Resource = Union[str, os.PathLike] + + +def _get_package(package) -> ModuleType: + """Take a package name or module object and return the module. + + If a name, the module is imported. If the passed or imported module + object is not a package, raise an exception. + """ + if hasattr(package, '__spec__'): + if package.__spec__.submodule_search_locations is None: + raise TypeError('{!r} is not a package'.format( + package.__spec__.name)) + else: + return package + else: + module = import_module(package) + if module.__spec__.submodule_search_locations is None: + raise TypeError('{!r} is not a package'.format(package)) + else: + return module + + +def _normalize_path(path) -> str: + """Normalize a path by ensuring it is a string. + + If the resulting string contains path separators, an exception is raised. + """ + parent, file_name = os.path.split(path) + if parent: + raise ValueError('{!r} must be only a file name'.format(path)) + else: + return file_name + + +def _get_resource_reader( + package: ModuleType) -> Optional[resources_abc.ResourceReader]: + # Return the package's loader if it's a ResourceReader. We can't use + # a issubclass() check here because apparently abc.'s __subclasscheck__() + # hook wants to create a weak reference to the object, but + # zipimport.zipimporter does not support weak references, resulting in a + # TypeError. That seems terrible. + spec = package.__spec__ + if hasattr(spec.loader, 'get_resource_reader'): + return cast(resources_abc.ResourceReader, + spec.loader.get_resource_reader(spec.name)) + return None + + +def _check_location(package): + if package.__spec__.origin is None or not package.__spec__.has_location: + raise FileNotFoundError(f'Package has no location {package!r}') + + +def open_binary(package: Package, resource: Resource) -> BinaryIO: + """Return a file-like object opened for binary reading of the resource.""" + resource = _normalize_path(resource) + package = _get_package(package) + reader = _get_resource_reader(package) + if reader is not None: + return reader.open_resource(resource) + _check_location(package) + absolute_package_path = os.path.abspath(package.__spec__.origin) + package_path = os.path.dirname(absolute_package_path) + full_path = os.path.join(package_path, resource) + try: + return open(full_path, mode='rb') + except OSError: + # Just assume the loader is a resource loader; all the relevant + # importlib.machinery loaders are and an AttributeError for + # get_data() will make it clear what is needed from the loader. + loader = cast(ResourceLoader, package.__spec__.loader) + data = None + if hasattr(package.__spec__.loader, 'get_data'): + with suppress(OSError): + data = loader.get_data(full_path) + if data is None: + package_name = package.__spec__.name + message = '{!r} resource not found in {!r}'.format( + resource, package_name) + raise FileNotFoundError(message) + else: + return BytesIO(data) + + +def open_text(package: Package, + resource: Resource, + encoding: str = 'utf-8', + errors: str = 'strict') -> TextIO: + """Return a file-like object opened for text reading of the resource.""" + resource = _normalize_path(resource) + package = _get_package(package) + reader = _get_resource_reader(package) + if reader is not None: + return TextIOWrapper(reader.open_resource(resource), encoding, errors) + _check_location(package) + absolute_package_path = os.path.abspath(package.__spec__.origin) + package_path = os.path.dirname(absolute_package_path) + full_path = os.path.join(package_path, resource) + try: + return open(full_path, mode='r', encoding=encoding, errors=errors) + except OSError: + # Just assume the loader is a resource loader; all the relevant + # importlib.machinery loaders are and an AttributeError for + # get_data() will make it clear what is needed from the loader. + loader = cast(ResourceLoader, package.__spec__.loader) + data = None + if hasattr(package.__spec__.loader, 'get_data'): + with suppress(OSError): + data = loader.get_data(full_path) + if data is None: + package_name = package.__spec__.name + message = '{!r} resource not found in {!r}'.format( + resource, package_name) + raise FileNotFoundError(message) + else: + return TextIOWrapper(BytesIO(data), encoding, errors) + + +def read_binary(package: Package, resource: Resource) -> bytes: + """Return the binary contents of the resource.""" + resource = _normalize_path(resource) + package = _get_package(package) + with open_binary(package, resource) as fp: + return fp.read() + + +def read_text(package: Package, + resource: Resource, + encoding: str = 'utf-8', + errors: str = 'strict') -> str: + """Return the decoded string of the resource. + + The decoding-related arguments have the same semantics as those of + bytes.decode(). + """ + resource = _normalize_path(resource) + package = _get_package(package) + with open_text(package, resource, encoding, errors) as fp: + return fp.read() + + +@contextmanager +def path(package: Package, resource: Resource) -> Iterator[Path]: + """A context manager providing a file path object to the resource. + + If the resource does not already exist on its own on the file system, + a temporary file will be created. If the file was created, the file + will be deleted upon exiting the context manager (no exception is + raised if the file was deleted prior to the context manager + exiting). + """ + resource = _normalize_path(resource) + package = _get_package(package) + reader = _get_resource_reader(package) + if reader is not None: + try: + yield Path(reader.resource_path(resource)) + return + except FileNotFoundError: + pass + else: + _check_location(package) + # Fall-through for both the lack of resource_path() *and* if + # resource_path() raises FileNotFoundError. + package_directory = Path(package.__spec__.origin).parent + file_path = package_directory / resource + if file_path.exists(): + yield file_path + else: + with open_binary(package, resource) as fp: + data = fp.read() + # Not using tempfile.NamedTemporaryFile as it leads to deeper 'try' + # blocks due to the need to close the temporary file to work on + # Windows properly. + fd, raw_path = tempfile.mkstemp() + try: + os.write(fd, data) + os.close(fd) + yield Path(raw_path) + finally: + try: + os.remove(raw_path) + except FileNotFoundError: + pass + + +def is_resource(package: Package, name: str) -> bool: + """True if 'name' is a resource inside 'package'. + + Directories are *not* resources. + """ + package = _get_package(package) + _normalize_path(name) + reader = _get_resource_reader(package) + if reader is not None: + return reader.is_resource(name) + try: + package_contents = set(contents(package)) + except (NotADirectoryError, FileNotFoundError): + return False + if name not in package_contents: + return False + # Just because the given file_name lives as an entry in the package's + # contents doesn't necessarily mean it's a resource. Directories are not + # resources, so let's try to find out if it's a directory or not. + path = Path(package.__spec__.origin).parent / name + return path.is_file() + + +def contents(package: Package) -> Iterable[str]: + """Return an iterable of entries in 'package'. + + Note that not all entries are resources. Specifically, directories are + not considered resources. Use `is_resource()` on each entry returned here + to check if it is a resource or not. + """ + package = _get_package(package) + reader = _get_resource_reader(package) + if reader is not None: + return reader.contents() + # Is the package a namespace package? By definition, namespace packages + # cannot have resources. We could use _check_location() and catch the + # exception, but that's extra work, so just inline the check. + elif package.__spec__.origin is None or not package.__spec__.has_location: + return () + else: + package_directory = Path(package.__spec__.origin).parent + return os.listdir(package_directory) + + +# Private implementation of ResourceReader and get_resource_reader() called +# from zipimport.c. Don't use these directly! We're implementing these in +# Python because 1) it's easier, 2) zipimport may get rewritten in Python +# itself at some point, so doing this all in C would difficult and a waste of +# effort. + +class _ZipImportResourceReader(resources_abc.ResourceReader): + """Private class used to support ZipImport.get_resource_reader(). + + This class is allowed to reference all the innards and private parts of + the zipimporter. + """ + + def __init__(self, zipimporter, fullname): + self.zipimporter = zipimporter + self.fullname = fullname + + def open_resource(self, resource): + fullname_as_path = self.fullname.replace('.', '/') + path = f'{fullname_as_path}/{resource}' + try: + return BytesIO(self.zipimporter.get_data(path)) + except OSError: + raise FileNotFoundError(path) + + def resource_path(self, resource): + # All resources are in the zip file, so there is no path to the file. + # Raising FileNotFoundError tells the higher level API to extract the + # binary data and create a temporary file. + raise FileNotFoundError + + def is_resource(self, name): + # Maybe we could do better, but if we can get the data, it's a + # resource. Otherwise it isn't. + fullname_as_path = self.fullname.replace('.', '/') + path = f'{fullname_as_path}/{name}' + try: + self.zipimporter.get_data(path) + except OSError: + return False + return True + + def contents(self): + # This is a bit convoluted, because fullname will be a module path, + # but _files is a list of file names relative to the top of the + # archive's namespace. We want to compare file paths to find all the + # names of things inside the module represented by fullname. So we + # turn the module path of fullname into a file path relative to the + # top of the archive, and then we iterate through _files looking for + # names inside that "directory". + fullname_path = Path(self.zipimporter.get_filename(self.fullname)) + relative_path = fullname_path.relative_to(self.zipimporter.archive) + # Don't forget that fullname names a package, so its path will include + # __init__.py, which we want to ignore. + assert relative_path.name == '__init__.py' + package_path = relative_path.parent + subdirs_seen = set() + for filename in self.zipimporter._files: + try: + relative = Path(filename).relative_to(package_path) + except ValueError: + continue + # If the path of the file (which is relative to the top of the zip + # namespace), relative to the package given when the resource + # reader was created, has a parent, then it's a name in a + # subdirectory and thus we skip it. + parent_name = relative.parent.name + if len(parent_name) == 0: + yield relative.name + elif parent_name not in subdirs_seen: + subdirs_seen.add(parent_name) + yield parent_name + + +# Called from zipimport.c +def _zipimport_get_resource_reader(zipimporter, fullname): + try: + if not zipimporter.is_package(fullname): + return None + except ZipImportError: + return None + return _ZipImportResourceReader(zipimporter, fullname) diff --git a/env/Lib/importlib/util.py b/env/Lib/importlib/util.py new file mode 100644 index 0000000..201e0f4 --- /dev/null +++ b/env/Lib/importlib/util.py @@ -0,0 +1,300 @@ +"""Utility code for constructing importers, etc.""" +from . import abc +from ._bootstrap import module_from_spec +from ._bootstrap import _resolve_name +from ._bootstrap import spec_from_loader +from ._bootstrap import _find_spec +from ._bootstrap_external import MAGIC_NUMBER +from ._bootstrap_external import _RAW_MAGIC_NUMBER +from ._bootstrap_external import cache_from_source +from ._bootstrap_external import decode_source +from ._bootstrap_external import source_from_cache +from ._bootstrap_external import spec_from_file_location + +from contextlib import contextmanager +import _imp +import functools +import sys +import types +import warnings + + +def source_hash(source_bytes): + "Return the hash of *source_bytes* as used in hash-based pyc files." + return _imp.source_hash(_RAW_MAGIC_NUMBER, source_bytes) + + +def resolve_name(name, package): + """Resolve a relative module name to an absolute one.""" + if not name.startswith('.'): + return name + elif not package: + raise ValueError(f'no package specified for {repr(name)} ' + '(required for relative module names)') + level = 0 + for character in name: + if character != '.': + break + level += 1 + return _resolve_name(name[level:], package, level) + + +def _find_spec_from_path(name, path=None): + """Return the spec for the specified module. + + First, sys.modules is checked to see if the module was already imported. If + so, then sys.modules[name].__spec__ is returned. If that happens to be + set to None, then ValueError is raised. If the module is not in + sys.modules, then sys.meta_path is searched for a suitable spec with the + value of 'path' given to the finders. None is returned if no spec could + be found. + + Dotted names do not have their parent packages implicitly imported. You will + most likely need to explicitly import all parent packages in the proper + order for a submodule to get the correct spec. + + """ + if name not in sys.modules: + return _find_spec(name, path) + else: + module = sys.modules[name] + if module is None: + return None + try: + spec = module.__spec__ + except AttributeError: + raise ValueError('{}.__spec__ is not set'.format(name)) from None + else: + if spec is None: + raise ValueError('{}.__spec__ is None'.format(name)) + return spec + + +def find_spec(name, package=None): + """Return the spec for the specified module. + + First, sys.modules is checked to see if the module was already imported. If + so, then sys.modules[name].__spec__ is returned. If that happens to be + set to None, then ValueError is raised. If the module is not in + sys.modules, then sys.meta_path is searched for a suitable spec with the + value of 'path' given to the finders. None is returned if no spec could + be found. + + If the name is for submodule (contains a dot), the parent module is + automatically imported. + + The name and package arguments work the same as importlib.import_module(). + In other words, relative module names (with leading dots) work. + + """ + fullname = resolve_name(name, package) if name.startswith('.') else name + if fullname not in sys.modules: + parent_name = fullname.rpartition('.')[0] + if parent_name: + parent = __import__(parent_name, fromlist=['__path__']) + try: + parent_path = parent.__path__ + except AttributeError as e: + raise ModuleNotFoundError( + f"__path__ attribute not found on {parent_name!r} " + f"while trying to find {fullname!r}", name=fullname) from e + else: + parent_path = None + return _find_spec(fullname, parent_path) + else: + module = sys.modules[fullname] + if module is None: + return None + try: + spec = module.__spec__ + except AttributeError: + raise ValueError('{}.__spec__ is not set'.format(name)) from None + else: + if spec is None: + raise ValueError('{}.__spec__ is None'.format(name)) + return spec + + +@contextmanager +def _module_to_load(name): + is_reload = name in sys.modules + + module = sys.modules.get(name) + if not is_reload: + # This must be done before open() is called as the 'io' module + # implicitly imports 'locale' and would otherwise trigger an + # infinite loop. + module = type(sys)(name) + # This must be done before putting the module in sys.modules + # (otherwise an optimization shortcut in import.c becomes wrong) + module.__initializing__ = True + sys.modules[name] = module + try: + yield module + except Exception: + if not is_reload: + try: + del sys.modules[name] + except KeyError: + pass + finally: + module.__initializing__ = False + + +def set_package(fxn): + """Set __package__ on the returned module. + + This function is deprecated. + + """ + @functools.wraps(fxn) + def set_package_wrapper(*args, **kwargs): + warnings.warn('The import system now takes care of this automatically.', + DeprecationWarning, stacklevel=2) + module = fxn(*args, **kwargs) + if getattr(module, '__package__', None) is None: + module.__package__ = module.__name__ + if not hasattr(module, '__path__'): + module.__package__ = module.__package__.rpartition('.')[0] + return module + return set_package_wrapper + + +def set_loader(fxn): + """Set __loader__ on the returned module. + + This function is deprecated. + + """ + @functools.wraps(fxn) + def set_loader_wrapper(self, *args, **kwargs): + warnings.warn('The import system now takes care of this automatically.', + DeprecationWarning, stacklevel=2) + module = fxn(self, *args, **kwargs) + if getattr(module, '__loader__', None) is None: + module.__loader__ = self + return module + return set_loader_wrapper + + +def module_for_loader(fxn): + """Decorator to handle selecting the proper module for loaders. + + The decorated function is passed the module to use instead of the module + name. The module passed in to the function is either from sys.modules if + it already exists or is a new module. If the module is new, then __name__ + is set the first argument to the method, __loader__ is set to self, and + __package__ is set accordingly (if self.is_package() is defined) will be set + before it is passed to the decorated function (if self.is_package() does + not work for the module it will be set post-load). + + If an exception is raised and the decorator created the module it is + subsequently removed from sys.modules. + + The decorator assumes that the decorated function takes the module name as + the second argument. + + """ + warnings.warn('The import system now takes care of this automatically.', + DeprecationWarning, stacklevel=2) + @functools.wraps(fxn) + def module_for_loader_wrapper(self, fullname, *args, **kwargs): + with _module_to_load(fullname) as module: + module.__loader__ = self + try: + is_package = self.is_package(fullname) + except (ImportError, AttributeError): + pass + else: + if is_package: + module.__package__ = fullname + else: + module.__package__ = fullname.rpartition('.')[0] + # If __package__ was not set above, __import__() will do it later. + return fxn(self, module, *args, **kwargs) + + return module_for_loader_wrapper + + +class _LazyModule(types.ModuleType): + + """A subclass of the module type which triggers loading upon attribute access.""" + + def __getattribute__(self, attr): + """Trigger the load of the module and return the attribute.""" + # All module metadata must be garnered from __spec__ in order to avoid + # using mutated values. + # Stop triggering this method. + self.__class__ = types.ModuleType + # Get the original name to make sure no object substitution occurred + # in sys.modules. + original_name = self.__spec__.name + # Figure out exactly what attributes were mutated between the creation + # of the module and now. + attrs_then = self.__spec__.loader_state['__dict__'] + original_type = self.__spec__.loader_state['__class__'] + attrs_now = self.__dict__ + attrs_updated = {} + for key, value in attrs_now.items(): + # Code that set the attribute may have kept a reference to the + # assigned object, making identity more important than equality. + if key not in attrs_then: + attrs_updated[key] = value + elif id(attrs_now[key]) != id(attrs_then[key]): + attrs_updated[key] = value + self.__spec__.loader.exec_module(self) + # If exec_module() was used directly there is no guarantee the module + # object was put into sys.modules. + if original_name in sys.modules: + if id(self) != id(sys.modules[original_name]): + raise ValueError(f"module object for {original_name!r} " + "substituted in sys.modules during a lazy " + "load") + # Update after loading since that's what would happen in an eager + # loading situation. + self.__dict__.update(attrs_updated) + return getattr(self, attr) + + def __delattr__(self, attr): + """Trigger the load and then perform the deletion.""" + # To trigger the load and raise an exception if the attribute + # doesn't exist. + self.__getattribute__(attr) + delattr(self, attr) + + +class LazyLoader(abc.Loader): + + """A loader that creates a module which defers loading until attribute access.""" + + @staticmethod + def __check_eager_loader(loader): + if not hasattr(loader, 'exec_module'): + raise TypeError('loader must define exec_module()') + + @classmethod + def factory(cls, loader): + """Construct a callable which returns the eager loader made lazy.""" + cls.__check_eager_loader(loader) + return lambda *args, **kwargs: cls(loader(*args, **kwargs)) + + def __init__(self, loader): + self.__check_eager_loader(loader) + self.loader = loader + + def create_module(self, spec): + return self.loader.create_module(spec) + + def exec_module(self, module): + """Make the module load lazily.""" + module.__spec__.loader = self.loader + module.__loader__ = self.loader + # Don't need to worry about deep-copying as trying to set an attribute + # on an object would have triggered the load, + # e.g. ``module.__spec__.loader = None`` would trigger a load from + # trying to access module.__spec__. + loader_state = {} + loader_state['__dict__'] = module.__dict__.copy() + loader_state['__class__'] = module.__class__ + module.__spec__.loader_state = loader_state + module.__class__ = _LazyModule diff --git a/env/Lib/io.py b/env/Lib/io.py new file mode 100644 index 0000000..968ee50 --- /dev/null +++ b/env/Lib/io.py @@ -0,0 +1,99 @@ +"""The io module provides the Python interfaces to stream handling. The +builtin open function is defined in this module. + +At the top of the I/O hierarchy is the abstract base class IOBase. It +defines the basic interface to a stream. Note, however, that there is no +separation between reading and writing to streams; implementations are +allowed to raise an OSError if they do not support a given operation. + +Extending IOBase is RawIOBase which deals simply with the reading and +writing of raw bytes to a stream. FileIO subclasses RawIOBase to provide +an interface to OS files. + +BufferedIOBase deals with buffering on a raw byte stream (RawIOBase). Its +subclasses, BufferedWriter, BufferedReader, and BufferedRWPair buffer +streams that are readable, writable, and both respectively. +BufferedRandom provides a buffered interface to random access +streams. BytesIO is a simple stream of in-memory bytes. + +Another IOBase subclass, TextIOBase, deals with the encoding and decoding +of streams into text. TextIOWrapper, which extends it, is a buffered text +interface to a buffered raw stream (`BufferedIOBase`). Finally, StringIO +is an in-memory stream for text. + +Argument names are not part of the specification, and only the arguments +of open() are intended to be used as keyword arguments. + +data: + +DEFAULT_BUFFER_SIZE + + An int containing the default buffer size used by the module's buffered + I/O classes. open() uses the file's blksize (as obtained by os.stat) if + possible. +""" +# New I/O library conforming to PEP 3116. + +__author__ = ("Guido van Rossum , " + "Mike Verdone , " + "Mark Russell , " + "Antoine Pitrou , " + "Amaury Forgeot d'Arc , " + "Benjamin Peterson ") + +__all__ = ["BlockingIOError", "open", "IOBase", "RawIOBase", "FileIO", + "BytesIO", "StringIO", "BufferedIOBase", + "BufferedReader", "BufferedWriter", "BufferedRWPair", + "BufferedRandom", "TextIOBase", "TextIOWrapper", + "UnsupportedOperation", "SEEK_SET", "SEEK_CUR", "SEEK_END"] + + +import _io +import abc + +from _io import (DEFAULT_BUFFER_SIZE, BlockingIOError, UnsupportedOperation, + open, FileIO, BytesIO, StringIO, BufferedReader, + BufferedWriter, BufferedRWPair, BufferedRandom, + IncrementalNewlineDecoder, TextIOWrapper) + +OpenWrapper = _io.open # for compatibility with _pyio + +# Pretend this exception was created here. +UnsupportedOperation.__module__ = "io" + +# for seek() +SEEK_SET = 0 +SEEK_CUR = 1 +SEEK_END = 2 + +# Declaring ABCs in C is tricky so we do it here. +# Method descriptions and default implementations are inherited from the C +# version however. +class IOBase(_io._IOBase, metaclass=abc.ABCMeta): + __doc__ = _io._IOBase.__doc__ + +class RawIOBase(_io._RawIOBase, IOBase): + __doc__ = _io._RawIOBase.__doc__ + +class BufferedIOBase(_io._BufferedIOBase, IOBase): + __doc__ = _io._BufferedIOBase.__doc__ + +class TextIOBase(_io._TextIOBase, IOBase): + __doc__ = _io._TextIOBase.__doc__ + +RawIOBase.register(FileIO) + +for klass in (BytesIO, BufferedReader, BufferedWriter, BufferedRandom, + BufferedRWPair): + BufferedIOBase.register(klass) + +for klass in (StringIO, TextIOWrapper): + TextIOBase.register(klass) +del klass + +try: + from _io import _WindowsConsoleIO +except ImportError: + pass +else: + RawIOBase.register(_WindowsConsoleIO) diff --git a/env/Lib/keyword.py b/env/Lib/keyword.py new file mode 100644 index 0000000..431991d --- /dev/null +++ b/env/Lib/keyword.py @@ -0,0 +1,96 @@ +#! /usr/bin/env python3 + +"""Keywords (from "graminit.c") + +This file is automatically generated; please don't muck it up! + +To update the symbols in this file, 'cd' to the top directory of +the python source tree after building the interpreter and run: + + ./python Lib/keyword.py +""" + +__all__ = ["iskeyword", "kwlist"] + +kwlist = [ +#--start keywords-- + 'False', + 'None', + 'True', + 'and', + 'as', + 'assert', + 'async', + 'await', + 'break', + 'class', + 'continue', + 'def', + 'del', + 'elif', + 'else', + 'except', + 'finally', + 'for', + 'from', + 'global', + 'if', + 'import', + 'in', + 'is', + 'lambda', + 'nonlocal', + 'not', + 'or', + 'pass', + 'raise', + 'return', + 'try', + 'while', + 'with', + 'yield', +#--end keywords-- + ] + +iskeyword = frozenset(kwlist).__contains__ + +def main(): + import sys, re + + args = sys.argv[1:] + iptfile = args and args[0] or "Python/graminit.c" + if len(args) > 1: optfile = args[1] + else: optfile = "Lib/keyword.py" + + # load the output skeleton from the target, taking care to preserve its + # newline convention. + with open(optfile, newline='') as fp: + format = fp.readlines() + nl = format[0][len(format[0].strip()):] if format else '\n' + + # scan the source file for keywords + with open(iptfile) as fp: + strprog = re.compile('"([^"]+)"') + lines = [] + for line in fp: + if '{1, "' in line: + match = strprog.search(line) + if match: + lines.append(" '" + match.group(1) + "'," + nl) + lines.sort() + + # insert the lines of keywords into the skeleton + try: + start = format.index("#--start keywords--" + nl) + 1 + end = format.index("#--end keywords--" + nl) + format[start:end] = lines + except ValueError: + sys.stderr.write("target does not contain format markers\n") + sys.exit(1) + + # write the output file + with open(optfile, 'w', newline='') as fp: + fp.writelines(format) + +if __name__ == "__main__": + main() diff --git a/env/Lib/linecache.py b/env/Lib/linecache.py new file mode 100644 index 0000000..3afcce1 --- /dev/null +++ b/env/Lib/linecache.py @@ -0,0 +1,177 @@ +"""Cache lines from Python source 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 functools +import sys +import os +import tokenize + +__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 + +# The cache. Maps filenames to either a thunk which will provide source code, +# or a tuple (size, mtime, lines, fullname) once loaded. +cache = {} + + +def clearcache(): + """Clear the cache entirely.""" + + global cache + cache = {} + + +def getlines(filename, module_globals=None): + """Get the lines for a Python source file from the cache. + Update the cache if it doesn't contain an entry for this file already.""" + + if filename in cache: + entry = cache[filename] + if len(entry) != 1: + return cache[filename][2] + + try: + return updatecache(filename, module_globals) + except MemoryError: + clearcache() + return [] + + +def checkcache(filename=None): + """Discard cache entries that are out of date. + (This is not checked upon each call!)""" + + if filename is None: + filenames = list(cache.keys()) + else: + if filename in cache: + filenames = [filename] + else: + return + + for filename in filenames: + entry = cache[filename] + if len(entry) == 1: + # lazy cache entry, leave it lazy. + continue + size, mtime, lines, fullname = entry + if mtime is None: + continue # no-op for files loaded via a __loader__ + try: + stat = os.stat(fullname) + except OSError: + 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: + if len(cache[filename]) != 1: + del cache[filename] + if not filename or (filename.startswith('<') and filename.endswith('>')): + return [] + + fullname = filename + try: + stat = os.stat(fullname) + except OSError: + basename = filename + + # Realise a lazy loader based lookup if there is one + # otherwise try to lookup right now. + if lazycache(filename, module_globals): + try: + data = cache[filename][0]() + except (ImportError, OSError): + 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: + 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 OSError: + pass + else: + return [] + try: + with tokenize.open(fullname) as fp: + lines = fp.readlines() + except OSError: + 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 + + +def lazycache(filename, module_globals): + """Seed the cache for filename with module_globals. + + The module loader will be asked for the source only when getlines is + called, not immediately. + + If there is an entry in the cache already, it is not altered. + + :return: True if a lazy load is registered in the cache, + otherwise False. To register such a load a module loader with a + get_source method must be found, the filename must be a cachable + filename, and the filename must not be already cached. + """ + if filename in cache: + if len(cache[filename]) == 1: + return True + else: + return False + if not filename or (filename.startswith('<') and filename.endswith('>')): + return False + # 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: + get_lines = functools.partial(get_source, name) + cache[filename] = (get_lines,) + return True + return False diff --git a/env/Lib/locale.py b/env/Lib/locale.py new file mode 100644 index 0000000..f3d3973 --- /dev/null +++ b/env/Lib/locale.py @@ -0,0 +1,1749 @@ +"""Locale support module. + +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 _collections_abc +from builtins import str as _builtin_str +import functools + +# 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"] + +def _strcoll(a,b): + """ strcoll(string,string) -> int. + Compares two strings according to the locale. + """ + return (a > b) - (a < b) + +def _strxfrm(s): + """ strxfrm(string) -> string. + Returns a string that behaves for cmp locale-aware. + """ + return s + +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' + +# These may or may not exist in _locale, so be sure to set them. +if 'strxfrm' not in globals(): + strxfrm = _strxfrm +if 'strcoll' not in globals(): + strcoll = _strcoll + + +_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): + 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, monetary=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. + Conversion uses monetary thousands separator and grouping strings if + forth parameter monetary is true.""" + percents = list(_percent_re.finditer(f)) + new_f = _percent_re.sub('%s', f) + + if isinstance(val, _collections_abc.Mapping): + new_val = [] + for perc in percents: + if perc.group()[-1]=='%': + new_val.append('%') + else: + new_val.append(_format(perc.group(), val, grouping, monetary)) + 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, + monetary, + *val[i+1:i+1+starcount])) + i += (1 + starcount) + val = tuple(new_val) + + return new_f % val + +def format(percent, value, grouping=False, monetary=False, *additional): + """Deprecated, use format_string instead.""" + import warnings + warnings.warn( + "This method will be removed in a future version of Python. " + "Use 'locale.format_string()' instead.", + DeprecationWarning, stacklevel=2 + ) + + 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 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 string, taking the locale into account.""" + return _format("%.12g", val) + +def delocalize(string): + "Parses a string as a normalized number according to the locale settings." + + conv = localeconv() + + #First, get rid of the grouping + ts = conv['thousands_sep'] + if ts: + string = string.replace(ts, '') + + #next, replace the decimal point with a dot + dd = conv['decimal_point'] + if dd: + string = string.replace(dd, '.') + return string + +def atof(string, func=float): + "Parses a string as a float according to the locale settings." + return func(delocalize(string)) + +def atoi(string): + "Converts a string to an integer according to the locale settings." + return int(delocalize(string)) + +def _test(): + setlocale(LC_ALL, "") + #do grouping + s1 = format_string("%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 + +def _replace_encoding(code, encoding): + if '.' in code: + langname = code[:code.index('.')] + else: + langname = code + # 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.lower(), + norm_encoding) + #print('aliased encoding: %r' % norm_encoding) + encoding = norm_encoding + norm_encoding = norm_encoding.lower() + if norm_encoding in locale_encoding_alias: + encoding = locale_encoding_alias[norm_encoding] + else: + norm_encoding = norm_encoding.replace('_', '') + norm_encoding = norm_encoding.replace('-', '') + if norm_encoding in locale_encoding_alias: + encoding = locale_encoding_alias[norm_encoding] + #print('found encoding %r' % encoding) + return langname + '.' + encoding + +def _append_modifier(code, modifier): + if modifier == 'euro': + if '.' not in code: + return code + '.ISO8859-15' + _, _, encoding = code.partition('.') + if encoding in ('ISO8859-15', 'UTF-8'): + return code + if encoding == 'ISO8859-1': + return _replace_encoding(code, 'ISO8859-15') + return code + '@' + modifier + +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 and modifier + code = localename.lower() + if ':' in code: + # ':' is sometimes used as encoding delimiter. + code = code.replace(':', '.') + if '@' in code: + code, modifier = code.split('@', 1) + else: + modifier = '' + if '.' in code: + langname, encoding = code.split('.')[:2] + else: + langname = code + encoding = '' + + # First lookup: fullname (possibly with encoding and modifier) + lang_enc = langname + if encoding: + norm_encoding = encoding.replace('-', '') + norm_encoding = norm_encoding.replace('_', '') + lang_enc += '.' + norm_encoding + lookup_name = lang_enc + if modifier: + lookup_name += '@' + modifier + code = locale_alias.get(lookup_name, None) + if code is not None: + return code + #print('first lookup failed') + + if modifier: + # Second try: fullname without modifier (possibly with encoding) + code = locale_alias.get(lang_enc, None) + if code is not None: + #print('lookup without modifier succeeded') + if '@' not in code: + return _append_modifier(code, modifier) + if code.split('@', 1)[1].lower() == modifier: + return code + #print('second lookup failed') + + if encoding: + # Third try: langname (without encoding, possibly with modifier) + lookup_name = langname + if modifier: + lookup_name += '@' + modifier + code = locale_alias.get(lookup_name, None) + if code is not None: + #print('lookup without encoding succeeded') + if '@' not in code: + return _replace_encoding(code, encoding) + code, modifier = code.split('@', 1) + return _replace_encoding(code, encoding) + '@' + modifier + + if modifier: + # Fourth try: langname (without encoding and modifier) + code = locale_alias.get(langname, None) + if code is not None: + #print('lookup without modifier and encoding succeeded') + if '@' not in code: + code = _replace_encoding(code, encoding) + return _append_modifier(code, modifier) + code, defmod = code.split('@', 1) + if defmod.lower() == modifier: + return _replace_encoding(code, encoding) + '@' + defmod + + 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('@', 1) + 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. + + """ + try: + language, encoding = localetuple + + if language is None: + language = 'C' + if encoding is None: + return language + else: + return language + '.' + encoding + except (TypeError, ValueError): + raise TypeError('Locale must be None, a string, or an iterable of ' + 'two strings -- language code, encoding.') from None + +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 not isinstance(locale, _builtin_str): + # 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.""" + if sys.flags.utf8_mode: + return 'UTF-8' + import _bootlocale + return _bootlocale.getpreferredencoding(False) +else: + # On Unix, if CODESET is available, use that. + try: + CODESET + except NameError: + if hasattr(sys, 'getandroidapilevel'): + # On Android langinfo.h and CODESET are missing, and UTF-8 is + # always used in mbstowcs() and wcstombs(). + def getpreferredencoding(do_setlocale = True): + return 'UTF-8' + else: + # 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.""" + if sys.flags.utf8_mode: + return 'UTF-8' + res = getdefaultlocale()[1] + if res is None: + # LANG not set, default conservatively to ASCII + res = 'ascii' + return res + else: + def getpreferredencoding(do_setlocale = True): + """Return the charset that the user is likely using, + according to the system configuration.""" + if sys.flags.utf8_mode: + return 'UTF-8' + import _bootlocale + if do_setlocale: + oldloc = setlocale(LC_CTYPE) + try: + setlocale(LC_CTYPE, "") + except Error: + pass + result = _bootlocale.getpreferredencoding(False) + if do_setlocale: + setlocale(LC_CTYPE, oldloc) + return result + + +### 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', + 'koi8c': 'KOI8-C', + 'microsoftcp1251': 'CP1251', + 'microsoftcp1255': 'CP1255', + 'microsoftcp1256': 'CP1256', + '88591': 'ISO8859-1', + '88592': 'ISO8859-2', + '88595': 'ISO8859-5', + '885915': 'ISO8859-15', + + # 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_t': 'KOI8-T', + 'koi8_u': 'KOI8-U', + 'kz1048': 'RK1048', + 'cp1251': 'CP1251', + 'cp1255': 'CP1255', + 'cp1256': 'CP1256', + + # XXX This list is still incomplete. If you know more + # mappings, please file a bug report. Thanks. +} + +for k, v in sorted(locale_encoding_alias.items()): + k = k.replace('_', '') + locale_encoding_alias.setdefault(k, v) + +# +# 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' +# +# SS 2013-12-20: +# 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 3.3.3 +# and older): +# +# updated 'a3' -> 'a3_AZ.KOI8-C' to 'az_AZ.KOI8-C' +# updated 'a3_az' -> 'a3_AZ.KOI8-C' to 'az_AZ.KOI8-C' +# updated 'a3_az.koi8c' -> 'a3_AZ.KOI8-C' to 'az_AZ.KOI8-C' +# updated 'cs_cs.iso88592' -> 'cs_CS.ISO8859-2' to 'cs_CZ.ISO8859-2' +# updated 'hebrew' -> 'iw_IL.ISO8859-8' to 'he_IL.ISO8859-8' +# updated 'hebrew.iso88598' -> 'iw_IL.ISO8859-8' to 'he_IL.ISO8859-8' +# updated 'sd' -> 'sd_IN@devanagari.UTF-8' to 'sd_IN.UTF-8' +# updated 'sr@latn' -> 'sr_RS.UTF-8@latin' to 'sr_CS.UTF-8@latin' +# updated 'sr_cs' -> 'sr_RS.UTF-8' to 'sr_CS.UTF-8' +# updated 'sr_cs.utf8@latn' -> 'sr_RS.UTF-8@latin' to 'sr_CS.UTF-8@latin' +# updated 'sr_cs@latn' -> 'sr_RS.UTF-8@latin' to 'sr_CS.UTF-8@latin' +# +# SS 2014-10-01: +# Updated alias mapping with glibc 2.19 supported locales. +# +# SS 2018-05-05: +# Updated alias mapping with glibc 2.27 supported locales. +# +# These are the differences compared to the old mapping (Python 3.6.5 +# and older): +# +# updated 'ca_es@valencia' -> 'ca_ES.ISO8859-15@valencia' to 'ca_ES.UTF-8@valencia' +# updated 'kk_kz' -> 'kk_KZ.RK1048' to 'kk_KZ.ptcp154' +# updated 'russian' -> 'ru_RU.ISO8859-5' to 'ru_RU.KOI8-R' + +locale_alias = { + 'a3': 'az_AZ.KOI8-C', + 'a3_az': 'az_AZ.KOI8-C', + 'a3_az.koic': 'az_AZ.KOI8-C', + 'aa_dj': 'aa_DJ.ISO8859-1', + 'aa_er': 'aa_ER.UTF-8', + 'aa_et': 'aa_ET.UTF-8', + 'af': 'af_ZA.ISO8859-1', + 'af_za': 'af_ZA.ISO8859-1', + 'agr_pe': 'agr_PE.UTF-8', + 'ak_gh': 'ak_GH.UTF-8', + 'am': 'am_ET.UTF-8', + 'am_et': 'am_ET.UTF-8', + 'american': 'en_US.ISO8859-1', + 'an_es': 'an_ES.ISO8859-15', + 'anp_in': 'anp_IN.UTF-8', + 'ar': 'ar_AA.ISO8859-6', + 'ar_aa': 'ar_AA.ISO8859-6', + 'ar_ae': 'ar_AE.ISO8859-6', + 'ar_bh': 'ar_BH.ISO8859-6', + 'ar_dz': 'ar_DZ.ISO8859-6', + 'ar_eg': 'ar_EG.ISO8859-6', + 'ar_in': 'ar_IN.UTF-8', + 'ar_iq': 'ar_IQ.ISO8859-6', + 'ar_jo': 'ar_JO.ISO8859-6', + 'ar_kw': 'ar_KW.ISO8859-6', + 'ar_lb': 'ar_LB.ISO8859-6', + 'ar_ly': 'ar_LY.ISO8859-6', + 'ar_ma': 'ar_MA.ISO8859-6', + 'ar_om': 'ar_OM.ISO8859-6', + 'ar_qa': 'ar_QA.ISO8859-6', + 'ar_sa': 'ar_SA.ISO8859-6', + 'ar_sd': 'ar_SD.ISO8859-6', + 'ar_ss': 'ar_SS.UTF-8', + 'ar_sy': 'ar_SY.ISO8859-6', + 'ar_tn': 'ar_TN.ISO8859-6', + 'ar_ye': 'ar_YE.ISO8859-6', + 'arabic': 'ar_AA.ISO8859-6', + 'as': 'as_IN.UTF-8', + 'as_in': 'as_IN.UTF-8', + 'ast_es': 'ast_ES.ISO8859-15', + 'ayc_pe': 'ayc_PE.UTF-8', + 'az': 'az_AZ.ISO8859-9E', + 'az_az': 'az_AZ.ISO8859-9E', + 'az_az.iso88599e': 'az_AZ.ISO8859-9E', + 'az_ir': 'az_IR.UTF-8', + 'be': 'be_BY.CP1251', + 'be@latin': 'be_BY.UTF-8@latin', + 'be_bg.utf8': 'bg_BG.UTF-8', + 'be_by': 'be_BY.CP1251', + 'be_by@latin': 'be_BY.UTF-8@latin', + 'bem_zm': 'bem_ZM.UTF-8', + 'ber_dz': 'ber_DZ.UTF-8', + 'ber_ma': 'ber_MA.UTF-8', + 'bg': 'bg_BG.CP1251', + 'bg_bg': 'bg_BG.CP1251', + 'bhb_in.utf8': 'bhb_IN.UTF-8', + 'bho_in': 'bho_IN.UTF-8', + 'bho_np': 'bho_NP.UTF-8', + 'bi_vu': 'bi_VU.UTF-8', + 'bn_bd': 'bn_BD.UTF-8', + 'bn_in': 'bn_IN.UTF-8', + 'bo_cn': 'bo_CN.UTF-8', + 'bo_in': 'bo_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', + 'brx_in': 'brx_IN.UTF-8', + 'bs': 'bs_BA.ISO8859-2', + 'bs_ba': 'bs_BA.ISO8859-2', + 'bulgarian': 'bg_BG.CP1251', + 'byn_er': 'byn_ER.UTF-8', + 'c': 'C', + 'c-french': 'fr_CA.ISO8859-1', + 'c.ascii': 'C', + 'c.en': 'C', + 'c.iso88591': 'en_US.ISO8859-1', + 'c.utf8': 'en_US.UTF-8', + 'c_c': 'C', + 'c_c.c': 'C', + 'ca': 'ca_ES.ISO8859-1', + 'ca_ad': 'ca_AD.ISO8859-1', + 'ca_es': 'ca_ES.ISO8859-1', + 'ca_es@valencia': 'ca_ES.UTF-8@valencia', + 'ca_fr': 'ca_FR.ISO8859-1', + 'ca_it': 'ca_IT.ISO8859-1', + 'catalan': 'ca_ES.ISO8859-1', + 'ce_ru': 'ce_RU.UTF-8', + 'cextend': 'en_US.ISO8859-1', + 'chinese-s': 'zh_CN.eucCN', + 'chinese-t': 'zh_TW.eucTW', + 'chr_us': 'chr_US.UTF-8', + 'ckb_iq': 'ckb_IQ.UTF-8', + 'cmn_tw': 'cmn_TW.UTF-8', + 'crh_ua': 'crh_UA.UTF-8', + 'croatian': 'hr_HR.ISO8859-2', + 'cs': 'cs_CZ.ISO8859-2', + 'cs_cs': 'cs_CZ.ISO8859-2', + 'cs_cz': 'cs_CZ.ISO8859-2', + 'csb_pl': 'csb_PL.UTF-8', + 'cv_ru': 'cv_RU.UTF-8', + 'cy': 'cy_GB.ISO8859-1', + 'cy_gb': 'cy_GB.ISO8859-1', + 'cz': 'cs_CZ.ISO8859-2', + 'cz_cz': 'cs_CZ.ISO8859-2', + 'czech': 'cs_CZ.ISO8859-2', + 'da': 'da_DK.ISO8859-1', + 'da_dk': 'da_DK.ISO8859-1', + 'danish': 'da_DK.ISO8859-1', + 'dansk': 'da_DK.ISO8859-1', + 'de': 'de_DE.ISO8859-1', + 'de_at': 'de_AT.ISO8859-1', + 'de_be': 'de_BE.ISO8859-1', + 'de_ch': 'de_CH.ISO8859-1', + 'de_de': 'de_DE.ISO8859-1', + 'de_it': 'de_IT.ISO8859-1', + 'de_li.utf8': 'de_LI.UTF-8', + 'de_lu': 'de_LU.ISO8859-1', + 'deutsch': 'de_DE.ISO8859-1', + 'doi_in': 'doi_IN.UTF-8', + 'dutch': 'nl_NL.ISO8859-1', + 'dutch.iso88591': 'nl_BE.ISO8859-1', + 'dv_mv': 'dv_MV.UTF-8', + 'dz_bt': 'dz_BT.UTF-8', + 'ee': 'ee_EE.ISO8859-4', + 'ee_ee': 'ee_EE.ISO8859-4', + 'eesti': 'et_EE.ISO8859-1', + 'el': 'el_GR.ISO8859-7', + 'el_cy': 'el_CY.ISO8859-7', + 'el_gr': 'el_GR.ISO8859-7', + 'el_gr@euro': 'el_GR.ISO8859-15', + 'en': 'en_US.ISO8859-1', + 'en_ag': 'en_AG.UTF-8', + 'en_au': 'en_AU.ISO8859-1', + 'en_be': 'en_BE.ISO8859-1', + 'en_bw': 'en_BW.ISO8859-1', + 'en_ca': 'en_CA.ISO8859-1', + 'en_dk': 'en_DK.ISO8859-1', + 'en_dl.utf8': 'en_DL.UTF-8', + 'en_gb': 'en_GB.ISO8859-1', + 'en_hk': 'en_HK.ISO8859-1', + 'en_ie': 'en_IE.ISO8859-1', + 'en_il': 'en_IL.UTF-8', + 'en_in': 'en_IN.ISO8859-1', + 'en_ng': 'en_NG.UTF-8', + 'en_nz': 'en_NZ.ISO8859-1', + 'en_ph': 'en_PH.ISO8859-1', + 'en_sc.utf8': 'en_SC.UTF-8', + 'en_sg': 'en_SG.ISO8859-1', + 'en_uk': 'en_GB.ISO8859-1', + 'en_us': 'en_US.ISO8859-1', + 'en_us@euro@euro': 'en_US.ISO8859-15', + 'en_za': 'en_ZA.ISO8859-1', + 'en_zm': 'en_ZM.UTF-8', + 'en_zw': 'en_ZW.ISO8859-1', + 'en_zw.utf8': 'en_ZS.UTF-8', + 'eng_gb': 'en_GB.ISO8859-1', + 'english': 'en_EN.ISO8859-1', + 'english.iso88591': 'en_US.ISO8859-1', + 'english_uk': 'en_GB.ISO8859-1', + 'english_united-states': 'en_US.ISO8859-1', + 'english_united-states.437': 'C', + 'english_us': 'en_US.ISO8859-1', + 'eo': 'eo_XX.ISO8859-3', + 'eo.utf8': 'eo.UTF-8', + 'eo_eo': 'eo_EO.ISO8859-3', + 'eo_us.utf8': 'eo_US.UTF-8', + 'eo_xx': 'eo_XX.ISO8859-3', + 'es': 'es_ES.ISO8859-1', + 'es_ar': 'es_AR.ISO8859-1', + 'es_bo': 'es_BO.ISO8859-1', + 'es_cl': 'es_CL.ISO8859-1', + 'es_co': 'es_CO.ISO8859-1', + 'es_cr': 'es_CR.ISO8859-1', + 'es_cu': 'es_CU.UTF-8', + 'es_do': 'es_DO.ISO8859-1', + 'es_ec': 'es_EC.ISO8859-1', + 'es_es': 'es_ES.ISO8859-1', + 'es_gt': 'es_GT.ISO8859-1', + 'es_hn': 'es_HN.ISO8859-1', + 'es_mx': 'es_MX.ISO8859-1', + 'es_ni': 'es_NI.ISO8859-1', + 'es_pa': 'es_PA.ISO8859-1', + 'es_pe': 'es_PE.ISO8859-1', + 'es_pr': 'es_PR.ISO8859-1', + 'es_py': 'es_PY.ISO8859-1', + 'es_sv': 'es_SV.ISO8859-1', + 'es_us': 'es_US.ISO8859-1', + 'es_uy': 'es_UY.ISO8859-1', + 'es_ve': 'es_VE.ISO8859-1', + 'estonian': 'et_EE.ISO8859-1', + 'et': 'et_EE.ISO8859-15', + 'et_ee': 'et_EE.ISO8859-15', + 'eu': 'eu_ES.ISO8859-1', + 'eu_es': 'eu_ES.ISO8859-1', + 'eu_fr': 'eu_FR.ISO8859-1', + 'fa': 'fa_IR.UTF-8', + 'fa_ir': 'fa_IR.UTF-8', + 'fa_ir.isiri3342': 'fa_IR.ISIRI-3342', + 'ff_sn': 'ff_SN.UTF-8', + 'fi': 'fi_FI.ISO8859-15', + 'fi_fi': 'fi_FI.ISO8859-15', + 'fil_ph': 'fil_PH.UTF-8', + 'finnish': 'fi_FI.ISO8859-1', + 'fo': 'fo_FO.ISO8859-1', + 'fo_fo': 'fo_FO.ISO8859-1', + 'fr': 'fr_FR.ISO8859-1', + 'fr_be': 'fr_BE.ISO8859-1', + 'fr_ca': 'fr_CA.ISO8859-1', + 'fr_ch': 'fr_CH.ISO8859-1', + 'fr_fr': 'fr_FR.ISO8859-1', + 'fr_lu': 'fr_LU.ISO8859-1', + 'fran\xe7ais': 'fr_FR.ISO8859-1', + 'fre_fr': 'fr_FR.ISO8859-1', + 'french': 'fr_FR.ISO8859-1', + 'french.iso88591': 'fr_CH.ISO8859-1', + 'french_france': 'fr_FR.ISO8859-1', + 'fur_it': 'fur_IT.UTF-8', + 'fy_de': 'fy_DE.UTF-8', + 'fy_nl': 'fy_NL.UTF-8', + 'ga': 'ga_IE.ISO8859-1', + 'ga_ie': 'ga_IE.ISO8859-1', + 'galego': 'gl_ES.ISO8859-1', + 'galician': 'gl_ES.ISO8859-1', + 'gd': 'gd_GB.ISO8859-1', + 'gd_gb': 'gd_GB.ISO8859-1', + 'ger_de': 'de_DE.ISO8859-1', + 'german': 'de_DE.ISO8859-1', + 'german.iso88591': 'de_CH.ISO8859-1', + 'german_germany': 'de_DE.ISO8859-1', + 'gez_er': 'gez_ER.UTF-8', + 'gez_et': 'gez_ET.UTF-8', + 'gl': 'gl_ES.ISO8859-1', + 'gl_es': 'gl_ES.ISO8859-1', + 'greek': 'el_GR.ISO8859-7', + 'gu_in': 'gu_IN.UTF-8', + 'gv': 'gv_GB.ISO8859-1', + 'gv_gb': 'gv_GB.ISO8859-1', + 'ha_ng': 'ha_NG.UTF-8', + 'hak_tw': 'hak_TW.UTF-8', + 'he': 'he_IL.ISO8859-8', + 'he_il': 'he_IL.ISO8859-8', + 'hebrew': 'he_IL.ISO8859-8', + 'hi': 'hi_IN.ISCII-DEV', + 'hi_in': 'hi_IN.ISCII-DEV', + 'hi_in.isciidev': 'hi_IN.ISCII-DEV', + 'hif_fj': 'hif_FJ.UTF-8', + 'hne': 'hne_IN.UTF-8', + 'hne_in': 'hne_IN.UTF-8', + 'hr': 'hr_HR.ISO8859-2', + 'hr_hr': 'hr_HR.ISO8859-2', + 'hrvatski': 'hr_HR.ISO8859-2', + 'hsb_de': 'hsb_DE.ISO8859-2', + 'ht_ht': 'ht_HT.UTF-8', + 'hu': 'hu_HU.ISO8859-2', + 'hu_hu': 'hu_HU.ISO8859-2', + 'hungarian': 'hu_HU.ISO8859-2', + 'hy_am': 'hy_AM.UTF-8', + 'hy_am.armscii8': 'hy_AM.ARMSCII_8', + 'ia': 'ia.UTF-8', + 'ia_fr': 'ia_FR.UTF-8', + 'icelandic': 'is_IS.ISO8859-1', + 'id': 'id_ID.ISO8859-1', + 'id_id': 'id_ID.ISO8859-1', + 'ig_ng': 'ig_NG.UTF-8', + 'ik_ca': 'ik_CA.UTF-8', + 'in': 'id_ID.ISO8859-1', + 'in_id': 'id_ID.ISO8859-1', + 'is': 'is_IS.ISO8859-1', + 'is_is': 'is_IS.ISO8859-1', + '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_ch': 'it_CH.ISO8859-1', + 'it_it': 'it_IT.ISO8859-1', + 'italian': '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.utf8': 'iw_IL.UTF-8', + 'ja': 'ja_JP.eucJP', + 'ja_jp': 'ja_JP.eucJP', + 'ja_jp.euc': 'ja_JP.eucJP', + 'ja_jp.mscode': 'ja_JP.SJIS', + 'ja_jp.pck': 'ja_JP.SJIS', + 'japan': 'ja_JP.eucJP', + 'japanese': 'ja_JP.eucJP', + 'japanese-euc': 'ja_JP.eucJP', + 'japanese.euc': 'ja_JP.eucJP', + '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', + 'kab_dz': 'kab_DZ.UTF-8', + 'kk_kz': 'kk_KZ.ptcp154', + 'kl': 'kl_GL.ISO8859-1', + 'kl_gl': 'kl_GL.ISO8859-1', + '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', + 'kok_in': 'kok_IN.UTF-8', + 'korean': 'ko_KR.eucKR', + 'korean.euc': 'ko_KR.eucKR', + 'ks': 'ks_IN.UTF-8', + 'ks_in': 'ks_IN.UTF-8', + 'ks_in@devanagari.utf8': 'ks_IN.UTF-8@devanagari', + 'ku_tr': 'ku_TR.ISO8859-9', + 'kw': 'kw_GB.ISO8859-1', + 'kw_gb': 'kw_GB.ISO8859-1', + 'ky': 'ky_KG.UTF-8', + 'ky_kg': 'ky_KG.UTF-8', + 'lb_lu': 'lb_LU.UTF-8', + 'lg_ug': 'lg_UG.ISO8859-10', + 'li_be': 'li_BE.UTF-8', + 'li_nl': 'li_NL.UTF-8', + 'lij_it': 'lij_IT.UTF-8', + 'lithuanian': 'lt_LT.ISO8859-13', + 'ln_cd': 'ln_CD.UTF-8', + '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', + 'lv': 'lv_LV.ISO8859-13', + 'lv_lv': 'lv_LV.ISO8859-13', + 'lzh_tw': 'lzh_TW.UTF-8', + 'mag_in': 'mag_IN.UTF-8', + 'mai': 'mai_IN.UTF-8', + 'mai_in': 'mai_IN.UTF-8', + 'mai_np': 'mai_NP.UTF-8', + 'mfe_mu': 'mfe_MU.UTF-8', + 'mg_mg': 'mg_MG.ISO8859-15', + 'mhr_ru': 'mhr_RU.UTF-8', + 'mi': 'mi_NZ.ISO8859-1', + 'mi_nz': 'mi_NZ.ISO8859-1', + 'miq_ni': 'miq_NI.UTF-8', + 'mjw_in': 'mjw_IN.UTF-8', + 'mk': 'mk_MK.ISO8859-5', + 'mk_mk': 'mk_MK.ISO8859-5', + 'ml': 'ml_IN.UTF-8', + 'ml_in': 'ml_IN.UTF-8', + 'mn_mn': 'mn_MN.UTF-8', + 'mni_in': 'mni_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', + 'mt': 'mt_MT.ISO8859-3', + 'mt_mt': 'mt_MT.ISO8859-3', + 'my_mm': 'my_MM.UTF-8', + 'nan_tw': 'nan_TW.UTF-8', + 'nb': 'nb_NO.ISO8859-1', + 'nb_no': 'nb_NO.ISO8859-1', + 'nds_de': 'nds_DE.UTF-8', + 'nds_nl': 'nds_NL.UTF-8', + 'ne_np': 'ne_NP.UTF-8', + 'nhn_mx': 'nhn_MX.UTF-8', + 'niu_nu': 'niu_NU.UTF-8', + 'niu_nz': 'niu_NZ.UTF-8', + 'nl': 'nl_NL.ISO8859-1', + 'nl_aw': 'nl_AW.UTF-8', + 'nl_be': 'nl_BE.ISO8859-1', + 'nl_nl': 'nl_NL.ISO8859-1', + 'nn': 'nn_NO.ISO8859-1', + 'nn_no': 'nn_NO.ISO8859-1', + 'no': 'no_NO.ISO8859-1', + 'no@nynorsk': 'ny_NO.ISO8859-1', + 'no_no': 'no_NO.ISO8859-1', + 'no_no.iso88591@bokmal': 'no_NO.ISO8859-1', + 'no_no.iso88591@nynorsk': 'no_NO.ISO8859-1', + 'norwegian': 'no_NO.ISO8859-1', + 'nr': 'nr_ZA.ISO8859-1', + 'nr_za': 'nr_ZA.ISO8859-1', + 'nso': 'nso_ZA.ISO8859-15', + 'nso_za': 'nso_ZA.ISO8859-15', + 'ny': 'ny_NO.ISO8859-1', + 'ny_no': 'ny_NO.ISO8859-1', + 'nynorsk': 'nn_NO.ISO8859-1', + 'oc': 'oc_FR.ISO8859-1', + 'oc_fr': 'oc_FR.ISO8859-1', + 'om_et': 'om_ET.UTF-8', + 'om_ke': 'om_KE.ISO8859-1', + 'or': 'or_IN.UTF-8', + 'or_in': 'or_IN.UTF-8', + 'os_ru': 'os_RU.UTF-8', + 'pa': 'pa_IN.UTF-8', + 'pa_in': 'pa_IN.UTF-8', + 'pa_pk': 'pa_PK.UTF-8', + 'pap_an': 'pap_AN.UTF-8', + 'pap_aw': 'pap_AW.UTF-8', + 'pap_cw': 'pap_CW.UTF-8', + 'pd': 'pd_US.ISO8859-1', + 'pd_de': 'pd_DE.ISO8859-1', + 'pd_us': 'pd_US.ISO8859-1', + 'ph': 'ph_PH.ISO8859-1', + 'ph_ph': 'ph_PH.ISO8859-1', + 'pl': 'pl_PL.ISO8859-2', + 'pl_pl': 'pl_PL.ISO8859-2', + 'polish': 'pl_PL.ISO8859-2', + 'portuguese': 'pt_PT.ISO8859-1', + 'portuguese_brazil': 'pt_BR.ISO8859-1', + 'posix': 'C', + 'posix-utf2': 'C', + 'pp': 'pp_AN.ISO8859-1', + 'pp_an': 'pp_AN.ISO8859-1', + 'ps_af': 'ps_AF.UTF-8', + 'pt': 'pt_PT.ISO8859-1', + 'pt_br': 'pt_BR.ISO8859-1', + 'pt_pt': 'pt_PT.ISO8859-1', + 'quz_pe': 'quz_PE.UTF-8', + 'raj_in': 'raj_IN.UTF-8', + 'ro': 'ro_RO.ISO8859-2', + 'ro_ro': 'ro_RO.ISO8859-2', + 'romanian': 'ro_RO.ISO8859-2', + 'ru': 'ru_RU.UTF-8', + 'ru_ru': 'ru_RU.UTF-8', + 'ru_ua': 'ru_UA.KOI8-U', + 'rumanian': 'ro_RO.ISO8859-2', + 'russian': 'ru_RU.KOI8-R', + 'rw': 'rw_RW.ISO8859-1', + 'rw_rw': 'rw_RW.ISO8859-1', + 'sa_in': 'sa_IN.UTF-8', + 'sat_in': 'sat_IN.UTF-8', + 'sc_it': 'sc_IT.UTF-8', + 'sd': 'sd_IN.UTF-8', + 'sd_in': 'sd_IN.UTF-8', + 'sd_in@devanagari.utf8': 'sd_IN.UTF-8@devanagari', + 'sd_pk': 'sd_PK.UTF-8', + 'se_no': 'se_NO.UTF-8', + 'serbocroatian': 'sr_RS.UTF-8@latin', + 'sgs_lt': 'sgs_LT.UTF-8', + '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', + 'shn_mm': 'shn_MM.UTF-8', + 'shs_ca': 'shs_CA.UTF-8', + 'si': 'si_LK.UTF-8', + 'si_lk': 'si_LK.UTF-8', + 'sid_et': 'sid_ET.UTF-8', + 'sinhala': 'si_LK.UTF-8', + 'sk': 'sk_SK.ISO8859-2', + 'sk_sk': 'sk_SK.ISO8859-2', + 'sl': 'sl_SI.ISO8859-2', + 'sl_cs': 'sl_CS.ISO8859-2', + 'sl_si': 'sl_SI.ISO8859-2', + 'slovak': 'sk_SK.ISO8859-2', + 'slovene': 'sl_SI.ISO8859-2', + 'slovenian': 'sl_SI.ISO8859-2', + 'sm_ws': 'sm_WS.UTF-8', + 'so_dj': 'so_DJ.ISO8859-1', + 'so_et': 'so_ET.UTF-8', + 'so_ke': 'so_KE.ISO8859-1', + 'so_so': 'so_SO.ISO8859-1', + 'sp': 'sr_CS.ISO8859-5', + 'sp_yu': 'sr_CS.ISO8859-5', + 'spanish': 'es_ES.ISO8859-1', + 'spanish_spain': 'es_ES.ISO8859-1', + 'sq': 'sq_AL.ISO8859-2', + 'sq_al': 'sq_AL.ISO8859-2', + 'sq_mk': 'sq_MK.UTF-8', + 'sr': 'sr_RS.UTF-8', + 'sr@cyrillic': 'sr_RS.UTF-8', + 'sr@latn': 'sr_CS.UTF-8@latin', + 'sr_cs': 'sr_CS.UTF-8', + 'sr_cs.iso88592@latn': 'sr_CS.ISO8859-2', + 'sr_cs@latn': 'sr_CS.UTF-8@latin', + 'sr_me': 'sr_ME.UTF-8', + 'sr_rs': 'sr_RS.UTF-8', + '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': 'sr_RS.UTF-8', + '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', + 'st': 'st_ZA.ISO8859-1', + 'st_za': 'st_ZA.ISO8859-1', + 'sv': 'sv_SE.ISO8859-1', + 'sv_fi': 'sv_FI.ISO8859-1', + 'sv_se': 'sv_SE.ISO8859-1', + 'sw_ke': 'sw_KE.UTF-8', + 'sw_tz': 'sw_TZ.UTF-8', + 'swedish': 'sv_SE.ISO8859-1', + 'szl_pl': 'szl_PL.UTF-8', + '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', + 'ta_lk': 'ta_LK.UTF-8', + 'tcy_in.utf8': 'tcy_IN.UTF-8', + 'te': 'te_IN.UTF-8', + 'te_in': 'te_IN.UTF-8', + 'tg': 'tg_TJ.KOI8-C', + 'tg_tj': 'tg_TJ.KOI8-C', + 'th': 'th_TH.ISO8859-11', + 'th_th': 'th_TH.ISO8859-11', + 'th_th.tactis': 'th_TH.TIS620', + 'th_th.tis620': 'th_TH.TIS620', + 'thai': 'th_TH.ISO8859-11', + 'the_np': 'the_NP.UTF-8', + 'ti_er': 'ti_ER.UTF-8', + 'ti_et': 'ti_ET.UTF-8', + 'tig_er': 'tig_ER.UTF-8', + 'tk_tm': 'tk_TM.UTF-8', + 'tl': 'tl_PH.ISO8859-1', + 'tl_ph': 'tl_PH.ISO8859-1', + 'tn': 'tn_ZA.ISO8859-15', + 'tn_za': 'tn_ZA.ISO8859-15', + 'to_to': 'to_TO.UTF-8', + 'tpi_pg': 'tpi_PG.UTF-8', + 'tr': 'tr_TR.ISO8859-9', + 'tr_cy': 'tr_CY.ISO8859-9', + 'tr_tr': 'tr_TR.ISO8859-9', + 'ts': 'ts_ZA.ISO8859-1', + 'ts_za': 'ts_ZA.ISO8859-1', + 'tt': 'tt_RU.TATAR-CYR', + 'tt_ru': 'tt_RU.TATAR-CYR', + 'tt_ru.tatarcyr': 'tt_RU.TATAR-CYR', + 'tt_ru@iqtelif': 'tt_RU.UTF-8@iqtelif', + 'turkish': 'tr_TR.ISO8859-9', + 'ug_cn': 'ug_CN.UTF-8', + 'uk': 'uk_UA.KOI8-U', + 'uk_ua': 'uk_UA.KOI8-U', + 'univ': 'en_US.utf', + 'universal': 'en_US.utf', + 'universal.utf8@ucs4': 'en_US.UTF-8', + 'unm_us': 'unm_US.UTF-8', + 'ur': 'ur_PK.CP1256', + 'ur_in': 'ur_IN.UTF-8', + 'ur_pk': 'ur_PK.CP1256', + 'uz': 'uz_UZ.UTF-8', + 'uz_uz': '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', + 'wae_ch': 'wae_CH.UTF-8', + 'wal_et': 'wal_ET.UTF-8', + 'wo_sn': 'wo_SN.UTF-8', + 'xh': 'xh_ZA.ISO8859-1', + 'xh_za': 'xh_ZA.ISO8859-1', + 'yi': 'yi_US.CP1255', + 'yi_us': 'yi_US.CP1255', + 'yo_ng': 'yo_NG.UTF-8', + 'yue_hk': 'yue_HK.UTF-8', + 'yuw_pg': 'yuw_PG.UTF-8', + 'zh': 'zh_CN.eucCN', + 'zh_cn': 'zh_CN.gb2312', + 'zh_cn.big5': 'zh_TW.big5', + 'zh_cn.euc': 'zh_CN.eucCN', + 'zh_hk': 'zh_HK.big5hkscs', + 'zh_hk.big5hk': 'zh_HK.big5hkscs', + 'zh_sg': 'zh_SG.GB2312', + 'zh_sg.gbk': 'zh_SG.GBK', + 'zh_tw': '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', +} + +# +# 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 - Caribbean + 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/env/Lib/no-global-site-packages.txt b/env/Lib/no-global-site-packages.txt new file mode 100644 index 0000000..e69de29 diff --git a/env/Lib/ntpath.py b/env/Lib/ntpath.py new file mode 100644 index 0000000..3c820b5 --- /dev/null +++ b/env/Lib/ntpath.py @@ -0,0 +1,669 @@ +# 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. +""" + +# strings representing various path-related bits and pieces +# These are primarily for export; internally, they are hardcoded. +# Should be set before imports for resolving cyclic dependency. +curdir = '.' +pardir = '..' +extsep = '.' +sep = '\\' +pathsep = ';' +altsep = '/' +defpath = '.;C:\\bin' +devnull = 'nul' + +import os +import sys +import stat +import genericpath +from genericpath import * + +__all__ = ["normcase","isabs","join","splitdrive","split","splitext", + "basename","dirname","commonprefix","getsize","getmtime", + "getatime","getctime", "islink","exists","lexists","isdir","isfile", + "ismount", "expanduser","expandvars","normpath","abspath", + "curdir","pardir","sep","pathsep","defpath","altsep", + "extsep","devnull","realpath","supports_unicode_filenames","relpath", + "samefile", "sameopenfile", "samestat", "commonpath"] + +def _get_bothseps(path): + if isinstance(path, bytes): + return b'\\/' + else: + return '\\/' + +# 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.""" + s = os.fspath(s) + try: + if isinstance(s, bytes): + return s.replace(b'/', b'\\').lower() + else: + return s.replace('/', '\\').lower() + except (TypeError, AttributeError): + if not isinstance(s, (bytes, str)): + raise TypeError("normcase() argument must be str or bytes, " + "not %r" % s.__class__.__name__) from None + raise + + +# Return whether a path is absolute. +# Trivial in Posix, harder on Windows. +# For Windows it is absolute if it starts with a slash or backslash (current +# volume), or if a pathname after the volume-letter-and-colon or UNC-resource +# starts with a slash or backslash. + +def isabs(s): + """Test whether a path is absolute""" + s = os.fspath(s) + s = splitdrive(s)[1] + return len(s) > 0 and s[0] in _get_bothseps(s) + + +# Join two (or more) paths. +def join(path, *paths): + path = os.fspath(path) + if isinstance(path, bytes): + sep = b'\\' + seps = b'\\/' + colon = b':' + else: + sep = '\\' + seps = '\\/' + colon = ':' + try: + if not paths: + path[:0] + sep #23780: Ensure compatible data type even if p is null. + result_drive, result_path = splitdrive(path) + for p in map(os.fspath, paths): + p_drive, p_path = splitdrive(p) + if p_path and p_path[0] in seps: + # Second path is absolute + if p_drive or not result_drive: + result_drive = p_drive + result_path = p_path + continue + elif p_drive and p_drive != result_drive: + if p_drive.lower() != result_drive.lower(): + # Different drives => ignore the first path entirely + result_drive = p_drive + result_path = p_path + continue + # Same drive in different case + result_drive = p_drive + # Second path is relative to the first + if result_path and result_path[-1] not in seps: + result_path = result_path + sep + result_path = result_path + p_path + ## add separator between UNC and non-absolute path + if (result_path and result_path[0] not in seps and + result_drive and result_drive[-1:] != colon): + return result_drive + sep + result_path + return result_drive + result_path + except (TypeError, AttributeError, BytesWarning): + genericpath._check_arg_types('join', path, *paths) + raise + + +# 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/UNC sharepoint and relative path specifiers. + Returns a 2-tuple (drive_or_unc, path); either part may be empty. + + If you assign + result = splitdrive(p) + It is always true that: + result[0] + result[1] == p + + If the path contained a drive letter, drive_or_unc will contain everything + up to and including the colon. e.g. splitdrive("c:/dir") returns ("c:", "/dir") + + If the path contained a UNC path, the drive_or_unc will contain the host name + and share up to but not including the fourth directory separator character. + e.g. splitdrive("//host/computer/dir") returns ("//host/computer", "/dir") + + Paths cannot contain both a drive letter and a UNC path. + + """ + p = os.fspath(p) + if len(p) >= 2: + if isinstance(p, bytes): + sep = b'\\' + altsep = b'/' + colon = b':' + else: + sep = '\\' + altsep = '/' + colon = ':' + normp = p.replace(altsep, sep) + if (normp[0:2] == sep*2) and (normp[2:3] != sep): + # is a UNC path: + # vvvvvvvvvvvvvvvvvvvv drive letter or UNC path + # \\machine\mountpoint\directory\etc\... + # directory ^^^^^^^^^^^^^^^ + index = normp.find(sep, 2) + if index == -1: + return p[:0], p + index2 = normp.find(sep, index + 1) + # a UNC path can't have two slashes in a row + # (after the initial two) + if index2 == index + 1: + return p[:0], p + if index2 == -1: + index2 = len(p) + return p[:index2], p[index2:] + if normp[1:2] == colon: + return p[:2], p[2:] + return p[:0], 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.""" + p = os.fspath(p) + seps = _get_bothseps(p) + d, p = splitdrive(p) + # set i to index beyond p's last slash + i = len(p) + while i and p[i-1] not in seps: + i -= 1 + head, tail = p[:i], p[i:] # now tail has no slashes + # remove trailing slashes from head, unless it's all slashes + head = head.rstrip(seps) 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): + p = os.fspath(p) + if isinstance(p, bytes): + return genericpath._splitext(p, b'\\', b'/', b'.') + else: + return genericpath._splitext(p, '\\', '/', '.') +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 os.lstat doesn't exist. + +def islink(path): + """Test whether a path is a symbolic link. + This will always return false for Windows prior to 6.0. + """ + try: + st = os.lstat(path) + except (OSError, 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: + st = os.lstat(path) + except OSError: + return False + return True + +# Is a path a mount point? +# Any drive letter root (eg c:\) +# Any share UNC (eg \\server\share) +# Any volume mounted on a filesystem folder +# +# No one method detects all three situations. Historically we've lexically +# detected drive letter roots and share UNCs. The canonical approach to +# detecting mounted volumes (querying the reparse tag) fails for the most +# common case: drive letter roots. The alternative which uses GetVolumePathName +# fails if the drive letter is the result of a SUBST. +try: + from nt import _getvolumepathname +except ImportError: + _getvolumepathname = None +def ismount(path): + """Test whether a path is a mount point (a drive root, the root of a + share, or a mounted volume)""" + path = os.fspath(path) + seps = _get_bothseps(path) + path = abspath(path) + root, rest = splitdrive(path) + if root and root[0] in seps: + return (not rest) or (rest in seps) + if rest in seps: + return True + + if _getvolumepathname: + return path.rstrip(seps) == _getvolumepathname(path).rstrip(seps) + else: + return False + + +# 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.""" + path = os.fspath(path) + if isinstance(path, bytes): + tilde = b'~' + else: + tilde = '~' + if not path.startswith(tilde): + return path + i, n = 1, len(path) + while i < n and path[i] not in _get_bothseps(path): + 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 isinstance(path, bytes): + userhome = os.fsencode(userhome) + + 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.""" + path = os.fspath(path) + if isinstance(path, bytes): + if b'$' not in path and b'%' not in path: + return path + import string + varchars = bytes(string.ascii_letters + string.digits + '_-', 'ascii') + quote = b'\'' + percent = b'%' + brace = b'{' + rbrace = b'}' + dollar = b'$' + environ = getattr(os, 'environb', None) + else: + if '$' not in path and '%' not in path: + return path + import string + varchars = string.ascii_letters + string.digits + '_-' + quote = '\'' + percent = '%' + brace = '{' + rbrace = '}' + dollar = '$' + environ = os.environ + res = path[:0] + index = 0 + pathlen = len(path) + while index < pathlen: + c = path[index:index+1] + if c == quote: # no expansion within single quotes + path = path[index + 1:] + pathlen = len(path) + try: + index = path.index(c) + res += c + path[:index + 1] + except ValueError: + res += c + path + index = pathlen - 1 + elif c == percent: # variable or '%' + if path[index + 1:index + 2] == percent: + res += c + index += 1 + else: + path = path[index+1:] + pathlen = len(path) + try: + index = path.index(percent) + except ValueError: + res += percent + path + index = pathlen - 1 + else: + var = path[:index] + try: + if environ is None: + value = os.fsencode(os.environ[os.fsdecode(var)]) + else: + value = environ[var] + except KeyError: + value = percent + var + percent + res += value + elif c == dollar: # variable or '$$' + if path[index + 1:index + 2] == dollar: + res += c + index += 1 + elif path[index + 1:index + 2] == brace: + path = path[index+2:] + pathlen = len(path) + try: + index = path.index(rbrace) + except ValueError: + res += dollar + brace + path + index = pathlen - 1 + else: + var = path[:index] + try: + if environ is None: + value = os.fsencode(os.environ[os.fsdecode(var)]) + else: + value = environ[var] + except KeyError: + value = dollar + brace + var + rbrace + res += value + else: + var = path[:0] + index += 1 + c = path[index:index + 1] + while c and c in varchars: + var += c + index += 1 + c = path[index:index + 1] + try: + if environ is None: + value = os.fsencode(os.environ[os.fsdecode(var)]) + else: + value = environ[var] + except KeyError: + value = dollar + var + res += value + if c: + index -= 1 + else: + res += c + 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.""" + path = os.fspath(path) + if isinstance(path, bytes): + sep = b'\\' + altsep = b'/' + curdir = b'.' + pardir = b'..' + special_prefixes = (b'\\\\.\\', b'\\\\?\\') + else: + sep = '\\' + altsep = '/' + curdir = '.' + pardir = '..' + special_prefixes = ('\\\\.\\', '\\\\?\\') + if path.startswith(special_prefixes): + # 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(altsep, sep) + prefix, path = splitdrive(path) + + # collapse initial backslashes + if path.startswith(sep): + prefix += sep + path = path.lstrip(sep) + + comps = path.split(sep) + i = 0 + while i < len(comps): + if not comps[i] or comps[i] == curdir: + del comps[i] + elif comps[i] == pardir: + if i > 0 and comps[i-1] != pardir: + del comps[i-1:i+1] + i -= 1 + elif i == 0 and prefix.endswith(sep): + del comps[i] + else: + i += 1 + else: + i += 1 + # If the path is now empty, substitute '.' + if not prefix and not comps: + comps.append(curdir) + return prefix + sep.join(comps) + +def _abspath_fallback(path): + """Return the absolute version of a path as a fallback function in case + `nt._getfullpathname` is not available or raises OSError. See bpo-31047 for + more. + + """ + + path = os.fspath(path) + if not isabs(path): + if isinstance(path, bytes): + cwd = os.getcwdb() + else: + cwd = os.getcwd() + path = join(cwd, path) + return normpath(path) + +# Return an absolute path. +try: + from nt import _getfullpathname + +except ImportError: # not running on Windows - mock up something sensible + abspath = _abspath_fallback + +else: # use native Windows method on Windows + def abspath(path): + """Return the absolute version of a path.""" + try: + return normpath(_getfullpathname(path)) + except (OSError, ValueError): + return _abspath_fallback(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 relpath(path, start=None): + """Return a relative version of a path""" + path = os.fspath(path) + if isinstance(path, bytes): + sep = b'\\' + curdir = b'.' + pardir = b'..' + else: + sep = '\\' + curdir = '.' + pardir = '..' + + if start is None: + start = curdir + + if not path: + raise ValueError("no path specified") + + start = os.fspath(start) + try: + start_abs = abspath(normpath(start)) + path_abs = abspath(normpath(path)) + start_drive, start_rest = splitdrive(start_abs) + path_drive, path_rest = splitdrive(path_abs) + if normcase(start_drive) != normcase(path_drive): + raise ValueError("path is on mount %r, start on mount %r" % ( + path_drive, start_drive)) + + start_list = [x for x in start_rest.split(sep) if x] + path_list = [x for x in path_rest.split(sep) if x] + # 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 normcase(e1) != normcase(e2): + break + i += 1 + + rel_list = [pardir] * (len(start_list)-i) + path_list[i:] + if not rel_list: + return curdir + return join(*rel_list) + except (TypeError, ValueError, AttributeError, BytesWarning, DeprecationWarning): + genericpath._check_arg_types('relpath', path, start) + raise + + +# Return the longest common sub-path of the sequence of paths given as input. +# The function is case-insensitive and 'separator-insensitive', i.e. if the +# only difference between two paths is the use of '\' versus '/' as separator, +# they are deemed to be equal. +# +# However, the returned path will have the standard '\' separator (even if the +# given paths had the alternative '/' separator) and will have the case of the +# first path given in the sequence. Additionally, any trailing separator is +# stripped from the returned path. + +def commonpath(paths): + """Given a sequence of path names, returns the longest common sub-path.""" + + if not paths: + raise ValueError('commonpath() arg is an empty sequence') + + paths = tuple(map(os.fspath, paths)) + if isinstance(paths[0], bytes): + sep = b'\\' + altsep = b'/' + curdir = b'.' + else: + sep = '\\' + altsep = '/' + curdir = '.' + + try: + drivesplits = [splitdrive(p.replace(altsep, sep).lower()) for p in paths] + split_paths = [p.split(sep) for d, p in drivesplits] + + try: + isabs, = set(p[:1] == sep for d, p in drivesplits) + except ValueError: + raise ValueError("Can't mix absolute and relative paths") from None + + # Check that all drive letters or UNC paths match. The check is made only + # now otherwise type errors for mixing strings and bytes would not be + # caught. + if len(set(d for d, p in drivesplits)) != 1: + raise ValueError("Paths don't have the same drive") + + drive, path = splitdrive(paths[0].replace(altsep, sep)) + common = path.split(sep) + common = [c for c in common if c and c != curdir] + + split_paths = [[c for c in s if c and c != curdir] for s in split_paths] + s1 = min(split_paths) + s2 = max(split_paths) + for i, c in enumerate(s1): + if c != s2[i]: + common = common[:i] + break + else: + common = common[:len(s1)] + + prefix = drive + sep if isabs else drive + return prefix + sep.join(common) + except (TypeError, AttributeError): + genericpath._check_arg_types('commonpath', *paths) + raise + + +# determine if two files are in fact the same file +try: + # GetFinalPathNameByHandle is available starting with Windows 6.0. + # Windows XP and non-Windows OS'es will mock _getfinalpathname. + if sys.getwindowsversion()[:2] >= (6, 0): + from nt import _getfinalpathname + else: + raise ImportError +except (AttributeError, ImportError): + # On Windows XP and earlier, two files are the same if their absolute + # pathnames are the same. + # Non-Windows operating systems fake this method with an XP + # approximation. + def _getfinalpathname(f): + return normcase(abspath(f)) + + +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/env/Lib/operator.py b/env/Lib/operator.py new file mode 100644 index 0000000..0e2e53e --- /dev/null +++ b/env/Lib/operator.py @@ -0,0 +1,464 @@ +""" +Operator Interface + +This module exports a set of functions corresponding to the intrinsic +operators of Python. For example, operator.add(x, y) is equivalent +to the expression x+y. The function names are those used for special +methods; variants without leading and trailing '__' are also provided +for convenience. + +This is the pure Python implementation of the module. +""" + +__all__ = ['abs', 'add', 'and_', 'attrgetter', 'concat', 'contains', 'countOf', + 'delitem', 'eq', 'floordiv', 'ge', 'getitem', 'gt', 'iadd', 'iand', + 'iconcat', 'ifloordiv', 'ilshift', 'imatmul', 'imod', 'imul', + 'index', 'indexOf', 'inv', 'invert', 'ior', 'ipow', 'irshift', + 'is_', 'is_not', 'isub', 'itemgetter', 'itruediv', 'ixor', 'le', + 'length_hint', 'lshift', 'lt', 'matmul', 'methodcaller', 'mod', + 'mul', 'ne', 'neg', 'not_', 'or_', 'pos', 'pow', 'rshift', + 'setitem', 'sub', 'truediv', 'truth', 'xor'] + +from builtins import abs as _abs + + +# Comparison Operations *******************************************************# + +def lt(a, b): + "Same as a < b." + return a < b + +def le(a, b): + "Same as a <= b." + return a <= b + +def eq(a, b): + "Same as a == b." + return a == b + +def ne(a, b): + "Same as a != b." + return a != b + +def ge(a, b): + "Same as a >= b." + return a >= b + +def gt(a, b): + "Same as a > b." + return a > b + +# Logical Operations **********************************************************# + +def not_(a): + "Same as not a." + return not a + +def truth(a): + "Return True if a is true, False otherwise." + return True if a else False + +def is_(a, b): + "Same as a is b." + return a is b + +def is_not(a, b): + "Same as a is not b." + return a is not b + +# Mathematical/Bitwise Operations *********************************************# + +def abs(a): + "Same as abs(a)." + return _abs(a) + +def add(a, b): + "Same as a + b." + return a + b + +def and_(a, b): + "Same as a & b." + return a & b + +def floordiv(a, b): + "Same as a // b." + return a // b + +def index(a): + "Same as a.__index__()." + return a.__index__() + +def inv(a): + "Same as ~a." + return ~a +invert = inv + +def lshift(a, b): + "Same as a << b." + return a << b + +def mod(a, b): + "Same as a % b." + return a % b + +def mul(a, b): + "Same as a * b." + return a * b + +def matmul(a, b): + "Same as a @ b." + return a @ b + +def neg(a): + "Same as -a." + return -a + +def or_(a, b): + "Same as a | b." + return a | b + +def pos(a): + "Same as +a." + return +a + +def pow(a, b): + "Same as a ** b." + return a ** b + +def rshift(a, b): + "Same as a >> b." + return a >> b + +def sub(a, b): + "Same as a - b." + return a - b + +def truediv(a, b): + "Same as a / b." + return a / b + +def xor(a, b): + "Same as a ^ b." + return a ^ b + +# Sequence Operations *********************************************************# + +def concat(a, b): + "Same as a + b, for a and b sequences." + if not hasattr(a, '__getitem__'): + msg = "'%s' object can't be concatenated" % type(a).__name__ + raise TypeError(msg) + return a + b + +def contains(a, b): + "Same as b in a (note reversed operands)." + return b in a + +def countOf(a, b): + "Return the number of times b occurs in a." + count = 0 + for i in a: + if i == b: + count += 1 + return count + +def delitem(a, b): + "Same as del a[b]." + del a[b] + +def getitem(a, b): + "Same as a[b]." + return a[b] + +def indexOf(a, b): + "Return the first index of b in a." + for i, j in enumerate(a): + if j == b: + return i + else: + raise ValueError('sequence.index(x): x not in sequence') + +def setitem(a, b, c): + "Same as a[b] = c." + a[b] = c + +def length_hint(obj, default=0): + """ + Return an estimate of the number of items in obj. + This is useful for presizing containers when building from an iterable. + + If the object supports len(), the result will be exact. Otherwise, it may + over- or under-estimate by an arbitrary amount. The result will be an + integer >= 0. + """ + if not isinstance(default, int): + msg = ("'%s' object cannot be interpreted as an integer" % + type(default).__name__) + raise TypeError(msg) + + try: + return len(obj) + except TypeError: + pass + + try: + hint = type(obj).__length_hint__ + except AttributeError: + return default + + try: + val = hint(obj) + except TypeError: + return default + if val is NotImplemented: + return default + if not isinstance(val, int): + msg = ('__length_hint__ must be integer, not %s' % + type(val).__name__) + raise TypeError(msg) + if val < 0: + msg = '__length_hint__() should return >= 0' + raise ValueError(msg) + return val + +# Generalized Lookup Objects **************************************************# + +class attrgetter: + """ + Return a callable object that fetches the given attribute(s) from its operand. + After f = attrgetter('name'), the call f(r) returns r.name. + After g = attrgetter('name', 'date'), the call g(r) returns (r.name, r.date). + After h = attrgetter('name.first', 'name.last'), the call h(r) returns + (r.name.first, r.name.last). + """ + __slots__ = ('_attrs', '_call') + + def __init__(self, attr, *attrs): + if not attrs: + if not isinstance(attr, str): + raise TypeError('attribute name must be a string') + self._attrs = (attr,) + names = attr.split('.') + def func(obj): + for name in names: + obj = getattr(obj, name) + return obj + self._call = func + else: + self._attrs = (attr,) + attrs + getters = tuple(map(attrgetter, self._attrs)) + def func(obj): + return tuple(getter(obj) for getter in getters) + self._call = func + + def __call__(self, obj): + return self._call(obj) + + def __repr__(self): + return '%s.%s(%s)' % (self.__class__.__module__, + self.__class__.__qualname__, + ', '.join(map(repr, self._attrs))) + + def __reduce__(self): + return self.__class__, self._attrs + +class itemgetter: + """ + Return a callable object that fetches the given item(s) from its operand. + After f = itemgetter(2), the call f(r) returns r[2]. + After g = itemgetter(2, 5, 3), the call g(r) returns (r[2], r[5], r[3]) + """ + __slots__ = ('_items', '_call') + + def __init__(self, item, *items): + if not items: + self._items = (item,) + def func(obj): + return obj[item] + self._call = func + else: + self._items = items = (item,) + items + def func(obj): + return tuple(obj[i] for i in items) + self._call = func + + def __call__(self, obj): + return self._call(obj) + + def __repr__(self): + return '%s.%s(%s)' % (self.__class__.__module__, + self.__class__.__name__, + ', '.join(map(repr, self._items))) + + def __reduce__(self): + return self.__class__, self._items + +class methodcaller: + """ + Return a callable object that calls the given method on its operand. + After f = methodcaller('name'), the call f(r) returns r.name(). + After g = methodcaller('name', 'date', foo=1), the call g(r) returns + r.name('date', foo=1). + """ + __slots__ = ('_name', '_args', '_kwargs') + + def __init__(*args, **kwargs): + if len(args) < 2: + msg = "methodcaller needs at least one argument, the method name" + raise TypeError(msg) + self = args[0] + self._name = args[1] + if not isinstance(self._name, str): + raise TypeError('method name must be a string') + self._args = args[2:] + self._kwargs = kwargs + + def __call__(self, obj): + return getattr(obj, self._name)(*self._args, **self._kwargs) + + def __repr__(self): + args = [repr(self._name)] + args.extend(map(repr, self._args)) + args.extend('%s=%r' % (k, v) for k, v in self._kwargs.items()) + return '%s.%s(%s)' % (self.__class__.__module__, + self.__class__.__name__, + ', '.join(args)) + + def __reduce__(self): + if not self._kwargs: + return self.__class__, (self._name,) + self._args + else: + from functools import partial + return partial(self.__class__, self._name, **self._kwargs), self._args + + +# In-place Operations *********************************************************# + +def iadd(a, b): + "Same as a += b." + a += b + return a + +def iand(a, b): + "Same as a &= b." + a &= b + return a + +def iconcat(a, b): + "Same as a += b, for a and b sequences." + if not hasattr(a, '__getitem__'): + msg = "'%s' object can't be concatenated" % type(a).__name__ + raise TypeError(msg) + a += b + return a + +def ifloordiv(a, b): + "Same as a //= b." + a //= b + return a + +def ilshift(a, b): + "Same as a <<= b." + a <<= b + return a + +def imod(a, b): + "Same as a %= b." + a %= b + return a + +def imul(a, b): + "Same as a *= b." + a *= b + return a + +def imatmul(a, b): + "Same as a @= b." + a @= b + return a + +def ior(a, b): + "Same as a |= b." + a |= b + return a + +def ipow(a, b): + "Same as a **= b." + a **=b + return a + +def irshift(a, b): + "Same as a >>= b." + a >>= b + return a + +def isub(a, b): + "Same as a -= b." + a -= b + return a + +def itruediv(a, b): + "Same as a /= b." + a /= b + return a + +def ixor(a, b): + "Same as a ^= b." + a ^= b + return a + + +try: + from _operator import * +except ImportError: + pass +else: + from _operator import __doc__ + +# All of these "__func__ = func" assignments have to happen after importing +# from _operator to make sure they're set to the right function +__lt__ = lt +__le__ = le +__eq__ = eq +__ne__ = ne +__ge__ = ge +__gt__ = gt +__not__ = not_ +__abs__ = abs +__add__ = add +__and__ = and_ +__floordiv__ = floordiv +__index__ = index +__inv__ = inv +__invert__ = invert +__lshift__ = lshift +__mod__ = mod +__mul__ = mul +__matmul__ = matmul +__neg__ = neg +__or__ = or_ +__pos__ = pos +__pow__ = pow +__rshift__ = rshift +__sub__ = sub +__truediv__ = truediv +__xor__ = xor +__concat__ = concat +__contains__ = contains +__delitem__ = delitem +__getitem__ = getitem +__setitem__ = setitem +__iadd__ = iadd +__iand__ = iand +__iconcat__ = iconcat +__ifloordiv__ = ifloordiv +__ilshift__ = ilshift +__imod__ = imod +__imul__ = imul +__imatmul__ = imatmul +__ior__ = ior +__ipow__ = ipow +__irshift__ = irshift +__isub__ = isub +__itruediv__ = itruediv +__ixor__ = ixor diff --git a/env/Lib/orig-prefix.txt b/env/Lib/orig-prefix.txt new file mode 100644 index 0000000..12fb3fa --- /dev/null +++ b/env/Lib/orig-prefix.txt @@ -0,0 +1 @@ +c:\users\tsb\appdata\local\programs\python\python37 \ No newline at end of file diff --git a/env/Lib/os.py b/env/Lib/os.py new file mode 100644 index 0000000..499e628 --- /dev/null +++ b/env/Lib/os.py @@ -0,0 +1,1078 @@ +r"""OS routines for NT or Posix depending on what system we're on. + +This exports: + - all functions from posix or nt, e.g. unlink, stat, etc. + - os.path is either posixpath or ntpath + - os.name is either 'posix' or 'nt' + - os.curdir is a string representing the current directory (always '.') + - os.pardir is a string representing the parent directory (always '..') + - os.sep is the (or a most common) pathname separator ('/' or '\\') + - os.extsep is the extension separator (always '.') + - os.altsep is the alternate pathname separator (None or '/') + - os.pathsep is the component separator used in $PATH etc + - os.linesep is the line separator in text files ('\r' or '\n' or '\r\n') + - os.defpath is the default search path for executables + - os.devnull is the file path of the null device ('/dev/null', etc.) + +Programs that import and use 'os' stand a better chance of being +portable between different platforms. Of course, they must then +only use functions that are defined by all platforms (e.g., unlink +and opendir), and leave all pathname manipulation to os.path +(e.g., split and join). +""" + +#' +import abc +import sys +import stat as st + +_names = sys.builtin_module_names + +# Note: more names are added to __all__ later. +__all__ = ["altsep", "curdir", "pardir", "sep", "pathsep", "linesep", + "defpath", "name", "path", "devnull", "SEEK_SET", "SEEK_CUR", + "SEEK_END", "fsencode", "fsdecode", "get_exec_path", "fdopen", + "popen", "extsep"] + +def _exists(name): + return name in globals() + +def _get_exports_list(module): + try: + return list(module.__all__) + except AttributeError: + return [n for n in dir(module) if n[0] != '_'] + +# Any new dependencies of the os module and/or changes in path separator +# requires updating importlib as well. +if 'posix' in _names: + name = 'posix' + linesep = '\n' + from posix import * + try: + from posix import _exit + __all__.append('_exit') + except ImportError: + pass + import posixpath as path + + try: + from posix import _have_functions + except ImportError: + pass + + import posix + __all__.extend(_get_exports_list(posix)) + del posix + +elif 'nt' in _names: + name = 'nt' + linesep = '\r\n' + from nt import * + try: + from nt import _exit + __all__.append('_exit') + except ImportError: + pass + import ntpath as path + + import nt + __all__.extend(_get_exports_list(nt)) + del nt + + try: + from nt import _have_functions + except ImportError: + pass + +else: + raise ImportError('no os specific module found') + +sys.modules['os.path'] = path +from os.path import (curdir, pardir, sep, pathsep, defpath, extsep, altsep, + devnull) + +del _names + + +if _exists("_have_functions"): + _globals = globals() + def _add(str, fn): + if (fn in _globals) and (str in _have_functions): + _set.add(_globals[fn]) + + _set = set() + _add("HAVE_FACCESSAT", "access") + _add("HAVE_FCHMODAT", "chmod") + _add("HAVE_FCHOWNAT", "chown") + _add("HAVE_FSTATAT", "stat") + _add("HAVE_FUTIMESAT", "utime") + _add("HAVE_LINKAT", "link") + _add("HAVE_MKDIRAT", "mkdir") + _add("HAVE_MKFIFOAT", "mkfifo") + _add("HAVE_MKNODAT", "mknod") + _add("HAVE_OPENAT", "open") + _add("HAVE_READLINKAT", "readlink") + _add("HAVE_RENAMEAT", "rename") + _add("HAVE_SYMLINKAT", "symlink") + _add("HAVE_UNLINKAT", "unlink") + _add("HAVE_UNLINKAT", "rmdir") + _add("HAVE_UTIMENSAT", "utime") + supports_dir_fd = _set + + _set = set() + _add("HAVE_FACCESSAT", "access") + supports_effective_ids = _set + + _set = set() + _add("HAVE_FCHDIR", "chdir") + _add("HAVE_FCHMOD", "chmod") + _add("HAVE_FCHOWN", "chown") + _add("HAVE_FDOPENDIR", "listdir") + _add("HAVE_FDOPENDIR", "scandir") + _add("HAVE_FEXECVE", "execve") + _set.add(stat) # fstat always works + _add("HAVE_FTRUNCATE", "truncate") + _add("HAVE_FUTIMENS", "utime") + _add("HAVE_FUTIMES", "utime") + _add("HAVE_FPATHCONF", "pathconf") + if _exists("statvfs") and _exists("fstatvfs"): # mac os x10.3 + _add("HAVE_FSTATVFS", "statvfs") + supports_fd = _set + + _set = set() + _add("HAVE_FACCESSAT", "access") + # Some platforms don't support lchmod(). Often the function exists + # anyway, as a stub that always returns ENOSUP or perhaps EOPNOTSUPP. + # (No, I don't know why that's a good design.) ./configure will detect + # this and reject it--so HAVE_LCHMOD still won't be defined on such + # platforms. This is Very Helpful. + # + # However, sometimes platforms without a working lchmod() *do* have + # fchmodat(). (Examples: Linux kernel 3.2 with glibc 2.15, + # OpenIndiana 3.x.) And fchmodat() has a flag that theoretically makes + # it behave like lchmod(). So in theory it would be a suitable + # replacement for lchmod(). But when lchmod() doesn't work, fchmodat()'s + # flag doesn't work *either*. Sadly ./configure isn't sophisticated + # enough to detect this condition--it only determines whether or not + # fchmodat() minimally works. + # + # Therefore we simply ignore fchmodat() when deciding whether or not + # os.chmod supports follow_symlinks. Just checking lchmod() is + # sufficient. After all--if you have a working fchmodat(), your + # lchmod() almost certainly works too. + # + # _add("HAVE_FCHMODAT", "chmod") + _add("HAVE_FCHOWNAT", "chown") + _add("HAVE_FSTATAT", "stat") + _add("HAVE_LCHFLAGS", "chflags") + _add("HAVE_LCHMOD", "chmod") + if _exists("lchown"): # mac os x10.3 + _add("HAVE_LCHOWN", "chown") + _add("HAVE_LINKAT", "link") + _add("HAVE_LUTIMES", "utime") + _add("HAVE_LSTAT", "stat") + _add("HAVE_FSTATAT", "stat") + _add("HAVE_UTIMENSAT", "utime") + _add("MS_WINDOWS", "stat") + supports_follow_symlinks = _set + + del _set + del _have_functions + del _globals + del _add + + +# Python uses fixed values for the SEEK_ constants; they are mapped +# to native constants if necessary in posixmodule.c +# Other possible SEEK values are directly imported from posixmodule.c +SEEK_SET = 0 +SEEK_CUR = 1 +SEEK_END = 2 + +# Super directory utilities. +# (Inspired by Eric Raymond; the doc strings are mostly his) + +def makedirs(name, mode=0o777, exist_ok=False): + """makedirs(name [, mode=0o777][, exist_ok=False]) + + Super-mkdir; create a leaf directory and all intermediate ones. Works like + mkdir, except that any intermediate path segment (not just the rightmost) + will be created if it does not exist. If the target directory already + exists, raise an OSError if exist_ok is False. Otherwise no exception is + raised. This is recursive. + + """ + head, tail = path.split(name) + if not tail: + head, tail = path.split(head) + if head and tail and not path.exists(head): + try: + makedirs(head, exist_ok=exist_ok) + except FileExistsError: + # Defeats race condition when another thread created the path + pass + cdir = curdir + if isinstance(tail, bytes): + cdir = bytes(curdir, 'ASCII') + if tail == cdir: # xxx/newdir/. exists if xxx/newdir exists + return + try: + mkdir(name, mode) + except OSError: + # Cannot rely on checking for EEXIST, since the operating system + # could give priority to other errors like EACCES or EROFS + if not exist_ok or not path.isdir(name): + raise + +def removedirs(name): + """removedirs(name) + + Super-rmdir; remove a leaf directory and all empty intermediate + ones. Works like rmdir except that, if the leaf directory is + successfully removed, directories corresponding to rightmost path + segments will be pruned away until either the whole path is + consumed or an error occurs. Errors during this latter phase are + ignored -- they generally mean that a directory was not empty. + + """ + rmdir(name) + head, tail = path.split(name) + if not tail: + head, tail = path.split(head) + while head and tail: + try: + rmdir(head) + except OSError: + break + head, tail = path.split(head) + +def renames(old, new): + """renames(old, new) + + Super-rename; create directories as necessary and delete any left + empty. Works like rename, except creation of any intermediate + directories needed to make the new pathname good is attempted + first. After the rename, directories corresponding to rightmost + path segments of the old name will be pruned until either the + whole path is consumed or a nonempty directory is found. + + Note: this function can fail with the new directory structure made + if you lack permissions needed to unlink the leaf directory or + file. + + """ + head, tail = path.split(new) + if head and tail and not path.exists(head): + makedirs(head) + rename(old, new) + head, tail = path.split(old) + if head and tail: + try: + removedirs(head) + except OSError: + pass + +__all__.extend(["makedirs", "removedirs", "renames"]) + +def walk(top, topdown=True, onerror=None, followlinks=False): + """Directory tree generator. + + For each directory in the directory tree rooted at top (including top + itself, but excluding '.' and '..'), yields a 3-tuple + + dirpath, dirnames, filenames + + dirpath is a string, the path to the directory. dirnames is a list of + the names of the subdirectories in dirpath (excluding '.' and '..'). + filenames is a list of the names of the non-directory files in dirpath. + Note that the names in the lists are just names, with no path components. + To get a full path (which begins with top) to a file or directory in + dirpath, do os.path.join(dirpath, name). + + If optional arg 'topdown' is true or not specified, the triple for a + directory is generated before the triples for any of its subdirectories + (directories are generated top down). If topdown is false, the triple + for a directory is generated after the triples for all of its + subdirectories (directories are generated bottom up). + + When topdown is true, the caller can modify the dirnames list in-place + (e.g., via del or slice assignment), and walk will only recurse into the + subdirectories whose names remain in dirnames; this can be used to prune the + search, or to impose a specific order of visiting. Modifying dirnames when + topdown is false is ineffective, since the directories in dirnames have + already been generated by the time dirnames itself is generated. No matter + the value of topdown, the list of subdirectories is retrieved before the + tuples for the directory and its subdirectories are generated. + + By default errors from the os.scandir() call are ignored. If + optional arg 'onerror' is specified, it should be a function; it + will be called with one argument, an OSError instance. It can + report the error to continue with the walk, or raise the exception + to abort the walk. Note that the filename is available as the + filename attribute of the exception object. + + By default, os.walk does not follow symbolic links to subdirectories on + systems that support them. In order to get this functionality, set the + optional argument 'followlinks' to true. + + Caution: if you pass a relative pathname for top, don't change the + current working directory between resumptions of walk. walk never + changes the current directory, and assumes that the client doesn't + either. + + Example: + + import os + from os.path import join, getsize + for root, dirs, files in os.walk('python/Lib/email'): + print(root, "consumes", end="") + print(sum([getsize(join(root, name)) for name in files]), end="") + print("bytes in", len(files), "non-directory files") + if 'CVS' in dirs: + dirs.remove('CVS') # don't visit CVS directories + + """ + top = fspath(top) + dirs = [] + nondirs = [] + walk_dirs = [] + + # We may not have read permission for top, in which case we can't + # get a list of the files the directory contains. os.walk + # always suppressed the exception then, rather than blow up for a + # minor reason when (say) a thousand readable directories are still + # left to visit. That logic is copied here. + try: + # Note that scandir is global in this module due + # to earlier import-*. + scandir_it = scandir(top) + except OSError as error: + if onerror is not None: + onerror(error) + return + + with scandir_it: + while True: + try: + try: + entry = next(scandir_it) + except StopIteration: + break + except OSError as error: + if onerror is not None: + onerror(error) + return + + try: + is_dir = entry.is_dir() + except OSError: + # If is_dir() raises an OSError, consider that the entry is not + # a directory, same behaviour than os.path.isdir(). + is_dir = False + + if is_dir: + dirs.append(entry.name) + else: + nondirs.append(entry.name) + + if not topdown and is_dir: + # Bottom-up: recurse into sub-directory, but exclude symlinks to + # directories if followlinks is False + if followlinks: + walk_into = True + else: + try: + is_symlink = entry.is_symlink() + except OSError: + # If is_symlink() raises an OSError, consider that the + # entry is not a symbolic link, same behaviour than + # os.path.islink(). + is_symlink = False + walk_into = not is_symlink + + if walk_into: + walk_dirs.append(entry.path) + + # Yield before recursion if going top down + if topdown: + yield top, dirs, nondirs + + # Recurse into sub-directories + islink, join = path.islink, path.join + for dirname in dirs: + new_path = join(top, dirname) + # Issue #23605: os.path.islink() is used instead of caching + # entry.is_symlink() result during the loop on os.scandir() because + # the caller can replace the directory entry during the "yield" + # above. + if followlinks or not islink(new_path): + yield from walk(new_path, topdown, onerror, followlinks) + else: + # Recurse into sub-directories + for new_path in walk_dirs: + yield from walk(new_path, topdown, onerror, followlinks) + # Yield after recursion if going bottom up + yield top, dirs, nondirs + +__all__.append("walk") + +if {open, stat} <= supports_dir_fd and {scandir, stat} <= supports_fd: + + def fwalk(top=".", topdown=True, onerror=None, *, follow_symlinks=False, dir_fd=None): + """Directory tree generator. + + This behaves exactly like walk(), except that it yields a 4-tuple + + dirpath, dirnames, filenames, dirfd + + `dirpath`, `dirnames` and `filenames` are identical to walk() output, + and `dirfd` is a file descriptor referring to the directory `dirpath`. + + The advantage of fwalk() over walk() is that it's safe against symlink + races (when follow_symlinks is False). + + If dir_fd is not None, it should be a file descriptor open to a directory, + and top should be relative; top will then be relative to that directory. + (dir_fd is always supported for fwalk.) + + Caution: + Since fwalk() yields file descriptors, those are only valid until the + next iteration step, so you should dup() them if you want to keep them + for a longer period. + + Example: + + import os + for root, dirs, files, rootfd in os.fwalk('python/Lib/email'): + print(root, "consumes", end="") + print(sum([os.stat(name, dir_fd=rootfd).st_size for name in files]), + end="") + print("bytes in", len(files), "non-directory files") + if 'CVS' in dirs: + dirs.remove('CVS') # don't visit CVS directories + """ + if not isinstance(top, int) or not hasattr(top, '__index__'): + top = fspath(top) + # Note: To guard against symlink races, we use the standard + # lstat()/open()/fstat() trick. + if not follow_symlinks: + orig_st = stat(top, follow_symlinks=False, dir_fd=dir_fd) + topfd = open(top, O_RDONLY, dir_fd=dir_fd) + try: + if (follow_symlinks or (st.S_ISDIR(orig_st.st_mode) and + path.samestat(orig_st, stat(topfd)))): + yield from _fwalk(topfd, top, isinstance(top, bytes), + topdown, onerror, follow_symlinks) + finally: + close(topfd) + + def _fwalk(topfd, toppath, isbytes, topdown, onerror, follow_symlinks): + # Note: This uses O(depth of the directory tree) file descriptors: if + # necessary, it can be adapted to only require O(1) FDs, see issue + # #13734. + + scandir_it = scandir(topfd) + dirs = [] + nondirs = [] + entries = None if topdown or follow_symlinks else [] + for entry in scandir_it: + name = entry.name + if isbytes: + name = fsencode(name) + try: + if entry.is_dir(): + dirs.append(name) + if entries is not None: + entries.append(entry) + else: + nondirs.append(name) + except OSError: + try: + # Add dangling symlinks, ignore disappeared files + if entry.is_symlink(): + nondirs.append(name) + except OSError: + pass + + if topdown: + yield toppath, dirs, nondirs, topfd + + for name in dirs if entries is None else zip(dirs, entries): + try: + if not follow_symlinks: + if topdown: + orig_st = stat(name, dir_fd=topfd, follow_symlinks=False) + else: + assert entries is not None + name, entry = name + orig_st = entry.stat(follow_symlinks=False) + dirfd = open(name, O_RDONLY, dir_fd=topfd) + except OSError as err: + if onerror is not None: + onerror(err) + continue + try: + if follow_symlinks or path.samestat(orig_st, stat(dirfd)): + dirpath = path.join(toppath, name) + yield from _fwalk(dirfd, dirpath, isbytes, + topdown, onerror, follow_symlinks) + finally: + close(dirfd) + + if not topdown: + yield toppath, dirs, nondirs, topfd + + __all__.append("fwalk") + +# Make sure os.environ exists, at least +try: + environ +except NameError: + environ = {} + +def execl(file, *args): + """execl(file, *args) + + Execute the executable file with argument list args, replacing the + current process. """ + execv(file, args) + +def execle(file, *args): + """execle(file, *args, env) + + Execute the executable file with argument list args and + environment env, replacing the current process. """ + env = args[-1] + execve(file, args[:-1], env) + +def execlp(file, *args): + """execlp(file, *args) + + Execute the executable file (which is searched for along $PATH) + with argument list args, replacing the current process. """ + execvp(file, args) + +def execlpe(file, *args): + """execlpe(file, *args, env) + + Execute the executable file (which is searched for along $PATH) + with argument list args and environment env, replacing the current + process. """ + env = args[-1] + execvpe(file, args[:-1], env) + +def execvp(file, args): + """execvp(file, args) + + Execute the executable file (which is searched for along $PATH) + with argument list args, replacing the current process. + args may be a list or tuple of strings. """ + _execvpe(file, args) + +def execvpe(file, args, env): + """execvpe(file, args, env) + + Execute the executable file (which is searched for along $PATH) + with argument list args and environment env , replacing the + current process. + args may be a list or tuple of strings. """ + _execvpe(file, args, env) + +__all__.extend(["execl","execle","execlp","execlpe","execvp","execvpe"]) + +def _execvpe(file, args, env=None): + if env is not None: + exec_func = execve + argrest = (args, env) + else: + exec_func = execv + argrest = (args,) + env = environ + + if path.dirname(file): + exec_func(file, *argrest) + return + saved_exc = None + path_list = get_exec_path(env) + if name != 'nt': + file = fsencode(file) + path_list = map(fsencode, path_list) + for dir in path_list: + fullname = path.join(dir, file) + try: + exec_func(fullname, *argrest) + except (FileNotFoundError, NotADirectoryError) as e: + last_exc = e + except OSError as e: + last_exc = e + if saved_exc is None: + saved_exc = e + if saved_exc is not None: + raise saved_exc + raise last_exc + + +def get_exec_path(env=None): + """Returns the sequence of directories that will be searched for the + named executable (similar to a shell) when launching a process. + + *env* must be an environment variable dict or None. If *env* is None, + os.environ will be used. + """ + # Use a local import instead of a global import to limit the number of + # modules loaded at startup: the os module is always loaded at startup by + # Python. It may also avoid a bootstrap issue. + import warnings + + if env is None: + env = environ + + # {b'PATH': ...}.get('PATH') and {'PATH': ...}.get(b'PATH') emit a + # BytesWarning when using python -b or python -bb: ignore the warning + with warnings.catch_warnings(): + warnings.simplefilter("ignore", BytesWarning) + + try: + path_list = env.get('PATH') + except TypeError: + path_list = None + + if supports_bytes_environ: + try: + path_listb = env[b'PATH'] + except (KeyError, TypeError): + pass + else: + if path_list is not None: + raise ValueError( + "env cannot contain 'PATH' and b'PATH' keys") + path_list = path_listb + + if path_list is not None and isinstance(path_list, bytes): + path_list = fsdecode(path_list) + + if path_list is None: + path_list = defpath + return path_list.split(pathsep) + + +# Change environ to automatically call putenv(), unsetenv if they exist. +from _collections_abc import MutableMapping + +class _Environ(MutableMapping): + def __init__(self, data, encodekey, decodekey, encodevalue, decodevalue, putenv, unsetenv): + self.encodekey = encodekey + self.decodekey = decodekey + self.encodevalue = encodevalue + self.decodevalue = decodevalue + self.putenv = putenv + self.unsetenv = unsetenv + self._data = data + + def __getitem__(self, key): + try: + value = self._data[self.encodekey(key)] + except KeyError: + # raise KeyError with the original key value + raise KeyError(key) from None + return self.decodevalue(value) + + def __setitem__(self, key, value): + key = self.encodekey(key) + value = self.encodevalue(value) + self.putenv(key, value) + self._data[key] = value + + def __delitem__(self, key): + encodedkey = self.encodekey(key) + self.unsetenv(encodedkey) + try: + del self._data[encodedkey] + except KeyError: + # raise KeyError with the original key value + raise KeyError(key) from None + + def __iter__(self): + # list() from dict object is an atomic operation + keys = list(self._data) + for key in keys: + yield self.decodekey(key) + + def __len__(self): + return len(self._data) + + def __repr__(self): + return 'environ({{{}}})'.format(', '.join( + ('{!r}: {!r}'.format(self.decodekey(key), self.decodevalue(value)) + for key, value in self._data.items()))) + + def copy(self): + return dict(self) + + def setdefault(self, key, value): + if key not in self: + self[key] = value + return self[key] + +try: + _putenv = putenv +except NameError: + _putenv = lambda key, value: None +else: + if "putenv" not in __all__: + __all__.append("putenv") + +try: + _unsetenv = unsetenv +except NameError: + _unsetenv = lambda key: _putenv(key, "") +else: + if "unsetenv" not in __all__: + __all__.append("unsetenv") + +def _createenviron(): + if name == 'nt': + # Where Env Var Names Must Be UPPERCASE + def check_str(value): + if not isinstance(value, str): + raise TypeError("str expected, not %s" % type(value).__name__) + return value + encode = check_str + decode = str + def encodekey(key): + return encode(key).upper() + data = {} + for key, value in environ.items(): + data[encodekey(key)] = value + else: + # Where Env Var Names Can Be Mixed Case + encoding = sys.getfilesystemencoding() + def encode(value): + if not isinstance(value, str): + raise TypeError("str expected, not %s" % type(value).__name__) + return value.encode(encoding, 'surrogateescape') + def decode(value): + return value.decode(encoding, 'surrogateescape') + encodekey = encode + data = environ + return _Environ(data, + encodekey, decode, + encode, decode, + _putenv, _unsetenv) + +# unicode environ +environ = _createenviron() +del _createenviron + + +def getenv(key, default=None): + """Get an environment variable, return None if it doesn't exist. + The optional second argument can specify an alternate default. + key, default and the result are str.""" + return environ.get(key, default) + +supports_bytes_environ = (name != 'nt') +__all__.extend(("getenv", "supports_bytes_environ")) + +if supports_bytes_environ: + def _check_bytes(value): + if not isinstance(value, bytes): + raise TypeError("bytes expected, not %s" % type(value).__name__) + return value + + # bytes environ + environb = _Environ(environ._data, + _check_bytes, bytes, + _check_bytes, bytes, + _putenv, _unsetenv) + del _check_bytes + + def getenvb(key, default=None): + """Get an environment variable, return None if it doesn't exist. + The optional second argument can specify an alternate default. + key, default and the result are bytes.""" + return environb.get(key, default) + + __all__.extend(("environb", "getenvb")) + +def _fscodec(): + encoding = sys.getfilesystemencoding() + errors = sys.getfilesystemencodeerrors() + + def fsencode(filename): + """Encode filename (an os.PathLike, bytes, or str) to the filesystem + encoding with 'surrogateescape' error handler, return bytes unchanged. + On Windows, use 'strict' error handler if the file system encoding is + 'mbcs' (which is the default encoding). + """ + filename = fspath(filename) # Does type-checking of `filename`. + if isinstance(filename, str): + return filename.encode(encoding, errors) + else: + return filename + + def fsdecode(filename): + """Decode filename (an os.PathLike, bytes, or str) from the filesystem + encoding with 'surrogateescape' error handler, return str unchanged. On + Windows, use 'strict' error handler if the file system encoding is + 'mbcs' (which is the default encoding). + """ + filename = fspath(filename) # Does type-checking of `filename`. + if isinstance(filename, bytes): + return filename.decode(encoding, errors) + else: + return filename + + return fsencode, fsdecode + +fsencode, fsdecode = _fscodec() +del _fscodec + +# Supply spawn*() (probably only for Unix) +if _exists("fork") and not _exists("spawnv") and _exists("execv"): + + P_WAIT = 0 + P_NOWAIT = P_NOWAITO = 1 + + __all__.extend(["P_WAIT", "P_NOWAIT", "P_NOWAITO"]) + + # XXX Should we support P_DETACH? I suppose it could fork()**2 + # and close the std I/O streams. Also, P_OVERLAY is the same + # as execv*()? + + def _spawnvef(mode, file, args, env, func): + # Internal helper; func is the exec*() function to use + if not isinstance(args, (tuple, list)): + raise TypeError('argv must be a tuple or a list') + if not args or not args[0]: + raise ValueError('argv first element cannot be empty') + pid = fork() + if not pid: + # Child + try: + if env is None: + func(file, args) + else: + func(file, args, env) + except: + _exit(127) + else: + # Parent + if mode == P_NOWAIT: + return pid # Caller is responsible for waiting! + while 1: + wpid, sts = waitpid(pid, 0) + if WIFSTOPPED(sts): + continue + elif WIFSIGNALED(sts): + return -WTERMSIG(sts) + elif WIFEXITED(sts): + return WEXITSTATUS(sts) + else: + raise OSError("Not stopped, signaled or exited???") + + def spawnv(mode, file, args): + """spawnv(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 _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] isn'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) + + + __all__.extend(["spawnv", "spawnve", "spawnvp", "spawnvpe"]) + + +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(["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(["spawnlp", "spawnlpe"]) + + +# Supply os.popen() +def popen(cmd, mode="r", buffering=-1): + if not isinstance(cmd, str): + raise TypeError("invalid cmd type (%s, expected string)" % type(cmd)) + if mode not in ("r", "w"): + raise ValueError("invalid mode %r" % mode) + if buffering == 0 or buffering is None: + raise ValueError("popen() does not support unbuffered streams") + import subprocess, io + if mode == "r": + proc = subprocess.Popen(cmd, + shell=True, + stdout=subprocess.PIPE, + bufsize=buffering) + return _wrap_close(io.TextIOWrapper(proc.stdout), proc) + else: + proc = subprocess.Popen(cmd, + shell=True, + stdin=subprocess.PIPE, + bufsize=buffering) + return _wrap_close(io.TextIOWrapper(proc.stdin), proc) + +# Helper for popen() -- a proxy for a file whose close waits for the process +class _wrap_close: + def __init__(self, stream, proc): + self._stream = stream + self._proc = proc + def close(self): + self._stream.close() + returncode = self._proc.wait() + if returncode == 0: + return None + if name == 'nt': + return returncode + else: + return returncode << 8 # Shift left to match old behavior + def __enter__(self): + return self + def __exit__(self, *args): + self.close() + def __getattr__(self, name): + return getattr(self._stream, name) + def __iter__(self): + return iter(self._stream) + +# Supply os.fdopen() +def fdopen(fd, *args, **kwargs): + if not isinstance(fd, int): + raise TypeError("invalid fd type (%s, expected integer)" % type(fd)) + import io + return io.open(fd, *args, **kwargs) + + +# For testing purposes, make sure the function is available when the C +# implementation exists. +def _fspath(path): + """Return the path representation of a path-like object. + + If str or bytes is passed in, it is returned unchanged. Otherwise the + os.PathLike interface is used to get the path representation. If the + path representation is not str or bytes, TypeError is raised. If the + provided path is not str, bytes, or os.PathLike, TypeError is raised. + """ + if isinstance(path, (str, bytes)): + return path + + # Work from the object's type to match method resolution of other magic + # methods. + path_type = type(path) + try: + path_repr = path_type.__fspath__(path) + except AttributeError: + if hasattr(path_type, '__fspath__'): + raise + else: + raise TypeError("expected str, bytes or os.PathLike object, " + "not " + path_type.__name__) + if isinstance(path_repr, (str, bytes)): + return path_repr + else: + raise TypeError("expected {}.__fspath__() to return str or bytes, " + "not {}".format(path_type.__name__, + type(path_repr).__name__)) + +# If there is no C implementation, make the pure Python version the +# implementation as transparently as possible. +if not _exists('fspath'): + fspath = _fspath + fspath.__name__ = "fspath" + + +class PathLike(abc.ABC): + + """Abstract base class for implementing the file system path protocol.""" + + @abc.abstractmethod + def __fspath__(self): + """Return the file system path representation of the object.""" + raise NotImplementedError + + @classmethod + def __subclasshook__(cls, subclass): + return hasattr(subclass, '__fspath__') diff --git a/env/Lib/posixpath.py b/env/Lib/posixpath.py new file mode 100644 index 0000000..785aa72 --- /dev/null +++ b/env/Lib/posixpath.py @@ -0,0 +1,529 @@ +"""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. +""" + +# Strings representing various path-related bits and pieces. +# These are primarily for export; internally, they are hardcoded. +# Should be set before imports for resolving cyclic dependency. +curdir = '.' +pardir = '..' +extsep = '.' +sep = '/' +pathsep = ':' +defpath = '/bin:/usr/bin' +altsep = None +devnull = '/dev/null' + +import os +import sys +import stat +import genericpath +from genericpath import * + +__all__ = ["normcase","isabs","join","splitdrive","split","splitext", + "basename","dirname","commonprefix","getsize","getmtime", + "getatime","getctime","islink","exists","lexists","isdir","isfile", + "ismount", "expanduser","expandvars","normpath","abspath", + "samefile","sameopenfile","samestat", + "curdir","pardir","sep","pathsep","defpath","altsep","extsep", + "devnull","realpath","supports_unicode_filenames","relpath", + "commonpath"] + + +def _get_sep(path): + if isinstance(path, bytes): + return b'/' + else: + return '/' + +# 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""" + s = os.fspath(s) + if not isinstance(s, (bytes, str)): + raise TypeError("normcase() argument must be str or bytes, " + "not '{}'".format(s.__class__.__name__)) + 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""" + s = os.fspath(s) + sep = _get_sep(s) + return s.startswith(sep) + + +# 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.""" + a = os.fspath(a) + sep = _get_sep(a) + path = a + try: + if not p: + path[:0] + sep #23780: Ensure compatible data type even if p is null. + for b in map(os.fspath, p): + if b.startswith(sep): + path = b + elif not path or path.endswith(sep): + path += b + else: + path += sep + b + except (TypeError, AttributeError, BytesWarning): + genericpath._check_arg_types('join', a, *p) + raise + 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.""" + p = os.fspath(p) + sep = _get_sep(p) + i = p.rfind(sep) + 1 + head, tail = p[:i], p[i:] + if head and head != sep*len(head): + head = head.rstrip(sep) + 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): + p = os.fspath(p) + if isinstance(p, bytes): + sep = b'/' + extsep = b'.' + else: + sep = '/' + extsep = '.' + return genericpath._splitext(p, sep, None, 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.""" + p = os.fspath(p) + return p[:0], p + + +# Return the tail (basename) part of a path, same as split(path)[1]. + +def basename(p): + """Returns the final component of a pathname""" + p = os.fspath(p) + sep = _get_sep(p) + i = p.rfind(sep) + 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""" + p = os.fspath(p) + sep = _get_sep(p) + i = p.rfind(sep) + 1 + head = p[:i] + if head and head != sep*len(head): + head = head.rstrip(sep) + 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 (OSError, 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 OSError: + return False + return True + + +# 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""" + try: + s1 = os.lstat(path) + except OSError: + # It doesn't exist -- so not a mount point. :-) + return False + else: + # A symlink can never be a mount point + if stat.S_ISLNK(s1.st_mode): + return False + + if isinstance(path, bytes): + parent = join(path, b'..') + else: + parent = join(path, '..') + parent = realpath(parent) + try: + s2 = os.lstat(parent) + except OSError: + return False + + 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 + + +# 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.""" + path = os.fspath(path) + if isinstance(path, bytes): + tilde = b'~' + else: + tilde = '~' + if not path.startswith(tilde): + return path + sep = _get_sep(path) + i = path.find(sep, 1) + if i < 0: + i = len(path) + if i == 1: + if 'HOME' not in os.environ: + import pwd + try: + userhome = pwd.getpwuid(os.getuid()).pw_dir + except KeyError: + # bpo-10496: if the current user identifier doesn't exist in the + # password database, return the path unchanged + return path + else: + userhome = os.environ['HOME'] + else: + import pwd + name = path[1:i] + if isinstance(name, bytes): + name = str(name, 'ASCII') + try: + pwent = pwd.getpwnam(name) + except KeyError: + # bpo-10496: if the user name from the path doesn't exist in the + # password database, return the path unchanged + return path + userhome = pwent.pw_dir + if isinstance(path, bytes): + userhome = os.fsencode(userhome) + root = b'/' + else: + root = '/' + userhome = userhome.rstrip(root) + return (userhome + path[i:]) or root + + +# Expand paths containing shell variable substitutions. +# This expands the forms $variable and ${variable} only. +# Non-existent variables are left unchanged. + +_varprog = None +_varprogb = None + +def expandvars(path): + """Expand shell variables of form $var and ${var}. Unknown variables + are left unchanged.""" + path = os.fspath(path) + global _varprog, _varprogb + if isinstance(path, bytes): + if b'$' not in path: + return path + if not _varprogb: + import re + _varprogb = re.compile(br'\$(\w+|\{[^}]*\})', re.ASCII) + search = _varprogb.search + start = b'{' + end = b'}' + environ = getattr(os, 'environb', None) + else: + if '$' not in path: + return path + if not _varprog: + import re + _varprog = re.compile(r'\$(\w+|\{[^}]*\})', re.ASCII) + search = _varprog.search + start = '{' + end = '}' + environ = os.environ + i = 0 + while True: + m = search(path, i) + if not m: + break + i, j = m.span(0) + name = m.group(1) + if name.startswith(start) and name.endswith(end): + name = name[1:-1] + try: + if environ is None: + value = os.fsencode(os.environ[os.fsdecode(name)]) + else: + value = environ[name] + except KeyError: + i = j + else: + tail = path[j:] + path = path[:i] + value + i = len(path) + path += tail + 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.""" + path = os.fspath(path) + if isinstance(path, bytes): + sep = b'/' + empty = b'' + dot = b'.' + dotdot = b'..' + else: + sep = '/' + empty = '' + dot = '.' + dotdot = '..' + if path == empty: + return dot + initial_slashes = path.startswith(sep) + # POSIX allows one or two initial slashes, but treats three or more + # as single slash. + if (initial_slashes and + path.startswith(sep*2) and not path.startswith(sep*3)): + initial_slashes = 2 + comps = path.split(sep) + new_comps = [] + for comp in comps: + if comp in (empty, dot): + continue + if (comp != dotdot or (not initial_slashes and not new_comps) or + (new_comps and new_comps[-1] == dotdot)): + new_comps.append(comp) + elif new_comps: + new_comps.pop() + comps = new_comps + path = sep.join(comps) + if initial_slashes: + path = sep*initial_slashes + path + return path or dot + + +def abspath(path): + """Return an absolute path.""" + path = os.fspath(path) + if not isabs(path): + if isinstance(path, bytes): + cwd = os.getcwdb() + 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.""" + filename = os.fspath(filename) + path, ok = _joinrealpath(filename[:0], filename, {}) + return abspath(path) + +# Join two paths, normalizing and eliminating any symbolic links +# encountered in the second path. +def _joinrealpath(path, rest, seen): + if isinstance(path, bytes): + sep = b'/' + curdir = b'.' + pardir = b'..' + else: + sep = '/' + curdir = '.' + pardir = '..' + + 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=None): + """Return a relative version of a path""" + + if not path: + raise ValueError("no path specified") + + path = os.fspath(path) + if isinstance(path, bytes): + curdir = b'.' + sep = b'/' + pardir = b'..' + else: + curdir = '.' + sep = '/' + pardir = '..' + + if start is None: + start = curdir + else: + start = os.fspath(start) + + try: + 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) + except (TypeError, AttributeError, BytesWarning, DeprecationWarning): + genericpath._check_arg_types('relpath', path, start) + raise + + +# Return the longest common sub-path of the sequence of paths given as input. +# The paths are not normalized before comparing them (this is the +# responsibility of the caller). Any trailing separator is stripped from the +# returned path. + +def commonpath(paths): + """Given a sequence of path names, returns the longest common sub-path.""" + + if not paths: + raise ValueError('commonpath() arg is an empty sequence') + + paths = tuple(map(os.fspath, paths)) + if isinstance(paths[0], bytes): + sep = b'/' + curdir = b'.' + else: + sep = '/' + curdir = '.' + + try: + split_paths = [path.split(sep) for path in paths] + + try: + isabs, = set(p[:1] == sep for p in paths) + except ValueError: + raise ValueError("Can't mix absolute and relative paths") from None + + split_paths = [[c for c in s if c and c != curdir] for s in split_paths] + s1 = min(split_paths) + s2 = max(split_paths) + common = s1 + for i, c in enumerate(s1): + if c != s2[i]: + common = s1[:i] + break + + prefix = sep if isabs else sep[:0] + return prefix + sep.join(common) + except (TypeError, AttributeError): + genericpath._check_arg_types('commonpath', *paths) + raise diff --git a/env/Lib/random.py b/env/Lib/random.py new file mode 100644 index 0000000..bb6a05f --- /dev/null +++ b/env/Lib/random.py @@ -0,0 +1,777 @@ +"""Random variable generators. + + integers + -------- + uniform within range + + sequences + --------- + pick random element + pick random sample + pick weighted random sample + generate random permutation + + distributions on the real line: + ------------------------------ + uniform + triangular + normal (Gaussian) + lognormal + negative exponential + gamma + beta + pareto + Weibull + + distributions on the circle (angles 0 to 2pi) + --------------------------------------------- + circular uniform + von Mises + +General notes on the underlying Mersenne Twister core generator: + +* The period is 2**19937-1. +* It is one of the most extensively tested generators in existence. +* The random() method is implemented in C, executes in a single Python step, + and is, therefore, threadsafe. + +""" + +from warnings import warn as _warn +from types import MethodType as _MethodType, BuiltinMethodType as _BuiltinMethodType +from math import log as _log, exp as _exp, pi as _pi, e as _e, ceil as _ceil +from math import sqrt as _sqrt, acos as _acos, cos as _cos, sin as _sin +from os import urandom as _urandom +from _collections_abc import Set as _Set, Sequence as _Sequence +from hashlib import sha512 as _sha512 +import itertools as _itertools +import bisect as _bisect +import os as _os + +__all__ = ["Random","seed","random","uniform","randint","choice","sample", + "randrange","shuffle","normalvariate","lognormvariate", + "expovariate","vonmisesvariate","gammavariate","triangular", + "gauss","betavariate","paretovariate","weibullvariate", + "getstate","setstate", "getrandbits", "choices", + "SystemRandom"] + +NV_MAGICCONST = 4 * _exp(-0.5)/_sqrt(2.0) +TWOPI = 2.0*_pi +LOG4 = _log(4.0) +SG_MAGICCONST = 1.0 + _log(4.5) +BPF = 53 # Number of bits in a float +RECIP_BPF = 2**-BPF + + +# Translated by Guido van Rossum from C source provided by +# Adrian Baddeley. Adapted by Raymond Hettinger for use with +# the Mersenne Twister and os.urandom() core generators. + +import _random + +class Random(_random.Random): + """Random number generator base class used by bound module functions. + + Used to instantiate instances of Random to get generators that don't + share state. + + Class Random can also be subclassed if you want to use a different basic + generator of your own devising: in that case, override the following + methods: random(), seed(), getstate(), and setstate(). + Optionally, implement a getrandbits() method so that randrange() + can cover arbitrarily large ranges. + + """ + + VERSION = 3 # used by getstate/setstate + + def __init__(self, x=None): + """Initialize an instance. + + Optional argument x controls seeding, as for Random.seed(). + """ + + self.seed(x) + self.gauss_next = None + + def seed(self, a=None, version=2): + """Initialize internal state from hashable object. + + None or no argument seeds from current time or from an operating + system specific randomness source if available. + + If *a* is an int, all bits are used. + + For version 2 (the default), all of the bits are used if *a* is a str, + bytes, or bytearray. For version 1 (provided for reproducing random + sequences from older versions of Python), the algorithm for str and + bytes generates a narrower range of seeds. + + """ + + if version == 1 and isinstance(a, (str, bytes)): + a = a.decode('latin-1') if isinstance(a, bytes) else a + x = ord(a[0]) << 7 if a else 0 + for c in map(ord, a): + x = ((1000003 * x) ^ c) & 0xFFFFFFFFFFFFFFFF + x ^= len(a) + a = -2 if x == -1 else x + + if version == 2 and isinstance(a, (str, bytes, bytearray)): + if isinstance(a, str): + a = a.encode() + a += _sha512(a).digest() + a = int.from_bytes(a, 'big') + + super().seed(a) + self.gauss_next = None + + def getstate(self): + """Return internal state; can be passed to setstate() later.""" + return self.VERSION, super().getstate(), self.gauss_next + + def setstate(self, state): + """Restore internal state from object returned by getstate().""" + version = state[0] + if version == 3: + version, internalstate, self.gauss_next = state + super().setstate(internalstate) + elif version == 2: + version, internalstate, self.gauss_next = state + # In version 2, the state was saved as signed ints, which causes + # inconsistencies between 32/64-bit systems. The state is + # really unsigned 32-bit ints, so we convert negative ints from + # version 2 to positive longs for version 3. + try: + internalstate = tuple(x % (2**32) for x in internalstate) + except ValueError as e: + raise TypeError from e + super().setstate(internalstate) + else: + raise ValueError("state with version %s passed to " + "Random.setstate() of version %s" % + (version, self.VERSION)) + +## ---- Methods below this point do not need to be overridden when +## ---- subclassing for the purpose of using a different core generator. + +## -------------------- pickle support ------------------- + + # Issue 17489: Since __reduce__ was defined to fix #759889 this is no + # longer called; we leave it here because it has been here since random was + # rewritten back in 2001 and why risk breaking something. + def __getstate__(self): # for pickle + return self.getstate() + + def __setstate__(self, state): # for pickle + self.setstate(state) + + def __reduce__(self): + return self.__class__, (), self.getstate() + +## -------------------- integer methods ------------------- + + def randrange(self, start, stop=None, step=1, _int=int): + """Choose a random item from range(start, stop[, step]). + + This fixes the problem with randint() which includes the + endpoint; in Python this is usually not what you want. + + """ + + # This code is a bit messy to make it fast for the + # common case while still doing adequate error checking. + istart = _int(start) + if istart != start: + raise ValueError("non-integer arg 1 for randrange()") + if stop is None: + if istart > 0: + return self._randbelow(istart) + raise ValueError("empty range for randrange()") + + # stop argument supplied. + istop = _int(stop) + if istop != stop: + raise ValueError("non-integer stop for randrange()") + width = istop - istart + if step == 1 and width > 0: + return istart + self._randbelow(width) + if step == 1: + raise ValueError("empty range for randrange() (%d,%d, %d)" % (istart, istop, width)) + + # Non-unit step argument supplied. + istep = _int(step) + if istep != step: + raise ValueError("non-integer step for randrange()") + if istep > 0: + n = (width + istep - 1) // istep + elif istep < 0: + n = (width + istep + 1) // istep + else: + raise ValueError("zero step for randrange()") + + if n <= 0: + raise ValueError("empty range for randrange()") + + return istart + istep*self._randbelow(n) + + def randint(self, a, b): + """Return random integer in range [a, b], including both end points. + """ + + return self.randrange(a, b+1) + + def _randbelow(self, n, int=int, maxsize=1<= n: + r = getrandbits(k) + return r + # There's an overridden random() method but no new getrandbits() method, + # so we can only use random() from here. + if n >= maxsize: + _warn("Underlying random() generator does not supply \n" + "enough bits to choose from a population range this large.\n" + "To remove the range limitation, add a getrandbits() method.") + return int(random() * n) + if n == 0: + raise ValueError("Boundary cannot be zero") + rem = maxsize % n + limit = (maxsize - rem) / maxsize # int(limit * maxsize) % n == 0 + r = random() + while r >= limit: + r = random() + return int(r*maxsize) % n + +## -------------------- sequence methods ------------------- + + def choice(self, seq): + """Choose a random element from a non-empty sequence.""" + try: + i = self._randbelow(len(seq)) + except ValueError: + raise IndexError('Cannot choose from an empty sequence') from None + return seq[i] + + def shuffle(self, x, random=None): + """Shuffle list x in place, and return None. + + Optional argument random is a 0-argument function returning a + random float in [0.0, 1.0); if it is the default None, the + standard random.random will be used. + + """ + + if random is None: + randbelow = self._randbelow + for i in reversed(range(1, len(x))): + # pick an element in x[:i+1] with which to exchange x[i] + j = randbelow(i+1) + x[i], x[j] = x[j], x[i] + else: + _int = int + for i in reversed(range(1, len(x))): + # pick an element in x[:i+1] with which to exchange x[i] + j = _int(random() * (i+1)) + x[i], x[j] = x[j], x[i] + + def sample(self, population, k): + """Chooses k unique random elements from a population sequence or set. + + Returns a new list containing elements from the population while + leaving the original population unchanged. The resulting list is + in selection order so that all sub-slices will also be valid random + samples. This allows raffle winners (the sample) to be partitioned + into grand prize and second place winners (the subslices). + + Members of the population need not be hashable or unique. If the + population contains repeats, then each occurrence is a possible + selection in the sample. + + To choose a sample in a range of integers, use range as an argument. + This is especially fast and space efficient for sampling from a + large population: sample(range(10000000), 60) + """ + + # Sampling without replacement entails tracking either potential + # selections (the pool) in a list or previous selections in a set. + + # When the number of selections is small compared to the + # population, then tracking selections is efficient, requiring + # only a small set and an occasional reselection. For + # a larger number of selections, the pool tracking method is + # preferred since the list takes less space than the + # set and it doesn't suffer from frequent reselections. + + if isinstance(population, _Set): + population = tuple(population) + if not isinstance(population, _Sequence): + raise TypeError("Population must be a sequence or set. For dicts, use list(d).") + randbelow = self._randbelow + n = len(population) + if not 0 <= k <= n: + raise ValueError("Sample larger than population or is negative") + result = [None] * k + setsize = 21 # size of a small set minus size of an empty list + if k > 5: + setsize += 4 ** _ceil(_log(k * 3, 4)) # table size for big sets + if n <= setsize: + # An n-length list is smaller than a k-length set + pool = list(population) + for i in range(k): # invariant: non-selected at [0,n-i) + j = randbelow(n-i) + result[i] = pool[j] + pool[j] = pool[n-i-1] # move non-selected item into vacancy + else: + selected = set() + selected_add = selected.add + for i in range(k): + j = randbelow(n) + while j in selected: + j = randbelow(n) + selected_add(j) + result[i] = population[j] + return result + + def choices(self, population, weights=None, *, cum_weights=None, k=1): + """Return a k sized list of population elements chosen with replacement. + + If the relative weights or cumulative weights are not specified, + the selections are made with equal probability. + + """ + random = self.random + if cum_weights is None: + if weights is None: + _int = int + total = len(population) + return [population[_int(random() * total)] for i in range(k)] + cum_weights = list(_itertools.accumulate(weights)) + elif weights is not None: + raise TypeError('Cannot specify both weights and cumulative weights') + if len(cum_weights) != len(population): + raise ValueError('The number of weights does not match the population') + bisect = _bisect.bisect + total = cum_weights[-1] + hi = len(cum_weights) - 1 + return [population[bisect(cum_weights, random() * total, 0, hi)] + for i in range(k)] + +## -------------------- real-valued distributions ------------------- + +## -------------------- uniform distribution ------------------- + + def uniform(self, a, b): + "Get a random number in the range [a, b) or [a, b] depending on rounding." + return a + (b-a) * self.random() + +## -------------------- triangular -------------------- + + def triangular(self, low=0.0, high=1.0, mode=None): + """Triangular distribution. + + Continuous distribution bounded by given lower and upper limits, + and having a given mode value in-between. + + http://en.wikipedia.org/wiki/Triangular_distribution + + """ + u = self.random() + try: + c = 0.5 if mode is None else (mode - low) / (high - low) + except ZeroDivisionError: + return low + if u > c: + u = 1.0 - u + c = 1.0 - c + low, high = high, low + return low + (high - low) * _sqrt(u * c) + +## -------------------- normal distribution -------------------- + + def normalvariate(self, mu, sigma): + """Normal distribution. + + mu is the mean, and sigma is the standard deviation. + + """ + # mu = mean, sigma = standard deviation + + # Uses Kinderman and Monahan method. Reference: Kinderman, + # A.J. and Monahan, J.F., "Computer generation of random + # variables using the ratio of uniform deviates", ACM Trans + # Math Software, 3, (1977), pp257-260. + + random = self.random + while 1: + u1 = random() + u2 = 1.0 - random() + z = NV_MAGICCONST*(u1-0.5)/u2 + zz = z*z/4.0 + if zz <= -_log(u2): + break + return mu + z*sigma + +## -------------------- lognormal distribution -------------------- + + def lognormvariate(self, mu, sigma): + """Log normal distribution. + + If you take the natural logarithm of this distribution, you'll get a + normal distribution with mean mu and standard deviation sigma. + mu can have any value, and sigma must be greater than zero. + + """ + return _exp(self.normalvariate(mu, sigma)) + +## -------------------- exponential distribution -------------------- + + def expovariate(self, lambd): + """Exponential distribution. + + lambd is 1.0 divided by the desired mean. It should be + nonzero. (The parameter would be called "lambda", but that is + a reserved word in Python.) Returned values range from 0 to + positive infinity if lambd is positive, and from negative + infinity to 0 if lambd is negative. + + """ + # lambd: rate lambd = 1/mean + # ('lambda' is a Python reserved word) + + # we use 1-random() instead of random() to preclude the + # possibility of taking the log of zero. + return -_log(1.0 - self.random())/lambd + +## -------------------- von Mises distribution -------------------- + + def vonmisesvariate(self, mu, kappa): + """Circular data distribution. + + mu is the mean angle, expressed in radians between 0 and 2*pi, and + kappa is the concentration parameter, which must be greater than or + equal to zero. If kappa is equal to zero, this distribution reduces + to a uniform random angle over the range 0 to 2*pi. + + """ + # mu: mean angle (in radians between 0 and 2*pi) + # kappa: concentration parameter kappa (>= 0) + # if kappa = 0 generate uniform random angle + + # Based upon an algorithm published in: Fisher, N.I., + # "Statistical Analysis of Circular Data", Cambridge + # University Press, 1993. + + # Thanks to Magnus Kessler for a correction to the + # implementation of step 4. + + random = self.random + if kappa <= 1e-6: + return TWOPI * random() + + s = 0.5 / kappa + r = s + _sqrt(1.0 + s * s) + + while 1: + u1 = random() + z = _cos(_pi * u1) + + d = z / (r + z) + u2 = random() + if u2 < 1.0 - d * d or u2 <= (1.0 - d) * _exp(d): + break + + q = 1.0 / r + f = (q + z) / (1.0 + q * z) + u3 = random() + if u3 > 0.5: + theta = (mu + _acos(f)) % TWOPI + else: + theta = (mu - _acos(f)) % TWOPI + + return theta + +## -------------------- gamma distribution -------------------- + + def gammavariate(self, alpha, beta): + """Gamma distribution. Not the gamma function! + + Conditions on the parameters are alpha > 0 and beta > 0. + + The probability distribution function is: + + x ** (alpha - 1) * math.exp(-x / beta) + pdf(x) = -------------------------------------- + math.gamma(alpha) * beta ** alpha + + """ + + # alpha > 0, beta > 0, mean is alpha*beta, variance is alpha*beta**2 + + # Warning: a few older sources define the gamma distribution in terms + # of alpha > -1.0 + if alpha <= 0.0 or beta <= 0.0: + raise ValueError('gammavariate: alpha and beta must be > 0.0') + + random = self.random + if alpha > 1.0: + + # Uses R.C.H. Cheng, "The generation of Gamma + # variables with non-integral shape parameters", + # Applied Statistics, (1977), 26, No. 1, p71-74 + + ainv = _sqrt(2.0 * alpha - 1.0) + bbb = alpha - LOG4 + ccc = alpha + ainv + + while 1: + u1 = random() + if not 1e-7 < u1 < .9999999: + continue + u2 = 1.0 - random() + v = _log(u1/(1.0-u1))/ainv + x = alpha*_exp(v) + z = u1*u1*u2 + r = bbb+ccc*v-x + if r + SG_MAGICCONST - 4.5*z >= 0.0 or r >= _log(z): + return x * beta + + elif alpha == 1.0: + # expovariate(1/beta) + u = random() + while u <= 1e-7: + u = random() + return -_log(u) * beta + + else: # alpha is between 0 and 1 (exclusive) + + # Uses ALGORITHM GS of Statistical Computing - Kennedy & Gentle + + while 1: + u = random() + b = (_e + alpha)/_e + p = b*u + if p <= 1.0: + x = p ** (1.0/alpha) + else: + x = -_log((b-p)/alpha) + u1 = random() + if p > 1.0: + if u1 <= x ** (alpha - 1.0): + break + elif u1 <= _exp(-x): + break + return x * beta + +## -------------------- Gauss (faster alternative) -------------------- + + def gauss(self, mu, sigma): + """Gaussian distribution. + + mu is the mean, and sigma is the standard deviation. This is + slightly faster than the normalvariate() function. + + Not thread-safe without a lock around calls. + + """ + + # When x and y are two variables from [0, 1), uniformly + # distributed, then + # + # cos(2*pi*x)*sqrt(-2*log(1-y)) + # sin(2*pi*x)*sqrt(-2*log(1-y)) + # + # are two *independent* variables with normal distribution + # (mu = 0, sigma = 1). + # (Lambert Meertens) + # (corrected version; bug discovered by Mike Miller, fixed by LM) + + # Multithreading note: When two threads call this function + # simultaneously, it is possible that they will receive the + # same return value. The window is very small though. To + # avoid this, you have to use a lock around all calls. (I + # didn't want to slow this down in the serial case by using a + # lock here.) + + random = self.random + z = self.gauss_next + self.gauss_next = None + if z is None: + x2pi = random() * TWOPI + g2rad = _sqrt(-2.0 * _log(1.0 - random())) + z = _cos(x2pi) * g2rad + self.gauss_next = _sin(x2pi) * g2rad + + return mu + z*sigma + +## -------------------- beta -------------------- +## See +## http://mail.python.org/pipermail/python-bugs-list/2001-January/003752.html +## for Ivan Frohne's insightful analysis of why the original implementation: +## +## def betavariate(self, alpha, beta): +## # Discrete Event Simulation in C, pp 87-88. +## +## y = self.expovariate(alpha) +## z = self.expovariate(1.0/beta) +## return z/(y+z) +## +## was dead wrong, and how it probably got that way. + + def betavariate(self, alpha, beta): + """Beta distribution. + + Conditions on the parameters are alpha > 0 and beta > 0. + Returned values range between 0 and 1. + + """ + + # This version due to Janne Sinkkonen, and matches all the std + # texts (e.g., Knuth Vol 2 Ed 3 pg 134 "the beta distribution"). + y = self.gammavariate(alpha, 1.0) + if y == 0: + return 0.0 + else: + return y / (y + self.gammavariate(beta, 1.0)) + +## -------------------- Pareto -------------------- + + def paretovariate(self, alpha): + """Pareto distribution. alpha is the shape parameter.""" + # Jain, pg. 495 + + u = 1.0 - self.random() + return 1.0 / u ** (1.0/alpha) + +## -------------------- Weibull -------------------- + + def weibullvariate(self, alpha, beta): + """Weibull distribution. + + alpha is the scale parameter and beta is the shape parameter. + + """ + # Jain, pg. 499; bug fix courtesy Bill Arms + + u = 1.0 - self.random() + return alpha * (-_log(u)) ** (1.0/beta) + +## --------------- Operating System Random Source ------------------ + +class SystemRandom(Random): + """Alternate random number generator using sources provided + by the operating system (such as /dev/urandom on Unix or + CryptGenRandom on Windows). + + Not available on all systems (see os.urandom() for details). + """ + + def random(self): + """Get the next random number in the range [0.0, 1.0).""" + return (int.from_bytes(_urandom(7), 'big') >> 3) * RECIP_BPF + + def getrandbits(self, k): + """getrandbits(k) -> x. Generates an int with k random bits.""" + if k <= 0: + raise ValueError('number of bits must be greater than zero') + if k != int(k): + raise TypeError('number of bits should be an integer') + numbytes = (k + 7) // 8 # bits / 8 and rounded up + x = int.from_bytes(_urandom(numbytes), 'big') + return x >> (numbytes * 8 - k) # trim excess bits + + def seed(self, *args, **kwds): + "Stub method. Not used for a system random number generator." + return None + + def _notimplemented(self, *args, **kwds): + "Method should not be called for a system random number generator." + raise NotImplementedError('System entropy source does not have state.') + getstate = setstate = _notimplemented + +## -------------------- test program -------------------- + +def _test_generator(n, func, args): + import time + print(n, 'times', func.__name__) + total = 0.0 + sqsum = 0.0 + smallest = 1e10 + largest = -1e10 + t0 = time.perf_counter() + for i in range(n): + x = func(*args) + total += x + sqsum = sqsum + x*x + smallest = min(x, smallest) + largest = max(x, largest) + t1 = time.perf_counter() + print(round(t1-t0, 3), 'sec,', end=' ') + avg = total/n + stddev = _sqrt(sqsum/n - avg*avg) + print('avg %g, stddev %g, min %g, max %g\n' % \ + (avg, stddev, smallest, largest)) + + +def _test(N=2000): + _test_generator(N, random, ()) + _test_generator(N, normalvariate, (0.0, 1.0)) + _test_generator(N, lognormvariate, (0.0, 1.0)) + _test_generator(N, vonmisesvariate, (0.0, 1.0)) + _test_generator(N, gammavariate, (0.01, 1.0)) + _test_generator(N, gammavariate, (0.1, 1.0)) + _test_generator(N, gammavariate, (0.1, 2.0)) + _test_generator(N, gammavariate, (0.5, 1.0)) + _test_generator(N, gammavariate, (0.9, 1.0)) + _test_generator(N, gammavariate, (1.0, 1.0)) + _test_generator(N, gammavariate, (2.0, 1.0)) + _test_generator(N, gammavariate, (20.0, 1.0)) + _test_generator(N, gammavariate, (200.0, 1.0)) + _test_generator(N, gauss, (0.0, 1.0)) + _test_generator(N, betavariate, (3.0, 3.0)) + _test_generator(N, triangular, (0.0, 1.0, 1.0/3.0)) + +# Create one instance, seeded from current time, and export its methods +# as module-level functions. The functions share state across all uses +#(both in the user's code and in the Python libraries), but that's fine +# for most programs and is easier for the casual user than making them +# instantiate their own Random() instance. + +_inst = Random() +seed = _inst.seed +random = _inst.random +uniform = _inst.uniform +triangular = _inst.triangular +randint = _inst.randint +choice = _inst.choice +randrange = _inst.randrange +sample = _inst.sample +shuffle = _inst.shuffle +choices = _inst.choices +normalvariate = _inst.normalvariate +lognormvariate = _inst.lognormvariate +expovariate = _inst.expovariate +vonmisesvariate = _inst.vonmisesvariate +gammavariate = _inst.gammavariate +gauss = _inst.gauss +betavariate = _inst.betavariate +paretovariate = _inst.paretovariate +weibullvariate = _inst.weibullvariate +getstate = _inst.getstate +setstate = _inst.setstate +getrandbits = _inst.getrandbits + +if hasattr(_os, "fork"): + _os.register_at_fork(after_in_child=_inst.seed) + + +if __name__ == '__main__': + _test() diff --git a/env/Lib/re.py b/env/Lib/re.py new file mode 100644 index 0000000..94d4865 --- /dev/null +++ b/env/Lib/re.py @@ -0,0 +1,366 @@ +# +# Secret Labs' Regular Expression Engine +# +# re-compatible interface for the sre matching engine +# +# Copyright (c) 1998-2001 by Secret Labs AB. All rights reserved. +# +# This version of the SRE library can be redistributed under CNRI's +# Python 1.6 license. For any other use, please contact Secret Labs +# AB (info@pythonware.com). +# +# Portions of this engine have been developed in cooperation with +# CNRI. Hewlett-Packard provided funding for 1.6 integration and +# other compatibility work. +# + +r"""Support for regular expressions (RE). + +This module provides regular expression matching operations similar to +those found in Perl. It supports both 8-bit and Unicode strings; both +the pattern and the strings being processed can contain null bytes and +characters outside the US ASCII range. + +Regular expressions can contain both special and ordinary characters. +Most ordinary characters, like "A", "a", or "0", are the simplest +regular expressions; they simply match themselves. You can +concatenate ordinary characters, so last matches the string 'last'. + +The special characters are: + "." Matches any character except a newline. + "^" Matches the start of the string. + "$" Matches the end of the string or just before the newline at + the end of the string. + "*" Matches 0 or more (greedy) repetitions of the preceding RE. + Greedy means that it will match as many repetitions as possible. + "+" Matches 1 or more (greedy) repetitions of the preceding RE. + "?" Matches 0 or 1 (greedy) of the preceding RE. + *?,+?,?? Non-greedy versions of the previous three special characters. + {m,n} Matches from m to n repetitions of the preceding RE. + {m,n}? Non-greedy version of the above. + "\\" Either escapes special characters or signals a special sequence. + [] Indicates a set of characters. + A "^" as the first character indicates a complementing set. + "|" A|B, creates an RE that will match either A or B. + (...) Matches the RE inside the parentheses. + The contents can be retrieved or matched later in the string. + (?aiLmsux) Set the A, I, L, M, S, U, or X flag for the RE (see below). + (?:...) Non-grouping version of regular parentheses. + (?P...) 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). + (?= _MAXCACHE: + # Drop the oldest item + try: + del _cache[next(iter(_cache))] + except (StopIteration, RuntimeError, KeyError): + pass + _cache[type(pattern), pattern, flags] = p + return p + +@functools.lru_cache(_MAXCACHE) +def _compile_repl(repl, pattern): + # internal: compile replacement pattern + return sre_parse.parse_template(repl, pattern) + +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 copyreg + +def _pickle(p): + return _compile, (p.pattern, p.flags) + +copyreg.pickle(Pattern, _pickle, _compile) + +# -------------------------------------------------------------------- +# experimental stuff (see python-dev discussions for details) + +class Scanner: + def __init__(self, lexicon, flags=0): + from sre_constants import BRANCH, SUBPATTERN + if isinstance(flags, RegexFlag): + flags = flags.value + self.lexicon = lexicon + # combine phrases into a compound pattern + p = [] + s = sre_parse.Pattern() + s.flags = flags + for phrase, action in lexicon: + gid = s.opengroup() + p.append(sre_parse.SubPattern(s, [ + (SUBPATTERN, (gid, 0, 0, sre_parse.parse(phrase, flags))), + ])) + s.closegroup(gid, 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 True: + m = match() + if not m: + break + j = m.end() + if i == j: + break + action = self.lexicon[m.lastindex-1][1] + if callable(action): + self.match = m + action = action(self, m.group()) + if action is not None: + append(action) + i = j + return result, string[i:] diff --git a/env/Lib/reprlib.py b/env/Lib/reprlib.py new file mode 100644 index 0000000..616b343 --- /dev/null +++ b/env/Lib/reprlib.py @@ -0,0 +1,161 @@ +"""Redo the builtin repr() (representation) but with limits on most sizes.""" + +__all__ = ["Repr", "repr", "recursive_repr"] + +import builtins +from itertools import islice +from _thread import get_ident + +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.__qualname__ = getattr(user_function, '__qualname__') + wrapper.__annotations__ = getattr(user_function, '__annotations__', {}) + return wrapper + + return decorating_function + +class Repr: + + def __init__(self): + self.maxlevel = 6 + self.maxtuple = 6 + self.maxlist = 6 + self.maxarray = 5 + self.maxdict = 4 + self.maxset = 6 + self.maxfrozenset = 6 + self.maxdeque = 6 + self.maxstring = 30 + self.maxlong = 40 + self.maxother = 30 + + def repr(self, x): + return self.repr1(x, self.maxlevel) + + def repr1(self, x, level): + typename = type(x).__name__ + if ' ' in typename: + parts = typename.split() + typename = '_'.join(parts) + if hasattr(self, 'repr_' + typename): + return getattr(self, 'repr_' + typename)(x, level) + else: + return self.repr_instance(x, level) + + def _repr_iterable(self, x, level, left, right, maxiter, trail=''): + n = len(x) + if level <= 0 and n: + s = '...' + else: + newlevel = level - 1 + repr1 = self.repr1 + pieces = [repr1(elem, newlevel) for elem in islice(x, maxiter)] + if n > maxiter: pieces.append('...') + s = ', '.join(pieces) + if n == 1 and trail: right = trail + right + return '%s%s%s' % (left, s, right) + + def repr_tuple(self, x, level): + return self._repr_iterable(x, level, '(', ')', self.maxtuple, ',') + + def repr_list(self, x, level): + return self._repr_iterable(x, level, '[', ']', self.maxlist) + + def repr_array(self, x, level): + if not x: + return "array('%s')" % x.typecode + header = "array('%s', [" % x.typecode + return self._repr_iterable(x, level, header, '])', self.maxarray) + + def repr_set(self, x, level): + if not x: + return 'set()' + x = _possibly_sorted(x) + return self._repr_iterable(x, level, '{', '}', self.maxset) + + def repr_frozenset(self, x, level): + if not x: + return 'frozenset()' + x = _possibly_sorted(x) + return self._repr_iterable(x, level, 'frozenset({', '})', + self.maxfrozenset) + + def repr_deque(self, x, level): + return self._repr_iterable(x, level, 'deque([', '])', self.maxdeque) + + def repr_dict(self, x, level): + n = len(x) + if n == 0: return '{}' + if level <= 0: return '{...}' + newlevel = level - 1 + repr1 = self.repr1 + pieces = [] + for key in islice(_possibly_sorted(x), self.maxdict): + keyrepr = repr1(key, newlevel) + valrepr = repr1(x[key], newlevel) + pieces.append('%s: %s' % (keyrepr, valrepr)) + if n > self.maxdict: pieces.append('...') + s = ', '.join(pieces) + return '{%s}' % (s,) + + def repr_str(self, x, level): + s = builtins.repr(x[:self.maxstring]) + if len(s) > self.maxstring: + i = max(0, (self.maxstring-3)//2) + j = max(0, self.maxstring-3-i) + s = builtins.repr(x[:i] + x[len(x)-j:]) + s = s[:i] + '...' + s[len(s)-j:] + return s + + def repr_int(self, x, level): + s = builtins.repr(x) # XXX Hope this isn't too slow... + if len(s) > self.maxlong: + i = max(0, (self.maxlong-3)//2) + j = max(0, self.maxlong-3-i) + s = s[:i] + '...' + s[len(s)-j:] + return s + + def repr_instance(self, x, level): + try: + s = builtins.repr(x) + # Bugs in x.__repr__() can cause arbitrary + # exceptions -- then make up something + except Exception: + return '<%s instance at %#x>' % (x.__class__.__name__, id(x)) + if len(s) > self.maxother: + i = max(0, (self.maxother-3)//2) + j = max(0, self.maxother-3-i) + s = s[:i] + '...' + s[len(s)-j:] + return s + + +def _possibly_sorted(x): + # Since not all sequences of items can be sorted and comparison + # functions may raise arbitrary exceptions, return an unsorted + # sequence in that case. + try: + return sorted(x) + except Exception: + return list(x) + +aRepr = Repr() +repr = aRepr.repr diff --git a/env/Lib/rlcompleter.py b/env/Lib/rlcompleter.py new file mode 100644 index 0000000..bca4a7b --- /dev/null +++ b/env/Lib/rlcompleter.py @@ -0,0 +1,205 @@ +"""Word completion for GNU readline. + +The completer completes keywords, built-ins and globals in a selectable +namespace (which defaults to __main__); when completing NAME.NAME..., it +evaluates (!) the expression up to the last dot and completes its attributes. + +It's very cool to do "import sys" type "sys.", hit the completion key (twice), +and see the list of names defined by the sys module! + +Tip: to use the tab key as the completion key, call + + readline.parse_and_bind("tab: complete") + +Notes: + +- Exceptions raised by the completer function are *ignored* (and generally cause + the completion to fail). This is a feature -- since readline sets the tty + device in raw (or cbreak) mode, printing a traceback wouldn't work well + without some complicated hoopla to save, reset and restore the tty state. + +- The evaluation of the NAME.NAME... form may cause arbitrary application + defined code to be executed if an object with a __getattr__ hook is found. + Since it is the responsibility of the application (or the user) to enable this + feature, I consider this an acceptable risk. More complicated expressions + (e.g. function calls or indexing operations) are *not* evaluated. + +- When the original stdin is not a tty device, GNU readline is never + used, and this module (and the readline module) are silently inactive. + +""" + +import atexit +import builtins +import __main__ + +__all__ = ["Completer"] + +class Completer: + def __init__(self, namespace = None): + """Create a new completer for the command line. + + Completer([namespace]) -> completer instance. + + If unspecified, the default namespace where completions are performed + is __main__ (technically, __main__.__dict__). Namespaces should be + given as dictionaries. + + Completer instances should be used as the completion mechanism of + readline via the set_completer() call: + + readline.set_completer(Completer(my_namespace).complete) + """ + + if namespace and not isinstance(namespace, dict): + raise TypeError('namespace must be a dictionary') + + # Don't bind to namespace quite yet, but flag whether the user wants a + # specific namespace or to use __main__.__dict__. This will allow us + # to bind to __main__.__dict__ at completion time, not now. + if namespace is None: + self.use_main_ns = 1 + else: + self.use_main_ns = 0 + self.namespace = namespace + + def complete(self, text, state): + """Return the next possible completion for 'text'. + + This is called successively with state == 0, 1, 2, ... until it + returns None. The completion should begin with 'text'. + + """ + if self.use_main_ns: + self.namespace = __main__.__dict__ + + if not text.strip(): + if state == 0: + if _readline_available: + readline.insert_text('\t') + readline.redisplay() + return '' + else: + return '\t' + else: + return None + + if state == 0: + if "." in text: + self.matches = self.attr_matches(text) + else: + self.matches = self.global_matches(text) + try: + return self.matches[state] + except IndexError: + return None + + def _callable_postfix(self, val, word): + if callable(val): + word = word + "(" + return word + + def global_matches(self, text): + """Compute matches when text is a simple name. + + Return a list of all keywords, built-in functions and names currently + defined in self.namespace that match. + + """ + import keyword + matches = [] + seen = {"__builtins__"} + n = len(text) + for word in keyword.kwlist: + if word[:n] == text: + seen.add(word) + if word in {'finally', 'try'}: + word = word + ':' + elif word not in {'False', 'None', 'True', + 'break', 'continue', 'pass', + 'else'}: + word = word + ' ' + matches.append(word) + for nspace in [self.namespace, builtins.__dict__]: + for word, val in nspace.items(): + if word[:n] == text and word not in seen: + seen.add(word) + matches.append(self._callable_postfix(val, word)) + return matches + + def attr_matches(self, text): + """Compute matches when text contains a dot. + + Assuming the text is of the form NAME.NAME....[NAME], and is + evaluable in self.namespace, it will be evaluated and its attributes + (as revealed by dir()) are used as possible completions. (For class + instances, class members are also considered.) + + WARNING: this can still invoke arbitrary C code, if an object + with a __getattr__ hook is evaluated. + + """ + import re + m = re.match(r"(\w+(\.\w+)*)\.(\w*)", text) + if not m: + return [] + expr, attr = m.group(1, 3) + try: + thisobject = eval(expr, self.namespace) + except Exception: + return [] + + # get the content of the object, except __builtins__ + words = set(dir(thisobject)) + words.discard("__builtins__") + + if hasattr(thisobject, '__class__'): + words.add('__class__') + words.update(get_class_members(thisobject.__class__)) + matches = [] + n = len(attr) + if attr == '': + noprefix = '_' + elif attr == '_': + noprefix = '__' + else: + noprefix = None + while True: + for word in words: + if (word[:n] == attr and + not (noprefix and word[:n+1] == noprefix)): + match = "%s.%s" % (expr, word) + try: + val = getattr(thisobject, word) + except Exception: + pass # Include even if attribute not set + else: + match = self._callable_postfix(val, match) + matches.append(match) + if matches or not noprefix: + break + if noprefix == '_': + noprefix = '__' + else: + noprefix = None + matches.sort() + return matches + +def get_class_members(klass): + ret = dir(klass) + if hasattr(klass,'__bases__'): + for base in klass.__bases__: + ret = ret + get_class_members(base) + return ret + +try: + import readline +except ImportError: + _readline_available = False +else: + readline.set_completer(Completer().complete) + # Release references early at shutdown (the readline module's + # contents are quasi-immortal, and the completer function holds a + # reference to globals). + atexit.register(lambda: readline.set_completer(None)) + _readline_available = True diff --git a/env/Lib/shutil.py b/env/Lib/shutil.py new file mode 100644 index 0000000..fc6fb4e --- /dev/null +++ b/env/Lib/shutil.py @@ -0,0 +1,1188 @@ +"""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 +import fnmatch +import collections +import errno + +try: + import zlib + del zlib + _ZLIB_SUPPORTED = True +except ImportError: + _ZLIB_SUPPORTED = False + +try: + import bz2 + del bz2 + _BZ2_SUPPORTED = True +except ImportError: + _BZ2_SUPPORTED = False + +try: + import lzma + del lzma + _LZMA_SUPPORTED = True +except ImportError: + _LZMA_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", "chown", "which", "get_terminal_size", + "SameFileError"] + # disk_usage is added later, if available on the platform + +class Error(OSError): + pass + +class SameFileError(Error): + """Raised when source and destination are the same file.""" + +class SpecialFileError(OSError): + """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(OSError): + """Raised when a command could not be executed""" + +class ReadError(OSError): + """Raised when an archive cannot be read""" + +class RegistryError(Exception): + """Raised when a registry operation with the archiving + and unpacking registries fails""" + + +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, *, follow_symlinks=True): + """Copy data from src to dst. + + If follow_symlinks is not set and src is a symbolic link, a new + symlink will be created instead of copying the file it points to. + + """ + if _samefile(src, dst): + raise SameFileError("{!r} and {!r} are the same file".format(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) + + if not follow_symlinks and os.path.islink(src): + os.symlink(os.readlink(src), dst) + else: + with open(src, 'rb') as fsrc: + with open(dst, 'wb') as fdst: + copyfileobj(fsrc, fdst) + return dst + +def copymode(src, dst, *, follow_symlinks=True): + """Copy mode bits from src to dst. + + If follow_symlinks is not set, symlinks aren't followed if and only + if both `src` and `dst` are symlinks. If `lchmod` isn't available + (e.g. Linux) this method does nothing. + + """ + if not follow_symlinks and os.path.islink(src) and os.path.islink(dst): + if hasattr(os, 'lchmod'): + stat_func, chmod_func = os.lstat, os.lchmod + else: + return + elif hasattr(os, 'chmod'): + stat_func, chmod_func = os.stat, os.chmod + else: + return + + st = stat_func(src) + chmod_func(dst, stat.S_IMODE(st.st_mode)) + +if hasattr(os, 'listxattr'): + def _copyxattr(src, dst, *, follow_symlinks=True): + """Copy extended filesystem attributes from `src` to `dst`. + + Overwrite existing attributes. + + If `follow_symlinks` is false, symlinks won't be followed. + + """ + + try: + names = os.listxattr(src, follow_symlinks=follow_symlinks) + except OSError as e: + if e.errno not in (errno.ENOTSUP, errno.ENODATA, errno.EINVAL): + raise + return + for name in names: + try: + value = os.getxattr(src, name, follow_symlinks=follow_symlinks) + os.setxattr(dst, name, value, follow_symlinks=follow_symlinks) + except OSError as e: + if e.errno not in (errno.EPERM, errno.ENOTSUP, errno.ENODATA, + errno.EINVAL): + raise +else: + def _copyxattr(*args, **kwargs): + pass + +def copystat(src, dst, *, follow_symlinks=True): + """Copy file metadata + + Copy the permission bits, last access time, last modification time, and + flags from `src` to `dst`. On Linux, copystat() also copies the "extended + attributes" where possible. The file contents, owner, and group are + unaffected. `src` and `dst` are path names given as strings. + + If the optional flag `follow_symlinks` is not set, symlinks aren't + followed if and only if both `src` and `dst` are symlinks. + """ + def _nop(*args, ns=None, follow_symlinks=None): + pass + + # follow symlinks (aka don't not follow symlinks) + follow = follow_symlinks or not (os.path.islink(src) and os.path.islink(dst)) + if follow: + # use the real function if it exists + def lookup(name): + return getattr(os, name, _nop) + else: + # use the real function only if it exists + # *and* it supports follow_symlinks + def lookup(name): + fn = getattr(os, name, _nop) + if fn in os.supports_follow_symlinks: + return fn + return _nop + + st = lookup("stat")(src, follow_symlinks=follow) + mode = stat.S_IMODE(st.st_mode) + lookup("utime")(dst, ns=(st.st_atime_ns, st.st_mtime_ns), + follow_symlinks=follow) + # We must copy extended attributes before the file is (potentially) + # chmod()'ed read-only, otherwise setxattr() will error with -EACCES. + _copyxattr(src, dst, follow_symlinks=follow) + try: + lookup("chmod")(dst, mode, follow_symlinks=follow) + except NotImplementedError: + # if we got a NotImplementedError, it's because + # * follow_symlinks=False, + # * lchown() is unavailable, and + # * either + # * fchownat() is unavailable or + # * fchownat() doesn't implement AT_SYMLINK_NOFOLLOW. + # (it returned ENOSUP.) + # therefore we're out of options--we simply cannot chown the + # symlink. give up, suppress the error. + # (which is what shutil always did in this circumstance.) + pass + if hasattr(st, 'st_flags'): + try: + lookup("chflags")(dst, st.st_flags, follow_symlinks=follow) + except OSError as why: + for err in 'EOPNOTSUPP', 'ENOTSUP': + if hasattr(errno, err) and why.errno == getattr(errno, err): + break + else: + raise + +def copy(src, dst, *, follow_symlinks=True): + """Copy data and mode bits ("cp src dst"). Return the file's destination. + + The destination may be a directory. + + If follow_symlinks is false, symlinks won't be followed. This + resembles GNU's "cp -P src dst". + + If source and destination are the same file, a SameFileError will be + raised. + + """ + if os.path.isdir(dst): + dst = os.path.join(dst, os.path.basename(src)) + copyfile(src, dst, follow_symlinks=follow_symlinks) + copymode(src, dst, follow_symlinks=follow_symlinks) + return dst + +def copy2(src, dst, *, follow_symlinks=True): + """Copy data and metadata. Return the file's destination. + + Metadata is copied with copystat(). Please see the copystat function + for more information. + + The destination may be a directory. + + If follow_symlinks is false, symlinks won't be followed. This + resembles GNU's "cp -P src dst". + + """ + if os.path.isdir(dst): + dst = os.path.join(dst, os.path.basename(src)) + copyfile(src, dst, follow_symlinks=follow_symlinks) + copystat(src, dst, follow_symlinks=follow_symlinks) + return 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: + # We can't just leave it to `copy_function` because legacy + # code with a custom `copy_function` may rely on copytree + # doing the right thing. + os.symlink(linkto, dstname) + copystat(srcname, dstname, follow_symlinks=not symlinks) + 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 + if os.path.isdir(srcname): + copytree(srcname, dstname, symlinks, ignore, + copy_function) + else: + 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 OSError as why: + errors.append((srcname, dstname, str(why))) + try: + copystat(src, dst) + except OSError as why: + # Copying file access times may fail on Windows + if getattr(why, 'winerror', None) is None: + errors.append((src, dst, str(why))) + if errors: + raise Error(errors) + return dst + +# version vulnerable to race conditions +def _rmtree_unsafe(path, onerror): + try: + with os.scandir(path) as scandir_it: + entries = list(scandir_it) + except OSError: + onerror(os.scandir, path, sys.exc_info()) + entries = [] + for entry in entries: + fullname = entry.path + try: + is_dir = entry.is_dir(follow_symlinks=False) + except OSError: + is_dir = False + if is_dir: + try: + if entry.is_symlink(): + # This can only happen if someone replaces + # a directory with a symlink after the call to + # os.scandir or entry.is_dir above. + raise OSError("Cannot call rmtree on a symbolic link") + except OSError: + onerror(os.path.islink, fullname, sys.exc_info()) + continue + _rmtree_unsafe(fullname, onerror) + else: + try: + os.unlink(fullname) + except OSError: + onerror(os.unlink, fullname, sys.exc_info()) + try: + os.rmdir(path) + except OSError: + onerror(os.rmdir, path, sys.exc_info()) + +# Version using fd-based APIs to protect against races +def _rmtree_safe_fd(topfd, path, onerror): + try: + with os.scandir(topfd) as scandir_it: + entries = list(scandir_it) + except OSError as err: + err.filename = path + onerror(os.scandir, path, sys.exc_info()) + return + for entry in entries: + fullname = os.path.join(path, entry.name) + try: + is_dir = entry.is_dir(follow_symlinks=False) + if is_dir: + orig_st = entry.stat(follow_symlinks=False) + is_dir = stat.S_ISDIR(orig_st.st_mode) + except OSError: + is_dir = False + if is_dir: + try: + dirfd = os.open(entry.name, os.O_RDONLY, dir_fd=topfd) + except OSError: + onerror(os.open, fullname, sys.exc_info()) + else: + try: + if os.path.samestat(orig_st, os.fstat(dirfd)): + _rmtree_safe_fd(dirfd, fullname, onerror) + try: + os.rmdir(entry.name, dir_fd=topfd) + except OSError: + onerror(os.rmdir, fullname, sys.exc_info()) + else: + try: + # This can only happen if someone replaces + # a directory with a symlink after the call to + # os.scandir or stat.S_ISDIR above. + raise OSError("Cannot call rmtree on a symbolic " + "link") + except OSError: + onerror(os.path.islink, fullname, sys.exc_info()) + finally: + os.close(dirfd) + else: + try: + os.unlink(entry.name, dir_fd=topfd) + except OSError: + onerror(os.unlink, fullname, sys.exc_info()) + +_use_fd_functions = ({os.open, os.stat, os.unlink, os.rmdir} <= + os.supports_dir_fd and + os.scandir in os.supports_fd and + os.stat in os.supports_follow_symlinks) + +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 platform and implementation dependent; + 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 + if _use_fd_functions: + # While the unsafe rmtree works fine on bytes, the fd based does not. + if isinstance(path, bytes): + path = os.fsdecode(path) + # Note: To guard against symlink races, we use the standard + # lstat()/open()/fstat() trick. + try: + orig_st = os.lstat(path) + except Exception: + onerror(os.lstat, path, sys.exc_info()) + return + try: + fd = os.open(path, os.O_RDONLY) + except Exception: + onerror(os.lstat, path, sys.exc_info()) + return + try: + if os.path.samestat(orig_st, os.fstat(fd)): + _rmtree_safe_fd(fd, path, onerror) + try: + os.rmdir(path) + except OSError: + onerror(os.rmdir, path, sys.exc_info()) + else: + try: + # 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()) + finally: + os.close(fd) + else: + 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 + return _rmtree_unsafe(path, onerror) + +# Allow introspection of whether or not the hardening against symlink +# attacks is supported on the current platform +rmtree.avoids_symlink_attacks = _use_fd_functions + +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. + sep = os.path.sep + (os.path.altsep or '') + return os.path.basename(path.rstrip(sep)) + +def move(src, dst, copy_function=copy2): + """Recursively move a file or directory to another location. This is + similar to the Unix "mv" command. Return the file or directory's + destination. + + 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. Symlinks are + recreated under the new name if os.rename() fails because of cross + filesystem renames. + + The optional `copy_function` argument is a callable that will be used + to copy the source or it will be delegated to `copytree`. + By default, copy2() is used, but any function that supports the same + signature (like copy()) can be used. + + 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.islink(src): + linkto = os.readlink(src) + os.symlink(linkto, real_dst) + os.unlink(src) + elif os.path.isdir(src): + if _destinsrc(src, dst): + raise Error("Cannot move a directory '%s' into itself" + " '%s'." % (src, dst)) + copytree(src, real_dst, copy_function=copy_function, + symlinks=True) + rmtree(src) + else: + copy_function(src, real_dst) + os.unlink(src) + return real_dst + +def _destinsrc(src, dst): + src = os.path.abspath(src) + dst = os.path.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", "xz", 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", ".bz2", or ".xz"). + + Returns the output filename. + """ + if compress is None: + tar_compression = '' + elif _ZLIB_SUPPORTED and compress == 'gzip': + tar_compression = 'gz' + elif _BZ2_SUPPORTED and compress == 'bzip2': + tar_compression = 'bz2' + elif _LZMA_SUPPORTED and compress == 'xz': + tar_compression = 'xz' + else: + raise ValueError("bad value for 'compress', or compression format not " + "supported : {0}".format(compress)) + + import tarfile # late import for breaking circular dependency + + compress_ext = '.' + tar_compression if compress else '' + archive_name = base_name + '.tar' + compress_ext + archive_dir = os.path.dirname(archive_name) + + if archive_dir and 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) + try: + tar.add(base_dir, filter=_set_uid_gid) + finally: + tar.close() + + return archive_name + +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". Returns the + name of the output zip file. + """ + import zipfile # late import for breaking circular dependency + + zip_filename = base_name + ".zip" + archive_dir = os.path.dirname(base_name) + + if archive_dir and 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 logger is not None: + logger.info("creating '%s' and adding '%s' to it", + zip_filename, base_dir) + + if not dry_run: + with zipfile.ZipFile(zip_filename, "w", + compression=zipfile.ZIP_DEFLATED) as zf: + path = os.path.normpath(base_dir) + if path != os.curdir: + zf.write(path, path) + if logger is not None: + logger.info("adding '%s'", path) + for dirpath, dirnames, filenames in os.walk(base_dir): + for name in sorted(dirnames): + path = os.path.normpath(os.path.join(dirpath, name)) + zf.write(path, path) + if logger is not None: + logger.info("adding '%s'", path) + for name in filenames: + path = os.path.normpath(os.path.join(dirpath, name)) + if os.path.isfile(path): + zf.write(path, path) + if logger is not None: + logger.info("adding '%s'", path) + + return zip_filename + +_ARCHIVE_FORMATS = { + 'tar': (_make_tarball, [('compress', None)], "uncompressed tar file"), +} + +if _ZLIB_SUPPORTED: + _ARCHIVE_FORMATS['gztar'] = (_make_tarball, [('compress', 'gzip')], + "gzip'ed tar-file") + _ARCHIVE_FORMATS['zip'] = (_make_zipfile, [], "ZIP file") + +if _BZ2_SUPPORTED: + _ARCHIVE_FORMATS['bztar'] = (_make_tarball, [('compress', 'bzip2')], + "bzip2'ed tar-file") + +if _LZMA_SUPPORTED: + _ARCHIVE_FORMATS['xztar'] = (_make_tarball, [('compress', 'xz')], + "xz'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 callable(function): + 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", "gztar", + "bztar", or "xztar". Or any other registered format. + + '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) from None + + 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 callable(function): + raise TypeError('The registered function must be a callable') + + +def register_unpack_format(name, extensions, function, extra_args=None, + description=''): + """Registers an unpack format. + + `name` is the name of the format. `extensions` is a list of extensions + corresponding to the format. + + `function` is the callable that will be + used to unpack archives. The callable will receive archives to unpack. + If it's unable to handle an archive, it needs to raise a ReadError + exception. + + If provided, `extra_args` is a sequence of + (name, value) tuples that will be passed as arguments to the callable. + description can be provided to describe the format, and will be returned + by the get_unpack_formats() function. + """ + if extra_args is None: + extra_args = [] + _check_unpack_options(extensions, function, extra_args) + _UNPACK_FORMATS[name] = extensions, function, extra_args, description + +def unregister_unpack_format(name): + """Removes the pack format from the registry.""" + del _UNPACK_FORMATS[name] + +def _ensure_directory(path): + """Ensure that the parent directory of `path` exists""" + dirname = os.path.dirname(path) + if not os.path.isdir(dirname): + os.makedirs(dirname) + +def _unpack_zipfile(filename, extract_dir): + """Unpack zip `filename` to `extract_dir` + """ + import zipfile # late import for breaking circular dependency + + 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/tar.xz `filename` to `extract_dir` + """ + import tarfile # late import for breaking circular dependency + 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 = { + 'tar': (['.tar'], _unpack_tarfile, [], "uncompressed tar file"), + 'zip': (['.zip'], _unpack_zipfile, [], "ZIP file"), +} + +if _ZLIB_SUPPORTED: + _UNPACK_FORMATS['gztar'] = (['.tar.gz', '.tgz'], _unpack_tarfile, [], + "gzip'ed tar-file") + +if _BZ2_SUPPORTED: + _UNPACK_FORMATS['bztar'] = (['.tar.bz2', '.tbz2'], _unpack_tarfile, [], + "bzip2'ed tar-file") + +if _LZMA_SUPPORTED: + _UNPACK_FORMATS['xztar'] = (['.tar.xz', '.txz'], _unpack_tarfile, [], + "xz'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", "gztar", "bztar", + or "xztar". 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() + + extract_dir = os.fspath(extract_dir) + filename = os.fspath(filename) + + if format is not None: + try: + format_info = _UNPACK_FORMATS[format] + except KeyError: + raise ValueError("Unknown unpack format '{0}'".format(format)) from None + + 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) + + +if hasattr(os, 'statvfs'): + + __all__.append('disk_usage') + _ntuple_diskusage = collections.namedtuple('usage', 'total used free') + _ntuple_diskusage.total.__doc__ = 'Total space in bytes' + _ntuple_diskusage.used.__doc__ = 'Used space in bytes' + _ntuple_diskusage.free.__doc__ = 'Free space in bytes' + + def disk_usage(path): + """Return disk usage statistics about the given path. + + Returned value is a named tuple with attributes 'total', 'used' and + 'free', which are the amount of total, used and free space, in bytes. + """ + st = os.statvfs(path) + free = st.f_bavail * st.f_frsize + total = st.f_blocks * st.f_frsize + used = (st.f_blocks - st.f_bfree) * st.f_frsize + return _ntuple_diskusage(total, used, free) + +elif os.name == 'nt': + + import nt + __all__.append('disk_usage') + _ntuple_diskusage = collections.namedtuple('usage', 'total used free') + + def disk_usage(path): + """Return disk usage statistics about the given path. + + Returned values is a named tuple with attributes 'total', 'used' and + 'free', which are the amount of total, used and free space, in bytes. + """ + total, free = nt._getdiskusage(path) + used = total - free + return _ntuple_diskusage(total, used, free) + + +def chown(path, user=None, group=None): + """Change owner user and group of the given path. + + user and group can be the uid/gid or the user/group names, and in that case, + they are converted to their respective uid/gid. + """ + + if user is None and group is None: + raise ValueError("user and/or group must be set") + + _user = user + _group = group + + # -1 means don't change it + if user is None: + _user = -1 + # user can either be an int (the uid) or a string (the system username) + elif isinstance(user, str): + _user = _get_uid(user) + if _user is None: + raise LookupError("no such user: {!r}".format(user)) + + if group is None: + _group = -1 + elif not isinstance(group, int): + _group = _get_gid(group) + if _group is None: + raise LookupError("no such group: {!r}".format(group)) + + os.chown(path, _user, _group) + +def get_terminal_size(fallback=(80, 24)): + """Get the size of the terminal window. + + For each of the two dimensions, the environment variable, COLUMNS + and LINES respectively, is checked. If the variable is defined and + the value is a positive integer, it is used. + + When COLUMNS or LINES is not defined, which is the common case, + the terminal connected to sys.__stdout__ is queried + by invoking os.get_terminal_size. + + If the terminal size cannot be successfully queried, either because + the system doesn't support querying, or because we are not + connected to a terminal, the value given in fallback parameter + is used. Fallback defaults to (80, 24) which is the default + size used by many terminal emulators. + + The value returned is a named tuple of type os.terminal_size. + """ + # columns, lines are the working values + try: + columns = int(os.environ['COLUMNS']) + except (KeyError, ValueError): + columns = 0 + + try: + lines = int(os.environ['LINES']) + except (KeyError, ValueError): + lines = 0 + + # only query if necessary + if columns <= 0 or lines <= 0: + try: + size = os.get_terminal_size(sys.__stdout__.fileno()) + except (AttributeError, ValueError, OSError): + # stdout is None, closed, detached, or not a terminal, or + # os.get_terminal_size() is unsupported + size = os.terminal_size(fallback) + if columns <= 0: + columns = size.columns + if lines <= 0: + lines = size.lines + + return os.terminal_size((columns, lines)) + +def which(cmd, mode=os.F_OK | os.X_OK, path=None): + """Given a command, mode, and a PATH string, return the path which + conforms to the given mode on the PATH, or None if there is no such + file. + + `mode` defaults to os.F_OK | os.X_OK. `path` defaults to the result + of os.environ.get("PATH"), or can be overridden with a custom search + path. + + """ + # Check that a given file can be accessed with the correct mode. + # Additionally check that `file` is not a directory, as on Windows + # directories pass the os.access check. + def _access_check(fn, mode): + return (os.path.exists(fn) and os.access(fn, mode) + and not os.path.isdir(fn)) + + # If we're given a path with a directory part, look it up directly rather + # than referring to PATH directories. This includes checking relative to the + # current directory, e.g. ./script + if os.path.dirname(cmd): + if _access_check(cmd, mode): + return cmd + return None + + if path is None: + path = os.environ.get("PATH", None) + if path is None: + try: + path = os.confstr("CS_PATH") + except (AttributeError, ValueError): + # os.confstr() or CS_PATH is not available + path = os.defpath + # bpo-35755: Don't use os.defpath if the PATH environment variable is + # set to an empty string + + # PATH='' doesn't match, whereas PATH=':' looks in the current directory + if not path: + return None + path = path.split(os.pathsep) + + if sys.platform == "win32": + # The current directory takes precedence on Windows. + if not os.curdir in path: + path.insert(0, os.curdir) + + # PATHEXT is necessary to check on Windows. + pathext = os.environ.get("PATHEXT", "").split(os.pathsep) + # See if the given file matches any of the expected path extensions. + # This will allow us to short circuit when given "python.exe". + # If it does match, only test that one, otherwise we have to try + # others. + if any(cmd.lower().endswith(ext.lower()) for ext in pathext): + files = [cmd] + else: + files = [cmd + ext for ext in pathext] + else: + # On other platforms you don't have things like PATHEXT to tell you + # what file suffixes are executable, so just pass on cmd as-is. + files = [cmd] + + seen = set() + for dir in path: + normdir = os.path.normcase(dir) + if not normdir in seen: + seen.add(normdir) + for thefile in files: + name = os.path.join(dir, thefile) + if _access_check(name, mode): + return name + return None diff --git a/env/Lib/site-packages/Click-7.0.dist-info/INSTALLER b/env/Lib/site-packages/Click-7.0.dist-info/INSTALLER new file mode 100644 index 0000000..a1b589e --- /dev/null +++ b/env/Lib/site-packages/Click-7.0.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/env/Lib/site-packages/Click-7.0.dist-info/LICENSE.txt b/env/Lib/site-packages/Click-7.0.dist-info/LICENSE.txt new file mode 100644 index 0000000..87ce152 --- /dev/null +++ b/env/Lib/site-packages/Click-7.0.dist-info/LICENSE.txt @@ -0,0 +1,39 @@ +Copyright © 2014 by the Pallets team. + +Some rights reserved. + +Redistribution and use in source and binary forms of the software as +well as documentation, with or without modification, are permitted +provided that the following conditions are met: + +- Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + +- Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +- Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE AND DOCUMENTATION IS PROVIDED BY THE COPYRIGHT HOLDERS AND +CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, +BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND +FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF +USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF +THIS SOFTWARE AND DOCUMENTATION, EVEN IF ADVISED OF THE POSSIBILITY OF +SUCH DAMAGE. + +---- + +Click uses parts of optparse written by Gregory P. Ward and maintained +by the Python Software Foundation. This is limited to code in parser.py. + +Copyright © 2001-2006 Gregory P. Ward. All rights reserved. +Copyright © 2002-2006 Python Software Foundation. All rights reserved. diff --git a/env/Lib/site-packages/Click-7.0.dist-info/METADATA b/env/Lib/site-packages/Click-7.0.dist-info/METADATA new file mode 100644 index 0000000..625bdad --- /dev/null +++ b/env/Lib/site-packages/Click-7.0.dist-info/METADATA @@ -0,0 +1,121 @@ +Metadata-Version: 2.1 +Name: Click +Version: 7.0 +Summary: Composable command line interface toolkit +Home-page: https://palletsprojects.com/p/click/ +Author: Armin Ronacher +Author-email: armin.ronacher@active-4.com +Maintainer: Pallets Team +Maintainer-email: contact@palletsprojects.com +License: BSD +Project-URL: Documentation, https://click.palletsprojects.com/ +Project-URL: Code, https://github.com/pallets/click +Project-URL: Issue tracker, https://github.com/pallets/click/issues +Platform: UNKNOWN +Classifier: Development Status :: 5 - Production/Stable +Classifier: Intended Audience :: Developers +Classifier: License :: OSI Approved :: BSD License +Classifier: Operating System :: OS Independent +Classifier: Programming Language :: Python +Classifier: Programming Language :: Python :: 2 +Classifier: Programming Language :: Python :: 2.7 +Classifier: Programming Language :: Python :: 3 +Classifier: Programming Language :: Python :: 3.4 +Classifier: Programming Language :: Python :: 3.5 +Classifier: Programming Language :: Python :: 3.6 +Classifier: Programming Language :: Python :: 3.7 +Requires-Python: >=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.* + +\$ click\_ +========== + +Click is a Python package for creating beautiful command line interfaces +in a composable way with as little code as necessary. It's the "Command +Line Interface Creation Kit". It's highly configurable but comes with +sensible defaults out of the box. + +It aims to make the process of writing command line tools quick and fun +while also preventing any frustration caused by the inability to +implement an intended CLI API. + +Click in three points: + +- Arbitrary nesting of commands +- Automatic help page generation +- Supports lazy loading of subcommands at runtime + + +Installing +---------- + +Install and update using `pip`_: + +.. code-block:: text + + $ pip install click + +Click supports Python 3.4 and newer, Python 2.7, and PyPy. + +.. _pip: https://pip.pypa.io/en/stable/quickstart/ + + +A Simple Example +---------------- + +What does it look like? Here is an example of a simple Click program: + +.. code-block:: python + + import click + + @click.command() + @click.option("--count", default=1, help="Number of greetings.") + @click.option("--name", prompt="Your name", + help="The person to greet.") + def hello(count, name): + """Simple program that greets NAME for a total of COUNT times.""" + for _ in range(count): + click.echo("Hello, %s!" % name) + + if __name__ == '__main__': + hello() + +And what it looks like when run: + +.. code-block:: text + + $ python hello.py --count=3 + Your name: Click + Hello, Click! + Hello, Click! + Hello, Click! + + +Donate +------ + +The Pallets organization develops and supports Click and other popular +packages. In order to grow the community of contributors and users, and +allow the maintainers to devote more time to the projects, `please +donate today`_. + +.. _please donate today: https://palletsprojects.com/donate + + +Links +----- + +* Website: https://palletsprojects.com/p/click/ +* Documentation: https://click.palletsprojects.com/ +* License: `BSD `_ +* Releases: https://pypi.org/project/click/ +* Code: https://github.com/pallets/click +* Issue tracker: https://github.com/pallets/click/issues +* Test status: + + * Linux, Mac: https://travis-ci.org/pallets/click + * Windows: https://ci.appveyor.com/project/pallets/click + +* Test coverage: https://codecov.io/gh/pallets/click + + diff --git a/env/Lib/site-packages/Click-7.0.dist-info/RECORD b/env/Lib/site-packages/Click-7.0.dist-info/RECORD new file mode 100644 index 0000000..ecf17c1 --- /dev/null +++ b/env/Lib/site-packages/Click-7.0.dist-info/RECORD @@ -0,0 +1,40 @@ +Click-7.0.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +Click-7.0.dist-info/LICENSE.txt,sha256=4hIxn676T0Wcisk3_chVcECjyrivKTZsoqSNI5AlIlw,1876 +Click-7.0.dist-info/METADATA,sha256=-r8jeke3Zer4diRvT1MjFZuiJ6yTT_qFP39svLqdaLI,3516 +Click-7.0.dist-info/RECORD,, +Click-7.0.dist-info/WHEEL,sha256=gduuPyBvFJQSQ0zdyxF7k0zynDXbIbvg5ZBHoXum5uk,110 +Click-7.0.dist-info/top_level.txt,sha256=J1ZQogalYS4pphY_lPECoNMfw0HzTSrZglC4Yfwo4xA,6 +click/__init__.py,sha256=HjGThQ7tef9kkwCV371TBnrf0SAi6fKfU_jtEnbYTvQ,2789 +click/__pycache__/__init__.cpython-37.pyc,, +click/__pycache__/_bashcomplete.cpython-37.pyc,, +click/__pycache__/_compat.cpython-37.pyc,, +click/__pycache__/_termui_impl.cpython-37.pyc,, +click/__pycache__/_textwrap.cpython-37.pyc,, +click/__pycache__/_unicodefun.cpython-37.pyc,, +click/__pycache__/_winconsole.cpython-37.pyc,, +click/__pycache__/core.cpython-37.pyc,, +click/__pycache__/decorators.cpython-37.pyc,, +click/__pycache__/exceptions.cpython-37.pyc,, +click/__pycache__/formatting.cpython-37.pyc,, +click/__pycache__/globals.cpython-37.pyc,, +click/__pycache__/parser.cpython-37.pyc,, +click/__pycache__/termui.cpython-37.pyc,, +click/__pycache__/testing.cpython-37.pyc,, +click/__pycache__/types.cpython-37.pyc,, +click/__pycache__/utils.cpython-37.pyc,, +click/_bashcomplete.py,sha256=iaNUmtxag0YPfxba3TDYCNietiTMQIrvhRLj-H8okFU,11014 +click/_compat.py,sha256=vYmvoj4opPxo-c-2GMQQjYT_r_QkOKybkfGoeVrt0dA,23399 +click/_termui_impl.py,sha256=xHmLtOJhKUCVD6168yucJ9fknUJPAMs0eUTPgVUO-GQ,19611 +click/_textwrap.py,sha256=gwS4m7bdQiJnzaDG8osFcRb-5vn4t4l2qSCy-5csCEc,1198 +click/_unicodefun.py,sha256=QHy2_5jYlX-36O-JVrTHNnHOqg8tquUR0HmQFev7Ics,4364 +click/_winconsole.py,sha256=PPWVak8Iikm_gAPsxMrzwsVFCvHgaW3jPaDWZ1JBl3U,8965 +click/core.py,sha256=q8FLcDZsagBGSRe5Y9Hi_FGvAeZvusNfoO5EkhkSQ8Y,75305 +click/decorators.py,sha256=idKt6duLUUfAFftrHoREi8MJSd39XW36pUVHthdglwk,11226 +click/exceptions.py,sha256=CNpAjBAE7qjaV4WChxQeak95e5yUOau8AsvT-8m6wss,7663 +click/formatting.py,sha256=eh-cypTUAhpI3HD-K4ZpR3vCiURIO62xXvKkR3tNUTM,8889 +click/globals.py,sha256=oQkou3ZQ5DgrbVM6BwIBirwiqozbjfirzsLGAlLRRdg,1514 +click/parser.py,sha256=m-nGZz4VwprM42_qtFlWFGo7yRJQxkBlRcZodoH593Y,15510 +click/termui.py,sha256=o_ZXB2jyvL2Rce7P_bFGq452iyBq9ykJyRApIPMCZO0,23207 +click/testing.py,sha256=aYGqY_iWLu2p4k7lkuJ6t3fqpf6aPGqTsyLzNY_ngKg,13062 +click/types.py,sha256=2Q929p-aBP_ZYuMFJqJR-Ipucofv3fmDc5JzBDPmzJU,23287 +click/utils.py,sha256=6-D0WkAxvv9FkgHXSHwDIv0l9Gdx9Mm6Z5vuKNLIfZI,15763 diff --git a/env/Lib/site-packages/Click-7.0.dist-info/WHEEL b/env/Lib/site-packages/Click-7.0.dist-info/WHEEL new file mode 100644 index 0000000..1316c41 --- /dev/null +++ b/env/Lib/site-packages/Click-7.0.dist-info/WHEEL @@ -0,0 +1,6 @@ +Wheel-Version: 1.0 +Generator: bdist_wheel (0.31.1) +Root-Is-Purelib: true +Tag: py2-none-any +Tag: py3-none-any + diff --git a/env/Lib/site-packages/Click-7.0.dist-info/top_level.txt b/env/Lib/site-packages/Click-7.0.dist-info/top_level.txt new file mode 100644 index 0000000..dca9a90 --- /dev/null +++ b/env/Lib/site-packages/Click-7.0.dist-info/top_level.txt @@ -0,0 +1 @@ +click diff --git a/env/Lib/site-packages/Flask-1.1.1.dist-info/INSTALLER b/env/Lib/site-packages/Flask-1.1.1.dist-info/INSTALLER new file mode 100644 index 0000000..a1b589e --- /dev/null +++ b/env/Lib/site-packages/Flask-1.1.1.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/env/Lib/site-packages/Flask-1.1.1.dist-info/LICENSE.rst b/env/Lib/site-packages/Flask-1.1.1.dist-info/LICENSE.rst new file mode 100644 index 0000000..9d227a0 --- /dev/null +++ b/env/Lib/site-packages/Flask-1.1.1.dist-info/LICENSE.rst @@ -0,0 +1,28 @@ +Copyright 2010 Pallets + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + +1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +3. Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A +PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED +TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/env/Lib/site-packages/Flask-1.1.1.dist-info/METADATA b/env/Lib/site-packages/Flask-1.1.1.dist-info/METADATA new file mode 100644 index 0000000..08fcc91 --- /dev/null +++ b/env/Lib/site-packages/Flask-1.1.1.dist-info/METADATA @@ -0,0 +1,134 @@ +Metadata-Version: 2.1 +Name: Flask +Version: 1.1.1 +Summary: A simple framework for building complex web applications. +Home-page: https://palletsprojects.com/p/flask/ +Author: Armin Ronacher +Author-email: armin.ronacher@active-4.com +Maintainer: Pallets +Maintainer-email: contact@palletsprojects.com +License: BSD-3-Clause +Project-URL: Documentation, https://flask.palletsprojects.com/ +Project-URL: Code, https://github.com/pallets/flask +Project-URL: Issue tracker, https://github.com/pallets/flask/issues +Platform: UNKNOWN +Classifier: Development Status :: 5 - Production/Stable +Classifier: Environment :: Web Environment +Classifier: Framework :: Flask +Classifier: Intended Audience :: Developers +Classifier: License :: OSI Approved :: BSD License +Classifier: Operating System :: OS Independent +Classifier: Programming Language :: Python +Classifier: Programming Language :: Python :: 2 +Classifier: Programming Language :: Python :: 2.7 +Classifier: Programming Language :: Python :: 3 +Classifier: Programming Language :: Python :: 3.5 +Classifier: Programming Language :: Python :: 3.6 +Classifier: Programming Language :: Python :: 3.7 +Classifier: Topic :: Internet :: WWW/HTTP :: Dynamic Content +Classifier: Topic :: Internet :: WWW/HTTP :: WSGI :: Application +Classifier: Topic :: Software Development :: Libraries :: Application Frameworks +Classifier: Topic :: Software Development :: Libraries :: Python Modules +Requires-Python: >=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.* +Requires-Dist: Werkzeug (>=0.15) +Requires-Dist: Jinja2 (>=2.10.1) +Requires-Dist: itsdangerous (>=0.24) +Requires-Dist: click (>=5.1) +Provides-Extra: dev +Requires-Dist: pytest ; extra == 'dev' +Requires-Dist: coverage ; extra == 'dev' +Requires-Dist: tox ; extra == 'dev' +Requires-Dist: sphinx ; extra == 'dev' +Requires-Dist: pallets-sphinx-themes ; extra == 'dev' +Requires-Dist: sphinxcontrib-log-cabinet ; extra == 'dev' +Requires-Dist: sphinx-issues ; extra == 'dev' +Provides-Extra: docs +Requires-Dist: sphinx ; extra == 'docs' +Requires-Dist: pallets-sphinx-themes ; extra == 'docs' +Requires-Dist: sphinxcontrib-log-cabinet ; extra == 'docs' +Requires-Dist: sphinx-issues ; extra == 'docs' +Provides-Extra: dotenv +Requires-Dist: python-dotenv ; extra == 'dotenv' + +Flask +===== + +Flask is a lightweight `WSGI`_ web application framework. It is designed +to make getting started quick and easy, with the ability to scale up to +complex applications. It began as a simple wrapper around `Werkzeug`_ +and `Jinja`_ and has become one of the most popular Python web +application frameworks. + +Flask offers suggestions, but doesn't enforce any dependencies or +project layout. It is up to the developer to choose the tools and +libraries they want to use. There are many extensions provided by the +community that make adding new functionality easy. + + +Installing +---------- + +Install and update using `pip`_: + +.. code-block:: text + + pip install -U Flask + + +A Simple Example +---------------- + +.. code-block:: python + + from flask import Flask + + app = Flask(__name__) + + @app.route("/") + def hello(): + return "Hello, World!" + +.. code-block:: text + + $ env FLASK_APP=hello.py flask run + * Serving Flask app "hello" + * Running on http://127.0.0.1:5000/ (Press CTRL+C to quit) + + +Contributing +------------ + +For guidance on setting up a development environment and how to make a +contribution to Flask, see the `contributing guidelines`_. + +.. _contributing guidelines: https://github.com/pallets/flask/blob/master/CONTRIBUTING.rst + + +Donate +------ + +The Pallets organization develops and supports Flask and the libraries +it uses. In order to grow the community of contributors and users, and +allow the maintainers to devote more time to the projects, `please +donate today`_. + +.. _please donate today: https://psfmember.org/civicrm/contribute/transact?reset=1&id=20 + + +Links +----- + +* Website: https://palletsprojects.com/p/flask/ +* Documentation: https://flask.palletsprojects.com/ +* Releases: https://pypi.org/project/Flask/ +* Code: https://github.com/pallets/flask +* Issue tracker: https://github.com/pallets/flask/issues +* Test status: https://dev.azure.com/pallets/flask/_build +* Official chat: https://discord.gg/t6rrQZH + +.. _WSGI: https://wsgi.readthedocs.io +.. _Werkzeug: https://www.palletsprojects.com/p/werkzeug/ +.. _Jinja: https://www.palletsprojects.com/p/jinja/ +.. _pip: https://pip.pypa.io/en/stable/quickstart/ + + diff --git a/env/Lib/site-packages/Flask-1.1.1.dist-info/RECORD b/env/Lib/site-packages/Flask-1.1.1.dist-info/RECORD new file mode 100644 index 0000000..56b978b --- /dev/null +++ b/env/Lib/site-packages/Flask-1.1.1.dist-info/RECORD @@ -0,0 +1,48 @@ +../../Scripts/flask.exe,sha256=7ngZHTXj-cW9n06xfudyNS56UO9tAQ2m0-dS3-bMkuI,103286 +Flask-1.1.1.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +Flask-1.1.1.dist-info/LICENSE.rst,sha256=SJqOEQhQntmKN7uYPhHg9-HTHwvY-Zp5yESOf_N9B-o,1475 +Flask-1.1.1.dist-info/METADATA,sha256=Ht4R6TpTKOaXOmmQHhEF3A0Obpzde2Ai0kzNdu6-VWQ,4400 +Flask-1.1.1.dist-info/RECORD,, +Flask-1.1.1.dist-info/WHEEL,sha256=h_aVn5OB2IERUjMbi2pucmR_zzWJtk303YXvhh60NJ8,110 +Flask-1.1.1.dist-info/entry_points.txt,sha256=gBLA1aKg0OYR8AhbAfg8lnburHtKcgJLDU52BBctN0k,42 +Flask-1.1.1.dist-info/top_level.txt,sha256=dvi65F6AeGWVU0TBpYiC04yM60-FX1gJFkK31IKQr5c,6 +flask/__init__.py,sha256=qaBW4gy9Xxmdc3ygYO0_H214H1VpF7fq8xRR4XbqRjE,1894 +flask/__main__.py,sha256=fjVtt3QTANXlpJCOv3Ha7d5H-76MwzSIOab7SFD9TEk,254 +flask/__pycache__/__init__.cpython-37.pyc,, +flask/__pycache__/__main__.cpython-37.pyc,, +flask/__pycache__/_compat.cpython-37.pyc,, +flask/__pycache__/app.cpython-37.pyc,, +flask/__pycache__/blueprints.cpython-37.pyc,, +flask/__pycache__/cli.cpython-37.pyc,, +flask/__pycache__/config.cpython-37.pyc,, +flask/__pycache__/ctx.cpython-37.pyc,, +flask/__pycache__/debughelpers.cpython-37.pyc,, +flask/__pycache__/globals.cpython-37.pyc,, +flask/__pycache__/helpers.cpython-37.pyc,, +flask/__pycache__/logging.cpython-37.pyc,, +flask/__pycache__/sessions.cpython-37.pyc,, +flask/__pycache__/signals.cpython-37.pyc,, +flask/__pycache__/templating.cpython-37.pyc,, +flask/__pycache__/testing.cpython-37.pyc,, +flask/__pycache__/views.cpython-37.pyc,, +flask/__pycache__/wrappers.cpython-37.pyc,, +flask/_compat.py,sha256=8KPT54Iig96TuLipdogLRHNYToIcg-xPhnSV5VRERnw,4099 +flask/app.py,sha256=gLZInxueeQ9dkBo1wrntZ-bZqiDT4rYxy_AQ1xraFDc,98066 +flask/blueprints.py,sha256=vkdm8NusGsfZUeIfPdCluj733QFmiQcT4Sk1tuZLUjw,21400 +flask/cli.py,sha256=_WhPG1bggNdrP0QO95Vex6VJpDqTsVK0z54Y5poljKU,30933 +flask/config.py,sha256=3dejvQRYfNHw_V7dCLMxU8UNFpL34xIKemN7gHZIZ8Y,10052 +flask/ctx.py,sha256=cks-omGedkxawHFo6bKIrdOHsJCAgg1i_NWw_htxb5U,16724 +flask/debughelpers.py,sha256=-whvPKuAoU8AZ9c1z_INuOeBgfYDqE1J2xNBsoriugU,6475 +flask/globals.py,sha256=OgcHb6_NCyX6-TldciOdKcyj4PNfyQwClxdMhvov6aA,1637 +flask/helpers.py,sha256=x2Pa85R5dV6uA5f5423JTb6x4u6ZaMGf8sfosUZ76dQ,43004 +flask/json/__init__.py,sha256=6nITbZYiYOPB8Qfi1-dvsblwn01KRz8VOsMBIZyaYek,11988 +flask/json/__pycache__/__init__.cpython-37.pyc,, +flask/json/__pycache__/tag.cpython-37.pyc,, +flask/json/tag.py,sha256=vq9GOllg_0kTWKuVFrwmkeOQzR-jdBD23x-89JyCCQI,8306 +flask/logging.py,sha256=WcY5UkqTysGfmosyygSlXyZYGwOp3y-VsE6ehoJ48dk,3250 +flask/sessions.py,sha256=G0KsEkr_i1LG_wOINwFSOW3ts7Xbv4bNgEZKc7TRloc,14360 +flask/signals.py,sha256=yYLOed2x8WnQ7pirGalQYfpYpCILJ0LJhmNSrnWvjqw,2212 +flask/templating.py,sha256=F8E_IZXn9BGsjMzUJ5N_ACMyZdiFBp_SSEaUunvfZ7g,4939 +flask/testing.py,sha256=b0QaEejx0UcXqfSFP43k5W57bTVeDyrNK3uPD8JUpCk,10146 +flask/views.py,sha256=eeWnadLAj0QdQPLtjKipDetRZyG62CT2y7fNOFDJz0g,5802 +flask/wrappers.py,sha256=kgsvtZuMM6RQaDqhRbc5Pcj9vqTnaERl2pmXcdGL7LU,4736 diff --git a/env/Lib/site-packages/Flask-1.1.1.dist-info/WHEEL b/env/Lib/site-packages/Flask-1.1.1.dist-info/WHEEL new file mode 100644 index 0000000..78e6f69 --- /dev/null +++ b/env/Lib/site-packages/Flask-1.1.1.dist-info/WHEEL @@ -0,0 +1,6 @@ +Wheel-Version: 1.0 +Generator: bdist_wheel (0.33.4) +Root-Is-Purelib: true +Tag: py2-none-any +Tag: py3-none-any + diff --git a/env/Lib/site-packages/Flask-1.1.1.dist-info/entry_points.txt b/env/Lib/site-packages/Flask-1.1.1.dist-info/entry_points.txt new file mode 100644 index 0000000..1eb0252 --- /dev/null +++ b/env/Lib/site-packages/Flask-1.1.1.dist-info/entry_points.txt @@ -0,0 +1,3 @@ +[console_scripts] +flask = flask.cli:main + diff --git a/env/Lib/site-packages/Flask-1.1.1.dist-info/top_level.txt b/env/Lib/site-packages/Flask-1.1.1.dist-info/top_level.txt new file mode 100644 index 0000000..7e10602 --- /dev/null +++ b/env/Lib/site-packages/Flask-1.1.1.dist-info/top_level.txt @@ -0,0 +1 @@ +flask diff --git a/env/Lib/site-packages/Jinja2-2.10.3.dist-info/INSTALLER b/env/Lib/site-packages/Jinja2-2.10.3.dist-info/INSTALLER new file mode 100644 index 0000000..a1b589e --- /dev/null +++ b/env/Lib/site-packages/Jinja2-2.10.3.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/env/Lib/site-packages/Jinja2-2.10.3.dist-info/LICENSE.rst b/env/Lib/site-packages/Jinja2-2.10.3.dist-info/LICENSE.rst new file mode 100644 index 0000000..c37cae4 --- /dev/null +++ b/env/Lib/site-packages/Jinja2-2.10.3.dist-info/LICENSE.rst @@ -0,0 +1,28 @@ +Copyright 2007 Pallets + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + +1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +3. Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A +PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED +TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/env/Lib/site-packages/Jinja2-2.10.3.dist-info/METADATA b/env/Lib/site-packages/Jinja2-2.10.3.dist-info/METADATA new file mode 100644 index 0000000..11c545a --- /dev/null +++ b/env/Lib/site-packages/Jinja2-2.10.3.dist-info/METADATA @@ -0,0 +1,103 @@ +Metadata-Version: 2.1 +Name: Jinja2 +Version: 2.10.3 +Summary: A very fast and expressive template engine. +Home-page: https://palletsprojects.com/p/jinja/ +Author: Armin Ronacher +Author-email: armin.ronacher@active-4.com +Maintainer: Pallets +Maintainer-email: contact@palletsprojects.com +License: BSD-3-Clause +Project-URL: Documentation, https://jinja.palletsprojects.com/ +Project-URL: Code, https://github.com/pallets/jinja +Project-URL: Issue tracker, https://github.com/pallets/jinja/issues +Platform: UNKNOWN +Classifier: Development Status :: 5 - Production/Stable +Classifier: Environment :: Web Environment +Classifier: Intended Audience :: Developers +Classifier: License :: OSI Approved :: BSD License +Classifier: Operating System :: OS Independent +Classifier: Programming Language :: Python +Classifier: Programming Language :: Python :: 2 +Classifier: Programming Language :: Python :: 2.7 +Classifier: Programming Language :: Python :: 3 +Classifier: Programming Language :: Python :: 3.5 +Classifier: Programming Language :: Python :: 3.6 +Classifier: Programming Language :: Python :: 3.7 +Classifier: Programming Language :: Python :: Implementation :: CPython +Classifier: Programming Language :: Python :: Implementation :: PyPy +Classifier: Topic :: Internet :: WWW/HTTP :: Dynamic Content +Classifier: Topic :: Software Development :: Libraries :: Python Modules +Classifier: Topic :: Text Processing :: Markup :: HTML +Requires-Dist: MarkupSafe (>=0.23) +Provides-Extra: i18n +Requires-Dist: Babel (>=0.8) ; extra == 'i18n' + +Jinja +===== + +Jinja is a fast, expressive, extensible templating engine. Special +placeholders in the template allow writing code similar to Python +syntax. Then the template is passed data to render the final document. + +It includes: + +- Template inheritance and inclusion. +- Define and import macros within templates. +- HTML templates can use autoescaping to prevent XSS from untrusted + user input. +- A sandboxed environment can safely render untrusted templates. +- AsyncIO support for generating templates and calling async + functions. +- I18N support with Babel. +- Templates are compiled to optimized Python code just-in-time and + cached, or can be compiled ahead-of-time. +- Exceptions point to the correct line in templates to make debugging + easier. +- Extensible filters, tests, functions, and even syntax. + +Jinja's philosophy is that while application logic belongs in Python if +possible, it shouldn't make the template designer's job difficult by +restricting functionality too much. + + +Installing +---------- + +Install and update using `pip`_: + +.. code-block:: text + + $ pip install -U Jinja2 + +.. _pip: https://pip.pypa.io/en/stable/quickstart/ + + +In A Nutshell +------------- + +.. code-block:: jinja + + {% extends "base.html" %} + {% block title %}Members{% endblock %} + {% block content %} +

+ {% endblock %} + + +Links +----- + +- Website: https://palletsprojects.com/p/jinja/ +- Documentation: https://jinja.palletsprojects.com/ +- Releases: https://pypi.org/project/Jinja2/ +- Code: https://github.com/pallets/jinja +- Issue tracker: https://github.com/pallets/jinja/issues +- Test status: https://dev.azure.com/pallets/jinja/_build +- Official chat: https://discord.gg/t6rrQZH + + diff --git a/env/Lib/site-packages/Jinja2-2.10.3.dist-info/RECORD b/env/Lib/site-packages/Jinja2-2.10.3.dist-info/RECORD new file mode 100644 index 0000000..5971ef4 --- /dev/null +++ b/env/Lib/site-packages/Jinja2-2.10.3.dist-info/RECORD @@ -0,0 +1,61 @@ +Jinja2-2.10.3.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +Jinja2-2.10.3.dist-info/LICENSE.rst,sha256=O0nc7kEF6ze6wQ-vG-JgQI_oXSUrjp3y4JefweCUQ3s,1475 +Jinja2-2.10.3.dist-info/METADATA,sha256=RD_zg-jTU2K8LbwVqRNYNxo-RmRD-g08ZimL2R1mUEg,3380 +Jinja2-2.10.3.dist-info/RECORD,, +Jinja2-2.10.3.dist-info/WHEEL,sha256=8zNYZbwQSXoB9IfXOjPfeNwvAsALAjffgk27FqvCWbo,110 +Jinja2-2.10.3.dist-info/entry_points.txt,sha256=Qy_DkVo6Xj_zzOtmErrATe8lHZhOqdjpt3e4JJAGyi8,61 +Jinja2-2.10.3.dist-info/top_level.txt,sha256=PkeVWtLb3-CqjWi1fO29OCbj55EhX_chhKrCdrVe_zs,7 +jinja2/__init__.py,sha256=9fIkcl501fvTG_9oTAHveZrNmWHUnC3cb1ccCJQ1VzQ,2616 +jinja2/__pycache__/__init__.cpython-37.pyc,, +jinja2/__pycache__/_compat.cpython-37.pyc,, +jinja2/__pycache__/_identifier.cpython-37.pyc,, +jinja2/__pycache__/asyncfilters.cpython-37.pyc,, +jinja2/__pycache__/asyncsupport.cpython-37.pyc,, +jinja2/__pycache__/bccache.cpython-37.pyc,, +jinja2/__pycache__/compiler.cpython-37.pyc,, +jinja2/__pycache__/constants.cpython-37.pyc,, +jinja2/__pycache__/debug.cpython-37.pyc,, +jinja2/__pycache__/defaults.cpython-37.pyc,, +jinja2/__pycache__/environment.cpython-37.pyc,, +jinja2/__pycache__/exceptions.cpython-37.pyc,, +jinja2/__pycache__/ext.cpython-37.pyc,, +jinja2/__pycache__/filters.cpython-37.pyc,, +jinja2/__pycache__/idtracking.cpython-37.pyc,, +jinja2/__pycache__/lexer.cpython-37.pyc,, +jinja2/__pycache__/loaders.cpython-37.pyc,, +jinja2/__pycache__/meta.cpython-37.pyc,, +jinja2/__pycache__/nativetypes.cpython-37.pyc,, +jinja2/__pycache__/nodes.cpython-37.pyc,, +jinja2/__pycache__/optimizer.cpython-37.pyc,, +jinja2/__pycache__/parser.cpython-37.pyc,, +jinja2/__pycache__/runtime.cpython-37.pyc,, +jinja2/__pycache__/sandbox.cpython-37.pyc,, +jinja2/__pycache__/tests.cpython-37.pyc,, +jinja2/__pycache__/utils.cpython-37.pyc,, +jinja2/__pycache__/visitor.cpython-37.pyc,, +jinja2/_compat.py,sha256=mS-2MTiCpkkOd-JKvxQQxNQFEEu-YVwUnwVHruplYoo,2685 +jinja2/_identifier.py,sha256=W1QBSY-iJsyt6oR_nKSuNNCzV95vLIOYgUNPUI1d5gU,1726 +jinja2/asyncfilters.py,sha256=cTDPvrS8Hp_IkwsZ1m9af_lr5nHysw7uTa5gV0NmZVE,4144 +jinja2/asyncsupport.py,sha256=UErQ3YlTLaSjFb94P4MVn08-aVD9jJxty2JVfMRb-1M,7878 +jinja2/bccache.py,sha256=FF8Qij2CGK6oKdHb9Vz396YHh1kssAxqX2XsB6uMvLk,12719 +jinja2/compiler.py,sha256=BqC5U6JxObSRhblyT_a6Tp5GtEU5z3US1a4jLQaxxgo,65386 +jinja2/constants.py,sha256=uwwV8ZUhHhacAuz5PTwckfsbqBaqM7aKfyJL7kGX5YQ,1626 +jinja2/debug.py,sha256=BAWmOZJGeOKY6g3OCJ1v0_GrUKz1LHp4Z-3m_tJIT-U,12281 +jinja2/defaults.py,sha256=Em-95hmsJxIenDCZFB1YSvf9CNhe9rBmytN3yUrBcWA,1400 +jinja2/environment.py,sha256=VnkAkqw8JbjZct4tAyHlpBrka2vqB-Z58RAP-32P1ZY,50849 +jinja2/exceptions.py,sha256=_Rj-NVi98Q6AiEjYQOsP8dEIdu5AlmRHzcSNOPdWix4,4428 +jinja2/ext.py,sha256=atMQydEC86tN1zUsdQiHw5L5cF62nDbqGue25Yiu3N4,24500 +jinja2/filters.py,sha256=yOAJk0MsH-_gEC0i0U6NweVQhbtYaC-uE8xswHFLF4w,36528 +jinja2/idtracking.py,sha256=2GbDSzIvGArEBGLkovLkqEfmYxmWsEf8c3QZwM4uNsw,9197 +jinja2/lexer.py,sha256=ySEPoXd1g7wRjsuw23uimS6nkGN5aqrYwcOKxCaVMBQ,28559 +jinja2/loaders.py,sha256=xiTuURKAEObyym0nU8PCIXu_Qp8fn0AJ5oIADUUm-5Q,17382 +jinja2/meta.py,sha256=fmKHxkmZYAOm9QyWWy8EMd6eefAIh234rkBMW2X4ZR8,4340 +jinja2/nativetypes.py,sha256=_sJhS8f-8Q0QMIC0dm1YEdLyxEyoO-kch8qOL5xUDfE,7308 +jinja2/nodes.py,sha256=L10L_nQDfubLhO3XjpF9qz46FSh2clL-3e49ogVlMmA,30853 +jinja2/optimizer.py,sha256=MsdlFACJ0FRdPtjmCAdt7JQ9SGrXFaDNUaslsWQaG3M,1722 +jinja2/parser.py,sha256=lPzTEbcpTRBLw8ii6OYyExHeAhaZLMA05Hpv4ll3ULk,35875 +jinja2/runtime.py,sha256=nmO38W08p1d1S4MdvtCgzzLIqVs4J4nwwiMZjZmVQaY,27644 +jinja2/sandbox.py,sha256=i6nacG3tCN-4UwEpzDpl6TcQdCR-zRMsoEahiQ01LiY,17080 +jinja2/tests.py,sha256=18yVEZwhD79Osy5wlK_m0GTtY_9OPtiSklURgvltGo8,4214 +jinja2/utils.py,sha256=xYUsq6h5_xDLVT4b5dvdjQ6H7S9WfUglrVIJ6qyPTRw,20501 +jinja2/visitor.py,sha256=JD1H1cANA29JcntFfN5fPyqQxB4bI4wC00BzZa-XHks,3316 diff --git a/env/Lib/site-packages/Jinja2-2.10.3.dist-info/WHEEL b/env/Lib/site-packages/Jinja2-2.10.3.dist-info/WHEEL new file mode 100644 index 0000000..8b701e9 --- /dev/null +++ b/env/Lib/site-packages/Jinja2-2.10.3.dist-info/WHEEL @@ -0,0 +1,6 @@ +Wheel-Version: 1.0 +Generator: bdist_wheel (0.33.6) +Root-Is-Purelib: true +Tag: py2-none-any +Tag: py3-none-any + diff --git a/env/Lib/site-packages/Jinja2-2.10.3.dist-info/entry_points.txt b/env/Lib/site-packages/Jinja2-2.10.3.dist-info/entry_points.txt new file mode 100644 index 0000000..3619483 --- /dev/null +++ b/env/Lib/site-packages/Jinja2-2.10.3.dist-info/entry_points.txt @@ -0,0 +1,3 @@ +[babel.extractors] +jinja2 = jinja2.ext:babel_extract [i18n] + diff --git a/env/Lib/site-packages/Jinja2-2.10.3.dist-info/top_level.txt b/env/Lib/site-packages/Jinja2-2.10.3.dist-info/top_level.txt new file mode 100644 index 0000000..7f7afbf --- /dev/null +++ b/env/Lib/site-packages/Jinja2-2.10.3.dist-info/top_level.txt @@ -0,0 +1 @@ +jinja2 diff --git a/env/Lib/site-packages/MarkupSafe-1.1.1.dist-info/INSTALLER b/env/Lib/site-packages/MarkupSafe-1.1.1.dist-info/INSTALLER new file mode 100644 index 0000000..a1b589e --- /dev/null +++ b/env/Lib/site-packages/MarkupSafe-1.1.1.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/env/Lib/site-packages/MarkupSafe-1.1.1.dist-info/LICENSE.rst b/env/Lib/site-packages/MarkupSafe-1.1.1.dist-info/LICENSE.rst new file mode 100644 index 0000000..9d227a0 --- /dev/null +++ b/env/Lib/site-packages/MarkupSafe-1.1.1.dist-info/LICENSE.rst @@ -0,0 +1,28 @@ +Copyright 2010 Pallets + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + +1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +3. Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A +PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED +TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/env/Lib/site-packages/MarkupSafe-1.1.1.dist-info/METADATA b/env/Lib/site-packages/MarkupSafe-1.1.1.dist-info/METADATA new file mode 100644 index 0000000..b208d93 --- /dev/null +++ b/env/Lib/site-packages/MarkupSafe-1.1.1.dist-info/METADATA @@ -0,0 +1,103 @@ +Metadata-Version: 2.1 +Name: MarkupSafe +Version: 1.1.1 +Summary: Safely add untrusted strings to HTML/XML markup. +Home-page: https://palletsprojects.com/p/markupsafe/ +Author: Armin Ronacher +Author-email: armin.ronacher@active-4.com +Maintainer: The Pallets Team +Maintainer-email: contact@palletsprojects.com +License: BSD-3-Clause +Project-URL: Documentation, https://markupsafe.palletsprojects.com/ +Project-URL: Code, https://github.com/pallets/markupsafe +Project-URL: Issue tracker, https://github.com/pallets/markupsafe/issues +Platform: UNKNOWN +Classifier: Development Status :: 5 - Production/Stable +Classifier: Environment :: Web Environment +Classifier: Intended Audience :: Developers +Classifier: License :: OSI Approved :: BSD License +Classifier: Operating System :: OS Independent +Classifier: Programming Language :: Python +Classifier: Programming Language :: Python :: 2 +Classifier: Programming Language :: Python :: 2.7 +Classifier: Programming Language :: Python :: 3 +Classifier: Programming Language :: Python :: 3.4 +Classifier: Programming Language :: Python :: 3.5 +Classifier: Programming Language :: Python :: 3.6 +Classifier: Programming Language :: Python :: 3.7 +Classifier: Topic :: Internet :: WWW/HTTP :: Dynamic Content +Classifier: Topic :: Software Development :: Libraries :: Python Modules +Classifier: Topic :: Text Processing :: Markup :: HTML +Requires-Python: >=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.* + +MarkupSafe +========== + +MarkupSafe implements a text object that escapes characters so it is +safe to use in HTML and XML. Characters that have special meanings are +replaced so that they display as the actual characters. This mitigates +injection attacks, meaning untrusted user input can safely be displayed +on a page. + + +Installing +---------- + +Install and update using `pip`_: + +.. code-block:: text + + pip install -U MarkupSafe + +.. _pip: https://pip.pypa.io/en/stable/quickstart/ + + +Examples +-------- + +.. code-block:: pycon + + >>> from markupsafe import Markup, escape + >>> # escape replaces special characters and wraps in Markup + >>> escape('') + Markup(u'<script>alert(document.cookie);</script>') + >>> # wrap in Markup to mark text "safe" and prevent escaping + >>> Markup('Hello') + Markup('hello') + >>> escape(Markup('Hello')) + Markup('hello') + >>> # Markup is a text subclass (str on Python 3, unicode on Python 2) + >>> # methods and operators escape their arguments + >>> template = Markup("Hello %s") + >>> template % '"World"' + Markup('Hello "World"') + + +Donate +------ + +The Pallets organization develops and supports MarkupSafe and other +libraries that use it. In order to grow the community of contributors +and users, and allow the maintainers to devote more time to the +projects, `please donate today`_. + +.. _please donate today: https://palletsprojects.com/donate + + +Links +----- + +* Website: https://palletsprojects.com/p/markupsafe/ +* Documentation: https://markupsafe.palletsprojects.com/ +* License: `BSD-3-Clause `_ +* Releases: https://pypi.org/project/MarkupSafe/ +* Code: https://github.com/pallets/markupsafe +* Issue tracker: https://github.com/pallets/markupsafe/issues +* Test status: + + * Linux, Mac: https://travis-ci.org/pallets/markupsafe + * Windows: https://ci.appveyor.com/project/pallets/markupsafe + +* Test coverage: https://codecov.io/gh/pallets/markupsafe + + diff --git a/env/Lib/site-packages/MarkupSafe-1.1.1.dist-info/RECORD b/env/Lib/site-packages/MarkupSafe-1.1.1.dist-info/RECORD new file mode 100644 index 0000000..02615b4 --- /dev/null +++ b/env/Lib/site-packages/MarkupSafe-1.1.1.dist-info/RECORD @@ -0,0 +1,15 @@ +MarkupSafe-1.1.1.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +MarkupSafe-1.1.1.dist-info/LICENSE.rst,sha256=SJqOEQhQntmKN7uYPhHg9-HTHwvY-Zp5yESOf_N9B-o,1475 +MarkupSafe-1.1.1.dist-info/METADATA,sha256=nJHwJ4_4ka-V39QH883jPrslj6inNdyyNASBXbYgHXQ,3570 +MarkupSafe-1.1.1.dist-info/RECORD,, +MarkupSafe-1.1.1.dist-info/WHEEL,sha256=QOmb-VuQJwuZ7Av_Q2839PCv6qsn6RGHIrt6Y0esFDg,106 +MarkupSafe-1.1.1.dist-info/top_level.txt,sha256=qy0Plje5IJuvsCBjejJyhDCjEAdcDLK_2agVcex8Z6U,11 +markupsafe/__init__.py,sha256=oTblO5f9KFM-pvnq9bB0HgElnqkJyqHnFN1Nx2NIvnY,10126 +markupsafe/__pycache__/__init__.cpython-37.pyc,, +markupsafe/__pycache__/_compat.cpython-37.pyc,, +markupsafe/__pycache__/_constants.cpython-37.pyc,, +markupsafe/__pycache__/_native.cpython-37.pyc,, +markupsafe/_compat.py,sha256=uEW1ybxEjfxIiuTbRRaJpHsPFf4yQUMMKaPgYEC5XbU,558 +markupsafe/_constants.py,sha256=zo2ajfScG-l1Sb_52EP3MlDCqO7Y1BVHUXXKRsVDRNk,4690 +markupsafe/_native.py,sha256=d-8S_zzYt2y512xYcuSxq0NeG2DUUvG80wVdTn-4KI8,1873 +markupsafe/_speedups.cp37-win_amd64.pyd,sha256=T4nav-uguElIirIlGPsvMQq9_zRXuQlYbEH_Ww05Jgs,15360 diff --git a/env/Lib/site-packages/MarkupSafe-1.1.1.dist-info/WHEEL b/env/Lib/site-packages/MarkupSafe-1.1.1.dist-info/WHEEL new file mode 100644 index 0000000..2f3c861 --- /dev/null +++ b/env/Lib/site-packages/MarkupSafe-1.1.1.dist-info/WHEEL @@ -0,0 +1,5 @@ +Wheel-Version: 1.0 +Generator: bdist_wheel (0.33.1) +Root-Is-Purelib: false +Tag: cp37-cp37m-win_amd64 + diff --git a/env/Lib/site-packages/MarkupSafe-1.1.1.dist-info/top_level.txt b/env/Lib/site-packages/MarkupSafe-1.1.1.dist-info/top_level.txt new file mode 100644 index 0000000..75bf729 --- /dev/null +++ b/env/Lib/site-packages/MarkupSafe-1.1.1.dist-info/top_level.txt @@ -0,0 +1 @@ +markupsafe diff --git a/env/Lib/site-packages/Werkzeug-0.16.0.dist-info/INSTALLER b/env/Lib/site-packages/Werkzeug-0.16.0.dist-info/INSTALLER new file mode 100644 index 0000000..a1b589e --- /dev/null +++ b/env/Lib/site-packages/Werkzeug-0.16.0.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/env/Lib/site-packages/Werkzeug-0.16.0.dist-info/LICENSE.rst b/env/Lib/site-packages/Werkzeug-0.16.0.dist-info/LICENSE.rst new file mode 100644 index 0000000..c37cae4 --- /dev/null +++ b/env/Lib/site-packages/Werkzeug-0.16.0.dist-info/LICENSE.rst @@ -0,0 +1,28 @@ +Copyright 2007 Pallets + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + +1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +3. Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A +PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED +TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/env/Lib/site-packages/Werkzeug-0.16.0.dist-info/METADATA b/env/Lib/site-packages/Werkzeug-0.16.0.dist-info/METADATA new file mode 100644 index 0000000..6341603 --- /dev/null +++ b/env/Lib/site-packages/Werkzeug-0.16.0.dist-info/METADATA @@ -0,0 +1,128 @@ +Metadata-Version: 2.1 +Name: Werkzeug +Version: 0.16.0 +Summary: The comprehensive WSGI web application library. +Home-page: https://palletsprojects.com/p/werkzeug/ +Author: Armin Ronacher +Author-email: armin.ronacher@active-4.com +Maintainer: Pallets +Maintainer-email: contact@palletsprojects.com +License: BSD-3-Clause +Project-URL: Documentation, https://werkzeug.palletsprojects.com/ +Project-URL: Code, https://github.com/pallets/werkzeug +Project-URL: Issue tracker, https://github.com/pallets/werkzeug/issues +Platform: UNKNOWN +Classifier: Development Status :: 5 - Production/Stable +Classifier: Environment :: Web Environment +Classifier: Intended Audience :: Developers +Classifier: License :: OSI Approved :: BSD License +Classifier: Operating System :: OS Independent +Classifier: Programming Language :: Python +Classifier: Programming Language :: Python :: 2 +Classifier: Programming Language :: Python :: 2.7 +Classifier: Programming Language :: Python :: 3 +Classifier: Programming Language :: Python :: 3.4 +Classifier: Programming Language :: Python :: 3.5 +Classifier: Programming Language :: Python :: 3.6 +Classifier: Programming Language :: Python :: 3.7 +Classifier: Programming Language :: Python :: Implementation :: CPython +Classifier: Programming Language :: Python :: Implementation :: PyPy +Classifier: Topic :: Internet :: WWW/HTTP :: Dynamic Content +Classifier: Topic :: Internet :: WWW/HTTP :: WSGI +Classifier: Topic :: Internet :: WWW/HTTP :: WSGI :: Application +Classifier: Topic :: Internet :: WWW/HTTP :: WSGI :: Middleware +Classifier: Topic :: Software Development :: Libraries :: Application Frameworks +Classifier: Topic :: Software Development :: Libraries :: Python Modules +Requires-Python: >=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.* +Provides-Extra: dev +Requires-Dist: pytest ; extra == 'dev' +Requires-Dist: coverage ; extra == 'dev' +Requires-Dist: tox ; extra == 'dev' +Requires-Dist: sphinx ; extra == 'dev' +Requires-Dist: pallets-sphinx-themes ; extra == 'dev' +Requires-Dist: sphinx-issues ; extra == 'dev' +Provides-Extra: termcolor +Requires-Dist: termcolor ; extra == 'termcolor' +Provides-Extra: watchdog +Requires-Dist: watchdog ; extra == 'watchdog' + +Werkzeug +======== + +*werkzeug* German noun: "tool". Etymology: *werk* ("work"), *zeug* ("stuff") + +Werkzeug is a comprehensive `WSGI`_ web application library. It began as +a simple collection of various utilities for WSGI applications and has +become one of the most advanced WSGI utility libraries. + +It includes: + +- An interactive debugger that allows inspecting stack traces and + source code in the browser with an interactive interpreter for any + frame in the stack. +- A full-featured request object with objects to interact with + headers, query args, form data, files, and cookies. +- A response object that can wrap other WSGI applications and handle + streaming data. +- A routing system for matching URLs to endpoints and generating URLs + for endpoints, with an extensible system for capturing variables + from URLs. +- HTTP utilities to handle entity tags, cache control, dates, user + agents, cookies, files, and more. +- A threaded WSGI server for use while developing applications + locally. +- A test client for simulating HTTP requests during testing without + requiring running a server. + +Werkzeug is Unicode aware and doesn't enforce any dependencies. It is up +to the developer to choose a template engine, database adapter, and even +how to handle requests. It can be used to build all sorts of end user +applications such as blogs, wikis, or bulletin boards. + +`Flask`_ wraps Werkzeug, using it to handle the details of WSGI while +providing more structure and patterns for defining powerful +applications. + + +Installing +---------- + +Install and update using `pip`_: + +.. code-block:: text + + pip install -U Werkzeug + + +A Simple Example +---------------- + +.. code-block:: python + + from werkzeug.wrappers import Request, Response + + @Request.application + def application(request): + return Response('Hello, World!') + + if __name__ == '__main__': + from werkzeug.serving import run_simple + run_simple('localhost', 4000, application) + + +Links +----- + +- Website: https://palletsprojects.com/p/werkzeug/ +- Documentation: https://werkzeug.palletsprojects.com/ +- Releases: https://pypi.org/project/Werkzeug/ +- Code: https://github.com/pallets/werkzeug +- Issue tracker: https://github.com/pallets/werkzeug/issues +- Test status: https://dev.azure.com/pallets/werkzeug/_build +- Official chat: https://discord.gg/t6rrQZH + +.. _WSGI: https://wsgi.readthedocs.io/en/latest/ +.. _Flask: https://www.palletsprojects.com/p/flask/ +.. _pip: https://pip.pypa.io/en/stable/quickstart/ + + diff --git a/env/Lib/site-packages/Werkzeug-0.16.0.dist-info/RECORD b/env/Lib/site-packages/Werkzeug-0.16.0.dist-info/RECORD new file mode 100644 index 0000000..15350aa --- /dev/null +++ b/env/Lib/site-packages/Werkzeug-0.16.0.dist-info/RECORD @@ -0,0 +1,119 @@ +Werkzeug-0.16.0.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +Werkzeug-0.16.0.dist-info/LICENSE.rst,sha256=O0nc7kEF6ze6wQ-vG-JgQI_oXSUrjp3y4JefweCUQ3s,1475 +Werkzeug-0.16.0.dist-info/METADATA,sha256=BH9_q8z1IK2FbYDS7tSWLsd07z7GDReBgRumclV7T08,4712 +Werkzeug-0.16.0.dist-info/RECORD,, +Werkzeug-0.16.0.dist-info/WHEEL,sha256=8zNYZbwQSXoB9IfXOjPfeNwvAsALAjffgk27FqvCWbo,110 +Werkzeug-0.16.0.dist-info/top_level.txt,sha256=QRyj2VjwJoQkrwjwFIOlB8Xg3r9un0NtqVHQF-15xaw,9 +werkzeug/__init__.py,sha256=tTlHx8lI6FpqB_X9x_zICTy3Rgikur6yIUJr8AE2XTs,7141 +werkzeug/__pycache__/__init__.cpython-37.pyc,, +werkzeug/__pycache__/_compat.cpython-37.pyc,, +werkzeug/__pycache__/_internal.cpython-37.pyc,, +werkzeug/__pycache__/_reloader.cpython-37.pyc,, +werkzeug/__pycache__/datastructures.cpython-37.pyc,, +werkzeug/__pycache__/exceptions.cpython-37.pyc,, +werkzeug/__pycache__/filesystem.cpython-37.pyc,, +werkzeug/__pycache__/formparser.cpython-37.pyc,, +werkzeug/__pycache__/http.cpython-37.pyc,, +werkzeug/__pycache__/local.cpython-37.pyc,, +werkzeug/__pycache__/posixemulation.cpython-37.pyc,, +werkzeug/__pycache__/routing.cpython-37.pyc,, +werkzeug/__pycache__/security.cpython-37.pyc,, +werkzeug/__pycache__/serving.cpython-37.pyc,, +werkzeug/__pycache__/test.cpython-37.pyc,, +werkzeug/__pycache__/testapp.cpython-37.pyc,, +werkzeug/__pycache__/urls.cpython-37.pyc,, +werkzeug/__pycache__/useragents.cpython-37.pyc,, +werkzeug/__pycache__/utils.cpython-37.pyc,, +werkzeug/__pycache__/wsgi.cpython-37.pyc,, +werkzeug/_compat.py,sha256=oBEVVrJT4sqYdIZbUWmgV9T9w257RhTSDBlTjh0Zbb0,6431 +werkzeug/_internal.py,sha256=Wx7cpTRWqeBd0LAqobo0lCO4pNUW4oav6XKf7Taumgk,14590 +werkzeug/_reloader.py,sha256=I3mg3oRQ0lLzl06oEoVopN3bN7CtINuuUQdqDcmTnEs,11531 +werkzeug/contrib/__init__.py,sha256=EvNyiiCF49j5P0fZYJ3ZGe82ofXdSBvUNqWFwwBMibQ,553 +werkzeug/contrib/__pycache__/__init__.cpython-37.pyc,, +werkzeug/contrib/__pycache__/atom.cpython-37.pyc,, +werkzeug/contrib/__pycache__/cache.cpython-37.pyc,, +werkzeug/contrib/__pycache__/fixers.cpython-37.pyc,, +werkzeug/contrib/__pycache__/iterio.cpython-37.pyc,, +werkzeug/contrib/__pycache__/lint.cpython-37.pyc,, +werkzeug/contrib/__pycache__/profiler.cpython-37.pyc,, +werkzeug/contrib/__pycache__/securecookie.cpython-37.pyc,, +werkzeug/contrib/__pycache__/sessions.cpython-37.pyc,, +werkzeug/contrib/__pycache__/wrappers.cpython-37.pyc,, +werkzeug/contrib/atom.py,sha256=KpPJcTfzNW1J0VNQckCbVtVGBe3V8s451tOUya4qByI,15415 +werkzeug/contrib/cache.py,sha256=AEh5UIw-Ui7sHZnlpvrD7ueOKUhCaAD55FXiPtXbbRs,32115 +werkzeug/contrib/fixers.py,sha256=peEtAiIWYT5bh00EWEPOGKzGZXivOzVhhzKPvvzk1RM,9193 +werkzeug/contrib/iterio.py,sha256=KKHa_8aCF_uhoeQVyPGUwrivuB6y6nNdXYo2D2vzOA8,10928 +werkzeug/contrib/lint.py,sha256=NdIxP0E2kVt1xDIxoaIz3Rcl8ZdgmHaFbGTOaybGpN4,296 +werkzeug/contrib/profiler.py,sha256=k_oMLU-AtsVvQ9TxNdermY6FuzSTYr-WE-ZmWb_DMyU,1229 +werkzeug/contrib/securecookie.py,sha256=xbtElskGmtbiApgOJ5WhGgqGDs_68_PcWzqDIAY_QZY,13076 +werkzeug/contrib/sessions.py,sha256=CkJ4IWvNqIaZCP83FMKYFszKL7E6Y1m6YEii7RaTYWs,13040 +werkzeug/contrib/wrappers.py,sha256=ZmNk0wpzD66yomPnQxapndZQs4c0kNJaRzqI-BVxeQk,13199 +werkzeug/datastructures.py,sha256=yVH4r-XD8CjOo18tDGVJYiAfezng6pK9hWzzLFy5a94,91761 +werkzeug/debug/__init__.py,sha256=Bo3HvgTNY4NQ_2jROTSk3r1ScZcT_g_4EnuHTjKyrKM,18275 +werkzeug/debug/__pycache__/__init__.cpython-37.pyc,, +werkzeug/debug/__pycache__/console.cpython-37.pyc,, +werkzeug/debug/__pycache__/repr.cpython-37.pyc,, +werkzeug/debug/__pycache__/tbtools.cpython-37.pyc,, +werkzeug/debug/console.py,sha256=HoBL21bbcmtiCLqiLDJLZi1LYnWMZxjoXYH5WaZB1XY,5469 +werkzeug/debug/repr.py,sha256=lIwuhbyrMwVe3P_cFqNyqzHL7P93TLKod7lw9clydEw,9621 +werkzeug/debug/shared/FONT_LICENSE,sha256=LwAVEI1oYnvXiNMT9SnCH_TaLCxCpeHziDrMg0gPkAI,4673 +werkzeug/debug/shared/console.png,sha256=bxax6RXXlvOij_KeqvSNX0ojJf83YbnZ7my-3Gx9w2A,507 +werkzeug/debug/shared/debugger.js,sha256=rOhqZMRfpZnnu6_XCGn6wMWPhtfwRAcyZKksdIxPJas,6400 +werkzeug/debug/shared/jquery.js,sha256=CSXorXvZcTkaix6Yvo6HppcZGetbYMGWSFlBw8HfCJo,88145 +werkzeug/debug/shared/less.png,sha256=-4-kNRaXJSONVLahrQKUxMwXGm9R4OnZ9SxDGpHlIR4,191 +werkzeug/debug/shared/more.png,sha256=GngN7CioHQoV58rH6ojnkYi8c_qED2Aka5FO5UXrReY,200 +werkzeug/debug/shared/source.png,sha256=RoGcBTE4CyCB85GBuDGTFlAnUqxwTBiIfDqW15EpnUQ,818 +werkzeug/debug/shared/style.css,sha256=gZ9uhmb5zj3XLuT9RvnMp6jMINgQ-VVBCp-2AZbG3YQ,6604 +werkzeug/debug/shared/ubuntu.ttf,sha256=1eaHFyepmy4FyDvjLVzpITrGEBu_CZYY94jE0nED1c0,70220 +werkzeug/debug/tbtools.py,sha256=SkAAA4KKfwsXJinUbf-AEP4GqONTsR4uU7WPUloXcSE,20318 +werkzeug/exceptions.py,sha256=7wl3ufZZU23sASp0ciPe8GJssGND9DX6sDbjxvPuGYU,23437 +werkzeug/filesystem.py,sha256=HzKl-j0Hd8Jl66j778UbPTAYNnY6vUZgYLlBZ0e7uw0,2101 +werkzeug/formparser.py,sha256=Sto0jZid9im9ZVIf56vilCdyX-arK33wSftkYsLCnzo,21788 +werkzeug/http.py,sha256=L6r2ehiorjOtsXITW-01zJsvtVa8Emkpkftu9di_cSk,41628 +werkzeug/local.py,sha256=USVEcgIg-oCiUJFPIecFIW9jkIejfw4Fjf1u5yN-Np4,14456 +werkzeug/middleware/__init__.py,sha256=f1SFZo67IlW4k1uqKzNHxYQlsakUS-D6KK_j0e3jjwQ,549 +werkzeug/middleware/__pycache__/__init__.cpython-37.pyc,, +werkzeug/middleware/__pycache__/dispatcher.cpython-37.pyc,, +werkzeug/middleware/__pycache__/http_proxy.cpython-37.pyc,, +werkzeug/middleware/__pycache__/lint.cpython-37.pyc,, +werkzeug/middleware/__pycache__/profiler.cpython-37.pyc,, +werkzeug/middleware/__pycache__/proxy_fix.cpython-37.pyc,, +werkzeug/middleware/__pycache__/shared_data.cpython-37.pyc,, +werkzeug/middleware/dispatcher.py,sha256=_-KoMzHtcISHS7ouWKAOraqlCLprdh83YOAn_8DjLp8,2240 +werkzeug/middleware/http_proxy.py,sha256=lRjTdMmghHiZuZrS7_UJ3gZc-vlFizhBbFZ-XZPLwIA,7117 +werkzeug/middleware/lint.py,sha256=ItTwuWJnflF8xMT1uqU_Ty1ryhux-CjeUfskqaUpxsw,12967 +werkzeug/middleware/profiler.py,sha256=8B_s23d6BGrU_q54gJsm6kcCbOJbTSqrXCsioHON0Xs,4471 +werkzeug/middleware/proxy_fix.py,sha256=1hi6AJH-J2uh2hMm1g0u7XfjRiTOoUeIOOmwWZ2n9t0,8670 +werkzeug/middleware/shared_data.py,sha256=WtSphPrsUdpEk4E-_09CAILhfOBJ1YtcX1LrxcQfIzw,8224 +werkzeug/posixemulation.py,sha256=gSSiv1SCmOyzOM_nq1ZaZCtxP__C5MeDJl_4yXJmi4Q,3541 +werkzeug/routing.py,sha256=BSgjrYNwj2j5dAHQtK4INEp2TOf4OJP8hBncYSRO2ps,73410 +werkzeug/security.py,sha256=81149MplFq7-hD4RK4sKp9kzXXejjV9D4lWBzaRyeQ8,8106 +werkzeug/serving.py,sha256=qqdsTMILMt_B8ffBtROWK3RRpZeyTkQ9g-jhtpJodrY,36607 +werkzeug/test.py,sha256=Cnb5xa3vLDL0hzFCH1fkG_YRpndViGQgCh4D744iSQk,40645 +werkzeug/testapp.py,sha256=bHekqMsqRfVxwgFbvOMem-DYa_sdB7R47yUXpt1RUTo,9329 +werkzeug/urls.py,sha256=hWZMk4ABiJmQPP_B5rRibWTp9gOyNLQpTqq6cmQAfeE,39322 +werkzeug/useragents.py,sha256=0A_Ip74edPv_hy6CouBTpGumi2uyOci01COuzYFOm3U,5622 +werkzeug/utils.py,sha256=KxCOHhsox7tAVe0m-ZyOGPoCaIbBIy7TxhocaUEHrd4,25050 +werkzeug/wrappers/__init__.py,sha256=S4VioKAmF_av9Ec9zQvG71X1EOkYfPx1TYck9jyDiyY,1384 +werkzeug/wrappers/__pycache__/__init__.cpython-37.pyc,, +werkzeug/wrappers/__pycache__/accept.cpython-37.pyc,, +werkzeug/wrappers/__pycache__/auth.cpython-37.pyc,, +werkzeug/wrappers/__pycache__/base_request.cpython-37.pyc,, +werkzeug/wrappers/__pycache__/base_response.cpython-37.pyc,, +werkzeug/wrappers/__pycache__/common_descriptors.cpython-37.pyc,, +werkzeug/wrappers/__pycache__/etag.cpython-37.pyc,, +werkzeug/wrappers/__pycache__/json.cpython-37.pyc,, +werkzeug/wrappers/__pycache__/request.cpython-37.pyc,, +werkzeug/wrappers/__pycache__/response.cpython-37.pyc,, +werkzeug/wrappers/__pycache__/user_agent.cpython-37.pyc,, +werkzeug/wrappers/accept.py,sha256=TIvjUc0g73fhTWX54wg_D9NNzKvpnG1X8u1w26tK1o8,1760 +werkzeug/wrappers/auth.py,sha256=Pmn6iaGHBrUyHbJpW0lZhO_q9RVoAa5QalaTqcavdAI,1158 +werkzeug/wrappers/base_request.py,sha256=aknREwqVT7WJUxm4weUGdBj90H6rDR3DvsIvmYhaC8A,26943 +werkzeug/wrappers/base_response.py,sha256=ZA1XlxtsbvG4SpbdOEMT5--z7aZM0w6C5y33W8wOXa4,27906 +werkzeug/wrappers/common_descriptors.py,sha256=OJ8jOwMun4L-BxCuFPkK1vaefx_-Y5IndVXvvn_ems4,12089 +werkzeug/wrappers/etag.py,sha256=TwMO1fvluXbBqnFTj2DvrCNa3mYhbHYe1UZAVzfXvuU,12533 +werkzeug/wrappers/json.py,sha256=HvK_A4NpO0sLqgb10sTJcoZydYOwyNiPCJPV7SVgcgE,4343 +werkzeug/wrappers/request.py,sha256=qPo2zmmBv4HxboywtWZb2pJL8OPXo07BUXBKw2j9Fi8,1338 +werkzeug/wrappers/response.py,sha256=vDZFEGzDOG0jjmS0uVVjeT3hqRt1hFaf15npnx7RD28,2329 +werkzeug/wrappers/user_agent.py,sha256=YJb-vr12cujG7sQMG9V89VsJa-03SWSenhg1W4cT0EY,435 +werkzeug/wsgi.py,sha256=iXOR9l1fDd2IgqeTRQZPR6LnBBBx7Xsy97_i2n5HPUo,34666 diff --git a/env/Lib/site-packages/Werkzeug-0.16.0.dist-info/WHEEL b/env/Lib/site-packages/Werkzeug-0.16.0.dist-info/WHEEL new file mode 100644 index 0000000..8b701e9 --- /dev/null +++ b/env/Lib/site-packages/Werkzeug-0.16.0.dist-info/WHEEL @@ -0,0 +1,6 @@ +Wheel-Version: 1.0 +Generator: bdist_wheel (0.33.6) +Root-Is-Purelib: true +Tag: py2-none-any +Tag: py3-none-any + diff --git a/env/Lib/site-packages/Werkzeug-0.16.0.dist-info/top_level.txt b/env/Lib/site-packages/Werkzeug-0.16.0.dist-info/top_level.txt new file mode 100644 index 0000000..6fe8da8 --- /dev/null +++ b/env/Lib/site-packages/Werkzeug-0.16.0.dist-info/top_level.txt @@ -0,0 +1 @@ +werkzeug diff --git a/env/Lib/site-packages/__pycache__/easy_install.cpython-37.pyc b/env/Lib/site-packages/__pycache__/easy_install.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..abefc5a80380fbec11c1352a974df6461a2ef12c GIT binary patch literal 308 zcmZ?b<>g`kg8qH)V(WnPV-N=hn1BoiATCw{5-AK(45^GMjM+>@aw$wH%sEWC%u&pY z45`e`42%pZEWr$#tX0xMrFjY^8L0}ciN%$kdBr7(IXMc+`MJ4?c`3Iz;^T7@GxOr( zUjmI|&}6*D0^<5@ySn4%!vs}%`J#2$Slx> u>ejWisERMoG|!DeSQCS6yk0@&Ee@O9{FKt1R69nX9mODvSeQ5%c^Cn*<5@lc literal 0 HcmV?d00001 diff --git a/env/Lib/site-packages/click/__init__.py b/env/Lib/site-packages/click/__init__.py new file mode 100644 index 0000000..d3c3366 --- /dev/null +++ b/env/Lib/site-packages/click/__init__.py @@ -0,0 +1,97 @@ +# -*- coding: utf-8 -*- +""" +click +~~~~~ + +Click is a simple Python module inspired by the stdlib optparse to make +writing command line scripts fun. Unlike other modules, it's based +around a simple API that does not come with too much magic and is +composable. + +:copyright: © 2014 by the Pallets team. +:license: BSD, see LICENSE.rst for more details. +""" + +# Core classes +from .core import Context, BaseCommand, Command, MultiCommand, Group, \ + CommandCollection, Parameter, Option, Argument + +# Globals +from .globals import get_current_context + +# Decorators +from .decorators import pass_context, pass_obj, make_pass_decorator, \ + command, group, argument, option, confirmation_option, \ + password_option, version_option, help_option + +# Types +from .types import ParamType, File, Path, Choice, IntRange, Tuple, \ + DateTime, STRING, INT, FLOAT, BOOL, UUID, UNPROCESSED, FloatRange + +# Utilities +from .utils import echo, get_binary_stream, get_text_stream, open_file, \ + format_filename, get_app_dir, get_os_args + +# Terminal functions +from .termui import prompt, confirm, get_terminal_size, echo_via_pager, \ + progressbar, clear, style, unstyle, secho, edit, launch, getchar, \ + pause + +# Exceptions +from .exceptions import ClickException, UsageError, BadParameter, \ + FileError, Abort, NoSuchOption, BadOptionUsage, BadArgumentUsage, \ + MissingParameter + +# Formatting +from .formatting import HelpFormatter, wrap_text + +# Parsing +from .parser import OptionParser + + +__all__ = [ + # Core classes + 'Context', 'BaseCommand', 'Command', 'MultiCommand', 'Group', + 'CommandCollection', 'Parameter', 'Option', 'Argument', + + # Globals + 'get_current_context', + + # Decorators + 'pass_context', 'pass_obj', 'make_pass_decorator', 'command', 'group', + 'argument', 'option', 'confirmation_option', 'password_option', + 'version_option', 'help_option', + + # Types + 'ParamType', 'File', 'Path', 'Choice', 'IntRange', 'Tuple', + 'DateTime', 'STRING', 'INT', 'FLOAT', 'BOOL', 'UUID', 'UNPROCESSED', + 'FloatRange', + + # Utilities + 'echo', 'get_binary_stream', 'get_text_stream', 'open_file', + 'format_filename', 'get_app_dir', 'get_os_args', + + # Terminal functions + 'prompt', 'confirm', 'get_terminal_size', 'echo_via_pager', + 'progressbar', 'clear', 'style', 'unstyle', 'secho', 'edit', 'launch', + 'getchar', 'pause', + + # Exceptions + 'ClickException', 'UsageError', 'BadParameter', 'FileError', + 'Abort', 'NoSuchOption', 'BadOptionUsage', 'BadArgumentUsage', + 'MissingParameter', + + # Formatting + 'HelpFormatter', 'wrap_text', + + # Parsing + 'OptionParser', +] + + +# Controls if click should emit the warning about the use of unicode +# literals. +disable_unicode_literals_warning = False + + +__version__ = '7.0' diff --git a/env/Lib/site-packages/click/__pycache__/__init__.cpython-37.pyc b/env/Lib/site-packages/click/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..fbdefaafca7852f36a49d167532d0cb5579581ed GIT binary patch literal 2651 zcmb`IOH&(35`YnUw}b%W_p@zdW7!}B#$e0XMiK(cg9T&YlEFqttFw@L-PzsI)f&tk z=KsvEn27xub={c5T;>PtX)9a8v&Ws?=?HzQtggj`X>t) zPfHKB^iTetnwY=|n7|ZHdMTQONlHVSGLWGxWGM$Z%0r$CP@p0d$p9n8Ytvqd%1}Zf=fQ97yocDyPP^G8vl%ByeT7*Sf zf+ea!jh@5vWKG^%rWIJBRam7L@PgK0jb6e_T8DMofDL*DujnxI{UB!L!aQ^1fi|n{4xNEE z-gh07ExOXs@54aaJx|mOqwWOZdF1v7aozmK&*tj#%G$*y4s6d8+OJsHR5R*21j3i1 zZZ;3M7fmUIxz}m6yNB&sBxCb5V0R;7qKIwRlQrWv9mR=iQRQ2KAB(TCDmC>6TBDuw zY!U)h{xtMr_d?3<>g|PUb}Y97?Sd1#fv<`Oc4U)?MWk~3VKP-{MExNNKdz?KTwlbN zGmIiFTF%H~wWP|SE#-x*3W*f-{;uXY9abWuaDvE=gGl9_u}|54;zhw8>sL9QNp@mR zYd&=&vRSgmlhdr`EQs)8qVj`?jdo?@;nx{BF7Zb%G6ux!Jj!o;V z>b)j{uY<2jyx0yy3*BfW1k%z`lGQ1d3nN`vF-I|p(a4z27ioK*CEXu|s<0Q<53a34 z-`ANe>2Laxkg{h-D(iTH|73iwZRdynXpohO>luM=ta6?`^qqmqYe$>`uMX{@6uQhR zNsqR_I%1S6<5+4F?I_ZTEjMlaqkM`S^wEoKqZdT6DtCiJ-6rF*s_50DVWL9KX!)Yj z#xtK>DRm!z(^;KVQy+AacanHmA*Q7vYhp|3V|BFmOj{9xs{@)oBC`E`ZE4A0kNV5j*VB{aQXkW@T;Gi?s}`QC!sh5Af5%NG zx%@Ke#Y{Q9mfgzCXEw8o*_m`XYorS4$+TuFlP;$!smXL9mD9h9mJ51zGM!21a+&nM E0UyQbbN~PV literal 0 HcmV?d00001 diff --git a/env/Lib/site-packages/click/__pycache__/_bashcomplete.cpython-37.pyc b/env/Lib/site-packages/click/__pycache__/_bashcomplete.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..af3f6792aa7ca919059013b1247e4087a602e147 GIT binary patch literal 9107 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 literal 0 HcmV?d00001 diff --git a/env/Lib/site-packages/click/__pycache__/_termui_impl.cpython-37.pyc b/env/Lib/site-packages/click/__pycache__/_termui_impl.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..53797e0aaf4ded5f76f84fa8fc2ae22bd507e8f9 GIT binary patch literal 13942 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 literal 0 HcmV?d00001 diff --git a/env/Lib/site-packages/click/__pycache__/_textwrap.cpython-37.pyc b/env/Lib/site-packages/click/__pycache__/_textwrap.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..00c4173579083a7f001e14595200027023a9bbfb GIT binary patch literal 1325 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 YAO9`2?P>#q3ng50y}fC<=iLkc1+1&sP5=M^ literal 0 HcmV?d00001 diff --git a/env/Lib/site-packages/click/__pycache__/_winconsole.cpython-37.pyc b/env/Lib/site-packages/click/__pycache__/_winconsole.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..29fb60f9f23e22ab54cbf6f4c586b383dbd29923 GIT binary patch literal 8722 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 literal 0 HcmV?d00001 diff --git a/env/Lib/site-packages/click/__pycache__/decorators.cpython-37.pyc b/env/Lib/site-packages/click/__pycache__/decorators.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7176e09f0b6255a004d21a4a147ed6eb3d5cfc6c GIT binary patch literal 11579 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 literal 0 HcmV?d00001 diff --git a/env/Lib/site-packages/click/__pycache__/exceptions.cpython-37.pyc b/env/Lib/site-packages/click/__pycache__/exceptions.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1dc86fdaab2b18fa09f6be7cd3113fb2c6ef8ec3 GIT binary patch literal 8605 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 literal 0 HcmV?d00001 diff --git a/env/Lib/site-packages/click/__pycache__/formatting.cpython-37.pyc b/env/Lib/site-packages/click/__pycache__/formatting.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..92d310c4aba5428db4dc95d84f25b6195f8f90f8 GIT binary patch literal 8541 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 literal 0 HcmV?d00001 diff --git a/env/Lib/site-packages/click/__pycache__/globals.cpython-37.pyc b/env/Lib/site-packages/click/__pycache__/globals.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a169eff01558074609287349a30dbe2a87ede6c1 GIT binary patch literal 1872 zcmZuy-HsbI6t-tF*=#nuh(as4Kr$7m1hr9x1VRx)vGqa)=w2cog7=tPuF3@uzzrOGX4+j;OY!*koX_7m-^t_M-7bPQ`Qz`O|B4X$ z(@mNd!r&|TnIUuxF)UGvk1<9ZU!voH^;pPS&+u``BG!I}j$3Stb>JJZUDjngu+wJS zN2tH|0`8+eE+eU8DxbvI&7ryPHvIPCXFiASe9t0_8NLiy@Gd$+Eo1{5E`n88e}dsS zMjK=Xw#C9r{1pF$vfxL=THqq0PXmMwxh-^Nh)p<&3$1x(Ni0RYBC*OWKeGcu#)&W_ zrWu)YQW(w%HH4B=dQPnB5@NZjH6CPW#&?+S~J3mdh=8Z|PN=d3TCnC+k zr?8bZX}Qj*6>AO-JhI`U$l~EFr^ZZcTr2iD^x~=@rH6OQmTbKcc>SI zBnzcU!e!32A*P5E_mJ8&j}tW`r-^{oR4fwqHwWw0d{BvVbeJy;jh zYt6-JO@*X$S;dY6_X}D`M^a4zoB?N=3d0F~osl6wg9siLnH4GjMr);K1AnfJjHU7F z#lO%l-XFUJao_+Fg=j(!+)T$&KPtDD+)`_G*`9iNlzWe0Cgz2$ESKGbjPWz?rR-hz z35sf09Q}s$4#?-9Z}*3j9}KWM86Q2KJj(O0sil+eoa!cHp5~KW4Z6Y@u>d3+UVQvLBoTMI$@pm#vqmM2em$Q99fGM*zopyoEj!aG6S196 z%Pu5F9lo+n^PFc4SP5f$<_W2~p1ad?8QVPLJyAAkzu!G@n$M`L zi-qGC0_(9hiC>9GE&O7vBvgTgq)RA82a8$&FLmb1mMb6jo~bnmGpJRrmT-2TC?G+f zI_3ByQmK_Ykb8!_MjT5`bep>DH%8+=)-JjFflsP3@>pPY8y5AOuJhczBJeg;GbPs? zNCec=`a$>LWR;~+2QsvaJ6PXwcJY%w9`(1%ZJTIL8Pq=Q$gM)<^4MpCcJ%uT*WA7G Z+4&+>tdRUm_xI)9^ul)7z0-+0(SJTB2h0Ef literal 0 HcmV?d00001 diff --git a/env/Lib/site-packages/click/__pycache__/parser.cpython-37.pyc b/env/Lib/site-packages/click/__pycache__/parser.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..808cf23db8f6d1cda2eda43f49bebf3b87ba18cf GIT binary patch literal 11449 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 C#O=la literal 0 HcmV?d00001 diff --git a/env/Lib/site-packages/click/__pycache__/termui.cpython-37.pyc b/env/Lib/site-packages/click/__pycache__/termui.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d4d7c810daaa930f53d57b24350a38d2a9f5aabf GIT binary patch literal 20766 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 U_3~MhiG!ur%;jgTwdD){17p&C(*OVf literal 0 HcmV?d00001 diff --git a/env/Lib/site-packages/click/__pycache__/types.cpython-37.pyc b/env/Lib/site-packages/click/__pycache__/types.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1dde35ac0c577a0e64deadf0af11eb119a1c0f1c GIT binary patch literal 21792 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 literal 0 HcmV?d00001 diff --git a/env/Lib/site-packages/click/_bashcomplete.py b/env/Lib/site-packages/click/_bashcomplete.py new file mode 100644 index 0000000..a5f1084 --- /dev/null +++ b/env/Lib/site-packages/click/_bashcomplete.py @@ -0,0 +1,293 @@ +import copy +import os +import re + +from .utils import echo +from .parser import split_arg_string +from .core import MultiCommand, Option, Argument +from .types import Choice + +try: + from collections import abc +except ImportError: + import collections as abc + +WORDBREAK = '=' + +# Note, only BASH version 4.4 and later have the nosort option. +COMPLETION_SCRIPT_BASH = ''' +%(complete_func)s() { + local IFS=$'\n' + COMPREPLY=( $( env COMP_WORDS="${COMP_WORDS[*]}" \\ + COMP_CWORD=$COMP_CWORD \\ + %(autocomplete_var)s=complete $1 ) ) + return 0 +} + +%(complete_func)setup() { + local COMPLETION_OPTIONS="" + local BASH_VERSION_ARR=(${BASH_VERSION//./ }) + # Only BASH version 4.4 and later have the nosort option. + if [ ${BASH_VERSION_ARR[0]} -gt 4 ] || ([ ${BASH_VERSION_ARR[0]} -eq 4 ] && [ ${BASH_VERSION_ARR[1]} -ge 4 ]); then + COMPLETION_OPTIONS="-o nosort" + fi + + complete $COMPLETION_OPTIONS -F %(complete_func)s %(script_names)s +} + +%(complete_func)setup +''' + +COMPLETION_SCRIPT_ZSH = ''' +%(complete_func)s() { + local -a completions + local -a completions_with_descriptions + local -a response + response=("${(@f)$( env COMP_WORDS=\"${words[*]}\" \\ + COMP_CWORD=$((CURRENT-1)) \\ + %(autocomplete_var)s=\"complete_zsh\" \\ + %(script_names)s )}") + + for key descr in ${(kv)response}; do + if [[ "$descr" == "_" ]]; then + completions+=("$key") + else + completions_with_descriptions+=("$key":"$descr") + fi + done + + if [ -n "$completions_with_descriptions" ]; then + _describe -V unsorted completions_with_descriptions -U -Q + fi + + if [ -n "$completions" ]; then + compadd -U -V unsorted -Q -a completions + fi + compstate[insert]="automenu" +} + +compdef %(complete_func)s %(script_names)s +''' + +_invalid_ident_char_re = re.compile(r'[^a-zA-Z0-9_]') + + +def get_completion_script(prog_name, complete_var, shell): + cf_name = _invalid_ident_char_re.sub('', prog_name.replace('-', '_')) + script = COMPLETION_SCRIPT_ZSH if shell == 'zsh' else COMPLETION_SCRIPT_BASH + return (script % { + 'complete_func': '_%s_completion' % cf_name, + 'script_names': prog_name, + 'autocomplete_var': complete_var, + }).strip() + ';' + + +def resolve_ctx(cli, prog_name, args): + """ + Parse into a hierarchy of contexts. Contexts are connected through the parent variable. + :param cli: command definition + :param prog_name: the program that is running + :param args: full list of args + :return: the final context/command parsed + """ + ctx = cli.make_context(prog_name, args, resilient_parsing=True) + args = ctx.protected_args + ctx.args + while args: + if isinstance(ctx.command, MultiCommand): + if not ctx.command.chain: + cmd_name, cmd, args = ctx.command.resolve_command(ctx, args) + if cmd is None: + return ctx + ctx = cmd.make_context(cmd_name, args, parent=ctx, + resilient_parsing=True) + args = ctx.protected_args + ctx.args + else: + # Walk chained subcommand contexts saving the last one. + while args: + cmd_name, cmd, args = ctx.command.resolve_command(ctx, args) + if cmd is None: + return ctx + sub_ctx = cmd.make_context(cmd_name, args, parent=ctx, + allow_extra_args=True, + allow_interspersed_args=False, + resilient_parsing=True) + args = sub_ctx.args + ctx = sub_ctx + args = sub_ctx.protected_args + sub_ctx.args + else: + break + return ctx + + +def start_of_option(param_str): + """ + :param param_str: param_str to check + :return: whether or not this is the start of an option declaration (i.e. starts "-" or "--") + """ + return param_str and param_str[:1] == '-' + + +def is_incomplete_option(all_args, cmd_param): + """ + :param all_args: the full original list of args supplied + :param cmd_param: the current command paramter + :return: whether or not the last option declaration (i.e. starts "-" or "--") is incomplete and + corresponds to this cmd_param. In other words whether this cmd_param option can still accept + values + """ + if not isinstance(cmd_param, Option): + return False + if cmd_param.is_flag: + return False + last_option = None + for index, arg_str in enumerate(reversed([arg for arg in all_args if arg != WORDBREAK])): + if index + 1 > cmd_param.nargs: + break + if start_of_option(arg_str): + last_option = arg_str + + return True if last_option and last_option in cmd_param.opts else False + + +def is_incomplete_argument(current_params, cmd_param): + """ + :param current_params: the current params and values for this argument as already entered + :param cmd_param: the current command parameter + :return: whether or not the last argument is incomplete and corresponds to this cmd_param. In + other words whether or not the this cmd_param argument can still accept values + """ + if not isinstance(cmd_param, Argument): + return False + current_param_values = current_params[cmd_param.name] + if current_param_values is None: + return True + if cmd_param.nargs == -1: + return True + if isinstance(current_param_values, abc.Iterable) \ + and cmd_param.nargs > 1 and len(current_param_values) < cmd_param.nargs: + return True + return False + + +def get_user_autocompletions(ctx, args, incomplete, cmd_param): + """ + :param ctx: context associated with the parsed command + :param args: full list of args + :param incomplete: the incomplete text to autocomplete + :param cmd_param: command definition + :return: all the possible user-specified completions for the param + """ + results = [] + if isinstance(cmd_param.type, Choice): + # Choices don't support descriptions. + results = [(c, None) + for c in cmd_param.type.choices if str(c).startswith(incomplete)] + elif cmd_param.autocompletion is not None: + dynamic_completions = cmd_param.autocompletion(ctx=ctx, + args=args, + incomplete=incomplete) + results = [c if isinstance(c, tuple) else (c, None) + for c in dynamic_completions] + return results + + +def get_visible_commands_starting_with(ctx, starts_with): + """ + :param ctx: context associated with the parsed command + :starts_with: string that visible commands must start with. + :return: all visible (not hidden) commands that start with starts_with. + """ + for c in ctx.command.list_commands(ctx): + if c.startswith(starts_with): + command = ctx.command.get_command(ctx, c) + if not command.hidden: + yield command + + +def add_subcommand_completions(ctx, incomplete, completions_out): + # Add subcommand completions. + if isinstance(ctx.command, MultiCommand): + completions_out.extend( + [(c.name, c.get_short_help_str()) for c in get_visible_commands_starting_with(ctx, incomplete)]) + + # Walk up the context list and add any other completion possibilities from chained commands + while ctx.parent is not None: + ctx = ctx.parent + if isinstance(ctx.command, MultiCommand) and ctx.command.chain: + remaining_commands = [c for c in get_visible_commands_starting_with(ctx, incomplete) + if c.name not in ctx.protected_args] + completions_out.extend([(c.name, c.get_short_help_str()) for c in remaining_commands]) + + +def get_choices(cli, prog_name, args, incomplete): + """ + :param cli: command definition + :param prog_name: the program that is running + :param args: full list of args + :param incomplete: the incomplete text to autocomplete + :return: all the possible completions for the incomplete + """ + all_args = copy.deepcopy(args) + + ctx = resolve_ctx(cli, prog_name, args) + if ctx is None: + return [] + + # In newer versions of bash long opts with '='s are partitioned, but it's easier to parse + # without the '=' + if start_of_option(incomplete) and WORDBREAK in incomplete: + partition_incomplete = incomplete.partition(WORDBREAK) + all_args.append(partition_incomplete[0]) + incomplete = partition_incomplete[2] + elif incomplete == WORDBREAK: + incomplete = '' + + completions = [] + if start_of_option(incomplete): + # completions for partial options + for param in ctx.command.params: + if isinstance(param, Option) and not param.hidden: + param_opts = [param_opt for param_opt in param.opts + + param.secondary_opts if param_opt not in all_args or param.multiple] + completions.extend([(o, param.help) for o in param_opts if o.startswith(incomplete)]) + return completions + # completion for option values from user supplied values + for param in ctx.command.params: + if is_incomplete_option(all_args, param): + return get_user_autocompletions(ctx, all_args, incomplete, param) + # completion for argument values from user supplied values + for param in ctx.command.params: + if is_incomplete_argument(ctx.params, param): + return get_user_autocompletions(ctx, all_args, incomplete, param) + + add_subcommand_completions(ctx, incomplete, completions) + # Sort before returning so that proper ordering can be enforced in custom types. + return sorted(completions) + + +def do_complete(cli, prog_name, include_descriptions): + cwords = split_arg_string(os.environ['COMP_WORDS']) + cword = int(os.environ['COMP_CWORD']) + args = cwords[1:cword] + try: + incomplete = cwords[cword] + except IndexError: + incomplete = '' + + for item in get_choices(cli, prog_name, args, incomplete): + echo(item[0]) + if include_descriptions: + # ZSH has trouble dealing with empty array parameters when returned from commands, so use a well defined character '_' to indicate no description is present. + echo(item[1] if item[1] else '_') + + return True + + +def bashcomplete(cli, prog_name, complete_var, complete_instr): + if complete_instr.startswith('source'): + shell = 'zsh' if complete_instr == 'source_zsh' else 'bash' + echo(get_completion_script(prog_name, complete_var, shell)) + return True + elif complete_instr == 'complete' or complete_instr == 'complete_zsh': + return do_complete(cli, prog_name, complete_instr == 'complete_zsh') + return False diff --git a/env/Lib/site-packages/click/_compat.py b/env/Lib/site-packages/click/_compat.py new file mode 100644 index 0000000..937e230 --- /dev/null +++ b/env/Lib/site-packages/click/_compat.py @@ -0,0 +1,703 @@ +import re +import io +import os +import sys +import codecs +from weakref import WeakKeyDictionary + + +PY2 = sys.version_info[0] == 2 +CYGWIN = sys.platform.startswith('cygwin') +# Determine local App Engine environment, per Google's own suggestion +APP_ENGINE = ('APPENGINE_RUNTIME' in os.environ and + 'Development/' in os.environ['SERVER_SOFTWARE']) +WIN = sys.platform.startswith('win') and not APP_ENGINE +DEFAULT_COLUMNS = 80 + + +_ansi_re = re.compile(r'\033\[((?:\d|;)*)([a-zA-Z])') + + +def get_filesystem_encoding(): + return sys.getfilesystemencoding() or sys.getdefaultencoding() + + +def _make_text_stream(stream, encoding, errors, + force_readable=False, force_writable=False): + if encoding is None: + encoding = get_best_encoding(stream) + if errors is None: + errors = 'replace' + return _NonClosingTextIOWrapper(stream, encoding, errors, + line_buffering=True, + force_readable=force_readable, + force_writable=force_writable) + + +def is_ascii_encoding(encoding): + """Checks if a given encoding is ascii.""" + try: + return codecs.lookup(encoding).name == 'ascii' + except LookupError: + return False + + +def get_best_encoding(stream): + """Returns the default stream encoding if not found.""" + rv = getattr(stream, 'encoding', None) or sys.getdefaultencoding() + if is_ascii_encoding(rv): + return 'utf-8' + return rv + + +class _NonClosingTextIOWrapper(io.TextIOWrapper): + + def __init__(self, stream, encoding, errors, + force_readable=False, force_writable=False, **extra): + self._stream = stream = _FixupStream(stream, force_readable, + force_writable) + io.TextIOWrapper.__init__(self, stream, encoding, errors, **extra) + + # The io module is a place where the Python 3 text behavior + # was forced upon Python 2, so we need to unbreak + # it to look like Python 2. + if PY2: + def write(self, x): + if isinstance(x, str) or is_bytes(x): + try: + self.flush() + except Exception: + pass + return self.buffer.write(str(x)) + return io.TextIOWrapper.write(self, x) + + def writelines(self, lines): + for line in lines: + self.write(line) + + def __del__(self): + try: + self.detach() + except Exception: + pass + + def isatty(self): + # https://bitbucket.org/pypy/pypy/issue/1803 + return self._stream.isatty() + + +class _FixupStream(object): + """The new io interface needs more from streams than streams + traditionally implement. As such, this fix-up code is necessary in + some circumstances. + + The forcing of readable and writable flags are there because some tools + put badly patched objects on sys (one such offender are certain version + of jupyter notebook). + """ + + def __init__(self, stream, force_readable=False, force_writable=False): + self._stream = stream + self._force_readable = force_readable + self._force_writable = force_writable + + def __getattr__(self, name): + return getattr(self._stream, name) + + def read1(self, size): + f = getattr(self._stream, 'read1', None) + if f is not None: + return f(size) + # We only dispatch to readline instead of read in Python 2 as we + # do not want cause problems with the different implementation + # of line buffering. + if PY2: + return self._stream.readline(size) + return self._stream.read(size) + + def readable(self): + if self._force_readable: + return True + x = getattr(self._stream, 'readable', None) + if x is not None: + return x() + try: + self._stream.read(0) + except Exception: + return False + return True + + def writable(self): + if self._force_writable: + return True + x = getattr(self._stream, 'writable', None) + if x is not None: + return x() + try: + self._stream.write('') + except Exception: + try: + self._stream.write(b'') + except Exception: + return False + return True + + def seekable(self): + x = getattr(self._stream, 'seekable', None) + if x is not None: + return x() + try: + self._stream.seek(self._stream.tell()) + except Exception: + return False + return True + + +if PY2: + text_type = unicode + bytes = str + raw_input = raw_input + string_types = (str, unicode) + int_types = (int, long) + iteritems = lambda x: x.iteritems() + range_type = xrange + + def is_bytes(x): + return isinstance(x, (buffer, bytearray)) + + _identifier_re = re.compile(r'^[a-zA-Z_][a-zA-Z0-9_]*$') + + # For Windows, we need to force stdout/stdin/stderr to binary if it's + # fetched for that. This obviously is not the most correct way to do + # it as it changes global state. Unfortunately, there does not seem to + # be a clear better way to do it as just reopening the file in binary + # mode does not change anything. + # + # An option would be to do what Python 3 does and to open the file as + # binary only, patch it back to the system, and then use a wrapper + # stream that converts newlines. It's not quite clear what's the + # correct option here. + # + # This code also lives in _winconsole for the fallback to the console + # emulation stream. + # + # There are also Windows environments where the `msvcrt` module is not + # available (which is why we use try-catch instead of the WIN variable + # here), such as the Google App Engine development server on Windows. In + # those cases there is just nothing we can do. + def set_binary_mode(f): + return f + + try: + import msvcrt + except ImportError: + pass + else: + def set_binary_mode(f): + try: + fileno = f.fileno() + except Exception: + pass + else: + msvcrt.setmode(fileno, os.O_BINARY) + return f + + try: + import fcntl + except ImportError: + pass + else: + def set_binary_mode(f): + try: + fileno = f.fileno() + except Exception: + pass + else: + flags = fcntl.fcntl(fileno, fcntl.F_GETFL) + fcntl.fcntl(fileno, fcntl.F_SETFL, flags & ~os.O_NONBLOCK) + return f + + def isidentifier(x): + return _identifier_re.search(x) is not None + + def get_binary_stdin(): + return set_binary_mode(sys.stdin) + + def get_binary_stdout(): + _wrap_std_stream('stdout') + return set_binary_mode(sys.stdout) + + def get_binary_stderr(): + _wrap_std_stream('stderr') + return set_binary_mode(sys.stderr) + + def get_text_stdin(encoding=None, errors=None): + rv = _get_windows_console_stream(sys.stdin, encoding, errors) + if rv is not None: + return rv + return _make_text_stream(sys.stdin, encoding, errors, + force_readable=True) + + def get_text_stdout(encoding=None, errors=None): + _wrap_std_stream('stdout') + rv = _get_windows_console_stream(sys.stdout, encoding, errors) + if rv is not None: + return rv + return _make_text_stream(sys.stdout, encoding, errors, + force_writable=True) + + def get_text_stderr(encoding=None, errors=None): + _wrap_std_stream('stderr') + rv = _get_windows_console_stream(sys.stderr, encoding, errors) + if rv is not None: + return rv + return _make_text_stream(sys.stderr, encoding, errors, + force_writable=True) + + def filename_to_ui(value): + if isinstance(value, bytes): + value = value.decode(get_filesystem_encoding(), 'replace') + return value +else: + import io + text_type = str + raw_input = input + string_types = (str,) + int_types = (int,) + range_type = range + isidentifier = lambda x: x.isidentifier() + iteritems = lambda x: iter(x.items()) + + def is_bytes(x): + return isinstance(x, (bytes, memoryview, bytearray)) + + def _is_binary_reader(stream, default=False): + try: + return isinstance(stream.read(0), bytes) + except Exception: + return default + # This happens in some cases where the stream was already + # closed. In this case, we assume the default. + + def _is_binary_writer(stream, default=False): + try: + stream.write(b'') + except Exception: + try: + stream.write('') + return False + except Exception: + pass + return default + return True + + def _find_binary_reader(stream): + # We need to figure out if the given stream is already binary. + # This can happen because the official docs recommend detaching + # the streams to get binary streams. Some code might do this, so + # we need to deal with this case explicitly. + if _is_binary_reader(stream, False): + return stream + + buf = getattr(stream, 'buffer', None) + + # Same situation here; this time we assume that the buffer is + # actually binary in case it's closed. + if buf is not None and _is_binary_reader(buf, True): + return buf + + def _find_binary_writer(stream): + # We need to figure out if the given stream is already binary. + # This can happen because the official docs recommend detatching + # the streams to get binary streams. Some code might do this, so + # we need to deal with this case explicitly. + if _is_binary_writer(stream, False): + return stream + + buf = getattr(stream, 'buffer', None) + + # Same situation here; this time we assume that the buffer is + # actually binary in case it's closed. + if buf is not None and _is_binary_writer(buf, True): + return buf + + def _stream_is_misconfigured(stream): + """A stream is misconfigured if its encoding is ASCII.""" + # If the stream does not have an encoding set, we assume it's set + # to ASCII. This appears to happen in certain unittest + # environments. It's not quite clear what the correct behavior is + # but this at least will force Click to recover somehow. + return is_ascii_encoding(getattr(stream, 'encoding', None) or 'ascii') + + def _is_compatible_text_stream(stream, encoding, errors): + stream_encoding = getattr(stream, 'encoding', None) + stream_errors = getattr(stream, 'errors', None) + + # Perfect match. + if stream_encoding == encoding and stream_errors == errors: + return True + + # Otherwise, it's only a compatible stream if we did not ask for + # an encoding. + if encoding is None: + return stream_encoding is not None + + return False + + def _force_correct_text_reader(text_reader, encoding, errors, + force_readable=False): + if _is_binary_reader(text_reader, False): + binary_reader = text_reader + else: + # If there is no target encoding set, we need to verify that the + # reader is not actually misconfigured. + if encoding is None and not _stream_is_misconfigured(text_reader): + return text_reader + + if _is_compatible_text_stream(text_reader, encoding, errors): + return text_reader + + # If the reader has no encoding, we try to find the underlying + # binary reader for it. If that fails because the environment is + # misconfigured, we silently go with the same reader because this + # is too common to happen. In that case, mojibake is better than + # exceptions. + binary_reader = _find_binary_reader(text_reader) + if binary_reader is None: + return text_reader + + # At this point, we default the errors to replace instead of strict + # because nobody handles those errors anyways and at this point + # we're so fundamentally fucked that nothing can repair it. + if errors is None: + errors = 'replace' + return _make_text_stream(binary_reader, encoding, errors, + force_readable=force_readable) + + def _force_correct_text_writer(text_writer, encoding, errors, + force_writable=False): + if _is_binary_writer(text_writer, False): + binary_writer = text_writer + else: + # If there is no target encoding set, we need to verify that the + # writer is not actually misconfigured. + if encoding is None and not _stream_is_misconfigured(text_writer): + return text_writer + + if _is_compatible_text_stream(text_writer, encoding, errors): + return text_writer + + # If the writer has no encoding, we try to find the underlying + # binary writer for it. If that fails because the environment is + # misconfigured, we silently go with the same writer because this + # is too common to happen. In that case, mojibake is better than + # exceptions. + binary_writer = _find_binary_writer(text_writer) + if binary_writer is None: + return text_writer + + # At this point, we default the errors to replace instead of strict + # because nobody handles those errors anyways and at this point + # we're so fundamentally fucked that nothing can repair it. + if errors is None: + errors = 'replace' + return _make_text_stream(binary_writer, encoding, errors, + force_writable=force_writable) + + def get_binary_stdin(): + reader = _find_binary_reader(sys.stdin) + if reader is None: + raise RuntimeError('Was not able to determine binary ' + 'stream for sys.stdin.') + return reader + + def get_binary_stdout(): + writer = _find_binary_writer(sys.stdout) + if writer is None: + raise RuntimeError('Was not able to determine binary ' + 'stream for sys.stdout.') + return writer + + def get_binary_stderr(): + writer = _find_binary_writer(sys.stderr) + if writer is None: + raise RuntimeError('Was not able to determine binary ' + 'stream for sys.stderr.') + return writer + + def get_text_stdin(encoding=None, errors=None): + rv = _get_windows_console_stream(sys.stdin, encoding, errors) + if rv is not None: + return rv + return _force_correct_text_reader(sys.stdin, encoding, errors, + force_readable=True) + + def get_text_stdout(encoding=None, errors=None): + rv = _get_windows_console_stream(sys.stdout, encoding, errors) + if rv is not None: + return rv + return _force_correct_text_writer(sys.stdout, encoding, errors, + force_writable=True) + + def get_text_stderr(encoding=None, errors=None): + rv = _get_windows_console_stream(sys.stderr, encoding, errors) + if rv is not None: + return rv + return _force_correct_text_writer(sys.stderr, encoding, errors, + force_writable=True) + + def filename_to_ui(value): + if isinstance(value, bytes): + value = value.decode(get_filesystem_encoding(), 'replace') + else: + value = value.encode('utf-8', 'surrogateescape') \ + .decode('utf-8', 'replace') + return value + + +def get_streerror(e, default=None): + if hasattr(e, 'strerror'): + msg = e.strerror + else: + if default is not None: + msg = default + else: + msg = str(e) + if isinstance(msg, bytes): + msg = msg.decode('utf-8', 'replace') + return msg + + +def open_stream(filename, mode='r', encoding=None, errors='strict', + atomic=False): + # Standard streams first. These are simple because they don't need + # special handling for the atomic flag. It's entirely ignored. + if filename == '-': + if any(m in mode for m in ['w', 'a', 'x']): + if 'b' in mode: + return get_binary_stdout(), False + return get_text_stdout(encoding=encoding, errors=errors), False + if 'b' in mode: + return get_binary_stdin(), False + return get_text_stdin(encoding=encoding, errors=errors), False + + # Non-atomic writes directly go out through the regular open functions. + if not atomic: + if encoding is None: + return open(filename, mode), True + return io.open(filename, mode, encoding=encoding, errors=errors), True + + # Some usability stuff for atomic writes + if 'a' in mode: + raise ValueError( + 'Appending to an existing file is not supported, because that ' + 'would involve an expensive `copy`-operation to a temporary ' + 'file. Open the file in normal `w`-mode and copy explicitly ' + 'if that\'s what you\'re after.' + ) + if 'x' in mode: + raise ValueError('Use the `overwrite`-parameter instead.') + if 'w' not in mode: + raise ValueError('Atomic writes only make sense with `w`-mode.') + + # Atomic writes are more complicated. They work by opening a file + # as a proxy in the same folder and then using the fdopen + # functionality to wrap it in a Python file. Then we wrap it in an + # atomic file that moves the file over on close. + import tempfile + fd, tmp_filename = tempfile.mkstemp(dir=os.path.dirname(filename), + prefix='.__atomic-write') + + if encoding is not None: + f = io.open(fd, mode, encoding=encoding, errors=errors) + else: + f = os.fdopen(fd, mode) + + return _AtomicFile(f, tmp_filename, os.path.realpath(filename)), True + + +# Used in a destructor call, needs extra protection from interpreter cleanup. +if hasattr(os, 'replace'): + _replace = os.replace + _can_replace = True +else: + _replace = os.rename + _can_replace = not WIN + + +class _AtomicFile(object): + + def __init__(self, f, tmp_filename, real_filename): + self._f = f + self._tmp_filename = tmp_filename + self._real_filename = real_filename + self.closed = False + + @property + def name(self): + return self._real_filename + + def close(self, delete=False): + if self.closed: + return + self._f.close() + if not _can_replace: + try: + os.remove(self._real_filename) + except OSError: + pass + _replace(self._tmp_filename, self._real_filename) + self.closed = True + + def __getattr__(self, name): + return getattr(self._f, name) + + def __enter__(self): + return self + + def __exit__(self, exc_type, exc_value, tb): + self.close(delete=exc_type is not None) + + def __repr__(self): + return repr(self._f) + + +auto_wrap_for_ansi = None +colorama = None +get_winterm_size = None + + +def strip_ansi(value): + return _ansi_re.sub('', value) + + +def should_strip_ansi(stream=None, color=None): + if color is None: + if stream is None: + stream = sys.stdin + return not isatty(stream) + return not color + + +# If we're on Windows, we provide transparent integration through +# colorama. This will make ANSI colors through the echo function +# work automatically. +if WIN: + # Windows has a smaller terminal + DEFAULT_COLUMNS = 79 + + from ._winconsole import _get_windows_console_stream, _wrap_std_stream + + def _get_argv_encoding(): + import locale + return locale.getpreferredencoding() + + if PY2: + def raw_input(prompt=''): + sys.stderr.flush() + if prompt: + stdout = _default_text_stdout() + stdout.write(prompt) + stdin = _default_text_stdin() + return stdin.readline().rstrip('\r\n') + + try: + import colorama + except ImportError: + pass + else: + _ansi_stream_wrappers = WeakKeyDictionary() + + def auto_wrap_for_ansi(stream, color=None): + """This function wraps a stream so that calls through colorama + are issued to the win32 console API to recolor on demand. It + also ensures to reset the colors if a write call is interrupted + to not destroy the console afterwards. + """ + try: + cached = _ansi_stream_wrappers.get(stream) + except Exception: + cached = None + if cached is not None: + return cached + strip = should_strip_ansi(stream, color) + ansi_wrapper = colorama.AnsiToWin32(stream, strip=strip) + rv = ansi_wrapper.stream + _write = rv.write + + def _safe_write(s): + try: + return _write(s) + except: + ansi_wrapper.reset_all() + raise + + rv.write = _safe_write + try: + _ansi_stream_wrappers[stream] = rv + except Exception: + pass + return rv + + def get_winterm_size(): + win = colorama.win32.GetConsoleScreenBufferInfo( + colorama.win32.STDOUT).srWindow + return win.Right - win.Left, win.Bottom - win.Top +else: + def _get_argv_encoding(): + return getattr(sys.stdin, 'encoding', None) or get_filesystem_encoding() + + _get_windows_console_stream = lambda *x: None + _wrap_std_stream = lambda *x: None + + +def term_len(x): + return len(strip_ansi(x)) + + +def isatty(stream): + try: + return stream.isatty() + except Exception: + return False + + +def _make_cached_stream_func(src_func, wrapper_func): + cache = WeakKeyDictionary() + def func(): + stream = src_func() + try: + rv = cache.get(stream) + except Exception: + rv = None + if rv is not None: + return rv + rv = wrapper_func() + try: + stream = src_func() # In case wrapper_func() modified the stream + cache[stream] = rv + except Exception: + pass + return rv + return func + + +_default_text_stdin = _make_cached_stream_func( + lambda: sys.stdin, get_text_stdin) +_default_text_stdout = _make_cached_stream_func( + lambda: sys.stdout, get_text_stdout) +_default_text_stderr = _make_cached_stream_func( + lambda: sys.stderr, get_text_stderr) + + +binary_streams = { + 'stdin': get_binary_stdin, + 'stdout': get_binary_stdout, + 'stderr': get_binary_stderr, +} + +text_streams = { + 'stdin': get_text_stdin, + 'stdout': get_text_stdout, + 'stderr': get_text_stderr, +} diff --git a/env/Lib/site-packages/click/_termui_impl.py b/env/Lib/site-packages/click/_termui_impl.py new file mode 100644 index 0000000..00a8e5e --- /dev/null +++ b/env/Lib/site-packages/click/_termui_impl.py @@ -0,0 +1,621 @@ +# -*- coding: utf-8 -*- +""" +click._termui_impl +~~~~~~~~~~~~~~~~~~ + +This module contains implementations for the termui module. To keep the +import time of Click down, some infrequently used functionality is +placed in this module and only imported as needed. + +:copyright: © 2014 by the Pallets team. +:license: BSD, see LICENSE.rst for more details. +""" + +import os +import sys +import time +import math +import contextlib +from ._compat import _default_text_stdout, range_type, PY2, isatty, \ + open_stream, strip_ansi, term_len, get_best_encoding, WIN, int_types, \ + CYGWIN +from .utils import echo +from .exceptions import ClickException + + +if os.name == 'nt': + BEFORE_BAR = '\r' + AFTER_BAR = '\n' +else: + BEFORE_BAR = '\r\033[?25l' + AFTER_BAR = '\033[?25h\n' + + +def _length_hint(obj): + """Returns the length hint of an object.""" + try: + return len(obj) + except (AttributeError, TypeError): + try: + get_hint = type(obj).__length_hint__ + except AttributeError: + return None + try: + hint = get_hint(obj) + except TypeError: + return None + if hint is NotImplemented or \ + not isinstance(hint, int_types) or \ + hint < 0: + return None + return hint + + +class ProgressBar(object): + + def __init__(self, iterable, length=None, fill_char='#', empty_char=' ', + bar_template='%(bar)s', info_sep=' ', show_eta=True, + show_percent=None, show_pos=False, item_show_func=None, + label=None, file=None, color=None, width=30): + self.fill_char = fill_char + self.empty_char = empty_char + self.bar_template = bar_template + self.info_sep = info_sep + self.show_eta = show_eta + self.show_percent = show_percent + self.show_pos = show_pos + self.item_show_func = item_show_func + self.label = label or '' + if file is None: + file = _default_text_stdout() + self.file = file + self.color = color + self.width = width + self.autowidth = width == 0 + + if length is None: + length = _length_hint(iterable) + if iterable is None: + if length is None: + raise TypeError('iterable or length is required') + iterable = range_type(length) + self.iter = iter(iterable) + self.length = length + self.length_known = length is not None + self.pos = 0 + self.avg = [] + self.start = self.last_eta = time.time() + self.eta_known = False + self.finished = False + self.max_width = None + self.entered = False + self.current_item = None + self.is_hidden = not isatty(self.file) + self._last_line = None + self.short_limit = 0.5 + + def __enter__(self): + self.entered = True + self.render_progress() + return self + + def __exit__(self, exc_type, exc_value, tb): + self.render_finish() + + def __iter__(self): + if not self.entered: + raise RuntimeError('You need to use progress bars in a with block.') + self.render_progress() + return self.generator() + + def is_fast(self): + return time.time() - self.start <= self.short_limit + + def render_finish(self): + if self.is_hidden or self.is_fast(): + return + self.file.write(AFTER_BAR) + self.file.flush() + + @property + def pct(self): + if self.finished: + return 1.0 + return min(self.pos / (float(self.length) or 1), 1.0) + + @property + def time_per_iteration(self): + if not self.avg: + return 0.0 + return sum(self.avg) / float(len(self.avg)) + + @property + def eta(self): + if self.length_known and not self.finished: + return self.time_per_iteration * (self.length - self.pos) + return 0.0 + + def format_eta(self): + if self.eta_known: + t = int(self.eta) + seconds = t % 60 + t //= 60 + minutes = t % 60 + t //= 60 + hours = t % 24 + t //= 24 + if t > 0: + days = t + return '%dd %02d:%02d:%02d' % (days, hours, minutes, seconds) + else: + return '%02d:%02d:%02d' % (hours, minutes, seconds) + return '' + + def format_pos(self): + pos = str(self.pos) + if self.length_known: + pos += '/%s' % self.length + return pos + + def format_pct(self): + return ('% 4d%%' % int(self.pct * 100))[1:] + + def format_bar(self): + if self.length_known: + bar_length = int(self.pct * self.width) + bar = self.fill_char * bar_length + bar += self.empty_char * (self.width - bar_length) + elif self.finished: + bar = self.fill_char * self.width + else: + bar = list(self.empty_char * (self.width or 1)) + if self.time_per_iteration != 0: + bar[int((math.cos(self.pos * self.time_per_iteration) + / 2.0 + 0.5) * self.width)] = self.fill_char + bar = ''.join(bar) + return bar + + def format_progress_line(self): + show_percent = self.show_percent + + info_bits = [] + if self.length_known and show_percent is None: + show_percent = not self.show_pos + + if self.show_pos: + info_bits.append(self.format_pos()) + if show_percent: + info_bits.append(self.format_pct()) + if self.show_eta and self.eta_known and not self.finished: + info_bits.append(self.format_eta()) + if self.item_show_func is not None: + item_info = self.item_show_func(self.current_item) + if item_info is not None: + info_bits.append(item_info) + + return (self.bar_template % { + 'label': self.label, + 'bar': self.format_bar(), + 'info': self.info_sep.join(info_bits) + }).rstrip() + + def render_progress(self): + from .termui import get_terminal_size + + if self.is_hidden: + return + + buf = [] + # Update width in case the terminal has been resized + if self.autowidth: + old_width = self.width + self.width = 0 + clutter_length = term_len(self.format_progress_line()) + new_width = max(0, get_terminal_size()[0] - clutter_length) + if new_width < old_width: + buf.append(BEFORE_BAR) + buf.append(' ' * self.max_width) + self.max_width = new_width + self.width = new_width + + clear_width = self.width + if self.max_width is not None: + clear_width = self.max_width + + buf.append(BEFORE_BAR) + line = self.format_progress_line() + line_len = term_len(line) + if self.max_width is None or self.max_width < line_len: + self.max_width = line_len + + buf.append(line) + buf.append(' ' * (clear_width - line_len)) + line = ''.join(buf) + # Render the line only if it changed. + + if line != self._last_line and not self.is_fast(): + self._last_line = line + echo(line, file=self.file, color=self.color, nl=False) + self.file.flush() + + def make_step(self, n_steps): + self.pos += n_steps + if self.length_known and self.pos >= self.length: + self.finished = True + + if (time.time() - self.last_eta) < 1.0: + return + + self.last_eta = time.time() + + # self.avg is a rolling list of length <= 7 of steps where steps are + # defined as time elapsed divided by the total progress through + # self.length. + if self.pos: + step = (time.time() - self.start) / self.pos + else: + step = time.time() - self.start + + self.avg = self.avg[-6:] + [step] + + self.eta_known = self.length_known + + def update(self, n_steps): + self.make_step(n_steps) + self.render_progress() + + def finish(self): + self.eta_known = 0 + self.current_item = None + self.finished = True + + def generator(self): + """ + Returns a generator which yields the items added to the bar during + construction, and updates the progress bar *after* the yielded block + returns. + """ + if not self.entered: + raise RuntimeError('You need to use progress bars in a with block.') + + if self.is_hidden: + for rv in self.iter: + yield rv + else: + for rv in self.iter: + self.current_item = rv + yield rv + self.update(1) + self.finish() + self.render_progress() + + +def pager(generator, color=None): + """Decide what method to use for paging through text.""" + stdout = _default_text_stdout() + if not isatty(sys.stdin) or not isatty(stdout): + return _nullpager(stdout, generator, color) + pager_cmd = (os.environ.get('PAGER', None) or '').strip() + if pager_cmd: + if WIN: + return _tempfilepager(generator, pager_cmd, color) + return _pipepager(generator, pager_cmd, color) + if os.environ.get('TERM') in ('dumb', 'emacs'): + return _nullpager(stdout, generator, color) + if WIN or sys.platform.startswith('os2'): + return _tempfilepager(generator, 'more <', color) + if hasattr(os, 'system') and os.system('(less) 2>/dev/null') == 0: + return _pipepager(generator, 'less', color) + + import tempfile + fd, filename = tempfile.mkstemp() + os.close(fd) + try: + if hasattr(os, 'system') and os.system('more "%s"' % filename) == 0: + return _pipepager(generator, 'more', color) + return _nullpager(stdout, generator, color) + finally: + os.unlink(filename) + + +def _pipepager(generator, cmd, color): + """Page through text by feeding it to another program. Invoking a + pager through this might support colors. + """ + import subprocess + env = dict(os.environ) + + # If we're piping to less we might support colors under the + # condition that + cmd_detail = cmd.rsplit('/', 1)[-1].split() + if color is None and cmd_detail[0] == 'less': + less_flags = os.environ.get('LESS', '') + ' '.join(cmd_detail[1:]) + if not less_flags: + env['LESS'] = '-R' + color = True + elif 'r' in less_flags or 'R' in less_flags: + color = True + + c = subprocess.Popen(cmd, shell=True, stdin=subprocess.PIPE, + env=env) + encoding = get_best_encoding(c.stdin) + try: + for text in generator: + if not color: + text = strip_ansi(text) + + c.stdin.write(text.encode(encoding, 'replace')) + except (IOError, KeyboardInterrupt): + pass + else: + c.stdin.close() + + # Less doesn't respect ^C, but catches it for its own UI purposes (aborting + # search or other commands inside less). + # + # That means when the user hits ^C, the parent process (click) terminates, + # but less is still alive, paging the output and messing up the terminal. + # + # If the user wants to make the pager exit on ^C, they should set + # `LESS='-K'`. It's not our decision to make. + while True: + try: + c.wait() + except KeyboardInterrupt: + pass + else: + break + + +def _tempfilepager(generator, cmd, color): + """Page through text by invoking a program on a temporary file.""" + import tempfile + filename = tempfile.mktemp() + # TODO: This never terminates if the passed generator never terminates. + text = "".join(generator) + if not color: + text = strip_ansi(text) + encoding = get_best_encoding(sys.stdout) + with open_stream(filename, 'wb')[0] as f: + f.write(text.encode(encoding)) + try: + os.system(cmd + ' "' + filename + '"') + finally: + os.unlink(filename) + + +def _nullpager(stream, generator, color): + """Simply print unformatted text. This is the ultimate fallback.""" + for text in generator: + if not color: + text = strip_ansi(text) + stream.write(text) + + +class Editor(object): + + def __init__(self, editor=None, env=None, require_save=True, + extension='.txt'): + self.editor = editor + self.env = env + self.require_save = require_save + self.extension = extension + + def get_editor(self): + if self.editor is not None: + return self.editor + for key in 'VISUAL', 'EDITOR': + rv = os.environ.get(key) + if rv: + return rv + if WIN: + return 'notepad' + for editor in 'vim', 'nano': + if os.system('which %s >/dev/null 2>&1' % editor) == 0: + return editor + return 'vi' + + def edit_file(self, filename): + import subprocess + editor = self.get_editor() + if self.env: + environ = os.environ.copy() + environ.update(self.env) + else: + environ = None + try: + c = subprocess.Popen('%s "%s"' % (editor, filename), + env=environ, shell=True) + exit_code = c.wait() + if exit_code != 0: + raise ClickException('%s: Editing failed!' % editor) + except OSError as e: + raise ClickException('%s: Editing failed: %s' % (editor, e)) + + def edit(self, text): + import tempfile + + text = text or '' + if text and not text.endswith('\n'): + text += '\n' + + fd, name = tempfile.mkstemp(prefix='editor-', suffix=self.extension) + try: + if WIN: + encoding = 'utf-8-sig' + text = text.replace('\n', '\r\n') + else: + encoding = 'utf-8' + text = text.encode(encoding) + + f = os.fdopen(fd, 'wb') + f.write(text) + f.close() + timestamp = os.path.getmtime(name) + + self.edit_file(name) + + if self.require_save \ + and os.path.getmtime(name) == timestamp: + return None + + f = open(name, 'rb') + try: + rv = f.read() + finally: + f.close() + return rv.decode('utf-8-sig').replace('\r\n', '\n') + finally: + os.unlink(name) + + +def open_url(url, wait=False, locate=False): + import subprocess + + def _unquote_file(url): + try: + import urllib + except ImportError: + import urllib + if url.startswith('file://'): + url = urllib.unquote(url[7:]) + return url + + if sys.platform == 'darwin': + args = ['open'] + if wait: + args.append('-W') + if locate: + args.append('-R') + args.append(_unquote_file(url)) + null = open('/dev/null', 'w') + try: + return subprocess.Popen(args, stderr=null).wait() + finally: + null.close() + elif WIN: + if locate: + url = _unquote_file(url) + args = 'explorer /select,"%s"' % _unquote_file( + url.replace('"', '')) + else: + args = 'start %s "" "%s"' % ( + wait and '/WAIT' or '', url.replace('"', '')) + return os.system(args) + elif CYGWIN: + if locate: + url = _unquote_file(url) + args = 'cygstart "%s"' % (os.path.dirname(url).replace('"', '')) + else: + args = 'cygstart %s "%s"' % ( + wait and '-w' or '', url.replace('"', '')) + return os.system(args) + + try: + if locate: + url = os.path.dirname(_unquote_file(url)) or '.' + else: + url = _unquote_file(url) + c = subprocess.Popen(['xdg-open', url]) + if wait: + return c.wait() + return 0 + except OSError: + if url.startswith(('http://', 'https://')) and not locate and not wait: + import webbrowser + webbrowser.open(url) + return 0 + return 1 + + +def _translate_ch_to_exc(ch): + if ch == u'\x03': + raise KeyboardInterrupt() + if ch == u'\x04' and not WIN: # Unix-like, Ctrl+D + raise EOFError() + if ch == u'\x1a' and WIN: # Windows, Ctrl+Z + raise EOFError() + + +if WIN: + import msvcrt + + @contextlib.contextmanager + def raw_terminal(): + yield + + def getchar(echo): + # The function `getch` will return a bytes object corresponding to + # the pressed character. Since Windows 10 build 1803, it will also + # return \x00 when called a second time after pressing a regular key. + # + # `getwch` does not share this probably-bugged behavior. Moreover, it + # returns a Unicode object by default, which is what we want. + # + # Either of these functions will return \x00 or \xe0 to indicate + # a special key, and you need to call the same function again to get + # the "rest" of the code. The fun part is that \u00e0 is + # "latin small letter a with grave", so if you type that on a French + # keyboard, you _also_ get a \xe0. + # E.g., consider the Up arrow. This returns \xe0 and then \x48. The + # resulting Unicode string reads as "a with grave" + "capital H". + # This is indistinguishable from when the user actually types + # "a with grave" and then "capital H". + # + # When \xe0 is returned, we assume it's part of a special-key sequence + # and call `getwch` again, but that means that when the user types + # the \u00e0 character, `getchar` doesn't return until a second + # character is typed. + # The alternative is returning immediately, but that would mess up + # cross-platform handling of arrow keys and others that start with + # \xe0. Another option is using `getch`, but then we can't reliably + # read non-ASCII characters, because return values of `getch` are + # limited to the current 8-bit codepage. + # + # Anyway, Click doesn't claim to do this Right(tm), and using `getwch` + # is doing the right thing in more situations than with `getch`. + if echo: + func = msvcrt.getwche + else: + func = msvcrt.getwch + + rv = func() + if rv in (u'\x00', u'\xe0'): + # \x00 and \xe0 are control characters that indicate special key, + # see above. + rv += func() + _translate_ch_to_exc(rv) + return rv +else: + import tty + import termios + + @contextlib.contextmanager + def raw_terminal(): + if not isatty(sys.stdin): + f = open('/dev/tty') + fd = f.fileno() + else: + fd = sys.stdin.fileno() + f = None + try: + old_settings = termios.tcgetattr(fd) + try: + tty.setraw(fd) + yield fd + finally: + termios.tcsetattr(fd, termios.TCSADRAIN, old_settings) + sys.stdout.flush() + if f is not None: + f.close() + except termios.error: + pass + + def getchar(echo): + with raw_terminal() as fd: + ch = os.read(fd, 32) + ch = ch.decode(get_best_encoding(sys.stdin), 'replace') + if echo and isatty(sys.stdout): + sys.stdout.write(ch) + _translate_ch_to_exc(ch) + return ch diff --git a/env/Lib/site-packages/click/_textwrap.py b/env/Lib/site-packages/click/_textwrap.py new file mode 100644 index 0000000..7e77603 --- /dev/null +++ b/env/Lib/site-packages/click/_textwrap.py @@ -0,0 +1,38 @@ +import textwrap +from contextlib import contextmanager + + +class TextWrapper(textwrap.TextWrapper): + + def _handle_long_word(self, reversed_chunks, cur_line, cur_len, width): + space_left = max(width - cur_len, 1) + + if self.break_long_words: + last = reversed_chunks[-1] + cut = last[:space_left] + res = last[space_left:] + cur_line.append(cut) + reversed_chunks[-1] = res + elif not cur_line: + cur_line.append(reversed_chunks.pop()) + + @contextmanager + def extra_indent(self, indent): + old_initial_indent = self.initial_indent + old_subsequent_indent = self.subsequent_indent + self.initial_indent += indent + self.subsequent_indent += indent + try: + yield + finally: + self.initial_indent = old_initial_indent + self.subsequent_indent = old_subsequent_indent + + def indent_only(self, text): + rv = [] + for idx, line in enumerate(text.splitlines()): + indent = self.initial_indent + if idx > 0: + indent = self.subsequent_indent + rv.append(indent + line) + return '\n'.join(rv) diff --git a/env/Lib/site-packages/click/_unicodefun.py b/env/Lib/site-packages/click/_unicodefun.py new file mode 100644 index 0000000..620edff --- /dev/null +++ b/env/Lib/site-packages/click/_unicodefun.py @@ -0,0 +1,125 @@ +import os +import sys +import codecs + +from ._compat import PY2 + + +# If someone wants to vendor click, we want to ensure the +# correct package is discovered. Ideally we could use a +# relative import here but unfortunately Python does not +# support that. +click = sys.modules[__name__.rsplit('.', 1)[0]] + + +def _find_unicode_literals_frame(): + import __future__ + if not hasattr(sys, '_getframe'): # not all Python implementations have it + return 0 + frm = sys._getframe(1) + idx = 1 + while frm is not None: + if frm.f_globals.get('__name__', '').startswith('click.'): + frm = frm.f_back + idx += 1 + elif frm.f_code.co_flags & __future__.unicode_literals.compiler_flag: + return idx + else: + break + return 0 + + +def _check_for_unicode_literals(): + if not __debug__: + return + if not PY2 or click.disable_unicode_literals_warning: + return + bad_frame = _find_unicode_literals_frame() + if bad_frame <= 0: + return + from warnings import warn + warn(Warning('Click detected the use of the unicode_literals ' + '__future__ import. This is heavily discouraged ' + 'because it can introduce subtle bugs in your ' + 'code. You should instead use explicit u"" literals ' + 'for your unicode strings. For more information see ' + 'https://click.palletsprojects.com/python3/'), + stacklevel=bad_frame) + + +def _verify_python3_env(): + """Ensures that the environment is good for unicode on Python 3.""" + if PY2: + return + try: + import locale + fs_enc = codecs.lookup(locale.getpreferredencoding()).name + except Exception: + fs_enc = 'ascii' + if fs_enc != 'ascii': + return + + extra = '' + if os.name == 'posix': + import subprocess + try: + rv = subprocess.Popen(['locale', '-a'], stdout=subprocess.PIPE, + stderr=subprocess.PIPE).communicate()[0] + except OSError: + rv = b'' + good_locales = set() + has_c_utf8 = False + + # Make sure we're operating on text here. + if isinstance(rv, bytes): + rv = rv.decode('ascii', 'replace') + + for line in rv.splitlines(): + locale = line.strip() + if locale.lower().endswith(('.utf-8', '.utf8')): + good_locales.add(locale) + if locale.lower() in ('c.utf8', 'c.utf-8'): + has_c_utf8 = True + + extra += '\n\n' + if not good_locales: + extra += ( + 'Additional information: on this system no suitable UTF-8\n' + 'locales were discovered. This most likely requires resolving\n' + 'by reconfiguring the locale system.' + ) + elif has_c_utf8: + extra += ( + 'This system supports the C.UTF-8 locale which is recommended.\n' + 'You might be able to resolve your issue by exporting the\n' + 'following environment variables:\n\n' + ' export LC_ALL=C.UTF-8\n' + ' export LANG=C.UTF-8' + ) + else: + extra += ( + 'This system lists a couple of UTF-8 supporting locales that\n' + 'you can pick from. The following suitable locales were\n' + 'discovered: %s' + ) % ', '.join(sorted(good_locales)) + + bad_locale = None + for locale in os.environ.get('LC_ALL'), os.environ.get('LANG'): + if locale and locale.lower().endswith(('.utf-8', '.utf8')): + bad_locale = locale + if locale is not None: + break + if bad_locale is not None: + extra += ( + '\n\nClick discovered that you exported a UTF-8 locale\n' + 'but the locale system could not pick up from it because\n' + 'it does not exist. The exported locale is "%s" but it\n' + 'is not supported' + ) % bad_locale + + raise RuntimeError( + 'Click will abort further execution because Python 3 was' + ' configured to use ASCII as encoding for the environment.' + ' Consult https://click.palletsprojects.com/en/7.x/python3/ for' + ' mitigation steps.' + extra + ) diff --git a/env/Lib/site-packages/click/_winconsole.py b/env/Lib/site-packages/click/_winconsole.py new file mode 100644 index 0000000..bbb080d --- /dev/null +++ b/env/Lib/site-packages/click/_winconsole.py @@ -0,0 +1,307 @@ +# -*- coding: utf-8 -*- +# This module is based on the excellent work by Adam Bartoš who +# provided a lot of what went into the implementation here in +# the discussion to issue1602 in the Python bug tracker. +# +# There are some general differences in regards to how this works +# compared to the original patches as we do not need to patch +# the entire interpreter but just work in our little world of +# echo and prmopt. + +import io +import os +import sys +import zlib +import time +import ctypes +import msvcrt +from ._compat import _NonClosingTextIOWrapper, text_type, PY2 +from ctypes import byref, POINTER, c_int, c_char, c_char_p, \ + c_void_p, py_object, c_ssize_t, c_ulong, windll, WINFUNCTYPE +try: + from ctypes import pythonapi + PyObject_GetBuffer = pythonapi.PyObject_GetBuffer + PyBuffer_Release = pythonapi.PyBuffer_Release +except ImportError: + pythonapi = None +from ctypes.wintypes import LPWSTR, LPCWSTR + + +c_ssize_p = POINTER(c_ssize_t) + +kernel32 = windll.kernel32 +GetStdHandle = kernel32.GetStdHandle +ReadConsoleW = kernel32.ReadConsoleW +WriteConsoleW = kernel32.WriteConsoleW +GetLastError = kernel32.GetLastError +GetCommandLineW = WINFUNCTYPE(LPWSTR)( + ('GetCommandLineW', windll.kernel32)) +CommandLineToArgvW = WINFUNCTYPE( + POINTER(LPWSTR), LPCWSTR, POINTER(c_int))( + ('CommandLineToArgvW', windll.shell32)) + + +STDIN_HANDLE = GetStdHandle(-10) +STDOUT_HANDLE = GetStdHandle(-11) +STDERR_HANDLE = GetStdHandle(-12) + + +PyBUF_SIMPLE = 0 +PyBUF_WRITABLE = 1 + +ERROR_SUCCESS = 0 +ERROR_NOT_ENOUGH_MEMORY = 8 +ERROR_OPERATION_ABORTED = 995 + +STDIN_FILENO = 0 +STDOUT_FILENO = 1 +STDERR_FILENO = 2 + +EOF = b'\x1a' +MAX_BYTES_WRITTEN = 32767 + + +class Py_buffer(ctypes.Structure): + _fields_ = [ + ('buf', c_void_p), + ('obj', py_object), + ('len', c_ssize_t), + ('itemsize', c_ssize_t), + ('readonly', c_int), + ('ndim', c_int), + ('format', c_char_p), + ('shape', c_ssize_p), + ('strides', c_ssize_p), + ('suboffsets', c_ssize_p), + ('internal', c_void_p) + ] + + if PY2: + _fields_.insert(-1, ('smalltable', c_ssize_t * 2)) + + +# On PyPy we cannot get buffers so our ability to operate here is +# serverly limited. +if pythonapi is None: + get_buffer = None +else: + def get_buffer(obj, writable=False): + buf = Py_buffer() + flags = PyBUF_WRITABLE if writable else PyBUF_SIMPLE + PyObject_GetBuffer(py_object(obj), byref(buf), flags) + try: + buffer_type = c_char * buf.len + return buffer_type.from_address(buf.buf) + finally: + PyBuffer_Release(byref(buf)) + + +class _WindowsConsoleRawIOBase(io.RawIOBase): + + def __init__(self, handle): + self.handle = handle + + def isatty(self): + io.RawIOBase.isatty(self) + return True + + +class _WindowsConsoleReader(_WindowsConsoleRawIOBase): + + def readable(self): + return True + + def readinto(self, b): + bytes_to_be_read = len(b) + if not bytes_to_be_read: + return 0 + elif bytes_to_be_read % 2: + raise ValueError('cannot read odd number of bytes from ' + 'UTF-16-LE encoded console') + + buffer = get_buffer(b, writable=True) + code_units_to_be_read = bytes_to_be_read // 2 + code_units_read = c_ulong() + + rv = ReadConsoleW(self.handle, buffer, code_units_to_be_read, + byref(code_units_read), None) + if GetLastError() == ERROR_OPERATION_ABORTED: + # wait for KeyboardInterrupt + time.sleep(0.1) + if not rv: + raise OSError('Windows error: %s' % GetLastError()) + + if buffer[0] == EOF: + return 0 + return 2 * code_units_read.value + + +class _WindowsConsoleWriter(_WindowsConsoleRawIOBase): + + def writable(self): + return True + + @staticmethod + def _get_error_message(errno): + if errno == ERROR_SUCCESS: + return 'ERROR_SUCCESS' + elif errno == ERROR_NOT_ENOUGH_MEMORY: + return 'ERROR_NOT_ENOUGH_MEMORY' + return 'Windows error %s' % errno + + def write(self, b): + bytes_to_be_written = len(b) + buf = get_buffer(b) + code_units_to_be_written = min(bytes_to_be_written, + MAX_BYTES_WRITTEN) // 2 + code_units_written = c_ulong() + + WriteConsoleW(self.handle, buf, code_units_to_be_written, + byref(code_units_written), None) + bytes_written = 2 * code_units_written.value + + if bytes_written == 0 and bytes_to_be_written > 0: + raise OSError(self._get_error_message(GetLastError())) + return bytes_written + + +class ConsoleStream(object): + + def __init__(self, text_stream, byte_stream): + self._text_stream = text_stream + self.buffer = byte_stream + + @property + def name(self): + return self.buffer.name + + def write(self, x): + if isinstance(x, text_type): + return self._text_stream.write(x) + try: + self.flush() + except Exception: + pass + return self.buffer.write(x) + + def writelines(self, lines): + for line in lines: + self.write(line) + + def __getattr__(self, name): + return getattr(self._text_stream, name) + + def isatty(self): + return self.buffer.isatty() + + def __repr__(self): + return '' % ( + self.name, + self.encoding, + ) + + +class WindowsChunkedWriter(object): + """ + Wraps a stream (such as stdout), acting as a transparent proxy for all + attribute access apart from method 'write()' which we wrap to write in + limited chunks due to a Windows limitation on binary console streams. + """ + def __init__(self, wrapped): + # double-underscore everything to prevent clashes with names of + # attributes on the wrapped stream object. + self.__wrapped = wrapped + + def __getattr__(self, name): + return getattr(self.__wrapped, name) + + def write(self, text): + total_to_write = len(text) + written = 0 + + while written < total_to_write: + to_write = min(total_to_write - written, MAX_BYTES_WRITTEN) + self.__wrapped.write(text[written:written+to_write]) + written += to_write + + +_wrapped_std_streams = set() + + +def _wrap_std_stream(name): + # Python 2 & Windows 7 and below + if PY2 and sys.getwindowsversion()[:2] <= (6, 1) and name not in _wrapped_std_streams: + setattr(sys, name, WindowsChunkedWriter(getattr(sys, name))) + _wrapped_std_streams.add(name) + + +def _get_text_stdin(buffer_stream): + text_stream = _NonClosingTextIOWrapper( + io.BufferedReader(_WindowsConsoleReader(STDIN_HANDLE)), + 'utf-16-le', 'strict', line_buffering=True) + return ConsoleStream(text_stream, buffer_stream) + + +def _get_text_stdout(buffer_stream): + text_stream = _NonClosingTextIOWrapper( + io.BufferedWriter(_WindowsConsoleWriter(STDOUT_HANDLE)), + 'utf-16-le', 'strict', line_buffering=True) + return ConsoleStream(text_stream, buffer_stream) + + +def _get_text_stderr(buffer_stream): + text_stream = _NonClosingTextIOWrapper( + io.BufferedWriter(_WindowsConsoleWriter(STDERR_HANDLE)), + 'utf-16-le', 'strict', line_buffering=True) + return ConsoleStream(text_stream, buffer_stream) + + +if PY2: + def _hash_py_argv(): + return zlib.crc32('\x00'.join(sys.argv[1:])) + + _initial_argv_hash = _hash_py_argv() + + def _get_windows_argv(): + argc = c_int(0) + argv_unicode = CommandLineToArgvW(GetCommandLineW(), byref(argc)) + argv = [argv_unicode[i] for i in range(0, argc.value)] + + if not hasattr(sys, 'frozen'): + argv = argv[1:] + while len(argv) > 0: + arg = argv[0] + if not arg.startswith('-') or arg == '-': + break + argv = argv[1:] + if arg.startswith(('-c', '-m')): + break + + return argv[1:] + + +_stream_factories = { + 0: _get_text_stdin, + 1: _get_text_stdout, + 2: _get_text_stderr, +} + + +def _get_windows_console_stream(f, encoding, errors): + if get_buffer is not None and \ + encoding in ('utf-16-le', None) \ + and errors in ('strict', None) and \ + hasattr(f, 'isatty') and f.isatty(): + func = _stream_factories.get(f.fileno()) + if func is not None: + if not PY2: + f = getattr(f, 'buffer', None) + if f is None: + return None + else: + # If we are on Python 2 we need to set the stream that we + # deal with to binary mode as otherwise the exercise if a + # bit moot. The same problems apply as for + # get_binary_stdin and friends from _compat. + msvcrt.setmode(f.fileno(), os.O_BINARY) + return func(f) diff --git a/env/Lib/site-packages/click/core.py b/env/Lib/site-packages/click/core.py new file mode 100644 index 0000000..7a1e342 --- /dev/null +++ b/env/Lib/site-packages/click/core.py @@ -0,0 +1,1856 @@ +import errno +import inspect +import os +import sys +from contextlib import contextmanager +from itertools import repeat +from functools import update_wrapper + +from .types import convert_type, IntRange, BOOL +from .utils import PacifyFlushWrapper, make_str, make_default_short_help, \ + echo, get_os_args +from .exceptions import ClickException, UsageError, BadParameter, Abort, \ + MissingParameter, Exit +from .termui import prompt, confirm, style +from .formatting import HelpFormatter, join_options +from .parser import OptionParser, split_opt +from .globals import push_context, pop_context + +from ._compat import PY2, isidentifier, iteritems, string_types +from ._unicodefun import _check_for_unicode_literals, _verify_python3_env + + +_missing = object() + + +SUBCOMMAND_METAVAR = 'COMMAND [ARGS]...' +SUBCOMMANDS_METAVAR = 'COMMAND1 [ARGS]... [COMMAND2 [ARGS]...]...' + +DEPRECATED_HELP_NOTICE = ' (DEPRECATED)' +DEPRECATED_INVOKE_NOTICE = 'DeprecationWarning: ' + \ + 'The command %(name)s is deprecated.' + + +def _maybe_show_deprecated_notice(cmd): + if cmd.deprecated: + echo(style(DEPRECATED_INVOKE_NOTICE % {'name': cmd.name}, fg='red'), err=True) + + +def fast_exit(code): + """Exit without garbage collection, this speeds up exit by about 10ms for + things like bash completion. + """ + sys.stdout.flush() + sys.stderr.flush() + os._exit(code) + + +def _bashcomplete(cmd, prog_name, complete_var=None): + """Internal handler for the bash completion support.""" + if complete_var is None: + complete_var = '_%s_COMPLETE' % (prog_name.replace('-', '_')).upper() + complete_instr = os.environ.get(complete_var) + if not complete_instr: + return + + from ._bashcomplete import bashcomplete + if bashcomplete(cmd, prog_name, complete_var, complete_instr): + fast_exit(1) + + +def _check_multicommand(base_command, cmd_name, cmd, register=False): + if not base_command.chain or not isinstance(cmd, MultiCommand): + return + if register: + hint = 'It is not possible to add multi commands as children to ' \ + 'another multi command that is in chain mode' + else: + hint = 'Found a multi command as subcommand to a multi command ' \ + 'that is in chain mode. This is not supported' + raise RuntimeError('%s. Command "%s" is set to chain and "%s" was ' + 'added as subcommand but it in itself is a ' + 'multi command. ("%s" is a %s within a chained ' + '%s named "%s").' % ( + hint, base_command.name, cmd_name, + cmd_name, cmd.__class__.__name__, + base_command.__class__.__name__, + base_command.name)) + + +def batch(iterable, batch_size): + return list(zip(*repeat(iter(iterable), batch_size))) + + +def invoke_param_callback(callback, ctx, param, value): + code = getattr(callback, '__code__', None) + args = getattr(code, 'co_argcount', 3) + + if args < 3: + # This will become a warning in Click 3.0: + from warnings import warn + warn(Warning('Invoked legacy parameter callback "%s". The new ' + 'signature for such callbacks starting with ' + 'click 2.0 is (ctx, param, value).' + % callback), stacklevel=3) + return callback(ctx, value) + return callback(ctx, param, value) + + +@contextmanager +def augment_usage_errors(ctx, param=None): + """Context manager that attaches extra information to exceptions that + fly. + """ + try: + yield + except BadParameter as e: + if e.ctx is None: + e.ctx = ctx + if param is not None and e.param is None: + e.param = param + raise + except UsageError as e: + if e.ctx is None: + e.ctx = ctx + raise + + +def iter_params_for_processing(invocation_order, declaration_order): + """Given a sequence of parameters in the order as should be considered + for processing and an iterable of parameters that exist, this returns + a list in the correct order as they should be processed. + """ + def sort_key(item): + try: + idx = invocation_order.index(item) + except ValueError: + idx = float('inf') + return (not item.is_eager, idx) + + return sorted(declaration_order, key=sort_key) + + +class Context(object): + """The context is a special internal object that holds state relevant + for the script execution at every single level. It's normally invisible + to commands unless they opt-in to getting access to it. + + The context is useful as it can pass internal objects around and can + control special execution features such as reading data from + environment variables. + + A context can be used as context manager in which case it will call + :meth:`close` on teardown. + + .. versionadded:: 2.0 + Added the `resilient_parsing`, `help_option_names`, + `token_normalize_func` parameters. + + .. versionadded:: 3.0 + Added the `allow_extra_args` and `allow_interspersed_args` + parameters. + + .. versionadded:: 4.0 + Added the `color`, `ignore_unknown_options`, and + `max_content_width` parameters. + + :param command: the command class for this context. + :param parent: the parent context. + :param info_name: the info name for this invocation. Generally this + is the most descriptive name for the script or + command. For the toplevel script it is usually + the name of the script, for commands below it it's + the name of the script. + :param obj: an arbitrary object of user data. + :param auto_envvar_prefix: the prefix to use for automatic environment + variables. If this is `None` then reading + from environment variables is disabled. This + does not affect manually set environment + variables which are always read. + :param default_map: a dictionary (like object) with default values + for parameters. + :param terminal_width: the width of the terminal. The default is + inherit from parent context. If no context + defines the terminal width then auto + detection will be applied. + :param max_content_width: the maximum width for content rendered by + Click (this currently only affects help + pages). This defaults to 80 characters if + not overridden. In other words: even if the + terminal is larger than that, Click will not + format things wider than 80 characters by + default. In addition to that, formatters might + add some safety mapping on the right. + :param resilient_parsing: if this flag is enabled then Click will + parse without any interactivity or callback + invocation. Default values will also be + ignored. This is useful for implementing + things such as completion support. + :param allow_extra_args: if this is set to `True` then extra arguments + at the end will not raise an error and will be + kept on the context. The default is to inherit + from the command. + :param allow_interspersed_args: if this is set to `False` then options + and arguments cannot be mixed. The + default is to inherit from the command. + :param ignore_unknown_options: instructs click to ignore options it does + not know and keeps them for later + processing. + :param help_option_names: optionally a list of strings that define how + the default help parameter is named. The + default is ``['--help']``. + :param token_normalize_func: an optional function that is used to + normalize tokens (options, choices, + etc.). This for instance can be used to + implement case insensitive behavior. + :param color: controls if the terminal supports ANSI colors or not. The + default is autodetection. This is only needed if ANSI + codes are used in texts that Click prints which is by + default not the case. This for instance would affect + help output. + """ + + def __init__(self, command, parent=None, info_name=None, obj=None, + auto_envvar_prefix=None, default_map=None, + terminal_width=None, max_content_width=None, + resilient_parsing=False, allow_extra_args=None, + allow_interspersed_args=None, + ignore_unknown_options=None, help_option_names=None, + token_normalize_func=None, color=None): + #: the parent context or `None` if none exists. + self.parent = parent + #: the :class:`Command` for this context. + self.command = command + #: the descriptive information name + self.info_name = info_name + #: the parsed parameters except if the value is hidden in which + #: case it's not remembered. + self.params = {} + #: the leftover arguments. + self.args = [] + #: protected arguments. These are arguments that are prepended + #: to `args` when certain parsing scenarios are encountered but + #: must be never propagated to another arguments. This is used + #: to implement nested parsing. + self.protected_args = [] + if obj is None and parent is not None: + obj = parent.obj + #: the user object stored. + self.obj = obj + self._meta = getattr(parent, 'meta', {}) + + #: A dictionary (-like object) with defaults for parameters. + if default_map is None \ + and parent is not None \ + and parent.default_map is not None: + default_map = parent.default_map.get(info_name) + self.default_map = default_map + + #: This flag indicates if a subcommand is going to be executed. A + #: group callback can use this information to figure out if it's + #: being executed directly or because the execution flow passes + #: onwards to a subcommand. By default it's None, but it can be + #: the name of the subcommand to execute. + #: + #: If chaining is enabled this will be set to ``'*'`` in case + #: any commands are executed. It is however not possible to + #: figure out which ones. If you require this knowledge you + #: should use a :func:`resultcallback`. + self.invoked_subcommand = None + + if terminal_width is None and parent is not None: + terminal_width = parent.terminal_width + #: The width of the terminal (None is autodetection). + self.terminal_width = terminal_width + + if max_content_width is None and parent is not None: + max_content_width = parent.max_content_width + #: The maximum width of formatted content (None implies a sensible + #: default which is 80 for most things). + self.max_content_width = max_content_width + + if allow_extra_args is None: + allow_extra_args = command.allow_extra_args + #: Indicates if the context allows extra args or if it should + #: fail on parsing. + #: + #: .. versionadded:: 3.0 + self.allow_extra_args = allow_extra_args + + if allow_interspersed_args is None: + allow_interspersed_args = command.allow_interspersed_args + #: Indicates if the context allows mixing of arguments and + #: options or not. + #: + #: .. versionadded:: 3.0 + self.allow_interspersed_args = allow_interspersed_args + + if ignore_unknown_options is None: + ignore_unknown_options = command.ignore_unknown_options + #: Instructs click to ignore options that a command does not + #: understand and will store it on the context for later + #: processing. This is primarily useful for situations where you + #: want to call into external programs. Generally this pattern is + #: strongly discouraged because it's not possibly to losslessly + #: forward all arguments. + #: + #: .. versionadded:: 4.0 + self.ignore_unknown_options = ignore_unknown_options + + if help_option_names is None: + if parent is not None: + help_option_names = parent.help_option_names + else: + help_option_names = ['--help'] + + #: The names for the help options. + self.help_option_names = help_option_names + + if token_normalize_func is None and parent is not None: + token_normalize_func = parent.token_normalize_func + + #: An optional normalization function for tokens. This is + #: options, choices, commands etc. + self.token_normalize_func = token_normalize_func + + #: Indicates if resilient parsing is enabled. In that case Click + #: will do its best to not cause any failures and default values + #: will be ignored. Useful for completion. + self.resilient_parsing = resilient_parsing + + # If there is no envvar prefix yet, but the parent has one and + # the command on this level has a name, we can expand the envvar + # prefix automatically. + if auto_envvar_prefix is None: + if parent is not None \ + and parent.auto_envvar_prefix is not None and \ + self.info_name is not None: + auto_envvar_prefix = '%s_%s' % (parent.auto_envvar_prefix, + self.info_name.upper()) + else: + auto_envvar_prefix = auto_envvar_prefix.upper() + self.auto_envvar_prefix = auto_envvar_prefix + + if color is None and parent is not None: + color = parent.color + + #: Controls if styling output is wanted or not. + self.color = color + + self._close_callbacks = [] + self._depth = 0 + + def __enter__(self): + self._depth += 1 + push_context(self) + return self + + def __exit__(self, exc_type, exc_value, tb): + self._depth -= 1 + if self._depth == 0: + self.close() + pop_context() + + @contextmanager + def scope(self, cleanup=True): + """This helper method can be used with the context object to promote + it to the current thread local (see :func:`get_current_context`). + The default behavior of this is to invoke the cleanup functions which + can be disabled by setting `cleanup` to `False`. The cleanup + functions are typically used for things such as closing file handles. + + If the cleanup is intended the context object can also be directly + used as a context manager. + + Example usage:: + + with ctx.scope(): + assert get_current_context() is ctx + + This is equivalent:: + + with ctx: + assert get_current_context() is ctx + + .. versionadded:: 5.0 + + :param cleanup: controls if the cleanup functions should be run or + not. The default is to run these functions. In + some situations the context only wants to be + temporarily pushed in which case this can be disabled. + Nested pushes automatically defer the cleanup. + """ + if not cleanup: + self._depth += 1 + try: + with self as rv: + yield rv + finally: + if not cleanup: + self._depth -= 1 + + @property + def meta(self): + """This is a dictionary which is shared with all the contexts + that are nested. It exists so that click utilities can store some + state here if they need to. It is however the responsibility of + that code to manage this dictionary well. + + The keys are supposed to be unique dotted strings. For instance + module paths are a good choice for it. What is stored in there is + irrelevant for the operation of click. However what is important is + that code that places data here adheres to the general semantics of + the system. + + Example usage:: + + LANG_KEY = __name__ + '.lang' + + def set_language(value): + ctx = get_current_context() + ctx.meta[LANG_KEY] = value + + def get_language(): + return get_current_context().meta.get(LANG_KEY, 'en_US') + + .. versionadded:: 5.0 + """ + return self._meta + + def make_formatter(self): + """Creates the formatter for the help and usage output.""" + return HelpFormatter(width=self.terminal_width, + max_width=self.max_content_width) + + def call_on_close(self, f): + """This decorator remembers a function as callback that should be + executed when the context tears down. This is most useful to bind + resource handling to the script execution. For instance, file objects + opened by the :class:`File` type will register their close callbacks + here. + + :param f: the function to execute on teardown. + """ + self._close_callbacks.append(f) + return f + + def close(self): + """Invokes all close callbacks.""" + for cb in self._close_callbacks: + cb() + self._close_callbacks = [] + + @property + def command_path(self): + """The computed command path. This is used for the ``usage`` + information on the help page. It's automatically created by + combining the info names of the chain of contexts to the root. + """ + rv = '' + if self.info_name is not None: + rv = self.info_name + if self.parent is not None: + rv = self.parent.command_path + ' ' + rv + return rv.lstrip() + + def find_root(self): + """Finds the outermost context.""" + node = self + while node.parent is not None: + node = node.parent + return node + + def find_object(self, object_type): + """Finds the closest object of a given type.""" + node = self + while node is not None: + if isinstance(node.obj, object_type): + return node.obj + node = node.parent + + def ensure_object(self, object_type): + """Like :meth:`find_object` but sets the innermost object to a + new instance of `object_type` if it does not exist. + """ + rv = self.find_object(object_type) + if rv is None: + self.obj = rv = object_type() + return rv + + def lookup_default(self, name): + """Looks up the default for a parameter name. This by default + looks into the :attr:`default_map` if available. + """ + if self.default_map is not None: + rv = self.default_map.get(name) + if callable(rv): + rv = rv() + return rv + + def fail(self, message): + """Aborts the execution of the program with a specific error + message. + + :param message: the error message to fail with. + """ + raise UsageError(message, self) + + def abort(self): + """Aborts the script.""" + raise Abort() + + def exit(self, code=0): + """Exits the application with a given exit code.""" + raise Exit(code) + + def get_usage(self): + """Helper method to get formatted usage string for the current + context and command. + """ + return self.command.get_usage(self) + + def get_help(self): + """Helper method to get formatted help page for the current + context and command. + """ + return self.command.get_help(self) + + def invoke(*args, **kwargs): + """Invokes a command callback in exactly the way it expects. There + are two ways to invoke this method: + + 1. the first argument can be a callback and all other arguments and + keyword arguments are forwarded directly to the function. + 2. the first argument is a click command object. In that case all + arguments are forwarded as well but proper click parameters + (options and click arguments) must be keyword arguments and Click + will fill in defaults. + + Note that before Click 3.2 keyword arguments were not properly filled + in against the intention of this code and no context was created. For + more information about this change and why it was done in a bugfix + release see :ref:`upgrade-to-3.2`. + """ + self, callback = args[:2] + ctx = self + + # It's also possible to invoke another command which might or + # might not have a callback. In that case we also fill + # in defaults and make a new context for this command. + if isinstance(callback, Command): + other_cmd = callback + callback = other_cmd.callback + ctx = Context(other_cmd, info_name=other_cmd.name, parent=self) + if callback is None: + raise TypeError('The given command does not have a ' + 'callback that can be invoked.') + + for param in other_cmd.params: + if param.name not in kwargs and param.expose_value: + kwargs[param.name] = param.get_default(ctx) + + args = args[2:] + with augment_usage_errors(self): + with ctx: + return callback(*args, **kwargs) + + def forward(*args, **kwargs): + """Similar to :meth:`invoke` but fills in default keyword + arguments from the current context if the other command expects + it. This cannot invoke callbacks directly, only other commands. + """ + self, cmd = args[:2] + + # It's also possible to invoke another command which might or + # might not have a callback. + if not isinstance(cmd, Command): + raise TypeError('Callback is not a command.') + + for param in self.params: + if param not in kwargs: + kwargs[param] = self.params[param] + + return self.invoke(cmd, **kwargs) + + +class BaseCommand(object): + """The base command implements the minimal API contract of commands. + Most code will never use this as it does not implement a lot of useful + functionality but it can act as the direct subclass of alternative + parsing methods that do not depend on the Click parser. + + For instance, this can be used to bridge Click and other systems like + argparse or docopt. + + Because base commands do not implement a lot of the API that other + parts of Click take for granted, they are not supported for all + operations. For instance, they cannot be used with the decorators + usually and they have no built-in callback system. + + .. versionchanged:: 2.0 + Added the `context_settings` parameter. + + :param name: the name of the command to use unless a group overrides it. + :param context_settings: an optional dictionary with defaults that are + passed to the context object. + """ + #: the default for the :attr:`Context.allow_extra_args` flag. + allow_extra_args = False + #: the default for the :attr:`Context.allow_interspersed_args` flag. + allow_interspersed_args = True + #: the default for the :attr:`Context.ignore_unknown_options` flag. + ignore_unknown_options = False + + def __init__(self, name, context_settings=None): + #: the name the command thinks it has. Upon registering a command + #: on a :class:`Group` the group will default the command name + #: with this information. You should instead use the + #: :class:`Context`\'s :attr:`~Context.info_name` attribute. + self.name = name + if context_settings is None: + context_settings = {} + #: an optional dictionary with defaults passed to the context. + self.context_settings = context_settings + + def get_usage(self, ctx): + raise NotImplementedError('Base commands cannot get usage') + + def get_help(self, ctx): + raise NotImplementedError('Base commands cannot get help') + + def make_context(self, info_name, args, parent=None, **extra): + """This function when given an info name and arguments will kick + off the parsing and create a new :class:`Context`. It does not + invoke the actual command callback though. + + :param info_name: the info name for this invokation. Generally this + is the most descriptive name for the script or + command. For the toplevel script it's usually + the name of the script, for commands below it it's + the name of the script. + :param args: the arguments to parse as list of strings. + :param parent: the parent context if available. + :param extra: extra keyword arguments forwarded to the context + constructor. + """ + for key, value in iteritems(self.context_settings): + if key not in extra: + extra[key] = value + ctx = Context(self, info_name=info_name, parent=parent, **extra) + with ctx.scope(cleanup=False): + self.parse_args(ctx, args) + return ctx + + def parse_args(self, ctx, args): + """Given a context and a list of arguments this creates the parser + and parses the arguments, then modifies the context as necessary. + This is automatically invoked by :meth:`make_context`. + """ + raise NotImplementedError('Base commands do not know how to parse ' + 'arguments.') + + def invoke(self, ctx): + """Given a context, this invokes the command. The default + implementation is raising a not implemented error. + """ + raise NotImplementedError('Base commands are not invokable by default') + + def main(self, args=None, prog_name=None, complete_var=None, + standalone_mode=True, **extra): + """This is the way to invoke a script with all the bells and + whistles as a command line application. This will always terminate + the application after a call. If this is not wanted, ``SystemExit`` + needs to be caught. + + This method is also available by directly calling the instance of + a :class:`Command`. + + .. versionadded:: 3.0 + Added the `standalone_mode` flag to control the standalone mode. + + :param args: the arguments that should be used for parsing. If not + provided, ``sys.argv[1:]`` is used. + :param prog_name: the program name that should be used. By default + the program name is constructed by taking the file + name from ``sys.argv[0]``. + :param complete_var: the environment variable that controls the + bash completion support. The default is + ``"__COMPLETE"`` with prog_name in + uppercase. + :param standalone_mode: the default behavior is to invoke the script + in standalone mode. Click will then + handle exceptions and convert them into + error messages and the function will never + return but shut down the interpreter. If + this is set to `False` they will be + propagated to the caller and the return + value of this function is the return value + of :meth:`invoke`. + :param extra: extra keyword arguments are forwarded to the context + constructor. See :class:`Context` for more information. + """ + # If we are in Python 3, we will verify that the environment is + # sane at this point or reject further execution to avoid a + # broken script. + if not PY2: + _verify_python3_env() + else: + _check_for_unicode_literals() + + if args is None: + args = get_os_args() + else: + args = list(args) + + if prog_name is None: + prog_name = make_str(os.path.basename( + sys.argv and sys.argv[0] or __file__)) + + # Hook for the Bash completion. This only activates if the Bash + # completion is actually enabled, otherwise this is quite a fast + # noop. + _bashcomplete(self, prog_name, complete_var) + + try: + try: + with self.make_context(prog_name, args, **extra) as ctx: + rv = self.invoke(ctx) + if not standalone_mode: + return rv + # it's not safe to `ctx.exit(rv)` here! + # note that `rv` may actually contain data like "1" which + # has obvious effects + # more subtle case: `rv=[None, None]` can come out of + # chained commands which all returned `None` -- so it's not + # even always obvious that `rv` indicates success/failure + # by its truthiness/falsiness + ctx.exit() + except (EOFError, KeyboardInterrupt): + echo(file=sys.stderr) + raise Abort() + except ClickException as e: + if not standalone_mode: + raise + e.show() + sys.exit(e.exit_code) + except IOError as e: + if e.errno == errno.EPIPE: + sys.stdout = PacifyFlushWrapper(sys.stdout) + sys.stderr = PacifyFlushWrapper(sys.stderr) + sys.exit(1) + else: + raise + except Exit as e: + if standalone_mode: + sys.exit(e.exit_code) + else: + # in non-standalone mode, return the exit code + # note that this is only reached if `self.invoke` above raises + # an Exit explicitly -- thus bypassing the check there which + # would return its result + # the results of non-standalone execution may therefore be + # somewhat ambiguous: if there are codepaths which lead to + # `ctx.exit(1)` and to `return 1`, the caller won't be able to + # tell the difference between the two + return e.exit_code + except Abort: + if not standalone_mode: + raise + echo('Aborted!', file=sys.stderr) + sys.exit(1) + + def __call__(self, *args, **kwargs): + """Alias for :meth:`main`.""" + return self.main(*args, **kwargs) + + +class Command(BaseCommand): + """Commands are the basic building block of command line interfaces in + Click. A basic command handles command line parsing and might dispatch + more parsing to commands nested below it. + + .. versionchanged:: 2.0 + Added the `context_settings` parameter. + + :param name: the name of the command to use unless a group overrides it. + :param context_settings: an optional dictionary with defaults that are + passed to the context object. + :param callback: the callback to invoke. This is optional. + :param params: the parameters to register with this command. This can + be either :class:`Option` or :class:`Argument` objects. + :param help: the help string to use for this command. + :param epilog: like the help string but it's printed at the end of the + help page after everything else. + :param short_help: the short help to use for this command. This is + shown on the command listing of the parent command. + :param add_help_option: by default each command registers a ``--help`` + option. This can be disabled by this parameter. + :param hidden: hide this command from help outputs. + + :param deprecated: issues a message indicating that + the command is deprecated. + """ + + def __init__(self, name, context_settings=None, callback=None, + params=None, help=None, epilog=None, short_help=None, + options_metavar='[OPTIONS]', add_help_option=True, + hidden=False, deprecated=False): + BaseCommand.__init__(self, name, context_settings) + #: the callback to execute when the command fires. This might be + #: `None` in which case nothing happens. + self.callback = callback + #: the list of parameters for this command in the order they + #: should show up in the help page and execute. Eager parameters + #: will automatically be handled before non eager ones. + self.params = params or [] + # if a form feed (page break) is found in the help text, truncate help + # text to the content preceding the first form feed + if help and '\f' in help: + help = help.split('\f', 1)[0] + self.help = help + self.epilog = epilog + self.options_metavar = options_metavar + self.short_help = short_help + self.add_help_option = add_help_option + self.hidden = hidden + self.deprecated = deprecated + + def get_usage(self, ctx): + formatter = ctx.make_formatter() + self.format_usage(ctx, formatter) + return formatter.getvalue().rstrip('\n') + + def get_params(self, ctx): + rv = self.params + help_option = self.get_help_option(ctx) + if help_option is not None: + rv = rv + [help_option] + return rv + + def format_usage(self, ctx, formatter): + """Writes the usage line into the formatter.""" + pieces = self.collect_usage_pieces(ctx) + formatter.write_usage(ctx.command_path, ' '.join(pieces)) + + def collect_usage_pieces(self, ctx): + """Returns all the pieces that go into the usage line and returns + it as a list of strings. + """ + rv = [self.options_metavar] + for param in self.get_params(ctx): + rv.extend(param.get_usage_pieces(ctx)) + return rv + + def get_help_option_names(self, ctx): + """Returns the names for the help option.""" + all_names = set(ctx.help_option_names) + for param in self.params: + all_names.difference_update(param.opts) + all_names.difference_update(param.secondary_opts) + return all_names + + def get_help_option(self, ctx): + """Returns the help option object.""" + help_options = self.get_help_option_names(ctx) + if not help_options or not self.add_help_option: + return + + def show_help(ctx, param, value): + if value and not ctx.resilient_parsing: + echo(ctx.get_help(), color=ctx.color) + ctx.exit() + return Option(help_options, is_flag=True, + is_eager=True, expose_value=False, + callback=show_help, + help='Show this message and exit.') + + def make_parser(self, ctx): + """Creates the underlying option parser for this command.""" + parser = OptionParser(ctx) + for param in self.get_params(ctx): + param.add_to_parser(parser, ctx) + return parser + + def get_help(self, ctx): + """Formats the help into a string and returns it. This creates a + formatter and will call into the following formatting methods: + """ + formatter = ctx.make_formatter() + self.format_help(ctx, formatter) + return formatter.getvalue().rstrip('\n') + + def get_short_help_str(self, limit=45): + """Gets short help for the command or makes it by shortening the long help string.""" + return self.short_help or self.help and make_default_short_help(self.help, limit) or '' + + def format_help(self, ctx, formatter): + """Writes the help into the formatter if it exists. + + This calls into the following methods: + + - :meth:`format_usage` + - :meth:`format_help_text` + - :meth:`format_options` + - :meth:`format_epilog` + """ + self.format_usage(ctx, formatter) + self.format_help_text(ctx, formatter) + self.format_options(ctx, formatter) + self.format_epilog(ctx, formatter) + + def format_help_text(self, ctx, formatter): + """Writes the help text to the formatter if it exists.""" + if self.help: + formatter.write_paragraph() + with formatter.indentation(): + help_text = self.help + if self.deprecated: + help_text += DEPRECATED_HELP_NOTICE + formatter.write_text(help_text) + elif self.deprecated: + formatter.write_paragraph() + with formatter.indentation(): + formatter.write_text(DEPRECATED_HELP_NOTICE) + + def format_options(self, ctx, formatter): + """Writes all the options into the formatter if they exist.""" + opts = [] + for param in self.get_params(ctx): + rv = param.get_help_record(ctx) + if rv is not None: + opts.append(rv) + + if opts: + with formatter.section('Options'): + formatter.write_dl(opts) + + def format_epilog(self, ctx, formatter): + """Writes the epilog into the formatter if it exists.""" + if self.epilog: + formatter.write_paragraph() + with formatter.indentation(): + formatter.write_text(self.epilog) + + def parse_args(self, ctx, args): + parser = self.make_parser(ctx) + opts, args, param_order = parser.parse_args(args=args) + + for param in iter_params_for_processing( + param_order, self.get_params(ctx)): + value, args = param.handle_parse_result(ctx, opts, args) + + if args and not ctx.allow_extra_args and not ctx.resilient_parsing: + ctx.fail('Got unexpected extra argument%s (%s)' + % (len(args) != 1 and 's' or '', + ' '.join(map(make_str, args)))) + + ctx.args = args + return args + + def invoke(self, ctx): + """Given a context, this invokes the attached callback (if it exists) + in the right way. + """ + _maybe_show_deprecated_notice(self) + if self.callback is not None: + return ctx.invoke(self.callback, **ctx.params) + + +class MultiCommand(Command): + """A multi command is the basic implementation of a command that + dispatches to subcommands. The most common version is the + :class:`Group`. + + :param invoke_without_command: this controls how the multi command itself + is invoked. By default it's only invoked + if a subcommand is provided. + :param no_args_is_help: this controls what happens if no arguments are + provided. This option is enabled by default if + `invoke_without_command` is disabled or disabled + if it's enabled. If enabled this will add + ``--help`` as argument if no arguments are + passed. + :param subcommand_metavar: the string that is used in the documentation + to indicate the subcommand place. + :param chain: if this is set to `True` chaining of multiple subcommands + is enabled. This restricts the form of commands in that + they cannot have optional arguments but it allows + multiple commands to be chained together. + :param result_callback: the result callback to attach to this multi + command. + """ + allow_extra_args = True + allow_interspersed_args = False + + def __init__(self, name=None, invoke_without_command=False, + no_args_is_help=None, subcommand_metavar=None, + chain=False, result_callback=None, **attrs): + Command.__init__(self, name, **attrs) + if no_args_is_help is None: + no_args_is_help = not invoke_without_command + self.no_args_is_help = no_args_is_help + self.invoke_without_command = invoke_without_command + if subcommand_metavar is None: + if chain: + subcommand_metavar = SUBCOMMANDS_METAVAR + else: + subcommand_metavar = SUBCOMMAND_METAVAR + self.subcommand_metavar = subcommand_metavar + self.chain = chain + #: The result callback that is stored. This can be set or + #: overridden with the :func:`resultcallback` decorator. + self.result_callback = result_callback + + if self.chain: + for param in self.params: + if isinstance(param, Argument) and not param.required: + raise RuntimeError('Multi commands in chain mode cannot ' + 'have optional arguments.') + + def collect_usage_pieces(self, ctx): + rv = Command.collect_usage_pieces(self, ctx) + rv.append(self.subcommand_metavar) + return rv + + def format_options(self, ctx, formatter): + Command.format_options(self, ctx, formatter) + self.format_commands(ctx, formatter) + + def resultcallback(self, replace=False): + """Adds a result callback to the chain command. By default if a + result callback is already registered this will chain them but + this can be disabled with the `replace` parameter. The result + callback is invoked with the return value of the subcommand + (or the list of return values from all subcommands if chaining + is enabled) as well as the parameters as they would be passed + to the main callback. + + Example:: + + @click.group() + @click.option('-i', '--input', default=23) + def cli(input): + return 42 + + @cli.resultcallback() + def process_result(result, input): + return result + input + + .. versionadded:: 3.0 + + :param replace: if set to `True` an already existing result + callback will be removed. + """ + def decorator(f): + old_callback = self.result_callback + if old_callback is None or replace: + self.result_callback = f + return f + def function(__value, *args, **kwargs): + return f(old_callback(__value, *args, **kwargs), + *args, **kwargs) + self.result_callback = rv = update_wrapper(function, f) + return rv + return decorator + + def format_commands(self, ctx, formatter): + """Extra format methods for multi methods that adds all the commands + after the options. + """ + commands = [] + for subcommand in self.list_commands(ctx): + cmd = self.get_command(ctx, subcommand) + # What is this, the tool lied about a command. Ignore it + if cmd is None: + continue + if cmd.hidden: + continue + + commands.append((subcommand, cmd)) + + # allow for 3 times the default spacing + if len(commands): + limit = formatter.width - 6 - max(len(cmd[0]) for cmd in commands) + + rows = [] + for subcommand, cmd in commands: + help = cmd.get_short_help_str(limit) + rows.append((subcommand, help)) + + if rows: + with formatter.section('Commands'): + formatter.write_dl(rows) + + def parse_args(self, ctx, args): + if not args and self.no_args_is_help and not ctx.resilient_parsing: + echo(ctx.get_help(), color=ctx.color) + ctx.exit() + + rest = Command.parse_args(self, ctx, args) + if self.chain: + ctx.protected_args = rest + ctx.args = [] + elif rest: + ctx.protected_args, ctx.args = rest[:1], rest[1:] + + return ctx.args + + def invoke(self, ctx): + def _process_result(value): + if self.result_callback is not None: + value = ctx.invoke(self.result_callback, value, + **ctx.params) + return value + + if not ctx.protected_args: + # If we are invoked without command the chain flag controls + # how this happens. If we are not in chain mode, the return + # value here is the return value of the command. + # If however we are in chain mode, the return value is the + # return value of the result processor invoked with an empty + # list (which means that no subcommand actually was executed). + if self.invoke_without_command: + if not self.chain: + return Command.invoke(self, ctx) + with ctx: + Command.invoke(self, ctx) + return _process_result([]) + ctx.fail('Missing command.') + + # Fetch args back out + args = ctx.protected_args + ctx.args + ctx.args = [] + ctx.protected_args = [] + + # If we're not in chain mode, we only allow the invocation of a + # single command but we also inform the current context about the + # name of the command to invoke. + if not self.chain: + # Make sure the context is entered so we do not clean up + # resources until the result processor has worked. + with ctx: + cmd_name, cmd, args = self.resolve_command(ctx, args) + ctx.invoked_subcommand = cmd_name + Command.invoke(self, ctx) + sub_ctx = cmd.make_context(cmd_name, args, parent=ctx) + with sub_ctx: + return _process_result(sub_ctx.command.invoke(sub_ctx)) + + # In chain mode we create the contexts step by step, but after the + # base command has been invoked. Because at that point we do not + # know the subcommands yet, the invoked subcommand attribute is + # set to ``*`` to inform the command that subcommands are executed + # but nothing else. + with ctx: + ctx.invoked_subcommand = args and '*' or None + Command.invoke(self, ctx) + + # Otherwise we make every single context and invoke them in a + # chain. In that case the return value to the result processor + # is the list of all invoked subcommand's results. + contexts = [] + while args: + cmd_name, cmd, args = self.resolve_command(ctx, args) + sub_ctx = cmd.make_context(cmd_name, args, parent=ctx, + allow_extra_args=True, + allow_interspersed_args=False) + contexts.append(sub_ctx) + args, sub_ctx.args = sub_ctx.args, [] + + rv = [] + for sub_ctx in contexts: + with sub_ctx: + rv.append(sub_ctx.command.invoke(sub_ctx)) + return _process_result(rv) + + def resolve_command(self, ctx, args): + cmd_name = make_str(args[0]) + original_cmd_name = cmd_name + + # Get the command + cmd = self.get_command(ctx, cmd_name) + + # If we can't find the command but there is a normalization + # function available, we try with that one. + if cmd is None and ctx.token_normalize_func is not None: + cmd_name = ctx.token_normalize_func(cmd_name) + cmd = self.get_command(ctx, cmd_name) + + # If we don't find the command we want to show an error message + # to the user that it was not provided. However, there is + # something else we should do: if the first argument looks like + # an option we want to kick off parsing again for arguments to + # resolve things like --help which now should go to the main + # place. + if cmd is None and not ctx.resilient_parsing: + if split_opt(cmd_name)[0]: + self.parse_args(ctx, ctx.args) + ctx.fail('No such command "%s".' % original_cmd_name) + + return cmd_name, cmd, args[1:] + + def get_command(self, ctx, cmd_name): + """Given a context and a command name, this returns a + :class:`Command` object if it exists or returns `None`. + """ + raise NotImplementedError() + + def list_commands(self, ctx): + """Returns a list of subcommand names in the order they should + appear. + """ + return [] + + +class Group(MultiCommand): + """A group allows a command to have subcommands attached. This is the + most common way to implement nesting in Click. + + :param commands: a dictionary of commands. + """ + + def __init__(self, name=None, commands=None, **attrs): + MultiCommand.__init__(self, name, **attrs) + #: the registered subcommands by their exported names. + self.commands = commands or {} + + def add_command(self, cmd, name=None): + """Registers another :class:`Command` with this group. If the name + is not provided, the name of the command is used. + """ + name = name or cmd.name + if name is None: + raise TypeError('Command has no name.') + _check_multicommand(self, name, cmd, register=True) + self.commands[name] = cmd + + def command(self, *args, **kwargs): + """A shortcut decorator for declaring and attaching a command to + the group. This takes the same arguments as :func:`command` but + immediately registers the created command with this instance by + calling into :meth:`add_command`. + """ + def decorator(f): + cmd = command(*args, **kwargs)(f) + self.add_command(cmd) + return cmd + return decorator + + def group(self, *args, **kwargs): + """A shortcut decorator for declaring and attaching a group to + the group. This takes the same arguments as :func:`group` but + immediately registers the created command with this instance by + calling into :meth:`add_command`. + """ + def decorator(f): + cmd = group(*args, **kwargs)(f) + self.add_command(cmd) + return cmd + return decorator + + def get_command(self, ctx, cmd_name): + return self.commands.get(cmd_name) + + def list_commands(self, ctx): + return sorted(self.commands) + + +class CommandCollection(MultiCommand): + """A command collection is a multi command that merges multiple multi + commands together into one. This is a straightforward implementation + that accepts a list of different multi commands as sources and + provides all the commands for each of them. + """ + + def __init__(self, name=None, sources=None, **attrs): + MultiCommand.__init__(self, name, **attrs) + #: The list of registered multi commands. + self.sources = sources or [] + + def add_source(self, multi_cmd): + """Adds a new multi command to the chain dispatcher.""" + self.sources.append(multi_cmd) + + def get_command(self, ctx, cmd_name): + for source in self.sources: + rv = source.get_command(ctx, cmd_name) + if rv is not None: + if self.chain: + _check_multicommand(self, cmd_name, rv) + return rv + + def list_commands(self, ctx): + rv = set() + for source in self.sources: + rv.update(source.list_commands(ctx)) + return sorted(rv) + + +class Parameter(object): + r"""A parameter to a command comes in two versions: they are either + :class:`Option`\s or :class:`Argument`\s. Other subclasses are currently + not supported by design as some of the internals for parsing are + intentionally not finalized. + + Some settings are supported by both options and arguments. + + .. versionchanged:: 2.0 + Changed signature for parameter callback to also be passed the + parameter. In Click 2.0, the old callback format will still work, + but it will raise a warning to give you change to migrate the + code easier. + + :param param_decls: the parameter declarations for this option or + argument. This is a list of flags or argument + names. + :param type: the type that should be used. Either a :class:`ParamType` + or a Python type. The later is converted into the former + automatically if supported. + :param required: controls if this is optional or not. + :param default: the default value if omitted. This can also be a callable, + in which case it's invoked when the default is needed + without any arguments. + :param callback: a callback that should be executed after the parameter + was matched. This is called as ``fn(ctx, param, + value)`` and needs to return the value. Before Click + 2.0, the signature was ``(ctx, value)``. + :param nargs: the number of arguments to match. If not ``1`` the return + value is a tuple instead of single value. The default for + nargs is ``1`` (except if the type is a tuple, then it's + the arity of the tuple). + :param metavar: how the value is represented in the help page. + :param expose_value: if this is `True` then the value is passed onwards + to the command callback and stored on the context, + otherwise it's skipped. + :param is_eager: eager values are processed before non eager ones. This + should not be set for arguments or it will inverse the + order of processing. + :param envvar: a string or list of strings that are environment variables + that should be checked. + """ + param_type_name = 'parameter' + + def __init__(self, param_decls=None, type=None, required=False, + default=None, callback=None, nargs=None, metavar=None, + expose_value=True, is_eager=False, envvar=None, + autocompletion=None): + self.name, self.opts, self.secondary_opts = \ + self._parse_decls(param_decls or (), expose_value) + + self.type = convert_type(type, default) + + # Default nargs to what the type tells us if we have that + # information available. + if nargs is None: + if self.type.is_composite: + nargs = self.type.arity + else: + nargs = 1 + + self.required = required + self.callback = callback + self.nargs = nargs + self.multiple = False + self.expose_value = expose_value + self.default = default + self.is_eager = is_eager + self.metavar = metavar + self.envvar = envvar + self.autocompletion = autocompletion + + @property + def human_readable_name(self): + """Returns the human readable name of this parameter. This is the + same as the name for options, but the metavar for arguments. + """ + return self.name + + def make_metavar(self): + if self.metavar is not None: + return self.metavar + metavar = self.type.get_metavar(self) + if metavar is None: + metavar = self.type.name.upper() + if self.nargs != 1: + metavar += '...' + return metavar + + def get_default(self, ctx): + """Given a context variable this calculates the default value.""" + # Otherwise go with the regular default. + if callable(self.default): + rv = self.default() + else: + rv = self.default + return self.type_cast_value(ctx, rv) + + def add_to_parser(self, parser, ctx): + pass + + def consume_value(self, ctx, opts): + value = opts.get(self.name) + if value is None: + value = self.value_from_envvar(ctx) + if value is None: + value = ctx.lookup_default(self.name) + return value + + def type_cast_value(self, ctx, value): + """Given a value this runs it properly through the type system. + This automatically handles things like `nargs` and `multiple` as + well as composite types. + """ + if self.type.is_composite: + if self.nargs <= 1: + raise TypeError('Attempted to invoke composite type ' + 'but nargs has been set to %s. This is ' + 'not supported; nargs needs to be set to ' + 'a fixed value > 1.' % self.nargs) + if self.multiple: + return tuple(self.type(x or (), self, ctx) for x in value or ()) + return self.type(value or (), self, ctx) + + def _convert(value, level): + if level == 0: + return self.type(value, self, ctx) + return tuple(_convert(x, level - 1) for x in value or ()) + return _convert(value, (self.nargs != 1) + bool(self.multiple)) + + def process_value(self, ctx, value): + """Given a value and context this runs the logic to convert the + value as necessary. + """ + # If the value we were given is None we do nothing. This way + # code that calls this can easily figure out if something was + # not provided. Otherwise it would be converted into an empty + # tuple for multiple invocations which is inconvenient. + if value is not None: + return self.type_cast_value(ctx, value) + + def value_is_missing(self, value): + if value is None: + return True + if (self.nargs != 1 or self.multiple) and value == (): + return True + return False + + def full_process_value(self, ctx, value): + value = self.process_value(ctx, value) + + if value is None and not ctx.resilient_parsing: + value = self.get_default(ctx) + + if self.required and self.value_is_missing(value): + raise MissingParameter(ctx=ctx, param=self) + + return value + + def resolve_envvar_value(self, ctx): + if self.envvar is None: + return + if isinstance(self.envvar, (tuple, list)): + for envvar in self.envvar: + rv = os.environ.get(envvar) + if rv is not None: + return rv + else: + return os.environ.get(self.envvar) + + def value_from_envvar(self, ctx): + rv = self.resolve_envvar_value(ctx) + if rv is not None and self.nargs != 1: + rv = self.type.split_envvar_value(rv) + return rv + + def handle_parse_result(self, ctx, opts, args): + with augment_usage_errors(ctx, param=self): + value = self.consume_value(ctx, opts) + try: + value = self.full_process_value(ctx, value) + except Exception: + if not ctx.resilient_parsing: + raise + value = None + if self.callback is not None: + try: + value = invoke_param_callback( + self.callback, ctx, self, value) + except Exception: + if not ctx.resilient_parsing: + raise + + if self.expose_value: + ctx.params[self.name] = value + return value, args + + def get_help_record(self, ctx): + pass + + def get_usage_pieces(self, ctx): + return [] + + def get_error_hint(self, ctx): + """Get a stringified version of the param for use in error messages to + indicate which param caused the error. + """ + hint_list = self.opts or [self.human_readable_name] + return ' / '.join('"%s"' % x for x in hint_list) + + +class Option(Parameter): + """Options are usually optional values on the command line and + have some extra features that arguments don't have. + + All other parameters are passed onwards to the parameter constructor. + + :param show_default: controls if the default value should be shown on the + help page. Normally, defaults are not shown. If this + value is a string, it shows the string instead of the + value. This is particularly useful for dynamic options. + :param show_envvar: controls if an environment variable should be shown on + the help page. Normally, environment variables + are not shown. + :param prompt: if set to `True` or a non empty string then the user will be + prompted for input. If set to `True` the prompt will be the + option name capitalized. + :param confirmation_prompt: if set then the value will need to be confirmed + if it was prompted for. + :param hide_input: if this is `True` then the input on the prompt will be + hidden from the user. This is useful for password + input. + :param is_flag: forces this option to act as a flag. The default is + auto detection. + :param flag_value: which value should be used for this flag if it's + enabled. This is set to a boolean automatically if + the option string contains a slash to mark two options. + :param multiple: if this is set to `True` then the argument is accepted + multiple times and recorded. This is similar to ``nargs`` + in how it works but supports arbitrary number of + arguments. + :param count: this flag makes an option increment an integer. + :param allow_from_autoenv: if this is enabled then the value of this + parameter will be pulled from an environment + variable in case a prefix is defined on the + context. + :param help: the help string. + :param hidden: hide this option from help outputs. + """ + param_type_name = 'option' + + def __init__(self, param_decls=None, show_default=False, + prompt=False, confirmation_prompt=False, + hide_input=False, is_flag=None, flag_value=None, + multiple=False, count=False, allow_from_autoenv=True, + type=None, help=None, hidden=False, show_choices=True, + show_envvar=False, **attrs): + default_is_missing = attrs.get('default', _missing) is _missing + Parameter.__init__(self, param_decls, type=type, **attrs) + + if prompt is True: + prompt_text = self.name.replace('_', ' ').capitalize() + elif prompt is False: + prompt_text = None + else: + prompt_text = prompt + self.prompt = prompt_text + self.confirmation_prompt = confirmation_prompt + self.hide_input = hide_input + self.hidden = hidden + + # Flags + if is_flag is None: + if flag_value is not None: + is_flag = True + else: + is_flag = bool(self.secondary_opts) + if is_flag and default_is_missing: + self.default = False + if flag_value is None: + flag_value = not self.default + self.is_flag = is_flag + self.flag_value = flag_value + if self.is_flag and isinstance(self.flag_value, bool) \ + and type is None: + self.type = BOOL + self.is_bool_flag = True + else: + self.is_bool_flag = False + + # Counting + self.count = count + if count: + if type is None: + self.type = IntRange(min=0) + if default_is_missing: + self.default = 0 + + self.multiple = multiple + self.allow_from_autoenv = allow_from_autoenv + self.help = help + self.show_default = show_default + self.show_choices = show_choices + self.show_envvar = show_envvar + + # Sanity check for stuff we don't support + if __debug__: + if self.nargs < 0: + raise TypeError('Options cannot have nargs < 0') + if self.prompt and self.is_flag and not self.is_bool_flag: + raise TypeError('Cannot prompt for flags that are not bools.') + if not self.is_bool_flag and self.secondary_opts: + raise TypeError('Got secondary option for non boolean flag.') + if self.is_bool_flag and self.hide_input \ + and self.prompt is not None: + raise TypeError('Hidden input does not work with boolean ' + 'flag prompts.') + if self.count: + if self.multiple: + raise TypeError('Options cannot be multiple and count ' + 'at the same time.') + elif self.is_flag: + raise TypeError('Options cannot be count and flags at ' + 'the same time.') + + def _parse_decls(self, decls, expose_value): + opts = [] + secondary_opts = [] + name = None + possible_names = [] + + for decl in decls: + if isidentifier(decl): + if name is not None: + raise TypeError('Name defined twice') + name = decl + else: + split_char = decl[:1] == '/' and ';' or '/' + if split_char in decl: + first, second = decl.split(split_char, 1) + first = first.rstrip() + if first: + possible_names.append(split_opt(first)) + opts.append(first) + second = second.lstrip() + if second: + secondary_opts.append(second.lstrip()) + else: + possible_names.append(split_opt(decl)) + opts.append(decl) + + if name is None and possible_names: + possible_names.sort(key=lambda x: -len(x[0])) # group long options first + name = possible_names[0][1].replace('-', '_').lower() + if not isidentifier(name): + name = None + + if name is None: + if not expose_value: + return None, opts, secondary_opts + raise TypeError('Could not determine name for option') + + if not opts and not secondary_opts: + raise TypeError('No options defined but a name was passed (%s). ' + 'Did you mean to declare an argument instead ' + 'of an option?' % name) + + return name, opts, secondary_opts + + def add_to_parser(self, parser, ctx): + kwargs = { + 'dest': self.name, + 'nargs': self.nargs, + 'obj': self, + } + + if self.multiple: + action = 'append' + elif self.count: + action = 'count' + else: + action = 'store' + + if self.is_flag: + kwargs.pop('nargs', None) + if self.is_bool_flag and self.secondary_opts: + parser.add_option(self.opts, action=action + '_const', + const=True, **kwargs) + parser.add_option(self.secondary_opts, action=action + + '_const', const=False, **kwargs) + else: + parser.add_option(self.opts, action=action + '_const', + const=self.flag_value, + **kwargs) + else: + kwargs['action'] = action + parser.add_option(self.opts, **kwargs) + + def get_help_record(self, ctx): + if self.hidden: + return + any_prefix_is_slash = [] + + def _write_opts(opts): + rv, any_slashes = join_options(opts) + if any_slashes: + any_prefix_is_slash[:] = [True] + if not self.is_flag and not self.count: + rv += ' ' + self.make_metavar() + return rv + + rv = [_write_opts(self.opts)] + if self.secondary_opts: + rv.append(_write_opts(self.secondary_opts)) + + help = self.help or '' + extra = [] + if self.show_envvar: + envvar = self.envvar + if envvar is None: + if self.allow_from_autoenv and \ + ctx.auto_envvar_prefix is not None: + envvar = '%s_%s' % (ctx.auto_envvar_prefix, self.name.upper()) + if envvar is not None: + extra.append('env var: %s' % ( + ', '.join('%s' % d for d in envvar) + if isinstance(envvar, (list, tuple)) + else envvar, )) + if self.default is not None and self.show_default: + if isinstance(self.show_default, string_types): + default_string = '({})'.format(self.show_default) + elif isinstance(self.default, (list, tuple)): + default_string = ', '.join('%s' % d for d in self.default) + elif inspect.isfunction(self.default): + default_string = "(dynamic)" + else: + default_string = self.default + extra.append('default: {}'.format(default_string)) + + if self.required: + extra.append('required') + if extra: + help = '%s[%s]' % (help and help + ' ' or '', '; '.join(extra)) + + return ((any_prefix_is_slash and '; ' or ' / ').join(rv), help) + + def get_default(self, ctx): + # If we're a non boolean flag out default is more complex because + # we need to look at all flags in the same group to figure out + # if we're the the default one in which case we return the flag + # value as default. + if self.is_flag and not self.is_bool_flag: + for param in ctx.command.params: + if param.name == self.name and param.default: + return param.flag_value + return None + return Parameter.get_default(self, ctx) + + def prompt_for_value(self, ctx): + """This is an alternative flow that can be activated in the full + value processing if a value does not exist. It will prompt the + user until a valid value exists and then returns the processed + value as result. + """ + # Calculate the default before prompting anything to be stable. + default = self.get_default(ctx) + + # If this is a prompt for a flag we need to handle this + # differently. + if self.is_bool_flag: + return confirm(self.prompt, default) + + return prompt(self.prompt, default=default, type=self.type, + hide_input=self.hide_input, show_choices=self.show_choices, + confirmation_prompt=self.confirmation_prompt, + value_proc=lambda x: self.process_value(ctx, x)) + + def resolve_envvar_value(self, ctx): + rv = Parameter.resolve_envvar_value(self, ctx) + if rv is not None: + return rv + if self.allow_from_autoenv and \ + ctx.auto_envvar_prefix is not None: + envvar = '%s_%s' % (ctx.auto_envvar_prefix, self.name.upper()) + return os.environ.get(envvar) + + def value_from_envvar(self, ctx): + rv = self.resolve_envvar_value(ctx) + if rv is None: + return None + value_depth = (self.nargs != 1) + bool(self.multiple) + if value_depth > 0 and rv is not None: + rv = self.type.split_envvar_value(rv) + if self.multiple and self.nargs != 1: + rv = batch(rv, self.nargs) + return rv + + def full_process_value(self, ctx, value): + if value is None and self.prompt is not None \ + and not ctx.resilient_parsing: + return self.prompt_for_value(ctx) + return Parameter.full_process_value(self, ctx, value) + + +class Argument(Parameter): + """Arguments are positional parameters to a command. They generally + provide fewer features than options but can have infinite ``nargs`` + and are required by default. + + All parameters are passed onwards to the parameter constructor. + """ + param_type_name = 'argument' + + def __init__(self, param_decls, required=None, **attrs): + if required is None: + if attrs.get('default') is not None: + required = False + else: + required = attrs.get('nargs', 1) > 0 + Parameter.__init__(self, param_decls, required=required, **attrs) + if self.default is not None and self.nargs < 0: + raise TypeError('nargs=-1 in combination with a default value ' + 'is not supported.') + + @property + def human_readable_name(self): + if self.metavar is not None: + return self.metavar + return self.name.upper() + + def make_metavar(self): + if self.metavar is not None: + return self.metavar + var = self.type.get_metavar(self) + if not var: + var = self.name.upper() + if not self.required: + var = '[%s]' % var + if self.nargs != 1: + var += '...' + return var + + def _parse_decls(self, decls, expose_value): + if not decls: + if not expose_value: + return None, [], [] + raise TypeError('Could not determine name for argument') + if len(decls) == 1: + name = arg = decls[0] + name = name.replace('-', '_').lower() + else: + raise TypeError('Arguments take exactly one ' + 'parameter declaration, got %d' % len(decls)) + return name, [arg], [] + + def get_usage_pieces(self, ctx): + return [self.make_metavar()] + + def get_error_hint(self, ctx): + return '"%s"' % self.make_metavar() + + def add_to_parser(self, parser, ctx): + parser.add_argument(dest=self.name, nargs=self.nargs, + obj=self) + + +# Circular dependency between decorators and core +from .decorators import command, group diff --git a/env/Lib/site-packages/click/decorators.py b/env/Lib/site-packages/click/decorators.py new file mode 100644 index 0000000..c57c530 --- /dev/null +++ b/env/Lib/site-packages/click/decorators.py @@ -0,0 +1,311 @@ +import sys +import inspect + +from functools import update_wrapper + +from ._compat import iteritems +from ._unicodefun import _check_for_unicode_literals +from .utils import echo +from .globals import get_current_context + + +def pass_context(f): + """Marks a callback as wanting to receive the current context + object as first argument. + """ + def new_func(*args, **kwargs): + return f(get_current_context(), *args, **kwargs) + return update_wrapper(new_func, f) + + +def pass_obj(f): + """Similar to :func:`pass_context`, but only pass the object on the + context onwards (:attr:`Context.obj`). This is useful if that object + represents the state of a nested system. + """ + def new_func(*args, **kwargs): + return f(get_current_context().obj, *args, **kwargs) + return update_wrapper(new_func, f) + + +def make_pass_decorator(object_type, ensure=False): + """Given an object type this creates a decorator that will work + similar to :func:`pass_obj` but instead of passing the object of the + current context, it will find the innermost context of type + :func:`object_type`. + + This generates a decorator that works roughly like this:: + + from functools import update_wrapper + + def decorator(f): + @pass_context + def new_func(ctx, *args, **kwargs): + obj = ctx.find_object(object_type) + return ctx.invoke(f, obj, *args, **kwargs) + return update_wrapper(new_func, f) + return decorator + + :param object_type: the type of the object to pass. + :param ensure: if set to `True`, a new object will be created and + remembered on the context if it's not there yet. + """ + def decorator(f): + def new_func(*args, **kwargs): + ctx = get_current_context() + if ensure: + obj = ctx.ensure_object(object_type) + else: + obj = ctx.find_object(object_type) + if obj is None: + raise RuntimeError('Managed to invoke callback without a ' + 'context object of type %r existing' + % object_type.__name__) + return ctx.invoke(f, obj, *args, **kwargs) + return update_wrapper(new_func, f) + return decorator + + +def _make_command(f, name, attrs, cls): + if isinstance(f, Command): + raise TypeError('Attempted to convert a callback into a ' + 'command twice.') + try: + params = f.__click_params__ + params.reverse() + del f.__click_params__ + except AttributeError: + params = [] + help = attrs.get('help') + if help is None: + help = inspect.getdoc(f) + if isinstance(help, bytes): + help = help.decode('utf-8') + else: + help = inspect.cleandoc(help) + attrs['help'] = help + _check_for_unicode_literals() + return cls(name=name or f.__name__.lower().replace('_', '-'), + callback=f, params=params, **attrs) + + +def command(name=None, cls=None, **attrs): + r"""Creates a new :class:`Command` and uses the decorated function as + callback. This will also automatically attach all decorated + :func:`option`\s and :func:`argument`\s as parameters to the command. + + The name of the command defaults to the name of the function. If you + want to change that, you can pass the intended name as the first + argument. + + All keyword arguments are forwarded to the underlying command class. + + Once decorated the function turns into a :class:`Command` instance + that can be invoked as a command line utility or be attached to a + command :class:`Group`. + + :param name: the name of the command. This defaults to the function + name with underscores replaced by dashes. + :param cls: the command class to instantiate. This defaults to + :class:`Command`. + """ + if cls is None: + cls = Command + def decorator(f): + cmd = _make_command(f, name, attrs, cls) + cmd.__doc__ = f.__doc__ + return cmd + return decorator + + +def group(name=None, **attrs): + """Creates a new :class:`Group` with a function as callback. This + works otherwise the same as :func:`command` just that the `cls` + parameter is set to :class:`Group`. + """ + attrs.setdefault('cls', Group) + return command(name, **attrs) + + +def _param_memo(f, param): + if isinstance(f, Command): + f.params.append(param) + else: + if not hasattr(f, '__click_params__'): + f.__click_params__ = [] + f.__click_params__.append(param) + + +def argument(*param_decls, **attrs): + """Attaches an argument to the command. All positional arguments are + passed as parameter declarations to :class:`Argument`; all keyword + arguments are forwarded unchanged (except ``cls``). + This is equivalent to creating an :class:`Argument` instance manually + and attaching it to the :attr:`Command.params` list. + + :param cls: the argument class to instantiate. This defaults to + :class:`Argument`. + """ + def decorator(f): + ArgumentClass = attrs.pop('cls', Argument) + _param_memo(f, ArgumentClass(param_decls, **attrs)) + return f + return decorator + + +def option(*param_decls, **attrs): + """Attaches an option to the command. All positional arguments are + passed as parameter declarations to :class:`Option`; all keyword + arguments are forwarded unchanged (except ``cls``). + This is equivalent to creating an :class:`Option` instance manually + and attaching it to the :attr:`Command.params` list. + + :param cls: the option class to instantiate. This defaults to + :class:`Option`. + """ + def decorator(f): + # Issue 926, copy attrs, so pre-defined options can re-use the same cls= + option_attrs = attrs.copy() + + if 'help' in option_attrs: + option_attrs['help'] = inspect.cleandoc(option_attrs['help']) + OptionClass = option_attrs.pop('cls', Option) + _param_memo(f, OptionClass(param_decls, **option_attrs)) + return f + return decorator + + +def confirmation_option(*param_decls, **attrs): + """Shortcut for confirmation prompts that can be ignored by passing + ``--yes`` as parameter. + + This is equivalent to decorating a function with :func:`option` with + the following parameters:: + + def callback(ctx, param, value): + if not value: + ctx.abort() + + @click.command() + @click.option('--yes', is_flag=True, callback=callback, + expose_value=False, prompt='Do you want to continue?') + def dropdb(): + pass + """ + def decorator(f): + def callback(ctx, param, value): + if not value: + ctx.abort() + attrs.setdefault('is_flag', True) + attrs.setdefault('callback', callback) + attrs.setdefault('expose_value', False) + attrs.setdefault('prompt', 'Do you want to continue?') + attrs.setdefault('help', 'Confirm the action without prompting.') + return option(*(param_decls or ('--yes',)), **attrs)(f) + return decorator + + +def password_option(*param_decls, **attrs): + """Shortcut for password prompts. + + This is equivalent to decorating a function with :func:`option` with + the following parameters:: + + @click.command() + @click.option('--password', prompt=True, confirmation_prompt=True, + hide_input=True) + def changeadmin(password): + pass + """ + def decorator(f): + attrs.setdefault('prompt', True) + attrs.setdefault('confirmation_prompt', True) + attrs.setdefault('hide_input', True) + return option(*(param_decls or ('--password',)), **attrs)(f) + return decorator + + +def version_option(version=None, *param_decls, **attrs): + """Adds a ``--version`` option which immediately ends the program + printing out the version number. This is implemented as an eager + option that prints the version and exits the program in the callback. + + :param version: the version number to show. If not provided Click + attempts an auto discovery via setuptools. + :param prog_name: the name of the program (defaults to autodetection) + :param message: custom message to show instead of the default + (``'%(prog)s, version %(version)s'``) + :param others: everything else is forwarded to :func:`option`. + """ + if version is None: + if hasattr(sys, '_getframe'): + module = sys._getframe(1).f_globals.get('__name__') + else: + module = '' + + def decorator(f): + prog_name = attrs.pop('prog_name', None) + message = attrs.pop('message', '%(prog)s, version %(version)s') + + def callback(ctx, param, value): + if not value or ctx.resilient_parsing: + return + prog = prog_name + if prog is None: + prog = ctx.find_root().info_name + ver = version + if ver is None: + try: + import pkg_resources + except ImportError: + pass + else: + for dist in pkg_resources.working_set: + scripts = dist.get_entry_map().get('console_scripts') or {} + for script_name, entry_point in iteritems(scripts): + if entry_point.module_name == module: + ver = dist.version + break + if ver is None: + raise RuntimeError('Could not determine version') + echo(message % { + 'prog': prog, + 'version': ver, + }, color=ctx.color) + ctx.exit() + + attrs.setdefault('is_flag', True) + attrs.setdefault('expose_value', False) + attrs.setdefault('is_eager', True) + attrs.setdefault('help', 'Show the version and exit.') + attrs['callback'] = callback + return option(*(param_decls or ('--version',)), **attrs)(f) + return decorator + + +def help_option(*param_decls, **attrs): + """Adds a ``--help`` option which immediately ends the program + printing out the help page. This is usually unnecessary to add as + this is added by default to all commands unless suppressed. + + Like :func:`version_option`, this is implemented as eager option that + prints in the callback and exits. + + All arguments are forwarded to :func:`option`. + """ + def decorator(f): + def callback(ctx, param, value): + if value and not ctx.resilient_parsing: + echo(ctx.get_help(), color=ctx.color) + ctx.exit() + attrs.setdefault('is_flag', True) + attrs.setdefault('expose_value', False) + attrs.setdefault('help', 'Show this message and exit.') + attrs.setdefault('is_eager', True) + attrs['callback'] = callback + return option(*(param_decls or ('--help',)), **attrs)(f) + return decorator + + +# Circular dependencies between core and decorators +from .core import Command, Group, Argument, Option diff --git a/env/Lib/site-packages/click/exceptions.py b/env/Lib/site-packages/click/exceptions.py new file mode 100644 index 0000000..6fa1765 --- /dev/null +++ b/env/Lib/site-packages/click/exceptions.py @@ -0,0 +1,235 @@ +from ._compat import PY2, filename_to_ui, get_text_stderr +from .utils import echo + + +def _join_param_hints(param_hint): + if isinstance(param_hint, (tuple, list)): + return ' / '.join('"%s"' % x for x in param_hint) + return param_hint + + +class ClickException(Exception): + """An exception that Click can handle and show to the user.""" + + #: The exit code for this exception + exit_code = 1 + + def __init__(self, message): + ctor_msg = message + if PY2: + if ctor_msg is not None: + ctor_msg = ctor_msg.encode('utf-8') + Exception.__init__(self, ctor_msg) + self.message = message + + def format_message(self): + return self.message + + def __str__(self): + return self.message + + if PY2: + __unicode__ = __str__ + + def __str__(self): + return self.message.encode('utf-8') + + def show(self, file=None): + if file is None: + file = get_text_stderr() + echo('Error: %s' % self.format_message(), file=file) + + +class UsageError(ClickException): + """An internal exception that signals a usage error. This typically + aborts any further handling. + + :param message: the error message to display. + :param ctx: optionally the context that caused this error. Click will + fill in the context automatically in some situations. + """ + exit_code = 2 + + def __init__(self, message, ctx=None): + ClickException.__init__(self, message) + self.ctx = ctx + self.cmd = self.ctx and self.ctx.command or None + + def show(self, file=None): + if file is None: + file = get_text_stderr() + color = None + hint = '' + if (self.cmd is not None and + self.cmd.get_help_option(self.ctx) is not None): + hint = ('Try "%s %s" for help.\n' + % (self.ctx.command_path, self.ctx.help_option_names[0])) + if self.ctx is not None: + color = self.ctx.color + echo(self.ctx.get_usage() + '\n%s' % hint, file=file, color=color) + echo('Error: %s' % self.format_message(), file=file, color=color) + + +class BadParameter(UsageError): + """An exception that formats out a standardized error message for a + bad parameter. This is useful when thrown from a callback or type as + Click will attach contextual information to it (for instance, which + parameter it is). + + .. versionadded:: 2.0 + + :param param: the parameter object that caused this error. This can + be left out, and Click will attach this info itself + if possible. + :param param_hint: a string that shows up as parameter name. This + can be used as alternative to `param` in cases + where custom validation should happen. If it is + a string it's used as such, if it's a list then + each item is quoted and separated. + """ + + def __init__(self, message, ctx=None, param=None, + param_hint=None): + UsageError.__init__(self, message, ctx) + self.param = param + self.param_hint = param_hint + + def format_message(self): + if self.param_hint is not None: + param_hint = self.param_hint + elif self.param is not None: + param_hint = self.param.get_error_hint(self.ctx) + else: + return 'Invalid value: %s' % self.message + param_hint = _join_param_hints(param_hint) + + return 'Invalid value for %s: %s' % (param_hint, self.message) + + +class MissingParameter(BadParameter): + """Raised if click required an option or argument but it was not + provided when invoking the script. + + .. versionadded:: 4.0 + + :param param_type: a string that indicates the type of the parameter. + The default is to inherit the parameter type from + the given `param`. Valid values are ``'parameter'``, + ``'option'`` or ``'argument'``. + """ + + def __init__(self, message=None, ctx=None, param=None, + param_hint=None, param_type=None): + BadParameter.__init__(self, message, ctx, param, param_hint) + self.param_type = param_type + + def format_message(self): + if self.param_hint is not None: + param_hint = self.param_hint + elif self.param is not None: + param_hint = self.param.get_error_hint(self.ctx) + else: + param_hint = None + param_hint = _join_param_hints(param_hint) + + param_type = self.param_type + if param_type is None and self.param is not None: + param_type = self.param.param_type_name + + msg = self.message + if self.param is not None: + msg_extra = self.param.type.get_missing_message(self.param) + if msg_extra: + if msg: + msg += '. ' + msg_extra + else: + msg = msg_extra + + return 'Missing %s%s%s%s' % ( + param_type, + param_hint and ' %s' % param_hint or '', + msg and '. ' or '.', + msg or '', + ) + + +class NoSuchOption(UsageError): + """Raised if click attempted to handle an option that does not + exist. + + .. versionadded:: 4.0 + """ + + def __init__(self, option_name, message=None, possibilities=None, + ctx=None): + if message is None: + message = 'no such option: %s' % option_name + UsageError.__init__(self, message, ctx) + self.option_name = option_name + self.possibilities = possibilities + + def format_message(self): + bits = [self.message] + if self.possibilities: + if len(self.possibilities) == 1: + bits.append('Did you mean %s?' % self.possibilities[0]) + else: + possibilities = sorted(self.possibilities) + bits.append('(Possible options: %s)' % ', '.join(possibilities)) + return ' '.join(bits) + + +class BadOptionUsage(UsageError): + """Raised if an option is generally supplied but the use of the option + was incorrect. This is for instance raised if the number of arguments + for an option is not correct. + + .. versionadded:: 4.0 + + :param option_name: the name of the option being used incorrectly. + """ + + def __init__(self, option_name, message, ctx=None): + UsageError.__init__(self, message, ctx) + self.option_name = option_name + + +class BadArgumentUsage(UsageError): + """Raised if an argument is generally supplied but the use of the argument + was incorrect. This is for instance raised if the number of values + for an argument is not correct. + + .. versionadded:: 6.0 + """ + + def __init__(self, message, ctx=None): + UsageError.__init__(self, message, ctx) + + +class FileError(ClickException): + """Raised if a file cannot be opened.""" + + def __init__(self, filename, hint=None): + ui_filename = filename_to_ui(filename) + if hint is None: + hint = 'unknown error' + ClickException.__init__(self, hint) + self.ui_filename = ui_filename + self.filename = filename + + def format_message(self): + return 'Could not open file %s: %s' % (self.ui_filename, self.message) + + +class Abort(RuntimeError): + """An internal signalling exception that signals Click to abort.""" + + +class Exit(RuntimeError): + """An exception that indicates that the application should exit with some + status code. + + :param code: the status code to exit with. + """ + def __init__(self, code=0): + self.exit_code = code diff --git a/env/Lib/site-packages/click/formatting.py b/env/Lib/site-packages/click/formatting.py new file mode 100644 index 0000000..a3d6a4d --- /dev/null +++ b/env/Lib/site-packages/click/formatting.py @@ -0,0 +1,256 @@ +from contextlib import contextmanager +from .termui import get_terminal_size +from .parser import split_opt +from ._compat import term_len + + +# Can force a width. This is used by the test system +FORCED_WIDTH = None + + +def measure_table(rows): + widths = {} + for row in rows: + for idx, col in enumerate(row): + widths[idx] = max(widths.get(idx, 0), term_len(col)) + return tuple(y for x, y in sorted(widths.items())) + + +def iter_rows(rows, col_count): + for row in rows: + row = tuple(row) + yield row + ('',) * (col_count - len(row)) + + +def wrap_text(text, width=78, initial_indent='', subsequent_indent='', + preserve_paragraphs=False): + """A helper function that intelligently wraps text. By default, it + assumes that it operates on a single paragraph of text but if the + `preserve_paragraphs` parameter is provided it will intelligently + handle paragraphs (defined by two empty lines). + + If paragraphs are handled, a paragraph can be prefixed with an empty + line containing the ``\\b`` character (``\\x08``) to indicate that + no rewrapping should happen in that block. + + :param text: the text that should be rewrapped. + :param width: the maximum width for the text. + :param initial_indent: the initial indent that should be placed on the + first line as a string. + :param subsequent_indent: the indent string that should be placed on + each consecutive line. + :param preserve_paragraphs: if this flag is set then the wrapping will + intelligently handle paragraphs. + """ + from ._textwrap import TextWrapper + text = text.expandtabs() + wrapper = TextWrapper(width, initial_indent=initial_indent, + subsequent_indent=subsequent_indent, + replace_whitespace=False) + if not preserve_paragraphs: + return wrapper.fill(text) + + p = [] + buf = [] + indent = None + + def _flush_par(): + if not buf: + return + if buf[0].strip() == '\b': + p.append((indent or 0, True, '\n'.join(buf[1:]))) + else: + p.append((indent or 0, False, ' '.join(buf))) + del buf[:] + + for line in text.splitlines(): + if not line: + _flush_par() + indent = None + else: + if indent is None: + orig_len = term_len(line) + line = line.lstrip() + indent = orig_len - term_len(line) + buf.append(line) + _flush_par() + + rv = [] + for indent, raw, text in p: + with wrapper.extra_indent(' ' * indent): + if raw: + rv.append(wrapper.indent_only(text)) + else: + rv.append(wrapper.fill(text)) + + return '\n\n'.join(rv) + + +class HelpFormatter(object): + """This class helps with formatting text-based help pages. It's + usually just needed for very special internal cases, but it's also + exposed so that developers can write their own fancy outputs. + + At present, it always writes into memory. + + :param indent_increment: the additional increment for each level. + :param width: the width for the text. This defaults to the terminal + width clamped to a maximum of 78. + """ + + def __init__(self, indent_increment=2, width=None, max_width=None): + self.indent_increment = indent_increment + if max_width is None: + max_width = 80 + if width is None: + width = FORCED_WIDTH + if width is None: + width = max(min(get_terminal_size()[0], max_width) - 2, 50) + self.width = width + self.current_indent = 0 + self.buffer = [] + + def write(self, string): + """Writes a unicode string into the internal buffer.""" + self.buffer.append(string) + + def indent(self): + """Increases the indentation.""" + self.current_indent += self.indent_increment + + def dedent(self): + """Decreases the indentation.""" + self.current_indent -= self.indent_increment + + def write_usage(self, prog, args='', prefix='Usage: '): + """Writes a usage line into the buffer. + + :param prog: the program name. + :param args: whitespace separated list of arguments. + :param prefix: the prefix for the first line. + """ + usage_prefix = '%*s%s ' % (self.current_indent, prefix, prog) + text_width = self.width - self.current_indent + + if text_width >= (term_len(usage_prefix) + 20): + # The arguments will fit to the right of the prefix. + indent = ' ' * term_len(usage_prefix) + self.write(wrap_text(args, text_width, + initial_indent=usage_prefix, + subsequent_indent=indent)) + else: + # The prefix is too long, put the arguments on the next line. + self.write(usage_prefix) + self.write('\n') + indent = ' ' * (max(self.current_indent, term_len(prefix)) + 4) + self.write(wrap_text(args, text_width, + initial_indent=indent, + subsequent_indent=indent)) + + self.write('\n') + + def write_heading(self, heading): + """Writes a heading into the buffer.""" + self.write('%*s%s:\n' % (self.current_indent, '', heading)) + + def write_paragraph(self): + """Writes a paragraph into the buffer.""" + if self.buffer: + self.write('\n') + + def write_text(self, text): + """Writes re-indented text into the buffer. This rewraps and + preserves paragraphs. + """ + text_width = max(self.width - self.current_indent, 11) + indent = ' ' * self.current_indent + self.write(wrap_text(text, text_width, + initial_indent=indent, + subsequent_indent=indent, + preserve_paragraphs=True)) + self.write('\n') + + def write_dl(self, rows, col_max=30, col_spacing=2): + """Writes a definition list into the buffer. This is how options + and commands are usually formatted. + + :param rows: a list of two item tuples for the terms and values. + :param col_max: the maximum width of the first column. + :param col_spacing: the number of spaces between the first and + second column. + """ + rows = list(rows) + widths = measure_table(rows) + if len(widths) != 2: + raise TypeError('Expected two columns for definition list') + + first_col = min(widths[0], col_max) + col_spacing + + for first, second in iter_rows(rows, len(widths)): + self.write('%*s%s' % (self.current_indent, '', first)) + if not second: + self.write('\n') + continue + if term_len(first) <= first_col - col_spacing: + self.write(' ' * (first_col - term_len(first))) + else: + self.write('\n') + self.write(' ' * (first_col + self.current_indent)) + + text_width = max(self.width - first_col - 2, 10) + lines = iter(wrap_text(second, text_width).splitlines()) + if lines: + self.write(next(lines) + '\n') + for line in lines: + self.write('%*s%s\n' % ( + first_col + self.current_indent, '', line)) + else: + self.write('\n') + + @contextmanager + def section(self, name): + """Helpful context manager that writes a paragraph, a heading, + and the indents. + + :param name: the section name that is written as heading. + """ + self.write_paragraph() + self.write_heading(name) + self.indent() + try: + yield + finally: + self.dedent() + + @contextmanager + def indentation(self): + """A context manager that increases the indentation.""" + self.indent() + try: + yield + finally: + self.dedent() + + def getvalue(self): + """Returns the buffer contents.""" + return ''.join(self.buffer) + + +def join_options(options): + """Given a list of option strings this joins them in the most appropriate + way and returns them in the form ``(formatted_string, + any_prefix_is_slash)`` where the second item in the tuple is a flag that + indicates if any of the option prefixes was a slash. + """ + rv = [] + any_prefix_is_slash = False + for opt in options: + prefix = split_opt(opt)[0] + if prefix == '/': + any_prefix_is_slash = True + rv.append((len(prefix), opt)) + + rv.sort(key=lambda x: x[0]) + + rv = ', '.join(x[1] for x in rv) + return rv, any_prefix_is_slash diff --git a/env/Lib/site-packages/click/globals.py b/env/Lib/site-packages/click/globals.py new file mode 100644 index 0000000..843b594 --- /dev/null +++ b/env/Lib/site-packages/click/globals.py @@ -0,0 +1,48 @@ +from threading import local + + +_local = local() + + +def get_current_context(silent=False): + """Returns the current click context. This can be used as a way to + access the current context object from anywhere. This is a more implicit + alternative to the :func:`pass_context` decorator. This function is + primarily useful for helpers such as :func:`echo` which might be + interested in changing its behavior based on the current context. + + To push the current context, :meth:`Context.scope` can be used. + + .. versionadded:: 5.0 + + :param silent: is set to `True` the return value is `None` if no context + is available. The default behavior is to raise a + :exc:`RuntimeError`. + """ + try: + return getattr(_local, 'stack')[-1] + except (AttributeError, IndexError): + if not silent: + raise RuntimeError('There is no active click context.') + + +def push_context(ctx): + """Pushes a new context to the current stack.""" + _local.__dict__.setdefault('stack', []).append(ctx) + + +def pop_context(): + """Removes the top level from the stack.""" + _local.stack.pop() + + +def resolve_color_default(color=None): + """"Internal helper to get the default value of the color flag. If a + value is passed it's returned unchanged, otherwise it's looked up from + the current context. + """ + if color is not None: + return color + ctx = get_current_context(silent=True) + if ctx is not None: + return ctx.color diff --git a/env/Lib/site-packages/click/parser.py b/env/Lib/site-packages/click/parser.py new file mode 100644 index 0000000..1c3ae9c --- /dev/null +++ b/env/Lib/site-packages/click/parser.py @@ -0,0 +1,427 @@ +# -*- coding: utf-8 -*- +""" +click.parser +~~~~~~~~~~~~ + +This module started out as largely a copy paste from the stdlib's +optparse module with the features removed that we do not need from +optparse because we implement them in Click on a higher level (for +instance type handling, help formatting and a lot more). + +The plan is to remove more and more from here over time. + +The reason this is a different module and not optparse from the stdlib +is that there are differences in 2.x and 3.x about the error messages +generated and optparse in the stdlib uses gettext for no good reason +and might cause us issues. +""" + +import re +from collections import deque +from .exceptions import UsageError, NoSuchOption, BadOptionUsage, \ + BadArgumentUsage + + +def _unpack_args(args, nargs_spec): + """Given an iterable of arguments and an iterable of nargs specifications, + it returns a tuple with all the unpacked arguments at the first index + and all remaining arguments as the second. + + The nargs specification is the number of arguments that should be consumed + or `-1` to indicate that this position should eat up all the remainders. + + Missing items are filled with `None`. + """ + args = deque(args) + nargs_spec = deque(nargs_spec) + rv = [] + spos = None + + def _fetch(c): + try: + if spos is None: + return c.popleft() + else: + return c.pop() + except IndexError: + return None + + while nargs_spec: + nargs = _fetch(nargs_spec) + if nargs == 1: + rv.append(_fetch(args)) + elif nargs > 1: + x = [_fetch(args) for _ in range(nargs)] + # If we're reversed, we're pulling in the arguments in reverse, + # so we need to turn them around. + if spos is not None: + x.reverse() + rv.append(tuple(x)) + elif nargs < 0: + if spos is not None: + raise TypeError('Cannot have two nargs < 0') + spos = len(rv) + rv.append(None) + + # spos is the position of the wildcard (star). If it's not `None`, + # we fill it with the remainder. + if spos is not None: + rv[spos] = tuple(args) + args = [] + rv[spos + 1:] = reversed(rv[spos + 1:]) + + return tuple(rv), list(args) + + +def _error_opt_args(nargs, opt): + if nargs == 1: + raise BadOptionUsage(opt, '%s option requires an argument' % opt) + raise BadOptionUsage(opt, '%s option requires %d arguments' % (opt, nargs)) + + +def split_opt(opt): + first = opt[:1] + if first.isalnum(): + return '', opt + if opt[1:2] == first: + return opt[:2], opt[2:] + return first, opt[1:] + + +def normalize_opt(opt, ctx): + if ctx is None or ctx.token_normalize_func is None: + return opt + prefix, opt = split_opt(opt) + return prefix + ctx.token_normalize_func(opt) + + +def split_arg_string(string): + """Given an argument string this attempts to split it into small parts.""" + rv = [] + for match in re.finditer(r"('([^'\\]*(?:\\.[^'\\]*)*)'" + r'|"([^"\\]*(?:\\.[^"\\]*)*)"' + r'|\S+)\s*', string, re.S): + arg = match.group().strip() + if arg[:1] == arg[-1:] and arg[:1] in '"\'': + arg = arg[1:-1].encode('ascii', 'backslashreplace') \ + .decode('unicode-escape') + try: + arg = type(string)(arg) + except UnicodeError: + pass + rv.append(arg) + return rv + + +class Option(object): + + def __init__(self, opts, dest, action=None, nargs=1, const=None, obj=None): + self._short_opts = [] + self._long_opts = [] + self.prefixes = set() + + for opt in opts: + prefix, value = split_opt(opt) + if not prefix: + raise ValueError('Invalid start character for option (%s)' + % opt) + self.prefixes.add(prefix[0]) + if len(prefix) == 1 and len(value) == 1: + self._short_opts.append(opt) + else: + self._long_opts.append(opt) + self.prefixes.add(prefix) + + if action is None: + action = 'store' + + self.dest = dest + self.action = action + self.nargs = nargs + self.const = const + self.obj = obj + + @property + def takes_value(self): + return self.action in ('store', 'append') + + def process(self, value, state): + if self.action == 'store': + state.opts[self.dest] = value + elif self.action == 'store_const': + state.opts[self.dest] = self.const + elif self.action == 'append': + state.opts.setdefault(self.dest, []).append(value) + elif self.action == 'append_const': + state.opts.setdefault(self.dest, []).append(self.const) + elif self.action == 'count': + state.opts[self.dest] = state.opts.get(self.dest, 0) + 1 + else: + raise ValueError('unknown action %r' % self.action) + state.order.append(self.obj) + + +class Argument(object): + + def __init__(self, dest, nargs=1, obj=None): + self.dest = dest + self.nargs = nargs + self.obj = obj + + def process(self, value, state): + if self.nargs > 1: + holes = sum(1 for x in value if x is None) + if holes == len(value): + value = None + elif holes != 0: + raise BadArgumentUsage('argument %s takes %d values' + % (self.dest, self.nargs)) + state.opts[self.dest] = value + state.order.append(self.obj) + + +class ParsingState(object): + + def __init__(self, rargs): + self.opts = {} + self.largs = [] + self.rargs = rargs + self.order = [] + + +class OptionParser(object): + """The option parser is an internal class that is ultimately used to + parse options and arguments. It's modelled after optparse and brings + a similar but vastly simplified API. It should generally not be used + directly as the high level Click classes wrap it for you. + + It's not nearly as extensible as optparse or argparse as it does not + implement features that are implemented on a higher level (such as + types or defaults). + + :param ctx: optionally the :class:`~click.Context` where this parser + should go with. + """ + + def __init__(self, ctx=None): + #: The :class:`~click.Context` for this parser. This might be + #: `None` for some advanced use cases. + self.ctx = ctx + #: This controls how the parser deals with interspersed arguments. + #: If this is set to `False`, the parser will stop on the first + #: non-option. Click uses this to implement nested subcommands + #: safely. + self.allow_interspersed_args = True + #: This tells the parser how to deal with unknown options. By + #: default it will error out (which is sensible), but there is a + #: second mode where it will ignore it and continue processing + #: after shifting all the unknown options into the resulting args. + self.ignore_unknown_options = False + if ctx is not None: + self.allow_interspersed_args = ctx.allow_interspersed_args + self.ignore_unknown_options = ctx.ignore_unknown_options + self._short_opt = {} + self._long_opt = {} + self._opt_prefixes = set(['-', '--']) + self._args = [] + + def add_option(self, opts, dest, action=None, nargs=1, const=None, + obj=None): + """Adds a new option named `dest` to the parser. The destination + is not inferred (unlike with optparse) and needs to be explicitly + provided. Action can be any of ``store``, ``store_const``, + ``append``, ``appnd_const`` or ``count``. + + The `obj` can be used to identify the option in the order list + that is returned from the parser. + """ + if obj is None: + obj = dest + opts = [normalize_opt(opt, self.ctx) for opt in opts] + option = Option(opts, dest, action=action, nargs=nargs, + const=const, obj=obj) + self._opt_prefixes.update(option.prefixes) + for opt in option._short_opts: + self._short_opt[opt] = option + for opt in option._long_opts: + self._long_opt[opt] = option + + def add_argument(self, dest, nargs=1, obj=None): + """Adds a positional argument named `dest` to the parser. + + The `obj` can be used to identify the option in the order list + that is returned from the parser. + """ + if obj is None: + obj = dest + self._args.append(Argument(dest=dest, nargs=nargs, obj=obj)) + + def parse_args(self, args): + """Parses positional arguments and returns ``(values, args, order)`` + for the parsed options and arguments as well as the leftover + arguments if there are any. The order is a list of objects as they + appear on the command line. If arguments appear multiple times they + will be memorized multiple times as well. + """ + state = ParsingState(args) + try: + self._process_args_for_options(state) + self._process_args_for_args(state) + except UsageError: + if self.ctx is None or not self.ctx.resilient_parsing: + raise + return state.opts, state.largs, state.order + + def _process_args_for_args(self, state): + pargs, args = _unpack_args(state.largs + state.rargs, + [x.nargs for x in self._args]) + + for idx, arg in enumerate(self._args): + arg.process(pargs[idx], state) + + state.largs = args + state.rargs = [] + + def _process_args_for_options(self, state): + while state.rargs: + arg = state.rargs.pop(0) + arglen = len(arg) + # Double dashes always handled explicitly regardless of what + # prefixes are valid. + if arg == '--': + return + elif arg[:1] in self._opt_prefixes and arglen > 1: + self._process_opts(arg, state) + elif self.allow_interspersed_args: + state.largs.append(arg) + else: + state.rargs.insert(0, arg) + return + + # Say this is the original argument list: + # [arg0, arg1, ..., arg(i-1), arg(i), arg(i+1), ..., arg(N-1)] + # ^ + # (we are about to process arg(i)). + # + # Then rargs is [arg(i), ..., arg(N-1)] and largs is a *subset* of + # [arg0, ..., arg(i-1)] (any options and their arguments will have + # been removed from largs). + # + # The while loop will usually consume 1 or more arguments per pass. + # If it consumes 1 (eg. arg is an option that takes no arguments), + # then after _process_arg() is done the situation is: + # + # largs = subset of [arg0, ..., arg(i)] + # rargs = [arg(i+1), ..., arg(N-1)] + # + # If allow_interspersed_args is false, largs will always be + # *empty* -- still a subset of [arg0, ..., arg(i-1)], but + # not a very interesting subset! + + def _match_long_opt(self, opt, explicit_value, state): + if opt not in self._long_opt: + possibilities = [word for word in self._long_opt + if word.startswith(opt)] + raise NoSuchOption(opt, possibilities=possibilities, ctx=self.ctx) + + option = self._long_opt[opt] + if option.takes_value: + # At this point it's safe to modify rargs by injecting the + # explicit value, because no exception is raised in this + # branch. This means that the inserted value will be fully + # consumed. + if explicit_value is not None: + state.rargs.insert(0, explicit_value) + + nargs = option.nargs + if len(state.rargs) < nargs: + _error_opt_args(nargs, opt) + elif nargs == 1: + value = state.rargs.pop(0) + else: + value = tuple(state.rargs[:nargs]) + del state.rargs[:nargs] + + elif explicit_value is not None: + raise BadOptionUsage(opt, '%s option does not take a value' % opt) + + else: + value = None + + option.process(value, state) + + def _match_short_opt(self, arg, state): + stop = False + i = 1 + prefix = arg[0] + unknown_options = [] + + for ch in arg[1:]: + opt = normalize_opt(prefix + ch, self.ctx) + option = self._short_opt.get(opt) + i += 1 + + if not option: + if self.ignore_unknown_options: + unknown_options.append(ch) + continue + raise NoSuchOption(opt, ctx=self.ctx) + if option.takes_value: + # Any characters left in arg? Pretend they're the + # next arg, and stop consuming characters of arg. + if i < len(arg): + state.rargs.insert(0, arg[i:]) + stop = True + + nargs = option.nargs + if len(state.rargs) < nargs: + _error_opt_args(nargs, opt) + elif nargs == 1: + value = state.rargs.pop(0) + else: + value = tuple(state.rargs[:nargs]) + del state.rargs[:nargs] + + else: + value = None + + option.process(value, state) + + if stop: + break + + # If we got any unknown options we re-combinate the string of the + # remaining options and re-attach the prefix, then report that + # to the state as new larg. This way there is basic combinatorics + # that can be achieved while still ignoring unknown arguments. + if self.ignore_unknown_options and unknown_options: + state.largs.append(prefix + ''.join(unknown_options)) + + def _process_opts(self, arg, state): + explicit_value = None + # Long option handling happens in two parts. The first part is + # supporting explicitly attached values. In any case, we will try + # to long match the option first. + if '=' in arg: + long_opt, explicit_value = arg.split('=', 1) + else: + long_opt = arg + norm_long_opt = normalize_opt(long_opt, self.ctx) + + # At this point we will match the (assumed) long option through + # the long option matching code. Note that this allows options + # like "-foo" to be matched as long options. + try: + self._match_long_opt(norm_long_opt, explicit_value, state) + except NoSuchOption: + # At this point the long option matching failed, and we need + # to try with short options. However there is a special rule + # which says, that if we have a two character options prefix + # (applies to "--foo" for instance), we do not dispatch to the + # short option code and will instead raise the no option + # error. + if arg[:2] not in self._opt_prefixes: + return self._match_short_opt(arg, state) + if not self.ignore_unknown_options: + raise + state.largs.append(arg) diff --git a/env/Lib/site-packages/click/termui.py b/env/Lib/site-packages/click/termui.py new file mode 100644 index 0000000..bf9a3aa --- /dev/null +++ b/env/Lib/site-packages/click/termui.py @@ -0,0 +1,606 @@ +import os +import sys +import struct +import inspect +import itertools + +from ._compat import raw_input, text_type, string_types, \ + isatty, strip_ansi, get_winterm_size, DEFAULT_COLUMNS, WIN +from .utils import echo +from .exceptions import Abort, UsageError +from .types import convert_type, Choice, Path +from .globals import resolve_color_default + + +# The prompt functions to use. The doc tools currently override these +# functions to customize how they work. +visible_prompt_func = raw_input + +_ansi_colors = { + 'black': 30, + 'red': 31, + 'green': 32, + 'yellow': 33, + 'blue': 34, + 'magenta': 35, + 'cyan': 36, + 'white': 37, + 'reset': 39, + 'bright_black': 90, + 'bright_red': 91, + 'bright_green': 92, + 'bright_yellow': 93, + 'bright_blue': 94, + 'bright_magenta': 95, + 'bright_cyan': 96, + 'bright_white': 97, +} +_ansi_reset_all = '\033[0m' + + +def hidden_prompt_func(prompt): + import getpass + return getpass.getpass(prompt) + + +def _build_prompt(text, suffix, show_default=False, default=None, show_choices=True, type=None): + prompt = text + if type is not None and show_choices and isinstance(type, Choice): + prompt += ' (' + ", ".join(map(str, type.choices)) + ')' + if default is not None and show_default: + prompt = '%s [%s]' % (prompt, default) + return prompt + suffix + + +def prompt(text, default=None, hide_input=False, confirmation_prompt=False, + type=None, value_proc=None, prompt_suffix=': ', show_default=True, + err=False, show_choices=True): + """Prompts a user for input. This is a convenience function that can + be used to prompt a user for input later. + + If the user aborts the input by sending a interrupt signal, this + function will catch it and raise a :exc:`Abort` exception. + + .. versionadded:: 7.0 + Added the show_choices parameter. + + .. versionadded:: 6.0 + Added unicode support for cmd.exe on Windows. + + .. versionadded:: 4.0 + Added the `err` parameter. + + :param text: the text to show for the prompt. + :param default: the default value to use if no input happens. If this + is not given it will prompt until it's aborted. + :param hide_input: if this is set to true then the input value will + be hidden. + :param confirmation_prompt: asks for confirmation for the value. + :param type: the type to use to check the value against. + :param value_proc: if this parameter is provided it's a function that + is invoked instead of the type conversion to + convert a value. + :param prompt_suffix: a suffix that should be added to the prompt. + :param show_default: shows or hides the default value in the prompt. + :param err: if set to true the file defaults to ``stderr`` instead of + ``stdout``, the same as with echo. + :param show_choices: Show or hide choices if the passed type is a Choice. + For example if type is a Choice of either day or week, + show_choices is true and text is "Group by" then the + prompt will be "Group by (day, week): ". + """ + result = None + + def prompt_func(text): + f = hide_input and hidden_prompt_func or visible_prompt_func + try: + # Write the prompt separately so that we get nice + # coloring through colorama on Windows + echo(text, nl=False, err=err) + return f('') + except (KeyboardInterrupt, EOFError): + # getpass doesn't print a newline if the user aborts input with ^C. + # Allegedly this behavior is inherited from getpass(3). + # A doc bug has been filed at https://bugs.python.org/issue24711 + if hide_input: + echo(None, err=err) + raise Abort() + + if value_proc is None: + value_proc = convert_type(type, default) + + prompt = _build_prompt(text, prompt_suffix, show_default, default, show_choices, type) + + while 1: + while 1: + value = prompt_func(prompt) + if value: + break + elif default is not None: + if isinstance(value_proc, Path): + # validate Path default value(exists, dir_okay etc.) + value = default + break + return default + try: + result = value_proc(value) + except UsageError as e: + echo('Error: %s' % e.message, err=err) + continue + if not confirmation_prompt: + return result + while 1: + value2 = prompt_func('Repeat for confirmation: ') + if value2: + break + if value == value2: + return result + echo('Error: the two entered values do not match', err=err) + + +def confirm(text, default=False, abort=False, prompt_suffix=': ', + show_default=True, err=False): + """Prompts for confirmation (yes/no question). + + If the user aborts the input by sending a interrupt signal this + function will catch it and raise a :exc:`Abort` exception. + + .. versionadded:: 4.0 + Added the `err` parameter. + + :param text: the question to ask. + :param default: the default for the prompt. + :param abort: if this is set to `True` a negative answer aborts the + exception by raising :exc:`Abort`. + :param prompt_suffix: a suffix that should be added to the prompt. + :param show_default: shows or hides the default value in the prompt. + :param err: if set to true the file defaults to ``stderr`` instead of + ``stdout``, the same as with echo. + """ + prompt = _build_prompt(text, prompt_suffix, show_default, + default and 'Y/n' or 'y/N') + while 1: + try: + # Write the prompt separately so that we get nice + # coloring through colorama on Windows + echo(prompt, nl=False, err=err) + value = visible_prompt_func('').lower().strip() + except (KeyboardInterrupt, EOFError): + raise Abort() + if value in ('y', 'yes'): + rv = True + elif value in ('n', 'no'): + rv = False + elif value == '': + rv = default + else: + echo('Error: invalid input', err=err) + continue + break + if abort and not rv: + raise Abort() + return rv + + +def get_terminal_size(): + """Returns the current size of the terminal as tuple in the form + ``(width, height)`` in columns and rows. + """ + # If shutil has get_terminal_size() (Python 3.3 and later) use that + if sys.version_info >= (3, 3): + import shutil + shutil_get_terminal_size = getattr(shutil, 'get_terminal_size', None) + if shutil_get_terminal_size: + sz = shutil_get_terminal_size() + return sz.columns, sz.lines + + # We provide a sensible default for get_winterm_size() when being invoked + # inside a subprocess. Without this, it would not provide a useful input. + if get_winterm_size is not None: + size = get_winterm_size() + if size == (0, 0): + return (79, 24) + else: + return size + + def ioctl_gwinsz(fd): + try: + import fcntl + import termios + cr = struct.unpack( + 'hh', fcntl.ioctl(fd, termios.TIOCGWINSZ, '1234')) + except Exception: + return + 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) + try: + cr = ioctl_gwinsz(fd) + finally: + os.close(fd) + except Exception: + pass + if not cr or not cr[0] or not cr[1]: + cr = (os.environ.get('LINES', 25), + os.environ.get('COLUMNS', DEFAULT_COLUMNS)) + return int(cr[1]), int(cr[0]) + + +def echo_via_pager(text_or_generator, color=None): + """This function takes a text and shows it via an environment specific + pager on stdout. + + .. versionchanged:: 3.0 + Added the `color` flag. + + :param text_or_generator: the text to page, or alternatively, a + generator emitting the text to page. + :param color: controls if the pager supports ANSI colors or not. The + default is autodetection. + """ + color = resolve_color_default(color) + + if inspect.isgeneratorfunction(text_or_generator): + i = text_or_generator() + elif isinstance(text_or_generator, string_types): + i = [text_or_generator] + else: + i = iter(text_or_generator) + + # convert every element of i to a text type if necessary + text_generator = (el if isinstance(el, string_types) else text_type(el) + for el in i) + + from ._termui_impl import pager + return pager(itertools.chain(text_generator, "\n"), color) + + +def progressbar(iterable=None, length=None, label=None, show_eta=True, + show_percent=None, show_pos=False, + item_show_func=None, fill_char='#', empty_char='-', + bar_template='%(label)s [%(bar)s] %(info)s', + info_sep=' ', width=36, file=None, color=None): + """This function creates an iterable context manager that can be used + to iterate over something while showing a progress bar. It will + either iterate over the `iterable` or `length` items (that are counted + up). While iteration happens, this function will print a rendered + progress bar to the given `file` (defaults to stdout) and will attempt + to calculate remaining time and more. By default, this progress bar + will not be rendered if the file is not a terminal. + + The context manager creates the progress bar. When the context + manager is entered the progress bar is already displayed. With every + iteration over the progress bar, the iterable passed to the bar is + advanced and the bar is updated. When the context manager exits, + a newline is printed and the progress bar is finalized on screen. + + No printing must happen or the progress bar will be unintentionally + destroyed. + + Example usage:: + + with progressbar(items) as bar: + for item in bar: + do_something_with(item) + + Alternatively, if no iterable is specified, one can manually update the + progress bar through the `update()` method instead of directly + iterating over the progress bar. The update method accepts the number + of steps to increment the bar with:: + + with progressbar(length=chunks.total_bytes) as bar: + for chunk in chunks: + process_chunk(chunk) + bar.update(chunks.bytes) + + .. versionadded:: 2.0 + + .. versionadded:: 4.0 + Added the `color` parameter. Added a `update` method to the + progressbar object. + + :param iterable: an iterable to iterate over. If not provided the length + is required. + :param length: the number of items to iterate over. By default the + progressbar will attempt to ask the iterator about its + length, which might or might not work. If an iterable is + also provided this parameter can be used to override the + length. If an iterable is not provided the progress bar + will iterate over a range of that length. + :param label: the label to show next to the progress bar. + :param show_eta: enables or disables the estimated time display. This is + automatically disabled if the length cannot be + determined. + :param show_percent: enables or disables the percentage display. The + default is `True` if the iterable has a length or + `False` if not. + :param show_pos: enables or disables the absolute position display. The + default is `False`. + :param item_show_func: a function called with the current item which + can return a string to show the current item + next to the progress bar. Note that the current + item can be `None`! + :param fill_char: the character to use to show the filled part of the + progress bar. + :param empty_char: the character to use to show the non-filled part of + the progress bar. + :param bar_template: the format string to use as template for the bar. + The parameters in it are ``label`` for the label, + ``bar`` for the progress bar and ``info`` for the + info section. + :param info_sep: the separator between multiple info items (eta etc.) + :param width: the width of the progress bar in characters, 0 means full + terminal width + :param file: the file to write to. If this is not a terminal then + only the label is printed. + :param color: controls if the terminal supports ANSI colors or not. The + default is autodetection. This is only needed if ANSI + codes are included anywhere in the progress bar output + which is not the case by default. + """ + from ._termui_impl import ProgressBar + color = resolve_color_default(color) + return ProgressBar(iterable=iterable, length=length, show_eta=show_eta, + show_percent=show_percent, show_pos=show_pos, + item_show_func=item_show_func, fill_char=fill_char, + empty_char=empty_char, bar_template=bar_template, + info_sep=info_sep, file=file, label=label, + width=width, color=color) + + +def clear(): + """Clears the terminal screen. This will have the effect of clearing + the whole visible space of the terminal and moving the cursor to the + top left. This does not do anything if not connected to a terminal. + + .. versionadded:: 2.0 + """ + if not isatty(sys.stdout): + return + # If we're on Windows and we don't have colorama available, then we + # clear the screen by shelling out. Otherwise we can use an escape + # sequence. + if WIN: + os.system('cls') + else: + sys.stdout.write('\033[2J\033[1;1H') + + +def style(text, fg=None, bg=None, bold=None, dim=None, underline=None, + blink=None, reverse=None, reset=True): + """Styles a text with ANSI styles and returns the new string. By + default the styling is self contained which means that at the end + of the string a reset code is issued. This can be prevented by + passing ``reset=False``. + + Examples:: + + click.echo(click.style('Hello World!', fg='green')) + click.echo(click.style('ATTENTION!', blink=True)) + click.echo(click.style('Some things', reverse=True, fg='cyan')) + + Supported color names: + + * ``black`` (might be a gray) + * ``red`` + * ``green`` + * ``yellow`` (might be an orange) + * ``blue`` + * ``magenta`` + * ``cyan`` + * ``white`` (might be light gray) + * ``bright_black`` + * ``bright_red`` + * ``bright_green`` + * ``bright_yellow`` + * ``bright_blue`` + * ``bright_magenta`` + * ``bright_cyan`` + * ``bright_white`` + * ``reset`` (reset the color code only) + + .. versionadded:: 2.0 + + .. versionadded:: 7.0 + Added support for bright colors. + + :param text: the string to style with ansi codes. + :param fg: if provided this will become the foreground color. + :param bg: if provided this will become the background color. + :param bold: if provided this will enable or disable bold mode. + :param dim: if provided this will enable or disable dim mode. This is + badly supported. + :param underline: if provided this will enable or disable underline. + :param blink: if provided this will enable or disable blinking. + :param reverse: if provided this will enable or disable inverse + rendering (foreground becomes background and the + other way round). + :param reset: by default a reset-all code is added at the end of the + string which means that styles do not carry over. This + can be disabled to compose styles. + """ + bits = [] + if fg: + try: + bits.append('\033[%dm' % (_ansi_colors[fg])) + except KeyError: + raise TypeError('Unknown color %r' % fg) + if bg: + try: + bits.append('\033[%dm' % (_ansi_colors[bg] + 10)) + except KeyError: + raise TypeError('Unknown color %r' % bg) + if bold is not None: + bits.append('\033[%dm' % (1 if bold else 22)) + if dim is not None: + bits.append('\033[%dm' % (2 if dim else 22)) + if underline is not None: + bits.append('\033[%dm' % (4 if underline else 24)) + if blink is not None: + bits.append('\033[%dm' % (5 if blink else 25)) + if reverse is not None: + bits.append('\033[%dm' % (7 if reverse else 27)) + bits.append(text) + if reset: + bits.append(_ansi_reset_all) + return ''.join(bits) + + +def unstyle(text): + """Removes ANSI styling information from a string. Usually it's not + necessary to use this function as Click's echo function will + automatically remove styling if necessary. + + .. versionadded:: 2.0 + + :param text: the text to remove style information from. + """ + return strip_ansi(text) + + +def secho(message=None, file=None, nl=True, err=False, color=None, **styles): + """This function combines :func:`echo` and :func:`style` into one + call. As such the following two calls are the same:: + + click.secho('Hello World!', fg='green') + click.echo(click.style('Hello World!', fg='green')) + + All keyword arguments are forwarded to the underlying functions + depending on which one they go with. + + .. versionadded:: 2.0 + """ + if message is not None: + message = style(message, **styles) + return echo(message, file=file, nl=nl, err=err, color=color) + + +def edit(text=None, editor=None, env=None, require_save=True, + extension='.txt', filename=None): + r"""Edits the given text in the defined editor. If an editor is given + (should be the full path to the executable but the regular operating + system search path is used for finding the executable) it overrides + the detected editor. Optionally, some environment variables can be + used. If the editor is closed without changes, `None` is returned. In + case a file is edited directly the return value is always `None` and + `require_save` and `extension` are ignored. + + If the editor cannot be opened a :exc:`UsageError` is raised. + + Note for Windows: to simplify cross-platform usage, the newlines are + automatically converted from POSIX to Windows and vice versa. As such, + the message here will have ``\n`` as newline markers. + + :param text: the text to edit. + :param editor: optionally the editor to use. Defaults to automatic + detection. + :param env: environment variables to forward to the editor. + :param require_save: if this is true, then not saving in the editor + will make the return value become `None`. + :param extension: the extension to tell the editor about. This defaults + to `.txt` but changing this might change syntax + highlighting. + :param filename: if provided it will edit this file instead of the + provided text contents. It will not use a temporary + file as an indirection in that case. + """ + from ._termui_impl import Editor + editor = Editor(editor=editor, env=env, require_save=require_save, + extension=extension) + if filename is None: + return editor.edit(text) + editor.edit_file(filename) + + +def launch(url, wait=False, locate=False): + """This function launches the given URL (or filename) in the default + viewer application for this file type. If this is an executable, it + might launch the executable in a new session. The return value is + the exit code of the launched application. Usually, ``0`` indicates + success. + + Examples:: + + click.launch('https://click.palletsprojects.com/') + click.launch('/my/downloaded/file', locate=True) + + .. versionadded:: 2.0 + + :param url: URL or filename of the thing to launch. + :param wait: waits for the program to stop. + :param locate: if this is set to `True` then instead of launching the + application associated with the URL it will attempt to + launch a file manager with the file located. This + might have weird effects if the URL does not point to + the filesystem. + """ + from ._termui_impl import open_url + return open_url(url, wait=wait, locate=locate) + + +# If this is provided, getchar() calls into this instead. This is used +# for unittesting purposes. +_getchar = None + + +def getchar(echo=False): + """Fetches a single character from the terminal and returns it. This + will always return a unicode character and under certain rare + circumstances this might return more than one character. The + situations which more than one character is returned is when for + whatever reason multiple characters end up in the terminal buffer or + standard input was not actually a terminal. + + Note that this will always read from the terminal, even if something + is piped into the standard input. + + Note for Windows: in rare cases when typing non-ASCII characters, this + function might wait for a second character and then return both at once. + This is because certain Unicode characters look like special-key markers. + + .. versionadded:: 2.0 + + :param echo: if set to `True`, the character read will also show up on + the terminal. The default is to not show it. + """ + f = _getchar + if f is None: + from ._termui_impl import getchar as f + return f(echo) + + +def raw_terminal(): + from ._termui_impl import raw_terminal as f + return f() + + +def pause(info='Press any key to continue ...', err=False): + """This command stops execution and waits for the user to press any + key to continue. This is similar to the Windows batch "pause" + command. If the program is not run through a terminal, this command + will instead do nothing. + + .. versionadded:: 2.0 + + .. versionadded:: 4.0 + Added the `err` parameter. + + :param info: the info string to print before pausing. + :param err: if set to message goes to ``stderr`` instead of + ``stdout``, the same as with echo. + """ + if not isatty(sys.stdin) or not isatty(sys.stdout): + return + try: + if info: + echo(info, nl=False, err=err) + try: + getchar() + except (KeyboardInterrupt, EOFError): + pass + finally: + if info: + echo(err=err) diff --git a/env/Lib/site-packages/click/testing.py b/env/Lib/site-packages/click/testing.py new file mode 100644 index 0000000..1b2924e --- /dev/null +++ b/env/Lib/site-packages/click/testing.py @@ -0,0 +1,374 @@ +import os +import sys +import shutil +import tempfile +import contextlib +import shlex + +from ._compat import iteritems, PY2, string_types + + +# If someone wants to vendor click, we want to ensure the +# correct package is discovered. Ideally we could use a +# relative import here but unfortunately Python does not +# support that. +clickpkg = sys.modules[__name__.rsplit('.', 1)[0]] + + +if PY2: + from cStringIO import StringIO +else: + import io + from ._compat import _find_binary_reader + + +class EchoingStdin(object): + + def __init__(self, input, output): + self._input = input + self._output = output + + def __getattr__(self, x): + return getattr(self._input, x) + + def _echo(self, rv): + self._output.write(rv) + return rv + + def read(self, n=-1): + return self._echo(self._input.read(n)) + + def readline(self, n=-1): + return self._echo(self._input.readline(n)) + + def readlines(self): + return [self._echo(x) for x in self._input.readlines()] + + def __iter__(self): + return iter(self._echo(x) for x in self._input) + + def __repr__(self): + return repr(self._input) + + +def make_input_stream(input, charset): + # Is already an input stream. + if hasattr(input, 'read'): + if PY2: + return input + rv = _find_binary_reader(input) + if rv is not None: + return rv + raise TypeError('Could not find binary reader for input stream.') + + if input is None: + input = b'' + elif not isinstance(input, bytes): + input = input.encode(charset) + if PY2: + return StringIO(input) + return io.BytesIO(input) + + +class Result(object): + """Holds the captured result of an invoked CLI script.""" + + def __init__(self, runner, stdout_bytes, stderr_bytes, exit_code, + exception, exc_info=None): + #: The runner that created the result + self.runner = runner + #: The standard output as bytes. + self.stdout_bytes = stdout_bytes + #: The standard error as bytes, or False(y) if not available + self.stderr_bytes = stderr_bytes + #: The exit code as integer. + self.exit_code = exit_code + #: The exception that happened if one did. + self.exception = exception + #: The traceback + self.exc_info = exc_info + + @property + def output(self): + """The (standard) output as unicode string.""" + return self.stdout + + @property + def stdout(self): + """The standard output as unicode string.""" + return self.stdout_bytes.decode(self.runner.charset, 'replace') \ + .replace('\r\n', '\n') + + @property + def stderr(self): + """The standard error as unicode string.""" + if not self.stderr_bytes: + raise ValueError("stderr not separately captured") + return self.stderr_bytes.decode(self.runner.charset, 'replace') \ + .replace('\r\n', '\n') + + + def __repr__(self): + return '<%s %s>' % ( + type(self).__name__, + self.exception and repr(self.exception) or 'okay', + ) + + +class CliRunner(object): + """The CLI runner provides functionality to invoke a Click command line + script for unittesting purposes in a isolated environment. This only + works in single-threaded systems without any concurrency as it changes the + global interpreter state. + + :param charset: the character set for the input and output data. This is + UTF-8 by default and should not be changed currently as + the reporting to Click only works in Python 2 properly. + :param env: a dictionary with environment variables for overriding. + :param echo_stdin: if this is set to `True`, then reading from stdin writes + to stdout. This is useful for showing examples in + some circumstances. Note that regular prompts + will automatically echo the input. + :param mix_stderr: if this is set to `False`, then stdout and stderr are + preserved as independent streams. This is useful for + Unix-philosophy apps that have predictable stdout and + noisy stderr, such that each may be measured + independently + """ + + def __init__(self, charset=None, env=None, echo_stdin=False, + mix_stderr=True): + if charset is None: + charset = 'utf-8' + self.charset = charset + self.env = env or {} + self.echo_stdin = echo_stdin + self.mix_stderr = mix_stderr + + def get_default_prog_name(self, cli): + """Given a command object it will return the default program name + for it. The default is the `name` attribute or ``"root"`` if not + set. + """ + return cli.name or 'root' + + def make_env(self, overrides=None): + """Returns the environment overrides for invoking a script.""" + rv = dict(self.env) + if overrides: + rv.update(overrides) + return rv + + @contextlib.contextmanager + def isolation(self, input=None, env=None, color=False): + """A context manager that sets up the isolation for invoking of a + command line tool. This sets up stdin with the given input data + and `os.environ` with the overrides from the given dictionary. + This also rebinds some internals in Click to be mocked (like the + prompt functionality). + + This is automatically done in the :meth:`invoke` method. + + .. versionadded:: 4.0 + The ``color`` parameter was added. + + :param input: the input stream to put into sys.stdin. + :param env: the environment overrides as dictionary. + :param color: whether the output should contain color codes. The + application can still override this explicitly. + """ + input = make_input_stream(input, self.charset) + + old_stdin = sys.stdin + old_stdout = sys.stdout + old_stderr = sys.stderr + old_forced_width = clickpkg.formatting.FORCED_WIDTH + clickpkg.formatting.FORCED_WIDTH = 80 + + env = self.make_env(env) + + if PY2: + bytes_output = StringIO() + if self.echo_stdin: + input = EchoingStdin(input, bytes_output) + sys.stdout = bytes_output + if not self.mix_stderr: + bytes_error = StringIO() + sys.stderr = bytes_error + else: + bytes_output = io.BytesIO() + if self.echo_stdin: + input = EchoingStdin(input, bytes_output) + input = io.TextIOWrapper(input, encoding=self.charset) + sys.stdout = io.TextIOWrapper( + bytes_output, encoding=self.charset) + if not self.mix_stderr: + bytes_error = io.BytesIO() + sys.stderr = io.TextIOWrapper( + bytes_error, encoding=self.charset) + + if self.mix_stderr: + sys.stderr = sys.stdout + + sys.stdin = input + + def visible_input(prompt=None): + sys.stdout.write(prompt or '') + val = input.readline().rstrip('\r\n') + sys.stdout.write(val + '\n') + sys.stdout.flush() + return val + + def hidden_input(prompt=None): + sys.stdout.write((prompt or '') + '\n') + sys.stdout.flush() + return input.readline().rstrip('\r\n') + + def _getchar(echo): + char = sys.stdin.read(1) + if echo: + sys.stdout.write(char) + sys.stdout.flush() + return char + + default_color = color + + def should_strip_ansi(stream=None, color=None): + if color is None: + return not default_color + return not color + + old_visible_prompt_func = clickpkg.termui.visible_prompt_func + old_hidden_prompt_func = clickpkg.termui.hidden_prompt_func + old__getchar_func = clickpkg.termui._getchar + old_should_strip_ansi = clickpkg.utils.should_strip_ansi + clickpkg.termui.visible_prompt_func = visible_input + clickpkg.termui.hidden_prompt_func = hidden_input + clickpkg.termui._getchar = _getchar + clickpkg.utils.should_strip_ansi = should_strip_ansi + + old_env = {} + try: + for key, value in iteritems(env): + old_env[key] = os.environ.get(key) + if value is None: + try: + del os.environ[key] + except Exception: + pass + else: + os.environ[key] = value + yield (bytes_output, not self.mix_stderr and bytes_error) + finally: + for key, value in iteritems(old_env): + if value is None: + try: + del os.environ[key] + except Exception: + pass + else: + os.environ[key] = value + sys.stdout = old_stdout + sys.stderr = old_stderr + sys.stdin = old_stdin + clickpkg.termui.visible_prompt_func = old_visible_prompt_func + clickpkg.termui.hidden_prompt_func = old_hidden_prompt_func + clickpkg.termui._getchar = old__getchar_func + clickpkg.utils.should_strip_ansi = old_should_strip_ansi + clickpkg.formatting.FORCED_WIDTH = old_forced_width + + def invoke(self, cli, args=None, input=None, env=None, + catch_exceptions=True, color=False, mix_stderr=False, **extra): + """Invokes a command in an isolated environment. The arguments are + forwarded directly to the command line script, the `extra` keyword + arguments are passed to the :meth:`~clickpkg.Command.main` function of + the command. + + This returns a :class:`Result` object. + + .. versionadded:: 3.0 + The ``catch_exceptions`` parameter was added. + + .. versionchanged:: 3.0 + The result object now has an `exc_info` attribute with the + traceback if available. + + .. versionadded:: 4.0 + The ``color`` parameter was added. + + :param cli: the command to invoke + :param args: the arguments to invoke. It may be given as an iterable + or a string. When given as string it will be interpreted + as a Unix shell command. More details at + :func:`shlex.split`. + :param input: the input data for `sys.stdin`. + :param env: the environment overrides. + :param catch_exceptions: Whether to catch any other exceptions than + ``SystemExit``. + :param extra: the keyword arguments to pass to :meth:`main`. + :param color: whether the output should contain color codes. The + application can still override this explicitly. + """ + exc_info = None + with self.isolation(input=input, env=env, color=color) as outstreams: + exception = None + exit_code = 0 + + if isinstance(args, string_types): + args = shlex.split(args) + + try: + prog_name = extra.pop("prog_name") + except KeyError: + prog_name = self.get_default_prog_name(cli) + + try: + cli.main(args=args or (), prog_name=prog_name, **extra) + except SystemExit as e: + exc_info = sys.exc_info() + exit_code = e.code + if exit_code is None: + exit_code = 0 + + if exit_code != 0: + exception = e + + if not isinstance(exit_code, int): + sys.stdout.write(str(exit_code)) + sys.stdout.write('\n') + exit_code = 1 + + except Exception as e: + if not catch_exceptions: + raise + exception = e + exit_code = 1 + exc_info = sys.exc_info() + finally: + sys.stdout.flush() + stdout = outstreams[0].getvalue() + stderr = outstreams[1] and outstreams[1].getvalue() + + return Result(runner=self, + stdout_bytes=stdout, + stderr_bytes=stderr, + exit_code=exit_code, + exception=exception, + exc_info=exc_info) + + @contextlib.contextmanager + def isolated_filesystem(self): + """A context manager that creates a temporary folder and changes + the current working directory to it for isolated filesystem tests. + """ + cwd = os.getcwd() + t = tempfile.mkdtemp() + os.chdir(t) + try: + yield t + finally: + os.chdir(cwd) + try: + shutil.rmtree(t) + except (OSError, IOError): + pass diff --git a/env/Lib/site-packages/click/types.py b/env/Lib/site-packages/click/types.py new file mode 100644 index 0000000..1f88032 --- /dev/null +++ b/env/Lib/site-packages/click/types.py @@ -0,0 +1,668 @@ +import os +import stat +from datetime import datetime + +from ._compat import open_stream, text_type, filename_to_ui, \ + get_filesystem_encoding, get_streerror, _get_argv_encoding, PY2 +from .exceptions import BadParameter +from .utils import safecall, LazyFile + + +class ParamType(object): + """Helper for converting values through types. The following is + necessary for a valid type: + + * it needs a name + * it needs to pass through None unchanged + * it needs to convert from a string + * it needs to convert its result type through unchanged + (eg: needs to be idempotent) + * it needs to be able to deal with param and context being `None`. + This can be the case when the object is used with prompt + inputs. + """ + is_composite = False + + #: the descriptive name of this type + name = None + + #: if a list of this type is expected and the value is pulled from a + #: string environment variable, this is what splits it up. `None` + #: means any whitespace. For all parameters the general rule is that + #: whitespace splits them up. The exception are paths and files which + #: are split by ``os.path.pathsep`` by default (":" on Unix and ";" on + #: Windows). + envvar_list_splitter = None + + def __call__(self, value, param=None, ctx=None): + if value is not None: + return self.convert(value, param, ctx) + + def get_metavar(self, param): + """Returns the metavar default for this param if it provides one.""" + + def get_missing_message(self, param): + """Optionally might return extra information about a missing + parameter. + + .. versionadded:: 2.0 + """ + + def convert(self, value, param, ctx): + """Converts the value. This is not invoked for values that are + `None` (the missing value). + """ + return value + + def split_envvar_value(self, rv): + """Given a value from an environment variable this splits it up + into small chunks depending on the defined envvar list splitter. + + If the splitter is set to `None`, which means that whitespace splits, + then leading and trailing whitespace is ignored. Otherwise, leading + and trailing splitters usually lead to empty items being included. + """ + return (rv or '').split(self.envvar_list_splitter) + + def fail(self, message, param=None, ctx=None): + """Helper method to fail with an invalid value message.""" + raise BadParameter(message, ctx=ctx, param=param) + + +class CompositeParamType(ParamType): + is_composite = True + + @property + def arity(self): + raise NotImplementedError() + + +class FuncParamType(ParamType): + + def __init__(self, func): + self.name = func.__name__ + self.func = func + + def convert(self, value, param, ctx): + try: + return self.func(value) + except ValueError: + try: + value = text_type(value) + except UnicodeError: + value = str(value).decode('utf-8', 'replace') + self.fail(value, param, ctx) + + +class UnprocessedParamType(ParamType): + name = 'text' + + def convert(self, value, param, ctx): + return value + + def __repr__(self): + return 'UNPROCESSED' + + +class StringParamType(ParamType): + name = 'text' + + def convert(self, value, param, ctx): + if isinstance(value, bytes): + enc = _get_argv_encoding() + try: + value = value.decode(enc) + except UnicodeError: + fs_enc = get_filesystem_encoding() + if fs_enc != enc: + try: + value = value.decode(fs_enc) + except UnicodeError: + value = value.decode('utf-8', 'replace') + return value + return value + + def __repr__(self): + return 'STRING' + + +class Choice(ParamType): + """The choice type allows a value to be checked against a fixed set + of supported values. All of these values have to be strings. + + You should only pass a list or tuple of choices. Other iterables + (like generators) may lead to surprising results. + + See :ref:`choice-opts` for an example. + + :param case_sensitive: Set to false to make choices case + insensitive. Defaults to true. + """ + + name = 'choice' + + def __init__(self, choices, case_sensitive=True): + self.choices = choices + self.case_sensitive = case_sensitive + + def get_metavar(self, param): + return '[%s]' % '|'.join(self.choices) + + def get_missing_message(self, param): + return 'Choose from:\n\t%s.' % ',\n\t'.join(self.choices) + + def convert(self, value, param, ctx): + # Exact match + if value in self.choices: + return value + + # Match through normalization and case sensitivity + # first do token_normalize_func, then lowercase + # preserve original `value` to produce an accurate message in + # `self.fail` + normed_value = value + normed_choices = self.choices + + if ctx is not None and \ + ctx.token_normalize_func is not None: + normed_value = ctx.token_normalize_func(value) + normed_choices = [ctx.token_normalize_func(choice) for choice in + self.choices] + + if not self.case_sensitive: + normed_value = normed_value.lower() + normed_choices = [choice.lower() for choice in normed_choices] + + if normed_value in normed_choices: + return normed_value + + self.fail('invalid choice: %s. (choose from %s)' % + (value, ', '.join(self.choices)), param, ctx) + + def __repr__(self): + return 'Choice(%r)' % list(self.choices) + + +class DateTime(ParamType): + """The DateTime type converts date strings into `datetime` objects. + + The format strings which are checked are configurable, but default to some + common (non-timezone aware) ISO 8601 formats. + + When specifying *DateTime* formats, you should only pass a list or a tuple. + Other iterables, like generators, may lead to surprising results. + + The format strings are processed using ``datetime.strptime``, and this + consequently defines the format strings which are allowed. + + Parsing is tried using each format, in order, and the first format which + parses successfully is used. + + :param formats: A list or tuple of date format strings, in the order in + which they should be tried. Defaults to + ``'%Y-%m-%d'``, ``'%Y-%m-%dT%H:%M:%S'``, + ``'%Y-%m-%d %H:%M:%S'``. + """ + name = 'datetime' + + def __init__(self, formats=None): + self.formats = formats or [ + '%Y-%m-%d', + '%Y-%m-%dT%H:%M:%S', + '%Y-%m-%d %H:%M:%S' + ] + + def get_metavar(self, param): + return '[{}]'.format('|'.join(self.formats)) + + def _try_to_convert_date(self, value, format): + try: + return datetime.strptime(value, format) + except ValueError: + return None + + def convert(self, value, param, ctx): + # Exact match + for format in self.formats: + dtime = self._try_to_convert_date(value, format) + if dtime: + return dtime + + self.fail( + 'invalid datetime format: {}. (choose from {})'.format( + value, ', '.join(self.formats))) + + def __repr__(self): + return 'DateTime' + + +class IntParamType(ParamType): + name = 'integer' + + def convert(self, value, param, ctx): + try: + return int(value) + except (ValueError, UnicodeError): + self.fail('%s is not a valid integer' % value, param, ctx) + + def __repr__(self): + return 'INT' + + +class IntRange(IntParamType): + """A parameter that works similar to :data:`click.INT` but restricts + the value to fit into a range. The default behavior is to fail if the + value falls outside the range, but it can also be silently clamped + between the two edges. + + See :ref:`ranges` for an example. + """ + name = 'integer range' + + def __init__(self, min=None, max=None, clamp=False): + self.min = min + self.max = max + self.clamp = clamp + + def convert(self, value, param, ctx): + rv = IntParamType.convert(self, value, param, ctx) + if self.clamp: + if self.min is not None and rv < self.min: + return self.min + if self.max is not None and rv > self.max: + return self.max + if self.min is not None and rv < self.min or \ + self.max is not None and rv > self.max: + if self.min is None: + self.fail('%s is bigger than the maximum valid value ' + '%s.' % (rv, self.max), param, ctx) + elif self.max is None: + self.fail('%s is smaller than the minimum valid value ' + '%s.' % (rv, self.min), param, ctx) + else: + self.fail('%s is not in the valid range of %s to %s.' + % (rv, self.min, self.max), param, ctx) + return rv + + def __repr__(self): + return 'IntRange(%r, %r)' % (self.min, self.max) + + +class FloatParamType(ParamType): + name = 'float' + + def convert(self, value, param, ctx): + try: + return float(value) + except (UnicodeError, ValueError): + self.fail('%s is not a valid floating point value' % + value, param, ctx) + + def __repr__(self): + return 'FLOAT' + + +class FloatRange(FloatParamType): + """A parameter that works similar to :data:`click.FLOAT` but restricts + the value to fit into a range. The default behavior is to fail if the + value falls outside the range, but it can also be silently clamped + between the two edges. + + See :ref:`ranges` for an example. + """ + name = 'float range' + + def __init__(self, min=None, max=None, clamp=False): + self.min = min + self.max = max + self.clamp = clamp + + def convert(self, value, param, ctx): + rv = FloatParamType.convert(self, value, param, ctx) + if self.clamp: + if self.min is not None and rv < self.min: + return self.min + if self.max is not None and rv > self.max: + return self.max + if self.min is not None and rv < self.min or \ + self.max is not None and rv > self.max: + if self.min is None: + self.fail('%s is bigger than the maximum valid value ' + '%s.' % (rv, self.max), param, ctx) + elif self.max is None: + self.fail('%s is smaller than the minimum valid value ' + '%s.' % (rv, self.min), param, ctx) + else: + self.fail('%s is not in the valid range of %s to %s.' + % (rv, self.min, self.max), param, ctx) + return rv + + def __repr__(self): + return 'FloatRange(%r, %r)' % (self.min, self.max) + + +class BoolParamType(ParamType): + name = 'boolean' + + def convert(self, value, param, ctx): + if isinstance(value, bool): + return bool(value) + value = value.lower() + if value in ('true', 't', '1', 'yes', 'y'): + return True + elif value in ('false', 'f', '0', 'no', 'n'): + return False + self.fail('%s is not a valid boolean' % value, param, ctx) + + def __repr__(self): + return 'BOOL' + + +class UUIDParameterType(ParamType): + name = 'uuid' + + def convert(self, value, param, ctx): + import uuid + try: + if PY2 and isinstance(value, text_type): + value = value.encode('ascii') + return uuid.UUID(value) + except (UnicodeError, ValueError): + self.fail('%s is not a valid UUID value' % value, param, ctx) + + def __repr__(self): + return 'UUID' + + +class File(ParamType): + """Declares a parameter to be a file for reading or writing. The file + is automatically closed once the context tears down (after the command + finished working). + + Files can be opened for reading or writing. The special value ``-`` + indicates stdin or stdout depending on the mode. + + By default, the file is opened for reading text data, but it can also be + opened in binary mode or for writing. The encoding parameter can be used + to force a specific encoding. + + The `lazy` flag controls if the file should be opened immediately or upon + first IO. The default is to be non-lazy for standard input and output + streams as well as files opened for reading, `lazy` otherwise. When opening a + file lazily for reading, it is still opened temporarily for validation, but + will not be held open until first IO. lazy is mainly useful when opening + for writing to avoid creating the file until it is needed. + + Starting with Click 2.0, files can also be opened atomically in which + case all writes go into a separate file in the same folder and upon + completion the file will be moved over to the original location. This + is useful if a file regularly read by other users is modified. + + See :ref:`file-args` for more information. + """ + name = 'filename' + envvar_list_splitter = os.path.pathsep + + def __init__(self, mode='r', encoding=None, errors='strict', lazy=None, + atomic=False): + self.mode = mode + self.encoding = encoding + self.errors = errors + self.lazy = lazy + self.atomic = atomic + + def resolve_lazy_flag(self, value): + if self.lazy is not None: + return self.lazy + if value == '-': + return False + elif 'w' in self.mode: + return True + return False + + def convert(self, value, param, ctx): + try: + if hasattr(value, 'read') or hasattr(value, 'write'): + return value + + lazy = self.resolve_lazy_flag(value) + + if lazy: + f = LazyFile(value, self.mode, self.encoding, self.errors, + atomic=self.atomic) + if ctx is not None: + ctx.call_on_close(f.close_intelligently) + return f + + f, should_close = open_stream(value, self.mode, + self.encoding, self.errors, + atomic=self.atomic) + # If a context is provided, we automatically close the file + # at the end of the context execution (or flush out). If a + # context does not exist, it's the caller's responsibility to + # properly close the file. This for instance happens when the + # type is used with prompts. + if ctx is not None: + if should_close: + ctx.call_on_close(safecall(f.close)) + else: + ctx.call_on_close(safecall(f.flush)) + return f + except (IOError, OSError) as e: + self.fail('Could not open file: %s: %s' % ( + filename_to_ui(value), + get_streerror(e), + ), param, ctx) + + +class Path(ParamType): + """The path type is similar to the :class:`File` type but it performs + different checks. First of all, instead of returning an open file + handle it returns just the filename. Secondly, it can perform various + basic checks about what the file or directory should be. + + .. versionchanged:: 6.0 + `allow_dash` was added. + + :param exists: if set to true, the file or directory needs to exist for + this value to be valid. If this is not required and a + file does indeed not exist, then all further checks are + silently skipped. + :param file_okay: controls if a file is a possible value. + :param dir_okay: controls if a directory is a possible value. + :param writable: if true, a writable check is performed. + :param readable: if true, a readable check is performed. + :param resolve_path: if this is true, then the path is fully resolved + before the value is passed onwards. This means + that it's absolute and symlinks are resolved. It + will not expand a tilde-prefix, as this is + supposed to be done by the shell only. + :param allow_dash: If this is set to `True`, a single dash to indicate + standard streams is permitted. + :param path_type: optionally a string type that should be used to + represent the path. The default is `None` which + means the return value will be either bytes or + unicode depending on what makes most sense given the + input data Click deals with. + """ + envvar_list_splitter = os.path.pathsep + + def __init__(self, exists=False, file_okay=True, dir_okay=True, + writable=False, readable=True, resolve_path=False, + allow_dash=False, path_type=None): + self.exists = exists + self.file_okay = file_okay + self.dir_okay = dir_okay + self.writable = writable + self.readable = readable + self.resolve_path = resolve_path + self.allow_dash = allow_dash + self.type = path_type + + if self.file_okay and not self.dir_okay: + self.name = 'file' + self.path_type = 'File' + elif self.dir_okay and not self.file_okay: + self.name = 'directory' + self.path_type = 'Directory' + else: + self.name = 'path' + self.path_type = 'Path' + + def coerce_path_result(self, rv): + if self.type is not None and not isinstance(rv, self.type): + if self.type is text_type: + rv = rv.decode(get_filesystem_encoding()) + else: + rv = rv.encode(get_filesystem_encoding()) + return rv + + def convert(self, value, param, ctx): + rv = value + + is_dash = self.file_okay and self.allow_dash and rv in (b'-', '-') + + if not is_dash: + if self.resolve_path: + rv = os.path.realpath(rv) + + try: + st = os.stat(rv) + except OSError: + if not self.exists: + return self.coerce_path_result(rv) + self.fail('%s "%s" does not exist.' % ( + self.path_type, + filename_to_ui(value) + ), param, ctx) + + if not self.file_okay and stat.S_ISREG(st.st_mode): + self.fail('%s "%s" is a file.' % ( + self.path_type, + filename_to_ui(value) + ), param, ctx) + if not self.dir_okay and stat.S_ISDIR(st.st_mode): + self.fail('%s "%s" is a directory.' % ( + self.path_type, + filename_to_ui(value) + ), param, ctx) + if self.writable and not os.access(value, os.W_OK): + self.fail('%s "%s" is not writable.' % ( + self.path_type, + filename_to_ui(value) + ), param, ctx) + if self.readable and not os.access(value, os.R_OK): + self.fail('%s "%s" is not readable.' % ( + self.path_type, + filename_to_ui(value) + ), param, ctx) + + return self.coerce_path_result(rv) + + +class Tuple(CompositeParamType): + """The default behavior of Click is to apply a type on a value directly. + This works well in most cases, except for when `nargs` is set to a fixed + count and different types should be used for different items. In this + case the :class:`Tuple` type can be used. This type can only be used + if `nargs` is set to a fixed number. + + For more information see :ref:`tuple-type`. + + This can be selected by using a Python tuple literal as a type. + + :param types: a list of types that should be used for the tuple items. + """ + + def __init__(self, types): + self.types = [convert_type(ty) for ty in types] + + @property + def name(self): + return "<" + " ".join(ty.name for ty in self.types) + ">" + + @property + def arity(self): + return len(self.types) + + def convert(self, value, param, ctx): + if len(value) != len(self.types): + raise TypeError('It would appear that nargs is set to conflict ' + 'with the composite type arity.') + return tuple(ty(x, param, ctx) for ty, x in zip(self.types, value)) + + +def convert_type(ty, default=None): + """Converts a callable or python ty into the most appropriate param + ty. + """ + guessed_type = False + if ty is None and default is not None: + if isinstance(default, tuple): + ty = tuple(map(type, default)) + else: + ty = type(default) + guessed_type = True + + if isinstance(ty, tuple): + return Tuple(ty) + if isinstance(ty, ParamType): + return ty + if ty is text_type or ty is str or ty is None: + return STRING + if ty is int: + return INT + # Booleans are only okay if not guessed. This is done because for + # flags the default value is actually a bit of a lie in that it + # indicates which of the flags is the one we want. See get_default() + # for more information. + if ty is bool and not guessed_type: + return BOOL + if ty is float: + return FLOAT + if guessed_type: + return STRING + + # Catch a common mistake + if __debug__: + try: + if issubclass(ty, ParamType): + raise AssertionError('Attempted to use an uninstantiated ' + 'parameter type (%s).' % ty) + except TypeError: + pass + return FuncParamType(ty) + + +#: A dummy parameter type that just does nothing. From a user's +#: perspective this appears to just be the same as `STRING` but internally +#: no string conversion takes place. This is necessary to achieve the +#: same bytes/unicode behavior on Python 2/3 in situations where you want +#: to not convert argument types. This is usually useful when working +#: with file paths as they can appear in bytes and unicode. +#: +#: For path related uses the :class:`Path` type is a better choice but +#: there are situations where an unprocessed type is useful which is why +#: it is is provided. +#: +#: .. versionadded:: 4.0 +UNPROCESSED = UnprocessedParamType() + +#: A unicode string parameter type which is the implicit default. This +#: can also be selected by using ``str`` as type. +STRING = StringParamType() + +#: An integer parameter. This can also be selected by using ``int`` as +#: type. +INT = IntParamType() + +#: A floating point value parameter. This can also be selected by using +#: ``float`` as type. +FLOAT = FloatParamType() + +#: A boolean parameter. This is the default for boolean flags. This can +#: also be selected by using ``bool`` as a type. +BOOL = BoolParamType() + +#: A UUID parameter. +UUID = UUIDParameterType() diff --git a/env/Lib/site-packages/click/utils.py b/env/Lib/site-packages/click/utils.py new file mode 100644 index 0000000..fc84369 --- /dev/null +++ b/env/Lib/site-packages/click/utils.py @@ -0,0 +1,440 @@ +import os +import sys + +from .globals import resolve_color_default + +from ._compat import text_type, open_stream, get_filesystem_encoding, \ + get_streerror, string_types, PY2, binary_streams, text_streams, \ + filename_to_ui, auto_wrap_for_ansi, strip_ansi, should_strip_ansi, \ + _default_text_stdout, _default_text_stderr, is_bytes, WIN + +if not PY2: + from ._compat import _find_binary_writer +elif WIN: + from ._winconsole import _get_windows_argv, \ + _hash_py_argv, _initial_argv_hash + + +echo_native_types = string_types + (bytes, bytearray) + + +def _posixify(name): + return '-'.join(name.split()).lower() + + +def safecall(func): + """Wraps a function so that it swallows exceptions.""" + def wrapper(*args, **kwargs): + try: + return func(*args, **kwargs) + except Exception: + pass + return wrapper + + +def make_str(value): + """Converts a value into a valid string.""" + if isinstance(value, bytes): + try: + return value.decode(get_filesystem_encoding()) + except UnicodeError: + return value.decode('utf-8', 'replace') + return text_type(value) + + +def make_default_short_help(help, max_length=45): + """Return a condensed version of help string.""" + words = help.split() + total_length = 0 + result = [] + done = False + + for word in words: + if word[-1:] == '.': + done = True + new_length = result and 1 + len(word) or len(word) + if total_length + new_length > max_length: + result.append('...') + done = True + else: + if result: + result.append(' ') + result.append(word) + if done: + break + total_length += new_length + + return ''.join(result) + + +class LazyFile(object): + """A lazy file works like a regular file but it does not fully open + the file but it does perform some basic checks early to see if the + filename parameter does make sense. This is useful for safely opening + files for writing. + """ + + def __init__(self, filename, mode='r', encoding=None, errors='strict', + atomic=False): + self.name = filename + self.mode = mode + self.encoding = encoding + self.errors = errors + self.atomic = atomic + + if filename == '-': + self._f, self.should_close = open_stream(filename, mode, + encoding, errors) + else: + if 'r' in mode: + # Open and close the file in case we're opening it for + # reading so that we can catch at least some errors in + # some cases early. + open(filename, mode).close() + self._f = None + self.should_close = True + + def __getattr__(self, name): + return getattr(self.open(), name) + + def __repr__(self): + if self._f is not None: + return repr(self._f) + return '' % (self.name, self.mode) + + def open(self): + """Opens the file if it's not yet open. This call might fail with + a :exc:`FileError`. Not handling this error will produce an error + that Click shows. + """ + if self._f is not None: + return self._f + try: + rv, self.should_close = open_stream(self.name, self.mode, + self.encoding, + self.errors, + atomic=self.atomic) + except (IOError, OSError) as e: + from .exceptions import FileError + raise FileError(self.name, hint=get_streerror(e)) + self._f = rv + return rv + + def close(self): + """Closes the underlying file, no matter what.""" + if self._f is not None: + self._f.close() + + def close_intelligently(self): + """This function only closes the file if it was opened by the lazy + file wrapper. For instance this will never close stdin. + """ + if self.should_close: + self.close() + + def __enter__(self): + return self + + def __exit__(self, exc_type, exc_value, tb): + self.close_intelligently() + + def __iter__(self): + self.open() + return iter(self._f) + + +class KeepOpenFile(object): + + def __init__(self, file): + self._file = file + + def __getattr__(self, name): + return getattr(self._file, name) + + def __enter__(self): + return self + + def __exit__(self, exc_type, exc_value, tb): + pass + + def __repr__(self): + return repr(self._file) + + def __iter__(self): + return iter(self._file) + + +def echo(message=None, file=None, nl=True, err=False, color=None): + """Prints a message plus a newline to the given file or stdout. On + first sight, this looks like the print function, but it has improved + support for handling Unicode and binary data that does not fail no + matter how badly configured the system is. + + Primarily it means that you can print binary data as well as Unicode + data on both 2.x and 3.x to the given file in the most appropriate way + possible. This is a very carefree function in that it will try its + best to not fail. As of Click 6.0 this includes support for unicode + output on the Windows console. + + In addition to that, if `colorama`_ is installed, the echo function will + also support clever handling of ANSI codes. Essentially it will then + do the following: + + - add transparent handling of ANSI color codes on Windows. + - hide ANSI codes automatically if the destination file is not a + terminal. + + .. _colorama: https://pypi.org/project/colorama/ + + .. versionchanged:: 6.0 + As of Click 6.0 the echo function will properly support unicode + output on the windows console. Not that click does not modify + the interpreter in any way which means that `sys.stdout` or the + print statement or function will still not provide unicode support. + + .. versionchanged:: 2.0 + Starting with version 2.0 of Click, the echo function will work + with colorama if it's installed. + + .. versionadded:: 3.0 + The `err` parameter was added. + + .. versionchanged:: 4.0 + Added the `color` flag. + + :param message: the message to print + :param file: the file to write to (defaults to ``stdout``) + :param err: if set to true the file defaults to ``stderr`` instead of + ``stdout``. This is faster and easier than calling + :func:`get_text_stderr` yourself. + :param nl: if set to `True` (the default) a newline is printed afterwards. + :param color: controls if the terminal supports ANSI colors or not. The + default is autodetection. + """ + if file is None: + if err: + file = _default_text_stderr() + else: + file = _default_text_stdout() + + # Convert non bytes/text into the native string type. + if message is not None and not isinstance(message, echo_native_types): + message = text_type(message) + + if nl: + message = message or u'' + if isinstance(message, text_type): + message += u'\n' + else: + message += b'\n' + + # If there is a message, and we're in Python 3, and the value looks + # like bytes, we manually need to find the binary stream and write the + # message in there. This is done separately so that most stream + # types will work as you would expect. Eg: you can write to StringIO + # for other cases. + if message and not PY2 and is_bytes(message): + binary_file = _find_binary_writer(file) + if binary_file is not None: + file.flush() + binary_file.write(message) + binary_file.flush() + return + + # ANSI-style support. If there is no message or we are dealing with + # bytes nothing is happening. If we are connected to a file we want + # to strip colors. If we are on windows we either wrap the stream + # to strip the color or we use the colorama support to translate the + # ansi codes to API calls. + if message and not is_bytes(message): + color = resolve_color_default(color) + if should_strip_ansi(file, color): + message = strip_ansi(message) + elif WIN: + if auto_wrap_for_ansi is not None: + file = auto_wrap_for_ansi(file) + elif not color: + message = strip_ansi(message) + + if message: + file.write(message) + file.flush() + + +def get_binary_stream(name): + """Returns a system stream for byte processing. This essentially + returns the stream from the sys module with the given name but it + solves some compatibility issues between different Python versions. + Primarily this function is necessary for getting binary streams on + Python 3. + + :param name: the name of the stream to open. Valid names are ``'stdin'``, + ``'stdout'`` and ``'stderr'`` + """ + opener = binary_streams.get(name) + if opener is None: + raise TypeError('Unknown standard stream %r' % name) + return opener() + + +def get_text_stream(name, encoding=None, errors='strict'): + """Returns a system stream for text processing. This usually returns + a wrapped stream around a binary stream returned from + :func:`get_binary_stream` but it also can take shortcuts on Python 3 + for already correctly configured streams. + + :param name: the name of the stream to open. Valid names are ``'stdin'``, + ``'stdout'`` and ``'stderr'`` + :param encoding: overrides the detected default encoding. + :param errors: overrides the default error mode. + """ + opener = text_streams.get(name) + if opener is None: + raise TypeError('Unknown standard stream %r' % name) + return opener(encoding, errors) + + +def open_file(filename, mode='r', encoding=None, errors='strict', + lazy=False, atomic=False): + """This is similar to how the :class:`File` works but for manual + usage. Files are opened non lazy by default. This can open regular + files as well as stdin/stdout if ``'-'`` is passed. + + If stdin/stdout is returned the stream is wrapped so that the context + manager will not close the stream accidentally. This makes it possible + to always use the function like this without having to worry to + accidentally close a standard stream:: + + with open_file(filename) as f: + ... + + .. versionadded:: 3.0 + + :param filename: the name of the file to open (or ``'-'`` for stdin/stdout). + :param mode: the mode in which to open the file. + :param encoding: the encoding to use. + :param errors: the error handling for this file. + :param lazy: can be flipped to true to open the file lazily. + :param atomic: in atomic mode writes go into a temporary file and it's + moved on close. + """ + if lazy: + return LazyFile(filename, mode, encoding, errors, atomic=atomic) + f, should_close = open_stream(filename, mode, encoding, errors, + atomic=atomic) + if not should_close: + f = KeepOpenFile(f) + return f + + +def get_os_args(): + """This returns the argument part of sys.argv in the most appropriate + form for processing. What this means is that this return value is in + a format that works for Click to process but does not necessarily + correspond well to what's actually standard for the interpreter. + + On most environments the return value is ``sys.argv[:1]`` unchanged. + However if you are on Windows and running Python 2 the return value + will actually be a list of unicode strings instead because the + default behavior on that platform otherwise will not be able to + carry all possible values that sys.argv can have. + + .. versionadded:: 6.0 + """ + # We can only extract the unicode argv if sys.argv has not been + # changed since the startup of the application. + if PY2 and WIN and _initial_argv_hash == _hash_py_argv(): + return _get_windows_argv() + return sys.argv[1:] + + +def format_filename(filename, shorten=False): + """Formats a filename for user display. The main purpose of this + function is to ensure that the filename can be displayed at all. This + will decode the filename to unicode if necessary in a way that it will + not fail. Optionally, it can shorten the filename to not include the + full path to the filename. + + :param filename: formats a filename for UI display. This will also convert + the filename into unicode without failing. + :param shorten: this optionally shortens the filename to strip of the + path that leads up to it. + """ + if shorten: + filename = os.path.basename(filename) + return filename_to_ui(filename) + + +def get_app_dir(app_name, roaming=True, force_posix=False): + r"""Returns the config folder for the application. The default behavior + is to return whatever is most appropriate for the operating system. + + To give you an idea, for an app called ``"Foo Bar"``, something like + the following folders could be returned: + + Mac OS X: + ``~/Library/Application Support/Foo Bar`` + Mac OS X (POSIX): + ``~/.foo-bar`` + Unix: + ``~/.config/foo-bar`` + Unix (POSIX): + ``~/.foo-bar`` + Win XP (roaming): + ``C:\Documents and Settings\\Local Settings\Application Data\Foo Bar`` + Win XP (not roaming): + ``C:\Documents and Settings\\Application Data\Foo Bar`` + Win 7 (roaming): + ``C:\Users\\AppData\Roaming\Foo Bar`` + Win 7 (not roaming): + ``C:\Users\\AppData\Local\Foo Bar`` + + .. versionadded:: 2.0 + + :param app_name: the application name. This should be properly capitalized + and can contain whitespace. + :param roaming: controls if the folder should be roaming or not on Windows. + Has no affect otherwise. + :param force_posix: if this is set to `True` then on any POSIX system the + folder will be stored in the home folder with a leading + dot instead of the XDG config home or darwin's + application support folder. + """ + if WIN: + key = roaming and 'APPDATA' or 'LOCALAPPDATA' + folder = os.environ.get(key) + if folder is None: + folder = os.path.expanduser('~') + return os.path.join(folder, app_name) + if force_posix: + return os.path.join(os.path.expanduser('~/.' + _posixify(app_name))) + if sys.platform == 'darwin': + return os.path.join(os.path.expanduser( + '~/Library/Application Support'), app_name) + return os.path.join( + os.environ.get('XDG_CONFIG_HOME', os.path.expanduser('~/.config')), + _posixify(app_name)) + + +class PacifyFlushWrapper(object): + """This wrapper is used to catch and suppress BrokenPipeErrors resulting + from ``.flush()`` being called on broken pipe during the shutdown/final-GC + of the Python interpreter. Notably ``.flush()`` is always called on + ``sys.stdout`` and ``sys.stderr``. So as to have minimal impact on any + other cleanup code, and the case where the underlying file is not a broken + pipe, all calls and attributes are proxied. + """ + + def __init__(self, wrapped): + self.wrapped = wrapped + + def flush(self): + try: + self.wrapped.flush() + except IOError as e: + import errno + if e.errno != errno.EPIPE: + raise + + def __getattr__(self, attr): + return getattr(self.wrapped, attr) diff --git a/env/Lib/site-packages/easy_install.py b/env/Lib/site-packages/easy_install.py new file mode 100644 index 0000000..d87e984 --- /dev/null +++ b/env/Lib/site-packages/easy_install.py @@ -0,0 +1,5 @@ +"""Run the EasyInstall command""" + +if __name__ == '__main__': + from setuptools.command.easy_install import main + main() diff --git a/env/Lib/site-packages/flask/__init__.py b/env/Lib/site-packages/flask/__init__.py new file mode 100644 index 0000000..687475b --- /dev/null +++ b/env/Lib/site-packages/flask/__init__.py @@ -0,0 +1,60 @@ +# -*- coding: utf-8 -*- +""" + flask + ~~~~~ + + A microframework based on Werkzeug. It's extensively documented + and follows best practice patterns. + + :copyright: 2010 Pallets + :license: BSD-3-Clause +""" +# utilities we import from Werkzeug and Jinja2 that are unused +# in the module but are exported as public interface. +from jinja2 import escape +from jinja2 import Markup +from werkzeug.exceptions import abort +from werkzeug.utils import redirect + +from . import json +from ._compat import json_available +from .app import Flask +from .app import Request +from .app import Response +from .blueprints import Blueprint +from .config import Config +from .ctx import after_this_request +from .ctx import copy_current_request_context +from .ctx import has_app_context +from .ctx import has_request_context +from .globals import _app_ctx_stack +from .globals import _request_ctx_stack +from .globals import current_app +from .globals import g +from .globals import request +from .globals import session +from .helpers import flash +from .helpers import get_flashed_messages +from .helpers import get_template_attribute +from .helpers import make_response +from .helpers import safe_join +from .helpers import send_file +from .helpers import send_from_directory +from .helpers import stream_with_context +from .helpers import url_for +from .json import jsonify +from .signals import appcontext_popped +from .signals import appcontext_pushed +from .signals import appcontext_tearing_down +from .signals import before_render_template +from .signals import got_request_exception +from .signals import message_flashed +from .signals import request_finished +from .signals import request_started +from .signals import request_tearing_down +from .signals import signals_available +from .signals import template_rendered +from .templating import render_template +from .templating import render_template_string + +__version__ = "1.1.1" diff --git a/env/Lib/site-packages/flask/__main__.py b/env/Lib/site-packages/flask/__main__.py new file mode 100644 index 0000000..f61dbc0 --- /dev/null +++ b/env/Lib/site-packages/flask/__main__.py @@ -0,0 +1,15 @@ +# -*- coding: utf-8 -*- +""" + flask.__main__ + ~~~~~~~~~~~~~~ + + Alias for flask.run for the command line. + + :copyright: 2010 Pallets + :license: BSD-3-Clause +""" + +if __name__ == "__main__": + from .cli import main + + main(as_module=True) diff --git a/env/Lib/site-packages/flask/__pycache__/__init__.cpython-37.pyc b/env/Lib/site-packages/flask/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1a96c49af0e619d2e537c7d5a96c2bd9644d24ba GIT binary patch literal 2119 zcmbuATTdHD6vu6hS!}S4F&M&ixnqLOB?(PvRW%S*s+3k$lB&|FtI>FOY%k1SIy2^y zhkl=ahf4h(y!I(C{Q!OHIb%B@Ub~k6{_QzuX3m^5>pd$J@+rK2`Rkuw+fFL=H{A@c z5rl8>tCx`c6r}vLKO)oN2#lnOGsqdpSRR$5VHUEMvvMqSz(F4K9XTH6AZK}8=EDh? zu$+^VVF3!3^T3{UW7%*+s5F&GMSeg?q4Pd0jpY_hH}i z267$hmN$_b(6GFPd;kZQw~-Iw(DDxQ5gb|GMLvdO%QfU@@XYca@^g4@`6==Xcwu=T z`2jexxTdYJ6(B;uiY^4RNPiP6xXr3 zbX!~t-;E>pXQ3`Xie9JTy5E@{?TQ;CA{|@_dF%SI*9%2tgl{L|k?*!+DdTJHwuClr zqPS-QPq+y;MyN2e$A?FU?vGqbVYHp)RN{z8i&OXP{hRu;`nlvi zE%Kk}#MjbyV?uj85k%i}b=gahvb+^5gD|dyA1L9OPw9U2=!K3WbQI~A@hcuk-jXyr z`z_T0!FeZs>tVJu{GHHAjB6w3&SXy{Du~E2b{JTO(rG??Lmx!4agH%uGuQGV0+Q4g#W!^Ln`3`$dO&V53T z7Fq{(>se}e7u_=*VVJ!UJ`2&$J3^zqN_Hc{L~vtelw-{5=MhPCW>%ep$?9%Be$=b2P2!}cov?;iZdl}S> zC2^7n|FN;ByVf}OAkqkqUFtADzNW0IErAnL){#$*8te-_vz_?9H{!+`Xg|g2AGtp$$8u@XTY_%+T~GiLwql5trEW2PdvP%w>?9odG9(oM-is2~PrT z@MHF~WBc)ErLGth0^V8-} z8ePo~@6VdAljIFIy!kfvxNLsFv(`+4q#i_gM5L@oC#rMEZrV-zpF2>-@JJcP8p-Y5 d_*Y@<_oVomYODceG&7mDpOL|D|L*_m$bU=CP)Gm( literal 0 HcmV?d00001 diff --git a/env/Lib/site-packages/flask/__pycache__/__main__.cpython-37.pyc b/env/Lib/site-packages/flask/__pycache__/__main__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3babfdf92a5593bc1020c333f04e6d1e8e525d92 GIT binary patch literal 411 zcmY*WO-chX6i#Nwwhs0V!G$o3DOJJ6AYy-(MTFK(jf5~s+t4Hvk||gh-atHur|=%L zb>+qbxDYdAyYPd2?}zuo_ud z3{*G|A>bj4*ue{gfVHL|X+OQj$YUX?TlWZ2RA@q))bl^YO>Q6sb!bu8U4z}|CMs7P z<%LpIGbDxPy}$A-FU;18<*LlkS^u<;ZmE>Kbj@Fx6gk(9XJ|Mbr|0QN(v9PB)!D1~ zgno_$R#7c#mcaQTbwm|xBl%4dRc%68krPrkXsWpP!dwblui*{Ywl@uZPevKObKE*S zn-1~7m@zFWo)kHic*d2%MwnD+S9)=&zOc(ad0gOTBRk$J>X~iTx%`uGRUg8&JVikV G9tFQ#;&tl) literal 0 HcmV?d00001 diff --git a/env/Lib/site-packages/flask/__pycache__/_compat.cpython-37.pyc b/env/Lib/site-packages/flask/__pycache__/_compat.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..bd72b29a350405e05732ce00ce22bbc2a81021aa GIT binary patch literal 4616 zcmbVPNpsxB6-EP?mBSH5QKYC9TIorNV_J$FhmlwkRn8)Hb*{zV_VPYHv2Xwg5Jrg5#QamIC@HJM;5I%ne=H&*qg!A+iftu@W=8Ifz| zMM30Rdb21>qKtmvnHF3#HBnhD%il7MUQwW3Ek=6)2VQ7_{#+AA^mm?DmJlfk>-dR>;CEXXmbqXD|~=gUbE&IVK&EupYg#AS2e?RqK|6` zxQ6?<&hEo?t~n;o^OM^Q_=fo@NHxw!_-XVP_-ON@xFi@K+t&ZW;_=EAnHI^A3EcDlE%bgQ@M z`Ci<$qP0#Zl(DtwM1oskU^!M4ORv+x7Y{cAb$(sQ$irILvLbKOib88cU^SSCtz~Cj zSaE1^(GkHef{t*#mgid8IfVmfy||w8Gwp_*uJo3c<7w;G)O%Cb6UX;O9I1`dzUPV{ z64Tbq+=I#6le50F7K!rL7v1|yTf`*LZ@-fS%>R%}%;h{4z!wxew`#a>NMOfMEPF;_)5B3Ahxt1`EX z?>r3(0N(?#EMk9>Uw8a90nC!p!*RGT{NK29;Jp1^s4woKhG5kt5x3TS-;qlZoB}h& zIe1sF^!QVkG(->eeQlAl+iQX6hFri8@*qm!hCnLvUdmsBV_bQTmQOxy)Bmv3wh?(dH zz$5KT?Mv3e%?!O1xgKlV#!Eno0FGPQ({@Y$L;lR|nlO3c7%i=-Scdy!4oO{4+`8qTS&#H5X>W+?}f;sdc^+cQLfqDEuA z+FSXnXQvtA^Dj#I!$Il6_C43zXU{ohG8$ zC7QCz5;GEhOMRq3F&B zS?>+*a;4T9wVb?$b$OitMV?ft?>3Ey$$fxCm6XMQg{BY|S6@Q2 z+_#&b=ivr96zE0td0ygW^aYgkMLq!6s3a%s2cjc|iv+`G!q7hw?Mk*YAi~)j+|;<8 zb;{;j2B4l9v3F276UDn1kOORBYnFOVa)C34#Db5e8~e5+1(Lay zd{n|9b~ImmiJZ2=wzL&JHaPO|pNz~^&4wg%OF9Rul~FmmtG-wlKINSaM+Uf0kn?CH ze~eAZ@UCW2Nk2>1GjEn35+oj~poe;DN(RzgTCy;* zleWTE>A!(BK=dBgQq^YRlndi!ArG^VM?8II+pn;Dmj~7xJ;H<9^glC^UJl1FA@37c zhqM3|0_5yJyp09g)VC!Wrmu&+0s?w~7LMwGrS5fzGJI(f0btvIJV5&xPfE8nYNf+@ z!097qP81#e;QC95HRU?&ieuQ1?XzE@?&dC>ZMU!4hE4`8QuWuy^ z1KU}5Jl|RLMK5=&K2@J03)krG}f?-9Mq{%a#Kp1io#EZH7Mn#M0+QphT(q!f$I z*rv-12^U$nl2%1(CQ1x1h!fKfgQa8;LxJebR!R+AvJa&Ur92ICl2V@>Bfi_@% literal 0 HcmV?d00001 diff --git a/env/Lib/site-packages/flask/__pycache__/app.cpython-37.pyc b/env/Lib/site-packages/flask/__pycache__/app.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0a5ae0423e04d355a71deb96d49ecde5c0bd64c6 GIT binary patch literal 74556 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 literal 0 HcmV?d00001 diff --git a/env/Lib/site-packages/flask/__pycache__/config.cpython-37.pyc b/env/Lib/site-packages/flask/__pycache__/config.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6600a5c9b54bce0bc1296410251fa2e8eab0b99d GIT binary patch literal 10156 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 K4OVj(F8vQg=SbuL literal 0 HcmV?d00001 diff --git a/env/Lib/site-packages/flask/__pycache__/ctx.cpython-37.pyc b/env/Lib/site-packages/flask/__pycache__/ctx.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1e395744522ae863dd77d5b0d095c5d2a9877e87 GIT binary patch literal 14317 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 aJb;DIGY67+Z literal 0 HcmV?d00001 diff --git a/env/Lib/site-packages/flask/__pycache__/globals.cpython-37.pyc b/env/Lib/site-packages/flask/__pycache__/globals.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ef87abd0f55edaccae092d4f83b148442bf48c6f GIT binary patch literal 1723 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 R`RwtT$7a4Bdn`Nt{{gZNeTD!4 literal 0 HcmV?d00001 diff --git a/env/Lib/site-packages/flask/__pycache__/logging.cpython-37.pyc b/env/Lib/site-packages/flask/__pycache__/logging.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5f325de4b211e25dd4859287e885fc98a982884a GIT binary patch literal 3118 zcmZuzOK%&=5uP3nUn5esl`OJ(cYruD0h#OU0zMFekXW*JlL(FhX=8vZgB(pa$&rRL zbazt}xsnfA14#}!=8}_iOpZC_66Al(HK)Dg2ka?d^$clS&JgU^RCiZ>RrS?8YBqfb z&lmsx?~8vl9OpkYSw3Y9eu2OKJsRP39l?Yfv$5NC8I4PEsavwW*Y#{)?v~Meab;ZX zRv}XsmAE#pck9fNRZ$hS*Une0>x;VZUpw73S-NUS|C)81vU#Lk|4)kd|PKU!N8Tzl@etf?Zrjxmfh9lGAA3yl{1O6^T6XxOgT4Eo+~19Zsh0lNu*+$&>{f8B(|BrRFB(r$Wu9Wq-%rCJex}m%`PVEL zt19_&Dzyn|+wyTS*u`Ie8;x<)x^YgJVBd8P9OIsl+HUX{9PlJc1UDne$Eh|vm`qeU zQBhzdmrA9IYolZ^<^v2#3IfnMFj1Pc`L6~%;Kk)W#}jEDgeE$ZTO3eulk$FlriW46 zo~8T!EuP{OHH)<5uoSQLT(`9m5a{>YzC8uU&eJIm(_|10r%KXH@pP8(P6(KFr(fXQ zKCsGt79=8;3Ww9SaWLnzAThYzo<`T05j0zxkXvN6C;0#uOf|g52T?3J>=aRGR<~PI zIc~6rg+a1uc@d~jryD%vHmlXulLYgI9JZK^C$F|?EK>krgjYbgEK$?3ioyGf}OZ~$hfbVYEuSbUeXVrQSV){ zm+Q|R;UPfFi@)xUWO&M>0mUBtMDfK(xx0Ck*oZ7t=HV!?D}mv&D2@v;60wjD5tRu= zp^GD~D{mx;|OIIN6T8#3yY%glLncIGlRSR2MOo8MIR}%4kQ{NuSM4nI7PK(aX z0bcxc6zHBkpjYf{Z^y(3dZ)eGaQLKE&hEUYcvcFMc~&d->8wtf9t@G`S!IGGNDP#! zZWJOyBeyACZ)P`TwMRv>Lm7foEZZOvt4}{=>)%(53d$&wdA4EZ`p zr|>^nzxibv3+uAW%`H9~Md1k0!Se|i-R3rGZ;ndaCSYOEDtPiru1D!KMyk^X&l$8r zon9)|1_64cV^&*U)mm3X=~*3gx^F9j`T^!Pr?T2CPzfN@nMb3nk|UFqZG7ZOU4v)$ zscvLt>vzkDnGa`umY1>YRzW38MsIoD5`f7Q{fD@$>ytJ)oHsMS8RF{<--r3zUqf1d z4~^4ocs}#p+stELY2B^34c2gLSW%mJ+uF#gy`D(JUN7@|y}{JrE34O2M6%XiMHHca zjHbIjlj?LKr$aatg+@`S%c{dTJx0~BA13xwAh)aePNb=yk!%A9Jh34I8q4adp~cXu p^OjNeTgGx)Z96XtJH%zyD9@TuV>P$oHcE|V?E@d?HN4vT{{R^0j2Hj_ literal 0 HcmV?d00001 diff --git a/env/Lib/site-packages/flask/__pycache__/sessions.cpython-37.pyc b/env/Lib/site-packages/flask/__pycache__/sessions.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7ed532ee436a358c67e275abc71cb4ef2b45f0ab GIT binary patch literal 12215 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 P?e|tzSN<$_znK3&(@-hW literal 0 HcmV?d00001 diff --git a/env/Lib/site-packages/flask/__pycache__/signals.cpython-37.pyc b/env/Lib/site-packages/flask/__pycache__/signals.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3771aad9d124d5c3a5a9661fb9baef1e88be51ae GIT binary patch literal 2396 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 literal 0 HcmV?d00001 diff --git a/env/Lib/site-packages/flask/__pycache__/testing.cpython-37.pyc b/env/Lib/site-packages/flask/__pycache__/testing.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3aa878f877c4235d264d17bf2b6efebf07cf06c4 GIT binary patch literal 8682 zcmb_h&2QXDcIQ`jvs4eTJnY=B^nK_KO{xdcdZ4wA$E4FSSyfFKJ5Ib?5x9P)d`kM7oZ z204ThtBY0StEyM;@y|~zraDDhs|Mla)zAQ=qMi0fMq4Is)@y}7Xk}0{etN5}h z<5%^Sp=zpf)~1;iv}t~ISTk#)t>SA#-PA?B>eq)2vw?ce)%}HG(`<@*-CrConMiKqj&`wyKctKyZd^~$KMAQ9Y54^=#1QPe!*z7^R#X1|p2Em~GB&ORDpv6hoO zv*N^d4$#`zakv*H_k&)Dr;0loMzKSq6&DEuUGeXrU=oBtG8I=gRagJ1)Whbxm6vr> zbE|F*TUGg~q)BEK+fh%KHnYXQJ@R~)ar+-tNm>t#j)M(~JKc{D89x}aQD5v;d;aC_ zRU_HA6C<$?SZuhgXODdBRgZ^5bg+#5Q3P(;#OH#wSg<`b>?rDB|Cn))M1dZQ_lzVo zz`>r^A8|&6W;aMsZ)e+(5sK_&zhk_={lK7_vBw}$M$Sd%&b_*4$IJrHv2m!0Zw~ia zJ_u$&GL(HEGyashSB=Ac&)FBFk<@m(G(@*c?{Vg1RZlU&ux;G$3EAr7Ik;-ZvJo+Tmrt=U25$dHJ} z&OY=Ibi^-x1$l=O#R;=rBkY}>@hg`(M|BW~L5J9uvn(M+#y|M(*}gZ1j@q&D-p<1< zgBBb?7)4V#QnyPS?RMM7x*vyA;p=vV@&$>N97POUm4q|j%t+aFngYHTy`5Ypc|YzL zAw-TFQ5bt9wYG2Ayg$m!P(F_tn*TRNnH%Nc5CqF{4%pFQ$g$l2r$IiKuWvb3VGSgy ziC?NOq`P)<}= zIhCV3u6nG~v#VW_j_VVRn{MSqn`jgLR6$P#)O7BPH>!A}l2j(j3;DR=)&|<7F{nm= zGO6IV7JV|&C-oEE)lX%&{;7JbqP2dkpltA8Bn$MLG+!wE@7+eAxC_S%6J;V=FG_Dp zcu$^4)?%`hEKj5t%3uY(YEPL||4NzEekQ|VNw93qt?~CZ?0_sjZJM!Gs>7NQa${{O z)@#P02fMLW7>BjCxiF&*Y26PU+usl4#9TS6apT(a8^`VEH;>H=uaf!k>(4XQIqqD) z{ybm_NF85)PDbRIFJL=bYFf?SNUK?Qs!{K+$Q``(x%^h^T&nGbp`R|TLjyPo zFi*!Y77xQDRq=YN#w;QiXj#J5Sk~W2pZ{Q^^W=RjGk&tW^Y)YVD7p(BfAWC%|74d9 zqbHFUT@%yy{cFK@dH;s>toKAp#~0@vUAth2qYy1z@RIPMlJo=I@#`oi$_dccL>kDaiYz4% z(w;m~ekMZ{mGM996lM*kKHM7!vt-!9zFo`q4sgYw-3t1-nK|b^90&G;oF42ldCN>PU_ax~@$3Qz5j`R3!qm>M?{bWJVS5U5Nbib0hkQ0-mgKHo zG^GtPoR+{KEtP*AYfn|IiGLF{{@Z2o2Gy>h_z~_{0F>&IJiatPa(jlDCRAc;YpYcw z5hPb-S!u(vGJuDA)3QDSlFNH)mgR{@L#2zkG&#)o(NWH(CG&65e8i+k#xK#N z$U5p5w2CCt-_mah=`V2=Z8c5%A-(!*C=%&JPJpUj$fq*4Se-}{Ip5&F+u#hG#+DZT zU=HA(#ZCDZx7+Yr5odr$%i{X&?4Xh5O}4vM!tADH{pW|(fjf#t$o#u){HMq zq@|@gd|?3DjZ=+k>FV8_Aux20vo5hKErlD{f>#Mydg)6SvPWB|qmXJElwYs#Td0>i zOdTo}xZ-zF%pqsR)C6``UG1fAR#?@oxYd`^3)!qus019XyLGpL-+C4lnGJ!f7ohTs z>B2pNwHea4??RRyhx`B$ig!R#!dZXh+uV4Zqw6fbaYS4I_=pe(=qC<=)eeI2&}VKR zU+smXMC|H*c$lMRAO{eI-a|uyS%mic%nn8oP?>nlfiM{b3Q1sN5K`opLJ%Vuh<9xW z6qyH@roGTT0`O%)87s|n;`>CzWQe}*!IAbEf*RWwq&&nYe=~UIBESeLLtwSvtmz_RU+O6Sj(Mmk3bcODMFu(gH*e z9Dn2@E`frE?c{Yhb|<=8`GxJ%?}sT_m=2lTVJx z$|h0*?*lkQ@CbefFbMg8L>*`sC0G4R1&|2<4Wg-Sjq5jWz1hBjznkNF!S?Gd#a!6l z{NcmhO>6z`-EDLE-QC?s*84z0*7`e}Tf40){|$`8zfA@CR_Janz3GBw<@-ZMdUnyd zhnOmFVTpxl7Uq~}y~G_8P?h9WMUlrBX0&JOe2c{sa;oDFamW9H0&W+}1^QeCeg)

mGT3t}x z2UU%zCY6(gNrfnk8x#Elc#X#x7p=`x)PDqYeX@8;*tmAG1XL`?KSymD^niCyRapY+ zT_M_obEm+?Vn(ak^918%)c#1?1|^q(L&g3JG90s-=!C;PFDS48VC$_Q{~Bx2GaBjI)s+amK(WKc2%$kZL`3V-YMj)eIrKSG>eQX(-W0X1@igRBHfQOk1Vt)GmvF^Df0*2EW-gJ ztn|<2YKmw#TXklFh@)HM&dwKw2@)58f#i&_TBOJFJqyDF5367St;TJq=L-7(V8giw z6Fq*bAV)$#{BS*2BveR-!R?%RfIs_;ycd?9f!q-ns?a)bHXJdIHL!WwM5-wh0uvp;X^n9_x z8GZUQd>mgzA+0umoG3JE;;%{p6mFf`8r0KJD1>UD4dDJ8vu67hR7>|on2c_Lt^XU9 zEPO(qA+y?WS)#6qc1_fgO^82(lLP*CD+dbyjDjo|nFexlgGy5EDaaXo2CG^-(P4$F z^Zn=>PpYu);+vDksYG@>SemxcGrnG!AWM2%3f>cS<)rEA(ULf-e$uhDO(gZ#R*^-Le__PA+zOa?*c5Edh7@B*j zzBlRt6)`tm>4m-@9%3gmz#MaOjGUa`_+qBdmcTT~P+B>x<0Jz7yC~pr?@|37DhSiI z&hb0=NmZW(oWdUd9eUJA*t2k7b3G>!AEz3nz0>L_LUN6n3nZ4gAf_u{7?X5~|2`3` zIDUvYm7=9oBjsr6X9abBQvCb$YAug9&IlxbgwB7)oki|K@R};(b@??2+p2s)SyGzX zDg=(OLKAHS?z6w~%B%>|R7#m622xD7L6j+;!|owbQe?bbf=Fn?&Zt}Cujjd=V8+dP z!Bb=+2n)u$h)1?Sf`1PMAPq&qXI4R(4M0(-r1kIU&B72UkB)o%wb@yg?>WRkx+srR zPW1*JD6?Qm&%Tu){RSwbQR0rjG0_Gpl_wgB*+=>#+$4Bdg0gk5RmrAE299@7nDt@{ zT_F;9K}7F5d*+C2XJlr85G#@4QeGE8q>XmLSNJrO=;Ge zzo);US4E$L=JF~SDfV?Yw% z7E&fS_4Y<_%+oax3JGjLzTTc5a$L@Q^u~kxaA8B75V?R(yGIeuNCJC_R!htL zi@^Pl@xH+Q1*8`_!Ed6q*p_)n4+EK}eMsOh&a<$@^ji*1h%VY9y2a$~q5?xrkbdP8 zsOdmH2C$!~2Q}VKlxbM*Rz9UvwQ?IyAkjXdMN|mVBOR=Y)J)Z;)!&Ea(h-$y%@t)} z&XkI@WzKVuRZI2TzCGM??K_w7^{>z(jW3^3ot$;I#j!+ur(Jx}k^zE+`LMtygzKcB zsR~AMf?8ShPFkE+GZIj5;kQicHK>@;=3;8X)_#c2D(N$&PNij}%Ype`Q>Jb#GmN?5 z!}%bE`%059tUXctD$7oD{2$zcZ@LD%u5oH>UCjK(b<|VfeK^-=$erv7_hBv;*$82b z1;{ZMvG}Qmaxygnq|CgGqlj3Xo1~Hm1-Re_F)Y<6H_a*0Ad<`cJ*p80L>4higb1rB k4BxcKH!{mw-zkkP9W&681L5eVB1-kbef`|ZA4`q@1vn;q1poj5 literal 0 HcmV?d00001 diff --git a/env/Lib/site-packages/flask/__pycache__/views.cpython-37.pyc b/env/Lib/site-packages/flask/__pycache__/views.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b6b90a7af169fc6d2a5bc8e6a38e87bd96ee8e37 GIT binary patch literal 4797 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 Z{GRn2`sai`>e^;E|FiI0TkEWE{TG`ij+Foa literal 0 HcmV?d00001 diff --git a/env/Lib/site-packages/flask/_compat.py b/env/Lib/site-packages/flask/_compat.py new file mode 100644 index 0000000..76c442c --- /dev/null +++ b/env/Lib/site-packages/flask/_compat.py @@ -0,0 +1,145 @@ +# -*- coding: utf-8 -*- +""" + flask._compat + ~~~~~~~~~~~~~ + + Some py2/py3 compatibility support based on a stripped down + version of six so we don't have to depend on a specific version + of it. + + :copyright: 2010 Pallets + :license: BSD-3-Clause +""" +import sys + +PY2 = sys.version_info[0] == 2 +_identity = lambda x: x + +try: # Python 2 + text_type = unicode + string_types = (str, unicode) + integer_types = (int, long) +except NameError: # Python 3 + text_type = str + string_types = (str,) + integer_types = (int,) + +if not PY2: + iterkeys = lambda d: iter(d.keys()) + itervalues = lambda d: iter(d.values()) + iteritems = lambda d: iter(d.items()) + + from inspect import getfullargspec as getargspec + from io import StringIO + import collections.abc as collections_abc + + def reraise(tp, value, tb=None): + if value.__traceback__ is not tb: + raise value.with_traceback(tb) + raise value + + implements_to_string = _identity + +else: + iterkeys = lambda d: d.iterkeys() + itervalues = lambda d: d.itervalues() + iteritems = lambda d: d.iteritems() + + from inspect import getargspec + from cStringIO import StringIO + import collections as collections_abc + + exec("def reraise(tp, value, tb=None):\n raise tp, value, tb") + + def implements_to_string(cls): + cls.__unicode__ = cls.__str__ + cls.__str__ = lambda x: x.__unicode__().encode("utf-8") + return cls + + +def with_metaclass(meta, *bases): + """Create a base class with a metaclass.""" + # This requires a bit of explanation: the basic idea is to make a + # dummy metaclass for one level of class instantiation that replaces + # itself with the actual metaclass. + class metaclass(type): + def __new__(metacls, name, this_bases, d): + return meta(name, bases, d) + + return type.__new__(metaclass, "temporary_class", (), {}) + + +# Certain versions of pypy have a bug where clearing the exception stack +# breaks the __exit__ function in a very peculiar way. The second level of +# exception blocks is necessary because pypy seems to forget to check if an +# exception happened until the next bytecode instruction? +# +# Relevant PyPy bugfix commit: +# https://bitbucket.org/pypy/pypy/commits/77ecf91c635a287e88e60d8ddb0f4e9df4003301 +# According to ronan on #pypy IRC, it is released in PyPy2 2.3 and later +# versions. +# +# Ubuntu 14.04 has PyPy 2.2.1, which does exhibit this bug. +BROKEN_PYPY_CTXMGR_EXIT = False +if hasattr(sys, "pypy_version_info"): + + class _Mgr(object): + def __enter__(self): + return self + + def __exit__(self, *args): + if hasattr(sys, "exc_clear"): + # Python 3 (PyPy3) doesn't have exc_clear + sys.exc_clear() + + try: + try: + with _Mgr(): + raise AssertionError() + except: # noqa: B001 + # We intentionally use a bare except here. See the comment above + # regarding a pypy bug as to why. + raise + except TypeError: + BROKEN_PYPY_CTXMGR_EXIT = True + except AssertionError: + pass + + +try: + from os import fspath +except ImportError: + # Backwards compatibility as proposed in PEP 0519: + # https://www.python.org/dev/peps/pep-0519/#backwards-compatibility + def fspath(path): + return path.__fspath__() if hasattr(path, "__fspath__") else path + + +class _DeprecatedBool(object): + def __init__(self, name, version, value): + self.message = "'{}' is deprecated and will be removed in version {}.".format( + name, version + ) + self.value = value + + def _warn(self): + import warnings + + warnings.warn(self.message, DeprecationWarning, stacklevel=2) + + def __eq__(self, other): + self._warn() + return other == self.value + + def __ne__(self, other): + self._warn() + return other != self.value + + def __bool__(self): + self._warn() + return self.value + + __nonzero__ = __bool__ + + +json_available = _DeprecatedBool("flask.json_available", "2.0.0", True) diff --git a/env/Lib/site-packages/flask/app.py b/env/Lib/site-packages/flask/app.py new file mode 100644 index 0000000..e596fe5 --- /dev/null +++ b/env/Lib/site-packages/flask/app.py @@ -0,0 +1,2466 @@ +# -*- coding: utf-8 -*- +""" + flask.app + ~~~~~~~~~ + + This module implements the central WSGI application object. + + :copyright: 2010 Pallets + :license: BSD-3-Clause +""" +import os +import sys +import warnings +from datetime import timedelta +from functools import update_wrapper +from itertools import chain +from threading import Lock + +from werkzeug.datastructures import Headers +from werkzeug.datastructures import ImmutableDict +from werkzeug.exceptions import BadRequest +from werkzeug.exceptions import BadRequestKeyError +from werkzeug.exceptions import default_exceptions +from werkzeug.exceptions import HTTPException +from werkzeug.exceptions import InternalServerError +from werkzeug.exceptions import MethodNotAllowed +from werkzeug.routing import BuildError +from werkzeug.routing import Map +from werkzeug.routing import RequestRedirect +from werkzeug.routing import RoutingException +from werkzeug.routing import Rule +from werkzeug.wrappers import BaseResponse + +from . import cli +from . import json +from ._compat import integer_types +from ._compat import reraise +from ._compat import string_types +from ._compat import text_type +from .config import Config +from .config import ConfigAttribute +from .ctx import _AppCtxGlobals +from .ctx import AppContext +from .ctx import RequestContext +from .globals import _request_ctx_stack +from .globals import g +from .globals import request +from .globals import session +from .helpers import _endpoint_from_view_func +from .helpers import _PackageBoundObject +from .helpers import find_package +from .helpers import get_debug_flag +from .helpers import get_env +from .helpers import get_flashed_messages +from .helpers import get_load_dotenv +from .helpers import locked_cached_property +from .helpers import url_for +from .json import jsonify +from .logging import create_logger +from .sessions import SecureCookieSessionInterface +from .signals import appcontext_tearing_down +from .signals import got_request_exception +from .signals import request_finished +from .signals import request_started +from .signals import request_tearing_down +from .templating import _default_template_ctx_processor +from .templating import DispatchingJinjaLoader +from .templating import Environment +from .wrappers import Request +from .wrappers import Response + +# a singleton sentinel value for parameter defaults +_sentinel = object() + + +def _make_timedelta(value): + if not isinstance(value, timedelta): + return timedelta(seconds=value) + return value + + +def setupmethod(f): + """Wraps a method so that it performs a check in debug mode if the + first request was already handled. + """ + + def wrapper_func(self, *args, **kwargs): + if self.debug and self._got_first_request: + raise AssertionError( + "A setup function was called after the " + "first request was handled. This usually indicates a bug " + "in the application where a module was not imported " + "and decorators or other functionality was called too late.\n" + "To fix this make sure to import all your view modules, " + "database models and everything related at a central place " + "before the application starts serving requests." + ) + return f(self, *args, **kwargs) + + return update_wrapper(wrapper_func, f) + + +class Flask(_PackageBoundObject): + """The flask object implements a WSGI application and acts as the central + object. It is passed the name of the module or package of the + application. Once it is created it will act as a central registry for + the view functions, the URL rules, template configuration and much more. + + The name of the package is used to resolve resources from inside the + package or the folder the module is contained in depending on if the + package parameter resolves to an actual python package (a folder with + an :file:`__init__.py` file inside) or a standard module (just a ``.py`` file). + + For more information about resource loading, see :func:`open_resource`. + + Usually you create a :class:`Flask` instance in your main module or + in the :file:`__init__.py` file of your package like this:: + + from flask import Flask + app = Flask(__name__) + + .. admonition:: About the First Parameter + + The idea of the first parameter is to give Flask an idea of what + belongs to your application. This name is used to find resources + on the filesystem, can be used by extensions to improve debugging + information and a lot more. + + So it's important what you provide there. If you are using a single + module, `__name__` is always the correct value. If you however are + using a package, it's usually recommended to hardcode the name of + your package there. + + For example if your application is defined in :file:`yourapplication/app.py` + you should create it with one of the two versions below:: + + app = Flask('yourapplication') + app = Flask(__name__.split('.')[0]) + + Why is that? The application will work even with `__name__`, thanks + to how resources are looked up. However it will make debugging more + painful. Certain extensions can make assumptions based on the + import name of your application. For example the Flask-SQLAlchemy + extension will look for the code in your application that triggered + an SQL query in debug mode. If the import name is not properly set + up, that debugging information is lost. (For example it would only + pick up SQL queries in `yourapplication.app` and not + `yourapplication.views.frontend`) + + .. versionadded:: 0.7 + The `static_url_path`, `static_folder`, and `template_folder` + parameters were added. + + .. versionadded:: 0.8 + The `instance_path` and `instance_relative_config` parameters were + added. + + .. versionadded:: 0.11 + The `root_path` parameter was added. + + .. versionadded:: 1.0 + The ``host_matching`` and ``static_host`` parameters were added. + + .. versionadded:: 1.0 + The ``subdomain_matching`` parameter was added. Subdomain + matching needs to be enabled manually now. Setting + :data:`SERVER_NAME` does not implicitly enable it. + + :param import_name: the name of the application package + :param static_url_path: can be used to specify a different path for the + static files on the web. Defaults to the name + of the `static_folder` folder. + :param static_folder: the folder with static files that should be served + at `static_url_path`. Defaults to the ``'static'`` + folder in the root path of the application. + :param static_host: the host to use when adding the static route. + Defaults to None. Required when using ``host_matching=True`` + with a ``static_folder`` configured. + :param host_matching: set ``url_map.host_matching`` attribute. + Defaults to False. + :param subdomain_matching: consider the subdomain relative to + :data:`SERVER_NAME` when matching routes. Defaults to False. + :param template_folder: the folder that contains the templates that should + be used by the application. Defaults to + ``'templates'`` folder in the root path of the + application. + :param instance_path: An alternative instance path for the application. + By default the folder ``'instance'`` next to the + package or module is assumed to be the instance + path. + :param instance_relative_config: if set to ``True`` relative filenames + for loading the config are assumed to + be relative to the instance path instead + of the application root. + :param root_path: Flask by default will automatically calculate the path + to the root of the application. In certain situations + this cannot be achieved (for instance if the package + is a Python 3 namespace package) and needs to be + manually defined. + """ + + #: The class that is used for request objects. See :class:`~flask.Request` + #: for more information. + request_class = Request + + #: The class that is used for response objects. See + #: :class:`~flask.Response` for more information. + response_class = Response + + #: The class that is used for the Jinja environment. + #: + #: .. versionadded:: 0.11 + jinja_environment = Environment + + #: The class that is used for the :data:`~flask.g` instance. + #: + #: Example use cases for a custom class: + #: + #: 1. Store arbitrary attributes on flask.g. + #: 2. Add a property for lazy per-request database connectors. + #: 3. Return None instead of AttributeError on unexpected attributes. + #: 4. Raise exception if an unexpected attr is set, a "controlled" flask.g. + #: + #: In Flask 0.9 this property was called `request_globals_class` but it + #: was changed in 0.10 to :attr:`app_ctx_globals_class` because the + #: flask.g object is now application context scoped. + #: + #: .. versionadded:: 0.10 + app_ctx_globals_class = _AppCtxGlobals + + #: The class that is used for the ``config`` attribute of this app. + #: Defaults to :class:`~flask.Config`. + #: + #: Example use cases for a custom class: + #: + #: 1. Default values for certain config options. + #: 2. Access to config values through attributes in addition to keys. + #: + #: .. versionadded:: 0.11 + config_class = Config + + #: The testing flag. Set this to ``True`` to enable the test mode of + #: Flask extensions (and in the future probably also Flask itself). + #: For example this might activate test helpers that have an + #: additional runtime cost which should not be enabled by default. + #: + #: If this is enabled and PROPAGATE_EXCEPTIONS is not changed from the + #: default it's implicitly enabled. + #: + #: This attribute can also be configured from the config with the + #: ``TESTING`` configuration key. Defaults to ``False``. + testing = ConfigAttribute("TESTING") + + #: If a secret key is set, cryptographic components can use this to + #: sign cookies and other things. Set this to a complex random value + #: when you want to use the secure cookie for instance. + #: + #: This attribute can also be configured from the config with the + #: :data:`SECRET_KEY` configuration key. Defaults to ``None``. + secret_key = ConfigAttribute("SECRET_KEY") + + #: The secure cookie uses this for the name of the session cookie. + #: + #: This attribute can also be configured from the config with the + #: ``SESSION_COOKIE_NAME`` configuration key. Defaults to ``'session'`` + session_cookie_name = ConfigAttribute("SESSION_COOKIE_NAME") + + #: A :class:`~datetime.timedelta` which is used to set the expiration + #: date of a permanent session. The default is 31 days which makes a + #: permanent session survive for roughly one month. + #: + #: This attribute can also be configured from the config with the + #: ``PERMANENT_SESSION_LIFETIME`` configuration key. Defaults to + #: ``timedelta(days=31)`` + permanent_session_lifetime = ConfigAttribute( + "PERMANENT_SESSION_LIFETIME", get_converter=_make_timedelta + ) + + #: A :class:`~datetime.timedelta` which is used as default cache_timeout + #: for the :func:`send_file` functions. The default is 12 hours. + #: + #: This attribute can also be configured from the config with the + #: ``SEND_FILE_MAX_AGE_DEFAULT`` configuration key. This configuration + #: variable can also be set with an integer value used as seconds. + #: Defaults to ``timedelta(hours=12)`` + send_file_max_age_default = ConfigAttribute( + "SEND_FILE_MAX_AGE_DEFAULT", get_converter=_make_timedelta + ) + + #: Enable this if you want to use the X-Sendfile feature. Keep in + #: mind that the server has to support this. This only affects files + #: sent with the :func:`send_file` method. + #: + #: .. versionadded:: 0.2 + #: + #: This attribute can also be configured from the config with the + #: ``USE_X_SENDFILE`` configuration key. Defaults to ``False``. + use_x_sendfile = ConfigAttribute("USE_X_SENDFILE") + + #: The JSON encoder class to use. Defaults to :class:`~flask.json.JSONEncoder`. + #: + #: .. versionadded:: 0.10 + json_encoder = json.JSONEncoder + + #: The JSON decoder class to use. Defaults to :class:`~flask.json.JSONDecoder`. + #: + #: .. versionadded:: 0.10 + json_decoder = json.JSONDecoder + + #: Options that are passed to the Jinja environment in + #: :meth:`create_jinja_environment`. Changing these options after + #: the environment is created (accessing :attr:`jinja_env`) will + #: have no effect. + #: + #: .. versionchanged:: 1.1.0 + #: This is a ``dict`` instead of an ``ImmutableDict`` to allow + #: easier configuration. + #: + jinja_options = {"extensions": ["jinja2.ext.autoescape", "jinja2.ext.with_"]} + + #: Default configuration parameters. + default_config = ImmutableDict( + { + "ENV": None, + "DEBUG": None, + "TESTING": False, + "PROPAGATE_EXCEPTIONS": None, + "PRESERVE_CONTEXT_ON_EXCEPTION": None, + "SECRET_KEY": None, + "PERMANENT_SESSION_LIFETIME": timedelta(days=31), + "USE_X_SENDFILE": False, + "SERVER_NAME": None, + "APPLICATION_ROOT": "/", + "SESSION_COOKIE_NAME": "session", + "SESSION_COOKIE_DOMAIN": None, + "SESSION_COOKIE_PATH": None, + "SESSION_COOKIE_HTTPONLY": True, + "SESSION_COOKIE_SECURE": False, + "SESSION_COOKIE_SAMESITE": None, + "SESSION_REFRESH_EACH_REQUEST": True, + "MAX_CONTENT_LENGTH": None, + "SEND_FILE_MAX_AGE_DEFAULT": timedelta(hours=12), + "TRAP_BAD_REQUEST_ERRORS": None, + "TRAP_HTTP_EXCEPTIONS": False, + "EXPLAIN_TEMPLATE_LOADING": False, + "PREFERRED_URL_SCHEME": "http", + "JSON_AS_ASCII": True, + "JSON_SORT_KEYS": True, + "JSONIFY_PRETTYPRINT_REGULAR": False, + "JSONIFY_MIMETYPE": "application/json", + "TEMPLATES_AUTO_RELOAD": None, + "MAX_COOKIE_SIZE": 4093, + } + ) + + #: The rule object to use for URL rules created. This is used by + #: :meth:`add_url_rule`. Defaults to :class:`werkzeug.routing.Rule`. + #: + #: .. versionadded:: 0.7 + url_rule_class = Rule + + #: The map object to use for storing the URL rules and routing + #: configuration parameters. Defaults to :class:`werkzeug.routing.Map`. + #: + #: .. versionadded:: 1.1.0 + url_map_class = Map + + #: the test client that is used with when `test_client` is used. + #: + #: .. versionadded:: 0.7 + test_client_class = None + + #: The :class:`~click.testing.CliRunner` subclass, by default + #: :class:`~flask.testing.FlaskCliRunner` that is used by + #: :meth:`test_cli_runner`. Its ``__init__`` method should take a + #: Flask app object as the first argument. + #: + #: .. versionadded:: 1.0 + test_cli_runner_class = None + + #: the session interface to use. By default an instance of + #: :class:`~flask.sessions.SecureCookieSessionInterface` is used here. + #: + #: .. versionadded:: 0.8 + session_interface = SecureCookieSessionInterface() + + # TODO remove the next three attrs when Sphinx :inherited-members: works + # https://github.com/sphinx-doc/sphinx/issues/741 + + #: The name of the package or module that this app belongs to. Do not + #: change this once it is set by the constructor. + import_name = None + + #: Location of the template files to be added to the template lookup. + #: ``None`` if templates should not be added. + template_folder = None + + #: Absolute path to the package on the filesystem. Used to look up + #: resources contained in the package. + root_path = None + + def __init__( + self, + import_name, + static_url_path=None, + static_folder="static", + static_host=None, + host_matching=False, + subdomain_matching=False, + template_folder="templates", + instance_path=None, + instance_relative_config=False, + root_path=None, + ): + _PackageBoundObject.__init__( + self, import_name, template_folder=template_folder, root_path=root_path + ) + + self.static_url_path = static_url_path + self.static_folder = static_folder + + if instance_path is None: + instance_path = self.auto_find_instance_path() + elif not os.path.isabs(instance_path): + raise ValueError( + "If an instance path is provided it must be absolute." + " A relative path was given instead." + ) + + #: Holds the path to the instance folder. + #: + #: .. versionadded:: 0.8 + self.instance_path = instance_path + + #: The configuration dictionary as :class:`Config`. This behaves + #: exactly like a regular dictionary but supports additional methods + #: to load a config from files. + self.config = self.make_config(instance_relative_config) + + #: A dictionary of all view functions registered. The keys will + #: be function names which are also used to generate URLs and + #: the values are the function objects themselves. + #: To register a view function, use the :meth:`route` decorator. + self.view_functions = {} + + #: A dictionary of all registered error handlers. The key is ``None`` + #: for error handlers active on the application, otherwise the key is + #: the name of the blueprint. Each key points to another dictionary + #: where the key is the status code of the http exception. The + #: special key ``None`` points to a list of tuples where the first item + #: is the class for the instance check and the second the error handler + #: function. + #: + #: To register an error handler, use the :meth:`errorhandler` + #: decorator. + self.error_handler_spec = {} + + #: A list of functions that are called when :meth:`url_for` raises a + #: :exc:`~werkzeug.routing.BuildError`. Each function registered here + #: is called with `error`, `endpoint` and `values`. If a function + #: returns ``None`` or raises a :exc:`BuildError` the next function is + #: tried. + #: + #: .. versionadded:: 0.9 + self.url_build_error_handlers = [] + + #: A dictionary with lists of functions that will be called at the + #: beginning of each request. The key of the dictionary is the name of + #: the blueprint this function is active for, or ``None`` for all + #: requests. To register a function, use the :meth:`before_request` + #: decorator. + self.before_request_funcs = {} + + #: A list of functions that will be called at the beginning of the + #: first request to this instance. To register a function, use the + #: :meth:`before_first_request` decorator. + #: + #: .. versionadded:: 0.8 + self.before_first_request_funcs = [] + + #: A dictionary with lists of functions that should be called after + #: each request. The key of the dictionary is the name of the blueprint + #: this function is active for, ``None`` for all requests. This can for + #: example be used to close database connections. To register a function + #: here, use the :meth:`after_request` decorator. + self.after_request_funcs = {} + + #: A dictionary with lists of functions that are called after + #: each request, even if an exception has occurred. The key of the + #: dictionary is the name of the blueprint this function is active for, + #: ``None`` for all requests. These functions are not allowed to modify + #: the request, and their return values are ignored. If an exception + #: occurred while processing the request, it gets passed to each + #: teardown_request function. To register a function here, use the + #: :meth:`teardown_request` decorator. + #: + #: .. versionadded:: 0.7 + self.teardown_request_funcs = {} + + #: A list of functions that are called when the application context + #: is destroyed. Since the application context is also torn down + #: if the request ends this is the place to store code that disconnects + #: from databases. + #: + #: .. versionadded:: 0.9 + self.teardown_appcontext_funcs = [] + + #: A dictionary with lists of functions that are called before the + #: :attr:`before_request_funcs` functions. The key of the dictionary is + #: the name of the blueprint this function is active for, or ``None`` + #: for all requests. To register a function, use + #: :meth:`url_value_preprocessor`. + #: + #: .. versionadded:: 0.7 + self.url_value_preprocessors = {} + + #: A dictionary with lists of functions that can be used as URL value + #: preprocessors. The key ``None`` here is used for application wide + #: callbacks, otherwise the key is the name of the blueprint. + #: Each of these functions has the chance to modify the dictionary + #: of URL values before they are used as the keyword arguments of the + #: view function. For each function registered this one should also + #: provide a :meth:`url_defaults` function that adds the parameters + #: automatically again that were removed that way. + #: + #: .. versionadded:: 0.7 + self.url_default_functions = {} + + #: A dictionary with list of functions that are called without argument + #: to populate the template context. The key of the dictionary is the + #: name of the blueprint this function is active for, ``None`` for all + #: requests. Each returns a dictionary that the template context is + #: updated with. To register a function here, use the + #: :meth:`context_processor` decorator. + self.template_context_processors = {None: [_default_template_ctx_processor]} + + #: A list of shell context processor functions that should be run + #: when a shell context is created. + #: + #: .. versionadded:: 0.11 + self.shell_context_processors = [] + + #: all the attached blueprints in a dictionary by name. Blueprints + #: can be attached multiple times so this dictionary does not tell + #: you how often they got attached. + #: + #: .. versionadded:: 0.7 + self.blueprints = {} + self._blueprint_order = [] + + #: a place where extensions can store application specific state. For + #: example this is where an extension could store database engines and + #: similar things. For backwards compatibility extensions should register + #: themselves like this:: + #: + #: if not hasattr(app, 'extensions'): + #: app.extensions = {} + #: app.extensions['extensionname'] = SomeObject() + #: + #: The key must match the name of the extension module. For example in + #: case of a "Flask-Foo" extension in `flask_foo`, the key would be + #: ``'foo'``. + #: + #: .. versionadded:: 0.7 + self.extensions = {} + + #: The :class:`~werkzeug.routing.Map` for this instance. You can use + #: this to change the routing converters after the class was created + #: but before any routes are connected. Example:: + #: + #: from werkzeug.routing import BaseConverter + #: + #: class ListConverter(BaseConverter): + #: def to_python(self, value): + #: return value.split(',') + #: def to_url(self, values): + #: return ','.join(super(ListConverter, self).to_url(value) + #: for value in values) + #: + #: app = Flask(__name__) + #: app.url_map.converters['list'] = ListConverter + self.url_map = self.url_map_class() + + self.url_map.host_matching = host_matching + self.subdomain_matching = subdomain_matching + + # tracks internally if the application already handled at least one + # request. + self._got_first_request = False + self._before_request_lock = Lock() + + # Add a static route using the provided static_url_path, static_host, + # and static_folder if there is a configured static_folder. + # Note we do this without checking if static_folder exists. + # For one, it might be created while the server is running (e.g. during + # development). Also, Google App Engine stores static files somewhere + if self.has_static_folder: + assert ( + bool(static_host) == host_matching + ), "Invalid static_host/host_matching combination" + self.add_url_rule( + self.static_url_path + "/", + endpoint="static", + host=static_host, + view_func=self.send_static_file, + ) + + # Set the name of the Click group in case someone wants to add + # the app's commands to another CLI tool. + self.cli.name = self.name + + @locked_cached_property + def name(self): + """The name of the application. This is usually the import name + with the difference that it's guessed from the run file if the + import name is main. This name is used as a display name when + Flask needs the name of the application. It can be set and overridden + to change the value. + + .. versionadded:: 0.8 + """ + if self.import_name == "__main__": + fn = getattr(sys.modules["__main__"], "__file__", None) + if fn is None: + return "__main__" + return os.path.splitext(os.path.basename(fn))[0] + return self.import_name + + @property + def propagate_exceptions(self): + """Returns the value of the ``PROPAGATE_EXCEPTIONS`` configuration + value in case it's set, otherwise a sensible default is returned. + + .. versionadded:: 0.7 + """ + rv = self.config["PROPAGATE_EXCEPTIONS"] + if rv is not None: + return rv + return self.testing or self.debug + + @property + def preserve_context_on_exception(self): + """Returns the value of the ``PRESERVE_CONTEXT_ON_EXCEPTION`` + configuration value in case it's set, otherwise a sensible default + is returned. + + .. versionadded:: 0.7 + """ + rv = self.config["PRESERVE_CONTEXT_ON_EXCEPTION"] + if rv is not None: + return rv + return self.debug + + @locked_cached_property + def logger(self): + """A standard Python :class:`~logging.Logger` for the app, with + the same name as :attr:`name`. + + In debug mode, the logger's :attr:`~logging.Logger.level` will + be set to :data:`~logging.DEBUG`. + + If there are no handlers configured, a default handler will be + added. See :doc:`/logging` for more information. + + .. versionchanged:: 1.1.0 + The logger takes the same name as :attr:`name` rather than + hard-coding ``"flask.app"``. + + .. versionchanged:: 1.0.0 + Behavior was simplified. The logger is always named + ``"flask.app"``. The level is only set during configuration, + it doesn't check ``app.debug`` each time. Only one format is + used, not different ones depending on ``app.debug``. No + handlers are removed, and a handler is only added if no + handlers are already configured. + + .. versionadded:: 0.3 + """ + return create_logger(self) + + @locked_cached_property + def jinja_env(self): + """The Jinja environment used to load templates. + + The environment is created the first time this property is + accessed. Changing :attr:`jinja_options` after that will have no + effect. + """ + return self.create_jinja_environment() + + @property + def got_first_request(self): + """This attribute is set to ``True`` if the application started + handling the first request. + + .. versionadded:: 0.8 + """ + return self._got_first_request + + def make_config(self, instance_relative=False): + """Used to create the config attribute by the Flask constructor. + The `instance_relative` parameter is passed in from the constructor + of Flask (there named `instance_relative_config`) and indicates if + the config should be relative to the instance path or the root path + of the application. + + .. versionadded:: 0.8 + """ + root_path = self.root_path + if instance_relative: + root_path = self.instance_path + defaults = dict(self.default_config) + defaults["ENV"] = get_env() + defaults["DEBUG"] = get_debug_flag() + return self.config_class(root_path, defaults) + + def auto_find_instance_path(self): + """Tries to locate the instance path if it was not provided to the + constructor of the application class. It will basically calculate + the path to a folder named ``instance`` next to your main file or + the package. + + .. versionadded:: 0.8 + """ + prefix, package_path = find_package(self.import_name) + if prefix is None: + return os.path.join(package_path, "instance") + return os.path.join(prefix, "var", self.name + "-instance") + + def open_instance_resource(self, resource, mode="rb"): + """Opens a resource from the application's instance folder + (:attr:`instance_path`). Otherwise works like + :meth:`open_resource`. Instance resources can also be opened for + writing. + + :param resource: the name of the resource. To access resources within + subfolders use forward slashes as separator. + :param mode: resource file opening mode, default is 'rb'. + """ + return open(os.path.join(self.instance_path, resource), mode) + + @property + def templates_auto_reload(self): + """Reload templates when they are changed. Used by + :meth:`create_jinja_environment`. + + This attribute can be configured with :data:`TEMPLATES_AUTO_RELOAD`. If + not set, it will be enabled in debug mode. + + .. versionadded:: 1.0 + This property was added but the underlying config and behavior + already existed. + """ + rv = self.config["TEMPLATES_AUTO_RELOAD"] + return rv if rv is not None else self.debug + + @templates_auto_reload.setter + def templates_auto_reload(self, value): + self.config["TEMPLATES_AUTO_RELOAD"] = value + + def create_jinja_environment(self): + """Create the Jinja environment based on :attr:`jinja_options` + and the various Jinja-related methods of the app. Changing + :attr:`jinja_options` after this will have no effect. Also adds + Flask-related globals and filters to the environment. + + .. versionchanged:: 0.11 + ``Environment.auto_reload`` set in accordance with + ``TEMPLATES_AUTO_RELOAD`` configuration option. + + .. versionadded:: 0.5 + """ + options = dict(self.jinja_options) + + if "autoescape" not in options: + options["autoescape"] = self.select_jinja_autoescape + + if "auto_reload" not in options: + options["auto_reload"] = self.templates_auto_reload + + rv = self.jinja_environment(self, **options) + rv.globals.update( + url_for=url_for, + get_flashed_messages=get_flashed_messages, + config=self.config, + # request, session and g are normally added with the + # context processor for efficiency reasons but for imported + # templates we also want the proxies in there. + request=request, + session=session, + g=g, + ) + rv.filters["tojson"] = json.tojson_filter + return rv + + def create_global_jinja_loader(self): + """Creates the loader for the Jinja2 environment. Can be used to + override just the loader and keeping the rest unchanged. It's + discouraged to override this function. Instead one should override + the :meth:`jinja_loader` function instead. + + The global loader dispatches between the loaders of the application + and the individual blueprints. + + .. versionadded:: 0.7 + """ + return DispatchingJinjaLoader(self) + + def select_jinja_autoescape(self, filename): + """Returns ``True`` if autoescaping should be active for the given + template name. If no template name is given, returns `True`. + + .. versionadded:: 0.5 + """ + if filename is None: + return True + return filename.endswith((".html", ".htm", ".xml", ".xhtml")) + + def update_template_context(self, context): + """Update the template context with some commonly used variables. + This injects request, session, config and g into the template + context as well as everything template context processors want + to inject. Note that the as of Flask 0.6, the original values + in the context will not be overridden if a context processor + decides to return a value with the same key. + + :param context: the context as a dictionary that is updated in place + to add extra variables. + """ + funcs = self.template_context_processors[None] + reqctx = _request_ctx_stack.top + if reqctx is not None: + bp = reqctx.request.blueprint + if bp is not None and bp in self.template_context_processors: + funcs = chain(funcs, self.template_context_processors[bp]) + orig_ctx = context.copy() + for func in funcs: + context.update(func()) + # make sure the original values win. This makes it possible to + # easier add new variables in context processors without breaking + # existing views. + context.update(orig_ctx) + + def make_shell_context(self): + """Returns the shell context for an interactive shell for this + application. This runs all the registered shell context + processors. + + .. versionadded:: 0.11 + """ + rv = {"app": self, "g": g} + for processor in self.shell_context_processors: + rv.update(processor()) + return rv + + #: What environment the app is running in. Flask and extensions may + #: enable behaviors based on the environment, such as enabling debug + #: mode. This maps to the :data:`ENV` config key. This is set by the + #: :envvar:`FLASK_ENV` environment variable and may not behave as + #: expected if set in code. + #: + #: **Do not enable development when deploying in production.** + #: + #: Default: ``'production'`` + env = ConfigAttribute("ENV") + + @property + def debug(self): + """Whether debug mode is enabled. When using ``flask run`` to start + the development server, an interactive debugger will be shown for + unhandled exceptions, and the server will be reloaded when code + changes. This maps to the :data:`DEBUG` config key. This is + enabled when :attr:`env` is ``'development'`` and is overridden + by the ``FLASK_DEBUG`` environment variable. It may not behave as + expected if set in code. + + **Do not enable debug mode when deploying in production.** + + Default: ``True`` if :attr:`env` is ``'development'``, or + ``False`` otherwise. + """ + return self.config["DEBUG"] + + @debug.setter + def debug(self, value): + self.config["DEBUG"] = value + self.jinja_env.auto_reload = self.templates_auto_reload + + def run(self, host=None, port=None, debug=None, load_dotenv=True, **options): + """Runs the application on a local development server. + + Do not use ``run()`` in a production setting. It is not intended to + meet security and performance requirements for a production server. + Instead, see :ref:`deployment` for WSGI server recommendations. + + If the :attr:`debug` flag is set the server will automatically reload + for code changes and show a debugger in case an exception happened. + + If you want to run the application in debug mode, but disable the + code execution on the interactive debugger, you can pass + ``use_evalex=False`` as parameter. This will keep the debugger's + traceback screen active, but disable code execution. + + It is not recommended to use this function for development with + automatic reloading as this is badly supported. Instead you should + be using the :command:`flask` command line script's ``run`` support. + + .. admonition:: Keep in Mind + + Flask will suppress any server error with a generic error page + unless it is in debug mode. As such to enable just the + interactive debugger without the code reloading, you have to + invoke :meth:`run` with ``debug=True`` and ``use_reloader=False``. + Setting ``use_debugger`` to ``True`` without being in debug mode + won't catch any exceptions because there won't be any to + catch. + + :param host: the hostname to listen on. Set this to ``'0.0.0.0'`` to + have the server available externally as well. Defaults to + ``'127.0.0.1'`` or the host in the ``SERVER_NAME`` config variable + if present. + :param port: the port of the webserver. Defaults to ``5000`` or the + port defined in the ``SERVER_NAME`` config variable if present. + :param debug: if given, enable or disable debug mode. See + :attr:`debug`. + :param load_dotenv: Load the nearest :file:`.env` and :file:`.flaskenv` + files to set environment variables. Will also change the working + directory to the directory containing the first file found. + :param options: the options to be forwarded to the underlying Werkzeug + server. See :func:`werkzeug.serving.run_simple` for more + information. + + .. versionchanged:: 1.0 + If installed, python-dotenv will be used to load environment + variables from :file:`.env` and :file:`.flaskenv` files. + + If set, the :envvar:`FLASK_ENV` and :envvar:`FLASK_DEBUG` + environment variables will override :attr:`env` and + :attr:`debug`. + + Threaded mode is enabled by default. + + .. versionchanged:: 0.10 + The default port is now picked from the ``SERVER_NAME`` + variable. + """ + # Change this into a no-op if the server is invoked from the + # command line. Have a look at cli.py for more information. + if os.environ.get("FLASK_RUN_FROM_CLI") == "true": + from .debughelpers import explain_ignored_app_run + + explain_ignored_app_run() + return + + if get_load_dotenv(load_dotenv): + cli.load_dotenv() + + # if set, let env vars override previous values + if "FLASK_ENV" in os.environ: + self.env = get_env() + self.debug = get_debug_flag() + elif "FLASK_DEBUG" in os.environ: + self.debug = get_debug_flag() + + # debug passed to method overrides all other sources + if debug is not None: + self.debug = bool(debug) + + _host = "127.0.0.1" + _port = 5000 + server_name = self.config.get("SERVER_NAME") + sn_host, sn_port = None, None + + if server_name: + sn_host, _, sn_port = server_name.partition(":") + + host = host or sn_host or _host + # pick the first value that's not None (0 is allowed) + port = int(next((p for p in (port, sn_port) if p is not None), _port)) + + options.setdefault("use_reloader", self.debug) + options.setdefault("use_debugger", self.debug) + options.setdefault("threaded", True) + + cli.show_server_banner(self.env, self.debug, self.name, False) + + from werkzeug.serving import run_simple + + try: + run_simple(host, port, self, **options) + finally: + # reset the first request information if the development server + # reset normally. This makes it possible to restart the server + # without reloader and that stuff from an interactive shell. + self._got_first_request = False + + def test_client(self, use_cookies=True, **kwargs): + """Creates a test client for this application. For information + about unit testing head over to :ref:`testing`. + + Note that if you are testing for assertions or exceptions in your + application code, you must set ``app.testing = True`` in order for the + exceptions to propagate to the test client. Otherwise, the exception + will be handled by the application (not visible to the test client) and + the only indication of an AssertionError or other exception will be a + 500 status code response to the test client. See the :attr:`testing` + attribute. For example:: + + app.testing = True + client = app.test_client() + + The test client can be used in a ``with`` block to defer the closing down + of the context until the end of the ``with`` block. This is useful if + you want to access the context locals for testing:: + + with app.test_client() as c: + rv = c.get('/?vodka=42') + assert request.args['vodka'] == '42' + + Additionally, you may pass optional keyword arguments that will then + be passed to the application's :attr:`test_client_class` constructor. + For example:: + + from flask.testing import FlaskClient + + class CustomClient(FlaskClient): + def __init__(self, *args, **kwargs): + self._authentication = kwargs.pop("authentication") + super(CustomClient,self).__init__( *args, **kwargs) + + app.test_client_class = CustomClient + client = app.test_client(authentication='Basic ....') + + See :class:`~flask.testing.FlaskClient` for more information. + + .. versionchanged:: 0.4 + added support for ``with`` block usage for the client. + + .. versionadded:: 0.7 + The `use_cookies` parameter was added as well as the ability + to override the client to be used by setting the + :attr:`test_client_class` attribute. + + .. versionchanged:: 0.11 + Added `**kwargs` to support passing additional keyword arguments to + the constructor of :attr:`test_client_class`. + """ + cls = self.test_client_class + if cls is None: + from .testing import FlaskClient as cls + return cls(self, self.response_class, use_cookies=use_cookies, **kwargs) + + def test_cli_runner(self, **kwargs): + """Create a CLI runner for testing CLI commands. + See :ref:`testing-cli`. + + Returns an instance of :attr:`test_cli_runner_class`, by default + :class:`~flask.testing.FlaskCliRunner`. The Flask app object is + passed as the first argument. + + .. versionadded:: 1.0 + """ + cls = self.test_cli_runner_class + + if cls is None: + from .testing import FlaskCliRunner as cls + + return cls(self, **kwargs) + + def open_session(self, request): + """Creates or opens a new session. Default implementation stores all + session data in a signed cookie. This requires that the + :attr:`secret_key` is set. Instead of overriding this method + we recommend replacing the :class:`session_interface`. + + .. deprecated: 1.0 + Will be removed in 1.1. Use ``session_interface.open_session`` + instead. + + :param request: an instance of :attr:`request_class`. + """ + + warnings.warn( + DeprecationWarning( + '"open_session" is deprecated and will be removed in 1.1. Use' + ' "session_interface.open_session" instead.' + ) + ) + return self.session_interface.open_session(self, request) + + def save_session(self, session, response): + """Saves the session if it needs updates. For the default + implementation, check :meth:`open_session`. Instead of overriding this + method we recommend replacing the :class:`session_interface`. + + .. deprecated: 1.0 + Will be removed in 1.1. Use ``session_interface.save_session`` + instead. + + :param session: the session to be saved (a + :class:`~werkzeug.contrib.securecookie.SecureCookie` + object) + :param response: an instance of :attr:`response_class` + """ + + warnings.warn( + DeprecationWarning( + '"save_session" is deprecated and will be removed in 1.1. Use' + ' "session_interface.save_session" instead.' + ) + ) + return self.session_interface.save_session(self, session, response) + + def make_null_session(self): + """Creates a new instance of a missing session. Instead of overriding + this method we recommend replacing the :class:`session_interface`. + + .. deprecated: 1.0 + Will be removed in 1.1. Use ``session_interface.make_null_session`` + instead. + + .. versionadded:: 0.7 + """ + + warnings.warn( + DeprecationWarning( + '"make_null_session" is deprecated and will be removed in 1.1. Use' + ' "session_interface.make_null_session" instead.' + ) + ) + return self.session_interface.make_null_session(self) + + @setupmethod + def register_blueprint(self, blueprint, **options): + """Register a :class:`~flask.Blueprint` on the application. Keyword + arguments passed to this method will override the defaults set on the + blueprint. + + Calls the blueprint's :meth:`~flask.Blueprint.register` method after + recording the blueprint in the application's :attr:`blueprints`. + + :param blueprint: The blueprint to register. + :param url_prefix: Blueprint routes will be prefixed with this. + :param subdomain: Blueprint routes will match on this subdomain. + :param url_defaults: Blueprint routes will use these default values for + view arguments. + :param options: Additional keyword arguments are passed to + :class:`~flask.blueprints.BlueprintSetupState`. They can be + accessed in :meth:`~flask.Blueprint.record` callbacks. + + .. versionadded:: 0.7 + """ + first_registration = False + + if blueprint.name in self.blueprints: + assert self.blueprints[blueprint.name] is blueprint, ( + "A name collision occurred between blueprints %r and %r. Both" + ' share the same name "%s". Blueprints that are created on the' + " fly need unique names." + % (blueprint, self.blueprints[blueprint.name], blueprint.name) + ) + else: + self.blueprints[blueprint.name] = blueprint + self._blueprint_order.append(blueprint) + first_registration = True + + blueprint.register(self, options, first_registration) + + def iter_blueprints(self): + """Iterates over all blueprints by the order they were registered. + + .. versionadded:: 0.11 + """ + return iter(self._blueprint_order) + + @setupmethod + def add_url_rule( + self, + rule, + endpoint=None, + view_func=None, + provide_automatic_options=None, + **options + ): + """Connects a URL rule. Works exactly like the :meth:`route` + decorator. If a view_func is provided it will be registered with the + endpoint. + + Basically this example:: + + @app.route('/') + def index(): + pass + + Is equivalent to the following:: + + def index(): + pass + app.add_url_rule('/', 'index', index) + + If the view_func is not provided you will need to connect the endpoint + to a view function like so:: + + app.view_functions['index'] = index + + Internally :meth:`route` invokes :meth:`add_url_rule` so if you want + to customize the behavior via subclassing you only need to change + this method. + + For more information refer to :ref:`url-route-registrations`. + + .. versionchanged:: 0.2 + `view_func` parameter added. + + .. versionchanged:: 0.6 + ``OPTIONS`` is added automatically as method. + + :param rule: the URL rule as string + :param endpoint: the endpoint for the registered URL rule. Flask + itself assumes the name of the view function as + endpoint + :param view_func: the function to call when serving a request to the + provided endpoint + :param provide_automatic_options: controls whether the ``OPTIONS`` + method should be added automatically. This can also be controlled + by setting the ``view_func.provide_automatic_options = False`` + before adding the rule. + :param options: the options to be forwarded to the underlying + :class:`~werkzeug.routing.Rule` object. A change + to Werkzeug is handling of method options. methods + is a list of methods this rule should be limited + to (``GET``, ``POST`` etc.). By default a rule + just listens for ``GET`` (and implicitly ``HEAD``). + Starting with Flask 0.6, ``OPTIONS`` is implicitly + added and handled by the standard request handling. + """ + if endpoint is None: + endpoint = _endpoint_from_view_func(view_func) + options["endpoint"] = endpoint + methods = options.pop("methods", None) + + # if the methods are not given and the view_func object knows its + # methods we can use that instead. If neither exists, we go with + # a tuple of only ``GET`` as default. + if methods is None: + methods = getattr(view_func, "methods", None) or ("GET",) + if isinstance(methods, string_types): + raise TypeError( + "Allowed methods have to be iterables of strings, " + 'for example: @app.route(..., methods=["POST"])' + ) + methods = set(item.upper() for item in methods) + + # Methods that should always be added + required_methods = set(getattr(view_func, "required_methods", ())) + + # starting with Flask 0.8 the view_func object can disable and + # force-enable the automatic options handling. + if provide_automatic_options is None: + provide_automatic_options = getattr( + view_func, "provide_automatic_options", None + ) + + if provide_automatic_options is None: + if "OPTIONS" not in methods: + provide_automatic_options = True + required_methods.add("OPTIONS") + else: + provide_automatic_options = False + + # Add the required methods now. + methods |= required_methods + + rule = self.url_rule_class(rule, methods=methods, **options) + rule.provide_automatic_options = provide_automatic_options + + self.url_map.add(rule) + if view_func is not None: + old_func = self.view_functions.get(endpoint) + if old_func is not None and old_func != view_func: + raise AssertionError( + "View function mapping is overwriting an " + "existing endpoint function: %s" % endpoint + ) + self.view_functions[endpoint] = view_func + + def route(self, rule, **options): + """A decorator that is used to register a view function for a + given URL rule. This does the same thing as :meth:`add_url_rule` + but is intended for decorator usage:: + + @app.route('/') + def index(): + return 'Hello World' + + For more information refer to :ref:`url-route-registrations`. + + :param rule: the URL rule as string + :param endpoint: the endpoint for the registered URL rule. Flask + itself assumes the name of the view function as + endpoint + :param options: the options to be forwarded to the underlying + :class:`~werkzeug.routing.Rule` object. A change + to Werkzeug is handling of method options. methods + is a list of methods this rule should be limited + to (``GET``, ``POST`` etc.). By default a rule + just listens for ``GET`` (and implicitly ``HEAD``). + Starting with Flask 0.6, ``OPTIONS`` is implicitly + added and handled by the standard request handling. + """ + + def decorator(f): + endpoint = options.pop("endpoint", None) + self.add_url_rule(rule, endpoint, f, **options) + return f + + return decorator + + @setupmethod + def endpoint(self, endpoint): + """A decorator to register a function as an endpoint. + Example:: + + @app.endpoint('example.endpoint') + def example(): + return "example" + + :param endpoint: the name of the endpoint + """ + + def decorator(f): + self.view_functions[endpoint] = f + return f + + return decorator + + @staticmethod + def _get_exc_class_and_code(exc_class_or_code): + """Get the exception class being handled. For HTTP status codes + or ``HTTPException`` subclasses, return both the exception and + status code. + + :param exc_class_or_code: Any exception class, or an HTTP status + code as an integer. + """ + if isinstance(exc_class_or_code, integer_types): + exc_class = default_exceptions[exc_class_or_code] + else: + exc_class = exc_class_or_code + + assert issubclass(exc_class, Exception) + + if issubclass(exc_class, HTTPException): + return exc_class, exc_class.code + else: + return exc_class, None + + @setupmethod + def errorhandler(self, code_or_exception): + """Register a function to handle errors by code or exception class. + + A decorator that is used to register a function given an + error code. Example:: + + @app.errorhandler(404) + def page_not_found(error): + return 'This page does not exist', 404 + + You can also register handlers for arbitrary exceptions:: + + @app.errorhandler(DatabaseError) + def special_exception_handler(error): + return 'Database connection failed', 500 + + .. versionadded:: 0.7 + Use :meth:`register_error_handler` instead of modifying + :attr:`error_handler_spec` directly, for application wide error + handlers. + + .. versionadded:: 0.7 + One can now additionally also register custom exception types + that do not necessarily have to be a subclass of the + :class:`~werkzeug.exceptions.HTTPException` class. + + :param code_or_exception: the code as integer for the handler, or + an arbitrary exception + """ + + def decorator(f): + self._register_error_handler(None, code_or_exception, f) + return f + + return decorator + + @setupmethod + def register_error_handler(self, code_or_exception, f): + """Alternative error attach function to the :meth:`errorhandler` + decorator that is more straightforward to use for non decorator + usage. + + .. versionadded:: 0.7 + """ + self._register_error_handler(None, code_or_exception, f) + + @setupmethod + def _register_error_handler(self, key, code_or_exception, f): + """ + :type key: None|str + :type code_or_exception: int|T<=Exception + :type f: callable + """ + if isinstance(code_or_exception, HTTPException): # old broken behavior + raise ValueError( + "Tried to register a handler for an exception instance {0!r}." + " Handlers can only be registered for exception classes or" + " HTTP error codes.".format(code_or_exception) + ) + + try: + exc_class, code = self._get_exc_class_and_code(code_or_exception) + except KeyError: + raise KeyError( + "'{0}' is not a recognized HTTP error code. Use a subclass of" + " HTTPException with that code instead.".format(code_or_exception) + ) + + handlers = self.error_handler_spec.setdefault(key, {}).setdefault(code, {}) + handlers[exc_class] = f + + @setupmethod + def template_filter(self, name=None): + """A decorator that is used to register custom template filter. + You can specify a name for the filter, otherwise the function + name will be used. Example:: + + @app.template_filter() + def reverse(s): + return s[::-1] + + :param name: the optional name of the filter, otherwise the + function name will be used. + """ + + def decorator(f): + self.add_template_filter(f, name=name) + return f + + return decorator + + @setupmethod + def add_template_filter(self, f, name=None): + """Register a custom template filter. Works exactly like the + :meth:`template_filter` decorator. + + :param name: the optional name of the filter, otherwise the + function name will be used. + """ + self.jinja_env.filters[name or f.__name__] = f + + @setupmethod + def template_test(self, name=None): + """A decorator that is used to register custom template test. + You can specify a name for the test, otherwise the function + name will be used. Example:: + + @app.template_test() + def is_prime(n): + if n == 2: + return True + for i in range(2, int(math.ceil(math.sqrt(n))) + 1): + if n % i == 0: + return False + return True + + .. versionadded:: 0.10 + + :param name: the optional name of the test, otherwise the + function name will be used. + """ + + def decorator(f): + self.add_template_test(f, name=name) + return f + + return decorator + + @setupmethod + def add_template_test(self, f, name=None): + """Register a custom template test. Works exactly like the + :meth:`template_test` decorator. + + .. versionadded:: 0.10 + + :param name: the optional name of the test, otherwise the + function name will be used. + """ + self.jinja_env.tests[name or f.__name__] = f + + @setupmethod + def template_global(self, name=None): + """A decorator that is used to register a custom template global function. + You can specify a name for the global function, otherwise the function + name will be used. Example:: + + @app.template_global() + def double(n): + return 2 * n + + .. versionadded:: 0.10 + + :param name: the optional name of the global function, otherwise the + function name will be used. + """ + + def decorator(f): + self.add_template_global(f, name=name) + return f + + return decorator + + @setupmethod + def add_template_global(self, f, name=None): + """Register a custom template global function. Works exactly like the + :meth:`template_global` decorator. + + .. versionadded:: 0.10 + + :param name: the optional name of the global function, otherwise the + function name will be used. + """ + self.jinja_env.globals[name or f.__name__] = f + + @setupmethod + def before_request(self, f): + """Registers a function to run before each request. + + For example, this can be used to open a database connection, or to load + the logged in user from the session. + + The function will be called without any arguments. If it returns a + non-None value, the value is handled as if it was the return value from + the view, and further request handling is stopped. + """ + self.before_request_funcs.setdefault(None, []).append(f) + return f + + @setupmethod + def before_first_request(self, f): + """Registers a function to be run before the first request to this + instance of the application. + + The function will be called without any arguments and its return + value is ignored. + + .. versionadded:: 0.8 + """ + self.before_first_request_funcs.append(f) + return f + + @setupmethod + def after_request(self, f): + """Register a function to be run after each request. + + Your function must take one parameter, an instance of + :attr:`response_class` and return a new response object or the + same (see :meth:`process_response`). + + As of Flask 0.7 this function might not be executed at the end of the + request in case an unhandled exception occurred. + """ + self.after_request_funcs.setdefault(None, []).append(f) + return f + + @setupmethod + def teardown_request(self, f): + """Register a function to be run at the end of each request, + regardless of whether there was an exception or not. These functions + are executed when the request context is popped, even if not an + actual request was performed. + + Example:: + + ctx = app.test_request_context() + ctx.push() + ... + ctx.pop() + + When ``ctx.pop()`` is executed in the above example, the teardown + functions are called just before the request context moves from the + stack of active contexts. This becomes relevant if you are using + such constructs in tests. + + Generally teardown functions must take every necessary step to avoid + that they will fail. If they do execute code that might fail they + will have to surround the execution of these code by try/except + statements and log occurring errors. + + When a teardown function was called because of an exception it will + be passed an error object. + + The return values of teardown functions are ignored. + + .. admonition:: Debug Note + + In debug mode Flask will not tear down a request on an exception + immediately. Instead it will keep it alive so that the interactive + debugger can still access it. This behavior can be controlled + by the ``PRESERVE_CONTEXT_ON_EXCEPTION`` configuration variable. + """ + self.teardown_request_funcs.setdefault(None, []).append(f) + return f + + @setupmethod + def teardown_appcontext(self, f): + """Registers a function to be called when the application context + ends. These functions are typically also called when the request + context is popped. + + Example:: + + ctx = app.app_context() + ctx.push() + ... + ctx.pop() + + When ``ctx.pop()`` is executed in the above example, the teardown + functions are called just before the app context moves from the + stack of active contexts. This becomes relevant if you are using + such constructs in tests. + + Since a request context typically also manages an application + context it would also be called when you pop a request context. + + When a teardown function was called because of an unhandled exception + it will be passed an error object. If an :meth:`errorhandler` is + registered, it will handle the exception and the teardown will not + receive it. + + The return values of teardown functions are ignored. + + .. versionadded:: 0.9 + """ + self.teardown_appcontext_funcs.append(f) + return f + + @setupmethod + def context_processor(self, f): + """Registers a template context processor function.""" + self.template_context_processors[None].append(f) + return f + + @setupmethod + def shell_context_processor(self, f): + """Registers a shell context processor function. + + .. versionadded:: 0.11 + """ + self.shell_context_processors.append(f) + return f + + @setupmethod + def url_value_preprocessor(self, f): + """Register a URL value preprocessor function for all view + functions in the application. These functions will be called before the + :meth:`before_request` functions. + + The function can modify the values captured from the matched url before + they are passed to the view. For example, this can be used to pop a + common language code value and place it in ``g`` rather than pass it to + every view. + + The function is passed the endpoint name and values dict. The return + value is ignored. + """ + self.url_value_preprocessors.setdefault(None, []).append(f) + return f + + @setupmethod + def url_defaults(self, f): + """Callback function for URL defaults for all view functions of the + application. It's called with the endpoint and values and should + update the values passed in place. + """ + self.url_default_functions.setdefault(None, []).append(f) + return f + + def _find_error_handler(self, e): + """Return a registered error handler for an exception in this order: + blueprint handler for a specific code, app handler for a specific code, + blueprint handler for an exception class, app handler for an exception + class, or ``None`` if a suitable handler is not found. + """ + exc_class, code = self._get_exc_class_and_code(type(e)) + + for name, c in ( + (request.blueprint, code), + (None, code), + (request.blueprint, None), + (None, None), + ): + handler_map = self.error_handler_spec.setdefault(name, {}).get(c) + + if not handler_map: + continue + + for cls in exc_class.__mro__: + handler = handler_map.get(cls) + + if handler is not None: + return handler + + def handle_http_exception(self, e): + """Handles an HTTP exception. By default this will invoke the + registered error handlers and fall back to returning the + exception as response. + + .. versionchanged:: 1.0.3 + ``RoutingException``, used internally for actions such as + slash redirects during routing, is not passed to error + handlers. + + .. versionchanged:: 1.0 + Exceptions are looked up by code *and* by MRO, so + ``HTTPExcpetion`` subclasses can be handled with a catch-all + handler for the base ``HTTPException``. + + .. versionadded:: 0.3 + """ + # Proxy exceptions don't have error codes. We want to always return + # those unchanged as errors + if e.code is None: + return e + + # RoutingExceptions are used internally to trigger routing + # actions, such as slash redirects raising RequestRedirect. They + # are not raised or handled in user code. + if isinstance(e, RoutingException): + return e + + handler = self._find_error_handler(e) + if handler is None: + return e + return handler(e) + + def trap_http_exception(self, e): + """Checks if an HTTP exception should be trapped or not. By default + this will return ``False`` for all exceptions except for a bad request + key error if ``TRAP_BAD_REQUEST_ERRORS`` is set to ``True``. It + also returns ``True`` if ``TRAP_HTTP_EXCEPTIONS`` is set to ``True``. + + This is called for all HTTP exceptions raised by a view function. + If it returns ``True`` for any exception the error handler for this + exception is not called and it shows up as regular exception in the + traceback. This is helpful for debugging implicitly raised HTTP + exceptions. + + .. versionchanged:: 1.0 + Bad request errors are not trapped by default in debug mode. + + .. versionadded:: 0.8 + """ + if self.config["TRAP_HTTP_EXCEPTIONS"]: + return True + + trap_bad_request = self.config["TRAP_BAD_REQUEST_ERRORS"] + + # if unset, trap key errors in debug mode + if ( + trap_bad_request is None + and self.debug + and isinstance(e, BadRequestKeyError) + ): + return True + + if trap_bad_request: + return isinstance(e, BadRequest) + + return False + + def handle_user_exception(self, e): + """This method is called whenever an exception occurs that + should be handled. A special case is :class:`~werkzeug + .exceptions.HTTPException` which is forwarded to the + :meth:`handle_http_exception` method. This function will either + return a response value or reraise the exception with the same + traceback. + + .. versionchanged:: 1.0 + Key errors raised from request data like ``form`` show the + bad key in debug mode rather than a generic bad request + message. + + .. versionadded:: 0.7 + """ + exc_type, exc_value, tb = sys.exc_info() + assert exc_value is e + # ensure not to trash sys.exc_info() at that point in case someone + # wants the traceback preserved in handle_http_exception. Of course + # we cannot prevent users from trashing it themselves in a custom + # trap_http_exception method so that's their fault then. + + if isinstance(e, BadRequestKeyError): + if self.debug or self.config["TRAP_BAD_REQUEST_ERRORS"]: + e.show_exception = True + + # Werkzeug < 0.15 doesn't add the KeyError to the 400 + # message, add it in manually. + # TODO: clean up once Werkzeug >= 0.15.5 is required + if e.args[0] not in e.get_description(): + e.description = "KeyError: '{}'".format(*e.args) + elif not hasattr(BadRequestKeyError, "show_exception"): + e.args = () + + if isinstance(e, HTTPException) and not self.trap_http_exception(e): + return self.handle_http_exception(e) + + handler = self._find_error_handler(e) + + if handler is None: + reraise(exc_type, exc_value, tb) + return handler(e) + + def handle_exception(self, e): + """Handle an exception that did not have an error handler + associated with it, or that was raised from an error handler. + This always causes a 500 ``InternalServerError``. + + Always sends the :data:`got_request_exception` signal. + + If :attr:`propagate_exceptions` is ``True``, such as in debug + mode, the error will be re-raised so that the debugger can + display it. Otherwise, the original exception is logged, and + an :exc:`~werkzeug.exceptions.InternalServerError` is returned. + + If an error handler is registered for ``InternalServerError`` or + ``500``, it will be used. For consistency, the handler will + always receive the ``InternalServerError``. The original + unhandled exception is available as ``e.original_exception``. + + .. note:: + Prior to Werkzeug 1.0.0, ``InternalServerError`` will not + always have an ``original_exception`` attribute. Use + ``getattr(e, "original_exception", None)`` to simulate the + behavior for compatibility. + + .. versionchanged:: 1.1.0 + Always passes the ``InternalServerError`` instance to the + handler, setting ``original_exception`` to the unhandled + error. + + .. versionchanged:: 1.1.0 + ``after_request`` functions and other finalization is done + even for the default 500 response when there is no handler. + + .. versionadded:: 0.3 + """ + exc_type, exc_value, tb = sys.exc_info() + got_request_exception.send(self, exception=e) + + if self.propagate_exceptions: + # if we want to repropagate the exception, we can attempt to + # raise it with the whole traceback in case we can do that + # (the function was actually called from the except part) + # otherwise, we just raise the error again + if exc_value is e: + reraise(exc_type, exc_value, tb) + else: + raise e + + self.log_exception((exc_type, exc_value, tb)) + server_error = InternalServerError() + # TODO: pass as param when Werkzeug>=1.0.0 is required + # TODO: also remove note about this from docstring and docs + server_error.original_exception = e + handler = self._find_error_handler(server_error) + + if handler is not None: + server_error = handler(server_error) + + return self.finalize_request(server_error, from_error_handler=True) + + def log_exception(self, exc_info): + """Logs an exception. This is called by :meth:`handle_exception` + if debugging is disabled and right before the handler is called. + The default implementation logs the exception as error on the + :attr:`logger`. + + .. versionadded:: 0.8 + """ + self.logger.error( + "Exception on %s [%s]" % (request.path, request.method), exc_info=exc_info + ) + + def raise_routing_exception(self, request): + """Exceptions that are recording during routing are reraised with + this method. During debug we are not reraising redirect requests + for non ``GET``, ``HEAD``, or ``OPTIONS`` requests and we're raising + a different error instead to help debug situations. + + :internal: + """ + if ( + not self.debug + or not isinstance(request.routing_exception, RequestRedirect) + or request.method in ("GET", "HEAD", "OPTIONS") + ): + raise request.routing_exception + + from .debughelpers import FormDataRoutingRedirect + + raise FormDataRoutingRedirect(request) + + def dispatch_request(self): + """Does the request dispatching. Matches the URL and returns the + return value of the view or error handler. This does not have to + be a response object. In order to convert the return value to a + proper response object, call :func:`make_response`. + + .. versionchanged:: 0.7 + This no longer does the exception handling, this code was + moved to the new :meth:`full_dispatch_request`. + """ + req = _request_ctx_stack.top.request + if req.routing_exception is not None: + self.raise_routing_exception(req) + rule = req.url_rule + # if we provide automatic options for this URL and the + # request came with the OPTIONS method, reply automatically + if ( + getattr(rule, "provide_automatic_options", False) + and req.method == "OPTIONS" + ): + return self.make_default_options_response() + # otherwise dispatch to the handler for that endpoint + return self.view_functions[rule.endpoint](**req.view_args) + + def full_dispatch_request(self): + """Dispatches the request and on top of that performs request + pre and postprocessing as well as HTTP exception catching and + error handling. + + .. versionadded:: 0.7 + """ + self.try_trigger_before_first_request_functions() + try: + request_started.send(self) + rv = self.preprocess_request() + if rv is None: + rv = self.dispatch_request() + except Exception as e: + rv = self.handle_user_exception(e) + return self.finalize_request(rv) + + def finalize_request(self, rv, from_error_handler=False): + """Given the return value from a view function this finalizes + the request by converting it into a response and invoking the + postprocessing functions. This is invoked for both normal + request dispatching as well as error handlers. + + Because this means that it might be called as a result of a + failure a special safe mode is available which can be enabled + with the `from_error_handler` flag. If enabled, failures in + response processing will be logged and otherwise ignored. + + :internal: + """ + response = self.make_response(rv) + try: + response = self.process_response(response) + request_finished.send(self, response=response) + except Exception: + if not from_error_handler: + raise + self.logger.exception( + "Request finalizing failed with an error while handling an error" + ) + return response + + def try_trigger_before_first_request_functions(self): + """Called before each request and will ensure that it triggers + the :attr:`before_first_request_funcs` and only exactly once per + application instance (which means process usually). + + :internal: + """ + if self._got_first_request: + return + with self._before_request_lock: + if self._got_first_request: + return + for func in self.before_first_request_funcs: + func() + self._got_first_request = True + + def make_default_options_response(self): + """This method is called to create the default ``OPTIONS`` response. + This can be changed through subclassing to change the default + behavior of ``OPTIONS`` responses. + + .. versionadded:: 0.7 + """ + adapter = _request_ctx_stack.top.url_adapter + if hasattr(adapter, "allowed_methods"): + methods = adapter.allowed_methods() + else: + # fallback for Werkzeug < 0.7 + methods = [] + try: + adapter.match(method="--") + except MethodNotAllowed as e: + methods = e.valid_methods + except HTTPException: + pass + rv = self.response_class() + rv.allow.update(methods) + return rv + + def should_ignore_error(self, error): + """This is called to figure out if an error should be ignored + or not as far as the teardown system is concerned. If this + function returns ``True`` then the teardown handlers will not be + passed the error. + + .. versionadded:: 0.10 + """ + return False + + def make_response(self, rv): + """Convert the return value from a view function to an instance of + :attr:`response_class`. + + :param rv: the return value from the view function. The view function + must return a response. Returning ``None``, or the view ending + without returning, is not allowed. The following types are allowed + for ``view_rv``: + + ``str`` (``unicode`` in Python 2) + A response object is created with the string encoded to UTF-8 + as the body. + + ``bytes`` (``str`` in Python 2) + A response object is created with the bytes as the body. + + ``dict`` + A dictionary that will be jsonify'd before being returned. + + ``tuple`` + Either ``(body, status, headers)``, ``(body, status)``, or + ``(body, headers)``, where ``body`` is any of the other types + allowed here, ``status`` is a string or an integer, and + ``headers`` is a dictionary or a list of ``(key, value)`` + tuples. If ``body`` is a :attr:`response_class` instance, + ``status`` overwrites the exiting value and ``headers`` are + extended. + + :attr:`response_class` + The object is returned unchanged. + + other :class:`~werkzeug.wrappers.Response` class + The object is coerced to :attr:`response_class`. + + :func:`callable` + The function is called as a WSGI application. The result is + used to create a response object. + + .. versionchanged:: 0.9 + Previously a tuple was interpreted as the arguments for the + response object. + """ + + status = headers = None + + # unpack tuple returns + if isinstance(rv, tuple): + len_rv = len(rv) + + # a 3-tuple is unpacked directly + if len_rv == 3: + rv, status, headers = rv + # decide if a 2-tuple has status or headers + elif len_rv == 2: + if isinstance(rv[1], (Headers, dict, tuple, list)): + rv, headers = rv + else: + rv, status = rv + # other sized tuples are not allowed + else: + raise TypeError( + "The view function did not return a valid response tuple." + " The tuple must have the form (body, status, headers)," + " (body, status), or (body, headers)." + ) + + # the body must not be None + if rv is None: + raise TypeError( + "The view function did not return a valid response. The" + " function either returned None or ended without a return" + " statement." + ) + + # make sure the body is an instance of the response class + if not isinstance(rv, self.response_class): + if isinstance(rv, (text_type, bytes, bytearray)): + # let the response class set the status and headers instead of + # waiting to do it manually, so that the class can handle any + # special logic + rv = self.response_class(rv, status=status, headers=headers) + status = headers = None + elif isinstance(rv, dict): + rv = jsonify(rv) + elif isinstance(rv, BaseResponse) or callable(rv): + # evaluate a WSGI callable, or coerce a different response + # class to the correct type + try: + rv = self.response_class.force_type(rv, request.environ) + except TypeError as e: + new_error = TypeError( + "{e}\nThe view function did not return a valid" + " response. The return type must be a string, dict, tuple," + " Response instance, or WSGI callable, but it was a" + " {rv.__class__.__name__}.".format(e=e, rv=rv) + ) + reraise(TypeError, new_error, sys.exc_info()[2]) + else: + raise TypeError( + "The view function did not return a valid" + " response. The return type must be a string, dict, tuple," + " Response instance, or WSGI callable, but it was a" + " {rv.__class__.__name__}.".format(rv=rv) + ) + + # prefer the status if it was provided + if status is not None: + if isinstance(status, (text_type, bytes, bytearray)): + rv.status = status + else: + rv.status_code = status + + # extend existing headers with provided headers + if headers: + rv.headers.extend(headers) + + return rv + + def create_url_adapter(self, request): + """Creates a URL adapter for the given request. The URL adapter + is created at a point where the request context is not yet set + up so the request is passed explicitly. + + .. versionadded:: 0.6 + + .. versionchanged:: 0.9 + This can now also be called without a request object when the + URL adapter is created for the application context. + + .. versionchanged:: 1.0 + :data:`SERVER_NAME` no longer implicitly enables subdomain + matching. Use :attr:`subdomain_matching` instead. + """ + if request is not None: + # If subdomain matching is disabled (the default), use the + # default subdomain in all cases. This should be the default + # in Werkzeug but it currently does not have that feature. + subdomain = ( + (self.url_map.default_subdomain or None) + if not self.subdomain_matching + else None + ) + return self.url_map.bind_to_environ( + request.environ, + server_name=self.config["SERVER_NAME"], + subdomain=subdomain, + ) + # We need at the very least the server name to be set for this + # to work. + if self.config["SERVER_NAME"] is not None: + return self.url_map.bind( + self.config["SERVER_NAME"], + script_name=self.config["APPLICATION_ROOT"], + url_scheme=self.config["PREFERRED_URL_SCHEME"], + ) + + def inject_url_defaults(self, endpoint, values): + """Injects the URL defaults for the given endpoint directly into + the values dictionary passed. This is used internally and + automatically called on URL building. + + .. versionadded:: 0.7 + """ + funcs = self.url_default_functions.get(None, ()) + if "." in endpoint: + bp = endpoint.rsplit(".", 1)[0] + funcs = chain(funcs, self.url_default_functions.get(bp, ())) + for func in funcs: + func(endpoint, values) + + def handle_url_build_error(self, error, endpoint, values): + """Handle :class:`~werkzeug.routing.BuildError` on :meth:`url_for`. + """ + exc_type, exc_value, tb = sys.exc_info() + for handler in self.url_build_error_handlers: + try: + rv = handler(error, endpoint, values) + if rv is not None: + return rv + except BuildError as e: + # make error available outside except block (py3) + error = e + + # At this point we want to reraise the exception. If the error is + # still the same one we can reraise it with the original traceback, + # otherwise we raise it from here. + if error is exc_value: + reraise(exc_type, exc_value, tb) + raise error + + def preprocess_request(self): + """Called before the request is dispatched. Calls + :attr:`url_value_preprocessors` registered with the app and the + current blueprint (if any). Then calls :attr:`before_request_funcs` + registered with the app and the blueprint. + + If any :meth:`before_request` handler returns a non-None value, the + value is handled as if it was the return value from the view, and + further request handling is stopped. + """ + + bp = _request_ctx_stack.top.request.blueprint + + funcs = self.url_value_preprocessors.get(None, ()) + if bp is not None and bp in self.url_value_preprocessors: + funcs = chain(funcs, self.url_value_preprocessors[bp]) + for func in funcs: + func(request.endpoint, request.view_args) + + funcs = self.before_request_funcs.get(None, ()) + if bp is not None and bp in self.before_request_funcs: + funcs = chain(funcs, self.before_request_funcs[bp]) + for func in funcs: + rv = func() + if rv is not None: + return rv + + def process_response(self, response): + """Can be overridden in order to modify the response object + before it's sent to the WSGI server. By default this will + call all the :meth:`after_request` decorated functions. + + .. versionchanged:: 0.5 + As of Flask 0.5 the functions registered for after request + execution are called in reverse order of registration. + + :param response: a :attr:`response_class` object. + :return: a new response object or the same, has to be an + instance of :attr:`response_class`. + """ + ctx = _request_ctx_stack.top + bp = ctx.request.blueprint + funcs = ctx._after_request_functions + if bp is not None and bp in self.after_request_funcs: + funcs = chain(funcs, reversed(self.after_request_funcs[bp])) + if None in self.after_request_funcs: + funcs = chain(funcs, reversed(self.after_request_funcs[None])) + for handler in funcs: + response = handler(response) + if not self.session_interface.is_null_session(ctx.session): + self.session_interface.save_session(self, ctx.session, response) + return response + + def do_teardown_request(self, exc=_sentinel): + """Called after the request is dispatched and the response is + returned, right before the request context is popped. + + This calls all functions decorated with + :meth:`teardown_request`, and :meth:`Blueprint.teardown_request` + if a blueprint handled the request. Finally, the + :data:`request_tearing_down` signal is sent. + + This is called by + :meth:`RequestContext.pop() `, + which may be delayed during testing to maintain access to + resources. + + :param exc: An unhandled exception raised while dispatching the + request. Detected from the current exception information if + not passed. Passed to each teardown function. + + .. versionchanged:: 0.9 + Added the ``exc`` argument. + """ + if exc is _sentinel: + exc = sys.exc_info()[1] + funcs = reversed(self.teardown_request_funcs.get(None, ())) + bp = _request_ctx_stack.top.request.blueprint + if bp is not None and bp in self.teardown_request_funcs: + funcs = chain(funcs, reversed(self.teardown_request_funcs[bp])) + for func in funcs: + func(exc) + request_tearing_down.send(self, exc=exc) + + def do_teardown_appcontext(self, exc=_sentinel): + """Called right before the application context is popped. + + When handling a request, the application context is popped + after the request context. See :meth:`do_teardown_request`. + + This calls all functions decorated with + :meth:`teardown_appcontext`. Then the + :data:`appcontext_tearing_down` signal is sent. + + This is called by + :meth:`AppContext.pop() `. + + .. versionadded:: 0.9 + """ + if exc is _sentinel: + exc = sys.exc_info()[1] + for func in reversed(self.teardown_appcontext_funcs): + func(exc) + appcontext_tearing_down.send(self, exc=exc) + + def app_context(self): + """Create an :class:`~flask.ctx.AppContext`. Use as a ``with`` + block to push the context, which will make :data:`current_app` + point at this application. + + An application context is automatically pushed by + :meth:`RequestContext.push() ` + when handling a request, and when running a CLI command. Use + this to manually create a context outside of these situations. + + :: + + with app.app_context(): + init_db() + + See :doc:`/appcontext`. + + .. versionadded:: 0.9 + """ + return AppContext(self) + + def request_context(self, environ): + """Create a :class:`~flask.ctx.RequestContext` representing a + WSGI environment. Use a ``with`` block to push the context, + which will make :data:`request` point at this request. + + See :doc:`/reqcontext`. + + Typically you should not call this from your own code. A request + context is automatically pushed by the :meth:`wsgi_app` when + handling a request. Use :meth:`test_request_context` to create + an environment and context instead of this method. + + :param environ: a WSGI environment + """ + return RequestContext(self, environ) + + def test_request_context(self, *args, **kwargs): + """Create a :class:`~flask.ctx.RequestContext` for a WSGI + environment created from the given values. This is mostly useful + during testing, where you may want to run a function that uses + request data without dispatching a full request. + + See :doc:`/reqcontext`. + + Use a ``with`` block to push the context, which will make + :data:`request` point at the request for the created + environment. :: + + with test_request_context(...): + generate_report() + + When using the shell, it may be easier to push and pop the + context manually to avoid indentation. :: + + ctx = app.test_request_context(...) + ctx.push() + ... + ctx.pop() + + Takes the same arguments as Werkzeug's + :class:`~werkzeug.test.EnvironBuilder`, with some defaults from + the application. See the linked Werkzeug docs for most of the + available arguments. Flask-specific behavior is listed here. + + :param path: URL path being requested. + :param base_url: Base URL where the app is being served, which + ``path`` is relative to. If not given, built from + :data:`PREFERRED_URL_SCHEME`, ``subdomain``, + :data:`SERVER_NAME`, and :data:`APPLICATION_ROOT`. + :param subdomain: Subdomain name to append to + :data:`SERVER_NAME`. + :param url_scheme: Scheme to use instead of + :data:`PREFERRED_URL_SCHEME`. + :param data: The request body, either as a string or a dict of + form keys and values. + :param json: If given, this is serialized as JSON and passed as + ``data``. Also defaults ``content_type`` to + ``application/json``. + :param args: other positional arguments passed to + :class:`~werkzeug.test.EnvironBuilder`. + :param kwargs: other keyword arguments passed to + :class:`~werkzeug.test.EnvironBuilder`. + """ + from .testing import EnvironBuilder + + builder = EnvironBuilder(self, *args, **kwargs) + + try: + return self.request_context(builder.get_environ()) + finally: + builder.close() + + def wsgi_app(self, environ, start_response): + """The actual WSGI application. This is not implemented in + :meth:`__call__` so that middlewares can be applied without + losing a reference to the app object. Instead of doing this:: + + app = MyMiddleware(app) + + It's a better idea to do this instead:: + + app.wsgi_app = MyMiddleware(app.wsgi_app) + + Then you still have the original application object around and + can continue to call methods on it. + + .. versionchanged:: 0.7 + Teardown events for the request and app contexts are called + even if an unhandled error occurs. Other events may not be + called depending on when an error occurs during dispatch. + See :ref:`callbacks-and-errors`. + + :param environ: A WSGI environment. + :param start_response: A callable accepting a status code, + a list of headers, and an optional exception context to + start the response. + """ + ctx = self.request_context(environ) + error = None + try: + try: + ctx.push() + response = self.full_dispatch_request() + except Exception as e: + error = e + response = self.handle_exception(e) + except: # noqa: B001 + error = sys.exc_info()[1] + raise + return response(environ, start_response) + finally: + if self.should_ignore_error(error): + error = None + ctx.auto_pop(error) + + def __call__(self, environ, start_response): + """The WSGI server calls the Flask application object as the + WSGI application. This calls :meth:`wsgi_app` which can be + wrapped to applying middleware.""" + return self.wsgi_app(environ, start_response) + + def __repr__(self): + return "<%s %r>" % (self.__class__.__name__, self.name) diff --git a/env/Lib/site-packages/flask/blueprints.py b/env/Lib/site-packages/flask/blueprints.py new file mode 100644 index 0000000..8978104 --- /dev/null +++ b/env/Lib/site-packages/flask/blueprints.py @@ -0,0 +1,569 @@ +# -*- coding: utf-8 -*- +""" + flask.blueprints + ~~~~~~~~~~~~~~~~ + + Blueprints are the recommended way to implement larger or more + pluggable applications in Flask 0.7 and later. + + :copyright: 2010 Pallets + :license: BSD-3-Clause +""" +from functools import update_wrapper + +from .helpers import _endpoint_from_view_func +from .helpers import _PackageBoundObject + +# a singleton sentinel value for parameter defaults +_sentinel = object() + + +class BlueprintSetupState(object): + """Temporary holder object for registering a blueprint with the + application. An instance of this class is created by the + :meth:`~flask.Blueprint.make_setup_state` method and later passed + to all register callback functions. + """ + + def __init__(self, blueprint, app, options, first_registration): + #: a reference to the current application + self.app = app + + #: a reference to the blueprint that created this setup state. + self.blueprint = blueprint + + #: a dictionary with all options that were passed to the + #: :meth:`~flask.Flask.register_blueprint` method. + self.options = options + + #: as blueprints can be registered multiple times with the + #: application and not everything wants to be registered + #: multiple times on it, this attribute can be used to figure + #: out if the blueprint was registered in the past already. + self.first_registration = first_registration + + subdomain = self.options.get("subdomain") + if subdomain is None: + subdomain = self.blueprint.subdomain + + #: The subdomain that the blueprint should be active for, ``None`` + #: otherwise. + self.subdomain = subdomain + + url_prefix = self.options.get("url_prefix") + if url_prefix is None: + url_prefix = self.blueprint.url_prefix + #: The prefix that should be used for all URLs defined on the + #: blueprint. + self.url_prefix = url_prefix + + #: A dictionary with URL defaults that is added to each and every + #: URL that was defined with the blueprint. + self.url_defaults = dict(self.blueprint.url_values_defaults) + self.url_defaults.update(self.options.get("url_defaults", ())) + + def add_url_rule(self, rule, endpoint=None, view_func=None, **options): + """A helper method to register a rule (and optionally a view function) + to the application. The endpoint is automatically prefixed with the + blueprint's name. + """ + if self.url_prefix is not None: + if rule: + rule = "/".join((self.url_prefix.rstrip("/"), rule.lstrip("/"))) + else: + rule = self.url_prefix + options.setdefault("subdomain", self.subdomain) + if endpoint is None: + endpoint = _endpoint_from_view_func(view_func) + defaults = self.url_defaults + if "defaults" in options: + defaults = dict(defaults, **options.pop("defaults")) + self.app.add_url_rule( + rule, + "%s.%s" % (self.blueprint.name, endpoint), + view_func, + defaults=defaults, + **options + ) + + +class Blueprint(_PackageBoundObject): + """Represents a blueprint, a collection of routes and other + app-related functions that can be registered on a real application + later. + + A blueprint is an object that allows defining application functions + without requiring an application object ahead of time. It uses the + same decorators as :class:`~flask.Flask`, but defers the need for an + application by recording them for later registration. + + Decorating a function with a blueprint creates a deferred function + that is called with :class:`~flask.blueprints.BlueprintSetupState` + when the blueprint is registered on an application. + + See :ref:`blueprints` for more information. + + .. versionchanged:: 1.1.0 + Blueprints have a ``cli`` group to register nested CLI commands. + The ``cli_group`` parameter controls the name of the group under + the ``flask`` command. + + .. versionadded:: 0.7 + + :param name: The name of the blueprint. Will be prepended to each + endpoint name. + :param import_name: The name of the blueprint package, usually + ``__name__``. This helps locate the ``root_path`` for the + blueprint. + :param static_folder: A folder with static files that should be + served by the blueprint's static route. The path is relative to + the blueprint's root path. Blueprint static files are disabled + by default. + :param static_url_path: The url to serve static files from. + Defaults to ``static_folder``. If the blueprint does not have + a ``url_prefix``, the app's static route will take precedence, + and the blueprint's static files won't be accessible. + :param template_folder: A folder with templates that should be added + to the app's template search path. The path is relative to the + blueprint's root path. Blueprint templates are disabled by + default. Blueprint templates have a lower precedence than those + in the app's templates folder. + :param url_prefix: A path to prepend to all of the blueprint's URLs, + to make them distinct from the rest of the app's routes. + :param subdomain: A subdomain that blueprint routes will match on by + default. + :param url_defaults: A dict of default values that blueprint routes + will receive by default. + :param root_path: By default, the blueprint will automatically this + based on ``import_name``. In certain situations this automatic + detection can fail, so the path can be specified manually + instead. + """ + + warn_on_modifications = False + _got_registered_once = False + + #: Blueprint local JSON decoder class to use. + #: Set to ``None`` to use the app's :class:`~flask.app.Flask.json_encoder`. + json_encoder = None + #: Blueprint local JSON decoder class to use. + #: Set to ``None`` to use the app's :class:`~flask.app.Flask.json_decoder`. + json_decoder = None + + # TODO remove the next three attrs when Sphinx :inherited-members: works + # https://github.com/sphinx-doc/sphinx/issues/741 + + #: The name of the package or module that this app belongs to. Do not + #: change this once it is set by the constructor. + import_name = None + + #: Location of the template files to be added to the template lookup. + #: ``None`` if templates should not be added. + template_folder = None + + #: Absolute path to the package on the filesystem. Used to look up + #: resources contained in the package. + root_path = None + + def __init__( + self, + name, + import_name, + static_folder=None, + static_url_path=None, + template_folder=None, + url_prefix=None, + subdomain=None, + url_defaults=None, + root_path=None, + cli_group=_sentinel, + ): + _PackageBoundObject.__init__( + self, import_name, template_folder, root_path=root_path + ) + self.name = name + self.url_prefix = url_prefix + self.subdomain = subdomain + self.static_folder = static_folder + self.static_url_path = static_url_path + self.deferred_functions = [] + if url_defaults is None: + url_defaults = {} + self.url_values_defaults = url_defaults + self.cli_group = cli_group + + def record(self, func): + """Registers a function that is called when the blueprint is + registered on the application. This function is called with the + state as argument as returned by the :meth:`make_setup_state` + method. + """ + if self._got_registered_once and self.warn_on_modifications: + from warnings import warn + + warn( + Warning( + "The blueprint was already registered once " + "but is getting modified now. These changes " + "will not show up." + ) + ) + self.deferred_functions.append(func) + + def record_once(self, func): + """Works like :meth:`record` but wraps the function in another + function that will ensure the function is only called once. If the + blueprint is registered a second time on the application, the + function passed is not called. + """ + + def wrapper(state): + if state.first_registration: + func(state) + + return self.record(update_wrapper(wrapper, func)) + + def make_setup_state(self, app, options, first_registration=False): + """Creates an instance of :meth:`~flask.blueprints.BlueprintSetupState` + object that is later passed to the register callback functions. + Subclasses can override this to return a subclass of the setup state. + """ + return BlueprintSetupState(self, app, options, first_registration) + + def register(self, app, options, first_registration=False): + """Called by :meth:`Flask.register_blueprint` to register all views + and callbacks registered on the blueprint with the application. Creates + a :class:`.BlueprintSetupState` and calls each :meth:`record` callback + with it. + + :param app: The application this blueprint is being registered with. + :param options: Keyword arguments forwarded from + :meth:`~Flask.register_blueprint`. + :param first_registration: Whether this is the first time this + blueprint has been registered on the application. + """ + self._got_registered_once = True + state = self.make_setup_state(app, options, first_registration) + + if self.has_static_folder: + state.add_url_rule( + self.static_url_path + "/", + view_func=self.send_static_file, + endpoint="static", + ) + + for deferred in self.deferred_functions: + deferred(state) + + cli_resolved_group = options.get("cli_group", self.cli_group) + + if not self.cli.commands: + return + + if cli_resolved_group is None: + app.cli.commands.update(self.cli.commands) + elif cli_resolved_group is _sentinel: + self.cli.name = self.name + app.cli.add_command(self.cli) + else: + self.cli.name = cli_resolved_group + app.cli.add_command(self.cli) + + def route(self, rule, **options): + """Like :meth:`Flask.route` but for a blueprint. The endpoint for the + :func:`url_for` function is prefixed with the name of the blueprint. + """ + + def decorator(f): + endpoint = options.pop("endpoint", f.__name__) + self.add_url_rule(rule, endpoint, f, **options) + return f + + return decorator + + def add_url_rule(self, rule, endpoint=None, view_func=None, **options): + """Like :meth:`Flask.add_url_rule` but for a blueprint. The endpoint for + the :func:`url_for` function is prefixed with the name of the blueprint. + """ + if endpoint: + assert "." not in endpoint, "Blueprint endpoints should not contain dots" + if view_func and hasattr(view_func, "__name__"): + assert ( + "." not in view_func.__name__ + ), "Blueprint view function name should not contain dots" + self.record(lambda s: s.add_url_rule(rule, endpoint, view_func, **options)) + + def endpoint(self, endpoint): + """Like :meth:`Flask.endpoint` but for a blueprint. This does not + prefix the endpoint with the blueprint name, this has to be done + explicitly by the user of this method. If the endpoint is prefixed + with a `.` it will be registered to the current blueprint, otherwise + it's an application independent endpoint. + """ + + def decorator(f): + def register_endpoint(state): + state.app.view_functions[endpoint] = f + + self.record_once(register_endpoint) + return f + + return decorator + + def app_template_filter(self, name=None): + """Register a custom template filter, available application wide. Like + :meth:`Flask.template_filter` but for a blueprint. + + :param name: the optional name of the filter, otherwise the + function name will be used. + """ + + def decorator(f): + self.add_app_template_filter(f, name=name) + return f + + return decorator + + def add_app_template_filter(self, f, name=None): + """Register a custom template filter, available application wide. Like + :meth:`Flask.add_template_filter` but for a blueprint. Works exactly + like the :meth:`app_template_filter` decorator. + + :param name: the optional name of the filter, otherwise the + function name will be used. + """ + + def register_template(state): + state.app.jinja_env.filters[name or f.__name__] = f + + self.record_once(register_template) + + def app_template_test(self, name=None): + """Register a custom template test, available application wide. Like + :meth:`Flask.template_test` but for a blueprint. + + .. versionadded:: 0.10 + + :param name: the optional name of the test, otherwise the + function name will be used. + """ + + def decorator(f): + self.add_app_template_test(f, name=name) + return f + + return decorator + + def add_app_template_test(self, f, name=None): + """Register a custom template test, available application wide. Like + :meth:`Flask.add_template_test` but for a blueprint. Works exactly + like the :meth:`app_template_test` decorator. + + .. versionadded:: 0.10 + + :param name: the optional name of the test, otherwise the + function name will be used. + """ + + def register_template(state): + state.app.jinja_env.tests[name or f.__name__] = f + + self.record_once(register_template) + + def app_template_global(self, name=None): + """Register a custom template global, available application wide. Like + :meth:`Flask.template_global` but for a blueprint. + + .. versionadded:: 0.10 + + :param name: the optional name of the global, otherwise the + function name will be used. + """ + + def decorator(f): + self.add_app_template_global(f, name=name) + return f + + return decorator + + def add_app_template_global(self, f, name=None): + """Register a custom template global, available application wide. Like + :meth:`Flask.add_template_global` but for a blueprint. Works exactly + like the :meth:`app_template_global` decorator. + + .. versionadded:: 0.10 + + :param name: the optional name of the global, otherwise the + function name will be used. + """ + + def register_template(state): + state.app.jinja_env.globals[name or f.__name__] = f + + self.record_once(register_template) + + def before_request(self, f): + """Like :meth:`Flask.before_request` but for a blueprint. This function + is only executed before each request that is handled by a function of + that blueprint. + """ + self.record_once( + lambda s: s.app.before_request_funcs.setdefault(self.name, []).append(f) + ) + return f + + def before_app_request(self, f): + """Like :meth:`Flask.before_request`. Such a function is executed + before each request, even if outside of a blueprint. + """ + self.record_once( + lambda s: s.app.before_request_funcs.setdefault(None, []).append(f) + ) + return f + + def before_app_first_request(self, f): + """Like :meth:`Flask.before_first_request`. Such a function is + executed before the first request to the application. + """ + self.record_once(lambda s: s.app.before_first_request_funcs.append(f)) + return f + + def after_request(self, f): + """Like :meth:`Flask.after_request` but for a blueprint. This function + is only executed after each request that is handled by a function of + that blueprint. + """ + self.record_once( + lambda s: s.app.after_request_funcs.setdefault(self.name, []).append(f) + ) + return f + + def after_app_request(self, f): + """Like :meth:`Flask.after_request` but for a blueprint. Such a function + is executed after each request, even if outside of the blueprint. + """ + self.record_once( + lambda s: s.app.after_request_funcs.setdefault(None, []).append(f) + ) + return f + + def teardown_request(self, f): + """Like :meth:`Flask.teardown_request` but for a blueprint. This + function is only executed when tearing down requests handled by a + function of that blueprint. Teardown request functions are executed + when the request context is popped, even when no actual request was + performed. + """ + self.record_once( + lambda s: s.app.teardown_request_funcs.setdefault(self.name, []).append(f) + ) + return f + + def teardown_app_request(self, f): + """Like :meth:`Flask.teardown_request` but for a blueprint. Such a + function is executed when tearing down each request, even if outside of + the blueprint. + """ + self.record_once( + lambda s: s.app.teardown_request_funcs.setdefault(None, []).append(f) + ) + return f + + def context_processor(self, f): + """Like :meth:`Flask.context_processor` but for a blueprint. This + function is only executed for requests handled by a blueprint. + """ + self.record_once( + lambda s: s.app.template_context_processors.setdefault( + self.name, [] + ).append(f) + ) + return f + + def app_context_processor(self, f): + """Like :meth:`Flask.context_processor` but for a blueprint. Such a + function is executed each request, even if outside of the blueprint. + """ + self.record_once( + lambda s: s.app.template_context_processors.setdefault(None, []).append(f) + ) + return f + + def app_errorhandler(self, code): + """Like :meth:`Flask.errorhandler` but for a blueprint. This + handler is used for all requests, even if outside of the blueprint. + """ + + def decorator(f): + self.record_once(lambda s: s.app.errorhandler(code)(f)) + return f + + return decorator + + def url_value_preprocessor(self, f): + """Registers a function as URL value preprocessor for this + blueprint. It's called before the view functions are called and + can modify the url values provided. + """ + self.record_once( + lambda s: s.app.url_value_preprocessors.setdefault(self.name, []).append(f) + ) + return f + + def url_defaults(self, f): + """Callback function for URL defaults for this blueprint. It's called + with the endpoint and values and should update the values passed + in place. + """ + self.record_once( + lambda s: s.app.url_default_functions.setdefault(self.name, []).append(f) + ) + return f + + def app_url_value_preprocessor(self, f): + """Same as :meth:`url_value_preprocessor` but application wide. + """ + self.record_once( + lambda s: s.app.url_value_preprocessors.setdefault(None, []).append(f) + ) + return f + + def app_url_defaults(self, f): + """Same as :meth:`url_defaults` but application wide. + """ + self.record_once( + lambda s: s.app.url_default_functions.setdefault(None, []).append(f) + ) + return f + + def errorhandler(self, code_or_exception): + """Registers an error handler that becomes active for this blueprint + only. Please be aware that routing does not happen local to a + blueprint so an error handler for 404 usually is not handled by + a blueprint unless it is caused inside a view function. Another + special case is the 500 internal server error which is always looked + up from the application. + + Otherwise works as the :meth:`~flask.Flask.errorhandler` decorator + of the :class:`~flask.Flask` object. + """ + + def decorator(f): + self.record_once( + lambda s: s.app._register_error_handler(self.name, code_or_exception, f) + ) + return f + + return decorator + + def register_error_handler(self, code_or_exception, f): + """Non-decorator version of the :meth:`errorhandler` error attach + function, akin to the :meth:`~flask.Flask.register_error_handler` + application-wide function of the :class:`~flask.Flask` object but + for error handlers limited to this blueprint. + + .. versionadded:: 0.11 + """ + self.record_once( + lambda s: s.app._register_error_handler(self.name, code_or_exception, f) + ) diff --git a/env/Lib/site-packages/flask/cli.py b/env/Lib/site-packages/flask/cli.py new file mode 100644 index 0000000..1158545 --- /dev/null +++ b/env/Lib/site-packages/flask/cli.py @@ -0,0 +1,970 @@ +# -*- coding: utf-8 -*- +""" + flask.cli + ~~~~~~~~~ + + A simple command line application to run flask apps. + + :copyright: 2010 Pallets + :license: BSD-3-Clause +""" +from __future__ import print_function + +import ast +import inspect +import os +import platform +import re +import sys +import traceback +from functools import update_wrapper +from operator import attrgetter +from threading import Lock +from threading import Thread + +import click +from werkzeug.utils import import_string + +from ._compat import getargspec +from ._compat import itervalues +from ._compat import reraise +from ._compat import text_type +from .globals import current_app +from .helpers import get_debug_flag +from .helpers import get_env +from .helpers import get_load_dotenv + +try: + import dotenv +except ImportError: + dotenv = None + +try: + import ssl +except ImportError: + ssl = None + + +class NoAppException(click.UsageError): + """Raised if an application cannot be found or loaded.""" + + +def find_best_app(script_info, module): + """Given a module instance this tries to find the best possible + application in the module or raises an exception. + """ + from . import Flask + + # Search for the most common names first. + for attr_name in ("app", "application"): + app = getattr(module, attr_name, None) + + if isinstance(app, Flask): + return app + + # Otherwise find the only object that is a Flask instance. + matches = [v for v in itervalues(module.__dict__) if isinstance(v, Flask)] + + if len(matches) == 1: + return matches[0] + elif len(matches) > 1: + raise NoAppException( + 'Detected multiple Flask applications in module "{module}". Use ' + '"FLASK_APP={module}:name" to specify the correct ' + "one.".format(module=module.__name__) + ) + + # Search for app factory functions. + for attr_name in ("create_app", "make_app"): + app_factory = getattr(module, attr_name, None) + + if inspect.isfunction(app_factory): + try: + app = call_factory(script_info, app_factory) + + if isinstance(app, Flask): + return app + except TypeError: + if not _called_with_wrong_args(app_factory): + raise + raise NoAppException( + 'Detected factory "{factory}" in module "{module}", but ' + "could not call it without arguments. Use " + "\"FLASK_APP='{module}:{factory}(args)'\" to specify " + "arguments.".format(factory=attr_name, module=module.__name__) + ) + + raise NoAppException( + 'Failed to find Flask application or factory in module "{module}". ' + 'Use "FLASK_APP={module}:name to specify one.'.format(module=module.__name__) + ) + + +def call_factory(script_info, app_factory, arguments=()): + """Takes an app factory, a ``script_info` object and optionally a tuple + of arguments. Checks for the existence of a script_info argument and calls + the app_factory depending on that and the arguments provided. + """ + args_spec = getargspec(app_factory) + arg_names = args_spec.args + arg_defaults = args_spec.defaults + + if "script_info" in arg_names: + return app_factory(*arguments, script_info=script_info) + elif arguments: + return app_factory(*arguments) + elif not arguments and len(arg_names) == 1 and arg_defaults is None: + return app_factory(script_info) + + return app_factory() + + +def _called_with_wrong_args(factory): + """Check whether calling a function raised a ``TypeError`` because + the call failed or because something in the factory raised the + error. + + :param factory: the factory function that was called + :return: true if the call failed + """ + tb = sys.exc_info()[2] + + try: + while tb is not None: + if tb.tb_frame.f_code is factory.__code__: + # in the factory, it was called successfully + return False + + tb = tb.tb_next + + # didn't reach the factory + return True + finally: + # explicitly delete tb as it is circular referenced + # https://docs.python.org/2/library/sys.html#sys.exc_info + del tb + + +def find_app_by_string(script_info, module, app_name): + """Checks if the given string is a variable name or a function. If it is a + function, it checks for specified arguments and whether it takes a + ``script_info`` argument and calls the function with the appropriate + arguments. + """ + from . import Flask + + match = re.match(r"^ *([^ ()]+) *(?:\((.*?) *,? *\))? *$", app_name) + + if not match: + raise NoAppException( + '"{name}" is not a valid variable name or function ' + "expression.".format(name=app_name) + ) + + name, args = match.groups() + + try: + attr = getattr(module, name) + except AttributeError as e: + raise NoAppException(e.args[0]) + + if inspect.isfunction(attr): + if args: + try: + args = ast.literal_eval("({args},)".format(args=args)) + except (ValueError, SyntaxError) as e: + raise NoAppException( + "Could not parse the arguments in " + '"{app_name}".'.format(e=e, app_name=app_name) + ) + else: + args = () + + try: + app = call_factory(script_info, attr, args) + except TypeError as e: + if not _called_with_wrong_args(attr): + raise + + raise NoAppException( + '{e}\nThe factory "{app_name}" in module "{module}" could not ' + "be called with the specified arguments.".format( + e=e, app_name=app_name, module=module.__name__ + ) + ) + else: + app = attr + + if isinstance(app, Flask): + return app + + raise NoAppException( + "A valid Flask application was not obtained from " + '"{module}:{app_name}".'.format(module=module.__name__, app_name=app_name) + ) + + +def prepare_import(path): + """Given a filename this will try to calculate the python path, add it + to the search path and return the actual module name that is expected. + """ + path = os.path.realpath(path) + + fname, ext = os.path.splitext(path) + if ext == ".py": + path = fname + + if os.path.basename(path) == "__init__": + path = os.path.dirname(path) + + module_name = [] + + # move up until outside package structure (no __init__.py) + while True: + path, name = os.path.split(path) + module_name.append(name) + + if not os.path.exists(os.path.join(path, "__init__.py")): + break + + if sys.path[0] != path: + sys.path.insert(0, path) + + return ".".join(module_name[::-1]) + + +def locate_app(script_info, module_name, app_name, raise_if_not_found=True): + __traceback_hide__ = True # noqa: F841 + + try: + __import__(module_name) + except ImportError: + # Reraise the ImportError if it occurred within the imported module. + # Determine this by checking whether the trace has a depth > 1. + if sys.exc_info()[-1].tb_next: + raise NoAppException( + 'While importing "{name}", an ImportError was raised:' + "\n\n{tb}".format(name=module_name, tb=traceback.format_exc()) + ) + elif raise_if_not_found: + raise NoAppException('Could not import "{name}".'.format(name=module_name)) + else: + return + + module = sys.modules[module_name] + + if app_name is None: + return find_best_app(script_info, module) + else: + return find_app_by_string(script_info, module, app_name) + + +def get_version(ctx, param, value): + if not value or ctx.resilient_parsing: + return + + import werkzeug + from . import __version__ + + message = "Python %(python)s\nFlask %(flask)s\nWerkzeug %(werkzeug)s" + click.echo( + message + % { + "python": platform.python_version(), + "flask": __version__, + "werkzeug": werkzeug.__version__, + }, + color=ctx.color, + ) + ctx.exit() + + +version_option = click.Option( + ["--version"], + help="Show the flask version", + expose_value=False, + callback=get_version, + is_flag=True, + is_eager=True, +) + + +class DispatchingApp(object): + """Special application that dispatches to a Flask application which + is imported by name in a background thread. If an error happens + it is recorded and shown as part of the WSGI handling which in case + of the Werkzeug debugger means that it shows up in the browser. + """ + + def __init__(self, loader, use_eager_loading=False): + self.loader = loader + self._app = None + self._lock = Lock() + self._bg_loading_exc_info = None + if use_eager_loading: + self._load_unlocked() + else: + self._load_in_background() + + def _load_in_background(self): + def _load_app(): + __traceback_hide__ = True # noqa: F841 + with self._lock: + try: + self._load_unlocked() + except Exception: + self._bg_loading_exc_info = sys.exc_info() + + t = Thread(target=_load_app, args=()) + t.start() + + def _flush_bg_loading_exception(self): + __traceback_hide__ = True # noqa: F841 + exc_info = self._bg_loading_exc_info + if exc_info is not None: + self._bg_loading_exc_info = None + reraise(*exc_info) + + def _load_unlocked(self): + __traceback_hide__ = True # noqa: F841 + self._app = rv = self.loader() + self._bg_loading_exc_info = None + return rv + + def __call__(self, environ, start_response): + __traceback_hide__ = True # noqa: F841 + if self._app is not None: + return self._app(environ, start_response) + self._flush_bg_loading_exception() + with self._lock: + if self._app is not None: + rv = self._app + else: + rv = self._load_unlocked() + return rv(environ, start_response) + + +class ScriptInfo(object): + """Helper object to deal with Flask applications. This is usually not + necessary to interface with as it's used internally in the dispatching + to click. In future versions of Flask this object will most likely play + a bigger role. Typically it's created automatically by the + :class:`FlaskGroup` but you can also manually create it and pass it + onwards as click object. + """ + + def __init__(self, app_import_path=None, create_app=None, set_debug_flag=True): + #: Optionally the import path for the Flask application. + self.app_import_path = app_import_path or os.environ.get("FLASK_APP") + #: Optionally a function that is passed the script info to create + #: the instance of the application. + self.create_app = create_app + #: A dictionary with arbitrary data that can be associated with + #: this script info. + self.data = {} + self.set_debug_flag = set_debug_flag + self._loaded_app = None + + def load_app(self): + """Loads the Flask app (if not yet loaded) and returns it. Calling + this multiple times will just result in the already loaded app to + be returned. + """ + __traceback_hide__ = True # noqa: F841 + + if self._loaded_app is not None: + return self._loaded_app + + app = None + + if self.create_app is not None: + app = call_factory(self, self.create_app) + else: + if self.app_import_path: + path, name = ( + re.split(r":(?![\\/])", self.app_import_path, 1) + [None] + )[:2] + import_name = prepare_import(path) + app = locate_app(self, import_name, name) + else: + for path in ("wsgi.py", "app.py"): + import_name = prepare_import(path) + app = locate_app(self, import_name, None, raise_if_not_found=False) + + if app: + break + + if not app: + raise NoAppException( + "Could not locate a Flask application. You did not provide " + 'the "FLASK_APP" environment variable, and a "wsgi.py" or ' + '"app.py" module was not found in the current directory.' + ) + + if self.set_debug_flag: + # Update the app's debug flag through the descriptor so that + # other values repopulate as well. + app.debug = get_debug_flag() + + self._loaded_app = app + return app + + +pass_script_info = click.make_pass_decorator(ScriptInfo, ensure=True) + + +def with_appcontext(f): + """Wraps a callback so that it's guaranteed to be executed with the + script's application context. If callbacks are registered directly + to the ``app.cli`` object then they are wrapped with this function + by default unless it's disabled. + """ + + @click.pass_context + def decorator(__ctx, *args, **kwargs): + with __ctx.ensure_object(ScriptInfo).load_app().app_context(): + return __ctx.invoke(f, *args, **kwargs) + + return update_wrapper(decorator, f) + + +class AppGroup(click.Group): + """This works similar to a regular click :class:`~click.Group` but it + changes the behavior of the :meth:`command` decorator so that it + automatically wraps the functions in :func:`with_appcontext`. + + Not to be confused with :class:`FlaskGroup`. + """ + + def command(self, *args, **kwargs): + """This works exactly like the method of the same name on a regular + :class:`click.Group` but it wraps callbacks in :func:`with_appcontext` + unless it's disabled by passing ``with_appcontext=False``. + """ + wrap_for_ctx = kwargs.pop("with_appcontext", True) + + def decorator(f): + if wrap_for_ctx: + f = with_appcontext(f) + return click.Group.command(self, *args, **kwargs)(f) + + return decorator + + def group(self, *args, **kwargs): + """This works exactly like the method of the same name on a regular + :class:`click.Group` but it defaults the group class to + :class:`AppGroup`. + """ + kwargs.setdefault("cls", AppGroup) + return click.Group.group(self, *args, **kwargs) + + +class FlaskGroup(AppGroup): + """Special subclass of the :class:`AppGroup` group that supports + loading more commands from the configured Flask app. Normally a + developer does not have to interface with this class but there are + some very advanced use cases for which it makes sense to create an + instance of this. + + For information as of why this is useful see :ref:`custom-scripts`. + + :param add_default_commands: if this is True then the default run and + shell commands will be added. + :param add_version_option: adds the ``--version`` option. + :param create_app: an optional callback that is passed the script info and + returns the loaded app. + :param load_dotenv: Load the nearest :file:`.env` and :file:`.flaskenv` + files to set environment variables. Will also change the working + directory to the directory containing the first file found. + :param set_debug_flag: Set the app's debug flag based on the active + environment + + .. versionchanged:: 1.0 + If installed, python-dotenv will be used to load environment variables + from :file:`.env` and :file:`.flaskenv` files. + """ + + def __init__( + self, + add_default_commands=True, + create_app=None, + add_version_option=True, + load_dotenv=True, + set_debug_flag=True, + **extra + ): + params = list(extra.pop("params", None) or ()) + + if add_version_option: + params.append(version_option) + + AppGroup.__init__(self, params=params, **extra) + self.create_app = create_app + self.load_dotenv = load_dotenv + self.set_debug_flag = set_debug_flag + + if add_default_commands: + self.add_command(run_command) + self.add_command(shell_command) + self.add_command(routes_command) + + self._loaded_plugin_commands = False + + def _load_plugin_commands(self): + if self._loaded_plugin_commands: + return + try: + import pkg_resources + except ImportError: + self._loaded_plugin_commands = True + return + + for ep in pkg_resources.iter_entry_points("flask.commands"): + self.add_command(ep.load(), ep.name) + self._loaded_plugin_commands = True + + def get_command(self, ctx, name): + self._load_plugin_commands() + + # We load built-in commands first as these should always be the + # same no matter what the app does. If the app does want to + # override this it needs to make a custom instance of this group + # and not attach the default commands. + # + # This also means that the script stays functional in case the + # application completely fails. + rv = AppGroup.get_command(self, ctx, name) + if rv is not None: + return rv + + info = ctx.ensure_object(ScriptInfo) + try: + rv = info.load_app().cli.get_command(ctx, name) + if rv is not None: + return rv + except NoAppException: + pass + + def list_commands(self, ctx): + self._load_plugin_commands() + + # The commands available is the list of both the application (if + # available) plus the builtin commands. + rv = set(click.Group.list_commands(self, ctx)) + info = ctx.ensure_object(ScriptInfo) + try: + rv.update(info.load_app().cli.list_commands(ctx)) + except Exception: + # Here we intentionally swallow all exceptions as we don't + # want the help page to break if the app does not exist. + # If someone attempts to use the command we try to create + # the app again and this will give us the error. + # However, we will not do so silently because that would confuse + # users. + traceback.print_exc() + return sorted(rv) + + def main(self, *args, **kwargs): + # Set a global flag that indicates that we were invoked from the + # command line interface. This is detected by Flask.run to make the + # call into a no-op. This is necessary to avoid ugly errors when the + # script that is loaded here also attempts to start a server. + os.environ["FLASK_RUN_FROM_CLI"] = "true" + + if get_load_dotenv(self.load_dotenv): + load_dotenv() + + obj = kwargs.get("obj") + + if obj is None: + obj = ScriptInfo( + create_app=self.create_app, set_debug_flag=self.set_debug_flag + ) + + kwargs["obj"] = obj + kwargs.setdefault("auto_envvar_prefix", "FLASK") + return super(FlaskGroup, self).main(*args, **kwargs) + + +def _path_is_ancestor(path, other): + """Take ``other`` and remove the length of ``path`` from it. Then join it + to ``path``. If it is the original value, ``path`` is an ancestor of + ``other``.""" + return os.path.join(path, other[len(path) :].lstrip(os.sep)) == other + + +def load_dotenv(path=None): + """Load "dotenv" files in order of precedence to set environment variables. + + If an env var is already set it is not overwritten, so earlier files in the + list are preferred over later files. + + Changes the current working directory to the location of the first file + found, with the assumption that it is in the top level project directory + and will be where the Python path should import local packages from. + + This is a no-op if `python-dotenv`_ is not installed. + + .. _python-dotenv: https://github.com/theskumar/python-dotenv#readme + + :param path: Load the file at this location instead of searching. + :return: ``True`` if a file was loaded. + + .. versionchanged:: 1.1.0 + Returns ``False`` when python-dotenv is not installed, or when + the given path isn't a file. + + .. versionadded:: 1.0 + """ + if dotenv is None: + if path or os.path.isfile(".env") or os.path.isfile(".flaskenv"): + click.secho( + " * Tip: There are .env or .flaskenv files present." + ' Do "pip install python-dotenv" to use them.', + fg="yellow", + err=True, + ) + + return False + + # if the given path specifies the actual file then return True, + # else False + if path is not None: + if os.path.isfile(path): + return dotenv.load_dotenv(path) + + return False + + new_dir = None + + for name in (".env", ".flaskenv"): + path = dotenv.find_dotenv(name, usecwd=True) + + if not path: + continue + + if new_dir is None: + new_dir = os.path.dirname(path) + + dotenv.load_dotenv(path) + + if new_dir and os.getcwd() != new_dir: + os.chdir(new_dir) + + return new_dir is not None # at least one file was located and loaded + + +def show_server_banner(env, debug, app_import_path, eager_loading): + """Show extra startup messages the first time the server is run, + ignoring the reloader. + """ + if os.environ.get("WERKZEUG_RUN_MAIN") == "true": + return + + if app_import_path is not None: + message = ' * Serving Flask app "{0}"'.format(app_import_path) + + if not eager_loading: + message += " (lazy loading)" + + click.echo(message) + + click.echo(" * Environment: {0}".format(env)) + + if env == "production": + click.secho( + " WARNING: This is a development server. " + "Do not use it in a production deployment.", + fg="red", + ) + click.secho(" Use a production WSGI server instead.", dim=True) + + if debug is not None: + click.echo(" * Debug mode: {0}".format("on" if debug else "off")) + + +class CertParamType(click.ParamType): + """Click option type for the ``--cert`` option. Allows either an + existing file, the string ``'adhoc'``, or an import for a + :class:`~ssl.SSLContext` object. + """ + + name = "path" + + def __init__(self): + self.path_type = click.Path(exists=True, dir_okay=False, resolve_path=True) + + def convert(self, value, param, ctx): + if ssl is None: + raise click.BadParameter( + 'Using "--cert" requires Python to be compiled with SSL support.', + ctx, + param, + ) + + try: + return self.path_type(value, param, ctx) + except click.BadParameter: + value = click.STRING(value, param, ctx).lower() + + if value == "adhoc": + try: + import OpenSSL # noqa: F401 + except ImportError: + raise click.BadParameter( + "Using ad-hoc certificates requires pyOpenSSL.", ctx, param + ) + + return value + + obj = import_string(value, silent=True) + + if sys.version_info < (2, 7, 9): + if obj: + return obj + else: + if isinstance(obj, ssl.SSLContext): + return obj + + raise + + +def _validate_key(ctx, param, value): + """The ``--key`` option must be specified when ``--cert`` is a file. + Modifies the ``cert`` param to be a ``(cert, key)`` pair if needed. + """ + cert = ctx.params.get("cert") + is_adhoc = cert == "adhoc" + + if sys.version_info < (2, 7, 9): + is_context = cert and not isinstance(cert, (text_type, bytes)) + else: + is_context = isinstance(cert, ssl.SSLContext) + + if value is not None: + if is_adhoc: + raise click.BadParameter( + 'When "--cert" is "adhoc", "--key" is not used.', ctx, param + ) + + if is_context: + raise click.BadParameter( + 'When "--cert" is an SSLContext object, "--key is not used.', ctx, param + ) + + if not cert: + raise click.BadParameter('"--cert" must also be specified.', ctx, param) + + ctx.params["cert"] = cert, value + + else: + if cert and not (is_adhoc or is_context): + raise click.BadParameter('Required when using "--cert".', ctx, param) + + return value + + +class SeparatedPathType(click.Path): + """Click option type that accepts a list of values separated by the + OS's path separator (``:``, ``;`` on Windows). Each value is + validated as a :class:`click.Path` type. + """ + + def convert(self, value, param, ctx): + items = self.split_envvar_value(value) + super_convert = super(SeparatedPathType, self).convert + return [super_convert(item, param, ctx) for item in items] + + +@click.command("run", short_help="Run a development server.") +@click.option("--host", "-h", default="127.0.0.1", help="The interface to bind to.") +@click.option("--port", "-p", default=5000, help="The port to bind to.") +@click.option( + "--cert", type=CertParamType(), help="Specify a certificate file to use HTTPS." +) +@click.option( + "--key", + type=click.Path(exists=True, dir_okay=False, resolve_path=True), + callback=_validate_key, + expose_value=False, + help="The key file to use when specifying a certificate.", +) +@click.option( + "--reload/--no-reload", + default=None, + help="Enable or disable the reloader. By default the reloader " + "is active if debug is enabled.", +) +@click.option( + "--debugger/--no-debugger", + default=None, + help="Enable or disable the debugger. By default the debugger " + "is active if debug is enabled.", +) +@click.option( + "--eager-loading/--lazy-loader", + default=None, + help="Enable or disable eager loading. By default eager " + "loading is enabled if the reloader is disabled.", +) +@click.option( + "--with-threads/--without-threads", + default=True, + help="Enable or disable multithreading.", +) +@click.option( + "--extra-files", + default=None, + type=SeparatedPathType(), + help=( + "Extra files that trigger a reload on change. Multiple paths" + " are separated by '{}'.".format(os.path.pathsep) + ), +) +@pass_script_info +def run_command( + info, host, port, reload, debugger, eager_loading, with_threads, cert, extra_files +): + """Run a local development server. + + This server is for development purposes only. It does not provide + the stability, security, or performance of production WSGI servers. + + The reloader and debugger are enabled by default if + FLASK_ENV=development or FLASK_DEBUG=1. + """ + debug = get_debug_flag() + + if reload is None: + reload = debug + + if debugger is None: + debugger = debug + + if eager_loading is None: + eager_loading = not reload + + show_server_banner(get_env(), debug, info.app_import_path, eager_loading) + app = DispatchingApp(info.load_app, use_eager_loading=eager_loading) + + from werkzeug.serving import run_simple + + run_simple( + host, + port, + app, + use_reloader=reload, + use_debugger=debugger, + threaded=with_threads, + ssl_context=cert, + extra_files=extra_files, + ) + + +@click.command("shell", short_help="Run a shell in the app context.") +@with_appcontext +def shell_command(): + """Run an interactive Python shell in the context of a given + Flask application. The application will populate the default + namespace of this shell according to it's configuration. + + This is useful for executing small snippets of management code + without having to manually configure the application. + """ + import code + from .globals import _app_ctx_stack + + app = _app_ctx_stack.top.app + banner = "Python %s on %s\nApp: %s [%s]\nInstance: %s" % ( + sys.version, + sys.platform, + app.import_name, + app.env, + app.instance_path, + ) + ctx = {} + + # Support the regular Python interpreter startup script if someone + # is using it. + startup = os.environ.get("PYTHONSTARTUP") + if startup and os.path.isfile(startup): + with open(startup, "r") as f: + eval(compile(f.read(), startup, "exec"), ctx) + + ctx.update(app.make_shell_context()) + + code.interact(banner=banner, local=ctx) + + +@click.command("routes", short_help="Show the routes for the app.") +@click.option( + "--sort", + "-s", + type=click.Choice(("endpoint", "methods", "rule", "match")), + default="endpoint", + help=( + 'Method to sort routes by. "match" is the order that Flask will match ' + "routes when dispatching a request." + ), +) +@click.option("--all-methods", is_flag=True, help="Show HEAD and OPTIONS methods.") +@with_appcontext +def routes_command(sort, all_methods): + """Show all registered routes with endpoints and methods.""" + + rules = list(current_app.url_map.iter_rules()) + if not rules: + click.echo("No routes were registered.") + return + + ignored_methods = set(() if all_methods else ("HEAD", "OPTIONS")) + + if sort in ("endpoint", "rule"): + rules = sorted(rules, key=attrgetter(sort)) + elif sort == "methods": + rules = sorted(rules, key=lambda rule: sorted(rule.methods)) + + rule_methods = [", ".join(sorted(rule.methods - ignored_methods)) for rule in rules] + + headers = ("Endpoint", "Methods", "Rule") + widths = ( + max(len(rule.endpoint) for rule in rules), + max(len(methods) for methods in rule_methods), + max(len(rule.rule) for rule in rules), + ) + widths = [max(len(h), w) for h, w in zip(headers, widths)] + row = "{{0:<{0}}} {{1:<{1}}} {{2:<{2}}}".format(*widths) + + click.echo(row.format(*headers).strip()) + click.echo(row.format(*("-" * width for width in widths))) + + for rule, methods in zip(rules, rule_methods): + click.echo(row.format(rule.endpoint, methods, rule.rule).rstrip()) + + +cli = FlaskGroup( + help="""\ +A general utility script for Flask applications. + +Provides commands from Flask, extensions, and the application. Loads the +application defined in the FLASK_APP environment variable, or from a wsgi.py +file. Setting the FLASK_ENV environment variable to 'development' will enable +debug mode. + +\b + {prefix}{cmd} FLASK_APP=hello.py + {prefix}{cmd} FLASK_ENV=development + {prefix}flask run +""".format( + cmd="export" if os.name == "posix" else "set", + prefix="$ " if os.name == "posix" else "> ", + ) +) + + +def main(as_module=False): + cli.main(prog_name="python -m flask" if as_module else None) + + +if __name__ == "__main__": + main(as_module=True) diff --git a/env/Lib/site-packages/flask/config.py b/env/Lib/site-packages/flask/config.py new file mode 100644 index 0000000..809de33 --- /dev/null +++ b/env/Lib/site-packages/flask/config.py @@ -0,0 +1,269 @@ +# -*- coding: utf-8 -*- +""" + flask.config + ~~~~~~~~~~~~ + + Implements the configuration related objects. + + :copyright: 2010 Pallets + :license: BSD-3-Clause +""" +import errno +import os +import types + +from werkzeug.utils import import_string + +from . import json +from ._compat import iteritems +from ._compat import string_types + + +class ConfigAttribute(object): + """Makes an attribute forward to the config""" + + def __init__(self, name, get_converter=None): + self.__name__ = name + self.get_converter = get_converter + + def __get__(self, obj, type=None): + if obj is None: + return self + rv = obj.config[self.__name__] + if self.get_converter is not None: + rv = self.get_converter(rv) + return rv + + def __set__(self, obj, value): + obj.config[self.__name__] = value + + +class Config(dict): + """Works exactly like a dict but provides ways to fill it from files + or special dictionaries. There are two common patterns to populate the + config. + + Either you can fill the config from a config file:: + + app.config.from_pyfile('yourconfig.cfg') + + Or alternatively you can define the configuration options in the + module that calls :meth:`from_object` or provide an import path to + a module that should be loaded. It is also possible to tell it to + use the same module and with that provide the configuration values + just before the call:: + + DEBUG = True + SECRET_KEY = 'development key' + app.config.from_object(__name__) + + In both cases (loading from any Python file or loading from modules), + only uppercase keys are added to the config. This makes it possible to use + lowercase values in the config file for temporary values that are not added + to the config or to define the config keys in the same file that implements + the application. + + Probably the most interesting way to load configurations is from an + environment variable pointing to a file:: + + app.config.from_envvar('YOURAPPLICATION_SETTINGS') + + In this case before launching the application you have to set this + environment variable to the file you want to use. On Linux and OS X + use the export statement:: + + export YOURAPPLICATION_SETTINGS='/path/to/config/file' + + On windows use `set` instead. + + :param root_path: path to which files are read relative from. When the + config object is created by the application, this is + the application's :attr:`~flask.Flask.root_path`. + :param defaults: an optional dictionary of default values + """ + + def __init__(self, root_path, defaults=None): + dict.__init__(self, defaults or {}) + self.root_path = root_path + + def from_envvar(self, variable_name, silent=False): + """Loads a configuration from an environment variable pointing to + a configuration file. This is basically just a shortcut with nicer + error messages for this line of code:: + + app.config.from_pyfile(os.environ['YOURAPPLICATION_SETTINGS']) + + :param variable_name: name of the environment variable + :param silent: set to ``True`` if you want silent failure for missing + files. + :return: bool. ``True`` if able to load config, ``False`` otherwise. + """ + rv = os.environ.get(variable_name) + if not rv: + if silent: + return False + raise RuntimeError( + "The environment variable %r is not set " + "and as such configuration could not be " + "loaded. Set this variable and make it " + "point to a configuration file" % variable_name + ) + return self.from_pyfile(rv, silent=silent) + + def from_pyfile(self, filename, silent=False): + """Updates the values in the config from a Python file. This function + behaves as if the file was imported as module with the + :meth:`from_object` function. + + :param filename: the filename of the config. This can either be an + absolute filename or a filename relative to the + root path. + :param silent: set to ``True`` if you want silent failure for missing + files. + + .. versionadded:: 0.7 + `silent` parameter. + """ + filename = os.path.join(self.root_path, filename) + d = types.ModuleType("config") + d.__file__ = filename + try: + with open(filename, mode="rb") as config_file: + exec(compile(config_file.read(), filename, "exec"), d.__dict__) + except IOError as e: + if silent and e.errno in (errno.ENOENT, errno.EISDIR, errno.ENOTDIR): + return False + e.strerror = "Unable to load configuration file (%s)" % e.strerror + raise + self.from_object(d) + return True + + def from_object(self, obj): + """Updates the values from the given object. An object can be of one + of the following two types: + + - a string: in this case the object with that name will be imported + - an actual object reference: that object is used directly + + Objects are usually either modules or classes. :meth:`from_object` + loads only the uppercase attributes of the module/class. A ``dict`` + object will not work with :meth:`from_object` because the keys of a + ``dict`` are not attributes of the ``dict`` class. + + Example of module-based configuration:: + + app.config.from_object('yourapplication.default_config') + from yourapplication import default_config + app.config.from_object(default_config) + + Nothing is done to the object before loading. If the object is a + class and has ``@property`` attributes, it needs to be + instantiated before being passed to this method. + + You should not use this function to load the actual configuration but + rather configuration defaults. The actual config should be loaded + with :meth:`from_pyfile` and ideally from a location not within the + package because the package might be installed system wide. + + See :ref:`config-dev-prod` for an example of class-based configuration + using :meth:`from_object`. + + :param obj: an import name or object + """ + if isinstance(obj, string_types): + obj = import_string(obj) + for key in dir(obj): + if key.isupper(): + self[key] = getattr(obj, key) + + def from_json(self, filename, silent=False): + """Updates the values in the config from a JSON file. This function + behaves as if the JSON object was a dictionary and passed to the + :meth:`from_mapping` function. + + :param filename: the filename of the JSON file. This can either be an + absolute filename or a filename relative to the + root path. + :param silent: set to ``True`` if you want silent failure for missing + files. + + .. versionadded:: 0.11 + """ + filename = os.path.join(self.root_path, filename) + + try: + with open(filename) as json_file: + obj = json.loads(json_file.read()) + except IOError as e: + if silent and e.errno in (errno.ENOENT, errno.EISDIR): + return False + e.strerror = "Unable to load configuration file (%s)" % e.strerror + raise + return self.from_mapping(obj) + + def from_mapping(self, *mapping, **kwargs): + """Updates the config like :meth:`update` ignoring items with non-upper + keys. + + .. versionadded:: 0.11 + """ + mappings = [] + if len(mapping) == 1: + if hasattr(mapping[0], "items"): + mappings.append(mapping[0].items()) + else: + mappings.append(mapping[0]) + elif len(mapping) > 1: + raise TypeError( + "expected at most 1 positional argument, got %d" % len(mapping) + ) + mappings.append(kwargs.items()) + for mapping in mappings: + for (key, value) in mapping: + if key.isupper(): + self[key] = value + return True + + def get_namespace(self, namespace, lowercase=True, trim_namespace=True): + """Returns a dictionary containing a subset of configuration options + that match the specified namespace/prefix. Example usage:: + + app.config['IMAGE_STORE_TYPE'] = 'fs' + app.config['IMAGE_STORE_PATH'] = '/var/app/images' + app.config['IMAGE_STORE_BASE_URL'] = 'http://img.website.com' + image_store_config = app.config.get_namespace('IMAGE_STORE_') + + The resulting dictionary `image_store_config` would look like:: + + { + 'type': 'fs', + 'path': '/var/app/images', + 'base_url': 'http://img.website.com' + } + + This is often useful when configuration options map directly to + keyword arguments in functions or class constructors. + + :param namespace: a configuration namespace + :param lowercase: a flag indicating if the keys of the resulting + dictionary should be lowercase + :param trim_namespace: a flag indicating if the keys of the resulting + dictionary should not include the namespace + + .. versionadded:: 0.11 + """ + rv = {} + for k, v in iteritems(self): + if not k.startswith(namespace): + continue + if trim_namespace: + key = k[len(namespace) :] + else: + key = k + if lowercase: + key = key.lower() + rv[key] = v + return rv + + def __repr__(self): + return "<%s %s>" % (self.__class__.__name__, dict.__repr__(self)) diff --git a/env/Lib/site-packages/flask/ctx.py b/env/Lib/site-packages/flask/ctx.py new file mode 100644 index 0000000..172f6a0 --- /dev/null +++ b/env/Lib/site-packages/flask/ctx.py @@ -0,0 +1,475 @@ +# -*- coding: utf-8 -*- +""" + flask.ctx + ~~~~~~~~~ + + Implements the objects required to keep the context. + + :copyright: 2010 Pallets + :license: BSD-3-Clause +""" +import sys +from functools import update_wrapper + +from werkzeug.exceptions import HTTPException + +from ._compat import BROKEN_PYPY_CTXMGR_EXIT +from ._compat import reraise +from .globals import _app_ctx_stack +from .globals import _request_ctx_stack +from .signals import appcontext_popped +from .signals import appcontext_pushed + + +# a singleton sentinel value for parameter defaults +_sentinel = object() + + +class _AppCtxGlobals(object): + """A plain object. Used as a namespace for storing data during an + application context. + + Creating an app context automatically creates this object, which is + made available as the :data:`g` proxy. + + .. describe:: 'key' in g + + Check whether an attribute is present. + + .. versionadded:: 0.10 + + .. describe:: iter(g) + + Return an iterator over the attribute names. + + .. versionadded:: 0.10 + """ + + def get(self, name, default=None): + """Get an attribute by name, or a default value. Like + :meth:`dict.get`. + + :param name: Name of attribute to get. + :param default: Value to return if the attribute is not present. + + .. versionadded:: 0.10 + """ + return self.__dict__.get(name, default) + + def pop(self, name, default=_sentinel): + """Get and remove an attribute by name. Like :meth:`dict.pop`. + + :param name: Name of attribute to pop. + :param default: Value to return if the attribute is not present, + instead of raise a ``KeyError``. + + .. versionadded:: 0.11 + """ + if default is _sentinel: + return self.__dict__.pop(name) + else: + return self.__dict__.pop(name, default) + + def setdefault(self, name, default=None): + """Get the value of an attribute if it is present, otherwise + set and return a default value. Like :meth:`dict.setdefault`. + + :param name: Name of attribute to get. + :param: default: Value to set and return if the attribute is not + present. + + .. versionadded:: 0.11 + """ + return self.__dict__.setdefault(name, default) + + def __contains__(self, item): + return item in self.__dict__ + + def __iter__(self): + return iter(self.__dict__) + + def __repr__(self): + top = _app_ctx_stack.top + if top is not None: + return "" % top.app.name + return object.__repr__(self) + + +def after_this_request(f): + """Executes a function after this request. This is useful to modify + response objects. The function is passed the response object and has + to return the same or a new one. + + Example:: + + @app.route('/') + def index(): + @after_this_request + def add_header(response): + response.headers['X-Foo'] = 'Parachute' + return response + return 'Hello World!' + + This is more useful if a function other than the view function wants to + modify a response. For instance think of a decorator that wants to add + some headers without converting the return value into a response object. + + .. versionadded:: 0.9 + """ + _request_ctx_stack.top._after_request_functions.append(f) + return f + + +def copy_current_request_context(f): + """A helper function that decorates a function to retain the current + request context. This is useful when working with greenlets. The moment + the function is decorated a copy of the request context is created and + then pushed when the function is called. The current session is also + included in the copied request context. + + Example:: + + import gevent + from flask import copy_current_request_context + + @app.route('/') + def index(): + @copy_current_request_context + def do_some_work(): + # do some work here, it can access flask.request or + # flask.session like you would otherwise in the view function. + ... + gevent.spawn(do_some_work) + return 'Regular response' + + .. versionadded:: 0.10 + """ + top = _request_ctx_stack.top + if top is None: + raise RuntimeError( + "This decorator can only be used at local scopes " + "when a request context is on the stack. For instance within " + "view functions." + ) + reqctx = top.copy() + + def wrapper(*args, **kwargs): + with reqctx: + return f(*args, **kwargs) + + return update_wrapper(wrapper, f) + + +def has_request_context(): + """If you have code that wants to test if a request context is there or + not this function can be used. For instance, you may want to take advantage + of request information if the request object is available, but fail + silently if it is unavailable. + + :: + + class User(db.Model): + + def __init__(self, username, remote_addr=None): + self.username = username + if remote_addr is None and has_request_context(): + remote_addr = request.remote_addr + self.remote_addr = remote_addr + + Alternatively you can also just test any of the context bound objects + (such as :class:`request` or :class:`g`) for truthness:: + + class User(db.Model): + + def __init__(self, username, remote_addr=None): + self.username = username + if remote_addr is None and request: + remote_addr = request.remote_addr + self.remote_addr = remote_addr + + .. versionadded:: 0.7 + """ + return _request_ctx_stack.top is not None + + +def has_app_context(): + """Works like :func:`has_request_context` but for the application + context. You can also just do a boolean check on the + :data:`current_app` object instead. + + .. versionadded:: 0.9 + """ + return _app_ctx_stack.top is not None + + +class AppContext(object): + """The application context binds an application object implicitly + to the current thread or greenlet, similar to how the + :class:`RequestContext` binds request information. The application + context is also implicitly created if a request context is created + but the application is not on top of the individual application + context. + """ + + def __init__(self, app): + self.app = app + self.url_adapter = app.create_url_adapter(None) + self.g = app.app_ctx_globals_class() + + # Like request context, app contexts can be pushed multiple times + # but there a basic "refcount" is enough to track them. + self._refcnt = 0 + + def push(self): + """Binds the app context to the current context.""" + self._refcnt += 1 + if hasattr(sys, "exc_clear"): + sys.exc_clear() + _app_ctx_stack.push(self) + appcontext_pushed.send(self.app) + + def pop(self, exc=_sentinel): + """Pops the app context.""" + try: + self._refcnt -= 1 + if self._refcnt <= 0: + if exc is _sentinel: + exc = sys.exc_info()[1] + self.app.do_teardown_appcontext(exc) + finally: + rv = _app_ctx_stack.pop() + assert rv is self, "Popped wrong app context. (%r instead of %r)" % (rv, self) + appcontext_popped.send(self.app) + + def __enter__(self): + self.push() + return self + + def __exit__(self, exc_type, exc_value, tb): + self.pop(exc_value) + + if BROKEN_PYPY_CTXMGR_EXIT and exc_type is not None: + reraise(exc_type, exc_value, tb) + + +class RequestContext(object): + """The request context contains all request relevant information. It is + created at the beginning of the request and pushed to the + `_request_ctx_stack` and removed at the end of it. It will create the + URL adapter and request object for the WSGI environment provided. + + Do not attempt to use this class directly, instead use + :meth:`~flask.Flask.test_request_context` and + :meth:`~flask.Flask.request_context` to create this object. + + When the request context is popped, it will evaluate all the + functions registered on the application for teardown execution + (:meth:`~flask.Flask.teardown_request`). + + The request context is automatically popped at the end of the request + for you. In debug mode the request context is kept around if + exceptions happen so that interactive debuggers have a chance to + introspect the data. With 0.4 this can also be forced for requests + that did not fail and outside of ``DEBUG`` mode. By setting + ``'flask._preserve_context'`` to ``True`` on the WSGI environment the + context will not pop itself at the end of the request. This is used by + the :meth:`~flask.Flask.test_client` for example to implement the + deferred cleanup functionality. + + You might find this helpful for unittests where you need the + information from the context local around for a little longer. Make + sure to properly :meth:`~werkzeug.LocalStack.pop` the stack yourself in + that situation, otherwise your unittests will leak memory. + """ + + def __init__(self, app, environ, request=None, session=None): + self.app = app + if request is None: + request = app.request_class(environ) + self.request = request + self.url_adapter = None + try: + self.url_adapter = app.create_url_adapter(self.request) + except HTTPException as e: + self.request.routing_exception = e + self.flashes = None + self.session = session + + # Request contexts can be pushed multiple times and interleaved with + # other request contexts. Now only if the last level is popped we + # get rid of them. Additionally if an application context is missing + # one is created implicitly so for each level we add this information + self._implicit_app_ctx_stack = [] + + # indicator if the context was preserved. Next time another context + # is pushed the preserved context is popped. + self.preserved = False + + # remembers the exception for pop if there is one in case the context + # preservation kicks in. + self._preserved_exc = None + + # Functions that should be executed after the request on the response + # object. These will be called before the regular "after_request" + # functions. + self._after_request_functions = [] + + @property + def g(self): + return _app_ctx_stack.top.g + + @g.setter + def g(self, value): + _app_ctx_stack.top.g = value + + def copy(self): + """Creates a copy of this request context with the same request object. + This can be used to move a request context to a different greenlet. + Because the actual request object is the same this cannot be used to + move a request context to a different thread unless access to the + request object is locked. + + .. versionadded:: 0.10 + + .. versionchanged:: 1.1 + The current session object is used instead of reloading the original + data. This prevents `flask.session` pointing to an out-of-date object. + """ + return self.__class__( + self.app, + environ=self.request.environ, + request=self.request, + session=self.session, + ) + + def match_request(self): + """Can be overridden by a subclass to hook into the matching + of the request. + """ + try: + result = self.url_adapter.match(return_rule=True) + self.request.url_rule, self.request.view_args = result + except HTTPException as e: + self.request.routing_exception = e + + def push(self): + """Binds the request context to the current context.""" + # If an exception occurs in debug mode or if context preservation is + # activated under exception situations exactly one context stays + # on the stack. The rationale is that you want to access that + # information under debug situations. However if someone forgets to + # pop that context again we want to make sure that on the next push + # it's invalidated, otherwise we run at risk that something leaks + # memory. This is usually only a problem in test suite since this + # functionality is not active in production environments. + top = _request_ctx_stack.top + if top is not None and top.preserved: + top.pop(top._preserved_exc) + + # Before we push the request context we have to ensure that there + # is an application context. + app_ctx = _app_ctx_stack.top + if app_ctx is None or app_ctx.app != self.app: + app_ctx = self.app.app_context() + app_ctx.push() + self._implicit_app_ctx_stack.append(app_ctx) + else: + self._implicit_app_ctx_stack.append(None) + + if hasattr(sys, "exc_clear"): + sys.exc_clear() + + _request_ctx_stack.push(self) + + # Open the session at the moment that the request context is available. + # This allows a custom open_session method to use the request context. + # Only open a new session if this is the first time the request was + # pushed, otherwise stream_with_context loses the session. + if self.session is None: + session_interface = self.app.session_interface + self.session = session_interface.open_session(self.app, self.request) + + if self.session is None: + self.session = session_interface.make_null_session(self.app) + + if self.url_adapter is not None: + self.match_request() + + def pop(self, exc=_sentinel): + """Pops the request context and unbinds it by doing that. This will + also trigger the execution of functions registered by the + :meth:`~flask.Flask.teardown_request` decorator. + + .. versionchanged:: 0.9 + Added the `exc` argument. + """ + app_ctx = self._implicit_app_ctx_stack.pop() + + try: + clear_request = False + if not self._implicit_app_ctx_stack: + self.preserved = False + self._preserved_exc = None + if exc is _sentinel: + exc = sys.exc_info()[1] + self.app.do_teardown_request(exc) + + # If this interpreter supports clearing the exception information + # we do that now. This will only go into effect on Python 2.x, + # on 3.x it disappears automatically at the end of the exception + # stack. + if hasattr(sys, "exc_clear"): + sys.exc_clear() + + request_close = getattr(self.request, "close", None) + if request_close is not None: + request_close() + clear_request = True + finally: + rv = _request_ctx_stack.pop() + + # get rid of circular dependencies at the end of the request + # so that we don't require the GC to be active. + if clear_request: + rv.request.environ["werkzeug.request"] = None + + # Get rid of the app as well if necessary. + if app_ctx is not None: + app_ctx.pop(exc) + + assert rv is self, "Popped wrong request context. (%r instead of %r)" % ( + rv, + self, + ) + + def auto_pop(self, exc): + if self.request.environ.get("flask._preserve_context") or ( + exc is not None and self.app.preserve_context_on_exception + ): + self.preserved = True + self._preserved_exc = exc + else: + self.pop(exc) + + def __enter__(self): + self.push() + return self + + def __exit__(self, exc_type, exc_value, tb): + # do not pop the request stack if we are in debug mode and an + # exception happened. This will allow the debugger to still + # access the request object in the interactive shell. Furthermore + # the context can be force kept alive for the test client. + # See flask.testing for how this works. + self.auto_pop(exc_value) + + if BROKEN_PYPY_CTXMGR_EXIT and exc_type is not None: + reraise(exc_type, exc_value, tb) + + def __repr__(self): + return "<%s '%s' [%s] of %s>" % ( + self.__class__.__name__, + self.request.url, + self.request.method, + self.app.name, + ) diff --git a/env/Lib/site-packages/flask/debughelpers.py b/env/Lib/site-packages/flask/debughelpers.py new file mode 100644 index 0000000..e475bd1 --- /dev/null +++ b/env/Lib/site-packages/flask/debughelpers.py @@ -0,0 +1,183 @@ +# -*- coding: utf-8 -*- +""" + flask.debughelpers + ~~~~~~~~~~~~~~~~~~ + + Various helpers to make the development experience better. + + :copyright: 2010 Pallets + :license: BSD-3-Clause +""" +import os +from warnings import warn + +from ._compat import implements_to_string +from ._compat import text_type +from .app import Flask +from .blueprints import Blueprint +from .globals import _request_ctx_stack + + +class UnexpectedUnicodeError(AssertionError, UnicodeError): + """Raised in places where we want some better error reporting for + unexpected unicode or binary data. + """ + + +@implements_to_string +class DebugFilesKeyError(KeyError, AssertionError): + """Raised from request.files during debugging. The idea is that it can + provide a better error message than just a generic KeyError/BadRequest. + """ + + def __init__(self, request, key): + form_matches = request.form.getlist(key) + buf = [ + 'You tried to access the file "%s" in the request.files ' + "dictionary but it does not exist. The mimetype for the request " + 'is "%s" instead of "multipart/form-data" which means that no ' + "file contents were transmitted. To fix this error you should " + 'provide enctype="multipart/form-data" in your form.' + % (key, request.mimetype) + ] + if form_matches: + buf.append( + "\n\nThe browser instead transmitted some file names. " + "This was submitted: %s" % ", ".join('"%s"' % x for x in form_matches) + ) + self.msg = "".join(buf) + + def __str__(self): + return self.msg + + +class FormDataRoutingRedirect(AssertionError): + """This exception is raised by Flask in debug mode if it detects a + redirect caused by the routing system when the request method is not + GET, HEAD or OPTIONS. Reasoning: form data will be dropped. + """ + + def __init__(self, request): + exc = request.routing_exception + buf = [ + "A request was sent to this URL (%s) but a redirect was " + 'issued automatically by the routing system to "%s".' + % (request.url, exc.new_url) + ] + + # In case just a slash was appended we can be extra helpful + if request.base_url + "/" == exc.new_url.split("?")[0]: + buf.append( + " The URL was defined with a trailing slash so " + "Flask will automatically redirect to the URL " + "with the trailing slash if it was accessed " + "without one." + ) + + buf.append( + " Make sure to directly send your %s-request to this URL " + "since we can't make browsers or HTTP clients redirect " + "with form data reliably or without user interaction." % request.method + ) + buf.append("\n\nNote: this exception is only raised in debug mode") + AssertionError.__init__(self, "".join(buf).encode("utf-8")) + + +def attach_enctype_error_multidict(request): + """Since Flask 0.8 we're monkeypatching the files object in case a + request is detected that does not use multipart form data but the files + object is accessed. + """ + oldcls = request.files.__class__ + + class newcls(oldcls): + def __getitem__(self, key): + try: + return oldcls.__getitem__(self, key) + except KeyError: + if key not in request.form: + raise + raise DebugFilesKeyError(request, key) + + newcls.__name__ = oldcls.__name__ + newcls.__module__ = oldcls.__module__ + request.files.__class__ = newcls + + +def _dump_loader_info(loader): + yield "class: %s.%s" % (type(loader).__module__, type(loader).__name__) + for key, value in sorted(loader.__dict__.items()): + if key.startswith("_"): + continue + if isinstance(value, (tuple, list)): + if not all(isinstance(x, (str, text_type)) for x in value): + continue + yield "%s:" % key + for item in value: + yield " - %s" % item + continue + elif not isinstance(value, (str, text_type, int, float, bool)): + continue + yield "%s: %r" % (key, value) + + +def explain_template_loading_attempts(app, template, attempts): + """This should help developers understand what failed""" + info = ['Locating template "%s":' % template] + total_found = 0 + blueprint = None + reqctx = _request_ctx_stack.top + if reqctx is not None and reqctx.request.blueprint is not None: + blueprint = reqctx.request.blueprint + + for idx, (loader, srcobj, triple) in enumerate(attempts): + if isinstance(srcobj, Flask): + src_info = 'application "%s"' % srcobj.import_name + elif isinstance(srcobj, Blueprint): + src_info = 'blueprint "%s" (%s)' % (srcobj.name, srcobj.import_name) + else: + src_info = repr(srcobj) + + info.append("% 5d: trying loader of %s" % (idx + 1, src_info)) + + for line in _dump_loader_info(loader): + info.append(" %s" % line) + + if triple is None: + detail = "no match" + else: + detail = "found (%r)" % (triple[1] or "") + total_found += 1 + info.append(" -> %s" % detail) + + seems_fishy = False + if total_found == 0: + info.append("Error: the template could not be found.") + seems_fishy = True + elif total_found > 1: + info.append("Warning: multiple loaders returned a match for the template.") + seems_fishy = True + + if blueprint is not None and seems_fishy: + info.append( + " The template was looked up from an endpoint that " + 'belongs to the blueprint "%s".' % blueprint + ) + info.append(" Maybe you did not place a template in the right folder?") + info.append(" See http://flask.pocoo.org/docs/blueprints/#templates") + + app.logger.info("\n".join(info)) + + +def explain_ignored_app_run(): + if os.environ.get("WERKZEUG_RUN_MAIN") != "true": + warn( + Warning( + "Silently ignoring app.run() because the " + "application is run from the flask command line " + "executable. Consider putting app.run() behind an " + 'if __name__ == "__main__" guard to silence this ' + "warning." + ), + stacklevel=3, + ) diff --git a/env/Lib/site-packages/flask/globals.py b/env/Lib/site-packages/flask/globals.py new file mode 100644 index 0000000..6d32dcf --- /dev/null +++ b/env/Lib/site-packages/flask/globals.py @@ -0,0 +1,62 @@ +# -*- coding: utf-8 -*- +""" + flask.globals + ~~~~~~~~~~~~~ + + Defines all the global objects that are proxies to the current + active context. + + :copyright: 2010 Pallets + :license: BSD-3-Clause +""" +from functools import partial + +from werkzeug.local import LocalProxy +from werkzeug.local import LocalStack + + +_request_ctx_err_msg = """\ +Working outside of request context. + +This typically means that you attempted to use functionality that needed +an active HTTP request. Consult the documentation on testing for +information about how to avoid this problem.\ +""" +_app_ctx_err_msg = """\ +Working outside of application context. + +This typically means that you attempted to use functionality that needed +to interface with the current application object in some way. To solve +this, set up an application context with app.app_context(). See the +documentation for more information.\ +""" + + +def _lookup_req_object(name): + top = _request_ctx_stack.top + if top is None: + raise RuntimeError(_request_ctx_err_msg) + return getattr(top, name) + + +def _lookup_app_object(name): + top = _app_ctx_stack.top + if top is None: + raise RuntimeError(_app_ctx_err_msg) + return getattr(top, name) + + +def _find_app(): + top = _app_ctx_stack.top + if top is None: + raise RuntimeError(_app_ctx_err_msg) + return top.app + + +# context locals +_request_ctx_stack = LocalStack() +_app_ctx_stack = LocalStack() +current_app = LocalProxy(_find_app) +request = LocalProxy(partial(_lookup_req_object, "request")) +session = LocalProxy(partial(_lookup_req_object, "session")) +g = LocalProxy(partial(_lookup_app_object, "g")) diff --git a/env/Lib/site-packages/flask/helpers.py b/env/Lib/site-packages/flask/helpers.py new file mode 100644 index 0000000..3f401a5 --- /dev/null +++ b/env/Lib/site-packages/flask/helpers.py @@ -0,0 +1,1153 @@ +# -*- coding: utf-8 -*- +""" + flask.helpers + ~~~~~~~~~~~~~ + + Implements various helpers. + + :copyright: 2010 Pallets + :license: BSD-3-Clause +""" +import io +import mimetypes +import os +import pkgutil +import posixpath +import socket +import sys +import unicodedata +from functools import update_wrapper +from threading import RLock +from time import time +from zlib import adler32 + +from jinja2 import FileSystemLoader +from werkzeug.datastructures import Headers +from werkzeug.exceptions import BadRequest +from werkzeug.exceptions import NotFound +from werkzeug.exceptions import RequestedRangeNotSatisfiable +from werkzeug.routing import BuildError +from werkzeug.urls import url_quote +from werkzeug.wsgi import wrap_file + +from ._compat import fspath +from ._compat import PY2 +from ._compat import string_types +from ._compat import text_type +from .globals import _app_ctx_stack +from .globals import _request_ctx_stack +from .globals import current_app +from .globals import request +from .globals import session +from .signals import message_flashed + +# sentinel +_missing = object() + + +# what separators does this operating system provide that are not a slash? +# this is used by the send_from_directory function to ensure that nobody is +# able to access files from outside the filesystem. +_os_alt_seps = list( + sep for sep in [os.path.sep, os.path.altsep] if sep not in (None, "/") +) + + +def get_env(): + """Get the environment the app is running in, indicated by the + :envvar:`FLASK_ENV` environment variable. The default is + ``'production'``. + """ + return os.environ.get("FLASK_ENV") or "production" + + +def get_debug_flag(): + """Get whether debug mode should be enabled for the app, indicated + by the :envvar:`FLASK_DEBUG` environment variable. The default is + ``True`` if :func:`.get_env` returns ``'development'``, or ``False`` + otherwise. + """ + val = os.environ.get("FLASK_DEBUG") + + if not val: + return get_env() == "development" + + return val.lower() not in ("0", "false", "no") + + +def get_load_dotenv(default=True): + """Get whether the user has disabled loading dotenv files by setting + :envvar:`FLASK_SKIP_DOTENV`. The default is ``True``, load the + files. + + :param default: What to return if the env var isn't set. + """ + val = os.environ.get("FLASK_SKIP_DOTENV") + + if not val: + return default + + return val.lower() in ("0", "false", "no") + + +def _endpoint_from_view_func(view_func): + """Internal helper that returns the default endpoint for a given + function. This always is the function name. + """ + assert view_func is not None, "expected view func if endpoint is not provided." + return view_func.__name__ + + +def stream_with_context(generator_or_function): + """Request contexts disappear when the response is started on the server. + This is done for efficiency reasons and to make it less likely to encounter + memory leaks with badly written WSGI middlewares. The downside is that if + you are using streamed responses, the generator cannot access request bound + information any more. + + This function however can help you keep the context around for longer:: + + from flask import stream_with_context, request, Response + + @app.route('/stream') + def streamed_response(): + @stream_with_context + def generate(): + yield 'Hello ' + yield request.args['name'] + yield '!' + return Response(generate()) + + Alternatively it can also be used around a specific generator:: + + from flask import stream_with_context, request, Response + + @app.route('/stream') + def streamed_response(): + def generate(): + yield 'Hello ' + yield request.args['name'] + yield '!' + return Response(stream_with_context(generate())) + + .. versionadded:: 0.9 + """ + try: + gen = iter(generator_or_function) + except TypeError: + + def decorator(*args, **kwargs): + gen = generator_or_function(*args, **kwargs) + return stream_with_context(gen) + + return update_wrapper(decorator, generator_or_function) + + def generator(): + ctx = _request_ctx_stack.top + if ctx is None: + raise RuntimeError( + "Attempted to stream with context but " + "there was no context in the first place to keep around." + ) + with ctx: + # Dummy sentinel. Has to be inside the context block or we're + # not actually keeping the context around. + yield None + + # The try/finally is here so that if someone passes a WSGI level + # iterator in we're still running the cleanup logic. Generators + # don't need that because they are closed on their destruction + # automatically. + try: + for item in gen: + yield item + finally: + if hasattr(gen, "close"): + gen.close() + + # The trick is to start the generator. Then the code execution runs until + # the first dummy None is yielded at which point the context was already + # pushed. This item is discarded. Then when the iteration continues the + # real generator is executed. + wrapped_g = generator() + next(wrapped_g) + return wrapped_g + + +def make_response(*args): + """Sometimes it is necessary to set additional headers in a view. Because + views do not have to return response objects but can return a value that + is converted into a response object by Flask itself, it becomes tricky to + add headers to it. This function can be called instead of using a return + and you will get a response object which you can use to attach headers. + + If view looked like this and you want to add a new header:: + + def index(): + return render_template('index.html', foo=42) + + You can now do something like this:: + + def index(): + response = make_response(render_template('index.html', foo=42)) + response.headers['X-Parachutes'] = 'parachutes are cool' + return response + + This function accepts the very same arguments you can return from a + view function. This for example creates a response with a 404 error + code:: + + response = make_response(render_template('not_found.html'), 404) + + The other use case of this function is to force the return value of a + view function into a response which is helpful with view + decorators:: + + response = make_response(view_function()) + response.headers['X-Parachutes'] = 'parachutes are cool' + + Internally this function does the following things: + + - if no arguments are passed, it creates a new response argument + - if one argument is passed, :meth:`flask.Flask.make_response` + is invoked with it. + - if more than one argument is passed, the arguments are passed + to the :meth:`flask.Flask.make_response` function as tuple. + + .. versionadded:: 0.6 + """ + if not args: + return current_app.response_class() + if len(args) == 1: + args = args[0] + return current_app.make_response(args) + + +def url_for(endpoint, **values): + """Generates a URL to the given endpoint with the method provided. + + Variable arguments that are unknown to the target endpoint are appended + to the generated URL as query arguments. If the value of a query argument + is ``None``, the whole pair is skipped. In case blueprints are active + you can shortcut references to the same blueprint by prefixing the + local endpoint with a dot (``.``). + + This will reference the index function local to the current blueprint:: + + url_for('.index') + + For more information, head over to the :ref:`Quickstart `. + + Configuration values ``APPLICATION_ROOT`` and ``SERVER_NAME`` are only used when + generating URLs outside of a request context. + + To integrate applications, :class:`Flask` has a hook to intercept URL build + errors through :attr:`Flask.url_build_error_handlers`. The `url_for` + function results in a :exc:`~werkzeug.routing.BuildError` when the current + app does not have a URL for the given endpoint and values. When it does, the + :data:`~flask.current_app` calls its :attr:`~Flask.url_build_error_handlers` if + it is not ``None``, which can return a string to use as the result of + `url_for` (instead of `url_for`'s default to raise the + :exc:`~werkzeug.routing.BuildError` exception) or re-raise the exception. + An example:: + + def external_url_handler(error, endpoint, values): + "Looks up an external URL when `url_for` cannot build a URL." + # This is an example of hooking the build_error_handler. + # Here, lookup_url is some utility function you've built + # which looks up the endpoint in some external URL registry. + url = lookup_url(endpoint, **values) + if url is None: + # External lookup did not have a URL. + # Re-raise the BuildError, in context of original traceback. + exc_type, exc_value, tb = sys.exc_info() + if exc_value is error: + raise exc_type, exc_value, tb + else: + raise error + # url_for will use this result, instead of raising BuildError. + return url + + app.url_build_error_handlers.append(external_url_handler) + + Here, `error` is the instance of :exc:`~werkzeug.routing.BuildError`, and + `endpoint` and `values` are the arguments passed into `url_for`. Note + that this is for building URLs outside the current application, and not for + handling 404 NotFound errors. + + .. versionadded:: 0.10 + The `_scheme` parameter was added. + + .. versionadded:: 0.9 + The `_anchor` and `_method` parameters were added. + + .. versionadded:: 0.9 + Calls :meth:`Flask.handle_build_error` on + :exc:`~werkzeug.routing.BuildError`. + + :param endpoint: the endpoint of the URL (name of the function) + :param values: the variable arguments of the URL rule + :param _external: if set to ``True``, an absolute URL is generated. Server + address can be changed via ``SERVER_NAME`` configuration variable which + falls back to the `Host` header, then to the IP and port of the request. + :param _scheme: a string specifying the desired URL scheme. The `_external` + parameter must be set to ``True`` or a :exc:`ValueError` is raised. The default + behavior uses the same scheme as the current request, or + ``PREFERRED_URL_SCHEME`` from the :ref:`app configuration ` if no + request context is available. As of Werkzeug 0.10, this also can be set + to an empty string to build protocol-relative URLs. + :param _anchor: if provided this is added as anchor to the URL. + :param _method: if provided this explicitly specifies an HTTP method. + """ + appctx = _app_ctx_stack.top + reqctx = _request_ctx_stack.top + + if appctx is None: + raise RuntimeError( + "Attempted to generate a URL without the application context being" + " pushed. This has to be executed when application context is" + " available." + ) + + # If request specific information is available we have some extra + # features that support "relative" URLs. + if reqctx is not None: + url_adapter = reqctx.url_adapter + blueprint_name = request.blueprint + + if endpoint[:1] == ".": + if blueprint_name is not None: + endpoint = blueprint_name + endpoint + else: + endpoint = endpoint[1:] + + external = values.pop("_external", False) + + # Otherwise go with the url adapter from the appctx and make + # the URLs external by default. + else: + url_adapter = appctx.url_adapter + + if url_adapter is None: + raise RuntimeError( + "Application was not able to create a URL adapter for request" + " independent URL generation. You might be able to fix this by" + " setting the SERVER_NAME config variable." + ) + + external = values.pop("_external", True) + + anchor = values.pop("_anchor", None) + method = values.pop("_method", None) + scheme = values.pop("_scheme", None) + appctx.app.inject_url_defaults(endpoint, values) + + # This is not the best way to deal with this but currently the + # underlying Werkzeug router does not support overriding the scheme on + # a per build call basis. + old_scheme = None + if scheme is not None: + if not external: + raise ValueError("When specifying _scheme, _external must be True") + old_scheme = url_adapter.url_scheme + url_adapter.url_scheme = scheme + + try: + try: + rv = url_adapter.build( + endpoint, values, method=method, force_external=external + ) + finally: + if old_scheme is not None: + url_adapter.url_scheme = old_scheme + except BuildError as error: + # We need to inject the values again so that the app callback can + # deal with that sort of stuff. + values["_external"] = external + values["_anchor"] = anchor + values["_method"] = method + values["_scheme"] = scheme + return appctx.app.handle_url_build_error(error, endpoint, values) + + if anchor is not None: + rv += "#" + url_quote(anchor) + return rv + + +def get_template_attribute(template_name, attribute): + """Loads a macro (or variable) a template exports. This can be used to + invoke a macro from within Python code. If you for example have a + template named :file:`_cider.html` with the following contents: + + .. sourcecode:: html+jinja + + {% macro hello(name) %}Hello {{ name }}!{% endmacro %} + + You can access this from Python code like this:: + + hello = get_template_attribute('_cider.html', 'hello') + return hello('World') + + .. versionadded:: 0.2 + + :param template_name: the name of the template + :param attribute: the name of the variable of macro to access + """ + return getattr(current_app.jinja_env.get_template(template_name).module, attribute) + + +def flash(message, category="message"): + """Flashes a message to the next request. In order to remove the + flashed message from the session and to display it to the user, + the template has to call :func:`get_flashed_messages`. + + .. versionchanged:: 0.3 + `category` parameter added. + + :param message: the message to be flashed. + :param category: the category for the message. The following values + are recommended: ``'message'`` for any kind of message, + ``'error'`` for errors, ``'info'`` for information + messages and ``'warning'`` for warnings. However any + kind of string can be used as category. + """ + # Original implementation: + # + # session.setdefault('_flashes', []).append((category, message)) + # + # This assumed that changes made to mutable structures in the session are + # always in sync with the session object, which is not true for session + # implementations that use external storage for keeping their keys/values. + flashes = session.get("_flashes", []) + flashes.append((category, message)) + session["_flashes"] = flashes + message_flashed.send( + current_app._get_current_object(), message=message, category=category + ) + + +def get_flashed_messages(with_categories=False, category_filter=()): + """Pulls all flashed messages from the session and returns them. + Further calls in the same request to the function will return + the same messages. By default just the messages are returned, + but when `with_categories` is set to ``True``, the return value will + be a list of tuples in the form ``(category, message)`` instead. + + Filter the flashed messages to one or more categories by providing those + categories in `category_filter`. This allows rendering categories in + separate html blocks. The `with_categories` and `category_filter` + arguments are distinct: + + * `with_categories` controls whether categories are returned with message + text (``True`` gives a tuple, where ``False`` gives just the message text). + * `category_filter` filters the messages down to only those matching the + provided categories. + + See :ref:`message-flashing-pattern` for examples. + + .. versionchanged:: 0.3 + `with_categories` parameter added. + + .. versionchanged:: 0.9 + `category_filter` parameter added. + + :param with_categories: set to ``True`` to also receive categories. + :param category_filter: whitelist of categories to limit return values + """ + flashes = _request_ctx_stack.top.flashes + if flashes is None: + _request_ctx_stack.top.flashes = flashes = ( + session.pop("_flashes") if "_flashes" in session else [] + ) + if category_filter: + flashes = list(filter(lambda f: f[0] in category_filter, flashes)) + if not with_categories: + return [x[1] for x in flashes] + return flashes + + +def send_file( + filename_or_fp, + mimetype=None, + as_attachment=False, + attachment_filename=None, + add_etags=True, + cache_timeout=None, + conditional=False, + last_modified=None, +): + """Sends the contents of a file to the client. This will use the + most efficient method available and configured. By default it will + try to use the WSGI server's file_wrapper support. Alternatively + you can set the application's :attr:`~Flask.use_x_sendfile` attribute + to ``True`` to directly emit an ``X-Sendfile`` header. This however + requires support of the underlying webserver for ``X-Sendfile``. + + By default it will try to guess the mimetype for you, but you can + also explicitly provide one. For extra security you probably want + to send certain files as attachment (HTML for instance). The mimetype + guessing requires a `filename` or an `attachment_filename` to be + provided. + + ETags will also be attached automatically if a `filename` is provided. You + can turn this off by setting `add_etags=False`. + + If `conditional=True` and `filename` is provided, this method will try to + upgrade the response stream to support range requests. This will allow + the request to be answered with partial content response. + + Please never pass filenames to this function from user sources; + you should use :func:`send_from_directory` instead. + + .. versionadded:: 0.2 + + .. versionadded:: 0.5 + The `add_etags`, `cache_timeout` and `conditional` parameters were + added. The default behavior is now to attach etags. + + .. versionchanged:: 0.7 + mimetype guessing and etag support for file objects was + deprecated because it was unreliable. Pass a filename if you are + able to, otherwise attach an etag yourself. This functionality + will be removed in Flask 1.0 + + .. versionchanged:: 0.9 + cache_timeout pulls its default from application config, when None. + + .. versionchanged:: 0.12 + The filename is no longer automatically inferred from file objects. If + you want to use automatic mimetype and etag support, pass a filepath via + `filename_or_fp` or `attachment_filename`. + + .. versionchanged:: 0.12 + The `attachment_filename` is preferred over `filename` for MIME-type + detection. + + .. versionchanged:: 1.0 + UTF-8 filenames, as specified in `RFC 2231`_, are supported. + + .. _RFC 2231: https://tools.ietf.org/html/rfc2231#section-4 + + .. versionchanged:: 1.0.3 + Filenames are encoded with ASCII instead of Latin-1 for broader + compatibility with WSGI servers. + + .. versionchanged:: 1.1 + Filename may be a :class:`~os.PathLike` object. + + .. versionadded:: 1.1 + Partial content supports :class:`~io.BytesIO`. + + :param filename_or_fp: the filename of the file to send. + This is relative to the :attr:`~Flask.root_path` + if a relative path is specified. + Alternatively a file object might be provided in + which case ``X-Sendfile`` might not work and fall + back to the traditional method. Make sure that the + file pointer is positioned at the start of data to + send before calling :func:`send_file`. + :param mimetype: the mimetype of the file if provided. If a file path is + given, auto detection happens as fallback, otherwise an + error will be raised. + :param as_attachment: set to ``True`` if you want to send this file with + a ``Content-Disposition: attachment`` header. + :param attachment_filename: the filename for the attachment if it + differs from the file's filename. + :param add_etags: set to ``False`` to disable attaching of etags. + :param conditional: set to ``True`` to enable conditional responses. + + :param cache_timeout: the timeout in seconds for the headers. When ``None`` + (default), this value is set by + :meth:`~Flask.get_send_file_max_age` of + :data:`~flask.current_app`. + :param last_modified: set the ``Last-Modified`` header to this value, + a :class:`~datetime.datetime` or timestamp. + If a file was passed, this overrides its mtime. + """ + mtime = None + fsize = None + + if hasattr(filename_or_fp, "__fspath__"): + filename_or_fp = fspath(filename_or_fp) + + if isinstance(filename_or_fp, string_types): + filename = filename_or_fp + if not os.path.isabs(filename): + filename = os.path.join(current_app.root_path, filename) + file = None + if attachment_filename is None: + attachment_filename = os.path.basename(filename) + else: + file = filename_or_fp + filename = None + + if mimetype is None: + if attachment_filename is not None: + mimetype = ( + mimetypes.guess_type(attachment_filename)[0] + or "application/octet-stream" + ) + + if mimetype is None: + raise ValueError( + "Unable to infer MIME-type because no filename is available. " + "Please set either `attachment_filename`, pass a filepath to " + "`filename_or_fp` or set your own MIME-type via `mimetype`." + ) + + headers = Headers() + if as_attachment: + if attachment_filename is None: + raise TypeError("filename unavailable, required for sending as attachment") + + if not isinstance(attachment_filename, text_type): + attachment_filename = attachment_filename.decode("utf-8") + + try: + attachment_filename = attachment_filename.encode("ascii") + except UnicodeEncodeError: + filenames = { + "filename": unicodedata.normalize("NFKD", attachment_filename).encode( + "ascii", "ignore" + ), + "filename*": "UTF-8''%s" % url_quote(attachment_filename, safe=b""), + } + else: + filenames = {"filename": attachment_filename} + + headers.add("Content-Disposition", "attachment", **filenames) + + if current_app.use_x_sendfile and filename: + if file is not None: + file.close() + headers["X-Sendfile"] = filename + fsize = os.path.getsize(filename) + headers["Content-Length"] = fsize + data = None + else: + if file is None: + file = open(filename, "rb") + mtime = os.path.getmtime(filename) + fsize = os.path.getsize(filename) + headers["Content-Length"] = fsize + elif isinstance(file, io.BytesIO): + try: + fsize = file.getbuffer().nbytes + except AttributeError: + # Python 2 doesn't have getbuffer + fsize = len(file.getvalue()) + headers["Content-Length"] = fsize + data = wrap_file(request.environ, file) + + rv = current_app.response_class( + data, mimetype=mimetype, headers=headers, direct_passthrough=True + ) + + if last_modified is not None: + rv.last_modified = last_modified + elif mtime is not None: + rv.last_modified = mtime + + rv.cache_control.public = True + if cache_timeout is None: + cache_timeout = current_app.get_send_file_max_age(filename) + if cache_timeout is not None: + rv.cache_control.max_age = cache_timeout + rv.expires = int(time() + cache_timeout) + + if add_etags and filename is not None: + from warnings import warn + + try: + rv.set_etag( + "%s-%s-%s" + % ( + os.path.getmtime(filename), + os.path.getsize(filename), + adler32( + filename.encode("utf-8") + if isinstance(filename, text_type) + else filename + ) + & 0xFFFFFFFF, + ) + ) + except OSError: + warn( + "Access %s failed, maybe it does not exist, so ignore etags in " + "headers" % filename, + stacklevel=2, + ) + + if conditional: + try: + rv = rv.make_conditional(request, accept_ranges=True, complete_length=fsize) + except RequestedRangeNotSatisfiable: + if file is not None: + file.close() + raise + # make sure we don't send x-sendfile for servers that + # ignore the 304 status code for x-sendfile. + if rv.status_code == 304: + rv.headers.pop("x-sendfile", None) + return rv + + +def safe_join(directory, *pathnames): + """Safely join `directory` and zero or more untrusted `pathnames` + components. + + Example usage:: + + @app.route('/wiki/') + def wiki_page(filename): + filename = safe_join(app.config['WIKI_FOLDER'], filename) + with open(filename, 'rb') as fd: + content = fd.read() # Read and process the file content... + + :param directory: the trusted base directory. + :param pathnames: the untrusted pathnames relative to that directory. + :raises: :class:`~werkzeug.exceptions.NotFound` if one or more passed + paths fall out of its boundaries. + """ + + parts = [directory] + + for filename in pathnames: + if filename != "": + filename = posixpath.normpath(filename) + + if ( + any(sep in filename for sep in _os_alt_seps) + or os.path.isabs(filename) + or filename == ".." + or filename.startswith("../") + ): + raise NotFound() + + parts.append(filename) + + return posixpath.join(*parts) + + +def send_from_directory(directory, filename, **options): + """Send a file from a given directory with :func:`send_file`. This + is a secure way to quickly expose static files from an upload folder + or something similar. + + Example usage:: + + @app.route('/uploads/') + def download_file(filename): + return send_from_directory(app.config['UPLOAD_FOLDER'], + filename, as_attachment=True) + + .. admonition:: Sending files and Performance + + It is strongly recommended to activate either ``X-Sendfile`` support in + your webserver or (if no authentication happens) to tell the webserver + to serve files for the given path on its own without calling into the + web application for improved performance. + + .. versionadded:: 0.5 + + :param directory: the directory where all the files are stored. + :param filename: the filename relative to that directory to + download. + :param options: optional keyword arguments that are directly + forwarded to :func:`send_file`. + """ + filename = fspath(filename) + directory = fspath(directory) + filename = safe_join(directory, filename) + if not os.path.isabs(filename): + filename = os.path.join(current_app.root_path, filename) + try: + if not os.path.isfile(filename): + raise NotFound() + except (TypeError, ValueError): + raise BadRequest() + options.setdefault("conditional", True) + return send_file(filename, **options) + + +def get_root_path(import_name): + """Returns the path to a package or cwd if that cannot be found. This + returns the path of a package or the folder that contains a module. + + Not to be confused with the package path returned by :func:`find_package`. + """ + # Module already imported and has a file attribute. Use that first. + mod = sys.modules.get(import_name) + if mod is not None and hasattr(mod, "__file__"): + return os.path.dirname(os.path.abspath(mod.__file__)) + + # Next attempt: check the loader. + loader = pkgutil.get_loader(import_name) + + # Loader does not exist or we're referring to an unloaded main module + # or a main module without path (interactive sessions), go with the + # current working directory. + if loader is None or import_name == "__main__": + return os.getcwd() + + # For .egg, zipimporter does not have get_filename until Python 2.7. + # Some other loaders might exhibit the same behavior. + if hasattr(loader, "get_filename"): + filepath = loader.get_filename(import_name) + else: + # Fall back to imports. + __import__(import_name) + mod = sys.modules[import_name] + filepath = getattr(mod, "__file__", None) + + # If we don't have a filepath it might be because we are a + # namespace package. In this case we pick the root path from the + # first module that is contained in our package. + if filepath is None: + raise RuntimeError( + "No root path can be found for the provided " + 'module "%s". This can happen because the ' + "module came from an import hook that does " + "not provide file name information or because " + "it's a namespace package. In this case " + "the root path needs to be explicitly " + "provided." % import_name + ) + + # filepath is import_name.py for a module, or __init__.py for a package. + return os.path.dirname(os.path.abspath(filepath)) + + +def _matching_loader_thinks_module_is_package(loader, mod_name): + """Given the loader that loaded a module and the module this function + attempts to figure out if the given module is actually a package. + """ + # If the loader can tell us if something is a package, we can + # directly ask the loader. + if hasattr(loader, "is_package"): + return loader.is_package(mod_name) + # importlib's namespace loaders do not have this functionality but + # all the modules it loads are packages, so we can take advantage of + # this information. + elif ( + loader.__class__.__module__ == "_frozen_importlib" + and loader.__class__.__name__ == "NamespaceLoader" + ): + return True + # Otherwise we need to fail with an error that explains what went + # wrong. + raise AttributeError( + ( + "%s.is_package() method is missing but is required by Flask of " + "PEP 302 import hooks. If you do not use import hooks and " + "you encounter this error please file a bug against Flask." + ) + % loader.__class__.__name__ + ) + + +def _find_package_path(root_mod_name): + """Find the path where the module's root exists in""" + if sys.version_info >= (3, 4): + import importlib.util + + try: + spec = importlib.util.find_spec(root_mod_name) + if spec is None: + raise ValueError("not found") + # ImportError: the machinery told us it does not exist + # ValueError: + # - the module name was invalid + # - the module name is __main__ + # - *we* raised `ValueError` due to `spec` being `None` + except (ImportError, ValueError): + pass # handled below + else: + # namespace package + if spec.origin in {"namespace", None}: + return os.path.dirname(next(iter(spec.submodule_search_locations))) + # a package (with __init__.py) + elif spec.submodule_search_locations: + return os.path.dirname(os.path.dirname(spec.origin)) + # just a normal module + else: + return os.path.dirname(spec.origin) + + # we were unable to find the `package_path` using PEP 451 loaders + loader = pkgutil.get_loader(root_mod_name) + if loader is None or root_mod_name == "__main__": + # import name is not found, or interactive/main module + return os.getcwd() + else: + # For .egg, zipimporter does not have get_filename until Python 2.7. + if hasattr(loader, "get_filename"): + filename = loader.get_filename(root_mod_name) + elif hasattr(loader, "archive"): + # zipimporter's loader.archive points to the .egg or .zip + # archive filename is dropped in call to dirname below. + filename = loader.archive + else: + # At least one loader is missing both get_filename and archive: + # Google App Engine's HardenedModulesHook + # + # Fall back to imports. + __import__(root_mod_name) + filename = sys.modules[root_mod_name].__file__ + package_path = os.path.abspath(os.path.dirname(filename)) + + # In case the root module is a package we need to chop of the + # rightmost part. This needs to go through a helper function + # because of python 3.3 namespace packages. + if _matching_loader_thinks_module_is_package(loader, root_mod_name): + package_path = os.path.dirname(package_path) + + return package_path + + +def find_package(import_name): + """Finds a package and returns the prefix (or None if the package is + not installed) as well as the folder that contains the package or + module as a tuple. The package path returned is the module that would + have to be added to the pythonpath in order to make it possible to + import the module. The prefix is the path below which a UNIX like + folder structure exists (lib, share etc.). + """ + root_mod_name, _, _ = import_name.partition(".") + package_path = _find_package_path(root_mod_name) + site_parent, site_folder = os.path.split(package_path) + py_prefix = os.path.abspath(sys.prefix) + if package_path.startswith(py_prefix): + return py_prefix, package_path + elif site_folder.lower() == "site-packages": + parent, folder = os.path.split(site_parent) + # Windows like installations + if folder.lower() == "lib": + base_dir = parent + # UNIX like installations + elif os.path.basename(parent).lower() == "lib": + base_dir = os.path.dirname(parent) + else: + base_dir = site_parent + return base_dir, package_path + return None, package_path + + +class locked_cached_property(object): + """A decorator that converts a function into a lazy property. The + function wrapped is called the first time to retrieve the result + and then that calculated result is used the next time you access + the value. Works like the one in Werkzeug but has a lock for + thread safety. + """ + + def __init__(self, func, name=None, doc=None): + self.__name__ = name or func.__name__ + self.__module__ = func.__module__ + self.__doc__ = doc or func.__doc__ + self.func = func + self.lock = RLock() + + def __get__(self, obj, type=None): + if obj is None: + return self + with self.lock: + value = obj.__dict__.get(self.__name__, _missing) + if value is _missing: + value = self.func(obj) + obj.__dict__[self.__name__] = value + return value + + +class _PackageBoundObject(object): + #: The name of the package or module that this app belongs to. Do not + #: change this once it is set by the constructor. + import_name = None + + #: Location of the template files to be added to the template lookup. + #: ``None`` if templates should not be added. + template_folder = None + + #: Absolute path to the package on the filesystem. Used to look up + #: resources contained in the package. + root_path = None + + def __init__(self, import_name, template_folder=None, root_path=None): + self.import_name = import_name + self.template_folder = template_folder + + if root_path is None: + root_path = get_root_path(self.import_name) + + self.root_path = root_path + self._static_folder = None + self._static_url_path = None + + # circular import + from .cli import AppGroup + + #: The Click command group for registration of CLI commands + #: on the application and associated blueprints. These commands + #: are accessible via the :command:`flask` command once the + #: application has been discovered and blueprints registered. + self.cli = AppGroup() + + @property + def static_folder(self): + """The absolute path to the configured static folder.""" + if self._static_folder is not None: + return os.path.join(self.root_path, self._static_folder) + + @static_folder.setter + def static_folder(self, value): + self._static_folder = value + + @property + def static_url_path(self): + """The URL prefix that the static route will be accessible from. + + If it was not configured during init, it is derived from + :attr:`static_folder`. + """ + if self._static_url_path is not None: + return self._static_url_path + + if self.static_folder is not None: + basename = os.path.basename(self.static_folder) + return ("/" + basename).rstrip("/") + + @static_url_path.setter + def static_url_path(self, value): + if value is not None: + value = value.rstrip("/") + + self._static_url_path = value + + @property + def has_static_folder(self): + """This is ``True`` if the package bound object's container has a + folder for static files. + + .. versionadded:: 0.5 + """ + return self.static_folder is not None + + @locked_cached_property + def jinja_loader(self): + """The Jinja loader for this package bound object. + + .. versionadded:: 0.5 + """ + if self.template_folder is not None: + return FileSystemLoader(os.path.join(self.root_path, self.template_folder)) + + def get_send_file_max_age(self, filename): + """Provides default cache_timeout for the :func:`send_file` functions. + + By default, this function returns ``SEND_FILE_MAX_AGE_DEFAULT`` from + the configuration of :data:`~flask.current_app`. + + Static file functions such as :func:`send_from_directory` use this + function, and :func:`send_file` calls this function on + :data:`~flask.current_app` when the given cache_timeout is ``None``. If a + cache_timeout is given in :func:`send_file`, that timeout is used; + otherwise, this method is called. + + This allows subclasses to change the behavior when sending files based + on the filename. For example, to set the cache timeout for .js files + to 60 seconds:: + + class MyFlask(flask.Flask): + def get_send_file_max_age(self, name): + if name.lower().endswith('.js'): + return 60 + return flask.Flask.get_send_file_max_age(self, name) + + .. versionadded:: 0.9 + """ + return total_seconds(current_app.send_file_max_age_default) + + def send_static_file(self, filename): + """Function used internally to send static files from the static + folder to the browser. + + .. versionadded:: 0.5 + """ + if not self.has_static_folder: + raise RuntimeError("No static folder for this object") + # Ensure get_send_file_max_age is called in all cases. + # Here, we ensure get_send_file_max_age is called for Blueprints. + cache_timeout = self.get_send_file_max_age(filename) + return send_from_directory( + self.static_folder, filename, cache_timeout=cache_timeout + ) + + def open_resource(self, resource, mode="rb"): + """Opens a resource from the application's resource folder. To see + how this works, consider the following folder structure:: + + /myapplication.py + /schema.sql + /static + /style.css + /templates + /layout.html + /index.html + + If you want to open the :file:`schema.sql` file you would do the + following:: + + with app.open_resource('schema.sql') as f: + contents = f.read() + do_something_with(contents) + + :param resource: the name of the resource. To access resources within + subfolders use forward slashes as separator. + :param mode: Open file in this mode. Only reading is supported, + valid values are "r" (or "rt") and "rb". + """ + if mode not in {"r", "rt", "rb"}: + raise ValueError("Resources can only be opened for reading") + + return open(os.path.join(self.root_path, resource), mode) + + +def total_seconds(td): + """Returns the total seconds from a timedelta object. + + :param timedelta td: the timedelta to be converted in seconds + + :returns: number of seconds + :rtype: int + """ + return td.days * 60 * 60 * 24 + td.seconds + + +def is_ip(value): + """Determine if the given string is an IP address. + + Python 2 on Windows doesn't provide ``inet_pton``, so this only + checks IPv4 addresses in that environment. + + :param value: value to check + :type value: str + + :return: True if string is an IP address + :rtype: bool + """ + if PY2 and os.name == "nt": + try: + socket.inet_aton(value) + return True + except socket.error: + return False + + for family in (socket.AF_INET, socket.AF_INET6): + try: + socket.inet_pton(family, value) + except socket.error: + pass + else: + return True + + return False diff --git a/env/Lib/site-packages/flask/json/__init__.py b/env/Lib/site-packages/flask/json/__init__.py new file mode 100644 index 0000000..a141068 --- /dev/null +++ b/env/Lib/site-packages/flask/json/__init__.py @@ -0,0 +1,376 @@ +# -*- coding: utf-8 -*- +""" +flask.json +~~~~~~~~~~ + +:copyright: 2010 Pallets +:license: BSD-3-Clause +""" +import codecs +import io +import uuid +from datetime import date +from datetime import datetime + +from itsdangerous import json as _json +from jinja2 import Markup +from werkzeug.http import http_date + +from .._compat import PY2 +from .._compat import text_type +from ..globals import current_app +from ..globals import request + +try: + import dataclasses +except ImportError: + dataclasses = None + +# Figure out if simplejson escapes slashes. This behavior was changed +# from one version to another without reason. +_slash_escape = "\\/" not in _json.dumps("/") + + +__all__ = [ + "dump", + "dumps", + "load", + "loads", + "htmlsafe_dump", + "htmlsafe_dumps", + "JSONDecoder", + "JSONEncoder", + "jsonify", +] + + +def _wrap_reader_for_text(fp, encoding): + if isinstance(fp.read(0), bytes): + fp = io.TextIOWrapper(io.BufferedReader(fp), encoding) + return fp + + +def _wrap_writer_for_text(fp, encoding): + try: + fp.write("") + except TypeError: + fp = io.TextIOWrapper(fp, encoding) + return fp + + +class JSONEncoder(_json.JSONEncoder): + """The default Flask JSON encoder. This one extends the default + encoder by also supporting ``datetime``, ``UUID``, ``dataclasses``, + and ``Markup`` objects. + + ``datetime`` objects are serialized as RFC 822 datetime strings. + This is the same as the HTTP date format. + + In order to support more data types, override the :meth:`default` + method. + """ + + def default(self, o): + """Implement this method in a subclass such that it returns a + serializable object for ``o``, or calls the base implementation (to + raise a :exc:`TypeError`). + + For example, to support arbitrary iterators, you could implement + default like this:: + + def default(self, o): + try: + iterable = iter(o) + except TypeError: + pass + else: + return list(iterable) + return JSONEncoder.default(self, o) + """ + if isinstance(o, datetime): + return http_date(o.utctimetuple()) + if isinstance(o, date): + return http_date(o.timetuple()) + if isinstance(o, uuid.UUID): + return str(o) + if dataclasses and dataclasses.is_dataclass(o): + return dataclasses.asdict(o) + if hasattr(o, "__html__"): + return text_type(o.__html__()) + return _json.JSONEncoder.default(self, o) + + +class JSONDecoder(_json.JSONDecoder): + """The default JSON decoder. This one does not change the behavior from + the default simplejson decoder. Consult the :mod:`json` documentation + for more information. This decoder is not only used for the load + functions of this module but also :attr:`~flask.Request`. + """ + + +def _dump_arg_defaults(kwargs, app=None): + """Inject default arguments for dump functions.""" + if app is None: + app = current_app + + if app: + bp = app.blueprints.get(request.blueprint) if request else None + kwargs.setdefault( + "cls", bp.json_encoder if bp and bp.json_encoder else app.json_encoder + ) + + if not app.config["JSON_AS_ASCII"]: + kwargs.setdefault("ensure_ascii", False) + + kwargs.setdefault("sort_keys", app.config["JSON_SORT_KEYS"]) + else: + kwargs.setdefault("sort_keys", True) + kwargs.setdefault("cls", JSONEncoder) + + +def _load_arg_defaults(kwargs, app=None): + """Inject default arguments for load functions.""" + if app is None: + app = current_app + + if app: + bp = app.blueprints.get(request.blueprint) if request else None + kwargs.setdefault( + "cls", bp.json_decoder if bp and bp.json_decoder else app.json_decoder + ) + else: + kwargs.setdefault("cls", JSONDecoder) + + +def detect_encoding(data): + """Detect which UTF codec was used to encode the given bytes. + + The latest JSON standard (:rfc:`8259`) suggests that only UTF-8 is + accepted. Older documents allowed 8, 16, or 32. 16 and 32 can be big + or little endian. Some editors or libraries may prepend a BOM. + + :param data: Bytes in unknown UTF encoding. + :return: UTF encoding name + """ + head = data[:4] + + if head[:3] == codecs.BOM_UTF8: + return "utf-8-sig" + + if b"\x00" not in head: + return "utf-8" + + if head in (codecs.BOM_UTF32_BE, codecs.BOM_UTF32_LE): + return "utf-32" + + if head[:2] in (codecs.BOM_UTF16_BE, codecs.BOM_UTF16_LE): + return "utf-16" + + if len(head) == 4: + if head[:3] == b"\x00\x00\x00": + return "utf-32-be" + + if head[::2] == b"\x00\x00": + return "utf-16-be" + + if head[1:] == b"\x00\x00\x00": + return "utf-32-le" + + if head[1::2] == b"\x00\x00": + return "utf-16-le" + + if len(head) == 2: + return "utf-16-be" if head.startswith(b"\x00") else "utf-16-le" + + return "utf-8" + + +def dumps(obj, app=None, **kwargs): + """Serialize ``obj`` to a JSON-formatted string. If there is an + app context pushed, use the current app's configured encoder + (:attr:`~flask.Flask.json_encoder`), or fall back to the default + :class:`JSONEncoder`. + + Takes the same arguments as the built-in :func:`json.dumps`, and + does some extra configuration based on the application. If the + simplejson package is installed, it is preferred. + + :param obj: Object to serialize to JSON. + :param app: App instance to use to configure the JSON encoder. + Uses ``current_app`` if not given, and falls back to the default + encoder when not in an app context. + :param kwargs: Extra arguments passed to :func:`json.dumps`. + + .. versionchanged:: 1.0.3 + + ``app`` can be passed directly, rather than requiring an app + context for configuration. + """ + _dump_arg_defaults(kwargs, app=app) + encoding = kwargs.pop("encoding", None) + rv = _json.dumps(obj, **kwargs) + if encoding is not None and isinstance(rv, text_type): + rv = rv.encode(encoding) + return rv + + +def dump(obj, fp, app=None, **kwargs): + """Like :func:`dumps` but writes into a file object.""" + _dump_arg_defaults(kwargs, app=app) + encoding = kwargs.pop("encoding", None) + if encoding is not None: + fp = _wrap_writer_for_text(fp, encoding) + _json.dump(obj, fp, **kwargs) + + +def loads(s, app=None, **kwargs): + """Deserialize an object from a JSON-formatted string ``s``. If + there is an app context pushed, use the current app's configured + decoder (:attr:`~flask.Flask.json_decoder`), or fall back to the + default :class:`JSONDecoder`. + + Takes the same arguments as the built-in :func:`json.loads`, and + does some extra configuration based on the application. If the + simplejson package is installed, it is preferred. + + :param s: JSON string to deserialize. + :param app: App instance to use to configure the JSON decoder. + Uses ``current_app`` if not given, and falls back to the default + encoder when not in an app context. + :param kwargs: Extra arguments passed to :func:`json.dumps`. + + .. versionchanged:: 1.0.3 + + ``app`` can be passed directly, rather than requiring an app + context for configuration. + """ + _load_arg_defaults(kwargs, app=app) + if isinstance(s, bytes): + encoding = kwargs.pop("encoding", None) + if encoding is None: + encoding = detect_encoding(s) + s = s.decode(encoding) + return _json.loads(s, **kwargs) + + +def load(fp, app=None, **kwargs): + """Like :func:`loads` but reads from a file object.""" + _load_arg_defaults(kwargs, app=app) + if not PY2: + fp = _wrap_reader_for_text(fp, kwargs.pop("encoding", None) or "utf-8") + return _json.load(fp, **kwargs) + + +def htmlsafe_dumps(obj, **kwargs): + """Works exactly like :func:`dumps` but is safe for use in ``') + # => <script> do_nasty_stuff() </script> + # sanitize_html('Click here for $100') + # => Click here for $100 + def sanitize_token(self, token): + + # accommodate filters which use token_type differently + token_type = token["type"] + if token_type in ("StartTag", "EndTag", "EmptyTag"): + name = token["name"] + namespace = token["namespace"] + if ((namespace, name) in self.allowed_elements or + (namespace is None and + (namespaces["html"], name) in self.allowed_elements)): + return self.allowed_token(token) + else: + return self.disallowed_token(token) + elif token_type == "Comment": + pass + else: + return token + + def allowed_token(self, token): + if "data" in token: + attrs = token["data"] + attr_names = set(attrs.keys()) + + # Remove forbidden attributes + for to_remove in (attr_names - self.allowed_attributes): + del token["data"][to_remove] + attr_names.remove(to_remove) + + # Remove attributes with disallowed URL values + for attr in (attr_names & self.attr_val_is_uri): + assert attr in attrs + # I don't have a clue where this regexp comes from or why it matches those + # characters, nor why we call unescape. I just know it's always been here. + # Should you be worried by this comment in a sanitizer? Yes. On the other hand, all + # this will do is remove *more* than it otherwise would. + val_unescaped = re.sub("[`\x00-\x20\x7f-\xa0\\s]+", '', + unescape(attrs[attr])).lower() + # remove replacement characters from unescaped characters + val_unescaped = val_unescaped.replace("\ufffd", "") + try: + uri = urlparse.urlparse(val_unescaped) + except ValueError: + uri = None + del attrs[attr] + if uri and uri.scheme: + if uri.scheme not in self.allowed_protocols: + del attrs[attr] + if uri.scheme == 'data': + m = data_content_type.match(uri.path) + if not m: + del attrs[attr] + elif m.group('content_type') not in self.allowed_content_types: + del attrs[attr] + + for attr in self.svg_attr_val_allows_ref: + if attr in attrs: + attrs[attr] = re.sub(r'url\s*\(\s*[^#\s][^)]+?\)', + ' ', + unescape(attrs[attr])) + if (token["name"] in self.svg_allow_local_href and + (namespaces['xlink'], 'href') in attrs and re.search(r'^\s*[^#\s].*', + attrs[(namespaces['xlink'], 'href')])): + del attrs[(namespaces['xlink'], 'href')] + if (None, 'style') in attrs: + attrs[(None, 'style')] = self.sanitize_css(attrs[(None, 'style')]) + token["data"] = attrs + return token + + def disallowed_token(self, token): + token_type = token["type"] + if token_type == "EndTag": + token["data"] = "" % token["name"] + elif token["data"]: + assert token_type in ("StartTag", "EmptyTag") + attrs = [] + for (ns, name), v in token["data"].items(): + attrs.append(' %s="%s"' % (name if ns is None else "%s:%s" % (prefixes[ns], name), escape(v))) + token["data"] = "<%s%s>" % (token["name"], ''.join(attrs)) + else: + token["data"] = "<%s>" % token["name"] + if token.get("selfClosing"): + token["data"] = token["data"][:-1] + "/>" + + token["type"] = "Characters" + + del token["name"] + return token + + def sanitize_css(self, style): + # disallow urls + style = re.compile(r'url\s*\(\s*[^\s)]+?\s*\)\s*').sub(' ', style) + + # gauntlet + if not re.match(r"""^([:,;#%.\sa-zA-Z0-9!]|\w-\w|'[\s\w]+'|"[\s\w]+"|\([\d,\s]+\))*$""", style): + return '' + if not re.match(r"^\s*([-\w]+\s*:[^:;]*(;\s*|$))*$", style): + return '' + + clean = [] + for prop, value in re.findall(r"([-\w]+)\s*:\s*([^:;]*)", style): + if not value: + continue + if prop.lower() in self.allowed_css_properties: + clean.append(prop + ': ' + value + ';') + elif prop.split('-')[0].lower() in ['background', 'border', 'margin', + 'padding']: + for keyword in value.split(): + if keyword not in self.allowed_css_keywords and \ + not re.match(r"^(#[0-9a-fA-F]+|rgb\(\d+%?,\d*%?,?\d*%?\)?|\d{0,2}\.?\d{0,2}(cm|em|ex|in|mm|pc|pt|px|%|,|\))?)$", keyword): # noqa + break + else: + clean.append(prop + ': ' + value + ';') + elif prop.lower() in self.allowed_svg_properties: + clean.append(prop + ': ' + value + ';') + + return ' '.join(clean) diff --git a/env/Lib/site-packages/pip/_vendor/html5lib/filters/whitespace.py b/env/Lib/site-packages/pip/_vendor/html5lib/filters/whitespace.py new file mode 100644 index 0000000..0d12584 --- /dev/null +++ b/env/Lib/site-packages/pip/_vendor/html5lib/filters/whitespace.py @@ -0,0 +1,38 @@ +from __future__ import absolute_import, division, unicode_literals + +import re + +from . import base +from ..constants import rcdataElements, spaceCharacters +spaceCharacters = "".join(spaceCharacters) + +SPACES_REGEX = re.compile("[%s]+" % spaceCharacters) + + +class Filter(base.Filter): + """Collapses whitespace except in pre, textarea, and script elements""" + spacePreserveElements = frozenset(["pre", "textarea"] + list(rcdataElements)) + + def __iter__(self): + preserve = 0 + for token in base.Filter.__iter__(self): + type = token["type"] + if type == "StartTag" \ + and (preserve or token["name"] in self.spacePreserveElements): + preserve += 1 + + elif type == "EndTag" and preserve: + preserve -= 1 + + elif not preserve and type == "SpaceCharacters" and token["data"]: + # Test on token["data"] above to not introduce spaces where there were not + token["data"] = " " + + elif not preserve and type == "Characters": + token["data"] = collapse_spaces(token["data"]) + + yield token + + +def collapse_spaces(text): + return SPACES_REGEX.sub(' ', text) diff --git a/env/Lib/site-packages/pip/_vendor/html5lib/html5parser.py b/env/Lib/site-packages/pip/_vendor/html5lib/html5parser.py new file mode 100644 index 0000000..ae41a13 --- /dev/null +++ b/env/Lib/site-packages/pip/_vendor/html5lib/html5parser.py @@ -0,0 +1,2791 @@ +from __future__ import absolute_import, division, unicode_literals +from pip._vendor.six import with_metaclass, viewkeys + +import types +from collections import OrderedDict + +from . import _inputstream +from . import _tokenizer + +from . import treebuilders +from .treebuilders.base import Marker + +from . import _utils +from .constants import ( + spaceCharacters, asciiUpper2Lower, + specialElements, headingElements, cdataElements, rcdataElements, + tokenTypes, tagTokenTypes, + namespaces, + htmlIntegrationPointElements, mathmlTextIntegrationPointElements, + adjustForeignAttributes as adjustForeignAttributesMap, + adjustMathMLAttributes, adjustSVGAttributes, + E, + _ReparseException +) + + +def parse(doc, treebuilder="etree", namespaceHTMLElements=True, **kwargs): + """Parse an HTML document as a string or file-like object into a tree + + :arg doc: the document to parse as a string or file-like object + + :arg treebuilder: the treebuilder to use when parsing + + :arg namespaceHTMLElements: whether or not to namespace HTML elements + + :returns: parsed tree + + Example: + + >>> from html5lib.html5parser import parse + >>> parse('

This is a doc

') + + + """ + tb = treebuilders.getTreeBuilder(treebuilder) + p = HTMLParser(tb, namespaceHTMLElements=namespaceHTMLElements) + return p.parse(doc, **kwargs) + + +def parseFragment(doc, container="div", treebuilder="etree", namespaceHTMLElements=True, **kwargs): + """Parse an HTML fragment as a string or file-like object into a tree + + :arg doc: the fragment to parse as a string or file-like object + + :arg container: the container context to parse the fragment in + + :arg treebuilder: the treebuilder to use when parsing + + :arg namespaceHTMLElements: whether or not to namespace HTML elements + + :returns: parsed tree + + Example: + + >>> from html5lib.html5libparser import parseFragment + >>> parseFragment('this is a fragment') + + + """ + tb = treebuilders.getTreeBuilder(treebuilder) + p = HTMLParser(tb, namespaceHTMLElements=namespaceHTMLElements) + return p.parseFragment(doc, container=container, **kwargs) + + +def method_decorator_metaclass(function): + class Decorated(type): + def __new__(meta, classname, bases, classDict): + for attributeName, attribute in classDict.items(): + if isinstance(attribute, types.FunctionType): + attribute = function(attribute) + + classDict[attributeName] = attribute + return type.__new__(meta, classname, bases, classDict) + return Decorated + + +class HTMLParser(object): + """HTML parser + + Generates a tree structure from a stream of (possibly malformed) HTML. + + """ + + def __init__(self, tree=None, strict=False, namespaceHTMLElements=True, debug=False): + """ + :arg tree: a treebuilder class controlling the type of tree that will be + returned. Built in treebuilders can be accessed through + html5lib.treebuilders.getTreeBuilder(treeType) + + :arg strict: raise an exception when a parse error is encountered + + :arg namespaceHTMLElements: whether or not to namespace HTML elements + + :arg debug: whether or not to enable debug mode which logs things + + Example: + + >>> from html5lib.html5parser import HTMLParser + >>> parser = HTMLParser() # generates parser with etree builder + >>> parser = HTMLParser('lxml', strict=True) # generates parser with lxml builder which is strict + + """ + + # Raise an exception on the first error encountered + self.strict = strict + + if tree is None: + tree = treebuilders.getTreeBuilder("etree") + self.tree = tree(namespaceHTMLElements) + self.errors = [] + + self.phases = dict([(name, cls(self, self.tree)) for name, cls in + getPhases(debug).items()]) + + def _parse(self, stream, innerHTML=False, container="div", scripting=False, **kwargs): + + self.innerHTMLMode = innerHTML + self.container = container + self.scripting = scripting + self.tokenizer = _tokenizer.HTMLTokenizer(stream, parser=self, **kwargs) + self.reset() + + try: + self.mainLoop() + except _ReparseException: + self.reset() + self.mainLoop() + + def reset(self): + self.tree.reset() + self.firstStartTag = False + self.errors = [] + self.log = [] # only used with debug mode + # "quirks" / "limited quirks" / "no quirks" + self.compatMode = "no quirks" + + if self.innerHTMLMode: + self.innerHTML = self.container.lower() + + if self.innerHTML in cdataElements: + self.tokenizer.state = self.tokenizer.rcdataState + elif self.innerHTML in rcdataElements: + self.tokenizer.state = self.tokenizer.rawtextState + elif self.innerHTML == 'plaintext': + self.tokenizer.state = self.tokenizer.plaintextState + else: + # state already is data state + # self.tokenizer.state = self.tokenizer.dataState + pass + self.phase = self.phases["beforeHtml"] + self.phase.insertHtmlElement() + self.resetInsertionMode() + else: + self.innerHTML = False # pylint:disable=redefined-variable-type + self.phase = self.phases["initial"] + + self.lastPhase = None + + self.beforeRCDataPhase = None + + self.framesetOK = True + + @property + def documentEncoding(self): + """Name of the character encoding that was used to decode the input stream, or + :obj:`None` if that is not determined yet + + """ + if not hasattr(self, 'tokenizer'): + return None + return self.tokenizer.stream.charEncoding[0].name + + def isHTMLIntegrationPoint(self, element): + if (element.name == "annotation-xml" and + element.namespace == namespaces["mathml"]): + return ("encoding" in element.attributes and + element.attributes["encoding"].translate( + asciiUpper2Lower) in + ("text/html", "application/xhtml+xml")) + else: + return (element.namespace, element.name) in htmlIntegrationPointElements + + def isMathMLTextIntegrationPoint(self, element): + return (element.namespace, element.name) in mathmlTextIntegrationPointElements + + def mainLoop(self): + CharactersToken = tokenTypes["Characters"] + SpaceCharactersToken = tokenTypes["SpaceCharacters"] + StartTagToken = tokenTypes["StartTag"] + EndTagToken = tokenTypes["EndTag"] + CommentToken = tokenTypes["Comment"] + DoctypeToken = tokenTypes["Doctype"] + ParseErrorToken = tokenTypes["ParseError"] + + for token in self.normalizedTokens(): + prev_token = None + new_token = token + while new_token is not None: + prev_token = new_token + currentNode = self.tree.openElements[-1] if self.tree.openElements else None + currentNodeNamespace = currentNode.namespace if currentNode else None + currentNodeName = currentNode.name if currentNode else None + + type = new_token["type"] + + if type == ParseErrorToken: + self.parseError(new_token["data"], new_token.get("datavars", {})) + new_token = None + else: + if (len(self.tree.openElements) == 0 or + currentNodeNamespace == self.tree.defaultNamespace or + (self.isMathMLTextIntegrationPoint(currentNode) and + ((type == StartTagToken and + token["name"] not in frozenset(["mglyph", "malignmark"])) or + type in (CharactersToken, SpaceCharactersToken))) or + (currentNodeNamespace == namespaces["mathml"] and + currentNodeName == "annotation-xml" and + type == StartTagToken and + token["name"] == "svg") or + (self.isHTMLIntegrationPoint(currentNode) and + type in (StartTagToken, CharactersToken, SpaceCharactersToken))): + phase = self.phase + else: + phase = self.phases["inForeignContent"] + + if type == CharactersToken: + new_token = phase.processCharacters(new_token) + elif type == SpaceCharactersToken: + new_token = phase.processSpaceCharacters(new_token) + elif type == StartTagToken: + new_token = phase.processStartTag(new_token) + elif type == EndTagToken: + new_token = phase.processEndTag(new_token) + elif type == CommentToken: + new_token = phase.processComment(new_token) + elif type == DoctypeToken: + new_token = phase.processDoctype(new_token) + + if (type == StartTagToken and prev_token["selfClosing"] and + not prev_token["selfClosingAcknowledged"]): + self.parseError("non-void-element-with-trailing-solidus", + {"name": prev_token["name"]}) + + # When the loop finishes it's EOF + reprocess = True + phases = [] + while reprocess: + phases.append(self.phase) + reprocess = self.phase.processEOF() + if reprocess: + assert self.phase not in phases + + def normalizedTokens(self): + for token in self.tokenizer: + yield self.normalizeToken(token) + + def parse(self, stream, *args, **kwargs): + """Parse a HTML document into a well-formed tree + + :arg stream: a file-like object or string containing the HTML to be parsed + + The optional encoding parameter must be a string that indicates + the encoding. If specified, that encoding will be used, + regardless of any BOM or later declaration (such as in a meta + element). + + :arg scripting: treat noscript elements as if JavaScript was turned on + + :returns: parsed tree + + Example: + + >>> from html5lib.html5parser import HTMLParser + >>> parser = HTMLParser() + >>> parser.parse('

This is a doc

') + + + """ + self._parse(stream, False, None, *args, **kwargs) + return self.tree.getDocument() + + def parseFragment(self, stream, *args, **kwargs): + """Parse a HTML fragment into a well-formed tree fragment + + :arg container: name of the element we're setting the innerHTML + property if set to None, default to 'div' + + :arg stream: a file-like object or string containing the HTML to be parsed + + The optional encoding parameter must be a string that indicates + the encoding. If specified, that encoding will be used, + regardless of any BOM or later declaration (such as in a meta + element) + + :arg scripting: treat noscript elements as if JavaScript was turned on + + :returns: parsed tree + + Example: + + >>> from html5lib.html5libparser import HTMLParser + >>> parser = HTMLParser() + >>> parser.parseFragment('this is a fragment') + + + """ + self._parse(stream, True, *args, **kwargs) + return self.tree.getFragment() + + def parseError(self, errorcode="XXX-undefined-error", datavars=None): + # XXX The idea is to make errorcode mandatory. + if datavars is None: + datavars = {} + self.errors.append((self.tokenizer.stream.position(), errorcode, datavars)) + if self.strict: + raise ParseError(E[errorcode] % datavars) + + def normalizeToken(self, token): + # HTML5 specific normalizations to the token stream + if token["type"] == tokenTypes["StartTag"]: + raw = token["data"] + token["data"] = OrderedDict(raw) + if len(raw) > len(token["data"]): + # we had some duplicated attribute, fix so first wins + token["data"].update(raw[::-1]) + + return token + + def adjustMathMLAttributes(self, token): + adjust_attributes(token, adjustMathMLAttributes) + + def adjustSVGAttributes(self, token): + adjust_attributes(token, adjustSVGAttributes) + + def adjustForeignAttributes(self, token): + adjust_attributes(token, adjustForeignAttributesMap) + + def reparseTokenNormal(self, token): + # pylint:disable=unused-argument + self.parser.phase() + + def resetInsertionMode(self): + # The name of this method is mostly historical. (It's also used in the + # specification.) + last = False + newModes = { + "select": "inSelect", + "td": "inCell", + "th": "inCell", + "tr": "inRow", + "tbody": "inTableBody", + "thead": "inTableBody", + "tfoot": "inTableBody", + "caption": "inCaption", + "colgroup": "inColumnGroup", + "table": "inTable", + "head": "inBody", + "body": "inBody", + "frameset": "inFrameset", + "html": "beforeHead" + } + for node in self.tree.openElements[::-1]: + nodeName = node.name + new_phase = None + if node == self.tree.openElements[0]: + assert self.innerHTML + last = True + nodeName = self.innerHTML + # Check for conditions that should only happen in the innerHTML + # case + if nodeName in ("select", "colgroup", "head", "html"): + assert self.innerHTML + + if not last and node.namespace != self.tree.defaultNamespace: + continue + + if nodeName in newModes: + new_phase = self.phases[newModes[nodeName]] + break + elif last: + new_phase = self.phases["inBody"] + break + + self.phase = new_phase + + def parseRCDataRawtext(self, token, contentType): + # Generic RCDATA/RAWTEXT Parsing algorithm + assert contentType in ("RAWTEXT", "RCDATA") + + self.tree.insertElement(token) + + if contentType == "RAWTEXT": + self.tokenizer.state = self.tokenizer.rawtextState + else: + self.tokenizer.state = self.tokenizer.rcdataState + + self.originalPhase = self.phase + + self.phase = self.phases["text"] + + +@_utils.memoize +def getPhases(debug): + def log(function): + """Logger that records which phase processes each token""" + type_names = dict((value, key) for key, value in + tokenTypes.items()) + + def wrapped(self, *args, **kwargs): + if function.__name__.startswith("process") and len(args) > 0: + token = args[0] + try: + info = {"type": type_names[token['type']]} + except: + raise + if token['type'] in tagTokenTypes: + info["name"] = token['name'] + + self.parser.log.append((self.parser.tokenizer.state.__name__, + self.parser.phase.__class__.__name__, + self.__class__.__name__, + function.__name__, + info)) + return function(self, *args, **kwargs) + else: + return function(self, *args, **kwargs) + return wrapped + + def getMetaclass(use_metaclass, metaclass_func): + if use_metaclass: + return method_decorator_metaclass(metaclass_func) + else: + return type + + # pylint:disable=unused-argument + class Phase(with_metaclass(getMetaclass(debug, log))): + """Base class for helper object that implements each phase of processing + """ + + def __init__(self, parser, tree): + self.parser = parser + self.tree = tree + + def processEOF(self): + raise NotImplementedError + + def processComment(self, token): + # For most phases the following is correct. Where it's not it will be + # overridden. + self.tree.insertComment(token, self.tree.openElements[-1]) + + def processDoctype(self, token): + self.parser.parseError("unexpected-doctype") + + def processCharacters(self, token): + self.tree.insertText(token["data"]) + + def processSpaceCharacters(self, token): + self.tree.insertText(token["data"]) + + def processStartTag(self, token): + return self.startTagHandler[token["name"]](token) + + def startTagHtml(self, token): + if not self.parser.firstStartTag and token["name"] == "html": + self.parser.parseError("non-html-root") + # XXX Need a check here to see if the first start tag token emitted is + # this token... If it's not, invoke self.parser.parseError(). + for attr, value in token["data"].items(): + if attr not in self.tree.openElements[0].attributes: + self.tree.openElements[0].attributes[attr] = value + self.parser.firstStartTag = False + + def processEndTag(self, token): + return self.endTagHandler[token["name"]](token) + + class InitialPhase(Phase): + def processSpaceCharacters(self, token): + pass + + def processComment(self, token): + self.tree.insertComment(token, self.tree.document) + + def processDoctype(self, token): + name = token["name"] + publicId = token["publicId"] + systemId = token["systemId"] + correct = token["correct"] + + if (name != "html" or publicId is not None or + systemId is not None and systemId != "about:legacy-compat"): + self.parser.parseError("unknown-doctype") + + if publicId is None: + publicId = "" + + self.tree.insertDoctype(token) + + if publicId != "": + publicId = publicId.translate(asciiUpper2Lower) + + if (not correct or token["name"] != "html" or + publicId.startswith( + ("+//silmaril//dtd html pro v0r11 19970101//", + "-//advasoft ltd//dtd html 3.0 aswedit + extensions//", + "-//as//dtd html 3.0 aswedit + extensions//", + "-//ietf//dtd html 2.0 level 1//", + "-//ietf//dtd html 2.0 level 2//", + "-//ietf//dtd html 2.0 strict level 1//", + "-//ietf//dtd html 2.0 strict level 2//", + "-//ietf//dtd html 2.0 strict//", + "-//ietf//dtd html 2.0//", + "-//ietf//dtd html 2.1e//", + "-//ietf//dtd html 3.0//", + "-//ietf//dtd html 3.2 final//", + "-//ietf//dtd html 3.2//", + "-//ietf//dtd html 3//", + "-//ietf//dtd html level 0//", + "-//ietf//dtd html level 1//", + "-//ietf//dtd html level 2//", + "-//ietf//dtd html level 3//", + "-//ietf//dtd html strict level 0//", + "-//ietf//dtd html strict level 1//", + "-//ietf//dtd html strict level 2//", + "-//ietf//dtd html strict level 3//", + "-//ietf//dtd html strict//", + "-//ietf//dtd html//", + "-//metrius//dtd metrius presentational//", + "-//microsoft//dtd internet explorer 2.0 html strict//", + "-//microsoft//dtd internet explorer 2.0 html//", + "-//microsoft//dtd internet explorer 2.0 tables//", + "-//microsoft//dtd internet explorer 3.0 html strict//", + "-//microsoft//dtd internet explorer 3.0 html//", + "-//microsoft//dtd internet explorer 3.0 tables//", + "-//netscape comm. corp.//dtd html//", + "-//netscape comm. corp.//dtd strict html//", + "-//o'reilly and associates//dtd html 2.0//", + "-//o'reilly and associates//dtd html extended 1.0//", + "-//o'reilly and associates//dtd html extended relaxed 1.0//", + "-//softquad software//dtd hotmetal pro 6.0::19990601::extensions to html 4.0//", + "-//softquad//dtd hotmetal pro 4.0::19971010::extensions to html 4.0//", + "-//spyglass//dtd html 2.0 extended//", + "-//sq//dtd html 2.0 hotmetal + extensions//", + "-//sun microsystems corp.//dtd hotjava html//", + "-//sun microsystems corp.//dtd hotjava strict html//", + "-//w3c//dtd html 3 1995-03-24//", + "-//w3c//dtd html 3.2 draft//", + "-//w3c//dtd html 3.2 final//", + "-//w3c//dtd html 3.2//", + "-//w3c//dtd html 3.2s draft//", + "-//w3c//dtd html 4.0 frameset//", + "-//w3c//dtd html 4.0 transitional//", + "-//w3c//dtd html experimental 19960712//", + "-//w3c//dtd html experimental 970421//", + "-//w3c//dtd w3 html//", + "-//w3o//dtd w3 html 3.0//", + "-//webtechs//dtd mozilla html 2.0//", + "-//webtechs//dtd mozilla html//")) or + publicId in ("-//w3o//dtd w3 html strict 3.0//en//", + "-/w3c/dtd html 4.0 transitional/en", + "html") or + publicId.startswith( + ("-//w3c//dtd html 4.01 frameset//", + "-//w3c//dtd html 4.01 transitional//")) and + systemId is None or + systemId and systemId.lower() == "http://www.ibm.com/data/dtd/v11/ibmxhtml1-transitional.dtd"): + self.parser.compatMode = "quirks" + elif (publicId.startswith( + ("-//w3c//dtd xhtml 1.0 frameset//", + "-//w3c//dtd xhtml 1.0 transitional//")) or + publicId.startswith( + ("-//w3c//dtd html 4.01 frameset//", + "-//w3c//dtd html 4.01 transitional//")) and + systemId is not None): + self.parser.compatMode = "limited quirks" + + self.parser.phase = self.parser.phases["beforeHtml"] + + def anythingElse(self): + self.parser.compatMode = "quirks" + self.parser.phase = self.parser.phases["beforeHtml"] + + def processCharacters(self, token): + self.parser.parseError("expected-doctype-but-got-chars") + self.anythingElse() + return token + + def processStartTag(self, token): + self.parser.parseError("expected-doctype-but-got-start-tag", + {"name": token["name"]}) + self.anythingElse() + return token + + def processEndTag(self, token): + self.parser.parseError("expected-doctype-but-got-end-tag", + {"name": token["name"]}) + self.anythingElse() + return token + + def processEOF(self): + self.parser.parseError("expected-doctype-but-got-eof") + self.anythingElse() + return True + + class BeforeHtmlPhase(Phase): + # helper methods + def insertHtmlElement(self): + self.tree.insertRoot(impliedTagToken("html", "StartTag")) + self.parser.phase = self.parser.phases["beforeHead"] + + # other + def processEOF(self): + self.insertHtmlElement() + return True + + def processComment(self, token): + self.tree.insertComment(token, self.tree.document) + + def processSpaceCharacters(self, token): + pass + + def processCharacters(self, token): + self.insertHtmlElement() + return token + + def processStartTag(self, token): + if token["name"] == "html": + self.parser.firstStartTag = True + self.insertHtmlElement() + return token + + def processEndTag(self, token): + if token["name"] not in ("head", "body", "html", "br"): + self.parser.parseError("unexpected-end-tag-before-html", + {"name": token["name"]}) + else: + self.insertHtmlElement() + return token + + class BeforeHeadPhase(Phase): + def __init__(self, parser, tree): + Phase.__init__(self, parser, tree) + + self.startTagHandler = _utils.MethodDispatcher([ + ("html", self.startTagHtml), + ("head", self.startTagHead) + ]) + self.startTagHandler.default = self.startTagOther + + self.endTagHandler = _utils.MethodDispatcher([ + (("head", "body", "html", "br"), self.endTagImplyHead) + ]) + self.endTagHandler.default = self.endTagOther + + def processEOF(self): + self.startTagHead(impliedTagToken("head", "StartTag")) + return True + + def processSpaceCharacters(self, token): + pass + + def processCharacters(self, token): + self.startTagHead(impliedTagToken("head", "StartTag")) + return token + + def startTagHtml(self, token): + return self.parser.phases["inBody"].processStartTag(token) + + def startTagHead(self, token): + self.tree.insertElement(token) + self.tree.headPointer = self.tree.openElements[-1] + self.parser.phase = self.parser.phases["inHead"] + + def startTagOther(self, token): + self.startTagHead(impliedTagToken("head", "StartTag")) + return token + + def endTagImplyHead(self, token): + self.startTagHead(impliedTagToken("head", "StartTag")) + return token + + def endTagOther(self, token): + self.parser.parseError("end-tag-after-implied-root", + {"name": token["name"]}) + + class InHeadPhase(Phase): + def __init__(self, parser, tree): + Phase.__init__(self, parser, tree) + + self.startTagHandler = _utils.MethodDispatcher([ + ("html", self.startTagHtml), + ("title", self.startTagTitle), + (("noframes", "style"), self.startTagNoFramesStyle), + ("noscript", self.startTagNoscript), + ("script", self.startTagScript), + (("base", "basefont", "bgsound", "command", "link"), + self.startTagBaseLinkCommand), + ("meta", self.startTagMeta), + ("head", self.startTagHead) + ]) + self.startTagHandler.default = self.startTagOther + + self.endTagHandler = _utils.MethodDispatcher([ + ("head", self.endTagHead), + (("br", "html", "body"), self.endTagHtmlBodyBr) + ]) + self.endTagHandler.default = self.endTagOther + + # the real thing + def processEOF(self): + self.anythingElse() + return True + + def processCharacters(self, token): + self.anythingElse() + return token + + def startTagHtml(self, token): + return self.parser.phases["inBody"].processStartTag(token) + + def startTagHead(self, token): + self.parser.parseError("two-heads-are-not-better-than-one") + + def startTagBaseLinkCommand(self, token): + self.tree.insertElement(token) + self.tree.openElements.pop() + token["selfClosingAcknowledged"] = True + + def startTagMeta(self, token): + self.tree.insertElement(token) + self.tree.openElements.pop() + token["selfClosingAcknowledged"] = True + + attributes = token["data"] + if self.parser.tokenizer.stream.charEncoding[1] == "tentative": + if "charset" in attributes: + self.parser.tokenizer.stream.changeEncoding(attributes["charset"]) + elif ("content" in attributes and + "http-equiv" in attributes and + attributes["http-equiv"].lower() == "content-type"): + # Encoding it as UTF-8 here is a hack, as really we should pass + # the abstract Unicode string, and just use the + # ContentAttrParser on that, but using UTF-8 allows all chars + # to be encoded and as a ASCII-superset works. + data = _inputstream.EncodingBytes(attributes["content"].encode("utf-8")) + parser = _inputstream.ContentAttrParser(data) + codec = parser.parse() + self.parser.tokenizer.stream.changeEncoding(codec) + + def startTagTitle(self, token): + self.parser.parseRCDataRawtext(token, "RCDATA") + + def startTagNoFramesStyle(self, token): + # Need to decide whether to implement the scripting-disabled case + self.parser.parseRCDataRawtext(token, "RAWTEXT") + + def startTagNoscript(self, token): + if self.parser.scripting: + self.parser.parseRCDataRawtext(token, "RAWTEXT") + else: + self.tree.insertElement(token) + self.parser.phase = self.parser.phases["inHeadNoscript"] + + def startTagScript(self, token): + self.tree.insertElement(token) + self.parser.tokenizer.state = self.parser.tokenizer.scriptDataState + self.parser.originalPhase = self.parser.phase + self.parser.phase = self.parser.phases["text"] + + def startTagOther(self, token): + self.anythingElse() + return token + + def endTagHead(self, token): + node = self.parser.tree.openElements.pop() + assert node.name == "head", "Expected head got %s" % node.name + self.parser.phase = self.parser.phases["afterHead"] + + def endTagHtmlBodyBr(self, token): + self.anythingElse() + return token + + def endTagOther(self, token): + self.parser.parseError("unexpected-end-tag", {"name": token["name"]}) + + def anythingElse(self): + self.endTagHead(impliedTagToken("head")) + + class InHeadNoscriptPhase(Phase): + def __init__(self, parser, tree): + Phase.__init__(self, parser, tree) + + self.startTagHandler = _utils.MethodDispatcher([ + ("html", self.startTagHtml), + (("basefont", "bgsound", "link", "meta", "noframes", "style"), self.startTagBaseLinkCommand), + (("head", "noscript"), self.startTagHeadNoscript), + ]) + self.startTagHandler.default = self.startTagOther + + self.endTagHandler = _utils.MethodDispatcher([ + ("noscript", self.endTagNoscript), + ("br", self.endTagBr), + ]) + self.endTagHandler.default = self.endTagOther + + def processEOF(self): + self.parser.parseError("eof-in-head-noscript") + self.anythingElse() + return True + + def processComment(self, token): + return self.parser.phases["inHead"].processComment(token) + + def processCharacters(self, token): + self.parser.parseError("char-in-head-noscript") + self.anythingElse() + return token + + def processSpaceCharacters(self, token): + return self.parser.phases["inHead"].processSpaceCharacters(token) + + def startTagHtml(self, token): + return self.parser.phases["inBody"].processStartTag(token) + + def startTagBaseLinkCommand(self, token): + return self.parser.phases["inHead"].processStartTag(token) + + def startTagHeadNoscript(self, token): + self.parser.parseError("unexpected-start-tag", {"name": token["name"]}) + + def startTagOther(self, token): + self.parser.parseError("unexpected-inhead-noscript-tag", {"name": token["name"]}) + self.anythingElse() + return token + + def endTagNoscript(self, token): + node = self.parser.tree.openElements.pop() + assert node.name == "noscript", "Expected noscript got %s" % node.name + self.parser.phase = self.parser.phases["inHead"] + + def endTagBr(self, token): + self.parser.parseError("unexpected-inhead-noscript-tag", {"name": token["name"]}) + self.anythingElse() + return token + + def endTagOther(self, token): + self.parser.parseError("unexpected-end-tag", {"name": token["name"]}) + + def anythingElse(self): + # Caller must raise parse error first! + self.endTagNoscript(impliedTagToken("noscript")) + + class AfterHeadPhase(Phase): + def __init__(self, parser, tree): + Phase.__init__(self, parser, tree) + + self.startTagHandler = _utils.MethodDispatcher([ + ("html", self.startTagHtml), + ("body", self.startTagBody), + ("frameset", self.startTagFrameset), + (("base", "basefont", "bgsound", "link", "meta", "noframes", "script", + "style", "title"), + self.startTagFromHead), + ("head", self.startTagHead) + ]) + self.startTagHandler.default = self.startTagOther + self.endTagHandler = _utils.MethodDispatcher([(("body", "html", "br"), + self.endTagHtmlBodyBr)]) + self.endTagHandler.default = self.endTagOther + + def processEOF(self): + self.anythingElse() + return True + + def processCharacters(self, token): + self.anythingElse() + return token + + def startTagHtml(self, token): + return self.parser.phases["inBody"].processStartTag(token) + + def startTagBody(self, token): + self.parser.framesetOK = False + self.tree.insertElement(token) + self.parser.phase = self.parser.phases["inBody"] + + def startTagFrameset(self, token): + self.tree.insertElement(token) + self.parser.phase = self.parser.phases["inFrameset"] + + def startTagFromHead(self, token): + self.parser.parseError("unexpected-start-tag-out-of-my-head", + {"name": token["name"]}) + self.tree.openElements.append(self.tree.headPointer) + self.parser.phases["inHead"].processStartTag(token) + for node in self.tree.openElements[::-1]: + if node.name == "head": + self.tree.openElements.remove(node) + break + + def startTagHead(self, token): + self.parser.parseError("unexpected-start-tag", {"name": token["name"]}) + + def startTagOther(self, token): + self.anythingElse() + return token + + def endTagHtmlBodyBr(self, token): + self.anythingElse() + return token + + def endTagOther(self, token): + self.parser.parseError("unexpected-end-tag", {"name": token["name"]}) + + def anythingElse(self): + self.tree.insertElement(impliedTagToken("body", "StartTag")) + self.parser.phase = self.parser.phases["inBody"] + self.parser.framesetOK = True + + class InBodyPhase(Phase): + # http://www.whatwg.org/specs/web-apps/current-work/#parsing-main-inbody + # the really-really-really-very crazy mode + def __init__(self, parser, tree): + Phase.__init__(self, parser, tree) + + # Set this to the default handler + self.processSpaceCharacters = self.processSpaceCharactersNonPre + + self.startTagHandler = _utils.MethodDispatcher([ + ("html", self.startTagHtml), + (("base", "basefont", "bgsound", "command", "link", "meta", + "script", "style", "title"), + self.startTagProcessInHead), + ("body", self.startTagBody), + ("frameset", self.startTagFrameset), + (("address", "article", "aside", "blockquote", "center", "details", + "dir", "div", "dl", "fieldset", "figcaption", "figure", + "footer", "header", "hgroup", "main", "menu", "nav", "ol", "p", + "section", "summary", "ul"), + self.startTagCloseP), + (headingElements, self.startTagHeading), + (("pre", "listing"), self.startTagPreListing), + ("form", self.startTagForm), + (("li", "dd", "dt"), self.startTagListItem), + ("plaintext", self.startTagPlaintext), + ("a", self.startTagA), + (("b", "big", "code", "em", "font", "i", "s", "small", "strike", + "strong", "tt", "u"), self.startTagFormatting), + ("nobr", self.startTagNobr), + ("button", self.startTagButton), + (("applet", "marquee", "object"), self.startTagAppletMarqueeObject), + ("xmp", self.startTagXmp), + ("table", self.startTagTable), + (("area", "br", "embed", "img", "keygen", "wbr"), + self.startTagVoidFormatting), + (("param", "source", "track"), self.startTagParamSource), + ("input", self.startTagInput), + ("hr", self.startTagHr), + ("image", self.startTagImage), + ("isindex", self.startTagIsIndex), + ("textarea", self.startTagTextarea), + ("iframe", self.startTagIFrame), + ("noscript", self.startTagNoscript), + (("noembed", "noframes"), self.startTagRawtext), + ("select", self.startTagSelect), + (("rp", "rt"), self.startTagRpRt), + (("option", "optgroup"), self.startTagOpt), + (("math"), self.startTagMath), + (("svg"), self.startTagSvg), + (("caption", "col", "colgroup", "frame", "head", + "tbody", "td", "tfoot", "th", "thead", + "tr"), self.startTagMisplaced) + ]) + self.startTagHandler.default = self.startTagOther + + self.endTagHandler = _utils.MethodDispatcher([ + ("body", self.endTagBody), + ("html", self.endTagHtml), + (("address", "article", "aside", "blockquote", "button", "center", + "details", "dialog", "dir", "div", "dl", "fieldset", "figcaption", "figure", + "footer", "header", "hgroup", "listing", "main", "menu", "nav", "ol", "pre", + "section", "summary", "ul"), self.endTagBlock), + ("form", self.endTagForm), + ("p", self.endTagP), + (("dd", "dt", "li"), self.endTagListItem), + (headingElements, self.endTagHeading), + (("a", "b", "big", "code", "em", "font", "i", "nobr", "s", "small", + "strike", "strong", "tt", "u"), self.endTagFormatting), + (("applet", "marquee", "object"), self.endTagAppletMarqueeObject), + ("br", self.endTagBr), + ]) + self.endTagHandler.default = self.endTagOther + + def isMatchingFormattingElement(self, node1, node2): + return (node1.name == node2.name and + node1.namespace == node2.namespace and + node1.attributes == node2.attributes) + + # helper + def addFormattingElement(self, token): + self.tree.insertElement(token) + element = self.tree.openElements[-1] + + matchingElements = [] + for node in self.tree.activeFormattingElements[::-1]: + if node is Marker: + break + elif self.isMatchingFormattingElement(node, element): + matchingElements.append(node) + + assert len(matchingElements) <= 3 + if len(matchingElements) == 3: + self.tree.activeFormattingElements.remove(matchingElements[-1]) + self.tree.activeFormattingElements.append(element) + + # the real deal + def processEOF(self): + allowed_elements = frozenset(("dd", "dt", "li", "p", "tbody", "td", + "tfoot", "th", "thead", "tr", "body", + "html")) + for node in self.tree.openElements[::-1]: + if node.name not in allowed_elements: + self.parser.parseError("expected-closing-tag-but-got-eof") + break + # Stop parsing + + def processSpaceCharactersDropNewline(self, token): + # Sometimes (start of
, , and ",y.noCloneChecked=!!me.cloneNode(!0).lastChild.defaultValue;var Te=/^key/,Ce=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,Ee=/^([^.]*)(?:\.(.+)|)/;function ke(){return!0}function Se(){return!1}function Ne(e,t){return e===function(){try{return E.activeElement}catch(e){}}()==("focus"===t)}function Ae(e,t,n,r,i,o){var a,s;if("object"==typeof t){for(s in"string"!=typeof n&&(r=r||n,n=void 0),t)Ae(e,s,n,r,t[s],o);return e}if(null==r&&null==i?(i=n,r=n=void 0):null==i&&("string"==typeof n?(i=r,r=void 0):(i=r,r=n,n=void 0)),!1===i)i=Se;else if(!i)return e;return 1===o&&(a=i,(i=function(e){return k().off(e),a.apply(this,arguments)}).guid=a.guid||(a.guid=k.guid++)),e.each(function(){k.event.add(this,t,i,r,n)})}function De(e,i,o){o?(Q.set(e,i,!1),k.event.add(e,i,{namespace:!1,handler:function(e){var t,n,r=Q.get(this,i);if(1&e.isTrigger&&this[i]){if(r.length)(k.event.special[i]||{}).delegateType&&e.stopPropagation();else if(r=s.call(arguments),Q.set(this,i,r),t=o(this,i),this[i](),r!==(n=Q.get(this,i))||t?Q.set(this,i,!1):n={},r!==n)return e.stopImmediatePropagation(),e.preventDefault(),n.value}else r.length&&(Q.set(this,i,{value:k.event.trigger(k.extend(r[0],k.Event.prototype),r.slice(1),this)}),e.stopImmediatePropagation())}})):void 0===Q.get(e,i)&&k.event.add(e,i,ke)}k.event={global:{},add:function(t,e,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=Q.get(t);if(v){n.handler&&(n=(o=n).handler,i=o.selector),i&&k.find.matchesSelector(ie,i),n.guid||(n.guid=k.guid++),(u=v.events)||(u=v.events={}),(a=v.handle)||(a=v.handle=function(e){return"undefined"!=typeof k&&k.event.triggered!==e.type?k.event.dispatch.apply(t,arguments):void 0}),l=(e=(e||"").match(R)||[""]).length;while(l--)d=g=(s=Ee.exec(e[l])||[])[1],h=(s[2]||"").split(".").sort(),d&&(f=k.event.special[d]||{},d=(i?f.delegateType:f.bindType)||d,f=k.event.special[d]||{},c=k.extend({type:d,origType:g,data:r,handler:n,guid:n.guid,selector:i,needsContext:i&&k.expr.match.needsContext.test(i),namespace:h.join(".")},o),(p=u[d])||((p=u[d]=[]).delegateCount=0,f.setup&&!1!==f.setup.call(t,r,h,a)||t.addEventListener&&t.addEventListener(d,a)),f.add&&(f.add.call(t,c),c.handler.guid||(c.handler.guid=n.guid)),i?p.splice(p.delegateCount++,0,c):p.push(c),k.event.global[d]=!0)}},remove:function(e,t,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=Q.hasData(e)&&Q.get(e);if(v&&(u=v.events)){l=(t=(t||"").match(R)||[""]).length;while(l--)if(d=g=(s=Ee.exec(t[l])||[])[1],h=(s[2]||"").split(".").sort(),d){f=k.event.special[d]||{},p=u[d=(r?f.delegateType:f.bindType)||d]||[],s=s[2]&&new RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"),a=o=p.length;while(o--)c=p[o],!i&&g!==c.origType||n&&n.guid!==c.guid||s&&!s.test(c.namespace)||r&&r!==c.selector&&("**"!==r||!c.selector)||(p.splice(o,1),c.selector&&p.delegateCount--,f.remove&&f.remove.call(e,c));a&&!p.length&&(f.teardown&&!1!==f.teardown.call(e,h,v.handle)||k.removeEvent(e,d,v.handle),delete u[d])}else for(d in u)k.event.remove(e,d+t[l],n,r,!0);k.isEmptyObject(u)&&Q.remove(e,"handle events")}},dispatch:function(e){var t,n,r,i,o,a,s=k.event.fix(e),u=new Array(arguments.length),l=(Q.get(this,"events")||{})[s.type]||[],c=k.event.special[s.type]||{};for(u[0]=s,t=1;t\x20\t\r\n\f]*)[^>]*)\/>/gi,qe=/\s*$/g;function Oe(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&k(e).children("tbody")[0]||e}function Pe(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function Re(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Me(e,t){var n,r,i,o,a,s,u,l;if(1===t.nodeType){if(Q.hasData(e)&&(o=Q.access(e),a=Q.set(t,o),l=o.events))for(i in delete a.handle,a.events={},l)for(n=0,r=l[i].length;n")},clone:function(e,t,n){var r,i,o,a,s,u,l,c=e.cloneNode(!0),f=oe(e);if(!(y.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||k.isXMLDoc(e)))for(a=ve(c),r=0,i=(o=ve(e)).length;r").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),E.head.appendChild(r[0])},abort:function(){i&&i()}}});var Vt,Gt=[],Yt=/(=)\?(?=&|$)|\?\?/;k.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=Gt.pop()||k.expando+"_"+kt++;return this[e]=!0,e}}),k.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Yt.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Yt.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=m(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Yt,"$1"+r):!1!==e.jsonp&&(e.url+=(St.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||k.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=C[r],C[r]=function(){o=arguments},n.always(function(){void 0===i?k(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,Gt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((Vt=E.implementation.createHTMLDocument("").body).innerHTML="
",2===Vt.childNodes.length),k.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(y.createHTMLDocument?((r=(t=E.implementation.createHTMLDocument("")).createElement("base")).href=E.location.href,t.head.appendChild(r)):t=E),o=!n&&[],(i=D.exec(e))?[t.createElement(i[1])]:(i=we([e],t,o),o&&o.length&&k(o).remove(),k.merge([],i.childNodes)));var r,i,o},k.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(k.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},k.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){k.fn[t]=function(e){return this.on(t,e)}}),k.expr.pseudos.animated=function(t){return k.grep(k.timers,function(e){return t===e.elem}).length},k.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=k.css(e,"position"),c=k(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=k.css(e,"top"),u=k.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),m(t)&&(t=t.call(e,n,k.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):c.css(f)}},k.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){k.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===k.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===k.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=k(e).offset()).top+=k.css(e,"borderTopWidth",!0),i.left+=k.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-k.css(r,"marginTop",!0),left:t.left-i.left-k.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===k.css(e,"position"))e=e.offsetParent;return e||ie})}}),k.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;k.fn[t]=function(e){return _(this,function(e,t,n){var r;if(x(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),k.each(["top","left"],function(e,n){k.cssHooks[n]=ze(y.pixelPosition,function(e,t){if(t)return t=_e(e,n),$e.test(t)?k(e).position()[n]+"px":t})}),k.each({Height:"height",Width:"width"},function(a,s){k.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){k.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return _(this,function(e,t,n){var r;return x(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?k.css(e,t,i):k.style(e,t,n,i)},s,n?e:void 0,n)}})}),k.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){k.fn[n]=function(e,t){return 0gTe~DWM4fkj^!0 literal 0 HcmV?d00001 diff --git a/env/Lib/site-packages/werkzeug/debug/shared/more.png b/env/Lib/site-packages/werkzeug/debug/shared/more.png new file mode 100644 index 0000000000000000000000000000000000000000..804fa226fe3ed9e6cc2bd044a848f33a2d7b4e4f GIT binary patch literal 200 zcmeAS@N?(olHy`uVBq!ia0vp^+#t-s1|(OmDOUqhjKx9jP7LeL$-D$|*pj^6T^Rm@ z;DWu&Cj&(|3p^r=fm(z?n2}-D90{Nxdx@v7EBg&5DRB)3hmHb?jr_0{K>_1cC{J-%1r lr(<|}#G9!1a#KtW>0AF44oJ8ZkqR`E!PC{xWt~$(698mrJ|X}B literal 0 HcmV?d00001 diff --git a/env/Lib/site-packages/werkzeug/debug/shared/source.png b/env/Lib/site-packages/werkzeug/debug/shared/source.png new file mode 100644 index 0000000000000000000000000000000000000000..f7ea90419d950f9e69d977a1f5847456d96a5f0b GIT binary patch literal 818 zcmV-21I_%2P)@LCln44|RX7Ti z0HI3&7jPq){odH{?_{%nYVq_;n_c4WbUpvU(&Cvnj!vq|kVC-vpF6vp^;;e0mm6HW z+WPzA`AZ|;pPp$&dNjzrc??4rt`k%Q1l*u-BPD0MQ}Fbm8jnsyezNt7+u{23>t7Em zJtETY?ja9KrVs^!LJ$xEMF3-bAZO;-IQJavE60KA7fO$VY_%N)R6s>g5mW>fL4&aR z*EVgKKTBXm!=L?S0?xM zYqL@C$|EDF2q*3zWW7;PDZ}SK*IE8;i!3U62=qn80C&*I1Le7WwNP5EcX;_oh2dJn zf#HgBe4@r$GcjHjmj2vAfT%(YN?}kK=(*+1*DkNNc1H5R++vfBMhACi<5uFUU+N4+ z<&U*CPmWi}REa7C6-t>2im1CWv5Jkefxa6>)dEj-CAW wWa{_}BJ!}~75?MkfaCnj>Dn=~vkLS70Pk`;z)@TQj{pDw07*qoM6N<$f@imYHUIzs literal 0 HcmV?d00001 diff --git a/env/Lib/site-packages/werkzeug/debug/shared/style.css b/env/Lib/site-packages/werkzeug/debug/shared/style.css new file mode 100644 index 0000000..107863e --- /dev/null +++ b/env/Lib/site-packages/werkzeug/debug/shared/style.css @@ -0,0 +1,154 @@ +@font-face { + font-family: 'Ubuntu'; + font-style: normal; + font-weight: normal; + src: local('Ubuntu'), local('Ubuntu-Regular'), + url('?__debugger__=yes&cmd=resource&f=ubuntu.ttf') format('truetype'); +} + +body, input { font-family: 'Lucida Grande', 'Lucida Sans Unicode', 'Geneva', + 'Verdana', sans-serif; color: #000; text-align: center; + margin: 1em; padding: 0; font-size: 15px; } +h1, h2, h3 { font-family: 'Ubuntu', 'Lucida Grande', 'Lucida Sans Unicode', + 'Geneva', 'Verdana', sans-serif; font-weight: normal; } + +input { background-color: #fff; margin: 0; text-align: left; + outline: none !important; } +input[type="submit"] { padding: 3px 6px; } +a { color: #11557C; } +a:hover { color: #177199; } +pre, code, +textarea { font-family: 'Consolas', 'Monaco', 'Bitstream Vera Sans Mono', + monospace; font-size: 14px; } + +div.debugger { text-align: left; padding: 12px; margin: auto; + background-color: white; } +h1 { font-size: 36px; margin: 0 0 0.3em 0; } +div.detail { cursor: pointer; } +div.detail p { margin: 0 0 8px 13px; font-size: 14px; white-space: pre-wrap; + font-family: monospace; } +div.explanation { margin: 20px 13px; font-size: 15px; color: #555; } +div.footer { font-size: 13px; text-align: right; margin: 30px 0; + color: #86989B; } + +h2 { font-size: 16px; margin: 1.3em 0 0.0 0; padding: 9px; + background-color: #11557C; color: white; } +h2 em, h3 em { font-style: normal; color: #A5D6D9; font-weight: normal; } + +div.traceback, div.plain { border: 1px solid #ddd; margin: 0 0 1em 0; padding: 10px; } +div.plain p { margin: 0; } +div.plain textarea, +div.plain pre { margin: 10px 0 0 0; padding: 4px; + background-color: #E8EFF0; border: 1px solid #D3E7E9; } +div.plain textarea { width: 99%; height: 300px; } +div.traceback h3 { font-size: 1em; margin: 0 0 0.8em 0; } +div.traceback ul { list-style: none; margin: 0; padding: 0 0 0 1em; } +div.traceback h4 { font-size: 13px; font-weight: normal; margin: 0.7em 0 0.1em 0; } +div.traceback pre { margin: 0; padding: 5px 0 3px 15px; + background-color: #E8EFF0; border: 1px solid #D3E7E9; } +div.traceback .library .current { background: white; color: #555; } +div.traceback .expanded .current { background: #E8EFF0; color: black; } +div.traceback pre:hover { background-color: #DDECEE; color: black; cursor: pointer; } +div.traceback div.source.expanded pre + pre { border-top: none; } + +div.traceback span.ws { display: none; } +div.traceback pre.before, div.traceback pre.after { display: none; background: white; } +div.traceback div.source.expanded pre.before, +div.traceback div.source.expanded pre.after { + display: block; +} + +div.traceback div.source.expanded span.ws { + display: inline; +} + +div.traceback blockquote { margin: 1em 0 0 0; padding: 0; white-space: pre-line; } +div.traceback img { float: right; padding: 2px; margin: -3px 2px 0 0; display: none; } +div.traceback img:hover { background-color: #ddd; cursor: pointer; + border-color: #BFDDE0; } +div.traceback pre:hover img { display: block; } +div.traceback cite.filename { font-style: normal; color: #3B666B; } + +pre.console { border: 1px solid #ccc; background: white!important; + color: black; padding: 5px!important; + margin: 3px 0 0 0!important; cursor: default!important; + max-height: 400px; overflow: auto; } +pre.console form { color: #555; } +pre.console input { background-color: transparent; color: #555; + width: 90%; font-family: 'Consolas', 'Deja Vu Sans Mono', + 'Bitstream Vera Sans Mono', monospace; font-size: 14px; + border: none!important; } + +span.string { color: #30799B; } +span.number { color: #9C1A1C; } +span.help { color: #3A7734; } +span.object { color: #485F6E; } +span.extended { opacity: 0.5; } +span.extended:hover { opacity: 1; } +a.toggle { text-decoration: none; background-repeat: no-repeat; + background-position: center center; + background-image: url(?__debugger__=yes&cmd=resource&f=more.png); } +a.toggle:hover { background-color: #444; } +a.open { background-image: url(?__debugger__=yes&cmd=resource&f=less.png); } + +pre.console div.traceback, +pre.console div.box { margin: 5px 10px; white-space: normal; + border: 1px solid #11557C; padding: 10px; + font-family: 'Lucida Grande', 'Lucida Sans Unicode', 'Geneva', + 'Verdana', sans-serif; } +pre.console div.box h3, +pre.console div.traceback h3 { margin: -10px -10px 10px -10px; padding: 5px; + background: #11557C; color: white; } + +pre.console div.traceback pre:hover { cursor: default; background: #E8EFF0; } +pre.console div.traceback pre.syntaxerror { background: inherit; border: none; + margin: 20px -10px -10px -10px; + padding: 10px; border-top: 1px solid #BFDDE0; + background: #E8EFF0; } +pre.console div.noframe-traceback pre.syntaxerror { margin-top: -10px; border: none; } + +pre.console div.box pre.repr { padding: 0; margin: 0; background-color: white; border: none; } +pre.console div.box table { margin-top: 6px; } +pre.console div.box pre { border: none; } +pre.console div.box pre.help { background-color: white; } +pre.console div.box pre.help:hover { cursor: default; } +pre.console table tr { vertical-align: top; } +div.console { border: 1px solid #ccc; padding: 4px; background-color: #fafafa; } + +div.traceback pre, div.console pre { + white-space: pre-wrap; /* css-3 should we be so lucky... */ + white-space: -moz-pre-wrap; /* Mozilla, since 1999 */ + white-space: -pre-wrap; /* Opera 4-6 ?? */ + white-space: -o-pre-wrap; /* Opera 7 ?? */ + word-wrap: break-word; /* Internet Explorer 5.5+ */ + _white-space: pre; /* IE only hack to re-specify in + addition to word-wrap */ +} + + +div.pin-prompt { + position: absolute; + display: none; + top: 0; + bottom: 0; + left: 0; + right: 0; + background: rgba(255, 255, 255, 0.8); +} + +div.pin-prompt .inner { + background: #eee; + padding: 10px 50px; + width: 350px; + margin: 10% auto 0 auto; + border: 1px solid #ccc; + border-radius: 2px; +} + +div.exc-divider { + margin: 0.7em 0 0 -1em; + padding: 0.5em; + background: #11557C; + color: #ddd; + border: 1px solid #ddd; +} diff --git a/env/Lib/site-packages/werkzeug/debug/shared/ubuntu.ttf b/env/Lib/site-packages/werkzeug/debug/shared/ubuntu.ttf new file mode 100644 index 0000000000000000000000000000000000000000..8079f938c9fa5aede9a151439f136e267958ccd1 GIT binary patch literal 70220 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

%lg zINZYFmOi1!X^9<~q;Nv$-hQ9->=Am__pF?MPUuZuyAZ9-;NiA<1@u}yf9pq znb)v5ED9%fe51X5vEpB~{jANM-l^UG_*^BV37YxTsdZQ%+%-EJ^!3Y$YdWOZ+^-f*h^XZ31d z7}6R;dUd1XEn2og>-6jXcUfXDAJFR~!hS6oRot&Qr#P?e4e0lU;Zm08g;`a9dVA*C zz*hZkZzC(t9T;Ksf!*$w&ro@{o*;KqTWk%9i~ z=urPaE}P#xkiGEI(V_fkcKz^Be*Wc+1KCr1w5fxc!~9x7rFa8s>ZlsiCz;`bflZ@Z z`V<_za`ts=Wi`>ujT(_;%g;(^k5U5Wm?v*fA zeOvPK^}N2mP3{SAetmcDygK`ty4~NZu$`YCHPzjEp4Ck@XOBAMunKopg|IoF-*)Dz zRol03@99UtR`K_29Ny~J{@)usxCg$e?)vYQ&zJ6;l)Ftqo#5cVJ|?;I9m8Ef2C6{# z;MZUK%kLh1gV(pHvjml&zP7#pwZ$#ca>W~NG3aTHIsNzm;_V(Yx{jZgfPjAa@Jtc;|&wjh|WGCr9=I>DD`8$>6I$2M8J4Iud9(5caK~K~D{8sDU zZl~)&afZfMzL(G%jZ@yQXK9|T=6+D0&vmNNR|S6fkm}6ORYmv))$5)w)gM)j@&&T^ z<2o!|q{`G!C~xBW%TH-G>1V>l%476pI>N0Q<7oDExHAO)^_ci88^^N&rh{I3A-@_~6)o@Grxkl!9t4jV-b@y+nL)@d?I<4_->9tZ?BHW+T)9~-&g4Aq5BoP7wF&J|Ga&VfA7kaPT}{5 H?s(!~BBTR` literal 0 HcmV?d00001 diff --git a/env/Lib/site-packages/werkzeug/debug/tbtools.py b/env/Lib/site-packages/werkzeug/debug/tbtools.py new file mode 100644 index 0000000..c835888 --- /dev/null +++ b/env/Lib/site-packages/werkzeug/debug/tbtools.py @@ -0,0 +1,629 @@ +# -*- coding: utf-8 -*- +""" + werkzeug.debug.tbtools + ~~~~~~~~~~~~~~~~~~~~~~ + + This module provides various traceback related utility functions. + + :copyright: 2007 Pallets + :license: BSD-3-Clause +""" +import codecs +import inspect +import json +import os +import re +import sys +import sysconfig +import traceback +from tokenize import TokenError + +from .._compat import PY2 +from .._compat import range_type +from .._compat import reraise +from .._compat import string_types +from .._compat import text_type +from .._compat import to_native +from .._compat import to_unicode +from ..filesystem import get_filesystem_encoding +from ..utils import cached_property +from ..utils import escape +from .console import Console + + +_coding_re = re.compile(br"coding[:=]\s*([-\w.]+)") +_line_re = re.compile(br"^(.*?)$", re.MULTILINE) +_funcdef_re = re.compile(r"^(\s*def\s)|(.*(? + + + %(title)s // Werkzeug Debugger + + + + + + + + +

+""" +FOOTER = u"""\ + +
+ +
+
+

Console Locked

+

+ The console is locked and needs to be unlocked by entering the PIN. + You can find the PIN printed out on the standard output of your + shell that runs the server. +

+

PIN: + + +

+
+
+ + +""" + +PAGE_HTML = ( + HEADER + + u"""\ +

%(exception_type)s

+
+

%(exception)s

+
+

Traceback (most recent call last)

+%(summary)s +
+
+

+ + This is the Copy/Paste friendly version of the traceback. You can also paste this traceback into + a gist: + +

+ +
+
+
+ The debugger caught an exception in your WSGI application. You can now + look at the traceback which led to the error. + If you enable JavaScript you can also use additional features such as code + execution (if the evalex feature is enabled), automatic pasting of the + exceptions and much more. +
+""" + + FOOTER + + """ + +""" +) + +CONSOLE_HTML = ( + HEADER + + u"""\ +

Interactive Console

+
+In this console you can execute Python expressions in the context of the +application. The initial namespace was created by the debugger automatically. +
+
The Console requires JavaScript.
+""" + + FOOTER +) + +SUMMARY_HTML = u"""\ +
+ %(title)s +
    %(frames)s
+ %(description)s +
+""" + +FRAME_HTML = u"""\ +
+

File "%(filename)s", + line %(lineno)s, + in %(function_name)s

+
%(lines)s
+
+""" + +SOURCE_LINE_HTML = u"""\ + + %(lineno)s + %(code)s + +""" + + +def render_console_html(secret, evalex_trusted=True): + return CONSOLE_HTML % { + "evalex": "true", + "evalex_trusted": "true" if evalex_trusted else "false", + "console": "true", + "title": "Console", + "secret": secret, + "traceback_id": -1, + } + + +def get_current_traceback( + ignore_system_exceptions=False, show_hidden_frames=False, skip=0 +): + """Get the current exception info as `Traceback` object. Per default + calling this method will reraise system exceptions such as generator exit, + system exit or others. This behavior can be disabled by passing `False` + to the function as first parameter. + """ + exc_type, exc_value, tb = sys.exc_info() + if ignore_system_exceptions and exc_type in system_exceptions: + reraise(exc_type, exc_value, tb) + for _ in range_type(skip): + if tb.tb_next is None: + break + tb = tb.tb_next + tb = Traceback(exc_type, exc_value, tb) + if not show_hidden_frames: + tb.filter_hidden_frames() + return tb + + +class Line(object): + """Helper for the source renderer.""" + + __slots__ = ("lineno", "code", "in_frame", "current") + + def __init__(self, lineno, code): + self.lineno = lineno + self.code = code + self.in_frame = False + self.current = False + + @property + def classes(self): + rv = ["line"] + if self.in_frame: + rv.append("in-frame") + if self.current: + rv.append("current") + return rv + + def render(self): + return SOURCE_LINE_HTML % { + "classes": u" ".join(self.classes), + "lineno": self.lineno, + "code": escape(self.code), + } + + +class Traceback(object): + """Wraps a traceback.""" + + def __init__(self, exc_type, exc_value, tb): + self.exc_type = exc_type + self.exc_value = exc_value + self.tb = tb + + exception_type = exc_type.__name__ + if exc_type.__module__ not in {"builtins", "__builtin__", "exceptions"}: + exception_type = exc_type.__module__ + "." + exception_type + self.exception_type = exception_type + + self.groups = [] + memo = set() + while True: + self.groups.append(Group(exc_type, exc_value, tb)) + memo.add(id(exc_value)) + if PY2: + break + exc_value = exc_value.__cause__ or exc_value.__context__ + if exc_value is None or id(exc_value) in memo: + break + exc_type = type(exc_value) + tb = exc_value.__traceback__ + self.groups.reverse() + self.frames = [frame for group in self.groups for frame in group.frames] + + def filter_hidden_frames(self): + """Remove the frames according to the paste spec.""" + for group in self.groups: + group.filter_hidden_frames() + + self.frames[:] = [frame for group in self.groups for frame in group.frames] + + @property + def is_syntax_error(self): + """Is it a syntax error?""" + return isinstance(self.exc_value, SyntaxError) + + @property + def exception(self): + """String representation of the final exception.""" + return self.groups[-1].exception + + def log(self, logfile=None): + """Log the ASCII traceback into a file object.""" + if logfile is None: + logfile = sys.stderr + tb = self.plaintext.rstrip() + u"\n" + logfile.write(to_native(tb, "utf-8", "replace")) + + def paste(self): + """Create a paste and return the paste id.""" + data = json.dumps( + { + "description": "Werkzeug Internal Server Error", + "public": False, + "files": {"traceback.txt": {"content": self.plaintext}}, + } + ).encode("utf-8") + try: + from urllib2 import urlopen + except ImportError: + from urllib.request import urlopen + rv = urlopen("https://api.github.com/gists", data=data) + resp = json.loads(rv.read().decode("utf-8")) + rv.close() + return {"url": resp["html_url"], "id": resp["id"]} + + def render_summary(self, include_title=True): + """Render the traceback for the interactive console.""" + title = "" + classes = ["traceback"] + if not self.frames: + classes.append("noframe-traceback") + frames = [] + else: + library_frames = sum(frame.is_library for frame in self.frames) + mark_lib = 0 < library_frames < len(self.frames) + frames = [group.render(mark_lib=mark_lib) for group in self.groups] + + if include_title: + if self.is_syntax_error: + title = u"Syntax Error" + else: + title = u"Traceback (most recent call last):" + + if self.is_syntax_error: + description_wrapper = u"
%s
" + else: + description_wrapper = u"
%s
" + + return SUMMARY_HTML % { + "classes": u" ".join(classes), + "title": u"

%s

" % title if title else u"", + "frames": u"\n".join(frames), + "description": description_wrapper % escape(self.exception), + } + + def render_full(self, evalex=False, secret=None, evalex_trusted=True): + """Render the Full HTML page with the traceback info.""" + exc = escape(self.exception) + return PAGE_HTML % { + "evalex": "true" if evalex else "false", + "evalex_trusted": "true" if evalex_trusted else "false", + "console": "false", + "title": exc, + "exception": exc, + "exception_type": escape(self.exception_type), + "summary": self.render_summary(include_title=False), + "plaintext": escape(self.plaintext), + "plaintext_cs": re.sub("-{2,}", "-", self.plaintext), + "traceback_id": self.id, + "secret": secret, + } + + @cached_property + def plaintext(self): + return u"\n".join([group.render_text() for group in self.groups]) + + @property + def id(self): + return id(self) + + +class Group(object): + """A group of frames for an exception in a traceback. On Python 3, + if the exception has a ``__cause__`` or ``__context__``, there are + multiple exception groups. + """ + + def __init__(self, exc_type, exc_value, tb): + self.exc_type = exc_type + self.exc_value = exc_value + self.info = None + if not PY2: + if exc_value.__cause__ is not None: + self.info = ( + u"The above exception was the direct cause of the" + u" following exception" + ) + elif exc_value.__context__ is not None: + self.info = ( + u"During handling of the above exception, another" + u" exception occurred" + ) + + self.frames = [] + while tb is not None: + self.frames.append(Frame(exc_type, exc_value, tb)) + tb = tb.tb_next + + def filter_hidden_frames(self): + new_frames = [] + hidden = False + + for frame in self.frames: + hide = frame.hide + if hide in ("before", "before_and_this"): + new_frames = [] + hidden = False + if hide == "before_and_this": + continue + elif hide in ("reset", "reset_and_this"): + hidden = False + if hide == "reset_and_this": + continue + elif hide in ("after", "after_and_this"): + hidden = True + if hide == "after_and_this": + continue + elif hide or hidden: + continue + new_frames.append(frame) + + # if we only have one frame and that frame is from the codeop + # module, remove it. + if len(new_frames) == 1 and self.frames[0].module == "codeop": + del self.frames[:] + + # if the last frame is missing something went terrible wrong :( + elif self.frames[-1] in new_frames: + self.frames[:] = new_frames + + @property + def exception(self): + """String representation of the exception.""" + buf = traceback.format_exception_only(self.exc_type, self.exc_value) + rv = "".join(buf).strip() + return to_unicode(rv, "utf-8", "replace") + + def render(self, mark_lib=True): + out = [] + if self.info is not None: + out.append(u'
  • %s:
    ' % self.info) + for frame in self.frames: + out.append( + u"%s" + % ( + u' title="%s"' % escape(frame.info) if frame.info else u"", + frame.render(mark_lib=mark_lib), + ) + ) + return u"\n".join(out) + + def render_text(self): + out = [] + if self.info is not None: + out.append(u"\n%s:\n" % self.info) + out.append(u"Traceback (most recent call last):") + for frame in self.frames: + out.append(frame.render_text()) + out.append(self.exception) + return u"\n".join(out) + + +class Frame(object): + """A single frame in a traceback.""" + + def __init__(self, exc_type, exc_value, tb): + self.lineno = tb.tb_lineno + self.function_name = tb.tb_frame.f_code.co_name + self.locals = tb.tb_frame.f_locals + self.globals = tb.tb_frame.f_globals + + fn = inspect.getsourcefile(tb) or inspect.getfile(tb) + if fn[-4:] in (".pyo", ".pyc"): + fn = fn[:-1] + # if it's a file on the file system resolve the real filename. + if os.path.isfile(fn): + fn = os.path.realpath(fn) + self.filename = to_unicode(fn, get_filesystem_encoding()) + self.module = self.globals.get("__name__") + self.loader = self.globals.get("__loader__") + self.code = tb.tb_frame.f_code + + # support for paste's traceback extensions + self.hide = self.locals.get("__traceback_hide__", False) + info = self.locals.get("__traceback_info__") + if info is not None: + info = to_unicode(info, "utf-8", "replace") + self.info = info + + def render(self, mark_lib=True): + """Render a single frame in a traceback.""" + return FRAME_HTML % { + "id": self.id, + "filename": escape(self.filename), + "lineno": self.lineno, + "function_name": escape(self.function_name), + "lines": self.render_line_context(), + "library": "library" if mark_lib and self.is_library else "", + } + + @cached_property + def is_library(self): + return any( + self.filename.startswith(path) for path in sysconfig.get_paths().values() + ) + + def render_text(self): + return u' File "%s", line %s, in %s\n %s' % ( + self.filename, + self.lineno, + self.function_name, + self.current_line.strip(), + ) + + def render_line_context(self): + before, current, after = self.get_context_lines() + rv = [] + + def render_line(line, cls): + line = line.expandtabs().rstrip() + stripped_line = line.strip() + prefix = len(line) - len(stripped_line) + rv.append( + '
    %s%s
    ' + % (cls, " " * prefix, escape(stripped_line) or " ") + ) + + for line in before: + render_line(line, "before") + render_line(current, "current") + for line in after: + render_line(line, "after") + + return "\n".join(rv) + + def get_annotated_lines(self): + """Helper function that returns lines with extra information.""" + lines = [Line(idx + 1, x) for idx, x in enumerate(self.sourcelines)] + + # find function definition and mark lines + if hasattr(self.code, "co_firstlineno"): + lineno = self.code.co_firstlineno - 1 + while lineno > 0: + if _funcdef_re.match(lines[lineno].code): + break + lineno -= 1 + try: + offset = len(inspect.getblock([x.code + "\n" for x in lines[lineno:]])) + except TokenError: + offset = 0 + for line in lines[lineno : lineno + offset]: + line.in_frame = True + + # mark current line + try: + lines[self.lineno - 1].current = True + except IndexError: + pass + + return lines + + def eval(self, code, mode="single"): + """Evaluate code in the context of the frame.""" + if isinstance(code, string_types): + if PY2 and isinstance(code, text_type): # noqa + code = UTF8_COOKIE + code.encode("utf-8") + code = compile(code, "", mode) + return eval(code, self.globals, self.locals) + + @cached_property + def sourcelines(self): + """The sourcecode of the file as list of unicode strings.""" + # get sourcecode from loader or file + source = None + if self.loader is not None: + try: + if hasattr(self.loader, "get_source"): + source = self.loader.get_source(self.module) + elif hasattr(self.loader, "get_source_by_code"): + source = self.loader.get_source_by_code(self.code) + except Exception: + # we munch the exception so that we don't cause troubles + # if the loader is broken. + pass + + if source is None: + try: + f = open(to_native(self.filename, get_filesystem_encoding()), mode="rb") + except IOError: + return [] + try: + source = f.read() + finally: + f.close() + + # already unicode? return right away + if isinstance(source, text_type): + return source.splitlines() + + # yes. it should be ascii, but we don't want to reject too many + # characters in the debugger if something breaks + charset = "utf-8" + if source.startswith(UTF8_COOKIE): + source = source[3:] + else: + for idx, match in enumerate(_line_re.finditer(source)): + match = _coding_re.search(match.group()) + if match is not None: + charset = match.group(1) + break + if idx > 1: + break + + # on broken cookies we fall back to utf-8 too + charset = to_native(charset) + try: + codecs.lookup(charset) + except LookupError: + charset = "utf-8" + + return source.decode(charset, "replace").splitlines() + + def get_context_lines(self, context=5): + before = self.sourcelines[self.lineno - context - 1 : self.lineno - 1] + past = self.sourcelines[self.lineno : self.lineno + context] + return (before, self.current_line, past) + + @property + def current_line(self): + try: + return self.sourcelines[self.lineno - 1] + except IndexError: + return u"" + + @cached_property + def console(self): + return Console(self.globals, self.locals) + + @property + def id(self): + return id(self) diff --git a/env/Lib/site-packages/werkzeug/exceptions.py b/env/Lib/site-packages/werkzeug/exceptions.py new file mode 100644 index 0000000..a7295ca --- /dev/null +++ b/env/Lib/site-packages/werkzeug/exceptions.py @@ -0,0 +1,779 @@ +# -*- coding: utf-8 -*- +""" + werkzeug.exceptions + ~~~~~~~~~~~~~~~~~~~ + + This module implements a number of Python exceptions you can raise from + within your views to trigger a standard non-200 response. + + + Usage Example + ------------- + + :: + + from werkzeug.wrappers import BaseRequest + from werkzeug.wsgi import responder + from werkzeug.exceptions import HTTPException, NotFound + + def view(request): + raise NotFound() + + @responder + def application(environ, start_response): + request = BaseRequest(environ) + try: + return view(request) + except HTTPException as e: + return e + + + As you can see from this example those exceptions are callable WSGI + applications. Because of Python 2.4 compatibility those do not extend + from the response objects but only from the python exception class. + + As a matter of fact they are not Werkzeug response objects. However you + can get a response object by calling ``get_response()`` on a HTTP + exception. + + Keep in mind that you have to pass an environment to ``get_response()`` + because some errors fetch additional information from the WSGI + environment. + + If you want to hook in a different exception page to say, a 404 status + code, you can add a second except for a specific subclass of an error:: + + @responder + def application(environ, start_response): + request = BaseRequest(environ) + try: + return view(request) + except NotFound, e: + return not_found(request) + except HTTPException, e: + return e + + + :copyright: 2007 Pallets + :license: BSD-3-Clause +""" +import sys + +from ._compat import implements_to_string +from ._compat import integer_types +from ._compat import iteritems +from ._compat import text_type +from ._internal import _get_environ +from .utils import escape + + +@implements_to_string +class HTTPException(Exception): + """Baseclass for all HTTP exceptions. This exception can be called as WSGI + application to render a default error page or you can catch the subclasses + of it independently and render nicer error messages. + """ + + code = None + description = None + + def __init__(self, description=None, response=None): + super(HTTPException, self).__init__() + if description is not None: + self.description = description + self.response = response + + @classmethod + def wrap(cls, exception, name=None): + """Create an exception that is a subclass of the calling HTTP + exception and the ``exception`` argument. + + The first argument to the class will be passed to the + wrapped ``exception``, the rest to the HTTP exception. If + ``e.args`` is not empty and ``e.show_exception`` is ``True``, + the wrapped exception message is added to the HTTP error + description. + + .. versionchanged:: 0.15.5 + The ``show_exception`` attribute controls whether the + description includes the wrapped exception message. + + .. versionchanged:: 0.15.0 + The description includes the wrapped exception message. + """ + + class newcls(cls, exception): + _description = cls.description + show_exception = False + + def __init__(self, arg=None, *args, **kwargs): + super(cls, self).__init__(*args, **kwargs) + + if arg is None: + exception.__init__(self) + else: + exception.__init__(self, arg) + + @property + def description(self): + if self.show_exception: + return "{}\n{}: {}".format( + self._description, exception.__name__, exception.__str__(self) + ) + + return self._description + + @description.setter + def description(self, value): + self._description = value + + newcls.__module__ = sys._getframe(1).f_globals.get("__name__") + name = name or cls.__name__ + exception.__name__ + newcls.__name__ = newcls.__qualname__ = name + return newcls + + @property + def name(self): + """The status name.""" + from .http import HTTP_STATUS_CODES + + return HTTP_STATUS_CODES.get(self.code, "Unknown Error") + + def get_description(self, environ=None): + """Get the description.""" + return u"

    %s

    " % escape(self.description).replace("\n", "
    ") + + def get_body(self, environ=None): + """Get the HTML body.""" + return text_type( + ( + u'\n' + u"%(code)s %(name)s\n" + u"

    %(name)s

    \n" + u"%(description)s\n" + ) + % { + "code": self.code, + "name": escape(self.name), + "description": self.get_description(environ), + } + ) + + def get_headers(self, environ=None): + """Get a list of headers.""" + return [("Content-Type", "text/html")] + + def get_response(self, environ=None): + """Get a response object. If one was passed to the exception + it's returned directly. + + :param environ: the optional environ for the request. This + can be used to modify the response depending + on how the request looked like. + :return: a :class:`Response` object or a subclass thereof. + """ + from .wrappers.response import Response + + if self.response is not None: + return self.response + if environ is not None: + environ = _get_environ(environ) + headers = self.get_headers(environ) + return Response(self.get_body(environ), self.code, headers) + + def __call__(self, environ, start_response): + """Call the exception as WSGI application. + + :param environ: the WSGI environment. + :param start_response: the response callable provided by the WSGI + server. + """ + response = self.get_response(environ) + return response(environ, start_response) + + def __str__(self): + code = self.code if self.code is not None else "???" + return "%s %s: %s" % (code, self.name, self.description) + + def __repr__(self): + code = self.code if self.code is not None else "???" + return "<%s '%s: %s'>" % (self.__class__.__name__, code, self.name) + + +class BadRequest(HTTPException): + """*400* `Bad Request` + + Raise if the browser sends something to the application the application + or server cannot handle. + """ + + code = 400 + description = ( + "The browser (or proxy) sent a request that this server could " + "not understand." + ) + + +class ClientDisconnected(BadRequest): + """Internal exception that is raised if Werkzeug detects a disconnected + client. Since the client is already gone at that point attempting to + send the error message to the client might not work and might ultimately + result in another exception in the server. Mainly this is here so that + it is silenced by default as far as Werkzeug is concerned. + + Since disconnections cannot be reliably detected and are unspecified + by WSGI to a large extent this might or might not be raised if a client + is gone. + + .. versionadded:: 0.8 + """ + + +class SecurityError(BadRequest): + """Raised if something triggers a security error. This is otherwise + exactly like a bad request error. + + .. versionadded:: 0.9 + """ + + +class BadHost(BadRequest): + """Raised if the submitted host is badly formatted. + + .. versionadded:: 0.11.2 + """ + + +class Unauthorized(HTTPException): + """*401* ``Unauthorized`` + + Raise if the user is not authorized to access a resource. + + The ``www_authenticate`` argument should be used to set the + ``WWW-Authenticate`` header. This is used for HTTP basic auth and + other schemes. Use :class:`~werkzeug.datastructures.WWWAuthenticate` + to create correctly formatted values. Strictly speaking a 401 + response is invalid if it doesn't provide at least one value for + this header, although real clients typically don't care. + + :param description: Override the default message used for the body + of the response. + :param www-authenticate: A single value, or list of values, for the + WWW-Authenticate header. + + .. versionchanged:: 0.15.3 + If the ``www_authenticate`` argument is not set, the + ``WWW-Authenticate`` header is not set. + + .. versionchanged:: 0.15.3 + The ``response`` argument was restored. + + .. versionchanged:: 0.15.1 + ``description`` was moved back as the first argument, restoring + its previous position. + + .. versionchanged:: 0.15.0 + ``www_authenticate`` was added as the first argument, ahead of + ``description``. + """ + + code = 401 + description = ( + "The server could not verify that you are authorized to access" + " the URL requested. You either supplied the wrong credentials" + " (e.g. a bad password), or your browser doesn't understand" + " how to supply the credentials required." + ) + + def __init__(self, description=None, response=None, www_authenticate=None): + HTTPException.__init__(self, description, response) + + if www_authenticate is not None: + if not isinstance(www_authenticate, (tuple, list)): + www_authenticate = (www_authenticate,) + + self.www_authenticate = www_authenticate + + def get_headers(self, environ=None): + headers = HTTPException.get_headers(self, environ) + if self.www_authenticate: + headers.append( + ("WWW-Authenticate", ", ".join([str(x) for x in self.www_authenticate])) + ) + return headers + + +class Forbidden(HTTPException): + """*403* `Forbidden` + + Raise if the user doesn't have the permission for the requested resource + but was authenticated. + """ + + code = 403 + description = ( + "You don't have the permission to access the requested" + " resource. It is either read-protected or not readable by the" + " server." + ) + + +class NotFound(HTTPException): + """*404* `Not Found` + + Raise if a resource does not exist and never existed. + """ + + code = 404 + description = ( + "The requested URL was not found on the server. If you entered" + " the URL manually please check your spelling and try again." + ) + + +class MethodNotAllowed(HTTPException): + """*405* `Method Not Allowed` + + Raise if the server used a method the resource does not handle. For + example `POST` if the resource is view only. Especially useful for REST. + + The first argument for this exception should be a list of allowed methods. + Strictly speaking the response would be invalid if you don't provide valid + methods in the header which you can do with that list. + """ + + code = 405 + description = "The method is not allowed for the requested URL." + + def __init__(self, valid_methods=None, description=None): + """Takes an optional list of valid http methods + starting with werkzeug 0.3 the list will be mandatory.""" + HTTPException.__init__(self, description) + self.valid_methods = valid_methods + + def get_headers(self, environ=None): + headers = HTTPException.get_headers(self, environ) + if self.valid_methods: + headers.append(("Allow", ", ".join(self.valid_methods))) + return headers + + +class NotAcceptable(HTTPException): + """*406* `Not Acceptable` + + Raise if the server can't return any content conforming to the + `Accept` headers of the client. + """ + + code = 406 + + description = ( + "The resource identified by the request is only capable of" + " generating response entities which have content" + " characteristics not acceptable according to the accept" + " headers sent in the request." + ) + + +class RequestTimeout(HTTPException): + """*408* `Request Timeout` + + Raise to signalize a timeout. + """ + + code = 408 + description = ( + "The server closed the network connection because the browser" + " didn't finish the request within the specified time." + ) + + +class Conflict(HTTPException): + """*409* `Conflict` + + Raise to signal that a request cannot be completed because it conflicts + with the current state on the server. + + .. versionadded:: 0.7 + """ + + code = 409 + description = ( + "A conflict happened while processing the request. The" + " resource might have been modified while the request was being" + " processed." + ) + + +class Gone(HTTPException): + """*410* `Gone` + + Raise if a resource existed previously and went away without new location. + """ + + code = 410 + description = ( + "The requested URL is no longer available on this server and" + " there is no forwarding address. If you followed a link from a" + " foreign page, please contact the author of this page." + ) + + +class LengthRequired(HTTPException): + """*411* `Length Required` + + Raise if the browser submitted data but no ``Content-Length`` header which + is required for the kind of processing the server does. + """ + + code = 411 + description = ( + "A request with this method requires a valid Content-" + "Length header." + ) + + +class PreconditionFailed(HTTPException): + """*412* `Precondition Failed` + + Status code used in combination with ``If-Match``, ``If-None-Match``, or + ``If-Unmodified-Since``. + """ + + code = 412 + description = ( + "The precondition on the request for the URL failed positive evaluation." + ) + + +class RequestEntityTooLarge(HTTPException): + """*413* `Request Entity Too Large` + + The status code one should return if the data submitted exceeded a given + limit. + """ + + code = 413 + description = "The data value transmitted exceeds the capacity limit." + + +class RequestURITooLarge(HTTPException): + """*414* `Request URI Too Large` + + Like *413* but for too long URLs. + """ + + code = 414 + description = ( + "The length of the requested URL exceeds the capacity limit for" + " this server. The request cannot be processed." + ) + + +class UnsupportedMediaType(HTTPException): + """*415* `Unsupported Media Type` + + The status code returned if the server is unable to handle the media type + the client transmitted. + """ + + code = 415 + description = ( + "The server does not support the media type transmitted in the request." + ) + + +class RequestedRangeNotSatisfiable(HTTPException): + """*416* `Requested Range Not Satisfiable` + + The client asked for an invalid part of the file. + + .. versionadded:: 0.7 + """ + + code = 416 + description = "The server cannot provide the requested range." + + def __init__(self, length=None, units="bytes", description=None): + """Takes an optional `Content-Range` header value based on ``length`` + parameter. + """ + HTTPException.__init__(self, description) + self.length = length + self.units = units + + def get_headers(self, environ=None): + headers = HTTPException.get_headers(self, environ) + if self.length is not None: + headers.append(("Content-Range", "%s */%d" % (self.units, self.length))) + return headers + + +class ExpectationFailed(HTTPException): + """*417* `Expectation Failed` + + The server cannot meet the requirements of the Expect request-header. + + .. versionadded:: 0.7 + """ + + code = 417 + description = "The server could not meet the requirements of the Expect header" + + +class ImATeapot(HTTPException): + """*418* `I'm a teapot` + + The server should return this if it is a teapot and someone attempted + to brew coffee with it. + + .. versionadded:: 0.7 + """ + + code = 418 + description = "This server is a teapot, not a coffee machine" + + +class UnprocessableEntity(HTTPException): + """*422* `Unprocessable Entity` + + Used if the request is well formed, but the instructions are otherwise + incorrect. + """ + + code = 422 + description = ( + "The request was well-formed but was unable to be followed due" + " to semantic errors." + ) + + +class Locked(HTTPException): + """*423* `Locked` + + Used if the resource that is being accessed is locked. + """ + + code = 423 + description = "The resource that is being accessed is locked." + + +class FailedDependency(HTTPException): + """*424* `Failed Dependency` + + Used if the method could not be performed on the resource + because the requested action depended on another action and that action failed. + """ + + code = 424 + description = ( + "The method could not be performed on the resource because the" + " requested action depended on another action and that action" + " failed." + ) + + +class PreconditionRequired(HTTPException): + """*428* `Precondition Required` + + The server requires this request to be conditional, typically to prevent + the lost update problem, which is a race condition between two or more + clients attempting to update a resource through PUT or DELETE. By requiring + each client to include a conditional header ("If-Match" or "If-Unmodified- + Since") with the proper value retained from a recent GET request, the + server ensures that each client has at least seen the previous revision of + the resource. + """ + + code = 428 + description = ( + "This request is required to be conditional; try using" + ' "If-Match" or "If-Unmodified-Since".' + ) + + +class TooManyRequests(HTTPException): + """*429* `Too Many Requests` + + The server is limiting the rate at which this user receives responses, and + this request exceeds that rate. (The server may use any convenient method + to identify users and their request rates). The server may include a + "Retry-After" header to indicate how long the user should wait before + retrying. + """ + + code = 429 + description = "This user has exceeded an allotted request count. Try again later." + + +class RequestHeaderFieldsTooLarge(HTTPException): + """*431* `Request Header Fields Too Large` + + The server refuses to process the request because the header fields are too + large. One or more individual fields may be too large, or the set of all + headers is too large. + """ + + code = 431 + description = "One or more header fields exceeds the maximum size." + + +class UnavailableForLegalReasons(HTTPException): + """*451* `Unavailable For Legal Reasons` + + This status code indicates that the server is denying access to the + resource as a consequence of a legal demand. + """ + + code = 451 + description = "Unavailable for legal reasons." + + +class InternalServerError(HTTPException): + """*500* `Internal Server Error` + + Raise if an internal server error occurred. This is a good fallback if an + unknown error occurred in the dispatcher. + """ + + code = 500 + description = ( + "The server encountered an internal error and was unable to" + " complete your request. Either the server is overloaded or" + " there is an error in the application." + ) + + +class NotImplemented(HTTPException): + """*501* `Not Implemented` + + Raise if the application does not support the action requested by the + browser. + """ + + code = 501 + description = "The server does not support the action requested by the browser." + + +class BadGateway(HTTPException): + """*502* `Bad Gateway` + + If you do proxying in your application you should return this status code + if you received an invalid response from the upstream server it accessed + in attempting to fulfill the request. + """ + + code = 502 + description = ( + "The proxy server received an invalid response from an upstream server." + ) + + +class ServiceUnavailable(HTTPException): + """*503* `Service Unavailable` + + Status code you should return if a service is temporarily unavailable. + """ + + code = 503 + description = ( + "The server is temporarily unable to service your request due" + " to maintenance downtime or capacity problems. Please try" + " again later." + ) + + +class GatewayTimeout(HTTPException): + """*504* `Gateway Timeout` + + Status code you should return if a connection to an upstream server + times out. + """ + + code = 504 + description = "The connection to an upstream server timed out." + + +class HTTPVersionNotSupported(HTTPException): + """*505* `HTTP Version Not Supported` + + The server does not support the HTTP protocol version used in the request. + """ + + code = 505 + description = ( + "The server does not support the HTTP protocol version used in the request." + ) + + +default_exceptions = {} +__all__ = ["HTTPException"] + + +def _find_exceptions(): + for _name, obj in iteritems(globals()): + try: + is_http_exception = issubclass(obj, HTTPException) + except TypeError: + is_http_exception = False + if not is_http_exception or obj.code is None: + continue + __all__.append(obj.__name__) + old_obj = default_exceptions.get(obj.code, None) + if old_obj is not None and issubclass(obj, old_obj): + continue + default_exceptions[obj.code] = obj + + +_find_exceptions() +del _find_exceptions + + +class Aborter(object): + """When passed a dict of code -> exception items it can be used as + callable that raises exceptions. If the first argument to the + callable is an integer it will be looked up in the mapping, if it's + a WSGI application it will be raised in a proxy exception. + + The rest of the arguments are forwarded to the exception constructor. + """ + + def __init__(self, mapping=None, extra=None): + if mapping is None: + mapping = default_exceptions + self.mapping = dict(mapping) + if extra is not None: + self.mapping.update(extra) + + def __call__(self, code, *args, **kwargs): + if not args and not kwargs and not isinstance(code, integer_types): + raise HTTPException(response=code) + if code not in self.mapping: + raise LookupError("no exception for %r" % code) + raise self.mapping[code](*args, **kwargs) + + +def abort(status, *args, **kwargs): + """Raises an :py:exc:`HTTPException` for the given status code or WSGI + application:: + + abort(404) # 404 Not Found + abort(Response('Hello World')) + + Can be passed a WSGI application or a status code. If a status code is + given it's looked up in the list of exceptions and will raise that + exception, if passed a WSGI application it will wrap it in a proxy WSGI + exception and raise that:: + + abort(404) + abort(Response('Hello World')) + + """ + return _aborter(status, *args, **kwargs) + + +_aborter = Aborter() + +#: An exception that is used to signal both a :exc:`KeyError` and a +#: :exc:`BadRequest`. Used by many of the datastructures. +BadRequestKeyError = BadRequest.wrap(KeyError) diff --git a/env/Lib/site-packages/werkzeug/filesystem.py b/env/Lib/site-packages/werkzeug/filesystem.py new file mode 100644 index 0000000..d016cae --- /dev/null +++ b/env/Lib/site-packages/werkzeug/filesystem.py @@ -0,0 +1,64 @@ +# -*- coding: utf-8 -*- +""" + werkzeug.filesystem + ~~~~~~~~~~~~~~~~~~~ + + Various utilities for the local filesystem. + + :copyright: 2007 Pallets + :license: BSD-3-Clause +""" +import codecs +import sys +import warnings + +# We do not trust traditional unixes. +has_likely_buggy_unicode_filesystem = ( + sys.platform.startswith("linux") or "bsd" in sys.platform +) + + +def _is_ascii_encoding(encoding): + """Given an encoding this figures out if the encoding is actually ASCII (which + is something we don't actually want in most cases). This is necessary + because ASCII comes under many names such as ANSI_X3.4-1968. + """ + if encoding is None: + return False + try: + return codecs.lookup(encoding).name == "ascii" + except LookupError: + return False + + +class BrokenFilesystemWarning(RuntimeWarning, UnicodeWarning): + """The warning used by Werkzeug to signal a broken filesystem. Will only be + used once per runtime.""" + + +_warned_about_filesystem_encoding = False + + +def get_filesystem_encoding(): + """Returns the filesystem encoding that should be used. Note that this is + different from the Python understanding of the filesystem encoding which + might be deeply flawed. Do not use this value against Python's unicode APIs + because it might be different. See :ref:`filesystem-encoding` for the exact + behavior. + + The concept of a filesystem encoding in generally is not something you + should rely on. As such if you ever need to use this function except for + writing wrapper code reconsider. + """ + global _warned_about_filesystem_encoding + rv = sys.getfilesystemencoding() + if has_likely_buggy_unicode_filesystem and not rv or _is_ascii_encoding(rv): + if not _warned_about_filesystem_encoding: + warnings.warn( + "Detected a misconfigured UNIX filesystem: Will use" + " UTF-8 as filesystem encoding instead of {0!r}".format(rv), + BrokenFilesystemWarning, + ) + _warned_about_filesystem_encoding = True + return "utf-8" + return rv diff --git a/env/Lib/site-packages/werkzeug/formparser.py b/env/Lib/site-packages/werkzeug/formparser.py new file mode 100644 index 0000000..ffdb9b0 --- /dev/null +++ b/env/Lib/site-packages/werkzeug/formparser.py @@ -0,0 +1,584 @@ +# -*- coding: utf-8 -*- +""" + werkzeug.formparser + ~~~~~~~~~~~~~~~~~~~ + + This module implements the form parsing. It supports url-encoded forms + as well as non-nested multipart uploads. + + :copyright: 2007 Pallets + :license: BSD-3-Clause +""" +import codecs +import re +from functools import update_wrapper +from itertools import chain +from itertools import repeat +from itertools import tee + +from . import exceptions +from ._compat import BytesIO +from ._compat import text_type +from ._compat import to_native +from .datastructures import FileStorage +from .datastructures import Headers +from .datastructures import MultiDict +from .http import parse_options_header +from .urls import url_decode_stream +from .wsgi import get_content_length +from .wsgi import get_input_stream +from .wsgi import make_line_iter + +# there are some platforms where SpooledTemporaryFile is not available. +# In that case we need to provide a fallback. +try: + from tempfile import SpooledTemporaryFile +except ImportError: + from tempfile import TemporaryFile + + SpooledTemporaryFile = None + + +#: an iterator that yields empty strings +_empty_string_iter = repeat("") + +#: a regular expression for multipart boundaries +_multipart_boundary_re = re.compile("^[ -~]{0,200}[!-~]$") + +#: supported http encodings that are also available in python we support +#: for multipart messages. +_supported_multipart_encodings = frozenset(["base64", "quoted-printable"]) + + +def default_stream_factory( + total_content_length, filename, content_type, content_length=None +): + """The stream factory that is used per default.""" + max_size = 1024 * 500 + if SpooledTemporaryFile is not None: + return SpooledTemporaryFile(max_size=max_size, mode="wb+") + if total_content_length is None or total_content_length > max_size: + return TemporaryFile("wb+") + return BytesIO() + + +def parse_form_data( + environ, + stream_factory=None, + charset="utf-8", + errors="replace", + max_form_memory_size=None, + max_content_length=None, + cls=None, + silent=True, +): + """Parse the form data in the environ and return it as tuple in the form + ``(stream, form, files)``. You should only call this method if the + transport method is `POST`, `PUT`, or `PATCH`. + + If the mimetype of the data transmitted is `multipart/form-data` the + files multidict will be filled with `FileStorage` objects. If the + mimetype is unknown the input stream is wrapped and returned as first + argument, else the stream is empty. + + This is a shortcut for the common usage of :class:`FormDataParser`. + + Have a look at :ref:`dealing-with-request-data` for more details. + + .. versionadded:: 0.5 + The `max_form_memory_size`, `max_content_length` and + `cls` parameters were added. + + .. versionadded:: 0.5.1 + The optional `silent` flag was added. + + :param environ: the WSGI environment to be used for parsing. + :param stream_factory: An optional callable that returns a new read and + writeable file descriptor. This callable works + the same as :meth:`~BaseResponse._get_file_stream`. + :param charset: The character set for URL and url encoded form data. + :param errors: The encoding error behavior. + :param max_form_memory_size: the maximum number of bytes to be accepted for + in-memory stored form data. If the data + exceeds the value specified an + :exc:`~exceptions.RequestEntityTooLarge` + exception is raised. + :param max_content_length: If this is provided and the transmitted data + is longer than this value an + :exc:`~exceptions.RequestEntityTooLarge` + exception is raised. + :param cls: an optional dict class to use. If this is not specified + or `None` the default :class:`MultiDict` is used. + :param silent: If set to False parsing errors will not be caught. + :return: A tuple in the form ``(stream, form, files)``. + """ + return FormDataParser( + stream_factory, + charset, + errors, + max_form_memory_size, + max_content_length, + cls, + silent, + ).parse_from_environ(environ) + + +def exhaust_stream(f): + """Helper decorator for methods that exhausts the stream on return.""" + + def wrapper(self, stream, *args, **kwargs): + try: + return f(self, stream, *args, **kwargs) + finally: + exhaust = getattr(stream, "exhaust", None) + if exhaust is not None: + exhaust() + else: + while 1: + chunk = stream.read(1024 * 64) + if not chunk: + break + + return update_wrapper(wrapper, f) + + +class FormDataParser(object): + """This class implements parsing of form data for Werkzeug. By itself + it can parse multipart and url encoded form data. It can be subclassed + and extended but for most mimetypes it is a better idea to use the + untouched stream and expose it as separate attributes on a request + object. + + .. versionadded:: 0.8 + + :param stream_factory: An optional callable that returns a new read and + writeable file descriptor. This callable works + the same as :meth:`~BaseResponse._get_file_stream`. + :param charset: The character set for URL and url encoded form data. + :param errors: The encoding error behavior. + :param max_form_memory_size: the maximum number of bytes to be accepted for + in-memory stored form data. If the data + exceeds the value specified an + :exc:`~exceptions.RequestEntityTooLarge` + exception is raised. + :param max_content_length: If this is provided and the transmitted data + is longer than this value an + :exc:`~exceptions.RequestEntityTooLarge` + exception is raised. + :param cls: an optional dict class to use. If this is not specified + or `None` the default :class:`MultiDict` is used. + :param silent: If set to False parsing errors will not be caught. + """ + + def __init__( + self, + stream_factory=None, + charset="utf-8", + errors="replace", + max_form_memory_size=None, + max_content_length=None, + cls=None, + silent=True, + ): + if stream_factory is None: + stream_factory = default_stream_factory + self.stream_factory = stream_factory + self.charset = charset + self.errors = errors + self.max_form_memory_size = max_form_memory_size + self.max_content_length = max_content_length + if cls is None: + cls = MultiDict + self.cls = cls + self.silent = silent + + def get_parse_func(self, mimetype, options): + return self.parse_functions.get(mimetype) + + def parse_from_environ(self, environ): + """Parses the information from the environment as form data. + + :param environ: the WSGI environment to be used for parsing. + :return: A tuple in the form ``(stream, form, files)``. + """ + content_type = environ.get("CONTENT_TYPE", "") + content_length = get_content_length(environ) + mimetype, options = parse_options_header(content_type) + return self.parse(get_input_stream(environ), mimetype, content_length, options) + + def parse(self, stream, mimetype, content_length, options=None): + """Parses the information from the given stream, mimetype, + content length and mimetype parameters. + + :param stream: an input stream + :param mimetype: the mimetype of the data + :param content_length: the content length of the incoming data + :param options: optional mimetype parameters (used for + the multipart boundary for instance) + :return: A tuple in the form ``(stream, form, files)``. + """ + if ( + self.max_content_length is not None + and content_length is not None + and content_length > self.max_content_length + ): + raise exceptions.RequestEntityTooLarge() + if options is None: + options = {} + + parse_func = self.get_parse_func(mimetype, options) + if parse_func is not None: + try: + return parse_func(self, stream, mimetype, content_length, options) + except ValueError: + if not self.silent: + raise + + return stream, self.cls(), self.cls() + + @exhaust_stream + def _parse_multipart(self, stream, mimetype, content_length, options): + parser = MultiPartParser( + self.stream_factory, + self.charset, + self.errors, + max_form_memory_size=self.max_form_memory_size, + cls=self.cls, + ) + boundary = options.get("boundary") + if boundary is None: + raise ValueError("Missing boundary") + if isinstance(boundary, text_type): + boundary = boundary.encode("ascii") + form, files = parser.parse(stream, boundary, content_length) + return stream, form, files + + @exhaust_stream + def _parse_urlencoded(self, stream, mimetype, content_length, options): + if ( + self.max_form_memory_size is not None + and content_length is not None + and content_length > self.max_form_memory_size + ): + raise exceptions.RequestEntityTooLarge() + form = url_decode_stream(stream, self.charset, errors=self.errors, cls=self.cls) + return stream, form, self.cls() + + #: mapping of mimetypes to parsing functions + parse_functions = { + "multipart/form-data": _parse_multipart, + "application/x-www-form-urlencoded": _parse_urlencoded, + "application/x-url-encoded": _parse_urlencoded, + } + + +def is_valid_multipart_boundary(boundary): + """Checks if the string given is a valid multipart boundary.""" + return _multipart_boundary_re.match(boundary) is not None + + +def _line_parse(line): + """Removes line ending characters and returns a tuple (`stripped_line`, + `is_terminated`). + """ + if line[-2:] in ["\r\n", b"\r\n"]: + return line[:-2], True + elif line[-1:] in ["\r", "\n", b"\r", b"\n"]: + return line[:-1], True + return line, False + + +def parse_multipart_headers(iterable): + """Parses multipart headers from an iterable that yields lines (including + the trailing newline symbol). The iterable has to be newline terminated. + + The iterable will stop at the line where the headers ended so it can be + further consumed. + + :param iterable: iterable of strings that are newline terminated + """ + result = [] + for line in iterable: + line = to_native(line) + line, line_terminated = _line_parse(line) + if not line_terminated: + raise ValueError("unexpected end of line in multipart header") + if not line: + break + elif line[0] in " \t" and result: + key, value = result[-1] + result[-1] = (key, value + "\n " + line[1:]) + else: + parts = line.split(":", 1) + if len(parts) == 2: + result.append((parts[0].strip(), parts[1].strip())) + + # we link the list to the headers, no need to create a copy, the + # list was not shared anyways. + return Headers(result) + + +_begin_form = "begin_form" +_begin_file = "begin_file" +_cont = "cont" +_end = "end" + + +class MultiPartParser(object): + def __init__( + self, + stream_factory=None, + charset="utf-8", + errors="replace", + max_form_memory_size=None, + cls=None, + buffer_size=64 * 1024, + ): + self.charset = charset + self.errors = errors + self.max_form_memory_size = max_form_memory_size + self.stream_factory = ( + default_stream_factory if stream_factory is None else stream_factory + ) + self.cls = MultiDict if cls is None else cls + + # make sure the buffer size is divisible by four so that we can base64 + # decode chunk by chunk + assert buffer_size % 4 == 0, "buffer size has to be divisible by 4" + # also the buffer size has to be at least 1024 bytes long or long headers + # will freak out the system + assert buffer_size >= 1024, "buffer size has to be at least 1KB" + + self.buffer_size = buffer_size + + def _fix_ie_filename(self, filename): + """Internet Explorer 6 transmits the full file name if a file is + uploaded. This function strips the full path if it thinks the + filename is Windows-like absolute. + """ + if filename[1:3] == ":\\" or filename[:2] == "\\\\": + return filename.split("\\")[-1] + return filename + + def _find_terminator(self, iterator): + """The terminator might have some additional newlines before it. + There is at least one application that sends additional newlines + before headers (the python setuptools package). + """ + for line in iterator: + if not line: + break + line = line.strip() + if line: + return line + return b"" + + def fail(self, message): + raise ValueError(message) + + def get_part_encoding(self, headers): + transfer_encoding = headers.get("content-transfer-encoding") + if ( + transfer_encoding is not None + and transfer_encoding in _supported_multipart_encodings + ): + return transfer_encoding + + def get_part_charset(self, headers): + # Figure out input charset for current part + content_type = headers.get("content-type") + if content_type: + mimetype, ct_params = parse_options_header(content_type) + return ct_params.get("charset", self.charset) + return self.charset + + def start_file_streaming(self, filename, headers, total_content_length): + if isinstance(filename, bytes): + filename = filename.decode(self.charset, self.errors) + filename = self._fix_ie_filename(filename) + content_type = headers.get("content-type") + try: + content_length = int(headers["content-length"]) + except (KeyError, ValueError): + content_length = 0 + container = self.stream_factory( + total_content_length=total_content_length, + filename=filename, + content_type=content_type, + content_length=content_length, + ) + return filename, container + + def in_memory_threshold_reached(self, bytes): + raise exceptions.RequestEntityTooLarge() + + def validate_boundary(self, boundary): + if not boundary: + self.fail("Missing boundary") + if not is_valid_multipart_boundary(boundary): + self.fail("Invalid boundary: %s" % boundary) + if len(boundary) > self.buffer_size: # pragma: no cover + # this should never happen because we check for a minimum size + # of 1024 and boundaries may not be longer than 200. The only + # situation when this happens is for non debug builds where + # the assert is skipped. + self.fail("Boundary longer than buffer size") + + def parse_lines(self, file, boundary, content_length, cap_at_buffer=True): + """Generate parts of + ``('begin_form', (headers, name))`` + ``('begin_file', (headers, name, filename))`` + ``('cont', bytestring)`` + ``('end', None)`` + + Always obeys the grammar + parts = ( begin_form cont* end | + begin_file cont* end )* + """ + next_part = b"--" + boundary + last_part = next_part + b"--" + + iterator = chain( + make_line_iter( + file, + limit=content_length, + buffer_size=self.buffer_size, + cap_at_buffer=cap_at_buffer, + ), + _empty_string_iter, + ) + + terminator = self._find_terminator(iterator) + + if terminator == last_part: + return + elif terminator != next_part: + self.fail("Expected boundary at start of multipart data") + + while terminator != last_part: + headers = parse_multipart_headers(iterator) + + disposition = headers.get("content-disposition") + if disposition is None: + self.fail("Missing Content-Disposition header") + disposition, extra = parse_options_header(disposition) + transfer_encoding = self.get_part_encoding(headers) + name = extra.get("name") + filename = extra.get("filename") + + # if no content type is given we stream into memory. A list is + # used as a temporary container. + if filename is None: + yield _begin_form, (headers, name) + + # otherwise we parse the rest of the headers and ask the stream + # factory for something we can write in. + else: + yield _begin_file, (headers, name, filename) + + buf = b"" + for line in iterator: + if not line: + self.fail("unexpected end of stream") + + if line[:2] == b"--": + terminator = line.rstrip() + if terminator in (next_part, last_part): + break + + if transfer_encoding is not None: + if transfer_encoding == "base64": + transfer_encoding = "base64_codec" + try: + line = codecs.decode(line, transfer_encoding) + except Exception: + self.fail("could not decode transfer encoded chunk") + + # we have something in the buffer from the last iteration. + # this is usually a newline delimiter. + if buf: + yield _cont, buf + buf = b"" + + # If the line ends with windows CRLF we write everything except + # the last two bytes. In all other cases however we write + # everything except the last byte. If it was a newline, that's + # fine, otherwise it does not matter because we will write it + # the next iteration. this ensures we do not write the + # final newline into the stream. That way we do not have to + # truncate the stream. However we do have to make sure that + # if something else than a newline is in there we write it + # out. + if line[-2:] == b"\r\n": + buf = b"\r\n" + cutoff = -2 + else: + buf = line[-1:] + cutoff = -1 + yield _cont, line[:cutoff] + + else: # pragma: no cover + raise ValueError("unexpected end of part") + + # if we have a leftover in the buffer that is not a newline + # character we have to flush it, otherwise we will chop of + # certain values. + if buf not in (b"", b"\r", b"\n", b"\r\n"): + yield _cont, buf + + yield _end, None + + def parse_parts(self, file, boundary, content_length): + """Generate ``('file', (name, val))`` and + ``('form', (name, val))`` parts. + """ + in_memory = 0 + + for ellt, ell in self.parse_lines(file, boundary, content_length): + if ellt == _begin_file: + headers, name, filename = ell + is_file = True + guard_memory = False + filename, container = self.start_file_streaming( + filename, headers, content_length + ) + _write = container.write + + elif ellt == _begin_form: + headers, name = ell + is_file = False + container = [] + _write = container.append + guard_memory = self.max_form_memory_size is not None + + elif ellt == _cont: + _write(ell) + # if we write into memory and there is a memory size limit we + # count the number of bytes in memory and raise an exception if + # there is too much data in memory. + if guard_memory: + in_memory += len(ell) + if in_memory > self.max_form_memory_size: + self.in_memory_threshold_reached(in_memory) + + elif ellt == _end: + if is_file: + container.seek(0) + yield ( + "file", + (name, FileStorage(container, filename, name, headers=headers)), + ) + else: + part_charset = self.get_part_charset(headers) + yield ( + "form", + (name, b"".join(container).decode(part_charset, self.errors)), + ) + + def parse(self, file, boundary, content_length): + formstream, filestream = tee( + self.parse_parts(file, boundary, content_length), 2 + ) + form = (p[1] for p in formstream if p[0] == "form") + files = (p[1] for p in filestream if p[0] == "file") + return self.cls(form), self.cls(files) diff --git a/env/Lib/site-packages/werkzeug/http.py b/env/Lib/site-packages/werkzeug/http.py new file mode 100644 index 0000000..686824c --- /dev/null +++ b/env/Lib/site-packages/werkzeug/http.py @@ -0,0 +1,1259 @@ +# -*- coding: utf-8 -*- +""" + werkzeug.http + ~~~~~~~~~~~~~ + + Werkzeug comes with a bunch of utilities that help Werkzeug to deal with + HTTP data. Most of the classes and functions provided by this module are + used by the wrappers, but they are useful on their own, too, especially if + the response and request objects are not used. + + This covers some of the more HTTP centric features of WSGI, some other + utilities such as cookie handling are documented in the `werkzeug.utils` + module. + + + :copyright: 2007 Pallets + :license: BSD-3-Clause +""" +import base64 +import re +import warnings +from datetime import datetime +from datetime import timedelta +from hashlib import md5 +from time import gmtime +from time import time + +from ._compat import integer_types +from ._compat import iteritems +from ._compat import PY2 +from ._compat import string_types +from ._compat import text_type +from ._compat import to_bytes +from ._compat import to_unicode +from ._compat import try_coerce_native +from ._internal import _cookie_parse_impl +from ._internal import _cookie_quote +from ._internal import _make_cookie_domain + +try: + from email.utils import parsedate_tz +except ImportError: + from email.Utils import parsedate_tz + +try: + from urllib.request import parse_http_list as _parse_list_header + from urllib.parse import unquote_to_bytes as _unquote +except ImportError: + from urllib2 import parse_http_list as _parse_list_header + from urllib2 import unquote as _unquote + +_cookie_charset = "latin1" +_basic_auth_charset = "utf-8" +# for explanation of "media-range", etc. see Sections 5.3.{1,2} of RFC 7231 +_accept_re = re.compile( + r""" + ( # media-range capturing-parenthesis + [^\s;,]+ # type/subtype + (?:[ \t]*;[ \t]* # ";" + (?: # parameter non-capturing-parenthesis + [^\s;,q][^\s;,]* # token that doesn't start with "q" + | # or + q[^\s;,=][^\s;,]* # token that is more than just "q" + ) + )* # zero or more parameters + ) # end of media-range + (?:[ \t]*;[ \t]*q= # weight is a "q" parameter + (\d*(?:\.\d+)?) # qvalue capturing-parentheses + [^,]* # "extension" accept params: who cares? + )? # accept params are optional + """, + re.VERBOSE, +) +_token_chars = frozenset( + "!#$%&'*+-.0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ^_`abcdefghijklmnopqrstuvwxyz|~" +) +_etag_re = re.compile(r'([Ww]/)?(?:"(.*?)"|(.*?))(?:\s*,\s*|$)') +_unsafe_header_chars = set('()<>@,;:"/[]?={} \t') +_option_header_piece_re = re.compile( + r""" + ;\s*,?\s* # newlines were replaced with commas + (?P + "[^"\\]*(?:\\.[^"\\]*)*" # quoted string + | + [^\s;,=*]+ # token + ) + (?:\*(?P\d+))? # *1, optional continuation index + \s* + (?: # optionally followed by =value + (?: # equals sign, possibly with encoding + \*\s*=\s* # * indicates extended notation + (?: # optional encoding + (?P[^\s]+?) + '(?P[^\s]*?)' + )? + | + =\s* # basic notation + ) + (?P + "[^"\\]*(?:\\.[^"\\]*)*" # quoted string + | + [^;,]+ # token + )? + )? + \s* + """, + flags=re.VERBOSE, +) +_option_header_start_mime_type = re.compile(r",\s*([^;,\s]+)([;,]\s*.+)?") + +_entity_headers = frozenset( + [ + "allow", + "content-encoding", + "content-language", + "content-length", + "content-location", + "content-md5", + "content-range", + "content-type", + "expires", + "last-modified", + ] +) +_hop_by_hop_headers = frozenset( + [ + "connection", + "keep-alive", + "proxy-authenticate", + "proxy-authorization", + "te", + "trailer", + "transfer-encoding", + "upgrade", + ] +) + + +HTTP_STATUS_CODES = { + 100: "Continue", + 101: "Switching Protocols", + 102: "Processing", + 200: "OK", + 201: "Created", + 202: "Accepted", + 203: "Non Authoritative Information", + 204: "No Content", + 205: "Reset Content", + 206: "Partial Content", + 207: "Multi Status", + 226: "IM Used", # see RFC 3229 + 300: "Multiple Choices", + 301: "Moved Permanently", + 302: "Found", + 303: "See Other", + 304: "Not Modified", + 305: "Use Proxy", + 307: "Temporary Redirect", + 308: "Permanent Redirect", + 400: "Bad Request", + 401: "Unauthorized", + 402: "Payment Required", # unused + 403: "Forbidden", + 404: "Not Found", + 405: "Method Not Allowed", + 406: "Not Acceptable", + 407: "Proxy Authentication Required", + 408: "Request Timeout", + 409: "Conflict", + 410: "Gone", + 411: "Length Required", + 412: "Precondition Failed", + 413: "Request Entity Too Large", + 414: "Request URI Too Long", + 415: "Unsupported Media Type", + 416: "Requested Range Not Satisfiable", + 417: "Expectation Failed", + 418: "I'm a teapot", # see RFC 2324 + 421: "Misdirected Request", # see RFC 7540 + 422: "Unprocessable Entity", + 423: "Locked", + 424: "Failed Dependency", + 426: "Upgrade Required", + 428: "Precondition Required", # see RFC 6585 + 429: "Too Many Requests", + 431: "Request Header Fields Too Large", + 449: "Retry With", # proprietary MS extension + 451: "Unavailable For Legal Reasons", + 500: "Internal Server Error", + 501: "Not Implemented", + 502: "Bad Gateway", + 503: "Service Unavailable", + 504: "Gateway Timeout", + 505: "HTTP Version Not Supported", + 507: "Insufficient Storage", + 510: "Not Extended", +} + + +def wsgi_to_bytes(data): + """coerce wsgi unicode represented bytes to real ones""" + if isinstance(data, bytes): + return data + return data.encode("latin1") # XXX: utf8 fallback? + + +def bytes_to_wsgi(data): + assert isinstance(data, bytes), "data must be bytes" + if isinstance(data, str): + return data + else: + return data.decode("latin1") + + +def quote_header_value(value, extra_chars="", allow_token=True): + """Quote a header value if necessary. + + .. versionadded:: 0.5 + + :param value: the value to quote. + :param extra_chars: a list of extra characters to skip quoting. + :param allow_token: if this is enabled token values are returned + unchanged. + """ + if isinstance(value, bytes): + value = bytes_to_wsgi(value) + value = str(value) + if allow_token: + token_chars = _token_chars | set(extra_chars) + if set(value).issubset(token_chars): + return value + return '"%s"' % value.replace("\\", "\\\\").replace('"', '\\"') + + +def unquote_header_value(value, is_filename=False): + r"""Unquotes a header value. (Reversal of :func:`quote_header_value`). + This does not use the real unquoting but what browsers are actually + using for quoting. + + .. versionadded:: 0.5 + + :param value: the header value to unquote. + """ + if value and value[0] == value[-1] == '"': + # this is not the real unquoting, but fixing this so that the + # RFC is met will result in bugs with internet explorer and + # probably some other browsers as well. IE for example is + # uploading files with "C:\foo\bar.txt" as filename + value = value[1:-1] + + # if this is a filename and the starting characters look like + # a UNC path, then just return the value without quotes. Using the + # replace sequence below on a UNC path has the effect of turning + # the leading double slash into a single slash and then + # _fix_ie_filename() doesn't work correctly. See #458. + if not is_filename or value[:2] != "\\\\": + return value.replace("\\\\", "\\").replace('\\"', '"') + return value + + +def dump_options_header(header, options): + """The reverse function to :func:`parse_options_header`. + + :param header: the header to dump + :param options: a dict of options to append. + """ + segments = [] + if header is not None: + segments.append(header) + for key, value in iteritems(options): + if value is None: + segments.append(key) + else: + segments.append("%s=%s" % (key, quote_header_value(value))) + return "; ".join(segments) + + +def dump_header(iterable, allow_token=True): + """Dump an HTTP header again. This is the reversal of + :func:`parse_list_header`, :func:`parse_set_header` and + :func:`parse_dict_header`. This also quotes strings that include an + equals sign unless you pass it as dict of key, value pairs. + + >>> dump_header({'foo': 'bar baz'}) + 'foo="bar baz"' + >>> dump_header(('foo', 'bar baz')) + 'foo, "bar baz"' + + :param iterable: the iterable or dict of values to quote. + :param allow_token: if set to `False` tokens as values are disallowed. + See :func:`quote_header_value` for more details. + """ + if isinstance(iterable, dict): + items = [] + for key, value in iteritems(iterable): + if value is None: + items.append(key) + else: + items.append( + "%s=%s" % (key, quote_header_value(value, allow_token=allow_token)) + ) + else: + items = [quote_header_value(x, allow_token=allow_token) for x in iterable] + return ", ".join(items) + + +def parse_list_header(value): + """Parse lists as described by RFC 2068 Section 2. + + In particular, parse comma-separated lists where the elements of + the list may include quoted-strings. A quoted-string could + contain a comma. A non-quoted string could have quotes in the + middle. Quotes are removed automatically after parsing. + + It basically works like :func:`parse_set_header` just that items + may appear multiple times and case sensitivity is preserved. + + The return value is a standard :class:`list`: + + >>> parse_list_header('token, "quoted value"') + ['token', 'quoted value'] + + To create a header from the :class:`list` again, use the + :func:`dump_header` function. + + :param value: a string with a list header. + :return: :class:`list` + """ + result = [] + for item in _parse_list_header(value): + if item[:1] == item[-1:] == '"': + item = unquote_header_value(item[1:-1]) + result.append(item) + return result + + +def parse_dict_header(value, cls=dict): + """Parse lists of key, value pairs as described by RFC 2068 Section 2 and + convert them into a python dict (or any other mapping object created from + the type with a dict like interface provided by the `cls` argument): + + >>> d = parse_dict_header('foo="is a fish", bar="as well"') + >>> type(d) is dict + True + >>> sorted(d.items()) + [('bar', 'as well'), ('foo', 'is a fish')] + + If there is no value for a key it will be `None`: + + >>> parse_dict_header('key_without_value') + {'key_without_value': None} + + To create a header from the :class:`dict` again, use the + :func:`dump_header` function. + + .. versionchanged:: 0.9 + Added support for `cls` argument. + + :param value: a string with a dict header. + :param cls: callable to use for storage of parsed results. + :return: an instance of `cls` + """ + result = cls() + if not isinstance(value, text_type): + # XXX: validate + value = bytes_to_wsgi(value) + for item in _parse_list_header(value): + if "=" not in item: + result[item] = None + continue + name, value = item.split("=", 1) + if value[:1] == value[-1:] == '"': + value = unquote_header_value(value[1:-1]) + result[name] = value + return result + + +def parse_options_header(value, multiple=False): + """Parse a ``Content-Type`` like header into a tuple with the content + type and the options: + + >>> parse_options_header('text/html; charset=utf8') + ('text/html', {'charset': 'utf8'}) + + This should not be used to parse ``Cache-Control`` like headers that use + a slightly different format. For these headers use the + :func:`parse_dict_header` function. + + .. versionchanged:: 0.15 + :rfc:`2231` parameter continuations are handled. + + .. versionadded:: 0.5 + + :param value: the header to parse. + :param multiple: Whether try to parse and return multiple MIME types + :return: (mimetype, options) or (mimetype, options, mimetype, options, …) + if multiple=True + """ + if not value: + return "", {} + + result = [] + + value = "," + value.replace("\n", ",") + while value: + match = _option_header_start_mime_type.match(value) + if not match: + break + result.append(match.group(1)) # mimetype + options = {} + # Parse options + rest = match.group(2) + continued_encoding = None + while rest: + optmatch = _option_header_piece_re.match(rest) + if not optmatch: + break + option, count, encoding, language, option_value = optmatch.groups() + # Continuations don't have to supply the encoding after the + # first line. If we're in a continuation, track the current + # encoding to use for subsequent lines. Reset it when the + # continuation ends. + if not count: + continued_encoding = None + else: + if not encoding: + encoding = continued_encoding + continued_encoding = encoding + option = unquote_header_value(option) + if option_value is not None: + option_value = unquote_header_value(option_value, option == "filename") + if encoding is not None: + option_value = _unquote(option_value).decode(encoding) + if count: + # Continuations append to the existing value. For + # simplicity, this ignores the possibility of + # out-of-order indices, which shouldn't happen anyway. + options[option] = options.get(option, "") + option_value + else: + options[option] = option_value + rest = rest[optmatch.end() :] + result.append(options) + if multiple is False: + return tuple(result) + value = rest + + return tuple(result) if result else ("", {}) + + +def parse_accept_header(value, cls=None): + """Parses an HTTP Accept-* header. This does not implement a complete + valid algorithm but one that supports at least value and quality + extraction. + + Returns a new :class:`Accept` object (basically a list of ``(value, quality)`` + tuples sorted by the quality with some additional accessor methods). + + The second parameter can be a subclass of :class:`Accept` that is created + with the parsed values and returned. + + :param value: the accept header string to be parsed. + :param cls: the wrapper class for the return value (can be + :class:`Accept` or a subclass thereof) + :return: an instance of `cls`. + """ + if cls is None: + cls = Accept + + if not value: + return cls(None) + + result = [] + for match in _accept_re.finditer(value): + quality = match.group(2) + if not quality: + quality = 1 + else: + quality = max(min(float(quality), 1), 0) + result.append((match.group(1), quality)) + return cls(result) + + +def parse_cache_control_header(value, on_update=None, cls=None): + """Parse a cache control header. The RFC differs between response and + request cache control, this method does not. It's your responsibility + to not use the wrong control statements. + + .. versionadded:: 0.5 + The `cls` was added. If not specified an immutable + :class:`~werkzeug.datastructures.RequestCacheControl` is returned. + + :param value: a cache control header to be parsed. + :param on_update: an optional callable that is called every time a value + on the :class:`~werkzeug.datastructures.CacheControl` + object is changed. + :param cls: the class for the returned object. By default + :class:`~werkzeug.datastructures.RequestCacheControl` is used. + :return: a `cls` object. + """ + if cls is None: + cls = RequestCacheControl + if not value: + return cls(None, on_update) + return cls(parse_dict_header(value), on_update) + + +def parse_set_header(value, on_update=None): + """Parse a set-like header and return a + :class:`~werkzeug.datastructures.HeaderSet` object: + + >>> hs = parse_set_header('token, "quoted value"') + + The return value is an object that treats the items case-insensitively + and keeps the order of the items: + + >>> 'TOKEN' in hs + True + >>> hs.index('quoted value') + 1 + >>> hs + HeaderSet(['token', 'quoted value']) + + To create a header from the :class:`HeaderSet` again, use the + :func:`dump_header` function. + + :param value: a set header to be parsed. + :param on_update: an optional callable that is called every time a + value on the :class:`~werkzeug.datastructures.HeaderSet` + object is changed. + :return: a :class:`~werkzeug.datastructures.HeaderSet` + """ + if not value: + return HeaderSet(None, on_update) + return HeaderSet(parse_list_header(value), on_update) + + +def parse_authorization_header(value): + """Parse an HTTP basic/digest authorization header transmitted by the web + browser. The return value is either `None` if the header was invalid or + not given, otherwise an :class:`~werkzeug.datastructures.Authorization` + object. + + :param value: the authorization header to parse. + :return: a :class:`~werkzeug.datastructures.Authorization` object or `None`. + """ + if not value: + return + value = wsgi_to_bytes(value) + try: + auth_type, auth_info = value.split(None, 1) + auth_type = auth_type.lower() + except ValueError: + return + if auth_type == b"basic": + try: + username, password = base64.b64decode(auth_info).split(b":", 1) + except Exception: + return + return Authorization( + "basic", + { + "username": to_unicode(username, _basic_auth_charset), + "password": to_unicode(password, _basic_auth_charset), + }, + ) + elif auth_type == b"digest": + auth_map = parse_dict_header(auth_info) + for key in "username", "realm", "nonce", "uri", "response": + if key not in auth_map: + return + if "qop" in auth_map: + if not auth_map.get("nc") or not auth_map.get("cnonce"): + return + return Authorization("digest", auth_map) + + +def parse_www_authenticate_header(value, on_update=None): + """Parse an HTTP WWW-Authenticate header into a + :class:`~werkzeug.datastructures.WWWAuthenticate` object. + + :param value: a WWW-Authenticate header to parse. + :param on_update: an optional callable that is called every time a value + on the :class:`~werkzeug.datastructures.WWWAuthenticate` + object is changed. + :return: a :class:`~werkzeug.datastructures.WWWAuthenticate` object. + """ + if not value: + return WWWAuthenticate(on_update=on_update) + try: + auth_type, auth_info = value.split(None, 1) + auth_type = auth_type.lower() + except (ValueError, AttributeError): + return WWWAuthenticate(value.strip().lower(), on_update=on_update) + return WWWAuthenticate(auth_type, parse_dict_header(auth_info), on_update) + + +def parse_if_range_header(value): + """Parses an if-range header which can be an etag or a date. Returns + a :class:`~werkzeug.datastructures.IfRange` object. + + .. versionadded:: 0.7 + """ + if not value: + return IfRange() + date = parse_date(value) + if date is not None: + return IfRange(date=date) + # drop weakness information + return IfRange(unquote_etag(value)[0]) + + +def parse_range_header(value, make_inclusive=True): + """Parses a range header into a :class:`~werkzeug.datastructures.Range` + object. If the header is missing or malformed `None` is returned. + `ranges` is a list of ``(start, stop)`` tuples where the ranges are + non-inclusive. + + .. versionadded:: 0.7 + """ + if not value or "=" not in value: + return None + + ranges = [] + last_end = 0 + units, rng = value.split("=", 1) + units = units.strip().lower() + + for item in rng.split(","): + item = item.strip() + if "-" not in item: + return None + if item.startswith("-"): + if last_end < 0: + return None + try: + begin = int(item) + except ValueError: + return None + end = None + last_end = -1 + elif "-" in item: + begin, end = item.split("-", 1) + begin = begin.strip() + end = end.strip() + if not begin.isdigit(): + return None + begin = int(begin) + if begin < last_end or last_end < 0: + return None + if end: + if not end.isdigit(): + return None + end = int(end) + 1 + if begin >= end: + return None + else: + end = None + last_end = end + ranges.append((begin, end)) + + return Range(units, ranges) + + +def parse_content_range_header(value, on_update=None): + """Parses a range header into a + :class:`~werkzeug.datastructures.ContentRange` object or `None` if + parsing is not possible. + + .. versionadded:: 0.7 + + :param value: a content range header to be parsed. + :param on_update: an optional callable that is called every time a value + on the :class:`~werkzeug.datastructures.ContentRange` + object is changed. + """ + if value is None: + return None + try: + units, rangedef = (value or "").strip().split(None, 1) + except ValueError: + return None + + if "/" not in rangedef: + return None + rng, length = rangedef.split("/", 1) + if length == "*": + length = None + elif length.isdigit(): + length = int(length) + else: + return None + + if rng == "*": + return ContentRange(units, None, None, length, on_update=on_update) + elif "-" not in rng: + return None + + start, stop = rng.split("-", 1) + try: + start = int(start) + stop = int(stop) + 1 + except ValueError: + return None + + if is_byte_range_valid(start, stop, length): + return ContentRange(units, start, stop, length, on_update=on_update) + + +def quote_etag(etag, weak=False): + """Quote an etag. + + :param etag: the etag to quote. + :param weak: set to `True` to tag it "weak". + """ + if '"' in etag: + raise ValueError("invalid etag") + etag = '"%s"' % etag + if weak: + etag = "W/" + etag + return etag + + +def unquote_etag(etag): + """Unquote a single etag: + + >>> unquote_etag('W/"bar"') + ('bar', True) + >>> unquote_etag('"bar"') + ('bar', False) + + :param etag: the etag identifier to unquote. + :return: a ``(etag, weak)`` tuple. + """ + if not etag: + return None, None + etag = etag.strip() + weak = False + if etag.startswith(("W/", "w/")): + weak = True + etag = etag[2:] + if etag[:1] == etag[-1:] == '"': + etag = etag[1:-1] + return etag, weak + + +def parse_etags(value): + """Parse an etag header. + + :param value: the tag header to parse + :return: an :class:`~werkzeug.datastructures.ETags` object. + """ + if not value: + return ETags() + strong = [] + weak = [] + end = len(value) + pos = 0 + while pos < end: + match = _etag_re.match(value, pos) + if match is None: + break + is_weak, quoted, raw = match.groups() + if raw == "*": + return ETags(star_tag=True) + elif quoted: + raw = quoted + if is_weak: + weak.append(raw) + else: + strong.append(raw) + pos = match.end() + return ETags(strong, weak) + + +def generate_etag(data): + """Generate an etag for some data.""" + return md5(data).hexdigest() + + +def parse_date(value): + """Parse one of the following date formats into a datetime object: + + .. sourcecode:: text + + Sun, 06 Nov 1994 08:49:37 GMT ; RFC 822, updated by RFC 1123 + Sunday, 06-Nov-94 08:49:37 GMT ; RFC 850, obsoleted by RFC 1036 + Sun Nov 6 08:49:37 1994 ; ANSI C's asctime() format + + If parsing fails the return value is `None`. + + :param value: a string with a supported date format. + :return: a :class:`datetime.datetime` object. + """ + if value: + t = parsedate_tz(value.strip()) + if t is not None: + try: + year = t[0] + # unfortunately that function does not tell us if two digit + # years were part of the string, or if they were prefixed + # with two zeroes. So what we do is to assume that 69-99 + # refer to 1900, and everything below to 2000 + if year >= 0 and year <= 68: + year += 2000 + elif year >= 69 and year <= 99: + year += 1900 + return datetime(*((year,) + t[1:7])) - timedelta(seconds=t[-1] or 0) + except (ValueError, OverflowError): + return None + + +def _dump_date(d, delim): + """Used for `http_date` and `cookie_date`.""" + if d is None: + d = gmtime() + elif isinstance(d, datetime): + d = d.utctimetuple() + elif isinstance(d, (integer_types, float)): + d = gmtime(d) + return "%s, %02d%s%s%s%s %02d:%02d:%02d GMT" % ( + ("Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun")[d.tm_wday], + d.tm_mday, + delim, + ( + "Jan", + "Feb", + "Mar", + "Apr", + "May", + "Jun", + "Jul", + "Aug", + "Sep", + "Oct", + "Nov", + "Dec", + )[d.tm_mon - 1], + delim, + str(d.tm_year), + d.tm_hour, + d.tm_min, + d.tm_sec, + ) + + +def cookie_date(expires=None): + """Formats the time to ensure compatibility with Netscape's cookie + standard. + + Accepts a floating point number expressed in seconds since the epoch in, a + datetime object or a timetuple. All times in UTC. The :func:`parse_date` + function can be used to parse such a date. + + Outputs a string in the format ``Wdy, DD-Mon-YYYY HH:MM:SS GMT``. + + :param expires: If provided that date is used, otherwise the current. + """ + return _dump_date(expires, "-") + + +def http_date(timestamp=None): + """Formats the time to match the RFC1123 date format. + + Accepts a floating point number expressed in seconds since the epoch in, a + datetime object or a timetuple. All times in UTC. The :func:`parse_date` + function can be used to parse such a date. + + Outputs a string in the format ``Wdy, DD Mon YYYY HH:MM:SS GMT``. + + :param timestamp: If provided that date is used, otherwise the current. + """ + return _dump_date(timestamp, " ") + + +def parse_age(value=None): + """Parses a base-10 integer count of seconds into a timedelta. + + If parsing fails, the return value is `None`. + + :param value: a string consisting of an integer represented in base-10 + :return: a :class:`datetime.timedelta` object or `None`. + """ + if not value: + return None + try: + seconds = int(value) + except ValueError: + return None + if seconds < 0: + return None + try: + return timedelta(seconds=seconds) + except OverflowError: + return None + + +def dump_age(age=None): + """Formats the duration as a base-10 integer. + + :param age: should be an integer number of seconds, + a :class:`datetime.timedelta` object, or, + if the age is unknown, `None` (default). + """ + if age is None: + return + if isinstance(age, timedelta): + # do the equivalent of Python 2.7's timedelta.total_seconds(), + # but disregarding fractional seconds + age = age.seconds + (age.days * 24 * 3600) + + age = int(age) + if age < 0: + raise ValueError("age cannot be negative") + + return str(age) + + +def is_resource_modified( + environ, etag=None, data=None, last_modified=None, ignore_if_range=True +): + """Convenience method for conditional requests. + + :param environ: the WSGI environment of the request to be checked. + :param etag: the etag for the response for comparison. + :param data: or alternatively the data of the response to automatically + generate an etag using :func:`generate_etag`. + :param last_modified: an optional date of the last modification. + :param ignore_if_range: If `False`, `If-Range` header will be taken into + account. + :return: `True` if the resource was modified, otherwise `False`. + """ + if etag is None and data is not None: + etag = generate_etag(data) + elif data is not None: + raise TypeError("both data and etag given") + if environ["REQUEST_METHOD"] not in ("GET", "HEAD"): + return False + + unmodified = False + if isinstance(last_modified, string_types): + last_modified = parse_date(last_modified) + + # ensure that microsecond is zero because the HTTP spec does not transmit + # that either and we might have some false positives. See issue #39 + if last_modified is not None: + last_modified = last_modified.replace(microsecond=0) + + if_range = None + if not ignore_if_range and "HTTP_RANGE" in environ: + # https://tools.ietf.org/html/rfc7233#section-3.2 + # A server MUST ignore an If-Range header field received in a request + # that does not contain a Range header field. + if_range = parse_if_range_header(environ.get("HTTP_IF_RANGE")) + + if if_range is not None and if_range.date is not None: + modified_since = if_range.date + else: + modified_since = parse_date(environ.get("HTTP_IF_MODIFIED_SINCE")) + + if modified_since and last_modified and last_modified <= modified_since: + unmodified = True + + if etag: + etag, _ = unquote_etag(etag) + if if_range is not None and if_range.etag is not None: + unmodified = parse_etags(if_range.etag).contains(etag) + else: + if_none_match = parse_etags(environ.get("HTTP_IF_NONE_MATCH")) + if if_none_match: + # https://tools.ietf.org/html/rfc7232#section-3.2 + # "A recipient MUST use the weak comparison function when comparing + # entity-tags for If-None-Match" + unmodified = if_none_match.contains_weak(etag) + + # https://tools.ietf.org/html/rfc7232#section-3.1 + # "Origin server MUST use the strong comparison function when + # comparing entity-tags for If-Match" + if_match = parse_etags(environ.get("HTTP_IF_MATCH")) + if if_match: + unmodified = not if_match.is_strong(etag) + + return not unmodified + + +def remove_entity_headers(headers, allowed=("expires", "content-location")): + """Remove all entity headers from a list or :class:`Headers` object. This + operation works in-place. `Expires` and `Content-Location` headers are + by default not removed. The reason for this is :rfc:`2616` section + 10.3.5 which specifies some entity headers that should be sent. + + .. versionchanged:: 0.5 + added `allowed` parameter. + + :param headers: a list or :class:`Headers` object. + :param allowed: a list of headers that should still be allowed even though + they are entity headers. + """ + allowed = set(x.lower() for x in allowed) + headers[:] = [ + (key, value) + for key, value in headers + if not is_entity_header(key) or key.lower() in allowed + ] + + +def remove_hop_by_hop_headers(headers): + """Remove all HTTP/1.1 "Hop-by-Hop" headers from a list or + :class:`Headers` object. This operation works in-place. + + .. versionadded:: 0.5 + + :param headers: a list or :class:`Headers` object. + """ + headers[:] = [ + (key, value) for key, value in headers if not is_hop_by_hop_header(key) + ] + + +def is_entity_header(header): + """Check if a header is an entity header. + + .. versionadded:: 0.5 + + :param header: the header to test. + :return: `True` if it's an entity header, `False` otherwise. + """ + return header.lower() in _entity_headers + + +def is_hop_by_hop_header(header): + """Check if a header is an HTTP/1.1 "Hop-by-Hop" header. + + .. versionadded:: 0.5 + + :param header: the header to test. + :return: `True` if it's an HTTP/1.1 "Hop-by-Hop" header, `False` otherwise. + """ + return header.lower() in _hop_by_hop_headers + + +def parse_cookie(header, charset="utf-8", errors="replace", cls=None): + """Parse a cookie. Either from a string or WSGI environ. + + Per default encoding errors are ignored. If you want a different behavior + you can set `errors` to ``'replace'`` or ``'strict'``. In strict mode a + :exc:`HTTPUnicodeError` is raised. + + .. versionchanged:: 0.5 + This function now returns a :class:`TypeConversionDict` instead of a + regular dict. The `cls` parameter was added. + + :param header: the header to be used to parse the cookie. Alternatively + this can be a WSGI environment. + :param charset: the charset for the cookie values. + :param errors: the error behavior for the charset decoding. + :param cls: an optional dict class to use. If this is not specified + or `None` the default :class:`TypeConversionDict` is + used. + """ + if isinstance(header, dict): + header = header.get("HTTP_COOKIE", "") + elif header is None: + header = "" + + # If the value is an unicode string it's mangled through latin1. This + # is done because on PEP 3333 on Python 3 all headers are assumed latin1 + # which however is incorrect for cookies, which are sent in page encoding. + # As a result we + if isinstance(header, text_type): + header = header.encode("latin1", "replace") + + if cls is None: + cls = TypeConversionDict + + def _parse_pairs(): + for key, val in _cookie_parse_impl(header): + key = to_unicode(key, charset, errors, allow_none_charset=True) + if not key: + continue + val = to_unicode(val, charset, errors, allow_none_charset=True) + yield try_coerce_native(key), val + + return cls(_parse_pairs()) + + +def dump_cookie( + key, + value="", + max_age=None, + expires=None, + path="/", + domain=None, + secure=False, + httponly=False, + charset="utf-8", + sync_expires=True, + max_size=4093, + samesite=None, +): + """Creates a new Set-Cookie header without the ``Set-Cookie`` prefix + The parameters are the same as in the cookie Morsel object in the + Python standard library but it accepts unicode data, too. + + On Python 3 the return value of this function will be a unicode + string, on Python 2 it will be a native string. In both cases the + return value is usually restricted to ascii as the vast majority of + values are properly escaped, but that is no guarantee. If a unicode + string is returned it's tunneled through latin1 as required by + PEP 3333. + + The return value is not ASCII safe if the key contains unicode + characters. This is technically against the specification but + happens in the wild. It's strongly recommended to not use + non-ASCII values for the keys. + + :param max_age: should be a number of seconds, or `None` (default) if + the cookie should last only as long as the client's + browser session. Additionally `timedelta` objects + are accepted, too. + :param expires: should be a `datetime` object or unix timestamp. + :param path: limits the cookie to a given path, per default it will + span the whole domain. + :param domain: Use this if you want to set a cross-domain cookie. For + example, ``domain=".example.com"`` will set a cookie + that is readable by the domain ``www.example.com``, + ``foo.example.com`` etc. Otherwise, a cookie will only + be readable by the domain that set it. + :param secure: The cookie will only be available via HTTPS + :param httponly: disallow JavaScript to access the cookie. This is an + extension to the cookie standard and probably not + supported by all browsers. + :param charset: the encoding for unicode values. + :param sync_expires: automatically set expires if max_age is defined + but expires not. + :param max_size: Warn if the final header value exceeds this size. The + default, 4093, should be safely `supported by most browsers + `_. Set to 0 to disable this check. + :param samesite: Limits the scope of the cookie such that it will only + be attached to requests if those requests are "same-site". + + .. _`cookie`: http://browsercookielimits.squawky.net/ + """ + key = to_bytes(key, charset) + value = to_bytes(value, charset) + + if path is not None: + from .urls import iri_to_uri + + path = iri_to_uri(path, charset) + domain = _make_cookie_domain(domain) + if isinstance(max_age, timedelta): + max_age = (max_age.days * 60 * 60 * 24) + max_age.seconds + if expires is not None: + if not isinstance(expires, string_types): + expires = cookie_date(expires) + elif max_age is not None and sync_expires: + expires = to_bytes(cookie_date(time() + max_age)) + + samesite = samesite.title() if samesite else None + if samesite not in ("Strict", "Lax", None): + raise ValueError("invalid SameSite value; must be 'Strict', 'Lax' or None") + + buf = [key + b"=" + _cookie_quote(value)] + + # XXX: In theory all of these parameters that are not marked with `None` + # should be quoted. Because stdlib did not quote it before I did not + # want to introduce quoting there now. + for k, v, q in ( + (b"Domain", domain, True), + (b"Expires", expires, False), + (b"Max-Age", max_age, False), + (b"Secure", secure, None), + (b"HttpOnly", httponly, None), + (b"Path", path, False), + (b"SameSite", samesite, False), + ): + if q is None: + if v: + buf.append(k) + continue + + if v is None: + continue + + tmp = bytearray(k) + if not isinstance(v, (bytes, bytearray)): + v = to_bytes(text_type(v), charset) + if q: + v = _cookie_quote(v) + tmp += b"=" + v + buf.append(bytes(tmp)) + + # The return value will be an incorrectly encoded latin1 header on + # Python 3 for consistency with the headers object and a bytestring + # on Python 2 because that's how the API makes more sense. + rv = b"; ".join(buf) + if not PY2: + rv = rv.decode("latin1") + + # Warn if the final value of the cookie is less than the limit. If the + # cookie is too large, then it may be silently ignored, which can be quite + # hard to debug. + cookie_size = len(rv) + + if max_size and cookie_size > max_size: + value_size = len(value) + warnings.warn( + 'The "{key}" cookie is too large: the value was {value_size} bytes' + " but the header required {extra_size} extra bytes. The final size" + " was {cookie_size} bytes but the limit is {max_size} bytes." + " Browsers may silently ignore cookies larger than this.".format( + key=key, + value_size=value_size, + extra_size=cookie_size - value_size, + cookie_size=cookie_size, + max_size=max_size, + ), + stacklevel=2, + ) + + return rv + + +def is_byte_range_valid(start, stop, length): + """Checks if a given byte content range is valid for the given length. + + .. versionadded:: 0.7 + """ + if (start is None) != (stop is None): + return False + elif start is None: + return length is None or length >= 0 + elif length is None: + return 0 <= start < stop + elif start >= stop: + return False + return 0 <= start < length + + +# circular dependencies +from .datastructures import Accept +from .datastructures import Authorization +from .datastructures import ContentRange +from .datastructures import ETags +from .datastructures import HeaderSet +from .datastructures import IfRange +from .datastructures import Range +from .datastructures import RequestCacheControl +from .datastructures import TypeConversionDict +from .datastructures import WWWAuthenticate + +from werkzeug import _DeprecatedImportModule + +_DeprecatedImportModule( + __name__, + {".datastructures": ["CharsetAccept", "Headers", "LanguageAccept", "MIMEAccept"]}, + "Werkzeug 1.0", +) +del _DeprecatedImportModule diff --git a/env/Lib/site-packages/werkzeug/local.py b/env/Lib/site-packages/werkzeug/local.py new file mode 100644 index 0000000..9a6088c --- /dev/null +++ b/env/Lib/site-packages/werkzeug/local.py @@ -0,0 +1,421 @@ +# -*- coding: utf-8 -*- +""" + werkzeug.local + ~~~~~~~~~~~~~~ + + This module implements context-local objects. + + :copyright: 2007 Pallets + :license: BSD-3-Clause +""" +import copy +from functools import update_wrapper + +from ._compat import implements_bool +from ._compat import PY2 +from .wsgi import ClosingIterator + +# since each thread has its own greenlet we can just use those as identifiers +# for the context. If greenlets are not available we fall back to the +# current thread ident depending on where it is. +try: + from greenlet import getcurrent as get_ident +except ImportError: + try: + from thread import get_ident + except ImportError: + from _thread import get_ident + + +def release_local(local): + """Releases the contents of the local for the current context. + This makes it possible to use locals without a manager. + + Example:: + + >>> loc = Local() + >>> loc.foo = 42 + >>> release_local(loc) + >>> hasattr(loc, 'foo') + False + + With this function one can release :class:`Local` objects as well + as :class:`LocalStack` objects. However it is not possible to + release data held by proxies that way, one always has to retain + a reference to the underlying local object in order to be able + to release it. + + .. versionadded:: 0.6.1 + """ + local.__release_local__() + + +class Local(object): + __slots__ = ("__storage__", "__ident_func__") + + def __init__(self): + object.__setattr__(self, "__storage__", {}) + object.__setattr__(self, "__ident_func__", get_ident) + + def __iter__(self): + return iter(self.__storage__.items()) + + def __call__(self, proxy): + """Create a proxy for a name.""" + return LocalProxy(self, proxy) + + def __release_local__(self): + self.__storage__.pop(self.__ident_func__(), None) + + def __getattr__(self, name): + try: + return self.__storage__[self.__ident_func__()][name] + except KeyError: + raise AttributeError(name) + + def __setattr__(self, name, value): + ident = self.__ident_func__() + storage = self.__storage__ + try: + storage[ident][name] = value + except KeyError: + storage[ident] = {name: value} + + def __delattr__(self, name): + try: + del self.__storage__[self.__ident_func__()][name] + except KeyError: + raise AttributeError(name) + + +class LocalStack(object): + """This class works similar to a :class:`Local` but keeps a stack + of objects instead. This is best explained with an example:: + + >>> ls = LocalStack() + >>> ls.push(42) + >>> ls.top + 42 + >>> ls.push(23) + >>> ls.top + 23 + >>> ls.pop() + 23 + >>> ls.top + 42 + + They can be force released by using a :class:`LocalManager` or with + the :func:`release_local` function but the correct way is to pop the + item from the stack after using. When the stack is empty it will + no longer be bound to the current context (and as such released). + + By calling the stack without arguments it returns a proxy that resolves to + the topmost item on the stack. + + .. versionadded:: 0.6.1 + """ + + def __init__(self): + self._local = Local() + + def __release_local__(self): + self._local.__release_local__() + + def _get__ident_func__(self): + return self._local.__ident_func__ + + def _set__ident_func__(self, value): + object.__setattr__(self._local, "__ident_func__", value) + + __ident_func__ = property(_get__ident_func__, _set__ident_func__) + del _get__ident_func__, _set__ident_func__ + + def __call__(self): + def _lookup(): + rv = self.top + if rv is None: + raise RuntimeError("object unbound") + return rv + + return LocalProxy(_lookup) + + def push(self, obj): + """Pushes a new item to the stack""" + rv = getattr(self._local, "stack", None) + if rv is None: + self._local.stack = rv = [] + rv.append(obj) + return rv + + def pop(self): + """Removes the topmost item from the stack, will return the + old value or `None` if the stack was already empty. + """ + stack = getattr(self._local, "stack", None) + if stack is None: + return None + elif len(stack) == 1: + release_local(self._local) + return stack[-1] + else: + return stack.pop() + + @property + def top(self): + """The topmost item on the stack. If the stack is empty, + `None` is returned. + """ + try: + return self._local.stack[-1] + except (AttributeError, IndexError): + return None + + +class LocalManager(object): + """Local objects cannot manage themselves. For that you need a local + manager. You can pass a local manager multiple locals or add them later + by appending them to `manager.locals`. Every time the manager cleans up, + it will clean up all the data left in the locals for this context. + + The `ident_func` parameter can be added to override the default ident + function for the wrapped locals. + + .. versionchanged:: 0.6.1 + Instead of a manager the :func:`release_local` function can be used + as well. + + .. versionchanged:: 0.7 + `ident_func` was added. + """ + + def __init__(self, locals=None, ident_func=None): + if locals is None: + self.locals = [] + elif isinstance(locals, Local): + self.locals = [locals] + else: + self.locals = list(locals) + if ident_func is not None: + self.ident_func = ident_func + for local in self.locals: + object.__setattr__(local, "__ident_func__", ident_func) + else: + self.ident_func = get_ident + + def get_ident(self): + """Return the context identifier the local objects use internally for + this context. You cannot override this method to change the behavior + but use it to link other context local objects (such as SQLAlchemy's + scoped sessions) to the Werkzeug locals. + + .. versionchanged:: 0.7 + You can pass a different ident function to the local manager that + will then be propagated to all the locals passed to the + constructor. + """ + return self.ident_func() + + def cleanup(self): + """Manually clean up the data in the locals for this context. Call + this at the end of the request or use `make_middleware()`. + """ + for local in self.locals: + release_local(local) + + def make_middleware(self, app): + """Wrap a WSGI application so that cleaning up happens after + request end. + """ + + def application(environ, start_response): + return ClosingIterator(app(environ, start_response), self.cleanup) + + return application + + def middleware(self, func): + """Like `make_middleware` but for decorating functions. + + Example usage:: + + @manager.middleware + def application(environ, start_response): + ... + + The difference to `make_middleware` is that the function passed + will have all the arguments copied from the inner application + (name, docstring, module). + """ + return update_wrapper(self.make_middleware(func), func) + + def __repr__(self): + return "<%s storages: %d>" % (self.__class__.__name__, len(self.locals)) + + +@implements_bool +class LocalProxy(object): + """Acts as a proxy for a werkzeug local. Forwards all operations to + a proxied object. The only operations not supported for forwarding + are right handed operands and any kind of assignment. + + Example usage:: + + from werkzeug.local import Local + l = Local() + + # these are proxies + request = l('request') + user = l('user') + + + from werkzeug.local import LocalStack + _response_local = LocalStack() + + # this is a proxy + response = _response_local() + + Whenever something is bound to l.user / l.request the proxy objects + will forward all operations. If no object is bound a :exc:`RuntimeError` + will be raised. + + To create proxies to :class:`Local` or :class:`LocalStack` objects, + call the object as shown above. If you want to have a proxy to an + object looked up by a function, you can (as of Werkzeug 0.6.1) pass + a function to the :class:`LocalProxy` constructor:: + + session = LocalProxy(lambda: get_current_request().session) + + .. versionchanged:: 0.6.1 + The class can be instantiated with a callable as well now. + """ + + __slots__ = ("__local", "__dict__", "__name__", "__wrapped__") + + def __init__(self, local, name=None): + object.__setattr__(self, "_LocalProxy__local", local) + object.__setattr__(self, "__name__", name) + if callable(local) and not hasattr(local, "__release_local__"): + # "local" is a callable that is not an instance of Local or + # LocalManager: mark it as a wrapped function. + object.__setattr__(self, "__wrapped__", local) + + def _get_current_object(self): + """Return the current object. This is useful if you want the real + object behind the proxy at a time for performance reasons or because + you want to pass the object into a different context. + """ + if not hasattr(self.__local, "__release_local__"): + return self.__local() + try: + return getattr(self.__local, self.__name__) + except AttributeError: + raise RuntimeError("no object bound to %s" % self.__name__) + + @property + def __dict__(self): + try: + return self._get_current_object().__dict__ + except RuntimeError: + raise AttributeError("__dict__") + + def __repr__(self): + try: + obj = self._get_current_object() + except RuntimeError: + return "<%s unbound>" % self.__class__.__name__ + return repr(obj) + + def __bool__(self): + try: + return bool(self._get_current_object()) + except RuntimeError: + return False + + def __unicode__(self): + try: + return unicode(self._get_current_object()) # noqa + except RuntimeError: + return repr(self) + + def __dir__(self): + try: + return dir(self._get_current_object()) + except RuntimeError: + return [] + + def __getattr__(self, name): + if name == "__members__": + return dir(self._get_current_object()) + return getattr(self._get_current_object(), name) + + def __setitem__(self, key, value): + self._get_current_object()[key] = value + + def __delitem__(self, key): + del self._get_current_object()[key] + + if PY2: + __getslice__ = lambda x, i, j: x._get_current_object()[i:j] + + def __setslice__(self, i, j, seq): + self._get_current_object()[i:j] = seq + + def __delslice__(self, i, j): + del self._get_current_object()[i:j] + + __setattr__ = lambda x, n, v: setattr(x._get_current_object(), n, v) + __delattr__ = lambda x, n: delattr(x._get_current_object(), n) + __str__ = lambda x: str(x._get_current_object()) + __lt__ = lambda x, o: x._get_current_object() < o + __le__ = lambda x, o: x._get_current_object() <= o + __eq__ = lambda x, o: x._get_current_object() == o + __ne__ = lambda x, o: x._get_current_object() != o + __gt__ = lambda x, o: x._get_current_object() > o + __ge__ = lambda x, o: x._get_current_object() >= o + __cmp__ = lambda x, o: cmp(x._get_current_object(), o) # noqa + __hash__ = lambda x: hash(x._get_current_object()) + __call__ = lambda x, *a, **kw: x._get_current_object()(*a, **kw) + __len__ = lambda x: len(x._get_current_object()) + __getitem__ = lambda x, i: x._get_current_object()[i] + __iter__ = lambda x: iter(x._get_current_object()) + __contains__ = lambda x, i: i in x._get_current_object() + __add__ = lambda x, o: x._get_current_object() + o + __sub__ = lambda x, o: x._get_current_object() - o + __mul__ = lambda x, o: x._get_current_object() * o + __floordiv__ = lambda x, o: x._get_current_object() // o + __mod__ = lambda x, o: x._get_current_object() % o + __divmod__ = lambda x, o: x._get_current_object().__divmod__(o) + __pow__ = lambda x, o: x._get_current_object() ** o + __lshift__ = lambda x, o: x._get_current_object() << o + __rshift__ = lambda x, o: x._get_current_object() >> o + __and__ = lambda x, o: x._get_current_object() & o + __xor__ = lambda x, o: x._get_current_object() ^ o + __or__ = lambda x, o: x._get_current_object() | o + __div__ = lambda x, o: x._get_current_object().__div__(o) + __truediv__ = lambda x, o: x._get_current_object().__truediv__(o) + __neg__ = lambda x: -(x._get_current_object()) + __pos__ = lambda x: +(x._get_current_object()) + __abs__ = lambda x: abs(x._get_current_object()) + __invert__ = lambda x: ~(x._get_current_object()) + __complex__ = lambda x: complex(x._get_current_object()) + __int__ = lambda x: int(x._get_current_object()) + __long__ = lambda x: long(x._get_current_object()) # noqa + __float__ = lambda x: float(x._get_current_object()) + __oct__ = lambda x: oct(x._get_current_object()) + __hex__ = lambda x: hex(x._get_current_object()) + __index__ = lambda x: x._get_current_object().__index__() + __coerce__ = lambda x, o: x._get_current_object().__coerce__(x, o) + __enter__ = lambda x: x._get_current_object().__enter__() + __exit__ = lambda x, *a, **kw: x._get_current_object().__exit__(*a, **kw) + __radd__ = lambda x, o: o + x._get_current_object() + __rsub__ = lambda x, o: o - x._get_current_object() + __rmul__ = lambda x, o: o * x._get_current_object() + __rdiv__ = lambda x, o: o / x._get_current_object() + if PY2: + __rtruediv__ = lambda x, o: x._get_current_object().__rtruediv__(o) + else: + __rtruediv__ = __rdiv__ + __rfloordiv__ = lambda x, o: o // x._get_current_object() + __rmod__ = lambda x, o: o % x._get_current_object() + __rdivmod__ = lambda x, o: x._get_current_object().__rdivmod__(o) + __copy__ = lambda x: copy.copy(x._get_current_object()) + __deepcopy__ = lambda x, memo: copy.deepcopy(x._get_current_object(), memo) diff --git a/env/Lib/site-packages/werkzeug/middleware/__init__.py b/env/Lib/site-packages/werkzeug/middleware/__init__.py new file mode 100644 index 0000000..5e049f5 --- /dev/null +++ b/env/Lib/site-packages/werkzeug/middleware/__init__.py @@ -0,0 +1,25 @@ +""" +Middleware +========== + +A WSGI middleware is a WSGI application that wraps another application +in order to observe or change its behavior. Werkzeug provides some +middleware for common use cases. + +.. toctree:: + :maxdepth: 1 + + proxy_fix + shared_data + dispatcher + http_proxy + lint + profiler + +The :doc:`interactive debugger ` is also a middleware that can +be applied manually, although it is typically used automatically with +the :doc:`development server `. + +:copyright: 2007 Pallets +:license: BSD-3-Clause +""" diff --git a/env/Lib/site-packages/werkzeug/middleware/__pycache__/__init__.cpython-37.pyc b/env/Lib/site-packages/werkzeug/middleware/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..bdcc3a244b7a3db48de434a6f62d9d3d9ec382db GIT binary patch literal 737 zcmYjP&59H;5boKFOJE{d`|#dU7H%majj5Uq3#|vR|EXCj(aA@JYvf>Fi6U2ea(- zNIl|*;)B(?#*K<7Uf+ul=WsQ9`wp7>DA)vQ?^Gewwp3)j12T$W6II}-^JFl>L0DJ^ zK5BN72fs`h*T@bijdB%&r36bfYHfWS!4<}D-?6PAM8CEg6C~fDI2d8orTV7fzHLG% zRl+n9Vl?9NB}K$M7r>G?YO67j$>EvkJzR3TlPkOJtz;OkmRgbOZEaIfRPyk>X^4XC zGkUYOj(UY%D_ip;F*gXg_GP}{7)Di+WndbYZB;SYv!}f}S@fjU$un~YFnZ2P<-`*A zWTA#exmMNn?g^-xjBhK$>~!h03(Pe~I>;JSOTJ<1_pXg4BbfBtVKlC>_Mt&X&~x35 z(ka$elLa%Cmp<&GtqkSxd^~;ypSUto5;-pvUBVouv&-R&;YF>uo%nbkr+_SdHa&Rord3*xatV d_|HlqrFE919EIJ@@mb?_TjS&*cl^UA`v-s;?&|;m literal 0 HcmV?d00001 diff --git a/env/Lib/site-packages/werkzeug/middleware/__pycache__/dispatcher.cpython-37.pyc b/env/Lib/site-packages/werkzeug/middleware/__pycache__/dispatcher.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..af9a9ec7fd5f522fddc5e6eb95b1979db45c9671 GIT binary patch literal 2426 zcmZ`)+in|07~X^9q)Q4FRGcKFQ4lJY5;uSZlGUQ73ACvi6V#*_ru|-}nD>^Ww$8!SldisSrE zANA9~yW(vla_FwTrh4`az5^lt4kzM!-?;sq16X2XgsNXBuYavaVI z*m^?*2C{KlNWrY+Xe6~v3wHnBT?Y4#Ogjj+Sd=9RT$ZOiAx-e=M5_Wmz?EL*%054o zY$3jNb^>#fO|mgN;>VKl;DASuWGdL!KAgtL*+^$FjVY;m5oeX_XhOiY7zE zaGmLFOeO=Iq0a-Iofrh9;Uxx~O_`RD$I@8GgsMZy;h7;*iIs!QvD9rOSI+GtqFGXJ z_xJ8v|L*kINFiM7hB?Z{v0w+1Sp|ZPGL2J{fU<;TqXew1UFEr2L(VL8b-rE!1VU8? z@|=xR0oN;`b=u$}L3ltkm~GL@8f_wBcI(_93d4p~Wsp3@Cpi_z71qIdI!vb%1Pl-K zvg-@P+nZ7AOB+;J+3kLRzsjy=u{@UXdO&Uw&8p}S9F(3;Xr;(rA%2Cb zVF%oR%HV38Rdv>806LgauFfwQZ1I#lBJ`M$d7MokdZGX)xFB;5W}TN;oHGv!wEjxryLLBH2!f*67GEp0(xf)q8&P!rOVu9|G zUMW~Ytr)o1rpSXTgmXi7!*tjl&rRiDuH{IbqUc_wVpW8-X;8IN(~SrhdT8|U-^Slu z#;bHoCv-|LUsVofzze9j-Ih1?5#F>}nQr;hhLQ0|ldL8se>i#x!^?2HGrSLqnqj|p zbGVh~JG|h-yC{Ho*q2E@%vHWYbq5k{q~Gep&G2+Id?59sCvto^JgF!1n`T(Mk4BkK zrYm8nQdNZE2Fw|{@f^45KKX2?zG(EEHtqWCEMDB04$0Vff5)VBpW8d~g?Hu)@2qj! z6@KYIYU*z3m(D{MvrQUH{}bnIY2PXR=eR{h=aSXm6dvZw<#OqN1dF11%_$ogU5q$UdQXY_%iY0+{jL7(aJT#8PgCcmd-Wf% z-g&Zg^$YWb8NAcmzPG#I54&4?KeQTC|4i4WcJ3JremEc@N|q&2mhCYuMaC{g(y}*Buv)DpnU=Jrg%}ZzyjVJeA-X{h zIhcXE2jY)`s#K^gX;bAY<(d;&l}qlqB~__PrE*ISdz|Z@w1*sW^eNx#8GxkhEmtzA zY4p75e*OCWeDC$#o|>{5u3!J_e}DC#Z!z|JdKg_LbUwwc{uT{qO~wsw21e81Ic^1J zH`mM=4E=myb@R=XpI&3CS^gCZ%`e$q#%*4H#&}s&_H)fs++1PR$-UUV?J2+Q+-o$Jon;yA?Akwj z?XvCpdB^L=Q9JOIs@2kAzw|i|#I`4eZP(gSZ&&*38*$CKzPR{_v+M{ zs5!S+KD+kOwL5{=SHgY;EwK746K&N0x?Z#I7Iq`mw8GDZDOdg?8YJFmBUgqbrBbr?}OR&494yu>H)U*I+=DmkTc@V#?nLp1khX(sJRLJYbi7_~-qvp#8@_V7V?{e{ zFpR=r*Xfa=Qk#ut&pDpLbT4)=huF|S%>{#DyC`rrybvbi&f2aX@Ob6!{YJk2KMNb3@#v7*FrJ;mOZ zP+-FSHpv9Rx?Yb6+AuvSI{uEfj~=1fa-rJNU!%oHc^i?!%;@;`;;2?j%|b?lk({5s z9tj_SI_G??8PXuSW*1cK#eREXw)WZ^{WkU_To>?_QRN z3$t@4xDCfo!)hwbk_S6!aW}LB2vD zxv!ul@QkC(hA=5PnJ-D*By_7KMK^jX+*Fgt`90nc+L6F09iz3GX}lw&u70Ma)&zV& zjF%&E{dg=_77D3oBnL){j@J*gd$(Gjdw~+I)<_=O|8X%|t=SudST|=|E$4%5X7y;> zvy>P^E7g$+&VlCc0^yV$_C^y65Bq!#Q-YbfeacPu9{%7h%#TCI8%LbxAXt{-+I z?sq75#;Qp%ODi0ZlJ1WdxfSlFkl{S_g1-1c-Y}0GiNEa=9AN``>R4wf+#Z+nmW~Iw zj3=>L$4P+~aH0c2AyAz$uMBrG-HbQ?M=kdC@W@rhQz)Jf4t>;o1-k`rDQsat!%ZHacBhWx0I> z39wPeU++sjPt7|kg2Ir1QUgn>sS|wK8~t$0RsJ4Q{t8<1B2Cjy1W?ap)~VV_Q#I0L znjuIY@>xI<0!{1M|Q0{gEiBX6qY7)@MMdYwt~-AtAUV{{`4c?GS|uZq z!9F6UAD|hqubfqLXbepbgOP?0jdSb;8<_h>$NWo};fbm1-`t+Ha78VAYb?~Eo;>`~ z?^Sb&Ilq_~TZ!?sYRI$Tr&T21K=0d$8|xwzJ3V>xOInReSc~ob_=iOw&#M-a9KtcN zs5(jVaQCiCidg_A_E7|Zm^yqlpIAx+9f@NFlkZUTE;SA{WWAA?Bwj(Ls^5!?qhpFA{%7M~jC2Nthv z73ClFTBimh*)D+2wkBR0($sIJX)S(wn15;P*04&MpV>0;b}^pZoT5G9uDmpQm-!nn ztj$yW>^He#A^cR2d{d8XVdV6&k#&BKMnd-U(9nf%ER3IyPxG0BGc@ZEVDvY}pm6ZU zA-p|4JHTFsMd;_^3>%gPC9M7TgCc+HJR6kGGrTEmzKOS&W*Dfa`P<**47RgKmig)f zMAF329!wmZJ7oMFEzN)NcR?u}oF7aKY{ICQ#*=?~%s{!I*P9_L56e5Z2jzo{kn=6* zYjQC8(o}_IHpss;xr`^Y6?j6cI+% z+^gs^CycKJB3zF*eXVUXSG-A*hSWeTIivlDQu(s4cC*R#yr6rNMpzuua?0NkmeBEJW-VY&&ZsT@C3@!^rBYmPP})$ zp$i2^wKqf;r@%fAZa5rXrFmB!95Z!KU7d5*aa_In_3-L^GWi!@EIs;_yV7`czkc^y z#lE98q>urzU z^HECs$a_*;A9+gb$AS1EPmx!^`(JP?T8&(U{6$|> zcaYQ{;Z~ob*{SVLBNl+Lo5+nrimnTYE^{-7??*pMV{4hEUycS$T}RZiG;cnJtCMrr zt5#xBL8o(3Qb<1#BzYlaB%u(Cqkw=DV2tX?_ps)XPs>m6_;0w?G#ZA~WE#`>l}yVp z&Ap%gKi!(7sa{DeiWf<-E8j+w6c7U<;dO;Y)iY9B;_R)ih*O%Vo`~oy5lK*&^Y#P@=-se^u0vtND4UX;$R6+PhCk;5GOW1 zS7k>SNq&(`fRL7Mi4EzpDo)}<6Vob7RgGEzl9wSKsTSvZA^(g<{JG{ScG@C6_RF6T zp+KJ>`U-m#o{GZ6#=MMi^;A+6>9@C}f?+at#~dlhn`NppW1RCzNh2t8GbsBpanE5x ziJc9@*STgHCo;K98VuKuFpZ?Z`dvw-w3bWnr<#|iiSTn`RY;FFsjIvX3LxO8^!5#U zTRsM4EfCaSqhZE0N}6fQHYbfUC?n6BXUsE(WtQMiwsA3M>;5$Q)Uzr*MHHiw zGpT2l0H!5ynl#Uv6{CW&XTYOmnxLR?!hOMhcVUe-;Rp9~K6=gWMp0Xvm8weXIeV@st}{%k0TTq-UM;DCJho zdUIm=R^y&~zyA3{Z1SjD)nRCB4^#93L9SxuYB5zq1AX}gHRJ~AEUgf&pOeXuid*_P ziwFjM z=2Z0mNZZIjE>$lmJD6E+K=*-H;wYNln;2%c{ASr zFZHE^XgS~=M9V?{5PBX)`H*)Q<-<}wg7OjXD9T5reAKs4bId!An&Yh5(wB~*=7jeQ zYMzlk$GvB7YW3&czX3?9w{Bj(>ReZ09Ja!abFCf3zN-FYm#bP`Tx&;8H}v`)-|4CF zZrk%C$91}G&+GX2T;)6Qnj1SkU#*0y8#$31wBt>uwdS`rA}0*c>{pllHTP~iR8F|U zvLow9zPjrx#|=Ek?e#kCmK(Rjpy6DNv(Yj$$Itcr-rVPJ;`%%t+w)rvHijKx<<6$l z?)Ex<*T+FTnZfNup@Z!OvWF<_`qft0?P5Py78kEOzEYvWX8Wx*$BmpI49@u79`>#L zs22ti&WPhUZ=QY2iDEbIM@}om!5h_Tqv5!Hz^&s((cGNC?t>f_)#_X;>}{&{>RLSK zoI88=51i|6r{l*_bq)vgG4Y)9{>_VL-aK=mBFV*#)9VIA#VfzP6-;YYb0cGCc!SV~!??v0K<879Ke1iz7e~KnX&51hhwu zg}ODeo6W%O`pxF3+H5BDgZEmqd8hAo(w0iI>4mLk^B*+Db>;E>rx)gKe+1fyZZF<^ z|Mq*m-bFWdZ(j>rZs+zQkaWA(?wx4|Kuf1{CU{$|o^9S=xqZu58w0<;di!4XQc&pa z4hXyfv`k`==W$1bv#m?{cLM{7=Lf(bv^5R}RpYs)_?YHnA0PQylehh>JAlVY+}YMx zeq!R$;)56eOSmuKj!xkbYeRiYkM)fS^->IE4bz%+bHzBK#nu*uod)z73xgMCUyf!$ z+;{qIP&jCs6cn9yR>Rm~Q@u2@NKYdZO^V=2c20-^{gqY-&bl9u%y4;qR0Zr?8y)|y z-x)g#k1?tV-#3%_UqMYoS*+lffhBz5b$Xx@X!~?HQXdd z)Qyo9`JI(fIVtZv5$L!LiPmhsj!6VNnm#x*wqzsg&>|D@;=07tW!%yGcqEwe^bJEj z8$%TVTR7U+rmh7i(zeousoq9gxo8_|>*l&O)c=+^tSl%_Klr6^nim3z0dTk4ca;m& z_z-Dv-2-jUGW>vg)pE{Xa7W4bNHqc0P_mO6!%r&tf;VynIVfgWkZon>$*CIzbCTebBke! zVZo*Yu>*+!c?P)+>FIlWtlt1NnjJq#=#V6+p21^eaesBdPztVEjdmbQ{Rk~E2DIo1 z9tqVMrlD62(jR}eF_;<09cSDfZ`Uxv58&;k9B+ntXFJ{kJ2t(_mi`4OZrxfhr5LnR z3^p(91$u}npWwgOj@Lrq4JYhVr9t09&1Oh}Y}^%T6p1*^HVmj2aEifS?!Y?7kp^(ZnJo)I2qJLJu~v$L=XjsFUnpNLLZ8FQHC^ z04Xvh2_q*7zM1w8hR&wV34?S@IVSVGjhD?T(66mS{NB_oEjD2FolUGhpk9wH4-8KB zjy2C>pHC9OQ(722H-?K@S}^2d(eZ%acHHqGl*??D1FIKNQ@{gUMo!pqU@BgYXf{7a zVsz?!<>N0K)QZp4E4u)VLluXB>^%FRpXuld7Y})P0{8l z0;Mt&&H7VvxsDZ9xKx6}DsVWyJsG`?3b{Yo8?7enNPDE`bO-fqq|2^!`qA1Rbn_ZU zu5(Q}^Ntl|U~ViB65N@rNV>m&WT;=%KAV1E47Eqv&>$@Cly4R0gW`z*0#QX~11(nfy;l+R6Lh%H~Frji;We=vO+WZ=KCPa5zWxEYQ z2dHwqD-SADBa9z2cd% z4d>K&0N2wi!Daos`)>~oXu}42mmZXdrAHIMU1aDsn}5mQ4wndgamkp#N#c;{o}6Usjls#M2hejEUubX{{(205@ysovhS`Nx7Hf@P0>qAn1TT;39!{GiF}((0;x>~QZY4LHv|HfsL+bqhr|c5^TJc;oi*{7IfJ2 zC>s=%C>iK6Lk2T)y_^UX7`Gxza;~DZi(}^@A#Ubv02p*sb5Aamt z0Vc8jR7(ur%BDszI&xNBwd}3}>LHx&79~z0gV>&kvIbPbcIh&jn7`lhdnC@?1vTuG zrsqRBngJ8ScbhGwiB( zPP2;jE!_DyZvV|>{&CB}y+pTzjeUPWSjwl^U$zN$Bgf7`2hQ~00orlAA& zji#@G=!&?z`xpx_E{kBqGD9b6tY0kOhnz8Kar2$}DFvQ#%0JwmoW=JbREgGTk6_pM+tzF{ErV*+`H&)`0ZHPuNjYw(5IK3jesHHBk`VpaU5)Z;<#!+oA;dnq zaV>`*WAL0Pm5X`jBr;Wm6pM)BSeH~wXKFM`KqVdofW;)+DnoU@ptxqt~p9kH2qM*@c;=*)5_Y;7Qe)7wNWD@dl| zbOPHfi_j>t2n~2>2-S2Y47Q#8WE&idJvcwvkrO(F%DVK({Y`QMZ;>mE(CiFOn;eq_ zI@O10A7j4U5M<^kGs}){-%nxtaTQ*)$Y{~aivNU{Bz!5!gA=g5bi}Pv+wA@;o&|0H zJbYhR#nA8$+Dk*G6ilz2#I^1?(C)fdIj(s&H1KWom?&C@`XkE&-##{AQSiMc@6guj z7emvV!l-GC`UOVq8=B+u4lVT?X!oqgZ_s0AXpQ#}xw?O0@VfAcAKY!LFkp~0i>0|_ zxxjKfJLxs0lU0&WvaoR14Z3Ocp^A7!gwF_B%+vtucT&*k9BjOWE?HXfP#Jsvk7N zpydx)ZdPC(j5+H1 zBZLh+<1yIixb^@J%@Cnq&)P7f#?YeS9sM+h^X|b|_AIabHH?SE(ex@Xg+B&6St&cM zNWY1(er3)DgB)zNp{c)?_Q|pK%FsY2(1ua`D`~40ZTG(r<9+a;6vI46uZfL`=wGlh z_b~-F{C62KU5pr(VCa`0RL~zzL0m=u@9>U{2H(HYRar*t8yiu6H2D}V2h8|yrER8Y zyYnp_0UGQWc`dFD&3IzV_(qSeNzeU7&v=TbkdWJS5^{rqZ>%r@ePDsu3MS?;`%xkZCDtO&UxpJvu7O-`7auNgX5`l(P_hH zNb>-$!;-|x2hNqmLQW19_wjjybM6eCPe%&T;MsHr)}_7&&YtdhaEYogT|euXWE;{{ z4iv1{2dqMUXRv{A=9odYrlWj+c?K424KH=jE+wE)z z>N1PWkaQ7uL2_|al5Osk6o<03G~E1V=64+f|3>FA0mED~#v$CtAPNlKV$cyz#0-SR zj8WB(!3VeX6L=lo@8A+S>PYw0^x^c9smy)d$9BG!$8aqIPgaWA=FzUR9eVmrc! zgM4TF%88I0?9jDw`n{GLA+1H`%NWtbyKwQ7|H1XWesXYRn-Q9se~pn13r)Cb@T$8U zg`Iw!+N0@r46uW-TGlDGN)ZITh!x}`1r^*iFXJcd~1cIvJxz7-Oa94y&zZX}uhL^?SDxft=x_vSfg+9;WIWvM?$NzvRaq(Bw{vvCTE z((QmVoPT~XmIqW_f}GeQbAl;N=;-HmWi{Ch`I$dAA0k#Z1oMG)z!+ZXxVEM9|Gb818SLP+Tt>N!a^<|Xs{LHY zt$n3^rGI67Wv*BreOUW}g}E3zwqOsJ@NN%FGVjE&^iY4OZJAJT)rCarzwln_rNWVj z-3=IF@x8G45TKF5c<|a-zuZ>i00-vdy%5H4o@#IGZL}sP>I%LOLzV-G@l^}pl8XT3 zO*=FC0uLsJ;v$7mB9 zDL^1kz=Ob}0LXku8w!#QV6`5mwOb~DL@S`e#Gi-{F^S*EGDLc_m8+%M%ukJkAEi5ECa7nTM5>J+io{d7h(n4p1t_B6n(D#gGqih)m4&!`?W9@Oa1?-(cubp4o$wvTk3PBQO zxstte*)a(uGGF$?jK#mcaxXG=^99SL8r1wfx>Dc;N?Ns%%)~VrX zNA*FY(=d(E5_;8WZs2qr(|BaW%r?aQV@Gn+pr4*?7PDU(vGph8zQJp}{@mbovGA%;Xqt)=Qn}*@sPSYq1d=(}!+mJ~wjD&P!VmgPim!(vQ|usAeas7|4G!&YQ0~<&8M;h!5B!+*MU*n|j#bzj zv7JPzNW>y|oUt%wqhu&qkZ|GXy#_ug1k0l2AdGhzPYy~Ff2x-2IIhe5p-O_t&$4#= zOwUixBzK&4kfb9S?)Fui{d#TfcWlFtBB3&;4fBXN6K!^9^X}?zRzHgTVJ4jaz(prPbHdZ}bUw3Dlfms_|q7mYAFCNN-evr`fFUX@$C!fjsd zRkg=Vc)r2so*SJyx8XA z_=9ej0V=!UzKB;?yD)n<&B!dSHcnUbKainPB4#RKq0&73o)YpLaNL4#2`Z0=@;vkN zXwpo$uY6WOkhIABeW-vvG-AL&1S*lE6_&(8ld%+gPE1hfvISEShu9woMxX@9f?=kT zL3jveJ0q3?N(8xXcS7g&5;^cyw@V^xK|)1l@EME((iJF)Fo+^zR?sT&8frG}fl&Q6 zna?fR=!ns5$Zx$QDly&*Ma02%-wz{yClc*K;#GK{+kHxG5`F|5ts<9+Xkv3<>o>@rq)9o*$*82cv6T1coQ8K|f%hDjsI>|RhNOZd*-VbFGce|Pi z4+EuRqtr(VHIy-2HF0K%>2~T%e?Sq{*5-UIz5uHOgkE8SlDde2HhTnk1Ac`10)7BP zG3T_ByzKaF_5~lb6d?$kn}JNg=V46_t~+?ix+G;6UuG2iQqg-P&0w6 z!xi>A3)geDnRuxTxiNL`m=%2TD3Z)Wt<0k_UP+8L$H(A0LY0t~)&--BNeS!a+(7 zd_9|=$p_4_n->sV!$hmt3S#UFnZb8K-;Z|%hbU|Auiii7v8k~~NpO;C1yV8#DO1n5 z;ao?^_eceekR3a^(-5;jkYqbqP530v{i24$TrtowcPgLw7iZ0q|-5Pcsd++M)`s_ zt4-eYX1tOwd9UESRnP5AM7>Uh*wqSdoqEZv)12kinV(_Rx%3JrNeb!a+pj)qZ-0>i zM%!DPceZb*>0KP3+kZ@8wCyc1NVn54T@7Odault`AIRM`?@4d_Q3>wt3Cg#pDBmu3 zmTo$Nu3i|2%JUwO>6&Paxtclo9lpI$)|}IN#+|GPDnyNoifIy<`q>AlT6c|aEPmyM z^}_CTuK(3xtj;&Mk zs8-C4t8W@d_2bH(&5g%%@?WZo_u4a4s^iK@?brlmBmO;&?bVM>UVFZKm*j)vkC+=_DblQc@0n#F>h4}Z@wC4dA%=u4!q#yGFTa=0#p?gj!hG@bd!K!AZ*$B0^xoDd5ASy7Hg0cy;yqaZ z_~Ezad%5Z6HWh8VL~Gpo>#dfZ*NQqYw<-NW&Z1b8H4wB+c?plhjnyCc!iSJe>F3ZP z@!IU^&*V{V9Deo#Z?o!9uKkfD3~7Zrb=Zm^liPbq7)#1Md4mS1@{$YGtrf*~UfC5Y zuTuGdG%W>A{XpbalF6Tgs^jqCAT6pVIY;a%dOFUurjnGQ@~SR*DDl!4Aw^3j=P}W8 z3JknMOW&a8r$k;a(=d793nWF7CPKo_o%B z9{g~AURQAZ@!NlY_RqH!U6u((BcY*V-=V|Ld*(QjRJ==x62_SnF+Mt#nP!hK|0++!vi z*p}7jAjX;BGks=Sha=DT@W9!_?RyUxcOKcob=aQiaf`W*-s$A$?{rv?n-&)|1mi*a z#0F*CVfz^7Gk2ev4l{?tzTGu_8<_IkN0fH0+U2^ z%seh0aj_V&1tNGsOmkiE&qv$??;h*A0~(2`2N6HfASO(FDCm_#Lzv)ZpLP2-cl@T5 zA9yCF*dtTe?#Rm)ASBeUNhv#vSda!M>I5_2Y0ujh{XBsYAw z$0IpFj`qG}BQF*#+>9ye@yfkXx0ft`5rVQ>-UoZkZJTxLW(!Gsc+j(mt$xw-DJbN5GFX;H;=fr z$j0u74WK)cM9)3OK0D)-E)(lOV6U&N-Fc0#@R5>*~a@=DN;)XK$Bz%yBT$@d1 zj(oSlP+rmT0VO^z~dKEUaHgoZ0^6^5u;Dva*3RkF%Y)OL}Vtcq2AqC8gHWnMn4SaZpf zrCYTpO1o;+t$AGMtOe^5uDUeXD`9n$bQheOD^*2Vk=7+we6De^GsZPzR64_v8Wu?| zuR@VgkhtixC7jdr02Z)UY=ei6t+kIgcGirQ)zz&|r+L8$aPPa>m}Bq2ZjMCX@VY%d z;1`d(?|ObV?EcQqrg48`d#BS`#LU}kTc50L8S5(_uh9$WwVa)JPCGX@w(#|ZY`Nlm z^3q6Nm5AW`_DRO&_MNQ#UEu?+u^D7DXFBr}?NM#;%|W|Z6Z<=S#e{mASCtuoza z4}3LKlvGbZp4Z0&T8xj35e(LqxJvH|HeiL%^8X4&0D^IAhwm;+MH z7NhBl0(&6)m=&V%UtJ7`nkj-uXycJ=P_laM!i?(q7-~9s!1jW50)xAe~qG-Be35P|p;G*#nYD2H<4%biBh> zhC?!h*!Q`Pj8owErP52#BF&T$54pl65_h7)(b9+x)QsIq$^RUWi%c%&)(yI$UA=Xq z5wVQrAfoUPl)ybY2i(GvmYX+zovvpEMxPjoHyTRL2cy1k4-rL0`q`8k-s$Az+3BPN zOmQ$8AjqJFS*ehlY%S*k(KYML&6I%0$(DT1GT$y;B1|>jy=-el!ZXR5PabJ+%PQ*PG&JTUiOmbF!G)wif7`nJ>MV7t%1f7E19TLI<)1- zHueJ%2Tk=T0;?O%^IK08p*>;btNJjhvg9zoJTeCTnNPN{c*au z)MG_H@nSEw{+)^#MNrd4JRuLdYB=xU^qOb_HBbyCD4EJ;HND<^~uz8jV!d!Z|-epsara++Z+r|ykvSoC;*Ur;h5DAy4s zYACD{6>5k>F^A?GMbvS5{--;w-QOcL_jY%-Kiq}kubRHO`;pr<`@1`QFx(y5!zF?q z#Bxi{`{H2PIN9HQ7`va{1YveFgxMu)7)zHl9EVlIupQesj1A1@Euc{fWi|Uvu589( zSu^>vOERT{uEf6-=j*ufl|$81ea+IW!j}bA36#SE#8xyvz^CNiGSiGrl0qyQ=}xO! z6n-TUc)IzqGsXraDN?M_1ZPmY%ot|ji9T4tWG{mVLZ2MOkRzoqCFOwVL@?KcHRrY# z<~T5iGFVAn0s$WA4LG1bGRY}A7nvu`(Xt(%3&bITcxbwD~Xu1RQ? zrg07qB;ODoFsK&0E_E3MV+ZyfnMgwobtqN$sLvnqexn#xVXu^HdSQ|7!mEiVgim-F zbxCDzsG^4PQhTFjo*qfr+c-U$;n$0*rfF(bn_NrPE4R2VaX<%MQw@6`4*@ccqdD?FQj`oCC3TX_TBso=}F@cGBHEK zB{@i3!onc7%XF!TE4YZOXu>koZ(#c3HF`4*6b&ts@-^xrpqLT0gI69AQM9UBREw}_ z5;xiPlyC`or1>)3_{vjhzRxr=-KRjs!=j}9C7?Y7@)QrpK~k#B84$#7HIAmwgMrxIve+pOgCQLv&#fpN{>VmD8u_#|{lw=U;RGowF0 zFqdW*CB*RuFUsO##7NK~F|`;RB)=_oUshZrW1~8OM1?E`I&0)|+y$mh@%BE4fyc(1 zu94G-VJa6jmQ!0vNHKas#<3?xp@=mtJ(K%<0cs^DAL0u zB@a=U9~S!DX%wY5YFFZI6U1p)ma_C_*br}^@2@zcNT5dU>6%(sCvUxgk5tPkK&9|l zYIzSz8mNcLX(1?BDs;MttA=X{SLpU>8B(ISzJz!l0RptWV3lNBeym!Rugg)NRs9-P zA$=ZV{X?QQ_ZS}Uv=UUrA+i8?#hc_2sh8%^Wp6d8ia!Tc3PI9dnz<%>=Yl!$k6;eH z1@z86EmPSOH1$BY7T%;lrg&5FD*sH~J zdRhYyT&*)~f(8Hox94)Ay)~zc+J*e$#uhXo=O%2yrzWGxgbkdL4; z*AQ+kAKkNUsE2 zY*@?HVABVxx#A%!gTgPo4YfQ&N&FOV#XHpejGA}RG>VfqlDsS{_sII-|KQB~`>0hvS6hPI zkW98^G<(j6B(h2AU9a`7*M8#+na!=WyAM8X)WQP%TUZ_qEmU$ORLlgv;>R@6PpC*S!8n?#h5T`W?QWhC-WW`N{w-oh!14Au9F w1zoRSTewtxt9nIHADqZCjivl2EW3M$yz9%3^QeW@n-ROWX;P0|BxF_i4?aoZrvLx| literal 0 HcmV?d00001 diff --git a/env/Lib/site-packages/werkzeug/middleware/__pycache__/shared_data.cpython-37.pyc b/env/Lib/site-packages/werkzeug/middleware/__pycache__/shared_data.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ee6f6d18ae6bf8386e103380bc28f2d7e93eb29b GIT binary patch literal 8017 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 EAJkW(fB*mh literal 0 HcmV?d00001 diff --git a/env/Lib/site-packages/werkzeug/middleware/dispatcher.py b/env/Lib/site-packages/werkzeug/middleware/dispatcher.py new file mode 100644 index 0000000..2eb173e --- /dev/null +++ b/env/Lib/site-packages/werkzeug/middleware/dispatcher.py @@ -0,0 +1,66 @@ +""" +Application Dispatcher +====================== + +This middleware creates a single WSGI application that dispatches to +multiple other WSGI applications mounted at different URL paths. + +A common example is writing a Single Page Application, where you have a +backend API and a frontend written in JavaScript that does the routing +in the browser rather than requesting different pages from the server. +The frontend is a single HTML and JS file that should be served for any +path besides "/api". + +This example dispatches to an API app under "/api", an admin app +under "/admin", and an app that serves frontend files for all other +requests:: + + app = DispatcherMiddleware(serve_frontend, { + '/api': api_app, + '/admin': admin_app, + }) + +In production, you might instead handle this at the HTTP server level, +serving files or proxying to application servers based on location. The +API and admin apps would each be deployed with a separate WSGI server, +and the static files would be served directly by the HTTP server. + +.. autoclass:: DispatcherMiddleware + +:copyright: 2007 Pallets +:license: BSD-3-Clause +""" + + +class DispatcherMiddleware(object): + """Combine multiple applications as a single WSGI application. + Requests are dispatched to an application based on the path it is + mounted under. + + :param app: The WSGI application to dispatch to if the request + doesn't match a mounted path. + :param mounts: Maps path prefixes to applications for dispatching. + """ + + def __init__(self, app, mounts=None): + self.app = app + self.mounts = mounts or {} + + def __call__(self, environ, start_response): + script = environ.get("PATH_INFO", "") + path_info = "" + + while "/" in script: + if script in self.mounts: + app = self.mounts[script] + break + + script, last_item = script.rsplit("/", 1) + path_info = "/%s%s" % (last_item, path_info) + else: + app = self.mounts.get(script, self.app) + + original_script_name = environ.get("SCRIPT_NAME", "") + environ["SCRIPT_NAME"] = original_script_name + script + environ["PATH_INFO"] = path_info + return app(environ, start_response) diff --git a/env/Lib/site-packages/werkzeug/middleware/http_proxy.py b/env/Lib/site-packages/werkzeug/middleware/http_proxy.py new file mode 100644 index 0000000..bfdc071 --- /dev/null +++ b/env/Lib/site-packages/werkzeug/middleware/http_proxy.py @@ -0,0 +1,219 @@ +""" +Basic HTTP Proxy +================ + +.. autoclass:: ProxyMiddleware + +:copyright: 2007 Pallets +:license: BSD-3-Clause +""" +import socket + +from ..datastructures import EnvironHeaders +from ..http import is_hop_by_hop_header +from ..urls import url_parse +from ..urls import url_quote +from ..wsgi import get_input_stream + +try: + from http import client +except ImportError: + import httplib as client + + +class ProxyMiddleware(object): + """Proxy requests under a path to an external server, routing other + requests to the app. + + This middleware can only proxy HTTP requests, as that is the only + protocol handled by the WSGI server. Other protocols, such as + websocket requests, cannot be proxied at this layer. This should + only be used for development, in production a real proxying server + should be used. + + The middleware takes a dict that maps a path prefix to a dict + describing the host to be proxied to:: + + app = ProxyMiddleware(app, { + "/static/": { + "target": "http://127.0.0.1:5001/", + } + }) + + Each host has the following options: + + ``target``: + The target URL to dispatch to. This is required. + ``remove_prefix``: + Whether to remove the prefix from the URL before dispatching it + to the target. The default is ``False``. + ``host``: + ``""`` (default): + The host header is automatically rewritten to the URL of the + target. + ``None``: + The host header is unmodified from the client request. + Any other value: + The host header is overwritten with the value. + ``headers``: + A dictionary of headers to be sent with the request to the + target. The default is ``{}``. + ``ssl_context``: + A :class:`ssl.SSLContext` defining how to verify requests if the + target is HTTPS. The default is ``None``. + + In the example above, everything under ``"/static/"`` is proxied to + the server on port 5001. The host header is rewritten to the target, + and the ``"/static/"`` prefix is removed from the URLs. + + :param app: The WSGI application to wrap. + :param targets: Proxy target configurations. See description above. + :param chunk_size: Size of chunks to read from input stream and + write to target. + :param timeout: Seconds before an operation to a target fails. + + .. versionadded:: 0.14 + """ + + def __init__(self, app, targets, chunk_size=2 << 13, timeout=10): + def _set_defaults(opts): + opts.setdefault("remove_prefix", False) + opts.setdefault("host", "") + opts.setdefault("headers", {}) + opts.setdefault("ssl_context", None) + return opts + + self.app = app + self.targets = dict( + ("/%s/" % k.strip("/"), _set_defaults(v)) for k, v in targets.items() + ) + self.chunk_size = chunk_size + self.timeout = timeout + + def proxy_to(self, opts, path, prefix): + target = url_parse(opts["target"]) + + def application(environ, start_response): + headers = list(EnvironHeaders(environ).items()) + headers[:] = [ + (k, v) + for k, v in headers + if not is_hop_by_hop_header(k) + and k.lower() not in ("content-length", "host") + ] + headers.append(("Connection", "close")) + + if opts["host"] == "": + headers.append(("Host", target.ascii_host)) + elif opts["host"] is None: + headers.append(("Host", environ["HTTP_HOST"])) + else: + headers.append(("Host", opts["host"])) + + headers.extend(opts["headers"].items()) + remote_path = path + + if opts["remove_prefix"]: + remote_path = "%s/%s" % ( + target.path.rstrip("/"), + remote_path[len(prefix) :].lstrip("/"), + ) + + content_length = environ.get("CONTENT_LENGTH") + chunked = False + + if content_length not in ("", None): + headers.append(("Content-Length", content_length)) + elif content_length is not None: + headers.append(("Transfer-Encoding", "chunked")) + chunked = True + + try: + if target.scheme == "http": + con = client.HTTPConnection( + target.ascii_host, target.port or 80, timeout=self.timeout + ) + elif target.scheme == "https": + con = client.HTTPSConnection( + target.ascii_host, + target.port or 443, + timeout=self.timeout, + context=opts["ssl_context"], + ) + else: + raise RuntimeError( + "Target scheme must be 'http' or 'https', got '{}'.".format( + target.scheme + ) + ) + + con.connect() + remote_url = url_quote(remote_path) + querystring = environ["QUERY_STRING"] + + if querystring: + remote_url = remote_url + "?" + querystring + + con.putrequest(environ["REQUEST_METHOD"], remote_url, skip_host=True) + + for k, v in headers: + if k.lower() == "connection": + v = "close" + + con.putheader(k, v) + + con.endheaders() + stream = get_input_stream(environ) + + while 1: + data = stream.read(self.chunk_size) + + if not data: + break + + if chunked: + con.send(b"%x\r\n%s\r\n" % (len(data), data)) + else: + con.send(data) + + resp = con.getresponse() + except socket.error: + from ..exceptions import BadGateway + + return BadGateway()(environ, start_response) + + start_response( + "%d %s" % (resp.status, resp.reason), + [ + (k.title(), v) + for k, v in resp.getheaders() + if not is_hop_by_hop_header(k) + ], + ) + + def read(): + while 1: + try: + data = resp.read(self.chunk_size) + except socket.error: + break + + if not data: + break + + yield data + + return read() + + return application + + def __call__(self, environ, start_response): + path = environ["PATH_INFO"] + app = self.app + + for prefix, opts in self.targets.items(): + if path.startswith(prefix): + app = self.proxy_to(opts, path, prefix) + break + + return app(environ, start_response) diff --git a/env/Lib/site-packages/werkzeug/middleware/lint.py b/env/Lib/site-packages/werkzeug/middleware/lint.py new file mode 100644 index 0000000..98f9581 --- /dev/null +++ b/env/Lib/site-packages/werkzeug/middleware/lint.py @@ -0,0 +1,408 @@ +""" +WSGI Protocol Linter +==================== + +This module provides a middleware that performs sanity checks on the +behavior of the WSGI server and application. It checks that the +:pep:`3333` WSGI spec is properly implemented. It also warns on some +common HTTP errors such as non-empty responses for 304 status codes. + +.. autoclass:: LintMiddleware + +:copyright: 2007 Pallets +:license: BSD-3-Clause +""" +from warnings import warn + +from .._compat import implements_iterator +from .._compat import PY2 +from .._compat import string_types +from ..datastructures import Headers +from ..http import is_entity_header +from ..wsgi import FileWrapper + +try: + from urllib.parse import urlparse +except ImportError: + from urlparse import urlparse + + +class WSGIWarning(Warning): + """Warning class for WSGI warnings.""" + + +class HTTPWarning(Warning): + """Warning class for HTTP warnings.""" + + +def check_string(context, obj, stacklevel=3): + if type(obj) is not str: + warn( + "'%s' requires strings, got '%s'" % (context, type(obj).__name__), + WSGIWarning, + ) + + +class InputStream(object): + def __init__(self, stream): + self._stream = stream + + def read(self, *args): + if len(args) == 0: + warn( + "WSGI does not guarantee an EOF marker on the input stream, thus making" + " calls to 'wsgi.input.read()' unsafe. Conforming servers may never" + " return from this call.", + WSGIWarning, + stacklevel=2, + ) + elif len(args) != 1: + warn( + "Too many parameters passed to 'wsgi.input.read()'.", + WSGIWarning, + stacklevel=2, + ) + return self._stream.read(*args) + + def readline(self, *args): + if len(args) == 0: + warn( + "Calls to 'wsgi.input.readline()' without arguments are unsafe. Use" + " 'wsgi.input.read()' instead.", + WSGIWarning, + stacklevel=2, + ) + elif len(args) == 1: + warn( + "'wsgi.input.readline()' was called with a size hint. WSGI does not" + " support this, although it's available on all major servers.", + WSGIWarning, + stacklevel=2, + ) + else: + raise TypeError("Too many arguments passed to 'wsgi.input.readline()'.") + return self._stream.readline(*args) + + def __iter__(self): + try: + return iter(self._stream) + except TypeError: + warn("'wsgi.input' is not iterable.", WSGIWarning, stacklevel=2) + return iter(()) + + def close(self): + warn("The application closed the input stream!", WSGIWarning, stacklevel=2) + self._stream.close() + + +class ErrorStream(object): + def __init__(self, stream): + self._stream = stream + + def write(self, s): + check_string("wsgi.error.write()", s) + self._stream.write(s) + + def flush(self): + self._stream.flush() + + def writelines(self, seq): + for line in seq: + self.write(line) + + def close(self): + warn("The application closed the error stream!", WSGIWarning, stacklevel=2) + self._stream.close() + + +class GuardedWrite(object): + def __init__(self, write, chunks): + self._write = write + self._chunks = chunks + + def __call__(self, s): + check_string("write()", s) + self._write.write(s) + self._chunks.append(len(s)) + + +@implements_iterator +class GuardedIterator(object): + def __init__(self, iterator, headers_set, chunks): + self._iterator = iterator + if PY2: + self._next = iter(iterator).next + else: + self._next = iter(iterator).__next__ + self.closed = False + self.headers_set = headers_set + self.chunks = chunks + + def __iter__(self): + return self + + def __next__(self): + if self.closed: + warn("Iterated over closed 'app_iter'.", WSGIWarning, stacklevel=2) + + rv = self._next() + + if not self.headers_set: + warn( + "The application returned before it started the response.", + WSGIWarning, + stacklevel=2, + ) + + check_string("application iterator items", rv) + self.chunks.append(len(rv)) + return rv + + def close(self): + self.closed = True + + if hasattr(self._iterator, "close"): + self._iterator.close() + + if self.headers_set: + status_code, headers = self.headers_set + bytes_sent = sum(self.chunks) + content_length = headers.get("content-length", type=int) + + if status_code == 304: + for key, _value in headers: + key = key.lower() + if key not in ("expires", "content-location") and is_entity_header( + key + ): + warn( + "Entity header %r found in 304 response." % key, HTTPWarning + ) + if bytes_sent: + warn("304 responses must not have a body.", HTTPWarning) + elif 100 <= status_code < 200 or status_code == 204: + if content_length != 0: + warn( + "%r responses must have an empty content length." % status_code, + HTTPWarning, + ) + if bytes_sent: + warn( + "%r responses must not have a body." % status_code, HTTPWarning + ) + elif content_length is not None and content_length != bytes_sent: + warn( + "Content-Length and the number of bytes sent to the client do not" + " match.", + WSGIWarning, + ) + + def __del__(self): + if not self.closed: + try: + warn( + "Iterator was garbage collected before it was closed.", WSGIWarning + ) + except Exception: + pass + + +class LintMiddleware(object): + """Warns about common errors in the WSGI and HTTP behavior of the + server and wrapped application. Some of the issues it check are: + + - invalid status codes + - non-bytestrings sent to the WSGI server + - strings returned from the WSGI application + - non-empty conditional responses + - unquoted etags + - relative URLs in the Location header + - unsafe calls to wsgi.input + - unclosed iterators + + Error information is emitted using the :mod:`warnings` module. + + :param app: The WSGI application to wrap. + + .. code-block:: python + + from werkzeug.middleware.lint import LintMiddleware + app = LintMiddleware(app) + """ + + def __init__(self, app): + self.app = app + + def check_environ(self, environ): + if type(environ) is not dict: + warn( + "WSGI environment is not a standard Python dict.", + WSGIWarning, + stacklevel=4, + ) + for key in ( + "REQUEST_METHOD", + "SERVER_NAME", + "SERVER_PORT", + "wsgi.version", + "wsgi.input", + "wsgi.errors", + "wsgi.multithread", + "wsgi.multiprocess", + "wsgi.run_once", + ): + if key not in environ: + warn( + "Required environment key %r not found" % key, + WSGIWarning, + stacklevel=3, + ) + if environ["wsgi.version"] != (1, 0): + warn("Environ is not a WSGI 1.0 environ.", WSGIWarning, stacklevel=3) + + script_name = environ.get("SCRIPT_NAME", "") + path_info = environ.get("PATH_INFO", "") + + if script_name and script_name[0] != "/": + warn( + "'SCRIPT_NAME' does not start with a slash: %r" % script_name, + WSGIWarning, + stacklevel=3, + ) + + if path_info and path_info[0] != "/": + warn( + "'PATH_INFO' does not start with a slash: %r" % path_info, + WSGIWarning, + stacklevel=3, + ) + + def check_start_response(self, status, headers, exc_info): + check_string("status", status) + status_code = status.split(None, 1)[0] + + if len(status_code) != 3 or not status_code.isdigit(): + warn(WSGIWarning("Status code must be three digits"), stacklevel=3) + + if len(status) < 4 or status[3] != " ": + warn( + WSGIWarning( + "Invalid value for status %r. Valid " + "status strings are three digits, a space " + "and a status explanation" + ), + stacklevel=3, + ) + + status_code = int(status_code) + + if status_code < 100: + warn(WSGIWarning("status code < 100 detected"), stacklevel=3) + + if type(headers) is not list: + warn(WSGIWarning("header list is not a list"), stacklevel=3) + + for item in headers: + if type(item) is not tuple or len(item) != 2: + warn(WSGIWarning("Headers must tuple 2-item tuples"), stacklevel=3) + name, value = item + if type(name) is not str or type(value) is not str: + warn(WSGIWarning("header items must be strings"), stacklevel=3) + if name.lower() == "status": + warn( + WSGIWarning( + "The status header is not supported due to " + "conflicts with the CGI spec." + ), + stacklevel=3, + ) + + if exc_info is not None and not isinstance(exc_info, tuple): + warn(WSGIWarning("invalid value for exc_info"), stacklevel=3) + + headers = Headers(headers) + self.check_headers(headers) + + return status_code, headers + + def check_headers(self, headers): + etag = headers.get("etag") + + if etag is not None: + if etag.startswith(("W/", "w/")): + if etag.startswith("w/"): + warn( + HTTPWarning("weak etag indicator should be upcase."), + stacklevel=4, + ) + + etag = etag[2:] + + if not (etag[:1] == etag[-1:] == '"'): + warn(HTTPWarning("unquoted etag emitted."), stacklevel=4) + + location = headers.get("location") + + if location is not None: + if not urlparse(location).netloc: + warn( + HTTPWarning("absolute URLs required for location header"), + stacklevel=4, + ) + + def check_iterator(self, app_iter): + if isinstance(app_iter, string_types): + warn( + "The application returned astring. The response will send one character" + " at a time to the client, which will kill performance. Return a list" + " or iterable instead.", + WSGIWarning, + stacklevel=3, + ) + + def __call__(self, *args, **kwargs): + if len(args) != 2: + warn("A WSGI app takes two arguments.", WSGIWarning, stacklevel=2) + + if kwargs: + warn( + "A WSGI app does not take keyword arguments.", WSGIWarning, stacklevel=2 + ) + + environ, start_response = args + + self.check_environ(environ) + environ["wsgi.input"] = InputStream(environ["wsgi.input"]) + environ["wsgi.errors"] = ErrorStream(environ["wsgi.errors"]) + + # Hook our own file wrapper in so that applications will always + # iterate to the end and we can check the content length. + environ["wsgi.file_wrapper"] = FileWrapper + + headers_set = [] + chunks = [] + + def checking_start_response(*args, **kwargs): + if len(args) not in (2, 3): + warn( + "Invalid number of arguments: %s, expected 2 or 3." % len(args), + WSGIWarning, + stacklevel=2, + ) + + if kwargs: + warn("'start_response' does not take keyword arguments.", WSGIWarning) + + status, headers = args[:2] + + if len(args) == 3: + exc_info = args[2] + else: + exc_info = None + + headers_set[:] = self.check_start_response(status, headers, exc_info) + return GuardedWrite(start_response(status, headers, exc_info), chunks) + + app_iter = self.app(environ, checking_start_response) + self.check_iterator(app_iter) + return GuardedIterator(app_iter, headers_set, chunks) diff --git a/env/Lib/site-packages/werkzeug/middleware/profiler.py b/env/Lib/site-packages/werkzeug/middleware/profiler.py new file mode 100644 index 0000000..32a14d9 --- /dev/null +++ b/env/Lib/site-packages/werkzeug/middleware/profiler.py @@ -0,0 +1,132 @@ +""" +Application Profiler +==================== + +This module provides a middleware that profiles each request with the +:mod:`cProfile` module. This can help identify bottlenecks in your code +that may be slowing down your application. + +.. autoclass:: ProfilerMiddleware + +:copyright: 2007 Pallets +:license: BSD-3-Clause +""" +from __future__ import print_function + +import os.path +import sys +import time +from pstats import Stats + +try: + from cProfile import Profile +except ImportError: + from profile import Profile + + +class ProfilerMiddleware(object): + """Wrap a WSGI application and profile the execution of each + request. Responses are buffered so that timings are more exact. + + If ``stream`` is given, :class:`pstats.Stats` are written to it + after each request. If ``profile_dir`` is given, :mod:`cProfile` + data files are saved to that directory, one file per request. + + The filename can be customized by passing ``filename_format``. If + it is a string, it will be formatted using :meth:`str.format` with + the following fields available: + + - ``{method}`` - The request method; GET, POST, etc. + - ``{path}`` - The request path or 'root' should one not exist. + - ``{elapsed}`` - The elapsed time of the request. + - ``{time}`` - The time of the request. + + If it is a callable, it will be called with the WSGI ``environ`` + dict and should return a filename. + + :param app: The WSGI application to wrap. + :param stream: Write stats to this stream. Disable with ``None``. + :param sort_by: A tuple of columns to sort stats by. See + :meth:`pstats.Stats.sort_stats`. + :param restrictions: A tuple of restrictions to filter stats by. See + :meth:`pstats.Stats.print_stats`. + :param profile_dir: Save profile data files to this directory. + :param filename_format: Format string for profile data file names, + or a callable returning a name. See explanation above. + + .. code-block:: python + + from werkzeug.middleware.profiler import ProfilerMiddleware + app = ProfilerMiddleware(app) + + .. versionchanged:: 0.15 + Stats are written even if ``profile_dir`` is given, and can be + disable by passing ``stream=None``. + + .. versionadded:: 0.15 + Added ``filename_format``. + + .. versionadded:: 0.9 + Added ``restrictions`` and ``profile_dir``. + """ + + def __init__( + self, + app, + stream=sys.stdout, + sort_by=("time", "calls"), + restrictions=(), + profile_dir=None, + filename_format="{method}.{path}.{elapsed:.0f}ms.{time:.0f}.prof", + ): + self._app = app + self._stream = stream + self._sort_by = sort_by + self._restrictions = restrictions + self._profile_dir = profile_dir + self._filename_format = filename_format + + def __call__(self, environ, start_response): + response_body = [] + + def catching_start_response(status, headers, exc_info=None): + start_response(status, headers, exc_info) + return response_body.append + + def runapp(): + app_iter = self._app(environ, catching_start_response) + response_body.extend(app_iter) + + if hasattr(app_iter, "close"): + app_iter.close() + + profile = Profile() + start = time.time() + profile.runcall(runapp) + body = b"".join(response_body) + elapsed = time.time() - start + + if self._profile_dir is not None: + if callable(self._filename_format): + filename = self._filename_format(environ) + else: + filename = self._filename_format.format( + method=environ["REQUEST_METHOD"], + path=( + environ.get("PATH_INFO").strip("/").replace("/", ".") or "root" + ), + elapsed=elapsed * 1000.0, + time=time.time(), + ) + filename = os.path.join(self._profile_dir, filename) + profile.dump_stats(filename) + + if self._stream is not None: + stats = Stats(profile, stream=self._stream) + stats.sort_stats(*self._sort_by) + print("-" * 80, file=self._stream) + print("PATH: {!r}".format(environ.get("PATH_INFO", "")), file=self._stream) + stats.print_stats(*self._restrictions) + print("-" * 80 + "\n", file=self._stream) + + return [body] diff --git a/env/Lib/site-packages/werkzeug/middleware/proxy_fix.py b/env/Lib/site-packages/werkzeug/middleware/proxy_fix.py new file mode 100644 index 0000000..bbe1814 --- /dev/null +++ b/env/Lib/site-packages/werkzeug/middleware/proxy_fix.py @@ -0,0 +1,232 @@ +""" +X-Forwarded-For Proxy Fix +========================= + +This module provides a middleware that adjusts the WSGI environ based on +``X-Forwarded-`` headers that proxies in front of an application may +set. + +When an application is running behind a proxy server, WSGI may see the +request as coming from that server rather than the real client. Proxies +set various headers to track where the request actually came from. + +This middleware should only be applied if the application is actually +behind such a proxy, and should be configured with the number of proxies +that are chained in front of it. Not all proxies set all the headers. +Since incoming headers can be faked, you must set how many proxies are +setting each header so the middleware knows what to trust. + +.. autoclass:: ProxyFix + +:copyright: 2007 Pallets +:license: BSD-3-Clause +""" +import warnings + + +class ProxyFix(object): + """Adjust the WSGI environ based on ``X-Forwarded-`` that proxies in + front of the application may set. + + - ``X-Forwarded-For`` sets ``REMOTE_ADDR``. + - ``X-Forwarded-Proto`` sets ``wsgi.url_scheme``. + - ``X-Forwarded-Host`` sets ``HTTP_HOST``, ``SERVER_NAME``, and + ``SERVER_PORT``. + - ``X-Forwarded-Port`` sets ``HTTP_HOST`` and ``SERVER_PORT``. + - ``X-Forwarded-Prefix`` sets ``SCRIPT_NAME``. + + You must tell the middleware how many proxies set each header so it + knows what values to trust. It is a security issue to trust values + that came from the client rather than a proxy. + + The original values of the headers are stored in the WSGI + environ as ``werkzeug.proxy_fix.orig``, a dict. + + :param app: The WSGI application to wrap. + :param x_for: Number of values to trust for ``X-Forwarded-For``. + :param x_proto: Number of values to trust for ``X-Forwarded-Proto``. + :param x_host: Number of values to trust for ``X-Forwarded-Host``. + :param x_port: Number of values to trust for ``X-Forwarded-Port``. + :param x_prefix: Number of values to trust for + ``X-Forwarded-Prefix``. + :param num_proxies: Deprecated, use ``x_for`` instead. + + .. code-block:: python + + from werkzeug.middleware.proxy_fix import ProxyFix + # App is behind one proxy that sets the -For and -Host headers. + app = ProxyFix(app, x_for=1, x_host=1) + + .. versionchanged:: 0.15 + All headers support multiple values. The ``num_proxies`` + argument is deprecated. Each header is configured with a + separate number of trusted proxies. + + .. versionchanged:: 0.15 + Original WSGI environ values are stored in the + ``werkzeug.proxy_fix.orig`` dict. ``orig_remote_addr``, + ``orig_wsgi_url_scheme``, and ``orig_http_host`` are deprecated + and will be removed in 1.0. + + .. versionchanged:: 0.15 + Support ``X-Forwarded-Port`` and ``X-Forwarded-Prefix``. + + .. versionchanged:: 0.15 + ``X-Fowarded-Host`` and ``X-Forwarded-Port`` modify + ``SERVER_NAME`` and ``SERVER_PORT``. + """ + + def __init__( + self, app, num_proxies=None, x_for=1, x_proto=1, x_host=0, x_port=0, x_prefix=0 + ): + self.app = app + self.x_for = x_for + self.x_proto = x_proto + self.x_host = x_host + self.x_port = x_port + self.x_prefix = x_prefix + self.num_proxies = num_proxies + + @property + def num_proxies(self): + """The number of proxies setting ``X-Forwarded-For`` in front + of the application. + + .. deprecated:: 0.15 + A separate number of trusted proxies is configured for each + header. ``num_proxies`` maps to ``x_for``. This method will + be removed in 1.0. + + :internal: + """ + warnings.warn( + "'num_proxies' is deprecated as of version 0.15 and will be" + " removed in version 1.0. Use 'x_for' instead.", + DeprecationWarning, + stacklevel=2, + ) + return self.x_for + + @num_proxies.setter + def num_proxies(self, value): + if value is not None: + warnings.warn( + "'num_proxies' is deprecated as of version 0.15 and" + " will be removed in version 1.0. Use" + " 'x_for={value}, x_proto={value}, x_host={value}'" + " instead.".format(value=value), + DeprecationWarning, + stacklevel=2, + ) + self.x_for = value + self.x_proto = value + self.x_host = value + + def get_remote_addr(self, forwarded_for): + """Get the real ``remote_addr`` by looking backwards ``x_for`` + number of values in the ``X-Forwarded-For`` header. + + :param forwarded_for: List of values parsed from the + ``X-Forwarded-For`` header. + :return: The real ``remote_addr``, or ``None`` if there were not + at least ``x_for`` values. + + .. deprecated:: 0.15 + This is handled internally for each header. This method will + be removed in 1.0. + + .. versionchanged:: 0.9 + Use ``num_proxies`` instead of always picking the first + value. + + .. versionadded:: 0.8 + """ + warnings.warn( + "'get_remote_addr' is deprecated as of version 0.15 and" + " will be removed in version 1.0. It is now handled" + " internally for each header.", + DeprecationWarning, + ) + return self._get_trusted_comma(self.x_for, ",".join(forwarded_for)) + + def _get_trusted_comma(self, trusted, value): + """Get the real value from a comma-separated header based on the + configured number of trusted proxies. + + :param trusted: Number of values to trust in the header. + :param value: Header value to parse. + :return: The real value, or ``None`` if there are fewer values + than the number of trusted proxies. + + .. versionadded:: 0.15 + """ + if not (trusted and value): + return + values = [x.strip() for x in value.split(",")] + if len(values) >= trusted: + return values[-trusted] + + def __call__(self, environ, start_response): + """Modify the WSGI environ based on the various ``Forwarded`` + headers before calling the wrapped application. Store the + original environ values in ``werkzeug.proxy_fix.orig_{key}``. + """ + environ_get = environ.get + orig_remote_addr = environ_get("REMOTE_ADDR") + orig_wsgi_url_scheme = environ_get("wsgi.url_scheme") + orig_http_host = environ_get("HTTP_HOST") + environ.update( + { + "werkzeug.proxy_fix.orig": { + "REMOTE_ADDR": orig_remote_addr, + "wsgi.url_scheme": orig_wsgi_url_scheme, + "HTTP_HOST": orig_http_host, + "SERVER_NAME": environ_get("SERVER_NAME"), + "SERVER_PORT": environ_get("SERVER_PORT"), + "SCRIPT_NAME": environ_get("SCRIPT_NAME"), + }, + # todo: remove deprecated keys + "werkzeug.proxy_fix.orig_remote_addr": orig_remote_addr, + "werkzeug.proxy_fix.orig_wsgi_url_scheme": orig_wsgi_url_scheme, + "werkzeug.proxy_fix.orig_http_host": orig_http_host, + } + ) + + x_for = self._get_trusted_comma(self.x_for, environ_get("HTTP_X_FORWARDED_FOR")) + if x_for: + environ["REMOTE_ADDR"] = x_for + + x_proto = self._get_trusted_comma( + self.x_proto, environ_get("HTTP_X_FORWARDED_PROTO") + ) + if x_proto: + environ["wsgi.url_scheme"] = x_proto + + x_host = self._get_trusted_comma( + self.x_host, environ_get("HTTP_X_FORWARDED_HOST") + ) + if x_host: + environ["HTTP_HOST"] = x_host + parts = x_host.split(":", 1) + environ["SERVER_NAME"] = parts[0] + if len(parts) == 2: + environ["SERVER_PORT"] = parts[1] + + x_port = self._get_trusted_comma( + self.x_port, environ_get("HTTP_X_FORWARDED_PORT") + ) + if x_port: + host = environ.get("HTTP_HOST") + if host: + parts = host.split(":", 1) + host = parts[0] if len(parts) == 2 else host + environ["HTTP_HOST"] = "%s:%s" % (host, x_port) + environ["SERVER_PORT"] = x_port + + x_prefix = self._get_trusted_comma( + self.x_prefix, environ_get("HTTP_X_FORWARDED_PREFIX") + ) + if x_prefix: + environ["SCRIPT_NAME"] = x_prefix + + return self.app(environ, start_response) diff --git a/env/Lib/site-packages/werkzeug/middleware/shared_data.py b/env/Lib/site-packages/werkzeug/middleware/shared_data.py new file mode 100644 index 0000000..088504a --- /dev/null +++ b/env/Lib/site-packages/werkzeug/middleware/shared_data.py @@ -0,0 +1,253 @@ +""" +Serve Shared Static Files +========================= + +.. autoclass:: SharedDataMiddleware + :members: is_allowed + +:copyright: 2007 Pallets +:license: BSD-3-Clause +""" +import mimetypes +import os +import posixpath +from datetime import datetime +from io import BytesIO +from time import mktime +from time import time +from zlib import adler32 + +from .._compat import PY2 +from .._compat import string_types +from ..filesystem import get_filesystem_encoding +from ..http import http_date +from ..http import is_resource_modified +from ..security import safe_join +from ..wsgi import get_path_info +from ..wsgi import wrap_file + + +class SharedDataMiddleware(object): + + """A WSGI middleware that provides static content for development + environments or simple server setups. Usage is quite simple:: + + import os + from werkzeug.wsgi import SharedDataMiddleware + + app = SharedDataMiddleware(app, { + '/static': os.path.join(os.path.dirname(__file__), 'static') + }) + + The contents of the folder ``./shared`` will now be available on + ``http://example.com/shared/``. This is pretty useful during development + because a standalone media server is not required. One can also mount + files on the root folder and still continue to use the application because + the shared data middleware forwards all unhandled requests to the + application, even if the requests are below one of the shared folders. + + If `pkg_resources` is available you can also tell the middleware to serve + files from package data:: + + app = SharedDataMiddleware(app, { + '/static': ('myapplication', 'static') + }) + + This will then serve the ``static`` folder in the `myapplication` + Python package. + + The optional `disallow` parameter can be a list of :func:`~fnmatch.fnmatch` + rules for files that are not accessible from the web. If `cache` is set to + `False` no caching headers are sent. + + Currently the middleware does not support non ASCII filenames. If the + encoding on the file system happens to be the encoding of the URI it may + work but this could also be by accident. We strongly suggest using ASCII + only file names for static files. + + The middleware will guess the mimetype using the Python `mimetype` + module. If it's unable to figure out the charset it will fall back + to `fallback_mimetype`. + + .. versionchanged:: 0.5 + The cache timeout is configurable now. + + .. versionadded:: 0.6 + The `fallback_mimetype` parameter was added. + + :param app: the application to wrap. If you don't want to wrap an + application you can pass it :exc:`NotFound`. + :param exports: a list or dict of exported files and folders. + :param disallow: a list of :func:`~fnmatch.fnmatch` rules. + :param fallback_mimetype: the fallback mimetype for unknown files. + :param cache: enable or disable caching headers. + :param cache_timeout: the cache timeout in seconds for the headers. + """ + + def __init__( + self, + app, + exports, + disallow=None, + cache=True, + cache_timeout=60 * 60 * 12, + fallback_mimetype="text/plain", + ): + self.app = app + self.exports = [] + self.cache = cache + self.cache_timeout = cache_timeout + + if hasattr(exports, "items"): + exports = exports.items() + + for key, value in exports: + if isinstance(value, tuple): + loader = self.get_package_loader(*value) + elif isinstance(value, string_types): + if os.path.isfile(value): + loader = self.get_file_loader(value) + else: + loader = self.get_directory_loader(value) + else: + raise TypeError("unknown def %r" % value) + + self.exports.append((key, loader)) + + if disallow is not None: + from fnmatch import fnmatch + + self.is_allowed = lambda x: not fnmatch(x, disallow) + + self.fallback_mimetype = fallback_mimetype + + def is_allowed(self, filename): + """Subclasses can override this method to disallow the access to + certain files. However by providing `disallow` in the constructor + this method is overwritten. + """ + return True + + def _opener(self, filename): + return lambda: ( + open(filename, "rb"), + datetime.utcfromtimestamp(os.path.getmtime(filename)), + int(os.path.getsize(filename)), + ) + + def get_file_loader(self, filename): + return lambda x: (os.path.basename(filename), self._opener(filename)) + + def get_package_loader(self, package, package_path): + from pkg_resources import DefaultProvider, ResourceManager, get_provider + + loadtime = datetime.utcnow() + provider = get_provider(package) + manager = ResourceManager() + filesystem_bound = isinstance(provider, DefaultProvider) + + def loader(path): + if path is None: + return None, None + + path = safe_join(package_path, path) + + if not provider.has_resource(path): + return None, None + + basename = posixpath.basename(path) + + if filesystem_bound: + return ( + basename, + self._opener(provider.get_resource_filename(manager, path)), + ) + + s = provider.get_resource_string(manager, path) + return basename, lambda: (BytesIO(s), loadtime, len(s)) + + return loader + + def get_directory_loader(self, directory): + def loader(path): + if path is not None: + path = safe_join(directory, path) + else: + path = directory + + if os.path.isfile(path): + return os.path.basename(path), self._opener(path) + + return None, None + + return loader + + def generate_etag(self, mtime, file_size, real_filename): + if not isinstance(real_filename, bytes): + real_filename = real_filename.encode(get_filesystem_encoding()) + + return "wzsdm-%d-%s-%s" % ( + mktime(mtime.timetuple()), + file_size, + adler32(real_filename) & 0xFFFFFFFF, + ) + + def __call__(self, environ, start_response): + path = get_path_info(environ) + + if PY2: + path = path.encode(get_filesystem_encoding()) + + file_loader = None + + for search_path, loader in self.exports: + if search_path == path: + real_filename, file_loader = loader(None) + + if file_loader is not None: + break + + if not search_path.endswith("/"): + search_path += "/" + + if path.startswith(search_path): + real_filename, file_loader = loader(path[len(search_path) :]) + + if file_loader is not None: + break + + if file_loader is None or not self.is_allowed(real_filename): + return self.app(environ, start_response) + + guessed_type = mimetypes.guess_type(real_filename) + mime_type = guessed_type[0] or self.fallback_mimetype + f, mtime, file_size = file_loader() + + headers = [("Date", http_date())] + + if self.cache: + timeout = self.cache_timeout + etag = self.generate_etag(mtime, file_size, real_filename) + headers += [ + ("Etag", '"%s"' % etag), + ("Cache-Control", "max-age=%d, public" % timeout), + ] + + if not is_resource_modified(environ, etag, last_modified=mtime): + f.close() + start_response("304 Not Modified", headers) + return [] + + headers.append(("Expires", http_date(time() + timeout))) + else: + headers.append(("Cache-Control", "public")) + + headers.extend( + ( + ("Content-Type", mime_type), + ("Content-Length", str(file_size)), + ("Last-Modified", http_date(mtime)), + ) + ) + start_response("200 OK", headers) + return wrap_file(environ, f) diff --git a/env/Lib/site-packages/werkzeug/posixemulation.py b/env/Lib/site-packages/werkzeug/posixemulation.py new file mode 100644 index 0000000..696b456 --- /dev/null +++ b/env/Lib/site-packages/werkzeug/posixemulation.py @@ -0,0 +1,117 @@ +# -*- coding: utf-8 -*- +r""" + werkzeug.posixemulation + ~~~~~~~~~~~~~~~~~~~~~~~ + + Provides a POSIX emulation for some features that are relevant to + web applications. The main purpose is to simplify support for + systems such as Windows NT that are not 100% POSIX compatible. + + Currently this only implements a :func:`rename` function that + follows POSIX semantics. Eg: if the target file already exists it + will be replaced without asking. + + This module was introduced in 0.6.1 and is not a public interface. + It might become one in later versions of Werkzeug. + + :copyright: 2007 Pallets + :license: BSD-3-Clause +""" +import errno +import os +import random +import sys +import time + +from ._compat import to_unicode +from .filesystem import get_filesystem_encoding + +can_rename_open_file = False + +if os.name == "nt": + try: + import ctypes + + _MOVEFILE_REPLACE_EXISTING = 0x1 + _MOVEFILE_WRITE_THROUGH = 0x8 + _MoveFileEx = ctypes.windll.kernel32.MoveFileExW + + def _rename(src, dst): + src = to_unicode(src, get_filesystem_encoding()) + dst = to_unicode(dst, get_filesystem_encoding()) + if _rename_atomic(src, dst): + return True + retry = 0 + rv = False + while not rv and retry < 100: + rv = _MoveFileEx( + src, dst, _MOVEFILE_REPLACE_EXISTING | _MOVEFILE_WRITE_THROUGH + ) + if not rv: + time.sleep(0.001) + retry += 1 + return rv + + # new in Vista and Windows Server 2008 + _CreateTransaction = ctypes.windll.ktmw32.CreateTransaction + _CommitTransaction = ctypes.windll.ktmw32.CommitTransaction + _MoveFileTransacted = ctypes.windll.kernel32.MoveFileTransactedW + _CloseHandle = ctypes.windll.kernel32.CloseHandle + can_rename_open_file = True + + def _rename_atomic(src, dst): + ta = _CreateTransaction(None, 0, 0, 0, 0, 1000, "Werkzeug rename") + if ta == -1: + return False + try: + retry = 0 + rv = False + while not rv and retry < 100: + rv = _MoveFileTransacted( + src, + dst, + None, + None, + _MOVEFILE_REPLACE_EXISTING | _MOVEFILE_WRITE_THROUGH, + ta, + ) + if rv: + rv = _CommitTransaction(ta) + break + else: + time.sleep(0.001) + retry += 1 + return rv + finally: + _CloseHandle(ta) + + except Exception: + + def _rename(src, dst): + return False + + def _rename_atomic(src, dst): + return False + + def rename(src, dst): + # Try atomic or pseudo-atomic rename + if _rename(src, dst): + return + # Fall back to "move away and replace" + try: + os.rename(src, dst) + except OSError as e: + if e.errno != errno.EEXIST: + raise + old = "%s-%08x" % (dst, random.randint(0, sys.maxsize)) + os.rename(dst, old) + os.rename(src, dst) + try: + os.unlink(old) + except Exception: + pass + + +else: + rename = os.rename + can_rename_open_file = True diff --git a/env/Lib/site-packages/werkzeug/routing.py b/env/Lib/site-packages/werkzeug/routing.py new file mode 100644 index 0000000..8ff7df1 --- /dev/null +++ b/env/Lib/site-packages/werkzeug/routing.py @@ -0,0 +1,2039 @@ +# -*- coding: utf-8 -*- +""" + werkzeug.routing + ~~~~~~~~~~~~~~~~ + + When it comes to combining multiple controller or view functions (however + you want to call them) you need a dispatcher. A simple way would be + applying regular expression tests on the ``PATH_INFO`` and calling + registered callback functions that return the value then. + + This module implements a much more powerful system than simple regular + expression matching because it can also convert values in the URLs and + build URLs. + + Here a simple example that creates an URL map for an application with + two subdomains (www and kb) and some URL rules: + + >>> m = Map([ + ... # Static URLs + ... Rule('/', endpoint='static/index'), + ... Rule('/about', endpoint='static/about'), + ... Rule('/help', endpoint='static/help'), + ... # Knowledge Base + ... Subdomain('kb', [ + ... Rule('/', endpoint='kb/index'), + ... Rule('/browse/', endpoint='kb/browse'), + ... Rule('/browse//', endpoint='kb/browse'), + ... Rule('/browse//', endpoint='kb/browse') + ... ]) + ... ], default_subdomain='www') + + If the application doesn't use subdomains it's perfectly fine to not set + the default subdomain and not use the `Subdomain` rule factory. The endpoint + in the rules can be anything, for example import paths or unique + identifiers. The WSGI application can use those endpoints to get the + handler for that URL. It doesn't have to be a string at all but it's + recommended. + + Now it's possible to create a URL adapter for one of the subdomains and + build URLs: + + >>> c = m.bind('example.com') + >>> c.build("kb/browse", dict(id=42)) + 'http://kb.example.com/browse/42/' + >>> c.build("kb/browse", dict()) + 'http://kb.example.com/browse/' + >>> c.build("kb/browse", dict(id=42, page=3)) + 'http://kb.example.com/browse/42/3' + >>> c.build("static/about") + '/about' + >>> c.build("static/index", force_external=True) + 'http://www.example.com/' + + >>> c = m.bind('example.com', subdomain='kb') + >>> c.build("static/about") + 'http://www.example.com/about' + + The first argument to bind is the server name *without* the subdomain. + Per default it will assume that the script is mounted on the root, but + often that's not the case so you can provide the real mount point as + second argument: + + >>> c = m.bind('example.com', '/applications/example') + + The third argument can be the subdomain, if not given the default + subdomain is used. For more details about binding have a look at the + documentation of the `MapAdapter`. + + And here is how you can match URLs: + + >>> c = m.bind('example.com') + >>> c.match("/") + ('static/index', {}) + >>> c.match("/about") + ('static/about', {}) + >>> c = m.bind('example.com', '/', 'kb') + >>> c.match("/") + ('kb/index', {}) + >>> c.match("/browse/42/23") + ('kb/browse', {'id': 42, 'page': 23}) + + If matching fails you get a `NotFound` exception, if the rule thinks + it's a good idea to redirect (for example because the URL was defined + to have a slash at the end but the request was missing that slash) it + will raise a `RequestRedirect` exception. Both are subclasses of the + `HTTPException` so you can use those errors as responses in the + application. + + If matching succeeded but the URL rule was incompatible to the given + method (for example there were only rules for `GET` and `HEAD` and + routing system tried to match a `POST` request) a `MethodNotAllowed` + exception is raised. + + + :copyright: 2007 Pallets + :license: BSD-3-Clause +""" +import ast +import difflib +import posixpath +import re +import uuid +from pprint import pformat +from threading import Lock + +from ._compat import implements_to_string +from ._compat import iteritems +from ._compat import itervalues +from ._compat import native_string_result +from ._compat import string_types +from ._compat import text_type +from ._compat import to_bytes +from ._compat import to_unicode +from ._compat import wsgi_decoding_dance +from ._internal import _encode_idna +from ._internal import _get_environ +from .datastructures import ImmutableDict +from .datastructures import MultiDict +from .exceptions import BadHost +from .exceptions import HTTPException +from .exceptions import MethodNotAllowed +from .exceptions import NotFound +from .urls import _fast_url_quote +from .urls import url_encode +from .urls import url_join +from .urls import url_quote +from .utils import cached_property +from .utils import format_string +from .utils import redirect +from .wsgi import get_host + +_rule_re = re.compile( + r""" + (?P[^<]*) # static rule data + < + (?: + (?P[a-zA-Z_][a-zA-Z0-9_]*) # converter name + (?:\((?P.*?)\))? # converter arguments + \: # variable delimiter + )? + (?P[a-zA-Z_][a-zA-Z0-9_]*) # variable name + > + """, + re.VERBOSE, +) +_simple_rule_re = re.compile(r"<([^>]+)>") +_converter_args_re = re.compile( + r""" + ((?P\w+)\s*=\s*)? + (?P + True|False| + \d+.\d+| + \d+.| + \d+| + [\w\d_.]+| + [urUR]?(?P"[^"]*?"|'[^']*') + )\s*, + """, + re.VERBOSE | re.UNICODE, +) + + +_PYTHON_CONSTANTS = {"None": None, "True": True, "False": False} + + +def _pythonize(value): + if value in _PYTHON_CONSTANTS: + return _PYTHON_CONSTANTS[value] + for convert in int, float: + try: + return convert(value) + except ValueError: + pass + if value[:1] == value[-1:] and value[0] in "\"'": + value = value[1:-1] + return text_type(value) + + +def parse_converter_args(argstr): + argstr += "," + args = [] + kwargs = {} + + for item in _converter_args_re.finditer(argstr): + value = item.group("stringval") + if value is None: + value = item.group("value") + value = _pythonize(value) + if not item.group("name"): + args.append(value) + else: + name = item.group("name") + kwargs[name] = value + + return tuple(args), kwargs + + +def parse_rule(rule): + """Parse a rule and return it as generator. Each iteration yields tuples + in the form ``(converter, arguments, variable)``. If the converter is + `None` it's a static url part, otherwise it's a dynamic one. + + :internal: + """ + pos = 0 + end = len(rule) + do_match = _rule_re.match + used_names = set() + while pos < end: + m = do_match(rule, pos) + if m is None: + break + data = m.groupdict() + if data["static"]: + yield None, None, data["static"] + variable = data["variable"] + converter = data["converter"] or "default" + if variable in used_names: + raise ValueError("variable name %r used twice." % variable) + used_names.add(variable) + yield converter, data["args"] or None, variable + pos = m.end() + if pos < end: + remaining = rule[pos:] + if ">" in remaining or "<" in remaining: + raise ValueError("malformed url rule: %r" % rule) + yield None, None, remaining + + +class RoutingException(Exception): + """Special exceptions that require the application to redirect, notifying + about missing urls, etc. + + :internal: + """ + + +class RequestRedirect(HTTPException, RoutingException): + """Raise if the map requests a redirect. This is for example the case if + `strict_slashes` are activated and an url that requires a trailing slash. + + The attribute `new_url` contains the absolute destination url. + """ + + code = 308 + + def __init__(self, new_url): + RoutingException.__init__(self, new_url) + self.new_url = new_url + + def get_response(self, environ): + return redirect(self.new_url, self.code) + + +class RequestSlash(RoutingException): + """Internal exception.""" + + +class RequestAliasRedirect(RoutingException): # noqa: B903 + """This rule is an alias and wants to redirect to the canonical URL.""" + + def __init__(self, matched_values): + self.matched_values = matched_values + + +@implements_to_string +class BuildError(RoutingException, LookupError): + """Raised if the build system cannot find a URL for an endpoint with the + values provided. + """ + + def __init__(self, endpoint, values, method, adapter=None): + LookupError.__init__(self, endpoint, values, method) + self.endpoint = endpoint + self.values = values + self.method = method + self.adapter = adapter + + @cached_property + def suggested(self): + return self.closest_rule(self.adapter) + + def closest_rule(self, adapter): + def _score_rule(rule): + return sum( + [ + 0.98 + * difflib.SequenceMatcher( + None, rule.endpoint, self.endpoint + ).ratio(), + 0.01 * bool(set(self.values or ()).issubset(rule.arguments)), + 0.01 * bool(rule.methods and self.method in rule.methods), + ] + ) + + if adapter and adapter.map._rules: + return max(adapter.map._rules, key=_score_rule) + + def __str__(self): + message = [] + message.append("Could not build url for endpoint %r" % self.endpoint) + if self.method: + message.append(" (%r)" % self.method) + if self.values: + message.append(" with values %r" % sorted(self.values.keys())) + message.append(".") + if self.suggested: + if self.endpoint == self.suggested.endpoint: + if self.method and self.method not in self.suggested.methods: + message.append( + " Did you mean to use methods %r?" + % sorted(self.suggested.methods) + ) + missing_values = self.suggested.arguments.union( + set(self.suggested.defaults or ()) + ) - set(self.values.keys()) + if missing_values: + message.append( + " Did you forget to specify values %r?" % sorted(missing_values) + ) + else: + message.append(" Did you mean %r instead?" % self.suggested.endpoint) + return u"".join(message) + + +class ValidationError(ValueError): + """Validation error. If a rule converter raises this exception the rule + does not match the current URL and the next URL is tried. + """ + + +class RuleFactory(object): + """As soon as you have more complex URL setups it's a good idea to use rule + factories to avoid repetitive tasks. Some of them are builtin, others can + be added by subclassing `RuleFactory` and overriding `get_rules`. + """ + + def get_rules(self, map): + """Subclasses of `RuleFactory` have to override this method and return + an iterable of rules.""" + raise NotImplementedError() + + +class Subdomain(RuleFactory): + """All URLs provided by this factory have the subdomain set to a + specific domain. For example if you want to use the subdomain for + the current language this can be a good setup:: + + url_map = Map([ + Rule('/', endpoint='#select_language'), + Subdomain('', [ + Rule('/', endpoint='index'), + Rule('/about', endpoint='about'), + Rule('/help', endpoint='help') + ]) + ]) + + All the rules except for the ``'#select_language'`` endpoint will now + listen on a two letter long subdomain that holds the language code + for the current request. + """ + + def __init__(self, subdomain, rules): + self.subdomain = subdomain + self.rules = rules + + def get_rules(self, map): + for rulefactory in self.rules: + for rule in rulefactory.get_rules(map): + rule = rule.empty() + rule.subdomain = self.subdomain + yield rule + + +class Submount(RuleFactory): + """Like `Subdomain` but prefixes the URL rule with a given string:: + + url_map = Map([ + Rule('/', endpoint='index'), + Submount('/blog', [ + Rule('/', endpoint='blog/index'), + Rule('/entry/', endpoint='blog/show') + ]) + ]) + + Now the rule ``'blog/show'`` matches ``/blog/entry/``. + """ + + def __init__(self, path, rules): + self.path = path.rstrip("/") + self.rules = rules + + def get_rules(self, map): + for rulefactory in self.rules: + for rule in rulefactory.get_rules(map): + rule = rule.empty() + rule.rule = self.path + rule.rule + yield rule + + +class EndpointPrefix(RuleFactory): + """Prefixes all endpoints (which must be strings for this factory) with + another string. This can be useful for sub applications:: + + url_map = Map([ + Rule('/', endpoint='index'), + EndpointPrefix('blog/', [Submount('/blog', [ + Rule('/', endpoint='index'), + Rule('/entry/', endpoint='show') + ])]) + ]) + """ + + def __init__(self, prefix, rules): + self.prefix = prefix + self.rules = rules + + def get_rules(self, map): + for rulefactory in self.rules: + for rule in rulefactory.get_rules(map): + rule = rule.empty() + rule.endpoint = self.prefix + rule.endpoint + yield rule + + +class RuleTemplate(object): + """Returns copies of the rules wrapped and expands string templates in + the endpoint, rule, defaults or subdomain sections. + + Here a small example for such a rule template:: + + from werkzeug.routing import Map, Rule, RuleTemplate + + resource = RuleTemplate([ + Rule('/$name/', endpoint='$name.list'), + Rule('/$name/', endpoint='$name.show') + ]) + + url_map = Map([resource(name='user'), resource(name='page')]) + + When a rule template is called the keyword arguments are used to + replace the placeholders in all the string parameters. + """ + + def __init__(self, rules): + self.rules = list(rules) + + def __call__(self, *args, **kwargs): + return RuleTemplateFactory(self.rules, dict(*args, **kwargs)) + + +class RuleTemplateFactory(RuleFactory): + """A factory that fills in template variables into rules. Used by + `RuleTemplate` internally. + + :internal: + """ + + def __init__(self, rules, context): + self.rules = rules + self.context = context + + def get_rules(self, map): + for rulefactory in self.rules: + for rule in rulefactory.get_rules(map): + new_defaults = subdomain = None + if rule.defaults: + new_defaults = {} + for key, value in iteritems(rule.defaults): + if isinstance(value, string_types): + value = format_string(value, self.context) + new_defaults[key] = value + if rule.subdomain is not None: + subdomain = format_string(rule.subdomain, self.context) + new_endpoint = rule.endpoint + if isinstance(new_endpoint, string_types): + new_endpoint = format_string(new_endpoint, self.context) + yield Rule( + format_string(rule.rule, self.context), + new_defaults, + subdomain, + rule.methods, + rule.build_only, + new_endpoint, + rule.strict_slashes, + ) + + +def _prefix_names(src): + """ast parse and prefix names with `.` to avoid collision with user vars""" + tree = ast.parse(src).body[0] + if isinstance(tree, ast.Expr): + tree = tree.value + for node in ast.walk(tree): + if isinstance(node, ast.Name): + node.id = "." + node.id + return tree + + +_CALL_CONVERTER_CODE_FMT = "self._converters[{elem!r}].to_url()" +_IF_KWARGS_URL_ENCODE_CODE = """\ +if kwargs: + q = '?' + params = self._encode_query_vars(kwargs) +else: + q = params = '' +""" +_IF_KWARGS_URL_ENCODE_AST = _prefix_names(_IF_KWARGS_URL_ENCODE_CODE) +_URL_ENCODE_AST_NAMES = (_prefix_names("q"), _prefix_names("params")) + + +@implements_to_string +class Rule(RuleFactory): + """A Rule represents one URL pattern. There are some options for `Rule` + that change the way it behaves and are passed to the `Rule` constructor. + Note that besides the rule-string all arguments *must* be keyword arguments + in order to not break the application on Werkzeug upgrades. + + `string` + Rule strings basically are just normal URL paths with placeholders in + the format ```` where the converter and the + arguments are optional. If no converter is defined the `default` + converter is used which means `string` in the normal configuration. + + URL rules that end with a slash are branch URLs, others are leaves. + If you have `strict_slashes` enabled (which is the default), all + branch URLs that are matched without a trailing slash will trigger a + redirect to the same URL with the missing slash appended. + + The converters are defined on the `Map`. + + `endpoint` + The endpoint for this rule. This can be anything. A reference to a + function, a string, a number etc. The preferred way is using a string + because the endpoint is used for URL generation. + + `defaults` + An optional dict with defaults for other rules with the same endpoint. + This is a bit tricky but useful if you want to have unique URLs:: + + url_map = Map([ + Rule('/all/', defaults={'page': 1}, endpoint='all_entries'), + Rule('/all/page/', endpoint='all_entries') + ]) + + If a user now visits ``http://example.com/all/page/1`` he will be + redirected to ``http://example.com/all/``. If `redirect_defaults` is + disabled on the `Map` instance this will only affect the URL + generation. + + `subdomain` + The subdomain rule string for this rule. If not specified the rule + only matches for the `default_subdomain` of the map. If the map is + not bound to a subdomain this feature is disabled. + + Can be useful if you want to have user profiles on different subdomains + and all subdomains are forwarded to your application:: + + url_map = Map([ + Rule('/', subdomain='', endpoint='user/homepage'), + Rule('/stats', subdomain='', endpoint='user/stats') + ]) + + `methods` + A sequence of http methods this rule applies to. If not specified, all + methods are allowed. For example this can be useful if you want different + endpoints for `POST` and `GET`. If methods are defined and the path + matches but the method matched against is not in this list or in the + list of another rule for that path the error raised is of the type + `MethodNotAllowed` rather than `NotFound`. If `GET` is present in the + list of methods and `HEAD` is not, `HEAD` is added automatically. + + .. versionchanged:: 0.6.1 + `HEAD` is now automatically added to the methods if `GET` is + present. The reason for this is that existing code often did not + work properly in servers not rewriting `HEAD` to `GET` + automatically and it was not documented how `HEAD` should be + treated. This was considered a bug in Werkzeug because of that. + + `strict_slashes` + Override the `Map` setting for `strict_slashes` only for this rule. If + not specified the `Map` setting is used. + + `build_only` + Set this to True and the rule will never match but will create a URL + that can be build. This is useful if you have resources on a subdomain + or folder that are not handled by the WSGI application (like static data) + + `redirect_to` + If given this must be either a string or callable. In case of a + callable it's called with the url adapter that triggered the match and + the values of the URL as keyword arguments and has to return the target + for the redirect, otherwise it has to be a string with placeholders in + rule syntax:: + + def foo_with_slug(adapter, id): + # ask the database for the slug for the old id. this of + # course has nothing to do with werkzeug. + return 'foo/' + Foo.get_slug_for_id(id) + + url_map = Map([ + Rule('/foo/', endpoint='foo'), + Rule('/some/old/url/', redirect_to='foo/'), + Rule('/other/old/url/', redirect_to=foo_with_slug) + ]) + + When the rule is matched the routing system will raise a + `RequestRedirect` exception with the target for the redirect. + + Keep in mind that the URL will be joined against the URL root of the + script so don't use a leading slash on the target URL unless you + really mean root of that domain. + + `alias` + If enabled this rule serves as an alias for another rule with the same + endpoint and arguments. + + `host` + If provided and the URL map has host matching enabled this can be + used to provide a match rule for the whole host. This also means + that the subdomain feature is disabled. + + .. versionadded:: 0.7 + The `alias` and `host` parameters were added. + """ + + def __init__( + self, + string, + defaults=None, + subdomain=None, + methods=None, + build_only=False, + endpoint=None, + strict_slashes=None, + redirect_to=None, + alias=False, + host=None, + ): + if not string.startswith("/"): + raise ValueError("urls must start with a leading slash") + self.rule = string + self.is_leaf = not string.endswith("/") + + self.map = None + self.strict_slashes = strict_slashes + self.subdomain = subdomain + self.host = host + self.defaults = defaults + self.build_only = build_only + self.alias = alias + if methods is None: + self.methods = None + else: + if isinstance(methods, str): + raise TypeError("param `methods` should be `Iterable[str]`, not `str`") + self.methods = set([x.upper() for x in methods]) + if "HEAD" not in self.methods and "GET" in self.methods: + self.methods.add("HEAD") + self.endpoint = endpoint + self.redirect_to = redirect_to + + if defaults: + self.arguments = set(map(str, defaults)) + else: + self.arguments = set() + self._trace = self._converters = self._regex = self._argument_weights = None + + def empty(self): + """ + Return an unbound copy of this rule. + + This can be useful if want to reuse an already bound URL for another + map. See ``get_empty_kwargs`` to override what keyword arguments are + provided to the new copy. + """ + return type(self)(self.rule, **self.get_empty_kwargs()) + + def get_empty_kwargs(self): + """ + Provides kwargs for instantiating empty copy with empty() + + Use this method to provide custom keyword arguments to the subclass of + ``Rule`` when calling ``some_rule.empty()``. Helpful when the subclass + has custom keyword arguments that are needed at instantiation. + + Must return a ``dict`` that will be provided as kwargs to the new + instance of ``Rule``, following the initial ``self.rule`` value which + is always provided as the first, required positional argument. + """ + defaults = None + if self.defaults: + defaults = dict(self.defaults) + return dict( + defaults=defaults, + subdomain=self.subdomain, + methods=self.methods, + build_only=self.build_only, + endpoint=self.endpoint, + strict_slashes=self.strict_slashes, + redirect_to=self.redirect_to, + alias=self.alias, + host=self.host, + ) + + def get_rules(self, map): + yield self + + def refresh(self): + """Rebinds and refreshes the URL. Call this if you modified the + rule in place. + + :internal: + """ + self.bind(self.map, rebind=True) + + def bind(self, map, rebind=False): + """Bind the url to a map and create a regular expression based on + the information from the rule itself and the defaults from the map. + + :internal: + """ + if self.map is not None and not rebind: + raise RuntimeError("url rule %r already bound to map %r" % (self, self.map)) + self.map = map + if self.strict_slashes is None: + self.strict_slashes = map.strict_slashes + if self.subdomain is None: + self.subdomain = map.default_subdomain + self.compile() + + def get_converter(self, variable_name, converter_name, args, kwargs): + """Looks up the converter for the given parameter. + + .. versionadded:: 0.9 + """ + if converter_name not in self.map.converters: + raise LookupError("the converter %r does not exist" % converter_name) + return self.map.converters[converter_name](self.map, *args, **kwargs) + + def _encode_query_vars(self, query_vars): + return url_encode( + query_vars, + charset=self.map.charset, + sort=self.map.sort_parameters, + key=self.map.sort_key, + ) + + def compile(self): + """Compiles the regular expression and stores it.""" + assert self.map is not None, "rule not bound" + + if self.map.host_matching: + domain_rule = self.host or "" + else: + domain_rule = self.subdomain or "" + + self._trace = [] + self._converters = {} + self._static_weights = [] + self._argument_weights = [] + regex_parts = [] + + def _build_regex(rule): + index = 0 + for converter, arguments, variable in parse_rule(rule): + if converter is None: + regex_parts.append(re.escape(variable)) + self._trace.append((False, variable)) + for part in variable.split("/"): + if part: + self._static_weights.append((index, -len(part))) + else: + if arguments: + c_args, c_kwargs = parse_converter_args(arguments) + else: + c_args = () + c_kwargs = {} + convobj = self.get_converter(variable, converter, c_args, c_kwargs) + regex_parts.append("(?P<%s>%s)" % (variable, convobj.regex)) + self._converters[variable] = convobj + self._trace.append((True, variable)) + self._argument_weights.append(convobj.weight) + self.arguments.add(str(variable)) + index = index + 1 + + _build_regex(domain_rule) + regex_parts.append("\\|") + self._trace.append((False, "|")) + _build_regex(self.rule if self.is_leaf else self.rule.rstrip("/")) + if not self.is_leaf: + self._trace.append((False, "/")) + + self._build = self._compile_builder(False).__get__(self, None) + self._build_unknown = self._compile_builder(True).__get__(self, None) + + if self.build_only: + return + regex = r"^%s%s$" % ( + u"".join(regex_parts), + (not self.is_leaf or not self.strict_slashes) + and "(?/?)" + or "", + ) + self._regex = re.compile(regex, re.UNICODE) + + def match(self, path, method=None): + """Check if the rule matches a given path. Path is a string in the + form ``"subdomain|/path"`` and is assembled by the map. If + the map is doing host matching the subdomain part will be the host + instead. + + If the rule matches a dict with the converted values is returned, + otherwise the return value is `None`. + + :internal: + """ + if not self.build_only: + m = self._regex.search(path) + if m is not None: + groups = m.groupdict() + # we have a folder like part of the url without a trailing + # slash and strict slashes enabled. raise an exception that + # tells the map to redirect to the same url but with a + # trailing slash + if ( + self.strict_slashes + and not self.is_leaf + and not groups.pop("__suffix__") + and ( + method is None or self.methods is None or method in self.methods + ) + ): + raise RequestSlash() + # if we are not in strict slashes mode we have to remove + # a __suffix__ + elif not self.strict_slashes: + del groups["__suffix__"] + + result = {} + for name, value in iteritems(groups): + try: + value = self._converters[name].to_python(value) + except ValidationError: + return + result[str(name)] = value + if self.defaults: + result.update(self.defaults) + + if self.alias and self.map.redirect_defaults: + raise RequestAliasRedirect(result) + + return result + + @staticmethod + def _get_func_code(code, name): + globs, locs = {}, {} + exec(code, globs, locs) + return locs[name] + + def _compile_builder(self, append_unknown=True): + defaults = self.defaults or {} + dom_ops = [] + url_ops = [] + + opl = dom_ops + for is_dynamic, data in self._trace: + if data == "|" and opl is dom_ops: + opl = url_ops + continue + # this seems like a silly case to ever come up but: + # if a default is given for a value that appears in the rule, + # resolve it to a constant ahead of time + if is_dynamic and data in defaults: + data = self._converters[data].to_url(defaults[data]) + opl.append((False, data)) + elif not is_dynamic: + opl.append( + (False, url_quote(to_bytes(data, self.map.charset), safe="/:|+")) + ) + else: + opl.append((True, data)) + + def _convert(elem): + ret = _prefix_names(_CALL_CONVERTER_CODE_FMT.format(elem=elem)) + ret.args = [ast.Name(str(elem), ast.Load())] # str for py2 + return ret + + def _parts(ops): + parts = [ + _convert(elem) if is_dynamic else ast.Str(s=elem) + for is_dynamic, elem in ops + ] + parts = parts or [ast.Str("")] + # constant fold + ret = [parts[0]] + for p in parts[1:]: + if isinstance(p, ast.Str) and isinstance(ret[-1], ast.Str): + ret[-1] = ast.Str(ret[-1].s + p.s) + else: + ret.append(p) + return ret + + dom_parts = _parts(dom_ops) + url_parts = _parts(url_ops) + if not append_unknown: + body = [] + else: + body = [_IF_KWARGS_URL_ENCODE_AST] + url_parts.extend(_URL_ENCODE_AST_NAMES) + + def _join(parts): + if len(parts) == 1: # shortcut + return parts[0] + elif hasattr(ast, "JoinedStr"): # py36+ + return ast.JoinedStr(parts) + else: + call = _prefix_names('"".join()') + call.args = [ast.Tuple(parts, ast.Load())] + return call + + body.append( + ast.Return(ast.Tuple([_join(dom_parts), _join(url_parts)], ast.Load())) + ) + + # str is necessary for python2 + pargs = [ + str(elem) + for is_dynamic, elem in dom_ops + url_ops + if is_dynamic and elem not in defaults + ] + kargs = [str(k) for k in defaults] + + func_ast = _prefix_names("def _(): pass") + func_ast.name = "".format(self.rule) + if hasattr(ast, "arg"): # py3 + func_ast.args.args.append(ast.arg(".self", None)) + for arg in pargs + kargs: + func_ast.args.args.append(ast.arg(arg, None)) + func_ast.args.kwarg = ast.arg(".kwargs", None) + else: + func_ast.args.args.append(ast.Name(".self", ast.Param())) + for arg in pargs + kargs: + func_ast.args.args.append(ast.Name(arg, ast.Param())) + func_ast.args.kwarg = ".kwargs" + for _ in kargs: + func_ast.args.defaults.append(ast.Str("")) + func_ast.body = body + + # use `ast.parse` instead of `ast.Module` for better portability + # python3.8 changes the signature of `ast.Module` + module = ast.parse("") + module.body = [func_ast] + + # mark everything as on line 1, offset 0 + # less error-prone than `ast.fix_missing_locations` + # bad line numbers cause an assert to fail in debug builds + for node in ast.walk(module): + if "lineno" in node._attributes: + node.lineno = 1 + if "col_offset" in node._attributes: + node.col_offset = 0 + + code = compile(module, "", "exec") + return self._get_func_code(code, func_ast.name) + + def build(self, values, append_unknown=True): + """Assembles the relative url for that rule and the subdomain. + If building doesn't work for some reasons `None` is returned. + + :internal: + """ + try: + if append_unknown: + return self._build_unknown(**values) + else: + return self._build(**values) + except ValidationError: + return None + + def provides_defaults_for(self, rule): + """Check if this rule has defaults for a given rule. + + :internal: + """ + return ( + not self.build_only + and self.defaults + and self.endpoint == rule.endpoint + and self != rule + and self.arguments == rule.arguments + ) + + def suitable_for(self, values, method=None): + """Check if the dict of values has enough data for url generation. + + :internal: + """ + # if a method was given explicitly and that method is not supported + # by this rule, this rule is not suitable. + if ( + method is not None + and self.methods is not None + and method not in self.methods + ): + return False + + defaults = self.defaults or () + + # all arguments required must be either in the defaults dict or + # the value dictionary otherwise it's not suitable + for key in self.arguments: + if key not in defaults and key not in values: + return False + + # in case defaults are given we ensure that either the value was + # skipped or the value is the same as the default value. + if defaults: + for key, value in iteritems(defaults): + if key in values and value != values[key]: + return False + + return True + + def match_compare_key(self): + """The match compare key for sorting. + + Current implementation: + + 1. rules without any arguments come first for performance + reasons only as we expect them to match faster and some + common ones usually don't have any arguments (index pages etc.) + 2. rules with more static parts come first so the second argument + is the negative length of the number of the static weights. + 3. we order by static weights, which is a combination of index + and length + 4. The more complex rules come first so the next argument is the + negative length of the number of argument weights. + 5. lastly we order by the actual argument weights. + + :internal: + """ + return ( + bool(self.arguments), + -len(self._static_weights), + self._static_weights, + -len(self._argument_weights), + self._argument_weights, + ) + + def build_compare_key(self): + """The build compare key for sorting. + + :internal: + """ + return 1 if self.alias else 0, -len(self.arguments), -len(self.defaults or ()) + + def __eq__(self, other): + return self.__class__ is other.__class__ and self._trace == other._trace + + __hash__ = None + + def __ne__(self, other): + return not self.__eq__(other) + + def __str__(self): + return self.rule + + @native_string_result + def __repr__(self): + if self.map is None: + return u"<%s (unbound)>" % self.__class__.__name__ + tmp = [] + for is_dynamic, data in self._trace: + if is_dynamic: + tmp.append(u"<%s>" % data) + else: + tmp.append(data) + return u"<%s %s%s -> %s>" % ( + self.__class__.__name__, + repr((u"".join(tmp)).lstrip(u"|")).lstrip(u"u"), + self.methods is not None and u" (%s)" % u", ".join(self.methods) or u"", + self.endpoint, + ) + + +class BaseConverter(object): + """Base class for all converters.""" + + regex = "[^/]+" + weight = 100 + + def __init__(self, map): + self.map = map + + def to_python(self, value): + return value + + def to_url(self, value): + if isinstance(value, (bytes, bytearray)): + return _fast_url_quote(value) + return _fast_url_quote(text_type(value).encode(self.map.charset)) + + +class UnicodeConverter(BaseConverter): + """This converter is the default converter and accepts any string but + only one path segment. Thus the string can not include a slash. + + This is the default validator. + + Example:: + + Rule('/pages/'), + Rule('/') + + :param map: the :class:`Map`. + :param minlength: the minimum length of the string. Must be greater + or equal 1. + :param maxlength: the maximum length of the string. + :param length: the exact length of the string. + """ + + def __init__(self, map, minlength=1, maxlength=None, length=None): + BaseConverter.__init__(self, map) + if length is not None: + length = "{%d}" % int(length) + else: + if maxlength is None: + maxlength = "" + else: + maxlength = int(maxlength) + length = "{%s,%s}" % (int(minlength), maxlength) + self.regex = "[^/]" + length + + +class AnyConverter(BaseConverter): + """Matches one of the items provided. Items can either be Python + identifiers or strings:: + + Rule('/') + + :param map: the :class:`Map`. + :param items: this function accepts the possible items as positional + arguments. + """ + + def __init__(self, map, *items): + BaseConverter.__init__(self, map) + self.regex = "(?:%s)" % "|".join([re.escape(x) for x in items]) + + +class PathConverter(BaseConverter): + """Like the default :class:`UnicodeConverter`, but it also matches + slashes. This is useful for wikis and similar applications:: + + Rule('/') + Rule('//edit') + + :param map: the :class:`Map`. + """ + + regex = "[^/].*?" + weight = 200 + + +class NumberConverter(BaseConverter): + """Baseclass for `IntegerConverter` and `FloatConverter`. + + :internal: + """ + + weight = 50 + + def __init__(self, map, fixed_digits=0, min=None, max=None, signed=False): + if signed: + self.regex = self.signed_regex + BaseConverter.__init__(self, map) + self.fixed_digits = fixed_digits + self.min = min + self.max = max + self.signed = signed + + def to_python(self, value): + if self.fixed_digits and len(value) != self.fixed_digits: + raise ValidationError() + value = self.num_convert(value) + if (self.min is not None and value < self.min) or ( + self.max is not None and value > self.max + ): + raise ValidationError() + return value + + def to_url(self, value): + value = self.num_convert(value) + if self.fixed_digits: + value = ("%%0%sd" % self.fixed_digits) % value + return str(value) + + @property + def signed_regex(self): + return r"-?" + self.regex + + +class IntegerConverter(NumberConverter): + """This converter only accepts integer values:: + + Rule("/page/") + + By default it only accepts unsigned, positive values. The ``signed`` + parameter will enable signed, negative values. :: + + Rule("/page/") + + :param map: The :class:`Map`. + :param fixed_digits: The number of fixed digits in the URL. If you + set this to ``4`` for example, the rule will only match if the + URL looks like ``/0001/``. The default is variable length. + :param min: The minimal value. + :param max: The maximal value. + :param signed: Allow signed (negative) values. + + .. versionadded:: 0.15 + The ``signed`` parameter. + """ + + regex = r"\d+" + num_convert = int + + +class FloatConverter(NumberConverter): + """This converter only accepts floating point values:: + + Rule("/probability/") + + By default it only accepts unsigned, positive values. The ``signed`` + parameter will enable signed, negative values. :: + + Rule("/offset/") + + :param map: The :class:`Map`. + :param min: The minimal value. + :param max: The maximal value. + :param signed: Allow signed (negative) values. + + .. versionadded:: 0.15 + The ``signed`` parameter. + """ + + regex = r"\d+\.\d+" + num_convert = float + + def __init__(self, map, min=None, max=None, signed=False): + NumberConverter.__init__(self, map, min=min, max=max, signed=signed) + + +class UUIDConverter(BaseConverter): + """This converter only accepts UUID strings:: + + Rule('/object/') + + .. versionadded:: 0.10 + + :param map: the :class:`Map`. + """ + + regex = ( + r"[A-Fa-f0-9]{8}-[A-Fa-f0-9]{4}-" + r"[A-Fa-f0-9]{4}-[A-Fa-f0-9]{4}-[A-Fa-f0-9]{12}" + ) + + def to_python(self, value): + return uuid.UUID(value) + + def to_url(self, value): + return str(value) + + +#: the default converter mapping for the map. +DEFAULT_CONVERTERS = { + "default": UnicodeConverter, + "string": UnicodeConverter, + "any": AnyConverter, + "path": PathConverter, + "int": IntegerConverter, + "float": FloatConverter, + "uuid": UUIDConverter, +} + + +class Map(object): + """The map class stores all the URL rules and some configuration + parameters. Some of the configuration values are only stored on the + `Map` instance since those affect all rules, others are just defaults + and can be overridden for each rule. Note that you have to specify all + arguments besides the `rules` as keyword arguments! + + :param rules: sequence of url rules for this map. + :param default_subdomain: The default subdomain for rules without a + subdomain defined. + :param charset: charset of the url. defaults to ``"utf-8"`` + :param strict_slashes: Take care of trailing slashes. + :param redirect_defaults: This will redirect to the default rule if it + wasn't visited that way. This helps creating + unique URLs. + :param converters: A dict of converters that adds additional converters + to the list of converters. If you redefine one + converter this will override the original one. + :param sort_parameters: If set to `True` the url parameters are sorted. + See `url_encode` for more details. + :param sort_key: The sort key function for `url_encode`. + :param encoding_errors: the error method to use for decoding + :param host_matching: if set to `True` it enables the host matching + feature and disables the subdomain one. If + enabled the `host` parameter to rules is used + instead of the `subdomain` one. + + .. versionadded:: 0.5 + `sort_parameters` and `sort_key` was added. + + .. versionadded:: 0.7 + `encoding_errors` and `host_matching` was added. + """ + + #: A dict of default converters to be used. + default_converters = ImmutableDict(DEFAULT_CONVERTERS) + + def __init__( + self, + rules=None, + default_subdomain="", + charset="utf-8", + strict_slashes=True, + redirect_defaults=True, + converters=None, + sort_parameters=False, + sort_key=None, + encoding_errors="replace", + host_matching=False, + ): + self._rules = [] + self._rules_by_endpoint = {} + self._remap = True + self._remap_lock = Lock() + + self.default_subdomain = default_subdomain + self.charset = charset + self.encoding_errors = encoding_errors + self.strict_slashes = strict_slashes + self.redirect_defaults = redirect_defaults + self.host_matching = host_matching + + self.converters = self.default_converters.copy() + if converters: + self.converters.update(converters) + + self.sort_parameters = sort_parameters + self.sort_key = sort_key + + for rulefactory in rules or (): + self.add(rulefactory) + + def is_endpoint_expecting(self, endpoint, *arguments): + """Iterate over all rules and check if the endpoint expects + the arguments provided. This is for example useful if you have + some URLs that expect a language code and others that do not and + you want to wrap the builder a bit so that the current language + code is automatically added if not provided but endpoints expect + it. + + :param endpoint: the endpoint to check. + :param arguments: this function accepts one or more arguments + as positional arguments. Each one of them is + checked. + """ + self.update() + arguments = set(arguments) + for rule in self._rules_by_endpoint[endpoint]: + if arguments.issubset(rule.arguments): + return True + return False + + def iter_rules(self, endpoint=None): + """Iterate over all rules or the rules of an endpoint. + + :param endpoint: if provided only the rules for that endpoint + are returned. + :return: an iterator + """ + self.update() + if endpoint is not None: + return iter(self._rules_by_endpoint[endpoint]) + return iter(self._rules) + + def add(self, rulefactory): + """Add a new rule or factory to the map and bind it. Requires that the + rule is not bound to another map. + + :param rulefactory: a :class:`Rule` or :class:`RuleFactory` + """ + for rule in rulefactory.get_rules(self): + rule.bind(self) + self._rules.append(rule) + self._rules_by_endpoint.setdefault(rule.endpoint, []).append(rule) + self._remap = True + + def bind( + self, + server_name, + script_name=None, + subdomain=None, + url_scheme="http", + default_method="GET", + path_info=None, + query_args=None, + ): + """Return a new :class:`MapAdapter` with the details specified to the + call. Note that `script_name` will default to ``'/'`` if not further + specified or `None`. The `server_name` at least is a requirement + because the HTTP RFC requires absolute URLs for redirects and so all + redirect exceptions raised by Werkzeug will contain the full canonical + URL. + + If no path_info is passed to :meth:`match` it will use the default path + info passed to bind. While this doesn't really make sense for + manual bind calls, it's useful if you bind a map to a WSGI + environment which already contains the path info. + + `subdomain` will default to the `default_subdomain` for this map if + no defined. If there is no `default_subdomain` you cannot use the + subdomain feature. + + .. versionadded:: 0.7 + `query_args` added + + .. versionadded:: 0.8 + `query_args` can now also be a string. + + .. versionchanged:: 0.15 + ``path_info`` defaults to ``'/'`` if ``None``. + """ + server_name = server_name.lower() + if self.host_matching: + if subdomain is not None: + raise RuntimeError("host matching enabled and a subdomain was provided") + elif subdomain is None: + subdomain = self.default_subdomain + if script_name is None: + script_name = "/" + if path_info is None: + path_info = "/" + try: + server_name = _encode_idna(server_name) + except UnicodeError: + raise BadHost() + return MapAdapter( + self, + server_name, + script_name, + subdomain, + url_scheme, + path_info, + default_method, + query_args, + ) + + def bind_to_environ(self, environ, server_name=None, subdomain=None): + """Like :meth:`bind` but you can pass it an WSGI environment and it + will fetch the information from that dictionary. Note that because of + limitations in the protocol there is no way to get the current + subdomain and real `server_name` from the environment. If you don't + provide it, Werkzeug will use `SERVER_NAME` and `SERVER_PORT` (or + `HTTP_HOST` if provided) as used `server_name` with disabled subdomain + feature. + + If `subdomain` is `None` but an environment and a server name is + provided it will calculate the current subdomain automatically. + Example: `server_name` is ``'example.com'`` and the `SERVER_NAME` + in the wsgi `environ` is ``'staging.dev.example.com'`` the calculated + subdomain will be ``'staging.dev'``. + + If the object passed as environ has an environ attribute, the value of + this attribute is used instead. This allows you to pass request + objects. Additionally `PATH_INFO` added as a default of the + :class:`MapAdapter` so that you don't have to pass the path info to + the match method. + + .. versionchanged:: 0.5 + previously this method accepted a bogus `calculate_subdomain` + parameter that did not have any effect. It was removed because + of that. + + .. versionchanged:: 0.8 + This will no longer raise a ValueError when an unexpected server + name was passed. + + :param environ: a WSGI environment. + :param server_name: an optional server name hint (see above). + :param subdomain: optionally the current subdomain (see above). + """ + environ = _get_environ(environ) + + wsgi_server_name = get_host(environ).lower() + + if server_name is None: + server_name = wsgi_server_name + else: + server_name = server_name.lower() + + if subdomain is None and not self.host_matching: + cur_server_name = wsgi_server_name.split(".") + real_server_name = server_name.split(".") + offset = -len(real_server_name) + if cur_server_name[offset:] != real_server_name: + # This can happen even with valid configs if the server was + # accesssed directly by IP address under some situations. + # Instead of raising an exception like in Werkzeug 0.7 or + # earlier we go by an invalid subdomain which will result + # in a 404 error on matching. + subdomain = "" + else: + subdomain = ".".join(filter(None, cur_server_name[:offset])) + + def _get_wsgi_string(name): + val = environ.get(name) + if val is not None: + return wsgi_decoding_dance(val, self.charset) + + script_name = _get_wsgi_string("SCRIPT_NAME") + path_info = _get_wsgi_string("PATH_INFO") + query_args = _get_wsgi_string("QUERY_STRING") + return Map.bind( + self, + server_name, + script_name, + subdomain, + environ["wsgi.url_scheme"], + environ["REQUEST_METHOD"], + path_info, + query_args=query_args, + ) + + def update(self): + """Called before matching and building to keep the compiled rules + in the correct order after things changed. + """ + if not self._remap: + return + + with self._remap_lock: + if not self._remap: + return + + self._rules.sort(key=lambda x: x.match_compare_key()) + for rules in itervalues(self._rules_by_endpoint): + rules.sort(key=lambda x: x.build_compare_key()) + self._remap = False + + def __repr__(self): + rules = self.iter_rules() + return "%s(%s)" % (self.__class__.__name__, pformat(list(rules))) + + +class MapAdapter(object): + + """Returned by :meth:`Map.bind` or :meth:`Map.bind_to_environ` and does + the URL matching and building based on runtime information. + """ + + def __init__( + self, + map, + server_name, + script_name, + subdomain, + url_scheme, + path_info, + default_method, + query_args=None, + ): + self.map = map + self.server_name = to_unicode(server_name) + script_name = to_unicode(script_name) + if not script_name.endswith(u"/"): + script_name += u"/" + self.script_name = script_name + self.subdomain = to_unicode(subdomain) + self.url_scheme = to_unicode(url_scheme) + self.path_info = to_unicode(path_info) + self.default_method = to_unicode(default_method) + self.query_args = query_args + + def dispatch( + self, view_func, path_info=None, method=None, catch_http_exceptions=False + ): + """Does the complete dispatching process. `view_func` is called with + the endpoint and a dict with the values for the view. It should + look up the view function, call it, and return a response object + or WSGI application. http exceptions are not caught by default + so that applications can display nicer error messages by just + catching them by hand. If you want to stick with the default + error messages you can pass it ``catch_http_exceptions=True`` and + it will catch the http exceptions. + + Here a small example for the dispatch usage:: + + from werkzeug.wrappers import Request, Response + from werkzeug.wsgi import responder + from werkzeug.routing import Map, Rule + + def on_index(request): + return Response('Hello from the index') + + url_map = Map([Rule('/', endpoint='index')]) + views = {'index': on_index} + + @responder + def application(environ, start_response): + request = Request(environ) + urls = url_map.bind_to_environ(environ) + return urls.dispatch(lambda e, v: views[e](request, **v), + catch_http_exceptions=True) + + Keep in mind that this method might return exception objects, too, so + use :class:`Response.force_type` to get a response object. + + :param view_func: a function that is called with the endpoint as + first argument and the value dict as second. Has + to dispatch to the actual view function with this + information. (see above) + :param path_info: the path info to use for matching. Overrides the + path info specified on binding. + :param method: the HTTP method used for matching. Overrides the + method specified on binding. + :param catch_http_exceptions: set to `True` to catch any of the + werkzeug :class:`HTTPException`\\s. + """ + try: + try: + endpoint, args = self.match(path_info, method) + except RequestRedirect as e: + return e + return view_func(endpoint, args) + except HTTPException as e: + if catch_http_exceptions: + return e + raise + + def match(self, path_info=None, method=None, return_rule=False, query_args=None): + """The usage is simple: you just pass the match method the current + path info as well as the method (which defaults to `GET`). The + following things can then happen: + + - you receive a `NotFound` exception that indicates that no URL is + matching. A `NotFound` exception is also a WSGI application you + can call to get a default page not found page (happens to be the + same object as `werkzeug.exceptions.NotFound`) + + - you receive a `MethodNotAllowed` exception that indicates that there + is a match for this URL but not for the current request method. + This is useful for RESTful applications. + + - you receive a `RequestRedirect` exception with a `new_url` + attribute. This exception is used to notify you about a request + Werkzeug requests from your WSGI application. This is for example the + case if you request ``/foo`` although the correct URL is ``/foo/`` + You can use the `RequestRedirect` instance as response-like object + similar to all other subclasses of `HTTPException`. + + - you get a tuple in the form ``(endpoint, arguments)`` if there is + a match (unless `return_rule` is True, in which case you get a tuple + in the form ``(rule, arguments)``) + + If the path info is not passed to the match method the default path + info of the map is used (defaults to the root URL if not defined + explicitly). + + All of the exceptions raised are subclasses of `HTTPException` so they + can be used as WSGI responses. They will all render generic error or + redirect pages. + + Here is a small example for matching: + + >>> m = Map([ + ... Rule('/', endpoint='index'), + ... Rule('/downloads/', endpoint='downloads/index'), + ... Rule('/downloads/', endpoint='downloads/show') + ... ]) + >>> urls = m.bind("example.com", "/") + >>> urls.match("/", "GET") + ('index', {}) + >>> urls.match("/downloads/42") + ('downloads/show', {'id': 42}) + + And here is what happens on redirect and missing URLs: + + >>> urls.match("/downloads") + Traceback (most recent call last): + ... + RequestRedirect: http://example.com/downloads/ + >>> urls.match("/missing") + Traceback (most recent call last): + ... + NotFound: 404 Not Found + + :param path_info: the path info to use for matching. Overrides the + path info specified on binding. + :param method: the HTTP method used for matching. Overrides the + method specified on binding. + :param return_rule: return the rule that matched instead of just the + endpoint (defaults to `False`). + :param query_args: optional query arguments that are used for + automatic redirects as string or dictionary. It's + currently not possible to use the query arguments + for URL matching. + + .. versionadded:: 0.6 + `return_rule` was added. + + .. versionadded:: 0.7 + `query_args` was added. + + .. versionchanged:: 0.8 + `query_args` can now also be a string. + """ + self.map.update() + if path_info is None: + path_info = self.path_info + else: + path_info = to_unicode(path_info, self.map.charset) + if query_args is None: + query_args = self.query_args + method = (method or self.default_method).upper() + + path = u"%s|%s" % ( + self.map.host_matching and self.server_name or self.subdomain, + path_info and "/%s" % path_info.lstrip("/"), + ) + + have_match_for = set() + for rule in self.map._rules: + try: + rv = rule.match(path, method) + except RequestSlash: + raise RequestRedirect( + self.make_redirect_url( + url_quote(path_info, self.map.charset, safe="/:|+") + "/", + query_args, + ) + ) + except RequestAliasRedirect as e: + raise RequestRedirect( + self.make_alias_redirect_url( + path, rule.endpoint, e.matched_values, method, query_args + ) + ) + if rv is None: + continue + if rule.methods is not None and method not in rule.methods: + have_match_for.update(rule.methods) + continue + + if self.map.redirect_defaults: + redirect_url = self.get_default_redirect(rule, method, rv, query_args) + if redirect_url is not None: + raise RequestRedirect(redirect_url) + + if rule.redirect_to is not None: + if isinstance(rule.redirect_to, string_types): + + def _handle_match(match): + value = rv[match.group(1)] + return rule._converters[match.group(1)].to_url(value) + + redirect_url = _simple_rule_re.sub(_handle_match, rule.redirect_to) + else: + redirect_url = rule.redirect_to(self, **rv) + raise RequestRedirect( + str( + url_join( + "%s://%s%s%s" + % ( + self.url_scheme or "http", + self.subdomain + "." if self.subdomain else "", + self.server_name, + self.script_name, + ), + redirect_url, + ) + ) + ) + + if return_rule: + return rule, rv + else: + return rule.endpoint, rv + + if have_match_for: + raise MethodNotAllowed(valid_methods=list(have_match_for)) + raise NotFound() + + def test(self, path_info=None, method=None): + """Test if a rule would match. Works like `match` but returns `True` + if the URL matches, or `False` if it does not exist. + + :param path_info: the path info to use for matching. Overrides the + path info specified on binding. + :param method: the HTTP method used for matching. Overrides the + method specified on binding. + """ + try: + self.match(path_info, method) + except RequestRedirect: + pass + except HTTPException: + return False + return True + + def allowed_methods(self, path_info=None): + """Returns the valid methods that match for a given path. + + .. versionadded:: 0.7 + """ + try: + self.match(path_info, method="--") + except MethodNotAllowed as e: + return e.valid_methods + except HTTPException: + pass + return [] + + def get_host(self, domain_part): + """Figures out the full host name for the given domain part. The + domain part is a subdomain in case host matching is disabled or + a full host name. + """ + if self.map.host_matching: + if domain_part is None: + return self.server_name + return to_unicode(domain_part, "ascii") + subdomain = domain_part + if subdomain is None: + subdomain = self.subdomain + else: + subdomain = to_unicode(subdomain, "ascii") + return (subdomain + u"." if subdomain else u"") + self.server_name + + def get_default_redirect(self, rule, method, values, query_args): + """A helper that returns the URL to redirect to if it finds one. + This is used for default redirecting only. + + :internal: + """ + assert self.map.redirect_defaults + for r in self.map._rules_by_endpoint[rule.endpoint]: + # every rule that comes after this one, including ourself + # has a lower priority for the defaults. We order the ones + # with the highest priority up for building. + if r is rule: + break + if r.provides_defaults_for(rule) and r.suitable_for(values, method): + values.update(r.defaults) + domain_part, path = r.build(values) + return self.make_redirect_url(path, query_args, domain_part=domain_part) + + def encode_query_args(self, query_args): + if not isinstance(query_args, string_types): + query_args = url_encode(query_args, self.map.charset) + return query_args + + def make_redirect_url(self, path_info, query_args=None, domain_part=None): + """Creates a redirect URL. + + :internal: + """ + suffix = "" + if query_args: + suffix = "?" + self.encode_query_args(query_args) + return str( + "%s://%s/%s%s" + % ( + self.url_scheme or "http", + self.get_host(domain_part), + posixpath.join( + self.script_name[:-1].lstrip("/"), path_info.lstrip("/") + ), + suffix, + ) + ) + + def make_alias_redirect_url(self, path, endpoint, values, method, query_args): + """Internally called to make an alias redirect URL.""" + url = self.build( + endpoint, values, method, append_unknown=False, force_external=True + ) + if query_args: + url += "?" + self.encode_query_args(query_args) + assert url != path, "detected invalid alias setting. No canonical URL found" + return url + + def _partial_build(self, endpoint, values, method, append_unknown): + """Helper for :meth:`build`. Returns subdomain and path for the + rule that accepts this endpoint, values and method. + + :internal: + """ + # in case the method is none, try with the default method first + if method is None: + rv = self._partial_build( + endpoint, values, self.default_method, append_unknown + ) + if rv is not None: + return rv + + # default method did not match or a specific method is passed, + # check all and go with first result. + for rule in self.map._rules_by_endpoint.get(endpoint, ()): + if rule.suitable_for(values, method): + rv = rule.build(values, append_unknown) + if rv is not None: + return rv + + def build( + self, + endpoint, + values=None, + method=None, + force_external=False, + append_unknown=True, + ): + """Building URLs works pretty much the other way round. Instead of + `match` you call `build` and pass it the endpoint and a dict of + arguments for the placeholders. + + The `build` function also accepts an argument called `force_external` + which, if you set it to `True` will force external URLs. Per default + external URLs (include the server name) will only be used if the + target URL is on a different subdomain. + + >>> m = Map([ + ... Rule('/', endpoint='index'), + ... Rule('/downloads/', endpoint='downloads/index'), + ... Rule('/downloads/', endpoint='downloads/show') + ... ]) + >>> urls = m.bind("example.com", "/") + >>> urls.build("index", {}) + '/' + >>> urls.build("downloads/show", {'id': 42}) + '/downloads/42' + >>> urls.build("downloads/show", {'id': 42}, force_external=True) + 'http://example.com/downloads/42' + + Because URLs cannot contain non ASCII data you will always get + bytestrings back. Non ASCII characters are urlencoded with the + charset defined on the map instance. + + Additional values are converted to unicode and appended to the URL as + URL querystring parameters: + + >>> urls.build("index", {'q': 'My Searchstring'}) + '/?q=My+Searchstring' + + When processing those additional values, lists are furthermore + interpreted as multiple values (as per + :py:class:`werkzeug.datastructures.MultiDict`): + + >>> urls.build("index", {'q': ['a', 'b', 'c']}) + '/?q=a&q=b&q=c' + + Passing a ``MultiDict`` will also add multiple values: + + >>> urls.build("index", MultiDict((('p', 'z'), ('q', 'a'), ('q', 'b')))) + '/?p=z&q=a&q=b' + + If a rule does not exist when building a `BuildError` exception is + raised. + + The build method accepts an argument called `method` which allows you + to specify the method you want to have an URL built for if you have + different methods for the same endpoint specified. + + .. versionadded:: 0.6 + the `append_unknown` parameter was added. + + :param endpoint: the endpoint of the URL to build. + :param values: the values for the URL to build. Unhandled values are + appended to the URL as query parameters. + :param method: the HTTP method for the rule if there are different + URLs for different methods on the same endpoint. + :param force_external: enforce full canonical external URLs. If the URL + scheme is not provided, this will generate + a protocol-relative URL. + :param append_unknown: unknown parameters are appended to the generated + URL as query string argument. Disable this + if you want the builder to ignore those. + """ + self.map.update() + + if values: + if isinstance(values, MultiDict): + temp_values = {} + # iteritems(dict, values) is like `values.lists()` + # without the call or `list()` coercion overhead. + for key, value in iteritems(dict, values): + if not value: + continue + if len(value) == 1: # flatten single item lists + value = value[0] + if value is None: # drop None + continue + temp_values[key] = value + values = temp_values + else: + # drop None + values = dict(i for i in iteritems(values) if i[1] is not None) + else: + values = {} + + rv = self._partial_build(endpoint, values, method, append_unknown) + if rv is None: + raise BuildError(endpoint, values, method, self) + domain_part, path = rv + + host = self.get_host(domain_part) + + # shortcut this. + if not force_external and ( + (self.map.host_matching and host == self.server_name) + or (not self.map.host_matching and domain_part == self.subdomain) + ): + return "%s/%s" % (self.script_name.rstrip("/"), path.lstrip("/")) + return str( + "%s//%s%s/%s" + % ( + self.url_scheme + ":" if self.url_scheme else "", + host, + self.script_name[:-1], + path.lstrip("/"), + ) + ) diff --git a/env/Lib/site-packages/werkzeug/security.py b/env/Lib/site-packages/werkzeug/security.py new file mode 100644 index 0000000..2308040 --- /dev/null +++ b/env/Lib/site-packages/werkzeug/security.py @@ -0,0 +1,249 @@ +# -*- coding: utf-8 -*- +""" + werkzeug.security + ~~~~~~~~~~~~~~~~~ + + Security related helpers such as secure password hashing tools. + + :copyright: 2007 Pallets + :license: BSD-3-Clause +""" +import codecs +import hashlib +import hmac +import os +import posixpath +from random import SystemRandom +from struct import Struct + +from ._compat import izip +from ._compat import PY2 +from ._compat import range_type +from ._compat import text_type +from ._compat import to_bytes +from ._compat import to_native + +SALT_CHARS = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789" +DEFAULT_PBKDF2_ITERATIONS = 150000 + +_pack_int = Struct(">I").pack +_builtin_safe_str_cmp = getattr(hmac, "compare_digest", None) +_sys_rng = SystemRandom() +_os_alt_seps = list( + sep for sep in [os.path.sep, os.path.altsep] if sep not in (None, "/") +) + + +def pbkdf2_hex( + data, salt, iterations=DEFAULT_PBKDF2_ITERATIONS, keylen=None, hashfunc=None +): + """Like :func:`pbkdf2_bin`, but returns a hex-encoded string. + + .. versionadded:: 0.9 + + :param data: the data to derive. + :param salt: the salt for the derivation. + :param iterations: the number of iterations. + :param keylen: the length of the resulting key. If not provided, + the digest size will be used. + :param hashfunc: the hash function to use. This can either be the + string name of a known hash function, or a function + from the hashlib module. Defaults to sha256. + """ + rv = pbkdf2_bin(data, salt, iterations, keylen, hashfunc) + return to_native(codecs.encode(rv, "hex_codec")) + + +def pbkdf2_bin( + data, salt, iterations=DEFAULT_PBKDF2_ITERATIONS, keylen=None, hashfunc=None +): + """Returns a binary digest for the PBKDF2 hash algorithm of `data` + with the given `salt`. It iterates `iterations` times and produces a + key of `keylen` bytes. By default, SHA-256 is used as hash function; + a different hashlib `hashfunc` can be provided. + + .. versionadded:: 0.9 + + :param data: the data to derive. + :param salt: the salt for the derivation. + :param iterations: the number of iterations. + :param keylen: the length of the resulting key. If not provided + the digest size will be used. + :param hashfunc: the hash function to use. This can either be the + string name of a known hash function or a function + from the hashlib module. Defaults to sha256. + """ + if not hashfunc: + hashfunc = "sha256" + + data = to_bytes(data) + salt = to_bytes(salt) + + if callable(hashfunc): + _test_hash = hashfunc() + hash_name = getattr(_test_hash, "name", None) + else: + hash_name = hashfunc + return hashlib.pbkdf2_hmac(hash_name, data, salt, iterations, keylen) + + +def safe_str_cmp(a, b): + """This function compares strings in somewhat constant time. This + requires that the length of at least one string is known in advance. + + Returns `True` if the two strings are equal, or `False` if they are not. + + .. versionadded:: 0.7 + """ + if isinstance(a, text_type): + a = a.encode("utf-8") + if isinstance(b, text_type): + b = b.encode("utf-8") + + if _builtin_safe_str_cmp is not None: + return _builtin_safe_str_cmp(a, b) + + if len(a) != len(b): + return False + + rv = 0 + if PY2: + for x, y in izip(a, b): + rv |= ord(x) ^ ord(y) + else: + for x, y in izip(a, b): + rv |= x ^ y + + return rv == 0 + + +def gen_salt(length): + """Generate a random string of SALT_CHARS with specified ``length``.""" + if length <= 0: + raise ValueError("Salt length must be positive") + return "".join(_sys_rng.choice(SALT_CHARS) for _ in range_type(length)) + + +def _hash_internal(method, salt, password): + """Internal password hash helper. Supports plaintext without salt, + unsalted and salted passwords. In case salted passwords are used + hmac is used. + """ + if method == "plain": + return password, method + + if isinstance(password, text_type): + password = password.encode("utf-8") + + if method.startswith("pbkdf2:"): + args = method[7:].split(":") + if len(args) not in (1, 2): + raise ValueError("Invalid number of arguments for PBKDF2") + method = args.pop(0) + iterations = args and int(args[0] or 0) or DEFAULT_PBKDF2_ITERATIONS + is_pbkdf2 = True + actual_method = "pbkdf2:%s:%d" % (method, iterations) + else: + is_pbkdf2 = False + actual_method = method + + if is_pbkdf2: + if not salt: + raise ValueError("Salt is required for PBKDF2") + rv = pbkdf2_hex(password, salt, iterations, hashfunc=method) + elif salt: + if isinstance(salt, text_type): + salt = salt.encode("utf-8") + mac = _create_mac(salt, password, method) + rv = mac.hexdigest() + else: + rv = hashlib.new(method, password).hexdigest() + return rv, actual_method + + +def _create_mac(key, msg, method): + if callable(method): + return hmac.HMAC(key, msg, method) + + def hashfunc(d=b""): + return hashlib.new(method, d) + + # Python 2.7 used ``hasattr(digestmod, '__call__')`` + # to detect if hashfunc is callable + hashfunc.__call__ = hashfunc + return hmac.HMAC(key, msg, hashfunc) + + +def generate_password_hash(password, method="pbkdf2:sha256", salt_length=8): + """Hash a password with the given method and salt with a string of + the given length. The format of the string returned includes the method + that was used so that :func:`check_password_hash` can check the hash. + + The format for the hashed string looks like this:: + + method$salt$hash + + This method can **not** generate unsalted passwords but it is possible + to set param method='plain' in order to enforce plaintext passwords. + If a salt is used, hmac is used internally to salt the password. + + If PBKDF2 is wanted it can be enabled by setting the method to + ``pbkdf2:method:iterations`` where iterations is optional:: + + pbkdf2:sha256:80000$salt$hash + pbkdf2:sha256$salt$hash + + :param password: the password to hash. + :param method: the hash method to use (one that hashlib supports). Can + optionally be in the format ``pbkdf2:[:iterations]`` + to enable PBKDF2. + :param salt_length: the length of the salt in letters. + """ + salt = gen_salt(salt_length) if method != "plain" else "" + h, actual_method = _hash_internal(method, salt, password) + return "%s$%s$%s" % (actual_method, salt, h) + + +def check_password_hash(pwhash, password): + """check a password against a given salted and hashed password value. + In order to support unsalted legacy passwords this method supports + plain text passwords, md5 and sha1 hashes (both salted and unsalted). + + Returns `True` if the password matched, `False` otherwise. + + :param pwhash: a hashed string like returned by + :func:`generate_password_hash`. + :param password: the plaintext password to compare against the hash. + """ + if pwhash.count("$") < 2: + return False + method, salt, hashval = pwhash.split("$", 2) + return safe_str_cmp(_hash_internal(method, salt, password)[0], hashval) + + +def safe_join(directory, *pathnames): + """Safely join zero or more untrusted path components to a base + directory to avoid escaping the base directory. + + :param directory: The trusted base directory. + :param pathnames: The untrusted path components relative to the + base directory. + :return: A safe path, otherwise ``None``. + """ + parts = [directory] + + for filename in pathnames: + if filename != "": + filename = posixpath.normpath(filename) + + if ( + any(sep in filename for sep in _os_alt_seps) + or os.path.isabs(filename) + or filename == ".." + or filename.startswith("../") + ): + return None + + parts.append(filename) + + return posixpath.join(*parts) diff --git a/env/Lib/site-packages/werkzeug/serving.py b/env/Lib/site-packages/werkzeug/serving.py new file mode 100644 index 0000000..d817120 --- /dev/null +++ b/env/Lib/site-packages/werkzeug/serving.py @@ -0,0 +1,1075 @@ +# -*- coding: utf-8 -*- +""" + werkzeug.serving + ~~~~~~~~~~~~~~~~ + + There are many ways to serve a WSGI application. While you're developing + it you usually don't want a full blown webserver like Apache but a simple + standalone one. From Python 2.5 onwards there is the `wsgiref`_ server in + the standard library. If you're using older versions of Python you can + download the package from the cheeseshop. + + However there are some caveats. Sourcecode won't reload itself when + changed and each time you kill the server using ``^C`` you get an + `KeyboardInterrupt` error. While the latter is easy to solve the first + one can be a pain in the ass in some situations. + + The easiest way is creating a small ``start-myproject.py`` that runs the + application:: + + #!/usr/bin/env python + # -*- coding: utf-8 -*- + from myproject import make_app + from werkzeug.serving import run_simple + + app = make_app(...) + run_simple('localhost', 8080, app, use_reloader=True) + + You can also pass it a `extra_files` keyword argument with a list of + additional files (like configuration files) you want to observe. + + For bigger applications you should consider using `click` + (http://click.pocoo.org) instead of a simple start file. + + + :copyright: 2007 Pallets + :license: BSD-3-Clause +""" +import io +import os +import signal +import socket +import sys + +from ._compat import PY2 +from ._compat import reraise +from ._compat import WIN +from ._compat import wsgi_encoding_dance +from ._internal import _log +from .exceptions import InternalServerError +from .urls import uri_to_iri +from .urls import url_parse +from .urls import url_unquote + +try: + import socketserver + from http.server import BaseHTTPRequestHandler + from http.server import HTTPServer +except ImportError: + import SocketServer as socketserver + from BaseHTTPServer import HTTPServer + from BaseHTTPServer import BaseHTTPRequestHandler + +try: + import ssl +except ImportError: + + class _SslDummy(object): + def __getattr__(self, name): + raise RuntimeError("SSL support unavailable") + + ssl = _SslDummy() + +try: + import termcolor +except ImportError: + termcolor = None + + +def _get_openssl_crypto_module(): + try: + from OpenSSL import crypto + except ImportError: + raise TypeError("Using ad-hoc certificates requires the pyOpenSSL library.") + else: + return crypto + + +ThreadingMixIn = socketserver.ThreadingMixIn +can_fork = hasattr(os, "fork") + +if can_fork: + ForkingMixIn = socketserver.ForkingMixIn +else: + + class ForkingMixIn(object): + pass + + +try: + af_unix = socket.AF_UNIX +except AttributeError: + af_unix = None + + +LISTEN_QUEUE = 128 +can_open_by_fd = not WIN and hasattr(socket, "fromfd") + +# On Python 3, ConnectionError represents the same errnos as +# socket.error from Python 2, while socket.error is an alias for the +# more generic OSError. +if PY2: + _ConnectionError = socket.error +else: + _ConnectionError = ConnectionError + + +class DechunkedInput(io.RawIOBase): + """An input stream that handles Transfer-Encoding 'chunked'""" + + def __init__(self, rfile): + self._rfile = rfile + self._done = False + self._len = 0 + + def readable(self): + return True + + def read_chunk_len(self): + try: + line = self._rfile.readline().decode("latin1") + _len = int(line.strip(), 16) + except ValueError: + raise IOError("Invalid chunk header") + if _len < 0: + raise IOError("Negative chunk length not allowed") + return _len + + def readinto(self, buf): + read = 0 + while not self._done and read < len(buf): + if self._len == 0: + # This is the first chunk or we fully consumed the previous + # one. Read the next length of the next chunk + self._len = self.read_chunk_len() + + if self._len == 0: + # Found the final chunk of size 0. The stream is now exhausted, + # but there is still a final newline that should be consumed + self._done = True + + if self._len > 0: + # There is data (left) in this chunk, so append it to the + # buffer. If this operation fully consumes the chunk, this will + # reset self._len to 0. + n = min(len(buf), self._len) + buf[read : read + n] = self._rfile.read(n) + self._len -= n + read += n + + if self._len == 0: + # Skip the terminating newline of a chunk that has been fully + # consumed. This also applies to the 0-sized final chunk + terminator = self._rfile.readline() + if terminator not in (b"\n", b"\r\n", b"\r"): + raise IOError("Missing chunk terminating newline") + + return read + + +class WSGIRequestHandler(BaseHTTPRequestHandler, object): + + """A request handler that implements WSGI dispatching.""" + + @property + def server_version(self): + from . import __version__ + + return "Werkzeug/" + __version__ + + def make_environ(self): + request_url = url_parse(self.path) + + def shutdown_server(): + self.server.shutdown_signal = True + + url_scheme = "http" if self.server.ssl_context is None else "https" + if not self.client_address: + self.client_address = "" + if isinstance(self.client_address, str): + self.client_address = (self.client_address, 0) + else: + pass + path_info = url_unquote(request_url.path) + + environ = { + "wsgi.version": (1, 0), + "wsgi.url_scheme": url_scheme, + "wsgi.input": self.rfile, + "wsgi.errors": sys.stderr, + "wsgi.multithread": self.server.multithread, + "wsgi.multiprocess": self.server.multiprocess, + "wsgi.run_once": False, + "werkzeug.server.shutdown": shutdown_server, + "SERVER_SOFTWARE": self.server_version, + "REQUEST_METHOD": self.command, + "SCRIPT_NAME": "", + "PATH_INFO": wsgi_encoding_dance(path_info), + "QUERY_STRING": wsgi_encoding_dance(request_url.query), + # Non-standard, added by mod_wsgi, uWSGI + "REQUEST_URI": wsgi_encoding_dance(self.path), + # Non-standard, added by gunicorn + "RAW_URI": wsgi_encoding_dance(self.path), + "REMOTE_ADDR": self.address_string(), + "REMOTE_PORT": self.port_integer(), + "SERVER_NAME": self.server.server_address[0], + "SERVER_PORT": str(self.server.server_address[1]), + "SERVER_PROTOCOL": self.request_version, + } + + for key, value in self.get_header_items(): + key = key.upper().replace("-", "_") + value = value.replace("\r\n", "") + if key not in ("CONTENT_TYPE", "CONTENT_LENGTH"): + key = "HTTP_" + key + if key in environ: + value = "{},{}".format(environ[key], value) + environ[key] = value + + if environ.get("HTTP_TRANSFER_ENCODING", "").strip().lower() == "chunked": + environ["wsgi.input_terminated"] = True + environ["wsgi.input"] = DechunkedInput(environ["wsgi.input"]) + + if request_url.scheme and request_url.netloc: + environ["HTTP_HOST"] = request_url.netloc + + return environ + + def run_wsgi(self): + if self.headers.get("Expect", "").lower().strip() == "100-continue": + self.wfile.write(b"HTTP/1.1 100 Continue\r\n\r\n") + + self.environ = environ = self.make_environ() + headers_set = [] + headers_sent = [] + + def write(data): + assert headers_set, "write() before start_response" + if not headers_sent: + status, response_headers = headers_sent[:] = headers_set + try: + code, msg = status.split(None, 1) + except ValueError: + code, msg = status, "" + code = int(code) + self.send_response(code, msg) + header_keys = set() + for key, value in response_headers: + self.send_header(key, value) + key = key.lower() + header_keys.add(key) + if not ( + "content-length" in header_keys + or environ["REQUEST_METHOD"] == "HEAD" + or code < 200 + or code in (204, 304) + ): + self.close_connection = True + self.send_header("Connection", "close") + if "server" not in header_keys: + self.send_header("Server", self.version_string()) + if "date" not in header_keys: + self.send_header("Date", self.date_time_string()) + self.end_headers() + + assert isinstance(data, bytes), "applications must write bytes" + self.wfile.write(data) + self.wfile.flush() + + def start_response(status, response_headers, exc_info=None): + if exc_info: + try: + if headers_sent: + reraise(*exc_info) + finally: + exc_info = None + elif headers_set: + raise AssertionError("Headers already set") + headers_set[:] = [status, response_headers] + return write + + def execute(app): + application_iter = app(environ, start_response) + try: + for data in application_iter: + write(data) + if not headers_sent: + write(b"") + finally: + if hasattr(application_iter, "close"): + application_iter.close() + application_iter = None + + try: + execute(self.server.app) + except (_ConnectionError, socket.timeout) as e: + self.connection_dropped(e, environ) + except Exception: + if self.server.passthrough_errors: + raise + from .debug.tbtools import get_current_traceback + + traceback = get_current_traceback(ignore_system_exceptions=True) + try: + # if we haven't yet sent the headers but they are set + # we roll back to be able to set them again. + if not headers_sent: + del headers_set[:] + execute(InternalServerError()) + except Exception: + pass + self.server.log("error", "Error on request:\n%s", traceback.plaintext) + + def handle(self): + """Handles a request ignoring dropped connections.""" + rv = None + try: + rv = BaseHTTPRequestHandler.handle(self) + except (_ConnectionError, socket.timeout) as e: + self.connection_dropped(e) + except Exception as e: + if self.server.ssl_context is None or not is_ssl_error(e): + raise + if self.server.shutdown_signal: + self.initiate_shutdown() + return rv + + def initiate_shutdown(self): + """A horrible, horrible way to kill the server for Python 2.6 and + later. It's the best we can do. + """ + # Windows does not provide SIGKILL, go with SIGTERM then. + sig = getattr(signal, "SIGKILL", signal.SIGTERM) + # reloader active + if is_running_from_reloader(): + os.kill(os.getpid(), sig) + # python 2.7 + self.server._BaseServer__shutdown_request = True + # python 2.6 + self.server._BaseServer__serving = False + + def connection_dropped(self, error, environ=None): + """Called if the connection was closed by the client. By default + nothing happens. + """ + + def handle_one_request(self): + """Handle a single HTTP request.""" + self.raw_requestline = self.rfile.readline() + if not self.raw_requestline: + self.close_connection = 1 + elif self.parse_request(): + return self.run_wsgi() + + def send_response(self, code, message=None): + """Send the response header and log the response code.""" + self.log_request(code) + if message is None: + message = code in self.responses and self.responses[code][0] or "" + if self.request_version != "HTTP/0.9": + hdr = "%s %d %s\r\n" % (self.protocol_version, code, message) + self.wfile.write(hdr.encode("ascii")) + + def version_string(self): + return BaseHTTPRequestHandler.version_string(self).strip() + + def address_string(self): + if getattr(self, "environ", None): + return self.environ["REMOTE_ADDR"] + elif not self.client_address: + return "" + elif isinstance(self.client_address, str): + return self.client_address + else: + return self.client_address[0] + + def port_integer(self): + return self.client_address[1] + + def log_request(self, code="-", size="-"): + try: + path = uri_to_iri(self.path) + msg = "%s %s %s" % (self.command, path, self.request_version) + except AttributeError: + # path isn't set if the requestline was bad + msg = self.requestline + + code = str(code) + + if termcolor: + color = termcolor.colored + + if code[0] == "1": # 1xx - Informational + msg = color(msg, attrs=["bold"]) + elif code[0] == "2": # 2xx - Success + msg = color(msg, color="white") + elif code == "304": # 304 - Resource Not Modified + msg = color(msg, color="cyan") + elif code[0] == "3": # 3xx - Redirection + msg = color(msg, color="green") + elif code == "404": # 404 - Resource Not Found + msg = color(msg, color="yellow") + elif code[0] == "4": # 4xx - Client Error + msg = color(msg, color="red", attrs=["bold"]) + else: # 5xx, or any other response + msg = color(msg, color="magenta", attrs=["bold"]) + + self.log("info", '"%s" %s %s', msg, code, size) + + def log_error(self, *args): + self.log("error", *args) + + def log_message(self, format, *args): + self.log("info", format, *args) + + def log(self, type, message, *args): + _log( + type, + "%s - - [%s] %s\n" + % (self.address_string(), self.log_date_time_string(), message % args), + ) + + def get_header_items(self): + """ + Get an iterable list of key/value pairs representing headers. + + This function provides Python 2/3 compatibility as related to the + parsing of request headers. Python 2.7 is not compliant with + RFC 3875 Section 4.1.18 which requires multiple values for headers + to be provided or RFC 2616 which allows for folding of multi-line + headers. This function will return a matching list regardless + of Python version. It can be removed once Python 2.7 support + is dropped. + + :return: List of tuples containing header hey/value pairs + """ + if PY2: + # For Python 2, process the headers manually according to + # W3C RFC 2616 Section 4.2. + items = [] + for header in self.headers.headers: + # Remove "\r\n" from the header and split on ":" to get + # the field name and value. + try: + key, value = header[0:-2].split(":", 1) + except ValueError: + # If header could not be slit with : but starts with white + # space and it follows an existing header, it's a folded + # header. + if header[0] in ("\t", " ") and items: + # Pop off the last header + key, value = items.pop() + # Append the current header to the value of the last + # header which will be placed back on the end of the + # list + value = value + header + # Otherwise it's just a bad header and should error + else: + # Re-raise the value error + raise + + # Add the key and the value once stripped of leading + # white space. The specification allows for stripping + # trailing white space but the Python 3 code does not + # strip trailing white space. Therefore, trailing space + # will be left as is to match the Python 3 behavior. + items.append((key, value.lstrip())) + else: + items = self.headers.items() + + return items + + +#: backwards compatible name if someone is subclassing it +BaseRequestHandler = WSGIRequestHandler + + +def generate_adhoc_ssl_pair(cn=None): + from random import random + + crypto = _get_openssl_crypto_module() + + # pretty damn sure that this is not actually accepted by anyone + if cn is None: + cn = "*" + + cert = crypto.X509() + cert.set_serial_number(int(random() * sys.maxsize)) + cert.gmtime_adj_notBefore(0) + cert.gmtime_adj_notAfter(60 * 60 * 24 * 365) + + subject = cert.get_subject() + subject.CN = cn + subject.O = "Dummy Certificate" # noqa: E741 + + issuer = cert.get_issuer() + issuer.CN = subject.CN + issuer.O = subject.O # noqa: E741 + + pkey = crypto.PKey() + pkey.generate_key(crypto.TYPE_RSA, 2048) + cert.set_pubkey(pkey) + cert.sign(pkey, "sha256") + + return cert, pkey + + +def make_ssl_devcert(base_path, host=None, cn=None): + """Creates an SSL key for development. This should be used instead of + the ``'adhoc'`` key which generates a new cert on each server start. + It accepts a path for where it should store the key and cert and + either a host or CN. If a host is given it will use the CN + ``*.host/CN=host``. + + For more information see :func:`run_simple`. + + .. versionadded:: 0.9 + + :param base_path: the path to the certificate and key. The extension + ``.crt`` is added for the certificate, ``.key`` is + added for the key. + :param host: the name of the host. This can be used as an alternative + for the `cn`. + :param cn: the `CN` to use. + """ + from OpenSSL import crypto + + if host is not None: + cn = "*.%s/CN=%s" % (host, host) + cert, pkey = generate_adhoc_ssl_pair(cn=cn) + + cert_file = base_path + ".crt" + pkey_file = base_path + ".key" + + with open(cert_file, "wb") as f: + f.write(crypto.dump_certificate(crypto.FILETYPE_PEM, cert)) + with open(pkey_file, "wb") as f: + f.write(crypto.dump_privatekey(crypto.FILETYPE_PEM, pkey)) + + return cert_file, pkey_file + + +def generate_adhoc_ssl_context(): + """Generates an adhoc SSL context for the development server.""" + crypto = _get_openssl_crypto_module() + import tempfile + import atexit + + cert, pkey = generate_adhoc_ssl_pair() + cert_handle, cert_file = tempfile.mkstemp() + pkey_handle, pkey_file = tempfile.mkstemp() + atexit.register(os.remove, pkey_file) + atexit.register(os.remove, cert_file) + + os.write(cert_handle, crypto.dump_certificate(crypto.FILETYPE_PEM, cert)) + os.write(pkey_handle, crypto.dump_privatekey(crypto.FILETYPE_PEM, pkey)) + os.close(cert_handle) + os.close(pkey_handle) + ctx = load_ssl_context(cert_file, pkey_file) + return ctx + + +def load_ssl_context(cert_file, pkey_file=None, protocol=None): + """Loads SSL context from cert/private key files and optional protocol. + Many parameters are directly taken from the API of + :py:class:`ssl.SSLContext`. + + :param cert_file: Path of the certificate to use. + :param pkey_file: Path of the private key to use. If not given, the key + will be obtained from the certificate file. + :param protocol: One of the ``PROTOCOL_*`` constants in the stdlib ``ssl`` + module. Defaults to ``PROTOCOL_SSLv23``. + """ + if protocol is None: + protocol = ssl.PROTOCOL_SSLv23 + ctx = _SSLContext(protocol) + ctx.load_cert_chain(cert_file, pkey_file) + return ctx + + +class _SSLContext(object): + + """A dummy class with a small subset of Python3's ``ssl.SSLContext``, only + intended to be used with and by Werkzeug.""" + + def __init__(self, protocol): + self._protocol = protocol + self._certfile = None + self._keyfile = None + self._password = None + + def load_cert_chain(self, certfile, keyfile=None, password=None): + self._certfile = certfile + self._keyfile = keyfile or certfile + self._password = password + + def wrap_socket(self, sock, **kwargs): + return ssl.wrap_socket( + sock, + keyfile=self._keyfile, + certfile=self._certfile, + ssl_version=self._protocol, + **kwargs + ) + + +def is_ssl_error(error=None): + """Checks if the given error (or the current one) is an SSL error.""" + exc_types = (ssl.SSLError,) + try: + from OpenSSL.SSL import Error + + exc_types += (Error,) + except ImportError: + pass + + if error is None: + error = sys.exc_info()[1] + return isinstance(error, exc_types) + + +def select_address_family(host, port): + """Return ``AF_INET4``, ``AF_INET6``, or ``AF_UNIX`` depending on + the host and port.""" + # disabled due to problems with current ipv6 implementations + # and various operating systems. Probably this code also is + # not supposed to work, but I can't come up with any other + # ways to implement this. + # try: + # info = socket.getaddrinfo(host, port, socket.AF_UNSPEC, + # socket.SOCK_STREAM, 0, + # socket.AI_PASSIVE) + # if info: + # return info[0][0] + # except socket.gaierror: + # pass + if host.startswith("unix://"): + return socket.AF_UNIX + elif ":" in host and hasattr(socket, "AF_INET6"): + return socket.AF_INET6 + return socket.AF_INET + + +def get_sockaddr(host, port, family): + """Return a fully qualified socket address that can be passed to + :func:`socket.bind`.""" + if family == af_unix: + return host.split("://", 1)[1] + try: + res = socket.getaddrinfo( + host, port, family, socket.SOCK_STREAM, socket.IPPROTO_TCP + ) + except socket.gaierror: + return host, port + return res[0][4] + + +class BaseWSGIServer(HTTPServer, object): + + """Simple single-threaded, single-process WSGI server.""" + + multithread = False + multiprocess = False + request_queue_size = LISTEN_QUEUE + + def __init__( + self, + host, + port, + app, + handler=None, + passthrough_errors=False, + ssl_context=None, + fd=None, + ): + if handler is None: + handler = WSGIRequestHandler + + self.address_family = select_address_family(host, port) + + if fd is not None: + real_sock = socket.fromfd(fd, self.address_family, socket.SOCK_STREAM) + port = 0 + + server_address = get_sockaddr(host, int(port), self.address_family) + + # remove socket file if it already exists + if self.address_family == af_unix and os.path.exists(server_address): + os.unlink(server_address) + HTTPServer.__init__(self, server_address, handler) + + self.app = app + self.passthrough_errors = passthrough_errors + self.shutdown_signal = False + self.host = host + self.port = self.socket.getsockname()[1] + + # Patch in the original socket. + if fd is not None: + self.socket.close() + self.socket = real_sock + self.server_address = self.socket.getsockname() + + if ssl_context is not None: + if isinstance(ssl_context, tuple): + ssl_context = load_ssl_context(*ssl_context) + if ssl_context == "adhoc": + ssl_context = generate_adhoc_ssl_context() + # If we are on Python 2 the return value from socket.fromfd + # is an internal socket object but what we need for ssl wrap + # is the wrapper around it :( + sock = self.socket + if PY2 and not isinstance(sock, socket.socket): + sock = socket.socket(sock.family, sock.type, sock.proto, sock) + self.socket = ssl_context.wrap_socket(sock, server_side=True) + self.ssl_context = ssl_context + else: + self.ssl_context = None + + def log(self, type, message, *args): + _log(type, message, *args) + + def serve_forever(self): + self.shutdown_signal = False + try: + HTTPServer.serve_forever(self) + except KeyboardInterrupt: + pass + finally: + self.server_close() + + def handle_error(self, request, client_address): + if self.passthrough_errors: + raise + # Python 2 still causes a socket.error after the earlier + # handling, so silence it here. + if isinstance(sys.exc_info()[1], _ConnectionError): + return + return HTTPServer.handle_error(self, request, client_address) + + def get_request(self): + con, info = self.socket.accept() + return con, info + + +class ThreadedWSGIServer(ThreadingMixIn, BaseWSGIServer): + + """A WSGI server that does threading.""" + + multithread = True + daemon_threads = True + + +class ForkingWSGIServer(ForkingMixIn, BaseWSGIServer): + + """A WSGI server that does forking.""" + + multiprocess = True + + def __init__( + self, + host, + port, + app, + processes=40, + handler=None, + passthrough_errors=False, + ssl_context=None, + fd=None, + ): + if not can_fork: + raise ValueError("Your platform does not support forking.") + BaseWSGIServer.__init__( + self, host, port, app, handler, passthrough_errors, ssl_context, fd + ) + self.max_children = processes + + +def make_server( + host=None, + port=None, + app=None, + threaded=False, + processes=1, + request_handler=None, + passthrough_errors=False, + ssl_context=None, + fd=None, +): + """Create a new server instance that is either threaded, or forks + or just processes one request after another. + """ + if threaded and processes > 1: + raise ValueError("cannot have a multithreaded and multi process server.") + elif threaded: + return ThreadedWSGIServer( + host, port, app, request_handler, passthrough_errors, ssl_context, fd=fd + ) + elif processes > 1: + return ForkingWSGIServer( + host, + port, + app, + processes, + request_handler, + passthrough_errors, + ssl_context, + fd=fd, + ) + else: + return BaseWSGIServer( + host, port, app, request_handler, passthrough_errors, ssl_context, fd=fd + ) + + +def is_running_from_reloader(): + """Checks if the application is running from within the Werkzeug + reloader subprocess. + + .. versionadded:: 0.10 + """ + return os.environ.get("WERKZEUG_RUN_MAIN") == "true" + + +def run_simple( + hostname, + port, + application, + use_reloader=False, + use_debugger=False, + use_evalex=True, + extra_files=None, + reloader_interval=1, + reloader_type="auto", + threaded=False, + processes=1, + request_handler=None, + static_files=None, + passthrough_errors=False, + ssl_context=None, +): + """Start a WSGI application. Optional features include a reloader, + multithreading and fork support. + + This function has a command-line interface too:: + + python -m werkzeug.serving --help + + .. versionadded:: 0.5 + `static_files` was added to simplify serving of static files as well + as `passthrough_errors`. + + .. versionadded:: 0.6 + support for SSL was added. + + .. versionadded:: 0.8 + Added support for automatically loading a SSL context from certificate + file and private key. + + .. versionadded:: 0.9 + Added command-line interface. + + .. versionadded:: 0.10 + Improved the reloader and added support for changing the backend + through the `reloader_type` parameter. See :ref:`reloader` + for more information. + + .. versionchanged:: 0.15 + Bind to a Unix socket by passing a path that starts with + ``unix://`` as the ``hostname``. + + :param hostname: The host to bind to, for example ``'localhost'``. + If the value is a path that starts with ``unix://`` it will bind + to a Unix socket instead of a TCP socket.. + :param port: The port for the server. eg: ``8080`` + :param application: the WSGI application to execute + :param use_reloader: should the server automatically restart the python + process if modules were changed? + :param use_debugger: should the werkzeug debugging system be used? + :param use_evalex: should the exception evaluation feature be enabled? + :param extra_files: a list of files the reloader should watch + additionally to the modules. For example configuration + files. + :param reloader_interval: the interval for the reloader in seconds. + :param reloader_type: the type of reloader to use. The default is + auto detection. Valid values are ``'stat'`` and + ``'watchdog'``. See :ref:`reloader` for more + information. + :param threaded: should the process handle each request in a separate + thread? + :param processes: if greater than 1 then handle each request in a new process + up to this maximum number of concurrent processes. + :param request_handler: optional parameter that can be used to replace + the default one. You can use this to replace it + with a different + :class:`~BaseHTTPServer.BaseHTTPRequestHandler` + subclass. + :param static_files: a list or dict of paths for static files. This works + exactly like :class:`SharedDataMiddleware`, it's actually + just wrapping the application in that middleware before + serving. + :param passthrough_errors: set this to `True` to disable the error catching. + This means that the server will die on errors but + it can be useful to hook debuggers in (pdb etc.) + :param ssl_context: an SSL context for the connection. Either an + :class:`ssl.SSLContext`, a tuple in the form + ``(cert_file, pkey_file)``, the string ``'adhoc'`` if + the server should automatically create one, or ``None`` + to disable SSL (which is the default). + """ + if not isinstance(port, int): + raise TypeError("port must be an integer") + if use_debugger: + from .debug import DebuggedApplication + + application = DebuggedApplication(application, use_evalex) + if static_files: + from .middleware.shared_data import SharedDataMiddleware + + application = SharedDataMiddleware(application, static_files) + + def log_startup(sock): + display_hostname = hostname if hostname not in ("", "*") else "localhost" + quit_msg = "(Press CTRL+C to quit)" + if sock.family == af_unix: + _log("info", " * Running on %s %s", display_hostname, quit_msg) + else: + if ":" in display_hostname: + display_hostname = "[%s]" % display_hostname + port = sock.getsockname()[1] + _log( + "info", + " * Running on %s://%s:%d/ %s", + "http" if ssl_context is None else "https", + display_hostname, + port, + quit_msg, + ) + + def inner(): + try: + fd = int(os.environ["WERKZEUG_SERVER_FD"]) + except (LookupError, ValueError): + fd = None + srv = make_server( + hostname, + port, + application, + threaded, + processes, + request_handler, + passthrough_errors, + ssl_context, + fd=fd, + ) + if fd is None: + log_startup(srv.socket) + srv.serve_forever() + + if use_reloader: + # If we're not running already in the subprocess that is the + # reloader we want to open up a socket early to make sure the + # port is actually available. + if not is_running_from_reloader(): + if port == 0 and not can_open_by_fd: + raise ValueError( + "Cannot bind to a random port with enabled " + "reloader if the Python interpreter does " + "not support socket opening by fd." + ) + + # Create and destroy a socket so that any exceptions are + # raised before we spawn a separate Python interpreter and + # lose this ability. + address_family = select_address_family(hostname, port) + server_address = get_sockaddr(hostname, port, address_family) + s = socket.socket(address_family, socket.SOCK_STREAM) + s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) + s.bind(server_address) + if hasattr(s, "set_inheritable"): + s.set_inheritable(True) + + # If we can open the socket by file descriptor, then we can just + # reuse this one and our socket will survive the restarts. + if can_open_by_fd: + os.environ["WERKZEUG_SERVER_FD"] = str(s.fileno()) + s.listen(LISTEN_QUEUE) + log_startup(s) + else: + s.close() + if address_family == af_unix: + _log("info", "Unlinking %s" % server_address) + os.unlink(server_address) + + # Do not use relative imports, otherwise "python -m werkzeug.serving" + # breaks. + from ._reloader import run_with_reloader + + run_with_reloader(inner, extra_files, reloader_interval, reloader_type) + else: + inner() + + +def run_with_reloader(*args, **kwargs): + # People keep using undocumented APIs. Do not use this function + # please, we do not guarantee that it continues working. + from ._reloader import run_with_reloader + + return run_with_reloader(*args, **kwargs) + + +def main(): + """A simple command-line interface for :py:func:`run_simple`.""" + + # in contrast to argparse, this works at least under Python < 2.7 + import optparse + from .utils import import_string + + parser = optparse.OptionParser(usage="Usage: %prog [options] app_module:app_object") + parser.add_option( + "-b", + "--bind", + dest="address", + help="The hostname:port the app should listen on.", + ) + parser.add_option( + "-d", + "--debug", + dest="use_debugger", + action="store_true", + default=False, + help="Use Werkzeug's debugger.", + ) + parser.add_option( + "-r", + "--reload", + dest="use_reloader", + action="store_true", + default=False, + help="Reload Python process if modules change.", + ) + options, args = parser.parse_args() + + hostname, port = None, None + if options.address: + address = options.address.split(":") + hostname = address[0] + if len(address) > 1: + port = address[1] + + if len(args) != 1: + sys.stdout.write("No application supplied, or too much. See --help\n") + sys.exit(1) + app = import_string(args[0]) + + run_simple( + hostname=(hostname or "127.0.0.1"), + port=int(port or 5000), + application=app, + use_reloader=options.use_reloader, + use_debugger=options.use_debugger, + ) + + +if __name__ == "__main__": + main() diff --git a/env/Lib/site-packages/werkzeug/test.py b/env/Lib/site-packages/werkzeug/test.py new file mode 100644 index 0000000..6148665 --- /dev/null +++ b/env/Lib/site-packages/werkzeug/test.py @@ -0,0 +1,1146 @@ +# -*- coding: utf-8 -*- +""" + werkzeug.test + ~~~~~~~~~~~~~ + + This module implements a client to WSGI applications for testing. + + :copyright: 2007 Pallets + :license: BSD-3-Clause +""" +import mimetypes +import sys +from io import BytesIO +from itertools import chain +from random import random +from tempfile import TemporaryFile +from time import time + +from ._compat import iteritems +from ._compat import iterlists +from ._compat import itervalues +from ._compat import make_literal_wrapper +from ._compat import reraise +from ._compat import string_types +from ._compat import text_type +from ._compat import to_bytes +from ._compat import wsgi_encoding_dance +from ._internal import _get_environ +from .datastructures import CallbackDict +from .datastructures import CombinedMultiDict +from .datastructures import EnvironHeaders +from .datastructures import FileMultiDict +from .datastructures import FileStorage +from .datastructures import Headers +from .datastructures import MultiDict +from .http import dump_cookie +from .http import dump_options_header +from .http import parse_options_header +from .urls import iri_to_uri +from .urls import url_encode +from .urls import url_fix +from .urls import url_parse +from .urls import url_unparse +from .urls import url_unquote +from .utils import get_content_type +from .wrappers import BaseRequest +from .wsgi import ClosingIterator +from .wsgi import get_current_url + +try: + from urllib.request import Request as U2Request +except ImportError: + from urllib2 import Request as U2Request + +try: + from http.cookiejar import CookieJar +except ImportError: + from cookielib import CookieJar + + +def stream_encode_multipart( + values, use_tempfile=True, threshold=1024 * 500, boundary=None, charset="utf-8" +): + """Encode a dict of values (either strings or file descriptors or + :class:`FileStorage` objects.) into a multipart encoded string stored + in a file descriptor. + """ + if boundary is None: + boundary = "---------------WerkzeugFormPart_%s%s" % (time(), random()) + _closure = [BytesIO(), 0, False] + + if use_tempfile: + + def write_binary(string): + stream, total_length, on_disk = _closure + if on_disk: + stream.write(string) + else: + length = len(string) + if length + _closure[1] <= threshold: + stream.write(string) + else: + new_stream = TemporaryFile("wb+") + new_stream.write(stream.getvalue()) + new_stream.write(string) + _closure[0] = new_stream + _closure[2] = True + _closure[1] = total_length + length + + else: + write_binary = _closure[0].write + + def write(string): + write_binary(string.encode(charset)) + + if not isinstance(values, MultiDict): + values = MultiDict(values) + + for key, values in iterlists(values): + for value in values: + write('--%s\r\nContent-Disposition: form-data; name="%s"' % (boundary, key)) + reader = getattr(value, "read", None) + if reader is not None: + filename = getattr(value, "filename", getattr(value, "name", None)) + content_type = getattr(value, "content_type", None) + if content_type is None: + content_type = ( + filename + and mimetypes.guess_type(filename)[0] + or "application/octet-stream" + ) + if filename is not None: + write('; filename="%s"\r\n' % filename) + else: + write("\r\n") + write("Content-Type: %s\r\n\r\n" % content_type) + while 1: + chunk = reader(16384) + if not chunk: + break + write_binary(chunk) + else: + if not isinstance(value, string_types): + value = str(value) + + value = to_bytes(value, charset) + write("\r\n\r\n") + write_binary(value) + write("\r\n") + write("--%s--\r\n" % boundary) + + length = int(_closure[0].tell()) + _closure[0].seek(0) + return _closure[0], length, boundary + + +def encode_multipart(values, boundary=None, charset="utf-8"): + """Like `stream_encode_multipart` but returns a tuple in the form + (``boundary``, ``data``) where data is a bytestring. + """ + stream, length, boundary = stream_encode_multipart( + values, use_tempfile=False, boundary=boundary, charset=charset + ) + return boundary, stream.read() + + +def File(fd, filename=None, mimetype=None): + """Backwards compat. + + .. deprecated:: 0.5 + """ + from warnings import warn + + warn( + "'werkzeug.test.File' is deprecated as of version 0.5 and will" + " be removed in version 1.0. Use 'EnvironBuilder' or" + " 'FileStorage' instead.", + DeprecationWarning, + stacklevel=2, + ) + return FileStorage(fd, filename=filename, content_type=mimetype) + + +class _TestCookieHeaders(object): + + """A headers adapter for cookielib + """ + + def __init__(self, headers): + self.headers = headers + + def getheaders(self, name): + headers = [] + name = name.lower() + for k, v in self.headers: + if k.lower() == name: + headers.append(v) + return headers + + def get_all(self, name, default=None): + rv = [] + for k, v in self.headers: + if k.lower() == name.lower(): + rv.append(v) + return rv or default or [] + + +class _TestCookieResponse(object): + + """Something that looks like a httplib.HTTPResponse, but is actually just an + adapter for our test responses to make them available for cookielib. + """ + + def __init__(self, headers): + self.headers = _TestCookieHeaders(headers) + + def info(self): + return self.headers + + +class _TestCookieJar(CookieJar): + + """A cookielib.CookieJar modified to inject and read cookie headers from + and to wsgi environments, and wsgi application responses. + """ + + def inject_wsgi(self, environ): + """Inject the cookies as client headers into the server's wsgi + environment. + """ + cvals = ["%s=%s" % (c.name, c.value) for c in self] + + if cvals: + environ["HTTP_COOKIE"] = "; ".join(cvals) + else: + environ.pop("HTTP_COOKIE", None) + + def extract_wsgi(self, environ, headers): + """Extract the server's set-cookie headers as cookies into the + cookie jar. + """ + self.extract_cookies( + _TestCookieResponse(headers), U2Request(get_current_url(environ)) + ) + + +def _iter_data(data): + """Iterates over a `dict` or :class:`MultiDict` yielding all keys and + values. + This is used to iterate over the data passed to the + :class:`EnvironBuilder`. + """ + if isinstance(data, MultiDict): + for key, values in iterlists(data): + for value in values: + yield key, value + else: + for key, values in iteritems(data): + if isinstance(values, list): + for value in values: + yield key, value + else: + yield key, values + + +class EnvironBuilder(object): + """This class can be used to conveniently create a WSGI environment + for testing purposes. It can be used to quickly create WSGI environments + or request objects from arbitrary data. + + The signature of this class is also used in some other places as of + Werkzeug 0.5 (:func:`create_environ`, :meth:`BaseResponse.from_values`, + :meth:`Client.open`). Because of this most of the functionality is + available through the constructor alone. + + Files and regular form data can be manipulated independently of each + other with the :attr:`form` and :attr:`files` attributes, but are + passed with the same argument to the constructor: `data`. + + `data` can be any of these values: + + - a `str` or `bytes` object: The object is converted into an + :attr:`input_stream`, the :attr:`content_length` is set and you have to + provide a :attr:`content_type`. + - a `dict` or :class:`MultiDict`: The keys have to be strings. The values + have to be either any of the following objects, or a list of any of the + following objects: + + - a :class:`file`-like object: These are converted into + :class:`FileStorage` objects automatically. + - a `tuple`: The :meth:`~FileMultiDict.add_file` method is called + with the key and the unpacked `tuple` items as positional + arguments. + - a `str`: The string is set as form data for the associated key. + - a file-like object: The object content is loaded in memory and then + handled like a regular `str` or a `bytes`. + + :param path: the path of the request. In the WSGI environment this will + end up as `PATH_INFO`. If the `query_string` is not defined + and there is a question mark in the `path` everything after + it is used as query string. + :param base_url: the base URL is a URL that is used to extract the WSGI + URL scheme, host (server name + server port) and the + script root (`SCRIPT_NAME`). + :param query_string: an optional string or dict with URL parameters. + :param method: the HTTP method to use, defaults to `GET`. + :param input_stream: an optional input stream. Do not specify this and + `data`. As soon as an input stream is set you can't + modify :attr:`args` and :attr:`files` unless you + set the :attr:`input_stream` to `None` again. + :param content_type: The content type for the request. As of 0.5 you + don't have to provide this when specifying files + and form data via `data`. + :param content_length: The content length for the request. You don't + have to specify this when providing data via + `data`. + :param errors_stream: an optional error stream that is used for + `wsgi.errors`. Defaults to :data:`stderr`. + :param multithread: controls `wsgi.multithread`. Defaults to `False`. + :param multiprocess: controls `wsgi.multiprocess`. Defaults to `False`. + :param run_once: controls `wsgi.run_once`. Defaults to `False`. + :param headers: an optional list or :class:`Headers` object of headers. + :param data: a string or dict of form data or a file-object. + See explanation above. + :param json: An object to be serialized and assigned to ``data``. + Defaults the content type to ``"application/json"``. + Serialized with the function assigned to :attr:`json_dumps`. + :param environ_base: an optional dict of environment defaults. + :param environ_overrides: an optional dict of environment overrides. + :param charset: the charset used to encode unicode data. + + .. versionadded:: 0.15 + The ``json`` param and :meth:`json_dumps` method. + + .. versionadded:: 0.15 + The environ has keys ``REQUEST_URI`` and ``RAW_URI`` containing + the path before perecent-decoding. This is not part of the WSGI + PEP, but many WSGI servers include it. + + .. versionchanged:: 0.6 + ``path`` and ``base_url`` can now be unicode strings that are + encoded with :func:`iri_to_uri`. + """ + + #: the server protocol to use. defaults to HTTP/1.1 + server_protocol = "HTTP/1.1" + + #: the wsgi version to use. defaults to (1, 0) + wsgi_version = (1, 0) + + #: the default request class for :meth:`get_request` + request_class = BaseRequest + + import json + + #: The serialization function used when ``json`` is passed. + json_dumps = staticmethod(json.dumps) + del json + + def __init__( + self, + path="/", + base_url=None, + query_string=None, + method="GET", + input_stream=None, + content_type=None, + content_length=None, + errors_stream=None, + multithread=False, + multiprocess=False, + run_once=False, + headers=None, + data=None, + environ_base=None, + environ_overrides=None, + charset="utf-8", + mimetype=None, + json=None, + ): + path_s = make_literal_wrapper(path) + if query_string is not None and path_s("?") in path: + raise ValueError("Query string is defined in the path and as an argument") + if query_string is None and path_s("?") in path: + path, query_string = path.split(path_s("?"), 1) + self.charset = charset + self.path = iri_to_uri(path) + if base_url is not None: + base_url = url_fix(iri_to_uri(base_url, charset), charset) + self.base_url = base_url + if isinstance(query_string, (bytes, text_type)): + self.query_string = query_string + else: + if query_string is None: + query_string = MultiDict() + elif not isinstance(query_string, MultiDict): + query_string = MultiDict(query_string) + self.args = query_string + self.method = method + if headers is None: + headers = Headers() + elif not isinstance(headers, Headers): + headers = Headers(headers) + self.headers = headers + if content_type is not None: + self.content_type = content_type + if errors_stream is None: + errors_stream = sys.stderr + self.errors_stream = errors_stream + self.multithread = multithread + self.multiprocess = multiprocess + self.run_once = run_once + self.environ_base = environ_base + self.environ_overrides = environ_overrides + self.input_stream = input_stream + self.content_length = content_length + self.closed = False + + if json is not None: + if data is not None: + raise TypeError("can't provide both json and data") + + data = self.json_dumps(json) + + if self.content_type is None: + self.content_type = "application/json" + + if data: + if input_stream is not None: + raise TypeError("can't provide input stream and data") + if hasattr(data, "read"): + data = data.read() + if isinstance(data, text_type): + data = data.encode(self.charset) + if isinstance(data, bytes): + self.input_stream = BytesIO(data) + if self.content_length is None: + self.content_length = len(data) + else: + for key, value in _iter_data(data): + if isinstance(value, (tuple, dict)) or hasattr(value, "read"): + self._add_file_from_data(key, value) + else: + self.form.setlistdefault(key).append(value) + + if mimetype is not None: + self.mimetype = mimetype + + @classmethod + def from_environ(cls, environ, **kwargs): + """Turn an environ dict back into a builder. Any extra kwargs + override the args extracted from the environ. + + .. versionadded:: 0.15 + """ + headers = Headers(EnvironHeaders(environ)) + out = { + "path": environ["PATH_INFO"], + "base_url": cls._make_base_url( + environ["wsgi.url_scheme"], headers.pop("Host"), environ["SCRIPT_NAME"] + ), + "query_string": environ["QUERY_STRING"], + "method": environ["REQUEST_METHOD"], + "input_stream": environ["wsgi.input"], + "content_type": headers.pop("Content-Type", None), + "content_length": headers.pop("Content-Length", None), + "errors_stream": environ["wsgi.errors"], + "multithread": environ["wsgi.multithread"], + "multiprocess": environ["wsgi.multiprocess"], + "run_once": environ["wsgi.run_once"], + "headers": headers, + } + out.update(kwargs) + return cls(**out) + + def _add_file_from_data(self, key, value): + """Called in the EnvironBuilder to add files from the data dict.""" + if isinstance(value, tuple): + self.files.add_file(key, *value) + elif isinstance(value, dict): + from warnings import warn + + warn( + "Passing a dict as file data is deprecated as of" + " version 0.5 and will be removed in version 1.0. Use" + " a tuple or 'FileStorage' object instead.", + DeprecationWarning, + stacklevel=2, + ) + value = dict(value) + mimetype = value.pop("mimetype", None) + if mimetype is not None: + value["content_type"] = mimetype + self.files.add_file(key, **value) + else: + self.files.add_file(key, value) + + @staticmethod + def _make_base_url(scheme, host, script_root): + return url_unparse((scheme, host, script_root, "", "")).rstrip("/") + "/" + + @property + def base_url(self): + """The base URL is used to extract the URL scheme, host name, + port, and root path. + """ + return self._make_base_url(self.url_scheme, self.host, self.script_root) + + @base_url.setter + def base_url(self, value): + if value is None: + scheme = "http" + netloc = "localhost" + script_root = "" + else: + scheme, netloc, script_root, qs, anchor = url_parse(value) + if qs or anchor: + raise ValueError("base url must not contain a query string or fragment") + self.script_root = script_root.rstrip("/") + self.host = netloc + self.url_scheme = scheme + + def _get_content_type(self): + ct = self.headers.get("Content-Type") + if ct is None and not self._input_stream: + if self._files: + return "multipart/form-data" + elif self._form: + return "application/x-www-form-urlencoded" + return None + return ct + + def _set_content_type(self, value): + if value is None: + self.headers.pop("Content-Type", None) + else: + self.headers["Content-Type"] = value + + content_type = property( + _get_content_type, + _set_content_type, + doc="""The content type for the request. Reflected from and to + the :attr:`headers`. Do not set if you set :attr:`files` or + :attr:`form` for auto detection.""", + ) + del _get_content_type, _set_content_type + + def _get_content_length(self): + return self.headers.get("Content-Length", type=int) + + def _get_mimetype(self): + ct = self.content_type + if ct: + return ct.split(";")[0].strip() + + def _set_mimetype(self, value): + self.content_type = get_content_type(value, self.charset) + + def _get_mimetype_params(self): + def on_update(d): + self.headers["Content-Type"] = dump_options_header(self.mimetype, d) + + d = parse_options_header(self.headers.get("content-type", ""))[1] + return CallbackDict(d, on_update) + + mimetype = property( + _get_mimetype, + _set_mimetype, + doc="""The mimetype (content type without charset etc.) + + .. versionadded:: 0.14 + """, + ) + mimetype_params = property( + _get_mimetype_params, + doc=""" The mimetype parameters as dict. For example if the + content type is ``text/html; charset=utf-8`` the params would be + ``{'charset': 'utf-8'}``. + + .. versionadded:: 0.14 + """, + ) + del _get_mimetype, _set_mimetype, _get_mimetype_params + + def _set_content_length(self, value): + if value is None: + self.headers.pop("Content-Length", None) + else: + self.headers["Content-Length"] = str(value) + + content_length = property( + _get_content_length, + _set_content_length, + doc="""The content length as integer. Reflected from and to the + :attr:`headers`. Do not set if you set :attr:`files` or + :attr:`form` for auto detection.""", + ) + del _get_content_length, _set_content_length + + def form_property(name, storage, doc): # noqa: B902 + key = "_" + name + + def getter(self): + if self._input_stream is not None: + raise AttributeError("an input stream is defined") + rv = getattr(self, key) + if rv is None: + rv = storage() + setattr(self, key, rv) + + return rv + + def setter(self, value): + self._input_stream = None + setattr(self, key, value) + + return property(getter, setter, doc=doc) + + form = form_property("form", MultiDict, doc="A :class:`MultiDict` of form values.") + files = form_property( + "files", + FileMultiDict, + doc="""A :class:`FileMultiDict` of uploaded files. You can use + the :meth:`~FileMultiDict.add_file` method to add new files to + the dict.""", + ) + del form_property + + def _get_input_stream(self): + return self._input_stream + + def _set_input_stream(self, value): + self._input_stream = value + self._form = self._files = None + + input_stream = property( + _get_input_stream, + _set_input_stream, + doc="""An optional input stream. If you set this it will clear + :attr:`form` and :attr:`files`.""", + ) + del _get_input_stream, _set_input_stream + + def _get_query_string(self): + if self._query_string is None: + if self._args is not None: + return url_encode(self._args, charset=self.charset) + return "" + return self._query_string + + def _set_query_string(self, value): + self._query_string = value + self._args = None + + query_string = property( + _get_query_string, + _set_query_string, + doc="""The query string. If you set this to a string + :attr:`args` will no longer be available.""", + ) + del _get_query_string, _set_query_string + + def _get_args(self): + if self._query_string is not None: + raise AttributeError("a query string is defined") + if self._args is None: + self._args = MultiDict() + return self._args + + def _set_args(self, value): + self._query_string = None + self._args = value + + args = property( + _get_args, _set_args, doc="The URL arguments as :class:`MultiDict`." + ) + del _get_args, _set_args + + @property + def server_name(self): + """The server name (read-only, use :attr:`host` to set)""" + return self.host.split(":", 1)[0] + + @property + def server_port(self): + """The server port as integer (read-only, use :attr:`host` to set)""" + pieces = self.host.split(":", 1) + if len(pieces) == 2 and pieces[1].isdigit(): + return int(pieces[1]) + elif self.url_scheme == "https": + return 443 + return 80 + + def __del__(self): + try: + self.close() + except Exception: + pass + + def close(self): + """Closes all files. If you put real :class:`file` objects into the + :attr:`files` dict you can call this method to automatically close + them all in one go. + """ + if self.closed: + return + try: + files = itervalues(self.files) + except AttributeError: + files = () + for f in files: + try: + f.close() + except Exception: + pass + self.closed = True + + def get_environ(self): + """Return the built environ. + + .. versionchanged:: 0.15 + The content type and length headers are set based on + input stream detection. Previously this only set the WSGI + keys. + """ + input_stream = self.input_stream + content_length = self.content_length + + mimetype = self.mimetype + content_type = self.content_type + + if input_stream is not None: + start_pos = input_stream.tell() + input_stream.seek(0, 2) + end_pos = input_stream.tell() + input_stream.seek(start_pos) + content_length = end_pos - start_pos + elif mimetype == "multipart/form-data": + values = CombinedMultiDict([self.form, self.files]) + input_stream, content_length, boundary = stream_encode_multipart( + values, charset=self.charset + ) + content_type = mimetype + '; boundary="%s"' % boundary + elif mimetype == "application/x-www-form-urlencoded": + # XXX: py2v3 review + values = url_encode(self.form, charset=self.charset) + values = values.encode("ascii") + content_length = len(values) + input_stream = BytesIO(values) + else: + input_stream = BytesIO() + + result = {} + if self.environ_base: + result.update(self.environ_base) + + def _path_encode(x): + return wsgi_encoding_dance(url_unquote(x, self.charset), self.charset) + + qs = wsgi_encoding_dance(self.query_string) + + result.update( + { + "REQUEST_METHOD": self.method, + "SCRIPT_NAME": _path_encode(self.script_root), + "PATH_INFO": _path_encode(self.path), + "QUERY_STRING": qs, + # Non-standard, added by mod_wsgi, uWSGI + "REQUEST_URI": wsgi_encoding_dance(self.path), + # Non-standard, added by gunicorn + "RAW_URI": wsgi_encoding_dance(self.path), + "SERVER_NAME": self.server_name, + "SERVER_PORT": str(self.server_port), + "HTTP_HOST": self.host, + "SERVER_PROTOCOL": self.server_protocol, + "wsgi.version": self.wsgi_version, + "wsgi.url_scheme": self.url_scheme, + "wsgi.input": input_stream, + "wsgi.errors": self.errors_stream, + "wsgi.multithread": self.multithread, + "wsgi.multiprocess": self.multiprocess, + "wsgi.run_once": self.run_once, + } + ) + + headers = self.headers.copy() + + if content_type is not None: + result["CONTENT_TYPE"] = content_type + headers.set("Content-Type", content_type) + + if content_length is not None: + result["CONTENT_LENGTH"] = str(content_length) + headers.set("Content-Length", content_length) + + for key, value in headers.to_wsgi_list(): + result["HTTP_%s" % key.upper().replace("-", "_")] = value + + if self.environ_overrides: + result.update(self.environ_overrides) + + return result + + def get_request(self, cls=None): + """Returns a request with the data. If the request class is not + specified :attr:`request_class` is used. + + :param cls: The request wrapper to use. + """ + if cls is None: + cls = self.request_class + return cls(self.get_environ()) + + +class ClientRedirectError(Exception): + """If a redirect loop is detected when using follow_redirects=True with + the :cls:`Client`, then this exception is raised. + """ + + +class Client(object): + """This class allows you to send requests to a wrapped application. + + The response wrapper can be a class or factory function that takes + three arguments: app_iter, status and headers. The default response + wrapper just returns a tuple. + + Example:: + + class ClientResponse(BaseResponse): + ... + + client = Client(MyApplication(), response_wrapper=ClientResponse) + + The use_cookies parameter indicates whether cookies should be stored and + sent for subsequent requests. This is True by default, but passing False + will disable this behaviour. + + If you want to request some subdomain of your application you may set + `allow_subdomain_redirects` to `True` as if not no external redirects + are allowed. + + .. versionadded:: 0.5 + `use_cookies` is new in this version. Older versions did not provide + builtin cookie support. + + .. versionadded:: 0.14 + The `mimetype` parameter was added. + + .. versionadded:: 0.15 + The ``json`` parameter. + """ + + def __init__( + self, + application, + response_wrapper=None, + use_cookies=True, + allow_subdomain_redirects=False, + ): + self.application = application + self.response_wrapper = response_wrapper + if use_cookies: + self.cookie_jar = _TestCookieJar() + else: + self.cookie_jar = None + self.allow_subdomain_redirects = allow_subdomain_redirects + + def set_cookie( + self, + server_name, + key, + value="", + max_age=None, + expires=None, + path="/", + domain=None, + secure=None, + httponly=False, + charset="utf-8", + ): + """Sets a cookie in the client's cookie jar. The server name + is required and has to match the one that is also passed to + the open call. + """ + assert self.cookie_jar is not None, "cookies disabled" + header = dump_cookie( + key, value, max_age, expires, path, domain, secure, httponly, charset + ) + environ = create_environ(path, base_url="http://" + server_name) + headers = [("Set-Cookie", header)] + self.cookie_jar.extract_wsgi(environ, headers) + + def delete_cookie(self, server_name, key, path="/", domain=None): + """Deletes a cookie in the test client.""" + self.set_cookie( + server_name, key, expires=0, max_age=0, path=path, domain=domain + ) + + def run_wsgi_app(self, environ, buffered=False): + """Runs the wrapped WSGI app with the given environment.""" + if self.cookie_jar is not None: + self.cookie_jar.inject_wsgi(environ) + rv = run_wsgi_app(self.application, environ, buffered=buffered) + if self.cookie_jar is not None: + self.cookie_jar.extract_wsgi(environ, rv[2]) + return rv + + def resolve_redirect(self, response, new_location, environ, buffered=False): + """Perform a new request to the location given by the redirect + response to the previous request. + """ + scheme, netloc, path, qs, anchor = url_parse(new_location) + builder = EnvironBuilder.from_environ(environ, query_string=qs) + + to_name_parts = netloc.split(":", 1)[0].split(".") + from_name_parts = builder.server_name.split(".") + + if to_name_parts != [""]: + # The new location has a host, use it for the base URL. + builder.url_scheme = scheme + builder.host = netloc + else: + # A local redirect with autocorrect_location_header=False + # doesn't have a host, so use the request's host. + to_name_parts = from_name_parts + + # Explain why a redirect to a different server name won't be followed. + if to_name_parts != from_name_parts: + if to_name_parts[-len(from_name_parts) :] == from_name_parts: + if not self.allow_subdomain_redirects: + raise RuntimeError("Following subdomain redirects is not enabled.") + else: + raise RuntimeError("Following external redirects is not supported.") + + path_parts = path.split("/") + root_parts = builder.script_root.split("/") + + if path_parts[: len(root_parts)] == root_parts: + # Strip the script root from the path. + builder.path = path[len(builder.script_root) :] + else: + # The new location is not under the script root, so use the + # whole path and clear the previous root. + builder.path = path + builder.script_root = "" + + status_code = int(response[1].split(None, 1)[0]) + + # Only 307 and 308 preserve all of the original request. + if status_code not in {307, 308}: + # HEAD is preserved, everything else becomes GET. + if builder.method != "HEAD": + builder.method = "GET" + + # Clear the body and the headers that describe it. + builder.input_stream = None + builder.content_type = None + builder.content_length = None + builder.headers.pop("Transfer-Encoding", None) + + # Disable the response wrapper while handling redirects. Not + # thread safe, but the client should not be shared anyway. + old_response_wrapper = self.response_wrapper + self.response_wrapper = None + + try: + return self.open(builder, as_tuple=True, buffered=buffered) + finally: + self.response_wrapper = old_response_wrapper + + def open(self, *args, **kwargs): + """Takes the same arguments as the :class:`EnvironBuilder` class with + some additions: You can provide a :class:`EnvironBuilder` or a WSGI + environment as only argument instead of the :class:`EnvironBuilder` + arguments and two optional keyword arguments (`as_tuple`, `buffered`) + that change the type of the return value or the way the application is + executed. + + .. versionchanged:: 0.5 + If a dict is provided as file in the dict for the `data` parameter + the content type has to be called `content_type` now instead of + `mimetype`. This change was made for consistency with + :class:`werkzeug.FileWrapper`. + + The `follow_redirects` parameter was added to :func:`open`. + + Additional parameters: + + :param as_tuple: Returns a tuple in the form ``(environ, result)`` + :param buffered: Set this to True to buffer the application run. + This will automatically close the application for + you as well. + :param follow_redirects: Set this to True if the `Client` should + follow HTTP redirects. + """ + as_tuple = kwargs.pop("as_tuple", False) + buffered = kwargs.pop("buffered", False) + follow_redirects = kwargs.pop("follow_redirects", False) + environ = None + if not kwargs and len(args) == 1: + if isinstance(args[0], EnvironBuilder): + environ = args[0].get_environ() + elif isinstance(args[0], dict): + environ = args[0] + if environ is None: + builder = EnvironBuilder(*args, **kwargs) + try: + environ = builder.get_environ() + finally: + builder.close() + + response = self.run_wsgi_app(environ.copy(), buffered=buffered) + + # handle redirects + redirect_chain = [] + while 1: + status_code = int(response[1].split(None, 1)[0]) + if ( + status_code not in {301, 302, 303, 305, 307, 308} + or not follow_redirects + ): + break + + # Exhaust intermediate response bodies to ensure middleware + # that returns an iterator runs any cleanup code. + if not buffered: + for _ in response[0]: + pass + + new_location = response[2]["location"] + new_redirect_entry = (new_location, status_code) + if new_redirect_entry in redirect_chain: + raise ClientRedirectError("loop detected") + redirect_chain.append(new_redirect_entry) + environ, response = self.resolve_redirect( + response, new_location, environ, buffered=buffered + ) + + if self.response_wrapper is not None: + response = self.response_wrapper(*response) + if as_tuple: + return environ, response + return response + + def get(self, *args, **kw): + """Like open but method is enforced to GET.""" + kw["method"] = "GET" + return self.open(*args, **kw) + + def patch(self, *args, **kw): + """Like open but method is enforced to PATCH.""" + kw["method"] = "PATCH" + return self.open(*args, **kw) + + def post(self, *args, **kw): + """Like open but method is enforced to POST.""" + kw["method"] = "POST" + return self.open(*args, **kw) + + def head(self, *args, **kw): + """Like open but method is enforced to HEAD.""" + kw["method"] = "HEAD" + return self.open(*args, **kw) + + def put(self, *args, **kw): + """Like open but method is enforced to PUT.""" + kw["method"] = "PUT" + return self.open(*args, **kw) + + def delete(self, *args, **kw): + """Like open but method is enforced to DELETE.""" + kw["method"] = "DELETE" + return self.open(*args, **kw) + + def options(self, *args, **kw): + """Like open but method is enforced to OPTIONS.""" + kw["method"] = "OPTIONS" + return self.open(*args, **kw) + + def trace(self, *args, **kw): + """Like open but method is enforced to TRACE.""" + kw["method"] = "TRACE" + return self.open(*args, **kw) + + def __repr__(self): + return "<%s %r>" % (self.__class__.__name__, self.application) + + +def create_environ(*args, **kwargs): + """Create a new WSGI environ dict based on the values passed. The first + parameter should be the path of the request which defaults to '/'. The + second one can either be an absolute path (in that case the host is + localhost:80) or a full path to the request with scheme, netloc port and + the path to the script. + + This accepts the same arguments as the :class:`EnvironBuilder` + constructor. + + .. versionchanged:: 0.5 + This function is now a thin wrapper over :class:`EnvironBuilder` which + was added in 0.5. The `headers`, `environ_base`, `environ_overrides` + and `charset` parameters were added. + """ + builder = EnvironBuilder(*args, **kwargs) + try: + return builder.get_environ() + finally: + builder.close() + + +def run_wsgi_app(app, environ, buffered=False): + """Return a tuple in the form (app_iter, status, headers) of the + application output. This works best if you pass it an application that + returns an iterator all the time. + + Sometimes applications may use the `write()` callable returned + by the `start_response` function. This tries to resolve such edge + cases automatically. But if you don't get the expected output you + should set `buffered` to `True` which enforces buffering. + + If passed an invalid WSGI application the behavior of this function is + undefined. Never pass non-conforming WSGI applications to this function. + + :param app: the application to execute. + :param buffered: set to `True` to enforce buffering. + :return: tuple in the form ``(app_iter, status, headers)`` + """ + environ = _get_environ(environ) + response = [] + buffer = [] + + def start_response(status, headers, exc_info=None): + if exc_info is not None: + reraise(*exc_info) + response[:] = [status, headers] + return buffer.append + + app_rv = app(environ, start_response) + close_func = getattr(app_rv, "close", None) + app_iter = iter(app_rv) + + # when buffering we emit the close call early and convert the + # application iterator into a regular list + if buffered: + try: + app_iter = list(app_iter) + finally: + if close_func is not None: + close_func() + + # otherwise we iterate the application iter until we have a response, chain + # the already received data with the already collected data and wrap it in + # a new `ClosingIterator` if we need to restore a `close` callable from the + # original return value. + else: + for item in app_iter: + buffer.append(item) + if response: + break + if buffer: + app_iter = chain(buffer, app_iter) + if close_func is not None and app_iter is not app_rv: + app_iter = ClosingIterator(app_iter, close_func) + + return app_iter, response[0], Headers(response[1]) diff --git a/env/Lib/site-packages/werkzeug/testapp.py b/env/Lib/site-packages/werkzeug/testapp.py new file mode 100644 index 0000000..5ea8549 --- /dev/null +++ b/env/Lib/site-packages/werkzeug/testapp.py @@ -0,0 +1,241 @@ +# -*- coding: utf-8 -*- +""" + werkzeug.testapp + ~~~~~~~~~~~~~~~~ + + Provide a small test application that can be used to test a WSGI server + and check it for WSGI compliance. + + :copyright: 2007 Pallets + :license: BSD-3-Clause +""" +import base64 +import os +import sys +from textwrap import wrap + +from . import __version__ as _werkzeug_version +from .utils import escape +from .wrappers import BaseRequest as Request +from .wrappers import BaseResponse as Response + +logo = Response( + base64.b64decode( + """ +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 +=""" + ), + mimetype="image/png", +) + + +TEMPLATE = u"""\ + +WSGI Information + +
    + +

    WSGI Information

    +

    + This page displays all available information about the WSGI server and + the underlying Python interpreter. +

    Python Interpreter

    + + + + + + +
    Python Version + %(python_version)s +
    Platform + %(platform)s [%(os)s] +
    API Version + %(api_version)s +
    Byteorder + %(byteorder)s +
    Werkzeug Version + %(werkzeug_version)s +
    +

    WSGI Environment

    + %(wsgi_env)s
    +

    Installed Eggs

    +

    + The following python packages were installed on the system as + Python eggs: +

      %(python_eggs)s
    +

    System Path

    +

    + The following paths are the current contents of the load path. The + following entries are looked up for Python packages. Note that not + all items in this path are folders. Gray and underlined items are + entries pointing to invalid resources or used by custom import hooks + such as the zip importer. +

    + Items with a bright background were expanded for display from a relative + path. If you encounter such paths in the output you might want to check + your setup as relative paths are usually problematic in multithreaded + environments. +

      %(sys_path)s
    +
    +""" + + +def iter_sys_path(): + if os.name == "posix": + + def strip(x): + prefix = os.path.expanduser("~") + if x.startswith(prefix): + x = "~" + x[len(prefix) :] + return x + + else: + + def strip(x): + return x + + cwd = os.path.abspath(os.getcwd()) + for item in sys.path: + path = os.path.join(cwd, item or os.path.curdir) + yield strip(os.path.normpath(path)), not os.path.isdir(path), path != item + + +def render_testapp(req): + try: + import pkg_resources + except ImportError: + eggs = () + else: + eggs = sorted(pkg_resources.working_set, key=lambda x: x.project_name.lower()) + python_eggs = [] + for egg in eggs: + try: + version = egg.version + except (ValueError, AttributeError): + version = "unknown" + python_eggs.append( + "
  • %s [%s]" % (escape(egg.project_name), escape(version)) + ) + + wsgi_env = [] + sorted_environ = sorted(req.environ.items(), key=lambda x: repr(x[0]).lower()) + for key, value in sorted_environ: + wsgi_env.append( + "%s%s" + % (escape(str(key)), " ".join(wrap(escape(repr(value))))) + ) + + sys_path = [] + for item, virtual, expanded in iter_sys_path(): + class_ = [] + if virtual: + class_.append("virtual") + if expanded: + class_.append("exp") + sys_path.append( + "%s" + % (' class="%s"' % " ".join(class_) if class_ else "", escape(item)) + ) + + return ( + TEMPLATE + % { + "python_version": "
    ".join(escape(sys.version).splitlines()), + "platform": escape(sys.platform), + "os": escape(os.name), + "api_version": sys.api_version, + "byteorder": sys.byteorder, + "werkzeug_version": _werkzeug_version, + "python_eggs": "\n".join(python_eggs), + "wsgi_env": "\n".join(wsgi_env), + "sys_path": "\n".join(sys_path), + } + ).encode("utf-8") + + +def test_app(environ, start_response): + """Simple test application that dumps the environment. You can use + it to check if Werkzeug is working properly: + + .. sourcecode:: pycon + + >>> from werkzeug.serving import run_simple + >>> from werkzeug.testapp import test_app + >>> run_simple('localhost', 3000, test_app) + * Running on http://localhost:3000/ + + The application displays important information from the WSGI environment, + the Python interpreter and the installed libraries. + """ + req = Request(environ, populate_request=False) + if req.args.get("resource") == "logo": + response = logo + else: + response = Response(render_testapp(req), mimetype="text/html") + return response(environ, start_response) + + +if __name__ == "__main__": + from .serving import run_simple + + run_simple("localhost", 5000, test_app, use_reloader=True) diff --git a/env/Lib/site-packages/werkzeug/urls.py b/env/Lib/site-packages/werkzeug/urls.py new file mode 100644 index 0000000..566017d --- /dev/null +++ b/env/Lib/site-packages/werkzeug/urls.py @@ -0,0 +1,1138 @@ +# -*- coding: utf-8 -*- +""" + werkzeug.urls + ~~~~~~~~~~~~~ + + ``werkzeug.urls`` used to provide several wrapper functions for Python 2 + urlparse, whose main purpose were to work around the behavior of the Py2 + stdlib and its lack of unicode support. While this was already a somewhat + inconvenient situation, it got even more complicated because Python 3's + ``urllib.parse`` actually does handle unicode properly. In other words, + this module would wrap two libraries with completely different behavior. So + now this module contains a 2-and-3-compatible backport of Python 3's + ``urllib.parse``, which is mostly API-compatible. + + :copyright: 2007 Pallets + :license: BSD-3-Clause +""" +import codecs +import os +import re +from collections import namedtuple + +from ._compat import fix_tuple_repr +from ._compat import implements_to_string +from ._compat import make_literal_wrapper +from ._compat import normalize_string_tuple +from ._compat import PY2 +from ._compat import text_type +from ._compat import to_native +from ._compat import to_unicode +from ._compat import try_coerce_native +from ._internal import _decode_idna +from ._internal import _encode_idna + +# A regular expression for what a valid schema looks like +_scheme_re = re.compile(r"^[a-zA-Z0-9+-.]+$") + +# Characters that are safe in any part of an URL. +_always_safe = frozenset( + bytearray( + b"abcdefghijklmnopqrstuvwxyz" + b"ABCDEFGHIJKLMNOPQRSTUVWXYZ" + b"0123456789" + b"-._~" + ) +) + +_hexdigits = "0123456789ABCDEFabcdef" +_hextobyte = dict( + ((a + b).encode(), int(a + b, 16)) for a in _hexdigits for b in _hexdigits +) +_bytetohex = [("%%%02X" % char).encode("ascii") for char in range(256)] + + +_URLTuple = fix_tuple_repr( + namedtuple("_URLTuple", ["scheme", "netloc", "path", "query", "fragment"]) +) + + +class BaseURL(_URLTuple): + """Superclass of :py:class:`URL` and :py:class:`BytesURL`.""" + + __slots__ = () + + def replace(self, **kwargs): + """Return an URL with the same values, except for those parameters + given new values by whichever keyword arguments are specified.""" + return self._replace(**kwargs) + + @property + def host(self): + """The host part of the URL if available, otherwise `None`. The + host is either the hostname or the IP address mentioned in the + URL. It will not contain the port. + """ + return self._split_host()[0] + + @property + def ascii_host(self): + """Works exactly like :attr:`host` but will return a result that + is restricted to ASCII. If it finds a netloc that is not ASCII + it will attempt to idna decode it. This is useful for socket + operations when the URL might include internationalized characters. + """ + rv = self.host + if rv is not None and isinstance(rv, text_type): + try: + rv = _encode_idna(rv) + except UnicodeError: + rv = rv.encode("ascii", "ignore") + return to_native(rv, "ascii", "ignore") + + @property + def port(self): + """The port in the URL as an integer if it was present, `None` + otherwise. This does not fill in default ports. + """ + try: + rv = int(to_native(self._split_host()[1])) + if 0 <= rv <= 65535: + return rv + except (ValueError, TypeError): + pass + + @property + def auth(self): + """The authentication part in the URL if available, `None` + otherwise. + """ + return self._split_netloc()[0] + + @property + def username(self): + """The username if it was part of the URL, `None` otherwise. + This undergoes URL decoding and will always be a unicode string. + """ + rv = self._split_auth()[0] + if rv is not None: + return _url_unquote_legacy(rv) + + @property + def raw_username(self): + """The username if it was part of the URL, `None` otherwise. + Unlike :attr:`username` this one is not being decoded. + """ + return self._split_auth()[0] + + @property + def password(self): + """The password if it was part of the URL, `None` otherwise. + This undergoes URL decoding and will always be a unicode string. + """ + rv = self._split_auth()[1] + if rv is not None: + return _url_unquote_legacy(rv) + + @property + def raw_password(self): + """The password if it was part of the URL, `None` otherwise. + Unlike :attr:`password` this one is not being decoded. + """ + return self._split_auth()[1] + + def decode_query(self, *args, **kwargs): + """Decodes the query part of the URL. Ths is a shortcut for + calling :func:`url_decode` on the query argument. The arguments and + keyword arguments are forwarded to :func:`url_decode` unchanged. + """ + return url_decode(self.query, *args, **kwargs) + + def join(self, *args, **kwargs): + """Joins this URL with another one. This is just a convenience + function for calling into :meth:`url_join` and then parsing the + return value again. + """ + return url_parse(url_join(self, *args, **kwargs)) + + def to_url(self): + """Returns a URL string or bytes depending on the type of the + information stored. This is just a convenience function + for calling :meth:`url_unparse` for this URL. + """ + return url_unparse(self) + + def decode_netloc(self): + """Decodes the netloc part into a string.""" + rv = _decode_idna(self.host or "") + + if ":" in rv: + rv = "[%s]" % rv + port = self.port + if port is not None: + rv = "%s:%d" % (rv, port) + auth = ":".join( + filter( + None, + [ + _url_unquote_legacy(self.raw_username or "", "/:%@"), + _url_unquote_legacy(self.raw_password or "", "/:%@"), + ], + ) + ) + if auth: + rv = "%s@%s" % (auth, rv) + return rv + + def to_uri_tuple(self): + """Returns a :class:`BytesURL` tuple that holds a URI. This will + encode all the information in the URL properly to ASCII using the + rules a web browser would follow. + + It's usually more interesting to directly call :meth:`iri_to_uri` which + will return a string. + """ + return url_parse(iri_to_uri(self).encode("ascii")) + + def to_iri_tuple(self): + """Returns a :class:`URL` tuple that holds a IRI. This will try + to decode as much information as possible in the URL without + losing information similar to how a web browser does it for the + URL bar. + + It's usually more interesting to directly call :meth:`uri_to_iri` which + will return a string. + """ + return url_parse(uri_to_iri(self)) + + def get_file_location(self, pathformat=None): + """Returns a tuple with the location of the file in the form + ``(server, location)``. If the netloc is empty in the URL or + points to localhost, it's represented as ``None``. + + The `pathformat` by default is autodetection but needs to be set + when working with URLs of a specific system. The supported values + are ``'windows'`` when working with Windows or DOS paths and + ``'posix'`` when working with posix paths. + + If the URL does not point to a local file, the server and location + are both represented as ``None``. + + :param pathformat: The expected format of the path component. + Currently ``'windows'`` and ``'posix'`` are + supported. Defaults to ``None`` which is + autodetect. + """ + if self.scheme != "file": + return None, None + + path = url_unquote(self.path) + host = self.netloc or None + + if pathformat is None: + if os.name == "nt": + pathformat = "windows" + else: + pathformat = "posix" + + if pathformat == "windows": + if path[:1] == "/" and path[1:2].isalpha() and path[2:3] in "|:": + path = path[1:2] + ":" + path[3:] + windows_share = path[:3] in ("\\" * 3, "/" * 3) + import ntpath + + path = ntpath.normpath(path) + # Windows shared drives are represented as ``\\host\\directory``. + # That results in a URL like ``file://///host/directory``, and a + # path like ``///host/directory``. We need to special-case this + # because the path contains the hostname. + if windows_share and host is None: + parts = path.lstrip("\\").split("\\", 1) + if len(parts) == 2: + host, path = parts + else: + host = parts[0] + path = "" + elif pathformat == "posix": + import posixpath + + path = posixpath.normpath(path) + else: + raise TypeError("Invalid path format %s" % repr(pathformat)) + + if host in ("127.0.0.1", "::1", "localhost"): + host = None + + return host, path + + def _split_netloc(self): + if self._at in self.netloc: + return self.netloc.split(self._at, 1) + return None, self.netloc + + def _split_auth(self): + auth = self._split_netloc()[0] + if not auth: + return None, None + if self._colon not in auth: + return auth, None + return auth.split(self._colon, 1) + + def _split_host(self): + rv = self._split_netloc()[1] + if not rv: + return None, None + + if not rv.startswith(self._lbracket): + if self._colon in rv: + return rv.split(self._colon, 1) + return rv, None + + idx = rv.find(self._rbracket) + if idx < 0: + return rv, None + + host = rv[1:idx] + rest = rv[idx + 1 :] + if rest.startswith(self._colon): + return host, rest[1:] + return host, None + + +@implements_to_string +class URL(BaseURL): + """Represents a parsed URL. This behaves like a regular tuple but + also has some extra attributes that give further insight into the + URL. + """ + + __slots__ = () + _at = "@" + _colon = ":" + _lbracket = "[" + _rbracket = "]" + + def __str__(self): + return self.to_url() + + def encode_netloc(self): + """Encodes the netloc part to an ASCII safe URL as bytes.""" + rv = self.ascii_host or "" + if ":" in rv: + rv = "[%s]" % rv + port = self.port + if port is not None: + rv = "%s:%d" % (rv, port) + auth = ":".join( + filter( + None, + [ + url_quote(self.raw_username or "", "utf-8", "strict", "/:%"), + url_quote(self.raw_password or "", "utf-8", "strict", "/:%"), + ], + ) + ) + if auth: + rv = "%s@%s" % (auth, rv) + return to_native(rv) + + def encode(self, charset="utf-8", errors="replace"): + """Encodes the URL to a tuple made out of bytes. The charset is + only being used for the path, query and fragment. + """ + return BytesURL( + self.scheme.encode("ascii"), + self.encode_netloc(), + self.path.encode(charset, errors), + self.query.encode(charset, errors), + self.fragment.encode(charset, errors), + ) + + +class BytesURL(BaseURL): + """Represents a parsed URL in bytes.""" + + __slots__ = () + _at = b"@" + _colon = b":" + _lbracket = b"[" + _rbracket = b"]" + + def __str__(self): + return self.to_url().decode("utf-8", "replace") + + def encode_netloc(self): + """Returns the netloc unchanged as bytes.""" + return self.netloc + + def decode(self, charset="utf-8", errors="replace"): + """Decodes the URL to a tuple made out of strings. The charset is + only being used for the path, query and fragment. + """ + return URL( + self.scheme.decode("ascii"), + self.decode_netloc(), + self.path.decode(charset, errors), + self.query.decode(charset, errors), + self.fragment.decode(charset, errors), + ) + + +_unquote_maps = {frozenset(): _hextobyte} + + +def _unquote_to_bytes(string, unsafe=""): + if isinstance(string, text_type): + string = string.encode("utf-8") + + if isinstance(unsafe, text_type): + unsafe = unsafe.encode("utf-8") + + unsafe = frozenset(bytearray(unsafe)) + groups = iter(string.split(b"%")) + result = bytearray(next(groups, b"")) + + try: + hex_to_byte = _unquote_maps[unsafe] + except KeyError: + hex_to_byte = _unquote_maps[unsafe] = { + h: b for h, b in _hextobyte.items() if b not in unsafe + } + + for group in groups: + code = group[:2] + + if code in hex_to_byte: + result.append(hex_to_byte[code]) + result.extend(group[2:]) + else: + result.append(37) # % + result.extend(group) + + return bytes(result) + + +def _url_encode_impl(obj, charset, encode_keys, sort, key): + from .datastructures import iter_multi_items + + iterable = iter_multi_items(obj) + if sort: + iterable = sorted(iterable, key=key) + for key, value in iterable: + if value is None: + continue + if not isinstance(key, bytes): + key = text_type(key).encode(charset) + if not isinstance(value, bytes): + value = text_type(value).encode(charset) + yield _fast_url_quote_plus(key) + "=" + _fast_url_quote_plus(value) + + +def _url_unquote_legacy(value, unsafe=""): + try: + return url_unquote(value, charset="utf-8", errors="strict", unsafe=unsafe) + except UnicodeError: + return url_unquote(value, charset="latin1", unsafe=unsafe) + + +def url_parse(url, scheme=None, allow_fragments=True): + """Parses a URL from a string into a :class:`URL` tuple. If the URL + is lacking a scheme it can be provided as second argument. Otherwise, + it is ignored. Optionally fragments can be stripped from the URL + by setting `allow_fragments` to `False`. + + The inverse of this function is :func:`url_unparse`. + + :param url: the URL to parse. + :param scheme: the default schema to use if the URL is schemaless. + :param allow_fragments: if set to `False` a fragment will be removed + from the URL. + """ + s = make_literal_wrapper(url) + is_text_based = isinstance(url, text_type) + + if scheme is None: + scheme = s("") + netloc = query = fragment = s("") + i = url.find(s(":")) + if i > 0 and _scheme_re.match(to_native(url[:i], errors="replace")): + # make sure "iri" is not actually a port number (in which case + # "scheme" is really part of the path) + rest = url[i + 1 :] + if not rest or any(c not in s("0123456789") for c in rest): + # not a port number + scheme, url = url[:i].lower(), rest + + if url[:2] == s("//"): + delim = len(url) + for c in s("/?#"): + wdelim = url.find(c, 2) + if wdelim >= 0: + delim = min(delim, wdelim) + netloc, url = url[2:delim], url[delim:] + if (s("[") in netloc and s("]") not in netloc) or ( + s("]") in netloc and s("[") not in netloc + ): + raise ValueError("Invalid IPv6 URL") + + if allow_fragments and s("#") in url: + url, fragment = url.split(s("#"), 1) + if s("?") in url: + url, query = url.split(s("?"), 1) + + result_type = URL if is_text_based else BytesURL + return result_type(scheme, netloc, url, query, fragment) + + +def _make_fast_url_quote(charset="utf-8", errors="strict", safe="/:", unsafe=""): + """Precompile the translation table for a URL encoding function. + + Unlike :func:`url_quote`, the generated function only takes the + string to quote. + + :param charset: The charset to encode the result with. + :param errors: How to handle encoding errors. + :param safe: An optional sequence of safe characters to never encode. + :param unsafe: An optional sequence of unsafe characters to always encode. + """ + if isinstance(safe, text_type): + safe = safe.encode(charset, errors) + + if isinstance(unsafe, text_type): + unsafe = unsafe.encode(charset, errors) + + safe = (frozenset(bytearray(safe)) | _always_safe) - frozenset(bytearray(unsafe)) + table = [chr(c) if c in safe else "%%%02X" % c for c in range(256)] + + if not PY2: + + def quote(string): + return "".join([table[c] for c in string]) + + else: + + def quote(string): + return "".join([table[c] for c in bytearray(string)]) + + return quote + + +_fast_url_quote = _make_fast_url_quote() +_fast_quote_plus = _make_fast_url_quote(safe=" ", unsafe="+") + + +def _fast_url_quote_plus(string): + return _fast_quote_plus(string).replace(" ", "+") + + +def url_quote(string, charset="utf-8", errors="strict", safe="/:", unsafe=""): + """URL encode a single string with a given encoding. + + :param s: the string to quote. + :param charset: the charset to be used. + :param safe: an optional sequence of safe characters. + :param unsafe: an optional sequence of unsafe characters. + + .. versionadded:: 0.9.2 + The `unsafe` parameter was added. + """ + if not isinstance(string, (text_type, bytes, bytearray)): + string = text_type(string) + if isinstance(string, text_type): + string = string.encode(charset, errors) + if isinstance(safe, text_type): + safe = safe.encode(charset, errors) + if isinstance(unsafe, text_type): + unsafe = unsafe.encode(charset, errors) + safe = (frozenset(bytearray(safe)) | _always_safe) - frozenset(bytearray(unsafe)) + rv = bytearray() + for char in bytearray(string): + if char in safe: + rv.append(char) + else: + rv.extend(_bytetohex[char]) + return to_native(bytes(rv)) + + +def url_quote_plus(string, charset="utf-8", errors="strict", safe=""): + """URL encode a single string with the given encoding and convert + whitespace to "+". + + :param s: The string to quote. + :param charset: The charset to be used. + :param safe: An optional sequence of safe characters. + """ + return url_quote(string, charset, errors, safe + " ", "+").replace(" ", "+") + + +def url_unparse(components): + """The reverse operation to :meth:`url_parse`. This accepts arbitrary + as well as :class:`URL` tuples and returns a URL as a string. + + :param components: the parsed URL as tuple which should be converted + into a URL string. + """ + scheme, netloc, path, query, fragment = normalize_string_tuple(components) + s = make_literal_wrapper(scheme) + url = s("") + + # We generally treat file:///x and file:/x the same which is also + # what browsers seem to do. This also allows us to ignore a schema + # register for netloc utilization or having to differenciate between + # empty and missing netloc. + if netloc or (scheme and path.startswith(s("/"))): + if path and path[:1] != s("/"): + path = s("/") + path + url = s("//") + (netloc or s("")) + path + elif path: + url += path + if scheme: + url = scheme + s(":") + url + if query: + url = url + s("?") + query + if fragment: + url = url + s("#") + fragment + return url + + +def url_unquote(string, charset="utf-8", errors="replace", unsafe=""): + """URL decode a single string with a given encoding. If the charset + is set to `None` no unicode decoding is performed and raw bytes + are returned. + + :param s: the string to unquote. + :param charset: the charset of the query string. If set to `None` + no unicode decoding will take place. + :param errors: the error handling for the charset decoding. + """ + rv = _unquote_to_bytes(string, unsafe) + if charset is not None: + rv = rv.decode(charset, errors) + return rv + + +def url_unquote_plus(s, charset="utf-8", errors="replace"): + """URL decode a single string with the given `charset` and decode "+" to + whitespace. + + Per default encoding errors are ignored. If you want a different behavior + you can set `errors` to ``'replace'`` or ``'strict'``. In strict mode a + :exc:`HTTPUnicodeError` is raised. + + :param s: The string to unquote. + :param charset: the charset of the query string. If set to `None` + no unicode decoding will take place. + :param errors: The error handling for the `charset` decoding. + """ + if isinstance(s, text_type): + s = s.replace(u"+", u" ") + else: + s = s.replace(b"+", b" ") + return url_unquote(s, charset, errors) + + +def url_fix(s, charset="utf-8"): + r"""Sometimes you get an URL by a user that just isn't a real URL because + it contains unsafe characters like ' ' and so on. This function can fix + some of the problems in a similar way browsers handle data entered by the + user: + + >>> url_fix(u'http://de.wikipedia.org/wiki/Elf (Begriffskl\xe4rung)') + 'http://de.wikipedia.org/wiki/Elf%20(Begriffskl%C3%A4rung)' + + :param s: the string with the URL to fix. + :param charset: The target charset for the URL if the url was given as + unicode string. + """ + # First step is to switch to unicode processing and to convert + # backslashes (which are invalid in URLs anyways) to slashes. This is + # consistent with what Chrome does. + s = to_unicode(s, charset, "replace").replace("\\", "/") + + # For the specific case that we look like a malformed windows URL + # we want to fix this up manually: + if s.startswith("file://") and s[7:8].isalpha() and s[8:10] in (":/", "|/"): + s = "file:///" + s[7:] + + url = url_parse(s) + path = url_quote(url.path, charset, safe="/%+$!*'(),") + qs = url_quote_plus(url.query, charset, safe=":&%=+$!*'(),") + anchor = url_quote_plus(url.fragment, charset, safe=":&%=+$!*'(),") + return to_native(url_unparse((url.scheme, url.encode_netloc(), path, qs, anchor))) + + +# not-unreserved characters remain quoted when unquoting to IRI +_to_iri_unsafe = "".join([chr(c) for c in range(128) if c not in _always_safe]) + + +def _codec_error_url_quote(e): + """Used in :func:`uri_to_iri` after unquoting to re-quote any + invalid bytes. + """ + out = _fast_url_quote(e.object[e.start : e.end]) + + if PY2: + out = out.decode("utf-8") + + return out, e.end + + +codecs.register_error("werkzeug.url_quote", _codec_error_url_quote) + + +def uri_to_iri(uri, charset="utf-8", errors="werkzeug.url_quote"): + """Convert a URI to an IRI. All valid UTF-8 characters are unquoted, + leaving all reserved and invalid characters quoted. If the URL has + a domain, it is decoded from Punycode. + + >>> uri_to_iri("http://xn--n3h.net/p%C3%A5th?q=%C3%A8ry%DF") + 'http://\\u2603.net/p\\xe5th?q=\\xe8ry%DF' + + :param uri: The URI to convert. + :param charset: The encoding to encode unquoted bytes with. + :param errors: Error handler to use during ``bytes.encode``. By + default, invalid bytes are left quoted. + + .. versionchanged:: 0.15 + All reserved and invalid characters remain quoted. Previously, + only some reserved characters were preserved, and invalid bytes + were replaced instead of left quoted. + + .. versionadded:: 0.6 + """ + if isinstance(uri, tuple): + uri = url_unparse(uri) + + uri = url_parse(to_unicode(uri, charset)) + path = url_unquote(uri.path, charset, errors, _to_iri_unsafe) + query = url_unquote(uri.query, charset, errors, _to_iri_unsafe) + fragment = url_unquote(uri.fragment, charset, errors, _to_iri_unsafe) + return url_unparse((uri.scheme, uri.decode_netloc(), path, query, fragment)) + + +# reserved characters remain unquoted when quoting to URI +_to_uri_safe = ":/?#[]@!$&'()*+,;=%" + + +def iri_to_uri(iri, charset="utf-8", errors="strict", safe_conversion=False): + """Convert an IRI to a URI. All non-ASCII and unsafe characters are + quoted. If the URL has a domain, it is encoded to Punycode. + + >>> iri_to_uri('http://\\u2603.net/p\\xe5th?q=\\xe8ry%DF') + 'http://xn--n3h.net/p%C3%A5th?q=%C3%A8ry%DF' + + :param iri: The IRI to convert. + :param charset: The encoding of the IRI. + :param errors: Error handler to use during ``bytes.encode``. + :param safe_conversion: Return the URL unchanged if it only contains + ASCII characters and no whitespace. See the explanation below. + + There is a general problem with IRI conversion with some protocols + that are in violation of the URI specification. Consider the + following two IRIs:: + + magnet:?xt=uri:whatever + itms-services://?action=download-manifest + + After parsing, we don't know if the scheme requires the ``//``, + which is dropped if empty, but conveys different meanings in the + final URL if it's present or not. In this case, you can use + ``safe_conversion``, which will return the URL unchanged if it only + contains ASCII characters and no whitespace. This can result in a + URI with unquoted characters if it was not already quoted correctly, + but preserves the URL's semantics. Werkzeug uses this for the + ``Location`` header for redirects. + + .. versionchanged:: 0.15 + All reserved characters remain unquoted. Previously, only some + reserved characters were left unquoted. + + .. versionchanged:: 0.9.6 + The ``safe_conversion`` parameter was added. + + .. versionadded:: 0.6 + """ + if isinstance(iri, tuple): + iri = url_unparse(iri) + + if safe_conversion: + # If we're not sure if it's safe to convert the URL, and it only + # contains ASCII characters, return it unconverted. + try: + native_iri = to_native(iri) + ascii_iri = native_iri.encode("ascii") + + # Only return if it doesn't have whitespace. (Why?) + if len(ascii_iri.split()) == 1: + return native_iri + except UnicodeError: + pass + + iri = url_parse(to_unicode(iri, charset, errors)) + path = url_quote(iri.path, charset, errors, _to_uri_safe) + query = url_quote(iri.query, charset, errors, _to_uri_safe) + fragment = url_quote(iri.fragment, charset, errors, _to_uri_safe) + return to_native( + url_unparse((iri.scheme, iri.encode_netloc(), path, query, fragment)) + ) + + +def url_decode( + s, + charset="utf-8", + decode_keys=False, + include_empty=True, + errors="replace", + separator="&", + cls=None, +): + """ + Parse a querystring and return it as :class:`MultiDict`. There is a + difference in key decoding on different Python versions. On Python 3 + keys will always be fully decoded whereas on Python 2, keys will + remain bytestrings if they fit into ASCII. On 2.x keys can be forced + to be unicode by setting `decode_keys` to `True`. + + If the charset is set to `None` no unicode decoding will happen and + raw bytes will be returned. + + Per default a missing value for a key will default to an empty key. If + you don't want that behavior you can set `include_empty` to `False`. + + Per default encoding errors are ignored. If you want a different behavior + you can set `errors` to ``'replace'`` or ``'strict'``. In strict mode a + `HTTPUnicodeError` is raised. + + .. versionchanged:: 0.5 + In previous versions ";" and "&" could be used for url decoding. + This changed in 0.5 where only "&" is supported. If you want to + use ";" instead a different `separator` can be provided. + + The `cls` parameter was added. + + :param s: a string with the query string to decode. + :param charset: the charset of the query string. If set to `None` + no unicode decoding will take place. + :param decode_keys: Used on Python 2.x to control whether keys should + be forced to be unicode objects. If set to `True` + then keys will be unicode in all cases. Otherwise, + they remain `str` if they fit into ASCII. + :param include_empty: Set to `False` if you don't want empty values to + appear in the dict. + :param errors: the decoding error behavior. + :param separator: the pair separator to be used, defaults to ``&`` + :param cls: an optional dict class to use. If this is not specified + or `None` the default :class:`MultiDict` is used. + """ + if cls is None: + from .datastructures import MultiDict + + cls = MultiDict + if isinstance(s, text_type) and not isinstance(separator, text_type): + separator = separator.decode(charset or "ascii") + elif isinstance(s, bytes) and not isinstance(separator, bytes): + separator = separator.encode(charset or "ascii") + return cls( + _url_decode_impl( + s.split(separator), charset, decode_keys, include_empty, errors + ) + ) + + +def url_decode_stream( + stream, + charset="utf-8", + decode_keys=False, + include_empty=True, + errors="replace", + separator="&", + cls=None, + limit=None, + return_iterator=False, +): + """Works like :func:`url_decode` but decodes a stream. The behavior + of stream and limit follows functions like + :func:`~werkzeug.wsgi.make_line_iter`. The generator of pairs is + directly fed to the `cls` so you can consume the data while it's + parsed. + + .. versionadded:: 0.8 + + :param stream: a stream with the encoded querystring + :param charset: the charset of the query string. If set to `None` + no unicode decoding will take place. + :param decode_keys: Used on Python 2.x to control whether keys should + be forced to be unicode objects. If set to `True`, + keys will be unicode in all cases. Otherwise, they + remain `str` if they fit into ASCII. + :param include_empty: Set to `False` if you don't want empty values to + appear in the dict. + :param errors: the decoding error behavior. + :param separator: the pair separator to be used, defaults to ``&`` + :param cls: an optional dict class to use. If this is not specified + or `None` the default :class:`MultiDict` is used. + :param limit: the content length of the URL data. Not necessary if + a limited stream is provided. + :param return_iterator: if set to `True` the `cls` argument is ignored + and an iterator over all decoded pairs is + returned + """ + from .wsgi import make_chunk_iter + + pair_iter = make_chunk_iter(stream, separator, limit) + decoder = _url_decode_impl(pair_iter, charset, decode_keys, include_empty, errors) + + if return_iterator: + return decoder + + if cls is None: + from .datastructures import MultiDict + + cls = MultiDict + + return cls(decoder) + + +def _url_decode_impl(pair_iter, charset, decode_keys, include_empty, errors): + for pair in pair_iter: + if not pair: + continue + s = make_literal_wrapper(pair) + equal = s("=") + if equal in pair: + key, value = pair.split(equal, 1) + else: + if not include_empty: + continue + key = pair + value = s("") + key = url_unquote_plus(key, charset, errors) + if charset is not None and PY2 and not decode_keys: + key = try_coerce_native(key) + yield key, url_unquote_plus(value, charset, errors) + + +def url_encode( + obj, charset="utf-8", encode_keys=False, sort=False, key=None, separator=b"&" +): + """URL encode a dict/`MultiDict`. If a value is `None` it will not appear + in the result string. Per default only values are encoded into the target + charset strings. If `encode_keys` is set to ``True`` unicode keys are + supported too. + + If `sort` is set to `True` the items are sorted by `key` or the default + sorting algorithm. + + .. versionadded:: 0.5 + `sort`, `key`, and `separator` were added. + + :param obj: the object to encode into a query string. + :param charset: the charset of the query string. + :param encode_keys: set to `True` if you have unicode keys. (Ignored on + Python 3.x) + :param sort: set to `True` if you want parameters to be sorted by `key`. + :param separator: the separator to be used for the pairs. + :param key: an optional function to be used for sorting. For more details + check out the :func:`sorted` documentation. + """ + separator = to_native(separator, "ascii") + return separator.join(_url_encode_impl(obj, charset, encode_keys, sort, key)) + + +def url_encode_stream( + obj, + stream=None, + charset="utf-8", + encode_keys=False, + sort=False, + key=None, + separator=b"&", +): + """Like :meth:`url_encode` but writes the results to a stream + object. If the stream is `None` a generator over all encoded + pairs is returned. + + .. versionadded:: 0.8 + + :param obj: the object to encode into a query string. + :param stream: a stream to write the encoded object into or `None` if + an iterator over the encoded pairs should be returned. In + that case the separator argument is ignored. + :param charset: the charset of the query string. + :param encode_keys: set to `True` if you have unicode keys. (Ignored on + Python 3.x) + :param sort: set to `True` if you want parameters to be sorted by `key`. + :param separator: the separator to be used for the pairs. + :param key: an optional function to be used for sorting. For more details + check out the :func:`sorted` documentation. + """ + separator = to_native(separator, "ascii") + gen = _url_encode_impl(obj, charset, encode_keys, sort, key) + if stream is None: + return gen + for idx, chunk in enumerate(gen): + if idx: + stream.write(separator) + stream.write(chunk) + + +def url_join(base, url, allow_fragments=True): + """Join a base URL and a possibly relative URL to form an absolute + interpretation of the latter. + + :param base: the base URL for the join operation. + :param url: the URL to join. + :param allow_fragments: indicates whether fragments should be allowed. + """ + if isinstance(base, tuple): + base = url_unparse(base) + if isinstance(url, tuple): + url = url_unparse(url) + + base, url = normalize_string_tuple((base, url)) + s = make_literal_wrapper(base) + + if not base: + return url + if not url: + return base + + bscheme, bnetloc, bpath, bquery, bfragment = url_parse( + base, allow_fragments=allow_fragments + ) + scheme, netloc, path, query, fragment = url_parse(url, bscheme, allow_fragments) + if scheme != bscheme: + return url + if netloc: + return url_unparse((scheme, netloc, path, query, fragment)) + netloc = bnetloc + + if path[:1] == s("/"): + segments = path.split(s("/")) + elif not path: + segments = bpath.split(s("/")) + if not query: + query = bquery + else: + segments = bpath.split(s("/"))[:-1] + path.split(s("/")) + + # If the rightmost part is "./" we want to keep the slash but + # remove the dot. + if segments[-1] == s("."): + segments[-1] = s("") + + # Resolve ".." and "." + segments = [segment for segment in segments if segment != s(".")] + while 1: + i = 1 + n = len(segments) - 1 + while i < n: + if segments[i] == s("..") and segments[i - 1] not in (s(""), s("..")): + del segments[i - 1 : i + 1] + break + i += 1 + else: + break + + # Remove trailing ".." if the URL is absolute + unwanted_marker = [s(""), s("..")] + while segments[:2] == unwanted_marker: + del segments[1] + + path = s("/").join(segments) + return url_unparse((scheme, netloc, path, query, fragment)) + + +class Href(object): + """Implements a callable that constructs URLs with the given base. The + function can be called with any number of positional and keyword + arguments which than are used to assemble the URL. Works with URLs + and posix paths. + + Positional arguments are appended as individual segments to + the path of the URL: + + >>> href = Href('/foo') + >>> href('bar', 23) + '/foo/bar/23' + >>> href('foo', bar=23) + '/foo/foo?bar=23' + + If any of the arguments (positional or keyword) evaluates to `None` it + will be skipped. If no keyword arguments are given the last argument + can be a :class:`dict` or :class:`MultiDict` (or any other dict subclass), + otherwise the keyword arguments are used for the query parameters, cutting + off the first trailing underscore of the parameter name: + + >>> href(is_=42) + '/foo?is=42' + >>> href({'foo': 'bar'}) + '/foo?foo=bar' + + Combining of both methods is not allowed: + + >>> href({'foo': 'bar'}, bar=42) + Traceback (most recent call last): + ... + TypeError: keyword arguments and query-dicts can't be combined + + Accessing attributes on the href object creates a new href object with + the attribute name as prefix: + + >>> bar_href = href.bar + >>> bar_href("blub") + '/foo/bar/blub' + + If `sort` is set to `True` the items are sorted by `key` or the default + sorting algorithm: + + >>> href = Href("/", sort=True) + >>> href(a=1, b=2, c=3) + '/?a=1&b=2&c=3' + + .. versionadded:: 0.5 + `sort` and `key` were added. + """ + + def __init__(self, base="./", charset="utf-8", sort=False, key=None): + if not base: + base = "./" + self.base = base + self.charset = charset + self.sort = sort + self.key = key + + def __getattr__(self, name): + if name[:2] == "__": + raise AttributeError(name) + base = self.base + if base[-1:] != "/": + base += "/" + return Href(url_join(base, name), self.charset, self.sort, self.key) + + def __call__(self, *path, **query): + if path and isinstance(path[-1], dict): + if query: + raise TypeError("keyword arguments and query-dicts can't be combined") + query, path = path[-1], path[:-1] + elif query: + query = dict( + [(k.endswith("_") and k[:-1] or k, v) for k, v in query.items()] + ) + path = "/".join( + [ + to_unicode(url_quote(x, self.charset), "ascii") + for x in path + if x is not None + ] + ).lstrip("/") + rv = self.base + if path: + if not rv.endswith("/"): + rv += "/" + rv = url_join(rv, "./" + path) + if query: + rv += "?" + to_unicode( + url_encode(query, self.charset, sort=self.sort, key=self.key), "ascii" + ) + return to_native(rv) diff --git a/env/Lib/site-packages/werkzeug/useragents.py b/env/Lib/site-packages/werkzeug/useragents.py new file mode 100644 index 0000000..8fce415 --- /dev/null +++ b/env/Lib/site-packages/werkzeug/useragents.py @@ -0,0 +1,210 @@ +# -*- coding: utf-8 -*- +""" + werkzeug.useragents + ~~~~~~~~~~~~~~~~~~~ + + This module provides a helper to inspect user agent strings. This module + is far from complete but should work for most of the currently available + browsers. + + + :copyright: 2007 Pallets + :license: BSD-3-Clause +""" +import re + + +class UserAgentParser(object): + """A simple user agent parser. Used by the `UserAgent`.""" + + platforms = ( + ("cros", "chromeos"), + ("iphone|ios", "iphone"), + ("ipad", "ipad"), + (r"darwin|mac|os\s*x", "macos"), + ("win", "windows"), + (r"android", "android"), + ("netbsd", "netbsd"), + ("openbsd", "openbsd"), + ("freebsd", "freebsd"), + ("dragonfly", "dragonflybsd"), + ("(sun|i86)os", "solaris"), + (r"x11|lin(\b|ux)?", "linux"), + (r"nintendo\s+wii", "wii"), + ("irix", "irix"), + ("hp-?ux", "hpux"), + ("aix", "aix"), + ("sco|unix_sv", "sco"), + ("bsd", "bsd"), + ("amiga", "amiga"), + ("blackberry|playbook", "blackberry"), + ("symbian", "symbian"), + ) + browsers = ( + ("googlebot", "google"), + ("msnbot", "msn"), + ("yahoo", "yahoo"), + ("ask jeeves", "ask"), + (r"aol|america\s+online\s+browser", "aol"), + ("opera", "opera"), + ("edge", "edge"), + ("chrome|crios", "chrome"), + ("seamonkey", "seamonkey"), + ("firefox|firebird|phoenix|iceweasel", "firefox"), + ("galeon", "galeon"), + ("safari|version", "safari"), + ("webkit", "webkit"), + ("camino", "camino"), + ("konqueror", "konqueror"), + ("k-meleon", "kmeleon"), + ("netscape", "netscape"), + (r"msie|microsoft\s+internet\s+explorer|trident/.+? rv:", "msie"), + ("lynx", "lynx"), + ("links", "links"), + ("Baiduspider", "baidu"), + ("bingbot", "bing"), + ("mozilla", "mozilla"), + ) + + _browser_version_re = r"(?:%s)[/\sa-z(]*(\d+[.\da-z]+)?" + _language_re = re.compile( + r"(?:;\s*|\s+)(\b\w{2}\b(?:-\b\w{2}\b)?)\s*;|" + r"(?:\(|\[|;)\s*(\b\w{2}\b(?:-\b\w{2}\b)?)\s*(?:\]|\)|;)" + ) + + def __init__(self): + self.platforms = [(b, re.compile(a, re.I)) for a, b in self.platforms] + self.browsers = [ + (b, re.compile(self._browser_version_re % a, re.I)) + for a, b in self.browsers + ] + + def __call__(self, user_agent): + for platform, regex in self.platforms: # noqa: B007 + match = regex.search(user_agent) + if match is not None: + break + else: + platform = None + for browser, regex in self.browsers: # noqa: B007 + match = regex.search(user_agent) + if match is not None: + version = match.group(1) + break + else: + browser = version = None + match = self._language_re.search(user_agent) + if match is not None: + language = match.group(1) or match.group(2) + else: + language = None + return platform, browser, version, language + + +class UserAgent(object): + """Represents a user agent. Pass it a WSGI environment or a user agent + string and you can inspect some of the details from the user agent + string via the attributes. The following attributes exist: + + .. attribute:: string + + the raw user agent string + + .. attribute:: platform + + the browser platform. The following platforms are currently + recognized: + + - `aix` + - `amiga` + - `android` + - `blackberry` + - `bsd` + - `chromeos` + - `dragonflybsd` + - `freebsd` + - `hpux` + - `ipad` + - `iphone` + - `irix` + - `linux` + - `macos` + - `netbsd` + - `openbsd` + - `sco` + - `solaris` + - `symbian` + - `wii` + - `windows` + + .. attribute:: browser + + the name of the browser. The following browsers are currently + recognized: + + - `aol` * + - `ask` * + - `baidu` * + - `bing` * + - `camino` + - `chrome` + - `edge` + - `firefox` + - `galeon` + - `google` * + - `kmeleon` + - `konqueror` + - `links` + - `lynx` + - `mozilla` + - `msie` + - `msn` + - `netscape` + - `opera` + - `safari` + - `seamonkey` + - `webkit` + - `yahoo` * + + (Browsers marked with a star (``*``) are crawlers.) + + .. attribute:: version + + the version of the browser + + .. attribute:: language + + the language of the browser + """ + + _parser = UserAgentParser() + + def __init__(self, environ_or_string): + if isinstance(environ_or_string, dict): + environ_or_string = environ_or_string.get("HTTP_USER_AGENT", "") + self.string = environ_or_string + self.platform, self.browser, self.version, self.language = self._parser( + environ_or_string + ) + + def to_header(self): + return self.string + + def __str__(self): + return self.string + + def __nonzero__(self): + return bool(self.browser) + + __bool__ = __nonzero__ + + def __repr__(self): + return "<%s %r/%s>" % (self.__class__.__name__, self.browser, self.version) + + +from werkzeug import _DeprecatedImportModule + +_DeprecatedImportModule( + __name__, {".wrappers.user_agent": ["UserAgentMixin"]}, "Werkzeug 1.0" +) +del _DeprecatedImportModule diff --git a/env/Lib/site-packages/werkzeug/utils.py b/env/Lib/site-packages/werkzeug/utils.py new file mode 100644 index 0000000..477164e --- /dev/null +++ b/env/Lib/site-packages/werkzeug/utils.py @@ -0,0 +1,774 @@ +# -*- coding: utf-8 -*- +""" + werkzeug.utils + ~~~~~~~~~~~~~~ + + This module implements various utilities for WSGI applications. Most of + them are used by the request and response wrappers but especially for + middleware development it makes sense to use them without the wrappers. + + :copyright: 2007 Pallets + :license: BSD-3-Clause +""" +import codecs +import os +import pkgutil +import re +import sys + +from ._compat import iteritems +from ._compat import PY2 +from ._compat import reraise +from ._compat import string_types +from ._compat import text_type +from ._compat import unichr +from ._internal import _DictAccessorProperty +from ._internal import _missing +from ._internal import _parse_signature + +try: + from html.entities import name2codepoint +except ImportError: + from htmlentitydefs import name2codepoint + + +_format_re = re.compile(r"\$(?:(%s)|\{(%s)\})" % (("[a-zA-Z_][a-zA-Z0-9_]*",) * 2)) +_entity_re = re.compile(r"&([^;]+);") +_filename_ascii_strip_re = re.compile(r"[^A-Za-z0-9_.-]") +_windows_device_files = ( + "CON", + "AUX", + "COM1", + "COM2", + "COM3", + "COM4", + "LPT1", + "LPT2", + "LPT3", + "PRN", + "NUL", +) + + +class cached_property(property): + """A decorator that converts a function into a lazy property. The + function wrapped is called the first time to retrieve the result + and then that calculated result is used the next time you access + the value:: + + class Foo(object): + + @cached_property + def foo(self): + # calculate something important here + return 42 + + The class has to have a `__dict__` in order for this property to + work. + """ + + # implementation detail: A subclass of python's builtin property + # decorator, we override __get__ to check for a cached value. If one + # chooses to invoke __get__ by hand the property will still work as + # expected because the lookup logic is replicated in __get__ for + # manual invocation. + + def __init__(self, func, name=None, doc=None): + self.__name__ = name or func.__name__ + self.__module__ = func.__module__ + self.__doc__ = doc or func.__doc__ + self.func = func + + def __set__(self, obj, value): + obj.__dict__[self.__name__] = value + + def __get__(self, obj, type=None): + if obj is None: + return self + value = obj.__dict__.get(self.__name__, _missing) + if value is _missing: + value = self.func(obj) + obj.__dict__[self.__name__] = value + return value + + +class environ_property(_DictAccessorProperty): + """Maps request attributes to environment variables. This works not only + for the Werzeug request object, but also any other class with an + environ attribute: + + >>> class Test(object): + ... environ = {'key': 'value'} + ... test = environ_property('key') + >>> var = Test() + >>> var.test + 'value' + + If you pass it a second value it's used as default if the key does not + exist, the third one can be a converter that takes a value and converts + it. If it raises :exc:`ValueError` or :exc:`TypeError` the default value + is used. If no default value is provided `None` is used. + + Per default the property is read only. You have to explicitly enable it + by passing ``read_only=False`` to the constructor. + """ + + read_only = True + + def lookup(self, obj): + return obj.environ + + +class header_property(_DictAccessorProperty): + """Like `environ_property` but for headers.""" + + def lookup(self, obj): + return obj.headers + + +class HTMLBuilder(object): + """Helper object for HTML generation. + + Per default there are two instances of that class. The `html` one, and + the `xhtml` one for those two dialects. The class uses keyword parameters + and positional parameters to generate small snippets of HTML. + + Keyword parameters are converted to XML/SGML attributes, positional + arguments are used as children. Because Python accepts positional + arguments before keyword arguments it's a good idea to use a list with the + star-syntax for some children: + + >>> html.p(class_='foo', *[html.a('foo', href='foo.html'), ' ', + ... html.a('bar', href='bar.html')]) + u'

    foo bar

    ' + + This class works around some browser limitations and can not be used for + arbitrary SGML/XML generation. For that purpose lxml and similar + libraries exist. + + Calling the builder escapes the string passed: + + >>> html.p(html("")) + u'

    <foo>

    ' + """ + + _entity_re = re.compile(r"&([^;]+);") + _entities = name2codepoint.copy() + _entities["apos"] = 39 + _empty_elements = { + "area", + "base", + "basefont", + "br", + "col", + "command", + "embed", + "frame", + "hr", + "img", + "input", + "keygen", + "isindex", + "link", + "meta", + "param", + "source", + "wbr", + } + _boolean_attributes = { + "selected", + "checked", + "compact", + "declare", + "defer", + "disabled", + "ismap", + "multiple", + "nohref", + "noresize", + "noshade", + "nowrap", + } + _plaintext_elements = {"textarea"} + _c_like_cdata = {"script", "style"} + + def __init__(self, dialect): + self._dialect = dialect + + def __call__(self, s): + return escape(s) + + def __getattr__(self, tag): + if tag[:2] == "__": + raise AttributeError(tag) + + def proxy(*children, **arguments): + buffer = "<" + tag + for key, value in iteritems(arguments): + if value is None: + continue + if key[-1] == "_": + key = key[:-1] + if key in self._boolean_attributes: + if not value: + continue + if self._dialect == "xhtml": + value = '="' + key + '"' + else: + value = "" + else: + value = '="' + escape(value) + '"' + buffer += " " + key + value + if not children and tag in self._empty_elements: + if self._dialect == "xhtml": + buffer += " />" + else: + buffer += ">" + return buffer + buffer += ">" + + children_as_string = "".join( + [text_type(x) for x in children if x is not None] + ) + + if children_as_string: + if tag in self._plaintext_elements: + children_as_string = escape(children_as_string) + elif tag in self._c_like_cdata and self._dialect == "xhtml": + children_as_string = ( + "/**/" + ) + buffer += children_as_string + "" + return buffer + + return proxy + + def __repr__(self): + return "<%s for %r>" % (self.__class__.__name__, self._dialect) + + +html = HTMLBuilder("html") +xhtml = HTMLBuilder("xhtml") + +# https://cgit.freedesktop.org/xdg/shared-mime-info/tree/freedesktop.org.xml.in +# https://www.iana.org/assignments/media-types/media-types.xhtml +# Types listed in the XDG mime info that have a charset in the IANA registration. +_charset_mimetypes = { + "application/ecmascript", + "application/javascript", + "application/sql", + "application/xml", + "application/xml-dtd", + "application/xml-external-parsed-entity", +} + + +def get_content_type(mimetype, charset): + """Returns the full content type string with charset for a mimetype. + + If the mimetype represents text, the charset parameter will be + appended, otherwise the mimetype is returned unchanged. + + :param mimetype: The mimetype to be used as content type. + :param charset: The charset to be appended for text mimetypes. + :return: The content type. + + .. verionchanged:: 0.15 + Any type that ends with ``+xml`` gets a charset, not just those + that start with ``application/``. Known text types such as + ``application/javascript`` are also given charsets. + """ + if ( + mimetype.startswith("text/") + or mimetype in _charset_mimetypes + or mimetype.endswith("+xml") + ): + mimetype += "; charset=" + charset + + return mimetype + + +def detect_utf_encoding(data): + """Detect which UTF encoding was used to encode the given bytes. + + The latest JSON standard (:rfc:`8259`) suggests that only UTF-8 is + accepted. Older documents allowed 8, 16, or 32. 16 and 32 can be big + or little endian. Some editors or libraries may prepend a BOM. + + :internal: + + :param data: Bytes in unknown UTF encoding. + :return: UTF encoding name + + .. versionadded:: 0.15 + """ + head = data[:4] + + if head[:3] == codecs.BOM_UTF8: + return "utf-8-sig" + + if b"\x00" not in head: + return "utf-8" + + if head in (codecs.BOM_UTF32_BE, codecs.BOM_UTF32_LE): + return "utf-32" + + if head[:2] in (codecs.BOM_UTF16_BE, codecs.BOM_UTF16_LE): + return "utf-16" + + if len(head) == 4: + if head[:3] == b"\x00\x00\x00": + return "utf-32-be" + + if head[::2] == b"\x00\x00": + return "utf-16-be" + + if head[1:] == b"\x00\x00\x00": + return "utf-32-le" + + if head[1::2] == b"\x00\x00": + return "utf-16-le" + + if len(head) == 2: + return "utf-16-be" if head.startswith(b"\x00") else "utf-16-le" + + return "utf-8" + + +def format_string(string, context): + """String-template format a string: + + >>> format_string('$foo and ${foo}s', dict(foo=42)) + '42 and 42s' + + This does not do any attribute lookup etc. For more advanced string + formattings have a look at the `werkzeug.template` module. + + :param string: the format string. + :param context: a dict with the variables to insert. + """ + + def lookup_arg(match): + x = context[match.group(1) or match.group(2)] + if not isinstance(x, string_types): + x = type(string)(x) + return x + + return _format_re.sub(lookup_arg, string) + + +def secure_filename(filename): + r"""Pass it a filename and it will return a secure version of it. This + filename can then safely be stored on a regular file system and passed + to :func:`os.path.join`. The filename returned is an ASCII only string + for maximum portability. + + On windows systems the function also makes sure that the file is not + named after one of the special device files. + + >>> secure_filename("My cool movie.mov") + 'My_cool_movie.mov' + >>> secure_filename("../../../etc/passwd") + 'etc_passwd' + >>> secure_filename(u'i contain cool \xfcml\xe4uts.txt') + 'i_contain_cool_umlauts.txt' + + The function might return an empty filename. It's your responsibility + to ensure that the filename is unique and that you abort or + generate a random filename if the function returned an empty one. + + .. versionadded:: 0.5 + + :param filename: the filename to secure + """ + if isinstance(filename, text_type): + from unicodedata import normalize + + filename = normalize("NFKD", filename).encode("ascii", "ignore") + if not PY2: + filename = filename.decode("ascii") + for sep in os.path.sep, os.path.altsep: + if sep: + filename = filename.replace(sep, " ") + filename = str(_filename_ascii_strip_re.sub("", "_".join(filename.split()))).strip( + "._" + ) + + # on nt a couple of special files are present in each folder. We + # have to ensure that the target file is not such a filename. In + # this case we prepend an underline + if ( + os.name == "nt" + and filename + and filename.split(".")[0].upper() in _windows_device_files + ): + filename = "_" + filename + + return filename + + +def escape(s, quote=None): + """Replace special characters "&", "<", ">" and (") to HTML-safe sequences. + + There is a special handling for `None` which escapes to an empty string. + + .. versionchanged:: 0.9 + `quote` is now implicitly on. + + :param s: the string to escape. + :param quote: ignored. + """ + if s is None: + return "" + elif hasattr(s, "__html__"): + return text_type(s.__html__()) + elif not isinstance(s, string_types): + s = text_type(s) + if quote is not None: + from warnings import warn + + warn( + "The 'quote' parameter is no longer used as of version 0.9" + " and will be removed in version 1.0.", + DeprecationWarning, + stacklevel=2, + ) + s = ( + s.replace("&", "&") + .replace("<", "<") + .replace(">", ">") + .replace('"', """) + ) + return s + + +def unescape(s): + """The reverse function of `escape`. This unescapes all the HTML + entities, not only the XML entities inserted by `escape`. + + :param s: the string to unescape. + """ + + def handle_match(m): + name = m.group(1) + if name in HTMLBuilder._entities: + return unichr(HTMLBuilder._entities[name]) + try: + if name[:2] in ("#x", "#X"): + return unichr(int(name[2:], 16)) + elif name.startswith("#"): + return unichr(int(name[1:])) + except ValueError: + pass + return u"" + + return _entity_re.sub(handle_match, s) + + +def redirect(location, code=302, Response=None): + """Returns a response object (a WSGI application) that, if called, + redirects the client to the target location. Supported codes are + 301, 302, 303, 305, 307, and 308. 300 is not supported because + it's not a real redirect and 304 because it's the answer for a + request with a request with defined If-Modified-Since headers. + + .. versionadded:: 0.6 + The location can now be a unicode string that is encoded using + the :func:`iri_to_uri` function. + + .. versionadded:: 0.10 + The class used for the Response object can now be passed in. + + :param location: the location the response should redirect to. + :param code: the redirect status code. defaults to 302. + :param class Response: a Response class to use when instantiating a + response. The default is :class:`werkzeug.wrappers.Response` if + unspecified. + """ + if Response is None: + from .wrappers import Response + + display_location = escape(location) + if isinstance(location, text_type): + # Safe conversion is necessary here as we might redirect + # to a broken URI scheme (for instance itms-services). + from .urls import iri_to_uri + + location = iri_to_uri(location, safe_conversion=True) + response = Response( + '\n' + "Redirecting...\n" + "

    Redirecting...

    \n" + "

    You should be redirected automatically to target URL: " + '%s. If not click the link.' + % (escape(location), display_location), + code, + mimetype="text/html", + ) + response.headers["Location"] = location + return response + + +def append_slash_redirect(environ, code=301): + """Redirects to the same URL but with a slash appended. The behavior + of this function is undefined if the path ends with a slash already. + + :param environ: the WSGI environment for the request that triggers + the redirect. + :param code: the status code for the redirect. + """ + new_path = environ["PATH_INFO"].strip("/") + "/" + query_string = environ.get("QUERY_STRING") + if query_string: + new_path += "?" + query_string + return redirect(new_path, code) + + +def import_string(import_name, silent=False): + """Imports an object based on a string. This is useful if you want to + use import paths as endpoints or something similar. An import path can + be specified either in dotted notation (``xml.sax.saxutils.escape``) + or with a colon as object delimiter (``xml.sax.saxutils:escape``). + + If `silent` is True the return value will be `None` if the import fails. + + :param import_name: the dotted name for the object to import. + :param silent: if set to `True` import errors are ignored and + `None` is returned instead. + :return: imported object + """ + # force the import name to automatically convert to strings + # __import__ is not able to handle unicode strings in the fromlist + # if the module is a package + import_name = str(import_name).replace(":", ".") + try: + try: + __import__(import_name) + except ImportError: + if "." not in import_name: + raise + else: + return sys.modules[import_name] + + module_name, obj_name = import_name.rsplit(".", 1) + module = __import__(module_name, globals(), locals(), [obj_name]) + try: + return getattr(module, obj_name) + except AttributeError as e: + raise ImportError(e) + + except ImportError as e: + if not silent: + reraise( + ImportStringError, ImportStringError(import_name, e), sys.exc_info()[2] + ) + + +def find_modules(import_path, include_packages=False, recursive=False): + """Finds all the modules below a package. This can be useful to + automatically import all views / controllers so that their metaclasses / + function decorators have a chance to register themselves on the + application. + + Packages are not returned unless `include_packages` is `True`. This can + also recursively list modules but in that case it will import all the + packages to get the correct load path of that module. + + :param import_path: the dotted name for the package to find child modules. + :param include_packages: set to `True` if packages should be returned, too. + :param recursive: set to `True` if recursion should happen. + :return: generator + """ + module = import_string(import_path) + path = getattr(module, "__path__", None) + if path is None: + raise ValueError("%r is not a package" % import_path) + basename = module.__name__ + "." + for _importer, modname, ispkg in pkgutil.iter_modules(path): + modname = basename + modname + if ispkg: + if include_packages: + yield modname + if recursive: + for item in find_modules(modname, include_packages, True): + yield item + else: + yield modname + + +def validate_arguments(func, args, kwargs, drop_extra=True): + """Checks if the function accepts the arguments and keyword arguments. + Returns a new ``(args, kwargs)`` tuple that can safely be passed to + the function without causing a `TypeError` because the function signature + is incompatible. If `drop_extra` is set to `True` (which is the default) + any extra positional or keyword arguments are dropped automatically. + + The exception raised provides three attributes: + + `missing` + A set of argument names that the function expected but where + missing. + + `extra` + A dict of keyword arguments that the function can not handle but + where provided. + + `extra_positional` + A list of values that where given by positional argument but the + function cannot accept. + + This can be useful for decorators that forward user submitted data to + a view function:: + + from werkzeug.utils import ArgumentValidationError, validate_arguments + + def sanitize(f): + def proxy(request): + data = request.values.to_dict() + try: + args, kwargs = validate_arguments(f, (request,), data) + except ArgumentValidationError: + raise BadRequest('The browser failed to transmit all ' + 'the data expected.') + return f(*args, **kwargs) + return proxy + + :param func: the function the validation is performed against. + :param args: a tuple of positional arguments. + :param kwargs: a dict of keyword arguments. + :param drop_extra: set to `False` if you don't want extra arguments + to be silently dropped. + :return: tuple in the form ``(args, kwargs)``. + """ + parser = _parse_signature(func) + args, kwargs, missing, extra, extra_positional = parser(args, kwargs)[:5] + if missing: + raise ArgumentValidationError(tuple(missing)) + elif (extra or extra_positional) and not drop_extra: + raise ArgumentValidationError(None, extra, extra_positional) + return tuple(args), kwargs + + +def bind_arguments(func, args, kwargs): + """Bind the arguments provided into a dict. When passed a function, + a tuple of arguments and a dict of keyword arguments `bind_arguments` + returns a dict of names as the function would see it. This can be useful + to implement a cache decorator that uses the function arguments to build + the cache key based on the values of the arguments. + + :param func: the function the arguments should be bound for. + :param args: tuple of positional arguments. + :param kwargs: a dict of keyword arguments. + :return: a :class:`dict` of bound keyword arguments. + """ + ( + args, + kwargs, + missing, + extra, + extra_positional, + arg_spec, + vararg_var, + kwarg_var, + ) = _parse_signature(func)(args, kwargs) + values = {} + for (name, _has_default, _default), value in zip(arg_spec, args): + values[name] = value + if vararg_var is not None: + values[vararg_var] = tuple(extra_positional) + elif extra_positional: + raise TypeError("too many positional arguments") + if kwarg_var is not None: + multikw = set(extra) & set([x[0] for x in arg_spec]) + if multikw: + raise TypeError( + "got multiple values for keyword argument " + repr(next(iter(multikw))) + ) + values[kwarg_var] = extra + elif extra: + raise TypeError("got unexpected keyword argument " + repr(next(iter(extra)))) + return values + + +class ArgumentValidationError(ValueError): + + """Raised if :func:`validate_arguments` fails to validate""" + + def __init__(self, missing=None, extra=None, extra_positional=None): + self.missing = set(missing or ()) + self.extra = extra or {} + self.extra_positional = extra_positional or [] + ValueError.__init__( + self, + "function arguments invalid. (%d missing, %d additional)" + % (len(self.missing), len(self.extra) + len(self.extra_positional)), + ) + + +class ImportStringError(ImportError): + """Provides information about a failed :func:`import_string` attempt.""" + + #: String in dotted notation that failed to be imported. + import_name = None + #: Wrapped exception. + exception = None + + def __init__(self, import_name, exception): + self.import_name = import_name + self.exception = exception + + msg = ( + "import_string() failed for %r. Possible reasons are:\n\n" + "- missing __init__.py in a package;\n" + "- package or module path not included in sys.path;\n" + "- duplicated package or module name taking precedence in " + "sys.path;\n" + "- missing module, class, function or variable;\n\n" + "Debugged import:\n\n%s\n\n" + "Original exception:\n\n%s: %s" + ) + + name = "" + tracked = [] + for part in import_name.replace(":", ".").split("."): + name += (name and ".") + part + imported = import_string(name, silent=True) + if imported: + tracked.append((name, getattr(imported, "__file__", None))) + else: + track = ["- %r found in %r." % (n, i) for n, i in tracked] + track.append("- %r not found." % name) + msg = msg % ( + import_name, + "\n".join(track), + exception.__class__.__name__, + str(exception), + ) + break + + ImportError.__init__(self, msg) + + def __repr__(self): + return "<%s(%r, %r)>" % ( + self.__class__.__name__, + self.import_name, + self.exception, + ) + + +from werkzeug import _DeprecatedImportModule + +_DeprecatedImportModule( + __name__, + { + ".datastructures": [ + "CombinedMultiDict", + "EnvironHeaders", + "Headers", + "MultiDict", + ], + ".http": ["dump_cookie", "parse_cookie"], + }, + "Werkzeug 1.0", +) +del _DeprecatedImportModule diff --git a/env/Lib/site-packages/werkzeug/wrappers/__init__.py b/env/Lib/site-packages/werkzeug/wrappers/__init__.py new file mode 100644 index 0000000..56c764a --- /dev/null +++ b/env/Lib/site-packages/werkzeug/wrappers/__init__.py @@ -0,0 +1,36 @@ +""" +werkzeug.wrappers +~~~~~~~~~~~~~~~~~ + +The wrappers are simple request and response objects which you can +subclass to do whatever you want them to do. The request object contains +the information transmitted by the client (webbrowser) and the response +object contains all the information sent back to the browser. + +An important detail is that the request object is created with the WSGI +environ and will act as high-level proxy whereas the response object is an +actual WSGI application. + +Like everything else in Werkzeug these objects will work correctly with +unicode data. Incoming form data parsed by the response object will be +decoded into an unicode object if possible and if it makes sense. + +:copyright: 2007 Pallets +:license: BSD-3-Clause +""" +from .accept import AcceptMixin +from .auth import AuthorizationMixin +from .auth import WWWAuthenticateMixin +from .base_request import BaseRequest +from .base_response import BaseResponse +from .common_descriptors import CommonRequestDescriptorsMixin +from .common_descriptors import CommonResponseDescriptorsMixin +from .etag import ETagRequestMixin +from .etag import ETagResponseMixin +from .request import PlainRequest +from .request import Request +from .request import StreamOnlyMixin +from .response import Response +from .response import ResponseStream +from .response import ResponseStreamMixin +from .user_agent import UserAgentMixin diff --git a/env/Lib/site-packages/werkzeug/wrappers/__pycache__/__init__.cpython-37.pyc b/env/Lib/site-packages/werkzeug/wrappers/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7dfe5660284a05688ec40ad5fd7fed0bcb663e4d GIT binary patch literal 1665 zcmaJ>&2A$_5VjL1cE*3PliejqpgNL+qX;CBEQD|pgjQN$wGN6jJ80CN>3ACV&(Pgo z$9v#?cnYpOgRh+6zyoliy2mXq5n?R2zOKKn`l`CGy4|RT-|Juh`k^?e)qZ!I@a-Y^ z6948mT=H66%j@|buZz8SukP?Z-xrOz;c)};L44rx0Y4PYxasjBZ;7M$$m1rDL_2PK z+(O)mJ02hLuIR-*k0ZqWxbJbBAB#ae@VJ9`7!N(}B0h;vJnr#R@g#oYaUb#1_^HRo zh@ZvJJRb1(#94fXcsQ+{pO8PXuxLf~;w@dyFIJkACDkVS`SBM;w*`fu2cjt$CQ430 z)1Q{qSRgV-Y)T~!1vUGTX4b%}U|9icwS&-K48f~-kSS>ilO{q#VDesRK`c`etR~V3W-ZNOwsvtK^3-gwb(nnRMDHff> zirK=O+)clJ9#Q#*X)MEWxMG+C$&gS31)CQmjvR3)wR%`1WfTLr6Lv*x$#w@L$LP5v z99&qyW^$H!hA`O|Y(c^Cy|x9DbD$g>#U$KqyYGU&+d7xWO6di%t~GX(6y4SQe`x5LTO7D}_Xo~j@{y}P?}3T(e4kp_ADiWvH;ntF8ZRNHFsasR=! z5<`yIDiug|Q zb+B%|+Fno0vKMe=hLV$iOM+AHd%QW5Ig;Qd-=4p}X{KqevNYWs5>KOckK?96kSo29 zP&aUiJ2Rvy)fG<~-_u&$-HNIr^r4dtae9!hG~W@Wn=VKTmrVoj)Lb9Ay?dKC%@D8c zL>;$uoxBx>O!u6u@0Meyh_LNCB`$wGK*29Hedd&I`TO^GM>=_- zGQyKvD$1l}!k7pHiX M0bCmO&j0@Y0Y^s@ApigX literal 0 HcmV?d00001 diff --git a/env/Lib/site-packages/werkzeug/wrappers/__pycache__/accept.cpython-37.pyc b/env/Lib/site-packages/werkzeug/wrappers/__pycache__/accept.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..79609eee88dcb2d9b6636775c7b8c16a47909022 GIT binary patch literal 2194 zcmb_d%Wm676y-w{C0VwECg`RGI=fbj5ZR;)qbMRPietc5jaWfZmIXcLj3g#}WoBr{ zLeY)$A?>n1&}}#U3a$!t)lEO3tKJztBo!)*03Cs&I}gsBd+t4#hr7Ey4cfQA{`KAO zZB6?_4(iqd;|VmNXY!htLHI?0pTCwF?%C@3*Y`eCu9ciRZ z>~|WmY3J5-yQFij4Z43CaO^-Yc1H`$I2FSnpqYS)y%U_wb3CWbOz-sgbli;YXL7%f z)qa0LF`*1z+YfNCpv2Euno%Zh0yw^DCRk74;j*Kes}s#Ni0+!SMGRuT({6Rw0=q>l zWw*grm|@-qyFNM!8esyFlsXD;fxnJ_BexzpT)ew=F26>1^PrQJ@1evdMoL z`Vl<*1L%bIz4l7~5$O6!7v`-21Q^ToB;*36Gw?j7;wA%+#UkY3en=AmS7lks;NA+a z^zKf~t0>pFOK9?CcSo|}4@aZ%*>uoi762>kipRnP+L#0ldC=lCn*FS?9T@)o&FH{; z$tmOB^!(5pX4zAq$va5{9C=e3XI>U&55t5D;QV3oIh#N7-_E?RD^k6hUGJLV46=%Q zWjLJdrnpy{enY@MT*zfoYu57Pl7E#S&c8RlC)ICis)JG}{{zz-lG{S|{WY@v(evSp z^Knf&>wtr-E4xy_OjZ!ZcG>k|SnO9m*N{JiNiGAVS%$v+XbU^_&h6yfgE!an@K#q@ z_)AR+Z zaMClW@j4I-d`027C{163l$*mU&2MsWv6jpa*7+SzMqfQWo*WHKmDMYP2l`fS>%?my zej>?LiPzqmc+JM`-2Ruwu`C5O!BJI{w-WqbD&MT`tK@6ga~yO9QiCV}&&iw;^vHSK ztU|1g69jR(3e%j|J1bb%5GRZno#zo|>#y8dd&-Plp^-Tuo4XOJli}p(|{-1Qaoz{m4%T>l`JE@ pqO}krD=V>;i!kEq_M%;WbJQu@t}QxWlwN!(KQ-#^zFz&ze*gqNRr&w` literal 0 HcmV?d00001 diff --git a/env/Lib/site-packages/werkzeug/wrappers/__pycache__/auth.cpython-37.pyc b/env/Lib/site-packages/werkzeug/wrappers/__pycache__/auth.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..96e7ebc663e60e0a6e1f2db2fe3ae9584a4b0069 GIT binary patch literal 1681 zcmbW1&yU+g6vt<5C-H8RcDq!lsz9=kIHb}VPN<5ORnt~tE5R1gRFRC4Gk7K&w~lRQ zCQWOlz3dA3Gw6{6e?$KdUpaB%58%Xm<8?@u9uQ;A)BN(A@0<6Tx!3FM5-8uk{qwsY z9YTJ`PE(*y?m|_^U^wA4C36~3ifs$pR$!U7o!WCJa47kLaEG_f32%wknH{vD-{u|Y zcTB&--N&TA^M?iQ`n0-LFsVeu7J8P;q+~kDvuGw57ZPSatY??YrCA{|oy1Iwe->Pe zSv(UwDr8;=sb9w6bzN*|-G!uKjmApu@ z^0y)9%43-~U|P$;WJ~14YxeZ?jA>7bLJ9>674(H?g!5ew%5#=3gqKgv_+)FJiC2f} zF=dtx;*=>hn7m#J`K%O+Q=c=F@mery|zA`8TEzB^Eqc4E;V-bpy0Mj>RYygdS)m-W;hy(GJcz?{lWYt-r?i2jLSXqzXrm?}fvncmQ#QU*<7O z!;zR5VUZLENv1SQ(}V0YdHQMeVj7MwP9bcLBV0;WK%!NMx$ujZRc|XPT?`qCC3csV z-qvZEocdeKPx|f3jiQXrMHE%LQ8dr_BE@z$ihfwI^kSwHMLdtANTO?ro0zCJ%oQAK zfoVfE3S7sr%*g*n^2T^P#t0hfYbcLuC>tg(UyV&HbB_U*s>m}1{MD$eDM3P-sy>3w zPh<*=aO>QCMSre|v4I#1h(Ts7V8$swG0cFlgH2^?i~$?A1E|TdUlDnG1-QN;X3RQ-hX%H`Ps%-r^#JqN97wr$SxDciIyHDI*wOj= zoe13KocdI{uzQ_4%v!Yr56+^1dnRt7Hk>8&D&3_HE$_T51%BhJ(cvGa2(miz*RK98 zwr|UQ@GLuM@FZZsD8UnvJ81BxH2RD*jCkwedmmOPM2tAyHW2>tf6@n-%O3nAucEnz zW)Do|HZPdOS7L)^6e11M*P&%nhUB{xkj9adzFRpntqXJKO*B<&p_5dZ8&b7v*bM&W Xhj;m|+{6019U&X$+`AM$d$0F5+epK< literal 0 HcmV?d00001 diff --git a/env/Lib/site-packages/werkzeug/wrappers/__pycache__/base_request.cpython-37.pyc b/env/Lib/site-packages/werkzeug/wrappers/__pycache__/base_request.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ab2f11ca317a93abce1a40098c0613827255e5e7 GIT binary patch literal 22664 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

    EEmhmyN!U4^@2 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 I`FG_10+bI<0{{R3 literal 0 HcmV?d00001 diff --git a/env/Lib/site-packages/werkzeug/wrappers/__pycache__/base_response.cpython-37.pyc b/env/Lib/site-packages/werkzeug/wrappers/__pycache__/base_response.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1bd1ff2dd5d7b4c5d304e399b2eb1959357b6523 GIT binary patch literal 23298 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 b#vq*g!uq|AOBG`Gng2@FTJ=N~OY?sLQ@HGj literal 0 HcmV?d00001 diff --git a/env/Lib/site-packages/werkzeug/wrappers/__pycache__/common_descriptors.cpython-37.pyc b/env/Lib/site-packages/werkzeug/wrappers/__pycache__/common_descriptors.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..21206c7f6a44d0546317bc52f679ee99def8d68b GIT binary patch literal 12180 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 b-0h6a>+0o;56SIuowWwo`yKuYOF#K97mAnl literal 0 HcmV?d00001 diff --git a/env/Lib/site-packages/werkzeug/wrappers/__pycache__/json.cpython-37.pyc b/env/Lib/site-packages/werkzeug/wrappers/__pycache__/json.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6dbed7f0622353275cc2e29d86dc68c6acf51d74 GIT binary patch literal 4296 zcmbtX&2t+`6`!6NNu#msIN7jOR2di+*hE=JP8HMwf(jwdW;ei!E$omW45P8SWsN%acvH~(C>tiRJ__IMcFK~tZj;}&O$HDGPVXly5T+cy7B+u;s(6L(N*m$2vX zQc@mN+7&Y{C*Gjit}^SmW~lx4$|Eb?a4k_g@@1b{^fNoF?Ui3ysr}e`-{KYSy|B0^ z)}A})hV4>MLJBCacc!OVPf{l93i+JQ!wDx4y88jj9&Ubf}Mq0#yFp zi2p)-JQ7M{_68SPbagn=y-=jxjK}Fgm-x*d2ZK9k>J~a-wHdeCws1J(_6zGdYrCRE zI-7AB>m^<`;|i}pHZNZZf3oxQ)`uA%C8Eo~gC6=P#@lG>19aM&SehN$&uw{iVx2l? z)=shJ9+t3nU6&^~3~QAMz{kpM?SZa(R;>EZtxq8s4zydj7lwU3NW!qblKZiWQ>CM{ zD{_xVTIhHna+gMVHC9a-?r0SA+m<@6A|B>Yd&)OXNL>{CF;?K7JdV`pL=viZ#AB^qn{(3!9vo7kTN?s~bE`$`NW z8R<-_y8V)EzGTh3G8HYaD%e?gB#zZ?-6c{z-H~6yk$EX3ZSoQy4Th@jLFuysV|+Gq)mAk(yEQ1_p%{!8$gyP4;qv{?wV+ zXY9n%u%w9v#h6iywd!SA#XEUv|5ytp%QP-?0T&Q*!)zp3#7SzVWIzkv%t0xO6g>L57oV6X{wo9VSZSE9q zj4@2Zj6GiFl^0gKDtzJh?Dh)3#C^Wv`4qeEcj?5j4rOnjJV{)CnRL5OE{ej?!RX1cUgQ-~q_tn!$di`+k6@Y1D6aKAHJT3ewx#z)Q^t4umc! zf~T?W2h+F^MDk!X5UB?A^a?$Qr{0VjV^@i!w`AF5)VWI%+$NPxfUAtx<|fvltvNij zO~!5Dc?$zXIqL*&&)JbZ3?}T9Vj#0{OZ$j_f z9_WiGR;IW1KK6@XRVq`kLYQ5^Ii;Cr5<-;h%pgi(_P9ov5~800Jr{`^^~*Pl`ekN} zk5S10S-XV`Ep?-AU)1g5mdPX~<+Q1sl9JO!L9c{l5JVax4j4Py0a+n4vym9q?D57z z=KmzWzuTqsM-P>C)Qkdu!(igb4WoknWfH!+nC(C!i%A@dp!Ijyd+g{}04}&pxS~c$3Pc)I%l;t@JIxQ<;?M z{UsXjq&g{0ss+s>O4974{7Lz-g(7hMF-iLu>`!@2N`Tdg-o~wb^!jL8gf((5gtl`g z%`^CXnjxf3Bf$S105)+ztmgh8g&xUN1)WYSOGT%%6dxc9WdM|zK`)9EwK2 zW>TET28RSu@-#XIA9=h;SSCTu6`b->5HZ!wV2A#@Mc5_HkRwnkk-#${XGqLB7$uNi z5bziNKV@rt1zb^Y71EiUISuDXp;P53JF3yXqC!5^=QtB$OVJe`Xj}}nM=dnmxdA)( z-b<2rsA46*4WE$jqRUq(C{4=}Q(@%(F9~8(_vUZD`kv~35pYTd+IG1>#vE!&?I^e9 zlbnfm6_5|2B&1o`t`>BdUGRRn2~mEFrmmy2)~}$N@|kPbY@4m)=VI(4Xw_`r{BKZi zkFPAk!7Q7ci(wQFObEDwfrgu%A}gG+=M0|?^d04l|3wLm5zHLI_C}7+-|JW zYdSDWbj8v|8jpiX5{GPN1TcugSU0ET#On-pewB2?7o}(fl;CHn)D$d~OHGarWE3m0 z@WZBf)?F@`Fcm{e=Blyy0)%&xG14>s`hDYdWcEcFT$B)~*71SZ41Ra(q=k@O0(f~D z!r{AV7QugnwTpN71FZcXt;pBqv0-Kk!N#kts8x6F-`}mT$+wByHR|a4^GX<^Bnm@Q z!^-c|k~fqYzLoT`Y!KPpeC79O`d#YCge1wZB-f%ueg_*{Xo~7&uj;xmu4=93RXy9k zDQUNUndfVP0AG}4G}=98lBFDks^vts3e w`8YQoW#rGx1;mAdboi@e&b=QN1?6oj0M(o5YDnGmJ%}GXgT9y6ob|8$8{Bw&QUCw| literal 0 HcmV?d00001 diff --git a/env/Lib/site-packages/werkzeug/wrappers/__pycache__/request.cpython-37.pyc b/env/Lib/site-packages/werkzeug/wrappers/__pycache__/request.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..223586439fc26f100cd1cf1a0154f012c2c49084 GIT binary patch literal 1800 zcmah~&5q+l5Vm6{aS|spS_y#!NPUAyOthz!h!EP$E{l+0Kui#lH^}L@D@iZypY3i> zcIG-9com+4_wbby7ao8U)$Jr?vstj^O7&0ue^t5c_qz^0&wu~xr*YG9{xFN((?RAj ze(F~w%weu@Qa5s4!#6}D^&-#mp77IV)U>=WT4_6KTfQlRv=enK-xA%l7xi4{ONX^t z@QcF&Xo3qJ=z$0A`ydMOq{F&+(uMxL7Y%UTVzRx~RmP&q^W45~waE zFd}QONWORhi6%TP1f*z$XDg!DK$f`>`NphL6QUY-y9A#LGEM|lYCJ!Pe~z~$p*A68 z4U~Z-1(gb=kA#lnt0h6x6`>g;2~E&+l4n}xf~;{%ys6{$eAF6B%n_j`NrW3=RbWt9 zh$HiF7O56rYh4hE6?~h`|14asBeAvJhOeyQtD#>7ah%Z<;<)O@ahkJI7(R^Smn9Y3 zlXe`lJc;Aq9NEW0TJm@FWIQvWs@e4VayBW7r&QC~*Lgz4Yzk>HD|m5%h0#=qi|mnH zJ&a#1XFr1c`3}m}Y_n%1EefM%Tk%nGD+9D*`b#yC1ZQ@A8d&e)h1Y=<`OJ%&%twGV ztFvn@fu`SP;@0AoeuO~#YH2Wo7~>gP073&SqK*)!*IbbeM@%MI=v94ZLD%$#=hCJx zUlOi~&I#j+E(Gk0L+}LEraO?02$>pf+k48Gvl_-!YdM}Txd1i)gzT0mIw$6cFG>x{ zLeF~gqEwm`GQZ&r2t8DxY@7#DXoG69&Npy_&_m-?Z0Ifi+)yrzx1+jYMk9h36k?Gw z25dYg4@aL`&C_RB!IhBf&p&4gCHlbPc`qHeghUZnQoeyW)?}4v#M)`N^FOUY~zOQlB!h?Oq)w<`IL)Q@LApJpPLD-K0p$>``7Eb Ljs4pS&-?!XbRYRl literal 0 HcmV?d00001 diff --git a/env/Lib/site-packages/werkzeug/wrappers/__pycache__/response.cpython-37.pyc b/env/Lib/site-packages/werkzeug/wrappers/__pycache__/response.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..bd976518ec0bdf4b5c833432a66ae838af745c86 GIT binary patch literal 3311 zcma)8-Etc>6y87E8^?CjHWXSqASeu&lF%Et2n>^-w$Papm^Kh*>&`}5$@ZrES4nOX zPq-ny?ne*K6Dy+h)@U9j+ z_G-mWJ-67QH^Z8&1>fuJ0-J;PEN`%j?9y}N(1iV7hW*axttN^lwvU#^gD7;(bJ z7LzD^!b!Tl!vjSIk~6ZsPXGb36hu_YrLD;s^j5ZrO6vq3!85@npruD_r);03U0s)Y zy+uOqDZ)YllSlg`8^}JFBurGQm0+w!RL>PEF6cJcHkzUQII?X~D-G@4?VAC55g&YG zS%V_yKpdC{h7arl35Ws$*81JHmAmC!c{PYq*dz2gl1E(uJT?9_L<3&`K3ZGq{4BYU zosEa9os}%RO%?6jPXiitHh7$MvM^f+6RBtvEhJxw-YtKx+u7ve$&e3vo!xOo&21Y7ExPoaTO{D#*QIc%4FuD`8#ZM z$JznXF#8V(Cf%}*oCEVk*{U2>nZt}1mT9Qk0gM4qD(l1R_rCa%Aor;X(}cjk07kQ8 zqiuS%c%aZ5!`51wDDd#YeV+7GzwHW)^1S{FjRyRV5UJ20=5szzA3@I$I~X& z^*T|QaEa57{8u-JSI@FX>jikE;DhfmNfA3u&%y+29kAAb!V4jpUbv#&Lg0(UIgHZ? zXoa&Ey95I!=`xCm*SjCQgJy~gAkH(Z8$l@F0EJ^JPrF8|{BOf7aESc|UP36p(XwhN zsZ#r&plMYQ1$%~XP5G(Nny_wyI0)O3`2w7$EM+SP+dIagrQ-*PQ_-Xs7|gjX2XSu4 zG!w|#a}aYBkD|}v`!RPePuYYT6BZ$JblhY1)D~d$!s=ELanS;lskAD>LgfU4xV=T6wo?_4gbMu{BJEkhxT! zDo9^_4kr}piZs?qN%ccXV!SGl-7ty>9jG*hgB217B)uM2gpws-rC8c3(&82=F)3z* z*0T^&vYw3+eb_9d2@Hl*$wik295U`i$|PmFEb`(6Z^ow$Vyb{S1#5>lHz2KxQNkHd zK&U*q;wW(gr*QN+)T$O*U!wywvFzcsNj7VA7YnuZc2#@`s^SKUk5GJ!0!NBAinB=Z zDSY@6iVhegg}|N(5@3KVqYB31NfI!9oaAn46YYZP-2wQf%c+7a#g1_pU46nhi+GF| zzoe&;?xs8GEMEcMLiJ><&NonCj zeP7b3;q8i0#(;uZmI@#ma1?K3r`R(!*Xu8(g>}!U2-ATi-*0UEbmA6RQ15teXWfH~ z3G_f%+)UZO(ezIn&u^x%e}1+Y0&*ncy}Bw(%gU3{)6N&5zu{wFDl{UUM66 z;eJVAQNg}Tfxe0R#}`^D@Z8TG^n<8jwOY7X6Izo1gh5Z=8X+c6F)5fa6=mWV|~VIdSJNHjnbBc$V^_4;;gUpU`gcK2{%AsXjp zsCfVyp5j_68Xka(nLXQhq?w!9oBigSnLR%~?h=rXKmJ^Or-b~%U?%}MXQ1XO7)d0} z$dX2sqVHwi(vN&fUK8od;GW1p1sgvKWq3*Yt=}G8>C^h?y-|8JSGk4YBoWC%NnYxr zRNCGpkh2#byfaYq1dJjPl_c^cjeHeIPx|*{LjgPh@UVWkM}3>#ruq8kNJ_&5n^aJZ z3oJKb!djh9E323-m|ZBQ)lH?0WySPbC6=ugX|m`tkfg}1NOR+|N}-LC43U^aV#Un; znCfDMhjt+>1L*l&X-EWQ2eLyKNMx8~!kFRY>q_ZQYgNq$i09zUU{8Lsr7~z(!1$fu z7sq!2YH&N2d?D9#L!o!Nel&(wl1gi6@_^-_?`gbLw^jZ*)kO~T4vflX--vF*`QNLH zVT_ecJia`SM`ig+SP{P|5|PDYwJhT@El*(xR%F>}{#?(W@!MJaVaq?>H4?A1C}Ddh z#*Ug<56Zi``#*euypap>*N^wjx=pz;G?(7>TXl!?Tr3smb(iyHA*&4i9_Kfe$hLpl zoXaBNT;l`LM`*C01Jl6}-)abI(CGw$=T4wV` for more + details about customizing the behavior. + + Per default the request object will be added to the WSGI + environment as `werkzeug.request` to support the debugging system. + If you don't want that, set `populate_request` to `False`. + + If `shallow` is `True` the environment is initialized as shallow + object around the environ. Every operation that would modify the + environ in any way (such as consuming form data) raises an exception + unless the `shallow` attribute is explicitly set to `False`. This + is useful for middlewares where you don't want to consume the form + data by accident. A shallow request is not populated to the WSGI + environment. + + .. versionchanged:: 0.5 + read-only mode was enforced by using immutables classes for all + data. + """ + + #: the charset for the request, defaults to utf-8 + charset = "utf-8" + + #: the error handling procedure for errors, defaults to 'replace' + encoding_errors = "replace" + + #: the maximum content length. This is forwarded to the form data + #: parsing function (:func:`parse_form_data`). When set and the + #: :attr:`form` or :attr:`files` attribute is accessed and the + #: parsing fails because more than the specified value is transmitted + #: a :exc:`~werkzeug.exceptions.RequestEntityTooLarge` exception is raised. + #: + #: Have a look at :ref:`dealing-with-request-data` for more details. + #: + #: .. versionadded:: 0.5 + max_content_length = None + + #: the maximum form field size. This is forwarded to the form data + #: parsing function (:func:`parse_form_data`). When set and the + #: :attr:`form` or :attr:`files` attribute is accessed and the + #: data in memory for post data is longer than the specified value a + #: :exc:`~werkzeug.exceptions.RequestEntityTooLarge` exception is raised. + #: + #: Have a look at :ref:`dealing-with-request-data` for more details. + #: + #: .. versionadded:: 0.5 + max_form_memory_size = None + + #: the class to use for `args` and `form`. The default is an + #: :class:`~werkzeug.datastructures.ImmutableMultiDict` which supports + #: multiple values per key. alternatively it makes sense to use an + #: :class:`~werkzeug.datastructures.ImmutableOrderedMultiDict` which + #: preserves order or a :class:`~werkzeug.datastructures.ImmutableDict` + #: which is the fastest but only remembers the last key. It is also + #: possible to use mutable structures, but this is not recommended. + #: + #: .. versionadded:: 0.6 + parameter_storage_class = ImmutableMultiDict + + #: the type to be used for list values from the incoming WSGI environment. + #: By default an :class:`~werkzeug.datastructures.ImmutableList` is used + #: (for example for :attr:`access_list`). + #: + #: .. versionadded:: 0.6 + list_storage_class = ImmutableList + + #: the type to be used for dict values from the incoming WSGI environment. + #: By default an + #: :class:`~werkzeug.datastructures.ImmutableTypeConversionDict` is used + #: (for example for :attr:`cookies`). + #: + #: .. versionadded:: 0.6 + dict_storage_class = ImmutableTypeConversionDict + + #: The form data parser that shoud be used. Can be replaced to customize + #: the form date parsing. + form_data_parser_class = FormDataParser + + #: Optionally a list of hosts that is trusted by this request. By default + #: all hosts are trusted which means that whatever the client sends the + #: host is will be accepted. + #: + #: Because `Host` and `X-Forwarded-Host` headers can be set to any value by + #: a malicious client, it is recommended to either set this property or + #: implement similar validation in the proxy (if application is being run + #: behind one). + #: + #: .. versionadded:: 0.9 + trusted_hosts = None + + #: Indicates whether the data descriptor should be allowed to read and + #: buffer up the input stream. By default it's enabled. + #: + #: .. versionadded:: 0.9 + disable_data_descriptor = False + + def __init__(self, environ, populate_request=True, shallow=False): + self.environ = environ + if populate_request and not shallow: + self.environ["werkzeug.request"] = self + self.shallow = shallow + + def __repr__(self): + # make sure the __repr__ even works if the request was created + # from an invalid WSGI environment. If we display the request + # in a debug session we don't want the repr to blow up. + args = [] + try: + args.append("'%s'" % to_native(self.url, self.url_charset)) + args.append("[%s]" % self.method) + except Exception: + args.append("(invalid WSGI environ)") + + return "<%s %s>" % (self.__class__.__name__, " ".join(args)) + + @property + def url_charset(self): + """The charset that is assumed for URLs. Defaults to the value + of :attr:`charset`. + + .. versionadded:: 0.6 + """ + return self.charset + + @classmethod + def from_values(cls, *args, **kwargs): + """Create a new request object based on the values provided. If + environ is given missing values are filled from there. This method is + useful for small scripts when you need to simulate a request from an URL. + Do not use this method for unittesting, there is a full featured client + object (:class:`Client`) that allows to create multipart requests, + support for cookies etc. + + This accepts the same options as the + :class:`~werkzeug.test.EnvironBuilder`. + + .. versionchanged:: 0.5 + This method now accepts the same arguments as + :class:`~werkzeug.test.EnvironBuilder`. Because of this the + `environ` parameter is now called `environ_overrides`. + + :return: request object + """ + from ..test import EnvironBuilder + + charset = kwargs.pop("charset", cls.charset) + kwargs["charset"] = charset + builder = EnvironBuilder(*args, **kwargs) + try: + return builder.get_request(cls) + finally: + builder.close() + + @classmethod + def application(cls, f): + """Decorate a function as responder that accepts the request as + the last argument. This works like the :func:`responder` + decorator but the function is passed the request object as the + last argument and the request object will be closed + automatically:: + + @Request.application + def my_wsgi_app(request): + return Response('Hello World!') + + As of Werkzeug 0.14 HTTP exceptions are automatically caught and + converted to responses instead of failing. + + :param f: the WSGI callable to decorate + :return: a new WSGI callable + """ + #: return a callable that wraps the -2nd argument with the request + #: and calls the function with all the arguments up to that one and + #: the request. The return value is then called with the latest + #: two arguments. This makes it possible to use this decorator for + #: both standalone WSGI functions as well as bound methods and + #: partially applied functions. + from ..exceptions import HTTPException + + def application(*args): + request = cls(args[-2]) + with request: + try: + resp = f(*args[:-2] + (request,)) + except HTTPException as e: + resp = e.get_response(args[-2]) + return resp(*args[-2:]) + + return update_wrapper(application, f) + + def _get_file_stream( + self, total_content_length, content_type, filename=None, content_length=None + ): + """Called to get a stream for the file upload. + + This must provide a file-like class with `read()`, `readline()` + and `seek()` methods that is both writeable and readable. + + The default implementation returns a temporary file if the total + content length is higher than 500KB. Because many browsers do not + provide a content length for the files only the total content + length matters. + + :param total_content_length: the total content length of all the + data in the request combined. This value + is guaranteed to be there. + :param content_type: the mimetype of the uploaded file. + :param filename: the filename of the uploaded file. May be `None`. + :param content_length: the length of this file. This value is usually + not provided because webbrowsers do not provide + this value. + """ + return default_stream_factory( + total_content_length=total_content_length, + filename=filename, + content_type=content_type, + content_length=content_length, + ) + + @property + def want_form_data_parsed(self): + """Returns True if the request method carries content. As of + Werkzeug 0.9 this will be the case if a content type is transmitted. + + .. versionadded:: 0.8 + """ + return bool(self.environ.get("CONTENT_TYPE")) + + def make_form_data_parser(self): + """Creates the form data parser. Instantiates the + :attr:`form_data_parser_class` with some parameters. + + .. versionadded:: 0.8 + """ + return self.form_data_parser_class( + self._get_file_stream, + self.charset, + self.encoding_errors, + self.max_form_memory_size, + self.max_content_length, + self.parameter_storage_class, + ) + + def _load_form_data(self): + """Method used internally to retrieve submitted data. After calling + this sets `form` and `files` on the request object to multi dicts + filled with the incoming form data. As a matter of fact the input + stream will be empty afterwards. You can also call this method to + force the parsing of the form data. + + .. versionadded:: 0.8 + """ + # abort early if we have already consumed the stream + if "form" in self.__dict__: + return + + _assert_not_shallow(self) + + if self.want_form_data_parsed: + content_type = self.environ.get("CONTENT_TYPE", "") + content_length = get_content_length(self.environ) + mimetype, options = parse_options_header(content_type) + parser = self.make_form_data_parser() + data = parser.parse( + self._get_stream_for_parsing(), mimetype, content_length, options + ) + else: + data = ( + self.stream, + self.parameter_storage_class(), + self.parameter_storage_class(), + ) + + # inject the values into the instance dict so that we bypass + # our cached_property non-data descriptor. + d = self.__dict__ + d["stream"], d["form"], d["files"] = data + + def _get_stream_for_parsing(self): + """This is the same as accessing :attr:`stream` with the difference + that if it finds cached data from calling :meth:`get_data` first it + will create a new stream out of the cached data. + + .. versionadded:: 0.9.3 + """ + cached_data = getattr(self, "_cached_data", None) + if cached_data is not None: + return BytesIO(cached_data) + return self.stream + + def close(self): + """Closes associated resources of this request object. This + closes all file handles explicitly. You can also use the request + object in a with statement which will automatically close it. + + .. versionadded:: 0.9 + """ + files = self.__dict__.get("files") + for _key, value in iter_multi_items(files or ()): + value.close() + + def __enter__(self): + return self + + def __exit__(self, exc_type, exc_value, tb): + self.close() + + @cached_property + def stream(self): + """ + If the incoming form data was not encoded with a known mimetype + the data is stored unmodified in this stream for consumption. Most + of the time it is a better idea to use :attr:`data` which will give + you that data as a string. The stream only returns the data once. + + Unlike :attr:`input_stream` this stream is properly guarded that you + can't accidentally read past the length of the input. Werkzeug will + internally always refer to this stream to read data which makes it + possible to wrap this object with a stream that does filtering. + + .. versionchanged:: 0.9 + This stream is now always available but might be consumed by the + form parser later on. Previously the stream was only set if no + parsing happened. + """ + _assert_not_shallow(self) + return get_input_stream(self.environ) + + input_stream = environ_property( + "wsgi.input", + """The WSGI input stream. + + In general it's a bad idea to use this one because you can + easily read past the boundary. Use the :attr:`stream` + instead.""", + ) + + @cached_property + def args(self): + """The parsed URL parameters (the part in the URL after the question + mark). + + By default an + :class:`~werkzeug.datastructures.ImmutableMultiDict` + is returned from this function. This can be changed by setting + :attr:`parameter_storage_class` to a different type. This might + be necessary if the order of the form data is important. + """ + return url_decode( + wsgi_get_bytes(self.environ.get("QUERY_STRING", "")), + self.url_charset, + errors=self.encoding_errors, + cls=self.parameter_storage_class, + ) + + @cached_property + def data(self): + """ + Contains the incoming request data as string in case it came with + a mimetype Werkzeug does not handle. + """ + + if self.disable_data_descriptor: + raise AttributeError("data descriptor is disabled") + # XXX: this should eventually be deprecated. + + # We trigger form data parsing first which means that the descriptor + # will not cache the data that would otherwise be .form or .files + # data. This restores the behavior that was there in Werkzeug + # before 0.9. New code should use :meth:`get_data` explicitly as + # this will make behavior explicit. + return self.get_data(parse_form_data=True) + + def get_data(self, cache=True, as_text=False, parse_form_data=False): + """This reads the buffered incoming data from the client into one + bytestring. By default this is cached but that behavior can be + changed by setting `cache` to `False`. + + Usually it's a bad idea to call this method without checking the + content length first as a client could send dozens of megabytes or more + to cause memory problems on the server. + + Note that if the form data was already parsed this method will not + return anything as form data parsing does not cache the data like + this method does. To implicitly invoke form data parsing function + set `parse_form_data` to `True`. When this is done the return value + of this method will be an empty string if the form parser handles + the data. This generally is not necessary as if the whole data is + cached (which is the default) the form parser will used the cached + data to parse the form data. Please be generally aware of checking + the content length first in any case before calling this method + to avoid exhausting server memory. + + If `as_text` is set to `True` the return value will be a decoded + unicode string. + + .. versionadded:: 0.9 + """ + rv = getattr(self, "_cached_data", None) + if rv is None: + if parse_form_data: + self._load_form_data() + rv = self.stream.read() + if cache: + self._cached_data = rv + if as_text: + rv = rv.decode(self.charset, self.encoding_errors) + return rv + + @cached_property + def form(self): + """The form parameters. By default an + :class:`~werkzeug.datastructures.ImmutableMultiDict` + is returned from this function. This can be changed by setting + :attr:`parameter_storage_class` to a different type. This might + be necessary if the order of the form data is important. + + Please keep in mind that file uploads will not end up here, but instead + in the :attr:`files` attribute. + + .. versionchanged:: 0.9 + + Previous to Werkzeug 0.9 this would only contain form data for POST + and PUT requests. + """ + self._load_form_data() + return self.form + + @cached_property + def values(self): + """A :class:`werkzeug.datastructures.CombinedMultiDict` that combines + :attr:`args` and :attr:`form`.""" + args = [] + for d in self.args, self.form: + if not isinstance(d, MultiDict): + d = MultiDict(d) + args.append(d) + return CombinedMultiDict(args) + + @cached_property + def files(self): + """:class:`~werkzeug.datastructures.MultiDict` object containing + all uploaded files. Each key in :attr:`files` is the name from the + ````. Each value in :attr:`files` is a + Werkzeug :class:`~werkzeug.datastructures.FileStorage` object. + + It basically behaves like a standard file object you know from Python, + with the difference that it also has a + :meth:`~werkzeug.datastructures.FileStorage.save` function that can + store the file on the filesystem. + + Note that :attr:`files` will only contain data if the request method was + POST, PUT or PATCH and the ``
    `` that posted to the request had + ``enctype="multipart/form-data"``. It will be empty otherwise. + + See the :class:`~werkzeug.datastructures.MultiDict` / + :class:`~werkzeug.datastructures.FileStorage` documentation for + more details about the used data structure. + """ + self._load_form_data() + return self.files + + @cached_property + def cookies(self): + """A :class:`dict` with the contents of all cookies transmitted with + the request.""" + return parse_cookie( + self.environ, + self.charset, + self.encoding_errors, + cls=self.dict_storage_class, + ) + + @cached_property + def headers(self): + """The headers from the WSGI environ as immutable + :class:`~werkzeug.datastructures.EnvironHeaders`. + """ + return EnvironHeaders(self.environ) + + @cached_property + def path(self): + """Requested path as unicode. This works a bit like the regular path + info in the WSGI environment but will always include a leading slash, + even if the URL root is accessed. + """ + raw_path = wsgi_decoding_dance( + self.environ.get("PATH_INFO") or "", self.charset, self.encoding_errors + ) + return "/" + raw_path.lstrip("/") + + @cached_property + def full_path(self): + """Requested path as unicode, including the query string.""" + return self.path + u"?" + to_unicode(self.query_string, self.url_charset) + + @cached_property + def script_root(self): + """The root path of the script without the trailing slash.""" + raw_path = wsgi_decoding_dance( + self.environ.get("SCRIPT_NAME") or "", self.charset, self.encoding_errors + ) + return raw_path.rstrip("/") + + @cached_property + def url(self): + """The reconstructed current URL as IRI. + See also: :attr:`trusted_hosts`. + """ + return get_current_url(self.environ, trusted_hosts=self.trusted_hosts) + + @cached_property + def base_url(self): + """Like :attr:`url` but without the querystring + See also: :attr:`trusted_hosts`. + """ + return get_current_url( + self.environ, strip_querystring=True, trusted_hosts=self.trusted_hosts + ) + + @cached_property + def url_root(self): + """The full URL root (with hostname), this is the application + root as IRI. + See also: :attr:`trusted_hosts`. + """ + return get_current_url(self.environ, True, trusted_hosts=self.trusted_hosts) + + @cached_property + def host_url(self): + """Just the host with scheme as IRI. + See also: :attr:`trusted_hosts`. + """ + return get_current_url( + self.environ, host_only=True, trusted_hosts=self.trusted_hosts + ) + + @cached_property + def host(self): + """Just the host including the port if available. + See also: :attr:`trusted_hosts`. + """ + return get_host(self.environ, trusted_hosts=self.trusted_hosts) + + query_string = environ_property( + "QUERY_STRING", + "", + read_only=True, + load_func=wsgi_get_bytes, + doc="The URL parameters as raw bytestring.", + ) + method = environ_property( + "REQUEST_METHOD", + "GET", + read_only=True, + load_func=lambda x: x.upper(), + doc="The request method. (For example ``'GET'`` or ``'POST'``).", + ) + + @cached_property + def access_route(self): + """If a forwarded header exists this is a list of all ip addresses + from the client ip to the last proxy server. + """ + if "HTTP_X_FORWARDED_FOR" in self.environ: + addr = self.environ["HTTP_X_FORWARDED_FOR"].split(",") + return self.list_storage_class([x.strip() for x in addr]) + elif "REMOTE_ADDR" in self.environ: + return self.list_storage_class([self.environ["REMOTE_ADDR"]]) + return self.list_storage_class() + + @property + def remote_addr(self): + """The remote address of the client.""" + return self.environ.get("REMOTE_ADDR") + + remote_user = environ_property( + "REMOTE_USER", + doc="""If the server supports user authentication, and the + script is protected, this attribute contains the username the + user has authenticated as.""", + ) + + scheme = environ_property( + "wsgi.url_scheme", + doc=""" + URL scheme (http or https). + + .. versionadded:: 0.7""", + ) + + @property + def is_xhr(self): + """True if the request was triggered via a JavaScript XMLHttpRequest. + This only works with libraries that support the ``X-Requested-With`` + header and set it to "XMLHttpRequest". Libraries that do that are + prototype, jQuery and Mochikit and probably some more. + + .. deprecated:: 0.13 + ``X-Requested-With`` is not standard and is unreliable. You + may be able to use :attr:`AcceptMixin.accept_mimetypes` + instead. + """ + warnings.warn( + "'Request.is_xhr' is deprecated as of version 0.13 and will" + " be removed in version 1.0. The 'X-Requested-With' header" + " is not standard and is unreliable. You may be able to use" + " 'accept_mimetypes' instead.", + DeprecationWarning, + stacklevel=2, + ) + return self.environ.get("HTTP_X_REQUESTED_WITH", "").lower() == "xmlhttprequest" + + is_secure = property( + lambda self: self.environ["wsgi.url_scheme"] == "https", + doc="`True` if the request is secure.", + ) + is_multithread = environ_property( + "wsgi.multithread", + doc="""boolean that is `True` if the application is served by a + multithreaded WSGI server.""", + ) + is_multiprocess = environ_property( + "wsgi.multiprocess", + doc="""boolean that is `True` if the application is served by a + WSGI server that spawns multiple processes.""", + ) + is_run_once = environ_property( + "wsgi.run_once", + doc="""boolean that is `True` if the application will be + executed only once in a process lifetime. This is the case for + CGI for example, but it's not guaranteed that the execution only + happens one time.""", + ) + + +def _assert_not_shallow(request): + if request.shallow: + raise RuntimeError( + "A shallow request tried to consume form data. If you really" + " want to do that, set `shallow` to False." + ) diff --git a/env/Lib/site-packages/werkzeug/wrappers/base_response.py b/env/Lib/site-packages/werkzeug/wrappers/base_response.py new file mode 100644 index 0000000..d944a7d --- /dev/null +++ b/env/Lib/site-packages/werkzeug/wrappers/base_response.py @@ -0,0 +1,702 @@ +import warnings + +from .._compat import integer_types +from .._compat import string_types +from .._compat import text_type +from .._compat import to_bytes +from .._compat import to_native +from ..datastructures import Headers +from ..http import dump_cookie +from ..http import HTTP_STATUS_CODES +from ..http import remove_entity_headers +from ..urls import iri_to_uri +from ..urls import url_join +from ..utils import get_content_type +from ..wsgi import ClosingIterator +from ..wsgi import get_current_url + + +def _run_wsgi_app(*args): + """This function replaces itself to ensure that the test module is not + imported unless required. DO NOT USE! + """ + global _run_wsgi_app + from ..test import run_wsgi_app as _run_wsgi_app + + return _run_wsgi_app(*args) + + +def _warn_if_string(iterable): + """Helper for the response objects to check if the iterable returned + to the WSGI server is not a string. + """ + if isinstance(iterable, string_types): + warnings.warn( + "Response iterable was set to a string. This will appear to" + " work but means that the server will send the data to the" + " client one character at a time. This is almost never" + " intended behavior, use 'response.data' to assign strings" + " to the response object.", + stacklevel=2, + ) + + +def _iter_encoded(iterable, charset): + for item in iterable: + if isinstance(item, text_type): + yield item.encode(charset) + else: + yield item + + +def _clean_accept_ranges(accept_ranges): + if accept_ranges is True: + return "bytes" + elif accept_ranges is False: + return "none" + elif isinstance(accept_ranges, text_type): + return to_native(accept_ranges) + raise ValueError("Invalid accept_ranges value") + + +class BaseResponse(object): + """Base response class. The most important fact about a response object + is that it's a regular WSGI application. It's initialized with a couple + of response parameters (headers, body, status code etc.) and will start a + valid WSGI response when called with the environ and start response + callable. + + Because it's a WSGI application itself processing usually ends before the + actual response is sent to the server. This helps debugging systems + because they can catch all the exceptions before responses are started. + + Here a small example WSGI application that takes advantage of the + response objects:: + + from werkzeug.wrappers import BaseResponse as Response + + def index(): + return Response('Index page') + + def application(environ, start_response): + path = environ.get('PATH_INFO') or '/' + if path == '/': + response = index() + else: + response = Response('Not Found', status=404) + return response(environ, start_response) + + Like :class:`BaseRequest` which object is lacking a lot of functionality + implemented in mixins. This gives you a better control about the actual + API of your response objects, so you can create subclasses and add custom + functionality. A full featured response object is available as + :class:`Response` which implements a couple of useful mixins. + + To enforce a new type of already existing responses you can use the + :meth:`force_type` method. This is useful if you're working with different + subclasses of response objects and you want to post process them with a + known interface. + + Per default the response object will assume all the text data is `utf-8` + encoded. Please refer to :doc:`the unicode chapter ` for more + details about customizing the behavior. + + Response can be any kind of iterable or string. If it's a string it's + considered being an iterable with one item which is the string passed. + Headers can be a list of tuples or a + :class:`~werkzeug.datastructures.Headers` object. + + Special note for `mimetype` and `content_type`: For most mime types + `mimetype` and `content_type` work the same, the difference affects + only 'text' mimetypes. If the mimetype passed with `mimetype` is a + mimetype starting with `text/`, the charset parameter of the response + object is appended to it. In contrast the `content_type` parameter is + always added as header unmodified. + + .. versionchanged:: 0.5 + the `direct_passthrough` parameter was added. + + :param response: a string or response iterable. + :param status: a string with a status or an integer with the status code. + :param headers: a list of headers or a + :class:`~werkzeug.datastructures.Headers` object. + :param mimetype: the mimetype for the response. See notice above. + :param content_type: the content type for the response. See notice above. + :param direct_passthrough: if set to `True` :meth:`iter_encoded` is not + called before iteration which makes it + possible to pass special iterators through + unchanged (see :func:`wrap_file` for more + details.) + """ + + #: the charset of the response. + charset = "utf-8" + + #: the default status if none is provided. + default_status = 200 + + #: the default mimetype if none is provided. + default_mimetype = "text/plain" + + #: if set to `False` accessing properties on the response object will + #: not try to consume the response iterator and convert it into a list. + #: + #: .. versionadded:: 0.6.2 + #: + #: That attribute was previously called `implicit_seqence_conversion`. + #: (Notice the typo). If you did use this feature, you have to adapt + #: your code to the name change. + implicit_sequence_conversion = True + + #: Should this response object correct the location header to be RFC + #: conformant? This is true by default. + #: + #: .. versionadded:: 0.8 + autocorrect_location_header = True + + #: Should this response object automatically set the content-length + #: header if possible? This is true by default. + #: + #: .. versionadded:: 0.8 + automatically_set_content_length = True + + #: Warn if a cookie header exceeds this size. The default, 4093, should be + #: safely `supported by most browsers `_. A cookie larger than + #: this size will still be sent, but it may be ignored or handled + #: incorrectly by some browsers. Set to 0 to disable this check. + #: + #: .. versionadded:: 0.13 + #: + #: .. _`cookie`: http://browsercookielimits.squawky.net/ + max_cookie_size = 4093 + + def __init__( + self, + response=None, + status=None, + headers=None, + mimetype=None, + content_type=None, + direct_passthrough=False, + ): + if isinstance(headers, Headers): + self.headers = headers + elif not headers: + self.headers = Headers() + else: + self.headers = Headers(headers) + + if content_type is None: + if mimetype is None and "content-type" not in self.headers: + mimetype = self.default_mimetype + if mimetype is not None: + mimetype = get_content_type(mimetype, self.charset) + content_type = mimetype + if content_type is not None: + self.headers["Content-Type"] = content_type + if status is None: + status = self.default_status + if isinstance(status, integer_types): + self.status_code = status + else: + self.status = status + + self.direct_passthrough = direct_passthrough + self._on_close = [] + + # we set the response after the headers so that if a class changes + # the charset attribute, the data is set in the correct charset. + if response is None: + self.response = [] + elif isinstance(response, (text_type, bytes, bytearray)): + self.set_data(response) + else: + self.response = response + + def call_on_close(self, func): + """Adds a function to the internal list of functions that should + be called as part of closing down the response. Since 0.7 this + function also returns the function that was passed so that this + can be used as a decorator. + + .. versionadded:: 0.6 + """ + self._on_close.append(func) + return func + + def __repr__(self): + if self.is_sequence: + body_info = "%d bytes" % sum(map(len, self.iter_encoded())) + else: + body_info = "streamed" if self.is_streamed else "likely-streamed" + return "<%s %s [%s]>" % (self.__class__.__name__, body_info, self.status) + + @classmethod + def force_type(cls, response, environ=None): + """Enforce that the WSGI response is a response object of the current + type. Werkzeug will use the :class:`BaseResponse` internally in many + situations like the exceptions. If you call :meth:`get_response` on an + exception you will get back a regular :class:`BaseResponse` object, even + if you are using a custom subclass. + + This method can enforce a given response type, and it will also + convert arbitrary WSGI callables into response objects if an environ + is provided:: + + # convert a Werkzeug response object into an instance of the + # MyResponseClass subclass. + response = MyResponseClass.force_type(response) + + # convert any WSGI application into a response object + response = MyResponseClass.force_type(response, environ) + + This is especially useful if you want to post-process responses in + the main dispatcher and use functionality provided by your subclass. + + Keep in mind that this will modify response objects in place if + possible! + + :param response: a response object or wsgi application. + :param environ: a WSGI environment object. + :return: a response object. + """ + if not isinstance(response, BaseResponse): + if environ is None: + raise TypeError( + "cannot convert WSGI application into response" + " objects without an environ" + ) + response = BaseResponse(*_run_wsgi_app(response, environ)) + response.__class__ = cls + return response + + @classmethod + def from_app(cls, app, environ, buffered=False): + """Create a new response object from an application output. This + works best if you pass it an application that returns a generator all + the time. Sometimes applications may use the `write()` callable + returned by the `start_response` function. This tries to resolve such + edge cases automatically. But if you don't get the expected output + you should set `buffered` to `True` which enforces buffering. + + :param app: the WSGI application to execute. + :param environ: the WSGI environment to execute against. + :param buffered: set to `True` to enforce buffering. + :return: a response object. + """ + return cls(*_run_wsgi_app(app, environ, buffered)) + + def _get_status_code(self): + return self._status_code + + def _set_status_code(self, code): + self._status_code = code + try: + self._status = "%d %s" % (code, HTTP_STATUS_CODES[code].upper()) + except KeyError: + self._status = "%d UNKNOWN" % code + + status_code = property( + _get_status_code, _set_status_code, doc="The HTTP Status code as number" + ) + del _get_status_code, _set_status_code + + def _get_status(self): + return self._status + + def _set_status(self, value): + try: + self._status = to_native(value) + except AttributeError: + raise TypeError("Invalid status argument") + + try: + self._status_code = int(self._status.split(None, 1)[0]) + except ValueError: + self._status_code = 0 + self._status = "0 %s" % self._status + except IndexError: + raise ValueError("Empty status argument") + + status = property(_get_status, _set_status, doc="The HTTP Status code") + del _get_status, _set_status + + def get_data(self, as_text=False): + """The string representation of the request body. Whenever you call + this property the request iterable is encoded and flattened. This + can lead to unwanted behavior if you stream big data. + + This behavior can be disabled by setting + :attr:`implicit_sequence_conversion` to `False`. + + If `as_text` is set to `True` the return value will be a decoded + unicode string. + + .. versionadded:: 0.9 + """ + self._ensure_sequence() + rv = b"".join(self.iter_encoded()) + if as_text: + rv = rv.decode(self.charset) + return rv + + def set_data(self, value): + """Sets a new string as response. The value set must either by a + unicode or bytestring. If a unicode string is set it's encoded + automatically to the charset of the response (utf-8 by default). + + .. versionadded:: 0.9 + """ + # if an unicode string is set, it's encoded directly so that we + # can set the content length + if isinstance(value, text_type): + value = value.encode(self.charset) + else: + value = bytes(value) + self.response = [value] + if self.automatically_set_content_length: + self.headers["Content-Length"] = str(len(value)) + + data = property( + get_data, + set_data, + doc="A descriptor that calls :meth:`get_data` and :meth:`set_data`.", + ) + + def calculate_content_length(self): + """Returns the content length if available or `None` otherwise.""" + try: + self._ensure_sequence() + except RuntimeError: + return None + return sum(len(x) for x in self.iter_encoded()) + + def _ensure_sequence(self, mutable=False): + """This method can be called by methods that need a sequence. If + `mutable` is true, it will also ensure that the response sequence + is a standard Python list. + + .. versionadded:: 0.6 + """ + if self.is_sequence: + # if we need a mutable object, we ensure it's a list. + if mutable and not isinstance(self.response, list): + self.response = list(self.response) + return + if self.direct_passthrough: + raise RuntimeError( + "Attempted implicit sequence conversion but the" + " response object is in direct passthrough mode." + ) + if not self.implicit_sequence_conversion: + raise RuntimeError( + "The response object required the iterable to be a" + " sequence, but the implicit conversion was disabled." + " Call make_sequence() yourself." + ) + self.make_sequence() + + def make_sequence(self): + """Converts the response iterator in a list. By default this happens + automatically if required. If `implicit_sequence_conversion` is + disabled, this method is not automatically called and some properties + might raise exceptions. This also encodes all the items. + + .. versionadded:: 0.6 + """ + if not self.is_sequence: + # if we consume an iterable we have to ensure that the close + # method of the iterable is called if available when we tear + # down the response + close = getattr(self.response, "close", None) + self.response = list(self.iter_encoded()) + if close is not None: + self.call_on_close(close) + + def iter_encoded(self): + """Iter the response encoded with the encoding of the response. + If the response object is invoked as WSGI application the return + value of this method is used as application iterator unless + :attr:`direct_passthrough` was activated. + """ + if __debug__: + _warn_if_string(self.response) + # Encode in a separate function so that self.response is fetched + # early. This allows us to wrap the response with the return + # value from get_app_iter or iter_encoded. + return _iter_encoded(self.response, self.charset) + + def set_cookie( + self, + key, + value="", + max_age=None, + expires=None, + path="/", + domain=None, + secure=False, + httponly=False, + samesite=None, + ): + """Sets a cookie. The parameters are the same as in the cookie `Morsel` + object in the Python standard library but it accepts unicode data, too. + + A warning is raised if the size of the cookie header exceeds + :attr:`max_cookie_size`, but the header will still be set. + + :param key: the key (name) of the cookie to be set. + :param value: the value of the cookie. + :param max_age: should be a number of seconds, or `None` (default) if + the cookie should last only as long as the client's + browser session. + :param expires: should be a `datetime` object or UNIX timestamp. + :param path: limits the cookie to a given path, per default it will + span the whole domain. + :param domain: if you want to set a cross-domain cookie. For example, + ``domain=".example.com"`` will set a cookie that is + readable by the domain ``www.example.com``, + ``foo.example.com`` etc. Otherwise, a cookie will only + be readable by the domain that set it. + :param secure: If `True`, the cookie will only be available via HTTPS + :param httponly: disallow JavaScript to access the cookie. This is an + extension to the cookie standard and probably not + supported by all browsers. + :param samesite: Limits the scope of the cookie such that it will only + be attached to requests if those requests are + "same-site". + """ + self.headers.add( + "Set-Cookie", + dump_cookie( + key, + value=value, + max_age=max_age, + expires=expires, + path=path, + domain=domain, + secure=secure, + httponly=httponly, + charset=self.charset, + max_size=self.max_cookie_size, + samesite=samesite, + ), + ) + + def delete_cookie(self, key, path="/", domain=None): + """Delete a cookie. Fails silently if key doesn't exist. + + :param key: the key (name) of the cookie to be deleted. + :param path: if the cookie that should be deleted was limited to a + path, the path has to be defined here. + :param domain: if the cookie that should be deleted was limited to a + domain, that domain has to be defined here. + """ + self.set_cookie(key, expires=0, max_age=0, path=path, domain=domain) + + @property + def is_streamed(self): + """If the response is streamed (the response is not an iterable with + a length information) this property is `True`. In this case streamed + means that there is no information about the number of iterations. + This is usually `True` if a generator is passed to the response object. + + This is useful for checking before applying some sort of post + filtering that should not take place for streamed responses. + """ + try: + len(self.response) + except (TypeError, AttributeError): + return True + return False + + @property + def is_sequence(self): + """If the iterator is buffered, this property will be `True`. A + response object will consider an iterator to be buffered if the + response attribute is a list or tuple. + + .. versionadded:: 0.6 + """ + return isinstance(self.response, (tuple, list)) + + def close(self): + """Close the wrapped response if possible. You can also use the object + in a with statement which will automatically close it. + + .. versionadded:: 0.9 + Can now be used in a with statement. + """ + if hasattr(self.response, "close"): + self.response.close() + for func in self._on_close: + func() + + def __enter__(self): + return self + + def __exit__(self, exc_type, exc_value, tb): + self.close() + + def freeze(self): + """Call this method if you want to make your response object ready for + being pickled. This buffers the generator if there is one. It will + also set the `Content-Length` header to the length of the body. + + .. versionchanged:: 0.6 + The `Content-Length` header is now set. + """ + # we explicitly set the length to a list of the *encoded* response + # iterator. Even if the implicit sequence conversion is disabled. + self.response = list(self.iter_encoded()) + self.headers["Content-Length"] = str(sum(map(len, self.response))) + + def get_wsgi_headers(self, environ): + """This is automatically called right before the response is started + and returns headers modified for the given environment. It returns a + copy of the headers from the response with some modifications applied + if necessary. + + For example the location header (if present) is joined with the root + URL of the environment. Also the content length is automatically set + to zero here for certain status codes. + + .. versionchanged:: 0.6 + Previously that function was called `fix_headers` and modified + the response object in place. Also since 0.6, IRIs in location + and content-location headers are handled properly. + + Also starting with 0.6, Werkzeug will attempt to set the content + length if it is able to figure it out on its own. This is the + case if all the strings in the response iterable are already + encoded and the iterable is buffered. + + :param environ: the WSGI environment of the request. + :return: returns a new :class:`~werkzeug.datastructures.Headers` + object. + """ + headers = Headers(self.headers) + location = None + content_location = None + content_length = None + status = self.status_code + + # iterate over the headers to find all values in one go. Because + # get_wsgi_headers is used each response that gives us a tiny + # speedup. + for key, value in headers: + ikey = key.lower() + if ikey == u"location": + location = value + elif ikey == u"content-location": + content_location = value + elif ikey == u"content-length": + content_length = value + + # make sure the location header is an absolute URL + if location is not None: + old_location = location + if isinstance(location, text_type): + # Safe conversion is necessary here as we might redirect + # to a broken URI scheme (for instance itms-services). + location = iri_to_uri(location, safe_conversion=True) + + if self.autocorrect_location_header: + current_url = get_current_url(environ, strip_querystring=True) + if isinstance(current_url, text_type): + current_url = iri_to_uri(current_url) + location = url_join(current_url, location) + if location != old_location: + headers["Location"] = location + + # make sure the content location is a URL + if content_location is not None and isinstance(content_location, text_type): + headers["Content-Location"] = iri_to_uri(content_location) + + if 100 <= status < 200 or status == 204: + # Per section 3.3.2 of RFC 7230, "a server MUST NOT send a + # Content-Length header field in any response with a status + # code of 1xx (Informational) or 204 (No Content)." + headers.remove("Content-Length") + elif status == 304: + remove_entity_headers(headers) + + # if we can determine the content length automatically, we + # should try to do that. But only if this does not involve + # flattening the iterator or encoding of unicode strings in + # the response. We however should not do that if we have a 304 + # response. + if ( + self.automatically_set_content_length + and self.is_sequence + and content_length is None + and status not in (204, 304) + and not (100 <= status < 200) + ): + try: + content_length = sum(len(to_bytes(x, "ascii")) for x in self.response) + except UnicodeError: + # aha, something non-bytestringy in there, too bad, we + # can't safely figure out the length of the response. + pass + else: + headers["Content-Length"] = str(content_length) + + return headers + + def get_app_iter(self, environ): + """Returns the application iterator for the given environ. Depending + on the request method and the current status code the return value + might be an empty response rather than the one from the response. + + If the request method is `HEAD` or the status code is in a range + where the HTTP specification requires an empty response, an empty + iterable is returned. + + .. versionadded:: 0.6 + + :param environ: the WSGI environment of the request. + :return: a response iterable. + """ + status = self.status_code + if ( + environ["REQUEST_METHOD"] == "HEAD" + or 100 <= status < 200 + or status in (204, 304) + ): + iterable = () + elif self.direct_passthrough: + if __debug__: + _warn_if_string(self.response) + return self.response + else: + iterable = self.iter_encoded() + return ClosingIterator(iterable, self.close) + + def get_wsgi_response(self, environ): + """Returns the final WSGI response as tuple. The first item in + the tuple is the application iterator, the second the status and + the third the list of headers. The response returned is created + specially for the given environment. For example if the request + method in the WSGI environment is ``'HEAD'`` the response will + be empty and only the headers and status code will be present. + + .. versionadded:: 0.6 + + :param environ: the WSGI environment of the request. + :return: an ``(app_iter, status, headers)`` tuple. + """ + headers = self.get_wsgi_headers(environ) + app_iter = self.get_app_iter(environ) + return app_iter, self.status, headers.to_wsgi_list() + + def __call__(self, environ, start_response): + """Process this response as WSGI application. + + :param environ: the WSGI environment. + :param start_response: the response callable provided by the WSGI + server. + :return: an application iterator + """ + app_iter, status, headers = self.get_wsgi_response(environ) + start_response(status, headers) + return app_iter diff --git a/env/Lib/site-packages/werkzeug/wrappers/common_descriptors.py b/env/Lib/site-packages/werkzeug/wrappers/common_descriptors.py new file mode 100644 index 0000000..e4107ee --- /dev/null +++ b/env/Lib/site-packages/werkzeug/wrappers/common_descriptors.py @@ -0,0 +1,322 @@ +from datetime import datetime +from datetime import timedelta + +from .._compat import string_types +from ..datastructures import CallbackDict +from ..http import dump_age +from ..http import dump_header +from ..http import dump_options_header +from ..http import http_date +from ..http import parse_age +from ..http import parse_date +from ..http import parse_options_header +from ..http import parse_set_header +from ..utils import cached_property +from ..utils import environ_property +from ..utils import get_content_type +from ..utils import header_property +from ..wsgi import get_content_length + + +class CommonRequestDescriptorsMixin(object): + """A mixin for :class:`BaseRequest` subclasses. Request objects that + mix this class in will automatically get descriptors for a couple of + HTTP headers with automatic type conversion. + + .. versionadded:: 0.5 + """ + + content_type = environ_property( + "CONTENT_TYPE", + doc="""The Content-Type entity-header field indicates the media + type of the entity-body sent to the recipient or, in the case of + the HEAD method, the media type that would have been sent had + the request been a GET.""", + ) + + @cached_property + def content_length(self): + """The Content-Length entity-header field indicates the size of the + entity-body in bytes or, in the case of the HEAD method, the size of + the entity-body that would have been sent had the request been a + GET. + """ + return get_content_length(self.environ) + + content_encoding = environ_property( + "HTTP_CONTENT_ENCODING", + doc="""The Content-Encoding entity-header field is used as a + modifier to the media-type. When present, its value indicates + what additional content codings have been applied to the + entity-body, and thus what decoding mechanisms must be applied + in order to obtain the media-type referenced by the Content-Type + header field. + + .. versionadded:: 0.9""", + ) + content_md5 = environ_property( + "HTTP_CONTENT_MD5", + doc="""The Content-MD5 entity-header field, as defined in + RFC 1864, is an MD5 digest of the entity-body for the purpose of + providing an end-to-end message integrity check (MIC) of the + entity-body. (Note: a MIC is good for detecting accidental + modification of the entity-body in transit, but is not proof + against malicious attacks.) + + .. versionadded:: 0.9""", + ) + referrer = environ_property( + "HTTP_REFERER", + doc="""The Referer[sic] request-header field allows the client + to specify, for the server's benefit, the address (URI) of the + resource from which the Request-URI was obtained (the + "referrer", although the header field is misspelled).""", + ) + date = environ_property( + "HTTP_DATE", + None, + parse_date, + doc="""The Date general-header field represents the date and + time at which the message was originated, having the same + semantics as orig-date in RFC 822.""", + ) + max_forwards = environ_property( + "HTTP_MAX_FORWARDS", + None, + int, + doc="""The Max-Forwards request-header field provides a + mechanism with the TRACE and OPTIONS methods to limit the number + of proxies or gateways that can forward the request to the next + inbound server.""", + ) + + def _parse_content_type(self): + if not hasattr(self, "_parsed_content_type"): + self._parsed_content_type = parse_options_header( + self.environ.get("CONTENT_TYPE", "") + ) + + @property + def mimetype(self): + """Like :attr:`content_type`, but without parameters (eg, without + charset, type etc.) and always lowercase. For example if the content + type is ``text/HTML; charset=utf-8`` the mimetype would be + ``'text/html'``. + """ + self._parse_content_type() + return self._parsed_content_type[0].lower() + + @property + def mimetype_params(self): + """The mimetype parameters as dict. For example if the content + type is ``text/html; charset=utf-8`` the params would be + ``{'charset': 'utf-8'}``. + """ + self._parse_content_type() + return self._parsed_content_type[1] + + @cached_property + def pragma(self): + """The Pragma general-header field is used to include + implementation-specific directives that might apply to any recipient + along the request/response chain. All pragma directives specify + optional behavior from the viewpoint of the protocol; however, some + systems MAY require that behavior be consistent with the directives. + """ + return parse_set_header(self.environ.get("HTTP_PRAGMA", "")) + + +class CommonResponseDescriptorsMixin(object): + """A mixin for :class:`BaseResponse` subclasses. Response objects that + mix this class in will automatically get descriptors for a couple of + HTTP headers with automatic type conversion. + """ + + @property + def mimetype(self): + """The mimetype (content type without charset etc.)""" + ct = self.headers.get("content-type") + if ct: + return ct.split(";")[0].strip() + + @mimetype.setter + def mimetype(self, value): + self.headers["Content-Type"] = get_content_type(value, self.charset) + + @property + def mimetype_params(self): + """The mimetype parameters as dict. For example if the + content type is ``text/html; charset=utf-8`` the params would be + ``{'charset': 'utf-8'}``. + + .. versionadded:: 0.5 + """ + + def on_update(d): + self.headers["Content-Type"] = dump_options_header(self.mimetype, d) + + d = parse_options_header(self.headers.get("content-type", ""))[1] + return CallbackDict(d, on_update) + + location = header_property( + "Location", + doc="""The Location response-header field is used to redirect + the recipient to a location other than the Request-URI for + completion of the request or identification of a new + resource.""", + ) + age = header_property( + "Age", + None, + parse_age, + dump_age, + doc="""The Age response-header field conveys the sender's + estimate of the amount of time since the response (or its + revalidation) was generated at the origin server. + + Age values are non-negative decimal integers, representing time + in seconds.""", + ) + content_type = header_property( + "Content-Type", + doc="""The Content-Type entity-header field indicates the media + type of the entity-body sent to the recipient or, in the case of + the HEAD method, the media type that would have been sent had + the request been a GET.""", + ) + content_length = header_property( + "Content-Length", + None, + int, + str, + doc="""The Content-Length entity-header field indicates the size + of the entity-body, in decimal number of OCTETs, sent to the + recipient or, in the case of the HEAD method, the size of the + entity-body that would have been sent had the request been a + GET.""", + ) + content_location = header_property( + "Content-Location", + doc="""The Content-Location entity-header field MAY be used to + supply the resource location for the entity enclosed in the + message when that entity is accessible from a location separate + from the requested resource's URI.""", + ) + content_encoding = header_property( + "Content-Encoding", + doc="""The Content-Encoding entity-header field is used as a + modifier to the media-type. When present, its value indicates + what additional content codings have been applied to the + entity-body, and thus what decoding mechanisms must be applied + in order to obtain the media-type referenced by the Content-Type + header field.""", + ) + content_md5 = header_property( + "Content-MD5", + doc="""The Content-MD5 entity-header field, as defined in + RFC 1864, is an MD5 digest of the entity-body for the purpose of + providing an end-to-end message integrity check (MIC) of the + entity-body. (Note: a MIC is good for detecting accidental + modification of the entity-body in transit, but is not proof + against malicious attacks.)""", + ) + date = header_property( + "Date", + None, + parse_date, + http_date, + doc="""The Date general-header field represents the date and + time at which the message was originated, having the same + semantics as orig-date in RFC 822.""", + ) + expires = header_property( + "Expires", + None, + parse_date, + http_date, + doc="""The Expires entity-header field gives the date/time after + which the response is considered stale. A stale cache entry may + not normally be returned by a cache.""", + ) + last_modified = header_property( + "Last-Modified", + None, + parse_date, + http_date, + doc="""The Last-Modified entity-header field indicates the date + and time at which the origin server believes the variant was + last modified.""", + ) + + @property + def retry_after(self): + """The Retry-After response-header field can be used with a + 503 (Service Unavailable) response to indicate how long the + service is expected to be unavailable to the requesting client. + + Time in seconds until expiration or date. + """ + value = self.headers.get("retry-after") + if value is None: + return + elif value.isdigit(): + return datetime.utcnow() + timedelta(seconds=int(value)) + return parse_date(value) + + @retry_after.setter + def retry_after(self, value): + if value is None: + if "retry-after" in self.headers: + del self.headers["retry-after"] + return + elif isinstance(value, datetime): + value = http_date(value) + else: + value = str(value) + self.headers["Retry-After"] = value + + def _set_property(name, doc=None): # noqa: B902 + def fget(self): + def on_update(header_set): + if not header_set and name in self.headers: + del self.headers[name] + elif header_set: + self.headers[name] = header_set.to_header() + + return parse_set_header(self.headers.get(name), on_update) + + def fset(self, value): + if not value: + del self.headers[name] + elif isinstance(value, string_types): + self.headers[name] = value + else: + self.headers[name] = dump_header(value) + + return property(fget, fset, doc=doc) + + vary = _set_property( + "Vary", + doc="""The Vary field value indicates the set of request-header + fields that fully determines, while the response is fresh, + whether a cache is permitted to use the response to reply to a + subsequent request without revalidation.""", + ) + content_language = _set_property( + "Content-Language", + doc="""The Content-Language entity-header field describes the + natural language(s) of the intended audience for the enclosed + entity. Note that this might not be equivalent to all the + languages used within the entity-body.""", + ) + allow = _set_property( + "Allow", + doc="""The Allow entity-header field lists the set of methods + supported by the resource identified by the Request-URI. The + purpose of this field is strictly to inform the recipient of + valid methods associated with the resource. An Allow header + field MUST be present in a 405 (Method Not Allowed) + response.""", + ) + + del _set_property diff --git a/env/Lib/site-packages/werkzeug/wrappers/etag.py b/env/Lib/site-packages/werkzeug/wrappers/etag.py new file mode 100644 index 0000000..0733506 --- /dev/null +++ b/env/Lib/site-packages/werkzeug/wrappers/etag.py @@ -0,0 +1,304 @@ +from .._compat import string_types +from .._internal import _get_environ +from ..datastructures import ContentRange +from ..datastructures import RequestCacheControl +from ..datastructures import ResponseCacheControl +from ..http import generate_etag +from ..http import http_date +from ..http import is_resource_modified +from ..http import parse_cache_control_header +from ..http import parse_content_range_header +from ..http import parse_date +from ..http import parse_etags +from ..http import parse_if_range_header +from ..http import parse_range_header +from ..http import quote_etag +from ..http import unquote_etag +from ..utils import cached_property +from ..utils import header_property +from ..wrappers.base_response import _clean_accept_ranges +from ..wsgi import _RangeWrapper + + +class ETagRequestMixin(object): + """Add entity tag and cache descriptors to a request object or object with + a WSGI environment available as :attr:`~BaseRequest.environ`. This not + only provides access to etags but also to the cache control header. + """ + + @cached_property + def cache_control(self): + """A :class:`~werkzeug.datastructures.RequestCacheControl` object + for the incoming cache control headers. + """ + cache_control = self.environ.get("HTTP_CACHE_CONTROL") + return parse_cache_control_header(cache_control, None, RequestCacheControl) + + @cached_property + def if_match(self): + """An object containing all the etags in the `If-Match` header. + + :rtype: :class:`~werkzeug.datastructures.ETags` + """ + return parse_etags(self.environ.get("HTTP_IF_MATCH")) + + @cached_property + def if_none_match(self): + """An object containing all the etags in the `If-None-Match` header. + + :rtype: :class:`~werkzeug.datastructures.ETags` + """ + return parse_etags(self.environ.get("HTTP_IF_NONE_MATCH")) + + @cached_property + def if_modified_since(self): + """The parsed `If-Modified-Since` header as datetime object.""" + return parse_date(self.environ.get("HTTP_IF_MODIFIED_SINCE")) + + @cached_property + def if_unmodified_since(self): + """The parsed `If-Unmodified-Since` header as datetime object.""" + return parse_date(self.environ.get("HTTP_IF_UNMODIFIED_SINCE")) + + @cached_property + def if_range(self): + """The parsed `If-Range` header. + + .. versionadded:: 0.7 + + :rtype: :class:`~werkzeug.datastructures.IfRange` + """ + return parse_if_range_header(self.environ.get("HTTP_IF_RANGE")) + + @cached_property + def range(self): + """The parsed `Range` header. + + .. versionadded:: 0.7 + + :rtype: :class:`~werkzeug.datastructures.Range` + """ + return parse_range_header(self.environ.get("HTTP_RANGE")) + + +class ETagResponseMixin(object): + """Adds extra functionality to a response object for etag and cache + handling. This mixin requires an object with at least a `headers` + object that implements a dict like interface similar to + :class:`~werkzeug.datastructures.Headers`. + + If you want the :meth:`freeze` method to automatically add an etag, you + have to mixin this method before the response base class. The default + response class does not do that. + """ + + @property + def cache_control(self): + """The Cache-Control general-header field is used to specify + directives that MUST be obeyed by all caching mechanisms along the + request/response chain. + """ + + def on_update(cache_control): + if not cache_control and "cache-control" in self.headers: + del self.headers["cache-control"] + elif cache_control: + self.headers["Cache-Control"] = cache_control.to_header() + + return parse_cache_control_header( + self.headers.get("cache-control"), on_update, ResponseCacheControl + ) + + def _wrap_response(self, start, length): + """Wrap existing Response in case of Range Request context.""" + if self.status_code == 206: + self.response = _RangeWrapper(self.response, start, length) + + def _is_range_request_processable(self, environ): + """Return ``True`` if `Range` header is present and if underlying + resource is considered unchanged when compared with `If-Range` header. + """ + return ( + "HTTP_IF_RANGE" not in environ + or not is_resource_modified( + environ, + self.headers.get("etag"), + None, + self.headers.get("last-modified"), + ignore_if_range=False, + ) + ) and "HTTP_RANGE" in environ + + def _process_range_request(self, environ, complete_length=None, accept_ranges=None): + """Handle Range Request related headers (RFC7233). If `Accept-Ranges` + header is valid, and Range Request is processable, we set the headers + as described by the RFC, and wrap the underlying response in a + RangeWrapper. + + Returns ``True`` if Range Request can be fulfilled, ``False`` otherwise. + + :raises: :class:`~werkzeug.exceptions.RequestedRangeNotSatisfiable` + if `Range` header could not be parsed or satisfied. + """ + from ..exceptions import RequestedRangeNotSatisfiable + + if accept_ranges is None: + return False + self.headers["Accept-Ranges"] = accept_ranges + if not self._is_range_request_processable(environ) or complete_length is None: + return False + parsed_range = parse_range_header(environ.get("HTTP_RANGE")) + if parsed_range is None: + raise RequestedRangeNotSatisfiable(complete_length) + range_tuple = parsed_range.range_for_length(complete_length) + content_range_header = parsed_range.to_content_range_header(complete_length) + if range_tuple is None or content_range_header is None: + raise RequestedRangeNotSatisfiable(complete_length) + content_length = range_tuple[1] - range_tuple[0] + # Be sure not to send 206 response + # if requested range is the full content. + if content_length != complete_length: + self.headers["Content-Length"] = content_length + self.content_range = content_range_header + self.status_code = 206 + self._wrap_response(range_tuple[0], content_length) + return True + return False + + def make_conditional( + self, request_or_environ, accept_ranges=False, complete_length=None + ): + """Make the response conditional to the request. This method works + best if an etag was defined for the response already. The `add_etag` + method can be used to do that. If called without etag just the date + header is set. + + This does nothing if the request method in the request or environ is + anything but GET or HEAD. + + For optimal performance when handling range requests, it's recommended + that your response data object implements `seekable`, `seek` and `tell` + methods as described by :py:class:`io.IOBase`. Objects returned by + :meth:`~werkzeug.wsgi.wrap_file` automatically implement those methods. + + It does not remove the body of the response because that's something + the :meth:`__call__` function does for us automatically. + + Returns self so that you can do ``return resp.make_conditional(req)`` + but modifies the object in-place. + + :param request_or_environ: a request object or WSGI environment to be + used to make the response conditional + against. + :param accept_ranges: This parameter dictates the value of + `Accept-Ranges` header. If ``False`` (default), + the header is not set. If ``True``, it will be set + to ``"bytes"``. If ``None``, it will be set to + ``"none"``. If it's a string, it will use this + value. + :param complete_length: Will be used only in valid Range Requests. + It will set `Content-Range` complete length + value and compute `Content-Length` real value. + This parameter is mandatory for successful + Range Requests completion. + :raises: :class:`~werkzeug.exceptions.RequestedRangeNotSatisfiable` + if `Range` header could not be parsed or satisfied. + """ + environ = _get_environ(request_or_environ) + if environ["REQUEST_METHOD"] in ("GET", "HEAD"): + # if the date is not in the headers, add it now. We however + # will not override an already existing header. Unfortunately + # this header will be overriden by many WSGI servers including + # wsgiref. + if "date" not in self.headers: + self.headers["Date"] = http_date() + accept_ranges = _clean_accept_ranges(accept_ranges) + is206 = self._process_range_request(environ, complete_length, accept_ranges) + if not is206 and not is_resource_modified( + environ, + self.headers.get("etag"), + None, + self.headers.get("last-modified"), + ): + if parse_etags(environ.get("HTTP_IF_MATCH")): + self.status_code = 412 + else: + self.status_code = 304 + if ( + self.automatically_set_content_length + and "content-length" not in self.headers + ): + length = self.calculate_content_length() + if length is not None: + self.headers["Content-Length"] = length + return self + + def add_etag(self, overwrite=False, weak=False): + """Add an etag for the current response if there is none yet.""" + if overwrite or "etag" not in self.headers: + self.set_etag(generate_etag(self.get_data()), weak) + + def set_etag(self, etag, weak=False): + """Set the etag, and override the old one if there was one.""" + self.headers["ETag"] = quote_etag(etag, weak) + + def get_etag(self): + """Return a tuple in the form ``(etag, is_weak)``. If there is no + ETag the return value is ``(None, None)``. + """ + return unquote_etag(self.headers.get("ETag")) + + def freeze(self, no_etag=False): + """Call this method if you want to make your response object ready for + pickeling. This buffers the generator if there is one. This also + sets the etag unless `no_etag` is set to `True`. + """ + if not no_etag: + self.add_etag() + super(ETagResponseMixin, self).freeze() + + accept_ranges = header_property( + "Accept-Ranges", + doc="""The `Accept-Ranges` header. Even though the name would + indicate that multiple values are supported, it must be one + string token only. + + The values ``'bytes'`` and ``'none'`` are common. + + .. versionadded:: 0.7""", + ) + + def _get_content_range(self): + def on_update(rng): + if not rng: + del self.headers["content-range"] + else: + self.headers["Content-Range"] = rng.to_header() + + rv = parse_content_range_header(self.headers.get("content-range"), on_update) + # always provide a content range object to make the descriptor + # more user friendly. It provides an unset() method that can be + # used to remove the header quickly. + if rv is None: + rv = ContentRange(None, None, None, on_update=on_update) + return rv + + def _set_content_range(self, value): + if not value: + del self.headers["content-range"] + elif isinstance(value, string_types): + self.headers["Content-Range"] = value + else: + self.headers["Content-Range"] = value.to_header() + + content_range = property( + _get_content_range, + _set_content_range, + doc="""The ``Content-Range`` header as + :class:`~werkzeug.datastructures.ContentRange` object. Even if + the header is not set it wil provide such an object for easier + manipulation. + + .. versionadded:: 0.7""", + ) + del _get_content_range, _set_content_range diff --git a/env/Lib/site-packages/werkzeug/wrappers/json.py b/env/Lib/site-packages/werkzeug/wrappers/json.py new file mode 100644 index 0000000..6d5dc33 --- /dev/null +++ b/env/Lib/site-packages/werkzeug/wrappers/json.py @@ -0,0 +1,145 @@ +from __future__ import absolute_import + +import datetime +import uuid + +from .._compat import text_type +from ..exceptions import BadRequest +from ..utils import detect_utf_encoding + +try: + import simplejson as _json +except ImportError: + import json as _json + + +class _JSONModule(object): + @staticmethod + def _default(o): + if isinstance(o, datetime.date): + return o.isoformat() + + if isinstance(o, uuid.UUID): + return str(o) + + if hasattr(o, "__html__"): + return text_type(o.__html__()) + + raise TypeError() + + @classmethod + def dumps(cls, obj, **kw): + kw.setdefault("separators", (",", ":")) + kw.setdefault("default", cls._default) + kw.setdefault("sort_keys", True) + return _json.dumps(obj, **kw) + + @staticmethod + def loads(s, **kw): + if isinstance(s, bytes): + # Needed for Python < 3.6 + encoding = detect_utf_encoding(s) + s = s.decode(encoding) + + return _json.loads(s, **kw) + + +class JSONMixin(object): + """Mixin to parse :attr:`data` as JSON. Can be mixed in for both + :class:`~werkzeug.wrappers.Request` and + :class:`~werkzeug.wrappers.Response` classes. + + If `simplejson`_ is installed it is preferred over Python's built-in + :mod:`json` module. + + .. _simplejson: https://simplejson.readthedocs.io/en/latest/ + """ + + #: A module or other object that has ``dumps`` and ``loads`` + #: functions that match the API of the built-in :mod:`json` module. + json_module = _JSONModule + + @property + def json(self): + """The parsed JSON data if :attr:`mimetype` indicates JSON + (:mimetype:`application/json`, see :meth:`is_json`). + + Calls :meth:`get_json` with default arguments. + """ + return self.get_json() + + @property + def is_json(self): + """Check if the mimetype indicates JSON data, either + :mimetype:`application/json` or :mimetype:`application/*+json`. + """ + mt = self.mimetype + return ( + mt == "application/json" + or mt.startswith("application/") + and mt.endswith("+json") + ) + + def _get_data_for_json(self, cache): + try: + return self.get_data(cache=cache) + except TypeError: + # Response doesn't have cache param. + return self.get_data() + + # Cached values for ``(silent=False, silent=True)``. Initialized + # with sentinel values. + _cached_json = (Ellipsis, Ellipsis) + + def get_json(self, force=False, silent=False, cache=True): + """Parse :attr:`data` as JSON. + + If the mimetype does not indicate JSON + (:mimetype:`application/json`, see :meth:`is_json`), this + returns ``None``. + + If parsing fails, :meth:`on_json_loading_failed` is called and + its return value is used as the return value. + + :param force: Ignore the mimetype and always try to parse JSON. + :param silent: Silence parsing errors and return ``None`` + instead. + :param cache: Store the parsed JSON to return for subsequent + calls. + """ + if cache and self._cached_json[silent] is not Ellipsis: + return self._cached_json[silent] + + if not (force or self.is_json): + return None + + data = self._get_data_for_json(cache=cache) + + try: + rv = self.json_module.loads(data) + except ValueError as e: + if silent: + rv = None + + if cache: + normal_rv, _ = self._cached_json + self._cached_json = (normal_rv, rv) + else: + rv = self.on_json_loading_failed(e) + + if cache: + _, silent_rv = self._cached_json + self._cached_json = (rv, silent_rv) + else: + if cache: + self._cached_json = (rv, rv) + + return rv + + def on_json_loading_failed(self, e): + """Called if :meth:`get_json` parsing fails and isn't silenced. + If this method returns a value, it is used as the return value + for :meth:`get_json`. The default implementation raises + :exc:`~werkzeug.exceptions.BadRequest`. + """ + raise BadRequest("Failed to decode JSON object: {0}".format(e)) diff --git a/env/Lib/site-packages/werkzeug/wrappers/request.py b/env/Lib/site-packages/werkzeug/wrappers/request.py new file mode 100644 index 0000000..d1c71b6 --- /dev/null +++ b/env/Lib/site-packages/werkzeug/wrappers/request.py @@ -0,0 +1,44 @@ +from .accept import AcceptMixin +from .auth import AuthorizationMixin +from .base_request import BaseRequest +from .common_descriptors import CommonRequestDescriptorsMixin +from .etag import ETagRequestMixin +from .user_agent import UserAgentMixin + + +class Request( + BaseRequest, + AcceptMixin, + ETagRequestMixin, + UserAgentMixin, + AuthorizationMixin, + CommonRequestDescriptorsMixin, +): + """Full featured request object implementing the following mixins: + + - :class:`AcceptMixin` for accept header parsing + - :class:`ETagRequestMixin` for etag and cache control handling + - :class:`UserAgentMixin` for user agent introspection + - :class:`AuthorizationMixin` for http auth handling + - :class:`CommonRequestDescriptorsMixin` for common headers + """ + + +class StreamOnlyMixin(object): + """If mixed in before the request object this will change the bahavior + of it to disable handling of form parsing. This disables the + :attr:`files`, :attr:`form` attributes and will just provide a + :attr:`stream` attribute that however is always available. + + .. versionadded:: 0.9 + """ + + disable_data_descriptor = True + want_form_data_parsed = False + + +class PlainRequest(StreamOnlyMixin, Request): + """A request object without special form parsing capabilities. + + .. versionadded:: 0.9 + """ diff --git a/env/Lib/site-packages/werkzeug/wrappers/response.py b/env/Lib/site-packages/werkzeug/wrappers/response.py new file mode 100644 index 0000000..cd86cac --- /dev/null +++ b/env/Lib/site-packages/werkzeug/wrappers/response.py @@ -0,0 +1,78 @@ +from ..utils import cached_property +from .auth import WWWAuthenticateMixin +from .base_response import BaseResponse +from .common_descriptors import CommonResponseDescriptorsMixin +from .etag import ETagResponseMixin + + +class ResponseStream(object): + """A file descriptor like object used by the :class:`ResponseStreamMixin` to + represent the body of the stream. It directly pushes into the response + iterable of the response object. + """ + + mode = "wb+" + + def __init__(self, response): + self.response = response + self.closed = False + + def write(self, value): + if self.closed: + raise ValueError("I/O operation on closed file") + self.response._ensure_sequence(mutable=True) + self.response.response.append(value) + self.response.headers.pop("Content-Length", None) + return len(value) + + def writelines(self, seq): + for item in seq: + self.write(item) + + def close(self): + self.closed = True + + def flush(self): + if self.closed: + raise ValueError("I/O operation on closed file") + + def isatty(self): + if self.closed: + raise ValueError("I/O operation on closed file") + return False + + def tell(self): + self.response._ensure_sequence() + return sum(map(len, self.response.response)) + + @property + def encoding(self): + return self.response.charset + + +class ResponseStreamMixin(object): + """Mixin for :class:`BaseRequest` subclasses. Classes that inherit from + this mixin will automatically get a :attr:`stream` property that provides + a write-only interface to the response iterable. + """ + + @cached_property + def stream(self): + """The response iterable as write-only stream.""" + return ResponseStream(self) + + +class Response( + BaseResponse, + ETagResponseMixin, + ResponseStreamMixin, + CommonResponseDescriptorsMixin, + WWWAuthenticateMixin, +): + """Full featured response object implementing the following mixins: + + - :class:`ETagResponseMixin` for etag and cache control handling + - :class:`ResponseStreamMixin` to add support for the `stream` property + - :class:`CommonResponseDescriptorsMixin` for various HTTP descriptors + - :class:`WWWAuthenticateMixin` for HTTP authentication support + """ diff --git a/env/Lib/site-packages/werkzeug/wrappers/user_agent.py b/env/Lib/site-packages/werkzeug/wrappers/user_agent.py new file mode 100644 index 0000000..a32d8ac --- /dev/null +++ b/env/Lib/site-packages/werkzeug/wrappers/user_agent.py @@ -0,0 +1,14 @@ +from ..useragents import UserAgent +from ..utils import cached_property + + +class UserAgentMixin(object): + """Adds a `user_agent` attribute to the request object which + contains the parsed user agent of the browser that triggered the + request as a :class:`~werkzeug.useragents.UserAgent` object. + """ + + @cached_property + def user_agent(self): + """The current user agent.""" + return UserAgent(self.environ) diff --git a/env/Lib/site-packages/werkzeug/wsgi.py b/env/Lib/site-packages/werkzeug/wsgi.py new file mode 100644 index 0000000..7411955 --- /dev/null +++ b/env/Lib/site-packages/werkzeug/wsgi.py @@ -0,0 +1,1013 @@ +# -*- coding: utf-8 -*- +""" + werkzeug.wsgi + ~~~~~~~~~~~~~ + + This module implements WSGI related helpers. + + :copyright: 2007 Pallets + :license: BSD-3-Clause +""" +import io +import re +from functools import partial +from functools import update_wrapper +from itertools import chain + +from ._compat import BytesIO +from ._compat import implements_iterator +from ._compat import make_literal_wrapper +from ._compat import string_types +from ._compat import text_type +from ._compat import to_bytes +from ._compat import to_unicode +from ._compat import try_coerce_native +from ._compat import wsgi_get_bytes +from ._internal import _encode_idna +from .urls import uri_to_iri +from .urls import url_join +from .urls import url_parse +from .urls import url_quote + + +def responder(f): + """Marks a function as responder. Decorate a function with it and it + will automatically call the return value as WSGI application. + + Example:: + + @responder + def application(environ, start_response): + return Response('Hello World!') + """ + return update_wrapper(lambda *a: f(*a)(*a[-2:]), f) + + +def get_current_url( + environ, + root_only=False, + strip_querystring=False, + host_only=False, + trusted_hosts=None, +): + """A handy helper function that recreates the full URL as IRI for the + current request or parts of it. Here's an example: + + >>> from werkzeug.test import create_environ + >>> env = create_environ("/?param=foo", "http://localhost/script") + >>> get_current_url(env) + 'http://localhost/script/?param=foo' + >>> get_current_url(env, root_only=True) + 'http://localhost/script/' + >>> get_current_url(env, host_only=True) + 'http://localhost/' + >>> get_current_url(env, strip_querystring=True) + 'http://localhost/script/' + + This optionally it verifies that the host is in a list of trusted hosts. + If the host is not in there it will raise a + :exc:`~werkzeug.exceptions.SecurityError`. + + Note that the string returned might contain unicode characters as the + representation is an IRI not an URI. If you need an ASCII only + representation you can use the :func:`~werkzeug.urls.iri_to_uri` + function: + + >>> from werkzeug.urls import iri_to_uri + >>> iri_to_uri(get_current_url(env)) + 'http://localhost/script/?param=foo' + + :param environ: the WSGI environment to get the current URL from. + :param root_only: set `True` if you only want the root URL. + :param strip_querystring: set to `True` if you don't want the querystring. + :param host_only: set to `True` if the host URL should be returned. + :param trusted_hosts: a list of trusted hosts, see :func:`host_is_trusted` + for more information. + """ + tmp = [environ["wsgi.url_scheme"], "://", get_host(environ, trusted_hosts)] + cat = tmp.append + if host_only: + return uri_to_iri("".join(tmp) + "/") + cat(url_quote(wsgi_get_bytes(environ.get("SCRIPT_NAME", ""))).rstrip("/")) + cat("/") + if not root_only: + cat(url_quote(wsgi_get_bytes(environ.get("PATH_INFO", "")).lstrip(b"/"))) + if not strip_querystring: + qs = get_query_string(environ) + if qs: + cat("?" + qs) + return uri_to_iri("".join(tmp)) + + +def host_is_trusted(hostname, trusted_list): + """Checks if a host is trusted against a list. This also takes care + of port normalization. + + .. versionadded:: 0.9 + + :param hostname: the hostname to check + :param trusted_list: a list of hostnames to check against. If a + hostname starts with a dot it will match against + all subdomains as well. + """ + if not hostname: + return False + + if isinstance(trusted_list, string_types): + trusted_list = [trusted_list] + + def _normalize(hostname): + if ":" in hostname: + hostname = hostname.rsplit(":", 1)[0] + return _encode_idna(hostname) + + try: + hostname = _normalize(hostname) + except UnicodeError: + return False + for ref in trusted_list: + if ref.startswith("."): + ref = ref[1:] + suffix_match = True + else: + suffix_match = False + try: + ref = _normalize(ref) + except UnicodeError: + return False + if ref == hostname: + return True + if suffix_match and hostname.endswith(b"." + ref): + return True + return False + + +def get_host(environ, trusted_hosts=None): + """Return the host for the given WSGI environment. This first checks + the ``Host`` header. If it's not present, then ``SERVER_NAME`` and + ``SERVER_PORT`` are used. The host will only contain the port if it + is different than the standard port for the protocol. + + Optionally, verify that the host is trusted using + :func:`host_is_trusted` and raise a + :exc:`~werkzeug.exceptions.SecurityError` if it is not. + + :param environ: The WSGI environment to get the host from. + :param trusted_hosts: A list of trusted hosts. + :return: Host, with port if necessary. + :raise ~werkzeug.exceptions.SecurityError: If the host is not + trusted. + """ + if "HTTP_HOST" in environ: + rv = environ["HTTP_HOST"] + if environ["wsgi.url_scheme"] == "http" and rv.endswith(":80"): + rv = rv[:-3] + elif environ["wsgi.url_scheme"] == "https" and rv.endswith(":443"): + rv = rv[:-4] + else: + rv = environ["SERVER_NAME"] + if (environ["wsgi.url_scheme"], environ["SERVER_PORT"]) not in ( + ("https", "443"), + ("http", "80"), + ): + rv += ":" + environ["SERVER_PORT"] + if trusted_hosts is not None: + if not host_is_trusted(rv, trusted_hosts): + from .exceptions import SecurityError + + raise SecurityError('Host "%s" is not trusted' % rv) + return rv + + +def get_content_length(environ): + """Returns the content length from the WSGI environment as + integer. If it's not available or chunked transfer encoding is used, + ``None`` is returned. + + .. versionadded:: 0.9 + + :param environ: the WSGI environ to fetch the content length from. + """ + if environ.get("HTTP_TRANSFER_ENCODING", "") == "chunked": + return None + + content_length = environ.get("CONTENT_LENGTH") + if content_length is not None: + try: + return max(0, int(content_length)) + except (ValueError, TypeError): + pass + + +def get_input_stream(environ, safe_fallback=True): + """Returns the input stream from the WSGI environment and wraps it + in the most sensible way possible. The stream returned is not the + raw WSGI stream in most cases but one that is safe to read from + without taking into account the content length. + + If content length is not set, the stream will be empty for safety reasons. + If the WSGI server supports chunked or infinite streams, it should set + the ``wsgi.input_terminated`` value in the WSGI environ to indicate that. + + .. versionadded:: 0.9 + + :param environ: the WSGI environ to fetch the stream from. + :param safe_fallback: use an empty stream as a safe fallback when the + content length is not set. Disabling this allows infinite streams, + which can be a denial-of-service risk. + """ + stream = environ["wsgi.input"] + content_length = get_content_length(environ) + + # A wsgi extension that tells us if the input is terminated. In + # that case we return the stream unchanged as we know we can safely + # read it until the end. + if environ.get("wsgi.input_terminated"): + return stream + + # If the request doesn't specify a content length, returning the stream is + # potentially dangerous because it could be infinite, malicious or not. If + # safe_fallback is true, return an empty stream instead for safety. + if content_length is None: + return BytesIO() if safe_fallback else stream + + # Otherwise limit the stream to the content length + return LimitedStream(stream, content_length) + + +def get_query_string(environ): + """Returns the `QUERY_STRING` from the WSGI environment. This also takes + care about the WSGI decoding dance on Python 3 environments as a + native string. The string returned will be restricted to ASCII + characters. + + .. versionadded:: 0.9 + + :param environ: the WSGI environment object to get the query string from. + """ + qs = wsgi_get_bytes(environ.get("QUERY_STRING", "")) + # QUERY_STRING really should be ascii safe but some browsers + # will send us some unicode stuff (I am looking at you IE). + # In that case we want to urllib quote it badly. + return try_coerce_native(url_quote(qs, safe=":&%=+$!*'(),")) + + +def get_path_info(environ, charset="utf-8", errors="replace"): + """Returns the `PATH_INFO` from the WSGI environment and properly + decodes it. This also takes care about the WSGI decoding dance + on Python 3 environments. if the `charset` is set to `None` a + bytestring is returned. + + .. versionadded:: 0.9 + + :param environ: the WSGI environment object to get the path from. + :param charset: the charset for the path info, or `None` if no + decoding should be performed. + :param errors: the decoding error handling. + """ + path = wsgi_get_bytes(environ.get("PATH_INFO", "")) + return to_unicode(path, charset, errors, allow_none_charset=True) + + +def get_script_name(environ, charset="utf-8", errors="replace"): + """Returns the `SCRIPT_NAME` from the WSGI environment and properly + decodes it. This also takes care about the WSGI decoding dance + on Python 3 environments. if the `charset` is set to `None` a + bytestring is returned. + + .. versionadded:: 0.9 + + :param environ: the WSGI environment object to get the path from. + :param charset: the charset for the path, or `None` if no + decoding should be performed. + :param errors: the decoding error handling. + """ + path = wsgi_get_bytes(environ.get("SCRIPT_NAME", "")) + return to_unicode(path, charset, errors, allow_none_charset=True) + + +def pop_path_info(environ, charset="utf-8", errors="replace"): + """Removes and returns the next segment of `PATH_INFO`, pushing it onto + `SCRIPT_NAME`. Returns `None` if there is nothing left on `PATH_INFO`. + + If the `charset` is set to `None` a bytestring is returned. + + If there are empty segments (``'/foo//bar``) these are ignored but + properly pushed to the `SCRIPT_NAME`: + + >>> env = {'SCRIPT_NAME': '/foo', 'PATH_INFO': '/a/b'} + >>> pop_path_info(env) + 'a' + >>> env['SCRIPT_NAME'] + '/foo/a' + >>> pop_path_info(env) + 'b' + >>> env['SCRIPT_NAME'] + '/foo/a/b' + + .. versionadded:: 0.5 + + .. versionchanged:: 0.9 + The path is now decoded and a charset and encoding + parameter can be provided. + + :param environ: the WSGI environment that is modified. + """ + path = environ.get("PATH_INFO") + if not path: + return None + + script_name = environ.get("SCRIPT_NAME", "") + + # shift multiple leading slashes over + old_path = path + path = path.lstrip("/") + if path != old_path: + script_name += "/" * (len(old_path) - len(path)) + + if "/" not in path: + environ["PATH_INFO"] = "" + environ["SCRIPT_NAME"] = script_name + path + rv = wsgi_get_bytes(path) + else: + segment, path = path.split("/", 1) + environ["PATH_INFO"] = "/" + path + environ["SCRIPT_NAME"] = script_name + segment + rv = wsgi_get_bytes(segment) + + return to_unicode(rv, charset, errors, allow_none_charset=True) + + +def peek_path_info(environ, charset="utf-8", errors="replace"): + """Returns the next segment on the `PATH_INFO` or `None` if there + is none. Works like :func:`pop_path_info` without modifying the + environment: + + >>> env = {'SCRIPT_NAME': '/foo', 'PATH_INFO': '/a/b'} + >>> peek_path_info(env) + 'a' + >>> peek_path_info(env) + 'a' + + If the `charset` is set to `None` a bytestring is returned. + + .. versionadded:: 0.5 + + .. versionchanged:: 0.9 + The path is now decoded and a charset and encoding + parameter can be provided. + + :param environ: the WSGI environment that is checked. + """ + segments = environ.get("PATH_INFO", "").lstrip("/").split("/", 1) + if segments: + return to_unicode( + wsgi_get_bytes(segments[0]), charset, errors, allow_none_charset=True + ) + + +def extract_path_info( + environ_or_baseurl, + path_or_url, + charset="utf-8", + errors="werkzeug.url_quote", + collapse_http_schemes=True, +): + """Extracts the path info from the given URL (or WSGI environment) and + path. The path info returned is a unicode string, not a bytestring + suitable for a WSGI environment. The URLs might also be IRIs. + + If the path info could not be determined, `None` is returned. + + Some examples: + + >>> extract_path_info('http://example.com/app', '/app/hello') + u'/hello' + >>> extract_path_info('http://example.com/app', + ... 'https://example.com/app/hello') + u'/hello' + >>> extract_path_info('http://example.com/app', + ... 'https://example.com/app/hello', + ... collapse_http_schemes=False) is None + True + + Instead of providing a base URL you can also pass a WSGI environment. + + :param environ_or_baseurl: a WSGI environment dict, a base URL or + base IRI. This is the root of the + application. + :param path_or_url: an absolute path from the server root, a + relative path (in which case it's the path info) + or a full URL. Also accepts IRIs and unicode + parameters. + :param charset: the charset for byte data in URLs + :param errors: the error handling on decode + :param collapse_http_schemes: if set to `False` the algorithm does + not assume that http and https on the + same server point to the same + resource. + + .. versionchanged:: 0.15 + The ``errors`` parameter defaults to leaving invalid bytes + quoted instead of replacing them. + + .. versionadded:: 0.6 + """ + + def _normalize_netloc(scheme, netloc): + parts = netloc.split(u"@", 1)[-1].split(u":", 1) + if len(parts) == 2: + netloc, port = parts + if (scheme == u"http" and port == u"80") or ( + scheme == u"https" and port == u"443" + ): + port = None + else: + netloc = parts[0] + port = None + if port is not None: + netloc += u":" + port + return netloc + + # make sure whatever we are working on is a IRI and parse it + path = uri_to_iri(path_or_url, charset, errors) + if isinstance(environ_or_baseurl, dict): + environ_or_baseurl = get_current_url(environ_or_baseurl, root_only=True) + base_iri = uri_to_iri(environ_or_baseurl, charset, errors) + base_scheme, base_netloc, base_path = url_parse(base_iri)[:3] + cur_scheme, cur_netloc, cur_path, = url_parse(url_join(base_iri, path))[:3] + + # normalize the network location + base_netloc = _normalize_netloc(base_scheme, base_netloc) + cur_netloc = _normalize_netloc(cur_scheme, cur_netloc) + + # is that IRI even on a known HTTP scheme? + if collapse_http_schemes: + for scheme in base_scheme, cur_scheme: + if scheme not in (u"http", u"https"): + return None + else: + if not (base_scheme in (u"http", u"https") and base_scheme == cur_scheme): + return None + + # are the netlocs compatible? + if base_netloc != cur_netloc: + return None + + # are we below the application path? + base_path = base_path.rstrip(u"/") + if not cur_path.startswith(base_path): + return None + + return u"/" + cur_path[len(base_path) :].lstrip(u"/") + + +@implements_iterator +class ClosingIterator(object): + """The WSGI specification requires that all middlewares and gateways + respect the `close` callback of the iterable returned by the application. + Because it is useful to add another close action to a returned iterable + and adding a custom iterable is a boring task this class can be used for + that:: + + return ClosingIterator(app(environ, start_response), [cleanup_session, + cleanup_locals]) + + If there is just one close function it can be passed instead of the list. + + A closing iterator is not needed if the application uses response objects + and finishes the processing if the response is started:: + + try: + return response(environ, start_response) + finally: + cleanup_session() + cleanup_locals() + """ + + def __init__(self, iterable, callbacks=None): + iterator = iter(iterable) + self._next = partial(next, iterator) + if callbacks is None: + callbacks = [] + elif callable(callbacks): + callbacks = [callbacks] + else: + callbacks = list(callbacks) + iterable_close = getattr(iterable, "close", None) + if iterable_close: + callbacks.insert(0, iterable_close) + self._callbacks = callbacks + + def __iter__(self): + return self + + def __next__(self): + return self._next() + + def close(self): + for callback in self._callbacks: + callback() + + +def wrap_file(environ, file, buffer_size=8192): + """Wraps a file. This uses the WSGI server's file wrapper if available + or otherwise the generic :class:`FileWrapper`. + + .. versionadded:: 0.5 + + If the file wrapper from the WSGI server is used it's important to not + iterate over it from inside the application but to pass it through + unchanged. If you want to pass out a file wrapper inside a response + object you have to set :attr:`~BaseResponse.direct_passthrough` to `True`. + + More information about file wrappers are available in :pep:`333`. + + :param file: a :class:`file`-like object with a :meth:`~file.read` method. + :param buffer_size: number of bytes for one iteration. + """ + return environ.get("wsgi.file_wrapper", FileWrapper)(file, buffer_size) + + +@implements_iterator +class FileWrapper(object): + """This class can be used to convert a :class:`file`-like object into + an iterable. It yields `buffer_size` blocks until the file is fully + read. + + You should not use this class directly but rather use the + :func:`wrap_file` function that uses the WSGI server's file wrapper + support if it's available. + + .. versionadded:: 0.5 + + If you're using this object together with a :class:`BaseResponse` you have + to use the `direct_passthrough` mode. + + :param file: a :class:`file`-like object with a :meth:`~file.read` method. + :param buffer_size: number of bytes for one iteration. + """ + + def __init__(self, file, buffer_size=8192): + self.file = file + self.buffer_size = buffer_size + + def close(self): + if hasattr(self.file, "close"): + self.file.close() + + def seekable(self): + if hasattr(self.file, "seekable"): + return self.file.seekable() + if hasattr(self.file, "seek"): + return True + return False + + def seek(self, *args): + if hasattr(self.file, "seek"): + self.file.seek(*args) + + def tell(self): + if hasattr(self.file, "tell"): + return self.file.tell() + return None + + def __iter__(self): + return self + + def __next__(self): + data = self.file.read(self.buffer_size) + if data: + return data + raise StopIteration() + + +@implements_iterator +class _RangeWrapper(object): + # private for now, but should we make it public in the future ? + + """This class can be used to convert an iterable object into + an iterable that will only yield a piece of the underlying content. + It yields blocks until the underlying stream range is fully read. + The yielded blocks will have a size that can't exceed the original + iterator defined block size, but that can be smaller. + + If you're using this object together with a :class:`BaseResponse` you have + to use the `direct_passthrough` mode. + + :param iterable: an iterable object with a :meth:`__next__` method. + :param start_byte: byte from which read will start. + :param byte_range: how many bytes to read. + """ + + def __init__(self, iterable, start_byte=0, byte_range=None): + self.iterable = iter(iterable) + self.byte_range = byte_range + self.start_byte = start_byte + self.end_byte = None + if byte_range is not None: + self.end_byte = self.start_byte + self.byte_range + self.read_length = 0 + self.seekable = hasattr(iterable, "seekable") and iterable.seekable() + self.end_reached = False + + def __iter__(self): + return self + + def _next_chunk(self): + try: + chunk = next(self.iterable) + self.read_length += len(chunk) + return chunk + except StopIteration: + self.end_reached = True + raise + + def _first_iteration(self): + chunk = None + if self.seekable: + self.iterable.seek(self.start_byte) + self.read_length = self.iterable.tell() + contextual_read_length = self.read_length + else: + while self.read_length <= self.start_byte: + chunk = self._next_chunk() + if chunk is not None: + chunk = chunk[self.start_byte - self.read_length :] + contextual_read_length = self.start_byte + return chunk, contextual_read_length + + def _next(self): + if self.end_reached: + raise StopIteration() + chunk = None + contextual_read_length = self.read_length + if self.read_length == 0: + chunk, contextual_read_length = self._first_iteration() + if chunk is None: + chunk = self._next_chunk() + if self.end_byte is not None and self.read_length >= self.end_byte: + self.end_reached = True + return chunk[: self.end_byte - contextual_read_length] + return chunk + + def __next__(self): + chunk = self._next() + if chunk: + return chunk + self.end_reached = True + raise StopIteration() + + def close(self): + if hasattr(self.iterable, "close"): + self.iterable.close() + + +def _make_chunk_iter(stream, limit, buffer_size): + """Helper for the line and chunk iter functions.""" + if isinstance(stream, (bytes, bytearray, text_type)): + raise TypeError( + "Passed a string or byte object instead of true iterator or stream." + ) + if not hasattr(stream, "read"): + for item in stream: + if item: + yield item + return + if not isinstance(stream, LimitedStream) and limit is not None: + stream = LimitedStream(stream, limit) + _read = stream.read + while 1: + item = _read(buffer_size) + if not item: + break + yield item + + +def make_line_iter(stream, limit=None, buffer_size=10 * 1024, cap_at_buffer=False): + """Safely iterates line-based over an input stream. If the input stream + is not a :class:`LimitedStream` the `limit` parameter is mandatory. + + This uses the stream's :meth:`~file.read` method internally as opposite + to the :meth:`~file.readline` method that is unsafe and can only be used + in violation of the WSGI specification. The same problem applies to the + `__iter__` function of the input stream which calls :meth:`~file.readline` + without arguments. + + If you need line-by-line processing it's strongly recommended to iterate + over the input stream using this helper function. + + .. versionchanged:: 0.8 + This function now ensures that the limit was reached. + + .. versionadded:: 0.9 + added support for iterators as input stream. + + .. versionadded:: 0.11.10 + added support for the `cap_at_buffer` parameter. + + :param stream: the stream or iterate to iterate over. + :param limit: the limit in bytes for the stream. (Usually + content length. Not necessary if the `stream` + is a :class:`LimitedStream`. + :param buffer_size: The optional buffer size. + :param cap_at_buffer: if this is set chunks are split if they are longer + than the buffer size. Internally this is implemented + that the buffer size might be exhausted by a factor + of two however. + """ + _iter = _make_chunk_iter(stream, limit, buffer_size) + + first_item = next(_iter, "") + if not first_item: + return + + s = make_literal_wrapper(first_item) + empty = s("") + cr = s("\r") + lf = s("\n") + crlf = s("\r\n") + + _iter = chain((first_item,), _iter) + + def _iter_basic_lines(): + _join = empty.join + buffer = [] + while 1: + new_data = next(_iter, "") + if not new_data: + break + new_buf = [] + buf_size = 0 + for item in chain(buffer, new_data.splitlines(True)): + new_buf.append(item) + buf_size += len(item) + if item and item[-1:] in crlf: + yield _join(new_buf) + new_buf = [] + elif cap_at_buffer and buf_size >= buffer_size: + rv = _join(new_buf) + while len(rv) >= buffer_size: + yield rv[:buffer_size] + rv = rv[buffer_size:] + new_buf = [rv] + buffer = new_buf + if buffer: + yield _join(buffer) + + # This hackery is necessary to merge 'foo\r' and '\n' into one item + # of 'foo\r\n' if we were unlucky and we hit a chunk boundary. + previous = empty + for item in _iter_basic_lines(): + if item == lf and previous[-1:] == cr: + previous += item + item = empty + if previous: + yield previous + previous = item + if previous: + yield previous + + +def make_chunk_iter( + stream, separator, limit=None, buffer_size=10 * 1024, cap_at_buffer=False +): + """Works like :func:`make_line_iter` but accepts a separator + which divides chunks. If you want newline based processing + you should use :func:`make_line_iter` instead as it + supports arbitrary newline markers. + + .. versionadded:: 0.8 + + .. versionadded:: 0.9 + added support for iterators as input stream. + + .. versionadded:: 0.11.10 + added support for the `cap_at_buffer` parameter. + + :param stream: the stream or iterate to iterate over. + :param separator: the separator that divides chunks. + :param limit: the limit in bytes for the stream. (Usually + content length. Not necessary if the `stream` + is otherwise already limited). + :param buffer_size: The optional buffer size. + :param cap_at_buffer: if this is set chunks are split if they are longer + than the buffer size. Internally this is implemented + that the buffer size might be exhausted by a factor + of two however. + """ + _iter = _make_chunk_iter(stream, limit, buffer_size) + + first_item = next(_iter, "") + if not first_item: + return + + _iter = chain((first_item,), _iter) + if isinstance(first_item, text_type): + separator = to_unicode(separator) + _split = re.compile(r"(%s)" % re.escape(separator)).split + _join = u"".join + else: + separator = to_bytes(separator) + _split = re.compile(b"(" + re.escape(separator) + b")").split + _join = b"".join + + buffer = [] + while 1: + new_data = next(_iter, "") + if not new_data: + break + chunks = _split(new_data) + new_buf = [] + buf_size = 0 + for item in chain(buffer, chunks): + if item == separator: + yield _join(new_buf) + new_buf = [] + buf_size = 0 + else: + buf_size += len(item) + new_buf.append(item) + + if cap_at_buffer and buf_size >= buffer_size: + rv = _join(new_buf) + while len(rv) >= buffer_size: + yield rv[:buffer_size] + rv = rv[buffer_size:] + new_buf = [rv] + buf_size = len(rv) + + buffer = new_buf + if buffer: + yield _join(buffer) + + +@implements_iterator +class LimitedStream(io.IOBase): + """Wraps a stream so that it doesn't read more than n bytes. If the + stream is exhausted and the caller tries to get more bytes from it + :func:`on_exhausted` is called which by default returns an empty + string. The return value of that function is forwarded + to the reader function. So if it returns an empty string + :meth:`read` will return an empty string as well. + + The limit however must never be higher than what the stream can + output. Otherwise :meth:`readlines` will try to read past the + limit. + + .. admonition:: Note on WSGI compliance + + calls to :meth:`readline` and :meth:`readlines` are not + WSGI compliant because it passes a size argument to the + readline methods. Unfortunately the WSGI PEP is not safely + implementable without a size argument to :meth:`readline` + because there is no EOF marker in the stream. As a result + of that the use of :meth:`readline` is discouraged. + + For the same reason iterating over the :class:`LimitedStream` + is not portable. It internally calls :meth:`readline`. + + We strongly suggest using :meth:`read` only or using the + :func:`make_line_iter` which safely iterates line-based + over a WSGI input stream. + + :param stream: the stream to wrap. + :param limit: the limit for the stream, must not be longer than + what the string can provide if the stream does not + end with `EOF` (like `wsgi.input`) + """ + + def __init__(self, stream, limit): + self._read = stream.read + self._readline = stream.readline + self._pos = 0 + self.limit = limit + + def __iter__(self): + return self + + @property + def is_exhausted(self): + """If the stream is exhausted this attribute is `True`.""" + return self._pos >= self.limit + + def on_exhausted(self): + """This is called when the stream tries to read past the limit. + The return value of this function is returned from the reading + function. + """ + # Read null bytes from the stream so that we get the + # correct end of stream marker. + return self._read(0) + + def on_disconnect(self): + """What should happen if a disconnect is detected? The return + value of this function is returned from read functions in case + the client went away. By default a + :exc:`~werkzeug.exceptions.ClientDisconnected` exception is raised. + """ + from .exceptions import ClientDisconnected + + raise ClientDisconnected() + + def exhaust(self, chunk_size=1024 * 64): + """Exhaust the stream. This consumes all the data left until the + limit is reached. + + :param chunk_size: the size for a chunk. It will read the chunk + until the stream is exhausted and throw away + the results. + """ + to_read = self.limit - self._pos + chunk = chunk_size + while to_read > 0: + chunk = min(to_read, chunk) + self.read(chunk) + to_read -= chunk + + def read(self, size=None): + """Read `size` bytes or if size is not provided everything is read. + + :param size: the number of bytes read. + """ + if self._pos >= self.limit: + return self.on_exhausted() + if size is None or size == -1: # -1 is for consistence with file + size = self.limit + to_read = min(self.limit - self._pos, size) + try: + read = self._read(to_read) + except (IOError, ValueError): + return self.on_disconnect() + if to_read and len(read) != to_read: + return self.on_disconnect() + self._pos += len(read) + return read + + def readline(self, size=None): + """Reads one line from the stream.""" + if self._pos >= self.limit: + return self.on_exhausted() + if size is None: + size = self.limit - self._pos + else: + size = min(size, self.limit - self._pos) + try: + line = self._readline(size) + except (ValueError, IOError): + return self.on_disconnect() + if size and not line: + return self.on_disconnect() + self._pos += len(line) + return line + + def readlines(self, size=None): + """Reads a file into a list of strings. It calls :meth:`readline` + until the file is read to the end. It does support the optional + `size` argument if the underlaying stream supports it for + `readline`. + """ + last_pos = self._pos + result = [] + if size is not None: + end = min(self.limit, last_pos + size) + else: + end = self.limit + while 1: + if size is not None: + size -= last_pos - self._pos + if self._pos >= end: + break + result.append(self.readline(size)) + if size is not None: + last_pos = self._pos + return result + + def tell(self): + """Returns the position of the stream. + + .. versionadded:: 0.9 + """ + return self._pos + + def __next__(self): + line = self.readline() + if not line: + raise StopIteration() + return line + + def readable(self): + return True + + +from werkzeug import _DeprecatedImportModule + +_DeprecatedImportModule( + __name__, + { + ".middleware.dispatcher": ["DispatcherMiddleware"], + ".middleware.http_proxy": ["ProxyMiddleware"], + ".middleware.shared_data": ["SharedDataMiddleware"], + }, + "Werkzeug 1.0", +) diff --git a/env/Lib/site-packages/wheel-0.33.6.dist-info/INSTALLER b/env/Lib/site-packages/wheel-0.33.6.dist-info/INSTALLER new file mode 100644 index 0000000..a1b589e --- /dev/null +++ b/env/Lib/site-packages/wheel-0.33.6.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/env/Lib/site-packages/wheel-0.33.6.dist-info/LICENSE.txt b/env/Lib/site-packages/wheel-0.33.6.dist-info/LICENSE.txt new file mode 100644 index 0000000..c3441e6 --- /dev/null +++ b/env/Lib/site-packages/wheel-0.33.6.dist-info/LICENSE.txt @@ -0,0 +1,22 @@ +"wheel" copyright (c) 2012-2014 Daniel Holth and +contributors. + +The MIT License + +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. diff --git a/env/Lib/site-packages/wheel-0.33.6.dist-info/METADATA b/env/Lib/site-packages/wheel-0.33.6.dist-info/METADATA new file mode 100644 index 0000000..a178cf9 --- /dev/null +++ b/env/Lib/site-packages/wheel-0.33.6.dist-info/METADATA @@ -0,0 +1,61 @@ +Metadata-Version: 2.1 +Name: wheel +Version: 0.33.6 +Summary: A built-package format for Python. +Home-page: https://github.com/pypa/wheel +Author: Daniel Holth +Author-email: dholth@fastmail.fm +Maintainer: Alex Grönholm +Maintainer-email: alex.gronholm@nextday.fi +License: MIT +Project-URL: Documentation, https://wheel.readthedocs.io/ +Project-URL: Changelog, https://wheel.readthedocs.io/en/stable/news.html +Project-URL: Issue Tracker, https://github.com/pypa/wheel/issues +Keywords: wheel,packaging +Platform: UNKNOWN +Classifier: Development Status :: 5 - Production/Stable +Classifier: Intended Audience :: Developers +Classifier: Topic :: System :: Archiving :: Packaging +Classifier: License :: OSI Approved :: MIT License +Classifier: Programming Language :: Python +Classifier: Programming Language :: Python :: 2 +Classifier: Programming Language :: Python :: 2.7 +Classifier: Programming Language :: Python :: 3 +Classifier: Programming Language :: Python :: 3.4 +Classifier: Programming Language :: Python :: 3.5 +Classifier: Programming Language :: Python :: 3.6 +Classifier: Programming Language :: Python :: 3.7 +Classifier: Programming Language :: Python :: 3.8 +Requires-Python: >=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.* +Provides-Extra: test +Requires-Dist: pytest (>=3.0.0) ; extra == 'test' +Requires-Dist: pytest-cov ; extra == 'test' + +wheel +===== + +This library is the reference implementation of the Python wheel packaging +standard, as defined in `PEP 427`_. + +It has two different roles: + +#. A setuptools_ extension for building wheels that provides the + ``bdist_wheel`` setuptools command +#. A command line tool for working with wheel files + +It should be noted that wheel is **not** intended to be used as a library, and +as such there is no stable, public API. + +.. _PEP 427: https://www.python.org/dev/peps/pep-0427/ +.. _setuptools: https://pypi.org/project/setuptools/ + + +Code of Conduct +--------------- + +Everyone interacting in the wheel project's codebases, issue trackers, chat +rooms, and mailing lists is expected to follow the `PyPA Code of Conduct`_. + +.. _PyPA Code of Conduct: https://www.pypa.io/en/latest/code-of-conduct/ + + diff --git a/env/Lib/site-packages/wheel-0.33.6.dist-info/RECORD b/env/Lib/site-packages/wheel-0.33.6.dist-info/RECORD new file mode 100644 index 0000000..cda949d --- /dev/null +++ b/env/Lib/site-packages/wheel-0.33.6.dist-info/RECORD @@ -0,0 +1,32 @@ +../../Scripts/wheel.exe,sha256=zvWsfrUcafJF-44pK1-ImqokurvCfUvm2CimM-4kWQY,103286 +wheel-0.33.6.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +wheel-0.33.6.dist-info/LICENSE.txt,sha256=zKniDGrx_Pv2lAjzd3aShsvuvN7TNhAMm0o_NfvmNeQ,1125 +wheel-0.33.6.dist-info/METADATA,sha256=KO7TWvGpQ5MYnuiYromCLu30km3ky2B5cd9FSJrcSnM,2132 +wheel-0.33.6.dist-info/RECORD,, +wheel-0.33.6.dist-info/WHEEL,sha256=8zNYZbwQSXoB9IfXOjPfeNwvAsALAjffgk27FqvCWbo,110 +wheel-0.33.6.dist-info/entry_points.txt,sha256=N8HbYFST3yrNQYeB2wXWBEPUhFsEtKNRPaCFGJPyqyc,108 +wheel-0.33.6.dist-info/top_level.txt,sha256=HxSBIbgEstMPe4eFawhA66Mq-QYHMopXVoAncfjb_1c,6 +wheel/__init__.py,sha256=RWEKk9qMOFpl4Allx7f4DFZuTFptgoqdhMpTvtpOgVI,96 +wheel/__main__.py,sha256=lF-YLO4hdQmoWuh4eWZd8YL1U95RSdm76sNLBXa0vjE,417 +wheel/__pycache__/__init__.cpython-37.pyc,, +wheel/__pycache__/__main__.cpython-37.pyc,, +wheel/__pycache__/bdist_wheel.cpython-37.pyc,, +wheel/__pycache__/metadata.cpython-37.pyc,, +wheel/__pycache__/pep425tags.cpython-37.pyc,, +wheel/__pycache__/pkginfo.cpython-37.pyc,, +wheel/__pycache__/util.cpython-37.pyc,, +wheel/__pycache__/wheelfile.cpython-37.pyc,, +wheel/bdist_wheel.py,sha256=U3ljAOGgc8UGMKqxOf5YEKE1W-nt99X6RemMi-poBB8,14757 +wheel/cli/__init__.py,sha256=GWSoGUpRabTf8bk3FsNTPrc5Fsr8YOv2dX55iY2W7eY,2572 +wheel/cli/__pycache__/__init__.cpython-37.pyc,, +wheel/cli/__pycache__/convert.cpython-37.pyc,, +wheel/cli/__pycache__/pack.cpython-37.pyc,, +wheel/cli/__pycache__/unpack.cpython-37.pyc,, +wheel/cli/convert.py,sha256=7F4vj23A2OghDDWn9gX2V-_TeXMza1a5nIejmFGEUJM,9498 +wheel/cli/pack.py,sha256=vkvZc4-rRZyWiwc6sHjpqIjzwDRMEF5u3JUNU9NY_jA,2263 +wheel/cli/unpack.py,sha256=0VWzT7U_xyenTPwEVavxqvdee93GPvAFHnR3Uu91aRc,673 +wheel/metadata.py,sha256=uBv2aOz4U2sERF834C8DeNo235drcsp3ypTzT7MTWEA,4699 +wheel/pep425tags.py,sha256=AJ2m8gzMl4DzShFjd2TrHZU_DqxndgSj8U3fzskq720,6087 +wheel/pkginfo.py,sha256=GR76kupQzn1x9sKDaXuE6B6FsZ4OkfRtG7pndlXPvQ4,1257 +wheel/util.py,sha256=zwVIk-9qWVQLRMgkgQTMp4TRE4HY03-tCUxLrtCpsfU,924 +wheel/wheelfile.py,sha256=Mtt6mUaea-wABqtN5SW3Rn6bVvw-bdcSKaR2SjWZLG4,7222 diff --git a/env/Lib/site-packages/wheel-0.33.6.dist-info/WHEEL b/env/Lib/site-packages/wheel-0.33.6.dist-info/WHEEL new file mode 100644 index 0000000..8b701e9 --- /dev/null +++ b/env/Lib/site-packages/wheel-0.33.6.dist-info/WHEEL @@ -0,0 +1,6 @@ +Wheel-Version: 1.0 +Generator: bdist_wheel (0.33.6) +Root-Is-Purelib: true +Tag: py2-none-any +Tag: py3-none-any + diff --git a/env/Lib/site-packages/wheel-0.33.6.dist-info/entry_points.txt b/env/Lib/site-packages/wheel-0.33.6.dist-info/entry_points.txt new file mode 100644 index 0000000..b27acad --- /dev/null +++ b/env/Lib/site-packages/wheel-0.33.6.dist-info/entry_points.txt @@ -0,0 +1,6 @@ +[console_scripts] +wheel = wheel.cli:main + +[distutils.commands] +bdist_wheel = wheel.bdist_wheel:bdist_wheel + diff --git a/env/Lib/site-packages/wheel-0.33.6.dist-info/top_level.txt b/env/Lib/site-packages/wheel-0.33.6.dist-info/top_level.txt new file mode 100644 index 0000000..2309722 --- /dev/null +++ b/env/Lib/site-packages/wheel-0.33.6.dist-info/top_level.txt @@ -0,0 +1 @@ +wheel diff --git a/env/Lib/site-packages/wheel/__init__.py b/env/Lib/site-packages/wheel/__init__.py new file mode 100644 index 0000000..5df0e1b --- /dev/null +++ b/env/Lib/site-packages/wheel/__init__.py @@ -0,0 +1,2 @@ +# __variables__ with double-quoted values will be available in setup.py: +__version__ = "0.33.6" diff --git a/env/Lib/site-packages/wheel/__main__.py b/env/Lib/site-packages/wheel/__main__.py new file mode 100644 index 0000000..b3773a2 --- /dev/null +++ b/env/Lib/site-packages/wheel/__main__.py @@ -0,0 +1,19 @@ +""" +Wheel command line tool (enable python -m wheel syntax) +""" + +import sys + + +def main(): # needed for console script + if __package__ == '': + # To be able to run 'python wheel-0.9.whl/wheel': + import os.path + path = os.path.dirname(os.path.dirname(__file__)) + sys.path[0:0] = [path] + import wheel.cli + sys.exit(wheel.cli.main()) + + +if __name__ == "__main__": + sys.exit(main()) diff --git a/env/Lib/site-packages/wheel/__pycache__/__init__.cpython-37.pyc b/env/Lib/site-packages/wheel/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..11b1ec4e9668bacf957a69a176fa30d00f6e9092 GIT binary patch literal 185 zcmZ?b<>g`kf(iTH#U=ph#~=<2FajA4KwQiLBvKfn7*ZI688n%y*bMZHjrGj@G#PJk z$H$kY78Pga=f%gbWGG?+Dg+b1e4MRfLW_Y?F(JWDF^&ZVE{P?HF+Tapi8(PLsksF) z1(^l9nR&$}i8(pCmKIg<<(cNWG36PlsX0(GK0Y%qvm`!Vub}c4hfQvNN@-529ms;u HK+FIDdZjXc literal 0 HcmV?d00001 diff --git a/env/Lib/site-packages/wheel/__pycache__/__main__.cpython-37.pyc b/env/Lib/site-packages/wheel/__pycache__/__main__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..025044687b36fed516eace285070984c59fe2d70 GIT binary patch literal 578 zcmYk3!EV$r5QaTY()FekIPd^DHWIrhBq*v7v>dAnsYOVuAj`z2o2?T^u~EC#?g_Z_ z2%94>!Grk9i3<=1)EsW&!h(+lAe)#=jI@NH&;q$rKxMt$V^v_%A7Ge+gFYF zpjFl`-P|AP5|C|^Tdxhm!{;r3;uuG;a#{k4r_t$KY4(yXNR?s SpR{@rzQcy2F=Y`;8QcNCc$EwQ literal 0 HcmV?d00001 diff --git a/env/Lib/site-packages/wheel/__pycache__/bdist_wheel.cpython-37.pyc b/env/Lib/site-packages/wheel/__pycache__/bdist_wheel.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f694311b61e9c2aee0ff4a5e8b2ba980156a59e5 GIT binary patch literal 10070 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 OA0n%H&CpH5H2xO}8QdZO literal 0 HcmV?d00001 diff --git a/env/Lib/site-packages/wheel/__pycache__/metadata.cpython-37.pyc b/env/Lib/site-packages/wheel/__pycache__/metadata.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f938b0dc234bdd9348bc625ccd3afb5f40a9840c GIT binary patch literal 3761 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 Rl`Y%0521`XCHu7P{11eUyygG^ literal 0 HcmV?d00001 diff --git a/env/Lib/site-packages/wheel/__pycache__/pkginfo.cpython-37.pyc b/env/Lib/site-packages/wheel/__pycache__/pkginfo.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f4920fcd392cb943674ff2e6ddb94fd70f07bad7 GIT binary patch literal 1556 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 literal 0 HcmV?d00001 diff --git a/env/Lib/site-packages/wheel/cli/__pycache__/pack.cpython-37.pyc b/env/Lib/site-packages/wheel/cli/__pycache__/pack.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3b8925734eab25a16e6167645b81bed2ed31a2f7 GIT binary patch literal 2485 zcmbtWPj4GV6rb5Y{PAZU)y4Jp#dGmJOzu$Y~o0W<~;Q9HF zzaRWrBIGYzoIWN@K808A0%3&Fh;*q>Db9_^@J&5hzNJUow_!A+LbvD_wTu;&x@Esi z3AaWLv&Yn*V+B@xN_>|Yd!$x+0q2q$&8w*hW7TZ;;+6`Ncn4U{{SN2Rwh)PcRaviY zhY=rq_}%J_uQuYK%O7*Gc{<;$U%63R!xeHHtp47OTCGuMp;T*O+)mzZp)>eY;Vr|9 zYsn}fKaw_Olo?M;ij3$pGNxPPm<~;4Wacqt<|9jdpiE|sEZjS$KhStFGv#gI*)v{d zvcd`(TFM?3GHXmnMOGZsp`95b&TLl7j3siN3~dEk9+pSWGm=@XJO&NV-yIg11Nuo; z(3*=`QT_&}&y6fR2{qm)%>A0|l5dHcV-;2f*&@n;Z?MZh8I-8% z!}-y|m{5{cMi($Tl$^1&!j_H^EH0#aIk*X--sNe~dgKLOD){3t>B;EG>&3|9%YD4<#j^n|z-{IaYxmWLhzP)|d!+o#Ylgeu)u?oW2OJeRN z!s{l2dn!1To=iN|2^0`yh(oUQaTC@0djyu(3S#eodyFeCx?#-ORPA~ih@d;Oaa|ko zUmobAPe0*OHNm%aZwqE&93akT2YIWEw}W1!qz6u;b*-KdJXSN2nm(=tQPhtC6zY{+ zgjZeza!4}rV0B0#k#uBeY68e8B$5hCStA?fFw5vK#`o49`JL1Xxsk}+N(0r&?NEYw zx%Ds!6NP!r1u&gCEB0N`a)@NcbFf4;BUqS@K6i_h3#>)VPTzc)K7c&5s_hdMD zXD9g|Vge8Li_>;%2gmb58jYwbOe2J67dl<7$_TKg^Y|bnZ&Z5)G?osd0>hKAgEd* zC<sy}X=8fkHQc2Lf0Exucs$ z6ML6$^xHa#5O1_bU{PROYdxyKOm|1(EE_Iepcbu~CAwf*)HN^DDy$21(OjhXdkZ)& zj1IkI2uwZKSE71?H=6=enimsUN2QZ^8-fe0Jin~XsY4gjQTOL3YfUjylc*N4 mr{PK`167CB&#R9_qT$9PLI~Qb7f=zjRnaOaENiFPurJwOLYw4Nt_XfY za^z3&Lwx1b3qJsHU}h5#BhAGBsYU$mB%J2^8E|Q zhWgg=NXm3CNu{OT7?nsKa0_?`Sic2f$c&uRFMD$~V`I8tf-dRYG0xascr!Y4mTc}C zU$8}E<}N7$`phUX&2eiHED0quw%EWQN{)%}UXoYjH35779Lw#zdmix# zLh1$q2dd%mxX6vn4WA@w%HK&|)uvK#Q}C&f+RX1x^C*+^t?37;=65iJl6r>mI*}ZWd6WxY+w;U|4vrc+v(DQqBNb&}Z$>?SSbLfgro$*}fQWBxhZuT%7i5x0 z*kCRaC1X>lQ+`{>VN|6Cz2izLEacyBr(46b4MYSG&aSQ6kmM&|-{aGHx7)QiDM#jF z-?A6aI&I~`NW#kiQA;rx!tl`BdMB!=O3MmuT?B63agpTKt4DABVWG0fSVx~~>uV#5 z%2;ohR(fOu`O&B-Hc^^(Jk^Hi*2R)SHW?}(lWpL0UE4RJZh-FB{!Xudq@iv7!-MVq z)3V%+Ow@l~#8KKmlv&v?lX5G`HHO`K_~2|XN$zL;x_N6Er%8V`%WipU{nZs0Pj7-C zt$?=aCcR1ndY!3Tpy^PByV+^lU;xW(DkTR4g==dYh3;b2Y6D*C3W%^(=feKf9jhbM c(Ek%R(YN_1D@2vb#}r<=38KxKw8`4eA2@;swEzGB literal 0 HcmV?d00001 diff --git a/env/Lib/site-packages/wheel/cli/convert.py b/env/Lib/site-packages/wheel/cli/convert.py new file mode 100644 index 0000000..154f1b1 --- /dev/null +++ b/env/Lib/site-packages/wheel/cli/convert.py @@ -0,0 +1,269 @@ +import os.path +import re +import shutil +import sys +import tempfile +import zipfile +from distutils import dist +from glob import iglob + +from ..bdist_wheel import bdist_wheel +from ..wheelfile import WheelFile +from . import WheelError, require_pkgresources + +egg_info_re = re.compile(r''' + (?P.+?)-(?P.+?) + (-(?Ppy\d\.\d+) + (-(?P.+?))? + )?.egg$''', re.VERBOSE) + + +class _bdist_wheel_tag(bdist_wheel): + # allow the client to override the default generated wheel tag + # The default bdist_wheel implementation uses python and abi tags + # of the running python process. This is not suitable for + # generating/repackaging prebuild binaries. + + full_tag_supplied = False + full_tag = None # None or a (pytag, soabitag, plattag) triple + + def get_tag(self): + if self.full_tag_supplied and self.full_tag is not None: + return self.full_tag + else: + return bdist_wheel.get_tag(self) + + +def egg2wheel(egg_path, dest_dir): + filename = os.path.basename(egg_path) + match = egg_info_re.match(filename) + if not match: + raise WheelError('Invalid egg file name: {}'.format(filename)) + + egg_info = match.groupdict() + dir = tempfile.mkdtemp(suffix="_e2w") + if os.path.isfile(egg_path): + # assume we have a bdist_egg otherwise + with zipfile.ZipFile(egg_path) as egg: + egg.extractall(dir) + else: + # support buildout-style installed eggs directories + for pth in os.listdir(egg_path): + src = os.path.join(egg_path, pth) + if os.path.isfile(src): + shutil.copy2(src, dir) + else: + shutil.copytree(src, os.path.join(dir, pth)) + + pyver = egg_info['pyver'] + if pyver: + pyver = egg_info['pyver'] = pyver.replace('.', '') + + arch = (egg_info['arch'] or 'any').replace('.', '_').replace('-', '_') + + # assume all binary eggs are for CPython + abi = 'cp' + pyver[2:] if arch != 'any' else 'none' + + root_is_purelib = egg_info['arch'] is None + if root_is_purelib: + bw = bdist_wheel(dist.Distribution()) + else: + bw = _bdist_wheel_tag(dist.Distribution()) + + bw.root_is_pure = root_is_purelib + bw.python_tag = pyver + bw.plat_name_supplied = True + bw.plat_name = egg_info['arch'] or 'any' + if not root_is_purelib: + bw.full_tag_supplied = True + bw.full_tag = (pyver, abi, arch) + + dist_info_dir = os.path.join(dir, '{name}-{ver}.dist-info'.format(**egg_info)) + bw.egg2dist(os.path.join(dir, 'EGG-INFO'), dist_info_dir) + bw.write_wheelfile(dist_info_dir, generator='egg2wheel') + wheel_name = '{name}-{ver}-{pyver}-{}-{}.whl'.format(abi, arch, **egg_info) + with WheelFile(os.path.join(dest_dir, wheel_name), 'w') as wf: + wf.write_files(dir) + + shutil.rmtree(dir) + + +def parse_wininst_info(wininfo_name, egginfo_name): + """Extract metadata from filenames. + + Extracts the 4 metadataitems needed (name, version, pyversion, arch) from + the installer filename and the name of the egg-info directory embedded in + the zipfile (if any). + + The egginfo filename has the format:: + + name-ver(-pyver)(-arch).egg-info + + The installer filename has the format:: + + name-ver.arch(-pyver).exe + + Some things to note: + + 1. The installer filename is not definitive. An installer can be renamed + and work perfectly well as an installer. So more reliable data should + be used whenever possible. + 2. The egg-info data should be preferred for the name and version, because + these come straight from the distutils metadata, and are mandatory. + 3. The pyver from the egg-info data should be ignored, as it is + constructed from the version of Python used to build the installer, + which is irrelevant - the installer filename is correct here (even to + the point that when it's not there, any version is implied). + 4. The architecture must be taken from the installer filename, as it is + not included in the egg-info data. + 5. Architecture-neutral installers still have an architecture because the + installer format itself (being executable) is architecture-specific. We + should therefore ignore the architecture if the content is pure-python. + """ + + egginfo = None + if egginfo_name: + egginfo = egg_info_re.search(egginfo_name) + if not egginfo: + raise ValueError("Egg info filename %s is not valid" % (egginfo_name,)) + + # Parse the wininst filename + # 1. Distribution name (up to the first '-') + w_name, sep, rest = wininfo_name.partition('-') + if not sep: + raise ValueError("Installer filename %s is not valid" % (wininfo_name,)) + + # Strip '.exe' + rest = rest[:-4] + # 2. Python version (from the last '-', must start with 'py') + rest2, sep, w_pyver = rest.rpartition('-') + if sep and w_pyver.startswith('py'): + rest = rest2 + w_pyver = w_pyver.replace('.', '') + else: + # Not version specific - use py2.py3. While it is possible that + # pure-Python code is not compatible with both Python 2 and 3, there + # is no way of knowing from the wininst format, so we assume the best + # here (the user can always manually rename the wheel to be more + # restrictive if needed). + w_pyver = 'py2.py3' + # 3. Version and architecture + w_ver, sep, w_arch = rest.rpartition('.') + if not sep: + raise ValueError("Installer filename %s is not valid" % (wininfo_name,)) + + if egginfo: + w_name = egginfo.group('name') + w_ver = egginfo.group('ver') + + return {'name': w_name, 'ver': w_ver, 'arch': w_arch, 'pyver': w_pyver} + + +def wininst2wheel(path, dest_dir): + with zipfile.ZipFile(path) as bdw: + # Search for egg-info in the archive + egginfo_name = None + for filename in bdw.namelist(): + if '.egg-info' in filename: + egginfo_name = filename + break + + info = parse_wininst_info(os.path.basename(path), egginfo_name) + + root_is_purelib = True + for zipinfo in bdw.infolist(): + if zipinfo.filename.startswith('PLATLIB'): + root_is_purelib = False + break + if root_is_purelib: + paths = {'purelib': ''} + else: + paths = {'platlib': ''} + + dist_info = "%(name)s-%(ver)s" % info + datadir = "%s.data/" % dist_info + + # rewrite paths to trick ZipFile into extracting an egg + # XXX grab wininst .ini - between .exe, padding, and first zip file. + members = [] + egginfo_name = '' + for zipinfo in bdw.infolist(): + key, basename = zipinfo.filename.split('/', 1) + key = key.lower() + basepath = paths.get(key, None) + if basepath is None: + basepath = datadir + key.lower() + '/' + oldname = zipinfo.filename + newname = basepath + basename + zipinfo.filename = newname + del bdw.NameToInfo[oldname] + bdw.NameToInfo[newname] = zipinfo + # Collect member names, but omit '' (from an entry like "PLATLIB/" + if newname: + members.append(newname) + # Remember egg-info name for the egg2dist call below + if not egginfo_name: + if newname.endswith('.egg-info'): + egginfo_name = newname + elif '.egg-info/' in newname: + egginfo_name, sep, _ = newname.rpartition('/') + dir = tempfile.mkdtemp(suffix="_b2w") + bdw.extractall(dir, members) + + # egg2wheel + abi = 'none' + pyver = info['pyver'] + arch = (info['arch'] or 'any').replace('.', '_').replace('-', '_') + # Wininst installers always have arch even if they are not + # architecture-specific (because the format itself is). + # So, assume the content is architecture-neutral if root is purelib. + if root_is_purelib: + arch = 'any' + # If the installer is architecture-specific, it's almost certainly also + # CPython-specific. + if arch != 'any': + pyver = pyver.replace('py', 'cp') + wheel_name = '-'.join((dist_info, pyver, abi, arch)) + if root_is_purelib: + bw = bdist_wheel(dist.Distribution()) + else: + bw = _bdist_wheel_tag(dist.Distribution()) + + bw.root_is_pure = root_is_purelib + bw.python_tag = pyver + bw.plat_name_supplied = True + bw.plat_name = info['arch'] or 'any' + + if not root_is_purelib: + bw.full_tag_supplied = True + bw.full_tag = (pyver, abi, arch) + + dist_info_dir = os.path.join(dir, '%s.dist-info' % dist_info) + bw.egg2dist(os.path.join(dir, egginfo_name), dist_info_dir) + bw.write_wheelfile(dist_info_dir, generator='wininst2wheel') + + wheel_path = os.path.join(dest_dir, wheel_name) + with WheelFile(wheel_path, 'w') as wf: + wf.write_files(dir) + + shutil.rmtree(dir) + + +def convert(files, dest_dir, verbose): + # Only support wheel convert if pkg_resources is present + require_pkgresources('wheel convert') + + for pat in files: + for installer in iglob(pat): + if os.path.splitext(installer)[1] == '.egg': + conv = egg2wheel + else: + conv = wininst2wheel + + if verbose: + print("{}... ".format(installer)) + sys.stdout.flush() + + conv(installer, dest_dir) + if verbose: + print("OK") diff --git a/env/Lib/site-packages/wheel/cli/pack.py b/env/Lib/site-packages/wheel/cli/pack.py new file mode 100644 index 0000000..af6e81c --- /dev/null +++ b/env/Lib/site-packages/wheel/cli/pack.py @@ -0,0 +1,58 @@ +from __future__ import print_function + +import os.path +import re +import sys + +from wheel.cli import WheelError +from wheel.wheelfile import WheelFile + +DIST_INFO_RE = re.compile(r"^(?P(?P.+?)-(?P\d.*?))\.dist-info$") + + +def pack(directory, dest_dir, build_number): + """Repack a previously unpacked wheel directory into a new wheel file. + + The .dist-info/WHEEL file must contain one or more tags so that the target + wheel file name can be determined. + + :param directory: The unpacked wheel directory + :param dest_dir: Destination directory (defaults to the current directory) + """ + # Find the .dist-info directory + dist_info_dirs = [fn for fn in os.listdir(directory) + if os.path.isdir(os.path.join(directory, fn)) and DIST_INFO_RE.match(fn)] + if len(dist_info_dirs) > 1: + raise WheelError('Multiple .dist-info directories found in {}'.format(directory)) + elif not dist_info_dirs: + raise WheelError('No .dist-info directories found in {}'.format(directory)) + + # Determine the target wheel filename + dist_info_dir = dist_info_dirs[0] + name_version = DIST_INFO_RE.match(dist_info_dir).group('namever') + + # Add the build number if specific + if build_number: + name_version += '-' + build_number + + # Read the tags from .dist-info/WHEEL + with open(os.path.join(directory, dist_info_dir, 'WHEEL')) as f: + tags = [line.split(' ')[1].rstrip() for line in f if line.startswith('Tag: ')] + if not tags: + raise WheelError('No tags present in {}/WHEEL; cannot determine target wheel filename' + .format(dist_info_dir)) + + # Reassemble the tags for the wheel file + impls = sorted({tag.split('-')[0] for tag in tags}) + abivers = sorted({tag.split('-')[1] for tag in tags}) + platforms = sorted({tag.split('-')[2] for tag in tags}) + tagline = '-'.join(['.'.join(impls), '.'.join(abivers), '.'.join(platforms)]) + + # Repack the wheel + wheel_path = os.path.join(dest_dir, '{}-{}.whl'.format(name_version, tagline)) + with WheelFile(wheel_path, 'w') as wf: + print("Repacking wheel as {}...".format(wheel_path), end='') + sys.stdout.flush() + wf.write_files(directory) + + print('OK') diff --git a/env/Lib/site-packages/wheel/cli/unpack.py b/env/Lib/site-packages/wheel/cli/unpack.py new file mode 100644 index 0000000..2e9857a --- /dev/null +++ b/env/Lib/site-packages/wheel/cli/unpack.py @@ -0,0 +1,25 @@ +from __future__ import print_function + +import os.path +import sys + +from ..wheelfile import WheelFile + + +def unpack(path, dest='.'): + """Unpack a wheel. + + Wheel content will be unpacked to {dest}/{name}-{ver}, where {name} + is the package name and {ver} its version. + + :param path: The path to the wheel. + :param dest: Destination directory (default to current directory). + """ + with WheelFile(path) as wf: + namever = wf.parsed_filename.group('namever') + destination = os.path.join(dest, namever) + print("Unpacking to: {}...".format(destination), end='') + sys.stdout.flush() + wf.extractall(destination) + + print('OK') diff --git a/env/Lib/site-packages/wheel/metadata.py b/env/Lib/site-packages/wheel/metadata.py new file mode 100644 index 0000000..ab0c07e --- /dev/null +++ b/env/Lib/site-packages/wheel/metadata.py @@ -0,0 +1,141 @@ +""" +Tools for converting old- to new-style metadata. +""" + +import os.path +import re +import textwrap + +import pkg_resources + +from .pkginfo import read_pkg_info + +# Wheel itself is probably the only program that uses non-extras markers +# in METADATA/PKG-INFO. Support its syntax with the extra at the end only. +EXTRA_RE = re.compile( + r"""^(?P.*?)(;\s*(?P.*?)(extra == '(?P.*?)')?)$""") + + +def requires_to_requires_dist(requirement): + """Return the version specifier for a requirement in PEP 345/566 fashion.""" + if getattr(requirement, 'url', None): + return " @ " + requirement.url + + requires_dist = [] + for op, ver in requirement.specs: + requires_dist.append(op + ver) + if not requires_dist: + return '' + return " (%s)" % ','.join(sorted(requires_dist)) + + +def convert_requirements(requirements): + """Yield Requires-Dist: strings for parsed requirements strings.""" + for req in requirements: + parsed_requirement = pkg_resources.Requirement.parse(req) + spec = requires_to_requires_dist(parsed_requirement) + extras = ",".join(sorted(parsed_requirement.extras)) + if extras: + extras = "[%s]" % extras + yield (parsed_requirement.project_name + extras + spec) + + +def generate_requirements(extras_require): + """ + Convert requirements from a setup()-style dictionary to ('Requires-Dist', 'requirement') + and ('Provides-Extra', 'extra') tuples. + + extras_require is a dictionary of {extra: [requirements]} as passed to setup(), + using the empty extra {'': [requirements]} to hold install_requires. + """ + for extra, depends in extras_require.items(): + condition = '' + extra = extra or '' + if ':' in extra: # setuptools extra:condition syntax + extra, condition = extra.split(':', 1) + + extra = pkg_resources.safe_extra(extra) + if extra: + yield 'Provides-Extra', extra + if condition: + condition = "(" + condition + ") and " + condition += "extra == '%s'" % extra + + if condition: + condition = ' ; ' + condition + + for new_req in convert_requirements(depends): + yield 'Requires-Dist', new_req + condition + + +def pkginfo_to_metadata(egg_info_path, pkginfo_path): + """ + Convert .egg-info directory with PKG-INFO to the Metadata 2.1 format + """ + pkg_info = read_pkg_info(pkginfo_path) + pkg_info.replace_header('Metadata-Version', '2.1') + # Those will be regenerated from `requires.txt`. + del pkg_info['Provides-Extra'] + del pkg_info['Requires-Dist'] + requires_path = os.path.join(egg_info_path, 'requires.txt') + if os.path.exists(requires_path): + with open(requires_path) as requires_file: + requires = requires_file.read() + + parsed_requirements = sorted(pkg_resources.split_sections(requires), + key=lambda x: x[0] or '') + for extra, reqs in parsed_requirements: + for key, value in generate_requirements({extra: reqs}): + if (key, value) not in pkg_info.items(): + pkg_info[key] = value + + description = pkg_info['Description'] + if description: + pkg_info.set_payload(dedent_description(pkg_info)) + del pkg_info['Description'] + + return pkg_info + + +def pkginfo_unicode(pkg_info, field): + """Hack to coax Unicode out of an email Message() - Python 3.3+""" + text = pkg_info[field] + field = field.lower() + if not isinstance(text, str): + if not hasattr(pkg_info, 'raw_items'): # Python 3.2 + return str(text) + for item in pkg_info.raw_items(): + if item[0].lower() == field: + text = item[1].encode('ascii', 'surrogateescape') \ + .decode('utf-8') + break + + return text + + +def dedent_description(pkg_info): + """ + Dedent and convert pkg_info['Description'] to Unicode. + """ + description = pkg_info['Description'] + + # Python 3 Unicode handling, sorta. + surrogates = False + if not isinstance(description, str): + surrogates = True + description = pkginfo_unicode(pkg_info, 'Description') + + description_lines = description.splitlines() + description_dedent = '\n'.join( + # if the first line of long_description is blank, + # the first line here will be indented. + (description_lines[0].lstrip(), + textwrap.dedent('\n'.join(description_lines[1:])), + '\n')) + + if surrogates: + description_dedent = description_dedent \ + .encode("utf8") \ + .decode("ascii", "surrogateescape") + + return description_dedent diff --git a/env/Lib/site-packages/wheel/pep425tags.py b/env/Lib/site-packages/wheel/pep425tags.py new file mode 100644 index 0000000..b9242ef --- /dev/null +++ b/env/Lib/site-packages/wheel/pep425tags.py @@ -0,0 +1,190 @@ +"""Generate and work with PEP 425 Compatibility Tags.""" + +import distutils.util +import platform +import sys +import sysconfig +import warnings + +try: + from importlib.machinery import all_suffixes as get_all_suffixes +except ImportError: + from imp import get_suffixes + + def get_all_suffixes(): + return [suffix[0] for suffix in get_suffixes()] + + +def get_config_var(var): + try: + return sysconfig.get_config_var(var) + except IOError as e: # pip Issue #1074 + warnings.warn("{0}".format(e), RuntimeWarning) + return None + + +def get_abbr_impl(): + """Return abbreviated implementation name.""" + impl = platform.python_implementation() + if impl == 'PyPy': + return 'pp' + elif impl == 'Jython': + return 'jy' + elif impl == 'IronPython': + return 'ip' + elif impl == 'CPython': + return 'cp' + + raise LookupError('Unknown Python implementation: ' + impl) + + +def get_impl_ver(): + """Return implementation version.""" + impl_ver = get_config_var("py_version_nodot") + if not impl_ver or get_abbr_impl() == 'pp': + impl_ver = ''.join(map(str, get_impl_version_info())) + return impl_ver + + +def get_impl_version_info(): + """Return sys.version_info-like tuple for use in decrementing the minor + version.""" + if get_abbr_impl() == 'pp': + # as per https://github.com/pypa/pip/issues/2882 + return (sys.version_info[0], sys.pypy_version_info.major, + sys.pypy_version_info.minor) + else: + return sys.version_info[0], sys.version_info[1] + + +def get_flag(var, fallback, expected=True, warn=True): + """Use a fallback method for determining SOABI flags if the needed config + var is unset or unavailable.""" + val = get_config_var(var) + if val is None: + if warn: + warnings.warn("Config variable '{0}' is unset, Python ABI tag may " + "be incorrect".format(var), RuntimeWarning, 2) + return fallback() + return val == expected + + +def get_abi_tag(): + """Return the ABI tag based on SOABI (if available) or emulate SOABI + (CPython 2, PyPy).""" + soabi = get_config_var('SOABI') + impl = get_abbr_impl() + if not soabi and impl in ('cp', 'pp') and hasattr(sys, 'maxunicode'): + d = '' + m = '' + u = '' + if get_flag('Py_DEBUG', + lambda: hasattr(sys, 'gettotalrefcount'), + warn=(impl == 'cp')): + d = 'd' + if get_flag('WITH_PYMALLOC', + lambda: impl == 'cp', + warn=(impl == 'cp' and + sys.version_info < (3, 8))) \ + and sys.version_info < (3, 8): + m = 'm' + if get_flag('Py_UNICODE_SIZE', + lambda: sys.maxunicode == 0x10ffff, + expected=4, + warn=(impl == 'cp' and + sys.version_info < (3, 3))) \ + and sys.version_info < (3, 3): + u = 'u' + abi = '%s%s%s%s%s' % (impl, get_impl_ver(), d, m, u) + elif soabi and soabi.startswith('cpython-'): + abi = 'cp' + soabi.split('-')[1] + elif soabi: + abi = soabi.replace('.', '_').replace('-', '_') + else: + abi = None + return abi + + +def get_platform(): + """Return our platform name 'win32', 'linux_x86_64'""" + # XXX remove distutils dependency + result = distutils.util.get_platform().replace('.', '_').replace('-', '_') + if result == "linux_x86_64" and sys.maxsize == 2147483647: + # pip pull request #3497 + result = "linux_i686" + return result + + +def get_supported(versions=None, supplied_platform=None): + """Return a list of supported tags for each version specified in + `versions`. + + :param versions: a list of string versions, of the form ["33", "32"], + or None. The first version will be assumed to support our ABI. + """ + supported = [] + + # Versions must be given with respect to the preference + if versions is None: + versions = [] + version_info = get_impl_version_info() + major = version_info[:-1] + # Support all previous minor Python versions. + for minor in range(version_info[-1], -1, -1): + versions.append(''.join(map(str, major + (minor,)))) + + impl = get_abbr_impl() + + abis = [] + + abi = get_abi_tag() + if abi: + abis[0:0] = [abi] + + abi3s = set() + for suffix in get_all_suffixes(): + if suffix.startswith('.abi'): + abi3s.add(suffix.split('.', 2)[1]) + + abis.extend(sorted(list(abi3s))) + + abis.append('none') + + platforms = [] + if supplied_platform: + platforms.append(supplied_platform) + platforms.append(get_platform()) + + # Current version, current API (built specifically for our Python): + for abi in abis: + for arch in platforms: + supported.append(('%s%s' % (impl, versions[0]), abi, arch)) + + # abi3 modules compatible with older version of Python + for version in versions[1:]: + # abi3 was introduced in Python 3.2 + if version in ('31', '30'): + break + for abi in abi3s: # empty set if not Python 3 + for arch in platforms: + supported.append(("%s%s" % (impl, version), abi, arch)) + + # No abi / arch, but requires our implementation: + for i, version in enumerate(versions): + supported.append(('%s%s' % (impl, version), 'none', 'any')) + if i == 0: + # Tagged specifically as being cross-version compatible + # (with just the major version specified) + supported.append(('%s%s' % (impl, versions[0][0]), 'none', 'any')) + + # Major Python version + platform; e.g. binaries not using the Python API + for arch in platforms: + supported.append(('py%s' % (versions[0][0]), 'none', arch)) + + # No abi / arch, generic Python + for i, version in enumerate(versions): + supported.append(('py%s' % (version,), 'none', 'any')) + if i == 0: + supported.append(('py%s' % (version[0]), 'none', 'any')) + + return supported diff --git a/env/Lib/site-packages/wheel/pkginfo.py b/env/Lib/site-packages/wheel/pkginfo.py new file mode 100644 index 0000000..115be45 --- /dev/null +++ b/env/Lib/site-packages/wheel/pkginfo.py @@ -0,0 +1,43 @@ +"""Tools for reading and writing PKG-INFO / METADATA without caring +about the encoding.""" + +from email.parser import Parser + +try: + unicode + _PY3 = False +except NameError: + _PY3 = True + +if not _PY3: + from email.generator import Generator + + def read_pkg_info_bytes(bytestr): + return Parser().parsestr(bytestr) + + def read_pkg_info(path): + with open(path, "r") as headers: + message = Parser().parse(headers) + return message + + def write_pkg_info(path, message): + with open(path, 'w') as metadata: + Generator(metadata, mangle_from_=False, maxheaderlen=0).flatten(message) +else: + from email.generator import BytesGenerator + + def read_pkg_info_bytes(bytestr): + headers = bytestr.decode(encoding="ascii", errors="surrogateescape") + message = Parser().parsestr(headers) + return message + + def read_pkg_info(path): + with open(path, "r", + encoding="ascii", + errors="surrogateescape") as headers: + message = Parser().parse(headers) + return message + + def write_pkg_info(path, message): + with open(path, "wb") as out: + BytesGenerator(out, mangle_from_=False, maxheaderlen=0).flatten(message) diff --git a/env/Lib/site-packages/wheel/util.py b/env/Lib/site-packages/wheel/util.py new file mode 100644 index 0000000..0afb54a --- /dev/null +++ b/env/Lib/site-packages/wheel/util.py @@ -0,0 +1,46 @@ +import base64 +import io +import sys + + +if sys.version_info[0] < 3: + text_type = unicode # noqa: F821 + + StringIO = io.BytesIO + + def native(s, encoding='utf-8'): + if isinstance(s, unicode): + return s.encode(encoding) + return s +else: + text_type = str + + StringIO = io.StringIO + + def native(s, encoding='utf-8'): + if isinstance(s, bytes): + return s.decode(encoding) + return s + + +def urlsafe_b64encode(data): + """urlsafe_b64encode without padding""" + return base64.urlsafe_b64encode(data).rstrip(b'=') + + +def urlsafe_b64decode(data): + """urlsafe_b64decode without padding""" + pad = b'=' * (4 - (len(data) & 3)) + return base64.urlsafe_b64decode(data + pad) + + +def as_unicode(s): + if isinstance(s, bytes): + return s.decode('utf-8') + return s + + +def as_bytes(s): + if isinstance(s, text_type): + return s.encode('utf-8') + return s diff --git a/env/Lib/site-packages/wheel/wheelfile.py b/env/Lib/site-packages/wheel/wheelfile.py new file mode 100644 index 0000000..ddf8509 --- /dev/null +++ b/env/Lib/site-packages/wheel/wheelfile.py @@ -0,0 +1,169 @@ +from __future__ import print_function + +import csv +import hashlib +import os.path +import re +import stat +import time +from collections import OrderedDict +from distutils import log as logger +from zipfile import ZIP_DEFLATED, ZipInfo, ZipFile + +from wheel.cli import WheelError +from wheel.util import urlsafe_b64decode, as_unicode, native, urlsafe_b64encode, as_bytes, StringIO + +# Non-greedy matching of an optional build number may be too clever (more +# invalid wheel filenames will match). Separate regex for .dist-info? +WHEEL_INFO_RE = re.compile( + r"""^(?P(?P.+?)-(?P.+?))(-(?P\d[^-]*))? + -(?P.+?)-(?P.+?)-(?P.+?)\.whl$""", + re.VERBOSE) + + +def get_zipinfo_datetime(timestamp=None): + # Some applications need reproducible .whl files, but they can't do this without forcing + # the timestamp of the individual ZipInfo objects. See issue #143. + timestamp = int(os.environ.get('SOURCE_DATE_EPOCH', timestamp or time.time())) + return time.gmtime(timestamp)[0:6] + + +class WheelFile(ZipFile): + """A ZipFile derivative class that also reads SHA-256 hashes from + .dist-info/RECORD and checks any read files against those. + """ + + _default_algorithm = hashlib.sha256 + + def __init__(self, file, mode='r'): + basename = os.path.basename(file) + self.parsed_filename = WHEEL_INFO_RE.match(basename) + if not basename.endswith('.whl') or self.parsed_filename is None: + raise WheelError("Bad wheel filename {!r}".format(basename)) + + ZipFile.__init__(self, file, mode, compression=ZIP_DEFLATED, allowZip64=True) + + self.dist_info_path = '{}.dist-info'.format(self.parsed_filename.group('namever')) + self.record_path = self.dist_info_path + '/RECORD' + self._file_hashes = OrderedDict() + self._file_sizes = {} + if mode == 'r': + # Ignore RECORD and any embedded wheel signatures + self._file_hashes[self.record_path] = None, None + self._file_hashes[self.record_path + '.jws'] = None, None + self._file_hashes[self.record_path + '.p7s'] = None, None + + # Fill in the expected hashes by reading them from RECORD + try: + record = self.open(self.record_path) + except KeyError: + raise WheelError('Missing {} file'.format(self.record_path)) + + with record: + for line in record: + line = line.decode('utf-8') + path, hash_sum, size = line.rsplit(u',', 2) + if hash_sum: + algorithm, hash_sum = hash_sum.split(u'=') + try: + hashlib.new(algorithm) + except ValueError: + raise WheelError('Unsupported hash algorithm: {}'.format(algorithm)) + + if algorithm.lower() in {'md5', 'sha1'}: + raise WheelError( + 'Weak hash algorithm ({}) is not permitted by PEP 427' + .format(algorithm)) + + self._file_hashes[path] = ( + algorithm, urlsafe_b64decode(hash_sum.encode('ascii'))) + + def open(self, name_or_info, mode="r", pwd=None): + def _update_crc(newdata, eof=None): + if eof is None: + eof = ef._eof + update_crc_orig(newdata) + else: # Python 2 + update_crc_orig(newdata, eof) + + running_hash.update(newdata) + if eof and running_hash.digest() != expected_hash: + raise WheelError("Hash mismatch for file '{}'".format(native(ef_name))) + + ef = ZipFile.open(self, name_or_info, mode, pwd) + ef_name = as_unicode(name_or_info.filename if isinstance(name_or_info, ZipInfo) + else name_or_info) + if mode == 'r' and not ef_name.endswith('/'): + if ef_name not in self._file_hashes: + raise WheelError("No hash found for file '{}'".format(native(ef_name))) + + algorithm, expected_hash = self._file_hashes[ef_name] + if expected_hash is not None: + # Monkey patch the _update_crc method to also check for the hash from RECORD + running_hash = hashlib.new(algorithm) + update_crc_orig, ef._update_crc = ef._update_crc, _update_crc + + return ef + + def write_files(self, base_dir): + logger.info("creating '%s' and adding '%s' to it", self.filename, base_dir) + deferred = [] + for root, dirnames, filenames in os.walk(base_dir): + # Sort the directory names so that `os.walk` will walk them in a + # defined order on the next iteration. + dirnames.sort() + for name in sorted(filenames): + path = os.path.normpath(os.path.join(root, name)) + if os.path.isfile(path): + arcname = os.path.relpath(path, base_dir) + if arcname == self.record_path: + pass + elif root.endswith('.dist-info'): + deferred.append((path, arcname)) + else: + self.write(path, arcname) + + deferred.sort() + for path, arcname in deferred: + self.write(path, arcname) + + def write(self, filename, arcname=None, compress_type=None): + with open(filename, 'rb') as f: + st = os.fstat(f.fileno()) + data = f.read() + + zinfo = ZipInfo(arcname or filename, date_time=get_zipinfo_datetime(st.st_mtime)) + zinfo.external_attr = (stat.S_IMODE(st.st_mode) | stat.S_IFMT(st.st_mode)) << 16 + zinfo.compress_type = ZIP_DEFLATED + self.writestr(zinfo, data, compress_type) + + def writestr(self, zinfo_or_arcname, bytes, compress_type=None): + ZipFile.writestr(self, zinfo_or_arcname, bytes, compress_type) + fname = (zinfo_or_arcname.filename if isinstance(zinfo_or_arcname, ZipInfo) + else zinfo_or_arcname) + logger.info("adding '%s'", fname) + if fname != self.record_path: + hash_ = self._default_algorithm(bytes) + self._file_hashes[fname] = hash_.name, native(urlsafe_b64encode(hash_.digest())) + self._file_sizes[fname] = len(bytes) + + def close(self): + # Write RECORD + if self.fp is not None and self.mode == 'w' and self._file_hashes: + data = StringIO() + writer = csv.writer(data, delimiter=',', quotechar='"', lineterminator='\n') + writer.writerows(( + ( + fname, + algorithm + "=" + hash_, + self._file_sizes[fname] + ) + for fname, (algorithm, hash_) in self._file_hashes.items() + )) + writer.writerow((format(self.record_path), "", "")) + zinfo = ZipInfo(native(self.record_path), date_time=get_zipinfo_datetime()) + zinfo.compress_type = ZIP_DEFLATED + zinfo.external_attr = 0o664 << 16 + self.writestr(zinfo, as_bytes(data.getvalue())) + + ZipFile.close(self) diff --git a/env/Lib/site.py b/env/Lib/site.py new file mode 100644 index 0000000..ef1cd1a --- /dev/null +++ b/env/Lib/site.py @@ -0,0 +1,829 @@ +"""Append module search paths for third-party packages to sys.path. + +**************************************************************** +* This module is automatically imported during initialization. * +**************************************************************** + +In earlier versions of Python (up to 1.5a3), scripts or modules that +needed to use site-specific modules would place ``import site'' +somewhere near the top of their code. Because of the automatic +import, this is no longer necessary (but code that does it still +works). + +This will append site-specific paths to the module search path. On +Unix, it starts with sys.prefix and sys.exec_prefix (if different) and +appends lib/python/site-packages as well as lib/site-python. +It also supports the Debian convention of +lib/python/dist-packages. On other platforms (mainly Mac and +Windows), it uses just sys.prefix (and sys.exec_prefix, if different, +but this is unlikely). The resulting directories, if they exist, are +appended to sys.path, and also inspected for path configuration files. + +FOR DEBIAN, this sys.path is augmented with directories in /usr/local. +Local addons go into /usr/local/lib/python/site-packages +(resp. /usr/local/lib/site-python), Debian addons install into +/usr/{lib,share}/python/dist-packages. + +A path configuration file is a file whose name has the form +.pth; its contents are additional directories (one per line) +to be added to sys.path. Non-existing directories (or +non-directories) are never added to sys.path; no directory is added to +sys.path more than once. Blank lines and lines beginning with +'#' are skipped. Lines starting with 'import' are executed. + +For example, suppose sys.prefix and sys.exec_prefix are set to +/usr/local and there is a directory /usr/local/lib/python2.X/site-packages +with three subdirectories, foo, bar and spam, and two path +configuration files, foo.pth and bar.pth. Assume foo.pth contains the +following: + + # foo package configuration + foo + bar + bletch + +and bar.pth contains: + + # bar package configuration + bar + +Then the following directories are added to sys.path, in this order: + + /usr/local/lib/python2.X/site-packages/bar + /usr/local/lib/python2.X/site-packages/foo + +Note that bletch is omitted because it doesn't exist; bar precedes foo +because bar.pth comes alphabetically before foo.pth; and spam is +omitted because it is not mentioned in either path configuration file. + +After these path manipulations, an attempt is made to import a module +named sitecustomize, which can perform arbitrary additional +site-specific customizations. If this import fails with an +ImportError exception, it is silently ignored. + +""" + +import os +import sys + +try: + import __builtin__ as builtins +except ImportError: + import builtins +try: + set +except NameError: + from sets import Set as set + +# Prefixes for site-packages; add additional prefixes like /usr/local here +PREFIXES = [sys.prefix, sys.exec_prefix] +# Enable per user site-packages directory +# set it to False to disable the feature or True to force the feature +ENABLE_USER_SITE = None +# for distutils.commands.install +USER_SITE = None +USER_BASE = None + +_is_64bit = (getattr(sys, "maxsize", None) or getattr(sys, "maxint")) > 2 ** 32 +_is_pypy = hasattr(sys, "pypy_version_info") + + +def makepath(*paths): + dir = os.path.join(*paths) + 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(): + 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.{}-{}.{}".format(get_platform(), *sys.version_info) + if hasattr(sys, "gettotalrefcount"): + s += "-pydebug" + s = os.path.join(os.path.dirname(sys.path[-1]), s) + sys.path.append(s) + + +def _init_pathinfo(): + """Return a set containing all existing directory entries from sys.path""" + d = set() + for dir in sys.path: + try: + if os.path.isdir(dir): + dir, dircase = makepath(dir) + d.add(dircase) + except TypeError: + continue + return d + + +def addpackage(sitedir, name, known_paths): + """Add a new path to known_paths by combining sitedir and 'name' or execute + sitedir if it starts with 'import'""" + if known_paths is None: + _init_pathinfo() + reset = 1 + else: + reset = 0 + fullname = os.path.join(sitedir, name) + try: + f = open(fullname, "r") + except IOError: + return + try: + for line in f: + if line.startswith("#"): + continue + if line.startswith("import"): + exec(line) + continue + line = line.rstrip() + dir, dircase = makepath(sitedir, line) + if not dircase in known_paths and os.path.exists(dir): + sys.path.append(dir) + known_paths.add(dircase) + finally: + f.close() + if reset: + known_paths = None + return known_paths + + +def addsitedir(sitedir, known_paths=None): + """Add 'sitedir' argument to sys.path if missing and handle .pth files in + 'sitedir'""" + if known_paths is None: + known_paths = _init_pathinfo() + reset = 1 + else: + reset = 0 + sitedir, sitedircase = makepath(sitedir) + if not sitedircase in known_paths: + sys.path.append(sitedir) # Add path component + try: + names = os.listdir(sitedir) + except os.error: + return + names.sort() + for name in names: + if name.endswith(os.extsep + "pth"): + addpackage(sitedir, name, known_paths) + if reset: + known_paths = None + return known_paths + + +def addsitepackages(known_paths, sys_prefix=sys.prefix, exec_prefix=sys.exec_prefix): + """Add site-packages (and possibly site-python) to sys.path""" + prefixes = [os.path.join(sys_prefix, "local"), sys_prefix] + if exec_prefix != sys_prefix: + prefixes.append(os.path.join(exec_prefix, "local")) + + for prefix in prefixes: + if prefix: + if sys.platform in ("os2emx", "riscos"): + 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", "{}.{}".format(*sys.version_info), "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{}.{}".format(*sys.version_info), "site-packages")] + + elif os.sep == "/": + sitedirs = [ + os.path.join(prefix, "lib", "python{}.{}".format(*sys.version_info), "site-packages"), + os.path.join(prefix, "lib", "site-python"), + os.path.join(prefix, "python{}.{}".format(*sys.version_info), "lib-dynload"), + ] + lib64_dir = os.path.join(prefix, "lib64", "python{}.{}".format(*sys.version_info), "site-packages") + if os.path.exists(lib64_dir) and os.path.realpath(lib64_dir) not in [ + os.path.realpath(p) for p in sitedirs + ]: + if _is_64bit: + sitedirs.insert(0, lib64_dir) + else: + sitedirs.append(lib64_dir) + try: + # sys.getobjects only available in --with-pydebug build + sys.getobjects + sitedirs.insert(0, os.path.join(sitedirs[0], "debug")) + except AttributeError: + pass + # Debian-specific dist-packages directories: + sitedirs.append( + os.path.join(prefix, "local/lib", "python{}.{}".format(*sys.version_info), "dist-packages") + ) + if sys.version_info[0] == 2: + sitedirs.append( + os.path.join(prefix, "lib", "python{}.{}".format(*sys.version_info), "dist-packages") + ) + else: + sitedirs.append( + os.path.join(prefix, "lib", "python{}".format(sys.version_info[0]), "dist-packages") + ) + sitedirs.append(os.path.join(prefix, "lib", "dist-python")) + else: + sitedirs = [prefix, os.path.join(prefix, "lib", "site-packages")] + if sys.platform == "darwin": + # for framework builds *only* we add the standard Apple + # locations. Currently only per-user, but /Library and + # /Network/Library could be added too + if "Python.framework" in prefix or "Python3.framework" in prefix: + home = os.environ.get("HOME") + if home: + sitedirs.append( + os.path.join(home, "Library", "Python", "{}.{}".format(*sys.version_info), "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{}{}".format(*sys.version_info), "site-packages") + else: + if env_base: + USER_BASE = env_base + else: + USER_BASE = joinuser("~", ".local") + USER_SITE = os.path.join(USER_BASE, "lib", "python{}.{}".format(*sys.version_info), "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{}.{}".format(*sys.version_info), "dist-packages") + if os.path.isdir(user_site): + addsitedir(user_site, known_paths) + return known_paths + + +def setBEGINLIBPATH(): + """The OS/2 EMX port has optional extension modules that do double duty + as DLLs (and must use the .DLL file extension) for other extensions. + The library search path needs to be amended so these will be found + during module import. Use BEGINLIBPATH so that these are at the start + of the library search path. + + """ + dllpath = os.path.join(sys.prefix, "Lib", "lib-dynload") + libpath = os.environ["BEGINLIBPATH"].split(";") + if libpath[-1]: + libpath.append(dllpath) + else: + libpath[-1] = dllpath + os.environ["BEGINLIBPATH"] = ";".join(libpath) + + +def setquit(): + """Define new built-ins 'quit' and 'exit'. + These are simply strings that display a hint on how to exit. + + """ + if os.sep == ":": + eof = "Cmd-Q" + elif os.sep == "\\": + eof = "Ctrl-Z plus Return" + else: + eof = "Ctrl-D (i.e. EOF)" + + class Quitter(object): + def __init__(self, name): + self.name = name + + def __repr__(self): + return "Use {}() or {} to exit".format(self.name, eof) + + def __call__(self, code=None): + # Shells like IDLE catch the SystemExit, but listen when their + # stdin wrapper is closed. + try: + sys.stdin.close() + except: + pass + raise SystemExit(code) + + builtins.quit = Quitter("quit") + builtins.exit = Quitter("exit") + + +class _Printer(object): + """interactive prompt objects for printing the license text, a list of + contributors and the copyright notice.""" + + MAXLINES = 23 + + def __init__(self, name, data, files=(), dirs=()): + self.__name = name + self.__data = data + self.__files = files + self.__dirs = dirs + self.__lines = None + + def __setup(self): + if self.__lines: + return + data = None + for dir in self.__dirs: + for filename in self.__files: + filename = os.path.join(dir, filename) + try: + fp = open(filename, "r") + data = fp.read() + fp.close() + break + except IOError: + pass + if data: + break + if not data: + data = self.__data + self.__lines = data.split("\n") + self.__linecnt = len(self.__lines) + + def __repr__(self): + self.__setup() + if len(self.__lines) <= self.MAXLINES: + return "\n".join(self.__lines) + else: + return "Type %s() to see the full %s text" % ((self.__name,) * 2) + + def __call__(self): + self.__setup() + prompt = "Hit Return for more, or q (and Return) to quit: " + lineno = 0 + while 1: + try: + for i in range(lineno, lineno + self.MAXLINES): + print(self.__lines[i]) + except IndexError: + break + else: + lineno += self.MAXLINES + key = None + while key is None: + try: + key = raw_input(prompt) + except NameError: + key = input(prompt) + if key not in ("", "q"): + key = None + if key == "q": + break + + +def setcopyright(): + """Set 'copyright' and 'credits' in __builtin__""" + builtins.copyright = _Printer("copyright", sys.copyright) + if _is_pypy: + builtins.credits = _Printer("credits", "PyPy is maintained by the PyPy developers: http://pypy.org/") + else: + builtins.credits = _Printer( + "credits", + """\ + Thanks to CWI, CNRI, BeOpen.com, Zope Corporation and a cast of thousands + for supporting Python development. See www.python.org for more information.""", + ) + here = os.path.dirname(os.__file__) + builtins.license = _Printer( + "license", + "See https://www.python.org/psf/license/", + ["LICENSE.txt", "LICENSE"], + [sys.prefix, 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_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{}.{}".format(*sys.version_info))] + hardcoded_relative_dirs = paths[:] # for the special 'darwin' case below + lib64_path = os.path.join(sys.real_prefix, "lib64", "python{}.{}".format(*sys.version_info)) + 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{}.{}".format(*sys.version_info), "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 execusercustomize(): + """Run custom user specific code, if available.""" + try: + import usercustomize + except ImportError: + pass + + +def enablerlcompleter(): + """Enable default readline configuration on interactive prompts, by + registering a sys.__interactivehook__. + If the readline module can be imported, the hook will set the Tab key + as completion key and register ~/.python_history as history file. + This can be overridden in the sitecustomize or usercustomize module, + or in a PYTHONSTARTUP file. + """ + + def register_readline(): + import atexit + + try: + import readline + import rlcompleter + except ImportError: + return + + # Reading the initialization (config) file may not be enough to set a + # completion key, so we set one first and then read the file. + readline_doc = getattr(readline, "__doc__", "") + if readline_doc is not None and "libedit" in readline_doc: + readline.parse_and_bind("bind ^I rl_complete") + else: + readline.parse_and_bind("tab: complete") + + try: + readline.read_init_file() + except OSError: + # An OSError here could have many causes, but the most likely one + # is that there's no .inputrc file (or .editrc file in the case of + # Mac OS X + libedit) in the expected location. In that case, we + # want to ignore the exception. + pass + + if readline.get_current_history_length() == 0: + # If no history was loaded, default to .python_history. + # The guard is necessary to avoid doubling history size at + # each interpreter exit when readline was already configured + # through a PYTHONSTARTUP hook, see: + # http://bugs.python.org/issue5845#msg198636 + history = os.path.join(os.path.expanduser("~"), ".python_history") + try: + readline.read_history_file(history) + except OSError: + pass + + def write_history(): + try: + readline.write_history_file(history) + except (FileNotFoundError, PermissionError): + # home directory does not exist or is not writable + # https://bugs.python.org/issue19891 + pass + + atexit.register(write_history) + + sys.__interactivehook__ = register_readline + + +if _is_pypy: + + def import_builtin_stuff(): + """PyPy specific: some built-in modules should be pre-imported because + some programs expect them to be in sys.modules on startup. This is ported + from PyPy's site.py. + """ + import encodings + + if "exceptions" in sys.builtin_module_names: + import exceptions + + if "zipimport" in sys.builtin_module_names: + import zipimport + + +def main(): + global ENABLE_USER_SITE + virtual_install_main_packages() + if _is_pypy: + import_builtin_stuff() + abs__file__() + paths_in_sys = removeduppaths() + if os.name == "posix" and sys.path and os.path.basename(sys.path[-1]) == "Modules": + addbuilddir() + GLOBAL_SITE_PACKAGES = not os.path.exists(os.path.join(os.path.dirname(__file__), "no-global-site-packages.txt")) + if not GLOBAL_SITE_PACKAGES: + ENABLE_USER_SITE = False + if ENABLE_USER_SITE is None: + ENABLE_USER_SITE = check_enableusersite() + paths_in_sys = addsitepackages(paths_in_sys) + paths_in_sys = addusersitepackages(paths_in_sys) + if GLOBAL_SITE_PACKAGES: + paths_in_sys = virtual_addsitepackages(paths_in_sys) + if sys.platform == "os2emx": + setBEGINLIBPATH() + setquit() + setcopyright() + sethelper() + if sys.version_info[0] == 3: + enablerlcompleter() + aliasmbcs() + setencoding() + execsitecustomize() + if ENABLE_USER_SITE: + execusercustomize() + # Remove sys.setdefaultencoding() so that users cannot change the + # encoding after initialization. The test for presence is needed when + # this module is run as a script, because this code is executed twice. + if hasattr(sys, "setdefaultencoding"): + del sys.setdefaultencoding + + +main() + + +def _script(): + help = """\ + %s [--user-base] [--user-site] + + Without arguments print some useful information + With arguments print the value of USER_BASE and/or USER_SITE separated + by '%s'. + + Exit codes with --user-base or --user-site: + 0 - user site directory is enabled + 1 - user site directory is disabled by user + 2 - uses site directory is disabled by super user + or for security reasons + >2 - unknown error + """ + args = sys.argv[1:] + if not args: + print("sys.path = [") + for dir in sys.path: + print(" {!r},".format(dir)) + print("]") + + def exists(path): + if os.path.isdir(path): + return "exists" + else: + return "doesn't exist" + + print("USER_BASE: {!r} ({})".format(USER_BASE, exists(USER_BASE))) + print("USER_SITE: {!r} ({})".format(USER_SITE, exists(USER_SITE))) + print("ENABLE_USER_SITE: %r" % ENABLE_USER_SITE) + sys.exit(0) + + buffer = [] + if "--user-base" in args: + buffer.append(USER_BASE) + if "--user-site" in args: + buffer.append(USER_SITE) + + if buffer: + print(os.pathsep.join(buffer)) + if ENABLE_USER_SITE: + sys.exit(0) + elif ENABLE_USER_SITE is False: + sys.exit(1) + elif ENABLE_USER_SITE is None: + sys.exit(2) + else: + sys.exit(3) + else: + import textwrap + + print(textwrap.dedent(help % (sys.argv[0], os.pathsep))) + sys.exit(10) + + +if __name__ == "__main__": + _script() diff --git a/env/Lib/sre_compile.py b/env/Lib/sre_compile.py new file mode 100644 index 0000000..e5216b7 --- /dev/null +++ b/env/Lib/sre_compile.py @@ -0,0 +1,784 @@ +# +# 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 +import sre_parse +from sre_constants import * + +assert _sre.MAGIC == MAGIC, "SRE module mismatch" + +_LITERAL_CODES = {LITERAL, NOT_LITERAL} +_REPEATING_CODES = {REPEAT, MIN_REPEAT, MAX_REPEAT} +_SUCCESS_CODES = {SUCCESS, FAILURE} +_ASSERT_CODES = {ASSERT, ASSERT_NOT} +_UNIT_CODES = _LITERAL_CODES | {ANY, IN} + +# Sets of lowercase characters which have the same uppercase. +_equivalences = ( + # LATIN SMALL LETTER I, LATIN SMALL LETTER DOTLESS I + (0x69, 0x131), # iı + # LATIN SMALL LETTER S, LATIN SMALL LETTER LONG S + (0x73, 0x17f), # sÅ¿ + # MICRO SIGN, GREEK SMALL LETTER MU + (0xb5, 0x3bc), # µμ + # COMBINING GREEK YPOGEGRAMMENI, GREEK SMALL LETTER IOTA, GREEK PROSGEGRAMMENI + (0x345, 0x3b9, 0x1fbe), # \u0345ιι + # GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS, GREEK SMALL LETTER IOTA WITH DIALYTIKA AND OXIA + (0x390, 0x1fd3), # Îá¿“ + # GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS, GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND OXIA + (0x3b0, 0x1fe3), # ΰΰ + # GREEK SMALL LETTER BETA, GREEK BETA SYMBOL + (0x3b2, 0x3d0), # Î²Ï + # GREEK SMALL LETTER EPSILON, GREEK LUNATE EPSILON SYMBOL + (0x3b5, 0x3f5), # εϵ + # GREEK SMALL LETTER THETA, GREEK THETA SYMBOL + (0x3b8, 0x3d1), # θϑ + # GREEK SMALL LETTER KAPPA, GREEK KAPPA SYMBOL + (0x3ba, 0x3f0), # κϰ + # GREEK SMALL LETTER PI, GREEK PI SYMBOL + (0x3c0, 0x3d6), # πϖ + # GREEK SMALL LETTER RHO, GREEK RHO SYMBOL + (0x3c1, 0x3f1), # Ïϱ + # GREEK SMALL LETTER FINAL SIGMA, GREEK SMALL LETTER SIGMA + (0x3c2, 0x3c3), # ςσ + # GREEK SMALL LETTER PHI, GREEK PHI SYMBOL + (0x3c6, 0x3d5), # φϕ + # LATIN SMALL LETTER S WITH DOT ABOVE, LATIN SMALL LETTER LONG S WITH DOT ABOVE + (0x1e61, 0x1e9b), # ṡẛ + # LATIN SMALL LIGATURE LONG S T, LATIN SMALL LIGATURE ST + (0xfb05, 0xfb06), # ſtst +) + +# Maps the lowercase code to lowercase codes which have the same uppercase. +_ignorecase_fixes = {i: tuple(j for j in t if i != j) + for t in _equivalences for i in t} + +def _combine_flags(flags, add_flags, del_flags, + TYPE_FLAGS=sre_parse.TYPE_FLAGS): + if add_flags & TYPE_FLAGS: + flags &= ~TYPE_FLAGS + return (flags | add_flags) & ~del_flags + +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 + iscased = None + tolower = None + fixes = None + if flags & SRE_FLAG_IGNORECASE and not flags & SRE_FLAG_LOCALE: + if flags & SRE_FLAG_UNICODE and not flags & SRE_FLAG_ASCII: + iscased = _sre.unicode_iscased + tolower = _sre.unicode_tolower + fixes = _ignorecase_fixes + else: + iscased = _sre.ascii_iscased + tolower = _sre.ascii_tolower + for op, av in pattern: + if op in LITERAL_CODES: + if not flags & SRE_FLAG_IGNORECASE: + emit(op) + emit(av) + elif flags & SRE_FLAG_LOCALE: + emit(OP_LOCALE_IGNORE[op]) + emit(av) + elif not iscased(av): + emit(op) + emit(av) + else: + lo = tolower(av) + if not fixes: # ascii + emit(OP_IGNORE[op]) + emit(lo) + elif lo not in fixes: + emit(OP_UNICODE_IGNORE[op]) + emit(lo) + else: + emit(IN_UNI_IGNORE) + skip = _len(code); emit(0) + if op is NOT_LITERAL: + emit(NEGATE) + for k in (lo,) + fixes[lo]: + emit(LITERAL) + emit(k) + emit(FAILURE) + code[skip] = _len(code) - skip + elif op is IN: + charset, hascased = _optimize_charset(av, iscased, tolower, fixes) + if flags & SRE_FLAG_IGNORECASE and flags & SRE_FLAG_LOCALE: + emit(IN_LOC_IGNORE) + elif not hascased: + emit(IN) + elif not fixes: # ascii + emit(IN_IGNORE) + else: + emit(IN_UNI_IGNORE) + skip = _len(code); emit(0) + _compile_charset(charset, flags, code) + code[skip] = _len(code) - skip + elif op is ANY: + if flags & SRE_FLAG_DOTALL: + emit(ANY_ALL) + else: + emit(ANY) + elif op in REPEATING_CODES: + if flags & SRE_FLAG_TEMPLATE: + raise error("internal: unsupported template operator %r" % (op,)) + if _simple(av[2]): + if op is MAX_REPEAT: + emit(REPEAT_ONE) + else: + emit(MIN_REPEAT_ONE) + skip = _len(code); emit(0) + emit(av[0]) + emit(av[1]) + _compile(code, av[2], flags) + emit(SUCCESS) + code[skip] = _len(code) - skip + else: + emit(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(MAX_UNTIL) + else: + emit(MIN_UNTIL) + elif op is SUBPATTERN: + group, add_flags, del_flags, p = av + if group: + emit(MARK) + emit((group-1)*2) + # _compile_info(code, p, _combine_flags(flags, add_flags, del_flags)) + _compile(code, p, _combine_flags(flags, add_flags, del_flags)) + if group: + emit(MARK) + emit((group-1)*2+1) + elif op in SUCCESS_CODES: + emit(op) + elif op in ASSERT_CODES: + emit(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(SUCCESS) + code[skip] = _len(code) - skip + elif op is CALL: + emit(op) + skip = _len(code); emit(0) + _compile(code, av, flags) + emit(SUCCESS) + code[skip] = _len(code) - skip + elif op is AT: + emit(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) and not (flags & SRE_FLAG_ASCII): + av = AT_UNICODE.get(av, av) + emit(av) + elif op is BRANCH: + emit(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(JUMP) + tailappend(_len(code)); emit(0) + code[skip] = _len(code) - skip + emit(FAILURE) # end of branch + for tail in tail: + code[tail] = _len(code) - tail + elif op is CATEGORY: + emit(op) + if flags & SRE_FLAG_LOCALE: + av = CH_LOCALE[av] + elif (flags & SRE_FLAG_UNICODE) and not (flags & SRE_FLAG_ASCII): + av = CH_UNICODE[av] + emit(av) + elif op is GROUPREF: + if not flags & SRE_FLAG_IGNORECASE: + emit(op) + elif flags & SRE_FLAG_LOCALE: + emit(GROUPREF_LOC_IGNORE) + elif not fixes: # ascii + emit(GROUPREF_IGNORE) + else: + emit(GROUPREF_UNI_IGNORE) + emit(av-1) + elif op is GROUPREF_EXISTS: + emit(op) + emit(av[0]-1) + skipyes = _len(code); emit(0) + _compile(code, av[1], flags) + if av[2]: + emit(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 error("internal: unsupported operand type %r" % (op,)) + +def _compile_charset(charset, flags, code): + # compile charset subprogram + emit = code.append + for op, av in charset: + emit(op) + if op is NEGATE: + pass + elif op is LITERAL: + emit(av) + elif op is RANGE or op is RANGE_UNI_IGNORE: + emit(av[0]) + emit(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(CH_LOCALE[av]) + elif (flags & SRE_FLAG_UNICODE) and not (flags & SRE_FLAG_ASCII): + emit(CH_UNICODE[av]) + else: + emit(av) + else: + raise error("internal: unsupported set operator %r" % (op,)) + emit(FAILURE) + +def _optimize_charset(charset, iscased=None, fixup=None, fixes=None): + # internal: optimize character set + out = [] + tail = [] + charmap = bytearray(256) + hascased = False + for op, av in charset: + while True: + try: + if op is LITERAL: + if fixup: + lo = fixup(av) + charmap[lo] = 1 + if fixes and lo in fixes: + for k in fixes[lo]: + charmap[k] = 1 + if not hascased and iscased(av): + hascased = True + else: + charmap[av] = 1 + elif op is RANGE: + r = range(av[0], av[1]+1) + if fixup: + if fixes: + for i in map(fixup, r): + charmap[i] = 1 + if i in fixes: + for k in fixes[i]: + charmap[k] = 1 + else: + for i in map(fixup, r): + charmap[i] = 1 + if not hascased: + hascased = any(map(iscased, r)) + else: + for i in r: + charmap[i] = 1 + elif op is NEGATE: + out.append((op, av)) + else: + tail.append((op, av)) + except IndexError: + if len(charmap) == 256: + # character set contains non-UCS1 character codes + charmap += b'\0' * 0xff00 + continue + # Character set contains non-BMP character codes. + if fixup: + hascased = True + # There are only two ranges of cased non-BMP characters: + # 10400-1044F (Deseret) and 118A0-118DF (Warang Citi), + # and for both ranges RANGE_UNI_IGNORE works. + if op is RANGE: + op = RANGE_UNI_IGNORE + tail.append((op, av)) + break + + # compress character map + runs = [] + q = 0 + while True: + p = charmap.find(1, q) + if p < 0: + break + if len(runs) >= 2: + runs = None + break + q = charmap.find(0, p) + if q < 0: + runs.append((p, len(charmap))) + break + runs.append((p, q)) + if runs is not None: + # use literal/range + for p, q in runs: + if q - p == 1: + out.append((LITERAL, p)) + else: + out.append((RANGE, (p, q - 1))) + out += tail + # if the case was changed or new representation is more compact + if hascased or len(out) < len(charset): + return out, hascased + # else original character set is good enough + return charset, hascased + + # use bitmap + if len(charmap) == 256: + data = _mk_bitmap(charmap) + out.append((CHARSET, data)) + out += tail + return out, hascased + + # 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 32-bit word sequence, consisting of one word for + # the number of different chunks, a sequence of 256 bytes (64 words) + # of chunk numbers indexed by their original chunk position, and a + # sequence of 256-bit chunks (8 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). + + charmap = bytes(charmap) # should be hashable + comps = {} + mapping = bytearray(256) + block = 0 + data = bytearray() + for i in range(0, 65536, 256): + chunk = charmap[i: i + 256] + if chunk in comps: + mapping[i // 256] = comps[chunk] + else: + mapping[i // 256] = comps[chunk] = block + block += 1 + data += chunk + data = _mk_bitmap(data) + data[0:0] = [block] + _bytes_to_codes(mapping) + out.append((BIGCHARSET, data)) + out += tail + return out, hascased + +_CODEBITS = _sre.CODESIZE * 8 +MAXCODE = (1 << _CODEBITS) - 1 +_BITS_TRANS = b'0' + b'1' * 255 +def _mk_bitmap(bits, _CODEBITS=_CODEBITS, _int=int): + s = bits.translate(_BITS_TRANS)[::-1] + return [_int(s[i - _CODEBITS: i], 2) + for i in range(len(s), 0, -_CODEBITS)] + +def _bytes_to_codes(b): + # Convert block indices to word array + a = memoryview(b).cast('I') + assert a.itemsize == _sre.CODESIZE + assert len(a) * a.itemsize == len(b) + return a.tolist() + +def _simple(p): + # check if this subpattern is a "simple" operator + if len(p) != 1: + return False + op, av = p[0] + if op is SUBPATTERN: + return av[0] is None and _simple(av[-1]) + return op in _UNIT_CODES + +def _generate_overlap_table(prefix): + """ + Generate an overlap table for the following prefix. + An overlap table is a table of the same size as the prefix which + informs about the potential self-overlap for each index in the prefix: + - if overlap[i] == 0, prefix[i:] can't overlap prefix[0:...] + - if overlap[i] == k with 0 < k <= i, prefix[i-k+1:i+1] overlaps with + prefix[0:k] + """ + table = [0] * len(prefix) + for i in range(1, len(prefix)): + idx = table[i - 1] + while prefix[i] != prefix[idx]: + if idx == 0: + table[i] = 0 + break + idx = table[idx - 1] + else: + table[i] = idx + 1 + return table + +def _get_iscased(flags): + if not flags & SRE_FLAG_IGNORECASE: + return None + elif flags & SRE_FLAG_UNICODE and not flags & SRE_FLAG_ASCII: + return _sre.unicode_iscased + else: + return _sre.ascii_iscased + +def _get_literal_prefix(pattern, flags): + # look for literal prefix + prefix = [] + prefixappend = prefix.append + prefix_skip = None + iscased = _get_iscased(flags) + for op, av in pattern.data: + if op is LITERAL: + if iscased and iscased(av): + break + prefixappend(av) + elif op is SUBPATTERN: + group, add_flags, del_flags, p = av + flags1 = _combine_flags(flags, add_flags, del_flags) + if flags1 & SRE_FLAG_IGNORECASE and flags1 & SRE_FLAG_LOCALE: + break + prefix1, prefix_skip1, got_all = _get_literal_prefix(p, flags1) + if prefix_skip is None: + if group is not None: + prefix_skip = len(prefix) + elif prefix_skip1 is not None: + prefix_skip = len(prefix) + prefix_skip1 + prefix.extend(prefix1) + if not got_all: + break + else: + break + else: + return prefix, prefix_skip, True + return prefix, prefix_skip, False + +def _get_charset_prefix(pattern, flags): + while True: + if not pattern.data: + return None + op, av = pattern.data[0] + if op is not SUBPATTERN: + break + group, add_flags, del_flags, pattern = av + flags = _combine_flags(flags, add_flags, del_flags) + if flags & SRE_FLAG_IGNORECASE and flags & SRE_FLAG_LOCALE: + return None + + iscased = _get_iscased(flags) + if op is LITERAL: + if iscased and iscased(av): + return None + return [(op, av)] + elif op is BRANCH: + charset = [] + charsetappend = charset.append + for p in av[1]: + if not p: + return None + op, av = p[0] + if op is LITERAL and not (iscased and iscased(av)): + charsetappend((op, av)) + else: + return None + return charset + elif op is IN: + charset = av + if iscased: + for op, av in charset: + if op is LITERAL: + if iscased(av): + return None + elif op is RANGE: + if av[1] > 0xffff: + return None + if any(map(iscased, range(av[0], av[1]+1))): + return None + return charset + return None + +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 hi > MAXCODE: + hi = MAXCODE + if lo == 0: + code.extend([INFO, 4, 0, lo, hi]) + return + # look for a literal prefix + prefix = [] + prefix_skip = 0 + charset = [] # not used + if not (flags & SRE_FLAG_IGNORECASE and flags & SRE_FLAG_LOCALE): + # look for literal prefix + prefix, prefix_skip, got_all = _get_literal_prefix(pattern, flags) + # if no prefix, look for charset prefix + if not prefix: + charset = _get_charset_prefix(pattern, flags) +## if prefix: +## print("*** PREFIX", prefix, prefix_skip) +## if charset: +## print("*** CHARSET", charset) + # add an info block + emit = code.append + emit(INFO) + skip = len(code); emit(0) + # literal flag + mask = 0 + if prefix: + mask = SRE_INFO_PREFIX + if prefix_skip is None and got_all: + 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] + emit(min(hi, MAXCODE)) + # add literal prefix + if prefix: + emit(len(prefix)) # length + if prefix_skip is None: + prefix_skip = len(prefix) + emit(prefix_skip) # skip + code.extend(prefix) + # generate overlap table + code.extend(_generate_overlap_table(prefix)) + elif charset: + charset, hascased = _optimize_charset(charset) + assert not hascased + _compile_charset(charset, flags, code) + code[skip] = len(code) - skip + +def isstring(obj): + return isinstance(obj, (str, bytes)) + +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(SUCCESS) + + return code + +def _hex_code(code): + return '[%s]' % ', '.join('%#0*x' % (_sre.CODESIZE*2+2, x) for x in code) + +def dis(code): + import sys + + labels = set() + level = 0 + offset_width = len(str(len(code) - 1)) + + def dis_(start, end): + def print_(*args, to=None): + if to is not None: + labels.add(to) + args += ('(to %d)' % (to,),) + print('%*d%s ' % (offset_width, start, ':' if start in labels else '.'), + end=' '*(level-1)) + print(*args) + + def print_2(*args): + print(end=' '*(offset_width + 2*level)) + print(*args) + + nonlocal level + level += 1 + i = start + while i < end: + start = i + op = code[i] + i += 1 + op = OPCODES[op] + if op in (SUCCESS, FAILURE, ANY, ANY_ALL, + MAX_UNTIL, MIN_UNTIL, NEGATE): + print_(op) + elif op in (LITERAL, NOT_LITERAL, + LITERAL_IGNORE, NOT_LITERAL_IGNORE, + LITERAL_UNI_IGNORE, NOT_LITERAL_UNI_IGNORE, + LITERAL_LOC_IGNORE, NOT_LITERAL_LOC_IGNORE): + arg = code[i] + i += 1 + print_(op, '%#02x (%r)' % (arg, chr(arg))) + elif op is AT: + arg = code[i] + i += 1 + arg = str(ATCODES[arg]) + assert arg[:3] == 'AT_' + print_(op, arg[3:]) + elif op is CATEGORY: + arg = code[i] + i += 1 + arg = str(CHCODES[arg]) + assert arg[:9] == 'CATEGORY_' + print_(op, arg[9:]) + elif op in (IN, IN_IGNORE, IN_UNI_IGNORE, IN_LOC_IGNORE): + skip = code[i] + print_(op, skip, to=i+skip) + dis_(i+1, i+skip) + i += skip + elif op in (RANGE, RANGE_UNI_IGNORE): + lo, hi = code[i: i+2] + i += 2 + print_(op, '%#02x %#02x (%r-%r)' % (lo, hi, chr(lo), chr(hi))) + elif op is CHARSET: + print_(op, _hex_code(code[i: i + 256//_CODEBITS])) + i += 256//_CODEBITS + elif op is BIGCHARSET: + arg = code[i] + i += 1 + mapping = list(b''.join(x.to_bytes(_sre.CODESIZE, sys.byteorder) + for x in code[i: i + 256//_sre.CODESIZE])) + print_(op, arg, mapping) + i += 256//_sre.CODESIZE + level += 1 + for j in range(arg): + print_2(_hex_code(code[i: i + 256//_CODEBITS])) + i += 256//_CODEBITS + level -= 1 + elif op in (MARK, GROUPREF, GROUPREF_IGNORE, GROUPREF_UNI_IGNORE, + GROUPREF_LOC_IGNORE): + arg = code[i] + i += 1 + print_(op, arg) + elif op is JUMP: + skip = code[i] + print_(op, skip, to=i+skip) + i += 1 + elif op is BRANCH: + skip = code[i] + print_(op, skip, to=i+skip) + while skip: + dis_(i+1, i+skip) + i += skip + start = i + skip = code[i] + if skip: + print_('branch', skip, to=i+skip) + else: + print_(FAILURE) + i += 1 + elif op in (REPEAT, REPEAT_ONE, MIN_REPEAT_ONE): + skip, min, max = code[i: i+3] + if max == MAXREPEAT: + max = 'MAXREPEAT' + print_(op, skip, min, max, to=i+skip) + dis_(i+3, i+skip) + i += skip + elif op is GROUPREF_EXISTS: + arg, skip = code[i: i+2] + print_(op, arg, skip, to=i+skip) + i += 2 + elif op in (ASSERT, ASSERT_NOT): + skip, arg = code[i: i+2] + print_(op, skip, arg, to=i+skip) + dis_(i+2, i+skip) + i += skip + elif op is INFO: + skip, flags, min, max = code[i: i+4] + if max == MAXREPEAT: + max = 'MAXREPEAT' + print_(op, skip, bin(flags), min, max, to=i+skip) + start = i+4 + if flags & SRE_INFO_PREFIX: + prefix_len, prefix_skip = code[i+4: i+6] + print_2(' prefix_skip', prefix_skip) + start = i + 6 + prefix = code[start: start+prefix_len] + print_2(' prefix', + '[%s]' % ', '.join('%#02x' % x for x in prefix), + '(%r)' % ''.join(map(chr, prefix))) + start += prefix_len + print_2(' overlap', code[start: start+prefix_len]) + start += prefix_len + if flags & SRE_INFO_CHARSET: + level += 1 + print_2('in') + dis_(start, i+skip) + level -= 1 + i += skip + else: + raise ValueError(op) + + level -= 1 + + dis_(0, len(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) + + if flags & SRE_FLAG_DEBUG: + print() + dis(code) + + # 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, tuple(indexgroup) + ) diff --git a/env/Lib/sre_constants.py b/env/Lib/sre_constants.py new file mode 100644 index 0000000..13deb00 --- /dev/null +++ b/env/Lib/sre_constants.py @@ -0,0 +1,261 @@ +# +# Secret Labs' Regular Expression Engine +# +# various symbols used by the regular expression engine. +# run this script to update the _sre include files! +# +# 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""" + +# update when constants are added or removed + +MAGIC = 20171005 + +from _sre import MAXREPEAT, MAXGROUPS + +# SRE standard exception (access as sre.error) +# should this really be here? + +class error(Exception): + """Exception raised for invalid regular expressions. + + Attributes: + + msg: The unformatted error message + pattern: The regular expression pattern + pos: The index in the pattern where compilation failed (may be None) + lineno: The line corresponding to pos (may be None) + colno: The column corresponding to pos (may be None) + """ + + __module__ = 're' + + def __init__(self, msg, pattern=None, pos=None): + self.msg = msg + self.pattern = pattern + self.pos = pos + if pattern is not None and pos is not None: + msg = '%s at position %d' % (msg, pos) + if isinstance(pattern, str): + newline = '\n' + else: + newline = b'\n' + self.lineno = pattern.count(newline, 0, pos) + 1 + self.colno = pos - pattern.rfind(newline, 0, pos) + if newline in pattern: + msg = '%s (line %d, column %d)' % (msg, self.lineno, self.colno) + else: + self.lineno = self.colno = None + super().__init__(msg) + + +class _NamedIntConstant(int): + def __new__(cls, value, name): + self = super(_NamedIntConstant, cls).__new__(cls, value) + self.name = name + return self + + def __str__(self): + return self.name + + __repr__ = __str__ + +MAXREPEAT = _NamedIntConstant(MAXREPEAT, 'MAXREPEAT') + +def _makecodes(names): + names = names.strip().split() + items = [_NamedIntConstant(i, name) for i, name in enumerate(names)] + globals().update({item.name: item for item in items}) + return items + +# operators +# failure=0 success=1 (just because it looks better that way :-) +OPCODES = _makecodes(""" + FAILURE SUCCESS + + ANY ANY_ALL + ASSERT ASSERT_NOT + AT + BRANCH + CALL + CATEGORY + CHARSET BIGCHARSET + GROUPREF GROUPREF_EXISTS + IN + INFO + JUMP + LITERAL + MARK + MAX_UNTIL + MIN_UNTIL + NOT_LITERAL + NEGATE + RANGE + REPEAT + REPEAT_ONE + SUBPATTERN + MIN_REPEAT_ONE + + GROUPREF_IGNORE + IN_IGNORE + LITERAL_IGNORE + NOT_LITERAL_IGNORE + + GROUPREF_LOC_IGNORE + IN_LOC_IGNORE + LITERAL_LOC_IGNORE + NOT_LITERAL_LOC_IGNORE + + GROUPREF_UNI_IGNORE + IN_UNI_IGNORE + LITERAL_UNI_IGNORE + NOT_LITERAL_UNI_IGNORE + RANGE_UNI_IGNORE + + MIN_REPEAT MAX_REPEAT +""") +del OPCODES[-2:] # remove MIN_REPEAT and MAX_REPEAT + +# positions +ATCODES = _makecodes(""" + AT_BEGINNING AT_BEGINNING_LINE AT_BEGINNING_STRING + AT_BOUNDARY AT_NON_BOUNDARY + AT_END AT_END_LINE AT_END_STRING + + AT_LOC_BOUNDARY AT_LOC_NON_BOUNDARY + + AT_UNI_BOUNDARY AT_UNI_NON_BOUNDARY +""") + +# categories +CHCODES = _makecodes(""" + CATEGORY_DIGIT CATEGORY_NOT_DIGIT + CATEGORY_SPACE CATEGORY_NOT_SPACE + CATEGORY_WORD CATEGORY_NOT_WORD + CATEGORY_LINEBREAK CATEGORY_NOT_LINEBREAK + + CATEGORY_LOC_WORD CATEGORY_LOC_NOT_WORD + + CATEGORY_UNI_DIGIT CATEGORY_UNI_NOT_DIGIT + CATEGORY_UNI_SPACE CATEGORY_UNI_NOT_SPACE + CATEGORY_UNI_WORD CATEGORY_UNI_NOT_WORD + CATEGORY_UNI_LINEBREAK CATEGORY_UNI_NOT_LINEBREAK +""") + + +# replacement operations for "ignore case" mode +OP_IGNORE = { + LITERAL: LITERAL_IGNORE, + NOT_LITERAL: NOT_LITERAL_IGNORE, +} + +OP_LOCALE_IGNORE = { + LITERAL: LITERAL_LOC_IGNORE, + NOT_LITERAL: NOT_LITERAL_LOC_IGNORE, +} + +OP_UNICODE_IGNORE = { + LITERAL: LITERAL_UNI_IGNORE, + NOT_LITERAL: NOT_LITERAL_UNI_IGNORE, +} + +AT_MULTILINE = { + AT_BEGINNING: AT_BEGINNING_LINE, + AT_END: AT_END_LINE +} + +AT_LOCALE = { + AT_BOUNDARY: AT_LOC_BOUNDARY, + AT_NON_BOUNDARY: AT_LOC_NON_BOUNDARY +} + +AT_UNICODE = { + AT_BOUNDARY: AT_UNI_BOUNDARY, + AT_NON_BOUNDARY: AT_UNI_NON_BOUNDARY +} + +CH_LOCALE = { + CATEGORY_DIGIT: CATEGORY_DIGIT, + CATEGORY_NOT_DIGIT: CATEGORY_NOT_DIGIT, + CATEGORY_SPACE: CATEGORY_SPACE, + CATEGORY_NOT_SPACE: CATEGORY_NOT_SPACE, + CATEGORY_WORD: CATEGORY_LOC_WORD, + CATEGORY_NOT_WORD: CATEGORY_LOC_NOT_WORD, + CATEGORY_LINEBREAK: CATEGORY_LINEBREAK, + CATEGORY_NOT_LINEBREAK: CATEGORY_NOT_LINEBREAK +} + +CH_UNICODE = { + CATEGORY_DIGIT: CATEGORY_UNI_DIGIT, + CATEGORY_NOT_DIGIT: CATEGORY_UNI_NOT_DIGIT, + CATEGORY_SPACE: CATEGORY_UNI_SPACE, + CATEGORY_NOT_SPACE: CATEGORY_UNI_NOT_SPACE, + CATEGORY_WORD: CATEGORY_UNI_WORD, + CATEGORY_NOT_WORD: CATEGORY_UNI_NOT_WORD, + CATEGORY_LINEBREAK: CATEGORY_UNI_LINEBREAK, + CATEGORY_NOT_LINEBREAK: CATEGORY_UNI_NOT_LINEBREAK +} + +# flags +SRE_FLAG_TEMPLATE = 1 # template mode (disable backtracking) +SRE_FLAG_IGNORECASE = 2 # case insensitive +SRE_FLAG_LOCALE = 4 # honour system locale +SRE_FLAG_MULTILINE = 8 # treat target as multiline string +SRE_FLAG_DOTALL = 16 # treat target as a single string +SRE_FLAG_UNICODE = 32 # use unicode "locale" +SRE_FLAG_VERBOSE = 64 # ignore whitespace and comments +SRE_FLAG_DEBUG = 128 # debugging +SRE_FLAG_ASCII = 256 # use ascii "locale" + +# flags for INFO primitive +SRE_INFO_PREFIX = 1 # has prefix +SRE_INFO_LITERAL = 2 # entire pattern is literal (given by prefix) +SRE_INFO_CHARSET = 4 # pattern starts with character from given set + +if __name__ == "__main__": + def dump(f, d, prefix): + items = sorted(d) + for item in items: + f.write("#define %s_%s %d\n" % (prefix, item, item)) + with open("sre_constants.h", "w") as f: + f.write("""\ +/* + * Secret Labs' Regular Expression Engine + * + * regular expression matching engine + * + * NOTE: This file is generated by sre_constants.py. If you need + * to change anything in here, edit sre_constants.py and run it. + * + * Copyright (c) 1997-2001 by Secret Labs AB. All rights reserved. + * + * See the _sre.c file for information on usage and redistribution. + */ + +""") + + f.write("#define SRE_MAGIC %d\n" % MAGIC) + + dump(f, OPCODES, "SRE_OP") + dump(f, ATCODES, "SRE") + dump(f, CHCODES, "SRE") + + f.write("#define SRE_FLAG_TEMPLATE %d\n" % SRE_FLAG_TEMPLATE) + f.write("#define SRE_FLAG_IGNORECASE %d\n" % SRE_FLAG_IGNORECASE) + f.write("#define SRE_FLAG_LOCALE %d\n" % SRE_FLAG_LOCALE) + f.write("#define SRE_FLAG_MULTILINE %d\n" % SRE_FLAG_MULTILINE) + f.write("#define SRE_FLAG_DOTALL %d\n" % SRE_FLAG_DOTALL) + f.write("#define SRE_FLAG_UNICODE %d\n" % SRE_FLAG_UNICODE) + f.write("#define SRE_FLAG_VERBOSE %d\n" % SRE_FLAG_VERBOSE) + f.write("#define SRE_FLAG_DEBUG %d\n" % SRE_FLAG_DEBUG) + f.write("#define SRE_FLAG_ASCII %d\n" % SRE_FLAG_ASCII) + + f.write("#define SRE_INFO_PREFIX %d\n" % SRE_INFO_PREFIX) + f.write("#define SRE_INFO_LITERAL %d\n" % SRE_INFO_LITERAL) + f.write("#define SRE_INFO_CHARSET %d\n" % SRE_INFO_CHARSET) + + print("done") diff --git a/env/Lib/sre_parse.py b/env/Lib/sre_parse.py new file mode 100644 index 0000000..a53735b --- /dev/null +++ b/env/Lib/sre_parse.py @@ -0,0 +1,1046 @@ +# +# 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 + +from sre_constants import * + +SPECIAL_CHARS = ".\\[{()*+?^$|" +REPEAT_CHARS = "*+?{" + +DIGITS = frozenset("0123456789") + +OCTDIGITS = frozenset("01234567") +HEXDIGITS = frozenset("0123456789abcdefABCDEF") +ASCIILETTERS = frozenset("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ") + +WHITESPACE = frozenset(" \t\n\r\v\f") + +_REPEATCODES = frozenset({MIN_REPEAT, MAX_REPEAT}) +_UNITCODES = frozenset({ANY, RANGE, IN, LITERAL, NOT_LITERAL, CATEGORY}) + +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 + "a": SRE_FLAG_ASCII, + "t": SRE_FLAG_TEMPLATE, + "u": SRE_FLAG_UNICODE, +} + +TYPE_FLAGS = SRE_FLAG_ASCII | SRE_FLAG_LOCALE | SRE_FLAG_UNICODE +GLOBAL_FLAGS = SRE_FLAG_DEBUG | SRE_FLAG_TEMPLATE + +class Verbose(Exception): + pass + +class Pattern: + # master pattern object. keeps track of global attributes + def __init__(self): + self.flags = 0 + self.groupdict = {} + self.groupwidths = [None] # group 0 + self.lookbehindgroups = None + @property + def groups(self): + return len(self.groupwidths) + def opengroup(self, name=None): + gid = self.groups + self.groupwidths.append(None) + if self.groups > MAXGROUPS: + raise error("too many groups") + if name is not None: + ogid = self.groupdict.get(name, None) + if ogid is not None: + raise error("redefinition of group name %r as group %d; " + "was group %d" % (name, gid, ogid)) + self.groupdict[name] = gid + return gid + def closegroup(self, gid, p): + self.groupwidths[gid] = p.getwidth() + def checkgroup(self, gid): + return gid < self.groups and self.groupwidths[gid] is not None + + def checklookbehindgroup(self, gid, source): + if self.lookbehindgroups is not None: + if not self.checkgroup(gid): + raise source.error('cannot refer to an open group') + if gid >= self.lookbehindgroups: + raise source.error('cannot refer to group defined in the same ' + 'lookbehind subpattern') + +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 = True + seqtypes = (tuple, list) + for op, av in self.data: + print(level*" " + str(op), end='') + if op is IN: + # member sublanguage + print() + for op, a in av: + print((level+1)*" " + str(op), a) + elif op is BRANCH: + print() + for i, a in enumerate(av[1]): + if i: + print(level*" " + "OR") + a.dump(level+1) + elif op is GROUPREF_EXISTS: + condgroup, item_yes, item_no = av + print('', condgroup) + item_yes.dump(level+1) + if item_no: + print(level*" " + "ELSE") + item_no.dump(level+1) + elif isinstance(av, seqtypes): + nl = False + for a in av: + if isinstance(a, SubPattern): + if not nl: + print() + a.dump(level+1) + nl = True + else: + if not nl: + print(' ', end='') + print(a, end='') + nl = False + if not nl: + print() + else: + print('', av) + 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 is not None: + return self.width + lo = hi = 0 + for op, av in self.data: + if op is BRANCH: + i = MAXREPEAT - 1 + 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 + i * av[0] + hi = hi + j * av[1] + elif op in _UNITCODES: + lo = lo + 1 + hi = hi + 1 + elif op is GROUPREF: + i, j = self.pattern.groupwidths[av] + lo = lo + i + hi = hi + j + elif op is GROUPREF_EXISTS: + i, j = av[1].getwidth() + if av[2] is not None: + l, h = av[2].getwidth() + i = min(i, l) + j = max(j, h) + else: + i = 0 + lo = lo + i + hi = hi + j + elif op is SUCCESS: + break + self.width = min(lo, MAXREPEAT - 1), min(hi, MAXREPEAT) + return self.width + +class Tokenizer: + def __init__(self, string): + self.istext = isinstance(string, str) + self.string = string + if not self.istext: + string = str(string, 'latin1') + self.decoded_string = string + self.index = 0 + self.next = None + self.__next() + def __next(self): + index = self.index + try: + char = self.decoded_string[index] + except IndexError: + self.next = None + return + if char == "\\": + index += 1 + try: + char += self.decoded_string[index] + except IndexError: + raise error("bad escape (end of pattern)", + self.string, len(self.string) - 1) from None + self.index = index + 1 + self.next = char + def match(self, char): + if char == self.next: + self.__next() + return True + return False + def get(self): + this = self.next + self.__next() + return this + def getwhile(self, n, charset): + result = '' + for _ in range(n): + c = self.next + if c not in charset: + break + result += c + self.__next() + return result + def getuntil(self, terminator): + result = '' + while True: + c = self.next + self.__next() + if c is None: + if not result: + raise self.error("missing group name") + raise self.error("missing %s, unterminated name" % terminator, + len(result)) + if c == terminator: + if not result: + raise self.error("missing group name", 1) + break + result += c + return result + @property + def pos(self): + return self.index - len(self.next or '') + def tell(self): + return self.index - len(self.next or '') + def seek(self, index): + self.index = index + self.__next() + + def error(self, msg, offset=0): + return error(msg, self.string, self.tell() - offset) + +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] is IN: + return code + try: + c = escape[1:2] + if c == "x": + # hexadecimal escape (exactly two digits) + escape += source.getwhile(2, HEXDIGITS) + if len(escape) != 4: + raise source.error("incomplete escape %s" % escape, len(escape)) + return LITERAL, int(escape[2:], 16) + elif c == "u" and source.istext: + # unicode escape (exactly four digits) + escape += source.getwhile(4, HEXDIGITS) + if len(escape) != 6: + raise source.error("incomplete escape %s" % escape, len(escape)) + return LITERAL, int(escape[2:], 16) + elif c == "U" and source.istext: + # unicode escape (exactly eight digits) + escape += source.getwhile(8, HEXDIGITS) + if len(escape) != 10: + raise source.error("incomplete escape %s" % escape, len(escape)) + c = int(escape[2:], 16) + chr(c) # raise ValueError for invalid code + return LITERAL, c + elif c in OCTDIGITS: + # octal escape (up to three digits) + escape += source.getwhile(2, OCTDIGITS) + c = int(escape[1:], 8) + if c > 0o377: + raise source.error('octal escape value %s outside of ' + 'range 0-0o377' % escape, len(escape)) + return LITERAL, c + elif c in DIGITS: + raise ValueError + if len(escape) == 2: + if c in ASCIILETTERS: + raise source.error('bad escape %s' % escape, len(escape)) + return LITERAL, ord(escape[1]) + except ValueError: + pass + raise source.error("bad escape %s" % escape, len(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 + escape += source.getwhile(2, HEXDIGITS) + if len(escape) != 4: + raise source.error("incomplete escape %s" % escape, len(escape)) + return LITERAL, int(escape[2:], 16) + elif c == "u" and source.istext: + # unicode escape (exactly four digits) + escape += source.getwhile(4, HEXDIGITS) + if len(escape) != 6: + raise source.error("incomplete escape %s" % escape, len(escape)) + return LITERAL, int(escape[2:], 16) + elif c == "U" and source.istext: + # unicode escape (exactly eight digits) + escape += source.getwhile(8, HEXDIGITS) + if len(escape) != 10: + raise source.error("incomplete escape %s" % escape, len(escape)) + c = int(escape[2:], 16) + chr(c) # raise ValueError for invalid code + return LITERAL, c + elif c == "0": + # octal escape + escape += source.getwhile(2, OCTDIGITS) + return LITERAL, int(escape[1:], 8) + elif c in DIGITS: + # octal escape *or* decimal group reference (sigh) + if source.next in DIGITS: + 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 += source.get() + c = int(escape[1:], 8) + if c > 0o377: + raise source.error('octal escape value %s outside of ' + 'range 0-0o377' % escape, + len(escape)) + return LITERAL, c + # not an octal escape, so this is a group reference + group = int(escape[1:]) + if group < state.groups: + if not state.checkgroup(group): + raise source.error("cannot refer to an open group", + len(escape)) + state.checklookbehindgroup(group, source) + return GROUPREF, group + raise source.error("invalid group reference %d" % group, len(escape) - 1) + if len(escape) == 2: + if c in ASCIILETTERS: + raise source.error("bad escape %s" % escape, len(escape)) + return LITERAL, ord(escape[1]) + except ValueError: + pass + raise source.error("bad escape %s" % escape, len(escape)) + +def _uniq(items): + if len(set(items)) == len(items): + return items + newitems = [] + for item in items: + if item not in newitems: + newitems.append(item) + return newitems + +def _parse_sub(source, state, verbose, nested): + # parse an alternation: a|b|c + + items = [] + itemsappend = items.append + sourcematch = source.match + start = source.tell() + while True: + itemsappend(_parse(source, state, verbose, nested + 1, + not nested and not items)) + if not sourcematch("|"): + break + + if len(items) == 1: + return items[0] + + subpattern = SubPattern(state) + + # check if all items share a common prefix + while True: + 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] + subpattern.append(prefix) + continue # check next one + break + + # check if the branch can be replaced by a character set + set = [] + for item in items: + if len(item) != 1: + break + op, av = item[0] + if op is LITERAL: + set.append((op, av)) + elif op is IN and av[0][0] is not NEGATE: + set.extend(av) + else: + break + else: + # we can store this as a character set instead of a + # branch (the compiler may optimize this even more) + subpattern.append((IN, _uniq(set))) + return subpattern + + subpattern.append((BRANCH, (None, items))) + return subpattern + +def _parse(source, state, verbose, nested, first=False): + # parse a simple pattern + subpattern = SubPattern(state) + + # precompute constants into local variables + subpatternappend = subpattern.append + sourceget = source.get + sourcematch = source.match + _len = len + _ord = ord + + while True: + + this = source.next + if this is None: + break # end of pattern + if this in "|)": + break # end of subpattern + sourceget() + + if verbose: + # skip whitespace and comments + if this in WHITESPACE: + continue + if this == "#": + while True: + this = sourceget() + if this is None or this == "\n": + break + continue + + if this[0] == "\\": + code = _escape(source, this, state) + subpatternappend(code) + + elif this not in SPECIAL_CHARS: + subpatternappend((LITERAL, _ord(this))) + + elif this == "[": + here = source.tell() - 1 + # character set + set = [] + setappend = set.append +## if sourcematch(":"): +## pass # handle character classes + if source.next == '[': + import warnings + warnings.warn( + 'Possible nested set at position %d' % source.tell(), + FutureWarning, stacklevel=nested + 6 + ) + negate = sourcematch("^") + # check remaining characters + while True: + this = sourceget() + if this is None: + raise source.error("unterminated character set", + source.tell() - here) + if this == "]" and set: + break + elif this[0] == "\\": + code1 = _class_escape(source, this) + else: + if set and this in '-&~|' and source.next == this: + import warnings + warnings.warn( + 'Possible set %s at position %d' % ( + 'difference' if this == '-' else + 'intersection' if this == '&' else + 'symmetric difference' if this == '~' else + 'union', + source.tell() - 1), + FutureWarning, stacklevel=nested + 6 + ) + code1 = LITERAL, _ord(this) + if sourcematch("-"): + # potential range + that = sourceget() + if that is None: + raise source.error("unterminated character set", + source.tell() - here) + if that == "]": + if code1[0] is IN: + code1 = code1[1][0] + setappend(code1) + setappend((LITERAL, _ord("-"))) + break + if that[0] == "\\": + code2 = _class_escape(source, that) + else: + if that == '-': + import warnings + warnings.warn( + 'Possible set difference at position %d' % ( + source.tell() - 2), + FutureWarning, stacklevel=nested + 6 + ) + code2 = LITERAL, _ord(that) + if code1[0] != LITERAL or code2[0] != LITERAL: + msg = "bad character range %s-%s" % (this, that) + raise source.error(msg, len(this) + 1 + len(that)) + lo = code1[1] + hi = code2[1] + if hi < lo: + msg = "bad character range %s-%s" % (this, that) + raise source.error(msg, len(this) + 1 + len(that)) + setappend((RANGE, (lo, hi))) + else: + if code1[0] is IN: + code1 = code1[1][0] + setappend(code1) + + set = _uniq(set) + # XXX: should move set optimization to compiler! + if _len(set) == 1 and set[0][0] is LITERAL: + # optimization + if negate: + subpatternappend((NOT_LITERAL, set[0][1])) + else: + subpatternappend(set[0]) + else: + if negate: + set.insert(0, (NEGATE, None)) + # charmap optimization can't be added here because + # global flags still are not known + subpatternappend((IN, set)) + + elif this in REPEAT_CHARS: + # repeat previous item + here = source.tell() + 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 + + min, max = 0, MAXREPEAT + lo = hi = "" + while source.next in DIGITS: + lo += sourceget() + if sourcematch(","): + while source.next in DIGITS: + 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 source.error("min repeat greater than max repeat", + source.tell() - here) + else: + raise AssertionError("unsupported quantifier %r" % (char,)) + # figure out which item to repeat + if subpattern: + item = subpattern[-1:] + else: + item = None + if not item or item[0][0] is AT: + raise source.error("nothing to repeat", + source.tell() - here + len(this)) + if item[0][0] in _REPEATCODES: + raise source.error("multiple repeat", + source.tell() - here + len(this)) + if item[0][0] is SUBPATTERN: + group, add_flags, del_flags, p = item[0][1] + if group is None and not add_flags and not del_flags: + item = p + if sourcematch("?"): + subpattern[-1] = (MIN_REPEAT, (min, max, item)) + else: + subpattern[-1] = (MAX_REPEAT, (min, max, item)) + + elif this == ".": + subpatternappend((ANY, None)) + + elif this == "(": + start = source.tell() - 1 + group = True + name = None + add_flags = 0 + del_flags = 0 + if sourcematch("?"): + # options + char = sourceget() + if char is None: + raise source.error("unexpected end of pattern") + if char == "P": + # python extensions + if sourcematch("<"): + # named group: skip forward to end of name + name = source.getuntil(">") + if not name.isidentifier(): + msg = "bad character in group name %r" % name + raise source.error(msg, len(name) + 1) + elif sourcematch("="): + # named backreference + name = source.getuntil(")") + if not name.isidentifier(): + msg = "bad character in group name %r" % name + raise source.error(msg, len(name) + 1) + gid = state.groupdict.get(name) + if gid is None: + msg = "unknown group name %r" % name + raise source.error(msg, len(name) + 1) + if not state.checkgroup(gid): + raise source.error("cannot refer to an open group", + len(name) + 1) + state.checklookbehindgroup(gid, source) + subpatternappend((GROUPREF, gid)) + continue + + else: + char = sourceget() + if char is None: + raise source.error("unexpected end of pattern") + raise source.error("unknown extension ?P" + char, + len(char) + 2) + elif char == ":": + # non-capturing group + group = None + elif char == "#": + # comment + while True: + if source.next is None: + raise source.error("missing ), unterminated comment", + source.tell() - start) + if sourceget() == ")": + break + continue + + elif char in "=!<": + # lookahead assertions + dir = 1 + if char == "<": + char = sourceget() + if char is None: + raise source.error("unexpected end of pattern") + if char not in "=!": + raise source.error("unknown extension ?<" + char, + len(char) + 2) + dir = -1 # lookbehind + lookbehindgroups = state.lookbehindgroups + if lookbehindgroups is None: + state.lookbehindgroups = state.groups + p = _parse_sub(source, state, verbose, nested + 1) + if dir < 0: + if lookbehindgroups is None: + state.lookbehindgroups = None + if not sourcematch(")"): + raise source.error("missing ), unterminated subpattern", + source.tell() - start) + if char == "=": + subpatternappend((ASSERT, (dir, p))) + else: + subpatternappend((ASSERT_NOT, (dir, p))) + continue + + elif char == "(": + # conditional backreference group + condname = source.getuntil(")") + if condname.isidentifier(): + condgroup = state.groupdict.get(condname) + if condgroup is None: + msg = "unknown group name %r" % condname + raise source.error(msg, len(condname) + 1) + else: + try: + condgroup = int(condname) + if condgroup < 0: + raise ValueError + except ValueError: + msg = "bad character in group name %r" % condname + raise source.error(msg, len(condname) + 1) from None + if not condgroup: + raise source.error("bad group number", + len(condname) + 1) + if condgroup >= MAXGROUPS: + msg = "invalid group reference %d" % condgroup + raise source.error(msg, len(condname) + 1) + state.checklookbehindgroup(condgroup, source) + item_yes = _parse(source, state, verbose, nested + 1) + if source.match("|"): + item_no = _parse(source, state, verbose, nested + 1) + if source.next == "|": + raise source.error("conditional backref with more than two branches") + else: + item_no = None + if not source.match(")"): + raise source.error("missing ), unterminated subpattern", + source.tell() - start) + subpatternappend((GROUPREF_EXISTS, (condgroup, item_yes, item_no))) + continue + + elif char in FLAGS or char == "-": + # flags + flags = _parse_flags(source, state, char) + if flags is None: # global flags + if not first or subpattern: + import warnings + warnings.warn( + 'Flags not at the start of the expression %r%s' % ( + source.string[:20], # truncate long regexes + ' (truncated)' if len(source.string) > 20 else '', + ), + DeprecationWarning, stacklevel=nested + 6 + ) + if (state.flags & SRE_FLAG_VERBOSE) and not verbose: + raise Verbose + continue + + add_flags, del_flags = flags + group = None + else: + raise source.error("unknown extension ?" + char, + len(char) + 1) + + # parse group contents + if group is not None: + try: + group = state.opengroup(name) + except error as err: + raise source.error(err.msg, len(name) + 1) from None + sub_verbose = ((verbose or (add_flags & SRE_FLAG_VERBOSE)) and + not (del_flags & SRE_FLAG_VERBOSE)) + p = _parse_sub(source, state, sub_verbose, nested + 1) + if not source.match(")"): + raise source.error("missing ), unterminated subpattern", + source.tell() - start) + if group is not None: + state.closegroup(group, p) + subpatternappend((SUBPATTERN, (group, add_flags, del_flags, p))) + + elif this == "^": + subpatternappend((AT, AT_BEGINNING)) + + elif this == "$": + subpatternappend((AT, AT_END)) + + else: + raise AssertionError("unsupported special character %r" % (char,)) + + # unpack non-capturing groups + for i in range(len(subpattern))[::-1]: + op, av = subpattern[i] + if op is SUBPATTERN: + group, add_flags, del_flags, p = av + if group is None and not add_flags and not del_flags: + subpattern[i: i+1] = p + + return subpattern + +def _parse_flags(source, state, char): + sourceget = source.get + add_flags = 0 + del_flags = 0 + if char != "-": + while True: + flag = FLAGS[char] + if source.istext: + if char == 'L': + msg = "bad inline flags: cannot use 'L' flag with a str pattern" + raise source.error(msg) + else: + if char == 'u': + msg = "bad inline flags: cannot use 'u' flag with a bytes pattern" + raise source.error(msg) + add_flags |= flag + if (flag & TYPE_FLAGS) and (add_flags & TYPE_FLAGS) != flag: + msg = "bad inline flags: flags 'a', 'u' and 'L' are incompatible" + raise source.error(msg) + char = sourceget() + if char is None: + raise source.error("missing -, : or )") + if char in ")-:": + break + if char not in FLAGS: + msg = "unknown flag" if char.isalpha() else "missing -, : or )" + raise source.error(msg, len(char)) + if char == ")": + state.flags |= add_flags + return None + if add_flags & GLOBAL_FLAGS: + raise source.error("bad inline flags: cannot turn on global flag", 1) + if char == "-": + char = sourceget() + if char is None: + raise source.error("missing flag") + if char not in FLAGS: + msg = "unknown flag" if char.isalpha() else "missing flag" + raise source.error(msg, len(char)) + while True: + flag = FLAGS[char] + if flag & TYPE_FLAGS: + msg = "bad inline flags: cannot turn off flags 'a', 'u' and 'L'" + raise source.error(msg) + del_flags |= flag + char = sourceget() + if char is None: + raise source.error("missing :") + if char == ":": + break + if char not in FLAGS: + msg = "unknown flag" if char.isalpha() else "missing :" + raise source.error(msg, len(char)) + assert char == ":" + if del_flags & GLOBAL_FLAGS: + raise source.error("bad inline flags: cannot turn off global flag", 1) + if add_flags & del_flags: + raise source.error("bad inline flags: flag turned on and off", 1) + return add_flags, del_flags + +def fix_flags(src, flags): + # Check and fix flags according to the type of pattern (str or bytes) + if isinstance(src, str): + if flags & SRE_FLAG_LOCALE: + raise ValueError("cannot use LOCALE flag with a str pattern") + if not flags & SRE_FLAG_ASCII: + flags |= SRE_FLAG_UNICODE + elif flags & SRE_FLAG_UNICODE: + raise ValueError("ASCII and UNICODE flags are incompatible") + else: + if flags & SRE_FLAG_UNICODE: + raise ValueError("cannot use UNICODE flag with a bytes pattern") + if flags & SRE_FLAG_LOCALE and flags & SRE_FLAG_ASCII: + raise ValueError("ASCII and LOCALE flags are incompatible") + return flags + +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 + + try: + p = _parse_sub(source, pattern, flags & SRE_FLAG_VERBOSE, 0) + except Verbose: + # the VERBOSE flag was switched on inside the pattern. to be + # on the safe side, we'll parse the whole thing again... + pattern = Pattern() + pattern.flags = flags | SRE_FLAG_VERBOSE + pattern.str = str + source.seek(0) + p = _parse_sub(source, pattern, True, 0) + + p.pattern.flags = fix_flags(str, p.pattern.flags) + + if source.next is not None: + assert source.next == ")" + raise source.error("unbalanced parenthesis") + + if flags & SRE_FLAG_DEBUG: + p.dump() + + return p + +def parse_template(source, pattern): + # parse 're' replacement string into list of literals and + # group references + s = Tokenizer(source) + sget = s.get + groups = [] + literals = [] + literal = [] + lappend = literal.append + def addgroup(index, pos): + if index > pattern.groups: + raise s.error("invalid group reference %d" % index, pos) + if literal: + literals.append(''.join(literal)) + del literal[:] + groups.append((len(literals), index)) + literals.append(None) + groupindex = pattern.groupindex + while True: + this = sget() + if this is None: + break # end of replacement string + if this[0] == "\\": + # group + c = this[1] + if c == "g": + name = "" + if not s.match("<"): + raise s.error("missing <") + name = s.getuntil(">") + if name.isidentifier(): + try: + index = groupindex[name] + except KeyError: + raise IndexError("unknown group name %r" % name) + else: + try: + index = int(name) + if index < 0: + raise ValueError + except ValueError: + raise s.error("bad character in group name %r" % name, + len(name) + 1) from None + if index >= MAXGROUPS: + raise s.error("invalid group reference %d" % index, + len(name) + 1) + addgroup(index, len(name) + 1) + elif c == "0": + if s.next in OCTDIGITS: + this += sget() + if s.next in OCTDIGITS: + this += sget() + lappend(chr(int(this[1:], 8) & 0xff)) + elif c in DIGITS: + isoctal = False + if s.next in DIGITS: + this += sget() + if (c in OCTDIGITS and this[2] in OCTDIGITS and + s.next in OCTDIGITS): + this += sget() + isoctal = True + c = int(this[1:], 8) + if c > 0o377: + raise s.error('octal escape value %s outside of ' + 'range 0-0o377' % this, len(this)) + lappend(chr(c)) + if not isoctal: + addgroup(int(this[1:]), len(this) - 1) + else: + try: + this = chr(ESCAPES[this][1]) + except KeyError: + if c in ASCIILETTERS: + raise s.error('bad escape %s' % this, len(this)) + lappend(this) + else: + lappend(this) + if literal: + literals.append(''.join(literal)) + if not isinstance(source, str): + # The tokenizer implicitly decodes bytes objects as latin-1, we must + # therefore re-encode the final representation. + literals = [None if s is None else s.encode('latin-1') for s in literals] + return groups, literals + +def expand_template(template, match): + g = match.group + empty = match.string[:0] + groups, literals = template + literals = literals[:] + try: + for index, group in groups: + literals[index] = g(group) or empty + except IndexError: + raise error("invalid group reference %d" % index) + return empty.join(literals) diff --git a/env/Lib/stat.py b/env/Lib/stat.py new file mode 100644 index 0000000..46837c0 --- /dev/null +++ b/env/Lib/stat.py @@ -0,0 +1,178 @@ +"""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 the portion of the file's mode that can be set by + os.chmod(). + """ + return mode & 0o7777 + +def S_IFMT(mode): + """Return the portion of the file's mode that describes the + file type. + """ + return mode & 0o170000 + +# Constants used as S_IFMT() for various file types +# (not all are implemented on all systems) + +S_IFDIR = 0o040000 # directory +S_IFCHR = 0o020000 # character device +S_IFBLK = 0o060000 # block device +S_IFREG = 0o100000 # regular file +S_IFIFO = 0o010000 # fifo (named pipe) +S_IFLNK = 0o120000 # symbolic link +S_IFSOCK = 0o140000 # socket file + +# Functions to test for each file type + +def S_ISDIR(mode): + """Return True if mode is from a directory.""" + return S_IFMT(mode) == S_IFDIR + +def S_ISCHR(mode): + """Return True if mode is from a character special device file.""" + return S_IFMT(mode) == S_IFCHR + +def S_ISBLK(mode): + """Return True if mode is from a block special device file.""" + return S_IFMT(mode) == S_IFBLK + +def S_ISREG(mode): + """Return True if mode is from a regular file.""" + return S_IFMT(mode) == S_IFREG + +def S_ISFIFO(mode): + """Return True if mode is from a FIFO (named pipe).""" + return S_IFMT(mode) == S_IFIFO + +def S_ISLNK(mode): + """Return True if mode is from a symbolic link.""" + return S_IFMT(mode) == S_IFLNK + +def S_ISSOCK(mode): + """Return True if mode is from a socket.""" + return S_IFMT(mode) == S_IFSOCK + +# Names for permission bits + +S_ISUID = 0o4000 # set UID bit +S_ISGID = 0o2000 # set GID bit +S_ENFMT = S_ISGID # file locking enforcement +S_ISVTX = 0o1000 # sticky bit +S_IREAD = 0o0400 # Unix V7 synonym for S_IRUSR +S_IWRITE = 0o0200 # Unix V7 synonym for S_IWUSR +S_IEXEC = 0o0100 # Unix V7 synonym for S_IXUSR +S_IRWXU = 0o0700 # mask for owner permissions +S_IRUSR = 0o0400 # read by owner +S_IWUSR = 0o0200 # write by owner +S_IXUSR = 0o0100 # execute by owner +S_IRWXG = 0o0070 # mask for group permissions +S_IRGRP = 0o0040 # read by group +S_IWGRP = 0o0020 # write by group +S_IXGRP = 0o0010 # execute by group +S_IRWXO = 0o0007 # mask for others (not in group) permissions +S_IROTH = 0o0004 # read by others +S_IWOTH = 0o0002 # write by others +S_IXOTH = 0o0001 # execute by others + +# Names for file flags + +UF_NODUMP = 0x00000001 # do not dump file +UF_IMMUTABLE = 0x00000002 # file may not be changed +UF_APPEND = 0x00000004 # file may only be appended to +UF_OPAQUE = 0x00000008 # directory is opaque when viewed through a union stack +UF_NOUNLINK = 0x00000010 # file may not be renamed or deleted +UF_COMPRESSED = 0x00000020 # OS X: file is hfs-compressed +UF_HIDDEN = 0x00008000 # OS X: file should not be displayed +SF_ARCHIVED = 0x00010000 # file may be archived +SF_IMMUTABLE = 0x00020000 # file may not be changed +SF_APPEND = 0x00040000 # file may only be appended to +SF_NOUNLINK = 0x00100000 # file may not be renamed or deleted +SF_SNAPSHOT = 0x00200000 # file is a snapshot file + + +_filemode_table = ( + ((S_IFLNK, "l"), + (S_IFREG, "-"), + (S_IFBLK, "b"), + (S_IFDIR, "d"), + (S_IFCHR, "c"), + (S_IFIFO, "p")), + + ((S_IRUSR, "r"),), + ((S_IWUSR, "w"),), + ((S_IXUSR|S_ISUID, "s"), + (S_ISUID, "S"), + (S_IXUSR, "x")), + + ((S_IRGRP, "r"),), + ((S_IWGRP, "w"),), + ((S_IXGRP|S_ISGID, "s"), + (S_ISGID, "S"), + (S_IXGRP, "x")), + + ((S_IROTH, "r"),), + ((S_IWOTH, "w"),), + ((S_IXOTH|S_ISVTX, "t"), + (S_ISVTX, "T"), + (S_IXOTH, "x")) +) + +def filemode(mode): + """Convert a file's mode to a string of the form '-rwxrwxrwx'.""" + 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) + + +# Windows FILE_ATTRIBUTE constants for interpreting os.stat()'s +# "st_file_attributes" member + +FILE_ATTRIBUTE_ARCHIVE = 32 +FILE_ATTRIBUTE_COMPRESSED = 2048 +FILE_ATTRIBUTE_DEVICE = 64 +FILE_ATTRIBUTE_DIRECTORY = 16 +FILE_ATTRIBUTE_ENCRYPTED = 16384 +FILE_ATTRIBUTE_HIDDEN = 2 +FILE_ATTRIBUTE_INTEGRITY_STREAM = 32768 +FILE_ATTRIBUTE_NORMAL = 128 +FILE_ATTRIBUTE_NOT_CONTENT_INDEXED = 8192 +FILE_ATTRIBUTE_NO_SCRUB_DATA = 131072 +FILE_ATTRIBUTE_OFFLINE = 4096 +FILE_ATTRIBUTE_READONLY = 1 +FILE_ATTRIBUTE_REPARSE_POINT = 1024 +FILE_ATTRIBUTE_SPARSE_FILE = 512 +FILE_ATTRIBUTE_SYSTEM = 4 +FILE_ATTRIBUTE_TEMPORARY = 256 +FILE_ATTRIBUTE_VIRTUAL = 65536 + + +# If available, use C implementation +try: + from _stat import * +except ImportError: + pass diff --git a/env/Lib/struct.py b/env/Lib/struct.py new file mode 100644 index 0000000..d6bba58 --- /dev/null +++ b/env/Lib/struct.py @@ -0,0 +1,15 @@ +__all__ = [ + # Functions + 'calcsize', 'pack', 'pack_into', 'unpack', 'unpack_from', + 'iter_unpack', + + # Classes + 'Struct', + + # Exceptions + 'error' + ] + +from _struct import * +from _struct import _clearcache +from _struct import __doc__ diff --git a/env/Lib/tarfile.py b/env/Lib/tarfile.py new file mode 100644 index 0000000..edd31e9 --- /dev/null +++ b/env/Lib/tarfile.py @@ -0,0 +1,2539 @@ +#!/usr/bin/env python3 +#------------------------------------------------------------------- +# tarfile.py +#------------------------------------------------------------------- +# Copyright (C) 2002 Lars Gustaebel +# 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. +# +"""Read from and write to tar format archives. +""" + +version = "0.9.0" +__author__ = "Lars Gust\u00e4bel (lars@gustaebel.de)" +__credits__ = "Gustavo Niemeyer, Niels Gust\u00e4bel, Richard Townsend." + +#--------- +# Imports +#--------- +from builtins import open as bltn_open +import sys +import os +import io +import shutil +import stat +import time +import struct +import copy +import re + +try: + import pwd +except ImportError: + pwd = None +try: + import grp +except ImportError: + grp = None + +# os.symlink on Windows prior to 6.0 raises NotImplementedError +symlink_exception = (AttributeError, NotImplementedError) +try: + # OSError (winerror=1314) will be raised if the caller does not hold the + # SeCreateSymbolicLinkPrivilege privilege + symlink_exception += (OSError,) +except NameError: + pass + +# from tarfile import * +__all__ = ["TarFile", "TarInfo", "is_tarfile", "TarError", "ReadError", + "CompressionError", "StreamError", "ExtractError", "HeaderError", + "ENCODING", "USTAR_FORMAT", "GNU_FORMAT", "PAX_FORMAT", + "DEFAULT_FORMAT", "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 = {"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 +} + +#--------------------------------------------------------- +# initialization +#--------------------------------------------------------- +if os.name == "nt": + 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] in (0o200, 0o377): + n = 0 + for i in range(len(s) - 1): + n <<= 8 + n += s[i + 1] + if s[0] == 0o377: + n = -(256 ** (len(s) - 1) - n) + else: + try: + s = nts(s, "ascii", "strict") + n = int(s.strip() or "0", 8) + except ValueError: + raise InvalidHeaderError("invalid header") + 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 or 0o377 byte indicate this + # particular encoding, the following digits-1 bytes are a big-endian + # base-256 representation. This allows values up to (256**(digits-1))-1. + # A 0o200 byte indicates a positive number, a 0o377 byte a negative + # number. + n = int(n) + if 0 <= n < 8 ** (digits - 1): + s = bytes("%0*o" % (digits - 1, n), "ascii") + NUL + elif format == GNU_FORMAT and -256 ** (digits - 1) <= n < 256 ** (digits - 1): + if n >= 0: + s = bytearray([0o200]) + else: + s = bytearray([0o377]) + n = 256 ** digits + n + + for i in range(digits - 1): + s.insert(1, n & 0o377) + n >>= 8 + else: + raise ValueError("overflow in number field") + + 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_from("148B8x356B", buf)) + signed_chksum = 256 + sum(struct.unpack_from("148b8x356b", buf)) + return unsigned_chksum, signed_chksum + +def copyfileobj(src, dst, length=None, exception=OSError, bufsize=None): + """Copy length bytes from fileobj src to fileobj dst. + If length is None, copy the entire content. + """ + bufsize = bufsize or 16 * 1024 + if length == 0: + return + if length is None: + shutil.copyfileobj(src, dst, bufsize) + return + + blocks, remainder = divmod(length, bufsize) + for b in range(blocks): + buf = src.read(bufsize) + if len(buf) < bufsize: + raise exception("unexpected end of data") + dst.write(buf) + + if remainder != 0: + buf = src.read(remainder) + if len(buf) < remainder: + raise exception("unexpected end of data") + dst.write(buf) + return + +def filemode(mode): + """Deprecated in this location; use stat.filemode.""" + import warnings + warnings.warn("deprecated in favor of stat.filemode", + DeprecationWarning, 2) + return stat.filemode(mode) + +def _safe_print(s): + encoding = getattr(sys.stdout, 'encoding', None) + if encoding is not None: + s = s.encode(encoding, 'backslashreplace').decode(encoding) + print(s, end=' ') + + +class TarError(Exception): + """Base exception.""" + pass +class ExtractError(TarError): + """General exception for extract errors.""" + pass +class ReadError(TarError): + """Exception for unreadable tar archives.""" + pass +class CompressionError(TarError): + """Exception for unavailable compression methods.""" + pass +class StreamError(TarError): + """Exception for unsupported operations on stream-like TarFiles.""" + pass +class HeaderError(TarError): + """Base exception for header errors.""" + pass +class EmptyHeaderError(HeaderError): + """Exception for empty headers.""" + pass +class TruncatedHeaderError(HeaderError): + """Exception for truncated headers.""" + pass +class EOFHeaderError(HeaderError): + """Exception for end of file headers.""" + pass +class InvalidHeaderError(HeaderError): + """Exception for invalid headers.""" + pass +class SubsequentHeaderError(HeaderError): + """Exception for missing and invalid extended headers.""" + pass + +#--------------------------- +# internal stream interface +#--------------------------- +class _LowLevelFile: + """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: + """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() + self.exception = zlib.error + else: + self._init_write_gz() + + elif comptype == "bz2": + try: + import bz2 + except ImportError: + raise CompressionError("bz2 module is not available") + if mode == "r": + self.dbuf = b"" + self.cmp = bz2.BZ2Decompressor() + self.exception = OSError + else: + self.cmp = bz2.BZ2Compressor() + + elif comptype == "xz": + try: + import lzma + except ImportError: + raise CompressionError("lzma module is not available") + if mode == "r": + self.dbuf = b"" + self.cmp = lzma.LZMADecompressor() + self.exception = lzma.LZMAError + else: + self.cmp = lzma.LZMACompressor() + + elif comptype != "tar": + raise CompressionError("unknown compression type %r" % comptype) + + 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(" 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 + + self.closed = True + try: + 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": + self.fileobj.write(struct.pack("= 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 = b"".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) + t = [self.dbuf] + while c < size: + buf = self.__read(self.bufsize) + if not buf: + break + try: + buf = self.cmp.decompress(buf) + except self.exception: + raise ReadError("invalid compressed data") + t.append(buf) + c += len(buf) + t = b"".join(t) + self.dbuf = t[size:] + return t[:size] + + def __read(self, size): + """Return size bytes from stream. If internal buffer is empty, + read another block from the stream. + """ + c = len(self.buf) + t = [self.buf] + while c < size: + buf = self.fileobj.read(self.bufsize) + if not buf: + break + t.append(buf) + c += len(buf) + t = b"".join(t) + self.buf = t[size:] + return t[:size] +# 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"\x1f\x8b\x08"): + return "gz" + elif self.buf[0:3] == b"BZh" and self.buf[4:10] == b"1AY&SY": + return "bz2" + elif self.buf.startswith((b"\x5d\x00\x00\x80", b"\xfd7zXZ")): + return "xz" + else: + return "tar" + + def close(self): + self.fileobj.close() +# class StreamProxy + +#------------------------ +# 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 + self.name = getattr(fileobj, "name", None) + self.closed = False + + 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 flush(self): + pass + + def readable(self): + return True + + def writable(self): + return False + + def seekable(self): + return self.fileobj.seekable() + + def tell(self): + """Return the current file position. + """ + return self.position + + def seek(self, position, whence=io.SEEK_SET): + """Seek to a position in the file. + """ + if whence == io.SEEK_SET: + self.position = min(max(position, 0), self.size) + elif whence == io.SEEK_CUR: + if position < 0: + self.position = max(self.position + position, 0) + else: + self.position = min(self.position + position, self.size) + elif whence == io.SEEK_END: + self.position = max(min(self.size + position, self.size), 0) + else: + raise ValueError("Invalid argument") + return self.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)) + b = self.fileobj.read(length) + if len(b) != length: + raise ReadError("unexpected end of data") + buf += b + else: + buf += NUL * length + size -= length + self.position += length + return buf + + def readinto(self, b): + buf = self.read(len(b)) + b[:len(buf)] = buf + return len(buf) + + def close(self): + self.closed = True +#class _FileInFile + +class ExFileObject(io.BufferedReader): + + def __init__(self, tarfile, tarinfo): + fileobj = _FileInFile(tarfile.fileobj, tarinfo.offset_data, + tarinfo.size, tarinfo.sparse) + super().__init__(fileobj) +#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". + @property + def path(self): + return self.name + + @path.setter + def path(self, name): + self.name = name + + @property + def linkpath(self): + return self.linkname + + @linkpath.setter + def linkpath(self, linkname): + self.linkname = linkname + + 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"].encode(encoding, errors)) > LENGTH_LINK: + raise ValueError("linkname is too long") + + if len(info["name"].encode(encoding, errors)) > LENGTH_NAME: + info["prefix"], info["name"] = self._posix_split_name(info["name"], encoding, errors) + + 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"].encode(encoding, errors)) > LENGTH_LINK: + buf += self._create_gnu_long_header(info["linkname"], GNUTYPE_LONGLINK, encoding, errors) + + if len(info["name"].encode(encoding, errors)) > 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, "utf-8") + + def _posix_split_name(self, name, encoding, errors): + """Split a name longer than 100 chars into a prefix + and a name part. + """ + components = name.split("/") + for i in range(1, len(components)): + prefix = "/".join(components[:i]) + name = "/".join(components[i:]) + if len(prefix.encode(encoding, errors)) <= LENGTH_PREFIX and \ + len(name.encode(encoding, errors)) <= LENGTH_NAME: + break + else: + 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] + bytes("%06o\0" % chksum, "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("utf-8", "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("utf-8") + 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("utf-8") + + 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 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("utf-8") + + # 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 = "utf-8" + + # 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 "utf-8" 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, "utf-8", "utf-8", + 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, "utf-8", "utf-8", + 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 file-object for extractfile(). + + 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, copybufsize=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. + """ + modes = {"r": "rb", "a": "r+b", "w": "wb", "x": "xb"} + if mode not in modes: + raise ValueError("mode must be 'r', 'a', 'w' or 'x'") + self.mode = mode + self._mode = modes[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") and + isinstance(fileobj.name, (str, bytes))): + 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.copybufsize = copybufsize + 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 ("a", "w", "x"): + 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 + 'r:xz' open for reading with lzma 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 + 'w:xz' open for writing with lzma compression + + 'x' or 'x:' create a tarfile exclusively without compression, raise + an exception if the file is already created + 'x:gz' create a gzip compressed tarfile, raise an exception + if the file is already created + 'x:bz2' create a bzip2 compressed tarfile, raise an exception + if the file is already created + 'x:xz' create an lzma compressed tarfile, raise an exception + if the file is already created + + '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 + 'r|xz' open an lzma 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 + 'w|xz' open an lzma 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. + def not_compressed(comptype): + return cls.OPEN_METH[comptype] == 'taropen' + for comptype in sorted(cls.OPEN_METH, key=not_compressed): + 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): + 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 ("r", "w"): + 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 ("a", "w", "x"): + 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 mode not in ("r", "a", "w", "x"): + raise ValueError("mode must be 'r', 'a', 'w' or 'x'") + 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 mode not in ("r", "w", "x"): + raise ValueError("mode must be 'r', 'w' or 'x'") + + try: + import gzip + gzip.GzipFile + except (ImportError, AttributeError): + raise CompressionError("gzip module is not available") + + try: + fileobj = gzip.GzipFile(name, mode + "b", compresslevel, fileobj) + except OSError: + if fileobj is not None and mode == 'r': + raise ReadError("not a gzip file") + raise + + try: + t = cls.taropen(name, mode, fileobj, **kwargs) + except OSError: + fileobj.close() + if mode == 'r': + raise ReadError("not a gzip file") + raise + except: + fileobj.close() + raise + t._extfileobj = False + 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 mode not in ("r", "w", "x"): + raise ValueError("mode must be 'r', 'w' or 'x'") + + try: + import bz2 + except ImportError: + raise CompressionError("bz2 module is not available") + + fileobj = bz2.BZ2File(fileobj or name, mode, + compresslevel=compresslevel) + + try: + t = cls.taropen(name, mode, fileobj, **kwargs) + except (OSError, EOFError): + fileobj.close() + if mode == 'r': + raise ReadError("not a bzip2 file") + raise + except: + fileobj.close() + raise + t._extfileobj = False + return t + + @classmethod + def xzopen(cls, name, mode="r", fileobj=None, preset=None, **kwargs): + """Open lzma compressed tar archive name for reading or writing. + Appending is not allowed. + """ + if mode not in ("r", "w", "x"): + raise ValueError("mode must be 'r', 'w' or 'x'") + + try: + import lzma + except ImportError: + raise CompressionError("lzma module is not available") + + fileobj = lzma.LZMAFile(fileobj or name, mode, preset=preset) + + try: + t = cls.taropen(name, mode, fileobj, **kwargs) + except (lzma.LZMAError, EOFError): + fileobj.close() + if mode == 'r': + raise ReadError("not an lzma file") + raise + except: + fileobj.close() + raise + 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 + "xz": "xzopen" # lzma 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 + + self.closed = True + try: + if self.mode in ("a", "w", "x"): + 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)) + finally: + if not self._extfileobj: + self.fileobj.close() + + 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 from the result of os.stat or equivalent + on an existing file. The file is either named by `name', or + specified as a file object `fileobj' with a file descriptor. If + given, `arcname' specifies an alternative name for the file in the + archive, otherwise, the name is taken from the 'name' attribute of + 'fileobj', or the 'name' argument. The name should be a text + string. + """ + self._check("awx") + + # 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 # Not needed + + # 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, *, members=None): + """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. `members' is optional and must be a subset of the + list returned by getmembers(). + """ + self._check() + + if members is None: + members = self + for tarinfo in members: + if verbose: + _safe_print(stat.filemode(tarinfo.mode)) + _safe_print("%s/%s" % (tarinfo.uname or tarinfo.uid, + tarinfo.gname or tarinfo.gid)) + if tarinfo.ischr() or tarinfo.isblk(): + _safe_print("%10s" % + ("%d,%d" % (tarinfo.devmajor, tarinfo.devminor))) + else: + _safe_print("%10d" % tarinfo.size) + _safe_print("%d-%02d-%02d %02d:%02d:%02d" \ + % time.localtime(tarinfo.mtime)[:6]) + + _safe_print(tarinfo.name + ("/" if tarinfo.isdir() else "")) + + if verbose: + if tarinfo.issym(): + _safe_print("-> " + tarinfo.linkname) + if tarinfo.islnk(): + _safe_print("link to " + tarinfo.linkname) + print() + + def add(self, name, arcname=None, recursive=True, *, 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. `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("awx") + + if arcname is None: + arcname = name + + # 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(): + with bltn_open(name, "rb") as f: + self.addfile(tarinfo, f) + + elif tarinfo.isdir(): + self.addfile(tarinfo) + if recursive: + for f in sorted(os.listdir(name)): + self.add(os.path.join(name, f), os.path.join(arcname, f), + recursive, filter=filter) + + else: + self.addfile(tarinfo) + + def addfile(self, tarinfo, fileobj=None): + """Add the TarInfo object `tarinfo' to the archive. If `fileobj' is + given, it should be a binary file, and tarinfo.size bytes are read + from it and added to the archive. You can create TarInfo objects + directly, or by using gettarinfo(). + """ + self._check("awx") + + tarinfo = copy.copy(tarinfo) + + buf = tarinfo.tobuf(self.format, self.encoding, self.errors) + self.fileobj.write(buf) + self.offset += len(buf) + bufsize=self.copybufsize + # If there's data to follow, append it. + if fileobj is not None: + copyfileobj(fileobj, self.fileobj, tarinfo.size, bufsize=bufsize) + 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, *, numeric_owner=False): + """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(). If `numeric_owner` is True, only + the numbers for user/group names are used and not the names. + """ + 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(), + numeric_owner=numeric_owner) + + # 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, numeric_owner=numeric_owner) + 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, *, numeric_owner=False): + """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. If `numeric_owner` + is True, only the numbers for user/group names are used and not + the names. + """ + 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, + numeric_owner=numeric_owner) + except OSError 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 or a + link, an io.BufferedReader object is returned. Otherwise, None is + returned. + """ + self._check("r") + + if isinstance(member, str): + tarinfo = self.getmember(member) + else: + tarinfo = member + + if tarinfo.isreg() or tarinfo.type not in SUPPORTED_TYPES: + # Members with unknown types are treated as regular files. + 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, + numeric_owner=False): + """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, numeric_owner) + 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 FileExistsError: + pass + + def makefile(self, tarinfo, targetpath): + """Make a file called targetpath. + """ + source = self.fileobj + source.seek(tarinfo.offset_data) + bufsize = self.copybufsize + with bltn_open(targetpath, "wb") as target: + if tarinfo.sparse is not None: + for offset, size in tarinfo.sparse: + target.seek(offset) + copyfileobj(source, target, size, ReadError, bufsize) + target.seek(tarinfo.size) + target.truncate() + else: + copyfileobj(source, target, tarinfo.size, ReadError, bufsize) + + 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: + 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, numeric_owner): + """Set owner of targetpath according to tarinfo. If numeric_owner + is True, use .gid/.uid instead of .gname/.uname. If numeric_owner + is False, fall back to .gid/.uid when the search based on name + fails. + """ + if hasattr(os, "geteuid") and os.geteuid() == 0: + # We have to be root to do so. + g = tarinfo.gid + u = tarinfo.uid + if not numeric_owner: + try: + if grp: + g = grp.getgrnam(tarinfo.gname)[2] + except KeyError: + pass + try: + if pwd: + u = pwd.getpwnam(tarinfo.uname)[2] + except KeyError: + pass + try: + if tarinfo.issym() and hasattr(os, "lchown"): + os.lchown(targetpath, u, g) + else: + os.chown(targetpath, u, g) + except OSError: + 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 OSError: + 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 OSError: + 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 + + # Advance the file pointer. + if self.offset != self.fileobj.tell(): + self.fileobj.seek(self.offset - 1) + if not self.fileobj.read(1): + raise ReadError("unexpected end of data") + + # Read the next block. + 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 OSError("%s is closed" % self.__class__.__name__) + if mode is not None and self.mode not in mode: + raise OSError("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 = "/".join(filter(None, (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: + yield from self.members + return + + # Yield items using TarFile's next() method. + # When all members have been read, set TarFile as _loaded. + index = 0 + # Fix for SF #1100429: Under rare circumstances it can + # happen that getmembers() is called during iteration, + # which will have already exhausted the next() method. + if self.firstmember is not None: + tarinfo = self.next() + index += 1 + yield tarinfo + + while True: + if index < len(self.members): + tarinfo = self.members[index] + elif not self._loaded: + tarinfo = self.next() + if not tarinfo: + self._loaded = True + return + else: + return + index += 1 + yield tarinfo + + 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 + +#-------------------- +# 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 + +open = TarFile.open + + +def main(): + import argparse + + description = 'A simple command-line interface for tarfile module.' + parser = argparse.ArgumentParser(description=description) + parser.add_argument('-v', '--verbose', action='store_true', default=False, + help='Verbose output') + group = parser.add_mutually_exclusive_group(required=True) + group.add_argument('-l', '--list', metavar='', + help='Show listing of a tarfile') + group.add_argument('-e', '--extract', nargs='+', + metavar=('', ''), + help='Extract tarfile into target dir') + group.add_argument('-c', '--create', nargs='+', + metavar=('', ''), + help='Create tarfile from sources') + group.add_argument('-t', '--test', metavar='', + help='Test if a tarfile is valid') + args = parser.parse_args() + + if args.test is not None: + src = args.test + if is_tarfile(src): + with open(src, 'r') as tar: + tar.getmembers() + print(tar.getmembers(), file=sys.stderr) + if args.verbose: + print('{!r} is a tar archive.'.format(src)) + else: + parser.exit(1, '{!r} is not a tar archive.\n'.format(src)) + + elif args.list is not None: + src = args.list + if is_tarfile(src): + with TarFile.open(src, 'r:*') as tf: + tf.list(verbose=args.verbose) + else: + parser.exit(1, '{!r} is not a tar archive.\n'.format(src)) + + elif args.extract is not None: + if len(args.extract) == 1: + src = args.extract[0] + curdir = os.curdir + elif len(args.extract) == 2: + src, curdir = args.extract + else: + parser.exit(1, parser.format_help()) + + if is_tarfile(src): + with TarFile.open(src, 'r:*') as tf: + tf.extractall(path=curdir) + if args.verbose: + if curdir == '.': + msg = '{!r} file is extracted.'.format(src) + else: + msg = ('{!r} file is extracted ' + 'into {!r} directory.').format(src, curdir) + print(msg) + else: + parser.exit(1, '{!r} is not a tar archive.\n'.format(src)) + + elif args.create is not None: + tar_name = args.create.pop(0) + _, ext = os.path.splitext(tar_name) + compressions = { + # gz + '.gz': 'gz', + '.tgz': 'gz', + # xz + '.xz': 'xz', + '.txz': 'xz', + # bz2 + '.bz2': 'bz2', + '.tbz': 'bz2', + '.tbz2': 'bz2', + '.tb2': 'bz2', + } + tar_mode = 'w:' + compressions[ext] if ext in compressions else 'w' + tar_files = args.create + + with TarFile.open(tar_name, tar_mode) as tf: + for file_name in tar_files: + tf.add(file_name) + + if args.verbose: + print('{!r} file created.'.format(tar_name)) + +if __name__ == '__main__': + main() diff --git a/env/Lib/tempfile.py b/env/Lib/tempfile.py new file mode 100644 index 0000000..2143224 --- /dev/null +++ b/env/Lib/tempfile.py @@ -0,0 +1,809 @@ +"""Temporary files. + +This module provides generic, low- and high-level interfaces for +creating temporary files and directories. All of the interfaces +provided by this module can be used without fear of race conditions +except for 'mktemp'. 'mktemp' is subject to race conditions and +should not be used; it is provided for backward compatibility only. + +The default path names are returned as str. If you supply bytes as +input, all return values will be in bytes. Ex: + + >>> tempfile.mkstemp() + (4, '/tmp/tmptpu9nin8') + >>> tempfile.mkdtemp(suffix=b'') + b'/tmp/tmppbi8f0hy' + +This module also provides some data items to the user: + + TMP_MAX - maximum number of names that will be tried before + giving up. + tempdir - If this is set to a string before the first use of + any routine from this module, it will be considered as + another candidate location to store temporary files. +""" + +__all__ = [ + "NamedTemporaryFile", "TemporaryFile", # high level safe interfaces + "SpooledTemporaryFile", "TemporaryDirectory", + "mkstemp", "mkdtemp", # low level safe interfaces + "mktemp", # deprecated unsafe interface + "TMP_MAX", "gettempprefix", # constants + "tempdir", "gettempdir", + "gettempprefixb", "gettempdirb", + ] + + +# Imports. + +import functools as _functools +import warnings as _warnings +import io as _io +import os as _os +import shutil as _shutil +import errno as _errno +from random import Random as _Random +import weakref as _weakref +import _thread +_allocate_lock = _thread.allocate_lock + +_text_openflags = _os.O_RDWR | _os.O_CREAT | _os.O_EXCL +if hasattr(_os, 'O_NOFOLLOW'): + _text_openflags |= _os.O_NOFOLLOW + +_bin_openflags = _text_openflags +if hasattr(_os, 'O_BINARY'): + _bin_openflags |= _os.O_BINARY + +if hasattr(_os, 'TMP_MAX'): + TMP_MAX = _os.TMP_MAX +else: + TMP_MAX = 10000 + +# This variable _was_ unused for legacy reasons, see issue 10354. +# But as of 3.5 we actually use it at runtime so changing it would +# have a possibly desirable side effect... But we do not want to support +# that as an API. It is undocumented on purpose. Do not depend on this. +template = "tmp" + +# Internal routines. + +_once_lock = _allocate_lock() + +if hasattr(_os, "lstat"): + _stat = _os.lstat +elif hasattr(_os, "stat"): + _stat = _os.stat +else: + # Fallback. All we need is something that raises OSError if the + # file doesn't exist. + def _stat(fn): + fd = _os.open(fn, _os.O_RDONLY) + _os.close(fd) + +def _exists(fn): + try: + _stat(fn) + except OSError: + return False + else: + return True + + +def _infer_return_type(*args): + """Look at the type of all args and divine their implied return type.""" + return_type = None + for arg in args: + if arg is None: + continue + if isinstance(arg, bytes): + if return_type is str: + raise TypeError("Can't mix bytes and non-bytes in " + "path components.") + return_type = bytes + else: + if return_type is bytes: + raise TypeError("Can't mix bytes and non-bytes in " + "path components.") + return_type = str + if return_type is None: + return str # tempfile APIs return a str by default. + return return_type + + +def _sanitize_params(prefix, suffix, dir): + """Common parameter processing for most APIs in this module.""" + output_type = _infer_return_type(prefix, suffix, dir) + if suffix is None: + suffix = output_type() + if prefix is None: + if output_type is str: + prefix = template + else: + prefix = _os.fsencode(template) + if dir is None: + if output_type is str: + dir = gettempdir() + else: + dir = gettempdirb() + return prefix, suffix, dir, output_type + + +class _RandomNameSequence: + """An instance of _RandomNameSequence generates an endless + sequence of unpredictable strings which can safely be incorporated + into file names. Each string is eight characters long. Multiple + threads can safely use the same instance at the same time. + + _RandomNameSequence is an iterator.""" + + characters = "abcdefghijklmnopqrstuvwxyz0123456789_" + + @property + def rng(self): + cur_pid = _os.getpid() + if cur_pid != getattr(self, '_rng_pid', None): + self._rng = _Random() + self._rng_pid = cur_pid + return self._rng + + def __iter__(self): + return self + + def __next__(self): + c = self.characters + choose = self.rng.choice + letters = [choose(c) for dummy in range(8)] + return ''.join(letters) + +def _candidate_tempdir_list(): + """Generate a list of candidate temporary directories which + _get_default_tempdir will try.""" + + dirlist = [] + + # First, try the environment. + for envname in 'TMPDIR', 'TEMP', 'TMP': + dirname = _os.getenv(envname) + if dirname: dirlist.append(dirname) + + # Failing that, try OS-specific locations. + if _os.name == 'nt': + dirlist.extend([ _os.path.expanduser(r'~\AppData\Local\Temp'), + _os.path.expandvars(r'%SYSTEMROOT%\Temp'), + r'c:\temp', r'c:\tmp', r'\temp', r'\tmp' ]) + else: + dirlist.extend([ '/tmp', '/var/tmp', '/usr/tmp' ]) + + # As a last resort, the current directory. + try: + dirlist.append(_os.getcwd()) + except (AttributeError, OSError): + dirlist.append(_os.curdir) + + return dirlist + +def _get_default_tempdir(): + """Calculate the default directory to use for temporary files. + This routine should be called exactly once. + + We determine whether or not a candidate temp dir is usable by + trying to create and write to a file in that directory. If this + is successful, the test file is deleted. To prevent denial of + service, the name of the test file must be randomized.""" + + namer = _RandomNameSequence() + dirlist = _candidate_tempdir_list() + + for dir in dirlist: + if dir != _os.curdir: + dir = _os.path.abspath(dir) + # Try only a few names per directory. + for seq in range(100): + name = next(namer) + filename = _os.path.join(dir, name) + try: + fd = _os.open(filename, _bin_openflags, 0o600) + try: + try: + with _io.open(fd, 'wb', closefd=False) as fp: + fp.write(b'blat') + finally: + _os.close(fd) + finally: + _os.unlink(filename) + return dir + except FileExistsError: + pass + except PermissionError: + # This exception is thrown when a directory with the chosen name + # already exists on windows. + if (_os.name == 'nt' and _os.path.isdir(dir) and + _os.access(dir, _os.W_OK)): + continue + break # no point trying more names in this directory + except OSError: + break # no point trying more names in this directory + raise FileNotFoundError(_errno.ENOENT, + "No usable temporary directory found in %s" % + dirlist) + +_name_sequence = None + +def _get_candidate_names(): + """Common setup sequence for all user-callable interfaces.""" + + global _name_sequence + if _name_sequence is None: + _once_lock.acquire() + try: + if _name_sequence is None: + _name_sequence = _RandomNameSequence() + finally: + _once_lock.release() + return _name_sequence + + +def _mkstemp_inner(dir, pre, suf, flags, output_type): + """Code common to mkstemp, TemporaryFile, and NamedTemporaryFile.""" + + names = _get_candidate_names() + if output_type is bytes: + names = map(_os.fsencode, names) + + for seq in range(TMP_MAX): + name = next(names) + file = _os.path.join(dir, pre + name + suf) + try: + fd = _os.open(file, flags, 0o600) + except FileExistsError: + continue # try again + except PermissionError: + # This exception is thrown when a directory with the chosen name + # already exists on windows. + if (_os.name == 'nt' and _os.path.isdir(dir) and + _os.access(dir, _os.W_OK)): + continue + else: + raise + return (fd, _os.path.abspath(file)) + + raise FileExistsError(_errno.EEXIST, + "No usable temporary file name found") + + +# User visible interfaces. + +def gettempprefix(): + """The default prefix for temporary directories.""" + return template + +def gettempprefixb(): + """The default prefix for temporary directories as bytes.""" + return _os.fsencode(gettempprefix()) + +tempdir = None + +def gettempdir(): + """Accessor for tempfile.tempdir.""" + global tempdir + if tempdir is None: + _once_lock.acquire() + try: + if tempdir is None: + tempdir = _get_default_tempdir() + finally: + _once_lock.release() + return tempdir + +def gettempdirb(): + """A bytes version of tempfile.gettempdir().""" + return _os.fsencode(gettempdir()) + +def mkstemp(suffix=None, prefix=None, dir=None, text=False): + """User-callable function to create and return a unique temporary + file. The return value is a pair (fd, name) where fd is the + file descriptor returned by os.open, and name is the filename. + + If 'suffix' is not None, the file name will end with that suffix, + otherwise there will be no suffix. + + If 'prefix' is not None, the file name will begin with that prefix, + otherwise a default prefix is used. + + If 'dir' is not None, the file will be created in that directory, + otherwise a default directory is used. + + If 'text' is specified and true, the file is opened in text + mode. Else (the default) the file is opened in binary mode. On + some operating systems, this makes no difference. + + If any of 'suffix', 'prefix' and 'dir' are not None, they must be the + same type. If they are bytes, the returned name will be bytes; str + otherwise. + + The file is readable and writable only by the creating user ID. + If the operating system uses permission bits to indicate whether a + file is executable, the file is executable by no one. The file + descriptor is not inherited by children of this process. + + Caller is responsible for deleting the file when done with it. + """ + + prefix, suffix, dir, output_type = _sanitize_params(prefix, suffix, dir) + + if text: + flags = _text_openflags + else: + flags = _bin_openflags + + return _mkstemp_inner(dir, prefix, suffix, flags, output_type) + + +def mkdtemp(suffix=None, prefix=None, dir=None): + """User-callable function to create and return a unique temporary + directory. The return value is the pathname of the directory. + + Arguments are as for mkstemp, except that the 'text' argument is + not accepted. + + The directory is readable, writable, and searchable only by the + creating user. + + Caller is responsible for deleting the directory when done with it. + """ + + prefix, suffix, dir, output_type = _sanitize_params(prefix, suffix, dir) + + names = _get_candidate_names() + if output_type is bytes: + names = map(_os.fsencode, names) + + for seq in range(TMP_MAX): + name = next(names) + file = _os.path.join(dir, prefix + name + suffix) + try: + _os.mkdir(file, 0o700) + except FileExistsError: + continue # try again + except PermissionError: + # This exception is thrown when a directory with the chosen name + # already exists on windows. + if (_os.name == 'nt' and _os.path.isdir(dir) and + _os.access(dir, _os.W_OK)): + continue + else: + raise + return file + + raise FileExistsError(_errno.EEXIST, + "No usable temporary directory name found") + +def mktemp(suffix="", prefix=template, dir=None): + """User-callable function to return a unique temporary file name. The + file is not created. + + Arguments are similar to mkstemp, except that the 'text' argument is + not accepted, and suffix=None, prefix=None and bytes file names are not + supported. + + THIS FUNCTION IS UNSAFE AND SHOULD NOT BE USED. The file name may + refer to a file that did not exist at some point, but by the time + you get around to creating it, someone else may have beaten you to + the punch. + """ + +## from warnings import warn as _warn +## _warn("mktemp is a potential security risk to your program", +## RuntimeWarning, stacklevel=2) + + if dir is None: + dir = gettempdir() + + names = _get_candidate_names() + for seq in range(TMP_MAX): + name = next(names) + file = _os.path.join(dir, prefix + name + suffix) + if not _exists(file): + return file + + raise FileExistsError(_errno.EEXIST, + "No usable temporary filename found") + + +class _TemporaryFileCloser: + """A separate object allowing proper closing of a temporary file's + underlying file object, without adding a __del__ method to the + temporary file.""" + + file = None # Set here since __del__ checks it + close_called = False + + def __init__(self, file, name, delete=True): + self.file = file + self.name = name + self.delete = delete + + # NT provides delete-on-close as a primitive, so we don't need + # the wrapper to do anything special. We still use it so that + # file.name is useful (i.e. not "(fdopen)") with NamedTemporaryFile. + if _os.name != 'nt': + # Cache the unlinker so we don't get spurious errors at + # shutdown when the module-level "os" is None'd out. Note + # that this must be referenced as self.unlink, because the + # name TemporaryFileWrapper may also get None'd out before + # __del__ is called. + + def close(self, unlink=_os.unlink): + if not self.close_called and self.file is not None: + self.close_called = True + try: + self.file.close() + finally: + if self.delete: + unlink(self.name) + + # Need to ensure the file is deleted on __del__ + def __del__(self): + self.close() + + else: + def close(self): + if not self.close_called: + self.close_called = True + self.file.close() + + +class _TemporaryFileWrapper: + """Temporary file wrapper + + This class provides a wrapper around files opened for + temporary use. In particular, it seeks to automatically + remove the file when it is no longer needed. + """ + + def __init__(self, file, name, delete=True): + self.file = file + self.name = name + self.delete = delete + self._closer = _TemporaryFileCloser(file, name, delete) + + def __getattr__(self, name): + # Attribute lookups are delegated to the underlying file + # and cached for non-numeric results + # (i.e. methods are cached, closed and friends are not) + file = self.__dict__['file'] + a = getattr(file, name) + if hasattr(a, '__call__'): + func = a + @_functools.wraps(func) + def func_wrapper(*args, **kwargs): + return func(*args, **kwargs) + # Avoid closing the file as long as the wrapper is alive, + # see issue #18879. + func_wrapper._closer = self._closer + a = func_wrapper + if not isinstance(a, int): + setattr(self, name, a) + return a + + # The underlying __enter__ method returns the wrong object + # (self.file) so override it to return the wrapper + def __enter__(self): + self.file.__enter__() + return self + + # Need to trap __exit__ as well to ensure the file gets + # deleted when used in a with statement + def __exit__(self, exc, value, tb): + result = self.file.__exit__(exc, value, tb) + self.close() + return result + + def close(self): + """ + Close the temporary file, possibly deleting it. + """ + self._closer.close() + + # iter() doesn't use __getattr__ to find the __iter__ method + def __iter__(self): + # Don't return iter(self.file), but yield from it to avoid closing + # file as long as it's being used as iterator (see issue #23700). We + # can't use 'yield from' here because iter(file) returns the file + # object itself, which has a close method, and thus the file would get + # closed when the generator is finalized, due to PEP380 semantics. + for line in self.file: + yield line + + +def NamedTemporaryFile(mode='w+b', buffering=-1, encoding=None, + newline=None, suffix=None, prefix=None, + dir=None, delete=True): + """Create and return a temporary file. + Arguments: + 'prefix', 'suffix', 'dir' -- as for mkstemp. + 'mode' -- the mode argument to io.open (default "w+b"). + 'buffering' -- the buffer size argument to io.open (default -1). + 'encoding' -- the encoding argument to io.open (default None) + 'newline' -- the newline argument to io.open (default None) + 'delete' -- whether the file is deleted on close (default True). + The file is created as mkstemp() would do it. + + Returns an object with a file-like interface; the name of the file + is accessible as its 'name' attribute. The file will be automatically + deleted when it is closed unless the 'delete' argument is set to False. + """ + + prefix, suffix, dir, output_type = _sanitize_params(prefix, suffix, dir) + + flags = _bin_openflags + + # Setting O_TEMPORARY in the flags causes the OS to delete + # the file when it is closed. This is only supported by Windows. + if _os.name == 'nt' and delete: + flags |= _os.O_TEMPORARY + + (fd, name) = _mkstemp_inner(dir, prefix, suffix, flags, output_type) + try: + file = _io.open(fd, mode, buffering=buffering, + newline=newline, encoding=encoding) + + return _TemporaryFileWrapper(file, name, delete) + except BaseException: + _os.unlink(name) + _os.close(fd) + raise + +if _os.name != 'posix' or _os.sys.platform == 'cygwin': + # On non-POSIX and Cygwin systems, assume that we cannot unlink a file + # while it is open. + TemporaryFile = NamedTemporaryFile + +else: + # Is the O_TMPFILE flag available and does it work? + # The flag is set to False if os.open(dir, os.O_TMPFILE) raises an + # IsADirectoryError exception + _O_TMPFILE_WORKS = hasattr(_os, 'O_TMPFILE') + + def TemporaryFile(mode='w+b', buffering=-1, encoding=None, + newline=None, suffix=None, prefix=None, + dir=None): + """Create and return a temporary file. + Arguments: + 'prefix', 'suffix', 'dir' -- as for mkstemp. + 'mode' -- the mode argument to io.open (default "w+b"). + 'buffering' -- the buffer size argument to io.open (default -1). + 'encoding' -- the encoding argument to io.open (default None) + 'newline' -- the newline argument to io.open (default None) + The file is created as mkstemp() would do it. + + Returns an object with a file-like interface. The file has no + name, and will cease to exist when it is closed. + """ + global _O_TMPFILE_WORKS + + prefix, suffix, dir, output_type = _sanitize_params(prefix, suffix, dir) + + flags = _bin_openflags + if _O_TMPFILE_WORKS: + try: + flags2 = (flags | _os.O_TMPFILE) & ~_os.O_CREAT + fd = _os.open(dir, flags2, 0o600) + except IsADirectoryError: + # Linux kernel older than 3.11 ignores the O_TMPFILE flag: + # O_TMPFILE is read as O_DIRECTORY. Trying to open a directory + # with O_RDWR|O_DIRECTORY fails with IsADirectoryError, a + # directory cannot be open to write. Set flag to False to not + # try again. + _O_TMPFILE_WORKS = False + except OSError: + # The filesystem of the directory does not support O_TMPFILE. + # For example, OSError(95, 'Operation not supported'). + # + # On Linux kernel older than 3.11, trying to open a regular + # file (or a symbolic link to a regular file) with O_TMPFILE + # fails with NotADirectoryError, because O_TMPFILE is read as + # O_DIRECTORY. + pass + else: + try: + return _io.open(fd, mode, buffering=buffering, + newline=newline, encoding=encoding) + except: + _os.close(fd) + raise + # Fallback to _mkstemp_inner(). + + (fd, name) = _mkstemp_inner(dir, prefix, suffix, flags, output_type) + try: + _os.unlink(name) + return _io.open(fd, mode, buffering=buffering, + newline=newline, encoding=encoding) + except: + _os.close(fd) + raise + +class SpooledTemporaryFile: + """Temporary file wrapper, specialized to switch from BytesIO + or StringIO to a real file when it exceeds a certain size or + when a fileno is needed. + """ + _rolled = False + + def __init__(self, max_size=0, mode='w+b', buffering=-1, + encoding=None, newline=None, + suffix=None, prefix=None, dir=None): + if 'b' in mode: + self._file = _io.BytesIO() + else: + # Setting newline="\n" avoids newline translation; + # this is important because otherwise on Windows we'd + # get double newline translation upon rollover(). + self._file = _io.StringIO(newline="\n") + self._max_size = max_size + self._rolled = False + self._TemporaryFileArgs = {'mode': mode, 'buffering': buffering, + 'suffix': suffix, 'prefix': prefix, + 'encoding': encoding, 'newline': newline, + 'dir': dir} + + def _check(self, file): + if self._rolled: return + max_size = self._max_size + if max_size and file.tell() > max_size: + self.rollover() + + def rollover(self): + if self._rolled: return + file = self._file + newfile = self._file = TemporaryFile(**self._TemporaryFileArgs) + del self._TemporaryFileArgs + + newfile.write(file.getvalue()) + newfile.seek(file.tell(), 0) + + self._rolled = True + + # The method caching trick from NamedTemporaryFile + # won't work here, because _file may change from a + # BytesIO/StringIO instance to a real file. So we list + # all the methods directly. + + # Context management protocol + def __enter__(self): + if self._file.closed: + raise ValueError("Cannot enter context with closed file") + return self + + def __exit__(self, exc, value, tb): + self._file.close() + + # file protocol + def __iter__(self): + return self._file.__iter__() + + def close(self): + self._file.close() + + @property + def closed(self): + return self._file.closed + + @property + def encoding(self): + try: + return self._file.encoding + except AttributeError: + if 'b' in self._TemporaryFileArgs['mode']: + raise + return self._TemporaryFileArgs['encoding'] + + def fileno(self): + self.rollover() + return self._file.fileno() + + def flush(self): + self._file.flush() + + def isatty(self): + return self._file.isatty() + + @property + def mode(self): + try: + return self._file.mode + except AttributeError: + return self._TemporaryFileArgs['mode'] + + @property + def name(self): + try: + return self._file.name + except AttributeError: + return None + + @property + def newlines(self): + try: + return self._file.newlines + except AttributeError: + if 'b' in self._TemporaryFileArgs['mode']: + raise + return self._TemporaryFileArgs['newline'] + + def read(self, *args): + return self._file.read(*args) + + def readline(self, *args): + return self._file.readline(*args) + + def readlines(self, *args): + return self._file.readlines(*args) + + def seek(self, *args): + self._file.seek(*args) + + @property + def softspace(self): + return self._file.softspace + + def tell(self): + return self._file.tell() + + def truncate(self, size=None): + if size is None: + self._file.truncate() + else: + if size > self._max_size: + self.rollover() + self._file.truncate(size) + + def write(self, s): + file = self._file + rv = file.write(s) + self._check(file) + return rv + + def writelines(self, iterable): + file = self._file + rv = file.writelines(iterable) + self._check(file) + return rv + + +class TemporaryDirectory(object): + """Create and return a temporary directory. This has the same + behavior as mkdtemp but can be used as a context manager. For + example: + + with TemporaryDirectory() as tmpdir: + ... + + Upon exiting the context, the directory and everything contained + in it are removed. + """ + + def __init__(self, suffix=None, prefix=None, dir=None): + self.name = mkdtemp(suffix, prefix, dir) + self._finalizer = _weakref.finalize( + self, self._cleanup, self.name, + warn_message="Implicitly cleaning up {!r}".format(self)) + + @classmethod + def _cleanup(cls, name, warn_message): + _shutil.rmtree(name) + _warnings.warn(warn_message, ResourceWarning) + + def __repr__(self): + return "<{} {!r}>".format(self.__class__.__name__, self.name) + + def __enter__(self): + return self.name + + def __exit__(self, exc, value, tb): + self.cleanup() + + def cleanup(self): + if self._finalizer.detach(): + _shutil.rmtree(self.name) diff --git a/env/Lib/token.py b/env/Lib/token.py new file mode 100644 index 0000000..ba13205 --- /dev/null +++ b/env/Lib/token.py @@ -0,0 +1,160 @@ +"""Token constants (from "token.h").""" + +__all__ = ['tok_name', 'ISTERMINAL', 'ISNONTERMINAL', 'ISEOF'] + +# This file is automatically generated; please don't muck it up! +# +# To update the symbols in this file, 'cd' to the top directory of +# the python source tree after building the interpreter and run: +# +# ./python Lib/token.py + +#--start constants-- +ENDMARKER = 0 +NAME = 1 +NUMBER = 2 +STRING = 3 +NEWLINE = 4 +INDENT = 5 +DEDENT = 6 +LPAR = 7 +RPAR = 8 +LSQB = 9 +RSQB = 10 +COLON = 11 +COMMA = 12 +SEMI = 13 +PLUS = 14 +MINUS = 15 +STAR = 16 +SLASH = 17 +VBAR = 18 +AMPER = 19 +LESS = 20 +GREATER = 21 +EQUAL = 22 +DOT = 23 +PERCENT = 24 +LBRACE = 25 +RBRACE = 26 +EQEQUAL = 27 +NOTEQUAL = 28 +LESSEQUAL = 29 +GREATEREQUAL = 30 +TILDE = 31 +CIRCUMFLEX = 32 +LEFTSHIFT = 33 +RIGHTSHIFT = 34 +DOUBLESTAR = 35 +PLUSEQUAL = 36 +MINEQUAL = 37 +STAREQUAL = 38 +SLASHEQUAL = 39 +PERCENTEQUAL = 40 +AMPEREQUAL = 41 +VBAREQUAL = 42 +CIRCUMFLEXEQUAL = 43 +LEFTSHIFTEQUAL = 44 +RIGHTSHIFTEQUAL = 45 +DOUBLESTAREQUAL = 46 +DOUBLESLASH = 47 +DOUBLESLASHEQUAL = 48 +AT = 49 +ATEQUAL = 50 +RARROW = 51 +ELLIPSIS = 52 +# Don't forget to update the table _PyParser_TokenNames in tokenizer.c! +OP = 53 +ERRORTOKEN = 54 +# These aren't used by the C tokenizer but are needed for tokenize.py +COMMENT = 55 +NL = 56 +ENCODING = 57 +N_TOKENS = 58 +# Special definitions for cooperation with parser +NT_OFFSET = 256 +#--end constants-- + +tok_name = {value: name + for name, value in globals().items() + if isinstance(value, int) and not name.startswith('_')} +__all__.extend(tok_name.values()) + +def ISTERMINAL(x): + return x < NT_OFFSET + +def ISNONTERMINAL(x): + return x >= NT_OFFSET + +def ISEOF(x): + return x == ENDMARKER + + +def _main(): + import re + import sys + args = sys.argv[1:] + inFileName = args and args[0] or "Include/token.h" + outFileName = "Lib/token.py" + if len(args) > 1: + outFileName = args[1] + try: + fp = open(inFileName) + except OSError as err: + sys.stdout.write("I/O error: %s\n" % str(err)) + sys.exit(1) + with fp: + lines = fp.read().split("\n") + prog = re.compile( + r"#define[ \t][ \t]*([A-Z0-9][A-Z0-9_]*)[ \t][ \t]*([0-9][0-9]*)", + re.IGNORECASE) + comment_regex = re.compile( + r"^\s*/\*\s*(.+?)\s*\*/\s*$", + re.IGNORECASE) + + tokens = {} + prev_val = None + for line in lines: + match = prog.match(line) + if match: + name, val = match.group(1, 2) + val = int(val) + tokens[val] = {'token': name} # reverse so we can sort them... + prev_val = val + else: + comment_match = comment_regex.match(line) + if comment_match and prev_val is not None: + comment = comment_match.group(1) + tokens[prev_val]['comment'] = comment + keys = sorted(tokens.keys()) + # load the output skeleton from the target: + try: + fp = open(outFileName) + except OSError as err: + sys.stderr.write("I/O error: %s\n" % str(err)) + sys.exit(2) + with fp: + format = fp.read().split("\n") + try: + start = format.index("#--start constants--") + 1 + end = format.index("#--end constants--") + except ValueError: + sys.stderr.write("target does not contain format markers") + sys.exit(3) + lines = [] + for key in keys: + lines.append("%s = %d" % (tokens[key]["token"], key)) + if "comment" in tokens[key]: + lines.append("# %s" % tokens[key]["comment"]) + format[start:end] = lines + try: + fp = open(outFileName, 'w') + except OSError as err: + sys.stderr.write("I/O error: %s\n" % str(err)) + sys.exit(4) + with fp: + fp.write("\n".join(format)) + + +if __name__ == "__main__": + _main() diff --git a/env/Lib/tokenize.py b/env/Lib/tokenize.py new file mode 100644 index 0000000..8305bf9 --- /dev/null +++ b/env/Lib/tokenize.py @@ -0,0 +1,736 @@ +"""Tokenization help for Python programs. + +tokenize(readline) is a generator that breaks a stream of bytes into +Python tokens. It decodes the bytes according to PEP-0263 for +determining source file encoding. + +It accepts a readline-like method which is called repeatedly to get the +next line of input (or b"" for EOF). It generates 5-tuples with these +members: + + the token type (see token.py) + the token (a string) + the starting (row, column) indices of the token (a 2-tuple of ints) + the ending (row, column) indices of the token (a 2-tuple of ints) + the original line (string) + +It is designed to match the working of the Python tokenizer exactly, except +that it produces COMMENT tokens for comments and gives type OP for all +operators. Additionally, all token lists start with an ENCODING token +which tells you which encoding was used to decode the bytes stream. +""" + +__author__ = 'Ka-Ping Yee ' +__credits__ = ('GvR, ESR, Tim Peters, Thomas Wouters, Fred Drake, ' + 'Skip Montanaro, Raymond Hettinger, Trent Nelson, ' + 'Michael Foord') +from builtins import open as _builtin_open +from codecs import lookup, BOM_UTF8 +import collections +from io import TextIOWrapper +from itertools import chain +import itertools as _itertools +import re +import sys +from token import * + +cookie_re = re.compile(r'^[ \t\f]*#.*?coding[:=][ \t]*([-\w.]+)', re.ASCII) +blank_re = re.compile(br'^[ \t\f]*(?:[#\r\n]|$)', re.ASCII) + +import token +__all__ = token.__all__ + ["tokenize", "detect_encoding", + "untokenize", "TokenInfo"] +del token + +EXACT_TOKEN_TYPES = { + '(': LPAR, + ')': RPAR, + '[': LSQB, + ']': RSQB, + ':': COLON, + ',': COMMA, + ';': SEMI, + '+': PLUS, + '-': MINUS, + '*': STAR, + '/': SLASH, + '|': VBAR, + '&': AMPER, + '<': LESS, + '>': GREATER, + '=': EQUAL, + '.': DOT, + '%': PERCENT, + '{': LBRACE, + '}': RBRACE, + '==': EQEQUAL, + '!=': NOTEQUAL, + '<=': LESSEQUAL, + '>=': GREATEREQUAL, + '~': TILDE, + '^': CIRCUMFLEX, + '<<': LEFTSHIFT, + '>>': RIGHTSHIFT, + '**': DOUBLESTAR, + '+=': PLUSEQUAL, + '-=': MINEQUAL, + '*=': STAREQUAL, + '/=': SLASHEQUAL, + '%=': PERCENTEQUAL, + '&=': AMPEREQUAL, + '|=': VBAREQUAL, + '^=': CIRCUMFLEXEQUAL, + '<<=': LEFTSHIFTEQUAL, + '>>=': RIGHTSHIFTEQUAL, + '**=': DOUBLESTAREQUAL, + '//': DOUBLESLASH, + '//=': DOUBLESLASHEQUAL, + '...': ELLIPSIS, + '->': RARROW, + '@': AT, + '@=': ATEQUAL, +} + +class TokenInfo(collections.namedtuple('TokenInfo', 'type string start end line')): + def __repr__(self): + annotated_type = '%d (%s)' % (self.type, tok_name[self.type]) + return ('TokenInfo(type=%s, string=%r, start=%r, end=%r, line=%r)' % + self._replace(type=annotated_type)) + + @property + def exact_type(self): + if self.type == OP and self.string in EXACT_TOKEN_TYPES: + return EXACT_TOKEN_TYPES[self.string] + else: + return self.type + +def group(*choices): return '(' + '|'.join(choices) + ')' +def any(*choices): return group(*choices) + '*' +def maybe(*choices): return group(*choices) + '?' + +# Note: we use unicode matching for names ("\w") but ascii matching for +# number literals. +Whitespace = r'[ \f\t]*' +Comment = r'#[^\r\n]*' +Ignore = Whitespace + any(r'\\\r?\n' + Whitespace) + maybe(Comment) +Name = r'\w+' + +Hexnumber = r'0[xX](?:_?[0-9a-fA-F])+' +Binnumber = r'0[bB](?:_?[01])+' +Octnumber = r'0[oO](?:_?[0-7])+' +Decnumber = r'(?:0(?:_?0)*|[1-9](?:_?[0-9])*)' +Intnumber = group(Hexnumber, Binnumber, Octnumber, Decnumber) +Exponent = r'[eE][-+]?[0-9](?:_?[0-9])*' +Pointfloat = group(r'[0-9](?:_?[0-9])*\.(?:[0-9](?:_?[0-9])*)?', + r'\.[0-9](?:_?[0-9])*') + maybe(Exponent) +Expfloat = r'[0-9](?:_?[0-9])*' + Exponent +Floatnumber = group(Pointfloat, Expfloat) +Imagnumber = group(r'[0-9](?:_?[0-9])*[jJ]', Floatnumber + r'[jJ]') +Number = group(Imagnumber, Floatnumber, Intnumber) + +# Return the empty string, plus all of the valid string prefixes. +def _all_string_prefixes(): + # The valid string prefixes. Only contain the lower case versions, + # and don't contain any permutations (include 'fr', but not + # 'rf'). The various permutations will be generated. + _valid_string_prefixes = ['b', 'r', 'u', 'f', 'br', 'fr'] + # if we add binary f-strings, add: ['fb', 'fbr'] + result = {''} + for prefix in _valid_string_prefixes: + for t in _itertools.permutations(prefix): + # create a list with upper and lower versions of each + # character + for u in _itertools.product(*[(c, c.upper()) for c in t]): + result.add(''.join(u)) + return result + +def _compile(expr): + return re.compile(expr, re.UNICODE) + +# Note that since _all_string_prefixes includes the empty string, +# StringPrefix can be the empty string (making it optional). +StringPrefix = group(*_all_string_prefixes()) + +# Tail end of ' string. +Single = r"[^'\\]*(?:\\.[^'\\]*)*'" +# Tail end of " string. +Double = r'[^"\\]*(?:\\.[^"\\]*)*"' +# Tail end of ''' string. +Single3 = r"[^'\\]*(?:(?:\\.|'(?!''))[^'\\]*)*'''" +# Tail end of """ string. +Double3 = r'[^"\\]*(?:(?:\\.|"(?!""))[^"\\]*)*"""' +Triple = group(StringPrefix + "'''", StringPrefix + '"""') +# Single-line ' or " string. +String = group(StringPrefix + r"'[^\n'\\]*(?:\\.[^\n'\\]*)*'", + StringPrefix + r'"[^\n"\\]*(?:\\.[^\n"\\]*)*"') + +# Because of leftmost-then-longest match semantics, be sure to put the +# longest operators first (e.g., if = came before ==, == would get +# recognized as two instances of =). +Operator = group(r"\*\*=?", r">>=?", r"<<=?", r"!=", + r"//=?", r"->", + r"[+\-*/%&@|^=<>]=?", + r"~") + +Bracket = '[][(){}]' +Special = group(r'\r?\n', r'\.\.\.', r'[:;.,@]') +Funny = group(Operator, Bracket, Special) + +PlainToken = group(Number, Funny, String, Name) +Token = Ignore + PlainToken + +# First (or only) line of ' or " string. +ContStr = group(StringPrefix + r"'[^\n'\\]*(?:\\.[^\n'\\]*)*" + + group("'", r'\\\r?\n'), + StringPrefix + r'"[^\n"\\]*(?:\\.[^\n"\\]*)*' + + group('"', r'\\\r?\n')) +PseudoExtras = group(r'\\\r?\n|\Z', Comment, Triple) +PseudoToken = Whitespace + group(PseudoExtras, Number, Funny, ContStr, Name) + +# For a given string prefix plus quotes, endpats maps it to a regex +# to match the remainder of that string. _prefix can be empty, for +# a normal single or triple quoted string (with no prefix). +endpats = {} +for _prefix in _all_string_prefixes(): + endpats[_prefix + "'"] = Single + endpats[_prefix + '"'] = Double + endpats[_prefix + "'''"] = Single3 + endpats[_prefix + '"""'] = Double3 + +# A set of all of the single and triple quoted string prefixes, +# including the opening quotes. +single_quoted = set() +triple_quoted = set() +for t in _all_string_prefixes(): + for u in (t + '"', t + "'"): + single_quoted.add(u) + for u in (t + '"""', t + "'''"): + triple_quoted.add(u) + +tabsize = 8 + +class TokenError(Exception): pass + +class StopTokenizing(Exception): pass + + +class Untokenizer: + + def __init__(self): + self.tokens = [] + self.prev_row = 1 + self.prev_col = 0 + self.encoding = None + + def add_whitespace(self, start): + row, col = start + if row < self.prev_row or row == self.prev_row and col < self.prev_col: + raise ValueError("start ({},{}) precedes previous end ({},{})" + .format(row, col, self.prev_row, self.prev_col)) + row_offset = row - self.prev_row + if row_offset: + self.tokens.append("\\\n" * row_offset) + self.prev_col = 0 + col_offset = col - self.prev_col + if col_offset: + self.tokens.append(" " * col_offset) + + def untokenize(self, iterable): + it = iter(iterable) + indents = [] + startline = False + for t in it: + if len(t) == 2: + self.compat(t, it) + break + tok_type, token, start, end, line = t + if tok_type == ENCODING: + self.encoding = token + continue + if tok_type == ENDMARKER: + break + if tok_type == INDENT: + indents.append(token) + continue + elif tok_type == DEDENT: + indents.pop() + self.prev_row, self.prev_col = end + continue + elif tok_type in (NEWLINE, NL): + startline = True + elif startline and indents: + indent = indents[-1] + if start[1] >= len(indent): + self.tokens.append(indent) + self.prev_col = len(indent) + startline = False + self.add_whitespace(start) + self.tokens.append(token) + self.prev_row, self.prev_col = end + if tok_type in (NEWLINE, NL): + self.prev_row += 1 + self.prev_col = 0 + return "".join(self.tokens) + + def compat(self, token, iterable): + indents = [] + toks_append = self.tokens.append + startline = token[0] in (NEWLINE, NL) + prevstring = False + + for tok in chain([token], iterable): + toknum, tokval = tok[:2] + if toknum == ENCODING: + self.encoding = tokval + continue + + if toknum in (NAME, NUMBER): + tokval += ' ' + + # Insert a space between two consecutive strings + if toknum == STRING: + if prevstring: + tokval = ' ' + tokval + prevstring = True + else: + prevstring = False + + if toknum == INDENT: + indents.append(tokval) + continue + elif toknum == DEDENT: + indents.pop() + continue + elif toknum in (NEWLINE, NL): + startline = True + elif startline and indents: + toks_append(indents[-1]) + startline = False + toks_append(tokval) + + +def untokenize(iterable): + """Transform tokens back into Python source code. + It returns a bytes object, encoded using the ENCODING + token, which is the first token sequence output by tokenize. + + Each element returned by the iterable must be a token sequence + with at least two elements, a token number and token value. If + only two tokens are passed, the resulting output is poor. + + Round-trip invariant for full input: + Untokenized source will match input source exactly + + Round-trip invariant for limited input: + # Output bytes will tokenize back to the input + t1 = [tok[:2] for tok in tokenize(f.readline)] + newcode = untokenize(t1) + readline = BytesIO(newcode).readline + t2 = [tok[:2] for tok in tokenize(readline)] + assert t1 == t2 + """ + ut = Untokenizer() + out = ut.untokenize(iterable) + if ut.encoding is not None: + out = out.encode(ut.encoding) + return out + + +def _get_normal_name(orig_enc): + """Imitates get_normal_name in tokenizer.c.""" + # Only care about the first 12 characters. + enc = orig_enc[:12].lower().replace("_", "-") + if enc == "utf-8" or enc.startswith("utf-8-"): + return "utf-8" + if enc in ("latin-1", "iso-8859-1", "iso-latin-1") or \ + enc.startswith(("latin-1-", "iso-8859-1-", "iso-latin-1-")): + return "iso-8859-1" + return orig_enc + +def detect_encoding(readline): + """ + The detect_encoding() function is used to detect the encoding that should + be used to decode a Python source file. It requires one argument, readline, + in the same way as the tokenize() generator. + + It will call readline a maximum of twice, and return the encoding used + (as a string) and a list of any lines (left as bytes) it has read in. + + It detects the encoding from the presence of a utf-8 bom or an encoding + cookie as specified in pep-0263. If both a bom and a cookie are present, + but disagree, a SyntaxError will be raised. If the encoding cookie is an + invalid charset, raise a SyntaxError. Note that if a utf-8 bom is found, + 'utf-8-sig' is returned. + + If no encoding is specified, then the default of 'utf-8' will be returned. + """ + try: + filename = readline.__self__.name + except AttributeError: + filename = None + bom_found = False + encoding = None + default = 'utf-8' + def read_or_stop(): + try: + return readline() + except StopIteration: + return b'' + + def find_cookie(line): + try: + # Decode as UTF-8. Either the line is an encoding declaration, + # in which case it should be pure ASCII, or it must be UTF-8 + # per default encoding. + line_string = line.decode('utf-8') + except UnicodeDecodeError: + msg = "invalid or missing encoding declaration" + if filename is not None: + msg = '{} for {!r}'.format(msg, filename) + raise SyntaxError(msg) + + match = cookie_re.match(line_string) + if not match: + return None + encoding = _get_normal_name(match.group(1)) + 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 encoding != '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] + if not blank_re.match(first): + return default, [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] + + +def open(filename): + """Open a file in read only mode using the encoding detected by + detect_encoding(). + """ + buffer = _builtin_open(filename, 'rb') + try: + encoding, lines = detect_encoding(buffer.readline) + buffer.seek(0) + text = TextIOWrapper(buffer, encoding, line_buffering=True) + text.mode = 'r' + return text + except: + buffer.close() + raise + + +def tokenize(readline): + """ + The tokenize() generator requires one argument, readline, which + must be a callable object which provides the same interface as the + readline() method of built-in file objects. Each call to the function + should return one line of input as bytes. Alternatively, readline + can be a callable function terminating with StopIteration: + readline = open(myfile, 'rb').__next__ # Example of alternate readline + + The generator produces 5-tuples with these members: the token type; the + token string; a 2-tuple (srow, scol) of ints specifying the row and + column where the token begins in the source; a 2-tuple (erow, ecol) of + ints specifying the row and column where the token ends in the source; + and the line on which the token was found. The line passed is the + logical line; continuation lines are included. + + The first token sequence will always be an ENCODING token + which tells you which encoding was used to decode the bytes stream. + """ + # This import is here to avoid problems when the itertools module is not + # built yet and tokenize is imported. + from itertools import chain, repeat + encoding, consumed = detect_encoding(readline) + rl_gen = iter(readline, b"") + empty = repeat(b"") + return _tokenize(chain(consumed, rl_gen, empty).__next__, encoding) + + +def _tokenize(readline, encoding): + lnum = parenlev = continued = 0 + numchars = '0123456789' + contstr, needcont = '', 0 + contline = None + indents = [0] + + if encoding is not None: + if encoding == "utf-8-sig": + # BOM will already have been stripped. + encoding = "utf-8" + yield TokenInfo(ENCODING, encoding, (0, 0), (0, 0), '') + last_line = b'' + line = b'' + while True: # loop over lines in stream + try: + # We capture the value of the line variable here because + # readline uses the empty string '' to signal end of input, + # hence `line` itself will always be overwritten at the end + # of this loop. + last_line = line + line = readline() + except StopIteration: + line = b'' + + if encoding is not None: + line = line.decode(encoding) + lnum += 1 + pos, max = 0, len(line) + + if contstr: # continued string + if not line: + raise TokenError("EOF in multi-line string", strstart) + endmatch = endprog.match(line) + if endmatch: + pos = end = endmatch.end(0) + yield TokenInfo(STRING, contstr + line[:end], + strstart, (lnum, end), contline + line) + contstr, needcont = '', 0 + contline = None + elif needcont and line[-2:] != '\\\n' and line[-3:] != '\\\r\n': + yield TokenInfo(ERRORTOKEN, contstr + line, + strstart, (lnum, len(line)), contline) + contstr = '' + contline = None + continue + else: + contstr = contstr + line + contline = contline + line + continue + + elif parenlev == 0 and not continued: # new statement + if not line: break + column = 0 + while pos < max: # measure leading whitespace + if line[pos] == ' ': + column += 1 + elif line[pos] == '\t': + column = (column//tabsize + 1)*tabsize + elif line[pos] == '\f': + column = 0 + else: + break + pos += 1 + if pos == max: + break + + if line[pos] in '#\r\n': # skip comments or blank lines + if line[pos] == '#': + comment_token = line[pos:].rstrip('\r\n') + yield TokenInfo(COMMENT, comment_token, + (lnum, pos), (lnum, pos + len(comment_token)), line) + pos += len(comment_token) + + yield TokenInfo(NL, line[pos:], + (lnum, pos), (lnum, len(line)), line) + continue + + if column > indents[-1]: # count indents or dedents + indents.append(column) + yield TokenInfo(INDENT, line[:pos], (lnum, 0), (lnum, pos), line) + while column < indents[-1]: + if column not in indents: + raise IndentationError( + "unindent does not match any outer indentation level", + ("", lnum, pos, line)) + indents = indents[:-1] + + yield TokenInfo(DEDENT, '', (lnum, pos), (lnum, pos), line) + + else: # continued statement + if not line: + raise TokenError("EOF in multi-line statement", (lnum, 0)) + continued = 0 + + while pos < max: + pseudomatch = _compile(PseudoToken).match(line, pos) + if pseudomatch: # scan for tokens + start, end = pseudomatch.span(1) + spos, epos, pos = (lnum, start), (lnum, end), end + if start == end: + continue + token, initial = line[start:end], line[start] + + if (initial in numchars or # ordinary number + (initial == '.' and token != '.' and token != '...')): + yield TokenInfo(NUMBER, token, spos, epos, line) + elif initial in '\r\n': + if parenlev > 0: + yield TokenInfo(NL, token, spos, epos, line) + else: + yield TokenInfo(NEWLINE, token, spos, epos, line) + + elif initial == '#': + assert not token.endswith("\n") + yield TokenInfo(COMMENT, token, spos, epos, line) + + elif token in triple_quoted: + endprog = _compile(endpats[token]) + endmatch = endprog.match(line, pos) + if endmatch: # all on one line + pos = endmatch.end(0) + token = line[start:pos] + yield TokenInfo(STRING, token, spos, (lnum, pos), line) + else: + strstart = (lnum, start) # multiple lines + contstr = line[start:] + contline = line + break + + # Check up to the first 3 chars of the token to see if + # they're in the single_quoted set. If so, they start + # a string. + # We're using the first 3, because we're looking for + # "rb'" (for example) at the start of the token. If + # we switch to longer prefixes, this needs to be + # adjusted. + # Note that initial == token[:1]. + # Also note that single quote checking must come after + # triple quote checking (above). + elif (initial in single_quoted or + token[:2] in single_quoted or + token[:3] in single_quoted): + if token[-1] == '\n': # continued string + strstart = (lnum, start) + # Again, using the first 3 chars of the + # token. This is looking for the matching end + # regex for the correct type of quote + # character. So it's really looking for + # endpats["'"] or endpats['"'], by trying to + # skip string prefix characters, if any. + endprog = _compile(endpats.get(initial) or + endpats.get(token[1]) or + endpats.get(token[2])) + contstr, needcont = line[start:], 1 + contline = line + break + else: # ordinary string + yield TokenInfo(STRING, token, spos, epos, line) + + elif initial.isidentifier(): # ordinary name + yield TokenInfo(NAME, token, spos, epos, line) + elif initial == '\\': # continued stmt + continued = 1 + else: + if initial in '([{': + parenlev += 1 + elif initial in ')]}': + parenlev -= 1 + yield TokenInfo(OP, token, spos, epos, line) + else: + yield TokenInfo(ERRORTOKEN, line[pos], + (lnum, pos), (lnum, pos+1), line) + pos += 1 + + # Add an implicit NEWLINE if the input doesn't end in one + if last_line and last_line[-1] not in '\r\n': + yield TokenInfo(NEWLINE, '', (lnum - 1, len(last_line)), (lnum - 1, len(last_line) + 1), '') + for indent in indents[1:]: # pop remaining indent levels + yield TokenInfo(DEDENT, '', (lnum, 0), (lnum, 0), '') + yield TokenInfo(ENDMARKER, '', (lnum, 0), (lnum, 0), '') + + +# An undocumented, backwards compatible, API for all the places in the standard +# library that expect to be able to use tokenize with strings +def generate_tokens(readline): + return _tokenize(readline, None) + +def main(): + import argparse + + # Helper error handling routines + def perror(message): + print(message, file=sys.stderr) + + def error(message, filename=None, location=None): + if location: + args = (filename,) + location + (message,) + perror("%s:%d:%d: error: %s" % args) + elif filename: + perror("%s: error: %s" % (filename, message)) + else: + perror("error: %s" % message) + sys.exit(1) + + # Parse the arguments and options + parser = argparse.ArgumentParser(prog='python -m tokenize') + parser.add_argument(dest='filename', nargs='?', + metavar='filename.py', + help='the file to tokenize; defaults to stdin') + parser.add_argument('-e', '--exact', dest='exact', action='store_true', + help='display token names using the exact type') + args = parser.parse_args() + + try: + # Tokenize the input + if args.filename: + filename = args.filename + with _builtin_open(filename, 'rb') as f: + tokens = list(tokenize(f.readline)) + else: + filename = "" + tokens = _tokenize(sys.stdin.readline, None) + + # Output the tokenization + for token in tokens: + token_type = token.type + if args.exact: + token_type = token.exact_type + token_range = "%d,%d-%d,%d:" % (token.start + token.end) + print("%-20s%-15s%-15r" % + (token_range, tok_name[token_type], token.string)) + except IndentationError as err: + line, column = err.args[1][1:3] + error(err.args[0], filename, (line, column)) + except TokenError as err: + line, column = err.args[1] + error(err.args[0], filename, (line, column)) + except SyntaxError as err: + error(err, filename) + except OSError as err: + error(err) + except KeyboardInterrupt: + print("interrupted\n") + except Exception as err: + perror("unexpected error: %s" % err) + raise + +if __name__ == "__main__": + main() diff --git a/env/Lib/types.py b/env/Lib/types.py new file mode 100644 index 0000000..2e0513c --- /dev/null +++ b/env/Lib/types.py @@ -0,0 +1,295 @@ +""" +Define names for built-in types that aren't directly accessible as a builtin. +""" +import sys + +# Iterators in Python aren't a matter of type but of protocol. A large +# and changing number of builtin types implement *some* flavor of +# iterator. Don't check the type! Use hasattr to check for both +# "__iter__" and "__next__" attributes instead. + +def _f(): pass +FunctionType = type(_f) +LambdaType = type(lambda: None) # Same as FunctionType +CodeType = type(_f.__code__) +MappingProxyType = type(type.__dict__) +SimpleNamespace = type(sys.implementation) + +def _g(): + yield 1 +GeneratorType = type(_g()) + +async def _c(): pass +_c = _c() +CoroutineType = type(_c) +_c.close() # Prevent ResourceWarning + +async def _ag(): + yield +_ag = _ag() +AsyncGeneratorType = type(_ag) + +class _C: + def _m(self): pass +MethodType = type(_C()._m) + +BuiltinFunctionType = type(len) +BuiltinMethodType = type([].append) # Same as BuiltinFunctionType + +WrapperDescriptorType = type(object.__init__) +MethodWrapperType = type(object().__str__) +MethodDescriptorType = type(str.join) +ClassMethodDescriptorType = type(dict.__dict__['fromkeys']) + +ModuleType = type(sys) + +try: + raise TypeError +except TypeError: + tb = sys.exc_info()[2] + TracebackType = type(tb) + FrameType = type(tb.tb_frame) + tb = None; del tb + +# For Jython, the following two types are identical +GetSetDescriptorType = type(FunctionType.__code__) +MemberDescriptorType = type(FunctionType.__globals__) + +del sys, _f, _g, _C, _c, _ag # Not for export + + +# Provide a PEP 3115 compliant mechanism for class creation +def new_class(name, bases=(), kwds=None, exec_body=None): + """Create a class object dynamically using the appropriate metaclass.""" + resolved_bases = resolve_bases(bases) + meta, ns, kwds = prepare_class(name, resolved_bases, kwds) + if exec_body is not None: + exec_body(ns) + if resolved_bases is not bases: + ns['__orig_bases__'] = bases + return meta(name, resolved_bases, ns, **kwds) + +def resolve_bases(bases): + """Resolve MRO entries dynamically as specified by PEP 560.""" + new_bases = list(bases) + updated = False + shift = 0 + for i, base in enumerate(bases): + if isinstance(base, type): + continue + if not hasattr(base, "__mro_entries__"): + continue + new_base = base.__mro_entries__(bases) + updated = True + if not isinstance(new_base, tuple): + raise TypeError("__mro_entries__ must return a tuple") + else: + new_bases[i+shift:i+shift+1] = new_base + shift += len(new_base) - 1 + if not updated: + return bases + return tuple(new_bases) + +def prepare_class(name, bases=(), kwds=None): + """Call the __prepare__ method of the appropriate metaclass. + + Returns (metaclass, namespace, kwds) as a 3-tuple + + *metaclass* is the appropriate metaclass + *namespace* is the prepared class namespace + *kwds* is an updated copy of the passed in kwds argument with any + 'metaclass' entry removed. If no kwds argument is passed in, this will + be an empty dict. + """ + if kwds is None: + kwds = {} + else: + kwds = dict(kwds) # Don't alter the provided mapping + if 'metaclass' in kwds: + meta = kwds.pop('metaclass') + else: + if bases: + meta = type(bases[0]) + else: + meta = type + if isinstance(meta, type): + # when meta is a type, we first determine the most-derived metaclass + # instead of invoking the initial candidate directly + meta = _calculate_meta(meta, bases) + if hasattr(meta, '__prepare__'): + ns = meta.__prepare__(name, bases, **kwds) + else: + ns = {} + return meta, ns, kwds + +def _calculate_meta(meta, bases): + """Calculate the most derived metaclass.""" + winner = meta + for base in bases: + base_meta = type(base) + if issubclass(winner, base_meta): + continue + if issubclass(base_meta, winner): + winner = base_meta + continue + # else: + raise TypeError("metaclass conflict: " + "the metaclass of a derived class " + "must be a (non-strict) subclass " + "of the metaclasses of all its bases") + return winner + +class DynamicClassAttribute: + """Route attribute access on a class to __getattr__. + + This is a descriptor, used to define attributes that act differently when + accessed through an instance and through a class. Instance access remains + normal, but access to an attribute through a class will be routed to the + class's __getattr__ method; this is done by raising AttributeError. + + This allows one to have properties active on an instance, and have virtual + attributes on the class with the same name (see Enum for an example). + + """ + def __init__(self, fget=None, fset=None, fdel=None, doc=None): + self.fget = fget + self.fset = fset + self.fdel = fdel + # next two lines make DynamicClassAttribute act the same as property + self.__doc__ = doc or fget.__doc__ + self.overwrite_doc = doc is None + # support for abstract methods + self.__isabstractmethod__ = bool(getattr(fget, '__isabstractmethod__', False)) + + def __get__(self, instance, ownerclass=None): + if instance is None: + if self.__isabstractmethod__: + return self + raise AttributeError() + elif self.fget is None: + raise AttributeError("unreadable attribute") + return self.fget(instance) + + def __set__(self, instance, value): + if self.fset is None: + raise AttributeError("can't set attribute") + self.fset(instance, value) + + def __delete__(self, instance): + if self.fdel is None: + raise AttributeError("can't delete attribute") + self.fdel(instance) + + def getter(self, fget): + fdoc = fget.__doc__ if self.overwrite_doc else None + result = type(self)(fget, self.fset, self.fdel, fdoc or self.__doc__) + result.overwrite_doc = self.overwrite_doc + return result + + def setter(self, fset): + result = type(self)(self.fget, fset, self.fdel, self.__doc__) + result.overwrite_doc = self.overwrite_doc + return result + + def deleter(self, fdel): + result = type(self)(self.fget, self.fset, fdel, self.__doc__) + result.overwrite_doc = self.overwrite_doc + return result + + +class _GeneratorWrapper: + # TODO: Implement this in C. + def __init__(self, gen): + self.__wrapped = gen + self.__isgen = gen.__class__ is GeneratorType + self.__name__ = getattr(gen, '__name__', None) + self.__qualname__ = getattr(gen, '__qualname__', None) + def send(self, val): + return self.__wrapped.send(val) + def throw(self, tp, *rest): + return self.__wrapped.throw(tp, *rest) + def close(self): + return self.__wrapped.close() + @property + def gi_code(self): + return self.__wrapped.gi_code + @property + def gi_frame(self): + return self.__wrapped.gi_frame + @property + def gi_running(self): + return self.__wrapped.gi_running + @property + def gi_yieldfrom(self): + return self.__wrapped.gi_yieldfrom + cr_code = gi_code + cr_frame = gi_frame + cr_running = gi_running + cr_await = gi_yieldfrom + def __next__(self): + return next(self.__wrapped) + def __iter__(self): + if self.__isgen: + return self.__wrapped + return self + __await__ = __iter__ + +def coroutine(func): + """Convert regular generator function to a coroutine.""" + + if not callable(func): + raise TypeError('types.coroutine() expects a callable') + + if (func.__class__ is FunctionType and + getattr(func, '__code__', None).__class__ is CodeType): + + co_flags = func.__code__.co_flags + + # Check if 'func' is a coroutine function. + # (0x180 == CO_COROUTINE | CO_ITERABLE_COROUTINE) + if co_flags & 0x180: + return func + + # Check if 'func' is a generator function. + # (0x20 == CO_GENERATOR) + if co_flags & 0x20: + # TODO: Implement this in C. + co = func.__code__ + func.__code__ = CodeType( + co.co_argcount, co.co_kwonlyargcount, co.co_nlocals, + co.co_stacksize, + co.co_flags | 0x100, # 0x100 == CO_ITERABLE_COROUTINE + co.co_code, + co.co_consts, co.co_names, co.co_varnames, co.co_filename, + co.co_name, co.co_firstlineno, co.co_lnotab, co.co_freevars, + co.co_cellvars) + return func + + # The following code is primarily to support functions that + # return generator-like objects (for instance generators + # compiled with Cython). + + # Delay functools and _collections_abc import for speeding up types import. + import functools + import _collections_abc + @functools.wraps(func) + def wrapped(*args, **kwargs): + coro = func(*args, **kwargs) + if (coro.__class__ is CoroutineType or + coro.__class__ is GeneratorType and coro.gi_code.co_flags & 0x100): + # 'coro' is a native coroutine object or an iterable coroutine + return coro + if (isinstance(coro, _collections_abc.Generator) and + not isinstance(coro, _collections_abc.Coroutine)): + # 'coro' is either a pure Python generator iterator, or it + # implements collections.abc.Generator (and does not implement + # collections.abc.Coroutine). + return _GeneratorWrapper(coro) + # 'coro' is either an instance of collections.abc.Coroutine or + # some other object -- pass it through. + return coro + + return wrapped + + +__all__ = [n for n in globals() if n[:1] != '_'] diff --git a/env/Lib/warnings.py b/env/Lib/warnings.py new file mode 100644 index 0000000..9064f56 --- /dev/null +++ b/env/Lib/warnings.py @@ -0,0 +1,565 @@ +"""Python part of the warnings subsystem.""" + +import sys + + +__all__ = ["warn", "warn_explicit", "showwarning", + "formatwarning", "filterwarnings", "simplefilter", + "resetwarnings", "catch_warnings"] + +def showwarning(message, category, filename, lineno, file=None, line=None): + """Hook to write a warning to a file; replace if you like.""" + msg = WarningMessage(message, category, filename, lineno, file, line) + _showwarnmsg_impl(msg) + +def formatwarning(message, category, filename, lineno, line=None): + """Function to format a warning the standard way.""" + msg = WarningMessage(message, category, filename, lineno, None, line) + return _formatwarnmsg_impl(msg) + +def _showwarnmsg_impl(msg): + file = msg.file + if file is None: + file = sys.stderr + if file is None: + # sys.stderr is None when run with pythonw.exe: + # warnings get lost + return + text = _formatwarnmsg(msg) + try: + file.write(text) + except OSError: + # the file (probably stderr) is invalid - this warning gets lost. + pass + +def _formatwarnmsg_impl(msg): + category = msg.category.__name__ + s = f"{msg.filename}:{msg.lineno}: {category}: {msg.message}\n" + + if msg.line is None: + try: + import linecache + line = linecache.getline(msg.filename, msg.lineno) + except Exception: + # When a warning is logged during Python shutdown, linecache + # and the import machinery don't work anymore + line = None + linecache = None + else: + line = msg.line + if line: + line = line.strip() + s += " %s\n" % line + + if msg.source is not None: + try: + import tracemalloc + # Logging a warning should not raise a new exception: + # catch Exception, not only ImportError and RecursionError. + except Exception: + # don't suggest to enable tracemalloc if it's not available + tracing = True + tb = None + else: + tracing = tracemalloc.is_tracing() + try: + tb = tracemalloc.get_object_traceback(msg.source) + except Exception: + # When a warning is logged during Python shutdown, tracemalloc + # and the import machinery don't work anymore + tb = None + + if tb is not None: + s += 'Object allocated at (most recent call last):\n' + for frame in tb: + s += (' File "%s", lineno %s\n' + % (frame.filename, frame.lineno)) + + try: + if linecache is not None: + line = linecache.getline(frame.filename, frame.lineno) + else: + line = None + except Exception: + line = None + if line: + line = line.strip() + s += ' %s\n' % line + elif not tracing: + s += (f'{category}: Enable tracemalloc to get the object ' + f'allocation traceback\n') + return s + +# Keep a reference to check if the function was replaced +_showwarning_orig = showwarning + +def _showwarnmsg(msg): + """Hook to write a warning to a file; replace if you like.""" + try: + sw = showwarning + except NameError: + pass + else: + if sw is not _showwarning_orig: + # warnings.showwarning() was replaced + if not callable(sw): + raise TypeError("warnings.showwarning() must be set to a " + "function or method") + + sw(msg.message, msg.category, msg.filename, msg.lineno, + msg.file, msg.line) + return + _showwarnmsg_impl(msg) + +# Keep a reference to check if the function was replaced +_formatwarning_orig = formatwarning + +def _formatwarnmsg(msg): + """Function to format a warning the standard way.""" + try: + fw = formatwarning + except NameError: + pass + else: + if fw is not _formatwarning_orig: + # warnings.formatwarning() was replaced + return fw(msg.message, msg.category, + msg.filename, msg.lineno, msg.line) + return _formatwarnmsg_impl(msg) + +def filterwarnings(action, message="", category=Warning, module="", lineno=0, + append=False): + """Insert an entry into the list of warnings filters (at the front). + + 'action' -- one of "error", "ignore", "always", "default", "module", + or "once" + 'message' -- a regex that the warning message must match + 'category' -- a class that the warning must be a subclass of + 'module' -- a regex that the module name must match + '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(message, str), "message must be a string" + assert isinstance(category, type), "category must be a class" + assert issubclass(category, Warning), "category must be a Warning subclass" + assert isinstance(module, str), "module must be a string" + assert isinstance(lineno, int) and lineno >= 0, \ + "lineno must be an int >= 0" + + if message or module: + import re + + if message: + message = re.compile(message, re.I) + else: + message = None + if module: + module = re.compile(module) + else: + module = None + + _add_filter(action, message, category, module, lineno, append=append) + +def simplefilter(action, category=Warning, lineno=0, append=False): + """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" + _add_filter(action, None, category, None, lineno, append=append) + +def _add_filter(*item, append): + # Remove possible duplicate filters, so new one will be placed + # in correct place. If append=True and duplicate exists, do nothing. + if not append: + try: + filters.remove(item) + except ValueError: + pass + filters.insert(0, item) + else: + if item not in filters: + filters.append(item) + _filters_mutated() + +def resetwarnings(): + """Clear the list of warning filters, so that no filters are active.""" + filters[:] = [] + _filters_mutated() + +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 as msg: + print("Invalid -W option ignored:", msg, file=sys.stderr) + +# 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,)) from None + 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,)) from None + 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,)) from None + try: + cat = getattr(m, klass) + except AttributeError: + raise _OptionError("unknown warning category: %r" % (category,)) from None + if not issubclass(cat, Warning): + raise _OptionError("invalid warning category: %r" % (category,)) + return cat + + +def _is_internal_frame(frame): + """Signal whether the frame is an internal CPython implementation detail.""" + filename = frame.f_code.co_filename + return 'importlib' in filename and '_bootstrap' in filename + + +def _next_external_frame(frame): + """Find the next frame that doesn't involve CPython internals.""" + frame = frame.f_back + while frame is not None and _is_internal_frame(frame): + frame = frame.f_back + return frame + + +# Code typically replaced by _warnings +def warn(message, category=None, stacklevel=1, source=None): + """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 + if not (isinstance(category, type) and issubclass(category, Warning)): + raise TypeError("category must be a Warning subclass, " + "not '{:s}'".format(type(category).__name__)) + # Get context information + try: + if stacklevel <= 1 or _is_internal_frame(sys._getframe(1)): + # If frame is too small to care or if the warning originated in + # internal code, then do not try to hide any frames. + frame = sys._getframe(stacklevel) + else: + frame = sys._getframe(1) + # Look for one frame less since the above line starts us off. + for x in range(stacklevel-1): + frame = _next_external_frame(frame) + if frame is None: + raise ValueError + except ValueError: + globals = sys.__dict__ + lineno = 1 + else: + globals = frame.f_globals + lineno = frame.f_lineno + if '__name__' in globals: + module = globals['__name__'] + else: + module = "" + filename = globals.get('__file__') + if filename: + fnl = filename.lower() + if fnl.endswith(".pyc"): + 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, source) + +def warn_explicit(message, category, filename, lineno, + module=None, registry=None, module_globals=None, + source=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 registry.get('version', 0) != _filters_version: + registry.clear() + registry['version'] = _filters_version + 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": + return + + # Prime the linecache for formatting, in case the + # "file" is actually in a zipfile or something. + import linecache + 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 + msg = WarningMessage(message, category, filename, lineno, source) + _showwarnmsg(msg) + + +class WarningMessage(object): + + _WARNING_DETAILS = ("message", "category", "filename", "lineno", "file", + "line", "source") + + def __init__(self, message, category, filename, lineno, file=None, + line=None, source=None): + self.message = message + self.category = category + self.filename = filename + self.lineno = lineno + self.file = file + self.line = line + self.source = source + 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._module._filters_mutated() + self._showwarning = self._module.showwarning + self._showwarnmsg_impl = self._module._showwarnmsg_impl + if self._record: + log = [] + self._module._showwarnmsg_impl = log.append + # Reset showwarning() to the default implementation to make sure + # that _showwarnmsg() calls _showwarnmsg_impl() + self._module.showwarning = self._module._showwarning_orig + 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._filters_mutated() + self._module.showwarning = self._showwarning + self._module._showwarnmsg_impl = self._showwarnmsg_impl + + +# Private utility function called by _PyErr_WarnUnawaitedCoroutine +def _warn_unawaited_coroutine(coro): + msg_lines = [ + f"coroutine '{coro.__qualname__}' was never awaited\n" + ] + if coro.cr_origin is not None: + import linecache, traceback + def extract(): + for filename, lineno, funcname in reversed(coro.cr_origin): + line = linecache.getline(filename, lineno) + yield (filename, lineno, funcname, line) + msg_lines.append("Coroutine created at (most recent call last)\n") + msg_lines += traceback.format_list(list(extract())) + msg = "".join(msg_lines).rstrip("\n") + # Passing source= here means that if the user happens to have tracemalloc + # enabled and tracking where the coroutine was created, the warning will + # contain that traceback. This does mean that if they have *both* + # coroutine origin tracking *and* tracemalloc enabled, they'll get two + # partially-redundant tracebacks. If we wanted to be clever we could + # probably detect this case and avoid it, but for now we don't bother. + warn(msg, category=RuntimeWarning, stacklevel=2, source=coro) + + +# 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. +try: + from _warnings import (filters, _defaultaction, _onceregistry, + warn, warn_explicit, _filters_mutated) + defaultaction = _defaultaction + onceregistry = _onceregistry + _warnings_defaults = True +except ImportError: + filters = [] + defaultaction = "default" + onceregistry = {} + + _filters_version = 1 + + def _filters_mutated(): + global _filters_version + _filters_version += 1 + + _warnings_defaults = False + + +# Module initialization +_processoptions(sys.warnoptions) +if not _warnings_defaults: + # Several warning categories are ignored by default in regular builds + if not hasattr(sys, 'gettotalrefcount'): + filterwarnings("default", category=DeprecationWarning, + module="__main__", append=1) + simplefilter("ignore", category=DeprecationWarning, append=1) + simplefilter("ignore", category=PendingDeprecationWarning, append=1) + simplefilter("ignore", category=ImportWarning, append=1) + simplefilter("ignore", category=ResourceWarning, append=1) + +del _warnings_defaults diff --git a/env/Lib/weakref.py b/env/Lib/weakref.py new file mode 100644 index 0000000..59b3aa5 --- /dev/null +++ b/env/Lib/weakref.py @@ -0,0 +1,656 @@ +"""Weak reference support for Python. + +This module is an implementation of PEP 205: + +http://www.python.org/dev/peps/pep-0205/ +""" + +# Naming convention: Variables named "wr" are weak reference objects; +# they are called this instead of "ref" to avoid name collisions with +# the module-global ref() function imported from _weakref. + +from _weakref import ( + getweakrefcount, + getweakrefs, + ref, + proxy, + CallableProxyType, + ProxyType, + ReferenceType, + _remove_dead_weakref) + +from _weakrefset import WeakSet, _IterationGuard + +import _collections_abc # Import after _weakref to avoid circular import. +import sys +import itertools + +ProxyTypes = (ProxyType, CallableProxyType) + +__all__ = ["ref", "proxy", "getweakrefcount", "getweakrefs", + "WeakKeyDictionary", "ReferenceType", "ProxyType", + "CallableProxyType", "ProxyTypes", "WeakValueDictionary", + "WeakSet", "WeakMethod", "finalize"] + + +class WeakMethod(ref): + """ + A custom `weakref.ref` subclass which simulates a weak reference to + a bound method, working around the lifetime problem of bound methods. + """ + + __slots__ = "_func_ref", "_meth_type", "_alive", "__weakref__" + + def __new__(cls, meth, callback=None): + try: + obj = meth.__self__ + func = meth.__func__ + except AttributeError: + raise TypeError("argument should be a bound method, not {}" + .format(type(meth))) from None + def _cb(arg): + # The self-weakref trick is needed to avoid creating a reference + # cycle. + self = self_wr() + if self._alive: + self._alive = False + if callback is not None: + callback(self) + self = ref.__new__(cls, obj, _cb) + self._func_ref = ref(func, _cb) + self._meth_type = type(meth) + self._alive = True + self_wr = ref(self) + return self + + def __call__(self): + obj = super().__call__() + func = self._func_ref() + if obj is None or func is None: + return None + return self._meth_type(func, obj) + + def __eq__(self, other): + if isinstance(other, WeakMethod): + if not self._alive or not other._alive: + return self is other + return ref.__eq__(self, other) and self._func_ref == other._func_ref + return False + + def __ne__(self, other): + if isinstance(other, WeakMethod): + if not self._alive or not other._alive: + return self is not other + return ref.__ne__(self, other) or self._func_ref != other._func_ref + return True + + __hash__ = ref.__hash__ + + +class WeakValueDictionary(_collections_abc.MutableMapping): + """Mapping class that references values weakly. + + Entries in the dictionary will be discarded when no strong + reference to the value exists anymore + """ + # We inherit the constructor without worrying about the input + # dictionary; since it uses our .update() method, we get the right + # checks (if the other dictionary is a WeakValueDictionary, + # objects are unwrapped on the way out, and we always wrap on the + # way in). + + def __init__(*args, **kw): + if not args: + raise TypeError("descriptor '__init__' of 'WeakValueDictionary' " + "object needs an argument") + self, *args = args + if len(args) > 1: + raise TypeError('expected at most 1 arguments, got %d' % len(args)) + def remove(wr, selfref=ref(self), _atomic_removal=_remove_dead_weakref): + self = selfref() + if self is not None: + if self._iterating: + self._pending_removals.append(wr.key) + else: + # Atomic removal is necessary since this function + # can be called asynchronously by the GC + _atomic_removal(d, wr.key) + self._remove = remove + # A list of keys to be removed + self._pending_removals = [] + self._iterating = set() + self.data = d = {} + self.update(*args, **kw) + + def _commit_removals(self): + l = self._pending_removals + d = self.data + # We shouldn't encounter any KeyError, because this method should + # always be called *before* mutating the dict. + while l: + key = l.pop() + _remove_dead_weakref(d, key) + + def __getitem__(self, key): + if self._pending_removals: + self._commit_removals() + o = self.data[key]() + if o is None: + raise KeyError(key) + else: + return o + + def __delitem__(self, key): + if self._pending_removals: + self._commit_removals() + del self.data[key] + + def __len__(self): + if self._pending_removals: + self._commit_removals() + return len(self.data) + + def __contains__(self, key): + if self._pending_removals: + self._commit_removals() + try: + o = self.data[key]() + except KeyError: + return False + return o is not None + + def __repr__(self): + return "<%s at %#x>" % (self.__class__.__name__, id(self)) + + def __setitem__(self, key, value): + if self._pending_removals: + self._commit_removals() + self.data[key] = KeyedRef(value, self._remove, key) + + def copy(self): + if self._pending_removals: + self._commit_removals() + new = WeakValueDictionary() + with _IterationGuard(self): + for key, wr in self.data.items(): + o = wr() + if o is not None: + new[key] = o + return new + + __copy__ = copy + + def __deepcopy__(self, memo): + from copy import deepcopy + if self._pending_removals: + self._commit_removals() + new = self.__class__() + with _IterationGuard(self): + for key, wr in self.data.items(): + o = wr() + if o is not None: + new[deepcopy(key, memo)] = o + return new + + def get(self, key, default=None): + if self._pending_removals: + self._commit_removals() + try: + wr = self.data[key] + except KeyError: + return default + else: + o = wr() + if o is None: + # This should only happen + return default + else: + return o + + def items(self): + if self._pending_removals: + self._commit_removals() + with _IterationGuard(self): + for k, wr in self.data.items(): + v = wr() + if v is not None: + yield k, v + + def keys(self): + if self._pending_removals: + self._commit_removals() + with _IterationGuard(self): + for k, wr in self.data.items(): + if wr() is not None: + yield k + + __iter__ = keys + + def itervaluerefs(self): + """Return an iterator that yields the weak references to the values. + + The references are not guaranteed to be 'live' at the time + they are used, so the result of calling the references needs + to be checked before being used. This can be used to avoid + creating references that will cause the garbage collector to + keep the values around longer than needed. + + """ + if self._pending_removals: + self._commit_removals() + with _IterationGuard(self): + yield from self.data.values() + + def values(self): + if self._pending_removals: + self._commit_removals() + with _IterationGuard(self): + for wr in self.data.values(): + obj = wr() + if obj is not None: + yield obj + + def popitem(self): + if self._pending_removals: + self._commit_removals() + while True: + key, wr = self.data.popitem() + o = wr() + if o is not None: + return key, o + + def pop(self, key, *args): + if self._pending_removals: + self._commit_removals() + try: + o = self.data.pop(key)() + except KeyError: + o = None + if o is None: + if args: + return args[0] + else: + raise KeyError(key) + else: + return o + + def setdefault(self, key, default=None): + try: + o = self.data[key]() + except KeyError: + o = None + if o is None: + if self._pending_removals: + self._commit_removals() + self.data[key] = KeyedRef(default, self._remove, key) + return default + else: + return o + + def update(*args, **kwargs): + if not args: + raise TypeError("descriptor 'update' of 'WeakValueDictionary' " + "object needs an argument") + self, *args = args + if len(args) > 1: + raise TypeError('expected at most 1 arguments, got %d' % len(args)) + dict = args[0] if args else None + if self._pending_removals: + self._commit_removals() + d = self.data + if dict is not None: + if not hasattr(dict, "items"): + dict = type({})(dict) + for key, o in dict.items(): + d[key] = KeyedRef(o, self._remove, key) + if len(kwargs): + self.update(kwargs) + + def valuerefs(self): + """Return a list of weak references to the values. + + The references are not guaranteed to be 'live' at the time + they are used, so the result of calling the references needs + to be checked before being used. This can be used to avoid + creating references that will cause the garbage collector to + keep the values around longer than needed. + + """ + if self._pending_removals: + self._commit_removals() + return list(self.data.values()) + + +class KeyedRef(ref): + """Specialized reference that includes a key corresponding to the value. + + This is used in the WeakValueDictionary to avoid having to create + a function object for each key stored in the mapping. A shared + callback object can use the 'key' attribute of a KeyedRef instead + of getting a reference to the key from an enclosing scope. + + """ + + __slots__ = "key", + + def __new__(type, ob, callback, key): + self = ref.__new__(type, ob, callback) + self.key = key + return self + + def __init__(self, ob, callback, key): + super().__init__(ob, callback) + + +class WeakKeyDictionary(_collections_abc.MutableMapping): + """ Mapping class that references keys weakly. + + Entries in the dictionary will be discarded when there is no + longer a strong reference to the key. This can be used to + associate additional data with an object owned by other parts of + an application without adding attributes to those objects. This + can be especially useful with objects that override attribute + accesses. + """ + + def __init__(self, dict=None): + self.data = {} + def remove(k, selfref=ref(self)): + self = selfref() + if self is not None: + if self._iterating: + self._pending_removals.append(k) + else: + del self.data[k] + self._remove = remove + # A list of dead weakrefs (keys to be removed) + self._pending_removals = [] + self._iterating = set() + self._dirty_len = False + if dict is not None: + self.update(dict) + + def _commit_removals(self): + # NOTE: We don't need to call this method before mutating the dict, + # because a dead weakref never compares equal to a live weakref, + # even if they happened to refer to equal objects. + # However, it means keys may already have been removed. + l = self._pending_removals + d = self.data + while l: + try: + del d[l.pop()] + except KeyError: + pass + + def _scrub_removals(self): + d = self.data + self._pending_removals = [k for k in self._pending_removals if k in d] + self._dirty_len = False + + def __delitem__(self, key): + self._dirty_len = True + del self.data[ref(key)] + + def __getitem__(self, key): + return self.data[ref(key)] + + def __len__(self): + if self._dirty_len and self._pending_removals: + # self._pending_removals may still contain keys which were + # explicitly removed, we have to scrub them (see issue #21173). + self._scrub_removals() + return len(self.data) - len(self._pending_removals) + + def __repr__(self): + return "<%s at %#x>" % (self.__class__.__name__, id(self)) + + def __setitem__(self, key, value): + self.data[ref(key, self._remove)] = value + + def copy(self): + new = WeakKeyDictionary() + with _IterationGuard(self): + for key, value in self.data.items(): + o = key() + if o is not None: + new[o] = value + return new + + __copy__ = copy + + def __deepcopy__(self, memo): + from copy import deepcopy + new = self.__class__() + with _IterationGuard(self): + for key, value in self.data.items(): + o = key() + if o is not None: + new[o] = deepcopy(value, memo) + return new + + def get(self, key, default=None): + return self.data.get(ref(key),default) + + def __contains__(self, key): + try: + wr = ref(key) + except TypeError: + return False + return wr in self.data + + def items(self): + with _IterationGuard(self): + for wr, value in self.data.items(): + key = wr() + if key is not None: + yield key, value + + def keys(self): + with _IterationGuard(self): + for wr in self.data: + obj = wr() + if obj is not None: + yield obj + + __iter__ = keys + + def values(self): + with _IterationGuard(self): + for wr, value in self.data.items(): + if wr() is not None: + yield value + + def keyrefs(self): + """Return a list of weak references to the keys. + + The references are not guaranteed to be 'live' at the time + they are used, so the result of calling the references needs + to be checked before being used. This can be used to avoid + creating references that will cause the garbage collector to + keep the keys around longer than needed. + + """ + return list(self.data) + + def popitem(self): + self._dirty_len = True + while True: + key, value = self.data.popitem() + o = key() + if o is not None: + return o, value + + def pop(self, key, *args): + self._dirty_len = True + return self.data.pop(ref(key), *args) + + def setdefault(self, key, default=None): + return self.data.setdefault(ref(key, self._remove),default) + + def update(self, dict=None, **kwargs): + d = self.data + if dict is not None: + if not hasattr(dict, "items"): + dict = type({})(dict) + for key, value in dict.items(): + d[ref(key, self._remove)] = value + if len(kwargs): + self.update(kwargs) + + +class finalize: + """Class for finalization of weakrefable objects + + finalize(obj, func, *args, **kwargs) returns a callable finalizer + object which will be called when obj is garbage collected. The + first time the finalizer is called it evaluates func(*arg, **kwargs) + and returns the result. After this the finalizer is dead, and + calling it just returns None. + + When the program exits any remaining finalizers for which the + atexit attribute is true will be run in reverse order of creation. + By default atexit is true. + """ + + # Finalizer objects don't have any state of their own. They are + # just used as keys to lookup _Info objects in the registry. This + # ensures that they cannot be part of a ref-cycle. + + __slots__ = () + _registry = {} + _shutdown = False + _index_iter = itertools.count() + _dirty = False + _registered_with_atexit = False + + class _Info: + __slots__ = ("weakref", "func", "args", "kwargs", "atexit", "index") + + def __init__(*args, **kwargs): + if len(args) >= 3: + self, obj, func, *args = args + elif not args: + raise TypeError("descriptor '__init__' of 'finalize' object " + "needs an argument") + else: + if 'func' not in kwargs: + raise TypeError('finalize expected at least 2 positional ' + 'arguments, got %d' % (len(args)-1)) + func = kwargs.pop('func') + if len(args) >= 2: + self, obj, *args = args + else: + if 'obj' not in kwargs: + raise TypeError('finalize expected at least 2 positional ' + 'arguments, got %d' % (len(args)-1)) + obj = kwargs.pop('obj') + self, *args = args + args = tuple(args) + + if not self._registered_with_atexit: + # We may register the exit function more than once because + # of a thread race, but that is harmless + import atexit + atexit.register(self._exitfunc) + finalize._registered_with_atexit = True + info = self._Info() + info.weakref = ref(obj, self) + info.func = func + info.args = args + info.kwargs = kwargs or None + info.atexit = True + info.index = next(self._index_iter) + self._registry[self] = info + finalize._dirty = True + + def __call__(self, _=None): + """If alive then mark as dead and return func(*args, **kwargs); + otherwise return None""" + info = self._registry.pop(self, None) + if info and not self._shutdown: + return info.func(*info.args, **(info.kwargs or {})) + + def detach(self): + """If alive then mark as dead and return (obj, func, args, kwargs); + otherwise return None""" + info = self._registry.get(self) + obj = info and info.weakref() + if obj is not None and self._registry.pop(self, None): + return (obj, info.func, info.args, info.kwargs or {}) + + def peek(self): + """If alive then return (obj, func, args, kwargs); + otherwise return None""" + info = self._registry.get(self) + obj = info and info.weakref() + if obj is not None: + return (obj, info.func, info.args, info.kwargs or {}) + + @property + def alive(self): + """Whether finalizer is alive""" + return self in self._registry + + @property + def atexit(self): + """Whether finalizer should be called at exit""" + info = self._registry.get(self) + return bool(info) and info.atexit + + @atexit.setter + def atexit(self, value): + info = self._registry.get(self) + if info: + info.atexit = bool(value) + + def __repr__(self): + info = self._registry.get(self) + obj = info and info.weakref() + if obj is None: + return '<%s object at %#x; dead>' % (type(self).__name__, id(self)) + else: + return '<%s object at %#x; for %r at %#x>' % \ + (type(self).__name__, id(self), type(obj).__name__, id(obj)) + + @classmethod + def _select_for_exit(cls): + # Return live finalizers marked for exit, oldest first + L = [(f,i) for (f,i) in cls._registry.items() if i.atexit] + L.sort(key=lambda item:item[1].index) + return [f for (f,i) in L] + + @classmethod + def _exitfunc(cls): + # At shutdown invoke finalizers for which atexit is true. + # This is called once all other non-daemonic threads have been + # joined. + reenable_gc = False + try: + if cls._registry: + import gc + if gc.isenabled(): + reenable_gc = True + gc.disable() + pending = None + while True: + if pending is None or finalize._dirty: + pending = cls._select_for_exit() + finalize._dirty = False + if not pending: + break + f = pending.pop() + try: + # gc is disabled, so (assuming no daemonic + # threads) the following is the only line in + # this function which might trigger creation + # of a new finalizer + f() + except Exception: + sys.excepthook(*sys.exc_info()) + assert f not in cls._registry + finally: + # prevent any more finalizers from executing during shutdown + finalize._shutdown = True + if reenable_gc: + gc.enable() diff --git a/env/Scripts/activate b/env/Scripts/activate new file mode 100644 index 0000000..24925f6 --- /dev/null +++ b/env/Scripts/activate @@ -0,0 +1,84 @@ +# This file must be used with "source bin/activate" *from bash* +# you cannot run it directly + + +if [ "${BASH_SOURCE-}" = "$0" ]; then + echo "You must source this script: \$ source $0" >&2 + exit 33 +fi + +deactivate () { + unset -f pydoc >/dev/null 2>&1 + + # reset old environment variables + # ! [ -z ${VAR+_} ] returns true if VAR is declared at all + if ! [ -z "${_OLD_VIRTUAL_PATH:+_}" ] ; then + PATH="$_OLD_VIRTUAL_PATH" + export PATH + unset _OLD_VIRTUAL_PATH + fi + if ! [ -z "${_OLD_VIRTUAL_PYTHONHOME+_}" ] ; then + PYTHONHOME="$_OLD_VIRTUAL_PYTHONHOME" + export PYTHONHOME + unset _OLD_VIRTUAL_PYTHONHOME + fi + + # This should detect bash and zsh, which have a hash command that must + # be called to get it to forget past commands. Without forgetting + # past commands the $PATH changes we made may not be respected + if [ -n "${BASH-}" ] || [ -n "${ZSH_VERSION-}" ] ; then + hash -r 2>/dev/null + fi + + if ! [ -z "${_OLD_VIRTUAL_PS1+_}" ] ; then + PS1="$_OLD_VIRTUAL_PS1" + export PS1 + unset _OLD_VIRTUAL_PS1 + fi + + unset VIRTUAL_ENV + if [ ! "${1-}" = "nondestructive" ] ; then + # Self destruct! + unset -f deactivate + fi +} + +# unset irrelevant variables +deactivate nondestructive + +VIRTUAL_ENV="$(if [ "$OSTYPE" "==" "cygwin" ]; then cygpath -u 'C:\Users\TSB\Desktop\flask-by-example\env'; else echo '/C/Users/TSB/Desktop/flask-by-example/env'; fi;)" +export VIRTUAL_ENV + +_OLD_VIRTUAL_PATH="$PATH" +PATH="$VIRTUAL_ENV/Scripts:$PATH" +export PATH + +# unset PYTHONHOME if set +if ! [ -z "${PYTHONHOME+_}" ] ; then + _OLD_VIRTUAL_PYTHONHOME="$PYTHONHOME" + unset PYTHONHOME +fi + +if [ -z "${VIRTUAL_ENV_DISABLE_PROMPT-}" ] ; then + _OLD_VIRTUAL_PS1="${PS1-}" + if [ "x" != x ] ; then + PS1="${PS1-}" + else + PS1="(`basename \"$VIRTUAL_ENV\"`) ${PS1-}" + fi + export PS1 +fi + +# Make sure to unalias pydoc if it's already there +alias pydoc 2>/dev/null >/dev/null && unalias pydoc || true + +pydoc () { + python -m pydoc "$@" +} + +# This should detect bash and zsh, which have a hash command that must +# be called to get it to forget past commands. Without forgetting +# past commands the $PATH changes we made may not be respected +if [ -n "${BASH-}" ] || [ -n "${ZSH_VERSION-}" ] ; then + hash -r 2>/dev/null +fi diff --git a/env/Scripts/activate.bat b/env/Scripts/activate.bat new file mode 100644 index 0000000..f98b5ae --- /dev/null +++ b/env/Scripts/activate.bat @@ -0,0 +1,35 @@ +@echo off + +set "VIRTUAL_ENV=C:\Users\TSB\Desktop\flask-by-example\env" + +if defined _OLD_VIRTUAL_PROMPT ( + set "PROMPT=%_OLD_VIRTUAL_PROMPT%" +) else ( + if not defined PROMPT ( + set "PROMPT=$P$G" + ) + if not defined VIRTUAL_ENV_DISABLE_PROMPT ( + set "_OLD_VIRTUAL_PROMPT=%PROMPT%" + ) +) +if not defined VIRTUAL_ENV_DISABLE_PROMPT ( + set "PROMPT=(env) %PROMPT%" +) + +REM Don't use () to avoid problems with them in %PATH% +if defined _OLD_VIRTUAL_PYTHONHOME goto ENDIFVHOME + set "_OLD_VIRTUAL_PYTHONHOME=%PYTHONHOME%" +:ENDIFVHOME + +set PYTHONHOME= + +REM if defined _OLD_VIRTUAL_PATH ( +if not defined _OLD_VIRTUAL_PATH goto ENDIFVPATH1 + set "PATH=%_OLD_VIRTUAL_PATH%" +:ENDIFVPATH1 +REM ) else ( +if defined _OLD_VIRTUAL_PATH goto ENDIFVPATH2 + set "_OLD_VIRTUAL_PATH=%PATH%" +:ENDIFVPATH2 + +set "PATH=%VIRTUAL_ENV%\Scripts;%PATH%" diff --git a/env/Scripts/activate.ps1 b/env/Scripts/activate.ps1 new file mode 100644 index 0000000..1de020c --- /dev/null +++ b/env/Scripts/activate.ps1 @@ -0,0 +1,60 @@ +$script:THIS_PATH = $myinvocation.mycommand.path +$script:BASE_DIR = Split-Path (Resolve-Path "$THIS_PATH/..") -Parent + +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) { + Remove-Item env:VIRTUAL_ENV -ErrorAction SilentlyContinue + } + + if (!$NonDestructive) { + # Self destruct! + Remove-Item function:deactivate + Remove-Item function:pydoc + } +} + +function global:pydoc { + python -m pydoc $args +} + +# unset irrelevant variables +deactivate -nondestructive + +$VIRTUAL_ENV = $BASE_DIR +$env:VIRTUAL_ENV = $VIRTUAL_ENV + +New-Variable -Scope global -Name _OLD_VIRTUAL_PATH -Value $env:PATH + +$env:PATH = "$env:VIRTUAL_ENV/Scripts;" + $env:PATH +if (!$env:VIRTUAL_ENV_DISABLE_PROMPT) { + function global:_old_virtual_prompt { + "" + } + $function:_old_virtual_prompt = $function:prompt + + if ("" -ne "") { + function global:prompt { + # Add the custom prefix to the existing prompt + $previous_prompt_value = & $function:_old_virtual_prompt + ("" + $previous_prompt_value) + } + } + else { + function global:prompt { + # Add a prefix to the current prompt, but don't discard it. + $previous_prompt_value = & $function:_old_virtual_prompt + $new_prompt_value = "($( Split-Path $env:VIRTUAL_ENV -Leaf )) " + ($new_prompt_value + $previous_prompt_value) + } + } +} diff --git a/env/Scripts/activate.xsh b/env/Scripts/activate.xsh new file mode 100644 index 0000000..2d70b35 --- /dev/null +++ b/env/Scripts/activate.xsh @@ -0,0 +1,46 @@ +"""Xonsh activate script for virtualenv""" +from xonsh.tools import get_sep as _get_sep + +def _deactivate(args): + if "pydoc" in aliases: + del aliases["pydoc"] + + if ${...}.get("_OLD_VIRTUAL_PATH", ""): + $PATH = $_OLD_VIRTUAL_PATH + del $_OLD_VIRTUAL_PATH + + if ${...}.get("_OLD_VIRTUAL_PYTHONHOME", ""): + $PYTHONHOME = $_OLD_VIRTUAL_PYTHONHOME + del $_OLD_VIRTUAL_PYTHONHOME + + if "VIRTUAL_ENV" in ${...}: + del $VIRTUAL_ENV + + if "VIRTUAL_ENV_PROMPT" in ${...}: + del $VIRTUAL_ENV_PROMPT + + if "nondestructive" not in args: + # Self destruct! + del aliases["deactivate"] + + +# unset irrelevant variables +_deactivate(["nondestructive"]) +aliases["deactivate"] = _deactivate + +$VIRTUAL_ENV = r"C:\Users\TSB\Desktop\flask-by-example\env" + +$_OLD_VIRTUAL_PATH = $PATH +$PATH = $PATH[:] +$PATH.add($VIRTUAL_ENV + _get_sep() + "Scripts", front=True, replace=True) + +if ${...}.get("PYTHONHOME", ""): + # unset PYTHONHOME if set + $_OLD_VIRTUAL_PYTHONHOME = $PYTHONHOME + del $PYTHONHOME + +$VIRTUAL_ENV_PROMPT = "" +if not $VIRTUAL_ENV_PROMPT: + del $VIRTUAL_ENV_PROMPT + +aliases["pydoc"] = ["python", "-m", "pydoc"] diff --git a/env/Scripts/activate_this.py b/env/Scripts/activate_this.py new file mode 100644 index 0000000..aa96457 --- /dev/null +++ b/env/Scripts/activate_this.py @@ -0,0 +1,46 @@ +"""Activate virtualenv for current interpreter: + +Use exec(open(this_file).read(), {'__file__': this_file}). + +This can be used when you must use an existing Python interpreter, not the virtualenv bin/python. +""" +import os +import site +import sys + +try: + __file__ +except NameError: + raise AssertionError("You must use exec(open(this_file).read(), {'__file__': this_file}))") + +# prepend bin to PATH (this file is inside the bin directory) +bin_dir = os.path.dirname(os.path.abspath(__file__)) +os.environ["PATH"] = os.pathsep.join([bin_dir] + os.environ.get("PATH", "").split(os.pathsep)) + +base = os.path.dirname(bin_dir) + +# virtual env is right above bin directory +os.environ["VIRTUAL_ENV"] = base + +# add the virtual environments site-package to the host python import mechanism +IS_PYPY = hasattr(sys, "pypy_version_info") +IS_JYTHON = sys.platform.startswith("java") +if IS_JYTHON: + site_packages = os.path.join(base, "Lib", "site-packages") +elif IS_PYPY: + site_packages = os.path.join(base, "site-packages") +else: + IS_WIN = sys.platform == "win32" + if IS_WIN: + site_packages = os.path.join(base, "Lib", "site-packages") + else: + site_packages = os.path.join(base, "lib", "python{}.{}".format(*sys.version_info), "site-packages") + +prev = set(sys.path) +site.addsitedir(site_packages) +sys.real_prefix = sys.prefix +sys.prefix = base + +# Move the added items to the front of the path, in place +new = list(sys.path) +sys.path[:] = [i for i in new if i not in prev] + [i for i in new if i in prev] diff --git a/env/Scripts/deactivate.bat b/env/Scripts/deactivate.bat new file mode 100644 index 0000000..7bbc568 --- /dev/null +++ b/env/Scripts/deactivate.bat @@ -0,0 +1,19 @@ +@echo off + +set VIRTUAL_ENV= + +REM Don't use () to avoid problems with them in %PATH% +if not defined _OLD_VIRTUAL_PROMPT goto ENDIFVPROMPT + set "PROMPT=%_OLD_VIRTUAL_PROMPT%" + set _OLD_VIRTUAL_PROMPT= +:ENDIFVPROMPT + +if not defined _OLD_VIRTUAL_PYTHONHOME goto ENDIFVHOME + set "PYTHONHOME=%_OLD_VIRTUAL_PYTHONHOME%" + set _OLD_VIRTUAL_PYTHONHOME= +:ENDIFVHOME + +if not defined _OLD_VIRTUAL_PATH goto ENDIFVPATH + set "PATH=%_OLD_VIRTUAL_PATH%" + set _OLD_VIRTUAL_PATH= +:ENDIFVPATH diff --git a/env/Scripts/easy_install-3.7.exe b/env/Scripts/easy_install-3.7.exe new file mode 100644 index 0000000000000000000000000000000000000000..f2bbb871780a78bc0afae7bc0cc46c490cf87614 GIT binary patch literal 103308 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 literal 0 HcmV?d00001 diff --git a/env/Scripts/easy_install.exe b/env/Scripts/easy_install.exe new file mode 100644 index 0000000000000000000000000000000000000000..f2bbb871780a78bc0afae7bc0cc46c490cf87614 GIT binary patch literal 103308 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 literal 0 HcmV?d00001 diff --git a/env/Scripts/flask.exe b/env/Scripts/flask.exe new file mode 100644 index 0000000000000000000000000000000000000000..4665f13bccd0d3bc9a0762a7041f00028c5303e0 GIT binary patch literal 103286 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 literal 0 HcmV?d00001 diff --git a/env/Scripts/gunicorn.exe b/env/Scripts/gunicorn.exe new file mode 100644 index 0000000000000000000000000000000000000000..b35059be50bed63f863d0dd094d27a616b4ec249 GIT binary patch literal 103295 zcmeFai+@zrx%fTFWXKQ_c2EWah>Q>wjhAS&CJyKf%*Y;@C{|FasAw>yRVyd#5v-_* zJ82nqr=_iJt;e?Zv^~|{Z2M~^pkhLRgqvKv1+j|vJq~KTB|$Fx{XT0?LbRUqIe);* zN3-`{_w}r2J@>Vy_L|imugBvl;D5*Qcv^YNzp(oIzyIkWd*q~bBR&5ZzT>3Uyu^-^ z<}Uum(%_PY+rQp$<88sZ8^86f+l}B&HwPP%-wJ-?Tfyk%R|appebLQlm6Q~f=bHZW zw^tv|OgQ@3!2jQ#SO1vJ_ebBE_gI&D&VB3`>bdZ-{XF;A-S*f4o|y^GWB*X;b8_Vu z<(_rw`PFaKEtWRFID*RK1}f$1QqpZ?;30K$De~&EC+2yk$;;|I&u{1OY|QiQ zXDEaJdh$HCGJxR69?uDbiT{U}9*^g*?ohw9@L9&q%MEhwd4)eRp#A(WNHFAI(BoNn zR>PtjjT=3lF&B_Qo1SX^f0O@*{0oCFXSu~Z&3t$&8SrSHC-5BdFYNKOowdX*sOHFA zJ;fA|@zw|1&M)`n#1@1t=tT9|Nnnq0)dt- z$=edv%kk8erM0PM zI#FJ!r=sOS`{XM?Mqe5Y2?kM)^ueOR?GVQopIXB^hn?}}Sn?0+67-FE3MZN@~)=bS6$o{5C= z;#zcX+-Z+jP&it1IJ--?jPh#T>d>tP^lxqq-q3NZpE5nQqC7Y+GB+|Wa#iGN-8w+O z;e?e*q(7+vVV8#M<7{MqVXFwENrbT}K^9wzfr3rZoLTH?9MS#{uya>IlVDIX4i0tMCNIAYd>kX4;*2R^sZaaMp|VL z+Yef*d#P7(lo8l>kMMZZG^|*U0!LMwH+Dd;=x46K1`;yYgteJInVEeheYzc;<8~yy ze1~2l+M1ZBKIHof$w^-!EX=qcnYAaqPap^}{Z>{x)TCx*P6kJ_U9*$cZm%1i7F-9ax;QlNDnZoBD&YHJ`s%X;n-;s$h!4H z)fOo;RZrbo9&`eayzKF`v}w)Ffb(hD3fa3sycsh1^xX2rvW@2Fa7aEaKCNzhB&grA zFZosVoh^5pPgwund|Wl39A71Sp?o1r+INt3`;jbmOIvbt)~7mE?bvO@No9}B>3db5 z(56q>#9pbq;re599o&~;-Fiv44myE6+Skn~o=$eQaFq2j1vQYagtbk#USuavH5Zi! z+2ZF@*6OC$Vka<;ce8((7JWrF=X`f>&Y{1s>`n8)RA|p}R>`;Hd7hRnhQDf$6Zr3a zNFdTYrKWZWohTJRmd(@Cx0W|Tn1o|Mm_|+l=t7ucOBiC+o~kWQ;6dsp(y{%KwX3B8 zt6K*ebJj6mKDH?`vbFlU@cip2Tq`fF7@=hHl5-R${tS# ze&tqfr1IKNDeMH^QmxMGl0r$h(1UKFYo*X9s!*F-2wK-=&v6U=#4Yp{3hC*R-;=mb zz}Ff3lZU4h_ytu2&F3e8r7jRz5)=a$b0tkKlOb+hs)`iT?;a~C>+8X2Y_vALC*ZOdiM7hIp? z1fF%^IprEWA-(b~QBnDq#}3^)7%LLoJ1q&jVCQb!5Gtfy!F5 zs8MarY=1qdR8empoNSyNv0kuGK3>*4IgYw7^-(fC+wTM(kQGsNlH2u`ea48m7ZmNw z?3A|Bfp!W;T176=t)2ExdT{C2Zqi%Y0EF;@jr{`gWo6o$k<#TT>8zC6Yi zs6!3=CsN$poS!RREX7l@!P}CyZoN_;tvSUQr>z+w>Hp!T7wKk4J{ePz@8mM(s|>?m zA5Be>Od;tD4h_)pzsvm8_}~IUWKW{cdh_DR${B%aHOVd!Qw=Ghc?s z?BAe7q*cq!es`hTFTr~A-V-Mq} z?1$XMVi~u###_(C-_ldp0b*#dZruuUTAPJV2!RMffEU~VFK36(M^ab*$D0NkD zG+pl(3OPKHKC|l+$num#dU1aC_=xqK3^{{116qxYo15}oW<}XI08#6Od4Nb5xzL>= zI;*dl{u>glT?TEP{{XMq5xo467u|dpu%?$FpVmiG=UuhgSABY(XO4XXP=lqW1Ml{# zb<6SJTOl5L+LXq1>!=W}Q1{ZYjWs2P)>u5P#>P34m?d0vf^h` zIlS@$MffTXC9Do+vNm(XZTiaN zks;=mpO`#74w(<8uX*3T7B;BH@hz~1anypSmIC0Pq15%M3-r1UJ^d4Dm9`q`t~Ol| zb@4Kh{+%RLwZ+XXPTV?zl$)NDU;oi#am&&Bb|=yiQn#q@!+h(`mV~!`Am!*6QuvIg z7x)Xo6Z;ef1ukTnCqrU9VeKcIp%CL4QUZcnodAZFiF8RG&;d7)@BnN=#q>V)xYhM$De|f0uvEP{_fXX!SuFC9D zWsH~kfH0o!em!F^Ie~FN&%x|DvY$)rF{+I+>Sdp%CpLd}TDIx0zd`Z#H_U*NjgC$F7CsNi@80u~aJ$cIQV+qZ|W6z&waz{Rb)wU>D$ z1NP4t_Y=}ps?46kyVZgG*4ik2TS~1_vVO|TV2uL$F0^l!QqYQx!D~CVXNT8^HW;IH zvz?ujCp+f@5|RbF)!tFnhU^5Ty+HMwu-bL2WOYTJN2DivkHYJ*_E=g2AWqv!qF#Nz4Q9MKQbxf& z$$RY`XHq3KvsAZMx5-pf$LrS0R`oX9uZIE=qzYq<)!0Q+i_eR3AnCXNS|KGNX14UMskQ-@Lkb3Bi6=R5ze>DKv})<_TGtu2w2Z+E3((UnLn!R zJ;rMy>#^Ru?avUl5+Fq|R#P`Rd9hy6r>!~RqI&aCq@jqv*DNcjH#>qt`pkZn)UT4- zf
    XNM84NA?KShq{f;+4B$#gw_S^y0f5NYc%ztt?9O}apgb3(q-#y??VXGJnv%XM=mgvyyy4E31dQv_gMeHRPFtC(w??p17wq$vF4*0z-HPOC| z%q!i@Cv%yFt>dYfy+i3Kv*=Avjn31}4cI!`{kpRazHIq^K;i7$qJpLa7gHvd*1d77 zE0GSIkLe5|rMLI{%-1Hxt%42uEnDU%tkHRK^D_qt*!=9M;j3jI59`clJ)F4HCauSv zEy<^7Pi=d_8~d>fJ)Xwt_n!)HGkkWWT0wh^jFKhH+z5xx(L`Ckbjd>{pDGKS#_?} zos&mB17C4rjf!d>9DVokW_zi9))#ABI#}b?9jyJV*6&^h@ow=daG#nqz>)~1~; zko+Xx*R2%p_Kxl0d18kWLL_P}{O~&dPgd)xyTjO?bQba~8CumQJrzUC>8%x7^-+$y zjInFrO#|Fz6Fe?+y9h47zlb4(Ha84I?5@hb6t`j?OCQa?n;SvUfZwn4P%J9Cx(EV6 zdkhs4b^AfQi|w~*=84kSlj_!~EG0&{DnWpa&^v**SU| zLr4uVOjt7j);c}^`j;$A zXK5BhKT5%5sXdMnxSKh1Hth){av%U8IVda=;|w-IyL7rD0>?osu-gb(7>{|&>dqG1 zyT=X!MNePe(^MmUC4KhY$VVbR)v`o8>_Z~3TdbhP3R*<@g>IuZsgS^d&^}r4w%QpXrxzPDoi}u}j8Ck+YI7a7V z&i2MjY3{UT{)n|X0sUUASJ-+U*S%=TpSIyez0!{0sP_2=#rEnd+vMX5Wolotg1`Z6B1G zT%9|SS{RHdsXcCesOZpV3F|dMmW6^W*9tR~)k#j)g^v^^tPL2(XGz~bf&=C-XcDj4 zvt@I=hTgtf;bsD54Y^;8#M|x5K>nP#eYKdftWGR)ZPIvHI4vX*bu?iuLYz^;x3V9i z&>)J{!r!b7I<_V|EHHG@-<`)CNQKK1DLr_l>;~asVlwQd`2n4y%zhg)QEseD zc?FF#uL3kFGoW)M(u*+qo+RV%omCdrTE0U8S+Pr4P+76l&Hkgt$$A~;IoQ}iAKK;9 z=jD0K*C*+>?3o|;j_!gTUKfBvkK$!6FCZp`9;8t3jOu%nCrc~irIi4J0>XZdTMMU- zdyCt8Bh`(@@%Dws#@dNN$b80O!=5f9xs{Pv-L;kwikyLNr+qmXi11^*2=ph#QFf%{ zM?%6j1FNa1G1sGVY_A8Fex*|&?+N99sXo+|6y+q=DvX1#rKNDDxn+4|Zqe2h=-E@0 zu`2;ZgOSZGuZ&vlPQcs@+_r!qK5Y#d+M0H4&9*5b?TKomWY1XDzFKP+3KMvg9BY4r zS>%A_d@|K!seSI=A9q6u+nTvo|%0fvAaH2GtMZBiCz>9VVpro$;a@QUmv5b z1L%6=p`XVTCp;_d*@`dL%loo=NmY*)#wB-V#l|*H+F>WhQ$=wtDyq*^@NU2+HB_g_ zvGZV#MVHw>WgfXHP2pAW=^B7&kH3VEyZpj;?=CRw{HSf%<**#*+1V>)om$$K@3F2d z>)YU`c(SNsso&b1!PxDwLZHg+_`j?VDsCz5-QYE*3EO2fgCbp=lexbg+)kCK){{mVx6&MfmABcw25g4J($ zt-H#R*={>0&vPlgtDXyte5bRbFC9Ift#r(cC^kgsg^&s{B%-P3_#xB)Bv(F1R%!?V z2-t67CCV*W1FtMtcD#Ka<|DStHoK6KxyAr7*SofWYH1!DrK__H+N+^2K`T-gvHF$7 z_K1l28M z(XcyWS2h3^*kq0YBw}^TfDe8SDmzCGLS+H3GWs*oK8wsld4|tCl%M>UU5a&SHFh=gNZQ|> zM^efcgl5_^=L)vmIoxgl)!6fRb0@wdrUM2xTSpeSM9ktfWGaR-LRe^(eVTlSI`0^# zTO;btX?IRfYOcg*-=(n67=~2q&+gPMFV@rL`2*~ya;Ty=xc9%v8Zomb)3s*3Anfo(z?eYjhl*Y< z=IUD*V*(@PI#yhyZTrIa;dH5CqBV}TPoue<@_Hh#76=1p#n35L6V#y87}ZrGb*ekU ze3WF2QUS$@(ZSh^;zYCeAp3&x|1;ao>0PlZYzJEev?GO14;Ml{5t2E|eh4LcKslMp z`+&(PUeSexz*9dXRe;LbmXB4-@afLhWQGQkrS&oDE|j_=tYkO9cRG*B&Ovi0xU7t8 zqwNbRmD{SF40l9l_LAO6nQ2^TFFaiqeVf&9UoQy5*7!r15p>y>i!(l&$zqh6Jyk|t zWdGxU$P0B-J!V~*$KBORWmGyn`}*_rg33cS$7uWSbe#iBBFW=~-pVPlwiW0@!0 zWA~!ZDC%)OwAG~^cYTO~oQ<-84XLO{ZZ9hDa%=51;z;m)^BKp%D!4COt=IW}&Ii)M zRr2t*H&sjcQu2+pBS3`u8oeypUA50_6-(^MJBHUh(9etZlMaR+w#Nb{R%Nm|y$7{B zA6@;-DcDF(porZO9I%!QpUCH}SU23Fn{q|-r6}CNV?Quh^cAYw^R5L!>^id9gGFnp z=&?_th!gnndO)7?6`aK$4KWkm7t@-3!PjzS{ZjT*ER%NmRka)Pj;-;Z>}g0V_YQp zYou(qZ|Co7cY$>PU&#WC9BB8+IAQCVJJ@it7O)4rN-G%_K);dUJAsd%;=}SKj$;V) zH(z8cgq?*VpU<~%Y?Yac-I+e;c#MdSpQW1mG!R8@C5vbnOseuW6$VyJqwP=2-am-1DT+UXlc z;_w1bTc^*%8^l#A{L692iQ?zmn|oj41dcu_#;7Hfb64O&03trES4al}lb)89-NJ`C z{Za}ck+|g=D2KiI3A`rK6@&)=yVPmgC}W4;s+gi{{qfW-W%1O~pu`sq)kVX#)}8)Z z>l`am5V!8EuC3^+wO&i$oQXKWo>?oC)tf8Gu4TJ${_piLyT9IJYd-y_X zD>@$u8lkE^HDm9|3Zk-Zm@IS&DQ#%(}I+ zIO~mC8G#!v<^cE{+1VEI(ihy)_OZ5&aQ!>H~dqFsqX9wlJk>ynC~1l-#%>a%-7bvUzlA& zL&=+HBr?Lu)|r{P#^q*aq%n;yPnW*Ong@qzE#twFzD`dYd+#gsGBR6(H6mFNv%0i( zy(6;~@-5-{+MaBIWTE*0 zY4$)3=o)DSf)I{pZEc}!2Ce0XkVuLR8(NrffazMxGB;x1lm zbPB}UoYvzph;u9G=?#~e$$5R@GEXCGn@G<(V)mCVD@|WsYOg3)Lv0qq0NYzD6|K=9 zAyp59?Io;RdWmjb|0 zxNzx-Wm3dC;gEf{T1r%AYCnf}l0~1jpqdjffE9t2-uZ=J;}|WG$YH zf!Hr}lzC#cN&l(5RP4S@2YSFO22y;GheUw2>@NV7MBTFXng<=^oad4Cac(YwgC)uh zbko-R1rUEfO@!zLEND7bN{A!NEFn>lIiinB)J%RSTDNd_NSYW??E6>(k-{&?1xrC4 z!_w+P5fxzUhyW6u$_Ko?7Dbr>VUvQH&!A@Z1l?-!%Xm{QZp#B-!nAUEP{$=8jG?Du zjZWaUe+mP(`klbFyh#VT6VQ2ObxN^r7n_G11f*?t4=RCfrDgJZ)pk3%pT$Z)R4&jV zoDn{>6w>?#)*Z1yBkQ>2bKO|DbtJ9l*$=Ug;A{VYgG-uV2!as)i)Tq1O21u2QAwyU zXAopOE|iG1H!dRWN61H%k6POX?B_cKTqh+&q)A{`4m$Ae&#UHYopm-JKxA{;*E10K z1;%UvauB{SsE#Zni(!d9o4AE@`h>t^%ZaAL{!o!o;k3oQyUhMG8$L=$-ZT40EgRN~ z{^RLrYL8N}6|*&N8WiSB+B)Gy7cv*j6e4z{-PMc<+$> zQwQ=#tNfggZ?AprkTTxEGWbtskb%c7%V-4_1&Q>WQWh-4kRmB~kZT9~d{o7dc#5V2 z-K=SCRa-5tK8ch_0Hvw+(Ld8%(?-b?^20wuFruU>nH5NvMJZPr?`#kHempMg&y`ty ztZ*~na4X9k!R~cpURU9MDy-89g#Vwk=ZlPhNHFr#zz%Wv?Jr1$Rf*G6ofI z;2~E@0}3)Zo-ddZjEfQAGodmQF*fJCKcUX0n!N(NbCp$8yz6xBv4d_4#O-L&eq?LY z*}tre{+@tB;}8X}oWR(>D_ADaG^bySjO#IwQ+C>qvcN3jHX%8G@ARVYc(Q+xk74eI zAl~QnIRxm>*=h9j*Vv(%^?9=EiDeXDg>9V-XRq3)r|&L}q-PI9Y3+!nt}9NYt}Cej z_>X#e`uJW-R~%VYFlnV%1T5#7be zjpfE95ZwC6a+kO@3bC+!XMe&&5w|748oPoOFA%Z>q5AFL(2+%|7asynU9nL^C6=tr z!^r2fhdLTQT@@|AYBPbJL2;g4l|4;+{OY`@_IO(~v|-tpNX4#*)plt*Q6K@Ud4CVu z50=vf!3C=do7FPhh(kdPKFk5S;90vUn8RIfVoO7R3dGkFr!yAW}u8J1DksZlrzERpZJQ!IO^}n&QNr06t+^n7+ z@x~(S;4n{iWiJ-oylf(H_*Enw4x0VrmicKWJtLSc#yB@_*+^OedB4yGA~=A4wgHD> zTCETC_tTeL`YQ_v{Vjw3vI*{j4!?nyjLEr29qdPo7&go*7u|9c!eJb*o2_jiuSb0N z53~vz-?~-^nSCt^F(!mxNt!fLsfQ+RgRU4e1kES(I3qCZq|Jn!D zw0!?11Ss`gRoC*}ufAB%9*43t<@RuJ0) zGH#@kPc8(g=Aom>lRJH5c;^c#qU`^4zjz|v?Q!n`Vni#= zgT97LlVcx2u5b2|)#OMFrPd4xQ51GMfeRSE?7z23kbN1nNG!@FZc>StogjjTP!_x9 zB+&bwg4FfJ(HiKv_MPvk64CNgsuz@>Vw_n$KhKz|JzlLnuIGggE(=ubq|FN^GN8ty zg1Gm&c*XYQrwlB=x-9vup1$P7wMS{7(eICYH>y1AvVx|}ZxPrHr)Q6ma4 z@r`dSfP`d^Z#_;P#jOR%+*x1iD85pc6h~9_{;W53yD=4+GjZCdAb$Jn1y9ki=kj#)^il#(BGqNaIn`gwGtST+ zAEiAW$qVgTHV%?-?!?F{Z^Zjt#GfarwchQaU3UQc_WWv`FPI1YwceNG6$g?}0Jo+O zWNI=}l)euN(2G7OF-AB$ljEOor}l(9wI|%EJt0#|RJ;JV+1#bG(<@H@WSvY4mz7qZ zB4(yNKVI=%vPV#(0cRrwl)Y0eQqLX zDsu9C)+dDiB@PllDofO|MGJ!|QuzB)IFUa22On_k#~DuWrJEEFZI}Hovq-5S^f=z$ z@5uhi*IGW~(d)BdEqShiWxdcCfbeOVSjT1-qXiLIddZKx- zkHL`@@C`Tyhc@s%Ft&m3fx)@oLq}H+u+`{LFxBX!2sRlR9(2_mUM|fY9|5rL_@a3$ zWq|lz6}?988u0f}g1|g-Fy^-zcVcar0AAu`HEz=_a{#P2n$@1<0^PD)z-}?dm^FkL z+urA8b6L`Y{bM8#-re~OmU!*CV*e^==N#e3o=JgQluwU`-hzuJ+H} z@;XURH_B>N5Et#H&5>e!-r;^qGxj&#cUc_xakVfcSn+sst$;yBp1PVO%aQ{2bSa#^ zYyNr{4SYv>$g7#vV;rYjn(|D@Y<+e>%9-~9ZhRJ(iw_*no60%#tmJeCMfO||&gY~| zIRRp1b;Ud6NWD8K-7`cHA*NR_P=v+!r~<_YHd2Q%w&u2J^;JPiI6z-8`L5LMP>IbCbbi z=H{k8c~D{MyQ+c^T~})AV3f#Zrlddt+{C}op*xA+s_fJgZDiwjOA>ABi!v}hWvV1g z&ENhTGXH9~Mgw)-MU?duolW_b)wrF&uHQnZONwYg3+~u(oD`lrMv{5|8=(#mXKfWQ)QJ!CZ{#! z*7-l&1(FW^X}#1w2fP(AQ6Yn(K|~NM`P3D1Wpi8cYQZ<3J%{%3xascK4EJlk`*oiC zwb=bS#r;w-Pd>ZM{aWtk6{#<)Q2|t%J-ADnwH}s)wC`u@c_`WUHPW9}d~K&a5umb4 zmaLL%uVF+d2)`Ulohxlp2ZZKf_9IkW4ac^Tf!#HEWt6Huu!=^7=$t7820b+W4tBUP zo>od^?}qw~k>!mbC8}$iT`a6Cu%5Ks8n@C5`j5R0QAF`D z6^5hmt5gO3%yW-J&rxwdg!yRAe^5}Z-EWUo1HW#+dDm!9@>FfjJanU{i3J@evF#gz zjdw$v;9a#nIZ2=3?(7n6O>L=Cgo*cFda}|M?O&pjfIh=G@>`mnE+yDKLR_`S3;fwL ztl6W{8iNrvPYG{BZ;YWIM^PDXXEP!BP|@J@R_xz9m3N3yiPjgY)C0BjrdMRoh zRBK|N#hR=(r{`lBCXPv@&`#g`{Vqw5t~~h-UU7J|JSWI)m7GUUPT(snupAAb=}I83 zHM4IdccjWKQ@Q;L4-;0ejAE*UWhh0{`~a~AiB=CCZCGO8NL-*^Q<%)pzAXtiz{#CJ z_phX}ZaXTOsY2&jT7DAaHv7}f;rqAh`!9SaLLVo6iI8nPnXo>VY2$-X&&t6*F}cc~ z$UexD%>Ffvr%TS@VXtA+lcc*zHInpOl2*rB-ZV59I;HSmK9i?(`u>F;o5wuej6SGJ z1iIA$ec1cgmxra#gZ9HKLbc}ifkFB*ul?Zl zLTW)7QP3nIMFI$3Vov`hO^~sGj3(zWBi5RQoO0^_ci0gkPmV@0Wx(?vlMZ*tA<2Ke zOcz8yYAvHFh{546Qc#^0txui*C^(2u$_c#i5UE(_-l3nAGStB|1`_BpC(GQydGT*@Rj1%?-R`Oh++QUr5mY#$}KLpeadINX#p z`^7|KXreo<8zm`sy#2NR6fpJ+<-<1x^Sj)_(uae6)riPSe|=4rG0NGX&ZTtZH+}XA z@NIZY%u?a-%72tsvBdV%UlmX&&x|-~tetX8fq>5mYzN}H^*x0OqUuLGU4xwv1CMk6#_RfR>YfvD(}syCLN}&(DhaJQAq1BULg|zCyc}#t5I~K<}k} zPJQPL$5RwdHF$YD+f%f8#yRpeE4s2_CY$L~jC_>k5dWopZZpVR4V$czjbz|CHp*|( znh9hE#!nB4Q;9S0^G?_nyIF-GXwRlRJ@BF=kO)x-!O{15f^3YHQ8kfXq3uVy83i zY>Jy3{h>oEnq$`6aSP+e^dHbDF5-|Qhd-x;z|XG~{pU>u$xm z;Y`?Kwtosq*P;a9{O$n(y{)!Qtw2#%a?abTS0jY=Ur(J8;`~jrP?`*9i_Cs+(kJiO z{t}_moFh1p8|DTO*olUUvn8sy-dPZmfg@DRk2o9krb8f*NBf>mnpM(4#J}5_>90YzPMMyObkxFb;RXjy5!YT3klf^cMJ16@t!(5pz4z(=+w~_NYs(lT(S5 zEVqcnIfGuT>DN#+n*N0ix<^B=MyzZ^n{^-(I*>#P8}zjh0}K?7DKu^z@c-1mT<$^u zY(_eVF{#5qJM7cm8XUsuHNH0>=66gMCMocarhnxQVB$6*^41{+aX1n>oTT#qI*7qI z(l5e5b}r(a8iP8Byu+Tx=FY+3Y>DAy6xX?e zN0E~Shxo*Vz{pZaU=B>lO7xzWV zWM3Fxv1%&r#9e>SnfBB%(&Lq-5}@5>pMC@3@tsM{npxJ|cBf|UKf;|`*+O%6S&(xa z=*guLGhwNVFsk(wy45jBctGC}9zxI$mN<+tne!kG_Se~l?0KIAXa^-`KFlCE1F+40 zG{7{v>>tr@U-yKzV@8}~Fjp7sDBhx=PXrlv|k+1G5T#itqr5ouo zQTGPGoy3(1mzvY|dyK`GTBG;(&LAA+dV0NKvkHCnIarS`wTkzvC8~;;NAi-#* zkx-{G#n}vNF3(ON7A-l3B6#iWac*Wri%JyDRBS{~s5VBwPO~d%*6GMB;jg<$A%HEd zYSE+aT7eMUG$hgg3uVEOTP6Bm70whIo|rUJLf#n+Uze zbp>z+ZB{!??&^%$Gk_L{hxhaUu2if$;yf=BbgxmxNuraS+V16k-HPp6S(YW_Y2GdZ zlSaTZg-#X_us*Wpy6zb(7o6f~zvxKMJSx#qb6m!~bdYhgffTI%2fhh&&&1_?*-IQA z;Ygs?e1H+jd4PaWsd1Q|wU)gk5t{jyj8%$kQ7?pEw(%0j_g8B#V(JM3PZ6!eZf}(- zK{DaS&_V|!T!^bVME$i_vM?NzOWtaqB>=0QthIrv#zd~!9G&CFiguG#_IBQ)sbKar;@ziiE>xu^+K-d! zo~z7`upd<)(0Pyj6{*(+rhGo+DR&yFQb>WsIjPyGp{R%_`&WzsQXz3puAUr|`4bVl zg)>0?kzP+h!rEV4k&M_I&P)=b?mY)RVJZQ~jDw8bb_&#TiI>t?hSEsI5#n`-wB6Qc)`tX} z-UCnCC42A!<}0UW7pw4fbVX&ile5G@>&2+mB_hFhf53vfuo%KZmE8cv48Oy1s1A8V zFp54aXYDpLy#Fyk__u#U;-kz11n!M4m*72rE!RcjelJT@?5fpfJbQD(I^kq&uAbV^ zvrEU+N19&u^wg&R6BE4?+3c0nWDi#!l*_Fhe&A6`SA(%QiwRU-66Cn3OAsuaSufe& z90@AUF4OCJdfV@V;;r8+>pq+=6w5}v5}l{FJ#3WN|E2OKlb3zH%IR$<_&jx&zqh?q zYfh0UOJu%wR8M(Rv&-QB>1WDdy3mguYwP$o*T~jDv2<4H2$Bvju&octf_3z4Y6cm}kTvG{#o# zv7W)wlW%XTV^)w7t@#7NUxXJTk1AK@WygqR8)n9lP>Ncc>?+lD=!n*`iIUpmVr^p$ zK)_o?O?Pp_^?SHWKV-eJW0?K^hAXwl_r%xc<^FMCd^gGAh7>h0m zDz+<&4PSAXM`=?y%t?|dWebL|pYP=|h5cx-9}a{qs6YCD;6JWRG8n&?(^V=tGVyO5 z2;a#UIS^(V;XpX@Tn_Y%dVvFN;zc;n9Q$>g%Q+78?AHf4(DI=iXvrW4`YI3?ezC;< z6SWivlAs>@mwctlGL7>7BXL%zOTJ56$Cwc99b-br+LJ3+I6iml4M&G^p*e2b$@A<> zcoQykI$Y>93Z5;+Cfa9{JjjM7s}IG79>a5-V?%RfkIk1owh)SU?B1$la!Zch9TavQ zuwSNX4uihIYvy>iGD^-Prq(RP=8>@0BF5uK@)0z|%> zieQ{2T4JX?1&SH9W)VPsbt&3Ne<3ceS^fcgyCNYNS3I1nzb|=%RQL#+k)Y5t`FKlx z9K~tPM>iil_4N5Sp<(KE-Fo{WpS^+9sMQU(oK$8@Iyjr0KyQ8{z^J%W!h^D@Zky1e?I{_j=3MUA9#>(UDJ?r%bSHCv zso7RKd{&wHb-x^ibwxoX>bv4J^5op|Qi;c%r>+_pdfD)Ny{?@jww5^GL3|^0pdrR;9Rnc?&k6^F9m9kBTWIx|A)~=vsIw(*b2zF#{AUkTkBd0$u;`I?? zgT5lI!;g1ISKWF}HTG)C#q!^a>^c(B*6)a}ylo-jWTT;(Bdm_TU614$kC<;9O;{gg z7v{bn*qx1px+B_*ZkSUUr&AN|g-a7`YmdxKdH)|)uPl`(v)>0=)#_Dy#Ajf?fyBqO zmi$EObmPyT!_Q+`+UfBzQZ%Ja^ygr z2$w=cyf4MmSLMah3;Uugqm{#B&F>jE4HTe(8X7RJAeypvWzj$~b#!L~Rr;k$O{5XM z^{jzR>Rc#wCQ@hIu{v&rgH)9|7Y-~-B3=73;jgF;=Lk*5VtW^Z6wF@bwER-;E;YOoG1u)wo8!+~l%!JR z1Omkw;S(XNMzh@AS+hYW{ImHPPo_GnDomtJ$CwQU{&nR zgmv4TNX09=ZNj)~t<9o#RP9l>g37IsVC2{C6MC>;R5tDf=OQm;i5MBTQ^xCgq4Q>el>HVAZ zu6i1iEgnd_O48_8fC64G)b0~OIy-rwC!r66cwNky1wiV8&_!()P|%<@^r_*GqYJG2 zGs}DEC}y^oiR}6s=Z+eM;rfyj?0wq@IFa3>UZK>UOymd^`fp1XSg&UP34VM^R^|*6 zv1g69JNbggJbbL`nY;>*G&jy4bRJ)St(-+djzcWK>?MqH=&{gX#DcxOtJfVg9pQ}) zG*PvW12yr%W;5#AbRv^|2>>Ez9AGHv0H*{cyVj(ig%l&abr4Pt{E z#o-V$M^$08U(rU$jBTc*a{+(t&x$iP($zn~RH zHBD5W<8%%$a8VRo=>_}A3TDjdExER7^+%#d^ctJ=(4nQ=e?}emI)?S?EY-gWJUJP1 zMR}>ZS1E{P+O7t+;KyrMsja1=Q|*`kLc6Y7tHyV{z12-os_immdvJW`?p7+TQibcV z$o~CRVUYcJ|8%=pzWsj$3mZR`y$KkF!EZ3u8 z3Fw^ZmxrF34bF{dnq8JZDtBZ_S;EmlE5%M*4PeDii}HyD^;~rgQs0a+Rn>aQ;E>Q( z+lvF9bBzwNjagTY;;W7{%GpL06WOxooi3xQ+cTTk<%rz153nu@?(@xY#qC{PzF!L zRD^M3N}{fff(KT~je%Veb3ZnagTC5Z+UD1Ko41G%mX+JhD6)kjECDxmohG$Ul-lFe zybMVGzW8CwNi{3r_C z!tzItaBFL7-d|(QNGKg5wOiMzo>Co(7r2Swii?20*i@|Y=q}E)`r`bPKYep;MCFaHmnEkV~=7}on zO2aVw=WER`sIO}{>d}9r*35ZRO4n)4f1+BZ0vR}NA(U<=BDzhKLT-ph7C%LMnvU1K zHDc*;Kj+Z*Tq=1gHtg=t^oo<1iOtO%;EmgY?%d{L!4E5G?s?K8eVZzo9{WaH_uh!O zbz&sMB~QxYjy@i;r8@Zm-O?c%h$>ng|BPNR5M1>mP=Zsk&S5X2ulY3)fPuf zod|r%jskg4W`P3s&D!_8R5JU&e$O7W{~NBjZ}xvnQ)kM}{@dMi17`mcqt5JKsx=ov zw$1*eYY#E|muoE@G}L;kjA@S3g_%~aGQ~y<;pLLVZTjwm*&u)r0Gzf}!82RrbVa%G zv=Dn5r9P_I#*WuBchSz%Vw4r&YOSD)2P|C_QP<0$jorDR;0jJF&Z&%~ulQ(XwET+f zF`}BtuGQHB;fKxmk@`GQ7H-_WV~MkEz&SWq%dotF!vDeyJ+u*m`)^E`f3?;A!g*>vcp% z##)^~<_@Yu+xf8pA@-Fx2QYVS=5;EsQ4TZl8l*(4!x_{gP46_)o^fJT8&{4;Iml?0 z6w<5{__b;&7&j&V)h@|z8k*l2Iy324YXLxnwm)$O@)y8@iVA$9T;0Dw zYq^H0sr5TYR?EM%P*CnnmZ^7Bo>3|v6>8xCNFqCm)OTKjjD*25v{uX?`YNh=YRq04q zz?f@%o!Ego!aup$kZZwz(k2U&u6@KkIppk=`@rqqMY-LOJlmT02*v;$Tl9@@iIcKK z#c?KC)dLDa`){-lM1bR;vQr~gUzCZ4<+7pNXx)KY?$6}drdwLT*wVZFBpI+V;aJP= zY>Q;bE}&^fA&W-Pk$wHIRae5Lm{C-!EoK`obh#A#Gi6d>RZv)1%dCTFK-KdU|E^t~ z3nRx7VWmZIkU+iv{FMOpq4FU6ngj46U>wsZuIm6l;zl)p7aOPX_f|299A1|Em7v6k z>;sX;>RXdVutxbV&aQ+qlxFYaZ%|#45n1JurDLQ+qaCp2`DJeRXAEY}Xpe7K?8yG- z<%mYT>@i$7+`y|s9V4r@+fQA@Oi5WBT{RiAl9HJezn5+P`Jz9fXl@NMKSly$?x!aa z7!w6N&(3VoMKyImFdOhy&W+%(Y4gosNf!JqkP$*H(x zm^<)3W;NDyK2Z^>l_;(7nK{j^7&Ib`Vv2DNe=Cg1{5=!TW#i#WtwpX;qy>NGD2k&r zmHE_t$;-&aEduqz%Tgf+ zD=5{;2Qt4TKH-aY?z+A1T_M}-|HkMj?kg^6e1{r2w;r0-S0P|TfXR)9MAkjq0Eqjg z98r9i{0GF708Jsbp!x^Y%i==ZCShjClXw|&*Kz8(8`c{a`Ta-S*c3F4fdg7O9ZuPb z2d-!qWdRL1YQ3J*fXnP9G;anywmvw#3=UO(ENl7F(Dd1Kw)7U=dNpBv5N|(%+I#*S zlCXg5Sin(T-$&^!Q%Y|Pwe$>TD+=xVy-~b|N}pvLld+FQL7yFCzy9O^5bQo)>DX0h zAEYL#;{^LPH`QKytl%Y*2#!Zun59=7 z;)w4gOi7>nwFUWQqA&bZfml%pospjgb z6LYU(1LVq|aet%j{o5#2$H{zSIZhmPou&Ov z9F-E65f*Xd#)QQkW;>)bqzUN5yqv%qs*!o2EPfb6#hUBod-;hhB;Ig2YLfiEdu&7( z_|9QE1nVi-15Be>?nR=e-SHr}zA5{H%)>%EMRQ1fAqJCOINUvN8TJEs;v|qg<-2UN;BT8jIR3<&Xcakn zigBeh@Bj_S^;zj9dB$0K-TMj_I`LiCO663c)Kbnu>v>_SEq_w6NLNVoGLdO|`h=O% zR`MS-Je-E5$+v#aj!2#S8M-$YeRle$zwDm#a3K>OqRhjWWxGl|%CQ)I_eX$st&so` ztK|MoY{VbCEw1D})60N!>;Hv)%>u1wfw(h8LXX;vM19R9j7)+)HD$@ZftU9yI!V&& zY?%NNO;xhai z=7(7X9IZuA@R$xa?1r0LTX|0wg$^bs_J$V{#&17LaTOMbcxyi-bweG-iL|p?-i7Wj zy+v(#d>B{o28GP$PKllN#(6;3dR1JIm;#lL{QFJvaGCABwN4aFZpQYULj2*^mg_wj-DF_Dn* zIAw9jPq2@WAp>}Ruz-D&B)K$RHWqd=q3>>-k_2{Q+c75d;ukwvywtw_XUb64hXWGK z!wQ|6S&Cgws&aN%=$&rmHC3z27c0!=Wd+HTt#EL9kZX&K!1R;kF>?B3c@$3fgnv#j zqkZudjwI2TYyNcG;JhT1)(KQ$sm*2Oc>PeG6D0VKlRtmiC^9KAj@=+A-ZLdgt$rBL zV%n>z;S5IlzBc*dZbdoRaA4q@Th9x~=f@@Fwp*?FtJF+b5kD%M)*R!5C=_3^B$0~y zxkBc!3I`%7FR9L6$PozL`r{+ga_axd!@RS=ueJ2@whrq9ndZatFgFm?l*sSbn?7sf zd&N6VHTX2!tSA1;S5oUV3ohos#nX;QsHujK%fYl&l6HDi%|G*xrO}QjJEp1TAEd!E zWe{3)LrRU-`mu~zY4ThjnNl;sf(D?t%!m{{rQniz4xDr;6r}g_+x$z`v(lX2^djvh zefFj6g@jD>KEe89w%(VVAcXoKWKJ6-(|_wO!sej6HZe~PP<=JxXL$?)Ut zOy^5@+Q8lP34ps0n=7IH5%Xrj;@8=^kxn@%sbs9eL<)!7Mt{|NjiJfOQ3$#3g&&`+ z-QR{{ZP}O%oEYV}eQuR^WufkLYL8b*&NKFngjoW<^Y60;Ylur?#O;(f_c` zg$tO23>j%FE9hZd&i(lQX+dMwwBg1~gw6}J^<8!|US_E=n(9OOdA%tNdsje4%n|LRs_0;s2o{|~xn_+^EUK9p(GqExe zpyjAj<4Vl3pE^RTbz)~)%Sh$lBt7)u(gk`Qc07KG%UOB__Tmrq(C!ArtgZGrc+PSx zzdDgF=sDJ|V&^$q!q;h4elj-9P$n^y2ut3^&&F!JXT5`r1&LURB8h<)o8{YC%<(YN!TEHobLFHhmT|4D#m)Ij~fRn>KEJqU4v~kWNTt zmJFnspYY{UIVj6uKo$$W7^Wt_%BEhA(T0R zo;vKRR(HH=pA$$7dEdpml&&7gTtkBBYSjsZMA2mUN6M6Ly|pUWT_W^qLW{Ca6VIi$ zc;BZqx1H&4D|CkrlW$lyP8m9_50>3+j2Cxq+tX+(imwKdhKyV8r-xp$>s zQ3eGdwm4B2nWpruJqd3+np1c**53KUxDd}%#)Y`ZfL9cALrOytOy0YJ8&Ddw2zU9J z?Nei+Z4IwW58P@q*u9cP_!UOXT7O?6i@(MGCX)k^Cf8OFHoZ$yR+1tNMzg}@{3vPP zE^~jL5(x+78PTc4cS8s=QsK~FZQ_^e`O#}8UFAgn*%;y1o2-{QV|E!S(e&5zQg?TU zSKd9JUk>YuHSaL|sk{3lYf7_)(bUcT(N)lh+HU)z`GTNY%W0V2l_|WXCt2FJ*%K~= zl+?t!4R5UIi1mzncDR*>+ago8Z~-6m*tnLkuL%EF+i#+Pq^ivkj=hez0k`rcyo-$f zPSG0!#f7;2u2T0Plu;oi-D!%vqUx_mFPo-*Mq_VOO9b|F{qwnd&&vU;Y}IMd|M z6!|kw{%GdGaI!fT>fyx0{Tr~$TD!TK&w4&vi0vYq&u`jnUQ3&v)Vz&T+8Hve%(x`N z&%)G97mt{6`gD(1Ow7|g1w77}?(y-MI^8pj$4J!viJ5YiCdNd&?WyWK?dcV}%TEI|9 zmsx4+-Y#A`EHWZj4)#a63E3j*lp2M+pFlx-(QNwgih1cIyYY_$FusbnPEQ&A+p~G) z=h#GF#LOCwTCt7XxG|?wCQEn^3i*oiN^plOGiq(_dKR*VMz&}n>ye7>R{`2B7G>A+ ze;dC|HKje&o}8(i?&0PhqlPvH8f6l_lfJY;nUE9EhBTTa>_~p&cpn^^Eioi!9Gzpc z*u9QAfic%J#xA?_4_N5#LmSL~zY}d@{Pi7Mi7WAUTk z^;czVa<9CSF#3F5wICTEEll**?T=bGoWIfTm9hopel~w5=Tl|ZnOmQFS9t<(Th8{- z0cN@=%ut%r(Bi?-v??R(jxcd<7YC^0ULpF*HHlHFM=g|d$s3w(?iHf198TeO9XwLB z{HpC={NXtjNI{QLZG+Q+@%_swrmig8k&zyO^$ zqmr|x+2)W;4ni)yEDIN{+W5ANqxSyA)ZBe-4@MuUz58bebZKE9D)q-vx>D{He>0A{ z)f>c780xHM(e?o`q}1MLq-w!#xy4(E%Z-cZ?K!DioXvwZ&#=&y$ya1kPR6Ip-fBUQ z>s1Yw=Zm{#UsuW@B;j#y?Ve@f`yRIMrq^c2mc;S^3CH{oI@A!1-x{QIC#5gjPUBNX=z+ds_S^I$afqO%@pY9k zm=R3&9`yJdbUW`-VL2IH4X06z=1XNN!jwuRIhlH{&3!a)aFc%jkhci(m|pNLfw}p5 zuv?oQohiaap9N{Yt$T015KygSD&06d_6a~$s2kp zGhJRd4mHT539WLln^sPJKD0e!bNx)$(um;h>|p8Q;6D0RfGulRcCavN-<`Eo!<>5U zEAOm{M7i!SNH1y8(DR|>LQY-g$*f;*MeL>0x$TdT@^I-Ttc}qAo4XI?t2|tK-Z}Mo z!`mM&J=td;E=4rdpkFMV^CAQ?FP3J?((j@67fT2KOo*;!qj4QCmP(jargVBiD-XdT zS08GMm%JH~oCulnC{}hbpa#lj1b;kUc_ago`ZnDU2G4|g#jO%@5Fwca@qNu%+2-en zX_ZK<%O#XN zi4y6D1kViSRLKc2y`W%ohP4ta5m|FdT{N4vB*+X%s;8?1DMQI;5TEU)`g1y7Zrywh z1?l{h>mxYGZgYODJms3UT*?V^24T)1%qh>f&NffTwci((^|;n^S0(Bqc1iy%-~=YS zijE_xtr#plI-4nR15kTsGj3#3z;rxCCu(M?2IO$y3tq!06+a7Q1@48JMdxsSbfYq*c8U|`-Dro7Ghve)<> zA`iq6u3%NvzKg4ZuSyT;3#sWKbQI|$XHJto(q#JxCwh>*~8t5J+!ETfUEL@TeOrSKeEC3Y@5v2U*R0P?lW93lvTV8%*=V$ zOcnO^Cv$nNkbz5U&t>iXCC>D|&W!L>EiJ`HPCg^gD^B{d|4h3Vwzqqxc?Q90B{gYq zX;0emHh{EyrnI}BnoDCNvZZz9odhmC^6r6ybN51#zfzBCHnVy_=%^ z3C1Z(>qU-|>yn$AqXUx-5{XO&f4RhEuT1jJa8ry7|C}PsW<`;;EGFVM3Z#WBihadMc<<6G@*%9Cr9!R$EBeotc-F83YUyhWaM%%mxqW*P`Oj0;@m0Oahbm5n`*IB43^Bz5@JIp_Pk)c$uG~nxhrNe zFAC(vB}!%~SaTD_Ek)cs;x?3GWr}-~xI5x*3dW@vTwBGpE%0FOaz}Dt7gm6~P6}ym za&Dwi53fIWO4sB@axwMb2I4W_a2x3c^3^p*bZR8sK)6MB z1=<@Z#xxMZ$M!6KV*6yrwFxC!$ygeQr*pZ-N&`W-UM3qakL4r<{-~R$#xzeyd+YXT z4TTn&_Mt7LS=yV)w9lqa?UQHo6Z*CZeIa;W9HgHXCykKnh+C7m?H0F2%B5RKnr|`< znP*C78YmXWq#tXar(_x<-^D#lCG|mXIh!2Jjdku@Dx<(TiO!t{NpWs5h=(I!+H0tD zjX~0!B^v4GTy7jPop}cFIkOE?;GA!enNGez3Y~0&%yTjflJ1N)NR@MvK^8k6jRb{e zPA`M65o_^_i4&H`3BUtgi=;1k?2c!A*W7`#gGMuW@QS!avEYX#q6@Ku68 zWbieDuQT{zD@DhVJ2tL!`+Xc@vc%$H%245%mScC5t ze5k>j1n*~XNAN_0w+bF*@HWBQmgu^Rn9KRp;IV=?89Y(&Hw>O4_;!PP1b^D#Lj_-N z@HD~iHF&z9Ix8 zLLK?#rVudC1oWDy9$dy7myyP0C@$&7rN41O3q-;QHzq~kK!xO}@vNN`RjF2@>| zzZw@GE{VqFkH%#lF2@;{&Bmn)mtMx@VdJtGmpJ3{OYNcuARK>KtLb!|ag>n=$5!JQ zFpe@L;rO9(EEGpecXLKSsGlH*xMb5j&@X$H%USgA9qZ&saHjM+3JOp1c_;Qdm9>gj zVnYpV%IP;^KO=ge`>G`8EQvUX3|n5{;@L~>6Qhp#29qHk7MD3t-|JlCuj|$IjOPRA zb0VFjX887PLRhQM}*Rth*3AxLbf7j+-^fHrS6so`?&j+5%eJXT7 z|E|u9e9c$aO2yC|G3NQ)m7D!&FYxtc;kP@qnU%22a#p-|4^K>c4G=%t||zKUEZS#8wZICg?@^U1vna1%??N8@L5Nw^NtE0NBCr zHvX*awGNIiIRL$xtM*WJ4KvXQ|7o;`FM|{=LY)BJlxavH50w6y9hVpw2TJeCj!OxQ zkO`%z^>{_*CE@we9pU(Wb=%?nxlCcv2}M)3n_xUTJGT4WFS52ZxwmuHq3t7u4j3lu zXalM10K;xn1df{_=j_gf=O%@D?t?=ZZC58odqJ12&WY_{xP@pbX$`@4mfbeB#0zP{ zT=Ua;ZIwi$5_0awNxfS}jaBlImtGka+SQ_*bI-z7r*)MQ##f)Piz!_wxu*!sS4U4{ zi`Dqb*}sH*v93-y*MRd3C;;d@f(hfqB{bx{2^`o7pA{4pXPp+PX*|6y%H0ab><#X! z`-IEvFHjy3{~Y;~FMnp%eG=)PTK7qme?;9UUHr#{Uh<#fcyAU-|1ku1UcHHfx7_O* z@&c0`POCi&Xckc-PR|>sKLA>mVt>%s?-6^2b1zDO&DO3tq9amhUodk^ z$V$Y?6%BZD>~%jy&F5T1oVPwd(s>NQb{TlC)Iu5&ChdxQT~`b z#Ee5*hUEpNnw;&!=Bv9;aNb~w4fM7KGv0Tv?20vewJv4z z4>AKs1UWB!3ihCfHDRu#-^kl07MgE}K3Z8nDa9Gbh9kR2NRvXzmm}MRLoa<)gNp>P zBNSbaMnzt8Ki-@Q(`U{^ZmZ=sBH0M*(G|Ua!7rTw^ocdF(DB3%B@ZFZykHadZrYwK zd9cNuvBiB2a!T;F+|>Pf^_8)-Wvu&}pW!B&F>^D-uQfO0g_`O5T|GV^KKJ-WUt}X{ z9jcQgOf+Q|kyk_DSS|aiKc8v9o7K7E*UT=T$j8p~Z3;zly0cAhk=>X@s;i?{JtCQ) zPivXBO&~f=_U#Vw=`ebV zt!&$aKEcxv&p#KZtJ^J<+|}kPhi!RwsYUPp%LiM_o~E{MS2M&EAkVE{NulNLC%13B zLDq3{HPy*nt1Ewc|EynYD!NzxQPSuA7q$pP$yy8_Se!VC=@LKj zxI*_;To#SjAsTcDB$&~k-z$mi7H5eu!}zai_kUCSZwULJX8e8a{?BUv+rs|6K~O|O z!jI!2?J|f0xlHg-a#c9o7hZg69|E#o zFyUhH3ATokAHyyT$GN35C8N_qZwf%XjEvK(U!stUA?aGo$rZV8NW~j^gCH?`IWx`a zNN!Cew`7v$m-k3+JN;ur$(KkjggHr`-_(NF0R-4>1N00fkFx<{IhSU_1QQ;>JCuC9 z^-1IyHexm|z3U+GSA!g)_Q{=`m`#@8Rk z1xe0|>pP}=iQwTW9|v}lc=t{=4|p%}OPT0(Da%=%)bdI$GeP&03I$Qj1@&2UI~#14 zK#3B_86l|-f{|M8XFm8lzH?^05Y>x~avh#x=s&LoJOn_4?u$&yC|M8jD`%1L69Jq*TBap?^zD57`jVl0QgeVH z`n%2XUr*h)5mzVFeH$4#CK&CxnF~z*{|dJ>)7nk$``mT&_4E= z!$tb`g%Bl9j&NN^FN&xlJ5F3xq7Cj8>389Er5(#`nc%*Rs? z=AVw^bAsLx?7U0!M`v2t<8|Y)f3PWvB|gZZ@C!_ zJU5!qDf51G? zC7{jkWv$I`c264MWoKxz*>-vM0C&wKXHTa`Ds$SVtewF(WP z-ntUJMDbu@3%A~1bbgVdcLc`f(tN3#b0e8)^U}i&zaxDup*K?v0eQw|p@#FYu zKf6;7hlniS3H7!CZju0O0H^D}X^KH{7V9S7JLV79j`3DwUXxwaXrT;?Dv|bwk{>)% zHUQX3aj!U6k{}+R=90l4q2AA#&H2#4E5|a~Z=(W2#GK%kP;w9ANhI0cL&tdP50NmA zyd*i(eLZ@s6+6Ota0QKTX436xdP$R;t%V7iI}S?N)Q$I6n6^mTY#vKGGhOcMnNBF~ z4rlWo-xY9;=i*us)x~Rdqp)F^|1-h*|#>-`( z&{mdw{9n~Y(B21EiLWt zrXSE=d#sIsjaGQSm zQ;sNzv3p=_CfyIotG9OU(bAi%Qt68T>BrNdF~>~h5!l;PQIxZ*4gI#^HZh(1m2_!m zF18uXbfObpn%i{m;#Yn3w<^8u)g`>rq%$+n-Va5S(#sT*=kq|_45vNdA-a&&i&d#d)K00uYlT;@k zkgm8nCxD`ta>KWTPF}8)Yk5&d7$0LW%T|hzqvv{|M9O%` z9ob6?7+kB$npRVm%e(oK?}Jf`z$8}EJ_TGdJF?FhSLf#)0SAfG zQSZneat}=FzDjh?Z;#%5r?e>wuT}yx#!bJQ8eJua_)!vX?top0ldTbFo#YOfx%De* ztWNc`-vN_bzo|I=et@(aE0IfK1LhuFaH|?C{3R<$m?zo!mhEg5SG@+Xm!h>|tD8xS zI`(unwtF}eKyBU3GPCpDu<7?TBUZ7LjBr1(sU=oE z(~A&*$l122u8}PftbesI*vzkfT+dLKMZ!p|HGfpk(6{u_AJH>3stA_dvrGL{#dXb&S-hn}IZ zN&?X{^ap$n(KGbK^|9+XbJU?{2u=0zC^l)}RQ?3_6Dztl;OpJwL}k+|%-Gsu-7Dm~ zf+C3Gp}|s=f4t(MnB2N;|5e39s!r&L zepH9C^hk<_1~8;|Ry?%rM->lkyhbN?M8!kxF}32M^Emy|N%7Fr^kf>J@617phbI1C zQ#`bueg!@Mk&1`TmgaV9kcDZ2@pb33h&~i9s{NM~4{7#k86m0aR5}z7O*D#!0PTv0 zz)?Ij@&6sgL+}5b@$#sOhd9@n@JcO%ra1xtE3<%}x?QLox7L>G}PR3w7C zS-z0yA`*905m|Rs5seV{5)|nPEO)OsP9Um?juD6|qV57wMbt$gs)*#CfoRPsJXjUc z$$U(Yq>5Co=}EiYQ$?>W;38D8)ql5miKc5h{>EZ1ZOZiE7?s5Lfftfj9B_nT zGn3A&e(V}db#5~4YZmmkUO(7 zS-db~+;i*~)hswj7tt1+j>)S$bRp%MCJwG<@JR0!OPBMmtNFxO2qSZDmKa7&PkqmaFWA+JV_oZcuGi1 zl94vaQDWJ9pD87;Fzj@iu>ixRd<$#Pk@q%vYcn@;*gJc3L@K>n(m`lCSiXH8l;*wa z-5|nO=QX6+tZEtMH^`0SW(jyYlDVtTl2h`7dE{X+dIjC02cCy2V%$%#ENwuwLrZrq zp;5FyIqx9r4sK`f$NvnH+|Uad#9q41{p41*+=|bWBP0h_pBGD;pFlcgt4FmY`-&&x z+;Bj@aIu&#Q%u?FG+$i|s)F=w@IO&J=b8RebGGm>Dybh_uF$8xxe%^(Xay67 z%%cLZ!;3E8=?Q78^i3h|+gd#jRcK;b%mLj(&vg6d7$RDu3tCRKvaajNW|O~rHp&o& z$i_z$Vz7a-k%#VJ*~*xwZ!n3(RSui;f;!VE#P_?L{!>J(ba7M8>BYSQ$IE&BF779& zNMv?;X`5EI+iDeF={=&B-?^V~^GRuPnxL>O<8B4|xT%>PTrD?HymjBYu1@o2e7Q7L z)PGO`Zi)Q7flZ~SWUymk4$hv*#&;!J+b&W1J1&%iDbLK5EVa(cIteBw+b_I;-7J zTAkJICq-xV&!Ju2KU8OR7N<5S)al4>J1MR1PrjnRpS%OfqP4o$#Lu*f&K9*F`^30?_iL#z@`qXk0$()ibyN zeyL(RN2VlNceU*D$Q}L)Ot$mxx$xqe`FcXiie`hHOc~}Z!@LuMIoX1Z4lBph;?2EZS9T zr54E4;PkML=`@|9MDA8|4Emnq>5T`uiqi>7Jh|1CFVyPr!(L#0dyv*qQ<{@qX+ zDMFv)-!!X}U|aKS8HDz2(K@FibGm)V>)AfEPV8~PADJN+2iQL)=9c1;hgWW5E4jg{8*ZlGwhF4Eepe=9Kq z*6Upfx7b)#enaB*-ru+QAgQUjP_>d|bme7c86Voop_D{Xcij-dx)pWTo6&zr>o)(E z>3vw2^`}Ocwb5e@^{Sqgs^!#|i(=a)OUvpSCiAha7(7e#S_^qEX}K({*m}>B$vSj) zw~u)r#As{Pba%S44Am5Muc(D2%+)h<>Mtb84@KY`t9`K+Yjn$+5}$J9kp(qbR@j98vjoq&L!PzkWTBWY|1i zDQO6k&?2GDv`F^KkKuoYaC&Li?DSOkibxsHLmWulmc1&q`5U@JAgL@nqd9Q4S9kK} zTWQ0LHt%!yKq&WlZIT-5-mgBfL;dvyY;`eai(tXMVjjU+lAtkJq$DjUr$lVemC1yx z1tN*EJr!}(4@M7mLn!$J+0BxE!qAx(%;%2pPOzakG2h`B$?L-B9?^ll-|E2T31p+- zx(kVhlGo`3rmtbx2sP>+plcA;g8k?D66ng#f%LePnVz9lVSmabmO0|f&U#Mr!b~zQ zMVqluM#bh&zGEcVyT#>qZ%Bm*!ke?2zcY>z{+{|;op!8W`~fA+Yw1eW^R%-xC-=*_ zo0yZjFFSP~$%M6F2e(r>^p80A?GuXSY-kro&FUnKdKXV3#rpg5H!6^<18o$hwXx?B zKpuqV3m3Y&2xW&TtCm5?3_N-4mzsfyxjFAyeD$@ip}xd@^$?L%ES7@@h59Ilvxh}@ zZsZTrpY|?$N*B9jxCY!Gm(OU+@$CiG*`tKgYOOj&iow|!0+G|31%WRpF$v=hOxJZQlb~?+H(B` zb#3$fSsN=z72O>v8)t&lwJmb5Od?gnA0lu0({UD*1D?RywRdMZW-i^06 zsO3t&W;yI((i>)VTz5*(ikKdf2z5Kqc1`z~sdr%+jE&N3(hV!Uu9aXkm>2b-XVtYG z?;pKU`V@ms?d>YdpcHm_i+<6Dyd1X%fjP*iLvz>VGjFlsK|6%rOIb(f@?#;JY z7|+c}_+=f!klF0nBbfLtIGfj^wUqs9(Oil|>KnveXU2pA8Fk}Mz5pdPfgx1j7!*%+ zvmcg$;{m5B7Lmrd!@!uBF80oBqo5k4J3 z#^604ftQFbIe#bz4^jT~-g3sIu*UJRAL}n{-O@4fDloSGyspk2*T`iCZ9kU9@|Z;X zmizB}@zm4qzONnsT_}4@ym|J$ayegdUhz9882>S0`y{d-Loiw7wV%6$^D{+Q;WM&5 zedk2i_Uo(Wnd3D#Uosw{9~+)K{hAdzUfa96-0r&iL59@+RsL+SV+$2%eI! zQvIau&b@Lsm7y|C7ECq1;y;mV1F^V3(pVRLCzyxxMvdIkH-y<#bL`ek5vHbX&FmUi zR~S#XXqc%}XnAwfU!!G;#9Jg*!Hv~y!}*qmtw>E>NCq!rV#Wk5n%w z^BlzBImqT@(?DxI%B#;w4j4%DY$G3zIRSYA@L>Vz2vD7sjKU;o6E;qW1CX zP<`&X#qv5HEArq6@_aqFGtels-C0cEldBP&r_@5wLiFB1=SC4a&yu0&ZNG>5^rPZK zwc3uY!9Su_#wzDIi`usIPTj3Fi`DxMxP6xGb796J9KACG4h=`Sbq_wTv zGfjNj6FZ+9ulqD@%xA&xxQ-Nj7gpmL=IIc?N{aq+A*V&Yqp9+O15qDqROLQ34hOk7 z)R-Zx=IFJ`OA;uf$w)}bPM;Uy3!burRd;rfXMAtj=F2!`E4D!87?1%n&vKI(m4ozoGm(iC)t27g~)>K8J#U5R{0R3Wn^ z&xeKk6%7Gr%xAvUBdIh}vs3cPkbJ^VuSE~X4%_ES8rjb8e?^L`qkTp6+{@NUe_pc0 z`Nb~<@mD#Mskotm-qLC3`;Pl!oDpQ1;E&>C`o3g+e7!H$`9(k{y17hpZt&CNheC%f z+PXL3(Hg0pfC=;;Hqc!r&@aUr{9JnH^}b-2{M1i~vr|r&Tv89nO|O0L z^W9it8wYajSnv(n;4_lIEwxGDNSMrU@ zUp=CQ^Y|Pm{hk;+X%(^W{rZU!8Qa{~`{`{wlh=_;UPgnvPWEgK-!P2bFNBqavrl?v z@y@)}gSSJz?Xe_FQ;#FZ?93p_pCD=_SSo1Fk6rM9${ZE;4=|t;)@_2*a zvR&%Pe_#Ntlq_zZ&N~CgZ~^U0Wy=sKS0;+Es`56mzjdw~VGMXtQ;FCj9;(fQ7l3d-l z|X3DSMkk~HM><_WEOkZ*_gd%YQUE5?T zY2IqV;dd-2s8J~SeuD1X?d!{3$oIL~=tJ%k7~;G&UFsznIbVS4+ezmVQnq~&wCW=j zBrdPPzUrLRp7=iao!No_J=e@D=HO%hXBNs>p`Vk?wa-a%3E}1O*JZoXISo0>6&umu zUH)M$xn;YbZS?N?4(&#n+^Cuf#MLj_j!-AzA1V+%ogRT`==6=R&2z=pGS_?=?S?9S zId+xqYDqi9{Tl5a(UL+aSM0Ku#IQewz$LvFrN@C7trwWb2lu_zw_%8CP$wx`+tDK=*_z4g8b$IWizMpmTCd7xbSna!_{b8bg|Z%-vX`4C7JS~p_CZH4U7 zpqOFHP$u~=$Hz z<=gxGHE4icMbYg^>T^;&I=AL@CSQA>=RHB^Qtdm4+P5@~3GIE}sC%<099FMam968ZSC?n&aZ;4?s zdf7B8>gB3gZy9p*RkQ2gmEww$)=#CkaIS(u+|$zU85)K!!L-37O4c~C)N}Ukl^@T_Se?$CcdYMZ^h?uo`4|0pPTH+}oJ_htw)k6}&}hk0e_}@X>d!}` zJ9EeF&fpwPB%Tb|){yy^mXCr+?InjJQBvQMV zO)kxO`_w~{Gd|F5S1{JO^A|_(-KYo3M=n2-SG?qQ>k++ltfig2Af+fWw3XBMo}F2p z{M)_io~b2S7DZ+vmwu!$dUxOHecBE=JClz&+ zvb}i0{7h$^O{|@}q}E1sv8nP1ag5h}oxF6V+tV~l^lLl$OH2Oi_s^ujZjUgyQXgB` zW?`3s#@%D#XbUG;ILpGt7T#jvgBCVe_>P5NS=dE(=lLCD;RzO=WnqDZ-^tra{2U8+ zTllPn587}~Sopk!Z&~=2g;B@b{46}#!U-0ZSh(22>n*&`!lx|UZegp1YOqN+(ZUlf z9Bbit3(vK1riCRIF0^okg*RKc*20G@eBQ!WEo`#zYYWv7Q;r@MdMq4m;Uo*ESUAVR z1s2v?_zMdkv+yMgn=Jg!!Z=HRkA-Jg=(BL9g=H2lv~ZP$Yb|`p!Y(J8^6SRt&o#E) zDlELg!m$6*VBSDcYOhr6L<847WZ+}h8hB{Dr7gyN*q|f(cMhM@{hnE3muW;k#?!;4 zJY7t=o3dOw-`Z>gi&e4W!=k3EX=;KRuF}Ef7q*X5r>Z=aV;r^nxhhv>sq<8}cJ(Qr zIz!Fp-x;JMDVbl1GXI7t4`nd_JlaiMme_w%zI-)OyN}dv61xC5`FSlAJX@7g(o*u7 z!{2Ig(!X<6rCN9d_wxwt$1fauDq*T{IWz^Y3aGi58vNup3A}=mgnwdRK& zoG|8>uZpl2t9jNwfv|IM3267u=@gMphpVZNQl|V0dP;dw!>7wBb(eC5%VQv$?NFph zm(G;K*o7J9yBFLp^!>LKY!xg|a`9p4%A=bus2&QK-%hI#V&c?4O) zk5I(RA6Zf|(pU;$8?RvIf^)HYLP!sU4jR{3DxBmgD&#|)iv!l=v7*>ptO_2w1BbYS1!<@rUoo5@=H1r zU*agjDZ(iHB@5+>h>VKv5)<1su3LOUcXwh^kDk4fkLjJ#=h(je`X4vIGjP!HgNK}O z;?R>$P8~LU#K^Q!qsNRr<wq=%G7Cy zhG$-I;YG79zGQY`(VXIv(z3bp$}hdFV*Y~4s>`cu{DFmw7B9Kt%B5Fby-a0QR_81( z_ZL)G7MDuv&WD$ZY5Quppj3^3lPYxIk{+}G&M7BEDI5cFkxTer(F8j#H0AixN;u6=hdM)=Mqj~3gcgz8pA(v8BRK0N@d0o8BaWzO8&|S zBIV52Ip%>$txB|8nJ)Q!9d;fyssStFuf&k?OvW1-8>JtXQ|r0d7U=$4uE(~{X^DS1 zd6wf}!QU%vIO#ocx_6oMC0q&q#oAwbtmNq-HyKwv_$=V>63QsKieDA~Bt;XW9G?ZW zhX=|?ElsNPag~wMqeEUs`AymV^lGWSv|iiworJB7^cG;3I!l?vML0p|DK$ErQVVn$g@epDKLG_J;>s6EQZ=bp08MShRnj#+^9dO)eVDH# zFZqS@8`YlQk@-tfJGk8?k1*Y{NM{;$X&-3=<6|f-G?Q|U_=oUExIW=}q_x*0T&6Jn zj#Pt^cDfsCgy}Jwc}TdwN$VHsUSjGcz3oV8c{C3SABW4-LEq8pwD$DE<@sstxrn@u zoa2$()X-rxqei&=KRrL`S<+|!EBT$$o?jI_YItBFX;qV^%sMKd+TlGZ+&4QY7B2tT z_Vj*w`DasdnJXn6e@zEWcsBC&uh!aoSbLha_q6uLA58cZYcI6+KGvRS?Z;aC zy8R|Rr*!o%&D#4}d(-#E|2S*E&DsZ8dn4OGE^v>v7h3y3Yp-fE{)?@>z}mwT=rn7; z!uls#yPT7hU#zvukreqk`%HTIy6?+;K*oeJ-A3o*ChcTKy)2c=KM!9>>8a8q&5SY+ zOjc^bC8iW{c1|hjkI?^ko0+zj)aUAuGUt%5kx4<)yG(PyBL1Ew(GJTchj?b*I*`=k z;DgSoozYIOp`;)qMg@IPenS@oDk?yc!FN$E#l~i27u6*qF)Ak~Ct7}|q>+{c^rRQe zjEPmJrKQa%Kwj?gXcmhtoL9(Csl`=``Na}~mnUOm0kQlO>%V?bz;oEYp^Ss(-{F3T zyZC6CAN#jL9scj&@XJ-lKbQJx|2n5|jq3Opfz0Qp{0qnT{EG(;Yk&Cy{x5TYYkB)W zqvrqb{|&dGz-wF`{~}yJ?O!%bH3!v=r9#wNs};eT3f zJ3=L@4%}caM%RvC?ec5tR;;}CXRB6U7regyh8x%1bo0O6^7DVc^|sr8amU&_@A~Ds zU)_Dry}!QiH}^mA;BO!L-GBUk{lkwu`q<-7Jh@@xQ-65+nP;DC*!2A7EiY`{w*AGI zUf%J_t2-Naz4rPWe|+;#yZ`*w+wZ*l-uq1-{N=+vAAS5+r}>kXPe1$oi`Fl{`rFsv z?A_P)?RVerN7eX$TR?Mk0nASl(EPLO|Ig0#VndzI=*tTi8&qlUkx-wAzB&Rm{$Yo|s-Rqn7y^le&U}RYdg+tzA`1EXA~L z-n@CSu`!FQsuopM9X6knotbknvVSv}@DqysMHQaX>gvjBPx%5*MNwcu@x0RNGdx2? zNf??$nFGsjLQ#1|X^F>Q>8Y$LUEnEQTv{CP7tN{A0&x7NFA$6PmqABQ(E?9V6#+|# zBT{jQG(xA-5w5zlsKirNT{)i^CYj?0$~wqP$$ZdgCXfq9Iu&I}lih&Xth7bG zb(Yebowi=nI%Q+hUsUd&Crw}DFRIqL|7Wu8)SkM&mY$rIId29A4*q;_)YXifk=}n>xoPhr`1UJQ31XR8%g~{7LLX*x@LA zaBzzrlFJeDDXN|ukOr^u3@u&A$WdPADV<;CUvkpl&u-6HXbh#jX1KyQ|(M38WFP z++*UZyEH{LMzFyDx`^)rQC)FSDsC(igz7F;u5K>XjncV##i?Fn-Ky8<#MbUj@r`i} zu~jjJT?$-XB2KCp0 zjZbMfrYgCx7nz2`jYSUe6((EexB`_XUW5RiK)pYHu;-++IFUQ!?O1+Nh^QnO@beG4wl9bC6uRJA5$}=rd zdB%2Ep6Y(B$2O%j9@EgP%GEDk^(%3!e$%?Eezak~DJiYTH1%ri(U4e`zh`g^n0(~dX9Tn?*#bQ`tNyNMRriMYs&1ACnwTHR&&3_;7}p)T{e)&> z`i$(Vj`KgRjw^Xg9XIw-b)0LxO0@Ch3}%w9V~mO$-BHK8y-IzHIW3&`fLN6{mUUTm z2OkOV$!PTV_$YRQQjcN6X(b8&jgCkQ^H0qrPFrK9*t|@6y0n)^+VYHZ*o(!?w_z>- zuf^1d^q_3yOWi=-tCIbgk{FdtnUY5*HRy3wOevM)J+UDEsm8QY8 zIQl((pMG!Jp7x=g`_RsIJZ?xz>Y|dUSJG(ta&+YJ{z@J{yOxvhp9_VckIsWJpSZoo zlHU}Y2W{>qen%b&A# z)TJ@1A^bh_NnJF5BvI}}<$kSOmHrOew(m{b_Z-u``p|f3?eW~i>#p37KvQw+9-+FA zj!SdJMM(Y9EZ<6SJw6@{9!dv!JjV5)i6bzncO1ORcbPGy_mrNkVJ-;Q{pY_`>iCD0 zdfV3B^ubQw+R=vd!r{C8j{b`IHcYGI_#WKct*L8cOha^4RAFR6M4F7b9rWQl3Qx+I z)#uc1YRK5jBZs)kA`kxBn{mg(#?6oMYtkQ>17X5Ee>9%^kT54c-NAEx(z>YuV@uQk z*M;gx`EF-$`LTSLY**@cm~g&*2F9u$)7*^9-Bpij{e>%RpW{fswR54q%!T^Wj~D~Y ze5N`g&6UEq$heupxS0Z77$d7p`R=29YmZpIMuZop-_T!(*Nb>E=P-SS9FAm9?OnFSC{H4V{Q+jZ5*@( zjy5UiarYYhbbqtsL^b?0EJ7XYT5aZ+(5TN4#$x|iczulO?MhSOd53f`S9}*0&-fBQ z#m+AW#H#`RBsHKU5#H#o26TKk?O1)#cdSX~Kz&Y2P$&5Js}oATS0{}9PMzTTTD5;| z8MB24*06o0%R3%AA16KA{4N;;-ineIPlwxGxUKmr9O7{JuXEytR{uIDZs_p;_jBR{ zT%C_a*1M2DW*NCo9xLG)Dm7|qsR-H%iv06tsH?GcmRce`Gm=bozsl0`DSN;Yq2yMb zR-n3?MSA$yWo-0}qH_O)%Ic{I2P#T!-1&rDP+HA0Jgag+O=U%CmcP0phef@g`wz-n zQ&T>7flXmrWk;6kW642^pM|6=oP|0z0@wV?l0Zf21O$NR7R{#`>Nk;-MY7jP;@Xi= zd1QW|!e2gqiNADO<&5%@(yVz!)#~TAM(yFeN?j&tPxY7hkb8-2F;?s%ugwubCsIYB zPp3+laMkKlm2D-2r8epml~qw$6Skd`Gv(ZzyfLFklvGr3*H8(yryzt_sH-p)(c27_ z*= z?nhKvF%>a{2&7d;WL{~}!qUUst4v+1X{l*Tsw9`|58)24dNnF6_v)bkU!tZjn5XGe zlC!v&W6tD4Ly)ynj|zQ`>Kzf8Ta#TnCop$zX>~z$X^k+z2~ku073Y^%`vXN4(-$C9 zDq;RBZh4iJmj$XOAXb(PsG10DQp6{#sEV`A!b|?r#eOwJ+)UJ*#i}JDcL4+_swltW z&?Sa0E-O2v8rtHDJL8%9YX6GaB(Ukq84rBTS z2O>1}3WNjI0>Qmme1Fc880Y2W3m#AX&!=Q1nxB#Gs|#HdDrzLjq6*GaUnDlNG`0)G zrklA|sM?7OU)DL9o;Pit$is7?+Dr*=SV84UuF_+?B_$9V>FjahVtS3?P}+NJ^bD9q zv!Gfkc^Dr&Ekw{@bf9dsaXt*-x)8V>bOD<_{C zO&KtCqa8=YVTSTX=2aGzvY<75QHNh>13yIpv=XzVxVT8 zBsM-!RtBpnb&F7|)2LL!Y4`b6Mb)M4v@MkoooIA^QFXb9Kxe2T<5O~8nIx&yWT}U( zmW(4xy<<3?{=zMC!x46bqxk>N{Avr$Il6F#!}f!A@e{+oM~5;;H#38yhw1Di;l=#x z_b&?kivs_33WWRI=)2z^etW7?uUzbTt?Ug^XkmWhFA6xq{Z01s1!sw>RF8^iIe!()YuGR2?;u4;ZIR3m^Z9;k`Ee z6NKM+_ny0tRUh5$+ux^D3jm1$~4;`c|n?SDTWd z(kGPFDO9?>hcMQ{Gz*7WIMl+y7J4j9u`toXSPR?sntKh7h3{C{XyFbEw_CWy!UhYU zws3=mk6F0h!iOxp-@Txa2J7Ot{zsfB(E!|7L8dx?d!EG)3lXJNX9LoM`J*w4a5 z3){Z2^|r7pAADCQIyYJO-4-@lxZT1A3pZG}-okYjuCcJz!g&@JSeR+yPzya4rdXJ0 zVXTG9!nUtXxmzuCENrrHw}p)sZntoQh3hO_V_~g@;q`dcMVO6%{?GkbHB@7K{auRVBI<37bF53f z1MJ_Ebu#WAVAozqufgU0%|)1W@WsHjm?m(6H?Xjt3BCrn7U9A=aR;XKW3L%p;2?~I z&jilKtm)xWg}`x~;k*Sr6ZmhK!Ia@K;Fp+w;9mnzInKDJ1OIICcYt3FKo-!4Fu?0Q zCVhe92b#L%0nziM(-b%rBW0KdeA2pa05)6Pe>`OyqEw@l4ftD38~9_uH!)E?U1~Sb zJ(P7ncp~sg%rNi`z&~Qv^(G9k%gIX3!aWwa03&s&0**{IWk>^lJPbM$#sOvyCoZ_a zuP|f#Q7_;Em~9L0^44|gNK>z2z!7OmeTsV;@D7a7Z7uMaQJnuf2ATt}#tiG_QnkQ+ zOvwwt+kkOnOc~;V=Z~d*ahLNM(@#}uso=mR$$^d6GmW~#RV?JNSW6FAH%3*mudj+#>9d*0YAXRgSP^| z#3X`$4V-kANiz@lF-Gd^0R3khx(O`tD%Fed0*@PyJGck99`kiymxe=f;9J~>0=rBk zJ~(>BR2oM3q|gVy<=TD$95cz3c`Wb&%)Nx)0DKoC;hTUzKZo|h{Wf5~JX1D-nHZ_B zz?yvciZFiQHyCkm1HN)D?L}Q0fnCot?(x7u7C#fX%;L4cM=|Mye+>8;M(EHA{AGc` z*8xXPq1|zx2NbQ9lGoF~KGTtv;oc888zbeP2fPC#Vb%f{%%qNlsRDkEX^`}RH3;Pd z_XEGR_8n>M}>u|FQH!G>wwplQWx;+f%lb}yzU2nGZ+5By$v|2+>SHA$|`tO$^Z;rPQKvR z10TT%Z65<>RGaW;0uyRDqfMAZ;6zLbxDR+cWkWm-T?HkG_)0X+OjKJZNh7fKH;fnHYk=wZ zW55f5y&r&I!P9^rVSL~Yu-k(uEeDSWo`ey4&H~=>5bcON`U};E7)gH*@blk6U+`97 z%zv2hvB0x1LbptyZ#{G;jKEhgx@^E-K5X!Hz$P&=Mgbpv#PH8!z%w4TJPBO;6m38{ z0qb$fpVWf zaDj3MKyZPpEH3u|j#2avoH0ftOfZ&V*iVarLj?PohAS4i%{o_oA&q)piF~ z0aJjhfB^k7;bQcqZ$FCr?xVOnM{pN8Y#Z*eH#6Qq zygjA@s`VE58TYU~<=^RJu^sk?yO@_j)Uf~1d+{IAVQ+j9dt!%u@mqu^?Qr;}_pn2w zu-*5*i&Iz~_M!NBFqs%`Gw}E5zY!xwsEHFNsu?q8sPgi16$k`Wtpu;F<$tZZ?Y7(0 zZ+`O|wQ=J{)zHwO{`99msRIWNC|SNrC>@ANqIYV65@J-ll}w07?o}UXnWf$ zJMSIz&<-6|{E7Fe_smcm(c^XaojYE=XWEXo{X1(L#14HzKTLnFZNK)G@X)t;ZCglt zYx+wPj`5c8TFLuvxj# zh2sd6bdF?};U210E=(jQ2IIyI2nnAjVmz3?$LC|mjzu3X8c3&3Raabbg)Uo|$JeY` zqaJ+lLG{>Uk7*u%^UXKaM<0FE&gWHfJYYRz==vvPgwwCAx-#@c*>h^yb6-4Hc3Gub zMiZ4i$AjO`wakVSE?f5bH?yArS$5Y)JpJ{3*;OxoG=2K?=gRWN{uVgf(zpR#%ryP;=+bRhM3RshU53zN)T9uPEckRaaf5eib-d{q~A+>d~t+RNdShb^T>o z>Xu5cx}!Q%{bBhT>UXud>KDuBs3&i$Qd@64M>XDanHu_RNDX^Fq(*HGsk66))G058 z)S0h_)T~!RD(elzWp9Pl%lKU8~luTc>{g>tE~kUB7<4di?Rn^;q`w(@(3{H?LRMd>K-Yqj2tp7hX^= zzWAbg<&{^|u3fv-8*jX!-g@gT_3pdxsxLm;tzQ2sq(1oI1I-uB&CTlTFFsKpej8G) zt*vU`zI~ckgsc%Gktr1*dw^+T*C3Z!5A)F3ySKupyy-YDG)i3*nyi+DE?2jOZc>kj z9#(IJc7?}N)rvg|Hxj%A4L2#;-5wQeBzT< zYdP_kB&pDKqg3e5$tv{w%T;L8O{Dp-3VpPzBR-Rlf+*s5A%0il#}S|Lrc#6OkzdBmSX{Kdq-f%x|l|54&UOZ;ubC(oPS zA^u0iZ*7l14DA%>kU}{r{EQTSO$u8`;R8}=O$w>6MupVZlS69nYax}s%2M4{8-`( z1(J#1m-qvTe**D`5&x{DkeWFvq%NNvLXJUNH-*%54~NuSyE@_@JT%NUzs`wIq zz1i9+@8qFF1`ir^!o>Cf-tm)ibF;H2Wu1MtH+%N*p(ma=Wbnj^$IrF_vUBm~e=bON z_UzP?B*4Up9_v3TKPzX_*(9Hne*z4(0Zy1r{Ik81 zK-Q$$eS7xoWBhd)2M_X4$lUhyXD9dS+4G!nI)PMO%Ypb){%ncworHg{p8e0UWy?ER zia`9?XM6L{oir(D((Gd;fj%j{dmj@YAKx!e$|(M##66!}W*>V{fZ0L@@z2W1&z&?W zKPP{{K>_eT@noI;`26fiIr-W76OKDJ*=9iwvrig2JdgTI`dK=QFx6(CnL-i72K{vU zqcZX#aemIE{Qs}La{-U4y7u@WQXUooZEK*|3_&44At)kml8}IaB2-(XN*e=4i9iSm z&nu7!R8f&fwH85yBo;9K57tA@qws3ii)iJ|Lx3E%lrvQ0PBkKw6VNeNI39bP-W;KJEOUq$MTv z))W`({IB}-aa1;~IG@s>R)fx`w(s3Pb%40sC)QDUW}k?9Bz8?sKDTCrTJ00l2BZz> z*Ly%YmU1EGtzXJ{y;2fRu2Jve$O(AWFIDa;az3p~Lc_X0sZpa*UttJ}1NtXQk-j^h z+^J*x4s~nRIjx^gru337pLbqL%6I3}(t0Hi>~?DHTIXwqlr%=~m-^lOX({O4z;5+V zs-497ltig(e}B992Y;ksNvAYAbzoY`fW&UnwTja^?_1x7jk*j-79aaXoreFZ?h1Y0 zsY6OPnM(9&H@@WCKUIp@uXo3;l}<;EFG2T9?t19mvX4XCfI|kCf3@{_`y1pZZdGux zUXWi7Clb%)X^hHXRmF1ofy7Gj+>zrHAJ1KK$t5lxnU--uMeK3!q@ICUnY{xGa#8{h zPVXI9v2a?T(+0&9@^gJ(x4>Y<4#W(T)ZcN(9f3uQ76leBUK}VWC6=w=wgHI+sXplwrvY+-@ZNY$tRx#KK=C5 zz?Wa_ag>JGIy182DmIWHw zgMoAGiNJ4cLtw0J4$QZ=11s%)t>53RGl2vxh=XEuzZTnhzt;UK@Vu0y`}^zuD|G)@ z-G8I*U#$CA>HdG{{<4a7=Epci?E5iJ`F|OwGzpZqCQX{ih?E0u%xjaFvl9{$TJtX0 zq)AMZX02lzo_gx96c0C!i$DA9mS-n4YS^GveH}Mx*1Tm)UE8Q(Y(g6qZ=1%oj!!tV zUP2>XaBBVfziQg-?D&LJ>c#&m@r%wTE9um8LbmesZ*z3-CDJN z+Nwc=CMW--N$WFDsZ);+5*o(-ympP+ak@4k;mo?V82=YBC!MaNQ<~SSTepq&0nN_- zWzD8Kt6R?0vF2~n^k*%bw@FB7(^B|r{?={UoYkgHvo?;trfNa8X3gATAg_Ubd%3nQ zRIKcvhWe@+pZjaLUiSrJT~08d@H}v(phh65*Ar?d>25{r0Y&T;P)qNb`G2Dwj`}0b z4Zf!cejXbe+e|%hmY_x5x^=Y!3dl3SDTUBV-wWysJjeC+2Wjw!akaatR)fC{1*m^; z$&w|PY28`7YuBz1KKtym54HAe+qrY+`|8W~?AfzR`_k=izy0>g=bn4+7CqeWHxAg88+ zGX#wU;DTK1MS%D4m~+1noGCa%xrz?^_wWB&@3nAN8~?`Q_e-+D^BAL3r%o-vPk1@} zpMU;&Q;yVxpRHN5#^J3Tl6~;O2extJMpI6~UB^9&5%_$&?pd;O<;tlKKm71ig?+te z%$PASJ3Bjd&YU@e6jy^=D?ytx&N!okavPVQd+xdLE+#cKHJ)+x{+RIJy?eJQmYLtY zdGn6q;hc{@{@9e$t>E)ZFTG@Myzz#^Q}S`RBb%*Tx7u58z2%Of$%A4Z_g*@;=Zi1C z*e|{NMq}>y`s=Ul%P+s&{pzc)KJwms@0Dq;uee8a-X?qNC>-W+@3G>qc*-@Q+1W5MKqktoIRN(!8#WlW zvSrH__Z}MX0q7fcf{egzwf?U(<4v=~7tPN5hgrhk&D!XHr`xSJyX1MZ;`hz=?%TIn zwu1dvr#bwec;boqXPtFcN5$}SKb^sb$I{|AN`Mq9N;b)jJL--~F;#`zM@Q zDYICu)>wH`ba{4%4jtm83p1fZa&Yu`I_TjgdIbNgq65Ceb7X|xp#S(??b#ec1BL&E zZ4@?HQjWd&VcVkR4#pZKY4x^g-3xs-VH)FL}>a?jlZp zeI~Tv59vJ(^yoc$U6~HAU+6lzRQAsY?cRyqt!R7?yF0h1qX7c`@R8Z?BQy*uGrLGQ z^%V^j_6!XXdv1qMl21KbKB<{#h+R|eTQ$t}m1uDI$Hm1}_%L(B$s6Y+?^96b*|-11(+tbEs$-A|L!$kc}{$P z+N>2ci2uPy%m&I&sl8Yg{_^)u|7B})h=;H_Plu-k8L%Ei%f!<{5B~Vchptby((Afe zv1s_4Xebz0j(_ehvnxLl4Li&(6AjoiKB>QalDB7Q@b(N1-k$ME@oOFa|EY{WcEA>PL?g;lRC>Mu|9jB)N-9!^K$$v`=!Rwnj-U0Wav57;YsgB!SeTJZh&d-gT>P1Y*bHrf-@JKH0o;h||=ZN-#s z78VVa?fEbAN%Kc1+w76OY*uE9&A2AT@~%p?TgG2*@4UXzpdmWOaP};pM5_va`Fp4T z!eDj46>7U%S|1=)#qdsdRo9hGdih=v

    5*o(B5E(E&~97WeLW`2l-s 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 literal 0 HcmV?d00001 diff --git a/env/Scripts/pip.exe b/env/Scripts/pip.exe new file mode 100644 index 0000000000000000000000000000000000000000..16f03d5355cd4e9e5ed186398f5f6b4e72ef6583 GIT binary patch literal 103295 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 literal 0 HcmV?d00001 diff --git a/env/Scripts/pip3.7.exe b/env/Scripts/pip3.7.exe new file mode 100644 index 0000000000000000000000000000000000000000..16f03d5355cd4e9e5ed186398f5f6b4e72ef6583 GIT binary patch literal 103295 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 literal 0 HcmV?d00001 diff --git a/env/Scripts/pip3.exe b/env/Scripts/pip3.exe new file mode 100644 index 0000000000000000000000000000000000000000..16f03d5355cd4e9e5ed186398f5f6b4e72ef6583 GIT binary patch literal 103295 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 literal 0 HcmV?d00001 diff --git a/env/Scripts/python.exe b/env/Scripts/python.exe new file mode 100644 index 0000000000000000000000000000000000000000..b7c993de7ebc8c69434ff5ca1ee9cec6ff5c7cae GIT binary patch literal 99856 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 literal 0 HcmV?d00001 diff --git a/env/Scripts/python3.dll b/env/Scripts/python3.dll new file mode 100644 index 0000000000000000000000000000000000000000..2ddc084db41a2247655f6a573132e3fcaa8975c7 GIT binary patch literal 58896 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 Y@YWAHorp``UEo>BkRG=O<5tlB0=72B2LJ#7 literal 0 HcmV?d00001 diff --git a/env/Scripts/python37.dll b/env/Scripts/python37.dll new file mode 100644 index 0000000000000000000000000000000000000000..5a72ba9878ae28455ebcc859345c3fd1b65c668f GIT binary patch literal 3748368 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¬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

    9QJb_0lzVZVZSPnyT|X&-(}?xWxn0eWW?TKxM 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 l3fBv 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 z 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%0ASh(F2(ri!#3Ztns~2MRiPF^YhIzvREA* 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

    pw01>8WS6<=jaLMJeH*Pdt?`%hQF9fbO2y; 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%0A#2}Qdt&YBwLh+1xh`p)WL@z(`8w6Q=hwZl?wxff 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 z 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

    tphR2B5uyMp_i;=NWqdn$`Ib&l+D&~sO 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

    =yLm0?PWEHX+S%a)a z)*=1k8AmV^HB2LI5 z#2Il#+z@xf1Mx(>5O2g6@k9KP0FC%SBnSycLXc1-3<*afkVqs7iAG|OSR@XKM-q@k zBne4IQjk>SFp`F3B3Vcdasrm zIfI--en-wD7m+`ZOUPy93UU>>hSX~0XCrk82jL<0NCVP{G$GAM3(|_TA?=6==|*}G zF(N^vNFO3c1`q`TA`k*=#3Klb;0S?`$aUlfaud0Y+(GUl_mKO@1LPs{1bK=)L!Kjl zA}^4a$SdSE@&@?}d5?TVJ|UkGCGr*dhI~hUAU_cmG6JQbqtMZ)E;z8}&hbQ9sll4L}3YAT$^aK||3nG#rgUBhe@{8jV3?(Ks|7O+XXT zBs3X4jHaO(XeOG4=AcK=T#fvBXg*qi7NW<{QnU;`j-Eiv(F(L0J&B$|PornhbLj8r zdGrE$5&Z+bgkD8iC|e`G4&|U+l!w-%jc60vj0(^ev=wbb+tCiR6BVIdXg4ZBrDz}8 zkIK;jRDpshj3OwCVknLhD2ZN2Z=g5PTj*`{4tf{8hdw|bp^wog=u`9=`W*ceeSyA4 z-=Oc%ztH#SNAwf=StI`!REd5?zo9=-Eo=m)gHf=N*eGl?HU=Aujl;%c6R?TcBuo#} z$0lP_FavBVHVymx{!PbbU^B5<*lf%Yn~TlEj4)%&1e=dhF&buyEx;CHi?GGm5^O29 z4EqgRjsX}QGs76z3T!2|3R{h>!Pa8yu=UsmY$LV_+l-lGTd{4}4s0j33)_wD!S-VN zu>IHp%mTB-tT1cL2D8=3Z-?1q2QdfC5p%*0Va}K<=7zaro|qTrjrn4Jm_HVP1!6&1 zFcyM^VG&p)7Nrp%jm2QGSR59QC1J@}Ds~vlz_PGxEC)M+_>+m>82_QcQ;RVtrUYHh?KG5Q8xU zLor+^}AYdx$;49%E0ir`U7sPwWNu3VV&c!QNqiVehdI z*hlOW_8C)RU$O7lPfUer;oA5JTn8VCkHSaeWAL%~ID7&=5ub$X;rjSwd%2A+v$ z;YaWSyig;55q=auh8N={cqv|nAIDGN<#+{NiC5v(_({A5KZT#h&){eAbNKK0dHe$Y z2YyK-{xW_AzlvYOS$HkZ#_Mnn&c%6nJ>Gyf;!Sun&c_9K3*L$g@ix32@4!285#EJ& z<2|?-m*7&o5AVkZa0L$HFplCFj^hMQ;y3VH_#ON%ehtPam09H0x^-8L`)|B zzJJq*>BJ0TCNYbcP0S(Y67vXS!i1Pl&Qh~)%8&;mS7Wg1ef3u^+W^FNHh`61fOUjghU(BPIM5Rgox-Ox(Nv(C3=ZIqF*Eb z0HGj20wNFsC2)cu28kQQP2v`Do47;VCGHash=;^u;tBDTcuxFDydYi@uQcLc6K{xj z#9zdF;sf!C_)L5ul*Cu!8}XA+5!&PkQimK#jv_~sy5tygEIE!GPfj2wl9Nb1axyuE zG$5yv)5z)MEOItEhn!2!BaKNDaz05VX{0H+fLu&2C4VEAlK@F4%}55hid;>uCI7zv z>&W%wMsgFmncPB}lUvDc2L^=0!%#U~;$vATEi0H`uBj&lDxf!|Va{r$3pWFXb;GYWoQ-Oaf z@J|K)slfm570|0)@UQDXnEzB)qKK_&U5=)+xti9h*K|sQroS|5I;L6EZ~2-IY0>nv zR!#e~Y5HEfrd>KUJt)$&UALy89!>9;Xj&%K^!8p&clK#|gIv@60Zp#}HO+xEy%f>( zWmMBtT+?R>O&bnsy7IcF4Q^_hd27gL)%$OCThn@XGz|?i^R8yQ)jdt?-PbfU%*+Rx z?N$#pt@lXN&@eL}YqncG(X`%EO+&-Xe5ToM^<2|>e`*>UX66gccB_|~)_bLCXqcI= zHQTM;Xj<>BrlDbGzSC^C`b*P#?==k#GxLLHyVXZc>wVHRG|bG;n(bC!hHUfy`!nl5 z>;I<$|NScPw#xKhulMJMUhi4eYU>YO@9EGb1RlAy{ z_6U{QcLlg)KL50mZARN)$yBz zYHJPUTi34kq@jF-#gTQX#A#r zwI>a=GY2%=kAZ4y4fQ_;54C?*&p!oKd&0lhi);4xAk`i<6mNHZsC}rv%}uo@53PrK zTQi<|SM7h#f5v^aDKFLe|9qgf?t8Vn9;rQUXgwF6s6Blsf7~;*wTJRY{W;{J`h~ny zn=;hj=e64Z-XD**YL6X?-}~24{7^mCd>Hc3{sNzd;)nYG_GPGjXubwt)&BSTbiWU^ z56%DQkD>UX`TSI=J!$Cv(4ejU_w~Q``+|O6h9<`|(uD81hg( zm@C!R8LD5wYPGdrtH<+OtM;sCYE#y$Jz;1*gB#QyGxT^8ZW`+ULES%Ui`t`y?hopt z|L^`hZLVI=zw3E=+c57K=3T?QXPEa5^MPTu9A@ibwjE~sVRjg1r(t#;X4heMA7;;C z_8w;6VfG*9z+ny^=FnjdALhtmjvnUNVU8c>#9>Yz=G0+M8|I8*&Kl;NVa^@q{9!H} z=A*-0Jj^A-TsF)nhPh(M=l|b*%>6U-|9cg9QmJ`=c~U*(asOv>{u~-l`-yrymFkC< z_6Qw{N;PuSXx%YmRjP60Crq5Ar&8%po?@U<=}>+hAN#LkzdUu?^jWhF=lpFdOD8Y+ z*XIX+JM^!cZ*l$qc>EsvpO4S@UyO4Z`Op15;QxGl#s6ZQTQ~o6f1m6B`S_#I+5d6= z!`J!0wRYNww6tGUOjG~)RphiW>U!$w|JQqHKpPkVG;7g}OpPvU=>WA_Q;ldQ8&n%i zW*E&hGBlcFWB^PBbb&FzSYRA59+&`31SSD`fIh(0BDFqid6@W^_?pZ$Sz*G_GBaWr z=@>6DzNfmcdaT-Ny2aGU+nNBn{G@WbO zq-A7eY;?l7!nn$~+_=&>)HKjE$TY+>&CJkjnz58&V%)_TWEdN>jM!S*su3z36-6~t zHA*#FrK=jF8mk(o8n2q5ny8wj(o^ZHCab2X3{+E9(^S({GgLEGvsANHhN?NLxvF_8 zBbBkrL^WSURnb(Yss*Zrszs{BswJwWs%5I*RLfO>imozKF;pv5D^;sht5s`MYgOx1 z>s3!w8&#WBn^jv>=Bll#ZL0069jcwGU8>!xJ*vH`eX9Mc11bxZrOHZWt+G+ss_azu zs)H&Am7~f@bx7r`a#6Xe9;)bcGdhF5g1(ZzioTk@hQ5}*j=rA0fxeNxiN2Y>g>FvY zO5aA`PTxV_N#8}^P2WS`OW#M|Pd`Anpj*L zE8UImPWPaD(!J>3bRW7e-H+~151Coxa5$Sa6^yr9nBsx+ZnNF{c7HtG=JWY=_gJwW8q%EaU zX)94R@!8mK5Z6l zCT$vRDs3Wd0&OmB9?h6$LNlc;pe>>;rY)oWMx)crXe()}XlrTfXd7vpXj^FJv~9HQ zv>mjav|Y5_v^})Fv=fYSMg?PvaV4XNah`F3agp%{ql!_@ILWACoMN12oMD`0oMZgX z=wlpZ9AgwSKt>)TpCMyhVq9i$7+eOAQO{^#G%}hP%?v(6z({9gFftigjBG{=qm?0K zv@zNl9SkO;gi*>UV;pCg8h0{8i~>d>qliH;#Ee=7n^DKO$+*I}%DBd0F>W&;2FmDW z^fGQSBn*ibq;*xxRQspO?APDT+UDAWS~l7(T6eVkwD=40k-=4a+_ z7GM@=7GxG|7Gf4^7G@T17GV}?7G)M~7GoA`7H1Z3mSC1>mSmP}22o)uLPe<<6{iwZ zk~&DePQ5|BNxenAO}#_COT9R%?MaU7Ml3Mth6)R_!lZ zw%T`pz2)@R-lx4sTgyz_Y=oJP8O3a**(kHoX1Zo$%*L9HGaGLPv)N`f)Kk>c)HBqx)N|C|spqK|s28b!P%lw0Q?F33Qm;{2 z)LJT=T1Vwjxl|stp4vcdq{dKVsd3bJY63NpnnX>erchI<0D#dx3qxe&7IL0ayZ7fHhzP*aCKdJ#Y|k z02~1);1J*pxB#wz8{iIj0G@ys;0^cyzJMR#4+H>#KoAfNgaDyH7!VFb0Fgix5Dmlt zu|OOU4n zfimD6@H=oGxBy%P{s1lkmw_w5Rp1)H0%`#^PzP`TF2Doofd-%vXabr6J|F;EfL1^V zv;plv2ha(KfG(gL=mErl1dswUpcm)^`T;pG04M+ufB+ak02IIg93TJ^7zC~ZH-MYK zE#NkA2e=E|1MUM4fQP^%;4$z7cnUlNo&$dZFMyZ8E8sQo26zj+1O5Wu10R5oz$ZYD zqEDGjnL;t3Or>a3rctI-W>98QW>IES3@LLcb1CyEMigU;31vQoN}*9qDGMkIDT^qJ zDN86zDa$CoQI=DNKjUZ`pwKC16b5AlWhKR$vWl{rvWBvjvW~KzvVpRZvWc>pvV~$! z*-F_)*-qI(*-6<&*-hC)*-P0+*-tq@v7lH|v{>3K3Tre=moH(9)y=Q%7ePVrQ{a|U;Qff!l zj<20iJE>N`c1EpXtx@fw+NHJ2YFE^*tX)&Pp>})ij@n(ddupv}?P?usJ!`#dLux~7 zBWj~-V`^h-<7$&@Q)*Ld(`qwnGi&o|^J|N0nYA^wr)n?MHrIC6ifVgmWwlT(T#MG; zs=ZhHsP;>(vi5tes#c4w&DLd)VUJ@^U>mRjHl4kKy_&s-y^g(wZO-1t-of6<-pk(4 zKESqMTe0of2iY!cSGGIbgYC)oWe2bW*&*x*b^<$*oy<;Qr?RuzIqV{~kln^^XLquD z*mCv&8)QRlm_5k8&c4Nd#(u$m#s0wl!v4-4U8h?&p-!)EY2C6qpw6srMcszFjdh#r z%h2WK~DFK0i;f@90E zLer^_41 z8_zS~P32AJ&Ey&JR`53P9CmpLt(+O5RuAH=gR()3A0urCzsQuU@}?O1(k-)Oy2uyL$WjgY}N}&h;+!ZuRc< zKJ~u!{`GGc`)S@qfVIrT;L%=+W?XY0?^U#@4>_tcB)W%d2_ z@_I!*RFBo;^<@3^`kVE)>+jV+s()7hyoNBnxaJhli(Ad!2AZX}p=xLBOKn-}qt%lnT_Zl8HJZgB-@Ur1m z!<&Y84PP1z8mBhSXq??>*hp=pH7;me*tn>1aU;-3Z(Py1rg2N7dE>Um?TtGc_ciWs zJkV&>XxHe{=-TMs=+Wrec((Ce6CG_Pr1+q}Mcd-Lw*{mpjG_RSv6KFtBm5zUd!(ao{VDb1

    CM^AMa@T>i<_CvCC#PH<;@k%mCaSnHO*(6FE?LlzShiYu5E5;Zfxc^OPhO}UpBvL ze%t(^`Frz^W>vEmUzbNCH>KEIPM;&=1Kd^sQDWBl9vyZrn7 zXZ+{Sg8PDpf=7bKf@gx4f)9d^g3p340;S-qK&wT&MYm;Y%bJ$8EgM?4v}|qJ-Lj`; zU(10Oix%4!yB7Nv#}=0spBCR1|CWH3z?O)X$d;IvgqEz9?3SFC+?Jx2%Pm)0uC=gQ zI4!&uev6=`wWY14r$yE>*mAw)dy7^prFBB*-bxrH~ z)(x#2TQ{|CZ{5+lt94K7fmX{_t5&;K$5zi)@79pkyw;*tX6uF4%dM=|hSuiR&eon* zSu50vwti_1R}FFYW$61obrg*n1JVWF@{cuaU)ctThq ztP)lW&kD~8F9Ax4VUKV?2nrz~EX0L_!dt=*!jHmF!Y{(_ zLQ31nw$W{4+Vt8C+Nf|=_L%nA_T=`I_SE+D z_U!he_M`2^?acO)_R99E_RH;1JKT=7lkJ1;_u3z}KWcy6{<2-WL$_m0$Bd4d9kV+O zJLYt3=`iou-m$yGs>8a&zTGbFf=nU*+ zc9wJ=@2u=R+j*|@eCNeZR%dNzT_>lrzO$jTv9qaD*xAJ)d%I(s|iolxgs z=k?B;owqt~cRuQT-1)5YW#@;^kDZ@8m7Q85ibz+aCz>iU6wMLM70nYFiRO!_B2&=< z(NfVe(Q*+WqKj6E)`-@MHi))}c8m6i_KEh34v6eT_991-i^xahEAkfwhyq0sq8L$v zC`VKzIx0FQVv3H7%0)GzQ=&7XbE1o)%c3hHmWU&26ZME>BDn|?k)lD-J<%i4Gtpbo zJJEa5chL`#Ru`pfeAk4oNnQF~GrDGW8FtOCAQyVANcy7Id6yO>>-T_?LvbzSJX*mb#!)m7Wo(AC)0 z+$HF`)pfh;Uf08}M_n(vUUt3edeil;>r>a4E@juZuJ2u1-MZaly2p1<=$_JT&^@(# zMz>)%wVT$xuzOMWj_!c&!0wRli0-KFgzm)dlB5n{jiuq!JxK%6^w~5=uJz}v~B9@9};$Cr|ST0tGAu%k* z#Dn5{;``!<;>Y5b;#cC=;g=D2uBpeA>(jehW1dr$i*_ zmWU;C$$$isV3J#s+md^d`;upp=aQF_w~{XsrR0Z%A{{B!m5!GhNT*7tOJ_=rq{dRJ zbfFZG(xnXPO6h9p2I)rW7U_2BUg>`60jZ_bT52P;mD)+|r3a-BQb(za)I%B|4VK18 zW2Fhw6ltpTury1WEzObUO7o=o(gNu*DN|Y^JuWSmR!A$Q)zY)lbJFwD3(||yKcp;a zt&}5ekP4-3(hg~-R3w#2d!=%zLJCO-rMIPzq|c-;rCKs=8AYZm8!OY3>C2|brpl(t z3}tgvLl zg|Z^qQQ2|XDcKp>IoV~IP}U~vk;!Co879MJr0lxvp6tHtk?f=FyX=QdtC!L{vUgPP z_}&S)7kj>)Gqw8`2xm8`GQ8o7bD)Thzd-FvV1LGPp9r@b$GU-iD}ecSu4_e-y` z_j|8apKjlnzHxoy`zG`m^v&p7)VIIyK%Z5gU7t&zYoB|cN1tb3KwoNKc3)+mu&=GJ zv#+O5-Z#((_Q8E<-(cVMzI%Ny`#$vP_UrW<^v~!w>NoB;@88|Or+^qdH;C%1i7BvKyE0XBR7_t$QQ^L$`{F(%72ps@-_0c^7Zl! z@{RIM^6l~+^4;?Nayz-b+(GUrcanR^edK=f0C|KwR$eKulGn)3$}h{W$gjy+@>+R= zyiv}V3*|j>v0N(el|yn&{z(2({#LF%pgS;TVElmIz>I;J1G5L_3{VFa4lEs5JK!?l zG2k;0G7vftJ`g#OFpxKJeBi`D;dnA_rXWtGw?0=4tx)O1iyn?5CzhQW_;4koKWDKH*EJc)0h!(1i>YyXh@#q9}BC3ZPpwm!8bPhTXHA0P18oCf&gf2w^bPc)|U5{=+H=^6o z9cT)gil(F4Xc2l8Ek>DW30jF(p*84P^fGz{y@uAJ4JaQKqCKb>m7%>Tgbt$j(TC_u z^cDIR{eXT)f1oN<8`H(+U|X>5m<#5C`Cy?~IF^7VVkuY}mX2j&d00MHh#kd_V^=Ua z24NU>3%iRw!(L)<31{b@B1I0X`L;#=_T_fM_Lp2r(feW_QlFeb&Lj;p#(Qn6|6ysIvZDMRGc0nFK zp2A=-dR9hDK9Ya_M3&`Pn|8+przcKPZi#ME&ra{1{xAL00xH5S;>N{)OwdhIB^jrj zN)OA7%zRN$b|To~l>KMF6=CNSUL`qa>*ZVIUalClv2a-IxZic2XZx=&2fTb?|LsAu z!)C&!1iRz4So&u9|*}&lcmX-dS5ZuJ+vI8Q{6r_s>B6 z@QblW;)uB1j=WrZiw?SFT+cFSGkf zif~T6eRS@z5z18Nj?yoshb=x?_*(sR{pvQ#(;+Z2!|uqgW3gpRs@*I~tRnok1dOph zYEx?Sdyp_*uM|6d&1SjBU&Xtvu6Vxk?(^9YkR8++o|kbh|9JUG$J8iR6eTt>HT3Y6 z^uqj@LT{$^seG@b5W8@z)OBg|3sS82dY($2S?Ew&RK~JEE$3RbTaB_7*$mjE*+w{I zIaa%sxW{?2JQY46zTtkYejofQ0&+uhBHl%uiMbfl7jr!}B;jSk-K0-RJ5tM1r>1XC zpPf;jB9Gz?6oz36YwnHYS{kRgg8aQ z#-wj4!G}{0>lU0V*j#k1yyw&-+vm1>?IP{I9)z8IoY%WtbNlSI+INR|?RyOX|u z`4tCjNm^axaq8_s9|wKcQGVQjfqLQ!6>K4}?Z9cg{W#?JY%tCdHn z$2+e}-s^p@M<*qnKk|D~afO-1eP>;-8vk1{a3Y$OTfi%LcGQBouWV-}>h>&9mGg=@ zQhC<8()p#cx98V@O~Lykmd6anoJ+P!6K8eiUn{zGVqw*9Hm)8oy+$w#EcaL&+g^8k z=yuOX#CTA=yKV&@sD+;sQi z3l^}|ua9Ew$2*^Oed@Z{*TUC0U|-PvsAF+&;@wh}X=gJma_%0{DYhu?W9n4dS6@3h z!(xYptA*6!on^fBPn#{a4{aaY9|ITIp}5W%lCio-ydidED3%Y zyfx%hSV9CDRUWMq(-HqXJ}xOObxivAjFFjRGw)`4v;pm?lZL(ADu5Z5^Tma^jBRC)WMClu1N*Xo39LzN%5mc)x_;hN2B8 zM=M|0E_1MOl6Zd${4;t-LQ9f3>1Rr8c5#06(Ur{0C%)P2a@ZB?ku1-eTdJ#c4BBVC z&nDMqp4VVNY+zNn*y@7KBb#o|3%+XuRDp+M_9Y84Uu5y}*A~LXd#c7L`z$J)5FdTN zV?iroG7{SouVfz1OUrZ5AFDJi8)w;POY?~IiVB&P>X%w+;bna*zAjzca-wCNb-MK} z`+$S%9lknzcQA0;pNEDLuR z#UC{;qn16Ww62<1J*nEay7Y8kYMkX5yVqWJ0dUDR`*qgil;f3#hn{#&P=a16uZhY@ zNoySh)E~Q__Zsi{3W|zIneaijH z14;{}rP4}it$conR*>wkmujQ5RoW@-l?Rm$${*>DN+;z8m&YNSZCk=-IjzcCYtdw} z(~@mJ?QRu)t}83)f|pTaNn*ulqjr(O)wP^Y}#t{ zvH@(SIjnSaaGdDk;qu9)(De_u(q9+z)c4N!p6;_PKpD^#G#F|ehJ`%}{~38JE-{{) zxIT%JeI@@@(fgyjkLfTCn6}Ix%mZa{<+m!3;878dQNKq8M0>|~BtA+$c{siBilfxS z&-cf#OBNP|%#G}gJXAELGSng?>9z&SdcYdD8E<#VGt%EG;BLU&(3EgtY<>LWqz~!d z**T>y))l@k{$>7yvC^dItV7D3MbnwfD#KkmGpaMqnc>U{r4{a{T%Cesk;!p;k{{(z z3Kx_B)w%YcJe`$+aXD$5kF?}|$tz~MC})RWkGK=tun+~g(py%F>?d~xEfocVdRC%meIsw++_PM@@q_{9g$iCB{8RlK!=>8a&4-*d*Xx$)%MR`e-;@#?{m5dKrShP=^4Eu- zu7)1G=w->(X^OO+>2sMYNZ;p;EHme9f`Sn!n>7s7>3r(a(l2PZ5obgK-t{>>|) zyxek$)lAnvL;0zTiwoVidrlAVR30fuYzotFS<9{60u7VeQ{QF9mfx^kWK(H7$!?;( zugfJ53;)XjA)y&jU!q3EWW{(XAH;^FB&PAx^0UCa`+4#bsN_L;@5woKhr^-B%9yV? zSC5@9cc?jYy28Idlo9hRV_L=1g#IL>c)A38Qr{t{9n^L@^YJH8Ny})aU|Fw`Y zSwZb96zwnHQho8XyYrNg+0lQ+-HjWcebu@w|A6%g>t7dm2sj=>i8qSxNPU^= zRnd4_9HyUh(RzYis@+7tQ+^8q&xCcvmBdfa>dHQo8(30V`k^K>k8N3Meb+|fw9(Dp zGr=d(hwTUX8~-}h^vz)RD94=6)r3+Dq85z4DpY89p@LnGwI5y zwBXVZ6DL#us_byvGRG>XyKbQO3cqOobzw`Qf1MgAb79$an-{KZ&wkIbUQ(}XKKFc` z0{w#fgN-9UN4v)EJUlmZL{?DF`GSt31r?sBE;|mM*0-8yv)<0qKG!!cWNhlVRJZhk zBk3pJl&fq`gak%K+f^UhpK*{9No=@!@o{ zOOwY0&ugBRzTbSm`|5|h2{{wp8+||Z_z8)#VXj`GtIZ+X0k26uJf9W*Yl8YhI-^g= z98W%xGW&2r#;VNhoEOE)a#7U^%e}S(wl{6%UQ2znd`o=017C+YhQEroi#3UR6!$$2 zO8AzrG;wF@(#(6gSn=e_H*{SM=UW}M+Us!HX`#z5 zw|Mu>UYmRcz9Qc-eue%ufn8zZ1mo1J>FF6uGV3$XWfvV;Trj=x52jf;^UMUR_mtx{}>teoH z<=KcF2Yo7nF2x*-yOc2f$b%DWD}0r1w%YCmg_n!#iVK)Dn~U*#YIM)cv>0I(Ywhe3 z?>5(OonMc?IG{d4J60Uqn|M2EL9tPlZuMRhm_Xbw+i@mdvWmD_J@PXN#T`eJhGN+H&+6 z^Hzyr`S$YbRZnZC+m5nXWEb=6t4}+pFejD!1tvmzyN`6+i&W~Z_;MMZDR z{guv^)7{hDySx^;j`P0}kdm&|LTp9BdOz)A`lgJojK8vGkci~ebT%&5EFBPFh>nlq=^uLG{MDJ_^4@icTb279j{xr)-#Xt<{@?s- z1CoQQLdcN$VPhh8M2|?=l(;3)BTeT7IHi1e5{~%?h)nc1S7jIwtkiO{ov8Q4yl54UPN`Q)Zi&CGKV7JIC zIb$q>m3#bO2TTt;lQ|5?y2`N@%~qh*JnNnISM8@C+~Pdb<(|tLw*t4b zZe4EgJ*)#fgB-&)Ms11ejQSGio5)SZ(%$EN$d4}YEV@%Y9FHXOfpH0 z%8ZJd7fXu`RnAP#as1{ebS-vka$~yNdz5;mc^~jC@w@K##cx``UjgY+ZZToWVW~uF zRNCY8$(eOIY58RZbC{1x2TmKEnd%hkw9M_6hk;+TAJgCJ*Co^3!{5hWNswgsmnYm{(CAPmV1tqYqMapBh~ zZB1i~V~@qojMGoPm%Jp!D0OY>(wxwo(MMJkOkjF48=1|epDI>Yla?Va?*1jAXHtp| zPb-{ubRIL<`G@NSpU!L-=Kadt=tAdekHh|VLgy9yQJ~EnU%A>QLTMdwETOzCB9AP2 zZAsexu)lFI)8U6>*P%S;Yc8EGG&gO}310iW^1KawR{19Qt_>;(UJ)`glpg*x@_AH3 z^ynB~jA@)_d}pFV(w|9!l;TuYs^{U;X^S%GSnpGP9T=CFP}p z(!%mf<(JEea;*y8%JM3-de%wI_ORnjrwHc`XE^jw_?bxK7(q-<`j4#puDR}4-M4zY z^qm|K9%vhsAG|X3edxpJpK+}C1IY%d^D_)Hw`6_D_RjGt=qbo8nOiohvY~3cmu=qL zV&Bryt_xfPUEO0&Wd!8n;Xl2Qv{m_0`ExBCEuLE4w%KKy<~7NSS6&kW%Y$9QvLlgX`&`GupU3W2{;XVMnPGX~GTF}P5Z`%&C&xFy?|UR8 z)-92dYLW3UqcZDijv_}VcWlA6V<(FvmEvN$(*@@z&iNkCoyWO!yJv(%Dc^;Ti~T6w*EQpo9Fmw>dfcC)7)dgh|<vbcf0#`e~rE+m8mLP8*9(Il%NA&{^H5+FbrVbSXk zZ0jBUkiFKXy!ZXzd*Ao&|MPs`%$#%P%*>fHXU=baDl-Y{{9k;$jQI`r8*zUkoXEIS z_Op+#gh)brBVLSoIevuDoOPkJ`uO$w1J_Q5R3_9Xwq!kD?R(7s`fj@4k>-zI`UH>p zQy@R+U$IEsX5w$t-p+sXXd$AmdjnsD6eC}*vL4Sl*?H1>>cYhmBqyL0DMMx=_v5f} zqlw>7&Pu*cC`S&b{agCKWPKqwGjFKqYsIZ)x#bl|&5=svz9PHRzl|i|pUZoyW~ZhS_u}cDfIkQE z!Vh2>iAYvsOjg?IptBfkz!Bsqatt|+J&v3}@EI|gCy}CMyUy^jQx=9FGViYlh7>XFy0 zuOa?tCoWz`ZXh2ZxXT|Rn;(6Ie2jd8oQgY@^(n&5`zz9baIZFn5D^kWMut-;$VKOm zCJT#?4;`l>omZ_NRDIG%pdsCPJ}2o21M!V)M3_i>Odg(vyh^x8C`)6fy_LC^`DXUM zoY9<@b6?L5%$vx|Eoee;g=|Duc&ivwexRD%?Q7q>{yyew0rG&B zK<|)uL;o{$G%O*qBQgd1a?}j&(>Nibh!0P8BqtGQsZp7&IU4wJU~oZI#j|I~HNX4l znNNMAPh=h_c(35?%gpTL!dHsZ%D-Fv{ArJ%{>bj6#lr6v}wN>3c^8I6B$38jXcm6l^FI-zn7Apd9L8sfnSPB&sZ#Z5t|t^5cAW5fT9kh6S2a_1g}T_8e5MY#aeM9qzfU& z+)j8g=}OXrBr#$l+(f+7C5R(0sjwS4Ti#smRUKRX)Y05yJ;>6TWAD9s4qMxc9IXw$ zQ62xgjKZu}s(<<(_mVcCDe#)}>(q$%B89m2SkL&YY3H+2viaHX=Oq;WqUcve1xMdH zAwT*2#rLm_U+F_GVuAvS178ce6`~AT3ps-u#{GNrOYz6!*OPJi*9tredx`_g>dJ&= zU#aRka_+ePRP5=VOJ21bwexkS>gVch^&`P4_=V&*2(PC`=e=3pUHkm?I!r$joc>8h zZO(gn-#^-ZJmi#b?bZ6#`rT_UoqFTLT1-t|U;X}|PeUxB-;VfJ1S#UfsJ^IP+%Mw( z62G2!D)Wz7`PsGEzs>(kK}4bU__4DGFU8eLk%aol>o0%&Y)Z|A*vtL_K7r$bc_Ckm z&|$w2^;~prd@bSE*}u#8EnKSVJ^J;Ngp+?cg+GHk`~CO6crL6~c`e|>0!&@Nw}R4x zWXS7bjIeSX1y>nc6)TSYYurTKv+>Wx_a(lS{9MW{M3*v}B1huW64Hd3KhIJiZ)GbH zOU|1G|5czuq6^}*%y?7{bRHq89|bAXazGzpSf@w`QGJAR}F{}8AZmBBS*iU z@UOY4RTs{fkiSNx#d*aGGQ>4UFLUd$m{&sYX8rn9ZvEP|#p@%9)0uU(<{)`|$1&vN zj{{x`d@AT8+&AJK@%E&r)A}>&il$2#N0N?TI<JKNDkt?S!)T|&`*GjIfB5TM~n5cm203_0yOw4|(mUBgTV;5tOtic+w`{LG- z4dgrJn@GTk-t);p2ST=xZ3ICEFloVIxSPjyn74!Jp>nJP8;Fa*MdK3VyyKPGH*&M{ zP8VzywiR`k{<7-nqw~jpapHTYaqP~qniH8P|LxTKr!=R`XTN=cRabKL zqxuW*W&STBI5_`=z?64VucW?{J)B*Y`{U~Fvkm8;yX5;R=F?y2U#b|WdFhH*04Csf zK}SOeu~%c;5{go?)4rF^&U`7`nEzTqS5bS#AFA%a10&+()+t;~^Z7Fue^A?AtFFg? zIvxCcs0FS^k4!2`UeE5!-$hOq`hbJzQ0=^bv@(yk8V5@{93~G1Z-APv7%g3QCt-l zB96Wm`&N!H_j=_E*DiiI{s|?qJgNB17cf^bO_=DwqCoG^UhD@rkJzTzt=MDu{loB4Kq^7->o|xg0Dao44dL=tH`$xGAxfcuW7rb4BD>+kovFu;UtIEZd z7puIEf3ar1=9BZkt~*?3s3TlfU4He-SFVL$i@x^7>tFx$&EUG=%CLWr{9)`X`15gt ziOs1KIay`Dsu(!daq9lr?V1A@FVrQ~e^~#{HNWeJKUD`D3Q`6!f`1qO9ef79F>xTt zmb{O!LqG^WO!+wVcIy4K@8)FZq~uxiUdwMRe7hvPEUIjx?A7wC<<}}FDi2iUR-ZY# zdy0HIwB}~bjSI&vzFM1AJ6-pudVRh1BTe!%m8}><3lE zqhCC>cI@Nhg5%#mbH3&t^5qNS3;DI{#Xl(jukz69lB3Ur>B5R4Ur+o=k`KX`kd^vj z+R2QcW^uCz3Q`Lj3UNikB1`d)O3szcmOWSf!|L5*ub;Yh_U#(&`MVc6mws2Ia^(H= zPdQ1=IkS26!qLLM@^4ihuWqTlUj4zj=Py*f|IHhIH~ttrftyYGb;@t576N-i$|57< zvGF_ctYl+3yqcVQF7U^JMZs@`{W)qfHW&Z<_}JvH65b>b2?J?;@TZ{{3w~UDrTmY_ zu*XMEh)%WzE=NdkbGS5oL*ma$+p0__etb$+w^3IUw2=~C!8+d;)QRni3p@R(kPS*PcN6KG5PCYeq z{+ky|YVXupuKpMZRT6z7^(&PH$ zJ|}!m9Y25SLPFiSI(A)efHr&~?{>*kXSUzl#*N^EQs}i)AyJVVIC9*v__(BZs&kM2 z^wf#V>?Bs;cVeDO`6#k0fu8vFw9>R6rDtS!6f4U*kN?L>O%46R{Y&4f^R4@+?weP> zf8~QKWA$%-@U@R#z(g0tl^SwEcxULBB~ceR42p z5?`OWdM4&<$yr`p+p#a5eEPyj$R9(0AO2?48__knlSiVCe&yK0G17(i>hK?|eq0#X zhxu#BZrrc3lcLWC{CnU`m@yh3n;iFkYG-C&mN-vWv|bcn{8G73xvXlpD*MR#F~;eC zy(F)1y%GGWS8#vu!u7`YzJwV{`ASY(z!dIk%Gu1)td|RaUTUtZywZ1O2L6_K7e9g_ zhrS!ej-+6h<3bWf65dP+OZ&rdk9zJ6^Nn8xhJ+jltBm-7X#-Gl}&0Nm>QH2_Qt|Gm_spVe(@{TNtoKu(dKV8T;PrdZQ<=5&n zf)+yj64L^{99AC}k^Euiku1Ob`}yB1Kl9$l=de|#eV^XJ-s!Gr}+L%xB% z75iI4Yi3ws$qB+4$@#$AA6@(IN7~3zT;S>Noa22wgiDRP5Vw*Xk@=GxQqD`cVMmsa z)Lp%NHL!m8T7K|>OZS6*8QLD27*-S3nckLVs3IKy=yFMY*(cA2-U=Nmo;gjvs=FFp zPsBVIu!x?=IhyS9r^I+Ysa76d2Z+F>l92_U~A}=h$w6tt`&DH zz9g+A>)&#bGt=+o*W9T&Ub}Fk{R46ETd6Mwmc|C8c%AS&%f!3@e>|Ek_->u!+H*G| zZrr#L68>oBR&YjK9!$wA?=zjU_JV0`0aQc;cg}~_hf;v z;6cHEl=zqIuS%%;x9a~o9(?xsovHIamvgQM;R?$=&VJ##DrzzyG~`|E{pfcS%d(LC zr;j~zjCewG`M1~Um;*sC1fPpY!1rXTv!Bil%x%uSoM$UYD?EIHcqabrv$e!p(iQrR z?4StzWL!#oD*=1z@Wtl3bJsAK%b3bgedJDL6}Bz<=lC}hyc3=$q!8|Aq-ANc!n3!t z-_M!MvE{_%4(9)~Fsg8}@JexXnWFMX)s~~w;~6J!p2VESpDsL8axVQm>&jEtldo&z zUQ8&di;DUNVJqw1?7tLxes~{08uyKgzR>UEV>5>{U&}J&K3!FI`l~g6`uN3=^Px}U z-cHZREh@TDCNAS1UpkRjv+o@JeBrf!*;!BeWpYPpXK6XuK0On@QH{sLA4j^dp~(SWITK~wg#UN_kP?~Jc00~l#kLEv)DPg zx#(0R9yYP#N?-9K6R%(8DN&LwR0dFTMa|uN$r<39^=e9rg3fc^M zHssB$?W5XHzDxMGjO)4jqA!J(ML$#ZV$G`=?_?axcq=qF?wu_Ck!O#O1da!N6qXS_ z5N^jlhx=;mjri;FZzRMLW(ha)gn1o#w0v6GQ{^p3a%-GtLBNR*N8l)ky@McLID(%0 zaO8X6|G`TyKlM}tkxZjAxGk-1d_g<>Swz$&b~^$=*FYqZDO4Jxk;!Ue!~f1&cuvko zjBwsWKwwaCh{F*Y79J6abvUAM(J`@jha)aNA<^O3>;ALep>wzPUB^}I9aiCz@LP_@ z!hP2W9yNg;WB~_PIOTUZzWKTHA(lVdJ744B`4h{}{=)6thgUz(?>f)+|JeBuZlimG zJkh`t4Ls4n6Ae7kz!MET(ZCZ8{CC&DZ-4$D=zj8`>paqnzu3d~dF_qtBNuM5{C6Me z6ZxNL;E4vFXyE@X4SeGAuOko7oBn@GyeHB;(ZCZ8Jkh`t4Ls4n6Ae7kz!MGp|4aje z{(JBH9hd4#6G&O{zQ2N^{3w%W%i(neO<{vfXiVjywL7Ja_!B z`R@3S3f=LKirn#+O5E}5rSABP7ij_;gv$4f7`<8|6(ns$2)W`04+^6pN_+Q=eXrenlN^-{|Dem|P)g2F|yW>L)cRY~k zj;mSjxF6dcS2Vlh-duNF+TxBM;JM>HZSJ^-z#SL2yW@ZEaK}43-SM}&+;P6x9sj+= z9dGG&$A8=FjZ@kW_D{tLM~PF1+$|E_Y!i39HVs~Q)s|NP4Mzk?qldJ!Ft z0}#0lkNqkE1tW>WkI@1jgFnytzk+N3H|q~Ih)E8Ih}1>833>lNXswfUfOL>_h~!1` zCi##KlYB{jB!3cy6hI0j1(AYDA*4{K9YzW#MUWy%SW*-T2l(S5niNBdCE-bNq;EH|D{Fys?%HI0nLySq z6UsW=YIUL~;E7#l;PuFQWqq=KnN%i2&%;y5lyD~AfJ_6Y;%Q|=vSFD{rk9P#Zo?UQ zM%k!rOlE?!^2TKovPqdmHYJ;ebMvgSS=k*pJAx&2|IQu-mZHpmS+ztYNO<4hr9g^qz}4(_n3|qws=@;?(9+!{TF@!!hlK{d0Yr z{t54BgZWXZp~3hF{^u?J-zc5^|IoLs!6uuR-G!4O7i5dFCE2oUMYig;o*qiNCR>+n z$TnqLvTYe6+mY?c?#W7Erc3|MY?r%e6|TI}l~=j)B3J&f?ZVID1)sz7KZoai4u9Cr z=X3Hu;iI5sw7=n?qLgYP{G5$QB(jK2L^d(%A8Iy%m`F?_CKCz76k;kdjhIW!A!ZY^ zh?&F;V)~=Di-~2A;Kya`Y7qUymLKx*8`}Pc=VpWWZ)lwj9WGicnhP3uf5Y>z&Bt>( zkwIh<8;Qb(c9ehZf2r2vE&T7m%MGgyD-9kEo(=mOTA*jL)Y)2ILw-Y6Lv}+^Lvce{ zLwQ45LwdtO&|q={;d9b48X8ebFR_o}*#+sMbP3LuU6HOz*QD#x4e6$I3)PML7>H65N_Cz=yCdC|-h-29A4ol9`(&Q7 z{czUoLD?ahm&{w{1E5@d<8Bw4bI zAWMN$Y13rsa560%jwQ>M<;Zend9r+20eVtxv8)76t1Xk2%PL%F);7q9k4~kf$>=hM ztWm~9&!=U}n&FIE_YpKm3rR(!Vp0jIlvGA4CsmLtNmZn3QUi%dB9X`>3W-Xhk?14_ zsgcAau}DoMHmRA!A#q79q*fA-)JEcy1f+J7kkmnvG=veu|KZFB5`&1rXldv_vi`U_pq*#FRS?Hxdgd>56Ob(Pg929b*e4ffxJ}kkKsZe%+k_2TBgNOV8&~OmF zZ+trd2+miB5xz} z0pmT!5#MKYm^pO**frUL9|i0@@+~RP=#_nTGlF`r`Rb7lr2)2@)gPwWtq|`Z4zSfBs5Jo5MDJ6Y>9>F)RVtLDbg{ApV2M&o?^mkmGJyYC2xlH< zI?E^F{9=d0hZ)3-0elh8GQI=2Gx#zW2BrtF%s^%&a~x>%5G@0t%qhst12`sz8Nu|2 zIuipkK)E{*#tdf84n#3+1J;26W;8Q|>Bsa&``BymvvdjgZ^KPB4u=-vNYmh;20bIV z53m7<&M?}fc0pjVgR&;YAdDC&!%gC*n@#4yn;g(#ld?%UsALrtnd3DoIr>S;0#4mR~S8JotMh6fEm8yg&eGl@Y0h@%jPAnt`*u6`4B z5wHSVISxm(EhYHj00>bRT`U4Sk|7pTMN zqTt-#c%1;s!G{=Pb^ba$@O5*NbP|pqK%u&1oru#3_sevlJk4mzLDO5U4o9pZ!T@iX z0O28bhA=~B;ard@{yP&<=&Q!tg;|oj! z{4SHkB<0Ka9j1PMuSv=80}pW1q~gQsG0FLDfQd~aNZU=f_q3{DVy+64<$rdh8vV?1s0^ugmb|yJ+f5*Ma-N`nn zzYdh`PWue3_Zg%U>Ox$eS(urf*#u~(^Ulmh=l#z4nY%N)aQDT^%;L-v@H#`Iczcc} z-k4*EnPP`ybB+$_)*Q45(cvhTblFQJop$ib_71xcau|=jNaD=fmxN0W$J~rysZ@gR zy}M#x0ekE-^mT7YHZuD&`UkgQMUdmkLhy3! zI-HKEuovt_Ob&a@(+wyc zj(Cu0651MXnsBw~a5O=i;VvKPNfkY+;ZMWBm@-g5rB=?;HBkRym>QfOoQ4)=24VdV z&NNLmS(>Z>r=k`Q{h$`sZ}PD0)p*d!79(>oDsmJ$%7^WIKJViUfYl1Y20Z0AffGxK zphTjw-J$!FF+fQ`>r2Sp{Z07+>OpE3D!&(Xze|q}N2bEwn1zla z8%+ag0q9(X(1K{eu31|EJ=^IzrB*ovqa0K&(&y_ILcJe zEVM2epuemEMh>4K3JgfJ@)e6dbBYZ&WW5R7+vBa9SuWf|jGmMK!b6ihH_3 z*MmluVdSd=nas6;4A)50AWwI}3y(%6<79&cC^%U&Y9j{gS`@}F@th_V34EcXgEQDCy@t;3drT;TjWGa0<@eZ??rV8I~MvX zeVx9B+DSI55j~7K7`T-XlPO8Sosa5w6XkLC<8VYk?Gy@u;z#wT7AUYFUlhbG`ZgT_ zt{mnDSQ*$KD(L~>RY6-1L!YbXLPZhUt`W2`3UO;-6K)*X9>@hLa&-$$OM`Zo9l{6< zBOq1sBhP=x(uI!O+2$dzpC#~jdm$29PX(DD4_eeZosg#LHu0(uDKbV?be5L(TlWK)VL1(ZxmIVFpdMk%F~P>LxTP933r=Amf? zC6^KcmWri@L5idH%Oj~6Y7jM)8c2rN(GJ)=9D2o zJIokYdZBH4GCUx+LpcV;o$W&%_3nVL+6mnsC}q-_g-jZ=ib-bXGw%)TSCg0lY6{cg zD1!)ZE^1G82|zmoROVrICDTvMU=}c|nH5YAbp!K|+Dl!|Br=OpUMGJM^8sp|PS_a^ zp#AK@&J+Xq0qt(n3iyT1!SyB&_WIxw+&K84X%{FvP4`i&d@#7tv;nv?c)~poV82cK zv};ZK+3@rqTmha#T4eD4;AWF2duQ-olZVzz+W>3!p!NWJx#`~E8r0oJTUte1*>bhD z*WzdC^58yb(cvh8x-%S_Zi+L(snm^eh`L!$v93Z_u3K%ga41kp*A+lI2kV5PyTfrf zjGPfpwQd+7D$qwcjgS`V$T~Bp2<}{{0t}v{91~{_IQGIcK({$VT-eof%5+w^4UnYM zyGnJBxE^vl^E_R?F5R^%Z?}%N78w>>OAUtBJi|ELZr9c37+sZ!XFdMh7`R45brSyX@>wggyuh29o9-1fHD zu0-f>35FU97rsY@w{)QSi@dC0l@Pr|A)-(b)E9YL{Y1!2Fu;ebJ|b_cH$eNX2d%!M zeb$|str=(i48wiMH)rn6>_WZ`F#x#s0>%XeiXP0gh&`ZfXE6Ss?7#a-h4wg+<}@x8fD@d2BMEeKk;DL!Nqhg(T-Zh)=#8T-ci`T#O)-rj_#U4Kr0cE54+ zRzG!nk8`CTJ}cQ?L@^(^lU7Bkq`*4~HI^!q$55pxt&GM1|42uDWC^Vt^`A7rN?o3G zudQVz?4^{Uj6Do?@l0>6kJfqjsFT9d**JGOOx--E(y;2XQ1GDqdA`L2Pa&9VHAEk) zx6KPQoq?o~vCwz6JO`D)*+K%9K$QcQL`|gLk|$H+(dR}SRq=?!$wftFB0*Y3Yjk;a zCgcr3X;M_s*b0`Snnt8iXk=O?t=YxltogSA%Xk1|!ZF~f4$(su$%tTV0A(HGs&Y%Y zsa#XuQ{GqZD7Tg2z~KzL%4o(ul@mgMi^&Xg(VY}$U@=3%uR@Dx3ZK3(Bh|40hrt~} zICYFV0^o3UkUCi1#Du*dlg$i)yM>%J9uHh7`z!>iL%{C_Ya_H6$b;aH9eAUF7^(Gw zdtaS=0opLYoxz8F7$6R_Ll+LYKSXb~pQ~(-gNu4ZJ7<~Gt!vhG=~g&5fzl6Aj+RJt zJe>$2h3=M4tP|>5bW{UJx4{wUHaV-DCS9+tP1mZE>ej$hs&osSB~GV~uk&Rua@ut= zol@5Wb^Fkk91gZChxq{y)@WcDc3O!5?Y1IdBV@y7D;+SBfnumKtOKRRz%{T9Ypq+Y z+pWG@reULXozrBfHgF8hz}E_K39N|)xqF})?wHp3Tl`i2tZCk41s*$plRsrz=Gy>X z0q7%lVoC%gxOQatkEJ^qhcJShpmA?i4p}s>IX3rXrBdt8_cuqu&rC{2arUJffPO=5eM3O z#6C7(6mwE25*2tHvSh$ck|^y&i2|^Yp5UI%mF*RHdauOyCiFV_5_>(@ai~uj-Wu9k z?T7s&d64WZp*>pn_(zs`uk}96&#K8FOtXYoqvTFL&SR^~Qx&JiYW+}aM4%s2UmCfZ zk_&t()Kpl>F$`x7=pU?R6!bO*H+{mp3G}BW50i(;IJu78K*@#(r3Zct#u}mJ#K$Z$7h)DPZzo?Zm4S7_E>yZ$t*IK^$;d;)7P6Vf)cD zej8@nEHnwzVSZvnec;_COQV~*tqk}89&||2$}_1sAc00cAkU@_%7^4Cc^);Fnnlf^ zszIW?(2DAdL*pxiigu8%k=BAznrUr{Rt4LoO$Lnx5Kqym5Ga~xTpEwoqUcaCU8T;J zQW!a)r2x1gEte4jccuBFeuls}s7hk^sRC7rP#UB<3{-!J`HVD1s45tsY(^%-N0q_w zQXNvIGg29Oj4Vbn@M54$2wIRZbJXq36m=rZW`Q~Z(oSZkTFmT*G7&RZeG~FkVc^ptPNKlqm6aVBRm5D(&-RRk6~Chi_V+}7j`QE zJ>cwc7IbFaB*6Q*^SUYBF6RK0-O*W5z7gGBxJhdi;6b=e%cRo)D1A z8t{Fv~89*jCYz_9kw)CoC*2d@)+O}jyE=rSk(^5pH&rH05k?ts5|SnL#d|+Q2tRfYOh0?c*KbsSFxJhe3eiLNpZ{M23UV-Ypcn32C>X&9GzI zHhBs>1pCd1>44e8yk$CM-Zb4eJ>cKx-{bF^_L&j>J^?(Vz&|}Ot(oqbcKDv=4bv|F zAoTor$hJ%goww+gTXHSMmJCaorPNYsDYA?U3oSFS_OdJ!kXBeGg*lddONk}VlIikN zU?r9?YrH7Z8exsHMuR89gC`1yJk%Ov#aXdV3dC4zq9_(h;zS9kr;4*i*qjoC+rl7^ zv;{#LY>TpmK;AEoh7@NDg;Z;&OEh+!eb|l#j0U@;A-mc>V%OWL01w*X6BXA!E7Y|M z>R#Ge*$+7)bZ8gXT75u=jzv+%#?Kw`kk&c>*~LJW4iMPo_|Y<@wYCSi1sR zJB?3kgLPKGaB_#KiWr5Aa9A78&c78%IFklY4| zVxiC6epq#K*n?0C8#)uw0@VIAPnwGhWnU?;)d?XVW%{`Nf%XL^{ss$0?dfc1KF zy|}*ILjb{($uMN_;b{#cU_rh-oxz)Tm^TctH`s%Z`S2sFm=!Jxt1Zs^lp8DyLYr`2 zct?0wNDvJgQbfrxe@UVk+byxdZiLYS){BP`=YTd#sS40hnl=TM1jF^``f>eu{=D0U zC81oLOOBS0kPAU8uwvz9pbclJd^BEPwEsM4=Qdf7a*4r1-h?P}c|L;y1N!!J$=N8$ zC)3FWa*>=y0nbIdN$aACQBJI?n$f_BQdOaCtC^+h0j83vVy43l_s%{uv}x>gn8#T5 z8q6g4A-JpEnFm0+EF@Y|MQJd~cq>!Vv(yXwZ*w1g+gEM`$qFEr$cs_woHfd+x8(-7 zYZJV}Bbt*ApE`luJ#b^DRMD&Gqe%ekR&>*PX#I*?ie8!=@W(?c*g%3RMnz&Is}fbw zsx&zED+O-6q%a67DkC0lzQn2UstgqkMns1gt4dc98DxO|QDDN&l8tb`Bt>1Nu292H zNX<}}K|aW&sp*hY;YP}GwT4MlR|5vSF1Um8^KIp@VTC}<)Ml`=L0`G-97sV6K+9w2 zYT4?1z_Xkj5VN#-+I-0OLI^h)wCM~RIt1=14COumT}N{F>A{~vNjNtaQXF?n7Y6yJ zZe6!uzYQD_Tu*&8_rC6)E{40K!@AmlH$AB5p}%8TG)x*$@Db1t@{MNrM$~cw~9Wo@xf{bAIP!LAZ1%9mL?0=LblK?B*0g|BTy}?LY9STX+%9` zGnzVkPPV34GeoK26B8jOSTi9_x2B7-tVz~1Ylf8o_+E&&5o~d`WE;%3E!CD}OS2`~ z@U|4d(`^Zmj@p~S2R1=uN!XBrhXPy8U%9{Hgb%DATnB&K2YYq!eB+QSocU&cKg?af zc~cJg2z;Kr7YfN0)KR%Y(MHFk8ZRO@QWz9E#aY^quBk$p*$8tnxrAIw9)(o^z8Thf zv)T!P_IPFF7&()|qLj*EO}o~%60BSbwNaWMrurj2u-XqX}q3(2kDT zs^+M<>J~LmJq$Q_Ol^S{{37&P^vI?_U))1r2l3oQZrmfw2;&_DS~zbF<}!k}Y6ykd z-V0IYX!Ah<&Wtrjx@L`M*@7G5!QO-|mR6XPHDR7L2Q;1~%C%;TGDYi92AD0wmTAkj zn(Q3On7w~Vx|D5u09q|4H&LpoWAZ8(Uo+#7(>BO#ik=w>J(j_^%ORQ|!t;hUs8B29 zw7uJM!5g?dn6s>v!DDb?++aP7c6AF1!Cb(o1!|$1ukKLaW|pywVDu&05_YM!lwAyP zo7zi%SnsR%)~9d@+$3%?*9S(u7gAAOz~S#8M>H?Sj5o)dy#-zZEHBO+3nOnwt&eXJ zS+<2;mJSOd6j<6Uot9itfmLY97ZqCbM1`UvYmTS@{9b`A&z5V;x8>NJtrOr4;Ly4k z*phN%VlzzYq_r^==y(k1Ou^28Y$7*P%rJ5#Z3yPNQ*DHj9bqMEC*WI9d+-rdkePQ{}4)zz^~n0!FT?-KCdNrU-1TTw4xSPzHKP&+Hu9?^0)Q*A0hZ_M9QiwQqn=9YBf! z+89V)0sUlg_qS$qGr6(QgT!)ASPYu+lTW}H^$HD5rx-+K7BNax#i~w*kkP>?g0|sV z!4#_}nI`5GbDTNBw74`>#ja#mxa>GUpTo`P=E9s|^hJ>7aRc>*+ya1{Vbibyb{x;c z^Wu10246vv*-wy&j;;jk6rQo7Zc7Qsavw%HZZER6NX&MRRqu5ln4t;KZ40_)VGJNC ztSy=j#g4^E8vC>Sf$w zNEsyPqf$jt4KO&W8737lD^t#(Lq4FMWmc#Zj5(%~A!Dc*G*vm=@7xD{z#dCQRyC;l z0lo`9fO;W{k}d%c%ta<8ydKDE{hwZ-!{bSE4Vv` zB>g=D7J5&B+7WOcFb!>)%EjrKT)dvljfOG?m%vNp?SkD!0ao?7zMT?e@N#$_#vnl! z?|?Cnmux;{3=yR9GI?ImtG5wjEZ~L0dOBV-^Geiq|ExBOxspcM7&za_I)c!Ld#Q|r!8SmmB zLj78lz@sD2+=s%Ef;4lM`GGJ%0LR;!_jN=Fu!3+w4qE?~MQ%}BsziF=^y&bw)-ecB zrKsO>5HOu(f5!pHwU$O}xhNYX8Mcr_O5mt~)kYLaEeeawGGOuUC=+=CU%6ESWere9 zhNuF#T2zLv(7iEKTh-!HE6K*N(xIFxQi-WnqLl@3scny=QPcqZ#eh*Dr(3HaWkNaN zq7vJHm}aGk7$UN@Nkp<%S}UwdG1FRZo3szYn+6eTRYSDcL1J+OK$SM0WCAd_n90^A z85XxnhQtC%l}+P%KicclnQCB{AbadntTIiwy&S13ozVK;M&c|pc0;H)N3Ls}&l zQ1}!cr43|q1}4=ezbkK~PRrr50*LeSS^1otLAA>5@;iWk7A&-R+8k|Jv7p#c%+fZY z&k5QZq*mIJVo@_VYPszFtlR1d^#kU(dQ3eH_tkGPcbT57R`#SCVIE`|T^{ltvxU70 zEsvM6M8e&e6^xhF|CTdcjwmauu+J}vAB*iI@zFNK@nVV49^ z?z|VCU8V2RirH;Ys?^@pwzJ#ezIeV?$nMvww4H2`wo}{7?qT!T9qcalEvN-PTq|I= zY8BdUZLd~_Qk>MsLkf660awXYaN#)vu?+4@&(~A+9o!bcU{9u}^Z48b;8Jnr+zNd< zK(OEAlHh*zE^arM2zY_Mhb!Wy0#wSQ==1b4ZlRv6mqPtu@OG`-9DO^t7ceomRG+QS z)K}{{+&(UkTf(cnZ{~fn6ZpUg7OAl8gSx`6ke_|)tF~&;xTyyV=~YZjWI?ta1ePy zZ8+cpbA+*i*T^e_wMgaBc#*~&W2rgLh%+*H@y1x-fOj5VF6xCV&0I6z+-S}ebehuy z$kj>eG903LJ7IV8f9e9%jBy*Ly!%R0b%++R|nQ3k_H$i!_z-UPo5ClRq z$IJp8BsGV0G@G*oG{C4R1wQcJA;>kKyV6QdR@q;^YC2a7jv@dFR- z489#JKpnHpSxlBYmVl1CmIPFK_C$`o$XsuJ!4yjPoY;CcM ztlgrUfVEnqj4dLel>>Y|qIRo)hd?xgw$lNnVv$7DB@zL|7j;@&MZEw$9t>imm|>d| zPkR#vq|Jfs% zx7)$r-voHUZUgA9T_WiPY|bv0bW5;3O}0pMR~*};1K%Ir6Vr2hX?Q8BN4u2Ks|U)+ z(h#J$9?wK*3_nxV%i$$SM{&;Gq#tuXTVd#8?3Pzm6t``QmoLHz*8{hKX4uKE313qRB zq8Cf8g*RSyKYIZ3y)X=GM+1?jAK~h`YH(OO?jYdslr;`;o58}Jfy-;*6&Xv79A1I3 z1gxPDVjgPCBGj(JJJv1J;yzKAwO=F^-L#6W5-S&#h+|u_FWUPg{St3gNz;(Sg+cfWdtcJ zjcvRFkfYn$gId$F9pAIOJqK;{s@51jF!p&Ew~Rfc9n@;Ix7Zr3vu9@*}S;G0Z_LM2rVsJ0m%jki>Nss{|EYKx&#?J({!22~oB zOts0_VB81J&%%;=1LO{5`Lpcm6@WrmzN}?6T;+_)u?7@B*0wqTuwd4LdR4utUR2)& zDtrT^UPtqXZ4I*JY!w^k7@{6VuV4>Dss;?60FaJo2T=GSKTAKsW$K&sxGUU!s26J@N zTr4ON6bbswy=IBI0=1qVb0=zHQggStR8S}=7xcUQR5Z-Pwq?t*X^C?AC1*Rhj(+Pc z>n(Jx%S3W(pH(4}!pzG>y^zYRHu0>u)7AmjBDC=!ZG-3xcVKPLi08zuHmjI#6WBy3 zy&X+g?Rz{jSk0y-sbq9%Y$>iMyVn=&H4ELp1+52z6%hJhM%HH_o!CEf}o!3F1eLDr1ETpZ%H5`>K!%g z+_VPm5PKMALC0=JpNzB6Mi1zvn|I4xKCx@*LgkF_N$Imge;c@HG@QhF*6DmQ4GH27E_a1Z#! z+CJqDZ6D+w%0o(!jCMe|OIxQsfYQ&02#{Q-+7GFJBc}0CV`QUuqe&Igcw6PuIIFs& znot>3;f*t@pvC~;v8v#k8`YRV2ArwGL=@)j^tgO&sfx zCK9Ok)p$*uCQ%cm@zsQA2rMiso|VN4XGKCg&ahvT&Prs(XgoBTtQ3|H+D-;5P~)vh zVnu600gq)RXuLF0EUYF#gJ*?lB3Sp-sjO*s3=5<2*LXTPAV#1y!&r9hJbOV4>qa}l zz6&!v3h=b{E~G~7x>oO6d28B5pe$+4>^Zg-pjqv*_73DzT9ekSo!8C)3@epA%3jru zYiHS0Xgw?2&K_gmVcWDewgD)&*<-*rp`B!}Xy>$(+8MS5s7AKQ)r+%@|9R*G3*_nB z^g_sQ>H8rS>$~&|+;07#o&%Ux->cW_<$60;roY3z$6e)u{c$(ATqslPb$XS47$Def z>s$0g`X2o}cMCX_`ejI+L7{KeZv(u;9nkM`ZQKsM2IXJkB3zMPsu$=x_3K=|evZ4s zUF6=>kFzDlyRN!>Eqp#*gVJ83(Wo|#z?#wWx{O1-0a$fXoJa-xke4I!#HGA@B~JlvEMkr z>*X1Fw~R6)%Xo{YGm4C2C$CXqY%~t@^t=|M(AaI%@!E}j#@kS$g7}Yu;ZYg;5wvQi zf>&HNkC`XUM(~4nv(h{S`Mi1EY=T^4o-*Gt4+At~9)uLeV>X!Sg1crLU@G$>q)X-% zGfO~*cG~qi^Q>8KZV+$<3+844Q=l-DfIeX6Kx#J2ftw+)n6>6c!Kk@fVBk%gZyMET zyK`oWz-lH6Cd^HO5%U^KdpHuBKsxS(+0e>o;qa9A6xjaMAxI;qss#8B%Iy{5vZ zk~(6*hvNYAn2Lflrz2=8ek!ZOXDYVCcM3a|(s5uaqa(hh(sQ}->& zP%8xZ2^|Ng0;l|@FaXDO;HR=X0su;Y2;b6LLZ=ctGCR^c_DzLPrJ>J?gpOde%vm1& z2y$Z1pob@g);eIdSjVjc=##{1)maUqF`$DzSVygT(IUWit!AqlrA=99tXh%5I&4)~ z)uIuobH{pHq_i$rC#|zq9ooh;aLz+C0yZo%SvA%rtI9fO9Rz#?=(nvJkxDdV9Rgel z(Pp(bDteTjCMhns^ns2Z3_a)@|#x>1`U@B2c72 z(Lwwy$lNfnKFPs_TapbsJS!Fy67L20Z#=+T5aFB9g*E#FfV7eW3x^l(+vO6Eg?0NN zJW;^{77)7%pk4d6eMqunS4z~9{R^A+L(qaJL}y6sxwDkolh(6`CG^ZLfuCHOSt9g| zFHJ2a1APK0dm*JK32^h0Wy$KI1+8LMBj9Nrz8bn30C_(8)ZXI`T+Qnpkc6z}_C~G- zullb}y6WTrkKbzeI(+W79=4haPj&2i)OzT8Bv3*i?gi~e#QL2+YoBIgXaoG)#^A;* za5{r^b9S@1e+J!;gQwoo^iOVCwpg$y06C;<+bi3v+v_L>Z#M|MHIUok35|uPnoZ^8 zNzyn|_@+<0r3DWPaa((zds~kHG@>`?jrvjJ7;nsIHkx>&JQMhc9rLz%3s&N$dBfZy zK+L%viBri_c^yepV_;9CqGi-pCv4-kNp$8Am{s3}Vdp!_QhE<|wWNQMe3K%ideWmB zaUchLuf%euJJ91^Xmzb$DrG7a*5R6U)oK#0Sl6u3cWgs0#k5L9HF~Ac-UsOfY zBb31a$IuVaLzTYtNacZny?*~*n%-F6xS`4eE%^>4K$_g>3EXR{Emc-yPUDWMxG}Yn z(3sL#)aW&k+lZ)kRoRUNjrUZCfvbpB1~n2JeE{|!*j5D$cnoAVuB$Q{s~Yp6WK~t9 zDQ&E5+&6FtII0^<8q*r_Ku?0WsfugF0Ciclq`I$KQB^csN$iF3fAomegl=7 z2ADIlrUX)W@6j}BSeimjF{^^*Gt|VQXqq$?ngX;8S{YCLasIgXjB#&`F=x#=E3B%Ss@B5YTR*Jt)i>z- z(B7dR)c5PlnT`6~arU@?S<39umoV$}g@~I`eXYJy|8`u-%wX15edot~|J^zV*+1`} zkSXffwU_~?1KV})yl)5XyKe%1xi2*qu`~D4`(d^N{ayhB>{fO^yP6%mf4fiL*Radk z#YTAg{U>7`yN&(X=)eDUAGt3wcCky?9qiG5%zHdg4M)ntWCENR0Xbh0q>=jX21^NG^6mY+? z!>8%TS46b`F>vZVEjNcwW2eE>)M=Hu$ef=e_V{v|JpKLXKCLhpnti94$INMyxfyLw zr)B2c>95DoWBBp+Y5Xzwn834tofdH;kG{ue(1Az)X%=<%^fNa<*UMvrxzg-8tux2* z#3-P}962p8Cm-J)OS#47&*tc3A-Bf-#oTCqKK*1a!KhMl6^YX{dY71sxv57txzAd2 zwYi>b%g_9ORf3P7$fx3WR$Gs)#3n&L?zWZNDv%{F_#-w2zYA2M?UFC$*W1c$m9~DH zfInvIv&s1_wr^zizTvCiv$##jZ?b){wb=%38c4+aMvSepsX#0FwYIOe0b8l9&UVIc zw_WjN{AwG)FSa$G-JMx&Mr5PKIdH zx#OgYaQZo!z{{dZC(C&vnssjDgqnA9oJ{AUh$3q69E&zZ(~uoIw?#)zfpgKh1rBfA zPP%ggBk^AEToNsa4oG^s>LkG2`-%hM{PD&^r8Tou{R_MADK=L~TFwJbS{Jk=iOS(T^F<36kO z;IFVe5!?YvJYL{>PxLu)7C&qB6neTmAxKG3pq$~~U5=d;*Z5b`e`Dmj0d zr`zKLA2{pvIL?|qzn(fgcHA2(FzV-7vFGXR_321d0Pd^jv*(k?kG`$o-k$0_wVqB- zsV5A{ze?g6H$vh~`pF-7E+8_`Wkey7daeomdj9Nxd47J*J{S2*{J*8e{vx7+fL8+E zo=b=v#)Y2az`vi1iO_pD z+CnX%N10jnQ}#7fAF@K;9BK-+hn%2($Q-i9kXvSxJ;@$qts#7m0N}KaUKTNSKtRpCgeOMF8}qA{&`f1S6qHEHbaaZ3BR~i>xTS4Wk-BTIjK^s8>U{?IlR7}&K7Hxuv_HM7Mh?liGx(J-n^ZHh ztn6_%m2Ej6Jm1buT8+6Y>FR1s@s`;vE z($s4jaZ={X4o=5>p^|m8W}DWasnt+uEoiUP?9$pk`e6-Pe7^@E7Cuf>#0_{RolQTb z^XMEpTYCcjgnp{!qCVDg(U0}fmqm`ukIt86{fd57U(1BQGN<(TF0EhJ*MXbR&*{hY zi;%!_`YL7(a}D&Eeo{Y=dO^RTpFv%Xp8vH>va4}|!1~57s9TK{#uno!yUf^bt~XAw zag#ANL;e*|184+bX7)I{%~)kDH@1VXBV|n_#_a`l8MmA}Xs$t)Y%}+nTg_j%J?1Vm zv}&$^tRK{$(qaB;uH<%_dp~4VXwR2{fAm4#ur1qGZ4~4)Gk+XdkLo5(lQI=Jj%e63;F8Am-;su7oyf*?a%kAC+huG1oi=_@z)ZSkT&`oh!%gVzY#LLpUc9sj!++B zyC>wAJVL<%iUq3Z_Hpyv&n1A>aSf*|Xg0`FSpl*xRG+ zld&WC8x;{*2J!=1J@W@Y3u=lj5cOR_x7tm3uNr!d%5po0G=WyA9WvLFp0Y#Q%EmuO zEA9i(=!WuTXW0A;M8myeFGC&$=GF_W_K97jrH6aL;<{`RzD+2)!t*bk zBGH9&9yVO?`bjCuum00rahx8wQ^AZEC>2s=y+e>%4}gaF?aNb`bK6mb5B2P+}6|3 z@~89}hY;U`#wqhEv;b{@>o-oC7f2n=vwMvL#zoL`>{)h?aTKljGGksw??&#Dc^-B1 zM~p9$GfbOj%?su^a}#&P+`zRXCb2IY-A03Mo&2BtW7J2sYo}P`AltBG8xt~(^TzoC zEuV?LIhV+|$&dVXw&>aNYkr|sp?Hg|D7N6$6y>C9Dmj__k&2|()V_>2^PIWdJ=eA|m)K**tKI#p->@Fu z1V1b`aWi%^elv12axnVgXZhAiSb#$t*9>dMKn-cQv{BS-+6k<7N}JG(fO{_rx|)8g z)o8zI3HrVE2DXvYnb5jktJA7ry-TeDvTN;~_Ph2fZ$r9Kd!beSjhs{ck)DVC$9kb& zq^IizdM^Hn1-`zU2~P&#bU`Zvz|xELY<(9~i&?%hJIJ>8HLMsXjpMM_1YjPpV4N|o zvloqX#%XY?>?z|idyPG7Ts5{cSJ=zOCF2JBedNFJ7HLuF&)fqW?~~l2nQH#Z-81i+ z+qu1v_Hhr)t=vuXx_R5YX71*0n0L%Ha~rpd+rjPp@Qjv^8fQG8Z}aiRu=fez43IBu z8wZrcCb9`^LL1k13QlT!f`9Np`T1^sfFA_s<$FkbAn0de|zMv$~zbmw&O zWg?wZ@6goZ)kn@qGgx)}cy z#jPt@0!&pFMb{Mt(ZXnHbSVyt0N%^Ca{hy!QvH#IRIzkWl}Ja^@w86O&R*|MY0mT# z{U)2RbrL(ubu}k@gD)x5njUI?j0qm_0Qgg+dP2X&rhM4+2)0w$5nMRXI0^U!o?CNvu=kCsI@6w7g2>KmSMp3kLhC2XMqC)00}v-WcbVAtDS z?QY5S*um(*1^rP=H|uu4@9K9A=$9|!2NMTVH5FbPfF$YqgTA|DpZ%cil>?aD+LEwH~prKu<9znAdu>ew;bR9AsYVFZ3$?BwEk) zL%_oT{8by9Vx$@w><#0VamToA+(d*PvT4`}&pgf@n&@{(9!96uka!<^|+)*wU z`(>M%QrOjmo}}<1`oLuIh;S7W-@|KJX{ao!||{^EKjkdP*Nr-mz;V^Bur1K zL?z;RiX`vPpMYk^{qz1w|D1o?-$Trjn(if#BLFl0DU#3k&B_+Y2+7EnLyMs$lFohH zR;myw6h$>KZi0%M=$7J3v=&?iDcM)9#1E9yh?2_a%tx$*RrVCVf~k|~O*OJbCZ$fJ z#;-@d%ahBjT_s|B;Er=G-!-&px@E=j5qpe(hkS$U1%P^FPUed zZ@zg3823tBg+%NTc!VAi87p}iZlzdt9l0jVn4H0FDU~+vE^21TnGi`_BdOz`&|#%y z0ei2H&LvG`T!?8Vx?TG~H^OV~>EHCTxY1H_`gpFl1Ty+C&j(fQ=V?$p7GW?6GaThd5qtMKS2t%Yu;d$k^|9nZ4SAAx^r zom!U`Uxw)pt(ET9{`l*=TD?L4U9W@J-U0IEUT@Ujg4O^QnM+uoNv{XZf}S4q%glw3 z71Qz_3pg^;jmJiYk!|F%*=!#Bz{qEx7*E+uBZvJyV;-NGrDl;?O!_WimYWr3iCJb| zAhm6Q)*QA6oAq6LwjZ_^exU$w%KS&0*>)=`5xhYMMS@qp-Bv8H*$M=|_@4z%o5$%R zz4c#D$y1*&5?=|N-$c(&jmYbCI-i_==Z(mXzSR=KBZWolBsG#VPnARhy7t4DH(@Ud zV9UScU-Pf}m;FP;FfmB1_}Bd#kdF|UTfPk+c$KY(-ed*x{BwTGsG*I}FBv7Y7TOAJ zl78J3#Rqf+Re}Fn9e`UCd}ckKrw);OR^w}+7m~}##pF`b0YAnsTdF|j6gSF@I-AX9 zht3~&f5JjaXv+nin0Ke)y;2&!Dr%p#E2REa=0$F);In)uv=LuPT0U|wMYE>a&}?Zo zHR~FJ=A_4A^N`jLjIVVhcGI8eQEfyU)&{geZ9?n%>k0Wj`LcoecbMDEpL&b_5q76A zg~m0eP4CpZ^$xvRPi5NmKlH22C;cwdrQc*)(PxXfj#2-$2-%1_GQK!Qu8|K)VB{G^ zkcvT{k}dx}>e9T#)nVUiz<0p8`2raE*L-WfF$>ts+$-}p^9omEz9!}W8XbnF;;L*d+Ex#X zBy1_zumMz~Ao*d63akGosIrVlkPJ zbC@T`g9idgceS*}MS?76dk#*SU}8Rgy2T zXKXLFH``aiE41^=mbK+528|6iR%$w{ik%n zbM??tx1?Rt3Hqy~%I)M%l8W;-o6bSwIMsH`uIHiQUClX7P21DtWuJ5r`kOXN zYL&;#>eKpHJ)fD;|I+95FQm>cjn~i<0S~$|%Ggvcg}cSI{PmzBd#9ia`!BSAw&&-| zmkO6fWENGrzCZ)Lk{;}i>o<7rJ$If{KikjqbFja8g6#Sq{7|J_5E7C*Ia1KEi$(Ib z@?CBJ$jLa3t%}wXZ&IOZoDMxeiS2(^>i(b{ zW{-KF`_1^%yvwzj>0GDzi0d*lxCh*0?jbyp2G|2U{T-Q~4LTOo+7Z9@Qu`NsiM=1z zr~scYW%fRBHTG(IrM=2tZvQE&w|5Kb>}2D=p-$M!Cu#-uimHKYT@F!`tI^fsdJ@&U z>L9^y<08AL!Q~XSx!S=uyJ}o6Qn#acADE%To-+%6}ldlpA zzreptocY%YpBjkP+**D++CiE?I7E*@fq?gsmFGB>{2yj=SYPmEd30;I#p>yz} z&~@kwP6c)7HlzsE%B$qEkT|3XEfV>8{#E+P6QDOb9Azm6qXSX4Vk~+B-yM&RM2{7t z(Y`2C!B8B!LmS59v>EG#Jpm1AKQ`Py}pw_GJ)S*l;gB+C=WM8wb=Xn1+98~+6?cIn?BHi;`xE#&##Aa9j7%A4i&;F?HDer}FJ z3rikD!wkSta!s|aD#&=CyHC)}@9a)a15MyAiA;E?xum7(Uvx=&g)T==(O>9UdZjKy zCzw*^SHlIf!O&(Z|iMUBtU z1efar*0POk1N)Kvz`le2oW>`}+(sSSV~iNTvt7oZF=W)U{YDd8!@g&Gjo;V-^uU=% zV%X6fH?z4pbJ`p>XUwPE2s9fYwL2k5qCVli01LPxZiti$xluERn>EMGDewt1j~g_L zxwmXS_l&emes0{!1)cV8d#`=ajysLL%{~UJ^w6^*!tT?6Pp;Tm;Kx_+b2sw*y#s?FH?v>Ozs>m- z;P06HWAdNm`o&nOC@zdsRUyn)n8~Wkuk$^wXp7|Su8PbxJ%)Bex1rN;!|XD2Aj`zy z@o(l&mQnkdeM&Gb7_pDrhwYQ_zE5J@iUe!$gbhi|vk5C65>CIv|I_adxkAnlor$q$ zq4F$Vl*y?@S?%5p?V47jdnNBR)w(`B;Ttnr?r#3jlzB`XG^g!xB4w0OrHHr$h*06UxVy`1dNrXo;3G532Z zv6NbhEpqHUUlyR*ML;oZy6vL6ictS4zp!^iI*Id?myE3$`LujeJ|&+;bZtZlg;XJn zv*E+}va8-v8?iHJ9e>fcEKqQl1SOc!w0C&*u=hx|9BG#Db#nP;8NRo0vjn_)uz0h6 zuy(L=vqJhK-cxB>8bgCGw6y$OI7w;uG(BjRhORN9*3mZ5^Nz+uALs{I^U*WU=S#b; zlu^d$gl<}NUv>SuUQp$XVci$TfUZN=1`fQXPglek)HUn6btQ~SMvtzBQN_Uba$N;* zm#&&o%orkj=6mOh8M<{bADBkwn8C)hFega8|6q5^MV`f!cq`opTYZ(1mJL^!vaY^k)Uxi{Qe%LTW}QYt>@ezAPxs<_I(yS>_98EVh*t( zS17ni+ukEBKf=qbH{C*ab>bseF*NXA?0Z`7w!L2L*gMgT>gve3=Sc7J!*_hlXJ&x( zp;=PaVrn!sn*!_*JIHP@h1pH;j8;nAPWjXRjQ^D260uM;6o-zsqf}@{1-+=_O5k0bJiH_yx+%#-GUDvdy-md3rre3W zwwl`Uyn^$J>;E82<#pAyYp?qH3&~S&wr|$SUm^01lp6}hQ4cn5)^1jBHgC2Lwr<8g zB8#W7(zqJF2B$6UOk=09H8Rb)#zRwTT+o+LLulk^JJmR8KWHM2o93ncgxpM%Y6Kd! z=9%_HbI>H3AXBWd(R^s(ptnM!0{*`%eT)vq0Hc>Nt6R`@GH|ECN}3rxp!yku461G! zd=rDBYh$!9>KW7EwsiBlCEYHlA;zYzi?O2H(Jks$bsLc27NFbKt&`M*ZbsM5_{wNt zv@#kQ!;C52uAv?C;*`)8+~(_lmIK2JY`O%CZW}g%*#H_~3vg&yF>DyPhTlwvVaE_+ zatsTQ(gCl`40GO)VkVh6=8+-B%rfV69hN<`;3%M5BmV4 z0Gwr z-$O7WUpRKM`an$kz5UqUBQ}udf`Y_!*R`uvEOx0~?P95`P0Vy@T*ods+8AUz;ktC4 zyF@Ooiv#}Db>Y&x&Rk!`_*M!22GA+yxmYfls~0lFthh@oaIqn85#QOH#Y#|(;(l?5 zSmhGBPF&wy5?7yC=js+~(Q@Uw1%C3hb#I5a!CU98Mhi+SNkc^Q&p$%J>)yXKw! znEm}3@3;ywnxs5{hzk?~i;3bu&R-BH4G4%cf=A?g{qlc73-UPdtG_8w6Uh2Y!f$>) zfx7}^jR68wUEsIBC{Pyo9B2+S1Zo39LPSW37k^7YLR69CD@lxBpaKoyPvPQleYhz6 zD^w6hcE`D!3{{0|!if+?UKcJ8AINLNpTjhHE>s_=2$zOap{DQ-df{A=XF_Ed(-^J{ z{|@cTx8+~LZ=vRJHdGj{4!?w6L$I$R9Xgb&6kFto{HQ(orGgVh97cDdwCHJ65ama& z6<0Xb;muKD^fV z#c`92%ao6CJ*exrIc|t6l`5qP+)bQN%9ZEw+xR88hqy6*5!Zss7im(h)W!EzhpIiC zlFFnwDNIU|BAk`@l9iMvX(~G8vLr)wq*9R5e9Hl3e@apnOJ!1N)mbu~!aGVTnfjG_ zNePlE{4>pOsYEIZ>1!$uT#-qsa;Tx$4oFrFs?Z??Tg0o0q;2S=%K65t6Ou7#2=L!(Be1Q=7&b8%j4SWr> z!OlnWmar(gn{(r|ztUW5E;SdL0A@MV?d$SS*aIGAj5Ed<2PB`D{V6Jg+(3}$O94w^ zC}Eu$Zop{_65vACt>MZbHpmRuhI4}wk}}pegOu!jVGtThSw$>0xJ!e`P|W(w`ZMPj z&aSDF109-S8!(M+l^XkXXu^#%kI88IFhhW88xdIHlQ*+NC&TXbL~FdFC%bOk0L?F)1U`cY2>+5?k; zv4Db*qYvVU7z*4(^VEB33!lh4!(YR_;o)!xGR92!SUwi+4v&Y2!js{yFh|ao_k^dy zt>K9<9hqVv+#enZw})AvPvw2#(J)s&h;i?QA!o`jqH1#fZ_%r$29z{<9{nDj4lANs z#jaNpy^gA)^5|Jq9Mz#!7A2w@#U-e3WS+TID5F|%wzwU6;7VzYpDW#!7l_?#|I7o_o(K~(Gts|9ke5+{xdkS}WDRqaKz=L=mI zq8;lPx=G}W@0jtyP|h+M?m$@#dV|4G!NLjw_)W)9#WEXAhI>OL>kI4gse&%GDkOYb7tA3hz} zKqOof%YjwYm&9yf5%o&ooVX&^1M`7}z*=A~uoSo;=HSV*VZMAhEF@1wo_szmk}r_{ zy%=6WEr8q@&9D0r*bu!Z>AR>Y`Vd_T>q$X|58<^UsYx4iu3{etUj}^{+)TvKo|A-SGFO2UruNzgpP6E)O&Mta z#jZo7#Nq#Vule|%(*mE%muA#DOO~s*e7EHJUv{0K&|Ts#hK7sWw_crBo7WeSZ^JqW z+-2me;q~wuxx?>d1R{&Z6PW#5@`OA~f2$fZ4Vm_Ha>##+b`F@jX~w1Lob;y))1Bqs zQs^*XC9n1Z$0x^U$9KV-{kOfyf$tRVQmm=WZSa04^PAqg8Q2JKhV@uODy~Vg@$4_@ zrpzHU^OpIN+r>_28FLJlF295m-3+3pkp-;*>R7F;T2>qDhoKo<1FMDA#Hs;>U!0+j zHqJLw7pb2f&R5j!fNOGvt)Om9on+gUse`PGc(}s>5RaB(UXJ@48g~oI9cIfL>G?k_ zHcKJe9oUr<;If!3MvL3>nfKFT2mgupi(AUGSge*ua0TQ{uX(F+%N%xrne_jA;3t6* zSTFb~un8QXOaiOGAh;9MI;tGSjtXeVDX4R}1drs1Qt&m7N=LQhi{po&#PL8%p&|E* zcwLM<0bTBjtK6HQwUQceJK{?B9=Lp2MQssm0I!L+#8mOJcwf8?jv}r=&-Y?PMCm`W z)FW!6*DP^*E#4c6%lpH7FR{T&caoppTZ!F!@5P^x1q|q=13Uok(E8y0CNX&*y=JdT zV)Z(_ZpbVWJ+T`&3LFHs0`vd{QMV7!5C(#Q8fzsGN5mb$3>*e@1T|nLwgWo>3-LgF z$E>#mD_}*Bd*V3ooiGw6&`SAEm=UIh>F`*Yd>8mAd?w!ytK{3^gD^9^7dQ-4!xA|q zES0mug#0+HkZ+-v9C5oBwnqKYr>Hk-i5lQ%=BQC|kNP?KGir;vqj(bp*rUFv2lbsI z6b(e3(O}dCE*IA-3ldoJf7GOnN=Gyk*DJH}-((ctDesl(_@~6@#7q1&{ucigFHC$_ znv@2dN;;(u(au-hk}H+{cR{dKo&nmK?5UW+W>fA8uNx)(5GPj5L z(ZK6(P4$ji_mlS=`cTWm(IV`rD7$}PGkj(BavB{C4y(lD{UJFCn?AC^()q!`jmB=s zKcNpXqBZF-&yxkw%k#hwn;lJ#7WikKyWV{u{z2FzHUhuPgz=w+hB@I2JSP$@Nfak` zZaP@)EC=TKj`6r3T0E9=#7CRstD_a;apx0wF&|BQ2;cO2If0V^J76dHVIJ%kkH(_W zXem}p%N-ufBl;H@ovbdF)9}-v$9yB4Ax=MMm@~*3z#4HU<@vF~kl+iiju*5v@alO@ zynw}Lso_=fs(8Ns@LHF|E#bnu`2ilVAmAWQNngK_3&NN3Z}`XE zujGkn8a|Z*B%=?CvP5~}L0OS_ByTYycz{q<56k0hR5zqMGDm7UtY4f3|3ApW`Emby zg$BPGQtSz5>% zUSeqm)$QnW^f-DQgN`o8kfYx*;9!ZHp?kb#!V+<-@FpcuNz$A4ro6wsZ_q^?x(ETV zVsPgHCxPG00xrTsD4-!C@B|+DGoT7c0~Y~VKpk*H@{^F~Tf;i}t^B)OE0>1FVG-g@ z0)Sq_#W9=WSM&v*`lu*~eTrqGg|XM@4@EBeIhKu@6;{RXs73LH_M%ulqSL0V0d4>w z`zz}b4*2vBKrJM8Wn;oj`ZzhaN~*%FNr}pov??ExVpXBKSlyg1Qa8bRy%~nOCv&Xs z%5-M>GX0qncz<^$KkhuM%&M~LYzJbYE?1kY$<5%7B+VV=rp_4$J*<46_woXL|Ffh? z?Oc-4Xh(KyB3JpR2R(Ou5T>m%R^YMyn8j!4Wj!1E$ocFh3+XG99GmHf$!eP7I7~lD z2{N&@z*=lAv3{{4BU&qfKU-hnH|3!4_ubYaYpM0OrH}W?`ey0n^}~C93l<&AjwQ#s z;}=%A;#hF3I@TPof;Yhiyk*!u1P>T+54t&Gu9z)86<7JHedRvnG+$QoTauByNpg}( z@bGwFneUVI7rCz&$t&to$gcxFBH#Kg;3u?!o4{4zHt;N_y zRA35&tHVtTRKAR{0*07jm^B4I8fAqIQNskwZwMJiSc9yfVVo5)OtOYZAItZ4nLMT$ z4n}j9IBwFvwm8e24bB{7)0|n(Cg;ht$XVema8@~9(>iCKmWgX$+>)_yM>9-0a`bZw_ww2O{)2yb&H8k@ggjBl11&H6~4xX3!WlcbYgY1$!n)o95dD zx-*>+7TSk}4gg}%5*-1&%a8)&p7>$AJRLTPbaBHkL(YKzEZy*8cs0zjkYNo8!whSV zl{Wk~WDWU#6i&?aY>JqoCMs;@Gx<$?UCvBG&9{@iqDCtfkVgzD8e(v|QTiyALD?W59&SSA~DbD`Q^}->`73 zGtrT7LeD>w?dgv6*Yr?^r4}F17>A5S)&lF(UBTTOb~VpR!MoC?xM_!z0G0gfYu(mf zYp1oxI?d~{&XD_?|Is9D#CjV5bO(d`CEKbSJ#Zx>#4jqkKwwl7z~QeYyah=`!4+%Cnc*3*@ZA^Um|D>}(Ekb$)h` zhIce$1neOu)ax`m+wZy&jBI$Y%S zqh-{(40^=6!dv5wgP-Hg^OmiPpcbq{c^U@Mz&dQ5f%H!ix%tpO%b|39 zb8sBJ`CU0$gl)n>;R$J#ufh)Dkgy%{_c9<9LVoP%6ABz%!fQvr@X~SSICu02nT{)m z3T-!zRF0kVzbJV6~%Lc%JTc%Y8`t$#?Y7h&S9v?i=y0`&!I#Q{AiXTd{y_ zU3W9xboah{*}deZxKG_$G2gxE-gei+gZ`AS(kAJSkK!Bl)qY58q|G1Hps!In>+AOo z_^PGbzE1&a0A&ad5CVk_+A=LRYS{(v600aN%%?v?)t|C9&AuJA+n zG3u2A*Owb?wDT@S40)Pv6!L- zlGa#ftPiy&98iqKhGXNguGrVuNNg<80cjX>gcRCvL@^K>iUk#;u?9$+0smg+6S(Ci z0?Jv`xNRnaIC&;Ok0fHsxkO)LF!8Kh06&?SNko)MWn4L$7yutqhLt@DKYII=QRQ?Z z0ct$4m`I_{mtpjo0{p8alAlwlBgw*4F6m1Kli_3*t#Vb29FgyzFaCeyaMmV!(?jVR^+*~y4tZ`MJ(jLk zSAeQi_oRo@RqDa?7j<{KKi!8OUFlKad^u51W@a)InW@ZlW;8RF8P4RT4{1S|iJ{bd!hZFK}I4+NdBl4&`CND)C;;mgV6`P1n z#uAFOA_;HHm*vDtA`K5HPL-xgQYuxgdNMtc9#6kuFSIN8?Dg|r^L5*G%k_Kz;~QA? z0QNs%-4F-N8^(?7Knng}Tj~aYErTxM@pN_1WH`IU1x$c<3WUv?)_{79u zsBm*p>lDEGvO{W*!YaO_vUXV|cletZ)&^^nwN1+3`!G1=4_rIpwgR@q8(L*ynBHY}qEy7pj%cJK!DiHmqA#igky#2Mf@6yQCcqj_(e=V@x;> zYuq_Tg%8lVS^NkrCiC@~`v|(H0WhnqOjZ*tM}|v7%Sk{goJ3BTj%7ZgC?zjA!aa;t zik0In=Yhvz@OG?wRwnP5$KsvvcCAywY2hS(IGhmP!{Yg371MpS!3tSgJ`-Dr%Nsk?&HxhFPsrRIOc>#$1L_@ z!t4_F5A1`9wRcJxzAkCE^w`$}AF6{tRLd%5wX%lb7g>F<20KEm0O!KLNH5CBU&2{= zHk<*s99xRLDpq1!i5KN&Vl9zVt|vC&@nxyBN&COgo5!c5R$78ZSS6RF9oS)Out2#V`wf5j zlB!BIs_U{mhM054sea({cs#n5&%-+!bhRP0I~)$1V_CQ&Totgj+c5-E@T zLZsY<$|9wZ6e&L|iHvE#Q0*rU6K~48R5dhNld4V4rJJG0 zCcr{wJ|iGK4!2`<`FYQIYwkG5%>8-Z|GPDx!5}lrPsca6#_fW(++wM3gw)Y1_ICv9 zl`0vD&nkN2IB}F%OxLFxu!nQR$pRS{^T3N4)_=QR!H35S$$FnvhHO#;uNT02VxEw9 zj5SC=ival61-u0dIvsh=<&eQbn?j0^D%2vHZrx8m*yGP!SD zIwn>4)IOz8<(oiTudJK2UYD#B7VRPFj$kEh))nlObqA{>Um{hJ`bed+F47ojh}1@E z(Doa9e=o<-03%kREK`=ls&sHCuxKIn&q^>8MW|a-Ezn34pfPo+x=^*HmNG*1a=Jym zlx~J}IpcB|E`MTw(Rd zy14@u!ISdb4v%9;_~h6Y?h3u6?&05Vqx&9Oe*ommv)JS|e9(`mzri+I-*?}I@5XoO zo085-=cQM^Yu}ty8*5rp4D`_nv(vi-b`<#+tlmnR`nX>n;A-G3z=*^BUZ0uHZt3wshQQxT1KR< z&w63=hU}BtL&mltTXDVw+mGe5Wp4cZG{?;;bBf&Bx#oY(Bl0`>XE`MAAkVP058xLE z#AaAj@0)-n5Yy5@*%+wF;1Fyw5E%~&W7SGIw3aVJsR3vT79%kg+UQX4Wc=zgwNL%5 zzRUJupR|uVj)=5MIbwcKh_4Ey_XNdOvWAEG489TBl5`o~Ve%P$_wXp(+=H`t_Dpa( zI4m293`GVb!|;h3Jdt^~?EvR>JW^ule%RZFf7! z{W>xBhtKT$N$wKajjT7M4xg2zEIzx>=36HtWiz-ETnbWx%UIPsU=@I@8=Q+Q2B{>S z=ikdla7?xyT!VD$Z_8L@605}96!1c1Ix>%XHZl{LLOl*BRD8w_ph!`mSOoW{T*hvo zfvcDXIA3n_`iQkEFHoyv-+)yyWvoTnq-^{+<=*?{@pVj_xKC85bkLt6VMXQsNBU95eGbt8$%m7RS9A%{Hui1`lceXv-18-^rv;YF?&TL2>RJUfkz`Yl9w(8sh z?lEg5We-_X_Uqp`@5r^2^eXU5ZaKGxdj5Rj{5p60x6hxM{{K)*IZSH^k+3fekns@w zhzh6M<&KFXVz)ag_QCrDz9(PM=k|F(dwqT~9w^d?FYMctKKnwxEix+pXoLG6VWBxEDMQ?t(iCPJrJIP6AKK4n88|FtQd|k8DLY;Pp$S=dVU~Bby{u zjELBe>_kcwdy(Y`HL?vUg>1<`S0B5JnaH^K4&0`EjOk)#P{!Cp%o@9o{fHT2+Spgb zg(cRmtb&jKDJzj!!k4H~xf8XdG?efrek7_@{=`$l1K)p0*b`yY0e}k-N!SvPi6AIT z;yK|+L=)D;7nM2jGvS0RUpC?K>i{a?IJKMFNUfyyQ(LL+)LM#`T24_?d#QueQECAHrCO1ZXG9r(Mv^(t2r~pCW;8pM9mo!6!|HKF z!CY1b*)XYhxBBiX*}P`3KK=DZhDPxeRlDeKI-vev9U>&^bm zIp4Dn0YIHwIp4s!qs?ss|9__tocFcrR9Db(?Rgzm zFXMzA_`N|GC8K~9JP9&`M-f`2RAGeOvhsqgNGcJ*&QBuF*iUko`RA`>>(M@#+xl4Lp)l@C zKr{RxO$eV*y3kXb9#-qpx9L@Q$ur;xEvFGqgdK5{^Y~)km?!oW>r$o@!jwTJNPSP= zWUezR^;KpgyPjRc82mbg-3x+M$O4%}7XKrFO;YO54&{WoyIfLSt$2>*68iKODc^&h zxDkKsCGjiqnvf!9M5z(ABz2a$Q;AbX?D$@Fmo}tF)nnwDbFS88)S$MrJ6UR$l5NDU z0@+|Tlx;X4&W+_pb0g#q4Ilf=ujs#)d1xBiP!g$oX!AmS3r*rlA7d8CRzxi9r9}%R zS8?_Fqk_^xLB^uAQ@SZVlzz$pWtcKT8K+E8rYSR&dCCH1nX*Dzr);3tdpW0EP_FTx zvt3fIC>@k4$ZG&~lzK`7r4iI7Ws5?gP$}D#9m+R~hH^`>QS1~4MXjcm zgJw_)sb$n-P@R-63X`Ix6i{@OB1!?3No7$_sB9{SdP?O|c~m}CKrN+|Q0^%vijh)A zDW__wI_h_-o@$`pQSYfns)_nQeWaSH7OIu{gKDGNsSfH-s*~!Xx~Wf857kTcQSns? zfO`s__)PUv1JocjL=96T)F?GZjZ+iUBsE1%Q!~^oHAj7+{-VB8e^cM6pSBCOKW`Uq z_fncDegB8Ow}4J$d((c?owU1qcaje6QfYU0p^!of2vSIqP)KkH1WO1Z1c?yht*71H z-QC^2PrIij+`g0i*P8S?bMKv=^WB;CeJ5EV`R(_8Ht&9FQya(z{%s7^R)q02=wGe> zr~E!JKcf0;Ov}F3TK|H7_q+Ao7Ju0e-1+Nv=s)NOyZ_huWA6QR`$K7`zr5amSK5E- z&z{kh;hNvX%9{MYE3Jw6ua1oUi*q&m%a1LLZ4)d0>E@%Kd3VG2!YiX~`fWL9Ts!C_ z?h?~i280vgXgDqo!|`zpTp}(3N5Tnk6dW6ugyZ4pI26akk#RyC701Cza0m{@iE%6( z5l6sDaWb3&C&%UD_RpXCfAlT&-=C50Eu8poXTg8p_J7vj@2cm*`}tog9#_1sxK;7A z;%&v9iWe0hD;`w5s`y;-=;xaGuHx>`%MTUzE1p!mskmM7vf@+4!=EkhEACaVsDF=Z zl@-@2ZdP2cxLk3g;%dc}ivQf2GHF5O|FW4q;cu8H5B`@`_xHH}|3@#=7EG^pa>|0L zW#>(=-v72fty%M*T892f{@=ubch$$g=gPkxP-X9``O&8Euj9YA*6&-DPt5%_@(=&x zz&{TB>VUWU_OfHguaPSDSI578{ppyemzq^vZzW$=>`nGNR>-ayd|2XiE1OGVij|2ZW@ITRklIrz~D6XpR zWHmQ?RK*iaz5ea-|ANndUHyyd_>pT>@s{SQ{J^m)POIix#J|@6)A~Q#fgY(<$FtSA zsyb7vIkNik{z^+#yyKp~9>*7JRh(aYXg}if~kMok@SK|L<-!Ro53$SyhQK zy}I7sReZ3T7cQ*g!`1A)^xs|iKiB{N#R00bdOn7$vZ=0Wu0Gz7yJj5nRP&Fje1f-T zoZzqGI^V0}6LPA!R(1d5@@n#!U`_p)P<6bz|6xTn> zK{Z$B$1bXwANxlY*RGCtU0O50^YWVcomc+CtAF9O)m%|E{^skexNdd-Q5&n{)#HoU zTvH#h^%ve=#VxDzukNVgsOtXC?yAnO_WSsrn)>7Ws=2zJ-3O|gj0$9LUpwaI0Eh z?Z<*Uzwo_kuI_){gKDnUhaOdNWJy(jCm&bwu>*>hZ_bs(Su8qPqUL z$X~e5FI?{zZtx2?`h}bP!p*ALQB_aB=2fh#UjG`lsN&Am^_*{6Q-8j7HCNYvwr$P$ z+4fajt2%zNV>MULpTnK2xK4HdJG<7@?~MM1W2<>lRlWaQ{^P(u4*cW5KMwrQbf9ir z)%m({li#baVYMERRO#*2Tm(s+gVlZ|F8SmfX3lk zKy9FDI5xUdxMR3mxK=BKNCR7T-q{=N3P$i|3T1l&9gRnD!%SI(}S zQ^~31R`Mzvg`0%0M0}1|7tt}cbGU1`OIQ?(#&To3#*$)ru}CGqQcx+Z6jhFi?H$`E zc5!TUY`54wvF8V$8{9W`KR z@^BHj+PHjNV_b7wYh3%Ed)#X7r~5ss+9yY--cxrU_W<_@_YjwiQ{q&(=HV9Mmf=?6 z*5Nkcw&8Z+_Tdg;ZVWF5iQ&fxVuUfG7&Jy4lNb{N!~)%cH~?hG}7X7!EVSfykW5 z+{nDh{K#NrL1ZYhFtRAJII<+NG_owRJaS&-{K$ooiy{|C{t>w(a%tqU$aRtHBR52D zjNBBtIdV(n*2ry<+aq^G?u^_OxjS-C&4fP zZxG)wzEOPR_$Kj9CaG4ZkS-Q(lpaq&Ikd&c*Q?;U@w_OaT>Yagk7qILux#@E6};wR%1@J_r3za2lG zC?raVcZm_CTBKr98}dXli+q&a0N)5-AKwt)7e4}jk2n=S1JA*;@m~CV`~+eo=__e6 z`55^Dxf|_IdKfFFsUjUUN!;RE=5d=5SjzW~1vzZZW1e;9uRe+qvbe*%9HKbbg@ zh!Ukl84)8E5I+&?lIoG_lfIEENnui3@<{Rw^7Nmxj!jM@pCBJ6pCZ4Y_lEnzec=8u z#B9NeV~t|TSsxNo*kN{SP8-evPJLt;G8@4o1BDsF0^uUzHsK@T8&Q3<7aA==BnHU| z$wkQxNi%E+CQ)L_^bGf_)GZ9 z_$&Aa_=osw_}loY#3{r~qMNvqSV8A%7(QNq$UzPJTyzOMXLsM1D#BM!rG4PHhYSp5HZ9 z1K@aA4QpWv)4?3WdYbSg;c-H3b|hQHHnD4Q+H=}*4sjYHWCTJ;2oYHG#V>;N_d+kj2L=3oo38TbzW z3I7fM2LB%a178bl1kNN*Cr%^IAc~2}#BAbPVmnd`QcF@(Qd`nOQhjm^Ihw2>CzBgM z&7j6mL#R1a3u**KK`o#rP<<#8Y6{hbT0(cJx2dq7ILZWNsI17pOnf6&eTifbdXHXc{yb8Vt>VCPAH`-q0*)Bs3Zt0S$nLLc^eFXbdy~iii3_ z-JpKZbLt!FL+YQ@Su`ST0&Ons_x!G@noh&h#?c5gkT#n3nm!ILg>&Gga2dQ1E`)<{ zHoOSVh28LCIDyGxGMG%JhndCnG5fJ5uqLv`v&OOftN<&I%$NgHVyT!Kb7ER78_UB&m>tt9ObW9?uRxSMC0BV+ zxnCJn_0#m#4A+d%*tM^<4|MwsdkuRGTH`kp#S*mUT1%}VYq7P+y51_c=h$od_qac{A2t#7~Yu*B})Dw3Re-KBLMv#V+Mv(y00ManhMAB~34ibqBk;!Bt zSwz;6^<)G2GWjC;3Rwkdpdh4&@*yjf0_mVMC%|z=A&xEJLGvFyO1n-7-z!%|d@M`!Rd>B3ppMp=o7vSUY8h8VI z9zFzfm;xrBS->n}hL|PHLS`|uBWnh0D(mF+QOR8+R9qSTESY!+Q4eh?#OP- zZo}@xZo$^Gi`WJ15_Ud2$o|Cc!Rg8A&9QQ991F+9xy8B5`N8?f33HlpTXP3;hjQC; z`*7QEW4JxJy}5n4ow#k0HpqBn95Mm1AjgoC$U$TevLD%ooJVdTE07DwMdSo>6j_Sw zLUtl&k!#2i$oi&?I>?HOG+koxDc4IrS``8NX5_SRGiXFtZVf(Pv*cI#$_7>ZN?ZEC~ zH?ZT_O6)au6T6Jv#cKNadz7#6DsmKVMWLdfvcGbKa)uIBCMx$TPb;q}uPDzdm#LPj z%2g{=i&bMarJ6!bktR*MU;9q`LHkJeLpRPa!7$Nq%y86TG#ZRwjg=R7j1 z7h4xt*IDOVS6G)>H(Hll*H|CfDs4^d8|vQ^Zgd7(qo#Wc;Qsx z3gIr{eIZWNUlc9sDHHF^*|hi*i# zqmR(7=o$1j`W{`2UPJGrx6t!wlEfi#N;XN(ORh+|VaKpW(m~Qb(uq=>w6Qc^+Ev<4 zTGPkhqtVi_(s9yZ(oWKk*hpzl=?H0W=>X|aX;W!m=?cYm#RkPn#Tvyb#a6{?#Ucfu zR4V04wep$ruJWF8i|V*)hibj*lxnYPgQ}yZzXsII(cm?+H7hiWG>bJ0Gz&F)ty7z! zb!m@k4{Hx-4{2-ZDzsm;4RnokmD=yxdb*ps+WOY|#`-4uX@;4G8HVYGZHDcJbB6PV z69$XXW(*sD7|o{I<~rsGa|3fdbCkKRd4$Dl*<*>aHn%phwy+MfUba56Ubh~w9<-jc z-m~7Yp0?h$KD6Glez3*bpV%WEbsP`uH|&q?QI1FU+KvW}^Y$zDxAt0&oA!(LbN1Wz z3-&wq*Y>&&g45tkaT=X-T@sfq^I~RwcWrm1yUa7sqs~@kZ_GaBJ?VYpd+fXKd+vMW z`#ryFs$Tm3^gZ-F^&R)0_V4o_@Xrp+3Y-eq^9jM(!8yUXL8KtD;6%a8g7*crLQ6w8 zLU%&J!oos2egnQSp$Vb;&$mJ9LBJ8dfV~NA33Ul$2;B%B2`vdN2w%YnLTf@V!dozg z(1_51(4O!fdAO?d{rgziBND6gRB&||14r5@!6)Ql2Ii=yqPU8J3$ z9iTO!H-l*~9cI8S80{II8QmD27_AsD;Alp7MsEg=(U{SIAz{*gez?H~=4R$b=4$39 z<~HV5W)zFaqOb_8m#iPGZ>;C6r>r-uPpn!AA6Tyv`m_78SFl&Hm$2hGIh+8;&w;r$ zef&M*bA?<2m%^2D6S;D38n>KV#LedBaXs90Zjd`2d5_fRhY>t~9Dg96!k@&S#s~Q` z`J?y*{#bq=eqVks{#^bX{tV$vVWDuJ@Q`qlXr>4hO%{XEvo25GufD9w`|S6o#* zR9sUWRh&_bR2r1ul@-b#$}h^#N~h|js)72I>aOa!>h{mOO$i#7hM|EqyETV2M>Oj- z8#KE#J2l%h`!!oNS=zPQ}mEF4Ro<&b5crLMKTwT-odwVidWb-eYhwYKez zwT|tj^@Fvp?ThujwZ83#wW001^|ke-?S(DE-rU~D-q+sC-p{_n-q%5LK#p0C5e|Z5 zremmMhy!#Ca*T8gbF_0zaKt-$IVL+Gr`x&Qnd@BST;}vR7dlIv3YX4hbJ<;Hm%-KE z-Q3;O-Pqm6-O%06-OAn8-OSy>J;P)47(DYm3p~2)mEQB-i{3Ndb-r5uy8h3;2>(~# z2VbQBhp&$Ri!a}Q&wtB*-%kq64a^B#4crP`3ET`^3pnzTAV0_p*7WiBh#5=>3WD?? zJGdiwKeV!NY0=dpT=AgdF~zBPBf(5y5vCI+6Xp;YgqZ{(K}*0BCJoZO7ufjpi(fjo|Ufc#xFjgmwWQKnGX6dq+VWfmo# zLZyHd3S}TgKp8<9Kw(k(QTUX>l!+7?r9Q0@tpV*0tq#2*y)OMO?IG%-+P_%^u1b&Y^KI zP9jIbDc}@x$~Ym;e9k;h3CF@+$j#)=<1Xc%;BMqT=I;7i&OC>>JGh&;H@Q2xSGkwC zhq-sSTe;V{N4Oo4PRI;o9)Ag6$q(`u@E7xSe3T#JFXt!om+>?C4t_CT!e7cy3W-8kNE31>ppY)42q9sKuvoZKct&_acv5&;m>^<^ z1R}9WBw~vyL{~_iP@8y-c!4-qyh&^kYsKrtOT-1@wPJ_(pm>$oDNYyXiA%*x#pUAp zV!L>dWV_@~$qPwe%q!g~eJ{NxT`#>SJt=)C{U-e?ts^@kJt18qJtti)y)CVfZk2wP zev}@Po|kr%ZIWJ>{wcjGeJ*_~eIE(s;EOwdb`rw8M4dbYpbGbR%@5bQ1k!Jzg&~hz(N1H$#pw-x!_JE2UFPzmy&+ z9a6fc3`of_6`1l()6A32$>ss(k>)Yx31+}N*gVBN&^*aJ$Q*ATYbmo7Sx#C`Th3cL zTW49PSqIwM+Pd5N+IrgnTb!-7eW-o7eVBcu-RmfGgdBRu0!PrX%dx_d<8V829hr`K z4xJ;#VRASfOB@tu66c6>uXD5WpmUS+u=9j-opX)zn3L=(bGckATsf|wE8CUj%FXm; z_HlP{cX#95@$UZaZthO*Socg1!?Vn@(zC*|)U({P#DivwvUg{1&%WWkW}s}^T+zz`aAhs`)m66d-T-*(*MIx3!Dyo3_K1z2s{bA3_J^D z<|hR;K~+#6R0P#QZBQ4)f_sC{gU^C@jdzT-Ly;jy@uLz=nWb!T*^aUWgls}Op^y+D zSP4Nwh)_g`K;IITBsEDxN+jJT-6Gu}G02O_DHJPZ3B^QlQ%Wfzik(tISx(8LWKgmw z4$20~YDzg}9A!PFh_ZvSlCqAHO39?GpcGP?&<4``(1+0D=m0&Q9z*X!kEU19ztXv| zj#0$0Fmf2hj3o>eGnsjwd6Id7d6wCb)rb|(nv+0C7?LnO;YY$$_E`1=_GES{`#5_a zdq4Xidkja)S;kq;S;{%by~kb8-ORnq?ab@W`^s&@d&B+4{lFFT-g2ArK5-lHB6ux% z-H@5cLcWK8hQF8pjDL)On171@dw$nco##K`pXJ}NzU4ef${6<-qH6<-x!5!Xq)BmO9U zC4M5V5T6&n6F(525T6n^No<+eH1U}Dx>%O@O*~FAN-|awk_06?C9fp|uz^@VY@lp} z43fpj2FXy_ELpS+C+jZjBxB0xvN#!4CX@A-^^nPBLu7Mhqh$SLlVx3G<76jfnX(Qt zyo@iKB2&r|WgJJ=DF_I86_YM3bbsueqUlpt+{Gs=2MXt4YzCv_WmIcBA&D7Sz4eCFn7| zT;If4-`L1l#~5J@8Eg9ZdsJWy8Xp-S7-yzXQ>LX5Qb;LK%G{LMDPRgQrQEdG#5NPm zVl&0u*DNzD%{;TnjF=T>l{t-a(Q?Vs$V#%NTPZfkHrqzD;cX*r(`@5xb8KXr+SbzE z+5XHCnfAreB<-%_kfTxBKF4dvTgL|nEv;eN8%N``la3#bcaGzZ5ot}+qS9_U>ZM(D z+;K3ScbwOpFP#^iH=GZhXPvj5G}k`Ye%CseBQuye+Rb%S+-&z4_e3}3X1WRPY3?EJ zQSM=Gs+;Grd)9b%dNz1=dG>jBc=mcWdbW5rd-iy?dfeIR*|zM{*|)M!WM9udmwht( zM)u+CZ{9E7@7@yM0RK>bynlp$kbjuJcHpDGL7>vl4+sNi0e zdO0m}^74K8S^0td-}AesDmOnT-<$6adV^U(b1*&V3}y$F!L;DM;Gy8b;Njqr;OpSK z;K_nIp}L{^p(ml|q1T~jp?9H|q1A<}3J;W>DmzzZ$FCx6BCIEDARHp>CaffEA?zTm zAsiuCNIH_4bcghq^pJF)^nf&we24Osa)I)ga+-3Ja)fe@@__P?@|tp;a*uL|a+van za*WcF){4fa6X|q1jn1G$bP0V9T}q!tN9ZK_Y&r_>V;p0gWb9__V(esWVC-kCXCx-b z6XviD>|^Ys?3Nsuvy!u#(~;MVH-p!W_nzB{SHZ2ttIxyp=J2NQ=JLkzhVXjwn(*rK zhX4E*aV*kGFiy}_&_~c;Fjmk{&`i)-&|1($Fig-^&`wZSfC#TO+$5+br8J^UF$QM`VX&i)A6%PT6+Z3fVbXP*x&4D7z?IE?XkoD8nbi z$%)B=vW=*y!Y2FU$#GUV zTV>SGsFx9uQR)2Vtep{=Q8%Mu2JE`yy6C#*y6L*=y5+j(I_|pUI`1mUe2^(|E8Qx$ z$erj`xHH@)H{U(ao$O9`OWlZD=EmFxcZz$QTkJ+WZcnD?xaWxHsOO+(z2|^uzvqzW zUiO{rr`fNw-)Dc#exCg>`*HSqZ=|n*uhQGlSMFQyo9&9hJu9)7H7##d9$o%~@QUz=aGCIuaGh|8aE5S>@Ro3z@Qi>E-xD1q zJ1L&Lid;#Fpmw6RqyC_@rq-o4pf;g4rGBQgrFNs%r#7d4qO_;ArD^D?bO$|`?xq{) z>2x#w2OS5;!f|jCoCx1zJZ3y&Twz>hTxC39XqdN|Pnh?ZkC=~{Pnq|b51DtEO;`vk zEg>U;$>y^uY#JM4UtnKmH{?v?C^*|V(|O~0vw1om!sGKeJO+=>)A0Hr83MWh5-bwv z1ss7YAp)r&MW7VU7hVxw7A_Di6_tug5|<|CC+SfL}GE`mc$*2D-t&* zo=rTJxGM2v;vb0z5*H@Ul+2L~#sTbh@_zDW^4juP`S1B%Qx%rI zmerNV%SXru$-B$j$ot9%%3bn4@)xpN@^`Y6vd^--L^V>(^K0-+eq6$+e&*+`#_tfGwUomo^GGMT)#xWLBCADQ13PP4B3VO z#(3j$<1*t*<7?yml>C&e6irG&N@+@7iZ5krN=8ar$~Mz3({9ra^ICI>d6#*&d7k;W zd82u~d7XK?d4YM4d6Rjod6oIR`G|R?Sz);dw$ncnRp7G zgqO-&!t?W1@Vva0ydvHrULJ2XZvc`gkP8fgGQoO*OW+r*6)YCy3i1WZ1UZ7$f>nYQ zf+E36L7`xQV1qy-)Cu*%)uI)mjiPm;?n&K}o+j2x>YCIc=|^HrQmdqfN$(SDC)G)M znb;zUAi+x(Ne)R4OUBDh@-#V7E|NoXr(7y$%Jp)Y+$%TA6>@>RKu(umlF8*=nSZr484dUY8(k1n9g z(w)#B(r?!v*YDO}((lxt)sHuhF-|a!H4Zn9Hm)(QHm*upmvS&=W6I%_BPsh*=B1oW zIc~aZ{$PG>{${>veqp|4erkSTzHYv4er7H+Uo*cmSC};xon?)srjNfz&n!Kx#kLY# zscoLE$QH7-OCOuwG5u9qzx4j;tzUC(XLW6wj+3(rf>ea{2WP0w@BJ&!cIJbPhwUvG177jLY$nYXvM zn>WVW)w|u>#n;K#&DY!4!`H{x+1J&F^CkLaez9Nb*ZF}!|3J?`d>|u`8ORDa0*7*T zz%q0XTV zp@xO63R@PoFT7QFw(w5jjly${xGp#-I3n0DI3?I4I4`&;*ey^C4~ve8wuugkj)=C3#wLwO8kGbmNs{PEBa@~i zAxXTX*-6urh9+^6W+cH9oum%7U%pO0Uw%NoNWM?LM7}}3SH4ZYS^kH7o_wQxck;31 zv&rX^k0xJA-j;ki`C9VLU9K)u-&Z%*G|>#vj?j+MKG8nX&eN6Y z%5{r%PxaUJFZ56Je;DQ(@y2P!ImX$>?Z#^n(3AZ!NDZy{sE-%WO++-)!~mbUSRHl@6!RNEfFk zrcX|vnJ!IFN@u4#GRiZ`G8SZHXYgEoG6!YiGW%x6WG>JABlEHQtNTy)TX#g(P4^S` zD|e;4R#xq-&+eD*_wG;b?{0}l>dEzd@J#W>dxv-@c}IGOdPn;P`bPK$`8cykUy0FDSs`u%3sLu$)CwD$zRFe$e$$NNq&|5IQdcX z%j6fyACm7T4^>W6DpX3-8S7f-7#G=-7*bG9hW*Sb$IHa)XAxR zQ^%&pr%p|sm^vhNWa^C6p{e6j2c}N3ytjO}BwLkMg;j1>BW+8WrC?aR|^`uKa4mY$kkk{(FUOJ9>-oSu=sG~Jz!I`?Lr%h-@{KI3r4ii{l@ z+cS=4oX8lRIV^KZ=7`L(nJY7!X0^-ekku)xVODfjm#nC)=2;Ux<2@?RSI-a6ch48k zH_y`Sncmsn8QxjmDZX*ONxrGR@ji>+>`(LC{C2<9KQgc|P!=c&%+0mu_R7`d&dL?$ z&dzP0o0^N|GIJHVj9e)9c>am}lle#U59hB7ZVg@zb}r~zFt6Z3!L-ok(9ptKMd8BL z#Vd-J7q2QFT{^xrtL#kK?XsI?x5{pmjVqsBexICAT}{14ze*p$OyE4=4Msi)-U%uN zb%kFA-vplpTZA`7JijNlW zEhd&GlyXb&mbEGGS3a1yn0lLjhkl>_k?Ajg!G6d4%=^Uq$cqp*6W$fw5&3iAui6Xw z@V-?(w?E6jF0eXqFZW#To!kStM{{rH-pak4dq4M7?$z9fxmR+Z=HATT7<>@yQ_!=3 zS8%i7TLC*n4>3bKLsJW97Pc+wP}HROY4MZd%f&Z}GfR1;%F?7#tTd;rpe(m+W7!wd zQtB4!X6i=jPU=JY1mnfZx%Ea409E3dtEG}rXn^v1N>XHGT!Evv3Qb&e&%dfg_ne@m}OZ{hr!Uf0>k zSK`6W}4g=LAdXES_ihZF2(-_O%=?jhFCQp4 z7$OxC3zru5Edq*$7Y!|HRnnxyP`0V;Y1zPXPC37vS3aCLg1C>mm%5+Y8pc?s629{) zd0m8^h55o~qHjr2lCMeYC36&=luMMC)fd%?+6y{@$(QO$-Dzp(?C`}rdZMivYz2p6Cs zVTe{ZwP15WLoTRIrD5Va7`Rjs?}`0V^e0zGr#}b=G`{C zU3S2m>*e`o1g7K>^GJDP3&s^3DA-pZ3H|(MQ_5y`) zJgGdd{3P{qLIl!X*jLy`_(IfNa$SAgC@}F&LQ`&PFf}jrzHNkayffbA&hqj3Q{A0#iDaXPzkMsTJos0yzE2SIqEZdKOtL@tW|2S=m-{WR*mU|Bc%z3GK zraWDVzT|Tm7w`c;A4~x`KrS#JSO6>p76FTaKY%5`QeYXd99RLY1Xcm7fi=Kd zU>&d?*Z^zr+D5gDY9G}h zs$*2AsLoN{qvE1)Q9Yu1M)iv79n~kQZ&bgi{!s&>21Wr<@lk`K21gBv8X8568WuG? zYDCn?s8La)qsByyjT#p50H2HBk3WV#iVqRLlQ8l&ax^Ux?guw#g%j=xH%LxOT4Upt z@%St|PW0H6S%7{XvQ)cO%awyUF#Sd(=DB0kl4}A+#~D6*j@?a0;9X>tG8^Wwv4A zSSFT{mBLD8-AT}})7Z5+9XV>wCC)|884e3!BLaknh!6yU5iY_&gve{*E8#eFBsu~e zjgCUcqhrv)XnSlLM#5Mah|R(vY&JFrOIEOz8_uzQdSjs_8MCP)Sa;5ZNkNgxND2-3m+;9zh($OC=EZN$!` zuA~^!D$;6F12UhiBzwuepEvp8P#*|_ra~Q{&JYf2|F`U49t(lcM5q@O2Tg}wQJ+vB zQ76)-(&o@+(q_|0w7T#F_zyS)&w~qKFT4Qu!#;QkJRkNlbC|tYeOTEnAIrtcVr8;& zSZhtq|l=V&?SIp;WMIWIX+Ij=bHIrlgZIS)8r zIj=dNIo~)D+z*^lhy(E;Uc`swAsI+Al7bi!1!6;7hz>C$N<@te7rqgG5WW|_6Mhs< zMW>@MNqh}=@u#T7>Loo@KhGk(sEE$tyiC7UP#WJvbtOOHbDolu_ zU|vkEFe>=UJ<46m1Iok7eah|1L&|(rfht#(r^-={(u~yPY4SBT?O4MQYreJ6>bK@t zORRpo&z^4g+5`67zvXo+Zo9*tX4iX;`S$qA{qy~c{bl|o{&{{N*ef_N*grTJ9|BEa zI%o#1U-UaW4kHQ<_BQU}gGIN>v%qgtttktYVta+?WtTn8qtd*>C)WF>_TZo#AK8YHl=_rPJ(HvBZrl29z ziKd}yG#mAxMzkCapoORdHKR6Ej~dWC6eqDtQYE(~U9ep21@@2n)+m0Q;4r4E|ci4IC7Pb*{W2KlCyN&JrxxAmkj$muC3hWH_3_FMADME^LMXtiB zNK*t9L4{pWq;M#bl$Vt!lvkCAvdzqgC`j)BagE$uQn<$e=f-7{3`c zrXQxER-bjXb)j{ub(3|KHQGMUzSq9OUStp1i|w22OYE!dJMCrm?e>lKrS|#uW%m8{ zMfL;s&GrR$g;Va7I%Q6(=e+NP?}G1?@3QZb?}~4|f1`hme}jLme`IiMa7=JiaB}bz zcnG`zt_P2SC%}E+Mertg4cq~40B?Xtz{}uva4)zGd;v}&%_Qw5?I(>To5%&^Ai0nn zB5#N0L#v?0&>83e)Wop`S`A%>HbaM?!_YiP0qukqK)WF&bQ@X=ZK9RY%4v&e9$Epd zlvYg3qlIWbS|M#Qt%#OS`#^63li_>tZTJ-&!FUVbg1^E);P3D!_#ylb{tVxMpTY0p zkMLc%68-?cgqJesu+FlsvQDzDuuiaU{4KB9y3M-II>tJ}I?lSxy1=@~I>S23I?OuF zy2JXysz``o$FjS#quFunwd_Ug1?*z>LiS>IJ9L_Q z(bec<^alDBJ%%1f51`M{6KF4qU6Ll*EV(SXD!D6(#$vEu(jn6R(r(f*((%%k(uUIO z*kEatw1ae%w4=0zG(y@%I_YnD-AXNKd+Bg#q_mlIg0!AATG~%qUm7cIAZ;$)q9|AF zR;*L3Rm@jxRBTc#Q%qFORL)XjN`+FTlqruZA1a?J|5V;lK36_gK2WBsPOA2+j;ao+ zwy8F&HmNqM{#5Nz9Z~I89Z(%sZB?C6y->eW57124%+M^+EY}#c2etKek-8{d9bH4+ zXYDubSM3wsQ(aws3w=v{9es0sGksHi1AU~vm423Cj$yW8s$q)ZlHru$jN!83w83gj zHJ&p@q|{0=n)D`v$zrmaY^F$aeRC}{-4d{5TXtLOS({p$SzB9&Td!J=SnpcTS&v%x zThCe#Ssz%hS#Mg8TQ6CUSe0P0s{k!~o{FnTP{JZ@}{3rZJ{TBll0#FbP5`*O6tROzvl~9LJkI;$` zO8^L+2p_=@;9$aVLO;SM@H5zs(3ucT=t&q#7)XdGG$k;IdBj}eapFPZA>vWuX(Err zAdyIH5{E<~A*55JrsOhm56XS09i=7Z3G^O%2z8`{p(sjy%AZgRN*&5us3GMW^cngB z-G!P`A}Nh1wP>|zCuxJ|muTl{+i8bsyJ$OUTWOnVduT^!XKCAL`)Ez!S#SqNTSkAz z07e@|Ge$c`Lq=D|UhxjnRKYu!ZFrUFE@<;G#{0aOS{8_?j!o$J? z!h^#7!dW7YXu60fYKgW&yNNrBXNm`j2a89GXNy5`TXDR&vv{buueiT>pcpTnA|4{{ zB5o;eE$$)iB_1H2D;_1riKE5+Bm*V=CGnCW5~;*)bx9se9!j1{9!Ty>o=9+*QOcJJ zq*`ecDNmXsrAra1R4SJSq}kHfQj63nWlK>hS6U!dNKI0X)GiH42TH}#ENQCLDovBN zl{%y;QnOSe^-FImE-20^ZYfSEMq2JGt|-ncZY%C8E-Fqb4k->Rjwr4xPAl#yCMosG z|IF(8ALZ(lT4jXltMY@gQu#^wUinQ~OLakYP4!51S+!I3MD;-ROm$OrUUfrtQFTjo zU3EouRrOSLTYX3ULH$u3qhV?|nzfpJnjM;hn!TDmn$4Q+8n^bCwu`QluDPz2uBEQK zu7$3Ru7j?lE>_o5*InOFAFCg#AE@u8AE586kJ0zm57zh5$Lk>j(*PP+2C{)dgCtzWJ0tQFRe)>^i2)(BfI`#?L+KG@OUF~!lrL3H38RL6M7L`M%tXGg5# zKXUXx(>}?8cXV>}anyH=am;nJb;LQM9m5?19lagX9a9~19ArmVM?c4GM^DEL2iZw- zE^sb&2A$c?fV0e*;Vf`EomtKzXS#E-v(P!;xx|_83^~2dQm5aU=bY@C;*z>FF0D)H zvbvI87MI-RaHYD`E|aUJd%B0_N%1W5Ec9rz_1T-Uw`6b5KIgsQt@M5L)%J&d-+WR2 z@4ipI%l^CmYyRv02mU+$NB*n+8~!W)oBoG>LI58C1D68#1J?trASbvp_#kwrXkf7g zuOK85cmy_qOCS?w6A}nY!VJRy#ok*-wXya4|5PcZ?q1qbFLih7-T+NV69R+?5s14I zl8Gk}f#@W4S6b>y-My3wb$9pnyQdBJp69v0^Q?8&>hF)c)}3|U=k=cV-up8%n`DMe z5;_}|h{B_0pt4ZSQIk;_C_0LXBB98rDX8%%7K)EbMJ1umCNYz9lXH?;$(NHaBqyW< zQ-o*{dNg`A8igK=?uAZ5XQ79phoJkTlhKpW|74c`u5Uf`Kr{tC2R#Bk4V{1*Cjm5rAJ(C)ZeUW-M^-b#i)Mu%;QyXBv zr8dGoOs$5khkc#;IQ3O(eQZr^+Wbr$7Kg@VPwPO4CA25BA;b~t z5qc2n6S@()5*iZv6PggZ5IPe262_(vPT!cmIemM2N&2Srp&7$70vW{_;S6(TVWvKF zPv(Zq9hnz0FJ_*}yq8&#c_Z^^=ElrxnOifDXYS2Bka;R|U*la!?0q!4K> z2_|_+t4Veen`9srl31kmBq1qC$|bEMDM(95qe$UD^4Wa}2_k7o4w8+;A*E1GQ7BX* z6;GW{O`~Q}TV+dW23jF4NXw0-BiSq$y}j8jrS$ zmPg~#RI~uCm}a3ZpqXe(XcC&7=Ac<=W}1>VlsSkwj5(a?U=}cKOgq!c?3J@GcXjUO z+)cRx)|%YMxp#86=6=Y%m>b19ntLnvX71(OJ-PRDujk&#y_Wkf_jvB^+~>Kka(Coj z$}P)1lY1=pZ0?)f3%TEO%X3fV-p$>a`-M}V`;pU<`;JqO`-)SO`Uq?U|l7y#)=Y?m4fA@I)C;18CN#Qx+Sz&?5B)T9PA?_zm z5DyR!6b}{;5|0sg6^{}R5l@pOOQuU^OJ+!BNxDfUOHdNBG+RoSGNdFaQ%aQXlzx$Z zl75hWlorU`vO?Jq`BeE}c~^OVd1raNe2~1AyqCPae1N>SJVD-1K2Sbf-bUUA<8kz;mV=Pk;=)+KFXfTMCDZFSmik74CN?g4<$)mqzUW)?J})FyG|?8`nB`*82w)TR{cMj<-hA&rr)nWq~D?6pg*eLuHU5Jra!6Q ztlz2Mr9YtGt>2?hHkyn@#udgz##KhY(P3O@3>&@1NeUTME!ziuzL-?HDf z#}~#HHZE*eSg){C;mg7&g|7DVgGJM|4H5&+X34h+XdSL`#yCVwkx(Bwk>uLb{uvn zwl8)Bb~rWx+Xp)eOPs$R=f;I`GTb6u2q(cU!zpk}acgizxOKQ;I33Q6^Wd~N3vMM& zj#J{SxFD_o=fc6bC-_tN6ZnhxbNJ)<)A)L6{nLgKCK8y0M8ZtMIKmJ@5@8MjO&CNN zNk}G)Aq*hQCrluWAWSC=CyXWxBn%~tCrl5D3W-QBCnz1_LSmyT3lbLriPiG#? zY({*OS(n&?Sc~{RvnlaY=C{lrnfo(q5L*%36B`kKX4WLe5@%$&NgGKUNT*5nNsmY` zNe4(U`7P-<=@#h&=@RJ;={<=^zDe3cx|KWO}|KcOlwZ>N#X)&N!yRwj$fVzNfCIXYN35M{W=9NN!v1OdgJBlZon($-!{rR2w1NejZ-T4Fg z3H)ySF8m?MHDvW6P?EcqPycsW)+ zS-waSQmjxcRA7~CB}tj0#3-|s4CP#9t};!@R3Wdsn+xTTOREdtZA+`%`;cdqR6!ds+Kl zdrTXnYpAQ#HrCbFm1*Dpk>B?(X}@TXXwPY%Xq)N|XrF0cXb)!^pExB`bYY6`e{at5pCRIEH`d9ZZqyP?lEpL?lNvQ z?lzVftC@}&i%edV$8^JV)pX4?$2{9S!aUzR-kfU2nkShjo0HAc%t_`M=2_;s<_xRG znrGc%-DBNg-EJ+l>TG#7lkJM_g6)*;i0!iNy6ueZlC8pa)K+dgWP54d0T-dL$wxf@ursHSfx57G(&xKzLt2v?^(T-Y< z8V;g^?8tCrIWis9oOPXDoi&_ooZXxao%Nhi&L+;Ej_;1z&YI5d&g#x~&Uj~QXG>=- zXA7si$W~-6Dl9S-tBQ@qe|I+dC%LIuTbx&1R(!PhK=JG1SH(FVj)&!m_OA3k^*#uG z4r%A;=4_d>8?_g87_|;{5Oo~28Fds@hT4GIkJ^FSh&q8fhT4MKhAK~zB}ZkC#YrD4g~ zx!Bp*=~y-vjh%xfVCQ2gSUh$NmW1VEzhRHy4&qMWcHp+*HsVTg8*qDZM{zrGhjCkR z`*6o`n{iukr*PYGg}BT3EBFe0$FxCdTmp$OgFqqh2swmw0*#PO$RfNV%uSz@J|lg0 z`poo0=_k_#^&Lc>NbX2(PHsgWK^{i#OzuLiNA5=MPwqiZ zBo86?BiALjA&)0_C3h#sk{^=VlKYZ7ksFZN6er~ZMNhR-i>QTE3)M{ZQQcGtH7=V< z&!7*d&!K10x%6@L$#e#N1bqTMl|G*?qfetxrw^g$&#&N|FG&)Ut}&kC`Qv9_`{uuid-vCgncSbJCp zSl3xsSU#4MWoOw~OIQn8ds&-UXIaNt9@aY6V%AjdJZ>_V#LeU;atYilE{`kWGPp$U z1TL04kvo&i;bw4A+!XHL&FDYLCvj(Uaoo8)8_&vf@Ctc$-e~>={wV%P{&@Zj{&fB% z!3@DnL9!r8kSZ82m@7aD<_IPTrU+&W<_T^KehPjFz6;t5r9!b#OMfYBD5@d)DEuM( zCj2b?By1%5D*PaPE_^TiF7$~?MK?rfafUckoGiwOabmhSTRcxZUz{txB{oR>61Sv4 zqLUO!Acq*x*cw~zCsN~u)ZSk_9`TGm9?Qr2A7S=Ln6R@O+iShh$O zl0B7CZR)C>TBxj>P~rNO{PYyNz>3Zcukgur|FcPt`TXn zHS9m~eZ@%{qNaWR^!!Qr8>hqQL^`RiKxflYbV<7LI=wDi*IzeVr_|we z^K}9pUq{eIL+QFwPNEyAo2=`ptI*EW_0vtzCFnAA9Nh@r9NjEkvW~4g zq_gWr>89$2>IUg(I+bpcuD32zH&4gXp>(l^nud@1dWJ9h%lh~F*@jR028I|zHNyve zeM2q7W#b9sDdTBlrSY2as_~@ptPwH=OgByUP4`T(QOW!)n>O9*laeJ&21~RIc=|O zw`|XBuWc`EXKjydcWrlU4{dL3Pi^mPwF`dQs})2Q)GCNBs8dkAAhsa6aNHmH8x4~R zrx%VXY~-l#Xy|C{XyIt)h;=k@upDg1G-tB2zjLIM>Kx>xIMbb4XJ6+G=M-nIGsijC znd!`SvYkVnL?_2Nz&X!Ja-y6(=NxB>bCwh19Ow)e1&cyOfg)$ItJqQODL!5NrTBaC zr{ed;e2>^8@$ftiz4g5fylcE4yq~@6eI>pPzEa;>|7t%z@Fe&=_%N6k`W||Kx`--A zJwm-jT|+%V-9X(#T|hlUy+XZ2-9_C(T}jGI)+9epehNP1wI-!Ira7h_rU~X7x*?_= zrW&RxraI;ex;>^Q<|q0y+JseL3$b3T9;?Bsu>!0GE5jPF4y+w3!scU*SUJ{>Ex`W3 zGUs2%y};eaUBW%VUBx}eJ;lAn-ND_$UBf-YRpM^oDsYc*H*sS8E&M+@!~9*}yLeJs zJ|T~wBqB{d)SP^osQJ=@-){ zWlYRqXKcynL+n9JB&HL&L_RT@m_pYde_ zJe!Os6UYLxh|DAN$x5=2OeHTP&mrfN)5&S%ndB65CK*LmlgE*B$V~ElGKDNA^C=4` z3#kjJVQQ`Hn%SMRH`2GzkI@&3itw>3iu1>AUGm z=ojhR>Bs4Q`WgBrx{JPwzK|ZGSI|B5LV6j!l)jXHm_CC!n>mviVuqOum{09{?B}eyf8^VuL)m=xXVwc=0((5W zKYKKL2>U53n%#gskzI@Zo%Mk=g58e&jWv?pkzJqNfnA5)iEZE(a!uSkF2v2}7I5WU zJy*l^a3}FncphF6&&8X_pUqF=&*EnZ_yVp#DBuaQ1uQ|7u)45@P$?`Fwh+}3)e|)r zH5SzsH4|+UX~YUKB+eJJ#Cc-2SS8kqOC+l#n%7w~fO1}Dz`mXxEy7G^FV=g|Ake8Nc(&#l>jX`76STz<+^L&qP ziEg1TtlObGtt->5(XG?1)@|2q*6r7w(yh|@bsKeOb+B%^Zl`XM&aFG5JE;rkR_fO4 zR_HG4yt*yAGr9%3a@|GUdEGVL2AxAk)DJRrG4wDn4dV@c4IK=f46O}q4HFH042g!Z zhADPo&(BIJ5@X`3t_}ci!_{I3c_`>+j z_`&$q_{#Xq_|yoS7MjAQkm<4Msp*kvwb^I3n4RVVbFq1hm1d<|FImr6%dN$>7<+a5 zPg{NacUxV14STe`w!N19hb_up)843{aY2KE`UPDa?HqBA&W?_b_Kr4=ctXAsdg@QzHr)|`OYHeBB#=6 zbS`w7oqDI$>2of3s+b8 zVa8(yVa8zkV8&vGV|rmmV%nsx#=_W**ag_d*!9>o*rnKoSnv-N;NIcB<38d(;A-GM z;i}_57VG$8L#R0=y8mn^k?)t^tO!lj34ywj5qWb^k$5Y^oR8Ej5>@5^sn^#jBoU(^cY4> zMk_{FMnlF2dN)Qi;~l*PBZ;|`xtO_#xr|vYCo1PBvwBV{Pa!?P3$yQEVcc$yTzn*@f&BwuMb+tJy_t5?jn> zu;uI$?s{&3yMeoa>*ucImU3b4Qf`R5gu9TtiW}rE=WgP9d43+2pUh9^XYe!m1U{Zm zBc3B^a{HRTiKLuI-0wz7umi}Hc;gYvcV zmGXu1rc$I{qu!uitA4J2s(zw=rhcG)q$cNO=PlNRH6cxrW|79H@n~A)&&^NCPtHf> z&&f~9kB3G<4WTHgC)5Cnf$BpYp}J6as2%iG*Bknxs{_@8-syTlZ*JP<2t)YHU)*rdQ zk1>!8WP{jn+rT$q4f70mL$ZNrz!{PZ>4sbb!+=^RXj^Ct z*y8M6>|O2g_P+M!_O|vG_Qv+s_HOp>_Gb1b_Ez?$_ICD`_BQrD1@Q%~3fdIJ6?7?R zQP8r0U&twB7iJeS3;Q{GJ9;{LIR-kqIr=&vhu&d!XdL+tog>e2)_K5r(7Df9;oRap z<9zMB>Ad26>@0WQaGrF&be1_EIgdM!I!`+vI8Qk*IgdGSIV+tHo#&hv{>XX1)Op)^ z*tyxMC|Xmrx@cX|hN30Ki;6E4*YecyRQKRKW{=%t^qlpa@pSOE_jdF4^!D(^dE0us zdrQ1^d|$kcea(C=d@X&=eb;@bd}n+Yd>4JEeaC#4eOG)ZeC58AzD@pT{-^%8{x|;D z{waZpf$V@Fzzt9XqJS{K3D5%MKu+LW@JsM}@MrL2FdB}6KL@`C>%g_(ny@x>A=EJ3 zDBLcoX;RCiHc5?>Dw77M+)m+OGBGR+A4A2EFu52WCLJTjv`cN9dK9}Gdkni5y8~N> z-Gx1jZHaGj|3)+3B=&YC1dpar(pb2kDQ}@2Ahq*p&ejR}hPdhlrbrhl%@%Cy6`$$a#M+aU0P} zEGJ(kpCz9mA0zK3o5%;q*T`?l734t_HAO*LL^(>`L)}L`PCY?AL)}f?N!>v`N$rw7 zm_cPsXJj)5GH8sk3<4vUA!6VeNsJy09Agw?93zpzV2~Lo#$3ic2Ae@=WHLrG(is>A znlYO(hcShLX3k?`n9G@~n5&sbnMas4b86(&&RNSo!CuTh!rsL`%|6ObXCGwmW{23v z*(=yJIZN5=*gM#3*sIuQ*n8RA*o)Z5*sIy6*z4IP><#Qg+%oQ7?l$ga?mq5*?g{Qi z?s4uB?iucG?iKDX?qTj#?lmsV3-RcDDnFZ_!>90>dp_T@@fqFSz2sAcMn>X+(Xc|G%T@-}LgY1V1BYf3e%H5)W*G@CUgnys4Unl~DB zKKQff`50(2#Dr!;DG(9DLgS$+5E)8@vY<&&5;PSeL1Q62#D(TSEJz5Up=>Aj^<5{N?Ok7-U0qFGpPe6_gI(2K@vfiFo~{wD zA+BDoX0Cd!Sl16{j4R6Z)!D+etLRkGo}%qVJBqdx?JX)T+Fi7=_+oLar-`SL$LH~Q z+@4pSPo5#(e%^uJcwa|fcVACm$oInc%y-{+&-coA*Z0Kt*!R%4-M`nr*}v2O!T-ho z+5gc$D3BL`0)~JhpbE$X`2knJ87K_M0!4v;@_YT?^;HIpfv#{%I1cUrH-me^?cr8% zXSfmE8tw=iL;8>*v@WzZbSZQ>^d;0JJSN;NscTZ_r1+$`q@GFdl3f@p#)i>jbQmp0 zg~`XLF&fNe>_zMu?0IYgzAJtpz6-t&zB|4fz8}6XUXFi_e}msj$Vq3U@5$Jiae!D# z+(mpyyhXfEyhnUQtR%i9KPKNLKPBHIKO$==d6X@btCaIp8>5(^VJu~s7-2?$v5*mB z7#J>wol(TlGFC8_FdPguV;RHGfEZSWlYwWhWya*3WUpkuV_#(7WnX7MXFp^=U{|u= zuy3&MuphB+b6;~Gao=$7abI!oaQS=|pUw9ON(8F~g@RRrwStX;rGoW>M#9FzCc=h7 zop7RPnrOOcs%VMmv8YtMT3jODD&F!(&ODpN8^tTcuf%U9-zC+hUnSopZzQ#(pCvye zHKnViE2L>MybL45%I3*%vOThWvi-7JiiV0e@+iem`B!-Z#XEVd;;p>8B1Ta|QBCnl z{#{;M@k;($-bhhb@ko)N8m*e38l;-$9j@x7nywnJnyTulnx*Qm8l@Vlnxq=3nygl< zRcfXBo%)TsPu@<=LCs0cam^vk5zQ{mV+}qZm!Foeh4P>RXgO2_Er2Z0Vn_}xf&5Si z5`*bJhis4!f*}pG2+D_y5Clmf5#)smp)f?#?=h@0tTh}mY%r`b zY&Vn|b{W>{IO%3&s~fg{s2g4!>iOBjE5k!j6Rw*s;K| z(4}>)cadEf*Ho9ng>|L5M6T&Blq<=V>B@B#xMsN+E~zWkg?1&o=DN5pu}khEy3$=F zSGFt9HODpIb);xt(XpZfMTd&E7OgAZP`su%&ePG;%G2J{+T-^u^aMR25A3<*x#)TA zN%T(g&hSq6PWDdpcJ=l4_3`!c4e|~2_46h82Kf5>yuQW0g}&1m9#eT3X}R{9mWJhtnvb%AObL!5+aD z!A?P$pqa3#Fik`j%@?6WDWX&nPP9z4Tl7p+Cf*_bDXAxIDs3i>kv5Vxkv5jDm9CLy z$l57-Dq1Vz6de@_iuQ_biXMv2imrW}JA zYGK|v&G|p_?#fwBMt*w!X6P`q4>|yqL7SjbXg72OItcBBPC%!jqtGE}BeVrN55?=Z zL0h3c5MBS!@W61#aLw@4@WgQ6aMSSCaL;hjaNTgh@Z504aM!TJP;RI&R5QLaJTlxc zq?l%!=9*@irkGHsB-3mhsS-n<|^@p{lt-3ABmS)egXWCQk7<;;%V$ZhY?KnHpPO#JM^XyX!rWQ;q zm|4)nG14*0G1jrdvDC5LvEH%DQR=d~oUW~|fD3k+T+3Z{*D6=YwaiuIGP-=Ou*>G! z=yJG9TuWRlT$^2sT}xf(i!KzME80|CUVOE-9WzQAQ7Z1vtJ{g{#yQM ze{KIh|8;+zK+Qm{K+nLCz>L7Gz|6prz~R7wz}~?AKxtrG;6h+a;9y{TV0R!5PJ!pb zGhjSC6P^!a;8}1goD9!{Ghi%?gY6+}=w_%|I4ayC+%?=g+$-EO+#@_Ij1CV@8j@6; z{4sfR%4*D7%reY!%qq+p%vJ0S>@{qY`D5^7@#F9Z2%Pl28DELfltz^Llo(1qN&||H zQc1Z%siZz+++v($oMTilPB3mVt~1Uuo-)obPBAJOnamB$dO58*-8pfb7M$LkPMpr1 zE}Wj6mYjG_J5Dc7Jzia2G_N|Z7H=tU8E*-1F>fL7gy4{1tKfj3g)mceOnh8?Q2bil zUfNdrcQg7=@=nrr(w5Q=(hbsV8BI1wF3a_AZK2KoeDfo?)~ zq3h5&=oRz;dI?oRcc3Wa7efu>2g650jIo|E)>zy4%}~eq(@@t~-I!&R1yz8M$S#-7NTG8#|o}S*GKAs+)Zhz#l zzsa-Jv&D16Q|Y4YEP?f~1-8OUmLst@c3|Icy<^QP7Pzj!%|8xrI<~ayV%M2!-OM*7wIq4_hszQ_)Kg`X+ddDX-c_C zc|^TSy+?h^c*S_ac*OY3c+Gghc*z*e8N%tu8O9mR8Nivq8O|BU8Oa&J8P6HT8N^BC zH03qpt>7v73jPkkYSAju9?^5rN%3j%8SyFc8*x`@7io8C4{5x#=O20Omq=MM@WmV1 zN7;16G{p?XRK;Y)3x!;zQfX9qsvYW|YH8jzO@$^lpO#P0@2vj`Rnz}~+Ule9AE280 z7=0~$J^gp6wXu=0v9YDGsj-ETWTKk3n?9N{Ees36LbH%86ic=x*Rsy0w;Sy``}_h- zL23cI09$}7uoX^pBs#V_N*yJRO^#T1Q}P(FUmK^H{UnQH`ABm8|WYGAK>rf@8uur@9FRBAMQ`^AMqdeANDs2Gzl~g#0KjG zKL%deNTM{eOG-?V|!y;W1KPG*v{D7IK!B0qMKMIrs<1GYLQqbTVxiwrID?fZN1HI zx7yPS@CAf|DUL~w$&T%gaqdy>q3)jUG49ds{_YX(UhZM;KJM}E0q*-n_loWo4e^Zh z?DgFCkiEyehrRo}SRckW!av48#XreE!Jp_K>HjC^_rL2q&VS0^JkT=GD$pV@GLRhT z9c&+L7wi-466_J|8H^8h3T}nBz`Nl6@DcbpdmfsR|J;?6@qd>u4t`jh;*}*Bjd_a z6={n33cLcRc&B)+aH!_04eCk_Gk>sth<=d1kA9$jsJ@S}hq0Tnm$9pnYuantWBO`R zS#*|si{1iR)RyM9BD>q}w>#~H_F}uoo>`DpFx4^3jdIU$&vegqPjydrPjgRqPjQd) z-1RWLbngl8JRjaS$DiV#=bz=D>!0SI@keHVxE@}Kp$4)hL;3Sa{0z?9&$;JDzV z;E3R$U}A7|a9D6~aA0suaA@!vd>*cZufiwbv+#BJ9DEag3|GKc;LGrP_!4{r-V%Bh z8WJ899vGewW`>Kxi^5})e94cn53#)Yv+-95{fu)ns%6#4s+rZ3(v?z7c}i`}Y{G2F zJkG>(aGcJ(e7=US<#R+A#n}p~qDYmKKTx=YNuO!<;ZH%no0`oWjh(=cXl4o>N~?n=&&vL=J(I z$?3woCb%!SBpxo^D%~PwC_E~YIyZl!ezaB zH{E@|c#3DDXR7Cj=e{T1f5|^TKni9DsllvZdN4CsJ@f;P4%G1l8uplf9i^3N%eJR^0t(dKuEtzeYS)6XXRlF_ z)F{+2)Fjk6v@rBO6ce5rmW1VDSy&qGkV@sS6{C$Mwq^DM4uMVpwKHDl4Q224|ECz)nh+|XZawx290WEIekfA-}_(J;c8dNqfPROUk(Lqrf zrD_cCmm%_aMCpIkro`n^1T;1|PE4clz}b*UqW$Vs7Yqga8As>Ge{b;DPV#@%A+ml|$QAMhaaj~($N#Iq?<44o z%u-a;zSF((ssT1qwEe|jA^2YnpaFdc_8lZR;sd`J5Rm}*C4h*8z%Kq z0TJZ^zX1@D2KbGDi1L9i0Ysz)eiI-f9q^k05kbJ00wU4_zXcGH0r;(eh>XB*14Lv3 zemfu{Gw?eA5m|uW35duF{4PL5HsE&yBC-R&2M|#K@OuFf6#~Bx5Rn7;{eXy^z?T6c zasht;5Rn`BgMf&NfIkF?s2KRefQUT69|1(<1^y@?A|LR_01^3tKMsf}0Q?C+L_y$B z0wRKeKLv;=1pH}0L}B3103uod{8>Om3xPieh-eY;=K&Ed2L1vdq9wpz1VpqH_)CC@ zmH~em5Yckr%K;Is0R9RfqLsi`03uoi{8d0itAW1;h-eM)*8vf&1^xygqIJMm0wP)u z{7pba8-TwBh-f45w*e8A0DlJ%(I(*U0wUTB{5?QKrNG|@M6?C?2Y`sS0{;*Y(Kg^8 z0V3KC{9`~wJAi)zh-fG9PXQ6_0{$5wqTRqh2Sl_7_!oeP_5%MB5YZ=~R}p;%d>zpj zz&8L7KnCDRfLTCB;AbuaZ9v5xqM~TvJUjrLNFE!>Er2?pnvuL-B)0-WK(!)y{YY*D)C1Ly0dY118H1eLkTD3i z{w1rbh2%)Rsy_c|dwalmWE|4J40u6g{Wu_!Aw0Ne_Q^z{HCZ6`r?5NKT_H$`%U z$e6>CG06TPV-OzsOIB5@YJaQx{HN`m2jh`($aM<2HX!>^BNRAL0^C2<@*$y%W;m5yZ zRke^DsaMtKKW*>-UjO{x>!1I7{qw)~^-t7Sa4iO>P()MyB4oWpgS1VL5LvGt zY0HUZvm!*+Yy72V)!4s|M`|N^&A;@ks)O{as)h7J@>-xD9}sz6k^+RhEV=8-mLBpVeWvfcu;sQ{50bAXVV2$A)c zk#V`eBeljvh^%j0)ce={w@)j6^K8NI`)xVN9scFM+=^wt+iO%U)vMR20si~UiesQsS+D=vdf8US4>&H3t`*10Y=cPgDl%*l~u`Sa)~MFMj`vlkKEL>_|8GVO_|2LTDl#McA7L=>_xH)<9)r}|y5K*1~4@HCQ?^GMK{ZoM<|6}?2^QRgO7Qk_Xz_M!9s$TKao$+A3 zW4j~Vc0Ql4wcy<3mY_@XrlU4Cb;eI`(ikkDy&K*7`Z^xrW zv3lf-6jmA2mon(-%H&|LLSoi>wJiq$U9K~wuwG*L~z~&Z-xDLl{hwuB;@fZrvn{-N@CaQH1Rxta^S_J)a8y?Rkf6r?`K#xDTAf4dNu?Lx9f2-rG2Wb}`&KZ?vd>xHpBklZ%lrCuY)9i*qtYAEXWdK8yu{;XFFJRx#^|XRYtH-*)j!WHt-JKg ziqauD-jWHIkL|oR{`0OicXO@`6sFyre5U^8>+{E)TfL@#MYoYrmEhm`EI-5TB)G^k|D5?L}k5sUQ|0rzO-7~{qO4Jrygwh{&2+x3hMFJ zCQr8Qu_%n&zujzqBWrrX)#h&%7p#<77r$bOC9_W_m5vld?OJ@N|IUkvOK;97FS;@& z_u#oDU*BE6z<5lb_^pC9c#1K5?b&UaSNRDwC*5yfV^GGdx~q;U>fad6t%X{ZSiO6r zMzMSJarKUMEv2Pyg4l5}7pdFB_lTz(e6CFQ9;@it*?V@w<`v~fT8`N?UsHc`-%)A1 zx310Eu`f=$?fI5Xd;Rt9Y^mWtzfmw^>ZK>^#pmJX-LBQtwz$r35=*+P8%1`HW#rah zfn&&G&osCP|BP{UUl&z(V<=iV$<^@H`Nee%v^Ui{{3xqUC!}V5JdsVw;||Sf{jfHZ zC2D)|$F1HMOgP!qMki<7$Y$T%{`vFEJ@$!vwzj-v-;nue@#V`Z*SUoU%dQMhesgo~ z>+GH9vQu|0yHUGz+{~dR)2{Zee`QwNy6Zp8s4+BCRx|Oy%gmeTo7pQ~+F1jnd+1ZF zn}{dcXsNpvoM(3(dWV)=B(8U|#?;uI+gnuc+^<_L^qx^W4)uuLUE;)T?p>3yDQ)@B z^0EPE&X!t26@A*TtHf_8BL}*@Aw3H&W(e!La;vYb9TOZkw82v-JDS%tHL6zrjJ-w8 zWZUkn>%CDvyzQ2H0sDDp{XLiNZ+&@P(dp*3*o)^c=qKE{`1;eP8#I>oYR6M8_Gs|k zwtu)S-oO@5-P-B_u8xtzX!!H^sM^%D*lLY`hA0K}by=S-{A3a*pUG(|Vq6#BN?_uXmvB&009y%jyZp^FMJw+t&G6LkAv6N$6ekP!4(WJF!x~9EUkl zoH)0Rx#H;bon`0Dk6wN`QSt6>y}6}pW~Az{+^I$J zx}v+y!`8SdCCiE8m3x-me)Rg`*|(44wUq}bC5NuAT1Ox}4NsZW<0O+!|IQJuV-6Vc z64xuPPfT=d?(lX^-VU8|vm}~um^+X2yg!Bc?&I5DJGYb#SR{0`GYwu4UHElZxaAI; zu7R|2W!K>^OGf{czUA+k_K2Zudnj>quS#sKxzbmYR9TM=33JO1x0`pZnz^}q{LTh8 z?V~Qs$|{EMt$%32@LBJ6b}Cq2T=#Ubt!Yfu$+T$$$|qa0zOas`+!oIx?A*~jXTjpj z<7`GxgJK8DTVC0C<;f%GzubQ2I`QRwT6q?){R1hpvUJ|~ux{>rY?B5pT6byQ@G56` zd?2yQnB~mxln1y6imovyQpv;5&RM+9QSDCH+^W;b<%2T6@9MSwcKq5GXUA<$&^8I@ zl*H&)$4@)Np`X=2Kq57Ke{woZ#5Drg(ien_t-HQ($?nYqa}EtykEkq&sN z%KY*6!Na{}-+w3^XD^LeaN^{bp=RyQXop`iZ`Z~Vl;taCdbOkKuJm?3_N6q&cw$|n zxrCP)4RYR1IW?{#*V>>=FtG{lZS^jRPxfZ$!8!G5STYN<}wc2^s7 zA{W0CNAo@sPpqiO!F8CM&^$vmv|ccwZTB1PqQ*9f@@`KVpj}Xywa#)brPSHt(7PL{ z?_M5sFE4v}skq|9<6Y6~R@mBYWmXOd_IlY1dM;%iUo(w!f!&tysc)|-w{H)vq%Md) zq$bUKG_Nz|?db}?7xeaDsf z#>Rw8)WdbFH^jH=^SXKTkbzTrb>NE!L~p*$nfCrHGij)HicDNWAk8WNa-!jb+viV~ zp8RanmEW4tqG0%}{wlJ33CyKn6}@n)gz?9;5u@B6yEd{D9b_O52%&MvP%PHXO_Dshb4 z9)Fhesrd=|s3{L7$i(0ArA*58cR1CdVKFH$M8l_j+_)}g+pBPsg@aCxGxNU3yO8Jq zFh*H5)7`Fo~RzrG?S`f1sT+9e8GO{m4(THBJEHYgZ%uHj|KQ~&l$bUpItHZdu# zD|PB7gzAo&nik7h+^yZzWB1y35HIT3vwdcVHL?BL28hqwl-*q2>U}A__0cy&n*8*B zY`U!5#>S3W{6@`iqnmf>|D&1AzOBXVd$N|drpz8*-lt%M-Fa-(_D``RN57afE>@=> zn>=#gXbP(O7;MY*p=@Pv*w6!4hg4hHYOro^>VQp`iuylcUKn_zTH`^5_nGm_3s!dh zG2mtQWB7z_vu0;?k#}FvxwG#tQ6aP%isGdB4He~o) zdL8xptZ~hANz~Q7iAnn(XI?B{M!CD2Ox{tWGu1}Fl^u7Yd|Jze&8N@lm@-o;bjP3=E5^F-Q_9X&Ba`nmQ=l%X_9Q(TaR+xZB@VBDPMyEeumn5U@sv>G zYtJ;?WOjOPzqJ{8ZHL_6%Kdoj#hHzFDwgu^rfnMifLZb5;lS)|_iNRc-5Wlm+slS= z_g-K^i=GkRWj?=m=l`+y-T_e^-T&}KMZw;?$yyLlK){Z5g+)+ckz&_%VHa3gc5#;# zP-ASdMvXC+G)tPA#NJEPn5Z!(*2J1v5@R$?jT%cd{yt}B?%lg9YM$@&zW+T}53|$H zv@>VUoSA8L<@nU!uTF3G(XXEjw)}E^OO1#7j~#um$hzR46=l;Og;cG7zrm{!)*hVBh~?XAzpwm7pdzI)yMU-j*`=kLz*K6_`v@lWSnskVFh>coSK z_s&L39r)r#wF(Cc%Ef#Yoj3XG`p0)44&7SnQ1|((=M+B3dnK$#%UA0KU7h<@*AM1@ zlxAA+=Pym>?HzaFwY&RwEIzz)?4tQKI=r>C`2O3?>>C%>@GX43*Y=1vUpRX6jqtY9 zW|lMbetGD{O0z684$uDW?Qzr3-sv%8LVTHN8=LN%I@R>X#9fv9Pq@71xp7C&d^bMr ztGSahKj`yPRNXpLDmlKLyyVCaD;8|iEI(8x>%)7t_dXg^^y{kL)q_`8|Jc4VVBgA* z>yE#%tktirKNy+rdQaPJ^ZTC%-(7MuI%?^M568Uw_JW=79C3cW@#lJFH|$*2ebcnB zCv2{G_Um<>)>c`cQ6+wDx_QQ$oF*r?8{%qhEBjaKmWa3JY~3*Z+>VJC8h&zS=)hgS zw^_K8#=kjx$Cepi_<#7v>W$U=Ey$Q1dHr1b?+m#CTRWV5`&!V3z0>u6FPJWTV)vQi zb8^eB6TQAaHT=)kh37Byt(w_?ald-W_ru@6Qgd-U)LeCK1$zBLDWj`HieI&#UNFJ{%TEsmswRlg%40M14O{Kl^aEpw@+xt6uu$$HM+8l}`QM zJ!e;+yG!r3y#D#(1#vCHn+(+VTlB+U_V^d)`rY3D!m{q)*4_OeFX_nQwkK} z{KZRNY!O(m=fiDdG}=@-IKW zSnkE0lZJg(_E`Rsp_}V8ygXpbid&t}*GhQl=RHR+j2mmI-0I-y+_=Ke-lpFYPVK%e(ygwIBi(WhKO=^E1qAT_}sR`H$M37{Hy;= z+Y%O=UFXfTQu%?uZI8P?;#{kQ1L5QDolXB)m-*I`Zn^jNPdr{Hr`@NHD$|P(wjXk7 zRr1Bb-5;eT1uVSsmvicjRkg3RuYI@sgfedjcHPnJ`Kyh!Md`1vK6zormum*M?zCyZ z??aFNl)h$ca?fw;{r1S(xKoCI?36P}8j2t)KV%baJJ<527}{cd`2?pH6<@+bTG|POqfft8b2M5;?!xqUl9DTP|#LdV!|* zfm=mktKxR=_IY^h{VeV9hC}DyDel-pzhM62A%EUz`jcm@9gTM!`6c4~)Y*MA!;SY&G%2%a_#2;m@JYE-pZe@-XWOtc)!(ny z8%d5vkAe@qUv2W}%>@_tSNZyM)mNAA{J2GIwR#bJcSU>G)Tg-By*AIy)t*_~JayNJ zH-5dk@80^Cm+C5HRK8xXoF!rD&OUE;KHDyEQrp*GouB+qSlH`Z)0#gxcV$ua5kp=s ztbMV~p|Ex*a^7}p3EwrB9e&EE%JMMLlJZ1e+cYd(zyAzcTe{{6Vfaa&eKkjo* ziu&SYpK-g67;87)a0>^wK5u$>+q~DeeDZ#kpi)~F8GNVu?W=ft-P#IQo3*l!nbJQe zq1va$Mjvg;3hgrTJMAkzXGfG>cuce7+P76(j9B~9w6dEvKEHU^rT4FF`KEPIxdZQ1 zk?ysb@4tN3#mWoozBs(ncE7wXp>s^u1(!1i`{d^Kxz*5W%y`Khe(KK*Dal%P-tP^3 z-XA@|@7AZct9;(iyyo=2>YJ}7&)B);mj_#?j>-7G(fL|uLgQaPKIZ1%-z1n5*BSdq zZR~UC-5pZFH`~L1=ym>mZI@H?PQG{a^St9HZv7o?xjMX!?ev3{*;8ZB4BK)frc9`_ zb?HVweONxh@O`B*2aJtZ)1e880m!dhTB3 z;L`^dt~s)>$^MheHw;+crB2v}O5-**TeS9i zmANrf{N6qGoX?**ma=>Pxs%av$T)NM!FtwqxB$NF&;NYWVC1ypEiY6(GiqS=_r1Ql zxAnYz*3N79>TKQ_J#5XaZ%>?f_sY_vbH{c#wdZsF`9D*RZqL5)!H#~}-8Po}K5kvR z-lrPTO6AQh|CWE*6~9()*UeEb`z2qgUyXUYdQJFY%cz>8*S1_$ zaZ`g1uO6HA=1<@5tTg7kYnv;aJ>Pip@nhfI_~wTmIp43p`}~=Sw(&b_fBo0i=7a2O z3NO~(+_P}1-@wa{stnK1D%I(vJS$1yPxqiV-PiOC1pEWA%b7QY9 zLvk9FYGH5r+J*`{+kaMZ*3yB#=Np8Ux;B%>f4v3~+Q@bp6IzC*erB@nE%QR*EnVM% z%O>l!^Y?#odb;1yJ=^2&U%N8>$6Kcle!Nj%apS77iHjzN&YH5Y;o)9;s`p7f-Lz`a zt^DK0YuZ=CR-H_5zwvU-h6^{I^qn|q{)7e#2fQh*sJkZg{@E4n4!&`@aLABHR%^p= zwB62sJ+Shkd6SyG^YY?aKQ3DrtJ%4t(0Jp@#SgCBJo58r=O#8gvv-|&$dFYZ#>6iE z)t>uR(8&CUmW~m*t28YJUaL^fKcsrY4teKe+uhtZq};mS^V3G$$~A{?Z*lX^I}v*} zO=~#E^-8%VZR#xE@pt7(Gq(k-I9J?x-L($Ro5hcYUy0kP-P_=W{^weBzFw^Ny_zvL zW{*B}%GtDr`(CRx-DhUy?cG0UdS&9S4yX5YShBZLD?&QMc{a>x9_S?n#$8O(0IM^HU7Bj&G(XH;HUMh##PTlcmO5Du##pZMQ!^U2V`1$h9fBt#6XVoHbftL%UU__bhoby_EdiP=D_OF zzi6A5`qY~L>8V2PxCQM__M8=Zx$OJW#=SclOqw)8JH39+!0m&g3$H93Xgz(pR;d2D zitWZ40vm+B)m3Wv{nmw2^(7M{QfI8nc;(fNsYk!RwYT=?*KYN@wrAOEf1RHH?W%G+ zu5NBPbNO2l=W<_y0N~5q;@^+w$9;TvNCW%D*cM?~=h|I-ac{XLSpH`w-ZVEUweIFm z4OZ-VFMQIR?BK;qnqS(xYRkiOi|?Jd`Bl{6D-TDHTamlt^>qUuu3PNi^`l80UJPm2 zY)#v8wQfAuA~v#IM4>Y-|Kf%|xkqk~ik;XlbI7{FgZED+9lLnB$~_1GE}Wb+bM^e{ zy*ABkTH);_`Cm-huANr8>5$m^9jxUdYIXZOsB-0(vh@plj7?inI=%S*?u3kkl%GEBuF$T;GEQH<*0ko1i=R|lcH}|x=@Ywko3n0g z{*h)|EeC7e?QuD_)1ZfiqrNleZrnR|;H^JW{oCJ(>o9VQ|Ejf1t1rGjz1vr<=Qexj zpz-gsXL$S4lfJQ)irqP&od5Fg${yVFYnhp2*7@pdzf`$KpDk66cA8yj!AmD9reC}0 zU;m!T@6_DX@{2;tR~X#0OT*^x<~O=@py%`N6h8OdutvcRT2=VC{_n;&>wa{8Pd&@V z+tu6t`9+O83m;Wm+x&y7&V)I&IuEQ_^PljhwYSW|{pFVuJ0!+l=r}v%WTykK&WfsV zcWbwpKRS1vJgGwG-BBrBN+p}y4Xx9^{aY{C+n)KXU7NZqd?NboniM|o+x3yhbAM@F z&FA}Oxj(%UuwwSIz-tlzG!GqgplL>8LX#zdqcxXbZ_>Eg%~~yrHUzcYcJBG$2g726 zx|SaiI-=pNko6-!3%mWr8?D;EvoimUnY%~y|M`ydxdE#j-?e_daBe`uk$vm09xT=zU*4wC)I7lQ%YIioL`A zbGG}hT+Q7$**d)Nw?R1(DWxnoJG9MM{i0uHUafA%mLFveyZUJ#^9LutF_}L3F{?@G zZP^zrGviJk)Wp|XTBmpF^GUttxQg}XG9M&0^goy|aPzB)3%`Fq_VYIu_AGmSwXS>8 zUojJ!eX9LBGNyZ#{>~opms>>7c)3y9jhy84)}^xhxps8zyZMBF>fPNhr$l|YJ$X#c zANuSZ`|ZFVI$jy1Nj*Ox>-Wk1-hQ-UO_kr?S=9IUVYiG|TK#b8>hDvJ z|N2q8>AzS8fAX-#mg^6W9^3!V0_&nj>19{kuU|Ff?^B~1+*|Z{kGq3cxo%2Vw&dhoD|I$DD`gGBdVW+mW?|0_Gw903@{@C%{h}%2P zuU|al``e9=eb>JCPbYILo;tB2>)JQhPHp-&blvzP8Sj-jy5vyn#|*8=yQX)$(x-R|*w`t|+lvw5BW{`B~ScXn61GVfsG>g8X~-n;mV1EcpHs8H?3 zS25)ZzMh;HeR%ir`iDww4V|-ke)m`M9u&UXvPan5t3mbVf6(=<1*Wu*<~8}{&(|)D z+q-zj{=19Dt~~r!hZ^(WzF)j_;YNG2*9(1Xycw~**BdvFzA$rI+whlr8_Lb9baCkH z!!sPwgn$%l{xg$d$xP4ek~faI=Fi8mG+OTf4p*Ez_J_T>weJs*H-W0 zvA_2>chfGp8~pjwsOX#Tj(PauJ3AM=z43GBkqu?*{k*CBvYneJd_8U5*JmrPud=q& z+W0CNYi5|!x1Vg1v#nN~VN2>?Ww*|GD`LmF=^H+2cwyqMfkV&iT-fG!8vk2%WSc+q z|6)eR{R@BW{`;v)cl+$hx!&^b(zpeS zKOfj6yu}ZT`srVcxBs>Ow%^=uyDxho@4@c6Z5JO&n%Q)7%f<8S?hS15;*xC-d)6zZ z)r_fnYxb+lDxx5Nq<-J(;vtg5lF3CT3 zxnZ5nw^nQ!kWlM<=c9Xme#tU++=bBxTUGw7FfR9Cr7G_@*XHaumf0VCddrf882iH8 z4~{>2<&P}f?Q^DmgUVY26F2#G4|;FSwS5gMPJMU$*){b$W}keq<*}kUb8XMx>eT#B z>4|T=k~ODQx2eH%`~SWnW>{LqyX7LDOI&{bgBypp{qySi-(thIOiO#SPWEqs`K3l& zkK2AAq1Cyw_r`^1>V8ho?Y88t;}iGa`?Ot7o#N?L9G8Z)KREbe@~Wh?N8SIrvM^xP zjH%Ar?XT4?Gokz49bE(8ZhZCmX0N9gX=hwGxw`e>HDCTdU{j~`pNK_rcY_|Wz=Udw@SDO5(-^Qp9 z@;>Q)@jc%MlRvE!AKYs7?WA6jO-A0FzNp&#g)Mg$X%?JrRCMb=@7-~$!j3)k**#pF z_5PjtLmTQ_bSxgSc>aQ)n%?*`F}I%Y?UQ4N{hV=hmf_r{U-$UWN*T5BYWo~1_Vf`5 z0H&Ug_$55E@9ZWg?it@0zNkz&2mp5Ze0pl-23xyYe*USA97%7ye<=9T=FyX@RoQ>B z;MJ<9zi#pI&gC8IRf`?>{>Y}M_GP(-jq<7LIK1kgFP#V8?DyV{CfDlD@A+_L#}&G2 zL%$lC_($18H>PEN7t?&E>8|$5y;jA2v~!#oC1{+JzmeHa-5M(%mlW zwoe?d`SHS>k%I>RRU`iDfQL8IyDqd&DBJj(uEv;sGY)+?w*893CtlQcuzl8i$e5AS z)_?xxA14MhI$^)KbZz;YHJ`iGdwKEr8V4;WKPs%eZtI?-g4+f5tVd_4-fk zmb9xdt6?A8K6k07MK+QF9Q-_zl-=#lk`ggR7d{rBLAlN4K~m(68@hfe`q!NWdNGM{vJ$d zoB2%u^nm>m;-don1_J8C{u=U+#_v&pDA>P2{x$G>IG_dW8(>m>P6zaY{TAXw^T)3* zptjTGg-eqpfhfLR$Z3y=i+1BthPAK0s*{1Zj{kAOV_{(F!<;cEmmhW#Cw zK7jE6E$lzQpYXv+KR;+M`M)aKzZmw8upblcZ-G4+_H{4`-)Vq&*#AU)YR_~)Evc$s zDIebcP-pUM3;!=g`$OH&F97xrVN!j)1kl0$3*uAz4*@iS{SDFn(4z9|0{a=!{&}#6 z!oCeA^{1JDMA+{mKD9sfnHnhnXQKU`u%jLP_lfqWI&BL32QVr8L_jp`ml2=Ze-Hrm z>_1<$|7h4d!G1!te=h9k*Z!MeQh%BO=neZ{h)?Cg=}Esjs`kgJO278-KP1{e8}>lh zSHYzGrT}`v{s-byeHs85xBiPn`@aZ#H`vdK_P4{{3ih2asXxsI=wbgywEvUF|EEZw z+J6{8gYZjXN`P^I?yz5kKec~N#9t8VZnABcV0dcV3KzwTd zCyoCDqWw(>(+uHPz@+e#05Py%MSMzcFrXpquZ#8{1AAxKPmA`q!X5(qR+tq5F9Q-_ zzlZqLo=+P8dqw+aAWRd4e;;Nkzyv@K*ndKNYL9_{`moOv?LP|kDA>Oh?LQp$7O-!G zN%c7$& ze=z*l!z6sC0pel5iTKo>Pa6LRMf;l(CII0-f=TuD5*G_yx0=+z*QaVVUtg)7uTPm; zzFMh~uTS@?zNMwQzCNXD`Zkst`ub?9`}#}ueSQ3D`;M2o1NExDr4WBS;@6}2b*uT7 zqxfZO`5Gzyu&TagD1Pahz7Z5Zyt;2CieIs|@25PzR86W*Bn2A5{?Pm_FZn``xD51( zOGB@?lvG*rk$|!C{f}Rv{`Vw$^*?^alU}`px>D1t|M4rH^y+{7isyRefBcH)dgXuo z%K!M4|M4sT4ZlLN8~Rs`@j2C{8u(We|7zi1ZTzc)e|7P%9{$zGzXtf%5dRwCUw8Z~ z4PM9>d{H@YNdDlCDu64hg0yNNUIXcQsj1XbYAtn=qH*#y6Q^M(O7BXaNk5XzhkbJX zvPpQzxKsz{Mfk`#$#@ZNRi#AfOQe8sYPEt;Mq9N#LrbiUiGBLQiP<%4M5|i zPjQHJyblCWrG3iyl=boRspwPHr>>92C)}sI&oG9tPpQ&ne9M;e^YiyFU%oJ{_0{qE>OSME_l&RpGrk5-{~AhE{xZJ4W$~56 z=O;dY@s;=bDtLWVUr+m}E}!;MJ^wc!wb6g`VMT#9txBev zpI-e98Z`VbzefM%$Hu^a@uw8xVub*DA%7%a_67Cu1(oq-)TAcNihzcIQh@3JT6fh4 zlm*lVR0cc;@Bvf<_yg(z=wB^BB|sxUX+RA?1waEpIY1qN`Xf>#_J8(d2 z10Xq)Gyq7PLGdJM7+@S=HvkAoyTsRqJd4OCJ!z{QnN8z6XsMoS`Sjt~rKa?J%Dy$8uo*;o?bp^={tFM|csm>trk~DxI0M#8NZmj+w z&0}?#4|5z~31Bzi0^nI6;UeQB<3#0`%Pg0b@RM<*zD9TwKpMe-a3%ovz<}DC0MZu* zFxXeMDX$;0)Bwo+c9?J<7vT1XgzK^TtB71*1|$H!0)zlQ23P^V0U83{0t^Ox2j~pg z0T=^#04N2R0O$eO184$x2ao~y0Z<+ADj)@L3=j!e2XFxX1e6C%2lN7b31|WM5HK9@ z3!pyW4ZuLa89)?Z8(zf|UI07< z)IbSp`1nh6Va|n_3NsbvahS(pwuadn=6aaxVLD+tVcvv!6J`aN6=2SQIRj>In7v^h zgn1BVOPDQTegyL)n7J@>Vg3s9SC|c8Hh}pi%r{{Uf;kB0S(s;Gc7oXn=60CdVUC75 z8s^_H|At9iRymkcU`~PA6J}4C`(f^f83;2F<}#SeU}nS2hWRthpJCR4SqJ6Lwujjs=4P0iVHUzHgn0+%9hg;MR)IMi=4_aHn0lCpVIGFr3T7*qt6{E& zX@_Ztc@5?@n9sv}9_C`0i(wjI8epD>c^+mrnB8FRg1HOki!fh=`3UACm_#wU12lkP zfU1CGKsX>DKyt-6KoB4YP#4f2&;d{cC+Um3=%Ze9>%v4t=UH<@4tYg?+g&w+QnKVO|jCbz#c! z#^{?_id)b>i$$-uSn{JXthn$x(uta&&t^B74fd=or@4UclrFH_HCCe|+su6>$-sk$ z$+4VKxYi-pMNX9 zlD@IqU6q`qhqKFOp~wb{t-$QStsd%##YoQ*5k>c! z+YAxj_(d6=nHG!MmE*0C%FHo3aNW4di*-Axn ze9cBvhAS(}>@dh}Ut+tB`NhIEr|@8P%@5zF2DsXNpg) zB!{w)gS&NPXUVCLa+tF%PK-Q*+2OD|s50?63)rpq;gZr*Hz`b<9V41ofTi3OMP?fJNu-kt{?8I3tFzn~Z)M!3vUKv-mWxHBkN!)~f~ z$XD?*&k%M65D&pq!Tq9$Z?{3$2KNL}@;1`ZVWBlabOTcp9=u5~Va>B(QODS#9QFbP z776hvc`kA?X-xdG5({dBJq;j%KIxn5n@3q}CUX%*2}mI_N;%*L996nDJ;FH6jslN# zjaCP`J`{owynt@>FS6vh@-$A%sHf)dFz4X{mZ0D;+?PtV6DAyrf}=D=o|$v}8G0JK zi@i*Mw+=Xc*9QeBVON)Z`k;Ztgc+U#=n^o>6pS*G8%+9G z`a!|c7`;A9Ra}Wj;H`ys1#EU(sLh;>N*ie=T5qGc`XIfHl0kMX&GZmWK)Ogb%i_R` z1el3jd1hOIl1?V>bfVW7G z1o}-Mw2_p(?)6%;B2B`fxbokIos^;bmxP@ zqdR)W(?o<4DK%!I18I0@fq+*y#V^BX(li<2vV&k}H_?nVS}_*rbLLv|EjB#xV6-~( zjhS+HkxX_Ms)r(QCzIJ~$)o-%^5L|Gkl+qhi_Hw*JlvL5K!cmbbbB*9vX1f`U-{3Tl9R`#kVdN8BDd9r3pa}}FQU}Ht7?2r=yM*%5wiwsOENT#PW1gx%HgjPp;h<5q8__L{ZkLT! zmPzCgsxjF$#dep*W=4vjD!2)YKl71gL5F1#(EA-uqZLD;kR_T2wg!4P_*^yx88fs4 zaSM{kSYX8chCqy3M&rz}yHGMg`FQ_us=Jyd$Ye1w1Rl$n28V{_B}NyoSE7vtMvx^< zQhGuHdtQXqx54JhldFK$FA*uxgOm{&p|k~!27x8`Nl|#-&q6dApgA_o3ykBVI@F-O zkvNM%16eM%x+w5>qSKKtn*w+fVxF)&OiH%A@?|^=9h9QIkfsO)NBLC~IWq*7!#x&H zII!~aK+Hu+OO!Xqh?}pBnkFm=x;%TN1tG=w(Aend6**s{dyKOp7>KYN*npJtXBKw^ zH(@~lx!P6epnaSL29X)@@XF*Y4^WY?%T}@vapH2&h_GRNhyn%TiJV-slcq7N*$BD~%B-{kM~GgPc?M0F0%!tA;o;fu z)Go4>&pFEMz~+wNAfiO*(PZ#g=vOw-NQ?u485)4k<$Z~AY6>0v&72HOxtd&au_nu9 z%cLvJFq86+IoR!1XIO7@aX%KEQA&Lj^l$L-OURU7A-8mIjBjLRV}v-bI5SUPAc1$z z%QqC*4akk+$=q_ffSsBlmm#GuV4{*EU{&SY}6WX%!8UWI=I9cQwJ*txuZD@PBUWjX^-epp4!2Q+a#&YTXo#<42fy??&uT*_f3|kiSK{Se2G4R5bm3TLbvt}7~m(9eoj2HcwNVLOl zRZTy<;OVp$X0tZcJ7>mGWDG}Of*^AI!2%`4?&^=vji}x>#u5drQD4N+WBx3W?~*B* zOr<-7i;B^)DU>qhS3iPbXCx5yZM8dr8?nKRCt)+ZS*}layuheHFv>EQqH+%@*`4!1 z7E=-K8MG0jP3)!2T1t2?i)LF^^QS4?2Ev3MP6 zw!$5F8)(|(NrNW1tmG^eI5-2E1-_FCL=9jhMuHDxNv~RCXxK32^a+y#o-w1)tUWUA zdHGfg8=;gc?oeTCX~$y=Jl-v3yp?Vzw-<}{SUV%VXp1A$1xXedCWsXfjQT_Y^fH8(4BQQ73h%m&V0AkPdC(ea zkXT5mDw7dq#wDUszz%V;jM+ud}Y z-0?o1%ZalzP9oeK4T;>d9XM+vFypV_jl@W^WYbuZDTQoDiiRvK$iVkxV+k&)e^ZkA zV0;WDqA;6Sm&m8Q3>m?(DpKlnOlxGdI!P*7>{-e5o~ z_kYZthtGrP0WC~7zM6}2aM3F*pE&Kr1b~%}sCN?c$W#}^M@da)xY#U#{Aod-iCIsc zzjN$`nmnTo4(Vuw1h_#ukbt=hBEq*6RRz&OqdHG)Ui^UqMn$Y zWkNF)%Le2R9bJ4D8!gb>5xBjC2wa?mG@Pys%H0{v$|TQoAUYTfnBe)tiYx?WArSqy z)g*b9lOc?%;mIJqr}{ssK6r7QSf?^^6-$&-M0)D-GJzRNnB{V?D|p={1-*j!0qq{f z8=nbqSuH;1j!5bX4hqs+ttL~jydV{Jz3d?8L3Ksn7>fnl3?v%B9E4_MOcmVeH>PvB z`#=t5Lday+6)6y?4lMy#bI9>2J(I=B5|i9k3lmF+ahsV7ULB$*Fp@apMjysmfgRHyw~@TB$Y9B%yZ<@DkjLjo zC9_V#NQ8b&vwZAOrt@Su+0dp&$H$8V^oYzc7`BFBf*T@Wyg3O~)#Zxh9dyG9vBGO~4 zM7|iJWgincKY3L|^Cy#=8NmxaQ~E~*;1V#<~!^?Nt{5H*1JUhozSBlNyK@)~SbkQ{(^(Eqxa)Kb* z0FH}f!UhA6M-n1z%0M_=kb{M6c8;d4h9tPi3TZg8{~#g|8bV%216N*RJUa&n%;d>i za$>?D5#)cGfKkKpkuYy#Q6MAuAK{?dHxdIC<;${U{ePJp_BXKChMr3*G_=E^*!gyc z#2>kr@lMk9)A#6Q(DiqVs(E$Fa(;6W_HLn7&{|+TisohY$K|K2I+@h)nJF6Sfg)!K zBcG?LZl8afAVawX+D9p3jfXw7{|LX5*CBGf8mOw+E&zrr+o@oP!_he?d5A2y^BQS!mLS6O96|EeS0=@p+|b^o_K6H zgBcdV=@}%m3G7EPrh`08nrbZ`A}mmvVOX&SLA)LV(sZfp9ix9AO+vi%r1)rkjP5^+ zX*ZE55JEu*p+ddG$vFC$_-Mw;8w}u~sf*J91cl`EO4*gCX&XL#Y!E*${Mi_E6G<_} zYZ%w;!B>_Xo?49Q92Dde9Z}LH%IlT1yT4N6k5M%@ef5fGvYQ#-!IoQ$05STXnx>8J zZRnYx@1ae=G(5tEC#%qQ1+qLzi$w`mSnlpliy_+Eb+{PA%O#%>&!dB3U%?boUT8SD zV;EQpilCFo21IO`#Gsg{3fZUYpQgA%j7O{zmWtt6|H}LJ;0_+=iAs>u48kI0h|FYZ z1nWzUEqF?vpE5qMG*j9QUW&WC#PjlhQvXTSrNyV|5>t8V;7e$qT_#mrb_Lpn<$(y` zv|@-qC6Ic5!HaVP88=C>DG>NTyTF!B?7@?UocCyhoP-uSd{4?^%XcwaL@3EiX4Y2N z~%>nR?`n9hwbTK;Ax2 zp6_g$$Mb&bl*bVBDuTG^4JIaC$=h8H&;8wsHXiPnU}YcKU8JMe50+YlCzG(^KRnizAI(Pc%h;2p$vH{1E3@M3>}G;)wKXZFPkjMy2< zMUKLX#(Np%!}b--LCjU1TM9O6?KG)mo3XRcb@zxk@|d2r!t$4EDJYkh4jA|3QIQBO zlCZ{PIzPD@UJDwkLV<{ZJB6i)y2^|iY$&ulatBAW8|)m+7s$@R24{}3^W6B7F!Cd!&+p0VhR_nNYAW@Q#G?7MR6v3U6@Y+<>JBCJ+g8W23fH zVk$esMrCK%h?#|Ywk*Y?uV2uh04NIPa4 za1W4sQ=iFT%KC`sFo%JSNlwtF=_nbp$M;Oqr|6=!spJBCf<9WCzq?O9O>_$%8H;Y9&5TI5cR2|WrfYJ?7c zKq?yVF?Z3RC6tyil}y>MgesHib!v)^ai1Jp&}ln1vNLluOz!}WkelR#w2;1lm@GSi zZ#CMw1YubNoNyq3P6uFTvr9l&+wc^oRDgIEahS*gg%qfP!LFPH5iUGOIb4AqTRdjy z=PBW27amSO#%7Dkf=&a=3;Ic9cVexbnZp8be=H&S_BHpXB_)?dJA2^9+m1ynxW_p10ui3$=9WAst1>SVq}w$qB5f`I;F zc&U`6L_B>|DqCU*E6$6dB0%}LHY7WTWfLyYSCMB$;MY6~OYlrS2_v$;xo1qWqeMI{ zRZN^(iK42(IWd-tSPDTEUS9SJu>+rg*jWd{P4V_B!;|B4T`9R-Oz$3BN@zxnviu6C zwU6KsXv1uji|glmhohCWS4dg@MkIw6wjSw*VqWo#5E0p)W8x|?f)^r@ZE>k6|Cs8! zclus?HCTO!X(R&k7`7xILntV;b!7W?9fCcPA~%7ST>S@;MuIv>Jt!_3VW zsUlN>H~Ka>EG`hyWJ4py#&`*8Jy9BYZOT``TrWnX#E1u*4!dx%$P{}_XYY1=W)UK;V3uc)iD!$*+a z3KSSi#Zbn|p4Q8v?ZQRPaYKnHq7hT5^jkIZM)0&yFv9fvn9PS#QmPBJt_gGoDjcw9 zAMy&9|HN>_6e^qwV{EyYOh%q+!7at1IzmZ=?1%iQ96{Nr8KU5b#B0q44q4$0M8n9K z^OQ>nCr%GPGu$(gC~U#!ALL=CB2iv$=^1UqimZ^5Tu!%(2UVrcO;JPHFy|#TP6GG=Pn$Q~;*j+k-|Rg7~Wq?HaMv zGoF#3t7%CAWJPsCgB=f0heB3#I=upvW9!qUeKXgpkgHRzU_MsnR{e;ck_?vBP|6LUf<<3^fg?x62aun0JdI3w_TxN?UmWIq?aAK+E7ubMS zn0TZ|M3ECoV2y;_=j6jQ=~#R#M3cNh6oEdI2o>0$7OTL{@bHR5_)~gL$fNF$SB9>}A2KL#Q zDh>+;`pxwkPYj+19acI8ET&P4$OUjh|3Qi97T&X( zeyj+*b^d)vc+%9T>}Qi+0|vC%t8{0tTDR$gqV>Vzge3G=qAf|X4f~#`2URslB=D5o z*zCv8szctx&NOE-c`b$7T*@cNfqSRA$TQTq)V<;3;$CbOaR0 zl4*8}sl`+V?m?lGob>WqDB(&8o{kebhH?+%2$0MRXPSwCd89zZm^c{XFc}jL)gn5^ z!BU_am3>7ySo#K0s}L&VSCnR?#a!5>3)@&#dIUy_J;P~-E&)S?#S3G9SxV6mP`GVg zayoQYLWZ`7W$i?n!D2Im(ox(e=TSd2Fu8nCCKxP(|12e1*DA>e$r}L`=#B`{M22WuQ)#(qUGU#IXlPlIf=+|eOgKeD zImDO19t2q|tk08wDr3miN|ZPVXbYuY$5@?MMz6sy&;r+uhZTYW#xMujvRGQFEQC58 z#$!-AlnwB}CM@wCPe_N#A*Nm05~RaqC?mub6peRxmQDiO30CJrG>P(J-cnNkZncU~^Pg?CQgv?T^d-SZu6O^RZh@z-#IoccLhnBZF{>3toxBiB>Dtd6bGg zmZ@Y<^7%J$S$xaC%7*llEu^$-v2=pIaHP?cpPBbG%xJtaY$+3b6yL(*v$&B+b)f|(U5mJBvC&WVk-KqZHgk96IbqTY67)KYp8;~)F>zs)Slj{&P^Nu0CNlCTJ2)_h87}OmwJ4)WULU~U z5|v>ws?x)SN_6J}@2Hf&dM;$)sm1}6C)sgx8y$b*O)LD?jqp|D zPIfhJvcHVGY^N$wp-9dw9p;AL?pC4Sa*MEFY@e4A9az;BX@u6l-JY)qIs|_v4>@^! zi!EW!6mzv+WlheS);j_iXTbn+qD4bptq#l?LntiLap6FkpC0Gnz@I{|IopL(u7dP= z$0B)ulrb{H;G%UaeKcbfK(~abi(LxSSEnxQlY& zA|&v=2IhuQM~Qm*vt#!n1jnGbMSN7IBU1^8{Fp;)u>&lp!*9*1^&H4f=%^V^|Vc`=?C?kr@yptRJQgmIb! z$2Ez5XB!p&?2&HM0{w z?mmR8i6AV5IwfPD(0d?OhZX@iZ7}klvSl{m$3q3p0f89K(ty}-SsLY^hFL6+Ht<;b zG*T(7zn{zyOSBN&?>~q=JLc%NLpH zO{P#GIOju$N0TtEg`%0zIPB~;7T!2sjk%nk^1}VY5s|Iiv~AbELq~0o=onorMUy+S zySH*Tbwh6ycvx6u zYq*0Sz!^n#g79hEQI@l)GUD!e7UBZ95XRH9Bm1b#^kvzh{w)VELpTX#uyC3z#W^`r zL*j~&p5-I12%nH@@U-Z!*bkCZG%`gmsL~f0LA9VrLx(pq%msyXhg&FBIP(jlVmrG; zw!yw8gs&yI3qejwm^&->t6&s~G!zzHDGIUmR17o-aNvO;t71yZJS|$?Lg|zyf7SQ@ z7ydHd92H#gK=L}(ttT?RO3@WogN~jDN(H0nS|9XpR+KPqeL@<%s!0KfR&%_Fbe|WG zi#xrrQY1UIJ^DCXHzwL`QW~z7>4)WJT8>MKby%cS++&pLvPr!#&SK3O65b7wwD}I0 z#ZoVF2V1UnWlO2J{X>sonq(g-#o&%%`U0@~hX0W!4U~6HQOX}!+tAR#*-f|yINg84 z0>aywN^ob%dAPIm1Gqb{2nf2N6~gZIqD%Ow*j@)rSRBegeCUkWb~Y$Oo_A;b75*m6 zNbDb=f|a9UL>9SzVi4;(o+l3<507p~_t;PmRLPD?3dc?(dJZocO~@&f{a{fdmN|*v zAi#n=kL{R|R-VNkgq5ojnq?lMp)F?lSPmuncpQ&zXq0uHWdziE;XG#yDy5TB8`E@) z!DcIfp12cq$_lYOqdRP-<#fx*=o&d-;4_Jee2-<6`)B~mQqW!W&j6=L23?f;Yk*Tl z(}*_X&T#5yK};_z0GGoWivw_uD?ruTc%Pz#OZF#sci(h}_H?KC`XunKp!M`yrq#$0 z_f*hTJ0x2ZNA&q2V@B-2#TMp(&S5WEIrd9@A^HS6`Wq$=(1ei^d=N2=Av_hZlU)LN zLV;}e0isHrg`ph=YIv%Cuz>8uyq;~>x?L>Hj(ZwOK@_-(UkY86 zKAI^?kUojgClQ^c$I4FX!t882uTefAG|BqZ`2MVa@<2gMosy6Uqd$;I3PMcb-L(W> z1lyuWk+lxv?49V;>_9q6is^8v)ePOwOifS74edBAj_o>L$vi=i`UJA5KT0oJ-Y`cR zENzA-iOPgX4b*|$!<71kR%?NsdKUkpaW@kka%GV*^vI-=L}~cup%KD0vo#B+A=uPr zFoaPK6oOSikay8>h=z&iQuqzd%nB;!EGQtu zR07~3;&Ke+@}LEg9uaqHOqL&dEz}^;SfB?uoJj7hY0G17rLbKf`qbdAWew(3VQ-JN zR`){a-t%^OT7T1MFd@6>yE7T zaC}TTNF}b~CEa+rpN7#7R2}t7S3zb8l!gxs(JkHKOa)+a7;h)`8mXJB(xK^?F-=I7 zGi_|Lc0vgZb2d9yMw7jguM*zmEGQwQ60TrW7!Q$6H_g%-9hwsmU|E0UW2BBkV_+1fO3_5DL#e}40KqC_kDa0lZj_MIq^CuLp%WJ^ z%4e0>Mi~YZ!uG?6r~ZI&NLih3Olq2(63B%+7v%^KzcZFam2p$zV~8L{nKrUAz==~{ zvWW;F6hWC*OuryI1-Jl3jxQRK?i^2#qVQA!tmOO;<_}YWN}JKWaFA0#8z4=(KoI1Q zTAZ`BVz(JbfYAXk@9=xl8E;E90N^ZU$QLHgA zcCbF+z9iQKlOvW<@}>y+{m1+d>p}l_{)hMj3*Je&0o$iY7x&rAc<=$t_IsfZLp-z* z(nj9Ep*ABFh1t9%9E^qJ%i;<=<$6%_N~~&xzXg1ixYt75yudv~zj@01Hz+P{5IWzW zsMOR!VR?CZgIq4x5c&qSWW91oSo!iwDdaJLO9DybPgx5<8p3Br3Q62C2q`Z3F^9<; zw=y2YyNETdn~)Q!7mQj7;l$ck6$nKuAsmr$C6MrE=sa!S5)}h-#)2}+OTW|%n&917 zg?iL-5W9Ygog(ufh6pKBGd3Q1Q?S4P@%WJw`Y+ZHlrj2>+=Un(R7S=zG8@)A5SUTn zA9Kg6FPSBH7*KI^HVWFQf12;wm=NV|v> zFP||md8~wm}pNz#Ow3l(HT{B(!G!D1IblLO~61VPsPm=Xm2sMxCgIFWWwiYENbO<9w-9m zaKv0Lkx&+KnQWG-N{mw@IGsX`j0k2*!CDiegE5}AB&RFqV{K5kjReOOT?qbW>^Vv8XG{*TDwww`5T1m zidkay7FMmy{6WD=ifnopm2^>c) z=w@^KI zDt9ET5$#qN-5bPciiDSt2I#aYQlhp$Gv!Dkd5N-O6j3I~W@8id{kU6N3YqDtxKkBB=ywv{c}h%98^En(?~xvxigZ%+Y1kFgrRWk7LefRY z#V5qTo}kw!Q@s8hHC<$nc%UKaQd1aWxXPqwYWzS#fqgn{EHFz?rdwgjft4dh-!F-K zBOfpSBt6SnpPVM)d~d3PS3iAvLQD^wA?EiQ>EctPv0O*Kap`FyJzWoN3~hkx;`IW5 zx+5KSV316UY4S_b>-y`WC7m__br~Zk4|koM4E&;_bySz}38^|dsKDc;#l)u|U0q5d z*<ARf|B6^*7#WJN)r(&7eGo}s8erC_Xn;*(IF!e5_EDWC%(Ep1P2yy!SOx}haa zuczyFSa}eNIAHs?vs3?&o1Vg}tDf0aB!uj$ zA<5#aNdWn)tDfv)xXF0-(5C8iDb$hhk-wUxkX;OO#h(vB-i28D?x7*d!$_JEK8Dc_ zW@Y~INsKHi{)_-|(!ue^aFDws!`E{NEAiAMg~G9P++9%)2Re_}Z1(iC5iaK&Ft4Jy0R)mi#pLr4jyCJmG>uXj%R$c}NKkSN^y zkQA*;;KTwc=s@yyDKrRKa*QtEatNB8v^_vP7@bH@mSjCL5*CW9!dQe@?5#2JD0{pD zE0Ijv#-Z7nf7%R)%dqF2YR;x(T(pgfi}vZd8t(66cis~N0p(b_V=l~D0EIV)9N+Ci zOd0X2+=t!&3>U5!&d9FKOU6lnSw=nu+!}cvD@x%!H$fYMf#O2A?kKa@>6OgAF(`EqXxQ|Li7yc<0wB_p6zko5*ydDKi~UDyDNvudHU{lMhS6~ zK_Ol7VY1VWNYu<&mq*b{CQftqNESinX}K?*Z=k#3so(PWY&{@*B1SP1U~MX1m5qm5 zD6|M5mc}Uy)fnM#HUv=*?c(n1>}ngie|1U2n?$5~AhJZCWCI9Fjy4mt%NTy*y$4cJ z5I@<1<*|SkCth?Q)VY{da@&J~L%Y&@Ke$Ld$BZ_&Z~>#pgochfB3&r&-PZ{bPxpUS zE{ejCRfdi%-1HoJIC#bNjd1Ia7xjV<5BpnfY>Z6W1RCNmD-vDK2wgG$D8 zmkSl9!QKdEC_7-Mml9{Ec7h^se`}5f=?D_%G-k0i6Xa5vP*p6cn5^GC#UFjCJojd; z0|^nRkc+>`LLI-PG{x>R&iBwL!b6+#J3cHk{BgTeS7j8Ht*7Zw7wVe^2m~{!@jX*@ zJ^NCF<0qCIQ1Qv8TfA^g6z9g+)*ZhhjV`MpS&x#wdeBmS!X5;LO>D!N4cQheZ%@kJ zD?6SEOUj@cyoO9M6yZ~nGnIrjMRKtrmgu;SG+Sx9A=PGD3PZ@jXhRso$CyDoNc?!gsfo5?Z z{@2Sph~@{36ss}Y*(DqqL{k?{p@QjTvZoFstBXju88up$oEEQ7GBCC?)zCLyk6WwY zz%o+#gDo_~#P^Ml(HVLSFbu>B4k1+j{0dan`kE3@`Qve9a7f^}(;0`ul7F(lJ0c5c zNG^^g?nRJALp)Sg$%9`}Ps0KQhH3=_Mlf>uWweY6tEsg*yddjdVX`wJT*1}BB&8RJ zQnNF|gwj5g-NkcsQZ}~y>9s7V@zSUeck&UF6<~rcgfj0^I4%!lm$@^N;|?4p(ZNhA zM|rP+xE~VFRnhLeDzqFJ;YHr;ts#n!(}Nrv;X=vLWpd<4pKOQtA16WSlpu&7g_RvV zqf2lOYm@vrx(&tm=S^3FMx%TAxqB!EWJRRa34KC19aayCH zoM3a>@RA;6x#(z^)~dkqUGxtYkL=)V*xi;K4>sH9 z$`wWa?CC)Vzr$3qqpMI!vK(|jAoU0N7fTlPOYhNn=7sQXkX^z`X6 zIRl1t8WRTyd$c|wK^L8-8oxYTI!3mqkBG1B3&9e}b+|o2r{&@*)*pFK6g5GWt&9{p z3zFk10EaFwXsG}GtMHxJ8DWfBrNx3^DFIC!tcCOx1Da-8WggS8FTg2xc-k*y7q4X$ zvx;QTtIz|%*jHn}dG%tyfk=;F0)&bzc_Ae20aDl`7KbeOTUZZ_|4-6iFYHBnM~Vke`R$x4>~2vVD^D%Jg&8t(w5x-%(V=t9t}+6&C?rn7eIq~=RP1q&S`qyrrWyzQNJTgd z`NWHp@BeK|sRh_3C@~QzGuoXvP|mcQnD(%&SVQ@ver&<0Lez_m|Dw{a;gPCo7h`sw9_fM4_VmM$6ZjKpkN#Cv$o)*$Kn}i zX9|RcX`7S4fMbVn=>Ieqxwr^H&Q{XNTc4z0id`pJa6t7N9K`j;XzyE{4%XBz9C^h+ zVfsgG932pN;l^mGv*}qtl(36ox(sFwo_(GeQ>)(fz2LSmT_k)ymem zER-aTvgG4_b{wx_T6md+#xFS#OffnG zWEWUQ3+V&oO*}lEv@>MpnJ5EX2_u9qs2M@81adNB6in%+Y-qaWG2k#*cc7A@UGXnZ zGUBc)8~e>F8-EBvnsg2PJ}MaxrXQdnLi>^;f)Tf56(XHtiBkfjwGb!RFc0EX+(-b? z9UGl{7vW8C%R+b;;weN7exadEx)O?GcsZeT(9;x}U!3Wt=4>v@(gcbfW!lx{S>YGv zxImUiV0kH2`i0Nsif?-y}rSguN0<7gsO~^z(3$coV9(Cd4z? zoaQDa6DZPK;^V=iKjMJ0+!=+ti`^TJ$D8qJGV5Qc2dvOM`y7><2oi`+G>Ky(KtAam4HS?BHY~J!pFCLl);2BKJ z8Q~M4E1p>_1o*M3a;qundHAcc!njnfUzR#!e!^9etd}zZBbz9?N&!}<{Gub905Q+= z)09z~L1wpI^P_-n+}vjPvWp$ z&5-rNmuM%RA!m~ar#x}m)HrNT#wcroCO9RG)8}mLyVnIIkYmS(@t{H{O`FJ$Z92AV zAK9@j-ms_RxLC$`)QhVitAhd4H;ov%5>Q@pW*60i5-F^gIL@nt<9N}K!)&YcV1&of zCR$<25k-A4X(^Fe1b8BSP1dF{9TT7<&sQuSr9p1=$-R)>4U`Q&v7iu?k7UEhltR;# z&8KuC%r05hp>7w!*YMlN8J(ju=PEi5LWb2lIiS2)xnM7hOCJqF$mNuvJ_U=roz%Yx zPr(o<_nfLa5qV3TU2&fug~+6k1P-#)fZ16hvI~pG_a6{WCVaeKxL7Eb3*As zW2`b7AkiZ$@H_wDo8ms;gjNNYzAL%My)G3;8#GKS`u+Om;@n6l{=Ufk$VaP3$LRVj zhKKig2}}>2D6uirkq|T{kAk4zuq3qGjnja*{_Gz0L^%kC)uw(31G|GLNi0sLkuP7Uw2`?#~!T*d99}w z^ExE(MB{&UsQjJB0LM|YbkxRGEBv=(S+U@*+A14s;w^#5ibl3{~MNSlzjUS&rdhL5XqT*i3Q(a@#Pf6>Y5P*0#WJdA}=699a6qQ zSHZF?{|tyoDGf*QiDlY+sasl75Dimh^kXKe8n$$!h(A2~2m7K`IU$>X7XudfI{mD)_ijI)yNEG?DY0{+<+?7$))tx$ujgZ=09L5baLP%KL|E zc8Eee$7%sFALs1#)P(gNFRc>D^@<=hVqZsRKmL8Ro%09^IYdM<7zb4zUvdiD6LJ9t zh)7bo$SEjRKjkE;TzD+bC>QjB4V$&}=+a^iG+2J@LsVzB9kUqYA!6oME`~$7THI^x zJX`yAv$hvDUcl6`-(n?tu)VgsWwyzotR=#g+p@;9tmv$rcz#atO}&Wc_5L%ALirhi zV4)yMX>t7WB}|&Vto~DfLxbt5OG|2lbCz16??DarSEjH{x49$9)l1u@zTnpk!6Z?( ztW(p?v`yG(lKzhofC;U~PWvj@_Yvli14koY1P&zM_2nKAX!#0yLmr7D#@%rNz*OXN z3CkzL@1-^;+H7TK>aUI;0;4Fl$I#h$X$)Z@d@YAB!%s;*8l&iO`P@aI1nHwavd77=7PM#jvuosL+yEWd@?EC}X zdK@mJ6|*A~AVY1RN55!w+o0UM!wd4_0*rGnf~M#x*Fsgw_b{>W@A2T@3DKz23zX35 zkL{DHHxI@)toJ)xM+wFIKZEgT!KBG2d+%Fr^>|;N#)@eda5W}bm*C={hTj6TGV-wM ztsYDvdMxja>jTqn*P(NWbsuemXE_B5T$S5Z?0aXFBLo0?(}*M43V{e1e{w|Z6k{nC zgijSSeoSZxR0DY(!3*Y_d$vW@6P!;$P&ZGyEkYf69 z=o0!CZj5~~?2ZhA^I!xw7)4f|X>w@O(8nDD-yE=abDwb`rlK{a%ReW zx2hQHlyq$Yk=Wt-o|xD}pGwrvc~@Xu;&J#Iy6>PNJGfL|QTPVn7nsV8Y4VTxbMj$Dec|PF4*QVlX5$;TMZ50Z>BN1r9?q-1~YO0HqRiTU5 zDbv>a0IdEK>lbWZ;q$sjA7@oc`e{FJe!6b2H{(($>)c|*Sl4o&+i4&#!Se}yYhKP!lVS^V7#OOE0iV(-~r6CcY zU;Scl-&lJ4K%6Hy+)L?@EMS&5hD?D3V-w^wRwZqwB>z60V<_pLl+`dkfYVLyXM|g6 z((oVpi~l)Yjym6vY^WM+ocel9+WR9VQIMIfXd>ypA;Z8oU=sgv>hjml#=)VES&FOI z+c-R%k#s!}t1!R3i!W^Gl)SxM>!;BvrzWZqsKc0N8^B)omjqTN{*0{y>fImE8@q9q zEPvUIj_L2$%{%m;P4hkf)6Zx8Pe0C8U=T1Exj#0sn$e96*e{XF#IT4*E8R5TqVi%j zwMaWKadOYJABSt{;rx}#DFj>=e0cMi_VTOfAEg|HkzuuWbAH`Z(i*?CZh8?(bWvYX`LM2wXZ#i?Wad5R(tYbE>Sw{E-=lsQ zh#6<_RzXA%K+;ybeWkuy&&o4ud1q~Z!KUg4u2!3XH=J0sr>Br<*v4L+qc~MWR5U3Q zTZ#~U1)5)BJQ;o2PqFn5IJLQS*Hbls&D}?JV_jUx4=xVax_m0%tmpS0= zJ2_cya-iMs_p7a$Ud!zfaTb641(d&}c>-nRlm?Mb4RJg9OV%Av-e$MKADRqn_nUhH z0sC=$vS;+@=y01ho*U+xe&16@7PGrBu#XVqot_Avh$9#&HN?+e^{|F;;W0hw-mGDy zoC!{mCpY2baUCyQw-<;ugKaUI*cX=In85R-SafN7yU6E;^7EsxNdm%hC|EjUnjs7RkFhx0EvU;2j$8TuI*6aE#2A%a0i<;0q6@0w!|Dvzi+06!=4zI2O zSlspG8>R8UJ%iin0Jzt4yl|Fuqym1}Z3ueK7b-!PmN(ob&Gu;Z?QnE;Azh7rU>{kg z0q$~4D2+*YPxW8^c%hYwTg^)AJr@6ZE$a>5;Wl7_;qd~nKT?k&uTklsULHAaAm;rs zHZ3A_tR=!oU8qQ64#rDjlvb0$c!h+T5s4*ChYuJhK6x@s>I!|hsvMLfB4yZymq(cK1|=p zCo~`4o%D}-zV|uL`Jue<`h09#pgk(L&tCrvg~qoZf4=`^v}Ye^&tG_Z{N2{4J<7Dt zWUK8sn%VwTZ;F>!4`n*$TN%9Z@<#Ls44Nzc_(M07SH$`D&G9wn^ha&pu^29Lt#Fo| z*B_5t-$fT=;Y};{oYK`8#+6vB# zgRO6Oh}voHi}t+n2uDZY0ckP}Y~^lZUCPXIaDFy;2@?|O@9cfw029ddwSs@~5ek^g zE2pStPG>;8-#5os;5V0tslGB`c`K|(|CfjwZ%z~QxHyjY@hS+cmM~frmUYhKm?r%% zueC^{Sx@aB5Hth@(cs(d{zJvS(T|?7F3U%Iezvx|_S8Sy^P}C(&3G)&gZ1q-LVwuv z*3*n$8{k0t;F2u9KMhqU|9~2&i_8e`gh&?~;ZyXTwpdOcx87IJJ+gs~f z`%OI4wLj+=iK$>SBLoB;^&ctTjeh+3>DpfS8-Xemch6*x(%q+@y6iHBP;Y0;FXT6< z!y@pQ@MBL3zf~NDTPtSes>X5CFZ#`A8wCG(fG~mohdKil&BBG*Y@1wOp0%onpc9g& zn6ZfV2|Bs$W_ft%!GFD{r8jRrA%C^M!$50{nWZiTT5{*b_>|*%6BLQBgCsb`SJH;s z9VZ(4RGpZ}>Cbc*9E%&|q64qOE#t?Aft_ zzmAY4rI?-vCm3@3)|B^QQ0X&se^Z;y(I8*>0OG&GZ!3^QAQwzP5zn%RZLVisy1^yh zU%77*xwlZ?lHy{32j$=8B=4_$xoU2e)+*ZWFb9pV zF%EkZ_7_68$vEbCPX`L}*La9UVP%qhDc{wvdv|~P+xyMcDHg%3xd&gwAju0R_)zMe zz{kodKD+{HQp$=ezJU^7{e|qN_wQOUl~YhZ&)-oB$oS=cX-BR|sFoqik&Q+Zl=$Me zl%PJUCeEX$1gXFO=I&p~b#OX(Ta813^gCt#`s?0P51)@f00U^s-&Ex%XLtWMzbWG$ zjbT1x*%|`mlZOTL%3f%9B&B0>UHtlM{4x0qy6~Wcm=*CDC)8V@UyF1)eDOkYCR&X( zZCMb(;5jMx>Xd}YY49ATE~Xh#FiHB1rHFO~f1vwLGMXGTzxTllHeSPR=0RuzSx4G* zMg65uIQ&BR`2e{OYWH}&`pEM~J@NH~9WrE3>a;9-O1eTdVZcqL$n`*=a?<<=(4|}i z7mHNpfDAuk{I1dw-29danaF)iRA}U~+-rzyxRvB;#BJblMi<@4s=c&~7)E@p7O~He z6gKQXU)+4en`0tUoB)g0iuMEkC0_#9ilE(>s&{qD03X%RuS&i~42y@4yl+a{fzf`e z2pWiM#^rFM`$2#8mN`6k?$G4kvGgAnkceW@2BPJZ#>lXpuR2WqjZ9s*k1l*gf#UN&7&_SS znmAdCukAlym9zFC(-R!o(e&0NN62>apx)k$mlBCKTPFJL@l^;2_gQ1q710sz_l*?m zzHY`QudoZU*s0i4)B`Thug=d#pm_VKFFn1e?>jv^ecJj>q&+~kIXwCse)~ndgdfJ0 z;a%YGL`qM!vDBv9F#cnJ@XhW|zU3jT51+4zYT7yS@v0I(_4xFv8lRP@=c5;*GwRhK z^uzAK`u<@5=>QADr*MA$)49)ud(H`>z^4~X(6E@I;Of`04?#7rF9_5*aQ zzqkK>(pc6X8L34(<$38-dgDI+^wT$Q*<=+T9kvDA=Wao3mbMVNgV|dZm2mG7B##VD z{PMfFzJ$$7g8JP%#cIb+c?IDm>a)CgyYI#GAbUJ;Y4;0cYdP+2EyhbLUfL%n{2?oI z`8#2;X!yjQjoiL$4nVh9F2`5pnbJ;44CWW}fuv*?(2OAy^zX6;kMh zQi{af_&^(m>0ze7J2j^g^XrS$@0K%Mgw{(Slb;SRKEMB8YUli%1AU3pgbeH$+l4te zEsPdMD@;w)mvoU*DW~Oa0=1ju>M|B#6Mp*^+KP64f176K@z&Ox$B(x(X8nBJD+{*D zWoK4h*Jki)^zg#2yI;mW3Cw$)bz8tXS34$$_tQ4aL{rQkyqo4=$08M%2soX7|IR)l z?NL|#$7g3J)%cR#>6xQOF#VL%diy$R`mvbv-dFor&DKG|rqrH$f7#B)`u(bBBNTZ! zIWK)!X^V5jOc+tDBuvH-2Ytd+!d6D}z@gr{(Tk5+P3JuMV3tF^0p0hahx~ommsO`n zl&y^vSiu%BRO+#fiksm_lHAv1rgknK2|y7@_+bi98;u7Yp`?2bK-moPI&M8#(Ao0) znbr8qe%bpZlZ)GA^HfoI%m5KS)v~`v1c5^~;_CP_ZO3OObN|dE9SAKzrc2BeDZf?W z0{0np*Q9({rGP{?(&PQQI}yvE!v^~D$fM}F*}4tRE`nlR8hndmC*cP}=g6`27eu41 zUYKsub&mvfT4qBfx(ywVYWzj0!8oqZUg%I!(*UisV=+e@I3lHZ$Q5dUL8N-t^VnNj z61Ds8#jp6sJ;U!Izc2Z%p9h1{`HBX$)$jeqx8|?9QtJ1t!GZzG@z=7YEeo?S{-#q- z3xgHAt^9OJ>#o5TUC7d`Mi792krdb!(_1CLxwtGB05i}kVa#SyOZN#+prom{pPD|9 z)prYM;;44~o+J}=uP+zMP0~$UpY^o`L4!cWS75n9`?;-!0L~51RH%{fcT)~4NEIi}{et~xr89KvB6q@!Nn1fdR{%y!7C01*Rz=UI^4#WR> zX<>vC24)RWGF>7)A-CUU@1Bw8ON3%dI=$FwB_W90W0`B)Kx9V@Q|od{QVt`n->If- z*HcB4b?e=w7SH?@+TjJ&ODj9;&ttrFv3#_2*z6&3bMn1*Y|G@o`z!cAJcm| zz2G`AQ+%07Yhg`St`O*@d*lPD9$S#uFz4ej8C!1%Rf%AR*t$dUf)Jh>k09c5NE%Qq zF@~qL939QgYe$@Tx!VAC+j0f=6BoA7cv1|+>boG88xRtFMdA>@e4!UZ zn}UFaB0zvjLZ!Fhc4icQRZYjM1=^D@ZC%FU^7fIsmq&S_i_iZI$$ zIob6wQAgucKeyu#1A@62M0(4(=TqgRW^Lcpwk~AgYHCkn2^45;sYYC;D0y*wg+TBO z>AC1N%6wwuWEbXwsNlrNz5hQtWBhKe(L%N8W1(iF`@|ciy4q%&<$>S{IOscga(^B7 z9$w?>iM)IF`Lp3Dk+R6_7ssL)A{6Ly1mtx1uIL)Ok`(6<(31XA%bV8}F(-J_?Z8IX zdCh93fsxUjz*?NGp!EeMl98=6v%jm$+rDen{JRF(Zr0?TbURFG;Ogn$sbAmQb}xs$ zm{=^a%K>wN=C`lT)PM2`#NB`L_jo*RveU_X&~IJz z2t-EM>OV(d01?c>mk}(QIc#MG55x#b?Z7@IBl^XiY^G^X44Mr03`M?YL7uV4b?-Ip z@0Nvg7cm%DfT4e;WPI}%<%w~cf#NImYkO@p z>N%lR^{mGkaPdA!RXceq)K0%Ye}DBoe{w%M@UdD=%5M0Y!o7VY)x2>5o=Xf`Bg>Ze z&q>HhP~X`R?A(k5JNl{GosBBISjctWPv7}{T9w0$Z5ADvcXy#bNqXF_MwgG#5RzRm zQnI2ylR&BF@h_v65o_b)2TjP{2O0;LEK^6q#V478O)B~b%({h8@+HE+u`r{lNzXWJ z?2(X##y%qE>dnXc3-}q$ho75K+kbJ*oHGXF*E@&W+t16|pRo6kz{6e5?G*ynJbb+U zM)MVjTaXFFCmE8dag5oamW;$xZWS(*67p4ixWl;jh_$nRxV)Hw1>$l|Mcij1MXca@ z)5m*Yi+{hUp8L%~vu|(wdy&tW^h9d{|HL>jTX z(|K|x6%l%JLP4wORIBI+)9H+mF`I%88UXQb zZ)p}g`8)0`{8%}eSBkO^+KGEz(-D(WIIg7kR-gm0-XVRA6&DZ`wrRzNLcDC!vT`P^ z0K^_{QG-v-{wsP=pL)r=7x(VV;QZB#H>{7(@2v}E$aYN+dEfbd`{eD}Uyj9w9&OF#PS^_%fw5@6+d@Zwbd740)zroXa!-p=6# zp&+a0H{*AA@7xhn;otu@8o%p~zkPq_-kmS&a(C`&?)CS(_hS&9_9%CMa5uk9l)pFU zJ?c*z=4AVK2k~X9o!Rd%V7#jNw!7o?a|gjQPP$Xw{tS6&{lgIY%E{+>59MkuAlyoe_wSP-=B#u_xGAG5uGyey$~)= z_6H9Rk}84{8bY=TN#_?l0)bjb3K_u@g=Ar75yNw`Q+EVqEvwZZ`ElFXQOp|uPlVma5+e#?|m z+IyqzgkQVG>{`67ALA3vgy8%PlRjtrLNL!dhSqrnJzwD8b;sxLsmGKYZ=-Irkgq|9 zWrWJ+$MI^#%5RDzwM!?Fxi2&KK$SZ{<|nq9{HKg(W-G{5JMC|{j9^Z^_ABSfWt{2r z3IQF8!f=idRTx4zlsXp0$~ZJGaa1}*Oi&`E;Zd ztKS}9wUu^FPQ=G2tLxHVKepq+vjEN8^_ow>E0E!5xK8dsfgC*>IV_Feym`X^SKaSf z(l#%DeI2j~Oq~P1WKQ)p}gV%WUxp|{{1pUqhc{6&m+UGE4 z6IzdF$Ob1T@Z=321fsDNPsAkd9k+|-4eq5S+mo%;eUHU+RS%DKT78cH>SXiq)l6Dn z9-Utr>?6(X+r|rvG2ila5Aeuuyw}BG(Ch=VdF#(`4cywY>H*KF_)Hp<%;$?^__pKT z4A7B?#(d-4e7IFT=XDSgtr=C-7r70&Z+}1@>D^aw*R$7wup1J~oDDBVD=p}H1*M7G zUVHY8*x{fati-Pw=UW&5sl@lq@A#j`6w&kEF(5CQ$Fp>~*IUuoZQO~(8?6UY3JSaB zh}eQV0H);fj+q(7Zlb(+1;q-6!M6YkjF?TbjjQ{w!j3d_K~xePIWQB+aY6ML6Y~uA zvCu{n9dha;d_;c5&be*J=6m#3aqh>>+dXc4XS417YhZp$atC{&9?yM~EBFgNZ;C94 z?s-$eys`p2JMLN5%D-4t`q%+5cYw_@V_jlWcUug! z38MwdD}-UOjM3fi6OW*3^~$|W^%bQ!AJn~pAL?R3o@d}ZO??vI`Ez?*{W-B@mQU=F z&n@m1L>%FV!XR<6Qw_WT`@XtCp0>)_)G z=jnM8=T)dqpE+MG&U$Px=csNblB4`2lADLx;(ZsXslIOSz_rYAZT*=>Ve_c48}pdB z&(?`>y1zNt*?c}AndDv{w^944-Ye}pY3c{x?)ELEk$vAdkmIPT?yWuDj9iy|Y2UAJ z_xJePKiFNTO%ks6cL$Nd95>XhJx_$^?;q~=pKR_7o^3sg?xXxxfADN`XM6pvOGSoyA~XF zu=cROtCqZ+1~wpl>!0dpr6(tOpLG}S_vmS#?C|}A{pjb>);9jS+iTwr9&PRJ?b{Rw zTS^c``f|#&-&+i>s`mcdO>&xVtuy#cYu9gl+ zTl)k1&m)$T`$O+pfgRr-Uv!&!2FGR3H~*+oz`s@`-f!)+9?SM#RwfT%SO1r^__wA-t)m@ zGQBpo-u;LF4d4v!Fm8KZd&r3UJIr6N?8n|$paeXA$1&~ilFelBYpxcc$KNY{^%>Ew}!74G3?a z1*!G(?&j0J$99$-S2WjHNV=BkvDjkAmtx>AQ8T1=Lvk{=fUu~@N--ck17d4Posfj4 zautCb_xwcpR>K!ewr8WP?t3iZiJ_j&cG^rqtj3&wCvOSoD}4`67vsar(M9o?nJhP@ z*f4!%8*)6?0E0Dt$Sq?;uU||KL4b&Or5)mYHM`16^5GY7o z^q*E9m)CuH#l9GwjIM6{uz0*j;WuGqi_2d`kAZa-&4KMop zgv$2)gAUmm{tlUcocB@<3!yHseKy)V!FE58TKh1m`o}9pFrzn)= zT)~BKhTS@|MAB~CLj1E;_lxmIJ^QhW=O4%8T0KG@0+RHenMtmdKq@vyf_No^4c#{f z+x{gufkABCUwqE|9AP zwFF%U5oa-&+@{7GiZRUe4AH2YR-VT0oys)1N-W?*8rKvgnXFg71XLq>sdSbjCA4-s zQ;~VK(6Vm-Jwj3lbM3p%86-0k(+lcH!==@;9}ibgiD&tvrY7fX_3tmC zSZT+CS{k$im{a34v?A{fS?dem7bHd)zAB_D=4obl#re^lJ3I<=Ctqnh!)1Roz6;Xc z+ldmibK58S(>MLNfxDV=CsWXOr_6tR^q>Fx|LKu8oS~gzNWauy+8KXR+?@1$^Km@$ zclpxwQ;yMnUz+w8cqJCU>tha#*M*}@q&tdI%=t1HydnPnZl_l44plCSlsS=izqvSXr}@i+gj`Fq4a zE)PPB*^efBe0F~Q>UFiyVl1LN$4m0RfPO7SI9DE|ZHjeihvn@jUF=WvyHKXWtPJ93 zwnZtnH0Z~;t?PVUe2;oFmtsj}eTO_|pzRNX7`O-7Bqi=UI>`)BeqrH7)zK_K5*Tp# zIDKoub8y)82;E~y9&33pD11Q>B=gU~xSRp4S!_c)*HoV9BR`d0Llh;dIqyFubbw!V zj*;Guj$q7%uCU_ZJ03#HagdMG?Wl2nYJM>~XcGY}E)bz{>CU@_cNnsZ&=*Bu>WW5i zCH6hfB?*e$0D(I*R8hX>-e{VQHv5-^<&om}dx3RApXLch8Xfh%hlnNgDLNK9tc@sq zxZF3Wv{m0O-LD|_-EPhvUD=|q(tFGO_;cst+xDaJaz`(I&m3vHn+rih_YQp$vHOX> znY5YNS9dBisqa(KAmuJqOUbr4gt2UD0KUkv`rP|gz+diKwKL~l_HxFFsg%p(b0W#0EZdE4`hn1Z;1SQH2&~0sDm>32@P>tLglC? zKDVlE8>QrY>u#Poz%9sD3`Alk$0iAm#He*Sv~ABI0-?A%#f31@Qz8mElPyKtF6E^j zoha;Br<4l#nCNFi0YB00a}{VWb7YCLrfW~sM~Q2ez8_kdH7RWl&}hz@XLniNU;ehi zPWJaNtrO$?x7LaJ|JFKfkpK$&x7KkgLfwSD^UoK?Kkv*l%Im!!w1`F8G%EMt(7`bg zM&y|R;d$`b+4norz~ z?O2hYR`1^uN9Ra@=6_Ehy~McvJpOG#yt;m}afOC70X89%6(7OBrrZf!0D`b}3(6)V zM7mtcJV#)KK=k}yr8yqm3Ly{Amxf*F<<80-2s)^m1Pe8gg;2U2hrv?5g3aSVVsmV) ze~z#2e|E=6CrGscZ|MxY(U8D#P^;Nal0DfQBMaKl=Q-oMF@R+qgT7;{WX*LVB3{BU zx6!WF+sk!vP@(Ktfn*QMiB82$jEwr#%6o82qb!N<>L|{J(01I`s|tG)()!jzw5@N; z&%u~k#hJ<3N}d+J7;oF}805t>yjN#%?$(dM7){gt8l-zq0;YISN5L|X$L6^bsPkS zbVmnhg@D@LJ@~oX#*tbSMC_O?0>z1KfK=C@WuCf zljE%zcN?2L3PYcb9Uzm9!Q}Pot+fBWr9DJe)}%p8G}CE58&_)&+J?SC9jR*;83>2R z7QFY-=muIa^Z8#WE`F{wl`@RMi_Er}5Xa{=4l0byX=f&muyBjhmr&=iCez}E6 z!96rbvBK|=8OS4YpSVInH%!=|&5!t$`)uRyrBCP-Z+2R_*NmWQ_`*8^6&RuvYMOtL zwfdjThxW8$i6C1(rFVUSeS$*lM0DlM()Mwv3_v6uj}#i?=R+HisJxBk@fA7c*t?XR zMLUomGTSZ!79WvyBYCeR>5?T@UD8Gnjyp>(yEUiw3TRbWN6~OuVrh=ozA_~G2|}u3 zjInYL9=f%|v|cqJjo8~#Ae-v7=`Zy^2{X=yE+C)KI|n)HJ9%XEhcQP$>x|D$n-xKX zB5Ii;9~VI@q>VF%j7Ln^E!Fg9=25VPfxa0MbZ$=T$Q!aW_mG0qB_aJ`tvAhIuwCAi z%%Zoj_gDTYB$6V+W(2-j-!-tw_r8m~r!koMsm7+>M}^LN-Yx7QhB!#_@q~yk{^ReF zWAI(N#vTG>eRH`+dw6VrI8IS*`g<-=$abdc=l8%kYUkkK>@4#pE-v6GEL3zD7rzOH z;L1z((Z%oIE!?^HZc(z5S^&t((#VI@zh1cW`M*>DVByY}|8jkk@zmp9HszMaKED3g zoXQUHEt|U@Cg40a=~NHND=RT`A*R-$s&~r}$g2}$h#@%sOfA%h@562NZd?D`>fN^P zbL-tQ*;sA^<#h|)C**@<946URmc6GIZ`04OBfEtAf)|J?lp$a(C8h}|@uzby>KfOY zRe%&sT!J9LQ{xoYLtmFY$}idVaysXxx5Hf95J(zH9E+!+8x@6Yz|>%}QN9yjV##8? z?tRkq{^LJO98i=!M_>QEClQAIJSA+c1mftX;5J?#6A)VPBsqcTsYNnBo?R`j^fr*a zTawsglpXdGG_o-MTbgoD^M6E@WEjl2_z) zOiM1 zF5mj~*apV)`?DuYEcV5+rBfwEn^fB>IF-wiMht9l66I5fux?(`fi=IKSWS z9ZIdRzo~Yy;`$}8xI@BiX>0ulD`vAVnPB6!oHEkjoVrWe@||~x7A}632I>=!4c`~W z7lb2^mM0#YT94=5YS-loWVn7ya|)oDqOY;&mG7$Y zb_w+sJ2uxT;Xb^ZcZNG^u3Plz{MrdlDs`Z_hQrpmchSpx#yOi4BF4}oHd~vUo1&hs zu1=1Z<@-Ez3fAAFTdiNxA17}JHD%4jnK7c&h7>O}7dupWrhdY>=GJTd*%o8$3d%BL z_&(3c@w-&j_QMUU#6rQ8`4F|nrCH5KLBbS>jQsG#$Hpi`<(!4m>^PT~NVE)FEAZQt z*_h)6nvEOj%{9Y?c%hHcc2*&)m+hfL^$%2_HJj45aj_`$yP`pi1hBJ}?2i_blO z9tg%ygxQ2(Gpw&UH_b^ux>TUY6D>`eKScX~yFQI;T?@6S+jY^CbcGiw9Ir6LTkd{1 zbJ~50OQp5U0K>9Pyrs+3$rLmIpKdxcP2Xz z(Jk^Xc@;bLz&6Y;%@F4=>?V6fEHzuUg}oB9^N)Z0qqnV@1K;vv2d3Y~^qa}=7Ei4z zFo#YO)N}}?!}CE=vJ~KS#fo$BAsL_39!~L{<{Hs9rnBXkdz3+O?2WxQ89^#?&4IXE zMsstsC6I$R!a21Fo_Is2kE~0uavjv4%O14;CImN8zVs1C#;yk;pfkaK4}GP5&@>VT z%4Vg+4PAeAoFb_VNJ)b7%d|wr(YA=ja?wirace~n9Vys*%4$vsM||DJ5;aVY-4~?{ z-papuds_`#o2tTKV1ViiHLHt>3hW-uj~j(iWfK~y%ZOD>l9p~f1j_a9_m(8?i&P1r zE7S?|CDHUm@Af|LE#;7>%Z9>V<-X`GMYnCS_-yUW`kwNZEC+v6q*T$E4sI(V3n-WG zbdIlXx4@(HuN+*@q%m$Di#*Gg;8_k0lot zsN3|C{sLTOIjTIPm%2|eSOAxS0qJC@WbNdCB+0>0_6C^+`P+OWZ)?i6C59(rfo@vN zWkW4(LfX#yKH1OgQiiXEA1{w39Lqw(w*-Lb4*aLgw~U>U{*-zXW43vgwy+^I8hr2S z{9+5HDD`T&wsXEuv^l4g=y&UGYJaL;*R*w2*AwHLy_4-e&HhdVZ~1<4F)D69r)yH_ zWTb+UZFT`QIYPi96JV!!HQ3WJ`PNyb&?NfoDtTyYTxEv=qCwD@e5OlX{hB1IVn^=U zxqlwC8{`KG(Pn+_z-s~~ONLZ9eWCOANZ8P3mea`s5dEZp9YQ-)-!$2&z3Vx&f#HB= zvLKxG7OnS1R!KZp8+JhY{1`#<&F#4R1R8x{fCKBC2Q@qD%r4GzTWo-U`b;QmqWZw~ zBS&27C)WiJ)b$JyI4`T;50s$$`@6sSe*C?6I{sdZ;D4taMQ@m(3^offt%Wo@tk%6W zicFDuE*U^W&jJQ>< z=mf}D?(YKY2E({^&9F_@(tKF?f6Fd|0cq|3J(~|j(X=C^SVWvS_Yw9^B6_@MT) zFf-6Vq(9SOPKRfBVvKN5GC(toBP28|T&Dq)x@n|d0o|jU^m$+>JTVPgrrezM@%fjD z`ZzQO;IL|^eQ&uB^(8oLHBifOxOwb+#0qI%F2z7ondC0M^Y_eN`N7w{`@ga6qa0g> zY#E6Pcp5WUyG2yjj5}X|4`EAXs*Pm`0z}%Ce6^MEQQmEA#2L31J+H4BPZTC~mieaY zMB4Hu(+06jF?wc3;F%K{dXnok|Z6_s+IUnYMEev)$aFW5?rNw(z@_xGWs2z%I zF|`uIO5*12yL>XTxcglnM}=FffTc;kBa^!q8izxB3K(a|Iooy+CYGiwU?j%__fn0( z_w_WS`vCz-c9ie7ZL_!CB;a?VoeAjVx{elY^SN|!)Fq;=n)B%!znL(Q-I~UtTH7Cq zm#g!EwK9;B!w72?WFnH?xzr124?$Nj4%uX>CG?wXp&_`jfbt3|(Wd;s{5^ z_?P~tQBhoH%0%I3#e;tZo!GWhL+25B;=nzGllB1!1&TlefBoijTLBq|E9d)njKG|P zJp6(5`e4)ZnfirHBrTbcc09>#=B-S(VOS@FgG_4$<^r9_4zf@C<}*d{2qqZ4Azf^ zwx%i-^i8x>;zI17ua}nCC#LSOkbgus{QYD8jrh04KVr)Lo=7IY{~!MSfq#gQf4{>&l8*nL z1NwWEYQKNRT|yi6`lA+t3pBtr zh17;%+{NGP2-N)qA~?kHpg4D4y|t85%XaU0n+C~sy*NWbrwth#F-5UK72XBCp9;;! z_H_EwdA86kraSc#ZM!QPht@j`YRrvy{8}zRd9(u|Xh8o`z1}yy)St|#kGdB3>MPRc z(B~(V-P_yxGclCb6mqF8PwLNZ!B5Mi1#$tzxdwH;*rF-ilctASk-EGVgsTg!6PE^B zNfWw@aH)@jjxr0-kA_SH_h!Gi8g!=S#V+&XF#SW~yeAFdaA=p??~OfHG(wok*k zCwDhw=CZRPwvhkw_uY+&d3*?NsN0`gzMi;^x;yW=^&WA~@thR#7r3UgUUTcsDPNx( zwxdvyhBbRwtV+lnn=N-Ap~6(<)$@!ZXj_E;i(gN}z5s_l!MgkmA3aA}6n!v(;gh$< z-c;8}K5`#d-uxbQSocG@kTQ{G%+ZU3EfLbjl~sY1-lzFn2<(#1vx<@nfD`Vha?b}6 z+twJ)Xd4ATVfL_Wz-$n&6)FCe$4A)A-1ZeX5Dx0LCz^r*Bs-bTnl#2wy{z)NcpBiV4 zKcNG9;Dpz*Yz9X}*D)^cxYupKr*^VMIMlvc6<_i?R;oJ|2heeE@u75zB&FbtFPfX= z9QlJ=IMfmd>_ROzNZ38gCiN#7n99CX80x``>(R*-W*0>phL#d-OZz?@R_xy3O!+7h z@Pl7l@2x%C>Sb^n$Xo7AvK27V%!lBHx~qiS0dS(0D2BS;0tz2vM&MaoprjJn>cSBw z9`QM)%(%rmqboIo`Sz`EukGz=LG6ifc>7!H%rp5)cVapvFCX$?&aa(^HeqG9FVi1L zMKeMgc&twWyn72nDM*@O*#C4OgK)?70+k#-_4&kwU0YoiipSQ)PSyo86r*L?IY)mF zscO}ZakqsM2>X<_&(fbnZi>z0?z(2BzO~VlySn{YMcFxlH`+QcaTX4mMj|Q}(NuG$ zrwg&>t@T4XE2H9|`HDC+>a~3Zz8Gfr4o3<#BJnpyzq*v8xM?-5g|>cjU`mE+Iz%R8 z>)=fs!31kFV}*vjr?z?f3MZRlRa$K8{%Z>{r~Z2vqMb+C>m(*SdzKp}g^`)cc*TS( zvw7kZx>mD0BVTpTm8*Zbi+QZ26t{J2-`|^fFDm%*{02F(jM`#cI%lZii;Xvi^#{h; zxf~MgBK;R~wX%zP76E)ItS&ufF(&2CNm9%b*P2m-6;e3{KgL)bS=CJh*6MXOp9c3z+coEpEx7xF2 zn~zMU%_1Tq8GoeC#i{dfa`X{FK)~B$eY((ES=%vC<&*4ULT@i3xMT8VCrK2GMyz8e zrlIJ%GHrA_5wT;U9JyL&$SP;FOW~@h5OFr4?tPqK zVER}Gh@@AGp0@=IXK1k>a3C^xIvTNiRV*5)0(pJ2JmCTe;Ro04gz^lIIM!T_D|X!B z8GcYEZjDS?xJ$eot>cdSWNIS%({RDGAG*zR=llwXRS!FHd^Er0MEi9mYiHf;VcIjE zK%&J}fvNBMU`ub+r@y~F9=-uAv&dBa^hoVxL004)Ld|*o%`P_GFFavsWY)N`+Qq^( zdYLgV5$z#gRiUYIV`6y;L`=Omg~KiFY9nv!x4V(0@HijF;m|? zVoVw6)OWKND4(b2Y2O9?KE&DeO%xU-=D>%wW72^#SCyP*tTJaaRi9%F0LpUHCOh>VWyes-2|_NC9Zi>O1(R83 zCVUv5nX{PzKgZ|*qzR6-o9f3slNivP@e+mpnVVA^L`~H^SV#Kumwlbpr8dDwaD;@Fw%*=nwBAXEK7AuMb6D_iw4IU1ZQpALReXzF{+Yoge6 zJDBT?E^r!{H$NCy`N>WWYpTCO$azCk-wz|c!@TiIHRy4vJiuT%@dh5#*S~%ul`fq+RV)qsH>epiH-B_XfA;z!zXbP;;3;q^4 zp-+0x)$K8^st+5QCfjO4IWs;L`;Zj;#n*%fv6fBVpaFzO50rn8*lw;2t_TN@jjI}iV~kD)tkl`qlp(TX)B z7L}##b;?-`Fg(#dS&dNuB&NmuP|dF}kvj&JE(*7KCuS&ZEvwD+<04wk{7oKJ$b&*a;} zZySo*-xyvEZLa`d`??RT8;PlhyQQs1iHYx0=Ar5=L6;pLmQeA`|~XuU=4U-ZZx#1?#J zZ>+$_0j8{V+kydu%iQYkT0rAutM6>k^_f|t`Leg2c>h@+GhR-Lgcz_juR%PxS*yh4 zcYOEJb+mH2$?rCDh8mjfWRd?Pbzn@ zD&wrd)%ie{ZK_8B@NbG=B$9C_boript;${;1aPXk-DR2GxRF!+3M_<@fx?zgsZH#B zC*Af<|01W3XmFz3-Ei%gEY=h|oTT`r$1&%Sr9_0idyLY3>*4&JA8$vQuDz8M2|v9y zP+W}1;}3h3y!);+6KX|t;5IDIo`tlaqnxoXO~)S2Us=oEu3Qj2$U^;`?^KYOtXO+z z_IctDDpeR5fqmh0rBEals}fwzj@i6J+yKdFy?)1XrueDp78yFNG)U?}V^Cd8HSCAI z|Hs0?KW+c@N4&-#FC1qi)3s2wKph|VAU)p`y4RYRZ4XHszO-o$Nqmg!)6*LT$#Vf& zM@};Nk(M`u4BdyjnGqYXvDG5bh1R@Y_t23?l-k(xl&jP3($0cCW&u;dWnYCZUn~k%Rt#VFB16$dSA*`^~68Erx_SXivrXO^7EmphO#d>4Y zhOzcuqiMXqS;6%KGQMk2`E$L*xp6q)->PNTHTk zK{G)-y?h??;N!M6g!V&3kxBvDg7PJYN30@zOXd?bqc|U!0$LMa&LPZQi7xIxC%q>0L?R#<=o1kdUakk^;&r$_cfrkwia>(kGpVP}3&hb9y zC5l?$J{_5fa_Z3)lQL>x5hd6^84`H_3+TGu%=j}Q8&(zs^a#>xO5-ETqq3zA*WvI* zgBfqEEnn_FOysV_;Ta*NIdTpp7&l*pB8KP2P*~KKIDoCXw7-;F;9JTmud@4q>?TjRZMtg~8@bXFap7Dwre84agxm zY{#DaiD`|}6xlX4(Im{+LvlDF*5v^-QU(-PQ95{-F zK*BBb#6olOOG7q2pO&pNsg{N^b`U^^{6&TWLcwq(7e2QMJQ1Vih5vX@sOM{u=x%mR-_N+ei_J{CC$Syi z4VzX4%Yp&cjVl0NtsuY>WiTqX^(xxOES$Qip=>D7gsn&U{TH#~{^$=n3H9 zVs!Y1izUvPue)Edfmt*X*6#frhQ*Trc7e8Woq%WReNL(j%ZQ7lD5`r1!Ft`^?0Pzz z!AjhVRdG+(2#P6+gd%oeMA^1#dL&QNV{7r<>`^6DVGrtTgpoY|QU~Hkre-ZTspdVH zJ?RGXR>|EFmgD$04bVa z?iE=yVEU+z?Y>AWYgQIZGMG`ua;fRKETtB^7#LHegBbe(LiS^)|9+xo;`-9}MA((2 z-B7)cT=AuKkvR9@xE+&u)^;-6i0@lf?vL14{4tkm=tBzB~d!_E45#vaYgc5!!a@yj#uaZVxc!%SQP^l6H%>_%erTHDVz}fdf-%g<{Ss#f3Kd z{($nJ0U7J~SU;fr8PrC%`~$O7SnbvP(64)~b<#I!uQaoqxO*>PpUo=+Up`Mn9uYcx zp*r8&P~6xLqos~|HN{Zg^YSlu{)&M9gzz@9H;(dBD*tC+8s(ectxHN=#+XRbs0Cj|T^J{yMLV7t^uD z>0xXp)047OwA?UFUmdA7%`ZP*IQojNc8*_xAk6^p16cs>u$;PX>qoEGJ<3JVKo`$ z>+`n*^ABxrs7h*RL$m)xzZT{WS=y+b7F1fnSti^(!(X6u|) z?k9PUjtRk`)HBdP7ZMfQPjn4DOL2dUmislxRP>P>pkz7xF%CUIyx=~)ve~B+e>Aa# z9YxmCCG2lglq><6<%7ywgq3BW=HMX5 z$CI1J!ggvt_I}bM1bI;AJMyaXN@ESV?a?<+WIXF+$h#gBY9P*@#%Bj_aJM0&-{8wH zzxXYG+7Hk5W5Z>loJoryL|MGZo;8vQlrLhk5Ce$*G$T2eL#XuOc*U!UPm|Kqjb_BF z;g@@fEw0`6McBm%+HdpGxGNFC$?N0NAW$gsr9Kic6Me`06|Z#1qU_f)V&(zg|E$u2Xip1 z2pBcS%4u65!wItvakxnQpUZQw_p#@`BG`q68|8cu4eJuLfpq}aksHV-4K7C31S2Nh z%+*A1XLBUlv7%E4WN3(PN?C!1jk^OHUbQn(<~JWStkVK@*>UN$e5pEJv|bngjc#Y` z=Lf;drmah7atV+fcqya)u=%i&|JrO|5nd-v3b!MGID3UBg3yLZ-_FM?&nUA!dNYgd zE*q{aIau;bOdFS0;xa?dzwYV6H#pPpAW<>c2Bt!`6hgxgkhOTWqiSgm&b~5qAyn9b zPnXpNb-qL=vTL{kzliM({0K(;Pg9jgZ(V<<^6pj1*Q1vb+Ib{->o5Pa_Hcb;^U=4DxBmOd z_S2pIvp?+a?H_#i{EvV7^YFzX?C7i4qrbg5IXyeS_@B%1)%6c=-`)KE&fRfAv|mQx1LbEiT2Cf4`GUW^iNR;5G6+Hy2{cYxDD|KKr>Zo5Otxro$M4tzbJq zAAw>Z!^-=-IFG)(bLZC>%^b(|X&s{DH2oQ|V6cAav?o4`HnVzr@2Vm>RiP|TT7>7r zFYgcbA1&YgO*^3Y+2 zAp3r&?YtdfI`d48FND3(bXkY*58lO3S2ub&d^=gx`ft}~barul)kGmhy)hr~7-rKy z`^qq20VyOFb{|ch_s;@n)u)~~(U+V`;GhF6RRYnO-|yc0G8bz7*#J=auf~6WnZv>l z1G}ILi}bDgRRrYpQXRiT#U@JG1#nP|vQ{w2$L85EU3;E%9(WruO0uK!J@HU{xIS}V z7a|eajWU4@1I=-7uI;UF0W~ciW7uNmdJp8*EDeS6OZv{2ZaJG?$^@&Uws7(;*Qe8N zTR!lxb`v7|*Cul{; z7()W;F!5fC*PL3dlg8gtzt%am+Z`dG76DIUri)7YW)W&40*l5l5vHCTb7fnUl`~8$ zg?8$0TRR3W&|()t?HS?Hc#E9fx^m*XV^!t#v3q+vbB&OF#+WpOR#GIk*tOXdL7&F8U8!8NOH*G!C(<|a6L>#v z=VZPcAzp7wkx8c83yr@CHrXt00#}#hKrn$)Is+Lpxm^kp?$WxZ*fvQ3qMV(ZQ>l#@ zq|6}=&j)TnjBfZjD?m+znkM+^_f_zAO{o@0)Yr~UQFP@PWj1!_ZN-r_j!tBmY;UOE z1-`0uNpM!CLuqXmGIrAuIqB1_-}Vb}^ufJ~4~)|PQm<|Ph{eBJq8HID5NN(STK`A& z3+`5%KH)UZ$Ch%P{We8R0lbP1U;KwRY4N9}=u>+g(l4A<$@7P_&;_6LkbeB>$Ze8@ zLftQ}!cM=0h|yrCi(a2uL;((3b{`XfIk5hdOIZ9TVXBXr@9`{hwAo`o@LDP*0svoM zdBq6?yGxYinCq?O4#MGn)}YBc&%Nmm`7^(hiN~`|R`$9Efo7j;YwtV8_+}fHk~^f9 zw^@`qEk~ZO7WFa1N|x-~zl|u*N+VyZ^UAks5+RR3)&(oekfFQ$qfVo;rd7xGtdu{_?%@(|DXtE4Cy{)6qRNE!QpN&FPY@Pt6+kp+(6WWc57Z(y=`_stpyfWMhxt*TR zzikK3pIkcrmOLPOnpMBXI~0!1dwqN&cUw2qQ5&*)N=b-xt*`8Ud8<@%_VXb9n9Y>r zD+HNCqsJ%Ta}$|Oi4{Y^aqD*s%@00teVCd*xmm{ZTJh%&fws{6VHpz=aOYC$@wi){ zb)_p18D4ffM^6!xsPq&xk6cH!Wnm;|Bduz0c!>7Op~+)Bh%MIPHk}5S6k?~JX=C%f z+%TY21UHh3oWu#WG8(eV4NsvxF%rDtZQCyd=GJ6z9yPH$tbXBzrG|j}a9P10Kr|>M}*(E2&_2L*Sy?SKR16l3;gYowMsaZ{p=M@PC z@P{ey+y0MU4mDC%oxf&$x4n%L_O~@ZJ&)n#pSY8f;=L2gVIQnZgcQ&4`?LOJur46mE+S)mI`cN-??s~(! z&F9-&JDbhc4nB{JabweeZ$Dd8)n+$-Z}0tqNRB+m@Adw6e~0Jw{?n&x{NCGqinIlN z)%L-jem~vXu|G6*J?|0LNj{I?J@n_br_XF`+nak<{@dNnwSC@f{^4K^_ta*i&tUkW z)Vc-`N*mOm-x&cF&Q0}QhMs(N@E{& zaT&j<)SD}jdeaiskt2gBR(3iUMjpqCi>&m8kPC|b_~r)%hFzEDqmXU#!9w;oNM>eMrVo z+sh0mq%MW_)O;U2yLtR%^G~Z`rc2zc!$C#H+OxU%sW3mxoy2yKMA#?k`Olcute>Bq zp}N_nTgW`8-1@)#^Xj@eQ#`SFfXG`EYy>$9WX=y}(xK`N<$fHE+M=7mDD{7Ny}Dtx zL|&g~l`F5>a(|AO-&w@}{x3(Xn|R-PEw%5@{uS6--F$a}gnaYthtcJ^MJ3*I5t0pu z@~e+duE($2`q$U1+b9d-MU1z9aeQWPy3aW(^}G6qYXZ-anC)BzwI22&2GV`5>s_zz zVIAJ~|K~T?AFu8mU*-J%+<((A&!r;$ZQx`8DDNJ>JYhGmDe-<;j_KEBeBILEdC}k8 z#m0}x`4f{M0f?vwa%UJ@ru4zSTG)9aUkZx3)N+uD*HLgS^b$p;GW2GnuB0pSl_@rR zeKTG#6MQrGGP2~5G8!0CaG3>(Q+WZ=Yu+3Vd*Rk9d0o5+#zW*q+>3U0h7$%_!{(^@ zp&2$8&8WHG+-p{NKH-1)18`Tc_Z+$m!m14bOQ|CRq?vI)gIWF|GFLV5qcD)@D zNbl9k?&i0Hy+3;o>m{#h@V&-UnPv)_PEx!Sr+DO*Py<6ZznZ!4yq~%6yf-kM-1i7C zQzEgm-6&(E{k~W^B#{`{>G}|d1s|>aFch)7jodz2-sR;+f1JZ`14kay_Vu6VHv?c~oDK zdEo?_W*h?hmB9rz0K((+FB?AnBpp|{<`7bNVLHbbO@T1H^z?eoEB?AUZ%!NaZ1cY{bI~lW8qM^K zv(`OnqtVGKw7TSpRu7yHPeMGYti9@ zM{8T#>$_V7PF>qJat-QD?|1rZ+gso6h+ccNcCfv_`N#FmXF>4#_ivy12hn&B`y!3~ zegE0!&ZDjEO>50Qz~<%uZG`K)`vU^EZa#gu{infqo4b2k#vU}psu-i)1%9{!2)LZ{ z0V3ss^22eUV&Wp4^;dBtIr9?w3s`X?h*xNh5ahIk$RG=>)L#lFc14AY@-Zn&FGtzK z*onaJiHnqW+jcr%s)qccnQW@92Lb^%wH}s3W8-t4)8)War&3UYk95?By)Qhmpx5w$ zy|?>jRXjdbEbhhlX1wAVj|*Qvz|`oi*64I>2kyDA=hN7ZrYv7w5c90O$~X^Ptc;F> z4^L}2QX_2j??7^|v@+RzvzVK;Seo=bN$nVIY3J0Yeh#=f56@qnah-7g+wLIE+r`N7 ztnDS1di5jErL206;ZH`S8n7R^8(gtvsPz3gHz3F3Oj?Tkf5}@jtx=f-j~ND05`FmaW8NtC8$|BSDWvy_7qW1m58ui-d~qM#0s}}W;j#i zvdWP{&f;oAI5lh6uk1Cy^L6u#ylJN@$d834skBmY%Ane0f6OflDQLefP0P3mZ6OTK zo42~dtwd0uMlC6>0W*H{wj`A7HsIaD-zc)YPyRL0z=30(HYiN@>jTOFZ-5IS4U}0S zeXDwQ6ik8ImVxbZ-yuo1+|JiKe27C!|H9csi~DQyyI1Je4TYgduVrhr%%)Aw^G4cK zCI@*=IAv>i-J_U$!|b4$@tann`&}}29k9%|(l%PvFgwKH7GtNSsWJ-PSpuWUSru46 zFti2I^@31u%e0AO|Do}jTDqOvHPM2cFl?&b+Fx z+*kyQ;P`BLM-b%AQSQ+>gH?GYCya;Zubn2`qUq-&r%&yBK2UyF*%ZBPi+o^!A>KdJ z2~uXC>yCf!#~i-i{ymMk#E)G~S4MvwWg4Lp$ikl#HKshsbv3 zW#`e8^_*{2Zl#pTdoirLu*NXag3|;}U8w$2e>B<&PKx;{f2l7FoGC_Uh@uEq782y- zGc-EAm*V8v&D!3+B{kZyF{@3-R!XuYdAl?@6J_<@G!0tfa+&BYdOx%1n|jS1B9HRv@{!-H$r*rikJ3`19!&*T?Q20% zwGb@VlFQtV3g7DJ9sD8W!B4L5@cNb43_)PN*ANHi2-POaSMTl9RCys<20;FS6QYX; zwd&`tHO~oZ@a4J8it#+fnBh|!R();^FwcOKxD$(x9AHpAd3Tgl({?@5M72H!I;;%Q z9&}4;rwqhU0v)yUw|u!kqClw3R&?VlxkZ?#18tZk1;hr60wl78Qf8Yak4OKK2$UtR zg)~-c3IO8#c*~5}uCnsP8Npjs3v0iV$gpAf`WXD&*5@1mQyg^J$Fc`kpt?L}tXIB& z2~{a`LjTmh7ntSS7H(L!t06MWZ%YEx3LKM2M!CzXzBWZ6zVN-0^%610qxBFb? z3IEs{?!332R;uhzDP0=-p#Dx!9v_Liw>=dFB=f2Ekoj)F??!kRKVKrBlmouSDEYk% zBMs`Jfntwd>KLlySPCGuU3S6i!D^V?MzRfVYrmx3LQv4Hs2XQR!fDXpR@Qu8d9&M^ zQ6a|@Z42$%5|}|hBWQ;sd^?FPxl9P25Dp(U-s(IOG5Rgh`%mo@#`Np+>a2>HmbCEJ z!eRAU6scoJ?Cenm*y%e*0d4(D=}E*HBR=FLV$KEJFDg|a(ue>CanRCR!WYX)jmi0D z*}IH+xSdmsqFi08y1p+l2QU@_1cAW43h)(aUaG@X%X?`LC+RtuWz4*tf;EqSLxH;uKETOMLA$oeEo2C=dkB z?Wo{aihsZ&Dvzr1*wA*rNRfk>()WA+PtP{L=2qBQf6Om2;dyVkqX7CJ_hspQk4@S2 zojYF~Qs(=Eg*#t{UgTxuj=*f$qWraItlo3sf>QI9Fh$2wGu( zv*`M*pFAV}#Ipt)?de^$+oFmHs5OQ&mGivU$oaIV$v)D=Sm{g>ESrDyn&xNN1^o=l z{AcV#)_b|^lu-q()_5;=w(8$PX=c|;b|rn%`0rl+HeX7O%<1^HpNa7`|G>!UpZ`Q& z_2a=RNED-7pU)8#08U62xleEU{a=nz%#KzyduN9mmnnF8uA5f`Yq5B?NT_mIh{w^1 z*X9DR!Z+EiYz+_>MD}qRrD<+xl&NxJd@30>veyCwv= z)grJ?CrC05uf8H?`b|$ADg-kA1^@Ubp;p}quJE7J^;H$Q7S&3l7B;q*MTMzjSeCC^ zoIEQfLQ7=buoJ(*r z3!(J|BC>c36Piwfe&x|JZ(UQ&KUrnYJiONrnFq)AO1Z>H$IR~$0v9vUPDUw;H_}*}>QkL1p*Nx}IsSAwiyuZ!O zAg@FYEpV&8$JeLqBS#VC1b@dyj(dMmP_D(r6|=X1dypc`!ixOWM?6{2@txIraZ9zS z{#4InQ`}zn?<3`W2!Y1O0t%a17*xa|ah0kK5MPzSW0-?ou-rM=-T3Rl7U5%k{E@j5 zdRTfyjEyN3Y@YFsm4}7PdA%C(P@W#3xE^fnZ0#@6$u8^zSqxSVg$h?*jZRih!3gh& z{sG^NfZ+Y*<4A_QMrI|^(i%a5-gf;x+_+{iUd&1oYWBhyAEv#+NuFzSb zY#*bD5A4AKE9=d#bt{}aUz-Px?^)m5#yPu3AFtvs`#M{McU0aGjkdl9xAVu-S*-%M zx2^BY89ck$J;?lmcM~0EK#&lwHv?11P^g?;#s0UXWY{5 zyLE{nL=$Fak~kgX`5o$p#_-i@&-YF2`|`C}EX4csOA-sC=gMt$`cZUX!f^Q$sJ;Bsw{47;lW|=e_KPch|P|HV5CWVe9?v9y~ety+LLde0JsKEvbar zZMqbYK#3xQ%EcG?NGw)oELZu}ZSU|He`936r9E56wmp>Qt|fPNJnb;KYKI;=5m8;Y zn{NBzl}`IfwUrTjeVntD7jSyS-FDh>7AD2#pW~exO>36{z`r;azZd2h85P`@gnS+s ztbnIOO14xYb){=g1usPxO(}eW1dliZD zIMLneyL~y5Np^g)fwuMSyTYo}pR4+H`;j&G8d||c^o-W|4^80V0nQf#@Do~2Opgao z*PcnE34t4gh31`r9RQb0lnj@zqWo_J|3Th{5~5}AoQhS?opLgED3mwo3nL4YB~2+Y zGJCRQSlx9D`_9FXlYg3gXO1hFszuiv2wZTBhA|5(o;*j=we*C=+Al?8YfS<1tua1t z^ej)GFkdqNKj}cv&LzD@AbKIrN`FiG+{%CaJ#@Bd`a+hGET%&pdn7@HRcr8Q5MSy+ zzj=i-*@0&f^H&Q8Vy8TLHQC9*KX&Gng{y3%lCNh2Eq~+f$5Jm#%BeSYphQkW3G%Da zKmF96>CbvGL)_&Ux^e3jo^p(vqVjL}eO5gLK489`_L( z!-~c&gq7t@Pvt`L#QN^Q{bFTD^oJG*tb%1iw=J;$h_m&BpTWzFnQ=gJRGuMO6gui5 zm+oeozy$BVtA# z01Z9q@~4TtWdp*+&~o&qbKzMU!GSGI=iVvj*8^mHS|lDxr~sxZD6{Ac6Zh6+{i=by z7bmLw=J4N+DDcC`Mz&2ZY*3Ec*D)b*i@0Bk;!-DVO^X9qvJW1Z4_}^fA03-PDdp`r;j1aXCLet#-y&8ac!1- zZ!9pR!jcKJ8FF|``ataYJ@vzltDGU#gkJM_xP?%YDQ%ghM;hf?1-rT-4i|66y0y9c zv>N{y<3}VtvHV4E=5$P!w)37tu!;D3+A2s)UfphaO<{wy<9J|cJ%0B)cmYXVC4KS+ zlYA-;2)?6J<%*d&64D>w$a_`XsRB4!45r96fR#(=6M-Wl8CdY7n1@?6x=W@VLUYnu zdEjJy>i?A_3Li2w25`bUVl-SEs06x{ZjoE;mV(x6OE+4NMjVIm6QtmO$#Ux>#`=OR zsDi$ad_eYRP)7-rw5b?EumeDV8Zgs2NK|1ZNlHaB7`5m@F(@B;pG$&$Bj6Acy1tZq z+5=Y*=d=?KAyr2UbbVz?*I-@4Sk)(#;&&8B;;;x(ln2~1b`J11BTO&)J})2mD__bN z5dX3uKh6({bD@|ZvOn#3#%70y|x+F-{cCZcYhxc6g~cX3L+@C zICURdp6L!1(u0xXc`9WH6yWj8BGHIxHq+${ygs0u!`@`U>Glj~q#&g!^jNDXH&8|J za=F}^)OCd_3|8tRl~M4iiK?Bl9lsW2Z&RizF>%|-*BCpUU&|q(va2lM%~^q7=oD;$ zB=3c8Ro7k!#XJyY5*KuqhwSVWcUC~xF7mayLd<(+y;{J`eGn2{ zI<6deVob@e&7RkH!^?@OO_bX=+e*2Jb!HELu?s!cPSu7FloCwBo$~muS{{H+X}vpx zi)E$zn5NpR%iCdSy^*3kg@?H%8amRD&hUfTmcSrtAVeuVtYTMpAp@~9c29*s4ZH7@{<^p>uYA*N zY;PmDMCcldRwEmninRl^U>Q2_v+9;JpHj{1srffrYADfYD|eMIiN&jvO6#-Bm8C1a&D7I8h2pxr*^~qnJ7yUT zGa`5YQTsQ6vUSHI|ftv`oZN z?AEmd9GP@Ksh){cRb!YL&cTRW4ky%i*yClFJv~7rw-! z5Mr}5ad9*H%S)v&ViKG}2wY6|ByGu~qea8Y)?_&kzdO;-{M8Nm%5ZQ8Z4CCAJKCN>tYI%Xw~r`tRN$y_Rn3x|t#!^W6c zKf8HT2ce!1LhRJ3r?{W*sTpvTc0ksZok9K8!r6@P)_8%VM-gw4`B^UBB74V9(G&If z`fRn7wFQdJ^8QtNjI(7+c+-1@;8-dsGvKr+WB(V0_Shyrr{P_o+u4kRcHqD`}Tnl=cbv)u-0FyH2vAOtcZAQ_dC8Jf}AMZnW9J*m>O{g;fl>%hBiuOZSv; zLRMI1!#)miY@-R{6gaD zk=FXb7o?#*j`8?afl*q-25?5a_mV3SErI8o6>#adlAV`Ylk+4uW9f1c;Q z@8^D=(7wL!=Z&5|+}HIx*SXHW>-;|lv22a-N#N7TU)FAdz+C>Z!ntQ}pK&cVy=}kt zWoKT3YLMq?&CRZLxfVt3KrChG4BI7EFW7xxvHf=trAul>Vsg>mYhge5mha22*qiSM z&CRzn{_$P=2BQ~eLNhYAYk?IM4$OpkZMq*8nrqKee5U^z8|m0uc~=Py1YskOlp~QyOJnfTJmnG*(Sc1&_} zv_kb}!H_Pw3&o`4yfEP{1M6$2R$#o+eX_*vjQUgPFiKTTL@+!L_IxMH#SsYyvX8WW9 z1davspF%q*5=ar@wE1j^dbzAIk|T17HeC0!Nfdf;4ENg}6@2heWlP0x;Qu=~PR? zJe9Rxq5TMbPsejPkPA07sJVf9NPW8FJgYblT~H|`r_t&_{>5CQk$hsMSc?q^~w!#=2<+}C!bO_){2=O1LwO#MmvX8;jO81 zMJFhg8k9?&NWPRxA4Dh9Csn9x*rWPyyns_aY5H%>y~|)9aG`*?v$!EIZFxt@JdWc| z-5i200xV$;Y*bwm(~rpYm(mKK<^lbPPB$L2yGa&W6M(^tJ4$x$F28cLEbL9sc~pjK zyC?-xHDAtVQa&dbvH)$d*K-;>RKWuF=+#Jbd7E+7eCmuLrSn5ehmw0dm|g@ZE9+M zms>P+k%@}8?g7)eHhV|keEX^4afdd2x>pVDr}C&5W7)B73s=#Fo$^j#{C+P9%u5jB zJX&Ce18!3ghXS0etU|Eqbe>=9_VgUWCole)>e33U)ghbXFU5=#7PXlOQ*IFBLN89$bB;7hTE{7>HW5Iyg5idOZ-9{*+O3H%8LKb%1WV?DgzbwJ&^$ zoA;NeBRP0WTEdi-vS zYCLQkYr@^JbAQLa9)Am_(Z0C7`?Qb4R^YJVN5RokU}BniEuDX7u#^snlL;Sd$S zk^FW=F1(^2juO78*{KyW*lqiA@uJzW3Nn9?+vb?`w{`m+dMS%ph6Q%?pZBA*^TKsz zh^sBO@7kf0RRoUfSe-FQU)jYo_a``QoRj z`wWXvQuD&88WM>E>rKw1FTwG$t24x*opW)b|E{X2dq{WRp^<_Q)~Hx4lpd*}vJdDE znA`;9^~;U8{24b-CNPadLqCW5zPE#IAPPIQKe_2}x=)cc2MtoRrBntWI#C|+Isk zN?k3N6O_XfP{MN&rW71!8LdUugZ|8$!kCm_mSCY!J;fnJ^WVFjpju}~3V2$HiGYM@O|tj~tIFq%b8FS*IV=$erNlAi30CXEs!B^Qmzcq*O0oT{c#fFH7&!9!B( zZFM4ncXQ;8t#fWEnKmo;7NR`|>Tb|2#A~U_79WPs`$9wJh1fZQ#P(|&CB{kW7qVc! zgX=ifV*XuB(Q?D~K9^E!_T0)=Lf<+q3Dwpu(K@vBvUqpN{Pnb(!+40{S2G(YElT*w znvrI-akWJM)}Pk!11;AsFyY2HYd2S{*gxA2*^!I;j*X)HaMQ2Z*vpW8Kc|30_uX|- zeMRNszg=A#km(q9A=-8XBRzH#50_A!I-!3g6$rwQLZ*7B&1QE}cMDpRfO zxH2*(kZ8p_3}9TGT!4WVx@x=&$_C1wgm2}iUR%ksO+;Nj0`bG;V7%6?=vZNI?^?mx zA`SVrumoexTG%=2u3!q&zZY`#gS}5!cU9Pf5=M``Y^M2=m!{7iQg6 z{3{mPXJzJRS1eRJZ?CX&56#Tu%A+l}F%r@$1k*Iym19S2wm0mhb5P7lM?I${t6J*v zKxbu+5sACl-v?t{D9qdFEgO=ob^V65oA{-k*xF(HK-(DwQ_iR{tgWqJ@M`l*){yG9 zbH^RI?F%eaa()7n;|?&mdK{BvH(w#&cl|V$-qS-0X+-RTaQPMwUty|P>@sxpW4ofl z0TAe#yt78v5A)n`&WX#d&%4JDu3NT_1Kgya*H`zsB|L}CU6GO?QK5iXg^OT>bLCl^ zlMD0`JIZ&dU!O!*A1#ohc-d`xMMGY`lS7Z+Te(=c&Q!WdBxcRH zZ!4!)KGLd%k!hw#c&=oq4;>vxmf-BG3uP=>cxabeu zCZBP61>WN2Ni`~;GQidrS^8`W&26M96ui@o6uQgckhZw z|8RgcBp<6nb}mMj9RbwPeuE(ZW za7*CnPvw<+-Ry%Sc2s8cI9OsEgeo|x5IHzWJPLn=l2>K&*v>7SHN;%tCiWn~9< z!~lEduhQ9|%|5o0yO!A{*a|mmpRf9^HruT-iglQS^~r1J=kru2(>+|}5Ib`9OdU_R zupeY(*RI6QL~Mui?w$nD9ZfE2T&O<468QY`pVwJl&I!*R)kxHAj?y2Akkre&jU!%N z)FXAp{QD(Q#M+gtK<%=igdOHUVhhDq1Cag?{UbZVV_alO^O zyLk2_4ZkGo{V|vy3qun-BF4b3P z?Pm#l)a_$LxhAZjNva{dm*_9IA&+^3OI`2lp{45W+tbC0-`tBAHZ8(xZQHY} zW6utH489+&ec1LoM0R{?2Gh-<@h%G&Kgj-Q|D>?))M0d=r}ngIo2u?E)aAZfYV+@M7u0<#XeeOK3B(;=not(Hz7cf4A8?*?3ybhmSY4P0&q z6Z<$*wouH)`}%noUhlL;zV4#-ccF^5ci#F7-@Kl`w>ShWW}S5)xlb*NFWc?*ljPQ}O&A|i95_aAgWg~K3Nl(Q{j+=T-vfXrLw6WI?OIt5=Pz&+Sn!9jp z%iwM_v4mB*_XgPetuxY4+w2irhv&VjW%g8?`^>)=B%I#%;THfERcpR3&sv%L6nr^7 z*<17v{#IyT+-^5b>E3{XzjOEcFfX=I<5#}c+4mNxgFBFhzmYF%()i(OpMW+O&iFZ)pkyorM1_( zN!C~G;WD8vanL`qpHNev#1WI{HeN>mtss_#;_AcO5ROlVZ+Ax4NRCK~r+(Z0y2^Ia zmUl;N}KKsv=J8x5YFs*xT zH|sWZ@07)8^S{e?_Q@;x(zi)3 z%-=Rf3CgHd%zePuk6A}}>-tuiYx%vF-?fyKwR`28Uu+Nm(vP)I(Wi9W;)%C@@Ua>8 z;!qVdw)Jq6k^9q>q&7zTPwXT4oz^dQ(fN;_9A01MG0JK?S(g(N~=uj?n$I zVnkjFE>+$#+07U@7k;YT68Kd4E22+)IelF#Nz0tuO{fHjR&0lJtx`b>M2vvL?dd6n zQQDUbH)2ythZ`Oz3-a=_3Wee4vH9?e#D_{PjQ(8slo-1yJ(fHcRa!rrlU7&>IWGTv zkX{~ppbBCTo>PnH#ZKTtoSs|rdZ+S(IgZFl&wo__3(Cn$$yaZzo!)luW3m`U&A8Vq zO^!46PLA6fSxS(@rN{{lg;zY_xOb1U65W;n9nCh2&G{q^E28fa^d<*8xke65SJEi6jeH3n8VQh zB$510l@~z;d2EPEnjB>clAQi&avY#I-}U^8^Ieb7@zd*L=o9A4SCMvb8=c;0Co89S zYI~T14)MgU79<3;oV;{B{f2+3>C-E;RK5(@&3bpgXJooN3#x-c5}uK%3p z1bTRZCvXDY_kRPKc}=(f()M|CRE_&X57Bl+XRBqIojaUtw+%#xXW>2pm%Rb)N15*0 z6t|CNOMDt6)t^p>-pm5N-6iEOWL3`EEqXT9&q=@7kTLR+eJM&7^*4-?=a7D}e*8J$ z!!XyTfO|Lf++&i0A0`Gap(%gv6}P=?uF3AzE>Y$HZq*gb+Dm1ZLfU{P^>=sICQ6JR zQ!A2x`FW^xKS}wjaS3E>Xp+RM2lZ0$DdjyTKl1UC%2QE)!{kOXKJj_FQZe%h?tfCk zFA!C#+Ma{|VPfJGNyaB7KU2q#Nq;H%dQSdQ@;B9AlK7G`o2ZudKYUUp<6Dqf{;Fnc zk&}Uy2){s1sZ94}M?c9RLV6_S4HvUyyi)Q%HXo40+xh53v5$HP{|@>E{BY4M;%~U< z6xcuCM@ZV7AU^k=dC)I{FR5Y>Q0T9;iUsLc*q#T`Hn+n^2*=l#lDf%by1&x8$zM{x zWO)k5CT%$nfuw|2;BOd>gQyVCr2pYGPwMS@tjTP5>v)Q%`&S4pj~+(NV*Z9xuOMCX zA;t}dwnRujH@EiE^(*48hp@lWDY^~sAbz`OKK zhLNA+OUlpB3>Np3rk7i5EAA&5PO4s!`NSk%{q2Nwi%#NF+EI(+KcNtvlj$hH4^wiI zdbk;=G>w&d>}SgBlY^G3b1C>?G;-l2^-4{5*NEDg)g(S8-6QD2@|lwUF?{%VNtr=Z z()|se1j+d15<6~gw31-spA095FO@kd`UQW(X_(YcGogu66PwRY;#1N)hPNLtA+b~N z!$rXsw4`1k{;_s4qFF4Q9C(;SCZtq<=b&Lyzm#;g>j6nzO8Q#d+8r+;QPDezA5P_@ z9=RlnmRmH*%grH5CSoDJv?fVCum`s$dlNUXR%i=>@`rzilnK~U3Z>vnE93)8>XnjD zR;{Rfk13^2On-+jtxi&p5a(z%S({?D@pde#RPazztK$AjYj^JU*{kR5Y*fEE}DGp+PTGl;*!JmjUtnI1^8hSDyc`h)i2Mk2m`p6@ zZy4PaUQ)kYZ7)bEp=0{xpry2n#3$g-L90T&a{H)?BwQq%D72Jn$@oP44XU=oD!bXN9zUX|o_mjjIjBEY=ha}F%FImAnR_X8l8B#xo9=3v|`x`d-3(AL9 z!V{(}wofA&pTc;%{TfM}-MLXha1vi2H@_uA$yA`X->;eoA@3B=u*0Gg<2F7D@dlls1nkS=I{irOQ}Sk6ek48gQ$L z%~rc_Gw74Umei=YztWmHe@Xqc-#Jl;>=sh~6V&pM(n=NJhfyX)kAxcWeL6{e?zlrz z`?xo|KU5oALS$n8N=L~iSP+-yf0!s*|4F?`%tSon`;3zKn7+|66!#YP_ok^?vM24u zr1?9S=oQ!{>Qo|rD(uRE^zvuRd+3`e4L z#o+9>x1K}NIrur)g*1P|rIi#+#%G%i-<~gdDSF1ey>xwJ{$GyXJJ=bRR9Hs>lJQIF zci8=d`cFu7k0}|8LVRhhlX^tfJEKY{v!%8y`6>QvlcY2D;6so(BIVupQ`NnElt zhy9dETv|P32E1TjWvahqAd$lyxqpVtJI78-QGdfERZ_pCYGMCp5|r?iDo{PWe ze$aElM>l*X@!BDp$m%G(pj@ysvJ|`kpBC@v4$q`McIRj!gi`oIeWK{Xa-FIVi&SAB zX;PmQ`4M!X{GDA1<(0`P^{Y^>117^y=?~kDrut7P^5@baF2t8E=t(^a^|fjg9>1j0Y55!R zSW4*vee?c?SC(*-`XaAT)f8N+-N3WU{X)4#?S=P~)FZ9E^W!WVL=vxcucYFUrHtgBgyNydd_S&nP z*6DV6Ya@fd{Cz%qnSqU56c#Sta@V_fIlBHSFC)vJbbSLD_s%1C6><;OLT~PPQ^DTB zCQQwGRw#5QhP_$YK8K;FQ*->dH=P~wGw(k9_B(pE+c1`JXVK2xx`@KR<2diaB^(*| zA4vD-Id-ri&K83CS%vS8{?wRkR&mJAp1X1Oe6D)l&HEZ%3SvpN^b3x<&-T_WH*?dt zyEu#6e)7qTfAMwMShx^6!Or(n>{U@+dTE#A?<@=Yix~Flb!&GLMYsF-SE6*kS&pt- z!E+oHGF~L*kvd(txqRj7b@T0Grx#p(jb4J|@-r0TB+CV}UU`AyAMT;((}TKv>ptw; z?Ng$Ax3Nc47w>V)1=pJ_c+D;dRzN9__Pt@9*Wh`tA0$I~UW)fhbbJUkc!E1>>$si6ea+H2=&lQx06mtXFoq zAW6r^ZKApB&+RSs)?e6bLhtW6$s?tgRq&Or zEIU1O?+)0DgF*!6?R8JE>Rx1S4(1BDuI;=RZf`x2KYK^^ZeGUF#DTrXMO5y6u=l5R z=}`<`pQS(2yK~zmicA8S^X4j_yGhIouGg@;?qEi|Eo@`E-J+9{PMdan6L2z0= zknz0b#Qa>md6bUN(+>P_*?&{(eUvIm@{ebq$Cs#-)khy0NTpv7ZPsdq- zpz-ZQ#gh~5^j^O4THR1bsg|wo+R3eOHo9cpEw^mnZr^v=+Ut!7Ues>#z?FM6 zYPa9$U@NnG55!3Y7g$s%uJm&`zgxGS`A06I!uF*e9> z$u77q?qlIOcM50d(Ri(P=U-W%YvXT_EMS0QnSfb%ZOmB2h1i3$al=qv@y{pm+yKmIVV4k(R*e9c?v-Bn-vS z;m|*qz)87V?2SSA0qx&&OZAlW7uP4EbxC~!E~Zf|o+I9|1lDIA{>!$$|@^Z^+>X_tjwQ=vsYIlqj zlN_fF_gZatp9&yK-?;=1Q&BvAj2+tEvB!3&I&|6XEmRK1D3n@+xO=3Rx2;elsZ zuUD7T{`GWiT__3mc3dd)?CU4&Bi8HIs$DdsHfgOvn3EKGr#n}}<*e$&sfOD+$6@h1b(G)L5ocgHD&5R`b`iw zzT+nrJa>be{=KIsdgHSwq$k}`E_CB11EmvH3cJnq_NrH6DY=s@Zu}-SF$h?bu7z3d zKX;E}f!#~DYg>0jj_+wLG&X-?qJHn;6OH2Gcd2~D*)IN8V`tHcdhTX4b>6o1(ayWO z*KYI6nJykVV`$$(v2t=Gs*>JE2~B!V+2ho=Oy*_&GZvwYNdhUH2b8DMT7W~9P)ysU1H-}`z$A8?NN0MF~`OYi-os^Cs1{MieBO6xC8!E(&oz00!}xZV*X+T_Q-J9kqd>`PuwvYpd$&lp=m z7}^@uR$Ul*?}$oL2c?# zfaSC|#_5x1OdE@g#<}yS^sh+ptL4MA9`?&x+Ge|f-UnpF5*qtsUhojZE zFdIvoATGYSv7pVSz59CXGk|J}{4?p?f8Mu;x#bf2$5JvEgM@zRAT(iosW;SbW=NS@ zRD3zxwa*qa-L)B+A4{o6K3v|WNtDW*W;XgE{XDLydM2S;=+4<*9G#gxPMR@yT*P~T zAr~OtzLobB`1SR`^4FigBp;CXNI_V~qY`1-#}Flo&&~E)>3nV(b6}_bcx*U?K~a&2 z13TA8gnAPiOlnebUrH-jW?kY==TVs3-w{YnN=%O5$aUgbC^d{Jz~9baw=^ zf<0D#F(1~|(Z`bjhW?p_1`)x3&^(_&j&di4ci{?e7Vv4mSLQ5$`wo+L@UL68spE#_ zYuh(?g;uUwy>40is+IoJ@ZE9Us_Qz|t$OV$U68Nu5aDq(KyxPE=diuKpE zwyoN*VeNXqsv!FERU6tnHngsCvix@e^2QD%F59@SJt5@Aj@4_|wXbRmn%vm2X5;GB z*Dbr=E`CUU+d3&A+$KPIIUCyBh`_b4lXhOe)$2BHSQEZmm$kL8UAC^n5pV3+@Ve_) z_z#O;%}W5W@3q&j4Zdx>cv0!qgxB7-YSjjFeeHFtqVzCd zZl~z;-AWVa_N`<;gHL0k3U24uBJ;|&(qjO-7~<>c3p#h2bF;9V96P)0{cDuuVx4a< zsb*fh?-6-G(8Ky)upq3K(4p^IuxH1D+{!}0`FZ?Hl0gN2P?DSVtrCGA_lGg}PqPMo z@E14*bS20RJwQ!=3EegS&t@!UPt*~i%VNjO`T6!xU({MK1=h`#$o4PDy`9OxJ-6Gd z(=0vAXL@NgPTT+-NyiXMFHgiqyEJ({?CYdni>Q9yGJ1}l0<`Z<`Nq(jW|G_Kr}>Zk zDgomr+b_yfY$%a>%*4UI9Xobz+o@isYb~uH-!A2l(vuy-Jj;fB-#HWTyyf@SzW;$Q zzruxn@M`ya#QzTINk0CX{Pb|oHETZp#JivW=AHig;5C2tACDdR)t8Ryd#Q!m|FkZB z_q+6WhyQ)o(#!1M2mSYlJ@)9*jrQ*`Pyf`?X7~ED<9)3YR({?4|AyzE z^!~oJ^rIiq-?zR0fAjporI-KcDyPkVVkTKcoAe)GHK3!hoK!~Q+9 z^zj*Q`}fy8{*1>xyR>1!%J$#R`iT$kCtlu9J^wi`=RcNy_WeIzGtm0Hm-kE0KkNPf zdg;fm{r;WxAN#GRo0g|%U3S-jZpu|2xC~X8rFh|2y0N&hfwJ``>x~_ags0 z-~TT3zfJ!4QvbWi|6b;QoBi+Q{`U(1d!_$f?0>KFzf1h@EBx=({`Zys_Zt7Z)c>}) z--G_wEc4&~*DP=O&6O9tdHoxfd%FKMEBv?rH7otM|23=pxBoS({kQ)$*ZOb&Yu5O0 z|7+H|Z*#q;zs7&J`|sEK@7MY7E&h9_`|a=b-*>e5dhEVi?(+P%y5GUKxnJ{k_nW=P z{kFWr(+~Ua_qpGm5BcwpyWc~f@bpi*-%X$K{Li`H`~K1W9{Pg+{kr>I_g(+}L-+f} zXFdHt-0$R{d;Txn@2~&M{l4+6|E*qT^!J7u`+IQxc=!Fr22Y>j=y%WX{Mq)mfAd_& zf8#v++j9HGj(_(;M>n1JcVPTB|J~!i_xkU{_V?~@zSDmn^}hr9J=pj3Px&2u@x>Q^ z=IKNF&2}6qTh4FiH>Wr2w{P0Jx9Il+_f5G~zx?&DaKD569_-M+um0TLyS}@A;y#4& z_tagEKjeSSL2#dQH2rrl{JY=Vfqusu{DS)(deQx!^}jhej%%WKY@_P0kxNz(Ir*8i5FNI$lO71@)oq|5e?~r~$zq3AiFTVIY|F5r=o zsvozX|I@Xvdi!m6{o|(>{OZmO@>eX`+;RJ!-di?bdd23wn_E|CNu+D@mRq~7Xx{Ah z)?9YwLKa z$v!v2jORDd<}@{#MbO@wqwP13^8F`M0_M)W@^?*DrCD^K-21!p4$*r4aHKi))VM&q zQ#8{#)wGPl?@skr=Fol`({jsHsc9BAHEr8*GwVxySL=I4Tl<_%D{Q^k6sO%Nf1NSf zT8rzB(=4thMr*aW{c)Pb9gNZ1E$&d9W^sq1wK4=-*z1O9gI`1c-+(xXcZP452a8a_Jig)*)4;E%T_)N9v`Ahx zi&nS(60>Vk4tIrUrsopg9fan@n^wM$zK8Jj?UKWoF_)U5S9{Eyu3MByL$ABkv<^~c zEUu?lw3a28o1RgmrKQ^-pKpopJpU@AG`HVQv^gxA z;wX$0ZTc^`%FOw^r%CkCRpxXba(cYtJ+ClBlGD4lciWt%OZlf6f|lh8YEQFiC3>m9 z%-BjZwyVmFZRU5;sGeB@*BSF#obo19Q(s| z63XO#0oOd*G%lJrG+}Vuz}WuLJ++;qY+SAeQ#RR{Cxn|`Yo_;&Hq*QKZ69T(H`kcy zZH+^d2PY2Lc!Rr+3UNBfEE0Arn7xf;?|YD0S!OC1IodggJtq()D4mhh`!le5N8}DwaFCXdANFa?ySIxiVWvofu1< z7-Q-mapn4MaMvO1U<51KJ^bfk+=HSw)SySLX&_G<$kT>4Tb2c}nD*J^zi<<)&BQ(& z^>iZnF>%p2Tb9KC74Eb!5k1dBn|mJdeP2Y+NPcgI_fy%Ndu69&B4m z{p|$v0B*BzW2rayjv5*{=*zZm3&sE03hIS0Rpq8?d3ld*FVwc2sWA1YN13t5sE=JE z&4~7DGX!?hO4>&7Di`tZ8X{GJk)tDyAA=wBGW~q-@=9|SSMeZv)mE5V%6DyBbx)cN zXj)B^gIg)=glaQ^Je@$EPUsyws8(8fieGUpDhYFbjX6Jq?HZasICY@0e{#>H&WWw{ zwww#|efpD!gd3YNW8aF+Q$MC_vYFaGiGIvPGxhoU!O$nlu46svI?90X!<4`M;4ZnI z@^57q_T`%3{R~(8*T}MQ9%E`BAD8qcL|&PNckv_D8sfMGxgIVZ#UEzvH#o zK4ENq9g|vL4}+OafX@n7qVF{a%zJTle*;c-=-!GZS7)iO?bO%iQ6{@6ZZlp0KkFvi z0{KbkHwXG3;dY5v!fqY{GjB8bFI*%IL|cYCD*CvQX57|TOX2!hq~S_1|I&dy6t0Nf z7=Zsboz$ISba@EO@vX+xe+XH%mDGV+Q`?*GD~Wew7j{7Wl={CJ-ZycZ#V?}EN%(Ku zPTmWncr8zl*I_U}-$A_>F4C@_fp*u;=vhREgYc@lDf1(Gjad`;iE)y6b8n%1i(g$q8|cRa>KD_0Zi06c?hyQ0V=By;Gc{(!>5-Q9 z7U=hhj*7xWzhnMPCH4=yhd+~)Y06S)^jjn0HeNc~%;dT6neAEnRWs>VHJE%42GP{j zqv#+#7Vn}g-pUyN!^EdZ`%%B!n6KbA36m%vp=?L<@)#@TV|$3J@I}f?9sHxXhf83@ z|MHs{=L=I<*K)S=IGDwK#7j8Yf@6$j`VwQAgx-q#(0ro=-Y73;?^Vvv z3m0j}dZ7IUZolZZogQyy+*{bMz7Nccf5&)0xFYe(*gmw{W7=Z!AlV*2@Q5+5`2==A zG9vLP)y_N){u_@{20n%#8^7_U{@%j)odk2{@3Ei4S^d)IaD@5OPhtbDy!3wjJ@9{q zJ19)?GSjd09|E`VQ_KknYs<_?`cm|*+uVFy6TCj$fcV4o2Zg)w)5rwdcrp67&teWI z%Q&>bjsFH1|8>Ug{$}vUKEwF$kC&h1mg1i?dQLcl%kLHKsRq5Jn$1zwPtne+~mb zF>iVZe&rX)_lRzadlR%9amPhZq|0XL(~e>D#EZ7k?fH2j@$baFAk28uo4Pcfx-@d%{WEDGTnL{qLipl+ z6?b0|{s6p@Pa5;6_`}$XT5tnjW$s8=TRzsvkvuN`8p8U(vJ|Xgw5y#^VM%*3xx}IXe{$LjK!;(oUJ+wf7!Qb|Anb%eTDIK{UiA` zftB#y`5oGQ@rP*#j)HsQlrd)`;YnZ7p25v|3>hiu@+`c4-(~zKzT$m)EdA#(tOro; zv8|2wP8^b){a`-)J;s5;Dc+e0X50{SBLk!QNA^^AR<%~zdN~AU$M+fk3#Tzs8)KwS z<^iX(hJn24i`+WKg#K|ob)92dCHpk^M}NTlhy2)hGVjWq-Zau<+P(SFi?G7|`iIy9 zVT+W>7vTT$G+{S~f6o(ps48R|g}N4j8R8?mvh^Jp!{w(G)t z>BqDI!lk73ad?+JiwzXtwvVH+)3s*&y{>)ig!kxAXa~f%Hi5Mtbf1p>o!(p>($0n@ z++Y5bae%OqzS;fIK836QWS*X3fwGQ1ZXNp8_15+%9bW)*^xutX7EWs^%(qU))=h4k zFf?v(?7--LXX}M|&3`fu0M~f2)&eGyH_VSWGd~`g8`rq96}gh#4*sT}(dOi2k3}}} zd#!A{>LuJ}FlUF*L%4`-5>NC?e@@vKFVvq1CW(In?6uER{~rfGOkG(6?uK7bCxk6g zhj)Q_{tR|SI9t{V#~WwhU-Mto4`CwuDGn{rKaP7qyp-~A6yB?TNx2u_mcK~<)2$Kq z+x0c_z7^apxRYRKX&xX!vw7H6OFoV=lNUwuP;(RHd(W?!`@l7PD)^7nT$-_7%e?0_ z%H*`Rc)dGvmOUT8rVijgEiSF_&i;maFMg@I1ZMAV=>rKDoo8)}%(KG(ix-#&6lPSV z8MUZt(5|KU`R4oJ{ndZd=M~@POJQH@e)#RbqmBMFm@wa%mIq+2dJ+34Tq6IjhW>Wk z<`mvN(4WTb7cWKb33vxh#@v_USM=k!N5zZO-P6z}W-?|V(6=&g9O18l_Y2&R_(kG< z2L2byGN$@7>3SW5x1c;@=8K<*?0HfWRZ4NA8 z9ocikeB`5*X8XgH=7e;bu00XO+rvZk88dkj=^$*8`tHh+TNjR&;RhyX%n96@f530O z=0jN9Pni!9W!5!VcTzmtU#?AE z3poj9+cfHeaAA!jA*&z$<AeT{fO}+C#ylr%qMk)%&YztzZ^O;&2bV~jL(pfO zNBqSr(QakI+%_j;HVbFNijTAIftQ(!9nA4_;|ts0s(?4={ET@}e7g?ATI8bqI*fQ< z#2phq)K|OTrqT>Suf8B-PQz1uihom|`pym0^4UsrGj7g5hB#;+gd4La)1`A>#{3kw zN!TKG^Evo`eqqM+31e-4ja^%c%~K#h>|Z$p_R|-U2Ex~snYw#xn-rfXptW2~o0toW z`8xXlc0Ba7o7WZp3%EgHLOIub2>sfL?KSL^8EGcAu}{XPS+!}IpD}-ktNpx7v-r2t z?A$N|{gvkDxJ}4uoT+~Fc>2-fOx@G9cHOfR{S}9v1sSt_AvO*+sMkUjQ>q zof2+{y$3DA+PNg=k!S;>b4lX={PK+1B}|bp&%i%QyCneYSGzZ=!$+KW!F zzc4o}#s*4Oq7Ew^Ho^PXt1{-4_=&oE68hdH^h?AGbp}5Nq0M{+ZSb)|KUwJS!!?N~ zKW$|_vlNHZBUsbM_A%BPL41#ZIf+{bZdP4|sbf#Vh-0HH?W(IYrd@Qx5+?c`^Ji*_ zYy|_{5lm=|V$z_7PU%QvlJd2~R+ysvbCtu|YE|1FFL`zb7jUnELpZMnZ7UZelVj}(;f;psm4rd zuQijLM-C$f{w&(=YojcbADY-g4I-UV%q zXvh{n`W^FQ*Q672QfbtKzADOi63ZAZs)P4CXQ0x&8aH5d$oq}bZ9G+H+t}yVP+{kI zRCf=qC0%i~$DRK1Z)Ev87^h=5&e7j4^!g008~KehXhR>dJ>r2dMvcye9Df!4i|fc6 zVQ10SW~Q6!!OETyofURp;BnG-Rz;bqI5Wj$!FAxCkluBq(}}63_SiI2(LCGI-v{r6 zkCSlG@0efJd*m7X8~hvm$N47lO}zns^yy0TPq>v|QMwh%i1Le-|NXC_KhQ?`M@F;{ zCfWyZ4~wqy$=J{4o5~@1b`)O22I{;Gn>nG9->T=;X7x8J&3(8tk{QZ1>G=e5u4+f# zKauA1E6wzK8wbPwEalA_r8(|uFlTX1;M`u!(Pm6r%@Fz1YU_gR@kaX2xJ_Uz?O3h- zUIDE;&={BKdlT+}Xvj`}OGeI*E#nE<_=$z3eISHokZs!q{O9yY^-sALKB;pFInE9< zkJrw8D}9>eTUQgbOSAnhi0QqCfMXjlWz8NEDtuOSffA53)kO`F&BH_MC+3`Dyk*^^G+B;GV%9vEiD;H+clk6yVb7Hmt3#4tMUz zm`~v<{skR$R>QT~1Dw@xI@s~RXwwg7@6Ggq!6|Ly-{g7UaF}#IzdKcFZu)K|Yj93( z^gA=$vTe0cG1H=Dt2|#+IatwO*6Hdnc>-@O?g;!@jhrtzGs=vkOpc%(7QGesuz0d- z@ZvP?go$CObA0FI*>;M$pfc{;^*CSkIiUmjKRkxAhc1PFhnE-af7yC}FXw3bD?4Xh zQDd$+QDrVf&#`B)rG3@3ePc|^TbNtG9UX9GDE_THr7ggp#;h)mNk8y~5x+p*x%kJ{ z#B_+uJ9xU%{1vYKYtk=WUKEpQsA7HaB17-FpOryYJ1OgnE6w85^UQfCE;QABmztKl zm}|y8Xk`+9?3?hx8nEX7B6h})D$O$7{HH0mvd_J??f3aqNj{BX-+C4KG?sj-HAmi? zG2g;%0&mmd1bV_Z@C{hC8*xm8U%+Eb6q8p9OPUW8R%UvYna3@8Ikl_pv(r{ZnYWM8lqlpZ~^2 zq+nul)GtA{aB({2A{rjD_qiZ1{OuQMwz)(w9k$W3!KC%*Ic$2J{W$ zJ+i`#e0s!?PHfDgA9o)8k{Kr$XEI+gu8aI?A8k6p{uQnjyy6=FrflNJ;K$8zkZ1o7 z{T%#VrFjqTS;eJ3eV)DRvl;VM+_ZlM6B#EAKx_I3#=fF!?zfq}4{kj_b~aO(+J5q1 zxY`k>c5C%ep0jUtrs0wNdCVR#6P{%3BV5>L*v3A? zPR53cFMR`@h0TIlf$IaObcuhHkLp8!yRoLq?7=+%t`S>3=JT{Q>ZRHf#lXV;3C(SD zPUy&2S+o2X#zc}UJ9L^d#`hfDpbsng9rGjmf*+HVr9M^x4I2{;&tsk)U1i?RIpFqh zDQ--M3;1uyiUSD8N!{FEYZjleZPpS{hp^Wzo74mc~zvPi$lyGaf*hQ zY}1bXh`l+_C{J?nVOJyZnOS3IqQm6V?72S1Tuz@mWzE1748FMLa{=Y$2pKp=x^R1{fD@dDb2!8}~vMpfl z!mR|Se2#ysj-f9&=^N)Iv1(^VnlD{kWqyFW-^z>okMfe~UH8+BxfOR(`bOf>1MLXz z4D`m?x|ig9Q=ge_+)6shN*Oj8@&(<6d*^fX-3Gy)uk-EP0g)N6ap_Vc~@-TH2R*&yHe(W zd-pF{0~U5-xtX|}J+qWK-3!pr75XjXa{U&?o!V#P@&f+8be6u*_wk$3e>)EEvR|_g zs0hCq-o)Rq&MAIG{|0E63kTocc&@6-_RW7~3)4sBf;-{Buuo4)*x(C`T`5O!f!( zi|kKRe)m9s26wf1qsq;wt(+oJord=;^iJBPP4F6Lvlhcy?~y}QTH~?nHixCZ_BS7! z$h_Q4i+vyXKJd2v?3!fseNm>&+!JW0>+Sarui^ zE2odcdl;L3O8n`i_kcYL?hhy%F9=(&v0!41ptgZ|tixbFKC;ZrJMHqI^fz`4Klfc- zW!Am2%5-`^(eI?~dXPI-p2OV-HW{Zo+RrT)IQ%=F8j)qfOaTk{vhqs{Guc^v-6 z(PidYVQR~{+k(}qPRgR4R~=!-(PtdNoKz>6ci?J&L>%p2^J@B;+S^cL>8If}h({R{ zF8@s)p23D9Cnke(SV*HxMZ+Vd z%go|uNW&5~T$q^?%1o#`eEGu6rSiGtSA3dcn?DVB=^P~6)(jupMv+rNoD3q z@ogC>+&6d}e#>OaSWbTa9E|7(aCJW}?qB?0 z+YfK%lrpnRd~2^Gd)Axtdu6j=eule8xJVy(2-=*f)OXQy`-?ay7&)sZe#JD>pok9Q zwd00L$Pj<+bkgD3!g#oJEu0HEGJ|kumYJ3E6KV5A>%nzL=$Sbq&78Mphh_{;8<^7H z&@;JnQtL$DcC=*6%x7npnM1;dxXbo5SD1e2<>!(A@RZ*1Z_4feBTQP}&YM$a>gSf3 zH9tXbTi)~KO7vD-w|FJ$j4%t&FEe)wH@P~07Qxg#j>4O_af( zy7Z5Klm7I}<21$v=iukyYpcvc??N?y`|2^)%8(P_wWu{qlYhUosoJ&16y1v)7F%|IN zf?Jov6xNl4@ZY?cdQk#%0RHZ)u!F*cdO(@)f%ZAvtJYM|=j(^}E!PK>nQBVR$AC)(T!GxrQ*!PC`7 zw3~2EqN7{#TXJ&#;KyXEO+=TN9;(y$$?0WS7a}Y}SZ=(o@gCzo{Ar#%j{QIJi+nql zEGC(w>5bilIu$g^VOAQ=6>N)+LQr!Z(Bvb zNBl@xKLV{{b(tB=`O|*o{Jm}BJ&ijnem#98w|+B_zj@7te*(;(Tua{nCpgW!v@w4_ z=>cC2*%7Rn9|rdXt_7^hL;Rb53s?hI>+2tTW0m;_+%Cy2WfRwynfKuC z7p~IoIqjUqo?fj3Pod4!Jn|9vU&Hk)T#Zw(LnGJ|Dq7vE%FJ=EPx3qF&#uj)pZ1a> zGpvWlG4RDB+;gK-K9c%rE;v;N=~FaZ!X!?mbz{sPNrzJQzG+>VIdMIGpr4VZDP>B$ zSFWc$8-j1`oW=t2drVv4Z)wFA<}ihJt_S{q;5G^4&Z6~)eSWjXvBtw3&WIB=W(dsm z*UtKT1H;l3*KdYpM4{T8qek+~uD9>yaCD_xFkq7Qr% z{Q&Tpi^iCXx+{∋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�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

    >xpp0X5c#^Fe?qCA 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

    vlI(^m%=C1$@cwf52TKm+vq2*4ze~G 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 literal 0 HcmV?d00001 diff --git a/env/Scripts/wheel.exe b/env/Scripts/wheel.exe new file mode 100644 index 0000000000000000000000000000000000000000..053a66388be5fca1950f3ca635c85f4cc0740d08 GIT binary patch literal 103286 zcmeFai+@zrx%fTFWXKQ_c2EWah>Q>wjhAS&CJyKf%*Y;@C{|FasAw>yRVyd#5v-_* zJ82nqr=_iJt;e?Zv^~|{Z2M~^pkhLRgqvKv1+j|vJq~KTB|$Fx{XT0?LbRUqIe);* zN3-`{_w}r2J@>Vy_L|imugBvl;D5*Qcv^YNzp(oIzyIkWd*q~bBR&5ZzT>3Uyu^-^ z<}Uum(%_PY+rQp$<88sZ8^86f+l}B&HwPP%-wJ-?Tfyk%R|appebLQlm6Q~f=bHZW zw^tv|OgQ@3!2jQ#SO1vJ_ebBE_gI&D&VB3`>bdZ-{XF;A-S*f4o|y^GWB*X;b8_Vu z<(_rw`PFaKEtWRFID*RK1}f$1QqpZ?;30K$De~&EC+2yk$;;|I&u{1OY|QiQ zXDEaJdh$HCGJxR69?uDbiT{U}9*^g*?ohw9@L9&q%MEhwd4)eRp#A(WNHFAI(BoNn zR>PtjjT=3lF&B_Qo1SX^f0O@*{0oCFXSu~Z&3t$&8SrSHC-5BdFYNKOowdX*sOHFA zJ;fA|@zw|1&M)`n#1@1t=tT9|Nnnq0)dt- z$=edv%kk8erM0PM zI#FJ!r=sOS`{XM?Mqe5Y2?kM)^ueOR?GVQopIXB^hn?}}Sn?0+67-FE3MZN@~)=bS6$o{5C= z;#zcX+-Z+jP&it1IJ--?jPh#T>d>tP^lxqq-q3NZpE5nQqC7Y+GB+|Wa#iGN-8w+O z;e?e*q(7+vVV8#M<7{MqVXFwENrbT}K^9wzfr3rZoLTH?9MS#{uya>IlVDIX4i0tMCNIAYd>kX4;*2R^sZaaMp|VL z+Yef*d#P7(lo8l>kMMZZG^|*U0!LMwH+Dd;=x46K1`;yYgteJInVEeheYzc;<8~yy ze1~2l+M1ZBKIHof$w^-!EX=qcnYAaqPap^}{Z>{x)TCx*P6kJ_U9*$cZm%1i7F-9ax;QlNDnZoBD&YHJ`s%X;n-;s$h!4H z)fOo;RZrbo9&`eayzKF`v}w)Ffb(hD3fa3sycsh1^xX2rvW@2Fa7aEaKCNzhB&grA zFZosVoh^5pPgwund|Wl39A71Sp?o1r+INt3`;jbmOIvbt)~7mE?bvO@No9}B>3db5 z(56q>#9pbq;re599o&~;-Fiv44myE6+Skn~o=$eQaFq2j1vQYagtbk#USuavH5Zi! z+2ZF@*6OC$Vka<;ce8((7JWrF=X`f>&Y{1s>`n8)RA|p}R>`;Hd7hRnhQDf$6Zr3a zNFdTYrKWZWohTJRmd(@Cx0W|Tn1o|Mm_|+l=t7ucOBiC+o~kWQ;6dsp(y{%KwX3B8 zt6K*ebJj6mKDH?`vbFlU@cip2Tq`fF7@=hHl5-R${tS# ze&tqfr1IKNDeMH^QmxMGl0r$h(1UKFYo*X9s!*F-2wK-=&v6U=#4Yp{3hC*R-;=mb zz}Ff3lZU4h_ytu2&F3e8r7jRz5)=a$b0tkKlOb+hs)`iT?;a~C>+8X2Y_vALC*ZOdiM7hIp? z1fF%^IprEWA-(b~QBnDq#}3^)7%LLoJ1q&jVCQb!5Gtfy!F5 zs8MarY=1qdR8empoNSyNv0kuGK3>*4IgYw7^-(fC+wTM(kQGsNlH2u`ea48m7ZmNw z?3A|Bfp!W;T176=t)2ExdT{C2Zqi%Y0EF;@jr{`gWo6o$k<#TT>8zC6Yi zs6!3=CsN$poS!RREX7l@!P}CyZoN_;tvSUQr>z+w>Hp!T7wKk4J{ePz@8mM(s|>?m zA5Be>Od;tD4h_)pzsvm8_}~IUWKW{cdh_DR${B%aHOVd!Qw=Ghc?s z?BAe7q*cq!es`hTFTr~A-V-Mq} z?1$XMVi~u###_(C-_ldp0b*#dZruuUTAPJV2!RMffEU~VFK36(M^ab*$D0NkD zG+pl(3OPKHKC|l+$num#dU1aC_=xqK3^{{116qxYo15}oW<}XI08#6Od4Nb5xzL>= zI;*dl{u>glT?TEP{{XMq5xo467u|dpu%?$FpVmiG=UuhgSABY(XO4XXP=lqW1Ml{# zb<6SJTOl5L+LXq1>!=W}Q1{ZYjWs2P)>u5P#>P34m?d0vf^h` zIlS@$MffTXC9Do+vNm(XZTiaN zks;=mpO`#74w(<8uX*3T7B;BH@hz~1anypSmIC0Pq15%M3-r1UJ^d4Dm9`q`t~Ol| zb@4Kh{+%RLwZ+XXPTV?zl$)NDU;oi#am&&Bb|=yiQn#q@!+h(`mV~!`Am!*6QuvIg z7x)Xo6Z;ef1ukTnCqrU9VeKcIp%CL4QUZcnodAZFiF8RG&;d7)@BnN=#q>V)xYhM$De|f0uvEP{_fXX!SuFC9D zWsH~kfH0o!em!F^Ie~FN&%x|DvY$)rF{+I+>Sdp%CpLd}TDIx0zd`Z#H_U*NjgC$F7CsNi@80u~aJ$cIQV+qZ|W6z&waz{Rb)wU>D$ z1NP4t_Y=}ps?46kyVZgG*4ik2TS~1_vVO|TV2uL$F0^l!QqYQx!D~CVXNT8^HW;IH zvz?ujCp+f@5|RbF)!tFnhU^5Ty+HMwu-bL2WOYTJN2DivkHYJ*_E=g2AWqv!qF#Nz4Q9MKQbxf& z$$RY`XHq3KvsAZMx5-pf$LrS0R`oX9uZIE=qzYq<)!0Q+i_eR3AnCXNS|KGNX14UMskQ-@Lkb3Bi6=R5ze>DKv})<_TGtu2w2Z+E3((UnLn!R zJ;rMy>#^Ru?avUl5+Fq|R#P`Rd9hy6r>!~RqI&aCq@jqv*DNcjH#>qt`pkZn)UT4- zf

    XNM84NA?KShq{f;+4B$#gw_S^y0f5NYc%ztt?9O}apgb3(q-#y??VXGJnv%XM=mgvyyy4E31dQv_gMeHRPFtC(w??p17wq$vF4*0z-HPOC| z%q!i@Cv%yFt>dYfy+i3Kv*=Avjn31}4cI!`{kpRazHIq^K;i7$qJpLa7gHvd*1d77 zE0GSIkLe5|rMLI{%-1Hxt%42uEnDU%tkHRK^D_qt*!=9M;j3jI59`clJ)F4HCauSv zEy<^7Pi=d_8~d>fJ)Xwt_n!)HGkkWWT0wh^jFKhH+z5xx(L`Ckbjd>{pDGKS#_?} zos&mB17C4rjf!d>9DVokW_zi9))#ABI#}b?9jyJV*6&^h@ow=daG#nqz>)~1~; zko+Xx*R2%p_Kxl0d18kWLL_P}{O~&dPgd)xyTjO?bQba~8CumQJrzUC>8%x7^-+$y zjInFrO#|Fz6Fe?+y9h47zlb4(Ha84I?5@hb6t`j?OCQa?n;SvUfZwn4P%J9Cx(EV6 zdkhs4b^AfQi|w~*=84kSlj_!~EG0&{DnWpa&^v**SU| zLr4uVOjt7j);c}^`j;$A zXK5BhKT5%5sXdMnxSKh1Hth){av%U8IVda=;|w-IyL7rD0>?osu-gb(7>{|&>dqG1 zyT=X!MNePe(^MmUC4KhY$VVbR)v`o8>_Z~3TdbhP3R*<@g>IuZsgS^d&^}r4w%QpXrxzPDoi}u}j8Ck+YI7a7V z&i2MjY3{UT{)n|X0sUUASJ-+U*S%=TpSIyez0!{0sP_2=#rEnd+vMX5Wolotg1`Z6B1G zT%9|SS{RHdsXcCesOZpV3F|dMmW6^W*9tR~)k#j)g^v^^tPL2(XGz~bf&=C-XcDj4 zvt@I=hTgtf;bsD54Y^;8#M|x5K>nP#eYKdftWGR)ZPIvHI4vX*bu?iuLYz^;x3V9i z&>)J{!r!b7I<_V|EHHG@-<`)CNQKK1DLr_l>;~asVlwQd`2n4y%zhg)QEseD zc?FF#uL3kFGoW)M(u*+qo+RV%omCdrTE0U8S+Pr4P+76l&Hkgt$$A~;IoQ}iAKK;9 z=jD0K*C*+>?3o|;j_!gTUKfBvkK$!6FCZp`9;8t3jOu%nCrc~irIi4J0>XZdTMMU- zdyCt8Bh`(@@%Dws#@dNN$b80O!=5f9xs{Pv-L;kwikyLNr+qmXi11^*2=ph#QFf%{ zM?%6j1FNa1G1sGVY_A8Fex*|&?+N99sXo+|6y+q=DvX1#rKNDDxn+4|Zqe2h=-E@0 zu`2;ZgOSZGuZ&vlPQcs@+_r!qK5Y#d+M0H4&9*5b?TKomWY1XDzFKP+3KMvg9BY4r zS>%A_d@|K!seSI=A9q6u+nTvo|%0fvAaH2GtMZBiCz>9VVpro$;a@QUmv5b z1L%6=p`XVTCp;_d*@`dL%loo=NmY*)#wB-V#l|*H+F>WhQ$=wtDyq*^@NU2+HB_g_ zvGZV#MVHw>WgfXHP2pAW=^B7&kH3VEyZpj;?=CRw{HSf%<**#*+1V>)om$$K@3F2d z>)YU`c(SNsso&b1!PxDwLZHg+_`j?VDsCz5-QYE*3EO2fgCbp=lexbg+)kCK){{mVx6&MfmABcw25g4J($ zt-H#R*={>0&vPlgtDXyte5bRbFC9Ift#r(cC^kgsg^&s{B%-P3_#xB)Bv(F1R%!?V z2-t67CCV*W1FtMtcD#Ka<|DStHoK6KxyAr7*SofWYH1!DrK__H+N+^2K`T-gvHF$7 z_K1l28M z(XcyWS2h3^*kq0YBw}^TfDe8SDmzCGLS+H3GWs*oK8wsld4|tCl%M>UU5a&SHFh=gNZQ|> zM^efcgl5_^=L)vmIoxgl)!6fRb0@wdrUM2xTSpeSM9ktfWGaR-LRe^(eVTlSI`0^# zTO;btX?IRfYOcg*-=(n67=~2q&+gPMFV@rL`2*~ya;Ty=xc9%v8Zomb)3s*3Anfo(z?eYjhl*Y< z=IUD*V*(@PI#yhyZTrIa;dH5CqBV}TPoue<@_Hh#76=1p#n35L6V#y87}ZrGb*ekU ze3WF2QUS$@(ZSh^;zYCeAp3&x|1;ao>0PlZYzJEev?GO14;Ml{5t2E|eh4LcKslMp z`+&(PUeSexz*9dXRe;LbmXB4-@afLhWQGQkrS&oDE|j_=tYkO9cRG*B&Ovi0xU7t8 zqwNbRmD{SF40l9l_LAO6nQ2^TFFaiqeVf&9UoQy5*7!r15p>y>i!(l&$zqh6Jyk|t zWdGxU$P0B-J!V~*$KBORWmGyn`}*_rg33cS$7uWSbe#iBBFW=~-pVPlwiW0@!0 zWA~!ZDC%)OwAG~^cYTO~oQ<-84XLO{ZZ9hDa%=51;z;m)^BKp%D!4COt=IW}&Ii)M zRr2t*H&sjcQu2+pBS3`u8oeypUA50_6-(^MJBHUh(9etZlMaR+w#Nb{R%Nm|y$7{B zA6@;-DcDF(porZO9I%!QpUCH}SU23Fn{q|-r6}CNV?Quh^cAYw^R5L!>^id9gGFnp z=&?_th!gnndO)7?6`aK$4KWkm7t@-3!PjzS{ZjT*ER%NmRka)Pj;-;Z>}g0V_YQp zYou(qZ|Co7cY$>PU&#WC9BB8+IAQCVJJ@it7O)4rN-G%_K);dUJAsd%;=}SKj$;V) zH(z8cgq?*VpU<~%Y?Yac-I+e;c#MdSpQW1mG!R8@C5vbnOseuW6$VyJqwP=2-am-1DT+UXlc z;_w1bTc^*%8^l#A{L692iQ?zmn|oj41dcu_#;7Hfb64O&03trES4al}lb)89-NJ`C z{Za}ck+|g=D2KiI3A`rK6@&)=yVPmgC}W4;s+gi{{qfW-W%1O~pu`sq)kVX#)}8)Z z>l`am5V!8EuC3^+wO&i$oQXKWo>?oC)tf8Gu4TJ${_piLyT9IJYd-y_X zD>@$u8lkE^HDm9|3Zk-Zm@IS&DQ#%(}I+ zIO~mC8G#!v<^cE{+1VEI(ihy)_OZ5&aQ!>H~dqFsqX9wlJk>ynC~1l-#%>a%-7bvUzlA& zL&=+HBr?Lu)|r{P#^q*aq%n;yPnW*Ong@qzE#twFzD`dYd+#gsGBR6(H6mFNv%0i( zy(6;~@-5-{+MaBIWTE*0 zY4$)3=o)DSf)I{pZEc}!2Ce0XkVuLR8(NrffazMxGB;x1lm zbPB}UoYvzph;u9G=?#~e$$5R@GEXCGn@G<(V)mCVD@|WsYOg3)Lv0qq0NYzD6|K=9 zAyp59?Io;RdWmjb|0 zxNzx-Wm3dC;gEf{T1r%AYCnf}l0~1jpqdjffE9t2-uZ=J;}|WG$YH zf!Hr}lzC#cN&l(5RP4S@2YSFO22y;GheUw2>@NV7MBTFXng<=^oad4Cac(YwgC)uh zbko-R1rUEfO@!zLEND7bN{A!NEFn>lIiinB)J%RSTDNd_NSYW??E6>(k-{&?1xrC4 z!_w+P5fxzUhyW6u$_Ko?7Dbr>VUvQH&!A@Z1l?-!%Xm{QZp#B-!nAUEP{$=8jG?Du zjZWaUe+mP(`klbFyh#VT6VQ2ObxN^r7n_G11f*?t4=RCfrDgJZ)pk3%pT$Z)R4&jV zoDn{>6w>?#)*Z1yBkQ>2bKO|DbtJ9l*$=Ug;A{VYgG-uV2!as)i)Tq1O21u2QAwyU zXAopOE|iG1H!dRWN61H%k6POX?B_cKTqh+&q)A{`4m$Ae&#UHYopm-JKxA{;*E10K z1;%UvauB{SsE#Zni(!d9o4AE@`h>t^%ZaAL{!o!o;k3oQyUhMG8$L=$-ZT40EgRN~ z{^RLrYL8N}6|*&N8WiSB+B)Gy7cv*j6e4z{-PMc<+$> zQwQ=#tNfggZ?AprkTTxEGWbtskb%c7%V-4_1&Q>WQWh-4kRmB~kZT9~d{o7dc#5V2 z-K=SCRa-5tK8ch_0Hvw+(Ld8%(?-b?^20wuFruU>nH5NvMJZPr?`#kHempMg&y`ty ztZ*~na4X9k!R~cpURU9MDy-89g#Vwk=ZlPhNHFr#zz%Wv?Jr1$Rf*G6ofI z;2~E@0}3)Zo-ddZjEfQAGodmQF*fJCKcUX0n!N(NbCp$8yz6xBv4d_4#O-L&eq?LY z*}tre{+@tB;}8X}oWR(>D_ADaG^bySjO#IwQ+C>qvcN3jHX%8G@ARVYc(Q+xk74eI zAl~QnIRxm>*=h9j*Vv(%^?9=EiDeXDg>9V-XRq3)r|&L}q-PI9Y3+!nt}9NYt}Cej z_>X#e`uJW-R~%VYFlnV%1T5#7be zjpfE95ZwC6a+kO@3bC+!XMe&&5w|748oPoOFA%Z>q5AFL(2+%|7asynU9nL^C6=tr z!^r2fhdLTQT@@|AYBPbJL2;g4l|4;+{OY`@_IO(~v|-tpNX4#*)plt*Q6K@Ud4CVu z50=vf!3C=do7FPhh(kdPKFk5S;90vUn8RIfVoO7R3dGkFr!yAW}u8J1DksZlrzERpZJQ!IO^}n&QNr06t+^n7+ z@x~(S;4n{iWiJ-oylf(H_*Enw4x0VrmicKWJtLSc#yB@_*+^OedB4yGA~=A4wgHD> zTCETC_tTeL`YQ_v{Vjw3vI*{j4!?nyjLEr29qdPo7&go*7u|9c!eJb*o2_jiuSb0N z53~vz-?~-^nSCt^F(!mxNt!fLsfQ+RgRU4e1kES(I3qCZq|Jn!D zw0!?11Ss`gRoC*}ufAB%9*43t<@RuJ0) zGH#@kPc8(g=Aom>lRJH5c;^c#qU`^4zjz|v?Q!n`Vni#= zgT97LlVcx2u5b2|)#OMFrPd4xQ51GMfeRSE?7z23kbN1nNG!@FZc>StogjjTP!_x9 zB+&bwg4FfJ(HiKv_MPvk64CNgsuz@>Vw_n$KhKz|JzlLnuIGggE(=ubq|FN^GN8ty zg1Gm&c*XYQrwlB=x-9vup1$P7wMS{7(eICYH>y1AvVx|}ZxPrHr)Q6ma4 z@r`dSfP`d^Z#_;P#jOR%+*x1iD85pc6h~9_{;W53yD=4+GjZCdAb$Jn1y9ki=kj#)^il#(BGqNaIn`gwGtST+ zAEiAW$qVgTHV%?-?!?F{Z^Zjt#GfarwchQaU3UQc_WWv`FPI1YwceNG6$g?}0Jo+O zWNI=}l)euN(2G7OF-AB$ljEOor}l(9wI|%EJt0#|RJ;JV+1#bG(<@H@WSvY4mz7qZ zB4(yNKVI=%vPV#(0cRrwl)Y0eQqLX zDsu9C)+dDiB@PllDofO|MGJ!|QuzB)IFUa22On_k#~DuWrJEEFZI}Hovq-5S^f=z$ z@5uhi*IGW~(d)BdEqShiWxdcCfbeOVSjT1-qXiLIddZKx- zkHL`@@C`Tyhc@s%Ft&m3fx)@oLq}H+u+`{LFxBX!2sRlR9(2_mUM|fY9|5rL_@a3$ zWq|lz6}?988u0f}g1|g-Fy^-zcVcar0AAu`HEz=_a{#P2n$@1<0^PD)z-}?dm^FkL z+urA8b6L`Y{bM8#-re~OmU!*CV*e^==N#e3o=JgQluwU`-hzuJ+H} z@;XURH_B>N5Et#H&5>e!-r;^qGxj&#cUc_xakVfcSn+sst$;yBp1PVO%aQ{2bSa#^ zYyNr{4SYv>$g7#vV;rYjn(|D@Y<+e>%9-~9ZhRJ(iw_*no60%#tmJeCMfO||&gY~| zIRRp1b;Ud6NWD8K-7`cHA*NR_P=v+!r~<_YHd2Q%w&u2J^;JPiI6z-8`L5LMP>IbCbbi z=H{k8c~D{MyQ+c^T~})AV3f#Zrlddt+{C}op*xA+s_fJgZDiwjOA>ABi!v}hWvV1g z&ENhTGXH9~Mgw)-MU?duolW_b)wrF&uHQnZONwYg3+~u(oD`lrMv{5|8=(#mXKfWQ)QJ!CZ{#! z*7-l&1(FW^X}#1w2fP(AQ6Yn(K|~NM`P3D1Wpi8cYQZ<3J%{%3xascK4EJlk`*oiC zwb=bS#r;w-Pd>ZM{aWtk6{#<)Q2|t%J-ADnwH}s)wC`u@c_`WUHPW9}d~K&a5umb4 zmaLL%uVF+d2)`Ulohxlp2ZZKf_9IkW4ac^Tf!#HEWt6Huu!=^7=$t7820b+W4tBUP zo>od^?}qw~k>!mbC8}$iT`a6Cu%5Ks8n@C5`j5R0QAF`D z6^5hmt5gO3%yW-J&rxwdg!yRAe^5}Z-EWUo1HW#+dDm!9@>FfjJanU{i3J@evF#gz zjdw$v;9a#nIZ2=3?(7n6O>L=Cgo*cFda}|M?O&pjfIh=G@>`mnE+yDKLR_`S3;fwL ztl6W{8iNrvPYG{BZ;YWIM^PDXXEP!BP|@J@R_xz9m3N3yiPjgY)C0BjrdMRoh zRBK|N#hR=(r{`lBCXPv@&`#g`{Vqw5t~~h-UU7J|JSWI)m7GUUPT(snupAAb=}I83 zHM4IdccjWKQ@Q;L4-;0ejAE*UWhh0{`~a~AiB=CCZCGO8NL-*^Q<%)pzAXtiz{#CJ z_phX}ZaXTOsY2&jT7DAaHv7}f;rqAh`!9SaLLVo6iI8nPnXo>VY2$-X&&t6*F}cc~ z$UexD%>Ffvr%TS@VXtA+lcc*zHInpOl2*rB-ZV59I;HSmK9i?(`u>F;o5wuej6SGJ z1iIA$ec1cgmxra#gZ9HKLbc}ifkFB*ul?Zl zLTW)7QP3nIMFI$3Vov`hO^~sGj3(zWBi5RQoO0^_ci0gkPmV@0Wx(?vlMZ*tA<2Ke zOcz8yYAvHFh{546Qc#^0txui*C^(2u$_c#i5UE(_-l3nAGStB|1`_BpC(GQydGT*@Rj1%?-R`Oh++QUr5mY#$}KLpeadINX#p z`^7|KXreo<8zm`sy#2NR6fpJ+<-<1x^Sj)_(uae6)riPSe|=4rG0NGX&ZTtZH+}XA z@NIZY%u?a-%72tsvBdV%UlmX&&x|-~tetX8fq>5mYzN}H^*x0OqUuLGU4xwv1CMk6#_RfR>YfvD(}syCLN}&(DhaJQAq1BULg|zCyc}#t5I~K<}k} zPJQPL$5RwdHF$YD+f%f8#yRpeE4s2_CY$L~jC_>k5dWopZZpVR4V$czjbz|CHp*|( znh9hE#!nB4Q;9S0^G?_nyIF-GXwRlRJ@BF=kO)x-!O{15f^3YHQ8kfXq3uVy83i zY>Jy3{h>oEnq$`6aSP+e^dHbDF5-|Qhd-x;z|XG~{pU>u$xm z;Y`?Kwtosq*P;a9{O$n(y{)!Qtw2#%a?abTS0jY=Ur(J8;`~jrP?`*9i_Cs+(kJiO z{t}_moFh1p8|DTO*olUUvn8sy-dPZmfg@DRk2o9krb8f*NBf>mnpM(4#J}5_>90YzPMMyObkxFb;RXjy5!YT3klf^cMJ16@t!(5pz4z(=+w~_NYs(lT(S5 zEVqcnIfGuT>DN#+n*N0ix<^B=MyzZ^n{^-(I*>#P8}zjh0}K?7DKu^z@c-1mT<$^u zY(_eVF{#5qJM7cm8XUsuHNH0>=66gMCMocarhnxQVB$6*^41{+aX1n>oTT#qI*7qI z(l5e5b}r(a8iP8Byu+Tx=FY+3Y>DAy6xX?e zN0E~Shxo*Vz{pZaU=B>lO7xzWV zWM3Fxv1%&r#9e>SnfBB%(&Lq-5}@5>pMC@3@tsM{npxJ|cBf|UKf;|`*+O%6S&(xa z=*guLGhwNVFsk(wy45jBctGC}9zxI$mN<+tne!kG_Se~l?0KIAXa^-`KFlCE1F+40 zG{7{v>>tr@U-yKzV@8}~Fjp7sDBhx=PXrlv|k+1G5T#itqr5ouo zQTGPGoy3(1mzvY|dyK`GTBG;(&LAA+dV0NKvkHCnIarS`wTkzvC8~;;NAi-#* zkx-{G#n}vNF3(ON7A-l3B6#iWac*Wri%JyDRBS{~s5VBwPO~d%*6GMB;jg<$A%HEd zYSE+aT7eMUG$hgg3uVEOTP6Bm70whIo|rUJLf#n+Uze zbp>z+ZB{!??&^%$Gk_L{hxhaUu2if$;yf=BbgxmxNuraS+V16k-HPp6S(YW_Y2GdZ zlSaTZg-#X_us*Wpy6zb(7o6f~zvxKMJSx#qb6m!~bdYhgffTI%2fhh&&&1_?*-IQA z;Ygs?e1H+jd4PaWsd1Q|wU)gk5t{jyj8%$kQ7?pEw(%0j_g8B#V(JM3PZ6!eZf}(- zK{DaS&_V|!T!^bVME$i_vM?NzOWtaqB>=0QthIrv#zd~!9G&CFiguG#_IBQ)sbKar;@ziiE>xu^+K-d! zo~z7`upd<)(0Pyj6{*(+rhGo+DR&yFQb>WsIjPyGp{R%_`&WzsQXz3puAUr|`4bVl zg)>0?kzP+h!rEV4k&M_I&P)=b?mY)RVJZQ~jDw8bb_&#TiI>t?hSEsI5#n`-wB6Qc)`tX} z-UCnCC42A!<}0UW7pw4fbVX&ile5G@>&2+mB_hFhf53vfuo%KZmE8cv48Oy1s1A8V zFp54aXYDpLy#Fyk__u#U;-kz11n!M4m*72rE!RcjelJT@?5fpfJbQD(I^kq&uAbV^ zvrEU+N19&u^wg&R6BE4?+3c0nWDi#!l*_Fhe&A6`SA(%QiwRU-66Cn3OAsuaSufe& z90@AUF4OCJdfV@V;;r8+>pq+=6w5}v5}l{FJ#3WN|E2OKlb3zH%IR$<_&jx&zqh?q zYfh0UOJu%wR8M(Rv&-QB>1WDdy3mguYwP$o*T~jDv2<4H2$Bvju&octf_3z4Y6cm}kTvG{#o# zv7W)wlW%XTV^)w7t@#7NUxXJTk1AK@WygqR8)n9lP>Ncc>?+lD=!n*`iIUpmVr^p$ zK)_o?O?Pp_^?SHWKV-eJW0?K^hAXwl_r%xc<^FMCd^gGAh7>h0m zDz+<&4PSAXM`=?y%t?|dWebL|pYP=|h5cx-9}a{qs6YCD;6JWRG8n&?(^V=tGVyO5 z2;a#UIS^(V;XpX@Tn_Y%dVvFN;zc;n9Q$>g%Q+78?AHf4(DI=iXvrW4`YI3?ezC;< z6SWivlAs>@mwctlGL7>7BXL%zOTJ56$Cwc99b-br+LJ3+I6iml4M&G^p*e2b$@A<> zcoQykI$Y>93Z5;+Cfa9{JjjM7s}IG79>a5-V?%RfkIk1owh)SU?B1$la!Zch9TavQ zuwSNX4uihIYvy>iGD^-Prq(RP=8>@0BF5uK@)0z|%> zieQ{2T4JX?1&SH9W)VPsbt&3Ne<3ceS^fcgyCNYNS3I1nzb|=%RQL#+k)Y5t`FKlx z9K~tPM>iil_4N5Sp<(KE-Fo{WpS^+9sMQU(oK$8@Iyjr0KyQ8{z^J%W!h^D@Zky1e?I{_j=3MUA9#>(UDJ?r%bSHCv zso7RKd{&wHb-x^ibwxoX>bv4J^5op|Qi;c%r>+_pdfD)Ny{?@jww5^GL3|^0pdrR;9Rnc?&k6^F9m9kBTWIx|A)~=vsIw(*b2zF#{AUkTkBd0$u;`I?? zgT5lI!;g1ISKWF}HTG)C#q!^a>^c(B*6)a}ylo-jWTT;(Bdm_TU614$kC<;9O;{gg z7v{bn*qx1px+B_*ZkSUUr&AN|g-a7`YmdxKdH)|)uPl`(v)>0=)#_Dy#Ajf?fyBqO zmi$EObmPyT!_Q+`+UfBzQZ%Ja^ygr z2$w=cyf4MmSLMah3;Uugqm{#B&F>jE4HTe(8X7RJAeypvWzj$~b#!L~Rr;k$O{5XM z^{jzR>Rc#wCQ@hIu{v&rgH)9|7Y-~-B3=73;jgF;=Lk*5VtW^Z6wF@bwER-;E;YOoG1u)wo8!+~l%!JR z1Omkw;S(XNMzh@AS+hYW{ImHPPo_GnDomtJ$CwQU{&nR zgmv4TNX09=ZNj)~t<9o#RP9l>g37IsVC2{C6MC>;R5tDf=OQm;i5MBTQ^xCgq4Q>el>HVAZ zu6i1iEgnd_O48_8fC64G)b0~OIy-rwC!r66cwNky1wiV8&_!()P|%<@^r_*GqYJG2 zGs}DEC}y^oiR}6s=Z+eM;rfyj?0wq@IFa3>UZK>UOymd^`fp1XSg&UP34VM^R^|*6 zv1g69JNbggJbbL`nY;>*G&jy4bRJ)St(-+djzcWK>?MqH=&{gX#DcxOtJfVg9pQ}) zG*PvW12yr%W;5#AbRv^|2>>Ez9AGHv0H*{cyVj(ig%l&abr4Pt{E z#o-V$M^$08U(rU$jBTc*a{+(t&x$iP($zn~RH zHBD5W<8%%$a8VRo=>_}A3TDjdExER7^+%#d^ctJ=(4nQ=e?}emI)?S?EY-gWJUJP1 zMR}>ZS1E{P+O7t+;KyrMsja1=Q|*`kLc6Y7tHyV{z12-os_immdvJW`?p7+TQibcV z$o~CRVUYcJ|8%=pzWsj$3mZR`y$KkF!EZ3u8 z3Fw^ZmxrF34bF{dnq8JZDtBZ_S;EmlE5%M*4PeDii}HyD^;~rgQs0a+Rn>aQ;E>Q( z+lvF9bBzwNjagTY;;W7{%GpL06WOxooi3xQ+cTTk<%rz153nu@?(@xY#qC{PzF!L zRD^M3N}{fff(KT~je%Veb3ZnagTC5Z+UD1Ko41G%mX+JhD6)kjECDxmohG$Ul-lFe zybMVGzW8CwNi{3r_C z!tzItaBFL7-d|(QNGKg5wOiMzo>Co(7r2Swii?20*i@|Y=q}E)`r`bPKYep;MCFaHmnEkV~=7}on zO2aVw=WER`sIO}{>d}9r*35ZRO4n)4f1+BZ0vR}NA(U<=BDzhKLT-ph7C%LMnvU1K zHDc*;Kj+Z*Tq=1gHtg=t^oo<1iOtO%;EmgY?%d{L!4E5G?s?K8eVZzo9{WaH_uh!O zbz&sMB~QxYjy@i;r8@Zm-O?c%h$>ng|BPNR5M1>mP=Zsk&S5X2ulY3)fPuf zod|r%jskg4W`P3s&D!_8R5JU&e$O7W{~NBjZ}xvnQ)kM}{@dMi17`mcqt5JKsx=ov zw$1*eYY#E|muoE@G}L;kjA@S3g_%~aGQ~y<;pLLVZTjwm*&u)r0Gzf}!82RrbVa%G zv=Dn5r9P_I#*WuBchSz%Vw4r&YOSD)2P|C_QP<0$jorDR;0jJF&Z&%~ulQ(XwET+f zF`}BtuGQHB;fKxmk@`GQ7H-_WV~MkEz&SWq%dotF!vDeyJ+u*m`)^E`f3?;A!g*>vcp% z##)^~<_@Yu+xf8pA@-Fx2QYVS=5;EsQ4TZl8l*(4!x_{gP46_)o^fJT8&{4;Iml?0 z6w<5{__b;&7&j&V)h@|z8k*l2Iy324YXLxnwm)$O@)y8@iVA$9T;0Dw zYq^H0sr5TYR?EM%P*CnnmZ^7Bo>3|v6>8xCNFqCm)OTKjjD*25v{uX?`YNh=YRq04q zz?f@%o!Ego!aup$kZZwz(k2U&u6@KkIppk=`@rqqMY-LOJlmT02*v;$Tl9@@iIcKK z#c?KC)dLDa`){-lM1bR;vQr~gUzCZ4<+7pNXx)KY?$6}drdwLT*wVZFBpI+V;aJP= zY>Q;bE}&^fA&W-Pk$wHIRae5Lm{C-!EoK`obh#A#Gi6d>RZv)1%dCTFK-KdU|E^t~ z3nRx7VWmZIkU+iv{FMOpq4FU6ngj46U>wsZuIm6l;zl)p7aOPX_f|299A1|Em7v6k z>;sX;>RXdVutxbV&aQ+qlxFYaZ%|#45n1JurDLQ+qaCp2`DJeRXAEY}Xpe7K?8yG- z<%mYT>@i$7+`y|s9V4r@+fQA@Oi5WBT{RiAl9HJezn5+P`Jz9fXl@NMKSly$?x!aa z7!w6N&(3VoMKyImFdOhy&W+%(Y4gosNf!JqkP$*H(x zm^<)3W;NDyK2Z^>l_;(7nK{j^7&Ib`Vv2DNe=Cg1{5=!TW#i#WtwpX;qy>NGD2k&r zmHE_t$;-&aEduqz%Tgf+ zD=5{;2Qt4TKH-aY?z+A1T_M}-|HkMj?kg^6e1{r2w;r0-S0P|TfXR)9MAkjq0Eqjg z98r9i{0GF708Jsbp!x^Y%i==ZCShjClXw|&*Kz8(8`c{a`Ta-S*c3F4fdg7O9ZuPb z2d-!qWdRL1YQ3J*fXnP9G;anywmvw#3=UO(ENl7F(Dd1Kw)7U=dNpBv5N|(%+I#*S zlCXg5Sin(T-$&^!Q%Y|Pwe$>TD+=xVy-~b|N}pvLld+FQL7yFCzy9O^5bQo)>DX0h zAEYL#;{^LPH`QKytl%Y*2#!Zun59=7 z;)w4gOi7>nwFUWQqA&bZfml%pospjgb z6LYU(1LVq|aet%j{o5#2$H{zSIZhmPou&Ov z9F-E65f*Xd#)QQkW;>)bqzUN5yqv%qs*!o2EPfb6#hUBod-;hhB;Ig2YLfiEdu&7( z_|9QE1nVi-15Be>?nR=e-SHr}zA5{H%)>%EMRQ1fAqJCOINUvN8TJEs;v|qg<-2UN;BT8jIR3<&Xcakn zigBeh@Bj_S^;zj9dB$0K-TMj_I`LiCO663c)Kbnu>v>_SEq_w6NLNVoGLdO|`h=O% zR`MS-Je-E5$+v#aj!2#S8M-$YeRle$zwDm#a3K>OqRhjWWxGl|%CQ)I_eX$st&so` ztK|MoY{VbCEw1D})60N!>;Hv)%>u1wfw(h8LXX;vM19R9j7)+)HD$@ZftU9yI!V&& zY?%NNO;xhai z=7(7X9IZuA@R$xa?1r0LTX|0wg$^bs_J$V{#&17LaTOMbcxyi-bweG-iL|p?-i7Wj zy+v(#d>B{o28GP$PKllN#(6;3dR1JIm;#lL{QFJvaGCABwN4aFZpQYULj2*^mg_wj-DF_Dn* zIAw9jPq2@WAp>}Ruz-D&B)K$RHWqd=q3>>-k_2{Q+c75d;ukwvywtw_XUb64hXWGK z!wQ|6S&Cgws&aN%=$&rmHC3z27c0!=Wd+HTt#EL9kZX&K!1R;kF>?B3c@$3fgnv#j zqkZudjwI2TYyNcG;JhT1)(KQ$sm*2Oc>PeG6D0VKlRtmiC^9KAj@=+A-ZLdgt$rBL zV%n>z;S5IlzBc*dZbdoRaA4q@Th9x~=f@@Fwp*?FtJF+b5kD%M)*R!5C=_3^B$0~y zxkBc!3I`%7FR9L6$PozL`r{+ga_axd!@RS=ueJ2@whrq9ndZatFgFm?l*sSbn?7sf zd&N6VHTX2!tSA1;S5oUV3ohos#nX;QsHujK%fYl&l6HDi%|G*xrO}QjJEp1TAEd!E zWe{3)LrRU-`mu~zY4ThjnNl;sf(D?t%!m{{rQniz4xDr;6r}g_+x$z`v(lX2^djvh zefFj6g@jD>KEe89w%(VVAcXoKWKJ6-(|_wO!sej6HZe~PP<=JxXL$?)Ut zOy^5@+Q8lP34ps0n=7IH5%Xrj;@8=^kxn@%sbs9eL<)!7Mt{|NjiJfOQ3$#3g&&`+ z-QR{{ZP}O%oEYV}eQuR^WufkLYL8b*&NKFngjoW<^Y60;Ylur?#O;(f_c` zg$tO23>j%FE9hZd&i(lQX+dMwwBg1~gw6}J^<8!|US_E=n(9OOdA%tNdsje4%n|LRs_0;s2o{|~xn_+^EUK9p(GqExe zpyjAj<4Vl3pE^RTbz)~)%Sh$lBt7)u(gk`Qc07KG%UOB__Tmrq(C!ArtgZGrc+PSx zzdDgF=sDJ|V&^$q!q;h4elj-9P$n^y2ut3^&&F!JXT5`r1&LURB8h<)o8{YC%<(YN!TEHobLFHhmT|4D#m)Ij~fRn>KEJqU4v~kWNTt zmJFnspYY{UIVj6uKo$$W7^Wt_%BEhA(T0R zo;vKRR(HH=pA$$7dEdpml&&7gTtkBBYSjsZMA2mUN6M6Ly|pUWT_W^qLW{Ca6VIi$ zc;BZqx1H&4D|CkrlW$lyP8m9_50>3+j2Cxq+tX+(imwKdhKyV8r-xp$>s zQ3eGdwm4B2nWpruJqd3+np1c**53KUxDd}%#)Y`ZfL9cALrOytOy0YJ8&Ddw2zU9J z?Nei+Z4IwW58P@q*u9cP_!UOXT7O?6i@(MGCX)k^Cf8OFHoZ$yR+1tNMzg}@{3vPP zE^~jL5(x+78PTc4cS8s=QsK~FZQ_^e`O#}8UFAgn*%;y1o2-{QV|E!S(e&5zQg?TU zSKd9JUk>YuHSaL|sk{3lYf7_)(bUcT(N)lh+HU)z`GTNY%W0V2l_|WXCt2FJ*%K~= zl+?t!4R5UIi1mzncDR*>+ago8Z~-6m*tnLkuL%EF+i#+Pq^ivkj=hez0k`rcyo-$f zPSG0!#f7;2u2T0Plu;oi-D!%vqUx_mFPo-*Mq_VOO9b|F{qwnd&&vU;Y}IMd|M z6!|kw{%GdGaI!fT>fyx0{Tr~$TD!TK&w4&vi0vYq&u`jnUQ3&v)Vz&T+8Hve%(x`N z&%)G97mt{6`gD(1Ow7|g1w77}?(y-MI^8pj$4J!viJ5YiCdNd&?WyWK?dcV}%TEI|9 zmsx4+-Y#A`EHWZj4)#a63E3j*lp2M+pFlx-(QNwgih1cIyYY_$FusbnPEQ&A+p~G) z=h#GF#LOCwTCt7XxG|?wCQEn^3i*oiN^plOGiq(_dKR*VMz&}n>ye7>R{`2B7G>A+ ze;dC|HKje&o}8(i?&0PhqlPvH8f6l_lfJY;nUE9EhBTTa>_~p&cpn^^Eioi!9Gzpc z*u9QAfic%J#xA?_4_N5#LmSL~zY}d@{Pi7Mi7WAUTk z^;czVa<9CSF#3F5wICTEEll**?T=bGoWIfTm9hopel~w5=Tl|ZnOmQFS9t<(Th8{- z0cN@=%ut%r(Bi?-v??R(jxcd<7YC^0ULpF*HHlHFM=g|d$s3w(?iHf198TeO9XwLB z{HpC={NXtjNI{QLZG+Q+@%_swrmig8k&zyO^$ zqmr|x+2)W;4ni)yEDIN{+W5ANqxSyA)ZBe-4@MuUz58bebZKE9D)q-vx>D{He>0A{ z)f>c780xHM(e?o`q}1MLq-w!#xy4(E%Z-cZ?K!DioXvwZ&#=&y$ya1kPR6Ip-fBUQ z>s1Yw=Zm{#UsuW@B;j#y?Ve@f`yRIMrq^c2mc;S^3CH{oI@A!1-x{QIC#5gjPUBNX=z+ds_S^I$afqO%@pY9k zm=R3&9`yJdbUW`-VL2IH4X06z=1XNN!jwuRIhlH{&3!a)aFc%jkhci(m|pNLfw}p5 zuv?oQohiaap9N{Yt$T015KygSD&06d_6a~$s2kp zGhJRd4mHT539WLln^sPJKD0e!bNx)$(um;h>|p8Q;6D0RfGulRcCavN-<`Eo!<>5U zEAOm{M7i!SNH1y8(DR|>LQY-g$*f;*MeL>0x$TdT@^I-Ttc}qAo4XI?t2|tK-Z}Mo z!`mM&J=td;E=4rdpkFMV^CAQ?FP3J?((j@67fT2KOo*;!qj4QCmP(jargVBiD-XdT zS08GMm%JH~oCulnC{}hbpa#lj1b;kUc_ago`ZnDU2G4|g#jO%@5Fwca@qNu%+2-en zX_ZK<%O#XN zi4y6D1kViSRLKc2y`W%ohP4ta5m|FdT{N4vB*+X%s;8?1DMQI;5TEU)`g1y7Zrywh z1?l{h>mxYGZgYODJms3UT*?V^24T)1%qh>f&NffTwci((^|;n^S0(Bqc1iy%-~=YS zijE_xtr#plI-4nR15kTsGj3#3z;rxCCu(M?2IO$y3tq!06+a7Q1@48JMdxsSbfYq*c8U|`-Dro7Ghve)<> zA`iq6u3%NvzKg4ZuSyT;3#sWKbQI|$XHJto(q#JxCwh>*~8t5J+!ETfUEL@TeOrSKeEC3Y@5v2U*R0P?lW93lvTV8%*=V$ zOcnO^Cv$nNkbz5U&t>iXCC>D|&W!L>EiJ`HPCg^gD^B{d|4h3Vwzqqxc?Q90B{gYq zX;0emHh{EyrnI}BnoDCNvZZz9odhmC^6r6ybN51#zfzBCHnVy_=%^ z3C1Z(>qU-|>yn$AqXUx-5{XO&f4RhEuT1jJa8ry7|C}PsW<`;;EGFVM3Z#WBihadMc<<6G@*%9Cr9!R$EBeotc-F83YUyhWaM%%mxqW*P`Oj0;@m0Oahbm5n`*IB43^Bz5@JIp_Pk)c$uG~nxhrNe zFAC(vB}!%~SaTD_Ek)cs;x?3GWr}-~xI5x*3dW@vTwBGpE%0FOaz}Dt7gm6~P6}ym za&Dwi53fIWO4sB@axwMb2I4W_a2x3c^3^p*bZR8sK)6MB z1=<@Z#xxMZ$M!6KV*6yrwFxC!$ygeQr*pZ-N&`W-UM3qakL4r<{-~R$#xzeyd+YXT z4TTn&_Mt7LS=yV)w9lqa?UQHo6Z*CZeIa;W9HgHXCykKnh+C7m?H0F2%B5RKnr|`< znP*C78YmXWq#tXar(_x<-^D#lCG|mXIh!2Jjdku@Dx<(TiO!t{NpWs5h=(I!+H0tD zjX~0!B^v4GTy7jPop}cFIkOE?;GA!enNGez3Y~0&%yTjflJ1N)NR@MvK^8k6jRb{e zPA`M65o_^_i4&H`3BUtgi=;1k?2c!A*W7`#gGMuW@QS!avEYX#q6@Ku68 zWbieDuQT{zD@DhVJ2tL!`+Xc@vc%$H%245%mScC5t ze5k>j1n*~XNAN_0w+bF*@HWBQmgu^Rn9KRp;IV=?89Y(&Hw>O4_;!PP1b^D#Lj_-N z@HD~iHF&z9Ix8 zLLK?#rVudC1oWDy9$dy7myyP0C@$&7rN41O3q-;QHzq~kK!xO}@vNN`RjF2@>| zzZw@GE{VqFkH%#lF2@;{&Bmn)mtMx@VdJtGmpJ3{OYNcuARK>KtLb!|ag>n=$5!JQ zFpe@L;rO9(EEGpecXLKSsGlH*xMb5j&@X$H%USgA9qZ&saHjM+3JOp1c_;Qdm9>gj zVnYpV%IP;^KO=ge`>G`8EQvUX3|n5{;@L~>6Qhp#29qHk7MD3t-|JlCuj|$IjOPRA zb0VFjX887PLRhQM}*Rth*3AxLbf7j+-^fHrS6so`?&j+5%eJXT7 z|E|u9e9c$aO2yC|G3NQ)m7D!&FYxtc;kP@qnU%22a#p-|4^K>c4G=%t||zKUEZS#8wZICg?@^U1vna1%??N8@L5Nw^NtE0NBCr zHvX*awGNIiIRL$xtM*WJ4KvXQ|7o;`FM|{=LY)BJlxavH50w6y9hVpw2TJeCj!OxQ zkO`%z^>{_*CE@we9pU(Wb=%?nxlCcv2}M)3n_xUTJGT4WFS52ZxwmuHq3t7u4j3lu zXalM10K;xn1df{_=j_gf=O%@D?t?=ZZC58odqJ12&WY_{xP@pbX$`@4mfbeB#0zP{ zT=Ua;ZIwi$5_0awNxfS}jaBlImtGka+SQ_*bI-z7r*)MQ##f)Piz!_wxu*!sS4U4{ zi`Dqb*}sH*v93-y*MRd3C;;d@f(hfqB{bx{2^`o7pA{4pXPp+PX*|6y%H0ab><#X! z`-IEvFHjy3{~Y;~FMnp%eG=)PTK7qme?;9UUHr#{Uh<#fcyAU-|1ku1UcHHfx7_O* z@&c0`POCi&Xckc-PR|>sKLA>mVt>%s?-6^2b1zDO&DO3tq9amhUodk^ z$V$Y?6%BZD>~%jy&F5T1oVPwd(s>NQb{TlC)Iu5&ChdxQT~`b z#Ee5*hUEpNnw;&!=Bv9;aNb~w4fM7KGv0Tv?20vewJv4z z4>AKs1UWB!3ihCfHDRu#-^kl07MgE}K3Z8nDa9Gbh9kR2NRvXzmm}MRLoa<)gNp>P zBNSbaMnzt8Ki-@Q(`U{^ZmZ=sBH0M*(G|Ua!7rTw^ocdF(DB3%B@ZFZykHadZrYwK zd9cNuvBiB2a!T;F+|>Pf^_8)-Wvu&}pW!B&F>^D-uQfO0g_`O5T|GV^KKJ-WUt}X{ z9jcQgOf+Q|kyk_DSS|aiKc8v9o7K7E*UT=T$j8p~Z3;zly0cAhk=>X@s;i?{JtCQ) zPivXBO&~f=_U#Vw=`ebV zt!&$aKEcxv&p#KZtJ^J<+|}kPhi!RwsYUPp%LiM_o~E{MS2M&EAkVE{NulNLC%13B zLDq3{HPy*nt1Ewc|EynYD!NzxQPSuA7q$pP$yy8_Se!VC=@LKj zxI*_;To#SjAsTcDB$&~k-z$mi7H5eu!}zai_kUCSZwULJX8e8a{?BUv+rs|6K~O|O z!jI!2?J|f0xlHg-a#c9o7hZg69|E#o zFyUhH3ATokAHyyT$GN35C8N_qZwf%XjEvK(U!stUA?aGo$rZV8NW~j^gCH?`IWx`a zNN!Cew`7v$m-k3+JN;ur$(KkjggHr`-_(NF0R-4>1N00fkFx<{IhSU_1QQ;>JCuC9 z^-1IyHexm|z3U+GSA!g)_Q{=`m`#@8Rk z1xe0|>pP}=iQwTW9|v}lc=t{=4|p%}OPT0(Da%=%)bdI$GeP&03I$Qj1@&2UI~#14 zK#3B_86l|-f{|M8XFm8lzH?^05Y>x~avh#x=s&LoJOn_4?u$&yC|M8jD`%1L69Jq*TBap?^zD57`jVl0QgeVH z`n%2XUr*h)5mzVFeH$4#CK&CxnF~z*{|dJ>)7nk$``mT&_4E= z!$tb`g%Bl9j&NN^FN&xlJ5F3xq7Cj8>389Er5(#`nc%*Rs? z=AVw^bAsLx?7U0!M`v2t<8|Y)f3PWvB|gZZ@C!_ zJU5!qDf51G? zC7{jkWv$I`c264MWoKxz*>-vM0C&wKXHTa`Ds$SVtewF(WP z-ntUJMDbu@3%A~1bbgVdcLc`f(tN3#b0e8)^U}i&zaxDup*K?v0eQw|p@#FYu zKf6;7hlniS3H7!CZju0O0H^D}X^KH{7V9S7JLV79j`3DwUXxwaXrT;?Dv|bwk{>)% zHUQX3aj!U6k{}+R=90l4q2AA#&H2#4E5|a~Z=(W2#GK%kP;w9ANhI0cL&tdP50NmA zyd*i(eLZ@s6+6Ota0QKTX436xdP$R;t%V7iI}S?N)Q$I6n6^mTY#vKGGhOcMnNBF~ z4rlWo-xY9;=i*us)x~Rdqp)F^|1-h*|#>-`( z&{mdw{9n~Y(B21EiLWt zrXSE=d#sIsjaGQSm zQ;sNzv3p=_CfyIotG9OU(bAi%Qt68T>BrNdF~>~h5!l;PQIxZ*4gI#^HZh(1m2_!m zF18uXbfObpn%i{m;#Yn3w<^8u)g`>rq%$+n-Va5S(#sT*=kq|_45vNdA-a&&i&d#d)K00uYlT;@k zkgm8nCxD`ta>KWTPF}8)Yk5&d7$0LW%T|hzqvv{|M9O%` z9ob6?7+kB$npRVm%e(oK?}Jf`z$8}EJ_TGdJF?FhSLf#)0SAfG zQSZneat}=FzDjh?Z;#%5r?e>wuT}yx#!bJQ8eJua_)!vX?top0ldTbFo#YOfx%De* ztWNc`-vN_bzo|I=et@(aE0IfK1LhuFaH|?C{3R<$m?zo!mhEg5SG@+Xm!h>|tD8xS zI`(unwtF}eKyBU3GPCpDu<7?TBUZ7LjBr1(sU=oE z(~A&*$l122u8}PftbesI*vzkfT+dLKMZ!p|HGfpk(6{u_AJH>3stA_dvrGL{#dXb&S-hn}IZ zN&?X{^ap$n(KGbK^|9+XbJU?{2u=0zC^l)}RQ?3_6Dztl;OpJwL}k+|%-Gsu-7Dm~ zf+C3Gp}|s=f4t(MnB2N;|5e39s!r&L zepH9C^hk<_1~8;|Ry?%rM->lkyhbN?M8!kxF}32M^Emy|N%7Fr^kf>J@617phbI1C zQ#`bueg!@Mk&1`TmgaV9kcDZ2@pb33h&~i9s{NM~4{7#k86m0aR5}z7O*D#!0PTv0 zz)?Ij@&6sgL+}5b@$#sOhd9@n@JcO%ra1xtE3<%}x?QLox7L>G}PR3w7C zS-z0yA`*905m|Rs5seV{5)|nPEO)OsP9Um?juD6|qV57wMbt$gs)*#CfoRPsJXjUc z$$U(Yq>5Co=}EiYQ$?>W;38D8)ql5miKc5h{>EZ1ZOZiE7?s5Lfftfj9B_nT zGn3A&e(V}db#5~4YZmmkUO(7 zS-db~+;i*~)hswj7tt1+j>)S$bRp%MCJwG<@JR0!OPBMmtNFxO2qSZDmKa7&PkqmaFWA+JV_oZcuGi1 zl94vaQDWJ9pD87;Fzj@iu>ixRd<$#Pk@q%vYcn@;*gJc3L@K>n(m`lCSiXH8l;*wa z-5|nO=QX6+tZEtMH^`0SW(jyYlDVtTl2h`7dE{X+dIjC02cCy2V%$%#ENwuwLrZrq zp;5FyIqx9r4sK`f$NvnH+|Uad#9q41{p41*+=|bWBP0h_pBGD;pFlcgt4FmY`-&&x z+;Bj@aIu&#Q%u?FG+$i|s)F=w@IO&J=b8RebGGm>Dybh_uF$8xxe%^(Xay67 z%%cLZ!;3E8=?Q78^i3h|+gd#jRcK;b%mLj(&vg6d7$RDu3tCRKvaajNW|O~rHp&o& z$i_z$Vz7a-k%#VJ*~*xwZ!n3(RSui;f;!VE#P_?L{!>J(ba7M8>BYSQ$IE&BF779& zNMv?;X`5EI+iDeF={=&B-?^V~^GRuPnxL>O<8B4|xT%>PTrD?HymjBYu1@o2e7Q7L z)PGO`Zi)Q7flZ~SWUymk4$hv*#&;!J+b&W1J1&%iDbLK5EVa(cIteBw+b_I;-7J zTAkJICq-xV&!Ju2KU8OR7N<5S)al4>J1MR1PrjnRpS%OfqP4o$#Lu*f&K9*F`^30?_iL#z@`qXk0$()ibyN zeyL(RN2VlNceU*D$Q}L)Ot$mxx$xqe`FcXiie`hHOc~}Z!@LuMIoX1Z4lBph;?2EZS9T zr54E4;PkML=`@|9MDA8|4Emnq>5T`uiqi>7Jh|1CFVyPr!(L#0dyv*qQ<{@qX+ zDMFv)-!!X}U|aKS8HDz2(K@FibGm)V>)AfEPV8~PADJN+2iQL)=9c1;hgWW5E4jg{8*ZlGwhF4Eepe=9Kq z*6Upfx7b)#enaB*-ru+QAgQUjP_>d|bme7c86Voop_D{Xcij-dx)pWTo6&zr>o)(E z>3vw2^`}Ocwb5e@^{Sqgs^!#|i(=a)OUvpSCiAha7(7e#S_^qEX}K({*m}>B$vSj) zw~u)r#As{Pba%S44Am5Muc(D2%+)h<>Mtb84@KY`t9`K+Yjn$+5}$J9kp(qbR@j98vjoq&L!PzkWTBWY|1i zDQO6k&?2GDv`F^KkKuoYaC&Li?DSOkibxsHLmWulmc1&q`5U@JAgL@nqd9Q4S9kK} zTWQ0LHt%!yKq&WlZIT-5-mgBfL;dvyY;`eai(tXMVjjU+lAtkJq$DjUr$lVemC1yx z1tN*EJr!}(4@M7mLn!$J+0BxE!qAx(%;%2pPOzakG2h`B$?L-B9?^ll-|E2T31p+- zx(kVhlGo`3rmtbx2sP>+plcA;g8k?D66ng#f%LePnVz9lVSmabmO0|f&U#Mr!b~zQ zMVqluM#bh&zGEcVyT#>qZ%Bm*!ke?2zcY>z{+{|;op!8W`~fA+Yw1eW^R%-xC-=*_ zo0yZjFFSP~$%M6F2e(r>^p80A?GuXSY-kro&FUnKdKXV3#rpg5H!6^<18o$hwXx?B zKpuqV3m3Y&2xW&TtCm5?3_N-4mzsfyxjFAyeD$@ip}xd@^$?L%ES7@@h59Ilvxh}@ zZsZTrpY|?$N*B9jxCY!Gm(OU+@$CiG*`tKgYOOj&iow|!0+G|31%WRpF$v=hOxJZQlb~?+H(B` zb#3$fSsN=z72O>v8)t&lwJmb5Od?gnA0lu0({UD*1D?RywRdMZW-i^06 zsO3t&W;yI((i>)VTz5*(ikKdf2z5Kqc1`z~sdr%+jE&N3(hV!Uu9aXkm>2b-XVtYG z?;pKU`V@ms?d>YdpcHm_i+<6Dyd1X%fjP*iLvz>VGjFlsK|6%rOIb(f@?#;JY z7|+c}_+=f!klF0nBbfLtIGfj^wUqs9(Oil|>KnveXU2pA8Fk}Mz5pdPfgx1j7!*%+ zvmcg$;{m5B7Lmrd!@!uBF80oBqo5k4J3 z#^604ftQFbIe#bz4^jT~-g3sIu*UJRAL}n{-O@4fDloSGyspk2*T`iCZ9kU9@|Z;X zmizB}@zm4qzONnsT_}4@ym|J$ayegdUhz9882>S0`y{d-Loiw7wV%6$^D{+Q;WM&5 zedk2i_Uo(Wnd3D#Uosw{9~+)K{hAdzUfa96-0r&iL59@+RsL+SV+$2%eI! zQvIau&b@Lsm7y|C7ECq1;y;mV1F^V3(pVRLCzyxxMvdIkH-y<#bL`ek5vHbX&FmUi zR~S#XXqc%}XnAwfU!!G;#9Jg*!Hv~y!}*qmtw>E>NCq!rV#Wk5n%w z^BlzBImqT@(?DxI%B#;w4j4%DY$G3zIRSYA@L>Vz2vD7sjKU;o6E;qW1CX zP<`&X#qv5HEArq6@_aqFGtels-C0cEldBP&r_@5wLiFB1=SC4a&yu0&ZNG>5^rPZK zwc3uY!9Su_#wzDIi`usIPTj3Fi`DxMxP6xGb796J9KACG4h=`Sbq_wTv zGfjNj6FZ+9ulqD@%xA&xxQ-Nj7gpmL=IIc?N{aq+A*V&Yqp9+O15qDqROLQ34hOk7 z)R-Zx=IFJ`OA;uf$w)}bPM;Uy3!burRd;rfXMAtj=F2!`E4D!87?1%n&vKI(m4ozoGm(iC)t27g~)>K8J#U5R{0R3Wn^ z&xeKk6%7Gr%xAvUBdIh}vs3cPkbJ^VuSE~X4%_ES8rjb8e?^L`qkTp6+{@NUe_pc0 z`Nb~<@mD#Mskotm-qLC3`;Pl!oDpQ1;E&>C`o3g+e7!H$`9(k{y17hpZt&CNheC%f z+PXL3(Hg0pfC=;;Hqc!r&@aUr{9JnH^}b-2{M1i~vr|r&Tv89nO|O0L z^W9it8wYajSnv(n;4_lIEwxGDNSMrU@ zUp=CQ^Y|Pm{hk;+X%(^W{rZU!8Qa{~`{`{wlh=_;UPgnvPWEgK-!P2bFNBqavrl?v z@y@)}gSSJz?Xe_FQ;#FZ?93p_pCD=_SSo1Fk6rM9${ZE;4=|t;)@_2*a zvR&%Pe_#Ntlq_zZ&N~CgZ~^U0Wy=sKS0;+Es`56mzjdw~VGMXtQ;FCj9;(fQ7l3d-l z|X3DSMkk~HM><_WEOkZ*_gd%YQUE5?T zY2IqV;dd-2s8J~SeuD1X?d!{3$oIL~=tJ%k7~;G&UFsznIbVS4+ezmVQnq~&wCW=j zBrdPPzUrLRp7=iao!No_J=e@D=HO%hXBNs>p`Vk?wa-a%3E}1O*JZoXISo0>6&umu zUH)M$xn;YbZS?N?4(&#n+^Cuf#MLj_j!-AzA1V+%ogRT`==6=R&2z=pGS_?=?S?9S zId+xqYDqi9{Tl5a(UL+aSM0Ku#IQewz$LvFrN@C7trwWb2lu_zw_%8CP$wx`+tDK=*_z4g8b$IWizMpmTCd7xbSna!_{b8bg|Z%-vX`4C7JS~p_CZH4U7 zpqOFHP$u~=$Hz z<=gxGHE4icMbYg^>T^;&I=AL@CSQA>=RHB^Qtdm4+P5@~3GIE}sC%<099FMam968ZSC?n&aZ;4?s zdf7B8>gB3gZy9p*RkQ2gmEww$)=#CkaIS(u+|$zU85)K!!L-37O4c~C)N}Ukl^@T_Se?$CcdYMZ^h?uo`4|0pPTH+}oJ_htw)k6}&}hk0e_}@X>d!}` zJ9EeF&fpwPB%Tb|){yy^mXCr+?InjJQBvQMV zO)kxO`_w~{Gd|F5S1{JO^A|_(-KYo3M=n2-SG?qQ>k++ltfig2Af+fWw3XBMo}F2p z{M)_io~b2S7DZ+vmwu!$dUxOHecBE=JClz&+ zvb}i0{7h$^O{|@}q}E1sv8nP1ag5h}oxF6V+tV~l^lLl$OH2Oi_s^ujZjUgyQXgB` zW?`3s#@%D#XbUG;ILpGt7T#jvgBCVe_>P5NS=dE(=lLCD;RzO=WnqDZ-^tra{2U8+ zTllPn587}~Sopk!Z&~=2g;B@b{46}#!U-0ZSh(22>n*&`!lx|UZegp1YOqN+(ZUlf z9Bbit3(vK1riCRIF0^okg*RKc*20G@eBQ!WEo`#zYYWv7Q;r@MdMq4m;Uo*ESUAVR z1s2v?_zMdkv+yMgn=Jg!!Z=HRkA-Jg=(BL9g=H2lv~ZP$Yb|`p!Y(J8^6SRt&o#E) zDlELg!m$6*VBSDcYOhr6L<847WZ+}h8hB{Dr7gyN*q|f(cMhM@{hnE3muW;k#?!;4 zJY7t=o3dOw-`Z>gi&e4W!=k3EX=;KRuF}Ef7q*X5r>Z=aV;r^nxhhv>sq<8}cJ(Qr zIz!Fp-x;JMDVbl1GXI7t4`nd_JlaiMme_w%zI-)OyN}dv61xC5`FSlAJX@7g(o*u7 z!{2Ig(!X<6rCN9d_wxwt$1fauDq*T{IWz^Y3aGi58vNup3A}=mgnwdRK& zoG|8>uZpl2t9jNwfv|IM3267u=@gMphpVZNQl|V0dP;dw!>7wBb(eC5%VQv$?NFph zm(G;K*o7J9yBFLp^!>LKY!xg|a`9p4%A=bus2&QK-%hI#V&c?4O) zk5I(RA6Zf|(pU;$8?RvIf^)HYLP!sU4jR{3DxBmgD&#|)iv!l=v7*>ptO_2w1BbYS1!<@rUoo5@=H1r zU*agjDZ(iHB@5+>h>VKv5)<1su3LOUcXwh^kDk4fkLjJ#=h(je`X4vIGjP!HgNK}O z;?R>$P8~LU#K^Q!qsNRr<wq=%G7Cy zhG$-I;YG79zGQY`(VXIv(z3bp$}hdFV*Y~4s>`cu{DFmw7B9Kt%B5Fby-a0QR_81( z_ZL)G7MDuv&WD$ZY5Quppj3^3lPYxIk{+}G&M7BEDI5cFkxTer(F8j#H0AixN;u6=hdM)=Mqj~3gcgz8pA(v8BRK0N@d0o8BaWzO8&|S zBIV52Ip%>$txB|8nJ)Q!9d;fyssStFuf&k?OvW1-8>JtXQ|r0d7U=$4uE(~{X^DS1 zd6wf}!QU%vIO#ocx_6oMC0q&q#oAwbtmNq-HyKwv_$=V>63QsKieDA~Bt;XW9G?ZW zhX=|?ElsNPag~wMqeEUs`AymV^lGWSv|iiworJB7^cG;3I!l?vML0p|DK$ErQVVn$g@epDKLG_J;>s6EQZ=bp08MShRnj#+^9dO)eVDH# zFZqS@8`YlQk@-tfJGk8?k1*Y{NM{;$X&-3=<6|f-G?Q|U_=oUExIW=}q_x*0T&6Jn zj#Pt^cDfsCgy}Jwc}TdwN$VHsUSjGcz3oV8c{C3SABW4-LEq8pwD$DE<@sstxrn@u zoa2$()X-rxqei&=KRrL`S<+|!EBT$$o?jI_YItBFX;qV^%sMKd+TlGZ+&4QY7B2tT z_Vj*w`DasdnJXn6e@zEWcsBC&uh!aoSbLha_q6uLA58cZYcI6+KGvRS?Z;aC zy8R|Rr*!o%&D#4}d(-#E|2S*E&DsZ8dn4OGE^v>v7h3y3Yp-fE{)?@>z}mwT=rn7; z!uls#yPT7hU#zvukreqk`%HTIy6?+;K*oeJ-A3o*ChcTKy)2c=KM!9>>8a8q&5SY+ zOjc^bC8iW{c1|hjkI?^ko0+zj)aUAuGUt%5kx4<)yG(PyBL1Ew(GJTchj?b*I*`=k z;DgSoozYIOp`;)qMg@IPenS@oDk?yc!FN$E#l~i27u6*qF)Ak~Ct7}|q>+{c^rRQe zjEPmJrKQa%Kwj?gXcmhtoL9(Csl`=``Na}~mnUOm0kQlO>%V?bz;oEYp^Ss(-{F3T zyZC6CAN#jL9scj&@XJ-lKbQJx|2n5|jq3Opfz0Qp{0qnT{EG(;Yk&Cy{x5TYYkB)W zqvrqb{|&dGz-wF`{~}yJ?O!%bH3!v=r9#wNs};eT3f zJ3=L@4%}caM%RvC?ec5tR;;}CXRB6U7regyh8x%1bo0O6^7DVc^|sr8amU&_@A~Ds zU)_Dry}!QiH}^mA;BO!L-GBUk{lkwu`q<-7Jh@@xQ-65+nP;DC*!2A7EiY`{w*AGI zUf%J_t2-Naz4rPWe|+;#yZ`*w+wZ*l-uq1-{N=+vAAS5+r}>kXPe1$oi`Fl{`rFsv z?A_P)?RVerN7eX$TR?Mk0nASl(EPLO|Ig0#VndzI=*tTi8&qlUkx-wAzB&Rm{$Yo|s-Rqn7y^le&U}RYdg+tzA`1EXA~L z-n@CSu`!FQsuopM9X6knotbknvVSv}@DqysMHQaX>gvjBPx%5*MNwcu@x0RNGdx2? zNf??$nFGsjLQ#1|X^F>Q>8Y$LUEnEQTv{CP7tN{A0&x7NFA$6PmqABQ(E?9V6#+|# zBT{jQG(xA-5w5zlsKirNT{)i^CYj?0$~wqP$$ZdgCXfq9Iu&I}lih&Xth7bG zb(Yebowi=nI%Q+hUsUd&Crw}DFRIqL|7Wu8)SkM&mY$rIId29A4*q;_)YXifk=}n>xoPhr`1UJQ31XR8%g~{7LLX*x@LA zaBzzrlFJeDDXN|ukOr^u3@u&A$WdPADV<;CUvkpl&u-6HXbh#jX1KyQ|(M38WFP z++*UZyEH{LMzFyDx`^)rQC)FSDsC(igz7F;u5K>XjncV##i?Fn-Ky8<#MbUj@r`i} zu~jjJT?$-XB2KCp0 zjZbMfrYgCx7nz2`jYSUe6((EexB`_XUW5RiK)pYHu;-++IFUQ!?O1+Nh^QnO@beG4wl9bC6uRJA5$}=rd zdB%2Ep6Y(B$2O%j9@EgP%GEDk^(%3!e$%?Eezak~DJiYTH1%ri(U4e`zh`g^n0(~dX9Tn?*#bQ`tNyNMRriMYs&1ACnwTHR&&3_;7}p)T{e)&> z`i$(Vj`KgRjw^Xg9XIw-b)0LxO0@Ch3}%w9V~mO$-BHK8y-IzHIW3&`fLN6{mUUTm z2OkOV$!PTV_$YRQQjcN6X(b8&jgCkQ^H0qrPFrK9*t|@6y0n)^+VYHZ*o(!?w_z>- zuf^1d^q_3yOWi=-tCIbgk{FdtnUY5*HRy3wOevM)J+UDEsm8QY8 zIQl((pMG!Jp7x=g`_RsIJZ?xz>Y|dUSJG(ta&+YJ{z@J{yOxvhp9_VckIsWJpSZoo zlHU}Y2W{>qen%b&A# z)TJ@1A^bh_NnJF5BvI}}<$kSOmHrOew(m{b_Z-u``p|f3?eW~i>#p37KvQw+9-+FA zj!SdJMM(Y9EZ<6SJw6@{9!dv!JjV5)i6bzncO1ORcbPGy_mrNkVJ-;Q{pY_`>iCD0 zdfV3B^ubQw+R=vd!r{C8j{b`IHcYGI_#WKct*L8cOha^4RAFR6M4F7b9rWQl3Qx+I z)#uc1YRK5jBZs)kA`kxBn{mg(#?6oMYtkQ>17X5Ee>9%^kT54c-NAEx(z>YuV@uQk z*M;gx`EF-$`LTSLY**@cm~g&*2F9u$)7*^9-Bpij{e>%RpW{fswR54q%!T^Wj~D~Y ze5N`g&6UEq$heupxS0Z77$d7p`R=29YmZpIMuZop-_T!(*Nb>E=P-SS9FAm9?OnFSC{H4V{Q+jZ5*@( zjy5UiarYYhbbqtsL^b?0EJ7XYT5aZ+(5TN4#$x|iczulO?MhSOd53f`S9}*0&-fBQ z#m+AW#H#`RBsHKU5#H#o26TKk?O1)#cdSX~Kz&Y2P$&5Js}oATS0{}9PMzTTTD5;| z8MB24*06o0%R3%AA16KA{4N;;-ineIPlwxGxUKmr9O7{JuXEytR{uIDZs_p;_jBR{ zT%C_a*1M2DW*NCo9xLG)Dm7|qsR-H%iv06tsH?GcmRce`Gm=bozsl0`DSN;Yq2yMb zR-n3?MSA$yWo-0}qH_O)%Ic{I2P#T!-1&rDP+HA0Jgag+O=U%CmcP0phef@g`wz-n zQ&T>7flXmrWk;6kW642^pM|6=oP|0z0@wV?l0Zf21O$NR7R{#`>Nk;-MY7jP;@Xi= zd1QW|!e2gqiNADO<&5%@(yVz!)#~TAM(yFeN?j&tPxY7hkb8-2F;?s%ugwubCsIYB zPp3+laMkKlm2D-2r8epml~qw$6Skd`Gv(ZzyfLFklvGr3*H8(yryzt_sH-p)(c27_ z*= z?nhKvF%>a{2&7d;WL{~}!qUUst4v+1X{l*Tsw9`|58)24dNnF6_v)bkU!tZjn5XGe zlC!v&W6tD4Ly)ynj|zQ`>Kzf8Ta#TnCop$zX>~z$X^k+z2~ku073Y^%`vXN4(-$C9 zDq;RBZh4iJmj$XOAXb(PsG10DQp6{#sEV`A!b|?r#eOwJ+)UJ*#i}JDcL4+_swltW z&?Sa0E-O2v8rtHDJL8%9YX6GaB(Ukq84rBTS z2O>1}3WNjI0>Qmme1Fc880Y2W3m#AX&!=Q1nxB#Gs|#HdDrzLjq6*GaUnDlNG`0)G zrklA|sM?7OU)DL9o;Pit$is7?+Dr*=SV84UuF_+?B_$9V>FjahVtS3?P}+NJ^bD9q zv!Gfkc^Dr&Ekw{@bf9dsaXt*-x)8V>bOD<_{C zO&KtCqa8=YVTSTX=2aGzvY<75QHNh>13yIpv=XzVxVT8 zBsM-!RtBpnb&F7|)2LL!Y4`b6Mb)M4v@MkoooIA^QFXb9Kxe2T<5O~8nIx&yWT}U( zmW(4xy<<3?{=zMC!x46bqxk>N{Avr$Il6F#!}f!A@e{+oM~5;;H#38yhw1Di;l=#x z_b&?kivs_33WWRI=)2z^etW7?uUzbTt?Ug^XkmWhFA6xq{Z01s1!sw>RF8^iIe!()YuGR2?;u4;ZIR3m^Z9;k`Ee z6NKM+_ny0tRUh5$+ux^D3jm1$~4;`c|n?SDTWd z(kGPFDO9?>hcMQ{Gz*7WIMl+y7J4j9u`toXSPR?sntKh7h3{C{XyFbEw_CWy!UhYU zws3=mk6F0h!iOxp-@Txa2J7Ot{zsfB(E!|7L8dx?d!EG)3lXJNX9LoM`J*w4a5 z3){Z2^|r7pAADCQIyYJO-4-@lxZT1A3pZG}-okYjuCcJz!g&@JSeR+yPzya4rdXJ0 zVXTG9!nUtXxmzuCENrrHw}p)sZntoQh3hO_V_~g@;q`dcMVO6%{?GkbHB@7K{auRVBI<37bF53f z1MJ_Ebu#WAVAozqufgU0%|)1W@WsHjm?m(6H?Xjt3BCrn7U9A=aR;XKW3L%p;2?~I z&jilKtm)xWg}`x~;k*Sr6ZmhK!Ia@K;Fp+w;9mnzInKDJ1OIICcYt3FKo-!4Fu?0Q zCVhe92b#L%0nziM(-b%rBW0KdeA2pa05)6Pe>`OyqEw@l4ftD38~9_uH!)E?U1~Sb zJ(P7ncp~sg%rNi`z&~Qv^(G9k%gIX3!aWwa03&s&0**{IWk>^lJPbM$#sOvyCoZ_a zuP|f#Q7_;Em~9L0^44|gNK>z2z!7OmeTsV;@D7a7Z7uMaQJnuf2ATt}#tiG_QnkQ+ zOvwwt+kkOnOc~;V=Z~d*ahLNM(@#}uso=mR$$^d6GmW~#RV?JNSW6FAH%3*mudj+#>9d*0YAXRgSP^| z#3X`$4V-kANiz@lF-Gd^0R3khx(O`tD%Fed0*@PyJGck99`kiymxe=f;9J~>0=rBk zJ~(>BR2oM3q|gVy<=TD$95cz3c`Wb&%)Nx)0DKoC;hTUzKZo|h{Wf5~JX1D-nHZ_B zz?yvciZFiQHyCkm1HN)D?L}Q0fnCot?(x7u7C#fX%;L4cM=|Mye+>8;M(EHA{AGc` z*8xXPq1|zx2NbQ9lGoF~KGTtv;oc888zbeP2fPC#Vb%f{%%qNlsRDkEX^`}RH3;Pd z_XEGR_8n>M}>u|FQH!G>wwplQWx;+f%lb}yzU2nGZ+5By$v|2+>SHA$|`tO$^Z;rPQKvR z10TT%Z65<>RGaW;0uyRDqfMAZ;6zLbxDR+cWkWm-T?HkG_)0X+OjKJZNh7fKH;fnHYk=wZ zW55f5y&r&I!P9^rVSL~Yu-k(uEeDSWo`ey4&H~=>5bcON`U};E7)gH*@blk6U+`97 z%zv2hvB0x1LbptyZ#{G;jKEhgx@^E-K5X!Hz$P&=Mgbpv#PH8!z%w4TJPBO;6m38{ z0qb$fpVWf zaDj3MKyZPpEH3u|j#2avoH0ftOfZ&V*iVarLj?PohAS4i%{o_oA&q)piF~ z0aJjhfB^k7;bQcqZ$FCr?xVOnM{pN8Y#Z*eH#6Qq zygjA@s`VE58TYU~<=^RJu^sk?yO@_j)Uf~1d+{IAVQ+j9dt!%u@mqu^?Qr;}_pn2w zu-*5*i&Iz~_M!NBFqs%`Gw}E5zY!xwsEHFNsu?q8sPgi16$k`Wtpu;F<$tZZ?Y7(0 zZ+`O|wQ=J{)zHwO{`99msRIWNC|SNrC>@ANqIYV65@J-ll}w07?o}UXnWf$ zJMSIz&<-6|{E7Fe_smcm(c^XaojYE=XWEXo{X1(L#14HzKTLnFZNK)G@X)t;ZCglt zYx+wPj`5c8TFLuvxj# zh2sd6bdF?};U210E=(jQ2IIyI2nnAjVmz3?$LC|mjzu3X8c3&3Raabbg)Uo|$JeY` zqaJ+lLG{>Uk7*u%^UXKaM<0FE&gWHfJYYRz==vvPgwwCAx-#@c*>h^yb6-4Hc3Gub zMiZ4i$AjO`wakVSE?f5bH?yArS$5Y)JpJ{3*;OxoG=2K?=gRWN{uVgf(zpR#%ryP;=+bRhM3RshU53zN)T9uPEckRaaf5eib-d{q~A+>d~t+RNdShb^T>o z>Xu5cx}!Q%{bBhT>UXud>KDuBs3&i$Qd@64M>XDanHu_RNDX^Fq(*HGsk66))G058 z)S0h_)T~!RD(elzWp9Pl%lKU8~luTc>{g>tE~kUB7<4di?Rn^;q`w(@(3{H?LRMd>K-Yqj2tp7hX^= zzWAbg<&{^|u3fv-8*jX!-g@gT_3pdxsxLm;tzQ2sq(1oI1I-uB&CTlTFFsKpej8G) zt*vU`zI~ckgsc%Gktr1*dw^+T*C3Z!5A)F3ySKupyy-YDG)i3*nyi+DE?2jOZc>kj z9#(IJc7?}N)rvg|Hxj%A4L2#;-5wQeBzT< zYdP_kB&pDKqg3e5$tv{w%T;L8O{Dp-3VpPzBR-Rlf+*s5A%0il#}S|Lrc#6OkzdBmSX{Kdq-f%x|l|54&UOZ;ubC(oPS zA^u0iZ*7l14DA%>kU}{r{EQTSO$u8`;R8}=O$w>6MupVZlS69nYax}s%2M4{8-`( z1(J#1m-qvTe**D`5&x{DkeWFvq%NNvLXJUNH-*%54~NuSyE@_@JT%NUzs`wIq zz1i9+@8qFF1`ir^!o>Cf-tm)ibF;H2Wu1MtH+%N*p(ma=Wbnj^$IrF_vUBm~e=bON z_UzP?B*4Up9_v3TKPzX_*(9Hne*z4(0Zy1r{Ik81 zK-Q$$eS7xoWBhd)2M_X4$lUhyXD9dS+4G!nI)PMO%Ypb){%ncworHg{p8e0UWy?ER zia`9?XM6L{oir(D((Gd;fj%j{dmj@YAKx!e$|(M##66!}W*>V{fZ0L@@z2W1&z&?W zKPP{{K>_eT@noI;`26fiIr-W76OKDJ*=9iwvrig2JdgTI`dK=QFx6(CnL-i72K{vU zqcZX#aemIE{Qs}La{-U4y7u@WQXUow+SWj|8G=H9LQq8BBq0F-MX0t&l{N;9fJ?-3NQ0UvQUwY$Sy-q*iINa~!Da$d~_wb~}7_e<~B zr)R%%EagJVTc6bPd!#0wT%+D4krVK$Pnz6SUZbU(|e@!?{aGGS{G=B)O1GgllI;G>8a>l|1R}U zs-4XF)Fi2EUw^y!2Y;ks$)_|twSRhQzoahGwTja^?_2MfhMoGQh>v}uPQ(8+cZELh z&@Q!$OeOlX8(;G6n!$!pv@^igkv%o;b4#W%-)!%j3U4aD)76cY9To@=QCP?_z@;+sgvmw{H*Z*s&w<@y8zrKKbO6 zz!#tIcCo>}eft96eDh6U?td(>T(QE7Uq|`b#3owkI%uJjUCtS*g>I4-y4hOjmINBw z!+~>cZQwVyF)+rq1m@aXf#vp|*6;7unLwfz!~wCoUyJRWU+aDqcwR`>{e5-+mAZe7 z?!Q_0FVy`jbpJnee_6#k^JAPM_Wc;A{J)G-8VAZ-eQ)Mw^ps6 zwrJ3x@yS1F-14kb>eSjLN$cK9pvgJE zta+x+>Xx%~tod7=`LpItTO}s8YA*aWf6G>_&TiGJNh?R+nQB3`CQaO7Ag_Ubd%3nQ zRIKcvhWe@+pZjaLUiSs!Tuv~c@H}vpphh65*Ar?d>25{r0Y&T;P)qNb`G2Dwj`}0b z4Zf!cejXPW*F-&VwxC(vx^=Y!3dl3SDTUBV-wWysJjeC+2Wjw!akaatR)fDW0@Oda zXwjm}weGChy?gijpMLu32U>f!@7lHNJ@sXK_wL=Ted&(3-g;~Kv(G+zo1XJ&)wOF^ zX}+ULi-sFVyDKNRW8ojNW???9S+izM)x#^&%hhSIS6+E#(gkX|_?OBf&elHK)~#D- zAAInEX+1UNT}V(_Sy`EB|81NX4W>Q#zjyB3`Jrfi=cSikx_85d4S79!^k}DXkkgrh zGXxC<;DTK1MS%D4m~+1noFzCzxr%lN4jlMO@3nAN8~;Y)_Y1PY^BJQ9tJG_-cviIMA-!^aFY|1IP>$pcT0-x{DJ&TqvUw*@?RjY1L*w=H~ zv}ygbv$NA?&6+hpaW%NL5VShuj5FFPw{gXJ=bZ=dV$;&n5*SzSj|u-hd-j-OnYm4y zHf=8+&id%1k4!n;3O>K^!VC8L>#sXJB_D@7ve~w6o4xtwo9-BzJSgUI@1=8lKmYvm z1Jb*%HRjH*zWU0(_~MH_ue|cgqwl`^Zkgu#l6yqw9kRFf!eJKo9xMKer%ZEI0Qh@= zuO5(z2k?hi^!`1^fTx2Vd^`we^B|d<2mhJxj|cy!o_cDgPg{NG#!7f&ku55 zHhi9FsIL7s+P{ClX&G|*-?3xIX6P}143sysHEY(GWNwO?oed)cWTL#9190ECaid`? zTeog?@1X%7fWBcT$Ozn4>iz(eSicOVQBm3A6ae%x1l%+Q7ks_f!XYUE}bV zuQw0i@4?H$_s3%=*a7--`P*g}Zq;`=UJ?JHK{B}DIkWRbL)L4mcN|o{`$e<1Yn@st zvskUxNO@9pd1kwI?c${i)1gChaP)XO=;0-L1plj|1HQv^WQ5+J|M*?)*&IUsh5tow zmebHf-=FL*Tsw;f<&!O2bbnql7mqyJiu4Dj-x2Y;{U=s)s6 zuh0!o3pS3Pq4(H^@39NoW$&0>A{zQi|9gqw(9mtOS*L%M)6iD7pgg%HtaF#+N2}8u z{_@3hmE&(OIn2V&@GVu*fxbt}#OoD3{O3ID0{7x)qT9e7vQcRGw^<+2&{H%l+ZBDq zVc&nQGxHBaOrtNq{L-|}90Jhb!P8NdOgt^obbS5w*Y@J03+-={``Y|5Np{!hWQW)l z@0OP{dmZ&hcjf(D1bCl2dr1vz?qxa}_Wjefmq3h^U**_n)`zLg@qH*2q-rVkv1_=1Whi1Qz&@iCP>|){6 zTQpSIGc-i(xeY!^KJ^^=q$Z*vZgshD)i5_!qQT)GA0J=g|Fy=m&VNrH*e~mWmk0L1 zv9}ZOm*2DXf4$m5le*fH3EiwvG%OSiv<&&r!J=W1eEe^>n?ZxOXK3*Dj88iES@HcT zvlh@G{s$j5>n}g0_Iy?N%ilZwm#xhr9>V549iA3sz@>SvG+@v8q`vY=-kzbs+cPwHd&Vavta14Nr!xN78S9JU ztO|ez50&Zgwh~PT@1cRVDzB5RnB3V)|Er5VFi|v&?`Hcx`^a9CIYUFbXi$yKE|0Qj zd=mDYB3r;Gb(BwHefB=7`8uG?a*jrJ~{SyGPsJ-BO-vv=2q+D9NNF>$7O^F-G&X zSt#$91=zqZ++Av(rz_AH-7s|tVld#C@x zXBN1F7d<$EH}(LZy-e`&(eW|y5HzCyPtE9VPl$%qqT%5iM1yPrdxi$=8J~2w{3C(-f`#%|-C2q z%`oD++}vCnJ9ezioH^6kwNgIL?+^=BMGL%VZNOI%3lWd9AE05+FDw~n2fxyOqiDQa zpQB@pyCe2IN47w#3R(Y|aup2}>;G2A4*%AzTVJ3@d$RPG+aD{Ac5)~zEVTap`M1+a&K2K*^{$XW=Gp1v*3Ub-Lr_uHoX#(x)M z$QFn(uxEVI{E7WQ|ET*f<^FC_DfCA4N4h>&`~LQN4kj!cHk~v52cF3$jN^+gy2!;n zdLG94PjClUWCRT!_zZrdd+c+F?T`ibfK5AlmK<20y*=ZTqV4&gs}>OlF7UiQQs1dl zr#tmbkIREFcf^)W&nTLnNiyZMtVN3!rr6ry0v^O0(Etq|JRS6m2cT1aY<%m#77nq; z|CFrtxje>TeGc7_YOC(J*4}(>rS0FhZ;Rwz?fiqDrL^hOr|;1-N;Y-s)O}Z6afOW> zInwc6`%0%v(12Z#_W?KPs7wnv2-acro)`&RAs?|$`$;|{Mq-_SmMWT9@a5ac>sa$Y zj3wJ$tQ=+8_19njEqLm=Q3u$xr=exbmZoRdoE%s)(0O7XPY3vdKROSc><#F#2W$j; z@G_xC2Z>Gm+QZ(P{j>DtnDU?47Wyw;D$w&{FJq^wh}-1Jlbsx(0l%u;vJDzE$bF6s zpuqz)_7rUswF2Uo1RW_a^O7ocpB)vUU`{#JHbA{-S_Abdj|B1I1t(S{D$zS-1bvJ zb(-^^qI;%F0P*7CbnN+wC!TOLz#sC4vJXc?Mn;BReDTFjw^WmN_`_>>4lUq~9pHcX zoIL{iL#(|{c7P3F6O4-w7Vh6_oawQ#vB{Eqq4G{Ug)}uE>N?eFE`IPjNc`jZ3O;3J zWey+7))ZUtRI#%M$=jrFP6t?{;4{|)976+s6rSS$SFBiJrKP2A4Sevy2i<+-2*jtI z@@;?68aY|GKdH}d7Shx`s$0Kl1ir*S_GR_yy^yizQSialTcy?$$Sa z4f>7Ffj@SDT_O|o1R0Re;=FIXXIx~2JXp^~@85(sev>+3b(_QA>nVM-4nu3M2>N>z7~J1xI?4E-^c&r_jG9R ze$mt7X`qMS_$IC0Zl8covDQZO7hE|8e`Moh2IHh=znr_b=)19YQ1*bZ?M$LI{>u@=Z@-mjldI1$_{ z@Q+>>!QTTkcsPX1<~SZd6OD89dxyW*f5i&T z;1h5pnGoL-|3DXYIRM?Ff99EIoZp29*em)D{@8)^@jgv{qB?U3{_xZ1KjkMX@;}hP z+DZI^|3eR0k61h5F?&vUj~s{vyc{^j=i_VfW7<==x`t@}p>c<;2DJfNnj41ec(Bb6K`j@L)} zZ70&_MewxpzDA_48R=_B`Ua6cF48AO`n*VQ<$VqM1mP1DBnyu7Ijxg*EAcIWJ|8w# zl%#JIC<|`;1<{RTDk_!pff}yL#$2)53%1po-#0Te^EZn3)0Fd1(dTUi#N0m@ROl&V z|NDU1c-4A(zgk{nBNt3f;XKuL1}iuG>K6{BBjEt8XV$7!tAqA-V`S3@@MnrS_sQRW zsI}k|`K31$pBE}mcAaA2G+lqLAYSpt?rT-!piV|EG+FsuYTnd~U*2Q(g0gb@J`(Ly zU4OWCmV9`T<~)G^#7DAU0tdj?Fd{MkxALodQ7e1+ zv*@!`zNd&4tq*Q~_JhO-05|~ncL1KSe(iei4ZDBZKv$O_A5I&xOZBdg%Il_=2?y%F zJOe>)pPH}NN9w)Q8M~@~16Yla_vWtLN>nx}B!c^+(nnk~)KPh2r+(xj}syu9m(K>?2k zc@ua+Bfn0qi5dsBGU`m!H>i_QW1_Y}jg0!z>B z0MU4W3-aG^bCOZ-S|J?BX_6bK#)3Xl=c2wstP*!7 zsFUSIaA2|lW#x7J!J7N6|L{qL4~iqcLi*eM~tm}MV9g{qu|5r*|VMB!|$^G;s4PE_<=4mH@MKSiBGq`Y`eCujXo}z z@_VMQa{ZTYCEku>e$^u0NlGHBo8W5G`b`D9_10V6{tle*i`W5pzyst1Z}#kb!=5h~ zVUJEranAyHeJq^R%U1j)+dkf*;N&}9JA@70yLWG=eD5UaP#tshkRd~!)%Uk;#E20t z53FY-UGBo~ec(C#fdB08&;|Gb{*@bJ>bjStThVLnA@g&fy4dez_ii7^T2Ebu+LGcd z({taBZomHm4*-6EM`hW7AL|yrgMF!nzd%5Iccd1_9#rwiN7NFjOXz#1M*bBX#*7)` z_>Mnd9b{~;1I&eA@V2UT;-Km>*GiXj6(fDCNqOe!XnU$ScqQJ?88&R#Gt_v<(d!HU zhAgPBX=^t?cg`LTy&6J zI&}@~13Z213K`%RxDQ<51%4Z!37+fLt(&chPd(b?I`8aX_1g@6k8U7yGbVBd2mMZf z>30R}l1naexPb$}HP`^xp*O@y_zRv(R4%+gXoO@j28M z^qU2)#*AHn9}PbE953-QH5KA^(QuC@t?u05=jQkN3||580GN;UNWYQbd;`y_LOVK# zyx=u-pzT`w#XW?0txJ*>8mJxy2ZReRyx- zf&BE_Gp^2!4}%Zeo-VMJ`Q6-plGvTNoqYp)ryDXabaPx*X0}xOT7A#k^78WBGa}U0 zkR|%!`R^{)%jONsT-<+y_CApYv5&w%tqaa?QIq5O0q*rWw|q)>`)J!1$4~Z9e;V%Q z-|O`U-NV=8caWvNyY6_3uSS+{KUruire5ft=UzDRBHQ%X{Y?LezhB>7aj_cy3%$W_ z6LTRC{An~Uyk{-<_tJB{mp{DoaaWnvN#h+$Zb7p_|TluxudTc+j{8eQJph#N3|J$ZhUZ5M%M6a zGIRa^YIci1w@usl?)B>hgI&kwjLUWZM_bL&+Lhm@J99IKj?*7gPIBV})w#oMcxmyn z;?>3Li#HZ;F5X(at$1hgXT=AK1ED&hm{4pe7)l7W4Rs79hkAzwga(DK3JnWohbD&d zLo-5iLi0k4LrX);LaRgTLmNYzLt8`JLI*;DaGh{WI5r#%CxqLEJBE|Py~6{-gThyZ zhlR7l6T|u88R0qMdEv$3rQv1a)#3Hwjp5DVt>JCqo#D^I2f~4pIwdhBu_eKhgp#%; z9ZQl+dY7y&*;;a-B(}6;>BQ1GrSnP`mo6<`R=U1av?SNiuR7@`GYTgb<`>Q=oL9KG zaB1PP!qtWA3q8+vIV}m)F{$1{*+FL34-Ga^i6wNzpah fUIm?w0eZ<-NO1_&10w&|QA7T;lTN+Q`M`ez$OpeB literal 0 HcmV?d00001 diff --git a/env/tcl/tcl8.6/auto.tcl b/env/tcl/tcl8.6/auto.tcl new file mode 100644 index 0000000..a7a8979 --- /dev/null +++ b/env/tcl/tcl8.6/auto.tcl @@ -0,0 +1,646 @@ +# auto.tcl -- +# +# utility procs formerly in init.tcl dealing with auto execution of commands +# and can be auto loaded themselves. +# +# Copyright (c) 1991-1993 The Regents of the University of California. +# Copyright (c) 1994-1998 Sun Microsystems, Inc. +# +# See the file "license.terms" for information on usage and redistribution of +# this file, and for a DISCLAIMER OF ALL WARRANTIES. +# + +# auto_reset -- +# +# Destroy all cached information for auto-loading and auto-execution, so that +# the information gets recomputed the next time it's needed. Also delete any +# commands that are listed in the auto-load index. +# +# Arguments: +# None. + +proc auto_reset {} { + global auto_execs auto_index auto_path + if {[array exists auto_index]} { + foreach cmdName [array names auto_index] { + set fqcn [namespace which $cmdName] + if {$fqcn eq ""} { + continue + } + rename $fqcn {} + } + } + unset -nocomplain auto_execs auto_index ::tcl::auto_oldpath + if {[catch {llength $auto_path}]} { + set auto_path [list [info library]] + } elseif {[info library] ni $auto_path} { + lappend auto_path [info library] + } +} + +# tcl_findLibrary -- +# +# This is a utility for extensions that searches for a library directory +# using a canonical searching algorithm. A side effect is to source the +# initialization script and set a global library variable. +# +# Arguments: +# basename Prefix of the directory name, (e.g., "tk") +# version Version number of the package, (e.g., "8.0") +# patch Patchlevel of the package, (e.g., "8.0.3") +# initScript Initialization script to source (e.g., tk.tcl) +# enVarName environment variable to honor (e.g., TK_LIBRARY) +# varName Global variable to set when done (e.g., tk_library) + +proc tcl_findLibrary {basename version patch initScript enVarName varName} { + upvar #0 $varName the_library + global auto_path env tcl_platform + + set dirs {} + set errors {} + + # The C application may have hardwired a path, which we honor + + if {[info exists the_library] && $the_library ne ""} { + lappend dirs $the_library + } else { + # Do the canonical search + + # 1. From an environment variable, if it exists. Placing this first + # gives the end-user ultimate control to work-around any bugs, or + # to customize. + + if {[info exists env($enVarName)]} { + lappend dirs $env($enVarName) + } + + # 2. In the package script directory registered within the + # configuration of the package itself. + + catch { + lappend dirs [::${basename}::pkgconfig get scriptdir,runtime] + } + + # 3. Relative to auto_path directories. This checks relative to the + # Tcl library as well as allowing loading of libraries added to the + # auto_path that is not relative to the core library or binary paths. + foreach d $auto_path { + lappend dirs [file join $d $basename$version] + if {$tcl_platform(platform) eq "unix" + && $tcl_platform(os) eq "Darwin"} { + # 4. On MacOSX, check the Resources/Scripts subdir too + lappend dirs [file join $d $basename$version Resources Scripts] + } + } + + # 3. Various locations relative to the executable + # ../lib/foo1.0 (From bin directory in install hierarchy) + # ../../lib/foo1.0 (From bin/arch directory in install hierarchy) + # ../library (From unix directory in build hierarchy) + # + # Remaining locations are out of date (when relevant, they ought to be + # covered by the $::auto_path seach above) and disabled. + # + # ../../library (From unix/arch directory in build hierarchy) + # ../../foo1.0.1/library + # (From unix directory in parallel build hierarchy) + # ../../../foo1.0.1/library + # (From unix/arch directory in parallel build hierarchy) + + set parentDir [file dirname [file dirname [info nameofexecutable]]] + set grandParentDir [file dirname $parentDir] + lappend dirs [file join $parentDir lib $basename$version] + lappend dirs [file join $grandParentDir lib $basename$version] + lappend dirs [file join $parentDir library] + if {0} { + lappend dirs [file join $grandParentDir library] + lappend dirs [file join $grandParentDir $basename$patch library] + lappend dirs [file join [file dirname $grandParentDir] \ + $basename$patch library] + } + } + # uniquify $dirs in order + array set seen {} + foreach i $dirs { + # Make sure $i is unique under normalization. Avoid repeated [source]. + if {[interp issafe]} { + # Safe interps have no [file normalize]. + set norm $i + } else { + set norm [file normalize $i] + } + if {[info exists seen($norm)]} { + continue + } + set seen($norm) {} + + set the_library $i + set file [file join $i $initScript] + + # source everything when in a safe interpreter because we have a + # source command, but no file exists command + + if {[interp issafe] || [file exists $file]} { + if {![catch {uplevel #0 [list source $file]} msg opts]} { + return + } + append errors "$file: $msg\n" + append errors [dict get $opts -errorinfo]\n + } + } + unset -nocomplain the_library + set msg "Can't find a usable $initScript in the following directories: \n" + append msg " $dirs\n\n" + append msg "$errors\n\n" + append msg "This probably means that $basename wasn't installed properly.\n" + error $msg +} + + +# ---------------------------------------------------------------------- +# auto_mkindex +# ---------------------------------------------------------------------- +# The following procedures are used to generate the tclIndex file from Tcl +# source files. They use a special safe interpreter to parse Tcl source +# files, writing out index entries as "proc" commands are encountered. This +# implementation won't work in a safe interpreter, since a safe interpreter +# can't create the special parser and mess with its commands. + +if {[interp issafe]} { + return ;# Stop sourcing the file here +} + +# auto_mkindex -- +# Regenerate a tclIndex file from Tcl source files. Takes as argument the +# name of the directory in which the tclIndex file is to be placed, followed +# by any number of glob patterns to use in that directory to locate all of the +# relevant files. +# +# Arguments: +# dir - Name of the directory in which to create an index. + +# args - Any number of additional arguments giving the names of files +# within dir. If no additional are given auto_mkindex will look +# for *.tcl. + +proc auto_mkindex {dir args} { + if {[interp issafe]} { + error "can't generate index within safe interpreter" + } + + set oldDir [pwd] + cd $dir + + append index "# Tcl autoload index file, version 2.0\n" + append index "# This file is generated by the \"auto_mkindex\" command\n" + append index "# and sourced to set up indexing information for one or\n" + append index "# more commands. Typically each line is a command that\n" + append index "# sets an element in the auto_index array, where the\n" + append index "# element name is the name of a command and the value is\n" + append index "# a script that loads the command.\n\n" + if {![llength $args]} { + set args *.tcl + } + + auto_mkindex_parser::init + foreach file [lsort [glob -- {*}$args]] { + try { + append index [auto_mkindex_parser::mkindex $file] + } on error {msg opts} { + cd $oldDir + return -options $opts $msg + } + } + auto_mkindex_parser::cleanup + + set fid [open "tclIndex" w] + puts -nonewline $fid $index + close $fid + cd $oldDir +} + +# Original version of auto_mkindex that just searches the source code for +# "proc" at the beginning of the line. + +proc auto_mkindex_old {dir args} { + set oldDir [pwd] + cd $dir + set dir [pwd] + append index "# Tcl autoload index file, version 2.0\n" + append index "# This file is generated by the \"auto_mkindex\" command\n" + append index "# and sourced to set up indexing information for one or\n" + append index "# more commands. Typically each line is a command that\n" + append index "# sets an element in the auto_index array, where the\n" + append index "# element name is the name of a command and the value is\n" + append index "# a script that loads the command.\n\n" + if {![llength $args]} { + set args *.tcl + } + foreach file [lsort [glob -- {*}$args]] { + set f "" + set error [catch { + set f [open $file] + while {[gets $f line] >= 0} { + if {[regexp {^proc[ ]+([^ ]*)} $line match procName]} { + set procName [lindex [auto_qualify $procName "::"] 0] + append index "set [list auto_index($procName)]" + append index " \[list source \[file join \$dir [list $file]\]\]\n" + } + } + close $f + } msg opts] + if {$error} { + catch {close $f} + cd $oldDir + return -options $opts $msg + } + } + set f "" + set error [catch { + set f [open tclIndex w] + puts -nonewline $f $index + close $f + cd $oldDir + } msg opts] + if {$error} { + catch {close $f} + cd $oldDir + error $msg $info $code + return -options $opts $msg + } +} + +# Create a safe interpreter that can be used to parse Tcl source files +# generate a tclIndex file for autoloading. This interp contains commands for +# things that need index entries. Each time a command is executed, it writes +# an entry out to the index file. + +namespace eval auto_mkindex_parser { + variable parser "" ;# parser used to build index + variable index "" ;# maintains index as it is built + variable scriptFile "" ;# name of file being processed + variable contextStack "" ;# stack of namespace scopes + variable imports "" ;# keeps track of all imported cmds + variable initCommands ;# list of commands that create aliases + if {![info exists initCommands]} { + set initCommands [list] + } + + proc init {} { + variable parser + variable initCommands + + if {![interp issafe]} { + set parser [interp create -safe] + $parser hide info + $parser hide rename + $parser hide proc + $parser hide namespace + $parser hide eval + $parser hide puts + foreach ns [$parser invokehidden namespace children ::] { + # MUST NOT DELETE "::tcl" OR BAD THINGS HAPPEN! + if {$ns eq "::tcl"} continue + $parser invokehidden namespace delete $ns + } + foreach cmd [$parser invokehidden info commands ::*] { + $parser invokehidden rename $cmd {} + } + $parser invokehidden proc unknown {args} {} + + # We'll need access to the "namespace" command within the + # interp. Put it back, but move it out of the way. + + $parser expose namespace + $parser invokehidden rename namespace _%@namespace + $parser expose eval + $parser invokehidden rename eval _%@eval + + # Install all the registered psuedo-command implementations + + foreach cmd $initCommands { + eval $cmd + } + } + } + proc cleanup {} { + variable parser + interp delete $parser + unset parser + } +} + +# auto_mkindex_parser::mkindex -- +# +# Used by the "auto_mkindex" command to create a "tclIndex" file for the given +# Tcl source file. Executes the commands in the file, and handles things like +# the "proc" command by adding an entry for the index file. Returns a string +# that represents the index file. +# +# Arguments: +# file Name of Tcl source file to be indexed. + +proc auto_mkindex_parser::mkindex {file} { + variable parser + variable index + variable scriptFile + variable contextStack + variable imports + + set scriptFile $file + + set fid [open $file] + set contents [read $fid] + close $fid + + # There is one problem with sourcing files into the safe interpreter: + # references like "$x" will fail since code is not really being executed + # and variables do not really exist. To avoid this, we replace all $ with + # \0 (literally, the null char) later, when getting proc names we will + # have to reverse this replacement, in case there were any $ in the proc + # name. This will cause a problem if somebody actually tries to have a \0 + # in their proc name. Too bad for them. + set contents [string map [list \$ \0] $contents] + + set index "" + set contextStack "" + set imports "" + + $parser eval $contents + + foreach name $imports { + catch {$parser eval [list _%@namespace forget $name]} + } + return $index +} + +# auto_mkindex_parser::hook command +# +# Registers a Tcl command to evaluate when initializing the slave interpreter +# used by the mkindex parser. The command is evaluated in the master +# interpreter, and can use the variable auto_mkindex_parser::parser to get to +# the slave + +proc auto_mkindex_parser::hook {cmd} { + variable initCommands + + lappend initCommands $cmd +} + +# auto_mkindex_parser::slavehook command +# +# Registers a Tcl command to evaluate when initializing the slave interpreter +# used by the mkindex parser. The command is evaluated in the slave +# interpreter. + +proc auto_mkindex_parser::slavehook {cmd} { + variable initCommands + + # The $parser variable is defined to be the name of the slave interpreter + # when this command is used later. + + lappend initCommands "\$parser eval [list $cmd]" +} + +# auto_mkindex_parser::command -- +# +# Registers a new command with the "auto_mkindex_parser" interpreter that +# parses Tcl files. These commands are fake versions of things like the +# "proc" command. When you execute them, they simply write out an entry to a +# "tclIndex" file for auto-loading. +# +# This procedure allows extensions to register their own commands with the +# auto_mkindex facility. For example, a package like [incr Tcl] might +# register a "class" command so that class definitions could be added to a +# "tclIndex" file for auto-loading. +# +# Arguments: +# name Name of command recognized in Tcl files. +# arglist Argument list for command. +# body Implementation of command to handle indexing. + +proc auto_mkindex_parser::command {name arglist body} { + hook [list auto_mkindex_parser::commandInit $name $arglist $body] +} + +# auto_mkindex_parser::commandInit -- +# +# This does the actual work set up by auto_mkindex_parser::command. This is +# called when the interpreter used by the parser is created. +# +# Arguments: +# name Name of command recognized in Tcl files. +# arglist Argument list for command. +# body Implementation of command to handle indexing. + +proc auto_mkindex_parser::commandInit {name arglist body} { + variable parser + + set ns [namespace qualifiers $name] + set tail [namespace tail $name] + if {$ns eq ""} { + set fakeName [namespace current]::_%@fake_$tail + } else { + set fakeName [namespace current]::[string map {:: _} _%@fake_$name] + } + proc $fakeName $arglist $body + + # YUK! Tcl won't let us alias fully qualified command names, so we can't + # handle names like "::itcl::class". Instead, we have to build procs with + # the fully qualified names, and have the procs point to the aliases. + + if {[string match *::* $name]} { + set exportCmd [list _%@namespace export [namespace tail $name]] + $parser eval [list _%@namespace eval $ns $exportCmd] + + # The following proc definition does not work if you want to tolerate + # space or something else diabolical in the procedure name, (i.e., + # space in $alias). The following does not work: + # "_%@eval {$alias} \$args" + # because $alias gets concat'ed to $args. The following does not work + # because $cmd is somehow undefined + # "set cmd {$alias} \; _%@eval {\$cmd} \$args" + # A gold star to someone that can make test autoMkindex-3.3 work + # properly + + set alias [namespace tail $fakeName] + $parser invokehidden proc $name {args} "_%@eval {$alias} \$args" + $parser alias $alias $fakeName + } else { + $parser alias $name $fakeName + } + return +} + +# auto_mkindex_parser::fullname -- +# +# Used by commands like "proc" within the auto_mkindex parser. Returns the +# qualified namespace name for the "name" argument. If the "name" does not +# start with "::", elements are added from the current namespace stack to +# produce a qualified name. Then, the name is examined to see whether or not +# it should really be qualified. If the name has more than the leading "::", +# it is returned as a fully qualified name. Otherwise, it is returned as a +# simple name. That way, the Tcl autoloader will recognize it properly. +# +# Arguments: +# name - Name that is being added to index. + +proc auto_mkindex_parser::fullname {name} { + variable contextStack + + if {![string match ::* $name]} { + foreach ns $contextStack { + set name "${ns}::$name" + if {[string match ::* $name]} { + break + } + } + } + + if {[namespace qualifiers $name] eq ""} { + set name [namespace tail $name] + } elseif {![string match ::* $name]} { + set name "::$name" + } + + # Earlier, mkindex replaced all $'s with \0. Now, we have to reverse that + # replacement. + return [string map [list \0 \$] $name] +} + +# auto_mkindex_parser::indexEntry -- +# +# Used by commands like "proc" within the auto_mkindex parser to add a +# correctly-quoted entry to the index. This is shared code so it is done +# *right*, in one place. +# +# Arguments: +# name - Name that is being added to index. + +proc auto_mkindex_parser::indexEntry {name} { + variable index + variable scriptFile + + # We convert all metacharacters to their backslashed form, and pre-split + # the file name that we know about (which will be a proper list, and so + # correctly quoted). + + set name [string range [list \}[fullname $name]] 2 end] + set filenameParts [file split $scriptFile] + + append index [format \ + {set auto_index(%s) [list source [file join $dir %s]]%s} \ + $name $filenameParts \n] + return +} + +if {[llength $::auto_mkindex_parser::initCommands]} { + return +} + +# Register all of the procedures for the auto_mkindex parser that will build +# the "tclIndex" file. + +# AUTO MKINDEX: proc name arglist body +# Adds an entry to the auto index list for the given procedure name. + +auto_mkindex_parser::command proc {name args} { + indexEntry $name +} + +# Conditionally add support for Tcl byte code files. There are some tricky +# details here. First, we need to get the tbcload library initialized in the +# current interpreter. We cannot load tbcload into the slave until we have +# done so because it needs access to the tcl_patchLevel variable. Second, +# because the package index file may defer loading the library until we invoke +# a command, we need to explicitly invoke auto_load to force it to be loaded. +# This should be a noop if the package has already been loaded + +auto_mkindex_parser::hook { + try { + package require tbcload + } on error {} { + # OK, don't have it so do nothing + } on ok {} { + if {[namespace which -command tbcload::bcproc] eq ""} { + auto_load tbcload::bcproc + } + load {} tbcload $auto_mkindex_parser::parser + + # AUTO MKINDEX: tbcload::bcproc name arglist body + # Adds an entry to the auto index list for the given pre-compiled + # procedure name. + + auto_mkindex_parser::commandInit tbcload::bcproc {name args} { + indexEntry $name + } + } +} + +# AUTO MKINDEX: namespace eval name command ?arg arg...? +# Adds the namespace name onto the context stack and evaluates the associated +# body of commands. +# +# AUTO MKINDEX: namespace import ?-force? pattern ?pattern...? +# Performs the "import" action in the parser interpreter. This is important +# for any commands contained in a namespace that affect the index. For +# example, a script may say "itcl::class ...", or it may import "itcl::*" and +# then say "class ...". This procedure does the import operation, but keeps +# track of imported patterns so we can remove the imports later. + +auto_mkindex_parser::command namespace {op args} { + switch -- $op { + eval { + variable parser + variable contextStack + + set name [lindex $args 0] + set args [lrange $args 1 end] + + set contextStack [linsert $contextStack 0 $name] + $parser eval [list _%@namespace eval $name] $args + set contextStack [lrange $contextStack 1 end] + } + import { + variable parser + variable imports + foreach pattern $args { + if {$pattern ne "-force"} { + lappend imports $pattern + } + } + catch {$parser eval "_%@namespace import $args"} + } + ensemble { + variable parser + variable contextStack + if {[lindex $args 0] eq "create"} { + set name ::[join [lreverse $contextStack] ::] + catch { + set name [dict get [lrange $args 1 end] -command] + if {![string match ::* $name]} { + set name ::[join [lreverse $contextStack] ::]$name + } + regsub -all ::+ $name :: name + } + # create artifical proc to force an entry in the tclIndex + $parser eval [list ::proc $name {} {}] + } + } + } +} + +# AUTO MKINDEX: oo::class create name ?definition? +# Adds an entry to the auto index list for the given class name. +auto_mkindex_parser::command oo::class {op name {body ""}} { + if {$op eq "create"} { + indexEntry $name + } +} +auto_mkindex_parser::command class {op name {body ""}} { + if {$op eq "create"} { + indexEntry $name + } +} + +return diff --git a/env/tcl/tcl8.6/clock.tcl b/env/tcl/tcl8.6/clock.tcl new file mode 100644 index 0000000..8e4b657 --- /dev/null +++ b/env/tcl/tcl8.6/clock.tcl @@ -0,0 +1,4547 @@ +#---------------------------------------------------------------------- +# +# clock.tcl -- +# +# This file implements the portions of the [clock] ensemble that are +# coded in Tcl. Refer to the users' manual to see the description of +# the [clock] command and its subcommands. +# +# +#---------------------------------------------------------------------- +# +# Copyright (c) 2004,2005,2006,2007 by Kevin B. Kenny +# See the file "license.terms" for information on usage and redistribution +# of this file, and for a DISCLAIMER OF ALL WARRANTIES. +# +#---------------------------------------------------------------------- + +# We must have message catalogs that support the root locale, and we need +# access to the Registry on Windows systems. + +uplevel \#0 { + package require msgcat 1.6 + if { $::tcl_platform(platform) eq {windows} } { + if { [catch { package require registry 1.1 }] } { + namespace eval ::tcl::clock [list variable NoRegistry {}] + } + } +} + +# Put the library directory into the namespace for the ensemble so that the +# library code can find message catalogs and time zone definition files. + +namespace eval ::tcl::clock \ + [list variable LibDir [file dirname [info script]]] + +#---------------------------------------------------------------------- +# +# clock -- +# +# Manipulate times. +# +# The 'clock' command manipulates time. Refer to the user documentation for +# the available subcommands and what they do. +# +#---------------------------------------------------------------------- + +namespace eval ::tcl::clock { + + # Export the subcommands + + namespace export format + namespace export clicks + namespace export microseconds + namespace export milliseconds + namespace export scan + namespace export seconds + namespace export add + + # Import the message catalog commands that we use. + + namespace import ::msgcat::mcload + namespace import ::msgcat::mclocale + namespace import ::msgcat::mc + namespace import ::msgcat::mcpackagelocale + +} + +#---------------------------------------------------------------------- +# +# ::tcl::clock::Initialize -- +# +# Finish initializing the 'clock' subsystem +# +# Results: +# None. +# +# Side effects: +# Namespace variable in the 'clock' subsystem are initialized. +# +# The '::tcl::clock::Initialize' procedure initializes the namespace variables +# and root locale message catalog for the 'clock' subsystem. It is broken +# into a procedure rather than simply evaluated as a script so that it will be +# able to use local variables, avoiding the dangers of 'creative writing' as +# in Bug 1185933. +# +#---------------------------------------------------------------------- + +proc ::tcl::clock::Initialize {} { + + rename ::tcl::clock::Initialize {} + + variable LibDir + + # Define the Greenwich time zone + + proc InitTZData {} { + variable TZData + array unset TZData + set TZData(:Etc/GMT) { + {-9223372036854775808 0 0 GMT} + } + set TZData(:GMT) $TZData(:Etc/GMT) + set TZData(:Etc/UTC) { + {-9223372036854775808 0 0 UTC} + } + set TZData(:UTC) $TZData(:Etc/UTC) + set TZData(:localtime) {} + } + InitTZData + + mcpackagelocale set {} + ::msgcat::mcpackageconfig set mcfolder [file join $LibDir msgs] + ::msgcat::mcpackageconfig set unknowncmd "" + ::msgcat::mcpackageconfig set changecmd ChangeCurrentLocale + + # Define the message catalog for the root locale. + + ::msgcat::mcmset {} { + AM {am} + BCE {B.C.E.} + CE {C.E.} + DATE_FORMAT {%m/%d/%Y} + DATE_TIME_FORMAT {%a %b %e %H:%M:%S %Y} + DAYS_OF_WEEK_ABBREV { + Sun Mon Tue Wed Thu Fri Sat + } + DAYS_OF_WEEK_FULL { + Sunday Monday Tuesday Wednesday Thursday Friday Saturday + } + GREGORIAN_CHANGE_DATE 2299161 + LOCALE_DATE_FORMAT {%m/%d/%Y} + LOCALE_DATE_TIME_FORMAT {%a %b %e %H:%M:%S %Y} + LOCALE_ERAS {} + LOCALE_NUMERALS { + 00 01 02 03 04 05 06 07 08 09 + 10 11 12 13 14 15 16 17 18 19 + 20 21 22 23 24 25 26 27 28 29 + 30 31 32 33 34 35 36 37 38 39 + 40 41 42 43 44 45 46 47 48 49 + 50 51 52 53 54 55 56 57 58 59 + 60 61 62 63 64 65 66 67 68 69 + 70 71 72 73 74 75 76 77 78 79 + 80 81 82 83 84 85 86 87 88 89 + 90 91 92 93 94 95 96 97 98 99 + } + LOCALE_TIME_FORMAT {%H:%M:%S} + LOCALE_YEAR_FORMAT {%EC%Ey} + MONTHS_ABBREV { + Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec + } + MONTHS_FULL { + January February March + April May June + July August September + October November December + } + PM {pm} + TIME_FORMAT {%H:%M:%S} + TIME_FORMAT_12 {%I:%M:%S %P} + TIME_FORMAT_24 {%H:%M} + TIME_FORMAT_24_SECS {%H:%M:%S} + } + + # Define a few Gregorian change dates for other locales. In most cases + # the change date follows a language, because a nation's colonies changed + # at the same time as the nation itself. In many cases, different + # national boundaries existed; the dominating rule is to follow the + # nation's capital. + + # Italy, Spain, Portugal, Poland + + ::msgcat::mcset it GREGORIAN_CHANGE_DATE 2299161 + ::msgcat::mcset es GREGORIAN_CHANGE_DATE 2299161 + ::msgcat::mcset pt GREGORIAN_CHANGE_DATE 2299161 + ::msgcat::mcset pl GREGORIAN_CHANGE_DATE 2299161 + + # France, Austria + + ::msgcat::mcset fr GREGORIAN_CHANGE_DATE 2299227 + + # For Belgium, we follow Southern Netherlands; Liege Diocese changed + # several weeks later. + + ::msgcat::mcset fr_BE GREGORIAN_CHANGE_DATE 2299238 + ::msgcat::mcset nl_BE GREGORIAN_CHANGE_DATE 2299238 + + # Austria + + ::msgcat::mcset de_AT GREGORIAN_CHANGE_DATE 2299527 + + # Hungary + + ::msgcat::mcset hu GREGORIAN_CHANGE_DATE 2301004 + + # Germany, Norway, Denmark (Catholic Germany changed earlier) + + ::msgcat::mcset de_DE GREGORIAN_CHANGE_DATE 2342032 + ::msgcat::mcset nb GREGORIAN_CHANGE_DATE 2342032 + ::msgcat::mcset nn GREGORIAN_CHANGE_DATE 2342032 + ::msgcat::mcset no GREGORIAN_CHANGE_DATE 2342032 + ::msgcat::mcset da GREGORIAN_CHANGE_DATE 2342032 + + # Holland (Brabant, Gelderland, Flanders, Friesland, etc. changed at + # various times) + + ::msgcat::mcset nl GREGORIAN_CHANGE_DATE 2342165 + + # Protestant Switzerland (Catholic cantons changed earlier) + + ::msgcat::mcset fr_CH GREGORIAN_CHANGE_DATE 2361342 + ::msgcat::mcset it_CH GREGORIAN_CHANGE_DATE 2361342 + ::msgcat::mcset de_CH GREGORIAN_CHANGE_DATE 2361342 + + # English speaking countries + + ::msgcat::mcset en GREGORIAN_CHANGE_DATE 2361222 + + # Sweden (had several changes onto and off of the Gregorian calendar) + + ::msgcat::mcset sv GREGORIAN_CHANGE_DATE 2361390 + + # Russia + + ::msgcat::mcset ru GREGORIAN_CHANGE_DATE 2421639 + + # Romania (Transylvania changed earler - perhaps de_RO should show the + # earlier date?) + + ::msgcat::mcset ro GREGORIAN_CHANGE_DATE 2422063 + + # Greece + + ::msgcat::mcset el GREGORIAN_CHANGE_DATE 2423480 + + #------------------------------------------------------------------ + # + # CONSTANTS + # + #------------------------------------------------------------------ + + # Paths at which binary time zone data for the Olson libraries are known + # to reside on various operating systems + + variable ZoneinfoPaths {} + foreach path { + /usr/share/zoneinfo + /usr/share/lib/zoneinfo + /usr/lib/zoneinfo + /usr/local/etc/zoneinfo + } { + if { [file isdirectory $path] } { + lappend ZoneinfoPaths $path + } + } + + # Define the directories for time zone data and message catalogs. + + variable DataDir [file join $LibDir tzdata] + + # Number of days in the months, in common years and leap years. + + variable DaysInRomanMonthInCommonYear \ + { 31 28 31 30 31 30 31 31 30 31 30 31 } + variable DaysInRomanMonthInLeapYear \ + { 31 29 31 30 31 30 31 31 30 31 30 31 } + variable DaysInPriorMonthsInCommonYear [list 0] + variable DaysInPriorMonthsInLeapYear [list 0] + set i 0 + foreach j $DaysInRomanMonthInCommonYear { + lappend DaysInPriorMonthsInCommonYear [incr i $j] + } + set i 0 + foreach j $DaysInRomanMonthInLeapYear { + lappend DaysInPriorMonthsInLeapYear [incr i $j] + } + + # Another epoch (Hi, Jeff!) + + variable Roddenberry 1946 + + # Integer ranges + + variable MINWIDE -9223372036854775808 + variable MAXWIDE 9223372036854775807 + + # Day before Leap Day + + variable FEB_28 58 + + # Translation table to map Windows TZI onto cities, so that the Olson + # rules can apply. In some cases the mapping is ambiguous, so it's wise + # to specify $::env(TCL_TZ) rather than simply depending on the system + # time zone. + + # The keys are long lists of values obtained from the time zone + # information in the Registry. In order, the list elements are: + # Bias StandardBias DaylightBias + # StandardDate.wYear StandardDate.wMonth StandardDate.wDayOfWeek + # StandardDate.wDay StandardDate.wHour StandardDate.wMinute + # StandardDate.wSecond StandardDate.wMilliseconds + # DaylightDate.wYear DaylightDate.wMonth DaylightDate.wDayOfWeek + # DaylightDate.wDay DaylightDate.wHour DaylightDate.wMinute + # DaylightDate.wSecond DaylightDate.wMilliseconds + # The values are the names of time zones where those rules apply. There + # is considerable ambiguity in certain zones; an attempt has been made to + # make a reasonable guess, but this table needs to be taken with a grain + # of salt. + + variable WinZoneInfo [dict create {*}{ + {-43200 0 3600 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0} :Pacific/Kwajalein + {-39600 0 3600 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0} :Pacific/Midway + {-36000 0 3600 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0} :Pacific/Honolulu + {-32400 0 3600 0 11 0 1 2 0 0 0 0 3 0 2 2 0 0 0} :America/Anchorage + {-28800 0 3600 0 11 0 1 2 0 0 0 0 3 0 2 2 0 0 0} :America/Los_Angeles + {-28800 0 3600 0 10 0 5 2 0 0 0 0 4 0 1 2 0 0 0} :America/Tijuana + {-25200 0 3600 0 11 0 1 2 0 0 0 0 3 0 2 2 0 0 0} :America/Denver + {-25200 0 3600 0 10 0 5 2 0 0 0 0 4 0 1 2 0 0 0} :America/Chihuahua + {-25200 0 3600 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0} :America/Phoenix + {-21600 0 3600 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0} :America/Regina + {-21600 0 3600 0 11 0 1 2 0 0 0 0 3 0 2 2 0 0 0} :America/Chicago + {-21600 0 3600 0 10 0 5 2 0 0 0 0 4 0 1 2 0 0 0} :America/Mexico_City + {-18000 0 3600 0 11 0 1 2 0 0 0 0 3 0 2 2 0 0 0} :America/New_York + {-18000 0 3600 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0} :America/Indianapolis + {-14400 0 3600 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0} :America/Caracas + {-14400 0 3600 0 3 6 2 23 59 59 999 0 10 6 2 23 59 59 999} + :America/Santiago + {-14400 0 3600 0 2 0 5 2 0 0 0 0 11 0 1 2 0 0 0} :America/Manaus + {-14400 0 3600 0 11 0 1 2 0 0 0 0 3 0 2 2 0 0 0} :America/Halifax + {-12600 0 3600 0 10 0 5 2 0 0 0 0 4 0 1 2 0 0 0} :America/St_Johns + {-10800 0 3600 0 2 0 2 2 0 0 0 0 10 0 3 2 0 0 0} :America/Sao_Paulo + {-10800 0 3600 0 10 0 5 2 0 0 0 0 4 0 1 2 0 0 0} :America/Godthab + {-10800 0 3600 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0} :America/Buenos_Aires + {-10800 0 3600 0 2 0 5 2 0 0 0 0 11 0 1 2 0 0 0} :America/Bahia + {-10800 0 3600 0 3 0 2 2 0 0 0 0 10 0 1 2 0 0 0} :America/Montevideo + {-7200 0 3600 0 9 0 5 2 0 0 0 0 3 0 5 2 0 0 0} :America/Noronha + {-3600 0 3600 0 10 0 5 3 0 0 0 0 3 0 5 2 0 0 0} :Atlantic/Azores + {-3600 0 3600 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0} :Atlantic/Cape_Verde + {0 0 3600 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0} :UTC + {0 0 3600 0 10 0 5 2 0 0 0 0 3 0 5 1 0 0 0} :Europe/London + {3600 0 3600 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0} :Africa/Kinshasa + {3600 0 3600 0 10 0 5 3 0 0 0 0 3 0 5 2 0 0 0} :CET + {7200 0 3600 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0} :Africa/Harare + {7200 0 3600 0 9 4 5 23 59 59 0 0 4 4 5 23 59 59 0} + :Africa/Cairo + {7200 0 3600 0 10 0 5 4 0 0 0 0 3 0 5 3 0 0 0} :Europe/Helsinki + {7200 0 3600 0 9 0 3 2 0 0 0 0 3 5 5 2 0 0 0} :Asia/Jerusalem + {7200 0 3600 0 9 0 5 1 0 0 0 0 3 0 5 0 0 0 0} :Europe/Bucharest + {7200 0 3600 0 10 0 5 3 0 0 0 0 3 0 5 2 0 0 0} :Europe/Athens + {7200 0 3600 0 9 5 5 1 0 0 0 0 3 4 5 0 0 0 0} :Asia/Amman + {7200 0 3600 0 10 6 5 23 59 59 999 0 3 0 5 0 0 0 0} + :Asia/Beirut + {7200 0 -3600 0 4 0 1 2 0 0 0 0 9 0 1 2 0 0 0} :Africa/Windhoek + {10800 0 3600 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0} :Asia/Riyadh + {10800 0 3600 0 10 0 1 4 0 0 0 0 4 0 1 3 0 0 0} :Asia/Baghdad + {10800 0 3600 0 10 0 5 3 0 0 0 0 3 0 5 2 0 0 0} :Europe/Moscow + {12600 0 3600 0 9 2 4 2 0 0 0 0 3 0 1 2 0 0 0} :Asia/Tehran + {14400 0 3600 0 10 0 5 5 0 0 0 0 3 0 5 4 0 0 0} :Asia/Baku + {14400 0 3600 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0} :Asia/Muscat + {14400 0 3600 0 10 0 5 3 0 0 0 0 3 0 5 2 0 0 0} :Asia/Tbilisi + {16200 0 3600 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0} :Asia/Kabul + {18000 0 3600 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0} :Asia/Karachi + {18000 0 3600 0 10 0 5 3 0 0 0 0 3 0 5 2 0 0 0} :Asia/Yekaterinburg + {19800 0 3600 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0} :Asia/Calcutta + {20700 0 3600 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0} :Asia/Katmandu + {21600 0 3600 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0} :Asia/Dhaka + {21600 0 3600 0 10 0 5 3 0 0 0 0 3 0 5 2 0 0 0} :Asia/Novosibirsk + {23400 0 3600 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0} :Asia/Rangoon + {25200 0 3600 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0} :Asia/Bangkok + {25200 0 3600 0 10 0 5 3 0 0 0 0 3 0 5 2 0 0 0} :Asia/Krasnoyarsk + {28800 0 3600 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0} :Asia/Chongqing + {28800 0 3600 0 10 0 5 3 0 0 0 0 3 0 5 2 0 0 0} :Asia/Irkutsk + {32400 0 3600 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0} :Asia/Tokyo + {32400 0 3600 0 10 0 5 3 0 0 0 0 3 0 5 2 0 0 0} :Asia/Yakutsk + {34200 0 3600 0 3 0 5 3 0 0 0 0 10 0 5 2 0 0 0} :Australia/Adelaide + {34200 0 3600 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0} :Australia/Darwin + {36000 0 3600 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0} :Australia/Brisbane + {36000 0 3600 0 10 0 5 3 0 0 0 0 3 0 5 2 0 0 0} :Asia/Vladivostok + {36000 0 3600 0 3 0 5 3 0 0 0 0 10 0 1 2 0 0 0} :Australia/Hobart + {36000 0 3600 0 3 0 5 3 0 0 0 0 10 0 5 2 0 0 0} :Australia/Sydney + {39600 0 3600 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0} :Pacific/Noumea + {43200 0 3600 0 3 0 3 3 0 0 0 0 10 0 1 2 0 0 0} :Pacific/Auckland + {43200 0 3600 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0} :Pacific/Fiji + {46800 0 3600 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0} :Pacific/Tongatapu + }] + + # Groups of fields that specify the date, priorities, and code bursts that + # determine Julian Day Number given those groups. The code in [clock + # scan] will choose the highest priority (lowest numbered) set of fields + # that determines the date. + + variable DateParseActions { + + { seconds } 0 {} + + { julianDay } 1 {} + + { era century yearOfCentury month dayOfMonth } 2 { + dict set date year [expr { 100 * [dict get $date century] + + [dict get $date yearOfCentury] }] + set date [GetJulianDayFromEraYearMonthDay $date[set date {}] \ + $changeover] + } + { era century yearOfCentury dayOfYear } 2 { + dict set date year [expr { 100 * [dict get $date century] + + [dict get $date yearOfCentury] }] + set date [GetJulianDayFromEraYearDay $date[set date {}] \ + $changeover] + } + + { century yearOfCentury month dayOfMonth } 3 { + dict set date era CE + dict set date year [expr { 100 * [dict get $date century] + + [dict get $date yearOfCentury] }] + set date [GetJulianDayFromEraYearMonthDay $date[set date {}] \ + $changeover] + } + { century yearOfCentury dayOfYear } 3 { + dict set date era CE + dict set date year [expr { 100 * [dict get $date century] + + [dict get $date yearOfCentury] }] + set date [GetJulianDayFromEraYearDay $date[set date {}] \ + $changeover] + } + { iso8601Century iso8601YearOfCentury iso8601Week dayOfWeek } 3 { + dict set date era CE + dict set date iso8601Year \ + [expr { 100 * [dict get $date iso8601Century] + + [dict get $date iso8601YearOfCentury] }] + set date [GetJulianDayFromEraYearWeekDay $date[set date {}] \ + $changeover] + } + + { yearOfCentury month dayOfMonth } 4 { + set date [InterpretTwoDigitYear $date[set date {}] $baseTime] + dict set date era CE + set date [GetJulianDayFromEraYearMonthDay $date[set date {}] \ + $changeover] + } + { yearOfCentury dayOfYear } 4 { + set date [InterpretTwoDigitYear $date[set date {}] $baseTime] + dict set date era CE + set date [GetJulianDayFromEraYearDay $date[set date {}] \ + $changeover] + } + { iso8601YearOfCentury iso8601Week dayOfWeek } 4 { + set date [InterpretTwoDigitYear \ + $date[set date {}] $baseTime \ + iso8601YearOfCentury iso8601Year] + dict set date era CE + set date [GetJulianDayFromEraYearWeekDay $date[set date {}] \ + $changeover] + } + + { month dayOfMonth } 5 { + set date [AssignBaseYear $date[set date {}] \ + $baseTime $timeZone $changeover] + set date [GetJulianDayFromEraYearMonthDay $date[set date {}] \ + $changeover] + } + { dayOfYear } 5 { + set date [AssignBaseYear $date[set date {}] \ + $baseTime $timeZone $changeover] + set date [GetJulianDayFromEraYearDay $date[set date {}] \ + $changeover] + } + { iso8601Week dayOfWeek } 5 { + set date [AssignBaseIso8601Year $date[set date {}] \ + $baseTime $timeZone $changeover] + set date [GetJulianDayFromEraYearWeekDay $date[set date {}] \ + $changeover] + } + + { dayOfMonth } 6 { + set date [AssignBaseMonth $date[set date {}] \ + $baseTime $timeZone $changeover] + set date [GetJulianDayFromEraYearMonthDay $date[set date {}] \ + $changeover] + } + + { dayOfWeek } 7 { + set date [AssignBaseWeek $date[set date {}] \ + $baseTime $timeZone $changeover] + set date [GetJulianDayFromEraYearWeekDay $date[set date {}] \ + $changeover] + } + + {} 8 { + set date [AssignBaseJulianDay $date[set date {}] \ + $baseTime $timeZone $changeover] + } + } + + # Groups of fields that specify time of day, priorities, and code that + # processes them + + variable TimeParseActions { + + seconds 1 {} + + { hourAMPM minute second amPmIndicator } 2 { + dict set date secondOfDay [InterpretHMSP $date] + } + { hour minute second } 2 { + dict set date secondOfDay [InterpretHMS $date] + } + + { hourAMPM minute amPmIndicator } 3 { + dict set date second 0 + dict set date secondOfDay [InterpretHMSP $date] + } + { hour minute } 3 { + dict set date second 0 + dict set date secondOfDay [InterpretHMS $date] + } + + { hourAMPM amPmIndicator } 4 { + dict set date minute 0 + dict set date second 0 + dict set date secondOfDay [InterpretHMSP $date] + } + { hour } 4 { + dict set date minute 0 + dict set date second 0 + dict set date secondOfDay [InterpretHMS $date] + } + + { } 5 { + dict set date secondOfDay 0 + } + } + + # Legacy time zones, used primarily for parsing RFC822 dates. + + variable LegacyTimeZone [dict create \ + gmt +0000 \ + ut +0000 \ + utc +0000 \ + bst +0100 \ + wet +0000 \ + wat -0100 \ + at -0200 \ + nft -0330 \ + nst -0330 \ + ndt -0230 \ + ast -0400 \ + adt -0300 \ + est -0500 \ + edt -0400 \ + cst -0600 \ + cdt -0500 \ + mst -0700 \ + mdt -0600 \ + pst -0800 \ + pdt -0700 \ + yst -0900 \ + ydt -0800 \ + hst -1000 \ + hdt -0900 \ + cat -1000 \ + ahst -1000 \ + nt -1100 \ + idlw -1200 \ + cet +0100 \ + cest +0200 \ + met +0100 \ + mewt +0100 \ + mest +0200 \ + swt +0100 \ + sst +0200 \ + fwt +0100 \ + fst +0200 \ + eet +0200 \ + eest +0300 \ + bt +0300 \ + it +0330 \ + zp4 +0400 \ + zp5 +0500 \ + ist +0530 \ + zp6 +0600 \ + wast +0700 \ + wadt +0800 \ + jt +0730 \ + cct +0800 \ + jst +0900 \ + kst +0900 \ + cast +0930 \ + jdt +1000 \ + kdt +1000 \ + cadt +1030 \ + east +1000 \ + eadt +1030 \ + gst +1000 \ + nzt +1200 \ + nzst +1200 \ + nzdt +1300 \ + idle +1200 \ + a +0100 \ + b +0200 \ + c +0300 \ + d +0400 \ + e +0500 \ + f +0600 \ + g +0700 \ + h +0800 \ + i +0900 \ + k +1000 \ + l +1100 \ + m +1200 \ + n -0100 \ + o -0200 \ + p -0300 \ + q -0400 \ + r -0500 \ + s -0600 \ + t -0700 \ + u -0800 \ + v -0900 \ + w -1000 \ + x -1100 \ + y -1200 \ + z +0000 \ + ] + + # Caches + + variable LocaleNumeralCache {}; # Dictionary whose keys are locale + # names and whose values are pairs + # comprising regexes matching numerals + # in the given locales and dictionaries + # mapping the numerals to their numeric + # values. + # variable CachedSystemTimeZone; # If 'CachedSystemTimeZone' exists, + # it contains the value of the + # system time zone, as determined from + # the environment. + variable TimeZoneBad {}; # Dictionary whose keys are time zone + # names and whose values are 1 if + # the time zone is unknown and 0 + # if it is known. + variable TZData; # Array whose keys are time zone names + # and whose values are lists of quads + # comprising start time, UTC offset, + # Daylight Saving Time indicator, and + # time zone abbreviation. + variable FormatProc; # Array mapping format group + # and locale to the name of a procedure + # that renders the given format +} +::tcl::clock::Initialize + +#---------------------------------------------------------------------- +# +# clock format -- +# +# Formats a count of seconds since the Posix Epoch as a time of day. +# +# The 'clock format' command formats times of day for output. Refer to the +# user documentation to see what it does. +# +#---------------------------------------------------------------------- + +proc ::tcl::clock::format { args } { + + variable FormatProc + variable TZData + + lassign [ParseFormatArgs {*}$args] format locale timezone + set locale [string tolower $locale] + set clockval [lindex $args 0] + + # Get the data for time changes in the given zone + + if {$timezone eq ""} { + set timezone [GetSystemTimeZone] + } + if {![info exists TZData($timezone)]} { + if {[catch {SetupTimeZone $timezone} retval opts]} { + dict unset opts -errorinfo + return -options $opts $retval + } + } + + # Build a procedure to format the result. Cache the built procedure's name + # in the 'FormatProc' array to avoid losing its internal representation, + # which contains the name resolution. + + set procName formatproc'$format'$locale + set procName [namespace current]::[string map {: {\:} \\ {\\}} $procName] + if {[info exists FormatProc($procName)]} { + set procName $FormatProc($procName) + } else { + set FormatProc($procName) \ + [ParseClockFormatFormat $procName $format $locale] + } + + return [$procName $clockval $timezone] + +} + +#---------------------------------------------------------------------- +# +# ParseClockFormatFormat -- +# +# Builds and caches a procedure that formats a time value. +# +# Parameters: +# format -- Format string to use +# locale -- Locale in which the format string is to be interpreted +# +# Results: +# Returns the name of the newly-built procedure. +# +#---------------------------------------------------------------------- + +proc ::tcl::clock::ParseClockFormatFormat {procName format locale} { + + if {[namespace which $procName] ne {}} { + return $procName + } + + # Map away the locale-dependent composite format groups + + EnterLocale $locale + + # Change locale if a fresh locale has been given on the command line. + + try { + return [ParseClockFormatFormat2 $format $locale $procName] + } trap CLOCK {result opts} { + dict unset opts -errorinfo + return -options $opts $result + } +} + +proc ::tcl::clock::ParseClockFormatFormat2 {format locale procName} { + set didLocaleEra 0 + set didLocaleNumerals 0 + set preFormatCode \ + [string map [list @GREGORIAN_CHANGE_DATE@ \ + [mc GREGORIAN_CHANGE_DATE]] \ + { + variable TZData + set date [GetDateFields $clockval \ + $TZData($timezone) \ + @GREGORIAN_CHANGE_DATE@] + }] + set formatString {} + set substituents {} + set state {} + + set format [LocalizeFormat $locale $format] + + foreach char [split $format {}] { + switch -exact -- $state { + {} { + if { [string equal % $char] } { + set state percent + } else { + append formatString $char + } + } + percent { # Character following a '%' character + set state {} + switch -exact -- $char { + % { # A literal character, '%' + append formatString %% + } + a { # Day of week, abbreviated + append formatString %s + append substituents \ + [string map \ + [list @DAYS_OF_WEEK_ABBREV@ \ + [list [mc DAYS_OF_WEEK_ABBREV]]] \ + { [lindex @DAYS_OF_WEEK_ABBREV@ \ + [expr {[dict get $date dayOfWeek] \ + % 7}]]}] + } + A { # Day of week, spelt out. + append formatString %s + append substituents \ + [string map \ + [list @DAYS_OF_WEEK_FULL@ \ + [list [mc DAYS_OF_WEEK_FULL]]] \ + { [lindex @DAYS_OF_WEEK_FULL@ \ + [expr {[dict get $date dayOfWeek] \ + % 7}]]}] + } + b - h { # Name of month, abbreviated. + append formatString %s + append substituents \ + [string map \ + [list @MONTHS_ABBREV@ \ + [list [mc MONTHS_ABBREV]]] \ + { [lindex @MONTHS_ABBREV@ \ + [expr {[dict get $date month]-1}]]}] + } + B { # Name of month, spelt out + append formatString %s + append substituents \ + [string map \ + [list @MONTHS_FULL@ \ + [list [mc MONTHS_FULL]]] \ + { [lindex @MONTHS_FULL@ \ + [expr {[dict get $date month]-1}]]}] + } + C { # Century number + append formatString %02d + append substituents \ + { [expr {[dict get $date year] / 100}]} + } + d { # Day of month, with leading zero + append formatString %02d + append substituents { [dict get $date dayOfMonth]} + } + e { # Day of month, without leading zero + append formatString %2d + append substituents { [dict get $date dayOfMonth]} + } + E { # Format group in a locale-dependent + # alternative era + set state percentE + if {!$didLocaleEra} { + append preFormatCode \ + [string map \ + [list @LOCALE_ERAS@ \ + [list [mc LOCALE_ERAS]]] \ + { + set date [GetLocaleEra \ + $date[set date {}] \ + @LOCALE_ERAS@]}] \n + set didLocaleEra 1 + } + if {!$didLocaleNumerals} { + append preFormatCode \ + [list set localeNumerals \ + [mc LOCALE_NUMERALS]] \n + set didLocaleNumerals 1 + } + } + g { # Two-digit year relative to ISO8601 + # week number + append formatString %02d + append substituents \ + { [expr { [dict get $date iso8601Year] % 100 }]} + } + G { # Four-digit year relative to ISO8601 + # week number + append formatString %02d + append substituents { [dict get $date iso8601Year]} + } + H { # Hour in the 24-hour day, leading zero + append formatString %02d + append substituents \ + { [expr { [dict get $date localSeconds] \ + / 3600 % 24}]} + } + I { # Hour AM/PM, with leading zero + append formatString %02d + append substituents \ + { [expr { ( ( ( [dict get $date localSeconds] \ + % 86400 ) \ + + 86400 \ + - 3600 ) \ + / 3600 ) \ + % 12 + 1 }] } + } + j { # Day of year (001-366) + append formatString %03d + append substituents { [dict get $date dayOfYear]} + } + J { # Julian Day Number + append formatString %07ld + append substituents { [dict get $date julianDay]} + } + k { # Hour (0-23), no leading zero + append formatString %2d + append substituents \ + { [expr { [dict get $date localSeconds] + / 3600 + % 24 }]} + } + l { # Hour (12-11), no leading zero + append formatString %2d + append substituents \ + { [expr { ( ( ( [dict get $date localSeconds] + % 86400 ) + + 86400 + - 3600 ) + / 3600 ) + % 12 + 1 }]} + } + m { # Month number, leading zero + append formatString %02d + append substituents { [dict get $date month]} + } + M { # Minute of the hour, leading zero + append formatString %02d + append substituents \ + { [expr { [dict get $date localSeconds] + / 60 + % 60 }]} + } + n { # A literal newline + append formatString \n + } + N { # Month number, no leading zero + append formatString %2d + append substituents { [dict get $date month]} + } + O { # A format group in the locale's + # alternative numerals + set state percentO + if {!$didLocaleNumerals} { + append preFormatCode \ + [list set localeNumerals \ + [mc LOCALE_NUMERALS]] \n + set didLocaleNumerals 1 + } + } + p { # Localized 'AM' or 'PM' indicator + # converted to uppercase + append formatString %s + append preFormatCode \ + [list set AM [string toupper [mc AM]]] \n \ + [list set PM [string toupper [mc PM]]] \n + append substituents \ + { [expr {(([dict get $date localSeconds] + % 86400) < 43200) ? + $AM : $PM}]} + } + P { # Localized 'AM' or 'PM' indicator + append formatString %s + append preFormatCode \ + [list set am [mc AM]] \n \ + [list set pm [mc PM]] \n + append substituents \ + { [expr {(([dict get $date localSeconds] + % 86400) < 43200) ? + $am : $pm}]} + + } + Q { # Hi, Jeff! + append formatString %s + append substituents { [FormatStarDate $date]} + } + s { # Seconds from the Posix Epoch + append formatString %s + append substituents { [dict get $date seconds]} + } + S { # Second of the minute, with + # leading zero + append formatString %02d + append substituents \ + { [expr { [dict get $date localSeconds] + % 60 }]} + } + t { # A literal tab character + append formatString \t + } + u { # Day of the week (1-Monday, 7-Sunday) + append formatString %1d + append substituents { [dict get $date dayOfWeek]} + } + U { # Week of the year (00-53). The + # first Sunday of the year is the + # first day of week 01 + append formatString %02d + append preFormatCode { + set dow [dict get $date dayOfWeek] + if { $dow == 7 } { + set dow 0 + } + incr dow + set UweekNumber \ + [expr { ( [dict get $date dayOfYear] + - $dow + 7 ) + / 7 }] + } + append substituents { $UweekNumber} + } + V { # The ISO8601 week number + append formatString %02d + append substituents { [dict get $date iso8601Week]} + } + w { # Day of the week (0-Sunday, + # 6-Saturday) + append formatString %1d + append substituents \ + { [expr { [dict get $date dayOfWeek] % 7 }]} + } + W { # Week of the year (00-53). The first + # Monday of the year is the first day + # of week 01. + append preFormatCode { + set WweekNumber \ + [expr { ( [dict get $date dayOfYear] + - [dict get $date dayOfWeek] + + 7 ) + / 7 }] + } + append formatString %02d + append substituents { $WweekNumber} + } + y { # The two-digit year of the century + append formatString %02d + append substituents \ + { [expr { [dict get $date year] % 100 }]} + } + Y { # The four-digit year + append formatString %04d + append substituents { [dict get $date year]} + } + z { # The time zone as hours and minutes + # east (+) or west (-) of Greenwich + append formatString %s + append substituents { [FormatNumericTimeZone \ + [dict get $date tzOffset]]} + } + Z { # The name of the time zone + append formatString %s + append substituents { [dict get $date tzName]} + } + % { # A literal percent character + append formatString %% + } + default { # An unknown escape sequence + append formatString %% $char + } + } + } + percentE { # Character following %E + set state {} + switch -exact -- $char { + E { + append formatString %s + append substituents { } \ + [string map \ + [list @BCE@ [list [mc BCE]] \ + @CE@ [list [mc CE]]] \ + {[dict get {BCE @BCE@ CE @CE@} \ + [dict get $date era]]}] + } + C { # Locale-dependent era + append formatString %s + append substituents { [dict get $date localeEra]} + } + y { # Locale-dependent year of the era + append preFormatCode { + set y [dict get $date localeYear] + if { $y >= 0 && $y < 100 } { + set Eyear [lindex $localeNumerals $y] + } else { + set Eyear $y + } + } + append formatString %s + append substituents { $Eyear} + } + default { # Unknown %E format group + append formatString %%E $char + } + } + } + percentO { # Character following %O + set state {} + switch -exact -- $char { + d - e { # Day of the month in alternative + # numerals + append formatString %s + append substituents \ + { [lindex $localeNumerals \ + [dict get $date dayOfMonth]]} + } + H - k { # Hour of the day in alternative + # numerals + append formatString %s + append substituents \ + { [lindex $localeNumerals \ + [expr { [dict get $date localSeconds] + / 3600 + % 24 }]]} + } + I - l { # Hour (12-11) AM/PM in alternative + # numerals + append formatString %s + append substituents \ + { [lindex $localeNumerals \ + [expr { ( ( ( [dict get $date localSeconds] + % 86400 ) + + 86400 + - 3600 ) + / 3600 ) + % 12 + 1 }]]} + } + m { # Month number in alternative numerals + append formatString %s + append substituents \ + { [lindex $localeNumerals [dict get $date month]]} + } + M { # Minute of the hour in alternative + # numerals + append formatString %s + append substituents \ + { [lindex $localeNumerals \ + [expr { [dict get $date localSeconds] + / 60 + % 60 }]]} + } + S { # Second of the minute in alternative + # numerals + append formatString %s + append substituents \ + { [lindex $localeNumerals \ + [expr { [dict get $date localSeconds] + % 60 }]]} + } + u { # Day of the week (Monday=1,Sunday=7) + # in alternative numerals + append formatString %s + append substituents \ + { [lindex $localeNumerals \ + [dict get $date dayOfWeek]]} + } + w { # Day of the week (Sunday=0,Saturday=6) + # in alternative numerals + append formatString %s + append substituents \ + { [lindex $localeNumerals \ + [expr { [dict get $date dayOfWeek] % 7 }]]} + } + y { # Year of the century in alternative + # numerals + append formatString %s + append substituents \ + { [lindex $localeNumerals \ + [expr { [dict get $date year] % 100 }]]} + } + default { # Unknown format group + append formatString %%O $char + } + } + } + } + } + + # Clean up any improperly terminated groups + + switch -exact -- $state { + percent { + append formatString %% + } + percentE { + append retval %%E + } + percentO { + append retval %%O + } + } + + proc $procName {clockval timezone} " + $preFormatCode + return \[::format [list $formatString] $substituents\] + " + + # puts [list $procName [info args $procName] [info body $procName]] + + return $procName +} + +#---------------------------------------------------------------------- +# +# clock scan -- +# +# Inputs a count of seconds since the Posix Epoch as a time of day. +# +# The 'clock format' command scans times of day on input. Refer to the user +# documentation to see what it does. +# +#---------------------------------------------------------------------- + +proc ::tcl::clock::scan { args } { + + set format {} + + # Check the count of args + + if { [llength $args] < 1 || [llength $args] % 2 != 1 } { + set cmdName "clock scan" + return -code error \ + -errorcode [list CLOCK wrongNumArgs] \ + "wrong \# args: should be\ + \"$cmdName string\ + ?-base seconds?\ + ?-format string? ?-gmt boolean?\ + ?-locale LOCALE? ?-timezone ZONE?\"" + } + + # Set defaults + + set base [clock seconds] + set string [lindex $args 0] + set format {} + set gmt 0 + set locale c + set timezone [GetSystemTimeZone] + + # Pick up command line options. + + foreach { flag value } [lreplace $args 0 0] { + set saw($flag) {} + switch -exact -- $flag { + -b - -ba - -bas - -base { + set base $value + } + -f - -fo - -for - -form - -forma - -format { + set format $value + } + -g - -gm - -gmt { + set gmt $value + } + -l - -lo - -loc - -loca - -local - -locale { + set locale [string tolower $value] + } + -t - -ti - -tim - -time - -timez - -timezo - -timezon - -timezone { + set timezone $value + } + default { + return -code error \ + -errorcode [list CLOCK badOption $flag] \ + "bad option \"$flag\",\ + must be -base, -format, -gmt, -locale or -timezone" + } + } + } + + # Check options for validity + + if { [info exists saw(-gmt)] && [info exists saw(-timezone)] } { + return -code error \ + -errorcode [list CLOCK gmtWithTimezone] \ + "cannot use -gmt and -timezone in same call" + } + if { [catch { expr { wide($base) } } result] } { + return -code error "expected integer but got \"$base\"" + } + if { ![string is boolean -strict $gmt] } { + return -code error "expected boolean value but got \"$gmt\"" + } elseif { $gmt } { + set timezone :GMT + } + + if { ![info exists saw(-format)] } { + # Perhaps someday we'll localize the legacy code. Right now, it's not + # localized. + if { [info exists saw(-locale)] } { + return -code error \ + -errorcode [list CLOCK flagWithLegacyFormat] \ + "legacy \[clock scan\] does not support -locale" + + } + return [FreeScan $string $base $timezone $locale] + } + + # Change locale if a fresh locale has been given on the command line. + + EnterLocale $locale + + try { + # Map away the locale-dependent composite format groups + + set scanner [ParseClockScanFormat $format $locale] + return [$scanner $string $base $timezone] + } trap CLOCK {result opts} { + # Conceal location of generation of expected errors + dict unset opts -errorinfo + return -options $opts $result + } +} + +#---------------------------------------------------------------------- +# +# FreeScan -- +# +# Scans a time in free format +# +# Parameters: +# string - String containing the time to scan +# base - Base time, expressed in seconds from the Epoch +# timezone - Default time zone in which the time will be expressed +# locale - (Unused) Name of the locale where the time will be scanned. +# +# Results: +# Returns the date and time extracted from the string in seconds from +# the epoch +# +#---------------------------------------------------------------------- + +proc ::tcl::clock::FreeScan { string base timezone locale } { + + variable TZData + + # Get the data for time changes in the given zone + + try { + SetupTimeZone $timezone + } on error {retval opts} { + dict unset opts -errorinfo + return -options $opts $retval + } + + # Extract year, month and day from the base time for the parser to use as + # defaults + + set date [GetDateFields $base $TZData($timezone) 2361222] + dict set date secondOfDay [expr { + [dict get $date localSeconds] % 86400 + }] + + # Parse the date. The parser will return a list comprising date, time, + # time zone, relative month/day/seconds, relative weekday, ordinal month. + + try { + set scanned [Oldscan $string \ + [dict get $date year] \ + [dict get $date month] \ + [dict get $date dayOfMonth]] + lassign $scanned \ + parseDate parseTime parseZone parseRel \ + parseWeekday parseOrdinalMonth + } on error message { + return -code error \ + "unable to convert date-time string \"$string\": $message" + } + + # If the caller supplied a date in the string, update the 'date' dict with + # the value. If the caller didn't specify a time with the date, default to + # midnight. + + if { [llength $parseDate] > 0 } { + lassign $parseDate y m d + if { $y < 100 } { + if { $y >= 39 } { + incr y 1900 + } else { + incr y 2000 + } + } + dict set date era CE + dict set date year $y + dict set date month $m + dict set date dayOfMonth $d + if { $parseTime eq {} } { + set parseTime 0 + } + } + + # If the caller supplied a time zone in the string, it comes back as a + # two-element list; the first element is the number of minutes east of + # Greenwich, and the second is a Daylight Saving Time indicator (1 == yes, + # 0 == no, -1 == unknown). We make it into a time zone indicator of + # +-hhmm. + + if { [llength $parseZone] > 0 } { + lassign $parseZone minEast dstFlag + set timezone [FormatNumericTimeZone \ + [expr { 60 * $minEast + 3600 * $dstFlag }]] + SetupTimeZone $timezone + } + dict set date tzName $timezone + + # Assemble date, time, zone into seconds-from-epoch + + set date [GetJulianDayFromEraYearMonthDay $date[set date {}] 2361222] + if { $parseTime ne {} } { + dict set date secondOfDay $parseTime + } elseif { [llength $parseWeekday] != 0 + || [llength $parseOrdinalMonth] != 0 + || ( [llength $parseRel] != 0 + && ( [lindex $parseRel 0] != 0 + || [lindex $parseRel 1] != 0 ) ) } { + dict set date secondOfDay 0 + } + + dict set date localSeconds [expr { + -210866803200 + + ( 86400 * wide([dict get $date julianDay]) ) + + [dict get $date secondOfDay] + }] + dict set date tzName $timezone + set date [ConvertLocalToUTC $date[set date {}] $TZData($timezone) 2361222] + set seconds [dict get $date seconds] + + # Do relative times + + if { [llength $parseRel] > 0 } { + lassign $parseRel relMonth relDay relSecond + set seconds [add $seconds \ + $relMonth months $relDay days $relSecond seconds \ + -timezone $timezone -locale $locale] + } + + # Do relative weekday + + if { [llength $parseWeekday] > 0 } { + lassign $parseWeekday dayOrdinal dayOfWeek + set date2 [GetDateFields $seconds $TZData($timezone) 2361222] + dict set date2 era CE + set jdwkday [WeekdayOnOrBefore $dayOfWeek [expr { + [dict get $date2 julianDay] + 6 + }]] + incr jdwkday [expr { 7 * $dayOrdinal }] + if { $dayOrdinal > 0 } { + incr jdwkday -7 + } + dict set date2 secondOfDay \ + [expr { [dict get $date2 localSeconds] % 86400 }] + dict set date2 julianDay $jdwkday + dict set date2 localSeconds [expr { + -210866803200 + + ( 86400 * wide([dict get $date2 julianDay]) ) + + [dict get $date secondOfDay] + }] + dict set date2 tzName $timezone + set date2 [ConvertLocalToUTC $date2[set date2 {}] $TZData($timezone) \ + 2361222] + set seconds [dict get $date2 seconds] + + } + + # Do relative month + + if { [llength $parseOrdinalMonth] > 0 } { + lassign $parseOrdinalMonth monthOrdinal monthNumber + if { $monthOrdinal > 0 } { + set monthDiff [expr { $monthNumber - [dict get $date month] }] + if { $monthDiff <= 0 } { + incr monthDiff 12 + } + incr monthOrdinal -1 + } else { + set monthDiff [expr { [dict get $date month] - $monthNumber }] + if { $monthDiff >= 0 } { + incr monthDiff -12 + } + incr monthOrdinal + } + set seconds [add $seconds $monthOrdinal years $monthDiff months \ + -timezone $timezone -locale $locale] + } + + return $seconds +} + + +#---------------------------------------------------------------------- +# +# ParseClockScanFormat -- +# +# Parses a format string given to [clock scan -format] +# +# Parameters: +# formatString - The format being parsed +# locale - The current locale +# +# Results: +# Constructs and returns a procedure that accepts the string being +# scanned, the base time, and the time zone. The procedure will either +# return the scanned time or else throw an error that should be rethrown +# to the caller of [clock scan] +# +# Side effects: +# The given procedure is defined in the ::tcl::clock namespace. Scan +# procedures are not deleted once installed. +# +# Why do we parse dates by defining a procedure to parse them? The reason is +# that by doing so, we have one convenient place to cache all the information: +# the regular expressions that match the patterns (which will be compiled), +# the code that assembles the date information, everything lands in one place. +# In this way, when a given format is reused at run time, all the information +# of how to apply it is available in a single place. +# +#---------------------------------------------------------------------- + +proc ::tcl::clock::ParseClockScanFormat {formatString locale} { + # Check whether the format has been parsed previously, and return the + # existing recognizer if it has. + + set procName scanproc'$formatString'$locale + set procName [namespace current]::[string map {: {\:} \\ {\\}} $procName] + if { [namespace which $procName] != {} } { + return $procName + } + + variable DateParseActions + variable TimeParseActions + + # Localize the %x, %X, etc. groups + + set formatString [LocalizeFormat $locale $formatString] + + # Condense whitespace + + regsub -all {[[:space:]]+} $formatString { } formatString + + # Walk through the groups of the format string. In this loop, we + # accumulate: + # - a regular expression that matches the string, + # - the count of capturing brackets in the regexp + # - a set of code that post-processes the fields captured by the regexp, + # - a dictionary whose keys are the names of fields that are present + # in the format string. + + set re {^[[:space:]]*} + set captureCount 0 + set postcode {} + set fieldSet [dict create] + set fieldCount 0 + set postSep {} + set state {} + + foreach c [split $formatString {}] { + switch -exact -- $state { + {} { + if { $c eq "%" } { + set state % + } elseif { $c eq " " } { + append re {[[:space:]]+} + } else { + if { ! [string is alnum $c] } { + append re "\\" + } + append re $c + } + } + % { + set state {} + switch -exact -- $c { + % { + append re % + } + { } { + append re "\[\[:space:\]\]*" + } + a - A { # Day of week, in words + set l {} + foreach \ + i {7 1 2 3 4 5 6} \ + abr [mc DAYS_OF_WEEK_ABBREV] \ + full [mc DAYS_OF_WEEK_FULL] { + dict set l [string tolower $abr] $i + dict set l [string tolower $full] $i + incr i + } + lassign [UniquePrefixRegexp $l] regex lookup + append re ( $regex ) + dict set fieldSet dayOfWeek [incr fieldCount] + append postcode "dict set date dayOfWeek \[" \ + "dict get " [list $lookup] " " \ + \[ {string tolower $field} [incr captureCount] \] \ + "\]\n" + } + b - B - h { # Name of month + set i 0 + set l {} + foreach \ + abr [mc MONTHS_ABBREV] \ + full [mc MONTHS_FULL] { + incr i + dict set l [string tolower $abr] $i + dict set l [string tolower $full] $i + } + lassign [UniquePrefixRegexp $l] regex lookup + append re ( $regex ) + dict set fieldSet month [incr fieldCount] + append postcode "dict set date month \[" \ + "dict get " [list $lookup] \ + " " \[ {string tolower $field} \ + [incr captureCount] \] \ + "\]\n" + } + C { # Gregorian century + append re \\s*(\\d\\d?) + dict set fieldSet century [incr fieldCount] + append postcode "dict set date century \[" \ + "::scan \$field" [incr captureCount] " %d" \ + "\]\n" + } + d - e { # Day of month + append re \\s*(\\d\\d?) + dict set fieldSet dayOfMonth [incr fieldCount] + append postcode "dict set date dayOfMonth \[" \ + "::scan \$field" [incr captureCount] " %d" \ + "\]\n" + } + E { # Prefix for locale-specific codes + set state %E + } + g { # ISO8601 2-digit year + append re \\s*(\\d\\d) + dict set fieldSet iso8601YearOfCentury \ + [incr fieldCount] + append postcode \ + "dict set date iso8601YearOfCentury \[" \ + "::scan \$field" [incr captureCount] " %d" \ + "\]\n" + } + G { # ISO8601 4-digit year + append re \\s*(\\d\\d)(\\d\\d) + dict set fieldSet iso8601Century [incr fieldCount] + dict set fieldSet iso8601YearOfCentury \ + [incr fieldCount] + append postcode \ + "dict set date iso8601Century \[" \ + "::scan \$field" [incr captureCount] " %d" \ + "\]\n" \ + "dict set date iso8601YearOfCentury \[" \ + "::scan \$field" [incr captureCount] " %d" \ + "\]\n" + } + H - k { # Hour of day + append re \\s*(\\d\\d?) + dict set fieldSet hour [incr fieldCount] + append postcode "dict set date hour \[" \ + "::scan \$field" [incr captureCount] " %d" \ + "\]\n" + } + I - l { # Hour, AM/PM + append re \\s*(\\d\\d?) + dict set fieldSet hourAMPM [incr fieldCount] + append postcode "dict set date hourAMPM \[" \ + "::scan \$field" [incr captureCount] " %d" \ + "\]\n" + } + j { # Day of year + append re \\s*(\\d\\d?\\d?) + dict set fieldSet dayOfYear [incr fieldCount] + append postcode "dict set date dayOfYear \[" \ + "::scan \$field" [incr captureCount] " %d" \ + "\]\n" + } + J { # Julian Day Number + append re \\s*(\\d+) + dict set fieldSet julianDay [incr fieldCount] + append postcode "dict set date julianDay \[" \ + "::scan \$field" [incr captureCount] " %ld" \ + "\]\n" + } + m - N { # Month number + append re \\s*(\\d\\d?) + dict set fieldSet month [incr fieldCount] + append postcode "dict set date month \[" \ + "::scan \$field" [incr captureCount] " %d" \ + "\]\n" + } + M { # Minute + append re \\s*(\\d\\d?) + dict set fieldSet minute [incr fieldCount] + append postcode "dict set date minute \[" \ + "::scan \$field" [incr captureCount] " %d" \ + "\]\n" + } + n { # Literal newline + append re \\n + } + O { # Prefix for locale numerics + set state %O + } + p - P { # AM/PM indicator + set l [list [string tolower [mc AM]] 0 \ + [string tolower [mc PM]] 1] + lassign [UniquePrefixRegexp $l] regex lookup + append re ( $regex ) + dict set fieldSet amPmIndicator [incr fieldCount] + append postcode "dict set date amPmIndicator \[" \ + "dict get " [list $lookup] " \[string tolower " \ + "\$field" \ + [incr captureCount] \ + "\]\]\n" + } + Q { # Hi, Jeff! + append re {Stardate\s+([-+]?\d+)(\d\d\d)[.](\d)} + incr captureCount + dict set fieldSet seconds [incr fieldCount] + append postcode {dict set date seconds } \[ \ + {ParseStarDate $field} [incr captureCount] \ + { $field} [incr captureCount] \ + { $field} [incr captureCount] \ + \] \n + } + s { # Seconds from Posix Epoch + # This next case is insanely difficult, because it's + # problematic to determine whether the field is + # actually within the range of a wide integer. + append re {\s*([-+]?\d+)} + dict set fieldSet seconds [incr fieldCount] + append postcode {dict set date seconds } \[ \ + {ScanWide $field} [incr captureCount] \] \n + } + S { # Second + append re \\s*(\\d\\d?) + dict set fieldSet second [incr fieldCount] + append postcode "dict set date second \[" \ + "::scan \$field" [incr captureCount] " %d" \ + "\]\n" + } + t { # Literal tab character + append re \\t + } + u - w { # Day number within week, 0 or 7 == Sun + # 1=Mon, 6=Sat + append re \\s*(\\d) + dict set fieldSet dayOfWeek [incr fieldCount] + append postcode {::scan $field} [incr captureCount] \ + { %d dow} \n \ + { + if { $dow == 0 } { + set dow 7 + } elseif { $dow > 7 } { + return -code error \ + -errorcode [list CLOCK badDayOfWeek] \ + "day of week is greater than 7" + } + dict set date dayOfWeek $dow + } + } + U { # Week of year. The first Sunday of + # the year is the first day of week + # 01. No scan rule uses this group. + append re \\s*\\d\\d? + } + V { # Week of ISO8601 year + + append re \\s*(\\d\\d?) + dict set fieldSet iso8601Week [incr fieldCount] + append postcode "dict set date iso8601Week \[" \ + "::scan \$field" [incr captureCount] " %d" \ + "\]\n" + } + W { # Week of the year (00-53). The first + # Monday of the year is the first day + # of week 01. No scan rule uses this + # group. + append re \\s*\\d\\d? + } + y { # Two-digit Gregorian year + append re \\s*(\\d\\d?) + dict set fieldSet yearOfCentury [incr fieldCount] + append postcode "dict set date yearOfCentury \[" \ + "::scan \$field" [incr captureCount] " %d" \ + "\]\n" + } + Y { # 4-digit Gregorian year + append re \\s*(\\d\\d)(\\d\\d) + dict set fieldSet century [incr fieldCount] + dict set fieldSet yearOfCentury [incr fieldCount] + append postcode \ + "dict set date century \[" \ + "::scan \$field" [incr captureCount] " %d" \ + "\]\n" \ + "dict set date yearOfCentury \[" \ + "::scan \$field" [incr captureCount] " %d" \ + "\]\n" + } + z - Z { # Time zone name + append re {(?:([-+]\d\d(?::?\d\d(?::?\d\d)?)?)|([[:alnum:]]{1,4}))} + dict set fieldSet tzName [incr fieldCount] + append postcode \ + {if } \{ { $field} [incr captureCount] \ + { ne "" } \} { } \{ \n \ + {dict set date tzName $field} \ + $captureCount \n \ + \} { else } \{ \n \ + {dict set date tzName } \[ \ + {ConvertLegacyTimeZone $field} \ + [incr captureCount] \] \n \ + \} \n \ + } + % { # Literal percent character + append re % + } + default { + append re % + if { ! [string is alnum $c] } { + append re \\ + } + append re $c + } + } + } + %E { + switch -exact -- $c { + C { # Locale-dependent era + set d {} + foreach triple [mc LOCALE_ERAS] { + lassign $triple t symbol year + dict set d [string tolower $symbol] $year + } + lassign [UniquePrefixRegexp $d] regex lookup + append re (?: $regex ) + } + E { + set l {} + dict set l [string tolower [mc BCE]] BCE + dict set l [string tolower [mc CE]] CE + dict set l b.c.e. BCE + dict set l c.e. CE + dict set l b.c. BCE + dict set l a.d. CE + lassign [UniquePrefixRegexp $l] regex lookup + append re ( $regex ) + dict set fieldSet era [incr fieldCount] + append postcode "dict set date era \["\ + "dict get " [list $lookup] \ + { } \[ {string tolower $field} \ + [incr captureCount] \] \ + "\]\n" + } + y { # Locale-dependent year of the era + lassign [LocaleNumeralMatcher $locale] regex lookup + append re $regex + incr captureCount + } + default { + append re %E + if { ! [string is alnum $c] } { + append re \\ + } + append re $c + } + } + set state {} + } + %O { + switch -exact -- $c { + d - e { + lassign [LocaleNumeralMatcher $locale] regex lookup + append re $regex + dict set fieldSet dayOfMonth [incr fieldCount] + append postcode "dict set date dayOfMonth \[" \ + "dict get " [list $lookup] " \$field" \ + [incr captureCount] \ + "\]\n" + } + H - k { + lassign [LocaleNumeralMatcher $locale] regex lookup + append re $regex + dict set fieldSet hour [incr fieldCount] + append postcode "dict set date hour \[" \ + "dict get " [list $lookup] " \$field" \ + [incr captureCount] \ + "\]\n" + } + I - l { + lassign [LocaleNumeralMatcher $locale] regex lookup + append re $regex + dict set fieldSet hourAMPM [incr fieldCount] + append postcode "dict set date hourAMPM \[" \ + "dict get " [list $lookup] " \$field" \ + [incr captureCount] \ + "\]\n" + } + m { + lassign [LocaleNumeralMatcher $locale] regex lookup + append re $regex + dict set fieldSet month [incr fieldCount] + append postcode "dict set date month \[" \ + "dict get " [list $lookup] " \$field" \ + [incr captureCount] \ + "\]\n" + } + M { + lassign [LocaleNumeralMatcher $locale] regex lookup + append re $regex + dict set fieldSet minute [incr fieldCount] + append postcode "dict set date minute \[" \ + "dict get " [list $lookup] " \$field" \ + [incr captureCount] \ + "\]\n" + } + S { + lassign [LocaleNumeralMatcher $locale] regex lookup + append re $regex + dict set fieldSet second [incr fieldCount] + append postcode "dict set date second \[" \ + "dict get " [list $lookup] " \$field" \ + [incr captureCount] \ + "\]\n" + } + u - w { + lassign [LocaleNumeralMatcher $locale] regex lookup + append re $regex + dict set fieldSet dayOfWeek [incr fieldCount] + append postcode "set dow \[dict get " [list $lookup] \ + { $field} [incr captureCount] \] \n \ + { + if { $dow == 0 } { + set dow 7 + } elseif { $dow > 7 } { + return -code error \ + -errorcode [list CLOCK badDayOfWeek] \ + "day of week is greater than 7" + } + dict set date dayOfWeek $dow + } + } + y { + lassign [LocaleNumeralMatcher $locale] regex lookup + append re $regex + dict set fieldSet yearOfCentury [incr fieldCount] + append postcode {dict set date yearOfCentury } \[ \ + {dict get } [list $lookup] { $field} \ + [incr captureCount] \] \n + } + default { + append re %O + if { ! [string is alnum $c] } { + append re \\ + } + append re $c + } + } + set state {} + } + } + } + + # Clean up any unfinished format groups + + append re $state \\s*\$ + + # Build the procedure + + set procBody {} + append procBody "variable ::tcl::clock::TZData" \n + append procBody "if \{ !\[ regexp -nocase [list $re] \$string ->" + for { set i 1 } { $i <= $captureCount } { incr i } { + append procBody " " field $i + } + append procBody "\] \} \{" \n + append procBody { + return -code error -errorcode [list CLOCK badInputString] \ + {input string does not match supplied format} + } + append procBody \}\n + append procBody "set date \[dict create\]" \n + append procBody {dict set date tzName $timeZone} \n + append procBody $postcode + append procBody [list set changeover [mc GREGORIAN_CHANGE_DATE]] \n + + # Set up the time zone before doing anything with a default base date + # that might need a timezone to interpret it. + + if { ![dict exists $fieldSet seconds] + && ![dict exists $fieldSet starDate] } { + if { [dict exists $fieldSet tzName] } { + append procBody { + set timeZone [dict get $date tzName] + } + } + append procBody { + ::tcl::clock::SetupTimeZone $timeZone + } + } + + # Add code that gets Julian Day Number from the fields. + + append procBody [MakeParseCodeFromFields $fieldSet $DateParseActions] + + # Get time of day + + append procBody [MakeParseCodeFromFields $fieldSet $TimeParseActions] + + # Assemble seconds from the Julian day and second of the day. + # Convert to local time unless epoch seconds or stardate are + # being processed - they're always absolute + + if { ![dict exists $fieldSet seconds] + && ![dict exists $fieldSet starDate] } { + append procBody { + if { [dict get $date julianDay] > 5373484 } { + return -code error -errorcode [list CLOCK dateTooLarge] \ + "requested date too large to represent" + } + dict set date localSeconds [expr { + -210866803200 + + ( 86400 * wide([dict get $date julianDay]) ) + + [dict get $date secondOfDay] + }] + } + + # Finally, convert the date to local time + + append procBody { + set date [::tcl::clock::ConvertLocalToUTC $date[set date {}] \ + $TZData($timeZone) $changeover] + } + } + + # Return result + + append procBody {return [dict get $date seconds]} \n + + proc $procName { string baseTime timeZone } $procBody + + # puts [list proc $procName [list string baseTime timeZone] $procBody] + + return $procName +} + +#---------------------------------------------------------------------- +# +# LocaleNumeralMatcher -- +# +# Composes a regexp that captures the numerals in the given locale, and +# a dictionary to map them to conventional numerals. +# +# Parameters: +# locale - Name of the current locale +# +# Results: +# Returns a two-element list comprising the regexp and the dictionary. +# +# Side effects: +# Caches the result. +# +#---------------------------------------------------------------------- + +proc ::tcl::clock::LocaleNumeralMatcher {l} { + variable LocaleNumeralCache + + if { ![dict exists $LocaleNumeralCache $l] } { + set d {} + set i 0 + set sep \( + foreach n [mc LOCALE_NUMERALS] { + dict set d $n $i + regsub -all {[^[:alnum:]]} $n \\\\& subex + append re $sep $subex + set sep | + incr i + } + append re \) + dict set LocaleNumeralCache $l [list $re $d] + } + return [dict get $LocaleNumeralCache $l] +} + + + +#---------------------------------------------------------------------- +# +# UniquePrefixRegexp -- +# +# Composes a regexp that performs unique-prefix matching. The RE +# matches one of a supplied set of strings, or any unique prefix +# thereof. +# +# Parameters: +# data - List of alternating match-strings and values. +# Match-strings with distinct values are considered +# distinct. +# +# Results: +# Returns a two-element list. The first is a regexp that matches any +# unique prefix of any of the strings. The second is a dictionary whose +# keys are match values from the regexp and whose values are the +# corresponding values from 'data'. +# +# Side effects: +# None. +# +#---------------------------------------------------------------------- + +proc ::tcl::clock::UniquePrefixRegexp { data } { + # The 'successors' dictionary will contain, for each string that is a + # prefix of any key, all characters that may follow that prefix. The + # 'prefixMapping' dictionary will have keys that are prefixes of keys and + # values that correspond to the keys. + + set prefixMapping [dict create] + set successors [dict create {} {}] + + # Walk the key-value pairs + + foreach { key value } $data { + # Construct all prefixes of the key; + + set prefix {} + foreach char [split $key {}] { + set oldPrefix $prefix + dict set successors $oldPrefix $char {} + append prefix $char + + # Put the prefixes in the 'prefixMapping' and 'successors' + # dictionaries + + dict lappend prefixMapping $prefix $value + if { ![dict exists $successors $prefix] } { + dict set successors $prefix {} + } + } + } + + # Identify those prefixes that designate unique values, and those that are + # the full keys + + set uniquePrefixMapping {} + dict for { key valueList } $prefixMapping { + if { [llength $valueList] == 1 } { + dict set uniquePrefixMapping $key [lindex $valueList 0] + } + } + foreach { key value } $data { + dict set uniquePrefixMapping $key $value + } + + # Construct the re. + + return [list \ + [MakeUniquePrefixRegexp $successors $uniquePrefixMapping {}] \ + $uniquePrefixMapping] +} + +#---------------------------------------------------------------------- +# +# MakeUniquePrefixRegexp -- +# +# Service procedure for 'UniquePrefixRegexp' that constructs a regular +# expresison that matches the unique prefixes. +# +# Parameters: +# successors - Dictionary whose keys are all prefixes +# of keys passed to 'UniquePrefixRegexp' and whose +# values are dictionaries whose keys are the characters +# that may follow those prefixes. +# uniquePrefixMapping - Dictionary whose keys are the unique +# prefixes and whose values are not examined. +# prefixString - Current prefix being processed. +# +# Results: +# Returns a constructed regular expression that matches the set of +# unique prefixes beginning with the 'prefixString'. +# +# Side effects: +# None. +# +#---------------------------------------------------------------------- + +proc ::tcl::clock::MakeUniquePrefixRegexp { successors + uniquePrefixMapping + prefixString } { + + # Get the characters that may follow the current prefix string + + set schars [lsort -ascii [dict keys [dict get $successors $prefixString]]] + if { [llength $schars] == 0 } { + return {} + } + + # If there is more than one successor character, or if the current prefix + # is a unique prefix, surround the generated re with non-capturing + # parentheses. + + set re {} + if { + [dict exists $uniquePrefixMapping $prefixString] + || [llength $schars] > 1 + } then { + append re "(?:" + } + + # Generate a regexp that matches the successors. + + set sep "" + foreach { c } $schars { + set nextPrefix $prefixString$c + regsub -all {[^[:alnum:]]} $c \\\\& rechar + append re $sep $rechar \ + [MakeUniquePrefixRegexp \ + $successors $uniquePrefixMapping $nextPrefix] + set sep | + } + + # If the current prefix is a unique prefix, make all following text + # optional. Otherwise, if there is more than one successor character, + # close the non-capturing parentheses. + + if { [dict exists $uniquePrefixMapping $prefixString] } { + append re ")?" + } elseif { [llength $schars] > 1 } { + append re ")" + } + + return $re +} + +#---------------------------------------------------------------------- +# +# MakeParseCodeFromFields -- +# +# Composes Tcl code to extract the Julian Day Number from a dictionary +# containing date fields. +# +# Parameters: +# dateFields -- Dictionary whose keys are fields of the date, +# and whose values are the rightmost positions +# at which those fields appear. +# parseActions -- List of triples: field set, priority, and +# code to emit. Smaller priorities are better, and +# the list must be in ascending order by priority +# +# Results: +# Returns a burst of code that extracts the day number from the given +# date. +# +# Side effects: +# None. +# +#---------------------------------------------------------------------- + +proc ::tcl::clock::MakeParseCodeFromFields { dateFields parseActions } { + + set currPrio 999 + set currFieldPos [list] + set currCodeBurst { + error "in ::tcl::clock::MakeParseCodeFromFields: can't happen" + } + + foreach { fieldSet prio parseAction } $parseActions { + # If we've found an answer that's better than any that follow, quit + # now. + + if { $prio > $currPrio } { + break + } + + # Accumulate the field positions that are used in the current field + # grouping. + + set fieldPos [list] + set ok true + foreach field $fieldSet { + if { ! [dict exists $dateFields $field] } { + set ok 0 + break + } + lappend fieldPos [dict get $dateFields $field] + } + + # Quit if we don't have a complete set of fields + if { !$ok } { + continue + } + + # Determine whether the current answer is better than the last. + + set fPos [lsort -integer -decreasing $fieldPos] + + if { $prio == $currPrio } { + foreach currPos $currFieldPos newPos $fPos { + if { + ![string is integer $newPos] + || ![string is integer $currPos] + || $newPos > $currPos + } then { + break + } + if { $newPos < $currPos } { + set ok 0 + break + } + } + } + if { !$ok } { + continue + } + + # Remember the best possibility for extracting date information + + set currPrio $prio + set currFieldPos $fPos + set currCodeBurst $parseAction + } + + return $currCodeBurst +} + +#---------------------------------------------------------------------- +# +# EnterLocale -- +# +# Switch [mclocale] to a given locale if necessary +# +# Parameters: +# locale -- Desired locale +# +# Results: +# Returns the locale that was previously current. +# +# Side effects: +# Does [mclocale]. If necessary, loades the designated locale's files. +# +#---------------------------------------------------------------------- + +proc ::tcl::clock::EnterLocale { locale } { + if { $locale eq {system} } { + if { $::tcl_platform(platform) ne {windows} } { + # On a non-windows platform, the 'system' locale is the same as + # the 'current' locale + + set locale current + } else { + # On a windows platform, the 'system' locale is adapted from the + # 'current' locale by applying the date and time formats from the + # Control Panel. First, load the 'current' locale if it's not yet + # loaded + + mcpackagelocale set [mclocale] + + # Make a new locale string for the system locale, and get the + # Control Panel information + + set locale [mclocale]_windows + if { ! [mcpackagelocale present $locale] } { + LoadWindowsDateTimeFormats $locale + } + } + } + if { $locale eq {current}} { + set locale [mclocale] + } + # Eventually load the locale + mcpackagelocale set $locale +} + +#---------------------------------------------------------------------- +# +# LoadWindowsDateTimeFormats -- +# +# Load the date/time formats from the Control Panel in Windows and +# convert them so that they're usable by Tcl. +# +# Parameters: +# locale - Name of the locale in whose message catalog +# the converted formats are to be stored. +# +# Results: +# None. +# +# Side effects: +# Updates the given message catalog with the locale strings. +# +# Presumes that on entry, [mclocale] is set to the current locale, so that +# default strings can be obtained if the Registry query fails. +# +#---------------------------------------------------------------------- + +proc ::tcl::clock::LoadWindowsDateTimeFormats { locale } { + # Bail out if we can't find the Registry + + variable NoRegistry + if { [info exists NoRegistry] } return + + if { ![catch { + registry get "HKEY_CURRENT_USER\\Control Panel\\International" \ + sShortDate + } string] } { + set quote {} + set datefmt {} + foreach { unquoted quoted } [split $string '] { + append datefmt $quote [string map { + dddd %A + ddd %a + dd %d + d %e + MMMM %B + MMM %b + MM %m + M %N + yyyy %Y + yy %y + y %y + gg {} + } $unquoted] + if { $quoted eq {} } { + set quote ' + } else { + set quote $quoted + } + } + ::msgcat::mcset $locale DATE_FORMAT $datefmt + } + + if { ![catch { + registry get "HKEY_CURRENT_USER\\Control Panel\\International" \ + sLongDate + } string] } { + set quote {} + set ldatefmt {} + foreach { unquoted quoted } [split $string '] { + append ldatefmt $quote [string map { + dddd %A + ddd %a + dd %d + d %e + MMMM %B + MMM %b + MM %m + M %N + yyyy %Y + yy %y + y %y + gg {} + } $unquoted] + if { $quoted eq {} } { + set quote ' + } else { + set quote $quoted + } + } + ::msgcat::mcset $locale LOCALE_DATE_FORMAT $ldatefmt + } + + if { ![catch { + registry get "HKEY_CURRENT_USER\\Control Panel\\International" \ + sTimeFormat + } string] } { + set quote {} + set timefmt {} + foreach { unquoted quoted } [split $string '] { + append timefmt $quote [string map { + HH %H + H %k + hh %I + h %l + mm %M + m %M + ss %S + s %S + tt %p + t %p + } $unquoted] + if { $quoted eq {} } { + set quote ' + } else { + set quote $quoted + } + } + ::msgcat::mcset $locale TIME_FORMAT $timefmt + } + + catch { + ::msgcat::mcset $locale DATE_TIME_FORMAT "$datefmt $timefmt" + } + catch { + ::msgcat::mcset $locale LOCALE_DATE_TIME_FORMAT "$ldatefmt $timefmt" + } + + return + +} + +#---------------------------------------------------------------------- +# +# LocalizeFormat -- +# +# Map away locale-dependent format groups in a clock format. +# +# Parameters: +# locale -- Current [mclocale] locale, supplied to avoid +# an extra call +# format -- Format supplied to [clock scan] or [clock format] +# +# Results: +# Returns the string with locale-dependent composite format groups +# substituted out. +# +# Side effects: +# None. +# +#---------------------------------------------------------------------- + +proc ::tcl::clock::LocalizeFormat { locale format } { + + # message catalog key to cache this format + set key FORMAT_$format + + if { [::msgcat::mcexists -exactlocale -exactnamespace $key] } { + return [mc $key] + } + # Handle locale-dependent format groups by mapping them out of the format + # string. Note that the order of the [string map] operations is + # significant because later formats can refer to later ones; for example + # %c can refer to %X, which in turn can refer to %T. + + set list { + %% %% + %D %m/%d/%Y + %+ {%a %b %e %H:%M:%S %Z %Y} + } + lappend list %EY [string map $list [mc LOCALE_YEAR_FORMAT]] + lappend list %T [string map $list [mc TIME_FORMAT_24_SECS]] + lappend list %R [string map $list [mc TIME_FORMAT_24]] + lappend list %r [string map $list [mc TIME_FORMAT_12]] + lappend list %X [string map $list [mc TIME_FORMAT]] + lappend list %EX [string map $list [mc LOCALE_TIME_FORMAT]] + lappend list %x [string map $list [mc DATE_FORMAT]] + lappend list %Ex [string map $list [mc LOCALE_DATE_FORMAT]] + lappend list %c [string map $list [mc DATE_TIME_FORMAT]] + lappend list %Ec [string map $list [mc LOCALE_DATE_TIME_FORMAT]] + set format [string map $list $format] + + ::msgcat::mcset $locale $key $format + return $format +} + +#---------------------------------------------------------------------- +# +# FormatNumericTimeZone -- +# +# Formats a time zone as +hhmmss +# +# Parameters: +# z - Time zone in seconds east of Greenwich +# +# Results: +# Returns the time zone formatted in a numeric form +# +# Side effects: +# None. +# +#---------------------------------------------------------------------- + +proc ::tcl::clock::FormatNumericTimeZone { z } { + if { $z < 0 } { + set z [expr { - $z }] + set retval - + } else { + set retval + + } + append retval [::format %02d [expr { $z / 3600 }]] + set z [expr { $z % 3600 }] + append retval [::format %02d [expr { $z / 60 }]] + set z [expr { $z % 60 }] + if { $z != 0 } { + append retval [::format %02d $z] + } + return $retval +} + +#---------------------------------------------------------------------- +# +# FormatStarDate -- +# +# Formats a date as a StarDate. +# +# Parameters: +# date - Dictionary containing 'year', 'dayOfYear', and +# 'localSeconds' fields. +# +# Results: +# Returns the given date formatted as a StarDate. +# +# Side effects: +# None. +# +# Jeff Hobbs put this in to support an atrocious pun about Tcl being +# "Enterprise ready." Now we're stuck with it. +# +#---------------------------------------------------------------------- + +proc ::tcl::clock::FormatStarDate { date } { + variable Roddenberry + + # Get day of year, zero based + + set doy [expr { [dict get $date dayOfYear] - 1 }] + + # Determine whether the year is a leap year + + set lp [IsGregorianLeapYear $date] + + # Convert day of year to a fractional year + + if { $lp } { + set fractYear [expr { 1000 * $doy / 366 }] + } else { + set fractYear [expr { 1000 * $doy / 365 }] + } + + # Put together the StarDate + + return [::format "Stardate %02d%03d.%1d" \ + [expr { [dict get $date year] - $Roddenberry }] \ + $fractYear \ + [expr { [dict get $date localSeconds] % 86400 + / ( 86400 / 10 ) }]] +} + +#---------------------------------------------------------------------- +# +# ParseStarDate -- +# +# Parses a StarDate +# +# Parameters: +# year - Year from the Roddenberry epoch +# fractYear - Fraction of a year specifiying the day of year. +# fractDay - Fraction of a day +# +# Results: +# Returns a count of seconds from the Posix epoch. +# +# Side effects: +# None. +# +# Jeff Hobbs put this in to support an atrocious pun about Tcl being +# "Enterprise ready." Now we're stuck with it. +# +#---------------------------------------------------------------------- + +proc ::tcl::clock::ParseStarDate { year fractYear fractDay } { + variable Roddenberry + + # Build a tentative date from year and fraction. + + set date [dict create \ + gregorian 1 \ + era CE \ + year [expr { $year + $Roddenberry }] \ + dayOfYear [expr { $fractYear * 365 / 1000 + 1 }]] + set date [GetJulianDayFromGregorianEraYearDay $date[set date {}]] + + # Determine whether the given year is a leap year + + set lp [IsGregorianLeapYear $date] + + # Reconvert the fractional year according to whether the given year is a + # leap year + + if { $lp } { + dict set date dayOfYear \ + [expr { $fractYear * 366 / 1000 + 1 }] + } else { + dict set date dayOfYear \ + [expr { $fractYear * 365 / 1000 + 1 }] + } + dict unset date julianDay + dict unset date gregorian + set date [GetJulianDayFromGregorianEraYearDay $date[set date {}]] + + return [expr { + 86400 * [dict get $date julianDay] + - 210866803200 + + ( 86400 / 10 ) * $fractDay + }] +} + +#---------------------------------------------------------------------- +# +# ScanWide -- +# +# Scans a wide integer from an input +# +# Parameters: +# str - String containing a decimal wide integer +# +# Results: +# Returns the string as a pure wide integer. Throws an error if the +# string is misformatted or out of range. +# +#---------------------------------------------------------------------- + +proc ::tcl::clock::ScanWide { str } { + set count [::scan $str {%ld %c} result junk] + if { $count != 1 } { + return -code error -errorcode [list CLOCK notAnInteger $str] \ + "\"$str\" is not an integer" + } + if { [incr result 0] != $str } { + return -code error -errorcode [list CLOCK integervalueTooLarge] \ + "integer value too large to represent" + } + return $result +} + +#---------------------------------------------------------------------- +# +# InterpretTwoDigitYear -- +# +# Given a date that contains only the year of the century, determines +# the target value of a two-digit year. +# +# Parameters: +# date - Dictionary containing fields of the date. +# baseTime - Base time relative to which the date is expressed. +# twoDigitField - Name of the field that stores the two-digit year. +# Default is 'yearOfCentury' +# fourDigitField - Name of the field that will receive the four-digit +# year. Default is 'year' +# +# Results: +# Returns the dictionary augmented with the four-digit year, stored in +# the given key. +# +# Side effects: +# None. +# +# The current rule for interpreting a two-digit year is that the year shall be +# between 1937 and 2037, thus staying within the range of a 32-bit signed +# value for time. This rule may change to a sliding window in future +# versions, so the 'baseTime' parameter (which is currently ignored) is +# provided in the procedure signature. +# +#---------------------------------------------------------------------- + +proc ::tcl::clock::InterpretTwoDigitYear { date baseTime + { twoDigitField yearOfCentury } + { fourDigitField year } } { + set yr [dict get $date $twoDigitField] + if { $yr <= 37 } { + dict set date $fourDigitField [expr { $yr + 2000 }] + } else { + dict set date $fourDigitField [expr { $yr + 1900 }] + } + return $date +} + +#---------------------------------------------------------------------- +# +# AssignBaseYear -- +# +# Places the number of the current year into a dictionary. +# +# Parameters: +# date - Dictionary value to update +# baseTime - Base time from which to extract the year, expressed +# in seconds from the Posix epoch +# timezone - the time zone in which the date is being scanned +# changeover - the Julian Day on which the Gregorian calendar +# was adopted in the target locale. +# +# Results: +# Returns the dictionary with the current year assigned. +# +# Side effects: +# None. +# +#---------------------------------------------------------------------- + +proc ::tcl::clock::AssignBaseYear { date baseTime timezone changeover } { + variable TZData + + # Find the Julian Day Number corresponding to the base time, and + # find the Gregorian year corresponding to that Julian Day. + + set date2 [GetDateFields $baseTime $TZData($timezone) $changeover] + + # Store the converted year + + dict set date era [dict get $date2 era] + dict set date year [dict get $date2 year] + + return $date +} + +#---------------------------------------------------------------------- +# +# AssignBaseIso8601Year -- +# +# Determines the base year in the ISO8601 fiscal calendar. +# +# Parameters: +# date - Dictionary containing the fields of the date that +# is to be augmented with the base year. +# baseTime - Base time expressed in seconds from the Posix epoch. +# timeZone - Target time zone +# changeover - Julian Day of adoption of the Gregorian calendar in +# the target locale. +# +# Results: +# Returns the given date with "iso8601Year" set to the +# base year. +# +# Side effects: +# None. +# +#---------------------------------------------------------------------- + +proc ::tcl::clock::AssignBaseIso8601Year {date baseTime timeZone changeover} { + variable TZData + + # Find the Julian Day Number corresponding to the base time + + set date2 [GetDateFields $baseTime $TZData($timeZone) $changeover] + + # Calculate the ISO8601 date and transfer the year + + dict set date era CE + dict set date iso8601Year [dict get $date2 iso8601Year] + return $date +} + +#---------------------------------------------------------------------- +# +# AssignBaseMonth -- +# +# Places the number of the current year and month into a +# dictionary. +# +# Parameters: +# date - Dictionary value to update +# baseTime - Time from which the year and month are to be +# obtained, expressed in seconds from the Posix epoch. +# timezone - Name of the desired time zone +# changeover - Julian Day on which the Gregorian calendar was adopted. +# +# Results: +# Returns the dictionary with the base year and month assigned. +# +# Side effects: +# None. +# +#---------------------------------------------------------------------- + +proc ::tcl::clock::AssignBaseMonth {date baseTime timezone changeover} { + variable TZData + + # Find the year and month corresponding to the base time + + set date2 [GetDateFields $baseTime $TZData($timezone) $changeover] + dict set date era [dict get $date2 era] + dict set date year [dict get $date2 year] + dict set date month [dict get $date2 month] + return $date +} + +#---------------------------------------------------------------------- +# +# AssignBaseWeek -- +# +# Determines the base year and week in the ISO8601 fiscal calendar. +# +# Parameters: +# date - Dictionary containing the fields of the date that +# is to be augmented with the base year and week. +# baseTime - Base time expressed in seconds from the Posix epoch. +# changeover - Julian Day on which the Gregorian calendar was adopted +# in the target locale. +# +# Results: +# Returns the given date with "iso8601Year" set to the +# base year and "iso8601Week" to the week number. +# +# Side effects: +# None. +# +#---------------------------------------------------------------------- + +proc ::tcl::clock::AssignBaseWeek {date baseTime timeZone changeover} { + variable TZData + + # Find the Julian Day Number corresponding to the base time + + set date2 [GetDateFields $baseTime $TZData($timeZone) $changeover] + + # Calculate the ISO8601 date and transfer the year + + dict set date era CE + dict set date iso8601Year [dict get $date2 iso8601Year] + dict set date iso8601Week [dict get $date2 iso8601Week] + return $date +} + +#---------------------------------------------------------------------- +# +# AssignBaseJulianDay -- +# +# Determines the base day for a time-of-day conversion. +# +# Parameters: +# date - Dictionary that is to get the base day +# baseTime - Base time expressed in seconds from the Posix epoch +# changeover - Julian day on which the Gregorian calendar was +# adpoted in the target locale. +# +# Results: +# Returns the given dictionary augmented with a 'julianDay' field +# that contains the base day. +# +# Side effects: +# None. +# +#---------------------------------------------------------------------- + +proc ::tcl::clock::AssignBaseJulianDay { date baseTime timeZone changeover } { + variable TZData + + # Find the Julian Day Number corresponding to the base time + + set date2 [GetDateFields $baseTime $TZData($timeZone) $changeover] + dict set date julianDay [dict get $date2 julianDay] + + return $date +} + +#---------------------------------------------------------------------- +# +# InterpretHMSP -- +# +# Interprets a time in the form "hh:mm:ss am". +# +# Parameters: +# date -- Dictionary containing "hourAMPM", "minute", "second" +# and "amPmIndicator" fields. +# +# Results: +# Returns the number of seconds from local midnight. +# +# Side effects: +# None. +# +#---------------------------------------------------------------------- + +proc ::tcl::clock::InterpretHMSP { date } { + set hr [dict get $date hourAMPM] + if { $hr == 12 } { + set hr 0 + } + if { [dict get $date amPmIndicator] } { + incr hr 12 + } + dict set date hour $hr + return [InterpretHMS $date[set date {}]] +} + +#---------------------------------------------------------------------- +# +# InterpretHMS -- +# +# Interprets a 24-hour time "hh:mm:ss" +# +# Parameters: +# date -- Dictionary containing the "hour", "minute" and "second" +# fields. +# +# Results: +# Returns the given dictionary augmented with a "secondOfDay" +# field containing the number of seconds from local midnight. +# +# Side effects: +# None. +# +#---------------------------------------------------------------------- + +proc ::tcl::clock::InterpretHMS { date } { + return [expr { + ( [dict get $date hour] * 60 + + [dict get $date minute] ) * 60 + + [dict get $date second] + }] +} + +#---------------------------------------------------------------------- +# +# GetSystemTimeZone -- +# +# Determines the system time zone, which is the default for the +# 'clock' command if no other zone is supplied. +# +# Parameters: +# None. +# +# Results: +# Returns the system time zone. +# +# Side effects: +# Stores the sustem time zone in the 'CachedSystemTimeZone' +# variable, since determining it may be an expensive process. +# +#---------------------------------------------------------------------- + +proc ::tcl::clock::GetSystemTimeZone {} { + variable CachedSystemTimeZone + variable TimeZoneBad + + if {[set result [getenv TCL_TZ]] ne {}} { + set timezone $result + } elseif {[set result [getenv TZ]] ne {}} { + set timezone $result + } + if {![info exists timezone]} { + # Cache the time zone only if it was detected by one of the + # expensive methods. + if { [info exists CachedSystemTimeZone] } { + set timezone $CachedSystemTimeZone + } elseif { $::tcl_platform(platform) eq {windows} } { + set timezone [GuessWindowsTimeZone] + } elseif { [file exists /etc/localtime] + && ![catch {ReadZoneinfoFile \ + Tcl/Localtime /etc/localtime}] } { + set timezone :Tcl/Localtime + } else { + set timezone :localtime + } + set CachedSystemTimeZone $timezone + } + if { ![dict exists $TimeZoneBad $timezone] } { + dict set TimeZoneBad $timezone [catch {SetupTimeZone $timezone}] + } + if { [dict get $TimeZoneBad $timezone] } { + return :localtime + } else { + return $timezone + } +} + +#---------------------------------------------------------------------- +# +# ConvertLegacyTimeZone -- +# +# Given an alphanumeric time zone identifier and the system time zone, +# convert the alphanumeric identifier to an unambiguous time zone. +# +# Parameters: +# tzname - Name of the time zone to convert +# +# Results: +# Returns a time zone name corresponding to tzname, but in an +# unambiguous form, generally +hhmm. +# +# This procedure is implemented primarily to allow the parsing of RFC822 +# date/time strings. Processing a time zone name on input is not recommended +# practice, because there is considerable room for ambiguity; for instance, is +# BST Brazilian Standard Time, or British Summer Time? +# +#---------------------------------------------------------------------- + +proc ::tcl::clock::ConvertLegacyTimeZone { tzname } { + variable LegacyTimeZone + + set tzname [string tolower $tzname] + if { ![dict exists $LegacyTimeZone $tzname] } { + return -code error -errorcode [list CLOCK badTZName $tzname] \ + "time zone \"$tzname\" not found" + } + return [dict get $LegacyTimeZone $tzname] +} + +#---------------------------------------------------------------------- +# +# SetupTimeZone -- +# +# Given the name or specification of a time zone, sets up its in-memory +# data. +# +# Parameters: +# tzname - Name of a time zone +# +# Results: +# Unless the time zone is ':localtime', sets the TZData array to contain +# the lookup table for local<->UTC conversion. Returns an error if the +# time zone cannot be parsed. +# +#---------------------------------------------------------------------- + +proc ::tcl::clock::SetupTimeZone { timezone } { + variable TZData + + if {! [info exists TZData($timezone)] } { + variable MINWIDE + if { $timezone eq {:localtime} } { + # Nothing to do, we'll convert using the localtime function + + } elseif { + [regexp {^([-+])(\d\d)(?::?(\d\d)(?::?(\d\d))?)?} $timezone \ + -> s hh mm ss] + } then { + # Make a fixed offset + + ::scan $hh %d hh + if { $mm eq {} } { + set mm 0 + } else { + ::scan $mm %d mm + } + if { $ss eq {} } { + set ss 0 + } else { + ::scan $ss %d ss + } + set offset [expr { ( $hh * 60 + $mm ) * 60 + $ss }] + if { $s eq {-} } { + set offset [expr { - $offset }] + } + set TZData($timezone) [list [list $MINWIDE $offset -1 $timezone]] + + } elseif { [string index $timezone 0] eq {:} } { + # Convert using a time zone file + + if { + [catch { + LoadTimeZoneFile [string range $timezone 1 end] + }] && [catch { + LoadZoneinfoFile [string range $timezone 1 end] + }] + } then { + return -code error \ + -errorcode [list CLOCK badTimeZone $timezone] \ + "time zone \"$timezone\" not found" + } + } elseif { ![catch {ParsePosixTimeZone $timezone} tzfields] } { + # This looks like a POSIX time zone - try to process it + + if { [catch {ProcessPosixTimeZone $tzfields} data opts] } { + if { [lindex [dict get $opts -errorcode] 0] eq {CLOCK} } { + dict unset opts -errorinfo + } + return -options $opts $data + } else { + set TZData($timezone) $data + } + + } else { + # We couldn't parse this as a POSIX time zone. Try again with a + # time zone file - this time without a colon + + if { [catch { LoadTimeZoneFile $timezone }] + && [catch { LoadZoneinfoFile $timezone } - opts] } { + dict unset opts -errorinfo + return -options $opts "time zone $timezone not found" + } + set TZData($timezone) $TZData(:$timezone) + } + } + + return +} + +#---------------------------------------------------------------------- +# +# GuessWindowsTimeZone -- +# +# Determines the system time zone on windows. +# +# Parameters: +# None. +# +# Results: +# Returns a time zone specifier that corresponds to the system time zone +# information found in the Registry. +# +# Bugs: +# Fixed dates for DST change are unimplemented at present, because no +# time zone information supplied with Windows actually uses them! +# +# On a Windows system where neither $env(TCL_TZ) nor $env(TZ) is specified, +# GuessWindowsTimeZone looks in the Registry for the system time zone +# information. It then attempts to find an entry in WinZoneInfo for a time +# zone that uses the same rules. If it finds one, it returns it; otherwise, +# it constructs a Posix-style time zone string and returns that. +# +#---------------------------------------------------------------------- + +proc ::tcl::clock::GuessWindowsTimeZone {} { + variable WinZoneInfo + variable NoRegistry + variable TimeZoneBad + + if { [info exists NoRegistry] } { + return :localtime + } + + # Dredge time zone information out of the registry + + if { [catch { + set rpath HKEY_LOCAL_MACHINE\\System\\CurrentControlSet\\Control\\TimeZoneInformation + set data [list \ + [expr { -60 + * [registry get $rpath Bias] }] \ + [expr { -60 + * [registry get $rpath StandardBias] }] \ + [expr { -60 \ + * [registry get $rpath DaylightBias] }]] + set stdtzi [registry get $rpath StandardStart] + foreach ind {0 2 14 4 6 8 10 12} { + binary scan $stdtzi @${ind}s val + lappend data $val + } + set daytzi [registry get $rpath DaylightStart] + foreach ind {0 2 14 4 6 8 10 12} { + binary scan $daytzi @${ind}s val + lappend data $val + } + }] } { + # Missing values in the Registry - bail out + + return :localtime + } + + # Make up a Posix time zone specifier if we can't find one. Check here + # that the tzdata file exists, in case we're running in an environment + # (e.g. starpack) where tzdata is incomplete. (Bug 1237907) + + if { [dict exists $WinZoneInfo $data] } { + set tzname [dict get $WinZoneInfo $data] + if { ! [dict exists $TimeZoneBad $tzname] } { + dict set TimeZoneBad $tzname [catch {SetupTimeZone $tzname}] + } + } else { + set tzname {} + } + if { $tzname eq {} || [dict get $TimeZoneBad $tzname] } { + lassign $data \ + bias stdBias dstBias \ + stdYear stdMonth stdDayOfWeek stdDayOfMonth \ + stdHour stdMinute stdSecond stdMillisec \ + dstYear dstMonth dstDayOfWeek dstDayOfMonth \ + dstHour dstMinute dstSecond dstMillisec + set stdDelta [expr { $bias + $stdBias }] + set dstDelta [expr { $bias + $dstBias }] + if { $stdDelta <= 0 } { + set stdSignum + + set stdDelta [expr { - $stdDelta }] + set dispStdSignum - + } else { + set stdSignum - + set dispStdSignum + + } + set hh [::format %02d [expr { $stdDelta / 3600 }]] + set mm [::format %02d [expr { ($stdDelta / 60 ) % 60 }]] + set ss [::format %02d [expr { $stdDelta % 60 }]] + set tzname {} + append tzname < $dispStdSignum $hh $mm > $stdSignum $hh : $mm : $ss + if { $stdMonth >= 0 } { + if { $dstDelta <= 0 } { + set dstSignum + + set dstDelta [expr { - $dstDelta }] + set dispDstSignum - + } else { + set dstSignum - + set dispDstSignum + + } + set hh [::format %02d [expr { $dstDelta / 3600 }]] + set mm [::format %02d [expr { ($dstDelta / 60 ) % 60 }]] + set ss [::format %02d [expr { $dstDelta % 60 }]] + append tzname < $dispDstSignum $hh $mm > $dstSignum $hh : $mm : $ss + if { $dstYear == 0 } { + append tzname ,M $dstMonth . $dstDayOfMonth . $dstDayOfWeek + } else { + # I have not been able to find any locale on which Windows + # converts time zone on a fixed day of the year, hence don't + # know how to interpret the fields. If someone can inform me, + # I'd be glad to code it up. For right now, we bail out in + # such a case. + return :localtime + } + append tzname / [::format %02d $dstHour] \ + : [::format %02d $dstMinute] \ + : [::format %02d $dstSecond] + if { $stdYear == 0 } { + append tzname ,M $stdMonth . $stdDayOfMonth . $stdDayOfWeek + } else { + # I have not been able to find any locale on which Windows + # converts time zone on a fixed day of the year, hence don't + # know how to interpret the fields. If someone can inform me, + # I'd be glad to code it up. For right now, we bail out in + # such a case. + return :localtime + } + append tzname / [::format %02d $stdHour] \ + : [::format %02d $stdMinute] \ + : [::format %02d $stdSecond] + } + dict set WinZoneInfo $data $tzname + } + + return [dict get $WinZoneInfo $data] +} + +#---------------------------------------------------------------------- +# +# LoadTimeZoneFile -- +# +# Load the data file that specifies the conversion between a +# given time zone and Greenwich. +# +# Parameters: +# fileName -- Name of the file to load +# +# Results: +# None. +# +# Side effects: +# TZData(:fileName) contains the time zone data +# +#---------------------------------------------------------------------- + +proc ::tcl::clock::LoadTimeZoneFile { fileName } { + variable DataDir + variable TZData + + if { [info exists TZData($fileName)] } { + return + } + + # Since an unsafe interp uses the [clock] command in the master, this code + # is security sensitive. Make sure that the path name cannot escape the + # given directory. + + if { ![regexp {^[[.-.][:alpha:]_]+(?:/[[.-.][:alpha:]_]+)*$} $fileName] } { + return -code error \ + -errorcode [list CLOCK badTimeZone $:fileName] \ + "time zone \":$fileName\" not valid" + } + try { + source -encoding utf-8 [file join $DataDir $fileName] + } on error {} { + return -code error \ + -errorcode [list CLOCK badTimeZone :$fileName] \ + "time zone \":$fileName\" not found" + } + return +} + +#---------------------------------------------------------------------- +# +# LoadZoneinfoFile -- +# +# Loads a binary time zone information file in Olson format. +# +# Parameters: +# fileName - Relative path name of the file to load. +# +# Results: +# Returns an empty result normally; returns an error if no Olson file +# was found or the file was malformed in some way. +# +# Side effects: +# TZData(:fileName) contains the time zone data +# +#---------------------------------------------------------------------- + +proc ::tcl::clock::LoadZoneinfoFile { fileName } { + variable ZoneinfoPaths + + # Since an unsafe interp uses the [clock] command in the master, this code + # is security sensitive. Make sure that the path name cannot escape the + # given directory. + + if { ![regexp {^[[.-.][:alpha:]_]+(?:/[[.-.][:alpha:]_]+)*$} $fileName] } { + return -code error \ + -errorcode [list CLOCK badTimeZone $:fileName] \ + "time zone \":$fileName\" not valid" + } + foreach d $ZoneinfoPaths { + set fname [file join $d $fileName] + if { [file readable $fname] && [file isfile $fname] } { + break + } + unset fname + } + ReadZoneinfoFile $fileName $fname +} + +#---------------------------------------------------------------------- +# +# ReadZoneinfoFile -- +# +# Loads a binary time zone information file in Olson format. +# +# Parameters: +# fileName - Name of the time zone (relative path name of the +# file). +# fname - Absolute path name of the file. +# +# Results: +# Returns an empty result normally; returns an error if no Olson file +# was found or the file was malformed in some way. +# +# Side effects: +# TZData(:fileName) contains the time zone data +# +#---------------------------------------------------------------------- + +proc ::tcl::clock::ReadZoneinfoFile {fileName fname} { + variable MINWIDE + variable TZData + if { ![file exists $fname] } { + return -code error "$fileName not found" + } + + if { [file size $fname] > 262144 } { + return -code error "$fileName too big" + } + + # Suck in all the data from the file + + set f [open $fname r] + fconfigure $f -translation binary + set d [read $f] + close $f + + # The file begins with a magic number, sixteen reserved bytes, and then + # six 4-byte integers giving counts of fileds in the file. + + binary scan $d a4a1x15IIIIII \ + magic version nIsGMT nIsStd nLeap nTime nType nChar + set seek 44 + set ilen 4 + set iformat I + if { $magic != {TZif} } { + return -code error "$fileName not a time zone information file" + } + if { $nType > 255 } { + return -code error "$fileName contains too many time types" + } + # Accept only Posix-style zoneinfo. Sorry, 'leaps' bigots. + if { $nLeap != 0 } { + return -code error "$fileName contains leap seconds" + } + + # In a version 2 file, we use the second part of the file, which contains + # 64-bit transition times. + + if {$version eq "2"} { + set seek [expr { + 44 + + 5 * $nTime + + 6 * $nType + + 4 * $nLeap + + $nIsStd + + $nIsGMT + + $nChar + }] + binary scan $d @${seek}a4a1x15IIIIII \ + magic version nIsGMT nIsStd nLeap nTime nType nChar + if {$magic ne {TZif}} { + return -code error "seek address $seek miscomputed, magic = $magic" + } + set iformat W + set ilen 8 + incr seek 44 + } + + # Next come ${nTime} transition times, followed by ${nTime} time type + # codes. The type codes are unsigned 1-byte quantities. We insert an + # arbitrary start time in front of the transitions. + + binary scan $d @${seek}${iformat}${nTime}c${nTime} times tempCodes + incr seek [expr { ($ilen + 1) * $nTime }] + set times [linsert $times 0 $MINWIDE] + set codes {} + foreach c $tempCodes { + lappend codes [expr { $c & 0xff }] + } + set codes [linsert $codes 0 0] + + # Next come ${nType} time type descriptions, each of which has an offset + # (seconds east of GMT), a DST indicator, and an index into the + # abbreviation text. + + for { set i 0 } { $i < $nType } { incr i } { + binary scan $d @${seek}Icc gmtOff isDst abbrInd + lappend types [list $gmtOff $isDst $abbrInd] + incr seek 6 + } + + # Next come $nChar characters of time zone name abbreviations, which are + # null-terminated. + # We build them up into a dictionary indexed by character index, because + # that's what's in the indices above. + + binary scan $d @${seek}a${nChar} abbrs + incr seek ${nChar} + set abbrList [split $abbrs \0] + set i 0 + set abbrevs {} + foreach a $abbrList { + for {set j 0} {$j <= [string length $a]} {incr j} { + dict set abbrevs $i [string range $a $j end] + incr i + } + } + + # Package up a list of tuples, each of which contains transition time, + # seconds east of Greenwich, DST flag and time zone abbreviation. + + set r {} + set lastTime $MINWIDE + foreach t $times c $codes { + if { $t < $lastTime } { + return -code error "$fileName has times out of order" + } + set lastTime $t + lassign [lindex $types $c] gmtoff isDst abbrInd + set abbrev [dict get $abbrevs $abbrInd] + lappend r [list $t $gmtoff $isDst $abbrev] + } + + # In a version 2 file, there is also a POSIX-style time zone description + # at the very end of the file. To get to it, skip over nLeap leap second + # values (8 bytes each), + # nIsStd standard/DST indicators and nIsGMT UTC/local indicators. + + if {$version eq {2}} { + set seek [expr {$seek + 8 * $nLeap + $nIsStd + $nIsGMT + 1}] + set last [string first \n $d $seek] + set posix [string range $d $seek [expr {$last-1}]] + if {[llength $posix] > 0} { + set posixFields [ParsePosixTimeZone $posix] + foreach tuple [ProcessPosixTimeZone $posixFields] { + lassign $tuple t gmtoff isDst abbrev + if {$t > $lastTime} { + lappend r $tuple + } + } + } + } + + set TZData(:$fileName) $r + + return +} + +#---------------------------------------------------------------------- +# +# ParsePosixTimeZone -- +# +# Parses the TZ environment variable in Posix form +# +# Parameters: +# tz Time zone specifier to be interpreted +# +# Results: +# Returns a dictionary whose values contain the various pieces of the +# time zone specification. +# +# Side effects: +# None. +# +# Errors: +# Throws an error if the syntax of the time zone is incorrect. +# +# The following keys are present in the dictionary: +# stdName - Name of the time zone when Daylight Saving Time +# is not in effect. +# stdSignum - Sign (+, -, or empty) of the offset from Greenwich +# to the given (non-DST) time zone. + and the empty +# string denote zones west of Greenwich, - denotes east +# of Greenwich; this is contrary to the ISO convention +# but follows Posix. +# stdHours - Hours part of the offset from Greenwich to the given +# (non-DST) time zone. +# stdMinutes - Minutes part of the offset from Greenwich to the +# given (non-DST) time zone. Empty denotes zero. +# stdSeconds - Seconds part of the offset from Greenwich to the +# given (non-DST) time zone. Empty denotes zero. +# dstName - Name of the time zone when DST is in effect, or the +# empty string if the time zone does not observe Daylight +# Saving Time. +# dstSignum, dstHours, dstMinutes, dstSeconds - +# Fields corresponding to stdSignum, stdHours, stdMinutes, +# stdSeconds for the Daylight Saving Time version of the +# time zone. If dstHours is empty, it is presumed to be 1. +# startDayOfYear - The ordinal number of the day of the year on which +# Daylight Saving Time begins. If this field is +# empty, then DST begins on a given month-week-day, +# as below. +# startJ - The letter J, or an empty string. If a J is present in +# this field, then startDayOfYear does not count February 29 +# even in leap years. +# startMonth - The number of the month in which Daylight Saving Time +# begins, supplied if startDayOfYear is empty. If both +# startDayOfYear and startMonth are empty, then US rules +# are presumed. +# startWeekOfMonth - The number of the week in the month in which +# Daylight Saving Time begins, in the range 1-5. +# 5 denotes the last week of the month even in a +# 4-week month. +# startDayOfWeek - The number of the day of the week (Sunday=0, +# Saturday=6) on which Daylight Saving Time begins. +# startHours - The hours part of the time of day at which Daylight +# Saving Time begins. An empty string is presumed to be 2. +# startMinutes - The minutes part of the time of day at which DST begins. +# An empty string is presumed zero. +# startSeconds - The seconds part of the time of day at which DST begins. +# An empty string is presumed zero. +# endDayOfYear, endJ, endMonth, endWeekOfMonth, endDayOfWeek, +# endHours, endMinutes, endSeconds - +# Specify the end of DST in the same way that the start* fields +# specify the beginning of DST. +# +# This procedure serves only to break the time specifier into fields. No +# attempt is made to canonicalize the fields or supply default values. +# +#---------------------------------------------------------------------- + +proc ::tcl::clock::ParsePosixTimeZone { tz } { + if {[regexp -expanded -nocase -- { + ^ + # 1 - Standard time zone name + ([[:alpha:]]+ | <[-+[:alnum:]]+>) + # 2 - Standard time zone offset, signum + ([-+]?) + # 3 - Standard time zone offset, hours + ([[:digit:]]{1,2}) + (?: + # 4 - Standard time zone offset, minutes + : ([[:digit:]]{1,2}) + (?: + # 5 - Standard time zone offset, seconds + : ([[:digit:]]{1,2} ) + )? + )? + (?: + # 6 - DST time zone name + ([[:alpha:]]+ | <[-+[:alnum:]]+>) + (?: + (?: + # 7 - DST time zone offset, signum + ([-+]?) + # 8 - DST time zone offset, hours + ([[:digit:]]{1,2}) + (?: + # 9 - DST time zone offset, minutes + : ([[:digit:]]{1,2}) + (?: + # 10 - DST time zone offset, seconds + : ([[:digit:]]{1,2}) + )? + )? + )? + (?: + , + (?: + # 11 - Optional J in n and Jn form 12 - Day of year + ( J ? ) ( [[:digit:]]+ ) + | M + # 13 - Month number 14 - Week of month 15 - Day of week + ( [[:digit:]] + ) + [.] ( [[:digit:]] + ) + [.] ( [[:digit:]] + ) + ) + (?: + # 16 - Start time of DST - hours + / ( [[:digit:]]{1,2} ) + (?: + # 17 - Start time of DST - minutes + : ( [[:digit:]]{1,2} ) + (?: + # 18 - Start time of DST - seconds + : ( [[:digit:]]{1,2} ) + )? + )? + )? + , + (?: + # 19 - Optional J in n and Jn form 20 - Day of year + ( J ? ) ( [[:digit:]]+ ) + | M + # 21 - Month number 22 - Week of month 23 - Day of week + ( [[:digit:]] + ) + [.] ( [[:digit:]] + ) + [.] ( [[:digit:]] + ) + ) + (?: + # 24 - End time of DST - hours + / ( [[:digit:]]{1,2} ) + (?: + # 25 - End time of DST - minutes + : ( [[:digit:]]{1,2} ) + (?: + # 26 - End time of DST - seconds + : ( [[:digit:]]{1,2} ) + )? + )? + )? + )? + )? + )? + $ + } $tz -> x(stdName) x(stdSignum) x(stdHours) x(stdMinutes) x(stdSeconds) \ + x(dstName) x(dstSignum) x(dstHours) x(dstMinutes) x(dstSeconds) \ + x(startJ) x(startDayOfYear) \ + x(startMonth) x(startWeekOfMonth) x(startDayOfWeek) \ + x(startHours) x(startMinutes) x(startSeconds) \ + x(endJ) x(endDayOfYear) \ + x(endMonth) x(endWeekOfMonth) x(endDayOfWeek) \ + x(endHours) x(endMinutes) x(endSeconds)] } { + # it's a good timezone + + return [array get x] + } + + return -code error\ + -errorcode [list CLOCK badTimeZone $tz] \ + "unable to parse time zone specification \"$tz\"" +} + +#---------------------------------------------------------------------- +# +# ProcessPosixTimeZone -- +# +# Handle a Posix time zone after it's been broken out into fields. +# +# Parameters: +# z - Dictionary returned from 'ParsePosixTimeZone' +# +# Results: +# Returns time zone information for the 'TZData' array. +# +# Side effects: +# None. +# +#---------------------------------------------------------------------- + +proc ::tcl::clock::ProcessPosixTimeZone { z } { + variable MINWIDE + variable TZData + + # Determine the standard time zone name and seconds east of Greenwich + + set stdName [dict get $z stdName] + if { [string index $stdName 0] eq {<} } { + set stdName [string range $stdName 1 end-1] + } + if { [dict get $z stdSignum] eq {-} } { + set stdSignum +1 + } else { + set stdSignum -1 + } + set stdHours [lindex [::scan [dict get $z stdHours] %d] 0] + if { [dict get $z stdMinutes] ne {} } { + set stdMinutes [lindex [::scan [dict get $z stdMinutes] %d] 0] + } else { + set stdMinutes 0 + } + if { [dict get $z stdSeconds] ne {} } { + set stdSeconds [lindex [::scan [dict get $z stdSeconds] %d] 0] + } else { + set stdSeconds 0 + } + set stdOffset [expr { + (($stdHours * 60 + $stdMinutes) * 60 + $stdSeconds) * $stdSignum + }] + set data [list [list $MINWIDE $stdOffset 0 $stdName]] + + # If there's no daylight zone, we're done + + set dstName [dict get $z dstName] + if { $dstName eq {} } { + return $data + } + if { [string index $dstName 0] eq {<} } { + set dstName [string range $dstName 1 end-1] + } + + # Determine the daylight name + + if { [dict get $z dstSignum] eq {-} } { + set dstSignum +1 + } else { + set dstSignum -1 + } + if { [dict get $z dstHours] eq {} } { + set dstOffset [expr { 3600 + $stdOffset }] + } else { + set dstHours [lindex [::scan [dict get $z dstHours] %d] 0] + if { [dict get $z dstMinutes] ne {} } { + set dstMinutes [lindex [::scan [dict get $z dstMinutes] %d] 0] + } else { + set dstMinutes 0 + } + if { [dict get $z dstSeconds] ne {} } { + set dstSeconds [lindex [::scan [dict get $z dstSeconds] %d] 0] + } else { + set dstSeconds 0 + } + set dstOffset [expr { + (($dstHours*60 + $dstMinutes) * 60 + $dstSeconds) * $dstSignum + }] + } + + # Fill in defaults for European or US DST rules + # US start time is the second Sunday in March + # EU start time is the last Sunday in March + # US end time is the first Sunday in November. + # EU end time is the last Sunday in October + + if { + [dict get $z startDayOfYear] eq {} + && [dict get $z startMonth] eq {} + } then { + if {($stdSignum * $stdHours>=0) && ($stdSignum * $stdHours<=12)} { + # EU + dict set z startWeekOfMonth 5 + if {$stdHours>2} { + dict set z startHours 2 + } else { + dict set z startHours [expr {$stdHours+1}] + } + } else { + # US + dict set z startWeekOfMonth 2 + dict set z startHours 2 + } + dict set z startMonth 3 + dict set z startDayOfWeek 0 + dict set z startMinutes 0 + dict set z startSeconds 0 + } + if { + [dict get $z endDayOfYear] eq {} + && [dict get $z endMonth] eq {} + } then { + if {($stdSignum * $stdHours>=0) && ($stdSignum * $stdHours<=12)} { + # EU + dict set z endMonth 10 + dict set z endWeekOfMonth 5 + if {$stdHours>2} { + dict set z endHours 3 + } else { + dict set z endHours [expr {$stdHours+2}] + } + } else { + # US + dict set z endMonth 11 + dict set z endWeekOfMonth 1 + dict set z endHours 2 + } + dict set z endDayOfWeek 0 + dict set z endMinutes 0 + dict set z endSeconds 0 + } + + # Put DST in effect in all years from 1916 to 2099. + + for { set y 1916 } { $y < 2100 } { incr y } { + set startTime [DeterminePosixDSTTime $z start $y] + incr startTime [expr { - wide($stdOffset) }] + set endTime [DeterminePosixDSTTime $z end $y] + incr endTime [expr { - wide($dstOffset) }] + if { $startTime < $endTime } { + lappend data \ + [list $startTime $dstOffset 1 $dstName] \ + [list $endTime $stdOffset 0 $stdName] + } else { + lappend data \ + [list $endTime $stdOffset 0 $stdName] \ + [list $startTime $dstOffset 1 $dstName] + } + } + + return $data +} + +#---------------------------------------------------------------------- +# +# DeterminePosixDSTTime -- +# +# Determines the time that Daylight Saving Time starts or ends from a +# Posix time zone specification. +# +# Parameters: +# z - Time zone data returned from ParsePosixTimeZone. +# Missing fields are expected to be filled in with +# default values. +# bound - The word 'start' or 'end' +# y - The year for which the transition time is to be determined. +# +# Results: +# Returns the transition time as a count of seconds from the epoch. The +# time is relative to the wall clock, not UTC. +# +#---------------------------------------------------------------------- + +proc ::tcl::clock::DeterminePosixDSTTime { z bound y } { + + variable FEB_28 + + # Determine the start or end day of DST + + set date [dict create era CE year $y] + set doy [dict get $z ${bound}DayOfYear] + if { $doy ne {} } { + + # Time was specified as a day of the year + + if { [dict get $z ${bound}J] ne {} + && [IsGregorianLeapYear $y] + && ( $doy > $FEB_28 ) } { + incr doy + } + dict set date dayOfYear $doy + set date [GetJulianDayFromEraYearDay $date[set date {}] 2361222] + } else { + # Time was specified as a day of the week within a month + + dict set date month [dict get $z ${bound}Month] + dict set date dayOfWeek [dict get $z ${bound}DayOfWeek] + set dowim [dict get $z ${bound}WeekOfMonth] + if { $dowim >= 5 } { + set dowim -1 + } + dict set date dayOfWeekInMonth $dowim + set date [GetJulianDayFromEraYearMonthWeekDay $date[set date {}] 2361222] + + } + + set jd [dict get $date julianDay] + set seconds [expr { + wide($jd) * wide(86400) - wide(210866803200) + }] + + set h [dict get $z ${bound}Hours] + if { $h eq {} } { + set h 2 + } else { + set h [lindex [::scan $h %d] 0] + } + set m [dict get $z ${bound}Minutes] + if { $m eq {} } { + set m 0 + } else { + set m [lindex [::scan $m %d] 0] + } + set s [dict get $z ${bound}Seconds] + if { $s eq {} } { + set s 0 + } else { + set s [lindex [::scan $s %d] 0] + } + set tod [expr { ( $h * 60 + $m ) * 60 + $s }] + return [expr { $seconds + $tod }] +} + +#---------------------------------------------------------------------- +# +# GetLocaleEra -- +# +# Given local time expressed in seconds from the Posix epoch, +# determine localized era and year within the era. +# +# Parameters: +# date - Dictionary that must contain the keys, 'localSeconds', +# whose value is expressed as the appropriate local time; +# and 'year', whose value is the Gregorian year. +# etable - Value of the LOCALE_ERAS key in the message catalogue +# for the target locale. +# +# Results: +# Returns the dictionary, augmented with the keys, 'localeEra' and +# 'localeYear'. +# +#---------------------------------------------------------------------- + +proc ::tcl::clock::GetLocaleEra { date etable } { + set index [BSearch $etable [dict get $date localSeconds]] + if { $index < 0} { + dict set date localeEra \ + [::format %02d [expr { [dict get $date year] / 100 }]] + dict set date localeYear [expr { + [dict get $date year] % 100 + }] + } else { + dict set date localeEra [lindex $etable $index 1] + dict set date localeYear [expr { + [dict get $date year] - [lindex $etable $index 2] + }] + } + return $date +} + +#---------------------------------------------------------------------- +# +# GetJulianDayFromEraYearDay -- +# +# Given a year, month and day on the Gregorian calendar, determines +# the Julian Day Number beginning at noon on that date. +# +# Parameters: +# date -- A dictionary in which the 'era', 'year', and +# 'dayOfYear' slots are populated. The calendar in use +# is determined by the date itself relative to: +# changeover -- Julian day on which the Gregorian calendar was +# adopted in the current locale. +# +# Results: +# Returns the given dictionary augmented with a 'julianDay' key whose +# value is the desired Julian Day Number, and a 'gregorian' key that +# specifies whether the calendar is Gregorian (1) or Julian (0). +# +# Side effects: +# None. +# +# Bugs: +# This code needs to be moved to the C layer. +# +#---------------------------------------------------------------------- + +proc ::tcl::clock::GetJulianDayFromEraYearDay {date changeover} { + # Get absolute year number from the civil year + + switch -exact -- [dict get $date era] { + BCE { + set year [expr { 1 - [dict get $date year] }] + } + CE { + set year [dict get $date year] + } + } + set ym1 [expr { $year - 1 }] + + # Try the Gregorian calendar first. + + dict set date gregorian 1 + set jd [expr { + 1721425 + + [dict get $date dayOfYear] + + ( 365 * $ym1 ) + + ( $ym1 / 4 ) + - ( $ym1 / 100 ) + + ( $ym1 / 400 ) + }] + + # If the date is before the Gregorian change, use the Julian calendar. + + if { $jd < $changeover } { + dict set date gregorian 0 + set jd [expr { + 1721423 + + [dict get $date dayOfYear] + + ( 365 * $ym1 ) + + ( $ym1 / 4 ) + }] + } + + dict set date julianDay $jd + return $date +} + +#---------------------------------------------------------------------- +# +# GetJulianDayFromEraYearMonthWeekDay -- +# +# Determines the Julian Day number corresponding to the nth given +# day-of-the-week in a given month. +# +# Parameters: +# date - Dictionary containing the keys, 'era', 'year', 'month' +# 'weekOfMonth', 'dayOfWeek', and 'dayOfWeekInMonth'. +# changeover - Julian Day of adoption of the Gregorian calendar +# +# Results: +# Returns the given dictionary, augmented with a 'julianDay' key. +# +# Side effects: +# None. +# +# Bugs: +# This code needs to be moved to the C layer. +# +#---------------------------------------------------------------------- + +proc ::tcl::clock::GetJulianDayFromEraYearMonthWeekDay {date changeover} { + # Come up with a reference day; either the zeroeth day of the given month + # (dayOfWeekInMonth >= 0) or the seventh day of the following month + # (dayOfWeekInMonth < 0) + + set date2 $date + set week [dict get $date dayOfWeekInMonth] + if { $week >= 0 } { + dict set date2 dayOfMonth 0 + } else { + dict incr date2 month + dict set date2 dayOfMonth 7 + } + set date2 [GetJulianDayFromEraYearMonthDay $date2[set date2 {}] \ + $changeover] + set wd0 [WeekdayOnOrBefore [dict get $date dayOfWeek] \ + [dict get $date2 julianDay]] + dict set date julianDay [expr { $wd0 + 7 * $week }] + return $date +} + +#---------------------------------------------------------------------- +# +# IsGregorianLeapYear -- +# +# Determines whether a given date represents a leap year in the +# Gregorian calendar. +# +# Parameters: +# date -- The date to test. The fields, 'era', 'year' and 'gregorian' +# must be set. +# +# Results: +# Returns 1 if the year is a leap year, 0 otherwise. +# +# Side effects: +# None. +# +#---------------------------------------------------------------------- + +proc ::tcl::clock::IsGregorianLeapYear { date } { + switch -exact -- [dict get $date era] { + BCE { + set year [expr { 1 - [dict get $date year]}] + } + CE { + set year [dict get $date year] + } + } + if { $year % 4 != 0 } { + return 0 + } elseif { ![dict get $date gregorian] } { + return 1 + } elseif { $year % 400 == 0 } { + return 1 + } elseif { $year % 100 == 0 } { + return 0 + } else { + return 1 + } +} + +#---------------------------------------------------------------------- +# +# WeekdayOnOrBefore -- +# +# Determine the nearest day of week (given by the 'weekday' parameter, +# Sunday==0) on or before a given Julian Day. +# +# Parameters: +# weekday -- Day of the week +# j -- Julian Day number +# +# Results: +# Returns the Julian Day Number of the desired date. +# +# Side effects: +# None. +# +#---------------------------------------------------------------------- + +proc ::tcl::clock::WeekdayOnOrBefore { weekday j } { + set k [expr { ( $weekday + 6 ) % 7 }] + return [expr { $j - ( $j - $k ) % 7 }] +} + +#---------------------------------------------------------------------- +# +# BSearch -- +# +# Service procedure that does binary search in several places inside the +# 'clock' command. +# +# Parameters: +# list - List of lists, sorted in ascending order by the +# first elements +# key - Value to search for +# +# Results: +# Returns the index of the greatest element in $list that is less than +# or equal to $key. +# +# Side effects: +# None. +# +#---------------------------------------------------------------------- + +proc ::tcl::clock::BSearch { list key } { + if {[llength $list] == 0} { + return -1 + } + if { $key < [lindex $list 0 0] } { + return -1 + } + + set l 0 + set u [expr { [llength $list] - 1 }] + + while { $l < $u } { + # At this point, we know that + # $k >= [lindex $list $l 0] + # Either $u == [llength $list] or else $k < [lindex $list $u+1 0] + # We find the midpoint of the interval {l,u} rounded UP, compare + # against it, and set l or u to maintain the invariant. Note that the + # interval shrinks at each step, guaranteeing convergence. + + set m [expr { ( $l + $u + 1 ) / 2 }] + if { $key >= [lindex $list $m 0] } { + set l $m + } else { + set u [expr { $m - 1 }] + } + } + + return $l +} + +#---------------------------------------------------------------------- +# +# clock add -- +# +# Adds an offset to a given time. +# +# Syntax: +# clock add clockval ?count unit?... ?-option value? +# +# Parameters: +# clockval -- Starting time value +# count -- Amount of a unit of time to add +# unit -- Unit of time to add, must be one of: +# years year months month weeks week +# days day hours hour minutes minute +# seconds second +# +# Options: +# -gmt BOOLEAN +# (Deprecated) Flag synonymous with '-timezone :GMT' +# -timezone ZONE +# Name of the time zone in which calculations are to be done. +# -locale NAME +# Name of the locale in which calculations are to be done. +# Used to determine the Gregorian change date. +# +# Results: +# Returns the given time adjusted by the given offset(s) in +# order. +# +# Notes: +# It is possible that adding a number of months or years will adjust the +# day of the month as well. For instance, the time at one month after +# 31 January is either 28 or 29 February, because February has fewer +# than 31 days. +# +#---------------------------------------------------------------------- + +proc ::tcl::clock::add { clockval args } { + if { [llength $args] % 2 != 0 } { + set cmdName "clock add" + return -code error \ + -errorcode [list CLOCK wrongNumArgs] \ + "wrong \# args: should be\ + \"$cmdName clockval ?number units?...\ + ?-gmt boolean? ?-locale LOCALE? ?-timezone ZONE?\"" + } + if { [catch { expr {wide($clockval)} } result] } { + return -code error $result + } + + set offsets {} + set gmt 0 + set locale c + set timezone [GetSystemTimeZone] + + foreach { a b } $args { + if { [string is integer -strict $a] } { + lappend offsets $a $b + } else { + switch -exact -- $a { + -g - -gm - -gmt { + set gmt $b + } + -l - -lo - -loc - -loca - -local - -locale { + set locale [string tolower $b] + } + -t - -ti - -tim - -time - -timez - -timezo - -timezon - + -timezone { + set timezone $b + } + default { + throw [list CLOCK badOption $a] \ + "bad option \"$a\",\ + must be -gmt, -locale or -timezone" + } + } + } + } + + # Check options for validity + + if { [info exists saw(-gmt)] && [info exists saw(-timezone)] } { + return -code error \ + -errorcode [list CLOCK gmtWithTimezone] \ + "cannot use -gmt and -timezone in same call" + } + if { [catch { expr { wide($clockval) } } result] } { + return -code error "expected integer but got \"$clockval\"" + } + if { ![string is boolean -strict $gmt] } { + return -code error "expected boolean value but got \"$gmt\"" + } elseif { $gmt } { + set timezone :GMT + } + + EnterLocale $locale + + set changeover [mc GREGORIAN_CHANGE_DATE] + + if {[catch {SetupTimeZone $timezone} retval opts]} { + dict unset opts -errorinfo + return -options $opts $retval + } + + try { + foreach { quantity unit } $offsets { + switch -exact -- $unit { + years - year { + set clockval [AddMonths [expr { 12 * $quantity }] \ + $clockval $timezone $changeover] + } + months - month { + set clockval [AddMonths $quantity $clockval $timezone \ + $changeover] + } + + weeks - week { + set clockval [AddDays [expr { 7 * $quantity }] \ + $clockval $timezone $changeover] + } + days - day { + set clockval [AddDays $quantity $clockval $timezone \ + $changeover] + } + + hours - hour { + set clockval [expr { 3600 * $quantity + $clockval }] + } + minutes - minute { + set clockval [expr { 60 * $quantity + $clockval }] + } + seconds - second { + set clockval [expr { $quantity + $clockval }] + } + + default { + throw [list CLOCK badUnit $unit] \ + "unknown unit \"$unit\", must be \ + years, months, weeks, days, hours, minutes or seconds" + } + } + } + return $clockval + } trap CLOCK {result opts} { + # Conceal the innards of [clock] when it's an expected error + dict unset opts -errorinfo + return -options $opts $result + } +} + +#---------------------------------------------------------------------- +# +# AddMonths -- +# +# Add a given number of months to a given clock value in a given +# time zone. +# +# Parameters: +# months - Number of months to add (may be negative) +# clockval - Seconds since the epoch before the operation +# timezone - Time zone in which the operation is to be performed +# +# Results: +# Returns the new clock value as a number of seconds since +# the epoch. +# +# Side effects: +# None. +# +#---------------------------------------------------------------------- + +proc ::tcl::clock::AddMonths { months clockval timezone changeover } { + variable DaysInRomanMonthInCommonYear + variable DaysInRomanMonthInLeapYear + variable TZData + + # Convert the time to year, month, day, and fraction of day. + + set date [GetDateFields $clockval $TZData($timezone) $changeover] + dict set date secondOfDay [expr { + [dict get $date localSeconds] % 86400 + }] + dict set date tzName $timezone + + # Add the requisite number of months + + set m [dict get $date month] + incr m $months + incr m -1 + set delta [expr { $m / 12 }] + set mm [expr { $m % 12 }] + dict set date month [expr { $mm + 1 }] + dict incr date year $delta + + # If the date doesn't exist in the current month, repair it + + if { [IsGregorianLeapYear $date] } { + set hath [lindex $DaysInRomanMonthInLeapYear $mm] + } else { + set hath [lindex $DaysInRomanMonthInCommonYear $mm] + } + if { [dict get $date dayOfMonth] > $hath } { + dict set date dayOfMonth $hath + } + + # Reconvert to a number of seconds + + set date [GetJulianDayFromEraYearMonthDay \ + $date[set date {}]\ + $changeover] + dict set date localSeconds [expr { + -210866803200 + + ( 86400 * wide([dict get $date julianDay]) ) + + [dict get $date secondOfDay] + }] + set date [ConvertLocalToUTC $date[set date {}] $TZData($timezone) \ + $changeover] + + return [dict get $date seconds] + +} + +#---------------------------------------------------------------------- +# +# AddDays -- +# +# Add a given number of days to a given clock value in a given time +# zone. +# +# Parameters: +# days - Number of days to add (may be negative) +# clockval - Seconds since the epoch before the operation +# timezone - Time zone in which the operation is to be performed +# changeover - Julian Day on which the Gregorian calendar was adopted +# in the target locale. +# +# Results: +# Returns the new clock value as a number of seconds since the epoch. +# +# Side effects: +# None. +# +#---------------------------------------------------------------------- + +proc ::tcl::clock::AddDays { days clockval timezone changeover } { + variable TZData + + # Convert the time to Julian Day + + set date [GetDateFields $clockval $TZData($timezone) $changeover] + dict set date secondOfDay [expr { + [dict get $date localSeconds] % 86400 + }] + dict set date tzName $timezone + + # Add the requisite number of days + + dict incr date julianDay $days + + # Reconvert to a number of seconds + + dict set date localSeconds [expr { + -210866803200 + + ( 86400 * wide([dict get $date julianDay]) ) + + [dict get $date secondOfDay] + }] + set date [ConvertLocalToUTC $date[set date {}] $TZData($timezone) \ + $changeover] + + return [dict get $date seconds] + +} + +#---------------------------------------------------------------------- +# +# ChangeCurrentLocale -- +# +# The global locale was changed within msgcat. +# Clears the buffered parse functions of the current locale. +# +# Parameters: +# loclist (ignored) +# +# Results: +# None. +# +# Side effects: +# Buffered parse functions are cleared. +# +#---------------------------------------------------------------------- + +proc ::tcl::clock::ChangeCurrentLocale {args} { + variable FormatProc + variable LocaleNumeralCache + variable CachedSystemTimeZone + variable TimeZoneBad + + foreach p [info procs [namespace current]::scanproc'*'current] { + rename $p {} + } + foreach p [info procs [namespace current]::formatproc'*'current] { + rename $p {} + } + + catch {array unset FormatProc *'current} + set LocaleNumeralCache {} +} + +#---------------------------------------------------------------------- +# +# ClearCaches -- +# +# Clears all caches to reclaim the memory used in [clock] +# +# Parameters: +# None. +# +# Results: +# None. +# +# Side effects: +# Caches are cleared. +# +#---------------------------------------------------------------------- + +proc ::tcl::clock::ClearCaches {} { + variable FormatProc + variable LocaleNumeralCache + variable CachedSystemTimeZone + variable TimeZoneBad + + foreach p [info procs [namespace current]::scanproc'*] { + rename $p {} + } + foreach p [info procs [namespace current]::formatproc'*] { + rename $p {} + } + + catch {unset FormatProc} + set LocaleNumeralCache {} + catch {unset CachedSystemTimeZone} + set TimeZoneBad {} + InitTZData +} diff --git a/env/tcl/tcl8.6/encoding/ascii.enc b/env/tcl/tcl8.6/encoding/ascii.enc new file mode 100644 index 0000000..e0320b8 --- /dev/null +++ b/env/tcl/tcl8.6/encoding/ascii.enc @@ -0,0 +1,20 @@ +# Encoding file: ascii, single-byte +S +003F 0 1 +00 +0000000100020003000400050006000700080009000A000B000C000D000E000F +0010001100120013001400150016001700180019001A001B001C001D001E001F +0020002100220023002400250026002700280029002A002B002C002D002E002F +0030003100320033003400350036003700380039003A003B003C003D003E003F +0040004100420043004400450046004700480049004A004B004C004D004E004F +0050005100520053005400550056005700580059005A005B005C005D005E005F +0060006100620063006400650066006700680069006A006B006C006D006E006F +0070007100720073007400750076007700780079007A007B007C007D007E0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 diff --git a/env/tcl/tcl8.6/encoding/big5.enc b/env/tcl/tcl8.6/encoding/big5.enc new file mode 100644 index 0000000..26179f4 --- /dev/null +++ b/env/tcl/tcl8.6/encoding/big5.enc @@ -0,0 +1,1516 @@ +# Encoding file: big5, multi-byte +M +003F 0 89 +00 +0000000100020003000400050006000700080009000A000B000C000D000E000F +0010001100120013001400150016001700180019001A001B001C001D001E001F +0020002100220023002400250026002700280029002A002B002C002D002E002F +0030003100320033003400350036003700380039003A003B003C003D003E003F +0040004100420043004400450046004700480049004A004B004C004D004E004F +0050005100520053005400550056005700580059005A005B005C005D005E005F +0060006100620063006400650066006700680069006A006B006C006D006E006F +0070007100720073007400750076007700780079007A007B007C007D007E007F +0080008100820083008400850086008700880089008A008B008C008D008E008F +0090009100920093009400950096009700980099009A009B009C009D009E009F +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +A1 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +3000FF0C30013002FF0E2022FF1BFF1AFF1FFF01FE3020262025FE50FF64FE52 +00B7FE54FE55FE56FE57FF5C2013FE312014FE33FFFDFE34FE4FFF08FF09FE35 +FE36FF5BFF5DFE37FE3830143015FE39FE3A30103011FE3BFE3C300A300BFE3D +FE3E30083009FE3FFE40300C300DFE41FE42300E300FFE43FE44FE59FE5A0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000FE5BFE5CFE5DFE5E20182019201C201D301D301E20352032FF03FF06FF0A +203B00A7300325CB25CF25B325B225CE2606260525C725C625A125A025BD25BC +32A32105203EFFFDFF3FFFFDFE49FE4AFE4DFE4EFE4BFE4CFE5FFE60FE61FF0B +FF0D00D700F700B1221AFF1CFF1EFF1D226622672260221E22522261FE62FE63 +FE64FE65FE66223C2229222A22A52220221F22BF33D233D1222B222E22352234 +26402642264126092191219321902192219621972199219822252223FFFD0000 +A2 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +FFFDFF0FFF3CFF0400A5301200A200A3FF05FF2021032109FE69FE6AFE6B33D5 +339C339D339E33CE33A1338E338F33C400B05159515B515E515D5161516355E7 +74E97CCE25812582258325842585258625872588258F258E258D258C258B258A +2589253C2534252C2524251C2594250025022595250C251025142518256D0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000256E2570256F2550255E256A256125E225E325E525E4257125722573FF10 +FF11FF12FF13FF14FF15FF16FF17FF18FF192160216121622163216421652166 +216721682169302130223023302430253026302730283029FFFD5344FFFDFF21 +FF22FF23FF24FF25FF26FF27FF28FF29FF2AFF2BFF2CFF2DFF2EFF2FFF30FF31 +FF32FF33FF34FF35FF36FF37FF38FF39FF3AFF41FF42FF43FF44FF45FF46FF47 +FF48FF49FF4AFF4BFF4CFF4DFF4EFF4FFF50FF51FF52FF53FF54FF55FF560000 +A3 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +FF57FF58FF59FF5A039103920393039403950396039703980399039A039B039C +039D039E039F03A003A103A303A403A503A603A703A803A903B103B203B303B4 +03B503B603B703B803B903BA03BB03BC03BD03BE03BF03C003C103C303C403C5 +03C603C703C803C931053106310731083109310A310B310C310D310E310F0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00003110311131123113311431153116311731183119311A311B311C311D311E +311F312031213122312331243125312631273128312902D902C902CA02C702CB +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +A4 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +4E004E594E014E034E434E5D4E864E8C4EBA513F5165516B51E052005201529B +53155341535C53C84E094E0B4E084E0A4E2B4E3851E14E454E484E5F4E5E4E8E +4EA15140520352FA534353C953E3571F58EB5915592759735B505B515B535BF8 +5C0F5C225C385C715DDD5DE55DF15DF25DF35DFE5E725EFE5F0B5F13624D0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00004E114E104E0D4E2D4E304E394E4B5C394E884E914E954E924E944EA24EC1 +4EC04EC34EC64EC74ECD4ECA4ECB4EC4514351415167516D516E516C519751F6 +52065207520852FB52FE52FF53165339534853475345535E538453CB53CA53CD +58EC5929592B592A592D5B545C115C245C3A5C6F5DF45E7B5EFF5F145F155FC3 +62086236624B624E652F6587659765A465B965E566F0670867286B206B626B79 +6BCB6BD46BDB6C0F6C34706B722A7236723B72477259725B72AC738B4E190000 +A5 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +4E164E154E144E184E3B4E4D4E4F4E4E4EE54ED84ED44ED54ED64ED74EE34EE4 +4ED94EDE514551445189518A51AC51F951FA51F8520A52A0529F530553065317 +531D4EDF534A534953615360536F536E53BB53EF53E453F353EC53EE53E953E8 +53FC53F853F553EB53E653EA53F253F153F053E553ED53FB56DB56DA59160000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000592E5931597459765B555B835C3C5DE85DE75DE65E025E035E735E7C5F01 +5F185F175FC5620A625362546252625165A565E6672E672C672A672B672D6B63 +6BCD6C116C106C386C416C406C3E72AF7384738974DC74E67518751F75287529 +7530753175327533758B767D76AE76BF76EE77DB77E277F3793A79BE7A747ACB +4E1E4E1F4E524E534E694E994EA44EA64EA54EFF4F094F194F0A4F154F0D4F10 +4F114F0F4EF24EF64EFB4EF04EF34EFD4F014F0B514951475146514851680000 +A6 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +5171518D51B0521752115212520E521652A3530853215320537053715409540F +540C540A54105401540B54045411540D54085403540E5406541256E056DE56DD +573357305728572D572C572F57295919591A59375938598459785983597D5979 +598259815B575B585B875B885B855B895BFA5C165C795DDE5E065E765E740000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00005F0F5F1B5FD95FD6620E620C620D62106263625B6258653665E965E865EC +65ED66F266F36709673D6734673167356B216B646B7B6C166C5D6C576C596C5F +6C606C506C556C616C5B6C4D6C4E7070725F725D767E7AF97C737CF87F367F8A +7FBD80018003800C80128033807F8089808B808C81E381EA81F381FC820C821B +821F826E8272827E866B8840884C8863897F96214E324EA84F4D4F4F4F474F57 +4F5E4F344F5B4F554F304F504F514F3D4F3A4F384F434F544F3C4F464F630000 +A7 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +4F5C4F604F2F4F4E4F364F594F5D4F484F5A514C514B514D517551B651B75225 +52245229522A522852AB52A952AA52AC532353735375541D542D541E543E5426 +544E542754465443543354485442541B5429544A5439543B5438542E54355436 +5420543C54405431542B541F542C56EA56F056E456EB574A57515740574D0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00005747574E573E5750574F573B58EF593E599D599259A8599E59A359995996 +598D59A45993598A59A55B5D5B5C5B5A5B5B5B8C5B8B5B8F5C2C5C405C415C3F +5C3E5C905C915C945C8C5DEB5E0C5E8F5E875E8A5EF75F045F1F5F645F625F77 +5F795FD85FCC5FD75FCD5FF15FEB5FF85FEA6212621162846297629662806276 +6289626D628A627C627E627962736292626F6298626E62956293629162866539 +653B653865F166F4675F674E674F67506751675C6756675E6749674667600000 +A8 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +675367576B656BCF6C426C5E6C996C816C886C896C856C9B6C6A6C7A6C906C70 +6C8C6C686C966C926C7D6C836C726C7E6C746C866C766C8D6C946C986C827076 +707C707D707872627261726072C472C27396752C752B75377538768276EF77E3 +79C179C079BF7A767CFB7F5580968093809D8098809B809A80B2826F82920000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000828B828D898B89D28A008C378C468C558C9D8D648D708DB38EAB8ECA8F9B +8FB08FC28FC68FC58FC45DE1909190A290AA90A690A3914991C691CC9632962E +9631962A962C4E264E564E734E8B4E9B4E9E4EAB4EAC4F6F4F9D4F8D4F734F7F +4F6C4F9B4F8B4F864F834F704F754F884F694F7B4F964F7E4F8F4F914F7A5154 +51525155516951775176517851BD51FD523B52385237523A5230522E52365241 +52BE52BB5352535453535351536653775378537953D653D453D7547354750000 +A9 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +5496547854955480547B5477548454925486547C549054715476548C549A5462 +5468548B547D548E56FA57835777576A5769576157665764577C591C59495947 +59485944595459BE59BB59D459B959AE59D159C659D059CD59CB59D359CA59AF +59B359D259C55B5F5B645B635B975B9A5B985B9C5B995B9B5C1A5C485C450000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00005C465CB75CA15CB85CA95CAB5CB15CB35E185E1A5E165E155E1B5E115E78 +5E9A5E975E9C5E955E965EF65F265F275F295F805F815F7F5F7C5FDD5FE05FFD +5FF55FFF600F6014602F60356016602A6015602160276029602B601B62166215 +623F623E6240627F62C962CC62C462BF62C262B962D262DB62AB62D362D462CB +62C862A862BD62BC62D062D962C762CD62B562DA62B162D862D662D762C662AC +62CE653E65A765BC65FA66146613660C66066602660E6600660F6615660A0000 +AA +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +6607670D670B676D678B67956771679C677367776787679D6797676F6770677F +6789677E67906775679A6793677C676A67726B236B666B676B7F6C136C1B6CE3 +6CE86CF36CB16CCC6CE56CB36CBD6CBE6CBC6CE26CAB6CD56CD36CB86CC46CB9 +6CC16CAE6CD76CC56CF16CBF6CBB6CE16CDB6CCA6CAC6CEF6CDC6CD66CE00000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00007095708E7092708A7099722C722D723872487267726972C072CE72D972D7 +72D073A973A8739F73AB73A5753D759D7599759A768476C276F276F477E577FD +793E7940794179C979C87A7A7A797AFA7CFE7F547F8C7F8B800580BA80A580A2 +80B180A180AB80A980B480AA80AF81E581FE820D82B3829D829982AD82BD829F +82B982B182AC82A582AF82B882A382B082BE82B7864E8671521D88688ECB8FCE +8FD48FD190B590B890B190B691C791D195779580961C9640963F963B96440000 +AB +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +964296B996E89752975E4E9F4EAD4EAE4FE14FB54FAF4FBF4FE04FD14FCF4FDD +4FC34FB64FD84FDF4FCA4FD74FAE4FD04FC44FC24FDA4FCE4FDE4FB751575192 +519151A0524E5243524A524D524C524B524752C752C952C352C1530D5357537B +539A53DB54AC54C054A854CE54C954B854A654B354C754C254BD54AA54C10000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000054C454C854AF54AB54B154BB54A954A754BF56FF5782578B57A057A357A2 +57CE57AE579359555951594F594E595059DC59D859FF59E359E85A0359E559EA +59DA59E65A0159FB5B695BA35BA65BA45BA25BA55C015C4E5C4F5C4D5C4B5CD9 +5CD25DF75E1D5E255E1F5E7D5EA05EA65EFA5F085F2D5F655F885F855F8A5F8B +5F875F8C5F896012601D60206025600E6028604D60706068606260466043606C +606B606A6064624162DC6316630962FC62ED630162EE62FD630762F162F70000 +AC +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +62EF62EC62FE62F463116302653F654565AB65BD65E26625662D66206627662F +661F66286631662466F767FF67D367F167D467D067EC67B667AF67F567E967EF +67C467D167B467DA67E567B867CF67DE67F367B067D967E267DD67D26B6A6B83 +6B866BB56BD26BD76C1F6CC96D0B6D326D2A6D416D256D0C6D316D1E6D170000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00006D3B6D3D6D3E6D366D1B6CF56D396D276D386D296D2E6D356D0E6D2B70AB +70BA70B370AC70AF70AD70B870AE70A472307272726F727472E972E072E173B7 +73CA73BB73B273CD73C073B3751A752D754F754C754E754B75AB75A475A575A2 +75A3767876867687768876C876C676C376C5770176F976F87709770B76FE76FC +770777DC78027814780C780D794679497948794779B979BA79D179D279CB7A7F +7A817AFF7AFD7C7D7D027D057D007D097D077D047D067F387F8E7FBF80040000 +AD +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +8010800D8011803680D680E580DA80C380C480CC80E180DB80CE80DE80E480DD +81F4822282E78303830582E382DB82E6830482E58302830982D282D782F18301 +82DC82D482D182DE82D382DF82EF830686508679867B867A884D886B898189D4 +8A088A028A038C9E8CA08D748D738DB48ECD8ECC8FF08FE68FE28FEA8FE50000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00008FED8FEB8FE48FE890CA90CE90C190C3914B914A91CD95829650964B964C +964D9762976997CB97ED97F3980198A898DB98DF999699994E584EB3500C500D +50234FEF502650254FF8502950165006503C501F501A501250114FFA50005014 +50284FF15021500B501950184FF34FEE502D502A4FFE502B5009517C51A451A5 +51A251CD51CC51C651CB5256525C5254525B525D532A537F539F539D53DF54E8 +55105501553754FC54E554F2550654FA551454E954ED54E1550954EE54EA0000 +AE +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +54E65527550754FD550F5703570457C257D457CB57C35809590F59575958595A +5A115A185A1C5A1F5A1B5A1359EC5A205A235A295A255A0C5A095B6B5C585BB0 +5BB35BB65BB45BAE5BB55BB95BB85C045C515C555C505CED5CFD5CFB5CEA5CE8 +5CF05CF65D015CF45DEE5E2D5E2B5EAB5EAD5EA75F315F925F915F9060590000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00006063606560506055606D6069606F6084609F609A608D6094608C60856096 +624762F3630862FF634E633E632F635563426346634F6349633A6350633D632A +632B6328634D634C65486549659965C165C566426649664F66436652664C6645 +664166F867146715671768216838684868466853683968426854682968B36817 +684C6851683D67F468506840683C6843682A68456813681868416B8A6B896BB7 +6C236C276C286C266C246CF06D6A6D956D886D876D666D786D776D596D930000 +AF +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +6D6C6D896D6E6D5A6D746D696D8C6D8A6D796D856D656D9470CA70D870E470D9 +70C870CF7239727972FC72F972FD72F872F7738673ED740973EE73E073EA73DE +7554755D755C755A755975BE75C575C775B275B375BD75BC75B975C275B8768B +76B076CA76CD76CE7729771F7720772877E9783078277838781D783478370000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00007825782D7820781F7832795579507960795F7956795E795D7957795A79E4 +79E379E779DF79E679E979D87A847A887AD97B067B117C897D217D177D0B7D0A +7D207D227D147D107D157D1A7D1C7D0D7D197D1B7F3A7F5F7F947FC57FC18006 +8018801580198017803D803F80F1810280F0810580ED80F4810680F880F38108 +80FD810A80FC80EF81ED81EC82008210822A822B8228822C82BB832B83528354 +834A83388350834983358334834F833283398336831783408331832883430000 +B0 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +8654868A86AA869386A486A9868C86A3869C8870887788818882887D88798A18 +8A108A0E8A0C8A158A0A8A178A138A168A0F8A118C488C7A8C798CA18CA28D77 +8EAC8ED28ED48ECF8FB1900190068FF790008FFA8FF490038FFD90058FF89095 +90E190DD90E29152914D914C91D891DD91D791DC91D995839662966396610000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000965B965D96649658965E96BB98E299AC9AA89AD89B259B329B3C4E7E507A +507D505C50475043504C505A504950655076504E5055507550745077504F500F +506F506D515C519551F0526A526F52D252D952D852D55310530F5319533F5340 +533E53C366FC5546556A55665544555E55615543554A55315556554F5555552F +55645538552E555C552C55635533554155575708570B570957DF5805580A5806 +57E057E457FA5802583557F757F9592059625A365A415A495A665A6A5A400000 +B1 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +5A3C5A625A5A5A465A4A5B705BC75BC55BC45BC25BBF5BC65C095C085C075C60 +5C5C5C5D5D075D065D0E5D1B5D165D225D115D295D145D195D245D275D175DE2 +5E385E365E335E375EB75EB85EB65EB55EBE5F355F375F575F6C5F695F6B5F97 +5F995F9E5F985FA15FA05F9C607F60A3608960A060A860CB60B460E660BD0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000060C560BB60B560DC60BC60D860D560C660DF60B860DA60C7621A621B6248 +63A063A76372639663A263A563776367639863AA637163A963896383639B636B +63A863846388639963A163AC6392638F6380637B63696368637A655D65566551 +65596557555F654F655865556554659C659B65AC65CF65CB65CC65CE665D665A +666466686666665E66F952D7671B688168AF68A2689368B5687F687668B168A7 +689768B0688368C468AD688668856894689D68A8689F68A168826B326BBA0000 +B2 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +6BEB6BEC6C2B6D8E6DBC6DF36DD96DB26DE16DCC6DE46DFB6DFA6E056DC76DCB +6DAF6DD16DAE6DDE6DF96DB86DF76DF56DC56DD26E1A6DB56DDA6DEB6DD86DEA +6DF16DEE6DE86DC66DC46DAA6DEC6DBF6DE670F97109710A70FD70EF723D727D +7281731C731B73167313731973877405740A7403740673FE740D74E074F60000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000074F7751C75227565756675627570758F75D475D575B575CA75CD768E76D4 +76D276DB7737773E773C77367738773A786B7843784E79657968796D79FB7A92 +7A957B207B287B1B7B2C7B267B197B1E7B2E7C927C977C957D467D437D717D2E +7D397D3C7D407D307D337D447D2F7D427D327D317F3D7F9E7F9A7FCC7FCE7FD2 +801C804A8046812F81168123812B81298130812482028235823782368239838E +839E8398837883A2839683BD83AB8392838A8393838983A08377837B837C0000 +B3 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +838683A786555F6A86C786C086B686C486B586C686CB86B186AF86C98853889E +888888AB88928896888D888B8993898F8A2A8A1D8A238A258A318A2D8A1F8A1B +8A228C498C5A8CA98CAC8CAB8CA88CAA8CA78D678D668DBE8DBA8EDB8EDF9019 +900D901A90179023901F901D90109015901E9020900F90229016901B90140000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000090E890ED90FD915791CE91F591E691E391E791ED91E99589966A96759673 +96789670967496769677966C96C096EA96E97AE07ADF980298039B5A9CE59E75 +9E7F9EA59EBB50A2508D508550995091508050965098509A670051F152725274 +5275526952DE52DD52DB535A53A5557B558055A7557C558A559D55985582559C +55AA55945587558B558355B355AE559F553E55B2559A55BB55AC55B1557E5589 +55AB5599570D582F582A58345824583058315821581D582058F958FA59600000 +B4 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +5A775A9A5A7F5A925A9B5AA75B735B715BD25BCC5BD35BD05C0A5C0B5C315D4C +5D505D345D475DFD5E455E3D5E405E435E7E5ECA5EC15EC25EC45F3C5F6D5FA9 +5FAA5FA860D160E160B260B660E0611C612360FA611560F060FB60F4616860F1 +610E60F6610961006112621F624963A3638C63CF63C063E963C963C663CD0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000063D263E363D063E163D663ED63EE637663F463EA63DB645263DA63F9655E +6566656265636591659065AF666E667066746676666F6691667A667E667766FE +66FF671F671D68FA68D568E068D868D7690568DF68F568EE68E768F968D268F2 +68E368CB68CD690D6912690E68C968DA696E68FB6B3E6B3A6B3D6B986B966BBC +6BEF6C2E6C2F6C2C6E2F6E386E546E216E326E676E4A6E206E256E236E1B6E5B +6E586E246E566E6E6E2D6E266E6F6E346E4D6E3A6E2C6E436E1D6E3E6ECB0000 +B5 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +6E896E196E4E6E636E446E726E696E5F7119711A7126713071217136716E711C +724C728472807336732573347329743A742A743374227425743574367434742F +741B7426742875257526756B756A75E275DB75E375D975D875DE75E0767B767C +7696769376B476DC774F77ED785D786C786F7A0D7A087A0B7A057A007A980000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00007A977A967AE57AE37B497B567B467B507B527B547B4D7B4B7B4F7B517C9F +7CA57D5E7D507D687D557D2B7D6E7D727D617D667D627D707D7355847FD47FD5 +800B8052808581558154814B8151814E81398146813E814C815381748212821C +83E9840383F8840D83E083C5840B83C183EF83F183F48457840A83F0840C83CC +83FD83F283CA8438840E840483DC840783D483DF865B86DF86D986ED86D486DB +86E486D086DE885788C188C288B1898389968A3B8A608A558A5E8A3C8A410000 +B6 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +8A548A5B8A508A468A348A3A8A368A568C618C828CAF8CBC8CB38CBD8CC18CBB +8CC08CB48CB78CB68CBF8CB88D8A8D858D818DCE8DDD8DCB8DDA8DD18DCC8DDB +8DC68EFB8EF88EFC8F9C902E90359031903890329036910290F5910990FE9163 +916591CF9214921592239209921E920D9210920792119594958F958B95910000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000095939592958E968A968E968B967D96859686968D9672968496C196C596C4 +96C696C796EF96F297CC98059806980898E798EA98EF98E998F298ED99AE99AD +9EC39ECD9ED14E8250AD50B550B250B350C550BE50AC50B750BB50AF50C7527F +5277527D52DF52E652E452E252E3532F55DF55E855D355E655CE55DC55C755D1 +55E355E455EF55DA55E155C555C655E555C957125713585E585158585857585A +5854586B584C586D584A58625852584B59675AC15AC95ACC5ABE5ABD5ABC0000 +B7 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +5AB35AC25AB25D695D6F5E4C5E795EC95EC85F125F595FAC5FAE611A610F6148 +611F60F3611B60F961016108614E614C6144614D613E61346127610D61066137 +622162226413643E641E642A642D643D642C640F641C6414640D643664166417 +6406656C659F65B06697668966876688669666846698668D67036994696D0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000695A697769606954697569306982694A6968696B695E695369796986695D +6963695B6B476B726BC06BBF6BD36BFD6EA26EAF6ED36EB66EC26E906E9D6EC7 +6EC56EA56E986EBC6EBA6EAB6ED16E966E9C6EC46ED46EAA6EA76EB4714E7159 +7169716471497167715C716C7166714C7165715E714671687156723A72527337 +7345733F733E746F745A7455745F745E7441743F7459745B745C757675787600 +75F0760175F275F175FA75FF75F475F376DE76DF775B776B7766775E77630000 +B8 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +7779776A776C775C77657768776277EE788E78B078977898788C7889787C7891 +7893787F797A797F7981842C79BD7A1C7A1A7A207A147A1F7A1E7A9F7AA07B77 +7BC07B607B6E7B677CB17CB37CB57D937D797D917D817D8F7D5B7F6E7F697F6A +7F727FA97FA87FA480568058808680848171817081788165816E8173816B0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00008179817A81668205824784828477843D843184758466846B8449846C845B +843C8435846184638469846D8446865E865C865F86F9871387088707870086FE +86FB870287038706870A885988DF88D488D988DC88D888DD88E188CA88D588D2 +899C89E38A6B8A728A738A668A698A708A878A7C8A638AA08A718A858A6D8A62 +8A6E8A6C8A798A7B8A3E8A688C628C8A8C898CCA8CC78CC88CC48CB28CC38CC2 +8CC58DE18DDF8DE88DEF8DF38DFA8DEA8DE48DE68EB28F038F098EFE8F0A0000 +B9 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +8F9F8FB2904B904A905390429054903C905590509047904F904E904D9051903E +904191129117916C916A916991C9923792579238923D9240923E925B924B9264 +925192349249924D92459239923F925A959896989694969596CD96CB96C996CA +96F796FB96F996F6975697749776981098119813980A9812980C98FC98F40000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000098FD98FE99B399B199B49AE19CE99E829F0E9F139F2050E750EE50E550D6 +50ED50DA50D550CF50D150F150CE50E9516251F352835282533153AD55FE5600 +561B561755FD561456065609560D560E55F75616561F5608561055F657185716 +5875587E58835893588A58795885587D58FD592559225924596A59695AE15AE6 +5AE95AD75AD65AD85AE35B755BDE5BE75BE15BE55BE65BE85BE25BE45BDF5C0D +5C625D845D875E5B5E635E555E575E545ED35ED65F0A5F465F705FB961470000 +BA +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +613F614B617761626163615F615A61586175622A64876458645464A46478645F +647A645164676434646D647B657265A165D765D666A266A8669D699C69A86995 +69C169AE69D369CB699B69B769BB69AB69B469D069CD69AD69CC69A669C369A3 +6B496B4C6C336F336F146EFE6F136EF46F296F3E6F206F2C6F0F6F026F220000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00006EFF6EEF6F066F316F386F326F236F156F2B6F2F6F886F2A6EEC6F016EF2 +6ECC6EF771947199717D718A71847192723E729272967344735074647463746A +7470746D750475917627760D760B7609761376E176E37784777D777F776178C1 +789F78A778B378A978A3798E798F798D7A2E7A317AAA7AA97AED7AEF7BA17B95 +7B8B7B757B977B9D7B947B8F7BB87B877B847CB97CBD7CBE7DBB7DB07D9C7DBD +7DBE7DA07DCA7DB47DB27DB17DBA7DA27DBF7DB57DB87DAD7DD27DC77DAC0000 +BB +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +7F707FE07FE17FDF805E805A808781508180818F8188818A817F818281E781FA +82078214821E824B84C984BF84C684C48499849E84B2849C84CB84B884C084D3 +849084BC84D184CA873F871C873B872287258734871887558737872988F38902 +88F488F988F888FD88E8891A88EF8AA68A8C8A9E8AA38A8D8AA18A938AA40000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00008AAA8AA58AA88A988A918A9A8AA78C6A8C8D8C8C8CD38CD18CD28D6B8D99 +8D958DFC8F148F128F158F138FA390609058905C90639059905E9062905D905B +91199118911E917591789177917492789280928592989296927B9293929C92A8 +927C929195A195A895A995A395A595A49699969C969B96CC96D29700977C9785 +97F69817981898AF98B199039905990C990999C19AAF9AB09AE69B419B429CF4 +9CF69CF39EBC9F3B9F4A5104510050FB50F550F9510251085109510551DC0000 +BC +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +528752885289528D528A52F053B2562E563B56395632563F563456295653564E +565756745636562F56305880589F589E58B3589C58AE58A958A6596D5B095AFB +5B0B5AF55B0C5B085BEE5BEC5BE95BEB5C645C655D9D5D945E625E5F5E615EE2 +5EDA5EDF5EDD5EE35EE05F485F715FB75FB561766167616E615D615561820000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000617C6170616B617E61A7619061AB618E61AC619A61A4619461AE622E6469 +646F6479649E64B26488649064B064A56493649564A9649264AE64AD64AB649A +64AC649964A264B365756577657866AE66AB66B466B16A236A1F69E86A016A1E +6A1969FD6A216A136A0A69F36A026A0569ED6A116B506B4E6BA46BC56BC66F3F +6F7C6F846F516F666F546F866F6D6F5B6F786F6E6F8E6F7A6F706F646F976F58 +6ED56F6F6F606F5F719F71AC71B171A87256729B734E73577469748B74830000 +BD +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +747E7480757F76207629761F7624762676217622769A76BA76E4778E7787778C +7791778B78CB78C578BA78CA78BE78D578BC78D07A3F7A3C7A407A3D7A377A3B +7AAF7AAE7BAD7BB17BC47BB47BC67BC77BC17BA07BCC7CCA7DE07DF47DEF7DFB +7DD87DEC7DDD7DE87DE37DDA7DDE7DE97D9E7DD97DF27DF97F757F777FAF0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00007FE98026819B819C819D81A0819A81988517853D851A84EE852C852D8513 +851185238521851484EC852584FF850687828774877687608766877887688759 +8757874C8753885B885D89108907891289138915890A8ABC8AD28AC78AC48A95 +8ACB8AF88AB28AC98AC28ABF8AB08AD68ACD8AB68AB98ADB8C4C8C4E8C6C8CE0 +8CDE8CE68CE48CEC8CED8CE28CE38CDC8CEA8CE18D6D8D9F8DA38E2B8E108E1D +8E228E0F8E298E1F8E218E1E8EBA8F1D8F1B8F1F8F298F268F2A8F1C8F1E0000 +BE +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +8F259069906E9068906D90779130912D9127913191879189918B918392C592BB +92B792EA92AC92E492C192B392BC92D292C792F092B295AD95B1970497069707 +97099760978D978B978F9821982B981C98B3990A99139912991899DD99D099DF +99DB99D199D599D299D99AB79AEE9AEF9B279B459B449B779B6F9D069D090000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00009D039EA99EBE9ECE58A89F5251125118511451105115518051AA51DD5291 +529352F35659566B5679566956645678566A566856655671566F566C56625676 +58C158BE58C758C5596E5B1D5B345B785BF05C0E5F4A61B2619161A9618A61CD +61B661BE61CA61C8623064C564C164CB64BB64BC64DA64C464C764C264CD64BF +64D264D464BE657466C666C966B966C466C766B86A3D6A386A3A6A596A6B6A58 +6A396A446A626A616A4B6A476A356A5F6A486B596B776C056FC26FB16FA10000 +BF +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +6FC36FA46FC16FA76FB36FC06FB96FB66FA66FA06FB471BE71C971D071D271C8 +71D571B971CE71D971DC71C371C47368749C74A37498749F749E74E2750C750D +76347638763A76E776E577A0779E779F77A578E878DA78EC78E779A67A4D7A4E +7A467A4C7A4B7ABA7BD97C117BC97BE47BDB7BE17BE97BE67CD57CD67E0A0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00007E117E087E1B7E237E1E7E1D7E097E107F797FB27FF07FF17FEE802881B3 +81A981A881FB820882588259854A855985488568856985438549856D856A855E +8783879F879E87A2878D8861892A89328925892B892189AA89A68AE68AFA8AEB +8AF18B008ADC8AE78AEE8AFE8B018B028AF78AED8AF38AF68AFC8C6B8C6D8C93 +8CF48E448E318E348E428E398E358F3B8F2F8F388F338FA88FA6907590749078 +9072907C907A913491929320933692F89333932F932292FC932B9304931A0000 +C0 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +9310932693219315932E931995BB96A796A896AA96D5970E97119716970D9713 +970F975B975C9766979898309838983B9837982D9839982499109928991E991B +9921991A99ED99E299F19AB89ABC9AFB9AED9B289B919D159D239D269D289D12 +9D1B9ED89ED49F8D9F9C512A511F5121513252F5568E56805690568556870000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000568F58D558D358D158CE5B305B2A5B245B7A5C375C685DBC5DBA5DBD5DB8 +5E6B5F4C5FBD61C961C261C761E661CB6232623464CE64CA64D864E064F064E6 +64EC64F164E264ED6582658366D966D66A806A946A846AA26A9C6ADB6AA36A7E +6A976A906AA06B5C6BAE6BDA6C086FD86FF16FDF6FE06FDB6FE46FEB6FEF6F80 +6FEC6FE16FE96FD56FEE6FF071E771DF71EE71E671E571ED71EC71F471E07235 +72467370737274A974B074A674A876467642764C76EA77B377AA77B077AC0000 +C1 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +77A777AD77EF78F778FA78F478EF790179A779AA7A577ABF7C077C0D7BFE7BF7 +7C0C7BE07CE07CDC7CDE7CE27CDF7CD97CDD7E2E7E3E7E467E377E327E437E2B +7E3D7E317E457E417E347E397E487E357E3F7E2F7F447FF37FFC807180728070 +806F807381C681C381BA81C281C081BF81BD81C981BE81E88209827185AA0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00008584857E859C8591859485AF859B858785A8858A866787C087D187B387D2 +87C687AB87BB87BA87C887CB893B893689448938893D89AC8B0E8B178B198B1B +8B0A8B208B1D8B048B108C418C3F8C738CFA8CFD8CFC8CF88CFB8DA88E498E4B +8E488E4A8F448F3E8F428F458F3F907F907D9084908190829080913991A3919E +919C934D938293289375934A9365934B9318937E936C935B9370935A935495CA +95CB95CC95C895C696B196B896D6971C971E97A097D3984698B699359A010000 +C2 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +99FF9BAE9BAB9BAA9BAD9D3B9D3F9E8B9ECF9EDE9EDC9EDD9EDB9F3E9F4B53E2 +569556AE58D958D85B385F5D61E3623364F464F264FE650664FA64FB64F765B7 +66DC67266AB36AAC6AC36ABB6AB86AC26AAE6AAF6B5F6B786BAF7009700B6FFE +70066FFA7011700F71FB71FC71FE71F87377737574A774BF7515765676580000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000765277BD77BF77BB77BC790E79AE7A617A627A607AC47AC57C2B7C277C2A +7C1E7C237C217CE77E547E557E5E7E5A7E617E527E597F487FF97FFB80778076 +81CD81CF820A85CF85A985CD85D085C985B085BA85B985A687EF87EC87F287E0 +898689B289F48B288B398B2C8B2B8C508D058E598E638E668E648E5F8E558EC0 +8F498F4D90879083908891AB91AC91D09394938A939693A293B393AE93AC93B0 +9398939A939795D495D695D095D596E296DC96D996DB96DE972497A397A60000 +C3 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +97AD97F9984D984F984C984E985398BA993E993F993D992E99A59A0E9AC19B03 +9B069B4F9B4E9B4D9BCA9BC99BFD9BC89BC09D519D5D9D609EE09F159F2C5133 +56A558DE58DF58E25BF59F905EEC61F261F761F661F56500650F66E066DD6AE5 +6ADD6ADA6AD3701B701F7028701A701D701570187206720D725872A273780000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000737A74BD74CA74E375877586765F766177C7791979B17A6B7A697C3E7C3F +7C387C3D7C377C407E6B7E6D7E797E697E6A7F857E737FB67FB97FB881D885E9 +85DD85EA85D585E485E585F787FB8805880D87F987FE8960895F8956895E8B41 +8B5C8B588B498B5A8B4E8B4F8B468B598D088D0A8E7C8E728E878E768E6C8E7A +8E748F548F4E8FAD908A908B91B191AE93E193D193DF93C393C893DC93DD93D6 +93E293CD93D893E493D793E895DC96B496E3972A9727976197DC97FB985E0000 +C4 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +9858985B98BC994599499A169A199B0D9BE89BE79BD69BDB9D899D619D729D6A +9D6C9E929E979E939EB452F856A856B756B656B456BC58E45B405B435B7D5BF6 +5DC961F861FA65186514651966E667276AEC703E703070327210737B74CF7662 +76657926792A792C792B7AC77AF67C4C7C437C4D7CEF7CF08FAE7E7D7E7C0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00007E827F4C800081DA826685FB85F9861185FA8606860B8607860A88148815 +896489BA89F88B708B6C8B668B6F8B5F8B6B8D0F8D0D8E898E818E858E8291B4 +91CB9418940393FD95E1973098C49952995199A89A2B9A309A379A359C139C0D +9E799EB59EE89F2F9F5F9F639F615137513856C156C056C259145C6C5DCD61FC +61FE651D651C659566E96AFB6B046AFA6BB2704C721B72A774D674D4766977D3 +7C507E8F7E8C7FBC8617862D861A882388228821881F896A896C89BD8B740000 +C5 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +8B778B7D8D138E8A8E8D8E8B8F5F8FAF91BA942E94339435943A94389432942B +95E297389739973297FF9867986599579A459A439A409A3E9ACF9B549B519C2D +9C259DAF9DB49DC29DB89E9D9EEF9F199F5C9F669F67513C513B56C856CA56C9 +5B7F5DD45DD25F4E61FF65246B0A6B6170517058738074E4758A766E766C0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000079B37C607C5F807E807D81DF8972896F89FC8B808D168D178E918E938F61 +9148944494519452973D973E97C397C1986B99559A559A4D9AD29B1A9C499C31 +9C3E9C3B9DD39DD79F349F6C9F6A9F9456CC5DD662006523652B652A66EC6B10 +74DA7ACA7C647C637C657E937E967E9481E28638863F88318B8A9090908F9463 +946094649768986F995C9A5A9A5B9A579AD39AD49AD19C549C579C569DE59E9F +9EF456D158E9652C705E7671767277D77F507F888836883988628B938B920000 +C6 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +8B9682778D1B91C0946A97429748974497C698709A5F9B229B589C5F9DF99DFA +9E7C9E7D9F079F779F725EF36B1670637C6C7C6E883B89C08EA191C194729470 +9871995E9AD69B239ECC706477DA8B9A947797C99A629A657E9C8B9C8EAA91C5 +947D947E947C9C779C789EF78C54947F9E1A72289A6A9B319E1B9E1E7C720000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000030FE309D309E3005304130423043304430453046304730483049304A304B +304C304D304E304F3050305130523053305430553056305730583059305A305B +305C305D305E305F3060306130623063306430653066306730683069306A306B +306C306D306E306F3070307130723073307430753076307730783079307A307B +307C307D307E307F3080308130823083308430853086308730883089308A308B +308C308D308E308F309030913092309330A130A230A330A430A530A630A70000 +C7 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +30A830A930AA30AB30AC30AD30AE30AF30B030B130B230B330B430B530B630B7 +30B830B930BA30BB30BC30BD30BE30BF30C030C130C230C330C430C530C630C7 +30C830C930CA30CB30CC30CD30CE30CF30D030D130D230D330D430D530D630D7 +30D830D930DA30DB30DC30DD30DE30DF30E030E130E230E330E430E530E60000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000030E730E830E930EA30EB30EC30ED30EE30EF30F030F130F230F330F430F5 +30F60414041504010416041704180419041A041B041C04230424042504260427 +04280429042A042B042C042D042E042F04300431043204330434043504510436 +043704380439043A043B043C043D043E043F0440044104420443044404450446 +044704480449044A044B044C044D044E044F2460246124622463246424652466 +246724682469247424752476247724782479247A247B247C247D000000000000 +C9 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +4E424E5C51F5531A53824E074E0C4E474E8D56D7FA0C5C6E5F734E0F51874E0E +4E2E4E934EC24EC94EC8519852FC536C53B957205903592C5C105DFF65E16BB3 +6BCC6C14723F4E314E3C4EE84EDC4EE94EE14EDD4EDA520C531C534C57225723 +5917592F5B815B845C125C3B5C745C735E045E805E825FC9620962506C150000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00006C366C436C3F6C3B72AE72B0738A79B8808A961E4F0E4F184F2C4EF54F14 +4EF14F004EF74F084F1D4F024F054F224F134F044EF44F1251B1521352095210 +52A65322531F534D538A540756E156DF572E572A5734593C5980597C5985597B +597E5977597F5B565C155C255C7C5C7A5C7B5C7E5DDF5E755E845F025F1A5F74 +5FD55FD45FCF625C625E626462616266626262596260625A626565EF65EE673E +67396738673B673A673F673C67336C186C466C526C5C6C4F6C4A6C546C4B0000 +CA +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +6C4C7071725E72B472B5738E752A767F7A757F518278827C8280827D827F864D +897E909990979098909B909496229624962096234F564F3B4F624F494F534F64 +4F3E4F674F524F5F4F414F584F2D4F334F3F4F61518F51B9521C521E522152AD +52AE530953635372538E538F54305437542A545454455419541C542554180000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000543D544F544154285424544756EE56E756E557415745574C5749574B5752 +5906594059A6599859A05997598E59A25990598F59A759A15B8E5B925C285C2A +5C8D5C8F5C885C8B5C895C925C8A5C865C935C955DE05E0A5E0E5E8B5E895E8C +5E885E8D5F055F1D5F785F765FD25FD15FD05FED5FE85FEE5FF35FE15FE45FE3 +5FFA5FEF5FF75FFB60005FF4623A6283628C628E628F629462876271627B627A +6270628162886277627D62726274653765F065F465F365F265F5674567470000 +CB +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +67596755674C6748675D674D675A674B6BD06C196C1A6C786C676C6B6C846C8B +6C8F6C716C6F6C696C9A6C6D6C876C956C9C6C666C736C656C7B6C8E7074707A +726372BF72BD72C372C672C172BA72C573957397739373947392753A75397594 +75957681793D80348095809980908092809C8290828F8285828E829182930000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000828A828382848C788FC98FBF909F90A190A5909E90A790A096309628962F +962D4E334F984F7C4F854F7D4F804F874F764F744F894F844F774F4C4F974F6A +4F9A4F794F814F784F904F9C4F944F9E4F924F824F954F6B4F6E519E51BC51BE +5235523252335246523152BC530A530B533C539253945487547F548154915482 +5488546B547A547E5465546C54745466548D546F546154605498546354675464 +56F756F9576F5772576D576B57715770577657805775577B5773577457620000 +CC +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +5768577D590C594559B559BA59CF59CE59B259CC59C159B659BC59C359D659B1 +59BD59C059C859B459C75B625B655B935B955C445C475CAE5CA45CA05CB55CAF +5CA85CAC5C9F5CA35CAD5CA25CAA5CA75C9D5CA55CB65CB05CA65E175E145E19 +5F285F225F235F245F545F825F7E5F7D5FDE5FE5602D602660196032600B0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00006034600A60176033601A601E602C6022600D6010602E60136011600C6009 +601C6214623D62AD62B462D162BE62AA62B662CA62AE62B362AF62BB62A962B0 +62B8653D65A865BB660965FC66046612660865FB6603660B660D660565FD6611 +661066F6670A6785676C678E67926776677B6798678667846774678D678C677A +679F679167996783677D67816778677967946B256B806B7E6BDE6C1D6C936CEC +6CEB6CEE6CD96CB66CD46CAD6CE76CB76CD06CC26CBA6CC36CC66CED6CF20000 +CD +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +6CD26CDD6CB46C8A6C9D6C806CDE6CC06D306CCD6CC76CB06CF96CCF6CE96CD1 +709470987085709370867084709170967082709A7083726A72D672CB72D872C9 +72DC72D272D472DA72CC72D173A473A173AD73A673A273A073AC739D74DD74E8 +753F7540753E758C759876AF76F376F176F076F577F877FC77F977FB77FA0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000077F77942793F79C57A787A7B7AFB7C757CFD8035808F80AE80A380B880B5 +80AD822082A082C082AB829A8298829B82B582A782AE82BC829E82BA82B482A8 +82A182A982C282A482C382B682A28670866F866D866E8C568FD28FCB8FD38FCD +8FD68FD58FD790B290B490AF90B390B09639963D963C963A96434FCD4FC54FD3 +4FB24FC94FCB4FC14FD44FDC4FD94FBB4FB34FDB4FC74FD64FBA4FC04FB94FEC +5244524952C052C2533D537C539753965399539854BA54A154AD54A554CF0000 +CE +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +54C3830D54B754AE54D654B654C554C654A0547054BC54A254BE547254DE54B0 +57B5579E579F57A4578C5797579D579B57945798578F579957A5579A579558F4 +590D595359E159DE59EE5A0059F159DD59FA59FD59FC59F659E459F259F759DB +59E959F359F559E059FE59F459ED5BA85C4C5CD05CD85CCC5CD75CCB5CDB0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00005CDE5CDA5CC95CC75CCA5CD65CD35CD45CCF5CC85CC65CCE5CDF5CF85DF9 +5E215E225E235E205E245EB05EA45EA25E9B5EA35EA55F075F2E5F565F866037 +603960546072605E6045605360476049605B604C60406042605F602460446058 +6066606E6242624362CF630D630B62F5630E630362EB62F9630F630C62F862F6 +63006313631462FA631562FB62F06541654365AA65BF6636662166326635661C +662666226633662B663A661D66346639662E670F671067C167F267C867BA0000 +CF +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +67DC67BB67F867D867C067B767C567EB67E467DF67B567CD67B367F767F667EE +67E367C267B967CE67E767F067B267FC67C667ED67CC67AE67E667DB67FA67C9 +67CA67C367EA67CB6B286B826B846BB66BD66BD86BE06C206C216D286D346D2D +6D1F6D3C6D3F6D126D0A6CDA6D336D046D196D3A6D1A6D116D006D1D6D420000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00006D016D186D376D036D0F6D406D076D206D2C6D086D226D096D1070B7709F +70BE70B170B070A170B470B570A972417249724A726C72707273726E72CA72E4 +72E872EB72DF72EA72E672E3738573CC73C273C873C573B973B673B573B473EB +73BF73C773BE73C373C673B873CB74EC74EE752E7547754875A775AA767976C4 +7708770377047705770A76F776FB76FA77E777E878067811781278057810780F +780E780978037813794A794C794B7945794479D579CD79CF79D679CE7A800000 +D0 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +7A7E7AD17B007B017C7A7C787C797C7F7C807C817D037D087D017F587F917F8D +7FBE8007800E800F8014803780D880C780E080D180C880C280D080C580E380D9 +80DC80CA80D580C980CF80D780E680CD81FF8221829482D982FE82F9830782E8 +830082D5833A82EB82D682F482EC82E182F282F5830C82FB82F682F082EA0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000082E482E082FA82F382ED86778674867C86738841884E8867886A886989D3 +8A048A078D728FE38FE18FEE8FE090F190BD90BF90D590C590BE90C790CB90C8 +91D491D39654964F96519653964A964E501E50055007501350225030501B4FF5 +4FF450335037502C4FF64FF75017501C502050275035502F5031500E515A5194 +519351CA51C451C551C851CE5261525A5252525E525F5255526252CD530E539E +552654E25517551254E754F354E4551A54FF5504550854EB5511550554F10000 +D1 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +550A54FB54F754F854E0550E5503550B5701570257CC583257D557D257BA57C6 +57BD57BC57B857B657BF57C757D057B957C1590E594A5A195A165A2D5A2E5A15 +5A0F5A175A0A5A1E5A335B6C5BA75BAD5BAC5C035C565C545CEC5CFF5CEE5CF1 +5CF75D005CF95E295E285EA85EAE5EAA5EAC5F335F305F67605D605A60670000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000604160A26088608060926081609D60836095609B60976087609C608E6219 +624662F263106356632C634463456336634363E46339634B634A633C63296341 +6334635863546359632D63476333635A63516338635763406348654A654665C6 +65C365C465C2664A665F6647665167126713681F681A684968326833683B684B +684F68166831681C6835682B682D682F684E68446834681D6812681468266828 +682E684D683A682568206B2C6B2F6B2D6B316B346B6D80826B886BE66BE40000 +D2 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +6BE86BE36BE26BE76C256D7A6D636D646D766D0D6D616D926D586D626D6D6D6F +6D916D8D6DEF6D7F6D866D5E6D676D606D976D706D7C6D5F6D826D986D2F6D68 +6D8B6D7E6D806D846D166D836D7B6D7D6D756D9070DC70D370D170DD70CB7F39 +70E270D770D270DE70E070D470CD70C570C670C770DA70CE70E1724272780000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000072777276730072FA72F472FE72F672F372FB730173D373D973E573D673BC +73E773E373E973DC73D273DB73D473DD73DA73D773D873E874DE74DF74F474F5 +7521755B755F75B075C175BB75C475C075BF75B675BA768A76C9771D771B7710 +771377127723771177157719771A772277277823782C78227835782F7828782E +782B782178297833782A78317954795B794F795C79537952795179EB79EC79E0 +79EE79ED79EA79DC79DE79DD7A867A897A857A8B7A8C7A8A7A877AD87B100000 +D3 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +7B047B137B057B0F7B087B0A7B0E7B097B127C847C917C8A7C8C7C887C8D7C85 +7D1E7D1D7D117D0E7D187D167D137D1F7D127D0F7D0C7F5C7F617F5E7F607F5D +7F5B7F967F927FC37FC27FC08016803E803980FA80F280F980F5810180FB8100 +8201822F82258333832D83448319835183258356833F83418326831C83220000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00008342834E831B832A8308833C834D8316832483208337832F832983478345 +834C8353831E832C834B832783488653865286A286A88696868D8691869E8687 +86978686868B869A868586A5869986A186A786958698868E869D869086948843 +8844886D88758876887288808871887F886F8883887E8874887C8A128C478C57 +8C7B8CA48CA38D768D788DB58DB78DB68ED18ED38FFE8FF590028FFF8FFB9004 +8FFC8FF690D690E090D990DA90E390DF90E590D890DB90D790DC90E491500000 +D4 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +914E914F91D591E291DA965C965F96BC98E39ADF9B2F4E7F5070506A5061505E +50605053504B505D50725048504D5041505B504A506250155045505F5069506B +5063506450465040506E50735057505151D0526B526D526C526E52D652D3532D +539C55755576553C554D55505534552A55515562553655355530555255450000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000550C55325565554E55395548552D553B5540554B570A570757FB581457E2 +57F657DC57F4580057ED57FD580857F8580B57F357CF580757EE57E357F257E5 +57EC57E1580E57FC581057E75801580C57F157E957F0580D5804595C5A605A58 +5A555A675A5E5A385A355A6D5A505A5F5A655A6C5A535A645A575A435A5D5A52 +5A445A5B5A485A8E5A3E5A4D5A395A4C5A705A695A475A515A565A425A5C5B72 +5B6E5BC15BC05C595D1E5D0B5D1D5D1A5D205D0C5D285D0D5D265D255D0F0000 +D5 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +5D305D125D235D1F5D2E5E3E5E345EB15EB45EB95EB25EB35F365F385F9B5F96 +5F9F608A6090608660BE60B060BA60D360D460CF60E460D960DD60C860B160DB +60B760CA60BF60C360CD60C063326365638A6382637D63BD639E63AD639D6397 +63AB638E636F63876390636E63AF6375639C636D63AE637C63A4633B639F0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00006378638563816391638D6370655365CD66656661665B6659665C66626718 +687968876890689C686D686E68AE68AB6956686F68A368AC68A96875687468B2 +688F68776892687C686B687268AA68806871687E689B6896688B68A0688968A4 +6878687B6891688C688A687D6B366B336B376B386B916B8F6B8D6B8E6B8C6C2A +6DC06DAB6DB46DB36E746DAC6DE96DE26DB76DF66DD46E006DC86DE06DDF6DD6 +6DBE6DE56DDC6DDD6DDB6DF46DCA6DBD6DED6DF06DBA6DD56DC26DCF6DC90000 +D6 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +6DD06DF26DD36DFD6DD76DCD6DE36DBB70FA710D70F7711770F4710C70F07104 +70F3711070FC70FF71067113710070F870F6710B7102710E727E727B727C727F +731D7317730773117318730A730872FF730F731E738873F673F873F574047401 +73FD7407740073FA73FC73FF740C740B73F474087564756375CE75D275CF0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000075CB75CC75D175D0768F768976D37739772F772D7731773277347733773D +7725773B7735784878527849784D784A784C782678457850796479677969796A +7963796B796179BB79FA79F879F679F77A8F7A947A907B357B477B347B257B30 +7B227B247B337B187B2A7B1D7B317B2B7B2D7B2F7B327B387B1A7B237C947C98 +7C967CA37D357D3D7D387D367D3A7D457D2C7D297D417D477D3E7D3F7D4A7D3B +7D287F637F957F9C7F9D7F9B7FCA7FCB7FCD7FD07FD17FC77FCF7FC9801F0000 +D7 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +801E801B804780438048811881258119811B812D811F812C811E812181158127 +811D8122821182388233823A823482328274839083A383A8838D837A837383A4 +8374838F8381839583998375839483A9837D8383838C839D839B83AA838B837E +83A583AF8388839783B0837F83A6838783AE8376839A8659865686BF86B70000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000086C286C186C586BA86B086C886B986B386B886CC86B486BB86BC86C386BD +86BE88528889889588A888A288AA889A889188A1889F889888A78899889B8897 +88A488AC888C8893888E898289D689D989D58A308A278A2C8A1E8C398C3B8C5C +8C5D8C7D8CA58D7D8D7B8D798DBC8DC28DB98DBF8DC18ED88EDE8EDD8EDC8ED7 +8EE08EE19024900B9011901C900C902190EF90EA90F090F490F290F390D490EB +90EC90E991569158915A9153915591EC91F491F191F391F891E491F991EA0000 +D8 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +91EB91F791E891EE957A95869588967C966D966B9671966F96BF976A980498E5 +9997509B50955094509E508B50A35083508C508E509D5068509C509250825087 +515F51D45312531153A453A7559155A855A555AD5577564555A255935588558F +55B5558155A3559255A4557D558C55A6557F559555A1558E570C582958370000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00005819581E58275823582857F558485825581C581B5833583F5836582E5839 +5838582D582C583B59615AAF5A945A9F5A7A5AA25A9E5A785AA65A7C5AA55AAC +5A955AAE5A375A845A8A5A975A835A8B5AA95A7B5A7D5A8C5A9C5A8F5A935A9D +5BEA5BCD5BCB5BD45BD15BCA5BCE5C0C5C305D375D435D6B5D415D4B5D3F5D35 +5D515D4E5D555D335D3A5D525D3D5D315D595D425D395D495D385D3C5D325D36 +5D405D455E445E415F585FA65FA55FAB60C960B960CC60E260CE60C461140000 +D9 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +60F2610A6116610560F5611360F860FC60FE60C161036118611D611060FF6104 +610B624A639463B163B063CE63E563E863EF63C3649D63F363CA63E063F663D5 +63F263F5646163DF63BE63DD63DC63C463D863D363C263C763CC63CB63C863F0 +63D763D965326567656A6564655C65686565658C659D659E65AE65D065D20000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000667C666C667B668066716679666A66726701690C68D3690468DC692A68EC +68EA68F1690F68D668F768EB68E468F66913691068F368E1690768CC69086970 +68B4691168EF68C6691468F868D068FD68FC68E8690B690A691768CE68C868DD +68DE68E668F468D1690668D468E96915692568C76B396B3B6B3F6B3C6B946B97 +6B996B956BBD6BF06BF26BF36C306DFC6E466E476E1F6E496E886E3C6E3D6E45 +6E626E2B6E3F6E416E5D6E736E1C6E336E4B6E406E516E3B6E036E2E6E5E0000 +DA +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +6E686E5C6E616E316E286E606E716E6B6E396E226E306E536E656E276E786E64 +6E776E556E796E526E666E356E366E5A7120711E712F70FB712E713171237125 +71227132711F7128713A711B724B725A7288728972867285728B7312730B7330 +73227331733373277332732D732673237335730C742E742C7430742B74160000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000741A7421742D743174247423741D74297420743274FB752F756F756C75E7 +75DA75E175E675DD75DF75E475D77695769276DA774677477744774D7745774A +774E774B774C77DE77EC786078647865785C786D7871786A786E787078697868 +785E786279747973797279707A027A0A7A037A0C7A047A997AE67AE47B4A7B3B +7B447B487B4C7B4E7B407B587B457CA27C9E7CA87CA17D587D6F7D637D537D56 +7D677D6A7D4F7D6D7D5C7D6B7D527D547D697D517D5F7D4E7F3E7F3F7F650000 +DB +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +7F667FA27FA07FA17FD78051804F805080FE80D48143814A8152814F8147813D +814D813A81E681EE81F781F881F98204823C823D823F8275833B83CF83F98423 +83C083E8841283E783E483FC83F6841083C683C883EB83E383BF840183DD83E5 +83D883FF83E183CB83CE83D683F583C98409840F83DE8411840683C283F30000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000083D583FA83C783D183EA841383C383EC83EE83C483FB83D783E2841B83DB +83FE86D886E286E686D386E386DA86EA86DD86EB86DC86EC86E986D786E886D1 +88488856885588BA88D788B988B888C088BE88B688BC88B788BD88B2890188C9 +89958998899789DD89DA89DB8A4E8A4D8A398A598A408A578A588A448A458A52 +8A488A518A4A8A4C8A4F8C5F8C818C808CBA8CBE8CB08CB98CB58D848D808D89 +8DD88DD38DCD8DC78DD68DDC8DCF8DD58DD98DC88DD78DC58EEF8EF78EFA0000 +DC +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +8EF98EE68EEE8EE58EF58EE78EE88EF68EEB8EF18EEC8EF48EE9902D9034902F +9106912C910490FF90FC910890F990FB9101910091079105910391619164915F +916291609201920A92259203921A9226920F920C9200921291FF91FD92069204 +92279202921C92249219921792059216957B958D958C95909687967E96880000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000096899683968096C296C896C396F196F0976C9770976E980798A998EB9CE6 +9EF94E834E844EB650BD50BF50C650AE50C450CA50B450C850C250B050C150BA +50B150CB50C950B650B851D7527A5278527B527C55C355DB55CC55D055CB55CA +55DD55C055D455C455E955BF55D2558D55CF55D555E255D655C855F255CD55D9 +55C25714585358685864584F584D5849586F5855584E585D58595865585B583D +5863587158FC5AC75AC45ACB5ABA5AB85AB15AB55AB05ABF5AC85ABB5AC60000 +DD +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +5AB75AC05ACA5AB45AB65ACD5AB95A905BD65BD85BD95C1F5C335D715D635D4A +5D655D725D6C5D5E5D685D675D625DF05E4F5E4E5E4A5E4D5E4B5EC55ECC5EC6 +5ECB5EC75F405FAF5FAD60F76149614A612B614561366132612E6146612F614F +612961406220916862236225622463C563F163EB641064126409642064240000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000064336443641F641564186439643764226423640C64266430642864416435 +642F640A641A644064256427640B63E7641B642E6421640E656F659265D36686 +668C66956690668B668A66996694667867206966695F6938694E69626971693F +6945696A6939694269576959697A694869496935696C6933693D696568F06978 +693469696940696F69446976695869416974694C693B694B6937695C694F6951 +69326952692F697B693C6B466B456B436B426B486B416B9BFA0D6BFB6BFC0000 +DE +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +6BF96BF76BF86E9B6ED66EC86E8F6EC06E9F6E936E946EA06EB16EB96EC66ED2 +6EBD6EC16E9E6EC96EB76EB06ECD6EA66ECF6EB26EBE6EC36EDC6ED86E996E92 +6E8E6E8D6EA46EA16EBF6EB36ED06ECA6E976EAE6EA371477154715271637160 +7141715D716271727178716A7161714271587143714B7170715F715071530000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00007144714D715A724F728D728C72917290728E733C7342733B733A7340734A +73497444744A744B7452745174577440744F7450744E74427446744D745474E1 +74FF74FE74FD751D75797577698375EF760F760375F775FE75FC75F975F87610 +75FB75F675ED75F575FD769976B576DD7755775F776077527756775A77697767 +77547759776D77E07887789A7894788F788478957885788678A1788378797899 +78807896787B797C7982797D79797A117A187A197A127A177A157A227A130000 +DF +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +7A1B7A107AA37AA27A9E7AEB7B667B647B6D7B747B697B727B657B737B717B70 +7B617B787B767B637CB27CB47CAF7D887D867D807D8D7D7F7D857D7A7D8E7D7B +7D837D7C7D8C7D947D847D7D7D927F6D7F6B7F677F687F6C7FA67FA57FA77FDB +7FDC8021816481608177815C8169815B816281726721815E81768167816F0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000081448161821D8249824482408242824584F1843F845684768479848F848D +846584518440848684678430844D847D845A845984748473845D8507845E8437 +843A8434847A8443847884328445842983D9844B842F8442842D845F84708439 +844E844C8452846F84C5848E843B8447843684338468847E8444842B84608454 +846E8450870B870486F7870C86FA86D686F5874D86F8870E8709870186F6870D +870588D688CB88CD88CE88DE88DB88DA88CC88D08985899B89DF89E589E40000 +E0 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +89E189E089E289DC89E68A768A868A7F8A618A3F8A778A828A848A758A838A81 +8A748A7A8C3C8C4B8C4A8C658C648C668C868C848C858CCC8D688D698D918D8C +8D8E8D8F8D8D8D938D948D908D928DF08DE08DEC8DF18DEE8DD08DE98DE38DE2 +8DE78DF28DEB8DF48F068EFF8F018F008F058F078F088F028F0B9052903F0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000090449049903D9110910D910F911191169114910B910E916E916F92489252 +9230923A926692339265925E9283922E924A9246926D926C924F92609267926F +92369261927092319254926392509272924E9253924C92569232959F959C959E +959B969296939691969796CE96FA96FD96F896F59773977797789772980F980D +980E98AC98F698F999AF99B299B099B59AAD9AAB9B5B9CEA9CED9CE79E809EFD +50E650D450D750E850F350DB50EA50DD50E450D350EC50F050EF50E350E00000 +E1 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +51D85280528152E952EB533053AC56275615560C561255FC560F561C56015613 +560255FA561D560455FF55F95889587C5890589858865881587F5874588B587A +58875891588E587658825888587B5894588F58FE596B5ADC5AEE5AE55AD55AEA +5ADA5AED5AEB5AF35AE25AE05ADB5AEC5ADE5ADD5AD95AE85ADF5B775BE00000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00005BE35C635D825D805D7D5D865D7A5D815D775D8A5D895D885D7E5D7C5D8D +5D795D7F5E585E595E535ED85ED15ED75ECE5EDC5ED55ED95ED25ED45F445F43 +5F6F5FB6612C61286141615E61716173615261536172616C618061746154617A +615B6165613B616A6161615662296227622B642B644D645B645D647464766472 +6473647D6475646664A6644E6482645E645C644B645364606450647F643F646C +646B645964656477657365A066A166A0669F67056704672269B169B669C90000 +E2 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +69A069CE699669B069AC69BC69916999698E69A7698D69A969BE69AF69BF69C4 +69BD69A469D469B969CA699A69CF69B3699369AA69A1699E69D96997699069C2 +69B569A569C66B4A6B4D6B4B6B9E6B9F6BA06BC36BC46BFE6ECE6EF56EF16F03 +6F256EF86F376EFB6F2E6F096F4E6F196F1A6F276F186F3B6F126EED6F0A0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00006F366F736EF96EEE6F2D6F406F306F3C6F356EEB6F076F0E6F436F056EFD +6EF66F396F1C6EFC6F3A6F1F6F0D6F1E6F086F21718771907189718071857182 +718F717B718671817197724472537297729572937343734D7351734C74627473 +7471747574727467746E750075027503757D759076167608760C76157611760A +761476B87781777C77857782776E7780776F777E778378B278AA78B478AD78A8 +787E78AB789E78A578A078AC78A278A47998798A798B79967995799479930000 +E3 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +79977988799279907A2B7A4A7A307A2F7A287A267AA87AAB7AAC7AEE7B887B9C +7B8A7B917B907B967B8D7B8C7B9B7B8E7B857B9852847B997BA47B827CBB7CBF +7CBC7CBA7DA77DB77DC27DA37DAA7DC17DC07DC57D9D7DCE7DC47DC67DCB7DCC +7DAF7DB97D967DBC7D9F7DA67DAE7DA97DA17DC97F737FE27FE37FE57FDE0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00008024805D805C8189818681838187818D818C818B8215849784A484A1849F +84BA84CE84C284AC84AE84AB84B984B484C184CD84AA849A84B184D0849D84A7 +84BB84A2849484C784CC849B84A984AF84A884D6849884B684CF84A084D784D4 +84D284DB84B084918661873387238728876B8740872E871E87218719871B8743 +872C8741873E874687208732872A872D873C8712873A87318735874287268727 +87388724871A8730871188F788E788F188F288FA88FE88EE88FC88F688FB0000 +E4 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +88F088EC88EB899D89A1899F899E89E989EB89E88AAB8A998A8B8A928A8F8A96 +8C3D8C688C698CD58CCF8CD78D968E098E028DFF8E0D8DFD8E0A8E038E078E06 +8E058DFE8E008E048F108F118F0E8F0D9123911C91209122911F911D911A9124 +9121911B917A91729179917392A592A49276929B927A92A0929492AA928D0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000092A6929A92AB92799297927F92A392EE928E9282929592A2927D928892A1 +928A9286928C929992A7927E928792A9929D928B922D969E96A196FF9758977D +977A977E978397809782977B97849781977F97CE97CD981698AD98AE99029900 +9907999D999C99C399B999BB99BA99C299BD99C79AB19AE39AE79B3E9B3F9B60 +9B619B5F9CF19CF29CF59EA750FF5103513050F85106510750F650FE510B510C +50FD510A528B528C52F152EF56485642564C56355641564A5649564656580000 +E5 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +565A56405633563D562C563E5638562A563A571A58AB589D58B158A058A358AF +58AC58A558A158FF5AFF5AF45AFD5AF75AF65B035AF85B025AF95B015B075B05 +5B0F5C675D995D975D9F5D925DA25D935D955DA05D9C5DA15D9A5D9E5E695E5D +5E605E5C7DF35EDB5EDE5EE15F495FB2618B6183617961B161B061A261890000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000619B619361AF61AD619F619261AA61A1618D616661B3622D646E64706496 +64A064856497649C648F648B648A648C64A3649F646864B164986576657A6579 +657B65B265B366B566B066A966B266B766AA66AF6A006A066A1769E569F86A15 +69F169E46A2069FF69EC69E26A1B6A1D69FE6A2769F269EE6A1469F769E76A40 +6A0869E669FB6A0D69FC69EB6A096A046A186A256A0F69F66A266A0769F46A16 +6B516BA56BA36BA26BA66C016C006BFF6C026F416F266F7E6F876FC66F920000 +E6 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +6F8D6F896F8C6F626F4F6F856F5A6F966F766F6C6F826F556F726F526F506F57 +6F946F936F5D6F006F616F6B6F7D6F676F906F536F8B6F696F7F6F956F636F77 +6F6A6F7B71B271AF719B71B071A0719A71A971B5719D71A5719E71A471A171AA +719C71A771B37298729A73587352735E735F7360735D735B7361735A73590000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000736274877489748A74867481747D74857488747C747975087507757E7625 +761E7619761D761C7623761A7628761B769C769D769E769B778D778F77897788 +78CD78BB78CF78CC78D178CE78D478C878C378C478C9799A79A179A0799C79A2 +799B6B767A397AB27AB47AB37BB77BCB7BBE7BAC7BCE7BAF7BB97BCA7BB57CC5 +7CC87CCC7CCB7DF77DDB7DEA7DE77DD77DE17E037DFA7DE67DF67DF17DF07DEE +7DDF7F767FAC7FB07FAD7FED7FEB7FEA7FEC7FE67FE88064806781A3819F0000 +E7 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +819E819581A2819981978216824F825382528250824E82518524853B850F8500 +8529850E8509850D851F850A8527851C84FB852B84FA8508850C84F4852A84F2 +851584F784EB84F384FC851284EA84E9851684FE8528851D852E850284FD851E +84F68531852684E784E884F084EF84F9851885208530850B8519852F86620000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000875687638764877787E1877387588754875B87528761875A8751875E876D +876A8750874E875F875D876F876C877A876E875C8765874F877B877587628767 +8769885A8905890C8914890B891789188919890689168911890E890989A289A4 +89A389ED89F089EC8ACF8AC68AB88AD38AD18AD48AD58ABB8AD78ABE8AC08AC5 +8AD88AC38ABA8ABD8AD98C3E8C4D8C8F8CE58CDF8CD98CE88CDA8CDD8CE78DA0 +8D9C8DA18D9B8E208E238E258E248E2E8E158E1B8E168E118E198E268E270000 +E8 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +8E148E128E188E138E1C8E178E1A8F2C8F248F188F1A8F208F238F168F179073 +9070906F9067906B912F912B9129912A91329126912E91859186918A91819182 +9184918092D092C392C492C092D992B692CF92F192DF92D892E992D792DD92CC +92EF92C292E892CA92C892CE92E692CD92D592C992E092DE92E792D192D30000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000092B592E192C692B4957C95AC95AB95AE95B096A496A296D3970597089702 +975A978A978E978897D097CF981E981D9826982998289820981B982798B29908 +98FA9911991499169917991599DC99CD99CF99D399D499CE99C999D699D899CB +99D799CC9AB39AEC9AEB9AF39AF29AF19B469B439B679B749B719B669B769B75 +9B709B689B649B6C9CFC9CFA9CFD9CFF9CF79D079D009CF99CFB9D089D059D04 +9E839ED39F0F9F10511C51135117511A511151DE533453E156705660566E0000 +E9 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +567356665663566D5672565E5677571C571B58C858BD58C958BF58BA58C258BC +58C65B175B195B1B5B215B145B135B105B165B285B1A5B205B1E5BEF5DAC5DB1 +5DA95DA75DB55DB05DAE5DAA5DA85DB25DAD5DAF5DB45E675E685E665E6F5EE9 +5EE75EE65EE85EE55F4B5FBC619D61A8619661C561B461C661C161CC61BA0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000061BF61B8618C64D764D664D064CF64C964BD648964C364DB64F364D96533 +657F657C65A266C866BE66C066CA66CB66CF66BD66BB66BA66CC67236A346A66 +6A496A676A326A686A3E6A5D6A6D6A766A5B6A516A286A5A6A3B6A3F6A416A6A +6A646A506A4F6A546A6F6A696A606A3C6A5E6A566A556A4D6A4E6A466B556B54 +6B566BA76BAA6BAB6BC86BC76C046C036C066FAD6FCB6FA36FC76FBC6FCE6FC8 +6F5E6FC46FBD6F9E6FCA6FA870046FA56FAE6FBA6FAC6FAA6FCF6FBF6FB80000 +EA +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +6FA26FC96FAB6FCD6FAF6FB26FB071C571C271BF71B871D671C071C171CB71D4 +71CA71C771CF71BD71D871BC71C671DA71DB729D729E736973667367736C7365 +736B736A747F749A74A074947492749574A1750B7580762F762D7631763D7633 +763C76357632763076BB76E6779A779D77A1779C779B77A277A3779577990000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000779778DD78E978E578EA78DE78E378DB78E178E278ED78DF78E079A47A44 +7A487A477AB67AB87AB57AB17AB77BDE7BE37BE77BDD7BD57BE57BDA7BE87BF9 +7BD47BEA7BE27BDC7BEB7BD87BDF7CD27CD47CD77CD07CD17E127E217E177E0C +7E1F7E207E137E0E7E1C7E157E1A7E227E0B7E0F7E167E0D7E147E257E247F43 +7F7B7F7C7F7A7FB17FEF802A8029806C81B181A681AE81B981B581AB81B081AC +81B481B281B781A781F282558256825785568545856B854D8553856185580000 +EB +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +854085468564854185628544855185478563853E855B8571854E856E85758555 +85678560858C8566855D85548565856C866386658664879B878F879787938792 +87888781879687988779878787A3878587908791879D87848794879C879A8789 +891E89268930892D892E89278931892289298923892F892C891F89F18AE00000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00008AE28AF28AF48AF58ADD8B148AE48ADF8AF08AC88ADE8AE18AE88AFF8AEF +8AFB8C918C928C908CF58CEE8CF18CF08CF38D6C8D6E8DA58DA78E338E3E8E38 +8E408E458E368E3C8E3D8E418E308E3F8EBD8F368F2E8F358F328F398F378F34 +90769079907B908690FA913391359136919391909191918D918F9327931E9308 +931F9306930F937A9338933C931B9323931293019346932D930E930D92CB931D +92FA9325931392F992F793349302932492FF932993399335932A9314930C0000 +EC +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +930B92FE9309930092FB931695BC95CD95BE95B995BA95B695BF95B595BD96A9 +96D4970B9712971097999797979497F097F89835982F98329924991F99279929 +999E99EE99EC99E599E499F099E399EA99E999E79AB99ABF9AB49ABB9AF69AFA +9AF99AF79B339B809B859B879B7C9B7E9B7B9B829B939B929B909B7A9B950000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00009B7D9B889D259D179D209D1E9D149D299D1D9D189D229D109D199D1F9E88 +9E869E879EAE9EAD9ED59ED69EFA9F129F3D51265125512251245120512952F4 +5693568C568D568656845683567E5682567F568158D658D458CF58D25B2D5B25 +5B325B235B2C5B275B265B2F5B2E5B7B5BF15BF25DB75E6C5E6A5FBE5FBB61C3 +61B561BC61E761E061E561E461E861DE64EF64E964E364EB64E464E865816580 +65B665DA66D26A8D6A966A816AA56A896A9F6A9B6AA16A9E6A876A936A8E0000 +ED +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +6A956A836AA86AA46A916A7F6AA66A9A6A856A8C6A926B5B6BAD6C096FCC6FA9 +6FF46FD46FE36FDC6FED6FE76FE66FDE6FF26FDD6FE26FE871E171F171E871F2 +71E471F071E27373736E736F749774B274AB749074AA74AD74B174A574AF7510 +75117512750F7584764376487649764776A476E977B577AB77B277B777B60000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000077B477B177A877F078F378FD790278FB78FC78F2790578F978FE790479AB +79A87A5C7A5B7A567A587A547A5A7ABE7AC07AC17C057C0F7BF27C007BFF7BFB +7C0E7BF47C0B7BF37C027C097C037C017BF87BFD7C067BF07BF17C107C0A7CE8 +7E2D7E3C7E427E3398487E387E2A7E497E407E477E297E4C7E307E3B7E367E44 +7E3A7F457F7F7F7E7F7D7FF47FF2802C81BB81C481CC81CA81C581C781BC81E9 +825B825A825C85838580858F85A7859585A0858B85A3857B85A4859A859E0000 +EE +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +8577857C858985A1857A85788557858E85968586858D8599859D858185A28582 +858885858579857685988590859F866887BE87AA87AD87C587B087AC87B987B5 +87BC87AE87C987C387C287CC87B787AF87C487CA87B487B687BF87B887BD87DE +87B289358933893C893E894189528937894289AD89AF89AE89F289F38B1E0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00008B188B168B118B058B0B8B228B0F8B128B158B078B0D8B088B068B1C8B13 +8B1A8C4F8C708C728C718C6F8C958C948CF98D6F8E4E8E4D8E538E508E4C8E47 +8F438F409085907E9138919A91A2919B9199919F91A1919D91A093A1938393AF +936493569347937C9358935C93769349935093519360936D938F934C936A9379 +935793559352934F93719377937B9361935E936393679380934E935995C795C0 +95C995C395C595B796AE96B096AC9720971F9718971D9719979A97A1979C0000 +EF +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +979E979D97D597D497F198419844984A9849984598439925992B992C992A9933 +9932992F992D99319930999899A399A19A0299FA99F499F799F999F899F699FB +99FD99FE99FC9A039ABE9AFE9AFD9B019AFC9B489B9A9BA89B9E9B9B9BA69BA1 +9BA59BA49B869BA29BA09BAF9D339D419D679D369D2E9D2F9D319D389D300000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00009D459D429D439D3E9D379D409D3D7FF59D2D9E8A9E899E8D9EB09EC89EDA +9EFB9EFF9F249F239F229F549FA05131512D512E5698569C5697569A569D5699 +59705B3C5C695C6A5DC05E6D5E6E61D861DF61ED61EE61F161EA61F061EB61D6 +61E964FF650464FD64F86501650364FC659465DB66DA66DB66D86AC56AB96ABD +6AE16AC66ABA6AB66AB76AC76AB46AAD6B5E6BC96C0B7007700C700D70017005 +7014700E6FFF70006FFB70266FFC6FF7700A720171FF71F9720371FD73760000 +F0 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +74B874C074B574C174BE74B674BB74C275147513765C76647659765076537657 +765A76A676BD76EC77C277BA78FF790C79137914790979107912791179AD79AC +7A5F7C1C7C297C197C207C1F7C2D7C1D7C267C287C227C257C307E5C7E507E56 +7E637E587E627E5F7E517E607E577E537FB57FB37FF77FF8807581D181D20000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000081D0825F825E85B485C685C085C385C285B385B585BD85C785C485BF85CB +85CE85C885C585B185B685D2862485B885B785BE866987E787E687E287DB87EB +87EA87E587DF87F387E487D487DC87D387ED87D887E387A487D787D9880187F4 +87E887DD8953894B894F894C89468950895189498B2A8B278B238B338B308B35 +8B478B2F8B3C8B3E8B318B258B378B268B368B2E8B248B3B8B3D8B3A8C428C75 +8C998C988C978CFE8D048D028D008E5C8E628E608E578E568E5E8E658E670000 +F1 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +8E5B8E5A8E618E5D8E698E548F468F478F488F4B9128913A913B913E91A891A5 +91A791AF91AA93B5938C939293B7939B939D938993A7938E93AA939E93A69395 +93889399939F938D93B1939193B293A493A893B493A393A595D295D395D196B3 +96D796DA5DC296DF96D896DD97239722972597AC97AE97A897AB97A497AA0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000097A297A597D797D997D697D897FA98509851985298B89941993C993A9A0F +9A0B9A099A0D9A049A119A0A9A059A079A069AC09ADC9B089B049B059B299B35 +9B4A9B4C9B4B9BC79BC69BC39BBF9BC19BB59BB89BD39BB69BC49BB99BBD9D5C +9D539D4F9D4A9D5B9D4B9D599D569D4C9D579D529D549D5F9D589D5A9E8E9E8C +9EDF9F019F009F169F259F2B9F2A9F299F289F4C9F5551345135529652F753B4 +56AB56AD56A656A756AA56AC58DA58DD58DB59125B3D5B3E5B3F5DC35E700000 +F2 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +5FBF61FB65076510650D6509650C650E658465DE65DD66DE6AE76AE06ACC6AD1 +6AD96ACB6ADF6ADC6AD06AEB6ACF6ACD6ADE6B606BB06C0C7019702770207016 +702B702170227023702970177024701C702A720C720A72077202720572A572A6 +72A472A372A174CB74C574B774C37516766077C977CA77C477F1791D791B0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00007921791C7917791E79B07A677A687C337C3C7C397C2C7C3B7CEC7CEA7E76 +7E757E787E707E777E6F7E7A7E727E747E687F4B7F4A7F837F867FB77FFD7FFE +807881D781D582648261826385EB85F185ED85D985E185E885DA85D785EC85F2 +85F885D885DF85E385DC85D185F085E685EF85DE85E2880087FA880387F687F7 +8809880C880B880687FC880887FF880A88028962895A895B89578961895C8958 +895D8959898889B789B689F68B508B488B4A8B408B538B568B548B4B8B550000 +F3 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +8B518B428B528B578C438C778C768C9A8D068D078D098DAC8DAA8DAD8DAB8E6D +8E788E738E6A8E6F8E7B8EC28F528F518F4F8F508F538FB49140913F91B091AD +93DE93C793CF93C293DA93D093F993EC93CC93D993A993E693CA93D493EE93E3 +93D593C493CE93C093D293E7957D95DA95DB96E19729972B972C972897260000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000097B397B797B697DD97DE97DF985C9859985D985798BF98BD98BB98BE9948 +9947994399A699A79A1A9A159A259A1D9A249A1B9A229A209A279A239A1E9A1C +9A149AC29B0B9B0A9B0E9B0C9B379BEA9BEB9BE09BDE9BE49BE69BE29BF09BD4 +9BD79BEC9BDC9BD99BE59BD59BE19BDA9D779D819D8A9D849D889D719D809D78 +9D869D8B9D8C9D7D9D6B9D749D759D709D699D859D739D7B9D829D6F9D799D7F +9D879D689E949E919EC09EFC9F2D9F409F419F4D9F569F579F58533756B20000 +F4 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +56B556B358E35B455DC65DC75EEE5EEF5FC05FC161F9651765166515651365DF +66E866E366E46AF36AF06AEA6AE86AF96AF16AEE6AEF703C7035702F70377034 +703170427038703F703A70397040703B703370417213721472A8737D737C74BA +76AB76AA76BE76ED77CC77CE77CF77CD77F27925792379277928792479290000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000079B27A6E7A6C7A6D7AF77C497C487C4A7C477C457CEE7E7B7E7E7E817E80 +7FBA7FFF807981DB81D9820B82688269862285FF860185FE861B860085F68604 +86098605860C85FD8819881088118817881388168963896689B989F78B608B6A +8B5D8B688B638B658B678B6D8DAE8E868E888E848F598F568F578F558F588F5A +908D9143914191B791B591B291B3940B941393FB9420940F941493FE94159410 +94289419940D93F5940093F79407940E9416941293FA940993F8940A93FF0000 +F5 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +93FC940C93F69411940695DE95E095DF972E972F97B997BB97FD97FE98609862 +9863985F98C198C29950994E9959994C994B99539A329A349A319A2C9A2A9A36 +9A299A2E9A389A2D9AC79ACA9AC69B109B129B119C0B9C089BF79C059C129BF8 +9C409C079C0E9C069C179C149C099D9F9D999DA49D9D9D929D989D909D9B0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00009DA09D949D9C9DAA9D979DA19D9A9DA29DA89D9E9DA39DBF9DA99D969DA6 +9DA79E999E9B9E9A9EE59EE49EE79EE69F309F2E9F5B9F609F5E9F5D9F599F91 +513A51395298529756C356BD56BE5B485B475DCB5DCF5EF161FD651B6B026AFC +6B036AF86B0070437044704A7048704970457046721D721A7219737E7517766A +77D0792D7931792F7C547C537CF27E8A7E877E887E8B7E867E8D7F4D7FBB8030 +81DD8618862A8626861F8623861C86198627862E862186208629861E86250000 +F6 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +8829881D881B88208824881C882B884A896D8969896E896B89FA8B798B788B45 +8B7A8B7B8D108D148DAF8E8E8E8C8F5E8F5B8F5D91469144914591B9943F943B +94369429943D943C94309439942A9437942C9440943195E595E495E39735973A +97BF97E1986498C998C698C0995899569A399A3D9A469A449A429A419A3A0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00009A3F9ACD9B159B179B189B169B3A9B529C2B9C1D9C1C9C2C9C239C289C29 +9C249C219DB79DB69DBC9DC19DC79DCA9DCF9DBE9DC59DC39DBB9DB59DCE9DB9 +9DBA9DAC9DC89DB19DAD9DCC9DB39DCD9DB29E7A9E9C9EEB9EEE9EED9F1B9F18 +9F1A9F319F4E9F659F649F924EB956C656C556CB59715B4B5B4C5DD55DD15EF2 +65216520652665226B0B6B086B096C0D7055705670577052721E721F72A9737F +74D874D574D974D7766D76AD793579B47A707A717C577C5C7C597C5B7C5A0000 +F7 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +7CF47CF17E917F4F7F8781DE826B863486358633862C86328636882C88288826 +882A8825897189BF89BE89FB8B7E8B848B828B868B858B7F8D158E958E948E9A +8E928E908E968E978F608F629147944C9450944A944B944F9447944594489449 +9446973F97E3986A986998CB9954995B9A4E9A539A549A4C9A4F9A489A4A0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00009A499A529A509AD09B199B2B9B3B9B569B559C469C489C3F9C449C399C33 +9C419C3C9C379C349C329C3D9C369DDB9DD29DDE9DDA9DCB9DD09DDC9DD19DDF +9DE99DD99DD89DD69DF59DD59DDD9EB69EF09F359F339F329F429F6B9F959FA2 +513D529958E858E759725B4D5DD8882F5F4F62016203620465296525659666EB +6B116B126B0F6BCA705B705A7222738273817383767077D47C677C667E95826C +863A86408639863C8631863B863E88308832882E883389768974897389FE0000 +F8 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +8B8C8B8E8B8B8B888C458D198E988F648F6391BC94629455945D9457945E97C4 +97C598009A569A599B1E9B1F9B209C529C589C509C4A9C4D9C4B9C559C599C4C +9C4E9DFB9DF79DEF9DE39DEB9DF89DE49DF69DE19DEE9DE69DF29DF09DE29DEC +9DF49DF39DE89DED9EC29ED09EF29EF39F069F1C9F389F379F369F439F4F0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00009F719F709F6E9F6F56D356CD5B4E5C6D652D66ED66EE6B13705F7061705D +7060722374DB74E577D5793879B779B67C6A7E977F89826D8643883888378835 +884B8B948B958E9E8E9F8EA08E9D91BE91BD91C2946B9468946996E597469743 +974797C797E59A5E9AD59B599C639C679C669C629C5E9C609E029DFE9E079E03 +9E069E059E009E019E099DFF9DFD9E049EA09F1E9F469F749F759F7656D4652E +65B86B186B196B176B1A7062722672AA77D877D979397C697C6B7CF67E9A0000 +F9 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +7E987E9B7E9981E081E18646864786488979897A897C897B89FF8B988B998EA5 +8EA48EA3946E946D946F9471947397499872995F9C689C6E9C6D9E0B9E0D9E10 +9E0F9E129E119EA19EF59F099F479F789F7B9F7A9F79571E70667C6F883C8DB2 +8EA691C394749478947694759A609C749C739C719C759E149E139EF69F0A0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00009FA4706870657CF7866A883E883D883F8B9E8C9C8EA98EC9974B98739874 +98CC996199AB9A649A669A679B249E159E179F4862076B1E7227864C8EA89482 +948094819A699A689B2E9E197229864B8B9F94839C799EB776759A6B9C7A9E1D +7069706A9EA49F7E9F499F980000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 diff --git a/env/tcl/tcl8.6/encoding/cp1250.enc b/env/tcl/tcl8.6/encoding/cp1250.enc new file mode 100644 index 0000000..070ad90 --- /dev/null +++ b/env/tcl/tcl8.6/encoding/cp1250.enc @@ -0,0 +1,20 @@ +# Encoding file: cp1250, single-byte +S +003F 0 1 +00 +0000000100020003000400050006000700080009000A000B000C000D000E000F +0010001100120013001400150016001700180019001A001B001C001D001E001F +0020002100220023002400250026002700280029002A002B002C002D002E002F +0030003100320033003400350036003700380039003A003B003C003D003E003F +0040004100420043004400450046004700480049004A004B004C004D004E004F +0050005100520053005400550056005700580059005A005B005C005D005E005F +0060006100620063006400650066006700680069006A006B006C006D006E006F +0070007100720073007400750076007700780079007A007B007C007D007E007F +20AC0081201A0083201E2026202020210088203001602039015A0164017D0179 +009020182019201C201D202220132014009821220161203A015B0165017E017A +00A002C702D8014100A4010400A600A700A800A9015E00AB00AC00AD00AE017B +00B000B102DB014200B400B500B600B700B80105015F00BB013D02DD013E017C +015400C100C2010200C40139010600C7010C00C9011800CB011A00CD00CE010E +01100143014700D300D4015000D600D70158016E00DA017000DC00DD016200DF +015500E100E2010300E4013A010700E7010D00E9011900EB011B00ED00EE010F +01110144014800F300F4015100F600F70159016F00FA017100FC00FD016302D9 diff --git a/env/tcl/tcl8.6/encoding/cp1251.enc b/env/tcl/tcl8.6/encoding/cp1251.enc new file mode 100644 index 0000000..376b1b4 --- /dev/null +++ b/env/tcl/tcl8.6/encoding/cp1251.enc @@ -0,0 +1,20 @@ +# Encoding file: cp1251, single-byte +S +003F 0 1 +00 +0000000100020003000400050006000700080009000A000B000C000D000E000F +0010001100120013001400150016001700180019001A001B001C001D001E001F +0020002100220023002400250026002700280029002A002B002C002D002E002F +0030003100320033003400350036003700380039003A003B003C003D003E003F +0040004100420043004400450046004700480049004A004B004C004D004E004F +0050005100520053005400550056005700580059005A005B005C005D005E005F +0060006100620063006400650066006700680069006A006B006C006D006E006F +0070007100720073007400750076007700780079007A007B007C007D007E007F +04020403201A0453201E20262020202120AC203004092039040A040C040B040F +045220182019201C201D202220132014009821220459203A045A045C045B045F +00A0040E045E040800A4049000A600A7040100A9040400AB00AC00AD00AE0407 +00B000B104060456049100B500B600B704512116045400BB0458040504550457 +0410041104120413041404150416041704180419041A041B041C041D041E041F +0420042104220423042404250426042704280429042A042B042C042D042E042F +0430043104320433043404350436043704380439043A043B043C043D043E043F +0440044104420443044404450446044704480449044A044B044C044D044E044F diff --git a/env/tcl/tcl8.6/encoding/cp1252.enc b/env/tcl/tcl8.6/encoding/cp1252.enc new file mode 100644 index 0000000..dd525ea --- /dev/null +++ b/env/tcl/tcl8.6/encoding/cp1252.enc @@ -0,0 +1,20 @@ +# Encoding file: cp1252, single-byte +S +003F 0 1 +00 +0000000100020003000400050006000700080009000A000B000C000D000E000F +0010001100120013001400150016001700180019001A001B001C001D001E001F +0020002100220023002400250026002700280029002A002B002C002D002E002F +0030003100320033003400350036003700380039003A003B003C003D003E003F +0040004100420043004400450046004700480049004A004B004C004D004E004F +0050005100520053005400550056005700580059005A005B005C005D005E005F +0060006100620063006400650066006700680069006A006B006C006D006E006F +0070007100720073007400750076007700780079007A007B007C007D007E007F +20AC0081201A0192201E20262020202102C62030016020390152008D017D008F +009020182019201C201D20222013201402DC21220161203A0153009D017E0178 +00A000A100A200A300A400A500A600A700A800A900AA00AB00AC00AD00AE00AF +00B000B100B200B300B400B500B600B700B800B900BA00BB00BC00BD00BE00BF +00C000C100C200C300C400C500C600C700C800C900CA00CB00CC00CD00CE00CF +00D000D100D200D300D400D500D600D700D800D900DA00DB00DC00DD00DE00DF +00E000E100E200E300E400E500E600E700E800E900EA00EB00EC00ED00EE00EF +00F000F100F200F300F400F500F600F700F800F900FA00FB00FC00FD00FE00FF diff --git a/env/tcl/tcl8.6/encoding/cp1253.enc b/env/tcl/tcl8.6/encoding/cp1253.enc new file mode 100644 index 0000000..a8754c3 --- /dev/null +++ b/env/tcl/tcl8.6/encoding/cp1253.enc @@ -0,0 +1,20 @@ +# Encoding file: cp1253, single-byte +S +003F 0 1 +00 +0000000100020003000400050006000700080009000A000B000C000D000E000F +0010001100120013001400150016001700180019001A001B001C001D001E001F +0020002100220023002400250026002700280029002A002B002C002D002E002F +0030003100320033003400350036003700380039003A003B003C003D003E003F +0040004100420043004400450046004700480049004A004B004C004D004E004F +0050005100520053005400550056005700580059005A005B005C005D005E005F +0060006100620063006400650066006700680069006A006B006C006D006E006F +0070007100720073007400750076007700780079007A007B007C007D007E007F +20AC0081201A0192201E20262020202100882030008A2039008C008D008E008F +009020182019201C201D20222013201400982122009A203A009C009D009E009F +00A00385038600A300A400A500A600A700A800A9000000AB00AC00AD00AE2015 +00B000B100B200B3038400B500B600B703880389038A00BB038C00BD038E038F +0390039103920393039403950396039703980399039A039B039C039D039E039F +03A003A1000003A303A403A503A603A703A803A903AA03AB03AC03AD03AE03AF +03B003B103B203B303B403B503B603B703B803B903BA03BB03BC03BD03BE03BF +03C003C103C203C303C403C503C603C703C803C903CA03CB03CC03CD03CE0000 diff --git a/env/tcl/tcl8.6/encoding/cp1254.enc b/env/tcl/tcl8.6/encoding/cp1254.enc new file mode 100644 index 0000000..b9e3b3c --- /dev/null +++ b/env/tcl/tcl8.6/encoding/cp1254.enc @@ -0,0 +1,20 @@ +# Encoding file: cp1254, single-byte +S +003F 0 1 +00 +0000000100020003000400050006000700080009000A000B000C000D000E000F +0010001100120013001400150016001700180019001A001B001C001D001E001F +0020002100220023002400250026002700280029002A002B002C002D002E002F +0030003100320033003400350036003700380039003A003B003C003D003E003F +0040004100420043004400450046004700480049004A004B004C004D004E004F +0050005100520053005400550056005700580059005A005B005C005D005E005F +0060006100620063006400650066006700680069006A006B006C006D006E006F +0070007100720073007400750076007700780079007A007B007C007D007E007F +20AC0081201A0192201E20262020202102C62030016020390152008D008E008F +009020182019201C201D20222013201402DC21220161203A0153009D009E0178 +00A000A100A200A300A400A500A600A700A800A900AA00AB00AC00AD00AE00AF +00B000B100B200B300B400B500B600B700B800B900BA00BB00BC00BD00BE00BF +00C000C100C200C300C400C500C600C700C800C900CA00CB00CC00CD00CE00CF +011E00D100D200D300D400D500D600D700D800D900DA00DB00DC0130015E00DF +00E000E100E200E300E400E500E600E700E800E900EA00EB00EC00ED00EE00EF +011F00F100F200F300F400F500F600F700F800F900FA00FB00FC0131015F00FF diff --git a/env/tcl/tcl8.6/encoding/cp1255.enc b/env/tcl/tcl8.6/encoding/cp1255.enc new file mode 100644 index 0000000..6e78b95 --- /dev/null +++ b/env/tcl/tcl8.6/encoding/cp1255.enc @@ -0,0 +1,20 @@ +# Encoding file: cp1255, single-byte +S +003F 0 1 +00 +0000000100020003000400050006000700080009000A000B000C000D000E000F +0010001100120013001400150016001700180019001A001B001C001D001E001F +0020002100220023002400250026002700280029002A002B002C002D002E002F +0030003100320033003400350036003700380039003A003B003C003D003E003F +0040004100420043004400450046004700480049004A004B004C004D004E004F +0050005100520053005400550056005700580059005A005B005C005D005E005F +0060006100620063006400650066006700680069006A006B006C006D006E006F +0070007100720073007400750076007700780079007A007B007C007D007E007F +20AC0081201A0192201E20262020202102C62030008A2039008C008D008E008F +009020182019201C201D20222013201402DC2122009A203A009C009D009E009F +00A000A100A200A320AA00A500A600A700A800A900D700AB00AC00AD00AE00AF +00B000B100B200B300B400B500B600B700B800B900F700BB00BC00BD00BE00BF +05B005B105B205B305B405B505B605B705B805B9000005BB05BC05BD05BE05BF +05C005C105C205C305F005F105F205F305F40000000000000000000000000000 +05D005D105D205D305D405D505D605D705D805D905DA05DB05DC05DD05DE05DF +05E005E105E205E305E405E505E605E705E805E905EA00000000200E200F0000 diff --git a/env/tcl/tcl8.6/encoding/cp1256.enc b/env/tcl/tcl8.6/encoding/cp1256.enc new file mode 100644 index 0000000..a98762a --- /dev/null +++ b/env/tcl/tcl8.6/encoding/cp1256.enc @@ -0,0 +1,20 @@ +# Encoding file: cp1256, single-byte +S +003F 0 1 +00 +0000000100020003000400050006000700080009000A000B000C000D000E000F +0010001100120013001400150016001700180019001A001B001C001D001E001F +0020002100220023002400250026002700280029002A002B002C002D002E002F +0030003100320033003400350036003700380039003A003B003C003D003E003F +0040004100420043004400450046004700480049004A004B004C004D004E004F +0050005100520053005400550056005700580059005A005B005C005D005E005F +0060006100620063006400650066006700680069006A006B006C006D006E006F +0070007100720073007400750076007700780079007A007B007C007D007E007F +20AC067E201A0192201E20262020202102C62030067920390152068606980688 +06AF20182019201C201D20222013201406A921220691203A0153200C200D06BA +00A0060C00A200A300A400A500A600A700A800A906BE00AB00AC00AD00AE00AF +00B000B100B200B300B400B500B600B700B800B9061B00BB00BC00BD00BE061F +06C1062106220623062406250626062706280629062A062B062C062D062E062F +063006310632063306340635063600D7063706380639063A0640064106420643 +00E0064400E2064506460647064800E700E800E900EA00EB0649064A00EE00EF +064B064C064D064E00F4064F065000F7065100F9065200FB00FC200E200F06D2 diff --git a/env/tcl/tcl8.6/encoding/cp1257.enc b/env/tcl/tcl8.6/encoding/cp1257.enc new file mode 100644 index 0000000..4aa135d --- /dev/null +++ b/env/tcl/tcl8.6/encoding/cp1257.enc @@ -0,0 +1,20 @@ +# Encoding file: cp1257, single-byte +S +003F 0 1 +00 +0000000100020003000400050006000700080009000A000B000C000D000E000F +0010001100120013001400150016001700180019001A001B001C001D001E001F +0020002100220023002400250026002700280029002A002B002C002D002E002F +0030003100320033003400350036003700380039003A003B003C003D003E003F +0040004100420043004400450046004700480049004A004B004C004D004E004F +0050005100520053005400550056005700580059005A005B005C005D005E005F +0060006100620063006400650066006700680069006A006B006C006D006E006F +0070007100720073007400750076007700780079007A007B007C007D007E007F +20AC0081201A0083201E20262020202100882030008A2039008C00A802C700B8 +009020182019201C201D20222013201400982122009A203A009C00AF02DB009F +00A0000000A200A300A4000000A600A700D800A9015600AB00AC00AD00AE00C6 +00B000B100B200B300B400B500B600B700F800B9015700BB00BC00BD00BE00E6 +0104012E0100010600C400C501180112010C00C90179011601220136012A013B +01600143014500D3014C00D500D600D701720141015A016A00DC017B017D00DF +0105012F0101010700E400E501190113010D00E9017A011701230137012B013C +01610144014600F3014D00F500F600F701730142015B016B00FC017C017E02D9 diff --git a/env/tcl/tcl8.6/encoding/cp1258.enc b/env/tcl/tcl8.6/encoding/cp1258.enc new file mode 100644 index 0000000..95fdef8 --- /dev/null +++ b/env/tcl/tcl8.6/encoding/cp1258.enc @@ -0,0 +1,20 @@ +# Encoding file: cp1258, single-byte +S +003F 0 1 +00 +0000000100020003000400050006000700080009000A000B000C000D000E000F +0010001100120013001400150016001700180019001A001B001C001D001E001F +0020002100220023002400250026002700280029002A002B002C002D002E002F +0030003100320033003400350036003700380039003A003B003C003D003E003F +0040004100420043004400450046004700480049004A004B004C004D004E004F +0050005100520053005400550056005700580059005A005B005C005D005E005F +0060006100620063006400650066006700680069006A006B006C006D006E006F +0070007100720073007400750076007700780079007A007B007C007D007E007F +20AC0081201A0192201E20262020202102C62030008A20390152008D008E008F +009020182019201C201D20222013201402DC2122009A203A0153009D009E0178 +00A000A100A200A300A400A500A600A700A800A900AA00AB00AC00AD00AE00AF +00B000B100B200B300B400B500B600B700B800B900BA00BB00BC00BD00BE00BF +00C000C100C2010200C400C500C600C700C800C900CA00CB030000CD00CE00CF +011000D1030900D300D401A000D600D700D800D900DA00DB00DC01AF030300DF +00E000E100E2010300E400E500E600E700E800E900EA00EB030100ED00EE00EF +011100F1032300F300F401A100F600F700F800F900FA00FB00FC01B020AB00FF diff --git a/env/tcl/tcl8.6/encoding/cp437.enc b/env/tcl/tcl8.6/encoding/cp437.enc new file mode 100644 index 0000000..ecae4e6 --- /dev/null +++ b/env/tcl/tcl8.6/encoding/cp437.enc @@ -0,0 +1,20 @@ +# Encoding file: cp437, single-byte +S +003F 0 1 +00 +0000000100020003000400050006000700080009000A000B000C000D000E000F +0010001100120013001400150016001700180019001A001B001C001D001E001F +0020002100220023002400250026002700280029002A002B002C002D002E002F +0030003100320033003400350036003700380039003A003B003C003D003E003F +0040004100420043004400450046004700480049004A004B004C004D004E004F +0050005100520053005400550056005700580059005A005B005C005D005E005F +0060006100620063006400650066006700680069006A006B006C006D006E006F +0070007100720073007400750076007700780079007A007B007C007D007E007F +00C700FC00E900E200E400E000E500E700EA00EB00E800EF00EE00EC00C400C5 +00C900E600C600F400F600F200FB00F900FF00D600DC00A200A300A520A70192 +00E100ED00F300FA00F100D100AA00BA00BF231000AC00BD00BC00A100AB00BB +259125922593250225242561256225562555256325512557255D255C255B2510 +25142534252C251C2500253C255E255F255A25542569256625602550256C2567 +2568256425652559255825522553256B256A2518250C25882584258C25902580 +03B100DF039303C003A303C300B503C403A6039803A903B4221E03C603B52229 +226100B1226522642320232100F7224800B0221900B7221A207F00B225A000A0 diff --git a/env/tcl/tcl8.6/encoding/cp737.enc b/env/tcl/tcl8.6/encoding/cp737.enc new file mode 100644 index 0000000..5b59661 --- /dev/null +++ b/env/tcl/tcl8.6/encoding/cp737.enc @@ -0,0 +1,20 @@ +# Encoding file: cp737, single-byte +S +003F 0 1 +00 +0000000100020003000400050006000700080009000A000B000C000D000E000F +0010001100120013001400150016001700180019001A001B001C001D001E001F +0020002100220023002400250026002700280029002A002B002C002D002E002F +0030003100320033003400350036003700380039003A003B003C003D003E003F +0040004100420043004400450046004700480049004A004B004C004D004E004F +0050005100520053005400550056005700580059005A005B005C005D005E005F +0060006100620063006400650066006700680069006A006B006C006D006E006F +0070007100720073007400750076007700780079007A007B007C007D007E007F +039103920393039403950396039703980399039A039B039C039D039E039F03A0 +03A103A303A403A503A603A703A803A903B103B203B303B403B503B603B703B8 +03B903BA03BB03BC03BD03BE03BF03C003C103C303C203C403C503C603C703C8 +259125922593250225242561256225562555256325512557255D255C255B2510 +25142534252C251C2500253C255E255F255A25542569256625602550256C2567 +2568256425652559255825522553256B256A2518250C25882584258C25902580 +03C903AC03AD03AE03CA03AF03CC03CD03CB03CE038603880389038A038C038E +038F00B12265226403AA03AB00F7224800B0221900B7221A207F00B225A000A0 diff --git a/env/tcl/tcl8.6/encoding/cp775.enc b/env/tcl/tcl8.6/encoding/cp775.enc new file mode 100644 index 0000000..71b65c3 --- /dev/null +++ b/env/tcl/tcl8.6/encoding/cp775.enc @@ -0,0 +1,20 @@ +# Encoding file: cp775, single-byte +S +003F 0 1 +00 +0000000100020003000400050006000700080009000A000B000C000D000E000F +0010001100120013001400150016001700180019001A001B001C001D001E001F +0020002100220023002400250026002700280029002A002B002C002D002E002F +0030003100320033003400350036003700380039003A003B003C003D003E003F +0040004100420043004400450046004700480049004A004B004C004D004E004F +0050005100520053005400550056005700580059005A005B005C005D005E005F +0060006100620063006400650066006700680069006A006B006C006D006E006F +0070007100720073007400750076007700780079007A007B007C007D007E007F +010600FC00E9010100E4012300E501070142011301560157012B017900C400C5 +00C900E600C6014D00F6012200A2015A015B00D600DC00F800A300D800D700A4 +0100012A00F3017B017C017A201D00A600A900AE00AC00BD00BC014100AB00BB +259125922593250225240104010C01180116256325512557255D012E01602510 +25142534252C251C2500253C0172016A255A25542569256625602550256C017D +0105010D01190117012F01610173016B017E2518250C25882584258C25902580 +00D300DF014C014300F500D500B5014401360137013B013C0146011201452019 +00AD00B1201C00BE00B600A700F7201E00B0221900B700B900B300B225A000A0 diff --git a/env/tcl/tcl8.6/encoding/cp850.enc b/env/tcl/tcl8.6/encoding/cp850.enc new file mode 100644 index 0000000..4e7a90d --- /dev/null +++ b/env/tcl/tcl8.6/encoding/cp850.enc @@ -0,0 +1,20 @@ +# Encoding file: cp850, single-byte +S +003F 0 1 +00 +0000000100020003000400050006000700080009000A000B000C000D000E000F +0010001100120013001400150016001700180019001A001B001C001D001E001F +0020002100220023002400250026002700280029002A002B002C002D002E002F +0030003100320033003400350036003700380039003A003B003C003D003E003F +0040004100420043004400450046004700480049004A004B004C004D004E004F +0050005100520053005400550056005700580059005A005B005C005D005E005F +0060006100620063006400650066006700680069006A006B006C006D006E006F +0070007100720073007400750076007700780079007A007B007C007D007E007F +00C700FC00E900E200E400E000E500E700EA00EB00E800EF00EE00EC00C400C5 +00C900E600C600F400F600F200FB00F900FF00D600DC00F800A300D800D70192 +00E100ED00F300FA00F100D100AA00BA00BF00AE00AC00BD00BC00A100AB00BB +2591259225932502252400C100C200C000A9256325512557255D00A200A52510 +25142534252C251C2500253C00E300C3255A25542569256625602550256C00A4 +00F000D000CA00CB00C8013100CD00CE00CF2518250C2588258400A600CC2580 +00D300DF00D400D200F500D500B500FE00DE00DA00DB00D900FD00DD00AF00B4 +00AD00B1201700BE00B600A700F700B800B000A800B700B900B300B225A000A0 diff --git a/env/tcl/tcl8.6/encoding/cp852.enc b/env/tcl/tcl8.6/encoding/cp852.enc new file mode 100644 index 0000000..f34899e --- /dev/null +++ b/env/tcl/tcl8.6/encoding/cp852.enc @@ -0,0 +1,20 @@ +# Encoding file: cp852, single-byte +S +003F 0 1 +00 +0000000100020003000400050006000700080009000A000B000C000D000E000F +0010001100120013001400150016001700180019001A001B001C001D001E001F +0020002100220023002400250026002700280029002A002B002C002D002E002F +0030003100320033003400350036003700380039003A003B003C003D003E003F +0040004100420043004400450046004700480049004A004B004C004D004E004F +0050005100520053005400550056005700580059005A005B005C005D005E005F +0060006100620063006400650066006700680069006A006B006C006D006E006F +0070007100720073007400750076007700780079007A007B007C007D007E007F +00C700FC00E900E200E4016F010700E7014200EB0150015100EE017900C40106 +00C90139013A00F400F6013D013E015A015B00D600DC01640165014100D7010D +00E100ED00F300FA01040105017D017E0118011900AC017A010C015F00AB00BB +2591259225932502252400C100C2011A015E256325512557255D017B017C2510 +25142534252C251C2500253C01020103255A25542569256625602550256C00A4 +01110110010E00CB010F014700CD00CE011B2518250C258825840162016E2580 +00D300DF00D401430144014801600161015400DA0155017000FD00DD016300B4 +00AD02DD02DB02C702D800A700F700B800B000A802D901710158015925A000A0 diff --git a/env/tcl/tcl8.6/encoding/cp855.enc b/env/tcl/tcl8.6/encoding/cp855.enc new file mode 100644 index 0000000..4d58b86 --- /dev/null +++ b/env/tcl/tcl8.6/encoding/cp855.enc @@ -0,0 +1,20 @@ +# Encoding file: cp855, single-byte +S +003F 0 1 +00 +0000000100020003000400050006000700080009000A000B000C000D000E000F +0010001100120013001400150016001700180019001A001B001C001D001E001F +0020002100220023002400250026002700280029002A002B002C002D002E002F +0030003100320033003400350036003700380039003A003B003C003D003E003F +0040004100420043004400450046004700480049004A004B004C004D004E004F +0050005100520053005400550056005700580059005A005B005C005D005E005F +0060006100620063006400650066006700680069006A006B006C006D006E006F +0070007100720073007400750076007700780079007A007B007C007D007E007F +0452040204530403045104010454040404550405045604060457040704580408 +04590409045A040A045B040B045C040C045E040E045F040F044E042E044A042A +0430041004310411044604260434041404350415044404240433041300AB00BB +259125922593250225240445042504380418256325512557255D043904192510 +25142534252C251C2500253C043A041A255A25542569256625602550256C00A4 +043B041B043C041C043D041D043E041E043F2518250C25882584041F044F2580 +042F044004200441042104420422044304230436041604320412044C042C2116 +00AD044B042B0437041704480428044D042D044904290447042700A725A000A0 diff --git a/env/tcl/tcl8.6/encoding/cp857.enc b/env/tcl/tcl8.6/encoding/cp857.enc new file mode 100644 index 0000000..b42ed55 --- /dev/null +++ b/env/tcl/tcl8.6/encoding/cp857.enc @@ -0,0 +1,20 @@ +# Encoding file: cp857, single-byte +S +003F 0 1 +00 +0000000100020003000400050006000700080009000A000B000C000D000E000F +0010001100120013001400150016001700180019001A001B001C001D001E001F +0020002100220023002400250026002700280029002A002B002C002D002E002F +0030003100320033003400350036003700380039003A003B003C003D003E003F +0040004100420043004400450046004700480049004A004B004C004D004E004F +0050005100520053005400550056005700580059005A005B005C005D005E005F +0060006100620063006400650066006700680069006A006B006C006D006E006F +0070007100720073007400750076007700780079007A007B007C007D007E007F +00C700FC00E900E200E400E000E500E700EA00EB00E800EF00EE013100C400C5 +00C900E600C600F400F600F200FB00F9013000D600DC00F800A300D8015E015F +00E100ED00F300FA00F100D1011E011F00BF00AE00AC00BD00BC00A100AB00BB +2591259225932502252400C100C200C000A9256325512557255D00A200A52510 +25142534252C251C2500253C00E300C3255A25542569256625602550256C00A4 +00BA00AA00CA00CB00C8000000CD00CE00CF2518250C2588258400A600CC2580 +00D300DF00D400D200F500D500B5000000D700DA00DB00D900EC00FF00AF00B4 +00AD00B1000000BE00B600A700F700B800B000A800B700B900B300B225A000A0 diff --git a/env/tcl/tcl8.6/encoding/cp860.enc b/env/tcl/tcl8.6/encoding/cp860.enc new file mode 100644 index 0000000..871943b --- /dev/null +++ b/env/tcl/tcl8.6/encoding/cp860.enc @@ -0,0 +1,20 @@ +# Encoding file: cp860, single-byte +S +003F 0 1 +00 +0000000100020003000400050006000700080009000A000B000C000D000E000F +0010001100120013001400150016001700180019001A001B001C001D001E001F +0020002100220023002400250026002700280029002A002B002C002D002E002F +0030003100320033003400350036003700380039003A003B003C003D003E003F +0040004100420043004400450046004700480049004A004B004C004D004E004F +0050005100520053005400550056005700580059005A005B005C005D005E005F +0060006100620063006400650066006700680069006A006B006C006D006E006F +0070007100720073007400750076007700780079007A007B007C007D007E007F +00C700FC00E900E200E300E000C100E700EA00CA00E800CD00D400EC00C300C2 +00C900C000C800F400F500F200DA00F900CC00D500DC00A200A300D920A700D3 +00E100ED00F300FA00F100D100AA00BA00BF00D200AC00BD00BC00A100AB00BB +259125922593250225242561256225562555256325512557255D255C255B2510 +25142534252C251C2500253C255E255F255A25542569256625602550256C2567 +2568256425652559255825522553256B256A2518250C25882584258C25902580 +03B100DF039303C003A303C300B503C403A6039803A903B4221E03C603B52229 +226100B1226522642320232100F7224800B0221900B7221A207F00B225A000A0 diff --git a/env/tcl/tcl8.6/encoding/cp861.enc b/env/tcl/tcl8.6/encoding/cp861.enc new file mode 100644 index 0000000..3f8f605 --- /dev/null +++ b/env/tcl/tcl8.6/encoding/cp861.enc @@ -0,0 +1,20 @@ +# Encoding file: cp861, single-byte +S +003F 0 1 +00 +0000000100020003000400050006000700080009000A000B000C000D000E000F +0010001100120013001400150016001700180019001A001B001C001D001E001F +0020002100220023002400250026002700280029002A002B002C002D002E002F +0030003100320033003400350036003700380039003A003B003C003D003E003F +0040004100420043004400450046004700480049004A004B004C004D004E004F +0050005100520053005400550056005700580059005A005B005C005D005E005F +0060006100620063006400650066006700680069006A006B006C006D006E006F +0070007100720073007400750076007700780079007A007B007C007D007E007F +00C700FC00E900E200E400E000E500E700EA00EB00E800D000F000DE00C400C5 +00C900E600C600F400F600FE00FB00DD00FD00D600DC00F800A300D820A70192 +00E100ED00F300FA00C100CD00D300DA00BF231000AC00BD00BC00A100AB00BB +259125922593250225242561256225562555256325512557255D255C255B2510 +25142534252C251C2500253C255E255F255A25542569256625602550256C2567 +2568256425652559255825522553256B256A2518250C25882584258C25902580 +03B100DF039303C003A303C300B503C403A6039803A903B4221E03C603B52229 +226100B1226522642320232100F7224800B0221900B7221A207F00B225A000A0 diff --git a/env/tcl/tcl8.6/encoding/cp862.enc b/env/tcl/tcl8.6/encoding/cp862.enc new file mode 100644 index 0000000..5f9d16c --- /dev/null +++ b/env/tcl/tcl8.6/encoding/cp862.enc @@ -0,0 +1,20 @@ +# Encoding file: cp862, single-byte +S +003F 0 1 +00 +0000000100020003000400050006000700080009000A000B000C000D000E000F +0010001100120013001400150016001700180019001A001B001C001D001E001F +0020002100220023002400250026002700280029002A002B002C002D002E002F +0030003100320033003400350036003700380039003A003B003C003D003E003F +0040004100420043004400450046004700480049004A004B004C004D004E004F +0050005100520053005400550056005700580059005A005B005C005D005E005F +0060006100620063006400650066006700680069006A006B006C006D006E006F +0070007100720073007400750076007700780079007A007B007C007D007E007F +05D005D105D205D305D405D505D605D705D805D905DA05DB05DC05DD05DE05DF +05E005E105E205E305E405E505E605E705E805E905EA00A200A300A520A70192 +00E100ED00F300FA00F100D100AA00BA00BF231000AC00BD00BC00A100AB00BB +259125922593250225242561256225562555256325512557255D255C255B2510 +25142534252C251C2500253C255E255F255A25542569256625602550256C2567 +2568256425652559255825522553256B256A2518250C25882584258C25902580 +03B100DF039303C003A303C300B503C403A6039803A903B4221E03C603B52229 +226100B1226522642320232100F7224800B0221900B7221A207F00B225A000A0 diff --git a/env/tcl/tcl8.6/encoding/cp863.enc b/env/tcl/tcl8.6/encoding/cp863.enc new file mode 100644 index 0000000..c8b8686 --- /dev/null +++ b/env/tcl/tcl8.6/encoding/cp863.enc @@ -0,0 +1,20 @@ +# Encoding file: cp863, single-byte +S +003F 0 1 +00 +0000000100020003000400050006000700080009000A000B000C000D000E000F +0010001100120013001400150016001700180019001A001B001C001D001E001F +0020002100220023002400250026002700280029002A002B002C002D002E002F +0030003100320033003400350036003700380039003A003B003C003D003E003F +0040004100420043004400450046004700480049004A004B004C004D004E004F +0050005100520053005400550056005700580059005A005B005C005D005E005F +0060006100620063006400650066006700680069006A006B006C006D006E006F +0070007100720073007400750076007700780079007A007B007C007D007E007F +00C700FC00E900E200C200E000B600E700EA00EB00E800EF00EE201700C000A7 +00C900C800CA00F400CB00CF00FB00F900A400D400DC00A200A300D900DB0192 +00A600B400F300FA00A800B800B300AF00CE231000AC00BD00BC00BE00AB00BB +259125922593250225242561256225562555256325512557255D255C255B2510 +25142534252C251C2500253C255E255F255A25542569256625602550256C2567 +2568256425652559255825522553256B256A2518250C25882584258C25902580 +03B100DF039303C003A303C300B503C403A6039803A903B4221E03C603B52229 +226100B1226522642320232100F7224800B0221900B7221A207F00B225A000A0 diff --git a/env/tcl/tcl8.6/encoding/cp864.enc b/env/tcl/tcl8.6/encoding/cp864.enc new file mode 100644 index 0000000..71f9e62 --- /dev/null +++ b/env/tcl/tcl8.6/encoding/cp864.enc @@ -0,0 +1,20 @@ +# Encoding file: cp864, single-byte +S +003F 0 1 +00 +0000000100020003000400050006000700080009000A000B000C000D000E000F +0010001100120013001400150016001700180019001A001B001C001D001E001F +00200021002200230024066A0026002700280029002A002B002C002D002E002F +0030003100320033003400350036003700380039003A003B003C003D003E003F +0040004100420043004400450046004700480049004A004B004C004D004E004F +0050005100520053005400550056005700580059005A005B005C005D005E005F +0060006100620063006400650066006700680069006A006B006C006D006E006F +0070007100720073007400750076007700780079007A007B007C007D007E007F +00B000B72219221A259225002502253C2524252C251C25342510250C25142518 +03B2221E03C600B100BD00BC224800AB00BBFEF7FEF8009B009CFEFBFEFC009F +00A000ADFE8200A300A4FE8400000000FE8EFE8FFE95FE99060CFE9DFEA1FEA5 +0660066106620663066406650666066706680669FED1061BFEB1FEB5FEB9061F +00A2FE80FE81FE83FE85FECAFE8BFE8DFE91FE93FE97FE9BFE9FFEA3FEA7FEA9 +FEABFEADFEAFFEB3FEB7FEBBFEBFFEC1FEC5FECBFECF00A600AC00F700D7FEC9 +0640FED3FED7FEDBFEDFFEE3FEE7FEEBFEEDFEEFFEF3FEBDFECCFECEFECDFEE1 +FE7D0651FEE5FEE9FEECFEF0FEF2FED0FED5FEF5FEF6FEDDFED9FEF125A00000 diff --git a/env/tcl/tcl8.6/encoding/cp865.enc b/env/tcl/tcl8.6/encoding/cp865.enc new file mode 100644 index 0000000..543da9c --- /dev/null +++ b/env/tcl/tcl8.6/encoding/cp865.enc @@ -0,0 +1,20 @@ +# Encoding file: cp865, single-byte +S +003F 0 1 +00 +0000000100020003000400050006000700080009000A000B000C000D000E000F +0010001100120013001400150016001700180019001A001B001C001D001E001F +0020002100220023002400250026002700280029002A002B002C002D002E002F +0030003100320033003400350036003700380039003A003B003C003D003E003F +0040004100420043004400450046004700480049004A004B004C004D004E004F +0050005100520053005400550056005700580059005A005B005C005D005E005F +0060006100620063006400650066006700680069006A006B006C006D006E006F +0070007100720073007400750076007700780079007A007B007C007D007E007F +00C700FC00E900E200E400E000E500E700EA00EB00E800EF00EE00EC00C400C5 +00C900E600C600F400F600F200FB00F900FF00D600DC00F800A300D820A70192 +00E100ED00F300FA00F100D100AA00BA00BF231000AC00BD00BC00A100AB00A4 +259125922593250225242561256225562555256325512557255D255C255B2510 +25142534252C251C2500253C255E255F255A25542569256625602550256C2567 +2568256425652559255825522553256B256A2518250C25882584258C25902580 +03B100DF039303C003A303C300B503C403A6039803A903B4221E03C603B52229 +226100B1226522642320232100F7224800B0221900B7221A207F00B225A000A0 diff --git a/env/tcl/tcl8.6/encoding/cp866.enc b/env/tcl/tcl8.6/encoding/cp866.enc new file mode 100644 index 0000000..b851cf5 --- /dev/null +++ b/env/tcl/tcl8.6/encoding/cp866.enc @@ -0,0 +1,20 @@ +# Encoding file: cp866, single-byte +S +003F 0 1 +00 +0000000100020003000400050006000700080009000A000B000C000D000E000F +0010001100120013001400150016001700180019001A001B001C001D001E001F +0020002100220023002400250026002700280029002A002B002C002D002E002F +0030003100320033003400350036003700380039003A003B003C003D003E003F +0040004100420043004400450046004700480049004A004B004C004D004E004F +0050005100520053005400550056005700580059005A005B005C005D005E005F +0060006100620063006400650066006700680069006A006B006C006D006E006F +0070007100720073007400750076007700780079007A007B007C007D007E007F +0410041104120413041404150416041704180419041A041B041C041D041E041F +0420042104220423042404250426042704280429042A042B042C042D042E042F +0430043104320433043404350436043704380439043A043B043C043D043E043F +259125922593250225242561256225562555256325512557255D255C255B2510 +25142534252C251C2500253C255E255F255A25542569256625602550256C2567 +2568256425652559255825522553256B256A2518250C25882584258C25902580 +0440044104420443044404450446044704480449044A044B044C044D044E044F +040104510404045404070457040E045E00B0221900B7221A211600A425A000A0 diff --git a/env/tcl/tcl8.6/encoding/cp869.enc b/env/tcl/tcl8.6/encoding/cp869.enc new file mode 100644 index 0000000..9fd2929 --- /dev/null +++ b/env/tcl/tcl8.6/encoding/cp869.enc @@ -0,0 +1,20 @@ +# Encoding file: cp869, single-byte +S +003F 0 1 +00 +0000000100020003000400050006000700080009000A000B000C000D000E000F +0010001100120013001400150016001700180019001A001B001C001D001E001F +0020002100220023002400250026002700280029002A002B002C002D002E002F +0030003100320033003400350036003700380039003A003B003C003D003E003F +0040004100420043004400450046004700480049004A004B004C004D004E004F +0050005100520053005400550056005700580059005A005B005C005D005E005F +0060006100620063006400650066006700680069006A006B006C006D006E006F +0070007100720073007400750076007700780079007A007B007C007D007E007F +0080008100820083008400850386008700B700AC00A620182019038820150389 +038A03AA038C00930094038E03AB00A9038F00B200B303AC00A303AD03AE03AF +03CA039003CC03CD039103920393039403950396039700BD0398039900AB00BB +25912592259325022524039A039B039C039D256325512557255D039E039F2510 +25142534252C251C2500253C03A003A1255A25542569256625602550256C03A3 +03A403A503A603A703A803A903B103B203B32518250C2588258403B403B52580 +03B603B703B803B903BA03BB03BC03BD03BE03BF03C003C103C303C203C40384 +00AD00B103C503C603C700A703C8038500B000A803C903CB03B003CE25A000A0 diff --git a/env/tcl/tcl8.6/encoding/cp874.enc b/env/tcl/tcl8.6/encoding/cp874.enc new file mode 100644 index 0000000..0487b97 --- /dev/null +++ b/env/tcl/tcl8.6/encoding/cp874.enc @@ -0,0 +1,20 @@ +# Encoding file: cp874, single-byte +S +003F 0 1 +00 +0000000100020003000400050006000700080009000A000B000C000D000E000F +0010001100120013001400150016001700180019001A001B001C001D001E001F +0020002100220023002400250026002700280029002A002B002C002D002E002F +0030003100320033003400350036003700380039003A003B003C003D003E003F +0040004100420043004400450046004700480049004A004B004C004D004E004F +0050005100520053005400550056005700580059005A005B005C005D005E005F +0060006100620063006400650066006700680069006A006B006C006D006E006F +0070007100720073007400750076007700780079007A007B007C007D007E007F +20AC008100820083008420260086008700880089008A008B008C008D008E008F +009020182019201C201D20222013201400980099009A009B009C009D009E009F +00A00E010E020E030E040E050E060E070E080E090E0A0E0B0E0C0E0D0E0E0E0F +0E100E110E120E130E140E150E160E170E180E190E1A0E1B0E1C0E1D0E1E0E1F +0E200E210E220E230E240E250E260E270E280E290E2A0E2B0E2C0E2D0E2E0E2F +0E300E310E320E330E340E350E360E370E380E390E3A00000000000000000E3F +0E400E410E420E430E440E450E460E470E480E490E4A0E4B0E4C0E4D0E4E0E4F +0E500E510E520E530E540E550E560E570E580E590E5A0E5B0000000000000000 diff --git a/env/tcl/tcl8.6/encoding/cp932.enc b/env/tcl/tcl8.6/encoding/cp932.enc new file mode 100644 index 0000000..8da8cd6 --- /dev/null +++ b/env/tcl/tcl8.6/encoding/cp932.enc @@ -0,0 +1,801 @@ +# Encoding file: cp932, multi-byte +M +003F 0 46 +00 +0000000100020003000400050006000700080009000A000B000C000D000E000F +0010001100120013001400150016001700180019001A001B001C001D001E001F +0020002100220023002400250026002700280029002A002B002C002D002E002F +0030003100320033003400350036003700380039003A003B003C003D003E003F +0040004100420043004400450046004700480049004A004B004C004D004E004F +0050005100520053005400550056005700580059005A005B005C005D005E005F +0060006100620063006400650066006700680069006A006B006C006D006E006F +0070007100720073007400750076007700780079007A007B007C007D007E007F +0080000000000000000000850086000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000FF61FF62FF63FF64FF65FF66FF67FF68FF69FF6AFF6BFF6CFF6DFF6EFF6F +FF70FF71FF72FF73FF74FF75FF76FF77FF78FF79FF7AFF7BFF7CFF7DFF7EFF7F +FF80FF81FF82FF83FF84FF85FF86FF87FF88FF89FF8AFF8BFF8CFF8DFF8EFF8F +FF90FF91FF92FF93FF94FF95FF96FF97FF98FF99FF9AFF9BFF9CFF9DFF9EFF9F +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +81 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +300030013002FF0CFF0E30FBFF1AFF1BFF1FFF01309B309C00B4FF4000A8FF3E +FFE3FF3F30FD30FE309D309E30034EDD30053006300730FC20152010FF0FFF3C +FF5E2225FF5C2026202520182019201C201DFF08FF0930143015FF3BFF3DFF5B +FF5D30083009300A300B300C300D300E300F30103011FF0BFF0D00B100D70000 +00F7FF1D2260FF1CFF1E22662267221E22342642264000B0203220332103FFE5 +FF04FFE0FFE1FF05FF03FF06FF0AFF2000A72606260525CB25CF25CE25C725C6 +25A125A025B325B225BD25BC203B301221922190219121933013000000000000 +000000000000000000000000000000002208220B2286228722822283222A2229 +0000000000000000000000000000000022272228FFE221D221D4220022030000 +0000000000000000000000000000000000000000222022A52312220222072261 +2252226A226B221A223D221D2235222B222C0000000000000000000000000000 +212B2030266F266D266A2020202100B6000000000000000025EF000000000000 +82 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000FF10 +FF11FF12FF13FF14FF15FF16FF17FF18FF190000000000000000000000000000 +FF21FF22FF23FF24FF25FF26FF27FF28FF29FF2AFF2BFF2CFF2DFF2EFF2FFF30 +FF31FF32FF33FF34FF35FF36FF37FF38FF39FF3A000000000000000000000000 +0000FF41FF42FF43FF44FF45FF46FF47FF48FF49FF4AFF4BFF4CFF4DFF4EFF4F +FF50FF51FF52FF53FF54FF55FF56FF57FF58FF59FF5A00000000000000003041 +30423043304430453046304730483049304A304B304C304D304E304F30503051 +30523053305430553056305730583059305A305B305C305D305E305F30603061 +30623063306430653066306730683069306A306B306C306D306E306F30703071 +30723073307430753076307730783079307A307B307C307D307E307F30803081 +30823083308430853086308730883089308A308B308C308D308E308F30903091 +3092309300000000000000000000000000000000000000000000000000000000 +83 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +30A130A230A330A430A530A630A730A830A930AA30AB30AC30AD30AE30AF30B0 +30B130B230B330B430B530B630B730B830B930BA30BB30BC30BD30BE30BF30C0 +30C130C230C330C430C530C630C730C830C930CA30CB30CC30CD30CE30CF30D0 +30D130D230D330D430D530D630D730D830D930DA30DB30DC30DD30DE30DF0000 +30E030E130E230E330E430E530E630E730E830E930EA30EB30EC30ED30EE30EF +30F030F130F230F330F430F530F6000000000000000000000000000000000391 +03920393039403950396039703980399039A039B039C039D039E039F03A003A1 +03A303A403A503A603A703A803A90000000000000000000000000000000003B1 +03B203B303B403B503B603B703B803B903BA03BB03BC03BD03BE03BF03C003C1 +03C303C403C503C603C703C803C9000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +84 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +04100411041204130414041504010416041704180419041A041B041C041D041E +041F0420042104220423042404250426042704280429042A042B042C042D042E +042F000000000000000000000000000000000000000000000000000000000000 +04300431043204330434043504510436043704380439043A043B043C043D0000 +043E043F0440044104420443044404450446044704480449044A044B044C044D +044E044F00000000000000000000000000000000000000000000000000002500 +2502250C251025182514251C252C25242534253C25012503250F2513251B2517 +25232533252B253B254B2520252F25282537253F251D25302525253825420000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +87 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +2460246124622463246424652466246724682469246A246B246C246D246E246F +2470247124722473216021612162216321642165216621672168216900003349 +33143322334D331833273303333633513357330D33263323332B334A333B339C +339D339E338E338F33C433A100000000000000000000000000000000337B0000 +301D301F211633CD212132A432A532A632A732A8323132323239337E337D337C +22522261222B222E2211221A22A52220221F22BF22352229222A000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +88 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000004E9C +55165A03963F54C0611B632859F690228475831C7A5060AA63E16E2565ED8466 +82A69BF56893572765A162715B9B59D0867B98F47D627DBE9B8E62167C9F88B7 +5B895EB563096697684895C7978D674F4EE54F0A4F4D4F9D504956F2593759D4 +5A015C0960DF610F61706613690570BA754F757079FB7DAD7DEF80C3840E8863 +8B029055907A533B4E954EA557DF80B290C178EF4E0058F16EA290387A328328 +828B9C2F5141537054BD54E156E059FB5F1598F26DEB80E4852D000000000000 +89 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +9662967096A097FB540B53F35B8770CF7FBD8FC296E8536F9D5C7ABA4E117893 +81FC6E26561855046B1D851A9C3B59E553A96D6674DC958F56424E91904B96F2 +834F990C53E155B65B305F71662066F368046C386CF36D29745B76C87A4E9834 +82F1885B8A6092ED6DB275AB76CA99C560A68B018D8A95B2698E53AD51860000 +5712583059445BB45EF6602863A963F46CBF6F14708E7114715971D5733F7E01 +827682D185979060925B9D1B586965BC6C5A752551F9592E59655F805FDC62BC +65FA6A2A6B276BB4738B7FC189569D2C9D0E9EC45CA16C96837B51045C4B61B6 +81C6687672614E594FFA537860696E297A4F97F34E0B53164EEE4F554F3D4FA1 +4F7352A053EF5609590F5AC15BB65BE179D16687679C67B66B4C6CB3706B73C2 +798D79BE7A3C7B8782B182DB8304837783EF83D387668AB256298CA88FE6904E +971E868A4FC45CE862117259753B81E582BD86FE8CC096C5991399D54ECB4F1A +89E356DE584A58CA5EFB5FEB602A6094606261D0621262D06539000000000000 +8A +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +9B41666668B06D777070754C76867D7582A587F9958B968E8C9D51F152BE5916 +54B35BB35D16616869826DAF788D84CB88578A7293A79AB86D6C99A886D957A3 +67FF86CE920E5283568754045ED362E164B9683C68386BBB737278BA7A6B899A +89D28D6B8F0390ED95A3969497695B665CB3697D984D984E639B7B206A2B0000 +6A7F68B69C0D6F5F5272559D607062EC6D3B6E076ED1845B89108F444E149C39 +53F6691B6A3A9784682A515C7AC384B291DC938C565B9D286822830584317CA5 +520882C574E64E7E4F8351A05BD2520A52D852E75DFB559A582A59E65B8C5B98 +5BDB5E725E7960A3611F616361BE63DB656267D1685368FA6B3E6B536C576F22 +6F976F4574B0751876E3770B7AFF7BA17C217DE97F367FF0809D8266839E89B3 +8ACC8CAB908494519593959195A2966597D3992882184E38542B5CB85DCC73A9 +764C773C5CA97FEB8D0B96C19811985498584F014F0E5371559C566857FA5947 +5B095BC45C905E0C5E7E5FCC63EE673A65D765E2671F68CB68C4000000000000 +8B +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +6A5F5E306BC56C176C7D757F79485B637A007D005FBD898F8A188CB48D778ECC +8F1D98E29A0E9B3C4E80507D510059935B9C622F628064EC6B3A72A075917947 +7FA987FB8ABC8B7063AC83CA97A05409540355AB68546A588A70782767759ECD +53745BA2811A865090064E184E454EC74F1153CA54385BAE5F13602565510000 +673D6C426C726CE3707874037A767AAE7B087D1A7CFE7D6665E7725B53BB5C45 +5DE862D262E063196E20865A8A318DDD92F86F0179A69B5A4EA84EAB4EAC4F9B +4FA050D151477AF6517151F653545321537F53EB55AC58835CE15F375F4A602F +6050606D631F65596A4B6CC172C272ED77EF80F881058208854E90F793E197FF +99579A5A4EF051DD5C2D6681696D5C4066F26975738968507C8150C552E45747 +5DFE932665A46B236B3D7434798179BD7B4B7DCA82B983CC887F895F8B398FD1 +91D1541F92804E5D503653E5533A72D7739677E982E68EAF99C699C899D25177 +611A865E55B07A7A50765BD3904796854E326ADB91E75C515C48000000000000 +8C +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +63987A9F6C9397748F617AAA718A96887C8268177E706851936C52F2541B85AB +8A137FA48ECD90E15366888879414FC250BE521151445553572D73EA578B5951 +5F625F8460756176616761A963B2643A656C666F68426E1375667A3D7CFB7D4C +7D997E4B7F6B830E834A86CD8A088A638B668EFD981A9D8F82B88FCE9BE80000 +5287621F64836FC09699684150916B206C7A6F547A747D5088408A2367084EF6 +503950265065517C5238526355A7570F58055ACC5EFA61B261F862F36372691C +6A29727D72AC732E7814786F7D79770C80A9898B8B198CE28ED290639375967A +98559A139E785143539F53B35E7B5F266E1B6E90738473FE7D4382378A008AFA +96504E4E500B53E4547C56FA59D15B645DF15EAB5F276238654567AF6E5672D0 +7CCA88B480A180E183F0864E8A878DE8923796C798679F134E944E924F0D5348 +5449543E5A2F5F8C5FA1609F68A76A8E745A78818A9E8AA48B7791904E5E9BC9 +4EA44F7C4FAF501950165149516C529F52B952FE539A53E35411000000000000 +8D +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +540E5589575157A2597D5B545B5D5B8F5DE55DE75DF75E785E835E9A5EB75F18 +6052614C629762D863A7653B6602664366F4676D6821689769CB6C5F6D2A6D69 +6E2F6E9D75327687786C7A3F7CE07D057D187D5E7DB18015800380AF80B18154 +818F822A8352884C88618B1B8CA28CFC90CA91759271783F92FC95A4964D0000 +980599999AD89D3B525B52AB53F7540858D562F76FE08C6A8F5F9EB9514B523B +544A56FD7A4091779D609ED273446F09817075115FFD60DA9AA872DB8FBC6B64 +98034ECA56F0576458BE5A5A606861C7660F6606683968B16DF775D57D3A826E +9B424E9B4F5053C955065D6F5DE65DEE67FB6C99747378028A50939688DF5750 +5EA7632B50B550AC518D670054C9585E59BB5BB05F69624D63A1683D6B736E08 +707D91C7728078157826796D658E7D3083DC88C18F09969B5264572867507F6A +8CA151B45742962A583A698A80B454B25D0E57FC78959DFA4F5C524A548B643E +6628671467F57A847B567D22932F685C9BAD7B395319518A5237000000000000 +8E +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +5BDF62F664AE64E6672D6BBA85A996D176909BD6634C93069BAB76BF66524E09 +509853C25C7160E864926563685F71E673CA75237B977E8286958B838CDB9178 +991065AC66AB6B8B4ED54ED44F3A4F7F523A53F853F255E356DB58EB59CB59C9 +59FF5B505C4D5E025E2B5FD7601D6307652F5B5C65AF65BD65E8679D6B620000 +6B7B6C0F7345794979C17CF87D197D2B80A2810281F389968A5E8A698A668A8C +8AEE8CC78CDC96CC98FC6B6F4E8B4F3C4F8D51505B575BFA6148630166426B21 +6ECB6CBB723E74BD75D478C1793A800C803381EA84948F9E6C509E7F5F0F8B58 +9D2B7AFA8EF85B8D96EB4E0353F157F759315AC95BA460896E7F6F0675BE8CEA +5B9F85007BE0507267F4829D5C61854A7E1E820E51995C0463688D66659C716E +793E7D1780058B1D8ECA906E86C790AA501F52FA5C3A6753707C7235914C91C8 +932B82E55BC25F3160F94E3B53D65B88624B67316B8A72E973E07A2E816B8DA3 +91529996511253D7546A5BFF63886A397DAC970056DA53CE5468000000000000 +8F +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +5B975C315DDE4FEE610162FE6D3279C079CB7D427E4D7FD281ED821F84908846 +89728B908E748F2F9031914B916C96C6919C4EC04F4F514553415F93620E67D4 +6C416E0B73637E2691CD928353D459195BBF6DD1795D7E2E7C9B587E719F51FA +88538FF04FCA5CFB662577AC7AE3821C99FF51C65FAA65EC696F6B896DF30000 +6E966F6476FE7D145DE190759187980651E6521D6240669166D96E1A5EB67DD2 +7F7266F885AF85F78AF852A953D959735E8F5F90605592E4966450B7511F52DD +5320534753EC54E8554655315617596859BE5A3C5BB55C065C0F5C115C1A5E84 +5E8A5EE05F70627F628462DB638C63776607660C662D6676677E68A26A1F6A35 +6CBC6D886E096E58713C7126716775C77701785D7901796579F07AE07B117CA7 +7D39809683D6848B8549885D88F38A1F8A3C8A548A738C618CDE91A49266937E +9418969C97984E0A4E084E1E4E575197527057CE583458CC5B225E3860C564FE +676167566D4472B675737A6384B88B7291B89320563157F498FE000000000000 +90 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +62ED690D6B9671ED7E548077827289E698DF87558FB15C3B4F384FE14FB55507 +5A205BDD5BE95FC3614E632F65B0664B68EE699B6D786DF1753375B9771F795E +79E67D3381E382AF85AA89AA8A3A8EAB8F9B903291DD97074EBA4EC152035875 +58EC5C0B751A5C3D814E8A0A8FC59663976D7B258ACF9808916256F353A80000 +9017543957825E2563A86C34708A77617C8B7FE088709042915493109318968F +745E9AC45D075D69657067A28DA896DB636E6749691983C5981796C088FE6F84 +647A5BF84E16702C755D662F51C4523652E259D35F8160276210653F6574661F +667468F268166B636E057272751F76DB7CBE805658F088FD897F8AA08A938ACB +901D91929752975965897A0E810696BB5E2D60DC621A65A56614679077F37A4D +7C4D7E3E810A8CAC8D648DE18E5F78A9520762D963A5644262988A2D7A837BC0 +8AAC96EA7D76820C87494ED95148534353605BA35C025C165DDD6226624764B0 +681368346CC96D456D1767D36F5C714E717D65CB7A7F7BAD7DDA000000000000 +91 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +7E4A7FA8817A821B823985A68A6E8CCE8DF59078907792AD929195839BAE524D +55846F387136516879857E5581B37CCE564C58515CA863AA66FE66FD695A72D9 +758F758E790E795679DF7C977D207D4486078A34963B90619F2050E7527553CC +53E2500955AA58EE594F723D5B8B5C64531D60E360F3635C6383633F63BB0000 +64CD65E966F95DE369CD69FD6F1571E54E8975E976F87A937CDF7DCF7D9C8061 +83498358846C84BC85FB88C58D709001906D9397971C9A1250CF5897618E81D3 +85358D0890204FC3507452475373606F6349675F6E2C8DB3901F4FD75C5E8CCA +65CF7D9A53528896517663C35B585B6B5C0A640D6751905C4ED6591A592A6C70 +8A51553E581559A560F0625367C182356955964099C49A284F5358065BFE8010 +5CB15E2F5F856020614B623466FF6CF06EDE80CE817F82D4888B8CB89000902E +968A9EDB9BDB4EE353F059277B2C918D984C9DF96EDD7027535355445B856258 +629E62D36CA26FEF74228A1794386FC18AFE833851E786F853EA000000000000 +92 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +53E94F4690548FB0596A81315DFD7AEA8FBF68DA8C3772F89C486A3D8AB04E39 +53585606576662C563A265E66B4E6DE16E5B70AD77ED7AEF7BAA7DBB803D80C6 +86CB8A95935B56E358C75F3E65AD66966A806BB575378AC7502477E557305F1B +6065667A6C6075F47A1A7F6E81F48718904599B37BC9755C7AF97B5184C40000 +901079E97A9283365AE177404E2D4EF25B995FE062BD663C67F16CE8866B8877 +8A3B914E92F399D06A177026732A82E784578CAF4E01514651CB558B5BF55E16 +5E335E815F145F355F6B5FB461F2631166A2671D6F6E7252753A773A80748139 +817887768ABF8ADC8D858DF3929A957798029CE552C5635776F467156C8873CD +8CC393AE96736D25589C690E69CC8FFD939A75DB901A585A680263B469FB4F43 +6F2C67D88FBB85267DB49354693F6F70576A58F75B2C7D2C722A540A91E39DB4 +4EAD4F4E505C507552438C9E544858245B9A5E1D5E955EAD5EF75F1F608C62B5 +633A63D068AF6C407887798E7A0B7DE082478A028AE68E449013000000000000 +93 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +90B8912D91D89F0E6CE5645864E265756EF476847B1B906993D16EBA54F25FB9 +64A48F4D8FED92445178586B59295C555E976DFB7E8F751C8CBC8EE2985B70B9 +4F1D6BBF6FB1753096FB514E54105835585759AC5C605F926597675C6E21767B +83DF8CED901490FD934D7825783A52AA5EA6571F597460125012515A51AC0000 +51CD520055105854585859575B955CF65D8B60BC6295642D6771684368BC68DF +76D76DD86E6F6D9B706F71C85F5375D879777B497B547B527CD67D7152308463 +856985E48A0E8B048C468E0F9003900F94199676982D9A3095D850CD52D5540C +58025C0E61A7649E6D1E77B37AE580F48404905392855CE09D07533F5F975FB3 +6D9C7279776379BF7BE46BD272EC8AAD68036A6151F87A8169345C4A9CF682EB +5BC59149701E56785C6F60C765666C8C8C5A90419813545166C7920D594890A3 +51854E4D51EA85998B0E7058637A934B696299B47E047577535769608EDF96E3 +6C5D4E8C5C3C5F108FE953028CD1808986795EFF65E54E735165000000000000 +94 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +59825C3F97EE4EFB598A5FCD8A8D6FE179B079625BE78471732B71B15E745FF5 +637B649A71C37C984E435EFC4E4B57DC56A260A96FC37D0D80FD813381BF8FB2 +899786A45DF4628A64AD898767776CE26D3E743678345A467F7582AD99AC4FF3 +5EC362DD63926557676F76C3724C80CC80BA8F29914D500D57F95A9268850000 +6973716472FD8CB758F28CE0966A9019877F79E477E784294F2F5265535A62CD +67CF6CCA767D7B947C95823685848FEB66DD6F2072067E1B83AB99C19EA651FD +7BB178727BB880877B486AE85E61808C75517560516B92626E8C767A91979AEA +4F107F70629C7B4F95A59CE9567A585986E496BC4F345224534A53CD53DB5E06 +642C6591677F6C3E6C4E724872AF73ED75547E41822C85E98CA97BC491C67169 +981298EF633D6669756A76E478D0854386EE532A5351542659835E875F7C60B2 +6249627962AB65906BD46CCC75B276AE789179D87DCB7F7780A588AB8AB98CBB +907F975E98DB6A0B7C3850995C3E5FAE67876BD8743577097F8E000000000000 +95 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +9F3B67CA7A175339758B9AED5F66819D83F180985F3C5FC575627B46903C6867 +59EB5A9B7D10767E8B2C4FF55F6A6A196C376F0274E2796888688A558C795EDF +63CF75C579D282D7932892F2849C86ED9C2D54C15F6C658C6D5C70158CA78CD3 +983B654F74F64E0D4ED857E0592B5A665BCC51A85E035E9C6016627665770000 +65A7666E6D6E72367B268150819A82998B5C8CA08CE68D74961C96444FAE64AB +6B66821E8461856A90E85C01695398A8847A85574F0F526F5FA95E45670D798F +8179890789866DF55F1762556CB84ECF72699B925206543B567458B361A4626E +711A596E7C897CDE7D1B96F06587805E4E194F75517558405E635E735F0A67C4 +4E26853D9589965B7C73980150FB58C1765678A7522577A585117B86504F5909 +72477BC77DE88FBA8FD4904D4FBF52C95A295F0197AD4FDD821792EA57036355 +6B69752B88DC8F147A4252DF58936155620A66AE6BCD7C3F83E950234FF85305 +5446583159495B9D5CF05CEF5D295E9662B16367653E65B9670B000000000000 +96 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +6CD56CE170F978327E2B80DE82B3840C84EC870289128A2A8C4A90A692D298FD +9CF39D6C4E4F4EA1508D5256574A59A85E3D5FD85FD9623F66B4671B67D068D2 +51927D2180AA81A88B008C8C8CBF927E96325420982C531750D5535C58A864B2 +6734726777667A4691E652C36CA16B8658005E4C5954672C7FFB51E176C60000 +646978E89B549EBB57CB59B96627679A6BCE54E969D95E55819C67959BAA67FE +9C52685D4EA64FE353C862B9672B6CAB8FC44FAD7E6D9EBF4E0761626E806F2B +85135473672A9B455DF37B955CAC5BC6871C6E4A84D17A14810859997C8D6C11 +772052D959227121725F77DB97279D61690B5A7F5A1851A5540D547D660E76DF +8FF792989CF459EA725D6EC5514D68C97DBF7DEC97629EBA64786A2183025984 +5B5F6BDB731B76F27DB280178499513267289ED976EE676252FF99055C24623B +7C7E8CB0554F60B67D0B958053014E5F51B6591C723A803691CE5F2577E25384 +5F797D0485AC8A338E8D975667F385AE9453610961086CB97652000000000000 +97 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +8AED8F38552F4F51512A52C753CB5BA55E7D60A0618263D6670967DA6E676D8C +733673377531795088D58A98904A909190F596C4878D59154E884F594E0E8A89 +8F3F981050AD5E7C59965BB95EB863DA63FA64C166DC694A69D86D0B6EB67194 +75287AAF7F8A8000844984C989818B218E0A9065967D990A617E62916B320000 +6C836D747FCC7FFC6DC07F8587BA88F8676583B1983C96F76D1B7D61843D916A +4E7153755D506B046FEB85CD862D89A75229540F5C65674E68A87406748375E2 +88CF88E191CC96E296785F8B73877ACB844E63A0756552896D416E9C74097559 +786B7C9296867ADC9F8D4FB6616E65C5865C4E864EAE50DA4E2151CC5BEE6599 +68816DBC731F764277AD7A1C7CE7826F8AD2907C91CF96759818529B7DD1502B +539867976DCB71D0743381E88F2A96A39C579E9F746058416D997D2F985E4EE4 +4F364F8B51B752B15DBA601C73B2793C82D3923496B796F6970A9E979F6266A6 +6B74521752A370C888C25EC9604B61906F2371497C3E7DF4806F000000000000 +98 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +84EE9023932C54429B6F6AD370898CC28DEF973252B45A415ECA5F046717697C +69946D6A6F0F726272FC7BED8001807E874B90CE516D9E937984808B93328AD6 +502D548C8A716B6A8CC4810760D167A09DF24E994E989C108A6B85C185686900 +6E7E789781550000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000005F0C +4E104E154E2A4E314E364E3C4E3F4E424E564E584E824E858C6B4E8A82125F0D +4E8E4E9E4E9F4EA04EA24EB04EB34EB64ECE4ECD4EC44EC64EC24ED74EDE4EED +4EDF4EF74F094F5A4F304F5B4F5D4F574F474F764F884F8F4F984F7B4F694F70 +4F914F6F4F864F9651184FD44FDF4FCE4FD84FDB4FD14FDA4FD04FE44FE5501A +50285014502A502550054F1C4FF650215029502C4FFE4FEF5011500650435047 +6703505550505048505A5056506C50785080509A508550B450B2000000000000 +99 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +50C950CA50B350C250D650DE50E550ED50E350EE50F950F55109510151025116 +51155114511A5121513A5137513C513B513F51405152514C515451627AF85169 +516A516E5180518256D8518C5189518F519151935195519651A451A651A251A9 +51AA51AB51B351B151B251B051B551BD51C551C951DB51E0865551E951ED0000 +51F051F551FE5204520B5214520E5227522A522E52335239524F5244524B524C +525E5254526A527452695273527F527D528D529452925271528852918FA88FA7 +52AC52AD52BC52B552C152CD52D752DE52E352E698ED52E052F352F552F852F9 +530653087538530D5310530F5315531A5323532F533153335338534053465345 +4E175349534D51D6535E5369536E5918537B53775382539653A053A653A553AE +53B053B653C37C1296D953DF66FC71EE53EE53E853ED53FA5401543D5440542C +542D543C542E54365429541D544E548F5475548E545F5471547754705492547B +5480547654845490548654C754A254B854A554AC54C454C854A8000000000000 +9A +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +54AB54C254A454BE54BC54D854E554E6550F551454FD54EE54ED54FA54E25539 +55405563554C552E555C55455556555755385533555D5599558054AF558A559F +557B557E5598559E55AE557C558355A9558755A855DA55C555DF55C455DC55E4 +55D4561455F7561655FE55FD561B55F9564E565071DF56345636563256380000 +566B5664562F566C566A56865680568A56A05694568F56A556AE56B656B456C2 +56BC56C156C356C056C856CE56D156D356D756EE56F9570056FF570457095708 +570B570D57135718571655C7571C572657375738574E573B5740574F576957C0 +57885761577F5789579357A057B357A457AA57B057C357C657D457D257D3580A +57D657E3580B5819581D587258215862584B58706BC05852583D5879588558B9 +589F58AB58BA58DE58BB58B858AE58C558D358D158D758D958D858E558DC58E4 +58DF58EF58FA58F958FB58FC58FD5902590A5910591B68A65925592C592D5932 +5938593E7AD259555950594E595A5958596259605967596C5969000000000000 +9B +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +59785981599D4F5E4FAB59A359B259C659E859DC598D59D959DA5A255A1F5A11 +5A1C5A095A1A5A405A6C5A495A355A365A625A6A5A9A5ABC5ABE5ACB5AC25ABD +5AE35AD75AE65AE95AD65AFA5AFB5B0C5B0B5B165B325AD05B2A5B365B3E5B43 +5B455B405B515B555B5A5B5B5B655B695B705B735B755B7865885B7A5B800000 +5B835BA65BB85BC35BC75BC95BD45BD05BE45BE65BE25BDE5BE55BEB5BF05BF6 +5BF35C055C075C085C0D5C135C205C225C285C385C395C415C465C4E5C535C50 +5C4F5B715C6C5C6E4E625C765C795C8C5C915C94599B5CAB5CBB5CB65CBC5CB7 +5CC55CBE5CC75CD95CE95CFD5CFA5CED5D8C5CEA5D0B5D155D175D5C5D1F5D1B +5D115D145D225D1A5D195D185D4C5D525D4E5D4B5D6C5D735D765D875D845D82 +5DA25D9D5DAC5DAE5DBD5D905DB75DBC5DC95DCD5DD35DD25DD65DDB5DEB5DF2 +5DF55E0B5E1A5E195E115E1B5E365E375E445E435E405E4E5E575E545E5F5E62 +5E645E475E755E765E7A9EBC5E7F5EA05EC15EC25EC85ED05ECF000000000000 +9C +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +5ED65EE35EDD5EDA5EDB5EE25EE15EE85EE95EEC5EF15EF35EF05EF45EF85EFE +5F035F095F5D5F5C5F0B5F115F165F295F2D5F385F415F485F4C5F4E5F2F5F51 +5F565F575F595F615F6D5F735F775F835F825F7F5F8A5F885F915F875F9E5F99 +5F985FA05FA85FAD5FBC5FD65FFB5FE45FF85FF15FDD60B35FFF602160600000 +601960106029600E6031601B6015602B6026600F603A605A6041606A6077605F +604A6046604D6063604360646042606C606B60596081608D60E76083609A6084 +609B60966097609260A7608B60E160B860E060D360B45FF060BD60C660B560D8 +614D6115610660F660F7610060F460FA6103612160FB60F1610D610E6147613E +61286127614A613F613C612C6134613D614261446173617761586159615A616B +6174616F61656171615F615D6153617561996196618761AC6194619A618A6191 +61AB61AE61CC61CA61C961F761C861C361C661BA61CB7F7961CD61E661E361F6 +61FA61F461FF61FD61FC61FE620062086209620D620C6214621B000000000000 +9D +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +621E6221622A622E6230623262336241624E625E6263625B62606268627C6282 +6289627E62926293629662D46283629462D762D162BB62CF62FF62C664D462C8 +62DC62CC62CA62C262C7629B62C9630C62EE62F163276302630862EF62F56350 +633E634D641C634F6396638E638063AB637663A3638F6389639F63B5636B0000 +636963BE63E963C063C663E363C963D263F663C4641664346406641364266436 +651D64176428640F6467646F6476644E652A6495649364A564A9648864BC64DA +64D264C564C764BB64D864C264F164E7820964E064E162AC64E364EF652C64F6 +64F464F264FA650064FD6518651C650565246523652B65346535653765366538 +754B654865566555654D6558655E655D65726578658265838B8A659B659F65AB +65B765C365C665C165C465CC65D265DB65D965E065E165F16772660A660365FB +6773663566366634661C664F664466496641665E665D666466676668665F6662 +667066836688668E668966846698669D66C166B966C966BE66BC000000000000 +9E +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +66C466B866D666DA66E0663F66E666E966F066F566F7670F6716671E67266727 +9738672E673F67366741673867376746675E67606759676367646789677067A9 +677C676A678C678B67A667A1678567B767EF67B467EC67B367E967B867E467DE +67DD67E267EE67B967CE67C667E76A9C681E684668296840684D6832684E0000 +68B3682B685968636877687F689F688F68AD6894689D689B68836AAE68B96874 +68B568A068BA690F688D687E690168CA690868D86922692668E1690C68CD68D4 +68E768D569366912690468D768E3692568F968E068EF6928692A691A69236921 +68C669796977695C6978696B6954697E696E69396974693D695969306961695E +695D6981696A69B269AE69D069BF69C169D369BE69CE5BE869CA69DD69BB69C3 +69A76A2E699169A0699C699569B469DE69E86A026A1B69FF6B0A69F969F269E7 +6A0569B16A1E69ED6A1469EB6A0A6A126AC16A236A136A446A0C6A726A366A78 +6A476A626A596A666A486A386A226A906A8D6AA06A846AA26AA3000000000000 +9F +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +6A9786176ABB6AC36AC26AB86AB36AAC6ADE6AD16ADF6AAA6ADA6AEA6AFB6B05 +86166AFA6B126B169B316B1F6B386B3776DC6B3998EE6B476B436B496B506B59 +6B546B5B6B5F6B616B786B796B7F6B806B846B836B8D6B986B956B9E6BA46BAA +6BAB6BAF6BB26BB16BB36BB76BBC6BC66BCB6BD36BDF6BEC6BEB6BF36BEF0000 +9EBE6C086C136C146C1B6C246C236C5E6C556C626C6A6C826C8D6C9A6C816C9B +6C7E6C686C736C926C906CC46CF16CD36CBD6CD76CC56CDD6CAE6CB16CBE6CBA +6CDB6CEF6CD96CEA6D1F884D6D366D2B6D3D6D386D196D356D336D126D0C6D63 +6D936D646D5A6D796D596D8E6D956FE46D856DF96E156E0A6DB56DC76DE66DB8 +6DC66DEC6DDE6DCC6DE86DD26DC56DFA6DD96DE46DD56DEA6DEE6E2D6E6E6E2E +6E196E726E5F6E3E6E236E6B6E2B6E766E4D6E1F6E436E3A6E4E6E246EFF6E1D +6E386E826EAA6E986EC96EB76ED36EBD6EAF6EC46EB26ED46ED56E8F6EA56EC2 +6E9F6F416F11704C6EEC6EF86EFE6F3F6EF26F316EEF6F326ECC000000000000 +E0 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +6F3E6F136EF76F866F7A6F786F816F806F6F6F5B6FF36F6D6F826F7C6F586F8E +6F916FC26F666FB36FA36FA16FA46FB96FC66FAA6FDF6FD56FEC6FD46FD86FF1 +6FEE6FDB7009700B6FFA70117001700F6FFE701B701A6F74701D7018701F7030 +703E7032705170637099709270AF70F170AC70B870B370AE70DF70CB70DD0000 +70D9710970FD711C711971657155718871667162714C7156716C718F71FB7184 +719571A871AC71D771B971BE71D271C971D471CE71E071EC71E771F571FC71F9 +71FF720D7210721B7228722D722C72307232723B723C723F72407246724B7258 +7274727E7282728172877292729672A272A772B972B272C372C672C472CE72D2 +72E272E072E172F972F7500F7317730A731C7316731D7334732F73297325733E +734E734F9ED87357736A7368737073787375737B737A73C873B373CE73BB73C0 +73E573EE73DE74A27405746F742573F87432743A7455743F745F74597441745C +746974707463746A7476747E748B749E74A774CA74CF74D473F1000000000000 +E1 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +74E074E374E774E974EE74F274F074F174F874F7750475037505750C750E750D +75157513751E7526752C753C7544754D754A7549755B7546755A756975647567 +756B756D75787576758675877574758A758975827594759A759D75A575A375C2 +75B375C375B575BD75B875BC75B175CD75CA75D275D975E375DE75FE75FF0000 +75FC760175F075FA75F275F3760B760D7609761F762776207621762276247634 +7630763B764776487646765C76587661766276687669766A7667766C76707672 +76767678767C768076837688768B768E769676937699769A76B076B476B876B9 +76BA76C276CD76D676D276DE76E176E576E776EA862F76FB7708770777047729 +7724771E77257726771B773777387747775A7768776B775B7765777F777E7779 +778E778B779177A0779E77B077B677B977BF77BC77BD77BB77C777CD77D777DA +77DC77E377EE77FC780C781279267820792A7845788E78747886787C789A788C +78A378B578AA78AF78D178C678CB78D478BE78BC78C578CA78EC000000000000 +E2 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +78E778DA78FD78F47907791279117919792C792B794079607957795F795A7955 +7953797A797F798A799D79A79F4B79AA79AE79B379B979BA79C979D579E779EC +79E179E37A087A0D7A187A197A207A1F79807A317A3B7A3E7A377A437A577A49 +7A617A627A699F9D7A707A797A7D7A887A977A957A987A967AA97AC87AB00000 +7AB67AC57AC47ABF90837AC77ACA7ACD7ACF7AD57AD37AD97ADA7ADD7AE17AE2 +7AE67AED7AF07B027B0F7B0A7B067B337B187B197B1E7B357B287B367B507B7A +7B047B4D7B0B7B4C7B457B757B657B747B677B707B717B6C7B6E7B9D7B987B9F +7B8D7B9C7B9A7B8B7B927B8F7B5D7B997BCB7BC17BCC7BCF7BB47BC67BDD7BE9 +7C117C147BE67BE57C607C007C077C137BF37BF77C177C0D7BF67C237C277C2A +7C1F7C377C2B7C3D7C4C7C437C547C4F7C407C507C587C5F7C647C567C657C6C +7C757C837C907CA47CAD7CA27CAB7CA17CA87CB37CB27CB17CAE7CB97CBD7CC0 +7CC57CC27CD87CD27CDC7CE29B3B7CEF7CF27CF47CF67CFA7D06000000000000 +E3 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +7D027D1C7D157D0A7D457D4B7D2E7D327D3F7D357D467D737D567D4E7D727D68 +7D6E7D4F7D637D937D897D5B7D8F7D7D7D9B7DBA7DAE7DA37DB57DC77DBD7DAB +7E3D7DA27DAF7DDC7DB87D9F7DB07DD87DDD7DE47DDE7DFB7DF27DE17E057E0A +7E237E217E127E317E1F7E097E0B7E227E467E667E3B7E357E397E437E370000 +7E327E3A7E677E5D7E567E5E7E597E5A7E797E6A7E697E7C7E7B7E837DD57E7D +8FAE7E7F7E887E897E8C7E927E907E937E947E967E8E7E9B7E9C7F387F3A7F45 +7F4C7F4D7F4E7F507F517F557F547F587F5F7F607F687F697F677F787F827F86 +7F837F887F877F8C7F947F9E7F9D7F9A7FA37FAF7FB27FB97FAE7FB67FB88B71 +7FC57FC67FCA7FD57FD47FE17FE67FE97FF37FF998DC80068004800B80128018 +8019801C80218028803F803B804A804680528058805A805F8062806880738072 +807080768079807D807F808480868085809B8093809A80AD519080AC80DB80E5 +80D980DD80C480DA80D6810980EF80F1811B81298123812F814B000000000000 +E4 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +968B8146813E8153815180FC8171816E81658166817481838188818A81808182 +81A0819581A481A3815F819381A981B081B581BE81B881BD81C081C281BA81C9 +81CD81D181D981D881C881DA81DF81E081E781FA81FB81FE8201820282058207 +820A820D821082168229822B82388233824082598258825D825A825F82640000 +82628268826A826B822E827182778278827E828D829282AB829F82BB82AC82E1 +82E382DF82D282F482F382FA8393830382FB82F982DE830682DC830982D98335 +83348316833283318340833983508345832F832B831783188385839A83AA839F +83A283968323838E8387838A837C83B58373837583A0838983A883F4841383EB +83CE83FD840383D8840B83C183F7840783E083F2840D8422842083BD84388506 +83FB846D842A843C855A84848477846B84AD846E848284698446842C846F8479 +843584CA846284B984BF849F84D984CD84BB84DA84D084C184C684D684A18521 +84FF84F485178518852C851F8515851484FC8540856385588548000000000000 +E5 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +85418602854B8555858085A485888591858A85A8856D8594859B85EA8587859C +8577857E859085C985BA85CF85B985D085D585DD85E585DC85F9860A8613860B +85FE85FA86068622861A8630863F864D4E558654865F86678671869386A386A9 +86AA868B868C86B686AF86C486C686B086C9882386AB86D486DE86E986EC0000 +86DF86DB86EF8712870687088700870386FB87118709870D86F9870A8734873F +8737873B87258729871A8760875F8778874C874E877487578768876E87598753 +8763876A880587A2879F878287AF87CB87BD87C087D096D687AB87C487B387C7 +87C687BB87EF87F287E0880F880D87FE87F687F7880E87D28811881688158822 +88218831883688398827883B8844884288528859885E8862886B8881887E889E +8875887D88B5887288828897889288AE889988A2888D88A488B088BF88B188C3 +88C488D488D888D988DD88F9890288FC88F488E888F28904890C890A89138943 +891E8925892A892B89418944893B89368938894C891D8960895E000000000000 +E6 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +89668964896D896A896F89748977897E89838988898A8993899889A189A989A6 +89AC89AF89B289BA89BD89BF89C089DA89DC89DD89E789F489F88A038A168A10 +8A0C8A1B8A1D8A258A368A418A5B8A528A468A488A7C8A6D8A6C8A628A858A82 +8A848AA88AA18A918AA58AA68A9A8AA38AC48ACD8AC28ADA8AEB8AF38AE70000 +8AE48AF18B148AE08AE28AF78ADE8ADB8B0C8B078B1A8AE18B168B108B178B20 +8B3397AB8B268B2B8B3E8B288B418B4C8B4F8B4E8B498B568B5B8B5A8B6B8B5F +8B6C8B6F8B748B7D8B808B8C8B8E8B928B938B968B998B9A8C3A8C418C3F8C48 +8C4C8C4E8C508C558C628C6C8C788C7A8C828C898C858C8A8C8D8C8E8C948C7C +8C98621D8CAD8CAA8CBD8CB28CB38CAE8CB68CC88CC18CE48CE38CDA8CFD8CFA +8CFB8D048D058D0A8D078D0F8D0D8D109F4E8D138CCD8D148D168D678D6D8D71 +8D738D818D998DC28DBE8DBA8DCF8DDA8DD68DCC8DDB8DCB8DEA8DEB8DDF8DE3 +8DFC8E088E098DFF8E1D8E1E8E108E1F8E428E358E308E348E4A000000000000 +E7 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +8E478E498E4C8E508E488E598E648E608E2A8E638E558E768E728E7C8E818E87 +8E858E848E8B8E8A8E938E918E948E998EAA8EA18EAC8EB08EC68EB18EBE8EC5 +8EC88ECB8EDB8EE38EFC8EFB8EEB8EFE8F0A8F058F158F128F198F138F1C8F1F +8F1B8F0C8F268F338F3B8F398F458F428F3E8F4C8F498F468F4E8F578F5C0000 +8F628F638F648F9C8F9F8FA38FAD8FAF8FB78FDA8FE58FE28FEA8FEF90878FF4 +90058FF98FFA901190159021900D901E9016900B90279036903590398FF8904F +905090519052900E9049903E90569058905E9068906F907696A890729082907D +90819080908A9089908F90A890AF90B190B590E290E4624890DB910291129119 +91329130914A9156915891639165916991739172918B9189918291A291AB91AF +91AA91B591B491BA91C091C191C991CB91D091D691DF91E191DB91FC91F591F6 +921E91FF9214922C92159211925E925792459249926492489295923F924B9250 +929C92969293929B925A92CF92B992B792E9930F92FA9344932E000000000000 +E8 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +93199322931A9323933A9335933B935C9360937C936E935693B093AC93AD9394 +93B993D693D793E893E593D893C393DD93D093C893E4941A9414941394039407 +94109436942B94359421943A944194529444945B94609462945E946A92299470 +94759477947D945A947C947E9481947F95829587958A95949596959895990000 +95A095A895A795AD95BC95BB95B995BE95CA6FF695C395CD95CC95D595D495D6 +95DC95E195E595E296219628962E962F9642964C964F964B9677965C965E965D +965F96669672966C968D96989695969796AA96A796B196B296B096B496B696B8 +96B996CE96CB96C996CD894D96DC970D96D596F99704970697089713970E9711 +970F971697199724972A97309739973D973E97449746974897429749975C9760 +97649766976852D2976B977197799785977C9781977A9786978B978F9790979C +97A897A697A397B397B497C397C697C897CB97DC97ED9F4F97F27ADF97F697F5 +980F980C9838982498219837983D9846984F984B986B986F9870000000000000 +E9 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +98719874987398AA98AF98B198B698C498C398C698E998EB9903990999129914 +99189921991D991E99249920992C992E993D993E9942994999459950994B9951 +9952994C99559997999899A599AD99AE99BC99DF99DB99DD99D899D199ED99EE +99F199F299FB99F89A019A0F9A0599E29A199A2B9A379A459A429A409A430000 +9A3E9A559A4D9A5B9A579A5F9A629A659A649A699A6B9A6A9AAD9AB09ABC9AC0 +9ACF9AD19AD39AD49ADE9ADF9AE29AE39AE69AEF9AEB9AEE9AF49AF19AF79AFB +9B069B189B1A9B1F9B229B239B259B279B289B299B2A9B2E9B2F9B329B449B43 +9B4F9B4D9B4E9B519B589B749B939B839B919B969B979B9F9BA09BA89BB49BC0 +9BCA9BB99BC69BCF9BD19BD29BE39BE29BE49BD49BE19C3A9BF29BF19BF09C15 +9C149C099C139C0C9C069C089C129C0A9C049C2E9C1B9C259C249C219C309C47 +9C329C469C3E9C5A9C609C679C769C789CE79CEC9CF09D099D089CEB9D039D06 +9D2A9D269DAF9D239D1F9D449D159D129D419D3F9D3E9D469D48000000000000 +EA +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +9D5D9D5E9D649D519D509D599D729D899D879DAB9D6F9D7A9D9A9DA49DA99DB2 +9DC49DC19DBB9DB89DBA9DC69DCF9DC29DD99DD39DF89DE69DED9DEF9DFD9E1A +9E1B9E1E9E759E799E7D9E819E889E8B9E8C9E929E959E919E9D9EA59EA99EB8 +9EAA9EAD97619ECC9ECE9ECF9ED09ED49EDC9EDE9EDD9EE09EE59EE89EEF0000 +9EF49EF69EF79EF99EFB9EFC9EFD9F079F0876B79F159F219F2C9F3E9F4A9F52 +9F549F639F5F9F609F619F669F679F6C9F6A9F779F729F769F959F9C9FA0582F +69C79059746451DC719900000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +ED +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +7E8A891C9348928884DC4FC970BB663168C892F966FB5F454E284EE14EFC4F00 +4F034F394F564F924F8A4F9A4F944FCD504050224FFF501E5046507050425094 +50F450D8514A5164519D51BE51EC5215529C52A652C052DB5300530753245372 +539353B253DDFA0E549C548A54A954FF55865759576557AC57C857C7FA0F0000 +FA10589E58B2590B5953595B595D596359A459BA5B565BC0752F5BD85BEC5C1E +5CA65CBA5CF55D275D53FA115D425D6D5DB85DB95DD05F215F345F675FB75FDE +605D6085608A60DE60D5612060F26111613761306198621362A663F56460649D +64CE654E66006615663B6609662E661E6624666566576659FA126673669966A0 +66B266BF66FA670EF929676667BB685267C06801684468CFFA136968FA146998 +69E26A306A6B6A466A736A7E6AE26AE46BD66C3F6C5C6C866C6F6CDA6D046D87 +6D6F6D966DAC6DCF6DF86DF26DFC6E396E5C6E276E3C6EBF6F886FB56FF57005 +70077028708570AB710F7104715C71467147FA1571C171FE72B1000000000000 +EE +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +72BE7324FA16737773BD73C973D673E373D2740773F57426742A7429742E7462 +7489749F7501756F7682769C769E769B76A6FA17774652AF7821784E7864787A +7930FA18FA19FA1A7994FA1B799B7AD17AE7FA1C7AEB7B9EFA1D7D487D5C7DB7 +7DA07DD67E527F477FA1FA1E83018362837F83C783F6844884B4855385590000 +856BFA1F85B0FA20FA21880788F58A128A378A798AA78ABE8ADFFA228AF68B53 +8B7F8CF08CF48D128D76FA238ECFFA24FA25906790DEFA269115912791DA91D7 +91DE91ED91EE91E491E592069210920A923A9240923C924E9259925192399267 +92A79277927892E792D792D992D0FA2792D592E092D39325932192FBFA28931E +92FF931D93029370935793A493C693DE93F89431944594489592F9DCFA29969D +96AF9733973B9743974D974F9751975598579865FA2AFA2B9927FA2C999E9A4E +9AD99ADC9B759B729B8F9BB19BBB9C009D709D6BFA2D9E199ED1000000002170 +217121722173217421752176217721782179FFE2FFE4FF07FF02000000000000 +FA +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +2170217121722173217421752176217721782179216021612162216321642165 +2166216721682169FFE2FFE4FF07FF0232312116212122357E8A891C93489288 +84DC4FC970BB663168C892F966FB5F454E284EE14EFC4F004F034F394F564F92 +4F8A4F9A4F944FCD504050224FFF501E504650705042509450F450D8514A0000 +5164519D51BE51EC5215529C52A652C052DB5300530753245372539353B253DD +FA0E549C548A54A954FF55865759576557AC57C857C7FA0FFA10589E58B2590B +5953595B595D596359A459BA5B565BC0752F5BD85BEC5C1E5CA65CBA5CF55D27 +5D53FA115D425D6D5DB85DB95DD05F215F345F675FB75FDE605D6085608A60DE +60D5612060F26111613761306198621362A663F56460649D64CE654E66006615 +663B6609662E661E6624666566576659FA126673669966A066B266BF66FA670E +F929676667BB685267C06801684468CFFA136968FA14699869E26A306A6B6A46 +6A736A7E6AE26AE46BD66C3F6C5C6C866C6F6CDA6D046D876D6F000000000000 +FB +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +6D966DAC6DCF6DF86DF26DFC6E396E5C6E276E3C6EBF6F886FB56FF570057007 +7028708570AB710F7104715C71467147FA1571C171FE72B172BE7324FA167377 +73BD73C973D673E373D2740773F57426742A7429742E74627489749F7501756F +7682769C769E769B76A6FA17774652AF7821784E7864787A7930FA18FA190000 +FA1A7994FA1B799B7AD17AE7FA1C7AEB7B9EFA1D7D487D5C7DB77DA07DD67E52 +7F477FA1FA1E83018362837F83C783F6844884B485538559856BFA1F85B0FA20 +FA21880788F58A128A378A798AA78ABE8ADFFA228AF68B538B7F8CF08CF48D12 +8D76FA238ECFFA24FA25906790DEFA269115912791DA91D791DE91ED91EE91E4 +91E592069210920A923A9240923C924E925992519239926792A79277927892E7 +92D792D992D0FA2792D592E092D39325932192FBFA28931E92FF931D93029370 +935793A493C693DE93F89431944594489592F9DCFA29969D96AF9733973B9743 +974D974F9751975598579865FA2AFA2B9927FA2C999E9A4E9AD9000000000000 +FC +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +9ADC9B759B729B8F9BB19BBB9C009D709D6BFA2D9E199ED10000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +R +8160 301C FF5E +8161 2016 2225 +817C 2212 FF0D +8191 00A2 FFE0 +8192 00A3 FFE1 +81CA 00AC FFE2 +81BE 222a +81BF 2229 +81DA 2220 +81DB 22a5 +81DF 2261 +81E0 2252 +81E3 221a +81E6 2235 +81E7 222b diff --git a/env/tcl/tcl8.6/encoding/cp936.enc b/env/tcl/tcl8.6/encoding/cp936.enc new file mode 100644 index 0000000..37bcc80 --- /dev/null +++ b/env/tcl/tcl8.6/encoding/cp936.enc @@ -0,0 +1,2162 @@ +# Encoding file: cp936, multi-byte +M +003F 0 127 +00 +0000000100020003000400050006000700080009000A000B000C000D000E000F +0010001100120013001400150016001700180019001A001B001C001D001E001F +0020002100220023002400250026002700280029002A002B002C002D002E002F +0030003100320033003400350036003700380039003A003B003C003D003E003F +0040004100420043004400450046004700480049004A004B004C004D004E004F +0050005100520053005400550056005700580059005A005B005C005D005E005F +0060006100620063006400650066006700680069006A006B006C006D006E006F +0070007100720073007400750076007700780079007A007B007C007D007E007F +20AC000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +81 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +4E024E044E054E064E0F4E124E174E1F4E204E214E234E264E294E2E4E2F4E31 +4E334E354E374E3C4E404E414E424E444E464E4A4E514E554E574E5A4E5B4E62 +4E634E644E654E674E684E6A4E6B4E6C4E6D4E6E4E6F4E724E744E754E764E77 +4E784E794E7A4E7B4E7C4E7D4E7F4E804E814E824E834E844E854E874E8A0000 +4E904E964E974E994E9C4E9D4E9E4EA34EAA4EAF4EB04EB14EB44EB64EB74EB8 +4EB94EBC4EBD4EBE4EC84ECC4ECF4ED04ED24EDA4EDB4EDC4EE04EE24EE64EE7 +4EE94EED4EEE4EEF4EF14EF44EF84EF94EFA4EFC4EFE4F004F024F034F044F05 +4F064F074F084F0B4F0C4F124F134F144F154F164F1C4F1D4F214F234F284F29 +4F2C4F2D4F2E4F314F334F354F374F394F3B4F3E4F3F4F404F414F424F444F45 +4F474F484F494F4A4F4B4F4C4F524F544F564F614F624F664F684F6A4F6B4F6D +4F6E4F714F724F754F774F784F794F7A4F7D4F804F814F824F854F864F874F8A +4F8C4F8E4F904F924F934F954F964F984F994F9A4F9C4F9E4F9F4FA14FA20000 +82 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +4FA44FAB4FAD4FB04FB14FB24FB34FB44FB64FB74FB84FB94FBA4FBB4FBC4FBD +4FBE4FC04FC14FC24FC64FC74FC84FC94FCB4FCC4FCD4FD24FD34FD44FD54FD6 +4FD94FDB4FE04FE24FE44FE54FE74FEB4FEC4FF04FF24FF44FF54FF64FF74FF9 +4FFB4FFC4FFD4FFF5000500150025003500450055006500750085009500A0000 +500B500E501050115013501550165017501B501D501E50205022502350245027 +502B502F5030503150325033503450355036503750385039503B503D503F5040 +504150425044504550465049504A504B504D5050505150525053505450565057 +50585059505B505D505E505F506050615062506350645066506750685069506A +506B506D506E506F50705071507250735074507550785079507A507C507D5081 +508250835084508650875089508A508B508C508E508F50905091509250935094 +50955096509750985099509A509B509C509D509E509F50A050A150A250A450A6 +50AA50AB50AD50AE50AF50B050B150B350B450B550B650B750B850B950BC0000 +83 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +50BD50BE50BF50C050C150C250C350C450C550C650C750C850C950CA50CB50CC +50CD50CE50D050D150D250D350D450D550D750D850D950DB50DC50DD50DE50DF +50E050E150E250E350E450E550E850E950EA50EB50EF50F050F150F250F450F6 +50F750F850F950FA50FC50FD50FE50FF51005101510251035104510551080000 +5109510A510C510D510E510F511051115113511451155116511751185119511A +511B511C511D511E511F512051225123512451255126512751285129512A512B +512C512D512E512F5130513151325133513451355136513751385139513A513B +513C513D513E51425147514A514C514E514F515051525153515751585159515B +515D515E515F5160516151635164516651675169516A516F5172517A517E517F +5183518451865187518A518B518E518F51905191519351945198519A519D519E +519F51A151A351A651A751A851A951AA51AD51AE51B451B851B951BA51BE51BF +51C151C251C351C551C851CA51CD51CE51D051D251D351D451D551D651D70000 +84 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +51D851D951DA51DC51DE51DF51E251E351E551E651E751E851E951EA51EC51EE +51F151F251F451F751FE520452055209520B520C520F5210521352145215521C +521E521F522152225223522552265227522A522C522F5231523252345235523C +523E524452455246524752485249524B524E524F525252535255525752580000 +5259525A525B525D525F526052625263526452665268526B526C526D526E5270 +52715273527452755276527752785279527A527B527C527E5280528352845285 +528652875289528A528B528C528D528E528F5291529252945295529652975298 +5299529A529C52A452A552A652A752AE52AF52B052B452B552B652B752B852B9 +52BA52BB52BC52BD52C052C152C252C452C552C652C852CA52CC52CD52CE52CF +52D152D352D452D552D752D952DA52DB52DC52DD52DE52E052E152E252E352E5 +52E652E752E852E952EA52EB52EC52ED52EE52EF52F152F252F352F452F552F6 +52F752F852FB52FC52FD530153025303530453075309530A530B530C530E0000 +85 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +53115312531353145318531B531C531E531F532253245325532753285329532B +532C532D532F533053315332533353345335533653375338533C533D53405342 +53445346534B534C534D5350535453585359535B535D53655368536A536C536D +537253765379537B537C537D537E53805381538353875388538A538E538F0000 +53905391539253935394539653975399539B539C539E53A053A153A453A753AA +53AB53AC53AD53AF53B053B153B253B353B453B553B753B853B953BA53BC53BD +53BE53C053C353C453C553C653C753CE53CF53D053D253D353D553DA53DC53DD +53DE53E153E253E753F453FA53FE53FF5400540254055407540B541454185419 +541A541C542254245425542A5430543354365437543A543D543F544154425444 +544554475449544C544D544E544F5451545A545D545E545F5460546154635465 +54675469546A546B546C546D546E546F547054745479547A547E547F54815483 +5485548754885489548A548D5491549354975498549C549E549F54A054A10000 +86 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +54A254A554AE54B054B254B554B654B754B954BA54BC54BE54C354C554CA54CB +54D654D854DB54E054E154E254E354E454EB54EC54EF54F054F154F454F554F6 +54F754F854F954FB54FE550055025503550455055508550A550B550C550D550E +5512551355155516551755185519551A551C551D551E551F5521552555260000 +55285529552B552D553255345535553655385539553A553B553D554055425545 +55475548554B554C554D554E554F5551555255535554555755585559555A555B +555D555E555F55605562556355685569556B556F557055715572557355745579 +557A557D557F55855586558C558D558E559055925593559555965597559A559B +559E55A055A155A255A355A455A555A655A855A955AA55AB55AC55AD55AE55AF +55B055B255B455B655B855BA55BC55BF55C055C155C255C355C655C755C855CA +55CB55CE55CF55D055D555D755D855D955DA55DB55DE55E055E255E755E955ED +55EE55F055F155F455F655F855F955FA55FB55FC55FF56025603560456050000 +87 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +56065607560A560B560D561056115612561356145615561656175619561A561C +561D5620562156225625562656285629562A562B562E562F5630563356355637 +5638563A563C563D563E5640564156425643564456455646564756485649564A +564B564F565056515652565356555656565A565B565D565E565F566056610000 +5663566556665667566D566E566F56705672567356745675567756785679567A +567D567E567F56805681568256835684568756885689568A568B568C568D5690 +56915692569456955696569756985699569A569B569C569D569E569F56A056A1 +56A256A456A556A656A756A856A956AA56AB56AC56AD56AE56B056B156B256B3 +56B456B556B656B856B956BA56BB56BD56BE56BF56C056C156C256C356C456C5 +56C656C756C856C956CB56CC56CD56CE56CF56D056D156D256D356D556D656D8 +56D956DC56E356E556E656E756E856E956EA56EC56EE56EF56F256F356F656F7 +56F856FB56FC57005701570257055707570B570C570D570E570F571057110000 +88 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +57125713571457155716571757185719571A571B571D571E5720572157225724 +572557265727572B5731573257345735573657375738573C573D573F57415743 +57445745574657485749574B5752575357545755575657585759576257635765 +5767576C576E5770577157725774577557785779577A577D577E577F57800000 +5781578757885789578A578D578E578F57905791579457955796579757985799 +579A579C579D579E579F57A557A857AA57AC57AF57B057B157B357B557B657B7 +57B957BA57BB57BC57BD57BE57BF57C057C157C457C557C657C757C857C957CA +57CC57CD57D057D157D357D657D757DB57DC57DE57E157E257E357E557E657E7 +57E857E957EA57EB57EC57EE57F057F157F257F357F557F657F757FB57FC57FE +57FF580158035804580558085809580A580C580E580F58105812581358145816 +58175818581A581B581C581D581F5822582358255826582758285829582B582C +582D582E582F58315832583358345836583758385839583A583B583C583D0000 +89 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +583E583F584058415842584358455846584758485849584A584B584E584F5850 +585258535855585658575859585A585B585C585D585F58605861586258635864 +5866586758685869586A586D586E586F58705871587258735874587558765877 +58785879587A587B587C587D587F58825884588658875888588A588B588C0000 +588D588E588F5890589158945895589658975898589B589C589D58A058A158A2 +58A358A458A558A658A758AA58AB58AC58AD58AE58AF58B058B158B258B358B4 +58B558B658B758B858B958BA58BB58BD58BE58BF58C058C258C358C458C658C7 +58C858C958CA58CB58CC58CD58CE58CF58D058D258D358D458D658D758D858D9 +58DA58DB58DC58DD58DE58DF58E058E158E258E358E558E658E758E858E958EA +58ED58EF58F158F258F458F558F758F858FA58FB58FC58FD58FE58FF59005901 +59035905590659085909590A590B590C590E591059115912591359175918591B +591D591E592059215922592359265928592C59305932593359355936593B0000 +8A +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +593D593E593F5940594359455946594A594C594D5950595259535959595B595C +595D595E595F5961596359645966596759685969596A596B596C596D596E596F +59705971597259755977597A597B597C597E597F598059855989598B598C598E +598F59905991599459955998599A599B599C599D599F59A059A159A259A60000 +59A759AC59AD59B059B159B359B459B559B659B759B859BA59BC59BD59BF59C0 +59C159C259C359C459C559C759C859C959CC59CD59CE59CF59D559D659D959DB +59DE59DF59E059E159E259E459E659E759E959EA59EB59ED59EE59EF59F059F1 +59F259F359F459F559F659F759F859FA59FC59FD59FE5A005A025A0A5A0B5A0D +5A0E5A0F5A105A125A145A155A165A175A195A1A5A1B5A1D5A1E5A215A225A24 +5A265A275A285A2A5A2B5A2C5A2D5A2E5A2F5A305A335A355A375A385A395A3A +5A3B5A3D5A3E5A3F5A415A425A435A445A455A475A485A4B5A4C5A4D5A4E5A4F +5A505A515A525A535A545A565A575A585A595A5B5A5C5A5D5A5E5A5F5A600000 +8B +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +5A615A635A645A655A665A685A695A6B5A6C5A6D5A6E5A6F5A705A715A725A73 +5A785A795A7B5A7C5A7D5A7E5A805A815A825A835A845A855A865A875A885A89 +5A8A5A8B5A8C5A8D5A8E5A8F5A905A915A935A945A955A965A975A985A995A9C +5A9D5A9E5A9F5AA05AA15AA25AA35AA45AA55AA65AA75AA85AA95AAB5AAC0000 +5AAD5AAE5AAF5AB05AB15AB45AB65AB75AB95ABA5ABB5ABC5ABD5ABF5AC05AC3 +5AC45AC55AC65AC75AC85ACA5ACB5ACD5ACE5ACF5AD05AD15AD35AD55AD75AD9 +5ADA5ADB5ADD5ADE5ADF5AE25AE45AE55AE75AE85AEA5AEC5AED5AEE5AEF5AF0 +5AF25AF35AF45AF55AF65AF75AF85AF95AFA5AFB5AFC5AFD5AFE5AFF5B005B01 +5B025B035B045B055B065B075B085B0A5B0B5B0C5B0D5B0E5B0F5B105B115B12 +5B135B145B155B185B195B1A5B1B5B1C5B1D5B1E5B1F5B205B215B225B235B24 +5B255B265B275B285B295B2A5B2B5B2C5B2D5B2E5B2F5B305B315B335B355B36 +5B385B395B3A5B3B5B3C5B3D5B3E5B3F5B415B425B435B445B455B465B470000 +8C +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +5B485B495B4A5B4B5B4C5B4D5B4E5B4F5B525B565B5E5B605B615B675B685B6B +5B6D5B6E5B6F5B725B745B765B775B785B795B7B5B7C5B7E5B7F5B825B865B8A +5B8D5B8E5B905B915B925B945B965B9F5BA75BA85BA95BAC5BAD5BAE5BAF5BB1 +5BB25BB75BBA5BBB5BBC5BC05BC15BC35BC85BC95BCA5BCB5BCD5BCE5BCF0000 +5BD15BD45BD55BD65BD75BD85BD95BDA5BDB5BDC5BE05BE25BE35BE65BE75BE9 +5BEA5BEB5BEC5BED5BEF5BF15BF25BF35BF45BF55BF65BF75BFD5BFE5C005C02 +5C035C055C075C085C0B5C0C5C0D5C0E5C105C125C135C175C195C1B5C1E5C1F +5C205C215C235C265C285C295C2A5C2B5C2D5C2E5C2F5C305C325C335C355C36 +5C375C435C445C465C475C4C5C4D5C525C535C545C565C575C585C5A5C5B5C5C +5C5D5C5F5C625C645C675C685C695C6A5C6B5C6C5C6D5C705C725C735C745C75 +5C765C775C785C7B5C7C5C7D5C7E5C805C835C845C855C865C875C895C8A5C8B +5C8E5C8F5C925C935C955C9D5C9E5C9F5CA05CA15CA45CA55CA65CA75CA80000 +8D +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +5CAA5CAE5CAF5CB05CB25CB45CB65CB95CBA5CBB5CBC5CBE5CC05CC25CC35CC5 +5CC65CC75CC85CC95CCA5CCC5CCD5CCE5CCF5CD05CD15CD35CD45CD55CD65CD7 +5CD85CDA5CDB5CDC5CDD5CDE5CDF5CE05CE25CE35CE75CE95CEB5CEC5CEE5CEF +5CF15CF25CF35CF45CF55CF65CF75CF85CF95CFA5CFC5CFD5CFE5CFF5D000000 +5D015D045D055D085D095D0A5D0B5D0C5D0D5D0F5D105D115D125D135D155D17 +5D185D195D1A5D1C5D1D5D1F5D205D215D225D235D255D285D2A5D2B5D2C5D2F +5D305D315D325D335D355D365D375D385D395D3A5D3B5D3C5D3F5D405D415D42 +5D435D445D455D465D485D495D4D5D4E5D4F5D505D515D525D535D545D555D56 +5D575D595D5A5D5C5D5E5D5F5D605D615D625D635D645D655D665D675D685D6A +5D6D5D6E5D705D715D725D735D755D765D775D785D795D7A5D7B5D7C5D7D5D7E +5D7F5D805D815D835D845D855D865D875D885D895D8A5D8B5D8C5D8D5D8E5D8F +5D905D915D925D935D945D955D965D975D985D9A5D9B5D9C5D9E5D9F5DA00000 +8E +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +5DA15DA25DA35DA45DA55DA65DA75DA85DA95DAA5DAB5DAC5DAD5DAE5DAF5DB0 +5DB15DB25DB35DB45DB55DB65DB85DB95DBA5DBB5DBC5DBD5DBE5DBF5DC05DC1 +5DC25DC35DC45DC65DC75DC85DC95DCA5DCB5DCC5DCE5DCF5DD05DD15DD25DD3 +5DD45DD55DD65DD75DD85DD95DDA5DDC5DDF5DE05DE35DE45DEA5DEC5DED0000 +5DF05DF55DF65DF85DF95DFA5DFB5DFC5DFF5E005E045E075E095E0A5E0B5E0D +5E0E5E125E135E175E1E5E1F5E205E215E225E235E245E255E285E295E2A5E2B +5E2C5E2F5E305E325E335E345E355E365E395E3A5E3E5E3F5E405E415E435E46 +5E475E485E495E4A5E4B5E4D5E4E5E4F5E505E515E525E535E565E575E585E59 +5E5A5E5C5E5D5E5F5E605E635E645E655E665E675E685E695E6A5E6B5E6C5E6D +5E6E5E6F5E705E715E755E775E795E7E5E815E825E835E855E885E895E8C5E8D +5E8E5E925E985E9B5E9D5EA15EA25EA35EA45EA85EA95EAA5EAB5EAC5EAE5EAF +5EB05EB15EB25EB45EBA5EBB5EBC5EBD5EBF5EC05EC15EC25EC35EC45EC50000 +8F +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +5EC65EC75EC85ECB5ECC5ECD5ECE5ECF5ED05ED45ED55ED75ED85ED95EDA5EDC +5EDD5EDE5EDF5EE05EE15EE25EE35EE45EE55EE65EE75EE95EEB5EEC5EED5EEE +5EEF5EF05EF15EF25EF35EF55EF85EF95EFB5EFC5EFD5F055F065F075F095F0C +5F0D5F0E5F105F125F145F165F195F1A5F1C5F1D5F1E5F215F225F235F240000 +5F285F2B5F2C5F2E5F305F325F335F345F355F365F375F385F3B5F3D5F3E5F3F +5F415F425F435F445F455F465F475F485F495F4A5F4B5F4C5F4D5F4E5F4F5F51 +5F545F595F5A5F5B5F5C5F5E5F5F5F605F635F655F675F685F6B5F6E5F6F5F72 +5F745F755F765F785F7A5F7D5F7E5F7F5F835F865F8D5F8E5F8F5F915F935F94 +5F965F9A5F9B5F9D5F9E5F9F5FA05FA25FA35FA45FA55FA65FA75FA95FAB5FAC +5FAF5FB05FB15FB25FB35FB45FB65FB85FB95FBA5FBB5FBE5FBF5FC05FC15FC2 +5FC75FC85FCA5FCB5FCE5FD35FD45FD55FDA5FDB5FDC5FDE5FDF5FE25FE35FE5 +5FE65FE85FE95FEC5FEF5FF05FF25FF35FF45FF65FF75FF95FFA5FFC60070000 +90 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +60086009600B600C60106011601360176018601A601E601F602260236024602C +602D602E603060316032603360346036603760386039603A603D603E60406044 +60456046604760486049604A604C604E604F605160536054605660576058605B +605C605E605F6060606160656066606E60716072607460756077607E60800000 +608160826085608660876088608A608B608E608F609060916093609560976098 +6099609C609E60A160A260A460A560A760A960AA60AE60B060B360B560B660B7 +60B960BA60BD60BE60BF60C060C160C260C360C460C760C860C960CC60CD60CE +60CF60D060D260D360D460D660D760D960DB60DE60E160E260E360E460E560EA +60F160F260F560F760F860FB60FC60FD60FE60FF61026103610461056107610A +610B610C611061116112611361146116611761186119611B611C611D611E6121 +6122612561286129612A612C612D612E612F6130613161326133613461356136 +613761386139613A613B613C613D613E61406141614261436144614561460000 +91 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +61476149614B614D614F61506152615361546156615761586159615A615B615C +615E615F6160616161636164616561666169616A616B616C616D616E616F6171 +617261736174617661786179617A617B617C617D617E617F6180618161826183 +618461856186618761886189618A618C618D618F619061916192619361950000 +6196619761986199619A619B619C619E619F61A061A161A261A361A461A561A6 +61AA61AB61AD61AE61AF61B061B161B261B361B461B561B661B861B961BA61BB +61BC61BD61BF61C061C161C361C461C561C661C761C961CC61CD61CE61CF61D0 +61D361D561D661D761D861D961DA61DB61DC61DD61DE61DF61E061E161E261E3 +61E461E561E761E861E961EA61EB61EC61ED61EE61EF61F061F161F261F361F4 +61F661F761F861F961FA61FB61FC61FD61FE6200620162026203620462056207 +6209621362146219621C621D621E622062236226622762286229622B622D622F +6230623162326235623662386239623A623B623C6242624462456246624A0000 +92 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +624F62506255625662576259625A625C625D625E625F62606261626262646265 +6268627162726274627562776278627A627B627D628162826283628562866287 +6288628B628C628D628E628F629062946299629C629D629E62A362A662A762A9 +62AA62AD62AE62AF62B062B262B362B462B662B762B862BA62BE62C062C10000 +62C362CB62CF62D162D562DD62DE62E062E162E462EA62EB62F062F262F562F8 +62F962FA62FB63006303630463056306630A630B630C630D630F631063126313 +63146315631763186319631C632663276329632C632D632E6330633163336334 +6335633663376338633B633C633E633F63406341634463476348634A63516352 +635363546356635763586359635A635B635C635D63606364636563666368636A +636B636C636F6370637263736374637563786379637C637D637E637F63816383 +638463856386638B638D639163936394639563976399639A639B639C639D639E +639F63A163A463A663AB63AF63B163B263B563B663B963BB63BD63BF63C00000 +93 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +63C163C263C363C563C763C863CA63CB63CC63D163D363D463D563D763D863D9 +63DA63DB63DC63DD63DF63E263E463E563E663E763E863EB63EC63EE63EF63F0 +63F163F363F563F763F963FA63FB63FC63FE640364046406640764086409640A +640D640E6411641264156416641764186419641A641D641F6422642364240000 +6425642764286429642B642E642F643064316432643364356436643764386439 +643B643C643E6440644264436449644B644C644D644E644F6450645164536455 +645664576459645A645B645C645D645F64606461646264636464646564666468 +646A646B646C646E646F64706471647264736474647564766477647B647C647D +647E647F648064816483648664886489648A648B648C648D648E648F64906493 +649464976498649A649B649C649D649F64A064A164A264A364A564A664A764A8 +64AA64AB64AF64B164B264B364B464B664B964BB64BD64BE64BF64C164C364C4 +64C664C764C864C964CA64CB64CC64CF64D164D364D464D564D664D964DA0000 +94 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +64DB64DC64DD64DF64E064E164E364E564E764E864E964EA64EB64EC64ED64EE +64EF64F064F164F264F364F464F564F664F764F864F964FA64FB64FC64FD64FE +64FF65016502650365046505650665076508650A650B650C650D650E650F6510 +6511651365146515651665176519651A651B651C651D651E651F652065210000 +6522652365246526652765286529652A652C652D65306531653265336537653A +653C653D6540654165426543654465466547654A654B654D654E655065526553 +655465576558655A655C655F6560656165646565656765686569656A656D656E +656F657165736575657665786579657A657B657C657D657E657F658065816582 +658365846585658665886589658A658D658E658F65926594659565966598659A +659D659E65A065A265A365A665A865AA65AC65AE65B165B265B365B465B565B6 +65B765B865BA65BB65BE65BF65C065C265C765C865C965CA65CD65D065D165D3 +65D465D565D865D965DA65DB65DC65DD65DE65DF65E165E365E465EA65EB0000 +95 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +65F265F365F465F565F865F965FB65FC65FD65FE65FF66016604660566076608 +6609660B660D661066116612661666176618661A661B661C661E662166226623 +662466266629662A662B662C662E663066326633663766386639663A663B663D +663F66406642664466456646664766486649664A664D664E6650665166580000 +6659665B665C665D665E666066626663666566676669666A666B666C666D6671 +66726673667566786679667B667C667D667F6680668166836685668666886689 +668A668B668D668E668F6690669266936694669566986699669A669B669C669E +669F66A066A166A266A366A466A566A666A966AA66AB66AC66AD66AF66B066B1 +66B266B366B566B666B766B866BA66BB66BC66BD66BF66C066C166C266C366C4 +66C566C666C766C866C966CA66CB66CC66CD66CE66CF66D066D166D266D366D4 +66D566D666D766D866DA66DE66DF66E066E166E266E366E466E566E766E866EA +66EB66EC66ED66EE66EF66F166F566F666F866FA66FB66FD6701670267030000 +96 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +6704670567066707670C670E670F671167126713671667186719671A671C671E +67206721672267236724672567276729672E6730673267336736673767386739 +673B673C673E673F6741674467456747674A674B674D67526754675567576758 +6759675A675B675D67626763676467666767676B676C676E6771677467760000 +67786779677A677B677D678067826783678567866788678A678C678D678E678F +679167926793679467966799679B679F67A067A167A467A667A967AC67AE67B1 +67B267B467B967BA67BB67BC67BD67BE67BF67C067C267C567C667C767C867C9 +67CA67CB67CC67CD67CE67D567D667D767DB67DF67E167E367E467E667E767E8 +67EA67EB67ED67EE67F267F567F667F767F867F967FA67FB67FC67FE68016802 +680368046806680D681068126814681568186819681A681B681C681E681F6820 +6822682368246825682668276828682B682C682D682E682F6830683168346835 +6836683A683B683F6847684B684D684F68526856685768586859685A685B0000 +97 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +685C685D685E685F686A686C686D686E686F6870687168726873687568786879 +687A687B687C687D687E687F688068826884688768886889688A688B688C688D +688E68906891689268946895689668986899689A689B689C689D689E689F68A0 +68A168A368A468A568A968AA68AB68AC68AE68B168B268B468B668B768B80000 +68B968BA68BB68BC68BD68BE68BF68C168C368C468C568C668C768C868CA68CC +68CE68CF68D068D168D368D468D668D768D968DB68DC68DD68DE68DF68E168E2 +68E468E568E668E768E868E968EA68EB68EC68ED68EF68F268F368F468F668F7 +68F868FB68FD68FE68FF69006902690369046906690769086909690A690C690F +69116913691469156916691769186919691A691B691C691D691E692169226923 +69256926692769286929692A692B692C692E692F693169326933693569366937 +6938693A693B693C693E694069416943694469456946694769486949694A694B +694C694D694E694F69506951695269536955695669586959695B695C695F0000 +98 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +6961696269646965696769686969696A696C696D696F69706972697369746975 +6976697A697B697D697E697F698169836985698A698B698C698E698F69906991 +69926993699669976999699A699D699E699F69A069A169A269A369A469A569A6 +69A969AA69AC69AE69AF69B069B269B369B569B669B869B969BA69BC69BD0000 +69BE69BF69C069C269C369C469C569C669C769C869C969CB69CD69CF69D169D2 +69D369D569D669D769D869D969DA69DC69DD69DE69E169E269E369E469E569E6 +69E769E869E969EA69EB69EC69EE69EF69F069F169F369F469F569F669F769F8 +69F969FA69FB69FC69FE6A006A016A026A036A046A056A066A076A086A096A0B +6A0C6A0D6A0E6A0F6A106A116A126A136A146A156A166A196A1A6A1B6A1C6A1D +6A1E6A206A226A236A246A256A266A276A296A2B6A2C6A2D6A2E6A306A326A33 +6A346A366A376A386A396A3A6A3B6A3C6A3F6A406A416A426A436A456A466A48 +6A496A4A6A4B6A4C6A4D6A4E6A4F6A516A526A536A546A556A566A576A5A0000 +99 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +6A5C6A5D6A5E6A5F6A606A626A636A646A666A676A686A696A6A6A6B6A6C6A6D +6A6E6A6F6A706A726A736A746A756A766A776A786A7A6A7B6A7D6A7E6A7F6A81 +6A826A836A856A866A876A886A896A8A6A8B6A8C6A8D6A8F6A926A936A946A95 +6A966A986A996A9A6A9B6A9C6A9D6A9E6A9F6AA16AA26AA36AA46AA56AA60000 +6AA76AA86AAA6AAD6AAE6AAF6AB06AB16AB26AB36AB46AB56AB66AB76AB86AB9 +6ABA6ABB6ABC6ABD6ABE6ABF6AC06AC16AC26AC36AC46AC56AC66AC76AC86AC9 +6ACA6ACB6ACC6ACD6ACE6ACF6AD06AD16AD26AD36AD46AD56AD66AD76AD86AD9 +6ADA6ADB6ADC6ADD6ADE6ADF6AE06AE16AE26AE36AE46AE56AE66AE76AE86AE9 +6AEA6AEB6AEC6AED6AEE6AEF6AF06AF16AF26AF36AF46AF56AF66AF76AF86AF9 +6AFA6AFB6AFC6AFD6AFE6AFF6B006B016B026B036B046B056B066B076B086B09 +6B0A6B0B6B0C6B0D6B0E6B0F6B106B116B126B136B146B156B166B176B186B19 +6B1A6B1B6B1C6B1D6B1E6B1F6B256B266B286B296B2A6B2B6B2C6B2D6B2E0000 +9A +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +6B2F6B306B316B336B346B356B366B386B3B6B3C6B3D6B3F6B406B416B426B44 +6B456B486B4A6B4B6B4D6B4E6B4F6B506B516B526B536B546B556B566B576B58 +6B5A6B5B6B5C6B5D6B5E6B5F6B606B616B686B696B6B6B6C6B6D6B6E6B6F6B70 +6B716B726B736B746B756B766B776B786B7A6B7D6B7E6B7F6B806B856B880000 +6B8C6B8E6B8F6B906B916B946B956B976B986B996B9C6B9D6B9E6B9F6BA06BA2 +6BA36BA46BA56BA66BA76BA86BA96BAB6BAC6BAD6BAE6BAF6BB06BB16BB26BB6 +6BB86BB96BBA6BBB6BBC6BBD6BBE6BC06BC36BC46BC66BC76BC86BC96BCA6BCC +6BCE6BD06BD16BD86BDA6BDC6BDD6BDE6BDF6BE06BE26BE36BE46BE56BE66BE7 +6BE86BE96BEC6BED6BEE6BF06BF16BF26BF46BF66BF76BF86BFA6BFB6BFC6BFE +6BFF6C006C016C026C036C046C086C096C0A6C0B6C0C6C0E6C126C176C1C6C1D +6C1E6C206C236C256C2B6C2C6C2D6C316C336C366C376C396C3A6C3B6C3C6C3E +6C3F6C436C446C456C486C4B6C4C6C4D6C4E6C4F6C516C526C536C566C580000 +9B +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +6C596C5A6C626C636C656C666C676C6B6C6C6C6D6C6E6C6F6C716C736C756C77 +6C786C7A6C7B6C7C6C7F6C806C846C876C8A6C8B6C8D6C8E6C916C926C956C96 +6C976C986C9A6C9C6C9D6C9E6CA06CA26CA86CAC6CAF6CB06CB46CB56CB66CB7 +6CBA6CC06CC16CC26CC36CC66CC76CC86CCB6CCD6CCE6CCF6CD16CD26CD80000 +6CD96CDA6CDC6CDD6CDF6CE46CE66CE76CE96CEC6CED6CF26CF46CF96CFF6D00 +6D026D036D056D066D086D096D0A6D0D6D0F6D106D116D136D146D156D166D18 +6D1C6D1D6D1F6D206D216D226D236D246D266D286D296D2C6D2D6D2F6D306D34 +6D366D376D386D3A6D3F6D406D426D446D496D4C6D506D556D566D576D586D5B +6D5D6D5F6D616D626D646D656D676D686D6B6D6C6D6D6D706D716D726D736D75 +6D766D796D7A6D7B6D7D6D7E6D7F6D806D816D836D846D866D876D8A6D8B6D8D +6D8F6D906D926D966D976D986D996D9A6D9C6DA26DA56DAC6DAD6DB06DB16DB3 +6DB46DB66DB76DB96DBA6DBB6DBC6DBD6DBE6DC16DC26DC36DC86DC96DCA0000 +9C +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +6DCD6DCE6DCF6DD06DD26DD36DD46DD56DD76DDA6DDB6DDC6DDF6DE26DE36DE5 +6DE76DE86DE96DEA6DED6DEF6DF06DF26DF46DF56DF66DF86DFA6DFD6DFE6DFF +6E006E016E026E036E046E066E076E086E096E0B6E0F6E126E136E156E186E19 +6E1B6E1C6E1E6E1F6E226E266E276E286E2A6E2C6E2E6E306E316E336E350000 +6E366E376E396E3B6E3C6E3D6E3E6E3F6E406E416E426E456E466E476E486E49 +6E4A6E4B6E4C6E4F6E506E516E526E556E576E596E5A6E5C6E5D6E5E6E606E61 +6E626E636E646E656E666E676E686E696E6A6E6C6E6D6E6F6E706E716E726E73 +6E746E756E766E776E786E796E7A6E7B6E7C6E7D6E806E816E826E846E876E88 +6E8A6E8B6E8C6E8D6E8E6E916E926E936E946E956E966E976E996E9A6E9B6E9D +6E9E6EA06EA16EA36EA46EA66EA86EA96EAB6EAC6EAD6EAE6EB06EB36EB56EB8 +6EB96EBC6EBE6EBF6EC06EC36EC46EC56EC66EC86EC96ECA6ECC6ECD6ECE6ED0 +6ED26ED66ED86ED96EDB6EDC6EDD6EE36EE76EEA6EEB6EEC6EED6EEE6EEF0000 +9D +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +6EF06EF16EF26EF36EF56EF66EF76EF86EFA6EFB6EFC6EFD6EFE6EFF6F006F01 +6F036F046F056F076F086F0A6F0B6F0C6F0D6F0E6F106F116F126F166F176F18 +6F196F1A6F1B6F1C6F1D6F1E6F1F6F216F226F236F256F266F276F286F2C6F2E +6F306F326F346F356F376F386F396F3A6F3B6F3C6F3D6F3F6F406F416F420000 +6F436F446F456F486F496F4A6F4C6F4E6F4F6F506F516F526F536F546F556F56 +6F576F596F5A6F5B6F5D6F5F6F606F616F636F646F656F676F686F696F6A6F6B +6F6C6F6F6F706F716F736F756F766F776F796F7B6F7D6F7E6F7F6F806F816F82 +6F836F856F866F876F8A6F8B6F8F6F906F916F926F936F946F956F966F976F98 +6F996F9A6F9B6F9D6F9E6F9F6FA06FA26FA36FA46FA56FA66FA86FA96FAA6FAB +6FAC6FAD6FAE6FAF6FB06FB16FB26FB46FB56FB76FB86FBA6FBB6FBC6FBD6FBE +6FBF6FC16FC36FC46FC56FC66FC76FC86FCA6FCB6FCC6FCD6FCE6FCF6FD06FD3 +6FD46FD56FD66FD76FD86FD96FDA6FDB6FDC6FDD6FDF6FE26FE36FE46FE50000 +9E +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +6FE66FE76FE86FE96FEA6FEB6FEC6FED6FF06FF16FF26FF36FF46FF56FF66FF7 +6FF86FF96FFA6FFB6FFC6FFD6FFE6FFF70007001700270037004700570067007 +70087009700A700B700C700D700E700F70107012701370147015701670177018 +7019701C701D701E701F702070217022702470257026702770287029702A0000 +702B702C702D702E702F70307031703270337034703670377038703A703B703C +703D703E703F7040704170427043704470457046704770487049704A704B704D +704E7050705170527053705470557056705770587059705A705B705C705D705F +7060706170627063706470657066706770687069706A706E7071707270737074 +70777079707A707B707D7081708270837084708670877088708B708C708D708F +70907091709370977098709A709B709E709F70A070A170A270A370A470A570A6 +70A770A870A970AA70B070B270B470B570B670BA70BE70BF70C470C570C670C7 +70C970CB70CC70CD70CE70CF70D070D170D270D370D470D570D670D770DA0000 +9F +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +70DC70DD70DE70E070E170E270E370E570EA70EE70F070F170F270F370F470F5 +70F670F870FA70FB70FC70FE70FF710071017102710371047105710671077108 +710B710C710D710E710F7111711271147117711B711C711D711E711F71207121 +7122712371247125712771287129712A712B712C712D712E7132713371340000 +7135713771387139713A713B713C713D713E713F714071417142714371447146 +714771487149714B714D714F7150715171527153715471557156715771587159 +715A715B715D715F716071617162716371657169716A716B716C716D716F7170 +717171747175717671777179717B717C717E717F718071817182718371857186 +718771887189718B718C718D718E7190719171927193719571967197719A719B +719C719D719E71A171A271A371A471A571A671A771A971AA71AB71AD71AE71AF +71B071B171B271B471B671B771B871BA71BB71BC71BD71BE71BF71C071C171C2 +71C471C571C671C771C871C971CA71CB71CC71CD71CF71D071D171D271D30000 +A0 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +71D671D771D871D971DA71DB71DC71DD71DE71DF71E171E271E371E471E671E8 +71E971EA71EB71EC71ED71EF71F071F171F271F371F471F571F671F771F871FA +71FB71FC71FD71FE71FF720072017202720372047205720772087209720A720B +720C720D720E720F7210721172127213721472157216721772187219721A0000 +721B721C721E721F722072217222722372247225722672277229722B722D722E +722F723272337234723A723C723E72407241724272437244724572467249724A +724B724E724F7250725172537254725572577258725A725C725E726072637264 +72657268726A726B726C726D7270727172737274727672777278727B727C727D +7282728372857286728772887289728C728E7290729172937294729572967297 +72987299729A729B729C729D729E72A072A172A272A372A472A572A672A772A8 +72A972AA72AB72AE72B172B272B372B572BA72BB72BC72BD72BE72BF72C072C5 +72C672C772C972CA72CB72CC72CF72D172D372D472D572D672D872DA72DB0000 +A1 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000030003001300200B702C902C700A8300330052014FF5E2016202620182019 +201C201D3014301530083009300A300B300C300D300E300F3016301730103011 +00B100D700F72236222722282211220F222A222922082237221A22A522252220 +23122299222B222E2261224C2248223D221D2260226E226F22642265221E2235 +22342642264000B0203220332103FF0400A4FFE0FFE1203000A7211626062605 +25CB25CF25CE25C725C625A125A025B325B2203B219221902191219330130000 +A2 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000217021712172217321742175217621772178217900000000000000000000 +000024882489248A248B248C248D248E248F2490249124922493249424952496 +249724982499249A249B247424752476247724782479247A247B247C247D247E +247F248024812482248324842485248624872460246124622463246424652466 +2467246824690000000032203221322232233224322532263227322832290000 +00002160216121622163216421652166216721682169216A216B000000000000 +A3 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000FF01FF02FF03FFE5FF05FF06FF07FF08FF09FF0AFF0BFF0CFF0DFF0EFF0F +FF10FF11FF12FF13FF14FF15FF16FF17FF18FF19FF1AFF1BFF1CFF1DFF1EFF1F +FF20FF21FF22FF23FF24FF25FF26FF27FF28FF29FF2AFF2BFF2CFF2DFF2EFF2F +FF30FF31FF32FF33FF34FF35FF36FF37FF38FF39FF3AFF3BFF3CFF3DFF3EFF3F +FF40FF41FF42FF43FF44FF45FF46FF47FF48FF49FF4AFF4BFF4CFF4DFF4EFF4F +FF50FF51FF52FF53FF54FF55FF56FF57FF58FF59FF5AFF5BFF5CFF5DFFE30000 +A4 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000304130423043304430453046304730483049304A304B304C304D304E304F +3050305130523053305430553056305730583059305A305B305C305D305E305F +3060306130623063306430653066306730683069306A306B306C306D306E306F +3070307130723073307430753076307730783079307A307B307C307D307E307F +3080308130823083308430853086308730883089308A308B308C308D308E308F +3090309130923093000000000000000000000000000000000000000000000000 +A5 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000030A130A230A330A430A530A630A730A830A930AA30AB30AC30AD30AE30AF +30B030B130B230B330B430B530B630B730B830B930BA30BB30BC30BD30BE30BF +30C030C130C230C330C430C530C630C730C830C930CA30CB30CC30CD30CE30CF +30D030D130D230D330D430D530D630D730D830D930DA30DB30DC30DD30DE30DF +30E030E130E230E330E430E530E630E730E830E930EA30EB30EC30ED30EE30EF +30F030F130F230F330F430F530F6000000000000000000000000000000000000 +A6 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000039103920393039403950396039703980399039A039B039C039D039E039F +03A003A103A303A403A503A603A703A803A90000000000000000000000000000 +000003B103B203B303B403B503B603B703B803B903BA03BB03BC03BD03BE03BF +03C003C103C303C403C503C603C703C803C90000000000000000000000000000 +FE35FE36FE39FE3AFE3FFE40FE3DFE3EFE41FE42FE43FE4400000000FE3BFE3C +FE37FE38FE310000FE33FE340000000000000000000000000000000000000000 +A7 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000004100411041204130414041504010416041704180419041A041B041C041D +041E041F0420042104220423042404250426042704280429042A042B042C042D +042E042F00000000000000000000000000000000000000000000000000000000 +000004300431043204330434043504510436043704380439043A043B043C043D +043E043F0440044104420443044404450446044704480449044A044B044C044D +044E044F00000000000000000000000000000000000000000000000000000000 +A8 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +02CA02CB02D920132015202520352105210921962197219821992215221F2223 +22522266226722BF2550255125522553255425552556255725582559255A255B +255C255D255E255F2560256125622563256425652566256725682569256A256B +256C256D256E256F257025712572257325812582258325842585258625870000 +25882589258A258B258C258D258E258F25932594259525BC25BD25E225E325E4 +25E5260922953012301D301E0000000000000000000000000000000000000000 +0000010100E101CE00E0011300E9011B00E8012B00ED01D000EC014D00F301D2 +00F2016B00FA01D400F901D601D801DA01DC00FC00EA02510000014401480000 +0261000000000000000031053106310731083109310A310B310C310D310E310F +3110311131123113311431153116311731183119311A311B311C311D311E311F +3120312131223123312431253126312731283129000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +A9 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +30213022302330243025302630273028302932A3338E338F339C339D339E33A1 +33C433CE33D133D233D5FE30FFE2FFE400002121323100002010000000000000 +30FC309B309C30FD30FE3006309D309EFE49FE4AFE4BFE4CFE4DFE4EFE4FFE50 +FE51FE52FE54FE55FE56FE57FE59FE5AFE5BFE5CFE5DFE5EFE5FFE60FE610000 +FE62FE63FE64FE65FE66FE68FE69FE6AFE6B0000000000000000000000000000 +0000000000000000000000003007000000000000000000000000000000000000 +00000000000000002500250125022503250425052506250725082509250A250B +250C250D250E250F2510251125122513251425152516251725182519251A251B +251C251D251E251F2520252125222523252425252526252725282529252A252B +252C252D252E252F2530253125322533253425352536253725382539253A253B +253C253D253E253F2540254125422543254425452546254725482549254A254B +0000000000000000000000000000000000000000000000000000000000000000 +AA +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +72DC72DD72DF72E272E372E472E572E672E772EA72EB72F572F672F972FD72FE +72FF73007302730473057306730773087309730B730C730D730F731073117312 +731473187319731A731F732073237324732673277328732D732F733073327333 +73357336733A733B733C733D7340734173427343734473457346734773480000 +7349734A734B734C734E734F7351735373547355735673587359735A735B735C +735D735E735F736173627363736473657366736773687369736A736B736E7370 +7371000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +AB +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +73727373737473757376737773787379737A737B737C737D737F738073817382 +7383738573867388738A738C738D738F73907392739373947395739773987399 +739A739C739D739E73A073A173A373A473A573A673A773A873AA73AC73AD73B1 +73B473B573B673B873B973BC73BD73BE73BF73C173C373C473C573C673C70000 +73CB73CC73CE73D273D373D473D573D673D773D873DA73DB73DC73DD73DF73E1 +73E273E373E473E673E873EA73EB73EC73EE73EF73F073F173F373F473F573F6 +73F7000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +AC +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +73F873F973FA73FB73FC73FD73FE73FF740074017402740474077408740B740C +740D740E741174127413741474157416741774187419741C741D741E741F7420 +74217423742474277429742B742D742F74317432743774387439743A743B743D +743E743F744074427443744474457446744774487449744A744B744C744D0000 +744E744F7450745174527453745474567458745D746074617462746374647465 +7466746774687469746A746B746C746E746F7471747274737474747574787479 +747A000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +AD +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +747B747C747D747F748274847485748674887489748A748C748D748F74917492 +7493749474957496749774987499749A749B749D749F74A074A174A274A374A4 +74A574A674AA74AB74AC74AD74AE74AF74B074B174B274B374B474B574B674B7 +74B874B974BB74BC74BD74BE74BF74C074C174C274C374C474C574C674C70000 +74C874C974CA74CB74CC74CD74CE74CF74D074D174D374D474D574D674D774D8 +74D974DA74DB74DD74DF74E174E574E774E874E974EA74EB74EC74ED74F074F1 +74F2000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +AE +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +74F374F574F874F974FA74FB74FC74FD74FE7500750175027503750575067507 +75087509750A750B750C750E751075127514751575167517751B751D751E7520 +752175227523752475267527752A752E753475367539753C753D753F75417542 +75437544754675477549754A754D755075517552755375557556755775580000 +755D755E755F75607561756275637564756775687569756B756C756D756E756F +757075717573757575767577757A757B757C757D757E75807581758275847585 +7587000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +AF +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +75887589758A758C758D758E7590759375957598759B759C759E75A275A675A7 +75A875A975AA75AD75B675B775BA75BB75BF75C075C175C675CB75CC75CE75CF +75D075D175D375D775D975DA75DC75DD75DF75E075E175E575E975EC75ED75EE +75EF75F275F375F575F675F775F875FA75FB75FD75FE76027604760676070000 +76087609760B760D760E760F76117612761376147616761A761C761D761E7621 +762376277628762C762E762F76317632763676377639763A763B763D76417642 +7644000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +B0 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +76457646764776487649764A764B764E764F7650765176527653765576577658 +7659765A765B765D765F766076617662766476657666766776687669766A766C +766D766E767076717672767376747675767676777679767A767C767F76807681 +768376857689768A768C768D768F769076927694769576977698769A769B0000 +769C769D769E769F76A076A176A276A376A576A676A776A876A976AA76AB76AC +76AD76AF76B076B376B576B676B776B876B976BA76BB76BC76BD76BE76C076C1 +76C3554A963F57C3632854CE550954C07691764C853C77EE827E788D72319698 +978D6C285B894FFA630966975CB880FA684880AE660276CE51F9655671AC7FF1 +888450B2596561CA6FB382AD634C625253ED54277B06516B75A45DF462D48DCB +9776628A8019575D97387F627238767D67CF767E64464F708D2562DC7A176591 +73ED642C6273822C9881677F7248626E62CC4F3474E3534A529E7ECA90A65E2E +6886699C81807ED168D278C5868C9551508D8C2482DE80DE5305891252650000 +B1 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +76C476C776C976CB76CC76D376D576D976DA76DC76DD76DE76E076E176E276E3 +76E476E676E776E876E976EA76EB76EC76ED76F076F376F576F676F776FA76FB +76FD76FF77007702770377057706770A770C770E770F77107711771277137714 +7715771677177718771B771C771D771E77217723772477257727772A772B0000 +772C772E773077317732773377347739773B773D773E773F7742774477457746 +77487749774A774B774C774D774E774F77527753775477557756775777587759 +775C858496F94FDD582199715B9D62B162A566B48C799C8D7206676F789160B2 +535153178F8880CC8D1D94A1500D72C8590760EB711988AB595482EF672C7B28 +5D297EF7752D6CF58E668FF8903C9F3B6BD491197B145F7C78A784D6853D6BD5 +6BD96BD65E015E8775F995ED655D5F0A5FC58F9F58C181C2907F965B97AD8FB9 +7F168D2C62414FBF53D8535E8FA88FA98FAB904D68075F6A819888689CD6618B +522B762A5F6C658C6FD26EE85BBE6448517551B067C44E1979C9997C70B30000 +B2 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +775D775E775F7760776477677769776A776D776E776F77707771777277737774 +7775777677777778777A777B777C7781778277837786778777887789778A778B +778F77907793779477957796779777987799779A779B779C779D779E77A177A3 +77A477A677A877AB77AD77AE77AF77B177B277B477B677B777B877B977BA0000 +77BC77BE77C077C177C277C377C477C577C677C777C877C977CA77CB77CC77CE +77CF77D077D177D277D377D477D577D677D877D977DA77DD77DE77DF77E077E1 +77E475C55E7673BB83E064AD62E894B56CE2535A52C3640F94C27B944F2F5E1B +82368116818A6E246CCA9A736355535C54FA886557E04E0D5E036B657C3F90E8 +601664E6731C88C16750624D8D22776C8E2991C75F6983DC8521991053C28695 +6B8B60ED60E8707F82CD82314ED36CA785CF64CD7CD969FD66F9834953957B56 +4FA7518C6D4B5C428E6D63D253C9832C833667E578B4643D5BDF5C945DEE8BE7 +62C667F48C7A640063BA8749998B8C177F2094F24EA7961098A4660C73160000 +B3 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +77E677E877EA77EF77F077F177F277F477F577F777F977FA77FB77FC78037804 +7805780678077808780A780B780E780F7810781378157819781B781E78207821 +782278247828782A782B782E782F78317832783378357836783D783F78417842 +78437844784678487849784A784B784D784F78517853785478587859785A0000 +785B785C785E785F7860786178627863786478657866786778687869786F7870 +78717872787378747875787678787879787A787B787D787E787F788078817882 +7883573A5C1D5E38957F507F80A05382655E7545553150218D856284949E671D +56326F6E5DE2543570928F66626F64A463A35F7B6F8890F481E38FB05C186668 +5FF16C8996488D81886C649179F057CE6A59621054484E587A0B60E96F848BDA +627F901E9A8B79E4540375F4630153196C608FDF5F1B9A70803B9F7F4F885C3A +8D647FC565A570BD514551B2866B5D075BA062BD916C75748E0C7A2061017B79 +4EC77EF877854E1181ED521D51FA6A7153A88E87950496CF6EC19664695A0000 +B4 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +7884788578867888788A788B788F789078927894789578967899789D789E78A0 +78A278A478A678A878A978AA78AB78AC78AD78AE78AF78B578B678B778B878BA +78BB78BC78BD78BF78C078C278C378C478C678C778C878CC78CD78CE78CF78D1 +78D278D378D678D778D878DA78DB78DC78DD78DE78DF78E078E178E278E30000 +78E478E578E678E778E978EA78EB78ED78EE78EF78F078F178F378F578F678F8 +78F978FB78FC78FD78FE78FF79007902790379047906790779087909790A790B +790C784050A877D7641089E6590463E35DDD7A7F693D4F20823955984E3275AE +7A975E625E8A95EF521B5439708A6376952457826625693F918755076DF37EAF +882262337EF075B5832878C196CC8F9E614874F78BCD6B64523A8D506B21806A +847156F153064ECE4E1B51D17C97918B7C074FC38E7F7BE17A9C64675D1450AC +810676017CB96DEC7FE067515B585BF878CB64AE641363AA632B9519642D8FBE +7B5476296253592754466B7950A362345E266B864EE38D37888B5F85902E0000 +B5 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +790D790E790F791079117912791479157916791779187919791A791B791C791D +791F792079217922792379257926792779287929792A792B792C792D792E792F +793079317932793379357936793779387939793D793F79427943794479457947 +794A794B794C794D794E794F7950795179527954795579587959796179630000 +796479667969796A796B796C796E79707971797279737974797579767979797B +797C797D797E797F798279837986798779887989798B798C798D798E79907991 +79926020803D62C54E39535590F863B880C665E66C2E4F4660EE6DE18BDE5F39 +86CB5F536321515A83616863520063638E4850125C9B79775BFC52307A3B60BC +905376D75FB75F9776848E6C706F767B7B4977AA51F3909358244F4E6EF48FEA +654C7B1B72C46DA47FDF5AE162B55E95573084827B2C5E1D5F1F90127F1498A0 +63826EC7789870B95178975B57AB75354F4375385E9760E659606DC06BBF7889 +53FC96D551CB52016389540A94938C038DCC7239789F87768FED8C0D53E00000 +B6 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +7993799479957996799779987999799B799C799D799E799F79A079A179A279A3 +79A479A579A679A879A979AA79AB79AC79AD79AE79AF79B079B179B279B479B5 +79B679B779B879BC79BF79C279C479C579C779C879CA79CC79CE79CF79D079D3 +79D479D679D779D979DA79DB79DC79DD79DE79E079E179E279E579E879EA0000 +79EC79EE79F179F279F379F479F579F679F779F979FA79FC79FE79FF7A017A04 +7A057A077A087A097A0A7A0C7A0F7A107A117A127A137A157A167A187A197A1B +7A1C4E0176EF53EE948998769F0E952D5B9A8BA24E224E1C51AC846361C252A8 +680B4F97606B51BB6D1E515C6296659796618C46901775D890FD77636BD2728A +72EC8BFB583577798D4C675C9540809A5EA66E2159927AEF77ED953B6BB565AD +7F0E58065151961F5BF958A954288E726566987F56E4949D76FE9041638754C6 +591A593A579B8EB267358DFA8235524160F0581586FE5CE89E454FC4989D8BB9 +5A2560765384627C904F9102997F6069800C513F80335C1499756D314E8C0000 +B7 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +7A1D7A1F7A217A227A247A257A267A277A287A297A2A7A2B7A2C7A2D7A2E7A2F +7A307A317A327A347A357A367A387A3A7A3E7A407A417A427A437A447A457A47 +7A487A497A4A7A4B7A4C7A4D7A4E7A4F7A507A527A537A547A557A567A587A59 +7A5A7A5B7A5C7A5D7A5E7A5F7A607A617A627A637A647A657A667A677A680000 +7A697A6A7A6B7A6C7A6D7A6E7A6F7A717A727A737A757A7B7A7C7A7D7A7E7A82 +7A857A877A897A8A7A8B7A8C7A8E7A8F7A907A937A947A997A9A7A9B7A9E7AA1 +7AA28D3053D17F5A7B4F4F104E4F96006CD573D085E95E06756A7FFB6A0A77FE +94927E4151E170E653CD8FD483038D2972AF996D6CDB574A82B365B980AA623F +963259A84EFF8BBF7EBA653E83F2975E556198DE80A5532A8BFD542080BA5E9F +6CB88D3982AC915A54296C1B52067EB7575F711A6C7E7C89594B4EFD5FFF6124 +7CAA4E305C0167AB87025CF0950B98CE75AF70FD902251AF7F1D8BBD594951E4 +4F5B5426592B657780A45B75627662C28F905E456C1F7B264F0F4FD8670D0000 +B8 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +7AA37AA47AA77AA97AAA7AAB7AAE7AAF7AB07AB17AB27AB47AB57AB67AB77AB8 +7AB97ABA7ABB7ABC7ABD7ABE7AC07AC17AC27AC37AC47AC57AC67AC77AC87AC9 +7ACA7ACC7ACD7ACE7ACF7AD07AD17AD27AD37AD47AD57AD77AD87ADA7ADB7ADC +7ADD7AE17AE27AE47AE77AE87AE97AEA7AEB7AEC7AEE7AF07AF17AF27AF30000 +7AF47AF57AF67AF77AF87AFB7AFC7AFE7B007B017B027B057B077B097B0C7B0D +7B0E7B107B127B137B167B177B187B1A7B1C7B1D7B1F7B217B227B237B277B29 +7B2D6D6E6DAA798F88B15F17752B629A8F854FEF91DC65A7812F81515E9C8150 +8D74526F89868D4B590D50854ED8961C723681798D1F5BCC8BA3964459877F1A +54905676560E8BE565396982949976D66E895E727518674667D17AFF809D8D76 +611F79C665628D635188521A94A27F38809B7EB25C976E2F67607BD9768B9AD8 +818F7F947CD5641E95507A3F544A54E56B4C640162089E3D80F3759952729769 +845B683C86E49601969494EC4E2A54047ED968398DDF801566F45E9A7FB90000 +B9 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +7B2F7B307B327B347B357B367B377B397B3B7B3D7B3F7B407B417B427B437B44 +7B467B487B4A7B4D7B4E7B537B557B577B597B5C7B5E7B5F7B617B637B647B65 +7B667B677B687B697B6A7B6B7B6C7B6D7B6F7B707B737B747B767B787B7A7B7C +7B7D7B7F7B817B827B837B847B867B877B887B897B8A7B8B7B8C7B8E7B8F0000 +7B917B927B937B967B987B997B9A7B9B7B9E7B9F7BA07BA37BA47BA57BAE7BAF +7BB07BB27BB37BB57BB67BB77BB97BBA7BBB7BBC7BBD7BBE7BBF7BC07BC27BC3 +7BC457C2803F68975DE5653B529F606D9F9A4F9B8EAC516C5BAB5F135DE96C5E +62F18D21517194A952FE6C9F82DF72D757A267848D2D591F8F9C83C754957B8D +4F306CBD5B6459D19F1353E486CA9AA88C3780A16545987E56FA96C7522E74DC +52505BE1630289024E5662D0602A68FA51735B9851A089C27BA199867F5060EF +704C8D2F51495E7F901B747089C4572D78455F529F9F95FA8F689B3C8BE17678 +684267DC8DEA8D35523D8F8A6EDA68CD950590ED56FD679C88F98FC754C80000 +BA +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +7BC57BC87BC97BCA7BCB7BCD7BCE7BCF7BD07BD27BD47BD57BD67BD77BD87BDB +7BDC7BDE7BDF7BE07BE27BE37BE47BE77BE87BE97BEB7BEC7BED7BEF7BF07BF2 +7BF37BF47BF57BF67BF87BF97BFA7BFB7BFD7BFF7C007C017C027C037C047C05 +7C067C087C097C0A7C0D7C0E7C107C117C127C137C147C157C177C187C190000 +7C1A7C1B7C1C7C1D7C1E7C207C217C227C237C247C257C287C297C2B7C2C7C2D +7C2E7C2F7C307C317C327C337C347C357C367C377C397C3A7C3B7C3C7C3D7C3E +7C429AB85B696D776C264EA55BB39A87916361A890AF97E9542B6DB55BD251FD +558A7F557FF064BC634D65F161BE608D710A6C576C49592F676D822A58D5568E +8C6A6BEB90DD597D801753F76D695475559D837783CF683879BE548C4F555408 +76D28C8996026CB36DB88D6B89109E648D3A563F9ED175D55F8872E0606854FC +4EA86A2A886160528F7054C470D886799E3F6D2A5B8F5F187EA255894FAF7334 +543C539A5019540E547C4E4E5FFD745A58F6846B80E1877472D07CCA6E560000 +BB +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +7C437C447C457C467C477C487C497C4A7C4B7C4C7C4E7C4F7C507C517C527C53 +7C547C557C567C577C587C597C5A7C5B7C5C7C5D7C5E7C5F7C607C617C627C63 +7C647C657C667C677C687C697C6A7C6B7C6C7C6D7C6E7C6F7C707C717C727C75 +7C767C777C787C797C7A7C7E7C7F7C807C817C827C837C847C857C867C870000 +7C887C8A7C8B7C8C7C8D7C8E7C8F7C907C937C947C967C997C9A7C9B7CA07CA1 +7CA37CA67CA77CA87CA97CAB7CAC7CAD7CAF7CB07CB47CB57CB67CB77CB87CBA +7CBB5F27864E552C62A44E926CAA623782B154D7534E733E6ED1753B52125316 +8BDD69D05F8A60006DEE574F6B2273AF68538FD87F13636260A3552475EA8C62 +71156DA35BA65E7B8352614C9EC478FA87577C27768751F060F6714C66435E4C +604D8C0E707063258F895FBD606286D456DE6BC160946167534960E066668D3F +79FD4F1A70E96C478BB38BF27ED88364660F5A5A9B426D516DF78C416D3B4F19 +706B83B7621660D1970D8D27797851FB573E57FA673A75787A3D79EF7B950000 +BC +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +7CBF7CC07CC27CC37CC47CC67CC97CCB7CCE7CCF7CD07CD17CD27CD37CD47CD8 +7CDA7CDB7CDD7CDE7CE17CE27CE37CE47CE57CE67CE77CE97CEA7CEB7CEC7CED +7CEE7CF07CF17CF27CF37CF47CF57CF67CF77CF97CFA7CFC7CFD7CFE7CFF7D00 +7D017D027D037D047D057D067D077D087D097D0B7D0C7D0D7D0E7D0F7D100000 +7D117D127D137D147D157D167D177D187D197D1A7D1B7D1C7D1D7D1E7D1F7D21 +7D237D247D257D267D287D297D2A7D2C7D2D7D2E7D307D317D327D337D347D35 +7D36808C99658FF96FC08BA59E2159EC7EE97F095409678168D88F917C4D96C6 +53CA602575BE6C7253735AC97EA7632451E0810A5DF184DF628051805B634F0E +796D524260B86D4E5BC45BC28BA18BB065E25FCC964559937EE77EAA560967B7 +59394F735BB652A0835A988A8D3E753294BE50477A3C4EF767B69A7E5AC16B7C +76D1575A5C167B3A95F4714E517C80A9827059787F04832768C067EC78B17877 +62E363617B804FED526A51CF835069DB92748DF58D3189C1952E7BAD4EF60000 +BD +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +7D377D387D397D3A7D3B7D3C7D3D7D3E7D3F7D407D417D427D437D447D457D46 +7D477D487D497D4A7D4B7D4C7D4D7D4E7D4F7D507D517D527D537D547D557D56 +7D577D587D597D5A7D5B7D5C7D5D7D5E7D5F7D607D617D627D637D647D657D66 +7D677D687D697D6A7D6B7D6C7D6D7D6F7D707D717D727D737D747D757D760000 +7D787D797D7A7D7B7D7C7D7D7D7E7D7F7D807D817D827D837D847D857D867D87 +7D887D897D8A7D8B7D8C7D8D7D8E7D8F7D907D917D927D937D947D957D967D97 +7D98506582305251996F6E106E856DA75EFA50F559DC5C066D466C5F7586848B +686859568BB253209171964D854969127901712680F64EA490CA6D479A845A07 +56BC640594F077EB4FA5811A72E189D2997A7F347EDE527F655991758F7F8F83 +53EB7A9663ED63A5768679F888579636622A52AB8282685467706377776B7AED +6D017ED389E359D0621285C982A5754C501F4ECB75A58BEB5C4A5DFE7B4B65A4 +91D14ECA6D25895F7D2795264EC58C288FDB9773664B79818FD170EC6D780000 +BE +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +7D997D9A7D9B7D9C7D9D7D9E7D9F7DA07DA17DA27DA37DA47DA57DA77DA87DA9 +7DAA7DAB7DAC7DAD7DAF7DB07DB17DB27DB37DB47DB57DB67DB77DB87DB97DBA +7DBB7DBC7DBD7DBE7DBF7DC07DC17DC27DC37DC47DC57DC67DC77DC87DC97DCA +7DCB7DCC7DCD7DCE7DCF7DD07DD17DD27DD37DD47DD57DD67DD77DD87DD90000 +7DDA7DDB7DDC7DDD7DDE7DDF7DE07DE17DE27DE37DE47DE57DE67DE77DE87DE9 +7DEA7DEB7DEC7DED7DEE7DEF7DF07DF17DF27DF37DF47DF57DF67DF77DF87DF9 +7DFA5C3D52B283465162830E775B66769CB84EAC60CA7CBE7CB37ECF4E958B66 +666F988897595883656C955C5F8475C997567ADF7ADE51C070AF7A9863EA7A76 +7EA0739697ED4E4570784E5D915253A9655165E781FC8205548E5C31759A97A0 +62D872D975BD5C459A7983CA5C40548077E94E3E6CAE805A62D2636E5DE85177 +8DDD8E1E952F4FF153E560E770AC526763509E435A1F5026773753777EE26485 +652B628963985014723589C951B38BC07EDD574783CC94A7519B541B5CFB0000 +BF +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +7DFB7DFC7DFD7DFE7DFF7E007E017E027E037E047E057E067E077E087E097E0A +7E0B7E0C7E0D7E0E7E0F7E107E117E127E137E147E157E167E177E187E197E1A +7E1B7E1C7E1D7E1E7E1F7E207E217E227E237E247E257E267E277E287E297E2A +7E2B7E2C7E2D7E2E7E2F7E307E317E327E337E347E357E367E377E387E390000 +7E3A7E3C7E3D7E3E7E3F7E407E427E437E447E457E467E487E497E4A7E4B7E4C +7E4D7E4E7E4F7E507E517E527E537E547E557E567E577E587E597E5A7E5B7E5C +7E5D4FCA7AE36D5A90E19A8F55805496536154AF5F0063E9697751EF6168520A +582A52D8574E780D770B5EB761777CE0625B62974EA27095800362F770E49760 +577782DB67EF68F578D5989779D158F354B353EF6E34514B523B5BA28BFE80AF +554357A660735751542D7A7A60505B5463A762A053E362635BC767AF54ED7A9F +82E691775E9388E4593857AE630E8DE880EF57577B774FA95FEB5BBD6B3E5321 +7B5072C2684677FF773665F751B54E8F76D45CBF7AA58475594E9B4150800000 +C0 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +7E5E7E5F7E607E617E627E637E647E657E667E677E687E697E6A7E6B7E6C7E6D +7E6E7E6F7E707E717E727E737E747E757E767E777E787E797E7A7E7B7E7C7E7D +7E7E7E7F7E807E817E837E847E857E867E877E887E897E8A7E8B7E8C7E8D7E8E +7E8F7E907E917E927E937E947E957E967E977E987E997E9A7E9C7E9D7E9E0000 +7EAE7EB47EBB7EBC7ED67EE47EEC7EF97F0A7F107F1E7F377F397F3B7F3C7F3D +7F3E7F3F7F407F417F437F467F477F487F497F4A7F4B7F4C7F4D7F4E7F4F7F52 +7F53998861276E8357646606634656F062EC62695ED39614578362C955878721 +814A8FA3556683B167658D5684DD5A6A680F62E67BEE961151706F9C8C3063FD +89C861D27F0670C26EE57405699472FC5ECA90CE67176D6A635E52B372628001 +4F6C59E5916A70D96D9D52D24E5096F7956D857E78CA7D2F5121579264C2808B +7C7B6CEA68F1695E51B7539868A872819ECE7BF172F879BB6F137406674E91CC +9CA4793C83898354540F68174E3D538952B1783E5386522950884F8B4FD00000 +C1 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +7F567F597F5B7F5C7F5D7F5E7F607F637F647F657F667F677F6B7F6C7F6D7F6F +7F707F737F757F767F777F787F7A7F7B7F7C7F7D7F7F7F807F827F837F847F85 +7F867F877F887F897F8B7F8D7F8F7F907F917F927F937F957F967F977F987F99 +7F9B7F9C7FA07FA27FA37FA57FA67FA87FA97FAA7FAB7FAC7FAD7FAE7FB10000 +7FB37FB47FB57FB67FB77FBA7FBB7FBE7FC07FC27FC37FC47FC67FC77FC87FC9 +7FCB7FCD7FCF7FD07FD17FD27FD37FD67FD77FD97FDA7FDB7FDC7FDD7FDE7FE2 +7FE375E27ACB7C926CA596B6529B748354E94FE9805483B28FDE95705EC9601C +6D9F5E18655B813894FE604B70BC7EC37CAE51C968817CB1826F4E248F8691CF +667E4EAE8C0564A9804A50DA759771CE5BE58FBD6F664E86648295635ED66599 +521788C270C852A3730E7433679778F797164E3490BB9CDE6DCB51DB8D41541D +62CE73B283F196F69F8494C34F367F9A51CC707596755CAD988653E64EE46E9C +740969B4786B998F7559521876246D4167F3516D9F99804B54997B3C7ABF0000 +C2 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +7FE47FE77FE87FEA7FEB7FEC7FED7FEF7FF27FF47FF57FF67FF77FF87FF97FFA +7FFD7FFE7FFF8002800780088009800A800E800F80118013801A801B801D801E +801F802180238024802B802C802D802E802F8030803280348039803A803C803E +8040804180448045804780488049804E804F8050805180538055805680570000 +8059805B805C805D805E805F806080618062806380648065806680678068806B +806C806D806E806F807080728073807480758076807780788079807A807B807C +807D9686578462E29647697C5A0464027BD36F0F964B82A6536298855E907089 +63B35364864F9C819E93788C97328DEF8D429E7F6F5E79845F559646622E9A74 +541594DD4FA365C55C655C617F1586516C2F5F8B73876EE47EFF5CE6631B5B6A +6EE653754E7163A0756562A18F6E4F264ED16CA67EB68BBA841D87BA7F57903B +95237BA99AA188F8843D6D1B9A867EDC59889EBB739B780186829A6C9A82561B +541757CB4E709EA653568FC881097792999286EE6EE1851366FC61626F2B0000 +C3 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +807E8081808280858088808A808D808E808F8090809180928094809580978099 +809E80A380A680A780A880AC80B080B380B580B680B880B980BB80C580C780C8 +80C980CA80CB80CF80D080D180D280D380D480D580D880DF80E080E280E380E6 +80EE80F580F780F980FB80FE80FF8100810181038104810581078108810B0000 +810C811581178119811B811C811D811F81208121812281238124812581268127 +81288129812A812B812D812E813081338134813581378139813A813B813C813D +813F8C298292832B76F26C135FD983BD732B8305951A6BDB77DB94C6536F8302 +51925E3D8C8C8D384E4873AB679A68859176970971646CA177095A9295416BCF +7F8E66275BD059B95A9A95E895F74EEC840C84996AAC76DF9530731B68A65B5F +772F919A97617CDC8FF78C1C5F257C7379D889C56CCC871C5BC65E4268C97720 +7EF55195514D52C95A297F05976282D763CF778485D079D26E3A5E9959998511 +706D6C1162BF76BF654F60AF95FD660E879F9E2394ED540D547D8C2C64780000 +C4 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +81408141814281438144814581478149814D814E814F8152815681578158815B +815C815D815E815F816181628163816481668168816A816B816C816F81728173 +81758176817781788181818381848185818681878189818B818C818D818E8190 +8192819381948195819681978199819A819E819F81A081A181A281A481A50000 +81A781A981AB81AC81AD81AE81AF81B081B181B281B481B581B681B781B881B9 +81BC81BD81BE81BF81C481C581C781C881C981CB81CD81CE81CF81D081D181D2 +81D3647986116A21819C78E864699B5462B9672B83AB58A89ED86CAB6F205BDE +964C8C0B725F67D062C772614EA959C66BCD589366AE5E5552DF6155672876EE +776672677A4662FF54EA545094A090A35A1C7EB36C164E435976801059485357 +753796BE56CA63208111607C95F96DD65462998151855AE980FD59AE9713502A +6CE55C3C62DF4F60533F817B90066EBA852B62C85E7478BE64B5637B5FF55A18 +917F9E1F5C3F634F80425B7D556E954A954D6D8560A867E072DE51DD5B810000 +C5 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +81D481D581D681D781D881D981DA81DB81DC81DD81DE81DF81E081E181E281E4 +81E581E681E881E981EB81EE81EF81F081F181F281F581F681F781F881F981FA +81FD81FF8203820782088209820A820B820E820F821182138215821682178218 +8219821A821D822082248225822682278229822E8232823A823C823D823F0000 +8240824182428243824582468248824A824C824D824E82508251825282538254 +8255825682578259825B825C825D825E82608261826282638264826582668267 +826962E76CDE725B626D94AE7EBD81136D53519C5F04597452AA601259736696 +8650759F632A61E67CEF8BFA54E66B279E256BB485D5545550766CA4556A8DB4 +722C5E156015743662CD6392724C5F986E436D3E65006F5876D878D076FC7554 +522453DB4E535E9E65C1802A80D6629B5486522870AE888D8DD16CE1547880DA +57F988F48D54966A914D4F696C9B55B776C6783062A870F96F8E5F6D84EC68DA +787C7BF781A8670B9E4F636778B0576F78129739627962AB528874356BD70000 +C6 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +826A826B826C826D82718275827682778278827B827C82808281828382858286 +82878289828C82908293829482958296829A829B829E82A082A282A382A782B2 +82B582B682BA82BB82BC82BF82C082C282C382C582C682C982D082D682D982DA +82DD82E282E782E882E982EA82EC82ED82EE82F082F282F382F582F682F80000 +82FA82FC82FD82FE82FF8300830A830B830D831083128313831683188319831D +831E831F83208321832283238324832583268329832A832E833083328337833B +833D5564813E75B276AE533975DE50FB5C418B6C7BC7504F72479A9798D86F02 +74E27968648777A562FC98918D2B54C180584E52576A82F9840D5E7351ED74F6 +8BC45C4F57616CFC98875A4678349B448FEB7C955256625194FA4EC683868461 +83E984B257D467345703666E6D668C3166DD7011671F6B3A6816621A59BB4E03 +51C46F0667D26C8F517668CB59476B6775665D0E81109F5065D7794879419A91 +8D775C824E5E4F01542F5951780C56686C148FC45F036C7D6CE38BAB63900000 +C7 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +833E833F83418342834483458348834A834B834C834D834E8353835583568357 +83588359835D836283708371837283738374837583768379837A837E837F8380 +838183828383838483878388838A838B838C838D838F83908391839483958396 +83978399839A839D839F83A183A283A383A483A583A683A783AC83AD83AE0000 +83AF83B583BB83BE83BF83C283C383C483C683C883C983CB83CD83CE83D083D1 +83D283D383D583D783D983DA83DB83DE83E283E383E483E683E783E883EB83EC +83ED60706D3D72756266948E94C553438FC17B7E4EDF8C264E7E9ED494B194B3 +524D6F5C90636D458C3458115D4C6B206B4967AA545B81547F8C589985375F3A +62A26A47953965726084686577A74E544FA85DE7979864AC7FD85CED4FCF7A8D +520783044E14602F7A8394A64FB54EB279E6743452E482B964D279BD5BDD6C81 +97528F7B6C22503E537F6E0564CE66746C3060C598778BF75E86743C7A7779CB +4E1890B174036C4256DA914B6CC58D8B533A86C666F28EAF5C489A716E200000 +C8 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +83EE83EF83F383F483F583F683F783FA83FB83FC83FE83FF8400840284058407 +84088409840A84108412841384148415841684178419841A841B841E841F8420 +8421842284238429842A842B842C842D842E842F843084328433843484358436 +84378439843A843B843E843F8440844184428443844484458447844884490000 +844A844B844C844D844E844F8450845284538454845584568458845D845E845F +8460846284648465846684678468846A846E846F84708472847484778479847B +847C53D65A369F8B8DA353BB570898A76743919B6CC9516875CA62F372AC5238 +529D7F3A7094763853749E4A69B7786E96C088D97FA4713671C3518967D374E4 +58E4651856B78BA9997662707ED560F970ED58EC4EC14EBA5FCD97E74EFB8BA4 +5203598A7EAB62544ECD65E5620E833884C98363878D71946EB65BB97ED25197 +63C967D480898339881551125B7A59828FB14E736C5D516589258F6F962E854A +745E951095F06DA682E55F3164926D128428816E9CC3585E8D5B4E0953C10000 +C9 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +847D847E847F848084818483848484858486848A848D848F8490849184928493 +8494849584968498849A849B849D849E849F84A084A284A384A484A584A684A7 +84A884A984AA84AB84AC84AD84AE84B084B184B384B584B684B784BB84BC84BE +84C084C284C384C584C684C784C884CB84CC84CE84CF84D284D484D584D70000 +84D884D984DA84DB84DC84DE84E184E284E484E784E884E984EA84EB84ED84EE +84EF84F184F284F384F484F584F684F784F884F984FA84FB84FD84FE85008501 +85024F1E6563685155D34E2764149A9A626B5AC2745F82726DA968EE50E7838E +7802674052396C997EB150BB5565715E7B5B665273CA82EB67495C715220717D +886B95EA965564C58D6181B355846C5562477F2E58924F2455468D4F664C4E0A +5C1A88F368A2634E7A0D70E7828D52FA97F65C1154E890B57ECD59628D4A86C7 +820C820D8D6664445C0461516D89793E8BBE78377533547B4F388EAB6DF15A20 +7EC5795E6C885BA15A76751A80BE614E6E1758F0751F7525727253477EF30000 +CA +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +8503850485058506850785088509850A850B850D850E850F8510851285148515 +851685188519851B851C851D851E852085228523852485258526852785288529 +852A852D852E852F8530853185328533853485358536853E853F854085418542 +8544854585468547854B854C854D854E854F8550855185528553855485550000 +85578558855A855B855C855D855F85608561856285638565856685678569856A +856B856C856D856E856F8570857185738575857685778578857C857D857F8580 +8581770176DB526980DC57235E08593172EE65BD6E7F8BD75C388671534177F3 +62FE65F64EC098DF86805B9E8BC653F277E24F7F5C4E9A7659CB5F0F793A58EB +4E1667FF4E8B62ED8A93901D52BF662F55DC566C90024ED54F8D91CA99706C0F +5E0260435BA489C68BD56536624B99965B885BFF6388552E53D77626517D852C +67A268B36B8A62928F9353D482126DD1758F4E668D4E5B70719F85AF669166D9 +7F7287009ECD9F205C5E672F8FF06811675F620D7AD658855EB665706F310000 +CB +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +85828583858685888589858A858B858C858D858E859085918592859385948595 +8596859785988599859A859D859E859F85A085A185A285A385A585A685A785A9 +85AB85AC85AD85B185B285B385B485B585B685B885BA85BB85BC85BD85BE85BF +85C085C285C385C485C585C685C785C885CA85CB85CC85CD85CE85D185D20000 +85D485D685D785D885D985DA85DB85DD85DE85DF85E085E185E285E385E585E6 +85E785E885EA85EB85EC85ED85EE85EF85F085F185F285F385F485F585F685F7 +85F860555237800D6454887075295E05681362F4971C53CC723D8C016C347761 +7A0E542E77AC987A821C8BF47855671470C165AF64955636601D79C153F84E1D +6B7B80865BFA55E356DB4F3A4F3C99725DF3677E80386002988290015B8B8BBC +8BF5641C825864DE55FD82CF91654FD77D20901F7C9F50F358516EAF5BBF8BC9 +80839178849C7B97867D968B968F7EE59AD3788E5C817A57904296A7795F5B59 +635F7B0B84D168AD55067F2974107D2295016240584C4ED65B83597958540000 +CC +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +85F985FA85FC85FD85FE860086018602860386048606860786088609860A860B +860C860D860E860F86108612861386148615861786188619861A861B861C861D +861E861F86208621862286238624862586268628862A862B862C862D862E862F +863086318632863386348635863686378639863A863B863D863E863F86400000 +864186428643864486458646864786488649864A864B864C8652865386558656 +865786588659865B865C865D865F866086618663866486658666866786688669 +866A736D631E8E4B8E0F80CE82D462AC53F06CF0915E592A60016C70574D644A +8D2A762B6EE9575B6A8075F06F6D8C2D8C0857666BEF889278B363A253F970AD +6C645858642A580268E0819B55107CD650188EBA6DCC8D9F70EB638F6D9B6ED4 +7EE68404684390036DD896768BA85957727985E4817E75BC8A8A68AF52548E22 +951163D098988E44557C4F5366FF568F60D56D9552435C4959296DFB586B7530 +751C606C82148146631167618FE2773A8DF38D3494C15E165385542C70C30000 +CD +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +866D866F86708672867386748675867686778678868386848685868686878688 +8689868E868F86908691869286948696869786988699869A869B869E869F86A0 +86A186A286A586A686AB86AD86AE86B286B386B786B886B986BB86BC86BD86BE +86BF86C186C286C386C586C886CC86CD86D286D386D586D686D786DA86DC0000 +86DD86E086E186E286E386E586E686E786E886EA86EB86EC86EF86F586F686F7 +86FA86FB86FC86FD86FF8701870487058706870B870C870E870F871087118714 +87166C405EF7505C4EAD5EAD633A8247901A6850916E77B3540C94DC5F647AE5 +687663457B527EDF75DB507762955934900F51F879C37A8156FE5F9290146D82 +5C60571F541051546E4D56E263A89893817F8715892A9000541E5C6F81C062D6 +625881319E3596409A6E9A7C692D59A562D3553E631654C786D96D3C5A0374E6 +889C6B6A59168C4C5F2F6E7E73A9987D4E3870F75B8C7897633D665A769660CB +5B9B5A494E0781556C6A738B4EA167897F515F8065FA671B5FD859845A010000 +CE +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +8719871B871D871F87208724872687278728872A872B872C872D872F87308732 +87338735873687388739873A873C873D8740874187428743874487458746874A +874B874D874F8750875187528754875587568758875A875B875C875D875E875F +876187628766876787688769876A876B876C876D876F87718772877387750000 +877787788779877A877F878087818784878687878789878A878C878E878F8790 +8791879287948795879687988799879A879B879C879D879E87A087A187A287A3 +87A45DCD5FAE537197E68FDD684556F4552F60DF4E3A6F4D7EF482C7840E59D4 +4F1F4F2A5C3E7EAC672A851A5473754F80C355829B4F4F4D6E2D8C135C096170 +536B761F6E29868A658795FB7EB9543B7A337D0A95EE55E17FC174EE631D8717 +6DA17A9D621165A1536763E16C835DEB545C94A84E4C6C618BEC5C4B65E0829C +68A7543E54346BCB6B664E9463425348821E4F0D4FAE575E620A96FE66647269 +52FF52A1609F8BEF661471996790897F785277FD6670563B54389521727A0000 +CF +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +87A587A687A787A987AA87AE87B087B187B287B487B687B787B887B987BB87BC +87BE87BF87C187C287C387C487C587C787C887C987CC87CD87CE87CF87D087D4 +87D587D687D787D887D987DA87DC87DD87DE87DF87E187E287E387E487E687E7 +87E887E987EB87EC87ED87EF87F087F187F287F387F487F587F687F787F80000 +87FA87FB87FC87FD87FF880088018802880488058806880788088809880B880C +880D880E880F8810881188128814881788188819881A881C881D881E881F8820 +88237A00606F5E0C6089819D591560DC718470EF6EAA6C5072806A8488AD5E2D +4E605AB3559C94E36D177CFB9699620F7EC6778E867E5323971E8F9666875CE1 +4FA072ED4E0B53A6590F54136380952851484ED99C9C7EA454B88D2488548237 +95F26D8E5F265ACC663E966973B0732E53BF817A99857FA15BAA967796507EBF +76F853A2957699997BB189446E584E617FD479658BE660F354CD4EAB98795DF7 +6A6150CF54118C618427785D9704524A54EE56A395006D885BB56DC666530000 +D0 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +882488258826882788288829882A882B882C882D882E882F8830883188338834 +8835883688378838883A883B883D883E883F8841884288438846884788488849 +884A884B884E884F8850885188528853885588568858885A885B885C885D885E +885F886088668867886A886D886F8871887388748875887688788879887A0000 +887B887C88808883888688878889888A888C888E888F88908891889388948895 +889788988899889A889B889D889E889F88A088A188A388A588A688A788A888A9 +88AA5C0F5B5D6821809655787B11654869544E9B6B47874E978B534F631F643A +90AA659C80C18C10519968B0537887F961C86CC46CFB8C225C5185AA82AF950C +6B238F9B65B05FFB5FC34FE18845661F8165732960FA51745211578B5F6290A2 +884C91925E78674F602759D3514451F680F853086C7996C4718A4F114FEE7F9E +673D55C5950879C088967EE3589F620C9700865A5618987B5F908BB884C49157 +53D965ED5E8F755C60647D6E5A7F7EEA7EED8F6955A75BA360AC65CB73840000 +D1 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +88AC88AE88AF88B088B288B388B488B588B688B888B988BA88BB88BD88BE88BF +88C088C388C488C788C888CA88CB88CC88CD88CF88D088D188D388D688D788DA +88DB88DC88DD88DE88E088E188E688E788E988EA88EB88EC88ED88EE88EF88F2 +88F588F688F788FA88FB88FD88FF890089018903890489058906890789080000 +8909890B890C890D890E890F891189148915891689178918891C891D891E891F +89208922892389248926892789288929892C892D892E892F8931893289338935 +89379009766377297EDA9774859B5B667A7496EA884052CB718F5FAA65EC8BE2 +5BFB9A6F5DE16B896C5B8BAD8BAF900A8FC5538B62BC9E269E2D54404E2B82BD +7259869C5D1688596DAF96C554D14E9A8BB6710954BD960970DF6DF976D04E25 +781487125CA95EF68A00989C960E708E6CBF594463A9773C884D6F1482735830 +71D5538C781A96C155015F6671305BB48C1A9A8C6B83592E9E2F79E76768626C +4F6F75A17F8A6D0B96336C274EF075D2517B68376F3E90808170599674760000 +D2 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +89388939893A893B893C893D893E893F89408942894389458946894789488949 +894A894B894C894D894E894F8950895189528953895489558956895789588959 +895A895B895C895D896089618962896389648965896789688969896A896B896C +896D896E896F8970897189728973897489758976897789788979897A897C0000 +897D897E8980898289848985898789888989898A898B898C898D898E898F8990 +899189928993899489958996899789988999899A899B899C899D899E899F89A0 +89A164475C2790657A918C2359DA54AC8200836F898180006930564E80367237 +91CE51B64E5F987563964E1A53F666F3814B591C6DB24E0058F9533B63D694F1 +4F9D4F0A886398905937905779FB4EEA80F075916C825B9C59E85F5D69058681 +501A5DF24E5977E34EE5827A6291661390915C794EBF5F7981C69038808475AB +4EA688D4610F6BC55FC64E4976CA6EA28BE38BAE8C0A8BD15F027FFC7FCC7ECE +8335836B56E06BB797F3963459FB541F94F66DEB5BC5996E5C395F1596900000 +D3 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +89A289A389A489A589A689A789A889A989AA89AB89AC89AD89AE89AF89B089B1 +89B289B389B489B589B689B789B889B989BA89BB89BC89BD89BE89BF89C089C3 +89CD89D389D489D589D789D889D989DB89DD89DF89E089E189E289E489E789E8 +89E989EA89EC89ED89EE89F089F189F289F489F589F689F789F889F989FA0000 +89FB89FC89FD89FE89FF8A018A028A038A048A058A068A088A098A0A8A0B8A0C +8A0D8A0E8A0F8A108A118A128A138A148A158A168A178A188A198A1A8A1B8A1C +8A1D537082F16A315A749E705E947F2883B984248425836787478FCE8D6276C8 +5F719896786C662054DF62E54F6381C375C85EB896CD8E0A86F9548F6CF36D8C +6C38607F52C775285E7D4F1860A05FE75C24753190AE94C072B96CB96E389149 +670953CB53F34F5191C98BF153C85E7C8FC26DE44E8E76C26986865E611A8206 +4F594FDE903E9C7C61096E1D6E1496854E885A3196E84E0E5C7F79B95B878BED +7FBD738957DF828B90C15401904755BB5CEA5FA161086B3272F180B28A890000 +D4 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +8A1E8A1F8A208A218A228A238A248A258A268A278A288A298A2A8A2B8A2C8A2D +8A2E8A2F8A308A318A328A338A348A358A368A378A388A398A3A8A3B8A3C8A3D +8A3F8A408A418A428A438A448A458A468A478A498A4A8A4B8A4C8A4D8A4E8A4F +8A508A518A528A538A548A558A568A578A588A598A5A8A5B8A5C8A5D8A5E0000 +8A5F8A608A618A628A638A648A658A668A678A688A698A6A8A6B8A6C8A6D8A6E +8A6F8A708A718A728A738A748A758A768A778A788A7A8A7B8A7C8A7D8A7E8A7F +8A806D745BD388D598848C6B9A6D9E336E0A51A4514357A38881539F63F48F95 +56ED54585706733F6E907F188FDC82D1613F6028966266F07EA68D8A8DC394A5 +5CB37CA4670860A6960580184E9190E75300966851418FD08574915D665597F5 +5B55531D78386742683D54C9707E5BB08F7D518D572854B1651266828D5E8D43 +810F846C906D7CDF51FF85FB67A365E96FA186A48E81566A90207682707671E5 +8D2362E952196CFD8D3C600E589E618E66FE8D60624E55B36E23672D8F670000 +D5 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +8A818A828A838A848A858A868A878A888A8B8A8C8A8D8A8E8A8F8A908A918A92 +8A948A958A968A978A988A998A9A8A9B8A9C8A9D8A9E8A9F8AA08AA18AA28AA3 +8AA48AA58AA68AA78AA88AA98AAA8AAB8AAC8AAD8AAE8AAF8AB08AB18AB28AB3 +8AB48AB58AB68AB78AB88AB98ABA8ABB8ABC8ABD8ABE8ABF8AC08AC18AC20000 +8AC38AC48AC58AC68AC78AC88AC98ACA8ACB8ACC8ACD8ACE8ACF8AD08AD18AD2 +8AD38AD48AD58AD68AD78AD88AD98ADA8ADB8ADC8ADD8ADE8ADF8AE08AE18AE2 +8AE394E195F87728680569A8548B4E4D70B88BC86458658B5B857A84503A5BE8 +77BB6BE18A797C986CBE76CF65A98F975D2D5C5586386808536062187AD96E5B +7EFD6A1F7AE05F706F335F20638C6DA867564E085E108D264ED780C07634969C +62DB662D627E6CBC8D7571677F695146808753EC906E629854F286F08F998005 +951785178FD96D5973CD659F771F7504782781FB8D1E94884FA6679575B98BCA +9707632F9547963584B8632377415F8172F04E896014657462EF6B63653F0000 +D6 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +8AE48AE58AE68AE78AE88AE98AEA8AEB8AEC8AED8AEE8AEF8AF08AF18AF28AF3 +8AF48AF58AF68AF78AF88AF98AFA8AFB8AFC8AFD8AFE8AFF8B008B018B028B03 +8B048B058B068B088B098B0A8B0B8B0C8B0D8B0E8B0F8B108B118B128B138B14 +8B158B168B178B188B198B1A8B1B8B1C8B1D8B1E8B1F8B208B218B228B230000 +8B248B258B278B288B298B2A8B2B8B2C8B2D8B2E8B2F8B308B318B328B338B34 +8B358B368B378B388B398B3A8B3B8B3C8B3D8B3E8B3F8B408B418B428B438B44 +8B455E2775C790D18BC1829D679D652F5431871877E580A281026C414E4B7EC7 +804C76F4690D6B966267503C4F84574063076B628DBE53EA65E87EB85FD7631A +63B781F381F47F6E5E1C5CD95236667A79E97A1A8D28709975D46EDE6CBB7A92 +4E2D76C55FE0949F88777EC879CD80BF91CD4EF24F17821F54685DDE6D328BCC +7CA58F7480985E1A549276B15B99663C9AA473E0682A86DB6731732A8BF88BDB +90107AF970DB716E62C477A956314E3B845767F152A986C08D2E94F87B510000 +D7 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +8B468B478B488B498B4A8B4B8B4C8B4D8B4E8B4F8B508B518B528B538B548B55 +8B568B578B588B598B5A8B5B8B5C8B5D8B5E8B5F8B608B618B628B638B648B65 +8B678B688B698B6A8B6B8B6D8B6E8B6F8B708B718B728B738B748B758B768B77 +8B788B798B7A8B7B8B7C8B7D8B7E8B7F8B808B818B828B838B848B858B860000 +8B878B888B898B8A8B8B8B8C8B8D8B8E8B8F8B908B918B928B938B948B958B96 +8B978B988B998B9A8B9B8B9C8B9D8B9E8B9F8BAC8BB18BBB8BC78BD08BEA8C09 +8C1E4F4F6CE8795D9A7B6293722A62FD4E1378168F6C64B08D5A7BC668695E84 +88C55986649E58EE72B6690E95258FFD8D5857607F008C0651C6634962D95353 +684C74228301914C55447740707C6D4A517954A88D4459FF6ECB6DC45B5C7D2B +4ED47C7D6ED35B5081EA6E0D5B579B0368D58E2A5B977EFC603B7EB590B98D70 +594F63CD79DF8DB3535265CF79568BC5963B7EC494BB7E825634918967007F6A +5C0A907566285DE64F5067DE505A4F5C57505EA7000000000000000000000000 +D8 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +8C388C398C3A8C3B8C3C8C3D8C3E8C3F8C408C428C438C448C458C488C4A8C4B +8C4D8C4E8C4F8C508C518C528C538C548C568C578C588C598C5B8C5C8C5D8C5E +8C5F8C608C638C648C658C668C678C688C698C6C8C6D8C6E8C6F8C708C718C72 +8C748C758C768C778C7B8C7C8C7D8C7E8C7F8C808C818C838C848C868C870000 +8C888C8B8C8D8C8E8C8F8C908C918C928C938C958C968C978C998C9A8C9B8C9C +8C9D8C9E8C9F8CA08CA18CA28CA38CA48CA58CA68CA78CA88CA98CAA8CAB8CAC +8CAD4E8D4E0C51404E105EFF53454E154E984E1E9B325B6C56694E2879BA4E3F +53154E47592D723B536E6C1056DF80E499976BD3777E9F174E364E9F9F104E5C +4E694E9382885B5B556C560F4EC4538D539D53A353A553AE97658D5D531A53F5 +5326532E533E8D5C5366536352025208520E522D5233523F5240524C525E5261 +525C84AF527D528252815290529351827F544EBB4EC34EC94EC24EE84EE14EEB +4EDE4F1B4EF34F224F644EF54F254F274F094F2B4F5E4F6765384F5A4F5D0000 +D9 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +8CAE8CAF8CB08CB18CB28CB38CB48CB58CB68CB78CB88CB98CBA8CBB8CBC8CBD +8CBE8CBF8CC08CC18CC28CC38CC48CC58CC68CC78CC88CC98CCA8CCB8CCC8CCD +8CCE8CCF8CD08CD18CD28CD38CD48CD58CD68CD78CD88CD98CDA8CDB8CDC8CDD +8CDE8CDF8CE08CE18CE28CE38CE48CE58CE68CE78CE88CE98CEA8CEB8CEC0000 +8CED8CEE8CEF8CF08CF18CF28CF38CF48CF58CF68CF78CF88CF98CFA8CFB8CFC +8CFD8CFE8CFF8D008D018D028D038D048D058D068D078D088D098D0A8D0B8D0C +8D0D4F5F4F574F324F3D4F764F744F914F894F834F8F4F7E4F7B4FAA4F7C4FAC +4F944FE64FE84FEA4FC54FDA4FE34FDC4FD14FDF4FF85029504C4FF3502C500F +502E502D4FFE501C500C50255028507E504350555048504E506C507B50A550A7 +50A950BA50D6510650ED50EC50E650EE5107510B4EDD6C3D4F584F654FCE9FA0 +6C467C74516E5DFD9EC999985181591452F9530D8A07531051EB591951554EA0 +51564EB3886E88A44EB5811488D279805B3488037FB851AB51B151BD51BC0000 +DA +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +8D0E8D0F8D108D118D128D138D148D158D168D178D188D198D1A8D1B8D1C8D20 +8D518D528D578D5F8D658D688D698D6A8D6C8D6E8D6F8D718D728D788D798D7A +8D7B8D7C8D7D8D7E8D7F8D808D828D838D868D878D888D898D8C8D8D8D8E8D8F +8D908D928D938D958D968D978D988D998D9A8D9B8D9C8D9D8D9E8DA08DA10000 +8DA28DA48DA58DA68DA78DA88DA98DAA8DAB8DAC8DAD8DAE8DAF8DB08DB28DB6 +8DB78DB98DBB8DBD8DC08DC18DC28DC58DC78DC88DC98DCA8DCD8DD08DD28DD3 +8DD451C7519651A251A58BA08BA68BA78BAA8BB48BB58BB78BC28BC38BCB8BCF +8BCE8BD28BD38BD48BD68BD88BD98BDC8BDF8BE08BE48BE88BE98BEE8BF08BF3 +8BF68BF98BFC8BFF8C008C028C048C078C0C8C0F8C118C128C148C158C168C19 +8C1B8C188C1D8C1F8C208C218C258C278C2A8C2B8C2E8C2F8C328C338C358C36 +5369537A961D962296219631962A963D963C964296499654965F9667966C9672 +96749688968D969796B09097909B909D909990AC90A190B490B390B690BA0000 +DB +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +8DD58DD88DD98DDC8DE08DE18DE28DE58DE68DE78DE98DED8DEE8DF08DF18DF2 +8DF48DF68DFC8DFE8DFF8E008E018E028E038E048E068E078E088E0B8E0D8E0E +8E108E118E128E138E158E168E178E188E198E1A8E1B8E1C8E208E218E248E25 +8E268E278E288E2B8E2D8E308E328E338E348E368E378E388E3B8E3C8E3E0000 +8E3F8E438E458E468E4C8E4D8E4E8E4F8E508E538E548E558E568E578E588E5A +8E5B8E5C8E5D8E5E8E5F8E608E618E628E638E648E658E678E688E6A8E6B8E6E +8E7190B890B090CF90C590BE90D090C490C790D390E690E290DC90D790DB90EB +90EF90FE91049122911E91239131912F913991439146520D594252A252AC52AD +52BE54FF52D052D652F053DF71EE77CD5EF451F551FC9B2F53B65F01755A5DEF +574C57A957A1587E58BC58C558D15729572C572A57335739572E572F575C573B +574257695785576B5786577C577B5768576D5776577357AD57A4578C57B257CF +57A757B4579357A057D557D857DA57D957D257B857F457EF57F857E457DD0000 +DC +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +8E738E758E778E788E798E7A8E7B8E7D8E7E8E808E828E838E848E868E888E89 +8E8A8E8B8E8C8E8D8E8E8E918E928E938E958E968E978E988E998E9A8E9B8E9D +8E9F8EA08EA18EA28EA38EA48EA58EA68EA78EA88EA98EAA8EAD8EAE8EB08EB1 +8EB38EB48EB58EB68EB78EB88EB98EBB8EBC8EBD8EBE8EBF8EC08EC18EC20000 +8EC38EC48EC58EC68EC78EC88EC98ECA8ECB8ECC8ECD8ECF8ED08ED18ED28ED3 +8ED48ED58ED68ED78ED88ED98EDA8EDB8EDC8EDD8EDE8EDF8EE08EE18EE28EE3 +8EE4580B580D57FD57ED5800581E5819584458205865586C58815889589A5880 +99A89F1961FF8279827D827F828F828A82A88284828E82918297829982AB82B8 +82BE82B082C882CA82E3829882B782AE82CB82CC82C182A982B482A182AA829F +82C482CE82A482E1830982F782E4830F830782DC82F482D282D8830C82FB82D3 +8311831A83068314831582E082D5831C8351835B835C83088392833C83348331 +839B835E832F834F83478343835F834083178360832D833A8333836683650000 +DD +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +8EE58EE68EE78EE88EE98EEA8EEB8EEC8EED8EEE8EEF8EF08EF18EF28EF38EF4 +8EF58EF68EF78EF88EF98EFA8EFB8EFC8EFD8EFE8EFF8F008F018F028F038F04 +8F058F068F078F088F098F0A8F0B8F0C8F0D8F0E8F0F8F108F118F128F138F14 +8F158F168F178F188F198F1A8F1B8F1C8F1D8F1E8F1F8F208F218F228F230000 +8F248F258F268F278F288F298F2A8F2B8F2C8F2D8F2E8F2F8F308F318F328F33 +8F348F358F368F378F388F398F3A8F3B8F3C8F3D8F3E8F3F8F408F418F428F43 +8F448368831B8369836C836A836D836E83B0837883B383B483A083AA8393839C +8385837C83B683A9837D83B8837B8398839E83A883BA83BC83C1840183E583D8 +58078418840B83DD83FD83D6841C84388411840683D483DF840F840383F883F9 +83EA83C583C0842683F083E1845C8451845A8459847384878488847A84898478 +843C844684698476848C848E8431846D84C184CD84D084E684BD84D384CA84BF +84BA84E084A184B984B4849784E584E3850C750D853884F08539851F853A0000 +DE +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +8F458F468F478F488F498F4A8F4B8F4C8F4D8F4E8F4F8F508F518F528F538F54 +8F558F568F578F588F598F5A8F5B8F5C8F5D8F5E8F5F8F608F618F628F638F64 +8F658F6A8F808F8C8F928F9D8FA08FA18FA28FA48FA58FA68FA78FAA8FAC8FAD +8FAE8FAF8FB28FB38FB48FB58FB78FB88FBA8FBB8FBC8FBF8FC08FC38FC60000 +8FC98FCA8FCB8FCC8FCD8FCF8FD28FD68FD78FDA8FE08FE18FE38FE78FEC8FEF +8FF18FF28FF48FF58FF68FFA8FFB8FFC8FFE8FFF90079008900C900E90139015 +90188556853B84FF84FC8559854885688564855E857A77A285438572857B85A4 +85A88587858F857985AE859C858585B985B785B085D385C185DC85FF86278605 +86298616863C5EFE5F08593C594180375955595A5958530F5C225C255C2C5C34 +624C626A629F62BB62CA62DA62D762EE632262F66339634B634363AD63F66371 +637A638E63B4636D63AC638A636963AE63BC63F263F863E063FF63C463DE63CE +645263C663BE64456441640B641B6420640C64266421645E6484646D64960000 +DF +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +9019901C902390249025902790289029902A902B902C90309031903290339034 +90379039903A903D903F904090439045904690489049904A904B904C904E9054 +905590569059905A905C905D905E905F906090619064906690679069906A906B +906C906F90709071907290739076907790789079907A907B907C907E90810000 +90849085908690879089908A908C908D908E908F90909092909490969098909A +909C909E909F90A090A490A590A790A890A990AB90AD90B290B790BC90BD90BF +90C0647A64B764B8649964BA64C064D064D764E464E265096525652E5F0B5FD2 +75195F11535F53F153FD53E953E853FB541254165406544B5452545354545456 +54435421545754595423543254825494547754715464549A549B548454765466 +549D54D054AD54C254B454D254A754A654D354D4547254A354D554BB54BF54CC +54D954DA54DC54A954AA54A454DD54CF54DE551B54E7552054FD551454F35522 +5523550F55115527552A5567558F55B55549556D55415555553F5550553C0000 +E0 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +90C290C390C690C890C990CB90CC90CD90D290D490D590D690D890D990DA90DE +90DF90E090E390E490E590E990EA90EC90EE90F090F190F290F390F590F690F7 +90F990FA90FB90FC90FF91009101910391059106910791089109910A910B910C +910D910E910F911091119112911391149115911691179118911A911B911C0000 +911D911F91209121912491259126912791289129912A912B912C912D912E9130 +9132913391349135913691379138913A913B913C913D913E913F914091419142 +91445537555655755576557755335530555C558B55D2558355B155B955885581 +559F557E55D65591557B55DF55BD55BE5594559955EA55F755C9561F55D155EB +55EC55D455E655DD55C455EF55E555F255F355CC55CD55E855F555E48F94561E +5608560C56015624562355FE56005627562D565856395657562C564D56625659 +565C564C5654568656645671566B567B567C5685569356AF56D456D756DD56E1 +56F556EB56F956FF5704570A5709571C5E0F5E195E145E115E315E3B5E3C0000 +E1 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +9145914791489151915391549155915691589159915B915C915F916091669167 +9168916B916D9173917A917B917C9180918191829183918491869188918A918E +918F9193919491959196919791989199919C919D919E919F91A091A191A491A5 +91A691A791A891A991AB91AC91B091B191B291B391B691B791B891B991BB0000 +91BC91BD91BE91BF91C091C191C291C391C491C591C691C891CB91D091D291D3 +91D491D591D691D791D891D991DA91DB91DD91DE91DF91E091E191E291E391E4 +91E55E375E445E545E5B5E5E5E615C8C5C7A5C8D5C905C965C885C985C995C91 +5C9A5C9C5CB55CA25CBD5CAC5CAB5CB15CA35CC15CB75CC45CD25CE45CCB5CE5 +5D025D035D275D265D2E5D245D1E5D065D1B5D585D3E5D345D3D5D6C5D5B5D6F +5D5D5D6B5D4B5D4A5D695D745D825D995D9D8C735DB75DC55F735F775F825F87 +5F895F8C5F955F995F9C5FA85FAD5FB55FBC88625F6172AD72B072B472B772B8 +72C372C172CE72CD72D272E872EF72E972F272F472F7730172F3730372FA0000 +E2 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +91E691E791E891E991EA91EB91EC91ED91EE91EF91F091F191F291F391F491F5 +91F691F791F891F991FA91FB91FC91FD91FE91FF920092019202920392049205 +9206920792089209920A920B920C920D920E920F921092119212921392149215 +9216921792189219921A921B921C921D921E921F922092219222922392240000 +92259226922792289229922A922B922C922D922E922F92309231923292339234 +92359236923792389239923A923B923C923D923E923F92409241924292439244 +924572FB731773137321730A731E731D7315732273397325732C733873317350 +734D73577360736C736F737E821B592598E7592459029963996799689969996A +996B996C99749977997D998099849987998A998D999099919993999499955E80 +5E915E8B5E965EA55EA05EB95EB55EBE5EB38D535ED25ED15EDB5EE85EEA81BA +5FC45FC95FD65FCF60035FEE60045FE15FE45FFE600560065FEA5FED5FF86019 +60356026601B600F600D6029602B600A603F602160786079607B607A60420000 +E3 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +9246924792489249924A924B924C924D924E924F925092519252925392549255 +9256925792589259925A925B925C925D925E925F926092619262926392649265 +9266926792689269926A926B926C926D926E926F927092719272927392759276 +927792789279927A927B927C927D927E927F9280928192829283928492850000 +9286928792889289928A928B928C928D928F9290929192929293929492959296 +929792989299929A929B929C929D929E929F92A092A192A292A392A492A592A6 +92A7606A607D6096609A60AD609D60836092608C609B60EC60BB60B160DD60D8 +60C660DA60B4612061266115612360F46100610E612B614A617561AC619461A7 +61B761D461F55FDD96B395E995EB95F195F395F595F695FC95FE960396049606 +9608960A960B960C960D960F96129615961696179619961A4E2C723F62156C35 +6C546C5C6C4A6CA36C856C906C946C8C6C686C696C746C766C866CA96CD06CD4 +6CAD6CF76CF86CF16CD76CB26CE06CD66CFA6CEB6CEE6CB16CD36CEF6CFE0000 +E4 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +92A892A992AA92AB92AC92AD92AF92B092B192B292B392B492B592B692B792B8 +92B992BA92BB92BC92BD92BE92BF92C092C192C292C392C492C592C692C792C9 +92CA92CB92CC92CD92CE92CF92D092D192D292D392D492D592D692D792D892D9 +92DA92DB92DC92DD92DE92DF92E092E192E292E392E492E592E692E792E80000 +92E992EA92EB92EC92ED92EE92EF92F092F192F292F392F492F592F692F792F8 +92F992FA92FB92FC92FD92FE92FF930093019302930393049305930693079308 +93096D396D276D0C6D436D486D076D046D196D0E6D2B6D4D6D2E6D356D1A6D4F +6D526D546D336D916D6F6D9E6DA06D5E6D936D946D5C6D606D7C6D636E1A6DC7 +6DC56DDE6E0E6DBF6DE06E116DE66DDD6DD96E166DAB6E0C6DAE6E2B6E6E6E4E +6E6B6EB26E5F6E866E536E546E326E256E446EDF6EB16E986EE06F2D6EE26EA5 +6EA76EBD6EBB6EB76ED76EB46ECF6E8F6EC26E9F6F626F466F476F246F156EF9 +6F2F6F366F4B6F746F2A6F096F296F896F8D6F8C6F786F726F7C6F7A6FD10000 +E5 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +930A930B930C930D930E930F9310931193129313931493159316931793189319 +931A931B931C931D931E931F9320932193229323932493259326932793289329 +932A932B932C932D932E932F9330933193329333933493359336933793389339 +933A933B933C933D933F93409341934293439344934593469347934893490000 +934A934B934C934D934E934F9350935193529353935493559356935793589359 +935A935B935C935D935E935F9360936193629363936493659366936793689369 +936B6FC96FA76FB96FB66FC26FE16FEE6FDE6FE06FEF701A7023701B70397035 +704F705E5B805B845B955B935BA55BB8752F9A9E64345BE45BEE89305BF08E47 +8B078FB68FD38FD58FE58FEE8FE48FE98FE68FF38FE890059004900B90269011 +900D9016902190359036902D902F9044905190529050906890589062905B66B9 +9074907D908290889083908B5F505F575F565F585C3B54AB5C505C595B715C63 +5C667FBC5F2A5F295F2D82745F3C9B3B5C6E59815983598D59A959AA59A30000 +E6 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +936C936D936E936F9370937193729373937493759376937793789379937A937B +937C937D937E937F9380938193829383938493859386938793889389938A938B +938C938D938E9390939193929393939493959396939793989399939A939B939C +939D939E939F93A093A193A293A393A493A593A693A793A893A993AA93AB0000 +93AC93AD93AE93AF93B093B193B293B393B493B593B693B793B893B993BA93BB +93BC93BD93BE93BF93C093C193C293C393C493C593C693C793C893C993CB93CC +93CD599759CA59AB599E59A459D259B259AF59D759BE5A055A0659DD5A0859E3 +59D859F95A0C5A095A325A345A115A235A135A405A675A4A5A555A3C5A625A75 +80EC5AAA5A9B5A775A7A5ABE5AEB5AB25AD25AD45AB85AE05AE35AF15AD65AE6 +5AD85ADC5B095B175B165B325B375B405C155C1C5B5A5B655B735B515B535B62 +9A759A779A789A7A9A7F9A7D9A809A819A859A889A8A9A909A929A939A969A98 +9A9B9A9C9A9D9A9F9AA09AA29AA39AA59AA77E9F7EA17EA37EA57EA87EA90000 +E7 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +93CE93CF93D093D193D293D393D493D593D793D893D993DA93DB93DC93DD93DE +93DF93E093E193E293E393E493E593E693E793E893E993EA93EB93EC93ED93EE +93EF93F093F193F293F393F493F593F693F793F893F993FA93FB93FC93FD93FE +93FF9400940194029403940494059406940794089409940A940B940C940D0000 +940E940F9410941194129413941494159416941794189419941A941B941C941D +941E941F9420942194229423942494259426942794289429942A942B942C942D +942E7EAD7EB07EBE7EC07EC17EC27EC97ECB7ECC7ED07ED47ED77EDB7EE07EE1 +7EE87EEB7EEE7EEF7EF17EF27F0D7EF67EFA7EFB7EFE7F017F027F037F077F08 +7F0B7F0C7F0F7F117F127F177F197F1C7F1B7F1F7F217F227F237F247F257F26 +7F277F2A7F2B7F2C7F2D7F2F7F307F317F327F337F355E7A757F5DDB753E9095 +738E739173AE73A2739F73CF73C273D173B773B373C073C973C873E573D9987C +740A73E973E773DE73BA73F2740F742A745B7426742574287430742E742C0000 +E8 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +942F9430943194329433943494359436943794389439943A943B943C943D943F +9440944194429443944494459446944794489449944A944B944C944D944E944F +9450945194529453945494559456945794589459945A945B945C945D945E945F +9460946194629463946494659466946794689469946A946C946D946E946F0000 +9470947194729473947494759476947794789479947A947B947C947D947E947F +9480948194829483948494919496949894C794CF94D394D494DA94E694FB951C +9520741B741A7441745C7457745574597477746D747E749C748E748074817487 +748B749E74A874A9749074A774D274BA97EA97EB97EC674C6753675E67486769 +67A56787676A6773679867A7677567A8679E67AD678B6777677C67F0680967D8 +680A67E967B0680C67D967B567DA67B367DD680067C367B867E2680E67C167FD +6832683368606861684E6862684468646883681D68556866684168676840683E +684A6849682968B5688F687468776893686B68C2696E68FC691F692068F90000 +E9 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +95279533953D95439548954B9555955A9560956E95749575957795789579957A +957B957C957D957E9580958195829583958495859586958795889589958A958B +958C958D958E958F9590959195929593959495959596959795989599959A959B +959C959D959E959F95A095A195A295A395A495A595A695A795A895A995AA0000 +95AB95AC95AD95AE95AF95B095B195B295B395B495B595B695B795B895B995BA +95BB95BC95BD95BE95BF95C095C195C295C395C495C595C695C795C895C995CA +95CB692468F0690B6901695768E369106971693969606942695D6984696B6980 +69986978693469CC6987698869CE6989696669636979699B69A769BB69AB69AD +69D469B169C169CA69DF699569E0698D69FF6A2F69ED6A176A186A6569F26A44 +6A3E6AA06A506A5B6A356A8E6A796A3D6A286A586A7C6A916A906AA96A976AAB +733773526B816B826B876B846B926B936B8D6B9A6B9B6BA16BAA8F6B8F6D8F71 +8F728F738F758F768F788F778F798F7A8F7C8F7E8F818F828F848F878F8B0000 +EA +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +95CC95CD95CE95CF95D095D195D295D395D495D595D695D795D895D995DA95DB +95DC95DD95DE95DF95E095E195E295E395E495E595E695E795EC95FF96079613 +9618961B961E96209623962496259626962796289629962B962C962D962F9630 +963796389639963A963E96419643964A964E964F965196529653965696570000 +96589659965A965C965D965E9660966396659666966B966D966E966F96709671 +967396789679967A967B967C967D967E967F9680968196829683968496879689 +968A8F8D8F8E8F8F8F988F9A8ECE620B6217621B621F6222622162256224622C +81E774EF74F474FF750F75117513653465EE65EF65F0660A6619677266036615 +6600708566F7661D66346631663666358006665F66546641664F665666616657 +66776684668C66A7669D66BE66DB66DC66E666E98D328D338D368D3B8D3D8D40 +8D458D468D488D498D478D4D8D558D5989C789CA89CB89CC89CE89CF89D089D1 +726E729F725D7266726F727E727F7284728B728D728F72926308633263B00000 +EB +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +968C968E96919692969396959696969A969B969D969E969F96A096A196A296A3 +96A496A596A696A896A996AA96AB96AC96AD96AE96AF96B196B296B496B596B7 +96B896BA96BB96BF96C296C396C896CA96CB96D096D196D396D496D696D796D8 +96D996DA96DB96DC96DD96DE96DF96E196E296E396E496E596E696E796EB0000 +96EC96ED96EE96F096F196F296F496F596F896FA96FB96FC96FD96FF97029703 +9705970A970B970C97109711971297149715971797189719971A971B971D971F +9720643F64D880046BEA6BF36BFD6BF56BF96C056C076C066C0D6C156C186C19 +6C1A6C216C296C246C2A6C3265356555656B724D72527256723086625216809F +809C809380BC670A80BD80B180AB80AD80B480B780E780E880E980EA80DB80C2 +80C480D980CD80D7671080DD80EB80F180F480ED810D810E80F280FC67158112 +8C5A8136811E812C811881328148814C815381748159815A817181608169817C +817D816D8167584D5AB58188818281916ED581A381AA81CC672681CA81BB0000 +EC +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +972197229723972497259726972797289729972B972C972E972F973197339734 +973597369737973A973B973C973D973F97409741974297439744974597469747 +97489749974A974B974C974D974E974F975097519754975597579758975A975C +975D975F97639764976697679768976A976B976C976D976E976F977097710000 +97729775977797789779977A977B977D977E977F978097819782978397849786 +978797889789978A978C978E978F979097939795979697979799979A979B979C +979D81C181A66B246B376B396B436B466B5998D198D298D398D598D998DA6BB3 +5F406BC289F365909F51659365BC65C665C465C365CC65CE65D265D67080709C +7096709D70BB70C070B770AB70B170E870CA711071137116712F71317173715C +716871457172714A7178717A719871B371B571A871A071E071D471E771F9721D +7228706C7118716671B9623E623D624362486249793B794079467949795B795C +7953795A796279577960796F7967797A7985798A799A79A779B35FD15FD00000 +ED +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +979E979F97A197A297A497A597A697A797A897A997AA97AC97AE97B097B197B3 +97B597B697B797B897B997BA97BB97BC97BD97BE97BF97C097C197C297C397C4 +97C597C697C797C897C997CA97CB97CC97CD97CE97CF97D097D197D297D397D4 +97D597D697D797D897D997DA97DB97DC97DD97DE97DF97E097E197E297E30000 +97E497E597E897EE97EF97F097F197F297F497F797F897F997FA97FB97FC97FD +97FE97FF9800980198029803980498059806980798089809980A980B980C980D +980E603C605D605A606760416059606360AB6106610D615D61A9619D61CB61D1 +62068080807F6C936CF66DFC77F677F87800780978177818781165AB782D781C +781D7839783A783B781F783C7825782C78237829784E786D7856785778267850 +7847784C786A789B7893789A7887789C78A178A378B278B978A578D478D978C9 +78EC78F2790578F479137924791E79349F9B9EF99EFB9EFC76F17704770D76F9 +77077708771A77227719772D7726773577387750775177477743775A77680000 +EE +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +980F9810981198129813981498159816981798189819981A981B981C981D981E +981F9820982198229823982498259826982798289829982A982B982C982D982E +982F9830983198329833983498359836983798389839983A983B983C983D983E +983F9840984198429843984498459846984798489849984A984B984C984D0000 +984E984F9850985198529853985498559856985798589859985A985B985C985D +985E985F9860986198629863986498659866986798689869986A986B986C986D +986E77627765777F778D777D7780778C7791779F77A077B077B577BD753A7540 +754E754B7548755B7572757975837F587F617F5F8A487F687F747F717F797F81 +7F7E76CD76E58832948594869487948B948A948C948D948F9490949494979495 +949A949B949C94A394A494AB94AA94AD94AC94AF94B094B294B494B694B794B8 +94B994BA94BC94BD94BF94C494C894C994CA94CB94CC94CD94CE94D094D194D2 +94D594D694D794D994D894DB94DE94DF94E094E294E494E594E794E894EA0000 +EF +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +986F98709871987298739874988B988E98929895989998A398A898A998AA98AB +98AC98AD98AE98AF98B098B198B298B398B498B598B698B798B898B998BA98BB +98BC98BD98BE98BF98C098C198C298C398C498C598C698C798C898C998CA98CB +98CC98CD98CF98D098D498D698D798DB98DC98DD98E098E198E298E398E40000 +98E598E698E998EA98EB98EC98ED98EE98EF98F098F198F298F398F498F598F6 +98F798F898F998FA98FB98FC98FD98FE98FF9900990199029903990499059906 +990794E994EB94EE94EF94F394F494F594F794F994FC94FD94FF950395029506 +95079509950A950D950E950F951295139514951595169518951B951D951E951F +9522952A952B9529952C953195329534953695379538953C953E953F95429535 +9544954595469549954C954E954F9552955395549556955795589559955B955E +955F955D95619562956495659566956795689569956A956B956C956F95719572 +9573953A77E777EC96C979D579ED79E379EB7A065D477A037A027A1E7A140000 +F0 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +99089909990A990B990C990E990F991199129913991499159916991799189919 +991A991B991C991D991E991F9920992199229923992499259926992799289929 +992A992B992C992D992F9930993199329933993499359936993799389939993A +993B993C993D993E993F99409941994299439944994599469947994899490000 +994A994B994C994D994E994F99509951995299539956995799589959995A995B +995C995D995E995F99609961996299649966997399789979997B997E99829983 +99897A397A377A519ECF99A57A707688768E7693769976A474DE74E0752C9E20 +9E229E289E299E2A9E2B9E2C9E329E319E369E389E379E399E3A9E3E9E419E42 +9E449E469E479E489E499E4B9E4C9E4E9E519E559E579E5A9E5B9E5C9E5E9E63 +9E669E679E689E699E6A9E6B9E6C9E719E6D9E7375927594759675A0759D75AC +75A375B375B475B875C475B175B075C375C275D675CD75E375E875E675E475EB +75E7760375F175FC75FF761076007605760C7617760A76257618761576190000 +F1 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +998C998E999A999B999C999D999E999F99A099A199A299A399A499A699A799A9 +99AA99AB99AC99AD99AE99AF99B099B199B299B399B499B599B699B799B899B9 +99BA99BB99BC99BD99BE99BF99C099C199C299C399C499C599C699C799C899C9 +99CA99CB99CC99CD99CE99CF99D099D199D299D399D499D599D699D799D80000 +99D999DA99DB99DC99DD99DE99DF99E099E199E299E399E499E599E699E799E8 +99E999EA99EB99EC99ED99EE99EF99F099F199F299F399F499F599F699F799F8 +99F9761B763C762276207640762D7630763F76357643763E7633764D765E7654 +765C7656766B766F7FCA7AE67A787A797A807A867A887A957AA67AA07AAC7AA8 +7AAD7AB3886488698872887D887F888288A288C688B788BC88C988E288CE88E3 +88E588F1891A88FC88E888FE88F0892189198913891B890A8934892B89368941 +8966897B758B80E576B276B477DC801280148016801C80208022802580268027 +802980288031800B803580438046804D80528069807189839878988098830000 +F2 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +99FA99FB99FC99FD99FE99FF9A009A019A029A039A049A059A069A079A089A09 +9A0A9A0B9A0C9A0D9A0E9A0F9A109A119A129A139A149A159A169A179A189A19 +9A1A9A1B9A1C9A1D9A1E9A1F9A209A219A229A239A249A259A269A279A289A29 +9A2A9A2B9A2C9A2D9A2E9A2F9A309A319A329A339A349A359A369A379A380000 +9A399A3A9A3B9A3C9A3D9A3E9A3F9A409A419A429A439A449A459A469A479A48 +9A499A4A9A4B9A4C9A4D9A4E9A4F9A509A519A529A539A549A559A569A579A58 +9A599889988C988D988F9894989A989B989E989F98A198A298A598A6864D8654 +866C866E867F867A867C867B86A8868D868B86AC869D86A786A386AA869386A9 +86B686C486B586CE86B086BA86B186AF86C986CF86B486E986F186F286ED86F3 +86D0871386DE86F486DF86D886D18703870786F88708870A870D87098723873B +871E8725872E871A873E87488734873187298737873F87828722877D877E877B +87608770874C876E878B87538763877C876487598765879387AF87A887D20000 +F3 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +9A5A9A5B9A5C9A5D9A5E9A5F9A609A619A629A639A649A659A669A679A689A69 +9A6A9A6B9A729A839A899A8D9A8E9A949A959A999AA69AA99AAA9AAB9AAC9AAD +9AAE9AAF9AB29AB39AB49AB59AB99ABB9ABD9ABE9ABF9AC39AC49AC69AC79AC8 +9AC99ACA9ACD9ACE9ACF9AD09AD29AD49AD59AD69AD79AD99ADA9ADB9ADC0000 +9ADD9ADE9AE09AE29AE39AE49AE59AE79AE89AE99AEA9AEC9AEE9AF09AF19AF2 +9AF39AF49AF59AF69AF79AF89AFA9AFC9AFD9AFE9AFF9B009B019B029B049B05 +9B0687C68788878587AD8797878387AB87E587AC87B587B387CB87D387BD87D1 +87C087CA87DB87EA87E087EE8816881387FE880A881B88218839883C7F367F42 +7F447F4582107AFA7AFD7B087B037B047B157B0A7B2B7B0F7B477B387B2A7B19 +7B2E7B317B207B257B247B337B3E7B1E7B587B5A7B457B757B4C7B5D7B607B6E +7B7B7B627B727B717B907BA67BA77BB87BAC7B9D7BA87B857BAA7B9C7BA27BAB +7BB47BD17BC17BCC7BDD7BDA7BE57BE67BEA7C0C7BFE7BFC7C0F7C167C0B0000 +F4 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +9B079B099B0A9B0B9B0C9B0D9B0E9B109B119B129B149B159B169B179B189B19 +9B1A9B1B9B1C9B1D9B1E9B209B219B229B249B259B269B279B289B299B2A9B2B +9B2C9B2D9B2E9B309B319B339B349B359B369B379B389B399B3A9B3D9B3E9B3F +9B409B469B4A9B4B9B4C9B4E9B509B529B539B559B569B579B589B599B5A0000 +9B5B9B5C9B5D9B5E9B5F9B609B619B629B639B649B659B669B679B689B699B6A +9B6B9B6C9B6D9B6E9B6F9B709B719B729B739B749B759B769B779B789B799B7A +9B7B7C1F7C2A7C267C387C417C4081FE82018202820481EC8844822182228223 +822D822F8228822B8238823B82338234823E82448249824B824F825A825F8268 +887E8885888888D888DF895E7F9D7F9F7FA77FAF7FB07FB27C7C65497C917C9D +7C9C7C9E7CA27CB27CBC7CBD7CC17CC77CCC7CCD7CC87CC57CD77CE8826E66A8 +7FBF7FCE7FD57FE57FE17FE67FE97FEE7FF37CF87D777DA67DAE7E477E9B9EB8 +9EB48D738D848D948D918DB18D678D6D8C478C49914A9150914E914F91640000 +F5 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +9B7C9B7D9B7E9B7F9B809B819B829B839B849B859B869B879B889B899B8A9B8B +9B8C9B8D9B8E9B8F9B909B919B929B939B949B959B969B979B989B999B9A9B9B +9B9C9B9D9B9E9B9F9BA09BA19BA29BA39BA49BA59BA69BA79BA89BA99BAA9BAB +9BAC9BAD9BAE9BAF9BB09BB19BB29BB39BB49BB59BB69BB79BB89BB99BBA0000 +9BBB9BBC9BBD9BBE9BBF9BC09BC19BC29BC39BC49BC59BC69BC79BC89BC99BCA +9BCB9BCC9BCD9BCE9BCF9BD09BD19BD29BD39BD49BD59BD69BD79BD89BD99BDA +9BDB9162916191709169916F917D917E917291749179918C91859190918D9191 +91A291A391AA91AD91AE91AF91B591B491BA8C559E7E8DB88DEB8E058E598E69 +8DB58DBF8DBC8DBA8DC48DD68DD78DDA8DDE8DCE8DCF8DDB8DC68DEC8DF78DF8 +8DE38DF98DFB8DE48E098DFD8E148E1D8E1F8E2C8E2E8E238E2F8E3A8E408E39 +8E358E3D8E318E498E418E428E518E528E4A8E708E768E7C8E6F8E748E858E8F +8E948E908E9C8E9E8C788C828C8A8C858C988C94659B89D689DE89DA89DC0000 +F6 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +9BDC9BDD9BDE9BDF9BE09BE19BE29BE39BE49BE59BE69BE79BE89BE99BEA9BEB +9BEC9BED9BEE9BEF9BF09BF19BF29BF39BF49BF59BF69BF79BF89BF99BFA9BFB +9BFC9BFD9BFE9BFF9C009C019C029C039C049C059C069C079C089C099C0A9C0B +9C0C9C0D9C0E9C0F9C109C119C129C139C149C159C169C179C189C199C1A0000 +9C1B9C1C9C1D9C1E9C1F9C209C219C229C239C249C259C269C279C289C299C2A +9C2B9C2C9C2D9C2E9C2F9C309C319C329C339C349C359C369C379C389C399C3A +9C3B89E589EB89EF8A3E8B26975396E996F396EF970697019708970F970E972A +972D9730973E9F809F839F859F869F879F889F899F8A9F8C9EFE9F0B9F0D96B9 +96BC96BD96CE96D277BF96E0928E92AE92C8933E936A93CA938F943E946B9C7F +9C829C859C869C879C887A239C8B9C8E9C909C919C929C949C959C9A9C9B9C9E +9C9F9CA09CA19CA29CA39CA59CA69CA79CA89CA99CAB9CAD9CAE9CB09CB19CB2 +9CB39CB49CB59CB69CB79CBA9CBB9CBC9CBD9CC49CC59CC69CC79CCA9CCB0000 +F7 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +9C3C9C3D9C3E9C3F9C409C419C429C439C449C459C469C479C489C499C4A9C4B +9C4C9C4D9C4E9C4F9C509C519C529C539C549C559C569C579C589C599C5A9C5B +9C5C9C5D9C5E9C5F9C609C619C629C639C649C659C669C679C689C699C6A9C6B +9C6C9C6D9C6E9C6F9C709C719C729C739C749C759C769C779C789C799C7A0000 +9C7B9C7D9C7E9C809C839C849C899C8A9C8C9C8F9C939C969C979C989C999C9D +9CAA9CAC9CAF9CB99CBE9CBF9CC09CC19CC29CC89CC99CD19CD29CDA9CDB9CE0 +9CE19CCC9CCD9CCE9CCF9CD09CD39CD49CD59CD79CD89CD99CDC9CDD9CDF9CE2 +977C978597919792979497AF97AB97A397B297B49AB19AB09AB79E589AB69ABA +9ABC9AC19AC09AC59AC29ACB9ACC9AD19B459B439B479B499B489B4D9B5198E8 +990D992E995599549ADF9AE19AE69AEF9AEB9AFB9AED9AF99B089B0F9B139B1F +9B239EBD9EBE7E3B9E829E879E889E8B9E9293D69E9D9E9F9EDB9EDC9EDD9EE0 +9EDF9EE29EE99EE79EE59EEA9EEF9F229F2C9F2F9F399F379F3D9F3E9F440000 +F8 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +9CE39CE49CE59CE69CE79CE89CE99CEA9CEB9CEC9CED9CEE9CEF9CF09CF19CF2 +9CF39CF49CF59CF69CF79CF89CF99CFA9CFB9CFC9CFD9CFE9CFF9D009D019D02 +9D039D049D059D069D079D089D099D0A9D0B9D0C9D0D9D0E9D0F9D109D119D12 +9D139D149D159D169D179D189D199D1A9D1B9D1C9D1D9D1E9D1F9D209D210000 +9D229D239D249D259D269D279D289D299D2A9D2B9D2C9D2D9D2E9D2F9D309D31 +9D329D339D349D359D369D379D389D399D3A9D3B9D3C9D3D9D3E9D3F9D409D41 +9D42000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +F9 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +9D439D449D459D469D479D489D499D4A9D4B9D4C9D4D9D4E9D4F9D509D519D52 +9D539D549D559D569D579D589D599D5A9D5B9D5C9D5D9D5E9D5F9D609D619D62 +9D639D649D659D669D679D689D699D6A9D6B9D6C9D6D9D6E9D6F9D709D719D72 +9D739D749D759D769D779D789D799D7A9D7B9D7C9D7D9D7E9D7F9D809D810000 +9D829D839D849D859D869D879D889D899D8A9D8B9D8C9D8D9D8E9D8F9D909D91 +9D929D939D949D959D969D979D989D999D9A9D9B9D9C9D9D9D9E9D9F9DA09DA1 +9DA2000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +FA +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +9DA39DA49DA59DA69DA79DA89DA99DAA9DAB9DAC9DAD9DAE9DAF9DB09DB19DB2 +9DB39DB49DB59DB69DB79DB89DB99DBA9DBB9DBC9DBD9DBE9DBF9DC09DC19DC2 +9DC39DC49DC59DC69DC79DC89DC99DCA9DCB9DCC9DCD9DCE9DCF9DD09DD19DD2 +9DD39DD49DD59DD69DD79DD89DD99DDA9DDB9DDC9DDD9DDE9DDF9DE09DE10000 +9DE29DE39DE49DE59DE69DE79DE89DE99DEA9DEB9DEC9DED9DEE9DEF9DF09DF1 +9DF29DF39DF49DF59DF69DF79DF89DF99DFA9DFB9DFC9DFD9DFE9DFF9E009E01 +9E02000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +FB +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +9E039E049E059E069E079E089E099E0A9E0B9E0C9E0D9E0E9E0F9E109E119E12 +9E139E149E159E169E179E189E199E1A9E1B9E1C9E1D9E1E9E249E279E2E9E30 +9E349E3B9E3C9E409E4D9E509E529E539E549E569E599E5D9E5F9E609E619E62 +9E659E6E9E6F9E729E749E759E769E779E789E799E7A9E7B9E7C9E7D9E800000 +9E819E839E849E859E869E899E8A9E8C9E8D9E8E9E8F9E909E919E949E959E96 +9E979E989E999E9A9E9B9E9C9E9E9EA09EA19EA29EA39EA49EA59EA79EA89EA9 +9EAA000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +FC +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +9EAB9EAC9EAD9EAE9EAF9EB09EB19EB29EB39EB59EB69EB79EB99EBA9EBC9EBF +9EC09EC19EC29EC39EC59EC69EC79EC89ECA9ECB9ECC9ED09ED29ED39ED59ED6 +9ED79ED99EDA9EDE9EE19EE39EE49EE69EE89EEB9EEC9EED9EEE9EF09EF19EF2 +9EF39EF49EF59EF69EF79EF89EFA9EFD9EFF9F009F019F029F039F049F050000 +9F069F079F089F099F0A9F0C9F0F9F119F129F149F159F169F189F1A9F1B9F1C +9F1D9F1E9F1F9F219F239F249F259F269F279F289F299F2A9F2B9F2D9F2E9F30 +9F31000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +FD +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +9F329F339F349F359F369F389F3A9F3C9F3F9F409F419F429F439F459F469F47 +9F489F499F4A9F4B9F4C9F4D9F4E9F4F9F529F539F549F559F569F579F589F59 +9F5A9F5B9F5C9F5D9F5E9F5F9F609F619F629F639F649F659F669F679F689F69 +9F6A9F6B9F6C9F6D9F6E9F6F9F709F719F729F739F749F759F769F779F780000 +9F799F7A9F7B9F7C9F7D9F7E9F819F829F8D9F8E9F8F9F909F919F929F939F94 +9F959F969F979F989F9C9F9D9F9E9FA19FA29FA39FA49FA5F92CF979F995F9E7 +F9F1000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +FE +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +FA0CFA0DFA0EFA0FFA11FA13FA14FA18FA1FFA20FA21FA23FA24FA27FA28FA29 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 diff --git a/env/tcl/tcl8.6/encoding/cp949.enc b/env/tcl/tcl8.6/encoding/cp949.enc new file mode 100644 index 0000000..2f3ec39 --- /dev/null +++ b/env/tcl/tcl8.6/encoding/cp949.enc @@ -0,0 +1,2128 @@ +# Encoding file: cp949, multi-byte +M +003F 0 125 +00 +0000000100020003000400050006000700080009000A000B000C000D000E000F +0010001100120013001400150016001700180019001A001B001C001D001E001F +0020002100220023002400250026002700280029002A002B002C002D002E002F +0030003100320033003400350036003700380039003A003B003C003D003E003F +0040004100420043004400450046004700480049004A004B004C004D004E004F +0050005100520053005400550056005700580059005A005B005C005D005E005F +0060006100620063006400650066006700680069006A006B006C006D006E006F +0070007100720073007400750076007700780079007A007B007C007D007E007F +0080000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +81 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000AC02AC03AC05AC06AC0BAC0CAC0DAC0EAC0FAC18AC1EAC1FAC21AC22AC23 +AC25AC26AC27AC28AC29AC2AAC2BAC2EAC32AC33AC3400000000000000000000 +0000AC35AC36AC37AC3AAC3BAC3DAC3EAC3FAC41AC42AC43AC44AC45AC46AC47 +AC48AC49AC4AAC4CAC4EAC4FAC50AC51AC52AC53AC5500000000000000000000 +0000AC56AC57AC59AC5AAC5BAC5DAC5EAC5FAC60AC61AC62AC63AC64AC65AC66 +AC67AC68AC69AC6AAC6BAC6CAC6DAC6EAC6FAC72AC73AC75AC76AC79AC7BAC7C +AC7DAC7EAC7FAC82AC87AC88AC8DAC8EAC8FAC91AC92AC93AC95AC96AC97AC98 +AC99AC9AAC9BAC9EACA2ACA3ACA4ACA5ACA6ACA7ACABACADACAEACB1ACB2ACB3 +ACB4ACB5ACB6ACB7ACBAACBEACBFACC0ACC2ACC3ACC5ACC6ACC7ACC9ACCAACCB +ACCDACCEACCFACD0ACD1ACD2ACD3ACD4ACD6ACD8ACD9ACDAACDBACDCACDDACDE +ACDFACE2ACE3ACE5ACE6ACE9ACEBACEDACEEACF2ACF4ACF7ACF8ACF9ACFAACFB +ACFEACFFAD01AD02AD03AD05AD07AD08AD09AD0AAD0BAD0EAD10AD12AD130000 +82 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000AD14AD15AD16AD17AD19AD1AAD1BAD1DAD1EAD1FAD21AD22AD23AD24AD25 +AD26AD27AD28AD2AAD2BAD2EAD2FAD30AD31AD32AD3300000000000000000000 +0000AD36AD37AD39AD3AAD3BAD3DAD3EAD3FAD40AD41AD42AD43AD46AD48AD4A +AD4BAD4CAD4DAD4EAD4FAD51AD52AD53AD55AD56AD5700000000000000000000 +0000AD59AD5AAD5BAD5CAD5DAD5EAD5FAD60AD62AD64AD65AD66AD67AD68AD69 +AD6AAD6BAD6EAD6FAD71AD72AD77AD78AD79AD7AAD7EAD80AD83AD84AD85AD86 +AD87AD8AAD8BAD8DAD8EAD8FAD91AD92AD93AD94AD95AD96AD97AD98AD99AD9A +AD9BAD9EAD9FADA0ADA1ADA2ADA3ADA5ADA6ADA7ADA8ADA9ADAAADABADACADAD +ADAEADAFADB0ADB1ADB2ADB3ADB4ADB5ADB6ADB8ADB9ADBAADBBADBCADBDADBE +ADBFADC2ADC3ADC5ADC6ADC7ADC9ADCAADCBADCCADCDADCEADCFADD2ADD4ADD5 +ADD6ADD7ADD8ADD9ADDAADDBADDDADDEADDFADE1ADE2ADE3ADE5ADE6ADE7ADE8 +ADE9ADEAADEBADECADEDADEEADEFADF0ADF1ADF2ADF3ADF4ADF5ADF6ADF70000 +83 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000ADFAADFBADFDADFEAE02AE03AE04AE05AE06AE07AE0AAE0CAE0EAE0FAE10 +AE11AE12AE13AE15AE16AE17AE18AE19AE1AAE1BAE1C00000000000000000000 +0000AE1DAE1EAE1FAE20AE21AE22AE23AE24AE25AE26AE27AE28AE29AE2AAE2B +AE2CAE2DAE2EAE2FAE32AE33AE35AE36AE39AE3BAE3C00000000000000000000 +0000AE3DAE3EAE3FAE42AE44AE47AE48AE49AE4BAE4FAE51AE52AE53AE55AE57 +AE58AE59AE5AAE5BAE5EAE62AE63AE64AE66AE67AE6AAE6BAE6DAE6EAE6FAE71 +AE72AE73AE74AE75AE76AE77AE7AAE7EAE7FAE80AE81AE82AE83AE86AE87AE88 +AE89AE8AAE8BAE8DAE8EAE8FAE90AE91AE92AE93AE94AE95AE96AE97AE98AE99 +AE9AAE9BAE9CAE9DAE9EAE9FAEA0AEA1AEA2AEA3AEA4AEA5AEA6AEA7AEA8AEA9 +AEAAAEABAEACAEADAEAEAEAFAEB0AEB1AEB2AEB3AEB4AEB5AEB6AEB7AEB8AEB9 +AEBAAEBBAEBFAEC1AEC2AEC3AEC5AEC6AEC7AEC8AEC9AECAAECBAECEAED2AED3 +AED4AED5AED6AED7AEDAAEDBAEDDAEDEAEDFAEE0AEE1AEE2AEE3AEE4AEE50000 +84 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000AEE6AEE7AEE9AEEAAEECAEEEAEEFAEF0AEF1AEF2AEF3AEF5AEF6AEF7AEF9 +AEFAAEFBAEFDAEFEAEFFAF00AF01AF02AF03AF04AF0500000000000000000000 +0000AF06AF09AF0AAF0BAF0CAF0EAF0FAF11AF12AF13AF14AF15AF16AF17AF18 +AF19AF1AAF1BAF1CAF1DAF1EAF1FAF20AF21AF22AF2300000000000000000000 +0000AF24AF25AF26AF27AF28AF29AF2AAF2BAF2EAF2FAF31AF33AF35AF36AF37 +AF38AF39AF3AAF3BAF3EAF40AF44AF45AF46AF47AF4AAF4BAF4CAF4DAF4EAF4F +AF51AF52AF53AF54AF55AF56AF57AF58AF59AF5AAF5BAF5EAF5FAF60AF61AF62 +AF63AF66AF67AF68AF69AF6AAF6BAF6CAF6DAF6EAF6FAF70AF71AF72AF73AF74 +AF75AF76AF77AF78AF7AAF7BAF7CAF7DAF7EAF7FAF81AF82AF83AF85AF86AF87 +AF89AF8AAF8BAF8CAF8DAF8EAF8FAF92AF93AF94AF96AF97AF98AF99AF9AAF9B +AF9DAF9EAF9FAFA0AFA1AFA2AFA3AFA4AFA5AFA6AFA7AFA8AFA9AFAAAFABAFAC +AFADAFAEAFAFAFB0AFB1AFB2AFB3AFB4AFB5AFB6AFB7AFBAAFBBAFBDAFBE0000 +85 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000AFBFAFC1AFC2AFC3AFC4AFC5AFC6AFCAAFCCAFCFAFD0AFD1AFD2AFD3AFD5 +AFD6AFD7AFD8AFD9AFDAAFDBAFDDAFDEAFDFAFE0AFE100000000000000000000 +0000AFE2AFE3AFE4AFE5AFE6AFE7AFEAAFEBAFECAFEDAFEEAFEFAFF2AFF3AFF5 +AFF6AFF7AFF9AFFAAFFBAFFCAFFDAFFEAFFFB002B00300000000000000000000 +0000B005B006B007B008B009B00AB00BB00DB00EB00FB011B012B013B015B016 +B017B018B019B01AB01BB01EB01FB020B021B022B023B024B025B026B027B029 +B02AB02BB02CB02DB02EB02FB030B031B032B033B034B035B036B037B038B039 +B03AB03BB03CB03DB03EB03FB040B041B042B043B046B047B049B04BB04DB04F +B050B051B052B056B058B05AB05BB05CB05EB05FB060B061B062B063B064B065 +B066B067B068B069B06AB06BB06CB06DB06EB06FB070B071B072B073B074B075 +B076B077B078B079B07AB07BB07EB07FB081B082B083B085B086B087B088B089 +B08AB08BB08EB090B092B093B094B095B096B097B09BB09DB09EB0A3B0A40000 +86 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000B0A5B0A6B0A7B0AAB0B0B0B2B0B6B0B7B0B9B0BAB0BBB0BDB0BEB0BFB0C0 +B0C1B0C2B0C3B0C6B0CAB0CBB0CCB0CDB0CEB0CFB0D200000000000000000000 +0000B0D3B0D5B0D6B0D7B0D9B0DAB0DBB0DCB0DDB0DEB0DFB0E1B0E2B0E3B0E4 +B0E6B0E7B0E8B0E9B0EAB0EBB0ECB0EDB0EEB0EFB0F000000000000000000000 +0000B0F1B0F2B0F3B0F4B0F5B0F6B0F7B0F8B0F9B0FAB0FBB0FCB0FDB0FEB0FF +B100B101B102B103B104B105B106B107B10AB10DB10EB10FB111B114B115B116 +B117B11AB11EB11FB120B121B122B126B127B129B12AB12BB12DB12EB12FB130 +B131B132B133B136B13AB13BB13CB13DB13EB13FB142B143B145B146B147B149 +B14AB14BB14CB14DB14EB14FB152B153B156B157B159B15AB15BB15DB15EB15F +B161B162B163B164B165B166B167B168B169B16AB16BB16CB16DB16EB16FB170 +B171B172B173B174B175B176B177B17AB17BB17DB17EB17FB181B183B184B185 +B186B187B18AB18CB18EB18FB190B191B195B196B197B199B19AB19BB19D0000 +87 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000B19EB19FB1A0B1A1B1A2B1A3B1A4B1A5B1A6B1A7B1A9B1AAB1ABB1ACB1AD +B1AEB1AFB1B0B1B1B1B2B1B3B1B4B1B5B1B6B1B7B1B800000000000000000000 +0000B1B9B1BAB1BBB1BCB1BDB1BEB1BFB1C0B1C1B1C2B1C3B1C4B1C5B1C6B1C7 +B1C8B1C9B1CAB1CBB1CDB1CEB1CFB1D1B1D2B1D3B1D500000000000000000000 +0000B1D6B1D7B1D8B1D9B1DAB1DBB1DEB1E0B1E1B1E2B1E3B1E4B1E5B1E6B1E7 +B1EAB1EBB1EDB1EEB1EFB1F1B1F2B1F3B1F4B1F5B1F6B1F7B1F8B1FAB1FCB1FE +B1FFB200B201B202B203B206B207B209B20AB20DB20EB20FB210B211B212B213 +B216B218B21AB21BB21CB21DB21EB21FB221B222B223B224B225B226B227B228 +B229B22AB22BB22CB22DB22EB22FB230B231B232B233B235B236B237B238B239 +B23AB23BB23DB23EB23FB240B241B242B243B244B245B246B247B248B249B24A +B24BB24CB24DB24EB24FB250B251B252B253B254B255B256B257B259B25AB25B +B25DB25EB25FB261B262B263B264B265B266B267B26AB26BB26CB26DB26E0000 +88 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000B26FB270B271B272B273B276B277B278B279B27AB27BB27DB27EB27FB280 +B281B282B283B286B287B288B28AB28BB28CB28DB28E00000000000000000000 +0000B28FB292B293B295B296B297B29BB29CB29DB29EB29FB2A2B2A4B2A7B2A8 +B2A9B2ABB2ADB2AEB2AFB2B1B2B2B2B3B2B5B2B6B2B700000000000000000000 +0000B2B8B2B9B2BAB2BBB2BCB2BDB2BEB2BFB2C0B2C1B2C2B2C3B2C4B2C5B2C6 +B2C7B2CAB2CBB2CDB2CEB2CFB2D1B2D3B2D4B2D5B2D6B2D7B2DAB2DCB2DEB2DF +B2E0B2E1B2E3B2E7B2E9B2EAB2F0B2F1B2F2B2F6B2FCB2FDB2FEB302B303B305 +B306B307B309B30AB30BB30CB30DB30EB30FB312B316B317B318B319B31AB31B +B31DB31EB31FB320B321B322B323B324B325B326B327B328B329B32AB32BB32C +B32DB32EB32FB330B331B332B333B334B335B336B337B338B339B33AB33BB33C +B33DB33EB33FB340B341B342B343B344B345B346B347B348B349B34AB34BB34C +B34DB34EB34FB350B351B352B353B357B359B35AB35DB360B361B362B3630000 +89 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000B366B368B36AB36CB36DB36FB372B373B375B376B377B379B37AB37BB37C +B37DB37EB37FB382B386B387B388B389B38AB38BB38D00000000000000000000 +0000B38EB38FB391B392B393B395B396B397B398B399B39AB39BB39CB39DB39E +B39FB3A2B3A3B3A4B3A5B3A6B3A7B3A9B3AAB3ABB3AD00000000000000000000 +0000B3AEB3AFB3B0B3B1B3B2B3B3B3B4B3B5B3B6B3B7B3B8B3B9B3BAB3BBB3BC +B3BDB3BEB3BFB3C0B3C1B3C2B3C3B3C6B3C7B3C9B3CAB3CDB3CFB3D1B3D2B3D3 +B3D6B3D8B3DAB3DCB3DEB3DFB3E1B3E2B3E3B3E5B3E6B3E7B3E9B3EAB3EBB3EC +B3EDB3EEB3EFB3F0B3F1B3F2B3F3B3F4B3F5B3F6B3F7B3F8B3F9B3FAB3FBB3FD +B3FEB3FFB400B401B402B403B404B405B406B407B408B409B40AB40BB40CB40D +B40EB40FB411B412B413B414B415B416B417B419B41AB41BB41DB41EB41FB421 +B422B423B424B425B426B427B42AB42CB42DB42EB42FB430B431B432B433B435 +B436B437B438B439B43AB43BB43CB43DB43EB43FB440B441B442B443B4440000 +8A +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000B445B446B447B448B449B44AB44BB44CB44DB44EB44FB452B453B455B456 +B457B459B45AB45BB45CB45DB45EB45FB462B464B46600000000000000000000 +0000B467B468B469B46AB46BB46DB46EB46FB470B471B472B473B474B475B476 +B477B478B479B47AB47BB47CB47DB47EB47FB481B48200000000000000000000 +0000B483B484B485B486B487B489B48AB48BB48CB48DB48EB48FB490B491B492 +B493B494B495B496B497B498B499B49AB49BB49CB49EB49FB4A0B4A1B4A2B4A3 +B4A5B4A6B4A7B4A9B4AAB4ABB4ADB4AEB4AFB4B0B4B1B4B2B4B3B4B4B4B6B4B8 +B4BAB4BBB4BCB4BDB4BEB4BFB4C1B4C2B4C3B4C5B4C6B4C7B4C9B4CAB4CBB4CC +B4CDB4CEB4CFB4D1B4D2B4D3B4D4B4D6B4D7B4D8B4D9B4DAB4DBB4DEB4DFB4E1 +B4E2B4E5B4E7B4E8B4E9B4EAB4EBB4EEB4F0B4F2B4F3B4F4B4F5B4F6B4F7B4F9 +B4FAB4FBB4FCB4FDB4FEB4FFB500B501B502B503B504B505B506B507B508B509 +B50AB50BB50CB50DB50EB50FB510B511B512B513B516B517B519B51AB51D0000 +8B +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000B51EB51FB520B521B522B523B526B52BB52CB52DB52EB52FB532B533B535 +B536B537B539B53AB53BB53CB53DB53EB53FB542B54600000000000000000000 +0000B547B548B549B54AB54EB54FB551B552B553B555B556B557B558B559B55A +B55BB55EB562B563B564B565B566B567B568B569B56A00000000000000000000 +0000B56BB56CB56DB56EB56FB570B571B572B573B574B575B576B577B578B579 +B57AB57BB57CB57DB57EB57FB580B581B582B583B584B585B586B587B588B589 +B58AB58BB58CB58DB58EB58FB590B591B592B593B594B595B596B597B598B599 +B59AB59BB59CB59DB59EB59FB5A2B5A3B5A5B5A6B5A7B5A9B5ACB5ADB5AEB5AF +B5B2B5B6B5B7B5B8B5B9B5BAB5BEB5BFB5C1B5C2B5C3B5C5B5C6B5C7B5C8B5C9 +B5CAB5CBB5CEB5D2B5D3B5D4B5D5B5D6B5D7B5D9B5DAB5DBB5DCB5DDB5DEB5DF +B5E0B5E1B5E2B5E3B5E4B5E5B5E6B5E7B5E8B5E9B5EAB5EBB5EDB5EEB5EFB5F0 +B5F1B5F2B5F3B5F4B5F5B5F6B5F7B5F8B5F9B5FAB5FBB5FCB5FDB5FEB5FF0000 +8C +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000B600B601B602B603B604B605B606B607B608B609B60AB60BB60CB60DB60E +B60FB612B613B615B616B617B619B61AB61BB61CB61D00000000000000000000 +0000B61EB61FB620B621B622B623B624B626B627B628B629B62AB62BB62DB62E +B62FB630B631B632B633B635B636B637B638B639B63A00000000000000000000 +0000B63BB63CB63DB63EB63FB640B641B642B643B644B645B646B647B649B64A +B64BB64CB64DB64EB64FB650B651B652B653B654B655B656B657B658B659B65A +B65BB65CB65DB65EB65FB660B661B662B663B665B666B667B669B66AB66BB66C +B66DB66EB66FB670B671B672B673B674B675B676B677B678B679B67AB67BB67C +B67DB67EB67FB680B681B682B683B684B685B686B687B688B689B68AB68BB68C +B68DB68EB68FB690B691B692B693B694B695B696B697B698B699B69AB69BB69E +B69FB6A1B6A2B6A3B6A5B6A6B6A7B6A8B6A9B6AAB6ADB6AEB6AFB6B0B6B2B6B3 +B6B4B6B5B6B6B6B7B6B8B6B9B6BAB6BBB6BCB6BDB6BEB6BFB6C0B6C1B6C20000 +8D +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000B6C3B6C4B6C5B6C6B6C7B6C8B6C9B6CAB6CBB6CCB6CDB6CEB6CFB6D0B6D1 +B6D2B6D3B6D5B6D6B6D7B6D8B6D9B6DAB6DBB6DCB6DD00000000000000000000 +0000B6DEB6DFB6E0B6E1B6E2B6E3B6E4B6E5B6E6B6E7B6E8B6E9B6EAB6EBB6EC +B6EDB6EEB6EFB6F1B6F2B6F3B6F5B6F6B6F7B6F9B6FA00000000000000000000 +0000B6FBB6FCB6FDB6FEB6FFB702B703B704B706B707B708B709B70AB70BB70C +B70DB70EB70FB710B711B712B713B714B715B716B717B718B719B71AB71BB71C +B71DB71EB71FB720B721B722B723B724B725B726B727B72AB72BB72DB72EB731 +B732B733B734B735B736B737B73AB73CB73DB73EB73FB740B741B742B743B745 +B746B747B749B74AB74BB74DB74EB74FB750B751B752B753B756B757B758B759 +B75AB75BB75CB75DB75EB75FB761B762B763B765B766B767B769B76AB76BB76C +B76DB76EB76FB772B774B776B777B778B779B77AB77BB77EB77FB781B782B783 +B785B786B787B788B789B78AB78BB78EB793B794B795B79AB79BB79DB79E0000 +8E +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000B79FB7A1B7A2B7A3B7A4B7A5B7A6B7A7B7AAB7AEB7AFB7B0B7B1B7B2B7B3 +B7B6B7B7B7B9B7BAB7BBB7BCB7BDB7BEB7BFB7C0B7C100000000000000000000 +0000B7C2B7C3B7C4B7C5B7C6B7C8B7CAB7CBB7CCB7CDB7CEB7CFB7D0B7D1B7D2 +B7D3B7D4B7D5B7D6B7D7B7D8B7D9B7DAB7DBB7DCB7DD00000000000000000000 +0000B7DEB7DFB7E0B7E1B7E2B7E3B7E4B7E5B7E6B7E7B7E8B7E9B7EAB7EBB7EE +B7EFB7F1B7F2B7F3B7F5B7F6B7F7B7F8B7F9B7FAB7FBB7FEB802B803B804B805 +B806B80AB80BB80DB80EB80FB811B812B813B814B815B816B817B81AB81CB81E +B81FB820B821B822B823B826B827B829B82AB82BB82DB82EB82FB830B831B832 +B833B836B83AB83BB83CB83DB83EB83FB841B842B843B845B846B847B848B849 +B84AB84BB84CB84DB84EB84FB850B852B854B855B856B857B858B859B85AB85B +B85EB85FB861B862B863B865B866B867B868B869B86AB86BB86EB870B872B873 +B874B875B876B877B879B87AB87BB87DB87EB87FB880B881B882B883B8840000 +8F +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000B885B886B887B888B889B88AB88BB88CB88EB88FB890B891B892B893B894 +B895B896B897B898B899B89AB89BB89CB89DB89EB89F00000000000000000000 +0000B8A0B8A1B8A2B8A3B8A4B8A5B8A6B8A7B8A9B8AAB8ABB8ACB8ADB8AEB8AF +B8B1B8B2B8B3B8B5B8B6B8B7B8B9B8BAB8BBB8BCB8BD00000000000000000000 +0000B8BEB8BFB8C2B8C4B8C6B8C7B8C8B8C9B8CAB8CBB8CDB8CEB8CFB8D1B8D2 +B8D3B8D5B8D6B8D7B8D8B8D9B8DAB8DBB8DCB8DEB8E0B8E2B8E3B8E4B8E5B8E6 +B8E7B8EAB8EBB8EDB8EEB8EFB8F1B8F2B8F3B8F4B8F5B8F6B8F7B8FAB8FCB8FE +B8FFB900B901B902B903B905B906B907B908B909B90AB90BB90CB90DB90EB90F +B910B911B912B913B914B915B916B917B919B91AB91BB91CB91DB91EB91FB921 +B922B923B924B925B926B927B928B929B92AB92BB92CB92DB92EB92FB930B931 +B932B933B934B935B936B937B938B939B93AB93BB93EB93FB941B942B943B945 +B946B947B948B949B94AB94BB94DB94EB950B952B953B954B955B956B9570000 +90 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000B95AB95BB95DB95EB95FB961B962B963B964B965B966B967B96AB96CB96E +B96FB970B971B972B973B976B977B979B97AB97BB97D00000000000000000000 +0000B97EB97FB980B981B982B983B986B988B98BB98CB98FB990B991B992B993 +B994B995B996B997B998B999B99AB99BB99CB99DB99E00000000000000000000 +0000B99FB9A0B9A1B9A2B9A3B9A4B9A5B9A6B9A7B9A8B9A9B9AAB9ABB9AEB9AF +B9B1B9B2B9B3B9B5B9B6B9B7B9B8B9B9B9BAB9BBB9BEB9C0B9C2B9C3B9C4B9C5 +B9C6B9C7B9CAB9CBB9CDB9D3B9D4B9D5B9D6B9D7B9DAB9DCB9DFB9E0B9E2B9E6 +B9E7B9E9B9EAB9EBB9EDB9EEB9EFB9F0B9F1B9F2B9F3B9F6B9FBB9FCB9FDB9FE +B9FFBA02BA03BA04BA05BA06BA07BA09BA0ABA0BBA0CBA0DBA0EBA0FBA10BA11 +BA12BA13BA14BA16BA17BA18BA19BA1ABA1BBA1CBA1DBA1EBA1FBA20BA21BA22 +BA23BA24BA25BA26BA27BA28BA29BA2ABA2BBA2CBA2DBA2EBA2FBA30BA31BA32 +BA33BA34BA35BA36BA37BA3ABA3BBA3DBA3EBA3FBA41BA43BA44BA45BA460000 +91 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000BA47BA4ABA4CBA4FBA50BA51BA52BA56BA57BA59BA5ABA5BBA5DBA5EBA5F +BA60BA61BA62BA63BA66BA6ABA6BBA6CBA6DBA6EBA6F00000000000000000000 +0000BA72BA73BA75BA76BA77BA79BA7ABA7BBA7CBA7DBA7EBA7FBA80BA81BA82 +BA86BA88BA89BA8ABA8BBA8DBA8EBA8FBA90BA91BA9200000000000000000000 +0000BA93BA94BA95BA96BA97BA98BA99BA9ABA9BBA9CBA9DBA9EBA9FBAA0BAA1 +BAA2BAA3BAA4BAA5BAA6BAA7BAAABAADBAAEBAAFBAB1BAB3BAB4BAB5BAB6BAB7 +BABABABCBABEBABFBAC0BAC1BAC2BAC3BAC5BAC6BAC7BAC9BACABACBBACCBACD +BACEBACFBAD0BAD1BAD2BAD3BAD4BAD5BAD6BAD7BADABADBBADCBADDBADEBADF +BAE0BAE1BAE2BAE3BAE4BAE5BAE6BAE7BAE8BAE9BAEABAEBBAECBAEDBAEEBAEF +BAF0BAF1BAF2BAF3BAF4BAF5BAF6BAF7BAF8BAF9BAFABAFBBAFDBAFEBAFFBB01 +BB02BB03BB05BB06BB07BB08BB09BB0ABB0BBB0CBB0EBB10BB12BB13BB14BB15 +BB16BB17BB19BB1ABB1BBB1DBB1EBB1FBB21BB22BB23BB24BB25BB26BB270000 +92 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000BB28BB2ABB2CBB2DBB2EBB2FBB30BB31BB32BB33BB37BB39BB3ABB3FBB40 +BB41BB42BB43BB46BB48BB4ABB4BBB4CBB4EBB51BB5200000000000000000000 +0000BB53BB55BB56BB57BB59BB5ABB5BBB5CBB5DBB5EBB5FBB60BB62BB64BB65 +BB66BB67BB68BB69BB6ABB6BBB6DBB6EBB6FBB70BB7100000000000000000000 +0000BB72BB73BB74BB75BB76BB77BB78BB79BB7ABB7BBB7CBB7DBB7EBB7FBB80 +BB81BB82BB83BB84BB85BB86BB87BB89BB8ABB8BBB8DBB8EBB8FBB91BB92BB93 +BB94BB95BB96BB97BB98BB99BB9ABB9BBB9CBB9DBB9EBB9FBBA0BBA1BBA2BBA3 +BBA5BBA6BBA7BBA9BBAABBABBBADBBAEBBAFBBB0BBB1BBB2BBB3BBB5BBB6BBB8 +BBB9BBBABBBBBBBCBBBDBBBEBBBFBBC1BBC2BBC3BBC5BBC6BBC7BBC9BBCABBCB +BBCCBBCDBBCEBBCFBBD1BBD2BBD4BBD5BBD6BBD7BBD8BBD9BBDABBDBBBDCBBDD +BBDEBBDFBBE0BBE1BBE2BBE3BBE4BBE5BBE6BBE7BBE8BBE9BBEABBEBBBECBBED +BBEEBBEFBBF0BBF1BBF2BBF3BBF4BBF5BBF6BBF7BBFABBFBBBFDBBFEBC010000 +93 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000BC03BC04BC05BC06BC07BC0ABC0EBC10BC12BC13BC19BC1ABC20BC21BC22 +BC23BC26BC28BC2ABC2BBC2CBC2EBC2FBC32BC33BC3500000000000000000000 +0000BC36BC37BC39BC3ABC3BBC3CBC3DBC3EBC3FBC42BC46BC47BC48BC4ABC4B +BC4EBC4FBC51BC52BC53BC54BC55BC56BC57BC58BC5900000000000000000000 +0000BC5ABC5BBC5CBC5EBC5FBC60BC61BC62BC63BC64BC65BC66BC67BC68BC69 +BC6ABC6BBC6CBC6DBC6EBC6FBC70BC71BC72BC73BC74BC75BC76BC77BC78BC79 +BC7ABC7BBC7CBC7DBC7EBC7FBC80BC81BC82BC83BC86BC87BC89BC8ABC8DBC8F +BC90BC91BC92BC93BC96BC98BC9BBC9CBC9DBC9EBC9FBCA2BCA3BCA5BCA6BCA9 +BCAABCABBCACBCADBCAEBCAFBCB2BCB6BCB7BCB8BCB9BCBABCBBBCBEBCBFBCC1 +BCC2BCC3BCC5BCC6BCC7BCC8BCC9BCCABCCBBCCCBCCEBCD2BCD3BCD4BCD6BCD7 +BCD9BCDABCDBBCDDBCDEBCDFBCE0BCE1BCE2BCE3BCE4BCE5BCE6BCE7BCE8BCE9 +BCEABCEBBCECBCEDBCEEBCEFBCF0BCF1BCF2BCF3BCF7BCF9BCFABCFBBCFD0000 +94 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000BCFEBCFFBD00BD01BD02BD03BD06BD08BD0ABD0BBD0CBD0DBD0EBD0FBD11 +BD12BD13BD15BD16BD17BD18BD19BD1ABD1BBD1CBD1D00000000000000000000 +0000BD1EBD1FBD20BD21BD22BD23BD25BD26BD27BD28BD29BD2ABD2BBD2DBD2E +BD2FBD30BD31BD32BD33BD34BD35BD36BD37BD38BD3900000000000000000000 +0000BD3ABD3BBD3CBD3DBD3EBD3FBD41BD42BD43BD44BD45BD46BD47BD4ABD4B +BD4DBD4EBD4FBD51BD52BD53BD54BD55BD56BD57BD5ABD5BBD5CBD5DBD5EBD5F +BD60BD61BD62BD63BD65BD66BD67BD69BD6ABD6BBD6CBD6DBD6EBD6FBD70BD71 +BD72BD73BD74BD75BD76BD77BD78BD79BD7ABD7BBD7CBD7DBD7EBD7FBD82BD83 +BD85BD86BD8BBD8CBD8DBD8EBD8FBD92BD94BD96BD97BD98BD9BBD9DBD9EBD9F +BDA0BDA1BDA2BDA3BDA5BDA6BDA7BDA8BDA9BDAABDABBDACBDADBDAEBDAFBDB1 +BDB2BDB3BDB4BDB5BDB6BDB7BDB9BDBABDBBBDBCBDBDBDBEBDBFBDC0BDC1BDC2 +BDC3BDC4BDC5BDC6BDC7BDC8BDC9BDCABDCBBDCCBDCDBDCEBDCFBDD0BDD10000 +95 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000BDD2BDD3BDD6BDD7BDD9BDDABDDBBDDDBDDEBDDFBDE0BDE1BDE2BDE3BDE4 +BDE5BDE6BDE7BDE8BDEABDEBBDECBDEDBDEEBDEFBDF100000000000000000000 +0000BDF2BDF3BDF5BDF6BDF7BDF9BDFABDFBBDFCBDFDBDFEBDFFBE01BE02BE04 +BE06BE07BE08BE09BE0ABE0BBE0EBE0FBE11BE12BE1300000000000000000000 +0000BE15BE16BE17BE18BE19BE1ABE1BBE1EBE20BE21BE22BE23BE24BE25BE26 +BE27BE28BE29BE2ABE2BBE2CBE2DBE2EBE2FBE30BE31BE32BE33BE34BE35BE36 +BE37BE38BE39BE3ABE3BBE3CBE3DBE3EBE3FBE40BE41BE42BE43BE46BE47BE49 +BE4ABE4BBE4DBE4FBE50BE51BE52BE53BE56BE58BE5CBE5DBE5EBE5FBE62BE63 +BE65BE66BE67BE69BE6BBE6CBE6DBE6EBE6FBE72BE76BE77BE78BE79BE7ABE7E +BE7FBE81BE82BE83BE85BE86BE87BE88BE89BE8ABE8BBE8EBE92BE93BE94BE95 +BE96BE97BE9ABE9BBE9CBE9DBE9EBE9FBEA0BEA1BEA2BEA3BEA4BEA5BEA6BEA7 +BEA9BEAABEABBEACBEADBEAEBEAFBEB0BEB1BEB2BEB3BEB4BEB5BEB6BEB70000 +96 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000BEB8BEB9BEBABEBBBEBCBEBDBEBEBEBFBEC0BEC1BEC2BEC3BEC4BEC5BEC6 +BEC7BEC8BEC9BECABECBBECCBECDBECEBECFBED2BED300000000000000000000 +0000BED5BED6BED9BEDABEDBBEDCBEDDBEDEBEDFBEE1BEE2BEE6BEE7BEE8BEE9 +BEEABEEBBEEDBEEEBEEFBEF0BEF1BEF2BEF3BEF4BEF500000000000000000000 +0000BEF6BEF7BEF8BEF9BEFABEFBBEFCBEFDBEFEBEFFBF00BF02BF03BF04BF05 +BF06BF07BF0ABF0BBF0CBF0DBF0EBF0FBF10BF11BF12BF13BF14BF15BF16BF17 +BF1ABF1EBF1FBF20BF21BF22BF23BF24BF25BF26BF27BF28BF29BF2ABF2BBF2C +BF2DBF2EBF2FBF30BF31BF32BF33BF34BF35BF36BF37BF38BF39BF3ABF3BBF3C +BF3DBF3EBF3FBF42BF43BF45BF46BF47BF49BF4ABF4BBF4CBF4DBF4EBF4FBF52 +BF53BF54BF56BF57BF58BF59BF5ABF5BBF5CBF5DBF5EBF5FBF60BF61BF62BF63 +BF64BF65BF66BF67BF68BF69BF6ABF6BBF6CBF6DBF6EBF6FBF70BF71BF72BF73 +BF74BF75BF76BF77BF78BF79BF7ABF7BBF7CBF7DBF7EBF7FBF80BF81BF820000 +97 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000BF83BF84BF85BF86BF87BF88BF89BF8ABF8BBF8CBF8DBF8EBF8FBF90BF91 +BF92BF93BF95BF96BF97BF98BF99BF9ABF9BBF9CBF9D00000000000000000000 +0000BF9EBF9FBFA0BFA1BFA2BFA3BFA4BFA5BFA6BFA7BFA8BFA9BFAABFABBFAC +BFADBFAEBFAFBFB1BFB2BFB3BFB4BFB5BFB6BFB7BFB800000000000000000000 +0000BFB9BFBABFBBBFBCBFBDBFBEBFBFBFC0BFC1BFC2BFC3BFC4BFC6BFC7BFC8 +BFC9BFCABFCBBFCEBFCFBFD1BFD2BFD3BFD5BFD6BFD7BFD8BFD9BFDABFDBBFDD +BFDEBFE0BFE2BFE3BFE4BFE5BFE6BFE7BFE8BFE9BFEABFEBBFECBFEDBFEEBFEF +BFF0BFF1BFF2BFF3BFF4BFF5BFF6BFF7BFF8BFF9BFFABFFBBFFCBFFDBFFEBFFF +C000C001C002C003C004C005C006C007C008C009C00AC00BC00CC00DC00EC00F +C010C011C012C013C014C015C016C017C018C019C01AC01BC01CC01DC01EC01F +C020C021C022C023C024C025C026C027C028C029C02AC02BC02CC02DC02EC02F +C030C031C032C033C034C035C036C037C038C039C03AC03BC03DC03EC03F0000 +98 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000C040C041C042C043C044C045C046C047C048C049C04AC04BC04CC04DC04E +C04FC050C052C053C054C055C056C057C059C05AC05B00000000000000000000 +0000C05DC05EC05FC061C062C063C064C065C066C067C06AC06BC06CC06DC06E +C06FC070C071C072C073C074C075C076C077C078C07900000000000000000000 +0000C07AC07BC07CC07DC07EC07FC080C081C082C083C084C085C086C087C088 +C089C08AC08BC08CC08DC08EC08FC092C093C095C096C097C099C09AC09BC09C +C09DC09EC09FC0A2C0A4C0A6C0A7C0A8C0A9C0AAC0ABC0AEC0B1C0B2C0B7C0B8 +C0B9C0BAC0BBC0BEC0C2C0C3C0C4C0C6C0C7C0CAC0CBC0CDC0CEC0CFC0D1C0D2 +C0D3C0D4C0D5C0D6C0D7C0DAC0DEC0DFC0E0C0E1C0E2C0E3C0E6C0E7C0E9C0EA +C0EBC0EDC0EEC0EFC0F0C0F1C0F2C0F3C0F6C0F8C0FAC0FBC0FCC0FDC0FEC0FF +C101C102C103C105C106C107C109C10AC10BC10CC10DC10EC10FC111C112C113 +C114C116C117C118C119C11AC11BC121C122C125C128C129C12AC12BC12E0000 +99 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000C132C133C134C135C137C13AC13BC13DC13EC13FC141C142C143C144C145 +C146C147C14AC14EC14FC150C151C152C153C156C15700000000000000000000 +0000C159C15AC15BC15DC15EC15FC160C161C162C163C166C16AC16BC16CC16D +C16EC16FC171C172C173C175C176C177C179C17AC17B00000000000000000000 +0000C17CC17DC17EC17FC180C181C182C183C184C186C187C188C189C18AC18B +C18FC191C192C193C195C197C198C199C19AC19BC19EC1A0C1A2C1A3C1A4C1A6 +C1A7C1AAC1ABC1ADC1AEC1AFC1B1C1B2C1B3C1B4C1B5C1B6C1B7C1B8C1B9C1BA +C1BBC1BCC1BEC1BFC1C0C1C1C1C2C1C3C1C5C1C6C1C7C1C9C1CAC1CBC1CDC1CE +C1CFC1D0C1D1C1D2C1D3C1D5C1D6C1D9C1DAC1DBC1DCC1DDC1DEC1DFC1E1C1E2 +C1E3C1E5C1E6C1E7C1E9C1EAC1EBC1ECC1EDC1EEC1EFC1F2C1F4C1F5C1F6C1F7 +C1F8C1F9C1FAC1FBC1FEC1FFC201C202C203C205C206C207C208C209C20AC20B +C20EC210C212C213C214C215C216C217C21AC21BC21DC21EC221C222C2230000 +9A +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000C224C225C226C227C22AC22CC22EC230C233C235C236C237C238C239C23A +C23BC23CC23DC23EC23FC240C241C242C243C244C24500000000000000000000 +0000C246C247C249C24AC24BC24CC24DC24EC24FC252C253C255C256C257C259 +C25AC25BC25CC25DC25EC25FC261C262C263C264C26600000000000000000000 +0000C267C268C269C26AC26BC26EC26FC271C272C273C275C276C277C278C279 +C27AC27BC27EC280C282C283C284C285C286C287C28AC28BC28CC28DC28EC28F +C291C292C293C294C295C296C297C299C29AC29CC29EC29FC2A0C2A1C2A2C2A3 +C2A6C2A7C2A9C2AAC2ABC2AEC2AFC2B0C2B1C2B2C2B3C2B6C2B8C2BAC2BBC2BC +C2BDC2BEC2BFC2C0C2C1C2C2C2C3C2C4C2C5C2C6C2C7C2C8C2C9C2CAC2CBC2CC +C2CDC2CEC2CFC2D0C2D1C2D2C2D3C2D4C2D5C2D6C2D7C2D8C2D9C2DAC2DBC2DE +C2DFC2E1C2E2C2E5C2E6C2E7C2E8C2E9C2EAC2EEC2F0C2F2C2F3C2F4C2F5C2F7 +C2FAC2FDC2FEC2FFC301C302C303C304C305C306C307C30AC30BC30EC30F0000 +9B +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000C310C311C312C316C317C319C31AC31BC31DC31EC31FC320C321C322C323 +C326C327C32AC32BC32CC32DC32EC32FC330C331C33200000000000000000000 +0000C333C334C335C336C337C338C339C33AC33BC33CC33DC33EC33FC340C341 +C342C343C344C346C347C348C349C34AC34BC34CC34D00000000000000000000 +0000C34EC34FC350C351C352C353C354C355C356C357C358C359C35AC35BC35C +C35DC35EC35FC360C361C362C363C364C365C366C367C36AC36BC36DC36EC36F +C371C373C374C375C376C377C37AC37BC37EC37FC380C381C382C383C385C386 +C387C389C38AC38BC38DC38EC38FC390C391C392C393C394C395C396C397C398 +C399C39AC39BC39CC39DC39EC39FC3A0C3A1C3A2C3A3C3A4C3A5C3A6C3A7C3A8 +C3A9C3AAC3ABC3ACC3ADC3AEC3AFC3B0C3B1C3B2C3B3C3B4C3B5C3B6C3B7C3B8 +C3B9C3BAC3BBC3BCC3BDC3BEC3BFC3C1C3C2C3C3C3C4C3C5C3C6C3C7C3C8C3C9 +C3CAC3CBC3CCC3CDC3CEC3CFC3D0C3D1C3D2C3D3C3D4C3D5C3D6C3D7C3DA0000 +9C +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000C3DBC3DDC3DEC3E1C3E3C3E4C3E5C3E6C3E7C3EAC3EBC3ECC3EEC3EFC3F0 +C3F1C3F2C3F3C3F6C3F7C3F9C3FAC3FBC3FCC3FDC3FE00000000000000000000 +0000C3FFC400C401C402C403C404C405C406C407C409C40AC40BC40CC40DC40E +C40FC411C412C413C414C415C416C417C418C419C41A00000000000000000000 +0000C41BC41CC41DC41EC41FC420C421C422C423C425C426C427C428C429C42A +C42BC42DC42EC42FC431C432C433C435C436C437C438C439C43AC43BC43EC43F +C440C441C442C443C444C445C446C447C449C44AC44BC44CC44DC44EC44FC450 +C451C452C453C454C455C456C457C458C459C45AC45BC45CC45DC45EC45FC460 +C461C462C463C466C467C469C46AC46BC46DC46EC46FC470C471C472C473C476 +C477C478C47AC47BC47CC47DC47EC47FC481C482C483C484C485C486C487C488 +C489C48AC48BC48CC48DC48EC48FC490C491C492C493C495C496C497C498C499 +C49AC49BC49DC49EC49FC4A0C4A1C4A2C4A3C4A4C4A5C4A6C4A7C4A8C4A90000 +9D +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000C4AAC4ABC4ACC4ADC4AEC4AFC4B0C4B1C4B2C4B3C4B4C4B5C4B6C4B7C4B9 +C4BAC4BBC4BDC4BEC4BFC4C0C4C1C4C2C4C3C4C4C4C500000000000000000000 +0000C4C6C4C7C4C8C4C9C4CAC4CBC4CCC4CDC4CEC4CFC4D0C4D1C4D2C4D3C4D4 +C4D5C4D6C4D7C4D8C4D9C4DAC4DBC4DCC4DDC4DEC4DF00000000000000000000 +0000C4E0C4E1C4E2C4E3C4E4C4E5C4E6C4E7C4E8C4EAC4EBC4ECC4EDC4EEC4EF +C4F2C4F3C4F5C4F6C4F7C4F9C4FBC4FCC4FDC4FEC502C503C504C505C506C507 +C508C509C50AC50BC50DC50EC50FC511C512C513C515C516C517C518C519C51A +C51BC51DC51EC51FC520C521C522C523C524C525C526C527C52AC52BC52DC52E +C52FC531C532C533C534C535C536C537C53AC53CC53EC53FC540C541C542C543 +C546C547C54BC54FC550C551C552C556C55AC55BC55CC55FC562C563C565C566 +C567C569C56AC56BC56CC56DC56EC56FC572C576C577C578C579C57AC57BC57E +C57FC581C582C583C585C586C588C589C58AC58BC58EC590C592C593C5940000 +9E +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000C596C599C59AC59BC59DC59EC59FC5A1C5A2C5A3C5A4C5A5C5A6C5A7C5A8 +C5AAC5ABC5ACC5ADC5AEC5AFC5B0C5B1C5B2C5B3C5B600000000000000000000 +0000C5B7C5BAC5BFC5C0C5C1C5C2C5C3C5CBC5CDC5CFC5D2C5D3C5D5C5D6C5D7 +C5D9C5DAC5DBC5DCC5DDC5DEC5DFC5E2C5E4C5E6C5E700000000000000000000 +0000C5E8C5E9C5EAC5EBC5EFC5F1C5F2C5F3C5F5C5F8C5F9C5FAC5FBC602C603 +C604C609C60AC60BC60DC60EC60FC611C612C613C614C615C616C617C61AC61D +C61EC61FC620C621C622C623C626C627C629C62AC62BC62FC631C632C636C638 +C63AC63CC63DC63EC63FC642C643C645C646C647C649C64AC64BC64CC64DC64E +C64FC652C656C657C658C659C65AC65BC65EC65FC661C662C663C664C665C666 +C667C668C669C66AC66BC66DC66EC670C672C673C674C675C676C677C67AC67B +C67DC67EC67FC681C682C683C684C685C686C687C68AC68CC68EC68FC690C691 +C692C693C696C697C699C69AC69BC69DC69EC69FC6A0C6A1C6A2C6A3C6A60000 +9F +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000C6A8C6AAC6ABC6ACC6ADC6AEC6AFC6B2C6B3C6B5C6B6C6B7C6BBC6BCC6BD +C6BEC6BFC6C2C6C4C6C6C6C7C6C8C6C9C6CAC6CBC6CE00000000000000000000 +0000C6CFC6D1C6D2C6D3C6D5C6D6C6D7C6D8C6D9C6DAC6DBC6DEC6DFC6E2C6E3 +C6E4C6E5C6E6C6E7C6EAC6EBC6EDC6EEC6EFC6F1C6F200000000000000000000 +0000C6F3C6F4C6F5C6F6C6F7C6FAC6FBC6FCC6FEC6FFC700C701C702C703C706 +C707C709C70AC70BC70DC70EC70FC710C711C712C713C716C718C71AC71BC71C +C71DC71EC71FC722C723C725C726C727C729C72AC72BC72CC72DC72EC72FC732 +C734C736C738C739C73AC73BC73EC73FC741C742C743C745C746C747C748C749 +C74BC74EC750C759C75AC75BC75DC75EC75FC761C762C763C764C765C766C767 +C769C76AC76CC76DC76EC76FC770C771C772C773C776C777C779C77AC77BC77F +C780C781C782C786C78BC78CC78DC78FC792C793C795C799C79BC79CC79DC79E +C79FC7A2C7A7C7A8C7A9C7AAC7ABC7AEC7AFC7B1C7B2C7B3C7B5C7B6C7B70000 +A0 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000C7B8C7B9C7BAC7BBC7BEC7C2C7C3C7C4C7C5C7C6C7C7C7CAC7CBC7CDC7CF +C7D1C7D2C7D3C7D4C7D5C7D6C7D7C7D9C7DAC7DBC7DC00000000000000000000 +0000C7DEC7DFC7E0C7E1C7E2C7E3C7E5C7E6C7E7C7E9C7EAC7EBC7EDC7EEC7EF +C7F0C7F1C7F2C7F3C7F4C7F5C7F6C7F7C7F8C7F9C7FA00000000000000000000 +0000C7FBC7FCC7FDC7FEC7FFC802C803C805C806C807C809C80BC80CC80DC80E +C80FC812C814C817C818C819C81AC81BC81EC81FC821C822C823C825C826C827 +C828C829C82AC82BC82EC830C832C833C834C835C836C837C839C83AC83BC83D +C83EC83FC841C842C843C844C845C846C847C84AC84BC84EC84FC850C851C852 +C853C855C856C857C858C859C85AC85BC85CC85DC85EC85FC860C861C862C863 +C864C865C866C867C868C869C86AC86BC86CC86DC86EC86FC872C873C875C876 +C877C879C87BC87CC87DC87EC87FC882C884C888C889C88AC88EC88FC890C891 +C892C893C895C896C897C898C899C89AC89BC89CC89EC8A0C8A2C8A3C8A40000 +A1 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000C8A5C8A6C8A7C8A9C8AAC8ABC8ACC8ADC8AEC8AFC8B0C8B1C8B2C8B3C8B4 +C8B5C8B6C8B7C8B8C8B9C8BAC8BBC8BEC8BFC8C0C8C100000000000000000000 +0000C8C2C8C3C8C5C8C6C8C7C8C9C8CAC8CBC8CDC8CEC8CFC8D0C8D1C8D2C8D3 +C8D6C8D8C8DAC8DBC8DCC8DDC8DEC8DFC8E2C8E3C8E500000000000000000000 +0000C8E6C8E7C8E8C8E9C8EAC8EBC8ECC8EDC8EEC8EFC8F0C8F1C8F2C8F3C8F4 +C8F6C8F7C8F8C8F9C8FAC8FBC8FEC8FFC901C902C903C907C908C909C90AC90B +C90E30003001300200B72025202600A8300300AD20152225FF3C223C20182019 +201C201D3014301530083009300A300B300C300D300E300F3010301100B100D7 +00F7226022642265221E223400B0203220332103212BFFE0FFE1FFE526422640 +222022A52312220222072261225200A7203B2606260525CB25CF25CE25C725C6 +25A125A025B325B225BD25BC219221902191219321943013226A226B221A223D +221D2235222B222C2208220B2286228722822283222A222922272228FFE20000 +A2 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000C910C912C913C914C915C916C917C919C91AC91BC91CC91DC91EC91FC920 +C921C922C923C924C925C926C927C928C929C92AC92B00000000000000000000 +0000C92DC92EC92FC930C931C932C933C935C936C937C938C939C93AC93BC93C +C93DC93EC93FC940C941C942C943C944C945C946C94700000000000000000000 +0000C948C949C94AC94BC94CC94DC94EC94FC952C953C955C956C957C959C95A +C95BC95CC95DC95EC95FC962C964C965C966C967C968C969C96AC96BC96DC96E +C96F21D221D42200220300B4FF5E02C702D802DD02DA02D900B802DB00A100BF +02D0222E2211220F00A42109203025C125C025B725B626642660266126652667 +2663229925C825A325D025D1259225A425A525A825A725A625A92668260F260E +261C261E00B62020202121952197219921962198266D2669266A266C327F321C +211633C7212233C233D8212120AC00AE00000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +A3 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000C971C972C973C975C976C977C978C979C97AC97BC97DC97EC97FC980C981 +C982C983C984C985C986C987C98AC98BC98DC98EC98F00000000000000000000 +0000C991C992C993C994C995C996C997C99AC99CC99EC99FC9A0C9A1C9A2C9A3 +C9A4C9A5C9A6C9A7C9A8C9A9C9AAC9ABC9ACC9ADC9AE00000000000000000000 +0000C9AFC9B0C9B1C9B2C9B3C9B4C9B5C9B6C9B7C9B8C9B9C9BAC9BBC9BCC9BD +C9BEC9BFC9C2C9C3C9C5C9C6C9C9C9CBC9CCC9CDC9CEC9CFC9D2C9D4C9D7C9D8 +C9DBFF01FF02FF03FF04FF05FF06FF07FF08FF09FF0AFF0BFF0CFF0DFF0EFF0F +FF10FF11FF12FF13FF14FF15FF16FF17FF18FF19FF1AFF1BFF1CFF1DFF1EFF1F +FF20FF21FF22FF23FF24FF25FF26FF27FF28FF29FF2AFF2BFF2CFF2DFF2EFF2F +FF30FF31FF32FF33FF34FF35FF36FF37FF38FF39FF3AFF3BFFE6FF3DFF3EFF3F +FF40FF41FF42FF43FF44FF45FF46FF47FF48FF49FF4AFF4BFF4CFF4DFF4EFF4F +FF50FF51FF52FF53FF54FF55FF56FF57FF58FF59FF5AFF5BFF5CFF5DFFE30000 +A4 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000C9DEC9DFC9E1C9E3C9E5C9E6C9E8C9E9C9EAC9EBC9EEC9F2C9F3C9F4C9F5 +C9F6C9F7C9FAC9FBC9FDC9FEC9FFCA01CA02CA03CA0400000000000000000000 +0000CA05CA06CA07CA0ACA0ECA0FCA10CA11CA12CA13CA15CA16CA17CA19CA1A +CA1BCA1CCA1DCA1ECA1FCA20CA21CA22CA23CA24CA2500000000000000000000 +0000CA26CA27CA28CA2ACA2BCA2CCA2DCA2ECA2FCA30CA31CA32CA33CA34CA35 +CA36CA37CA38CA39CA3ACA3BCA3CCA3DCA3ECA3FCA40CA41CA42CA43CA44CA45 +CA46313131323133313431353136313731383139313A313B313C313D313E313F +3140314131423143314431453146314731483149314A314B314C314D314E314F +3150315131523153315431553156315731583159315A315B315C315D315E315F +3160316131623163316431653166316731683169316A316B316C316D316E316F +3170317131723173317431753176317731783179317A317B317C317D317E317F +3180318131823183318431853186318731883189318A318B318C318D318E0000 +A5 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000CA47CA48CA49CA4ACA4BCA4ECA4FCA51CA52CA53CA55CA56CA57CA58CA59 +CA5ACA5BCA5ECA62CA63CA64CA65CA66CA67CA69CA6A00000000000000000000 +0000CA6BCA6CCA6DCA6ECA6FCA70CA71CA72CA73CA74CA75CA76CA77CA78CA79 +CA7ACA7BCA7CCA7ECA7FCA80CA81CA82CA83CA85CA8600000000000000000000 +0000CA87CA88CA89CA8ACA8BCA8CCA8DCA8ECA8FCA90CA91CA92CA93CA94CA95 +CA96CA97CA99CA9ACA9BCA9CCA9DCA9ECA9FCAA0CAA1CAA2CAA3CAA4CAA5CAA6 +CAA7217021712172217321742175217621772178217900000000000000000000 +2160216121622163216421652166216721682169000000000000000000000000 +0000039103920393039403950396039703980399039A039B039C039D039E039F +03A003A103A303A403A503A603A703A803A90000000000000000000000000000 +000003B103B203B303B403B503B603B703B803B903BA03BB03BC03BD03BE03BF +03C003C103C303C403C503C603C703C803C90000000000000000000000000000 +A6 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000CAA8CAA9CAAACAABCAACCAADCAAECAAFCAB0CAB1CAB2CAB3CAB4CAB5CAB6 +CAB7CAB8CAB9CABACABBCABECABFCAC1CAC2CAC3CAC500000000000000000000 +0000CAC6CAC7CAC8CAC9CACACACBCACECAD0CAD2CAD4CAD5CAD6CAD7CADACADB +CADCCADDCADECADFCAE1CAE2CAE3CAE4CAE5CAE6CAE700000000000000000000 +0000CAE8CAE9CAEACAEBCAEDCAEECAEFCAF0CAF1CAF2CAF3CAF5CAF6CAF7CAF8 +CAF9CAFACAFBCAFCCAFDCAFECAFFCB00CB01CB02CB03CB04CB05CB06CB07CB09 +CB0A25002502250C251025182514251C252C25242534253C25012503250F2513 +251B251725232533252B253B254B2520252F25282537253F251D253025252538 +254225122511251A251925162515250E250D251E251F25212522252625272529 +252A252D252E25312532253525362539253A253D253E25402541254325442545 +2546254725482549254A00000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +A7 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000CB0BCB0CCB0DCB0ECB0FCB11CB12CB13CB15CB16CB17CB19CB1ACB1BCB1C +CB1DCB1ECB1FCB22CB23CB24CB25CB26CB27CB28CB2900000000000000000000 +0000CB2ACB2BCB2CCB2DCB2ECB2FCB30CB31CB32CB33CB34CB35CB36CB37CB38 +CB39CB3ACB3BCB3CCB3DCB3ECB3FCB40CB42CB43CB4400000000000000000000 +0000CB45CB46CB47CB4ACB4BCB4DCB4ECB4FCB51CB52CB53CB54CB55CB56CB57 +CB5ACB5BCB5CCB5ECB5FCB60CB61CB62CB63CB65CB66CB67CB68CB69CB6ACB6B +CB6C3395339633972113339833C433A333A433A533A63399339A339B339C339D +339E339F33A033A133A233CA338D338E338F33CF3388338933C833A733A833B0 +33B133B233B333B433B533B633B733B833B93380338133823383338433BA33BB +33BC33BD33BE33BF33903391339233933394212633C033C1338A338B338C33D6 +33C533AD33AE33AF33DB33A933AA33AB33AC33DD33D033D333C333C933DC33C6 +0000000000000000000000000000000000000000000000000000000000000000 +A8 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000CB6DCB6ECB6FCB70CB71CB72CB73CB74CB75CB76CB77CB7ACB7BCB7CCB7D +CB7ECB7FCB80CB81CB82CB83CB84CB85CB86CB87CB8800000000000000000000 +0000CB89CB8ACB8BCB8CCB8DCB8ECB8FCB90CB91CB92CB93CB94CB95CB96CB97 +CB98CB99CB9ACB9BCB9DCB9ECB9FCBA0CBA1CBA2CBA300000000000000000000 +0000CBA4CBA5CBA6CBA7CBA8CBA9CBAACBABCBACCBADCBAECBAFCBB0CBB1CBB2 +CBB3CBB4CBB5CBB6CBB7CBB9CBBACBBBCBBCCBBDCBBECBBFCBC0CBC1CBC2CBC3 +CBC400C600D000AA0126000001320000013F014100D8015200BA00DE0166014A +00003260326132623263326432653266326732683269326A326B326C326D326E +326F3270327132723273327432753276327732783279327A327B24D024D124D2 +24D324D424D524D624D724D824D924DA24DB24DC24DD24DE24DF24E024E124E2 +24E324E424E524E624E724E824E9246024612462246324642465246624672468 +2469246A246B246C246D246E00BD2153215400BC00BE215B215C215D215E0000 +A9 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000CBC5CBC6CBC7CBC8CBC9CBCACBCBCBCCCBCDCBCECBCFCBD0CBD1CBD2CBD3 +CBD5CBD6CBD7CBD8CBD9CBDACBDBCBDCCBDDCBDECBDF00000000000000000000 +0000CBE0CBE1CBE2CBE3CBE5CBE6CBE8CBEACBEBCBECCBEDCBEECBEFCBF0CBF1 +CBF2CBF3CBF4CBF5CBF6CBF7CBF8CBF9CBFACBFBCBFC00000000000000000000 +0000CBFDCBFECBFFCC00CC01CC02CC03CC04CC05CC06CC07CC08CC09CC0ACC0B +CC0ECC0FCC11CC12CC13CC15CC16CC17CC18CC19CC1ACC1BCC1ECC1FCC20CC23 +CC2400E6011100F001270131013301380140014200F8015300DF00FE0167014B +01493200320132023203320432053206320732083209320A320B320C320D320E +320F3210321132123213321432153216321732183219321A321B249C249D249E +249F24A024A124A224A324A424A524A624A724A824A924AA24AB24AC24AD24AE +24AF24B024B124B224B324B424B5247424752476247724782479247A247B247C +247D247E247F24802481248200B900B200B32074207F20812082208320840000 +AA +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000CC25CC26CC2ACC2BCC2DCC2FCC31CC32CC33CC34CC35CC36CC37CC3ACC3F +CC40CC41CC42CC43CC46CC47CC49CC4ACC4BCC4DCC4E00000000000000000000 +0000CC4FCC50CC51CC52CC53CC56CC5ACC5BCC5CCC5DCC5ECC5FCC61CC62CC63 +CC65CC67CC69CC6ACC6BCC6CCC6DCC6ECC6FCC71CC7200000000000000000000 +0000CC73CC74CC76CC77CC78CC79CC7ACC7BCC7CCC7DCC7ECC7FCC80CC81CC82 +CC83CC84CC85CC86CC87CC88CC89CC8ACC8BCC8CCC8DCC8ECC8FCC90CC91CC92 +CC93304130423043304430453046304730483049304A304B304C304D304E304F +3050305130523053305430553056305730583059305A305B305C305D305E305F +3060306130623063306430653066306730683069306A306B306C306D306E306F +3070307130723073307430753076307730783079307A307B307C307D307E307F +3080308130823083308430853086308730883089308A308B308C308D308E308F +3090309130923093000000000000000000000000000000000000000000000000 +AB +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000CC94CC95CC96CC97CC9ACC9BCC9DCC9ECC9FCCA1CCA2CCA3CCA4CCA5CCA6 +CCA7CCAACCAECCAFCCB0CCB1CCB2CCB3CCB6CCB7CCB900000000000000000000 +0000CCBACCBBCCBDCCBECCBFCCC0CCC1CCC2CCC3CCC6CCC8CCCACCCBCCCCCCCD +CCCECCCFCCD1CCD2CCD3CCD5CCD6CCD7CCD8CCD9CCDA00000000000000000000 +0000CCDBCCDCCCDDCCDECCDFCCE0CCE1CCE2CCE3CCE5CCE6CCE7CCE8CCE9CCEA +CCEBCCEDCCEECCEFCCF1CCF2CCF3CCF4CCF5CCF6CCF7CCF8CCF9CCFACCFBCCFC +CCFD30A130A230A330A430A530A630A730A830A930AA30AB30AC30AD30AE30AF +30B030B130B230B330B430B530B630B730B830B930BA30BB30BC30BD30BE30BF +30C030C130C230C330C430C530C630C730C830C930CA30CB30CC30CD30CE30CF +30D030D130D230D330D430D530D630D730D830D930DA30DB30DC30DD30DE30DF +30E030E130E230E330E430E530E630E730E830E930EA30EB30EC30ED30EE30EF +30F030F130F230F330F430F530F6000000000000000000000000000000000000 +AC +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000CCFECCFFCD00CD02CD03CD04CD05CD06CD07CD0ACD0BCD0DCD0ECD0FCD11 +CD12CD13CD14CD15CD16CD17CD1ACD1CCD1ECD1FCD2000000000000000000000 +0000CD21CD22CD23CD25CD26CD27CD29CD2ACD2BCD2DCD2ECD2FCD30CD31CD32 +CD33CD34CD35CD36CD37CD38CD3ACD3BCD3CCD3DCD3E00000000000000000000 +0000CD3FCD40CD41CD42CD43CD44CD45CD46CD47CD48CD49CD4ACD4BCD4CCD4D +CD4ECD4FCD50CD51CD52CD53CD54CD55CD56CD57CD58CD59CD5ACD5BCD5DCD5E +CD5F04100411041204130414041504010416041704180419041A041B041C041D +041E041F0420042104220423042404250426042704280429042A042B042C042D +042E042F00000000000000000000000000000000000000000000000000000000 +000004300431043204330434043504510436043704380439043A043B043C043D +043E043F0440044104420443044404450446044704480449044A044B044C044D +044E044F00000000000000000000000000000000000000000000000000000000 +AD +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000CD61CD62CD63CD65CD66CD67CD68CD69CD6ACD6BCD6ECD70CD72CD73CD74 +CD75CD76CD77CD79CD7ACD7BCD7CCD7DCD7ECD7FCD8000000000000000000000 +0000CD81CD82CD83CD84CD85CD86CD87CD89CD8ACD8BCD8CCD8DCD8ECD8FCD90 +CD91CD92CD93CD96CD97CD99CD9ACD9BCD9DCD9ECD9F00000000000000000000 +0000CDA0CDA1CDA2CDA3CDA6CDA8CDAACDABCDACCDADCDAECDAFCDB1CDB2CDB3 +CDB4CDB5CDB6CDB7CDB8CDB9CDBACDBBCDBCCDBDCDBECDBFCDC0CDC1CDC2CDC3 +CDC5000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +AE +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000CDC6CDC7CDC8CDC9CDCACDCBCDCDCDCECDCFCDD1CDD2CDD3CDD4CDD5CDD6 +CDD7CDD8CDD9CDDACDDBCDDCCDDDCDDECDDFCDE0CDE100000000000000000000 +0000CDE2CDE3CDE4CDE5CDE6CDE7CDE9CDEACDEBCDEDCDEECDEFCDF1CDF2CDF3 +CDF4CDF5CDF6CDF7CDFACDFCCDFECDFFCE00CE01CE0200000000000000000000 +0000CE03CE05CE06CE07CE09CE0ACE0BCE0DCE0ECE0FCE10CE11CE12CE13CE15 +CE16CE17CE18CE1ACE1BCE1CCE1DCE1ECE1FCE22CE23CE25CE26CE27CE29CE2A +CE2B000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +AF +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000CE2CCE2DCE2ECE2FCE32CE34CE36CE37CE38CE39CE3ACE3BCE3CCE3DCE3E +CE3FCE40CE41CE42CE43CE44CE45CE46CE47CE48CE4900000000000000000000 +0000CE4ACE4BCE4CCE4DCE4ECE4FCE50CE51CE52CE53CE54CE55CE56CE57CE5A +CE5BCE5DCE5ECE62CE63CE64CE65CE66CE67CE6ACE6C00000000000000000000 +0000CE6ECE6FCE70CE71CE72CE73CE76CE77CE79CE7ACE7BCE7DCE7ECE7FCE80 +CE81CE82CE83CE86CE88CE8ACE8BCE8CCE8DCE8ECE8FCE92CE93CE95CE96CE97 +CE99000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +B0 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000CE9ACE9BCE9CCE9DCE9ECE9FCEA2CEA6CEA7CEA8CEA9CEAACEABCEAECEAF +CEB0CEB1CEB2CEB3CEB4CEB5CEB6CEB7CEB8CEB9CEBA00000000000000000000 +0000CEBBCEBCCEBDCEBECEBFCEC0CEC2CEC3CEC4CEC5CEC6CEC7CEC8CEC9CECA +CECBCECCCECDCECECECFCED0CED1CED2CED3CED4CED500000000000000000000 +0000CED6CED7CED8CED9CEDACEDBCEDCCEDDCEDECEDFCEE0CEE1CEE2CEE3CEE6 +CEE7CEE9CEEACEEDCEEECEEFCEF0CEF1CEF2CEF3CEF6CEFACEFBCEFCCEFDCEFE +CEFFAC00AC01AC04AC07AC08AC09AC0AAC10AC11AC12AC13AC14AC15AC16AC17 +AC19AC1AAC1BAC1CAC1DAC20AC24AC2CAC2DAC2FAC30AC31AC38AC39AC3CAC40 +AC4BAC4DAC54AC58AC5CAC70AC71AC74AC77AC78AC7AAC80AC81AC83AC84AC85 +AC86AC89AC8AAC8BAC8CAC90AC94AC9CAC9DAC9FACA0ACA1ACA8ACA9ACAAACAC +ACAFACB0ACB8ACB9ACBBACBCACBDACC1ACC4ACC8ACCCACD5ACD7ACE0ACE1ACE4 +ACE7ACE8ACEAACECACEFACF0ACF1ACF3ACF5ACF6ACFCACFDAD00AD04AD060000 +B1 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000CF02CF03CF05CF06CF07CF09CF0ACF0BCF0CCF0DCF0ECF0FCF12CF14CF16 +CF17CF18CF19CF1ACF1BCF1DCF1ECF1FCF21CF22CF2300000000000000000000 +0000CF25CF26CF27CF28CF29CF2ACF2BCF2ECF32CF33CF34CF35CF36CF37CF39 +CF3ACF3BCF3CCF3DCF3ECF3FCF40CF41CF42CF43CF4400000000000000000000 +0000CF45CF46CF47CF48CF49CF4ACF4BCF4CCF4DCF4ECF4FCF50CF51CF52CF53 +CF56CF57CF59CF5ACF5BCF5DCF5ECF5FCF60CF61CF62CF63CF66CF68CF6ACF6B +CF6CAD0CAD0DAD0FAD11AD18AD1CAD20AD29AD2CAD2DAD34AD35AD38AD3CAD44 +AD45AD47AD49AD50AD54AD58AD61AD63AD6CAD6DAD70AD73AD74AD75AD76AD7B +AD7CAD7DAD7FAD81AD82AD88AD89AD8CAD90AD9CAD9DADA4ADB7ADC0ADC1ADC4 +ADC8ADD0ADD1ADD3ADDCADE0ADE4ADF8ADF9ADFCADFFAE00AE01AE08AE09AE0B +AE0DAE14AE30AE31AE34AE37AE38AE3AAE40AE41AE43AE45AE46AE4AAE4CAE4D +AE4EAE50AE54AE56AE5CAE5DAE5FAE60AE61AE65AE68AE69AE6CAE70AE780000 +B2 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000CF6DCF6ECF6FCF72CF73CF75CF76CF77CF79CF7ACF7BCF7CCF7DCF7ECF7F +CF81CF82CF83CF84CF86CF87CF88CF89CF8ACF8BCF8D00000000000000000000 +0000CF8ECF8FCF90CF91CF92CF93CF94CF95CF96CF97CF98CF99CF9ACF9BCF9C +CF9DCF9ECF9FCFA0CFA2CFA3CFA4CFA5CFA6CFA7CFA900000000000000000000 +0000CFAACFABCFACCFADCFAECFAFCFB1CFB2CFB3CFB4CFB5CFB6CFB7CFB8CFB9 +CFBACFBBCFBCCFBDCFBECFBFCFC0CFC1CFC2CFC3CFC5CFC6CFC7CFC8CFC9CFCA +CFCBAE79AE7BAE7CAE7DAE84AE85AE8CAEBCAEBDAEBEAEC0AEC4AECCAECDAECF +AED0AED1AED8AED9AEDCAEE8AEEBAEEDAEF4AEF8AEFCAF07AF08AF0DAF10AF2C +AF2DAF30AF32AF34AF3CAF3DAF3FAF41AF42AF43AF48AF49AF50AF5CAF5DAF64 +AF65AF79AF80AF84AF88AF90AF91AF95AF9CAFB8AFB9AFBCAFC0AFC7AFC8AFC9 +AFCBAFCDAFCEAFD4AFDCAFE8AFE9AFF0AFF1AFF4AFF8B000B001B004B00CB010 +B014B01CB01DB028B044B045B048B04AB04CB04EB053B054B055B057B0590000 +B3 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000CFCCCFCDCFCECFCFCFD0CFD1CFD2CFD3CFD4CFD5CFD6CFD7CFD8CFD9CFDA +CFDBCFDCCFDDCFDECFDFCFE2CFE3CFE5CFE6CFE7CFE900000000000000000000 +0000CFEACFEBCFECCFEDCFEECFEFCFF2CFF4CFF6CFF7CFF8CFF9CFFACFFBCFFD +CFFECFFFD001D002D003D005D006D007D008D009D00A00000000000000000000 +0000D00BD00CD00DD00ED00FD010D012D013D014D015D016D017D019D01AD01B +D01CD01DD01ED01FD020D021D022D023D024D025D026D027D028D029D02AD02B +D02CB05DB07CB07DB080B084B08CB08DB08FB091B098B099B09AB09CB09FB0A0 +B0A1B0A2B0A8B0A9B0ABB0ACB0ADB0AEB0AFB0B1B0B3B0B4B0B5B0B8B0BCB0C4 +B0C5B0C7B0C8B0C9B0D0B0D1B0D4B0D8B0E0B0E5B108B109B10BB10CB110B112 +B113B118B119B11BB11CB11DB123B124B125B128B12CB134B135B137B138B139 +B140B141B144B148B150B151B154B155B158B15CB160B178B179B17CB180B182 +B188B189B18BB18DB192B193B194B198B19CB1A8B1CCB1D0B1D4B1DCB1DD0000 +B4 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000D02ED02FD030D031D032D033D036D037D039D03AD03BD03DD03ED03FD040 +D041D042D043D046D048D04AD04BD04CD04DD04ED04F00000000000000000000 +0000D051D052D053D055D056D057D059D05AD05BD05CD05DD05ED05FD061D062 +D063D064D065D066D067D068D069D06AD06BD06ED06F00000000000000000000 +0000D071D072D073D075D076D077D078D079D07AD07BD07ED07FD080D082D083 +D084D085D086D087D088D089D08AD08BD08CD08DD08ED08FD090D091D092D093 +D094B1DFB1E8B1E9B1ECB1F0B1F9B1FBB1FDB204B205B208B20BB20CB214B215 +B217B219B220B234B23CB258B25CB260B268B269B274B275B27CB284B285B289 +B290B291B294B298B299B29AB2A0B2A1B2A3B2A5B2A6B2AAB2ACB2B0B2B4B2C8 +B2C9B2CCB2D0B2D2B2D8B2D9B2DBB2DDB2E2B2E4B2E5B2E6B2E8B2EBB2ECB2ED +B2EEB2EFB2F3B2F4B2F5B2F7B2F8B2F9B2FAB2FBB2FFB300B301B304B308B310 +B311B313B314B315B31CB354B355B356B358B35BB35CB35EB35FB364B3650000 +B5 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000D095D096D097D098D099D09AD09BD09CD09DD09ED09FD0A0D0A1D0A2D0A3 +D0A6D0A7D0A9D0AAD0ABD0ADD0AED0AFD0B0D0B1D0B200000000000000000000 +0000D0B3D0B6D0B8D0BAD0BBD0BCD0BDD0BED0BFD0C2D0C3D0C5D0C6D0C7D0CA +D0CBD0CCD0CDD0CED0CFD0D2D0D6D0D7D0D8D0D9D0DA00000000000000000000 +0000D0DBD0DED0DFD0E1D0E2D0E3D0E5D0E6D0E7D0E8D0E9D0EAD0EBD0EED0F2 +D0F3D0F4D0F5D0F6D0F7D0F9D0FAD0FBD0FCD0FDD0FED0FFD100D101D102D103 +D104B367B369B36BB36EB370B371B374B378B380B381B383B384B385B38CB390 +B394B3A0B3A1B3A8B3ACB3C4B3C5B3C8B3CBB3CCB3CEB3D0B3D4B3D5B3D7B3D9 +B3DBB3DDB3E0B3E4B3E8B3FCB410B418B41CB420B428B429B42BB434B450B451 +B454B458B460B461B463B465B46CB480B488B49DB4A4B4A8B4ACB4B5B4B7B4B9 +B4C0B4C4B4C8B4D0B4D5B4DCB4DDB4E0B4E3B4E4B4E6B4ECB4EDB4EFB4F1B4F8 +B514B515B518B51BB51CB524B525B527B528B529B52AB530B531B534B5380000 +B6 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000D105D106D107D108D109D10AD10BD10CD10ED10FD110D111D112D113D114 +D115D116D117D118D119D11AD11BD11CD11DD11ED11F00000000000000000000 +0000D120D121D122D123D124D125D126D127D128D129D12AD12BD12CD12DD12E +D12FD132D133D135D136D137D139D13BD13CD13DD13E00000000000000000000 +0000D13FD142D146D147D148D149D14AD14BD14ED14FD151D152D153D155D156 +D157D158D159D15AD15BD15ED160D162D163D164D165D166D167D169D16AD16B +D16DB540B541B543B544B545B54BB54CB54DB550B554B55CB55DB55FB560B561 +B5A0B5A1B5A4B5A8B5AAB5ABB5B0B5B1B5B3B5B4B5B5B5BBB5BCB5BDB5C0B5C4 +B5CCB5CDB5CFB5D0B5D1B5D8B5ECB610B611B614B618B625B62CB634B648B664 +B668B69CB69DB6A0B6A4B6ABB6ACB6B1B6D4B6F0B6F4B6F8B700B701B705B728 +B729B72CB72FB730B738B739B73BB744B748B74CB754B755B760B764B768B770 +B771B773B775B77CB77DB780B784B78CB78DB78FB790B791B792B796B7970000 +B7 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000D16ED16FD170D171D172D173D174D175D176D177D178D179D17AD17BD17D +D17ED17FD180D181D182D183D185D186D187D189D18A00000000000000000000 +0000D18BD18CD18DD18ED18FD190D191D192D193D194D195D196D197D198D199 +D19AD19BD19CD19DD19ED19FD1A2D1A3D1A5D1A6D1A700000000000000000000 +0000D1A9D1AAD1ABD1ACD1ADD1AED1AFD1B2D1B4D1B6D1B7D1B8D1B9D1BBD1BD +D1BED1BFD1C1D1C2D1C3D1C4D1C5D1C6D1C7D1C8D1C9D1CAD1CBD1CCD1CDD1CE +D1CFB798B799B79CB7A0B7A8B7A9B7ABB7ACB7ADB7B4B7B5B7B8B7C7B7C9B7EC +B7EDB7F0B7F4B7FCB7FDB7FFB800B801B807B808B809B80CB810B818B819B81B +B81DB824B825B828B82CB834B835B837B838B839B840B844B851B853B85CB85D +B860B864B86CB86DB86FB871B878B87CB88DB8A8B8B0B8B4B8B8B8C0B8C1B8C3 +B8C5B8CCB8D0B8D4B8DDB8DFB8E1B8E8B8E9B8ECB8F0B8F8B8F9B8FBB8FDB904 +B918B920B93CB93DB940B944B94CB94FB951B958B959B95CB960B968B9690000 +B8 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000D1D0D1D1D1D2D1D3D1D4D1D5D1D6D1D7D1D9D1DAD1DBD1DCD1DDD1DED1DF +D1E0D1E1D1E2D1E3D1E4D1E5D1E6D1E7D1E8D1E9D1EA00000000000000000000 +0000D1EBD1ECD1EDD1EED1EFD1F0D1F1D1F2D1F3D1F5D1F6D1F7D1F9D1FAD1FB +D1FCD1FDD1FED1FFD200D201D202D203D204D205D20600000000000000000000 +0000D208D20AD20BD20CD20DD20ED20FD211D212D213D214D215D216D217D218 +D219D21AD21BD21CD21DD21ED21FD220D221D222D223D224D225D226D227D228 +D229B96BB96DB974B975B978B97CB984B985B987B989B98AB98DB98EB9ACB9AD +B9B0B9B4B9BCB9BDB9BFB9C1B9C8B9C9B9CCB9CEB9CFB9D0B9D1B9D2B9D8B9D9 +B9DBB9DDB9DEB9E1B9E3B9E4B9E5B9E8B9ECB9F4B9F5B9F7B9F8B9F9B9FABA00 +BA01BA08BA15BA38BA39BA3CBA40BA42BA48BA49BA4BBA4DBA4EBA53BA54BA55 +BA58BA5CBA64BA65BA67BA68BA69BA70BA71BA74BA78BA83BA84BA85BA87BA8C +BAA8BAA9BAABBAACBAB0BAB2BAB8BAB9BABBBABDBAC4BAC8BAD8BAD9BAFC0000 +B9 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000D22AD22BD22ED22FD231D232D233D235D236D237D238D239D23AD23BD23E +D240D242D243D244D245D246D247D249D24AD24BD24C00000000000000000000 +0000D24DD24ED24FD250D251D252D253D254D255D256D257D258D259D25AD25B +D25DD25ED25FD260D261D262D263D265D266D267D26800000000000000000000 +0000D269D26AD26BD26CD26DD26ED26FD270D271D272D273D274D275D276D277 +D278D279D27AD27BD27CD27DD27ED27FD282D283D285D286D287D289D28AD28B +D28CBB00BB04BB0DBB0FBB11BB18BB1CBB20BB29BB2BBB34BB35BB36BB38BB3B +BB3CBB3DBB3EBB44BB45BB47BB49BB4DBB4FBB50BB54BB58BB61BB63BB6CBB88 +BB8CBB90BBA4BBA8BBACBBB4BBB7BBC0BBC4BBC8BBD0BBD3BBF8BBF9BBFCBBFF +BC00BC02BC08BC09BC0BBC0CBC0DBC0FBC11BC14BC15BC16BC17BC18BC1BBC1C +BC1DBC1EBC1FBC24BC25BC27BC29BC2DBC30BC31BC34BC38BC40BC41BC43BC44 +BC45BC49BC4CBC4DBC50BC5DBC84BC85BC88BC8BBC8CBC8EBC94BC95BC970000 +BA +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000D28DD28ED28FD292D293D294D296D297D298D299D29AD29BD29DD29ED29F +D2A1D2A2D2A3D2A5D2A6D2A7D2A8D2A9D2AAD2ABD2AD00000000000000000000 +0000D2AED2AFD2B0D2B2D2B3D2B4D2B5D2B6D2B7D2BAD2BBD2BDD2BED2C1D2C3 +D2C4D2C5D2C6D2C7D2CAD2CCD2CDD2CED2CFD2D0D2D100000000000000000000 +0000D2D2D2D3D2D5D2D6D2D7D2D9D2DAD2DBD2DDD2DED2DFD2E0D2E1D2E2D2E3 +D2E6D2E7D2E8D2E9D2EAD2EBD2ECD2EDD2EED2EFD2F2D2F3D2F5D2F6D2F7D2F9 +D2FABC99BC9ABCA0BCA1BCA4BCA7BCA8BCB0BCB1BCB3BCB4BCB5BCBCBCBDBCC0 +BCC4BCCDBCCFBCD0BCD1BCD5BCD8BCDCBCF4BCF5BCF6BCF8BCFCBD04BD05BD07 +BD09BD10BD14BD24BD2CBD40BD48BD49BD4CBD50BD58BD59BD64BD68BD80BD81 +BD84BD87BD88BD89BD8ABD90BD91BD93BD95BD99BD9ABD9CBDA4BDB0BDB8BDD4 +BDD5BDD8BDDCBDE9BDF0BDF4BDF8BE00BE03BE05BE0CBE0DBE10BE14BE1CBE1D +BE1FBE44BE45BE48BE4CBE4EBE54BE55BE57BE59BE5ABE5BBE60BE61BE640000 +BB +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000D2FBD2FCD2FDD2FED2FFD302D304D306D307D308D309D30AD30BD30FD311 +D312D313D315D317D318D319D31AD31BD31ED322D32300000000000000000000 +0000D324D326D327D32AD32BD32DD32ED32FD331D332D333D334D335D336D337 +D33AD33ED33FD340D341D342D343D346D347D348D34900000000000000000000 +0000D34AD34BD34CD34DD34ED34FD350D351D352D353D354D355D356D357D358 +D359D35AD35BD35CD35DD35ED35FD360D361D362D363D364D365D366D367D368 +D369BE68BE6ABE70BE71BE73BE74BE75BE7BBE7CBE7DBE80BE84BE8CBE8DBE8F +BE90BE91BE98BE99BEA8BED0BED1BED4BED7BED8BEE0BEE3BEE4BEE5BEECBF01 +BF08BF09BF18BF19BF1BBF1CBF1DBF40BF41BF44BF48BF50BF51BF55BF94BFB0 +BFC5BFCCBFCDBFD0BFD4BFDCBFDFBFE1C03CC051C058C05CC060C068C069C090 +C091C094C098C0A0C0A1C0A3C0A5C0ACC0ADC0AFC0B0C0B3C0B4C0B5C0B6C0BC +C0BDC0BFC0C0C0C1C0C5C0C8C0C9C0CCC0D0C0D8C0D9C0DBC0DCC0DDC0E40000 +BC +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000D36AD36BD36CD36DD36ED36FD370D371D372D373D374D375D376D377D378 +D379D37AD37BD37ED37FD381D382D383D385D386D38700000000000000000000 +0000D388D389D38AD38BD38ED392D393D394D395D396D397D39AD39BD39DD39E +D39FD3A1D3A2D3A3D3A4D3A5D3A6D3A7D3AAD3ACD3AE00000000000000000000 +0000D3AFD3B0D3B1D3B2D3B3D3B5D3B6D3B7D3B9D3BAD3BBD3BDD3BED3BFD3C0 +D3C1D3C2D3C3D3C6D3C7D3CAD3CBD3CCD3CDD3CED3CFD3D1D3D2D3D3D3D4D3D5 +D3D6C0E5C0E8C0ECC0F4C0F5C0F7C0F9C100C104C108C110C115C11CC11DC11E +C11FC120C123C124C126C127C12CC12DC12FC130C131C136C138C139C13CC140 +C148C149C14BC14CC14DC154C155C158C15CC164C165C167C168C169C170C174 +C178C185C18CC18DC18EC190C194C196C19CC19DC19FC1A1C1A5C1A8C1A9C1AC +C1B0C1BDC1C4C1C8C1CCC1D4C1D7C1D8C1E0C1E4C1E8C1F0C1F1C1F3C1FCC1FD +C200C204C20CC20DC20FC211C218C219C21CC21FC220C228C229C22BC22D0000 +BD +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000D3D7D3D9D3DAD3DBD3DCD3DDD3DED3DFD3E0D3E2D3E4D3E5D3E6D3E7D3E8 +D3E9D3EAD3EBD3EED3EFD3F1D3F2D3F3D3F5D3F6D3F700000000000000000000 +0000D3F8D3F9D3FAD3FBD3FED400D402D403D404D405D406D407D409D40AD40B +D40CD40DD40ED40FD410D411D412D413D414D415D41600000000000000000000 +0000D417D418D419D41AD41BD41CD41ED41FD420D421D422D423D424D425D426 +D427D428D429D42AD42BD42CD42DD42ED42FD430D431D432D433D434D435D436 +D437C22FC231C232C234C248C250C251C254C258C260C265C26CC26DC270C274 +C27CC27DC27FC281C288C289C290C298C29BC29DC2A4C2A5C2A8C2ACC2ADC2B4 +C2B5C2B7C2B9C2DCC2DDC2E0C2E3C2E4C2EBC2ECC2EDC2EFC2F1C2F6C2F8C2F9 +C2FBC2FCC300C308C309C30CC30DC313C314C315C318C31CC324C325C328C329 +C345C368C369C36CC370C372C378C379C37CC37DC384C388C38CC3C0C3D8C3D9 +C3DCC3DFC3E0C3E2C3E8C3E9C3EDC3F4C3F5C3F8C408C410C424C42CC4300000 +BE +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000D438D439D43AD43BD43CD43DD43ED43FD441D442D443D445D446D447D448 +D449D44AD44BD44CD44DD44ED44FD450D451D452D45300000000000000000000 +0000D454D455D456D457D458D459D45AD45BD45DD45ED45FD461D462D463D465 +D466D467D468D469D46AD46BD46CD46ED470D471D47200000000000000000000 +0000D473D474D475D476D477D47AD47BD47DD47ED481D483D484D485D486D487 +D48AD48CD48ED48FD490D491D492D493D495D496D497D498D499D49AD49BD49C +D49DC434C43CC43DC448C464C465C468C46CC474C475C479C480C494C49CC4B8 +C4BCC4E9C4F0C4F1C4F4C4F8C4FAC4FFC500C501C50CC510C514C51CC528C529 +C52CC530C538C539C53BC53DC544C545C548C549C54AC54CC54DC54EC553C554 +C555C557C558C559C55DC55EC560C561C564C568C570C571C573C574C575C57C +C57DC580C584C587C58CC58DC58FC591C595C597C598C59CC5A0C5A9C5B4C5B5 +C5B8C5B9C5BBC5BCC5BDC5BEC5C4C5C5C5C6C5C7C5C8C5C9C5CAC5CCC5CE0000 +BF +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000D49ED49FD4A0D4A1D4A2D4A3D4A4D4A5D4A6D4A7D4A8D4AAD4ABD4ACD4AD +D4AED4AFD4B0D4B1D4B2D4B3D4B4D4B5D4B6D4B7D4B800000000000000000000 +0000D4B9D4BAD4BBD4BCD4BDD4BED4BFD4C0D4C1D4C2D4C3D4C4D4C5D4C6D4C7 +D4C8D4C9D4CAD4CBD4CDD4CED4CFD4D1D4D2D4D3D4D500000000000000000000 +0000D4D6D4D7D4D8D4D9D4DAD4DBD4DDD4DED4E0D4E1D4E2D4E3D4E4D4E5D4E6 +D4E7D4E9D4EAD4EBD4EDD4EED4EFD4F1D4F2D4F3D4F4D4F5D4F6D4F7D4F9D4FA +D4FCC5D0C5D1C5D4C5D8C5E0C5E1C5E3C5E5C5ECC5EDC5EEC5F0C5F4C5F6C5F7 +C5FCC5FDC5FEC5FFC600C601C605C606C607C608C60CC610C618C619C61BC61C +C624C625C628C62CC62DC62EC630C633C634C635C637C639C63BC640C641C644 +C648C650C651C653C654C655C65CC65DC660C66CC66FC671C678C679C67CC680 +C688C689C68BC68DC694C695C698C69CC6A4C6A5C6A7C6A9C6B0C6B1C6B4C6B8 +C6B9C6BAC6C0C6C1C6C3C6C5C6CCC6CDC6D0C6D4C6DCC6DDC6E0C6E1C6E80000 +C0 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000D4FED4FFD500D501D502D503D505D506D507D509D50AD50BD50DD50ED50F +D510D511D512D513D516D518D519D51AD51BD51CD51D00000000000000000000 +0000D51ED51FD520D521D522D523D524D525D526D527D528D529D52AD52BD52C +D52DD52ED52FD530D531D532D533D534D535D536D53700000000000000000000 +0000D538D539D53AD53BD53ED53FD541D542D543D545D546D547D548D549D54A +D54BD54ED550D552D553D554D555D556D557D55AD55BD55DD55ED55FD561D562 +D563C6E9C6ECC6F0C6F8C6F9C6FDC704C705C708C70CC714C715C717C719C720 +C721C724C728C730C731C733C735C737C73CC73DC740C744C74AC74CC74DC74F +C751C752C753C754C755C756C757C758C75CC760C768C76BC774C775C778C77C +C77DC77EC783C784C785C787C788C789C78AC78EC790C791C794C796C797C798 +C79AC7A0C7A1C7A3C7A4C7A5C7A6C7ACC7ADC7B0C7B4C7BCC7BDC7BFC7C0C7C1 +C7C8C7C9C7CCC7CEC7D0C7D8C7DDC7E4C7E8C7ECC800C801C804C808C80A0000 +C1 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000D564D566D567D56AD56CD56ED56FD570D571D572D573D576D577D579D57A +D57BD57DD57ED57FD580D581D582D583D586D58AD58B00000000000000000000 +0000D58CD58DD58ED58FD591D592D593D594D595D596D597D598D599D59AD59B +D59CD59DD59ED59FD5A0D5A1D5A2D5A3D5A4D5A6D5A700000000000000000000 +0000D5A8D5A9D5AAD5ABD5ACD5ADD5AED5AFD5B0D5B1D5B2D5B3D5B4D5B5D5B6 +D5B7D5B8D5B9D5BAD5BBD5BCD5BDD5BED5BFD5C0D5C1D5C2D5C3D5C4D5C5D5C6 +D5C7C810C811C813C815C816C81CC81DC820C824C82CC82DC82FC831C838C83C +C840C848C849C84CC84DC854C870C871C874C878C87AC880C881C883C885C886 +C887C88BC88CC88DC894C89DC89FC8A1C8A8C8BCC8BDC8C4C8C8C8CCC8D4C8D5 +C8D7C8D9C8E0C8E1C8E4C8F5C8FCC8FDC900C904C905C906C90CC90DC90FC911 +C918C92CC934C950C951C954C958C960C961C963C96CC970C974C97CC988C989 +C98CC990C998C999C99BC99DC9C0C9C1C9C4C9C7C9C8C9CAC9D0C9D1C9D30000 +C2 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000D5CAD5CBD5CDD5CED5CFD5D1D5D3D5D4D5D5D5D6D5D7D5DAD5DCD5DED5DF +D5E0D5E1D5E2D5E3D5E6D5E7D5E9D5EAD5EBD5EDD5EE00000000000000000000 +0000D5EFD5F0D5F1D5F2D5F3D5F6D5F8D5FAD5FBD5FCD5FDD5FED5FFD602D603 +D605D606D607D609D60AD60BD60CD60DD60ED60FD61200000000000000000000 +0000D616D617D618D619D61AD61BD61DD61ED61FD621D622D623D625D626D627 +D628D629D62AD62BD62CD62ED62FD630D631D632D633D634D635D636D637D63A +D63BC9D5C9D6C9D9C9DAC9DCC9DDC9E0C9E2C9E4C9E7C9ECC9EDC9EFC9F0C9F1 +C9F8C9F9C9FCCA00CA08CA09CA0BCA0CCA0DCA14CA18CA29CA4CCA4DCA50CA54 +CA5CCA5DCA5FCA60CA61CA68CA7DCA84CA98CABCCABDCAC0CAC4CACCCACDCACF +CAD1CAD3CAD8CAD9CAE0CAECCAF4CB08CB10CB14CB18CB20CB21CB41CB48CB49 +CB4CCB50CB58CB59CB5DCB64CB78CB79CB9CCBB8CBD4CBE4CBE7CBE9CC0CCC0D +CC10CC14CC1CCC1DCC21CC22CC27CC28CC29CC2CCC2ECC30CC38CC39CC3B0000 +C3 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000D63DD63ED63FD641D642D643D644D646D647D64AD64CD64ED64FD650D652 +D653D656D657D659D65AD65BD65DD65ED65FD660D66100000000000000000000 +0000D662D663D664D665D666D668D66AD66BD66CD66DD66ED66FD672D673D675 +D676D677D678D679D67AD67BD67CD67DD67ED67FD68000000000000000000000 +0000D681D682D684D686D687D688D689D68AD68BD68ED68FD691D692D693D695 +D696D697D698D699D69AD69BD69CD69ED6A0D6A2D6A3D6A4D6A5D6A6D6A7D6A9 +D6AACC3CCC3DCC3ECC44CC45CC48CC4CCC54CC55CC57CC58CC59CC60CC64CC66 +CC68CC70CC75CC98CC99CC9CCCA0CCA8CCA9CCABCCACCCADCCB4CCB5CCB8CCBC +CCC4CCC5CCC7CCC9CCD0CCD4CCE4CCECCCF0CD01CD08CD09CD0CCD10CD18CD19 +CD1BCD1DCD24CD28CD2CCD39CD5CCD60CD64CD6CCD6DCD6FCD71CD78CD88CD94 +CD95CD98CD9CCDA4CDA5CDA7CDA9CDB0CDC4CDCCCDD0CDE8CDECCDF0CDF8CDF9 +CDFBCDFDCE04CE08CE0CCE14CE19CE20CE21CE24CE28CE30CE31CE33CE350000 +C4 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000D6ABD6ADD6AED6AFD6B1D6B2D6B3D6B4D6B5D6B6D6B7D6B8D6BAD6BCD6BD +D6BED6BFD6C0D6C1D6C2D6C3D6C6D6C7D6C9D6CAD6CB00000000000000000000 +0000D6CDD6CED6CFD6D0D6D2D6D3D6D5D6D6D6D8D6DAD6DBD6DCD6DDD6DED6DF +D6E1D6E2D6E3D6E5D6E6D6E7D6E9D6EAD6EBD6ECD6ED00000000000000000000 +0000D6EED6EFD6F1D6F2D6F3D6F4D6F6D6F7D6F8D6F9D6FAD6FBD6FED6FFD701 +D702D703D705D706D707D708D709D70AD70BD70CD70DD70ED70FD710D712D713 +D714CE58CE59CE5CCE5FCE60CE61CE68CE69CE6BCE6DCE74CE75CE78CE7CCE84 +CE85CE87CE89CE90CE91CE94CE98CEA0CEA1CEA3CEA4CEA5CEACCEADCEC1CEE4 +CEE5CEE8CEEBCEECCEF4CEF5CEF7CEF8CEF9CF00CF01CF04CF08CF10CF11CF13 +CF15CF1CCF20CF24CF2CCF2DCF2FCF30CF31CF38CF54CF55CF58CF5CCF64CF65 +CF67CF69CF70CF71CF74CF78CF80CF85CF8CCFA1CFA8CFB0CFC4CFE0CFE1CFE4 +CFE8CFF0CFF1CFF3CFF5CFFCD000D004D011D018D02DD034D035D038D03C0000 +C5 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000D715D716D717D71AD71BD71DD71ED71FD721D722D723D724D725D726D727 +D72AD72CD72ED72FD730D731D732D733D736D737D73900000000000000000000 +0000D73AD73BD73DD73ED73FD740D741D742D743D745D746D748D74AD74BD74C +D74DD74ED74FD752D753D755D75AD75BD75CD75DD75E00000000000000000000 +0000D75FD762D764D766D767D768D76AD76BD76DD76ED76FD771D772D773D775 +D776D777D778D779D77AD77BD77ED77FD780D782D783D784D785D786D787D78A +D78BD044D045D047D049D050D054D058D060D06CD06DD070D074D07CD07DD081 +D0A4D0A5D0A8D0ACD0B4D0B5D0B7D0B9D0C0D0C1D0C4D0C8D0C9D0D0D0D1D0D3 +D0D4D0D5D0DCD0DDD0E0D0E4D0ECD0EDD0EFD0F0D0F1D0F8D10DD130D131D134 +D138D13AD140D141D143D144D145D14CD14DD150D154D15CD15DD15FD161D168 +D16CD17CD184D188D1A0D1A1D1A4D1A8D1B0D1B1D1B3D1B5D1BAD1BCD1C0D1D8 +D1F4D1F8D207D209D210D22CD22DD230D234D23CD23DD23FD241D248D25C0000 +C6 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000D78DD78ED78FD791D792D793D794D795D796D797D79AD79CD79ED79FD7A0 +D7A1D7A2D7A30000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000D264D280D281D284D288D290D291D295D29CD2A0D2A4D2ACD2B1D2B8D2B9 +D2BCD2BFD2C0D2C2D2C8D2C9D2CBD2D4D2D8D2DCD2E4D2E5D2F0D2F1D2F4D2F8 +D300D301D303D305D30CD30DD30ED310D314D316D31CD31DD31FD320D321D325 +D328D329D32CD330D338D339D33BD33CD33DD344D345D37CD37DD380D384D38C +D38DD38FD390D391D398D399D39CD3A0D3A8D3A9D3ABD3ADD3B4D3B8D3BCD3C4 +D3C5D3C8D3C9D3D0D3D8D3E1D3E3D3ECD3EDD3F0D3F4D3FCD3FDD3FFD4010000 +C7 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000D408D41DD440D444D45CD460D464D46DD46FD478D479D47CD47FD480D482 +D488D489D48BD48DD494D4A9D4CCD4D0D4D4D4DCD4DFD4E8D4ECD4F0D4F8D4FB +D4FDD504D508D50CD514D515D517D53CD53DD540D544D54CD54DD54FD551D558 +D559D55CD560D565D568D569D56BD56DD574D575D578D57CD584D585D587D588 +D589D590D5A5D5C8D5C9D5CCD5D0D5D2D5D8D5D9D5DBD5DDD5E4D5E5D5E8D5EC +D5F4D5F5D5F7D5F9D600D601D604D608D610D611D613D614D615D61CD6200000 +C8 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000D624D62DD638D639D63CD640D645D648D649D64BD64DD651D654D655D658 +D65CD667D669D670D671D674D683D685D68CD68DD690D694D69DD69FD6A1D6A8 +D6ACD6B0D6B9D6BBD6C4D6C5D6C8D6CCD6D1D6D4D6D7D6D9D6E0D6E4D6E8D6F0 +D6F5D6FCD6FDD700D704D711D718D719D71CD720D728D729D72BD72DD734D735 +D738D73CD744D747D749D750D751D754D756D757D758D759D760D761D763D765 +D769D76CD770D774D77CD77DD781D788D789D78CD790D798D799D79BD79D0000 +CA +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00004F3D4F73504750F952A053EF547554E556095AC15BB6668767B667B767EF +6B4C73C275C27A3C82DB8304885788888A368CC88DCF8EFB8FE699D5523B5374 +5404606A61646BBC73CF811A89BA89D295A34F83520A58BE597859E65E725E79 +61C763C0674667EC687F6F97764E770B78F57A087AFF7C21809D826E82718AEB +95934E6B559D66F76E3478A37AED845B8910874E97A852D8574E582A5D4C611F +61BE6221656267D16A446E1B751875B376E377B07D3A90AF945194529F950000 +CB +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000053235CAC753280DB92409598525B580859DC5CA15D175EB75F3A5F4A6177 +6C5F757A75867CE07D737DB17F8C81548221859189418B1B92FC964D9C474ECB +4EF7500B51F1584F6137613E6168653969EA6F1175A5768676D67B8782A584CB +F90093A7958B55805BA25751F9017CB37FB991B5502853BB5C455DE862D2636E +64DA64E76E2070AC795B8DDD8E1EF902907D924592F84E7E4EF650655DFE5EFA +61066957817186548E4793759A2B4E5E5091677068405109528D52926AA20000 +CC +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000077BC92109ED452AB602F8FF2504861A963ED64CA683C6A846FC0818889A1 +96945805727D72AC75047D797E6D80A9898B8B7490639D5162896C7A6F547D50 +7F3A8A23517C614A7B9D8B199257938C4EAC4FD3501E50BE510652C152CD537F +577058835E9A5F91617661AC64CE656C666F66BB66F468976D87708570F1749F +74A574CA75D9786C78EC7ADF7AF67D457D938015803F811B83968B668F159015 +93E1980398389A5A9BE84FC25553583A59515B635C4660B86212684268B00000 +CD +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000068E86EAA754C767878CE7A3D7CFB7E6B7E7C8A088AA18C3F968E9DC453E4 +53E9544A547156FA59D15B645C3B5EAB62F765376545657266A067AF69C16CBD +75FC7690777E7A3F7F94800380A1818F82E682FD83F085C1883188B48AA5F903 +8F9C932E96C798679AD89F1354ED659B66F2688F7A408C379D6056F057645D11 +660668B168CD6EFE7428889E9BE46C68F9049AA84F9B516C5171529F5B545DE5 +6050606D62F163A7653B73D97A7A86A38CA2978F4E325BE16208679C74DC0000 +CE +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000079D183D38A878AB28DE8904E934B98465ED369E885FF90EDF90551A05B98 +5BEC616368FA6B3E704C742F74D87BA17F5083C589C08CAB95DC9928522E605D +62EC90024F8A5149532158D95EE366E06D38709A72C273D67B5080F1945B5366 +639B7F6B4E565080584A58DE602A612762D069D09B415B8F7D1880B18F5F4EA4 +50D154AC55AC5B0C5DA05DE7652A654E68216A4B72E1768E77EF7D5E7FF981A0 +854E86DF8F038F4E90CA99039A559BAB4E184E454E5D4EC74FF1517752FE0000 +CF +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000534053E353E5548E5614577557A25BC75D875ED061FC62D8655167B867E9 +69CB6B506BC66BEC6C426E9D707872D77396740377BF77E97A767D7F800981FC +8205820A82DF88628B338CFC8EC0901190B1926492B699D29A459CE99DD79F9C +570B5C4083CA97A097AB9EB4541B7A987FA488D98ECD90E158005C4863987A9F +5BAE5F137A797AAE828E8EAC5026523852F85377570862F363726B0A6DC37737 +53A5735785688E7695D5673A6AC36F708A6D8ECC994BF90666776B788CB40000 +D0 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00009B3CF90753EB572D594E63C669FB73EA78457ABA7AC57CFE8475898F8D73 +903595A852FB574775477B6083CC921EF9086A58514B524B5287621F68D86975 +969950C552A452E461C365A4683969FF747E7B4B82B983EB89B28B398FD19949 +F9094ECA599764D266116A8E7434798179BD82A9887E887F895FF90A93264F0B +53CA602562716C727D1A7D664E98516277DC80AF4F014F0E5176518055DC5668 +573B57FA57FC5914594759935BC45C905D0E5DF15E7E5FCC628065D765E30000 +D1 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000671E671F675E68CB68C46A5F6B3A6C236C7D6C826DC773987426742A7482 +74A37578757F788178EF794179477948797A7B957D007DBA7F888006802D808C +8A188B4F8C488D779321932498E299519A0E9A0F9A659E927DCA4F76540962EE +685491D155AB513AF90BF90C5A1C61E6F90D62CF62FFF90EF90FF910F911F912 +F91390A3F914F915F916F917F9188AFEF919F91AF91BF91C6696F91D7156F91E +F91F96E3F920634F637A5357F921678F69606E73F9227537F923F924F9250000 +D2 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00007D0DF926F927887256CA5A18F928F929F92AF92BF92C4E43F92D51675948 +67F08010F92E59735E74649A79CA5FF5606C62C8637B5BE75BD752AAF92F5974 +5F296012F930F931F9327459F933F934F935F936F937F93899D1F939F93AF93B +F93CF93DF93EF93FF940F941F942F9436FC3F944F94581BF8FB260F1F946F947 +8166F948F9495C3FF94AF94BF94CF94DF94EF94FF950F9515AE98A25677B7D10 +F952F953F954F955F956F95780FDF958F9595C3C6CE5533F6EBA591A83360000 +D3 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00004E394EB64F4655AE571858C75F5665B765E66A806BB56E4D77ED7AEF7C1E +7DDE86CB88929132935B64BB6FBE737A75B890545556574D61BA64D466C76DE1 +6E5B6F6D6FB975F0804381BD854189838AC78B5A931F6C9375537B548E0F905D +5510580258585E626207649E68E075767CD687B39EE84EE35788576E59275C0D +5CB15E365F85623464E173B381FA888B8CB8968A9EDB5B855FB760B350125200 +52305716583558575C0E5C605CF65D8B5EA65F9260BC63116389641768430000 +D4 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000068F96AC26DD86E216ED46FE471FE76DC777979B17A3B840489A98CED8DF3 +8E4890039014905390FD934D967697DC6BD27006725872A27368776379BF7BE4 +7E9B8B8058A960C7656665FD66BE6C8C711E71C98C5A98134E6D7A814EDD51AC +51CD52D5540C61A76771685068DF6D1E6F7C75BC77B37AE580F484639285515C +6597675C679375D87AC78373F95A8C469017982D5C6F81C0829A9041906F920D +5F975D9D6A5971C8767B7B4985E48B0491279A30558761F6F95B76697F850000 +D5 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000863F87BA88F8908FF95C6D1B70D973DE7D61843DF95D916A99F1F95E4E82 +53756B046B12703E721B862D9E1E524C8FA35D5064E5652C6B166FEB7C437E9C +85CD896489BD62C981D8881F5ECA67176D6A72FC7405746F878290DE4F865D0D +5FA0840A51B763A075654EAE5006516951C968816A117CAE7CB17CE7826F8AD2 +8F1B91CF4FB6513752F554425EEC616E623E65C56ADA6FFE792A85DC882395AD +9A629A6A9E979ECE529B66C66B77701D792B8F6297426190620065236F230000 +D6 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000714974897DF4806F84EE8F269023934A51BD521752A36D0C70C888C25EC9 +65826BAE6FC27C3E73754EE44F3656F9F95F5CBA5DBA601C73B27B2D7F9A7FCE +8046901E923496F6974898189F614F8B6FA779AE91B496B752DEF960648864C4 +6AD36F5E7018721076E780018606865C8DEF8F0597329B6F9DFA9E75788C797F +7DA083C993049E7F9E938AD658DF5F046727702774CF7C60807E512170287262 +78CA8CC28CDA8CF496F74E8650DA5BEE5ED6659971CE764277AD804A84FC0000 +D7 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000907C9B279F8D58D85A415C626A136DDA6F0F763B7D2F7E37851E893893E4 +964B528965D267F369B46D416E9C700F7409746075597624786B8B2C985E516D +622E96784F96502B5D196DEA7DB88F2A5F8B61446817F961968652D2808B51DC +51CC695E7A1C7DBE83F196754FDA52295398540F550E5C6560A7674E68A86D6C +728172F874067483F96275E27C6C7F797FB8838988CF88E191CC91D096E29BC9 +541D6F7E71D0749885FA8EAA96A39C579E9F67976DCB743381E89716782C0000 +D8 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00007ACB7B207C926469746A75F278BC78E899AC9B549EBB5BDE5E556F20819C +83AB90884E07534D5A295DD25F4E6162633D666966FC6EFF6F2B7063779E842C +8513883B8F1399459C3B551C62B9672B6CAB8309896A977A4EA159845FD85FD9 +671B7DB27F548292832B83BD8F1E909957CB59B95A925BD06627679A68856BCF +71647F758CB78CE390819B4581088C8A964C9A409EA55B5F6C13731B76F276DF +840C51AA8993514D519552C968C96C94770477207DBF7DEC97629EB56EC50000 +D9 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000851151A5540D547D660E669D69276E9F76BF7791831784C2879F91699298 +9CF488824FAE519252DF59C65E3D61556478647966AE67D06A216BCD6BDB725F +72617441773877DB801782BC83058B008B288C8C67286C90726776EE77667A46 +9DA96B7F6C92592267268499536F589359995EDF63CF663467736E3A732B7AD7 +82D7932852D95DEB61AE61CB620A62C764AB65E069596B666BCB712173F7755D +7E46821E8302856A8AA38CBF97279D6158A89ED85011520E543B554F65870000 +DA +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00006C767D0A7D0B805E868A958096EF52FF6C95726954735A9A5C3E5D4B5F4C +5FAE672A68B669636E3C6E4477097C737F8E85878B0E8FF797619EF45CB760B6 +610D61AB654F65FB65FC6C116CEF739F73C97DE195945BC6871C8B10525D535A +62CD640F64B267346A386CCA73C0749E7B947C957E1B818A823685848FEB96F9 +99C14F34534A53CD53DB62CC642C6500659169C36CEE6F5873ED7554762276E4 +76FC78D078FB792C7D46822C87E08FD4981298EF52C362D464A56E246F510000 +DB +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000767C8DCB91B192629AEE9B435023508D574A59A85C285E475F77623F653E +65B965C16609678B699C6EC278C57D2180AA8180822B82B384A1868C8A2A8B17 +90A696329F90500D4FF3F96357F95F9862DC6392676F6E43711976C380CC80DA +88F488F589198CE08F29914D966A4F2F4F705E1B67CF6822767D767E9B445E61 +6A0A716971D4756AF9647E41854385E998DC4F107B4F7F7095A551E15E0668B5 +6C3E6C4E6CDB72AF7BC483036CD5743A50FB528858C164D86A9774A776560000 +DC +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000078A7861795E29739F965535E5F018B8A8FA88FAF908A522577A59C499F08 +4E19500251755C5B5E77661E663A67C468C570B3750175C579C97ADD8F279920 +9A084FDD582158315BF6666E6B656D116E7A6F7D73E4752B83E988DC89138B5C +8F144F0F50D55310535C5B935FA9670D798F8179832F8514890789868F398F3B +99A59C12672C4E764FF859495C015CEF5CF0636768D270FD71A2742B7E2B84EC +8702902292D29CF34E0D4ED84FEF50855256526F5426549057E0592B5A660000 +DD +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00005B5A5B755BCC5E9CF9666276657765A76D6E6EA572367B267C3F7F368150 +8151819A8240829983A98A038CA08CE68CFB8D748DBA90E891DC961C964499D9 +9CE7531752065429567458B35954596E5FFF61A4626E66106C7E711A76C67C89 +7CDE7D1B82AC8CC196F0F9674F5B5F175F7F62C25D29670B68DA787C7E439D6C +4E1550995315532A535159835A625E8760B2618A624962796590678769A76BD4 +6BD66BD76BD86CB8F968743575FA7812789179D579D87C837DCB7FE180A50000 +DE +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000813E81C283F2871A88E88AB98B6C8CBB9119975E98DB9F3B56AC5B2A5F6C +658C6AB36BAF6D5C6FF17015725D73AD8CA78CD3983B61916C3780589A014E4D +4E8B4E9B4ED54F3A4F3C4F7F4FDF50FF53F253F8550655E356DB58EB59625A11 +5BEB5BFA5C045DF35E2B5F99601D6368659C65AF67F667FB68AD6B7B6C996CD7 +6E23700973457802793E7940796079C17BE97D177D728086820D838E84D186C7 +88DF8A508A5E8B1D8CDC8D668FAD90AA98FC99DF9E9D524AF9696714F96A0000 +DF +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00005098522A5C7165636C5573CA7523759D7B97849C917897304E7764926BBA +715E85A94E09F96B674968EE6E17829F8518886B63F76F81921298AF4E0A50B7 +50CF511F554655AA56175B405C195CE05E385E8A5EA05EC260F368516A616E58 +723D724072C076F879657BB17FD488F389F48A738C618CDE971C585E74BD8CFD +55C7F96C7A617D2282727272751F7525F96D7B19588558FB5DBC5E8F5EB65F90 +60556292637F654D669166D966F8681668F27280745E7B6E7D6E7DD67F720000 +E0 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000080E5821285AF897F8A93901D92E49ECD9F205915596D5E2D60DC66146673 +67906C506DC56F5F77F378A984C691CB932B4ED950CA514855845B0B5BA36247 +657E65CB6E32717D74017444748774BF766C79AA7DDA7E557FA8817A81B38239 +861A87EC8A758DE3907892919425994D9BAE53685C5169546CC46D296E2B820C +859B893B8A2D8AAA96EA9F67526166B96BB27E9687FE8D0D9583965D651D6D89 +71EEF96E57CE59D35BAC602760FA6210661F665F732973F976DB77017B6C0000 +E1 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00008056807281658AA091924E1652E26B726D177A057B397D30F96F8CB053EC +562F58515BB55C0F5C115DE2624063836414662D68B36CBC6D886EAF701F70A4 +71D27526758F758E76197B117BE07C2B7D207D39852C856D86078A34900D9061 +90B592B797F69A374FD75C6C675F6D917C9F7E8C8B168D16901F5B6B5DFD640D +84C0905C98E173875B8B609A677E6DDE8A1F8AA69001980C5237F9707051788E +9396887091D74FEE53D755FD56DA578258FD5AC25B885CAB5CC05E2561010000 +E2 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000620D624B6388641C653665786A396B8A6C346D196F3171E772E973787407 +74B27626776179C07A577AEA7CB97D8F7DAC7E617F9E81298331849084DA85EA +88968AB08B908F3890429083916C929692B9968B96A796A896D6970098089996 +9AD39B1A53D4587E59195B705BBF6DD16F5A719F742174B9808583FD5DE15F87 +5FAA604265EC6812696F6A536B896D356DF373E376FE77AC7B4D7D148123821C +834084F485638A628AC49187931E980699B4620C88538FF092655D075D270000 +E3 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00005D69745F819D87686FD562FE7FD2893689724E1E4E5850E752DD5347627F +66077E698805965E4F8D5319563659CB5AA45C385C4E5C4D5E025F11604365BD +662F664267BE67F4731C77E2793A7FC5849484CD89968A668A698AE18C558C7A +57F45BD45F0F606F62ED690D6B966E5C71847BD287558B588EFE98DF98FE4F38 +4F814FE1547B5A205BB8613C65B0666871FC7533795E7D33814E81E3839885AA +85CE87038A0A8EAB8F9BF9718FC559315BA45BE660895BE95C0B5FC36C810000 +E4 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000F9726DF1700B751A82AF8AF64EC05341F97396D96C0F4E9E4FC45152555E +5A255CE86211725982BD83AA86FE88598A1D963F96C599139D099D5D580A5CB3 +5DBD5E4460E1611563E16A026E2591029354984E9C109F775B895CB86309664F +6848773C96C1978D98549B9F65A18B018ECB95BC55355CA95DD65EB56697764C +83F495C758D362BC72CE9D284EF0592E600F663B6B8379E79D26539354C057C3 +5D16611B66D66DAF788D827E969897445384627C63966DB27E0A814B984D0000 +E5 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00006AFB7F4C9DAF9E1A4E5F503B51B6591C60F963F66930723A8036F97491CE +5F31F975F9767D0482E5846F84BB85E58E8DF9774F6FF978F97958E45B436059 +63DA6518656D6698F97A694A6A236D0B7001716C75D2760D79B37A70F97B7F8A +F97C8944F97D8B9391C0967DF97E990A57045FA165BC6F01760079A68A9E99AD +9B5A9F6C510461B662916A8D81C6504358305F6671098A008AFA5B7C86164FFA +513C56B4594463A96DF95DAA696D51864E884F59F97FF980F9815982F9820000 +E6 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000F9836B5F6C5DF98474B57916F9858207824583398F3F8F5DF9869918F987 +F988F9894EA6F98A57DF5F796613F98BF98C75AB7E798B6FF98D90069A5B56A5 +582759F85A1F5BB4F98E5EF6F98FF9906350633BF991693D6C876CBF6D8E6D93 +6DF56F14F99270DF71367159F99371C371D5F994784F786FF9957B757DE3F996 +7E2FF997884D8EDFF998F999F99A925BF99B9CF6F99CF99DF99E60856D85F99F +71B1F9A0F9A195B153ADF9A2F9A3F9A467D3F9A5708E71307430827682D20000 +E7 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000F9A695BB9AE59E7D66C4F9A771C18449F9A8F9A9584BF9AAF9AB5DB85F71 +F9AC6620668E697969AE6C386CF36E366F416FDA701B702F715071DF7370F9AD +745BF9AE74D476C87A4E7E93F9AFF9B082F18A608FCEF9B19348F9B29719F9B3 +F9B44E42502AF9B5520853E166F36C6D6FCA730A777F7A6282AE85DD8602F9B6 +88D48A638B7D8C6BF9B792B3F9B8971398104E944F0D4FC950B25348543E5433 +55DA586258BA59675A1B5BE4609FF9B961CA655665FF666468A76C5A6FB30000 +E8 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000070CF71AC73527B7D87088AA49C329F075C4B6C8373447389923A6EAB7465 +761F7A697E15860A514058C564C174EE751576707FC1909596CD99546E2674E6 +7AA97AAA81E586D987788A1B5A495B8C5B9B68A169006D6373A97413742C7897 +7DE97FEB81188155839E8C4C962E981166F05F8065FA67896C6A738B502D5A03 +6B6A77EE59165D6C5DCD7325754FF9BAF9BB50E551F9582F592D599659DA5BE5 +F9BCF9BD5DA262D76416649364FEF9BE66DCF9BF6A48F9C071FF7464F9C10000 +E9 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00007A887AAF7E477E5E80008170F9C287EF89818B209059F9C390809952617E +6B326D747E1F89258FB14FD150AD519752C757C758895BB95EB8614269956D8C +6E676EB6719474627528752C8073833884C98E0A939493DEF9C44E8E4F515076 +512A53C853CB53F35B875BD35C24611A618265F4725B7397744076C279507991 +79B97D067FBD828B85D5865E8FC2904790F591EA968596E896E952D65F6765ED +6631682F715C7A3690C1980A4E91F9C56A526B9E6F907189801882B885530000 +EA +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000904B969596F297FB851A9B314E90718A96C45143539F54E15713571257A3 +5A9B5AC45BC36028613F63F46C856D396E726E907230733F745782D188818F45 +9060F9C6966298589D1B67088D8A925E4F4D504950DE5371570D59D45A015C09 +617066906E2D7232744B7DEF80C3840E8466853F875F885B89188B02905597CB +9B4F4E734F915112516AF9C7552F55A95B7A5BA55E7C5E7D5EBE60A060DF6108 +610963C465386709F9C867D467DAF9C9696169626CB96D27F9CA6E38F9CB0000 +EB +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00006FE173367337F9CC745C7531F9CD7652F9CEF9CF7DAD81FE843888D58A98 +8ADB8AED8E308E42904A903E907A914991C9936EF9D0F9D15809F9D26BD38089 +80B2F9D3F9D45141596B5C39F9D5F9D66F6473A780E48D07F9D79217958FF9D8 +F9D9F9DAF9DB807F620E701C7D68878DF9DC57A0606961476BB78ABE928096B1 +4E59541F6DEB852D967097F398EE63D66CE3909151DD61C981BA9DF94F9D501A +51005B9C610F61FF64EC69056BC5759177E37FA98264858F87FB88638ABC0000 +EC +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00008B7091AB4E8C4EE54F0AF9DDF9DE593759E8F9DF5DF25F1B5F5B6021F9E0 +F9E1F9E2F9E3723E73E5F9E4757075CDF9E579FBF9E6800C8033808482E18351 +F9E7F9E88CBD8CB39087F9E9F9EA98F4990CF9EBF9EC703776CA7FCA7FCC7FFC +8B1A4EBA4EC152035370F9ED54BD56E059FB5BC55F155FCD6E6EF9EEF9EF7D6A +8335F9F086938A8DF9F1976D9777F9F2F9F34E004F5A4F7E58F965E56EA29038 +93B099B94EFB58EC598A59D96041F9F4F9F57A14F9F6834F8CC3516553440000 +ED +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000F9F7F9F8F9F94ECD52695B5582BF4ED4523A54A859C959FF5B505B575B5C +606361486ECB7099716E738674F775B578C17D2B800581EA8328851785C98AEE +8CC796CC4F5C52FA56BC65AB6628707C70B872357DBD828D914C96C09D725B71 +68E76B986F7A76DE5C9166AB6F5B7BB47C2A883696DC4E084ED75320583458BB +58EF596C5C075E335E845F35638C66B267566A1F6AA36B0C6F3F7246F9FA7350 +748B7AE07CA7817881DF81E7838A846C8523859485CF88DD8D1391AC95770000 +EE +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000969C518D54C957285BB0624D6750683D68936E3D6ED3707D7E2188C18CA1 +8F099F4B9F4E722D7B8F8ACD931A4F474F4E5132548059D05E9562B56775696E +6A176CAE6E1A72D9732A75BD7BB87D3582E783F9845785F78A5B8CAF8E879019 +90B896CE9F5F52E3540A5AE15BC2645865756EF472C4F9FB76847A4D7B1B7C4D +7E3E7FDF837B8B2B8CCA8D648DE18E5F8FEA8FF9906993D14F434F7A50B35168 +5178524D526A5861587C59605C085C555EDB609B623068136BBF6C086FB10000 +EF +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000714E742075307538755176727B4C7B8B7BAD7BC67E8F8A6E8F3E8F49923F +92939322942B96FB985A986B991E5207622A62986D5976647ACA7BC07D765360 +5CBE5E976F3870B97C9897119B8E9EDE63A5647A87764E014E954EAD505C5075 +544859C35B9A5E405EAD5EF75F8160C5633A653F657465CC6676667867FE6968 +6A896B636C406DC06DE86E1F6E5E701E70A1738E73FD753A775B7887798E7A0B +7A7D7CBE7D8E82478A028AEA8C9E912D914A91D8926692CC9320970697560000 +F0 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000975C98029F0E52365291557C58245E1D5F1F608C63D068AF6FDF796D7B2C +81CD85BA88FD8AF88E44918D9664969B973D984C9F4A4FCE514651CB52A95632 +5F145F6B63AA64CD65E9664166FA66F9671D689D68D769FD6F156F6E716771E5 +722A74AA773A7956795A79DF7A207A957C977CDF7D447E70808785FB86A48A54 +8ABF8D998E819020906D91E3963B96D59CE565CF7C078DB393C35B585C0A5352 +62D9731D50275B975F9E60B0616B68D56DD9742E7A2E7D427D9C7E31816B0000 +F1 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00008E2A8E35937E94184F5057505DE65EA7632B7F6A4E3B4F4F4F8F505A59DD +80C4546A546855FE594F5B995DDE5EDA665D673167F1682A6CE86D326E4A6F8D +70B773E075877C4C7D027D2C7DA2821F86DB8A3B8A858D708E8A8F339031914E +9152944499D07AF97CA54FCA510151C657C85BEF5CFB66596A3D6D5A6E966FEC +710C756F7AE388229021907596CB99FF83014E2D4EF2884691CD537D6ADB696B +6C41847A589E618E66FE62EF70DD751175C77E5284B88B498D084E4B53EA0000 +F2 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000054AB573057405FD763016307646F652F65E8667A679D67B36B626C606C9A +6F2C77E57825794979577D1980A2810281F3829D82B787188A8CF9FC8D048DBE +907276F47A197A377E548077550755D45875632F64226649664B686D699B6B84 +6D256EB173CD746874A1755B75B976E1771E778B79E67E097E1D81FB852F8897 +8A3A8CD18EEB8FB0903293AD9663967397074F8453F159EA5AC95E19684E74C6 +75BE79E97A9281A386ED8CEA8DCC8FED659F6715F9FD57F76F577DDD8F2F0000 +F3 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000093F696C65FB561F26F844E144F98501F53C955DF5D6F5DEE6B216B6478CB +7B9AF9FE8E498ECA906E6349643E77407A84932F947F9F6A64B06FAF71E674A8 +74DA7AC47C127E827CB27E988B9A8D0A947D9910994C52395BDF64E6672D7D2E +50ED53C358796158615961FA65AC7AD98B928B9650095021527555315A3C5EE0 +5F706134655E660C663666A269CD6EC46F32731676217A938139825983D684BC +50B557F05BC05BE85F6963A178267DB583DC852191C791F5518A67F57B560000 +F4 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00008CAC51C459BB60BD8655501CF9FF52545C3A617D621A62D364F265A56ECC +7620810A8E60965F96BB4EDF5343559859295DDD64C56CC96DFA73947A7F821B +85A68CE48E10907791E795E1962197C651F854F255865FB964A46F887DB48F1F +8F4D943550C95C166CBE6DFB751B77BB7C3D7C648A798AC2581E59BE5E166377 +7252758A776B8ADC8CBC8F125EF366746DF8807D83C18ACB97519BD6FA005243 +66FF6D956EEF7DE08AE6902E905E9AD4521D527F54E86194628462DB68A20000 +F5 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00006912695A6A3570927126785D7901790E79D27A0D8096827882D583498549 +8C828D859162918B91AE4FC356D171ED77D7870089F85BF85FD6675190A853E2 +585A5BF560A4618164607E3D80708525928364AE50AC5D146700589C62BD63A8 +690E69786A1E6E6B76BA79CB82BB84298ACF8DA88FFD9112914B919C93109318 +939A96DB9A369C0D4E11755C795D7AFA7B517BC97E2E84C48E598E748EF89010 +6625693F744351FA672E9EDC51455FE06C9687F2885D887760B481B584030000 +F6 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00008D0553D6543956345A365C31708A7FE0805A810681ED8DA391899A5F9DF2 +50744EC453A060FB6E2C5C644F88502455E45CD95E5F606568946CBB6DC471BE +75D475F476617A1A7A497DC77DFB7F6E81F486A98F1C96C999B39F52524752C5 +98ED89AA4E0367D26F064FB55BE267956C886D78741B782791DD937C87C479E4 +7A315FEB4ED654A4553E58AE59A560F0625362D6673669558235964099B199DD +502C53535544577CFA016258FA0264E2666B67DD6FC16FEF742274388A170000 +F7 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000094385451560657665F48619A6B4E705870AD7DBB8A95596A812B63A27708 +803D8CAA5854642D69BB5B955E116E6FFA038569514C53F0592A6020614B6B86 +6C706CF07B1E80CE82D48DC690B098B1FA0464C76FA464916504514E5410571F +8A0E615F6876FA0575DB7B527D71901A580669CC817F892A9000983950785957 +59AC6295900F9B2A615D727995D657615A465DF4628A64AD64FA67776CE26D3E +722C743678347F7782AD8DDB981752245742677F724874E38CA98FA692110000 +F8 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000962A516B53ED634C4F695504609665576C9B6D7F724C72FD7A1789878C9D +5F6D6F8E70F981A8610E4FBF504F624172477BC77DE87FE9904D97AD9A198CB6 +576A5E7367B0840D8A5554205B165E635EE25F0A658380BA853D9589965B4F48 +5305530D530F548654FA57035E036016629B62B16355FA066CE16D6675B17832 +80DE812F82DE846184B2888D8912900B92EA98FD9B915E4566B466DD70117206 +FA074FF5527D5F6A615367536A196F0274E2796888688C7998C798C49A430000 +F9 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000054C17A1F69538AF78C4A98A899AE5F7C62AB75B276AE88AB907F96425339 +5F3C5FC56CCC73CC7562758B7B4682FE999D4E4F903C4E0B4F5553A6590F5EC8 +66306CB37455837787668CC09050971E9C1558D15B7886508B149DB45BD26068 +608D65F16C576F226FA3701A7F557FF095919592965097D352728F4451FD542B +54B85563558A6ABB6DB57DD88266929C96779E79540854C876D286E495A495D4 +965C4EA24F0959EE5AE65DF760526297676D68416C866E2F7F38809B822A0000 +FA +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000FA08FA0998054EA5505554B35793595A5B695BB361C869776D77702387F9 +89E38A728AE7908299ED9AB852BE683850165E78674F8347884C4EAB541156AE +73E6911597FF9909995799995653589F865B8A3161B26AF6737B8ED26B4796AA +9A57595572008D6B97694FD45CF45F2661F8665B6CEB70AB738473B973FE7729 +774D7D437D627E2382378852FA0A8CE29249986F5B517A74884098015ACC4FE0 +5354593E5CFD633E6D7972F98105810783A292CF98304EA851445211578B0000 +FB +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00005F626CC26ECE7005705070AF719273E97469834A87A28861900890A293A3 +99A8516E5F5760E0616766B385598E4A91AF978B4E4E4E92547C58D558FA597D +5CB55F2762366248660A66676BEB6D696DCF6E566EF86F946FE06FE9705D72D0 +7425745A74E07693795C7CCA7E1E80E182A6846B84BF864E865F87748B778C6A +93AC9800986560D1621691775A5A660F6DF76E3E743F9B425FFD60DA7B0F54C4 +5F186C5E6CD36D2A70D87D0586798A0C9D3B5316548C5B056A3A706B75750000 +FC +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000798D79BE82B183EF8A718B418CA89774FA0B64F4652B78BA78BB7A6B4E38 +559A59505BA65E7B60A363DB6B61666568536E19716574B07D0890849A699C25 +6D3B6ED1733E8C4195CA51F05E4C5FA8604D60F66130614C6643664469A56CC1 +6E5F6EC96F62714C749C76877BC17C27835287579051968D9EC3532F56DE5EFB +5F8A6062609461F7666667036A9C6DEE6FAE7070736A7E6A81BE833486D48AA8 +8CC4528373725B966A6B940454EE56865B5D6548658566C9689F6D8D6DC60000 +FD +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000723B80B491759A4D4FAF5019539A540E543C558955C55E3F5F8C673D7166 +73DD900552DB52F3586458CE7104718F71FB85B08A13668885A855A76684714A +8431534955996BC15F595FBD63EE668971478AF18F1D9EBE4F11643A70CB7566 +866760648B4E9DF8514751F653086D3680F89ED166156B23709875D554035C79 +7D078A166B206B3D6B46543860706D3D7FD5820850D651DE559C566B56CD59EC +5B095E0C619961986231665E66E6719971B971BA72A779A77A007FB28A700000 diff --git a/env/tcl/tcl8.6/encoding/cp950.enc b/env/tcl/tcl8.6/encoding/cp950.enc new file mode 100644 index 0000000..f33d785 --- /dev/null +++ b/env/tcl/tcl8.6/encoding/cp950.enc @@ -0,0 +1,1499 @@ +# Encoding file: cp950, multi-byte +M +003F 0 88 +00 +0000000100020003000400050006000700080009000A000B000C000D000E000F +0010001100120013001400150016001700180019001A001B001C001D001E001F +0020002100220023002400250026002700280029002A002B002C002D002E002F +0030003100320033003400350036003700380039003A003B003C003D003E003F +0040004100420043004400450046004700480049004A004B004C004D004E004F +0050005100520053005400550056005700580059005A005B005C005D005E005F +0060006100620063006400650066006700680069006A006B006C006D006E006F +0070007100720073007400750076007700780079007A007B007C007D007E007F +0080008100820083008400850086008700880089008A008B008C008D008E008F +0090009100920093009400950096009700980099009A009B009C009D009E009F +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +A1 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +3000FF0C30013002FF0E2027FF1BFF1AFF1FFF01FE3020262025FE50FE51FE52 +00B7FE54FE55FE56FE57FF5C2013FE312014FE332574FE34FE4FFF08FF09FE35 +FE36FF5BFF5DFE37FE3830143015FE39FE3A30103011FE3BFE3C300A300BFE3D +FE3E30083009FE3FFE40300C300DFE41FE42300E300FFE43FE44FE59FE5A0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000FE5BFE5CFE5DFE5E20182019201C201D301D301E20352032FF03FF06FF0A +203B00A7300325CB25CF25B325B225CE2606260525C725C625A125A025BD25BC +32A3210500AFFFE3FF3F02CDFE49FE4AFE4DFE4EFE4BFE4CFE5FFE60FE61FF0B +FF0D00D700F700B1221AFF1CFF1EFF1D226622672260221E22522261FE62FE63 +FE64FE65FE66FF5E2229222A22A52220221F22BF33D233D1222B222E22352234 +26402642229522992191219321902192219621972199219822252223FF0F0000 +A2 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +FF3C2215FE68FF04FFE53012FFE0FFE1FF05FF2021032109FE69FE6AFE6B33D5 +339C339D339E33CE33A1338E338F33C400B05159515B515E515D5161516355E7 +74E97CCE25812582258325842585258625872588258F258E258D258C258B258A +2589253C2534252C2524251C2594250025022595250C251025142518256D0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000256E2570256F2550255E256A256125E225E325E525E4257125722573FF10 +FF11FF12FF13FF14FF15FF16FF17FF18FF192160216121622163216421652166 +216721682169302130223023302430253026302730283029534153445345FF21 +FF22FF23FF24FF25FF26FF27FF28FF29FF2AFF2BFF2CFF2DFF2EFF2FFF30FF31 +FF32FF33FF34FF35FF36FF37FF38FF39FF3AFF41FF42FF43FF44FF45FF46FF47 +FF48FF49FF4AFF4BFF4CFF4DFF4EFF4FFF50FF51FF52FF53FF54FF55FF560000 +A3 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +FF57FF58FF59FF5A039103920393039403950396039703980399039A039B039C +039D039E039F03A003A103A303A403A503A603A703A803A903B103B203B303B4 +03B503B603B703B803B903BA03BB03BC03BD03BE03BF03C003C103C303C403C5 +03C603C703C803C931053106310731083109310A310B310C310D310E310F0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00003110311131123113311431153116311731183119311A311B311C311D311E +311F312031213122312331243125312631273128312902D902C902CA02C702CB +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000020AC00000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +A4 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +4E004E594E014E034E434E5D4E864E8C4EBA513F5165516B51E052005201529B +53155341535C53C84E094E0B4E084E0A4E2B4E3851E14E454E484E5F4E5E4E8E +4EA15140520352FA534353C953E3571F58EB5915592759735B505B515B535BF8 +5C0F5C225C385C715DDD5DE55DF15DF25DF35DFE5E725EFE5F0B5F13624D0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00004E114E104E0D4E2D4E304E394E4B5C394E884E914E954E924E944EA24EC1 +4EC04EC34EC64EC74ECD4ECA4ECB4EC4514351415167516D516E516C519751F6 +52065207520852FB52FE52FF53165339534853475345535E538453CB53CA53CD +58EC5929592B592A592D5B545C115C245C3A5C6F5DF45E7B5EFF5F145F155FC3 +62086236624B624E652F6587659765A465B965E566F0670867286B206B626B79 +6BCB6BD46BDB6C0F6C34706B722A7236723B72477259725B72AC738B4E190000 +A5 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +4E164E154E144E184E3B4E4D4E4F4E4E4EE54ED84ED44ED54ED64ED74EE34EE4 +4ED94EDE514551445189518A51AC51F951FA51F8520A52A0529F530553065317 +531D4EDF534A534953615360536F536E53BB53EF53E453F353EC53EE53E953E8 +53FC53F853F553EB53E653EA53F253F153F053E553ED53FB56DB56DA59160000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000592E5931597459765B555B835C3C5DE85DE75DE65E025E035E735E7C5F01 +5F185F175FC5620A625362546252625165A565E6672E672C672A672B672D6B63 +6BCD6C116C106C386C416C406C3E72AF7384738974DC74E67518751F75287529 +7530753175327533758B767D76AE76BF76EE77DB77E277F3793A79BE7A747ACB +4E1E4E1F4E524E534E694E994EA44EA64EA54EFF4F094F194F0A4F154F0D4F10 +4F114F0F4EF24EF64EFB4EF04EF34EFD4F014F0B514951475146514851680000 +A6 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +5171518D51B0521752115212520E521652A3530853215320537053715409540F +540C540A54105401540B54045411540D54085403540E5406541256E056DE56DD +573357305728572D572C572F57295919591A59375938598459785983597D5979 +598259815B575B585B875B885B855B895BFA5C165C795DDE5E065E765E740000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00005F0F5F1B5FD95FD6620E620C620D62106263625B6258653665E965E865EC +65ED66F266F36709673D6734673167356B216B646B7B6C166C5D6C576C596C5F +6C606C506C556C616C5B6C4D6C4E7070725F725D767E7AF97C737CF87F367F8A +7FBD80018003800C80128033807F8089808B808C81E381EA81F381FC820C821B +821F826E8272827E866B8840884C8863897F96214E324EA84F4D4F4F4F474F57 +4F5E4F344F5B4F554F304F504F514F3D4F3A4F384F434F544F3C4F464F630000 +A7 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +4F5C4F604F2F4F4E4F364F594F5D4F484F5A514C514B514D517551B651B75225 +52245229522A522852AB52A952AA52AC532353735375541D542D541E543E5426 +544E542754465443543354485442541B5429544A5439543B5438542E54355436 +5420543C54405431542B541F542C56EA56F056E456EB574A57515740574D0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00005747574E573E5750574F573B58EF593E599D599259A8599E59A359995996 +598D59A45993598A59A55B5D5B5C5B5A5B5B5B8C5B8B5B8F5C2C5C405C415C3F +5C3E5C905C915C945C8C5DEB5E0C5E8F5E875E8A5EF75F045F1F5F645F625F77 +5F795FD85FCC5FD75FCD5FF15FEB5FF85FEA6212621162846297629662806276 +6289626D628A627C627E627962736292626F6298626E62956293629162866539 +653B653865F166F4675F674E674F67506751675C6756675E6749674667600000 +A8 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +675367576B656BCF6C426C5E6C996C816C886C896C856C9B6C6A6C7A6C906C70 +6C8C6C686C966C926C7D6C836C726C7E6C746C866C766C8D6C946C986C827076 +707C707D707872627261726072C472C27396752C752B75377538768276EF77E3 +79C179C079BF7A767CFB7F5580968093809D8098809B809A80B2826F82920000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000828B828D898B89D28A008C378C468C558C9D8D648D708DB38EAB8ECA8F9B +8FB08FC28FC68FC58FC45DE1909190A290AA90A690A3914991C691CC9632962E +9631962A962C4E264E564E734E8B4E9B4E9E4EAB4EAC4F6F4F9D4F8D4F734F7F +4F6C4F9B4F8B4F864F834F704F754F884F694F7B4F964F7E4F8F4F914F7A5154 +51525155516951775176517851BD51FD523B52385237523A5230522E52365241 +52BE52BB5352535453535351536653775378537953D653D453D7547354750000 +A9 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +5496547854955480547B5477548454925486547C549054715476548C549A5462 +5468548B547D548E56FA57835777576A5769576157665764577C591C59495947 +59485944595459BE59BB59D459B959AE59D159C659D059CD59CB59D359CA59AF +59B359D259C55B5F5B645B635B975B9A5B985B9C5B995B9B5C1A5C485C450000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00005C465CB75CA15CB85CA95CAB5CB15CB35E185E1A5E165E155E1B5E115E78 +5E9A5E975E9C5E955E965EF65F265F275F295F805F815F7F5F7C5FDD5FE05FFD +5FF55FFF600F6014602F60356016602A6015602160276029602B601B62166215 +623F623E6240627F62C962CC62C462BF62C262B962D262DB62AB62D362D462CB +62C862A862BD62BC62D062D962C762CD62B562DA62B162D862D662D762C662AC +62CE653E65A765BC65FA66146613660C66066602660E6600660F6615660A0000 +AA +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +6607670D670B676D678B67956771679C677367776787679D6797676F6770677F +6789677E67906775679A6793677C676A67726B236B666B676B7F6C136C1B6CE3 +6CE86CF36CB16CCC6CE56CB36CBD6CBE6CBC6CE26CAB6CD56CD36CB86CC46CB9 +6CC16CAE6CD76CC56CF16CBF6CBB6CE16CDB6CCA6CAC6CEF6CDC6CD66CE00000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00007095708E7092708A7099722C722D723872487267726972C072CE72D972D7 +72D073A973A8739F73AB73A5753D759D7599759A768476C276F276F477E577FD +793E7940794179C979C87A7A7A797AFA7CFE7F547F8C7F8B800580BA80A580A2 +80B180A180AB80A980B480AA80AF81E581FE820D82B3829D829982AD82BD829F +82B982B182AC82A582AF82B882A382B082BE82B7864E8671521D88688ECB8FCE +8FD48FD190B590B890B190B691C791D195779580961C9640963F963B96440000 +AB +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +964296B996E89752975E4E9F4EAD4EAE4FE14FB54FAF4FBF4FE04FD14FCF4FDD +4FC34FB64FD84FDF4FCA4FD74FAE4FD04FC44FC24FDA4FCE4FDE4FB751575192 +519151A0524E5243524A524D524C524B524752C752C952C352C1530D5357537B +539A53DB54AC54C054A854CE54C954B854A654B354C754C254BD54AA54C10000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000054C454C854AF54AB54B154BB54A954A754BF56FF5782578B57A057A357A2 +57CE57AE579359555951594F594E595059DC59D859FF59E359E85A0359E559EA +59DA59E65A0159FB5B695BA35BA65BA45BA25BA55C015C4E5C4F5C4D5C4B5CD9 +5CD25DF75E1D5E255E1F5E7D5EA05EA65EFA5F085F2D5F655F885F855F8A5F8B +5F875F8C5F896012601D60206025600E6028604D60706068606260466043606C +606B606A6064624162DC6316630962FC62ED630162EE62FD630762F162F70000 +AC +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +62EF62EC62FE62F463116302653F654565AB65BD65E26625662D66206627662F +661F66286631662466F767FF67D367F167D467D067EC67B667AF67F567E967EF +67C467D167B467DA67E567B867CF67DE67F367B067D967E267DD67D26B6A6B83 +6B866BB56BD26BD76C1F6CC96D0B6D326D2A6D416D256D0C6D316D1E6D170000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00006D3B6D3D6D3E6D366D1B6CF56D396D276D386D296D2E6D356D0E6D2B70AB +70BA70B370AC70AF70AD70B870AE70A472307272726F727472E972E072E173B7 +73CA73BB73B273CD73C073B3751A752D754F754C754E754B75AB75A475A575A2 +75A3767876867687768876C876C676C376C5770176F976F87709770B76FE76FC +770777DC78027814780C780D794679497948794779B979BA79D179D279CB7A7F +7A817AFF7AFD7C7D7D027D057D007D097D077D047D067F387F8E7FBF80040000 +AD +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +8010800D8011803680D680E580DA80C380C480CC80E180DB80CE80DE80E480DD +81F4822282E78303830582E382DB82E6830482E58302830982D282D782F18301 +82DC82D482D182DE82D382DF82EF830686508679867B867A884D886B898189D4 +8A088A028A038C9E8CA08D748D738DB48ECD8ECC8FF08FE68FE28FEA8FE50000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00008FED8FEB8FE48FE890CA90CE90C190C3914B914A91CD95829650964B964C +964D9762976997CB97ED97F3980198A898DB98DF999699994E584EB3500C500D +50234FEF502650254FF8502950165006503C501F501A501250114FFA50005014 +50284FF15021500B501950184FF34FEE502D502A4FFE502B5009517C51A451A5 +51A251CD51CC51C651CB5256525C5254525B525D532A537F539F539D53DF54E8 +55105501553754FC54E554F2550654FA551454E954ED54E1550954EE54EA0000 +AE +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +54E65527550754FD550F5703570457C257D457CB57C35809590F59575958595A +5A115A185A1C5A1F5A1B5A1359EC5A205A235A295A255A0C5A095B6B5C585BB0 +5BB35BB65BB45BAE5BB55BB95BB85C045C515C555C505CED5CFD5CFB5CEA5CE8 +5CF05CF65D015CF45DEE5E2D5E2B5EAB5EAD5EA75F315F925F915F9060590000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00006063606560506055606D6069606F6084609F609A608D6094608C60856096 +624762F3630862FF634E633E632F635563426346634F6349633A6350633D632A +632B6328634D634C65486549659965C165C566426649664F66436652664C6645 +664166F867146715671768216838684868466853683968426854682968B36817 +684C6851683D67F468506840683C6843682A68456813681868416B8A6B896BB7 +6C236C276C286C266C246CF06D6A6D956D886D876D666D786D776D596D930000 +AF +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +6D6C6D896D6E6D5A6D746D696D8C6D8A6D796D856D656D9470CA70D870E470D9 +70C870CF7239727972FC72F972FD72F872F7738673ED740973EE73E073EA73DE +7554755D755C755A755975BE75C575C775B275B375BD75BC75B975C275B8768B +76B076CA76CD76CE7729771F7720772877E9783078277838781D783478370000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00007825782D7820781F7832795579507960795F7956795E795D7957795A79E4 +79E379E779DF79E679E979D87A847A887AD97B067B117C897D217D177D0B7D0A +7D207D227D147D107D157D1A7D1C7D0D7D197D1B7F3A7F5F7F947FC57FC18006 +8018801580198017803D803F80F1810280F0810580ED80F4810680F880F38108 +80FD810A80FC80EF81ED81EC82008210822A822B8228822C82BB832B83528354 +834A83388350834983358334834F833283398336831783408331832883430000 +B0 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +8654868A86AA869386A486A9868C86A3869C8870887788818882887D88798A18 +8A108A0E8A0C8A158A0A8A178A138A168A0F8A118C488C7A8C798CA18CA28D77 +8EAC8ED28ED48ECF8FB1900190068FF790008FFA8FF490038FFD90058FF89095 +90E190DD90E29152914D914C91D891DD91D791DC91D995839662966396610000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000965B965D96649658965E96BB98E299AC9AA89AD89B259B329B3C4E7E507A +507D505C50475043504C505A504950655076504E5055507550745077504F500F +506F506D515C519551F0526A526F52D252D952D852D55310530F5319533F5340 +533E53C366FC5546556A55665544555E55615543554A55315556554F5555552F +55645538552E555C552C55635533554155575708570B570957DF5805580A5806 +57E057E457FA5802583557F757F9592059625A365A415A495A665A6A5A400000 +B1 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +5A3C5A625A5A5A465A4A5B705BC75BC55BC45BC25BBF5BC65C095C085C075C60 +5C5C5C5D5D075D065D0E5D1B5D165D225D115D295D145D195D245D275D175DE2 +5E385E365E335E375EB75EB85EB65EB55EBE5F355F375F575F6C5F695F6B5F97 +5F995F9E5F985FA15FA05F9C607F60A3608960A060A860CB60B460E660BD0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000060C560BB60B560DC60BC60D860D560C660DF60B860DA60C7621A621B6248 +63A063A76372639663A263A563776367639863AA637163A963896383639B636B +63A863846388639963A163AC6392638F6380637B63696368637A655D65566551 +65596557555F654F655865556554659C659B65AC65CF65CB65CC65CE665D665A +666466686666665E66F952D7671B688168AF68A2689368B5687F687668B168A7 +689768B0688368C468AD688668856894689D68A8689F68A168826B326BBA0000 +B2 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +6BEB6BEC6C2B6D8E6DBC6DF36DD96DB26DE16DCC6DE46DFB6DFA6E056DC76DCB +6DAF6DD16DAE6DDE6DF96DB86DF76DF56DC56DD26E1A6DB56DDA6DEB6DD86DEA +6DF16DEE6DE86DC66DC46DAA6DEC6DBF6DE670F97109710A70FD70EF723D727D +7281731C731B73167313731973877405740A7403740673FE740D74E074F60000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000074F7751C75227565756675627570758F75D475D575B575CA75CD768E76D4 +76D276DB7737773E773C77367738773A786B7843784E79657968796D79FB7A92 +7A957B207B287B1B7B2C7B267B197B1E7B2E7C927C977C957D467D437D717D2E +7D397D3C7D407D307D337D447D2F7D427D327D317F3D7F9E7F9A7FCC7FCE7FD2 +801C804A8046812F81168123812B81298130812482028235823782368239838E +839E8398837883A2839683BD83AB8392838A8393838983A08377837B837C0000 +B3 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +838683A786555F6A86C786C086B686C486B586C686CB86B186AF86C98853889E +888888AB88928896888D888B8993898F8A2A8A1D8A238A258A318A2D8A1F8A1B +8A228C498C5A8CA98CAC8CAB8CA88CAA8CA78D678D668DBE8DBA8EDB8EDF9019 +900D901A90179023901F901D90109015901E9020900F90229016901B90140000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000090E890ED90FD915791CE91F591E691E391E791ED91E99589966A96759673 +96789670967496769677966C96C096EA96E97AE07ADF980298039B5A9CE59E75 +9E7F9EA59EBB50A2508D508550995091508050965098509A670051F152725274 +5275526952DE52DD52DB535A53A5557B558055A7557C558A559D55985582559C +55AA55945587558B558355B355AE559F553E55B2559A55BB55AC55B1557E5589 +55AB5599570D582F582A58345824583058315821581D582058F958FA59600000 +B4 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +5A775A9A5A7F5A925A9B5AA75B735B715BD25BCC5BD35BD05C0A5C0B5C315D4C +5D505D345D475DFD5E455E3D5E405E435E7E5ECA5EC15EC25EC45F3C5F6D5FA9 +5FAA5FA860D160E160B260B660E0611C612360FA611560F060FB60F4616860F1 +610E60F6610961006112621F624963A3638C63CF63C063E963C963C663CD0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000063D263E363D063E163D663ED63EE637663F463EA63DB645263DA63F9655E +6566656265636591659065AF666E667066746676666F6691667A667E667766FE +66FF671F671D68FA68D568E068D868D7690568DF68F568EE68E768F968D268F2 +68E368CB68CD690D6912690E68C968DA696E68FB6B3E6B3A6B3D6B986B966BBC +6BEF6C2E6C2F6C2C6E2F6E386E546E216E326E676E4A6E206E256E236E1B6E5B +6E586E246E566E6E6E2D6E266E6F6E346E4D6E3A6E2C6E436E1D6E3E6ECB0000 +B5 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +6E896E196E4E6E636E446E726E696E5F7119711A7126713071217136716E711C +724C728472807336732573347329743A742A743374227425743574367434742F +741B7426742875257526756B756A75E275DB75E375D975D875DE75E0767B767C +7696769376B476DC774F77ED785D786C786F7A0D7A087A0B7A057A007A980000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00007A977A967AE57AE37B497B567B467B507B527B547B4D7B4B7B4F7B517C9F +7CA57D5E7D507D687D557D2B7D6E7D727D617D667D627D707D7355847FD47FD5 +800B8052808581558154814B8151814E81398146813E814C815381748212821C +83E9840383F8840D83E083C5840B83C183EF83F183F48457840A83F0840C83CC +83FD83F283CA8438840E840483DC840783D483DF865B86DF86D986ED86D486DB +86E486D086DE885788C188C288B1898389968A3B8A608A558A5E8A3C8A410000 +B6 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +8A548A5B8A508A468A348A3A8A368A568C618C828CAF8CBC8CB38CBD8CC18CBB +8CC08CB48CB78CB68CBF8CB88D8A8D858D818DCE8DDD8DCB8DDA8DD18DCC8DDB +8DC68EFB8EF88EFC8F9C902E90359031903890329036910290F5910990FE9163 +916591CF9214921592239209921E920D9210920792119594958F958B95910000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000095939592958E968A968E968B967D96859686968D9672968496C196C596C4 +96C696C796EF96F297CC98059806980898E798EA98EF98E998F298ED99AE99AD +9EC39ECD9ED14E8250AD50B550B250B350C550BE50AC50B750BB50AF50C7527F +5277527D52DF52E652E452E252E3532F55DF55E855D355E655CE55DC55C755D1 +55E355E455EF55DA55E155C555C655E555C957125713585E585158585857585A +5854586B584C586D584A58625852584B59675AC15AC95ACC5ABE5ABD5ABC0000 +B7 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +5AB35AC25AB25D695D6F5E4C5E795EC95EC85F125F595FAC5FAE611A610F6148 +611F60F3611B60F961016108614E614C6144614D613E61346127610D61066137 +622162226413643E641E642A642D643D642C640F641C6414640D643664166417 +6406656C659F65B06697668966876688669666846698668D67036994696D0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000695A697769606954697569306982694A6968696B695E695369796986695D +6963695B6B476B726BC06BBF6BD36BFD6EA26EAF6ED36EB66EC26E906E9D6EC7 +6EC56EA56E986EBC6EBA6EAB6ED16E966E9C6EC46ED46EAA6EA76EB4714E7159 +7169716471497167715C716C7166714C7165715E714671687156723A72527337 +7345733F733E746F745A7455745F745E7441743F7459745B745C757675787600 +75F0760175F275F175FA75FF75F475F376DE76DF775B776B7766775E77630000 +B8 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +7779776A776C775C77657768776277EE788E78B078977898788C7889787C7891 +7893787F797A797F7981842C79BD7A1C7A1A7A207A147A1F7A1E7A9F7AA07B77 +7BC07B607B6E7B677CB17CB37CB57D937D797D917D817D8F7D5B7F6E7F697F6A +7F727FA97FA87FA480568058808680848171817081788165816E8173816B0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00008179817A81668205824784828477843D843184758466846B8449846C845B +843C8435846184638469846D8446865E865C865F86F9871387088707870086FE +86FB870287038706870A885988DF88D488D988DC88D888DD88E188CA88D588D2 +899C89E38A6B8A728A738A668A698A708A878A7C8A638AA08A718A858A6D8A62 +8A6E8A6C8A798A7B8A3E8A688C628C8A8C898CCA8CC78CC88CC48CB28CC38CC2 +8CC58DE18DDF8DE88DEF8DF38DFA8DEA8DE48DE68EB28F038F098EFE8F0A0000 +B9 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +8F9F8FB2904B904A905390429054903C905590509047904F904E904D9051903E +904191129117916C916A916991C9923792579238923D9240923E925B924B9264 +925192349249924D92459239923F925A959896989694969596CD96CB96C996CA +96F796FB96F996F6975697749776981098119813980A9812980C98FC98F40000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000098FD98FE99B399B199B49AE19CE99E829F0E9F139F2050E750EE50E550D6 +50ED50DA50D550CF50D150F150CE50E9516251F352835282533153AD55FE5600 +561B561755FD561456065609560D560E55F75616561F5608561055F657185716 +5875587E58835893588A58795885587D58FD592559225924596A59695AE15AE6 +5AE95AD75AD65AD85AE35B755BDE5BE75BE15BE55BE65BE85BE25BE45BDF5C0D +5C625D845D875E5B5E635E555E575E545ED35ED65F0A5F465F705FB961470000 +BA +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +613F614B617761626163615F615A61586175622A64876458645464A46478645F +647A645164676434646D647B657265A165D765D666A266A8669D699C69A86995 +69C169AE69D369CB699B69B769BB69AB69B469D069CD69AD69CC69A669C369A3 +6B496B4C6C336F336F146EFE6F136EF46F296F3E6F206F2C6F0F6F026F220000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00006EFF6EEF6F066F316F386F326F236F156F2B6F2F6F886F2A6EEC6F016EF2 +6ECC6EF771947199717D718A71847192723E729272967344735074647463746A +7470746D750475917627760D760B7609761376E176E37784777D777F776178C1 +789F78A778B378A978A3798E798F798D7A2E7A317AAA7AA97AED7AEF7BA17B95 +7B8B7B757B977B9D7B947B8F7BB87B877B847CB97CBD7CBE7DBB7DB07D9C7DBD +7DBE7DA07DCA7DB47DB27DB17DBA7DA27DBF7DB57DB87DAD7DD27DC77DAC0000 +BB +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +7F707FE07FE17FDF805E805A808781508180818F8188818A817F818281E781FA +82078214821E824B84C984BF84C684C48499849E84B2849C84CB84B884C084D3 +849084BC84D184CA873F871C873B872287258734871887558737872988F38902 +88F488F988F888FD88E8891A88EF8AA68A8C8A9E8AA38A8D8AA18A938AA40000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00008AAA8AA58AA88A988A918A9A8AA78C6A8C8D8C8C8CD38CD18CD28D6B8D99 +8D958DFC8F148F128F158F138FA390609058905C90639059905E9062905D905B +91199118911E917591789177917492789280928592989296927B9293929C92A8 +927C929195A195A895A995A395A595A49699969C969B96CC96D29700977C9785 +97F69817981898AF98B199039905990C990999C19AAF9AB09AE69B419B429CF4 +9CF69CF39EBC9F3B9F4A5104510050FB50F550F9510251085109510551DC0000 +BC +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +528752885289528D528A52F053B2562E563B56395632563F563456295653564E +565756745636562F56305880589F589E58B3589C58AE58A958A6596D5B095AFB +5B0B5AF55B0C5B085BEE5BEC5BE95BEB5C645C655D9D5D945E625E5F5E615EE2 +5EDA5EDF5EDD5EE35EE05F485F715FB75FB561766167616E615D615561820000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000617C6170616B617E61A7619061AB618E61AC619A61A4619461AE622E6469 +646F6479649E64B26488649064B064A56493649564A9649264AE64AD64AB649A +64AC649964A264B365756577657866AE66AB66B466B16A236A1F69E86A016A1E +6A1969FD6A216A136A0A69F36A026A0569ED6A116B506B4E6BA46BC56BC66F3F +6F7C6F846F516F666F546F866F6D6F5B6F786F6E6F8E6F7A6F706F646F976F58 +6ED56F6F6F606F5F719F71AC71B171A87256729B734E73577469748B74830000 +BD +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +747E7480757F76207629761F7624762676217622769A76BA76E4778E7787778C +7791778B78CB78C578BA78CA78BE78D578BC78D07A3F7A3C7A407A3D7A377A3B +7AAF7AAE7BAD7BB17BC47BB47BC67BC77BC17BA07BCC7CCA7DE07DF47DEF7DFB +7DD87DEC7DDD7DE87DE37DDA7DDE7DE97D9E7DD97DF27DF97F757F777FAF0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00007FE98026819B819C819D81A0819A81988517853D851A84EE852C852D8513 +851185238521851484EC852584FF850687828774877687608766877887688759 +8757874C8753885B885D89108907891289138915890A8ABC8AD28AC78AC48A95 +8ACB8AF88AB28AC98AC28ABF8AB08AD68ACD8AB68AB98ADB8C4C8C4E8C6C8CE0 +8CDE8CE68CE48CEC8CED8CE28CE38CDC8CEA8CE18D6D8D9F8DA38E2B8E108E1D +8E228E0F8E298E1F8E218E1E8EBA8F1D8F1B8F1F8F298F268F2A8F1C8F1E0000 +BE +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +8F259069906E9068906D90779130912D9127913191879189918B918392C592BB +92B792EA92AC92E492C192B392BC92D292C792F092B295AD95B1970497069707 +97099760978D978B978F9821982B981C98B3990A99139912991899DD99D099DF +99DB99D199D599D299D99AB79AEE9AEF9B279B459B449B779B6F9D069D090000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00009D039EA99EBE9ECE58A89F5251125118511451105115518051AA51DD5291 +529352F35659566B5679566956645678566A566856655671566F566C56625676 +58C158BE58C758C5596E5B1D5B345B785BF05C0E5F4A61B2619161A9618A61CD +61B661BE61CA61C8623064C564C164CB64BB64BC64DA64C464C764C264CD64BF +64D264D464BE657466C666C966B966C466C766B86A3D6A386A3A6A596A6B6A58 +6A396A446A626A616A4B6A476A356A5F6A486B596B776C056FC26FB16FA10000 +BF +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +6FC36FA46FC16FA76FB36FC06FB96FB66FA66FA06FB471BE71C971D071D271C8 +71D571B971CE71D971DC71C371C47368749C74A37498749F749E74E2750C750D +76347638763A76E776E577A0779E779F77A578E878DA78EC78E779A67A4D7A4E +7A467A4C7A4B7ABA7BD97C117BC97BE47BDB7BE17BE97BE67CD57CD67E0A0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00007E117E087E1B7E237E1E7E1D7E097E107F797FB27FF07FF17FEE802881B3 +81A981A881FB820882588259854A855985488568856985438549856D856A855E +8783879F879E87A2878D8861892A89328925892B892189AA89A68AE68AFA8AEB +8AF18B008ADC8AE78AEE8AFE8B018B028AF78AED8AF38AF68AFC8C6B8C6D8C93 +8CF48E448E318E348E428E398E358F3B8F2F8F388F338FA88FA6907590749078 +9072907C907A913491929320933692F89333932F932292FC932B9304931A0000 +C0 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +9310932693219315932E931995BB96A796A896AA96D5970E97119716970D9713 +970F975B975C9766979898309838983B9837982D9839982499109928991E991B +9921991A99ED99E299F19AB89ABC9AFB9AED9B289B919D159D239D269D289D12 +9D1B9ED89ED49F8D9F9C512A511F5121513252F5568E56805690568556870000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000568F58D558D358D158CE5B305B2A5B245B7A5C375C685DBC5DBA5DBD5DB8 +5E6B5F4C5FBD61C961C261C761E661CB6232623464CE64CA64D864E064F064E6 +64EC64F164E264ED6582658366D966D66A806A946A846AA26A9C6ADB6AA36A7E +6A976A906AA06B5C6BAE6BDA6C086FD86FF16FDF6FE06FDB6FE46FEB6FEF6F80 +6FEC6FE16FE96FD56FEE6FF071E771DF71EE71E671E571ED71EC71F471E07235 +72467370737274A974B074A674A876467642764C76EA77B377AA77B077AC0000 +C1 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +77A777AD77EF78F778FA78F478EF790179A779AA7A577ABF7C077C0D7BFE7BF7 +7C0C7BE07CE07CDC7CDE7CE27CDF7CD97CDD7E2E7E3E7E467E377E327E437E2B +7E3D7E317E457E417E347E397E487E357E3F7E2F7F447FF37FFC807180728070 +806F807381C681C381BA81C281C081BF81BD81C981BE81E88209827185AA0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00008584857E859C8591859485AF859B858785A8858A866787C087D187B387D2 +87C687AB87BB87BA87C887CB893B893689448938893D89AC8B0E8B178B198B1B +8B0A8B208B1D8B048B108C418C3F8C738CFA8CFD8CFC8CF88CFB8DA88E498E4B +8E488E4A8F448F3E8F428F458F3F907F907D9084908190829080913991A3919E +919C934D938293289375934A9365934B9318937E936C935B9370935A935495CA +95CB95CC95C895C696B196B896D6971C971E97A097D3984698B699359A010000 +C2 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +99FF9BAE9BAB9BAA9BAD9D3B9D3F9E8B9ECF9EDE9EDC9EDD9EDB9F3E9F4B53E2 +569556AE58D958D85B385F5D61E3623364F464F264FE650664FA64FB64F765B7 +66DC67266AB36AAC6AC36ABB6AB86AC26AAE6AAF6B5F6B786BAF7009700B6FFE +70066FFA7011700F71FB71FC71FE71F87377737574A774BF7515765676580000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000765277BD77BF77BB77BC790E79AE7A617A627A607AC47AC57C2B7C277C2A +7C1E7C237C217CE77E547E557E5E7E5A7E617E527E597F487FF97FFB80778076 +81CD81CF820A85CF85A985CD85D085C985B085BA85B985A687EF87EC87F287E0 +898689B289F48B288B398B2C8B2B8C508D058E598E638E668E648E5F8E558EC0 +8F498F4D90879083908891AB91AC91D09394938A939693A293B393AE93AC93B0 +9398939A939795D495D695D095D596E296DC96D996DB96DE972497A397A60000 +C3 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +97AD97F9984D984F984C984E985398BA993E993F993D992E99A59A0E9AC19B03 +9B069B4F9B4E9B4D9BCA9BC99BFD9BC89BC09D519D5D9D609EE09F159F2C5133 +56A558DE58DF58E25BF59F905EEC61F261F761F661F56500650F66E066DD6AE5 +6ADD6ADA6AD3701B701F7028701A701D701570187206720D725872A273780000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000737A74BD74CA74E375877586765F766177C7791979B17A6B7A697C3E7C3F +7C387C3D7C377C407E6B7E6D7E797E697E6A7F857E737FB67FB97FB881D885E9 +85DD85EA85D585E485E585F787FB8805880D87F987FE8960895F8956895E8B41 +8B5C8B588B498B5A8B4E8B4F8B468B598D088D0A8E7C8E728E878E768E6C8E7A +8E748F548F4E8FAD908A908B91B191AE93E193D193DF93C393C893DC93DD93D6 +93E293CD93D893E493D793E895DC96B496E3972A9727976197DC97FB985E0000 +C4 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +9858985B98BC994599499A169A199B0D9BE89BE79BD69BDB9D899D619D729D6A +9D6C9E929E979E939EB452F856A856B756B656B456BC58E45B405B435B7D5BF6 +5DC961F861FA65186514651966E667276AEC703E703070327210737B74CF7662 +76657926792A792C792B7AC77AF67C4C7C437C4D7CEF7CF08FAE7E7D7E7C0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00007E827F4C800081DA826685FB85F9861185FA8606860B8607860A88148815 +896489BA89F88B708B6C8B668B6F8B5F8B6B8D0F8D0D8E898E818E858E8291B4 +91CB9418940393FD95E1973098C49952995199A89A2B9A309A379A359C139C0D +9E799EB59EE89F2F9F5F9F639F615137513856C156C056C259145C6C5DCD61FC +61FE651D651C659566E96AFB6B046AFA6BB2704C721B72A774D674D4766977D3 +7C507E8F7E8C7FBC8617862D861A882388228821881F896A896C89BD8B740000 +C5 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +8B778B7D8D138E8A8E8D8E8B8F5F8FAF91BA942E94339435943A94389432942B +95E297389739973297FF9867986599579A459A439A409A3E9ACF9B549B519C2D +9C259DAF9DB49DC29DB89E9D9EEF9F199F5C9F669F67513C513B56C856CA56C9 +5B7F5DD45DD25F4E61FF65246B0A6B6170517058738074E4758A766E766C0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000079B37C607C5F807E807D81DF8972896F89FC8B808D168D178E918E938F61 +9148944494519452973D973E97C397C1986B99559A559A4D9AD29B1A9C499C31 +9C3E9C3B9DD39DD79F349F6C9F6A9F9456CC5DD662006523652B652A66EC6B10 +74DA7ACA7C647C637C657E937E967E9481E28638863F88318B8A9090908F9463 +946094649768986F995C9A5A9A5B9A579AD39AD49AD19C549C579C569DE59E9F +9EF456D158E9652C705E7671767277D77F507F888836883988628B938B920000 +C6 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +8B9682778D1B91C0946A97429748974497C698709A5F9B229B589C5F9DF99DFA +9E7C9E7D9F079F779F725EF36B1670637C6C7C6E883B89C08EA191C194729470 +9871995E9AD69B239ECC706477DA8B9A947797C99A629A657E9C8B9C8EAA91C5 +947D947E947C9C779C789EF78C54947F9E1A72289A6A9B319E1B9E1E7C720000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +C9 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +4E424E5C51F5531A53824E074E0C4E474E8D56D7FA0C5C6E5F734E0F51874E0E +4E2E4E934EC24EC94EC8519852FC536C53B957205903592C5C105DFF65E16BB3 +6BCC6C14723F4E314E3C4EE84EDC4EE94EE14EDD4EDA520C531C534C57225723 +5917592F5B815B845C125C3B5C745C735E045E805E825FC9620962506C150000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00006C366C436C3F6C3B72AE72B0738A79B8808A961E4F0E4F184F2C4EF54F14 +4EF14F004EF74F084F1D4F024F054F224F134F044EF44F1251B1521352095210 +52A65322531F534D538A540756E156DF572E572A5734593C5980597C5985597B +597E5977597F5B565C155C255C7C5C7A5C7B5C7E5DDF5E755E845F025F1A5F74 +5FD55FD45FCF625C625E626462616266626262596260625A626565EF65EE673E +67396738673B673A673F673C67336C186C466C526C5C6C4F6C4A6C546C4B0000 +CA +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +6C4C7071725E72B472B5738E752A767F7A757F518278827C8280827D827F864D +897E909990979098909B909496229624962096234F564F3B4F624F494F534F64 +4F3E4F674F524F5F4F414F584F2D4F334F3F4F61518F51B9521C521E522152AD +52AE530953635372538E538F54305437542A545454455419541C542554180000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000543D544F544154285424544756EE56E756E557415745574C5749574B5752 +5906594059A6599859A05997598E59A25990598F59A759A15B8E5B925C285C2A +5C8D5C8F5C885C8B5C895C925C8A5C865C935C955DE05E0A5E0E5E8B5E895E8C +5E885E8D5F055F1D5F785F765FD25FD15FD05FED5FE85FEE5FF35FE15FE45FE3 +5FFA5FEF5FF75FFB60005FF4623A6283628C628E628F629462876271627B627A +6270628162886277627D62726274653765F065F465F365F265F5674567470000 +CB +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +67596755674C6748675D674D675A674B6BD06C196C1A6C786C676C6B6C846C8B +6C8F6C716C6F6C696C9A6C6D6C876C956C9C6C666C736C656C7B6C8E7074707A +726372BF72BD72C372C672C172BA72C573957397739373947392753A75397594 +75957681793D80348095809980908092809C8290828F8285828E829182930000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000828A828382848C788FC98FBF909F90A190A5909E90A790A096309628962F +962D4E334F984F7C4F854F7D4F804F874F764F744F894F844F774F4C4F974F6A +4F9A4F794F814F784F904F9C4F944F9E4F924F824F954F6B4F6E519E51BC51BE +5235523252335246523152BC530A530B533C539253945487547F548154915482 +5488546B547A547E5465546C54745466548D546F546154605498546354675464 +56F756F9576F5772576D576B57715770577657805775577B5773577457620000 +CC +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +5768577D590C594559B559BA59CF59CE59B259CC59C159B659BC59C359D659B1 +59BD59C059C859B459C75B625B655B935B955C445C475CAE5CA45CA05CB55CAF +5CA85CAC5C9F5CA35CAD5CA25CAA5CA75C9D5CA55CB65CB05CA65E175E145E19 +5F285F225F235F245F545F825F7E5F7D5FDE5FE5602D602660196032600B0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00006034600A60176033601A601E602C6022600D6010602E60136011600C6009 +601C6214623D62AD62B462D162BE62AA62B662CA62AE62B362AF62BB62A962B0 +62B8653D65A865BB660965FC66046612660865FB6603660B660D660565FD6611 +661066F6670A6785676C678E67926776677B6798678667846774678D678C677A +679F679167996783677D67816778677967946B256B806B7E6BDE6C1D6C936CEC +6CEB6CEE6CD96CB66CD46CAD6CE76CB76CD06CC26CBA6CC36CC66CED6CF20000 +CD +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +6CD26CDD6CB46C8A6C9D6C806CDE6CC06D306CCD6CC76CB06CF96CCF6CE96CD1 +709470987085709370867084709170967082709A7083726A72D672CB72D872C9 +72DC72D272D472DA72CC72D173A473A173AD73A673A273A073AC739D74DD74E8 +753F7540753E758C759876AF76F376F176F076F577F877FC77F977FB77FA0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000077F77942793F79C57A787A7B7AFB7C757CFD8035808F80AE80A380B880B5 +80AD822082A082C082AB829A8298829B82B582A782AE82BC829E82BA82B482A8 +82A182A982C282A482C382B682A28670866F866D866E8C568FD28FCB8FD38FCD +8FD68FD58FD790B290B490AF90B390B09639963D963C963A96434FCD4FC54FD3 +4FB24FC94FCB4FC14FD44FDC4FD94FBB4FB34FDB4FC74FD64FBA4FC04FB94FEC +5244524952C052C2533D537C539753965399539854BA54A154AD54A554CF0000 +CE +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +54C3830D54B754AE54D654B654C554C654A0547054BC54A254BE547254DE54B0 +57B5579E579F57A4578C5797579D579B57945798578F579957A5579A579558F4 +590D595359E159DE59EE5A0059F159DD59FA59FD59FC59F659E459F259F759DB +59E959F359F559E059FE59F459ED5BA85C4C5CD05CD85CCC5CD75CCB5CDB0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00005CDE5CDA5CC95CC75CCA5CD65CD35CD45CCF5CC85CC65CCE5CDF5CF85DF9 +5E215E225E235E205E245EB05EA45EA25E9B5EA35EA55F075F2E5F565F866037 +603960546072605E6045605360476049605B604C60406042605F602460446058 +6066606E6242624362CF630D630B62F5630E630362EB62F9630F630C62F862F6 +63006313631462FA631562FB62F06541654365AA65BF6636662166326635661C +662666226633662B663A661D66346639662E670F671067C167F267C867BA0000 +CF +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +67DC67BB67F867D867C067B767C567EB67E467DF67B567CD67B367F767F667EE +67E367C267B967CE67E767F067B267FC67C667ED67CC67AE67E667DB67FA67C9 +67CA67C367EA67CB6B286B826B846BB66BD66BD86BE06C206C216D286D346D2D +6D1F6D3C6D3F6D126D0A6CDA6D336D046D196D3A6D1A6D116D006D1D6D420000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00006D016D186D376D036D0F6D406D076D206D2C6D086D226D096D1070B7709F +70BE70B170B070A170B470B570A972417249724A726C72707273726E72CA72E4 +72E872EB72DF72EA72E672E3738573CC73C273C873C573B973B673B573B473EB +73BF73C773BE73C373C673B873CB74EC74EE752E7547754875A775AA767976C4 +7708770377047705770A76F776FB76FA77E777E878067811781278057810780F +780E780978037813794A794C794B7945794479D579CD79CF79D679CE7A800000 +D0 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +7A7E7AD17B007B017C7A7C787C797C7F7C807C817D037D087D017F587F917F8D +7FBE8007800E800F8014803780D880C780E080D180C880C280D080C580E380D9 +80DC80CA80D580C980CF80D780E680CD81FF8221829482D982FE82F9830782E8 +830082D5833A82EB82D682F482EC82E182F282F5830C82FB82F682F082EA0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000082E482E082FA82F382ED86778674867C86738841884E8867886A886989D3 +8A048A078D728FE38FE18FEE8FE090F190BD90BF90D590C590BE90C790CB90C8 +91D491D39654964F96519653964A964E501E50055007501350225030501B4FF5 +4FF450335037502C4FF64FF75017501C502050275035502F5031500E515A5194 +519351CA51C451C551C851CE5261525A5252525E525F5255526252CD530E539E +552654E25517551254E754F354E4551A54FF5504550854EB5511550554F10000 +D1 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +550A54FB54F754F854E0550E5503550B5701570257CC583257D557D257BA57C6 +57BD57BC57B857B657BF57C757D057B957C1590E594A5A195A165A2D5A2E5A15 +5A0F5A175A0A5A1E5A335B6C5BA75BAD5BAC5C035C565C545CEC5CFF5CEE5CF1 +5CF75D005CF95E295E285EA85EAE5EAA5EAC5F335F305F67605D605A60670000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000604160A26088608060926081609D60836095609B60976087609C608E6219 +624662F263106356632C634463456336634363E46339634B634A633C63296341 +6334635863546359632D63476333635A63516338635763406348654A654665C6 +65C365C465C2664A665F6647665167126713681F681A684968326833683B684B +684F68166831681C6835682B682D682F684E68446834681D6812681468266828 +682E684D683A682568206B2C6B2F6B2D6B316B346B6D80826B886BE66BE40000 +D2 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +6BE86BE36BE26BE76C256D7A6D636D646D766D0D6D616D926D586D626D6D6D6F +6D916D8D6DEF6D7F6D866D5E6D676D606D976D706D7C6D5F6D826D986D2F6D68 +6D8B6D7E6D806D846D166D836D7B6D7D6D756D9070DC70D370D170DD70CB7F39 +70E270D770D270DE70E070D470CD70C570C670C770DA70CE70E1724272780000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000072777276730072FA72F472FE72F672F372FB730173D373D973E573D673BC +73E773E373E973DC73D273DB73D473DD73DA73D773D873E874DE74DF74F474F5 +7521755B755F75B075C175BB75C475C075BF75B675BA768A76C9771D771B7710 +771377127723771177157719771A772277277823782C78227835782F7828782E +782B782178297833782A78317954795B794F795C79537952795179EB79EC79E0 +79EE79ED79EA79DC79DE79DD7A867A897A857A8B7A8C7A8A7A877AD87B100000 +D3 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +7B047B137B057B0F7B087B0A7B0E7B097B127C847C917C8A7C8C7C887C8D7C85 +7D1E7D1D7D117D0E7D187D167D137D1F7D127D0F7D0C7F5C7F617F5E7F607F5D +7F5B7F967F927FC37FC27FC08016803E803980FA80F280F980F5810180FB8100 +8201822F82258333832D83448319835183258356833F83418326831C83220000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00008342834E831B832A8308833C834D8316832483208337832F832983478345 +834C8353831E832C834B832783488653865286A286A88696868D8691869E8687 +86978686868B869A868586A5869986A186A786958698868E869D869086948843 +8844886D88758876887288808871887F886F8883887E8874887C8A128C478C57 +8C7B8CA48CA38D768D788DB58DB78DB68ED18ED38FFE8FF590028FFF8FFB9004 +8FFC8FF690D690E090D990DA90E390DF90E590D890DB90D790DC90E491500000 +D4 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +914E914F91D591E291DA965C965F96BC98E39ADF9B2F4E7F5070506A5061505E +50605053504B505D50725048504D5041505B504A506250155045505F5069506B +5063506450465040506E50735057505151D0526B526D526C526E52D652D3532D +539C55755576553C554D55505534552A55515562553655355530555255450000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000550C55325565554E55395548552D553B5540554B570A570757FB581457E2 +57F657DC57F4580057ED57FD580857F8580B57F357CF580757EE57E357F257E5 +57EC57E1580E57FC581057E75801580C57F157E957F0580D5804595C5A605A58 +5A555A675A5E5A385A355A6D5A505A5F5A655A6C5A535A645A575A435A5D5A52 +5A445A5B5A485A8E5A3E5A4D5A395A4C5A705A695A475A515A565A425A5C5B72 +5B6E5BC15BC05C595D1E5D0B5D1D5D1A5D205D0C5D285D0D5D265D255D0F0000 +D5 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +5D305D125D235D1F5D2E5E3E5E345EB15EB45EB95EB25EB35F365F385F9B5F96 +5F9F608A6090608660BE60B060BA60D360D460CF60E460D960DD60C860B160DB +60B760CA60BF60C360CD60C063326365638A6382637D63BD639E63AD639D6397 +63AB638E636F63876390636E63AF6375639C636D63AE637C63A4633B639F0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00006378638563816391638D6370655365CD66656661665B6659665C66626718 +687968876890689C686D686E68AE68AB6956686F68A368AC68A96875687468B2 +688F68776892687C686B687268AA68806871687E689B6896688B68A0688968A4 +6878687B6891688C688A687D6B366B336B376B386B916B8F6B8D6B8E6B8C6C2A +6DC06DAB6DB46DB36E746DAC6DE96DE26DB76DF66DD46E006DC86DE06DDF6DD6 +6DBE6DE56DDC6DDD6DDB6DF46DCA6DBD6DED6DF06DBA6DD56DC26DCF6DC90000 +D6 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +6DD06DF26DD36DFD6DD76DCD6DE36DBB70FA710D70F7711770F4710C70F07104 +70F3711070FC70FF71067113710070F870F6710B7102710E727E727B727C727F +731D7317730773117318730A730872FF730F731E738873F673F873F574047401 +73FD7407740073FA73FC73FF740C740B73F474087564756375CE75D275CF0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000075CB75CC75D175D0768F768976D37739772F772D7731773277347733773D +7725773B7735784878527849784D784A784C782678457850796479677969796A +7963796B796179BB79FA79F879F679F77A8F7A947A907B357B477B347B257B30 +7B227B247B337B187B2A7B1D7B317B2B7B2D7B2F7B327B387B1A7B237C947C98 +7C967CA37D357D3D7D387D367D3A7D457D2C7D297D417D477D3E7D3F7D4A7D3B +7D287F637F957F9C7F9D7F9B7FCA7FCB7FCD7FD07FD17FC77FCF7FC9801F0000 +D7 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +801E801B804780438048811881258119811B812D811F812C811E812181158127 +811D8122821182388233823A823482328274839083A383A8838D837A837383A4 +8374838F8381839583998375839483A9837D8383838C839D839B83AA838B837E +83A583AF8388839783B0837F83A6838783AE8376839A8659865686BF86B70000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000086C286C186C586BA86B086C886B986B386B886CC86B486BB86BC86C386BD +86BE88528889889588A888A288AA889A889188A1889F889888A78899889B8897 +88A488AC888C8893888E898289D689D989D58A308A278A2C8A1E8C398C3B8C5C +8C5D8C7D8CA58D7D8D7B8D798DBC8DC28DB98DBF8DC18ED88EDE8EDD8EDC8ED7 +8EE08EE19024900B9011901C900C902190EF90EA90F090F490F290F390D490EB +90EC90E991569158915A9153915591EC91F491F191F391F891E491F991EA0000 +D8 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +91EB91F791E891EE957A95869588967C966D966B9671966F96BF976A980498E5 +9997509B50955094509E508B50A35083508C508E509D5068509C509250825087 +515F51D45312531153A453A7559155A855A555AD5577564555A255935588558F +55B5558155A3559255A4557D558C55A6557F559555A1558E570C582958370000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00005819581E58275823582857F558485825581C581B5833583F5836582E5839 +5838582D582C583B59615AAF5A945A9F5A7A5AA25A9E5A785AA65A7C5AA55AAC +5A955AAE5A375A845A8A5A975A835A8B5AA95A7B5A7D5A8C5A9C5A8F5A935A9D +5BEA5BCD5BCB5BD45BD15BCA5BCE5C0C5C305D375D435D6B5D415D4B5D3F5D35 +5D515D4E5D555D335D3A5D525D3D5D315D595D425D395D495D385D3C5D325D36 +5D405D455E445E415F585FA65FA55FAB60C960B960CC60E260CE60C461140000 +D9 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +60F2610A6116610560F5611360F860FC60FE60C161036118611D611060FF6104 +610B624A639463B163B063CE63E563E863EF63C3649D63F363CA63E063F663D5 +63F263F5646163DF63BE63DD63DC63C463D863D363C263C763CC63CB63C863F0 +63D763D965326567656A6564655C65686565658C659D659E65AE65D065D20000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000667C666C667B668066716679666A66726701690C68D3690468DC692A68EC +68EA68F1690F68D668F768EB68E468F66913691068F368E1690768CC69086970 +68B4691168EF68C6691468F868D068FD68FC68E8690B690A691768CE68C868DD +68DE68E668F468D1690668D468E96915692568C76B396B3B6B3F6B3C6B946B97 +6B996B956BBD6BF06BF26BF36C306DFC6E466E476E1F6E496E886E3C6E3D6E45 +6E626E2B6E3F6E416E5D6E736E1C6E336E4B6E406E516E3B6E036E2E6E5E0000 +DA +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +6E686E5C6E616E316E286E606E716E6B6E396E226E306E536E656E276E786E64 +6E776E556E796E526E666E356E366E5A7120711E712F70FB712E713171237125 +71227132711F7128713A711B724B725A7288728972867285728B7312730B7330 +73227331733373277332732D732673237335730C742E742C7430742B74160000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000741A7421742D743174247423741D74297420743274FB752F756F756C75E7 +75DA75E175E675DD75DF75E475D77695769276DA774677477744774D7745774A +774E774B774C77DE77EC786078647865785C786D7871786A786E787078697868 +785E786279747973797279707A027A0A7A037A0C7A047A997AE67AE47B4A7B3B +7B447B487B4C7B4E7B407B587B457CA27C9E7CA87CA17D587D6F7D637D537D56 +7D677D6A7D4F7D6D7D5C7D6B7D527D547D697D517D5F7D4E7F3E7F3F7F650000 +DB +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +7F667FA27FA07FA17FD78051804F805080FE80D48143814A8152814F8147813D +814D813A81E681EE81F781F881F98204823C823D823F8275833B83CF83F98423 +83C083E8841283E783E483FC83F6841083C683C883EB83E383BF840183DD83E5 +83D883FF83E183CB83CE83D683F583C98409840F83DE8411840683C283F30000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000083D583FA83C783D183EA841383C383EC83EE83C483FB83D783E2841B83DB +83FE86D886E286E686D386E386DA86EA86DD86EB86DC86EC86E986D786E886D1 +88488856885588BA88D788B988B888C088BE88B688BC88B788BD88B2890188C9 +89958998899789DD89DA89DB8A4E8A4D8A398A598A408A578A588A448A458A52 +8A488A518A4A8A4C8A4F8C5F8C818C808CBA8CBE8CB08CB98CB58D848D808D89 +8DD88DD38DCD8DC78DD68DDC8DCF8DD58DD98DC88DD78DC58EEF8EF78EFA0000 +DC +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +8EF98EE68EEE8EE58EF58EE78EE88EF68EEB8EF18EEC8EF48EE9902D9034902F +9106912C910490FF90FC910890F990FB9101910091079105910391619164915F +916291609201920A92259203921A9226920F920C9200921291FF91FD92069204 +92279202921C92249219921792059216957B958D958C95909687967E96880000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000096899683968096C296C896C396F196F0976C9770976E980798A998EB9CE6 +9EF94E834E844EB650BD50BF50C650AE50C450CA50B450C850C250B050C150BA +50B150CB50C950B650B851D7527A5278527B527C55C355DB55CC55D055CB55CA +55DD55C055D455C455E955BF55D2558D55CF55D555E255D655C855F255CD55D9 +55C25714585358685864584F584D5849586F5855584E585D58595865585B583D +5863587158FC5AC75AC45ACB5ABA5AB85AB15AB55AB05ABF5AC85ABB5AC60000 +DD +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +5AB75AC05ACA5AB45AB65ACD5AB95A905BD65BD85BD95C1F5C335D715D635D4A +5D655D725D6C5D5E5D685D675D625DF05E4F5E4E5E4A5E4D5E4B5EC55ECC5EC6 +5ECB5EC75F405FAF5FAD60F76149614A612B614561366132612E6146612F614F +612961406220916862236225622463C563F163EB641064126409642064240000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000064336443641F641564186439643764226423640C64266430642864416435 +642F640A641A644064256427640B63E7641B642E6421640E656F659265D36686 +668C66956690668B668A66996694667867206966695F6938694E69626971693F +6945696A6939694269576959697A694869496935696C6933693D696568F06978 +693469696940696F69446976695869416974694C693B694B6937695C694F6951 +69326952692F697B693C6B466B456B436B426B486B416B9BFA0D6BFB6BFC0000 +DE +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +6BF96BF76BF86E9B6ED66EC86E8F6EC06E9F6E936E946EA06EB16EB96EC66ED2 +6EBD6EC16E9E6EC96EB76EB06ECD6EA66ECF6EB26EBE6EC36EDC6ED86E996E92 +6E8E6E8D6EA46EA16EBF6EB36ED06ECA6E976EAE6EA371477154715271637160 +7141715D716271727178716A7161714271587143714B7170715F715071530000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00007144714D715A724F728D728C72917290728E733C7342733B733A7340734A +73497444744A744B7452745174577440744F7450744E74427446744D745474E1 +74FF74FE74FD751D75797577698375EF760F760375F775FE75FC75F975F87610 +75FB75F675ED75F575FD769976B576DD7755775F776077527756775A77697767 +77547759776D77E07887789A7894788F788478957885788678A1788378797899 +78807896787B797C7982797D79797A117A187A197A127A177A157A227A130000 +DF +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +7A1B7A107AA37AA27A9E7AEB7B667B647B6D7B747B697B727B657B737B717B70 +7B617B787B767B637CB27CB47CAF7D887D867D807D8D7D7F7D857D7A7D8E7D7B +7D837D7C7D8C7D947D847D7D7D927F6D7F6B7F677F687F6C7FA67FA57FA77FDB +7FDC8021816481608177815C8169815B816281726721815E81768167816F0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000081448161821D8249824482408242824584F1843F845684768479848F848D +846584518440848684678430844D847D845A845984748473845D8507845E8437 +843A8434847A8443847884328445842983D9844B842F8442842D845F84708439 +844E844C8452846F84C5848E843B8447843684338468847E8444842B84608454 +846E8450870B870486F7870C86FA86D686F5874D86F8870E8709870186F6870D +870588D688CB88CD88CE88DE88DB88DA88CC88D08985899B89DF89E589E40000 +E0 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +89E189E089E289DC89E68A768A868A7F8A618A3F8A778A828A848A758A838A81 +8A748A7A8C3C8C4B8C4A8C658C648C668C868C848C858CCC8D688D698D918D8C +8D8E8D8F8D8D8D938D948D908D928DF08DE08DEC8DF18DEE8DD08DE98DE38DE2 +8DE78DF28DEB8DF48F068EFF8F018F008F058F078F088F028F0B9052903F0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000090449049903D9110910D910F911191169114910B910E916E916F92489252 +9230923A926692339265925E9283922E924A9246926D926C924F92609267926F +92369261927092319254926392509272924E9253924C92569232959F959C959E +959B969296939691969796CE96FA96FD96F896F59773977797789772980F980D +980E98AC98F698F999AF99B299B099B59AAD9AAB9B5B9CEA9CED9CE79E809EFD +50E650D450D750E850F350DB50EA50DD50E450D350EC50F050EF50E350E00000 +E1 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +51D85280528152E952EB533053AC56275615560C561255FC560F561C56015613 +560255FA561D560455FF55F95889587C5890589858865881587F5874588B587A +58875891588E587658825888587B5894588F58FE596B5ADC5AEE5AE55AD55AEA +5ADA5AED5AEB5AF35AE25AE05ADB5AEC5ADE5ADD5AD95AE85ADF5B775BE00000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00005BE35C635D825D805D7D5D865D7A5D815D775D8A5D895D885D7E5D7C5D8D +5D795D7F5E585E595E535ED85ED15ED75ECE5EDC5ED55ED95ED25ED45F445F43 +5F6F5FB6612C61286141615E61716173615261536172616C618061746154617A +615B6165613B616A6161615662296227622B642B644D645B645D647464766472 +6473647D6475646664A6644E6482645E645C644B645364606450647F643F646C +646B645964656477657365A066A166A0669F67056704672269B169B669C90000 +E2 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +69A069CE699669B069AC69BC69916999698E69A7698D69A969BE69AF69BF69C4 +69BD69A469D469B969CA699A69CF69B3699369AA69A1699E69D96997699069C2 +69B569A569C66B4A6B4D6B4B6B9E6B9F6BA06BC36BC46BFE6ECE6EF56EF16F03 +6F256EF86F376EFB6F2E6F096F4E6F196F1A6F276F186F3B6F126EED6F0A0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00006F366F736EF96EEE6F2D6F406F306F3C6F356EEB6F076F0E6F436F056EFD +6EF66F396F1C6EFC6F3A6F1F6F0D6F1E6F086F21718771907189718071857182 +718F717B718671817197724472537297729572937343734D7351734C74627473 +7471747574727467746E750075027503757D759076167608760C76157611760A +761476B87781777C77857782776E7780776F777E778378B278AA78B478AD78A8 +787E78AB789E78A578A078AC78A278A47998798A798B79967995799479930000 +E3 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +79977988799279907A2B7A4A7A307A2F7A287A267AA87AAB7AAC7AEE7B887B9C +7B8A7B917B907B967B8D7B8C7B9B7B8E7B857B9852847B997BA47B827CBB7CBF +7CBC7CBA7DA77DB77DC27DA37DAA7DC17DC07DC57D9D7DCE7DC47DC67DCB7DCC +7DAF7DB97D967DBC7D9F7DA67DAE7DA97DA17DC97F737FE27FE37FE57FDE0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00008024805D805C8189818681838187818D818C818B8215849784A484A1849F +84BA84CE84C284AC84AE84AB84B984B484C184CD84AA849A84B184D0849D84A7 +84BB84A2849484C784CC849B84A984AF84A884D6849884B684CF84A084D784D4 +84D284DB84B084918661873387238728876B8740872E871E87218719871B8743 +872C8741873E874687208732872A872D873C8712873A87318735874287268727 +87388724871A8730871188F788E788F188F288FA88FE88EE88FC88F688FB0000 +E4 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +88F088EC88EB899D89A1899F899E89E989EB89E88AAB8A998A8B8A928A8F8A96 +8C3D8C688C698CD58CCF8CD78D968E098E028DFF8E0D8DFD8E0A8E038E078E06 +8E058DFE8E008E048F108F118F0E8F0D9123911C91209122911F911D911A9124 +9121911B917A91729179917392A592A49276929B927A92A0929492AA928D0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000092A6929A92AB92799297927F92A392EE928E9282929592A2927D928892A1 +928A9286928C929992A7927E928792A9929D928B922D969E96A196FF9758977D +977A977E978397809782977B97849781977F97CE97CD981698AD98AE99029900 +9907999D999C99C399B999BB99BA99C299BD99C79AB19AE39AE79B3E9B3F9B60 +9B619B5F9CF19CF29CF59EA750FF5103513050F85106510750F650FE510B510C +50FD510A528B528C52F152EF56485642564C56355641564A5649564656580000 +E5 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +565A56405633563D562C563E5638562A563A571A58AB589D58B158A058A358AF +58AC58A558A158FF5AFF5AF45AFD5AF75AF65B035AF85B025AF95B015B075B05 +5B0F5C675D995D975D9F5D925DA25D935D955DA05D9C5DA15D9A5D9E5E695E5D +5E605E5C7DF35EDB5EDE5EE15F495FB2618B6183617961B161B061A261890000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000619B619361AF61AD619F619261AA61A1618D616661B3622D646E64706496 +64A064856497649C648F648B648A648C64A3649F646864B164986576657A6579 +657B65B265B366B566B066A966B266B766AA66AF6A006A066A1769E569F86A15 +69F169E46A2069FF69EC69E26A1B6A1D69FE6A2769F269EE6A1469F769E76A40 +6A0869E669FB6A0D69FC69EB6A096A046A186A256A0F69F66A266A0769F46A16 +6B516BA56BA36BA26BA66C016C006BFF6C026F416F266F7E6F876FC66F920000 +E6 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +6F8D6F896F8C6F626F4F6F856F5A6F966F766F6C6F826F556F726F526F506F57 +6F946F936F5D6F006F616F6B6F7D6F676F906F536F8B6F696F7F6F956F636F77 +6F6A6F7B71B271AF719B71B071A0719A71A971B5719D71A5719E71A471A171AA +719C71A771B37298729A73587352735E735F7360735D735B7361735A73590000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000736274877489748A74867481747D74857488747C747975087507757E7625 +761E7619761D761C7623761A7628761B769C769D769E769B778D778F77897788 +78CD78BB78CF78CC78D178CE78D478C878C378C478C9799A79A179A0799C79A2 +799B6B767A397AB27AB47AB37BB77BCB7BBE7BAC7BCE7BAF7BB97BCA7BB57CC5 +7CC87CCC7CCB7DF77DDB7DEA7DE77DD77DE17E037DFA7DE67DF67DF17DF07DEE +7DDF7F767FAC7FB07FAD7FED7FEB7FEA7FEC7FE67FE88064806781A3819F0000 +E7 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +819E819581A2819981978216824F825382528250824E82518524853B850F8500 +8529850E8509850D851F850A8527851C84FB852B84FA8508850C84F4852A84F2 +851584F784EB84F384FC851284EA84E9851684FE8528851D852E850284FD851E +84F68531852684E784E884F084EF84F9851885208530850B8519852F86620000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000875687638764877787E1877387588754875B87528761875A8751875E876D +876A8750874E875F875D876F876C877A876E875C8765874F877B877587628767 +8769885A8905890C8914890B891789188919890689168911890E890989A289A4 +89A389ED89F089EC8ACF8AC68AB88AD38AD18AD48AD58ABB8AD78ABE8AC08AC5 +8AD88AC38ABA8ABD8AD98C3E8C4D8C8F8CE58CDF8CD98CE88CDA8CDD8CE78DA0 +8D9C8DA18D9B8E208E238E258E248E2E8E158E1B8E168E118E198E268E270000 +E8 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +8E148E128E188E138E1C8E178E1A8F2C8F248F188F1A8F208F238F168F179073 +9070906F9067906B912F912B9129912A91329126912E91859186918A91819182 +9184918092D092C392C492C092D992B692CF92F192DF92D892E992D792DD92CC +92EF92C292E892CA92C892CE92E692CD92D592C992E092DE92E792D192D30000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000092B592E192C692B4957C95AC95AB95AE95B096A496A296D3970597089702 +975A978A978E978897D097CF981E981D9826982998289820981B982798B29908 +98FA9911991499169917991599DC99CD99CF99D399D499CE99C999D699D899CB +99D799CC9AB39AEC9AEB9AF39AF29AF19B469B439B679B749B719B669B769B75 +9B709B689B649B6C9CFC9CFA9CFD9CFF9CF79D079D009CF99CFB9D089D059D04 +9E839ED39F0F9F10511C51135117511A511151DE533453E156705660566E0000 +E9 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +567356665663566D5672565E5677571C571B58C858BD58C958BF58BA58C258BC +58C65B175B195B1B5B215B145B135B105B165B285B1A5B205B1E5BEF5DAC5DB1 +5DA95DA75DB55DB05DAE5DAA5DA85DB25DAD5DAF5DB45E675E685E665E6F5EE9 +5EE75EE65EE85EE55F4B5FBC619D61A8619661C561B461C661C161CC61BA0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000061BF61B8618C64D764D664D064CF64C964BD648964C364DB64F364D96533 +657F657C65A266C866BE66C066CA66CB66CF66BD66BB66BA66CC67236A346A66 +6A496A676A326A686A3E6A5D6A6D6A766A5B6A516A286A5A6A3B6A3F6A416A6A +6A646A506A4F6A546A6F6A696A606A3C6A5E6A566A556A4D6A4E6A466B556B54 +6B566BA76BAA6BAB6BC86BC76C046C036C066FAD6FCB6FA36FC76FBC6FCE6FC8 +6F5E6FC46FBD6F9E6FCA6FA870046FA56FAE6FBA6FAC6FAA6FCF6FBF6FB80000 +EA +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +6FA26FC96FAB6FCD6FAF6FB26FB071C571C271BF71B871D671C071C171CB71D4 +71CA71C771CF71BD71D871BC71C671DA71DB729D729E736973667367736C7365 +736B736A747F749A74A074947492749574A1750B7580762F762D7631763D7633 +763C76357632763076BB76E6779A779D77A1779C779B77A277A3779577990000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000779778DD78E978E578EA78DE78E378DB78E178E278ED78DF78E079A47A44 +7A487A477AB67AB87AB57AB17AB77BDE7BE37BE77BDD7BD57BE57BDA7BE87BF9 +7BD47BEA7BE27BDC7BEB7BD87BDF7CD27CD47CD77CD07CD17E127E217E177E0C +7E1F7E207E137E0E7E1C7E157E1A7E227E0B7E0F7E167E0D7E147E257E247F43 +7F7B7F7C7F7A7FB17FEF802A8029806C81B181A681AE81B981B581AB81B081AC +81B481B281B781A781F282558256825785568545856B854D8553856185580000 +EB +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +854085468564854185628544855185478563853E855B8571854E856E85758555 +85678560858C8566855D85548565856C866386658664879B878F879787938792 +87888781879687988779878787A3878587908791879D87848794879C879A8789 +891E89268930892D892E89278931892289298923892F892C891F89F18AE00000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00008AE28AF28AF48AF58ADD8B148AE48ADF8AF08AC88ADE8AE18AE88AFF8AEF +8AFB8C918C928C908CF58CEE8CF18CF08CF38D6C8D6E8DA58DA78E338E3E8E38 +8E408E458E368E3C8E3D8E418E308E3F8EBD8F368F2E8F358F328F398F378F34 +90769079907B908690FA913391359136919391909191918D918F9327931E9308 +931F9306930F937A9338933C931B9323931293019346932D930E930D92CB931D +92FA9325931392F992F793349302932492FF932993399335932A9314930C0000 +EC +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +930B92FE9309930092FB931695BC95CD95BE95B995BA95B695BF95B595BD96A9 +96D4970B9712971097999797979497F097F89835982F98329924991F99279929 +999E99EE99EC99E599E499F099E399EA99E999E79AB99ABF9AB49ABB9AF69AFA +9AF99AF79B339B809B859B879B7C9B7E9B7B9B829B939B929B909B7A9B950000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00009B7D9B889D259D179D209D1E9D149D299D1D9D189D229D109D199D1F9E88 +9E869E879EAE9EAD9ED59ED69EFA9F129F3D51265125512251245120512952F4 +5693568C568D568656845683567E5682567F568158D658D458CF58D25B2D5B25 +5B325B235B2C5B275B265B2F5B2E5B7B5BF15BF25DB75E6C5E6A5FBE5FBB61C3 +61B561BC61E761E061E561E461E861DE64EF64E964E364EB64E464E865816580 +65B665DA66D26A8D6A966A816AA56A896A9F6A9B6AA16A9E6A876A936A8E0000 +ED +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +6A956A836AA86AA46A916A7F6AA66A9A6A856A8C6A926B5B6BAD6C096FCC6FA9 +6FF46FD46FE36FDC6FED6FE76FE66FDE6FF26FDD6FE26FE871E171F171E871F2 +71E471F071E27373736E736F749774B274AB749074AA74AD74B174A574AF7510 +75117512750F7584764376487649764776A476E977B577AB77B277B777B60000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000077B477B177A877F078F378FD790278FB78FC78F2790578F978FE790479AB +79A87A5C7A5B7A567A587A547A5A7ABE7AC07AC17C057C0F7BF27C007BFF7BFB +7C0E7BF47C0B7BF37C027C097C037C017BF87BFD7C067BF07BF17C107C0A7CE8 +7E2D7E3C7E427E3398487E387E2A7E497E407E477E297E4C7E307E3B7E367E44 +7E3A7F457F7F7F7E7F7D7FF47FF2802C81BB81C481CC81CA81C581C781BC81E9 +825B825A825C85838580858F85A7859585A0858B85A3857B85A4859A859E0000 +EE +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +8577857C858985A1857A85788557858E85968586858D8599859D858185A28582 +858885858579857685988590859F866887BE87AA87AD87C587B087AC87B987B5 +87BC87AE87C987C387C287CC87B787AF87C487CA87B487B687BF87B887BD87DE +87B289358933893C893E894189528937894289AD89AF89AE89F289F38B1E0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00008B188B168B118B058B0B8B228B0F8B128B158B078B0D8B088B068B1C8B13 +8B1A8C4F8C708C728C718C6F8C958C948CF98D6F8E4E8E4D8E538E508E4C8E47 +8F438F409085907E9138919A91A2919B9199919F91A1919D91A093A1938393AF +936493569347937C9358935C93769349935093519360936D938F934C936A9379 +935793559352934F93719377937B9361935E936393679380934E935995C795C0 +95C995C395C595B796AE96B096AC9720971F9718971D9719979A97A1979C0000 +EF +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +979E979D97D597D497F198419844984A9849984598439925992B992C992A9933 +9932992F992D99319930999899A399A19A0299FA99F499F799F999F899F699FB +99FD99FE99FC9A039ABE9AFE9AFD9B019AFC9B489B9A9BA89B9E9B9B9BA69BA1 +9BA59BA49B869BA29BA09BAF9D339D419D679D369D2E9D2F9D319D389D300000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00009D459D429D439D3E9D379D409D3D7FF59D2D9E8A9E899E8D9EB09EC89EDA +9EFB9EFF9F249F239F229F549FA05131512D512E5698569C5697569A569D5699 +59705B3C5C695C6A5DC05E6D5E6E61D861DF61ED61EE61F161EA61F061EB61D6 +61E964FF650464FD64F86501650364FC659465DB66DA66DB66D86AC56AB96ABD +6AE16AC66ABA6AB66AB76AC76AB46AAD6B5E6BC96C0B7007700C700D70017005 +7014700E6FFF70006FFB70266FFC6FF7700A720171FF71F9720371FD73760000 +F0 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +74B874C074B574C174BE74B674BB74C275147513765C76647659765076537657 +765A76A676BD76EC77C277BA78FF790C79137914790979107912791179AD79AC +7A5F7C1C7C297C197C207C1F7C2D7C1D7C267C287C227C257C307E5C7E507E56 +7E637E587E627E5F7E517E607E577E537FB57FB37FF77FF8807581D181D20000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000081D0825F825E85B485C685C085C385C285B385B585BD85C785C485BF85CB +85CE85C885C585B185B685D2862485B885B785BE866987E787E687E287DB87EB +87EA87E587DF87F387E487D487DC87D387ED87D887E387A487D787D9880187F4 +87E887DD8953894B894F894C89468950895189498B2A8B278B238B338B308B35 +8B478B2F8B3C8B3E8B318B258B378B268B368B2E8B248B3B8B3D8B3A8C428C75 +8C998C988C978CFE8D048D028D008E5C8E628E608E578E568E5E8E658E670000 +F1 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +8E5B8E5A8E618E5D8E698E548F468F478F488F4B9128913A913B913E91A891A5 +91A791AF91AA93B5938C939293B7939B939D938993A7938E93AA939E93A69395 +93889399939F938D93B1939193B293A493A893B493A393A595D295D395D196B3 +96D796DA5DC296DF96D896DD97239722972597AC97AE97A897AB97A497AA0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000097A297A597D797D997D697D897FA98509851985298B89941993C993A9A0F +9A0B9A099A0D9A049A119A0A9A059A079A069AC09ADC9B089B049B059B299B35 +9B4A9B4C9B4B9BC79BC69BC39BBF9BC19BB59BB89BD39BB69BC49BB99BBD9D5C +9D539D4F9D4A9D5B9D4B9D599D569D4C9D579D529D549D5F9D589D5A9E8E9E8C +9EDF9F019F009F169F259F2B9F2A9F299F289F4C9F5551345135529652F753B4 +56AB56AD56A656A756AA56AC58DA58DD58DB59125B3D5B3E5B3F5DC35E700000 +F2 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +5FBF61FB65076510650D6509650C650E658465DE65DD66DE6AE76AE06ACC6AD1 +6AD96ACB6ADF6ADC6AD06AEB6ACF6ACD6ADE6B606BB06C0C7019702770207016 +702B702170227023702970177024701C702A720C720A72077202720572A572A6 +72A472A372A174CB74C574B774C37516766077C977CA77C477F1791D791B0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00007921791C7917791E79B07A677A687C337C3C7C397C2C7C3B7CEC7CEA7E76 +7E757E787E707E777E6F7E7A7E727E747E687F4B7F4A7F837F867FB77FFD7FFE +807881D781D582648261826385EB85F185ED85D985E185E885DA85D785EC85F2 +85F885D885DF85E385DC85D185F085E685EF85DE85E2880087FA880387F687F7 +8809880C880B880687FC880887FF880A88028962895A895B89578961895C8958 +895D8959898889B789B689F68B508B488B4A8B408B538B568B548B4B8B550000 +F3 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +8B518B428B528B578C438C778C768C9A8D068D078D098DAC8DAA8DAD8DAB8E6D +8E788E738E6A8E6F8E7B8EC28F528F518F4F8F508F538FB49140913F91B091AD +93DE93C793CF93C293DA93D093F993EC93CC93D993A993E693CA93D493EE93E3 +93D593C493CE93C093D293E7957D95DA95DB96E19729972B972C972897260000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000097B397B797B697DD97DE97DF985C9859985D985798BF98BD98BB98BE9948 +9947994399A699A79A1A9A159A259A1D9A249A1B9A229A209A279A239A1E9A1C +9A149AC29B0B9B0A9B0E9B0C9B379BEA9BEB9BE09BDE9BE49BE69BE29BF09BD4 +9BD79BEC9BDC9BD99BE59BD59BE19BDA9D779D819D8A9D849D889D719D809D78 +9D869D8B9D8C9D7D9D6B9D749D759D709D699D859D739D7B9D829D6F9D799D7F +9D879D689E949E919EC09EFC9F2D9F409F419F4D9F569F579F58533756B20000 +F4 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +56B556B358E35B455DC65DC75EEE5EEF5FC05FC161F9651765166515651365DF +66E866E366E46AF36AF06AEA6AE86AF96AF16AEE6AEF703C7035702F70377034 +703170427038703F703A70397040703B703370417213721472A8737D737C74BA +76AB76AA76BE76ED77CC77CE77CF77CD77F27925792379277928792479290000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000079B27A6E7A6C7A6D7AF77C497C487C4A7C477C457CEE7E7B7E7E7E817E80 +7FBA7FFF807981DB81D9820B82688269862285FF860185FE861B860085F68604 +86098605860C85FD8819881088118817881388168963896689B989F78B608B6A +8B5D8B688B638B658B678B6D8DAE8E868E888E848F598F568F578F558F588F5A +908D9143914191B791B591B291B3940B941393FB9420940F941493FE94159410 +94289419940D93F5940093F79407940E9416941293FA940993F8940A93FF0000 +F5 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +93FC940C93F69411940695DE95E095DF972E972F97B997BB97FD97FE98609862 +9863985F98C198C29950994E9959994C994B99539A329A349A319A2C9A2A9A36 +9A299A2E9A389A2D9AC79ACA9AC69B109B129B119C0B9C089BF79C059C129BF8 +9C409C079C0E9C069C179C149C099D9F9D999DA49D9D9D929D989D909D9B0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00009DA09D949D9C9DAA9D979DA19D9A9DA29DA89D9E9DA39DBF9DA99D969DA6 +9DA79E999E9B9E9A9EE59EE49EE79EE69F309F2E9F5B9F609F5E9F5D9F599F91 +513A51395298529756C356BD56BE5B485B475DCB5DCF5EF161FD651B6B026AFC +6B036AF86B0070437044704A7048704970457046721D721A7219737E7517766A +77D0792D7931792F7C547C537CF27E8A7E877E887E8B7E867E8D7F4D7FBB8030 +81DD8618862A8626861F8623861C86198627862E862186208629861E86250000 +F6 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +8829881D881B88208824881C882B884A896D8969896E896B89FA8B798B788B45 +8B7A8B7B8D108D148DAF8E8E8E8C8F5E8F5B8F5D91469144914591B9943F943B +94369429943D943C94309439942A9437942C9440943195E595E495E39735973A +97BF97E1986498C998C698C0995899569A399A3D9A469A449A429A419A3A0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00009A3F9ACD9B159B179B189B169B3A9B529C2B9C1D9C1C9C2C9C239C289C29 +9C249C219DB79DB69DBC9DC19DC79DCA9DCF9DBE9DC59DC39DBB9DB59DCE9DB9 +9DBA9DAC9DC89DB19DAD9DCC9DB39DCD9DB29E7A9E9C9EEB9EEE9EED9F1B9F18 +9F1A9F319F4E9F659F649F924EB956C656C556CB59715B4B5B4C5DD55DD15EF2 +65216520652665226B0B6B086B096C0D7055705670577052721E721F72A9737F +74D874D574D974D7766D76AD793579B47A707A717C577C5C7C597C5B7C5A0000 +F7 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +7CF47CF17E917F4F7F8781DE826B863486358633862C86328636882C88288826 +882A8825897189BF89BE89FB8B7E8B848B828B868B858B7F8D158E958E948E9A +8E928E908E968E978F608F629147944C9450944A944B944F9447944594489449 +9446973F97E3986A986998CB9954995B9A4E9A539A549A4C9A4F9A489A4A0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00009A499A529A509AD09B199B2B9B3B9B569B559C469C489C3F9C449C399C33 +9C419C3C9C379C349C329C3D9C369DDB9DD29DDE9DDA9DCB9DD09DDC9DD19DDF +9DE99DD99DD89DD69DF59DD59DDD9EB69EF09F359F339F329F429F6B9F959FA2 +513D529958E858E759725B4D5DD8882F5F4F62016203620465296525659666EB +6B116B126B0F6BCA705B705A7222738273817383767077D47C677C667E95826C +863A86408639863C8631863B863E88308832882E883389768974897389FE0000 +F8 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +8B8C8B8E8B8B8B888C458D198E988F648F6391BC94629455945D9457945E97C4 +97C598009A569A599B1E9B1F9B209C529C589C509C4A9C4D9C4B9C559C599C4C +9C4E9DFB9DF79DEF9DE39DEB9DF89DE49DF69DE19DEE9DE69DF29DF09DE29DEC +9DF49DF39DE89DED9EC29ED09EF29EF39F069F1C9F389F379F369F439F4F0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00009F719F709F6E9F6F56D356CD5B4E5C6D652D66ED66EE6B13705F7061705D +7060722374DB74E577D5793879B779B67C6A7E977F89826D8643883888378835 +884B8B948B958E9E8E9F8EA08E9D91BE91BD91C2946B9468946996E597469743 +974797C797E59A5E9AD59B599C639C679C669C629C5E9C609E029DFE9E079E03 +9E069E059E009E019E099DFF9DFD9E049EA09F1E9F469F749F759F7656D4652E +65B86B186B196B176B1A7062722672AA77D877D979397C697C6B7CF67E9A0000 +F9 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +7E987E9B7E9981E081E18646864786488979897A897C897B89FF8B988B998EA5 +8EA48EA3946E946D946F9471947397499872995F9C689C6E9C6D9E0B9E0D9E10 +9E0F9E129E119EA19EF59F099F479F789F7B9F7A9F79571E70667C6F883C8DB2 +8EA691C394749478947694759A609C749C739C719C759E149E139EF69F0A0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00009FA4706870657CF7866A883E883D883F8B9E8C9C8EA98EC9974B98739874 +98CC996199AB9A649A669A679B249E159E179F4862076B1E7227864C8EA89482 +948094819A699A689B2E9E197229864B8B9F94839C799EB776759A6B9C7A9E1D +7069706A9EA49F7E9F499F98788192B988CF58BB60527CA75AFA255425662557 +2560256C2563255A2569255D255225642555255E256A256125582567255B2553 +25652556255F256B256225592568255C25512550256D256E2570256F25930000 diff --git a/env/tcl/tcl8.6/encoding/dingbats.enc b/env/tcl/tcl8.6/encoding/dingbats.enc new file mode 100644 index 0000000..9729487 --- /dev/null +++ b/env/tcl/tcl8.6/encoding/dingbats.enc @@ -0,0 +1,20 @@ +# Encoding file: dingbats, single-byte +S +003F 1 1 +00 +0000000100020003000400050006000700080009000A000B000C000D000E000F +0010001100120013001400150016001700180019001A001B001C001D001E001F +00202701270227032704260E2706270727082709261B261E270C270D270E270F +2710271127122713271427152716271727182719271A271B271C271D271E271F +2720272127222723272427252726272726052729272A272B272C272D272E272F +2730273127322733273427352736273727382739273A273B273C273D273E273F +2740274127422743274427452746274727482749274A274B25CF274D25A0274F +27502751275225B225BC25C6275625D727582759275A275B275C275D275E007F +0080008100820083008400850086008700880089008A008B008C008D008E008F +0090009100920093009400950096009700980099009A009B009C009D009E009F +0000276127622763276427652766276726632666266526602460246124622463 +2464246524662467246824692776277727782779277A277B277C277D277E277F +2780278127822783278427852786278727882789278A278B278C278D278E278F +2790279127922793279421922194219527982799279A279B279C279D279E279F +27A027A127A227A327A427A527A627A727A827A927AA27AB27AC27AD27AE27AF +000027B127B227B327B427B527B627B727B827B927BA27BB27BC27BD27BE0000 diff --git a/env/tcl/tcl8.6/encoding/ebcdic.enc b/env/tcl/tcl8.6/encoding/ebcdic.enc new file mode 100644 index 0000000..f451de5 --- /dev/null +++ b/env/tcl/tcl8.6/encoding/ebcdic.enc @@ -0,0 +1,19 @@ +S +006F 0 1 +00 +0000000100020003008500090086007F0087008D008E000B000C000D000E000F +0010001100120013008F000A0008009700180019009C009D001C001D001E001F +0080008100820083008400920017001B00880089008A008B008C000500060007 +0090009100160093009400950096000400980099009A009B00140015009E001A +002000A000E200E400E000E100E300E500E700F10060002E003C0028002B007C +002600E900EA00EB00E800ED00EE00EF00EC00DF00210024002A0029003B009F +002D002F00C200C400C000C100C300C500C700D1005E002C0025005F003E003F +00F800C900CA00CB00C800CD00CE00CF00CC00A8003A002300400027003D0022 +00D800610062006300640065006600670068006900AB00BB00F000FD00FE00B1 +00B0006A006B006C006D006E006F00700071007200AA00BA00E600B800C600A4 +00B500AF0073007400750076007700780079007A00A100BF00D000DD00DE00AE +00A200A300A500B700A900A700B600BC00BD00BE00AC005B005C005D00B400D7 +00F900410042004300440045004600470048004900AD00F400F600F200F300F5 +00A6004A004B004C004D004E004F00500051005200B900FB00FC00DB00FA00FF +00D900F70053005400550056005700580059005A00B200D400D600D200D300D5 +003000310032003300340035003600370038003900B3007B00DC007D00DA007E diff --git a/env/tcl/tcl8.6/encoding/euc-cn.enc b/env/tcl/tcl8.6/encoding/euc-cn.enc new file mode 100644 index 0000000..4b2f8c7 --- /dev/null +++ b/env/tcl/tcl8.6/encoding/euc-cn.enc @@ -0,0 +1,1397 @@ +# Encoding file: euc-cn, multi-byte +M +003F 0 82 +00 +0000000100020003000400050006000700080009000A000B000C000D000E000F +0010001100120013001400150016001700180019001A001B001C001D001E001F +0020002100220023002400250026002700280029002A002B002C002D002E002F +0030003100320033003400350036003700380039003A003B003C003D003E003F +0040004100420043004400450046004700480049004A004B004C004D004E004F +0050005100520053005400550056005700580059005A005B005C005D005E005F +0060006100620063006400650066006700680069006A006B006C006D006E006F +0070007100720073007400750076007700780079007A007B007C007D007E007F +0080008100820083008400850086008700880089008A008B008C008D008E008F +0090009100920093009400950096009700980099009A009B009C009D009E009F +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +A1 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000030003001300230FB02C902C700A8300330052015FF5E2225202620182019 +201C201D3014301530083009300A300B300C300D300E300F3016301730103011 +00B100D700F72236222722282211220F222A222922082237221A22A522252220 +23122299222B222E2261224C2248223D221D2260226E226F22642265221E2235 +22342642264000B0203220332103FF0400A4FFE0FFE1203000A7211626062605 +25CB25CF25CE25C725C625A125A025B325B2203B219221902191219330130000 +A2 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000024882489248A248B248C248D248E248F2490249124922493249424952496 +249724982499249A249B247424752476247724782479247A247B247C247D247E +247F248024812482248324842485248624872460246124622463246424652466 +2467246824690000000032203221322232233224322532263227322832290000 +00002160216121622163216421652166216721682169216A216B000000000000 +A3 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000FF01FF02FF03FFE5FF05FF06FF07FF08FF09FF0AFF0BFF0CFF0DFF0EFF0F +FF10FF11FF12FF13FF14FF15FF16FF17FF18FF19FF1AFF1BFF1CFF1DFF1EFF1F +FF20FF21FF22FF23FF24FF25FF26FF27FF28FF29FF2AFF2BFF2CFF2DFF2EFF2F +FF30FF31FF32FF33FF34FF35FF36FF37FF38FF39FF3AFF3BFF3CFF3DFF3EFF3F +FF40FF41FF42FF43FF44FF45FF46FF47FF48FF49FF4AFF4BFF4CFF4DFF4EFF4F +FF50FF51FF52FF53FF54FF55FF56FF57FF58FF59FF5AFF5BFF5CFF5DFFE30000 +A4 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000304130423043304430453046304730483049304A304B304C304D304E304F +3050305130523053305430553056305730583059305A305B305C305D305E305F +3060306130623063306430653066306730683069306A306B306C306D306E306F +3070307130723073307430753076307730783079307A307B307C307D307E307F +3080308130823083308430853086308730883089308A308B308C308D308E308F +3090309130923093000000000000000000000000000000000000000000000000 +A5 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000030A130A230A330A430A530A630A730A830A930AA30AB30AC30AD30AE30AF +30B030B130B230B330B430B530B630B730B830B930BA30BB30BC30BD30BE30BF +30C030C130C230C330C430C530C630C730C830C930CA30CB30CC30CD30CE30CF +30D030D130D230D330D430D530D630D730D830D930DA30DB30DC30DD30DE30DF +30E030E130E230E330E430E530E630E730E830E930EA30EB30EC30ED30EE30EF +30F030F130F230F330F430F530F6000000000000000000000000000000000000 +A6 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000039103920393039403950396039703980399039A039B039C039D039E039F +03A003A103A303A403A503A603A703A803A90000000000000000000000000000 +000003B103B203B303B403B503B603B703B803B903BA03BB03BC03BD03BE03BF +03C003C103C303C403C503C603C703C803C90000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +A7 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000004100411041204130414041504010416041704180419041A041B041C041D +041E041F0420042104220423042404250426042704280429042A042B042C042D +042E042F00000000000000000000000000000000000000000000000000000000 +000004300431043204330434043504510436043704380439043A043B043C043D +043E043F0440044104420443044404450446044704480449044A044B044C044D +044E044F00000000000000000000000000000000000000000000000000000000 +A8 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000010100E101CE00E0011300E9011B00E8012B00ED01D000EC014D00F301D2 +00F2016B00FA01D400F901D601D801DA01DC00FC00EA00000000000000000000 +0000000000000000000031053106310731083109310A310B310C310D310E310F +3110311131123113311431153116311731183119311A311B311C311D311E311F +3120312131223123312431253126312731283129000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +A9 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00000000000000002500250125022503250425052506250725082509250A250B +250C250D250E250F2510251125122513251425152516251725182519251A251B +251C251D251E251F2520252125222523252425252526252725282529252A252B +252C252D252E252F2530253125322533253425352536253725382539253A253B +253C253D253E253F2540254125422543254425452546254725482549254A254B +0000000000000000000000000000000000000000000000000000000000000000 +B0 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000554A963F57C3632854CE550954C07691764C853C77EE827E788D72319698 +978D6C285B894FFA630966975CB880FA684880AE660276CE51F9655671AC7FF1 +888450B2596561CA6FB382AD634C625253ED54277B06516B75A45DF462D48DCB +9776628A8019575D97387F627238767D67CF767E64464F708D2562DC7A176591 +73ED642C6273822C9881677F7248626E62CC4F3474E3534A529E7ECA90A65E2E +6886699C81807ED168D278C5868C9551508D8C2482DE80DE5305891252650000 +B1 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000858496F94FDD582199715B9D62B162A566B48C799C8D7206676F789160B2 +535153178F8880CC8D1D94A1500D72C8590760EB711988AB595482EF672C7B28 +5D297EF7752D6CF58E668FF8903C9F3B6BD491197B145F7C78A784D6853D6BD5 +6BD96BD65E015E8775F995ED655D5F0A5FC58F9F58C181C2907F965B97AD8FB9 +7F168D2C62414FBF53D8535E8FA88FA98FAB904D68075F6A819888689CD6618B +522B762A5F6C658C6FD26EE85BBE6448517551B067C44E1979C9997C70B30000 +B2 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000075C55E7673BB83E064AD62E894B56CE2535A52C3640F94C27B944F2F5E1B +82368116818A6E246CCA9A736355535C54FA886557E04E0D5E036B657C3F90E8 +601664E6731C88C16750624D8D22776C8E2991C75F6983DC8521991053C28695 +6B8B60ED60E8707F82CD82314ED36CA785CF64CD7CD969FD66F9834953957B56 +4FA7518C6D4B5C428E6D63D253C9832C833667E578B4643D5BDF5C945DEE8BE7 +62C667F48C7A640063BA8749998B8C177F2094F24EA7961098A4660C73160000 +B3 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000573A5C1D5E38957F507F80A05382655E7545553150218D856284949E671D +56326F6E5DE2543570928F66626F64A463A35F7B6F8890F481E38FB05C186668 +5FF16C8996488D81886C649179F057CE6A59621054484E587A0B60E96F848BDA +627F901E9A8B79E4540375F4630153196C608FDF5F1B9A70803B9F7F4F885C3A +8D647FC565A570BD514551B2866B5D075BA062BD916C75748E0C7A2061017B79 +4EC77EF877854E1181ED521D51FA6A7153A88E87950496CF6EC19664695A0000 +B4 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000784050A877D7641089E6590463E35DDD7A7F693D4F20823955984E3275AE +7A975E625E8A95EF521B5439708A6376952457826625693F918755076DF37EAF +882262337EF075B5832878C196CC8F9E614874F78BCD6B64523A8D506B21806A +847156F153064ECE4E1B51D17C97918B7C074FC38E7F7BE17A9C64675D1450AC +810676017CB96DEC7FE067515B585BF878CB64AE641363AA632B9519642D8FBE +7B5476296253592754466B7950A362345E266B864EE38D37888B5F85902E0000 +B5 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00006020803D62C54E39535590F863B880C665E66C2E4F4660EE6DE18BDE5F39 +86CB5F536321515A83616863520063638E4850125C9B79775BFC52307A3B60BC +905376D75FB75F9776848E6C706F767B7B4977AA51F3909358244F4E6EF48FEA +654C7B1B72C46DA47FDF5AE162B55E95573084827B2C5E1D5F1F90127F1498A0 +63826EC7789870B95178975B57AB75354F4375385E9760E659606DC06BBF7889 +53FC96D551CB52016389540A94938C038DCC7239789F87768FED8C0D53E00000 +B6 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00004E0176EF53EE948998769F0E952D5B9A8BA24E224E1C51AC846361C252A8 +680B4F97606B51BB6D1E515C6296659796618C46901775D890FD77636BD2728A +72EC8BFB583577798D4C675C9540809A5EA66E2159927AEF77ED953B6BB565AD +7F0E58065151961F5BF958A954288E726566987F56E4949D76FE9041638754C6 +591A593A579B8EB267358DFA8235524160F0581586FE5CE89E454FC4989D8BB9 +5A2560765384627C904F9102997F6069800C513F80335C1499756D314E8C0000 +B7 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00008D3053D17F5A7B4F4F104E4F96006CD573D085E95E06756A7FFB6A0A77FE +94927E4151E170E653CD8FD483038D2972AF996D6CDB574A82B365B980AA623F +963259A84EFF8BBF7EBA653E83F2975E556198DE80A5532A8BFD542080BA5E9F +6CB88D3982AC915A54296C1B52067EB7575F711A6C7E7C89594B4EFD5FFF6124 +7CAA4E305C0167AB87025CF0950B98CE75AF70FD902251AF7F1D8BBD594951E4 +4F5B5426592B657780A45B75627662C28F905E456C1F7B264F0F4FD8670D0000 +B8 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00006D6E6DAA798F88B15F17752B629A8F854FEF91DC65A7812F81515E9C8150 +8D74526F89868D4B590D50854ED8961C723681798D1F5BCC8BA3964459877F1A +54905676560E8BE565396982949976D66E895E727518674667D17AFF809D8D76 +611F79C665628D635188521A94A27F38809B7EB25C976E2F67607BD9768B9AD8 +818F7F947CD5641E95507A3F544A54E56B4C640162089E3D80F3759952729769 +845B683C86E49601969494EC4E2A54047ED968398DDF801566F45E9A7FB90000 +B9 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000057C2803F68975DE5653B529F606D9F9A4F9B8EAC516C5BAB5F135DE96C5E +62F18D21517194A952FE6C9F82DF72D757A267848D2D591F8F9C83C754957B8D +4F306CBD5B6459D19F1353E486CA9AA88C3780A16545987E56FA96C7522E74DC +52505BE1630289024E5662D0602A68FA51735B9851A089C27BA199867F5060EF +704C8D2F51495E7F901B747089C4572D78455F529F9F95FA8F689B3C8BE17678 +684267DC8DEA8D35523D8F8A6EDA68CD950590ED56FD679C88F98FC754C80000 +BA +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00009AB85B696D776C264EA55BB39A87916361A890AF97E9542B6DB55BD251FD +558A7F557FF064BC634D65F161BE608D710A6C576C49592F676D822A58D5568E +8C6A6BEB90DD597D801753F76D695475559D837783CF683879BE548C4F555408 +76D28C8996026CB36DB88D6B89109E648D3A563F9ED175D55F8872E0606854FC +4EA86A2A886160528F7054C470D886799E3F6D2A5B8F5F187EA255894FAF7334 +543C539A5019540E547C4E4E5FFD745A58F6846B80E1877472D07CCA6E560000 +BB +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00005F27864E552C62A44E926CAA623782B154D7534E733E6ED1753B52125316 +8BDD69D05F8A60006DEE574F6B2273AF68538FD87F13636260A3552475EA8C62 +71156DA35BA65E7B8352614C9EC478FA87577C27768751F060F6714C66435E4C +604D8C0E707063258F895FBD606286D456DE6BC160946167534960E066668D3F +79FD4F1A70E96C478BB38BF27ED88364660F5A5A9B426D516DF78C416D3B4F19 +706B83B7621660D1970D8D27797851FB573E57FA673A75787A3D79EF7B950000 +BC +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000808C99658FF96FC08BA59E2159EC7EE97F095409678168D88F917C4D96C6 +53CA602575BE6C7253735AC97EA7632451E0810A5DF184DF628051805B634F0E +796D524260B86D4E5BC45BC28BA18BB065E25FCC964559937EE77EAA560967B7 +59394F735BB652A0835A988A8D3E753294BE50477A3C4EF767B69A7E5AC16B7C +76D1575A5C167B3A95F4714E517C80A9827059787F04832768C067EC78B17877 +62E363617B804FED526A51CF835069DB92748DF58D3189C1952E7BAD4EF60000 +BD +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000506582305251996F6E106E856DA75EFA50F559DC5C066D466C5F7586848B +686859568BB253209171964D854969127901712680F64EA490CA6D479A845A07 +56BC640594F077EB4FA5811A72E189D2997A7F347EDE527F655991758F7F8F83 +53EB7A9663ED63A5768679F888579636622A52AB8282685467706377776B7AED +6D017ED389E359D0621285C982A5754C501F4ECB75A58BEB5C4A5DFE7B4B65A4 +91D14ECA6D25895F7D2795264EC58C288FDB9773664B79818FD170EC6D780000 +BE +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00005C3D52B283465162830E775B66769CB84EAC60CA7CBE7CB37ECF4E958B66 +666F988897595883656C955C5F8475C997567ADF7ADE51C070AF7A9863EA7A76 +7EA0739697ED4E4570784E5D915253A9655165E781FC8205548E5C31759A97A0 +62D872D975BD5C459A7983CA5C40548077E94E3E6CAE805A62D2636E5DE85177 +8DDD8E1E952F4FF153E560E770AC526763509E435A1F5026773753777EE26485 +652B628963985014723589C951B38BC07EDD574783CC94A7519B541B5CFB0000 +BF +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00004FCA7AE36D5A90E19A8F55805496536154AF5F0063E9697751EF6168520A +582A52D8574E780D770B5EB761777CE0625B62974EA27095800362F770E49760 +577782DB67EF68F578D5989779D158F354B353EF6E34514B523B5BA28BFE80AF +554357A660735751542D7A7A60505B5463A762A053E362635BC767AF54ED7A9F +82E691775E9388E4593857AE630E8DE880EF57577B774FA95FEB5BBD6B3E5321 +7B5072C2684677FF773665F751B54E8F76D45CBF7AA58475594E9B4150800000 +C0 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000998861276E8357646606634656F062EC62695ED39614578362C955878721 +814A8FA3556683B167658D5684DD5A6A680F62E67BEE961151706F9C8C3063FD +89C861D27F0670C26EE57405699472FC5ECA90CE67176D6A635E52B372628001 +4F6C59E5916A70D96D9D52D24E5096F7956D857E78CA7D2F5121579264C2808B +7C7B6CEA68F1695E51B7539868A872819ECE7BF172F879BB6F137406674E91CC +9CA4793C83898354540F68174E3D538952B1783E5386522950884F8B4FD00000 +C1 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000075E27ACB7C926CA596B6529B748354E94FE9805483B28FDE95705EC9601C +6D9F5E18655B813894FE604B70BC7EC37CAE51C968817CB1826F4E248F8691CF +667E4EAE8C0564A9804A50DA759771CE5BE58FBD6F664E86648295635ED66599 +521788C270C852A3730E7433679778F797164E3490BB9CDE6DCB51DB8D41541D +62CE73B283F196F69F8494C34F367F9A51CC707596755CAD988653E64EE46E9C +740969B4786B998F7559521876246D4167F3516D9F99804B54997B3C7ABF0000 +C2 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00009686578462E29647697C5A0464027BD36F0F964B82A6536298855E907089 +63B35364864F9C819E93788C97328DEF8D429E7F6F5E79845F559646622E9A74 +541594DD4FA365C55C655C617F1586516C2F5F8B73876EE47EFF5CE6631B5B6A +6EE653754E7163A0756562A18F6E4F264ED16CA67EB68BBA841D87BA7F57903B +95237BA99AA188F8843D6D1B9A867EDC59889EBB739B780186829A6C9A82561B +541757CB4E709EA653568FC881097792999286EE6EE1851366FC61626F2B0000 +C3 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00008C298292832B76F26C135FD983BD732B8305951A6BDB77DB94C6536F8302 +51925E3D8C8C8D384E4873AB679A68859176970971646CA177095A9295416BCF +7F8E66275BD059B95A9A95E895F74EEC840C84996AAC76DF9530731B68A65B5F +772F919A97617CDC8FF78C1C5F257C7379D889C56CCC871C5BC65E4268C97720 +7EF55195514D52C95A297F05976282D763CF778485D079D26E3A5E9959998511 +706D6C1162BF76BF654F60AF95FD660E879F9E2394ED540D547D8C2C64780000 +C4 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000647986116A21819C78E864699B5462B9672B83AB58A89ED86CAB6F205BDE +964C8C0B725F67D062C772614EA959C66BCD589366AE5E5552DF6155672876EE +776672677A4662FF54EA545094A090A35A1C7EB36C164E435976801059485357 +753796BE56CA63208111607C95F96DD65462998151855AE980FD59AE9713502A +6CE55C3C62DF4F60533F817B90066EBA852B62C85E7478BE64B5637B5FF55A18 +917F9E1F5C3F634F80425B7D556E954A954D6D8560A867E072DE51DD5B810000 +C5 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000062E76CDE725B626D94AE7EBD81136D53519C5F04597452AA601259736696 +8650759F632A61E67CEF8BFA54E66B279E256BB485D5545550766CA4556A8DB4 +722C5E156015743662CD6392724C5F986E436D3E65006F5876D878D076FC7554 +522453DB4E535E9E65C1802A80D6629B5486522870AE888D8DD16CE1547880DA +57F988F48D54966A914D4F696C9B55B776C6783062A870F96F8E5F6D84EC68DA +787C7BF781A8670B9E4F636778B0576F78129739627962AB528874356BD70000 +C6 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00005564813E75B276AE533975DE50FB5C418B6C7BC7504F72479A9798D86F02 +74E27968648777A562FC98918D2B54C180584E52576A82F9840D5E7351ED74F6 +8BC45C4F57616CFC98875A4678349B448FEB7C955256625194FA4EC683868461 +83E984B257D467345703666E6D668C3166DD7011671F6B3A6816621A59BB4E03 +51C46F0667D26C8F517668CB59476B6775665D0E81109F5065D7794879419A91 +8D775C824E5E4F01542F5951780C56686C148FC45F036C7D6CE38BAB63900000 +C7 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000060706D3D72756266948E94C553438FC17B7E4EDF8C264E7E9ED494B194B3 +524D6F5C90636D458C3458115D4C6B206B4967AA545B81547F8C589985375F3A +62A26A47953965726084686577A74E544FA85DE7979864AC7FD85CED4FCF7A8D +520783044E14602F7A8394A64FB54EB279E6743452E482B964D279BD5BDD6C81 +97528F7B6C22503E537F6E0564CE66746C3060C598778BF75E86743C7A7779CB +4E1890B174036C4256DA914B6CC58D8B533A86C666F28EAF5C489A716E200000 +C8 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000053D65A369F8B8DA353BB570898A76743919B6CC9516875CA62F372AC5238 +529D7F3A7094763853749E4A69B7786E96C088D97FA4713671C3518967D374E4 +58E4651856B78BA9997662707ED560F970ED58EC4EC14EBA5FCD97E74EFB8BA4 +5203598A7EAB62544ECD65E5620E833884C98363878D71946EB65BB97ED25197 +63C967D480898339881551125B7A59828FB14E736C5D516589258F6F962E854A +745E951095F06DA682E55F3164926D128428816E9CC3585E8D5B4E0953C10000 +C9 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00004F1E6563685155D34E2764149A9A626B5AC2745F82726DA968EE50E7838E +7802674052396C997EB150BB5565715E7B5B665273CA82EB67495C715220717D +886B95EA965564C58D6181B355846C5562477F2E58924F2455468D4F664C4E0A +5C1A88F368A2634E7A0D70E7828D52FA97F65C1154E890B57ECD59628D4A86C7 +820C820D8D6664445C0461516D89793E8BBE78377533547B4F388EAB6DF15A20 +7EC5795E6C885BA15A76751A80BE614E6E1758F0751F7525727253477EF30000 +CA +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000770176DB526980DC57235E08593172EE65BD6E7F8BD75C388671534177F3 +62FE65F64EC098DF86805B9E8BC653F277E24F7F5C4E9A7659CB5F0F793A58EB +4E1667FF4E8B62ED8A93901D52BF662F55DC566C90024ED54F8D91CA99706C0F +5E0260435BA489C68BD56536624B99965B885BFF6388552E53D77626517D852C +67A268B36B8A62928F9353D482126DD1758F4E668D4E5B70719F85AF669166D9 +7F7287009ECD9F205C5E672F8FF06811675F620D7AD658855EB665706F310000 +CB +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000060555237800D6454887075295E05681362F4971C53CC723D8C016C347761 +7A0E542E77AC987A821C8BF47855671470C165AF64955636601D79C153F84E1D +6B7B80865BFA55E356DB4F3A4F3C99725DF3677E80386002988290015B8B8BBC +8BF5641C825864DE55FD82CF91654FD77D20901F7C9F50F358516EAF5BBF8BC9 +80839178849C7B97867D968B968F7EE59AD3788E5C817A57904296A7795F5B59 +635F7B0B84D168AD55067F2974107D2295016240584C4ED65B83597958540000 +CC +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000736D631E8E4B8E0F80CE82D462AC53F06CF0915E592A60016C70574D644A +8D2A762B6EE9575B6A8075F06F6D8C2D8C0857666BEF889278B363A253F970AD +6C645858642A580268E0819B55107CD650188EBA6DCC8D9F70EB638F6D9B6ED4 +7EE68404684390036DD896768BA85957727985E4817E75BC8A8A68AF52548E22 +951163D098988E44557C4F5366FF568F60D56D9552435C4959296DFB586B7530 +751C606C82148146631167618FE2773A8DF38D3494C15E165385542C70C30000 +CD +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00006C405EF7505C4EAD5EAD633A8247901A6850916E77B3540C94DC5F647AE5 +687663457B527EDF75DB507762955934900F51F879C37A8156FE5F9290146D82 +5C60571F541051546E4D56E263A89893817F8715892A9000541E5C6F81C062D6 +625881319E3596409A6E9A7C692D59A562D3553E631654C786D96D3C5A0374E6 +889C6B6A59168C4C5F2F6E7E73A9987D4E3870F75B8C7897633D665A769660CB +5B9B5A494E0781556C6A738B4EA167897F515F8065FA671B5FD859845A010000 +CE +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00005DCD5FAE537197E68FDD684556F4552F60DF4E3A6F4D7EF482C7840E59D4 +4F1F4F2A5C3E7EAC672A851A5473754F80C355829B4F4F4D6E2D8C135C096170 +536B761F6E29868A658795FB7EB9543B7A337D0A95EE55E17FC174EE631D8717 +6DA17A9D621165A1536763E16C835DEB545C94A84E4C6C618BEC5C4B65E0829C +68A7543E54346BCB6B664E9463425348821E4F0D4FAE575E620A96FE66647269 +52FF52A1609F8BEF661471996790897F785277FD6670563B54389521727A0000 +CF +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00007A00606F5E0C6089819D591560DC718470EF6EAA6C5072806A8488AD5E2D +4E605AB3559C94E36D177CFB9699620F7EC6778E867E5323971E8F9666875CE1 +4FA072ED4E0B53A6590F54136380952851484ED99C9C7EA454B88D2488548237 +95F26D8E5F265ACC663E966973B0732E53BF817A99857FA15BAA967796507EBF +76F853A2957699997BB189446E584E617FD479658BE660F354CD4EAB98795DF7 +6A6150CF54118C618427785D9704524A54EE56A395006D885BB56DC666530000 +D0 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00005C0F5B5D6821809655787B11654869544E9B6B47874E978B534F631F643A +90AA659C80C18C10519968B0537887F961C86CC46CFB8C225C5185AA82AF950C +6B238F9B65B05FFB5FC34FE18845661F8165732960FA51745211578B5F6290A2 +884C91925E78674F602759D3514451F680F853086C7996C4718A4F114FEE7F9E +673D55C5950879C088967EE3589F620C9700865A5618987B5F908BB884C49157 +53D965ED5E8F755C60647D6E5A7F7EEA7EED8F6955A75BA360AC65CB73840000 +D1 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00009009766377297EDA9774859B5B667A7496EA884052CB718F5FAA65EC8BE2 +5BFB9A6F5DE16B896C5B8BAD8BAF900A8FC5538B62BC9E269E2D54404E2B82BD +7259869C5D1688596DAF96C554D14E9A8BB6710954BD960970DF6DF976D04E25 +781487125CA95EF68A00989C960E708E6CBF594463A9773C884D6F1482735830 +71D5538C781A96C155015F6671305BB48C1A9A8C6B83592E9E2F79E76768626C +4F6F75A17F8A6D0B96336C274EF075D2517B68376F3E90808170599674760000 +D2 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000064475C2790657A918C2359DA54AC8200836F898180006930564E80367237 +91CE51B64E5F987563964E1A53F666F3814B591C6DB24E0058F9533B63D694F1 +4F9D4F0A886398905937905779FB4EEA80F075916C825B9C59E85F5D69058681 +501A5DF24E5977E34EE5827A6291661390915C794EBF5F7981C69038808475AB +4EA688D4610F6BC55FC64E4976CA6EA28BE38BAE8C0A8BD15F027FFC7FCC7ECE +8335836B56E06BB797F3963459FB541F94F66DEB5BC5996E5C395F1596900000 +D3 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000537082F16A315A749E705E947F2883B984248425836787478FCE8D6276C8 +5F719896786C662054DF62E54F6381C375C85EB896CD8E0A86F9548F6CF36D8C +6C38607F52C775285E7D4F1860A05FE75C24753190AE94C072B96CB96E389149 +670953CB53F34F5191C98BF153C85E7C8FC26DE44E8E76C26986865E611A8206 +4F594FDE903E9C7C61096E1D6E1496854E885A3196E84E0E5C7F79B95B878BED +7FBD738957DF828B90C15401904755BB5CEA5FA161086B3272F180B28A890000 +D4 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00006D745BD388D598848C6B9A6D9E336E0A51A4514357A38881539F63F48F95 +56ED54585706733F6E907F188FDC82D1613F6028966266F07EA68D8A8DC394A5 +5CB37CA4670860A6960580184E9190E75300966851418FD08574915D665597F5 +5B55531D78386742683D54C9707E5BB08F7D518D572854B1651266828D5E8D43 +810F846C906D7CDF51FF85FB67A365E96FA186A48E81566A90207682707671E5 +8D2362E952196CFD8D3C600E589E618E66FE8D60624E55B36E23672D8F670000 +D5 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000094E195F87728680569A8548B4E4D70B88BC86458658B5B857A84503A5BE8 +77BB6BE18A797C986CBE76CF65A98F975D2D5C5586386808536062187AD96E5B +7EFD6A1F7AE05F706F335F20638C6DA867564E085E108D264ED780C07634969C +62DB662D627E6CBC8D7571677F695146808753EC906E629854F286F08F998005 +951785178FD96D5973CD659F771F7504782781FB8D1E94884FA6679575B98BCA +9707632F9547963584B8632377415F8172F04E896014657462EF6B63653F0000 +D6 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00005E2775C790D18BC1829D679D652F5431871877E580A281026C414E4B7EC7 +804C76F4690D6B966267503C4F84574063076B628DBE53EA65E87EB85FD7631A +63B781F381F47F6E5E1C5CD95236667A79E97A1A8D28709975D46EDE6CBB7A92 +4E2D76C55FE0949F88777EC879CD80BF91CD4EF24F17821F54685DDE6D328BCC +7CA58F7480985E1A549276B15B99663C9AA473E0682A86DB6731732A8BF88BDB +90107AF970DB716E62C477A956314E3B845767F152A986C08D2E94F87B510000 +D7 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00004F4F6CE8795D9A7B6293722A62FD4E1378168F6C64B08D5A7BC668695E84 +88C55986649E58EE72B6690E95258FFD8D5857607F008C0651C6634962D95353 +684C74228301914C55447740707C6D4A517954A88D4459FF6ECB6DC45B5C7D2B +4ED47C7D6ED35B5081EA6E0D5B579B0368D58E2A5B977EFC603B7EB590B98D70 +594F63CD79DF8DB3535265CF79568BC5963B7EC494BB7E825634918967007F6A +5C0A907566285DE64F5067DE505A4F5C57505EA7000000000000000000000000 +D8 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00004E8D4E0C51404E105EFF53454E154E984E1E9B325B6C56694E2879BA4E3F +53154E47592D723B536E6C1056DF80E499976BD3777E9F174E364E9F9F104E5C +4E694E9382885B5B556C560F4EC4538D539D53A353A553AE97658D5D531A53F5 +5326532E533E8D5C5366536352025208520E522D5233523F5240524C525E5261 +525C84AF527D528252815290529351827F544EBB4EC34EC94EC24EE84EE14EEB +4EDE4F1B4EF34F224F644EF54F254F274F094F2B4F5E4F6765384F5A4F5D0000 +D9 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00004F5F4F574F324F3D4F764F744F914F894F834F8F4F7E4F7B4FAA4F7C4FAC +4F944FE64FE84FEA4FC54FDA4FE34FDC4FD14FDF4FF85029504C4FF3502C500F +502E502D4FFE501C500C50255028507E504350555048504E506C507B50A550A7 +50A950BA50D6510650ED50EC50E650EE5107510B4EDD6C3D4F584F654FCE9FA0 +6C467C74516E5DFD9EC999985181591452F9530D8A07531051EB591951554EA0 +51564EB3886E88A44EB5811488D279805B3488037FB851AB51B151BD51BC0000 +DA +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000051C7519651A251A58BA08BA68BA78BAA8BB48BB58BB78BC28BC38BCB8BCF +8BCE8BD28BD38BD48BD68BD88BD98BDC8BDF8BE08BE48BE88BE98BEE8BF08BF3 +8BF68BF98BFC8BFF8C008C028C048C078C0C8C0F8C118C128C148C158C168C19 +8C1B8C188C1D8C1F8C208C218C258C278C2A8C2B8C2E8C2F8C328C338C358C36 +5369537A961D962296219631962A963D963C964296499654965F9667966C9672 +96749688968D969796B09097909B909D909990AC90A190B490B390B690BA0000 +DB +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000090B890B090CF90C590BE90D090C490C790D390E690E290DC90D790DB90EB +90EF90FE91049122911E91239131912F913991439146520D594252A252AC52AD +52BE54FF52D052D652F053DF71EE77CD5EF451F551FC9B2F53B65F01755A5DEF +574C57A957A1587E58BC58C558D15729572C572A57335739572E572F575C573B +574257695785576B5786577C577B5768576D5776577357AD57A4578C57B257CF +57A757B4579357A057D557D857DA57D957D257B857F457EF57F857E457DD0000 +DC +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000580B580D57FD57ED5800581E5819584458205865586C58815889589A5880 +99A89F1961FF8279827D827F828F828A82A88284828E82918297829982AB82B8 +82BE82B082C882CA82E3829882B782AE82CB82CC82C182A982B482A182AA829F +82C482CE82A482E1830982F782E4830F830782DC82F482D282D8830C82FB82D3 +8311831A83068314831582E082D5831C8351835B835C83088392833C83348331 +839B835E832F834F83478343835F834083178360832D833A8333836683650000 +DD +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00008368831B8369836C836A836D836E83B0837883B383B483A083AA8393839C +8385837C83B683A9837D83B8837B8398839E83A883BA83BC83C1840183E583D8 +58078418840B83DD83FD83D6841C84388411840683D483DF840F840383F883F9 +83EA83C583C0842683F083E1845C8451845A8459847384878488847A84898478 +843C844684698476848C848E8431846D84C184CD84D084E684BD84D384CA84BF +84BA84E084A184B984B4849784E584E3850C750D853884F08539851F853A0000 +DE +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00008556853B84FF84FC8559854885688564855E857A77A285438572857B85A4 +85A88587858F857985AE859C858585B985B785B085D385C185DC85FF86278605 +86298616863C5EFE5F08593C594180375955595A5958530F5C225C255C2C5C34 +624C626A629F62BB62CA62DA62D762EE632262F66339634B634363AD63F66371 +637A638E63B4636D63AC638A636963AE63BC63F263F863E063FF63C463DE63CE +645263C663BE64456441640B641B6420640C64266421645E6484646D64960000 +DF +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000647A64B764B8649964BA64C064D064D764E464E265096525652E5F0B5FD2 +75195F11535F53F153FD53E953E853FB541254165406544B5452545354545456 +54435421545754595423543254825494547754715464549A549B548454765466 +549D54D054AD54C254B454D254A754A654D354D4547254A354D554BB54BF54CC +54D954DA54DC54A954AA54A454DD54CF54DE551B54E7552054FD551454F35522 +5523550F55115527552A5567558F55B55549556D55415555553F5550553C0000 +E0 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00005537555655755576557755335530555C558B55D2558355B155B955885581 +559F557E55D65591557B55DF55BD55BE5594559955EA55F755C9561F55D155EB +55EC55D455E655DD55C455EF55E555F255F355CC55CD55E855F555E48F94561E +5608560C56015624562355FE56005627562D565856395657562C564D56625659 +565C564C5654568656645671566B567B567C5685569356AF56D456D756DD56E1 +56F556EB56F956FF5704570A5709571C5E0F5E195E145E115E315E3B5E3C0000 +E1 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00005E375E445E545E5B5E5E5E615C8C5C7A5C8D5C905C965C885C985C995C91 +5C9A5C9C5CB55CA25CBD5CAC5CAB5CB15CA35CC15CB75CC45CD25CE45CCB5CE5 +5D025D035D275D265D2E5D245D1E5D065D1B5D585D3E5D345D3D5D6C5D5B5D6F +5D5D5D6B5D4B5D4A5D695D745D825D995D9D8C735DB75DC55F735F775F825F87 +5F895F8C5F955F995F9C5FA85FAD5FB55FBC88625F6172AD72B072B472B772B8 +72C372C172CE72CD72D272E872EF72E972F272F472F7730172F3730372FA0000 +E2 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000072FB731773137321730A731E731D7315732273397325732C733873317350 +734D73577360736C736F737E821B592598E7592459029963996799689969996A +996B996C99749977997D998099849987998A998D999099919993999499955E80 +5E915E8B5E965EA55EA05EB95EB55EBE5EB38D535ED25ED15EDB5EE85EEA81BA +5FC45FC95FD65FCF60035FEE60045FE15FE45FFE600560065FEA5FED5FF86019 +60356026601B600F600D6029602B600A603F602160786079607B607A60420000 +E3 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000606A607D6096609A60AD609D60836092608C609B60EC60BB60B160DD60D8 +60C660DA60B4612061266115612360F46100610E612B614A617561AC619461A7 +61B761D461F55FDD96B395E995EB95F195F395F595F695FC95FE960396049606 +9608960A960B960C960D960F96129615961696179619961A4E2C723F62156C35 +6C546C5C6C4A6CA36C856C906C946C8C6C686C696C746C766C866CA96CD06CD4 +6CAD6CF76CF86CF16CD76CB26CE06CD66CFA6CEB6CEE6CB16CD36CEF6CFE0000 +E4 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00006D396D276D0C6D436D486D076D046D196D0E6D2B6D4D6D2E6D356D1A6D4F +6D526D546D336D916D6F6D9E6DA06D5E6D936D946D5C6D606D7C6D636E1A6DC7 +6DC56DDE6E0E6DBF6DE06E116DE66DDD6DD96E166DAB6E0C6DAE6E2B6E6E6E4E +6E6B6EB26E5F6E866E536E546E326E256E446EDF6EB16E986EE06F2D6EE26EA5 +6EA76EBD6EBB6EB76ED76EB46ECF6E8F6EC26E9F6F626F466F476F246F156EF9 +6F2F6F366F4B6F746F2A6F096F296F896F8D6F8C6F786F726F7C6F7A6FD10000 +E5 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00006FC96FA76FB96FB66FC26FE16FEE6FDE6FE06FEF701A7023701B70397035 +704F705E5B805B845B955B935BA55BB8752F9A9E64345BE45BEE89305BF08E47 +8B078FB68FD38FD58FE58FEE8FE48FE98FE68FF38FE890059004900B90269011 +900D9016902190359036902D902F9044905190529050906890589062905B66B9 +9074907D908290889083908B5F505F575F565F585C3B54AB5C505C595B715C63 +5C667FBC5F2A5F295F2D82745F3C9B3B5C6E59815983598D59A959AA59A30000 +E6 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000599759CA59AB599E59A459D259B259AF59D759BE5A055A0659DD5A0859E3 +59D859F95A0C5A095A325A345A115A235A135A405A675A4A5A555A3C5A625A75 +80EC5AAA5A9B5A775A7A5ABE5AEB5AB25AD25AD45AB85AE05AE35AF15AD65AE6 +5AD85ADC5B095B175B165B325B375B405C155C1C5B5A5B655B735B515B535B62 +9A759A779A789A7A9A7F9A7D9A809A819A859A889A8A9A909A929A939A969A98 +9A9B9A9C9A9D9A9F9AA09AA29AA39AA59AA77E9F7EA17EA37EA57EA87EA90000 +E7 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00007EAD7EB07EBE7EC07EC17EC27EC97ECB7ECC7ED07ED47ED77EDB7EE07EE1 +7EE87EEB7EEE7EEF7EF17EF27F0D7EF67EFA7EFB7EFE7F017F027F037F077F08 +7F0B7F0C7F0F7F117F127F177F197F1C7F1B7F1F7F217F227F237F247F257F26 +7F277F2A7F2B7F2C7F2D7F2F7F307F317F327F337F355E7A757F5DDB753E9095 +738E739173AE73A2739F73CF73C273D173B773B373C073C973C873E573D9987C +740A73E973E773DE73BA73F2740F742A745B7426742574287430742E742C0000 +E8 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000741B741A7441745C7457745574597477746D747E749C748E748074817487 +748B749E74A874A9749074A774D274BA97EA97EB97EC674C6753675E67486769 +67A56787676A6773679867A7677567A8679E67AD678B6777677C67F0680967D8 +680A67E967B0680C67D967B567DA67B367DD680067C367B867E2680E67C167FD +6832683368606861684E6862684468646883681D68556866684168676840683E +684A6849682968B5688F687468776893686B68C2696E68FC691F692068F90000 +E9 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000692468F0690B6901695768E369106971693969606942695D6984696B6980 +69986978693469CC6987698869CE6989696669636979699B69A769BB69AB69AD +69D469B169C169CA69DF699569E0698D69FF6A2F69ED6A176A186A6569F26A44 +6A3E6AA06A506A5B6A356A8E6A796A3D6A286A586A7C6A916A906AA96A976AAB +733773526B816B826B876B846B926B936B8D6B9A6B9B6BA16BAA8F6B8F6D8F71 +8F728F738F758F768F788F778F798F7A8F7C8F7E8F818F828F848F878F8B0000 +EA +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00008F8D8F8E8F8F8F988F9A8ECE620B6217621B621F6222622162256224622C +81E774EF74F474FF750F75117513653465EE65EF65F0660A6619677266036615 +6600708566F7661D66346631663666358006665F66546641664F665666616657 +66776684668C66A7669D66BE66DB66DC66E666E98D328D338D368D3B8D3D8D40 +8D458D468D488D498D478D4D8D558D5989C789CA89CB89CC89CE89CF89D089D1 +726E729F725D7266726F727E727F7284728B728D728F72926308633263B00000 +EB +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000643F64D880046BEA6BF36BFD6BF56BF96C056C076C066C0D6C156C186C19 +6C1A6C216C296C246C2A6C3265356555656B724D72527256723086625216809F +809C809380BC670A80BD80B180AB80AD80B480B780E780E880E980EA80DB80C2 +80C480D980CD80D7671080DD80EB80F180F480ED810D810E80F280FC67158112 +8C5A8136811E812C811881328148814C815381748159815A817181608169817C +817D816D8167584D5AB58188818281916ED581A381AA81CC672681CA81BB0000 +EC +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000081C181A66B246B376B396B436B466B5998D198D298D398D598D998DA6BB3 +5F406BC289F365909F51659365BC65C665C465C365CC65CE65D265D67080709C +7096709D70BB70C070B770AB70B170E870CA711071137116712F71317173715C +716871457172714A7178717A719871B371B571A871A071E071D471E771F9721D +7228706C7118716671B9623E623D624362486249793B794079467949795B795C +7953795A796279577960796F7967797A7985798A799A79A779B35FD15FD00000 +ED +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000603C605D605A606760416059606360AB6106610D615D61A9619D61CB61D1 +62068080807F6C936CF66DFC77F677F87800780978177818781165AB782D781C +781D7839783A783B781F783C7825782C78237829784E786D7856785778267850 +7847784C786A789B7893789A7887789C78A178A378B278B978A578D478D978C9 +78EC78F2790578F479137924791E79349F9B9EF99EFB9EFC76F17704770D76F9 +77077708771A77227719772D7726773577387750775177477743775A77680000 +EE +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000077627765777F778D777D7780778C7791779F77A077B077B577BD753A7540 +754E754B7548755B7572757975837F587F617F5F8A487F687F747F717F797F81 +7F7E76CD76E58832948594869487948B948A948C948D948F9490949494979495 +949A949B949C94A394A494AB94AA94AD94AC94AF94B094B294B494B694B794B8 +94B994BA94BC94BD94BF94C494C894C994CA94CB94CC94CD94CE94D094D194D2 +94D594D694D794D994D894DB94DE94DF94E094E294E494E594E794E894EA0000 +EF +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000094E994EB94EE94EF94F394F494F594F794F994FC94FD94FF950395029506 +95079509950A950D950E950F951295139514951595169518951B951D951E951F +9522952A952B9529952C953195329534953695379538953C953E953F95429535 +9544954595469549954C954E954F9552955395549556955795589559955B955E +955F955D95619562956495659566956795689569956A956B956C956F95719572 +9573953A77E777EC96C979D579ED79E379EB7A065D477A037A027A1E7A140000 +F0 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00007A397A377A519ECF99A57A707688768E7693769976A474DE74E0752C9E20 +9E229E289E299E2A9E2B9E2C9E329E319E369E389E379E399E3A9E3E9E419E42 +9E449E469E479E489E499E4B9E4C9E4E9E519E559E579E5A9E5B9E5C9E5E9E63 +9E669E679E689E699E6A9E6B9E6C9E719E6D9E7375927594759675A0759D75AC +75A375B375B475B875C475B175B075C375C275D675CD75E375E875E675E475EB +75E7760375F175FC75FF761076007605760C7617760A76257618761576190000 +F1 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000761B763C762276207640762D7630763F76357643763E7633764D765E7654 +765C7656766B766F7FCA7AE67A787A797A807A867A887A957AA67AA07AAC7AA8 +7AAD7AB3886488698872887D887F888288A288C688B788BC88C988E288CE88E3 +88E588F1891A88FC88E888FE88F0892189198913891B890A8934892B89368941 +8966897B758B80E576B276B477DC801280148016801C80208022802580268027 +802980288031800B803580438046804D80528069807189839878988098830000 +F2 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00009889988C988D988F9894989A989B989E989F98A198A298A598A6864D8654 +866C866E867F867A867C867B86A8868D868B86AC869D86A786A386AA869386A9 +86B686C486B586CE86B086BA86B186AF86C986CF86B486E986F186F286ED86F3 +86D0871386DE86F486DF86D886D18703870786F88708870A870D87098723873B +871E8725872E871A873E87488734873187298737873F87828722877D877E877B +87608770874C876E878B87538763877C876487598765879387AF87A887D20000 +F3 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000087C68788878587AD8797878387AB87E587AC87B587B387CB87D387BD87D1 +87C087CA87DB87EA87E087EE8816881387FE880A881B88218839883C7F367F42 +7F447F4582107AFA7AFD7B087B037B047B157B0A7B2B7B0F7B477B387B2A7B19 +7B2E7B317B207B257B247B337B3E7B1E7B587B5A7B457B757B4C7B5D7B607B6E +7B7B7B627B727B717B907BA67BA77BB87BAC7B9D7BA87B857BAA7B9C7BA27BAB +7BB47BD17BC17BCC7BDD7BDA7BE57BE67BEA7C0C7BFE7BFC7C0F7C167C0B0000 +F4 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00007C1F7C2A7C267C387C417C4081FE82018202820481EC8844822182228223 +822D822F8228822B8238823B82338234823E82448249824B824F825A825F8268 +887E8885888888D888DF895E7F9D7F9F7FA77FAF7FB07FB27C7C65497C917C9D +7C9C7C9E7CA27CB27CBC7CBD7CC17CC77CCC7CCD7CC87CC57CD77CE8826E66A8 +7FBF7FCE7FD57FE57FE17FE67FE97FEE7FF37CF87D777DA67DAE7E477E9B9EB8 +9EB48D738D848D948D918DB18D678D6D8C478C49914A9150914E914F91640000 +F5 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00009162916191709169916F917D917E917291749179918C91859190918D9191 +91A291A391AA91AD91AE91AF91B591B491BA8C559E7E8DB88DEB8E058E598E69 +8DB58DBF8DBC8DBA8DC48DD68DD78DDA8DDE8DCE8DCF8DDB8DC68DEC8DF78DF8 +8DE38DF98DFB8DE48E098DFD8E148E1D8E1F8E2C8E2E8E238E2F8E3A8E408E39 +8E358E3D8E318E498E418E428E518E528E4A8E708E768E7C8E6F8E748E858E8F +8E948E908E9C8E9E8C788C828C8A8C858C988C94659B89D689DE89DA89DC0000 +F6 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000089E589EB89EF8A3E8B26975396E996F396EF970697019708970F970E972A +972D9730973E9F809F839F859F869F879F889F899F8A9F8C9EFE9F0B9F0D96B9 +96BC96BD96CE96D277BF96E0928E92AE92C8933E936A93CA938F943E946B9C7F +9C829C859C869C879C887A239C8B9C8E9C909C919C929C949C959C9A9C9B9C9E +9C9F9CA09CA19CA29CA39CA59CA69CA79CA89CA99CAB9CAD9CAE9CB09CB19CB2 +9CB39CB49CB59CB69CB79CBA9CBB9CBC9CBD9CC49CC59CC69CC79CCA9CCB0000 +F7 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00009CCC9CCD9CCE9CCF9CD09CD39CD49CD59CD79CD89CD99CDC9CDD9CDF9CE2 +977C978597919792979497AF97AB97A397B297B49AB19AB09AB79E589AB69ABA +9ABC9AC19AC09AC59AC29ACB9ACC9AD19B459B439B479B499B489B4D9B5198E8 +990D992E995599549ADF9AE19AE69AEF9AEB9AFB9AED9AF99B089B0F9B139B1F +9B239EBD9EBE7E3B9E829E879E889E8B9E9293D69E9D9E9F9EDB9EDC9EDD9EE0 +9EDF9EE29EE99EE79EE59EEA9EEF9F229F2C9F2F9F399F379F3D9F3E9F440000 diff --git a/env/tcl/tcl8.6/encoding/euc-jp.enc b/env/tcl/tcl8.6/encoding/euc-jp.enc new file mode 100644 index 0000000..db56c88 --- /dev/null +++ b/env/tcl/tcl8.6/encoding/euc-jp.enc @@ -0,0 +1,1353 @@ +# Encoding file: euc-jp, multi-byte +M +003F 0 79 +00 +0000000100020003000400050006000700080009000A000B000C000D000E000F +0010001100120013001400150016001700180019001A001B001C001D001E001F +0020002100220023002400250026002700280029002A002B002C002D002E002F +0030003100320033003400350036003700380039003A003B003C003D003E003F +0040004100420043004400450046004700480049004A004B004C004D004E004F +0050005100520053005400550056005700580059005A005B005C005D005E005F +0060006100620063006400650066006700680069006A006B006C006D006E006F +0070007100720073007400750076007700780079007A007B007C007D007E007F +0080008100820083008400850086008700880089008A008B008C008D0000008F +0090009100920093009400950096009700980099009A009B009C009D009E009F +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +8E +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000FF61FF62FF63FF64FF65FF66FF67FF68FF69FF6AFF6BFF6CFF6DFF6EFF6F +FF70FF71FF72FF73FF74FF75FF76FF77FF78FF79FF7AFF7BFF7CFF7DFF7EFF7F +FF80FF81FF82FF83FF84FF85FF86FF87FF88FF89FF8AFF8BFF8CFF8DFF8EFF8F +FF90FF91FF92FF93FF94FF95FF96FF97FF98FF99FF9AFF9BFF9CFF9DFF9EFF9F +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +A1 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000300030013002FF0CFF0E30FBFF1AFF1BFF1FFF01309B309C00B4FF4000A8 +FF3EFFE3FF3F30FD30FE309D309E30034EDD30053006300730FC20152010FF0F +FF3C301C2016FF5C2026202520182019201C201DFF08FF0930143015FF3BFF3D +FF5BFF5D30083009300A300B300C300D300E300F30103011FF0B221200B100D7 +00F7FF1D2260FF1CFF1E22662267221E22342642264000B0203220332103FFE5 +FF0400A200A3FF05FF03FF06FF0AFF2000A72606260525CB25CF25CE25C70000 +A2 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000025C625A125A025B325B225BD25BC203B3012219221902191219330130000 +00000000000000000000000000000000000000002208220B2286228722822283 +222A2229000000000000000000000000000000002227222800AC21D221D42200 +220300000000000000000000000000000000000000000000222022A523122202 +220722612252226A226B221A223D221D2235222B222C00000000000000000000 +00000000212B2030266F266D266A2020202100B6000000000000000025EF0000 +A3 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +FF10FF11FF12FF13FF14FF15FF16FF17FF18FF19000000000000000000000000 +0000FF21FF22FF23FF24FF25FF26FF27FF28FF29FF2AFF2BFF2CFF2DFF2EFF2F +FF30FF31FF32FF33FF34FF35FF36FF37FF38FF39FF3A00000000000000000000 +0000FF41FF42FF43FF44FF45FF46FF47FF48FF49FF4AFF4BFF4CFF4DFF4EFF4F +FF50FF51FF52FF53FF54FF55FF56FF57FF58FF59FF5A00000000000000000000 +A4 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000304130423043304430453046304730483049304A304B304C304D304E304F +3050305130523053305430553056305730583059305A305B305C305D305E305F +3060306130623063306430653066306730683069306A306B306C306D306E306F +3070307130723073307430753076307730783079307A307B307C307D307E307F +3080308130823083308430853086308730883089308A308B308C308D308E308F +3090309130923093000000000000000000000000000000000000000000000000 +A5 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000030A130A230A330A430A530A630A730A830A930AA30AB30AC30AD30AE30AF +30B030B130B230B330B430B530B630B730B830B930BA30BB30BC30BD30BE30BF +30C030C130C230C330C430C530C630C730C830C930CA30CB30CC30CD30CE30CF +30D030D130D230D330D430D530D630D730D830D930DA30DB30DC30DD30DE30DF +30E030E130E230E330E430E530E630E730E830E930EA30EB30EC30ED30EE30EF +30F030F130F230F330F430F530F6000000000000000000000000000000000000 +A6 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000039103920393039403950396039703980399039A039B039C039D039E039F +03A003A103A303A403A503A603A703A803A90000000000000000000000000000 +000003B103B203B303B403B503B603B703B803B903BA03BB03BC03BD03BE03BF +03C003C103C303C403C503C603C703C803C90000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +A7 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000004100411041204130414041504010416041704180419041A041B041C041D +041E041F0420042104220423042404250426042704280429042A042B042C042D +042E042F00000000000000000000000000000000000000000000000000000000 +000004300431043204330434043504510436043704380439043A043B043C043D +043E043F0440044104420443044404450446044704480449044A044B044C044D +044E044F00000000000000000000000000000000000000000000000000000000 +A8 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000025002502250C251025182514251C252C25242534253C25012503250F2513 +251B251725232533252B253B254B2520252F25282537253F251D253025252538 +2542000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +B0 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00004E9C55165A03963F54C0611B632859F690228475831C7A5060AA63E16E25 +65ED846682A69BF56893572765A162715B9B59D0867B98F47D627DBE9B8E6216 +7C9F88B75B895EB563096697684895C7978D674F4EE54F0A4F4D4F9D504956F2 +593759D45A015C0960DF610F61706613690570BA754F757079FB7DAD7DEF80C3 +840E88638B029055907A533B4E954EA557DF80B290C178EF4E0058F16EA29038 +7A328328828B9C2F5141537054BD54E156E059FB5F1598F26DEB80E4852D0000 +B1 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00009662967096A097FB540B53F35B8770CF7FBD8FC296E8536F9D5C7ABA4E11 +789381FC6E26561855046B1D851A9C3B59E553A96D6674DC958F56424E91904B +96F2834F990C53E155B65B305F71662066F368046C386CF36D29745B76C87A4E +983482F1885B8A6092ED6DB275AB76CA99C560A68B018D8A95B2698E53AD5186 +5712583059445BB45EF6602863A963F46CBF6F14708E7114715971D5733F7E01 +827682D185979060925B9D1B586965BC6C5A752551F9592E59655F805FDC0000 +B2 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000062BC65FA6A2A6B276BB4738B7FC189569D2C9D0E9EC45CA16C96837B5104 +5C4B61B681C6687672614E594FFA537860696E297A4F97F34E0B53164EEE4F55 +4F3D4FA14F7352A053EF5609590F5AC15BB65BE179D16687679C67B66B4C6CB3 +706B73C2798D79BE7A3C7B8782B182DB8304837783EF83D387668AB256298CA8 +8FE6904E971E868A4FC45CE862117259753B81E582BD86FE8CC096C5991399D5 +4ECB4F1A89E356DE584A58CA5EFB5FEB602A6094606261D0621262D065390000 +B3 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00009B41666668B06D777070754C76867D7582A587F9958B968E8C9D51F152BE +591654B35BB35D16616869826DAF788D84CB88578A7293A79AB86D6C99A886D9 +57A367FF86CE920E5283568754045ED362E164B9683C68386BBB737278BA7A6B +899A89D28D6B8F0390ED95A3969497695B665CB3697D984D984E639B7B206A2B +6A7F68B69C0D6F5F5272559D607062EC6D3B6E076ED1845B89108F444E149C39 +53F6691B6A3A9784682A515C7AC384B291DC938C565B9D286822830584310000 +B4 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00007CA5520882C574E64E7E4F8351A05BD2520A52D852E75DFB559A582A59E6 +5B8C5B985BDB5E725E7960A3611F616361BE63DB656267D1685368FA6B3E6B53 +6C576F226F976F4574B0751876E3770B7AFF7BA17C217DE97F367FF0809D8266 +839E89B38ACC8CAB908494519593959195A2966597D3992882184E38542B5CB8 +5DCC73A9764C773C5CA97FEB8D0B96C19811985498584F014F0E5371559C5668 +57FA59475B095BC45C905E0C5E7E5FCC63EE673A65D765E2671F68CB68C40000 +B5 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00006A5F5E306BC56C176C7D757F79485B637A007D005FBD898F8A188CB48D77 +8ECC8F1D98E29A0E9B3C4E80507D510059935B9C622F628064EC6B3A72A07591 +79477FA987FB8ABC8B7063AC83CA97A05409540355AB68546A588A7078276775 +9ECD53745BA2811A865090064E184E454EC74F1153CA54385BAE5F1360256551 +673D6C426C726CE3707874037A767AAE7B087D1A7CFE7D6665E7725B53BB5C45 +5DE862D262E063196E20865A8A318DDD92F86F0179A69B5A4EA84EAB4EAC0000 +B6 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00004F9B4FA050D151477AF6517151F653545321537F53EB55AC58835CE15F37 +5F4A602F6050606D631F65596A4B6CC172C272ED77EF80F881058208854E90F7 +93E197FF99579A5A4EF051DD5C2D6681696D5C4066F26975738968507C8150C5 +52E457475DFE932665A46B236B3D7434798179BD7B4B7DCA82B983CC887F895F +8B398FD191D1541F92804E5D503653E5533A72D7739677E982E68EAF99C699C8 +99D25177611A865E55B07A7A50765BD3904796854E326ADB91E75C515C480000 +B7 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000063987A9F6C9397748F617AAA718A96887C8268177E706851936C52F2541B +85AB8A137FA48ECD90E15366888879414FC250BE521151445553572D73EA578B +59515F625F8460756176616761A963B2643A656C666F68426E1375667A3D7CFB +7D4C7D997E4B7F6B830E834A86CD8A088A638B668EFD981A9D8F82B88FCE9BE8 +5287621F64836FC09699684150916B206C7A6F547A747D5088408A2367084EF6 +503950265065517C5238526355A7570F58055ACC5EFA61B261F862F363720000 +B8 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000691C6A29727D72AC732E7814786F7D79770C80A9898B8B198CE28ED29063 +9375967A98559A139E785143539F53B35E7B5F266E1B6E90738473FE7D438237 +8A008AFA96504E4E500B53E4547C56FA59D15B645DF15EAB5F276238654567AF +6E5672D07CCA88B480A180E183F0864E8A878DE8923796C798679F134E944E92 +4F0D53485449543E5A2F5F8C5FA1609F68A76A8E745A78818A9E8AA48B779190 +4E5E9BC94EA44F7C4FAF501950165149516C529F52B952FE539A53E354110000 +B9 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000540E5589575157A2597D5B545B5D5B8F5DE55DE75DF75E785E835E9A5EB7 +5F186052614C629762D863A7653B6602664366F4676D6821689769CB6C5F6D2A +6D696E2F6E9D75327687786C7A3F7CE07D057D187D5E7DB18015800380AF80B1 +8154818F822A8352884C88618B1B8CA28CFC90CA91759271783F92FC95A4964D +980599999AD89D3B525B52AB53F7540858D562F76FE08C6A8F5F9EB9514B523B +544A56FD7A4091779D609ED273446F09817075115FFD60DA9AA872DB8FBC0000 +BA +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00006B6498034ECA56F0576458BE5A5A606861C7660F6606683968B16DF775D5 +7D3A826E9B424E9B4F5053C955065D6F5DE65DEE67FB6C99747378028A509396 +88DF57505EA7632B50B550AC518D670054C9585E59BB5BB05F69624D63A1683D +6B736E08707D91C7728078157826796D658E7D3083DC88C18F09969B52645728 +67507F6A8CA151B45742962A583A698A80B454B25D0E57FC78959DFA4F5C524A +548B643E6628671467F57A847B567D22932F685C9BAD7B395319518A52370000 +BB +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00005BDF62F664AE64E6672D6BBA85A996D176909BD6634C93069BAB76BF6652 +4E09509853C25C7160E864926563685F71E673CA75237B977E8286958B838CDB +9178991065AC66AB6B8B4ED54ED44F3A4F7F523A53F853F255E356DB58EB59CB +59C959FF5B505C4D5E025E2B5FD7601D6307652F5B5C65AF65BD65E8679D6B62 +6B7B6C0F7345794979C17CF87D197D2B80A2810281F389968A5E8A698A668A8C +8AEE8CC78CDC96CC98FC6B6F4E8B4F3C4F8D51505B575BFA6148630166420000 +BC +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00006B216ECB6CBB723E74BD75D478C1793A800C803381EA84948F9E6C509E7F +5F0F8B589D2B7AFA8EF85B8D96EB4E0353F157F759315AC95BA460896E7F6F06 +75BE8CEA5B9F85007BE0507267F4829D5C61854A7E1E820E51995C0463688D66 +659C716E793E7D1780058B1D8ECA906E86C790AA501F52FA5C3A6753707C7235 +914C91C8932B82E55BC25F3160F94E3B53D65B88624B67316B8A72E973E07A2E +816B8DA391529996511253D7546A5BFF63886A397DAC970056DA53CE54680000 +BD +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00005B975C315DDE4FEE610162FE6D3279C079CB7D427E4D7FD281ED821F8490 +884689728B908E748F2F9031914B916C96C6919C4EC04F4F514553415F93620E +67D46C416E0B73637E2691CD928353D459195BBF6DD1795D7E2E7C9B587E719F +51FA88538FF04FCA5CFB662577AC7AE3821C99FF51C65FAA65EC696F6B896DF3 +6E966F6476FE7D145DE190759187980651E6521D6240669166D96E1A5EB67DD2 +7F7266F885AF85F78AF852A953D959735E8F5F90605592E4966450B7511F0000 +BE +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000052DD5320534753EC54E8554655315617596859BE5A3C5BB55C065C0F5C11 +5C1A5E845E8A5EE05F70627F628462DB638C63776607660C662D6676677E68A2 +6A1F6A356CBC6D886E096E58713C7126716775C77701785D7901796579F07AE0 +7B117CA77D39809683D6848B8549885D88F38A1F8A3C8A548A738C618CDE91A4 +9266937E9418969C97984E0A4E084E1E4E575197527057CE583458CC5B225E38 +60C564FE676167566D4472B675737A6384B88B7291B89320563157F498FE0000 +BF +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000062ED690D6B9671ED7E548077827289E698DF87558FB15C3B4F384FE14FB5 +55075A205BDD5BE95FC3614E632F65B0664B68EE699B6D786DF1753375B9771F +795E79E67D3381E382AF85AA89AA8A3A8EAB8F9B903291DD97074EBA4EC15203 +587558EC5C0B751A5C3D814E8A0A8FC59663976D7B258ACF9808916256F353A8 +9017543957825E2563A86C34708A77617C8B7FE088709042915493109318968F +745E9AC45D075D69657067A28DA896DB636E6749691983C5981796C088FE0000 +C0 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00006F84647A5BF84E16702C755D662F51C4523652E259D35F8160276210653F +6574661F667468F268166B636E057272751F76DB7CBE805658F088FD897F8AA0 +8A938ACB901D91929752975965897A0E810696BB5E2D60DC621A65A566146790 +77F37A4D7C4D7E3E810A8CAC8D648DE18E5F78A9520762D963A5644262988A2D +7A837BC08AAC96EA7D76820C87494ED95148534353605BA35C025C165DDD6226 +624764B0681368346CC96D456D1767D36F5C714E717D65CB7A7F7BAD7DDA0000 +C1 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00007E4A7FA8817A821B823985A68A6E8CCE8DF59078907792AD929195839BAE +524D55846F387136516879857E5581B37CCE564C58515CA863AA66FE66FD695A +72D9758F758E790E795679DF7C977D207D4486078A34963B90619F2050E75275 +53CC53E2500955AA58EE594F723D5B8B5C64531D60E360F3635C6383633F63BB +64CD65E966F95DE369CD69FD6F1571E54E8975E976F87A937CDF7DCF7D9C8061 +83498358846C84BC85FB88C58D709001906D9397971C9A1250CF5897618E0000 +C2 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000081D385358D0890204FC3507452475373606F6349675F6E2C8DB3901F4FD7 +5C5E8CCA65CF7D9A53528896517663C35B585B6B5C0A640D6751905C4ED6591A +592A6C708A51553E581559A560F0625367C182356955964099C49A284F535806 +5BFE80105CB15E2F5F856020614B623466FF6CF06EDE80CE817F82D4888B8CB8 +9000902E968A9EDB9BDB4EE353F059277B2C918D984C9DF96EDD702753535544 +5B856258629E62D36CA26FEF74228A1794386FC18AFE833851E786F853EA0000 +C3 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000053E94F4690548FB0596A81315DFD7AEA8FBF68DA8C3772F89C486A3D8AB0 +4E3953585606576662C563A265E66B4E6DE16E5B70AD77ED7AEF7BAA7DBB803D +80C686CB8A95935B56E358C75F3E65AD66966A806BB575378AC7502477E55730 +5F1B6065667A6C6075F47A1A7F6E81F48718904599B37BC9755C7AF97B5184C4 +901079E97A9283365AE177404E2D4EF25B995FE062BD663C67F16CE8866B8877 +8A3B914E92F399D06A177026732A82E784578CAF4E01514651CB558B5BF50000 +C4 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00005E165E335E815F145F355F6B5FB461F2631166A2671D6F6E7252753A773A +80748139817887768ABF8ADC8D858DF3929A957798029CE552C5635776F46715 +6C8873CD8CC393AE96736D25589C690E69CC8FFD939A75DB901A585A680263B4 +69FB4F436F2C67D88FBB85267DB49354693F6F70576A58F75B2C7D2C722A540A +91E39DB44EAD4F4E505C507552438C9E544858245B9A5E1D5E955EAD5EF75F1F +608C62B5633A63D068AF6C407887798E7A0B7DE082478A028AE68E4490130000 +C5 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000090B8912D91D89F0E6CE5645864E265756EF476847B1B906993D16EBA54F2 +5FB964A48F4D8FED92445178586B59295C555E976DFB7E8F751C8CBC8EE2985B +70B94F1D6BBF6FB1753096FB514E54105835585759AC5C605F926597675C6E21 +767B83DF8CED901490FD934D7825783A52AA5EA6571F597460125012515A51AC +51CD520055105854585859575B955CF65D8B60BC6295642D6771684368BC68DF +76D76DD86E6F6D9B706F71C85F5375D879777B497B547B527CD67D7152300000 +C6 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00008463856985E48A0E8B048C468E0F9003900F94199676982D9A3095D850CD +52D5540C58025C0E61A7649E6D1E77B37AE580F48404905392855CE09D07533F +5F975FB36D9C7279776379BF7BE46BD272EC8AAD68036A6151F87A8169345C4A +9CF682EB5BC59149701E56785C6F60C765666C8C8C5A90419813545166C7920D +594890A351854E4D51EA85998B0E7058637A934B696299B47E04757753576960 +8EDF96E36C5D4E8C5C3C5F108FE953028CD1808986795EFF65E54E7351650000 +C7 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000059825C3F97EE4EFB598A5FCD8A8D6FE179B079625BE78471732B71B15E74 +5FF5637B649A71C37C984E435EFC4E4B57DC56A260A96FC37D0D80FD813381BF +8FB2899786A45DF4628A64AD898767776CE26D3E743678345A467F7582AD99AC +4FF35EC362DD63926557676F76C3724C80CC80BA8F29914D500D57F95A926885 +6973716472FD8CB758F28CE0966A9019877F79E477E784294F2F5265535A62CD +67CF6CCA767D7B947C95823685848FEB66DD6F2072067E1B83AB99C19EA60000 +C8 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000051FD7BB178727BB880877B486AE85E61808C75517560516B92626E8C767A +91979AEA4F107F70629C7B4F95A59CE9567A585986E496BC4F345224534A53CD +53DB5E06642C6591677F6C3E6C4E724872AF73ED75547E41822C85E98CA97BC4 +91C67169981298EF633D6669756A76E478D0854386EE532A5351542659835E87 +5F7C60B26249627962AB65906BD46CCC75B276AE789179D87DCB7F7780A588AB +8AB98CBB907F975E98DB6A0B7C3850995C3E5FAE67876BD8743577097F8E0000 +C9 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00009F3B67CA7A175339758B9AED5F66819D83F180985F3C5FC575627B46903C +686759EB5A9B7D10767E8B2C4FF55F6A6A196C376F0274E2796888688A558C79 +5EDF63CF75C579D282D7932892F2849C86ED9C2D54C15F6C658C6D5C70158CA7 +8CD3983B654F74F64E0D4ED857E0592B5A665BCC51A85E035E9C601662766577 +65A7666E6D6E72367B268150819A82998B5C8CA08CE68D74961C96444FAE64AB +6B66821E8461856A90E85C01695398A8847A85574F0F526F5FA95E45670D0000 +CA +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000798F8179890789866DF55F1762556CB84ECF72699B925206543B567458B3 +61A4626E711A596E7C897CDE7D1B96F06587805E4E194F75517558405E635E73 +5F0A67C44E26853D9589965B7C73980150FB58C1765678A7522577A585117B86 +504F590972477BC77DE88FBA8FD4904D4FBF52C95A295F0197AD4FDD821792EA +570363556B69752B88DC8F147A4252DF58936155620A66AE6BCD7C3F83E95023 +4FF853055446583159495B9D5CF05CEF5D295E9662B16367653E65B9670B0000 +CB +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00006CD56CE170F978327E2B80DE82B3840C84EC870289128A2A8C4A90A692D2 +98FD9CF39D6C4E4F4EA1508D5256574A59A85E3D5FD85FD9623F66B4671B67D0 +68D251927D2180AA81A88B008C8C8CBF927E96325420982C531750D5535C58A8 +64B26734726777667A4691E652C36CA16B8658005E4C5954672C7FFB51E176C6 +646978E89B549EBB57CB59B96627679A6BCE54E969D95E55819C67959BAA67FE +9C52685D4EA64FE353C862B9672B6CAB8FC44FAD7E6D9EBF4E0761626E800000 +CC +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00006F2B85135473672A9B455DF37B955CAC5BC6871C6E4A84D17A1481085999 +7C8D6C11772052D959227121725F77DB97279D61690B5A7F5A1851A5540D547D +660E76DF8FF792989CF459EA725D6EC5514D68C97DBF7DEC97629EBA64786A21 +830259845B5F6BDB731B76F27DB280178499513267289ED976EE676252FF9905 +5C24623B7C7E8CB0554F60B67D0B958053014E5F51B6591C723A803691CE5F25 +77E253845F797D0485AC8A338E8D975667F385AE9453610961086CB976520000 +CD +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00008AED8F38552F4F51512A52C753CB5BA55E7D60A0618263D6670967DA6E67 +6D8C733673377531795088D58A98904A909190F596C4878D59154E884F594E0E +8A898F3F981050AD5E7C59965BB95EB863DA63FA64C166DC694A69D86D0B6EB6 +719475287AAF7F8A8000844984C989818B218E0A9065967D990A617E62916B32 +6C836D747FCC7FFC6DC07F8587BA88F8676583B1983C96F76D1B7D61843D916A +4E7153755D506B046FEB85CD862D89A75229540F5C65674E68A8740674830000 +CE +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000075E288CF88E191CC96E296785F8B73877ACB844E63A0756552896D416E9C +74097559786B7C9296867ADC9F8D4FB6616E65C5865C4E864EAE50DA4E2151CC +5BEE659968816DBC731F764277AD7A1C7CE7826F8AD2907C91CF96759818529B +7DD1502B539867976DCB71D0743381E88F2A96A39C579E9F746058416D997D2F +985E4EE44F364F8B51B752B15DBA601C73B2793C82D3923496B796F6970A9E97 +9F6266A66B74521752A370C888C25EC9604B61906F2371497C3E7DF4806F0000 +CF +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000084EE9023932C54429B6F6AD370898CC28DEF973252B45A415ECA5F046717 +697C69946D6A6F0F726272FC7BED8001807E874B90CE516D9E937984808B9332 +8AD6502D548C8A716B6A8CC4810760D167A09DF24E994E989C108A6B85C18568 +69006E7E78978155000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +D0 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00005F0C4E104E154E2A4E314E364E3C4E3F4E424E564E584E824E858C6B4E8A +82125F0D4E8E4E9E4E9F4EA04EA24EB04EB34EB64ECE4ECD4EC44EC64EC24ED7 +4EDE4EED4EDF4EF74F094F5A4F304F5B4F5D4F574F474F764F884F8F4F984F7B +4F694F704F914F6F4F864F9651184FD44FDF4FCE4FD84FDB4FD14FDA4FD04FE4 +4FE5501A50285014502A502550054F1C4FF650215029502C4FFE4FEF50115006 +504350476703505550505048505A5056506C50785080509A508550B450B20000 +D1 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000050C950CA50B350C250D650DE50E550ED50E350EE50F950F5510951015102 +511651155114511A5121513A5137513C513B513F51405152514C515451627AF8 +5169516A516E5180518256D8518C5189518F519151935195519651A451A651A2 +51A951AA51AB51B351B151B251B051B551BD51C551C951DB51E0865551E951ED +51F051F551FE5204520B5214520E5227522A522E52335239524F5244524B524C +525E5254526A527452695273527F527D528D529452925271528852918FA80000 +D2 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00008FA752AC52AD52BC52B552C152CD52D752DE52E352E698ED52E052F352F5 +52F852F9530653087538530D5310530F5315531A5323532F5331533353385340 +534653454E175349534D51D6535E5369536E5918537B53775382539653A053A6 +53A553AE53B053B653C37C1296D953DF66FC71EE53EE53E853ED53FA5401543D +5440542C542D543C542E54365429541D544E548F5475548E545F547154775470 +5492547B5480547654845490548654C754A254B854A554AC54C454C854A80000 +D3 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000054AB54C254A454BE54BC54D854E554E6550F551454FD54EE54ED54FA54E2 +553955405563554C552E555C55455556555755385533555D5599558054AF558A +559F557B557E5598559E55AE557C558355A9558755A855DA55C555DF55C455DC +55E455D4561455F7561655FE55FD561B55F9564E565071DF5634563656325638 +566B5664562F566C566A56865680568A56A05694568F56A556AE56B656B456C2 +56BC56C156C356C056C856CE56D156D356D756EE56F9570056FF570457090000 +D4 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00005708570B570D57135718571655C7571C572657375738574E573B5740574F +576957C057885761577F5789579357A057B357A457AA57B057C357C657D457D2 +57D3580A57D657E3580B5819581D587258215862584B58706BC05852583D5879 +588558B9589F58AB58BA58DE58BB58B858AE58C558D358D158D758D958D858E5 +58DC58E458DF58EF58FA58F958FB58FC58FD5902590A5910591B68A65925592C +592D59325938593E7AD259555950594E595A5958596259605967596C59690000 +D5 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000059785981599D4F5E4FAB59A359B259C659E859DC598D59D959DA5A255A1F +5A115A1C5A095A1A5A405A6C5A495A355A365A625A6A5A9A5ABC5ABE5ACB5AC2 +5ABD5AE35AD75AE65AE95AD65AFA5AFB5B0C5B0B5B165B325AD05B2A5B365B3E +5B435B455B405B515B555B5A5B5B5B655B695B705B735B755B7865885B7A5B80 +5B835BA65BB85BC35BC75BC95BD45BD05BE45BE65BE25BDE5BE55BEB5BF05BF6 +5BF35C055C075C085C0D5C135C205C225C285C385C395C415C465C4E5C530000 +D6 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00005C505C4F5B715C6C5C6E4E625C765C795C8C5C915C94599B5CAB5CBB5CB6 +5CBC5CB75CC55CBE5CC75CD95CE95CFD5CFA5CED5D8C5CEA5D0B5D155D175D5C +5D1F5D1B5D115D145D225D1A5D195D185D4C5D525D4E5D4B5D6C5D735D765D87 +5D845D825DA25D9D5DAC5DAE5DBD5D905DB75DBC5DC95DCD5DD35DD25DD65DDB +5DEB5DF25DF55E0B5E1A5E195E115E1B5E365E375E445E435E405E4E5E575E54 +5E5F5E625E645E475E755E765E7A9EBC5E7F5EA05EC15EC25EC85ED05ECF0000 +D7 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00005ED65EE35EDD5EDA5EDB5EE25EE15EE85EE95EEC5EF15EF35EF05EF45EF8 +5EFE5F035F095F5D5F5C5F0B5F115F165F295F2D5F385F415F485F4C5F4E5F2F +5F515F565F575F595F615F6D5F735F775F835F825F7F5F8A5F885F915F875F9E +5F995F985FA05FA85FAD5FBC5FD65FFB5FE45FF85FF15FDD60B35FFF60216060 +601960106029600E6031601B6015602B6026600F603A605A6041606A6077605F +604A6046604D6063604360646042606C606B60596081608D60E76083609A0000 +D8 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00006084609B60966097609260A7608B60E160B860E060D360B45FF060BD60C6 +60B560D8614D6115610660F660F7610060F460FA6103612160FB60F1610D610E +6147613E61286127614A613F613C612C6134613D614261446173617761586159 +615A616B6174616F61656171615F615D6153617561996196618761AC6194619A +618A619161AB61AE61CC61CA61C961F761C861C361C661BA61CB7F7961CD61E6 +61E361F661FA61F461FF61FD61FC61FE620062086209620D620C6214621B0000 +D9 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000621E6221622A622E6230623262336241624E625E6263625B62606268627C +62826289627E62926293629662D46283629462D762D162BB62CF62FF62C664D4 +62C862DC62CC62CA62C262C7629B62C9630C62EE62F163276302630862EF62F5 +6350633E634D641C634F6396638E638063AB637663A3638F6389639F63B5636B +636963BE63E963C063C663E363C963D263F663C4641664346406641364266436 +651D64176428640F6467646F6476644E652A6495649364A564A9648864BC0000 +DA +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000064DA64D264C564C764BB64D864C264F164E7820964E064E162AC64E364EF +652C64F664F464F264FA650064FD6518651C650565246523652B653465356537 +65366538754B654865566555654D6558655E655D65726578658265838B8A659B +659F65AB65B765C365C665C165C465CC65D265DB65D965E065E165F16772660A +660365FB6773663566366634661C664F664466496641665E665D666466676668 +665F6662667066836688668E668966846698669D66C166B966C966BE66BC0000 +DB +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000066C466B866D666DA66E0663F66E666E966F066F566F7670F6716671E6726 +67279738672E673F67366741673867376746675E676067596763676467896770 +67A9677C676A678C678B67A667A1678567B767EF67B467EC67B367E967B867E4 +67DE67DD67E267EE67B967CE67C667E76A9C681E684668296840684D6832684E +68B3682B685968636877687F689F688F68AD6894689D689B68836AAE68B96874 +68B568A068BA690F688D687E690168CA690868D86922692668E1690C68CD0000 +DC +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000068D468E768D569366912690468D768E3692568F968E068EF6928692A691A +6923692168C669796977695C6978696B6954697E696E69396974693D69596930 +6961695E695D6981696A69B269AE69D069BF69C169D369BE69CE5BE869CA69DD +69BB69C369A76A2E699169A0699C699569B469DE69E86A026A1B69FF6B0A69F9 +69F269E76A0569B16A1E69ED6A1469EB6A0A6A126AC16A236A136A446A0C6A72 +6A366A786A476A626A596A666A486A386A226A906A8D6AA06A846AA26AA30000 +DD +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00006A9786176ABB6AC36AC26AB86AB36AAC6ADE6AD16ADF6AAA6ADA6AEA6AFB +6B0586166AFA6B126B169B316B1F6B386B3776DC6B3998EE6B476B436B496B50 +6B596B546B5B6B5F6B616B786B796B7F6B806B846B836B8D6B986B956B9E6BA4 +6BAA6BAB6BAF6BB26BB16BB36BB76BBC6BC66BCB6BD36BDF6BEC6BEB6BF36BEF +9EBE6C086C136C146C1B6C246C236C5E6C556C626C6A6C826C8D6C9A6C816C9B +6C7E6C686C736C926C906CC46CF16CD36CBD6CD76CC56CDD6CAE6CB16CBE0000 +DE +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00006CBA6CDB6CEF6CD96CEA6D1F884D6D366D2B6D3D6D386D196D356D336D12 +6D0C6D636D936D646D5A6D796D596D8E6D956FE46D856DF96E156E0A6DB56DC7 +6DE66DB86DC66DEC6DDE6DCC6DE86DD26DC56DFA6DD96DE46DD56DEA6DEE6E2D +6E6E6E2E6E196E726E5F6E3E6E236E6B6E2B6E766E4D6E1F6E436E3A6E4E6E24 +6EFF6E1D6E386E826EAA6E986EC96EB76ED36EBD6EAF6EC46EB26ED46ED56E8F +6EA56EC26E9F6F416F11704C6EEC6EF86EFE6F3F6EF26F316EEF6F326ECC0000 +DF +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00006F3E6F136EF76F866F7A6F786F816F806F6F6F5B6FF36F6D6F826F7C6F58 +6F8E6F916FC26F666FB36FA36FA16FA46FB96FC66FAA6FDF6FD56FEC6FD46FD8 +6FF16FEE6FDB7009700B6FFA70117001700F6FFE701B701A6F74701D7018701F +7030703E7032705170637099709270AF70F170AC70B870B370AE70DF70CB70DD +70D9710970FD711C711971657155718871667162714C7156716C718F71FB7184 +719571A871AC71D771B971BE71D271C971D471CE71E071EC71E771F571FC0000 +E0 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000071F971FF720D7210721B7228722D722C72307232723B723C723F72407246 +724B72587274727E7282728172877292729672A272A772B972B272C372C672C4 +72CE72D272E272E072E172F972F7500F7317730A731C7316731D7334732F7329 +7325733E734E734F9ED87357736A7368737073787375737B737A73C873B373CE +73BB73C073E573EE73DE74A27405746F742573F87432743A7455743F745F7459 +7441745C746974707463746A7476747E748B749E74A774CA74CF74D473F10000 +E1 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000074E074E374E774E974EE74F274F074F174F874F7750475037505750C750E +750D75157513751E7526752C753C7544754D754A7549755B7546755A75697564 +7567756B756D75787576758675877574758A758975827594759A759D75A575A3 +75C275B375C375B575BD75B875BC75B175CD75CA75D275D975E375DE75FE75FF +75FC760175F075FA75F275F3760B760D7609761F762776207621762276247634 +7630763B764776487646765C76587661766276687669766A7667766C76700000 +E2 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000767276767678767C768076837688768B768E769676937699769A76B076B4 +76B876B976BA76C276CD76D676D276DE76E176E576E776EA862F76FB77087707 +770477297724771E77257726771B773777387747775A7768776B775B7765777F +777E7779778E778B779177A0779E77B077B677B977BF77BC77BD77BB77C777CD +77D777DA77DC77E377EE77FC780C781279267820792A7845788E78747886787C +789A788C78A378B578AA78AF78D178C678CB78D478BE78BC78C578CA78EC0000 +E3 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000078E778DA78FD78F47907791279117919792C792B794079607957795F795A +79557953797A797F798A799D79A79F4B79AA79AE79B379B979BA79C979D579E7 +79EC79E179E37A087A0D7A187A197A207A1F79807A317A3B7A3E7A377A437A57 +7A497A617A627A699F9D7A707A797A7D7A887A977A957A987A967AA97AC87AB0 +7AB67AC57AC47ABF90837AC77ACA7ACD7ACF7AD57AD37AD97ADA7ADD7AE17AE2 +7AE67AED7AF07B027B0F7B0A7B067B337B187B197B1E7B357B287B367B500000 +E4 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00007B7A7B047B4D7B0B7B4C7B457B757B657B747B677B707B717B6C7B6E7B9D +7B987B9F7B8D7B9C7B9A7B8B7B927B8F7B5D7B997BCB7BC17BCC7BCF7BB47BC6 +7BDD7BE97C117C147BE67BE57C607C007C077C137BF37BF77C177C0D7BF67C23 +7C277C2A7C1F7C377C2B7C3D7C4C7C437C547C4F7C407C507C587C5F7C647C56 +7C657C6C7C757C837C907CA47CAD7CA27CAB7CA17CA87CB37CB27CB17CAE7CB9 +7CBD7CC07CC57CC27CD87CD27CDC7CE29B3B7CEF7CF27CF47CF67CFA7D060000 +E5 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00007D027D1C7D157D0A7D457D4B7D2E7D327D3F7D357D467D737D567D4E7D72 +7D687D6E7D4F7D637D937D897D5B7D8F7D7D7D9B7DBA7DAE7DA37DB57DC77DBD +7DAB7E3D7DA27DAF7DDC7DB87D9F7DB07DD87DDD7DE47DDE7DFB7DF27DE17E05 +7E0A7E237E217E127E317E1F7E097E0B7E227E467E667E3B7E357E397E437E37 +7E327E3A7E677E5D7E567E5E7E597E5A7E797E6A7E697E7C7E7B7E837DD57E7D +8FAE7E7F7E887E897E8C7E927E907E937E947E967E8E7E9B7E9C7F387F3A0000 +E6 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00007F457F4C7F4D7F4E7F507F517F557F547F587F5F7F607F687F697F677F78 +7F827F867F837F887F877F8C7F947F9E7F9D7F9A7FA37FAF7FB27FB97FAE7FB6 +7FB88B717FC57FC67FCA7FD57FD47FE17FE67FE97FF37FF998DC80068004800B +801280188019801C80218028803F803B804A804680528058805A805F80628068 +80738072807080768079807D807F808480868085809B8093809A80AD519080AC +80DB80E580D980DD80C480DA80D6810980EF80F1811B81298123812F814B0000 +E7 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000968B8146813E8153815180FC8171816E81658166817481838188818A8180 +818281A0819581A481A3815F819381A981B081B581BE81B881BD81C081C281BA +81C981CD81D181D981D881C881DA81DF81E081E781FA81FB81FE820182028205 +8207820A820D821082168229822B82388233824082598258825D825A825F8264 +82628268826A826B822E827182778278827E828D829282AB829F82BB82AC82E1 +82E382DF82D282F482F382FA8393830382FB82F982DE830682DC830982D90000 +E8 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000833583348316833283318340833983508345832F832B831783188385839A +83AA839F83A283968323838E8387838A837C83B58373837583A0838983A883F4 +841383EB83CE83FD840383D8840B83C183F7840783E083F2840D8422842083BD +8438850683FB846D842A843C855A84848477846B84AD846E848284698446842C +846F8479843584CA846284B984BF849F84D984CD84BB84DA84D084C184C684D6 +84A1852184FF84F485178518852C851F8515851484FC85408563855885480000 +E9 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000085418602854B8555858085A485888591858A85A8856D8594859B85EA8587 +859C8577857E859085C985BA85CF85B985D085D585DD85E585DC85F9860A8613 +860B85FE85FA86068622861A8630863F864D4E558654865F86678671869386A3 +86A986AA868B868C86B686AF86C486C686B086C9882386AB86D486DE86E986EC +86DF86DB86EF8712870687088700870386FB87118709870D86F9870A8734873F +8737873B87258729871A8760875F8778874C874E877487578768876E87590000 +EA +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000087538763876A880587A2879F878287AF87CB87BD87C087D096D687AB87C4 +87B387C787C687BB87EF87F287E0880F880D87FE87F687F7880E87D288118816 +8815882288218831883688398827883B8844884288528859885E8862886B8881 +887E889E8875887D88B5887288828897889288AE889988A2888D88A488B088BF +88B188C388C488D488D888D988DD88F9890288FC88F488E888F28904890C890A +89138943891E8925892A892B89418944893B89368938894C891D8960895E0000 +EB +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000089668964896D896A896F89748977897E89838988898A8993899889A189A9 +89A689AC89AF89B289BA89BD89BF89C089DA89DC89DD89E789F489F88A038A16 +8A108A0C8A1B8A1D8A258A368A418A5B8A528A468A488A7C8A6D8A6C8A628A85 +8A828A848AA88AA18A918AA58AA68A9A8AA38AC48ACD8AC28ADA8AEB8AF38AE7 +8AE48AF18B148AE08AE28AF78ADE8ADB8B0C8B078B1A8AE18B168B108B178B20 +8B3397AB8B268B2B8B3E8B288B418B4C8B4F8B4E8B498B568B5B8B5A8B6B0000 +EC +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00008B5F8B6C8B6F8B748B7D8B808B8C8B8E8B928B938B968B998B9A8C3A8C41 +8C3F8C488C4C8C4E8C508C558C628C6C8C788C7A8C828C898C858C8A8C8D8C8E +8C948C7C8C98621D8CAD8CAA8CBD8CB28CB38CAE8CB68CC88CC18CE48CE38CDA +8CFD8CFA8CFB8D048D058D0A8D078D0F8D0D8D109F4E8D138CCD8D148D168D67 +8D6D8D718D738D818D998DC28DBE8DBA8DCF8DDA8DD68DCC8DDB8DCB8DEA8DEB +8DDF8DE38DFC8E088E098DFF8E1D8E1E8E108E1F8E428E358E308E348E4A0000 +ED +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00008E478E498E4C8E508E488E598E648E608E2A8E638E558E768E728E7C8E81 +8E878E858E848E8B8E8A8E938E918E948E998EAA8EA18EAC8EB08EC68EB18EBE +8EC58EC88ECB8EDB8EE38EFC8EFB8EEB8EFE8F0A8F058F158F128F198F138F1C +8F1F8F1B8F0C8F268F338F3B8F398F458F428F3E8F4C8F498F468F4E8F578F5C +8F628F638F648F9C8F9F8FA38FAD8FAF8FB78FDA8FE58FE28FEA8FEF90878FF4 +90058FF98FFA901190159021900D901E9016900B90279036903590398FF80000 +EE +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000904F905090519052900E9049903E90569058905E9068906F907696A89072 +9082907D90819080908A9089908F90A890AF90B190B590E290E4624890DB9102 +9112911991329130914A9156915891639165916991739172918B9189918291A2 +91AB91AF91AA91B591B491BA91C091C191C991CB91D091D691DF91E191DB91FC +91F591F6921E91FF9214922C92159211925E925792459249926492489295923F +924B9250929C92969293929B925A92CF92B992B792E9930F92FA9344932E0000 +EF +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000093199322931A9323933A9335933B935C9360937C936E935693B093AC93AD +939493B993D693D793E893E593D893C393DD93D093C893E4941A941494139403 +940794109436942B94359421943A944194529444945B94609462945E946A9229 +947094759477947D945A947C947E9481947F95829587958A9594959695989599 +95A095A895A795AD95BC95BB95B995BE95CA6FF695C395CD95CC95D595D495D6 +95DC95E195E595E296219628962E962F9642964C964F964B9677965C965E0000 +F0 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000965D965F96669672966C968D96989695969796AA96A796B196B296B096B4 +96B696B896B996CE96CB96C996CD894D96DC970D96D596F99704970697089713 +970E9711970F971697199724972A97309739973D973E97449746974897429749 +975C976097649766976852D2976B977197799785977C9781977A9786978B978F +9790979C97A897A697A397B397B497C397C697C897CB97DC97ED9F4F97F27ADF +97F697F5980F980C9838982498219837983D9846984F984B986B986F98700000 +F1 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000098719874987398AA98AF98B198B698C498C398C698E998EB990399099912 +991499189921991D991E99249920992C992E993D993E9942994999459950994B +99519952994C99559997999899A599AD99AE99BC99DF99DB99DD99D899D199ED +99EE99F199F299FB99F89A019A0F9A0599E29A199A2B9A379A459A429A409A43 +9A3E9A559A4D9A5B9A579A5F9A629A659A649A699A6B9A6A9AAD9AB09ABC9AC0 +9ACF9AD19AD39AD49ADE9ADF9AE29AE39AE69AEF9AEB9AEE9AF49AF19AF70000 +F2 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00009AFB9B069B189B1A9B1F9B229B239B259B279B289B299B2A9B2E9B2F9B32 +9B449B439B4F9B4D9B4E9B519B589B749B939B839B919B969B979B9F9BA09BA8 +9BB49BC09BCA9BB99BC69BCF9BD19BD29BE39BE29BE49BD49BE19C3A9BF29BF1 +9BF09C159C149C099C139C0C9C069C089C129C0A9C049C2E9C1B9C259C249C21 +9C309C479C329C469C3E9C5A9C609C679C769C789CE79CEC9CF09D099D089CEB +9D039D069D2A9D269DAF9D239D1F9D449D159D129D419D3F9D3E9D469D480000 +F3 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00009D5D9D5E9D649D519D509D599D729D899D879DAB9D6F9D7A9D9A9DA49DA9 +9DB29DC49DC19DBB9DB89DBA9DC69DCF9DC29DD99DD39DF89DE69DED9DEF9DFD +9E1A9E1B9E1E9E759E799E7D9E819E889E8B9E8C9E929E959E919E9D9EA59EA9 +9EB89EAA9EAD97619ECC9ECE9ECF9ED09ED49EDC9EDE9EDD9EE09EE59EE89EEF +9EF49EF69EF79EF99EFB9EFC9EFD9F079F0876B79F159F219F2C9F3E9F4A9F52 +9F549F639F5F9F609F619F669F679F6C9F6A9F779F729F769F959F9C9FA00000 +F4 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000582F69C79059746451DC7199000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +R +A1C1 301C FF5E +A1C2 2016 2225 +A1DD 2212 FF0D +A1F1 00A2 FFE0 +A1F2 00A3 FFE1 +A2CC 00AC FFE2 diff --git a/env/tcl/tcl8.6/encoding/euc-kr.enc b/env/tcl/tcl8.6/encoding/euc-kr.enc new file mode 100644 index 0000000..5e9bb93 --- /dev/null +++ b/env/tcl/tcl8.6/encoding/euc-kr.enc @@ -0,0 +1,1533 @@ +# Encoding file: euc-kr, multi-byte +M +003F 0 90 +00 +0000000100020003000400050006000700080009000A000B000C000D000E000F +0010001100120013001400150016001700180019001A001B001C001D001E001F +0020002100220023002400250026002700280029002A002B002C002D002E002F +0030003100320033003400350036003700380039003A003B003C003D003E003F +0040004100420043004400450046004700480049004A004B004C004D004E004F +0050005100520053005400550056005700580059005A005B005C005D005E005F +0060006100620063006400650066006700680069006A006B006C006D006E006F +0070007100720073007400750076007700780079007A007B007C007D007E007F +0080008100820083008400850086008700880089008A008B008C008D008E008F +0090009100920093009400950096009700980099009A009B009C009D009E009F +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +A1 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000030003001300200B72025202600A8300300AD20152225FF3C223C20182019 +201C201D3014301530083009300A300B300C300D300E300F3010301100B100D7 +00F7226022642265221E223400B0203220332103212BFFE0FFE1FFE526422640 +222022A52312220222072261225200A7203B2606260525CB25CF25CE25C725C6 +25A125A025B325B225BD25BC219221902191219321943013226A226B221A223D +221D2235222B222C2208220B2286228722822283222A222922272228FFE20000 +A2 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000021D221D42200220300B4FF5E02C702D802DD02DA02D900B802DB00A100BF +02D0222E2211220F00A42109203025C125C025B725B626642660266126652667 +2663229925C825A325D025D1259225A425A525A825A725A625A92668260F260E +261C261E00B62020202121952197219921962198266D2669266A266C327F321C +211633C7212233C233D821210000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +A3 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000FF01FF02FF03FF04FF05FF06FF07FF08FF09FF0AFF0BFF0CFF0DFF0EFF0F +FF10FF11FF12FF13FF14FF15FF16FF17FF18FF19FF1AFF1BFF1CFF1DFF1EFF1F +FF20FF21FF22FF23FF24FF25FF26FF27FF28FF29FF2AFF2BFF2CFF2DFF2EFF2F +FF30FF31FF32FF33FF34FF35FF36FF37FF38FF39FF3AFF3BFFE6FF3DFF3EFF3F +FF40FF41FF42FF43FF44FF45FF46FF47FF48FF49FF4AFF4BFF4CFF4DFF4EFF4F +FF50FF51FF52FF53FF54FF55FF56FF57FF58FF59FF5AFF5BFF5CFF5DFFE30000 +A4 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000313131323133313431353136313731383139313A313B313C313D313E313F +3140314131423143314431453146314731483149314A314B314C314D314E314F +3150315131523153315431553156315731583159315A315B315C315D315E315F +3160316131623163316431653166316731683169316A316B316C316D316E316F +3170317131723173317431753176317731783179317A317B317C317D317E317F +3180318131823183318431853186318731883189318A318B318C318D318E0000 +A5 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000217021712172217321742175217621772178217900000000000000000000 +2160216121622163216421652166216721682169000000000000000000000000 +0000039103920393039403950396039703980399039A039B039C039D039E039F +03A003A103A303A403A503A603A703A803A90000000000000000000000000000 +000003B103B203B303B403B503B603B703B803B903BA03BB03BC03BD03BE03BF +03C003C103C303C403C503C603C703C803C90000000000000000000000000000 +A6 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000025002502250C251025182514251C252C25242534253C25012503250F2513 +251B251725232533252B253B254B2520252F25282537253F251D253025252538 +254225122511251A251925162515250E250D251E251F25212522252625272529 +252A252D252E25312532253525362539253A253D253E25402541254325442545 +2546254725482549254A00000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +A7 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00003395339633972113339833C433A333A433A533A63399339A339B339C339D +339E339F33A033A133A233CA338D338E338F33CF3388338933C833A733A833B0 +33B133B233B333B433B533B633B733B833B93380338133823383338433BA33BB +33BC33BD33BE33BF33903391339233933394212633C033C1338A338B338C33D6 +33C533AD33AE33AF33DB33A933AA33AB33AC33DD33D033D333C333C933DC33C6 +0000000000000000000000000000000000000000000000000000000000000000 +A8 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000000C600D000AA0126000001320000013F014100D8015200BA00DE0166014A +00003260326132623263326432653266326732683269326A326B326C326D326E +326F3270327132723273327432753276327732783279327A327B24D024D124D2 +24D324D424D524D624D724D824D924DA24DB24DC24DD24DE24DF24E024E124E2 +24E324E424E524E624E724E824E9246024612462246324642465246624672468 +2469246A246B246C246D246E00BD2153215400BC00BE215B215C215D215E0000 +A9 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000000E6011100F001270131013301380140014200F8015300DF00FE0167014B +01493200320132023203320432053206320732083209320A320B320C320D320E +320F3210321132123213321432153216321732183219321A321B249C249D249E +249F24A024A124A224A324A424A524A624A724A824A924AA24AB24AC24AD24AE +24AF24B024B124B224B324B424B5247424752476247724782479247A247B247C +247D247E247F24802481248200B900B200B32074207F20812082208320840000 +AA +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000304130423043304430453046304730483049304A304B304C304D304E304F +3050305130523053305430553056305730583059305A305B305C305D305E305F +3060306130623063306430653066306730683069306A306B306C306D306E306F +3070307130723073307430753076307730783079307A307B307C307D307E307F +3080308130823083308430853086308730883089308A308B308C308D308E308F +3090309130923093000000000000000000000000000000000000000000000000 +AB +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000030A130A230A330A430A530A630A730A830A930AA30AB30AC30AD30AE30AF +30B030B130B230B330B430B530B630B730B830B930BA30BB30BC30BD30BE30BF +30C030C130C230C330C430C530C630C730C830C930CA30CB30CC30CD30CE30CF +30D030D130D230D330D430D530D630D730D830D930DA30DB30DC30DD30DE30DF +30E030E130E230E330E430E530E630E730E830E930EA30EB30EC30ED30EE30EF +30F030F130F230F330F430F530F6000000000000000000000000000000000000 +AC +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000004100411041204130414041504010416041704180419041A041B041C041D +041E041F0420042104220423042404250426042704280429042A042B042C042D +042E042F00000000000000000000000000000000000000000000000000000000 +000004300431043204330434043504510436043704380439043A043B043C043D +043E043F0440044104420443044404450446044704480449044A044B044C044D +044E044F00000000000000000000000000000000000000000000000000000000 +B0 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000AC00AC01AC04AC07AC08AC09AC0AAC10AC11AC12AC13AC14AC15AC16AC17 +AC19AC1AAC1BAC1CAC1DAC20AC24AC2CAC2DAC2FAC30AC31AC38AC39AC3CAC40 +AC4BAC4DAC54AC58AC5CAC70AC71AC74AC77AC78AC7AAC80AC81AC83AC84AC85 +AC86AC89AC8AAC8BAC8CAC90AC94AC9CAC9DAC9FACA0ACA1ACA8ACA9ACAAACAC +ACAFACB0ACB8ACB9ACBBACBCACBDACC1ACC4ACC8ACCCACD5ACD7ACE0ACE1ACE4 +ACE7ACE8ACEAACECACEFACF0ACF1ACF3ACF5ACF6ACFCACFDAD00AD04AD060000 +B1 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000AD0CAD0DAD0FAD11AD18AD1CAD20AD29AD2CAD2DAD34AD35AD38AD3CAD44 +AD45AD47AD49AD50AD54AD58AD61AD63AD6CAD6DAD70AD73AD74AD75AD76AD7B +AD7CAD7DAD7FAD81AD82AD88AD89AD8CAD90AD9CAD9DADA4ADB7ADC0ADC1ADC4 +ADC8ADD0ADD1ADD3ADDCADE0ADE4ADF8ADF9ADFCADFFAE00AE01AE08AE09AE0B +AE0DAE14AE30AE31AE34AE37AE38AE3AAE40AE41AE43AE45AE46AE4AAE4CAE4D +AE4EAE50AE54AE56AE5CAE5DAE5FAE60AE61AE65AE68AE69AE6CAE70AE780000 +B2 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000AE79AE7BAE7CAE7DAE84AE85AE8CAEBCAEBDAEBEAEC0AEC4AECCAECDAECF +AED0AED1AED8AED9AEDCAEE8AEEBAEEDAEF4AEF8AEFCAF07AF08AF0DAF10AF2C +AF2DAF30AF32AF34AF3CAF3DAF3FAF41AF42AF43AF48AF49AF50AF5CAF5DAF64 +AF65AF79AF80AF84AF88AF90AF91AF95AF9CAFB8AFB9AFBCAFC0AFC7AFC8AFC9 +AFCBAFCDAFCEAFD4AFDCAFE8AFE9AFF0AFF1AFF4AFF8B000B001B004B00CB010 +B014B01CB01DB028B044B045B048B04AB04CB04EB053B054B055B057B0590000 +B3 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000B05DB07CB07DB080B084B08CB08DB08FB091B098B099B09AB09CB09FB0A0 +B0A1B0A2B0A8B0A9B0ABB0ACB0ADB0AEB0AFB0B1B0B3B0B4B0B5B0B8B0BCB0C4 +B0C5B0C7B0C8B0C9B0D0B0D1B0D4B0D8B0E0B0E5B108B109B10BB10CB110B112 +B113B118B119B11BB11CB11DB123B124B125B128B12CB134B135B137B138B139 +B140B141B144B148B150B151B154B155B158B15CB160B178B179B17CB180B182 +B188B189B18BB18DB192B193B194B198B19CB1A8B1CCB1D0B1D4B1DCB1DD0000 +B4 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000B1DFB1E8B1E9B1ECB1F0B1F9B1FBB1FDB204B205B208B20BB20CB214B215 +B217B219B220B234B23CB258B25CB260B268B269B274B275B27CB284B285B289 +B290B291B294B298B299B29AB2A0B2A1B2A3B2A5B2A6B2AAB2ACB2B0B2B4B2C8 +B2C9B2CCB2D0B2D2B2D8B2D9B2DBB2DDB2E2B2E4B2E5B2E6B2E8B2EBB2ECB2ED +B2EEB2EFB2F3B2F4B2F5B2F7B2F8B2F9B2FAB2FBB2FFB300B301B304B308B310 +B311B313B314B315B31CB354B355B356B358B35BB35CB35EB35FB364B3650000 +B5 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000B367B369B36BB36EB370B371B374B378B380B381B383B384B385B38CB390 +B394B3A0B3A1B3A8B3ACB3C4B3C5B3C8B3CBB3CCB3CEB3D0B3D4B3D5B3D7B3D9 +B3DBB3DDB3E0B3E4B3E8B3FCB410B418B41CB420B428B429B42BB434B450B451 +B454B458B460B461B463B465B46CB480B488B49DB4A4B4A8B4ACB4B5B4B7B4B9 +B4C0B4C4B4C8B4D0B4D5B4DCB4DDB4E0B4E3B4E4B4E6B4ECB4EDB4EFB4F1B4F8 +B514B515B518B51BB51CB524B525B527B528B529B52AB530B531B534B5380000 +B6 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000B540B541B543B544B545B54BB54CB54DB550B554B55CB55DB55FB560B561 +B5A0B5A1B5A4B5A8B5AAB5ABB5B0B5B1B5B3B5B4B5B5B5BBB5BCB5BDB5C0B5C4 +B5CCB5CDB5CFB5D0B5D1B5D8B5ECB610B611B614B618B625B62CB634B648B664 +B668B69CB69DB6A0B6A4B6ABB6ACB6B1B6D4B6F0B6F4B6F8B700B701B705B728 +B729B72CB72FB730B738B739B73BB744B748B74CB754B755B760B764B768B770 +B771B773B775B77CB77DB780B784B78CB78DB78FB790B791B792B796B7970000 +B7 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000B798B799B79CB7A0B7A8B7A9B7ABB7ACB7ADB7B4B7B5B7B8B7C7B7C9B7EC +B7EDB7F0B7F4B7FCB7FDB7FFB800B801B807B808B809B80CB810B818B819B81B +B81DB824B825B828B82CB834B835B837B838B839B840B844B851B853B85CB85D +B860B864B86CB86DB86FB871B878B87CB88DB8A8B8B0B8B4B8B8B8C0B8C1B8C3 +B8C5B8CCB8D0B8D4B8DDB8DFB8E1B8E8B8E9B8ECB8F0B8F8B8F9B8FBB8FDB904 +B918B920B93CB93DB940B944B94CB94FB951B958B959B95CB960B968B9690000 +B8 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000B96BB96DB974B975B978B97CB984B985B987B989B98AB98DB98EB9ACB9AD +B9B0B9B4B9BCB9BDB9BFB9C1B9C8B9C9B9CCB9CEB9CFB9D0B9D1B9D2B9D8B9D9 +B9DBB9DDB9DEB9E1B9E3B9E4B9E5B9E8B9ECB9F4B9F5B9F7B9F8B9F9B9FABA00 +BA01BA08BA15BA38BA39BA3CBA40BA42BA48BA49BA4BBA4DBA4EBA53BA54BA55 +BA58BA5CBA64BA65BA67BA68BA69BA70BA71BA74BA78BA83BA84BA85BA87BA8C +BAA8BAA9BAABBAACBAB0BAB2BAB8BAB9BABBBABDBAC4BAC8BAD8BAD9BAFC0000 +B9 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000BB00BB04BB0DBB0FBB11BB18BB1CBB20BB29BB2BBB34BB35BB36BB38BB3B +BB3CBB3DBB3EBB44BB45BB47BB49BB4DBB4FBB50BB54BB58BB61BB63BB6CBB88 +BB8CBB90BBA4BBA8BBACBBB4BBB7BBC0BBC4BBC8BBD0BBD3BBF8BBF9BBFCBBFF +BC00BC02BC08BC09BC0BBC0CBC0DBC0FBC11BC14BC15BC16BC17BC18BC1BBC1C +BC1DBC1EBC1FBC24BC25BC27BC29BC2DBC30BC31BC34BC38BC40BC41BC43BC44 +BC45BC49BC4CBC4DBC50BC5DBC84BC85BC88BC8BBC8CBC8EBC94BC95BC970000 +BA +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000BC99BC9ABCA0BCA1BCA4BCA7BCA8BCB0BCB1BCB3BCB4BCB5BCBCBCBDBCC0 +BCC4BCCDBCCFBCD0BCD1BCD5BCD8BCDCBCF4BCF5BCF6BCF8BCFCBD04BD05BD07 +BD09BD10BD14BD24BD2CBD40BD48BD49BD4CBD50BD58BD59BD64BD68BD80BD81 +BD84BD87BD88BD89BD8ABD90BD91BD93BD95BD99BD9ABD9CBDA4BDB0BDB8BDD4 +BDD5BDD8BDDCBDE9BDF0BDF4BDF8BE00BE03BE05BE0CBE0DBE10BE14BE1CBE1D +BE1FBE44BE45BE48BE4CBE4EBE54BE55BE57BE59BE5ABE5BBE60BE61BE640000 +BB +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000BE68BE6ABE70BE71BE73BE74BE75BE7BBE7CBE7DBE80BE84BE8CBE8DBE8F +BE90BE91BE98BE99BEA8BED0BED1BED4BED7BED8BEE0BEE3BEE4BEE5BEECBF01 +BF08BF09BF18BF19BF1BBF1CBF1DBF40BF41BF44BF48BF50BF51BF55BF94BFB0 +BFC5BFCCBFCDBFD0BFD4BFDCBFDFBFE1C03CC051C058C05CC060C068C069C090 +C091C094C098C0A0C0A1C0A3C0A5C0ACC0ADC0AFC0B0C0B3C0B4C0B5C0B6C0BC +C0BDC0BFC0C0C0C1C0C5C0C8C0C9C0CCC0D0C0D8C0D9C0DBC0DCC0DDC0E40000 +BC +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000C0E5C0E8C0ECC0F4C0F5C0F7C0F9C100C104C108C110C115C11CC11DC11E +C11FC120C123C124C126C127C12CC12DC12FC130C131C136C138C139C13CC140 +C148C149C14BC14CC14DC154C155C158C15CC164C165C167C168C169C170C174 +C178C185C18CC18DC18EC190C194C196C19CC19DC19FC1A1C1A5C1A8C1A9C1AC +C1B0C1BDC1C4C1C8C1CCC1D4C1D7C1D8C1E0C1E4C1E8C1F0C1F1C1F3C1FCC1FD +C200C204C20CC20DC20FC211C218C219C21CC21FC220C228C229C22BC22D0000 +BD +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000C22FC231C232C234C248C250C251C254C258C260C265C26CC26DC270C274 +C27CC27DC27FC281C288C289C290C298C29BC29DC2A4C2A5C2A8C2ACC2ADC2B4 +C2B5C2B7C2B9C2DCC2DDC2E0C2E3C2E4C2EBC2ECC2EDC2EFC2F1C2F6C2F8C2F9 +C2FBC2FCC300C308C309C30CC30DC313C314C315C318C31CC324C325C328C329 +C345C368C369C36CC370C372C378C379C37CC37DC384C388C38CC3C0C3D8C3D9 +C3DCC3DFC3E0C3E2C3E8C3E9C3EDC3F4C3F5C3F8C408C410C424C42CC4300000 +BE +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000C434C43CC43DC448C464C465C468C46CC474C475C479C480C494C49CC4B8 +C4BCC4E9C4F0C4F1C4F4C4F8C4FAC4FFC500C501C50CC510C514C51CC528C529 +C52CC530C538C539C53BC53DC544C545C548C549C54AC54CC54DC54EC553C554 +C555C557C558C559C55DC55EC560C561C564C568C570C571C573C574C575C57C +C57DC580C584C587C58CC58DC58FC591C595C597C598C59CC5A0C5A9C5B4C5B5 +C5B8C5B9C5BBC5BCC5BDC5BEC5C4C5C5C5C6C5C7C5C8C5C9C5CAC5CCC5CE0000 +BF +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000C5D0C5D1C5D4C5D8C5E0C5E1C5E3C5E5C5ECC5EDC5EEC5F0C5F4C5F6C5F7 +C5FCC5FDC5FEC5FFC600C601C605C606C607C608C60CC610C618C619C61BC61C +C624C625C628C62CC62DC62EC630C633C634C635C637C639C63BC640C641C644 +C648C650C651C653C654C655C65CC65DC660C66CC66FC671C678C679C67CC680 +C688C689C68BC68DC694C695C698C69CC6A4C6A5C6A7C6A9C6B0C6B1C6B4C6B8 +C6B9C6BAC6C0C6C1C6C3C6C5C6CCC6CDC6D0C6D4C6DCC6DDC6E0C6E1C6E80000 +C0 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000C6E9C6ECC6F0C6F8C6F9C6FDC704C705C708C70CC714C715C717C719C720 +C721C724C728C730C731C733C735C737C73CC73DC740C744C74AC74CC74DC74F +C751C752C753C754C755C756C757C758C75CC760C768C76BC774C775C778C77C +C77DC77EC783C784C785C787C788C789C78AC78EC790C791C794C796C797C798 +C79AC7A0C7A1C7A3C7A4C7A5C7A6C7ACC7ADC7B0C7B4C7BCC7BDC7BFC7C0C7C1 +C7C8C7C9C7CCC7CEC7D0C7D8C7DDC7E4C7E8C7ECC800C801C804C808C80A0000 +C1 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000C810C811C813C815C816C81CC81DC820C824C82CC82DC82FC831C838C83C +C840C848C849C84CC84DC854C870C871C874C878C87AC880C881C883C885C886 +C887C88BC88CC88DC894C89DC89FC8A1C8A8C8BCC8BDC8C4C8C8C8CCC8D4C8D5 +C8D7C8D9C8E0C8E1C8E4C8F5C8FCC8FDC900C904C905C906C90CC90DC90FC911 +C918C92CC934C950C951C954C958C960C961C963C96CC970C974C97CC988C989 +C98CC990C998C999C99BC99DC9C0C9C1C9C4C9C7C9C8C9CAC9D0C9D1C9D30000 +C2 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000C9D5C9D6C9D9C9DAC9DCC9DDC9E0C9E2C9E4C9E7C9ECC9EDC9EFC9F0C9F1 +C9F8C9F9C9FCCA00CA08CA09CA0BCA0CCA0DCA14CA18CA29CA4CCA4DCA50CA54 +CA5CCA5DCA5FCA60CA61CA68CA7DCA84CA98CABCCABDCAC0CAC4CACCCACDCACF +CAD1CAD3CAD8CAD9CAE0CAECCAF4CB08CB10CB14CB18CB20CB21CB41CB48CB49 +CB4CCB50CB58CB59CB5DCB64CB78CB79CB9CCBB8CBD4CBE4CBE7CBE9CC0CCC0D +CC10CC14CC1CCC1DCC21CC22CC27CC28CC29CC2CCC2ECC30CC38CC39CC3B0000 +C3 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000CC3CCC3DCC3ECC44CC45CC48CC4CCC54CC55CC57CC58CC59CC60CC64CC66 +CC68CC70CC75CC98CC99CC9CCCA0CCA8CCA9CCABCCACCCADCCB4CCB5CCB8CCBC +CCC4CCC5CCC7CCC9CCD0CCD4CCE4CCECCCF0CD01CD08CD09CD0CCD10CD18CD19 +CD1BCD1DCD24CD28CD2CCD39CD5CCD60CD64CD6CCD6DCD6FCD71CD78CD88CD94 +CD95CD98CD9CCDA4CDA5CDA7CDA9CDB0CDC4CDCCCDD0CDE8CDECCDF0CDF8CDF9 +CDFBCDFDCE04CE08CE0CCE14CE19CE20CE21CE24CE28CE30CE31CE33CE350000 +C4 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000CE58CE59CE5CCE5FCE60CE61CE68CE69CE6BCE6DCE74CE75CE78CE7CCE84 +CE85CE87CE89CE90CE91CE94CE98CEA0CEA1CEA3CEA4CEA5CEACCEADCEC1CEE4 +CEE5CEE8CEEBCEECCEF4CEF5CEF7CEF8CEF9CF00CF01CF04CF08CF10CF11CF13 +CF15CF1CCF20CF24CF2CCF2DCF2FCF30CF31CF38CF54CF55CF58CF5CCF64CF65 +CF67CF69CF70CF71CF74CF78CF80CF85CF8CCFA1CFA8CFB0CFC4CFE0CFE1CFE4 +CFE8CFF0CFF1CFF3CFF5CFFCD000D004D011D018D02DD034D035D038D03C0000 +C5 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000D044D045D047D049D050D054D058D060D06CD06DD070D074D07CD07DD081 +D0A4D0A5D0A8D0ACD0B4D0B5D0B7D0B9D0C0D0C1D0C4D0C8D0C9D0D0D0D1D0D3 +D0D4D0D5D0DCD0DDD0E0D0E4D0ECD0EDD0EFD0F0D0F1D0F8D10DD130D131D134 +D138D13AD140D141D143D144D145D14CD14DD150D154D15CD15DD15FD161D168 +D16CD17CD184D188D1A0D1A1D1A4D1A8D1B0D1B1D1B3D1B5D1BAD1BCD1C0D1D8 +D1F4D1F8D207D209D210D22CD22DD230D234D23CD23DD23FD241D248D25C0000 +C6 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000D264D280D281D284D288D290D291D295D29CD2A0D2A4D2ACD2B1D2B8D2B9 +D2BCD2BFD2C0D2C2D2C8D2C9D2CBD2D4D2D8D2DCD2E4D2E5D2F0D2F1D2F4D2F8 +D300D301D303D305D30CD30DD30ED310D314D316D31CD31DD31FD320D321D325 +D328D329D32CD330D338D339D33BD33CD33DD344D345D37CD37DD380D384D38C +D38DD38FD390D391D398D399D39CD3A0D3A8D3A9D3ABD3ADD3B4D3B8D3BCD3C4 +D3C5D3C8D3C9D3D0D3D8D3E1D3E3D3ECD3EDD3F0D3F4D3FCD3FDD3FFD4010000 +C7 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000D408D41DD440D444D45CD460D464D46DD46FD478D479D47CD47FD480D482 +D488D489D48BD48DD494D4A9D4CCD4D0D4D4D4DCD4DFD4E8D4ECD4F0D4F8D4FB +D4FDD504D508D50CD514D515D517D53CD53DD540D544D54CD54DD54FD551D558 +D559D55CD560D565D568D569D56BD56DD574D575D578D57CD584D585D587D588 +D589D590D5A5D5C8D5C9D5CCD5D0D5D2D5D8D5D9D5DBD5DDD5E4D5E5D5E8D5EC +D5F4D5F5D5F7D5F9D600D601D604D608D610D611D613D614D615D61CD6200000 +C8 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000D624D62DD638D639D63CD640D645D648D649D64BD64DD651D654D655D658 +D65CD667D669D670D671D674D683D685D68CD68DD690D694D69DD69FD6A1D6A8 +D6ACD6B0D6B9D6BBD6C4D6C5D6C8D6CCD6D1D6D4D6D7D6D9D6E0D6E4D6E8D6F0 +D6F5D6FCD6FDD700D704D711D718D719D71CD720D728D729D72BD72DD734D735 +D738D73CD744D747D749D750D751D754D756D757D758D759D760D761D763D765 +D769D76CD770D774D77CD77DD781D788D789D78CD790D798D799D79BD79D0000 +CA +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00004F3D4F73504750F952A053EF547554E556095AC15BB6668767B667B767EF +6B4C73C275C27A3C82DB8304885788888A368CC88DCF8EFB8FE699D5523B5374 +5404606A61646BBC73CF811A89BA89D295A34F83520A58BE597859E65E725E79 +61C763C0674667EC687F6F97764E770B78F57A087AFF7C21809D826E82718AEB +95934E6B559D66F76E3478A37AED845B8910874E97A852D8574E582A5D4C611F +61BE6221656267D16A446E1B751875B376E377B07D3A90AF945194529F950000 +CB +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000053235CAC753280DB92409598525B580859DC5CA15D175EB75F3A5F4A6177 +6C5F757A75867CE07D737DB17F8C81548221859189418B1B92FC964D9C474ECB +4EF7500B51F1584F6137613E6168653969EA6F1175A5768676D67B8782A584CB +F90093A7958B55805BA25751F9017CB37FB991B5502853BB5C455DE862D2636E +64DA64E76E2070AC795B8DDD8E1EF902907D924592F84E7E4EF650655DFE5EFA +61066957817186548E4793759A2B4E5E5091677068405109528D52926AA20000 +CC +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000077BC92109ED452AB602F8FF2504861A963ED64CA683C6A846FC0818889A1 +96945805727D72AC75047D797E6D80A9898B8B7490639D5162896C7A6F547D50 +7F3A8A23517C614A7B9D8B199257938C4EAC4FD3501E50BE510652C152CD537F +577058835E9A5F91617661AC64CE656C666F66BB66F468976D87708570F1749F +74A574CA75D9786C78EC7ADF7AF67D457D938015803F811B83968B668F159015 +93E1980398389A5A9BE84FC25553583A59515B635C4660B86212684268B00000 +CD +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000068E86EAA754C767878CE7A3D7CFB7E6B7E7C8A088AA18C3F968E9DC453E4 +53E9544A547156FA59D15B645C3B5EAB62F765376545657266A067AF69C16CBD +75FC7690777E7A3F7F94800380A1818F82E682FD83F085C1883188B48AA5F903 +8F9C932E96C798679AD89F1354ED659B66F2688F7A408C379D6056F057645D11 +660668B168CD6EFE7428889E9BE46C68F9049AA84F9B516C5171529F5B545DE5 +6050606D62F163A7653B73D97A7A86A38CA2978F4E325BE16208679C74DC0000 +CE +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000079D183D38A878AB28DE8904E934B98465ED369E885FF90EDF90551A05B98 +5BEC616368FA6B3E704C742F74D87BA17F5083C589C08CAB95DC9928522E605D +62EC90024F8A5149532158D95EE366E06D38709A72C273D67B5080F1945B5366 +639B7F6B4E565080584A58DE602A612762D069D09B415B8F7D1880B18F5F4EA4 +50D154AC55AC5B0C5DA05DE7652A654E68216A4B72E1768E77EF7D5E7FF981A0 +854E86DF8F038F4E90CA99039A559BAB4E184E454E5D4EC74FF1517752FE0000 +CF +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000534053E353E5548E5614577557A25BC75D875ED061FC62D8655167B867E9 +69CB6B506BC66BEC6C426E9D707872D77396740377BF77E97A767D7F800981FC +8205820A82DF88628B338CFC8EC0901190B1926492B699D29A459CE99DD79F9C +570B5C4083CA97A097AB9EB4541B7A987FA488D98ECD90E158005C4863987A9F +5BAE5F137A797AAE828E8EAC5026523852F85377570862F363726B0A6DC37737 +53A5735785688E7695D5673A6AC36F708A6D8ECC994BF90666776B788CB40000 +D0 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00009B3CF90753EB572D594E63C669FB73EA78457ABA7AC57CFE8475898F8D73 +903595A852FB574775477B6083CC921EF9086A58514B524B5287621F68D86975 +969950C552A452E461C365A4683969FF747E7B4B82B983EB89B28B398FD19949 +F9094ECA599764D266116A8E7434798179BD82A9887E887F895FF90A93264F0B +53CA602562716C727D1A7D664E98516277DC80AF4F014F0E5176518055DC5668 +573B57FA57FC5914594759935BC45C905D0E5DF15E7E5FCC628065D765E30000 +D1 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000671E671F675E68CB68C46A5F6B3A6C236C7D6C826DC773987426742A7482 +74A37578757F788178EF794179477948797A7B957D007DBA7F888006802D808C +8A188B4F8C488D779321932498E299519A0E9A0F9A659E927DCA4F76540962EE +685491D155AB513AF90BF90C5A1C61E6F90D62CF62FFF90EF90FF910F911F912 +F91390A3F914F915F916F917F9188AFEF919F91AF91BF91C6696F91D7156F91E +F91F96E3F920634F637A5357F921678F69606E73F9227537F923F924F9250000 +D2 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00007D0DF926F927887256CA5A18F928F929F92AF92BF92C4E43F92D51675948 +67F08010F92E59735E74649A79CA5FF5606C62C8637B5BE75BD752AAF92F5974 +5F296012F930F931F9327459F933F934F935F936F937F93899D1F939F93AF93B +F93CF93DF93EF93FF940F941F942F9436FC3F944F94581BF8FB260F1F946F947 +8166F948F9495C3FF94AF94BF94CF94DF94EF94FF950F9515AE98A25677B7D10 +F952F953F954F955F956F95780FDF958F9595C3C6CE5533F6EBA591A83360000 +D3 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00004E394EB64F4655AE571858C75F5665B765E66A806BB56E4D77ED7AEF7C1E +7DDE86CB88929132935B64BB6FBE737A75B890545556574D61BA64D466C76DE1 +6E5B6F6D6FB975F0804381BD854189838AC78B5A931F6C9375537B548E0F905D +5510580258585E626207649E68E075767CD687B39EE84EE35788576E59275C0D +5CB15E365F85623464E173B381FA888B8CB8968A9EDB5B855FB760B350125200 +52305716583558575C0E5C605CF65D8B5EA65F9260BC63116389641768430000 +D4 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000068F96AC26DD86E216ED46FE471FE76DC777979B17A3B840489A98CED8DF3 +8E4890039014905390FD934D967697DC6BD27006725872A27368776379BF7BE4 +7E9B8B8058A960C7656665FD66BE6C8C711E71C98C5A98134E6D7A814EDD51AC +51CD52D5540C61A76771685068DF6D1E6F7C75BC77B37AE580F484639285515C +6597675C679375D87AC78373F95A8C469017982D5C6F81C0829A9041906F920D +5F975D9D6A5971C8767B7B4985E48B0491279A30558761F6F95B76697F850000 +D5 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000863F87BA88F8908FF95C6D1B70D973DE7D61843DF95D916A99F1F95E4E82 +53756B046B12703E721B862D9E1E524C8FA35D5064E5652C6B166FEB7C437E9C +85CD896489BD62C981D8881F5ECA67176D6A72FC7405746F878290DE4F865D0D +5FA0840A51B763A075654EAE5006516951C968816A117CAE7CB17CE7826F8AD2 +8F1B91CF4FB6513752F554425EEC616E623E65C56ADA6FFE792A85DC882395AD +9A629A6A9E979ECE529B66C66B77701D792B8F6297426190620065236F230000 +D6 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000714974897DF4806F84EE8F269023934A51BD521752A36D0C70C888C25EC9 +65826BAE6FC27C3E73754EE44F3656F9F95F5CBA5DBA601C73B27B2D7F9A7FCE +8046901E923496F6974898189F614F8B6FA779AE91B496B752DEF960648864C4 +6AD36F5E7018721076E780018606865C8DEF8F0597329B6F9DFA9E75788C797F +7DA083C993049E7F9E938AD658DF5F046727702774CF7C60807E512170287262 +78CA8CC28CDA8CF496F74E8650DA5BEE5ED6659971CE764277AD804A84FC0000 +D7 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000907C9B279F8D58D85A415C626A136DDA6F0F763B7D2F7E37851E893893E4 +964B528965D267F369B46D416E9C700F7409746075597624786B8B2C985E516D +622E96784F96502B5D196DEA7DB88F2A5F8B61446817F961968652D2808B51DC +51CC695E7A1C7DBE83F196754FDA52295398540F550E5C6560A7674E68A86D6C +728172F874067483F96275E27C6C7F797FB8838988CF88E191CC91D096E29BC9 +541D6F7E71D0749885FA8EAA96A39C579E9F67976DCB743381E89716782C0000 +D8 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00007ACB7B207C926469746A75F278BC78E899AC9B549EBB5BDE5E556F20819C +83AB90884E07534D5A295DD25F4E6162633D666966FC6EFF6F2B7063779E842C +8513883B8F1399459C3B551C62B9672B6CAB8309896A977A4EA159845FD85FD9 +671B7DB27F548292832B83BD8F1E909957CB59B95A925BD06627679A68856BCF +71647F758CB78CE390819B4581088C8A964C9A409EA55B5F6C13731B76F276DF +840C51AA8993514D519552C968C96C94770477207DBF7DEC97629EB56EC50000 +D9 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000851151A5540D547D660E669D69276E9F76BF7791831784C2879F91699298 +9CF488824FAE519252DF59C65E3D61556478647966AE67D06A216BCD6BDB725F +72617441773877DB801782BC83058B008B288C8C67286C90726776EE77667A46 +9DA96B7F6C92592267268499536F589359995EDF63CF663467736E3A732B7AD7 +82D7932852D95DEB61AE61CB620A62C764AB65E069596B666BCB712173F7755D +7E46821E8302856A8AA38CBF97279D6158A89ED85011520E543B554F65870000 +DA +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00006C767D0A7D0B805E868A958096EF52FF6C95726954735A9A5C3E5D4B5F4C +5FAE672A68B669636E3C6E4477097C737F8E85878B0E8FF797619EF45CB760B6 +610D61AB654F65FB65FC6C116CEF739F73C97DE195945BC6871C8B10525D535A +62CD640F64B267346A386CCA73C0749E7B947C957E1B818A823685848FEB96F9 +99C14F34534A53CD53DB62CC642C6500659169C36CEE6F5873ED7554762276E4 +76FC78D078FB792C7D46822C87E08FD4981298EF52C362D464A56E246F510000 +DB +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000767C8DCB91B192629AEE9B435023508D574A59A85C285E475F77623F653E +65B965C16609678B699C6EC278C57D2180AA8180822B82B384A1868C8A2A8B17 +90A696329F90500D4FF3F96357F95F9862DC6392676F6E43711976C380CC80DA +88F488F589198CE08F29914D966A4F2F4F705E1B67CF6822767D767E9B445E61 +6A0A716971D4756AF9647E41854385E998DC4F107B4F7F7095A551E15E0668B5 +6C3E6C4E6CDB72AF7BC483036CD5743A50FB528858C164D86A9774A776560000 +DC +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000078A7861795E29739F965535E5F018B8A8FA88FAF908A522577A59C499F08 +4E19500251755C5B5E77661E663A67C468C570B3750175C579C97ADD8F279920 +9A084FDD582158315BF6666E6B656D116E7A6F7D73E4752B83E988DC89138B5C +8F144F0F50D55310535C5B935FA9670D798F8179832F8514890789868F398F3B +99A59C12672C4E764FF859495C015CEF5CF0636768D270FD71A2742B7E2B84EC +8702902292D29CF34E0D4ED84FEF50855256526F5426549057E0592B5A660000 +DD +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00005B5A5B755BCC5E9CF9666276657765A76D6E6EA572367B267C3F7F368150 +8151819A8240829983A98A038CA08CE68CFB8D748DBA90E891DC961C964499D9 +9CE7531752065429567458B35954596E5FFF61A4626E66106C7E711A76C67C89 +7CDE7D1B82AC8CC196F0F9674F5B5F175F7F62C25D29670B68DA787C7E439D6C +4E1550995315532A535159835A625E8760B2618A624962796590678769A76BD4 +6BD66BD76BD86CB8F968743575FA7812789179D579D87C837DCB7FE180A50000 +DE +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000813E81C283F2871A88E88AB98B6C8CBB9119975E98DB9F3B56AC5B2A5F6C +658C6AB36BAF6D5C6FF17015725D73AD8CA78CD3983B61916C3780589A014E4D +4E8B4E9B4ED54F3A4F3C4F7F4FDF50FF53F253F8550655E356DB58EB59625A11 +5BEB5BFA5C045DF35E2B5F99601D6368659C65AF67F667FB68AD6B7B6C996CD7 +6E23700973457802793E7940796079C17BE97D177D728086820D838E84D186C7 +88DF8A508A5E8B1D8CDC8D668FAD90AA98FC99DF9E9D524AF9696714F96A0000 +DF +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00005098522A5C7165636C5573CA7523759D7B97849C917897304E7764926BBA +715E85A94E09F96B674968EE6E17829F8518886B63F76F81921298AF4E0A50B7 +50CF511F554655AA56175B405C195CE05E385E8A5EA05EC260F368516A616E58 +723D724072C076F879657BB17FD488F389F48A738C618CDE971C585E74BD8CFD +55C7F96C7A617D2282727272751F7525F96D7B19588558FB5DBC5E8F5EB65F90 +60556292637F654D669166D966F8681668F27280745E7B6E7D6E7DD67F720000 +E0 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000080E5821285AF897F8A93901D92E49ECD9F205915596D5E2D60DC66146673 +67906C506DC56F5F77F378A984C691CB932B4ED950CA514855845B0B5BA36247 +657E65CB6E32717D74017444748774BF766C79AA7DDA7E557FA8817A81B38239 +861A87EC8A758DE3907892919425994D9BAE53685C5169546CC46D296E2B820C +859B893B8A2D8AAA96EA9F67526166B96BB27E9687FE8D0D9583965D651D6D89 +71EEF96E57CE59D35BAC602760FA6210661F665F732973F976DB77017B6C0000 +E1 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00008056807281658AA091924E1652E26B726D177A057B397D30F96F8CB053EC +562F58515BB55C0F5C115DE2624063836414662D68B36CBC6D886EAF701F70A4 +71D27526758F758E76197B117BE07C2B7D207D39852C856D86078A34900D9061 +90B592B797F69A374FD75C6C675F6D917C9F7E8C8B168D16901F5B6B5DFD640D +84C0905C98E173875B8B609A677E6DDE8A1F8AA69001980C5237F9707051788E +9396887091D74FEE53D755FD56DA578258FD5AC25B885CAB5CC05E2561010000 +E2 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000620D624B6388641C653665786A396B8A6C346D196F3171E772E973787407 +74B27626776179C07A577AEA7CB97D8F7DAC7E617F9E81298331849084DA85EA +88968AB08B908F3890429083916C929692B9968B96A796A896D6970098089996 +9AD39B1A53D4587E59195B705BBF6DD16F5A719F742174B9808583FD5DE15F87 +5FAA604265EC6812696F6A536B896D356DF373E376FE77AC7B4D7D148123821C +834084F485638A628AC49187931E980699B4620C88538FF092655D075D270000 +E3 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00005D69745F819D87686FD562FE7FD2893689724E1E4E5850E752DD5347627F +66077E698805965E4F8D5319563659CB5AA45C385C4E5C4D5E025F11604365BD +662F664267BE67F4731C77E2793A7FC5849484CD89968A668A698AE18C558C7A +57F45BD45F0F606F62ED690D6B966E5C71847BD287558B588EFE98DF98FE4F38 +4F814FE1547B5A205BB8613C65B0666871FC7533795E7D33814E81E3839885AA +85CE87038A0A8EAB8F9BF9718FC559315BA45BE660895BE95C0B5FC36C810000 +E4 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000F9726DF1700B751A82AF8AF64EC05341F97396D96C0F4E9E4FC45152555E +5A255CE86211725982BD83AA86FE88598A1D963F96C599139D099D5D580A5CB3 +5DBD5E4460E1611563E16A026E2591029354984E9C109F775B895CB86309664F +6848773C96C1978D98549B9F65A18B018ECB95BC55355CA95DD65EB56697764C +83F495C758D362BC72CE9D284EF0592E600F663B6B8379E79D26539354C057C3 +5D16611B66D66DAF788D827E969897445384627C63966DB27E0A814B984D0000 +E5 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00006AFB7F4C9DAF9E1A4E5F503B51B6591C60F963F66930723A8036F97491CE +5F31F975F9767D0482E5846F84BB85E58E8DF9774F6FF978F97958E45B436059 +63DA6518656D6698F97A694A6A236D0B7001716C75D2760D79B37A70F97B7F8A +F97C8944F97D8B9391C0967DF97E990A57045FA165BC6F01760079A68A9E99AD +9B5A9F6C510461B662916A8D81C6504358305F6671098A008AFA5B7C86164FFA +513C56B4594463A96DF95DAA696D51864E884F59F97FF980F9815982F9820000 +E6 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000F9836B5F6C5DF98474B57916F9858207824583398F3F8F5DF9869918F987 +F988F9894EA6F98A57DF5F796613F98BF98C75AB7E798B6FF98D90069A5B56A5 +582759F85A1F5BB4F98E5EF6F98FF9906350633BF991693D6C876CBF6D8E6D93 +6DF56F14F99270DF71367159F99371C371D5F994784F786FF9957B757DE3F996 +7E2FF997884D8EDFF998F999F99A925BF99B9CF6F99CF99DF99E60856D85F99F +71B1F9A0F9A195B153ADF9A2F9A3F9A467D3F9A5708E71307430827682D20000 +E7 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000F9A695BB9AE59E7D66C4F9A771C18449F9A8F9A9584BF9AAF9AB5DB85F71 +F9AC6620668E697969AE6C386CF36E366F416FDA701B702F715071DF7370F9AD +745BF9AE74D476C87A4E7E93F9AFF9B082F18A608FCEF9B19348F9B29719F9B3 +F9B44E42502AF9B5520853E166F36C6D6FCA730A777F7A6282AE85DD8602F9B6 +88D48A638B7D8C6BF9B792B3F9B8971398104E944F0D4FC950B25348543E5433 +55DA586258BA59675A1B5BE4609FF9B961CA655665FF666468A76C5A6FB30000 +E8 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000070CF71AC73527B7D87088AA49C329F075C4B6C8373447389923A6EAB7465 +761F7A697E15860A514058C564C174EE751576707FC1909596CD99546E2674E6 +7AA97AAA81E586D987788A1B5A495B8C5B9B68A169006D6373A97413742C7897 +7DE97FEB81188155839E8C4C962E981166F05F8065FA67896C6A738B502D5A03 +6B6A77EE59165D6C5DCD7325754FF9BAF9BB50E551F9582F592D599659DA5BE5 +F9BCF9BD5DA262D76416649364FEF9BE66DCF9BF6A48F9C071FF7464F9C10000 +E9 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00007A887AAF7E477E5E80008170F9C287EF89818B209059F9C390809952617E +6B326D747E1F89258FB14FD150AD519752C757C758895BB95EB8614269956D8C +6E676EB6719474627528752C8073833884C98E0A939493DEF9C44E8E4F515076 +512A53C853CB53F35B875BD35C24611A618265F4725B7397744076C279507991 +79B97D067FBD828B85D5865E8FC2904790F591EA968596E896E952D65F6765ED +6631682F715C7A3690C1980A4E91F9C56A526B9E6F907189801882B885530000 +EA +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000904B969596F297FB851A9B314E90718A96C45143539F54E15713571257A3 +5A9B5AC45BC36028613F63F46C856D396E726E907230733F745782D188818F45 +9060F9C6966298589D1B67088D8A925E4F4D504950DE5371570D59D45A015C09 +617066906E2D7232744B7DEF80C3840E8466853F875F885B89188B02905597CB +9B4F4E734F915112516AF9C7552F55A95B7A5BA55E7C5E7D5EBE60A060DF6108 +610963C465386709F9C867D467DAF9C9696169626CB96D27F9CA6E38F9CB0000 +EB +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00006FE173367337F9CC745C7531F9CD7652F9CEF9CF7DAD81FE843888D58A98 +8ADB8AED8E308E42904A903E907A914991C9936EF9D0F9D15809F9D26BD38089 +80B2F9D3F9D45141596B5C39F9D5F9D66F6473A780E48D07F9D79217958FF9D8 +F9D9F9DAF9DB807F620E701C7D68878DF9DC57A0606961476BB78ABE928096B1 +4E59541F6DEB852D967097F398EE63D66CE3909151DD61C981BA9DF94F9D501A +51005B9C610F61FF64EC69056BC5759177E37FA98264858F87FB88638ABC0000 +EC +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00008B7091AB4E8C4EE54F0AF9DDF9DE593759E8F9DF5DF25F1B5F5B6021F9E0 +F9E1F9E2F9E3723E73E5F9E4757075CDF9E579FBF9E6800C8033808482E18351 +F9E7F9E88CBD8CB39087F9E9F9EA98F4990CF9EBF9EC703776CA7FCA7FCC7FFC +8B1A4EBA4EC152035370F9ED54BD56E059FB5BC55F155FCD6E6EF9EEF9EF7D6A +8335F9F086938A8DF9F1976D9777F9F2F9F34E004F5A4F7E58F965E56EA29038 +93B099B94EFB58EC598A59D96041F9F4F9F57A14F9F6834F8CC3516553440000 +ED +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000F9F7F9F8F9F94ECD52695B5582BF4ED4523A54A859C959FF5B505B575B5C +606361486ECB7099716E738674F775B578C17D2B800581EA8328851785C98AEE +8CC796CC4F5C52FA56BC65AB6628707C70B872357DBD828D914C96C09D725B71 +68E76B986F7A76DE5C9166AB6F5B7BB47C2A883696DC4E084ED75320583458BB +58EF596C5C075E335E845F35638C66B267566A1F6AA36B0C6F3F7246F9FA7350 +748B7AE07CA7817881DF81E7838A846C8523859485CF88DD8D1391AC95770000 +EE +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000969C518D54C957285BB0624D6750683D68936E3D6ED3707D7E2188C18CA1 +8F099F4B9F4E722D7B8F8ACD931A4F474F4E5132548059D05E9562B56775696E +6A176CAE6E1A72D9732A75BD7BB87D3582E783F9845785F78A5B8CAF8E879019 +90B896CE9F5F52E3540A5AE15BC2645865756EF472C4F9FB76847A4D7B1B7C4D +7E3E7FDF837B8B2B8CCA8D648DE18E5F8FEA8FF9906993D14F434F7A50B35168 +5178524D526A5861587C59605C085C555EDB609B623068136BBF6C086FB10000 +EF +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000714E742075307538755176727B4C7B8B7BAD7BC67E8F8A6E8F3E8F49923F +92939322942B96FB985A986B991E5207622A62986D5976647ACA7BC07D765360 +5CBE5E976F3870B97C9897119B8E9EDE63A5647A87764E014E954EAD505C5075 +544859C35B9A5E405EAD5EF75F8160C5633A653F657465CC6676667867FE6968 +6A896B636C406DC06DE86E1F6E5E701E70A1738E73FD753A775B7887798E7A0B +7A7D7CBE7D8E82478A028AEA8C9E912D914A91D8926692CC9320970697560000 +F0 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000975C98029F0E52365291557C58245E1D5F1F608C63D068AF6FDF796D7B2C +81CD85BA88FD8AF88E44918D9664969B973D984C9F4A4FCE514651CB52A95632 +5F145F6B63AA64CD65E9664166FA66F9671D689D68D769FD6F156F6E716771E5 +722A74AA773A7956795A79DF7A207A957C977CDF7D447E70808785FB86A48A54 +8ABF8D998E819020906D91E3963B96D59CE565CF7C078DB393C35B585C0A5352 +62D9731D50275B975F9E60B0616B68D56DD9742E7A2E7D427D9C7E31816B0000 +F1 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00008E2A8E35937E94184F5057505DE65EA7632B7F6A4E3B4F4F4F8F505A59DD +80C4546A546855FE594F5B995DDE5EDA665D673167F1682A6CE86D326E4A6F8D +70B773E075877C4C7D027D2C7DA2821F86DB8A3B8A858D708E8A8F339031914E +9152944499D07AF97CA54FCA510151C657C85BEF5CFB66596A3D6D5A6E966FEC +710C756F7AE388229021907596CB99FF83014E2D4EF2884691CD537D6ADB696B +6C41847A589E618E66FE62EF70DD751175C77E5284B88B498D084E4B53EA0000 +F2 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000054AB573057405FD763016307646F652F65E8667A679D67B36B626C606C9A +6F2C77E57825794979577D1980A2810281F3829D82B787188A8CF9FC8D048DBE +907276F47A197A377E548077550755D45875632F64226649664B686D699B6B84 +6D256EB173CD746874A1755B75B976E1771E778B79E67E097E1D81FB852F8897 +8A3A8CD18EEB8FB0903293AD9663967397074F8453F159EA5AC95E19684E74C6 +75BE79E97A9281A386ED8CEA8DCC8FED659F6715F9FD57F76F577DDD8F2F0000 +F3 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000093F696C65FB561F26F844E144F98501F53C955DF5D6F5DEE6B216B6478CB +7B9AF9FE8E498ECA906E6349643E77407A84932F947F9F6A64B06FAF71E674A8 +74DA7AC47C127E827CB27E988B9A8D0A947D9910994C52395BDF64E6672D7D2E +50ED53C358796158615961FA65AC7AD98B928B9650095021527555315A3C5EE0 +5F706134655E660C663666A269CD6EC46F32731676217A938139825983D684BC +50B557F05BC05BE85F6963A178267DB583DC852191C791F5518A67F57B560000 +F4 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00008CAC51C459BB60BD8655501CF9FF52545C3A617D621A62D364F265A56ECC +7620810A8E60965F96BB4EDF5343559859295DDD64C56CC96DFA73947A7F821B +85A68CE48E10907791E795E1962197C651F854F255865FB964A46F887DB48F1F +8F4D943550C95C166CBE6DFB751B77BB7C3D7C648A798AC2581E59BE5E166377 +7252758A776B8ADC8CBC8F125EF366746DF8807D83C18ACB97519BD6FA005243 +66FF6D956EEF7DE08AE6902E905E9AD4521D527F54E86194628462DB68A20000 +F5 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00006912695A6A3570927126785D7901790E79D27A0D8096827882D583498549 +8C828D859162918B91AE4FC356D171ED77D7870089F85BF85FD6675190A853E2 +585A5BF560A4618164607E3D80708525928364AE50AC5D146700589C62BD63A8 +690E69786A1E6E6B76BA79CB82BB84298ACF8DA88FFD9112914B919C93109318 +939A96DB9A369C0D4E11755C795D7AFA7B517BC97E2E84C48E598E748EF89010 +6625693F744351FA672E9EDC51455FE06C9687F2885D887760B481B584030000 +F6 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00008D0553D6543956345A365C31708A7FE0805A810681ED8DA391899A5F9DF2 +50744EC453A060FB6E2C5C644F88502455E45CD95E5F606568946CBB6DC471BE +75D475F476617A1A7A497DC77DFB7F6E81F486A98F1C96C999B39F52524752C5 +98ED89AA4E0367D26F064FB55BE267956C886D78741B782791DD937C87C479E4 +7A315FEB4ED654A4553E58AE59A560F0625362D6673669558235964099B199DD +502C53535544577CFA016258FA0264E2666B67DD6FC16FEF742274388A170000 +F7 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000094385451560657665F48619A6B4E705870AD7DBB8A95596A812B63A27708 +803D8CAA5854642D69BB5B955E116E6FFA038569514C53F0592A6020614B6B86 +6C706CF07B1E80CE82D48DC690B098B1FA0464C76FA464916504514E5410571F +8A0E615F6876FA0575DB7B527D71901A580669CC817F892A9000983950785957 +59AC6295900F9B2A615D727995D657615A465DF4628A64AD64FA67776CE26D3E +722C743678347F7782AD8DDB981752245742677F724874E38CA98FA692110000 +F8 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000962A516B53ED634C4F695504609665576C9B6D7F724C72FD7A1789878C9D +5F6D6F8E70F981A8610E4FBF504F624172477BC77DE87FE9904D97AD9A198CB6 +576A5E7367B0840D8A5554205B165E635EE25F0A658380BA853D9589965B4F48 +5305530D530F548654FA57035E036016629B62B16355FA066CE16D6675B17832 +80DE812F82DE846184B2888D8912900B92EA98FD9B915E4566B466DD70117206 +FA074FF5527D5F6A615367536A196F0274E2796888688C7998C798C49A430000 +F9 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000054C17A1F69538AF78C4A98A899AE5F7C62AB75B276AE88AB907F96425339 +5F3C5FC56CCC73CC7562758B7B4682FE999D4E4F903C4E0B4F5553A6590F5EC8 +66306CB37455837787668CC09050971E9C1558D15B7886508B149DB45BD26068 +608D65F16C576F226FA3701A7F557FF095919592965097D352728F4451FD542B +54B85563558A6ABB6DB57DD88266929C96779E79540854C876D286E495A495D4 +965C4EA24F0959EE5AE65DF760526297676D68416C866E2F7F38809B822A0000 +FA +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000FA08FA0998054EA5505554B35793595A5B695BB361C869776D77702387F9 +89E38A728AE7908299ED9AB852BE683850165E78674F8347884C4EAB541156AE +73E6911597FF9909995799995653589F865B8A3161B26AF6737B8ED26B4796AA +9A57595572008D6B97694FD45CF45F2661F8665B6CEB70AB738473B973FE7729 +774D7D437D627E2382378852FA0A8CE29249986F5B517A74884098015ACC4FE0 +5354593E5CFD633E6D7972F98105810783A292CF98304EA851445211578B0000 +FB +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00005F626CC26ECE7005705070AF719273E97469834A87A28861900890A293A3 +99A8516E5F5760E0616766B385598E4A91AF978B4E4E4E92547C58D558FA597D +5CB55F2762366248660A66676BEB6D696DCF6E566EF86F946FE06FE9705D72D0 +7425745A74E07693795C7CCA7E1E80E182A6846B84BF864E865F87748B778C6A +93AC9800986560D1621691775A5A660F6DF76E3E743F9B425FFD60DA7B0F54C4 +5F186C5E6CD36D2A70D87D0586798A0C9D3B5316548C5B056A3A706B75750000 +FC +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000798D79BE82B183EF8A718B418CA89774FA0B64F4652B78BA78BB7A6B4E38 +559A59505BA65E7B60A363DB6B61666568536E19716574B07D0890849A699C25 +6D3B6ED1733E8C4195CA51F05E4C5FA8604D60F66130614C6643664469A56CC1 +6E5F6EC96F62714C749C76877BC17C27835287579051968D9EC3532F56DE5EFB +5F8A6062609461F7666667036A9C6DEE6FAE7070736A7E6A81BE833486D48AA8 +8CC4528373725B966A6B940454EE56865B5D6548658566C9689F6D8D6DC60000 +FD +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000723B80B491759A4D4FAF5019539A540E543C558955C55E3F5F8C673D7166 +73DD900552DB52F3586458CE7104718F71FB85B08A13668885A855A76684714A +8431534955996BC15F595FBD63EE668971478AF18F1D9EBE4F11643A70CB7566 +866760648B4E9DF8514751F653086D3680F89ED166156B23709875D554035C79 +7D078A166B206B3D6B46543860706D3D7FD5820850D651DE559C566B56CD59EC +5B095E0C619961986231665E66E6719971B971BA72A779A77A007FB28A700000 diff --git a/env/tcl/tcl8.6/encoding/gb12345.enc b/env/tcl/tcl8.6/encoding/gb12345.enc new file mode 100644 index 0000000..3f3f4d2 --- /dev/null +++ b/env/tcl/tcl8.6/encoding/gb12345.enc @@ -0,0 +1,1414 @@ +# Encoding file: gb12345, double-byte +D +233F 0 83 +21 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000030003001300230FB02C902C700A8300330052015FF5E2225202620182019 +201C201D3014301530083009300A300B300C300D300E300F3016301730103011 +00B100D700F72236222722282211220F222A222922082237221A22A522252220 +23122299222B222E2261224C2248223D221D2260226E226F22642265221E2235 +22342642264000B0203220332103FF0400A4FFE0FFE1203000A7211626062605 +25CB25CF25CE25C725C625A125A025B325B2203B219221902191219330130000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +22 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000024882489248A248B248C248D248E248F2490249124922493249424952496 +249724982499249A249B247424752476247724782479247A247B247C247D247E +247F248024812482248324842485248624872460246124622463246424652466 +2467246824690000000032203221322232233224322532263227322832290000 +00002160216121622163216421652166216721682169216A216B000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +23 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000FF01FF02FF03FFE5FF05FF06FF07FF08FF09FF0AFF0BFF0CFF0DFF0EFF0F +FF10FF11FF12FF13FF14FF15FF16FF17FF18FF19FF1AFF1BFF1CFF1DFF1EFF1F +FF20FF21FF22FF23FF24FF25FF26FF27FF28FF29FF2AFF2BFF2CFF2DFF2EFF2F +FF30FF31FF32FF33FF34FF35FF36FF37FF38FF39FF3AFF3BFF3CFF3DFF3EFF3F +FF40FF41FF42FF43FF44FF45FF46FF47FF48FF49FF4AFF4BFF4CFF4DFF4EFF4F +FF50FF51FF52FF53FF54FF55FF56FF57FF58FF59FF5AFF5BFF5CFF5DFFE30000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +24 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000304130423043304430453046304730483049304A304B304C304D304E304F +3050305130523053305430553056305730583059305A305B305C305D305E305F +3060306130623063306430653066306730683069306A306B306C306D306E306F +3070307130723073307430753076307730783079307A307B307C307D307E307F +3080308130823083308430853086308730883089308A308B308C308D308E308F +3090309130923093000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +25 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000030A130A230A330A430A530A630A730A830A930AA30AB30AC30AD30AE30AF +30B030B130B230B330B430B530B630B730B830B930BA30BB30BC30BD30BE30BF +30C030C130C230C330C430C530C630C730C830C930CA30CB30CC30CD30CE30CF +30D030D130D230D330D430D530D630D730D830D930DA30DB30DC30DD30DE30DF +30E030E130E230E330E430E530E630E730E830E930EA30EB30EC30ED30EE30EF +30F030F130F230F330F430F530F6000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +26 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000039103920393039403950396039703980399039A039B039C039D039E039F +03A003A103A303A403A503A603A703A803A90000000000000000000000000000 +000003B103B203B303B403B503B603B703B803B903BA03BB03BC03BD03BE03BF +03C003C103C303C403C503C603C703C803C90000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +27 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000004100411041204130414041504010416041704180419041A041B041C041D +041E041F0420042104220423042404250426042704280429042A042B042C042D +042E042F00000000000000000000000000000000000000000000000000000000 +000004300431043204330434043504510436043704380439043A043B043C043D +043E043F0440044104420443044404450446044704480449044A044B044C044D +044E044F00000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +28 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000010100E101CE00E0011300E9011B00E8012B00ED01D000EC014D00F301D2 +00F2016B00FA01D400F901D601D801DA01DC00FC00EA00000000000000000000 +0000000000000000000031053106310731083109310A310B310C310D310E310F +3110311131123113311431153116311731183119311A311B311C311D311E311F +3120312131223123312431253126312731283129000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +29 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00000000000000002500250125022503250425052506250725082509250A250B +250C250D250E250F2510251125122513251425152516251725182519251A251B +251C251D251E251F2520252125222523252425252526252725282529252A252B +252C252D252E252F2530253125322533253425352536253725382539253A253B +253C253D253E253F2540254125422543254425452546254725482549254A254B +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +30 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000554A963F57C3632854CE550954C0769A764C85F977EE827E7919611B9698 +978D6C285B894FFA630966975CB880FA68489AAF660276CE51F9655671AC7FF1 +895650B2596561CA6FB382AD634C625253ED54277B06516B75A45DF462D48DCB +9776628A801958E997387F777238767D67CF767E64FA4F70655762DC7A176591 +73ED642C6273822C9812677F7248626E62CC4F3474E3534A8FA67D4690A65E6B +6886699C81807D8168D278C5868C938A508D8B1782DE80DE5305891252650000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +31 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000858496F94FDD582198FD5BF662B1583166B48C799B917206676F789160B2 +535153178F2980CC8C9D92C7500D72FD5099618A711988AB595482EF672C7B28 +5D297DB3752D6CF58E668FF8903C9F3B6BD491197B465F7C78A784D6853D7562 +65836BD65E635E8775F99589655D5F0A5FC58F9F58C181C2907F965B97AD908A +7DE88CB662414FBF8B8A535E8FA88FAF8FAE904D6A195F6A819888689C49618B +522B765F5F6C658C70156FF18CD364EF517551B067C44E1979C9990570B30000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +32 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000075C55E7673BB83E064AD64A592626CE2535A52C3640F92517B944F2F5E1B +82368116818A6E246CCA99C16355535C54FA88DC57E04E0D5E036B657C3F90E8 +601664E6731C88C16750624D8CA1776C8E2991C75F6983DC8521991053C38836 +6B98615A615871E684BC825950096EC485CF64CD7CD969FD66F9834953A07B56 +5074518C6E2C5C648E6D63D253C9832C833667E578B4643D5BDF5C945DEE8A6B +62C667F48C7A6519647B87EC995E8B927E8F93DF752395E1986B660C73160000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +33 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000583456175E389577511F81785EE0655E66A2553150218D8562849214671D +56326F6E5DE2543570928ECA626F64A463A35FB96F8890F481E38FB058756668 +5FF16C8996738D81896F64917A3157CE6A59621054484E587A0B61F26F848AA0 +627F901E9A0179E4540375F4630153196C6090725F1B99B3803B9F524F885C3A +8D647FC565A571BE5145885D87F25D075BF562BD916C75878E8A7A2061017C4C +4EC77DA27785919C81ED521D51FA6A7153A88E8792E496DB6EC19664695A0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +34 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000790E513277D7641089F8865563E35DDD7A7F693D50B3823955984E327621 +7A975E625E8A95D652755439708A6376931857826625693F918755076DF37D14 +882262337DBD75B5832878C196CC8FAD614874F78A5E6B64523A8CDC6B218070 +847156F153065F9E53E251D17C97918B7C074FC38EA57BE17AC464675D1450AC +810676017CB96DEC7FE067515B585BF878CB64AE641363AA632B932F642D9054 +7B5476296253592754466B7950A362345E366B864EE38CB8888B5F85902E0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +35 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00006020803D64D44E3955AE913264A381BD65E66C2E4F46619A6DE18A955F48 +86CB757664CB9EE885696A94520064178E4850125CF679B15C0E52307A3B60BC +905376D75FB75F9776848E6C71C8767B7B4977AA51F3912758244F4E6EF48FEA +65757B1B72C46ECC7FDF5AE162B55E95573084827B2C5E1D5F1F905E7DE0985B +63826EC778989EDE5178975B588A96FB4F4375385E9760E659606FB16BBF7889 +53FC96D551CB52016389540A91E38ABF8DCC7239789F87768FED8ADC758A0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +36 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00004E0176EF53EE91D898029F0E93205B9A8A024E22677151AC846361C252D5 +68DF4F97606B51CD6D1E515C62969B2596618C46901775D890FD77636BD272A2 +73688B80583577798CED675C934D809A5EA66E2159927AEF77ED935B6BB565B7 +7DDE58065151968A5C0D58A956788E726566981356E4920D76FE9041638754C6 +591A596A579B8EB267358DFA8235524160F058AE86FE5CE89D5D4FC4984D8A1B +5A2560E15384627C904F910299136069800C51528033723E990C6D314E8C0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +37 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00008CB3767C7F707B4F4F104E4F95A56CD573D085E95E06756A7FFB6A0A792C +91E97E4151E1716953CD8FD47BC48CA972AF98EF6CDB574A82B365B980AA623F +963259A84EFF8A2A7D21653E83F2975E556198DB80A5532A8AB9542080BA5EE2 +6CB88CBB82AC915A54296C1B52067D1B58B3711A6C7E7C89596E4EFD5FFF61A4 +7CDE8C505C01695387025CF092D298A8760B70FD902299AE7E2B8AF759499CF3 +4F5B5426592B6577819A5B75627662C28F3B5E456C1F7B264F0F4FD8670D0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +38 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00006D6E6DAA798F88B15F17752B64AB8F144FEF91DC65A7812F81515E9C8150 +8D74526F89868CE65FA950854ED8961C723681798CA05BCC8A0396445A667E1B +54905676560E8A7265396982922384CB6E895E797518674667D17AFF809D8D95 +611F79C665628D1B5CA1525B92FC7F38809B7DB15D176E2F67607BD9768B9AD8 +818F7F947CD5641E93AC7A3F544A54E56B4C64F162089D3F80F3759952729769 +845B683C86E495A39694927B500B54047D6668398DDF801566F45E9A7FB90000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +39 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000057C2803F68975DE5653B529F606D9F944F9B8EAC516C5BAB5F13978F6C5E +62F18CA25171920E52FE6E9D82DF72D757A269CB8CFC591F8F9C83C754957B8D +4F306CBD5B6459D19F1353E488319AA88C3780A16545986756FA96C7522E74DC +526E5BE1630289024E5662D0602A68FA95DC5B9851A089C07BA199287F506163 +704C8CAB51495EE3901B7470898F572D78456B789F9C95A88ECC9B3C8A6D7678 +68426AC38DEA8CB4528A8F256EDA68CD934B90ED570B679C88F9904E54C80000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +3A +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00009AB85B696D776C264EA55BB399ED916361A890AF97D3542B6DB55BD251FD +558A7F557FF064BC634D65F161BE608D710A6C576F22592F676D822A58D5568E +8C6A6BEB90DD597D8017865F6D695475559D837783CF683879BE548C4F555408 +76D28C8995A16CB36DB88D6B89109DB48CC0563F9ED175D55F8872E0606854FC +4EA86A2A886160528F5F54C470D886799D3B6D2A5B8F5F187D0555894FAF7334 +543C539A50195F8C547C4E4E5FFD745A58FA846B80E1877472D07CCA6E560000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +3B +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00005F27864E552C8B774E926EEC623782B1562983EF733E6ED1756B52835316 +8A7169D05F8A61F76DEE58DE6B6174B0685390847DE963DB60A3559A76138C62 +71656E195BA65E7B8352614C9EC478FA87577C27768751F060F6714C66435E4C +604D8B0A707063EE8F1D5FBD606286D456DE6BC160946167534960E066668CC4 +7A62670371F4532F8AF18AA87E6A8477660F5A5A9B426E3E6DF78C416D3B4F19 +706B7372621660D1970D8CA8798D64CA573E57FA6A5F75787A3D7A4D7B950000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +3C +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000808C99518FF96FC08B4F9DC459EC7E3E7DDD5409697568D88F2F7C4D96C6 +53CA602575BE6C7253735AC97D1A64E05E7E810A5DF1858A628051805B634F0E +796D529160B86FDF5BC45BC28A088A1865E25FCC969B59937E7C7D00560967B7 +593E4F735BB652A083A298308CC87532924050477A3C50F967B699D55AC16BB2 +76E358055C167B8B9593714E517C80A9827159787DD87E6D6AA267EC78B19E7C +63C064BF7C215109526A51CF85A66ABB94528E108CE4898B93757BAD4EF60000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +3D +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000050658266528D991E6F386FFA6F975EFA50F559DC5C076F3F6C5F75868523 +69F3596C8B1B532091AC964D854969127901712681A04EA490CA6F869A555B0C +56BC652A927877EF50E5811A72E189D299037E737D5E527F655991758F4E8F03 +53EB7A9663ED63A5768679F88857968E622A52AB7BC0685467706377776B7AED +6F547D5089E359D0621285C982A5754C501F4ECB75A58AA15C4A5DFE7B4B65A4 +91D14ECA6D25895F7DCA932650C58B3990329773664979818FD171FC6D780000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +3E +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000076E152C1834651628396775B66769BE84EAC9A5A7CBE7CB37D934E958B66 +666F9838975C5883656C93E15F9175D997567ADF7AF651C870AF7A9863EA7A76 +7CFE739697ED4E4570784E5D915253A96551820A81FC8205548E5C31759A97A0 +62D872D975BD5C4599D283CA5C40548077E982096CAE805A62D264DA5DE85177 +8DDD8E1E92F84FF153E561FC70AC528763509D515A1F5026773753777D796485 +652B628963985014723589BA51B38A237D76574783CC921E8ECD541B5CFB0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +3F +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00004FCA7AE36D5A90E199FF55805496536154AF958B63E9697751F16168520A +582A52D8574E780D770B5EB761777CE0625B62974EA27095800362F770E49760 +577782DB67EF68F578D5984679D16BBB54B353EF6E34514B523B5BA28AB280AF +554358BE61C75751542D7A7A60505B5463A7647353E362635BC767AF54ED7A9F +82E691775EAB89328A8757AE630E8DE880EF584A7B7751085FEB5BEC6B3E5321 +7B5072C268467926773666E051B5866776D45DCB7ABA8475594E9B4150800000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +40 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000994B61276F7057646606634656F062EC64F45ED395CA578362C95587881F +81D88FA35566840A4F868CF485CD5A6A6B0465147C4395CC862D703E8B95652C +89BD61F67E9C721B6FEB7405699472FC5ECA90CE67176D6A648852DE72628001 +4F6C59E5916A70D96F8752D26A0296F79433857E78CA7D2F512158D864C2808B +985E6CEA68F1695E51B7539868A872819ECE7C6C72F896E270557406674E88CF +9BC979AE83898354540F68179E9753B252F5792B6B77522950884F8B4FD00000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +41 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000075E27ACB7C92701D96B8529B748354E95006806F84EE9023942E5EC96190 +6F237C3E658281C993C8620071497DF47CE751C968817CB1826F51698F1B91CF +667E4EAE8AD264A9804A50DA764271CE5BE5907C6F664E86648294105ED66599 +521788C270C852A373757433679778F7971681E891309C576DCB51DB8CC3541D +62CE73B283F196F69F6192344F367F9A51CC974896755DBA981853E64EE46E9C +740969B4786B993E7559528976246D4167F3516D9F8D807E56A87C607ABF0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +42 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000968658DF650F96B46A135A41645F7C0D6F0F964B860676E798715EEC7210 +64C46EF7865C9B6F9E93788C97328DEF8CC29E7F6F5E798493329678622E9A62 +541592C14FA365C55C655C627E37616E6C2F5F8B73876FFE7DD15DD265235B7F +706453754E8263A0756563848F2A502B4F966DEA7DB88AD6863F87BA7F85908F +947C7C6E9A3E88F8843D6D1B99F17D615ABD9EBB746A78BC879E99AC99E1561B +55CE57CB8CB79EA58CE390818109779E9945883B6EFF851366FC61626F2B0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +43 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00008B3E8292832B76F26C135FD983BD732B830593286BDB77DB925A536F8302 +51925E3D8C8C8CBF9EBD73AB679A68859176970971646CA177095A9293826BCF +7F8E66275BD059B95A9A958060B65011840C84996AAC76DF9333731B59225B5F +772F919A97617CDC8FF78B0E5F4C7C7379D889936CCC871C5BC65E4268C97720 +7DBF5195514D52C95A297DEC976282D763CF778485D079D26E3A5EDF59998511 +6EC56C1162BF76BF654F61AB95A9660E879F9CF49298540D547D8B2C64780000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +44 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000647986116A21819C78E864699B5462B9672B83AB58A89ED86CAB6F205BDE +964C8B00725F67D062C77261755D59C66BCD589366AE5E5552DF6155672876EE +776672677A4662FF54EA5450920990A35A1C7D0D6C164E435976801059485357 +753796E356CA6493816660F19B276DD65462991251855AE980FD59AE9713502A +6CE55C3C64EC4F60533F81A990066EBA852B62C85E7478BE6506637B5FF55A18 +91C09CE55C3F634F80765B7D5699947793B36D8560A86AB8737051DD5BE70000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +45 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000064F06FD8725B626D92157D1081BF6FC38FB25F04597452AA601259736696 +86507627632A61E67CEF8AFE54E66B509DD76BC685D5561450766F1A556A8DB4 +722C5E156015743662CD6392724C5F986E436D3E65006F5876E478D076FC7554 +522453DB4E539F9065C1802A80D6629B5486522870AE888D8DD16CE1547880DA +57F988F48CE0966A914D4F696C9B567476C6783062A870F96F8E5F6D84EC68DA +787C7BF781A8670B9D6C636778B0576F78129739627962AB528874356BD70000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +46 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00005564813E75B276AE533975DE50FB5C418B6C7BC7504F72479A1998C46F02 +74E27968648777A562FC983B8CA754C180584E52576A860B840D5E73619174F6 +8A555C4F57616F5198175A4678349B448FEB7C95525664B292EA50D583868461 +83E984B257D46A385703666E6D668B5C66DD7011671F6B3A68F2621A59BB4E03 +51C46F0667D26C8F517668CB59476B6775665D0E81CD9F4A65D7794879419A0E +8D778C484E5E4F0155535951780C56686C238FC468C46C7D6CE38A1663900000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +47 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000060706D3D727D626691FA925B534390777C3D4EDF8B194E7E9ED493229257 +524D6F5B90636DFA8B7458795D4C6B206B4969CD55C681547F8C58BB85945F3A +64366A47936C657260846A4B77A755AC50D15DE7979864AC7FF95CED4FCF7AC5 +520783044E14602F7ACA6B3D4FB589AA79E6743452E482B964D279BD5BE26C81 +97528F156C2B50BE537F6E0564CE66746C3060C598038ACB617674CA7AAE79CB +4E1890B174036C4256DA914B6CC58DA8534086C666F28EC05C489A456E200000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +48 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000053D65A369F728DA353BB570898746B0A919B6CC9516875CA62F372AC5238 +52F87F3A7094763853749D7269B778BA96C088D97FA4713671C3518967D374E4 +58E4651856B78B93995264FE7E5E60F971B158EC4EC14EBA5FCD97CC4EFB8A8D +5203598A7D0962544ECD65E5620E833884C969AE878D71946EB65BB97D685197 +63C967D480898339881551125B7A59828FB14E736C5D516589258EDF962E854A +745E92ED958F6F6482E55F316492705185A9816E9C13585E8CFD4E0953C10000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +49 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000050986563685155D355AA64149A3763835AC2745F82726F8068EE50E7838E +78026BBA52396C997D1750BB5565715E7BE966EC73CA82EB67495C715220717D +886B9583965D64C58D0D81B355846C5562477E55589250B755468CDE664C4E0A +5C1A88F368A2634E7A0D71D2828D52FA97F65C1154E890B57D3959628CD286C7 +820C63688D66651D5C0461FE6D89793E8A2D78377533547B4F388EAB6DF15A20 +7D33795E6C885BE95B38751A814E614E6EF28072751F7525727253477E690000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +4A +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000770176DB526952DD80565E2B5931734565BD6FD58A695C388671534177F3 +62FE66424EC098DF87555BE68B5853F277E24F7F5C4E99DB59CB5F0F793A58EB +4E1667FF4E8B62ED8A93901D52E2662F55DC566C90694ED54F8D91CB98FE6C0F +5E0260435BA489968A666536624B99965B8858FD6388552E53D776267378852C +6A1E68B36B8A62928F3853D482126DD1758F66F88D165B70719F85AF669166D9 +7F7287009ECD9F205C6C88538FF06A39675F620D7AEA58855EB665786F310000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +4B +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000060555237800D6454887075295E25681362F4971C96D9723D8AB06C347761 +7A0E542E77AC9806821C8AAC78A96714720D65AF64955636601D79C153F87D72 +6B7B80865BFA55E356DB4F3A4F3C98FC5DF39B068073616B980C90015B8B8A1F +8AA6641C825864FB55FD860791654FD77D20901F7C9F50F358516EAF5BBF8A34 +80859178849C7B9796D6968B96A87D8F9AD3788E6B727A57904296A7795F5B6B +640D7B0B84D168AD55067E2E74637D2293966240584C4ED65B83597958540000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +4C +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000737A64BB8E4B8E0F80CE82D462AC81FA6CF0915E592A614B6C70574D6524 +8CAA7671705858C76A8075F06F6D8B5A8AC757666BEF889278B363A2560670AD +6E6F5858642A580268E0819B55107CD650188EBA6DCC8D9F71D9638F6FE46ED4 +7E278404684390036DD896768A0E5957727985E49A3075BC8B0468AF52548E22 +92BB63D0984C8E44557C9AD466FF568F60D56D9552435C4959296DFB586B7530 +751C606C821481466311689D8FE2773A8DF38CBC94355E165EF3807D70F40000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +4D +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00006C405EF7505C4EAD5EAD633A8247901A6850916E77B3540C92855F647AE5 +687663457B527D7175DB50776295982D900F51F879C37A8157165F9290145857 +5C60571F541051546E4D571863A8983D817F8715892A9000541E5C6F81C062D6 +625881319D15964099B199DD6A6259A562D3553E631654C786D97AAA5A0374E6 +896A6B6A59168C4C5F4E706373A998114E3870F75B8C7897633D665A769660CB +5B9B5A49842C81556C6A738B4EA167897DB25F8065FA671B5FD859845A010000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +4E +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00005DCD5FAE537197CB90556845570D552F60DF72326FF07DAD8466840E59D4 +504950DE5C3E7DEF672A851A5473754F80C355829B4F4F4D6E2D8B025C096170 +885B761F6E29868A6587805E7D0B543B7A697D0A554F55E17FC174EE64BE8778 +6E267AA9621165A1536763E16C835DEB55DA93A270CF6C618AA35C4B7121856A +68A7543E54346BCB6B664E9463425348821E4F0D4FAE5862620A972766647269 +52FF52D9609F8AA4661471996790897F785277FD6670563B5438932B72A70000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +4F +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00007A00606F5E0C6089819D591560DC718470EF6EAA6C5072806A8489725E2D +7FD25AB3559C92916D177CFB969962327D30778E87665323971E8F4466875CFD +4FE072F94E0B53A6590F56876380934151484ED99BAE7E9654B88CE2929C8237 +95916D8E5F265ACC986F96AA73FE737B7E23817A99217FA161B2967796507DAB +76F853A2947299997BB189446E5891097FD479658A7360F397FF4EAB98055DF7 +6A6150CF54118C61856D785D9704524A54EE56C292B76D885BB56DC666C90000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +50 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00005C0F5B5D68218096562F7B11654869544E9B6B47874E978B5354633E643A +90AA659C81058AE75BEB68B0537887F961C86CC470098B1D5C5185AA82AF92C5 +6B238F9B65B05FFB5FC34FE191C1661F8165732960FA82085211578B5F6290A2 +884C91925E78674F602759D3514451F680F853086C7996C4718A4F114FEE7F9E +673D55C592B979C088967D89589F620C9700865A561898085F908A3184C49157 +53D965ED5E8F755C60647D6E5A7F7DD27E8C8ED255A75BA361F865CB73840000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +51 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00009078766C77297D629774859B5B787A7496EA884052DB718F5FAA65EC8A62 +5C0B99B45DE16B896C5B8A138A0A905C8FC558D362BC9D099D2854404E2B82BD +7259869C5D1688596DAF96C5555E4E9E8A1D710954BD95B970DF6DF99E7D56B4 +781487125CA95EF68A00985495BB708E6CBF594463A9773C884D6F1482775830 +71D553AD786F96C155015F6671305BB48AFA9A576B83592E9D2679E7694A63DA +4F6F760D7F8A6D0B967D6C274EF07662990A6A236F3E90808170599674760000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +52 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00006447582F90657A918B2159DA54AC820085E5898180006930564E8036723A +91CE51B64E5F98016396696D844966F3814B591C6DB24E0058F991AB63D692A5 +4F9D4F0A886398245937907A79FB510080F075916C825B9C59E85F5D690587FB +501A5DF24E5977E34EE585DD6291661390915C7951045F7981C69038808475AB +4EA688D4610F6BC561B67FA976CA6EA28A638B708ABC8B6F5F027FFC7FCC7E79 +8335852D56E06BB797F3967059FB541F92806DEB5BC598F25C395F1596B10000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +53 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000537082F16AFB5B309DF961C97E93746987A271DF719288058FCE8D0F76C8 +5F717A4E786C662055B264C150AD81C376705EB896CD8E3486F9548F6CF36D8C +6C38607F52C775285E7D512A60A061825C24753190F5923E73366CB96E389149 +670953CB53F34F5191C98A9853C85E7C8FC26DE44E8E76C26986865E611A8F3F +99184FDE903E9B5A61096E1D6F0196854E885A3196E882075DBC79B95B878A9E +7FBD738957DF828B9B315401904755BB5CEA5FA161086B32734480B28B7D0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +54 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00006D745BD388D598108C6B99AD9D1B6DF551A4514357A38881539F63F48F45 +571254E15713733F6E907DE3906082D198586028966266F07D048D8A8E8D9470 +5CB37CA4670860A695B2801896F29116530096955141904B85F49196668897F5 +5B55531D783896DC683D54C9707E5BB08F09518D572854B1652266AB8D0A8D1C +81DF846C906D7CDF947F85FB68D765E96FA186A48E81566A902076827AC871E5 +8CAC64C752476FA48CCA600E589E618E66FE8D08624E55B36E23672D8ECB0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +55 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000935895987728680569A8548B4E4D70B88A5064589F4B5B857A8450B55BE8 +77BB6C088A797C986CBE76DE65AC8F3E5D845C55863868E7536062307AD96E5B +7DBB6A1F7AE05F706F335F35638C6F3267564E085E338CEC4ED781397634969C +62DB662D627E6CBC8D9971677F695146808753EC906E629854F287C48F4D8005 +937A851790196D5973CD659F771F7504782781FB8C9E91DD5075679575B98A3A +9707632F93AE966384B86399775C5F817319722D6014657462EF6B63653F0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +56 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00005E407665912D8B49829D679D652F5431871877E580A281026C414E4B7E54 +807776F4690D6B9657F7503C4F84574063076B628DBE887965E87D195FD7646F +64F281F381F47F6E5E5F5CD95236667A79E97A1A8CEA709975D46EEF6CBB7A92 +4E2D76C55FE0941888777D427A2E816B91CD4EF28846821F54685DDE6D328B05 +7CA58EF880985E1A549276BA5B99665D9A5F73E0682A86DB6731732A8AF88A85 +90107AF971ED716E62C477DA56D14E3B845767F152A986C08CAF94447BC90000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +57 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00004F4F6CE8795D99D06293722A62FD5C0878DA8F4964B08CFA7BC66A01838A +88DD599D649E58EF72C0690E93108FFD8D05589C7DB48AC46E96634962D95353 +684C74228301914C55447740707C6FC1517954A88CC759FF6ECB6DC45B5C7D2B +4ED47C7D6ED35B5081EA6F2C5B579B0368D58E2A5B977D9C7E3D7E3191128D70 +594F63CD79DF8DB3535265CF79568A5B963B7D44947D7E825634918967007F6A +5C0A907566285DE64F5067DE505A4F5C57505EA7000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +58 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00004E8D4E0C51404E105EFF53454E154E984E1E9B325B6C56694E2879BA4E3F +53154E47592D723B536E6C1056DF80E499976BD3777E9F174E364E9F9F104E5C +4E694E9382885B5B55C7560F4EC45399539D53B453A553AE97688D0B531A53F5 +532D5331533E8CFE5366536352025208520E52445233528C5274524C525E5261 +525C84AF527D528252815290529351827F544EBB4EC34EC94EC24EE84EE14EEB +4EDE50B44EF34F224F644EF5500050964F094F474F5E4F6765384F5A4F5D0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +59 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00004F5F4F574F324F3D4F764F744F914F894F834F8F4F7E4F7B51154F7C5102 +4F945114513C51374FC54FDA4FE34FDC4FD14FDF4FF85029504C4FF3502C500F +502E502D4FFE501C500C5025502850E8504350555048504E506C50C2513B5110 +513A50BA50D6510650ED50EC50E650EE5107510B4EDD6C3D4F5850C94FCE9FA0 +6C467CF4516E5DFD9ECC999856C5591452F9530D8A0753109CEC591951554EA0 +51564EB3886E88A4893B81E088D279805B3488037FB851AB51B151BD51BC0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +5A +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000051C7519651A251A58A018A108A0C8A158B338A4E8A258A418A368A468A54 +8A588A528A868A848A7F8A708A7C8A758A6C8A6E8ACD8AE28A618A9A8AA58A91 +8A928ACF8AD18AC98ADB8AD78AC28AB68AF68AEB8B148B018AE48AED8AFC8AF3 +8AE68AEE8ADE8B288B9C8B168B1A8B108B2B8B2D8B568B598B4E8B9E8B6B8B96 +5369537A961D962296219631962A963D963C964296589654965F9689966C9672 +96749688968D969796B09097909B913A9099911490A190B490B390B691340000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +5B +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000090B890B090DF90C590BE913690C490C79106914890E290DC90D790DB90EB +90EF90FE91049122911E91239131912F91399143914682BB595052F152AC52AD +52BE54FF52D052D652F053DF71EE77CD5EF451F551FC9B2F53B65F01755A5DF0 +574C580A57A1587E58BC58C558D15729572C572A573358D9572E572F58E2573B +5742576958E0576B58DA577C577B5768576D5776577357E157A4578C584F57CF +57A75816579357A057D55852581D586457D257B857F457EF57F857E457DD0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +5C +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000580B580D57FD57ED5800581E5819584458205865586C58815889589A5880 +99A89F1961FF8279827D827F828F828A82A88284828E8291858C829982AB8553 +82BE82B085F682CA82E3829882B782AE83A7840784EF82A982B482A182AA829F +82C482E782A482E1830982F782E48622830782DC82F482D282D8830C82FB82D3 +8526831A8306584B716282E082D5831C8351855884FD83088392833C83348331 +839B854E832F834F8347834385888340831785BA832D833A833372966ECE0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +5D +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00008541831B85CE855284C08452846483B083788494843583A083AA8393839C +8385837C859F83A9837D8555837B8398839E83A89DAF849383C1840183E583D8 +58078418840B83DD83FD83D6841C84388411840683D483DF840F840383F883F9 +83EA83C583C07E0883F083E1845C8451845A8459847385468488847A85628478 +843C844684698476851E848E8431846D84C184CD84D09A4084BD84D384CA84BF +84BA863A84A184B984B4849793A38577850C750D853884F0861E851F85FA0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +5E +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00008556853B84FF84FC8559854885688564855E857A77A285438604857B85A4 +85A88587858F857985EA859C858585B985B785B0861A85C185DC85FF86278605 +86298616863C5EFE5F08593C596980375955595A5958530F5C225C255C2C5C37 +624C636B647662BB62CA62DA62D762EE649F62F66339634B634363AD63F66371 +637A638E6451636D63AC638A636963AE645C63F263F863E064B363C463DE63CE +645263C663BE65046441640B641B6420640C64266421645E6516646D64960000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +5F +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000647A64F764FC6499651B64C064D064D764E464E265096525652E5F0B5FD2 +75195F11535F53F1563053E953E853FB541254165406544B563856C8545456A6 +54435421550454BC5423543254825494547754715464549A5680548454765466 +565D54D054AD54C254B4566054A754A6563555F6547254A3566654BB54BF54CC +567254DA568C54A954AA54A4566554CF54DE561C54E7562E54FD551454F355E9 +5523550F55115527552A5616558F55B5554956C055415555553F5550553C0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +60 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00005537555655755576557755335530555C558B55D2558355B155B955885581 +559F557E55D65591557B55DF560D56B35594559955EA55F755C9561F55D156C1 +55EC55D455E655DD55C455EF55E555F2566F55CC55CD55E855F555E48F61561E +5608560C560156B6562355FE56005627562D565856395657562C564D56625659 +5695564C5654568656645671566B567B567C5685569356AF56D456D756DD56E1 +570756EB56F956FF5704570A5709571C5E435E195E145E115E6C5E585E570000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +61 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00005E375E445E545E5B5E5E5E615C8C5C7A5C8D5C905D875C885CF45C995C91 +5D505C9C5CB55CA25D2C5CAC5CAB5CB15CA35CC15CB75DA75CD25DA05CCB5D22 +5D975D0D5D275D265D2E5D245D1E5D065D1B5DB85D3E5D345D3D5D6C5D5B5D6F +5D815D6B5D4B5D4A5D695D745D825D995D9D8C735DB75DD45F735F775F825F87 +5F89540E5FA05F995F9C5FA85FAD5FB55FBC88625F6172AD72B072B473777341 +72C372C172CE72CD72D272E8736A72E9733B72F472F7730172F3736B72FA0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +62 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000072FB731773137380730A731E731D737C732273397325732C733873317350 +734D73577360736C736F737E821B592598E75924590298E0993398E9993C98EA +98EB98ED98F4990999114F59991B9937993F994399489949994A994C99625E80 +5EE15E8B5E965EA55EA05EB95EB55EBE5EB38CE15ED25ED15EDB5EE85EEA81BA +5FC45FC95FD661FA61AE5FEE616A5FE15FE4613E60B561345FEA5FED5FF86019 +60356026601B600F600D6029602B600A61CC6021615F61E860FB613760420000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +63 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000606A60F26096609A6173609D60836092608C609B611C60BB60B160DD60D8 +60C660DA60B4612061926115612360F46100610E612B614A617561AC619461A7 +61B761D461F55FDD96B39582958695C8958E9594958C95E595AD95AB9B2E95AC +95BE95B69B2995BF95BD95BC95C395CB95D495D095D595DE4E2C723F62156C35 +6C546C5C6C4A70436C856C906C946C8C6C686C696C746C766C866F596CD06CD4 +6CAD702770186CF16CD76CB26CE06CD66FFC6CEB6CEE6CB16CD36CEF6D870000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +64 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00006D396D276D0C6D796E5E6D076D046D196D0E6D2B6FAE6D2E6D356D1A700F +6EF86F6F6D336D916D6F6DF66F7F6D5E6D936D946D5C6D606D7C6D636E1A6DC7 +6DC56DDE70066DBF6DE06FA06DE66DDD6DD9700B6DAB6E0C6DAE6E2B6E6E6E4E +6E6B6EB26E5F6E866E536E546E326E256E4470676EB16E9870446F2D70056EA5 +6EA76EBD6EBB6EB76F776EB46ECF6E8F6EC26E9F6F627020701F6F246F156EF9 +6F2F6F3670326F746F2A6F096F296F896F8D6F8C6F786F726F7C6F7A70280000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +65 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00006FC96FA76FB96FB66FC26FE16FEE6FDE6FE06FEF701A7023701B70397035 +705D705E5B805B845B955B935BA55BB8752F9A2B64345BE45BEE89305BF08E47 +8B078FB68FD38FD58FE58FEE8FE490878FE690158FE890059004900B90909011 +900D9016902190359036902D902F9044905190529050906890589062905B66B9 +9074907D908290889083908B5F505F575F565F585C3B54AB5C505C595B715C63 +5C687FBC5F335F295F2D82745F3C9B3B5C6E59815983598D5AF55AD759A30000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +66 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000599759CA5B00599E59A459D259B259AF59D759BE5A6D5B0859DD5B4C59E3 +59D859F95A0C5A095AA75AFB5A115A235A135A405A675A4A5A555A3C5A625B0B +80EC5AAA5A9B5A775A7A5ABE5AEB5AB25B215B2A5AB85AE05AE35B195AD65AE6 +5AD85ADC5B095B175B165B325B375B405C155C1C5B5A5B655B735B515B535B62 +99D499DF99D99A369A5B99D199D89A4D9A4A99E29A6A9A0F9A0D9A059A429A2D +9A169A419A2E9A389A439A449A4F9A659A647CF97D067D027D077D087E8A0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +67 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00007D1C7D157D137D3A7D327D317E107D3C7D407D3F7D5D7D4E7D737D867D83 +7D887DBE7DBA7DCB7DD47DC47D9E7DAC7DB97DA37DB07DC77DD97DD77DF97DF2 +7E627DE67DF67DF17E0B7DE17E097E1D7E1F7E1E7E2D7E0A7E117E7D7E397E35 +7E327E467E457E887E5A7E527E6E7E7E7E707E6F7E985E7A757F5DDB753E9095 +738E74A3744B73A2739F73CF73C274CF73B773B373C073C973C873E573D9980A +740A73E973E773DE74BD743F7489742A745B7426742574287430742E742C0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +68 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000741B741A7441745C74577455745974A6746D747E749C74D4748074817487 +748B749E74A874A9749074A774DA74BA97D997DE97DC674C6753675E674869AA +6AEA6787676A677367986898677568D66A05689F678B6777677C67F06ADB67D8 +6AF367E967B06AE867D967B567DA67B367DD680067C367B867E26ADF67C16A89 +68326833690F6A48684E6968684469BF6883681D68556A3A68416A9C68406B12 +684A6849682968B5688F687468776893686B6B1E696E68FC6ADD69E768F90000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +69 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00006B0F68F0690B6901695768E369106971693969606942695D6B16696B6980 +69986978693469CC6AEC6ADA69CE6AF8696669636979699B69A769BB69AB69AD +69D469B169C169CA6AB369956AE7698D69FF6AA369ED6A176A186A6569F26A44 +6A3E6AA06A506A5B6A356A8E6AD36A3D6A286A586ADE6A916A906AA96A976AAB +733773526B816B826BA46B846B9E6BAE6B8D6BAB6B9B6BAF6BAA8ED48EDB8EF2 +8EFB8F648EF98EFC8EEB8EE48F628EFA8EFE8F0A8F078F058F128F268F1E0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +6A +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00008F1F8F1C8F338F468F548ECE62146227621B621F62226221622562246229 +81E7750C74F474FF750F75117513653465EE65EF65F0660A66C7677266036615 +6600708566F7661D66346631663666358006665F66C46641664F668966616657 +66776684668C66D6669D66BE66DB66DC66E666E98CC18CB08CBA8CBD8D048CB2 +8CC58D108CD18CDA8CD58CEB8CE78CFB899889AC89A189BF89A689AF89B289B7 +726E729F725D7266726F727E727F7284728B728D728F72926308633263B00000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +6B +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000643F64D880046BEA6BF36BFD6BFF6BF96C056C0C6C066C0D6C156C186C19 +6C1A6C216C2C6C246C2A6C3265356555656B725872527256723086625216809F +809C809380BC670A80BD80B180AB80AD80B480B76727815680E981DA80DB80C2 +80C480D980CD80D7671080DD811B80F180F480ED81BE810E80F280FC67158112 +8C5A8161811E812C811881328148814C815381748159815A817181608169817C +817D816D8167584D5AB58188818281CF6ED581A381AA81CC672681CA81BB0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +6C +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000081C181A66B5F6B376B396B436B466B5998AE98AF98B698BC98C698C86BB3 +5F408F4289F365909F4F659565BC65C665C465C365CC65CE65D265D6716C7152 +7096719770BB70C070B770AB70B171C170CA7110711371DC712F71317173715C +716871457172714A7178717A719871B371B571A871A071E071D471E771F9721D +7228706C71FE716671B9623E623D624362486249793B794079467949795B795C +7953795A79B079577960798E7967797A79AA798A799A79A779B35FD15FD00000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +6D +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000061DF605D605A606760416059606361646106610D615D61A9619D61CB61E3 +62078080807F6C936FA96DFC78EF77F878AD780978687818781165AB782D78B8 +781D7839792A7931781F783C7825782C78237829784E786D786478FD78267850 +7847784C786A78E77893789A788778E378A178A378B278B978A578D478D978C9 +78EC78F2790578F479137924791E79349F959EF99EFB9EFC76F17704779876F9 +77077708771A77227719772D772677357738775E77BC77477743775A77680000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +6E +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000077627765777F778D777D7780778C7791779F77A077B077B577BD753A7540 +754E754B7548755B7572757975837F587F617F5F8A487F687F867F717F797F88 +7F7E76CD76E5883291D291D391D491D991D791D591F791E791E4934691F591F9 +9208922692459211921092019227920492259200923A9266923792339255923D +9238925E926C926D923F9460923092499248924D922E9239943892AC92A0927A +92AA92EE92CF940392E3943A92B192A693A7929692CC92A993F59293927F0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +6F +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000093A9929A931A92AB9283940B92A892A39412933892F193D792E592F092EF +92E892BC92DD92F69426942792C392DF92E6931293069369931B934093019315 +932E934393079308931F93199365934793769354936493AA9370938493E493D8 +9428938793CC939893B893BF93A693B093B5944C93E293DC93DD93CD93DE93C3 +93C793D19414941D93F794659413946D9420947993F99419944A9432943F9454 +9463937E77E777EC96C979D579ED79E379EB7A065D477A037A027A1E7A140000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +70 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00007A397A377A619ECF99A57A707688768E7693769976A474DE74E0752C9CE9 +9CF69D079D069D239D879E159D1D9D1F9DE59D2F9DD99D309D429E1E9D539E1D +9D609D529DF39D5C9D619D939D6A9D6F9D899D989D9A9DC09DA59DA99DC29DBC +9E1A9DD39DDA9DEF9DE69DF29DF89E0C9DFA9E1B7592759476647658759D7667 +75A375B375B475B875C475B175B075C375C2760275CD75E3764675E675E47647 +75E7760375F175FC75FF761076007649760C761E760A7625763B761576190000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +71 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000761B763C762276207640762D7630766D76357643766E7633764D76697654 +765C76567672766F7FCA7AE67A787A797A807A867A887A957AC77AA07AAC7AA8 +7AB67AB3886488698872887D887F888288A2896088B788BC88C9893388CE895D +894788F1891A88FC88E888FE88F08921891989138938890A8964892B89368941 +8966897B758B80E576B876B477DC801280148016801C8020802E80258026802C +802980288031800B803580438046807980528075807189839807980E980F0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +72 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00009821981C6F4198269837984E98539873986298599865986C9870864D8654 +866C87E38806867A867C867B86A8868D868B8706869D86A786A386AA869386A9 +86B686C486B5882386B086BA86B186AF86C987F686B486E986FA87EF86ED8784 +86D0871386DE881086DF86D886D18703870786F88708870A870D87098723873B +871E8725872E871A873E87C88734873187298737873F87828722877D8811877B +87608770874C876E878B8753876387BB876487598765879387AF87CE87D20000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +73 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000087C68788878587AD8797878387AB87E587AC87B587B387CB87D387BD87D1 +87C087CA87DB87EA87E087EE8816881387FE880A881B88218839883C7F367F4C +7F447F4582107AFA7AFD7B087BE47B047B677B0A7B2B7B0F7B477B387B2A7B19 +7B2E7B317B207B257B247B337C697B1E7B587BF37B457B757B4C7B8F7B607B6E +7B7B7B627B727B717B907C007BCB7BB87BAC7B9D7C5C7B857C1E7B9C7BA27C2B +7BB47C237BC17BCC7BDD7BDA7BE57BE67BEA7C0C7BFE7BFC7C0F7C6A7C0B0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +74 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00007C1F7C2A7C267C387C5F7C4081FE82018202820481EC8844822182228264 +822D822F8228822B8238826B82338234823E82448249824B824F825A825F8268 +887E88CA888888D888DF895E7F9D7FA57FA77FAF7FB07FB27C7C65497C917CF2 +7CF67C9E7CA27CB27CBC7CBD7CDD7CC77CCC7CCD7CC87CC57CD77CE8826E66A8 +7FBF7FCE7FD57FE57FE17FE67FE97FEE7FF37CF87E367DA67DAE7E477E9B9EA9 +9EB48D738D848D948D918DB28D678D6D8C478C49914A9150914E914F91640000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +75 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00009162916191709169916F91C591C3917291749179918C91859190918D9191 +91A291A391AA91AD91AE91AF91B591B491BA8C559E7A8E898DEB8E058E598E69 +8DB58DBF8DBC8DBA8E4C8DD68DD78DDA8E928DCE8DCF8DDB8DC68DEC8E7A8E55 +8DE38E9A8E8B8DE48E098DFD8E148E1D8E1F8E938E2E8E238E918E3A8E408E39 +8E358E3D8E318E498E418E428EA18E638E4A8E708E768E7C8E6F8E748E858EAA +8E948E908EA68E9E8C788C828C8A8C858C988C94659B89D689F489DA89DC0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +76 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000089E589EB89F68A3E8B26975A96E9974296EF9706973D9708970F970E972A +97449730973E9F549F5F9F599F609F5C9F669F6C9F6A9F779EFD9EFF9F0996B9 +96BC96BD96CE96D277BF8B8E928E947E92C893E8936A93CA938F943E946B9B77 +9B749B819B839B8E9C787A4C9B929C5F9B909BAD9B9A9BAA9B9E9C6D9BAB9B9D +9C589BC19C7A9C319C399C239C379BC09BCA9BC79BFD9BD69BEA9BEB9BE19BE4 +9BE79BDD9BE29BF09BDB9BF49BD49C5D9C089C109C0D9C129C099BFF9C200000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +77 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00009C329C2D9C289C259C299C339C3E9C489C3B9C359C459C569C549C529C67 +977C978597C397BD979497C997AB97A397B297B49AB19AB09AB79DBB9AB69ABA +9ABC9AC19AC09ACF9AC29AD69AD59AD19B459B439B589B4E9B489B4D9B519957 +995C992E995599549ADF9AE19AE69AEF9AEB9AFB9AED9AF99B089B0F9B229B1F +9B234E489EBE7E3B9E829E879E889E8B9E9293D69E9D9E9F9EDB9EDC9EDD9EE0 +9EDF9EE29EF79EE79EE59EF29EEF9F229F2C9F2F9F399F379F3D9F3E9F440000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +78 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000896C95C693365F4685147E94538251B24E119F635679515A6DC09F156597 +56419AEE83034E3089075E727A4098B35E7F95A49B0D52128FF45F597A6B98E2 +51E050A24EF7835085915118636E6372524B5938774F8721814A7E8D91CC66C6 +5E1877AD9E7556C99EF46FDB61DE77C770309EB5884A95E282F951ED62514EC6 +673497C67C647E3497A69EAF786E820D672F677E56CC53F098B16AAF7F4E6D82 +7CF04E074FC27E6B9E7956AE9B1A846F53F690C179A67C72613F4E919AD20000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +79 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000075C796BB53EA7DFB88FD79CD78437B5151C6000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 diff --git a/env/tcl/tcl8.6/encoding/gb1988.enc b/env/tcl/tcl8.6/encoding/gb1988.enc new file mode 100644 index 0000000..298732c --- /dev/null +++ b/env/tcl/tcl8.6/encoding/gb1988.enc @@ -0,0 +1,20 @@ +# Encoding file: gb1988, single-byte +S +003F 0 1 +00 +0000000100020003000400050006000700080009000A000B000C000D000E000F +0010001100120013001400150016001700180019001A001B001C001D001E001F +002000210022002300A500250026002700280029002A002B002C002D002E002F +0030003100320033003400350036003700380039003A003B003C003D003E003F +0040004100420043004400450046004700480049004A004B004C004D004E004F +0050005100520053005400550056005700580059005A005B005C005D005E005F +0060006100620063006400650066006700680069006A006B006C006D006E006F +0070007100720073007400750076007700780079007A007B007C007D203E007F +0080008100820083008400850086008700880089008A008B008C008D008E008F +0090009100920093009400950096009700980099009A009B009C009D009E009F +0000FF61FF62FF63FF64FF65FF66FF67FF68FF69FF6AFF6BFF6CFF6DFF6EFF6F +FF70FF71FF72FF73FF74FF75FF76FF77FF78FF79FF7AFF7BFF7CFF7DFF7EFF7F +FF80FF81FF82FF83FF84FF85FF86FF87FF88FF89FF8AFF8BFF8CFF8DFF8EFF8F +FF90FF91FF92FF93FF94FF95FF96FF97FF98FF99FF9AFF9BFF9CFF9DFF9EFF9F +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 diff --git a/env/tcl/tcl8.6/encoding/gb2312-raw.enc b/env/tcl/tcl8.6/encoding/gb2312-raw.enc new file mode 100644 index 0000000..813d7a6 --- /dev/null +++ b/env/tcl/tcl8.6/encoding/gb2312-raw.enc @@ -0,0 +1,1380 @@ +# Encoding file: gb2312, double-byte +D +233F 0 81 +21 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000030003001300230FB02C902C700A8300330052015FF5E2225202620182019 +201C201D3014301530083009300A300B300C300D300E300F3016301730103011 +00B100D700F72236222722282211220F222A222922082237221A22A522252220 +23122299222B222E2261224C2248223D221D2260226E226F22642265221E2235 +22342642264000B0203220332103FF0400A4FFE0FFE1203000A7211626062605 +25CB25CF25CE25C725C625A125A025B325B2203B219221902191219330130000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +22 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000024882489248A248B248C248D248E248F2490249124922493249424952496 +249724982499249A249B247424752476247724782479247A247B247C247D247E +247F248024812482248324842485248624872460246124622463246424652466 +2467246824690000000032203221322232233224322532263227322832290000 +00002160216121622163216421652166216721682169216A216B000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +23 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000FF01FF02FF03FFE5FF05FF06FF07FF08FF09FF0AFF0BFF0CFF0DFF0EFF0F +FF10FF11FF12FF13FF14FF15FF16FF17FF18FF19FF1AFF1BFF1CFF1DFF1EFF1F +FF20FF21FF22FF23FF24FF25FF26FF27FF28FF29FF2AFF2BFF2CFF2DFF2EFF2F +FF30FF31FF32FF33FF34FF35FF36FF37FF38FF39FF3AFF3BFF3CFF3DFF3EFF3F +FF40FF41FF42FF43FF44FF45FF46FF47FF48FF49FF4AFF4BFF4CFF4DFF4EFF4F +FF50FF51FF52FF53FF54FF55FF56FF57FF58FF59FF5AFF5BFF5CFF5DFFE30000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +24 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000304130423043304430453046304730483049304A304B304C304D304E304F +3050305130523053305430553056305730583059305A305B305C305D305E305F +3060306130623063306430653066306730683069306A306B306C306D306E306F +3070307130723073307430753076307730783079307A307B307C307D307E307F +3080308130823083308430853086308730883089308A308B308C308D308E308F +3090309130923093000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +25 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000030A130A230A330A430A530A630A730A830A930AA30AB30AC30AD30AE30AF +30B030B130B230B330B430B530B630B730B830B930BA30BB30BC30BD30BE30BF +30C030C130C230C330C430C530C630C730C830C930CA30CB30CC30CD30CE30CF +30D030D130D230D330D430D530D630D730D830D930DA30DB30DC30DD30DE30DF +30E030E130E230E330E430E530E630E730E830E930EA30EB30EC30ED30EE30EF +30F030F130F230F330F430F530F6000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +26 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000039103920393039403950396039703980399039A039B039C039D039E039F +03A003A103A303A403A503A603A703A803A90000000000000000000000000000 +000003B103B203B303B403B503B603B703B803B903BA03BB03BC03BD03BE03BF +03C003C103C303C403C503C603C703C803C90000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +27 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000004100411041204130414041504010416041704180419041A041B041C041D +041E041F0420042104220423042404250426042704280429042A042B042C042D +042E042F00000000000000000000000000000000000000000000000000000000 +000004300431043204330434043504510436043704380439043A043B043C043D +043E043F0440044104420443044404450446044704480449044A044B044C044D +044E044F00000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +28 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000010100E101CE00E0011300E9011B00E8012B00ED01D000EC014D00F301D2 +00F2016B00FA01D400F901D601D801DA01DC00FC00EA00000000000000000000 +0000000000000000000031053106310731083109310A310B310C310D310E310F +3110311131123113311431153116311731183119311A311B311C311D311E311F +3120312131223123312431253126312731283129000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +29 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00000000000000002500250125022503250425052506250725082509250A250B +250C250D250E250F2510251125122513251425152516251725182519251A251B +251C251D251E251F2520252125222523252425252526252725282529252A252B +252C252D252E252F2530253125322533253425352536253725382539253A253B +253C253D253E253F2540254125422543254425452546254725482549254A254B +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +30 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000554A963F57C3632854CE550954C07691764C853C77EE827E788D72319698 +978D6C285B894FFA630966975CB880FA684880AE660276CE51F9655671AC7FF1 +888450B2596561CA6FB382AD634C625253ED54277B06516B75A45DF462D48DCB +9776628A8019575D97387F627238767D67CF767E64464F708D2562DC7A176591 +73ED642C6273822C9881677F7248626E62CC4F3474E3534A529E7ECA90A65E2E +6886699C81807ED168D278C5868C9551508D8C2482DE80DE5305891252650000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +31 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000858496F94FDD582199715B9D62B162A566B48C799C8D7206676F789160B2 +535153178F8880CC8D1D94A1500D72C8590760EB711988AB595482EF672C7B28 +5D297EF7752D6CF58E668FF8903C9F3B6BD491197B145F7C78A784D6853D6BD5 +6BD96BD65E015E8775F995ED655D5F0A5FC58F9F58C181C2907F965B97AD8FB9 +7F168D2C62414FBF53D8535E8FA88FA98FAB904D68075F6A819888689CD6618B +522B762A5F6C658C6FD26EE85BBE6448517551B067C44E1979C9997C70B30000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +32 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000075C55E7673BB83E064AD62E894B56CE2535A52C3640F94C27B944F2F5E1B +82368116818A6E246CCA9A736355535C54FA886557E04E0D5E036B657C3F90E8 +601664E6731C88C16750624D8D22776C8E2991C75F6983DC8521991053C28695 +6B8B60ED60E8707F82CD82314ED36CA785CF64CD7CD969FD66F9834953957B56 +4FA7518C6D4B5C428E6D63D253C9832C833667E578B4643D5BDF5C945DEE8BE7 +62C667F48C7A640063BA8749998B8C177F2094F24EA7961098A4660C73160000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +33 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000573A5C1D5E38957F507F80A05382655E7545553150218D856284949E671D +56326F6E5DE2543570928F66626F64A463A35F7B6F8890F481E38FB05C186668 +5FF16C8996488D81886C649179F057CE6A59621054484E587A0B60E96F848BDA +627F901E9A8B79E4540375F4630153196C608FDF5F1B9A70803B9F7F4F885C3A +8D647FC565A570BD514551B2866B5D075BA062BD916C75748E0C7A2061017B79 +4EC77EF877854E1181ED521D51FA6A7153A88E87950496CF6EC19664695A0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +34 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000784050A877D7641089E6590463E35DDD7A7F693D4F20823955984E3275AE +7A975E625E8A95EF521B5439708A6376952457826625693F918755076DF37EAF +882262337EF075B5832878C196CC8F9E614874F78BCD6B64523A8D506B21806A +847156F153064ECE4E1B51D17C97918B7C074FC38E7F7BE17A9C64675D1450AC +810676017CB96DEC7FE067515B585BF878CB64AE641363AA632B9519642D8FBE +7B5476296253592754466B7950A362345E266B864EE38D37888B5F85902E0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +35 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00006020803D62C54E39535590F863B880C665E66C2E4F4660EE6DE18BDE5F39 +86CB5F536321515A83616863520063638E4850125C9B79775BFC52307A3B60BC +905376D75FB75F9776848E6C706F767B7B4977AA51F3909358244F4E6EF48FEA +654C7B1B72C46DA47FDF5AE162B55E95573084827B2C5E1D5F1F90127F1498A0 +63826EC7789870B95178975B57AB75354F4375385E9760E659606DC06BBF7889 +53FC96D551CB52016389540A94938C038DCC7239789F87768FED8C0D53E00000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +36 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00004E0176EF53EE948998769F0E952D5B9A8BA24E224E1C51AC846361C252A8 +680B4F97606B51BB6D1E515C6296659796618C46901775D890FD77636BD2728A +72EC8BFB583577798D4C675C9540809A5EA66E2159927AEF77ED953B6BB565AD +7F0E58065151961F5BF958A954288E726566987F56E4949D76FE9041638754C6 +591A593A579B8EB267358DFA8235524160F0581586FE5CE89E454FC4989D8BB9 +5A2560765384627C904F9102997F6069800C513F80335C1499756D314E8C0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +37 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00008D3053D17F5A7B4F4F104E4F96006CD573D085E95E06756A7FFB6A0A77FE +94927E4151E170E653CD8FD483038D2972AF996D6CDB574A82B365B980AA623F +963259A84EFF8BBF7EBA653E83F2975E556198DE80A5532A8BFD542080BA5E9F +6CB88D3982AC915A54296C1B52067EB7575F711A6C7E7C89594B4EFD5FFF6124 +7CAA4E305C0167AB87025CF0950B98CE75AF70FD902251AF7F1D8BBD594951E4 +4F5B5426592B657780A45B75627662C28F905E456C1F7B264F0F4FD8670D0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +38 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00006D6E6DAA798F88B15F17752B629A8F854FEF91DC65A7812F81515E9C8150 +8D74526F89868D4B590D50854ED8961C723681798D1F5BCC8BA3964459877F1A +54905676560E8BE565396982949976D66E895E727518674667D17AFF809D8D76 +611F79C665628D635188521A94A27F38809B7EB25C976E2F67607BD9768B9AD8 +818F7F947CD5641E95507A3F544A54E56B4C640162089E3D80F3759952729769 +845B683C86E49601969494EC4E2A54047ED968398DDF801566F45E9A7FB90000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +39 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000057C2803F68975DE5653B529F606D9F9A4F9B8EAC516C5BAB5F135DE96C5E +62F18D21517194A952FE6C9F82DF72D757A267848D2D591F8F9C83C754957B8D +4F306CBD5B6459D19F1353E486CA9AA88C3780A16545987E56FA96C7522E74DC +52505BE1630289024E5662D0602A68FA51735B9851A089C27BA199867F5060EF +704C8D2F51495E7F901B747089C4572D78455F529F9F95FA8F689B3C8BE17678 +684267DC8DEA8D35523D8F8A6EDA68CD950590ED56FD679C88F98FC754C80000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +3A +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00009AB85B696D776C264EA55BB39A87916361A890AF97E9542B6DB55BD251FD +558A7F557FF064BC634D65F161BE608D710A6C576C49592F676D822A58D5568E +8C6A6BEB90DD597D801753F76D695475559D837783CF683879BE548C4F555408 +76D28C8996026CB36DB88D6B89109E648D3A563F9ED175D55F8872E0606854FC +4EA86A2A886160528F7054C470D886799E3F6D2A5B8F5F187EA255894FAF7334 +543C539A5019540E547C4E4E5FFD745A58F6846B80E1877472D07CCA6E560000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +3B +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00005F27864E552C62A44E926CAA623782B154D7534E733E6ED1753B52125316 +8BDD69D05F8A60006DEE574F6B2273AF68538FD87F13636260A3552475EA8C62 +71156DA35BA65E7B8352614C9EC478FA87577C27768751F060F6714C66435E4C +604D8C0E707063258F895FBD606286D456DE6BC160946167534960E066668D3F +79FD4F1A70E96C478BB38BF27ED88364660F5A5A9B426D516DF78C416D3B4F19 +706B83B7621660D1970D8D27797851FB573E57FA673A75787A3D79EF7B950000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +3C +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000808C99658FF96FC08BA59E2159EC7EE97F095409678168D88F917C4D96C6 +53CA602575BE6C7253735AC97EA7632451E0810A5DF184DF628051805B634F0E +796D524260B86D4E5BC45BC28BA18BB065E25FCC964559937EE77EAA560967B7 +59394F735BB652A0835A988A8D3E753294BE50477A3C4EF767B69A7E5AC16B7C +76D1575A5C167B3A95F4714E517C80A9827059787F04832768C067EC78B17877 +62E363617B804FED526A51CF835069DB92748DF58D3189C1952E7BAD4EF60000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +3D +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000506582305251996F6E106E856DA75EFA50F559DC5C066D466C5F7586848B +686859568BB253209171964D854969127901712680F64EA490CA6D479A845A07 +56BC640594F077EB4FA5811A72E189D2997A7F347EDE527F655991758F7F8F83 +53EB7A9663ED63A5768679F888579636622A52AB8282685467706377776B7AED +6D017ED389E359D0621285C982A5754C501F4ECB75A58BEB5C4A5DFE7B4B65A4 +91D14ECA6D25895F7D2795264EC58C288FDB9773664B79818FD170EC6D780000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +3E +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00005C3D52B283465162830E775B66769CB84EAC60CA7CBE7CB37ECF4E958B66 +666F988897595883656C955C5F8475C997567ADF7ADE51C070AF7A9863EA7A76 +7EA0739697ED4E4570784E5D915253A9655165E781FC8205548E5C31759A97A0 +62D872D975BD5C459A7983CA5C40548077E94E3E6CAE805A62D2636E5DE85177 +8DDD8E1E952F4FF153E560E770AC526763509E435A1F5026773753777EE26485 +652B628963985014723589C951B38BC07EDD574783CC94A7519B541B5CFB0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +3F +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00004FCA7AE36D5A90E19A8F55805496536154AF5F0063E9697751EF6168520A +582A52D8574E780D770B5EB761777CE0625B62974EA27095800362F770E49760 +577782DB67EF68F578D5989779D158F354B353EF6E34514B523B5BA28BFE80AF +554357A660735751542D7A7A60505B5463A762A053E362635BC767AF54ED7A9F +82E691775E9388E4593857AE630E8DE880EF57577B774FA95FEB5BBD6B3E5321 +7B5072C2684677FF773665F751B54E8F76D45CBF7AA58475594E9B4150800000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +40 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000998861276E8357646606634656F062EC62695ED39614578362C955878721 +814A8FA3556683B167658D5684DD5A6A680F62E67BEE961151706F9C8C3063FD +89C861D27F0670C26EE57405699472FC5ECA90CE67176D6A635E52B372628001 +4F6C59E5916A70D96D9D52D24E5096F7956D857E78CA7D2F5121579264C2808B +7C7B6CEA68F1695E51B7539868A872819ECE7BF172F879BB6F137406674E91CC +9CA4793C83898354540F68174E3D538952B1783E5386522950884F8B4FD00000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +41 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000075E27ACB7C926CA596B6529B748354E94FE9805483B28FDE95705EC9601C +6D9F5E18655B813894FE604B70BC7EC37CAE51C968817CB1826F4E248F8691CF +667E4EAE8C0564A9804A50DA759771CE5BE58FBD6F664E86648295635ED66599 +521788C270C852A3730E7433679778F797164E3490BB9CDE6DCB51DB8D41541D +62CE73B283F196F69F8494C34F367F9A51CC707596755CAD988653E64EE46E9C +740969B4786B998F7559521876246D4167F3516D9F99804B54997B3C7ABF0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +42 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00009686578462E29647697C5A0464027BD36F0F964B82A6536298855E907089 +63B35364864F9C819E93788C97328DEF8D429E7F6F5E79845F559646622E9A74 +541594DD4FA365C55C655C617F1586516C2F5F8B73876EE47EFF5CE6631B5B6A +6EE653754E7163A0756562A18F6E4F264ED16CA67EB68BBA841D87BA7F57903B +95237BA99AA188F8843D6D1B9A867EDC59889EBB739B780186829A6C9A82561B +541757CB4E709EA653568FC881097792999286EE6EE1851366FC61626F2B0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +43 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00008C298292832B76F26C135FD983BD732B8305951A6BDB77DB94C6536F8302 +51925E3D8C8C8D384E4873AB679A68859176970971646CA177095A9295416BCF +7F8E66275BD059B95A9A95E895F74EEC840C84996AAC76DF9530731B68A65B5F +772F919A97617CDC8FF78C1C5F257C7379D889C56CCC871C5BC65E4268C97720 +7EF55195514D52C95A297F05976282D763CF778485D079D26E3A5E9959998511 +706D6C1162BF76BF654F60AF95FD660E879F9E2394ED540D547D8C2C64780000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +44 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000647986116A21819C78E864699B5462B9672B83AB58A89ED86CAB6F205BDE +964C8C0B725F67D062C772614EA959C66BCD589366AE5E5552DF6155672876EE +776672677A4662FF54EA545094A090A35A1C7EB36C164E435976801059485357 +753796BE56CA63208111607C95F96DD65462998151855AE980FD59AE9713502A +6CE55C3C62DF4F60533F817B90066EBA852B62C85E7478BE64B5637B5FF55A18 +917F9E1F5C3F634F80425B7D556E954A954D6D8560A867E072DE51DD5B810000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +45 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000062E76CDE725B626D94AE7EBD81136D53519C5F04597452AA601259736696 +8650759F632A61E67CEF8BFA54E66B279E256BB485D5545550766CA4556A8DB4 +722C5E156015743662CD6392724C5F986E436D3E65006F5876D878D076FC7554 +522453DB4E535E9E65C1802A80D6629B5486522870AE888D8DD16CE1547880DA +57F988F48D54966A914D4F696C9B55B776C6783062A870F96F8E5F6D84EC68DA +787C7BF781A8670B9E4F636778B0576F78129739627962AB528874356BD70000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +46 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00005564813E75B276AE533975DE50FB5C418B6C7BC7504F72479A9798D86F02 +74E27968648777A562FC98918D2B54C180584E52576A82F9840D5E7351ED74F6 +8BC45C4F57616CFC98875A4678349B448FEB7C955256625194FA4EC683868461 +83E984B257D467345703666E6D668C3166DD7011671F6B3A6816621A59BB4E03 +51C46F0667D26C8F517668CB59476B6775665D0E81109F5065D7794879419A91 +8D775C824E5E4F01542F5951780C56686C148FC45F036C7D6CE38BAB63900000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +47 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000060706D3D72756266948E94C553438FC17B7E4EDF8C264E7E9ED494B194B3 +524D6F5C90636D458C3458115D4C6B206B4967AA545B81547F8C589985375F3A +62A26A47953965726084686577A74E544FA85DE7979864AC7FD85CED4FCF7A8D +520783044E14602F7A8394A64FB54EB279E6743452E482B964D279BD5BDD6C81 +97528F7B6C22503E537F6E0564CE66746C3060C598778BF75E86743C7A7779CB +4E1890B174036C4256DA914B6CC58D8B533A86C666F28EAF5C489A716E200000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +48 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000053D65A369F8B8DA353BB570898A76743919B6CC9516875CA62F372AC5238 +529D7F3A7094763853749E4A69B7786E96C088D97FA4713671C3518967D374E4 +58E4651856B78BA9997662707ED560F970ED58EC4EC14EBA5FCD97E74EFB8BA4 +5203598A7EAB62544ECD65E5620E833884C98363878D71946EB65BB97ED25197 +63C967D480898339881551125B7A59828FB14E736C5D516589258F6F962E854A +745E951095F06DA682E55F3164926D128428816E9CC3585E8D5B4E0953C10000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +49 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00004F1E6563685155D34E2764149A9A626B5AC2745F82726DA968EE50E7838E +7802674052396C997EB150BB5565715E7B5B665273CA82EB67495C715220717D +886B95EA965564C58D6181B355846C5562477F2E58924F2455468D4F664C4E0A +5C1A88F368A2634E7A0D70E7828D52FA97F65C1154E890B57ECD59628D4A86C7 +820C820D8D6664445C0461516D89793E8BBE78377533547B4F388EAB6DF15A20 +7EC5795E6C885BA15A76751A80BE614E6E1758F0751F7525727253477EF30000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +4A +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000770176DB526980DC57235E08593172EE65BD6E7F8BD75C388671534177F3 +62FE65F64EC098DF86805B9E8BC653F277E24F7F5C4E9A7659CB5F0F793A58EB +4E1667FF4E8B62ED8A93901D52BF662F55DC566C90024ED54F8D91CA99706C0F +5E0260435BA489C68BD56536624B99965B885BFF6388552E53D77626517D852C +67A268B36B8A62928F9353D482126DD1758F4E668D4E5B70719F85AF669166D9 +7F7287009ECD9F205C5E672F8FF06811675F620D7AD658855EB665706F310000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +4B +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000060555237800D6454887075295E05681362F4971C53CC723D8C016C347761 +7A0E542E77AC987A821C8BF47855671470C165AF64955636601D79C153F84E1D +6B7B80865BFA55E356DB4F3A4F3C99725DF3677E80386002988290015B8B8BBC +8BF5641C825864DE55FD82CF91654FD77D20901F7C9F50F358516EAF5BBF8BC9 +80839178849C7B97867D968B968F7EE59AD3788E5C817A57904296A7795F5B59 +635F7B0B84D168AD55067F2974107D2295016240584C4ED65B83597958540000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +4C +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000736D631E8E4B8E0F80CE82D462AC53F06CF0915E592A60016C70574D644A +8D2A762B6EE9575B6A8075F06F6D8C2D8C0857666BEF889278B363A253F970AD +6C645858642A580268E0819B55107CD650188EBA6DCC8D9F70EB638F6D9B6ED4 +7EE68404684390036DD896768BA85957727985E4817E75BC8A8A68AF52548E22 +951163D098988E44557C4F5366FF568F60D56D9552435C4959296DFB586B7530 +751C606C82148146631167618FE2773A8DF38D3494C15E165385542C70C30000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +4D +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00006C405EF7505C4EAD5EAD633A8247901A6850916E77B3540C94DC5F647AE5 +687663457B527EDF75DB507762955934900F51F879C37A8156FE5F9290146D82 +5C60571F541051546E4D56E263A89893817F8715892A9000541E5C6F81C062D6 +625881319E3596409A6E9A7C692D59A562D3553E631654C786D96D3C5A0374E6 +889C6B6A59168C4C5F2F6E7E73A9987D4E3870F75B8C7897633D665A769660CB +5B9B5A494E0781556C6A738B4EA167897F515F8065FA671B5FD859845A010000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +4E +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00005DCD5FAE537197E68FDD684556F4552F60DF4E3A6F4D7EF482C7840E59D4 +4F1F4F2A5C3E7EAC672A851A5473754F80C355829B4F4F4D6E2D8C135C096170 +536B761F6E29868A658795FB7EB9543B7A337D0A95EE55E17FC174EE631D8717 +6DA17A9D621165A1536763E16C835DEB545C94A84E4C6C618BEC5C4B65E0829C +68A7543E54346BCB6B664E9463425348821E4F0D4FAE575E620A96FE66647269 +52FF52A1609F8BEF661471996790897F785277FD6670563B54389521727A0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +4F +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00007A00606F5E0C6089819D591560DC718470EF6EAA6C5072806A8488AD5E2D +4E605AB3559C94E36D177CFB9699620F7EC6778E867E5323971E8F9666875CE1 +4FA072ED4E0B53A6590F54136380952851484ED99C9C7EA454B88D2488548237 +95F26D8E5F265ACC663E966973B0732E53BF817A99857FA15BAA967796507EBF +76F853A2957699997BB189446E584E617FD479658BE660F354CD4EAB98795DF7 +6A6150CF54118C618427785D9704524A54EE56A395006D885BB56DC666530000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +50 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00005C0F5B5D6821809655787B11654869544E9B6B47874E978B534F631F643A +90AA659C80C18C10519968B0537887F961C86CC46CFB8C225C5185AA82AF950C +6B238F9B65B05FFB5FC34FE18845661F8165732960FA51745211578B5F6290A2 +884C91925E78674F602759D3514451F680F853086C7996C4718A4F114FEE7F9E +673D55C5950879C088967EE3589F620C9700865A5618987B5F908BB884C49157 +53D965ED5E8F755C60647D6E5A7F7EEA7EED8F6955A75BA360AC65CB73840000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +51 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00009009766377297EDA9774859B5B667A7496EA884052CB718F5FAA65EC8BE2 +5BFB9A6F5DE16B896C5B8BAD8BAF900A8FC5538B62BC9E269E2D54404E2B82BD +7259869C5D1688596DAF96C554D14E9A8BB6710954BD960970DF6DF976D04E25 +781487125CA95EF68A00989C960E708E6CBF594463A9773C884D6F1482735830 +71D5538C781A96C155015F6671305BB48C1A9A8C6B83592E9E2F79E76768626C +4F6F75A17F8A6D0B96336C274EF075D2517B68376F3E90808170599674760000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +52 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000064475C2790657A918C2359DA54AC8200836F898180006930564E80367237 +91CE51B64E5F987563964E1A53F666F3814B591C6DB24E0058F9533B63D694F1 +4F9D4F0A886398905937905779FB4EEA80F075916C825B9C59E85F5D69058681 +501A5DF24E5977E34EE5827A6291661390915C794EBF5F7981C69038808475AB +4EA688D4610F6BC55FC64E4976CA6EA28BE38BAE8C0A8BD15F027FFC7FCC7ECE +8335836B56E06BB797F3963459FB541F94F66DEB5BC5996E5C395F1596900000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +53 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000537082F16A315A749E705E947F2883B984248425836787478FCE8D6276C8 +5F719896786C662054DF62E54F6381C375C85EB896CD8E0A86F9548F6CF36D8C +6C38607F52C775285E7D4F1860A05FE75C24753190AE94C072B96CB96E389149 +670953CB53F34F5191C98BF153C85E7C8FC26DE44E8E76C26986865E611A8206 +4F594FDE903E9C7C61096E1D6E1496854E885A3196E84E0E5C7F79B95B878BED +7FBD738957DF828B90C15401904755BB5CEA5FA161086B3272F180B28A890000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +54 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00006D745BD388D598848C6B9A6D9E336E0A51A4514357A38881539F63F48F95 +56ED54585706733F6E907F188FDC82D1613F6028966266F07EA68D8A8DC394A5 +5CB37CA4670860A6960580184E9190E75300966851418FD08574915D665597F5 +5B55531D78386742683D54C9707E5BB08F7D518D572854B1651266828D5E8D43 +810F846C906D7CDF51FF85FB67A365E96FA186A48E81566A90207682707671E5 +8D2362E952196CFD8D3C600E589E618E66FE8D60624E55B36E23672D8F670000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +55 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000094E195F87728680569A8548B4E4D70B88BC86458658B5B857A84503A5BE8 +77BB6BE18A797C986CBE76CF65A98F975D2D5C5586386808536062187AD96E5B +7EFD6A1F7AE05F706F335F20638C6DA867564E085E108D264ED780C07634969C +62DB662D627E6CBC8D7571677F695146808753EC906E629854F286F08F998005 +951785178FD96D5973CD659F771F7504782781FB8D1E94884FA6679575B98BCA +9707632F9547963584B8632377415F8172F04E896014657462EF6B63653F0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +56 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00005E2775C790D18BC1829D679D652F5431871877E580A281026C414E4B7EC7 +804C76F4690D6B966267503C4F84574063076B628DBE53EA65E87EB85FD7631A +63B781F381F47F6E5E1C5CD95236667A79E97A1A8D28709975D46EDE6CBB7A92 +4E2D76C55FE0949F88777EC879CD80BF91CD4EF24F17821F54685DDE6D328BCC +7CA58F7480985E1A549276B15B99663C9AA473E0682A86DB6731732A8BF88BDB +90107AF970DB716E62C477A956314E3B845767F152A986C08D2E94F87B510000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +57 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00004F4F6CE8795D9A7B6293722A62FD4E1378168F6C64B08D5A7BC668695E84 +88C55986649E58EE72B6690E95258FFD8D5857607F008C0651C6634962D95353 +684C74228301914C55447740707C6D4A517954A88D4459FF6ECB6DC45B5C7D2B +4ED47C7D6ED35B5081EA6E0D5B579B0368D58E2A5B977EFC603B7EB590B98D70 +594F63CD79DF8DB3535265CF79568BC5963B7EC494BB7E825634918967007F6A +5C0A907566285DE64F5067DE505A4F5C57505EA7000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +58 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00004E8D4E0C51404E105EFF53454E154E984E1E9B325B6C56694E2879BA4E3F +53154E47592D723B536E6C1056DF80E499976BD3777E9F174E364E9F9F104E5C +4E694E9382885B5B556C560F4EC4538D539D53A353A553AE97658D5D531A53F5 +5326532E533E8D5C5366536352025208520E522D5233523F5240524C525E5261 +525C84AF527D528252815290529351827F544EBB4EC34EC94EC24EE84EE14EEB +4EDE4F1B4EF34F224F644EF54F254F274F094F2B4F5E4F6765384F5A4F5D0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +59 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00004F5F4F574F324F3D4F764F744F914F894F834F8F4F7E4F7B4FAA4F7C4FAC +4F944FE64FE84FEA4FC54FDA4FE34FDC4FD14FDF4FF85029504C4FF3502C500F +502E502D4FFE501C500C50255028507E504350555048504E506C507B50A550A7 +50A950BA50D6510650ED50EC50E650EE5107510B4EDD6C3D4F584F654FCE9FA0 +6C467C74516E5DFD9EC999985181591452F9530D8A07531051EB591951554EA0 +51564EB3886E88A44EB5811488D279805B3488037FB851AB51B151BD51BC0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +5A +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000051C7519651A251A58BA08BA68BA78BAA8BB48BB58BB78BC28BC38BCB8BCF +8BCE8BD28BD38BD48BD68BD88BD98BDC8BDF8BE08BE48BE88BE98BEE8BF08BF3 +8BF68BF98BFC8BFF8C008C028C048C078C0C8C0F8C118C128C148C158C168C19 +8C1B8C188C1D8C1F8C208C218C258C278C2A8C2B8C2E8C2F8C328C338C358C36 +5369537A961D962296219631962A963D963C964296499654965F9667966C9672 +96749688968D969796B09097909B909D909990AC90A190B490B390B690BA0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +5B +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000090B890B090CF90C590BE90D090C490C790D390E690E290DC90D790DB90EB +90EF90FE91049122911E91239131912F913991439146520D594252A252AC52AD +52BE54FF52D052D652F053DF71EE77CD5EF451F551FC9B2F53B65F01755A5DEF +574C57A957A1587E58BC58C558D15729572C572A57335739572E572F575C573B +574257695785576B5786577C577B5768576D5776577357AD57A4578C57B257CF +57A757B4579357A057D557D857DA57D957D257B857F457EF57F857E457DD0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +5C +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000580B580D57FD57ED5800581E5819584458205865586C58815889589A5880 +99A89F1961FF8279827D827F828F828A82A88284828E82918297829982AB82B8 +82BE82B082C882CA82E3829882B782AE82CB82CC82C182A982B482A182AA829F +82C482CE82A482E1830982F782E4830F830782DC82F482D282D8830C82FB82D3 +8311831A83068314831582E082D5831C8351835B835C83088392833C83348331 +839B835E832F834F83478343835F834083178360832D833A8333836683650000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +5D +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00008368831B8369836C836A836D836E83B0837883B383B483A083AA8393839C +8385837C83B683A9837D83B8837B8398839E83A883BA83BC83C1840183E583D8 +58078418840B83DD83FD83D6841C84388411840683D483DF840F840383F883F9 +83EA83C583C0842683F083E1845C8451845A8459847384878488847A84898478 +843C844684698476848C848E8431846D84C184CD84D084E684BD84D384CA84BF +84BA84E084A184B984B4849784E584E3850C750D853884F08539851F853A0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +5E +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00008556853B84FF84FC8559854885688564855E857A77A285438572857B85A4 +85A88587858F857985AE859C858585B985B785B085D385C185DC85FF86278605 +86298616863C5EFE5F08593C594180375955595A5958530F5C225C255C2C5C34 +624C626A629F62BB62CA62DA62D762EE632262F66339634B634363AD63F66371 +637A638E63B4636D63AC638A636963AE63BC63F263F863E063FF63C463DE63CE +645263C663BE64456441640B641B6420640C64266421645E6484646D64960000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +5F +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000647A64B764B8649964BA64C064D064D764E464E265096525652E5F0B5FD2 +75195F11535F53F153FD53E953E853FB541254165406544B5452545354545456 +54435421545754595423543254825494547754715464549A549B548454765466 +549D54D054AD54C254B454D254A754A654D354D4547254A354D554BB54BF54CC +54D954DA54DC54A954AA54A454DD54CF54DE551B54E7552054FD551454F35522 +5523550F55115527552A5567558F55B55549556D55415555553F5550553C0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +60 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00005537555655755576557755335530555C558B55D2558355B155B955885581 +559F557E55D65591557B55DF55BD55BE5594559955EA55F755C9561F55D155EB +55EC55D455E655DD55C455EF55E555F255F355CC55CD55E855F555E48F94561E +5608560C56015624562355FE56005627562D565856395657562C564D56625659 +565C564C5654568656645671566B567B567C5685569356AF56D456D756DD56E1 +56F556EB56F956FF5704570A5709571C5E0F5E195E145E115E315E3B5E3C0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +61 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00005E375E445E545E5B5E5E5E615C8C5C7A5C8D5C905C965C885C985C995C91 +5C9A5C9C5CB55CA25CBD5CAC5CAB5CB15CA35CC15CB75CC45CD25CE45CCB5CE5 +5D025D035D275D265D2E5D245D1E5D065D1B5D585D3E5D345D3D5D6C5D5B5D6F +5D5D5D6B5D4B5D4A5D695D745D825D995D9D8C735DB75DC55F735F775F825F87 +5F895F8C5F955F995F9C5FA85FAD5FB55FBC88625F6172AD72B072B472B772B8 +72C372C172CE72CD72D272E872EF72E972F272F472F7730172F3730372FA0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +62 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000072FB731773137321730A731E731D7315732273397325732C733873317350 +734D73577360736C736F737E821B592598E7592459029963996799689969996A +996B996C99749977997D998099849987998A998D999099919993999499955E80 +5E915E8B5E965EA55EA05EB95EB55EBE5EB38D535ED25ED15EDB5EE85EEA81BA +5FC45FC95FD65FCF60035FEE60045FE15FE45FFE600560065FEA5FED5FF86019 +60356026601B600F600D6029602B600A603F602160786079607B607A60420000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +63 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000606A607D6096609A60AD609D60836092608C609B60EC60BB60B160DD60D8 +60C660DA60B4612061266115612360F46100610E612B614A617561AC619461A7 +61B761D461F55FDD96B395E995EB95F195F395F595F695FC95FE960396049606 +9608960A960B960C960D960F96129615961696179619961A4E2C723F62156C35 +6C546C5C6C4A6CA36C856C906C946C8C6C686C696C746C766C866CA96CD06CD4 +6CAD6CF76CF86CF16CD76CB26CE06CD66CFA6CEB6CEE6CB16CD36CEF6CFE0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +64 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00006D396D276D0C6D436D486D076D046D196D0E6D2B6D4D6D2E6D356D1A6D4F +6D526D546D336D916D6F6D9E6DA06D5E6D936D946D5C6D606D7C6D636E1A6DC7 +6DC56DDE6E0E6DBF6DE06E116DE66DDD6DD96E166DAB6E0C6DAE6E2B6E6E6E4E +6E6B6EB26E5F6E866E536E546E326E256E446EDF6EB16E986EE06F2D6EE26EA5 +6EA76EBD6EBB6EB76ED76EB46ECF6E8F6EC26E9F6F626F466F476F246F156EF9 +6F2F6F366F4B6F746F2A6F096F296F896F8D6F8C6F786F726F7C6F7A6FD10000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +65 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00006FC96FA76FB96FB66FC26FE16FEE6FDE6FE06FEF701A7023701B70397035 +704F705E5B805B845B955B935BA55BB8752F9A9E64345BE45BEE89305BF08E47 +8B078FB68FD38FD58FE58FEE8FE48FE98FE68FF38FE890059004900B90269011 +900D9016902190359036902D902F9044905190529050906890589062905B66B9 +9074907D908290889083908B5F505F575F565F585C3B54AB5C505C595B715C63 +5C667FBC5F2A5F295F2D82745F3C9B3B5C6E59815983598D59A959AA59A30000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +66 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000599759CA59AB599E59A459D259B259AF59D759BE5A055A0659DD5A0859E3 +59D859F95A0C5A095A325A345A115A235A135A405A675A4A5A555A3C5A625A75 +80EC5AAA5A9B5A775A7A5ABE5AEB5AB25AD25AD45AB85AE05AE35AF15AD65AE6 +5AD85ADC5B095B175B165B325B375B405C155C1C5B5A5B655B735B515B535B62 +9A759A779A789A7A9A7F9A7D9A809A819A859A889A8A9A909A929A939A969A98 +9A9B9A9C9A9D9A9F9AA09AA29AA39AA59AA77E9F7EA17EA37EA57EA87EA90000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +67 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00007EAD7EB07EBE7EC07EC17EC27EC97ECB7ECC7ED07ED47ED77EDB7EE07EE1 +7EE87EEB7EEE7EEF7EF17EF27F0D7EF67EFA7EFB7EFE7F017F027F037F077F08 +7F0B7F0C7F0F7F117F127F177F197F1C7F1B7F1F7F217F227F237F247F257F26 +7F277F2A7F2B7F2C7F2D7F2F7F307F317F327F337F355E7A757F5DDB753E9095 +738E739173AE73A2739F73CF73C273D173B773B373C073C973C873E573D9987C +740A73E973E773DE73BA73F2740F742A745B7426742574287430742E742C0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +68 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000741B741A7441745C7457745574597477746D747E749C748E748074817487 +748B749E74A874A9749074A774D274BA97EA97EB97EC674C6753675E67486769 +67A56787676A6773679867A7677567A8679E67AD678B6777677C67F0680967D8 +680A67E967B0680C67D967B567DA67B367DD680067C367B867E2680E67C167FD +6832683368606861684E6862684468646883681D68556866684168676840683E +684A6849682968B5688F687468776893686B68C2696E68FC691F692068F90000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +69 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000692468F0690B6901695768E369106971693969606942695D6984696B6980 +69986978693469CC6987698869CE6989696669636979699B69A769BB69AB69AD +69D469B169C169CA69DF699569E0698D69FF6A2F69ED6A176A186A6569F26A44 +6A3E6AA06A506A5B6A356A8E6A796A3D6A286A586A7C6A916A906AA96A976AAB +733773526B816B826B876B846B926B936B8D6B9A6B9B6BA16BAA8F6B8F6D8F71 +8F728F738F758F768F788F778F798F7A8F7C8F7E8F818F828F848F878F8B0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +6A +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00008F8D8F8E8F8F8F988F9A8ECE620B6217621B621F6222622162256224622C +81E774EF74F474FF750F75117513653465EE65EF65F0660A6619677266036615 +6600708566F7661D66346631663666358006665F66546641664F665666616657 +66776684668C66A7669D66BE66DB66DC66E666E98D328D338D368D3B8D3D8D40 +8D458D468D488D498D478D4D8D558D5989C789CA89CB89CC89CE89CF89D089D1 +726E729F725D7266726F727E727F7284728B728D728F72926308633263B00000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +6B +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000643F64D880046BEA6BF36BFD6BF56BF96C056C076C066C0D6C156C186C19 +6C1A6C216C296C246C2A6C3265356555656B724D72527256723086625216809F +809C809380BC670A80BD80B180AB80AD80B480B780E780E880E980EA80DB80C2 +80C480D980CD80D7671080DD80EB80F180F480ED810D810E80F280FC67158112 +8C5A8136811E812C811881328148814C815381748159815A817181608169817C +817D816D8167584D5AB58188818281916ED581A381AA81CC672681CA81BB0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +6C +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000081C181A66B246B376B396B436B466B5998D198D298D398D598D998DA6BB3 +5F406BC289F365909F51659365BC65C665C465C365CC65CE65D265D67080709C +7096709D70BB70C070B770AB70B170E870CA711071137116712F71317173715C +716871457172714A7178717A719871B371B571A871A071E071D471E771F9721D +7228706C7118716671B9623E623D624362486249793B794079467949795B795C +7953795A796279577960796F7967797A7985798A799A79A779B35FD15FD00000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +6D +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000603C605D605A606760416059606360AB6106610D615D61A9619D61CB61D1 +62068080807F6C936CF66DFC77F677F87800780978177818781165AB782D781C +781D7839783A783B781F783C7825782C78237829784E786D7856785778267850 +7847784C786A789B7893789A7887789C78A178A378B278B978A578D478D978C9 +78EC78F2790578F479137924791E79349F9B9EF99EFB9EFC76F17704770D76F9 +77077708771A77227719772D7726773577387750775177477743775A77680000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +6E +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000077627765777F778D777D7780778C7791779F77A077B077B577BD753A7540 +754E754B7548755B7572757975837F587F617F5F8A487F687F747F717F797F81 +7F7E76CD76E58832948594869487948B948A948C948D948F9490949494979495 +949A949B949C94A394A494AB94AA94AD94AC94AF94B094B294B494B694B794B8 +94B994BA94BC94BD94BF94C494C894C994CA94CB94CC94CD94CE94D094D194D2 +94D594D694D794D994D894DB94DE94DF94E094E294E494E594E794E894EA0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +6F +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000094E994EB94EE94EF94F394F494F594F794F994FC94FD94FF950395029506 +95079509950A950D950E950F951295139514951595169518951B951D951E951F +9522952A952B9529952C953195329534953695379538953C953E953F95429535 +9544954595469549954C954E954F9552955395549556955795589559955B955E +955F955D95619562956495659566956795689569956A956B956C956F95719572 +9573953A77E777EC96C979D579ED79E379EB7A065D477A037A027A1E7A140000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +70 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00007A397A377A519ECF99A57A707688768E7693769976A474DE74E0752C9E20 +9E229E289E299E2A9E2B9E2C9E329E319E369E389E379E399E3A9E3E9E419E42 +9E449E469E479E489E499E4B9E4C9E4E9E519E559E579E5A9E5B9E5C9E5E9E63 +9E669E679E689E699E6A9E6B9E6C9E719E6D9E7375927594759675A0759D75AC +75A375B375B475B875C475B175B075C375C275D675CD75E375E875E675E475EB +75E7760375F175FC75FF761076007605760C7617760A76257618761576190000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +71 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000761B763C762276207640762D7630763F76357643763E7633764D765E7654 +765C7656766B766F7FCA7AE67A787A797A807A867A887A957AA67AA07AAC7AA8 +7AAD7AB3886488698872887D887F888288A288C688B788BC88C988E288CE88E3 +88E588F1891A88FC88E888FE88F0892189198913891B890A8934892B89368941 +8966897B758B80E576B276B477DC801280148016801C80208022802580268027 +802980288031800B803580438046804D80528069807189839878988098830000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +72 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00009889988C988D988F9894989A989B989E989F98A198A298A598A6864D8654 +866C866E867F867A867C867B86A8868D868B86AC869D86A786A386AA869386A9 +86B686C486B586CE86B086BA86B186AF86C986CF86B486E986F186F286ED86F3 +86D0871386DE86F486DF86D886D18703870786F88708870A870D87098723873B +871E8725872E871A873E87488734873187298737873F87828722877D877E877B +87608770874C876E878B87538763877C876487598765879387AF87A887D20000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +73 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000087C68788878587AD8797878387AB87E587AC87B587B387CB87D387BD87D1 +87C087CA87DB87EA87E087EE8816881387FE880A881B88218839883C7F367F42 +7F447F4582107AFA7AFD7B087B037B047B157B0A7B2B7B0F7B477B387B2A7B19 +7B2E7B317B207B257B247B337B3E7B1E7B587B5A7B457B757B4C7B5D7B607B6E +7B7B7B627B727B717B907BA67BA77BB87BAC7B9D7BA87B857BAA7B9C7BA27BAB +7BB47BD17BC17BCC7BDD7BDA7BE57BE67BEA7C0C7BFE7BFC7C0F7C167C0B0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +74 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00007C1F7C2A7C267C387C417C4081FE82018202820481EC8844822182228223 +822D822F8228822B8238823B82338234823E82448249824B824F825A825F8268 +887E8885888888D888DF895E7F9D7F9F7FA77FAF7FB07FB27C7C65497C917C9D +7C9C7C9E7CA27CB27CBC7CBD7CC17CC77CCC7CCD7CC87CC57CD77CE8826E66A8 +7FBF7FCE7FD57FE57FE17FE67FE97FEE7FF37CF87D777DA67DAE7E477E9B9EB8 +9EB48D738D848D948D918DB18D678D6D8C478C49914A9150914E914F91640000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +75 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00009162916191709169916F917D917E917291749179918C91859190918D9191 +91A291A391AA91AD91AE91AF91B591B491BA8C559E7E8DB88DEB8E058E598E69 +8DB58DBF8DBC8DBA8DC48DD68DD78DDA8DDE8DCE8DCF8DDB8DC68DEC8DF78DF8 +8DE38DF98DFB8DE48E098DFD8E148E1D8E1F8E2C8E2E8E238E2F8E3A8E408E39 +8E358E3D8E318E498E418E428E518E528E4A8E708E768E7C8E6F8E748E858E8F +8E948E908E9C8E9E8C788C828C8A8C858C988C94659B89D689DE89DA89DC0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +76 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000089E589EB89EF8A3E8B26975396E996F396EF970697019708970F970E972A +972D9730973E9F809F839F859F869F879F889F899F8A9F8C9EFE9F0B9F0D96B9 +96BC96BD96CE96D277BF96E0928E92AE92C8933E936A93CA938F943E946B9C7F +9C829C859C869C879C887A239C8B9C8E9C909C919C929C949C959C9A9C9B9C9E +9C9F9CA09CA19CA29CA39CA59CA69CA79CA89CA99CAB9CAD9CAE9CB09CB19CB2 +9CB39CB49CB59CB69CB79CBA9CBB9CBC9CBD9CC49CC59CC69CC79CCA9CCB0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +77 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00009CCC9CCD9CCE9CCF9CD09CD39CD49CD59CD79CD89CD99CDC9CDD9CDF9CE2 +977C978597919792979497AF97AB97A397B297B49AB19AB09AB79E589AB69ABA +9ABC9AC19AC09AC59AC29ACB9ACC9AD19B459B439B479B499B489B4D9B5198E8 +990D992E995599549ADF9AE19AE69AEF9AEB9AFB9AED9AF99B089B0F9B139B1F +9B239EBD9EBE7E3B9E829E879E889E8B9E9293D69E9D9E9F9EDB9EDC9EDD9EE0 +9EDF9EE29EE99EE79EE59EEA9EEF9F229F2C9F2F9F399F379F3D9F3E9F440000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 diff --git a/env/tcl/tcl8.6/encoding/gb2312.enc b/env/tcl/tcl8.6/encoding/gb2312.enc new file mode 100644 index 0000000..4b2f8c7 --- /dev/null +++ b/env/tcl/tcl8.6/encoding/gb2312.enc @@ -0,0 +1,1397 @@ +# Encoding file: euc-cn, multi-byte +M +003F 0 82 +00 +0000000100020003000400050006000700080009000A000B000C000D000E000F +0010001100120013001400150016001700180019001A001B001C001D001E001F +0020002100220023002400250026002700280029002A002B002C002D002E002F +0030003100320033003400350036003700380039003A003B003C003D003E003F +0040004100420043004400450046004700480049004A004B004C004D004E004F +0050005100520053005400550056005700580059005A005B005C005D005E005F +0060006100620063006400650066006700680069006A006B006C006D006E006F +0070007100720073007400750076007700780079007A007B007C007D007E007F +0080008100820083008400850086008700880089008A008B008C008D008E008F +0090009100920093009400950096009700980099009A009B009C009D009E009F +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +A1 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000030003001300230FB02C902C700A8300330052015FF5E2225202620182019 +201C201D3014301530083009300A300B300C300D300E300F3016301730103011 +00B100D700F72236222722282211220F222A222922082237221A22A522252220 +23122299222B222E2261224C2248223D221D2260226E226F22642265221E2235 +22342642264000B0203220332103FF0400A4FFE0FFE1203000A7211626062605 +25CB25CF25CE25C725C625A125A025B325B2203B219221902191219330130000 +A2 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000024882489248A248B248C248D248E248F2490249124922493249424952496 +249724982499249A249B247424752476247724782479247A247B247C247D247E +247F248024812482248324842485248624872460246124622463246424652466 +2467246824690000000032203221322232233224322532263227322832290000 +00002160216121622163216421652166216721682169216A216B000000000000 +A3 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000FF01FF02FF03FFE5FF05FF06FF07FF08FF09FF0AFF0BFF0CFF0DFF0EFF0F +FF10FF11FF12FF13FF14FF15FF16FF17FF18FF19FF1AFF1BFF1CFF1DFF1EFF1F +FF20FF21FF22FF23FF24FF25FF26FF27FF28FF29FF2AFF2BFF2CFF2DFF2EFF2F +FF30FF31FF32FF33FF34FF35FF36FF37FF38FF39FF3AFF3BFF3CFF3DFF3EFF3F +FF40FF41FF42FF43FF44FF45FF46FF47FF48FF49FF4AFF4BFF4CFF4DFF4EFF4F +FF50FF51FF52FF53FF54FF55FF56FF57FF58FF59FF5AFF5BFF5CFF5DFFE30000 +A4 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000304130423043304430453046304730483049304A304B304C304D304E304F +3050305130523053305430553056305730583059305A305B305C305D305E305F +3060306130623063306430653066306730683069306A306B306C306D306E306F +3070307130723073307430753076307730783079307A307B307C307D307E307F +3080308130823083308430853086308730883089308A308B308C308D308E308F +3090309130923093000000000000000000000000000000000000000000000000 +A5 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000030A130A230A330A430A530A630A730A830A930AA30AB30AC30AD30AE30AF +30B030B130B230B330B430B530B630B730B830B930BA30BB30BC30BD30BE30BF +30C030C130C230C330C430C530C630C730C830C930CA30CB30CC30CD30CE30CF +30D030D130D230D330D430D530D630D730D830D930DA30DB30DC30DD30DE30DF +30E030E130E230E330E430E530E630E730E830E930EA30EB30EC30ED30EE30EF +30F030F130F230F330F430F530F6000000000000000000000000000000000000 +A6 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000039103920393039403950396039703980399039A039B039C039D039E039F +03A003A103A303A403A503A603A703A803A90000000000000000000000000000 +000003B103B203B303B403B503B603B703B803B903BA03BB03BC03BD03BE03BF +03C003C103C303C403C503C603C703C803C90000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +A7 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000004100411041204130414041504010416041704180419041A041B041C041D +041E041F0420042104220423042404250426042704280429042A042B042C042D +042E042F00000000000000000000000000000000000000000000000000000000 +000004300431043204330434043504510436043704380439043A043B043C043D +043E043F0440044104420443044404450446044704480449044A044B044C044D +044E044F00000000000000000000000000000000000000000000000000000000 +A8 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000010100E101CE00E0011300E9011B00E8012B00ED01D000EC014D00F301D2 +00F2016B00FA01D400F901D601D801DA01DC00FC00EA00000000000000000000 +0000000000000000000031053106310731083109310A310B310C310D310E310F +3110311131123113311431153116311731183119311A311B311C311D311E311F +3120312131223123312431253126312731283129000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +A9 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00000000000000002500250125022503250425052506250725082509250A250B +250C250D250E250F2510251125122513251425152516251725182519251A251B +251C251D251E251F2520252125222523252425252526252725282529252A252B +252C252D252E252F2530253125322533253425352536253725382539253A253B +253C253D253E253F2540254125422543254425452546254725482549254A254B +0000000000000000000000000000000000000000000000000000000000000000 +B0 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000554A963F57C3632854CE550954C07691764C853C77EE827E788D72319698 +978D6C285B894FFA630966975CB880FA684880AE660276CE51F9655671AC7FF1 +888450B2596561CA6FB382AD634C625253ED54277B06516B75A45DF462D48DCB +9776628A8019575D97387F627238767D67CF767E64464F708D2562DC7A176591 +73ED642C6273822C9881677F7248626E62CC4F3474E3534A529E7ECA90A65E2E +6886699C81807ED168D278C5868C9551508D8C2482DE80DE5305891252650000 +B1 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000858496F94FDD582199715B9D62B162A566B48C799C8D7206676F789160B2 +535153178F8880CC8D1D94A1500D72C8590760EB711988AB595482EF672C7B28 +5D297EF7752D6CF58E668FF8903C9F3B6BD491197B145F7C78A784D6853D6BD5 +6BD96BD65E015E8775F995ED655D5F0A5FC58F9F58C181C2907F965B97AD8FB9 +7F168D2C62414FBF53D8535E8FA88FA98FAB904D68075F6A819888689CD6618B +522B762A5F6C658C6FD26EE85BBE6448517551B067C44E1979C9997C70B30000 +B2 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000075C55E7673BB83E064AD62E894B56CE2535A52C3640F94C27B944F2F5E1B +82368116818A6E246CCA9A736355535C54FA886557E04E0D5E036B657C3F90E8 +601664E6731C88C16750624D8D22776C8E2991C75F6983DC8521991053C28695 +6B8B60ED60E8707F82CD82314ED36CA785CF64CD7CD969FD66F9834953957B56 +4FA7518C6D4B5C428E6D63D253C9832C833667E578B4643D5BDF5C945DEE8BE7 +62C667F48C7A640063BA8749998B8C177F2094F24EA7961098A4660C73160000 +B3 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000573A5C1D5E38957F507F80A05382655E7545553150218D856284949E671D +56326F6E5DE2543570928F66626F64A463A35F7B6F8890F481E38FB05C186668 +5FF16C8996488D81886C649179F057CE6A59621054484E587A0B60E96F848BDA +627F901E9A8B79E4540375F4630153196C608FDF5F1B9A70803B9F7F4F885C3A +8D647FC565A570BD514551B2866B5D075BA062BD916C75748E0C7A2061017B79 +4EC77EF877854E1181ED521D51FA6A7153A88E87950496CF6EC19664695A0000 +B4 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000784050A877D7641089E6590463E35DDD7A7F693D4F20823955984E3275AE +7A975E625E8A95EF521B5439708A6376952457826625693F918755076DF37EAF +882262337EF075B5832878C196CC8F9E614874F78BCD6B64523A8D506B21806A +847156F153064ECE4E1B51D17C97918B7C074FC38E7F7BE17A9C64675D1450AC +810676017CB96DEC7FE067515B585BF878CB64AE641363AA632B9519642D8FBE +7B5476296253592754466B7950A362345E266B864EE38D37888B5F85902E0000 +B5 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00006020803D62C54E39535590F863B880C665E66C2E4F4660EE6DE18BDE5F39 +86CB5F536321515A83616863520063638E4850125C9B79775BFC52307A3B60BC +905376D75FB75F9776848E6C706F767B7B4977AA51F3909358244F4E6EF48FEA +654C7B1B72C46DA47FDF5AE162B55E95573084827B2C5E1D5F1F90127F1498A0 +63826EC7789870B95178975B57AB75354F4375385E9760E659606DC06BBF7889 +53FC96D551CB52016389540A94938C038DCC7239789F87768FED8C0D53E00000 +B6 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00004E0176EF53EE948998769F0E952D5B9A8BA24E224E1C51AC846361C252A8 +680B4F97606B51BB6D1E515C6296659796618C46901775D890FD77636BD2728A +72EC8BFB583577798D4C675C9540809A5EA66E2159927AEF77ED953B6BB565AD +7F0E58065151961F5BF958A954288E726566987F56E4949D76FE9041638754C6 +591A593A579B8EB267358DFA8235524160F0581586FE5CE89E454FC4989D8BB9 +5A2560765384627C904F9102997F6069800C513F80335C1499756D314E8C0000 +B7 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00008D3053D17F5A7B4F4F104E4F96006CD573D085E95E06756A7FFB6A0A77FE +94927E4151E170E653CD8FD483038D2972AF996D6CDB574A82B365B980AA623F +963259A84EFF8BBF7EBA653E83F2975E556198DE80A5532A8BFD542080BA5E9F +6CB88D3982AC915A54296C1B52067EB7575F711A6C7E7C89594B4EFD5FFF6124 +7CAA4E305C0167AB87025CF0950B98CE75AF70FD902251AF7F1D8BBD594951E4 +4F5B5426592B657780A45B75627662C28F905E456C1F7B264F0F4FD8670D0000 +B8 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00006D6E6DAA798F88B15F17752B629A8F854FEF91DC65A7812F81515E9C8150 +8D74526F89868D4B590D50854ED8961C723681798D1F5BCC8BA3964459877F1A +54905676560E8BE565396982949976D66E895E727518674667D17AFF809D8D76 +611F79C665628D635188521A94A27F38809B7EB25C976E2F67607BD9768B9AD8 +818F7F947CD5641E95507A3F544A54E56B4C640162089E3D80F3759952729769 +845B683C86E49601969494EC4E2A54047ED968398DDF801566F45E9A7FB90000 +B9 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000057C2803F68975DE5653B529F606D9F9A4F9B8EAC516C5BAB5F135DE96C5E +62F18D21517194A952FE6C9F82DF72D757A267848D2D591F8F9C83C754957B8D +4F306CBD5B6459D19F1353E486CA9AA88C3780A16545987E56FA96C7522E74DC +52505BE1630289024E5662D0602A68FA51735B9851A089C27BA199867F5060EF +704C8D2F51495E7F901B747089C4572D78455F529F9F95FA8F689B3C8BE17678 +684267DC8DEA8D35523D8F8A6EDA68CD950590ED56FD679C88F98FC754C80000 +BA +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00009AB85B696D776C264EA55BB39A87916361A890AF97E9542B6DB55BD251FD +558A7F557FF064BC634D65F161BE608D710A6C576C49592F676D822A58D5568E +8C6A6BEB90DD597D801753F76D695475559D837783CF683879BE548C4F555408 +76D28C8996026CB36DB88D6B89109E648D3A563F9ED175D55F8872E0606854FC +4EA86A2A886160528F7054C470D886799E3F6D2A5B8F5F187EA255894FAF7334 +543C539A5019540E547C4E4E5FFD745A58F6846B80E1877472D07CCA6E560000 +BB +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00005F27864E552C62A44E926CAA623782B154D7534E733E6ED1753B52125316 +8BDD69D05F8A60006DEE574F6B2273AF68538FD87F13636260A3552475EA8C62 +71156DA35BA65E7B8352614C9EC478FA87577C27768751F060F6714C66435E4C +604D8C0E707063258F895FBD606286D456DE6BC160946167534960E066668D3F +79FD4F1A70E96C478BB38BF27ED88364660F5A5A9B426D516DF78C416D3B4F19 +706B83B7621660D1970D8D27797851FB573E57FA673A75787A3D79EF7B950000 +BC +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000808C99658FF96FC08BA59E2159EC7EE97F095409678168D88F917C4D96C6 +53CA602575BE6C7253735AC97EA7632451E0810A5DF184DF628051805B634F0E +796D524260B86D4E5BC45BC28BA18BB065E25FCC964559937EE77EAA560967B7 +59394F735BB652A0835A988A8D3E753294BE50477A3C4EF767B69A7E5AC16B7C +76D1575A5C167B3A95F4714E517C80A9827059787F04832768C067EC78B17877 +62E363617B804FED526A51CF835069DB92748DF58D3189C1952E7BAD4EF60000 +BD +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000506582305251996F6E106E856DA75EFA50F559DC5C066D466C5F7586848B +686859568BB253209171964D854969127901712680F64EA490CA6D479A845A07 +56BC640594F077EB4FA5811A72E189D2997A7F347EDE527F655991758F7F8F83 +53EB7A9663ED63A5768679F888579636622A52AB8282685467706377776B7AED +6D017ED389E359D0621285C982A5754C501F4ECB75A58BEB5C4A5DFE7B4B65A4 +91D14ECA6D25895F7D2795264EC58C288FDB9773664B79818FD170EC6D780000 +BE +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00005C3D52B283465162830E775B66769CB84EAC60CA7CBE7CB37ECF4E958B66 +666F988897595883656C955C5F8475C997567ADF7ADE51C070AF7A9863EA7A76 +7EA0739697ED4E4570784E5D915253A9655165E781FC8205548E5C31759A97A0 +62D872D975BD5C459A7983CA5C40548077E94E3E6CAE805A62D2636E5DE85177 +8DDD8E1E952F4FF153E560E770AC526763509E435A1F5026773753777EE26485 +652B628963985014723589C951B38BC07EDD574783CC94A7519B541B5CFB0000 +BF +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00004FCA7AE36D5A90E19A8F55805496536154AF5F0063E9697751EF6168520A +582A52D8574E780D770B5EB761777CE0625B62974EA27095800362F770E49760 +577782DB67EF68F578D5989779D158F354B353EF6E34514B523B5BA28BFE80AF +554357A660735751542D7A7A60505B5463A762A053E362635BC767AF54ED7A9F +82E691775E9388E4593857AE630E8DE880EF57577B774FA95FEB5BBD6B3E5321 +7B5072C2684677FF773665F751B54E8F76D45CBF7AA58475594E9B4150800000 +C0 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000998861276E8357646606634656F062EC62695ED39614578362C955878721 +814A8FA3556683B167658D5684DD5A6A680F62E67BEE961151706F9C8C3063FD +89C861D27F0670C26EE57405699472FC5ECA90CE67176D6A635E52B372628001 +4F6C59E5916A70D96D9D52D24E5096F7956D857E78CA7D2F5121579264C2808B +7C7B6CEA68F1695E51B7539868A872819ECE7BF172F879BB6F137406674E91CC +9CA4793C83898354540F68174E3D538952B1783E5386522950884F8B4FD00000 +C1 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000075E27ACB7C926CA596B6529B748354E94FE9805483B28FDE95705EC9601C +6D9F5E18655B813894FE604B70BC7EC37CAE51C968817CB1826F4E248F8691CF +667E4EAE8C0564A9804A50DA759771CE5BE58FBD6F664E86648295635ED66599 +521788C270C852A3730E7433679778F797164E3490BB9CDE6DCB51DB8D41541D +62CE73B283F196F69F8494C34F367F9A51CC707596755CAD988653E64EE46E9C +740969B4786B998F7559521876246D4167F3516D9F99804B54997B3C7ABF0000 +C2 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00009686578462E29647697C5A0464027BD36F0F964B82A6536298855E907089 +63B35364864F9C819E93788C97328DEF8D429E7F6F5E79845F559646622E9A74 +541594DD4FA365C55C655C617F1586516C2F5F8B73876EE47EFF5CE6631B5B6A +6EE653754E7163A0756562A18F6E4F264ED16CA67EB68BBA841D87BA7F57903B +95237BA99AA188F8843D6D1B9A867EDC59889EBB739B780186829A6C9A82561B +541757CB4E709EA653568FC881097792999286EE6EE1851366FC61626F2B0000 +C3 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00008C298292832B76F26C135FD983BD732B8305951A6BDB77DB94C6536F8302 +51925E3D8C8C8D384E4873AB679A68859176970971646CA177095A9295416BCF +7F8E66275BD059B95A9A95E895F74EEC840C84996AAC76DF9530731B68A65B5F +772F919A97617CDC8FF78C1C5F257C7379D889C56CCC871C5BC65E4268C97720 +7EF55195514D52C95A297F05976282D763CF778485D079D26E3A5E9959998511 +706D6C1162BF76BF654F60AF95FD660E879F9E2394ED540D547D8C2C64780000 +C4 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000647986116A21819C78E864699B5462B9672B83AB58A89ED86CAB6F205BDE +964C8C0B725F67D062C772614EA959C66BCD589366AE5E5552DF6155672876EE +776672677A4662FF54EA545094A090A35A1C7EB36C164E435976801059485357 +753796BE56CA63208111607C95F96DD65462998151855AE980FD59AE9713502A +6CE55C3C62DF4F60533F817B90066EBA852B62C85E7478BE64B5637B5FF55A18 +917F9E1F5C3F634F80425B7D556E954A954D6D8560A867E072DE51DD5B810000 +C5 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000062E76CDE725B626D94AE7EBD81136D53519C5F04597452AA601259736696 +8650759F632A61E67CEF8BFA54E66B279E256BB485D5545550766CA4556A8DB4 +722C5E156015743662CD6392724C5F986E436D3E65006F5876D878D076FC7554 +522453DB4E535E9E65C1802A80D6629B5486522870AE888D8DD16CE1547880DA +57F988F48D54966A914D4F696C9B55B776C6783062A870F96F8E5F6D84EC68DA +787C7BF781A8670B9E4F636778B0576F78129739627962AB528874356BD70000 +C6 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00005564813E75B276AE533975DE50FB5C418B6C7BC7504F72479A9798D86F02 +74E27968648777A562FC98918D2B54C180584E52576A82F9840D5E7351ED74F6 +8BC45C4F57616CFC98875A4678349B448FEB7C955256625194FA4EC683868461 +83E984B257D467345703666E6D668C3166DD7011671F6B3A6816621A59BB4E03 +51C46F0667D26C8F517668CB59476B6775665D0E81109F5065D7794879419A91 +8D775C824E5E4F01542F5951780C56686C148FC45F036C7D6CE38BAB63900000 +C7 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000060706D3D72756266948E94C553438FC17B7E4EDF8C264E7E9ED494B194B3 +524D6F5C90636D458C3458115D4C6B206B4967AA545B81547F8C589985375F3A +62A26A47953965726084686577A74E544FA85DE7979864AC7FD85CED4FCF7A8D +520783044E14602F7A8394A64FB54EB279E6743452E482B964D279BD5BDD6C81 +97528F7B6C22503E537F6E0564CE66746C3060C598778BF75E86743C7A7779CB +4E1890B174036C4256DA914B6CC58D8B533A86C666F28EAF5C489A716E200000 +C8 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000053D65A369F8B8DA353BB570898A76743919B6CC9516875CA62F372AC5238 +529D7F3A7094763853749E4A69B7786E96C088D97FA4713671C3518967D374E4 +58E4651856B78BA9997662707ED560F970ED58EC4EC14EBA5FCD97E74EFB8BA4 +5203598A7EAB62544ECD65E5620E833884C98363878D71946EB65BB97ED25197 +63C967D480898339881551125B7A59828FB14E736C5D516589258F6F962E854A +745E951095F06DA682E55F3164926D128428816E9CC3585E8D5B4E0953C10000 +C9 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00004F1E6563685155D34E2764149A9A626B5AC2745F82726DA968EE50E7838E +7802674052396C997EB150BB5565715E7B5B665273CA82EB67495C715220717D +886B95EA965564C58D6181B355846C5562477F2E58924F2455468D4F664C4E0A +5C1A88F368A2634E7A0D70E7828D52FA97F65C1154E890B57ECD59628D4A86C7 +820C820D8D6664445C0461516D89793E8BBE78377533547B4F388EAB6DF15A20 +7EC5795E6C885BA15A76751A80BE614E6E1758F0751F7525727253477EF30000 +CA +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000770176DB526980DC57235E08593172EE65BD6E7F8BD75C388671534177F3 +62FE65F64EC098DF86805B9E8BC653F277E24F7F5C4E9A7659CB5F0F793A58EB +4E1667FF4E8B62ED8A93901D52BF662F55DC566C90024ED54F8D91CA99706C0F +5E0260435BA489C68BD56536624B99965B885BFF6388552E53D77626517D852C +67A268B36B8A62928F9353D482126DD1758F4E668D4E5B70719F85AF669166D9 +7F7287009ECD9F205C5E672F8FF06811675F620D7AD658855EB665706F310000 +CB +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000060555237800D6454887075295E05681362F4971C53CC723D8C016C347761 +7A0E542E77AC987A821C8BF47855671470C165AF64955636601D79C153F84E1D +6B7B80865BFA55E356DB4F3A4F3C99725DF3677E80386002988290015B8B8BBC +8BF5641C825864DE55FD82CF91654FD77D20901F7C9F50F358516EAF5BBF8BC9 +80839178849C7B97867D968B968F7EE59AD3788E5C817A57904296A7795F5B59 +635F7B0B84D168AD55067F2974107D2295016240584C4ED65B83597958540000 +CC +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000736D631E8E4B8E0F80CE82D462AC53F06CF0915E592A60016C70574D644A +8D2A762B6EE9575B6A8075F06F6D8C2D8C0857666BEF889278B363A253F970AD +6C645858642A580268E0819B55107CD650188EBA6DCC8D9F70EB638F6D9B6ED4 +7EE68404684390036DD896768BA85957727985E4817E75BC8A8A68AF52548E22 +951163D098988E44557C4F5366FF568F60D56D9552435C4959296DFB586B7530 +751C606C82148146631167618FE2773A8DF38D3494C15E165385542C70C30000 +CD +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00006C405EF7505C4EAD5EAD633A8247901A6850916E77B3540C94DC5F647AE5 +687663457B527EDF75DB507762955934900F51F879C37A8156FE5F9290146D82 +5C60571F541051546E4D56E263A89893817F8715892A9000541E5C6F81C062D6 +625881319E3596409A6E9A7C692D59A562D3553E631654C786D96D3C5A0374E6 +889C6B6A59168C4C5F2F6E7E73A9987D4E3870F75B8C7897633D665A769660CB +5B9B5A494E0781556C6A738B4EA167897F515F8065FA671B5FD859845A010000 +CE +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00005DCD5FAE537197E68FDD684556F4552F60DF4E3A6F4D7EF482C7840E59D4 +4F1F4F2A5C3E7EAC672A851A5473754F80C355829B4F4F4D6E2D8C135C096170 +536B761F6E29868A658795FB7EB9543B7A337D0A95EE55E17FC174EE631D8717 +6DA17A9D621165A1536763E16C835DEB545C94A84E4C6C618BEC5C4B65E0829C +68A7543E54346BCB6B664E9463425348821E4F0D4FAE575E620A96FE66647269 +52FF52A1609F8BEF661471996790897F785277FD6670563B54389521727A0000 +CF +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00007A00606F5E0C6089819D591560DC718470EF6EAA6C5072806A8488AD5E2D +4E605AB3559C94E36D177CFB9699620F7EC6778E867E5323971E8F9666875CE1 +4FA072ED4E0B53A6590F54136380952851484ED99C9C7EA454B88D2488548237 +95F26D8E5F265ACC663E966973B0732E53BF817A99857FA15BAA967796507EBF +76F853A2957699997BB189446E584E617FD479658BE660F354CD4EAB98795DF7 +6A6150CF54118C618427785D9704524A54EE56A395006D885BB56DC666530000 +D0 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00005C0F5B5D6821809655787B11654869544E9B6B47874E978B534F631F643A +90AA659C80C18C10519968B0537887F961C86CC46CFB8C225C5185AA82AF950C +6B238F9B65B05FFB5FC34FE18845661F8165732960FA51745211578B5F6290A2 +884C91925E78674F602759D3514451F680F853086C7996C4718A4F114FEE7F9E +673D55C5950879C088967EE3589F620C9700865A5618987B5F908BB884C49157 +53D965ED5E8F755C60647D6E5A7F7EEA7EED8F6955A75BA360AC65CB73840000 +D1 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00009009766377297EDA9774859B5B667A7496EA884052CB718F5FAA65EC8BE2 +5BFB9A6F5DE16B896C5B8BAD8BAF900A8FC5538B62BC9E269E2D54404E2B82BD +7259869C5D1688596DAF96C554D14E9A8BB6710954BD960970DF6DF976D04E25 +781487125CA95EF68A00989C960E708E6CBF594463A9773C884D6F1482735830 +71D5538C781A96C155015F6671305BB48C1A9A8C6B83592E9E2F79E76768626C +4F6F75A17F8A6D0B96336C274EF075D2517B68376F3E90808170599674760000 +D2 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000064475C2790657A918C2359DA54AC8200836F898180006930564E80367237 +91CE51B64E5F987563964E1A53F666F3814B591C6DB24E0058F9533B63D694F1 +4F9D4F0A886398905937905779FB4EEA80F075916C825B9C59E85F5D69058681 +501A5DF24E5977E34EE5827A6291661390915C794EBF5F7981C69038808475AB +4EA688D4610F6BC55FC64E4976CA6EA28BE38BAE8C0A8BD15F027FFC7FCC7ECE +8335836B56E06BB797F3963459FB541F94F66DEB5BC5996E5C395F1596900000 +D3 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000537082F16A315A749E705E947F2883B984248425836787478FCE8D6276C8 +5F719896786C662054DF62E54F6381C375C85EB896CD8E0A86F9548F6CF36D8C +6C38607F52C775285E7D4F1860A05FE75C24753190AE94C072B96CB96E389149 +670953CB53F34F5191C98BF153C85E7C8FC26DE44E8E76C26986865E611A8206 +4F594FDE903E9C7C61096E1D6E1496854E885A3196E84E0E5C7F79B95B878BED +7FBD738957DF828B90C15401904755BB5CEA5FA161086B3272F180B28A890000 +D4 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00006D745BD388D598848C6B9A6D9E336E0A51A4514357A38881539F63F48F95 +56ED54585706733F6E907F188FDC82D1613F6028966266F07EA68D8A8DC394A5 +5CB37CA4670860A6960580184E9190E75300966851418FD08574915D665597F5 +5B55531D78386742683D54C9707E5BB08F7D518D572854B1651266828D5E8D43 +810F846C906D7CDF51FF85FB67A365E96FA186A48E81566A90207682707671E5 +8D2362E952196CFD8D3C600E589E618E66FE8D60624E55B36E23672D8F670000 +D5 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000094E195F87728680569A8548B4E4D70B88BC86458658B5B857A84503A5BE8 +77BB6BE18A797C986CBE76CF65A98F975D2D5C5586386808536062187AD96E5B +7EFD6A1F7AE05F706F335F20638C6DA867564E085E108D264ED780C07634969C +62DB662D627E6CBC8D7571677F695146808753EC906E629854F286F08F998005 +951785178FD96D5973CD659F771F7504782781FB8D1E94884FA6679575B98BCA +9707632F9547963584B8632377415F8172F04E896014657462EF6B63653F0000 +D6 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00005E2775C790D18BC1829D679D652F5431871877E580A281026C414E4B7EC7 +804C76F4690D6B966267503C4F84574063076B628DBE53EA65E87EB85FD7631A +63B781F381F47F6E5E1C5CD95236667A79E97A1A8D28709975D46EDE6CBB7A92 +4E2D76C55FE0949F88777EC879CD80BF91CD4EF24F17821F54685DDE6D328BCC +7CA58F7480985E1A549276B15B99663C9AA473E0682A86DB6731732A8BF88BDB +90107AF970DB716E62C477A956314E3B845767F152A986C08D2E94F87B510000 +D7 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00004F4F6CE8795D9A7B6293722A62FD4E1378168F6C64B08D5A7BC668695E84 +88C55986649E58EE72B6690E95258FFD8D5857607F008C0651C6634962D95353 +684C74228301914C55447740707C6D4A517954A88D4459FF6ECB6DC45B5C7D2B +4ED47C7D6ED35B5081EA6E0D5B579B0368D58E2A5B977EFC603B7EB590B98D70 +594F63CD79DF8DB3535265CF79568BC5963B7EC494BB7E825634918967007F6A +5C0A907566285DE64F5067DE505A4F5C57505EA7000000000000000000000000 +D8 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00004E8D4E0C51404E105EFF53454E154E984E1E9B325B6C56694E2879BA4E3F +53154E47592D723B536E6C1056DF80E499976BD3777E9F174E364E9F9F104E5C +4E694E9382885B5B556C560F4EC4538D539D53A353A553AE97658D5D531A53F5 +5326532E533E8D5C5366536352025208520E522D5233523F5240524C525E5261 +525C84AF527D528252815290529351827F544EBB4EC34EC94EC24EE84EE14EEB +4EDE4F1B4EF34F224F644EF54F254F274F094F2B4F5E4F6765384F5A4F5D0000 +D9 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00004F5F4F574F324F3D4F764F744F914F894F834F8F4F7E4F7B4FAA4F7C4FAC +4F944FE64FE84FEA4FC54FDA4FE34FDC4FD14FDF4FF85029504C4FF3502C500F +502E502D4FFE501C500C50255028507E504350555048504E506C507B50A550A7 +50A950BA50D6510650ED50EC50E650EE5107510B4EDD6C3D4F584F654FCE9FA0 +6C467C74516E5DFD9EC999985181591452F9530D8A07531051EB591951554EA0 +51564EB3886E88A44EB5811488D279805B3488037FB851AB51B151BD51BC0000 +DA +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000051C7519651A251A58BA08BA68BA78BAA8BB48BB58BB78BC28BC38BCB8BCF +8BCE8BD28BD38BD48BD68BD88BD98BDC8BDF8BE08BE48BE88BE98BEE8BF08BF3 +8BF68BF98BFC8BFF8C008C028C048C078C0C8C0F8C118C128C148C158C168C19 +8C1B8C188C1D8C1F8C208C218C258C278C2A8C2B8C2E8C2F8C328C338C358C36 +5369537A961D962296219631962A963D963C964296499654965F9667966C9672 +96749688968D969796B09097909B909D909990AC90A190B490B390B690BA0000 +DB +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000090B890B090CF90C590BE90D090C490C790D390E690E290DC90D790DB90EB +90EF90FE91049122911E91239131912F913991439146520D594252A252AC52AD +52BE54FF52D052D652F053DF71EE77CD5EF451F551FC9B2F53B65F01755A5DEF +574C57A957A1587E58BC58C558D15729572C572A57335739572E572F575C573B +574257695785576B5786577C577B5768576D5776577357AD57A4578C57B257CF +57A757B4579357A057D557D857DA57D957D257B857F457EF57F857E457DD0000 +DC +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000580B580D57FD57ED5800581E5819584458205865586C58815889589A5880 +99A89F1961FF8279827D827F828F828A82A88284828E82918297829982AB82B8 +82BE82B082C882CA82E3829882B782AE82CB82CC82C182A982B482A182AA829F +82C482CE82A482E1830982F782E4830F830782DC82F482D282D8830C82FB82D3 +8311831A83068314831582E082D5831C8351835B835C83088392833C83348331 +839B835E832F834F83478343835F834083178360832D833A8333836683650000 +DD +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00008368831B8369836C836A836D836E83B0837883B383B483A083AA8393839C +8385837C83B683A9837D83B8837B8398839E83A883BA83BC83C1840183E583D8 +58078418840B83DD83FD83D6841C84388411840683D483DF840F840383F883F9 +83EA83C583C0842683F083E1845C8451845A8459847384878488847A84898478 +843C844684698476848C848E8431846D84C184CD84D084E684BD84D384CA84BF +84BA84E084A184B984B4849784E584E3850C750D853884F08539851F853A0000 +DE +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00008556853B84FF84FC8559854885688564855E857A77A285438572857B85A4 +85A88587858F857985AE859C858585B985B785B085D385C185DC85FF86278605 +86298616863C5EFE5F08593C594180375955595A5958530F5C225C255C2C5C34 +624C626A629F62BB62CA62DA62D762EE632262F66339634B634363AD63F66371 +637A638E63B4636D63AC638A636963AE63BC63F263F863E063FF63C463DE63CE +645263C663BE64456441640B641B6420640C64266421645E6484646D64960000 +DF +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000647A64B764B8649964BA64C064D064D764E464E265096525652E5F0B5FD2 +75195F11535F53F153FD53E953E853FB541254165406544B5452545354545456 +54435421545754595423543254825494547754715464549A549B548454765466 +549D54D054AD54C254B454D254A754A654D354D4547254A354D554BB54BF54CC +54D954DA54DC54A954AA54A454DD54CF54DE551B54E7552054FD551454F35522 +5523550F55115527552A5567558F55B55549556D55415555553F5550553C0000 +E0 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00005537555655755576557755335530555C558B55D2558355B155B955885581 +559F557E55D65591557B55DF55BD55BE5594559955EA55F755C9561F55D155EB +55EC55D455E655DD55C455EF55E555F255F355CC55CD55E855F555E48F94561E +5608560C56015624562355FE56005627562D565856395657562C564D56625659 +565C564C5654568656645671566B567B567C5685569356AF56D456D756DD56E1 +56F556EB56F956FF5704570A5709571C5E0F5E195E145E115E315E3B5E3C0000 +E1 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00005E375E445E545E5B5E5E5E615C8C5C7A5C8D5C905C965C885C985C995C91 +5C9A5C9C5CB55CA25CBD5CAC5CAB5CB15CA35CC15CB75CC45CD25CE45CCB5CE5 +5D025D035D275D265D2E5D245D1E5D065D1B5D585D3E5D345D3D5D6C5D5B5D6F +5D5D5D6B5D4B5D4A5D695D745D825D995D9D8C735DB75DC55F735F775F825F87 +5F895F8C5F955F995F9C5FA85FAD5FB55FBC88625F6172AD72B072B472B772B8 +72C372C172CE72CD72D272E872EF72E972F272F472F7730172F3730372FA0000 +E2 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000072FB731773137321730A731E731D7315732273397325732C733873317350 +734D73577360736C736F737E821B592598E7592459029963996799689969996A +996B996C99749977997D998099849987998A998D999099919993999499955E80 +5E915E8B5E965EA55EA05EB95EB55EBE5EB38D535ED25ED15EDB5EE85EEA81BA +5FC45FC95FD65FCF60035FEE60045FE15FE45FFE600560065FEA5FED5FF86019 +60356026601B600F600D6029602B600A603F602160786079607B607A60420000 +E3 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000606A607D6096609A60AD609D60836092608C609B60EC60BB60B160DD60D8 +60C660DA60B4612061266115612360F46100610E612B614A617561AC619461A7 +61B761D461F55FDD96B395E995EB95F195F395F595F695FC95FE960396049606 +9608960A960B960C960D960F96129615961696179619961A4E2C723F62156C35 +6C546C5C6C4A6CA36C856C906C946C8C6C686C696C746C766C866CA96CD06CD4 +6CAD6CF76CF86CF16CD76CB26CE06CD66CFA6CEB6CEE6CB16CD36CEF6CFE0000 +E4 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00006D396D276D0C6D436D486D076D046D196D0E6D2B6D4D6D2E6D356D1A6D4F +6D526D546D336D916D6F6D9E6DA06D5E6D936D946D5C6D606D7C6D636E1A6DC7 +6DC56DDE6E0E6DBF6DE06E116DE66DDD6DD96E166DAB6E0C6DAE6E2B6E6E6E4E +6E6B6EB26E5F6E866E536E546E326E256E446EDF6EB16E986EE06F2D6EE26EA5 +6EA76EBD6EBB6EB76ED76EB46ECF6E8F6EC26E9F6F626F466F476F246F156EF9 +6F2F6F366F4B6F746F2A6F096F296F896F8D6F8C6F786F726F7C6F7A6FD10000 +E5 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00006FC96FA76FB96FB66FC26FE16FEE6FDE6FE06FEF701A7023701B70397035 +704F705E5B805B845B955B935BA55BB8752F9A9E64345BE45BEE89305BF08E47 +8B078FB68FD38FD58FE58FEE8FE48FE98FE68FF38FE890059004900B90269011 +900D9016902190359036902D902F9044905190529050906890589062905B66B9 +9074907D908290889083908B5F505F575F565F585C3B54AB5C505C595B715C63 +5C667FBC5F2A5F295F2D82745F3C9B3B5C6E59815983598D59A959AA59A30000 +E6 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000599759CA59AB599E59A459D259B259AF59D759BE5A055A0659DD5A0859E3 +59D859F95A0C5A095A325A345A115A235A135A405A675A4A5A555A3C5A625A75 +80EC5AAA5A9B5A775A7A5ABE5AEB5AB25AD25AD45AB85AE05AE35AF15AD65AE6 +5AD85ADC5B095B175B165B325B375B405C155C1C5B5A5B655B735B515B535B62 +9A759A779A789A7A9A7F9A7D9A809A819A859A889A8A9A909A929A939A969A98 +9A9B9A9C9A9D9A9F9AA09AA29AA39AA59AA77E9F7EA17EA37EA57EA87EA90000 +E7 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00007EAD7EB07EBE7EC07EC17EC27EC97ECB7ECC7ED07ED47ED77EDB7EE07EE1 +7EE87EEB7EEE7EEF7EF17EF27F0D7EF67EFA7EFB7EFE7F017F027F037F077F08 +7F0B7F0C7F0F7F117F127F177F197F1C7F1B7F1F7F217F227F237F247F257F26 +7F277F2A7F2B7F2C7F2D7F2F7F307F317F327F337F355E7A757F5DDB753E9095 +738E739173AE73A2739F73CF73C273D173B773B373C073C973C873E573D9987C +740A73E973E773DE73BA73F2740F742A745B7426742574287430742E742C0000 +E8 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000741B741A7441745C7457745574597477746D747E749C748E748074817487 +748B749E74A874A9749074A774D274BA97EA97EB97EC674C6753675E67486769 +67A56787676A6773679867A7677567A8679E67AD678B6777677C67F0680967D8 +680A67E967B0680C67D967B567DA67B367DD680067C367B867E2680E67C167FD +6832683368606861684E6862684468646883681D68556866684168676840683E +684A6849682968B5688F687468776893686B68C2696E68FC691F692068F90000 +E9 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000692468F0690B6901695768E369106971693969606942695D6984696B6980 +69986978693469CC6987698869CE6989696669636979699B69A769BB69AB69AD +69D469B169C169CA69DF699569E0698D69FF6A2F69ED6A176A186A6569F26A44 +6A3E6AA06A506A5B6A356A8E6A796A3D6A286A586A7C6A916A906AA96A976AAB +733773526B816B826B876B846B926B936B8D6B9A6B9B6BA16BAA8F6B8F6D8F71 +8F728F738F758F768F788F778F798F7A8F7C8F7E8F818F828F848F878F8B0000 +EA +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00008F8D8F8E8F8F8F988F9A8ECE620B6217621B621F6222622162256224622C +81E774EF74F474FF750F75117513653465EE65EF65F0660A6619677266036615 +6600708566F7661D66346631663666358006665F66546641664F665666616657 +66776684668C66A7669D66BE66DB66DC66E666E98D328D338D368D3B8D3D8D40 +8D458D468D488D498D478D4D8D558D5989C789CA89CB89CC89CE89CF89D089D1 +726E729F725D7266726F727E727F7284728B728D728F72926308633263B00000 +EB +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000643F64D880046BEA6BF36BFD6BF56BF96C056C076C066C0D6C156C186C19 +6C1A6C216C296C246C2A6C3265356555656B724D72527256723086625216809F +809C809380BC670A80BD80B180AB80AD80B480B780E780E880E980EA80DB80C2 +80C480D980CD80D7671080DD80EB80F180F480ED810D810E80F280FC67158112 +8C5A8136811E812C811881328148814C815381748159815A817181608169817C +817D816D8167584D5AB58188818281916ED581A381AA81CC672681CA81BB0000 +EC +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000081C181A66B246B376B396B436B466B5998D198D298D398D598D998DA6BB3 +5F406BC289F365909F51659365BC65C665C465C365CC65CE65D265D67080709C +7096709D70BB70C070B770AB70B170E870CA711071137116712F71317173715C +716871457172714A7178717A719871B371B571A871A071E071D471E771F9721D +7228706C7118716671B9623E623D624362486249793B794079467949795B795C +7953795A796279577960796F7967797A7985798A799A79A779B35FD15FD00000 +ED +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000603C605D605A606760416059606360AB6106610D615D61A9619D61CB61D1 +62068080807F6C936CF66DFC77F677F87800780978177818781165AB782D781C +781D7839783A783B781F783C7825782C78237829784E786D7856785778267850 +7847784C786A789B7893789A7887789C78A178A378B278B978A578D478D978C9 +78EC78F2790578F479137924791E79349F9B9EF99EFB9EFC76F17704770D76F9 +77077708771A77227719772D7726773577387750775177477743775A77680000 +EE +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000077627765777F778D777D7780778C7791779F77A077B077B577BD753A7540 +754E754B7548755B7572757975837F587F617F5F8A487F687F747F717F797F81 +7F7E76CD76E58832948594869487948B948A948C948D948F9490949494979495 +949A949B949C94A394A494AB94AA94AD94AC94AF94B094B294B494B694B794B8 +94B994BA94BC94BD94BF94C494C894C994CA94CB94CC94CD94CE94D094D194D2 +94D594D694D794D994D894DB94DE94DF94E094E294E494E594E794E894EA0000 +EF +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000094E994EB94EE94EF94F394F494F594F794F994FC94FD94FF950395029506 +95079509950A950D950E950F951295139514951595169518951B951D951E951F +9522952A952B9529952C953195329534953695379538953C953E953F95429535 +9544954595469549954C954E954F9552955395549556955795589559955B955E +955F955D95619562956495659566956795689569956A956B956C956F95719572 +9573953A77E777EC96C979D579ED79E379EB7A065D477A037A027A1E7A140000 +F0 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00007A397A377A519ECF99A57A707688768E7693769976A474DE74E0752C9E20 +9E229E289E299E2A9E2B9E2C9E329E319E369E389E379E399E3A9E3E9E419E42 +9E449E469E479E489E499E4B9E4C9E4E9E519E559E579E5A9E5B9E5C9E5E9E63 +9E669E679E689E699E6A9E6B9E6C9E719E6D9E7375927594759675A0759D75AC +75A375B375B475B875C475B175B075C375C275D675CD75E375E875E675E475EB +75E7760375F175FC75FF761076007605760C7617760A76257618761576190000 +F1 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000761B763C762276207640762D7630763F76357643763E7633764D765E7654 +765C7656766B766F7FCA7AE67A787A797A807A867A887A957AA67AA07AAC7AA8 +7AAD7AB3886488698872887D887F888288A288C688B788BC88C988E288CE88E3 +88E588F1891A88FC88E888FE88F0892189198913891B890A8934892B89368941 +8966897B758B80E576B276B477DC801280148016801C80208022802580268027 +802980288031800B803580438046804D80528069807189839878988098830000 +F2 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00009889988C988D988F9894989A989B989E989F98A198A298A598A6864D8654 +866C866E867F867A867C867B86A8868D868B86AC869D86A786A386AA869386A9 +86B686C486B586CE86B086BA86B186AF86C986CF86B486E986F186F286ED86F3 +86D0871386DE86F486DF86D886D18703870786F88708870A870D87098723873B +871E8725872E871A873E87488734873187298737873F87828722877D877E877B +87608770874C876E878B87538763877C876487598765879387AF87A887D20000 +F3 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000087C68788878587AD8797878387AB87E587AC87B587B387CB87D387BD87D1 +87C087CA87DB87EA87E087EE8816881387FE880A881B88218839883C7F367F42 +7F447F4582107AFA7AFD7B087B037B047B157B0A7B2B7B0F7B477B387B2A7B19 +7B2E7B317B207B257B247B337B3E7B1E7B587B5A7B457B757B4C7B5D7B607B6E +7B7B7B627B727B717B907BA67BA77BB87BAC7B9D7BA87B857BAA7B9C7BA27BAB +7BB47BD17BC17BCC7BDD7BDA7BE57BE67BEA7C0C7BFE7BFC7C0F7C167C0B0000 +F4 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00007C1F7C2A7C267C387C417C4081FE82018202820481EC8844822182228223 +822D822F8228822B8238823B82338234823E82448249824B824F825A825F8268 +887E8885888888D888DF895E7F9D7F9F7FA77FAF7FB07FB27C7C65497C917C9D +7C9C7C9E7CA27CB27CBC7CBD7CC17CC77CCC7CCD7CC87CC57CD77CE8826E66A8 +7FBF7FCE7FD57FE57FE17FE67FE97FEE7FF37CF87D777DA67DAE7E477E9B9EB8 +9EB48D738D848D948D918DB18D678D6D8C478C49914A9150914E914F91640000 +F5 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00009162916191709169916F917D917E917291749179918C91859190918D9191 +91A291A391AA91AD91AE91AF91B591B491BA8C559E7E8DB88DEB8E058E598E69 +8DB58DBF8DBC8DBA8DC48DD68DD78DDA8DDE8DCE8DCF8DDB8DC68DEC8DF78DF8 +8DE38DF98DFB8DE48E098DFD8E148E1D8E1F8E2C8E2E8E238E2F8E3A8E408E39 +8E358E3D8E318E498E418E428E518E528E4A8E708E768E7C8E6F8E748E858E8F +8E948E908E9C8E9E8C788C828C8A8C858C988C94659B89D689DE89DA89DC0000 +F6 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000089E589EB89EF8A3E8B26975396E996F396EF970697019708970F970E972A +972D9730973E9F809F839F859F869F879F889F899F8A9F8C9EFE9F0B9F0D96B9 +96BC96BD96CE96D277BF96E0928E92AE92C8933E936A93CA938F943E946B9C7F +9C829C859C869C879C887A239C8B9C8E9C909C919C929C949C959C9A9C9B9C9E +9C9F9CA09CA19CA29CA39CA59CA69CA79CA89CA99CAB9CAD9CAE9CB09CB19CB2 +9CB39CB49CB59CB69CB79CBA9CBB9CBC9CBD9CC49CC59CC69CC79CCA9CCB0000 +F7 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00009CCC9CCD9CCE9CCF9CD09CD39CD49CD59CD79CD89CD99CDC9CDD9CDF9CE2 +977C978597919792979497AF97AB97A397B297B49AB19AB09AB79E589AB69ABA +9ABC9AC19AC09AC59AC29ACB9ACC9AD19B459B439B479B499B489B4D9B5198E8 +990D992E995599549ADF9AE19AE69AEF9AEB9AFB9AED9AF99B089B0F9B139B1F +9B239EBD9EBE7E3B9E829E879E889E8B9E9293D69E9D9E9F9EDB9EDC9EDD9EE0 +9EDF9EE29EE99EE79EE59EEA9EEF9F229F2C9F2F9F399F379F3D9F3E9F440000 diff --git a/env/tcl/tcl8.6/encoding/iso2022-jp.enc b/env/tcl/tcl8.6/encoding/iso2022-jp.enc new file mode 100644 index 0000000..f6dabe5 --- /dev/null +++ b/env/tcl/tcl8.6/encoding/iso2022-jp.enc @@ -0,0 +1,12 @@ +# Encoding file: iso2022-jp, escape-driven +E +name iso2022-jp +init {} +final {} +ascii \x1b(B +jis0201 \x1b(J +jis0208 \x1b$B +jis0208 \x1b$@ +jis0212 \x1b$(D +gb2312 \x1b$A +ksc5601 \x1b$(C diff --git a/env/tcl/tcl8.6/encoding/iso2022-kr.enc b/env/tcl/tcl8.6/encoding/iso2022-kr.enc new file mode 100644 index 0000000..d20ce2b --- /dev/null +++ b/env/tcl/tcl8.6/encoding/iso2022-kr.enc @@ -0,0 +1,7 @@ +# Encoding file: iso2022-kr, escape-driven +E +name iso2022-kr +init \x1b$)C +final {} +iso8859-1 \x0f +ksc5601 \x0e diff --git a/env/tcl/tcl8.6/encoding/iso2022.enc b/env/tcl/tcl8.6/encoding/iso2022.enc new file mode 100644 index 0000000..a58f8e3 --- /dev/null +++ b/env/tcl/tcl8.6/encoding/iso2022.enc @@ -0,0 +1,14 @@ +# Encoding file: iso2022, escape-driven +E +name iso2022 +init {} +final {} +iso8859-1 \x1b(B +jis0201 \x1b(J +gb1988 \x1b(T +jis0208 \x1b$B +jis0208 \x1b$@ +jis0212 \x1b$(D +gb2312 \x1b$A +ksc5601 \x1b$(C +jis0208 \x1b&@\x1b$B diff --git a/env/tcl/tcl8.6/encoding/iso8859-1.enc b/env/tcl/tcl8.6/encoding/iso8859-1.enc new file mode 100644 index 0000000..045d8fa --- /dev/null +++ b/env/tcl/tcl8.6/encoding/iso8859-1.enc @@ -0,0 +1,20 @@ +# Encoding file: iso8859-1, single-byte +S +003F 0 1 +00 +0000000100020003000400050006000700080009000A000B000C000D000E000F +0010001100120013001400150016001700180019001A001B001C001D001E001F +0020002100220023002400250026002700280029002A002B002C002D002E002F +0030003100320033003400350036003700380039003A003B003C003D003E003F +0040004100420043004400450046004700480049004A004B004C004D004E004F +0050005100520053005400550056005700580059005A005B005C005D005E005F +0060006100620063006400650066006700680069006A006B006C006D006E006F +0070007100720073007400750076007700780079007A007B007C007D007E007F +0080008100820083008400850086008700880089008A008B008C008D008E008F +0090009100920093009400950096009700980099009A009B009C009D009E009F +00A000A100A200A300A400A500A600A700A800A900AA00AB00AC00AD00AE00AF +00B000B100B200B300B400B500B600B700B800B900BA00BB00BC00BD00BE00BF +00C000C100C200C300C400C500C600C700C800C900CA00CB00CC00CD00CE00CF +00D000D100D200D300D400D500D600D700D800D900DA00DB00DC00DD00DE00DF +00E000E100E200E300E400E500E600E700E800E900EA00EB00EC00ED00EE00EF +00F000F100F200F300F400F500F600F700F800F900FA00FB00FC00FD00FE00FF diff --git a/env/tcl/tcl8.6/encoding/iso8859-10.enc b/env/tcl/tcl8.6/encoding/iso8859-10.enc new file mode 100644 index 0000000..934b3b9 --- /dev/null +++ b/env/tcl/tcl8.6/encoding/iso8859-10.enc @@ -0,0 +1,20 @@ +# Encoding file: iso8859-10, single-byte +S +003F 0 1 +00 +0000000100020003000400050006000700080009000A000B000C000D000E000F +0010001100120013001400150016001700180019001A001B001C001D001E001F +0020002100220023002400250026002700280029002A002B002C002D002E002F +0030003100320033003400350036003700380039003A003B003C003D003E003F +0040004100420043004400450046004700480049004A004B004C004D004E004F +0050005100520053005400550056005700580059005A005B005C005D005E005F +0060006100620063006400650066006700680069006A006B006C006D006E006F +0070007100720073007400750076007700780079007A007B007C007D007E007F +0080008100820083008400850086008700880089008A008B008C008D008E008F +0090009100920093009400950096009700980099009A009B009C009D009E009F +00A0010401120122012A0128013600A7013B011001600166017D00AD016A014A +00B0010501130123012B0129013700B7013C011101610167017E2015016B014B +010000C100C200C300C400C500C6012E010C00C9011800CB011600CD00CE00CF +00D00145014C00D300D400D500D6016800D8017200DA00DB00DC00DD00DE00DF +010100E100E200E300E400E500E6012F010D00E9011900EB011700ED00EE00EF +00F00146014D00F300F400F500F6016900F8017300FA00FB00FC00FD00FE0138 diff --git a/env/tcl/tcl8.6/encoding/iso8859-13.enc b/env/tcl/tcl8.6/encoding/iso8859-13.enc new file mode 100644 index 0000000..b7edcaf --- /dev/null +++ b/env/tcl/tcl8.6/encoding/iso8859-13.enc @@ -0,0 +1,20 @@ +# Encoding file: iso8859-13, single-byte +S +003F 0 1 +00 +0000000100020003000400050006000700080009000A000B000C000D000E000F +0010001100120013001400150016001700180019001A001B001C001D001E001F +0020002100220023002400250026002700280029002A002B002C002D002E002F +0030003100320033003400350036003700380039003A003B003C003D003E003F +0040004100420043004400450046004700480049004A004B004C004D004E004F +0050005100520053005400550056005700580059005A005B005C005D005E005F +0060006100620063006400650066006700680069006A006B006C006D006E006F +0070007100720073007400750076007700780079007A007B007C007D007E007F +0080008100820083008400850086008700880089008A008B008C008D008E008F +0090009100920093009400950096009700980099009A009B009C009D009E009F +00A0201D00A200A300A4201E00A600A700D800A9015600AB00AC00AD00AE00C6 +00B000B100B200B3201C00B500B600B700F800B9015700BB00BC00BD00BE00E6 +0104012E0100010600C400C501180112010C00C90179011601220136012A013B +01600143014500D3014C00D500D600D701720141015A016A00DC017B017D00DF +0105012F0101010700E400E501190113010D00E9017A011701230137012B013C +01610144014600F3014D00F500F600F701730142015B016B00FC017C017E2019 diff --git a/env/tcl/tcl8.6/encoding/iso8859-14.enc b/env/tcl/tcl8.6/encoding/iso8859-14.enc new file mode 100644 index 0000000..a65ba05 --- /dev/null +++ b/env/tcl/tcl8.6/encoding/iso8859-14.enc @@ -0,0 +1,20 @@ +# Encoding file: iso8859-14, single-byte +S +003F 0 1 +00 +0000000100020003000400050006000700080009000A000B000C000D000E000F +0010001100120013001400150016001700180019001A001B001C001D001E001F +0020002100220023002400250026002700280029002A002B002C002D002E002F +0030003100320033003400350036003700380039003A003B003C003D003E003F +0040004100420043004400450046004700480049004A004B004C004D004E004F +0050005100520053005400550056005700580059005A005B005C005D005E005F +0060006100620063006400650066006700680069006A006B006C006D006E006F +0070007100720073007400750076007700780079007A007B007C007D007E007F +0080008100820083008400850086008700880089008A008B008C008D008E008F +0090009100920093009400950096009700980099009A009B009C009D009E009F +00A01E021E0300A3010A010B1E0A00A71E8000A91E821E0B1EF200AD00AE0178 +1E1E1E1F012001211E401E4100B61E561E811E571E831E601EF31E841E851E61 +00C000C100C200C300C400C500C600C700C800C900CA00CB00CC00CD00CE00CF +017400D100D200D300D400D500D61E6A00D800D900DA00DB00DC00DD017600DF +00E000E100E200E300E400E500E600E700E800E900EA00EB00EC00ED00EE00EF +017500F100F200F300F400F500F61E6B00F800F900FA00FB00FC00FD017700FF diff --git a/env/tcl/tcl8.6/encoding/iso8859-15.enc b/env/tcl/tcl8.6/encoding/iso8859-15.enc new file mode 100644 index 0000000..823af46 --- /dev/null +++ b/env/tcl/tcl8.6/encoding/iso8859-15.enc @@ -0,0 +1,20 @@ +# Encoding file: iso8859-15, single-byte +S +003F 0 1 +00 +0000000100020003000400050006000700080009000A000B000C000D000E000F +0010001100120013001400150016001700180019001A001B001C001D001E001F +0020002100220023002400250026002700280029002A002B002C002D002E002F +0030003100320033003400350036003700380039003A003B003C003D003E003F +0040004100420043004400450046004700480049004A004B004C004D004E004F +0050005100520053005400550056005700580059005A005B005C005D005E005F +0060006100620063006400650066006700680069006A006B006C006D006E006F +0070007100720073007400750076007700780079007A007B007C007D007E007F +0080008100820083008400850086008700880089008A008B008C008D008E008F +0090009100920093009400950096009700980099009A009B009C009D009E009F +00A000A100A200A320AC00A5016000A7016100A900AA00AB00AC00AD00AE00AF +00B000B100B200B3017D00B500B600B7017E00B900BA00BB01520153017800BF +00C000C100C200C300C400C500C600C700C800C900CA00CB00CC00CD00CE00CF +00D000D100D200D300D400D500D600D700D800D900DA00DB00DC00DD00DE00DF +00E000E100E200E300E400E500E600E700E800E900EA00EB00EC00ED00EE00EF +00F000F100F200F300F400F500F600F700F800F900FA00FB00FC00FD00FE00FF diff --git a/env/tcl/tcl8.6/encoding/iso8859-16.enc b/env/tcl/tcl8.6/encoding/iso8859-16.enc new file mode 100644 index 0000000..da33709 --- /dev/null +++ b/env/tcl/tcl8.6/encoding/iso8859-16.enc @@ -0,0 +1,20 @@ +# Encoding file: iso8859-16, single-byte +S +003F 0 1 +00 +0000000100020003000400050006000700080009000A000B000C000D000E000F +0010001100120013001400150016001700180019001A001B001C001D001E001F +0020002100220023002400250026002700280029002A002B002C002D002E002F +0030003100320033003400350036003700380039003A003B003C003D003E003F +0040004100420043004400450046004700480049004A004B004C004D004E004F +0050005100520053005400550056005700580059005A005B005C005D005E005F +0060006100620063006400650066006700680069006A006B006C006D006E006F +0070007100720073007400750076007700780079007A007B007C007D007E007F +0080008100820083008400850086008700880089008A008B008C008D008E008F +0090009100920093009400950096009700980099009A009B009C009D009E009F +00A001040105014120AC201E016000A7016100A9021800AB017900AD017A017B +00B000B1010C0142017D201D00B600B7017E010D021900BB015201530178017C +00C000C100C2010200C4010600C600C700C800C900CA00CB00CC00CD00CE00CF +0110014300D200D300D4015000D6015A017000D900DA00DB00DC0118021A00DF +00E000E100E2010300E4010700E600E700E800E900EA00EB00EC00ED00EE00EF +0111014400F200F300F4015100F6015B017100F900FA00FB00FC0119021B00FF diff --git a/env/tcl/tcl8.6/encoding/iso8859-2.enc b/env/tcl/tcl8.6/encoding/iso8859-2.enc new file mode 100644 index 0000000..16faab6 --- /dev/null +++ b/env/tcl/tcl8.6/encoding/iso8859-2.enc @@ -0,0 +1,20 @@ +# Encoding file: iso8859-2, single-byte +S +003F 0 1 +00 +0000000100020003000400050006000700080009000A000B000C000D000E000F +0010001100120013001400150016001700180019001A001B001C001D001E001F +0020002100220023002400250026002700280029002A002B002C002D002E002F +0030003100320033003400350036003700380039003A003B003C003D003E003F +0040004100420043004400450046004700480049004A004B004C004D004E004F +0050005100520053005400550056005700580059005A005B005C005D005E005F +0060006100620063006400650066006700680069006A006B006C006D006E006F +0070007100720073007400750076007700780079007A007B007C007D007E007F +0080008100820083008400850086008700880089008A008B008C008D008E008F +0090009100920093009400950096009700980099009A009B009C009D009E009F +00A0010402D8014100A4013D015A00A700A80160015E0164017900AD017D017B +00B0010502DB014200B4013E015B02C700B80161015F0165017A02DD017E017C +015400C100C2010200C40139010600C7010C00C9011800CB011A00CD00CE010E +01100143014700D300D4015000D600D70158016E00DA017000DC00DD016200DF +015500E100E2010300E4013A010700E7010D00E9011900EB011B00ED00EE010F +01110144014800F300F4015100F600F70159016F00FA017100FC00FD016302D9 diff --git a/env/tcl/tcl8.6/encoding/iso8859-3.enc b/env/tcl/tcl8.6/encoding/iso8859-3.enc new file mode 100644 index 0000000..c914bce --- /dev/null +++ b/env/tcl/tcl8.6/encoding/iso8859-3.enc @@ -0,0 +1,20 @@ +# Encoding file: iso8859-3, single-byte +S +003F 0 1 +00 +0000000100020003000400050006000700080009000A000B000C000D000E000F +0010001100120013001400150016001700180019001A001B001C001D001E001F +0020002100220023002400250026002700280029002A002B002C002D002E002F +0030003100320033003400350036003700380039003A003B003C003D003E003F +0040004100420043004400450046004700480049004A004B004C004D004E004F +0050005100520053005400550056005700580059005A005B005C005D005E005F +0060006100620063006400650066006700680069006A006B006C006D006E006F +0070007100720073007400750076007700780079007A007B007C007D007E007F +0080008100820083008400850086008700880089008A008B008C008D008E008F +0090009100920093009400950096009700980099009A009B009C009D009E009F +00A0012602D800A300A40000012400A700A80130015E011E013400AD0000017B +00B0012700B200B300B400B5012500B700B80131015F011F013500BD0000017C +00C000C100C2000000C4010A010800C700C800C900CA00CB00CC00CD00CE00CF +000000D100D200D300D4012000D600D7011C00D900DA00DB00DC016C015C00DF +00E000E100E2000000E4010B010900E700E800E900EA00EB00EC00ED00EE00EF +000000F100F200F300F4012100F600F7011D00F900FA00FB00FC016D015D02D9 diff --git a/env/tcl/tcl8.6/encoding/iso8859-4.enc b/env/tcl/tcl8.6/encoding/iso8859-4.enc new file mode 100644 index 0000000..ef5c5a9 --- /dev/null +++ b/env/tcl/tcl8.6/encoding/iso8859-4.enc @@ -0,0 +1,20 @@ +# Encoding file: iso8859-4, single-byte +S +003F 0 1 +00 +0000000100020003000400050006000700080009000A000B000C000D000E000F +0010001100120013001400150016001700180019001A001B001C001D001E001F +0020002100220023002400250026002700280029002A002B002C002D002E002F +0030003100320033003400350036003700380039003A003B003C003D003E003F +0040004100420043004400450046004700480049004A004B004C004D004E004F +0050005100520053005400550056005700580059005A005B005C005D005E005F +0060006100620063006400650066006700680069006A006B006C006D006E006F +0070007100720073007400750076007700780079007A007B007C007D007E007F +0080008100820083008400850086008700880089008A008B008C008D008E008F +0090009100920093009400950096009700980099009A009B009C009D009E009F +00A001040138015600A40128013B00A700A8016001120122016600AD017D00AF +00B0010502DB015700B40129013C02C700B80161011301230167014A017E014B +010000C100C200C300C400C500C6012E010C00C9011800CB011600CD00CE012A +01100145014C013600D400D500D600D700D8017200DA00DB00DC0168016A00DF +010100E100E200E300E400E500E6012F010D00E9011900EB011700ED00EE012B +01110146014D013700F400F500F600F700F8017300FA00FB00FC0169016B02D9 diff --git a/env/tcl/tcl8.6/encoding/iso8859-5.enc b/env/tcl/tcl8.6/encoding/iso8859-5.enc new file mode 100644 index 0000000..bf4ee82 --- /dev/null +++ b/env/tcl/tcl8.6/encoding/iso8859-5.enc @@ -0,0 +1,20 @@ +# Encoding file: iso8859-5, single-byte +S +003F 0 1 +00 +0000000100020003000400050006000700080009000A000B000C000D000E000F +0010001100120013001400150016001700180019001A001B001C001D001E001F +0020002100220023002400250026002700280029002A002B002C002D002E002F +0030003100320033003400350036003700380039003A003B003C003D003E003F +0040004100420043004400450046004700480049004A004B004C004D004E004F +0050005100520053005400550056005700580059005A005B005C005D005E005F +0060006100620063006400650066006700680069006A006B006C006D006E006F +0070007100720073007400750076007700780079007A007B007C007D007E007F +0080008100820083008400850086008700880089008A008B008C008D008E008F +0090009100920093009400950096009700980099009A009B009C009D009E009F +00A0040104020403040404050406040704080409040A040B040C00AD040E040F +0410041104120413041404150416041704180419041A041B041C041D041E041F +0420042104220423042404250426042704280429042A042B042C042D042E042F +0430043104320433043404350436043704380439043A043B043C043D043E043F +0440044104420443044404450446044704480449044A044B044C044D044E044F +2116045104520453045404550456045704580459045A045B045C00A7045E045F diff --git a/env/tcl/tcl8.6/encoding/iso8859-6.enc b/env/tcl/tcl8.6/encoding/iso8859-6.enc new file mode 100644 index 0000000..19ddefb --- /dev/null +++ b/env/tcl/tcl8.6/encoding/iso8859-6.enc @@ -0,0 +1,20 @@ +# Encoding file: iso8859-6, single-byte +S +003F 0 1 +00 +0000000100020003000400050006000700080009000A000B000C000D000E000F +0010001100120013001400150016001700180019001A001B001C001D001E001F +0020002100220023002400250026002700280029002A002B002C002D002E002F +0030003100320033003400350036003700380039003A003B003C003D003E003F +0040004100420043004400450046004700480049004A004B004C004D004E004F +0050005100520053005400550056005700580059005A005B005C005D005E005F +0060006100620063006400650066006700680069006A006B006C006D006E006F +0070007100720073007400750076007700780079007A007B007C007D007E007F +0080008100820083008400850086008700880089008A008B008C008D008E008F +0090009100920093009400950096009700980099009A009B009C009D009E009F +00A000000000000000A40000000000000000000000000000060C00AD00000000 +00000000000000000000000000000000000000000000061B000000000000061F +0000062106220623062406250626062706280629062A062B062C062D062E062F +0630063106320633063406350636063706380639063A00000000000000000000 +0640064106420643064406450646064706480649064A064B064C064D064E064F +0650065106520000000000000000000000000000000000000000000000000000 diff --git a/env/tcl/tcl8.6/encoding/iso8859-7.enc b/env/tcl/tcl8.6/encoding/iso8859-7.enc new file mode 100644 index 0000000..0f93ac8 --- /dev/null +++ b/env/tcl/tcl8.6/encoding/iso8859-7.enc @@ -0,0 +1,20 @@ +# Encoding file: iso8859-7, single-byte +S +003F 0 1 +00 +0000000100020003000400050006000700080009000A000B000C000D000E000F +0010001100120013001400150016001700180019001A001B001C001D001E001F +0020002100220023002400250026002700280029002A002B002C002D002E002F +0030003100320033003400350036003700380039003A003B003C003D003E003F +0040004100420043004400450046004700480049004A004B004C004D004E004F +0050005100520053005400550056005700580059005A005B005C005D005E005F +0060006100620063006400650066006700680069006A006B006C006D006E006F +0070007100720073007400750076007700780079007A007B007C007D007E007F +0080008100820083008400850086008700880089008A008B008C008D008E008F +0090009100920093009400950096009700980099009A009B009C009D009E009F +00A02018201900A30000000000A600A700A800A9000000AB00AC00AD00002015 +00B000B100B200B303840385038600B703880389038A00BB038C00BD038E038F +0390039103920393039403950396039703980399039A039B039C039D039E039F +03A003A1000003A303A403A503A603A703A803A903AA03AB03AC03AD03AE03AF +03B003B103B203B303B403B503B603B703B803B903BA03BB03BC03BD03BE03BF +03C003C103C203C303C403C503C603C703C803C903CA03CB03CC03CD03CE0000 diff --git a/env/tcl/tcl8.6/encoding/iso8859-8.enc b/env/tcl/tcl8.6/encoding/iso8859-8.enc new file mode 100644 index 0000000..579fa5b --- /dev/null +++ b/env/tcl/tcl8.6/encoding/iso8859-8.enc @@ -0,0 +1,20 @@ +# Encoding file: iso8859-8, single-byte +S +003F 0 1 +00 +0000000100020003000400050006000700080009000A000B000C000D000E000F +0010001100120013001400150016001700180019001A001B001C001D001E001F +0020002100220023002400250026002700280029002A002B002C002D002E002F +0030003100320033003400350036003700380039003A003B003C003D003E003F +0040004100420043004400450046004700480049004A004B004C004D004E004F +0050005100520053005400550056005700580059005A005B005C005D005E005F +0060006100620063006400650066006700680069006A006B006C006D006E006F +0070007100720073007400750076007700780079007A007B007C007D007E007F +0080008100820083008400850086008700880089008A008B008C008D008E008F +0090009100920093009400950096009700980099009A009B009C009D009E009F +00A0000000A200A300A400A500A600A700A800A900D700AB00AC00AD00AE00AF +00B000B100B200B300B400B500B600B700B800B900F700BB00BC00BD00BE0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000002017 +05D005D105D205D305D405D505D605D705D805D905DA05DB05DC05DD05DE05DF +05E005E105E205E305E405E505E605E705E805E905EA00000000200E200F0000 diff --git a/env/tcl/tcl8.6/encoding/iso8859-9.enc b/env/tcl/tcl8.6/encoding/iso8859-9.enc new file mode 100644 index 0000000..6eed3f1 --- /dev/null +++ b/env/tcl/tcl8.6/encoding/iso8859-9.enc @@ -0,0 +1,20 @@ +# Encoding file: iso8859-9, single-byte +S +003F 0 1 +00 +0000000100020003000400050006000700080009000A000B000C000D000E000F +0010001100120013001400150016001700180019001A001B001C001D001E001F +0020002100220023002400250026002700280029002A002B002C002D002E002F +0030003100320033003400350036003700380039003A003B003C003D003E003F +0040004100420043004400450046004700480049004A004B004C004D004E004F +0050005100520053005400550056005700580059005A005B005C005D005E005F +0060006100620063006400650066006700680069006A006B006C006D006E006F +0070007100720073007400750076007700780079007A007B007C007D007E007F +0080008100820083008400850086008700880089008A008B008C008D008E008F +0090009100920093009400950096009700980099009A009B009C009D009E009F +00A000A100A200A300A400A500A600A700A800A900AA00AB00AC00AD00AE00AF +00B000B100B200B300B400B500B600B700B800B900BA00BB00BC00BD00BE00BF +00C000C100C200C300C400C500C600C700C800C900CA00CB00CC00CD00CE00CF +011E00D100D200D300D400D500D600D700D800D900DA00DB00DC0130015E00DF +00E000E100E200E300E400E500E600E700E800E900EA00EB00EC00ED00EE00EF +011F00F100F200F300F400F500F600F700F800F900FA00FB00FC0131015F00FF diff --git a/env/tcl/tcl8.6/encoding/jis0201.enc b/env/tcl/tcl8.6/encoding/jis0201.enc new file mode 100644 index 0000000..64f423f --- /dev/null +++ b/env/tcl/tcl8.6/encoding/jis0201.enc @@ -0,0 +1,20 @@ +# Encoding file: jis0201, single-byte +S +003F 0 1 +00 +0000000100020003000400050006000700080009000A000B000C000D000E000F +0010001100120013001400150016001700180019001A001B001C001D001E001F +0020002100220023002400250026002700280029002A002B002C002D002E002F +0030003100320033003400350036003700380039003A003B003C003D003E003F +0040004100420043004400450046004700480049004A004B004C004D004E004F +0050005100520053005400550056005700580059005A005B005C005D005E005F +0060006100620063006400650066006700680069006A006B006C006D006E006F +0070007100720073007400750076007700780079007A007B007C007D203E007F +0080008100820083008400850086008700880089008A008B008C008D008E008F +0090009100920093009400950096009700980099009A009B009C009D009E009F +0000FF61FF62FF63FF64FF65FF66FF67FF68FF69FF6AFF6BFF6CFF6DFF6EFF6F +FF70FF71FF72FF73FF74FF75FF76FF77FF78FF79FF7AFF7BFF7CFF7DFF7EFF7F +FF80FF81FF82FF83FF84FF85FF86FF87FF88FF89FF8AFF8BFF8CFF8DFF8EFF8F +FF90FF91FF92FF93FF94FF95FF96FF97FF98FF99FF9AFF9BFF9CFF9DFF9EFF9F +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 diff --git a/env/tcl/tcl8.6/encoding/jis0208.enc b/env/tcl/tcl8.6/encoding/jis0208.enc new file mode 100644 index 0000000..11c49a4 --- /dev/null +++ b/env/tcl/tcl8.6/encoding/jis0208.enc @@ -0,0 +1,1319 @@ +# Encoding file: jis0208, double-byte +D +2129 0 77 +21 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000300030013002FF0CFF0E30FBFF1AFF1BFF1FFF01309B309C00B4FF4000A8 +FF3EFFE3FF3F30FD30FE309D309E30034EDD30053006300730FC20152010FF0F +FF3C301C2016FF5C2026202520182019201C201DFF08FF0930143015FF3BFF3D +FF5BFF5D30083009300A300B300C300D300E300F30103011FF0B221200B100D7 +00F7FF1D2260FF1CFF1E22662267221E22342642264000B0203220332103FFE5 +FF0400A200A3FF05FF03FF06FF0AFF2000A72606260525CB25CF25CE25C70000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +22 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000025C625A125A025B325B225BD25BC203B3012219221902191219330130000 +00000000000000000000000000000000000000002208220B2286228722822283 +222A2229000000000000000000000000000000002227222800AC21D221D42200 +220300000000000000000000000000000000000000000000222022A523122202 +220722612252226A226B221A223D221D2235222B222C00000000000000000000 +00000000212B2030266F266D266A2020202100B6000000000000000025EF0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +23 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +FF10FF11FF12FF13FF14FF15FF16FF17FF18FF19000000000000000000000000 +0000FF21FF22FF23FF24FF25FF26FF27FF28FF29FF2AFF2BFF2CFF2DFF2EFF2F +FF30FF31FF32FF33FF34FF35FF36FF37FF38FF39FF3A00000000000000000000 +0000FF41FF42FF43FF44FF45FF46FF47FF48FF49FF4AFF4BFF4CFF4DFF4EFF4F +FF50FF51FF52FF53FF54FF55FF56FF57FF58FF59FF5A00000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +24 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000304130423043304430453046304730483049304A304B304C304D304E304F +3050305130523053305430553056305730583059305A305B305C305D305E305F +3060306130623063306430653066306730683069306A306B306C306D306E306F +3070307130723073307430753076307730783079307A307B307C307D307E307F +3080308130823083308430853086308730883089308A308B308C308D308E308F +3090309130923093000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +25 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000030A130A230A330A430A530A630A730A830A930AA30AB30AC30AD30AE30AF +30B030B130B230B330B430B530B630B730B830B930BA30BB30BC30BD30BE30BF +30C030C130C230C330C430C530C630C730C830C930CA30CB30CC30CD30CE30CF +30D030D130D230D330D430D530D630D730D830D930DA30DB30DC30DD30DE30DF +30E030E130E230E330E430E530E630E730E830E930EA30EB30EC30ED30EE30EF +30F030F130F230F330F430F530F6000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +26 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000039103920393039403950396039703980399039A039B039C039D039E039F +03A003A103A303A403A503A603A703A803A90000000000000000000000000000 +000003B103B203B303B403B503B603B703B803B903BA03BB03BC03BD03BE03BF +03C003C103C303C403C503C603C703C803C90000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +27 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000004100411041204130414041504010416041704180419041A041B041C041D +041E041F0420042104220423042404250426042704280429042A042B042C042D +042E042F00000000000000000000000000000000000000000000000000000000 +000004300431043204330434043504510436043704380439043A043B043C043D +043E043F0440044104420443044404450446044704480449044A044B044C044D +044E044F00000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +28 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000025002502250C251025182514251C252C25242534253C25012503250F2513 +251B251725232533252B253B254B2520252F25282537253F251D253025252538 +2542000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +30 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00004E9C55165A03963F54C0611B632859F690228475831C7A5060AA63E16E25 +65ED846682A69BF56893572765A162715B9B59D0867B98F47D627DBE9B8E6216 +7C9F88B75B895EB563096697684895C7978D674F4EE54F0A4F4D4F9D504956F2 +593759D45A015C0960DF610F61706613690570BA754F757079FB7DAD7DEF80C3 +840E88638B029055907A533B4E954EA557DF80B290C178EF4E0058F16EA29038 +7A328328828B9C2F5141537054BD54E156E059FB5F1598F26DEB80E4852D0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +31 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00009662967096A097FB540B53F35B8770CF7FBD8FC296E8536F9D5C7ABA4E11 +789381FC6E26561855046B1D851A9C3B59E553A96D6674DC958F56424E91904B +96F2834F990C53E155B65B305F71662066F368046C386CF36D29745B76C87A4E +983482F1885B8A6092ED6DB275AB76CA99C560A68B018D8A95B2698E53AD5186 +5712583059445BB45EF6602863A963F46CBF6F14708E7114715971D5733F7E01 +827682D185979060925B9D1B586965BC6C5A752551F9592E59655F805FDC0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +32 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000062BC65FA6A2A6B276BB4738B7FC189569D2C9D0E9EC45CA16C96837B5104 +5C4B61B681C6687672614E594FFA537860696E297A4F97F34E0B53164EEE4F55 +4F3D4FA14F7352A053EF5609590F5AC15BB65BE179D16687679C67B66B4C6CB3 +706B73C2798D79BE7A3C7B8782B182DB8304837783EF83D387668AB256298CA8 +8FE6904E971E868A4FC45CE862117259753B81E582BD86FE8CC096C5991399D5 +4ECB4F1A89E356DE584A58CA5EFB5FEB602A6094606261D0621262D065390000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +33 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00009B41666668B06D777070754C76867D7582A587F9958B968E8C9D51F152BE +591654B35BB35D16616869826DAF788D84CB88578A7293A79AB86D6C99A886D9 +57A367FF86CE920E5283568754045ED362E164B9683C68386BBB737278BA7A6B +899A89D28D6B8F0390ED95A3969497695B665CB3697D984D984E639B7B206A2B +6A7F68B69C0D6F5F5272559D607062EC6D3B6E076ED1845B89108F444E149C39 +53F6691B6A3A9784682A515C7AC384B291DC938C565B9D286822830584310000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +34 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00007CA5520882C574E64E7E4F8351A05BD2520A52D852E75DFB559A582A59E6 +5B8C5B985BDB5E725E7960A3611F616361BE63DB656267D1685368FA6B3E6B53 +6C576F226F976F4574B0751876E3770B7AFF7BA17C217DE97F367FF0809D8266 +839E89B38ACC8CAB908494519593959195A2966597D3992882184E38542B5CB8 +5DCC73A9764C773C5CA97FEB8D0B96C19811985498584F014F0E5371559C5668 +57FA59475B095BC45C905E0C5E7E5FCC63EE673A65D765E2671F68CB68C40000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +35 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00006A5F5E306BC56C176C7D757F79485B637A007D005FBD898F8A188CB48D77 +8ECC8F1D98E29A0E9B3C4E80507D510059935B9C622F628064EC6B3A72A07591 +79477FA987FB8ABC8B7063AC83CA97A05409540355AB68546A588A7078276775 +9ECD53745BA2811A865090064E184E454EC74F1153CA54385BAE5F1360256551 +673D6C426C726CE3707874037A767AAE7B087D1A7CFE7D6665E7725B53BB5C45 +5DE862D262E063196E20865A8A318DDD92F86F0179A69B5A4EA84EAB4EAC0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +36 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00004F9B4FA050D151477AF6517151F653545321537F53EB55AC58835CE15F37 +5F4A602F6050606D631F65596A4B6CC172C272ED77EF80F881058208854E90F7 +93E197FF99579A5A4EF051DD5C2D6681696D5C4066F26975738968507C8150C5 +52E457475DFE932665A46B236B3D7434798179BD7B4B7DCA82B983CC887F895F +8B398FD191D1541F92804E5D503653E5533A72D7739677E982E68EAF99C699C8 +99D25177611A865E55B07A7A50765BD3904796854E326ADB91E75C515C480000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +37 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000063987A9F6C9397748F617AAA718A96887C8268177E706851936C52F2541B +85AB8A137FA48ECD90E15366888879414FC250BE521151445553572D73EA578B +59515F625F8460756176616761A963B2643A656C666F68426E1375667A3D7CFB +7D4C7D997E4B7F6B830E834A86CD8A088A638B668EFD981A9D8F82B88FCE9BE8 +5287621F64836FC09699684150916B206C7A6F547A747D5088408A2367084EF6 +503950265065517C5238526355A7570F58055ACC5EFA61B261F862F363720000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +38 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000691C6A29727D72AC732E7814786F7D79770C80A9898B8B198CE28ED29063 +9375967A98559A139E785143539F53B35E7B5F266E1B6E90738473FE7D438237 +8A008AFA96504E4E500B53E4547C56FA59D15B645DF15EAB5F276238654567AF +6E5672D07CCA88B480A180E183F0864E8A878DE8923796C798679F134E944E92 +4F0D53485449543E5A2F5F8C5FA1609F68A76A8E745A78818A9E8AA48B779190 +4E5E9BC94EA44F7C4FAF501950165149516C529F52B952FE539A53E354110000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +39 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000540E5589575157A2597D5B545B5D5B8F5DE55DE75DF75E785E835E9A5EB7 +5F186052614C629762D863A7653B6602664366F4676D6821689769CB6C5F6D2A +6D696E2F6E9D75327687786C7A3F7CE07D057D187D5E7DB18015800380AF80B1 +8154818F822A8352884C88618B1B8CA28CFC90CA91759271783F92FC95A4964D +980599999AD89D3B525B52AB53F7540858D562F76FE08C6A8F5F9EB9514B523B +544A56FD7A4091779D609ED273446F09817075115FFD60DA9AA872DB8FBC0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +3A +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00006B6498034ECA56F0576458BE5A5A606861C7660F6606683968B16DF775D5 +7D3A826E9B424E9B4F5053C955065D6F5DE65DEE67FB6C99747378028A509396 +88DF57505EA7632B50B550AC518D670054C9585E59BB5BB05F69624D63A1683D +6B736E08707D91C7728078157826796D658E7D3083DC88C18F09969B52645728 +67507F6A8CA151B45742962A583A698A80B454B25D0E57FC78959DFA4F5C524A +548B643E6628671467F57A847B567D22932F685C9BAD7B395319518A52370000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +3B +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00005BDF62F664AE64E6672D6BBA85A996D176909BD6634C93069BAB76BF6652 +4E09509853C25C7160E864926563685F71E673CA75237B977E8286958B838CDB +9178991065AC66AB6B8B4ED54ED44F3A4F7F523A53F853F255E356DB58EB59CB +59C959FF5B505C4D5E025E2B5FD7601D6307652F5B5C65AF65BD65E8679D6B62 +6B7B6C0F7345794979C17CF87D197D2B80A2810281F389968A5E8A698A668A8C +8AEE8CC78CDC96CC98FC6B6F4E8B4F3C4F8D51505B575BFA6148630166420000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +3C +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00006B216ECB6CBB723E74BD75D478C1793A800C803381EA84948F9E6C509E7F +5F0F8B589D2B7AFA8EF85B8D96EB4E0353F157F759315AC95BA460896E7F6F06 +75BE8CEA5B9F85007BE0507267F4829D5C61854A7E1E820E51995C0463688D66 +659C716E793E7D1780058B1D8ECA906E86C790AA501F52FA5C3A6753707C7235 +914C91C8932B82E55BC25F3160F94E3B53D65B88624B67316B8A72E973E07A2E +816B8DA391529996511253D7546A5BFF63886A397DAC970056DA53CE54680000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +3D +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00005B975C315DDE4FEE610162FE6D3279C079CB7D427E4D7FD281ED821F8490 +884689728B908E748F2F9031914B916C96C6919C4EC04F4F514553415F93620E +67D46C416E0B73637E2691CD928353D459195BBF6DD1795D7E2E7C9B587E719F +51FA88538FF04FCA5CFB662577AC7AE3821C99FF51C65FAA65EC696F6B896DF3 +6E966F6476FE7D145DE190759187980651E6521D6240669166D96E1A5EB67DD2 +7F7266F885AF85F78AF852A953D959735E8F5F90605592E4966450B7511F0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +3E +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000052DD5320534753EC54E8554655315617596859BE5A3C5BB55C065C0F5C11 +5C1A5E845E8A5EE05F70627F628462DB638C63776607660C662D6676677E68A2 +6A1F6A356CBC6D886E096E58713C7126716775C77701785D7901796579F07AE0 +7B117CA77D39809683D6848B8549885D88F38A1F8A3C8A548A738C618CDE91A4 +9266937E9418969C97984E0A4E084E1E4E575197527057CE583458CC5B225E38 +60C564FE676167566D4472B675737A6384B88B7291B89320563157F498FE0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +3F +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000062ED690D6B9671ED7E548077827289E698DF87558FB15C3B4F384FE14FB5 +55075A205BDD5BE95FC3614E632F65B0664B68EE699B6D786DF1753375B9771F +795E79E67D3381E382AF85AA89AA8A3A8EAB8F9B903291DD97074EBA4EC15203 +587558EC5C0B751A5C3D814E8A0A8FC59663976D7B258ACF9808916256F353A8 +9017543957825E2563A86C34708A77617C8B7FE088709042915493109318968F +745E9AC45D075D69657067A28DA896DB636E6749691983C5981796C088FE0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +40 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00006F84647A5BF84E16702C755D662F51C4523652E259D35F8160276210653F +6574661F667468F268166B636E057272751F76DB7CBE805658F088FD897F8AA0 +8A938ACB901D91929752975965897A0E810696BB5E2D60DC621A65A566146790 +77F37A4D7C4D7E3E810A8CAC8D648DE18E5F78A9520762D963A5644262988A2D +7A837BC08AAC96EA7D76820C87494ED95148534353605BA35C025C165DDD6226 +624764B0681368346CC96D456D1767D36F5C714E717D65CB7A7F7BAD7DDA0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +41 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00007E4A7FA8817A821B823985A68A6E8CCE8DF59078907792AD929195839BAE +524D55846F387136516879857E5581B37CCE564C58515CA863AA66FE66FD695A +72D9758F758E790E795679DF7C977D207D4486078A34963B90619F2050E75275 +53CC53E2500955AA58EE594F723D5B8B5C64531D60E360F3635C6383633F63BB +64CD65E966F95DE369CD69FD6F1571E54E8975E976F87A937CDF7DCF7D9C8061 +83498358846C84BC85FB88C58D709001906D9397971C9A1250CF5897618E0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +42 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000081D385358D0890204FC3507452475373606F6349675F6E2C8DB3901F4FD7 +5C5E8CCA65CF7D9A53528896517663C35B585B6B5C0A640D6751905C4ED6591A +592A6C708A51553E581559A560F0625367C182356955964099C49A284F535806 +5BFE80105CB15E2F5F856020614B623466FF6CF06EDE80CE817F82D4888B8CB8 +9000902E968A9EDB9BDB4EE353F059277B2C918D984C9DF96EDD702753535544 +5B856258629E62D36CA26FEF74228A1794386FC18AFE833851E786F853EA0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +43 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000053E94F4690548FB0596A81315DFD7AEA8FBF68DA8C3772F89C486A3D8AB0 +4E3953585606576662C563A265E66B4E6DE16E5B70AD77ED7AEF7BAA7DBB803D +80C686CB8A95935B56E358C75F3E65AD66966A806BB575378AC7502477E55730 +5F1B6065667A6C6075F47A1A7F6E81F48718904599B37BC9755C7AF97B5184C4 +901079E97A9283365AE177404E2D4EF25B995FE062BD663C67F16CE8866B8877 +8A3B914E92F399D06A177026732A82E784578CAF4E01514651CB558B5BF50000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +44 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00005E165E335E815F145F355F6B5FB461F2631166A2671D6F6E7252753A773A +80748139817887768ABF8ADC8D858DF3929A957798029CE552C5635776F46715 +6C8873CD8CC393AE96736D25589C690E69CC8FFD939A75DB901A585A680263B4 +69FB4F436F2C67D88FBB85267DB49354693F6F70576A58F75B2C7D2C722A540A +91E39DB44EAD4F4E505C507552438C9E544858245B9A5E1D5E955EAD5EF75F1F +608C62B5633A63D068AF6C407887798E7A0B7DE082478A028AE68E4490130000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +45 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000090B8912D91D89F0E6CE5645864E265756EF476847B1B906993D16EBA54F2 +5FB964A48F4D8FED92445178586B59295C555E976DFB7E8F751C8CBC8EE2985B +70B94F1D6BBF6FB1753096FB514E54105835585759AC5C605F926597675C6E21 +767B83DF8CED901490FD934D7825783A52AA5EA6571F597460125012515A51AC +51CD520055105854585859575B955CF65D8B60BC6295642D6771684368BC68DF +76D76DD86E6F6D9B706F71C85F5375D879777B497B547B527CD67D7152300000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +46 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00008463856985E48A0E8B048C468E0F9003900F94199676982D9A3095D850CD +52D5540C58025C0E61A7649E6D1E77B37AE580F48404905392855CE09D07533F +5F975FB36D9C7279776379BF7BE46BD272EC8AAD68036A6151F87A8169345C4A +9CF682EB5BC59149701E56785C6F60C765666C8C8C5A90419813545166C7920D +594890A351854E4D51EA85998B0E7058637A934B696299B47E04757753576960 +8EDF96E36C5D4E8C5C3C5F108FE953028CD1808986795EFF65E54E7351650000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +47 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000059825C3F97EE4EFB598A5FCD8A8D6FE179B079625BE78471732B71B15E74 +5FF5637B649A71C37C984E435EFC4E4B57DC56A260A96FC37D0D80FD813381BF +8FB2899786A45DF4628A64AD898767776CE26D3E743678345A467F7582AD99AC +4FF35EC362DD63926557676F76C3724C80CC80BA8F29914D500D57F95A926885 +6973716472FD8CB758F28CE0966A9019877F79E477E784294F2F5265535A62CD +67CF6CCA767D7B947C95823685848FEB66DD6F2072067E1B83AB99C19EA60000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +48 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000051FD7BB178727BB880877B486AE85E61808C75517560516B92626E8C767A +91979AEA4F107F70629C7B4F95A59CE9567A585986E496BC4F345224534A53CD +53DB5E06642C6591677F6C3E6C4E724872AF73ED75547E41822C85E98CA97BC4 +91C67169981298EF633D6669756A76E478D0854386EE532A5351542659835E87 +5F7C60B26249627962AB65906BD46CCC75B276AE789179D87DCB7F7780A588AB +8AB98CBB907F975E98DB6A0B7C3850995C3E5FAE67876BD8743577097F8E0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +49 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00009F3B67CA7A175339758B9AED5F66819D83F180985F3C5FC575627B46903C +686759EB5A9B7D10767E8B2C4FF55F6A6A196C376F0274E2796888688A558C79 +5EDF63CF75C579D282D7932892F2849C86ED9C2D54C15F6C658C6D5C70158CA7 +8CD3983B654F74F64E0D4ED857E0592B5A665BCC51A85E035E9C601662766577 +65A7666E6D6E72367B268150819A82998B5C8CA08CE68D74961C96444FAE64AB +6B66821E8461856A90E85C01695398A8847A85574F0F526F5FA95E45670D0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +4A +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000798F8179890789866DF55F1762556CB84ECF72699B925206543B567458B3 +61A4626E711A596E7C897CDE7D1B96F06587805E4E194F75517558405E635E73 +5F0A67C44E26853D9589965B7C73980150FB58C1765678A7522577A585117B86 +504F590972477BC77DE88FBA8FD4904D4FBF52C95A295F0197AD4FDD821792EA +570363556B69752B88DC8F147A4252DF58936155620A66AE6BCD7C3F83E95023 +4FF853055446583159495B9D5CF05CEF5D295E9662B16367653E65B9670B0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +4B +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00006CD56CE170F978327E2B80DE82B3840C84EC870289128A2A8C4A90A692D2 +98FD9CF39D6C4E4F4EA1508D5256574A59A85E3D5FD85FD9623F66B4671B67D0 +68D251927D2180AA81A88B008C8C8CBF927E96325420982C531750D5535C58A8 +64B26734726777667A4691E652C36CA16B8658005E4C5954672C7FFB51E176C6 +646978E89B549EBB57CB59B96627679A6BCE54E969D95E55819C67959BAA67FE +9C52685D4EA64FE353C862B9672B6CAB8FC44FAD7E6D9EBF4E0761626E800000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +4C +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00006F2B85135473672A9B455DF37B955CAC5BC6871C6E4A84D17A1481085999 +7C8D6C11772052D959227121725F77DB97279D61690B5A7F5A1851A5540D547D +660E76DF8FF792989CF459EA725D6EC5514D68C97DBF7DEC97629EBA64786A21 +830259845B5F6BDB731B76F27DB280178499513267289ED976EE676252FF9905 +5C24623B7C7E8CB0554F60B67D0B958053014E5F51B6591C723A803691CE5F25 +77E253845F797D0485AC8A338E8D975667F385AE9453610961086CB976520000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +4D +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00008AED8F38552F4F51512A52C753CB5BA55E7D60A0618263D6670967DA6E67 +6D8C733673377531795088D58A98904A909190F596C4878D59154E884F594E0E +8A898F3F981050AD5E7C59965BB95EB863DA63FA64C166DC694A69D86D0B6EB6 +719475287AAF7F8A8000844984C989818B218E0A9065967D990A617E62916B32 +6C836D747FCC7FFC6DC07F8587BA88F8676583B1983C96F76D1B7D61843D916A +4E7153755D506B046FEB85CD862D89A75229540F5C65674E68A8740674830000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +4E +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000075E288CF88E191CC96E296785F8B73877ACB844E63A0756552896D416E9C +74097559786B7C9296867ADC9F8D4FB6616E65C5865C4E864EAE50DA4E2151CC +5BEE659968816DBC731F764277AD7A1C7CE7826F8AD2907C91CF96759818529B +7DD1502B539867976DCB71D0743381E88F2A96A39C579E9F746058416D997D2F +985E4EE44F364F8B51B752B15DBA601C73B2793C82D3923496B796F6970A9E97 +9F6266A66B74521752A370C888C25EC9604B61906F2371497C3E7DF4806F0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +4F +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000084EE9023932C54429B6F6AD370898CC28DEF973252B45A415ECA5F046717 +697C69946D6A6F0F726272FC7BED8001807E874B90CE516D9E937984808B9332 +8AD6502D548C8A716B6A8CC4810760D167A09DF24E994E989C108A6B85C18568 +69006E7E78978155000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +50 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00005F0C4E104E154E2A4E314E364E3C4E3F4E424E564E584E824E858C6B4E8A +82125F0D4E8E4E9E4E9F4EA04EA24EB04EB34EB64ECE4ECD4EC44EC64EC24ED7 +4EDE4EED4EDF4EF74F094F5A4F304F5B4F5D4F574F474F764F884F8F4F984F7B +4F694F704F914F6F4F864F9651184FD44FDF4FCE4FD84FDB4FD14FDA4FD04FE4 +4FE5501A50285014502A502550054F1C4FF650215029502C4FFE4FEF50115006 +504350476703505550505048505A5056506C50785080509A508550B450B20000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +51 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000050C950CA50B350C250D650DE50E550ED50E350EE50F950F5510951015102 +511651155114511A5121513A5137513C513B513F51405152514C515451627AF8 +5169516A516E5180518256D8518C5189518F519151935195519651A451A651A2 +51A951AA51AB51B351B151B251B051B551BD51C551C951DB51E0865551E951ED +51F051F551FE5204520B5214520E5227522A522E52335239524F5244524B524C +525E5254526A527452695273527F527D528D529452925271528852918FA80000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +52 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00008FA752AC52AD52BC52B552C152CD52D752DE52E352E698ED52E052F352F5 +52F852F9530653087538530D5310530F5315531A5323532F5331533353385340 +534653454E175349534D51D6535E5369536E5918537B53775382539653A053A6 +53A553AE53B053B653C37C1296D953DF66FC71EE53EE53E853ED53FA5401543D +5440542C542D543C542E54365429541D544E548F5475548E545F547154775470 +5492547B5480547654845490548654C754A254B854A554AC54C454C854A80000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +53 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000054AB54C254A454BE54BC54D854E554E6550F551454FD54EE54ED54FA54E2 +553955405563554C552E555C55455556555755385533555D5599558054AF558A +559F557B557E5598559E55AE557C558355A9558755A855DA55C555DF55C455DC +55E455D4561455F7561655FE55FD561B55F9564E565071DF5634563656325638 +566B5664562F566C566A56865680568A56A05694568F56A556AE56B656B456C2 +56BC56C156C356C056C856CE56D156D356D756EE56F9570056FF570457090000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +54 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00005708570B570D57135718571655C7571C572657375738574E573B5740574F +576957C057885761577F5789579357A057B357A457AA57B057C357C657D457D2 +57D3580A57D657E3580B5819581D587258215862584B58706BC05852583D5879 +588558B9589F58AB58BA58DE58BB58B858AE58C558D358D158D758D958D858E5 +58DC58E458DF58EF58FA58F958FB58FC58FD5902590A5910591B68A65925592C +592D59325938593E7AD259555950594E595A5958596259605967596C59690000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +55 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000059785981599D4F5E4FAB59A359B259C659E859DC598D59D959DA5A255A1F +5A115A1C5A095A1A5A405A6C5A495A355A365A625A6A5A9A5ABC5ABE5ACB5AC2 +5ABD5AE35AD75AE65AE95AD65AFA5AFB5B0C5B0B5B165B325AD05B2A5B365B3E +5B435B455B405B515B555B5A5B5B5B655B695B705B735B755B7865885B7A5B80 +5B835BA65BB85BC35BC75BC95BD45BD05BE45BE65BE25BDE5BE55BEB5BF05BF6 +5BF35C055C075C085C0D5C135C205C225C285C385C395C415C465C4E5C530000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +56 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00005C505C4F5B715C6C5C6E4E625C765C795C8C5C915C94599B5CAB5CBB5CB6 +5CBC5CB75CC55CBE5CC75CD95CE95CFD5CFA5CED5D8C5CEA5D0B5D155D175D5C +5D1F5D1B5D115D145D225D1A5D195D185D4C5D525D4E5D4B5D6C5D735D765D87 +5D845D825DA25D9D5DAC5DAE5DBD5D905DB75DBC5DC95DCD5DD35DD25DD65DDB +5DEB5DF25DF55E0B5E1A5E195E115E1B5E365E375E445E435E405E4E5E575E54 +5E5F5E625E645E475E755E765E7A9EBC5E7F5EA05EC15EC25EC85ED05ECF0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +57 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00005ED65EE35EDD5EDA5EDB5EE25EE15EE85EE95EEC5EF15EF35EF05EF45EF8 +5EFE5F035F095F5D5F5C5F0B5F115F165F295F2D5F385F415F485F4C5F4E5F2F +5F515F565F575F595F615F6D5F735F775F835F825F7F5F8A5F885F915F875F9E +5F995F985FA05FA85FAD5FBC5FD65FFB5FE45FF85FF15FDD60B35FFF60216060 +601960106029600E6031601B6015602B6026600F603A605A6041606A6077605F +604A6046604D6063604360646042606C606B60596081608D60E76083609A0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +58 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00006084609B60966097609260A7608B60E160B860E060D360B45FF060BD60C6 +60B560D8614D6115610660F660F7610060F460FA6103612160FB60F1610D610E +6147613E61286127614A613F613C612C6134613D614261446173617761586159 +615A616B6174616F61656171615F615D6153617561996196618761AC6194619A +618A619161AB61AE61CC61CA61C961F761C861C361C661BA61CB7F7961CD61E6 +61E361F661FA61F461FF61FD61FC61FE620062086209620D620C6214621B0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +59 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000621E6221622A622E6230623262336241624E625E6263625B62606268627C +62826289627E62926293629662D46283629462D762D162BB62CF62FF62C664D4 +62C862DC62CC62CA62C262C7629B62C9630C62EE62F163276302630862EF62F5 +6350633E634D641C634F6396638E638063AB637663A3638F6389639F63B5636B +636963BE63E963C063C663E363C963D263F663C4641664346406641364266436 +651D64176428640F6467646F6476644E652A6495649364A564A9648864BC0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +5A +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000064DA64D264C564C764BB64D864C264F164E7820964E064E162AC64E364EF +652C64F664F464F264FA650064FD6518651C650565246523652B653465356537 +65366538754B654865566555654D6558655E655D65726578658265838B8A659B +659F65AB65B765C365C665C165C465CC65D265DB65D965E065E165F16772660A +660365FB6773663566366634661C664F664466496641665E665D666466676668 +665F6662667066836688668E668966846698669D66C166B966C966BE66BC0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +5B +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000066C466B866D666DA66E0663F66E666E966F066F566F7670F6716671E6726 +67279738672E673F67366741673867376746675E676067596763676467896770 +67A9677C676A678C678B67A667A1678567B767EF67B467EC67B367E967B867E4 +67DE67DD67E267EE67B967CE67C667E76A9C681E684668296840684D6832684E +68B3682B685968636877687F689F688F68AD6894689D689B68836AAE68B96874 +68B568A068BA690F688D687E690168CA690868D86922692668E1690C68CD0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +5C +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000068D468E768D569366912690468D768E3692568F968E068EF6928692A691A +6923692168C669796977695C6978696B6954697E696E69396974693D69596930 +6961695E695D6981696A69B269AE69D069BF69C169D369BE69CE5BE869CA69DD +69BB69C369A76A2E699169A0699C699569B469DE69E86A026A1B69FF6B0A69F9 +69F269E76A0569B16A1E69ED6A1469EB6A0A6A126AC16A236A136A446A0C6A72 +6A366A786A476A626A596A666A486A386A226A906A8D6AA06A846AA26AA30000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +5D +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00006A9786176ABB6AC36AC26AB86AB36AAC6ADE6AD16ADF6AAA6ADA6AEA6AFB +6B0586166AFA6B126B169B316B1F6B386B3776DC6B3998EE6B476B436B496B50 +6B596B546B5B6B5F6B616B786B796B7F6B806B846B836B8D6B986B956B9E6BA4 +6BAA6BAB6BAF6BB26BB16BB36BB76BBC6BC66BCB6BD36BDF6BEC6BEB6BF36BEF +9EBE6C086C136C146C1B6C246C236C5E6C556C626C6A6C826C8D6C9A6C816C9B +6C7E6C686C736C926C906CC46CF16CD36CBD6CD76CC56CDD6CAE6CB16CBE0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +5E +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00006CBA6CDB6CEF6CD96CEA6D1F884D6D366D2B6D3D6D386D196D356D336D12 +6D0C6D636D936D646D5A6D796D596D8E6D956FE46D856DF96E156E0A6DB56DC7 +6DE66DB86DC66DEC6DDE6DCC6DE86DD26DC56DFA6DD96DE46DD56DEA6DEE6E2D +6E6E6E2E6E196E726E5F6E3E6E236E6B6E2B6E766E4D6E1F6E436E3A6E4E6E24 +6EFF6E1D6E386E826EAA6E986EC96EB76ED36EBD6EAF6EC46EB26ED46ED56E8F +6EA56EC26E9F6F416F11704C6EEC6EF86EFE6F3F6EF26F316EEF6F326ECC0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +5F +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00006F3E6F136EF76F866F7A6F786F816F806F6F6F5B6FF36F6D6F826F7C6F58 +6F8E6F916FC26F666FB36FA36FA16FA46FB96FC66FAA6FDF6FD56FEC6FD46FD8 +6FF16FEE6FDB7009700B6FFA70117001700F6FFE701B701A6F74701D7018701F +7030703E7032705170637099709270AF70F170AC70B870B370AE70DF70CB70DD +70D9710970FD711C711971657155718871667162714C7156716C718F71FB7184 +719571A871AC71D771B971BE71D271C971D471CE71E071EC71E771F571FC0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +60 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000071F971FF720D7210721B7228722D722C72307232723B723C723F72407246 +724B72587274727E7282728172877292729672A272A772B972B272C372C672C4 +72CE72D272E272E072E172F972F7500F7317730A731C7316731D7334732F7329 +7325733E734E734F9ED87357736A7368737073787375737B737A73C873B373CE +73BB73C073E573EE73DE74A27405746F742573F87432743A7455743F745F7459 +7441745C746974707463746A7476747E748B749E74A774CA74CF74D473F10000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +61 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000074E074E374E774E974EE74F274F074F174F874F7750475037505750C750E +750D75157513751E7526752C753C7544754D754A7549755B7546755A75697564 +7567756B756D75787576758675877574758A758975827594759A759D75A575A3 +75C275B375C375B575BD75B875BC75B175CD75CA75D275D975E375DE75FE75FF +75FC760175F075FA75F275F3760B760D7609761F762776207621762276247634 +7630763B764776487646765C76587661766276687669766A7667766C76700000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +62 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000767276767678767C768076837688768B768E769676937699769A76B076B4 +76B876B976BA76C276CD76D676D276DE76E176E576E776EA862F76FB77087707 +770477297724771E77257726771B773777387747775A7768776B775B7765777F +777E7779778E778B779177A0779E77B077B677B977BF77BC77BD77BB77C777CD +77D777DA77DC77E377EE77FC780C781279267820792A7845788E78747886787C +789A788C78A378B578AA78AF78D178C678CB78D478BE78BC78C578CA78EC0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +63 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000078E778DA78FD78F47907791279117919792C792B794079607957795F795A +79557953797A797F798A799D79A79F4B79AA79AE79B379B979BA79C979D579E7 +79EC79E179E37A087A0D7A187A197A207A1F79807A317A3B7A3E7A377A437A57 +7A497A617A627A699F9D7A707A797A7D7A887A977A957A987A967AA97AC87AB0 +7AB67AC57AC47ABF90837AC77ACA7ACD7ACF7AD57AD37AD97ADA7ADD7AE17AE2 +7AE67AED7AF07B027B0F7B0A7B067B337B187B197B1E7B357B287B367B500000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +64 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00007B7A7B047B4D7B0B7B4C7B457B757B657B747B677B707B717B6C7B6E7B9D +7B987B9F7B8D7B9C7B9A7B8B7B927B8F7B5D7B997BCB7BC17BCC7BCF7BB47BC6 +7BDD7BE97C117C147BE67BE57C607C007C077C137BF37BF77C177C0D7BF67C23 +7C277C2A7C1F7C377C2B7C3D7C4C7C437C547C4F7C407C507C587C5F7C647C56 +7C657C6C7C757C837C907CA47CAD7CA27CAB7CA17CA87CB37CB27CB17CAE7CB9 +7CBD7CC07CC57CC27CD87CD27CDC7CE29B3B7CEF7CF27CF47CF67CFA7D060000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +65 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00007D027D1C7D157D0A7D457D4B7D2E7D327D3F7D357D467D737D567D4E7D72 +7D687D6E7D4F7D637D937D897D5B7D8F7D7D7D9B7DBA7DAE7DA37DB57DC77DBD +7DAB7E3D7DA27DAF7DDC7DB87D9F7DB07DD87DDD7DE47DDE7DFB7DF27DE17E05 +7E0A7E237E217E127E317E1F7E097E0B7E227E467E667E3B7E357E397E437E37 +7E327E3A7E677E5D7E567E5E7E597E5A7E797E6A7E697E7C7E7B7E837DD57E7D +8FAE7E7F7E887E897E8C7E927E907E937E947E967E8E7E9B7E9C7F387F3A0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +66 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00007F457F4C7F4D7F4E7F507F517F557F547F587F5F7F607F687F697F677F78 +7F827F867F837F887F877F8C7F947F9E7F9D7F9A7FA37FAF7FB27FB97FAE7FB6 +7FB88B717FC57FC67FCA7FD57FD47FE17FE67FE97FF37FF998DC80068004800B +801280188019801C80218028803F803B804A804680528058805A805F80628068 +80738072807080768079807D807F808480868085809B8093809A80AD519080AC +80DB80E580D980DD80C480DA80D6810980EF80F1811B81298123812F814B0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +67 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000968B8146813E8153815180FC8171816E81658166817481838188818A8180 +818281A0819581A481A3815F819381A981B081B581BE81B881BD81C081C281BA +81C981CD81D181D981D881C881DA81DF81E081E781FA81FB81FE820182028205 +8207820A820D821082168229822B82388233824082598258825D825A825F8264 +82628268826A826B822E827182778278827E828D829282AB829F82BB82AC82E1 +82E382DF82D282F482F382FA8393830382FB82F982DE830682DC830982D90000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +68 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000833583348316833283318340833983508345832F832B831783188385839A +83AA839F83A283968323838E8387838A837C83B58373837583A0838983A883F4 +841383EB83CE83FD840383D8840B83C183F7840783E083F2840D8422842083BD +8438850683FB846D842A843C855A84848477846B84AD846E848284698446842C +846F8479843584CA846284B984BF849F84D984CD84BB84DA84D084C184C684D6 +84A1852184FF84F485178518852C851F8515851484FC85408563855885480000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +69 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000085418602854B8555858085A485888591858A85A8856D8594859B85EA8587 +859C8577857E859085C985BA85CF85B985D085D585DD85E585DC85F9860A8613 +860B85FE85FA86068622861A8630863F864D4E558654865F86678671869386A3 +86A986AA868B868C86B686AF86C486C686B086C9882386AB86D486DE86E986EC +86DF86DB86EF8712870687088700870386FB87118709870D86F9870A8734873F +8737873B87258729871A8760875F8778874C874E877487578768876E87590000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +6A +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000087538763876A880587A2879F878287AF87CB87BD87C087D096D687AB87C4 +87B387C787C687BB87EF87F287E0880F880D87FE87F687F7880E87D288118816 +8815882288218831883688398827883B8844884288528859885E8862886B8881 +887E889E8875887D88B5887288828897889288AE889988A2888D88A488B088BF +88B188C388C488D488D888D988DD88F9890288FC88F488E888F28904890C890A +89138943891E8925892A892B89418944893B89368938894C891D8960895E0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +6B +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000089668964896D896A896F89748977897E89838988898A8993899889A189A9 +89A689AC89AF89B289BA89BD89BF89C089DA89DC89DD89E789F489F88A038A16 +8A108A0C8A1B8A1D8A258A368A418A5B8A528A468A488A7C8A6D8A6C8A628A85 +8A828A848AA88AA18A918AA58AA68A9A8AA38AC48ACD8AC28ADA8AEB8AF38AE7 +8AE48AF18B148AE08AE28AF78ADE8ADB8B0C8B078B1A8AE18B168B108B178B20 +8B3397AB8B268B2B8B3E8B288B418B4C8B4F8B4E8B498B568B5B8B5A8B6B0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +6C +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00008B5F8B6C8B6F8B748B7D8B808B8C8B8E8B928B938B968B998B9A8C3A8C41 +8C3F8C488C4C8C4E8C508C558C628C6C8C788C7A8C828C898C858C8A8C8D8C8E +8C948C7C8C98621D8CAD8CAA8CBD8CB28CB38CAE8CB68CC88CC18CE48CE38CDA +8CFD8CFA8CFB8D048D058D0A8D078D0F8D0D8D109F4E8D138CCD8D148D168D67 +8D6D8D718D738D818D998DC28DBE8DBA8DCF8DDA8DD68DCC8DDB8DCB8DEA8DEB +8DDF8DE38DFC8E088E098DFF8E1D8E1E8E108E1F8E428E358E308E348E4A0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +6D +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00008E478E498E4C8E508E488E598E648E608E2A8E638E558E768E728E7C8E81 +8E878E858E848E8B8E8A8E938E918E948E998EAA8EA18EAC8EB08EC68EB18EBE +8EC58EC88ECB8EDB8EE38EFC8EFB8EEB8EFE8F0A8F058F158F128F198F138F1C +8F1F8F1B8F0C8F268F338F3B8F398F458F428F3E8F4C8F498F468F4E8F578F5C +8F628F638F648F9C8F9F8FA38FAD8FAF8FB78FDA8FE58FE28FEA8FEF90878FF4 +90058FF98FFA901190159021900D901E9016900B90279036903590398FF80000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +6E +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000904F905090519052900E9049903E90569058905E9068906F907696A89072 +9082907D90819080908A9089908F90A890AF90B190B590E290E4624890DB9102 +9112911991329130914A9156915891639165916991739172918B9189918291A2 +91AB91AF91AA91B591B491BA91C091C191C991CB91D091D691DF91E191DB91FC +91F591F6921E91FF9214922C92159211925E925792459249926492489295923F +924B9250929C92969293929B925A92CF92B992B792E9930F92FA9344932E0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +6F +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000093199322931A9323933A9335933B935C9360937C936E935693B093AC93AD +939493B993D693D793E893E593D893C393DD93D093C893E4941A941494139403 +940794109436942B94359421943A944194529444945B94609462945E946A9229 +947094759477947D945A947C947E9481947F95829587958A9594959695989599 +95A095A895A795AD95BC95BB95B995BE95CA6FF695C395CD95CC95D595D495D6 +95DC95E195E595E296219628962E962F9642964C964F964B9677965C965E0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +70 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000965D965F96669672966C968D96989695969796AA96A796B196B296B096B4 +96B696B896B996CE96CB96C996CD894D96DC970D96D596F99704970697089713 +970E9711970F971697199724972A97309739973D973E97449746974897429749 +975C976097649766976852D2976B977197799785977C9781977A9786978B978F +9790979C97A897A697A397B397B497C397C697C897CB97DC97ED9F4F97F27ADF +97F697F5980F980C9838982498219837983D9846984F984B986B986F98700000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +71 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000098719874987398AA98AF98B198B698C498C398C698E998EB990399099912 +991499189921991D991E99249920992C992E993D993E9942994999459950994B +99519952994C99559997999899A599AD99AE99BC99DF99DB99DD99D899D199ED +99EE99F199F299FB99F89A019A0F9A0599E29A199A2B9A379A459A429A409A43 +9A3E9A559A4D9A5B9A579A5F9A629A659A649A699A6B9A6A9AAD9AB09ABC9AC0 +9ACF9AD19AD39AD49ADE9ADF9AE29AE39AE69AEF9AEB9AEE9AF49AF19AF70000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +72 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00009AFB9B069B189B1A9B1F9B229B239B259B279B289B299B2A9B2E9B2F9B32 +9B449B439B4F9B4D9B4E9B519B589B749B939B839B919B969B979B9F9BA09BA8 +9BB49BC09BCA9BB99BC69BCF9BD19BD29BE39BE29BE49BD49BE19C3A9BF29BF1 +9BF09C159C149C099C139C0C9C069C089C129C0A9C049C2E9C1B9C259C249C21 +9C309C479C329C469C3E9C5A9C609C679C769C789CE79CEC9CF09D099D089CEB +9D039D069D2A9D269DAF9D239D1F9D449D159D129D419D3F9D3E9D469D480000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +73 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00009D5D9D5E9D649D519D509D599D729D899D879DAB9D6F9D7A9D9A9DA49DA9 +9DB29DC49DC19DBB9DB89DBA9DC69DCF9DC29DD99DD39DF89DE69DED9DEF9DFD +9E1A9E1B9E1E9E759E799E7D9E819E889E8B9E8C9E929E959E919E9D9EA59EA9 +9EB89EAA9EAD97619ECC9ECE9ECF9ED09ED49EDC9EDE9EDD9EE09EE59EE89EEF +9EF49EF69EF79EF99EFB9EFC9EFD9F079F0876B79F159F219F2C9F3E9F4A9F52 +9F549F639F5F9F609F619F669F679F6C9F6A9F779F729F769F959F9C9FA00000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +74 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000582F69C79059746451DC7199000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +R +2141 301C FF5E +2142 2016 2225 +215D 2212 FF0D +2171 00A2 FFE0 +2172 00A3 FFE1 +224C 00AC FFE2 diff --git a/env/tcl/tcl8.6/encoding/jis0212.enc b/env/tcl/tcl8.6/encoding/jis0212.enc new file mode 100644 index 0000000..cddbbba --- /dev/null +++ b/env/tcl/tcl8.6/encoding/jis0212.enc @@ -0,0 +1,1159 @@ +# Encoding file: jis0212, double-byte +D +2244 0 68 +22 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000002D8 +02C700B802D902DD00AF02DB02DA007E03840385000000000000000000000000 +0000000000A100A600BF00000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000BA00AA00A900AE2122 +00A4211600000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +26 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000038603880389038A03AA0000038C0000038E03AB0000038F000000000000 +000003AC03AD03AE03AF03CA039003CC03C203CD03CB03B003CE000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +27 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000004020403040404050406040704080409040A040B040C040E040F0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000004520453045404550456045704580459045A045B045C045E045F0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +29 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000000C60110000001260000013200000141013F0000014A00D8015200000166 +00DE000000000000000000000000000000000000000000000000000000000000 +000000E6011100F00127013101330138014201400149014B00F8015300DF0167 +00FE000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +2A +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000000C100C000C400C2010201CD0100010400C500C301060108010C00C7010A +010E00C900C800CB00CA011A0116011201180000011C011E01220120012400CD +00CC00CF00CE01CF0130012A012E0128013401360139013D013B014301470145 +00D100D300D200D600D401D10150014C00D5015401580156015A015C0160015E +0164016200DA00D900DC00DB016C01D30170016A0172016E016801D701DB01D9 +01D5017400DD017801760179017D017B00000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +2B +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000000E100E000E400E2010301CE0101010500E500E301070109010D00E7010B +010F00E900E800EB00EA011B01170113011901F5011D011F00000121012500ED +00EC00EF00EE01D00000012B012F012901350137013A013E013C014401480146 +00F100F300F200F600F401D20151014D00F5015501590157015B015D0161015F +0165016300FA00F900FC00FB016D01D40171016B0173016F016901D801DC01DA +01D6017500FD00FF0177017A017E017C00000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +30 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00004E024E044E054E0C4E124E1F4E234E244E284E2B4E2E4E2F4E304E354E40 +4E414E444E474E514E5A4E5C4E634E684E694E744E754E794E7F4E8D4E964E97 +4E9D4EAF4EB94EC34ED04EDA4EDB4EE04EE14EE24EE84EEF4EF14EF34EF54EFD +4EFE4EFF4F004F024F034F084F0B4F0C4F124F154F164F174F194F2E4F314F60 +4F334F354F374F394F3B4F3E4F404F424F484F494F4B4F4C4F524F544F564F58 +4F5F4F634F6A4F6C4F6E4F714F774F784F794F7A4F7D4F7E4F814F824F840000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +31 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00004F854F894F8A4F8C4F8E4F904F924F934F944F974F994F9A4F9E4F9F4FB2 +4FB74FB94FBB4FBC4FBD4FBE4FC04FC14FC54FC64FC84FC94FCB4FCC4FCD4FCF +4FD24FDC4FE04FE24FF04FF24FFC4FFD4FFF5000500150045007500A500C500E +5010501350175018501B501C501D501E50225027502E50305032503350355040 +5041504250455046504A504C504E50515052505350575059505F506050625063 +50665067506A506D50705071503B5081508350845086508A508E508F50900000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +32 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00005092509350945096509B509C509E509F50A050A150A250AA50AF50B050B9 +50BA50BD50C050C350C450C750CC50CE50D050D350D450D850DC50DD50DF50E2 +50E450E650E850E950EF50F150F650FA50FE5103510651075108510B510C510D +510E50F2511051175119511B511C511D511E512351275128512C512D512F5131 +513351345135513851395142514A514F5153515551575158515F51645166517E +51835184518B518E5198519D51A151A351AD51B851BA51BC51BE51BF51C20000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +33 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000051C851CF51D151D251D351D551D851DE51E251E551EE51F251F351F451F7 +5201520252055212521352155216521852225228523152325235523C52455249 +525552575258525A525C525F526052615266526E527752785279528052825285 +528A528C52935295529652975298529A529C52A452A552A652A752AF52B052B6 +52B752B852BA52BB52BD52C052C452C652C852CC52CF52D152D452D652DB52DC +52E152E552E852E952EA52EC52F052F152F452F652F753005303530A530B0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +34 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000530C531153135318531B531C531E531F5325532753285329532B532C532D +533053325335533C533D533E5342534C534B5359535B536153635365536C536D +53725379537E538353875388538E539353945399539D53A153A453AA53AB53AF +53B253B453B553B753B853BA53BD53C053C553CF53D253D353D553DA53DD53DE +53E053E653E753F554025413541A542154275428542A542F5431543454355443 +54445447544D544F545E54625464546654675469546B546D546E5474547F0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +35 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000054815483548554885489548D549154955496549C549F54A154A654A754A9 +54AA54AD54AE54B154B754B954BA54BB54BF54C654CA54CD54CE54E054EA54EC +54EF54F654FC54FE54FF55005501550555085509550C550D550E5515552A552B +553255355536553B553C553D554155475549554A554D555055515558555A555B +555E5560556155645566557F5581558255865588558E558F5591559255935594 +559755A355A455AD55B255BF55C155C355C655C955CB55CC55CE55D155D20000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +36 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000055D355D755D855DB55DE55E255E955F655FF56055608560A560D560E560F +5610561156125619562C56305633563556375639563B563C563D563F56405641 +5643564456465649564B564D564F5654565E566056615662566356665669566D +566F567156725675568456855688568B568C56955699569A569D569E569F56A6 +56A756A856A956AB56AC56AD56B156B356B756BE56C556C956CA56CB56CF56D0 +56CC56CD56D956DC56DD56DF56E156E456E556E656E756E856F156EB56ED0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +37 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000056F656F7570157025707570A570C57115715571A571B571D572057225723 +572457255729572A572C572E572F57335734573D573E573F57455746574C574D +57525762576557675768576B576D576E576F5770577157735774577557775779 +577A577B577C577E57815783578C579457975799579A579C579D579E579F57A1 +579557A757A857A957AC57B857BD57C757C857CC57CF57D557DD57DE57E457E6 +57E757E957ED57F057F557F657F857FD57FE57FF580358045808580957E10000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +38 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000580C580D581B581E581F582058265827582D58325839583F5849584C584D +584F58505855585F58615864586758685878587C587F58805881588758885889 +588A588C588D588F589058945896589D58A058A158A258A658A958B158B258C4 +58BC58C258C858CD58CE58D058D258D458D658DA58DD58E158E258E958F35905 +5906590B590C5912591359148641591D5921592359245928592F593059335935 +5936593F59435946595259535959595B595D595E595F59615963596B596D0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +39 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000596F5972597559765979597B597C598B598C598E599259955997599F59A4 +59A759AD59AE59AF59B059B359B759BA59BC59C159C359C459C859CA59CD59D2 +59DD59DE59DF59E359E459E759EE59EF59F159F259F459F75A005A045A0C5A0D +5A0E5A125A135A1E5A235A245A275A285A2A5A2D5A305A445A455A475A485A4C +5A505A555A5E5A635A655A675A6D5A775A7A5A7B5A7E5A8B5A905A935A965A99 +5A9C5A9E5A9F5AA05AA25AA75AAC5AB15AB25AB35AB55AB85ABA5ABB5ABF0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +3A +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00005AC45AC65AC85ACF5ADA5ADC5AE05AE55AEA5AEE5AF55AF65AFD5B005B01 +5B085B175B345B195B1B5B1D5B215B255B2D5B385B415B4B5B4C5B525B565B5E +5B685B6E5B6F5B7C5B7D5B7E5B7F5B815B845B865B8A5B8E5B905B915B935B94 +5B965BA85BA95BAC5BAD5BAF5BB15BB25BB75BBA5BBC5BC05BC15BCD5BCF5BD6 +5BD75BD85BD95BDA5BE05BEF5BF15BF45BFD5C0C5C175C1E5C1F5C235C265C29 +5C2B5C2C5C2E5C305C325C355C365C595C5A5C5C5C625C635C675C685C690000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +3B +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00005C6D5C705C745C755C7A5C7B5C7C5C7D5C875C885C8A5C8F5C925C9D5C9F +5CA05CA25CA35CA65CAA5CB25CB45CB55CBA5CC95CCB5CD25CDD5CD75CEE5CF1 +5CF25CF45D015D065D0D5D125D2B5D235D245D265D275D315D345D395D3D5D3F +5D425D435D465D485D555D515D595D4A5D5F5D605D615D625D645D6A5D6D5D70 +5D795D7A5D7E5D7F5D815D835D885D8A5D925D935D945D955D995D9B5D9F5DA0 +5DA75DAB5DB05DB45DB85DB95DC35DC75DCB5DD05DCE5DD85DD95DE05DE40000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +3C +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00005DE95DF85DF95E005E075E0D5E125E145E155E185E1F5E205E2E5E285E32 +5E355E3E5E4B5E505E495E515E565E585E5B5E5C5E5E5E685E6A5E6B5E6C5E6D +5E6E5E705E805E8B5E8E5EA25EA45EA55EA85EAA5EAC5EB15EB35EBD5EBE5EBF +5EC65ECC5ECB5ECE5ED15ED25ED45ED55EDC5EDE5EE55EEB5F025F065F075F08 +5F0E5F195F1C5F1D5F215F225F235F245F285F2B5F2C5F2E5F305F345F365F3B +5F3D5F3F5F405F445F455F475F4D5F505F545F585F5B5F605F635F645F670000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +3D +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00005F6F5F725F745F755F785F7A5F7D5F7E5F895F8D5F8F5F965F9C5F9D5FA2 +5FA75FAB5FA45FAC5FAF5FB05FB15FB85FC45FC75FC85FC95FCB5FD05FD15FD2 +5FD35FD45FDE5FE15FE25FE85FE95FEA5FEC5FED5FEE5FEF5FF25FF35FF65FFA +5FFC6007600A600D6013601460176018601A601F6024602D6033603560406047 +60486049604C6051605460566057605D606160676071607E607F608260866088 +608A608E6091609360956098609D609E60A260A460A560A860B060B160B70000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +3E +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000060BB60BE60C260C460C860C960CA60CB60CE60CF60D460D560D960DB60DD +60DE60E260E560F260F560F860FC60FD61026107610A610C6110611161126113 +6114611661176119611C611E6122612A612B6130613161356136613761396141 +614561466149615E6160616C61726178617B617C617F6180618161836184618B +618D6192619361976198619C619D619F61A061A561A861AA61AD61B861B961BC +61C061C161C261CE61CF61D561DC61DD61DE61DF61E161E261E761E961E50000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +3F +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000061EC61ED61EF620162036204620762136215621C62206222622362276229 +622B6239623D6242624362446246624C62506251625262546256625A625C6264 +626D626F6273627A627D628D628E628F629062A662A862B362B662B762BA62BE +62BF62C462CE62D562D662DA62EA62F262F462FC62FD63036304630A630B630D +63106313631663186329632A632D633563366339633C63416342634363446346 +634A634B634E6352635363546358635B63656366636C636D6371637463750000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +40 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00006378637C637D637F638263846387638A6390639463956399639A639E63A4 +63A663AD63AE63AF63BD63C163C563C863CE63D163D363D463D563DC63E063E5 +63EA63EC63F263F363F563F863F96409640A6410641264146418641E64206422 +642464256429642A642F64306435643D643F644B644F6451645264536454645A +645B645C645D645F646064616463646D64736474647B647D64856487648F6490 +649164986499649B649D649F64A164A364A664A864AC64B364BD64BE64BF0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +41 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000064C464C964CA64CB64CC64CE64D064D164D564D764E464E564E964EA64ED +64F064F564F764FB64FF6501650465086509650A650F6513651465166519651B +651E651F652265266529652E6531653A653C653D654365476549655065526554 +655F65606567656B657A657D65816585658A659265956598659D65A065A365A6 +65AE65B265B365B465BF65C265C865C965CE65D065D465D665D865DF65F065F2 +65F465F565F965FE65FF6600660466086609660D6611661266156616661D0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +42 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000661E662166226623662466266629662A662B662C662E6630663166336639 +6637664066456646664A664C6651664E665766586659665B665C6660666166FB +666A666B666C667E66736675667F667766786679667B6680667C668B668C668D +669066926699669A669B669C669F66A066A466AD66B166B266B566BB66BF66C0 +66C266C366C866CC66CE66CF66D466DB66DF66E866EB66EC66EE66FA67056707 +670E67136719671C672067226733673E674567476748674C67546755675D0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +43 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00006766676C676E67746776677B67816784678E678F67916793679667986799 +679B67B067B167B267B567BB67BC67BD67F967C067C267C367C567C867C967D2 +67D767D967DC67E167E667F067F267F667F7685268146819681D681F68286827 +682C682D682F683068316833683B683F68446845684A684C685568576858685B +686B686E686F68706871687268756879687A687B687C68826884688668886896 +6898689A689C68A168A368A568A968AA68AE68B268BB68C568C868CC68CF0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +44 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000068D068D168D368D668D968DC68DD68E568E868EA68EB68EC68ED68F068F1 +68F568F668FB68FC68FD69066909690A69106911691369166917693169336935 +6938693B694269456949694E6957695B696369646965696669686969696C6970 +69716972697A697B697F6980698D69926996699869A169A569A669A869AB69AD +69AF69B769B869BA69BC69C569C869D169D669D769E269E569EE69EF69F169F3 +69F569FE6A006A016A036A0F6A116A156A1A6A1D6A206A246A286A306A320000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +45 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00006A346A376A3B6A3E6A3F6A456A466A496A4A6A4E6A506A516A526A556A56 +6A5B6A646A676A6A6A716A736A7E6A816A836A866A876A896A8B6A916A9B6A9D +6A9E6A9F6AA56AAB6AAF6AB06AB16AB46ABD6ABE6ABF6AC66AC96AC86ACC6AD0 +6AD46AD56AD66ADC6ADD6AE46AE76AEC6AF06AF16AF26AFC6AFD6B026B036B06 +6B076B096B0F6B106B116B176B1B6B1E6B246B286B2B6B2C6B2F6B356B366B3B +6B3F6B466B4A6B4D6B526B566B586B5D6B606B676B6B6B6E6B706B756B7D0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +46 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00006B7E6B826B856B976B9B6B9F6BA06BA26BA36BA86BA96BAC6BAD6BAE6BB0 +6BB86BB96BBD6BBE6BC36BC46BC96BCC6BD66BDA6BE16BE36BE66BE76BEE6BF1 +6BF76BF96BFF6C026C046C056C096C0D6C0E6C106C126C196C1F6C266C276C28 +6C2C6C2E6C336C356C366C3A6C3B6C3F6C4A6C4B6C4D6C4F6C526C546C596C5B +6C5C6C6B6C6D6C6F6C746C766C786C796C7B6C856C866C876C896C946C956C97 +6C986C9C6C9F6CB06CB26CB46CC26CC66CCD6CCF6CD06CD16CD26CD46CD60000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +47 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00006CDA6CDC6CE06CE76CE96CEB6CEC6CEE6CF26CF46D046D076D0A6D0E6D0F +6D116D136D1A6D266D276D286C676D2E6D2F6D316D396D3C6D3F6D576D5E6D5F +6D616D656D676D6F6D706D7C6D826D876D916D926D946D966D976D986DAA6DAC +6DB46DB76DB96DBD6DBF6DC46DC86DCA6DCE6DCF6DD66DDB6DDD6DDF6DE06DE2 +6DE56DE96DEF6DF06DF46DF66DFC6E006E046E1E6E226E276E326E366E396E3B +6E3C6E446E456E486E496E4B6E4F6E516E526E536E546E576E5C6E5D6E5E0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +48 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00006E626E636E686E736E7B6E7D6E8D6E936E996EA06EA76EAD6EAE6EB16EB3 +6EBB6EBF6EC06EC16EC36EC76EC86ECA6ECD6ECE6ECF6EEB6EED6EEE6EF96EFB +6EFD6F046F086F0A6F0C6F0D6F166F186F1A6F1B6F266F296F2A6F2F6F306F33 +6F366F3B6F3C6F2D6F4F6F516F526F536F576F596F5A6F5D6F5E6F616F626F68 +6F6C6F7D6F7E6F836F876F886F8B6F8C6F8D6F906F926F936F946F966F9A6F9F +6FA06FA56FA66FA76FA86FAE6FAF6FB06FB56FB66FBC6FC56FC76FC86FCA0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +49 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00006FDA6FDE6FE86FE96FF06FF56FF96FFC6FFD7000700570067007700D7017 +70207023702F703470377039703C7043704470487049704A704B70547055705D +705E704E70647065706C706E70757076707E7081708570867094709570967097 +7098709B70A470AB70B070B170B470B770CA70D170D370D470D570D670D870DC +70E470FA71037104710571067107710B710C710F711E7120712B712D712F7130 +713171387141714571467147714A714B715071527157715A715C715E71600000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +4A +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000071687179718071857187718C7192719A719B71A071A271AF71B071B271B3 +71BA71BF71C071C171C471CB71CC71D371D671D971DA71DC71F871FE72007207 +7208720972137217721A721D721F7224722B722F723472387239724172427243 +7245724E724F7250725372557256725A725C725E726072637268726B726E726F +727172777278727B727C727F72847289728D728E7293729B72A872AD72AE72B1 +72B472BE72C172C772C972CC72D572D672D872DF72E572F372F472FA72FB0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +4B +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000072FE7302730473057307730B730D7312731373187319731E732273247327 +7328732C733173327335733A733B733D7343734D7350735273567358735D735E +735F7360736673677369736B736C736E736F737173777379737C738073817383 +73857386738E73907393739573977398739C739E739F73A073A273A573A673AA +73AB73AD73B573B773B973BC73BD73BF73C573C673C973CB73CC73CF73D273D3 +73D673D973DD73E173E373E673E773E973F473F573F773F973FA73FB73FD0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +4C +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000073FF7400740174047407740A7411741A741B7424742674287429742A742B +742C742D742E742F74307431743974407443744474467447744B744D74517452 +7457745D7462746674677468746B746D746E7471747274807481748574867487 +7489748F74907491749274987499749A749C749F74A074A174A374A674A874A9 +74AA74AB74AE74AF74B174B274B574B974BB74BF74C874C974CC74D074D374D8 +74DA74DB74DE74DF74E474E874EA74EB74EF74F474FA74FB74FC74FF75060000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +4D +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000075127516751775207521752475277529752A752F75367539753D753E753F +7540754375477548754E755075527557755E755F7561756F75717579757A757B +757C757D757E7581758575907592759375957599759C75A275A475B475BA75BF +75C075C175C475C675CC75CE75CF75D775DC75DF75E075E175E475E775EC75EE +75EF75F175F9760076027603760476077608760A760C760F7612761376157616 +7619761B761C761D761E7623762576267629762D763276337635763876390000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +4E +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000763A763C764A764076417643764476457649764B76557659765F76647665 +766D766E766F7671767476817685768C768D7695769B769C769D769F76A076A2 +76A376A476A576A676A776A876AA76AD76BD76C176C576C976CB76CC76CE76D4 +76D976E076E676E876EC76F076F176F676F976FC77007706770A770E77127714 +771577177719771A771C77227728772D772E772F7734773577367739773D773E +774277457746774A774D774E774F775277567757775C775E775F776077620000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +4F +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000077647767776A776C7770777277737774777A777D77807784778C778D7794 +77957796779A779F77A277A777AA77AE77AF77B177B577BE77C377C977D177D2 +77D577D977DE77DF77E077E477E677EA77EC77F077F177F477F877FB78057806 +7809780D780E7811781D782178227823782D782E783078357837784378447847 +7848784C784E7852785C785E78607861786378647868786A786E787A787E788A +788F7894789878A1789D789E789F78A478A878AC78AD78B078B178B278B30000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +50 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000078BB78BD78BF78C778C878C978CC78CE78D278D378D578D678E478DB78DF +78E078E178E678EA78F278F3790078F678F778FA78FB78FF7906790C7910791A +791C791E791F7920792579277929792D793179347935793B793D793F79447945 +7946794A794B794F795179547958795B795C79677969796B79727979797B797C +797E798B798C799179937994799579967998799B799C79A179A879A979AB79AF +79B179B479B879BB79C279C479C779C879CA79CF79D479D679DA79DD79DE0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +51 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000079E079E279E579EA79EB79ED79F179F879FC7A027A037A077A097A0A7A0C +7A117A157A1B7A1E7A217A277A2B7A2D7A2F7A307A347A357A387A397A3A7A44 +7A457A477A487A4C7A557A567A597A5C7A5D7A5F7A607A657A677A6A7A6D7A75 +7A787A7E7A807A827A857A867A8A7A8B7A907A917A947A9E7AA07AA37AAC7AB3 +7AB57AB97ABB7ABC7AC67AC97ACC7ACE7AD17ADB7AE87AE97AEB7AEC7AF17AF4 +7AFB7AFD7AFE7B077B147B1F7B237B277B297B2A7B2B7B2D7B2E7B2F7B300000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +52 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00007B317B347B3D7B3F7B407B417B477B4E7B557B607B647B667B697B6A7B6D +7B6F7B727B737B777B847B897B8E7B907B917B967B9B7B9E7BA07BA57BAC7BAF +7BB07BB27BB57BB67BBA7BBB7BBC7BBD7BC27BC57BC87BCA7BD47BD67BD77BD9 +7BDA7BDB7BE87BEA7BF27BF47BF57BF87BF97BFA7BFC7BFE7C017C027C037C04 +7C067C097C0B7C0C7C0E7C0F7C197C1B7C207C257C267C287C2C7C317C337C34 +7C367C397C3A7C467C4A7C557C517C527C537C597C5A7C5B7C5C7C5D7C5E0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +53 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00007C617C637C677C697C6D7C6E7C707C727C797C7C7C7D7C867C877C8F7C94 +7C9E7CA07CA67CB07CB67CB77CBA7CBB7CBC7CBF7CC47CC77CC87CC97CCD7CCF +7CD37CD47CD57CD77CD97CDA7CDD7CE67CE97CEB7CF57D037D077D087D097D0F +7D117D127D137D167D1D7D1E7D237D267D2A7D2D7D317D3C7D3D7D3E7D407D41 +7D477D487D4D7D517D537D577D597D5A7D5C7D5D7D657D677D6A7D707D787D7A +7D7B7D7F7D817D827D837D857D867D887D8B7D8C7D8D7D917D967D977D9D0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +54 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00007D9E7DA67DA77DAA7DB37DB67DB77DB97DC27DC37DC47DC57DC67DCC7DCD +7DCE7DD77DD97E007DE27DE57DE67DEA7DEB7DED7DF17DF57DF67DF97DFA7E08 +7E107E117E157E177E1C7E1D7E207E277E287E2C7E2D7E2F7E337E367E3F7E44 +7E457E477E4E7E507E527E587E5F7E617E627E657E6B7E6E7E6F7E737E787E7E +7E817E867E877E8A7E8D7E917E957E987E9A7E9D7E9E7F3C7F3B7F3D7F3E7F3F +7F437F447F477F4F7F527F537F5B7F5C7F5D7F617F637F647F657F667F6D0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +55 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00007F717F7D7F7E7F7F7F807F8B7F8D7F8F7F907F917F967F977F9C7FA17FA2 +7FA67FAA7FAD7FB47FBC7FBF7FC07FC37FC87FCE7FCF7FDB7FDF7FE37FE57FE8 +7FEC7FEE7FEF7FF27FFA7FFD7FFE7FFF80078008800A800D800E800F80118013 +80148016801D801E801F802080248026802C802E80308034803580378039803A +803C803E80408044806080648066806D8071807580818088808E809C809E80A6 +80A780AB80B880B980C880CD80CF80D280D480D580D780D880E080ED80EE0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +56 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000080F080F280F380F680F980FA80FE8103810B811681178118811C811E8120 +81248127812C81308135813A813C81458147814A814C81528157816081618167 +81688169816D816F817781818190818481858186818B818E81968198819B819E +81A281AE81B281B481BB81CB81C381C581CA81CE81CF81D581D781DB81DD81DE +81E181E481EB81EC81F081F181F281F581F681F881F981FD81FF82008203820F +821382148219821A821D82218222822882328234823A82438244824582460000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +57 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000824B824E824F82518256825C826082638267826D8274827B827D827F8280 +82818283828482878289828A828E8291829482968298829A829B82A082A182A3 +82A482A782A882A982AA82AE82B082B282B482B782BA82BC82BE82BF82C682D0 +82D582DA82E082E282E482E882EA82ED82EF82F682F782FD82FE830083018307 +8308830A830B8354831B831D831E831F83218322832C832D832E833083338337 +833A833C833D8342834383448347834D834E8351835583568357837083780000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +58 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000837D837F8380838283848386838D83928394839583988399839B839C839D +83A683A783A983AC83BE83BF83C083C783C983CF83D083D183D483DD835383E8 +83EA83F683F883F983FC84018406840A840F84118415841983AD842F84398445 +84478448844A844D844F84518452845684588459845A845C8460846484658467 +846A84708473847484768478847C847D84818485849284938495849E84A684A8 +84A984AA84AF84B184B484BA84BD84BE84C084C284C784C884CC84CF84D30000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +59 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000084DC84E784EA84EF84F084F184F284F7853284FA84FB84FD850285038507 +850C850E8510851C851E85228523852485258527852A852B852F853385348536 +853F8546854F855085518552855385568559855C855D855E855F856085618562 +8564856B856F8579857A857B857D857F8581858585868589858B858C858F8593 +8598859D859F85A085A285A585A785B485B685B785B885BC85BD85BE85BF85C2 +85C785CA85CB85CE85AD85D885DA85DF85E085E685E885ED85F385F685FC0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +5A +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000085FF860086048605860D860E86108611861286188619861B861E86218627 +862986368638863A863C863D864086428646865286538656865786588659865D +866086618662866386648669866C866F867586768677867A868D869186968698 +869A869C86A186A686A786A886AD86B186B386B486B586B786B886B986BF86C0 +86C186C386C586D186D286D586D786DA86DC86E086E386E586E7868886FA86FC +86FD870487058707870B870E870F8710871387148719871E871F872187230000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +5B +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00008728872E872F873187328739873A873C873D873E874087438745874D8758 +875D876187648765876F87718772877B8783878487858786878787888789878B +878C879087938795879787988799879E87A087A387A787AC87AD87AE87B187B5 +87BE87BF87C187C887C987CA87CE87D587D687D987DA87DC87DF87E287E387E4 +87EA87EB87ED87F187F387F887FA87FF8801880388068809880A880B88108819 +8812881388148818881A881B881C881E881F8828882D882E8830883288350000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +5C +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000883A883C88418843884588488849884A884B884E8851885588568858885A +885C885F88608864886988718879887B88808898889A889B889C889F88A088A8 +88AA88BA88BD88BE88C088CA88CB88CC88CD88CE88D188D288D388DB88DE88E7 +88EF88F088F188F588F789018906890D890E890F8915891689188919891A891C +892089268927892889308931893289358939893A893E89408942894589468949 +894F89528957895A895B895C896189628963896B896E897089738975897A0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +5D +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000897B897C897D8989898D899089948995899B899C899F89A089A589B089B4 +89B589B689B789BC89D489D589D689D789D889E589E989EB89ED89F189F389F6 +89F989FD89FF8A048A058A078A0F8A118A128A148A158A1E8A208A228A248A26 +8A2B8A2C8A2F8A358A378A3D8A3E8A408A438A458A478A498A4D8A4E8A538A56 +8A578A588A5C8A5D8A618A658A678A758A768A778A798A7A8A7B8A7E8A7F8A80 +8A838A868A8B8A8F8A908A928A968A978A998A9F8AA78AA98AAE8AAF8AB30000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +5E +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00008AB68AB78ABB8ABE8AC38AC68AC88AC98ACA8AD18AD38AD48AD58AD78ADD +8ADF8AEC8AF08AF48AF58AF68AFC8AFF8B058B068B0B8B118B1C8B1E8B1F8B0A +8B2D8B308B378B3C8B428B438B448B458B468B488B528B538B548B598B4D8B5E +8B638B6D8B768B788B798B7C8B7E8B818B848B858B8B8B8D8B8F8B948B958B9C +8B9E8B9F8C388C398C3D8C3E8C458C478C498C4B8C4F8C518C538C548C578C58 +8C5B8C5D8C598C638C648C668C688C698C6D8C738C758C768C7B8C7E8C860000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +5F +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00008C878C8B8C908C928C938C998C9B8C9C8CA48CB98CBA8CC58CC68CC98CCB +8CCF8CD68CD58CD98CDD8CE18CE88CEC8CEF8CF08CF28CF58CF78CF88CFE8CFF +8D018D038D098D128D178D1B8D658D698D6C8D6E8D7F8D828D848D888D8D8D90 +8D918D958D9E8D9F8DA08DA68DAB8DAC8DAF8DB28DB58DB78DB98DBB8DC08DC5 +8DC68DC78DC88DCA8DCE8DD18DD48DD58DD78DD98DE48DE58DE78DEC8DF08DBC +8DF18DF28DF48DFD8E018E048E058E068E0B8E118E148E168E208E218E220000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +60 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00008E238E268E278E318E338E368E378E388E398E3D8E408E418E4B8E4D8E4E +8E4F8E548E5B8E5C8E5D8E5E8E618E628E698E6C8E6D8E6F8E708E718E798E7A +8E7B8E828E838E898E908E928E958E9A8E9B8E9D8E9E8EA28EA78EA98EAD8EAE +8EB38EB58EBA8EBB8EC08EC18EC38EC48EC78ECF8ED18ED48EDC8EE88EEE8EF0 +8EF18EF78EF98EFA8EED8F008F028F078F088F0F8F108F168F178F188F1E8F20 +8F218F238F258F278F288F2C8F2D8F2E8F348F358F368F378F3A8F408F410000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +61 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00008F438F478F4F8F518F528F538F548F558F588F5D8F5E8F658F9D8FA08FA1 +8FA48FA58FA68FB58FB68FB88FBE8FC08FC18FC68FCA8FCB8FCD8FD08FD28FD3 +8FD58FE08FE38FE48FE88FEE8FF18FF58FF68FFB8FFE900290049008900C9018 +901B90289029902F902A902C902D903390349037903F90439044904C905B905D +906290669067906C90709074907990859088908B908C908E9090909590979098 +9099909B90A090A190A290A590B090B290B390B490B690BD90CC90BE90C30000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +62 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000090C490C590C790C890D590D790D890D990DC90DD90DF90E590D290F690EB +90EF90F090F490FE90FF91009104910591069108910D91109114911691179118 +911A911C911E912091259122912391279129912E912F91319134913691379139 +913A913C913D914391479148914F915391579159915A915B916191649167916D +91749179917A917B9181918391859186918A918E91919193919491959198919E +91A191A691A891AC91AD91AE91B091B191B291B391B691BB91BC91BD91BF0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +63 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000091C291C391C591D391D491D791D991DA91DE91E491E591E991EA91EC91ED +91EE91EF91F091F191F791F991FB91FD9200920192049205920692079209920A +920C92109212921392169218921C921D92239224922592269228922E922F9230 +92339235923692389239923A923C923E92409242924392469247924A924D924E +924F925192589259925C925D926092619265926792689269926E926F92709275 +9276927792789279927B927C927D927F92889289928A928D928E929292970000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +64 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00009299929F92A092A492A592A792A892AB92AF92B292B692B892BA92BB92BC +92BD92BF92C092C192C292C392C592C692C792C892CB92CC92CD92CE92D092D3 +92D592D792D892D992DC92DD92DF92E092E192E392E592E792E892EC92EE92F0 +92F992FB92FF930093029308930D931193149315931C931D931E931F93219324 +932593279329932A933393349336933793479348934993509351935293559357 +9358935A935E9364936593679369936A936D936F937093719373937493760000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +65 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000937A937D937F9380938193829388938A938B938D938F939293959398939B +939E93A193A393A493A693A893AB93B493B593B693BA93A993C193C493C593C6 +93C793C993CA93CB93CC93CD93D393D993DC93DE93DF93E293E693E793F993F7 +93F893FA93FB93FD94019402940494089409940D940E940F941594169417941F +942E942F9431943294339434943B943F943D944394459448944A944C94559459 +945C945F946194639468946B946D946E946F9471947294849483957895790000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +66 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000957E95849588958C958D958E959D959E959F95A195A695A995AB95AC95B4 +95B695BA95BD95BF95C695C895C995CB95D095D195D295D395D995DA95DD95DE +95DF95E095E495E6961D961E9622962496259626962C96319633963796389639 +963A963C963D9641965296549656965796589661966E9674967B967C967E967F +9681968296839684968996919696969A969D969F96A496A596A696A996AE96AF +96B396BA96CA96D25DB296D896DA96DD96DE96DF96E996EF96F196FA97020000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +67 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000970397059709971A971B971D97219722972397289731973397419743974A +974E974F975597579758975A975B97639767976A976E9773977697779778977B +977D977F978097899795979697979799979A979E979F97A297AC97AE97B197B2 +97B597B697B897B997BA97BC97BE97BF97C197C497C597C797C997CA97CC97CD +97CE97D097D197D497D797D897D997DD97DE97E097DB97E197E497EF97F197F4 +97F797F897FA9807980A9819980D980E98149816981C981E9820982398260000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +68 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000982B982E982F98309832983398359825983E98449847984A985198529853 +985698579859985A9862986398659866986A986C98AB98AD98AE98B098B498B7 +98B898BA98BB98BF98C298C598C898CC98E198E398E598E698E798EA98F398F6 +9902990799089911991599169917991A991B991C991F992299269927992B9931 +99329933993499359939993A993B993C99409941994699479948994D994E9954 +99589959995B995C995E995F9960999B999D999F99A699B099B199B299B50000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +69 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000099B999BA99BD99BF99C399C999D399D499D999DA99DC99DE99E799EA99EB +99EC99F099F499F599F999FD99FE9A029A039A049A0B9A0C9A109A119A169A1E +9A209A229A239A249A279A2D9A2E9A339A359A369A389A479A419A449A4A9A4B +9A4C9A4E9A519A549A569A5D9AAA9AAC9AAE9AAF9AB29AB49AB59AB69AB99ABB +9ABE9ABF9AC19AC39AC69AC89ACE9AD09AD29AD59AD69AD79ADB9ADC9AE09AE4 +9AE59AE79AE99AEC9AF29AF39AF59AF99AFA9AFD9AFF9B009B019B029B030000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +6A +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00009B049B059B089B099B0B9B0C9B0D9B0E9B109B129B169B199B1B9B1C9B20 +9B269B2B9B2D9B339B349B359B379B399B3A9B3D9B489B4B9B4C9B559B569B57 +9B5B9B5E9B619B639B659B669B689B6A9B6B9B6C9B6D9B6E9B739B759B779B78 +9B799B7F9B809B849B859B869B879B899B8A9B8B9B8D9B8F9B909B949B9A9B9D +9B9E9BA69BA79BA99BAC9BB09BB19BB29BB79BB89BBB9BBC9BBE9BBF9BC19BC7 +9BC89BCE9BD09BD79BD89BDD9BDF9BE59BE79BEA9BEB9BEF9BF39BF79BF80000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +6B +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00009BF99BFA9BFD9BFF9C009C029C0B9C0F9C119C169C189C199C1A9C1C9C1E +9C229C239C269C279C289C299C2A9C319C359C369C379C3D9C419C439C449C45 +9C499C4A9C4E9C4F9C509C539C549C569C589C5B9C5D9C5E9C5F9C639C699C6A +9C5C9C6B9C689C6E9C709C729C759C779C7B9CE69CF29CF79CF99D0B9D029D11 +9D179D189D1C9D1D9D1E9D2F9D309D329D339D349D3A9D3C9D459D3D9D429D43 +9D479D4A9D539D549D5F9D639D629D659D699D6A9D6B9D709D769D779D7B0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +6C +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00009D7C9D7E9D839D849D869D8A9D8D9D8E9D929D939D959D969D979D989DA1 +9DAA9DAC9DAE9DB19DB59DB99DBC9DBF9DC39DC79DC99DCA9DD49DD59DD69DD7 +9DDA9DDE9DDF9DE09DE59DE79DE99DEB9DEE9DF09DF39DF49DFE9E0A9E029E07 +9E0E9E109E119E129E159E169E199E1C9E1D9E7A9E7B9E7C9E809E829E839E84 +9E859E879E8E9E8F9E969E989E9B9E9E9EA49EA89EAC9EAE9EAF9EB09EB39EB4 +9EB59EC69EC89ECB9ED59EDF9EE49EE79EEC9EED9EEE9EF09EF19EF29EF50000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +6D +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00009EF89EFF9F029F039F099F0F9F109F119F129F149F169F179F199F1A9F1B +9F1F9F229F269F2A9F2B9F2F9F319F329F349F379F399F3A9F3C9F3D9F3F9F41 +9F439F449F459F469F479F539F559F569F579F589F5A9F5D9F5E9F689F699F6D +9F6E9F6F9F709F719F739F759F7A9F7D9F8F9F909F919F929F949F969F979F9E +9FA19FA29FA39FA5000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 diff --git a/env/tcl/tcl8.6/encoding/koi8-r.enc b/env/tcl/tcl8.6/encoding/koi8-r.enc new file mode 100644 index 0000000..49bf2ea --- /dev/null +++ b/env/tcl/tcl8.6/encoding/koi8-r.enc @@ -0,0 +1,20 @@ +# Encoding file: koi8-r, single-byte +S +003F 0 1 +00 +0000000100020003000400050006000700080009000A000B000C000D000E000F +0010001100120013001400150016001700180019001A001B001C001D001E001F +0020002100220023002400250026002700280029002A002B002C002D002E002F +0030003100320033003400350036003700380039003A003B003C003D003E003F +0040004100420043004400450046004700480049004A004B004C004D004E004F +0050005100520053005400550056005700580059005A005B005C005D005E005F +0060006100620063006400650066006700680069006A006B006C006D006E006F +0070007100720073007400750076007700780079007A007B007C007D007E007F +25002502250C251025142518251C2524252C2534253C258025842588258C2590 +259125922593232025A02219221A22482264226500A0232100B000B200B700F7 +25502551255204512553255425552556255725582559255A255B255C255D255E +255F25602561040125622563256425652566256725682569256A256B256C00A9 +044E0430043104460434043504440433044504380439043A043B043C043D043E +043F044F044004410442044304360432044C044B04370448044D04490447044A +042E0410041104260414041504240413042504180419041A041B041C041D041E +041F042F042004210422042304160412042C042B04170428042D04290427042A diff --git a/env/tcl/tcl8.6/encoding/koi8-u.enc b/env/tcl/tcl8.6/encoding/koi8-u.enc new file mode 100644 index 0000000..e4eeb84 --- /dev/null +++ b/env/tcl/tcl8.6/encoding/koi8-u.enc @@ -0,0 +1,20 @@ +# Encoding file: koi8-u, single-byte +S +003F 0 1 +00 +0000000100020003000400050006000700080009000A000B000C000D000E000F +0010001100120013001400150016001700180019001A001B001C001D001E001F +0020002100220023002400250026002700280029002A002B002C002D002E002F +0030003100320033003400350036003700380039003A003B003C003D003E003F +0040004100420043004400450046004700480049004A004B004C004D004E004F +0050005100520053005400550056005700580059005A005B005C005D005E005F +0060006100620063006400650066006700680069006A006B006C006D006E006F +0070007100720073007400750076007700780079007A007B007C007D007E007F +25002502250C251025142518251C2524252C2534253C258025842588258C2590 +259125922593232025A02219221A22482264226500A0232100B000B200B700F7 +25502551255204510454255404560457255725582559255A255B0491255D255E +255F25602561040104032563040604072566256725682569256A0490256C00A9 +044E0430043104460434043504440433044504380439043A043B043C043D043E +043F044F044004410442044304360432044C044B04370448044D04490447044A +042E0410041104260414041504240413042504180419041A041B041C041D041E +041F042F042004210422042304160412042C042B04170428042D04290427042A diff --git a/env/tcl/tcl8.6/encoding/ksc5601.enc b/env/tcl/tcl8.6/encoding/ksc5601.enc new file mode 100644 index 0000000..bec61d0 --- /dev/null +++ b/env/tcl/tcl8.6/encoding/ksc5601.enc @@ -0,0 +1,1516 @@ +# Encoding file: ksc5601, double-byte +D +233F 0 89 +21 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000030003001300200B72025202600A8300300AD20152225FF3C223C20182019 +201C201D3014301530083009300A300B300C300D300E300F3010301100B100D7 +00F7226022642265221E223400B0203220332103212BFFE0FFE1FFE526422640 +222022A52312220222072261225200A7203B2606260525CB25CF25CE25C725C6 +25A125A025B325B225BD25BC219221902191219321943013226A226B221A223D +221D2235222B222C2208220B2286228722822283222A222922272228FFE20000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +22 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000021D221D42200220300B4FF5E02C702D802DD02DA02D900B802DB00A100BF +02D0222E2211220F00A42109203025C125C025B725B626642660266126652667 +2663229925C825A325D025D1259225A425A525A825A725A625A92668260F260E +261C261E00B62020202121952197219921962198266D2669266A266C327F321C +211633C7212233C233D821210000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +23 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000FF01FF02FF03FF04FF05FF06FF07FF08FF09FF0AFF0BFF0CFF0DFF0EFF0F +FF10FF11FF12FF13FF14FF15FF16FF17FF18FF19FF1AFF1BFF1CFF1DFF1EFF1F +FF20FF21FF22FF23FF24FF25FF26FF27FF28FF29FF2AFF2BFF2CFF2DFF2EFF2F +FF30FF31FF32FF33FF34FF35FF36FF37FF38FF39FF3AFF3BFFE6FF3DFF3EFF3F +FF40FF41FF42FF43FF44FF45FF46FF47FF48FF49FF4AFF4BFF4CFF4DFF4EFF4F +FF50FF51FF52FF53FF54FF55FF56FF57FF58FF59FF5AFF5BFF5CFF5DFFE30000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +24 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000313131323133313431353136313731383139313A313B313C313D313E313F +3140314131423143314431453146314731483149314A314B314C314D314E314F +3150315131523153315431553156315731583159315A315B315C315D315E315F +3160316131623163316431653166316731683169316A316B316C316D316E316F +3170317131723173317431753176317731783179317A317B317C317D317E317F +3180318131823183318431853186318731883189318A318B318C318D318E0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +25 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000217021712172217321742175217621772178217900000000000000000000 +2160216121622163216421652166216721682169000000000000000000000000 +0000039103920393039403950396039703980399039A039B039C039D039E039F +03A003A103A303A403A503A603A703A803A90000000000000000000000000000 +000003B103B203B303B403B503B603B703B803B903BA03BB03BC03BD03BE03BF +03C003C103C303C403C503C603C703C803C90000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +26 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000025002502250C251025182514251C252C25242534253C25012503250F2513 +251B251725232533252B253B254B2520252F25282537253F251D253025252538 +254225122511251A251925162515250E250D251E251F25212522252625272529 +252A252D252E25312532253525362539253A253D253E25402541254325442545 +2546254725482549254A00000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +27 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00003395339633972113339833C433A333A433A533A63399339A339B339C339D +339E339F33A033A133A233CA338D338E338F33CF3388338933C833A733A833B0 +33B133B233B333B433B533B633B733B833B93380338133823383338433BA33BB +33BC33BD33BE33BF33903391339233933394212633C033C1338A338B338C33D6 +33C533AD33AE33AF33DB33A933AA33AB33AC33DD33D033D333C333C933DC33C6 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +28 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000000C600D000AA0126000001320000013F014100D8015200BA00DE0166014A +00003260326132623263326432653266326732683269326A326B326C326D326E +326F3270327132723273327432753276327732783279327A327B24D024D124D2 +24D324D424D524D624D724D824D924DA24DB24DC24DD24DE24DF24E024E124E2 +24E324E424E524E624E724E824E9246024612462246324642465246624672468 +2469246A246B246C246D246E00BD2153215400BC00BE215B215C215D215E0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +29 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000000E6011100F001270131013301380140014200F8015300DF00FE0167014B +01493200320132023203320432053206320732083209320A320B320C320D320E +320F3210321132123213321432153216321732183219321A321B249C249D249E +249F24A024A124A224A324A424A524A624A724A824A924AA24AB24AC24AD24AE +24AF24B024B124B224B324B424B5247424752476247724782479247A247B247C +247D247E247F24802481248200B900B200B32074207F20812082208320840000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +2A +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000304130423043304430453046304730483049304A304B304C304D304E304F +3050305130523053305430553056305730583059305A305B305C305D305E305F +3060306130623063306430653066306730683069306A306B306C306D306E306F +3070307130723073307430753076307730783079307A307B307C307D307E307F +3080308130823083308430853086308730883089308A308B308C308D308E308F +3090309130923093000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +2B +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000030A130A230A330A430A530A630A730A830A930AA30AB30AC30AD30AE30AF +30B030B130B230B330B430B530B630B730B830B930BA30BB30BC30BD30BE30BF +30C030C130C230C330C430C530C630C730C830C930CA30CB30CC30CD30CE30CF +30D030D130D230D330D430D530D630D730D830D930DA30DB30DC30DD30DE30DF +30E030E130E230E330E430E530E630E730E830E930EA30EB30EC30ED30EE30EF +30F030F130F230F330F430F530F6000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +2C +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000004100411041204130414041504010416041704180419041A041B041C041D +041E041F0420042104220423042404250426042704280429042A042B042C042D +042E042F00000000000000000000000000000000000000000000000000000000 +000004300431043204330434043504510436043704380439043A043B043C043D +043E043F0440044104420443044404450446044704480449044A044B044C044D +044E044F00000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +30 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000AC00AC01AC04AC07AC08AC09AC0AAC10AC11AC12AC13AC14AC15AC16AC17 +AC19AC1AAC1BAC1CAC1DAC20AC24AC2CAC2DAC2FAC30AC31AC38AC39AC3CAC40 +AC4BAC4DAC54AC58AC5CAC70AC71AC74AC77AC78AC7AAC80AC81AC83AC84AC85 +AC86AC89AC8AAC8BAC8CAC90AC94AC9CAC9DAC9FACA0ACA1ACA8ACA9ACAAACAC +ACAFACB0ACB8ACB9ACBBACBCACBDACC1ACC4ACC8ACCCACD5ACD7ACE0ACE1ACE4 +ACE7ACE8ACEAACECACEFACF0ACF1ACF3ACF5ACF6ACFCACFDAD00AD04AD060000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +31 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000AD0CAD0DAD0FAD11AD18AD1CAD20AD29AD2CAD2DAD34AD35AD38AD3CAD44 +AD45AD47AD49AD50AD54AD58AD61AD63AD6CAD6DAD70AD73AD74AD75AD76AD7B +AD7CAD7DAD7FAD81AD82AD88AD89AD8CAD90AD9CAD9DADA4ADB7ADC0ADC1ADC4 +ADC8ADD0ADD1ADD3ADDCADE0ADE4ADF8ADF9ADFCADFFAE00AE01AE08AE09AE0B +AE0DAE14AE30AE31AE34AE37AE38AE3AAE40AE41AE43AE45AE46AE4AAE4CAE4D +AE4EAE50AE54AE56AE5CAE5DAE5FAE60AE61AE65AE68AE69AE6CAE70AE780000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +32 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000AE79AE7BAE7CAE7DAE84AE85AE8CAEBCAEBDAEBEAEC0AEC4AECCAECDAECF +AED0AED1AED8AED9AEDCAEE8AEEBAEEDAEF4AEF8AEFCAF07AF08AF0DAF10AF2C +AF2DAF30AF32AF34AF3CAF3DAF3FAF41AF42AF43AF48AF49AF50AF5CAF5DAF64 +AF65AF79AF80AF84AF88AF90AF91AF95AF9CAFB8AFB9AFBCAFC0AFC7AFC8AFC9 +AFCBAFCDAFCEAFD4AFDCAFE8AFE9AFF0AFF1AFF4AFF8B000B001B004B00CB010 +B014B01CB01DB028B044B045B048B04AB04CB04EB053B054B055B057B0590000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +33 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000B05DB07CB07DB080B084B08CB08DB08FB091B098B099B09AB09CB09FB0A0 +B0A1B0A2B0A8B0A9B0ABB0ACB0ADB0AEB0AFB0B1B0B3B0B4B0B5B0B8B0BCB0C4 +B0C5B0C7B0C8B0C9B0D0B0D1B0D4B0D8B0E0B0E5B108B109B10BB10CB110B112 +B113B118B119B11BB11CB11DB123B124B125B128B12CB134B135B137B138B139 +B140B141B144B148B150B151B154B155B158B15CB160B178B179B17CB180B182 +B188B189B18BB18DB192B193B194B198B19CB1A8B1CCB1D0B1D4B1DCB1DD0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +34 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000B1DFB1E8B1E9B1ECB1F0B1F9B1FBB1FDB204B205B208B20BB20CB214B215 +B217B219B220B234B23CB258B25CB260B268B269B274B275B27CB284B285B289 +B290B291B294B298B299B29AB2A0B2A1B2A3B2A5B2A6B2AAB2ACB2B0B2B4B2C8 +B2C9B2CCB2D0B2D2B2D8B2D9B2DBB2DDB2E2B2E4B2E5B2E6B2E8B2EBB2ECB2ED +B2EEB2EFB2F3B2F4B2F5B2F7B2F8B2F9B2FAB2FBB2FFB300B301B304B308B310 +B311B313B314B315B31CB354B355B356B358B35BB35CB35EB35FB364B3650000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +35 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000B367B369B36BB36EB370B371B374B378B380B381B383B384B385B38CB390 +B394B3A0B3A1B3A8B3ACB3C4B3C5B3C8B3CBB3CCB3CEB3D0B3D4B3D5B3D7B3D9 +B3DBB3DDB3E0B3E4B3E8B3FCB410B418B41CB420B428B429B42BB434B450B451 +B454B458B460B461B463B465B46CB480B488B49DB4A4B4A8B4ACB4B5B4B7B4B9 +B4C0B4C4B4C8B4D0B4D5B4DCB4DDB4E0B4E3B4E4B4E6B4ECB4EDB4EFB4F1B4F8 +B514B515B518B51BB51CB524B525B527B528B529B52AB530B531B534B5380000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +36 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000B540B541B543B544B545B54BB54CB54DB550B554B55CB55DB55FB560B561 +B5A0B5A1B5A4B5A8B5AAB5ABB5B0B5B1B5B3B5B4B5B5B5BBB5BCB5BDB5C0B5C4 +B5CCB5CDB5CFB5D0B5D1B5D8B5ECB610B611B614B618B625B62CB634B648B664 +B668B69CB69DB6A0B6A4B6ABB6ACB6B1B6D4B6F0B6F4B6F8B700B701B705B728 +B729B72CB72FB730B738B739B73BB744B748B74CB754B755B760B764B768B770 +B771B773B775B77CB77DB780B784B78CB78DB78FB790B791B792B796B7970000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +37 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000B798B799B79CB7A0B7A8B7A9B7ABB7ACB7ADB7B4B7B5B7B8B7C7B7C9B7EC +B7EDB7F0B7F4B7FCB7FDB7FFB800B801B807B808B809B80CB810B818B819B81B +B81DB824B825B828B82CB834B835B837B838B839B840B844B851B853B85CB85D +B860B864B86CB86DB86FB871B878B87CB88DB8A8B8B0B8B4B8B8B8C0B8C1B8C3 +B8C5B8CCB8D0B8D4B8DDB8DFB8E1B8E8B8E9B8ECB8F0B8F8B8F9B8FBB8FDB904 +B918B920B93CB93DB940B944B94CB94FB951B958B959B95CB960B968B9690000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +38 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000B96BB96DB974B975B978B97CB984B985B987B989B98AB98DB98EB9ACB9AD +B9B0B9B4B9BCB9BDB9BFB9C1B9C8B9C9B9CCB9CEB9CFB9D0B9D1B9D2B9D8B9D9 +B9DBB9DDB9DEB9E1B9E3B9E4B9E5B9E8B9ECB9F4B9F5B9F7B9F8B9F9B9FABA00 +BA01BA08BA15BA38BA39BA3CBA40BA42BA48BA49BA4BBA4DBA4EBA53BA54BA55 +BA58BA5CBA64BA65BA67BA68BA69BA70BA71BA74BA78BA83BA84BA85BA87BA8C +BAA8BAA9BAABBAACBAB0BAB2BAB8BAB9BABBBABDBAC4BAC8BAD8BAD9BAFC0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +39 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000BB00BB04BB0DBB0FBB11BB18BB1CBB20BB29BB2BBB34BB35BB36BB38BB3B +BB3CBB3DBB3EBB44BB45BB47BB49BB4DBB4FBB50BB54BB58BB61BB63BB6CBB88 +BB8CBB90BBA4BBA8BBACBBB4BBB7BBC0BBC4BBC8BBD0BBD3BBF8BBF9BBFCBBFF +BC00BC02BC08BC09BC0BBC0CBC0DBC0FBC11BC14BC15BC16BC17BC18BC1BBC1C +BC1DBC1EBC1FBC24BC25BC27BC29BC2DBC30BC31BC34BC38BC40BC41BC43BC44 +BC45BC49BC4CBC4DBC50BC5DBC84BC85BC88BC8BBC8CBC8EBC94BC95BC970000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +3A +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000BC99BC9ABCA0BCA1BCA4BCA7BCA8BCB0BCB1BCB3BCB4BCB5BCBCBCBDBCC0 +BCC4BCCDBCCFBCD0BCD1BCD5BCD8BCDCBCF4BCF5BCF6BCF8BCFCBD04BD05BD07 +BD09BD10BD14BD24BD2CBD40BD48BD49BD4CBD50BD58BD59BD64BD68BD80BD81 +BD84BD87BD88BD89BD8ABD90BD91BD93BD95BD99BD9ABD9CBDA4BDB0BDB8BDD4 +BDD5BDD8BDDCBDE9BDF0BDF4BDF8BE00BE03BE05BE0CBE0DBE10BE14BE1CBE1D +BE1FBE44BE45BE48BE4CBE4EBE54BE55BE57BE59BE5ABE5BBE60BE61BE640000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +3B +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000BE68BE6ABE70BE71BE73BE74BE75BE7BBE7CBE7DBE80BE84BE8CBE8DBE8F +BE90BE91BE98BE99BEA8BED0BED1BED4BED7BED8BEE0BEE3BEE4BEE5BEECBF01 +BF08BF09BF18BF19BF1BBF1CBF1DBF40BF41BF44BF48BF50BF51BF55BF94BFB0 +BFC5BFCCBFCDBFD0BFD4BFDCBFDFBFE1C03CC051C058C05CC060C068C069C090 +C091C094C098C0A0C0A1C0A3C0A5C0ACC0ADC0AFC0B0C0B3C0B4C0B5C0B6C0BC +C0BDC0BFC0C0C0C1C0C5C0C8C0C9C0CCC0D0C0D8C0D9C0DBC0DCC0DDC0E40000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +3C +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000C0E5C0E8C0ECC0F4C0F5C0F7C0F9C100C104C108C110C115C11CC11DC11E +C11FC120C123C124C126C127C12CC12DC12FC130C131C136C138C139C13CC140 +C148C149C14BC14CC14DC154C155C158C15CC164C165C167C168C169C170C174 +C178C185C18CC18DC18EC190C194C196C19CC19DC19FC1A1C1A5C1A8C1A9C1AC +C1B0C1BDC1C4C1C8C1CCC1D4C1D7C1D8C1E0C1E4C1E8C1F0C1F1C1F3C1FCC1FD +C200C204C20CC20DC20FC211C218C219C21CC21FC220C228C229C22BC22D0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +3D +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000C22FC231C232C234C248C250C251C254C258C260C265C26CC26DC270C274 +C27CC27DC27FC281C288C289C290C298C29BC29DC2A4C2A5C2A8C2ACC2ADC2B4 +C2B5C2B7C2B9C2DCC2DDC2E0C2E3C2E4C2EBC2ECC2EDC2EFC2F1C2F6C2F8C2F9 +C2FBC2FCC300C308C309C30CC30DC313C314C315C318C31CC324C325C328C329 +C345C368C369C36CC370C372C378C379C37CC37DC384C388C38CC3C0C3D8C3D9 +C3DCC3DFC3E0C3E2C3E8C3E9C3EDC3F4C3F5C3F8C408C410C424C42CC4300000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +3E +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000C434C43CC43DC448C464C465C468C46CC474C475C479C480C494C49CC4B8 +C4BCC4E9C4F0C4F1C4F4C4F8C4FAC4FFC500C501C50CC510C514C51CC528C529 +C52CC530C538C539C53BC53DC544C545C548C549C54AC54CC54DC54EC553C554 +C555C557C558C559C55DC55EC560C561C564C568C570C571C573C574C575C57C +C57DC580C584C587C58CC58DC58FC591C595C597C598C59CC5A0C5A9C5B4C5B5 +C5B8C5B9C5BBC5BCC5BDC5BEC5C4C5C5C5C6C5C7C5C8C5C9C5CAC5CCC5CE0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +3F +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000C5D0C5D1C5D4C5D8C5E0C5E1C5E3C5E5C5ECC5EDC5EEC5F0C5F4C5F6C5F7 +C5FCC5FDC5FEC5FFC600C601C605C606C607C608C60CC610C618C619C61BC61C +C624C625C628C62CC62DC62EC630C633C634C635C637C639C63BC640C641C644 +C648C650C651C653C654C655C65CC65DC660C66CC66FC671C678C679C67CC680 +C688C689C68BC68DC694C695C698C69CC6A4C6A5C6A7C6A9C6B0C6B1C6B4C6B8 +C6B9C6BAC6C0C6C1C6C3C6C5C6CCC6CDC6D0C6D4C6DCC6DDC6E0C6E1C6E80000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +40 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000C6E9C6ECC6F0C6F8C6F9C6FDC704C705C708C70CC714C715C717C719C720 +C721C724C728C730C731C733C735C737C73CC73DC740C744C74AC74CC74DC74F +C751C752C753C754C755C756C757C758C75CC760C768C76BC774C775C778C77C +C77DC77EC783C784C785C787C788C789C78AC78EC790C791C794C796C797C798 +C79AC7A0C7A1C7A3C7A4C7A5C7A6C7ACC7ADC7B0C7B4C7BCC7BDC7BFC7C0C7C1 +C7C8C7C9C7CCC7CEC7D0C7D8C7DDC7E4C7E8C7ECC800C801C804C808C80A0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +41 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000C810C811C813C815C816C81CC81DC820C824C82CC82DC82FC831C838C83C +C840C848C849C84CC84DC854C870C871C874C878C87AC880C881C883C885C886 +C887C88BC88CC88DC894C89DC89FC8A1C8A8C8BCC8BDC8C4C8C8C8CCC8D4C8D5 +C8D7C8D9C8E0C8E1C8E4C8F5C8FCC8FDC900C904C905C906C90CC90DC90FC911 +C918C92CC934C950C951C954C958C960C961C963C96CC970C974C97CC988C989 +C98CC990C998C999C99BC99DC9C0C9C1C9C4C9C7C9C8C9CAC9D0C9D1C9D30000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +42 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000C9D5C9D6C9D9C9DAC9DCC9DDC9E0C9E2C9E4C9E7C9ECC9EDC9EFC9F0C9F1 +C9F8C9F9C9FCCA00CA08CA09CA0BCA0CCA0DCA14CA18CA29CA4CCA4DCA50CA54 +CA5CCA5DCA5FCA60CA61CA68CA7DCA84CA98CABCCABDCAC0CAC4CACCCACDCACF +CAD1CAD3CAD8CAD9CAE0CAECCAF4CB08CB10CB14CB18CB20CB21CB41CB48CB49 +CB4CCB50CB58CB59CB5DCB64CB78CB79CB9CCBB8CBD4CBE4CBE7CBE9CC0CCC0D +CC10CC14CC1CCC1DCC21CC22CC27CC28CC29CC2CCC2ECC30CC38CC39CC3B0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +43 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000CC3CCC3DCC3ECC44CC45CC48CC4CCC54CC55CC57CC58CC59CC60CC64CC66 +CC68CC70CC75CC98CC99CC9CCCA0CCA8CCA9CCABCCACCCADCCB4CCB5CCB8CCBC +CCC4CCC5CCC7CCC9CCD0CCD4CCE4CCECCCF0CD01CD08CD09CD0CCD10CD18CD19 +CD1BCD1DCD24CD28CD2CCD39CD5CCD60CD64CD6CCD6DCD6FCD71CD78CD88CD94 +CD95CD98CD9CCDA4CDA5CDA7CDA9CDB0CDC4CDCCCDD0CDE8CDECCDF0CDF8CDF9 +CDFBCDFDCE04CE08CE0CCE14CE19CE20CE21CE24CE28CE30CE31CE33CE350000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +44 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000CE58CE59CE5CCE5FCE60CE61CE68CE69CE6BCE6DCE74CE75CE78CE7CCE84 +CE85CE87CE89CE90CE91CE94CE98CEA0CEA1CEA3CEA4CEA5CEACCEADCEC1CEE4 +CEE5CEE8CEEBCEECCEF4CEF5CEF7CEF8CEF9CF00CF01CF04CF08CF10CF11CF13 +CF15CF1CCF20CF24CF2CCF2DCF2FCF30CF31CF38CF54CF55CF58CF5CCF64CF65 +CF67CF69CF70CF71CF74CF78CF80CF85CF8CCFA1CFA8CFB0CFC4CFE0CFE1CFE4 +CFE8CFF0CFF1CFF3CFF5CFFCD000D004D011D018D02DD034D035D038D03C0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +45 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000D044D045D047D049D050D054D058D060D06CD06DD070D074D07CD07DD081 +D0A4D0A5D0A8D0ACD0B4D0B5D0B7D0B9D0C0D0C1D0C4D0C8D0C9D0D0D0D1D0D3 +D0D4D0D5D0DCD0DDD0E0D0E4D0ECD0EDD0EFD0F0D0F1D0F8D10DD130D131D134 +D138D13AD140D141D143D144D145D14CD14DD150D154D15CD15DD15FD161D168 +D16CD17CD184D188D1A0D1A1D1A4D1A8D1B0D1B1D1B3D1B5D1BAD1BCD1C0D1D8 +D1F4D1F8D207D209D210D22CD22DD230D234D23CD23DD23FD241D248D25C0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +46 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000D264D280D281D284D288D290D291D295D29CD2A0D2A4D2ACD2B1D2B8D2B9 +D2BCD2BFD2C0D2C2D2C8D2C9D2CBD2D4D2D8D2DCD2E4D2E5D2F0D2F1D2F4D2F8 +D300D301D303D305D30CD30DD30ED310D314D316D31CD31DD31FD320D321D325 +D328D329D32CD330D338D339D33BD33CD33DD344D345D37CD37DD380D384D38C +D38DD38FD390D391D398D399D39CD3A0D3A8D3A9D3ABD3ADD3B4D3B8D3BCD3C4 +D3C5D3C8D3C9D3D0D3D8D3E1D3E3D3ECD3EDD3F0D3F4D3FCD3FDD3FFD4010000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +47 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000D408D41DD440D444D45CD460D464D46DD46FD478D479D47CD47FD480D482 +D488D489D48BD48DD494D4A9D4CCD4D0D4D4D4DCD4DFD4E8D4ECD4F0D4F8D4FB +D4FDD504D508D50CD514D515D517D53CD53DD540D544D54CD54DD54FD551D558 +D559D55CD560D565D568D569D56BD56DD574D575D578D57CD584D585D587D588 +D589D590D5A5D5C8D5C9D5CCD5D0D5D2D5D8D5D9D5DBD5DDD5E4D5E5D5E8D5EC +D5F4D5F5D5F7D5F9D600D601D604D608D610D611D613D614D615D61CD6200000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +48 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000D624D62DD638D639D63CD640D645D648D649D64BD64DD651D654D655D658 +D65CD667D669D670D671D674D683D685D68CD68DD690D694D69DD69FD6A1D6A8 +D6ACD6B0D6B9D6BBD6C4D6C5D6C8D6CCD6D1D6D4D6D7D6D9D6E0D6E4D6E8D6F0 +D6F5D6FCD6FDD700D704D711D718D719D71CD720D728D729D72BD72DD734D735 +D738D73CD744D747D749D750D751D754D756D757D758D759D760D761D763D765 +D769D76CD770D774D77CD77DD781D788D789D78CD790D798D799D79BD79D0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +4A +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00004F3D4F73504750F952A053EF547554E556095AC15BB6668767B667B767EF +6B4C73C275C27A3C82DB8304885788888A368CC88DCF8EFB8FE699D5523B5374 +5404606A61646BBC73CF811A89BA89D295A34F83520A58BE597859E65E725E79 +61C763C0674667EC687F6F97764E770B78F57A087AFF7C21809D826E82718AEB +95934E6B559D66F76E3478A37AED845B8910874E97A852D8574E582A5D4C611F +61BE6221656267D16A446E1B751875B376E377B07D3A90AF945194529F950000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +4B +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000053235CAC753280DB92409598525B580859DC5CA15D175EB75F3A5F4A6177 +6C5F757A75867CE07D737DB17F8C81548221859189418B1B92FC964D9C474ECB +4EF7500B51F1584F6137613E6168653969EA6F1175A5768676D67B8782A584CB +F90093A7958B55805BA25751F9017CB37FB991B5502853BB5C455DE862D2636E +64DA64E76E2070AC795B8DDD8E1EF902907D924592F84E7E4EF650655DFE5EFA +61066957817186548E4793759A2B4E5E5091677068405109528D52926AA20000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +4C +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000077BC92109ED452AB602F8FF2504861A963ED64CA683C6A846FC0818889A1 +96945805727D72AC75047D797E6D80A9898B8B7490639D5162896C7A6F547D50 +7F3A8A23517C614A7B9D8B199257938C4EAC4FD3501E50BE510652C152CD537F +577058835E9A5F91617661AC64CE656C666F66BB66F468976D87708570F1749F +74A574CA75D9786C78EC7ADF7AF67D457D938015803F811B83968B668F159015 +93E1980398389A5A9BE84FC25553583A59515B635C4660B86212684268B00000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +4D +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000068E86EAA754C767878CE7A3D7CFB7E6B7E7C8A088AA18C3F968E9DC453E4 +53E9544A547156FA59D15B645C3B5EAB62F765376545657266A067AF69C16CBD +75FC7690777E7A3F7F94800380A1818F82E682FD83F085C1883188B48AA5F903 +8F9C932E96C798679AD89F1354ED659B66F2688F7A408C379D6056F057645D11 +660668B168CD6EFE7428889E9BE46C68F9049AA84F9B516C5171529F5B545DE5 +6050606D62F163A7653B73D97A7A86A38CA2978F4E325BE16208679C74DC0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +4E +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000079D183D38A878AB28DE8904E934B98465ED369E885FF90EDF90551A05B98 +5BEC616368FA6B3E704C742F74D87BA17F5083C589C08CAB95DC9928522E605D +62EC90024F8A5149532158D95EE366E06D38709A72C273D67B5080F1945B5366 +639B7F6B4E565080584A58DE602A612762D069D09B415B8F7D1880B18F5F4EA4 +50D154AC55AC5B0C5DA05DE7652A654E68216A4B72E1768E77EF7D5E7FF981A0 +854E86DF8F038F4E90CA99039A559BAB4E184E454E5D4EC74FF1517752FE0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +4F +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000534053E353E5548E5614577557A25BC75D875ED061FC62D8655167B867E9 +69CB6B506BC66BEC6C426E9D707872D77396740377BF77E97A767D7F800981FC +8205820A82DF88628B338CFC8EC0901190B1926492B699D29A459CE99DD79F9C +570B5C4083CA97A097AB9EB4541B7A987FA488D98ECD90E158005C4863987A9F +5BAE5F137A797AAE828E8EAC5026523852F85377570862F363726B0A6DC37737 +53A5735785688E7695D5673A6AC36F708A6D8ECC994BF90666776B788CB40000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +50 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00009B3CF90753EB572D594E63C669FB73EA78457ABA7AC57CFE8475898F8D73 +903595A852FB574775477B6083CC921EF9086A58514B524B5287621F68D86975 +969950C552A452E461C365A4683969FF747E7B4B82B983EB89B28B398FD19949 +F9094ECA599764D266116A8E7434798179BD82A9887E887F895FF90A93264F0B +53CA602562716C727D1A7D664E98516277DC80AF4F014F0E5176518055DC5668 +573B57FA57FC5914594759935BC45C905D0E5DF15E7E5FCC628065D765E30000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +51 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000671E671F675E68CB68C46A5F6B3A6C236C7D6C826DC773987426742A7482 +74A37578757F788178EF794179477948797A7B957D007DBA7F888006802D808C +8A188B4F8C488D779321932498E299519A0E9A0F9A659E927DCA4F76540962EE +685491D155AB513AF90BF90C5A1C61E6F90D62CF62FFF90EF90FF910F911F912 +F91390A3F914F915F916F917F9188AFEF919F91AF91BF91C6696F91D7156F91E +F91F96E3F920634F637A5357F921678F69606E73F9227537F923F924F9250000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +52 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00007D0DF926F927887256CA5A18F928F929F92AF92BF92C4E43F92D51675948 +67F08010F92E59735E74649A79CA5FF5606C62C8637B5BE75BD752AAF92F5974 +5F296012F930F931F9327459F933F934F935F936F937F93899D1F939F93AF93B +F93CF93DF93EF93FF940F941F942F9436FC3F944F94581BF8FB260F1F946F947 +8166F948F9495C3FF94AF94BF94CF94DF94EF94FF950F9515AE98A25677B7D10 +F952F953F954F955F956F95780FDF958F9595C3C6CE5533F6EBA591A83360000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +53 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00004E394EB64F4655AE571858C75F5665B765E66A806BB56E4D77ED7AEF7C1E +7DDE86CB88929132935B64BB6FBE737A75B890545556574D61BA64D466C76DE1 +6E5B6F6D6FB975F0804381BD854189838AC78B5A931F6C9375537B548E0F905D +5510580258585E626207649E68E075767CD687B39EE84EE35788576E59275C0D +5CB15E365F85623464E173B381FA888B8CB8968A9EDB5B855FB760B350125200 +52305716583558575C0E5C605CF65D8B5EA65F9260BC63116389641768430000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +54 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000068F96AC26DD86E216ED46FE471FE76DC777979B17A3B840489A98CED8DF3 +8E4890039014905390FD934D967697DC6BD27006725872A27368776379BF7BE4 +7E9B8B8058A960C7656665FD66BE6C8C711E71C98C5A98134E6D7A814EDD51AC +51CD52D5540C61A76771685068DF6D1E6F7C75BC77B37AE580F484639285515C +6597675C679375D87AC78373F95A8C469017982D5C6F81C0829A9041906F920D +5F975D9D6A5971C8767B7B4985E48B0491279A30558761F6F95B76697F850000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +55 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000863F87BA88F8908FF95C6D1B70D973DE7D61843DF95D916A99F1F95E4E82 +53756B046B12703E721B862D9E1E524C8FA35D5064E5652C6B166FEB7C437E9C +85CD896489BD62C981D8881F5ECA67176D6A72FC7405746F878290DE4F865D0D +5FA0840A51B763A075654EAE5006516951C968816A117CAE7CB17CE7826F8AD2 +8F1B91CF4FB6513752F554425EEC616E623E65C56ADA6FFE792A85DC882395AD +9A629A6A9E979ECE529B66C66B77701D792B8F6297426190620065236F230000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +56 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000714974897DF4806F84EE8F269023934A51BD521752A36D0C70C888C25EC9 +65826BAE6FC27C3E73754EE44F3656F9F95F5CBA5DBA601C73B27B2D7F9A7FCE +8046901E923496F6974898189F614F8B6FA779AE91B496B752DEF960648864C4 +6AD36F5E7018721076E780018606865C8DEF8F0597329B6F9DFA9E75788C797F +7DA083C993049E7F9E938AD658DF5F046727702774CF7C60807E512170287262 +78CA8CC28CDA8CF496F74E8650DA5BEE5ED6659971CE764277AD804A84FC0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +57 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000907C9B279F8D58D85A415C626A136DDA6F0F763B7D2F7E37851E893893E4 +964B528965D267F369B46D416E9C700F7409746075597624786B8B2C985E516D +622E96784F96502B5D196DEA7DB88F2A5F8B61446817F961968652D2808B51DC +51CC695E7A1C7DBE83F196754FDA52295398540F550E5C6560A7674E68A86D6C +728172F874067483F96275E27C6C7F797FB8838988CF88E191CC91D096E29BC9 +541D6F7E71D0749885FA8EAA96A39C579E9F67976DCB743381E89716782C0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +58 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00007ACB7B207C926469746A75F278BC78E899AC9B549EBB5BDE5E556F20819C +83AB90884E07534D5A295DD25F4E6162633D666966FC6EFF6F2B7063779E842C +8513883B8F1399459C3B551C62B9672B6CAB8309896A977A4EA159845FD85FD9 +671B7DB27F548292832B83BD8F1E909957CB59B95A925BD06627679A68856BCF +71647F758CB78CE390819B4581088C8A964C9A409EA55B5F6C13731B76F276DF +840C51AA8993514D519552C968C96C94770477207DBF7DEC97629EB56EC50000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +59 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000851151A5540D547D660E669D69276E9F76BF7791831784C2879F91699298 +9CF488824FAE519252DF59C65E3D61556478647966AE67D06A216BCD6BDB725F +72617441773877DB801782BC83058B008B288C8C67286C90726776EE77667A46 +9DA96B7F6C92592267268499536F589359995EDF63CF663467736E3A732B7AD7 +82D7932852D95DEB61AE61CB620A62C764AB65E069596B666BCB712173F7755D +7E46821E8302856A8AA38CBF97279D6158A89ED85011520E543B554F65870000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +5A +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00006C767D0A7D0B805E868A958096EF52FF6C95726954735A9A5C3E5D4B5F4C +5FAE672A68B669636E3C6E4477097C737F8E85878B0E8FF797619EF45CB760B6 +610D61AB654F65FB65FC6C116CEF739F73C97DE195945BC6871C8B10525D535A +62CD640F64B267346A386CCA73C0749E7B947C957E1B818A823685848FEB96F9 +99C14F34534A53CD53DB62CC642C6500659169C36CEE6F5873ED7554762276E4 +76FC78D078FB792C7D46822C87E08FD4981298EF52C362D464A56E246F510000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +5B +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000767C8DCB91B192629AEE9B435023508D574A59A85C285E475F77623F653E +65B965C16609678B699C6EC278C57D2180AA8180822B82B384A1868C8A2A8B17 +90A696329F90500D4FF3F96357F95F9862DC6392676F6E43711976C380CC80DA +88F488F589198CE08F29914D966A4F2F4F705E1B67CF6822767D767E9B445E61 +6A0A716971D4756AF9647E41854385E998DC4F107B4F7F7095A551E15E0668B5 +6C3E6C4E6CDB72AF7BC483036CD5743A50FB528858C164D86A9774A776560000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +5C +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000078A7861795E29739F965535E5F018B8A8FA88FAF908A522577A59C499F08 +4E19500251755C5B5E77661E663A67C468C570B3750175C579C97ADD8F279920 +9A084FDD582158315BF6666E6B656D116E7A6F7D73E4752B83E988DC89138B5C +8F144F0F50D55310535C5B935FA9670D798F8179832F8514890789868F398F3B +99A59C12672C4E764FF859495C015CEF5CF0636768D270FD71A2742B7E2B84EC +8702902292D29CF34E0D4ED84FEF50855256526F5426549057E0592B5A660000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +5D +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00005B5A5B755BCC5E9CF9666276657765A76D6E6EA572367B267C3F7F368150 +8151819A8240829983A98A038CA08CE68CFB8D748DBA90E891DC961C964499D9 +9CE7531752065429567458B35954596E5FFF61A4626E66106C7E711A76C67C89 +7CDE7D1B82AC8CC196F0F9674F5B5F175F7F62C25D29670B68DA787C7E439D6C +4E1550995315532A535159835A625E8760B2618A624962796590678769A76BD4 +6BD66BD76BD86CB8F968743575FA7812789179D579D87C837DCB7FE180A50000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +5E +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000813E81C283F2871A88E88AB98B6C8CBB9119975E98DB9F3B56AC5B2A5F6C +658C6AB36BAF6D5C6FF17015725D73AD8CA78CD3983B61916C3780589A014E4D +4E8B4E9B4ED54F3A4F3C4F7F4FDF50FF53F253F8550655E356DB58EB59625A11 +5BEB5BFA5C045DF35E2B5F99601D6368659C65AF67F667FB68AD6B7B6C996CD7 +6E23700973457802793E7940796079C17BE97D177D728086820D838E84D186C7 +88DF8A508A5E8B1D8CDC8D668FAD90AA98FC99DF9E9D524AF9696714F96A0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +5F +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00005098522A5C7165636C5573CA7523759D7B97849C917897304E7764926BBA +715E85A94E09F96B674968EE6E17829F8518886B63F76F81921298AF4E0A50B7 +50CF511F554655AA56175B405C195CE05E385E8A5EA05EC260F368516A616E58 +723D724072C076F879657BB17FD488F389F48A738C618CDE971C585E74BD8CFD +55C7F96C7A617D2282727272751F7525F96D7B19588558FB5DBC5E8F5EB65F90 +60556292637F654D669166D966F8681668F27280745E7B6E7D6E7DD67F720000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +60 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000080E5821285AF897F8A93901D92E49ECD9F205915596D5E2D60DC66146673 +67906C506DC56F5F77F378A984C691CB932B4ED950CA514855845B0B5BA36247 +657E65CB6E32717D74017444748774BF766C79AA7DDA7E557FA8817A81B38239 +861A87EC8A758DE3907892919425994D9BAE53685C5169546CC46D296E2B820C +859B893B8A2D8AAA96EA9F67526166B96BB27E9687FE8D0D9583965D651D6D89 +71EEF96E57CE59D35BAC602760FA6210661F665F732973F976DB77017B6C0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +61 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00008056807281658AA091924E1652E26B726D177A057B397D30F96F8CB053EC +562F58515BB55C0F5C115DE2624063836414662D68B36CBC6D886EAF701F70A4 +71D27526758F758E76197B117BE07C2B7D207D39852C856D86078A34900D9061 +90B592B797F69A374FD75C6C675F6D917C9F7E8C8B168D16901F5B6B5DFD640D +84C0905C98E173875B8B609A677E6DDE8A1F8AA69001980C5237F9707051788E +9396887091D74FEE53D755FD56DA578258FD5AC25B885CAB5CC05E2561010000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +62 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000620D624B6388641C653665786A396B8A6C346D196F3171E772E973787407 +74B27626776179C07A577AEA7CB97D8F7DAC7E617F9E81298331849084DA85EA +88968AB08B908F3890429083916C929692B9968B96A796A896D6970098089996 +9AD39B1A53D4587E59195B705BBF6DD16F5A719F742174B9808583FD5DE15F87 +5FAA604265EC6812696F6A536B896D356DF373E376FE77AC7B4D7D148123821C +834084F485638A628AC49187931E980699B4620C88538FF092655D075D270000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +63 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00005D69745F819D87686FD562FE7FD2893689724E1E4E5850E752DD5347627F +66077E698805965E4F8D5319563659CB5AA45C385C4E5C4D5E025F11604365BD +662F664267BE67F4731C77E2793A7FC5849484CD89968A668A698AE18C558C7A +57F45BD45F0F606F62ED690D6B966E5C71847BD287558B588EFE98DF98FE4F38 +4F814FE1547B5A205BB8613C65B0666871FC7533795E7D33814E81E3839885AA +85CE87038A0A8EAB8F9BF9718FC559315BA45BE660895BE95C0B5FC36C810000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +64 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000F9726DF1700B751A82AF8AF64EC05341F97396D96C0F4E9E4FC45152555E +5A255CE86211725982BD83AA86FE88598A1D963F96C599139D099D5D580A5CB3 +5DBD5E4460E1611563E16A026E2591029354984E9C109F775B895CB86309664F +6848773C96C1978D98549B9F65A18B018ECB95BC55355CA95DD65EB56697764C +83F495C758D362BC72CE9D284EF0592E600F663B6B8379E79D26539354C057C3 +5D16611B66D66DAF788D827E969897445384627C63966DB27E0A814B984D0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +65 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00006AFB7F4C9DAF9E1A4E5F503B51B6591C60F963F66930723A8036F97491CE +5F31F975F9767D0482E5846F84BB85E58E8DF9774F6FF978F97958E45B436059 +63DA6518656D6698F97A694A6A236D0B7001716C75D2760D79B37A70F97B7F8A +F97C8944F97D8B9391C0967DF97E990A57045FA165BC6F01760079A68A9E99AD +9B5A9F6C510461B662916A8D81C6504358305F6671098A008AFA5B7C86164FFA +513C56B4594463A96DF95DAA696D51864E884F59F97FF980F9815982F9820000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +66 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000F9836B5F6C5DF98474B57916F9858207824583398F3F8F5DF9869918F987 +F988F9894EA6F98A57DF5F796613F98BF98C75AB7E798B6FF98D90069A5B56A5 +582759F85A1F5BB4F98E5EF6F98FF9906350633BF991693D6C876CBF6D8E6D93 +6DF56F14F99270DF71367159F99371C371D5F994784F786FF9957B757DE3F996 +7E2FF997884D8EDFF998F999F99A925BF99B9CF6F99CF99DF99E60856D85F99F +71B1F9A0F9A195B153ADF9A2F9A3F9A467D3F9A5708E71307430827682D20000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +67 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000F9A695BB9AE59E7D66C4F9A771C18449F9A8F9A9584BF9AAF9AB5DB85F71 +F9AC6620668E697969AE6C386CF36E366F416FDA701B702F715071DF7370F9AD +745BF9AE74D476C87A4E7E93F9AFF9B082F18A608FCEF9B19348F9B29719F9B3 +F9B44E42502AF9B5520853E166F36C6D6FCA730A777F7A6282AE85DD8602F9B6 +88D48A638B7D8C6BF9B792B3F9B8971398104E944F0D4FC950B25348543E5433 +55DA586258BA59675A1B5BE4609FF9B961CA655665FF666468A76C5A6FB30000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +68 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000070CF71AC73527B7D87088AA49C329F075C4B6C8373447389923A6EAB7465 +761F7A697E15860A514058C564C174EE751576707FC1909596CD99546E2674E6 +7AA97AAA81E586D987788A1B5A495B8C5B9B68A169006D6373A97413742C7897 +7DE97FEB81188155839E8C4C962E981166F05F8065FA67896C6A738B502D5A03 +6B6A77EE59165D6C5DCD7325754FF9BAF9BB50E551F9582F592D599659DA5BE5 +F9BCF9BD5DA262D76416649364FEF9BE66DCF9BF6A48F9C071FF7464F9C10000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +69 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00007A887AAF7E477E5E80008170F9C287EF89818B209059F9C390809952617E +6B326D747E1F89258FB14FD150AD519752C757C758895BB95EB8614269956D8C +6E676EB6719474627528752C8073833884C98E0A939493DEF9C44E8E4F515076 +512A53C853CB53F35B875BD35C24611A618265F4725B7397744076C279507991 +79B97D067FBD828B85D5865E8FC2904790F591EA968596E896E952D65F6765ED +6631682F715C7A3690C1980A4E91F9C56A526B9E6F907189801882B885530000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +6A +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000904B969596F297FB851A9B314E90718A96C45143539F54E15713571257A3 +5A9B5AC45BC36028613F63F46C856D396E726E907230733F745782D188818F45 +9060F9C6966298589D1B67088D8A925E4F4D504950DE5371570D59D45A015C09 +617066906E2D7232744B7DEF80C3840E8466853F875F885B89188B02905597CB +9B4F4E734F915112516AF9C7552F55A95B7A5BA55E7C5E7D5EBE60A060DF6108 +610963C465386709F9C867D467DAF9C9696169626CB96D27F9CA6E38F9CB0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +6B +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00006FE173367337F9CC745C7531F9CD7652F9CEF9CF7DAD81FE843888D58A98 +8ADB8AED8E308E42904A903E907A914991C9936EF9D0F9D15809F9D26BD38089 +80B2F9D3F9D45141596B5C39F9D5F9D66F6473A780E48D07F9D79217958FF9D8 +F9D9F9DAF9DB807F620E701C7D68878DF9DC57A0606961476BB78ABE928096B1 +4E59541F6DEB852D967097F398EE63D66CE3909151DD61C981BA9DF94F9D501A +51005B9C610F61FF64EC69056BC5759177E37FA98264858F87FB88638ABC0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +6C +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00008B7091AB4E8C4EE54F0AF9DDF9DE593759E8F9DF5DF25F1B5F5B6021F9E0 +F9E1F9E2F9E3723E73E5F9E4757075CDF9E579FBF9E6800C8033808482E18351 +F9E7F9E88CBD8CB39087F9E9F9EA98F4990CF9EBF9EC703776CA7FCA7FCC7FFC +8B1A4EBA4EC152035370F9ED54BD56E059FB5BC55F155FCD6E6EF9EEF9EF7D6A +8335F9F086938A8DF9F1976D9777F9F2F9F34E004F5A4F7E58F965E56EA29038 +93B099B94EFB58EC598A59D96041F9F4F9F57A14F9F6834F8CC3516553440000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +6D +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000F9F7F9F8F9F94ECD52695B5582BF4ED4523A54A859C959FF5B505B575B5C +606361486ECB7099716E738674F775B578C17D2B800581EA8328851785C98AEE +8CC796CC4F5C52FA56BC65AB6628707C70B872357DBD828D914C96C09D725B71 +68E76B986F7A76DE5C9166AB6F5B7BB47C2A883696DC4E084ED75320583458BB +58EF596C5C075E335E845F35638C66B267566A1F6AA36B0C6F3F7246F9FA7350 +748B7AE07CA7817881DF81E7838A846C8523859485CF88DD8D1391AC95770000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +6E +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000969C518D54C957285BB0624D6750683D68936E3D6ED3707D7E2188C18CA1 +8F099F4B9F4E722D7B8F8ACD931A4F474F4E5132548059D05E9562B56775696E +6A176CAE6E1A72D9732A75BD7BB87D3582E783F9845785F78A5B8CAF8E879019 +90B896CE9F5F52E3540A5AE15BC2645865756EF472C4F9FB76847A4D7B1B7C4D +7E3E7FDF837B8B2B8CCA8D648DE18E5F8FEA8FF9906993D14F434F7A50B35168 +5178524D526A5861587C59605C085C555EDB609B623068136BBF6C086FB10000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +6F +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000714E742075307538755176727B4C7B8B7BAD7BC67E8F8A6E8F3E8F49923F +92939322942B96FB985A986B991E5207622A62986D5976647ACA7BC07D765360 +5CBE5E976F3870B97C9897119B8E9EDE63A5647A87764E014E954EAD505C5075 +544859C35B9A5E405EAD5EF75F8160C5633A653F657465CC6676667867FE6968 +6A896B636C406DC06DE86E1F6E5E701E70A1738E73FD753A775B7887798E7A0B +7A7D7CBE7D8E82478A028AEA8C9E912D914A91D8926692CC9320970697560000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +70 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000975C98029F0E52365291557C58245E1D5F1F608C63D068AF6FDF796D7B2C +81CD85BA88FD8AF88E44918D9664969B973D984C9F4A4FCE514651CB52A95632 +5F145F6B63AA64CD65E9664166FA66F9671D689D68D769FD6F156F6E716771E5 +722A74AA773A7956795A79DF7A207A957C977CDF7D447E70808785FB86A48A54 +8ABF8D998E819020906D91E3963B96D59CE565CF7C078DB393C35B585C0A5352 +62D9731D50275B975F9E60B0616B68D56DD9742E7A2E7D427D9C7E31816B0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +71 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00008E2A8E35937E94184F5057505DE65EA7632B7F6A4E3B4F4F4F8F505A59DD +80C4546A546855FE594F5B995DDE5EDA665D673167F1682A6CE86D326E4A6F8D +70B773E075877C4C7D027D2C7DA2821F86DB8A3B8A858D708E8A8F339031914E +9152944499D07AF97CA54FCA510151C657C85BEF5CFB66596A3D6D5A6E966FEC +710C756F7AE388229021907596CB99FF83014E2D4EF2884691CD537D6ADB696B +6C41847A589E618E66FE62EF70DD751175C77E5284B88B498D084E4B53EA0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +72 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000054AB573057405FD763016307646F652F65E8667A679D67B36B626C606C9A +6F2C77E57825794979577D1980A2810281F3829D82B787188A8CF9FC8D048DBE +907276F47A197A377E548077550755D45875632F64226649664B686D699B6B84 +6D256EB173CD746874A1755B75B976E1771E778B79E67E097E1D81FB852F8897 +8A3A8CD18EEB8FB0903293AD9663967397074F8453F159EA5AC95E19684E74C6 +75BE79E97A9281A386ED8CEA8DCC8FED659F6715F9FD57F76F577DDD8F2F0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +73 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000093F696C65FB561F26F844E144F98501F53C955DF5D6F5DEE6B216B6478CB +7B9AF9FE8E498ECA906E6349643E77407A84932F947F9F6A64B06FAF71E674A8 +74DA7AC47C127E827CB27E988B9A8D0A947D9910994C52395BDF64E6672D7D2E +50ED53C358796158615961FA65AC7AD98B928B9650095021527555315A3C5EE0 +5F706134655E660C663666A269CD6EC46F32731676217A938139825983D684BC +50B557F05BC05BE85F6963A178267DB583DC852191C791F5518A67F57B560000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +74 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00008CAC51C459BB60BD8655501CF9FF52545C3A617D621A62D364F265A56ECC +7620810A8E60965F96BB4EDF5343559859295DDD64C56CC96DFA73947A7F821B +85A68CE48E10907791E795E1962197C651F854F255865FB964A46F887DB48F1F +8F4D943550C95C166CBE6DFB751B77BB7C3D7C648A798AC2581E59BE5E166377 +7252758A776B8ADC8CBC8F125EF366746DF8807D83C18ACB97519BD6FA005243 +66FF6D956EEF7DE08AE6902E905E9AD4521D527F54E86194628462DB68A20000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +75 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00006912695A6A3570927126785D7901790E79D27A0D8096827882D583498549 +8C828D859162918B91AE4FC356D171ED77D7870089F85BF85FD6675190A853E2 +585A5BF560A4618164607E3D80708525928364AE50AC5D146700589C62BD63A8 +690E69786A1E6E6B76BA79CB82BB84298ACF8DA88FFD9112914B919C93109318 +939A96DB9A369C0D4E11755C795D7AFA7B517BC97E2E84C48E598E748EF89010 +6625693F744351FA672E9EDC51455FE06C9687F2885D887760B481B584030000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +76 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00008D0553D6543956345A365C31708A7FE0805A810681ED8DA391899A5F9DF2 +50744EC453A060FB6E2C5C644F88502455E45CD95E5F606568946CBB6DC471BE +75D475F476617A1A7A497DC77DFB7F6E81F486A98F1C96C999B39F52524752C5 +98ED89AA4E0367D26F064FB55BE267956C886D78741B782791DD937C87C479E4 +7A315FEB4ED654A4553E58AE59A560F0625362D6673669558235964099B199DD +502C53535544577CFA016258FA0264E2666B67DD6FC16FEF742274388A170000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +77 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000094385451560657665F48619A6B4E705870AD7DBB8A95596A812B63A27708 +803D8CAA5854642D69BB5B955E116E6FFA038569514C53F0592A6020614B6B86 +6C706CF07B1E80CE82D48DC690B098B1FA0464C76FA464916504514E5410571F +8A0E615F6876FA0575DB7B527D71901A580669CC817F892A9000983950785957 +59AC6295900F9B2A615D727995D657615A465DF4628A64AD64FA67776CE26D3E +722C743678347F7782AD8DDB981752245742677F724874E38CA98FA692110000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +78 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000962A516B53ED634C4F695504609665576C9B6D7F724C72FD7A1789878C9D +5F6D6F8E70F981A8610E4FBF504F624172477BC77DE87FE9904D97AD9A198CB6 +576A5E7367B0840D8A5554205B165E635EE25F0A658380BA853D9589965B4F48 +5305530D530F548654FA57035E036016629B62B16355FA066CE16D6675B17832 +80DE812F82DE846184B2888D8912900B92EA98FD9B915E4566B466DD70117206 +FA074FF5527D5F6A615367536A196F0274E2796888688C7998C798C49A430000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +79 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000054C17A1F69538AF78C4A98A899AE5F7C62AB75B276AE88AB907F96425339 +5F3C5FC56CCC73CC7562758B7B4682FE999D4E4F903C4E0B4F5553A6590F5EC8 +66306CB37455837787668CC09050971E9C1558D15B7886508B149DB45BD26068 +608D65F16C576F226FA3701A7F557FF095919592965097D352728F4451FD542B +54B85563558A6ABB6DB57DD88266929C96779E79540854C876D286E495A495D4 +965C4EA24F0959EE5AE65DF760526297676D68416C866E2F7F38809B822A0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +7A +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000FA08FA0998054EA5505554B35793595A5B695BB361C869776D77702387F9 +89E38A728AE7908299ED9AB852BE683850165E78674F8347884C4EAB541156AE +73E6911597FF9909995799995653589F865B8A3161B26AF6737B8ED26B4796AA +9A57595572008D6B97694FD45CF45F2661F8665B6CEB70AB738473B973FE7729 +774D7D437D627E2382378852FA0A8CE29249986F5B517A74884098015ACC4FE0 +5354593E5CFD633E6D7972F98105810783A292CF98304EA851445211578B0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +7B +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00005F626CC26ECE7005705070AF719273E97469834A87A28861900890A293A3 +99A8516E5F5760E0616766B385598E4A91AF978B4E4E4E92547C58D558FA597D +5CB55F2762366248660A66676BEB6D696DCF6E566EF86F946FE06FE9705D72D0 +7425745A74E07693795C7CCA7E1E80E182A6846B84BF864E865F87748B778C6A +93AC9800986560D1621691775A5A660F6DF76E3E743F9B425FFD60DA7B0F54C4 +5F186C5E6CD36D2A70D87D0586798A0C9D3B5316548C5B056A3A706B75750000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +7C +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000798D79BE82B183EF8A718B418CA89774FA0B64F4652B78BA78BB7A6B4E38 +559A59505BA65E7B60A363DB6B61666568536E19716574B07D0890849A699C25 +6D3B6ED1733E8C4195CA51F05E4C5FA8604D60F66130614C6643664469A56CC1 +6E5F6EC96F62714C749C76877BC17C27835287579051968D9EC3532F56DE5EFB +5F8A6062609461F7666667036A9C6DEE6FAE7070736A7E6A81BE833486D48AA8 +8CC4528373725B966A6B940454EE56865B5D6548658566C9689F6D8D6DC60000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +7D +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000723B80B491759A4D4FAF5019539A540E543C558955C55E3F5F8C673D7166 +73DD900552DB52F3586458CE7104718F71FB85B08A13668885A855A76684714A +8431534955996BC15F595FBD63EE668971478AF18F1D9EBE4F11643A70CB7566 +866760648B4E9DF8514751F653086D3680F89ED166156B23709875D554035C79 +7D078A166B206B3D6B46543860706D3D7FD5820850D651DE559C566B56CD59EC +5B095E0C619961986231665E66E6719971B971BA72A779A77A007FB28A700000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 diff --git a/env/tcl/tcl8.6/encoding/macCentEuro.enc b/env/tcl/tcl8.6/encoding/macCentEuro.enc new file mode 100644 index 0000000..dde616a --- /dev/null +++ b/env/tcl/tcl8.6/encoding/macCentEuro.enc @@ -0,0 +1,20 @@ +# Encoding file: macCentEuro, single-byte +S +003F 0 1 +00 +0000000100020003000400050006000700080009000A000B000C000D000E000F +0010001100120013001400150016001700180019001A001B001C001D001E001F +0020002100220023002400250026002700280029002A002B002C002D002E002F +0030003100320033003400350036003700380039003A003B003C003D003E003F +0040004100420043004400450046004700480049004A004B004C004D004E004F +0050005100520053005400550056005700580059005A005B005C005D005E005F +0060006100620063006400650066006700680069006A006B006C006D006E006F +0070007100720073007400750076007700780079007A007B007C007D007E007F +00C40100010100C9010400D600DC00E10105010C00E4010D0106010700E90179 +017A010E00ED010F01120113011600F3011700F400F600F500FA011A011B00FC +202000B0011800A300A7202200B600DF00AE00A92122011900A822600123012E +012F012A22642265012B0136220222110142013B013C013D013E0139013A0145 +0146014300AC221A01440147220600AB00BB202600A00148015000D50151014C +20132014201C201D2018201900F725CA014D0154015501582039203A01590156 +01570160201A201E0161015A015B00C10164016500CD017D017E016A00D300D4 +016B016E00DA016F017001710172017300DD00FD0137017B0141017C012202C7 diff --git a/env/tcl/tcl8.6/encoding/macCroatian.enc b/env/tcl/tcl8.6/encoding/macCroatian.enc new file mode 100644 index 0000000..c23d0f0 --- /dev/null +++ b/env/tcl/tcl8.6/encoding/macCroatian.enc @@ -0,0 +1,20 @@ +# Encoding file: macCroatian, single-byte +S +003F 0 1 +00 +0000000100020003000400050006000700080009000A000B000C000D000E000F +0010001100120013001400150016001700180019001A001B001C001D001E001F +0020002100220023002400250026002700280029002A002B002C002D002E002F +0030003100320033003400350036003700380039003A003B003C003D003E003F +0040004100420043004400450046004700480049004A004B004C004D004E004F +0050005100520053005400550056005700580059005A005B005C005D005E005F +0060006100620063006400650066006700680069006A006B006C006D006E006F +0070007100720073007400750076007700780079007A007B007C007D007E007F +00C400C500C700C900D100D600DC00E100E000E200E400E300E500E700E900E8 +00EA00EB00ED00EC00EE00EF00F100F300F200F400F600F500FA00F900FB00FC +202000B000A200A300A7202200B600DF00AE0160212200B400A82260017D00D8 +221E00B122642265220600B522022211220F0161222B00AA00BA03A9017E00F8 +00BF00A100AC221A01922248010600AB010C202600A000C000C300D501520153 +01102014201C201D2018201900F725CAF8FF00A9204420AC2039203A00C600BB +201300B7201A201E203000C2010700C1010D00C800CD00CE00CF00CC00D300D4 +011100D200DA00DB00D9013102C602DC00AF03C000CB02DA00B800CA00E602C7 diff --git a/env/tcl/tcl8.6/encoding/macCyrillic.enc b/env/tcl/tcl8.6/encoding/macCyrillic.enc new file mode 100644 index 0000000..e657739 --- /dev/null +++ b/env/tcl/tcl8.6/encoding/macCyrillic.enc @@ -0,0 +1,20 @@ +# Encoding file: macCyrillic, single-byte +S +003F 0 1 +00 +0000000100020003000400050006000700080009000A000B000C000D000E000F +0010001100120013001400150016001700180019001A001B001C001D001E001F +0020002100220023002400250026002700280029002A002B002C002D002E002F +0030003100320033003400350036003700380039003A003B003C003D003E003F +0040004100420043004400450046004700480049004A004B004C004D004E004F +0050005100520053005400550056005700580059005A005B005C005D005E005F +0060006100620063006400650066006700680069006A006B006C006D006E006F +0070007100720073007400750076007700780079007A007B007C007D007E007F +0410041104120413041404150416041704180419041A041B041C041D041E041F +0420042104220423042404250426042704280429042A042B042C042D042E042F +202000B0049000A300A7202200B6040600AE00A9212204020452226004030453 +221E00B122642265045600B504910408040404540407045704090459040A045A +0458040500AC221A01922248220600AB00BB202600A0040B045B040C045C0455 +20132014201C201D2018201900F7201E040E045E040F045F211604010451044F +0430043104320433043404350436043704380439043A043B043C043D043E043F +0440044104420443044404450446044704480449044A044B044C044D044E20AC diff --git a/env/tcl/tcl8.6/encoding/macDingbats.enc b/env/tcl/tcl8.6/encoding/macDingbats.enc new file mode 100644 index 0000000..28449cd --- /dev/null +++ b/env/tcl/tcl8.6/encoding/macDingbats.enc @@ -0,0 +1,20 @@ +# Encoding file: macDingbats, single-byte +S +003F 1 1 +00 +0000000100020003000400050006000700080009000A000B000C000D000E000F +0010001100120013001400150016001700180019001A001B001C001D001E001F +00202701270227032704260E2706270727082709261B261E270C270D270E270F +2710271127122713271427152716271727182719271A271B271C271D271E271F +2720272127222723272427252726272726052729272A272B272C272D272E272F +2730273127322733273427352736273727382739273A273B273C273D273E273F +2740274127422743274427452746274727482749274A274B25CF274D25A0274F +27502751275225B225BC25C6275625D727582759275A275B275C275D275E007F +F8D7F8D8F8D9F8DAF8DBF8DCF8DDF8DEF8DFF8E0F8E1F8E2F8E3F8E4008E008F +0090009100920093009400950096009700980099009A009B009C009D009E009F +0000276127622763276427652766276726632666266526602460246124622463 +2464246524662467246824692776277727782779277A277B277C277D277E277F +2780278127822783278427852786278727882789278A278B278C278D278E278F +2790279127922793279421922194219527982799279A279B279C279D279E279F +27A027A127A227A327A427A527A627A727A827A927AA27AB27AC27AD27AE27AF +000027B127B227B327B427B527B627B727B827B927BA27BB27BC27BD27BE0000 diff --git a/env/tcl/tcl8.6/encoding/macGreek.enc b/env/tcl/tcl8.6/encoding/macGreek.enc new file mode 100644 index 0000000..67b9953 --- /dev/null +++ b/env/tcl/tcl8.6/encoding/macGreek.enc @@ -0,0 +1,20 @@ +# Encoding file: macGreek, single-byte +S +003F 0 1 +00 +0000000100020003000400050006000700080009000A000B000C000D000E000F +0010001100120013001400150016001700180019001A001B001C001D001E001F +0020002100220023002400250026002700280029002A002B002C002D002E002F +0030003100320033003400350036003700380039003A003B003C003D003E003F +0040004100420043004400450046004700480049004A004B004C004D004E004F +0050005100520053005400550056005700580059005A005B005C005D005E005F +0060006100620063006400650066006700680069006A006B006C006D006E006F +0070007100720073007400750076007700780079007A007B007C007D007E007F +00C400B900B200C900B300D600DC038500E000E200E4038400A800E700E900E8 +00EA00EB00A3212200EE00EF202200BD203000F400F600A600AD00F900FB00FC +2020039303940398039B039E03A000DF00AE00A903A303AA00A7226000B000B7 +039100B12264226500A503920395039603970399039A039C03A603AB03A803A9 +03AC039D00AC039F03A1224803A400AB00BB202600A003A503A7038603880153 +20132015201C201D2018201900F70389038A038C038E03AD03AE03AF03CC038F +03CD03B103B203C803B403B503C603B303B703B903BE03BA03BB03BC03BD03BF +03C003CE03C103C303C403B803C903C203C703C503B603CA03CB039003B0F8A0 diff --git a/env/tcl/tcl8.6/encoding/macIceland.enc b/env/tcl/tcl8.6/encoding/macIceland.enc new file mode 100644 index 0000000..c636069 --- /dev/null +++ b/env/tcl/tcl8.6/encoding/macIceland.enc @@ -0,0 +1,20 @@ +# Encoding file: macIceland, single-byte +S +003F 0 1 +00 +0000000100020003000400050006000700080009000A000B000C000D000E000F +0010001100120013001400150016001700180019001A001B001C001D001E001F +0020002100220023002400250026002700280029002A002B002C002D002E002F +0030003100320033003400350036003700380039003A003B003C003D003E003F +0040004100420043004400450046004700480049004A004B004C004D004E004F +0050005100520053005400550056005700580059005A005B005C005D005E005F +0060006100620063006400650066006700680069006A006B006C006D006E006F +0070007100720073007400750076007700780079007A007B007C007D007E007F +00C400C500C700C900D100D600DC00E100E000E200E400E300E500E700E900E8 +00EA00EB00ED00EC00EE00EF00F100F300F200F400F600F500FA00F900FB00FC +00DD00B000A200A300A7202200B600DF00AE00A9212200B400A8226000C600D8 +221E00B12264226500A500B522022211220F03C0222B00AA00BA03A900E600F8 +00BF00A100AC221A01922248220600AB00BB202600A000C000C300D501520153 +20132014201C201D2018201900F725CA00FF0178204420AC00D000F000DE00FE +00FD00B7201A201E203000C200CA00C100CB00C800CD00CE00CF00CC00D300D4 +F8FF00D200DA00DB00D9013102C602DC00AF02D802D902DA00B802DD02DB02C7 diff --git a/env/tcl/tcl8.6/encoding/macJapan.enc b/env/tcl/tcl8.6/encoding/macJapan.enc new file mode 100644 index 0000000..dba24bd --- /dev/null +++ b/env/tcl/tcl8.6/encoding/macJapan.enc @@ -0,0 +1,785 @@ +# Encoding file: macJapan, multi-byte +M +003F 0 46 +00 +0000000100020003000400050006000700080009000A000B000C000D000E000F +0010001100120013001400150016001700180019001A001B001C001D001E001F +0020002100220023002400250026002700280029002A002B002C002D002E002F +0030003100320033003400350036003700380039003A003B003C003D003E003F +0040004100420043004400450046004700480049004A004B004C004D004E004F +0050005100520053005400550056005700580059005A005B005C005D005E005F +0060006100620063006400650066006700680069006A006B006C006D006E006F +0070007100720073007400750076007700780079007A007B007C007D007E007F +0080000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00A0FF61FF62FF63FF64FF65FF66FF67FF68FF69FF6AFF6BFF6CFF6DFF6EFF6F +FF70FF71FF72FF73FF74FF75FF76FF77FF78FF79FF7AFF7BFF7CFF7DFF7EFF7F +FF80FF81FF82FF83FF84FF85FF86FF87FF88FF89FF8AFF8BFF8CFF8DFF8EFF8F +FF90FF91FF92FF93FF94FF95FF96FF97FF98FF99FF9AFF9BFF9CFF9DFF9EFF9F +0000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000A921222026 +81 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +300030013002FF0CFF0E30FBFF1AFF1BFF1FFF01309B309C00B4FF4000A8FF3E +203EFF3F30FD30FE309D309E30034EDD30053006300730FC20142010FF0FFF3C +301C2016FF5C22EF202520182019201C201DFF08FF0930143015FF3BFF3DFF5B +FF5D30083009300A300B300C300D300E300F30103011FF0B221200B100D70000 +00F7FF1D2260FF1CFF1E22662267221E22342642264000B0203220332103FFE5 +FF0400A200A3FF05FF03FF06FF0AFF2000A72606260525CB25CF25CE25C725C6 +25A125A025B325B225BD25BC203B301221922190219121933013000000000000 +000000000000000000000000000000002208220B2286228722822283222A2229 +000000000000000000000000000000002227222800AC21D221D4220022030000 +0000000000000000000000000000000000000000222022A52312220222072261 +2252226A226B221A223D221D2235222B222C0000000000000000000000000000 +212B2030266F266D266A2020202100B6000000000000000025EF000000000000 +82 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000FF10 +FF11FF12FF13FF14FF15FF16FF17FF18FF190000000000000000000000000000 +FF21FF22FF23FF24FF25FF26FF27FF28FF29FF2AFF2BFF2CFF2DFF2EFF2FFF30 +FF31FF32FF33FF34FF35FF36FF37FF38FF39FF3A000000000000000000000000 +0000FF41FF42FF43FF44FF45FF46FF47FF48FF49FF4AFF4BFF4CFF4DFF4EFF4F +FF50FF51FF52FF53FF54FF55FF56FF57FF58FF59FF5A00000000000000003041 +30423043304430453046304730483049304A304B304C304D304E304F30503051 +30523053305430553056305730583059305A305B305C305D305E305F30603061 +30623063306430653066306730683069306A306B306C306D306E306F30703071 +30723073307430753076307730783079307A307B307C307D307E307F30803081 +30823083308430853086308730883089308A308B308C308D308E308F30903091 +3092309300000000000000000000000000000000000000000000000000000000 +83 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +30A130A230A330A430A530A630A730A830A930AA30AB30AC30AD30AE30AF30B0 +30B130B230B330B430B530B630B730B830B930BA30BB30BC30BD30BE30BF30C0 +30C130C230C330C430C530C630C730C830C930CA30CB30CC30CD30CE30CF30D0 +30D130D230D330D430D530D630D730D830D930DA30DB30DC30DD30DE30DF0000 +30E030E130E230E330E430E530E630E730E830E930EA30EB30EC30ED30EE30EF +30F030F130F230F330F430F530F6000000000000000000000000000000000391 +03920393039403950396039703980399039A039B039C039D039E039F03A003A1 +03A303A403A503A603A703A803A90000000000000000000000000000000003B1 +03B203B303B403B503B603B703B803B903BA03BB03BC03BD03BE03BF03C003C1 +03C303C403C503C603C703C803C9000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +84 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +04100411041204130414041504010416041704180419041A041B041C041D041E +041F0420042104220423042404250426042704280429042A042B042C042D042E +042F000000000000000000000000000000000000000000000000000000000000 +04300431043204330434043504510436043704380439043A043B043C043D0000 +043E043F0440044104420443044404450446044704480449044A044B044C044D +044E044F00000000000000000000000000000000000000000000000000002500 +2502250C251025182514251C252C25242534253C25012503250F2513251B2517 +25232533252B253B254B2520252F25282537253F251D25302525253825420000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +85 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +2460246124622463246424652466246724682469246A246B246C246D246E246F +2470247124722473000000000000000000000000000000000000000024742475 +2476247724782479247A247B247C247D247E247F248024812482248324842485 +2486248700000000000000000000000000000000000000002776277727780000 +2779277A277B277C277D277E0000000000000000000000000000000000000000 +0000F8A124882489248A248B248C248D248E248F249000000000000000002160 +216121622163216421652166216721682169216A216BF8A2F8A3F8A400000000 +0000000000002170217121722173217421752176217721782179217A217BF8A5 +F8A6F8A700000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000249C249D249E249F24A0 +24A124A224A324A424A524A624A724A824A924AA24AB24AC24AD24AE24AF24B0 +24B124B224B324B424B500000000000000000000000000000000000000000000 +86 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +339C339F339D33A033A4F8A833A133A5339E33A2338EF8A9338F33C433963397 +F8AA339833B333B233B133B0210933D433CB3390338533863387F8AB00000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000211633CD2121F8AC2664 +2667266126622660266326652666000000000000000000000000000000000000 +0000000000003020260E30040000000000000000000000000000000000000000 +0000000000000000000000000000261E261C261D261F21C621C421C5F8AD21E8 +21E621E721E9F8AEF8AFF8B0F8B1000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +87 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +3230322A322B322C322D322E322F32403237324232433239323A3231323E3234 +3232323B323632333235323C323D323F32380000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000059275C0F32A432A532A632A732A832A93296329D3298329E63A732993349 +3322334D3314331633053333334E330333363318331533273351334A33393357 +330D334233233326333B332B00000000000000000000000000003300331E332A +3331334700000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000337E337D337C337B0000000000000000000000000000 +0000000000000000000000000000000000000000337FF8B2F8B3000000000000 +88 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +222E221F22BF0000000000000000000000000000000000000000000000000000 +0000000000000000301DF8B40000000000000000000000000000000000000000 +000000000000000000000000000000003094000030F730F830F930FA00000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000004E9C +55165A03963F54C0611B632859F690228475831C7A5060AA63E16E2565ED8466 +82A69BF56893572765A162715B9B59D0867B98F47D627DBE9B8E62167C9F88B7 +5B895EB563096697684895C7978D674F4EE54F0A4F4D4F9D504956F2593759D4 +5A015C0960DF610F61706613690570BA754F757079FB7DAD7DEF80C3840E8863 +8B029055907A533B4E954EA557DF80B290C178EF4E0058F16EA290387A328328 +828B9C2F5141537054BD54E156E059FB5F1598F26DEB80E4852D000000000000 +89 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +9662967096A097FB540B53F35B8770CF7FBD8FC296E8536F9D5C7ABA4E117893 +81FC6E26561855046B1D851A9C3B59E553A96D6674DC958F56424E91904B96F2 +834F990C53E155B65B305F71662066F368046C386CF36D29745B76C87A4E9834 +82F1885B8A6092ED6DB275AB76CA99C560A68B018D8A95B2698E53AD51860000 +5712583059445BB45EF6602863A963F46CBF6F14708E7114715971D5733F7E01 +827682D185979060925B9D1B586965BC6C5A752551F9592E59655F805FDC62BC +65FA6A2A6B276BB4738B7FC189569D2C9D0E9EC45CA16C96837B51045C4B61B6 +81C6687672614E594FFA537860696E297A4F97F34E0B53164EEE4F554F3D4FA1 +4F7352A053EF5609590F5AC15BB65BE179D16687679C67B66B4C6CB3706B73C2 +798D79BE7A3C7B8782B182DB8304837783EF83D387668AB256298CA88FE6904E +971E868A4FC45CE862117259753B81E582BD86FE8CC096C5991399D54ECB4F1A +89E356DE584A58CA5EFB5FEB602A6094606261D0621262D06539000000000000 +8A +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +9B41666668B06D777070754C76867D7582A587F9958B968E8C9D51F152BE5916 +54B35BB35D16616869826DAF788D84CB88578A7293A79AB86D6C99A886D957A3 +67FF86CE920E5283568754045ED362E164B9683C68386BBB737278BA7A6B899A +89D28D6B8F0390ED95A3969497695B665CB3697D984D984E639B7B206A2B0000 +6A7F68B69C0D6F5F5272559D607062EC6D3B6E076ED1845B89108F444E149C39 +53F6691B6A3A9784682A515C7AC384B291DC938C565B9D286822830584317CA5 +520882C574E64E7E4F8351A05BD2520A52D852E75DFB559A582A59E65B8C5B98 +5BDB5E725E7960A3611F616361BE63DB656267D1685368FA6B3E6B536C576F22 +6F976F4574B0751876E3770B7AFF7BA17C217DE97F367FF0809D8266839E89B3 +8ACC8CAB908494519593959195A2966597D3992882184E38542B5CB85DCC73A9 +764C773C5CA97FEB8D0B96C19811985498584F014F0E5371559C566857FA5947 +5B095BC45C905E0C5E7E5FCC63EE673A65D765E2671F68CB68C4000000000000 +8B +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +6A5F5E306BC56C176C7D757F79485B637A007D005FBD898F8A188CB48D778ECC +8F1D98E29A0E9B3C4E80507D510059935B9C622F628064EC6B3A72A075917947 +7FA987FB8ABC8B7063AC83CA97A05409540355AB68546A588A70782767759ECD +53745BA2811A865090064E184E454EC74F1153CA54385BAE5F13602565510000 +673D6C426C726CE3707874037A767AAE7B087D1A7CFE7D6665E7725B53BB5C45 +5DE862D262E063196E20865A8A318DDD92F86F0179A69B5A4EA84EAB4EAC4F9B +4FA050D151477AF6517151F653545321537F53EB55AC58835CE15F375F4A602F +6050606D631F65596A4B6CC172C272ED77EF80F881058208854E90F793E197FF +99579A5A4EF051DD5C2D6681696D5C4066F26975738968507C8150C552E45747 +5DFE932665A46B236B3D7434798179BD7B4B7DCA82B983CC887F895F8B398FD1 +91D1541F92804E5D503653E5533A72D7739677E982E68EAF99C699C899D25177 +611A865E55B07A7A50765BD3904796854E326ADB91E75C515C48000000000000 +8C +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +63987A9F6C9397748F617AAA718A96887C8268177E706851936C52F2541B85AB +8A137FA48ECD90E15366888879414FC250BE521151445553572D73EA578B5951 +5F625F8460756176616761A963B2643A656C666F68426E1375667A3D7CFB7D4C +7D997E4B7F6B830E834A86CD8A088A638B668EFD981A9D8F82B88FCE9BE80000 +5287621F64836FC09699684150916B206C7A6F547A747D5088408A2367084EF6 +503950265065517C5238526355A7570F58055ACC5EFA61B261F862F36372691C +6A29727D72AC732E7814786F7D79770C80A9898B8B198CE28ED290639375967A +98559A139E785143539F53B35E7B5F266E1B6E90738473FE7D4382378A008AFA +96504E4E500B53E4547C56FA59D15B645DF15EAB5F276238654567AF6E5672D0 +7CCA88B480A180E183F0864E8A878DE8923796C798679F134E944E924F0D5348 +5449543E5A2F5F8C5FA1609F68A76A8E745A78818A9E8AA48B7791904E5E9BC9 +4EA44F7C4FAF501950165149516C529F52B952FE539A53E35411000000000000 +8D +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +540E5589575157A2597D5B545B5D5B8F5DE55DE75DF75E785E835E9A5EB75F18 +6052614C629762D863A7653B6602664366F4676D6821689769CB6C5F6D2A6D69 +6E2F6E9D75327687786C7A3F7CE07D057D187D5E7DB18015800380AF80B18154 +818F822A8352884C88618B1B8CA28CFC90CA91759271783F92FC95A4964D0000 +980599999AD89D3B525B52AB53F7540858D562F76FE08C6A8F5F9EB9514B523B +544A56FD7A4091779D609ED273446F09817075115FFD60DA9AA872DB8FBC6B64 +98034ECA56F0576458BE5A5A606861C7660F6606683968B16DF775D57D3A826E +9B424E9B4F5053C955065D6F5DE65DEE67FB6C99747378028A50939688DF5750 +5EA7632B50B550AC518D670054C9585E59BB5BB05F69624D63A1683D6B736E08 +707D91C7728078157826796D658E7D3083DC88C18F09969B5264572867507F6A +8CA151B45742962A583A698A80B454B25D0E57FC78959DFA4F5C524A548B643E +6628671467F57A847B567D22932F685C9BAD7B395319518A5237000000000000 +8E +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +5BDF62F664AE64E6672D6BBA85A996D176909BD6634C93069BAB76BF66524E09 +509853C25C7160E864926563685F71E673CA75237B977E8286958B838CDB9178 +991065AC66AB6B8B4ED54ED44F3A4F7F523A53F853F255E356DB58EB59CB59C9 +59FF5B505C4D5E025E2B5FD7601D6307652F5B5C65AF65BD65E8679D6B620000 +6B7B6C0F7345794979C17CF87D197D2B80A2810281F389968A5E8A698A668A8C +8AEE8CC78CDC96CC98FC6B6F4E8B4F3C4F8D51505B575BFA6148630166426B21 +6ECB6CBB723E74BD75D478C1793A800C803381EA84948F9E6C509E7F5F0F8B58 +9D2B7AFA8EF85B8D96EB4E0353F157F759315AC95BA460896E7F6F0675BE8CEA +5B9F85007BE0507267F4829D5C61854A7E1E820E51995C0463688D66659C716E +793E7D1780058B1D8ECA906E86C790AA501F52FA5C3A6753707C7235914C91C8 +932B82E55BC25F3160F94E3B53D65B88624B67316B8A72E973E07A2E816B8DA3 +91529996511253D7546A5BFF63886A397DAC970056DA53CE5468000000000000 +8F +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +5B975C315DDE4FEE610162FE6D3279C079CB7D427E4D7FD281ED821F84908846 +89728B908E748F2F9031914B916C96C6919C4EC04F4F514553415F93620E67D4 +6C416E0B73637E2691CD928353D459195BBF6DD1795D7E2E7C9B587E719F51FA +88538FF04FCA5CFB662577AC7AE3821C99FF51C65FAA65EC696F6B896DF30000 +6E966F6476FE7D145DE190759187980651E6521D6240669166D96E1A5EB67DD2 +7F7266F885AF85F78AF852A953D959735E8F5F90605592E4966450B7511F52DD +5320534753EC54E8554655315617596859BE5A3C5BB55C065C0F5C115C1A5E84 +5E8A5EE05F70627F628462DB638C63776607660C662D6676677E68A26A1F6A35 +6CBC6D886E096E58713C7126716775C77701785D7901796579F07AE07B117CA7 +7D39809683D6848B8549885D88F38A1F8A3C8A548A738C618CDE91A49266937E +9418969C97984E0A4E084E1E4E575197527057CE583458CC5B225E3860C564FE +676167566D4472B675737A6384B88B7291B89320563157F498FE000000000000 +90 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +62ED690D6B9671ED7E548077827289E698DF87558FB15C3B4F384FE14FB55507 +5A205BDD5BE95FC3614E632F65B0664B68EE699B6D786DF1753375B9771F795E +79E67D3381E382AF85AA89AA8A3A8EAB8F9B903291DD97074EBA4EC152035875 +58EC5C0B751A5C3D814E8A0A8FC59663976D7B258ACF9808916256F353A80000 +9017543957825E2563A86C34708A77617C8B7FE088709042915493109318968F +745E9AC45D075D69657067A28DA896DB636E6749691983C5981796C088FE6F84 +647A5BF84E16702C755D662F51C4523652E259D35F8160276210653F6574661F +667468F268166B636E057272751F76DB7CBE805658F088FD897F8AA08A938ACB +901D91929752975965897A0E810696BB5E2D60DC621A65A56614679077F37A4D +7C4D7E3E810A8CAC8D648DE18E5F78A9520762D963A5644262988A2D7A837BC0 +8AAC96EA7D76820C87494ED95148534353605BA35C025C165DDD6226624764B0 +681368346CC96D456D1767D36F5C714E717D65CB7A7F7BAD7DDA000000000000 +91 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +7E4A7FA8817A821B823985A68A6E8CCE8DF59078907792AD929195839BAE524D +55846F387136516879857E5581B37CCE564C58515CA863AA66FE66FD695A72D9 +758F758E790E795679DF7C977D207D4486078A34963B90619F2050E7527553CC +53E2500955AA58EE594F723D5B8B5C64531D60E360F3635C6383633F63BB0000 +64CD65E966F95DE369CD69FD6F1571E54E8975E976F87A937CDF7DCF7D9C8061 +83498358846C84BC85FB88C58D709001906D9397971C9A1250CF5897618E81D3 +85358D0890204FC3507452475373606F6349675F6E2C8DB3901F4FD75C5E8CCA +65CF7D9A53528896517663C35B585B6B5C0A640D6751905C4ED6591A592A6C70 +8A51553E581559A560F0625367C182356955964099C49A284F5358065BFE8010 +5CB15E2F5F856020614B623466FF6CF06EDE80CE817F82D4888B8CB89000902E +968A9EDB9BDB4EE353F059277B2C918D984C9DF96EDD7027535355445B856258 +629E62D36CA26FEF74228A1794386FC18AFE833851E786F853EA000000000000 +92 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +53E94F4690548FB0596A81315DFD7AEA8FBF68DA8C3772F89C486A3D8AB04E39 +53585606576662C563A265E66B4E6DE16E5B70AD77ED7AEF7BAA7DBB803D80C6 +86CB8A95935B56E358C75F3E65AD66966A806BB575378AC7502477E557305F1B +6065667A6C6075F47A1A7F6E81F48718904599B37BC9755C7AF97B5184C40000 +901079E97A9283365AE177404E2D4EF25B995FE062BD663C67F16CE8866B8877 +8A3B914E92F399D06A177026732A82E784578CAF4E01514651CB558B5BF55E16 +5E335E815F145F355F6B5FB461F2631166A2671D6F6E7252753A773A80748139 +817887768ABF8ADC8D858DF3929A957798029CE552C5635776F467156C8873CD +8CC393AE96736D25589C690E69CC8FFD939A75DB901A585A680263B469FB4F43 +6F2C67D88FBB85267DB49354693F6F70576A58F75B2C7D2C722A540A91E39DB4 +4EAD4F4E505C507552438C9E544858245B9A5E1D5E955EAD5EF75F1F608C62B5 +633A63D068AF6C407887798E7A0B7DE082478A028AE68E449013000000000000 +93 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +90B8912D91D89F0E6CE5645864E265756EF476847B1B906993D16EBA54F25FB9 +64A48F4D8FED92445178586B59295C555E976DFB7E8F751C8CBC8EE2985B70B9 +4F1D6BBF6FB1753096FB514E54105835585759AC5C605F926597675C6E21767B +83DF8CED901490FD934D7825783A52AA5EA6571F597460125012515A51AC0000 +51CD520055105854585859575B955CF65D8B60BC6295642D6771684368BC68DF +76D76DD86E6F6D9B706F71C85F5375D879777B497B547B527CD67D7152308463 +856985E48A0E8B048C468E0F9003900F94199676982D9A3095D850CD52D5540C +58025C0E61A7649E6D1E77B37AE580F48404905392855CE09D07533F5F975FB3 +6D9C7279776379BF7BE46BD272EC8AAD68036A6151F87A8169345C4A9CF682EB +5BC59149701E56785C6F60C765666C8C8C5A90419813545166C7920D594890A3 +51854E4D51EA85998B0E7058637A934B696299B47E047577535769608EDF96E3 +6C5D4E8C5C3C5F108FE953028CD1808986795EFF65E54E735165000000000000 +94 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +59825C3F97EE4EFB598A5FCD8A8D6FE179B079625BE78471732B71B15E745FF5 +637B649A71C37C984E435EFC4E4B57DC56A260A96FC37D0D80FD813381BF8FB2 +899786A45DF4628A64AD898767776CE26D3E743678345A467F7582AD99AC4FF3 +5EC362DD63926557676F76C3724C80CC80BA8F29914D500D57F95A9268850000 +6973716472FD8CB758F28CE0966A9019877F79E477E784294F2F5265535A62CD +67CF6CCA767D7B947C95823685848FEB66DD6F2072067E1B83AB99C19EA651FD +7BB178727BB880877B486AE85E61808C75517560516B92626E8C767A91979AEA +4F107F70629C7B4F95A59CE9567A585986E496BC4F345224534A53CD53DB5E06 +642C6591677F6C3E6C4E724872AF73ED75547E41822C85E98CA97BC491C67169 +981298EF633D6669756A76E478D0854386EE532A5351542659835E875F7C60B2 +6249627962AB65906BD46CCC75B276AE789179D87DCB7F7780A588AB8AB98CBB +907F975E98DB6A0B7C3850995C3E5FAE67876BD8743577097F8E000000000000 +95 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +9F3B67CA7A175339758B9AED5F66819D83F180985F3C5FC575627B46903C6867 +59EB5A9B7D10767E8B2C4FF55F6A6A196C376F0274E2796888688A558C795EDF +63CF75C579D282D7932892F2849C86ED9C2D54C15F6C658C6D5C70158CA78CD3 +983B654F74F64E0D4ED857E0592B5A665BCC51A85E035E9C6016627665770000 +65A7666E6D6E72367B268150819A82998B5C8CA08CE68D74961C96444FAE64AB +6B66821E8461856A90E85C01695398A8847A85574F0F526F5FA95E45670D798F +8179890789866DF55F1762556CB84ECF72699B925206543B567458B361A4626E +711A596E7C897CDE7D1B96F06587805E4E194F75517558405E635E735F0A67C4 +4E26853D9589965B7C73980150FB58C1765678A7522577A585117B86504F5909 +72477BC77DE88FBA8FD4904D4FBF52C95A295F0197AD4FDD821792EA57036355 +6B69752B88DC8F147A4252DF58936155620A66AE6BCD7C3F83E950234FF85305 +5446583159495B9D5CF05CEF5D295E9662B16367653E65B9670B000000000000 +96 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +6CD56CE170F978327E2B80DE82B3840C84EC870289128A2A8C4A90A692D298FD +9CF39D6C4E4F4EA1508D5256574A59A85E3D5FD85FD9623F66B4671B67D068D2 +51927D2180AA81A88B008C8C8CBF927E96325420982C531750D5535C58A864B2 +6734726777667A4691E652C36CA16B8658005E4C5954672C7FFB51E176C60000 +646978E89B549EBB57CB59B96627679A6BCE54E969D95E55819C67959BAA67FE +9C52685D4EA64FE353C862B9672B6CAB8FC44FAD7E6D9EBF4E0761626E806F2B +85135473672A9B455DF37B955CAC5BC6871C6E4A84D17A14810859997C8D6C11 +772052D959227121725F77DB97279D61690B5A7F5A1851A5540D547D660E76DF +8FF792989CF459EA725D6EC5514D68C97DBF7DEC97629EBA64786A2183025984 +5B5F6BDB731B76F27DB280178499513267289ED976EE676252FF99055C24623B +7C7E8CB0554F60B67D0B958053014E5F51B6591C723A803691CE5F2577E25384 +5F797D0485AC8A338E8D975667F385AE9453610961086CB97652000000000000 +97 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +8AED8F38552F4F51512A52C753CB5BA55E7D60A0618263D6670967DA6E676D8C +733673377531795088D58A98904A909190F596C4878D59154E884F594E0E8A89 +8F3F981050AD5E7C59965BB95EB863DA63FA64C166DC694A69D86D0B6EB67194 +75287AAF7F8A8000844984C989818B218E0A9065967D990A617E62916B320000 +6C836D747FCC7FFC6DC07F8587BA88F8676583B1983C96F76D1B7D61843D916A +4E7153755D506B046FEB85CD862D89A75229540F5C65674E68A87406748375E2 +88CF88E191CC96E296785F8B73877ACB844E63A0756552896D416E9C74097559 +786B7C9296867ADC9F8D4FB6616E65C5865C4E864EAE50DA4E2151CC5BEE6599 +68816DBC731F764277AD7A1C7CE7826F8AD2907C91CF96759818529B7DD1502B +539867976DCB71D0743381E88F2A96A39C579E9F746058416D997D2F985E4EE4 +4F364F8B51B752B15DBA601C73B2793C82D3923496B796F6970A9E979F6266A6 +6B74521752A370C888C25EC9604B61906F2371497C3E7DF4806F000000000000 +98 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +84EE9023932C54429B6F6AD370898CC28DEF973252B45A415ECA5F046717697C +69946D6A6F0F726272FC7BED8001807E874B90CE516D9E937984808B93328AD6 +502D548C8A716B6A8CC4810760D167A09DF24E994E989C108A6B85C185686900 +6E7E789781550000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000005F0C +4E104E154E2A4E314E364E3C4E3F4E424E564E584E824E858C6B4E8A82125F0D +4E8E4E9E4E9F4EA04EA24EB04EB34EB64ECE4ECD4EC44EC64EC24ED74EDE4EED +4EDF4EF74F094F5A4F304F5B4F5D4F574F474F764F884F8F4F984F7B4F694F70 +4F914F6F4F864F9651184FD44FDF4FCE4FD84FDB4FD14FDA4FD04FE44FE5501A +50285014502A502550054F1C4FF650215029502C4FFE4FEF5011500650435047 +6703505550505048505A5056506C50785080509A508550B450B2000000000000 +99 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +50C950CA50B350C250D650DE50E550ED50E350EE50F950F55109510151025116 +51155114511A5121513A5137513C513B513F51405152514C515451627AF85169 +516A516E5180518256D8518C5189518F519151935195519651A451A651A251A9 +51AA51AB51B351B151B251B051B551BD51C551C951DB51E0865551E951ED0000 +51F051F551FE5204520B5214520E5227522A522E52335239524F5244524B524C +525E5254526A527452695273527F527D528D529452925271528852918FA88FA7 +52AC52AD52BC52B552C152CD52D752DE52E352E698ED52E052F352F552F852F9 +530653087538530D5310530F5315531A5323532F533153335338534053465345 +4E175349534D51D6535E5369536E5918537B53775382539653A053A653A553AE +53B053B653C37C1296D953DF66FC71EE53EE53E853ED53FA5401543D5440542C +542D543C542E54365429541D544E548F5475548E545F5471547754705492547B +5480547654845490548654C754A254B854A554AC54C454C854A8000000000000 +9A +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +54AB54C254A454BE54BC54D854E554E6550F551454FD54EE54ED54FA54E25539 +55405563554C552E555C55455556555755385533555D5599558054AF558A559F +557B557E5598559E55AE557C558355A9558755A855DA55C555DF55C455DC55E4 +55D4561455F7561655FE55FD561B55F9564E565071DF56345636563256380000 +566B5664562F566C566A56865680568A56A05694568F56A556AE56B656B456C2 +56BC56C156C356C056C856CE56D156D356D756EE56F9570056FF570457095708 +570B570D57135718571655C7571C572657375738574E573B5740574F576957C0 +57885761577F5789579357A057B357A457AA57B057C357C657D457D257D3580A +57D657E3580B5819581D587258215862584B58706BC05852583D5879588558B9 +589F58AB58BA58DE58BB58B858AE58C558D358D158D758D958D858E558DC58E4 +58DF58EF58FA58F958FB58FC58FD5902590A5910591B68A65925592C592D5932 +5938593E7AD259555950594E595A5958596259605967596C5969000000000000 +9B +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +59785981599D4F5E4FAB59A359B259C659E859DC598D59D959DA5A255A1F5A11 +5A1C5A095A1A5A405A6C5A495A355A365A625A6A5A9A5ABC5ABE5ACB5AC25ABD +5AE35AD75AE65AE95AD65AFA5AFB5B0C5B0B5B165B325AD05B2A5B365B3E5B43 +5B455B405B515B555B5A5B5B5B655B695B705B735B755B7865885B7A5B800000 +5B835BA65BB85BC35BC75BC95BD45BD05BE45BE65BE25BDE5BE55BEB5BF05BF6 +5BF35C055C075C085C0D5C135C205C225C285C385C395C415C465C4E5C535C50 +5C4F5B715C6C5C6E4E625C765C795C8C5C915C94599B5CAB5CBB5CB65CBC5CB7 +5CC55CBE5CC75CD95CE95CFD5CFA5CED5D8C5CEA5D0B5D155D175D5C5D1F5D1B +5D115D145D225D1A5D195D185D4C5D525D4E5D4B5D6C5D735D765D875D845D82 +5DA25D9D5DAC5DAE5DBD5D905DB75DBC5DC95DCD5DD35DD25DD65DDB5DEB5DF2 +5DF55E0B5E1A5E195E115E1B5E365E375E445E435E405E4E5E575E545E5F5E62 +5E645E475E755E765E7A9EBC5E7F5EA05EC15EC25EC85ED05ECF000000000000 +9C +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +5ED65EE35EDD5EDA5EDB5EE25EE15EE85EE95EEC5EF15EF35EF05EF45EF85EFE +5F035F095F5D5F5C5F0B5F115F165F295F2D5F385F415F485F4C5F4E5F2F5F51 +5F565F575F595F615F6D5F735F775F835F825F7F5F8A5F885F915F875F9E5F99 +5F985FA05FA85FAD5FBC5FD65FFB5FE45FF85FF15FDD60B35FFF602160600000 +601960106029600E6031601B6015602B6026600F603A605A6041606A6077605F +604A6046604D6063604360646042606C606B60596081608D60E76083609A6084 +609B60966097609260A7608B60E160B860E060D360B45FF060BD60C660B560D8 +614D6115610660F660F7610060F460FA6103612160FB60F1610D610E6147613E +61286127614A613F613C612C6134613D614261446173617761586159615A616B +6174616F61656171615F615D6153617561996196618761AC6194619A618A6191 +61AB61AE61CC61CA61C961F761C861C361C661BA61CB7F7961CD61E661E361F6 +61FA61F461FF61FD61FC61FE620062086209620D620C6214621B000000000000 +9D +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +621E6221622A622E6230623262336241624E625E6263625B62606268627C6282 +6289627E62926293629662D46283629462D762D162BB62CF62FF62C664D462C8 +62DC62CC62CA62C262C7629B62C9630C62EE62F163276302630862EF62F56350 +633E634D641C634F6396638E638063AB637663A3638F6389639F63B5636B0000 +636963BE63E963C063C663E363C963D263F663C4641664346406641364266436 +651D64176428640F6467646F6476644E652A6495649364A564A9648864BC64DA +64D264C564C764BB64D864C264F164E7820964E064E162AC64E364EF652C64F6 +64F464F264FA650064FD6518651C650565246523652B65346535653765366538 +754B654865566555654D6558655E655D65726578658265838B8A659B659F65AB +65B765C365C665C165C465CC65D265DB65D965E065E165F16772660A660365FB +6773663566366634661C664F664466496641665E665D666466676668665F6662 +667066836688668E668966846698669D66C166B966C966BE66BC000000000000 +9E +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +66C466B866D666DA66E0663F66E666E966F066F566F7670F6716671E67266727 +9738672E673F67366741673867376746675E67606759676367646789677067A9 +677C676A678C678B67A667A1678567B767EF67B467EC67B367E967B867E467DE +67DD67E267EE67B967CE67C667E76A9C681E684668296840684D6832684E0000 +68B3682B685968636877687F689F688F68AD6894689D689B68836AAE68B96874 +68B568A068BA690F688D687E690168CA690868D86922692668E1690C68CD68D4 +68E768D569366912690468D768E3692568F968E068EF6928692A691A69236921 +68C669796977695C6978696B6954697E696E69396974693D695969306961695E +695D6981696A69B269AE69D069BF69C169D369BE69CE5BE869CA69DD69BB69C3 +69A76A2E699169A0699C699569B469DE69E86A026A1B69FF6B0A69F969F269E7 +6A0569B16A1E69ED6A1469EB6A0A6A126AC16A236A136A446A0C6A726A366A78 +6A476A626A596A666A486A386A226A906A8D6AA06A846AA26AA3000000000000 +9F +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +6A9786176ABB6AC36AC26AB86AB36AAC6ADE6AD16ADF6AAA6ADA6AEA6AFB6B05 +86166AFA6B126B169B316B1F6B386B3776DC6B3998EE6B476B436B496B506B59 +6B546B5B6B5F6B616B786B796B7F6B806B846B836B8D6B986B956B9E6BA46BAA +6BAB6BAF6BB26BB16BB36BB76BBC6BC66BCB6BD36BDF6BEC6BEB6BF36BEF0000 +9EBE6C086C136C146C1B6C246C236C5E6C556C626C6A6C826C8D6C9A6C816C9B +6C7E6C686C736C926C906CC46CF16CD36CBD6CD76CC56CDD6CAE6CB16CBE6CBA +6CDB6CEF6CD96CEA6D1F884D6D366D2B6D3D6D386D196D356D336D126D0C6D63 +6D936D646D5A6D796D596D8E6D956FE46D856DF96E156E0A6DB56DC76DE66DB8 +6DC66DEC6DDE6DCC6DE86DD26DC56DFA6DD96DE46DD56DEA6DEE6E2D6E6E6E2E +6E196E726E5F6E3E6E236E6B6E2B6E766E4D6E1F6E436E3A6E4E6E246EFF6E1D +6E386E826EAA6E986EC96EB76ED36EBD6EAF6EC46EB26ED46ED56E8F6EA56EC2 +6E9F6F416F11704C6EEC6EF86EFE6F3F6EF26F316EEF6F326ECC000000000000 +E0 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +6F3E6F136EF76F866F7A6F786F816F806F6F6F5B6FF36F6D6F826F7C6F586F8E +6F916FC26F666FB36FA36FA16FA46FB96FC66FAA6FDF6FD56FEC6FD46FD86FF1 +6FEE6FDB7009700B6FFA70117001700F6FFE701B701A6F74701D7018701F7030 +703E7032705170637099709270AF70F170AC70B870B370AE70DF70CB70DD0000 +70D9710970FD711C711971657155718871667162714C7156716C718F71FB7184 +719571A871AC71D771B971BE71D271C971D471CE71E071EC71E771F571FC71F9 +71FF720D7210721B7228722D722C72307232723B723C723F72407246724B7258 +7274727E7282728172877292729672A272A772B972B272C372C672C472CE72D2 +72E272E072E172F972F7500F7317730A731C7316731D7334732F73297325733E +734E734F9ED87357736A7368737073787375737B737A73C873B373CE73BB73C0 +73E573EE73DE74A27405746F742573F87432743A7455743F745F74597441745C +746974707463746A7476747E748B749E74A774CA74CF74D473F1000000000000 +E1 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +74E074E374E774E974EE74F274F074F174F874F7750475037505750C750E750D +75157513751E7526752C753C7544754D754A7549755B7546755A756975647567 +756B756D75787576758675877574758A758975827594759A759D75A575A375C2 +75B375C375B575BD75B875BC75B175CD75CA75D275D975E375DE75FE75FF0000 +75FC760175F075FA75F275F3760B760D7609761F762776207621762276247634 +7630763B764776487646765C76587661766276687669766A7667766C76707672 +76767678767C768076837688768B768E769676937699769A76B076B476B876B9 +76BA76C276CD76D676D276DE76E176E576E776EA862F76FB7708770777047729 +7724771E77257726771B773777387747775A7768776B775B7765777F777E7779 +778E778B779177A0779E77B077B677B977BF77BC77BD77BB77C777CD77D777DA +77DC77E377EE77FC780C781279267820792A7845788E78747886787C789A788C +78A378B578AA78AF78D178C678CB78D478BE78BC78C578CA78EC000000000000 +E2 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +78E778DA78FD78F47907791279117919792C792B794079607957795F795A7955 +7953797A797F798A799D79A79F4B79AA79AE79B379B979BA79C979D579E779EC +79E179E37A087A0D7A187A197A207A1F79807A317A3B7A3E7A377A437A577A49 +7A617A627A699F9D7A707A797A7D7A887A977A957A987A967AA97AC87AB00000 +7AB67AC57AC47ABF90837AC77ACA7ACD7ACF7AD57AD37AD97ADA7ADD7AE17AE2 +7AE67AED7AF07B027B0F7B0A7B067B337B187B197B1E7B357B287B367B507B7A +7B047B4D7B0B7B4C7B457B757B657B747B677B707B717B6C7B6E7B9D7B987B9F +7B8D7B9C7B9A7B8B7B927B8F7B5D7B997BCB7BC17BCC7BCF7BB47BC67BDD7BE9 +7C117C147BE67BE57C607C007C077C137BF37BF77C177C0D7BF67C237C277C2A +7C1F7C377C2B7C3D7C4C7C437C547C4F7C407C507C587C5F7C647C567C657C6C +7C757C837C907CA47CAD7CA27CAB7CA17CA87CB37CB27CB17CAE7CB97CBD7CC0 +7CC57CC27CD87CD27CDC7CE29B3B7CEF7CF27CF47CF67CFA7D06000000000000 +E3 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +7D027D1C7D157D0A7D457D4B7D2E7D327D3F7D357D467D737D567D4E7D727D68 +7D6E7D4F7D637D937D897D5B7D8F7D7D7D9B7DBA7DAE7DA37DB57DC77DBD7DAB +7E3D7DA27DAF7DDC7DB87D9F7DB07DD87DDD7DE47DDE7DFB7DF27DE17E057E0A +7E237E217E127E317E1F7E097E0B7E227E467E667E3B7E357E397E437E370000 +7E327E3A7E677E5D7E567E5E7E597E5A7E797E6A7E697E7C7E7B7E837DD57E7D +8FAE7E7F7E887E897E8C7E927E907E937E947E967E8E7E9B7E9C7F387F3A7F45 +7F4C7F4D7F4E7F507F517F557F547F587F5F7F607F687F697F677F787F827F86 +7F837F887F877F8C7F947F9E7F9D7F9A7FA37FAF7FB27FB97FAE7FB67FB88B71 +7FC57FC67FCA7FD57FD47FE17FE67FE97FF37FF998DC80068004800B80128018 +8019801C80218028803F803B804A804680528058805A805F8062806880738072 +807080768079807D807F808480868085809B8093809A80AD519080AC80DB80E5 +80D980DD80C480DA80D6810980EF80F1811B81298123812F814B000000000000 +E4 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +968B8146813E8153815180FC8171816E81658166817481838188818A81808182 +81A0819581A481A3815F819381A981B081B581BE81B881BD81C081C281BA81C9 +81CD81D181D981D881C881DA81DF81E081E781FA81FB81FE8201820282058207 +820A820D821082168229822B82388233824082598258825D825A825F82640000 +82628268826A826B822E827182778278827E828D829282AB829F82BB82AC82E1 +82E382DF82D282F482F382FA8393830382FB82F982DE830682DC830982D98335 +83348316833283318340833983508345832F832B831783188385839A83AA839F +83A283968323838E8387838A837C83B58373837583A0838983A883F4841383EB +83CE83FD840383D8840B83C183F7840783E083F2840D8422842083BD84388506 +83FB846D842A843C855A84848477846B84AD846E848284698446842C846F8479 +843584CA846284B984BF849F84D984CD84BB84DA84D084C184C684D684A18521 +84FF84F485178518852C851F8515851484FC8540856385588548000000000000 +E5 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +85418602854B8555858085A485888591858A85A8856D8594859B85EA8587859C +8577857E859085C985BA85CF85B985D085D585DD85E585DC85F9860A8613860B +85FE85FA86068622861A8630863F864D4E558654865F86678671869386A386A9 +86AA868B868C86B686AF86C486C686B086C9882386AB86D486DE86E986EC0000 +86DF86DB86EF8712870687088700870386FB87118709870D86F9870A8734873F +8737873B87258729871A8760875F8778874C874E877487578768876E87598753 +8763876A880587A2879F878287AF87CB87BD87C087D096D687AB87C487B387C7 +87C687BB87EF87F287E0880F880D87FE87F687F7880E87D28811881688158822 +88218831883688398827883B8844884288528859885E8862886B8881887E889E +8875887D88B5887288828897889288AE889988A2888D88A488B088BF88B188C3 +88C488D488D888D988DD88F9890288FC88F488E888F28904890C890A89138943 +891E8925892A892B89418944893B89368938894C891D8960895E000000000000 +E6 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +89668964896D896A896F89748977897E89838988898A8993899889A189A989A6 +89AC89AF89B289BA89BD89BF89C089DA89DC89DD89E789F489F88A038A168A10 +8A0C8A1B8A1D8A258A368A418A5B8A528A468A488A7C8A6D8A6C8A628A858A82 +8A848AA88AA18A918AA58AA68A9A8AA38AC48ACD8AC28ADA8AEB8AF38AE70000 +8AE48AF18B148AE08AE28AF78ADE8ADB8B0C8B078B1A8AE18B168B108B178B20 +8B3397AB8B268B2B8B3E8B288B418B4C8B4F8B4E8B498B568B5B8B5A8B6B8B5F +8B6C8B6F8B748B7D8B808B8C8B8E8B928B938B968B998B9A8C3A8C418C3F8C48 +8C4C8C4E8C508C558C628C6C8C788C7A8C828C898C858C8A8C8D8C8E8C948C7C +8C98621D8CAD8CAA8CBD8CB28CB38CAE8CB68CC88CC18CE48CE38CDA8CFD8CFA +8CFB8D048D058D0A8D078D0F8D0D8D109F4E8D138CCD8D148D168D678D6D8D71 +8D738D818D998DC28DBE8DBA8DCF8DDA8DD68DCC8DDB8DCB8DEA8DEB8DDF8DE3 +8DFC8E088E098DFF8E1D8E1E8E108E1F8E428E358E308E348E4A000000000000 +E7 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +8E478E498E4C8E508E488E598E648E608E2A8E638E558E768E728E7C8E818E87 +8E858E848E8B8E8A8E938E918E948E998EAA8EA18EAC8EB08EC68EB18EBE8EC5 +8EC88ECB8EDB8EE38EFC8EFB8EEB8EFE8F0A8F058F158F128F198F138F1C8F1F +8F1B8F0C8F268F338F3B8F398F458F428F3E8F4C8F498F468F4E8F578F5C0000 +8F628F638F648F9C8F9F8FA38FAD8FAF8FB78FDA8FE58FE28FEA8FEF90878FF4 +90058FF98FFA901190159021900D901E9016900B90279036903590398FF8904F +905090519052900E9049903E90569058905E9068906F907696A890729082907D +90819080908A9089908F90A890AF90B190B590E290E4624890DB910291129119 +91329130914A9156915891639165916991739172918B9189918291A291AB91AF +91AA91B591B491BA91C091C191C991CB91D091D691DF91E191DB91FC91F591F6 +921E91FF9214922C92159211925E925792459249926492489295923F924B9250 +929C92969293929B925A92CF92B992B792E9930F92FA9344932E000000000000 +E8 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +93199322931A9323933A9335933B935C9360937C936E935693B093AC93AD9394 +93B993D693D793E893E593D893C393DD93D093C893E4941A9414941394039407 +94109436942B94359421943A944194529444945B94609462945E946A92299470 +94759477947D945A947C947E9481947F95829587958A95949596959895990000 +95A095A895A795AD95BC95BB95B995BE95CA6FF695C395CD95CC95D595D495D6 +95DC95E195E595E296219628962E962F9642964C964F964B9677965C965E965D +965F96669672966C968D96989695969796AA96A796B196B296B096B496B696B8 +96B996CE96CB96C996CD894D96DC970D96D596F99704970697089713970E9711 +970F971697199724972A97309739973D973E97449746974897429749975C9760 +97649766976852D2976B977197799785977C9781977A9786978B978F9790979C +97A897A697A397B397B497C397C697C897CB97DC97ED9F4F97F27ADF97F697F5 +980F980C9838982498219837983D9846984F984B986B986F9870000000000000 +E9 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +98719874987398AA98AF98B198B698C498C398C698E998EB9903990999129914 +99189921991D991E99249920992C992E993D993E9942994999459950994B9951 +9952994C99559997999899A599AD99AE99BC99DF99DB99DD99D899D199ED99EE +99F199F299FB99F89A019A0F9A0599E29A199A2B9A379A459A429A409A430000 +9A3E9A559A4D9A5B9A579A5F9A629A659A649A699A6B9A6A9AAD9AB09ABC9AC0 +9ACF9AD19AD39AD49ADE9ADF9AE29AE39AE69AEF9AEB9AEE9AF49AF19AF79AFB +9B069B189B1A9B1F9B229B239B259B279B289B299B2A9B2E9B2F9B329B449B43 +9B4F9B4D9B4E9B519B589B749B939B839B919B969B979B9F9BA09BA89BB49BC0 +9BCA9BB99BC69BCF9BD19BD29BE39BE29BE49BD49BE19C3A9BF29BF19BF09C15 +9C149C099C139C0C9C069C089C129C0A9C049C2E9C1B9C259C249C219C309C47 +9C329C469C3E9C5A9C609C679C769C789CE79CEC9CF09D099D089CEB9D039D06 +9D2A9D269DAF9D239D1F9D449D159D129D419D3F9D3E9D469D48000000000000 +EA +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +9D5D9D5E9D649D519D509D599D729D899D879DAB9D6F9D7A9D9A9DA49DA99DB2 +9DC49DC19DBB9DB89DBA9DC69DCF9DC29DD99DD39DF89DE69DED9DEF9DFD9E1A +9E1B9E1E9E759E799E7D9E819E889E8B9E8C9E929E959E919E9D9EA59EA99EB8 +9EAA9EAD97619ECC9ECE9ECF9ED09ED49EDC9EDE9EDD9EE09EE59EE89EEF0000 +9EF49EF69EF79EF99EFB9EFC9EFD9F079F0876B79F159F219F2C9F3E9F4A9F52 +9F549F639F5F9F609F619F669F679F6C9F6A9F779F729F769F959F9C9FA0582F +69C79059746451DC719900000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +EB +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000F8B5F8B60000000000000000000000000000000000000000000000000000 +F8B7FE33000000000000000000000000000000000000F8B8FE31F8B900000000 +F8BAF8BBF8BCF8BDFE300000000000000000FE35FE36FE39FE3AF8BEF8BFFE37 +FE38FE3FFE40FE3DFE3EFE41FE42FE43FE44FE3BFE3C00000000000000000000 +0000F8C000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +EC +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000F8C1 +0000F8C20000F8C30000F8C40000F8C500000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000F8C600000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000F8C70000F8C80000F8C9000000000000000000000000F8CA000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +ED +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +F8CB0000F8CC0000F8CD0000F8CE0000F8CF0000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00000000F8D00000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000000000000F8D10000F8D20000F8D3000000000000000000000000F8D40000 +00000000000000000000F8D5F8D6000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 diff --git a/env/tcl/tcl8.6/encoding/macRoman.enc b/env/tcl/tcl8.6/encoding/macRoman.enc new file mode 100644 index 0000000..15de266 --- /dev/null +++ b/env/tcl/tcl8.6/encoding/macRoman.enc @@ -0,0 +1,20 @@ +# Encoding file: macRoman, single-byte +S +003F 0 1 +00 +0000000100020003000400050006000700080009000A000B000C000D000E000F +0010001100120013001400150016001700180019001A001B001C001D001E001F +0020002100220023002400250026002700280029002A002B002C002D002E002F +0030003100320033003400350036003700380039003A003B003C003D003E003F +0040004100420043004400450046004700480049004A004B004C004D004E004F +0050005100520053005400550056005700580059005A005B005C005D005E005F +0060006100620063006400650066006700680069006A006B006C006D006E006F +0070007100720073007400750076007700780079007A007B007C007D007E007F +00C400C500C700C900D100D600DC00E100E000E200E400E300E500E700E900E8 +00EA00EB00ED00EC00EE00EF00F100F300F200F400F600F500FA00F900FB00FC +202000B000A200A300A7202200B600DF00AE00A9212200B400A8226000C600D8 +221E00B12264226500A500B522022211220F03C0222B00AA00BA03A900E600F8 +00BF00A100AC221A01922248220600AB00BB202600A000C000C300D501520153 +20132014201C201D2018201900F725CA00FF0178204420AC2039203AFB01FB02 +202100B7201A201E203000C200CA00C100CB00C800CD00CE00CF00CC00D300D4 +F8FF00D200DA00DB00D9013102C602DC00AF02D802D902DA00B802DD02DB02C7 diff --git a/env/tcl/tcl8.6/encoding/macRomania.enc b/env/tcl/tcl8.6/encoding/macRomania.enc new file mode 100644 index 0000000..ce41cf4 --- /dev/null +++ b/env/tcl/tcl8.6/encoding/macRomania.enc @@ -0,0 +1,20 @@ +# Encoding file: macRomania, single-byte +S +003F 0 1 +00 +0000000100020003000400050006000700080009000A000B000C000D000E000F +0010001100120013001400150016001700180019001A001B001C001D001E001F +0020002100220023002400250026002700280029002A002B002C002D002E002F +0030003100320033003400350036003700380039003A003B003C003D003E003F +0040004100420043004400450046004700480049004A004B004C004D004E004F +0050005100520053005400550056005700580059005A005B005C005D005E005F +0060006100620063006400650066006700680069006A006B006C006D006E006F +0070007100720073007400750076007700780079007A007B007C007D007E007F +00C400C500C700C900D100D600DC00E100E000E200E400E300E500E700E900E8 +00EA00EB00ED00EC00EE00EF00F100F300F200F400F600F500FA00F900FB00FC +202000B000A200A300A7202200B600DF00AE00A9212200B400A822600102015E +221E00B12264226500A500B522022211220F03C0222B00AA00BA21260103015F +00BF00A100AC221A01922248220600AB00BB202600A000C000C300D501520153 +20132014201C201D2018201900F725CA00FF0178204400A42039203A01620163 +202100B7201A201E203000C200CA00C100CB00C800CD00CE00CF00CC00D300D4 +F8FF00D200DA00DB00D9013102C602DC00AF02D802D902DA00B802DD02DB02C7 diff --git a/env/tcl/tcl8.6/encoding/macThai.enc b/env/tcl/tcl8.6/encoding/macThai.enc new file mode 100644 index 0000000..7d9c8ad --- /dev/null +++ b/env/tcl/tcl8.6/encoding/macThai.enc @@ -0,0 +1,20 @@ +# Encoding file: macThai, single-byte +S +003F 0 1 +00 +0000000100020003000400050006000700080009000A000B000C000D000E000F +0010001100120013001400150016001700180019001A001B001C001D001E001F +0020002100220023002400250026002700280029002A002B002C002D002E002F +0030003100320033003400350036003700380039003A003B003C003D003E003F +0040004100420043004400450046004700480049004A004B004C004D004E004F +0050005100520053005400550056005700580059005A005B005C005D005E005F +0060006100620063006400650066006700680069006A006B006C006D006E006F +0070007100720073007400750076007700780079007A007B007C007D007E007F +00AB00BB2026F88CF88FF892F895F898F88BF88EF891F894F897201C201DF899 +FFFD2022F884F889F885F886F887F888F88AF88DF890F893F89620182019FFFD +00A00E010E020E030E040E050E060E070E080E090E0A0E0B0E0C0E0D0E0E0E0F +0E100E110E120E130E140E150E160E170E180E190E1A0E1B0E1C0E1D0E1E0E1F +0E200E210E220E230E240E250E260E270E280E290E2A0E2B0E2C0E2D0E2E0E2F +0E300E310E320E330E340E350E360E370E380E390E3AFEFF200B201320140E3F +0E400E410E420E430E440E450E460E470E480E490E4A0E4B0E4C0E4D21220E4F +0E500E510E520E530E540E550E560E570E580E5900AE00A9FFFDFFFDFFFDFFFD diff --git a/env/tcl/tcl8.6/encoding/macTurkish.enc b/env/tcl/tcl8.6/encoding/macTurkish.enc new file mode 100644 index 0000000..f9542ae --- /dev/null +++ b/env/tcl/tcl8.6/encoding/macTurkish.enc @@ -0,0 +1,20 @@ +# Encoding file: macTurkish, single-byte +S +003F 0 1 +00 +0000000100020003000400050006000700080009000A000B000C000D000E000F +0010001100120013001400150016001700180019001A001B001C001D001E001F +0020002100220023002400250026002700280029002A002B002C002D002E002F +0030003100320033003400350036003700380039003A003B003C003D003E003F +0040004100420043004400450046004700480049004A004B004C004D004E004F +0050005100520053005400550056005700580059005A005B005C005D005E005F +0060006100620063006400650066006700680069006A006B006C006D006E006F +0070007100720073007400750076007700780079007A007B007C007D007E007F +00C400C500C700C900D100D600DC00E100E000E200E400E300E500E700E900E8 +00EA00EB00ED00EC00EE00EF00F100F300F200F400F600F500FA00F900FB00FC +202000B000A200A300A7202200B600DF00AE00A9212200B400A8226000C600D8 +221E00B12264226500A500B522022211220F03C0222B00AA00BA03A900E600F8 +00BF00A100AC221A01922248220600AB00BB202600A000C000C300D501520153 +20132014201C201D2018201900F725CA00FF0178011E011F01300131015E015F +202100B7201A201E203000C200CA00C100CB00C800CD00CE00CF00CC00D300D4 +F8FF00D200DA00DB00D9F8A002C602DC00AF02D802D902DA00B802DD02DB02C7 diff --git a/env/tcl/tcl8.6/encoding/macUkraine.enc b/env/tcl/tcl8.6/encoding/macUkraine.enc new file mode 100644 index 0000000..643cc45 --- /dev/null +++ b/env/tcl/tcl8.6/encoding/macUkraine.enc @@ -0,0 +1,20 @@ +# Encoding file: macUkraine, single-byte +S +003F 0 1 +00 +0000000100020003000400050006000700080009000A000B000C000D000E000F +0010001100120013001400150016001700180019001A001B001C001D001E001F +0020002100220023002400250026002700280029002A002B002C002D002E002F +0030003100320033003400350036003700380039003A003B003C003D003E003F +0040004100420043004400450046004700480049004A004B004C004D004E004F +0050005100520053005400550056005700580059005A005B005C005D005E005F +0060006100620063006400650066006700680069006A006B006C006D006E006F +0070007100720073007400750076007700780079007A007B007C007D007E007F +0410041104120413041404150416041704180419041A041B041C041D041E041F +0420042104220423042404250426042704280429042A042B042C042D042E042F +202000B0049000A300A7202200B6040600AE00A9212204020452226004030453 +221E00B122642265045600B504910408040404540407045704090459040A045A +0458040500AC221A01922248220600AB00BB202600A0040B045B040C045C0455 +20132014201C201D2018201900F7201E040E045E040F045F211604010451044F +0430043104320433043404350436043704380439043A043B043C043D043E043F +0440044104420443044404450446044704480449044A044B044C044D044E00A4 diff --git a/env/tcl/tcl8.6/encoding/shiftjis.enc b/env/tcl/tcl8.6/encoding/shiftjis.enc new file mode 100644 index 0000000..140aec4 --- /dev/null +++ b/env/tcl/tcl8.6/encoding/shiftjis.enc @@ -0,0 +1,690 @@ +# Encoding file: shiftjis, multi-byte +M +003F 0 40 +00 +0000000100020003000400050006000700080009000A000B000C000D000E000F +0010001100120013001400150016001700180019001A001B001C001D001E001F +0020002100220023002400250026002700280029002A002B002C002D002E002F +0030003100320033003400350036003700380039003A003B003C003D003E003F +0040004100420043004400450046004700480049004A004B004C004D004E004F +0050005100520053005400550056005700580059005A005B005C005D005E005F +0060006100620063006400650066006700680069006A006B006C006D006E006F +0070007100720073007400750076007700780079007A007B007C007D007E007F +0080000000000000000000850086008700000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000FF61FF62FF63FF64FF65FF66FF67FF68FF69FF6AFF6BFF6CFF6DFF6EFF6F +FF70FF71FF72FF73FF74FF75FF76FF77FF78FF79FF7AFF7BFF7CFF7DFF7EFF7F +FF80FF81FF82FF83FF84FF85FF86FF87FF88FF89FF8AFF8BFF8CFF8DFF8EFF8F +FF90FF91FF92FF93FF94FF95FF96FF97FF98FF99FF9AFF9BFF9CFF9DFF9EFF9F +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +81 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +300030013002FF0CFF0E30FBFF1AFF1BFF1FFF01309B309C00B4FF4000A8FF3E +FFE3FF3F30FD30FE309D309E30034EDD30053006300730FC20152010FF0FFF3C +301C2016FF5C2026202520182019201C201DFF08FF0930143015FF3BFF3DFF5B +FF5D30083009300A300B300C300D300E300F30103011FF0B221200B100D70000 +00F7FF1D2260FF1CFF1E22662267221E22342642264000B0203220332103FFE5 +FF0400A200A3FF05FF03FF06FF0AFF2000A72606260525CB25CF25CE25C725C6 +25A125A025B325B225BD25BC203B301221922190219121933013000000000000 +000000000000000000000000000000002208220B2286228722822283222A2229 +000000000000000000000000000000002227222800AC21D221D4220022030000 +0000000000000000000000000000000000000000222022A52312220222072261 +2252226A226B221A223D221D2235222B222C0000000000000000000000000000 +212B2030266F266D266A2020202100B6000000000000000025EF000000000000 +82 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000FF10 +FF11FF12FF13FF14FF15FF16FF17FF18FF190000000000000000000000000000 +FF21FF22FF23FF24FF25FF26FF27FF28FF29FF2AFF2BFF2CFF2DFF2EFF2FFF30 +FF31FF32FF33FF34FF35FF36FF37FF38FF39FF3A000000000000000000000000 +0000FF41FF42FF43FF44FF45FF46FF47FF48FF49FF4AFF4BFF4CFF4DFF4EFF4F +FF50FF51FF52FF53FF54FF55FF56FF57FF58FF59FF5A00000000000000003041 +30423043304430453046304730483049304A304B304C304D304E304F30503051 +30523053305430553056305730583059305A305B305C305D305E305F30603061 +30623063306430653066306730683069306A306B306C306D306E306F30703071 +30723073307430753076307730783079307A307B307C307D307E307F30803081 +30823083308430853086308730883089308A308B308C308D308E308F30903091 +3092309300000000000000000000000000000000000000000000000000000000 +83 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +30A130A230A330A430A530A630A730A830A930AA30AB30AC30AD30AE30AF30B0 +30B130B230B330B430B530B630B730B830B930BA30BB30BC30BD30BE30BF30C0 +30C130C230C330C430C530C630C730C830C930CA30CB30CC30CD30CE30CF30D0 +30D130D230D330D430D530D630D730D830D930DA30DB30DC30DD30DE30DF0000 +30E030E130E230E330E430E530E630E730E830E930EA30EB30EC30ED30EE30EF +30F030F130F230F330F430F530F6000000000000000000000000000000000391 +03920393039403950396039703980399039A039B039C039D039E039F03A003A1 +03A303A403A503A603A703A803A90000000000000000000000000000000003B1 +03B203B303B403B503B603B703B803B903BA03BB03BC03BD03BE03BF03C003C1 +03C303C403C503C603C703C803C9000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +84 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +04100411041204130414041504010416041704180419041A041B041C041D041E +041F0420042104220423042404250426042704280429042A042B042C042D042E +042F000000000000000000000000000000000000000000000000000000000000 +04300431043204330434043504510436043704380439043A043B043C043D0000 +043E043F0440044104420443044404450446044704480449044A044B044C044D +044E044F00000000000000000000000000000000000000000000000000002500 +2502250C251025182514251C252C25242534253C25012503250F2513251B2517 +25232533252B253B254B2520252F25282537253F251D25302525253825420000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +88 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000004E9C +55165A03963F54C0611B632859F690228475831C7A5060AA63E16E2565ED8466 +82A69BF56893572765A162715B9B59D0867B98F47D627DBE9B8E62167C9F88B7 +5B895EB563096697684895C7978D674F4EE54F0A4F4D4F9D504956F2593759D4 +5A015C0960DF610F61706613690570BA754F757079FB7DAD7DEF80C3840E8863 +8B029055907A533B4E954EA557DF80B290C178EF4E0058F16EA290387A328328 +828B9C2F5141537054BD54E156E059FB5F1598F26DEB80E4852D000000000000 +89 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +9662967096A097FB540B53F35B8770CF7FBD8FC296E8536F9D5C7ABA4E117893 +81FC6E26561855046B1D851A9C3B59E553A96D6674DC958F56424E91904B96F2 +834F990C53E155B65B305F71662066F368046C386CF36D29745B76C87A4E9834 +82F1885B8A6092ED6DB275AB76CA99C560A68B018D8A95B2698E53AD51860000 +5712583059445BB45EF6602863A963F46CBF6F14708E7114715971D5733F7E01 +827682D185979060925B9D1B586965BC6C5A752551F9592E59655F805FDC62BC +65FA6A2A6B276BB4738B7FC189569D2C9D0E9EC45CA16C96837B51045C4B61B6 +81C6687672614E594FFA537860696E297A4F97F34E0B53164EEE4F554F3D4FA1 +4F7352A053EF5609590F5AC15BB65BE179D16687679C67B66B4C6CB3706B73C2 +798D79BE7A3C7B8782B182DB8304837783EF83D387668AB256298CA88FE6904E +971E868A4FC45CE862117259753B81E582BD86FE8CC096C5991399D54ECB4F1A +89E356DE584A58CA5EFB5FEB602A6094606261D0621262D06539000000000000 +8A +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +9B41666668B06D777070754C76867D7582A587F9958B968E8C9D51F152BE5916 +54B35BB35D16616869826DAF788D84CB88578A7293A79AB86D6C99A886D957A3 +67FF86CE920E5283568754045ED362E164B9683C68386BBB737278BA7A6B899A +89D28D6B8F0390ED95A3969497695B665CB3697D984D984E639B7B206A2B0000 +6A7F68B69C0D6F5F5272559D607062EC6D3B6E076ED1845B89108F444E149C39 +53F6691B6A3A9784682A515C7AC384B291DC938C565B9D286822830584317CA5 +520882C574E64E7E4F8351A05BD2520A52D852E75DFB559A582A59E65B8C5B98 +5BDB5E725E7960A3611F616361BE63DB656267D1685368FA6B3E6B536C576F22 +6F976F4574B0751876E3770B7AFF7BA17C217DE97F367FF0809D8266839E89B3 +8ACC8CAB908494519593959195A2966597D3992882184E38542B5CB85DCC73A9 +764C773C5CA97FEB8D0B96C19811985498584F014F0E5371559C566857FA5947 +5B095BC45C905E0C5E7E5FCC63EE673A65D765E2671F68CB68C4000000000000 +8B +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +6A5F5E306BC56C176C7D757F79485B637A007D005FBD898F8A188CB48D778ECC +8F1D98E29A0E9B3C4E80507D510059935B9C622F628064EC6B3A72A075917947 +7FA987FB8ABC8B7063AC83CA97A05409540355AB68546A588A70782767759ECD +53745BA2811A865090064E184E454EC74F1153CA54385BAE5F13602565510000 +673D6C426C726CE3707874037A767AAE7B087D1A7CFE7D6665E7725B53BB5C45 +5DE862D262E063196E20865A8A318DDD92F86F0179A69B5A4EA84EAB4EAC4F9B +4FA050D151477AF6517151F653545321537F53EB55AC58835CE15F375F4A602F +6050606D631F65596A4B6CC172C272ED77EF80F881058208854E90F793E197FF +99579A5A4EF051DD5C2D6681696D5C4066F26975738968507C8150C552E45747 +5DFE932665A46B236B3D7434798179BD7B4B7DCA82B983CC887F895F8B398FD1 +91D1541F92804E5D503653E5533A72D7739677E982E68EAF99C699C899D25177 +611A865E55B07A7A50765BD3904796854E326ADB91E75C515C48000000000000 +8C +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +63987A9F6C9397748F617AAA718A96887C8268177E706851936C52F2541B85AB +8A137FA48ECD90E15366888879414FC250BE521151445553572D73EA578B5951 +5F625F8460756176616761A963B2643A656C666F68426E1375667A3D7CFB7D4C +7D997E4B7F6B830E834A86CD8A088A638B668EFD981A9D8F82B88FCE9BE80000 +5287621F64836FC09699684150916B206C7A6F547A747D5088408A2367084EF6 +503950265065517C5238526355A7570F58055ACC5EFA61B261F862F36372691C +6A29727D72AC732E7814786F7D79770C80A9898B8B198CE28ED290639375967A +98559A139E785143539F53B35E7B5F266E1B6E90738473FE7D4382378A008AFA +96504E4E500B53E4547C56FA59D15B645DF15EAB5F276238654567AF6E5672D0 +7CCA88B480A180E183F0864E8A878DE8923796C798679F134E944E924F0D5348 +5449543E5A2F5F8C5FA1609F68A76A8E745A78818A9E8AA48B7791904E5E9BC9 +4EA44F7C4FAF501950165149516C529F52B952FE539A53E35411000000000000 +8D +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +540E5589575157A2597D5B545B5D5B8F5DE55DE75DF75E785E835E9A5EB75F18 +6052614C629762D863A7653B6602664366F4676D6821689769CB6C5F6D2A6D69 +6E2F6E9D75327687786C7A3F7CE07D057D187D5E7DB18015800380AF80B18154 +818F822A8352884C88618B1B8CA28CFC90CA91759271783F92FC95A4964D0000 +980599999AD89D3B525B52AB53F7540858D562F76FE08C6A8F5F9EB9514B523B +544A56FD7A4091779D609ED273446F09817075115FFD60DA9AA872DB8FBC6B64 +98034ECA56F0576458BE5A5A606861C7660F6606683968B16DF775D57D3A826E +9B424E9B4F5053C955065D6F5DE65DEE67FB6C99747378028A50939688DF5750 +5EA7632B50B550AC518D670054C9585E59BB5BB05F69624D63A1683D6B736E08 +707D91C7728078157826796D658E7D3083DC88C18F09969B5264572867507F6A +8CA151B45742962A583A698A80B454B25D0E57FC78959DFA4F5C524A548B643E +6628671467F57A847B567D22932F685C9BAD7B395319518A5237000000000000 +8E +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +5BDF62F664AE64E6672D6BBA85A996D176909BD6634C93069BAB76BF66524E09 +509853C25C7160E864926563685F71E673CA75237B977E8286958B838CDB9178 +991065AC66AB6B8B4ED54ED44F3A4F7F523A53F853F255E356DB58EB59CB59C9 +59FF5B505C4D5E025E2B5FD7601D6307652F5B5C65AF65BD65E8679D6B620000 +6B7B6C0F7345794979C17CF87D197D2B80A2810281F389968A5E8A698A668A8C +8AEE8CC78CDC96CC98FC6B6F4E8B4F3C4F8D51505B575BFA6148630166426B21 +6ECB6CBB723E74BD75D478C1793A800C803381EA84948F9E6C509E7F5F0F8B58 +9D2B7AFA8EF85B8D96EB4E0353F157F759315AC95BA460896E7F6F0675BE8CEA +5B9F85007BE0507267F4829D5C61854A7E1E820E51995C0463688D66659C716E +793E7D1780058B1D8ECA906E86C790AA501F52FA5C3A6753707C7235914C91C8 +932B82E55BC25F3160F94E3B53D65B88624B67316B8A72E973E07A2E816B8DA3 +91529996511253D7546A5BFF63886A397DAC970056DA53CE5468000000000000 +8F +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +5B975C315DDE4FEE610162FE6D3279C079CB7D427E4D7FD281ED821F84908846 +89728B908E748F2F9031914B916C96C6919C4EC04F4F514553415F93620E67D4 +6C416E0B73637E2691CD928353D459195BBF6DD1795D7E2E7C9B587E719F51FA +88538FF04FCA5CFB662577AC7AE3821C99FF51C65FAA65EC696F6B896DF30000 +6E966F6476FE7D145DE190759187980651E6521D6240669166D96E1A5EB67DD2 +7F7266F885AF85F78AF852A953D959735E8F5F90605592E4966450B7511F52DD +5320534753EC54E8554655315617596859BE5A3C5BB55C065C0F5C115C1A5E84 +5E8A5EE05F70627F628462DB638C63776607660C662D6676677E68A26A1F6A35 +6CBC6D886E096E58713C7126716775C77701785D7901796579F07AE07B117CA7 +7D39809683D6848B8549885D88F38A1F8A3C8A548A738C618CDE91A49266937E +9418969C97984E0A4E084E1E4E575197527057CE583458CC5B225E3860C564FE +676167566D4472B675737A6384B88B7291B89320563157F498FE000000000000 +90 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +62ED690D6B9671ED7E548077827289E698DF87558FB15C3B4F384FE14FB55507 +5A205BDD5BE95FC3614E632F65B0664B68EE699B6D786DF1753375B9771F795E +79E67D3381E382AF85AA89AA8A3A8EAB8F9B903291DD97074EBA4EC152035875 +58EC5C0B751A5C3D814E8A0A8FC59663976D7B258ACF9808916256F353A80000 +9017543957825E2563A86C34708A77617C8B7FE088709042915493109318968F +745E9AC45D075D69657067A28DA896DB636E6749691983C5981796C088FE6F84 +647A5BF84E16702C755D662F51C4523652E259D35F8160276210653F6574661F +667468F268166B636E057272751F76DB7CBE805658F088FD897F8AA08A938ACB +901D91929752975965897A0E810696BB5E2D60DC621A65A56614679077F37A4D +7C4D7E3E810A8CAC8D648DE18E5F78A9520762D963A5644262988A2D7A837BC0 +8AAC96EA7D76820C87494ED95148534353605BA35C025C165DDD6226624764B0 +681368346CC96D456D1767D36F5C714E717D65CB7A7F7BAD7DDA000000000000 +91 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +7E4A7FA8817A821B823985A68A6E8CCE8DF59078907792AD929195839BAE524D +55846F387136516879857E5581B37CCE564C58515CA863AA66FE66FD695A72D9 +758F758E790E795679DF7C977D207D4486078A34963B90619F2050E7527553CC +53E2500955AA58EE594F723D5B8B5C64531D60E360F3635C6383633F63BB0000 +64CD65E966F95DE369CD69FD6F1571E54E8975E976F87A937CDF7DCF7D9C8061 +83498358846C84BC85FB88C58D709001906D9397971C9A1250CF5897618E81D3 +85358D0890204FC3507452475373606F6349675F6E2C8DB3901F4FD75C5E8CCA +65CF7D9A53528896517663C35B585B6B5C0A640D6751905C4ED6591A592A6C70 +8A51553E581559A560F0625367C182356955964099C49A284F5358065BFE8010 +5CB15E2F5F856020614B623466FF6CF06EDE80CE817F82D4888B8CB89000902E +968A9EDB9BDB4EE353F059277B2C918D984C9DF96EDD7027535355445B856258 +629E62D36CA26FEF74228A1794386FC18AFE833851E786F853EA000000000000 +92 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +53E94F4690548FB0596A81315DFD7AEA8FBF68DA8C3772F89C486A3D8AB04E39 +53585606576662C563A265E66B4E6DE16E5B70AD77ED7AEF7BAA7DBB803D80C6 +86CB8A95935B56E358C75F3E65AD66966A806BB575378AC7502477E557305F1B +6065667A6C6075F47A1A7F6E81F48718904599B37BC9755C7AF97B5184C40000 +901079E97A9283365AE177404E2D4EF25B995FE062BD663C67F16CE8866B8877 +8A3B914E92F399D06A177026732A82E784578CAF4E01514651CB558B5BF55E16 +5E335E815F145F355F6B5FB461F2631166A2671D6F6E7252753A773A80748139 +817887768ABF8ADC8D858DF3929A957798029CE552C5635776F467156C8873CD +8CC393AE96736D25589C690E69CC8FFD939A75DB901A585A680263B469FB4F43 +6F2C67D88FBB85267DB49354693F6F70576A58F75B2C7D2C722A540A91E39DB4 +4EAD4F4E505C507552438C9E544858245B9A5E1D5E955EAD5EF75F1F608C62B5 +633A63D068AF6C407887798E7A0B7DE082478A028AE68E449013000000000000 +93 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +90B8912D91D89F0E6CE5645864E265756EF476847B1B906993D16EBA54F25FB9 +64A48F4D8FED92445178586B59295C555E976DFB7E8F751C8CBC8EE2985B70B9 +4F1D6BBF6FB1753096FB514E54105835585759AC5C605F926597675C6E21767B +83DF8CED901490FD934D7825783A52AA5EA6571F597460125012515A51AC0000 +51CD520055105854585859575B955CF65D8B60BC6295642D6771684368BC68DF +76D76DD86E6F6D9B706F71C85F5375D879777B497B547B527CD67D7152308463 +856985E48A0E8B048C468E0F9003900F94199676982D9A3095D850CD52D5540C +58025C0E61A7649E6D1E77B37AE580F48404905392855CE09D07533F5F975FB3 +6D9C7279776379BF7BE46BD272EC8AAD68036A6151F87A8169345C4A9CF682EB +5BC59149701E56785C6F60C765666C8C8C5A90419813545166C7920D594890A3 +51854E4D51EA85998B0E7058637A934B696299B47E047577535769608EDF96E3 +6C5D4E8C5C3C5F108FE953028CD1808986795EFF65E54E735165000000000000 +94 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +59825C3F97EE4EFB598A5FCD8A8D6FE179B079625BE78471732B71B15E745FF5 +637B649A71C37C984E435EFC4E4B57DC56A260A96FC37D0D80FD813381BF8FB2 +899786A45DF4628A64AD898767776CE26D3E743678345A467F7582AD99AC4FF3 +5EC362DD63926557676F76C3724C80CC80BA8F29914D500D57F95A9268850000 +6973716472FD8CB758F28CE0966A9019877F79E477E784294F2F5265535A62CD +67CF6CCA767D7B947C95823685848FEB66DD6F2072067E1B83AB99C19EA651FD +7BB178727BB880877B486AE85E61808C75517560516B92626E8C767A91979AEA +4F107F70629C7B4F95A59CE9567A585986E496BC4F345224534A53CD53DB5E06 +642C6591677F6C3E6C4E724872AF73ED75547E41822C85E98CA97BC491C67169 +981298EF633D6669756A76E478D0854386EE532A5351542659835E875F7C60B2 +6249627962AB65906BD46CCC75B276AE789179D87DCB7F7780A588AB8AB98CBB +907F975E98DB6A0B7C3850995C3E5FAE67876BD8743577097F8E000000000000 +95 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +9F3B67CA7A175339758B9AED5F66819D83F180985F3C5FC575627B46903C6867 +59EB5A9B7D10767E8B2C4FF55F6A6A196C376F0274E2796888688A558C795EDF +63CF75C579D282D7932892F2849C86ED9C2D54C15F6C658C6D5C70158CA78CD3 +983B654F74F64E0D4ED857E0592B5A665BCC51A85E035E9C6016627665770000 +65A7666E6D6E72367B268150819A82998B5C8CA08CE68D74961C96444FAE64AB +6B66821E8461856A90E85C01695398A8847A85574F0F526F5FA95E45670D798F +8179890789866DF55F1762556CB84ECF72699B925206543B567458B361A4626E +711A596E7C897CDE7D1B96F06587805E4E194F75517558405E635E735F0A67C4 +4E26853D9589965B7C73980150FB58C1765678A7522577A585117B86504F5909 +72477BC77DE88FBA8FD4904D4FBF52C95A295F0197AD4FDD821792EA57036355 +6B69752B88DC8F147A4252DF58936155620A66AE6BCD7C3F83E950234FF85305 +5446583159495B9D5CF05CEF5D295E9662B16367653E65B9670B000000000000 +96 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +6CD56CE170F978327E2B80DE82B3840C84EC870289128A2A8C4A90A692D298FD +9CF39D6C4E4F4EA1508D5256574A59A85E3D5FD85FD9623F66B4671B67D068D2 +51927D2180AA81A88B008C8C8CBF927E96325420982C531750D5535C58A864B2 +6734726777667A4691E652C36CA16B8658005E4C5954672C7FFB51E176C60000 +646978E89B549EBB57CB59B96627679A6BCE54E969D95E55819C67959BAA67FE +9C52685D4EA64FE353C862B9672B6CAB8FC44FAD7E6D9EBF4E0761626E806F2B +85135473672A9B455DF37B955CAC5BC6871C6E4A84D17A14810859997C8D6C11 +772052D959227121725F77DB97279D61690B5A7F5A1851A5540D547D660E76DF +8FF792989CF459EA725D6EC5514D68C97DBF7DEC97629EBA64786A2183025984 +5B5F6BDB731B76F27DB280178499513267289ED976EE676252FF99055C24623B +7C7E8CB0554F60B67D0B958053014E5F51B6591C723A803691CE5F2577E25384 +5F797D0485AC8A338E8D975667F385AE9453610961086CB9765200000000FF5E +97 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +8AED8F38552F4F51512A52C753CB5BA55E7D60A0618263D6670967DA6E676D8C +733673377531795088D58A98904A909190F596C4878D59154E884F594E0E8A89 +8F3F981050AD5E7C59965BB95EB863DA63FA64C166DC694A69D86D0B6EB67194 +75287AAF7F8A8000844984C989818B218E0A9065967D990A617E62916B320000 +6C836D747FCC7FFC6DC07F8587BA88F8676583B1983C96F76D1B7D61843D916A +4E7153755D506B046FEB85CD862D89A75229540F5C65674E68A87406748375E2 +88CF88E191CC96E296785F8B73877ACB844E63A0756552896D416E9C74097559 +786B7C9296867ADC9F8D4FB6616E65C5865C4E864EAE50DA4E2151CC5BEE6599 +68816DBC731F764277AD7A1C7CE7826F8AD2907C91CF96759818529B7DD1502B +539867976DCB71D0743381E88F2A96A39C579E9F746058416D997D2F985E4EE4 +4F364F8B51B752B15DBA601C73B2793C82D3923496B796F6970A9E979F6266A6 +6B74521752A370C888C25EC9604B61906F2371497C3E7DF4806F000000000000 +98 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +84EE9023932C54429B6F6AD370898CC28DEF973252B45A415ECA5F046717697C +69946D6A6F0F726272FC7BED8001807E874B90CE516D9E937984808B93328AD6 +502D548C8A716B6A8CC4810760D167A09DF24E994E989C108A6B85C185686900 +6E7E789781550000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000005F0C +4E104E154E2A4E314E364E3C4E3F4E424E564E584E824E858C6B4E8A82125F0D +4E8E4E9E4E9F4EA04EA24EB04EB34EB64ECE4ECD4EC44EC64EC24ED74EDE4EED +4EDF4EF74F094F5A4F304F5B4F5D4F574F474F764F884F8F4F984F7B4F694F70 +4F914F6F4F864F9651184FD44FDF4FCE4FD84FDB4FD14FDA4FD04FE44FE5501A +50285014502A502550054F1C4FF650215029502C4FFE4FEF5011500650435047 +6703505550505048505A5056506C50785080509A508550B450B2000000000000 +99 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +50C950CA50B350C250D650DE50E550ED50E350EE50F950F55109510151025116 +51155114511A5121513A5137513C513B513F51405152514C515451627AF85169 +516A516E5180518256D8518C5189518F519151935195519651A451A651A251A9 +51AA51AB51B351B151B251B051B551BD51C551C951DB51E0865551E951ED0000 +51F051F551FE5204520B5214520E5227522A522E52335239524F5244524B524C +525E5254526A527452695273527F527D528D529452925271528852918FA88FA7 +52AC52AD52BC52B552C152CD52D752DE52E352E698ED52E052F352F552F852F9 +530653087538530D5310530F5315531A5323532F533153335338534053465345 +4E175349534D51D6535E5369536E5918537B53775382539653A053A653A553AE +53B053B653C37C1296D953DF66FC71EE53EE53E853ED53FA5401543D5440542C +542D543C542E54365429541D544E548F5475548E545F5471547754705492547B +5480547654845490548654C754A254B854A554AC54C454C854A8000000000000 +9A +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +54AB54C254A454BE54BC54D854E554E6550F551454FD54EE54ED54FA54E25539 +55405563554C552E555C55455556555755385533555D5599558054AF558A559F +557B557E5598559E55AE557C558355A9558755A855DA55C555DF55C455DC55E4 +55D4561455F7561655FE55FD561B55F9564E565071DF56345636563256380000 +566B5664562F566C566A56865680568A56A05694568F56A556AE56B656B456C2 +56BC56C156C356C056C856CE56D156D356D756EE56F9570056FF570457095708 +570B570D57135718571655C7571C572657375738574E573B5740574F576957C0 +57885761577F5789579357A057B357A457AA57B057C357C657D457D257D3580A +57D657E3580B5819581D587258215862584B58706BC05852583D5879588558B9 +589F58AB58BA58DE58BB58B858AE58C558D358D158D758D958D858E558DC58E4 +58DF58EF58FA58F958FB58FC58FD5902590A5910591B68A65925592C592D5932 +5938593E7AD259555950594E595A5958596259605967596C5969000000000000 +9B +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +59785981599D4F5E4FAB59A359B259C659E859DC598D59D959DA5A255A1F5A11 +5A1C5A095A1A5A405A6C5A495A355A365A625A6A5A9A5ABC5ABE5ACB5AC25ABD +5AE35AD75AE65AE95AD65AFA5AFB5B0C5B0B5B165B325AD05B2A5B365B3E5B43 +5B455B405B515B555B5A5B5B5B655B695B705B735B755B7865885B7A5B800000 +5B835BA65BB85BC35BC75BC95BD45BD05BE45BE65BE25BDE5BE55BEB5BF05BF6 +5BF35C055C075C085C0D5C135C205C225C285C385C395C415C465C4E5C535C50 +5C4F5B715C6C5C6E4E625C765C795C8C5C915C94599B5CAB5CBB5CB65CBC5CB7 +5CC55CBE5CC75CD95CE95CFD5CFA5CED5D8C5CEA5D0B5D155D175D5C5D1F5D1B +5D115D145D225D1A5D195D185D4C5D525D4E5D4B5D6C5D735D765D875D845D82 +5DA25D9D5DAC5DAE5DBD5D905DB75DBC5DC95DCD5DD35DD25DD65DDB5DEB5DF2 +5DF55E0B5E1A5E195E115E1B5E365E375E445E435E405E4E5E575E545E5F5E62 +5E645E475E755E765E7A9EBC5E7F5EA05EC15EC25EC85ED05ECF000000000000 +9C +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +5ED65EE35EDD5EDA5EDB5EE25EE15EE85EE95EEC5EF15EF35EF05EF45EF85EFE +5F035F095F5D5F5C5F0B5F115F165F295F2D5F385F415F485F4C5F4E5F2F5F51 +5F565F575F595F615F6D5F735F775F835F825F7F5F8A5F885F915F875F9E5F99 +5F985FA05FA85FAD5FBC5FD65FFB5FE45FF85FF15FDD60B35FFF602160600000 +601960106029600E6031601B6015602B6026600F603A605A6041606A6077605F +604A6046604D6063604360646042606C606B60596081608D60E76083609A6084 +609B60966097609260A7608B60E160B860E060D360B45FF060BD60C660B560D8 +614D6115610660F660F7610060F460FA6103612160FB60F1610D610E6147613E +61286127614A613F613C612C6134613D614261446173617761586159615A616B +6174616F61656171615F615D6153617561996196618761AC6194619A618A6191 +61AB61AE61CC61CA61C961F761C861C361C661BA61CB7F7961CD61E661E361F6 +61FA61F461FF61FD61FC61FE620062086209620D620C6214621B000000000000 +9D +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +621E6221622A622E6230623262336241624E625E6263625B62606268627C6282 +6289627E62926293629662D46283629462D762D162BB62CF62FF62C664D462C8 +62DC62CC62CA62C262C7629B62C9630C62EE62F163276302630862EF62F56350 +633E634D641C634F6396638E638063AB637663A3638F6389639F63B5636B0000 +636963BE63E963C063C663E363C963D263F663C4641664346406641364266436 +651D64176428640F6467646F6476644E652A6495649364A564A9648864BC64DA +64D264C564C764BB64D864C264F164E7820964E064E162AC64E364EF652C64F6 +64F464F264FA650064FD6518651C650565246523652B65346535653765366538 +754B654865566555654D6558655E655D65726578658265838B8A659B659F65AB +65B765C365C665C165C465CC65D265DB65D965E065E165F16772660A660365FB +6773663566366634661C664F664466496641665E665D666466676668665F6662 +667066836688668E668966846698669D66C166B966C966BE66BC000000000000 +9E +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +66C466B866D666DA66E0663F66E666E966F066F566F7670F6716671E67266727 +9738672E673F67366741673867376746675E67606759676367646789677067A9 +677C676A678C678B67A667A1678567B767EF67B467EC67B367E967B867E467DE +67DD67E267EE67B967CE67C667E76A9C681E684668296840684D6832684E0000 +68B3682B685968636877687F689F688F68AD6894689D689B68836AAE68B96874 +68B568A068BA690F688D687E690168CA690868D86922692668E1690C68CD68D4 +68E768D569366912690468D768E3692568F968E068EF6928692A691A69236921 +68C669796977695C6978696B6954697E696E69396974693D695969306961695E +695D6981696A69B269AE69D069BF69C169D369BE69CE5BE869CA69DD69BB69C3 +69A76A2E699169A0699C699569B469DE69E86A026A1B69FF6B0A69F969F269E7 +6A0569B16A1E69ED6A1469EB6A0A6A126AC16A236A136A446A0C6A726A366A78 +6A476A626A596A666A486A386A226A906A8D6AA06A846AA26AA3000000000000 +9F +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +6A9786176ABB6AC36AC26AB86AB36AAC6ADE6AD16ADF6AAA6ADA6AEA6AFB6B05 +86166AFA6B126B169B316B1F6B386B3776DC6B3998EE6B476B436B496B506B59 +6B546B5B6B5F6B616B786B796B7F6B806B846B836B8D6B986B956B9E6BA46BAA +6BAB6BAF6BB26BB16BB36BB76BBC6BC66BCB6BD36BDF6BEC6BEB6BF36BEF0000 +9EBE6C086C136C146C1B6C246C236C5E6C556C626C6A6C826C8D6C9A6C816C9B +6C7E6C686C736C926C906CC46CF16CD36CBD6CD76CC56CDD6CAE6CB16CBE6CBA +6CDB6CEF6CD96CEA6D1F884D6D366D2B6D3D6D386D196D356D336D126D0C6D63 +6D936D646D5A6D796D596D8E6D956FE46D856DF96E156E0A6DB56DC76DE66DB8 +6DC66DEC6DDE6DCC6DE86DD26DC56DFA6DD96DE46DD56DEA6DEE6E2D6E6E6E2E +6E196E726E5F6E3E6E236E6B6E2B6E766E4D6E1F6E436E3A6E4E6E246EFF6E1D +6E386E826EAA6E986EC96EB76ED36EBD6EAF6EC46EB26ED46ED56E8F6EA56EC2 +6E9F6F416F11704C6EEC6EF86EFE6F3F6EF26F316EEF6F326ECC000000000000 +E0 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +6F3E6F136EF76F866F7A6F786F816F806F6F6F5B6FF36F6D6F826F7C6F586F8E +6F916FC26F666FB36FA36FA16FA46FB96FC66FAA6FDF6FD56FEC6FD46FD86FF1 +6FEE6FDB7009700B6FFA70117001700F6FFE701B701A6F74701D7018701F7030 +703E7032705170637099709270AF70F170AC70B870B370AE70DF70CB70DD0000 +70D9710970FD711C711971657155718871667162714C7156716C718F71FB7184 +719571A871AC71D771B971BE71D271C971D471CE71E071EC71E771F571FC71F9 +71FF720D7210721B7228722D722C72307232723B723C723F72407246724B7258 +7274727E7282728172877292729672A272A772B972B272C372C672C472CE72D2 +72E272E072E172F972F7500F7317730A731C7316731D7334732F73297325733E +734E734F9ED87357736A7368737073787375737B737A73C873B373CE73BB73C0 +73E573EE73DE74A27405746F742573F87432743A7455743F745F74597441745C +746974707463746A7476747E748B749E74A774CA74CF74D473F1000000000000 +E1 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +74E074E374E774E974EE74F274F074F174F874F7750475037505750C750E750D +75157513751E7526752C753C7544754D754A7549755B7546755A756975647567 +756B756D75787576758675877574758A758975827594759A759D75A575A375C2 +75B375C375B575BD75B875BC75B175CD75CA75D275D975E375DE75FE75FF0000 +75FC760175F075FA75F275F3760B760D7609761F762776207621762276247634 +7630763B764776487646765C76587661766276687669766A7667766C76707672 +76767678767C768076837688768B768E769676937699769A76B076B476B876B9 +76BA76C276CD76D676D276DE76E176E576E776EA862F76FB7708770777047729 +7724771E77257726771B773777387747775A7768776B775B7765777F777E7779 +778E778B779177A0779E77B077B677B977BF77BC77BD77BB77C777CD77D777DA +77DC77E377EE77FC780C781279267820792A7845788E78747886787C789A788C +78A378B578AA78AF78D178C678CB78D478BE78BC78C578CA78EC000000000000 +E2 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +78E778DA78FD78F47907791279117919792C792B794079607957795F795A7955 +7953797A797F798A799D79A79F4B79AA79AE79B379B979BA79C979D579E779EC +79E179E37A087A0D7A187A197A207A1F79807A317A3B7A3E7A377A437A577A49 +7A617A627A699F9D7A707A797A7D7A887A977A957A987A967AA97AC87AB00000 +7AB67AC57AC47ABF90837AC77ACA7ACD7ACF7AD57AD37AD97ADA7ADD7AE17AE2 +7AE67AED7AF07B027B0F7B0A7B067B337B187B197B1E7B357B287B367B507B7A +7B047B4D7B0B7B4C7B457B757B657B747B677B707B717B6C7B6E7B9D7B987B9F +7B8D7B9C7B9A7B8B7B927B8F7B5D7B997BCB7BC17BCC7BCF7BB47BC67BDD7BE9 +7C117C147BE67BE57C607C007C077C137BF37BF77C177C0D7BF67C237C277C2A +7C1F7C377C2B7C3D7C4C7C437C547C4F7C407C507C587C5F7C647C567C657C6C +7C757C837C907CA47CAD7CA27CAB7CA17CA87CB37CB27CB17CAE7CB97CBD7CC0 +7CC57CC27CD87CD27CDC7CE29B3B7CEF7CF27CF47CF67CFA7D06000000000000 +E3 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +7D027D1C7D157D0A7D457D4B7D2E7D327D3F7D357D467D737D567D4E7D727D68 +7D6E7D4F7D637D937D897D5B7D8F7D7D7D9B7DBA7DAE7DA37DB57DC77DBD7DAB +7E3D7DA27DAF7DDC7DB87D9F7DB07DD87DDD7DE47DDE7DFB7DF27DE17E057E0A +7E237E217E127E317E1F7E097E0B7E227E467E667E3B7E357E397E437E370000 +7E327E3A7E677E5D7E567E5E7E597E5A7E797E6A7E697E7C7E7B7E837DD57E7D +8FAE7E7F7E887E897E8C7E927E907E937E947E967E8E7E9B7E9C7F387F3A7F45 +7F4C7F4D7F4E7F507F517F557F547F587F5F7F607F687F697F677F787F827F86 +7F837F887F877F8C7F947F9E7F9D7F9A7FA37FAF7FB27FB97FAE7FB67FB88B71 +7FC57FC67FCA7FD57FD47FE17FE67FE97FF37FF998DC80068004800B80128018 +8019801C80218028803F803B804A804680528058805A805F8062806880738072 +807080768079807D807F808480868085809B8093809A80AD519080AC80DB80E5 +80D980DD80C480DA80D6810980EF80F1811B81298123812F814B000000000000 +E4 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +968B8146813E8153815180FC8171816E81658166817481838188818A81808182 +81A0819581A481A3815F819381A981B081B581BE81B881BD81C081C281BA81C9 +81CD81D181D981D881C881DA81DF81E081E781FA81FB81FE8201820282058207 +820A820D821082168229822B82388233824082598258825D825A825F82640000 +82628268826A826B822E827182778278827E828D829282AB829F82BB82AC82E1 +82E382DF82D282F482F382FA8393830382FB82F982DE830682DC830982D98335 +83348316833283318340833983508345832F832B831783188385839A83AA839F +83A283968323838E8387838A837C83B58373837583A0838983A883F4841383EB +83CE83FD840383D8840B83C183F7840783E083F2840D8422842083BD84388506 +83FB846D842A843C855A84848477846B84AD846E848284698446842C846F8479 +843584CA846284B984BF849F84D984CD84BB84DA84D084C184C684D684A18521 +84FF84F485178518852C851F8515851484FC8540856385588548000000000000 +E5 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +85418602854B8555858085A485888591858A85A8856D8594859B85EA8587859C +8577857E859085C985BA85CF85B985D085D585DD85E585DC85F9860A8613860B +85FE85FA86068622861A8630863F864D4E558654865F86678671869386A386A9 +86AA868B868C86B686AF86C486C686B086C9882386AB86D486DE86E986EC0000 +86DF86DB86EF8712870687088700870386FB87118709870D86F9870A8734873F +8737873B87258729871A8760875F8778874C874E877487578768876E87598753 +8763876A880587A2879F878287AF87CB87BD87C087D096D687AB87C487B387C7 +87C687BB87EF87F287E0880F880D87FE87F687F7880E87D28811881688158822 +88218831883688398827883B8844884288528859885E8862886B8881887E889E +8875887D88B5887288828897889288AE889988A2888D88A488B088BF88B188C3 +88C488D488D888D988DD88F9890288FC88F488E888F28904890C890A89138943 +891E8925892A892B89418944893B89368938894C891D8960895E000000000000 +E6 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +89668964896D896A896F89748977897E89838988898A8993899889A189A989A6 +89AC89AF89B289BA89BD89BF89C089DA89DC89DD89E789F489F88A038A168A10 +8A0C8A1B8A1D8A258A368A418A5B8A528A468A488A7C8A6D8A6C8A628A858A82 +8A848AA88AA18A918AA58AA68A9A8AA38AC48ACD8AC28ADA8AEB8AF38AE70000 +8AE48AF18B148AE08AE28AF78ADE8ADB8B0C8B078B1A8AE18B168B108B178B20 +8B3397AB8B268B2B8B3E8B288B418B4C8B4F8B4E8B498B568B5B8B5A8B6B8B5F +8B6C8B6F8B748B7D8B808B8C8B8E8B928B938B968B998B9A8C3A8C418C3F8C48 +8C4C8C4E8C508C558C628C6C8C788C7A8C828C898C858C8A8C8D8C8E8C948C7C +8C98621D8CAD8CAA8CBD8CB28CB38CAE8CB68CC88CC18CE48CE38CDA8CFD8CFA +8CFB8D048D058D0A8D078D0F8D0D8D109F4E8D138CCD8D148D168D678D6D8D71 +8D738D818D998DC28DBE8DBA8DCF8DDA8DD68DCC8DDB8DCB8DEA8DEB8DDF8DE3 +8DFC8E088E098DFF8E1D8E1E8E108E1F8E428E358E308E348E4A000000000000 +E7 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +8E478E498E4C8E508E488E598E648E608E2A8E638E558E768E728E7C8E818E87 +8E858E848E8B8E8A8E938E918E948E998EAA8EA18EAC8EB08EC68EB18EBE8EC5 +8EC88ECB8EDB8EE38EFC8EFB8EEB8EFE8F0A8F058F158F128F198F138F1C8F1F +8F1B8F0C8F268F338F3B8F398F458F428F3E8F4C8F498F468F4E8F578F5C0000 +8F628F638F648F9C8F9F8FA38FAD8FAF8FB78FDA8FE58FE28FEA8FEF90878FF4 +90058FF98FFA901190159021900D901E9016900B90279036903590398FF8904F +905090519052900E9049903E90569058905E9068906F907696A890729082907D +90819080908A9089908F90A890AF90B190B590E290E4624890DB910291129119 +91329130914A9156915891639165916991739172918B9189918291A291AB91AF +91AA91B591B491BA91C091C191C991CB91D091D691DF91E191DB91FC91F591F6 +921E91FF9214922C92159211925E925792459249926492489295923F924B9250 +929C92969293929B925A92CF92B992B792E9930F92FA9344932E000000000000 +E8 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +93199322931A9323933A9335933B935C9360937C936E935693B093AC93AD9394 +93B993D693D793E893E593D893C393DD93D093C893E4941A9414941394039407 +94109436942B94359421943A944194529444945B94609462945E946A92299470 +94759477947D945A947C947E9481947F95829587958A95949596959895990000 +95A095A895A795AD95BC95BB95B995BE95CA6FF695C395CD95CC95D595D495D6 +95DC95E195E595E296219628962E962F9642964C964F964B9677965C965E965D +965F96669672966C968D96989695969796AA96A796B196B296B096B496B696B8 +96B996CE96CB96C996CD894D96DC970D96D596F99704970697089713970E9711 +970F971697199724972A97309739973D973E97449746974897429749975C9760 +97649766976852D2976B977197799785977C9781977A9786978B978F9790979C +97A897A697A397B397B497C397C697C897CB97DC97ED9F4F97F27ADF97F697F5 +980F980C9838982498219837983D9846984F984B986B986F9870000000000000 +E9 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +98719874987398AA98AF98B198B698C498C398C698E998EB9903990999129914 +99189921991D991E99249920992C992E993D993E9942994999459950994B9951 +9952994C99559997999899A599AD99AE99BC99DF99DB99DD99D899D199ED99EE +99F199F299FB99F89A019A0F9A0599E29A199A2B9A379A459A429A409A430000 +9A3E9A559A4D9A5B9A579A5F9A629A659A649A699A6B9A6A9AAD9AB09ABC9AC0 +9ACF9AD19AD39AD49ADE9ADF9AE29AE39AE69AEF9AEB9AEE9AF49AF19AF79AFB +9B069B189B1A9B1F9B229B239B259B279B289B299B2A9B2E9B2F9B329B449B43 +9B4F9B4D9B4E9B519B589B749B939B839B919B969B979B9F9BA09BA89BB49BC0 +9BCA9BB99BC69BCF9BD19BD29BE39BE29BE49BD49BE19C3A9BF29BF19BF09C15 +9C149C099C139C0C9C069C089C129C0A9C049C2E9C1B9C259C249C219C309C47 +9C329C469C3E9C5A9C609C679C769C789CE79CEC9CF09D099D089CEB9D039D06 +9D2A9D269DAF9D239D1F9D449D159D129D419D3F9D3E9D469D48000000000000 +EA +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +9D5D9D5E9D649D519D509D599D729D899D879DAB9D6F9D7A9D9A9DA49DA99DB2 +9DC49DC19DBB9DB89DBA9DC69DCF9DC29DD99DD39DF89DE69DED9DEF9DFD9E1A +9E1B9E1E9E759E799E7D9E819E889E8B9E8C9E929E959E919E9D9EA59EA99EB8 +9EAA9EAD97619ECC9ECE9ECF9ED09ED49EDC9EDE9EDD9EE09EE59EE89EEF0000 +9EF49EF69EF79EF99EFB9EFC9EFD9F079F0876B79F159F219F2C9F3E9F4A9F52 +9F549F639F5F9F609F619F669F679F6C9F6A9F779F729F769F959F9C9FA0582F +69C79059746451DC719900000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +R +8160 301C FF5E +8161 2016 2225 +817C 2212 FF0D +8191 00A2 FFE0 +8192 00A3 FFE1 +81CA 00AC FFE2 diff --git a/env/tcl/tcl8.6/encoding/symbol.enc b/env/tcl/tcl8.6/encoding/symbol.enc new file mode 100644 index 0000000..ffda9e3 --- /dev/null +++ b/env/tcl/tcl8.6/encoding/symbol.enc @@ -0,0 +1,20 @@ +# Encoding file: symbol, single-byte +S +003F 1 1 +00 +0000000100020003000400050006000700080009000A000B000C000D000E000F +0010001100120013001400150016001700180019001A001B001C001D001E001F +0020002122000023220300250026220D002800292217002B002C2212002E002F +0030003100320033003400350036003700380039003A003B003C003D003E003F +22450391039203A70394039503A603930397039903D1039A039B039C039D039F +03A0039803A103A303A403A503C203A9039E03A80396005B2234005D22A5005F +F8E503B103B203C703B403B503C603B303B703B903D503BA03BB03BC03BD03BF +03C003B803C103C303C403C503D603C903BE03C803B6007B007C007D223C007F +0080008100820083008400850086008700880089008A008B008C008D008E008F +0090009100920093009400950096009700980099009A009B009C009D009E009F +000003D2203222642044221E0192266326662665266021942190219121922193 +00B000B12033226500D7221D2202202200F72260226122482026F8E6F8E721B5 +21352111211C21182297229522052229222A2283228722842282228622082209 +2220220700AE00A92122220F221A22C500AC2227222821D421D021D121D221D3 +22C42329F8E8F8E9F8EA2211F8EBF8ECF8EDF8EEF8EFF8F0F8F1F8F2F8F3F8F4 +F8FF232A222B2320F8F52321F8F6F8F7F8F8F8F9F8FAF8FBF8FCF8FDF8FE0000 diff --git a/env/tcl/tcl8.6/encoding/tis-620.enc b/env/tcl/tcl8.6/encoding/tis-620.enc new file mode 100644 index 0000000..c233be5 --- /dev/null +++ b/env/tcl/tcl8.6/encoding/tis-620.enc @@ -0,0 +1,20 @@ +# Encoding file: tis-620, single-byte +S +003F 0 1 +00 +0000000100020003000400050006000700080009000A000B000C000D000E000F +0010001100120013001400150016001700180019001A001B001C001D001E001F +0020002100220023002400250026002700280029002A002B002C002D002E002F +0030003100320033003400350036003700380039003A003B003C003D003E003F +0040004100420043004400450046004700480049004A004B004C004D004E004F +0050005100520053005400550056005700580059005A005B005C005D005E005F +0060006100620063006400650066006700680069006A006B006C006D006E006F +0070007100720073007400750076007700780079007A007B007C007D007E0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00000E010E020E030E040E050E060E070E080E090E0A0E0B0E0C0E0D0E0E0E0F +0E100E110E120E130E140E150E160E170E180E190E1A0E1B0E1C0E1D0E1E0E1F +0E200E210E220E230E240E250E260E270E280E290E2A0E2B0E2C0E2D0E2E0E2F +0E300E310E320E330E340E350E360E370E380E390E3A00000000000000000E3F +0E400E410E420E430E440E450E460E470E480E490E4A0E4B0E4C0E4D0E4E0E4F +0E500E510E520E530E540E550E560E570E580E590E5A0E5B0000000000000000 \ No newline at end of file diff --git a/env/tcl/tcl8.6/history.tcl b/env/tcl/tcl8.6/history.tcl new file mode 100644 index 0000000..ef9099b --- /dev/null +++ b/env/tcl/tcl8.6/history.tcl @@ -0,0 +1,335 @@ +# history.tcl -- +# +# Implementation of the history command. +# +# Copyright (c) 1997 Sun Microsystems, Inc. +# +# See the file "license.terms" for information on usage and redistribution of +# this file, and for a DISCLAIMER OF ALL WARRANTIES. +# + +# The tcl::history array holds the history list and some additional +# bookkeeping variables. +# +# nextid the index used for the next history list item. +# keep the max size of the history list +# oldest the index of the oldest item in the history. + +namespace eval ::tcl { + variable history + if {![info exists history]} { + array set history { + nextid 0 + keep 20 + oldest -20 + } + } + + namespace ensemble create -command ::tcl::history -map { + add ::tcl::HistAdd + change ::tcl::HistChange + clear ::tcl::HistClear + event ::tcl::HistEvent + info ::tcl::HistInfo + keep ::tcl::HistKeep + nextid ::tcl::HistNextID + redo ::tcl::HistRedo + } +} + +# history -- +# +# This is the main history command. See the man page for its interface. +# This does some argument checking and calls the helper ensemble in the +# tcl namespace. + +proc ::history {args} { + # If no command given, we're doing 'history info'. Can't be done with an + # ensemble unknown handler, as those don't fire when no subcommand is + # given at all. + + if {![llength $args]} { + set args info + } + + # Tricky stuff needed to make stack and errors come out right! + tailcall apply {arglist {tailcall history {*}$arglist} ::tcl} $args +} + +# (unnamed) -- +# +# Callback when [::history] is destroyed. Destroys the implementation. +# +# Parameters: +# oldName what the command was called. +# newName what the command is now called (an empty string). +# op the operation (= delete). +# +# Results: +# none +# +# Side Effects: +# The implementation of the [::history] command ceases to exist. + +trace add command ::history delete [list apply {{oldName newName op} { + variable history + unset -nocomplain history + foreach c [info procs ::tcl::Hist*] { + rename $c {} + } + rename ::tcl::history {} +} ::tcl}] + +# tcl::HistAdd -- +# +# Add an item to the history, and optionally eval it at the global scope +# +# Parameters: +# event the command to add +# exec (optional) a substring of "exec" causes the command to +# be evaled. +# Results: +# If executing, then the results of the command are returned +# +# Side Effects: +# Adds to the history list + +proc ::tcl::HistAdd {event {exec {}}} { + variable history + + if { + [prefix longest {exec {}} $exec] eq "" + && [llength [info level 0]] == 3 + } then { + return -code error "bad argument \"$exec\": should be \"exec\"" + } + + # Do not add empty commands to the history + if {[string trim $event] eq ""} { + return "" + } + + # Maintain the history + set history([incr history(nextid)]) $event + unset -nocomplain history([incr history(oldest)]) + + # Only execute if 'exec' (or non-empty prefix of it) given + if {$exec eq ""} { + return "" + } + tailcall eval $event +} + +# tcl::HistKeep -- +# +# Set or query the limit on the length of the history list +# +# Parameters: +# limit (optional) the length of the history list +# +# Results: +# If no limit is specified, the current limit is returned +# +# Side Effects: +# Updates history(keep) if a limit is specified + +proc ::tcl::HistKeep {{count {}}} { + variable history + if {[llength [info level 0]] == 1} { + return $history(keep) + } + if {![string is integer -strict $count] || ($count < 0)} { + return -code error "illegal keep count \"$count\"" + } + set oldold $history(oldest) + set history(oldest) [expr {$history(nextid) - $count}] + for {} {$oldold <= $history(oldest)} {incr oldold} { + unset -nocomplain history($oldold) + } + set history(keep) $count +} + +# tcl::HistClear -- +# +# Erase the history list +# +# Parameters: +# none +# +# Results: +# none +# +# Side Effects: +# Resets the history array, except for the keep limit + +proc ::tcl::HistClear {} { + variable history + set keep $history(keep) + unset history + array set history [list \ + nextid 0 \ + keep $keep \ + oldest -$keep \ + ] +} + +# tcl::HistInfo -- +# +# Return a pretty-printed version of the history list +# +# Parameters: +# num (optional) the length of the history list to return +# +# Results: +# A formatted history list + +proc ::tcl::HistInfo {{count {}}} { + variable history + if {[llength [info level 0]] == 1} { + set count [expr {$history(keep) + 1}] + } elseif {![string is integer -strict $count]} { + return -code error "bad integer \"$count\"" + } + set result {} + set newline "" + for {set i [expr {$history(nextid) - $count + 1}]} \ + {$i <= $history(nextid)} {incr i} { + if {![info exists history($i)]} { + continue + } + set cmd [string map [list \n \n\t] [string trimright $history($i) \ \n]] + append result $newline[format "%6d %s" $i $cmd] + set newline \n + } + return $result +} + +# tcl::HistRedo -- +# +# Fetch the previous or specified event, execute it, and then replace +# the current history item with that event. +# +# Parameters: +# event (optional) index of history item to redo. Defaults to -1, +# which means the previous event. +# +# Results: +# Those of the command being redone. +# +# Side Effects: +# Replaces the current history list item with the one being redone. + +proc ::tcl::HistRedo {{event -1}} { + variable history + + set i [HistIndex $event] + if {$i == $history(nextid)} { + return -code error "cannot redo the current event" + } + set cmd $history($i) + HistChange $cmd 0 + tailcall eval $cmd +} + +# tcl::HistIndex -- +# +# Map from an event specifier to an index in the history list. +# +# Parameters: +# event index of history item to redo. +# If this is a positive number, it is used directly. +# If it is a negative number, then it counts back to a previous +# event, where -1 is the most recent event. +# A string can be matched, either by being the prefix of a +# command or by matching a command with string match. +# +# Results: +# The index into history, or an error if the index didn't match. + +proc ::tcl::HistIndex {event} { + variable history + if {![string is integer -strict $event]} { + for {set i [expr {$history(nextid)-1}]} {[info exists history($i)]} \ + {incr i -1} { + if {[string match $event* $history($i)]} { + return $i + } + if {[string match $event $history($i)]} { + return $i + } + } + return -code error "no event matches \"$event\"" + } elseif {$event <= 0} { + set i [expr {$history(nextid) + $event}] + } else { + set i $event + } + if {$i <= $history(oldest)} { + return -code error "event \"$event\" is too far in the past" + } + if {$i > $history(nextid)} { + return -code error "event \"$event\" hasn't occured yet" + } + return $i +} + +# tcl::HistEvent -- +# +# Map from an event specifier to the value in the history list. +# +# Parameters: +# event index of history item to redo. See index for a description of +# possible event patterns. +# +# Results: +# The value from the history list. + +proc ::tcl::HistEvent {{event -1}} { + variable history + set i [HistIndex $event] + if {![info exists history($i)]} { + return "" + } + return [string trimright $history($i) \ \n] +} + +# tcl::HistChange -- +# +# Replace a value in the history list. +# +# Parameters: +# newValue The new value to put into the history list. +# event (optional) index of history item to redo. See index for a +# description of possible event patterns. This defaults to 0, +# which specifies the current event. +# +# Side Effects: +# Changes the history list. + +proc ::tcl::HistChange {newValue {event 0}} { + variable history + set i [HistIndex $event] + set history($i) $newValue +} + +# tcl::HistNextID -- +# +# Returns the number of the next history event. +# +# Parameters: +# None. +# +# Side Effects: +# None. + +proc ::tcl::HistNextID {} { + variable history + return [expr {$history(nextid) + 1}] +} + +return + +# Local Variables: +# mode: tcl +# fill-column: 78 +# End: diff --git a/env/tcl/tcl8.6/http1.0/http.tcl b/env/tcl/tcl8.6/http1.0/http.tcl new file mode 100644 index 0000000..8329de4 --- /dev/null +++ b/env/tcl/tcl8.6/http1.0/http.tcl @@ -0,0 +1,377 @@ +# http.tcl +# Client-side HTTP for GET, POST, and HEAD commands. +# These routines can be used in untrusted code that uses the Safesock +# security policy. +# These procedures use a callback interface to avoid using vwait, +# which is not defined in the safe base. +# +# See the http.n man page for documentation + +package provide http 1.0 + +array set http { + -accept */* + -proxyhost {} + -proxyport {} + -useragent {Tcl http client package 1.0} + -proxyfilter httpProxyRequired +} +proc http_config {args} { + global http + set options [lsort [array names http -*]] + set usage [join $options ", "] + if {[llength $args] == 0} { + set result {} + foreach name $options { + lappend result $name $http($name) + } + return $result + } + regsub -all -- - $options {} options + set pat ^-([join $options |])$ + if {[llength $args] == 1} { + set flag [lindex $args 0] + if {[regexp -- $pat $flag]} { + return $http($flag) + } else { + return -code error "Unknown option $flag, must be: $usage" + } + } else { + foreach {flag value} $args { + if {[regexp -- $pat $flag]} { + set http($flag) $value + } else { + return -code error "Unknown option $flag, must be: $usage" + } + } + } +} + + proc httpFinish { token {errormsg ""} } { + upvar #0 $token state + global errorInfo errorCode + if {[string length $errormsg] != 0} { + set state(error) [list $errormsg $errorInfo $errorCode] + set state(status) error + } + catch {close $state(sock)} + catch {after cancel $state(after)} + if {[info exists state(-command)]} { + if {[catch {eval $state(-command) {$token}} err]} { + if {[string length $errormsg] == 0} { + set state(error) [list $err $errorInfo $errorCode] + set state(status) error + } + } + unset state(-command) + } +} +proc http_reset { token {why reset} } { + upvar #0 $token state + set state(status) $why + catch {fileevent $state(sock) readable {}} + httpFinish $token + if {[info exists state(error)]} { + set errorlist $state(error) + unset state(error) + eval error $errorlist + } +} +proc http_get { url args } { + global http + if {![info exists http(uid)]} { + set http(uid) 0 + } + set token http#[incr http(uid)] + upvar #0 $token state + http_reset $token + array set state { + -blocksize 8192 + -validate 0 + -headers {} + -timeout 0 + state header + meta {} + currentsize 0 + totalsize 0 + type text/html + body {} + status "" + } + set options {-blocksize -channel -command -handler -headers \ + -progress -query -validate -timeout} + set usage [join $options ", "] + regsub -all -- - $options {} options + set pat ^-([join $options |])$ + foreach {flag value} $args { + if {[regexp $pat $flag]} { + # Validate numbers + if {[info exists state($flag)] && \ + [regexp {^[0-9]+$} $state($flag)] && \ + ![regexp {^[0-9]+$} $value]} { + return -code error "Bad value for $flag ($value), must be integer" + } + set state($flag) $value + } else { + return -code error "Unknown option $flag, can be: $usage" + } + } + if {! [regexp -nocase {^(http://)?([^/:]+)(:([0-9]+))?(/.*)?$} $url \ + x proto host y port srvurl]} { + error "Unsupported URL: $url" + } + if {[string length $port] == 0} { + set port 80 + } + if {[string length $srvurl] == 0} { + set srvurl / + } + if {[string length $proto] == 0} { + set url http://$url + } + set state(url) $url + if {![catch {$http(-proxyfilter) $host} proxy]} { + set phost [lindex $proxy 0] + set pport [lindex $proxy 1] + } + if {$state(-timeout) > 0} { + set state(after) [after $state(-timeout) [list http_reset $token timeout]] + } + if {[info exists phost] && [string length $phost]} { + set srvurl $url + set s [socket $phost $pport] + } else { + set s [socket $host $port] + } + set state(sock) $s + + # Send data in cr-lf format, but accept any line terminators + + fconfigure $s -translation {auto crlf} -buffersize $state(-blocksize) + + # The following is disallowed in safe interpreters, but the socket + # is already in non-blocking mode in that case. + + catch {fconfigure $s -blocking off} + set len 0 + set how GET + if {[info exists state(-query)]} { + set len [string length $state(-query)] + if {$len > 0} { + set how POST + } + } elseif {$state(-validate)} { + set how HEAD + } + puts $s "$how $srvurl HTTP/1.0" + puts $s "Accept: $http(-accept)" + puts $s "Host: $host" + puts $s "User-Agent: $http(-useragent)" + foreach {key value} $state(-headers) { + regsub -all \[\n\r\] $value {} value + set key [string trim $key] + if {[string length $key]} { + puts $s "$key: $value" + } + } + if {$len > 0} { + puts $s "Content-Length: $len" + puts $s "Content-Type: application/x-www-form-urlencoded" + puts $s "" + fconfigure $s -translation {auto binary} + puts -nonewline $s $state(-query) + } else { + puts $s "" + } + flush $s + fileevent $s readable [list httpEvent $token] + if {! [info exists state(-command)]} { + http_wait $token + } + return $token +} +proc http_data {token} { + upvar #0 $token state + return $state(body) +} +proc http_status {token} { + upvar #0 $token state + return $state(status) +} +proc http_code {token} { + upvar #0 $token state + return $state(http) +} +proc http_size {token} { + upvar #0 $token state + return $state(currentsize) +} + + proc httpEvent {token} { + upvar #0 $token state + set s $state(sock) + + if {[eof $s]} { + httpEof $token + return + } + if {$state(state) == "header"} { + set n [gets $s line] + if {$n == 0} { + set state(state) body + if {![regexp -nocase ^text $state(type)]} { + # Turn off conversions for non-text data + fconfigure $s -translation binary + if {[info exists state(-channel)]} { + fconfigure $state(-channel) -translation binary + } + } + if {[info exists state(-channel)] && + ![info exists state(-handler)]} { + # Initiate a sequence of background fcopies + fileevent $s readable {} + httpCopyStart $s $token + } + } elseif {$n > 0} { + if {[regexp -nocase {^content-type:(.+)$} $line x type]} { + set state(type) [string trim $type] + } + if {[regexp -nocase {^content-length:(.+)$} $line x length]} { + set state(totalsize) [string trim $length] + } + if {[regexp -nocase {^([^:]+):(.+)$} $line x key value]} { + lappend state(meta) $key $value + } elseif {[regexp ^HTTP $line]} { + set state(http) $line + } + } + } else { + if {[catch { + if {[info exists state(-handler)]} { + set n [eval $state(-handler) {$s $token}] + } else { + set block [read $s $state(-blocksize)] + set n [string length $block] + if {$n >= 0} { + append state(body) $block + } + } + if {$n >= 0} { + incr state(currentsize) $n + } + } err]} { + httpFinish $token $err + } else { + if {[info exists state(-progress)]} { + eval $state(-progress) {$token $state(totalsize) $state(currentsize)} + } + } + } +} + proc httpCopyStart {s token} { + upvar #0 $token state + if {[catch { + fcopy $s $state(-channel) -size $state(-blocksize) -command \ + [list httpCopyDone $token] + } err]} { + httpFinish $token $err + } +} + proc httpCopyDone {token count {error {}}} { + upvar #0 $token state + set s $state(sock) + incr state(currentsize) $count + if {[info exists state(-progress)]} { + eval $state(-progress) {$token $state(totalsize) $state(currentsize)} + } + if {([string length $error] != 0)} { + httpFinish $token $error + } elseif {[eof $s]} { + httpEof $token + } else { + httpCopyStart $s $token + } +} + proc httpEof {token} { + upvar #0 $token state + if {$state(state) == "header"} { + # Premature eof + set state(status) eof + } else { + set state(status) ok + } + set state(state) eof + httpFinish $token +} +proc http_wait {token} { + upvar #0 $token state + if {![info exists state(status)] || [string length $state(status)] == 0} { + vwait $token\(status) + } + if {[info exists state(error)]} { + set errorlist $state(error) + unset state(error) + eval error $errorlist + } + return $state(status) +} + +# Call http_formatQuery with an even number of arguments, where the first is +# a name, the second is a value, the third is another name, and so on. + +proc http_formatQuery {args} { + set result "" + set sep "" + foreach i $args { + append result $sep [httpMapReply $i] + if {$sep != "="} { + set sep = + } else { + set sep & + } + } + return $result +} + +# do x-www-urlencoded character mapping +# The spec says: "non-alphanumeric characters are replaced by '%HH'" +# 1 leave alphanumerics characters alone +# 2 Convert every other character to an array lookup +# 3 Escape constructs that are "special" to the tcl parser +# 4 "subst" the result, doing all the array substitutions + + proc httpMapReply {string} { + global httpFormMap + set alphanumeric a-zA-Z0-9 + if {![info exists httpFormMap]} { + + for {set i 1} {$i <= 256} {incr i} { + set c [format %c $i] + if {![string match \[$alphanumeric\] $c]} { + set httpFormMap($c) %[format %.2x $i] + } + } + # These are handled specially + array set httpFormMap { + " " + \n %0d%0a + } + } + regsub -all \[^$alphanumeric\] $string {$httpFormMap(&)} string + regsub -all \n $string {\\n} string + regsub -all \t $string {\\t} string + regsub -all {[][{})\\]\)} $string {\\&} string + return [subst $string] +} + +# Default proxy filter. + proc httpProxyRequired {host} { + global http + if {[info exists http(-proxyhost)] && [string length $http(-proxyhost)]} { + if {![info exists http(-proxyport)] || ![string length $http(-proxyport)]} { + set http(-proxyport) 8080 + } + return [list $http(-proxyhost) $http(-proxyport)] + } else { + return {} + } +} diff --git a/env/tcl/tcl8.6/http1.0/pkgIndex.tcl b/env/tcl/tcl8.6/http1.0/pkgIndex.tcl new file mode 100644 index 0000000..ab6170f --- /dev/null +++ b/env/tcl/tcl8.6/http1.0/pkgIndex.tcl @@ -0,0 +1,11 @@ +# Tcl package index file, version 1.0 +# This file is generated by the "pkg_mkIndex" command +# and sourced either when an application starts up or +# by a "package unknown" script. It invokes the +# "package ifneeded" command to set up package-related +# information so that packages will be loaded automatically +# in response to "package require" commands. When this +# script is sourced, the variable $dir must contain the +# full path name of this file's directory. + +package ifneeded http 1.0 [list tclPkgSetup $dir http 1.0 {{http.tcl source {httpCopyDone httpCopyStart httpEof httpEvent httpFinish httpMapReply httpProxyRequired http_code http_config http_data http_formatQuery http_get http_reset http_size http_status http_wait}}}] diff --git a/env/tcl/tcl8.6/init.tcl b/env/tcl/tcl8.6/init.tcl new file mode 100644 index 0000000..8952172 --- /dev/null +++ b/env/tcl/tcl8.6/init.tcl @@ -0,0 +1,819 @@ +# init.tcl -- +# +# Default system startup file for Tcl-based applications. Defines +# "unknown" procedure and auto-load facilities. +# +# Copyright (c) 1991-1993 The Regents of the University of California. +# Copyright (c) 1994-1996 Sun Microsystems, Inc. +# Copyright (c) 1998-1999 Scriptics Corporation. +# Copyright (c) 2004 by Kevin B. Kenny. All rights reserved. +# +# See the file "license.terms" for information on usage and redistribution +# of this file, and for a DISCLAIMER OF ALL WARRANTIES. +# + +# This test intentionally written in pre-7.5 Tcl +if {[info commands package] == ""} { + error "version mismatch: library\nscripts expect Tcl version 7.5b1 or later but the loaded version is\nonly [info patchlevel]" +} +package require -exact Tcl 8.6.9 + +# Compute the auto path to use in this interpreter. +# The values on the path come from several locations: +# +# The environment variable TCLLIBPATH +# +# tcl_library, which is the directory containing this init.tcl script. +# [tclInit] (Tcl_Init()) searches around for the directory containing this +# init.tcl and defines tcl_library to that location before sourcing it. +# +# The parent directory of tcl_library. Adding the parent +# means that packages in peer directories will be found automatically. +# +# Also add the directory ../lib relative to the directory where the +# executable is located. This is meant to find binary packages for the +# same architecture as the current executable. +# +# tcl_pkgPath, which is set by the platform-specific initialization routines +# On UNIX it is compiled in +# On Windows, it is not used + +if {![info exists auto_path]} { + if {[info exists env(TCLLIBPATH)]} { + set auto_path $env(TCLLIBPATH) + } else { + set auto_path "" + } +} +namespace eval tcl { + variable Dir + foreach Dir [list $::tcl_library [file dirname $::tcl_library]] { + if {$Dir ni $::auto_path} { + lappend ::auto_path $Dir + } + } + set Dir [file join [file dirname [file dirname \ + [info nameofexecutable]]] lib] + if {$Dir ni $::auto_path} { + lappend ::auto_path $Dir + } + catch { + foreach Dir $::tcl_pkgPath { + if {$Dir ni $::auto_path} { + lappend ::auto_path $Dir + } + } + } + + if {![interp issafe]} { + variable Path [encoding dirs] + set Dir [file join $::tcl_library encoding] + if {$Dir ni $Path} { + lappend Path $Dir + encoding dirs $Path + } + } + + # TIP #255 min and max functions + namespace eval mathfunc { + proc min {args} { + if {![llength $args]} { + return -code error \ + "too few arguments to math function \"min\"" + } + set val Inf + foreach arg $args { + # This will handle forcing the numeric value without + # ruining the internal type of a numeric object + if {[catch {expr {double($arg)}} err]} { + return -code error $err + } + if {$arg < $val} {set val $arg} + } + return $val + } + proc max {args} { + if {![llength $args]} { + return -code error \ + "too few arguments to math function \"max\"" + } + set val -Inf + foreach arg $args { + # This will handle forcing the numeric value without + # ruining the internal type of a numeric object + if {[catch {expr {double($arg)}} err]} { + return -code error $err + } + if {$arg > $val} {set val $arg} + } + return $val + } + namespace export min max + } +} + +# Windows specific end of initialization + +if {(![interp issafe]) && ($tcl_platform(platform) eq "windows")} { + namespace eval tcl { + proc EnvTraceProc {lo n1 n2 op} { + global env + set x $env($n2) + set env($lo) $x + set env([string toupper $lo]) $x + } + proc InitWinEnv {} { + global env tcl_platform + foreach p [array names env] { + set u [string toupper $p] + if {$u ne $p} { + switch -- $u { + COMSPEC - + PATH { + set temp $env($p) + unset env($p) + set env($u) $temp + trace add variable env($p) write \ + [namespace code [list EnvTraceProc $p]] + trace add variable env($u) write \ + [namespace code [list EnvTraceProc $p]] + } + } + } + } + if {![info exists env(COMSPEC)]} { + set env(COMSPEC) cmd.exe + } + } + InitWinEnv + } +} + +# Setup the unknown package handler + + +if {[interp issafe]} { + package unknown {::tcl::tm::UnknownHandler ::tclPkgUnknown} +} else { + # Set up search for Tcl Modules (TIP #189). + # and setup platform specific unknown package handlers + if {$tcl_platform(os) eq "Darwin" + && $tcl_platform(platform) eq "unix"} { + package unknown {::tcl::tm::UnknownHandler \ + {::tcl::MacOSXPkgUnknown ::tclPkgUnknown}} + } else { + package unknown {::tcl::tm::UnknownHandler ::tclPkgUnknown} + } + + # Set up the 'clock' ensemble + + namespace eval ::tcl::clock [list variable TclLibDir $::tcl_library] + + proc ::tcl::initClock {} { + # Auto-loading stubs for 'clock.tcl' + + foreach cmd {add format scan} { + proc ::tcl::clock::$cmd args { + variable TclLibDir + source -encoding utf-8 [file join $TclLibDir clock.tcl] + return [uplevel 1 [info level 0]] + } + } + + rename ::tcl::initClock {} + } + ::tcl::initClock +} + +# Conditionalize for presence of exec. + +if {[namespace which -command exec] eq ""} { + + # Some machines do not have exec. Also, on all + # platforms, safe interpreters do not have exec. + + set auto_noexec 1 +} + +# Define a log command (which can be overwitten to log errors +# differently, specially when stderr is not available) + +if {[namespace which -command tclLog] eq ""} { + proc tclLog {string} { + catch {puts stderr $string} + } +} + +# unknown -- +# This procedure is called when a Tcl command is invoked that doesn't +# exist in the interpreter. It takes the following steps to make the +# command available: +# +# 1. See if the autoload facility can locate the command in a +# Tcl script file. If so, load it and execute it. +# 2. If the command was invoked interactively at top-level: +# (a) see if the command exists as an executable UNIX program. +# If so, "exec" the command. +# (b) see if the command requests csh-like history substitution +# in one of the common forms !!, !, or ^old^new. If +# so, emulate csh's history substitution. +# (c) see if the command is a unique abbreviation for another +# command. If so, invoke the command. +# +# Arguments: +# args - A list whose elements are the words of the original +# command, including the command name. + +proc unknown args { + variable ::tcl::UnknownPending + global auto_noexec auto_noload env tcl_interactive errorInfo errorCode + + if {[info exists errorInfo]} { + set savedErrorInfo $errorInfo + } + if {[info exists errorCode]} { + set savedErrorCode $errorCode + } + + set name [lindex $args 0] + if {![info exists auto_noload]} { + # + # Make sure we're not trying to load the same proc twice. + # + if {[info exists UnknownPending($name)]} { + return -code error "self-referential recursion\ + in \"unknown\" for command \"$name\"" + } + set UnknownPending($name) pending + set ret [catch { + auto_load $name [uplevel 1 {::namespace current}] + } msg opts] + unset UnknownPending($name) + if {$ret != 0} { + dict append opts -errorinfo "\n (autoloading \"$name\")" + return -options $opts $msg + } + if {![array size UnknownPending]} { + unset UnknownPending + } + if {$msg} { + if {[info exists savedErrorCode]} { + set ::errorCode $savedErrorCode + } else { + unset -nocomplain ::errorCode + } + if {[info exists savedErrorInfo]} { + set errorInfo $savedErrorInfo + } else { + unset -nocomplain errorInfo + } + set code [catch {uplevel 1 $args} msg opts] + if {$code == 1} { + # + # Compute stack trace contribution from the [uplevel]. + # Note the dependence on how Tcl_AddErrorInfo, etc. + # construct the stack trace. + # + set errInfo [dict get $opts -errorinfo] + set errCode [dict get $opts -errorcode] + set cinfo $args + if {[string bytelength $cinfo] > 150} { + set cinfo [string range $cinfo 0 150] + while {[string bytelength $cinfo] > 150} { + set cinfo [string range $cinfo 0 end-1] + } + append cinfo ... + } + set tail "\n (\"uplevel\" body line 1)\n invoked\ + from within\n\"uplevel 1 \$args\"" + set expect "$msg\n while executing\n\"$cinfo\"$tail" + if {$errInfo eq $expect} { + # + # The stack has only the eval from the expanded command + # Do not generate any stack trace here. + # + dict unset opts -errorinfo + dict incr opts -level + return -options $opts $msg + } + # + # Stack trace is nested, trim off just the contribution + # from the extra "eval" of $args due to the "catch" above. + # + set last [string last $tail $errInfo] + if {$last + [string length $tail] != [string length $errInfo]} { + # Very likely cannot happen + return -options $opts $msg + } + set errInfo [string range $errInfo 0 $last-1] + set tail "\"$cinfo\"" + set last [string last $tail $errInfo] + if {$last + [string length $tail] != [string length $errInfo]} { + return -code error -errorcode $errCode \ + -errorinfo $errInfo $msg + } + set errInfo [string range $errInfo 0 $last-1] + set tail "\n invoked from within\n" + set last [string last $tail $errInfo] + if {$last + [string length $tail] == [string length $errInfo]} { + return -code error -errorcode $errCode \ + -errorinfo [string range $errInfo 0 $last-1] $msg + } + set tail "\n while executing\n" + set last [string last $tail $errInfo] + if {$last + [string length $tail] == [string length $errInfo]} { + return -code error -errorcode $errCode \ + -errorinfo [string range $errInfo 0 $last-1] $msg + } + return -options $opts $msg + } else { + dict incr opts -level + return -options $opts $msg + } + } + } + + if {([info level] == 1) && ([info script] eq "") + && [info exists tcl_interactive] && $tcl_interactive} { + if {![info exists auto_noexec]} { + set new [auto_execok $name] + if {$new ne ""} { + set redir "" + if {[namespace which -command console] eq ""} { + set redir ">&@stdout <@stdin" + } + uplevel 1 [list ::catch \ + [concat exec $redir $new [lrange $args 1 end]] \ + ::tcl::UnknownResult ::tcl::UnknownOptions] + dict incr ::tcl::UnknownOptions -level + return -options $::tcl::UnknownOptions $::tcl::UnknownResult + } + } + if {$name eq "!!"} { + set newcmd [history event] + } elseif {[regexp {^!(.+)$} $name -> event]} { + set newcmd [history event $event] + } elseif {[regexp {^\^([^^]*)\^([^^]*)\^?$} $name -> old new]} { + set newcmd [history event -1] + catch {regsub -all -- $old $newcmd $new newcmd} + } + if {[info exists newcmd]} { + tclLog $newcmd + history change $newcmd 0 + uplevel 1 [list ::catch $newcmd \ + ::tcl::UnknownResult ::tcl::UnknownOptions] + dict incr ::tcl::UnknownOptions -level + return -options $::tcl::UnknownOptions $::tcl::UnknownResult + } + + set ret [catch {set candidates [info commands $name*]} msg] + if {$name eq "::"} { + set name "" + } + if {$ret != 0} { + dict append opts -errorinfo \ + "\n (expanding command prefix \"$name\" in unknown)" + return -options $opts $msg + } + # Filter out bogus matches when $name contained + # a glob-special char [Bug 946952] + if {$name eq ""} { + # Handle empty $name separately due to strangeness + # in [string first] (See RFE 1243354) + set cmds $candidates + } else { + set cmds [list] + foreach x $candidates { + if {[string first $name $x] == 0} { + lappend cmds $x + } + } + } + if {[llength $cmds] == 1} { + uplevel 1 [list ::catch [lreplace $args 0 0 [lindex $cmds 0]] \ + ::tcl::UnknownResult ::tcl::UnknownOptions] + dict incr ::tcl::UnknownOptions -level + return -options $::tcl::UnknownOptions $::tcl::UnknownResult + } + if {[llength $cmds]} { + return -code error "ambiguous command name \"$name\": [lsort $cmds]" + } + } + return -code error -errorcode [list TCL LOOKUP COMMAND $name] \ + "invalid command name \"$name\"" +} + +# auto_load -- +# Checks a collection of library directories to see if a procedure +# is defined in one of them. If so, it sources the appropriate +# library file to create the procedure. Returns 1 if it successfully +# loaded the procedure, 0 otherwise. +# +# Arguments: +# cmd - Name of the command to find and load. +# namespace (optional) The namespace where the command is being used - must be +# a canonical namespace as returned [namespace current] +# for instance. If not given, namespace current is used. + +proc auto_load {cmd {namespace {}}} { + global auto_index auto_path + + if {$namespace eq ""} { + set namespace [uplevel 1 [list ::namespace current]] + } + set nameList [auto_qualify $cmd $namespace] + # workaround non canonical auto_index entries that might be around + # from older auto_mkindex versions + lappend nameList $cmd + foreach name $nameList { + if {[info exists auto_index($name)]} { + namespace eval :: $auto_index($name) + # There's a couple of ways to look for a command of a given + # name. One is to use + # info commands $name + # Unfortunately, if the name has glob-magic chars in it like * + # or [], it may not match. For our purposes here, a better + # route is to use + # namespace which -command $name + if {[namespace which -command $name] ne ""} { + return 1 + } + } + } + if {![info exists auto_path]} { + return 0 + } + + if {![auto_load_index]} { + return 0 + } + foreach name $nameList { + if {[info exists auto_index($name)]} { + namespace eval :: $auto_index($name) + if {[namespace which -command $name] ne ""} { + return 1 + } + } + } + return 0 +} + +# auto_load_index -- +# Loads the contents of tclIndex files on the auto_path directory +# list. This is usually invoked within auto_load to load the index +# of available commands. Returns 1 if the index is loaded, and 0 if +# the index is already loaded and up to date. +# +# Arguments: +# None. + +proc auto_load_index {} { + variable ::tcl::auto_oldpath + global auto_index auto_path + + if {[info exists auto_oldpath] && ($auto_oldpath eq $auto_path)} { + return 0 + } + set auto_oldpath $auto_path + + # Check if we are a safe interpreter. In that case, we support only + # newer format tclIndex files. + + set issafe [interp issafe] + for {set i [expr {[llength $auto_path] - 1}]} {$i >= 0} {incr i -1} { + set dir [lindex $auto_path $i] + set f "" + if {$issafe} { + catch {source [file join $dir tclIndex]} + } elseif {[catch {set f [open [file join $dir tclIndex]]}]} { + continue + } else { + set error [catch { + set id [gets $f] + if {$id eq "# Tcl autoload index file, version 2.0"} { + eval [read $f] + } elseif {$id eq "# Tcl autoload index file: each line identifies a Tcl"} { + while {[gets $f line] >= 0} { + if {([string index $line 0] eq "#") \ + || ([llength $line] != 2)} { + continue + } + set name [lindex $line 0] + set auto_index($name) \ + "source [file join $dir [lindex $line 1]]" + } + } else { + error "[file join $dir tclIndex] isn't a proper Tcl index file" + } + } msg opts] + if {$f ne ""} { + close $f + } + if {$error} { + return -options $opts $msg + } + } + } + return 1 +} + +# auto_qualify -- +# +# Compute a fully qualified names list for use in the auto_index array. +# For historical reasons, commands in the global namespace do not have leading +# :: in the index key. The list has two elements when the command name is +# relative (no leading ::) and the namespace is not the global one. Otherwise +# only one name is returned (and searched in the auto_index). +# +# Arguments - +# cmd The command name. Can be any name accepted for command +# invocations (Like "foo::::bar"). +# namespace The namespace where the command is being used - must be +# a canonical namespace as returned by [namespace current] +# for instance. + +proc auto_qualify {cmd namespace} { + + # count separators and clean them up + # (making sure that foo:::::bar will be treated as foo::bar) + set n [regsub -all {::+} $cmd :: cmd] + + # Ignore namespace if the name starts with :: + # Handle special case of only leading :: + + # Before each return case we give an example of which category it is + # with the following form : + # (inputCmd, inputNameSpace) -> output + + if {[string match ::* $cmd]} { + if {$n > 1} { + # (::foo::bar , *) -> ::foo::bar + return [list $cmd] + } else { + # (::global , *) -> global + return [list [string range $cmd 2 end]] + } + } + + # Potentially returning 2 elements to try : + # (if the current namespace is not the global one) + + if {$n == 0} { + if {$namespace eq "::"} { + # (nocolons , ::) -> nocolons + return [list $cmd] + } else { + # (nocolons , ::sub) -> ::sub::nocolons nocolons + return [list ${namespace}::$cmd $cmd] + } + } elseif {$namespace eq "::"} { + # (foo::bar , ::) -> ::foo::bar + return [list ::$cmd] + } else { + # (foo::bar , ::sub) -> ::sub::foo::bar ::foo::bar + return [list ${namespace}::$cmd ::$cmd] + } +} + +# auto_import -- +# +# Invoked during "namespace import" to make see if the imported commands +# reside in an autoloaded library. If so, the commands are loaded so +# that they will be available for the import links. If not, then this +# procedure does nothing. +# +# Arguments - +# pattern The pattern of commands being imported (like "foo::*") +# a canonical namespace as returned by [namespace current] + +proc auto_import {pattern} { + global auto_index + + # If no namespace is specified, this will be an error case + + if {![string match *::* $pattern]} { + return + } + + set ns [uplevel 1 [list ::namespace current]] + set patternList [auto_qualify $pattern $ns] + + auto_load_index + + foreach pattern $patternList { + foreach name [array names auto_index $pattern] { + if {([namespace which -command $name] eq "") + && ([namespace qualifiers $pattern] eq [namespace qualifiers $name])} { + namespace eval :: $auto_index($name) + } + } + } +} + +# auto_execok -- +# +# Returns string that indicates name of program to execute if +# name corresponds to a shell builtin or an executable in the +# Windows search path, or "" otherwise. Builds an associative +# array auto_execs that caches information about previous checks, +# for speed. +# +# Arguments: +# name - Name of a command. + +if {$tcl_platform(platform) eq "windows"} { +# Windows version. +# +# Note that file executable doesn't work under Windows, so we have to +# look for files with .exe, .com, or .bat extensions. Also, the path +# may be in the Path or PATH environment variables, and path +# components are separated with semicolons, not colons as under Unix. +# +proc auto_execok name { + global auto_execs env tcl_platform + + if {[info exists auto_execs($name)]} { + return $auto_execs($name) + } + set auto_execs($name) "" + + set shellBuiltins [list assoc cls copy date del dir echo erase ftype \ + md mkdir mklink move rd ren rename rmdir start time type ver vol] + if {[info exists env(PATHEXT)]} { + # Add an initial ; to have the {} extension check first. + set execExtensions [split ";$env(PATHEXT)" ";"] + } else { + set execExtensions [list {} .com .exe .bat .cmd] + } + + if {[string tolower $name] in $shellBuiltins} { + # When this is command.com for some reason on Win2K, Tcl won't + # exec it unless the case is right, which this corrects. COMSPEC + # may not point to a real file, so do the check. + set cmd $env(COMSPEC) + if {[file exists $cmd]} { + set cmd [file attributes $cmd -shortname] + } + return [set auto_execs($name) [list $cmd /c $name]] + } + + if {[llength [file split $name]] != 1} { + foreach ext $execExtensions { + set file ${name}${ext} + if {[file exists $file] && ![file isdirectory $file]} { + return [set auto_execs($name) [list $file]] + } + } + return "" + } + + set path "[file dirname [info nameof]];.;" + if {[info exists env(WINDIR)]} { + set windir $env(WINDIR) + } + if {[info exists windir]} { + if {$tcl_platform(os) eq "Windows NT"} { + append path "$windir/system32;" + } + append path "$windir/system;$windir;" + } + + foreach var {PATH Path path} { + if {[info exists env($var)]} { + append path ";$env($var)" + } + } + + foreach ext $execExtensions { + unset -nocomplain checked + foreach dir [split $path {;}] { + # Skip already checked directories + if {[info exists checked($dir)] || ($dir eq "")} { + continue + } + set checked($dir) {} + set file [file join $dir ${name}${ext}] + if {[file exists $file] && ![file isdirectory $file]} { + return [set auto_execs($name) [list $file]] + } + } + } + return "" +} + +} else { +# Unix version. +# +proc auto_execok name { + global auto_execs env + + if {[info exists auto_execs($name)]} { + return $auto_execs($name) + } + set auto_execs($name) "" + if {[llength [file split $name]] != 1} { + if {[file executable $name] && ![file isdirectory $name]} { + set auto_execs($name) [list $name] + } + return $auto_execs($name) + } + foreach dir [split $env(PATH) :] { + if {$dir eq ""} { + set dir . + } + set file [file join $dir $name] + if {[file executable $file] && ![file isdirectory $file]} { + set auto_execs($name) [list $file] + return $auto_execs($name) + } + } + return "" +} + +} + +# ::tcl::CopyDirectory -- +# +# This procedure is called by Tcl's core when attempts to call the +# filesystem's copydirectory function fail. The semantics of the call +# are that 'dest' does not yet exist, i.e. dest should become the exact +# image of src. If dest does exist, we throw an error. +# +# Note that making changes to this procedure can change the results +# of running Tcl's tests. +# +# Arguments: +# action - "renaming" or "copying" +# src - source directory +# dest - destination directory +proc tcl::CopyDirectory {action src dest} { + set nsrc [file normalize $src] + set ndest [file normalize $dest] + + if {$action eq "renaming"} { + # Can't rename volumes. We could give a more precise + # error message here, but that would break the test suite. + if {$nsrc in [file volumes]} { + return -code error "error $action \"$src\" to\ + \"$dest\": trying to rename a volume or move a directory\ + into itself" + } + } + if {[file exists $dest]} { + if {$nsrc eq $ndest} { + return -code error "error $action \"$src\" to\ + \"$dest\": trying to rename a volume or move a directory\ + into itself" + } + if {$action eq "copying"} { + # We used to throw an error here, but, looking more closely + # at the core copy code in tclFCmd.c, if the destination + # exists, then we should only call this function if -force + # is true, which means we just want to over-write. So, + # the following code is now commented out. + # + # return -code error "error $action \"$src\" to\ + # \"$dest\": file already exists" + } else { + # Depending on the platform, and on the current + # working directory, the directories '.', '..' + # can be returned in various combinations. Anyway, + # if any other file is returned, we must signal an error. + set existing [glob -nocomplain -directory $dest * .*] + lappend existing {*}[glob -nocomplain -directory $dest \ + -type hidden * .*] + foreach s $existing { + if {[file tail $s] ni {. ..}} { + return -code error "error $action \"$src\" to\ + \"$dest\": file already exists" + } + } + } + } else { + if {[string first $nsrc $ndest] != -1} { + set srclen [expr {[llength [file split $nsrc]] - 1}] + set ndest [lindex [file split $ndest] $srclen] + if {$ndest eq [file tail $nsrc]} { + return -code error "error $action \"$src\" to\ + \"$dest\": trying to rename a volume or move a directory\ + into itself" + } + } + file mkdir $dest + } + # Have to be careful to capture both visible and hidden files. + # We will also be more generous to the file system and not + # assume the hidden and non-hidden lists are non-overlapping. + # + # On Unix 'hidden' files begin with '.'. On other platforms + # or filesystems hidden files may have other interpretations. + set filelist [concat [glob -nocomplain -directory $src *] \ + [glob -nocomplain -directory $src -types hidden *]] + + foreach s [lsort -unique $filelist] { + if {[file tail $s] ni {. ..}} { + file copy -force -- $s [file join $dest [file tail $s]] + } + } + return +} diff --git a/env/tcl/tcl8.6/msgs/af.msg b/env/tcl/tcl8.6/msgs/af.msg new file mode 100644 index 0000000..0892615 --- /dev/null +++ b/env/tcl/tcl8.6/msgs/af.msg @@ -0,0 +1,49 @@ +# created by tools/loadICU.tcl -- do not edit +namespace eval ::tcl::clock { + ::msgcat::mcset af DAYS_OF_WEEK_ABBREV [list \ + "So"\ + "Ma"\ + "Di"\ + "Wo"\ + "Do"\ + "Vr"\ + "Sa"] + ::msgcat::mcset af DAYS_OF_WEEK_FULL [list \ + "Sondag"\ + "Maandag"\ + "Dinsdag"\ + "Woensdag"\ + "Donderdag"\ + "Vrydag"\ + "Saterdag"] + ::msgcat::mcset af MONTHS_ABBREV [list \ + "Jan"\ + "Feb"\ + "Mar"\ + "Apr"\ + "Mei"\ + "Jun"\ + "Jul"\ + "Aug"\ + "Sep"\ + "Okt"\ + "Nov"\ + "Des"\ + ""] + ::msgcat::mcset af MONTHS_FULL [list \ + "Januarie"\ + "Februarie"\ + "Maart"\ + "April"\ + "Mei"\ + "Junie"\ + "Julie"\ + "Augustus"\ + "September"\ + "Oktober"\ + "November"\ + "Desember"\ + ""] + ::msgcat::mcset af AM "VM" + ::msgcat::mcset af PM "NM" +} diff --git a/env/tcl/tcl8.6/msgs/af_za.msg b/env/tcl/tcl8.6/msgs/af_za.msg new file mode 100644 index 0000000..fef48ad --- /dev/null +++ b/env/tcl/tcl8.6/msgs/af_za.msg @@ -0,0 +1,6 @@ +# created by tools/loadICU.tcl -- do not edit +namespace eval ::tcl::clock { + ::msgcat::mcset af_ZA DATE_FORMAT "%d %B %Y" + ::msgcat::mcset af_ZA TIME_FORMAT_12 "%l:%M:%S %P" + ::msgcat::mcset af_ZA DATE_TIME_FORMAT "%d %B %Y %l:%M:%S %P %z" +} diff --git a/env/tcl/tcl8.6/msgs/ar.msg b/env/tcl/tcl8.6/msgs/ar.msg new file mode 100644 index 0000000..257157f --- /dev/null +++ b/env/tcl/tcl8.6/msgs/ar.msg @@ -0,0 +1,54 @@ +# created by tools/loadICU.tcl -- do not edit +namespace eval ::tcl::clock { + ::msgcat::mcset ar DAYS_OF_WEEK_ABBREV [list \ + "\u062d"\ + "\u0646"\ + "\u062b"\ + "\u0631"\ + "\u062e"\ + "\u062c"\ + "\u0633"] + ::msgcat::mcset ar DAYS_OF_WEEK_FULL [list \ + "\u0627\u0644\u0623\u062d\u062f"\ + "\u0627\u0644\u0627\u062b\u0646\u064a\u0646"\ + "\u0627\u0644\u062b\u0644\u0627\u062b\u0627\u0621"\ + "\u0627\u0644\u0623\u0631\u0628\u0639\u0627\u0621"\ + "\u0627\u0644\u062e\u0645\u064a\u0633"\ + "\u0627\u0644\u062c\u0645\u0639\u0629"\ + "\u0627\u0644\u0633\u0628\u062a"] + ::msgcat::mcset ar MONTHS_ABBREV [list \ + "\u064a\u0646\u0627"\ + "\u0641\u0628\u0631"\ + "\u0645\u0627\u0631"\ + "\u0623\u0628\u0631"\ + "\u0645\u0627\u064a"\ + "\u064a\u0648\u0646"\ + "\u064a\u0648\u0644"\ + "\u0623\u063a\u0633"\ + "\u0633\u0628\u062a"\ + "\u0623\u0643\u062a"\ + "\u0646\u0648\u0641"\ + "\u062f\u064a\u0633"\ + ""] + ::msgcat::mcset ar MONTHS_FULL [list \ + "\u064a\u0646\u0627\u064a\u0631"\ + "\u0641\u0628\u0631\u0627\u064a\u0631"\ + "\u0645\u0627\u0631\u0633"\ + "\u0623\u0628\u0631\u064a\u0644"\ + "\u0645\u0627\u064a\u0648"\ + "\u064a\u0648\u0646\u064a\u0648"\ + "\u064a\u0648\u0644\u064a\u0648"\ + "\u0623\u063a\u0633\u0637\u0633"\ + "\u0633\u0628\u062a\u0645\u0628\u0631"\ + "\u0623\u0643\u062a\u0648\u0628\u0631"\ + "\u0646\u0648\u0641\u0645\u0628\u0631"\ + "\u062f\u064a\u0633\u0645\u0628\u0631"\ + ""] + ::msgcat::mcset ar BCE "\u0642.\u0645" + ::msgcat::mcset ar CE "\u0645" + ::msgcat::mcset ar AM "\u0635" + ::msgcat::mcset ar PM "\u0645" + ::msgcat::mcset ar DATE_FORMAT "%d/%m/%Y" + ::msgcat::mcset ar TIME_FORMAT_12 "%I:%M:%S %P" + ::msgcat::mcset ar DATE_TIME_FORMAT "%d/%m/%Y %I:%M:%S %P %z" +} diff --git a/env/tcl/tcl8.6/msgs/ar_in.msg b/env/tcl/tcl8.6/msgs/ar_in.msg new file mode 100644 index 0000000..185e49c --- /dev/null +++ b/env/tcl/tcl8.6/msgs/ar_in.msg @@ -0,0 +1,6 @@ +# created by tools/loadICU.tcl -- do not edit +namespace eval ::tcl::clock { + ::msgcat::mcset ar_IN DATE_FORMAT "%A %d %B %Y" + ::msgcat::mcset ar_IN TIME_FORMAT_12 "%I:%M:%S %z" + ::msgcat::mcset ar_IN DATE_TIME_FORMAT "%A %d %B %Y %I:%M:%S %z %z" +} diff --git a/env/tcl/tcl8.6/msgs/ar_jo.msg b/env/tcl/tcl8.6/msgs/ar_jo.msg new file mode 100644 index 0000000..0f5e269 --- /dev/null +++ b/env/tcl/tcl8.6/msgs/ar_jo.msg @@ -0,0 +1,39 @@ +# created by tools/loadICU.tcl -- do not edit +namespace eval ::tcl::clock { + ::msgcat::mcset ar_JO DAYS_OF_WEEK_ABBREV [list \ + "\u0627\u0644\u0623\u062d\u062f"\ + "\u0627\u0644\u0627\u062b\u0646\u064a\u0646"\ + "\u0627\u0644\u062b\u0644\u0627\u062b\u0627\u0621"\ + "\u0627\u0644\u0623\u0631\u0628\u0639\u0627\u0621"\ + "\u0627\u0644\u062e\u0645\u064a\u0633"\ + "\u0627\u0644\u062c\u0645\u0639\u0629"\ + "\u0627\u0644\u0633\u0628\u062a"] + ::msgcat::mcset ar_JO MONTHS_ABBREV [list \ + "\u0643\u0627\u0646\u0648\u0646 \u0627\u0644\u062b\u0627\u0646\u064a"\ + "\u0634\u0628\u0627\u0637"\ + "\u0622\u0630\u0627\u0631"\ + "\u0646\u064a\u0633\u0627\u0646"\ + "\u0646\u0648\u0627\u0631"\ + "\u062d\u0632\u064a\u0631\u0627\u0646"\ + "\u062a\u0645\u0648\u0632"\ + "\u0622\u0628"\ + "\u0623\u064a\u0644\u0648\u0644"\ + "\u062a\u0634\u0631\u064a\u0646 \u0627\u0644\u0623\u0648\u0644"\ + "\u062a\u0634\u0631\u064a\u0646 \u0627\u0644\u062b\u0627\u0646\u064a"\ + "\u0643\u0627\u0646\u0648\u0646 \u0627\u0644\u0623\u0648\u0644"\ + ""] + ::msgcat::mcset ar_JO MONTHS_FULL [list \ + "\u0643\u0627\u0646\u0648\u0646 \u0627\u0644\u062b\u0627\u0646\u064a"\ + "\u0634\u0628\u0627\u0637"\ + "\u0622\u0630\u0627\u0631"\ + "\u0646\u064a\u0633\u0627\u0646"\ + "\u0646\u0648\u0627\u0631"\ + "\u062d\u0632\u064a\u0631\u0627\u0646"\ + "\u062a\u0645\u0648\u0632"\ + "\u0622\u0628"\ + "\u0623\u064a\u0644\u0648\u0644"\ + "\u062a\u0634\u0631\u064a\u0646 \u0627\u0644\u0623\u0648\u0644"\ + "\u062a\u0634\u0631\u064a\u0646 \u0627\u0644\u062b\u0627\u0646\u064a"\ + "\u0643\u0627\u0646\u0648\u0646 \u0627\u0644\u0623\u0648\u0644"\ + ""] +} diff --git a/env/tcl/tcl8.6/msgs/ar_lb.msg b/env/tcl/tcl8.6/msgs/ar_lb.msg new file mode 100644 index 0000000..e62acd3 --- /dev/null +++ b/env/tcl/tcl8.6/msgs/ar_lb.msg @@ -0,0 +1,39 @@ +# created by tools/loadICU.tcl -- do not edit +namespace eval ::tcl::clock { + ::msgcat::mcset ar_LB DAYS_OF_WEEK_ABBREV [list \ + "\u0627\u0644\u0623\u062d\u062f"\ + "\u0627\u0644\u0627\u062b\u0646\u064a\u0646"\ + "\u0627\u0644\u062b\u0644\u0627\u062b\u0627\u0621"\ + "\u0627\u0644\u0623\u0631\u0628\u0639\u0627\u0621"\ + "\u0627\u0644\u062e\u0645\u064a\u0633"\ + "\u0627\u0644\u062c\u0645\u0639\u0629"\ + "\u0627\u0644\u0633\u0628\u062a"] + ::msgcat::mcset ar_LB MONTHS_ABBREV [list \ + "\u0643\u0627\u0646\u0648\u0646 \u0627\u0644\u062b\u0627\u0646\u064a"\ + "\u0634\u0628\u0627\u0637"\ + "\u0622\u0630\u0627\u0631"\ + "\u0646\u064a\u0633\u0627\u0646"\ + "\u0646\u0648\u0627\u0631"\ + "\u062d\u0632\u064a\u0631\u0627\u0646"\ + "\u062a\u0645\u0648\u0632"\ + "\u0622\u0628"\ + "\u0623\u064a\u0644\u0648\u0644"\ + "\u062a\u0634\u0631\u064a\u0646 \u0627\u0644\u0623\u0648\u0644"\ + "\u062a\u0634\u0631\u064a\u0646 \u0627\u0644\u062b\u0627\u0646\u064a"\ + "\u0643\u0627\u0646\u0648\u0646 \u0627\u0644\u0623\u0648\u0644"\ + ""] + ::msgcat::mcset ar_LB MONTHS_FULL [list \ + "\u0643\u0627\u0646\u0648\u0646 \u0627\u0644\u062b\u0627\u0646\u064a"\ + "\u0634\u0628\u0627\u0637"\ + "\u0622\u0630\u0627\u0631"\ + "\u0646\u064a\u0633\u0627\u0646"\ + "\u0646\u0648\u0627\u0631"\ + "\u062d\u0632\u064a\u0631\u0627\u0646"\ + "\u062a\u0645\u0648\u0632"\ + "\u0622\u0628"\ + "\u0623\u064a\u0644\u0648\u0644"\ + "\u062a\u0634\u0631\u064a\u0646 \u0627\u0644\u0623\u0648\u0644"\ + "\u062a\u0634\u0631\u064a\u0646 \u0627\u0644\u062b\u0627\u0646\u064a"\ + "\u0643\u0627\u0646\u0648\u0646 \u0627\u0644\u0623\u0648\u0644"\ + ""] +} diff --git a/env/tcl/tcl8.6/msgs/ar_sy.msg b/env/tcl/tcl8.6/msgs/ar_sy.msg new file mode 100644 index 0000000..d5e1c87 --- /dev/null +++ b/env/tcl/tcl8.6/msgs/ar_sy.msg @@ -0,0 +1,39 @@ +# created by tools/loadICU.tcl -- do not edit +namespace eval ::tcl::clock { + ::msgcat::mcset ar_SY DAYS_OF_WEEK_ABBREV [list \ + "\u0627\u0644\u0623\u062d\u062f"\ + "\u0627\u0644\u0627\u062b\u0646\u064a\u0646"\ + "\u0627\u0644\u062b\u0644\u0627\u062b\u0627\u0621"\ + "\u0627\u0644\u0623\u0631\u0628\u0639\u0627\u0621"\ + "\u0627\u0644\u062e\u0645\u064a\u0633"\ + "\u0627\u0644\u062c\u0645\u0639\u0629"\ + "\u0627\u0644\u0633\u0628\u062a"] + ::msgcat::mcset ar_SY MONTHS_ABBREV [list \ + "\u0643\u0627\u0646\u0648\u0646 \u0627\u0644\u062b\u0627\u0646\u064a"\ + "\u0634\u0628\u0627\u0637"\ + "\u0622\u0630\u0627\u0631"\ + "\u0646\u064a\u0633\u0627\u0646"\ + "\u0646\u0648\u0627\u0631"\ + "\u062d\u0632\u064a\u0631\u0627\u0646"\ + "\u062a\u0645\u0648\u0632"\ + "\u0622\u0628"\ + "\u0623\u064a\u0644\u0648\u0644"\ + "\u062a\u0634\u0631\u064a\u0646 \u0627\u0644\u0623\u0648\u0644"\ + "\u062a\u0634\u0631\u064a\u0646 \u0627\u0644\u062b\u0627\u0646\u064a"\ + "\u0643\u0627\u0646\u0648\u0646 \u0627\u0644\u0623\u0648\u0644"\ + ""] + ::msgcat::mcset ar_SY MONTHS_FULL [list \ + "\u0643\u0627\u0646\u0648\u0646 \u0627\u0644\u062b\u0627\u0646\u064a"\ + "\u0634\u0628\u0627\u0637"\ + "\u0622\u0630\u0627\u0631"\ + "\u0646\u064a\u0633\u0627\u0646"\ + "\u0646\u0648\u0627\u0631\u0627\u0646"\ + "\u062d\u0632\u064a\u0631"\ + "\u062a\u0645\u0648\u0632"\ + "\u0622\u0628"\ + "\u0623\u064a\u0644\u0648\u0644"\ + "\u062a\u0634\u0631\u064a\u0646 \u0627\u0644\u0623\u0648\u0644"\ + "\u062a\u0634\u0631\u064a\u0646 \u0627\u0644\u062b\u0627\u0646\u064a"\ + "\u0643\u0627\u0646\u0648\u0646 \u0627\u0644\u0623\u0648\u0644"\ + ""] +} diff --git a/env/tcl/tcl8.6/msgs/be.msg b/env/tcl/tcl8.6/msgs/be.msg new file mode 100644 index 0000000..379a1d7 --- /dev/null +++ b/env/tcl/tcl8.6/msgs/be.msg @@ -0,0 +1,52 @@ +# created by tools/loadICU.tcl -- do not edit +namespace eval ::tcl::clock { + ::msgcat::mcset be DAYS_OF_WEEK_ABBREV [list \ + "\u043d\u0434"\ + "\u043f\u043d"\ + "\u0430\u0442"\ + "\u0441\u0440"\ + "\u0447\u0446"\ + "\u043f\u0442"\ + "\u0441\u0431"] + ::msgcat::mcset be DAYS_OF_WEEK_FULL [list \ + "\u043d\u044f\u0434\u0437\u0435\u043b\u044f"\ + "\u043f\u0430\u043d\u044f\u0434\u0437\u0435\u043b\u0430\u043a"\ + "\u0430\u045e\u0442\u043e\u0440\u0430\u043a"\ + "\u0441\u0435\u0440\u0430\u0434\u0430"\ + "\u0447\u0430\u0446\u0432\u0435\u0440"\ + "\u043f\u044f\u0442\u043d\u0456\u0446\u0430"\ + "\u0441\u0443\u0431\u043e\u0442\u0430"] + ::msgcat::mcset be MONTHS_ABBREV [list \ + "\u0441\u0442\u0434"\ + "\u043b\u044e\u0442"\ + "\u0441\u043a\u0432"\ + "\u043a\u0440\u0441"\ + "\u043c\u0430\u0439"\ + "\u0447\u0440\u0432"\ + "\u043b\u043f\u043d"\ + "\u0436\u043d\u0432"\ + "\u0432\u0440\u0441"\ + "\u043a\u0441\u0442"\ + "\u043b\u0441\u0442"\ + "\u0441\u043d\u0436"\ + ""] + ::msgcat::mcset be MONTHS_FULL [list \ + "\u0441\u0442\u0443\u0434\u0437\u0435\u043d\u044f"\ + "\u043b\u044e\u0442\u0430\u0433\u0430"\ + "\u0441\u0430\u043a\u0430\u0432\u0456\u043a\u0430"\ + "\u043a\u0440\u0430\u0441\u0430\u0432\u0456\u043a\u0430"\ + "\u043c\u0430\u044f"\ + "\u0447\u0440\u0432\u0435\u043d\u044f"\ + "\u043b\u0456\u043f\u0435\u043d\u044f"\ + "\u0436\u043d\u0456\u045e\u043d\u044f"\ + "\u0432\u0435\u0440\u0430\u0441\u043d\u044f"\ + "\u043a\u0430\u0441\u0442\u0440\u044b\u0447\u043d\u0456\u043a\u0430"\ + "\u043b\u0438\u0441\u0442\u0430\u043f\u0430\u0434\u0430"\ + "\u0441\u043d\u0435\u0436\u043d\u044f"\ + ""] + ::msgcat::mcset be BCE "\u0434\u0430 \u043d.\u0435." + ::msgcat::mcset be CE "\u043d.\u0435." + ::msgcat::mcset be DATE_FORMAT "%e.%m.%Y" + ::msgcat::mcset be TIME_FORMAT "%k.%M.%S" + ::msgcat::mcset be DATE_TIME_FORMAT "%e.%m.%Y %k.%M.%S %z" +} diff --git a/env/tcl/tcl8.6/msgs/bg.msg b/env/tcl/tcl8.6/msgs/bg.msg new file mode 100644 index 0000000..ff17759 --- /dev/null +++ b/env/tcl/tcl8.6/msgs/bg.msg @@ -0,0 +1,52 @@ +# created by tools/loadICU.tcl -- do not edit +namespace eval ::tcl::clock { + ::msgcat::mcset bg DAYS_OF_WEEK_ABBREV [list \ + "\u041d\u0434"\ + "\u041f\u043d"\ + "\u0412\u0442"\ + "\u0421\u0440"\ + "\u0427\u0442"\ + "\u041f\u0442"\ + "\u0421\u0431"] + ::msgcat::mcset bg DAYS_OF_WEEK_FULL [list \ + "\u041d\u0435\u0434\u0435\u043b\u044f"\ + "\u041f\u043e\u043d\u0435\u0434\u0435\u043b\u043d\u0438\u043a"\ + "\u0412\u0442\u043e\u0440\u043d\u0438\u043a"\ + "\u0421\u0440\u044f\u0434\u0430"\ + "\u0427\u0435\u0442\u0432\u044a\u0440\u0442\u044a\u043a"\ + "\u041f\u0435\u0442\u044a\u043a"\ + "\u0421\u044a\u0431\u043e\u0442\u0430"] + ::msgcat::mcset bg MONTHS_ABBREV [list \ + "I"\ + "II"\ + "III"\ + "IV"\ + "V"\ + "VI"\ + "VII"\ + "VIII"\ + "IX"\ + "X"\ + "XI"\ + "XII"\ + ""] + ::msgcat::mcset bg MONTHS_FULL [list \ + "\u042f\u043d\u0443\u0430\u0440\u0438"\ + "\u0424\u0435\u0432\u0440\u0443\u0430\u0440\u0438"\ + "\u041c\u0430\u0440\u0442"\ + "\u0410\u043f\u0440\u0438\u043b"\ + "\u041c\u0430\u0439"\ + "\u042e\u043d\u0438"\ + "\u042e\u043b\u0438"\ + "\u0410\u0432\u0433\u0443\u0441\u0442"\ + "\u0421\u0435\u043f\u0442\u0435\u043c\u0432\u0440\u0438"\ + "\u041e\u043a\u0442\u043e\u043c\u0432\u0440\u0438"\ + "\u041d\u043e\u0435\u043c\u0432\u0440\u0438"\ + "\u0414\u0435\u043a\u0435\u043c\u0432\u0440\u0438"\ + ""] + ::msgcat::mcset bg BCE "\u043f\u0440.\u043d.\u0435." + ::msgcat::mcset bg CE "\u043d.\u0435." + ::msgcat::mcset bg DATE_FORMAT "%Y-%m-%e" + ::msgcat::mcset bg TIME_FORMAT "%k:%M:%S" + ::msgcat::mcset bg DATE_TIME_FORMAT "%Y-%m-%e %k:%M:%S %z" +} diff --git a/env/tcl/tcl8.6/msgs/bn.msg b/env/tcl/tcl8.6/msgs/bn.msg new file mode 100644 index 0000000..664b9d8 --- /dev/null +++ b/env/tcl/tcl8.6/msgs/bn.msg @@ -0,0 +1,49 @@ +# created by tools/loadICU.tcl -- do not edit +namespace eval ::tcl::clock { + ::msgcat::mcset bn DAYS_OF_WEEK_ABBREV [list \ + "\u09b0\u09ac\u09bf"\ + "\u09b8\u09cb\u09ae"\ + "\u09ae\u0999\u0997\u09b2"\ + "\u09ac\u09c1\u09a7"\ + "\u09ac\u09c3\u09b9\u09b8\u09cd\u09aa\u09a4\u09bf"\ + "\u09b6\u09c1\u0995\u09cd\u09b0"\ + "\u09b6\u09a8\u09bf"] + ::msgcat::mcset bn DAYS_OF_WEEK_FULL [list \ + "\u09b0\u09ac\u09bf\u09ac\u09be\u09b0"\ + "\u09b8\u09cb\u09ae\u09ac\u09be\u09b0"\ + "\u09ae\u0999\u0997\u09b2\u09ac\u09be\u09b0"\ + "\u09ac\u09c1\u09a7\u09ac\u09be\u09b0"\ + "\u09ac\u09c3\u09b9\u09b8\u09cd\u09aa\u09a4\u09bf\u09ac\u09be\u09b0"\ + "\u09b6\u09c1\u0995\u09cd\u09b0\u09ac\u09be\u09b0"\ + "\u09b6\u09a8\u09bf\u09ac\u09be\u09b0"] + ::msgcat::mcset bn MONTHS_ABBREV [list \ + "\u099c\u09be\u09a8\u09c1\u09df\u09be\u09b0\u09c0"\ + "\u09ab\u09c7\u09ac\u09cd\u09b0\u09c1\u09df\u09be\u09b0\u09c0"\ + "\u09ae\u09be\u09b0\u09cd\u099a"\ + "\u098f\u09aa\u09cd\u09b0\u09bf\u09b2"\ + "\u09ae\u09c7"\ + "\u099c\u09c1\u09a8"\ + "\u099c\u09c1\u09b2\u09be\u0987"\ + "\u0986\u0997\u09b8\u09cd\u099f"\ + "\u09b8\u09c7\u09aa\u09cd\u099f\u09c7\u09ae\u09cd\u09ac\u09b0"\ + "\u0985\u0995\u09cd\u099f\u09cb\u09ac\u09b0"\ + "\u09a8\u09ad\u09c7\u09ae\u09cd\u09ac\u09b0"\ + "\u09a1\u09bf\u09b8\u09c7\u09ae\u09cd\u09ac\u09b0"\ + ""] + ::msgcat::mcset bn MONTHS_FULL [list \ + "\u099c\u09be\u09a8\u09c1\u09df\u09be\u09b0\u09c0"\ + "\u09ab\u09c7\u09ac\u09cd\u09b0\u09c1\u09df\u09be\u09b0\u09c0"\ + "\u09ae\u09be\u09b0\u09cd\u099a"\ + "\u098f\u09aa\u09cd\u09b0\u09bf\u09b2"\ + "\u09ae\u09c7"\ + "\u099c\u09c1\u09a8"\ + "\u099c\u09c1\u09b2\u09be\u0987"\ + "\u0986\u0997\u09b8\u09cd\u099f"\ + "\u09b8\u09c7\u09aa\u09cd\u099f\u09c7\u09ae\u09cd\u09ac\u09b0"\ + "\u0985\u0995\u09cd\u099f\u09cb\u09ac\u09b0"\ + "\u09a8\u09ad\u09c7\u09ae\u09cd\u09ac\u09b0"\ + "\u09a1\u09bf\u09b8\u09c7\u09ae\u09cd\u09ac\u09b0"\ + ""] + ::msgcat::mcset bn AM "\u09aa\u09c2\u09b0\u09cd\u09ac\u09be\u09b9\u09cd\u09a3" + ::msgcat::mcset bn PM "\u0985\u09aa\u09b0\u09be\u09b9\u09cd\u09a3" +} diff --git a/env/tcl/tcl8.6/msgs/bn_in.msg b/env/tcl/tcl8.6/msgs/bn_in.msg new file mode 100644 index 0000000..28c000f --- /dev/null +++ b/env/tcl/tcl8.6/msgs/bn_in.msg @@ -0,0 +1,6 @@ +# created by tools/loadICU.tcl -- do not edit +namespace eval ::tcl::clock { + ::msgcat::mcset bn_IN DATE_FORMAT "%A %d %b %Y" + ::msgcat::mcset bn_IN TIME_FORMAT_12 "%I:%M:%S %z" + ::msgcat::mcset bn_IN DATE_TIME_FORMAT "%A %d %b %Y %I:%M:%S %z %z" +} diff --git a/env/tcl/tcl8.6/msgs/ca.msg b/env/tcl/tcl8.6/msgs/ca.msg new file mode 100644 index 0000000..36c9772 --- /dev/null +++ b/env/tcl/tcl8.6/msgs/ca.msg @@ -0,0 +1,50 @@ +# created by tools/loadICU.tcl -- do not edit +namespace eval ::tcl::clock { + ::msgcat::mcset ca DAYS_OF_WEEK_ABBREV [list \ + "dg."\ + "dl."\ + "dt."\ + "dc."\ + "dj."\ + "dv."\ + "ds."] + ::msgcat::mcset ca DAYS_OF_WEEK_FULL [list \ + "diumenge"\ + "dilluns"\ + "dimarts"\ + "dimecres"\ + "dijous"\ + "divendres"\ + "dissabte"] + ::msgcat::mcset ca MONTHS_ABBREV [list \ + "gen."\ + "feb."\ + "mar\u00e7"\ + "abr."\ + "maig"\ + "juny"\ + "jul."\ + "ag."\ + "set."\ + "oct."\ + "nov."\ + "des."\ + ""] + ::msgcat::mcset ca MONTHS_FULL [list \ + "gener"\ + "febrer"\ + "mar\u00e7"\ + "abril"\ + "maig"\ + "juny"\ + "juliol"\ + "agost"\ + "setembre"\ + "octubre"\ + "novembre"\ + "desembre"\ + ""] + ::msgcat::mcset ca DATE_FORMAT "%d/%m/%Y" + ::msgcat::mcset ca TIME_FORMAT "%H:%M:%S" + ::msgcat::mcset ca DATE_TIME_FORMAT "%d/%m/%Y %H:%M:%S %z" +} diff --git a/env/tcl/tcl8.6/msgs/cs.msg b/env/tcl/tcl8.6/msgs/cs.msg new file mode 100644 index 0000000..8db8bdd --- /dev/null +++ b/env/tcl/tcl8.6/msgs/cs.msg @@ -0,0 +1,54 @@ +# created by tools/loadICU.tcl -- do not edit +namespace eval ::tcl::clock { + ::msgcat::mcset cs DAYS_OF_WEEK_ABBREV [list \ + "Ne"\ + "Po"\ + "\u00dat"\ + "St"\ + "\u010ct"\ + "P\u00e1"\ + "So"] + ::msgcat::mcset cs DAYS_OF_WEEK_FULL [list \ + "Ned\u011ble"\ + "Pond\u011bl\u00ed"\ + "\u00dater\u00fd"\ + "St\u0159eda"\ + "\u010ctvrtek"\ + "P\u00e1tek"\ + "Sobota"] + ::msgcat::mcset cs MONTHS_ABBREV [list \ + "I"\ + "II"\ + "III"\ + "IV"\ + "V"\ + "VI"\ + "VII"\ + "VIII"\ + "IX"\ + "X"\ + "XI"\ + "XII"\ + ""] + ::msgcat::mcset cs MONTHS_FULL [list \ + "leden"\ + "\u00fanor"\ + "b\u0159ezen"\ + "duben"\ + "kv\u011bten"\ + "\u010derven"\ + "\u010dervenec"\ + "srpen"\ + "z\u00e1\u0159\u00ed"\ + "\u0159\u00edjen"\ + "listopad"\ + "prosinec"\ + ""] + ::msgcat::mcset cs BCE "p\u0159.Kr." + ::msgcat::mcset cs CE "po Kr." + ::msgcat::mcset cs AM "dop." + ::msgcat::mcset cs PM "odp." + ::msgcat::mcset cs DATE_FORMAT "%e.%m.%Y" + ::msgcat::mcset cs TIME_FORMAT "%k:%M:%S" + ::msgcat::mcset cs DATE_TIME_FORMAT "%e.%m.%Y %k:%M:%S %z" +} diff --git a/env/tcl/tcl8.6/msgs/da.msg b/env/tcl/tcl8.6/msgs/da.msg new file mode 100644 index 0000000..e4fec7f --- /dev/null +++ b/env/tcl/tcl8.6/msgs/da.msg @@ -0,0 +1,52 @@ +# created by tools/loadICU.tcl -- do not edit +namespace eval ::tcl::clock { + ::msgcat::mcset da DAYS_OF_WEEK_ABBREV [list \ + "s\u00f8"\ + "ma"\ + "ti"\ + "on"\ + "to"\ + "fr"\ + "l\u00f8"] + ::msgcat::mcset da DAYS_OF_WEEK_FULL [list \ + "s\u00f8ndag"\ + "mandag"\ + "tirsdag"\ + "onsdag"\ + "torsdag"\ + "fredag"\ + "l\u00f8rdag"] + ::msgcat::mcset da MONTHS_ABBREV [list \ + "jan"\ + "feb"\ + "mar"\ + "apr"\ + "maj"\ + "jun"\ + "jul"\ + "aug"\ + "sep"\ + "okt"\ + "nov"\ + "dec"\ + ""] + ::msgcat::mcset da MONTHS_FULL [list \ + "januar"\ + "februar"\ + "marts"\ + "april"\ + "maj"\ + "juni"\ + "juli"\ + "august"\ + "september"\ + "oktober"\ + "november"\ + "december"\ + ""] + ::msgcat::mcset da BCE "f.Kr." + ::msgcat::mcset da CE "e.Kr." + ::msgcat::mcset da DATE_FORMAT "%d-%m-%Y" + ::msgcat::mcset da TIME_FORMAT "%H:%M:%S" + ::msgcat::mcset da DATE_TIME_FORMAT "%d-%m-%Y %H:%M:%S %z" +} diff --git a/env/tcl/tcl8.6/msgs/de.msg b/env/tcl/tcl8.6/msgs/de.msg new file mode 100644 index 0000000..9eb3145 --- /dev/null +++ b/env/tcl/tcl8.6/msgs/de.msg @@ -0,0 +1,54 @@ +# created by tools/loadICU.tcl -- do not edit +namespace eval ::tcl::clock { + ::msgcat::mcset de DAYS_OF_WEEK_ABBREV [list \ + "So"\ + "Mo"\ + "Di"\ + "Mi"\ + "Do"\ + "Fr"\ + "Sa"] + ::msgcat::mcset de DAYS_OF_WEEK_FULL [list \ + "Sonntag"\ + "Montag"\ + "Dienstag"\ + "Mittwoch"\ + "Donnerstag"\ + "Freitag"\ + "Samstag"] + ::msgcat::mcset de MONTHS_ABBREV [list \ + "Jan"\ + "Feb"\ + "Mrz"\ + "Apr"\ + "Mai"\ + "Jun"\ + "Jul"\ + "Aug"\ + "Sep"\ + "Okt"\ + "Nov"\ + "Dez"\ + ""] + ::msgcat::mcset de MONTHS_FULL [list \ + "Januar"\ + "Februar"\ + "M\u00e4rz"\ + "April"\ + "Mai"\ + "Juni"\ + "Juli"\ + "August"\ + "September"\ + "Oktober"\ + "November"\ + "Dezember"\ + ""] + ::msgcat::mcset de BCE "v. Chr." + ::msgcat::mcset de CE "n. Chr." + ::msgcat::mcset de AM "vorm." + ::msgcat::mcset de PM "nachm." + ::msgcat::mcset de DATE_FORMAT "%d.%m.%Y" + ::msgcat::mcset de TIME_FORMAT "%H:%M:%S" + ::msgcat::mcset de DATE_TIME_FORMAT "%d.%m.%Y %H:%M:%S %z" +} diff --git a/env/tcl/tcl8.6/msgs/de_at.msg b/env/tcl/tcl8.6/msgs/de_at.msg new file mode 100644 index 0000000..61bc266 --- /dev/null +++ b/env/tcl/tcl8.6/msgs/de_at.msg @@ -0,0 +1,35 @@ +# created by tools/loadICU.tcl -- do not edit +namespace eval ::tcl::clock { + ::msgcat::mcset de_AT MONTHS_ABBREV [list \ + "J\u00e4n"\ + "Feb"\ + "M\u00e4r"\ + "Apr"\ + "Mai"\ + "Jun"\ + "Jul"\ + "Aug"\ + "Sep"\ + "Okt"\ + "Nov"\ + "Dez"\ + ""] + ::msgcat::mcset de_AT MONTHS_FULL [list \ + "J\u00e4nner"\ + "Februar"\ + "M\u00e4rz"\ + "April"\ + "Mai"\ + "Juni"\ + "Juli"\ + "August"\ + "September"\ + "Oktober"\ + "November"\ + "Dezember"\ + ""] + ::msgcat::mcset de_AT DATE_FORMAT "%Y-%m-%d" + ::msgcat::mcset de_AT TIME_FORMAT "%T" + ::msgcat::mcset de_AT TIME_FORMAT_12 "%T" + ::msgcat::mcset de_AT DATE_TIME_FORMAT "%a %d %b %Y %T %z" +} diff --git a/env/tcl/tcl8.6/msgs/de_be.msg b/env/tcl/tcl8.6/msgs/de_be.msg new file mode 100644 index 0000000..3614763 --- /dev/null +++ b/env/tcl/tcl8.6/msgs/de_be.msg @@ -0,0 +1,53 @@ +# created by tools/loadICU.tcl -- do not edit +namespace eval ::tcl::clock { + ::msgcat::mcset de_BE DAYS_OF_WEEK_ABBREV [list \ + "Son"\ + "Mon"\ + "Die"\ + "Mit"\ + "Don"\ + "Fre"\ + "Sam"] + ::msgcat::mcset de_BE DAYS_OF_WEEK_FULL [list \ + "Sonntag"\ + "Montag"\ + "Dienstag"\ + "Mittwoch"\ + "Donnerstag"\ + "Freitag"\ + "Samstag"] + ::msgcat::mcset de_BE MONTHS_ABBREV [list \ + "Jan"\ + "Feb"\ + "M\u00e4r"\ + "Apr"\ + "Mai"\ + "Jun"\ + "Jul"\ + "Aug"\ + "Sep"\ + "Okt"\ + "Nov"\ + "Dez"\ + ""] + ::msgcat::mcset de_BE MONTHS_FULL [list \ + "Januar"\ + "Februar"\ + "M\u00e4rz"\ + "April"\ + "Mai"\ + "Juni"\ + "Juli"\ + "August"\ + "September"\ + "Oktober"\ + "November"\ + "Dezember"\ + ""] + ::msgcat::mcset de_BE AM "vorm" + ::msgcat::mcset de_BE PM "nachm" + ::msgcat::mcset de_BE DATE_FORMAT "%Y-%m-%d" + ::msgcat::mcset de_BE TIME_FORMAT "%T" + ::msgcat::mcset de_BE TIME_FORMAT_12 "%T" + ::msgcat::mcset de_BE DATE_TIME_FORMAT "%a %d %b %Y %T %z" +} diff --git a/env/tcl/tcl8.6/msgs/el.msg b/env/tcl/tcl8.6/msgs/el.msg new file mode 100644 index 0000000..ac19f62 --- /dev/null +++ b/env/tcl/tcl8.6/msgs/el.msg @@ -0,0 +1,52 @@ +# created by tools/loadICU.tcl -- do not edit +namespace eval ::tcl::clock { + ::msgcat::mcset el DAYS_OF_WEEK_ABBREV [list \ + "\u039a\u03c5\u03c1"\ + "\u0394\u03b5\u03c5"\ + "\u03a4\u03c1\u03b9"\ + "\u03a4\u03b5\u03c4"\ + "\u03a0\u03b5\u03bc"\ + "\u03a0\u03b1\u03c1"\ + "\u03a3\u03b1\u03b2"] + ::msgcat::mcset el DAYS_OF_WEEK_FULL [list \ + "\u039a\u03c5\u03c1\u03b9\u03b1\u03ba\u03ae"\ + "\u0394\u03b5\u03c5\u03c4\u03ad\u03c1\u03b1"\ + "\u03a4\u03c1\u03af\u03c4\u03b7"\ + "\u03a4\u03b5\u03c4\u03ac\u03c1\u03c4\u03b7"\ + "\u03a0\u03ad\u03bc\u03c0\u03c4\u03b7"\ + "\u03a0\u03b1\u03c1\u03b1\u03c3\u03ba\u03b5\u03c5\u03ae"\ + "\u03a3\u03ac\u03b2\u03b2\u03b1\u03c4\u03bf"] + ::msgcat::mcset el MONTHS_ABBREV [list \ + "\u0399\u03b1\u03bd"\ + "\u03a6\u03b5\u03b2"\ + "\u039c\u03b1\u03c1"\ + "\u0391\u03c0\u03c1"\ + "\u039c\u03b1\u03ca"\ + "\u0399\u03bf\u03c5\u03bd"\ + "\u0399\u03bf\u03c5\u03bb"\ + "\u0391\u03c5\u03b3"\ + "\u03a3\u03b5\u03c0"\ + "\u039f\u03ba\u03c4"\ + "\u039d\u03bf\u03b5"\ + "\u0394\u03b5\u03ba"\ + ""] + ::msgcat::mcset el MONTHS_FULL [list \ + "\u0399\u03b1\u03bd\u03bf\u03c5\u03ac\u03c1\u03b9\u03bf\u03c2"\ + "\u03a6\u03b5\u03b2\u03c1\u03bf\u03c5\u03ac\u03c1\u03b9\u03bf\u03c2"\ + "\u039c\u03ac\u03c1\u03c4\u03b9\u03bf\u03c2"\ + "\u0391\u03c0\u03c1\u03af\u03bb\u03b9\u03bf\u03c2"\ + "\u039c\u03ac\u03ca\u03bf\u03c2"\ + "\u0399\u03bf\u03cd\u03bd\u03b9\u03bf\u03c2"\ + "\u0399\u03bf\u03cd\u03bb\u03b9\u03bf\u03c2"\ + "\u0391\u03cd\u03b3\u03bf\u03c5\u03c3\u03c4\u03bf\u03c2"\ + "\u03a3\u03b5\u03c0\u03c4\u03ad\u03bc\u03b2\u03c1\u03b9\u03bf\u03c2"\ + "\u039f\u03ba\u03c4\u03ce\u03b2\u03c1\u03b9\u03bf\u03c2"\ + "\u039d\u03bf\u03ad\u03bc\u03b2\u03c1\u03b9\u03bf\u03c2"\ + "\u0394\u03b5\u03ba\u03ad\u03bc\u03b2\u03c1\u03b9\u03bf\u03c2"\ + ""] + ::msgcat::mcset el AM "\u03c0\u03bc" + ::msgcat::mcset el PM "\u03bc\u03bc" + ::msgcat::mcset el DATE_FORMAT "%e/%m/%Y" + ::msgcat::mcset el TIME_FORMAT_12 "%l:%M:%S %P" + ::msgcat::mcset el DATE_TIME_FORMAT "%e/%m/%Y %l:%M:%S %P %z" +} diff --git a/env/tcl/tcl8.6/msgs/en_au.msg b/env/tcl/tcl8.6/msgs/en_au.msg new file mode 100644 index 0000000..7f9870c --- /dev/null +++ b/env/tcl/tcl8.6/msgs/en_au.msg @@ -0,0 +1,7 @@ +# created by tools/loadICU.tcl -- do not edit +namespace eval ::tcl::clock { + ::msgcat::mcset en_AU DATE_FORMAT "%e/%m/%Y" + ::msgcat::mcset en_AU TIME_FORMAT "%H:%M:%S" + ::msgcat::mcset en_AU TIME_FORMAT_12 "%I:%M:%S %P %z" + ::msgcat::mcset en_AU DATE_TIME_FORMAT "%e/%m/%Y %H:%M:%S %z" +} diff --git a/env/tcl/tcl8.6/msgs/en_be.msg b/env/tcl/tcl8.6/msgs/en_be.msg new file mode 100644 index 0000000..5072986 --- /dev/null +++ b/env/tcl/tcl8.6/msgs/en_be.msg @@ -0,0 +1,7 @@ +# created by tools/loadICU.tcl -- do not edit +namespace eval ::tcl::clock { + ::msgcat::mcset en_BE DATE_FORMAT "%d %b %Y" + ::msgcat::mcset en_BE TIME_FORMAT "%k:%M:%S" + ::msgcat::mcset en_BE TIME_FORMAT_12 "%k h %M min %S s %z" + ::msgcat::mcset en_BE DATE_TIME_FORMAT "%d %b %Y %k:%M:%S %z" +} diff --git a/env/tcl/tcl8.6/msgs/en_bw.msg b/env/tcl/tcl8.6/msgs/en_bw.msg new file mode 100644 index 0000000..8fd20c7 --- /dev/null +++ b/env/tcl/tcl8.6/msgs/en_bw.msg @@ -0,0 +1,6 @@ +# created by tools/loadICU.tcl -- do not edit +namespace eval ::tcl::clock { + ::msgcat::mcset en_BW DATE_FORMAT "%d %B %Y" + ::msgcat::mcset en_BW TIME_FORMAT_12 "%l:%M:%S %P" + ::msgcat::mcset en_BW DATE_TIME_FORMAT "%d %B %Y %l:%M:%S %P %z" +} diff --git a/env/tcl/tcl8.6/msgs/en_ca.msg b/env/tcl/tcl8.6/msgs/en_ca.msg new file mode 100644 index 0000000..278efe7 --- /dev/null +++ b/env/tcl/tcl8.6/msgs/en_ca.msg @@ -0,0 +1,7 @@ +# created by tools/loadICU.tcl -- do not edit +namespace eval ::tcl::clock { + ::msgcat::mcset en_CA DATE_FORMAT "%d/%m/%y" + ::msgcat::mcset en_CA TIME_FORMAT "%r" + ::msgcat::mcset en_CA TIME_FORMAT_12 "%I:%M:%S %p" + ::msgcat::mcset en_CA DATE_TIME_FORMAT "%a %d %b %Y %r %z" +} diff --git a/env/tcl/tcl8.6/msgs/en_gb.msg b/env/tcl/tcl8.6/msgs/en_gb.msg new file mode 100644 index 0000000..5c61c43 --- /dev/null +++ b/env/tcl/tcl8.6/msgs/en_gb.msg @@ -0,0 +1,7 @@ +# created by tools/loadICU.tcl -- do not edit +namespace eval ::tcl::clock { + ::msgcat::mcset en_GB DATE_FORMAT "%d/%m/%y" + ::msgcat::mcset en_GB TIME_FORMAT "%T" + ::msgcat::mcset en_GB TIME_FORMAT_12 "%T" + ::msgcat::mcset en_GB DATE_TIME_FORMAT "%a %d %b %Y %T %z" +} diff --git a/env/tcl/tcl8.6/msgs/en_hk.msg b/env/tcl/tcl8.6/msgs/en_hk.msg new file mode 100644 index 0000000..8b33bc0 --- /dev/null +++ b/env/tcl/tcl8.6/msgs/en_hk.msg @@ -0,0 +1,8 @@ +# created by tools/loadICU.tcl -- do not edit +namespace eval ::tcl::clock { + ::msgcat::mcset en_HK AM "AM" + ::msgcat::mcset en_HK PM "PM" + ::msgcat::mcset en_HK DATE_FORMAT "%B %e, %Y" + ::msgcat::mcset en_HK TIME_FORMAT_12 "%l:%M:%S %P" + ::msgcat::mcset en_HK DATE_TIME_FORMAT "%B %e, %Y %l:%M:%S %P %z" +} diff --git a/env/tcl/tcl8.6/msgs/en_ie.msg b/env/tcl/tcl8.6/msgs/en_ie.msg new file mode 100644 index 0000000..ba621cf --- /dev/null +++ b/env/tcl/tcl8.6/msgs/en_ie.msg @@ -0,0 +1,7 @@ +# created by tools/loadICU.tcl -- do not edit +namespace eval ::tcl::clock { + ::msgcat::mcset en_IE DATE_FORMAT "%d/%m/%y" + ::msgcat::mcset en_IE TIME_FORMAT "%T" + ::msgcat::mcset en_IE TIME_FORMAT_12 "%T" + ::msgcat::mcset en_IE DATE_TIME_FORMAT "%a %d %b %Y %T %z" +} diff --git a/env/tcl/tcl8.6/msgs/en_in.msg b/env/tcl/tcl8.6/msgs/en_in.msg new file mode 100644 index 0000000..a1f155d --- /dev/null +++ b/env/tcl/tcl8.6/msgs/en_in.msg @@ -0,0 +1,8 @@ +# created by tools/loadICU.tcl -- do not edit +namespace eval ::tcl::clock { + ::msgcat::mcset en_IN AM "AM" + ::msgcat::mcset en_IN PM "PM" + ::msgcat::mcset en_IN DATE_FORMAT "%d %B %Y" + ::msgcat::mcset en_IN TIME_FORMAT "%H:%M:%S" + ::msgcat::mcset en_IN DATE_TIME_FORMAT "%d %B %Y %H:%M:%S %z" +} diff --git a/env/tcl/tcl8.6/msgs/en_nz.msg b/env/tcl/tcl8.6/msgs/en_nz.msg new file mode 100644 index 0000000..b419017 --- /dev/null +++ b/env/tcl/tcl8.6/msgs/en_nz.msg @@ -0,0 +1,7 @@ +# created by tools/loadICU.tcl -- do not edit +namespace eval ::tcl::clock { + ::msgcat::mcset en_NZ DATE_FORMAT "%e/%m/%Y" + ::msgcat::mcset en_NZ TIME_FORMAT "%H:%M:%S" + ::msgcat::mcset en_NZ TIME_FORMAT_12 "%I:%M:%S %P %z" + ::msgcat::mcset en_NZ DATE_TIME_FORMAT "%e/%m/%Y %H:%M:%S %z" +} diff --git a/env/tcl/tcl8.6/msgs/en_ph.msg b/env/tcl/tcl8.6/msgs/en_ph.msg new file mode 100644 index 0000000..682666d --- /dev/null +++ b/env/tcl/tcl8.6/msgs/en_ph.msg @@ -0,0 +1,8 @@ +# created by tools/loadICU.tcl -- do not edit +namespace eval ::tcl::clock { + ::msgcat::mcset en_PH AM "AM" + ::msgcat::mcset en_PH PM "PM" + ::msgcat::mcset en_PH DATE_FORMAT "%B %e, %Y" + ::msgcat::mcset en_PH TIME_FORMAT_12 "%l:%M:%S %P" + ::msgcat::mcset en_PH DATE_TIME_FORMAT "%B %e, %Y %l:%M:%S %P %z" +} diff --git a/env/tcl/tcl8.6/msgs/en_sg.msg b/env/tcl/tcl8.6/msgs/en_sg.msg new file mode 100644 index 0000000..4dc5b1d --- /dev/null +++ b/env/tcl/tcl8.6/msgs/en_sg.msg @@ -0,0 +1,6 @@ +# created by tools/loadICU.tcl -- do not edit +namespace eval ::tcl::clock { + ::msgcat::mcset en_SG DATE_FORMAT "%d %b %Y" + ::msgcat::mcset en_SG TIME_FORMAT_12 "%P %I:%M:%S" + ::msgcat::mcset en_SG DATE_TIME_FORMAT "%d %b %Y %P %I:%M:%S %z" +} diff --git a/env/tcl/tcl8.6/msgs/en_za.msg b/env/tcl/tcl8.6/msgs/en_za.msg new file mode 100644 index 0000000..fe43797 --- /dev/null +++ b/env/tcl/tcl8.6/msgs/en_za.msg @@ -0,0 +1,6 @@ +# created by tools/loadICU.tcl -- do not edit +namespace eval ::tcl::clock { + ::msgcat::mcset en_ZA DATE_FORMAT "%Y/%m/%d" + ::msgcat::mcset en_ZA TIME_FORMAT_12 "%I:%M:%S" + ::msgcat::mcset en_ZA DATE_TIME_FORMAT "%Y/%m/%d %I:%M:%S %z" +} diff --git a/env/tcl/tcl8.6/msgs/en_zw.msg b/env/tcl/tcl8.6/msgs/en_zw.msg new file mode 100644 index 0000000..2a5804f --- /dev/null +++ b/env/tcl/tcl8.6/msgs/en_zw.msg @@ -0,0 +1,6 @@ +# created by tools/loadICU.tcl -- do not edit +namespace eval ::tcl::clock { + ::msgcat::mcset en_ZW DATE_FORMAT "%d %B %Y" + ::msgcat::mcset en_ZW TIME_FORMAT_12 "%l:%M:%S %P" + ::msgcat::mcset en_ZW DATE_TIME_FORMAT "%d %B %Y %l:%M:%S %P %z" +} diff --git a/env/tcl/tcl8.6/msgs/eo.msg b/env/tcl/tcl8.6/msgs/eo.msg new file mode 100644 index 0000000..1d2a24f --- /dev/null +++ b/env/tcl/tcl8.6/msgs/eo.msg @@ -0,0 +1,54 @@ +# created by tools/loadICU.tcl -- do not edit +namespace eval ::tcl::clock { + ::msgcat::mcset eo DAYS_OF_WEEK_ABBREV [list \ + "di"\ + "lu"\ + "ma"\ + "me"\ + "\u0135a"\ + "ve"\ + "sa"] + ::msgcat::mcset eo DAYS_OF_WEEK_FULL [list \ + "diman\u0109o"\ + "lundo"\ + "mardo"\ + "merkredo"\ + "\u0135a\u016ddo"\ + "vendredo"\ + "sabato"] + ::msgcat::mcset eo MONTHS_ABBREV [list \ + "jan"\ + "feb"\ + "mar"\ + "apr"\ + "maj"\ + "jun"\ + "jul"\ + "a\u016dg"\ + "sep"\ + "okt"\ + "nov"\ + "dec"\ + ""] + ::msgcat::mcset eo MONTHS_FULL [list \ + "januaro"\ + "februaro"\ + "marto"\ + "aprilo"\ + "majo"\ + "junio"\ + "julio"\ + "a\u016dgusto"\ + "septembro"\ + "oktobro"\ + "novembro"\ + "decembro"\ + ""] + ::msgcat::mcset eo BCE "aK" + ::msgcat::mcset eo CE "pK" + ::msgcat::mcset eo AM "atm" + ::msgcat::mcset eo PM "ptm" + ::msgcat::mcset eo DATE_FORMAT "%Y-%b-%d" + ::msgcat::mcset eo TIME_FORMAT "%H:%M:%S" + ::msgcat::mcset eo DATE_TIME_FORMAT "%Y-%b-%d %H:%M:%S %z" +} diff --git a/env/tcl/tcl8.6/msgs/es.msg b/env/tcl/tcl8.6/msgs/es.msg new file mode 100644 index 0000000..a24f0a1 --- /dev/null +++ b/env/tcl/tcl8.6/msgs/es.msg @@ -0,0 +1,52 @@ +# created by tools/loadICU.tcl -- do not edit +namespace eval ::tcl::clock { + ::msgcat::mcset es DAYS_OF_WEEK_ABBREV [list \ + "dom"\ + "lun"\ + "mar"\ + "mi\u00e9"\ + "jue"\ + "vie"\ + "s\u00e1b"] + ::msgcat::mcset es DAYS_OF_WEEK_FULL [list \ + "domingo"\ + "lunes"\ + "martes"\ + "mi\u00e9rcoles"\ + "jueves"\ + "viernes"\ + "s\u00e1bado"] + ::msgcat::mcset es MONTHS_ABBREV [list \ + "ene"\ + "feb"\ + "mar"\ + "abr"\ + "may"\ + "jun"\ + "jul"\ + "ago"\ + "sep"\ + "oct"\ + "nov"\ + "dic"\ + ""] + ::msgcat::mcset es MONTHS_FULL [list \ + "enero"\ + "febrero"\ + "marzo"\ + "abril"\ + "mayo"\ + "junio"\ + "julio"\ + "agosto"\ + "septiembre"\ + "octubre"\ + "noviembre"\ + "diciembre"\ + ""] + ::msgcat::mcset es BCE "a.C." + ::msgcat::mcset es CE "d.C." + ::msgcat::mcset es DATE_FORMAT "%e de %B de %Y" + ::msgcat::mcset es TIME_FORMAT "%k:%M:%S" + ::msgcat::mcset es DATE_TIME_FORMAT "%e de %B de %Y %k:%M:%S %z" +} diff --git a/env/tcl/tcl8.6/msgs/es_ar.msg b/env/tcl/tcl8.6/msgs/es_ar.msg new file mode 100644 index 0000000..7d35027 --- /dev/null +++ b/env/tcl/tcl8.6/msgs/es_ar.msg @@ -0,0 +1,6 @@ +# created by tools/loadICU.tcl -- do not edit +namespace eval ::tcl::clock { + ::msgcat::mcset es_AR DATE_FORMAT "%d/%m/%Y" + ::msgcat::mcset es_AR TIME_FORMAT "%H:%M:%S" + ::msgcat::mcset es_AR DATE_TIME_FORMAT "%d/%m/%Y %H:%M:%S %z" +} diff --git a/env/tcl/tcl8.6/msgs/es_bo.msg b/env/tcl/tcl8.6/msgs/es_bo.msg new file mode 100644 index 0000000..498ad0d --- /dev/null +++ b/env/tcl/tcl8.6/msgs/es_bo.msg @@ -0,0 +1,6 @@ +# created by tools/loadICU.tcl -- do not edit +namespace eval ::tcl::clock { + ::msgcat::mcset es_BO DATE_FORMAT "%d-%m-%Y" + ::msgcat::mcset es_BO TIME_FORMAT_12 "%I:%M:%S %P" + ::msgcat::mcset es_BO DATE_TIME_FORMAT "%d-%m-%Y %I:%M:%S %P %z" +} diff --git a/env/tcl/tcl8.6/msgs/es_cl.msg b/env/tcl/tcl8.6/msgs/es_cl.msg new file mode 100644 index 0000000..31d465c --- /dev/null +++ b/env/tcl/tcl8.6/msgs/es_cl.msg @@ -0,0 +1,6 @@ +# created by tools/loadICU.tcl -- do not edit +namespace eval ::tcl::clock { + ::msgcat::mcset es_CL DATE_FORMAT "%d-%m-%Y" + ::msgcat::mcset es_CL TIME_FORMAT_12 "%I:%M:%S %P" + ::msgcat::mcset es_CL DATE_TIME_FORMAT "%d-%m-%Y %I:%M:%S %P %z" +} diff --git a/env/tcl/tcl8.6/msgs/es_co.msg b/env/tcl/tcl8.6/msgs/es_co.msg new file mode 100644 index 0000000..77e57f0 --- /dev/null +++ b/env/tcl/tcl8.6/msgs/es_co.msg @@ -0,0 +1,6 @@ +# created by tools/loadICU.tcl -- do not edit +namespace eval ::tcl::clock { + ::msgcat::mcset es_CO DATE_FORMAT "%e/%m/%Y" + ::msgcat::mcset es_CO TIME_FORMAT_12 "%I:%M:%S %P" + ::msgcat::mcset es_CO DATE_TIME_FORMAT "%e/%m/%Y %I:%M:%S %P %z" +} diff --git a/env/tcl/tcl8.6/msgs/es_cr.msg b/env/tcl/tcl8.6/msgs/es_cr.msg new file mode 100644 index 0000000..7a652fa --- /dev/null +++ b/env/tcl/tcl8.6/msgs/es_cr.msg @@ -0,0 +1,6 @@ +# created by tools/loadICU.tcl -- do not edit +namespace eval ::tcl::clock { + ::msgcat::mcset es_CR DATE_FORMAT "%d/%m/%Y" + ::msgcat::mcset es_CR TIME_FORMAT_12 "%I:%M:%S %P" + ::msgcat::mcset es_CR DATE_TIME_FORMAT "%d/%m/%Y %I:%M:%S %P %z" +} diff --git a/env/tcl/tcl8.6/msgs/es_do.msg b/env/tcl/tcl8.6/msgs/es_do.msg new file mode 100644 index 0000000..0e283da --- /dev/null +++ b/env/tcl/tcl8.6/msgs/es_do.msg @@ -0,0 +1,6 @@ +# created by tools/loadICU.tcl -- do not edit +namespace eval ::tcl::clock { + ::msgcat::mcset es_DO DATE_FORMAT "%m/%d/%Y" + ::msgcat::mcset es_DO TIME_FORMAT_12 "%I:%M:%S %P" + ::msgcat::mcset es_DO DATE_TIME_FORMAT "%m/%d/%Y %I:%M:%S %P %z" +} diff --git a/env/tcl/tcl8.6/msgs/es_ec.msg b/env/tcl/tcl8.6/msgs/es_ec.msg new file mode 100644 index 0000000..9e921e0 --- /dev/null +++ b/env/tcl/tcl8.6/msgs/es_ec.msg @@ -0,0 +1,6 @@ +# created by tools/loadICU.tcl -- do not edit +namespace eval ::tcl::clock { + ::msgcat::mcset es_EC DATE_FORMAT "%d/%m/%Y" + ::msgcat::mcset es_EC TIME_FORMAT_12 "%I:%M:%S %P" + ::msgcat::mcset es_EC DATE_TIME_FORMAT "%d/%m/%Y %I:%M:%S %P %z" +} diff --git a/env/tcl/tcl8.6/msgs/es_gt.msg b/env/tcl/tcl8.6/msgs/es_gt.msg new file mode 100644 index 0000000..ecd6faf --- /dev/null +++ b/env/tcl/tcl8.6/msgs/es_gt.msg @@ -0,0 +1,6 @@ +# created by tools/loadICU.tcl -- do not edit +namespace eval ::tcl::clock { + ::msgcat::mcset es_GT DATE_FORMAT "%e/%m/%Y" + ::msgcat::mcset es_GT TIME_FORMAT_12 "%I:%M:%S %P" + ::msgcat::mcset es_GT DATE_TIME_FORMAT "%e/%m/%Y %I:%M:%S %P %z" +} diff --git a/env/tcl/tcl8.6/msgs/es_hn.msg b/env/tcl/tcl8.6/msgs/es_hn.msg new file mode 100644 index 0000000..a758ca2 --- /dev/null +++ b/env/tcl/tcl8.6/msgs/es_hn.msg @@ -0,0 +1,6 @@ +# created by tools/loadICU.tcl -- do not edit +namespace eval ::tcl::clock { + ::msgcat::mcset es_HN DATE_FORMAT "%m-%d-%Y" + ::msgcat::mcset es_HN TIME_FORMAT_12 "%I:%M:%S %P" + ::msgcat::mcset es_HN DATE_TIME_FORMAT "%m-%d-%Y %I:%M:%S %P %z" +} diff --git a/env/tcl/tcl8.6/msgs/es_mx.msg b/env/tcl/tcl8.6/msgs/es_mx.msg new file mode 100644 index 0000000..7cfb545 --- /dev/null +++ b/env/tcl/tcl8.6/msgs/es_mx.msg @@ -0,0 +1,6 @@ +# created by tools/loadICU.tcl -- do not edit +namespace eval ::tcl::clock { + ::msgcat::mcset es_MX DATE_FORMAT "%e/%m/%Y" + ::msgcat::mcset es_MX TIME_FORMAT_12 "%I:%M:%S %P" + ::msgcat::mcset es_MX DATE_TIME_FORMAT "%e/%m/%Y %I:%M:%S %P %z" +} diff --git a/env/tcl/tcl8.6/msgs/es_ni.msg b/env/tcl/tcl8.6/msgs/es_ni.msg new file mode 100644 index 0000000..7c39495 --- /dev/null +++ b/env/tcl/tcl8.6/msgs/es_ni.msg @@ -0,0 +1,6 @@ +# created by tools/loadICU.tcl -- do not edit +namespace eval ::tcl::clock { + ::msgcat::mcset es_NI DATE_FORMAT "%m-%d-%Y" + ::msgcat::mcset es_NI TIME_FORMAT_12 "%I:%M:%S %P" + ::msgcat::mcset es_NI DATE_TIME_FORMAT "%m-%d-%Y %I:%M:%S %P %z" +} diff --git a/env/tcl/tcl8.6/msgs/es_pa.msg b/env/tcl/tcl8.6/msgs/es_pa.msg new file mode 100644 index 0000000..cecacdc --- /dev/null +++ b/env/tcl/tcl8.6/msgs/es_pa.msg @@ -0,0 +1,6 @@ +# created by tools/loadICU.tcl -- do not edit +namespace eval ::tcl::clock { + ::msgcat::mcset es_PA DATE_FORMAT "%m/%d/%Y" + ::msgcat::mcset es_PA TIME_FORMAT_12 "%I:%M:%S %P" + ::msgcat::mcset es_PA DATE_TIME_FORMAT "%m/%d/%Y %I:%M:%S %P %z" +} diff --git a/env/tcl/tcl8.6/msgs/es_pe.msg b/env/tcl/tcl8.6/msgs/es_pe.msg new file mode 100644 index 0000000..9f90595 --- /dev/null +++ b/env/tcl/tcl8.6/msgs/es_pe.msg @@ -0,0 +1,6 @@ +# created by tools/loadICU.tcl -- do not edit +namespace eval ::tcl::clock { + ::msgcat::mcset es_PE DATE_FORMAT "%d/%m/%Y" + ::msgcat::mcset es_PE TIME_FORMAT_12 "%I:%M:%S %P" + ::msgcat::mcset es_PE DATE_TIME_FORMAT "%d/%m/%Y %I:%M:%S %P %z" +} diff --git a/env/tcl/tcl8.6/msgs/es_pr.msg b/env/tcl/tcl8.6/msgs/es_pr.msg new file mode 100644 index 0000000..8511b12 --- /dev/null +++ b/env/tcl/tcl8.6/msgs/es_pr.msg @@ -0,0 +1,6 @@ +# created by tools/loadICU.tcl -- do not edit +namespace eval ::tcl::clock { + ::msgcat::mcset es_PR DATE_FORMAT "%m-%d-%Y" + ::msgcat::mcset es_PR TIME_FORMAT_12 "%I:%M:%S %P" + ::msgcat::mcset es_PR DATE_TIME_FORMAT "%m-%d-%Y %I:%M:%S %P %z" +} diff --git a/env/tcl/tcl8.6/msgs/es_py.msg b/env/tcl/tcl8.6/msgs/es_py.msg new file mode 100644 index 0000000..aa93d36 --- /dev/null +++ b/env/tcl/tcl8.6/msgs/es_py.msg @@ -0,0 +1,6 @@ +# created by tools/loadICU.tcl -- do not edit +namespace eval ::tcl::clock { + ::msgcat::mcset es_PY DATE_FORMAT "%d/%m/%Y" + ::msgcat::mcset es_PY TIME_FORMAT_12 "%I:%M:%S %P" + ::msgcat::mcset es_PY DATE_TIME_FORMAT "%d/%m/%Y %I:%M:%S %P %z" +} diff --git a/env/tcl/tcl8.6/msgs/es_sv.msg b/env/tcl/tcl8.6/msgs/es_sv.msg new file mode 100644 index 0000000..fc7954d --- /dev/null +++ b/env/tcl/tcl8.6/msgs/es_sv.msg @@ -0,0 +1,6 @@ +# created by tools/loadICU.tcl -- do not edit +namespace eval ::tcl::clock { + ::msgcat::mcset es_SV DATE_FORMAT "%m-%d-%Y" + ::msgcat::mcset es_SV TIME_FORMAT_12 "%I:%M:%S %P" + ::msgcat::mcset es_SV DATE_TIME_FORMAT "%m-%d-%Y %I:%M:%S %P %z" +} diff --git a/env/tcl/tcl8.6/msgs/es_uy.msg b/env/tcl/tcl8.6/msgs/es_uy.msg new file mode 100644 index 0000000..b33525c --- /dev/null +++ b/env/tcl/tcl8.6/msgs/es_uy.msg @@ -0,0 +1,6 @@ +# created by tools/loadICU.tcl -- do not edit +namespace eval ::tcl::clock { + ::msgcat::mcset es_UY DATE_FORMAT "%d/%m/%Y" + ::msgcat::mcset es_UY TIME_FORMAT_12 "%I:%M:%S %P" + ::msgcat::mcset es_UY DATE_TIME_FORMAT "%d/%m/%Y %I:%M:%S %P %z" +} diff --git a/env/tcl/tcl8.6/msgs/es_ve.msg b/env/tcl/tcl8.6/msgs/es_ve.msg new file mode 100644 index 0000000..7c2a7b0 --- /dev/null +++ b/env/tcl/tcl8.6/msgs/es_ve.msg @@ -0,0 +1,6 @@ +# created by tools/loadICU.tcl -- do not edit +namespace eval ::tcl::clock { + ::msgcat::mcset es_VE DATE_FORMAT "%d/%m/%Y" + ::msgcat::mcset es_VE TIME_FORMAT_12 "%I:%M:%S %P" + ::msgcat::mcset es_VE DATE_TIME_FORMAT "%d/%m/%Y %I:%M:%S %P %z" +} diff --git a/env/tcl/tcl8.6/msgs/et.msg b/env/tcl/tcl8.6/msgs/et.msg new file mode 100644 index 0000000..8d32e9e --- /dev/null +++ b/env/tcl/tcl8.6/msgs/et.msg @@ -0,0 +1,52 @@ +# created by tools/loadICU.tcl -- do not edit +namespace eval ::tcl::clock { + ::msgcat::mcset et DAYS_OF_WEEK_ABBREV [list \ + "P"\ + "E"\ + "T"\ + "K"\ + "N"\ + "R"\ + "L"] + ::msgcat::mcset et DAYS_OF_WEEK_FULL [list \ + "p\u00fchap\u00e4ev"\ + "esmasp\u00e4ev"\ + "teisip\u00e4ev"\ + "kolmap\u00e4ev"\ + "neljap\u00e4ev"\ + "reede"\ + "laup\u00e4ev"] + ::msgcat::mcset et MONTHS_ABBREV [list \ + "Jaan"\ + "Veebr"\ + "M\u00e4rts"\ + "Apr"\ + "Mai"\ + "Juuni"\ + "Juuli"\ + "Aug"\ + "Sept"\ + "Okt"\ + "Nov"\ + "Dets"\ + ""] + ::msgcat::mcset et MONTHS_FULL [list \ + "Jaanuar"\ + "Veebruar"\ + "M\u00e4rts"\ + "Aprill"\ + "Mai"\ + "Juuni"\ + "Juuli"\ + "August"\ + "September"\ + "Oktoober"\ + "November"\ + "Detsember"\ + ""] + ::msgcat::mcset et BCE "e.m.a." + ::msgcat::mcset et CE "m.a.j." + ::msgcat::mcset et DATE_FORMAT "%e-%m-%Y" + ::msgcat::mcset et TIME_FORMAT "%k:%M:%S" + ::msgcat::mcset et DATE_TIME_FORMAT "%e-%m-%Y %k:%M:%S %z" +} diff --git a/env/tcl/tcl8.6/msgs/eu.msg b/env/tcl/tcl8.6/msgs/eu.msg new file mode 100644 index 0000000..cf708b6 --- /dev/null +++ b/env/tcl/tcl8.6/msgs/eu.msg @@ -0,0 +1,47 @@ +# created by tools/loadICU.tcl -- do not edit +namespace eval ::tcl::clock { + ::msgcat::mcset eu DAYS_OF_WEEK_ABBREV [list \ + "igandea"\ + "astelehena"\ + "asteartea"\ + "asteazkena"\ + "osteguna"\ + "ostirala"\ + "larunbata"] + ::msgcat::mcset eu DAYS_OF_WEEK_FULL [list \ + "igandea"\ + "astelehena"\ + "asteartea"\ + "asteazkena"\ + "osteguna"\ + "ostirala"\ + "larunbata"] + ::msgcat::mcset eu MONTHS_ABBREV [list \ + "urt"\ + "ots"\ + "mar"\ + "api"\ + "mai"\ + "eka"\ + "uzt"\ + "abu"\ + "ira"\ + "urr"\ + "aza"\ + "abe"\ + ""] + ::msgcat::mcset eu MONTHS_FULL [list \ + "urtarrila"\ + "otsaila"\ + "martxoa"\ + "apirila"\ + "maiatza"\ + "ekaina"\ + "uztaila"\ + "abuztua"\ + "iraila"\ + "urria"\ + "azaroa"\ + "abendua"\ + ""] +} diff --git a/env/tcl/tcl8.6/msgs/eu_es.msg b/env/tcl/tcl8.6/msgs/eu_es.msg new file mode 100644 index 0000000..2694418 --- /dev/null +++ b/env/tcl/tcl8.6/msgs/eu_es.msg @@ -0,0 +1,7 @@ +# created by tools/loadICU.tcl -- do not edit +namespace eval ::tcl::clock { + ::msgcat::mcset eu_ES DATE_FORMAT "%a, %Yeko %bren %da" + ::msgcat::mcset eu_ES TIME_FORMAT "%T" + ::msgcat::mcset eu_ES TIME_FORMAT_12 "%T" + ::msgcat::mcset eu_ES DATE_TIME_FORMAT "%y-%m-%d %T %z" +} diff --git a/env/tcl/tcl8.6/msgs/fa.msg b/env/tcl/tcl8.6/msgs/fa.msg new file mode 100644 index 0000000..89b2f90 --- /dev/null +++ b/env/tcl/tcl8.6/msgs/fa.msg @@ -0,0 +1,47 @@ +# created by tools/loadICU.tcl -- do not edit +namespace eval ::tcl::clock { + ::msgcat::mcset fa DAYS_OF_WEEK_ABBREV [list \ + "\u06cc\u2214"\ + "\u062f\u2214"\ + "\u0633\u2214"\ + "\u0686\u2214"\ + "\u067e\u2214"\ + "\u062c\u2214"\ + "\u0634\u2214"] + ::msgcat::mcset fa DAYS_OF_WEEK_FULL [list \ + "\u06cc\u06cc\u200c\u0634\u0646\u0628\u0647"\ + "\u062f\u0648\u0634\u0646\u0628\u0647"\ + "\u0633\u0647\u200c\u0634\u0646\u0628\u0647"\ + "\u0686\u0647\u0627\u0631\u0634\u0646\u0628\u0647"\ + "\u067e\u0646\u062c\u200c\u0634\u0646\u0628\u0647"\ + "\u062c\u0645\u0639\u0647"\ + "\u0634\u0646\u0628\u0647"] + ::msgcat::mcset fa MONTHS_ABBREV [list \ + "\u0698\u0627\u0646"\ + "\u0641\u0648\u0631"\ + "\u0645\u0627\u0631"\ + "\u0622\u0648\u0631"\ + "\u0645\u0640\u0647"\ + "\u0698\u0648\u0646"\ + "\u0698\u0648\u06cc"\ + "\u0627\u0648\u062a"\ + "\u0633\u067e\u062a"\ + "\u0627\u0643\u062a"\ + "\u0646\u0648\u0627"\ + "\u062f\u0633\u0627"\ + ""] + ::msgcat::mcset fa MONTHS_FULL [list \ + "\u0698\u0627\u0646\u0648\u06cc\u0647"\ + "\u0641\u0648\u0631\u0648\u06cc\u0647"\ + "\u0645\u0627\u0631\u0633"\ + "\u0622\u0648\u0631\u06cc\u0644"\ + "\u0645\u0647"\ + "\u0698\u0648\u0626\u0646"\ + "\u0698\u0648\u0626\u06cc\u0647"\ + "\u0627\u0648\u062a"\ + "\u0633\u067e\u062a\u0627\u0645\u0628\u0631"\ + "\u0627\u0643\u062a\u0628\u0631"\ + "\u0646\u0648\u0627\u0645\u0628\u0631"\ + "\u062f\u0633\u0627\u0645\u0628\u0631"\ + ""] +} diff --git a/env/tcl/tcl8.6/msgs/fa_in.msg b/env/tcl/tcl8.6/msgs/fa_in.msg new file mode 100644 index 0000000..adc9e91 --- /dev/null +++ b/env/tcl/tcl8.6/msgs/fa_in.msg @@ -0,0 +1,52 @@ +# created by tools/loadICU.tcl -- do not edit +namespace eval ::tcl::clock { + ::msgcat::mcset fa_IN DAYS_OF_WEEK_ABBREV [list \ + "\u06cc\u2214"\ + "\u062f\u2214"\ + "\u0633\u2214"\ + "\u0686\u2214"\ + "\u067e\u2214"\ + "\u062c\u2214"\ + "\u0634\u2214"] + ::msgcat::mcset fa_IN DAYS_OF_WEEK_FULL [list \ + "\u06cc\u06cc\u200c\u0634\u0646\u0628\u0647"\ + "\u062f\u0648\u0634\u0646\u0628\u0647"\ + "\u0633\u0647\u200c\u0634\u0646\u0628\u0647"\ + "\u0686\u0647\u0627\u0631\u0634\u0646\u0628\u0647"\ + "\u067e\u0646\u062c\u200c\u0634\u0646\u0628\u0647"\ + "\u062c\u0645\u0639\u0647"\ + "\u0634\u0646\u0628\u0647"] + ::msgcat::mcset fa_IN MONTHS_ABBREV [list \ + "\u0698\u0627\u0646"\ + "\u0641\u0648\u0631"\ + "\u0645\u0627\u0631"\ + "\u0622\u0648\u0631"\ + "\u0645\u0640\u0647"\ + "\u0698\u0648\u0646"\ + "\u0698\u0648\u06cc"\ + "\u0627\u0648\u062a"\ + "\u0633\u067e\u062a"\ + "\u0627\u0643\u062a"\ + "\u0646\u0648\u0627"\ + "\u062f\u0633\u0627"\ + ""] + ::msgcat::mcset fa_IN MONTHS_FULL [list \ + "\u0698\u0627\u0646\u0648\u06cc\u0647"\ + "\u0641\u0648\u0631\u0648\u06cc\u0647"\ + "\u0645\u0627\u0631\u0633"\ + "\u0622\u0648\u0631\u06cc\u0644"\ + "\u0645\u0647"\ + "\u0698\u0648\u0626\u0646"\ + "\u0698\u0648\u0626\u06cc\u0647"\ + "\u0627\u0648\u062a"\ + "\u0633\u067e\u062a\u0627\u0645\u0628\u0631"\ + "\u0627\u0643\u062a\u0628\u0631"\ + "\u0646\u0648\u0627\u0645\u0628\u0631"\ + "\u062f\u0633\u0627\u0645\u0628\u0631"\ + ""] + ::msgcat::mcset fa_IN AM "\u0635\u0628\u062d" + ::msgcat::mcset fa_IN PM "\u0639\u0635\u0631" + ::msgcat::mcset fa_IN DATE_FORMAT "%A %d %B %Y" + ::msgcat::mcset fa_IN TIME_FORMAT_12 "%I:%M:%S %z" + ::msgcat::mcset fa_IN DATE_TIME_FORMAT "%A %d %B %Y %I:%M:%S %z %z" +} diff --git a/env/tcl/tcl8.6/msgs/fa_ir.msg b/env/tcl/tcl8.6/msgs/fa_ir.msg new file mode 100644 index 0000000..597ce9d --- /dev/null +++ b/env/tcl/tcl8.6/msgs/fa_ir.msg @@ -0,0 +1,9 @@ +# created by tools/loadICU.tcl -- do not edit +namespace eval ::tcl::clock { + ::msgcat::mcset fa_IR AM "\u0635\u0628\u062d" + ::msgcat::mcset fa_IR PM "\u0639\u0635\u0631" + ::msgcat::mcset fa_IR DATE_FORMAT "%d\u2044%m\u2044%Y" + ::msgcat::mcset fa_IR TIME_FORMAT "%S:%M:%H" + ::msgcat::mcset fa_IR TIME_FORMAT_12 "%S:%M:%l %P" + ::msgcat::mcset fa_IR DATE_TIME_FORMAT "%d\u2044%m\u2044%Y %S:%M:%H %z" +} diff --git a/env/tcl/tcl8.6/msgs/fi.msg b/env/tcl/tcl8.6/msgs/fi.msg new file mode 100644 index 0000000..acabba0 --- /dev/null +++ b/env/tcl/tcl8.6/msgs/fi.msg @@ -0,0 +1,50 @@ +# created by tools/loadICU.tcl -- do not edit +namespace eval ::tcl::clock { + ::msgcat::mcset fi DAYS_OF_WEEK_ABBREV [list \ + "su"\ + "ma"\ + "ti"\ + "ke"\ + "to"\ + "pe"\ + "la"] + ::msgcat::mcset fi DAYS_OF_WEEK_FULL [list \ + "sunnuntai"\ + "maanantai"\ + "tiistai"\ + "keskiviikko"\ + "torstai"\ + "perjantai"\ + "lauantai"] + ::msgcat::mcset fi MONTHS_ABBREV [list \ + "tammi"\ + "helmi"\ + "maalis"\ + "huhti"\ + "touko"\ + "kes\u00e4"\ + "hein\u00e4"\ + "elo"\ + "syys"\ + "loka"\ + "marras"\ + "joulu"\ + ""] + ::msgcat::mcset fi MONTHS_FULL [list \ + "tammikuu"\ + "helmikuu"\ + "maaliskuu"\ + "huhtikuu"\ + "toukokuu"\ + "kes\u00e4kuu"\ + "hein\u00e4kuu"\ + "elokuu"\ + "syyskuu"\ + "lokakuu"\ + "marraskuu"\ + "joulukuu"\ + ""] + ::msgcat::mcset fi DATE_FORMAT "%e.%m.%Y" + ::msgcat::mcset fi TIME_FORMAT "%k:%M:%S" + ::msgcat::mcset fi DATE_TIME_FORMAT "%e.%m.%Y %k:%M:%S %z" +} diff --git a/env/tcl/tcl8.6/msgs/fo.msg b/env/tcl/tcl8.6/msgs/fo.msg new file mode 100644 index 0000000..4696e62 --- /dev/null +++ b/env/tcl/tcl8.6/msgs/fo.msg @@ -0,0 +1,47 @@ +# created by tools/loadICU.tcl -- do not edit +namespace eval ::tcl::clock { + ::msgcat::mcset fo DAYS_OF_WEEK_ABBREV [list \ + "sun"\ + "m\u00e1n"\ + "t\u00fds"\ + "mik"\ + "h\u00f3s"\ + "fr\u00ed"\ + "ley"] + ::msgcat::mcset fo DAYS_OF_WEEK_FULL [list \ + "sunnudagur"\ + "m\u00e1nadagur"\ + "t\u00fdsdagur"\ + "mikudagur"\ + "h\u00f3sdagur"\ + "fr\u00edggjadagur"\ + "leygardagur"] + ::msgcat::mcset fo MONTHS_ABBREV [list \ + "jan"\ + "feb"\ + "mar"\ + "apr"\ + "mai"\ + "jun"\ + "jul"\ + "aug"\ + "sep"\ + "okt"\ + "nov"\ + "des"\ + ""] + ::msgcat::mcset fo MONTHS_FULL [list \ + "januar"\ + "februar"\ + "mars"\ + "apr\u00edl"\ + "mai"\ + "juni"\ + "juli"\ + "august"\ + "september"\ + "oktober"\ + "november"\ + "desember"\ + ""] +} diff --git a/env/tcl/tcl8.6/msgs/fo_fo.msg b/env/tcl/tcl8.6/msgs/fo_fo.msg new file mode 100644 index 0000000..2392b8e --- /dev/null +++ b/env/tcl/tcl8.6/msgs/fo_fo.msg @@ -0,0 +1,7 @@ +# created by tools/loadICU.tcl -- do not edit +namespace eval ::tcl::clock { + ::msgcat::mcset fo_FO DATE_FORMAT "%d/%m-%Y" + ::msgcat::mcset fo_FO TIME_FORMAT "%T" + ::msgcat::mcset fo_FO TIME_FORMAT_12 "%T" + ::msgcat::mcset fo_FO DATE_TIME_FORMAT "%a %d %b %Y %T %z" +} diff --git a/env/tcl/tcl8.6/msgs/fr.msg b/env/tcl/tcl8.6/msgs/fr.msg new file mode 100644 index 0000000..55b19bf --- /dev/null +++ b/env/tcl/tcl8.6/msgs/fr.msg @@ -0,0 +1,52 @@ +# created by tools/loadICU.tcl -- do not edit +namespace eval ::tcl::clock { + ::msgcat::mcset fr DAYS_OF_WEEK_ABBREV [list \ + "dim."\ + "lun."\ + "mar."\ + "mer."\ + "jeu."\ + "ven."\ + "sam."] + ::msgcat::mcset fr DAYS_OF_WEEK_FULL [list \ + "dimanche"\ + "lundi"\ + "mardi"\ + "mercredi"\ + "jeudi"\ + "vendredi"\ + "samedi"] + ::msgcat::mcset fr MONTHS_ABBREV [list \ + "janv."\ + "f\u00e9vr."\ + "mars"\ + "avr."\ + "mai"\ + "juin"\ + "juil."\ + "ao\u00fbt"\ + "sept."\ + "oct."\ + "nov."\ + "d\u00e9c."\ + ""] + ::msgcat::mcset fr MONTHS_FULL [list \ + "janvier"\ + "f\u00e9vrier"\ + "mars"\ + "avril"\ + "mai"\ + "juin"\ + "juillet"\ + "ao\u00fbt"\ + "septembre"\ + "octobre"\ + "novembre"\ + "d\u00e9cembre"\ + ""] + ::msgcat::mcset fr BCE "av. J.-C." + ::msgcat::mcset fr CE "ap. J.-C." + ::msgcat::mcset fr DATE_FORMAT "%e %B %Y" + ::msgcat::mcset fr TIME_FORMAT "%H:%M:%S" + ::msgcat::mcset fr DATE_TIME_FORMAT "%e %B %Y %H:%M:%S %z" +} diff --git a/env/tcl/tcl8.6/msgs/fr_be.msg b/env/tcl/tcl8.6/msgs/fr_be.msg new file mode 100644 index 0000000..cdb13bd --- /dev/null +++ b/env/tcl/tcl8.6/msgs/fr_be.msg @@ -0,0 +1,7 @@ +# created by tools/loadICU.tcl -- do not edit +namespace eval ::tcl::clock { + ::msgcat::mcset fr_BE DATE_FORMAT "%d/%m/%y" + ::msgcat::mcset fr_BE TIME_FORMAT "%T" + ::msgcat::mcset fr_BE TIME_FORMAT_12 "%T" + ::msgcat::mcset fr_BE DATE_TIME_FORMAT "%a %d %b %Y %T %z" +} diff --git a/env/tcl/tcl8.6/msgs/fr_ca.msg b/env/tcl/tcl8.6/msgs/fr_ca.msg new file mode 100644 index 0000000..00ccfff --- /dev/null +++ b/env/tcl/tcl8.6/msgs/fr_ca.msg @@ -0,0 +1,7 @@ +# created by tools/loadICU.tcl -- do not edit +namespace eval ::tcl::clock { + ::msgcat::mcset fr_CA DATE_FORMAT "%Y-%m-%d" + ::msgcat::mcset fr_CA TIME_FORMAT "%T" + ::msgcat::mcset fr_CA TIME_FORMAT_12 "%T" + ::msgcat::mcset fr_CA DATE_TIME_FORMAT "%a %d %b %Y %T %z" +} diff --git a/env/tcl/tcl8.6/msgs/fr_ch.msg b/env/tcl/tcl8.6/msgs/fr_ch.msg new file mode 100644 index 0000000..7e2bac7 --- /dev/null +++ b/env/tcl/tcl8.6/msgs/fr_ch.msg @@ -0,0 +1,7 @@ +# created by tools/loadICU.tcl -- do not edit +namespace eval ::tcl::clock { + ::msgcat::mcset fr_CH DATE_FORMAT "%d. %m. %y" + ::msgcat::mcset fr_CH TIME_FORMAT "%T" + ::msgcat::mcset fr_CH TIME_FORMAT_12 "%T" + ::msgcat::mcset fr_CH DATE_TIME_FORMAT "%a %d %b %Y %T %z" +} diff --git a/env/tcl/tcl8.6/msgs/ga.msg b/env/tcl/tcl8.6/msgs/ga.msg new file mode 100644 index 0000000..6edf13a --- /dev/null +++ b/env/tcl/tcl8.6/msgs/ga.msg @@ -0,0 +1,47 @@ +# created by tools/loadICU.tcl -- do not edit +namespace eval ::tcl::clock { + ::msgcat::mcset ga DAYS_OF_WEEK_ABBREV [list \ + "Domh"\ + "Luan"\ + "M\u00e1irt"\ + "C\u00e9ad"\ + "D\u00e9ar"\ + "Aoine"\ + "Sath"] + ::msgcat::mcset ga DAYS_OF_WEEK_FULL [list \ + "D\u00e9 Domhnaigh"\ + "D\u00e9 Luain"\ + "D\u00e9 M\u00e1irt"\ + "D\u00e9 C\u00e9adaoin"\ + "D\u00e9ardaoin"\ + "D\u00e9 hAoine"\ + "D\u00e9 Sathairn"] + ::msgcat::mcset ga MONTHS_ABBREV [list \ + "Ean"\ + "Feabh"\ + "M\u00e1rta"\ + "Aib"\ + "Beal"\ + "Meith"\ + "I\u00fail"\ + "L\u00fan"\ + "MF\u00f3mh"\ + "DF\u00f3mh"\ + "Samh"\ + "Noll"\ + ""] + ::msgcat::mcset ga MONTHS_FULL [list \ + "Ean\u00e1ir"\ + "Feabhra"\ + "M\u00e1rta"\ + "Aibre\u00e1n"\ + "M\u00ed na Bealtaine"\ + "Meith"\ + "I\u00fail"\ + "L\u00fanasa"\ + "Me\u00e1n F\u00f3mhair"\ + "Deireadh F\u00f3mhair"\ + "M\u00ed na Samhna"\ + "M\u00ed na Nollag"\ + ""] +} diff --git a/env/tcl/tcl8.6/msgs/ga_ie.msg b/env/tcl/tcl8.6/msgs/ga_ie.msg new file mode 100644 index 0000000..b6acbbc --- /dev/null +++ b/env/tcl/tcl8.6/msgs/ga_ie.msg @@ -0,0 +1,7 @@ +# created by tools/loadICU.tcl -- do not edit +namespace eval ::tcl::clock { + ::msgcat::mcset ga_IE DATE_FORMAT "%d.%m.%y" + ::msgcat::mcset ga_IE TIME_FORMAT "%T" + ::msgcat::mcset ga_IE TIME_FORMAT_12 "%T" + ::msgcat::mcset ga_IE DATE_TIME_FORMAT "%a %d %b %Y %T %z" +} diff --git a/env/tcl/tcl8.6/msgs/gl.msg b/env/tcl/tcl8.6/msgs/gl.msg new file mode 100644 index 0000000..4b869e8 --- /dev/null +++ b/env/tcl/tcl8.6/msgs/gl.msg @@ -0,0 +1,47 @@ +# created by tools/loadICU.tcl -- do not edit +namespace eval ::tcl::clock { + ::msgcat::mcset gl DAYS_OF_WEEK_ABBREV [list \ + "Dom"\ + "Lun"\ + "Mar"\ + "M\u00e9r"\ + "Xov"\ + "Ven"\ + "S\u00e1b"] + ::msgcat::mcset gl DAYS_OF_WEEK_FULL [list \ + "Domingo"\ + "Luns"\ + "Martes"\ + "M\u00e9rcores"\ + "Xoves"\ + "Venres"\ + "S\u00e1bado"] + ::msgcat::mcset gl MONTHS_ABBREV [list \ + "Xan"\ + "Feb"\ + "Mar"\ + "Abr"\ + "Mai"\ + "Xu\u00f1"\ + "Xul"\ + "Ago"\ + "Set"\ + "Out"\ + "Nov"\ + "Dec"\ + ""] + ::msgcat::mcset gl MONTHS_FULL [list \ + "Xaneiro"\ + "Febreiro"\ + "Marzo"\ + "Abril"\ + "Maio"\ + "Xu\u00f1o"\ + "Xullo"\ + "Agosto"\ + "Setembro"\ + "Outubro"\ + "Novembro"\ + "Decembro"\ + ""] +} diff --git a/env/tcl/tcl8.6/msgs/gl_es.msg b/env/tcl/tcl8.6/msgs/gl_es.msg new file mode 100644 index 0000000..d4ed270 --- /dev/null +++ b/env/tcl/tcl8.6/msgs/gl_es.msg @@ -0,0 +1,6 @@ +# created by tools/loadICU.tcl -- do not edit +namespace eval ::tcl::clock { + ::msgcat::mcset gl_ES DATE_FORMAT "%d %B %Y" + ::msgcat::mcset gl_ES TIME_FORMAT_12 "%l:%M:%S %P" + ::msgcat::mcset gl_ES DATE_TIME_FORMAT "%d %B %Y %l:%M:%S %P %z" +} diff --git a/env/tcl/tcl8.6/msgs/gv.msg b/env/tcl/tcl8.6/msgs/gv.msg new file mode 100644 index 0000000..7d332ad --- /dev/null +++ b/env/tcl/tcl8.6/msgs/gv.msg @@ -0,0 +1,47 @@ +# created by tools/loadICU.tcl -- do not edit +namespace eval ::tcl::clock { + ::msgcat::mcset gv DAYS_OF_WEEK_ABBREV [list \ + "Jed"\ + "Jel"\ + "Jem"\ + "Jerc"\ + "Jerd"\ + "Jeh"\ + "Jes"] + ::msgcat::mcset gv DAYS_OF_WEEK_FULL [list \ + "Jedoonee"\ + "Jelhein"\ + "Jemayrt"\ + "Jercean"\ + "Jerdein"\ + "Jeheiney"\ + "Jesarn"] + ::msgcat::mcset gv MONTHS_ABBREV [list \ + "J-guer"\ + "T-arree"\ + "Mayrnt"\ + "Avrril"\ + "Boaldyn"\ + "M-souree"\ + "J-souree"\ + "Luanistyn"\ + "M-fouyir"\ + "J-fouyir"\ + "M.Houney"\ + "M.Nollick"\ + ""] + ::msgcat::mcset gv MONTHS_FULL [list \ + "Jerrey-geuree"\ + "Toshiaght-arree"\ + "Mayrnt"\ + "Averil"\ + "Boaldyn"\ + "Mean-souree"\ + "Jerrey-souree"\ + "Luanistyn"\ + "Mean-fouyir"\ + "Jerrey-fouyir"\ + "Mee Houney"\ + "Mee ny Nollick"\ + ""] +} diff --git a/env/tcl/tcl8.6/msgs/gv_gb.msg b/env/tcl/tcl8.6/msgs/gv_gb.msg new file mode 100644 index 0000000..5e96e6f --- /dev/null +++ b/env/tcl/tcl8.6/msgs/gv_gb.msg @@ -0,0 +1,6 @@ +# created by tools/loadICU.tcl -- do not edit +namespace eval ::tcl::clock { + ::msgcat::mcset gv_GB DATE_FORMAT "%d %B %Y" + ::msgcat::mcset gv_GB TIME_FORMAT_12 "%l:%M:%S %P" + ::msgcat::mcset gv_GB DATE_TIME_FORMAT "%d %B %Y %l:%M:%S %P %z" +} diff --git a/env/tcl/tcl8.6/msgs/he.msg b/env/tcl/tcl8.6/msgs/he.msg new file mode 100644 index 0000000..4fd921d --- /dev/null +++ b/env/tcl/tcl8.6/msgs/he.msg @@ -0,0 +1,52 @@ +# created by tools/loadICU.tcl -- do not edit +namespace eval ::tcl::clock { + ::msgcat::mcset he DAYS_OF_WEEK_ABBREV [list \ + "\u05d0"\ + "\u05d1"\ + "\u05d2"\ + "\u05d3"\ + "\u05d4"\ + "\u05d5"\ + "\u05e9"] + ::msgcat::mcset he DAYS_OF_WEEK_FULL [list \ + "\u05d9\u05d5\u05dd \u05e8\u05d0\u05e9\u05d5\u05df"\ + "\u05d9\u05d5\u05dd \u05e9\u05e0\u05d9"\ + "\u05d9\u05d5\u05dd \u05e9\u05dc\u05d9\u05e9\u05d9"\ + "\u05d9\u05d5\u05dd \u05e8\u05d1\u05d9\u05e2\u05d9"\ + "\u05d9\u05d5\u05dd \u05d7\u05de\u05d9\u05e9\u05d9"\ + "\u05d9\u05d5\u05dd \u05e9\u05d9\u05e9\u05d9"\ + "\u05e9\u05d1\u05ea"] + ::msgcat::mcset he MONTHS_ABBREV [list \ + "\u05d9\u05e0\u05d5"\ + "\u05e4\u05d1\u05e8"\ + "\u05de\u05e8\u05e5"\ + "\u05d0\u05e4\u05e8"\ + "\u05de\u05d0\u05d9"\ + "\u05d9\u05d5\u05e0"\ + "\u05d9\u05d5\u05dc"\ + "\u05d0\u05d5\u05d2"\ + "\u05e1\u05e4\u05d8"\ + "\u05d0\u05d5\u05e7"\ + "\u05e0\u05d5\u05d1"\ + "\u05d3\u05e6\u05de"\ + ""] + ::msgcat::mcset he MONTHS_FULL [list \ + "\u05d9\u05e0\u05d5\u05d0\u05e8"\ + "\u05e4\u05d1\u05e8\u05d5\u05d0\u05e8"\ + "\u05de\u05e8\u05e5"\ + "\u05d0\u05e4\u05e8\u05d9\u05dc"\ + "\u05de\u05d0\u05d9"\ + "\u05d9\u05d5\u05e0\u05d9"\ + "\u05d9\u05d5\u05dc\u05d9"\ + "\u05d0\u05d5\u05d2\u05d5\u05e1\u05d8"\ + "\u05e1\u05e4\u05d8\u05de\u05d1\u05e8"\ + "\u05d0\u05d5\u05e7\u05d8\u05d5\u05d1\u05e8"\ + "\u05e0\u05d5\u05d1\u05de\u05d1\u05e8"\ + "\u05d3\u05e6\u05de\u05d1\u05e8"\ + ""] + ::msgcat::mcset he BCE "\u05dc\u05e1\u05d4\u0022\u05e0" + ::msgcat::mcset he CE "\u05dc\u05e4\u05e1\u05d4\u0022\u05e0" + ::msgcat::mcset he DATE_FORMAT "%d/%m/%Y" + ::msgcat::mcset he TIME_FORMAT "%H:%M:%S" + ::msgcat::mcset he DATE_TIME_FORMAT "%d/%m/%Y %H:%M:%S %z" +} diff --git a/env/tcl/tcl8.6/msgs/hi.msg b/env/tcl/tcl8.6/msgs/hi.msg new file mode 100644 index 0000000..50c9fb8 --- /dev/null +++ b/env/tcl/tcl8.6/msgs/hi.msg @@ -0,0 +1,39 @@ +# created by tools/loadICU.tcl -- do not edit +namespace eval ::tcl::clock { + ::msgcat::mcset hi DAYS_OF_WEEK_FULL [list \ + "\u0930\u0935\u093f\u0935\u093e\u0930"\ + "\u0938\u094b\u092e\u0935\u093e\u0930"\ + "\u092e\u0902\u0917\u0932\u0935\u093e\u0930"\ + "\u092c\u0941\u0927\u0935\u093e\u0930"\ + "\u0917\u0941\u0930\u0941\u0935\u093e\u0930"\ + "\u0936\u0941\u0915\u094d\u0930\u0935\u093e\u0930"\ + "\u0936\u0928\u093f\u0935\u093e\u0930"] + ::msgcat::mcset hi MONTHS_ABBREV [list \ + "\u091c\u0928\u0935\u0930\u0940"\ + "\u092b\u093c\u0930\u0935\u0930\u0940"\ + "\u092e\u093e\u0930\u094d\u091a"\ + "\u0905\u092a\u094d\u0930\u0947\u0932"\ + "\u092e\u0908"\ + "\u091c\u0942\u0928"\ + "\u091c\u0941\u0932\u093e\u0908"\ + "\u0905\u0917\u0938\u094d\u0924"\ + "\u0938\u093f\u0924\u092e\u094d\u092c\u0930"\ + "\u0905\u0915\u094d\u091f\u0942\u092c\u0930"\ + "\u0928\u0935\u092e\u094d\u092c\u0930"\ + "\u0926\u093f\u0938\u092e\u094d\u092c\u0930"] + ::msgcat::mcset hi MONTHS_FULL [list \ + "\u091c\u0928\u0935\u0930\u0940"\ + "\u092b\u093c\u0930\u0935\u0930\u0940"\ + "\u092e\u093e\u0930\u094d\u091a"\ + "\u0905\u092a\u094d\u0930\u0947\u0932"\ + "\u092e\u0908"\ + "\u091c\u0942\u0928"\ + "\u091c\u0941\u0932\u093e\u0908"\ + "\u0905\u0917\u0938\u094d\u0924"\ + "\u0938\u093f\u0924\u092e\u094d\u092c\u0930"\ + "\u0905\u0915\u094d\u091f\u0942\u092c\u0930"\ + "\u0928\u0935\u092e\u094d\u092c\u0930"\ + "\u0926\u093f\u0938\u092e\u094d\u092c\u0930"] + ::msgcat::mcset hi AM "\u0908\u0938\u093e\u092a\u0942\u0930\u094d\u0935" + ::msgcat::mcset hi PM "." +} diff --git a/env/tcl/tcl8.6/msgs/hi_in.msg b/env/tcl/tcl8.6/msgs/hi_in.msg new file mode 100644 index 0000000..239793f --- /dev/null +++ b/env/tcl/tcl8.6/msgs/hi_in.msg @@ -0,0 +1,6 @@ +# created by tools/loadICU.tcl -- do not edit +namespace eval ::tcl::clock { + ::msgcat::mcset hi_IN DATE_FORMAT "%d %M %Y" + ::msgcat::mcset hi_IN TIME_FORMAT_12 "%I:%M:%S %P" + ::msgcat::mcset hi_IN DATE_TIME_FORMAT "%d %M %Y %I:%M:%S %P %z" +} diff --git a/env/tcl/tcl8.6/msgs/hr.msg b/env/tcl/tcl8.6/msgs/hr.msg new file mode 100644 index 0000000..cec145b --- /dev/null +++ b/env/tcl/tcl8.6/msgs/hr.msg @@ -0,0 +1,50 @@ +# created by tools/loadICU.tcl -- do not edit +namespace eval ::tcl::clock { + ::msgcat::mcset hr DAYS_OF_WEEK_ABBREV [list \ + "ned"\ + "pon"\ + "uto"\ + "sri"\ + "\u010det"\ + "pet"\ + "sub"] + ::msgcat::mcset hr DAYS_OF_WEEK_FULL [list \ + "nedjelja"\ + "ponedjeljak"\ + "utorak"\ + "srijeda"\ + "\u010detvrtak"\ + "petak"\ + "subota"] + ::msgcat::mcset hr MONTHS_ABBREV [list \ + "sij"\ + "vel"\ + "o\u017eu"\ + "tra"\ + "svi"\ + "lip"\ + "srp"\ + "kol"\ + "ruj"\ + "lis"\ + "stu"\ + "pro"\ + ""] + ::msgcat::mcset hr MONTHS_FULL [list \ + "sije\u010danj"\ + "velja\u010da"\ + "o\u017eujak"\ + "travanj"\ + "svibanj"\ + "lipanj"\ + "srpanj"\ + "kolovoz"\ + "rujan"\ + "listopad"\ + "studeni"\ + "prosinac"\ + ""] + ::msgcat::mcset hr DATE_FORMAT "%Y.%m.%d" + ::msgcat::mcset hr TIME_FORMAT "%H:%M:%S" + ::msgcat::mcset hr DATE_TIME_FORMAT "%Y.%m.%d %H:%M:%S %z" +} diff --git a/env/tcl/tcl8.6/msgs/hu.msg b/env/tcl/tcl8.6/msgs/hu.msg new file mode 100644 index 0000000..e5e68d9 --- /dev/null +++ b/env/tcl/tcl8.6/msgs/hu.msg @@ -0,0 +1,54 @@ +# created by tools/loadICU.tcl -- do not edit +namespace eval ::tcl::clock { + ::msgcat::mcset hu DAYS_OF_WEEK_ABBREV [list \ + "V"\ + "H"\ + "K"\ + "Sze"\ + "Cs"\ + "P"\ + "Szo"] + ::msgcat::mcset hu DAYS_OF_WEEK_FULL [list \ + "vas\u00e1rnap"\ + "h\u00e9tf\u0151"\ + "kedd"\ + "szerda"\ + "cs\u00fct\u00f6rt\u00f6k"\ + "p\u00e9ntek"\ + "szombat"] + ::msgcat::mcset hu MONTHS_ABBREV [list \ + "jan."\ + "febr."\ + "m\u00e1rc."\ + "\u00e1pr."\ + "m\u00e1j."\ + "j\u00fan."\ + "j\u00fal."\ + "aug."\ + "szept."\ + "okt."\ + "nov."\ + "dec."\ + ""] + ::msgcat::mcset hu MONTHS_FULL [list \ + "janu\u00e1r"\ + "febru\u00e1r"\ + "m\u00e1rcius"\ + "\u00e1prilis"\ + "m\u00e1jus"\ + "j\u00fanius"\ + "j\u00falius"\ + "augusztus"\ + "szeptember"\ + "okt\u00f3ber"\ + "november"\ + "december"\ + ""] + ::msgcat::mcset hu BCE "i.e." + ::msgcat::mcset hu CE "i.u." + ::msgcat::mcset hu AM "DE" + ::msgcat::mcset hu PM "DU" + ::msgcat::mcset hu DATE_FORMAT "%Y.%m.%d." + ::msgcat::mcset hu TIME_FORMAT "%k:%M:%S" + ::msgcat::mcset hu DATE_TIME_FORMAT "%Y.%m.%d. %k:%M:%S %z" +} diff --git a/env/tcl/tcl8.6/msgs/id.msg b/env/tcl/tcl8.6/msgs/id.msg new file mode 100644 index 0000000..17c6bb5 --- /dev/null +++ b/env/tcl/tcl8.6/msgs/id.msg @@ -0,0 +1,47 @@ +# created by tools/loadICU.tcl -- do not edit +namespace eval ::tcl::clock { + ::msgcat::mcset id DAYS_OF_WEEK_ABBREV [list \ + "Min"\ + "Sen"\ + "Sel"\ + "Rab"\ + "Kam"\ + "Jum"\ + "Sab"] + ::msgcat::mcset id DAYS_OF_WEEK_FULL [list \ + "Minggu"\ + "Senin"\ + "Selasa"\ + "Rabu"\ + "Kamis"\ + "Jumat"\ + "Sabtu"] + ::msgcat::mcset id MONTHS_ABBREV [list \ + "Jan"\ + "Peb"\ + "Mar"\ + "Apr"\ + "Mei"\ + "Jun"\ + "Jul"\ + "Agu"\ + "Sep"\ + "Okt"\ + "Nov"\ + "Des"\ + ""] + ::msgcat::mcset id MONTHS_FULL [list \ + "Januari"\ + "Pebruari"\ + "Maret"\ + "April"\ + "Mei"\ + "Juni"\ + "Juli"\ + "Agustus"\ + "September"\ + "Oktober"\ + "November"\ + "Desember"\ + ""] +} diff --git a/env/tcl/tcl8.6/msgs/id_id.msg b/env/tcl/tcl8.6/msgs/id_id.msg new file mode 100644 index 0000000..bb672c1 --- /dev/null +++ b/env/tcl/tcl8.6/msgs/id_id.msg @@ -0,0 +1,6 @@ +# created by tools/loadICU.tcl -- do not edit +namespace eval ::tcl::clock { + ::msgcat::mcset id_ID DATE_FORMAT "%d %B %Y" + ::msgcat::mcset id_ID TIME_FORMAT_12 "%l:%M:%S %P" + ::msgcat::mcset id_ID DATE_TIME_FORMAT "%d %B %Y %l:%M:%S %P %z" +} diff --git a/env/tcl/tcl8.6/msgs/is.msg b/env/tcl/tcl8.6/msgs/is.msg new file mode 100644 index 0000000..adc2d2a --- /dev/null +++ b/env/tcl/tcl8.6/msgs/is.msg @@ -0,0 +1,50 @@ +# created by tools/loadICU.tcl -- do not edit +namespace eval ::tcl::clock { + ::msgcat::mcset is DAYS_OF_WEEK_ABBREV [list \ + "sun."\ + "m\u00e1n."\ + "\u00feri."\ + "mi\u00f0."\ + "fim."\ + "f\u00f6s."\ + "lau."] + ::msgcat::mcset is DAYS_OF_WEEK_FULL [list \ + "sunnudagur"\ + "m\u00e1nudagur"\ + "\u00feri\u00f0judagur"\ + "mi\u00f0vikudagur"\ + "fimmtudagur"\ + "f\u00f6studagur"\ + "laugardagur"] + ::msgcat::mcset is MONTHS_ABBREV [list \ + "jan."\ + "feb."\ + "mar."\ + "apr."\ + "ma\u00ed"\ + "j\u00fan."\ + "j\u00fal."\ + "\u00e1g\u00fa."\ + "sep."\ + "okt."\ + "n\u00f3v."\ + "des."\ + ""] + ::msgcat::mcset is MONTHS_FULL [list \ + "jan\u00faar"\ + "febr\u00faar"\ + "mars"\ + "apr\u00edl"\ + "ma\u00ed"\ + "j\u00fan\u00ed"\ + "j\u00fal\u00ed"\ + "\u00e1g\u00fast"\ + "september"\ + "okt\u00f3ber"\ + "n\u00f3vember"\ + "desember"\ + ""] + ::msgcat::mcset is DATE_FORMAT "%e.%m.%Y" + ::msgcat::mcset is TIME_FORMAT "%H:%M:%S" + ::msgcat::mcset is DATE_TIME_FORMAT "%e.%m.%Y %H:%M:%S %z" +} diff --git a/env/tcl/tcl8.6/msgs/it.msg b/env/tcl/tcl8.6/msgs/it.msg new file mode 100644 index 0000000..b641cde --- /dev/null +++ b/env/tcl/tcl8.6/msgs/it.msg @@ -0,0 +1,54 @@ +# created by tools/loadICU.tcl -- do not edit +namespace eval ::tcl::clock { + ::msgcat::mcset it DAYS_OF_WEEK_ABBREV [list \ + "dom"\ + "lun"\ + "mar"\ + "mer"\ + "gio"\ + "ven"\ + "sab"] + ::msgcat::mcset it DAYS_OF_WEEK_FULL [list \ + "domenica"\ + "luned\u00ec"\ + "marted\u00ec"\ + "mercoled\u00ec"\ + "gioved\u00ec"\ + "venerd\u00ec"\ + "sabato"] + ::msgcat::mcset it MONTHS_ABBREV [list \ + "gen"\ + "feb"\ + "mar"\ + "apr"\ + "mag"\ + "giu"\ + "lug"\ + "ago"\ + "set"\ + "ott"\ + "nov"\ + "dic"\ + ""] + ::msgcat::mcset it MONTHS_FULL [list \ + "gennaio"\ + "febbraio"\ + "marzo"\ + "aprile"\ + "maggio"\ + "giugno"\ + "luglio"\ + "agosto"\ + "settembre"\ + "ottobre"\ + "novembre"\ + "dicembre"\ + ""] + ::msgcat::mcset it BCE "aC" + ::msgcat::mcset it CE "dC" + ::msgcat::mcset it AM "m." + ::msgcat::mcset it PM "p." + ::msgcat::mcset it DATE_FORMAT "%d %B %Y" + ::msgcat::mcset it TIME_FORMAT "%H:%M:%S" + ::msgcat::mcset it DATE_TIME_FORMAT "%d %B %Y %H:%M:%S %z" +} diff --git a/env/tcl/tcl8.6/msgs/it_ch.msg b/env/tcl/tcl8.6/msgs/it_ch.msg new file mode 100644 index 0000000..b36ed36 --- /dev/null +++ b/env/tcl/tcl8.6/msgs/it_ch.msg @@ -0,0 +1,6 @@ +# created by tools/loadICU.tcl -- do not edit +namespace eval ::tcl::clock { + ::msgcat::mcset it_CH DATE_FORMAT "%e. %B %Y" + ::msgcat::mcset it_CH TIME_FORMAT "%H:%M:%S" + ::msgcat::mcset it_CH DATE_TIME_FORMAT "%e. %B %Y %H:%M:%S %z" +} diff --git a/env/tcl/tcl8.6/msgs/ja.msg b/env/tcl/tcl8.6/msgs/ja.msg new file mode 100644 index 0000000..2767665 --- /dev/null +++ b/env/tcl/tcl8.6/msgs/ja.msg @@ -0,0 +1,44 @@ +# created by tools/loadICU.tcl -- do not edit +namespace eval ::tcl::clock { + ::msgcat::mcset ja DAYS_OF_WEEK_ABBREV [list \ + "\u65e5"\ + "\u6708"\ + "\u706b"\ + "\u6c34"\ + "\u6728"\ + "\u91d1"\ + "\u571f"] + ::msgcat::mcset ja DAYS_OF_WEEK_FULL [list \ + "\u65e5\u66dc\u65e5"\ + "\u6708\u66dc\u65e5"\ + "\u706b\u66dc\u65e5"\ + "\u6c34\u66dc\u65e5"\ + "\u6728\u66dc\u65e5"\ + "\u91d1\u66dc\u65e5"\ + "\u571f\u66dc\u65e5"] + ::msgcat::mcset ja MONTHS_FULL [list \ + "1\u6708"\ + "2\u6708"\ + "3\u6708"\ + "4\u6708"\ + "5\u6708"\ + "6\u6708"\ + "7\u6708"\ + "8\u6708"\ + "9\u6708"\ + "10\u6708"\ + "11\u6708"\ + "12\u6708"] + ::msgcat::mcset ja BCE "\u7d00\u5143\u524d" + ::msgcat::mcset ja CE "\u897f\u66a6" + ::msgcat::mcset ja AM "\u5348\u524d" + ::msgcat::mcset ja PM "\u5348\u5f8c" + ::msgcat::mcset ja DATE_FORMAT "%Y/%m/%d" + ::msgcat::mcset ja TIME_FORMAT "%k:%M:%S" + ::msgcat::mcset ja TIME_FORMAT_12 "%P %I:%M:%S" + ::msgcat::mcset ja DATE_TIME_FORMAT "%Y/%m/%d %k:%M:%S %z" + ::msgcat::mcset ja LOCALE_DATE_FORMAT "%EY\u5e74%m\u6708%d\u65e5" + ::msgcat::mcset ja LOCALE_TIME_FORMAT "%H\u6642%M\u5206%S\u79d2" + ::msgcat::mcset ja LOCALE_DATE_TIME_FORMAT "%EY\u5e74%m\u6708%d\u65e5 (%a) %H\u6642%M\u5206%S\u79d2 %z" + ::msgcat::mcset ja LOCALE_ERAS "\u007b-9223372036854775808 \u897f\u66a6 0\u007d \u007b-3061011600 \u660e\u6cbb 1867\u007d \u007b-1812186000 \u5927\u6b63 1911\u007d \u007b-1357635600 \u662d\u548c 1925\u007d \u007b600220800 \u5e73\u6210 1988\u007d" +} diff --git a/env/tcl/tcl8.6/msgs/kl.msg b/env/tcl/tcl8.6/msgs/kl.msg new file mode 100644 index 0000000..d877bfe --- /dev/null +++ b/env/tcl/tcl8.6/msgs/kl.msg @@ -0,0 +1,47 @@ +# created by tools/loadICU.tcl -- do not edit +namespace eval ::tcl::clock { + ::msgcat::mcset kl DAYS_OF_WEEK_ABBREV [list \ + "sab"\ + "ata"\ + "mar"\ + "pin"\ + "sis"\ + "tal"\ + "arf"] + ::msgcat::mcset kl DAYS_OF_WEEK_FULL [list \ + "sabaat"\ + "ataasinngorneq"\ + "marlunngorneq"\ + "pingasunngorneq"\ + "sisamanngorneq"\ + "tallimanngorneq"\ + "arfininngorneq"] + ::msgcat::mcset kl MONTHS_ABBREV [list \ + "jan"\ + "feb"\ + "mar"\ + "apr"\ + "maj"\ + "jun"\ + "jul"\ + "aug"\ + "sep"\ + "okt"\ + "nov"\ + "dec"\ + ""] + ::msgcat::mcset kl MONTHS_FULL [list \ + "januari"\ + "februari"\ + "martsi"\ + "aprili"\ + "maji"\ + "juni"\ + "juli"\ + "augustusi"\ + "septemberi"\ + "oktoberi"\ + "novemberi"\ + "decemberi"\ + ""] +} diff --git a/env/tcl/tcl8.6/msgs/kl_gl.msg b/env/tcl/tcl8.6/msgs/kl_gl.msg new file mode 100644 index 0000000..403aa10 --- /dev/null +++ b/env/tcl/tcl8.6/msgs/kl_gl.msg @@ -0,0 +1,7 @@ +# created by tools/loadICU.tcl -- do not edit +namespace eval ::tcl::clock { + ::msgcat::mcset kl_GL DATE_FORMAT "%d %b %Y" + ::msgcat::mcset kl_GL TIME_FORMAT "%T" + ::msgcat::mcset kl_GL TIME_FORMAT_12 "%T" + ::msgcat::mcset kl_GL DATE_TIME_FORMAT "%a %d %b %Y %T %z" +} diff --git a/env/tcl/tcl8.6/msgs/ko.msg b/env/tcl/tcl8.6/msgs/ko.msg new file mode 100644 index 0000000..0cd17a1 --- /dev/null +++ b/env/tcl/tcl8.6/msgs/ko.msg @@ -0,0 +1,55 @@ +# created by tools/loadICU.tcl -- do not edit +namespace eval ::tcl::clock { + ::msgcat::mcset ko DAYS_OF_WEEK_ABBREV [list \ + "\uc77c"\ + "\uc6d4"\ + "\ud654"\ + "\uc218"\ + "\ubaa9"\ + "\uae08"\ + "\ud1a0"] + ::msgcat::mcset ko DAYS_OF_WEEK_FULL [list \ + "\uc77c\uc694\uc77c"\ + "\uc6d4\uc694\uc77c"\ + "\ud654\uc694\uc77c"\ + "\uc218\uc694\uc77c"\ + "\ubaa9\uc694\uc77c"\ + "\uae08\uc694\uc77c"\ + "\ud1a0\uc694\uc77c"] + ::msgcat::mcset ko MONTHS_ABBREV [list \ + "1\uc6d4"\ + "2\uc6d4"\ + "3\uc6d4"\ + "4\uc6d4"\ + "5\uc6d4"\ + "6\uc6d4"\ + "7\uc6d4"\ + "8\uc6d4"\ + "9\uc6d4"\ + "10\uc6d4"\ + "11\uc6d4"\ + "12\uc6d4"\ + ""] + ::msgcat::mcset ko MONTHS_FULL [list \ + "1\uc6d4"\ + "2\uc6d4"\ + "3\uc6d4"\ + "4\uc6d4"\ + "5\uc6d4"\ + "6\uc6d4"\ + "7\uc6d4"\ + "8\uc6d4"\ + "9\uc6d4"\ + "10\uc6d4"\ + "11\uc6d4"\ + "12\uc6d4"\ + ""] + ::msgcat::mcset ko AM "\uc624\uc804" + ::msgcat::mcset ko PM "\uc624\ud6c4" + ::msgcat::mcset ko DATE_FORMAT "%Y-%m-%d" + ::msgcat::mcset ko TIME_FORMAT_12 "%P %l:%M:%S" + ::msgcat::mcset ko DATE_TIME_FORMAT "%Y-%m-%d %P %l:%M:%S %z" + ::msgcat::mcset ko LOCALE_DATE_FORMAT "%Y\ub144%B%Od\uc77c" + ::msgcat::mcset ko LOCALE_TIME_FORMAT "%H\uc2dc%M\ubd84%S\ucd08" + ::msgcat::mcset ko LOCALE_DATE_TIME_FORMAT "%A %Y\ub144%B%Od\uc77c%H\uc2dc%M\ubd84%S\ucd08 %z" +} diff --git a/env/tcl/tcl8.6/msgs/ko_kr.msg b/env/tcl/tcl8.6/msgs/ko_kr.msg new file mode 100644 index 0000000..ea5bbd7 --- /dev/null +++ b/env/tcl/tcl8.6/msgs/ko_kr.msg @@ -0,0 +1,8 @@ +# created by tools/loadICU.tcl -- do not edit +namespace eval ::tcl::clock { + ::msgcat::mcset ko_KR BCE "\uae30\uc6d0\uc804" + ::msgcat::mcset ko_KR CE "\uc11c\uae30" + ::msgcat::mcset ko_KR DATE_FORMAT "%Y.%m.%d" + ::msgcat::mcset ko_KR TIME_FORMAT_12 "%P %l:%M:%S" + ::msgcat::mcset ko_KR DATE_TIME_FORMAT "%Y.%m.%d %P %l:%M:%S %z" +} diff --git a/env/tcl/tcl8.6/msgs/kok.msg b/env/tcl/tcl8.6/msgs/kok.msg new file mode 100644 index 0000000..0869f20 --- /dev/null +++ b/env/tcl/tcl8.6/msgs/kok.msg @@ -0,0 +1,39 @@ +# created by tools/loadICU.tcl -- do not edit +namespace eval ::tcl::clock { + ::msgcat::mcset kok DAYS_OF_WEEK_FULL [list \ + "\u0906\u0926\u093f\u0924\u094d\u092f\u0935\u093e\u0930"\ + "\u0938\u094b\u092e\u0935\u093e\u0930"\ + "\u092e\u0902\u0917\u0933\u093e\u0930"\ + "\u092c\u0941\u0927\u0935\u093e\u0930"\ + "\u0917\u0941\u0930\u0941\u0935\u093e\u0930"\ + "\u0936\u0941\u0915\u094d\u0930\u0935\u093e\u0930"\ + "\u0936\u0928\u093f\u0935\u093e\u0930"] + ::msgcat::mcset kok MONTHS_ABBREV [list \ + "\u091c\u093e\u0928\u0947\u0935\u093e\u0930\u0940"\ + "\u092b\u0947\u092c\u0943\u0935\u093e\u0930\u0940"\ + "\u092e\u093e\u0930\u094d\u091a"\ + "\u090f\u092a\u094d\u0930\u093f\u0932"\ + "\u092e\u0947"\ + "\u091c\u0942\u0928"\ + "\u091c\u0941\u0932\u0948"\ + "\u0913\u0917\u0938\u094d\u091f"\ + "\u0938\u0947\u092a\u094d\u091f\u0947\u0902\u092c\u0930"\ + "\u0913\u0915\u094d\u091f\u094b\u092c\u0930"\ + "\u0928\u094b\u0935\u094d\u0939\u0947\u0902\u092c\u0930"\ + "\u0921\u093f\u0938\u0947\u0902\u092c\u0930"] + ::msgcat::mcset kok MONTHS_FULL [list \ + "\u091c\u093e\u0928\u0947\u0935\u093e\u0930\u0940"\ + "\u092b\u0947\u092c\u094d\u0930\u0941\u0935\u093e\u0930\u0940"\ + "\u092e\u093e\u0930\u094d\u091a"\ + "\u090f\u092a\u094d\u0930\u093f\u0932"\ + "\u092e\u0947"\ + "\u091c\u0942\u0928"\ + "\u091c\u0941\u0932\u0948"\ + "\u0913\u0917\u0938\u094d\u091f"\ + "\u0938\u0947\u092a\u094d\u091f\u0947\u0902\u092c\u0930"\ + "\u0913\u0915\u094d\u091f\u094b\u092c\u0930"\ + "\u0928\u094b\u0935\u094d\u0939\u0947\u0902\u092c\u0930"\ + "\u0921\u093f\u0938\u0947\u0902\u092c\u0930"] + ::msgcat::mcset kok AM "\u0915\u094d\u0930\u093f\u0938\u094d\u0924\u092a\u0942\u0930\u094d\u0935" + ::msgcat::mcset kok PM "\u0915\u094d\u0930\u093f\u0938\u094d\u0924\u0936\u0916\u093e" +} diff --git a/env/tcl/tcl8.6/msgs/kok_in.msg b/env/tcl/tcl8.6/msgs/kok_in.msg new file mode 100644 index 0000000..abcb1ff --- /dev/null +++ b/env/tcl/tcl8.6/msgs/kok_in.msg @@ -0,0 +1,6 @@ +# created by tools/loadICU.tcl -- do not edit +namespace eval ::tcl::clock { + ::msgcat::mcset kok_IN DATE_FORMAT "%d %M %Y" + ::msgcat::mcset kok_IN TIME_FORMAT_12 "%I:%M:%S %P" + ::msgcat::mcset kok_IN DATE_TIME_FORMAT "%d %M %Y %I:%M:%S %P %z" +} diff --git a/env/tcl/tcl8.6/msgs/kw.msg b/env/tcl/tcl8.6/msgs/kw.msg new file mode 100644 index 0000000..aaf79b3 --- /dev/null +++ b/env/tcl/tcl8.6/msgs/kw.msg @@ -0,0 +1,47 @@ +# created by tools/loadICU.tcl -- do not edit +namespace eval ::tcl::clock { + ::msgcat::mcset kw DAYS_OF_WEEK_ABBREV [list \ + "Sul"\ + "Lun"\ + "Mth"\ + "Mhr"\ + "Yow"\ + "Gwe"\ + "Sad"] + ::msgcat::mcset kw DAYS_OF_WEEK_FULL [list \ + "De Sul"\ + "De Lun"\ + "De Merth"\ + "De Merher"\ + "De Yow"\ + "De Gwener"\ + "De Sadorn"] + ::msgcat::mcset kw MONTHS_ABBREV [list \ + "Gen"\ + "Whe"\ + "Mer"\ + "Ebr"\ + "Me"\ + "Evn"\ + "Gor"\ + "Est"\ + "Gwn"\ + "Hed"\ + "Du"\ + "Kev"\ + ""] + ::msgcat::mcset kw MONTHS_FULL [list \ + "Mys Genver"\ + "Mys Whevrel"\ + "Mys Merth"\ + "Mys Ebrel"\ + "Mys Me"\ + "Mys Evan"\ + "Mys Gortheren"\ + "Mye Est"\ + "Mys Gwyngala"\ + "Mys Hedra"\ + "Mys Du"\ + "Mys Kevardhu"\ + ""] +} diff --git a/env/tcl/tcl8.6/msgs/kw_gb.msg b/env/tcl/tcl8.6/msgs/kw_gb.msg new file mode 100644 index 0000000..2967680 --- /dev/null +++ b/env/tcl/tcl8.6/msgs/kw_gb.msg @@ -0,0 +1,6 @@ +# created by tools/loadICU.tcl -- do not edit +namespace eval ::tcl::clock { + ::msgcat::mcset kw_GB DATE_FORMAT "%d %B %Y" + ::msgcat::mcset kw_GB TIME_FORMAT_12 "%l:%M:%S %P" + ::msgcat::mcset kw_GB DATE_TIME_FORMAT "%d %B %Y %l:%M:%S %P %z" +} diff --git a/env/tcl/tcl8.6/msgs/lt.msg b/env/tcl/tcl8.6/msgs/lt.msg new file mode 100644 index 0000000..27b0985 --- /dev/null +++ b/env/tcl/tcl8.6/msgs/lt.msg @@ -0,0 +1,52 @@ +# created by tools/loadICU.tcl -- do not edit +namespace eval ::tcl::clock { + ::msgcat::mcset lt DAYS_OF_WEEK_ABBREV [list \ + "Sk"\ + "Pr"\ + "An"\ + "Tr"\ + "Kt"\ + "Pn"\ + "\u0160t"] + ::msgcat::mcset lt DAYS_OF_WEEK_FULL [list \ + "Sekmadienis"\ + "Pirmadienis"\ + "Antradienis"\ + "Tre\u010diadienis"\ + "Ketvirtadienis"\ + "Penktadienis"\ + "\u0160e\u0161tadienis"] + ::msgcat::mcset lt MONTHS_ABBREV [list \ + "Sau"\ + "Vas"\ + "Kov"\ + "Bal"\ + "Geg"\ + "Bir"\ + "Lie"\ + "Rgp"\ + "Rgs"\ + "Spa"\ + "Lap"\ + "Grd"\ + ""] + ::msgcat::mcset lt MONTHS_FULL [list \ + "Sausio"\ + "Vasario"\ + "Kovo"\ + "Baland\u017eio"\ + "Gegu\u017e\u0117s"\ + "Bir\u017eelio"\ + "Liepos"\ + "Rugpj\u016b\u010dio"\ + "Rugs\u0117jo"\ + "Spalio"\ + "Lapkri\u010dio"\ + "Gruod\u017eio"\ + ""] + ::msgcat::mcset lt BCE "pr.Kr." + ::msgcat::mcset lt CE "po.Kr." + ::msgcat::mcset lt DATE_FORMAT "%Y.%m.%e" + ::msgcat::mcset lt TIME_FORMAT "%H.%M.%S" + ::msgcat::mcset lt DATE_TIME_FORMAT "%Y.%m.%e %H.%M.%S %z" +} diff --git a/env/tcl/tcl8.6/msgs/lv.msg b/env/tcl/tcl8.6/msgs/lv.msg new file mode 100644 index 0000000..a037b15 --- /dev/null +++ b/env/tcl/tcl8.6/msgs/lv.msg @@ -0,0 +1,52 @@ +# created by tools/loadICU.tcl -- do not edit +namespace eval ::tcl::clock { + ::msgcat::mcset lv DAYS_OF_WEEK_ABBREV [list \ + "Sv"\ + "P"\ + "O"\ + "T"\ + "C"\ + "Pk"\ + "S"] + ::msgcat::mcset lv DAYS_OF_WEEK_FULL [list \ + "sv\u0113tdiena"\ + "pirmdiena"\ + "otrdiena"\ + "tre\u0161diena"\ + "ceturdien"\ + "piektdiena"\ + "sestdiena"] + ::msgcat::mcset lv MONTHS_ABBREV [list \ + "Jan"\ + "Feb"\ + "Mar"\ + "Apr"\ + "Maijs"\ + "J\u016bn"\ + "J\u016bl"\ + "Aug"\ + "Sep"\ + "Okt"\ + "Nov"\ + "Dec"\ + ""] + ::msgcat::mcset lv MONTHS_FULL [list \ + "janv\u0101ris"\ + "febru\u0101ris"\ + "marts"\ + "apr\u012blis"\ + "maijs"\ + "j\u016bnijs"\ + "j\u016blijs"\ + "augusts"\ + "septembris"\ + "oktobris"\ + "novembris"\ + "decembris"\ + ""] + ::msgcat::mcset lv BCE "pm\u0113" + ::msgcat::mcset lv CE "m\u0113" + ::msgcat::mcset lv DATE_FORMAT "%Y.%e.%m" + ::msgcat::mcset lv TIME_FORMAT "%H:%M:%S" + ::msgcat::mcset lv DATE_TIME_FORMAT "%Y.%e.%m %H:%M:%S %z" +} diff --git a/env/tcl/tcl8.6/msgs/mk.msg b/env/tcl/tcl8.6/msgs/mk.msg new file mode 100644 index 0000000..41cf60d --- /dev/null +++ b/env/tcl/tcl8.6/msgs/mk.msg @@ -0,0 +1,52 @@ +# created by tools/loadICU.tcl -- do not edit +namespace eval ::tcl::clock { + ::msgcat::mcset mk DAYS_OF_WEEK_ABBREV [list \ + "\u043d\u0435\u0434."\ + "\u043f\u043e\u043d."\ + "\u0432\u0442."\ + "\u0441\u0440\u0435."\ + "\u0447\u0435\u0442."\ + "\u043f\u0435\u0442."\ + "\u0441\u0430\u0431."] + ::msgcat::mcset mk DAYS_OF_WEEK_FULL [list \ + "\u043d\u0435\u0434\u0435\u043b\u0430"\ + "\u043f\u043e\u043d\u0435\u0434\u0435\u043b\u043d\u0438\u043a"\ + "\u0432\u0442\u043e\u0440\u043d\u0438\u043a"\ + "\u0441\u0440\u0435\u0434\u0430"\ + "\u0447\u0435\u0442\u0432\u0440\u0442\u043e\u043a"\ + "\u043f\u0435\u0442\u043e\u043a"\ + "\u0441\u0430\u0431\u043e\u0442\u0430"] + ::msgcat::mcset mk MONTHS_ABBREV [list \ + "\u0458\u0430\u043d."\ + "\u0444\u0435\u0432."\ + "\u043c\u0430\u0440."\ + "\u0430\u043f\u0440."\ + "\u043c\u0430\u0458."\ + "\u0458\u0443\u043d."\ + "\u0458\u0443\u043b."\ + "\u0430\u0432\u0433."\ + "\u0441\u0435\u043f\u0442."\ + "\u043e\u043a\u0442."\ + "\u043d\u043e\u0435\u043c."\ + "\u0434\u0435\u043a\u0435\u043c."\ + ""] + ::msgcat::mcset mk MONTHS_FULL [list \ + "\u0458\u0430\u043d\u0443\u0430\u0440\u0438"\ + "\u0444\u0435\u0432\u0440\u0443\u0430\u0440\u0438"\ + "\u043c\u0430\u0440\u0442"\ + "\u0430\u043f\u0440\u0438\u043b"\ + "\u043c\u0430\u0458"\ + "\u0458\u0443\u043d\u0438"\ + "\u0458\u0443\u043b\u0438"\ + "\u0430\u0432\u0433\u0443\u0441\u0442"\ + "\u0441\u0435\u043f\u0442\u0435\u043c\u0432\u0440\u0438"\ + "\u043e\u043a\u0442\u043e\u043c\u0432\u0440\u0438"\ + "\u043d\u043e\u0435\u043c\u0432\u0440\u0438"\ + "\u0434\u0435\u043a\u0435\u043c\u0432\u0440\u0438"\ + ""] + ::msgcat::mcset mk BCE "\u043f\u0440.\u043d.\u0435." + ::msgcat::mcset mk CE "\u0430\u0435." + ::msgcat::mcset mk DATE_FORMAT "%e.%m.%Y" + ::msgcat::mcset mk TIME_FORMAT "%H:%M:%S %z" + ::msgcat::mcset mk DATE_TIME_FORMAT "%e.%m.%Y %H:%M:%S %z %z" +} diff --git a/env/tcl/tcl8.6/msgs/mr.msg b/env/tcl/tcl8.6/msgs/mr.msg new file mode 100644 index 0000000..cea427a --- /dev/null +++ b/env/tcl/tcl8.6/msgs/mr.msg @@ -0,0 +1,39 @@ +# created by tools/loadICU.tcl -- do not edit +namespace eval ::tcl::clock { + ::msgcat::mcset mr DAYS_OF_WEEK_FULL [list \ + "\u0930\u0935\u093f\u0935\u093e\u0930"\ + "\u0938\u094b\u092e\u0935\u093e\u0930"\ + "\u092e\u0902\u0917\u0933\u0935\u093e\u0930"\ + "\u092e\u0902\u0917\u0933\u0935\u093e\u0930"\ + "\u0917\u0941\u0930\u0941\u0935\u093e\u0930"\ + "\u0936\u0941\u0915\u094d\u0930\u0935\u093e\u0930"\ + "\u0936\u0928\u093f\u0935\u093e\u0930"] + ::msgcat::mcset mr MONTHS_ABBREV [list \ + "\u091c\u093e\u0928\u0947\u0935\u093e\u0930\u0940"\ + "\u092b\u0947\u092c\u0943\u0935\u093e\u0930\u0940"\ + "\u092e\u093e\u0930\u094d\u091a"\ + "\u090f\u092a\u094d\u0930\u093f\u0932"\ + "\u092e\u0947"\ + "\u091c\u0942\u0928"\ + "\u091c\u0941\u0932\u0948"\ + "\u0913\u0917\u0938\u094d\u091f"\ + "\u0938\u0947\u092a\u094d\u091f\u0947\u0902\u092c\u0930"\ + "\u0913\u0915\u094d\u091f\u094b\u092c\u0930"\ + "\u0928\u094b\u0935\u094d\u0939\u0947\u0902\u092c\u0930"\ + "\u0921\u093f\u0938\u0947\u0902\u092c\u0930"] + ::msgcat::mcset mr MONTHS_FULL [list \ + "\u091c\u093e\u0928\u0947\u0935\u093e\u0930\u0940"\ + "\u092b\u0947\u092c\u0943\u0935\u093e\u0930\u0940"\ + "\u092e\u093e\u0930\u094d\u091a"\ + "\u090f\u092a\u094d\u0930\u093f\u0932"\ + "\u092e\u0947"\ + "\u091c\u0942\u0928"\ + "\u091c\u0941\u0932\u0948"\ + "\u0913\u0917\u0938\u094d\u091f"\ + "\u0938\u0947\u092a\u094d\u091f\u0947\u0902\u092c\u0930"\ + "\u0913\u0915\u094d\u091f\u094b\u092c\u0930"\ + "\u0928\u094b\u0935\u094d\u0939\u0947\u0902\u092c\u0930"\ + "\u0921\u093f\u0938\u0947\u0902\u092c\u0930"] + ::msgcat::mcset mr AM "BC" + ::msgcat::mcset mr PM "AD" +} diff --git a/env/tcl/tcl8.6/msgs/mr_in.msg b/env/tcl/tcl8.6/msgs/mr_in.msg new file mode 100644 index 0000000..1889da5 --- /dev/null +++ b/env/tcl/tcl8.6/msgs/mr_in.msg @@ -0,0 +1,6 @@ +# created by tools/loadICU.tcl -- do not edit +namespace eval ::tcl::clock { + ::msgcat::mcset mr_IN DATE_FORMAT "%d %M %Y" + ::msgcat::mcset mr_IN TIME_FORMAT_12 "%I:%M:%S %P" + ::msgcat::mcset mr_IN DATE_TIME_FORMAT "%d %M %Y %I:%M:%S %P %z" +} diff --git a/env/tcl/tcl8.6/msgs/ms.msg b/env/tcl/tcl8.6/msgs/ms.msg new file mode 100644 index 0000000..e954431 --- /dev/null +++ b/env/tcl/tcl8.6/msgs/ms.msg @@ -0,0 +1,47 @@ +# created by tools/loadICU.tcl -- do not edit +namespace eval ::tcl::clock { + ::msgcat::mcset ms DAYS_OF_WEEK_ABBREV [list \ + "Aha"\ + "Isn"\ + "Sei"\ + "Rab"\ + "Kha"\ + "Jum"\ + "Sab"] + ::msgcat::mcset ms DAYS_OF_WEEK_FULL [list \ + "Ahad"\ + "Isnin"\ + "Selasa"\ + "Rahu"\ + "Khamis"\ + "Jumaat"\ + "Sabtu"] + ::msgcat::mcset ms MONTHS_ABBREV [list \ + "Jan"\ + "Feb"\ + "Mac"\ + "Apr"\ + "Mei"\ + "Jun"\ + "Jul"\ + "Ogos"\ + "Sep"\ + "Okt"\ + "Nov"\ + "Dis"\ + ""] + ::msgcat::mcset ms MONTHS_FULL [list \ + "Januari"\ + "Februari"\ + "Mac"\ + "April"\ + "Mei"\ + "Jun"\ + "Julai"\ + "Ogos"\ + "September"\ + "Oktober"\ + "November"\ + "Disember"\ + ""] +} diff --git a/env/tcl/tcl8.6/msgs/ms_my.msg b/env/tcl/tcl8.6/msgs/ms_my.msg new file mode 100644 index 0000000..c1f93d4 --- /dev/null +++ b/env/tcl/tcl8.6/msgs/ms_my.msg @@ -0,0 +1,6 @@ +# created by tools/loadICU.tcl -- do not edit +namespace eval ::tcl::clock { + ::msgcat::mcset ms_MY DATE_FORMAT "%A %d %b %Y" + ::msgcat::mcset ms_MY TIME_FORMAT_12 "%I:%M:%S %z" + ::msgcat::mcset ms_MY DATE_TIME_FORMAT "%A %d %b %Y %I:%M:%S %z %z" +} diff --git a/env/tcl/tcl8.6/msgs/mt.msg b/env/tcl/tcl8.6/msgs/mt.msg new file mode 100644 index 0000000..ddd5446 --- /dev/null +++ b/env/tcl/tcl8.6/msgs/mt.msg @@ -0,0 +1,27 @@ +# created by tools/loadICU.tcl -- do not edit +namespace eval ::tcl::clock { + ::msgcat::mcset mt DAYS_OF_WEEK_ABBREV [list \ + "\u0126ad"\ + "Tne"\ + "Tli"\ + "Erb"\ + "\u0126am"\ + "\u0120im"] + ::msgcat::mcset mt MONTHS_ABBREV [list \ + "Jan"\ + "Fra"\ + "Mar"\ + "Apr"\ + "Mej"\ + "\u0120un"\ + "Lul"\ + "Awi"\ + "Set"\ + "Ott"\ + "Nov"] + ::msgcat::mcset mt BCE "QK" + ::msgcat::mcset mt CE "" + ::msgcat::mcset mt DATE_FORMAT "%A, %e ta %B, %Y" + ::msgcat::mcset mt TIME_FORMAT_12 "%l:%M:%S %P" + ::msgcat::mcset mt DATE_TIME_FORMAT "%A, %e ta %B, %Y %l:%M:%S %P %z" +} diff --git a/env/tcl/tcl8.6/msgs/nb.msg b/env/tcl/tcl8.6/msgs/nb.msg new file mode 100644 index 0000000..90d49a3 --- /dev/null +++ b/env/tcl/tcl8.6/msgs/nb.msg @@ -0,0 +1,52 @@ +# created by tools/loadICU.tcl -- do not edit +namespace eval ::tcl::clock { + ::msgcat::mcset nb DAYS_OF_WEEK_ABBREV [list \ + "s\u00f8"\ + "ma"\ + "ti"\ + "on"\ + "to"\ + "fr"\ + "l\u00f8"] + ::msgcat::mcset nb DAYS_OF_WEEK_FULL [list \ + "s\u00f8ndag"\ + "mandag"\ + "tirsdag"\ + "onsdag"\ + "torsdag"\ + "fredag"\ + "l\u00f8rdag"] + ::msgcat::mcset nb MONTHS_ABBREV [list \ + "jan"\ + "feb"\ + "mar"\ + "apr"\ + "mai"\ + "jun"\ + "jul"\ + "aug"\ + "sep"\ + "okt"\ + "nov"\ + "des"\ + ""] + ::msgcat::mcset nb MONTHS_FULL [list \ + "januar"\ + "februar"\ + "mars"\ + "april"\ + "mai"\ + "juni"\ + "juli"\ + "august"\ + "september"\ + "oktober"\ + "november"\ + "desember"\ + ""] + ::msgcat::mcset nb BCE "f.Kr." + ::msgcat::mcset nb CE "e.Kr." + ::msgcat::mcset nb DATE_FORMAT "%e. %B %Y" + ::msgcat::mcset nb TIME_FORMAT "%H:%M:%S" + ::msgcat::mcset nb DATE_TIME_FORMAT "%e. %B %Y %H:%M:%S %z" +} diff --git a/env/tcl/tcl8.6/msgs/nl.msg b/env/tcl/tcl8.6/msgs/nl.msg new file mode 100644 index 0000000..4c5c675 --- /dev/null +++ b/env/tcl/tcl8.6/msgs/nl.msg @@ -0,0 +1,50 @@ +# created by tools/loadICU.tcl -- do not edit +namespace eval ::tcl::clock { + ::msgcat::mcset nl DAYS_OF_WEEK_ABBREV [list \ + "zo"\ + "ma"\ + "di"\ + "wo"\ + "do"\ + "vr"\ + "za"] + ::msgcat::mcset nl DAYS_OF_WEEK_FULL [list \ + "zondag"\ + "maandag"\ + "dinsdag"\ + "woensdag"\ + "donderdag"\ + "vrijdag"\ + "zaterdag"] + ::msgcat::mcset nl MONTHS_ABBREV [list \ + "jan"\ + "feb"\ + "mrt"\ + "apr"\ + "mei"\ + "jun"\ + "jul"\ + "aug"\ + "sep"\ + "okt"\ + "nov"\ + "dec"\ + ""] + ::msgcat::mcset nl MONTHS_FULL [list \ + "januari"\ + "februari"\ + "maart"\ + "april"\ + "mei"\ + "juni"\ + "juli"\ + "augustus"\ + "september"\ + "oktober"\ + "november"\ + "december"\ + ""] + ::msgcat::mcset nl DATE_FORMAT "%e %B %Y" + ::msgcat::mcset nl TIME_FORMAT "%k:%M:%S" + ::msgcat::mcset nl DATE_TIME_FORMAT "%e %B %Y %k:%M:%S %z" +} diff --git a/env/tcl/tcl8.6/msgs/nl_be.msg b/env/tcl/tcl8.6/msgs/nl_be.msg new file mode 100644 index 0000000..4b19670 --- /dev/null +++ b/env/tcl/tcl8.6/msgs/nl_be.msg @@ -0,0 +1,7 @@ +# created by tools/loadICU.tcl -- do not edit +namespace eval ::tcl::clock { + ::msgcat::mcset nl_BE DATE_FORMAT "%d-%m-%y" + ::msgcat::mcset nl_BE TIME_FORMAT "%T" + ::msgcat::mcset nl_BE TIME_FORMAT_12 "%T" + ::msgcat::mcset nl_BE DATE_TIME_FORMAT "%a %d %b %Y %T %z" +} diff --git a/env/tcl/tcl8.6/msgs/nn.msg b/env/tcl/tcl8.6/msgs/nn.msg new file mode 100644 index 0000000..bd61ac9 --- /dev/null +++ b/env/tcl/tcl8.6/msgs/nn.msg @@ -0,0 +1,52 @@ +# created by tools/loadICU.tcl -- do not edit +namespace eval ::tcl::clock { + ::msgcat::mcset nn DAYS_OF_WEEK_ABBREV [list \ + "su"\ + "m\u00e5"\ + "ty"\ + "on"\ + "to"\ + "fr"\ + "lau"] + ::msgcat::mcset nn DAYS_OF_WEEK_FULL [list \ + "sundag"\ + "m\u00e5ndag"\ + "tysdag"\ + "onsdag"\ + "torsdag"\ + "fredag"\ + "laurdag"] + ::msgcat::mcset nn MONTHS_ABBREV [list \ + "jan"\ + "feb"\ + "mar"\ + "apr"\ + "mai"\ + "jun"\ + "jul"\ + "aug"\ + "sep"\ + "okt"\ + "nov"\ + "des"\ + ""] + ::msgcat::mcset nn MONTHS_FULL [list \ + "januar"\ + "februar"\ + "mars"\ + "april"\ + "mai"\ + "juni"\ + "juli"\ + "august"\ + "september"\ + "oktober"\ + "november"\ + "desember"\ + ""] + ::msgcat::mcset nn BCE "f.Kr." + ::msgcat::mcset nn CE "e.Kr." + ::msgcat::mcset nn DATE_FORMAT "%e. %B %Y" + ::msgcat::mcset nn TIME_FORMAT "%H:%M:%S" + ::msgcat::mcset nn DATE_TIME_FORMAT "%e. %B %Y %H:%M:%S %z" +} diff --git a/env/tcl/tcl8.6/msgs/pl.msg b/env/tcl/tcl8.6/msgs/pl.msg new file mode 100644 index 0000000..d206f4b --- /dev/null +++ b/env/tcl/tcl8.6/msgs/pl.msg @@ -0,0 +1,52 @@ +# created by tools/loadICU.tcl -- do not edit +namespace eval ::tcl::clock { + ::msgcat::mcset pl DAYS_OF_WEEK_ABBREV [list \ + "N"\ + "Pn"\ + "Wt"\ + "\u015ar"\ + "Cz"\ + "Pt"\ + "So"] + ::msgcat::mcset pl DAYS_OF_WEEK_FULL [list \ + "niedziela"\ + "poniedzia\u0142ek"\ + "wtorek"\ + "\u015broda"\ + "czwartek"\ + "pi\u0105tek"\ + "sobota"] + ::msgcat::mcset pl MONTHS_ABBREV [list \ + "sty"\ + "lut"\ + "mar"\ + "kwi"\ + "maj"\ + "cze"\ + "lip"\ + "sie"\ + "wrz"\ + "pa\u017a"\ + "lis"\ + "gru"\ + ""] + ::msgcat::mcset pl MONTHS_FULL [list \ + "stycze\u0144"\ + "luty"\ + "marzec"\ + "kwiecie\u0144"\ + "maj"\ + "czerwiec"\ + "lipiec"\ + "sierpie\u0144"\ + "wrzesie\u0144"\ + "pa\u017adziernik"\ + "listopad"\ + "grudzie\u0144"\ + ""] + ::msgcat::mcset pl BCE "p.n.e." + ::msgcat::mcset pl CE "n.e." + ::msgcat::mcset pl DATE_FORMAT "%Y-%m-%d" + ::msgcat::mcset pl TIME_FORMAT "%H:%M:%S" + ::msgcat::mcset pl DATE_TIME_FORMAT "%Y-%m-%d %H:%M:%S %z" +} diff --git a/env/tcl/tcl8.6/msgs/pt.msg b/env/tcl/tcl8.6/msgs/pt.msg new file mode 100644 index 0000000..96fdb35 --- /dev/null +++ b/env/tcl/tcl8.6/msgs/pt.msg @@ -0,0 +1,50 @@ +# created by tools/loadICU.tcl -- do not edit +namespace eval ::tcl::clock { + ::msgcat::mcset pt DAYS_OF_WEEK_ABBREV [list \ + "Dom"\ + "Seg"\ + "Ter"\ + "Qua"\ + "Qui"\ + "Sex"\ + "S\u00e1b"] + ::msgcat::mcset pt DAYS_OF_WEEK_FULL [list \ + "Domingo"\ + "Segunda-feira"\ + "Ter\u00e7a-feira"\ + "Quarta-feira"\ + "Quinta-feira"\ + "Sexta-feira"\ + "S\u00e1bado"] + ::msgcat::mcset pt MONTHS_ABBREV [list \ + "Jan"\ + "Fev"\ + "Mar"\ + "Abr"\ + "Mai"\ + "Jun"\ + "Jul"\ + "Ago"\ + "Set"\ + "Out"\ + "Nov"\ + "Dez"\ + ""] + ::msgcat::mcset pt MONTHS_FULL [list \ + "Janeiro"\ + "Fevereiro"\ + "Mar\u00e7o"\ + "Abril"\ + "Maio"\ + "Junho"\ + "Julho"\ + "Agosto"\ + "Setembro"\ + "Outubro"\ + "Novembro"\ + "Dezembro"\ + ""] + ::msgcat::mcset pt DATE_FORMAT "%d-%m-%Y" + ::msgcat::mcset pt TIME_FORMAT "%k:%M:%S" + ::msgcat::mcset pt DATE_TIME_FORMAT "%d-%m-%Y %k:%M:%S %z" +} diff --git a/env/tcl/tcl8.6/msgs/pt_br.msg b/env/tcl/tcl8.6/msgs/pt_br.msg new file mode 100644 index 0000000..8684327 --- /dev/null +++ b/env/tcl/tcl8.6/msgs/pt_br.msg @@ -0,0 +1,7 @@ +# created by tools/loadICU.tcl -- do not edit +namespace eval ::tcl::clock { + ::msgcat::mcset pt_BR DATE_FORMAT "%d-%m-%Y" + ::msgcat::mcset pt_BR TIME_FORMAT "%T" + ::msgcat::mcset pt_BR TIME_FORMAT_12 "%T" + ::msgcat::mcset pt_BR DATE_TIME_FORMAT "%a %d %b %Y %T %z" +} diff --git a/env/tcl/tcl8.6/msgs/ro.msg b/env/tcl/tcl8.6/msgs/ro.msg new file mode 100644 index 0000000..bdd7c61 --- /dev/null +++ b/env/tcl/tcl8.6/msgs/ro.msg @@ -0,0 +1,52 @@ +# created by tools/loadICU.tcl -- do not edit +namespace eval ::tcl::clock { + ::msgcat::mcset ro DAYS_OF_WEEK_ABBREV [list \ + "D"\ + "L"\ + "Ma"\ + "Mi"\ + "J"\ + "V"\ + "S"] + ::msgcat::mcset ro DAYS_OF_WEEK_FULL [list \ + "duminic\u0103"\ + "luni"\ + "mar\u0163i"\ + "miercuri"\ + "joi"\ + "vineri"\ + "s\u00eemb\u0103t\u0103"] + ::msgcat::mcset ro MONTHS_ABBREV [list \ + "Ian"\ + "Feb"\ + "Mar"\ + "Apr"\ + "Mai"\ + "Iun"\ + "Iul"\ + "Aug"\ + "Sep"\ + "Oct"\ + "Nov"\ + "Dec"\ + ""] + ::msgcat::mcset ro MONTHS_FULL [list \ + "ianuarie"\ + "februarie"\ + "martie"\ + "aprilie"\ + "mai"\ + "iunie"\ + "iulie"\ + "august"\ + "septembrie"\ + "octombrie"\ + "noiembrie"\ + "decembrie"\ + ""] + ::msgcat::mcset ro BCE "d.C." + ::msgcat::mcset ro CE "\u00ee.d.C." + ::msgcat::mcset ro DATE_FORMAT "%d.%m.%Y" + ::msgcat::mcset ro TIME_FORMAT "%H:%M:%S" + ::msgcat::mcset ro DATE_TIME_FORMAT "%d.%m.%Y %H:%M:%S %z" +} diff --git a/env/tcl/tcl8.6/msgs/ru.msg b/env/tcl/tcl8.6/msgs/ru.msg new file mode 100644 index 0000000..65b075d --- /dev/null +++ b/env/tcl/tcl8.6/msgs/ru.msg @@ -0,0 +1,52 @@ +# created by tools/loadICU.tcl -- do not edit +namespace eval ::tcl::clock { + ::msgcat::mcset ru DAYS_OF_WEEK_ABBREV [list \ + "\u0412\u0441"\ + "\u041f\u043d"\ + "\u0412\u0442"\ + "\u0421\u0440"\ + "\u0427\u0442"\ + "\u041f\u0442"\ + "\u0421\u0431"] + ::msgcat::mcset ru DAYS_OF_WEEK_FULL [list \ + "\u0432\u043e\u0441\u043a\u0440\u0435\u0441\u0435\u043d\u044c\u0435"\ + "\u043f\u043e\u043d\u0435\u0434\u0435\u043b\u044c\u043d\u0438\u043a"\ + "\u0432\u0442\u043e\u0440\u043d\u0438\u043a"\ + "\u0441\u0440\u0435\u0434\u0430"\ + "\u0447\u0435\u0442\u0432\u0435\u0440\u0433"\ + "\u043f\u044f\u0442\u043d\u0438\u0446\u0430"\ + "\u0441\u0443\u0431\u0431\u043e\u0442\u0430"] + ::msgcat::mcset ru MONTHS_ABBREV [list \ + "\u044f\u043d\u0432"\ + "\u0444\u0435\u0432"\ + "\u043c\u0430\u0440"\ + "\u0430\u043f\u0440"\ + "\u043c\u0430\u0439"\ + "\u0438\u044e\u043d"\ + "\u0438\u044e\u043b"\ + "\u0430\u0432\u0433"\ + "\u0441\u0435\u043d"\ + "\u043e\u043a\u0442"\ + "\u043d\u043e\u044f"\ + "\u0434\u0435\u043a"\ + ""] + ::msgcat::mcset ru MONTHS_FULL [list \ + "\u042f\u043d\u0432\u0430\u0440\u044c"\ + "\u0424\u0435\u0432\u0440\u0430\u043b\u044c"\ + "\u041c\u0430\u0440\u0442"\ + "\u0410\u043f\u0440\u0435\u043b\u044c"\ + "\u041c\u0430\u0439"\ + "\u0418\u044e\u043d\u044c"\ + "\u0418\u044e\u043b\u044c"\ + "\u0410\u0432\u0433\u0443\u0441\u0442"\ + "\u0421\u0435\u043d\u0442\u044f\u0431\u0440\u044c"\ + "\u041e\u043a\u0442\u044f\u0431\u0440\u044c"\ + "\u041d\u043e\u044f\u0431\u0440\u044c"\ + "\u0414\u0435\u043a\u0430\u0431\u0440\u044c"\ + ""] + ::msgcat::mcset ru BCE "\u0434\u043e \u043d.\u044d." + ::msgcat::mcset ru CE "\u043d.\u044d." + ::msgcat::mcset ru DATE_FORMAT "%d.%m.%Y" + ::msgcat::mcset ru TIME_FORMAT "%k:%M:%S" + ::msgcat::mcset ru DATE_TIME_FORMAT "%d.%m.%Y %k:%M:%S %z" +} diff --git a/env/tcl/tcl8.6/msgs/ru_ua.msg b/env/tcl/tcl8.6/msgs/ru_ua.msg new file mode 100644 index 0000000..6e1f8a8 --- /dev/null +++ b/env/tcl/tcl8.6/msgs/ru_ua.msg @@ -0,0 +1,6 @@ +# created by tools/loadICU.tcl -- do not edit +namespace eval ::tcl::clock { + ::msgcat::mcset ru_UA DATE_FORMAT "%d.%m.%Y" + ::msgcat::mcset ru_UA TIME_FORMAT "%k:%M:%S" + ::msgcat::mcset ru_UA DATE_TIME_FORMAT "%d.%m.%Y %k:%M:%S %z" +} diff --git a/env/tcl/tcl8.6/msgs/sh.msg b/env/tcl/tcl8.6/msgs/sh.msg new file mode 100644 index 0000000..6ee0fc7 --- /dev/null +++ b/env/tcl/tcl8.6/msgs/sh.msg @@ -0,0 +1,52 @@ +# created by tools/loadICU.tcl -- do not edit +namespace eval ::tcl::clock { + ::msgcat::mcset sh DAYS_OF_WEEK_ABBREV [list \ + "Ned"\ + "Pon"\ + "Uto"\ + "Sre"\ + "\u010cet"\ + "Pet"\ + "Sub"] + ::msgcat::mcset sh DAYS_OF_WEEK_FULL [list \ + "Nedelja"\ + "Ponedeljak"\ + "Utorak"\ + "Sreda"\ + "\u010cetvrtak"\ + "Petak"\ + "Subota"] + ::msgcat::mcset sh MONTHS_ABBREV [list \ + "Jan"\ + "Feb"\ + "Mar"\ + "Apr"\ + "Maj"\ + "Jun"\ + "Jul"\ + "Avg"\ + "Sep"\ + "Okt"\ + "Nov"\ + "Dec"\ + ""] + ::msgcat::mcset sh MONTHS_FULL [list \ + "Januar"\ + "Februar"\ + "Mart"\ + "April"\ + "Maj"\ + "Juni"\ + "Juli"\ + "Avgust"\ + "Septembar"\ + "Oktobar"\ + "Novembar"\ + "Decembar"\ + ""] + ::msgcat::mcset sh BCE "p. n. e." + ::msgcat::mcset sh CE "n. e." + ::msgcat::mcset sh DATE_FORMAT "%d.%m.%Y." + ::msgcat::mcset sh TIME_FORMAT "%k.%M.%S" + ::msgcat::mcset sh DATE_TIME_FORMAT "%d.%m.%Y. %k.%M.%S %z" +} diff --git a/env/tcl/tcl8.6/msgs/sk.msg b/env/tcl/tcl8.6/msgs/sk.msg new file mode 100644 index 0000000..9b2f0aa --- /dev/null +++ b/env/tcl/tcl8.6/msgs/sk.msg @@ -0,0 +1,52 @@ +# created by tools/loadICU.tcl -- do not edit +namespace eval ::tcl::clock { + ::msgcat::mcset sk DAYS_OF_WEEK_ABBREV [list \ + "Ne"\ + "Po"\ + "Ut"\ + "St"\ + "\u0160t"\ + "Pa"\ + "So"] + ::msgcat::mcset sk DAYS_OF_WEEK_FULL [list \ + "Nede\u013ee"\ + "Pondelok"\ + "Utorok"\ + "Streda"\ + "\u0160tvrtok"\ + "Piatok"\ + "Sobota"] + ::msgcat::mcset sk MONTHS_ABBREV [list \ + "jan"\ + "feb"\ + "mar"\ + "apr"\ + "m\u00e1j"\ + "j\u00fan"\ + "j\u00fal"\ + "aug"\ + "sep"\ + "okt"\ + "nov"\ + "dec"\ + ""] + ::msgcat::mcset sk MONTHS_FULL [list \ + "janu\u00e1r"\ + "febru\u00e1r"\ + "marec"\ + "apr\u00edl"\ + "m\u00e1j"\ + "j\u00fan"\ + "j\u00fal"\ + "august"\ + "september"\ + "okt\u00f3ber"\ + "november"\ + "december"\ + ""] + ::msgcat::mcset sk BCE "pred n.l." + ::msgcat::mcset sk CE "n.l." + ::msgcat::mcset sk DATE_FORMAT "%e.%m.%Y" + ::msgcat::mcset sk TIME_FORMAT "%k:%M:%S" + ::msgcat::mcset sk DATE_TIME_FORMAT "%e.%m.%Y %k:%M:%S %z" +} diff --git a/env/tcl/tcl8.6/msgs/sl.msg b/env/tcl/tcl8.6/msgs/sl.msg new file mode 100644 index 0000000..42bc509 --- /dev/null +++ b/env/tcl/tcl8.6/msgs/sl.msg @@ -0,0 +1,52 @@ +# created by tools/loadICU.tcl -- do not edit +namespace eval ::tcl::clock { + ::msgcat::mcset sl DAYS_OF_WEEK_ABBREV [list \ + "Ned"\ + "Pon"\ + "Tor"\ + "Sre"\ + "\u010cet"\ + "Pet"\ + "Sob"] + ::msgcat::mcset sl DAYS_OF_WEEK_FULL [list \ + "Nedelja"\ + "Ponedeljek"\ + "Torek"\ + "Sreda"\ + "\u010cetrtek"\ + "Petek"\ + "Sobota"] + ::msgcat::mcset sl MONTHS_ABBREV [list \ + "jan"\ + "feb"\ + "mar"\ + "apr"\ + "maj"\ + "jun"\ + "jul"\ + "avg"\ + "sep"\ + "okt"\ + "nov"\ + "dec"\ + ""] + ::msgcat::mcset sl MONTHS_FULL [list \ + "januar"\ + "februar"\ + "marec"\ + "april"\ + "maj"\ + "junij"\ + "julij"\ + "avgust"\ + "september"\ + "oktober"\ + "november"\ + "december"\ + ""] + ::msgcat::mcset sl BCE "pr.n.\u0161." + ::msgcat::mcset sl CE "po Kr." + ::msgcat::mcset sl DATE_FORMAT "%Y.%m.%e" + ::msgcat::mcset sl TIME_FORMAT "%k:%M:%S" + ::msgcat::mcset sl DATE_TIME_FORMAT "%Y.%m.%e %k:%M:%S %z" +} diff --git a/env/tcl/tcl8.6/msgs/sq.msg b/env/tcl/tcl8.6/msgs/sq.msg new file mode 100644 index 0000000..8fb1fce --- /dev/null +++ b/env/tcl/tcl8.6/msgs/sq.msg @@ -0,0 +1,54 @@ +# created by tools/loadICU.tcl -- do not edit +namespace eval ::tcl::clock { + ::msgcat::mcset sq DAYS_OF_WEEK_ABBREV [list \ + "Die"\ + "H\u00ebn"\ + "Mar"\ + "M\u00ebr"\ + "Enj"\ + "Pre"\ + "Sht"] + ::msgcat::mcset sq DAYS_OF_WEEK_FULL [list \ + "e diel"\ + "e h\u00ebn\u00eb"\ + "e mart\u00eb"\ + "e m\u00ebrkur\u00eb"\ + "e enjte"\ + "e premte"\ + "e shtun\u00eb"] + ::msgcat::mcset sq MONTHS_ABBREV [list \ + "Jan"\ + "Shk"\ + "Mar"\ + "Pri"\ + "Maj"\ + "Qer"\ + "Kor"\ + "Gsh"\ + "Sht"\ + "Tet"\ + "N\u00ebn"\ + "Dhj"\ + ""] + ::msgcat::mcset sq MONTHS_FULL [list \ + "janar"\ + "shkurt"\ + "mars"\ + "prill"\ + "maj"\ + "qershor"\ + "korrik"\ + "gusht"\ + "shtator"\ + "tetor"\ + "n\u00ebntor"\ + "dhjetor"\ + ""] + ::msgcat::mcset sq BCE "p.e.r." + ::msgcat::mcset sq CE "n.e.r." + ::msgcat::mcset sq AM "PD" + ::msgcat::mcset sq PM "MD" + ::msgcat::mcset sq DATE_FORMAT "%Y-%m-%d" + ::msgcat::mcset sq TIME_FORMAT_12 "%l:%M:%S.%P" + ::msgcat::mcset sq DATE_TIME_FORMAT "%Y-%m-%d %l:%M:%S.%P %z" +} diff --git a/env/tcl/tcl8.6/msgs/sr.msg b/env/tcl/tcl8.6/msgs/sr.msg new file mode 100644 index 0000000..7576668 --- /dev/null +++ b/env/tcl/tcl8.6/msgs/sr.msg @@ -0,0 +1,52 @@ +# created by tools/loadICU.tcl -- do not edit +namespace eval ::tcl::clock { + ::msgcat::mcset sr DAYS_OF_WEEK_ABBREV [list \ + "\u041d\u0435\u0434"\ + "\u041f\u043e\u043d"\ + "\u0423\u0442\u043e"\ + "\u0421\u0440\u0435"\ + "\u0427\u0435\u0442"\ + "\u041f\u0435\u0442"\ + "\u0421\u0443\u0431"] + ::msgcat::mcset sr DAYS_OF_WEEK_FULL [list \ + "\u041d\u0435\u0434\u0435\u0459\u0430"\ + "\u041f\u043e\u043d\u0435\u0434\u0435\u0459\u0430\u043a"\ + "\u0423\u0442\u043e\u0440\u0430\u043a"\ + "\u0421\u0440\u0435\u0434\u0430"\ + "\u0427\u0435\u0442\u0432\u0440\u0442\u0430\u043a"\ + "\u041f\u0435\u0442\u0430\u043a"\ + "\u0421\u0443\u0431\u043e\u0442\u0430"] + ::msgcat::mcset sr MONTHS_ABBREV [list \ + "\u0408\u0430\u043d"\ + "\u0424\u0435\u0431"\ + "\u041c\u0430\u0440"\ + "\u0410\u043f\u0440"\ + "\u041c\u0430\u0458"\ + "\u0408\u0443\u043d"\ + "\u0408\u0443\u043b"\ + "\u0410\u0432\u0433"\ + "\u0421\u0435\u043f"\ + "\u041e\u043a\u0442"\ + "\u041d\u043e\u0432"\ + "\u0414\u0435\u0446"\ + ""] + ::msgcat::mcset sr MONTHS_FULL [list \ + "\u0408\u0430\u043d\u0443\u0430\u0440"\ + "\u0424\u0435\u0431\u0440\u0443\u0430\u0440"\ + "\u041c\u0430\u0440\u0442"\ + "\u0410\u043f\u0440\u0438\u043b"\ + "\u041c\u0430\u0458"\ + "\u0408\u0443\u043d\u0438"\ + "\u0408\u0443\u043b\u0438"\ + "\u0410\u0432\u0433\u0443\u0441\u0442"\ + "\u0421\u0435\u043f\u0442\u0435\u043c\u0431\u0430\u0440"\ + "\u041e\u043a\u0442\u043e\u0431\u0430\u0440"\ + "\u041d\u043e\u0432\u0435\u043c\u0431\u0430\u0440"\ + "\u0414\u0435\u0446\u0435\u043c\u0431\u0430\u0440"\ + ""] + ::msgcat::mcset sr BCE "\u043f. \u043d. \u0435." + ::msgcat::mcset sr CE "\u043d. \u0435" + ::msgcat::mcset sr DATE_FORMAT "%Y.%m.%e" + ::msgcat::mcset sr TIME_FORMAT "%k.%M.%S" + ::msgcat::mcset sr DATE_TIME_FORMAT "%Y.%m.%e %k.%M.%S %z" +} diff --git a/env/tcl/tcl8.6/msgs/sv.msg b/env/tcl/tcl8.6/msgs/sv.msg new file mode 100644 index 0000000..f7a67c6 --- /dev/null +++ b/env/tcl/tcl8.6/msgs/sv.msg @@ -0,0 +1,52 @@ +# created by tools/loadICU.tcl -- do not edit +namespace eval ::tcl::clock { + ::msgcat::mcset sv DAYS_OF_WEEK_ABBREV [list \ + "s\u00f6"\ + "m\u00e5"\ + "ti"\ + "on"\ + "to"\ + "fr"\ + "l\u00f6"] + ::msgcat::mcset sv DAYS_OF_WEEK_FULL [list \ + "s\u00f6ndag"\ + "m\u00e5ndag"\ + "tisdag"\ + "onsdag"\ + "torsdag"\ + "fredag"\ + "l\u00f6rdag"] + ::msgcat::mcset sv MONTHS_ABBREV [list \ + "jan"\ + "feb"\ + "mar"\ + "apr"\ + "maj"\ + "jun"\ + "jul"\ + "aug"\ + "sep"\ + "okt"\ + "nov"\ + "dec"\ + ""] + ::msgcat::mcset sv MONTHS_FULL [list \ + "januari"\ + "februari"\ + "mars"\ + "april"\ + "maj"\ + "juni"\ + "juli"\ + "augusti"\ + "september"\ + "oktober"\ + "november"\ + "december"\ + ""] + ::msgcat::mcset sv BCE "f.Kr." + ::msgcat::mcset sv CE "e.Kr." + ::msgcat::mcset sv DATE_FORMAT "%Y-%m-%d" + ::msgcat::mcset sv TIME_FORMAT "%H:%M:%S" + ::msgcat::mcset sv DATE_TIME_FORMAT "%Y-%m-%d %H:%M:%S %z" +} diff --git a/env/tcl/tcl8.6/msgs/sw.msg b/env/tcl/tcl8.6/msgs/sw.msg new file mode 100644 index 0000000..b888b43 --- /dev/null +++ b/env/tcl/tcl8.6/msgs/sw.msg @@ -0,0 +1,49 @@ +# created by tools/loadICU.tcl -- do not edit +namespace eval ::tcl::clock { + ::msgcat::mcset sw DAYS_OF_WEEK_ABBREV [list \ + "Jpi"\ + "Jtt"\ + "Jnn"\ + "Jtn"\ + "Alh"\ + "Iju"\ + "Jmo"] + ::msgcat::mcset sw DAYS_OF_WEEK_FULL [list \ + "Jumapili"\ + "Jumatatu"\ + "Jumanne"\ + "Jumatano"\ + "Alhamisi"\ + "Ijumaa"\ + "Jumamosi"] + ::msgcat::mcset sw MONTHS_ABBREV [list \ + "Jan"\ + "Feb"\ + "Mar"\ + "Apr"\ + "Mei"\ + "Jun"\ + "Jul"\ + "Ago"\ + "Sep"\ + "Okt"\ + "Nov"\ + "Des"\ + ""] + ::msgcat::mcset sw MONTHS_FULL [list \ + "Januari"\ + "Februari"\ + "Machi"\ + "Aprili"\ + "Mei"\ + "Juni"\ + "Julai"\ + "Agosti"\ + "Septemba"\ + "Oktoba"\ + "Novemba"\ + "Desemba"\ + ""] + ::msgcat::mcset sw BCE "KK" + ::msgcat::mcset sw CE "BK" +} diff --git a/env/tcl/tcl8.6/msgs/ta.msg b/env/tcl/tcl8.6/msgs/ta.msg new file mode 100644 index 0000000..4abb90c --- /dev/null +++ b/env/tcl/tcl8.6/msgs/ta.msg @@ -0,0 +1,39 @@ +# created by tools/loadICU.tcl -- do not edit +namespace eval ::tcl::clock { + ::msgcat::mcset ta DAYS_OF_WEEK_FULL [list \ + "\u0b9e\u0bbe\u0baf\u0bbf\u0bb1\u0bc1"\ + "\u0ba4\u0bbf\u0b99\u0bcd\u0b95\u0bb3\u0bcd"\ + "\u0b9a\u0bc6\u0bb5\u0bcd\u0bb5\u0bbe\u0baf\u0bcd"\ + "\u0baa\u0bc1\u0ba4\u0ba9\u0bcd"\ + "\u0bb5\u0bbf\u0baf\u0bbe\u0bb4\u0ba9\u0bcd"\ + "\u0bb5\u0bc6\u0bb3\u0bcd\u0bb3\u0bbf"\ + "\u0b9a\u0ba9\u0bbf"] + ::msgcat::mcset ta MONTHS_ABBREV [list \ + "\u0b9c\u0ba9\u0bb5\u0bb0\u0bbf"\ + "\u0baa\u0bc6\u0baa\u0bcd\u0bb0\u0bb5\u0bb0\u0bbf"\ + "\u0bae\u0bbe\u0bb0\u0bcd\u0b9a\u0bcd"\ + "\u0b8f\u0baa\u0bcd\u0bb0\u0bb2\u0bcd"\ + "\u0bae\u0bc7"\ + "\u0b9c\u0bc2\u0ba9\u0bcd"\ + "\u0b9c\u0bc2\u0bb2\u0bc8"\ + "\u0b86\u0b95\u0bb8\u0bcd\u0b9f\u0bcd"\ + "\u0b9a\u0bc6\u0baa\u0bcd\u0b9f\u0bae\u0bcd\u0baa\u0bb0\u0bcd"\ + "\u0b85\u0b95\u0bcd\u0b9f\u0bcb\u0baa\u0bb0\u0bcd"\ + "\u0ba8\u0bb5\u0bae\u0bcd\u0baa\u0bb0\u0bcd"\ + "\u0b9f\u0bbf\u0b9a\u0bae\u0bcd\u0baa\u0bb0\u0bcdr"] + ::msgcat::mcset ta MONTHS_FULL [list \ + "\u0b9c\u0ba9\u0bb5\u0bb0\u0bbf"\ + "\u0baa\u0bc6\u0baa\u0bcd\u0bb0\u0bb5\u0bb0\u0bbf"\ + "\u0bae\u0bbe\u0bb0\u0bcd\u0b9a\u0bcd"\ + "\u0b8f\u0baa\u0bcd\u0bb0\u0bb2\u0bcd"\ + "\u0bae\u0bc7"\ + "\u0b9c\u0bc2\u0ba9\u0bcd"\ + "\u0b9c\u0bc2\u0bb2\u0bc8"\ + "\u0b86\u0b95\u0bb8\u0bcd\u0b9f\u0bcd"\ + "\u0b9a\u0bc6\u0baa\u0bcd\u0b9f\u0bae\u0bcd\u0baa\u0bb0\u0bcd"\ + "\u0b85\u0b95\u0bcd\u0b9f\u0bcb\u0baa\u0bb0\u0bcd"\ + "\u0ba8\u0bb5\u0bae\u0bcd\u0baa\u0bb0\u0bcd"\ + "\u0b9f\u0bbf\u0b9a\u0bae\u0bcd\u0baa\u0bb0\u0bcdr"] + ::msgcat::mcset ta AM "\u0b95\u0bbf\u0bae\u0bc1" + ::msgcat::mcset ta PM "\u0b95\u0bbf\u0baa\u0bbf" +} diff --git a/env/tcl/tcl8.6/msgs/ta_in.msg b/env/tcl/tcl8.6/msgs/ta_in.msg new file mode 100644 index 0000000..24590ac --- /dev/null +++ b/env/tcl/tcl8.6/msgs/ta_in.msg @@ -0,0 +1,6 @@ +# created by tools/loadICU.tcl -- do not edit +namespace eval ::tcl::clock { + ::msgcat::mcset ta_IN DATE_FORMAT "%d %M %Y" + ::msgcat::mcset ta_IN TIME_FORMAT_12 "%I:%M:%S %P" + ::msgcat::mcset ta_IN DATE_TIME_FORMAT "%d %M %Y %I:%M:%S %P %z" +} diff --git a/env/tcl/tcl8.6/msgs/te.msg b/env/tcl/tcl8.6/msgs/te.msg new file mode 100644 index 0000000..6111473 --- /dev/null +++ b/env/tcl/tcl8.6/msgs/te.msg @@ -0,0 +1,47 @@ +# created by tools/loadICU.tcl -- do not edit +namespace eval ::tcl::clock { + ::msgcat::mcset te DAYS_OF_WEEK_ABBREV [list \ + "\u0c06\u0c26\u0c3f"\ + "\u0c38\u0c4b\u0c2e"\ + "\u0c2e\u0c02\u0c17\u0c33"\ + "\u0c2c\u0c41\u0c27"\ + "\u0c17\u0c41\u0c30\u0c41"\ + "\u0c36\u0c41\u0c15\u0c4d\u0c30"\ + "\u0c36\u0c28\u0c3f"] + ::msgcat::mcset te DAYS_OF_WEEK_FULL [list \ + "\u0c06\u0c26\u0c3f\u0c35\u0c3e\u0c30\u0c02"\ + "\u0c38\u0c4b\u0c2e\u0c35\u0c3e\u0c30\u0c02"\ + "\u0c2e\u0c02\u0c17\u0c33\u0c35\u0c3e\u0c30\u0c02"\ + "\u0c2c\u0c41\u0c27\u0c35\u0c3e\u0c30\u0c02"\ + "\u0c17\u0c41\u0c30\u0c41\u0c35\u0c3e\u0c30\u0c02"\ + "\u0c36\u0c41\u0c15\u0c4d\u0c30\u0c35\u0c3e\u0c30\u0c02"\ + "\u0c36\u0c28\u0c3f\u0c35\u0c3e\u0c30\u0c02"] + ::msgcat::mcset te MONTHS_ABBREV [list \ + "\u0c1c\u0c28\u0c35\u0c30\u0c3f"\ + "\u0c2b\u0c3f\u0c2c\u0c4d\u0c30\u0c35\u0c30\u0c3f"\ + "\u0c2e\u0c3e\u0c30\u0c4d\u0c1a\u0c3f"\ + "\u0c0f\u0c2a\u0c4d\u0c30\u0c3f\u0c32\u0c4d"\ + "\u0c2e\u0c47"\ + "\u0c1c\u0c42\u0c28\u0c4d"\ + "\u0c1c\u0c42\u0c32\u0c48"\ + "\u0c06\u0c17\u0c38\u0c4d\u0c1f\u0c41"\ + "\u0c38\u0c46\u0c2a\u0c4d\u0c1f\u0c46\u0c02\u0c2c\u0c30\u0c4d"\ + "\u0c05\u0c15\u0c4d\u0c1f\u0c4b\u0c2c\u0c30\u0c4d"\ + "\u0c28\u0c35\u0c02\u0c2c\u0c30\u0c4d"\ + "\u0c21\u0c3f\u0c38\u0c46\u0c02\u0c2c\u0c30\u0c4d"\ + ""] + ::msgcat::mcset te MONTHS_FULL [list \ + "\u0c1c\u0c28\u0c35\u0c30\u0c3f"\ + "\u0c2b\u0c3f\u0c2c\u0c4d\u0c30\u0c35\u0c30\u0c3f"\ + "\u0c2e\u0c3e\u0c30\u0c4d\u0c1a\u0c3f"\ + "\u0c0f\u0c2a\u0c4d\u0c30\u0c3f\u0c32\u0c4d"\ + "\u0c2e\u0c47"\ + "\u0c1c\u0c42\u0c28\u0c4d"\ + "\u0c1c\u0c42\u0c32\u0c48"\ + "\u0c06\u0c17\u0c38\u0c4d\u0c1f\u0c41"\ + "\u0c38\u0c46\u0c2a\u0c4d\u0c1f\u0c46\u0c02\u0c2c\u0c30\u0c4d"\ + "\u0c05\u0c15\u0c4d\u0c1f\u0c4b\u0c2c\u0c30\u0c4d"\ + "\u0c28\u0c35\u0c02\u0c2c\u0c30\u0c4d"\ + "\u0c21\u0c3f\u0c38\u0c46\u0c02\u0c2c\u0c30\u0c4d"\ + ""] +} diff --git a/env/tcl/tcl8.6/msgs/te_in.msg b/env/tcl/tcl8.6/msgs/te_in.msg new file mode 100644 index 0000000..61638b5 --- /dev/null +++ b/env/tcl/tcl8.6/msgs/te_in.msg @@ -0,0 +1,8 @@ +# created by tools/loadICU.tcl -- do not edit +namespace eval ::tcl::clock { + ::msgcat::mcset te_IN AM "\u0c2a\u0c42\u0c30\u0c4d\u0c35\u0c3e\u0c39\u0c4d\u0c28" + ::msgcat::mcset te_IN PM "\u0c05\u0c2a\u0c30\u0c3e\u0c39\u0c4d\u0c28" + ::msgcat::mcset te_IN DATE_FORMAT "%d/%m/%Y" + ::msgcat::mcset te_IN TIME_FORMAT_12 "%I:%M:%S %P" + ::msgcat::mcset te_IN DATE_TIME_FORMAT "%d/%m/%Y %I:%M:%S %P %z" +} diff --git a/env/tcl/tcl8.6/msgs/th.msg b/env/tcl/tcl8.6/msgs/th.msg new file mode 100644 index 0000000..7486c35 --- /dev/null +++ b/env/tcl/tcl8.6/msgs/th.msg @@ -0,0 +1,54 @@ +# created by tools/loadICU.tcl -- do not edit +namespace eval ::tcl::clock { + ::msgcat::mcset th DAYS_OF_WEEK_ABBREV [list \ + "\u0e2d\u0e32."\ + "\u0e08."\ + "\u0e2d."\ + "\u0e1e."\ + "\u0e1e\u0e24."\ + "\u0e28."\ + "\u0e2a."] + ::msgcat::mcset th DAYS_OF_WEEK_FULL [list \ + "\u0e27\u0e31\u0e19\u0e2d\u0e32\u0e17\u0e34\u0e15\u0e22\u0e4c"\ + "\u0e27\u0e31\u0e19\u0e08\u0e31\u0e19\u0e17\u0e23\u0e4c"\ + "\u0e27\u0e31\u0e19\u0e2d\u0e31\u0e07\u0e04\u0e32\u0e23"\ + "\u0e27\u0e31\u0e19\u0e1e\u0e38\u0e18"\ + "\u0e27\u0e31\u0e19\u0e1e\u0e24\u0e2b\u0e31\u0e2a\u0e1a\u0e14\u0e35"\ + "\u0e27\u0e31\u0e19\u0e28\u0e38\u0e01\u0e23\u0e4c"\ + "\u0e27\u0e31\u0e19\u0e40\u0e2a\u0e32\u0e23\u0e4c"] + ::msgcat::mcset th MONTHS_ABBREV [list \ + "\u0e21.\u0e04."\ + "\u0e01.\u0e1e."\ + "\u0e21\u0e35.\u0e04."\ + "\u0e40\u0e21.\u0e22."\ + "\u0e1e.\u0e04."\ + "\u0e21\u0e34.\u0e22."\ + "\u0e01.\u0e04."\ + "\u0e2a.\u0e04."\ + "\u0e01.\u0e22."\ + "\u0e15.\u0e04."\ + "\u0e1e.\u0e22."\ + "\u0e18.\u0e04."\ + ""] + ::msgcat::mcset th MONTHS_FULL [list \ + "\u0e21\u0e01\u0e23\u0e32\u0e04\u0e21"\ + "\u0e01\u0e38\u0e21\u0e20\u0e32\u0e1e\u0e31\u0e19\u0e18\u0e4c"\ + "\u0e21\u0e35\u0e19\u0e32\u0e04\u0e21"\ + "\u0e40\u0e21\u0e29\u0e32\u0e22\u0e19"\ + "\u0e1e\u0e24\u0e29\u0e20\u0e32\u0e04\u0e21"\ + "\u0e21\u0e34\u0e16\u0e38\u0e19\u0e32\u0e22\u0e19"\ + "\u0e01\u0e23\u0e01\u0e0e\u0e32\u0e04\u0e21"\ + "\u0e2a\u0e34\u0e07\u0e2b\u0e32\u0e04\u0e21"\ + "\u0e01\u0e31\u0e19\u0e22\u0e32\u0e22\u0e19"\ + "\u0e15\u0e38\u0e25\u0e32\u0e04\u0e21"\ + "\u0e1e\u0e24\u0e28\u0e08\u0e34\u0e01\u0e32\u0e22\u0e19"\ + "\u0e18\u0e31\u0e19\u0e27\u0e32\u0e04\u0e21"\ + ""] + ::msgcat::mcset th BCE "\u0e25\u0e17\u0e35\u0e48" + ::msgcat::mcset th CE "\u0e04.\u0e28." + ::msgcat::mcset th AM "\u0e01\u0e48\u0e2d\u0e19\u0e40\u0e17\u0e35\u0e48\u0e22\u0e07" + ::msgcat::mcset th PM "\u0e2b\u0e25\u0e31\u0e07\u0e40\u0e17\u0e35\u0e48\u0e22\u0e07" + ::msgcat::mcset th DATE_FORMAT "%e/%m/%Y" + ::msgcat::mcset th TIME_FORMAT "%k:%M:%S" + ::msgcat::mcset th DATE_TIME_FORMAT "%e/%m/%Y %k:%M:%S %z" +} diff --git a/env/tcl/tcl8.6/msgs/tr.msg b/env/tcl/tcl8.6/msgs/tr.msg new file mode 100644 index 0000000..7b2ecf9 --- /dev/null +++ b/env/tcl/tcl8.6/msgs/tr.msg @@ -0,0 +1,50 @@ +# created by tools/loadICU.tcl -- do not edit +namespace eval ::tcl::clock { + ::msgcat::mcset tr DAYS_OF_WEEK_ABBREV [list \ + "Paz"\ + "Pzt"\ + "Sal"\ + "\u00c7ar"\ + "Per"\ + "Cum"\ + "Cmt"] + ::msgcat::mcset tr DAYS_OF_WEEK_FULL [list \ + "Pazar"\ + "Pazartesi"\ + "Sal\u0131"\ + "\u00c7ar\u015famba"\ + "Per\u015fembe"\ + "Cuma"\ + "Cumartesi"] + ::msgcat::mcset tr MONTHS_ABBREV [list \ + "Oca"\ + "\u015eub"\ + "Mar"\ + "Nis"\ + "May"\ + "Haz"\ + "Tem"\ + "A\u011fu"\ + "Eyl"\ + "Eki"\ + "Kas"\ + "Ara"\ + ""] + ::msgcat::mcset tr MONTHS_FULL [list \ + "Ocak"\ + "\u015eubat"\ + "Mart"\ + "Nisan"\ + "May\u0131s"\ + "Haziran"\ + "Temmuz"\ + "A\u011fustos"\ + "Eyl\u00fcl"\ + "Ekim"\ + "Kas\u0131m"\ + "Aral\u0131k"\ + ""] + ::msgcat::mcset tr DATE_FORMAT "%d.%m.%Y" + ::msgcat::mcset tr TIME_FORMAT "%H:%M:%S" + ::msgcat::mcset tr DATE_TIME_FORMAT "%d.%m.%Y %H:%M:%S %z" +} diff --git a/env/tcl/tcl8.6/msgs/uk.msg b/env/tcl/tcl8.6/msgs/uk.msg new file mode 100644 index 0000000..7d4c64a --- /dev/null +++ b/env/tcl/tcl8.6/msgs/uk.msg @@ -0,0 +1,52 @@ +# created by tools/loadICU.tcl -- do not edit +namespace eval ::tcl::clock { + ::msgcat::mcset uk DAYS_OF_WEEK_ABBREV [list \ + "\u043d\u0434"\ + "\u043f\u043d"\ + "\u0432\u0442"\ + "\u0441\u0440"\ + "\u0447\u0442"\ + "\u043f\u0442"\ + "\u0441\u0431"] + ::msgcat::mcset uk DAYS_OF_WEEK_FULL [list \ + "\u043d\u0435\u0434\u0456\u043b\u044f"\ + "\u043f\u043e\u043d\u0435\u0434\u0456\u043b\u043e\u043a"\ + "\u0432\u0456\u0432\u0442\u043e\u0440\u043e\u043a"\ + "\u0441\u0435\u0440\u0435\u0434\u0430"\ + "\u0447\u0435\u0442\u0432\u0435\u0440"\ + "\u043f'\u044f\u0442\u043d\u0438\u0446\u044f"\ + "\u0441\u0443\u0431\u043e\u0442\u0430"] + ::msgcat::mcset uk MONTHS_ABBREV [list \ + "\u0441\u0456\u0447"\ + "\u043b\u044e\u0442"\ + "\u0431\u0435\u0440"\ + "\u043a\u0432\u0456\u0442"\ + "\u0442\u0440\u0430\u0432"\ + "\u0447\u0435\u0440\u0432"\ + "\u043b\u0438\u043f"\ + "\u0441\u0435\u0440\u043f"\ + "\u0432\u0435\u0440"\ + "\u0436\u043e\u0432\u0442"\ + "\u043b\u0438\u0441\u0442"\ + "\u0433\u0440\u0443\u0434"\ + ""] + ::msgcat::mcset uk MONTHS_FULL [list \ + "\u0441\u0456\u0447\u043d\u044f"\ + "\u043b\u044e\u0442\u043e\u0433\u043e"\ + "\u0431\u0435\u0440\u0435\u0437\u043d\u044f"\ + "\u043a\u0432\u0456\u0442\u043d\u044f"\ + "\u0442\u0440\u0430\u0432\u043d\u044f"\ + "\u0447\u0435\u0440\u0432\u043d\u044f"\ + "\u043b\u0438\u043f\u043d\u044f"\ + "\u0441\u0435\u0440\u043f\u043d\u044f"\ + "\u0432\u0435\u0440\u0435\u0441\u043d\u044f"\ + "\u0436\u043e\u0432\u0442\u043d\u044f"\ + "\u043b\u0438\u0441\u0442\u043e\u043f\u0430\u0434\u0430"\ + "\u0433\u0440\u0443\u0434\u043d\u044f"\ + ""] + ::msgcat::mcset uk BCE "\u0434\u043e \u043d.\u0435." + ::msgcat::mcset uk CE "\u043f\u0456\u0441\u043b\u044f \u043d.\u0435." + ::msgcat::mcset uk DATE_FORMAT "%e/%m/%Y" + ::msgcat::mcset uk TIME_FORMAT "%k:%M:%S" + ::msgcat::mcset uk DATE_TIME_FORMAT "%e/%m/%Y %k:%M:%S %z" +} diff --git a/env/tcl/tcl8.6/msgs/vi.msg b/env/tcl/tcl8.6/msgs/vi.msg new file mode 100644 index 0000000..c98b2a6 --- /dev/null +++ b/env/tcl/tcl8.6/msgs/vi.msg @@ -0,0 +1,50 @@ +# created by tools/loadICU.tcl -- do not edit +namespace eval ::tcl::clock { + ::msgcat::mcset vi DAYS_OF_WEEK_ABBREV [list \ + "Th 2"\ + "Th 3"\ + "Th 4"\ + "Th 5"\ + "Th 6"\ + "Th 7"\ + "CN"] + ::msgcat::mcset vi DAYS_OF_WEEK_FULL [list \ + "Th\u01b0\u0301 hai"\ + "Th\u01b0\u0301 ba"\ + "Th\u01b0\u0301 t\u01b0"\ + "Th\u01b0\u0301 n\u0103m"\ + "Th\u01b0\u0301 s\u00e1u"\ + "Th\u01b0\u0301 ba\u0309y"\ + "Chu\u0309 nh\u00e2\u0323t"] + ::msgcat::mcset vi MONTHS_ABBREV [list \ + "Thg 1"\ + "Thg 2"\ + "Thg 3"\ + "Thg 4"\ + "Thg 5"\ + "Thg 6"\ + "Thg 7"\ + "Thg 8"\ + "Thg 9"\ + "Thg 10"\ + "Thg 11"\ + "Thg 12"\ + ""] + ::msgcat::mcset vi MONTHS_FULL [list \ + "Th\u00e1ng m\u00f4\u0323t"\ + "Th\u00e1ng hai"\ + "Th\u00e1ng ba"\ + "Th\u00e1ng t\u01b0"\ + "Th\u00e1ng n\u0103m"\ + "Th\u00e1ng s\u00e1u"\ + "Th\u00e1ng ba\u0309y"\ + "Th\u00e1ng t\u00e1m"\ + "Th\u00e1ng ch\u00edn"\ + "Th\u00e1ng m\u01b0\u01a1\u0300i"\ + "Th\u00e1ng m\u01b0\u01a1\u0300i m\u00f4\u0323t"\ + "Th\u00e1ng m\u01b0\u01a1\u0300i hai"\ + ""] + ::msgcat::mcset vi DATE_FORMAT "%d %b %Y" + ::msgcat::mcset vi TIME_FORMAT "%H:%M:%S" + ::msgcat::mcset vi DATE_TIME_FORMAT "%d %b %Y %H:%M:%S %z" +} diff --git a/env/tcl/tcl8.6/msgs/zh.msg b/env/tcl/tcl8.6/msgs/zh.msg new file mode 100644 index 0000000..b799a32 --- /dev/null +++ b/env/tcl/tcl8.6/msgs/zh.msg @@ -0,0 +1,55 @@ +# created by tools/loadICU.tcl -- do not edit +namespace eval ::tcl::clock { + ::msgcat::mcset zh DAYS_OF_WEEK_ABBREV [list \ + "\u661f\u671f\u65e5"\ + "\u661f\u671f\u4e00"\ + "\u661f\u671f\u4e8c"\ + "\u661f\u671f\u4e09"\ + "\u661f\u671f\u56db"\ + "\u661f\u671f\u4e94"\ + "\u661f\u671f\u516d"] + ::msgcat::mcset zh DAYS_OF_WEEK_FULL [list \ + "\u661f\u671f\u65e5"\ + "\u661f\u671f\u4e00"\ + "\u661f\u671f\u4e8c"\ + "\u661f\u671f\u4e09"\ + "\u661f\u671f\u56db"\ + "\u661f\u671f\u4e94"\ + "\u661f\u671f\u516d"] + ::msgcat::mcset zh MONTHS_ABBREV [list \ + "\u4e00\u6708"\ + "\u4e8c\u6708"\ + "\u4e09\u6708"\ + "\u56db\u6708"\ + "\u4e94\u6708"\ + "\u516d\u6708"\ + "\u4e03\u6708"\ + "\u516b\u6708"\ + "\u4e5d\u6708"\ + "\u5341\u6708"\ + "\u5341\u4e00\u6708"\ + "\u5341\u4e8c\u6708"\ + ""] + ::msgcat::mcset zh MONTHS_FULL [list \ + "\u4e00\u6708"\ + "\u4e8c\u6708"\ + "\u4e09\u6708"\ + "\u56db\u6708"\ + "\u4e94\u6708"\ + "\u516d\u6708"\ + "\u4e03\u6708"\ + "\u516b\u6708"\ + "\u4e5d\u6708"\ + "\u5341\u6708"\ + "\u5341\u4e00\u6708"\ + "\u5341\u4e8c\u6708"\ + ""] + ::msgcat::mcset zh BCE "\u516c\u5143\u524d" + ::msgcat::mcset zh CE "\u516c\u5143" + ::msgcat::mcset zh AM "\u4e0a\u5348" + ::msgcat::mcset zh PM "\u4e0b\u5348" + ::msgcat::mcset zh LOCALE_NUMERALS "\u3007 \u4e00 \u4e8c \u4e09 \u56db \u4e94 \u516d \u4e03 \u516b \u4e5d \u5341 \u5341\u4e00 \u5341\u4e8c \u5341\u4e09 \u5341\u56db \u5341\u4e94 \u5341\u516d \u5341\u4e03 \u5341\u516b \u5341\u4e5d \u4e8c\u5341 \u5eff\u4e00 \u5eff\u4e8c \u5eff\u4e09 \u5eff\u56db \u5eff\u4e94 \u5eff\u516d \u5eff\u4e03 \u5eff\u516b \u5eff\u4e5d \u4e09\u5341 \u5345\u4e00 \u5345\u4e8c \u5345\u4e09 \u5345\u56db \u5345\u4e94 \u5345\u516d \u5345\u4e03 \u5345\u516b \u5345\u4e5d \u56db\u5341 \u56db\u5341\u4e00 \u56db\u5341\u4e8c \u56db\u5341\u4e09 \u56db\u5341\u56db \u56db\u5341\u4e94 \u56db\u5341\u516d \u56db\u5341\u4e03 \u56db\u5341\u516b \u56db\u5341\u4e5d \u4e94\u5341 \u4e94\u5341\u4e00 \u4e94\u5341\u4e8c \u4e94\u5341\u4e09 \u4e94\u5341\u56db \u4e94\u5341\u4e94 \u4e94\u5341\u516d \u4e94\u5341\u4e03 \u4e94\u5341\u516b \u4e94\u5341\u4e5d \u516d\u5341 \u516d\u5341\u4e00 \u516d\u5341\u4e8c \u516d\u5341\u4e09 \u516d\u5341\u56db \u516d\u5341\u4e94 \u516d\u5341\u516d \u516d\u5341\u4e03 \u516d\u5341\u516b \u516d\u5341\u4e5d \u4e03\u5341 \u4e03\u5341\u4e00 \u4e03\u5341\u4e8c \u4e03\u5341\u4e09 \u4e03\u5341\u56db \u4e03\u5341\u4e94 \u4e03\u5341\u516d \u4e03\u5341\u4e03 \u4e03\u5341\u516b \u4e03\u5341\u4e5d \u516b\u5341 \u516b\u5341\u4e00 \u516b\u5341\u4e8c \u516b\u5341\u4e09 \u516b\u5341\u56db \u516b\u5341\u4e94 \u516b\u5341\u516d \u516b\u5341\u4e03 \u516b\u5341\u516b \u516b\u5341\u4e5d \u4e5d\u5341 \u4e5d\u5341\u4e00 \u4e5d\u5341\u4e8c \u4e5d\u5341\u4e09 \u4e5d\u5341\u56db \u4e5d\u5341\u4e94 \u4e5d\u5341\u516d \u4e5d\u5341\u4e03 \u4e5d\u5341\u516b \u4e5d\u5341\u4e5d" + ::msgcat::mcset zh LOCALE_DATE_FORMAT "\u516c\u5143%Y\u5e74%B%Od\u65e5" + ::msgcat::mcset zh LOCALE_TIME_FORMAT "%OH\u65f6%OM\u5206%OS\u79d2" + ::msgcat::mcset zh LOCALE_DATE_TIME_FORMAT "%A %Y\u5e74%B%Od\u65e5%OH\u65f6%OM\u5206%OS\u79d2 %z" +} diff --git a/env/tcl/tcl8.6/msgs/zh_cn.msg b/env/tcl/tcl8.6/msgs/zh_cn.msg new file mode 100644 index 0000000..d62ce77 --- /dev/null +++ b/env/tcl/tcl8.6/msgs/zh_cn.msg @@ -0,0 +1,7 @@ +# created by tools/loadICU.tcl -- do not edit +namespace eval ::tcl::clock { + ::msgcat::mcset zh_CN DATE_FORMAT "%Y-%m-%e" + ::msgcat::mcset zh_CN TIME_FORMAT "%k:%M:%S" + ::msgcat::mcset zh_CN TIME_FORMAT_12 "%P%I\u65f6%M\u5206%S\u79d2" + ::msgcat::mcset zh_CN DATE_TIME_FORMAT "%Y-%m-%e %k:%M:%S %z" +} diff --git a/env/tcl/tcl8.6/msgs/zh_hk.msg b/env/tcl/tcl8.6/msgs/zh_hk.msg new file mode 100644 index 0000000..badb1dd --- /dev/null +++ b/env/tcl/tcl8.6/msgs/zh_hk.msg @@ -0,0 +1,28 @@ +# created by tools/loadICU.tcl -- do not edit +namespace eval ::tcl::clock { + ::msgcat::mcset zh_HK DAYS_OF_WEEK_ABBREV [list \ + "\u65e5"\ + "\u4e00"\ + "\u4e8c"\ + "\u4e09"\ + "\u56db"\ + "\u4e94"\ + "\u516d"] + ::msgcat::mcset zh_HK MONTHS_ABBREV [list \ + "1\u6708"\ + "2\u6708"\ + "3\u6708"\ + "4\u6708"\ + "5\u6708"\ + "6\u6708"\ + "7\u6708"\ + "8\u6708"\ + "9\u6708"\ + "10\u6708"\ + "11\u6708"\ + "12\u6708"\ + ""] + ::msgcat::mcset zh_HK DATE_FORMAT "%Y\u5e74%m\u6708%e\u65e5" + ::msgcat::mcset zh_HK TIME_FORMAT_12 "%P%I:%M:%S" + ::msgcat::mcset zh_HK DATE_TIME_FORMAT "%Y\u5e74%m\u6708%e\u65e5 %P%I:%M:%S %z" +} diff --git a/env/tcl/tcl8.6/msgs/zh_sg.msg b/env/tcl/tcl8.6/msgs/zh_sg.msg new file mode 100644 index 0000000..a2f3e39 --- /dev/null +++ b/env/tcl/tcl8.6/msgs/zh_sg.msg @@ -0,0 +1,8 @@ +# created by tools/loadICU.tcl -- do not edit +namespace eval ::tcl::clock { + ::msgcat::mcset zh_SG AM "\u4e0a\u5348" + ::msgcat::mcset zh_SG PM "\u4e2d\u5348" + ::msgcat::mcset zh_SG DATE_FORMAT "%d %B %Y" + ::msgcat::mcset zh_SG TIME_FORMAT_12 "%P %I:%M:%S" + ::msgcat::mcset zh_SG DATE_TIME_FORMAT "%d %B %Y %P %I:%M:%S %z" +} diff --git a/env/tcl/tcl8.6/msgs/zh_tw.msg b/env/tcl/tcl8.6/msgs/zh_tw.msg new file mode 100644 index 0000000..e0796b1 --- /dev/null +++ b/env/tcl/tcl8.6/msgs/zh_tw.msg @@ -0,0 +1,8 @@ +# created by tools/loadICU.tcl -- do not edit +namespace eval ::tcl::clock { + ::msgcat::mcset zh_TW BCE "\u6c11\u570b\u524d" + ::msgcat::mcset zh_TW CE "\u6c11\u570b" + ::msgcat::mcset zh_TW DATE_FORMAT "%Y/%m/%e" + ::msgcat::mcset zh_TW TIME_FORMAT_12 "%P %I:%M:%S" + ::msgcat::mcset zh_TW DATE_TIME_FORMAT "%Y/%m/%e %P %I:%M:%S %z" +} diff --git a/env/tcl/tcl8.6/opt0.4/optparse.tcl b/env/tcl/tcl8.6/opt0.4/optparse.tcl new file mode 100644 index 0000000..869a2b6 --- /dev/null +++ b/env/tcl/tcl8.6/opt0.4/optparse.tcl @@ -0,0 +1,1072 @@ +# optparse.tcl -- +# +# (private) Option parsing package +# Primarily used internally by the safe:: code. +# +# WARNING: This code will go away in a future release +# of Tcl. It is NOT supported and you should not rely +# on it. If your code does rely on this package you +# may directly incorporate this code into your application. + +package require Tcl 8.2 +# When this version number changes, update the pkgIndex.tcl file +# and the install directory in the Makefiles. +package provide opt 0.4.6 + +namespace eval ::tcl { + + # Exported APIs + namespace export OptKeyRegister OptKeyDelete OptKeyError OptKeyParse \ + OptProc OptProcArgGiven OptParse \ + Lempty Lget \ + Lassign Lvarpop Lvarpop1 Lvarset Lvarincr \ + SetMax SetMin + + +################# Example of use / 'user documentation' ################### + + proc OptCreateTestProc {} { + + # Defines ::tcl::OptParseTest as a test proc with parsed arguments + # (can't be defined before the code below is loaded (before "OptProc")) + + # Every OptProc give usage information on "procname -help". + # Try "tcl::OptParseTest -help" and "tcl::OptParseTest -a" and + # then other arguments. + # + # example of 'valid' call: + # ::tcl::OptParseTest save -4 -pr 23 -libsok SybTcl\ + # -nostatics false ch1 + OptProc OptParseTest { + {subcommand -choice {save print} "sub command"} + {arg1 3 "some number"} + {-aflag} + {-intflag 7} + {-weirdflag "help string"} + {-noStatics "Not ok to load static packages"} + {-nestedloading1 true "OK to load into nested slaves"} + {-nestedloading2 -boolean true "OK to load into nested slaves"} + {-libsOK -choice {Tk SybTcl} + "List of packages that can be loaded"} + {-precision -int 12 "Number of digits of precision"} + {-intval 7 "An integer"} + {-scale -float 1.0 "Scale factor"} + {-zoom 1.0 "Zoom factor"} + {-arbitrary foobar "Arbitrary string"} + {-random -string 12 "Random string"} + {-listval -list {} "List value"} + {-blahflag -blah abc "Funny type"} + {arg2 -boolean "a boolean"} + {arg3 -choice "ch1 ch2"} + {?optarg? -list {} "optional argument"} + } { + foreach v [info locals] { + puts stderr [format "%14s : %s" $v [set $v]] + } + } + } + +################### No User serviceable part below ! ############### + + # Array storing the parsed descriptions + variable OptDesc + array set OptDesc {} + # Next potentially free key id (numeric) + variable OptDescN 0 + +# Inside algorithm/mechanism description: +# (not for the faint hearted ;-) +# +# The argument description is parsed into a "program tree" +# It is called a "program" because it is the program used by +# the state machine interpreter that use that program to +# actually parse the arguments at run time. +# +# The general structure of a "program" is +# notation (pseudo bnf like) +# name :== definition defines "name" as being "definition" +# { x y z } means list of x, y, and z +# x* means x repeated 0 or more time +# x+ means "x x*" +# x? means optionally x +# x | y means x or y +# "cccc" means the literal string +# +# program :== { programCounter programStep* } +# +# programStep :== program | singleStep +# +# programCounter :== {"P" integer+ } +# +# singleStep :== { instruction parameters* } +# +# instruction :== single element list +# +# (the difference between singleStep and program is that \ +# llength [lindex $program 0] >= 2 +# while +# llength [lindex $singleStep 0] == 1 +# ) +# +# And for this application: +# +# singleStep :== { instruction varname {hasBeenSet currentValue} type +# typeArgs help } +# instruction :== "flags" | "value" +# type :== knowType | anyword +# knowType :== "string" | "int" | "boolean" | "boolflag" | "float" +# | "choice" +# +# for type "choice" typeArgs is a list of possible choices, the first one +# is the default value. for all other types the typeArgs is the default value +# +# a "boolflag" is the type for a flag whose presence or absence, without +# additional arguments means respectively true or false (default flag type). +# +# programCounter is the index in the list of the currently processed +# programStep (thus starting at 1 (0 is {"P" prgCounterValue}). +# If it is a list it points toward each currently selected programStep. +# (like for "flags", as they are optional, form a set and programStep). + +# Performance/Implementation issues +# --------------------------------- +# We use tcl lists instead of arrays because with tcl8.0 +# they should start to be much faster. +# But this code use a lot of helper procs (like Lvarset) +# which are quite slow and would be helpfully optimized +# for instance by being written in C. Also our struture +# is complex and there is maybe some places where the +# string rep might be calculated at great exense. to be checked. + +# +# Parse a given description and saves it here under the given key +# generate a unused keyid if not given +# +proc ::tcl::OptKeyRegister {desc {key ""}} { + variable OptDesc + variable OptDescN + if {[string equal $key ""]} { + # in case a key given to us as a parameter was a number + while {[info exists OptDesc($OptDescN)]} {incr OptDescN} + set key $OptDescN + incr OptDescN + } + # program counter + set program [list [list "P" 1]] + + # are we processing flags (which makes a single program step) + set inflags 0 + + set state {} + + # flag used to detect that we just have a single (flags set) subprogram. + set empty 1 + + foreach item $desc { + if {$state == "args"} { + # more items after 'args'... + return -code error "'args' special argument must be the last one" + } + set res [OptNormalizeOne $item] + set state [lindex $res 0] + if {$inflags} { + if {$state == "flags"} { + # add to 'subprogram' + lappend flagsprg $res + } else { + # put in the flags + # structure for flag programs items is a list of + # {subprgcounter {prg flag 1} {prg flag 2} {...}} + lappend program $flagsprg + # put the other regular stuff + lappend program $res + set inflags 0 + set empty 0 + } + } else { + if {$state == "flags"} { + set inflags 1 + # sub program counter + first sub program + set flagsprg [list [list "P" 1] $res] + } else { + lappend program $res + set empty 0 + } + } + } + if {$inflags} { + if {$empty} { + # We just have the subprogram, optimize and remove + # unneeded level: + set program $flagsprg + } else { + lappend program $flagsprg + } + } + + set OptDesc($key) $program + + return $key +} + +# +# Free the storage for that given key +# +proc ::tcl::OptKeyDelete {key} { + variable OptDesc + unset OptDesc($key) +} + + # Get the parsed description stored under the given key. + proc OptKeyGetDesc {descKey} { + variable OptDesc + if {![info exists OptDesc($descKey)]} { + return -code error "Unknown option description key \"$descKey\"" + } + set OptDesc($descKey) + } + +# Parse entry point for ppl who don't want to register with a key, +# for instance because the description changes dynamically. +# (otherwise one should really use OptKeyRegister once + OptKeyParse +# as it is way faster or simply OptProc which does it all) +# Assign a temporary key, call OptKeyParse and then free the storage +proc ::tcl::OptParse {desc arglist} { + set tempkey [OptKeyRegister $desc] + set ret [catch {uplevel 1 [list ::tcl::OptKeyParse $tempkey $arglist]} res] + OptKeyDelete $tempkey + return -code $ret $res +} + +# Helper function, replacement for proc that both +# register the description under a key which is the name of the proc +# (and thus unique to that code) +# and add a first line to the code to call the OptKeyParse proc +# Stores the list of variables that have been actually given by the user +# (the other will be sets to their default value) +# into local variable named "Args". +proc ::tcl::OptProc {name desc body} { + set namespace [uplevel 1 [list ::namespace current]] + if {[string match "::*" $name] || [string equal $namespace "::"]} { + # absolute name or global namespace, name is the key + set key $name + } else { + # we are relative to some non top level namespace: + set key "${namespace}::${name}" + } + OptKeyRegister $desc $key + uplevel 1 [list ::proc $name args "set Args \[::tcl::OptKeyParse $key \$args\]\n$body"] + return $key +} +# Check that a argument has been given +# assumes that "OptProc" has been used as it will check in "Args" list +proc ::tcl::OptProcArgGiven {argname} { + upvar Args alist + expr {[lsearch $alist $argname] >=0} +} + + ####### + # Programs/Descriptions manipulation + + # Return the instruction word/list of a given step/(sub)program + proc OptInstr {lst} { + lindex $lst 0 + } + # Is a (sub) program or a plain instruction ? + proc OptIsPrg {lst} { + expr {[llength [OptInstr $lst]]>=2} + } + # Is this instruction a program counter or a real instr + proc OptIsCounter {item} { + expr {[lindex $item 0]=="P"} + } + # Current program counter (2nd word of first word) + proc OptGetPrgCounter {lst} { + Lget $lst {0 1} + } + # Current program counter (2nd word of first word) + proc OptSetPrgCounter {lstName newValue} { + upvar $lstName lst + set lst [lreplace $lst 0 0 [concat "P" $newValue]] + } + # returns a list of currently selected items. + proc OptSelection {lst} { + set res {} + foreach idx [lrange [lindex $lst 0] 1 end] { + lappend res [Lget $lst $idx] + } + return $res + } + + # Advance to next description + proc OptNextDesc {descName} { + uplevel 1 [list Lvarincr $descName {0 1}] + } + + # Get the current description, eventually descend + proc OptCurDesc {descriptions} { + lindex $descriptions [OptGetPrgCounter $descriptions] + } + # get the current description, eventually descend + # through sub programs as needed. + proc OptCurDescFinal {descriptions} { + set item [OptCurDesc $descriptions] + # Descend untill we get the actual item and not a sub program + while {[OptIsPrg $item]} { + set item [OptCurDesc $item] + } + return $item + } + # Current final instruction adress + proc OptCurAddr {descriptions {start {}}} { + set adress [OptGetPrgCounter $descriptions] + lappend start $adress + set item [lindex $descriptions $adress] + if {[OptIsPrg $item]} { + return [OptCurAddr $item $start] + } else { + return $start + } + } + # Set the value field of the current instruction + proc OptCurSetValue {descriptionsName value} { + upvar $descriptionsName descriptions + # get the current item full adress + set adress [OptCurAddr $descriptions] + # use the 3th field of the item (see OptValue / OptNewInst) + lappend adress 2 + Lvarset descriptions $adress [list 1 $value] + # ^hasBeenSet flag + } + + # empty state means done/paste the end of the program + proc OptState {item} { + lindex $item 0 + } + + # current state + proc OptCurState {descriptions} { + OptState [OptCurDesc $descriptions] + } + + ####### + # Arguments manipulation + + # Returns the argument that has to be processed now + proc OptCurrentArg {lst} { + lindex $lst 0 + } + # Advance to next argument + proc OptNextArg {argsName} { + uplevel 1 [list Lvarpop1 $argsName] + } + ####### + + + + + + # Loop over all descriptions, calling OptDoOne which will + # eventually eat all the arguments. + proc OptDoAll {descriptionsName argumentsName} { + upvar $descriptionsName descriptions + upvar $argumentsName arguments +# puts "entered DoAll" + # Nb: the places where "state" can be set are tricky to figure + # because DoOne sets the state to flagsValue and return -continue + # when needed... + set state [OptCurState $descriptions] + # We'll exit the loop in "OptDoOne" or when state is empty. + while 1 { + set curitem [OptCurDesc $descriptions] + # Do subprograms if needed, call ourselves on the sub branch + while {[OptIsPrg $curitem]} { + OptDoAll curitem arguments +# puts "done DoAll sub" + # Insert back the results in current tree + Lvarset1nc descriptions [OptGetPrgCounter $descriptions]\ + $curitem + OptNextDesc descriptions + set curitem [OptCurDesc $descriptions] + set state [OptCurState $descriptions] + } +# puts "state = \"$state\" - arguments=($arguments)" + if {[Lempty $state]} { + # Nothing left to do, we are done in this branch: + break + } + # The following statement can make us terminate/continue + # as it use return -code {break, continue, return and error} + # codes + OptDoOne descriptions state arguments + # If we are here, no special return code where issued, + # we'll step to next instruction : +# puts "new state = \"$state\"" + OptNextDesc descriptions + set state [OptCurState $descriptions] + } + } + + # Process one step for the state machine, + # eventually consuming the current argument. + proc OptDoOne {descriptionsName stateName argumentsName} { + upvar $argumentsName arguments + upvar $descriptionsName descriptions + upvar $stateName state + + # the special state/instruction "args" eats all + # the remaining args (if any) + if {($state == "args")} { + if {![Lempty $arguments]} { + # If there is no additional arguments, leave the default value + # in. + OptCurSetValue descriptions $arguments + set arguments {} + } +# puts "breaking out ('args' state: consuming every reminding args)" + return -code break + } + + if {[Lempty $arguments]} { + if {$state == "flags"} { + # no argument and no flags : we're done +# puts "returning to previous (sub)prg (no more args)" + return -code return + } elseif {$state == "optValue"} { + set state next; # not used, for debug only + # go to next state + return + } else { + return -code error [OptMissingValue $descriptions] + } + } else { + set arg [OptCurrentArg $arguments] + } + + switch $state { + flags { + # A non-dash argument terminates the options, as does -- + + # Still a flag ? + if {![OptIsFlag $arg]} { + # don't consume the argument, return to previous prg + return -code return + } + # consume the flag + OptNextArg arguments + if {[string equal "--" $arg]} { + # return from 'flags' state + return -code return + } + + set hits [OptHits descriptions $arg] + if {$hits > 1} { + return -code error [OptAmbigous $descriptions $arg] + } elseif {$hits == 0} { + return -code error [OptFlagUsage $descriptions $arg] + } + set item [OptCurDesc $descriptions] + if {[OptNeedValue $item]} { + # we need a value, next state is + set state flagValue + } else { + OptCurSetValue descriptions 1 + } + # continue + return -code continue + } + flagValue - + value { + set item [OptCurDesc $descriptions] + # Test the values against their required type + if {[catch {OptCheckType $arg\ + [OptType $item] [OptTypeArgs $item]} val]} { + return -code error [OptBadValue $item $arg $val] + } + # consume the value + OptNextArg arguments + # set the value + OptCurSetValue descriptions $val + # go to next state + if {$state == "flagValue"} { + set state flags + return -code continue + } else { + set state next; # not used, for debug only + return ; # will go on next step + } + } + optValue { + set item [OptCurDesc $descriptions] + # Test the values against their required type + if {![catch {OptCheckType $arg\ + [OptType $item] [OptTypeArgs $item]} val]} { + # right type, so : + # consume the value + OptNextArg arguments + # set the value + OptCurSetValue descriptions $val + } + # go to next state + set state next; # not used, for debug only + return ; # will go on next step + } + } + # If we reach this point: an unknown + # state as been entered ! + return -code error "Bug! unknown state in DoOne \"$state\"\ + (prg counter [OptGetPrgCounter $descriptions]:\ + [OptCurDesc $descriptions])" + } + +# Parse the options given the key to previously registered description +# and arguments list +proc ::tcl::OptKeyParse {descKey arglist} { + + set desc [OptKeyGetDesc $descKey] + + # make sure -help always give usage + if {[string equal -nocase "-help" $arglist]} { + return -code error [OptError "Usage information:" $desc 1] + } + + OptDoAll desc arglist + + if {![Lempty $arglist]} { + return -code error [OptTooManyArgs $desc $arglist] + } + + # Analyse the result + # Walk through the tree: + OptTreeVars $desc "#[expr {[info level]-1}]" +} + + # determine string length for nice tabulated output + proc OptTreeVars {desc level {vnamesLst {}}} { + foreach item $desc { + if {[OptIsCounter $item]} continue + if {[OptIsPrg $item]} { + set vnamesLst [OptTreeVars $item $level $vnamesLst] + } else { + set vname [OptVarName $item] + upvar $level $vname var + if {[OptHasBeenSet $item]} { +# puts "adding $vname" + # lets use the input name for the returned list + # it is more usefull, for instance you can check that + # no flags at all was given with expr + # {![string match "*-*" $Args]} + lappend vnamesLst [OptName $item] + set var [OptValue $item] + } else { + set var [OptDefaultValue $item] + } + } + } + return $vnamesLst + } + + +# Check the type of a value +# and emit an error if arg is not of the correct type +# otherwise returns the canonical value of that arg (ie 0/1 for booleans) +proc ::tcl::OptCheckType {arg type {typeArgs ""}} { +# puts "checking '$arg' against '$type' ($typeArgs)" + + # only types "any", "choice", and numbers can have leading "-" + + switch -exact -- $type { + int { + if {![string is integer -strict $arg]} { + error "not an integer" + } + return $arg + } + float { + return [expr {double($arg)}] + } + script - + list { + # if llength fail : malformed list + if {[llength $arg]==0 && [OptIsFlag $arg]} { + error "no values with leading -" + } + return $arg + } + boolean { + if {![string is boolean -strict $arg]} { + error "non canonic boolean" + } + # convert true/false because expr/if is broken with "!,... + return [expr {$arg ? 1 : 0}] + } + choice { + if {[lsearch -exact $typeArgs $arg] < 0} { + error "invalid choice" + } + return $arg + } + any { + return $arg + } + string - + default { + if {[OptIsFlag $arg]} { + error "no values with leading -" + } + return $arg + } + } + return neverReached +} + + # internal utilities + + # returns the number of flags matching the given arg + # sets the (local) prg counter to the list of matches + proc OptHits {descName arg} { + upvar $descName desc + set hits 0 + set hitems {} + set i 1 + + set larg [string tolower $arg] + set len [string length $larg] + set last [expr {$len-1}] + + foreach item [lrange $desc 1 end] { + set flag [OptName $item] + # lets try to match case insensitively + # (string length ought to be cheap) + set lflag [string tolower $flag] + if {$len == [string length $lflag]} { + if {[string equal $larg $lflag]} { + # Exact match case + OptSetPrgCounter desc $i + return 1 + } + } elseif {[string equal $larg [string range $lflag 0 $last]]} { + lappend hitems $i + incr hits + } + incr i + } + if {$hits} { + OptSetPrgCounter desc $hitems + } + return $hits + } + + # Extract fields from the list structure: + + proc OptName {item} { + lindex $item 1 + } + proc OptHasBeenSet {item} { + Lget $item {2 0} + } + proc OptValue {item} { + Lget $item {2 1} + } + + proc OptIsFlag {name} { + string match "-*" $name + } + proc OptIsOpt {name} { + string match {\?*} $name + } + proc OptVarName {item} { + set name [OptName $item] + if {[OptIsFlag $name]} { + return [string range $name 1 end] + } elseif {[OptIsOpt $name]} { + return [string trim $name "?"] + } else { + return $name + } + } + proc OptType {item} { + lindex $item 3 + } + proc OptTypeArgs {item} { + lindex $item 4 + } + proc OptHelp {item} { + lindex $item 5 + } + proc OptNeedValue {item} { + expr {![string equal [OptType $item] boolflag]} + } + proc OptDefaultValue {item} { + set val [OptTypeArgs $item] + switch -exact -- [OptType $item] { + choice {return [lindex $val 0]} + boolean - + boolflag { + # convert back false/true to 0/1 because expr !$bool + # is broken.. + if {$val} { + return 1 + } else { + return 0 + } + } + } + return $val + } + + # Description format error helper + proc OptOptUsage {item {what ""}} { + return -code error "invalid description format$what: $item\n\ + should be a list of {varname|-flagname ?-type? ?defaultvalue?\ + ?helpstring?}" + } + + + # Generate a canonical form single instruction + proc OptNewInst {state varname type typeArgs help} { + list $state $varname [list 0 {}] $type $typeArgs $help + # ^ ^ + # | | + # hasBeenSet=+ +=currentValue + } + + # Translate one item to canonical form + proc OptNormalizeOne {item} { + set lg [Lassign $item varname arg1 arg2 arg3] +# puts "called optnormalizeone '$item' v=($varname), lg=$lg" + set isflag [OptIsFlag $varname] + set isopt [OptIsOpt $varname] + if {$isflag} { + set state "flags" + } elseif {$isopt} { + set state "optValue" + } elseif {![string equal $varname "args"]} { + set state "value" + } else { + set state "args" + } + + # apply 'smart' 'fuzzy' logic to try to make + # description writer's life easy, and our's difficult : + # let's guess the missing arguments :-) + + switch $lg { + 1 { + if {$isflag} { + return [OptNewInst $state $varname boolflag false ""] + } else { + return [OptNewInst $state $varname any "" ""] + } + } + 2 { + # varname default + # varname help + set type [OptGuessType $arg1] + if {[string equal $type "string"]} { + if {$isflag} { + set type boolflag + set def false + } else { + set type any + set def "" + } + set help $arg1 + } else { + set help "" + set def $arg1 + } + return [OptNewInst $state $varname $type $def $help] + } + 3 { + # varname type value + # varname value comment + + if {[regexp {^-(.+)$} $arg1 x type]} { + # flags/optValue as they are optional, need a "value", + # on the contrary, for a variable (non optional), + # default value is pointless, 'cept for choices : + if {$isflag || $isopt || ($type == "choice")} { + return [OptNewInst $state $varname $type $arg2 ""] + } else { + return [OptNewInst $state $varname $type "" $arg2] + } + } else { + return [OptNewInst $state $varname\ + [OptGuessType $arg1] $arg1 $arg2] + } + } + 4 { + if {[regexp {^-(.+)$} $arg1 x type]} { + return [OptNewInst $state $varname $type $arg2 $arg3] + } else { + return -code error [OptOptUsage $item] + } + } + default { + return -code error [OptOptUsage $item] + } + } + } + + # Auto magic lazy type determination + proc OptGuessType {arg} { + if { $arg == "true" || $arg == "false" } { + return boolean + } + if {[string is integer -strict $arg]} { + return int + } + if {[string is double -strict $arg]} { + return float + } + return string + } + + # Error messages front ends + + proc OptAmbigous {desc arg} { + OptError "ambigous option \"$arg\", choose from:" [OptSelection $desc] + } + proc OptFlagUsage {desc arg} { + OptError "bad flag \"$arg\", must be one of" $desc + } + proc OptTooManyArgs {desc arguments} { + OptError "too many arguments (unexpected argument(s): $arguments),\ + usage:"\ + $desc 1 + } + proc OptParamType {item} { + if {[OptIsFlag $item]} { + return "flag" + } else { + return "parameter" + } + } + proc OptBadValue {item arg {err {}}} { +# puts "bad val err = \"$err\"" + OptError "bad value \"$arg\" for [OptParamType $item]"\ + [list $item] + } + proc OptMissingValue {descriptions} { +# set item [OptCurDescFinal $descriptions] + set item [OptCurDesc $descriptions] + OptError "no value given for [OptParamType $item] \"[OptName $item]\"\ + (use -help for full usage) :"\ + [list $item] + } + +proc ::tcl::OptKeyError {prefix descKey {header 0}} { + OptError $prefix [OptKeyGetDesc $descKey] $header +} + + # determine string length for nice tabulated output + proc OptLengths {desc nlName tlName dlName} { + upvar $nlName nl + upvar $tlName tl + upvar $dlName dl + foreach item $desc { + if {[OptIsCounter $item]} continue + if {[OptIsPrg $item]} { + OptLengths $item nl tl dl + } else { + SetMax nl [string length [OptName $item]] + SetMax tl [string length [OptType $item]] + set dv [OptTypeArgs $item] + if {[OptState $item] != "header"} { + set dv "($dv)" + } + set l [string length $dv] + # limit the space allocated to potentially big "choices" + if {([OptType $item] != "choice") || ($l<=12)} { + SetMax dl $l + } else { + if {![info exists dl]} { + set dl 0 + } + } + } + } + } + # output the tree + proc OptTree {desc nl tl dl} { + set res "" + foreach item $desc { + if {[OptIsCounter $item]} continue + if {[OptIsPrg $item]} { + append res [OptTree $item $nl $tl $dl] + } else { + set dv [OptTypeArgs $item] + if {[OptState $item] != "header"} { + set dv "($dv)" + } + append res [string trimright [format "\n %-*s %-*s %-*s %s" \ + $nl [OptName $item] $tl [OptType $item] \ + $dl $dv [OptHelp $item]]] + } + } + return $res + } + +# Give nice usage string +proc ::tcl::OptError {prefix desc {header 0}} { + # determine length + if {$header} { + # add faked instruction + set h [list [OptNewInst header Var/FlagName Type Value Help]] + lappend h [OptNewInst header ------------ ---- ----- ----] + lappend h [OptNewInst header {(-help} "" "" {gives this help)}] + set desc [concat $h $desc] + } + OptLengths $desc nl tl dl + # actually output + return "$prefix[OptTree $desc $nl $tl $dl]" +} + + +################ General Utility functions ####################### + +# +# List utility functions +# Naming convention: +# "Lvarxxx" take the list VARiable name as argument +# "Lxxxx" take the list value as argument +# (which is not costly with Tcl8 objects system +# as it's still a reference and not a copy of the values) +# + +# Is that list empty ? +proc ::tcl::Lempty {list} { + expr {[llength $list]==0} +} + +# Gets the value of one leaf of a lists tree +proc ::tcl::Lget {list indexLst} { + if {[llength $indexLst] <= 1} { + return [lindex $list $indexLst] + } + Lget [lindex $list [lindex $indexLst 0]] [lrange $indexLst 1 end] +} +# Sets the value of one leaf of a lists tree +# (we use the version that does not create the elements because +# it would be even slower... needs to be written in C !) +# (nb: there is a non trivial recursive problem with indexes 0, +# which appear because there is no difference between a list +# of 1 element and 1 element alone : [list "a"] == "a" while +# it should be {a} and [listp a] should be 0 while [listp {a b}] would be 1 +# and [listp "a b"] maybe 0. listp does not exist either...) +proc ::tcl::Lvarset {listName indexLst newValue} { + upvar $listName list + if {[llength $indexLst] <= 1} { + Lvarset1nc list $indexLst $newValue + } else { + set idx [lindex $indexLst 0] + set targetList [lindex $list $idx] + # reduce refcount on targetList (not really usefull now, + # could be with optimizing compiler) +# Lvarset1 list $idx {} + # recursively replace in targetList + Lvarset targetList [lrange $indexLst 1 end] $newValue + # put updated sub list back in the tree + Lvarset1nc list $idx $targetList + } +} +# Set one cell to a value, eventually create all the needed elements +# (on level-1 of lists) +variable emptyList {} +proc ::tcl::Lvarset1 {listName index newValue} { + upvar $listName list + if {$index < 0} {return -code error "invalid negative index"} + set lg [llength $list] + if {$index >= $lg} { + variable emptyList + for {set i $lg} {$i<$index} {incr i} { + lappend list $emptyList + } + lappend list $newValue + } else { + set list [lreplace $list $index $index $newValue] + } +} +# same as Lvarset1 but no bound checking / creation +proc ::tcl::Lvarset1nc {listName index newValue} { + upvar $listName list + set list [lreplace $list $index $index $newValue] +} +# Increments the value of one leaf of a lists tree +# (which must exists) +proc ::tcl::Lvarincr {listName indexLst {howMuch 1}} { + upvar $listName list + if {[llength $indexLst] <= 1} { + Lvarincr1 list $indexLst $howMuch + } else { + set idx [lindex $indexLst 0] + set targetList [lindex $list $idx] + # reduce refcount on targetList + Lvarset1nc list $idx {} + # recursively replace in targetList + Lvarincr targetList [lrange $indexLst 1 end] $howMuch + # put updated sub list back in the tree + Lvarset1nc list $idx $targetList + } +} +# Increments the value of one cell of a list +proc ::tcl::Lvarincr1 {listName index {howMuch 1}} { + upvar $listName list + set newValue [expr {[lindex $list $index]+$howMuch}] + set list [lreplace $list $index $index $newValue] + return $newValue +} +# Removes the first element of a list +# and returns the new list value +proc ::tcl::Lvarpop1 {listName} { + upvar $listName list + set list [lrange $list 1 end] +} +# Same but returns the removed element +# (Like the tclX version) +proc ::tcl::Lvarpop {listName} { + upvar $listName list + set el [lindex $list 0] + set list [lrange $list 1 end] + return $el +} +# Assign list elements to variables and return the length of the list +proc ::tcl::Lassign {list args} { + # faster than direct blown foreach (which does not byte compile) + set i 0 + set lg [llength $list] + foreach vname $args { + if {$i>=$lg} break + uplevel 1 [list ::set $vname [lindex $list $i]] + incr i + } + return $lg +} + +# Misc utilities + +# Set the varname to value if value is greater than varname's current value +# or if varname is undefined +proc ::tcl::SetMax {varname value} { + upvar 1 $varname var + if {![info exists var] || $value > $var} { + set var $value + } +} + +# Set the varname to value if value is smaller than varname's current value +# or if varname is undefined +proc ::tcl::SetMin {varname value} { + upvar 1 $varname var + if {![info exists var] || $value < $var} { + set var $value + } +} + + + # everything loaded fine, lets create the test proc: + # OptCreateTestProc + # Don't need the create temp proc anymore: + # rename OptCreateTestProc {} +} diff --git a/env/tcl/tcl8.6/opt0.4/pkgIndex.tcl b/env/tcl/tcl8.6/opt0.4/pkgIndex.tcl new file mode 100644 index 0000000..107d4c6 --- /dev/null +++ b/env/tcl/tcl8.6/opt0.4/pkgIndex.tcl @@ -0,0 +1,12 @@ +# Tcl package index file, version 1.1 +# This file is generated by the "pkg_mkIndex -direct" command +# and sourced either when an application starts up or +# by a "package unknown" script. It invokes the +# "package ifneeded" command to set up package-related +# information so that packages will be loaded automatically +# in response to "package require" commands. When this +# script is sourced, the variable $dir must contain the +# full path name of this file's directory. + +if {![package vsatisfies [package provide Tcl] 8.2]} {return} +package ifneeded opt 0.4.6 [list source [file join $dir optparse.tcl]] diff --git a/env/tcl/tcl8.6/package.tcl b/env/tcl/tcl8.6/package.tcl new file mode 100644 index 0000000..44e3b28 --- /dev/null +++ b/env/tcl/tcl8.6/package.tcl @@ -0,0 +1,747 @@ +# package.tcl -- +# +# utility procs formerly in init.tcl which can be loaded on demand +# for package management. +# +# Copyright (c) 1991-1993 The Regents of the University of California. +# Copyright (c) 1994-1998 Sun Microsystems, Inc. +# +# See the file "license.terms" for information on usage and redistribution +# of this file, and for a DISCLAIMER OF ALL WARRANTIES. +# + +namespace eval tcl::Pkg {} + +# ::tcl::Pkg::CompareExtension -- +# +# Used internally by pkg_mkIndex to compare the extension of a file to a given +# extension. On Windows, it uses a case-insensitive comparison because the +# file system can be file insensitive. +# +# Arguments: +# fileName name of a file whose extension is compared +# ext (optional) The extension to compare against; you must +# provide the starting dot. +# Defaults to [info sharedlibextension] +# +# Results: +# Returns 1 if the extension matches, 0 otherwise + +proc tcl::Pkg::CompareExtension {fileName {ext {}}} { + global tcl_platform + if {$ext eq ""} {set ext [info sharedlibextension]} + if {$tcl_platform(platform) eq "windows"} { + return [string equal -nocase [file extension $fileName] $ext] + } else { + # Some unices add trailing numbers after the .so, so + # we could have something like '.so.1.2'. + set root $fileName + while {1} { + set currExt [file extension $root] + if {$currExt eq $ext} { + return 1 + } + + # The current extension does not match; if it is not a numeric + # value, quit, as we are only looking to ignore version number + # extensions. Otherwise we might return 1 in this case: + # tcl::Pkg::CompareExtension foo.so.bar .so + # which should not match. + + if {![string is integer -strict [string range $currExt 1 end]]} { + return 0 + } + set root [file rootname $root] + } + } +} + +# pkg_mkIndex -- +# This procedure creates a package index in a given directory. The package +# index consists of a "pkgIndex.tcl" file whose contents are a Tcl script that +# sets up package information with "package require" commands. The commands +# describe all of the packages defined by the files given as arguments. +# +# Arguments: +# -direct (optional) If this flag is present, the generated +# code in pkgMkIndex.tcl will cause the package to be +# loaded when "package require" is executed, rather +# than lazily when the first reference to an exported +# procedure in the package is made. +# -verbose (optional) Verbose output; the name of each file that +# was successfully rocessed is printed out. Additionally, +# if processing of a file failed a message is printed. +# -load pat (optional) Preload any packages whose names match +# the pattern. Used to handle DLLs that depend on +# other packages during their Init procedure. +# dir - Name of the directory in which to create the index. +# args - Any number of additional arguments, each giving +# a glob pattern that matches the names of one or +# more shared libraries or Tcl script files in +# dir. + +proc pkg_mkIndex {args} { + set usage {"pkg_mkIndex ?-direct? ?-lazy? ?-load pattern? ?-verbose? ?--? dir ?pattern ...?"} + + set argCount [llength $args] + if {$argCount < 1} { + return -code error "wrong # args: should be\n$usage" + } + + set more "" + set direct 1 + set doVerbose 0 + set loadPat "" + for {set idx 0} {$idx < $argCount} {incr idx} { + set flag [lindex $args $idx] + switch -glob -- $flag { + -- { + # done with the flags + incr idx + break + } + -verbose { + set doVerbose 1 + } + -lazy { + set direct 0 + append more " -lazy" + } + -direct { + append more " -direct" + } + -load { + incr idx + set loadPat [lindex $args $idx] + append more " -load $loadPat" + } + -* { + return -code error "unknown flag $flag: should be\n$usage" + } + default { + # done with the flags + break + } + } + } + + set dir [lindex $args $idx] + set patternList [lrange $args [expr {$idx + 1}] end] + if {![llength $patternList]} { + set patternList [list "*.tcl" "*[info sharedlibextension]"] + } + + try { + set fileList [glob -directory $dir -tails -types {r f} -- \ + {*}$patternList] + } on error {msg opt} { + return -options $opt $msg + } + foreach file $fileList { + # For each file, figure out what commands and packages it provides. + # To do this, create a child interpreter, load the file into the + # interpreter, and get a list of the new commands and packages that + # are defined. + + if {$file eq "pkgIndex.tcl"} { + continue + } + + set c [interp create] + + # Load into the child any packages currently loaded in the parent + # interpreter that match the -load pattern. + + if {$loadPat ne ""} { + if {$doVerbose} { + tclLog "currently loaded packages: '[info loaded]'" + tclLog "trying to load all packages matching $loadPat" + } + if {![llength [info loaded]]} { + tclLog "warning: no packages are currently loaded, nothing" + tclLog "can possibly match '$loadPat'" + } + } + foreach pkg [info loaded] { + if {![string match -nocase $loadPat [lindex $pkg 1]]} { + continue + } + if {$doVerbose} { + tclLog "package [lindex $pkg 1] matches '$loadPat'" + } + try { + load [lindex $pkg 0] [lindex $pkg 1] $c + } on error err { + if {$doVerbose} { + tclLog "warning: load [lindex $pkg 0]\ + [lindex $pkg 1]\nfailed with: $err" + } + } on ok {} { + if {$doVerbose} { + tclLog "loaded [lindex $pkg 0] [lindex $pkg 1]" + } + } + if {[lindex $pkg 1] eq "Tk"} { + # Withdraw . if Tk was loaded, to avoid showing a window. + $c eval [list wm withdraw .] + } + } + + $c eval { + # Stub out the package command so packages can require other + # packages. + + rename package __package_orig + proc package {what args} { + switch -- $what { + require { + return; # Ignore transitive requires + } + default { + __package_orig $what {*}$args + } + } + } + proc tclPkgUnknown args {} + package unknown tclPkgUnknown + + # Stub out the unknown command so package can call into each other + # during their initialilzation. + + proc unknown {args} {} + + # Stub out the auto_import mechanism + + proc auto_import {args} {} + + # reserve the ::tcl namespace for support procs and temporary + # variables. This might make it awkward to generate a + # pkgIndex.tcl file for the ::tcl namespace. + + namespace eval ::tcl { + variable dir ;# Current directory being processed + variable file ;# Current file being processed + variable direct ;# -direct flag value + variable x ;# Loop variable + variable debug ;# For debugging + variable type ;# "load" or "source", for -direct + variable namespaces ;# Existing namespaces (e.g., ::tcl) + variable packages ;# Existing packages (e.g., Tcl) + variable origCmds ;# Existing commands + variable newCmds ;# Newly created commands + variable newPkgs {} ;# Newly created packages + } + } + + $c eval [list set ::tcl::dir $dir] + $c eval [list set ::tcl::file $file] + $c eval [list set ::tcl::direct $direct] + + # Download needed procedures into the slave because we've just deleted + # the unknown procedure. This doesn't handle procedures with default + # arguments. + + foreach p {::tcl::Pkg::CompareExtension} { + $c eval [list namespace eval [namespace qualifiers $p] {}] + $c eval [list proc $p [info args $p] [info body $p]] + } + + try { + $c eval { + set ::tcl::debug "loading or sourcing" + + # we need to track command defined by each package even in the + # -direct case, because they are needed internally by the + # "partial pkgIndex.tcl" step above. + + proc ::tcl::GetAllNamespaces {{root ::}} { + set list $root + foreach ns [namespace children $root] { + lappend list {*}[::tcl::GetAllNamespaces $ns] + } + return $list + } + + # init the list of existing namespaces, packages, commands + + foreach ::tcl::x [::tcl::GetAllNamespaces] { + set ::tcl::namespaces($::tcl::x) 1 + } + foreach ::tcl::x [package names] { + if {[package provide $::tcl::x] ne ""} { + set ::tcl::packages($::tcl::x) 1 + } + } + set ::tcl::origCmds [info commands] + + # Try to load the file if it has the shared library extension, + # otherwise source it. It's important not to try to load + # files that aren't shared libraries, because on some systems + # (like SunOS) the loader will abort the whole application + # when it gets an error. + + if {[::tcl::Pkg::CompareExtension $::tcl::file [info sharedlibextension]]} { + # The "file join ." command below is necessary. Without + # it, if the file name has no \'s and we're on UNIX, the + # load command will invoke the LD_LIBRARY_PATH search + # mechanism, which could cause the wrong file to be used. + + set ::tcl::debug loading + load [file join $::tcl::dir $::tcl::file] + set ::tcl::type load + } else { + set ::tcl::debug sourcing + source [file join $::tcl::dir $::tcl::file] + set ::tcl::type source + } + + # As a performance optimization, if we are creating direct + # load packages, don't bother figuring out the set of commands + # created by the new packages. We only need that list for + # setting up the autoloading used in the non-direct case. + if {!$::tcl::direct} { + # See what new namespaces appeared, and import commands + # from them. Only exported commands go into the index. + + foreach ::tcl::x [::tcl::GetAllNamespaces] { + if {![info exists ::tcl::namespaces($::tcl::x)]} { + namespace import -force ${::tcl::x}::* + } + + # Figure out what commands appeared + + foreach ::tcl::x [info commands] { + set ::tcl::newCmds($::tcl::x) 1 + } + foreach ::tcl::x $::tcl::origCmds { + unset -nocomplain ::tcl::newCmds($::tcl::x) + } + foreach ::tcl::x [array names ::tcl::newCmds] { + # determine which namespace a command comes from + + set ::tcl::abs [namespace origin $::tcl::x] + + # special case so that global names have no + # leading ::, this is required by the unknown + # command + + set ::tcl::abs \ + [lindex [auto_qualify $::tcl::abs ::] 0] + + if {$::tcl::x ne $::tcl::abs} { + # Name changed during qualification + + set ::tcl::newCmds($::tcl::abs) 1 + unset ::tcl::newCmds($::tcl::x) + } + } + } + } + + # Look through the packages that appeared, and if there is a + # version provided, then record it + + foreach ::tcl::x [package names] { + if {[package provide $::tcl::x] ne "" + && ![info exists ::tcl::packages($::tcl::x)]} { + lappend ::tcl::newPkgs \ + [list $::tcl::x [package provide $::tcl::x]] + } + } + } + } on error msg { + set what [$c eval set ::tcl::debug] + if {$doVerbose} { + tclLog "warning: error while $what $file: $msg" + } + } on ok {} { + set what [$c eval set ::tcl::debug] + if {$doVerbose} { + tclLog "successful $what of $file" + } + set type [$c eval set ::tcl::type] + set cmds [lsort [$c eval array names ::tcl::newCmds]] + set pkgs [$c eval set ::tcl::newPkgs] + if {$doVerbose} { + if {!$direct} { + tclLog "commands provided were $cmds" + } + tclLog "packages provided were $pkgs" + } + if {[llength $pkgs] > 1} { + tclLog "warning: \"$file\" provides more than one package ($pkgs)" + } + foreach pkg $pkgs { + # cmds is empty/not used in the direct case + lappend files($pkg) [list $file $type $cmds] + } + + if {$doVerbose} { + tclLog "processed $file" + } + } + interp delete $c + } + + append index "# Tcl package index file, version 1.1\n" + append index "# This file is generated by the \"pkg_mkIndex$more\" command\n" + append index "# and sourced either when an application starts up or\n" + append index "# by a \"package unknown\" script. It invokes the\n" + append index "# \"package ifneeded\" command to set up package-related\n" + append index "# information so that packages will be loaded automatically\n" + append index "# in response to \"package require\" commands. When this\n" + append index "# script is sourced, the variable \$dir must contain the\n" + append index "# full path name of this file's directory.\n" + + foreach pkg [lsort [array names files]] { + set cmd {} + lassign $pkg name version + lappend cmd ::tcl::Pkg::Create -name $name -version $version + foreach spec [lsort -index 0 $files($pkg)] { + foreach {file type procs} $spec { + if {$direct} { + set procs {} + } + lappend cmd "-$type" [list $file $procs] + } + } + append index "\n[eval $cmd]" + } + + set f [open [file join $dir pkgIndex.tcl] w] + puts $f $index + close $f +} + +# tclPkgSetup -- +# This is a utility procedure use by pkgIndex.tcl files. It is invoked as +# part of a "package ifneeded" script. It calls "package provide" to indicate +# that a package is available, then sets entries in the auto_index array so +# that the package's files will be auto-loaded when the commands are used. +# +# Arguments: +# dir - Directory containing all the files for this package. +# pkg - Name of the package (no version number). +# version - Version number for the package, such as 2.1.3. +# files - List of files that constitute the package. Each +# element is a sub-list with three elements. The first +# is the name of a file relative to $dir, the second is +# "load" or "source", indicating whether the file is a +# loadable binary or a script to source, and the third +# is a list of commands defined by this file. + +proc tclPkgSetup {dir pkg version files} { + global auto_index + + package provide $pkg $version + foreach fileInfo $files { + set f [lindex $fileInfo 0] + set type [lindex $fileInfo 1] + foreach cmd [lindex $fileInfo 2] { + if {$type eq "load"} { + set auto_index($cmd) [list load [file join $dir $f] $pkg] + } else { + set auto_index($cmd) [list source [file join $dir $f]] + } + } + } +} + +# tclPkgUnknown -- +# This procedure provides the default for the "package unknown" function. It +# is invoked when a package that's needed can't be found. It scans the +# auto_path directories and their immediate children looking for pkgIndex.tcl +# files and sources any such files that are found to setup the package +# database. As it searches, it will recognize changes to the auto_path and +# scan any new directories. +# +# Arguments: +# name - Name of desired package. Not used. +# version - Version of desired package. Not used. +# exact - Either "-exact" or omitted. Not used. + +proc tclPkgUnknown {name args} { + global auto_path env + + if {![info exists auto_path]} { + return + } + # Cache the auto_path, because it may change while we run through the + # first set of pkgIndex.tcl files + set old_path [set use_path $auto_path] + while {[llength $use_path]} { + set dir [lindex $use_path end] + + # Make sure we only scan each directory one time. + if {[info exists tclSeenPath($dir)]} { + set use_path [lrange $use_path 0 end-1] + continue + } + set tclSeenPath($dir) 1 + + # we can't use glob in safe interps, so enclose the following in a + # catch statement, where we get the pkgIndex files out of the + # subdirectories + catch { + foreach file [glob -directory $dir -join -nocomplain \ + * pkgIndex.tcl] { + set dir [file dirname $file] + if {![info exists procdDirs($dir)]} { + try { + source $file + } trap {POSIX EACCES} {} { + # $file was not readable; silently ignore + continue + } on error msg { + tclLog "error reading package index file $file: $msg" + } on ok {} { + set procdDirs($dir) 1 + } + } + } + } + set dir [lindex $use_path end] + if {![info exists procdDirs($dir)]} { + set file [file join $dir pkgIndex.tcl] + # safe interps usually don't have "file exists", + if {([interp issafe] || [file exists $file])} { + try { + source $file + } trap {POSIX EACCES} {} { + # $file was not readable; silently ignore + continue + } on error msg { + tclLog "error reading package index file $file: $msg" + } on ok {} { + set procdDirs($dir) 1 + } + } + } + + set use_path [lrange $use_path 0 end-1] + + # Check whether any of the index scripts we [source]d above set a new + # value for $::auto_path. If so, then find any new directories on the + # $::auto_path, and lappend them to the $use_path we are working from. + # This gives index scripts the (arguably unwise) power to expand the + # index script search path while the search is in progress. + set index 0 + if {[llength $old_path] == [llength $auto_path]} { + foreach dir $auto_path old $old_path { + if {$dir ne $old} { + # This entry in $::auto_path has changed. + break + } + incr index + } + } + + # $index now points to the first element of $auto_path that has + # changed, or the beginning if $auto_path has changed length Scan the + # new elements of $auto_path for directories to add to $use_path. + # Don't add directories we've already seen, or ones already on the + # $use_path. + foreach dir [lrange $auto_path $index end] { + if {![info exists tclSeenPath($dir)] && ($dir ni $use_path)} { + lappend use_path $dir + } + } + set old_path $auto_path + } +} + +# tcl::MacOSXPkgUnknown -- +# This procedure extends the "package unknown" function for MacOSX. It scans +# the Resources/Scripts directories of the immediate children of the auto_path +# directories for pkgIndex files. +# +# Arguments: +# original - original [package unknown] procedure +# name - Name of desired package. Not used. +# version - Version of desired package. Not used. +# exact - Either "-exact" or omitted. Not used. + +proc tcl::MacOSXPkgUnknown {original name args} { + # First do the cross-platform default search + uplevel 1 $original [linsert $args 0 $name] + + # Now do MacOSX specific searching + global auto_path + + if {![info exists auto_path]} { + return + } + # Cache the auto_path, because it may change while we run through the + # first set of pkgIndex.tcl files + set old_path [set use_path $auto_path] + while {[llength $use_path]} { + set dir [lindex $use_path end] + + # Make sure we only scan each directory one time. + if {[info exists tclSeenPath($dir)]} { + set use_path [lrange $use_path 0 end-1] + continue + } + set tclSeenPath($dir) 1 + + # get the pkgIndex files out of the subdirectories + foreach file [glob -directory $dir -join -nocomplain \ + * Resources Scripts pkgIndex.tcl] { + set dir [file dirname $file] + if {![info exists procdDirs($dir)]} { + try { + source $file + } trap {POSIX EACCES} {} { + # $file was not readable; silently ignore + continue + } on error msg { + tclLog "error reading package index file $file: $msg" + } on ok {} { + set procdDirs($dir) 1 + } + } + } + set use_path [lrange $use_path 0 end-1] + + # Check whether any of the index scripts we [source]d above set a new + # value for $::auto_path. If so, then find any new directories on the + # $::auto_path, and lappend them to the $use_path we are working from. + # This gives index scripts the (arguably unwise) power to expand the + # index script search path while the search is in progress. + set index 0 + if {[llength $old_path] == [llength $auto_path]} { + foreach dir $auto_path old $old_path { + if {$dir ne $old} { + # This entry in $::auto_path has changed. + break + } + incr index + } + } + + # $index now points to the first element of $auto_path that has + # changed, or the beginning if $auto_path has changed length Scan the + # new elements of $auto_path for directories to add to $use_path. + # Don't add directories we've already seen, or ones already on the + # $use_path. + foreach dir [lrange $auto_path $index end] { + if {![info exists tclSeenPath($dir)] && ($dir ni $use_path)} { + lappend use_path $dir + } + } + set old_path $auto_path + } +} + +# ::tcl::Pkg::Create -- +# +# Given a package specification generate a "package ifneeded" statement +# for the package, suitable for inclusion in a pkgIndex.tcl file. +# +# Arguments: +# args arguments used by the Create function: +# -name packageName +# -version packageVersion +# -load {filename ?{procs}?} +# ... +# -source {filename ?{procs}?} +# ... +# +# Any number of -load and -source parameters may be +# specified, so long as there is at least one -load or +# -source parameter. If the procs component of a module +# specifier is left off, that module will be set up for +# direct loading; otherwise, it will be set up for lazy +# loading. If both -source and -load are specified, the +# -load'ed files will be loaded first, followed by the +# -source'd files. +# +# Results: +# An appropriate "package ifneeded" statement for the package. + +proc ::tcl::Pkg::Create {args} { + append err(usage) "[lindex [info level 0] 0] " + append err(usage) "-name packageName -version packageVersion" + append err(usage) "?-load {filename ?{procs}?}? ... " + append err(usage) "?-source {filename ?{procs}?}? ..." + + set err(wrongNumArgs) "wrong # args: should be \"$err(usage)\"" + set err(valueMissing) "value for \"%s\" missing: should be \"$err(usage)\"" + set err(unknownOpt) "unknown option \"%s\": should be \"$err(usage)\"" + set err(noLoadOrSource) "at least one of -load and -source must be given" + + # process arguments + set len [llength $args] + if {$len < 6} { + error $err(wrongNumArgs) + } + + # Initialize parameters + array set opts {-name {} -version {} -source {} -load {}} + + # process parameters + for {set i 0} {$i < $len} {incr i} { + set flag [lindex $args $i] + incr i + switch -glob -- $flag { + "-name" - + "-version" { + if {$i >= $len} { + error [format $err(valueMissing) $flag] + } + set opts($flag) [lindex $args $i] + } + "-source" - + "-load" { + if {$i >= $len} { + error [format $err(valueMissing) $flag] + } + lappend opts($flag) [lindex $args $i] + } + default { + error [format $err(unknownOpt) [lindex $args $i]] + } + } + } + + # Validate the parameters + if {![llength $opts(-name)]} { + error [format $err(valueMissing) "-name"] + } + if {![llength $opts(-version)]} { + error [format $err(valueMissing) "-version"] + } + + if {!([llength $opts(-source)] || [llength $opts(-load)])} { + error $err(noLoadOrSource) + } + + # OK, now everything is good. Generate the package ifneeded statment. + set cmdline "package ifneeded $opts(-name) $opts(-version) " + + set cmdList {} + set lazyFileList {} + + # Handle -load and -source specs + foreach key {load source} { + foreach filespec $opts(-$key) { + lassign $filespec filename proclist + + if { [llength $proclist] == 0 } { + set cmd "\[list $key \[file join \$dir [list $filename]\]\]" + lappend cmdList $cmd + } else { + lappend lazyFileList [list $filename $key $proclist] + } + } + } + + if {[llength $lazyFileList]} { + lappend cmdList "\[list tclPkgSetup \$dir $opts(-name)\ + $opts(-version) [list $lazyFileList]\]" + } + append cmdline [join $cmdList "\\n"] + return $cmdline +} + +interp alias {} ::pkg::create {} ::tcl::Pkg::Create diff --git a/env/tcl/tcl8.6/parray.tcl b/env/tcl/tcl8.6/parray.tcl new file mode 100644 index 0000000..a9c2cb1 --- /dev/null +++ b/env/tcl/tcl8.6/parray.tcl @@ -0,0 +1,28 @@ +# parray: +# Print the contents of a global array on stdout. +# +# Copyright (c) 1991-1993 The Regents of the University of California. +# Copyright (c) 1994 Sun Microsystems, Inc. +# +# See the file "license.terms" for information on usage and redistribution +# of this file, and for a DISCLAIMER OF ALL WARRANTIES. +# + +proc parray {a {pattern *}} { + upvar 1 $a array + if {![array exists array]} { + return -code error "\"$a\" isn't an array" + } + set maxl 0 + set names [lsort [array names array $pattern]] + foreach name $names { + if {[string length $name] > $maxl} { + set maxl [string length $name] + } + } + set maxl [expr {$maxl + [string length $a] + 2}] + foreach name $names { + set nameString [format %s(%s) $a $name] + puts stdout [format "%-*s = %s" $maxl $nameString $array($name)] + } +} diff --git a/env/tcl/tcl8.6/safe.tcl b/env/tcl/tcl8.6/safe.tcl new file mode 100644 index 0000000..ea6391d --- /dev/null +++ b/env/tcl/tcl8.6/safe.tcl @@ -0,0 +1,1133 @@ +# safe.tcl -- +# +# This file provide a safe loading/sourcing mechanism for safe interpreters. +# It implements a virtual path mecanism to hide the real pathnames from the +# slave. It runs in a master interpreter and sets up data structure and +# aliases that will be invoked when used from a slave interpreter. +# +# See the safe.n man page for details. +# +# Copyright (c) 1996-1997 Sun Microsystems, Inc. +# +# See the file "license.terms" for information on usage and redistribution of +# this file, and for a DISCLAIMER OF ALL WARRANTIES. + +# +# The implementation is based on namespaces. These naming conventions are +# followed: +# Private procs starts with uppercase. +# Public procs are exported and starts with lowercase +# + +# Needed utilities package +package require opt 0.4.1 + +# Create the safe namespace +namespace eval ::safe { + # Exported API: + namespace export interpCreate interpInit interpConfigure interpDelete \ + interpAddToAccessPath interpFindInAccessPath setLogCmd +} + +# Helper function to resolve the dual way of specifying staticsok (either +# by -noStatics or -statics 0) +proc ::safe::InterpStatics {} { + foreach v {Args statics noStatics} { + upvar $v $v + } + set flag [::tcl::OptProcArgGiven -noStatics] + if {$flag && (!$noStatics == !$statics) + && ([::tcl::OptProcArgGiven -statics])} { + return -code error\ + "conflicting values given for -statics and -noStatics" + } + if {$flag} { + return [expr {!$noStatics}] + } else { + return $statics + } +} + +# Helper function to resolve the dual way of specifying nested loading +# (either by -nestedLoadOk or -nested 1) +proc ::safe::InterpNested {} { + foreach v {Args nested nestedLoadOk} { + upvar $v $v + } + set flag [::tcl::OptProcArgGiven -nestedLoadOk] + # note that the test here is the opposite of the "InterpStatics" one + # (it is not -noNested... because of the wanted default value) + if {$flag && (!$nestedLoadOk != !$nested) + && ([::tcl::OptProcArgGiven -nested])} { + return -code error\ + "conflicting values given for -nested and -nestedLoadOk" + } + if {$flag} { + # another difference with "InterpStatics" + return $nestedLoadOk + } else { + return $nested + } +} + +#### +# +# API entry points that needs argument parsing : +# +#### + +# Interface/entry point function and front end for "Create" +proc ::safe::interpCreate {args} { + set Args [::tcl::OptKeyParse ::safe::interpCreate $args] + InterpCreate $slave $accessPath \ + [InterpStatics] [InterpNested] $deleteHook +} + +proc ::safe::interpInit {args} { + set Args [::tcl::OptKeyParse ::safe::interpIC $args] + if {![::interp exists $slave]} { + return -code error "\"$slave\" is not an interpreter" + } + InterpInit $slave $accessPath \ + [InterpStatics] [InterpNested] $deleteHook +} + +# Check that the given slave is "one of us" +proc ::safe::CheckInterp {slave} { + namespace upvar ::safe S$slave state + if {![info exists state] || ![::interp exists $slave]} { + return -code error \ + "\"$slave\" is not an interpreter managed by ::safe::" + } +} + +# Interface/entry point function and front end for "Configure". This code +# is awfully pedestrian because it would need more coupling and support +# between the way we store the configuration values in safe::interp's and +# the Opt package. Obviously we would like an OptConfigure to avoid +# duplicating all this code everywhere. +# -> TODO (the app should share or access easily the program/value stored +# by opt) + +# This is even more complicated by the boolean flags with no values that +# we had the bad idea to support for the sake of user simplicity in +# create/init but which makes life hard in configure... +# So this will be hopefully written and some integrated with opt1.0 +# (hopefully for tcl8.1 ?) +proc ::safe::interpConfigure {args} { + switch [llength $args] { + 1 { + # If we have exactly 1 argument the semantic is to return all + # the current configuration. We still call OptKeyParse though + # we know that "slave" is our given argument because it also + # checks for the "-help" option. + set Args [::tcl::OptKeyParse ::safe::interpIC $args] + CheckInterp $slave + namespace upvar ::safe S$slave state + + return [join [list \ + [list -accessPath $state(access_path)] \ + [list -statics $state(staticsok)] \ + [list -nested $state(nestedok)] \ + [list -deleteHook $state(cleanupHook)]]] + } + 2 { + # If we have exactly 2 arguments the semantic is a "configure + # get" + lassign $args slave arg + + # get the flag sub program (we 'know' about Opt's internal + # representation of data) + set desc [lindex [::tcl::OptKeyGetDesc ::safe::interpIC] 2] + set hits [::tcl::OptHits desc $arg] + if {$hits > 1} { + return -code error [::tcl::OptAmbigous $desc $arg] + } elseif {$hits == 0} { + return -code error [::tcl::OptFlagUsage $desc $arg] + } + CheckInterp $slave + namespace upvar ::safe S$slave state + + set item [::tcl::OptCurDesc $desc] + set name [::tcl::OptName $item] + switch -exact -- $name { + -accessPath { + return [list -accessPath $state(access_path)] + } + -statics { + return [list -statics $state(staticsok)] + } + -nested { + return [list -nested $state(nestedok)] + } + -deleteHook { + return [list -deleteHook $state(cleanupHook)] + } + -noStatics { + # it is most probably a set in fact but we would need + # then to jump to the set part and it is not *sure* + # that it is a set action that the user want, so force + # it to use the unambigous -statics ?value? instead: + return -code error\ + "ambigous query (get or set -noStatics ?)\ + use -statics instead" + } + -nestedLoadOk { + return -code error\ + "ambigous query (get or set -nestedLoadOk ?)\ + use -nested instead" + } + default { + return -code error "unknown flag $name (bug)" + } + } + } + default { + # Otherwise we want to parse the arguments like init and + # create did + set Args [::tcl::OptKeyParse ::safe::interpIC $args] + CheckInterp $slave + namespace upvar ::safe S$slave state + + # Get the current (and not the default) values of whatever has + # not been given: + if {![::tcl::OptProcArgGiven -accessPath]} { + set doreset 1 + set accessPath $state(access_path) + } else { + set doreset 0 + } + if { + ![::tcl::OptProcArgGiven -statics] + && ![::tcl::OptProcArgGiven -noStatics] + } then { + set statics $state(staticsok) + } else { + set statics [InterpStatics] + } + if { + [::tcl::OptProcArgGiven -nested] || + [::tcl::OptProcArgGiven -nestedLoadOk] + } then { + set nested [InterpNested] + } else { + set nested $state(nestedok) + } + if {![::tcl::OptProcArgGiven -deleteHook]} { + set deleteHook $state(cleanupHook) + } + # we can now reconfigure : + InterpSetConfig $slave $accessPath $statics $nested $deleteHook + # auto_reset the slave (to completly synch the new access_path) + if {$doreset} { + if {[catch {::interp eval $slave {auto_reset}} msg]} { + Log $slave "auto_reset failed: $msg" + } else { + Log $slave "successful auto_reset" NOTICE + } + } + } + } +} + +#### +# +# Functions that actually implements the exported APIs +# +#### + +# +# safe::InterpCreate : doing the real job +# +# This procedure creates a safe slave and initializes it with the safe +# base aliases. +# NB: slave name must be simple alphanumeric string, no spaces, no (), no +# {},... {because the state array is stored as part of the name} +# +# Returns the slave name. +# +# Optional Arguments : +# + slave name : if empty, generated name will be used +# + access_path: path list controlling where load/source can occur, +# if empty: the master auto_path will be used. +# + staticsok : flag, if 0 :no static package can be loaded (load {} Xxx) +# if 1 :static packages are ok. +# + nestedok: flag, if 0 :no loading to sub-sub interps (load xx xx sub) +# if 1 : multiple levels are ok. + +# use the full name and no indent so auto_mkIndex can find us +proc ::safe::InterpCreate { + slave + access_path + staticsok + nestedok + deletehook + } { + # Create the slave. + if {$slave ne ""} { + ::interp create -safe $slave + } else { + # empty argument: generate slave name + set slave [::interp create -safe] + } + Log $slave "Created" NOTICE + + # Initialize it. (returns slave name) + InterpInit $slave $access_path $staticsok $nestedok $deletehook +} + +# +# InterpSetConfig (was setAccessPath) : +# Sets up slave virtual auto_path and corresponding structure within +# the master. Also sets the tcl_library in the slave to be the first +# directory in the path. +# NB: If you change the path after the slave has been initialized you +# probably need to call "auto_reset" in the slave in order that it gets +# the right auto_index() array values. + +proc ::safe::InterpSetConfig {slave access_path staticsok nestedok deletehook} { + global auto_path + + # determine and store the access path if empty + if {$access_path eq ""} { + set access_path $auto_path + + # Make sure that tcl_library is in auto_path and at the first + # position (needed by setAccessPath) + set where [lsearch -exact $access_path [info library]] + if {$where == -1} { + # not found, add it. + set access_path [linsert $access_path 0 [info library]] + Log $slave "tcl_library was not in auto_path,\ + added it to slave's access_path" NOTICE + } elseif {$where != 0} { + # not first, move it first + set access_path [linsert \ + [lreplace $access_path $where $where] \ + 0 [info library]] + Log $slave "tcl_libray was not in first in auto_path,\ + moved it to front of slave's access_path" NOTICE + } + + # Add 1st level sub dirs (will searched by auto loading from tcl + # code in the slave using glob and thus fail, so we add them here + # so by default it works the same). + set access_path [AddSubDirs $access_path] + } + + Log $slave "Setting accessPath=($access_path) staticsok=$staticsok\ + nestedok=$nestedok deletehook=($deletehook)" NOTICE + + namespace upvar ::safe S$slave state + + # clear old autopath if it existed + # build new one + # Extend the access list with the paths used to look for Tcl Modules. + # We save the virtual form separately as well, as syncing it with the + # slave has to be defered until the necessary commands are present for + # setup. + + set norm_access_path {} + set slave_access_path {} + set map_access_path {} + set remap_access_path {} + set slave_tm_path {} + + set i 0 + foreach dir $access_path { + set token [PathToken $i] + lappend slave_access_path $token + lappend map_access_path $token $dir + lappend remap_access_path $dir $token + lappend norm_access_path [file normalize $dir] + incr i + } + + set morepaths [::tcl::tm::list] + while {[llength $morepaths]} { + set addpaths $morepaths + set morepaths {} + + foreach dir $addpaths { + # Prevent the addition of dirs on the tm list to the + # result if they are already known. + if {[dict exists $remap_access_path $dir]} { + continue + } + + set token [PathToken $i] + lappend access_path $dir + lappend slave_access_path $token + lappend map_access_path $token $dir + lappend remap_access_path $dir $token + lappend norm_access_path [file normalize $dir] + lappend slave_tm_path $token + incr i + + # [Bug 2854929] + # Recursively find deeper paths which may contain + # modules. Required to handle modules with names like + # 'platform::shell', which translate into + # 'platform/shell-X.tm', i.e arbitrarily deep + # subdirectories. + lappend morepaths {*}[glob -nocomplain -directory $dir -type d *] + } + } + + set state(access_path) $access_path + set state(access_path,map) $map_access_path + set state(access_path,remap) $remap_access_path + set state(access_path,norm) $norm_access_path + set state(access_path,slave) $slave_access_path + set state(tm_path_slave) $slave_tm_path + set state(staticsok) $staticsok + set state(nestedok) $nestedok + set state(cleanupHook) $deletehook + + SyncAccessPath $slave +} + +# +# +# FindInAccessPath: +# Search for a real directory and returns its virtual Id (including the +# "$") +proc ::safe::interpFindInAccessPath {slave path} { + namespace upvar ::safe S$slave state + + if {![dict exists $state(access_path,remap) $path]} { + return -code error "$path not found in access path $access_path" + } + + return [dict get $state(access_path,remap) $path] +} + +# +# addToAccessPath: +# add (if needed) a real directory to access path and return its +# virtual token (including the "$"). +proc ::safe::interpAddToAccessPath {slave path} { + # first check if the directory is already in there + # (inlined interpFindInAccessPath). + namespace upvar ::safe S$slave state + + if {[dict exists $state(access_path,remap) $path]} { + return [dict get $state(access_path,remap) $path] + } + + # new one, add it: + set token [PathToken [llength $state(access_path)]] + + lappend state(access_path) $path + lappend state(access_path,slave) $token + lappend state(access_path,map) $token $path + lappend state(access_path,remap) $path $token + lappend state(access_path,norm) [file normalize $path] + + SyncAccessPath $slave + return $token +} + +# This procedure applies the initializations to an already existing +# interpreter. It is useful when you want to install the safe base aliases +# into a preexisting safe interpreter. +proc ::safe::InterpInit { + slave + access_path + staticsok + nestedok + deletehook + } { + # Configure will generate an access_path when access_path is empty. + InterpSetConfig $slave $access_path $staticsok $nestedok $deletehook + + # NB we need to add [namespace current], aliases are always absolute + # paths. + + # These aliases let the slave load files to define new commands + # This alias lets the slave use the encoding names, convertfrom, + # convertto, and system, but not "encoding system " to set the + # system encoding. + # Handling Tcl Modules, we need a restricted form of Glob. + # This alias interposes on the 'exit' command and cleanly terminates + # the slave. + + foreach {command alias} { + source AliasSource + load AliasLoad + encoding AliasEncoding + exit interpDelete + glob AliasGlob + } { + ::interp alias $slave $command {} [namespace current]::$alias $slave + } + + # This alias lets the slave have access to a subset of the 'file' + # command functionality. + + ::interp expose $slave file + foreach subcommand {dirname extension rootname tail} { + ::interp alias $slave ::tcl::file::$subcommand {} \ + ::safe::AliasFileSubcommand $slave $subcommand + } + foreach subcommand { + atime attributes copy delete executable exists isdirectory isfile + link lstat mtime mkdir nativename normalize owned readable readlink + rename size stat tempfile type volumes writable + } { + ::interp alias $slave ::tcl::file::$subcommand {} \ + ::safe::BadSubcommand $slave file $subcommand + } + + # Subcommands of info + foreach {subcommand alias} { + nameofexecutable AliasExeName + } { + ::interp alias $slave ::tcl::info::$subcommand \ + {} [namespace current]::$alias $slave + } + + # The allowed slave variables already have been set by Tcl_MakeSafe(3) + + # Source init.tcl and tm.tcl into the slave, to get auto_load and + # other procedures defined: + + if {[catch {::interp eval $slave { + source [file join $tcl_library init.tcl] + }} msg opt]} { + Log $slave "can't source init.tcl ($msg)" + return -options $opt "can't source init.tcl into slave $slave ($msg)" + } + + if {[catch {::interp eval $slave { + source [file join $tcl_library tm.tcl] + }} msg opt]} { + Log $slave "can't source tm.tcl ($msg)" + return -options $opt "can't source tm.tcl into slave $slave ($msg)" + } + + # Sync the paths used to search for Tcl modules. This can be done only + # now, after tm.tcl was loaded. + namespace upvar ::safe S$slave state + if {[llength $state(tm_path_slave)] > 0} { + ::interp eval $slave [list \ + ::tcl::tm::add {*}[lreverse $state(tm_path_slave)]] + } + return $slave +} + +# Add (only if needed, avoid duplicates) 1 level of sub directories to an +# existing path list. Also removes non directories from the returned +# list. +proc ::safe::AddSubDirs {pathList} { + set res {} + foreach dir $pathList { + if {[file isdirectory $dir]} { + # check that we don't have it yet as a children of a previous + # dir + if {$dir ni $res} { + lappend res $dir + } + foreach sub [glob -directory $dir -nocomplain *] { + if {[file isdirectory $sub] && ($sub ni $res)} { + # new sub dir, add it ! + lappend res $sub + } + } + } + } + return $res +} + +# This procedure deletes a safe slave managed by Safe Tcl and cleans up +# associated state: + +proc ::safe::interpDelete {slave} { + Log $slave "About to delete" NOTICE + + namespace upvar ::safe S$slave state + + # If the slave has a cleanup hook registered, call it. Check the + # existance because we might be called to delete an interp which has + # not been registered with us at all + + if {[info exists state(cleanupHook)]} { + set hook $state(cleanupHook) + if {[llength $hook]} { + # remove the hook now, otherwise if the hook calls us somehow, + # we'll loop + unset state(cleanupHook) + try { + {*}$hook $slave + } on error err { + Log $slave "Delete hook error ($err)" + } + } + } + + # Discard the global array of state associated with the slave, and + # delete the interpreter. + + if {[info exists state]} { + unset state + } + + # if we have been called twice, the interp might have been deleted + # already + if {[::interp exists $slave]} { + ::interp delete $slave + Log $slave "Deleted" NOTICE + } + + return +} + +# Set (or get) the logging mecanism + +proc ::safe::setLogCmd {args} { + variable Log + set la [llength $args] + if {$la == 0} { + return $Log + } elseif {$la == 1} { + set Log [lindex $args 0] + } else { + set Log $args + } + + if {$Log eq ""} { + # Disable logging completely. Calls to it will be compiled out + # of all users. + proc ::safe::Log {args} {} + } else { + # Activate logging, define proper command. + + proc ::safe::Log {slave msg {type ERROR}} { + variable Log + {*}$Log "$type for slave $slave : $msg" + return + } + } +} + +# ------------------- END OF PUBLIC METHODS ------------ + +# +# Sets the slave auto_path to the master recorded value. Also sets +# tcl_library to the first token of the virtual path. +# +proc ::safe::SyncAccessPath {slave} { + namespace upvar ::safe S$slave state + + set slave_access_path $state(access_path,slave) + ::interp eval $slave [list set auto_path $slave_access_path] + + Log $slave "auto_path in $slave has been set to $slave_access_path"\ + NOTICE + + # This code assumes that info library is the first element in the + # list of auto_path's. See -> InterpSetConfig for the code which + # ensures this condition. + + ::interp eval $slave [list \ + set tcl_library [lindex $slave_access_path 0]] +} + +# Returns the virtual token for directory number N. +proc ::safe::PathToken {n} { + # We need to have a ":" in the token string so [file join] on the + # mac won't turn it into a relative path. + return "\$p(:$n:)" ;# Form tested by case 7.2 +} + +# +# translate virtual path into real path +# +proc ::safe::TranslatePath {slave path} { + namespace upvar ::safe S$slave state + + # somehow strip the namespaces 'functionality' out (the danger is that + # we would strip valid macintosh "../" queries... : + if {[string match "*::*" $path] || [string match "*..*" $path]} { + return -code error "invalid characters in path $path" + } + + # Use a cached map instead of computed local vars and subst. + + return [string map $state(access_path,map) $path] +} + +# file name control (limit access to files/resources that should be a +# valid tcl source file) +proc ::safe::CheckFileName {slave file} { + # This used to limit what can be sourced to ".tcl" and forbid files + # with more than 1 dot and longer than 14 chars, but I changed that + # for 8.4 as a safe interp has enough internal protection already to + # allow sourcing anything. - hobbs + + if {![file exists $file]} { + # don't tell the file path + return -code error "no such file or directory" + } + + if {![file readable $file]} { + # don't tell the file path + return -code error "not readable" + } +} + +# AliasFileSubcommand handles selected subcommands of [file] in safe +# interpreters that are *almost* safe. In particular, it just acts to +# prevent discovery of what home directories exist. + +proc ::safe::AliasFileSubcommand {slave subcommand name} { + if {[string match ~* $name]} { + set name ./$name + } + tailcall ::interp invokehidden $slave tcl:file:$subcommand $name +} + +# AliasGlob is the target of the "glob" alias in safe interpreters. + +proc ::safe::AliasGlob {slave args} { + Log $slave "GLOB ! $args" NOTICE + set cmd {} + set at 0 + array set got { + -directory 0 + -nocomplain 0 + -join 0 + -tails 0 + -- 0 + } + + if {$::tcl_platform(platform) eq "windows"} { + set dirPartRE {^(.*)[\\/]([^\\/]*)$} + } else { + set dirPartRE {^(.*)/([^/]*)$} + } + + set dir {} + set virtualdir {} + + while {$at < [llength $args]} { + switch -glob -- [set opt [lindex $args $at]] { + -nocomplain - -- - -join - -tails { + lappend cmd $opt + set got($opt) 1 + incr at + } + -types - -type { + lappend cmd -types [lindex $args [incr at]] + incr at + } + -directory { + if {$got($opt)} { + return -code error \ + {"-directory" cannot be used with "-path"} + } + set got($opt) 1 + set virtualdir [lindex $args [incr at]] + incr at + } + pkgIndex.tcl { + # Oops, this is globbing a subdirectory in regular package + # search. That is not wanted. Abort, handler does catch + # already (because glob was not defined before). See + # package.tcl, lines 484ff in tclPkgUnknown. + return -code error "unknown command glob" + } + -* { + Log $slave "Safe base rejecting glob option '$opt'" + return -code error "Safe base rejecting glob option '$opt'" + } + default { + break + } + } + if {$got(--)} break + } + + # Get the real path from the virtual one and check that the path is in the + # access path of that slave. Done after basic argument processing so that + # we know if -nocomplain is set. + if {$got(-directory)} { + try { + set dir [TranslatePath $slave $virtualdir] + DirInAccessPath $slave $dir + } on error msg { + Log $slave $msg + if {$got(-nocomplain)} return + return -code error "permission denied" + } + lappend cmd -directory $dir + } + + # Apply the -join semantics ourselves + if {$got(-join)} { + set args [lreplace $args $at end [join [lrange $args $at end] "/"]] + } + + # Process remaining pattern arguments + set firstPattern [llength $cmd] + foreach opt [lrange $args $at end] { + if {![regexp $dirPartRE $opt -> thedir thefile]} { + set thedir . + } elseif {[string match ~* $thedir]} { + set thedir ./$thedir + } + if {$thedir eq "*" && + ($thefile eq "pkgIndex.tcl" || $thefile eq "*.tm")} { + set mapped 0 + foreach d [glob -directory [TranslatePath $slave $virtualdir] \ + -types d -tails *] { + catch { + DirInAccessPath $slave \ + [TranslatePath $slave [file join $virtualdir $d]] + lappend cmd [file join $d $thefile] + set mapped 1 + } + } + if {$mapped} continue + } + try { + DirInAccessPath $slave [TranslatePath $slave \ + [file join $virtualdir $thedir]] + } on error msg { + Log $slave $msg + if {$got(-nocomplain)} continue + return -code error "permission denied" + } + lappend cmd $opt + } + + Log $slave "GLOB = $cmd" NOTICE + + if {$got(-nocomplain) && [llength $cmd] eq $firstPattern} { + return + } + try { + set entries [::interp invokehidden $slave glob {*}$cmd] + } on error msg { + Log $slave $msg + return -code error "script error" + } + + Log $slave "GLOB < $entries" NOTICE + + # Translate path back to what the slave should see. + set res {} + set l [string length $dir] + foreach p $entries { + if {[string equal -length $l $dir $p]} { + set p [string replace $p 0 [expr {$l-1}] $virtualdir] + } + lappend res $p + } + + Log $slave "GLOB > $res" NOTICE + return $res +} + +# AliasSource is the target of the "source" alias in safe interpreters. + +proc ::safe::AliasSource {slave args} { + set argc [llength $args] + # Extended for handling of Tcl Modules to allow not only "source + # filename", but "source -encoding E filename" as well. + if {[lindex $args 0] eq "-encoding"} { + incr argc -2 + set encoding [lindex $args 1] + set at 2 + if {$encoding eq "identity"} { + Log $slave "attempt to use the identity encoding" + return -code error "permission denied" + } + } else { + set at 0 + set encoding {} + } + if {$argc != 1} { + set msg "wrong # args: should be \"source ?-encoding E? fileName\"" + Log $slave "$msg ($args)" + return -code error $msg + } + set file [lindex $args $at] + + # get the real path from the virtual one. + if {[catch { + set realfile [TranslatePath $slave $file] + } msg]} { + Log $slave $msg + return -code error "permission denied" + } + + # check that the path is in the access path of that slave + if {[catch { + FileInAccessPath $slave $realfile + } msg]} { + Log $slave $msg + return -code error "permission denied" + } + + # do the checks on the filename : + if {[catch { + CheckFileName $slave $realfile + } msg]} { + Log $slave "$realfile:$msg" + return -code error $msg + } + + # Passed all the tests, lets source it. Note that we do this all manually + # because we want to control [info script] in the slave so information + # doesn't leak so much. [Bug 2913625] + set old [::interp eval $slave {info script}] + set replacementMsg "script error" + set code [catch { + set f [open $realfile] + fconfigure $f -eofchar \032 + if {$encoding ne ""} { + fconfigure $f -encoding $encoding + } + set contents [read $f] + close $f + ::interp eval $slave [list info script $file] + } msg opt] + if {$code == 0} { + set code [catch {::interp eval $slave $contents} msg opt] + set replacementMsg $msg + } + catch {interp eval $slave [list info script $old]} + # Note that all non-errors are fine result codes from [source], so we must + # take a little care to do it properly. [Bug 2923613] + if {$code == 1} { + Log $slave $msg + return -code error $replacementMsg + } + return -code $code -options $opt $msg +} + +# AliasLoad is the target of the "load" alias in safe interpreters. + +proc ::safe::AliasLoad {slave file args} { + set argc [llength $args] + if {$argc > 2} { + set msg "load error: too many arguments" + Log $slave "$msg ($argc) {$file $args}" + return -code error $msg + } + + # package name (can be empty if file is not). + set package [lindex $args 0] + + namespace upvar ::safe S$slave state + + # Determine where to load. load use a relative interp path and {} + # means self, so we can directly and safely use passed arg. + set target [lindex $args 1] + if {$target ne ""} { + # we will try to load into a sub sub interp; check that we want to + # authorize that. + if {!$state(nestedok)} { + Log $slave "loading to a sub interp (nestedok)\ + disabled (trying to load $package to $target)" + return -code error "permission denied (nested load)" + } + } + + # Determine what kind of load is requested + if {$file eq ""} { + # static package loading + if {$package eq ""} { + set msg "load error: empty filename and no package name" + Log $slave $msg + return -code error $msg + } + if {!$state(staticsok)} { + Log $slave "static packages loading disabled\ + (trying to load $package to $target)" + return -code error "permission denied (static package)" + } + } else { + # file loading + + # get the real path from the virtual one. + try { + set file [TranslatePath $slave $file] + } on error msg { + Log $slave $msg + return -code error "permission denied" + } + + # check the translated path + try { + FileInAccessPath $slave $file + } on error msg { + Log $slave $msg + return -code error "permission denied (path)" + } + } + + try { + return [::interp invokehidden $slave load $file $package $target] + } on error msg { + Log $slave $msg + return -code error $msg + } +} + +# FileInAccessPath raises an error if the file is not found in the list of +# directories contained in the (master side recorded) slave's access path. + +# the security here relies on "file dirname" answering the proper +# result... needs checking ? +proc ::safe::FileInAccessPath {slave file} { + namespace upvar ::safe S$slave state + set access_path $state(access_path) + + if {[file isdirectory $file]} { + return -code error "\"$file\": is a directory" + } + set parent [file dirname $file] + + # Normalize paths for comparison since lsearch knows nothing of + # potential pathname anomalies. + set norm_parent [file normalize $parent] + + namespace upvar ::safe S$slave state + if {$norm_parent ni $state(access_path,norm)} { + return -code error "\"$file\": not in access_path" + } +} + +proc ::safe::DirInAccessPath {slave dir} { + namespace upvar ::safe S$slave state + set access_path $state(access_path) + + if {[file isfile $dir]} { + return -code error "\"$dir\": is a file" + } + + # Normalize paths for comparison since lsearch knows nothing of + # potential pathname anomalies. + set norm_dir [file normalize $dir] + + namespace upvar ::safe S$slave state + if {$norm_dir ni $state(access_path,norm)} { + return -code error "\"$dir\": not in access_path" + } +} + +# This procedure is used to report an attempt to use an unsafe member of an +# ensemble command. + +proc ::safe::BadSubcommand {slave command subcommand args} { + set msg "not allowed to invoke subcommand $subcommand of $command" + Log $slave $msg + return -code error -errorcode {TCL SAFE SUBCOMMAND} $msg +} + +# AliasEncoding is the target of the "encoding" alias in safe interpreters. + +proc ::safe::AliasEncoding {slave option args} { + # Note that [encoding dirs] is not supported in safe slaves at all + set subcommands {convertfrom convertto names system} + try { + set option [tcl::prefix match -error [list -level 1 -errorcode \ + [list TCL LOOKUP INDEX option $option]] $subcommands $option] + # Special case: [encoding system] ok, but [encoding system foo] not + if {$option eq "system" && [llength $args]} { + return -code error -errorcode {TCL WRONGARGS} \ + "wrong # args: should be \"encoding system\"" + } + } on error {msg options} { + Log $slave $msg + return -options $options $msg + } + tailcall ::interp invokehidden $slave encoding $option {*}$args +} + +# Various minor hiding of platform features. [Bug 2913625] + +proc ::safe::AliasExeName {slave} { + return "" +} + +proc ::safe::Setup {} { + #### + # + # Setup the arguments parsing + # + #### + + # Share the descriptions + set temp [::tcl::OptKeyRegister { + {-accessPath -list {} "access path for the slave"} + {-noStatics "prevent loading of statically linked pkgs"} + {-statics true "loading of statically linked pkgs"} + {-nestedLoadOk "allow nested loading"} + {-nested false "nested loading"} + {-deleteHook -script {} "delete hook"} + }] + + # create case (slave is optional) + ::tcl::OptKeyRegister { + {?slave? -name {} "name of the slave (optional)"} + } ::safe::interpCreate + + # adding the flags sub programs to the command program (relying on Opt's + # internal implementation details) + lappend ::tcl::OptDesc(::safe::interpCreate) $::tcl::OptDesc($temp) + + # init and configure (slave is needed) + ::tcl::OptKeyRegister { + {slave -name {} "name of the slave"} + } ::safe::interpIC + + # adding the flags sub programs to the command program (relying on Opt's + # internal implementation details) + lappend ::tcl::OptDesc(::safe::interpIC) $::tcl::OptDesc($temp) + + # temp not needed anymore + ::tcl::OptKeyDelete $temp + + #### + # + # Default: No logging. + # + #### + + setLogCmd {} + + # Log eventually. + # To enable error logging, set Log to {puts stderr} for instance, + # via setLogCmd. + return +} + +namespace eval ::safe { + # internal variables + + # Log command, set via 'setLogCmd'. Logging is disabled when empty. + variable Log {} + + # The package maintains a state array per slave interp under its + # control. The name of this array is S. This array is + # brought into scope where needed, using 'namespace upvar'. The S + # prefix is used to avoid that a slave interp called "Log" smashes + # the "Log" variable. + # + # The array's elements are: + # + # access_path : List of paths accessible to the slave. + # access_path,norm : Ditto, in normalized form. + # access_path,slave : Ditto, as the path tokens as seen by the slave. + # access_path,map : dict ( token -> path ) + # access_path,remap : dict ( path -> token ) + # tm_path_slave : List of TM root directories, as tokens seen by the slave. + # staticsok : Value of option -statics + # nestedok : Value of option -nested + # cleanupHook : Value of option -deleteHook +} + +::safe::Setup diff --git a/env/tcl/tcl8.6/tclIndex b/env/tcl/tcl8.6/tclIndex new file mode 100644 index 0000000..26603c1 --- /dev/null +++ b/env/tcl/tcl8.6/tclIndex @@ -0,0 +1,75 @@ +# Tcl autoload index file, version 2.0 +# -*- tcl -*- +# This file is generated by the "auto_mkindex" command +# and sourced to set up indexing information for one or +# more commands. Typically each line is a command that +# sets an element in the auto_index array, where the +# element name is the name of a command and the value is +# a script that loads the command. + +set auto_index(auto_reset) [list source [file join $dir auto.tcl]] +set auto_index(tcl_findLibrary) [list source [file join $dir auto.tcl]] +set auto_index(auto_mkindex) [list source [file join $dir auto.tcl]] +set auto_index(auto_mkindex_old) [list source [file join $dir auto.tcl]] +set auto_index(::auto_mkindex_parser::init) [list source [file join $dir auto.tcl]] +set auto_index(::auto_mkindex_parser::cleanup) [list source [file join $dir auto.tcl]] +set auto_index(::auto_mkindex_parser::mkindex) [list source [file join $dir auto.tcl]] +set auto_index(::auto_mkindex_parser::hook) [list source [file join $dir auto.tcl]] +set auto_index(::auto_mkindex_parser::slavehook) [list source [file join $dir auto.tcl]] +set auto_index(::auto_mkindex_parser::command) [list source [file join $dir auto.tcl]] +set auto_index(::auto_mkindex_parser::commandInit) [list source [file join $dir auto.tcl]] +set auto_index(::auto_mkindex_parser::fullname) [list source [file join $dir auto.tcl]] +set auto_index(history) [list source [file join $dir history.tcl]] +set auto_index(::tcl::HistAdd) [list source [file join $dir history.tcl]] +set auto_index(::tcl::HistKeep) [list source [file join $dir history.tcl]] +set auto_index(::tcl::HistClear) [list source [file join $dir history.tcl]] +set auto_index(::tcl::HistInfo) [list source [file join $dir history.tcl]] +set auto_index(::tcl::HistRedo) [list source [file join $dir history.tcl]] +set auto_index(::tcl::HistIndex) [list source [file join $dir history.tcl]] +set auto_index(::tcl::HistEvent) [list source [file join $dir history.tcl]] +set auto_index(::tcl::HistChange) [list source [file join $dir history.tcl]] +set auto_index(pkg_mkIndex) [list source [file join $dir package.tcl]] +set auto_index(tclPkgSetup) [list source [file join $dir package.tcl]] +set auto_index(tclPkgUnknown) [list source [file join $dir package.tcl]] +set auto_index(::tcl::MacOSXPkgUnknown) [list source [file join $dir package.tcl]] +set auto_index(::pkg::create) [list source [file join $dir package.tcl]] +set auto_index(parray) [list source [file join $dir parray.tcl]] +set auto_index(::safe::InterpStatics) [list source [file join $dir safe.tcl]] +set auto_index(::safe::InterpNested) [list source [file join $dir safe.tcl]] +set auto_index(::safe::interpCreate) [list source [file join $dir safe.tcl]] +set auto_index(::safe::interpInit) [list source [file join $dir safe.tcl]] +set auto_index(::safe::CheckInterp) [list source [file join $dir safe.tcl]] +set auto_index(::safe::interpConfigure) [list source [file join $dir safe.tcl]] +set auto_index(::safe::InterpCreate) [list source [file join $dir safe.tcl]] +set auto_index(::safe::InterpSetConfig) [list source [file join $dir safe.tcl]] +set auto_index(::safe::interpFindInAccessPath) [list source [file join $dir safe.tcl]] +set auto_index(::safe::interpAddToAccessPath) [list source [file join $dir safe.tcl]] +set auto_index(::safe::InterpInit) [list source [file join $dir safe.tcl]] +set auto_index(::safe::AddSubDirs) [list source [file join $dir safe.tcl]] +set auto_index(::safe::interpDelete) [list source [file join $dir safe.tcl]] +set auto_index(::safe::setLogCmd) [list source [file join $dir safe.tcl]] +set auto_index(::safe::SyncAccessPath) [list source [file join $dir safe.tcl]] +set auto_index(::safe::PathToken) [list source [file join $dir safe.tcl]] +set auto_index(::safe::TranslatePath) [list source [file join $dir safe.tcl]] +set auto_index(::safe::Log) [list source [file join $dir safe.tcl]] +set auto_index(::safe::CheckFileName) [list source [file join $dir safe.tcl]] +set auto_index(::safe::AliasGlob) [list source [file join $dir safe.tcl]] +set auto_index(::safe::AliasSource) [list source [file join $dir safe.tcl]] +set auto_index(::safe::AliasLoad) [list source [file join $dir safe.tcl]] +set auto_index(::safe::FileInAccessPath) [list source [file join $dir safe.tcl]] +set auto_index(::safe::DirInAccessPath) [list source [file join $dir safe.tcl]] +set auto_index(::safe::Subset) [list source [file join $dir safe.tcl]] +set auto_index(::safe::AliasSubset) [list source [file join $dir safe.tcl]] +set auto_index(::safe::AliasEncoding) [list source [file join $dir safe.tcl]] +set auto_index(tcl_wordBreakAfter) [list source [file join $dir word.tcl]] +set auto_index(tcl_wordBreakBefore) [list source [file join $dir word.tcl]] +set auto_index(tcl_endOfWord) [list source [file join $dir word.tcl]] +set auto_index(tcl_startOfNextWord) [list source [file join $dir word.tcl]] +set auto_index(tcl_startOfPreviousWord) [list source [file join $dir word.tcl]] +set auto_index(::tcl::tm::add) [list source [file join $dir tm.tcl]] +set auto_index(::tcl::tm::remove) [list source [file join $dir tm.tcl]] +set auto_index(::tcl::tm::list) [list source [file join $dir tm.tcl]] +set auto_index(::tcl::tm::Defaults) [list source [file join $dir tm.tcl]] +set auto_index(::tcl::tm::UnknownHandler) [list source [file join $dir tm.tcl]] +set auto_index(::tcl::tm::roots) [list source [file join $dir tm.tcl]] +set auto_index(::tcl::tm::path) [list source [file join $dir tm.tcl]] diff --git a/env/tcl/tcl8.6/tm.tcl b/env/tcl/tcl8.6/tm.tcl new file mode 100644 index 0000000..66c56a1 --- /dev/null +++ b/env/tcl/tcl8.6/tm.tcl @@ -0,0 +1,375 @@ +# -*- tcl -*- +# +# Searching for Tcl Modules. Defines a procedure, declares it as the primary +# command for finding packages, however also uses the former 'package unknown' +# command as a fallback. +# +# Locates all possible packages in a directory via a less restricted glob. The +# targeted directory is derived from the name of the requested package, i.e. +# the TM scan will look only at directories which can contain the requested +# package. It will register all packages it found in the directory so that +# future requests have a higher chance of being fulfilled by the ifneeded +# database without having to come to us again. +# +# We do not remember where we have been and simply rescan targeted directories +# when invoked again. The reasoning is this: +# +# - The only way we get back to the same directory is if someone is trying to +# [package require] something that wasn't there on the first scan. +# +# Either +# 1) It is there now: If we rescan, you get it; if not you don't. +# +# This covers the possibility that the application asked for a package +# late, and the package was actually added to the installation after the +# application was started. It shoukld still be able to find it. +# +# 2) It still is not there: Either way, you don't get it, but the rescan +# takes time. This is however an error case and we dont't care that much +# about it +# +# 3) It was there the first time; but for some reason a "package forget" has +# been run, and "package" doesn't know about it anymore. +# +# This can be an indication that the application wishes to reload some +# functionality. And should work as well. +# +# Note that this also strikes a balance between doing a glob targeting a +# single package, and thus most likely requiring multiple globs of the same +# directory when the application is asking for many packages, and trying to +# glob for _everything_ in all subdirectories when looking for a package, +# which comes with a heavy startup cost. +# +# We scan for regular packages only if no satisfying module was found. + +namespace eval ::tcl::tm { + # Default paths. None yet. + + variable paths {} + + # The regex pattern a file name has to match to make it a Tcl Module. + + set pkgpattern {^([_[:alpha:]][:_[:alnum:]]*)-([[:digit:]].*)[.]tm$} + + # Export the public API + + namespace export path + namespace ensemble create -command path -subcommands {add remove list} +} + +# ::tcl::tm::path implementations -- +# +# Public API to the module path. See specification. +# +# Arguments +# cmd - The subcommand to execute +# args - The paths to add/remove. Must not appear querying the +# path with 'list'. +# +# Results +# No result for subcommands 'add' and 'remove'. A list of paths for +# 'list'. +# +# Sideeffects +# The subcommands 'add' and 'remove' manipulate the list of paths to +# search for Tcl Modules. The subcommand 'list' has no sideeffects. + +proc ::tcl::tm::add {args} { + # PART OF THE ::tcl::tm::path ENSEMBLE + # + # The path is added at the head to the list of module paths. + # + # The command enforces the restriction that no path may be an ancestor + # directory of any other path on the list. If the new path violates this + # restriction an error wil be raised. + # + # If the path is already present as is no error will be raised and no + # action will be taken. + + variable paths + + # We use a copy of the path as source during validation, and extend it as + # well. Because we not only have to detect if the new paths are bogus with + # respect to the existing paths, but also between themselves. Otherwise we + # can still add bogus paths, by specifying them in a single call. This + # makes the use of the new paths simpler as well, a trivial assignment of + # the collected paths to the official state var. + + set newpaths $paths + foreach p $args { + if {$p in $newpaths} { + # Ignore a path already on the list. + continue + } + + # Search for paths which are subdirectories of the new one. If there + # are any then the new path violates the restriction about ancestors. + + set pos [lsearch -glob $newpaths ${p}/*] + # Cannot use "in", we need the position for the message. + if {$pos >= 0} { + return -code error \ + "$p is ancestor of existing module path [lindex $newpaths $pos]." + } + + # Now look for existing paths which are ancestors of the new one. This + # reverse question forces us to loop over the existing paths, as each + # element is the pattern, not the new path :( + + foreach ep $newpaths { + if {[string match ${ep}/* $p]} { + return -code error \ + "$p is subdirectory of existing module path $ep." + } + } + + set newpaths [linsert $newpaths 0 $p] + } + + # The validation of the input is complete and successful, and everything + # in newpaths is either an old path, or added. We can now extend the + # official list of paths, a simple assignment is sufficient. + + set paths $newpaths + return +} + +proc ::tcl::tm::remove {args} { + # PART OF THE ::tcl::tm::path ENSEMBLE + # + # Removes the path from the list of module paths. The command is silently + # ignored if the path is not on the list. + + variable paths + + foreach p $args { + set pos [lsearch -exact $paths $p] + if {$pos >= 0} { + set paths [lreplace $paths $pos $pos] + } + } +} + +proc ::tcl::tm::list {} { + # PART OF THE ::tcl::tm::path ENSEMBLE + + variable paths + return $paths +} + +# ::tcl::tm::UnknownHandler -- +# +# Unknown handler for Tcl Modules, i.e. packages in module form. +# +# Arguments +# original - Original [package unknown] procedure. +# name - Name of desired package. +# version - Version of desired package. Can be the +# empty string. +# exact - Either -exact or ommitted. +# +# Name, version, and exact are used to determine satisfaction. The +# original is called iff no satisfaction was achieved. The name is also +# used to compute the directory to target in the search. +# +# Results +# None. +# +# Sideeffects +# May populate the package ifneeded database with additional provide +# scripts. + +proc ::tcl::tm::UnknownHandler {original name args} { + # Import the list of paths to search for packages in module form. + # Import the pattern used to check package names in detail. + + variable paths + variable pkgpattern + + # Without paths to search we can do nothing. (Except falling back to the + # regular search). + + if {[llength $paths]} { + set pkgpath [string map {:: /} $name] + set pkgroot [file dirname $pkgpath] + if {$pkgroot eq "."} { + set pkgroot "" + } + + # We don't remember a copy of the paths while looping. Tcl Modules are + # unable to change the list while we are searching for them. This also + # simplifies the loop, as we cannot get additional directories while + # iterating over the list. A simple foreach is sufficient. + + set satisfied 0 + foreach path $paths { + if {![interp issafe] && ![file exists $path]} { + continue + } + set currentsearchpath [file join $path $pkgroot] + if {![interp issafe] && ![file exists $currentsearchpath]} { + continue + } + set strip [llength [file split $path]] + + # We can't use glob in safe interps, so enclose the following in a + # catch statement, where we get the module files out of the + # subdirectories. In other words, Tcl Modules are not-functional + # in such an interpreter. This is the same as for the command + # "tclPkgUnknown", i.e. the search for regular packages. + + catch { + # We always look for _all_ possible modules in the current + # path, to get the max result out of the glob. + + foreach file [glob -nocomplain -directory $currentsearchpath *.tm] { + set pkgfilename [join [lrange [file split $file] $strip end] ::] + + if {![regexp -- $pkgpattern $pkgfilename --> pkgname pkgversion]} { + # Ignore everything not matching our pattern for + # package names. + continue + } + try { + package vcompare $pkgversion 0 + } on error {} { + # Ignore everything where the version part is not + # acceptable to "package vcompare". + continue + } + + if {[package ifneeded $pkgname $pkgversion] ne {}} { + # There's already a provide script registered for + # this version of this package. Since all units of + # code claiming to be the same version of the same + # package ought to be identical, just stick with + # the one we already have. + continue + } + + # We have found a candidate, generate a "provide script" + # for it, and remember it. Note that we are using ::list + # to do this; locally [list] means something else without + # the namespace specifier. + + # NOTE. When making changes to the format of the provide + # command generated below CHECK that the 'LOCATE' + # procedure in core file 'platform/shell.tcl' still + # understands it, or, if not, update its implementation + # appropriately. + # + # Right now LOCATE's implementation assumes that the path + # of the package file is the last element in the list. + + package ifneeded $pkgname $pkgversion \ + "[::list package provide $pkgname $pkgversion];[::list source -encoding utf-8 $file]" + + # We abort in this unknown handler only if we got a + # satisfying candidate for the requested package. + # Otherwise we still have to fallback to the regular + # package search to complete the processing. + + if {($pkgname eq $name) + && [package vsatisfies $pkgversion {*}$args]} { + set satisfied 1 + + # We do not abort the loop, and keep adding provide + # scripts for every candidate in the directory, just + # remember to not fall back to the regular search + # anymore. + } + } + } + } + + if {$satisfied} { + return + } + } + + # Fallback to previous command, if existing. See comment above about + # ::list... + + if {[llength $original]} { + uplevel 1 $original [::linsert $args 0 $name] + } +} + +# ::tcl::tm::Defaults -- +# +# Determines the default search paths. +# +# Arguments +# None +# +# Results +# None. +# +# Sideeffects +# May add paths to the list of defaults. + +proc ::tcl::tm::Defaults {} { + global env tcl_platform + + lassign [split [info tclversion] .] major minor + set exe [file normalize [info nameofexecutable]] + + # Note that we're using [::list], not [list] because [list] means + # something other than [::list] in this namespace. + roots [::list \ + [file dirname [info library]] \ + [file join [file dirname [file dirname $exe]] lib] \ + ] + + if {$tcl_platform(platform) eq "windows"} { + set sep ";" + } else { + set sep ":" + } + for {set n $minor} {$n >= 0} {incr n -1} { + foreach ev [::list \ + TCL${major}.${n}_TM_PATH \ + TCL${major}_${n}_TM_PATH \ + ] { + if {![info exists env($ev)]} continue + foreach p [split $env($ev) $sep] { + path add $p + } + } + } + return +} + +# ::tcl::tm::roots -- +# +# Public API to the module path. See specification. +# +# Arguments +# paths - List of 'root' paths to derive search paths from. +# +# Results +# No result. +# +# Sideeffects +# Calls 'path add' to paths to the list of module search paths. + +proc ::tcl::tm::roots {paths} { + regexp {^(\d+)\.(\d+)} [package present Tcl] - major minor + foreach pa $paths { + set p [file join $pa tcl$major] + for {set n $minor} {$n >= 0} {incr n -1} { + set px [file join $p ${major}.${n}] + if {![interp issafe]} {set px [file normalize $px]} + path add $px + } + set px [file join $p site-tcl] + if {![interp issafe]} {set px [file normalize $px]} + path add $px + } + return +} + +# Initialization. Set up the default paths, then insert the new handler into +# the chain. + +if {![interp issafe]} {::tcl::tm::Defaults} diff --git a/env/tcl/tcl8.6/tzdata/Africa/Abidjan b/env/tcl/tcl8.6/tzdata/Africa/Abidjan new file mode 100644 index 0000000..4b4f5b2 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Africa/Abidjan @@ -0,0 +1,6 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Africa/Abidjan) { + {-9223372036854775808 -968 0 LMT} + {-1830383032 0 0 GMT} +} diff --git a/env/tcl/tcl8.6/tzdata/Africa/Accra b/env/tcl/tcl8.6/tzdata/Africa/Accra new file mode 100644 index 0000000..f43f751 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Africa/Accra @@ -0,0 +1,52 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Africa/Accra) { + {-9223372036854775808 -52 0 LMT} + {-1640995148 0 0 GMT} + {-1556841600 1200 1 GMT} + {-1546388400 0 0 GMT} + {-1525305600 1200 1 GMT} + {-1514852400 0 0 GMT} + {-1493769600 1200 1 GMT} + {-1483316400 0 0 GMT} + {-1462233600 1200 1 GMT} + {-1451780400 0 0 GMT} + {-1430611200 1200 1 GMT} + {-1420158000 0 0 GMT} + {-1399075200 1200 1 GMT} + {-1388622000 0 0 GMT} + {-1367539200 1200 1 GMT} + {-1357086000 0 0 GMT} + {-1336003200 1200 1 GMT} + {-1325550000 0 0 GMT} + {-1304380800 1200 1 GMT} + {-1293927600 0 0 GMT} + {-1272844800 1200 1 GMT} + {-1262391600 0 0 GMT} + {-1241308800 1200 1 GMT} + {-1230855600 0 0 GMT} + {-1209772800 1200 1 GMT} + {-1199319600 0 0 GMT} + {-1178150400 1200 1 GMT} + {-1167697200 0 0 GMT} + {-1146614400 1200 1 GMT} + {-1136161200 0 0 GMT} + {-1115078400 1200 1 GMT} + {-1104625200 0 0 GMT} + {-1083542400 1200 1 GMT} + {-1073089200 0 0 GMT} + {-1051920000 1200 1 GMT} + {-1041466800 0 0 GMT} + {-1020384000 1200 1 GMT} + {-1009930800 0 0 GMT} + {-988848000 1200 1 GMT} + {-978394800 0 0 GMT} + {-957312000 1200 1 GMT} + {-946858800 0 0 GMT} + {-925689600 1200 1 GMT} + {-915236400 0 0 GMT} + {-894153600 1200 1 GMT} + {-883700400 0 0 GMT} + {-862617600 1200 1 GMT} + {-852164400 0 0 GMT} +} diff --git a/env/tcl/tcl8.6/tzdata/Africa/Addis_Ababa b/env/tcl/tcl8.6/tzdata/Africa/Addis_Ababa new file mode 100644 index 0000000..7aa5653 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Africa/Addis_Ababa @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(Africa/Nairobi)]} { + LoadTimeZoneFile Africa/Nairobi +} +set TZData(:Africa/Addis_Ababa) $TZData(:Africa/Nairobi) diff --git a/env/tcl/tcl8.6/tzdata/Africa/Algiers b/env/tcl/tcl8.6/tzdata/Africa/Algiers new file mode 100644 index 0000000..fe4de22 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Africa/Algiers @@ -0,0 +1,39 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Africa/Algiers) { + {-9223372036854775808 732 0 LMT} + {-2486679072 561 0 PMT} + {-1855958961 0 0 WET} + {-1689814800 3600 1 WEST} + {-1680397200 0 0 WET} + {-1665363600 3600 1 WEST} + {-1648342800 0 0 WET} + {-1635123600 3600 1 WEST} + {-1616893200 0 0 WET} + {-1604278800 3600 1 WEST} + {-1585443600 0 0 WET} + {-1574038800 3600 1 WEST} + {-1552266000 0 0 WET} + {-1539997200 3600 1 WEST} + {-1531443600 0 0 WET} + {-956365200 3600 1 WEST} + {-950486400 0 0 WET} + {-942012000 3600 0 CET} + {-812502000 7200 1 CEST} + {-796262400 3600 0 CET} + {-781052400 7200 1 CEST} + {-766630800 3600 0 CET} + {-733280400 0 0 WET} + {-439430400 3600 0 CET} + {-212029200 0 0 WET} + {41468400 3600 1 WEST} + {54774000 0 0 WET} + {231724800 3600 1 WEST} + {246240000 3600 0 CET} + {259545600 7200 1 CEST} + {275274000 3600 0 CET} + {309740400 0 0 WET} + {325468800 3600 1 WEST} + {341802000 0 0 WET} + {357523200 3600 0 CET} +} diff --git a/env/tcl/tcl8.6/tzdata/Africa/Asmara b/env/tcl/tcl8.6/tzdata/Africa/Asmara new file mode 100644 index 0000000..3d33c94 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Africa/Asmara @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(Africa/Nairobi)]} { + LoadTimeZoneFile Africa/Nairobi +} +set TZData(:Africa/Asmara) $TZData(:Africa/Nairobi) diff --git a/env/tcl/tcl8.6/tzdata/Africa/Asmera b/env/tcl/tcl8.6/tzdata/Africa/Asmera new file mode 100644 index 0000000..ca8d123 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Africa/Asmera @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(Africa/Nairobi)]} { + LoadTimeZoneFile Africa/Nairobi +} +set TZData(:Africa/Asmera) $TZData(:Africa/Nairobi) diff --git a/env/tcl/tcl8.6/tzdata/Africa/Bamako b/env/tcl/tcl8.6/tzdata/Africa/Bamako new file mode 100644 index 0000000..0818378 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Africa/Bamako @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(Africa/Abidjan)]} { + LoadTimeZoneFile Africa/Abidjan +} +set TZData(:Africa/Bamako) $TZData(:Africa/Abidjan) diff --git a/env/tcl/tcl8.6/tzdata/Africa/Bangui b/env/tcl/tcl8.6/tzdata/Africa/Bangui new file mode 100644 index 0000000..0326a6c --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Africa/Bangui @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(Africa/Lagos)]} { + LoadTimeZoneFile Africa/Lagos +} +set TZData(:Africa/Bangui) $TZData(:Africa/Lagos) diff --git a/env/tcl/tcl8.6/tzdata/Africa/Banjul b/env/tcl/tcl8.6/tzdata/Africa/Banjul new file mode 100644 index 0000000..ded0e57 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Africa/Banjul @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(Africa/Abidjan)]} { + LoadTimeZoneFile Africa/Abidjan +} +set TZData(:Africa/Banjul) $TZData(:Africa/Abidjan) diff --git a/env/tcl/tcl8.6/tzdata/Africa/Bissau b/env/tcl/tcl8.6/tzdata/Africa/Bissau new file mode 100644 index 0000000..e0568fb --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Africa/Bissau @@ -0,0 +1,7 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Africa/Bissau) { + {-9223372036854775808 -3740 0 LMT} + {-1830380400 -3600 0 -01} + {157770000 0 0 GMT} +} diff --git a/env/tcl/tcl8.6/tzdata/Africa/Blantyre b/env/tcl/tcl8.6/tzdata/Africa/Blantyre new file mode 100644 index 0000000..9a404c5 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Africa/Blantyre @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(Africa/Maputo)]} { + LoadTimeZoneFile Africa/Maputo +} +set TZData(:Africa/Blantyre) $TZData(:Africa/Maputo) diff --git a/env/tcl/tcl8.6/tzdata/Africa/Brazzaville b/env/tcl/tcl8.6/tzdata/Africa/Brazzaville new file mode 100644 index 0000000..111eff4 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Africa/Brazzaville @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(Africa/Lagos)]} { + LoadTimeZoneFile Africa/Lagos +} +set TZData(:Africa/Brazzaville) $TZData(:Africa/Lagos) diff --git a/env/tcl/tcl8.6/tzdata/Africa/Bujumbura b/env/tcl/tcl8.6/tzdata/Africa/Bujumbura new file mode 100644 index 0000000..1e463d8 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Africa/Bujumbura @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(Africa/Maputo)]} { + LoadTimeZoneFile Africa/Maputo +} +set TZData(:Africa/Bujumbura) $TZData(:Africa/Maputo) diff --git a/env/tcl/tcl8.6/tzdata/Africa/Cairo b/env/tcl/tcl8.6/tzdata/Africa/Cairo new file mode 100644 index 0000000..aaeec54 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Africa/Cairo @@ -0,0 +1,132 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Africa/Cairo) { + {-9223372036854775808 7509 0 LMT} + {-2185409109 7200 0 EET} + {-929844000 10800 1 EEST} + {-923108400 7200 0 EET} + {-906170400 10800 1 EEST} + {-892868400 7200 0 EET} + {-875844000 10800 1 EEST} + {-857790000 7200 0 EET} + {-844308000 10800 1 EEST} + {-825822000 7200 0 EET} + {-812685600 10800 1 EEST} + {-794199600 7200 0 EET} + {-779853600 10800 1 EEST} + {-762663600 7200 0 EET} + {-399088800 10800 1 EEST} + {-386650800 7200 0 EET} + {-368330400 10800 1 EEST} + {-355114800 7200 0 EET} + {-336790800 10800 1 EEST} + {-323654400 7200 0 EET} + {-305168400 10800 1 EEST} + {-292032000 7200 0 EET} + {-273632400 10800 1 EEST} + {-260496000 7200 0 EET} + {-242096400 10800 1 EEST} + {-228960000 7200 0 EET} + {-210560400 10800 1 EEST} + {-197424000 7200 0 EET} + {-178938000 10800 1 EEST} + {-165801600 7200 0 EET} + {-147402000 10800 1 EEST} + {-134265600 7200 0 EET} + {-115866000 10800 1 EEST} + {-102643200 7200 0 EET} + {-84330000 10800 1 EEST} + {-71107200 7200 0 EET} + {-52707600 10800 1 EEST} + {-39484800 7200 0 EET} + {-21171600 10800 1 EEST} + {-7948800 7200 0 EET} + {10364400 10800 1 EEST} + {23587200 7200 0 EET} + {41900400 10800 1 EEST} + {55123200 7200 0 EET} + {73522800 10800 1 EEST} + {86745600 7200 0 EET} + {105058800 10800 1 EEST} + {118281600 7200 0 EET} + {136594800 10800 1 EEST} + {149817600 7200 0 EET} + {168130800 10800 1 EEST} + {181353600 7200 0 EET} + {199753200 10800 1 EEST} + {212976000 7200 0 EET} + {231289200 10800 1 EEST} + {244512000 7200 0 EET} + {262825200 10800 1 EEST} + {276048000 7200 0 EET} + {294361200 10800 1 EEST} + {307584000 7200 0 EET} + {325983600 10800 1 EEST} + {339206400 7200 0 EET} + {357519600 10800 1 EEST} + {370742400 7200 0 EET} + {396399600 10800 1 EEST} + {402278400 7200 0 EET} + {426812400 10800 1 EEST} + {433814400 7200 0 EET} + {452214000 10800 1 EEST} + {465436800 7200 0 EET} + {483750000 10800 1 EEST} + {496972800 7200 0 EET} + {515286000 10800 1 EEST} + {528508800 7200 0 EET} + {546822000 10800 1 EEST} + {560044800 7200 0 EET} + {578444400 10800 1 EEST} + {591667200 7200 0 EET} + {610412400 10800 1 EEST} + {623203200 7200 0 EET} + {641516400 10800 1 EEST} + {654739200 7200 0 EET} + {673052400 10800 1 EEST} + {686275200 7200 0 EET} + {704674800 10800 1 EEST} + {717897600 7200 0 EET} + {736210800 10800 1 EEST} + {749433600 7200 0 EET} + {767746800 10800 1 EEST} + {780969600 7200 0 EET} + {799020000 10800 1 EEST} + {812322000 7200 0 EET} + {830469600 10800 1 EEST} + {843771600 7200 0 EET} + {861919200 10800 1 EEST} + {875221200 7200 0 EET} + {893368800 10800 1 EEST} + {906670800 7200 0 EET} + {925423200 10800 1 EEST} + {938725200 7200 0 EET} + {956872800 10800 1 EEST} + {970174800 7200 0 EET} + {988322400 10800 1 EEST} + {1001624400 7200 0 EET} + {1019772000 10800 1 EEST} + {1033074000 7200 0 EET} + {1051221600 10800 1 EEST} + {1064523600 7200 0 EET} + {1083276000 10800 1 EEST} + {1096578000 7200 0 EET} + {1114725600 10800 1 EEST} + {1128027600 7200 0 EET} + {1146175200 10800 1 EEST} + {1158872400 7200 0 EET} + {1177624800 10800 1 EEST} + {1189112400 7200 0 EET} + {1209074400 10800 1 EEST} + {1219957200 7200 0 EET} + {1240524000 10800 1 EEST} + {1250802000 7200 0 EET} + {1272578400 10800 1 EEST} + {1281474000 7200 0 EET} + {1284069600 10800 1 EEST} + {1285880400 7200 0 EET} + {1400191200 10800 1 EEST} + {1403816400 7200 0 EET} + {1406844000 10800 1 EEST} + {1411678800 7200 0 EET} +} diff --git a/env/tcl/tcl8.6/tzdata/Africa/Casablanca b/env/tcl/tcl8.6/tzdata/Africa/Casablanca new file mode 100644 index 0000000..3207e59 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Africa/Casablanca @@ -0,0 +1,60 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Africa/Casablanca) { + {-9223372036854775808 -1820 0 LMT} + {-1773012580 0 0 +00} + {-956361600 3600 1 +00} + {-950490000 0 0 +00} + {-942019200 3600 1 +00} + {-761187600 0 0 +00} + {-617241600 3600 1 +00} + {-605149200 0 0 +00} + {-81432000 3600 1 +00} + {-71110800 0 0 +00} + {141264000 3600 1 +00} + {147222000 0 0 +00} + {199756800 3600 1 +00} + {207702000 0 0 +00} + {231292800 3600 1 +00} + {244249200 0 0 +00} + {265507200 3600 1 +00} + {271033200 0 0 +00} + {448243200 3600 0 +01} + {504918000 0 0 +00} + {1212278400 3600 1 +00} + {1220223600 0 0 +00} + {1243814400 3600 1 +00} + {1250809200 0 0 +00} + {1272758400 3600 1 +00} + {1281222000 0 0 +00} + {1301788800 3600 1 +00} + {1312066800 0 0 +00} + {1335664800 3600 1 +00} + {1342749600 0 0 +00} + {1345428000 3600 1 +00} + {1348970400 0 0 +00} + {1367114400 3600 1 +00} + {1373162400 0 0 +00} + {1376100000 3600 1 +00} + {1382839200 0 0 +00} + {1396144800 3600 1 +00} + {1403920800 0 0 +00} + {1406944800 3600 1 +00} + {1414288800 0 0 +00} + {1427594400 3600 1 +00} + {1434247200 0 0 +00} + {1437271200 3600 1 +00} + {1445738400 0 0 +00} + {1459044000 3600 1 +00} + {1465092000 0 0 +00} + {1468116000 3600 1 +00} + {1477792800 0 0 +00} + {1490493600 3600 1 +00} + {1495332000 0 0 +00} + {1498960800 3600 1 +00} + {1509242400 0 0 +00} + {1521943200 3600 1 +00} + {1526176800 0 0 +00} + {1529200800 3600 1 +00} + {1540598400 3600 0 +01} +} diff --git a/env/tcl/tcl8.6/tzdata/Africa/Ceuta b/env/tcl/tcl8.6/tzdata/Africa/Ceuta new file mode 100644 index 0000000..18af8c1 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Africa/Ceuta @@ -0,0 +1,259 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Africa/Ceuta) { + {-9223372036854775808 -1276 0 LMT} + {-2177452800 0 0 WET} + {-1630112400 3600 1 WEST} + {-1616810400 0 0 WET} + {-1451692800 0 0 WET} + {-1442451600 3600 1 WEST} + {-1427673600 0 0 WET} + {-1379293200 3600 1 WEST} + {-1364774400 0 0 WET} + {-1348448400 3600 1 WEST} + {-1333324800 0 0 WET} + {-1316390400 3600 1 WEST} + {-1301270400 0 0 WET} + {-1293840000 0 0 WET} + {-94694400 0 0 WET} + {-81432000 3600 1 WEST} + {-71110800 0 0 WET} + {141264000 3600 1 WEST} + {147222000 0 0 WET} + {199756800 3600 1 WEST} + {207702000 0 0 WET} + {231292800 3600 1 WEST} + {244249200 0 0 WET} + {265507200 3600 1 WEST} + {271033200 0 0 WET} + {448243200 3600 0 CET} + {504918000 3600 0 CET} + {512528400 7200 1 CEST} + {528253200 3600 0 CET} + {543978000 7200 1 CEST} + {559702800 3600 0 CET} + {575427600 7200 1 CEST} + {591152400 3600 0 CET} + {606877200 7200 1 CEST} + {622602000 3600 0 CET} + {638326800 7200 1 CEST} + {654656400 3600 0 CET} + {670381200 7200 1 CEST} + {686106000 3600 0 CET} + {701830800 7200 1 CEST} + {717555600 3600 0 CET} + {733280400 7200 1 CEST} + {749005200 3600 0 CET} + {764730000 7200 1 CEST} + {780454800 3600 0 CET} + {796179600 7200 1 CEST} + {811904400 3600 0 CET} + {828234000 7200 1 CEST} + {846378000 3600 0 CET} + {859683600 7200 1 CEST} + {877827600 3600 0 CET} + {891133200 7200 1 CEST} + {909277200 3600 0 CET} + {922582800 7200 1 CEST} + {941331600 3600 0 CET} + {954032400 7200 1 CEST} + {972781200 3600 0 CET} + {985482000 7200 1 CEST} + {1004230800 3600 0 CET} + {1017536400 7200 1 CEST} + {1035680400 3600 0 CET} + {1048986000 7200 1 CEST} + {1067130000 3600 0 CET} + {1080435600 7200 1 CEST} + {1099184400 3600 0 CET} + {1111885200 7200 1 CEST} + {1130634000 3600 0 CET} + {1143334800 7200 1 CEST} + {1162083600 3600 0 CET} + {1174784400 7200 1 CEST} + {1193533200 3600 0 CET} + {1206838800 7200 1 CEST} + {1224982800 3600 0 CET} + {1238288400 7200 1 CEST} + {1256432400 3600 0 CET} + {1269738000 7200 1 CEST} + {1288486800 3600 0 CET} + {1301187600 7200 1 CEST} + {1319936400 3600 0 CET} + {1332637200 7200 1 CEST} + {1351386000 3600 0 CET} + {1364691600 7200 1 CEST} + {1382835600 3600 0 CET} + {1396141200 7200 1 CEST} + {1414285200 3600 0 CET} + {1427590800 7200 1 CEST} + {1445734800 3600 0 CET} + {1459040400 7200 1 CEST} + {1477789200 3600 0 CET} + {1490490000 7200 1 CEST} + {1509238800 3600 0 CET} + {1521939600 7200 1 CEST} + {1540688400 3600 0 CET} + {1553994000 7200 1 CEST} + {1572138000 3600 0 CET} + {1585443600 7200 1 CEST} + {1603587600 3600 0 CET} + {1616893200 7200 1 CEST} + {1635642000 3600 0 CET} + {1648342800 7200 1 CEST} + {1667091600 3600 0 CET} + {1679792400 7200 1 CEST} + {1698541200 3600 0 CET} + {1711846800 7200 1 CEST} + {1729990800 3600 0 CET} + {1743296400 7200 1 CEST} + {1761440400 3600 0 CET} + {1774746000 7200 1 CEST} + {1792890000 3600 0 CET} + {1806195600 7200 1 CEST} + {1824944400 3600 0 CET} + {1837645200 7200 1 CEST} + {1856394000 3600 0 CET} + {1869094800 7200 1 CEST} + {1887843600 3600 0 CET} + {1901149200 7200 1 CEST} + {1919293200 3600 0 CET} + {1932598800 7200 1 CEST} + {1950742800 3600 0 CET} + {1964048400 7200 1 CEST} + {1982797200 3600 0 CET} + {1995498000 7200 1 CEST} + {2014246800 3600 0 CET} + {2026947600 7200 1 CEST} + {2045696400 3600 0 CET} + {2058397200 7200 1 CEST} + {2077146000 3600 0 CET} + {2090451600 7200 1 CEST} + {2108595600 3600 0 CET} + {2121901200 7200 1 CEST} + {2140045200 3600 0 CET} + {2153350800 7200 1 CEST} + {2172099600 3600 0 CET} + {2184800400 7200 1 CEST} + {2203549200 3600 0 CET} + {2216250000 7200 1 CEST} + {2234998800 3600 0 CET} + {2248304400 7200 1 CEST} + {2266448400 3600 0 CET} + {2279754000 7200 1 CEST} + {2297898000 3600 0 CET} + {2311203600 7200 1 CEST} + {2329347600 3600 0 CET} + {2342653200 7200 1 CEST} + {2361402000 3600 0 CET} + {2374102800 7200 1 CEST} + {2392851600 3600 0 CET} + {2405552400 7200 1 CEST} + {2424301200 3600 0 CET} + {2437606800 7200 1 CEST} + {2455750800 3600 0 CET} + {2469056400 7200 1 CEST} + {2487200400 3600 0 CET} + {2500506000 7200 1 CEST} + {2519254800 3600 0 CET} + {2531955600 7200 1 CEST} + {2550704400 3600 0 CET} + {2563405200 7200 1 CEST} + {2582154000 3600 0 CET} + {2595459600 7200 1 CEST} + {2613603600 3600 0 CET} + {2626909200 7200 1 CEST} + {2645053200 3600 0 CET} + {2658358800 7200 1 CEST} + {2676502800 3600 0 CET} + {2689808400 7200 1 CEST} + {2708557200 3600 0 CET} + {2721258000 7200 1 CEST} + {2740006800 3600 0 CET} + {2752707600 7200 1 CEST} + {2771456400 3600 0 CET} + {2784762000 7200 1 CEST} + {2802906000 3600 0 CET} + {2816211600 7200 1 CEST} + {2834355600 3600 0 CET} + {2847661200 7200 1 CEST} + {2866410000 3600 0 CET} + {2879110800 7200 1 CEST} + {2897859600 3600 0 CET} + {2910560400 7200 1 CEST} + {2929309200 3600 0 CET} + {2942010000 7200 1 CEST} + {2960758800 3600 0 CET} + {2974064400 7200 1 CEST} + {2992208400 3600 0 CET} + {3005514000 7200 1 CEST} + {3023658000 3600 0 CET} + {3036963600 7200 1 CEST} + {3055712400 3600 0 CET} + {3068413200 7200 1 CEST} + {3087162000 3600 0 CET} + {3099862800 7200 1 CEST} + {3118611600 3600 0 CET} + {3131917200 7200 1 CEST} + {3150061200 3600 0 CET} + {3163366800 7200 1 CEST} + {3181510800 3600 0 CET} + {3194816400 7200 1 CEST} + {3212960400 3600 0 CET} + {3226266000 7200 1 CEST} + {3245014800 3600 0 CET} + {3257715600 7200 1 CEST} + {3276464400 3600 0 CET} + {3289165200 7200 1 CEST} + {3307914000 3600 0 CET} + {3321219600 7200 1 CEST} + {3339363600 3600 0 CET} + {3352669200 7200 1 CEST} + {3370813200 3600 0 CET} + {3384118800 7200 1 CEST} + {3402867600 3600 0 CET} + {3415568400 7200 1 CEST} + {3434317200 3600 0 CET} + {3447018000 7200 1 CEST} + {3465766800 3600 0 CET} + {3479072400 7200 1 CEST} + {3497216400 3600 0 CET} + {3510522000 7200 1 CEST} + {3528666000 3600 0 CET} + {3541971600 7200 1 CEST} + {3560115600 3600 0 CET} + {3573421200 7200 1 CEST} + {3592170000 3600 0 CET} + {3604870800 7200 1 CEST} + {3623619600 3600 0 CET} + {3636320400 7200 1 CEST} + {3655069200 3600 0 CET} + {3668374800 7200 1 CEST} + {3686518800 3600 0 CET} + {3699824400 7200 1 CEST} + {3717968400 3600 0 CET} + {3731274000 7200 1 CEST} + {3750022800 3600 0 CET} + {3762723600 7200 1 CEST} + {3781472400 3600 0 CET} + {3794173200 7200 1 CEST} + {3812922000 3600 0 CET} + {3825622800 7200 1 CEST} + {3844371600 3600 0 CET} + {3857677200 7200 1 CEST} + {3875821200 3600 0 CET} + {3889126800 7200 1 CEST} + {3907270800 3600 0 CET} + {3920576400 7200 1 CEST} + {3939325200 3600 0 CET} + {3952026000 7200 1 CEST} + {3970774800 3600 0 CET} + {3983475600 7200 1 CEST} + {4002224400 3600 0 CET} + {4015530000 7200 1 CEST} + {4033674000 3600 0 CET} + {4046979600 7200 1 CEST} + {4065123600 3600 0 CET} + {4078429200 7200 1 CEST} + {4096573200 3600 0 CET} +} diff --git a/env/tcl/tcl8.6/tzdata/Africa/Conakry b/env/tcl/tcl8.6/tzdata/Africa/Conakry new file mode 100644 index 0000000..4373720 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Africa/Conakry @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(Africa/Abidjan)]} { + LoadTimeZoneFile Africa/Abidjan +} +set TZData(:Africa/Conakry) $TZData(:Africa/Abidjan) diff --git a/env/tcl/tcl8.6/tzdata/Africa/Dakar b/env/tcl/tcl8.6/tzdata/Africa/Dakar new file mode 100644 index 0000000..78e800c --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Africa/Dakar @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(Africa/Abidjan)]} { + LoadTimeZoneFile Africa/Abidjan +} +set TZData(:Africa/Dakar) $TZData(:Africa/Abidjan) diff --git a/env/tcl/tcl8.6/tzdata/Africa/Dar_es_Salaam b/env/tcl/tcl8.6/tzdata/Africa/Dar_es_Salaam new file mode 100644 index 0000000..00e8d4e --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Africa/Dar_es_Salaam @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(Africa/Nairobi)]} { + LoadTimeZoneFile Africa/Nairobi +} +set TZData(:Africa/Dar_es_Salaam) $TZData(:Africa/Nairobi) diff --git a/env/tcl/tcl8.6/tzdata/Africa/Djibouti b/env/tcl/tcl8.6/tzdata/Africa/Djibouti new file mode 100644 index 0000000..859ea32 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Africa/Djibouti @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(Africa/Nairobi)]} { + LoadTimeZoneFile Africa/Nairobi +} +set TZData(:Africa/Djibouti) $TZData(:Africa/Nairobi) diff --git a/env/tcl/tcl8.6/tzdata/Africa/Douala b/env/tcl/tcl8.6/tzdata/Africa/Douala new file mode 100644 index 0000000..892b16a --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Africa/Douala @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(Africa/Lagos)]} { + LoadTimeZoneFile Africa/Lagos +} +set TZData(:Africa/Douala) $TZData(:Africa/Lagos) diff --git a/env/tcl/tcl8.6/tzdata/Africa/El_Aaiun b/env/tcl/tcl8.6/tzdata/Africa/El_Aaiun new file mode 100644 index 0000000..e0f5e1c --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Africa/El_Aaiun @@ -0,0 +1,49 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Africa/El_Aaiun) { + {-9223372036854775808 -3168 0 LMT} + {-1136070432 -3600 0 -01} + {198291600 0 0 +00} + {199756800 3600 1 +00} + {207702000 0 0 +00} + {231292800 3600 1 +00} + {244249200 0 0 +00} + {265507200 3600 1 +00} + {271033200 0 0 +00} + {1212278400 3600 1 +00} + {1220223600 0 0 +00} + {1243814400 3600 1 +00} + {1250809200 0 0 +00} + {1272758400 3600 1 +00} + {1281222000 0 0 +00} + {1301788800 3600 1 +00} + {1312066800 0 0 +00} + {1335664800 3600 1 +00} + {1342749600 0 0 +00} + {1345428000 3600 1 +00} + {1348970400 0 0 +00} + {1367114400 3600 1 +00} + {1373162400 0 0 +00} + {1376100000 3600 1 +00} + {1382839200 0 0 +00} + {1396144800 3600 1 +00} + {1403920800 0 0 +00} + {1406944800 3600 1 +00} + {1414288800 0 0 +00} + {1427594400 3600 1 +00} + {1434247200 0 0 +00} + {1437271200 3600 1 +00} + {1445738400 0 0 +00} + {1459044000 3600 1 +00} + {1465092000 0 0 +00} + {1468116000 3600 1 +00} + {1477792800 0 0 +00} + {1490493600 3600 1 +00} + {1495332000 0 0 +00} + {1498960800 3600 1 +00} + {1509242400 0 0 +00} + {1521943200 3600 1 +00} + {1526176800 0 0 +00} + {1529200800 3600 1 +00} + {1540598400 3600 0 +01} +} diff --git a/env/tcl/tcl8.6/tzdata/Africa/Freetown b/env/tcl/tcl8.6/tzdata/Africa/Freetown new file mode 100644 index 0000000..4a8e2e1 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Africa/Freetown @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(Africa/Abidjan)]} { + LoadTimeZoneFile Africa/Abidjan +} +set TZData(:Africa/Freetown) $TZData(:Africa/Abidjan) diff --git a/env/tcl/tcl8.6/tzdata/Africa/Gaborone b/env/tcl/tcl8.6/tzdata/Africa/Gaborone new file mode 100644 index 0000000..56c0772 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Africa/Gaborone @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(Africa/Maputo)]} { + LoadTimeZoneFile Africa/Maputo +} +set TZData(:Africa/Gaborone) $TZData(:Africa/Maputo) diff --git a/env/tcl/tcl8.6/tzdata/Africa/Harare b/env/tcl/tcl8.6/tzdata/Africa/Harare new file mode 100644 index 0000000..644be26 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Africa/Harare @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(Africa/Maputo)]} { + LoadTimeZoneFile Africa/Maputo +} +set TZData(:Africa/Harare) $TZData(:Africa/Maputo) diff --git a/env/tcl/tcl8.6/tzdata/Africa/Johannesburg b/env/tcl/tcl8.6/tzdata/Africa/Johannesburg new file mode 100644 index 0000000..b9a8348 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Africa/Johannesburg @@ -0,0 +1,11 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Africa/Johannesburg) { + {-9223372036854775808 6720 0 LMT} + {-2458173120 5400 0 SAST} + {-2109288600 7200 0 SAST} + {-860976000 10800 1 SAST} + {-845254800 7200 0 SAST} + {-829526400 10800 1 SAST} + {-813805200 7200 0 SAST} +} diff --git a/env/tcl/tcl8.6/tzdata/Africa/Juba b/env/tcl/tcl8.6/tzdata/Africa/Juba new file mode 100644 index 0000000..a0dbf5e --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Africa/Juba @@ -0,0 +1,39 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Africa/Juba) { + {-9223372036854775808 7588 0 LMT} + {-1230775588 7200 0 CAT} + {10360800 10800 1 CAST} + {24786000 7200 0 CAT} + {41810400 10800 1 CAST} + {56322000 7200 0 CAT} + {73432800 10800 1 CAST} + {87944400 7200 0 CAT} + {104882400 10800 1 CAST} + {119480400 7200 0 CAT} + {136332000 10800 1 CAST} + {151016400 7200 0 CAT} + {167781600 10800 1 CAST} + {182552400 7200 0 CAT} + {199231200 10800 1 CAST} + {214174800 7200 0 CAT} + {230680800 10800 1 CAST} + {245710800 7200 0 CAT} + {262735200 10800 1 CAST} + {277246800 7200 0 CAT} + {294184800 10800 1 CAST} + {308782800 7200 0 CAT} + {325634400 10800 1 CAST} + {340405200 7200 0 CAT} + {357084000 10800 1 CAST} + {371941200 7200 0 CAT} + {388533600 10800 1 CAST} + {403477200 7200 0 CAT} + {419983200 10800 1 CAST} + {435013200 7200 0 CAT} + {452037600 10800 1 CAST} + {466635600 7200 0 CAT} + {483487200 10800 1 CAST} + {498171600 7200 0 CAT} + {947930400 10800 0 EAT} +} diff --git a/env/tcl/tcl8.6/tzdata/Africa/Kampala b/env/tcl/tcl8.6/tzdata/Africa/Kampala new file mode 100644 index 0000000..1fbaffc --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Africa/Kampala @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(Africa/Nairobi)]} { + LoadTimeZoneFile Africa/Nairobi +} +set TZData(:Africa/Kampala) $TZData(:Africa/Nairobi) diff --git a/env/tcl/tcl8.6/tzdata/Africa/Khartoum b/env/tcl/tcl8.6/tzdata/Africa/Khartoum new file mode 100644 index 0000000..dc441f6 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Africa/Khartoum @@ -0,0 +1,40 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Africa/Khartoum) { + {-9223372036854775808 7808 0 LMT} + {-1230775808 7200 0 CAT} + {10360800 10800 1 CAST} + {24786000 7200 0 CAT} + {41810400 10800 1 CAST} + {56322000 7200 0 CAT} + {73432800 10800 1 CAST} + {87944400 7200 0 CAT} + {104882400 10800 1 CAST} + {119480400 7200 0 CAT} + {136332000 10800 1 CAST} + {151016400 7200 0 CAT} + {167781600 10800 1 CAST} + {182552400 7200 0 CAT} + {199231200 10800 1 CAST} + {214174800 7200 0 CAT} + {230680800 10800 1 CAST} + {245710800 7200 0 CAT} + {262735200 10800 1 CAST} + {277246800 7200 0 CAT} + {294184800 10800 1 CAST} + {308782800 7200 0 CAT} + {325634400 10800 1 CAST} + {340405200 7200 0 CAT} + {357084000 10800 1 CAST} + {371941200 7200 0 CAT} + {388533600 10800 1 CAST} + {403477200 7200 0 CAT} + {419983200 10800 1 CAST} + {435013200 7200 0 CAT} + {452037600 10800 1 CAST} + {466635600 7200 0 CAT} + {483487200 10800 1 CAST} + {498171600 7200 0 CAT} + {947930400 10800 0 EAT} + {1509483600 7200 0 CAT} +} diff --git a/env/tcl/tcl8.6/tzdata/Africa/Kigali b/env/tcl/tcl8.6/tzdata/Africa/Kigali new file mode 100644 index 0000000..192e0e8 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Africa/Kigali @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(Africa/Maputo)]} { + LoadTimeZoneFile Africa/Maputo +} +set TZData(:Africa/Kigali) $TZData(:Africa/Maputo) diff --git a/env/tcl/tcl8.6/tzdata/Africa/Kinshasa b/env/tcl/tcl8.6/tzdata/Africa/Kinshasa new file mode 100644 index 0000000..04dc62e --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Africa/Kinshasa @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(Africa/Lagos)]} { + LoadTimeZoneFile Africa/Lagos +} +set TZData(:Africa/Kinshasa) $TZData(:Africa/Lagos) diff --git a/env/tcl/tcl8.6/tzdata/Africa/Lagos b/env/tcl/tcl8.6/tzdata/Africa/Lagos new file mode 100644 index 0000000..079572f --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Africa/Lagos @@ -0,0 +1,6 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Africa/Lagos) { + {-9223372036854775808 816 0 LMT} + {-1588464816 3600 0 WAT} +} diff --git a/env/tcl/tcl8.6/tzdata/Africa/Libreville b/env/tcl/tcl8.6/tzdata/Africa/Libreville new file mode 100644 index 0000000..ba1f686 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Africa/Libreville @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(Africa/Lagos)]} { + LoadTimeZoneFile Africa/Lagos +} +set TZData(:Africa/Libreville) $TZData(:Africa/Lagos) diff --git a/env/tcl/tcl8.6/tzdata/Africa/Lome b/env/tcl/tcl8.6/tzdata/Africa/Lome new file mode 100644 index 0000000..9adecc7 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Africa/Lome @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(Africa/Abidjan)]} { + LoadTimeZoneFile Africa/Abidjan +} +set TZData(:Africa/Lome) $TZData(:Africa/Abidjan) diff --git a/env/tcl/tcl8.6/tzdata/Africa/Luanda b/env/tcl/tcl8.6/tzdata/Africa/Luanda new file mode 100644 index 0000000..8dcd107 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Africa/Luanda @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(Africa/Lagos)]} { + LoadTimeZoneFile Africa/Lagos +} +set TZData(:Africa/Luanda) $TZData(:Africa/Lagos) diff --git a/env/tcl/tcl8.6/tzdata/Africa/Lubumbashi b/env/tcl/tcl8.6/tzdata/Africa/Lubumbashi new file mode 100644 index 0000000..7da101a --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Africa/Lubumbashi @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(Africa/Maputo)]} { + LoadTimeZoneFile Africa/Maputo +} +set TZData(:Africa/Lubumbashi) $TZData(:Africa/Maputo) diff --git a/env/tcl/tcl8.6/tzdata/Africa/Lusaka b/env/tcl/tcl8.6/tzdata/Africa/Lusaka new file mode 100644 index 0000000..bcf519d --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Africa/Lusaka @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(Africa/Maputo)]} { + LoadTimeZoneFile Africa/Maputo +} +set TZData(:Africa/Lusaka) $TZData(:Africa/Maputo) diff --git a/env/tcl/tcl8.6/tzdata/Africa/Malabo b/env/tcl/tcl8.6/tzdata/Africa/Malabo new file mode 100644 index 0000000..7dcee39 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Africa/Malabo @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(Africa/Lagos)]} { + LoadTimeZoneFile Africa/Lagos +} +set TZData(:Africa/Malabo) $TZData(:Africa/Lagos) diff --git a/env/tcl/tcl8.6/tzdata/Africa/Maputo b/env/tcl/tcl8.6/tzdata/Africa/Maputo new file mode 100644 index 0000000..6ee208c --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Africa/Maputo @@ -0,0 +1,6 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Africa/Maputo) { + {-9223372036854775808 7820 0 LMT} + {-2109291020 7200 0 CAT} +} diff --git a/env/tcl/tcl8.6/tzdata/Africa/Maseru b/env/tcl/tcl8.6/tzdata/Africa/Maseru new file mode 100644 index 0000000..665f15d --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Africa/Maseru @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(Africa/Johannesburg)]} { + LoadTimeZoneFile Africa/Johannesburg +} +set TZData(:Africa/Maseru) $TZData(:Africa/Johannesburg) diff --git a/env/tcl/tcl8.6/tzdata/Africa/Mbabane b/env/tcl/tcl8.6/tzdata/Africa/Mbabane new file mode 100644 index 0000000..0edb590 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Africa/Mbabane @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(Africa/Johannesburg)]} { + LoadTimeZoneFile Africa/Johannesburg +} +set TZData(:Africa/Mbabane) $TZData(:Africa/Johannesburg) diff --git a/env/tcl/tcl8.6/tzdata/Africa/Mogadishu b/env/tcl/tcl8.6/tzdata/Africa/Mogadishu new file mode 100644 index 0000000..4220655 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Africa/Mogadishu @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(Africa/Nairobi)]} { + LoadTimeZoneFile Africa/Nairobi +} +set TZData(:Africa/Mogadishu) $TZData(:Africa/Nairobi) diff --git a/env/tcl/tcl8.6/tzdata/Africa/Monrovia b/env/tcl/tcl8.6/tzdata/Africa/Monrovia new file mode 100644 index 0000000..2b311bb --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Africa/Monrovia @@ -0,0 +1,8 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Africa/Monrovia) { + {-9223372036854775808 -2588 0 LMT} + {-2776979812 -2588 0 MMT} + {-1604359012 -2670 0 MMT} + {63593070 0 0 GMT} +} diff --git a/env/tcl/tcl8.6/tzdata/Africa/Nairobi b/env/tcl/tcl8.6/tzdata/Africa/Nairobi new file mode 100644 index 0000000..715dc45 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Africa/Nairobi @@ -0,0 +1,9 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Africa/Nairobi) { + {-9223372036854775808 8836 0 LMT} + {-1309746436 10800 0 EAT} + {-1262314800 9000 0 +0230} + {-946780200 9900 0 +0245} + {-315629100 10800 0 EAT} +} diff --git a/env/tcl/tcl8.6/tzdata/Africa/Ndjamena b/env/tcl/tcl8.6/tzdata/Africa/Ndjamena new file mode 100644 index 0000000..af4daaa --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Africa/Ndjamena @@ -0,0 +1,8 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Africa/Ndjamena) { + {-9223372036854775808 3612 0 LMT} + {-1830387612 3600 0 WAT} + {308703600 7200 1 WAST} + {321314400 3600 0 WAT} +} diff --git a/env/tcl/tcl8.6/tzdata/Africa/Niamey b/env/tcl/tcl8.6/tzdata/Africa/Niamey new file mode 100644 index 0000000..278571d --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Africa/Niamey @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(Africa/Lagos)]} { + LoadTimeZoneFile Africa/Lagos +} +set TZData(:Africa/Niamey) $TZData(:Africa/Lagos) diff --git a/env/tcl/tcl8.6/tzdata/Africa/Nouakchott b/env/tcl/tcl8.6/tzdata/Africa/Nouakchott new file mode 100644 index 0000000..d33b6bc --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Africa/Nouakchott @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(Africa/Abidjan)]} { + LoadTimeZoneFile Africa/Abidjan +} +set TZData(:Africa/Nouakchott) $TZData(:Africa/Abidjan) diff --git a/env/tcl/tcl8.6/tzdata/Africa/Ouagadougou b/env/tcl/tcl8.6/tzdata/Africa/Ouagadougou new file mode 100644 index 0000000..8178c82 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Africa/Ouagadougou @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(Africa/Abidjan)]} { + LoadTimeZoneFile Africa/Abidjan +} +set TZData(:Africa/Ouagadougou) $TZData(:Africa/Abidjan) diff --git a/env/tcl/tcl8.6/tzdata/Africa/Porto-Novo b/env/tcl/tcl8.6/tzdata/Africa/Porto-Novo new file mode 100644 index 0000000..3fa2b51 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Africa/Porto-Novo @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(Africa/Lagos)]} { + LoadTimeZoneFile Africa/Lagos +} +set TZData(:Africa/Porto-Novo) $TZData(:Africa/Lagos) diff --git a/env/tcl/tcl8.6/tzdata/Africa/Sao_Tome b/env/tcl/tcl8.6/tzdata/Africa/Sao_Tome new file mode 100644 index 0000000..6a60f5c --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Africa/Sao_Tome @@ -0,0 +1,8 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Africa/Sao_Tome) { + {-9223372036854775808 1616 0 LMT} + {-2713912016 -2205 0 LMT} + {-1830384000 0 0 GMT} + {1514768400 3600 0 WAT} +} diff --git a/env/tcl/tcl8.6/tzdata/Africa/Timbuktu b/env/tcl/tcl8.6/tzdata/Africa/Timbuktu new file mode 100644 index 0000000..9852d7a --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Africa/Timbuktu @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(Africa/Abidjan)]} { + LoadTimeZoneFile Africa/Abidjan +} +set TZData(:Africa/Timbuktu) $TZData(:Africa/Abidjan) diff --git a/env/tcl/tcl8.6/tzdata/Africa/Tripoli b/env/tcl/tcl8.6/tzdata/Africa/Tripoli new file mode 100644 index 0000000..0e72df4 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Africa/Tripoli @@ -0,0 +1,34 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Africa/Tripoli) { + {-9223372036854775808 3164 0 LMT} + {-1577926364 3600 0 CET} + {-574902000 7200 1 CEST} + {-512175600 7200 1 CEST} + {-449888400 7200 1 CEST} + {-347158800 7200 0 EET} + {378684000 3600 0 CET} + {386463600 7200 1 CEST} + {402271200 3600 0 CET} + {417999600 7200 1 CEST} + {433807200 3600 0 CET} + {449622000 7200 1 CEST} + {465429600 3600 0 CET} + {481590000 7200 1 CEST} + {496965600 3600 0 CET} + {512953200 7200 1 CEST} + {528674400 3600 0 CET} + {544230000 7200 1 CEST} + {560037600 3600 0 CET} + {575852400 7200 1 CEST} + {591660000 3600 0 CET} + {607388400 7200 1 CEST} + {623196000 3600 0 CET} + {641775600 7200 0 EET} + {844034400 3600 0 CET} + {860108400 7200 1 CEST} + {875919600 7200 0 EET} + {1352505600 3600 0 CET} + {1364515200 7200 1 CEST} + {1382662800 7200 0 EET} +} diff --git a/env/tcl/tcl8.6/tzdata/Africa/Tunis b/env/tcl/tcl8.6/tzdata/Africa/Tunis new file mode 100644 index 0000000..0c1db4d --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Africa/Tunis @@ -0,0 +1,39 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Africa/Tunis) { + {-9223372036854775808 2444 0 LMT} + {-2797202444 561 0 PMT} + {-1855958961 3600 0 CET} + {-969242400 7200 1 CEST} + {-950493600 3600 0 CET} + {-941940000 7200 1 CEST} + {-891136800 3600 0 CET} + {-877827600 7200 1 CEST} + {-857257200 3600 0 CET} + {-844556400 7200 1 CEST} + {-842918400 3600 0 CET} + {-842223600 7200 1 CEST} + {-828230400 3600 0 CET} + {-812502000 7200 1 CEST} + {-796269600 3600 0 CET} + {-781052400 7200 1 CEST} + {-766634400 3600 0 CET} + {231202800 7200 1 CEST} + {243903600 3600 0 CET} + {262825200 7200 1 CEST} + {276044400 3600 0 CET} + {581122800 7200 1 CEST} + {591145200 3600 0 CET} + {606870000 7200 1 CEST} + {622594800 3600 0 CET} + {641516400 7200 1 CEST} + {654649200 3600 0 CET} + {1114902000 7200 1 CEST} + {1128038400 3600 0 CET} + {1143334800 7200 1 CEST} + {1162083600 3600 0 CET} + {1174784400 7200 1 CEST} + {1193533200 3600 0 CET} + {1206838800 7200 1 CEST} + {1224982800 3600 0 CET} +} diff --git a/env/tcl/tcl8.6/tzdata/Africa/Windhoek b/env/tcl/tcl8.6/tzdata/Africa/Windhoek new file mode 100644 index 0000000..d03c8b8 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Africa/Windhoek @@ -0,0 +1,58 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Africa/Windhoek) { + {-9223372036854775808 4104 0 LMT} + {-2458170504 5400 0 +0130} + {-2109288600 7200 0 SAST} + {-860976000 10800 1 SAST} + {-845254800 7200 0 SAST} + {637970400 7200 0 CAT} + {764200800 3600 1 WAT} + {778640400 7200 0 CAT} + {796780800 3600 1 WAT} + {810090000 7200 0 CAT} + {828835200 3600 1 WAT} + {841539600 7200 0 CAT} + {860284800 3600 1 WAT} + {873594000 7200 0 CAT} + {891734400 3600 1 WAT} + {905043600 7200 0 CAT} + {923184000 3600 1 WAT} + {936493200 7200 0 CAT} + {954633600 3600 1 WAT} + {967942800 7200 0 CAT} + {986083200 3600 1 WAT} + {999392400 7200 0 CAT} + {1018137600 3600 1 WAT} + {1030842000 7200 0 CAT} + {1049587200 3600 1 WAT} + {1062896400 7200 0 CAT} + {1081036800 3600 1 WAT} + {1094346000 7200 0 CAT} + {1112486400 3600 1 WAT} + {1125795600 7200 0 CAT} + {1143936000 3600 1 WAT} + {1157245200 7200 0 CAT} + {1175385600 3600 1 WAT} + {1188694800 7200 0 CAT} + {1207440000 3600 1 WAT} + {1220749200 7200 0 CAT} + {1238889600 3600 1 WAT} + {1252198800 7200 0 CAT} + {1270339200 3600 1 WAT} + {1283648400 7200 0 CAT} + {1301788800 3600 1 WAT} + {1315098000 7200 0 CAT} + {1333238400 3600 1 WAT} + {1346547600 7200 0 CAT} + {1365292800 3600 1 WAT} + {1377997200 7200 0 CAT} + {1396742400 3600 1 WAT} + {1410051600 7200 0 CAT} + {1428192000 3600 1 WAT} + {1441501200 7200 0 CAT} + {1459641600 3600 1 WAT} + {1472950800 7200 0 CAT} + {1491091200 3600 1 WAT} + {1504400400 7200 0 CAT} +} diff --git a/env/tcl/tcl8.6/tzdata/America/Adak b/env/tcl/tcl8.6/tzdata/America/Adak new file mode 100644 index 0000000..04c4628 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/America/Adak @@ -0,0 +1,276 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:America/Adak) { + {-9223372036854775808 44002 0 LMT} + {-3225223727 -42398 0 LMT} + {-2188944802 -39600 0 NST} + {-883573200 -39600 0 NST} + {-880196400 -36000 1 NWT} + {-769395600 -36000 1 NPT} + {-765374400 -39600 0 NST} + {-757342800 -39600 0 NST} + {-86878800 -39600 0 BST} + {-31496400 -39600 0 BST} + {-21466800 -36000 1 BDT} + {-5745600 -39600 0 BST} + {9982800 -36000 1 BDT} + {25704000 -39600 0 BST} + {41432400 -36000 1 BDT} + {57758400 -39600 0 BST} + {73486800 -36000 1 BDT} + {89208000 -39600 0 BST} + {104936400 -36000 1 BDT} + {120657600 -39600 0 BST} + {126709200 -36000 1 BDT} + {152107200 -39600 0 BST} + {162392400 -36000 1 BDT} + {183556800 -39600 0 BST} + {199285200 -36000 1 BDT} + {215611200 -39600 0 BST} + {230734800 -36000 1 BDT} + {247060800 -39600 0 BST} + {262789200 -36000 1 BDT} + {278510400 -39600 0 BST} + {294238800 -36000 1 BDT} + {309960000 -39600 0 BST} + {325688400 -36000 1 BDT} + {341409600 -39600 0 BST} + {357138000 -36000 1 BDT} + {372859200 -39600 0 BST} + {388587600 -36000 1 BDT} + {404913600 -39600 0 BST} + {420037200 -36000 1 BDT} + {439034400 -36000 0 HST} + {452088000 -32400 1 HDT} + {467809200 -36000 0 HST} + {483537600 -32400 1 HDT} + {499258800 -36000 0 HST} + {514987200 -32400 1 HDT} + {530708400 -36000 0 HST} + {544622400 -32400 1 HDT} + {562158000 -36000 0 HST} + {576072000 -32400 1 HDT} + {594212400 -36000 0 HST} + {607521600 -32400 1 HDT} + {625662000 -36000 0 HST} + {638971200 -32400 1 HDT} + {657111600 -36000 0 HST} + {671025600 -32400 1 HDT} + {688561200 -36000 0 HST} + {702475200 -32400 1 HDT} + {720010800 -36000 0 HST} + {733924800 -32400 1 HDT} + {752065200 -36000 0 HST} + {765374400 -32400 1 HDT} + {783514800 -36000 0 HST} + {796824000 -32400 1 HDT} + {814964400 -36000 0 HST} + {828878400 -32400 1 HDT} + {846414000 -36000 0 HST} + {860328000 -32400 1 HDT} + {877863600 -36000 0 HST} + {891777600 -32400 1 HDT} + {909313200 -36000 0 HST} + {923227200 -32400 1 HDT} + {941367600 -36000 0 HST} + {954676800 -32400 1 HDT} + {972817200 -36000 0 HST} + {986126400 -32400 1 HDT} + {1004266800 -36000 0 HST} + {1018180800 -32400 1 HDT} + {1035716400 -36000 0 HST} + {1049630400 -32400 1 HDT} + {1067166000 -36000 0 HST} + {1081080000 -32400 1 HDT} + {1099220400 -36000 0 HST} + {1112529600 -32400 1 HDT} + {1130670000 -36000 0 HST} + {1143979200 -32400 1 HDT} + {1162119600 -36000 0 HST} + {1173614400 -32400 1 HDT} + {1194174000 -36000 0 HST} + {1205064000 -32400 1 HDT} + {1225623600 -36000 0 HST} + {1236513600 -32400 1 HDT} + {1257073200 -36000 0 HST} + {1268568000 -32400 1 HDT} + {1289127600 -36000 0 HST} + {1300017600 -32400 1 HDT} + {1320577200 -36000 0 HST} + {1331467200 -32400 1 HDT} + {1352026800 -36000 0 HST} + {1362916800 -32400 1 HDT} + {1383476400 -36000 0 HST} + {1394366400 -32400 1 HDT} + {1414926000 -36000 0 HST} + {1425816000 -32400 1 HDT} + {1446375600 -36000 0 HST} + {1457870400 -32400 1 HDT} + {1478430000 -36000 0 HST} + {1489320000 -32400 1 HDT} + {1509879600 -36000 0 HST} + {1520769600 -32400 1 HDT} + {1541329200 -36000 0 HST} + {1552219200 -32400 1 HDT} + {1572778800 -36000 0 HST} + {1583668800 -32400 1 HDT} + {1604228400 -36000 0 HST} + {1615723200 -32400 1 HDT} + {1636282800 -36000 0 HST} + {1647172800 -32400 1 HDT} + {1667732400 -36000 0 HST} + {1678622400 -32400 1 HDT} + {1699182000 -36000 0 HST} + {1710072000 -32400 1 HDT} + {1730631600 -36000 0 HST} + {1741521600 -32400 1 HDT} + {1762081200 -36000 0 HST} + {1772971200 -32400 1 HDT} + {1793530800 -36000 0 HST} + {1805025600 -32400 1 HDT} + {1825585200 -36000 0 HST} + {1836475200 -32400 1 HDT} + {1857034800 -36000 0 HST} + {1867924800 -32400 1 HDT} + {1888484400 -36000 0 HST} + {1899374400 -32400 1 HDT} + {1919934000 -36000 0 HST} + {1930824000 -32400 1 HDT} + {1951383600 -36000 0 HST} + {1962878400 -32400 1 HDT} + {1983438000 -36000 0 HST} + {1994328000 -32400 1 HDT} + {2014887600 -36000 0 HST} + {2025777600 -32400 1 HDT} + {2046337200 -36000 0 HST} + {2057227200 -32400 1 HDT} + {2077786800 -36000 0 HST} + {2088676800 -32400 1 HDT} + {2109236400 -36000 0 HST} + {2120126400 -32400 1 HDT} + {2140686000 -36000 0 HST} + {2152180800 -32400 1 HDT} + {2172740400 -36000 0 HST} + {2183630400 -32400 1 HDT} + {2204190000 -36000 0 HST} + {2215080000 -32400 1 HDT} + {2235639600 -36000 0 HST} + {2246529600 -32400 1 HDT} + {2267089200 -36000 0 HST} + {2277979200 -32400 1 HDT} + {2298538800 -36000 0 HST} + {2309428800 -32400 1 HDT} + {2329988400 -36000 0 HST} + {2341483200 -32400 1 HDT} + {2362042800 -36000 0 HST} + {2372932800 -32400 1 HDT} + {2393492400 -36000 0 HST} + {2404382400 -32400 1 HDT} + {2424942000 -36000 0 HST} + {2435832000 -32400 1 HDT} + {2456391600 -36000 0 HST} + {2467281600 -32400 1 HDT} + {2487841200 -36000 0 HST} + {2499336000 -32400 1 HDT} + {2519895600 -36000 0 HST} + {2530785600 -32400 1 HDT} + {2551345200 -36000 0 HST} + {2562235200 -32400 1 HDT} + {2582794800 -36000 0 HST} + {2593684800 -32400 1 HDT} + {2614244400 -36000 0 HST} + {2625134400 -32400 1 HDT} + {2645694000 -36000 0 HST} + {2656584000 -32400 1 HDT} + {2677143600 -36000 0 HST} + {2688638400 -32400 1 HDT} + {2709198000 -36000 0 HST} + {2720088000 -32400 1 HDT} + {2740647600 -36000 0 HST} + {2751537600 -32400 1 HDT} + {2772097200 -36000 0 HST} + {2782987200 -32400 1 HDT} + {2803546800 -36000 0 HST} + {2814436800 -32400 1 HDT} + {2834996400 -36000 0 HST} + {2846491200 -32400 1 HDT} + {2867050800 -36000 0 HST} + {2877940800 -32400 1 HDT} + {2898500400 -36000 0 HST} + {2909390400 -32400 1 HDT} + {2929950000 -36000 0 HST} + {2940840000 -32400 1 HDT} + {2961399600 -36000 0 HST} + {2972289600 -32400 1 HDT} + {2992849200 -36000 0 HST} + {3003739200 -32400 1 HDT} + {3024298800 -36000 0 HST} + {3035793600 -32400 1 HDT} + {3056353200 -36000 0 HST} + {3067243200 -32400 1 HDT} + {3087802800 -36000 0 HST} + {3098692800 -32400 1 HDT} + {3119252400 -36000 0 HST} + {3130142400 -32400 1 HDT} + {3150702000 -36000 0 HST} + {3161592000 -32400 1 HDT} + {3182151600 -36000 0 HST} + {3193041600 -32400 1 HDT} + {3213601200 -36000 0 HST} + {3225096000 -32400 1 HDT} + {3245655600 -36000 0 HST} + {3256545600 -32400 1 HDT} + {3277105200 -36000 0 HST} + {3287995200 -32400 1 HDT} + {3308554800 -36000 0 HST} + {3319444800 -32400 1 HDT} + {3340004400 -36000 0 HST} + {3350894400 -32400 1 HDT} + {3371454000 -36000 0 HST} + {3382948800 -32400 1 HDT} + {3403508400 -36000 0 HST} + {3414398400 -32400 1 HDT} + {3434958000 -36000 0 HST} + {3445848000 -32400 1 HDT} + {3466407600 -36000 0 HST} + {3477297600 -32400 1 HDT} + {3497857200 -36000 0 HST} + {3508747200 -32400 1 HDT} + {3529306800 -36000 0 HST} + {3540196800 -32400 1 HDT} + {3560756400 -36000 0 HST} + {3572251200 -32400 1 HDT} + {3592810800 -36000 0 HST} + {3603700800 -32400 1 HDT} + {3624260400 -36000 0 HST} + {3635150400 -32400 1 HDT} + {3655710000 -36000 0 HST} + {3666600000 -32400 1 HDT} + {3687159600 -36000 0 HST} + {3698049600 -32400 1 HDT} + {3718609200 -36000 0 HST} + {3730104000 -32400 1 HDT} + {3750663600 -36000 0 HST} + {3761553600 -32400 1 HDT} + {3782113200 -36000 0 HST} + {3793003200 -32400 1 HDT} + {3813562800 -36000 0 HST} + {3824452800 -32400 1 HDT} + {3845012400 -36000 0 HST} + {3855902400 -32400 1 HDT} + {3876462000 -36000 0 HST} + {3887352000 -32400 1 HDT} + {3907911600 -36000 0 HST} + {3919406400 -32400 1 HDT} + {3939966000 -36000 0 HST} + {3950856000 -32400 1 HDT} + {3971415600 -36000 0 HST} + {3982305600 -32400 1 HDT} + {4002865200 -36000 0 HST} + {4013755200 -32400 1 HDT} + {4034314800 -36000 0 HST} + {4045204800 -32400 1 HDT} + {4065764400 -36000 0 HST} + {4076654400 -32400 1 HDT} + {4097214000 -36000 0 HST} +} diff --git a/env/tcl/tcl8.6/tzdata/America/Anchorage b/env/tcl/tcl8.6/tzdata/America/Anchorage new file mode 100644 index 0000000..c0ff8de --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/America/Anchorage @@ -0,0 +1,275 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:America/Anchorage) { + {-9223372036854775808 50424 0 LMT} + {-3225223727 -35976 0 LMT} + {-2188951224 -36000 0 AST} + {-883576800 -36000 0 AST} + {-880200000 -32400 1 AWT} + {-769395600 -32400 1 APT} + {-765378000 -36000 0 AST} + {-86882400 -36000 0 AHST} + {-31500000 -36000 0 AHST} + {-21470400 -32400 1 AHDT} + {-5749200 -36000 0 AHST} + {9979200 -32400 1 AHDT} + {25700400 -36000 0 AHST} + {41428800 -32400 1 AHDT} + {57754800 -36000 0 AHST} + {73483200 -32400 1 AHDT} + {89204400 -36000 0 AHST} + {104932800 -32400 1 AHDT} + {120654000 -36000 0 AHST} + {126705600 -32400 1 AHDT} + {152103600 -36000 0 AHST} + {162388800 -32400 1 AHDT} + {183553200 -36000 0 AHST} + {199281600 -32400 1 AHDT} + {215607600 -36000 0 AHST} + {230731200 -32400 1 AHDT} + {247057200 -36000 0 AHST} + {262785600 -32400 1 AHDT} + {278506800 -36000 0 AHST} + {294235200 -32400 1 AHDT} + {309956400 -36000 0 AHST} + {325684800 -32400 1 AHDT} + {341406000 -36000 0 AHST} + {357134400 -32400 1 AHDT} + {372855600 -36000 0 AHST} + {388584000 -32400 1 AHDT} + {404910000 -36000 0 AHST} + {420033600 -32400 1 AHDT} + {439030800 -32400 0 AKST} + {452084400 -28800 1 AKDT} + {467805600 -32400 0 AKST} + {483534000 -28800 1 AKDT} + {499255200 -32400 0 AKST} + {514983600 -28800 1 AKDT} + {530704800 -32400 0 AKST} + {544618800 -28800 1 AKDT} + {562154400 -32400 0 AKST} + {576068400 -28800 1 AKDT} + {594208800 -32400 0 AKST} + {607518000 -28800 1 AKDT} + {625658400 -32400 0 AKST} + {638967600 -28800 1 AKDT} + {657108000 -32400 0 AKST} + {671022000 -28800 1 AKDT} + {688557600 -32400 0 AKST} + {702471600 -28800 1 AKDT} + {720007200 -32400 0 AKST} + {733921200 -28800 1 AKDT} + {752061600 -32400 0 AKST} + {765370800 -28800 1 AKDT} + {783511200 -32400 0 AKST} + {796820400 -28800 1 AKDT} + {814960800 -32400 0 AKST} + {828874800 -28800 1 AKDT} + {846410400 -32400 0 AKST} + {860324400 -28800 1 AKDT} + {877860000 -32400 0 AKST} + {891774000 -28800 1 AKDT} + {909309600 -32400 0 AKST} + {923223600 -28800 1 AKDT} + {941364000 -32400 0 AKST} + {954673200 -28800 1 AKDT} + {972813600 -32400 0 AKST} + {986122800 -28800 1 AKDT} + {1004263200 -32400 0 AKST} + {1018177200 -28800 1 AKDT} + {1035712800 -32400 0 AKST} + {1049626800 -28800 1 AKDT} + {1067162400 -32400 0 AKST} + {1081076400 -28800 1 AKDT} + {1099216800 -32400 0 AKST} + {1112526000 -28800 1 AKDT} + {1130666400 -32400 0 AKST} + {1143975600 -28800 1 AKDT} + {1162116000 -32400 0 AKST} + {1173610800 -28800 1 AKDT} + {1194170400 -32400 0 AKST} + {1205060400 -28800 1 AKDT} + {1225620000 -32400 0 AKST} + {1236510000 -28800 1 AKDT} + {1257069600 -32400 0 AKST} + {1268564400 -28800 1 AKDT} + {1289124000 -32400 0 AKST} + {1300014000 -28800 1 AKDT} + {1320573600 -32400 0 AKST} + {1331463600 -28800 1 AKDT} + {1352023200 -32400 0 AKST} + {1362913200 -28800 1 AKDT} + {1383472800 -32400 0 AKST} + {1394362800 -28800 1 AKDT} + {1414922400 -32400 0 AKST} + {1425812400 -28800 1 AKDT} + {1446372000 -32400 0 AKST} + {1457866800 -28800 1 AKDT} + {1478426400 -32400 0 AKST} + {1489316400 -28800 1 AKDT} + {1509876000 -32400 0 AKST} + {1520766000 -28800 1 AKDT} + {1541325600 -32400 0 AKST} + {1552215600 -28800 1 AKDT} + {1572775200 -32400 0 AKST} + {1583665200 -28800 1 AKDT} + {1604224800 -32400 0 AKST} + {1615719600 -28800 1 AKDT} + {1636279200 -32400 0 AKST} + {1647169200 -28800 1 AKDT} + {1667728800 -32400 0 AKST} + {1678618800 -28800 1 AKDT} + {1699178400 -32400 0 AKST} + {1710068400 -28800 1 AKDT} + {1730628000 -32400 0 AKST} + {1741518000 -28800 1 AKDT} + {1762077600 -32400 0 AKST} + {1772967600 -28800 1 AKDT} + {1793527200 -32400 0 AKST} + {1805022000 -28800 1 AKDT} + {1825581600 -32400 0 AKST} + {1836471600 -28800 1 AKDT} + {1857031200 -32400 0 AKST} + {1867921200 -28800 1 AKDT} + {1888480800 -32400 0 AKST} + {1899370800 -28800 1 AKDT} + {1919930400 -32400 0 AKST} + {1930820400 -28800 1 AKDT} + {1951380000 -32400 0 AKST} + {1962874800 -28800 1 AKDT} + {1983434400 -32400 0 AKST} + {1994324400 -28800 1 AKDT} + {2014884000 -32400 0 AKST} + {2025774000 -28800 1 AKDT} + {2046333600 -32400 0 AKST} + {2057223600 -28800 1 AKDT} + {2077783200 -32400 0 AKST} + {2088673200 -28800 1 AKDT} + {2109232800 -32400 0 AKST} + {2120122800 -28800 1 AKDT} + {2140682400 -32400 0 AKST} + {2152177200 -28800 1 AKDT} + {2172736800 -32400 0 AKST} + {2183626800 -28800 1 AKDT} + {2204186400 -32400 0 AKST} + {2215076400 -28800 1 AKDT} + {2235636000 -32400 0 AKST} + {2246526000 -28800 1 AKDT} + {2267085600 -32400 0 AKST} + {2277975600 -28800 1 AKDT} + {2298535200 -32400 0 AKST} + {2309425200 -28800 1 AKDT} + {2329984800 -32400 0 AKST} + {2341479600 -28800 1 AKDT} + {2362039200 -32400 0 AKST} + {2372929200 -28800 1 AKDT} + {2393488800 -32400 0 AKST} + {2404378800 -28800 1 AKDT} + {2424938400 -32400 0 AKST} + {2435828400 -28800 1 AKDT} + {2456388000 -32400 0 AKST} + {2467278000 -28800 1 AKDT} + {2487837600 -32400 0 AKST} + {2499332400 -28800 1 AKDT} + {2519892000 -32400 0 AKST} + {2530782000 -28800 1 AKDT} + {2551341600 -32400 0 AKST} + {2562231600 -28800 1 AKDT} + {2582791200 -32400 0 AKST} + {2593681200 -28800 1 AKDT} + {2614240800 -32400 0 AKST} + {2625130800 -28800 1 AKDT} + {2645690400 -32400 0 AKST} + {2656580400 -28800 1 AKDT} + {2677140000 -32400 0 AKST} + {2688634800 -28800 1 AKDT} + {2709194400 -32400 0 AKST} + {2720084400 -28800 1 AKDT} + {2740644000 -32400 0 AKST} + {2751534000 -28800 1 AKDT} + {2772093600 -32400 0 AKST} + {2782983600 -28800 1 AKDT} + {2803543200 -32400 0 AKST} + {2814433200 -28800 1 AKDT} + {2834992800 -32400 0 AKST} + {2846487600 -28800 1 AKDT} + {2867047200 -32400 0 AKST} + {2877937200 -28800 1 AKDT} + {2898496800 -32400 0 AKST} + {2909386800 -28800 1 AKDT} + {2929946400 -32400 0 AKST} + {2940836400 -28800 1 AKDT} + {2961396000 -32400 0 AKST} + {2972286000 -28800 1 AKDT} + {2992845600 -32400 0 AKST} + {3003735600 -28800 1 AKDT} + {3024295200 -32400 0 AKST} + {3035790000 -28800 1 AKDT} + {3056349600 -32400 0 AKST} + {3067239600 -28800 1 AKDT} + {3087799200 -32400 0 AKST} + {3098689200 -28800 1 AKDT} + {3119248800 -32400 0 AKST} + {3130138800 -28800 1 AKDT} + {3150698400 -32400 0 AKST} + {3161588400 -28800 1 AKDT} + {3182148000 -32400 0 AKST} + {3193038000 -28800 1 AKDT} + {3213597600 -32400 0 AKST} + {3225092400 -28800 1 AKDT} + {3245652000 -32400 0 AKST} + {3256542000 -28800 1 AKDT} + {3277101600 -32400 0 AKST} + {3287991600 -28800 1 AKDT} + {3308551200 -32400 0 AKST} + {3319441200 -28800 1 AKDT} + {3340000800 -32400 0 AKST} + {3350890800 -28800 1 AKDT} + {3371450400 -32400 0 AKST} + {3382945200 -28800 1 AKDT} + {3403504800 -32400 0 AKST} + {3414394800 -28800 1 AKDT} + {3434954400 -32400 0 AKST} + {3445844400 -28800 1 AKDT} + {3466404000 -32400 0 AKST} + {3477294000 -28800 1 AKDT} + {3497853600 -32400 0 AKST} + {3508743600 -28800 1 AKDT} + {3529303200 -32400 0 AKST} + {3540193200 -28800 1 AKDT} + {3560752800 -32400 0 AKST} + {3572247600 -28800 1 AKDT} + {3592807200 -32400 0 AKST} + {3603697200 -28800 1 AKDT} + {3624256800 -32400 0 AKST} + {3635146800 -28800 1 AKDT} + {3655706400 -32400 0 AKST} + {3666596400 -28800 1 AKDT} + {3687156000 -32400 0 AKST} + {3698046000 -28800 1 AKDT} + {3718605600 -32400 0 AKST} + {3730100400 -28800 1 AKDT} + {3750660000 -32400 0 AKST} + {3761550000 -28800 1 AKDT} + {3782109600 -32400 0 AKST} + {3792999600 -28800 1 AKDT} + {3813559200 -32400 0 AKST} + {3824449200 -28800 1 AKDT} + {3845008800 -32400 0 AKST} + {3855898800 -28800 1 AKDT} + {3876458400 -32400 0 AKST} + {3887348400 -28800 1 AKDT} + {3907908000 -32400 0 AKST} + {3919402800 -28800 1 AKDT} + {3939962400 -32400 0 AKST} + {3950852400 -28800 1 AKDT} + {3971412000 -32400 0 AKST} + {3982302000 -28800 1 AKDT} + {4002861600 -32400 0 AKST} + {4013751600 -28800 1 AKDT} + {4034311200 -32400 0 AKST} + {4045201200 -28800 1 AKDT} + {4065760800 -32400 0 AKST} + {4076650800 -28800 1 AKDT} + {4097210400 -32400 0 AKST} +} diff --git a/env/tcl/tcl8.6/tzdata/America/Anguilla b/env/tcl/tcl8.6/tzdata/America/Anguilla new file mode 100644 index 0000000..39a0d18 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/America/Anguilla @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(America/Port_of_Spain)]} { + LoadTimeZoneFile America/Port_of_Spain +} +set TZData(:America/Anguilla) $TZData(:America/Port_of_Spain) diff --git a/env/tcl/tcl8.6/tzdata/America/Antigua b/env/tcl/tcl8.6/tzdata/America/Antigua new file mode 100644 index 0000000..be0c88e --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/America/Antigua @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(America/Port_of_Spain)]} { + LoadTimeZoneFile America/Port_of_Spain +} +set TZData(:America/Antigua) $TZData(:America/Port_of_Spain) diff --git a/env/tcl/tcl8.6/tzdata/America/Araguaina b/env/tcl/tcl8.6/tzdata/America/Araguaina new file mode 100644 index 0000000..ca64292 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/America/Araguaina @@ -0,0 +1,60 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:America/Araguaina) { + {-9223372036854775808 -11568 0 LMT} + {-1767214032 -10800 0 -03} + {-1206957600 -7200 1 -03} + {-1191362400 -10800 0 -03} + {-1175374800 -7200 1 -03} + {-1159826400 -10800 0 -03} + {-633819600 -7200 1 -03} + {-622069200 -10800 0 -03} + {-602283600 -7200 1 -03} + {-591832800 -10800 0 -03} + {-570747600 -7200 1 -03} + {-560210400 -10800 0 -03} + {-539125200 -7200 1 -03} + {-531352800 -10800 0 -03} + {-191365200 -7200 1 -03} + {-184197600 -10800 0 -03} + {-155163600 -7200 1 -03} + {-150069600 -10800 0 -03} + {-128898000 -7200 1 -03} + {-121125600 -10800 0 -03} + {-99954000 -7200 1 -03} + {-89589600 -10800 0 -03} + {-68418000 -7200 1 -03} + {-57967200 -10800 0 -03} + {499748400 -7200 1 -03} + {511236000 -10800 0 -03} + {530593200 -7200 1 -03} + {540266400 -10800 0 -03} + {562129200 -7200 1 -03} + {571197600 -10800 0 -03} + {592974000 -7200 1 -03} + {602042400 -10800 0 -03} + {624423600 -7200 1 -03} + {634701600 -10800 0 -03} + {653536800 -10800 0 -03} + {811047600 -10800 0 -03} + {813726000 -7200 1 -03} + {824004000 -10800 0 -03} + {844570800 -7200 1 -03} + {856058400 -10800 0 -03} + {876106800 -7200 1 -03} + {888717600 -10800 0 -03} + {908074800 -7200 1 -03} + {919562400 -10800 0 -03} + {938919600 -7200 1 -03} + {951616800 -10800 0 -03} + {970974000 -7200 1 -03} + {982461600 -10800 0 -03} + {1003028400 -7200 1 -03} + {1013911200 -10800 0 -03} + {1036292400 -7200 1 -03} + {1045360800 -10800 0 -03} + {1064368800 -10800 0 -03} + {1350788400 -7200 0 -03} + {1361066400 -10800 0 -03} + {1378000800 -10800 0 -03} +} diff --git a/env/tcl/tcl8.6/tzdata/America/Argentina/Buenos_Aires b/env/tcl/tcl8.6/tzdata/America/Argentina/Buenos_Aires new file mode 100644 index 0000000..40f1912 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/America/Argentina/Buenos_Aires @@ -0,0 +1,67 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:America/Argentina/Buenos_Aires) { + {-9223372036854775808 -14028 0 LMT} + {-2372097972 -15408 0 CMT} + {-1567453392 -14400 0 -04} + {-1233432000 -10800 0 -04} + {-1222981200 -14400 0 -04} + {-1205956800 -10800 1 -04} + {-1194037200 -14400 0 -04} + {-1172865600 -10800 1 -04} + {-1162501200 -14400 0 -04} + {-1141329600 -10800 1 -04} + {-1130965200 -14400 0 -04} + {-1109793600 -10800 1 -04} + {-1099429200 -14400 0 -04} + {-1078257600 -10800 1 -04} + {-1067806800 -14400 0 -04} + {-1046635200 -10800 1 -04} + {-1036270800 -14400 0 -04} + {-1015099200 -10800 1 -04} + {-1004734800 -14400 0 -04} + {-983563200 -10800 1 -04} + {-973198800 -14400 0 -04} + {-952027200 -10800 1 -04} + {-941576400 -14400 0 -04} + {-931032000 -10800 1 -04} + {-900882000 -14400 0 -04} + {-890337600 -10800 1 -04} + {-833749200 -14400 0 -04} + {-827265600 -10800 1 -04} + {-752274000 -14400 0 -04} + {-733780800 -10800 1 -04} + {-197326800 -14400 0 -04} + {-190843200 -10800 1 -04} + {-184194000 -14400 0 -04} + {-164491200 -10800 1 -04} + {-152658000 -14400 0 -04} + {-132955200 -10800 1 -04} + {-121122000 -14400 0 -04} + {-101419200 -10800 1 -04} + {-86821200 -14400 0 -04} + {-71092800 -10800 1 -04} + {-54766800 -14400 0 -04} + {-39038400 -10800 1 -04} + {-23317200 -14400 0 -04} + {-7588800 -10800 0 -03} + {128142000 -7200 1 -03} + {136605600 -10800 0 -03} + {596948400 -7200 1 -03} + {605066400 -10800 0 -03} + {624423600 -7200 1 -03} + {636516000 -10800 0 -03} + {656478000 -7200 1 -03} + {667965600 -10800 0 -03} + {687927600 -7200 1 -03} + {699415200 -10800 0 -03} + {719377200 -7200 1 -03} + {731469600 -10800 0 -03} + {938916000 -10800 0 -04} + {938919600 -10800 1 -04} + {952056000 -10800 0 -03} + {1198983600 -7200 1 -03} + {1205632800 -10800 0 -03} + {1224385200 -7200 1 -03} + {1237082400 -10800 0 -03} +} diff --git a/env/tcl/tcl8.6/tzdata/America/Argentina/Catamarca b/env/tcl/tcl8.6/tzdata/America/Argentina/Catamarca new file mode 100644 index 0000000..da5b42a --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/America/Argentina/Catamarca @@ -0,0 +1,68 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:America/Argentina/Catamarca) { + {-9223372036854775808 -15788 0 LMT} + {-2372096212 -15408 0 CMT} + {-1567453392 -14400 0 -04} + {-1233432000 -10800 0 -04} + {-1222981200 -14400 0 -04} + {-1205956800 -10800 1 -04} + {-1194037200 -14400 0 -04} + {-1172865600 -10800 1 -04} + {-1162501200 -14400 0 -04} + {-1141329600 -10800 1 -04} + {-1130965200 -14400 0 -04} + {-1109793600 -10800 1 -04} + {-1099429200 -14400 0 -04} + {-1078257600 -10800 1 -04} + {-1067806800 -14400 0 -04} + {-1046635200 -10800 1 -04} + {-1036270800 -14400 0 -04} + {-1015099200 -10800 1 -04} + {-1004734800 -14400 0 -04} + {-983563200 -10800 1 -04} + {-973198800 -14400 0 -04} + {-952027200 -10800 1 -04} + {-941576400 -14400 0 -04} + {-931032000 -10800 1 -04} + {-900882000 -14400 0 -04} + {-890337600 -10800 1 -04} + {-833749200 -14400 0 -04} + {-827265600 -10800 1 -04} + {-752274000 -14400 0 -04} + {-733780800 -10800 1 -04} + {-197326800 -14400 0 -04} + {-190843200 -10800 1 -04} + {-184194000 -14400 0 -04} + {-164491200 -10800 1 -04} + {-152658000 -14400 0 -04} + {-132955200 -10800 1 -04} + {-121122000 -14400 0 -04} + {-101419200 -10800 1 -04} + {-86821200 -14400 0 -04} + {-71092800 -10800 1 -04} + {-54766800 -14400 0 -04} + {-39038400 -10800 1 -04} + {-23317200 -14400 0 -04} + {-7588800 -10800 0 -03} + {128142000 -7200 1 -03} + {136605600 -10800 0 -03} + {596948400 -7200 1 -03} + {605066400 -10800 0 -03} + {624423600 -7200 1 -03} + {636516000 -10800 0 -03} + {656478000 -7200 1 -03} + {667965600 -14400 0 -04} + {687931200 -7200 0 -03} + {699415200 -10800 0 -03} + {719377200 -7200 1 -03} + {731469600 -10800 0 -03} + {938916000 -10800 0 -04} + {938919600 -10800 1 -04} + {952056000 -10800 0 -03} + {1086058800 -14400 0 -04} + {1087704000 -10800 0 -03} + {1198983600 -7200 1 -03} + {1205632800 -10800 0 -03} + {1224295200 -10800 0 -03} +} diff --git a/env/tcl/tcl8.6/tzdata/America/Argentina/ComodRivadavia b/env/tcl/tcl8.6/tzdata/America/Argentina/ComodRivadavia new file mode 100644 index 0000000..2611a3d --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/America/Argentina/ComodRivadavia @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(America/Argentina/Catamarca)]} { + LoadTimeZoneFile America/Argentina/Catamarca +} +set TZData(:America/Argentina/ComodRivadavia) $TZData(:America/Argentina/Catamarca) diff --git a/env/tcl/tcl8.6/tzdata/America/Argentina/Cordoba b/env/tcl/tcl8.6/tzdata/America/Argentina/Cordoba new file mode 100644 index 0000000..6a1426e --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/America/Argentina/Cordoba @@ -0,0 +1,67 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:America/Argentina/Cordoba) { + {-9223372036854775808 -15408 0 LMT} + {-2372096592 -15408 0 CMT} + {-1567453392 -14400 0 -04} + {-1233432000 -10800 0 -04} + {-1222981200 -14400 0 -04} + {-1205956800 -10800 1 -04} + {-1194037200 -14400 0 -04} + {-1172865600 -10800 1 -04} + {-1162501200 -14400 0 -04} + {-1141329600 -10800 1 -04} + {-1130965200 -14400 0 -04} + {-1109793600 -10800 1 -04} + {-1099429200 -14400 0 -04} + {-1078257600 -10800 1 -04} + {-1067806800 -14400 0 -04} + {-1046635200 -10800 1 -04} + {-1036270800 -14400 0 -04} + {-1015099200 -10800 1 -04} + {-1004734800 -14400 0 -04} + {-983563200 -10800 1 -04} + {-973198800 -14400 0 -04} + {-952027200 -10800 1 -04} + {-941576400 -14400 0 -04} + {-931032000 -10800 1 -04} + {-900882000 -14400 0 -04} + {-890337600 -10800 1 -04} + {-833749200 -14400 0 -04} + {-827265600 -10800 1 -04} + {-752274000 -14400 0 -04} + {-733780800 -10800 1 -04} + {-197326800 -14400 0 -04} + {-190843200 -10800 1 -04} + {-184194000 -14400 0 -04} + {-164491200 -10800 1 -04} + {-152658000 -14400 0 -04} + {-132955200 -10800 1 -04} + {-121122000 -14400 0 -04} + {-101419200 -10800 1 -04} + {-86821200 -14400 0 -04} + {-71092800 -10800 1 -04} + {-54766800 -14400 0 -04} + {-39038400 -10800 1 -04} + {-23317200 -14400 0 -04} + {-7588800 -10800 0 -03} + {128142000 -7200 1 -03} + {136605600 -10800 0 -03} + {596948400 -7200 1 -03} + {605066400 -10800 0 -03} + {624423600 -7200 1 -03} + {636516000 -10800 0 -03} + {656478000 -7200 1 -03} + {667965600 -14400 0 -04} + {687931200 -7200 0 -03} + {699415200 -10800 0 -03} + {719377200 -7200 1 -03} + {731469600 -10800 0 -03} + {938916000 -10800 0 -04} + {938919600 -10800 1 -04} + {952056000 -10800 0 -03} + {1198983600 -7200 1 -03} + {1205632800 -10800 0 -03} + {1224385200 -7200 1 -03} + {1237082400 -10800 0 -03} +} diff --git a/env/tcl/tcl8.6/tzdata/America/Argentina/Jujuy b/env/tcl/tcl8.6/tzdata/America/Argentina/Jujuy new file mode 100644 index 0000000..72080f5 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/America/Argentina/Jujuy @@ -0,0 +1,67 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:America/Argentina/Jujuy) { + {-9223372036854775808 -15672 0 LMT} + {-2372096328 -15408 0 CMT} + {-1567453392 -14400 0 -04} + {-1233432000 -10800 0 -04} + {-1222981200 -14400 0 -04} + {-1205956800 -10800 1 -04} + {-1194037200 -14400 0 -04} + {-1172865600 -10800 1 -04} + {-1162501200 -14400 0 -04} + {-1141329600 -10800 1 -04} + {-1130965200 -14400 0 -04} + {-1109793600 -10800 1 -04} + {-1099429200 -14400 0 -04} + {-1078257600 -10800 1 -04} + {-1067806800 -14400 0 -04} + {-1046635200 -10800 1 -04} + {-1036270800 -14400 0 -04} + {-1015099200 -10800 1 -04} + {-1004734800 -14400 0 -04} + {-983563200 -10800 1 -04} + {-973198800 -14400 0 -04} + {-952027200 -10800 1 -04} + {-941576400 -14400 0 -04} + {-931032000 -10800 1 -04} + {-900882000 -14400 0 -04} + {-890337600 -10800 1 -04} + {-833749200 -14400 0 -04} + {-827265600 -10800 1 -04} + {-752274000 -14400 0 -04} + {-733780800 -10800 1 -04} + {-197326800 -14400 0 -04} + {-190843200 -10800 1 -04} + {-184194000 -14400 0 -04} + {-164491200 -10800 1 -04} + {-152658000 -14400 0 -04} + {-132955200 -10800 1 -04} + {-121122000 -14400 0 -04} + {-101419200 -10800 1 -04} + {-86821200 -14400 0 -04} + {-71092800 -10800 1 -04} + {-54766800 -14400 0 -04} + {-39038400 -10800 1 -04} + {-23317200 -14400 0 -04} + {-7588800 -10800 0 -03} + {128142000 -7200 1 -03} + {136605600 -10800 0 -03} + {596948400 -7200 1 -03} + {605066400 -10800 0 -03} + {624423600 -7200 1 -03} + {636516000 -14400 0 -04} + {657086400 -10800 1 -03} + {669178800 -14400 0 -04} + {686721600 -7200 1 -02} + {694231200 -7200 0 -03} + {699415200 -10800 0 -03} + {719377200 -7200 1 -03} + {731469600 -10800 0 -03} + {938916000 -10800 0 -04} + {938919600 -10800 1 -04} + {952056000 -10800 0 -03} + {1198983600 -7200 1 -03} + {1205632800 -10800 0 -03} + {1224295200 -10800 0 -03} +} diff --git a/env/tcl/tcl8.6/tzdata/America/Argentina/La_Rioja b/env/tcl/tcl8.6/tzdata/America/Argentina/La_Rioja new file mode 100644 index 0000000..fb7b237 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/America/Argentina/La_Rioja @@ -0,0 +1,69 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:America/Argentina/La_Rioja) { + {-9223372036854775808 -16044 0 LMT} + {-2372095956 -15408 0 CMT} + {-1567453392 -14400 0 -04} + {-1233432000 -10800 0 -04} + {-1222981200 -14400 0 -04} + {-1205956800 -10800 1 -04} + {-1194037200 -14400 0 -04} + {-1172865600 -10800 1 -04} + {-1162501200 -14400 0 -04} + {-1141329600 -10800 1 -04} + {-1130965200 -14400 0 -04} + {-1109793600 -10800 1 -04} + {-1099429200 -14400 0 -04} + {-1078257600 -10800 1 -04} + {-1067806800 -14400 0 -04} + {-1046635200 -10800 1 -04} + {-1036270800 -14400 0 -04} + {-1015099200 -10800 1 -04} + {-1004734800 -14400 0 -04} + {-983563200 -10800 1 -04} + {-973198800 -14400 0 -04} + {-952027200 -10800 1 -04} + {-941576400 -14400 0 -04} + {-931032000 -10800 1 -04} + {-900882000 -14400 0 -04} + {-890337600 -10800 1 -04} + {-833749200 -14400 0 -04} + {-827265600 -10800 1 -04} + {-752274000 -14400 0 -04} + {-733780800 -10800 1 -04} + {-197326800 -14400 0 -04} + {-190843200 -10800 1 -04} + {-184194000 -14400 0 -04} + {-164491200 -10800 1 -04} + {-152658000 -14400 0 -04} + {-132955200 -10800 1 -04} + {-121122000 -14400 0 -04} + {-101419200 -10800 1 -04} + {-86821200 -14400 0 -04} + {-71092800 -10800 1 -04} + {-54766800 -14400 0 -04} + {-39038400 -10800 1 -04} + {-23317200 -14400 0 -04} + {-7588800 -10800 0 -03} + {128142000 -7200 1 -03} + {136605600 -10800 0 -03} + {596948400 -7200 1 -03} + {605066400 -10800 0 -03} + {624423600 -7200 1 -03} + {636516000 -10800 0 -03} + {656478000 -7200 1 -03} + {667792800 -14400 0 -04} + {673588800 -10800 0 -03} + {687927600 -7200 1 -03} + {699415200 -10800 0 -03} + {719377200 -7200 1 -03} + {731469600 -10800 0 -03} + {938916000 -10800 0 -04} + {938919600 -10800 1 -04} + {952056000 -10800 0 -03} + {1086058800 -14400 0 -04} + {1087704000 -10800 0 -03} + {1198983600 -7200 1 -03} + {1205632800 -10800 0 -03} + {1224295200 -10800 0 -03} +} diff --git a/env/tcl/tcl8.6/tzdata/America/Argentina/Mendoza b/env/tcl/tcl8.6/tzdata/America/Argentina/Mendoza new file mode 100644 index 0000000..af7342e --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/America/Argentina/Mendoza @@ -0,0 +1,68 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:America/Argentina/Mendoza) { + {-9223372036854775808 -16516 0 LMT} + {-2372095484 -15408 0 CMT} + {-1567453392 -14400 0 -04} + {-1233432000 -10800 0 -04} + {-1222981200 -14400 0 -04} + {-1205956800 -10800 1 -04} + {-1194037200 -14400 0 -04} + {-1172865600 -10800 1 -04} + {-1162501200 -14400 0 -04} + {-1141329600 -10800 1 -04} + {-1130965200 -14400 0 -04} + {-1109793600 -10800 1 -04} + {-1099429200 -14400 0 -04} + {-1078257600 -10800 1 -04} + {-1067806800 -14400 0 -04} + {-1046635200 -10800 1 -04} + {-1036270800 -14400 0 -04} + {-1015099200 -10800 1 -04} + {-1004734800 -14400 0 -04} + {-983563200 -10800 1 -04} + {-973198800 -14400 0 -04} + {-952027200 -10800 1 -04} + {-941576400 -14400 0 -04} + {-931032000 -10800 1 -04} + {-900882000 -14400 0 -04} + {-890337600 -10800 1 -04} + {-833749200 -14400 0 -04} + {-827265600 -10800 1 -04} + {-752274000 -14400 0 -04} + {-733780800 -10800 1 -04} + {-197326800 -14400 0 -04} + {-190843200 -10800 1 -04} + {-184194000 -14400 0 -04} + {-164491200 -10800 1 -04} + {-152658000 -14400 0 -04} + {-132955200 -10800 1 -04} + {-121122000 -14400 0 -04} + {-101419200 -10800 1 -04} + {-86821200 -14400 0 -04} + {-71092800 -10800 1 -04} + {-54766800 -14400 0 -04} + {-39038400 -10800 1 -04} + {-23317200 -14400 0 -04} + {-7588800 -10800 0 -03} + {128142000 -7200 1 -03} + {136605600 -10800 0 -03} + {596948400 -7200 1 -03} + {605066400 -10800 0 -03} + {624423600 -7200 1 -03} + {636516000 -14400 0 -04} + {655963200 -10800 1 -03} + {667796400 -14400 0 -04} + {687499200 -10800 1 -03} + {699418800 -14400 0 -04} + {719380800 -7200 0 -03} + {731469600 -10800 0 -03} + {938916000 -10800 0 -04} + {938919600 -10800 1 -04} + {952056000 -10800 0 -03} + {1085281200 -14400 0 -04} + {1096171200 -10800 0 -03} + {1198983600 -7200 1 -03} + {1205632800 -10800 0 -03} + {1224295200 -10800 0 -03} +} diff --git a/env/tcl/tcl8.6/tzdata/America/Argentina/Rio_Gallegos b/env/tcl/tcl8.6/tzdata/America/Argentina/Rio_Gallegos new file mode 100644 index 0000000..2a197a4 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/America/Argentina/Rio_Gallegos @@ -0,0 +1,68 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:America/Argentina/Rio_Gallegos) { + {-9223372036854775808 -16612 0 LMT} + {-2372095388 -15408 0 CMT} + {-1567453392 -14400 0 -04} + {-1233432000 -10800 0 -04} + {-1222981200 -14400 0 -04} + {-1205956800 -10800 1 -04} + {-1194037200 -14400 0 -04} + {-1172865600 -10800 1 -04} + {-1162501200 -14400 0 -04} + {-1141329600 -10800 1 -04} + {-1130965200 -14400 0 -04} + {-1109793600 -10800 1 -04} + {-1099429200 -14400 0 -04} + {-1078257600 -10800 1 -04} + {-1067806800 -14400 0 -04} + {-1046635200 -10800 1 -04} + {-1036270800 -14400 0 -04} + {-1015099200 -10800 1 -04} + {-1004734800 -14400 0 -04} + {-983563200 -10800 1 -04} + {-973198800 -14400 0 -04} + {-952027200 -10800 1 -04} + {-941576400 -14400 0 -04} + {-931032000 -10800 1 -04} + {-900882000 -14400 0 -04} + {-890337600 -10800 1 -04} + {-833749200 -14400 0 -04} + {-827265600 -10800 1 -04} + {-752274000 -14400 0 -04} + {-733780800 -10800 1 -04} + {-197326800 -14400 0 -04} + {-190843200 -10800 1 -04} + {-184194000 -14400 0 -04} + {-164491200 -10800 1 -04} + {-152658000 -14400 0 -04} + {-132955200 -10800 1 -04} + {-121122000 -14400 0 -04} + {-101419200 -10800 1 -04} + {-86821200 -14400 0 -04} + {-71092800 -10800 1 -04} + {-54766800 -14400 0 -04} + {-39038400 -10800 1 -04} + {-23317200 -14400 0 -04} + {-7588800 -10800 0 -03} + {128142000 -7200 1 -03} + {136605600 -10800 0 -03} + {596948400 -7200 1 -03} + {605066400 -10800 0 -03} + {624423600 -7200 1 -03} + {636516000 -10800 0 -03} + {656478000 -7200 1 -03} + {667965600 -10800 0 -03} + {687927600 -7200 1 -03} + {699415200 -10800 0 -03} + {719377200 -7200 1 -03} + {731469600 -10800 0 -03} + {938916000 -10800 0 -04} + {938919600 -10800 1 -04} + {952056000 -10800 0 -03} + {1086058800 -14400 0 -04} + {1087704000 -10800 0 -03} + {1198983600 -7200 1 -03} + {1205632800 -10800 0 -03} + {1224295200 -10800 0 -03} +} diff --git a/env/tcl/tcl8.6/tzdata/America/Argentina/Salta b/env/tcl/tcl8.6/tzdata/America/Argentina/Salta new file mode 100644 index 0000000..d49e82f --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/America/Argentina/Salta @@ -0,0 +1,66 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:America/Argentina/Salta) { + {-9223372036854775808 -15700 0 LMT} + {-2372096300 -15408 0 CMT} + {-1567453392 -14400 0 -04} + {-1233432000 -10800 0 -04} + {-1222981200 -14400 0 -04} + {-1205956800 -10800 1 -04} + {-1194037200 -14400 0 -04} + {-1172865600 -10800 1 -04} + {-1162501200 -14400 0 -04} + {-1141329600 -10800 1 -04} + {-1130965200 -14400 0 -04} + {-1109793600 -10800 1 -04} + {-1099429200 -14400 0 -04} + {-1078257600 -10800 1 -04} + {-1067806800 -14400 0 -04} + {-1046635200 -10800 1 -04} + {-1036270800 -14400 0 -04} + {-1015099200 -10800 1 -04} + {-1004734800 -14400 0 -04} + {-983563200 -10800 1 -04} + {-973198800 -14400 0 -04} + {-952027200 -10800 1 -04} + {-941576400 -14400 0 -04} + {-931032000 -10800 1 -04} + {-900882000 -14400 0 -04} + {-890337600 -10800 1 -04} + {-833749200 -14400 0 -04} + {-827265600 -10800 1 -04} + {-752274000 -14400 0 -04} + {-733780800 -10800 1 -04} + {-197326800 -14400 0 -04} + {-190843200 -10800 1 -04} + {-184194000 -14400 0 -04} + {-164491200 -10800 1 -04} + {-152658000 -14400 0 -04} + {-132955200 -10800 1 -04} + {-121122000 -14400 0 -04} + {-101419200 -10800 1 -04} + {-86821200 -14400 0 -04} + {-71092800 -10800 1 -04} + {-54766800 -14400 0 -04} + {-39038400 -10800 1 -04} + {-23317200 -14400 0 -04} + {-7588800 -10800 0 -03} + {128142000 -7200 1 -03} + {136605600 -10800 0 -03} + {596948400 -7200 1 -03} + {605066400 -10800 0 -03} + {624423600 -7200 1 -03} + {636516000 -10800 0 -03} + {656478000 -7200 1 -03} + {667965600 -14400 0 -04} + {687931200 -7200 0 -03} + {699415200 -10800 0 -03} + {719377200 -7200 1 -03} + {731469600 -10800 0 -03} + {938916000 -10800 0 -04} + {938919600 -10800 1 -04} + {952056000 -10800 0 -03} + {1198983600 -7200 1 -03} + {1205632800 -10800 0 -03} + {1224295200 -10800 0 -03} +} diff --git a/env/tcl/tcl8.6/tzdata/America/Argentina/San_Juan b/env/tcl/tcl8.6/tzdata/America/Argentina/San_Juan new file mode 100644 index 0000000..d67f688 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/America/Argentina/San_Juan @@ -0,0 +1,69 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:America/Argentina/San_Juan) { + {-9223372036854775808 -16444 0 LMT} + {-2372095556 -15408 0 CMT} + {-1567453392 -14400 0 -04} + {-1233432000 -10800 0 -04} + {-1222981200 -14400 0 -04} + {-1205956800 -10800 1 -04} + {-1194037200 -14400 0 -04} + {-1172865600 -10800 1 -04} + {-1162501200 -14400 0 -04} + {-1141329600 -10800 1 -04} + {-1130965200 -14400 0 -04} + {-1109793600 -10800 1 -04} + {-1099429200 -14400 0 -04} + {-1078257600 -10800 1 -04} + {-1067806800 -14400 0 -04} + {-1046635200 -10800 1 -04} + {-1036270800 -14400 0 -04} + {-1015099200 -10800 1 -04} + {-1004734800 -14400 0 -04} + {-983563200 -10800 1 -04} + {-973198800 -14400 0 -04} + {-952027200 -10800 1 -04} + {-941576400 -14400 0 -04} + {-931032000 -10800 1 -04} + {-900882000 -14400 0 -04} + {-890337600 -10800 1 -04} + {-833749200 -14400 0 -04} + {-827265600 -10800 1 -04} + {-752274000 -14400 0 -04} + {-733780800 -10800 1 -04} + {-197326800 -14400 0 -04} + {-190843200 -10800 1 -04} + {-184194000 -14400 0 -04} + {-164491200 -10800 1 -04} + {-152658000 -14400 0 -04} + {-132955200 -10800 1 -04} + {-121122000 -14400 0 -04} + {-101419200 -10800 1 -04} + {-86821200 -14400 0 -04} + {-71092800 -10800 1 -04} + {-54766800 -14400 0 -04} + {-39038400 -10800 1 -04} + {-23317200 -14400 0 -04} + {-7588800 -10800 0 -03} + {128142000 -7200 1 -03} + {136605600 -10800 0 -03} + {596948400 -7200 1 -03} + {605066400 -10800 0 -03} + {624423600 -7200 1 -03} + {636516000 -10800 0 -03} + {656478000 -7200 1 -03} + {667792800 -14400 0 -04} + {673588800 -10800 0 -03} + {687927600 -7200 1 -03} + {699415200 -10800 0 -03} + {719377200 -7200 1 -03} + {731469600 -10800 0 -03} + {938916000 -10800 0 -04} + {938919600 -10800 1 -04} + {952056000 -10800 0 -03} + {1085972400 -14400 0 -04} + {1090728000 -10800 0 -03} + {1198983600 -7200 1 -03} + {1205632800 -10800 0 -03} + {1224295200 -10800 0 -03} +} diff --git a/env/tcl/tcl8.6/tzdata/America/Argentina/San_Luis b/env/tcl/tcl8.6/tzdata/America/Argentina/San_Luis new file mode 100644 index 0000000..4d27c32 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/America/Argentina/San_Luis @@ -0,0 +1,68 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:America/Argentina/San_Luis) { + {-9223372036854775808 -15924 0 LMT} + {-2372096076 -15408 0 CMT} + {-1567453392 -14400 0 -04} + {-1233432000 -10800 0 -04} + {-1222981200 -14400 0 -04} + {-1205956800 -10800 1 -04} + {-1194037200 -14400 0 -04} + {-1172865600 -10800 1 -04} + {-1162501200 -14400 0 -04} + {-1141329600 -10800 1 -04} + {-1130965200 -14400 0 -04} + {-1109793600 -10800 1 -04} + {-1099429200 -14400 0 -04} + {-1078257600 -10800 1 -04} + {-1067806800 -14400 0 -04} + {-1046635200 -10800 1 -04} + {-1036270800 -14400 0 -04} + {-1015099200 -10800 1 -04} + {-1004734800 -14400 0 -04} + {-983563200 -10800 1 -04} + {-973198800 -14400 0 -04} + {-952027200 -10800 1 -04} + {-941576400 -14400 0 -04} + {-931032000 -10800 1 -04} + {-900882000 -14400 0 -04} + {-890337600 -10800 1 -04} + {-833749200 -14400 0 -04} + {-827265600 -10800 1 -04} + {-752274000 -14400 0 -04} + {-733780800 -10800 1 -04} + {-197326800 -14400 0 -04} + {-190843200 -10800 1 -04} + {-184194000 -14400 0 -04} + {-164491200 -10800 1 -04} + {-152658000 -14400 0 -04} + {-132955200 -10800 1 -04} + {-121122000 -14400 0 -04} + {-101419200 -10800 1 -04} + {-86821200 -14400 0 -04} + {-71092800 -10800 1 -04} + {-54766800 -14400 0 -04} + {-39038400 -10800 1 -04} + {-23317200 -14400 0 -04} + {-7588800 -10800 0 -03} + {128142000 -7200 1 -03} + {136605600 -10800 0 -03} + {596948400 -7200 1 -03} + {605066400 -10800 0 -03} + {624423600 -7200 1 -03} + {631159200 -7200 1 -02} + {637380000 -14400 0 -04} + {655963200 -10800 1 -03} + {667796400 -14400 0 -04} + {675748800 -10800 0 -03} + {938919600 -10800 1 -03} + {952052400 -10800 0 -03} + {1085972400 -14400 0 -04} + {1090728000 -10800 0 -03} + {1198983600 -7200 1 -03} + {1200880800 -10800 0 -04} + {1205031600 -14400 0 -04} + {1223784000 -10800 1 -04} + {1236481200 -14400 0 -04} + {1255233600 -10800 0 -03} +} diff --git a/env/tcl/tcl8.6/tzdata/America/Argentina/Tucuman b/env/tcl/tcl8.6/tzdata/America/Argentina/Tucuman new file mode 100644 index 0000000..6809800 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/America/Argentina/Tucuman @@ -0,0 +1,69 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:America/Argentina/Tucuman) { + {-9223372036854775808 -15652 0 LMT} + {-2372096348 -15408 0 CMT} + {-1567453392 -14400 0 -04} + {-1233432000 -10800 0 -04} + {-1222981200 -14400 0 -04} + {-1205956800 -10800 1 -04} + {-1194037200 -14400 0 -04} + {-1172865600 -10800 1 -04} + {-1162501200 -14400 0 -04} + {-1141329600 -10800 1 -04} + {-1130965200 -14400 0 -04} + {-1109793600 -10800 1 -04} + {-1099429200 -14400 0 -04} + {-1078257600 -10800 1 -04} + {-1067806800 -14400 0 -04} + {-1046635200 -10800 1 -04} + {-1036270800 -14400 0 -04} + {-1015099200 -10800 1 -04} + {-1004734800 -14400 0 -04} + {-983563200 -10800 1 -04} + {-973198800 -14400 0 -04} + {-952027200 -10800 1 -04} + {-941576400 -14400 0 -04} + {-931032000 -10800 1 -04} + {-900882000 -14400 0 -04} + {-890337600 -10800 1 -04} + {-833749200 -14400 0 -04} + {-827265600 -10800 1 -04} + {-752274000 -14400 0 -04} + {-733780800 -10800 1 -04} + {-197326800 -14400 0 -04} + {-190843200 -10800 1 -04} + {-184194000 -14400 0 -04} + {-164491200 -10800 1 -04} + {-152658000 -14400 0 -04} + {-132955200 -10800 1 -04} + {-121122000 -14400 0 -04} + {-101419200 -10800 1 -04} + {-86821200 -14400 0 -04} + {-71092800 -10800 1 -04} + {-54766800 -14400 0 -04} + {-39038400 -10800 1 -04} + {-23317200 -14400 0 -04} + {-7588800 -10800 0 -03} + {128142000 -7200 1 -03} + {136605600 -10800 0 -03} + {596948400 -7200 1 -03} + {605066400 -10800 0 -03} + {624423600 -7200 1 -03} + {636516000 -10800 0 -03} + {656478000 -7200 1 -03} + {667965600 -14400 0 -04} + {687931200 -7200 0 -03} + {699415200 -10800 0 -03} + {719377200 -7200 1 -03} + {731469600 -10800 0 -03} + {938916000 -10800 0 -04} + {938919600 -10800 1 -04} + {952056000 -10800 0 -03} + {1086058800 -14400 0 -04} + {1087099200 -10800 0 -03} + {1198983600 -7200 1 -03} + {1205632800 -10800 0 -03} + {1224385200 -7200 1 -03} + {1237082400 -10800 0 -03} +} diff --git a/env/tcl/tcl8.6/tzdata/America/Argentina/Ushuaia b/env/tcl/tcl8.6/tzdata/America/Argentina/Ushuaia new file mode 100644 index 0000000..c62ca0d --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/America/Argentina/Ushuaia @@ -0,0 +1,68 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:America/Argentina/Ushuaia) { + {-9223372036854775808 -16392 0 LMT} + {-2372095608 -15408 0 CMT} + {-1567453392 -14400 0 -04} + {-1233432000 -10800 0 -04} + {-1222981200 -14400 0 -04} + {-1205956800 -10800 1 -04} + {-1194037200 -14400 0 -04} + {-1172865600 -10800 1 -04} + {-1162501200 -14400 0 -04} + {-1141329600 -10800 1 -04} + {-1130965200 -14400 0 -04} + {-1109793600 -10800 1 -04} + {-1099429200 -14400 0 -04} + {-1078257600 -10800 1 -04} + {-1067806800 -14400 0 -04} + {-1046635200 -10800 1 -04} + {-1036270800 -14400 0 -04} + {-1015099200 -10800 1 -04} + {-1004734800 -14400 0 -04} + {-983563200 -10800 1 -04} + {-973198800 -14400 0 -04} + {-952027200 -10800 1 -04} + {-941576400 -14400 0 -04} + {-931032000 -10800 1 -04} + {-900882000 -14400 0 -04} + {-890337600 -10800 1 -04} + {-833749200 -14400 0 -04} + {-827265600 -10800 1 -04} + {-752274000 -14400 0 -04} + {-733780800 -10800 1 -04} + {-197326800 -14400 0 -04} + {-190843200 -10800 1 -04} + {-184194000 -14400 0 -04} + {-164491200 -10800 1 -04} + {-152658000 -14400 0 -04} + {-132955200 -10800 1 -04} + {-121122000 -14400 0 -04} + {-101419200 -10800 1 -04} + {-86821200 -14400 0 -04} + {-71092800 -10800 1 -04} + {-54766800 -14400 0 -04} + {-39038400 -10800 1 -04} + {-23317200 -14400 0 -04} + {-7588800 -10800 0 -03} + {128142000 -7200 1 -03} + {136605600 -10800 0 -03} + {596948400 -7200 1 -03} + {605066400 -10800 0 -03} + {624423600 -7200 1 -03} + {636516000 -10800 0 -03} + {656478000 -7200 1 -03} + {667965600 -10800 0 -03} + {687927600 -7200 1 -03} + {699415200 -10800 0 -03} + {719377200 -7200 1 -03} + {731469600 -10800 0 -03} + {938916000 -10800 0 -04} + {938919600 -10800 1 -04} + {952056000 -10800 0 -03} + {1085886000 -14400 0 -04} + {1087704000 -10800 0 -03} + {1198983600 -7200 1 -03} + {1205632800 -10800 0 -03} + {1224295200 -10800 0 -03} +} diff --git a/env/tcl/tcl8.6/tzdata/America/Aruba b/env/tcl/tcl8.6/tzdata/America/Aruba new file mode 100644 index 0000000..e02d5fc --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/America/Aruba @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(America/Curacao)]} { + LoadTimeZoneFile America/Curacao +} +set TZData(:America/Aruba) $TZData(:America/Curacao) diff --git a/env/tcl/tcl8.6/tzdata/America/Asuncion b/env/tcl/tcl8.6/tzdata/America/Asuncion new file mode 100644 index 0000000..8e6c1b0 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/America/Asuncion @@ -0,0 +1,259 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:America/Asuncion) { + {-9223372036854775808 -13840 0 LMT} + {-2524507760 -13840 0 AMT} + {-1206389360 -14400 0 -04} + {86760000 -10800 0 -03} + {134017200 -14400 0 -04} + {162878400 -14400 0 -04} + {181368000 -10800 1 -04} + {194497200 -14400 0 -04} + {212990400 -10800 1 -04} + {226033200 -14400 0 -04} + {244526400 -10800 1 -04} + {257569200 -14400 0 -04} + {276062400 -10800 1 -04} + {291783600 -14400 0 -04} + {307598400 -10800 1 -04} + {323406000 -14400 0 -04} + {339220800 -10800 1 -04} + {354942000 -14400 0 -04} + {370756800 -10800 1 -04} + {386478000 -14400 0 -04} + {402292800 -10800 1 -04} + {418014000 -14400 0 -04} + {433828800 -10800 1 -04} + {449636400 -14400 0 -04} + {465451200 -10800 1 -04} + {481172400 -14400 0 -04} + {496987200 -10800 1 -04} + {512708400 -14400 0 -04} + {528523200 -10800 1 -04} + {544244400 -14400 0 -04} + {560059200 -10800 1 -04} + {575866800 -14400 0 -04} + {591681600 -10800 1 -04} + {607402800 -14400 0 -04} + {625032000 -10800 1 -04} + {638938800 -14400 0 -04} + {654753600 -10800 1 -04} + {670474800 -14400 0 -04} + {686721600 -10800 1 -04} + {699418800 -14400 0 -04} + {718257600 -10800 1 -04} + {733546800 -14400 0 -04} + {749448000 -10800 1 -04} + {762318000 -14400 0 -04} + {780984000 -10800 1 -04} + {793767600 -14400 0 -04} + {812520000 -10800 1 -04} + {825649200 -14400 0 -04} + {844574400 -10800 1 -04} + {856666800 -14400 0 -04} + {876024000 -10800 1 -04} + {888721200 -14400 0 -04} + {907473600 -10800 1 -04} + {920775600 -14400 0 -04} + {938923200 -10800 1 -04} + {952225200 -14400 0 -04} + {970372800 -10800 1 -04} + {983674800 -14400 0 -04} + {1002427200 -10800 1 -04} + {1018148400 -14400 0 -04} + {1030852800 -10800 1 -04} + {1049598000 -14400 0 -04} + {1062907200 -10800 1 -04} + {1081047600 -14400 0 -04} + {1097985600 -10800 1 -04} + {1110682800 -14400 0 -04} + {1129435200 -10800 1 -04} + {1142132400 -14400 0 -04} + {1160884800 -10800 1 -04} + {1173582000 -14400 0 -04} + {1192939200 -10800 1 -04} + {1205031600 -14400 0 -04} + {1224388800 -10800 1 -04} + {1236481200 -14400 0 -04} + {1255838400 -10800 1 -04} + {1270954800 -14400 0 -04} + {1286078400 -10800 1 -04} + {1302404400 -14400 0 -04} + {1317528000 -10800 1 -04} + {1333854000 -14400 0 -04} + {1349582400 -10800 1 -04} + {1364094000 -14400 0 -04} + {1381032000 -10800 1 -04} + {1395543600 -14400 0 -04} + {1412481600 -10800 1 -04} + {1426993200 -14400 0 -04} + {1443931200 -10800 1 -04} + {1459047600 -14400 0 -04} + {1475380800 -10800 1 -04} + {1490497200 -14400 0 -04} + {1506830400 -10800 1 -04} + {1521946800 -14400 0 -04} + {1538884800 -10800 1 -04} + {1553396400 -14400 0 -04} + {1570334400 -10800 1 -04} + {1584846000 -14400 0 -04} + {1601784000 -10800 1 -04} + {1616900400 -14400 0 -04} + {1633233600 -10800 1 -04} + {1648350000 -14400 0 -04} + {1664683200 -10800 1 -04} + {1679799600 -14400 0 -04} + {1696132800 -10800 1 -04} + {1711249200 -14400 0 -04} + {1728187200 -10800 1 -04} + {1742698800 -14400 0 -04} + {1759636800 -10800 1 -04} + {1774148400 -14400 0 -04} + {1791086400 -10800 1 -04} + {1806202800 -14400 0 -04} + {1822536000 -10800 1 -04} + {1837652400 -14400 0 -04} + {1853985600 -10800 1 -04} + {1869102000 -14400 0 -04} + {1886040000 -10800 1 -04} + {1900551600 -14400 0 -04} + {1917489600 -10800 1 -04} + {1932001200 -14400 0 -04} + {1948939200 -10800 1 -04} + {1964055600 -14400 0 -04} + {1980388800 -10800 1 -04} + {1995505200 -14400 0 -04} + {2011838400 -10800 1 -04} + {2026954800 -14400 0 -04} + {2043288000 -10800 1 -04} + {2058404400 -14400 0 -04} + {2075342400 -10800 1 -04} + {2089854000 -14400 0 -04} + {2106792000 -10800 1 -04} + {2121303600 -14400 0 -04} + {2138241600 -10800 1 -04} + {2153358000 -14400 0 -04} + {2169691200 -10800 1 -04} + {2184807600 -14400 0 -04} + {2201140800 -10800 1 -04} + {2216257200 -14400 0 -04} + {2233195200 -10800 1 -04} + {2247706800 -14400 0 -04} + {2264644800 -10800 1 -04} + {2279156400 -14400 0 -04} + {2296094400 -10800 1 -04} + {2310606000 -14400 0 -04} + {2327544000 -10800 1 -04} + {2342660400 -14400 0 -04} + {2358993600 -10800 1 -04} + {2374110000 -14400 0 -04} + {2390443200 -10800 1 -04} + {2405559600 -14400 0 -04} + {2422497600 -10800 1 -04} + {2437009200 -14400 0 -04} + {2453947200 -10800 1 -04} + {2468458800 -14400 0 -04} + {2485396800 -10800 1 -04} + {2500513200 -14400 0 -04} + {2516846400 -10800 1 -04} + {2531962800 -14400 0 -04} + {2548296000 -10800 1 -04} + {2563412400 -14400 0 -04} + {2579745600 -10800 1 -04} + {2594862000 -14400 0 -04} + {2611800000 -10800 1 -04} + {2626311600 -14400 0 -04} + {2643249600 -10800 1 -04} + {2657761200 -14400 0 -04} + {2674699200 -10800 1 -04} + {2689815600 -14400 0 -04} + {2706148800 -10800 1 -04} + {2721265200 -14400 0 -04} + {2737598400 -10800 1 -04} + {2752714800 -14400 0 -04} + {2769652800 -10800 1 -04} + {2784164400 -14400 0 -04} + {2801102400 -10800 1 -04} + {2815614000 -14400 0 -04} + {2832552000 -10800 1 -04} + {2847668400 -14400 0 -04} + {2864001600 -10800 1 -04} + {2879118000 -14400 0 -04} + {2895451200 -10800 1 -04} + {2910567600 -14400 0 -04} + {2926900800 -10800 1 -04} + {2942017200 -14400 0 -04} + {2958955200 -10800 1 -04} + {2973466800 -14400 0 -04} + {2990404800 -10800 1 -04} + {3004916400 -14400 0 -04} + {3021854400 -10800 1 -04} + {3036970800 -14400 0 -04} + {3053304000 -10800 1 -04} + {3068420400 -14400 0 -04} + {3084753600 -10800 1 -04} + {3099870000 -14400 0 -04} + {3116808000 -10800 1 -04} + {3131319600 -14400 0 -04} + {3148257600 -10800 1 -04} + {3162769200 -14400 0 -04} + {3179707200 -10800 1 -04} + {3194218800 -14400 0 -04} + {3211156800 -10800 1 -04} + {3226273200 -14400 0 -04} + {3242606400 -10800 1 -04} + {3257722800 -14400 0 -04} + {3274056000 -10800 1 -04} + {3289172400 -14400 0 -04} + {3306110400 -10800 1 -04} + {3320622000 -14400 0 -04} + {3337560000 -10800 1 -04} + {3352071600 -14400 0 -04} + {3369009600 -10800 1 -04} + {3384126000 -14400 0 -04} + {3400459200 -10800 1 -04} + {3415575600 -14400 0 -04} + {3431908800 -10800 1 -04} + {3447025200 -14400 0 -04} + {3463358400 -10800 1 -04} + {3478474800 -14400 0 -04} + {3495412800 -10800 1 -04} + {3509924400 -14400 0 -04} + {3526862400 -10800 1 -04} + {3541374000 -14400 0 -04} + {3558312000 -10800 1 -04} + {3573428400 -14400 0 -04} + {3589761600 -10800 1 -04} + {3604878000 -14400 0 -04} + {3621211200 -10800 1 -04} + {3636327600 -14400 0 -04} + {3653265600 -10800 1 -04} + {3667777200 -14400 0 -04} + {3684715200 -10800 1 -04} + {3699226800 -14400 0 -04} + {3716164800 -10800 1 -04} + {3731281200 -14400 0 -04} + {3747614400 -10800 1 -04} + {3762730800 -14400 0 -04} + {3779064000 -10800 1 -04} + {3794180400 -14400 0 -04} + {3810513600 -10800 1 -04} + {3825630000 -14400 0 -04} + {3842568000 -10800 1 -04} + {3857079600 -14400 0 -04} + {3874017600 -10800 1 -04} + {3888529200 -14400 0 -04} + {3905467200 -10800 1 -04} + {3920583600 -14400 0 -04} + {3936916800 -10800 1 -04} + {3952033200 -14400 0 -04} + {3968366400 -10800 1 -04} + {3983482800 -14400 0 -04} + {4000420800 -10800 1 -04} + {4014932400 -14400 0 -04} + {4031870400 -10800 1 -04} + {4046382000 -14400 0 -04} + {4063320000 -10800 1 -04} + {4077831600 -14400 0 -04} + {4094769600 -10800 1 -04} +} diff --git a/env/tcl/tcl8.6/tzdata/America/Atikokan b/env/tcl/tcl8.6/tzdata/America/Atikokan new file mode 100644 index 0000000..e72b04f --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/America/Atikokan @@ -0,0 +1,12 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:America/Atikokan) { + {-9223372036854775808 -21988 0 LMT} + {-2366733212 -21600 0 CST} + {-1632067200 -18000 1 CDT} + {-1615136400 -21600 0 CST} + {-923248800 -18000 1 CDT} + {-880214400 -18000 0 CWT} + {-769395600 -18000 1 CPT} + {-765388800 -18000 0 EST} +} diff --git a/env/tcl/tcl8.6/tzdata/America/Atka b/env/tcl/tcl8.6/tzdata/America/Atka new file mode 100644 index 0000000..8da3302 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/America/Atka @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(America/Adak)]} { + LoadTimeZoneFile America/Adak +} +set TZData(:America/Atka) $TZData(:America/Adak) diff --git a/env/tcl/tcl8.6/tzdata/America/Bahia b/env/tcl/tcl8.6/tzdata/America/Bahia new file mode 100644 index 0000000..7aaf834 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/America/Bahia @@ -0,0 +1,68 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:America/Bahia) { + {-9223372036854775808 -9244 0 LMT} + {-1767216356 -10800 0 -03} + {-1206957600 -7200 1 -03} + {-1191362400 -10800 0 -03} + {-1175374800 -7200 1 -03} + {-1159826400 -10800 0 -03} + {-633819600 -7200 1 -03} + {-622069200 -10800 0 -03} + {-602283600 -7200 1 -03} + {-591832800 -10800 0 -03} + {-570747600 -7200 1 -03} + {-560210400 -10800 0 -03} + {-539125200 -7200 1 -03} + {-531352800 -10800 0 -03} + {-191365200 -7200 1 -03} + {-184197600 -10800 0 -03} + {-155163600 -7200 1 -03} + {-150069600 -10800 0 -03} + {-128898000 -7200 1 -03} + {-121125600 -10800 0 -03} + {-99954000 -7200 1 -03} + {-89589600 -10800 0 -03} + {-68418000 -7200 1 -03} + {-57967200 -10800 0 -03} + {499748400 -7200 1 -03} + {511236000 -10800 0 -03} + {530593200 -7200 1 -03} + {540266400 -10800 0 -03} + {562129200 -7200 1 -03} + {571197600 -10800 0 -03} + {592974000 -7200 1 -03} + {602042400 -10800 0 -03} + {624423600 -7200 1 -03} + {634701600 -10800 0 -03} + {656478000 -7200 1 -03} + {666756000 -10800 0 -03} + {687927600 -7200 1 -03} + {697600800 -10800 0 -03} + {719982000 -7200 1 -03} + {728445600 -10800 0 -03} + {750826800 -7200 1 -03} + {761709600 -10800 0 -03} + {782276400 -7200 1 -03} + {793159200 -10800 0 -03} + {813726000 -7200 1 -03} + {824004000 -10800 0 -03} + {844570800 -7200 1 -03} + {856058400 -10800 0 -03} + {876106800 -7200 1 -03} + {888717600 -10800 0 -03} + {908074800 -7200 1 -03} + {919562400 -10800 0 -03} + {938919600 -7200 1 -03} + {951616800 -10800 0 -03} + {970974000 -7200 1 -03} + {982461600 -10800 0 -03} + {1003028400 -7200 1 -03} + {1013911200 -10800 0 -03} + {1036292400 -7200 1 -03} + {1045360800 -10800 0 -03} + {1064368800 -10800 0 -03} + {1318734000 -7200 0 -03} + {1330221600 -10800 0 -03} + {1350784800 -10800 0 -03} +} diff --git a/env/tcl/tcl8.6/tzdata/America/Bahia_Banderas b/env/tcl/tcl8.6/tzdata/America/Bahia_Banderas new file mode 100644 index 0000000..8c40a0e --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/America/Bahia_Banderas @@ -0,0 +1,222 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:America/Bahia_Banderas) { + {-9223372036854775808 -25260 0 LMT} + {-1514739600 -25200 0 MST} + {-1343066400 -21600 0 CST} + {-1234807200 -25200 0 MST} + {-1220292000 -21600 0 CST} + {-1207159200 -25200 0 MST} + {-1191344400 -21600 0 CST} + {-873828000 -25200 0 MST} + {-661539600 -28800 0 PST} + {28800 -25200 0 MST} + {828867600 -21600 1 MDT} + {846403200 -25200 0 MST} + {860317200 -21600 1 MDT} + {877852800 -25200 0 MST} + {891766800 -21600 1 MDT} + {909302400 -25200 0 MST} + {923216400 -21600 1 MDT} + {941356800 -25200 0 MST} + {954666000 -21600 1 MDT} + {972806400 -25200 0 MST} + {989139600 -21600 1 MDT} + {1001836800 -25200 0 MST} + {1018170000 -21600 1 MDT} + {1035705600 -25200 0 MST} + {1049619600 -21600 1 MDT} + {1067155200 -25200 0 MST} + {1081069200 -21600 1 MDT} + {1099209600 -25200 0 MST} + {1112518800 -21600 1 MDT} + {1130659200 -25200 0 MST} + {1143968400 -21600 1 MDT} + {1162108800 -25200 0 MST} + {1175418000 -21600 1 MDT} + {1193558400 -25200 0 MST} + {1207472400 -21600 1 MDT} + {1225008000 -25200 0 MST} + {1238922000 -21600 1 MDT} + {1256457600 -25200 0 MST} + {1270371600 -18000 0 CDT} + {1288508400 -21600 0 CST} + {1301817600 -18000 1 CDT} + {1319958000 -21600 0 CST} + {1333267200 -18000 1 CDT} + {1351407600 -21600 0 CST} + {1365321600 -18000 1 CDT} + {1382857200 -21600 0 CST} + {1396771200 -18000 1 CDT} + {1414306800 -21600 0 CST} + {1428220800 -18000 1 CDT} + {1445756400 -21600 0 CST} + {1459670400 -18000 1 CDT} + {1477810800 -21600 0 CST} + {1491120000 -18000 1 CDT} + {1509260400 -21600 0 CST} + {1522569600 -18000 1 CDT} + {1540710000 -21600 0 CST} + {1554624000 -18000 1 CDT} + {1572159600 -21600 0 CST} + {1586073600 -18000 1 CDT} + {1603609200 -21600 0 CST} + {1617523200 -18000 1 CDT} + {1635663600 -21600 0 CST} + {1648972800 -18000 1 CDT} + {1667113200 -21600 0 CST} + {1680422400 -18000 1 CDT} + {1698562800 -21600 0 CST} + {1712476800 -18000 1 CDT} + {1730012400 -21600 0 CST} + {1743926400 -18000 1 CDT} + {1761462000 -21600 0 CST} + {1775376000 -18000 1 CDT} + {1792911600 -21600 0 CST} + {1806825600 -18000 1 CDT} + {1824966000 -21600 0 CST} + {1838275200 -18000 1 CDT} + {1856415600 -21600 0 CST} + {1869724800 -18000 1 CDT} + {1887865200 -21600 0 CST} + {1901779200 -18000 1 CDT} + {1919314800 -21600 0 CST} + {1933228800 -18000 1 CDT} + {1950764400 -21600 0 CST} + {1964678400 -18000 1 CDT} + {1982818800 -21600 0 CST} + {1996128000 -18000 1 CDT} + {2014268400 -21600 0 CST} + {2027577600 -18000 1 CDT} + {2045718000 -21600 0 CST} + {2059027200 -18000 1 CDT} + {2077167600 -21600 0 CST} + {2091081600 -18000 1 CDT} + {2108617200 -21600 0 CST} + {2122531200 -18000 1 CDT} + {2140066800 -21600 0 CST} + {2153980800 -18000 1 CDT} + {2172121200 -21600 0 CST} + {2185430400 -18000 1 CDT} + {2203570800 -21600 0 CST} + {2216880000 -18000 1 CDT} + {2235020400 -21600 0 CST} + {2248934400 -18000 1 CDT} + {2266470000 -21600 0 CST} + {2280384000 -18000 1 CDT} + {2297919600 -21600 0 CST} + {2311833600 -18000 1 CDT} + {2329369200 -21600 0 CST} + {2343283200 -18000 1 CDT} + {2361423600 -21600 0 CST} + {2374732800 -18000 1 CDT} + {2392873200 -21600 0 CST} + {2406182400 -18000 1 CDT} + {2424322800 -21600 0 CST} + {2438236800 -18000 1 CDT} + {2455772400 -21600 0 CST} + {2469686400 -18000 1 CDT} + {2487222000 -21600 0 CST} + {2501136000 -18000 1 CDT} + {2519276400 -21600 0 CST} + {2532585600 -18000 1 CDT} + {2550726000 -21600 0 CST} + {2564035200 -18000 1 CDT} + {2582175600 -21600 0 CST} + {2596089600 -18000 1 CDT} + {2613625200 -21600 0 CST} + {2627539200 -18000 1 CDT} + {2645074800 -21600 0 CST} + {2658988800 -18000 1 CDT} + {2676524400 -21600 0 CST} + {2690438400 -18000 1 CDT} + {2708578800 -21600 0 CST} + {2721888000 -18000 1 CDT} + {2740028400 -21600 0 CST} + {2753337600 -18000 1 CDT} + {2771478000 -21600 0 CST} + {2785392000 -18000 1 CDT} + {2802927600 -21600 0 CST} + {2816841600 -18000 1 CDT} + {2834377200 -21600 0 CST} + {2848291200 -18000 1 CDT} + {2866431600 -21600 0 CST} + {2879740800 -18000 1 CDT} + {2897881200 -21600 0 CST} + {2911190400 -18000 1 CDT} + {2929330800 -21600 0 CST} + {2942640000 -18000 1 CDT} + {2960780400 -21600 0 CST} + {2974694400 -18000 1 CDT} + {2992230000 -21600 0 CST} + {3006144000 -18000 1 CDT} + {3023679600 -21600 0 CST} + {3037593600 -18000 1 CDT} + {3055734000 -21600 0 CST} + {3069043200 -18000 1 CDT} + {3087183600 -21600 0 CST} + {3100492800 -18000 1 CDT} + {3118633200 -21600 0 CST} + {3132547200 -18000 1 CDT} + {3150082800 -21600 0 CST} + {3163996800 -18000 1 CDT} + {3181532400 -21600 0 CST} + {3195446400 -18000 1 CDT} + {3212982000 -21600 0 CST} + {3226896000 -18000 1 CDT} + {3245036400 -21600 0 CST} + {3258345600 -18000 1 CDT} + {3276486000 -21600 0 CST} + {3289795200 -18000 1 CDT} + {3307935600 -21600 0 CST} + {3321849600 -18000 1 CDT} + {3339385200 -21600 0 CST} + {3353299200 -18000 1 CDT} + {3370834800 -21600 0 CST} + {3384748800 -18000 1 CDT} + {3402889200 -21600 0 CST} + {3416198400 -18000 1 CDT} + {3434338800 -21600 0 CST} + {3447648000 -18000 1 CDT} + {3465788400 -21600 0 CST} + {3479702400 -18000 1 CDT} + {3497238000 -21600 0 CST} + {3511152000 -18000 1 CDT} + {3528687600 -21600 0 CST} + {3542601600 -18000 1 CDT} + {3560137200 -21600 0 CST} + {3574051200 -18000 1 CDT} + {3592191600 -21600 0 CST} + {3605500800 -18000 1 CDT} + {3623641200 -21600 0 CST} + {3636950400 -18000 1 CDT} + {3655090800 -21600 0 CST} + {3669004800 -18000 1 CDT} + {3686540400 -21600 0 CST} + {3700454400 -18000 1 CDT} + {3717990000 -21600 0 CST} + {3731904000 -18000 1 CDT} + {3750044400 -21600 0 CST} + {3763353600 -18000 1 CDT} + {3781494000 -21600 0 CST} + {3794803200 -18000 1 CDT} + {3812943600 -21600 0 CST} + {3826252800 -18000 1 CDT} + {3844393200 -21600 0 CST} + {3858307200 -18000 1 CDT} + {3875842800 -21600 0 CST} + {3889756800 -18000 1 CDT} + {3907292400 -21600 0 CST} + {3921206400 -18000 1 CDT} + {3939346800 -21600 0 CST} + {3952656000 -18000 1 CDT} + {3970796400 -21600 0 CST} + {3984105600 -18000 1 CDT} + {4002246000 -21600 0 CST} + {4016160000 -18000 1 CDT} + {4033695600 -21600 0 CST} + {4047609600 -18000 1 CDT} + {4065145200 -21600 0 CST} + {4079059200 -18000 1 CDT} + {4096594800 -21600 0 CST} +} diff --git a/env/tcl/tcl8.6/tzdata/America/Barbados b/env/tcl/tcl8.6/tzdata/America/Barbados new file mode 100644 index 0000000..ea17073 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/America/Barbados @@ -0,0 +1,15 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:America/Barbados) { + {-9223372036854775808 -14309 0 LMT} + {-1451678491 -14309 0 BMT} + {-1199217691 -14400 0 AST} + {234943200 -10800 1 ADT} + {244616400 -14400 0 AST} + {261554400 -10800 1 ADT} + {276066000 -14400 0 AST} + {293004000 -10800 1 ADT} + {307515600 -14400 0 AST} + {325058400 -10800 1 ADT} + {338706000 -14400 0 AST} +} diff --git a/env/tcl/tcl8.6/tzdata/America/Belem b/env/tcl/tcl8.6/tzdata/America/Belem new file mode 100644 index 0000000..42a3ec5 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/America/Belem @@ -0,0 +1,35 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:America/Belem) { + {-9223372036854775808 -11636 0 LMT} + {-1767213964 -10800 0 -03} + {-1206957600 -7200 1 -03} + {-1191362400 -10800 0 -03} + {-1175374800 -7200 1 -03} + {-1159826400 -10800 0 -03} + {-633819600 -7200 1 -03} + {-622069200 -10800 0 -03} + {-602283600 -7200 1 -03} + {-591832800 -10800 0 -03} + {-570747600 -7200 1 -03} + {-560210400 -10800 0 -03} + {-539125200 -7200 1 -03} + {-531352800 -10800 0 -03} + {-191365200 -7200 1 -03} + {-184197600 -10800 0 -03} + {-155163600 -7200 1 -03} + {-150069600 -10800 0 -03} + {-128898000 -7200 1 -03} + {-121125600 -10800 0 -03} + {-99954000 -7200 1 -03} + {-89589600 -10800 0 -03} + {-68418000 -7200 1 -03} + {-57967200 -10800 0 -03} + {499748400 -7200 1 -03} + {511236000 -10800 0 -03} + {530593200 -7200 1 -03} + {540266400 -10800 0 -03} + {562129200 -7200 1 -03} + {571197600 -10800 0 -03} + {590032800 -10800 0 -03} +} diff --git a/env/tcl/tcl8.6/tzdata/America/Belize b/env/tcl/tcl8.6/tzdata/America/Belize new file mode 100644 index 0000000..5b46388 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/America/Belize @@ -0,0 +1,60 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:America/Belize) { + {-9223372036854775808 -21168 0 LMT} + {-1822500432 -21600 0 CST} + {-1616954400 -19800 1 -0530} + {-1606069800 -21600 0 CST} + {-1585504800 -19800 1 -0530} + {-1574015400 -21600 0 CST} + {-1554055200 -19800 1 -0530} + {-1542565800 -21600 0 CST} + {-1522605600 -19800 1 -0530} + {-1511116200 -21600 0 CST} + {-1490551200 -19800 1 -0530} + {-1479666600 -21600 0 CST} + {-1459101600 -19800 1 -0530} + {-1448217000 -21600 0 CST} + {-1427652000 -19800 1 -0530} + {-1416162600 -21600 0 CST} + {-1396202400 -19800 1 -0530} + {-1384713000 -21600 0 CST} + {-1364752800 -19800 1 -0530} + {-1353263400 -21600 0 CST} + {-1333303200 -19800 1 -0530} + {-1321813800 -21600 0 CST} + {-1301248800 -19800 1 -0530} + {-1290364200 -21600 0 CST} + {-1269799200 -19800 1 -0530} + {-1258914600 -21600 0 CST} + {-1238349600 -19800 1 -0530} + {-1226860200 -21600 0 CST} + {-1206900000 -19800 1 -0530} + {-1195410600 -21600 0 CST} + {-1175450400 -19800 1 -0530} + {-1163961000 -21600 0 CST} + {-1143396000 -19800 1 -0530} + {-1132511400 -21600 0 CST} + {-1111946400 -19800 1 -0530} + {-1101061800 -21600 0 CST} + {-1080496800 -19800 1 -0530} + {-1069612200 -21600 0 CST} + {-1049047200 -19800 1 -0530} + {-1037557800 -21600 0 CST} + {-1017597600 -19800 1 -0530} + {-1006108200 -21600 0 CST} + {-986148000 -19800 1 -0530} + {-974658600 -21600 0 CST} + {-954093600 -19800 1 -0530} + {-943209000 -21600 0 CST} + {-922644000 -19800 1 -0530} + {-911759400 -21600 0 CST} + {-891194400 -19800 1 -0530} + {-879705000 -21600 0 CST} + {-859744800 -19800 1 -0530} + {-848255400 -21600 0 CST} + {123919200 -18000 1 CDT} + {129618000 -21600 0 CST} + {409039200 -18000 1 CDT} + {413874000 -21600 0 CST} +} diff --git a/env/tcl/tcl8.6/tzdata/America/Blanc-Sablon b/env/tcl/tcl8.6/tzdata/America/Blanc-Sablon new file mode 100644 index 0000000..d5485e8 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/America/Blanc-Sablon @@ -0,0 +1,12 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:America/Blanc-Sablon) { + {-9223372036854775808 -13708 0 LMT} + {-2713896692 -14400 0 AST} + {-1632074400 -10800 1 ADT} + {-1615143600 -14400 0 AST} + {-880221600 -10800 1 AWT} + {-769395600 -10800 1 APT} + {-765399600 -14400 0 AST} + {14400 -14400 0 AST} +} diff --git a/env/tcl/tcl8.6/tzdata/America/Boa_Vista b/env/tcl/tcl8.6/tzdata/America/Boa_Vista new file mode 100644 index 0000000..0af989e --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/America/Boa_Vista @@ -0,0 +1,40 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:America/Boa_Vista) { + {-9223372036854775808 -14560 0 LMT} + {-1767211040 -14400 0 -04} + {-1206954000 -10800 1 -04} + {-1191358800 -14400 0 -04} + {-1175371200 -10800 1 -04} + {-1159822800 -14400 0 -04} + {-633816000 -10800 1 -04} + {-622065600 -14400 0 -04} + {-602280000 -10800 1 -04} + {-591829200 -14400 0 -04} + {-570744000 -10800 1 -04} + {-560206800 -14400 0 -04} + {-539121600 -10800 1 -04} + {-531349200 -14400 0 -04} + {-191361600 -10800 1 -04} + {-184194000 -14400 0 -04} + {-155160000 -10800 1 -04} + {-150066000 -14400 0 -04} + {-128894400 -10800 1 -04} + {-121122000 -14400 0 -04} + {-99950400 -10800 1 -04} + {-89586000 -14400 0 -04} + {-68414400 -10800 1 -04} + {-57963600 -14400 0 -04} + {499752000 -10800 1 -04} + {511239600 -14400 0 -04} + {530596800 -10800 1 -04} + {540270000 -14400 0 -04} + {562132800 -10800 1 -04} + {571201200 -14400 0 -04} + {590036400 -14400 0 -04} + {938664000 -14400 0 -04} + {938923200 -10800 1 -04} + {951620400 -14400 0 -04} + {970977600 -10800 1 -04} + {971578800 -14400 0 -04} +} diff --git a/env/tcl/tcl8.6/tzdata/America/Bogota b/env/tcl/tcl8.6/tzdata/America/Bogota new file mode 100644 index 0000000..8ca39ba --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/America/Bogota @@ -0,0 +1,9 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:America/Bogota) { + {-9223372036854775808 -17776 0 LMT} + {-2707671824 -17776 0 BMT} + {-1739041424 -18000 0 -05} + {704869200 -14400 1 -05} + {733896000 -18000 0 -05} +} diff --git a/env/tcl/tcl8.6/tzdata/America/Boise b/env/tcl/tcl8.6/tzdata/America/Boise new file mode 100644 index 0000000..62b22a0 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/America/Boise @@ -0,0 +1,281 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:America/Boise) { + {-9223372036854775808 -27889 0 LMT} + {-2717640000 -28800 0 PST} + {-1633269600 -25200 1 PDT} + {-1615129200 -28800 0 PST} + {-1601820000 -25200 1 PDT} + {-1583679600 -28800 0 PST} + {-1471788000 -25200 0 MST} + {-880210800 -21600 1 MWT} + {-769395600 -21600 1 MPT} + {-765388800 -25200 0 MST} + {-84380400 -21600 1 MDT} + {-68659200 -25200 0 MST} + {-52930800 -21600 1 MDT} + {-37209600 -25200 0 MST} + {-21481200 -21600 1 MDT} + {-5760000 -25200 0 MST} + {9968400 -21600 1 MDT} + {25689600 -25200 0 MST} + {41418000 -21600 1 MDT} + {57744000 -25200 0 MST} + {73472400 -21600 1 MDT} + {89193600 -25200 0 MST} + {104922000 -21600 1 MDT} + {120643200 -25200 0 MST} + {126255600 -25200 0 MST} + {129114000 -21600 0 MDT} + {152092800 -25200 0 MST} + {162378000 -21600 1 MDT} + {183542400 -25200 0 MST} + {199270800 -21600 1 MDT} + {215596800 -25200 0 MST} + {230720400 -21600 1 MDT} + {247046400 -25200 0 MST} + {262774800 -21600 1 MDT} + {278496000 -25200 0 MST} + {294224400 -21600 1 MDT} + {309945600 -25200 0 MST} + {325674000 -21600 1 MDT} + {341395200 -25200 0 MST} + {357123600 -21600 1 MDT} + {372844800 -25200 0 MST} + {388573200 -21600 1 MDT} + {404899200 -25200 0 MST} + {420022800 -21600 1 MDT} + {436348800 -25200 0 MST} + {452077200 -21600 1 MDT} + {467798400 -25200 0 MST} + {483526800 -21600 1 MDT} + {499248000 -25200 0 MST} + {514976400 -21600 1 MDT} + {530697600 -25200 0 MST} + {544611600 -21600 1 MDT} + {562147200 -25200 0 MST} + {576061200 -21600 1 MDT} + {594201600 -25200 0 MST} + {607510800 -21600 1 MDT} + {625651200 -25200 0 MST} + {638960400 -21600 1 MDT} + {657100800 -25200 0 MST} + {671014800 -21600 1 MDT} + {688550400 -25200 0 MST} + {702464400 -21600 1 MDT} + {720000000 -25200 0 MST} + {733914000 -21600 1 MDT} + {752054400 -25200 0 MST} + {765363600 -21600 1 MDT} + {783504000 -25200 0 MST} + {796813200 -21600 1 MDT} + {814953600 -25200 0 MST} + {828867600 -21600 1 MDT} + {846403200 -25200 0 MST} + {860317200 -21600 1 MDT} + {877852800 -25200 0 MST} + {891766800 -21600 1 MDT} + {909302400 -25200 0 MST} + {923216400 -21600 1 MDT} + {941356800 -25200 0 MST} + {954666000 -21600 1 MDT} + {972806400 -25200 0 MST} + {986115600 -21600 1 MDT} + {1004256000 -25200 0 MST} + {1018170000 -21600 1 MDT} + {1035705600 -25200 0 MST} + {1049619600 -21600 1 MDT} + {1067155200 -25200 0 MST} + {1081069200 -21600 1 MDT} + {1099209600 -25200 0 MST} + {1112518800 -21600 1 MDT} + {1130659200 -25200 0 MST} + {1143968400 -21600 1 MDT} + {1162108800 -25200 0 MST} + {1173603600 -21600 1 MDT} + {1194163200 -25200 0 MST} + {1205053200 -21600 1 MDT} + {1225612800 -25200 0 MST} + {1236502800 -21600 1 MDT} + {1257062400 -25200 0 MST} + {1268557200 -21600 1 MDT} + {1289116800 -25200 0 MST} + {1300006800 -21600 1 MDT} + {1320566400 -25200 0 MST} + {1331456400 -21600 1 MDT} + {1352016000 -25200 0 MST} + {1362906000 -21600 1 MDT} + {1383465600 -25200 0 MST} + {1394355600 -21600 1 MDT} + {1414915200 -25200 0 MST} + {1425805200 -21600 1 MDT} + {1446364800 -25200 0 MST} + {1457859600 -21600 1 MDT} + {1478419200 -25200 0 MST} + {1489309200 -21600 1 MDT} + {1509868800 -25200 0 MST} + {1520758800 -21600 1 MDT} + {1541318400 -25200 0 MST} + {1552208400 -21600 1 MDT} + {1572768000 -25200 0 MST} + {1583658000 -21600 1 MDT} + {1604217600 -25200 0 MST} + {1615712400 -21600 1 MDT} + {1636272000 -25200 0 MST} + {1647162000 -21600 1 MDT} + {1667721600 -25200 0 MST} + {1678611600 -21600 1 MDT} + {1699171200 -25200 0 MST} + {1710061200 -21600 1 MDT} + {1730620800 -25200 0 MST} + {1741510800 -21600 1 MDT} + {1762070400 -25200 0 MST} + {1772960400 -21600 1 MDT} + {1793520000 -25200 0 MST} + {1805014800 -21600 1 MDT} + {1825574400 -25200 0 MST} + {1836464400 -21600 1 MDT} + {1857024000 -25200 0 MST} + {1867914000 -21600 1 MDT} + {1888473600 -25200 0 MST} + {1899363600 -21600 1 MDT} + {1919923200 -25200 0 MST} + {1930813200 -21600 1 MDT} + {1951372800 -25200 0 MST} + {1962867600 -21600 1 MDT} + {1983427200 -25200 0 MST} + {1994317200 -21600 1 MDT} + {2014876800 -25200 0 MST} + {2025766800 -21600 1 MDT} + {2046326400 -25200 0 MST} + {2057216400 -21600 1 MDT} + {2077776000 -25200 0 MST} + {2088666000 -21600 1 MDT} + {2109225600 -25200 0 MST} + {2120115600 -21600 1 MDT} + {2140675200 -25200 0 MST} + {2152170000 -21600 1 MDT} + {2172729600 -25200 0 MST} + {2183619600 -21600 1 MDT} + {2204179200 -25200 0 MST} + {2215069200 -21600 1 MDT} + {2235628800 -25200 0 MST} + {2246518800 -21600 1 MDT} + {2267078400 -25200 0 MST} + {2277968400 -21600 1 MDT} + {2298528000 -25200 0 MST} + {2309418000 -21600 1 MDT} + {2329977600 -25200 0 MST} + {2341472400 -21600 1 MDT} + {2362032000 -25200 0 MST} + {2372922000 -21600 1 MDT} + {2393481600 -25200 0 MST} + {2404371600 -21600 1 MDT} + {2424931200 -25200 0 MST} + {2435821200 -21600 1 MDT} + {2456380800 -25200 0 MST} + {2467270800 -21600 1 MDT} + {2487830400 -25200 0 MST} + {2499325200 -21600 1 MDT} + {2519884800 -25200 0 MST} + {2530774800 -21600 1 MDT} + {2551334400 -25200 0 MST} + {2562224400 -21600 1 MDT} + {2582784000 -25200 0 MST} + {2593674000 -21600 1 MDT} + {2614233600 -25200 0 MST} + {2625123600 -21600 1 MDT} + {2645683200 -25200 0 MST} + {2656573200 -21600 1 MDT} + {2677132800 -25200 0 MST} + {2688627600 -21600 1 MDT} + {2709187200 -25200 0 MST} + {2720077200 -21600 1 MDT} + {2740636800 -25200 0 MST} + {2751526800 -21600 1 MDT} + {2772086400 -25200 0 MST} + {2782976400 -21600 1 MDT} + {2803536000 -25200 0 MST} + {2814426000 -21600 1 MDT} + {2834985600 -25200 0 MST} + {2846480400 -21600 1 MDT} + {2867040000 -25200 0 MST} + {2877930000 -21600 1 MDT} + {2898489600 -25200 0 MST} + {2909379600 -21600 1 MDT} + {2929939200 -25200 0 MST} + {2940829200 -21600 1 MDT} + {2961388800 -25200 0 MST} + {2972278800 -21600 1 MDT} + {2992838400 -25200 0 MST} + {3003728400 -21600 1 MDT} + {3024288000 -25200 0 MST} + {3035782800 -21600 1 MDT} + {3056342400 -25200 0 MST} + {3067232400 -21600 1 MDT} + {3087792000 -25200 0 MST} + {3098682000 -21600 1 MDT} + {3119241600 -25200 0 MST} + {3130131600 -21600 1 MDT} + {3150691200 -25200 0 MST} + {3161581200 -21600 1 MDT} + {3182140800 -25200 0 MST} + {3193030800 -21600 1 MDT} + {3213590400 -25200 0 MST} + {3225085200 -21600 1 MDT} + {3245644800 -25200 0 MST} + {3256534800 -21600 1 MDT} + {3277094400 -25200 0 MST} + {3287984400 -21600 1 MDT} + {3308544000 -25200 0 MST} + {3319434000 -21600 1 MDT} + {3339993600 -25200 0 MST} + {3350883600 -21600 1 MDT} + {3371443200 -25200 0 MST} + {3382938000 -21600 1 MDT} + {3403497600 -25200 0 MST} + {3414387600 -21600 1 MDT} + {3434947200 -25200 0 MST} + {3445837200 -21600 1 MDT} + {3466396800 -25200 0 MST} + {3477286800 -21600 1 MDT} + {3497846400 -25200 0 MST} + {3508736400 -21600 1 MDT} + {3529296000 -25200 0 MST} + {3540186000 -21600 1 MDT} + {3560745600 -25200 0 MST} + {3572240400 -21600 1 MDT} + {3592800000 -25200 0 MST} + {3603690000 -21600 1 MDT} + {3624249600 -25200 0 MST} + {3635139600 -21600 1 MDT} + {3655699200 -25200 0 MST} + {3666589200 -21600 1 MDT} + {3687148800 -25200 0 MST} + {3698038800 -21600 1 MDT} + {3718598400 -25200 0 MST} + {3730093200 -21600 1 MDT} + {3750652800 -25200 0 MST} + {3761542800 -21600 1 MDT} + {3782102400 -25200 0 MST} + {3792992400 -21600 1 MDT} + {3813552000 -25200 0 MST} + {3824442000 -21600 1 MDT} + {3845001600 -25200 0 MST} + {3855891600 -21600 1 MDT} + {3876451200 -25200 0 MST} + {3887341200 -21600 1 MDT} + {3907900800 -25200 0 MST} + {3919395600 -21600 1 MDT} + {3939955200 -25200 0 MST} + {3950845200 -21600 1 MDT} + {3971404800 -25200 0 MST} + {3982294800 -21600 1 MDT} + {4002854400 -25200 0 MST} + {4013744400 -21600 1 MDT} + {4034304000 -25200 0 MST} + {4045194000 -21600 1 MDT} + {4065753600 -25200 0 MST} + {4076643600 -21600 1 MDT} + {4097203200 -25200 0 MST} +} diff --git a/env/tcl/tcl8.6/tzdata/America/Buenos_Aires b/env/tcl/tcl8.6/tzdata/America/Buenos_Aires new file mode 100644 index 0000000..1389195 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/America/Buenos_Aires @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(America/Argentina/Buenos_Aires)]} { + LoadTimeZoneFile America/Argentina/Buenos_Aires +} +set TZData(:America/Buenos_Aires) $TZData(:America/Argentina/Buenos_Aires) diff --git a/env/tcl/tcl8.6/tzdata/America/Cambridge_Bay b/env/tcl/tcl8.6/tzdata/America/Cambridge_Bay new file mode 100644 index 0000000..3115ee1 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/America/Cambridge_Bay @@ -0,0 +1,252 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:America/Cambridge_Bay) { + {-9223372036854775808 0 0 -00} + {-1577923200 -25200 0 MST} + {-880210800 -21600 1 MWT} + {-769395600 -21600 1 MPT} + {-765388800 -25200 0 MST} + {-147891600 -18000 1 MDDT} + {-131562000 -25200 0 MST} + {325674000 -21600 1 MDT} + {341395200 -25200 0 MST} + {357123600 -21600 1 MDT} + {372844800 -25200 0 MST} + {388573200 -21600 1 MDT} + {404899200 -25200 0 MST} + {420022800 -21600 1 MDT} + {436348800 -25200 0 MST} + {452077200 -21600 1 MDT} + {467798400 -25200 0 MST} + {483526800 -21600 1 MDT} + {499248000 -25200 0 MST} + {514976400 -21600 1 MDT} + {530697600 -25200 0 MST} + {544611600 -21600 1 MDT} + {562147200 -25200 0 MST} + {576061200 -21600 1 MDT} + {594201600 -25200 0 MST} + {607510800 -21600 1 MDT} + {625651200 -25200 0 MST} + {638960400 -21600 1 MDT} + {657100800 -25200 0 MST} + {671014800 -21600 1 MDT} + {688550400 -25200 0 MST} + {702464400 -21600 1 MDT} + {720000000 -25200 0 MST} + {733914000 -21600 1 MDT} + {752054400 -25200 0 MST} + {765363600 -21600 1 MDT} + {783504000 -25200 0 MST} + {796813200 -21600 1 MDT} + {814953600 -25200 0 MST} + {828867600 -21600 1 MDT} + {846403200 -25200 0 MST} + {860317200 -21600 1 MDT} + {877852800 -25200 0 MST} + {891766800 -21600 1 MDT} + {909302400 -25200 0 MST} + {923216400 -21600 1 MDT} + {941360400 -21600 0 CST} + {954662400 -18000 1 CDT} + {972806400 -18000 0 EST} + {973400400 -21600 0 CST} + {986115600 -21600 0 MDT} + {1004256000 -25200 0 MST} + {1018170000 -21600 1 MDT} + {1035705600 -25200 0 MST} + {1049619600 -21600 1 MDT} + {1067155200 -25200 0 MST} + {1081069200 -21600 1 MDT} + {1099209600 -25200 0 MST} + {1112518800 -21600 1 MDT} + {1130659200 -25200 0 MST} + {1143968400 -21600 1 MDT} + {1162108800 -25200 0 MST} + {1173603600 -21600 1 MDT} + {1194163200 -25200 0 MST} + {1205053200 -21600 1 MDT} + {1225612800 -25200 0 MST} + {1236502800 -21600 1 MDT} + {1257062400 -25200 0 MST} + {1268557200 -21600 1 MDT} + {1289116800 -25200 0 MST} + {1300006800 -21600 1 MDT} + {1320566400 -25200 0 MST} + {1331456400 -21600 1 MDT} + {1352016000 -25200 0 MST} + {1362906000 -21600 1 MDT} + {1383465600 -25200 0 MST} + {1394355600 -21600 1 MDT} + {1414915200 -25200 0 MST} + {1425805200 -21600 1 MDT} + {1446364800 -25200 0 MST} + {1457859600 -21600 1 MDT} + {1478419200 -25200 0 MST} + {1489309200 -21600 1 MDT} + {1509868800 -25200 0 MST} + {1520758800 -21600 1 MDT} + {1541318400 -25200 0 MST} + {1552208400 -21600 1 MDT} + {1572768000 -25200 0 MST} + {1583658000 -21600 1 MDT} + {1604217600 -25200 0 MST} + {1615712400 -21600 1 MDT} + {1636272000 -25200 0 MST} + {1647162000 -21600 1 MDT} + {1667721600 -25200 0 MST} + {1678611600 -21600 1 MDT} + {1699171200 -25200 0 MST} + {1710061200 -21600 1 MDT} + {1730620800 -25200 0 MST} + {1741510800 -21600 1 MDT} + {1762070400 -25200 0 MST} + {1772960400 -21600 1 MDT} + {1793520000 -25200 0 MST} + {1805014800 -21600 1 MDT} + {1825574400 -25200 0 MST} + {1836464400 -21600 1 MDT} + {1857024000 -25200 0 MST} + {1867914000 -21600 1 MDT} + {1888473600 -25200 0 MST} + {1899363600 -21600 1 MDT} + {1919923200 -25200 0 MST} + {1930813200 -21600 1 MDT} + {1951372800 -25200 0 MST} + {1962867600 -21600 1 MDT} + {1983427200 -25200 0 MST} + {1994317200 -21600 1 MDT} + {2014876800 -25200 0 MST} + {2025766800 -21600 1 MDT} + {2046326400 -25200 0 MST} + {2057216400 -21600 1 MDT} + {2077776000 -25200 0 MST} + {2088666000 -21600 1 MDT} + {2109225600 -25200 0 MST} + {2120115600 -21600 1 MDT} + {2140675200 -25200 0 MST} + {2152170000 -21600 1 MDT} + {2172729600 -25200 0 MST} + {2183619600 -21600 1 MDT} + {2204179200 -25200 0 MST} + {2215069200 -21600 1 MDT} + {2235628800 -25200 0 MST} + {2246518800 -21600 1 MDT} + {2267078400 -25200 0 MST} + {2277968400 -21600 1 MDT} + {2298528000 -25200 0 MST} + {2309418000 -21600 1 MDT} + {2329977600 -25200 0 MST} + {2341472400 -21600 1 MDT} + {2362032000 -25200 0 MST} + {2372922000 -21600 1 MDT} + {2393481600 -25200 0 MST} + {2404371600 -21600 1 MDT} + {2424931200 -25200 0 MST} + {2435821200 -21600 1 MDT} + {2456380800 -25200 0 MST} + {2467270800 -21600 1 MDT} + {2487830400 -25200 0 MST} + {2499325200 -21600 1 MDT} + {2519884800 -25200 0 MST} + {2530774800 -21600 1 MDT} + {2551334400 -25200 0 MST} + {2562224400 -21600 1 MDT} + {2582784000 -25200 0 MST} + {2593674000 -21600 1 MDT} + {2614233600 -25200 0 MST} + {2625123600 -21600 1 MDT} + {2645683200 -25200 0 MST} + {2656573200 -21600 1 MDT} + {2677132800 -25200 0 MST} + {2688627600 -21600 1 MDT} + {2709187200 -25200 0 MST} + {2720077200 -21600 1 MDT} + {2740636800 -25200 0 MST} + {2751526800 -21600 1 MDT} + {2772086400 -25200 0 MST} + {2782976400 -21600 1 MDT} + {2803536000 -25200 0 MST} + {2814426000 -21600 1 MDT} + {2834985600 -25200 0 MST} + {2846480400 -21600 1 MDT} + {2867040000 -25200 0 MST} + {2877930000 -21600 1 MDT} + {2898489600 -25200 0 MST} + {2909379600 -21600 1 MDT} + {2929939200 -25200 0 MST} + {2940829200 -21600 1 MDT} + {2961388800 -25200 0 MST} + {2972278800 -21600 1 MDT} + {2992838400 -25200 0 MST} + {3003728400 -21600 1 MDT} + {3024288000 -25200 0 MST} + {3035782800 -21600 1 MDT} + {3056342400 -25200 0 MST} + {3067232400 -21600 1 MDT} + {3087792000 -25200 0 MST} + {3098682000 -21600 1 MDT} + {3119241600 -25200 0 MST} + {3130131600 -21600 1 MDT} + {3150691200 -25200 0 MST} + {3161581200 -21600 1 MDT} + {3182140800 -25200 0 MST} + {3193030800 -21600 1 MDT} + {3213590400 -25200 0 MST} + {3225085200 -21600 1 MDT} + {3245644800 -25200 0 MST} + {3256534800 -21600 1 MDT} + {3277094400 -25200 0 MST} + {3287984400 -21600 1 MDT} + {3308544000 -25200 0 MST} + {3319434000 -21600 1 MDT} + {3339993600 -25200 0 MST} + {3350883600 -21600 1 MDT} + {3371443200 -25200 0 MST} + {3382938000 -21600 1 MDT} + {3403497600 -25200 0 MST} + {3414387600 -21600 1 MDT} + {3434947200 -25200 0 MST} + {3445837200 -21600 1 MDT} + {3466396800 -25200 0 MST} + {3477286800 -21600 1 MDT} + {3497846400 -25200 0 MST} + {3508736400 -21600 1 MDT} + {3529296000 -25200 0 MST} + {3540186000 -21600 1 MDT} + {3560745600 -25200 0 MST} + {3572240400 -21600 1 MDT} + {3592800000 -25200 0 MST} + {3603690000 -21600 1 MDT} + {3624249600 -25200 0 MST} + {3635139600 -21600 1 MDT} + {3655699200 -25200 0 MST} + {3666589200 -21600 1 MDT} + {3687148800 -25200 0 MST} + {3698038800 -21600 1 MDT} + {3718598400 -25200 0 MST} + {3730093200 -21600 1 MDT} + {3750652800 -25200 0 MST} + {3761542800 -21600 1 MDT} + {3782102400 -25200 0 MST} + {3792992400 -21600 1 MDT} + {3813552000 -25200 0 MST} + {3824442000 -21600 1 MDT} + {3845001600 -25200 0 MST} + {3855891600 -21600 1 MDT} + {3876451200 -25200 0 MST} + {3887341200 -21600 1 MDT} + {3907900800 -25200 0 MST} + {3919395600 -21600 1 MDT} + {3939955200 -25200 0 MST} + {3950845200 -21600 1 MDT} + {3971404800 -25200 0 MST} + {3982294800 -21600 1 MDT} + {4002854400 -25200 0 MST} + {4013744400 -21600 1 MDT} + {4034304000 -25200 0 MST} + {4045194000 -21600 1 MDT} + {4065753600 -25200 0 MST} + {4076643600 -21600 1 MDT} + {4097203200 -25200 0 MST} +} diff --git a/env/tcl/tcl8.6/tzdata/America/Campo_Grande b/env/tcl/tcl8.6/tzdata/America/Campo_Grande new file mode 100644 index 0000000..5ec7112 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/America/Campo_Grande @@ -0,0 +1,257 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:America/Campo_Grande) { + {-9223372036854775808 -13108 0 LMT} + {-1767212492 -14400 0 -04} + {-1206954000 -10800 1 -04} + {-1191358800 -14400 0 -04} + {-1175371200 -10800 1 -04} + {-1159822800 -14400 0 -04} + {-633816000 -10800 1 -04} + {-622065600 -14400 0 -04} + {-602280000 -10800 1 -04} + {-591829200 -14400 0 -04} + {-570744000 -10800 1 -04} + {-560206800 -14400 0 -04} + {-539121600 -10800 1 -04} + {-531349200 -14400 0 -04} + {-191361600 -10800 1 -04} + {-184194000 -14400 0 -04} + {-155160000 -10800 1 -04} + {-150066000 -14400 0 -04} + {-128894400 -10800 1 -04} + {-121122000 -14400 0 -04} + {-99950400 -10800 1 -04} + {-89586000 -14400 0 -04} + {-68414400 -10800 1 -04} + {-57963600 -14400 0 -04} + {499752000 -10800 1 -04} + {511239600 -14400 0 -04} + {530596800 -10800 1 -04} + {540270000 -14400 0 -04} + {562132800 -10800 1 -04} + {571201200 -14400 0 -04} + {592977600 -10800 1 -04} + {602046000 -14400 0 -04} + {624427200 -10800 1 -04} + {634705200 -14400 0 -04} + {656481600 -10800 1 -04} + {666759600 -14400 0 -04} + {687931200 -10800 1 -04} + {697604400 -14400 0 -04} + {719985600 -10800 1 -04} + {728449200 -14400 0 -04} + {750830400 -10800 1 -04} + {761713200 -14400 0 -04} + {782280000 -10800 1 -04} + {793162800 -14400 0 -04} + {813729600 -10800 1 -04} + {824007600 -14400 0 -04} + {844574400 -10800 1 -04} + {856062000 -14400 0 -04} + {876110400 -10800 1 -04} + {888721200 -14400 0 -04} + {908078400 -10800 1 -04} + {919566000 -14400 0 -04} + {938923200 -10800 1 -04} + {951620400 -14400 0 -04} + {970977600 -10800 1 -04} + {982465200 -14400 0 -04} + {1003032000 -10800 1 -04} + {1013914800 -14400 0 -04} + {1036296000 -10800 1 -04} + {1045364400 -14400 0 -04} + {1066536000 -10800 1 -04} + {1076814000 -14400 0 -04} + {1099368000 -10800 1 -04} + {1108868400 -14400 0 -04} + {1129435200 -10800 1 -04} + {1140318000 -14400 0 -04} + {1162699200 -10800 1 -04} + {1172372400 -14400 0 -04} + {1192334400 -10800 1 -04} + {1203217200 -14400 0 -04} + {1224388800 -10800 1 -04} + {1234666800 -14400 0 -04} + {1255838400 -10800 1 -04} + {1266721200 -14400 0 -04} + {1287288000 -10800 1 -04} + {1298170800 -14400 0 -04} + {1318737600 -10800 1 -04} + {1330225200 -14400 0 -04} + {1350792000 -10800 1 -04} + {1361070000 -14400 0 -04} + {1382241600 -10800 1 -04} + {1392519600 -14400 0 -04} + {1413691200 -10800 1 -04} + {1424574000 -14400 0 -04} + {1445140800 -10800 1 -04} + {1456023600 -14400 0 -04} + {1476590400 -10800 1 -04} + {1487473200 -14400 0 -04} + {1508040000 -10800 1 -04} + {1518922800 -14400 0 -04} + {1541304000 -10800 1 -04} + {1550372400 -14400 0 -04} + {1572753600 -10800 1 -04} + {1581822000 -14400 0 -04} + {1604203200 -10800 1 -04} + {1613876400 -14400 0 -04} + {1636257600 -10800 1 -04} + {1645326000 -14400 0 -04} + {1667707200 -10800 1 -04} + {1677380400 -14400 0 -04} + {1699156800 -10800 1 -04} + {1708225200 -14400 0 -04} + {1730606400 -10800 1 -04} + {1739674800 -14400 0 -04} + {1762056000 -10800 1 -04} + {1771729200 -14400 0 -04} + {1793505600 -10800 1 -04} + {1803178800 -14400 0 -04} + {1825560000 -10800 1 -04} + {1834628400 -14400 0 -04} + {1857009600 -10800 1 -04} + {1866078000 -14400 0 -04} + {1888459200 -10800 1 -04} + {1897527600 -14400 0 -04} + {1919908800 -10800 1 -04} + {1928977200 -14400 0 -04} + {1951358400 -10800 1 -04} + {1960426800 -14400 0 -04} + {1983412800 -10800 1 -04} + {1992481200 -14400 0 -04} + {2014862400 -10800 1 -04} + {2024535600 -14400 0 -04} + {2046312000 -10800 1 -04} + {2055380400 -14400 0 -04} + {2077761600 -10800 1 -04} + {2086830000 -14400 0 -04} + {2109211200 -10800 1 -04} + {2118884400 -14400 0 -04} + {2140660800 -10800 1 -04} + {2150334000 -14400 0 -04} + {2172715200 -10800 1 -04} + {2181783600 -14400 0 -04} + {2204164800 -10800 1 -04} + {2213233200 -14400 0 -04} + {2235614400 -10800 1 -04} + {2244682800 -14400 0 -04} + {2267064000 -10800 1 -04} + {2276132400 -14400 0 -04} + {2298513600 -10800 1 -04} + {2307582000 -14400 0 -04} + {2329963200 -10800 1 -04} + {2339636400 -14400 0 -04} + {2362017600 -10800 1 -04} + {2371086000 -14400 0 -04} + {2393467200 -10800 1 -04} + {2402535600 -14400 0 -04} + {2424916800 -10800 1 -04} + {2433985200 -14400 0 -04} + {2456366400 -10800 1 -04} + {2465434800 -14400 0 -04} + {2487816000 -10800 1 -04} + {2497489200 -14400 0 -04} + {2519870400 -10800 1 -04} + {2528938800 -14400 0 -04} + {2551320000 -10800 1 -04} + {2560388400 -14400 0 -04} + {2582769600 -10800 1 -04} + {2591838000 -14400 0 -04} + {2614219200 -10800 1 -04} + {2623287600 -14400 0 -04} + {2645668800 -10800 1 -04} + {2654737200 -14400 0 -04} + {2677118400 -10800 1 -04} + {2686791600 -14400 0 -04} + {2709172800 -10800 1 -04} + {2718241200 -14400 0 -04} + {2740622400 -10800 1 -04} + {2749690800 -14400 0 -04} + {2772072000 -10800 1 -04} + {2781140400 -14400 0 -04} + {2803521600 -10800 1 -04} + {2812590000 -14400 0 -04} + {2834971200 -10800 1 -04} + {2844039600 -14400 0 -04} + {2867025600 -10800 1 -04} + {2876094000 -14400 0 -04} + {2898475200 -10800 1 -04} + {2907543600 -14400 0 -04} + {2929924800 -10800 1 -04} + {2938993200 -14400 0 -04} + {2961374400 -10800 1 -04} + {2970442800 -14400 0 -04} + {2992824000 -10800 1 -04} + {3001892400 -14400 0 -04} + {3024273600 -10800 1 -04} + {3033946800 -14400 0 -04} + {3056328000 -10800 1 -04} + {3065396400 -14400 0 -04} + {3087777600 -10800 1 -04} + {3096846000 -14400 0 -04} + {3119227200 -10800 1 -04} + {3128295600 -14400 0 -04} + {3150676800 -10800 1 -04} + {3159745200 -14400 0 -04} + {3182126400 -10800 1 -04} + {3191194800 -14400 0 -04} + {3213576000 -10800 1 -04} + {3223249200 -14400 0 -04} + {3245630400 -10800 1 -04} + {3254698800 -14400 0 -04} + {3277080000 -10800 1 -04} + {3286148400 -14400 0 -04} + {3308529600 -10800 1 -04} + {3317598000 -14400 0 -04} + {3339979200 -10800 1 -04} + {3349047600 -14400 0 -04} + {3371428800 -10800 1 -04} + {3381102000 -14400 0 -04} + {3403483200 -10800 1 -04} + {3412551600 -14400 0 -04} + {3434932800 -10800 1 -04} + {3444001200 -14400 0 -04} + {3466382400 -10800 1 -04} + {3475450800 -14400 0 -04} + {3497832000 -10800 1 -04} + {3506900400 -14400 0 -04} + {3529281600 -10800 1 -04} + {3538350000 -14400 0 -04} + {3560731200 -10800 1 -04} + {3570404400 -14400 0 -04} + {3592785600 -10800 1 -04} + {3601854000 -14400 0 -04} + {3624235200 -10800 1 -04} + {3633303600 -14400 0 -04} + {3655684800 -10800 1 -04} + {3664753200 -14400 0 -04} + {3687134400 -10800 1 -04} + {3696202800 -14400 0 -04} + {3718584000 -10800 1 -04} + {3727652400 -14400 0 -04} + {3750638400 -10800 1 -04} + {3759706800 -14400 0 -04} + {3782088000 -10800 1 -04} + {3791156400 -14400 0 -04} + {3813537600 -10800 1 -04} + {3822606000 -14400 0 -04} + {3844987200 -10800 1 -04} + {3854055600 -14400 0 -04} + {3876436800 -10800 1 -04} + {3885505200 -14400 0 -04} + {3907886400 -10800 1 -04} + {3917559600 -14400 0 -04} + {3939940800 -10800 1 -04} + {3949009200 -14400 0 -04} + {3971390400 -10800 1 -04} + {3980458800 -14400 0 -04} + {4002840000 -10800 1 -04} + {4011908400 -14400 0 -04} + {4034289600 -10800 1 -04} + {4043358000 -14400 0 -04} + {4065739200 -10800 1 -04} + {4074807600 -14400 0 -04} + {4097188800 -10800 1 -04} +} diff --git a/env/tcl/tcl8.6/tzdata/America/Cancun b/env/tcl/tcl8.6/tzdata/America/Cancun new file mode 100644 index 0000000..fe5a060 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/America/Cancun @@ -0,0 +1,47 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:America/Cancun) { + {-9223372036854775808 -20824 0 LMT} + {-1514743200 -21600 0 CST} + {377935200 -18000 0 EST} + {828860400 -14400 1 EDT} + {846396000 -18000 0 EST} + {860310000 -14400 1 EDT} + {877845600 -18000 0 EST} + {891759600 -14400 1 EDT} + {902041200 -18000 0 CDT} + {909298800 -21600 0 CST} + {923212800 -18000 1 CDT} + {941353200 -21600 0 CST} + {954662400 -18000 1 CDT} + {972802800 -21600 0 CST} + {989136000 -18000 1 CDT} + {1001833200 -21600 0 CST} + {1018166400 -18000 1 CDT} + {1035702000 -21600 0 CST} + {1049616000 -18000 1 CDT} + {1067151600 -21600 0 CST} + {1081065600 -18000 1 CDT} + {1099206000 -21600 0 CST} + {1112515200 -18000 1 CDT} + {1130655600 -21600 0 CST} + {1143964800 -18000 1 CDT} + {1162105200 -21600 0 CST} + {1175414400 -18000 1 CDT} + {1193554800 -21600 0 CST} + {1207468800 -18000 1 CDT} + {1225004400 -21600 0 CST} + {1238918400 -18000 1 CDT} + {1256454000 -21600 0 CST} + {1270368000 -18000 1 CDT} + {1288508400 -21600 0 CST} + {1301817600 -18000 1 CDT} + {1319958000 -21600 0 CST} + {1333267200 -18000 1 CDT} + {1351407600 -21600 0 CST} + {1365321600 -18000 1 CDT} + {1382857200 -21600 0 CST} + {1396771200 -18000 1 CDT} + {1414306800 -21600 0 CST} + {1422777600 -18000 0 EST} +} diff --git a/env/tcl/tcl8.6/tzdata/America/Caracas b/env/tcl/tcl8.6/tzdata/America/Caracas new file mode 100644 index 0000000..f0dbffe --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/America/Caracas @@ -0,0 +1,10 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:America/Caracas) { + {-9223372036854775808 -16064 0 LMT} + {-2524505536 -16060 0 CMT} + {-1826739140 -16200 0 -0430} + {-157750200 -14400 0 -04} + {1197183600 -16200 0 -0430} + {1462086000 -14400 0 -04} +} diff --git a/env/tcl/tcl8.6/tzdata/America/Catamarca b/env/tcl/tcl8.6/tzdata/America/Catamarca new file mode 100644 index 0000000..01c8ab6 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/America/Catamarca @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(America/Argentina/Catamarca)]} { + LoadTimeZoneFile America/Argentina/Catamarca +} +set TZData(:America/Catamarca) $TZData(:America/Argentina/Catamarca) diff --git a/env/tcl/tcl8.6/tzdata/America/Cayenne b/env/tcl/tcl8.6/tzdata/America/Cayenne new file mode 100644 index 0000000..6b1a3e9 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/America/Cayenne @@ -0,0 +1,7 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:America/Cayenne) { + {-9223372036854775808 -12560 0 LMT} + {-1846269040 -14400 0 -04} + {-71092800 -10800 0 -03} +} diff --git a/env/tcl/tcl8.6/tzdata/America/Cayman b/env/tcl/tcl8.6/tzdata/America/Cayman new file mode 100644 index 0000000..92ce5e2 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/America/Cayman @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(America/Panama)]} { + LoadTimeZoneFile America/Panama +} +set TZData(:America/Cayman) $TZData(:America/Panama) diff --git a/env/tcl/tcl8.6/tzdata/America/Chicago b/env/tcl/tcl8.6/tzdata/America/Chicago new file mode 100644 index 0000000..545aedb --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/America/Chicago @@ -0,0 +1,369 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:America/Chicago) { + {-9223372036854775808 -21036 0 LMT} + {-2717647200 -21600 0 CST} + {-1633276800 -18000 1 CDT} + {-1615136400 -21600 0 CST} + {-1601827200 -18000 1 CDT} + {-1583686800 -21600 0 CST} + {-1577901600 -21600 0 CST} + {-1563724800 -18000 1 CDT} + {-1551632400 -21600 0 CST} + {-1538928000 -18000 1 CDT} + {-1520182800 -21600 0 CST} + {-1504454400 -18000 1 CDT} + {-1491757200 -21600 0 CST} + {-1473004800 -18000 1 CDT} + {-1459702800 -21600 0 CST} + {-1441555200 -18000 1 CDT} + {-1428253200 -21600 0 CST} + {-1410105600 -18000 1 CDT} + {-1396803600 -21600 0 CST} + {-1378656000 -18000 1 CDT} + {-1365354000 -21600 0 CST} + {-1347206400 -18000 1 CDT} + {-1333904400 -21600 0 CST} + {-1315152000 -18000 1 CDT} + {-1301850000 -21600 0 CST} + {-1283702400 -18000 1 CDT} + {-1270400400 -21600 0 CST} + {-1252252800 -18000 1 CDT} + {-1238950800 -21600 0 CST} + {-1220803200 -18000 1 CDT} + {-1207501200 -21600 0 CST} + {-1189353600 -18000 1 CDT} + {-1176051600 -21600 0 CST} + {-1157299200 -18000 1 CDT} + {-1144602000 -21600 0 CST} + {-1125849600 -18000 1 CDT} + {-1112547600 -21600 0 CST} + {-1094400000 -18000 1 CDT} + {-1081098000 -21600 0 CST} + {-1067788800 -18000 0 EST} + {-1045414800 -21600 0 CST} + {-1031500800 -18000 1 CDT} + {-1018198800 -21600 0 CST} + {-1000051200 -18000 1 CDT} + {-986749200 -21600 0 CST} + {-967996800 -18000 1 CDT} + {-955299600 -21600 0 CST} + {-936547200 -18000 1 CDT} + {-923245200 -21600 0 CST} + {-905097600 -18000 1 CDT} + {-891795600 -21600 0 CST} + {-883591200 -21600 0 CST} + {-880214400 -18000 1 CWT} + {-769395600 -18000 1 CPT} + {-765392400 -21600 0 CST} + {-757360800 -21600 0 CST} + {-747244800 -18000 1 CDT} + {-733942800 -21600 0 CST} + {-715795200 -18000 1 CDT} + {-702493200 -21600 0 CST} + {-684345600 -18000 1 CDT} + {-671043600 -21600 0 CST} + {-652896000 -18000 1 CDT} + {-639594000 -21600 0 CST} + {-620841600 -18000 1 CDT} + {-608144400 -21600 0 CST} + {-589392000 -18000 1 CDT} + {-576090000 -21600 0 CST} + {-557942400 -18000 1 CDT} + {-544640400 -21600 0 CST} + {-526492800 -18000 1 CDT} + {-513190800 -21600 0 CST} + {-495043200 -18000 1 CDT} + {-481741200 -21600 0 CST} + {-463593600 -18000 1 CDT} + {-447267600 -21600 0 CST} + {-431539200 -18000 1 CDT} + {-415818000 -21600 0 CST} + {-400089600 -18000 1 CDT} + {-384368400 -21600 0 CST} + {-368640000 -18000 1 CDT} + {-352918800 -21600 0 CST} + {-337190400 -18000 1 CDT} + {-321469200 -21600 0 CST} + {-305740800 -18000 1 CDT} + {-289414800 -21600 0 CST} + {-273686400 -18000 1 CDT} + {-257965200 -21600 0 CST} + {-242236800 -18000 1 CDT} + {-226515600 -21600 0 CST} + {-210787200 -18000 1 CDT} + {-195066000 -21600 0 CST} + {-179337600 -18000 1 CDT} + {-163616400 -21600 0 CST} + {-147888000 -18000 1 CDT} + {-131562000 -21600 0 CST} + {-116438400 -18000 1 CDT} + {-100112400 -21600 0 CST} + {-94672800 -21600 0 CST} + {-84384000 -18000 1 CDT} + {-68662800 -21600 0 CST} + {-52934400 -18000 1 CDT} + {-37213200 -21600 0 CST} + {-21484800 -18000 1 CDT} + {-5763600 -21600 0 CST} + {9964800 -18000 1 CDT} + {25686000 -21600 0 CST} + {41414400 -18000 1 CDT} + {57740400 -21600 0 CST} + {73468800 -18000 1 CDT} + {89190000 -21600 0 CST} + {104918400 -18000 1 CDT} + {120639600 -21600 0 CST} + {126691200 -18000 1 CDT} + {152089200 -21600 0 CST} + {162374400 -18000 1 CDT} + {183538800 -21600 0 CST} + {199267200 -18000 1 CDT} + {215593200 -21600 0 CST} + {230716800 -18000 1 CDT} + {247042800 -21600 0 CST} + {262771200 -18000 1 CDT} + {278492400 -21600 0 CST} + {294220800 -18000 1 CDT} + {309942000 -21600 0 CST} + {325670400 -18000 1 CDT} + {341391600 -21600 0 CST} + {357120000 -18000 1 CDT} + {372841200 -21600 0 CST} + {388569600 -18000 1 CDT} + {404895600 -21600 0 CST} + {420019200 -18000 1 CDT} + {436345200 -21600 0 CST} + {452073600 -18000 1 CDT} + {467794800 -21600 0 CST} + {483523200 -18000 1 CDT} + {499244400 -21600 0 CST} + {514972800 -18000 1 CDT} + {530694000 -21600 0 CST} + {544608000 -18000 1 CDT} + {562143600 -21600 0 CST} + {576057600 -18000 1 CDT} + {594198000 -21600 0 CST} + {607507200 -18000 1 CDT} + {625647600 -21600 0 CST} + {638956800 -18000 1 CDT} + {657097200 -21600 0 CST} + {671011200 -18000 1 CDT} + {688546800 -21600 0 CST} + {702460800 -18000 1 CDT} + {719996400 -21600 0 CST} + {733910400 -18000 1 CDT} + {752050800 -21600 0 CST} + {765360000 -18000 1 CDT} + {783500400 -21600 0 CST} + {796809600 -18000 1 CDT} + {814950000 -21600 0 CST} + {828864000 -18000 1 CDT} + {846399600 -21600 0 CST} + {860313600 -18000 1 CDT} + {877849200 -21600 0 CST} + {891763200 -18000 1 CDT} + {909298800 -21600 0 CST} + {923212800 -18000 1 CDT} + {941353200 -21600 0 CST} + {954662400 -18000 1 CDT} + {972802800 -21600 0 CST} + {986112000 -18000 1 CDT} + {1004252400 -21600 0 CST} + {1018166400 -18000 1 CDT} + {1035702000 -21600 0 CST} + {1049616000 -18000 1 CDT} + {1067151600 -21600 0 CST} + {1081065600 -18000 1 CDT} + {1099206000 -21600 0 CST} + {1112515200 -18000 1 CDT} + {1130655600 -21600 0 CST} + {1143964800 -18000 1 CDT} + {1162105200 -21600 0 CST} + {1173600000 -18000 1 CDT} + {1194159600 -21600 0 CST} + {1205049600 -18000 1 CDT} + {1225609200 -21600 0 CST} + {1236499200 -18000 1 CDT} + {1257058800 -21600 0 CST} + {1268553600 -18000 1 CDT} + {1289113200 -21600 0 CST} + {1300003200 -18000 1 CDT} + {1320562800 -21600 0 CST} + {1331452800 -18000 1 CDT} + {1352012400 -21600 0 CST} + {1362902400 -18000 1 CDT} + {1383462000 -21600 0 CST} + {1394352000 -18000 1 CDT} + {1414911600 -21600 0 CST} + {1425801600 -18000 1 CDT} + {1446361200 -21600 0 CST} + {1457856000 -18000 1 CDT} + {1478415600 -21600 0 CST} + {1489305600 -18000 1 CDT} + {1509865200 -21600 0 CST} + {1520755200 -18000 1 CDT} + {1541314800 -21600 0 CST} + {1552204800 -18000 1 CDT} + {1572764400 -21600 0 CST} + {1583654400 -18000 1 CDT} + {1604214000 -21600 0 CST} + {1615708800 -18000 1 CDT} + {1636268400 -21600 0 CST} + {1647158400 -18000 1 CDT} + {1667718000 -21600 0 CST} + {1678608000 -18000 1 CDT} + {1699167600 -21600 0 CST} + {1710057600 -18000 1 CDT} + {1730617200 -21600 0 CST} + {1741507200 -18000 1 CDT} + {1762066800 -21600 0 CST} + {1772956800 -18000 1 CDT} + {1793516400 -21600 0 CST} + {1805011200 -18000 1 CDT} + {1825570800 -21600 0 CST} + {1836460800 -18000 1 CDT} + {1857020400 -21600 0 CST} + {1867910400 -18000 1 CDT} + {1888470000 -21600 0 CST} + {1899360000 -18000 1 CDT} + {1919919600 -21600 0 CST} + {1930809600 -18000 1 CDT} + {1951369200 -21600 0 CST} + {1962864000 -18000 1 CDT} + {1983423600 -21600 0 CST} + {1994313600 -18000 1 CDT} + {2014873200 -21600 0 CST} + {2025763200 -18000 1 CDT} + {2046322800 -21600 0 CST} + {2057212800 -18000 1 CDT} + {2077772400 -21600 0 CST} + {2088662400 -18000 1 CDT} + {2109222000 -21600 0 CST} + {2120112000 -18000 1 CDT} + {2140671600 -21600 0 CST} + {2152166400 -18000 1 CDT} + {2172726000 -21600 0 CST} + {2183616000 -18000 1 CDT} + {2204175600 -21600 0 CST} + {2215065600 -18000 1 CDT} + {2235625200 -21600 0 CST} + {2246515200 -18000 1 CDT} + {2267074800 -21600 0 CST} + {2277964800 -18000 1 CDT} + {2298524400 -21600 0 CST} + {2309414400 -18000 1 CDT} + {2329974000 -21600 0 CST} + {2341468800 -18000 1 CDT} + {2362028400 -21600 0 CST} + {2372918400 -18000 1 CDT} + {2393478000 -21600 0 CST} + {2404368000 -18000 1 CDT} + {2424927600 -21600 0 CST} + {2435817600 -18000 1 CDT} + {2456377200 -21600 0 CST} + {2467267200 -18000 1 CDT} + {2487826800 -21600 0 CST} + {2499321600 -18000 1 CDT} + {2519881200 -21600 0 CST} + {2530771200 -18000 1 CDT} + {2551330800 -21600 0 CST} + {2562220800 -18000 1 CDT} + {2582780400 -21600 0 CST} + {2593670400 -18000 1 CDT} + {2614230000 -21600 0 CST} + {2625120000 -18000 1 CDT} + {2645679600 -21600 0 CST} + {2656569600 -18000 1 CDT} + {2677129200 -21600 0 CST} + {2688624000 -18000 1 CDT} + {2709183600 -21600 0 CST} + {2720073600 -18000 1 CDT} + {2740633200 -21600 0 CST} + {2751523200 -18000 1 CDT} + {2772082800 -21600 0 CST} + {2782972800 -18000 1 CDT} + {2803532400 -21600 0 CST} + {2814422400 -18000 1 CDT} + {2834982000 -21600 0 CST} + {2846476800 -18000 1 CDT} + {2867036400 -21600 0 CST} + {2877926400 -18000 1 CDT} + {2898486000 -21600 0 CST} + {2909376000 -18000 1 CDT} + {2929935600 -21600 0 CST} + {2940825600 -18000 1 CDT} + {2961385200 -21600 0 CST} + {2972275200 -18000 1 CDT} + {2992834800 -21600 0 CST} + {3003724800 -18000 1 CDT} + {3024284400 -21600 0 CST} + {3035779200 -18000 1 CDT} + {3056338800 -21600 0 CST} + {3067228800 -18000 1 CDT} + {3087788400 -21600 0 CST} + {3098678400 -18000 1 CDT} + {3119238000 -21600 0 CST} + {3130128000 -18000 1 CDT} + {3150687600 -21600 0 CST} + {3161577600 -18000 1 CDT} + {3182137200 -21600 0 CST} + {3193027200 -18000 1 CDT} + {3213586800 -21600 0 CST} + {3225081600 -18000 1 CDT} + {3245641200 -21600 0 CST} + {3256531200 -18000 1 CDT} + {3277090800 -21600 0 CST} + {3287980800 -18000 1 CDT} + {3308540400 -21600 0 CST} + {3319430400 -18000 1 CDT} + {3339990000 -21600 0 CST} + {3350880000 -18000 1 CDT} + {3371439600 -21600 0 CST} + {3382934400 -18000 1 CDT} + {3403494000 -21600 0 CST} + {3414384000 -18000 1 CDT} + {3434943600 -21600 0 CST} + {3445833600 -18000 1 CDT} + {3466393200 -21600 0 CST} + {3477283200 -18000 1 CDT} + {3497842800 -21600 0 CST} + {3508732800 -18000 1 CDT} + {3529292400 -21600 0 CST} + {3540182400 -18000 1 CDT} + {3560742000 -21600 0 CST} + {3572236800 -18000 1 CDT} + {3592796400 -21600 0 CST} + {3603686400 -18000 1 CDT} + {3624246000 -21600 0 CST} + {3635136000 -18000 1 CDT} + {3655695600 -21600 0 CST} + {3666585600 -18000 1 CDT} + {3687145200 -21600 0 CST} + {3698035200 -18000 1 CDT} + {3718594800 -21600 0 CST} + {3730089600 -18000 1 CDT} + {3750649200 -21600 0 CST} + {3761539200 -18000 1 CDT} + {3782098800 -21600 0 CST} + {3792988800 -18000 1 CDT} + {3813548400 -21600 0 CST} + {3824438400 -18000 1 CDT} + {3844998000 -21600 0 CST} + {3855888000 -18000 1 CDT} + {3876447600 -21600 0 CST} + {3887337600 -18000 1 CDT} + {3907897200 -21600 0 CST} + {3919392000 -18000 1 CDT} + {3939951600 -21600 0 CST} + {3950841600 -18000 1 CDT} + {3971401200 -21600 0 CST} + {3982291200 -18000 1 CDT} + {4002850800 -21600 0 CST} + {4013740800 -18000 1 CDT} + {4034300400 -21600 0 CST} + {4045190400 -18000 1 CDT} + {4065750000 -21600 0 CST} + {4076640000 -18000 1 CDT} + {4097199600 -21600 0 CST} +} diff --git a/env/tcl/tcl8.6/tzdata/America/Chihuahua b/env/tcl/tcl8.6/tzdata/America/Chihuahua new file mode 100644 index 0000000..5444930 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/America/Chihuahua @@ -0,0 +1,221 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:America/Chihuahua) { + {-9223372036854775808 -25460 0 LMT} + {-1514739600 -25200 0 MST} + {-1343066400 -21600 0 CST} + {-1234807200 -25200 0 MST} + {-1220292000 -21600 0 CST} + {-1207159200 -25200 0 MST} + {-1191344400 -21600 0 CST} + {820476000 -21600 0 CST} + {828864000 -18000 1 CDT} + {846399600 -21600 0 CST} + {860313600 -18000 1 CDT} + {877849200 -21600 0 CST} + {883634400 -21600 0 CST} + {891766800 -21600 0 MDT} + {909302400 -25200 0 MST} + {923216400 -21600 1 MDT} + {941356800 -25200 0 MST} + {954666000 -21600 1 MDT} + {972806400 -25200 0 MST} + {989139600 -21600 1 MDT} + {1001836800 -25200 0 MST} + {1018170000 -21600 1 MDT} + {1035705600 -25200 0 MST} + {1049619600 -21600 1 MDT} + {1067155200 -25200 0 MST} + {1081069200 -21600 1 MDT} + {1099209600 -25200 0 MST} + {1112518800 -21600 1 MDT} + {1130659200 -25200 0 MST} + {1143968400 -21600 1 MDT} + {1162108800 -25200 0 MST} + {1175418000 -21600 1 MDT} + {1193558400 -25200 0 MST} + {1207472400 -21600 1 MDT} + {1225008000 -25200 0 MST} + {1238922000 -21600 1 MDT} + {1256457600 -25200 0 MST} + {1270371600 -21600 1 MDT} + {1288512000 -25200 0 MST} + {1301821200 -21600 1 MDT} + {1319961600 -25200 0 MST} + {1333270800 -21600 1 MDT} + {1351411200 -25200 0 MST} + {1365325200 -21600 1 MDT} + {1382860800 -25200 0 MST} + {1396774800 -21600 1 MDT} + {1414310400 -25200 0 MST} + {1428224400 -21600 1 MDT} + {1445760000 -25200 0 MST} + {1459674000 -21600 1 MDT} + {1477814400 -25200 0 MST} + {1491123600 -21600 1 MDT} + {1509264000 -25200 0 MST} + {1522573200 -21600 1 MDT} + {1540713600 -25200 0 MST} + {1554627600 -21600 1 MDT} + {1572163200 -25200 0 MST} + {1586077200 -21600 1 MDT} + {1603612800 -25200 0 MST} + {1617526800 -21600 1 MDT} + {1635667200 -25200 0 MST} + {1648976400 -21600 1 MDT} + {1667116800 -25200 0 MST} + {1680426000 -21600 1 MDT} + {1698566400 -25200 0 MST} + {1712480400 -21600 1 MDT} + {1730016000 -25200 0 MST} + {1743930000 -21600 1 MDT} + {1761465600 -25200 0 MST} + {1775379600 -21600 1 MDT} + {1792915200 -25200 0 MST} + {1806829200 -21600 1 MDT} + {1824969600 -25200 0 MST} + {1838278800 -21600 1 MDT} + {1856419200 -25200 0 MST} + {1869728400 -21600 1 MDT} + {1887868800 -25200 0 MST} + {1901782800 -21600 1 MDT} + {1919318400 -25200 0 MST} + {1933232400 -21600 1 MDT} + {1950768000 -25200 0 MST} + {1964682000 -21600 1 MDT} + {1982822400 -25200 0 MST} + {1996131600 -21600 1 MDT} + {2014272000 -25200 0 MST} + {2027581200 -21600 1 MDT} + {2045721600 -25200 0 MST} + {2059030800 -21600 1 MDT} + {2077171200 -25200 0 MST} + {2091085200 -21600 1 MDT} + {2108620800 -25200 0 MST} + {2122534800 -21600 1 MDT} + {2140070400 -25200 0 MST} + {2153984400 -21600 1 MDT} + {2172124800 -25200 0 MST} + {2185434000 -21600 1 MDT} + {2203574400 -25200 0 MST} + {2216883600 -21600 1 MDT} + {2235024000 -25200 0 MST} + {2248938000 -21600 1 MDT} + {2266473600 -25200 0 MST} + {2280387600 -21600 1 MDT} + {2297923200 -25200 0 MST} + {2311837200 -21600 1 MDT} + {2329372800 -25200 0 MST} + {2343286800 -21600 1 MDT} + {2361427200 -25200 0 MST} + {2374736400 -21600 1 MDT} + {2392876800 -25200 0 MST} + {2406186000 -21600 1 MDT} + {2424326400 -25200 0 MST} + {2438240400 -21600 1 MDT} + {2455776000 -25200 0 MST} + {2469690000 -21600 1 MDT} + {2487225600 -25200 0 MST} + {2501139600 -21600 1 MDT} + {2519280000 -25200 0 MST} + {2532589200 -21600 1 MDT} + {2550729600 -25200 0 MST} + {2564038800 -21600 1 MDT} + {2582179200 -25200 0 MST} + {2596093200 -21600 1 MDT} + {2613628800 -25200 0 MST} + {2627542800 -21600 1 MDT} + {2645078400 -25200 0 MST} + {2658992400 -21600 1 MDT} + {2676528000 -25200 0 MST} + {2690442000 -21600 1 MDT} + {2708582400 -25200 0 MST} + {2721891600 -21600 1 MDT} + {2740032000 -25200 0 MST} + {2753341200 -21600 1 MDT} + {2771481600 -25200 0 MST} + {2785395600 -21600 1 MDT} + {2802931200 -25200 0 MST} + {2816845200 -21600 1 MDT} + {2834380800 -25200 0 MST} + {2848294800 -21600 1 MDT} + {2866435200 -25200 0 MST} + {2879744400 -21600 1 MDT} + {2897884800 -25200 0 MST} + {2911194000 -21600 1 MDT} + {2929334400 -25200 0 MST} + {2942643600 -21600 1 MDT} + {2960784000 -25200 0 MST} + {2974698000 -21600 1 MDT} + {2992233600 -25200 0 MST} + {3006147600 -21600 1 MDT} + {3023683200 -25200 0 MST} + {3037597200 -21600 1 MDT} + {3055737600 -25200 0 MST} + {3069046800 -21600 1 MDT} + {3087187200 -25200 0 MST} + {3100496400 -21600 1 MDT} + {3118636800 -25200 0 MST} + {3132550800 -21600 1 MDT} + {3150086400 -25200 0 MST} + {3164000400 -21600 1 MDT} + {3181536000 -25200 0 MST} + {3195450000 -21600 1 MDT} + {3212985600 -25200 0 MST} + {3226899600 -21600 1 MDT} + {3245040000 -25200 0 MST} + {3258349200 -21600 1 MDT} + {3276489600 -25200 0 MST} + {3289798800 -21600 1 MDT} + {3307939200 -25200 0 MST} + {3321853200 -21600 1 MDT} + {3339388800 -25200 0 MST} + {3353302800 -21600 1 MDT} + {3370838400 -25200 0 MST} + {3384752400 -21600 1 MDT} + {3402892800 -25200 0 MST} + {3416202000 -21600 1 MDT} + {3434342400 -25200 0 MST} + {3447651600 -21600 1 MDT} + {3465792000 -25200 0 MST} + {3479706000 -21600 1 MDT} + {3497241600 -25200 0 MST} + {3511155600 -21600 1 MDT} + {3528691200 -25200 0 MST} + {3542605200 -21600 1 MDT} + {3560140800 -25200 0 MST} + {3574054800 -21600 1 MDT} + {3592195200 -25200 0 MST} + {3605504400 -21600 1 MDT} + {3623644800 -25200 0 MST} + {3636954000 -21600 1 MDT} + {3655094400 -25200 0 MST} + {3669008400 -21600 1 MDT} + {3686544000 -25200 0 MST} + {3700458000 -21600 1 MDT} + {3717993600 -25200 0 MST} + {3731907600 -21600 1 MDT} + {3750048000 -25200 0 MST} + {3763357200 -21600 1 MDT} + {3781497600 -25200 0 MST} + {3794806800 -21600 1 MDT} + {3812947200 -25200 0 MST} + {3826256400 -21600 1 MDT} + {3844396800 -25200 0 MST} + {3858310800 -21600 1 MDT} + {3875846400 -25200 0 MST} + {3889760400 -21600 1 MDT} + {3907296000 -25200 0 MST} + {3921210000 -21600 1 MDT} + {3939350400 -25200 0 MST} + {3952659600 -21600 1 MDT} + {3970800000 -25200 0 MST} + {3984109200 -21600 1 MDT} + {4002249600 -25200 0 MST} + {4016163600 -21600 1 MDT} + {4033699200 -25200 0 MST} + {4047613200 -21600 1 MDT} + {4065148800 -25200 0 MST} + {4079062800 -21600 1 MDT} + {4096598400 -25200 0 MST} +} diff --git a/env/tcl/tcl8.6/tzdata/America/Coral_Harbour b/env/tcl/tcl8.6/tzdata/America/Coral_Harbour new file mode 100644 index 0000000..a27dc03 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/America/Coral_Harbour @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(America/Atikokan)]} { + LoadTimeZoneFile America/Atikokan +} +set TZData(:America/Coral_Harbour) $TZData(:America/Atikokan) diff --git a/env/tcl/tcl8.6/tzdata/America/Cordoba b/env/tcl/tcl8.6/tzdata/America/Cordoba new file mode 100644 index 0000000..c881558 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/America/Cordoba @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(America/Argentina/Cordoba)]} { + LoadTimeZoneFile America/Argentina/Cordoba +} +set TZData(:America/Cordoba) $TZData(:America/Argentina/Cordoba) diff --git a/env/tcl/tcl8.6/tzdata/America/Costa_Rica b/env/tcl/tcl8.6/tzdata/America/Costa_Rica new file mode 100644 index 0000000..8fc9343 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/America/Costa_Rica @@ -0,0 +1,15 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:America/Costa_Rica) { + {-9223372036854775808 -20173 0 LMT} + {-2524501427 -20173 0 SJMT} + {-1545071027 -21600 0 CST} + {288770400 -18000 1 CDT} + {297234000 -21600 0 CST} + {320220000 -18000 1 CDT} + {328683600 -21600 0 CST} + {664264800 -18000 1 CDT} + {678344400 -21600 0 CST} + {695714400 -18000 1 CDT} + {700635600 -21600 0 CST} +} diff --git a/env/tcl/tcl8.6/tzdata/America/Creston b/env/tcl/tcl8.6/tzdata/America/Creston new file mode 100644 index 0000000..30369a9 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/America/Creston @@ -0,0 +1,8 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:America/Creston) { + {-9223372036854775808 -27964 0 LMT} + {-2713882436 -25200 0 MST} + {-1680454800 -28800 0 PST} + {-1627833600 -25200 0 MST} +} diff --git a/env/tcl/tcl8.6/tzdata/America/Cuiaba b/env/tcl/tcl8.6/tzdata/America/Cuiaba new file mode 100644 index 0000000..09f5b1f --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/America/Cuiaba @@ -0,0 +1,257 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:America/Cuiaba) { + {-9223372036854775808 -13460 0 LMT} + {-1767212140 -14400 0 -04} + {-1206954000 -10800 1 -04} + {-1191358800 -14400 0 -04} + {-1175371200 -10800 1 -04} + {-1159822800 -14400 0 -04} + {-633816000 -10800 1 -04} + {-622065600 -14400 0 -04} + {-602280000 -10800 1 -04} + {-591829200 -14400 0 -04} + {-570744000 -10800 1 -04} + {-560206800 -14400 0 -04} + {-539121600 -10800 1 -04} + {-531349200 -14400 0 -04} + {-191361600 -10800 1 -04} + {-184194000 -14400 0 -04} + {-155160000 -10800 1 -04} + {-150066000 -14400 0 -04} + {-128894400 -10800 1 -04} + {-121122000 -14400 0 -04} + {-99950400 -10800 1 -04} + {-89586000 -14400 0 -04} + {-68414400 -10800 1 -04} + {-57963600 -14400 0 -04} + {499752000 -10800 1 -04} + {511239600 -14400 0 -04} + {530596800 -10800 1 -04} + {540270000 -14400 0 -04} + {562132800 -10800 1 -04} + {571201200 -14400 0 -04} + {592977600 -10800 1 -04} + {602046000 -14400 0 -04} + {624427200 -10800 1 -04} + {634705200 -14400 0 -04} + {656481600 -10800 1 -04} + {666759600 -14400 0 -04} + {687931200 -10800 1 -04} + {697604400 -14400 0 -04} + {719985600 -10800 1 -04} + {728449200 -14400 0 -04} + {750830400 -10800 1 -04} + {761713200 -14400 0 -04} + {782280000 -10800 1 -04} + {793162800 -14400 0 -04} + {813729600 -10800 1 -04} + {824007600 -14400 0 -04} + {844574400 -10800 1 -04} + {856062000 -14400 0 -04} + {876110400 -10800 1 -04} + {888721200 -14400 0 -04} + {908078400 -10800 1 -04} + {919566000 -14400 0 -04} + {938923200 -10800 1 -04} + {951620400 -14400 0 -04} + {970977600 -10800 1 -04} + {982465200 -14400 0 -04} + {1003032000 -10800 1 -04} + {1013914800 -14400 0 -04} + {1036296000 -10800 1 -04} + {1045364400 -14400 0 -04} + {1064372400 -14400 0 -04} + {1096603200 -14400 0 -04} + {1099368000 -10800 1 -04} + {1108868400 -14400 0 -04} + {1129435200 -10800 1 -04} + {1140318000 -14400 0 -04} + {1162699200 -10800 1 -04} + {1172372400 -14400 0 -04} + {1192334400 -10800 1 -04} + {1203217200 -14400 0 -04} + {1224388800 -10800 1 -04} + {1234666800 -14400 0 -04} + {1255838400 -10800 1 -04} + {1266721200 -14400 0 -04} + {1287288000 -10800 1 -04} + {1298170800 -14400 0 -04} + {1318737600 -10800 1 -04} + {1330225200 -14400 0 -04} + {1350792000 -10800 1 -04} + {1361070000 -14400 0 -04} + {1382241600 -10800 1 -04} + {1392519600 -14400 0 -04} + {1413691200 -10800 1 -04} + {1424574000 -14400 0 -04} + {1445140800 -10800 1 -04} + {1456023600 -14400 0 -04} + {1476590400 -10800 1 -04} + {1487473200 -14400 0 -04} + {1508040000 -10800 1 -04} + {1518922800 -14400 0 -04} + {1541304000 -10800 1 -04} + {1550372400 -14400 0 -04} + {1572753600 -10800 1 -04} + {1581822000 -14400 0 -04} + {1604203200 -10800 1 -04} + {1613876400 -14400 0 -04} + {1636257600 -10800 1 -04} + {1645326000 -14400 0 -04} + {1667707200 -10800 1 -04} + {1677380400 -14400 0 -04} + {1699156800 -10800 1 -04} + {1708225200 -14400 0 -04} + {1730606400 -10800 1 -04} + {1739674800 -14400 0 -04} + {1762056000 -10800 1 -04} + {1771729200 -14400 0 -04} + {1793505600 -10800 1 -04} + {1803178800 -14400 0 -04} + {1825560000 -10800 1 -04} + {1834628400 -14400 0 -04} + {1857009600 -10800 1 -04} + {1866078000 -14400 0 -04} + {1888459200 -10800 1 -04} + {1897527600 -14400 0 -04} + {1919908800 -10800 1 -04} + {1928977200 -14400 0 -04} + {1951358400 -10800 1 -04} + {1960426800 -14400 0 -04} + {1983412800 -10800 1 -04} + {1992481200 -14400 0 -04} + {2014862400 -10800 1 -04} + {2024535600 -14400 0 -04} + {2046312000 -10800 1 -04} + {2055380400 -14400 0 -04} + {2077761600 -10800 1 -04} + {2086830000 -14400 0 -04} + {2109211200 -10800 1 -04} + {2118884400 -14400 0 -04} + {2140660800 -10800 1 -04} + {2150334000 -14400 0 -04} + {2172715200 -10800 1 -04} + {2181783600 -14400 0 -04} + {2204164800 -10800 1 -04} + {2213233200 -14400 0 -04} + {2235614400 -10800 1 -04} + {2244682800 -14400 0 -04} + {2267064000 -10800 1 -04} + {2276132400 -14400 0 -04} + {2298513600 -10800 1 -04} + {2307582000 -14400 0 -04} + {2329963200 -10800 1 -04} + {2339636400 -14400 0 -04} + {2362017600 -10800 1 -04} + {2371086000 -14400 0 -04} + {2393467200 -10800 1 -04} + {2402535600 -14400 0 -04} + {2424916800 -10800 1 -04} + {2433985200 -14400 0 -04} + {2456366400 -10800 1 -04} + {2465434800 -14400 0 -04} + {2487816000 -10800 1 -04} + {2497489200 -14400 0 -04} + {2519870400 -10800 1 -04} + {2528938800 -14400 0 -04} + {2551320000 -10800 1 -04} + {2560388400 -14400 0 -04} + {2582769600 -10800 1 -04} + {2591838000 -14400 0 -04} + {2614219200 -10800 1 -04} + {2623287600 -14400 0 -04} + {2645668800 -10800 1 -04} + {2654737200 -14400 0 -04} + {2677118400 -10800 1 -04} + {2686791600 -14400 0 -04} + {2709172800 -10800 1 -04} + {2718241200 -14400 0 -04} + {2740622400 -10800 1 -04} + {2749690800 -14400 0 -04} + {2772072000 -10800 1 -04} + {2781140400 -14400 0 -04} + {2803521600 -10800 1 -04} + {2812590000 -14400 0 -04} + {2834971200 -10800 1 -04} + {2844039600 -14400 0 -04} + {2867025600 -10800 1 -04} + {2876094000 -14400 0 -04} + {2898475200 -10800 1 -04} + {2907543600 -14400 0 -04} + {2929924800 -10800 1 -04} + {2938993200 -14400 0 -04} + {2961374400 -10800 1 -04} + {2970442800 -14400 0 -04} + {2992824000 -10800 1 -04} + {3001892400 -14400 0 -04} + {3024273600 -10800 1 -04} + {3033946800 -14400 0 -04} + {3056328000 -10800 1 -04} + {3065396400 -14400 0 -04} + {3087777600 -10800 1 -04} + {3096846000 -14400 0 -04} + {3119227200 -10800 1 -04} + {3128295600 -14400 0 -04} + {3150676800 -10800 1 -04} + {3159745200 -14400 0 -04} + {3182126400 -10800 1 -04} + {3191194800 -14400 0 -04} + {3213576000 -10800 1 -04} + {3223249200 -14400 0 -04} + {3245630400 -10800 1 -04} + {3254698800 -14400 0 -04} + {3277080000 -10800 1 -04} + {3286148400 -14400 0 -04} + {3308529600 -10800 1 -04} + {3317598000 -14400 0 -04} + {3339979200 -10800 1 -04} + {3349047600 -14400 0 -04} + {3371428800 -10800 1 -04} + {3381102000 -14400 0 -04} + {3403483200 -10800 1 -04} + {3412551600 -14400 0 -04} + {3434932800 -10800 1 -04} + {3444001200 -14400 0 -04} + {3466382400 -10800 1 -04} + {3475450800 -14400 0 -04} + {3497832000 -10800 1 -04} + {3506900400 -14400 0 -04} + {3529281600 -10800 1 -04} + {3538350000 -14400 0 -04} + {3560731200 -10800 1 -04} + {3570404400 -14400 0 -04} + {3592785600 -10800 1 -04} + {3601854000 -14400 0 -04} + {3624235200 -10800 1 -04} + {3633303600 -14400 0 -04} + {3655684800 -10800 1 -04} + {3664753200 -14400 0 -04} + {3687134400 -10800 1 -04} + {3696202800 -14400 0 -04} + {3718584000 -10800 1 -04} + {3727652400 -14400 0 -04} + {3750638400 -10800 1 -04} + {3759706800 -14400 0 -04} + {3782088000 -10800 1 -04} + {3791156400 -14400 0 -04} + {3813537600 -10800 1 -04} + {3822606000 -14400 0 -04} + {3844987200 -10800 1 -04} + {3854055600 -14400 0 -04} + {3876436800 -10800 1 -04} + {3885505200 -14400 0 -04} + {3907886400 -10800 1 -04} + {3917559600 -14400 0 -04} + {3939940800 -10800 1 -04} + {3949009200 -14400 0 -04} + {3971390400 -10800 1 -04} + {3980458800 -14400 0 -04} + {4002840000 -10800 1 -04} + {4011908400 -14400 0 -04} + {4034289600 -10800 1 -04} + {4043358000 -14400 0 -04} + {4065739200 -10800 1 -04} + {4074807600 -14400 0 -04} + {4097188800 -10800 1 -04} +} diff --git a/env/tcl/tcl8.6/tzdata/America/Curacao b/env/tcl/tcl8.6/tzdata/America/Curacao new file mode 100644 index 0000000..0a19090 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/America/Curacao @@ -0,0 +1,7 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:America/Curacao) { + {-9223372036854775808 -16547 0 LMT} + {-1826738653 -16200 0 -0430} + {-157750200 -14400 0 AST} +} diff --git a/env/tcl/tcl8.6/tzdata/America/Danmarkshavn b/env/tcl/tcl8.6/tzdata/America/Danmarkshavn new file mode 100644 index 0000000..4d9d7bb --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/America/Danmarkshavn @@ -0,0 +1,39 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:America/Danmarkshavn) { + {-9223372036854775808 -4480 0 LMT} + {-1686091520 -10800 0 -03} + {323845200 -7200 0 -02} + {338950800 -10800 0 -03} + {354675600 -7200 1 -02} + {370400400 -10800 0 -03} + {386125200 -7200 1 -02} + {401850000 -10800 0 -03} + {417574800 -7200 1 -02} + {433299600 -10800 0 -03} + {449024400 -7200 1 -02} + {465354000 -10800 0 -03} + {481078800 -7200 1 -02} + {496803600 -10800 0 -03} + {512528400 -7200 1 -02} + {528253200 -10800 0 -03} + {543978000 -7200 1 -02} + {559702800 -10800 0 -03} + {575427600 -7200 1 -02} + {591152400 -10800 0 -03} + {606877200 -7200 1 -02} + {622602000 -10800 0 -03} + {638326800 -7200 1 -02} + {654656400 -10800 0 -03} + {670381200 -7200 1 -02} + {686106000 -10800 0 -03} + {701830800 -7200 1 -02} + {717555600 -10800 0 -03} + {733280400 -7200 1 -02} + {749005200 -10800 0 -03} + {764730000 -7200 1 -02} + {780454800 -10800 0 -03} + {796179600 -7200 1 -02} + {811904400 -10800 0 -03} + {820465200 0 0 GMT} +} diff --git a/env/tcl/tcl8.6/tzdata/America/Dawson b/env/tcl/tcl8.6/tzdata/America/Dawson new file mode 100644 index 0000000..8d2b641 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/America/Dawson @@ -0,0 +1,256 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:America/Dawson) { + {-9223372036854775808 -33460 0 LMT} + {-2188996940 -32400 0 YST} + {-1632056400 -28800 1 YDT} + {-1615125600 -32400 0 YST} + {-1596978000 -28800 1 YDT} + {-1583164800 -32400 0 YST} + {-880203600 -28800 1 YWT} + {-769395600 -28800 1 YPT} + {-765381600 -32400 0 YST} + {-147884400 -25200 1 YDDT} + {-131554800 -32400 0 YST} + {315561600 -28800 0 PST} + {325677600 -25200 1 PDT} + {341398800 -28800 0 PST} + {357127200 -25200 1 PDT} + {372848400 -28800 0 PST} + {388576800 -25200 1 PDT} + {404902800 -28800 0 PST} + {420026400 -25200 1 PDT} + {436352400 -28800 0 PST} + {452080800 -25200 1 PDT} + {467802000 -28800 0 PST} + {483530400 -25200 1 PDT} + {499251600 -28800 0 PST} + {514980000 -25200 1 PDT} + {530701200 -28800 0 PST} + {544615200 -25200 1 PDT} + {562150800 -28800 0 PST} + {576064800 -25200 1 PDT} + {594205200 -28800 0 PST} + {607514400 -25200 1 PDT} + {625654800 -28800 0 PST} + {638964000 -25200 1 PDT} + {657104400 -28800 0 PST} + {671018400 -25200 1 PDT} + {688554000 -28800 0 PST} + {702468000 -25200 1 PDT} + {720003600 -28800 0 PST} + {733917600 -25200 1 PDT} + {752058000 -28800 0 PST} + {765367200 -25200 1 PDT} + {783507600 -28800 0 PST} + {796816800 -25200 1 PDT} + {814957200 -28800 0 PST} + {828871200 -25200 1 PDT} + {846406800 -28800 0 PST} + {860320800 -25200 1 PDT} + {877856400 -28800 0 PST} + {891770400 -25200 1 PDT} + {909306000 -28800 0 PST} + {923220000 -25200 1 PDT} + {941360400 -28800 0 PST} + {954669600 -25200 1 PDT} + {972810000 -28800 0 PST} + {986119200 -25200 1 PDT} + {1004259600 -28800 0 PST} + {1018173600 -25200 1 PDT} + {1035709200 -28800 0 PST} + {1049623200 -25200 1 PDT} + {1067158800 -28800 0 PST} + {1081072800 -25200 1 PDT} + {1099213200 -28800 0 PST} + {1112522400 -25200 1 PDT} + {1130662800 -28800 0 PST} + {1143972000 -25200 1 PDT} + {1162112400 -28800 0 PST} + {1173607200 -25200 1 PDT} + {1194166800 -28800 0 PST} + {1205056800 -25200 1 PDT} + {1225616400 -28800 0 PST} + {1236506400 -25200 1 PDT} + {1257066000 -28800 0 PST} + {1268560800 -25200 1 PDT} + {1289120400 -28800 0 PST} + {1300010400 -25200 1 PDT} + {1320570000 -28800 0 PST} + {1331460000 -25200 1 PDT} + {1352019600 -28800 0 PST} + {1362909600 -25200 1 PDT} + {1383469200 -28800 0 PST} + {1394359200 -25200 1 PDT} + {1414918800 -28800 0 PST} + {1425808800 -25200 1 PDT} + {1446368400 -28800 0 PST} + {1457863200 -25200 1 PDT} + {1478422800 -28800 0 PST} + {1489312800 -25200 1 PDT} + {1509872400 -28800 0 PST} + {1520762400 -25200 1 PDT} + {1541322000 -28800 0 PST} + {1552212000 -25200 1 PDT} + {1572771600 -28800 0 PST} + {1583661600 -25200 1 PDT} + {1604221200 -28800 0 PST} + {1615716000 -25200 1 PDT} + {1636275600 -28800 0 PST} + {1647165600 -25200 1 PDT} + {1667725200 -28800 0 PST} + {1678615200 -25200 1 PDT} + {1699174800 -28800 0 PST} + {1710064800 -25200 1 PDT} + {1730624400 -28800 0 PST} + {1741514400 -25200 1 PDT} + {1762074000 -28800 0 PST} + {1772964000 -25200 1 PDT} + {1793523600 -28800 0 PST} + {1805018400 -25200 1 PDT} + {1825578000 -28800 0 PST} + {1836468000 -25200 1 PDT} + {1857027600 -28800 0 PST} + {1867917600 -25200 1 PDT} + {1888477200 -28800 0 PST} + {1899367200 -25200 1 PDT} + {1919926800 -28800 0 PST} + {1930816800 -25200 1 PDT} + {1951376400 -28800 0 PST} + {1962871200 -25200 1 PDT} + {1983430800 -28800 0 PST} + {1994320800 -25200 1 PDT} + {2014880400 -28800 0 PST} + {2025770400 -25200 1 PDT} + {2046330000 -28800 0 PST} + {2057220000 -25200 1 PDT} + {2077779600 -28800 0 PST} + {2088669600 -25200 1 PDT} + {2109229200 -28800 0 PST} + {2120119200 -25200 1 PDT} + {2140678800 -28800 0 PST} + {2152173600 -25200 1 PDT} + {2172733200 -28800 0 PST} + {2183623200 -25200 1 PDT} + {2204182800 -28800 0 PST} + {2215072800 -25200 1 PDT} + {2235632400 -28800 0 PST} + {2246522400 -25200 1 PDT} + {2267082000 -28800 0 PST} + {2277972000 -25200 1 PDT} + {2298531600 -28800 0 PST} + {2309421600 -25200 1 PDT} + {2329981200 -28800 0 PST} + {2341476000 -25200 1 PDT} + {2362035600 -28800 0 PST} + {2372925600 -25200 1 PDT} + {2393485200 -28800 0 PST} + {2404375200 -25200 1 PDT} + {2424934800 -28800 0 PST} + {2435824800 -25200 1 PDT} + {2456384400 -28800 0 PST} + {2467274400 -25200 1 PDT} + {2487834000 -28800 0 PST} + {2499328800 -25200 1 PDT} + {2519888400 -28800 0 PST} + {2530778400 -25200 1 PDT} + {2551338000 -28800 0 PST} + {2562228000 -25200 1 PDT} + {2582787600 -28800 0 PST} + {2593677600 -25200 1 PDT} + {2614237200 -28800 0 PST} + {2625127200 -25200 1 PDT} + {2645686800 -28800 0 PST} + {2656576800 -25200 1 PDT} + {2677136400 -28800 0 PST} + {2688631200 -25200 1 PDT} + {2709190800 -28800 0 PST} + {2720080800 -25200 1 PDT} + {2740640400 -28800 0 PST} + {2751530400 -25200 1 PDT} + {2772090000 -28800 0 PST} + {2782980000 -25200 1 PDT} + {2803539600 -28800 0 PST} + {2814429600 -25200 1 PDT} + {2834989200 -28800 0 PST} + {2846484000 -25200 1 PDT} + {2867043600 -28800 0 PST} + {2877933600 -25200 1 PDT} + {2898493200 -28800 0 PST} + {2909383200 -25200 1 PDT} + {2929942800 -28800 0 PST} + {2940832800 -25200 1 PDT} + {2961392400 -28800 0 PST} + {2972282400 -25200 1 PDT} + {2992842000 -28800 0 PST} + {3003732000 -25200 1 PDT} + {3024291600 -28800 0 PST} + {3035786400 -25200 1 PDT} + {3056346000 -28800 0 PST} + {3067236000 -25200 1 PDT} + {3087795600 -28800 0 PST} + {3098685600 -25200 1 PDT} + {3119245200 -28800 0 PST} + {3130135200 -25200 1 PDT} + {3150694800 -28800 0 PST} + {3161584800 -25200 1 PDT} + {3182144400 -28800 0 PST} + {3193034400 -25200 1 PDT} + {3213594000 -28800 0 PST} + {3225088800 -25200 1 PDT} + {3245648400 -28800 0 PST} + {3256538400 -25200 1 PDT} + {3277098000 -28800 0 PST} + {3287988000 -25200 1 PDT} + {3308547600 -28800 0 PST} + {3319437600 -25200 1 PDT} + {3339997200 -28800 0 PST} + {3350887200 -25200 1 PDT} + {3371446800 -28800 0 PST} + {3382941600 -25200 1 PDT} + {3403501200 -28800 0 PST} + {3414391200 -25200 1 PDT} + {3434950800 -28800 0 PST} + {3445840800 -25200 1 PDT} + {3466400400 -28800 0 PST} + {3477290400 -25200 1 PDT} + {3497850000 -28800 0 PST} + {3508740000 -25200 1 PDT} + {3529299600 -28800 0 PST} + {3540189600 -25200 1 PDT} + {3560749200 -28800 0 PST} + {3572244000 -25200 1 PDT} + {3592803600 -28800 0 PST} + {3603693600 -25200 1 PDT} + {3624253200 -28800 0 PST} + {3635143200 -25200 1 PDT} + {3655702800 -28800 0 PST} + {3666592800 -25200 1 PDT} + {3687152400 -28800 0 PST} + {3698042400 -25200 1 PDT} + {3718602000 -28800 0 PST} + {3730096800 -25200 1 PDT} + {3750656400 -28800 0 PST} + {3761546400 -25200 1 PDT} + {3782106000 -28800 0 PST} + {3792996000 -25200 1 PDT} + {3813555600 -28800 0 PST} + {3824445600 -25200 1 PDT} + {3845005200 -28800 0 PST} + {3855895200 -25200 1 PDT} + {3876454800 -28800 0 PST} + {3887344800 -25200 1 PDT} + {3907904400 -28800 0 PST} + {3919399200 -25200 1 PDT} + {3939958800 -28800 0 PST} + {3950848800 -25200 1 PDT} + {3971408400 -28800 0 PST} + {3982298400 -25200 1 PDT} + {4002858000 -28800 0 PST} + {4013748000 -25200 1 PDT} + {4034307600 -28800 0 PST} + {4045197600 -25200 1 PDT} + {4065757200 -28800 0 PST} + {4076647200 -25200 1 PDT} + {4097206800 -28800 0 PST} +} diff --git a/env/tcl/tcl8.6/tzdata/America/Dawson_Creek b/env/tcl/tcl8.6/tzdata/America/Dawson_Creek new file mode 100644 index 0000000..a0b5c44 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/America/Dawson_Creek @@ -0,0 +1,64 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:America/Dawson_Creek) { + {-9223372036854775808 -28856 0 LMT} + {-2713881544 -28800 0 PST} + {-1632060000 -25200 1 PDT} + {-1615129200 -28800 0 PST} + {-880207200 -25200 1 PWT} + {-769395600 -25200 1 PPT} + {-765385200 -28800 0 PST} + {-725817600 -28800 0 PST} + {-715788000 -25200 1 PDT} + {-702486000 -28800 0 PST} + {-684338400 -25200 1 PDT} + {-671036400 -28800 0 PST} + {-652888800 -25200 1 PDT} + {-639586800 -28800 0 PST} + {-620834400 -25200 1 PDT} + {-608137200 -28800 0 PST} + {-589384800 -25200 1 PDT} + {-576082800 -28800 0 PST} + {-557935200 -25200 1 PDT} + {-544633200 -28800 0 PST} + {-526485600 -25200 1 PDT} + {-513183600 -28800 0 PST} + {-495036000 -25200 1 PDT} + {-481734000 -28800 0 PST} + {-463586400 -25200 1 PDT} + {-450284400 -28800 0 PST} + {-431532000 -25200 1 PDT} + {-418230000 -28800 0 PST} + {-400082400 -25200 1 PDT} + {-386780400 -28800 0 PST} + {-368632800 -25200 1 PDT} + {-355330800 -28800 0 PST} + {-337183200 -25200 1 PDT} + {-323881200 -28800 0 PST} + {-305733600 -25200 1 PDT} + {-292431600 -28800 0 PST} + {-273679200 -25200 1 PDT} + {-260982000 -28800 0 PST} + {-242229600 -25200 1 PDT} + {-226508400 -28800 0 PST} + {-210780000 -25200 1 PDT} + {-195058800 -28800 0 PST} + {-179330400 -25200 1 PDT} + {-163609200 -28800 0 PST} + {-147880800 -25200 1 PDT} + {-131554800 -28800 0 PST} + {-116431200 -25200 1 PDT} + {-100105200 -28800 0 PST} + {-84376800 -25200 1 PDT} + {-68655600 -28800 0 PST} + {-52927200 -25200 1 PDT} + {-37206000 -28800 0 PST} + {-21477600 -25200 1 PDT} + {-5756400 -28800 0 PST} + {9972000 -25200 1 PDT} + {25693200 -28800 0 PST} + {41421600 -25200 1 PDT} + {57747600 -28800 0 PST} + {73476000 -25200 1 PDT} + {84016800 -25200 0 MST} +} diff --git a/env/tcl/tcl8.6/tzdata/America/Denver b/env/tcl/tcl8.6/tzdata/America/Denver new file mode 100644 index 0000000..06bc80d --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/America/Denver @@ -0,0 +1,291 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:America/Denver) { + {-9223372036854775808 -25196 0 LMT} + {-2717643600 -25200 0 MST} + {-1633273200 -21600 1 MDT} + {-1615132800 -25200 0 MST} + {-1601823600 -21600 1 MDT} + {-1583683200 -25200 0 MST} + {-1577898000 -25200 0 MST} + {-1570374000 -21600 1 MDT} + {-1551628800 -25200 0 MST} + {-1538924400 -21600 1 MDT} + {-1534089600 -25200 0 MST} + {-883587600 -25200 0 MST} + {-880210800 -21600 1 MWT} + {-769395600 -21600 1 MPT} + {-765388800 -25200 0 MST} + {-757357200 -25200 0 MST} + {-147884400 -21600 1 MDT} + {-131558400 -25200 0 MST} + {-116434800 -21600 1 MDT} + {-100108800 -25200 0 MST} + {-94669200 -25200 0 MST} + {-84380400 -21600 1 MDT} + {-68659200 -25200 0 MST} + {-52930800 -21600 1 MDT} + {-37209600 -25200 0 MST} + {-21481200 -21600 1 MDT} + {-5760000 -25200 0 MST} + {9968400 -21600 1 MDT} + {25689600 -25200 0 MST} + {41418000 -21600 1 MDT} + {57744000 -25200 0 MST} + {73472400 -21600 1 MDT} + {89193600 -25200 0 MST} + {104922000 -21600 1 MDT} + {120643200 -25200 0 MST} + {126694800 -21600 1 MDT} + {152092800 -25200 0 MST} + {162378000 -21600 1 MDT} + {183542400 -25200 0 MST} + {199270800 -21600 1 MDT} + {215596800 -25200 0 MST} + {230720400 -21600 1 MDT} + {247046400 -25200 0 MST} + {262774800 -21600 1 MDT} + {278496000 -25200 0 MST} + {294224400 -21600 1 MDT} + {309945600 -25200 0 MST} + {325674000 -21600 1 MDT} + {341395200 -25200 0 MST} + {357123600 -21600 1 MDT} + {372844800 -25200 0 MST} + {388573200 -21600 1 MDT} + {404899200 -25200 0 MST} + {420022800 -21600 1 MDT} + {436348800 -25200 0 MST} + {452077200 -21600 1 MDT} + {467798400 -25200 0 MST} + {483526800 -21600 1 MDT} + {499248000 -25200 0 MST} + {514976400 -21600 1 MDT} + {530697600 -25200 0 MST} + {544611600 -21600 1 MDT} + {562147200 -25200 0 MST} + {576061200 -21600 1 MDT} + {594201600 -25200 0 MST} + {607510800 -21600 1 MDT} + {625651200 -25200 0 MST} + {638960400 -21600 1 MDT} + {657100800 -25200 0 MST} + {671014800 -21600 1 MDT} + {688550400 -25200 0 MST} + {702464400 -21600 1 MDT} + {720000000 -25200 0 MST} + {733914000 -21600 1 MDT} + {752054400 -25200 0 MST} + {765363600 -21600 1 MDT} + {783504000 -25200 0 MST} + {796813200 -21600 1 MDT} + {814953600 -25200 0 MST} + {828867600 -21600 1 MDT} + {846403200 -25200 0 MST} + {860317200 -21600 1 MDT} + {877852800 -25200 0 MST} + {891766800 -21600 1 MDT} + {909302400 -25200 0 MST} + {923216400 -21600 1 MDT} + {941356800 -25200 0 MST} + {954666000 -21600 1 MDT} + {972806400 -25200 0 MST} + {986115600 -21600 1 MDT} + {1004256000 -25200 0 MST} + {1018170000 -21600 1 MDT} + {1035705600 -25200 0 MST} + {1049619600 -21600 1 MDT} + {1067155200 -25200 0 MST} + {1081069200 -21600 1 MDT} + {1099209600 -25200 0 MST} + {1112518800 -21600 1 MDT} + {1130659200 -25200 0 MST} + {1143968400 -21600 1 MDT} + {1162108800 -25200 0 MST} + {1173603600 -21600 1 MDT} + {1194163200 -25200 0 MST} + {1205053200 -21600 1 MDT} + {1225612800 -25200 0 MST} + {1236502800 -21600 1 MDT} + {1257062400 -25200 0 MST} + {1268557200 -21600 1 MDT} + {1289116800 -25200 0 MST} + {1300006800 -21600 1 MDT} + {1320566400 -25200 0 MST} + {1331456400 -21600 1 MDT} + {1352016000 -25200 0 MST} + {1362906000 -21600 1 MDT} + {1383465600 -25200 0 MST} + {1394355600 -21600 1 MDT} + {1414915200 -25200 0 MST} + {1425805200 -21600 1 MDT} + {1446364800 -25200 0 MST} + {1457859600 -21600 1 MDT} + {1478419200 -25200 0 MST} + {1489309200 -21600 1 MDT} + {1509868800 -25200 0 MST} + {1520758800 -21600 1 MDT} + {1541318400 -25200 0 MST} + {1552208400 -21600 1 MDT} + {1572768000 -25200 0 MST} + {1583658000 -21600 1 MDT} + {1604217600 -25200 0 MST} + {1615712400 -21600 1 MDT} + {1636272000 -25200 0 MST} + {1647162000 -21600 1 MDT} + {1667721600 -25200 0 MST} + {1678611600 -21600 1 MDT} + {1699171200 -25200 0 MST} + {1710061200 -21600 1 MDT} + {1730620800 -25200 0 MST} + {1741510800 -21600 1 MDT} + {1762070400 -25200 0 MST} + {1772960400 -21600 1 MDT} + {1793520000 -25200 0 MST} + {1805014800 -21600 1 MDT} + {1825574400 -25200 0 MST} + {1836464400 -21600 1 MDT} + {1857024000 -25200 0 MST} + {1867914000 -21600 1 MDT} + {1888473600 -25200 0 MST} + {1899363600 -21600 1 MDT} + {1919923200 -25200 0 MST} + {1930813200 -21600 1 MDT} + {1951372800 -25200 0 MST} + {1962867600 -21600 1 MDT} + {1983427200 -25200 0 MST} + {1994317200 -21600 1 MDT} + {2014876800 -25200 0 MST} + {2025766800 -21600 1 MDT} + {2046326400 -25200 0 MST} + {2057216400 -21600 1 MDT} + {2077776000 -25200 0 MST} + {2088666000 -21600 1 MDT} + {2109225600 -25200 0 MST} + {2120115600 -21600 1 MDT} + {2140675200 -25200 0 MST} + {2152170000 -21600 1 MDT} + {2172729600 -25200 0 MST} + {2183619600 -21600 1 MDT} + {2204179200 -25200 0 MST} + {2215069200 -21600 1 MDT} + {2235628800 -25200 0 MST} + {2246518800 -21600 1 MDT} + {2267078400 -25200 0 MST} + {2277968400 -21600 1 MDT} + {2298528000 -25200 0 MST} + {2309418000 -21600 1 MDT} + {2329977600 -25200 0 MST} + {2341472400 -21600 1 MDT} + {2362032000 -25200 0 MST} + {2372922000 -21600 1 MDT} + {2393481600 -25200 0 MST} + {2404371600 -21600 1 MDT} + {2424931200 -25200 0 MST} + {2435821200 -21600 1 MDT} + {2456380800 -25200 0 MST} + {2467270800 -21600 1 MDT} + {2487830400 -25200 0 MST} + {2499325200 -21600 1 MDT} + {2519884800 -25200 0 MST} + {2530774800 -21600 1 MDT} + {2551334400 -25200 0 MST} + {2562224400 -21600 1 MDT} + {2582784000 -25200 0 MST} + {2593674000 -21600 1 MDT} + {2614233600 -25200 0 MST} + {2625123600 -21600 1 MDT} + {2645683200 -25200 0 MST} + {2656573200 -21600 1 MDT} + {2677132800 -25200 0 MST} + {2688627600 -21600 1 MDT} + {2709187200 -25200 0 MST} + {2720077200 -21600 1 MDT} + {2740636800 -25200 0 MST} + {2751526800 -21600 1 MDT} + {2772086400 -25200 0 MST} + {2782976400 -21600 1 MDT} + {2803536000 -25200 0 MST} + {2814426000 -21600 1 MDT} + {2834985600 -25200 0 MST} + {2846480400 -21600 1 MDT} + {2867040000 -25200 0 MST} + {2877930000 -21600 1 MDT} + {2898489600 -25200 0 MST} + {2909379600 -21600 1 MDT} + {2929939200 -25200 0 MST} + {2940829200 -21600 1 MDT} + {2961388800 -25200 0 MST} + {2972278800 -21600 1 MDT} + {2992838400 -25200 0 MST} + {3003728400 -21600 1 MDT} + {3024288000 -25200 0 MST} + {3035782800 -21600 1 MDT} + {3056342400 -25200 0 MST} + {3067232400 -21600 1 MDT} + {3087792000 -25200 0 MST} + {3098682000 -21600 1 MDT} + {3119241600 -25200 0 MST} + {3130131600 -21600 1 MDT} + {3150691200 -25200 0 MST} + {3161581200 -21600 1 MDT} + {3182140800 -25200 0 MST} + {3193030800 -21600 1 MDT} + {3213590400 -25200 0 MST} + {3225085200 -21600 1 MDT} + {3245644800 -25200 0 MST} + {3256534800 -21600 1 MDT} + {3277094400 -25200 0 MST} + {3287984400 -21600 1 MDT} + {3308544000 -25200 0 MST} + {3319434000 -21600 1 MDT} + {3339993600 -25200 0 MST} + {3350883600 -21600 1 MDT} + {3371443200 -25200 0 MST} + {3382938000 -21600 1 MDT} + {3403497600 -25200 0 MST} + {3414387600 -21600 1 MDT} + {3434947200 -25200 0 MST} + {3445837200 -21600 1 MDT} + {3466396800 -25200 0 MST} + {3477286800 -21600 1 MDT} + {3497846400 -25200 0 MST} + {3508736400 -21600 1 MDT} + {3529296000 -25200 0 MST} + {3540186000 -21600 1 MDT} + {3560745600 -25200 0 MST} + {3572240400 -21600 1 MDT} + {3592800000 -25200 0 MST} + {3603690000 -21600 1 MDT} + {3624249600 -25200 0 MST} + {3635139600 -21600 1 MDT} + {3655699200 -25200 0 MST} + {3666589200 -21600 1 MDT} + {3687148800 -25200 0 MST} + {3698038800 -21600 1 MDT} + {3718598400 -25200 0 MST} + {3730093200 -21600 1 MDT} + {3750652800 -25200 0 MST} + {3761542800 -21600 1 MDT} + {3782102400 -25200 0 MST} + {3792992400 -21600 1 MDT} + {3813552000 -25200 0 MST} + {3824442000 -21600 1 MDT} + {3845001600 -25200 0 MST} + {3855891600 -21600 1 MDT} + {3876451200 -25200 0 MST} + {3887341200 -21600 1 MDT} + {3907900800 -25200 0 MST} + {3919395600 -21600 1 MDT} + {3939955200 -25200 0 MST} + {3950845200 -21600 1 MDT} + {3971404800 -25200 0 MST} + {3982294800 -21600 1 MDT} + {4002854400 -25200 0 MST} + {4013744400 -21600 1 MDT} + {4034304000 -25200 0 MST} + {4045194000 -21600 1 MDT} + {4065753600 -25200 0 MST} + {4076643600 -21600 1 MDT} + {4097203200 -25200 0 MST} +} diff --git a/env/tcl/tcl8.6/tzdata/America/Detroit b/env/tcl/tcl8.6/tzdata/America/Detroit new file mode 100644 index 0000000..f725874 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/America/Detroit @@ -0,0 +1,270 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:America/Detroit) { + {-9223372036854775808 -19931 0 LMT} + {-2051202469 -21600 0 CST} + {-1724083200 -18000 0 EST} + {-883594800 -18000 0 EST} + {-880218000 -14400 1 EWT} + {-769395600 -14400 1 EPT} + {-765396000 -18000 0 EST} + {-757364400 -18000 0 EST} + {-684349200 -14400 1 EDT} + {-671047200 -18000 0 EST} + {94712400 -18000 0 EST} + {104914800 -14400 1 EDT} + {120636000 -18000 0 EST} + {126687600 -14400 1 EDT} + {152085600 -18000 0 EST} + {157784400 -18000 0 EST} + {167814000 -14400 0 EDT} + {183535200 -18000 0 EST} + {199263600 -14400 1 EDT} + {215589600 -18000 0 EST} + {230713200 -14400 1 EDT} + {247039200 -18000 0 EST} + {262767600 -14400 1 EDT} + {278488800 -18000 0 EST} + {294217200 -14400 1 EDT} + {309938400 -18000 0 EST} + {325666800 -14400 1 EDT} + {341388000 -18000 0 EST} + {357116400 -14400 1 EDT} + {372837600 -18000 0 EST} + {388566000 -14400 1 EDT} + {404892000 -18000 0 EST} + {420015600 -14400 1 EDT} + {436341600 -18000 0 EST} + {452070000 -14400 1 EDT} + {467791200 -18000 0 EST} + {483519600 -14400 1 EDT} + {499240800 -18000 0 EST} + {514969200 -14400 1 EDT} + {530690400 -18000 0 EST} + {544604400 -14400 1 EDT} + {562140000 -18000 0 EST} + {576054000 -14400 1 EDT} + {594194400 -18000 0 EST} + {607503600 -14400 1 EDT} + {625644000 -18000 0 EST} + {638953200 -14400 1 EDT} + {657093600 -18000 0 EST} + {671007600 -14400 1 EDT} + {688543200 -18000 0 EST} + {702457200 -14400 1 EDT} + {719992800 -18000 0 EST} + {733906800 -14400 1 EDT} + {752047200 -18000 0 EST} + {765356400 -14400 1 EDT} + {783496800 -18000 0 EST} + {796806000 -14400 1 EDT} + {814946400 -18000 0 EST} + {828860400 -14400 1 EDT} + {846396000 -18000 0 EST} + {860310000 -14400 1 EDT} + {877845600 -18000 0 EST} + {891759600 -14400 1 EDT} + {909295200 -18000 0 EST} + {923209200 -14400 1 EDT} + {941349600 -18000 0 EST} + {954658800 -14400 1 EDT} + {972799200 -18000 0 EST} + {986108400 -14400 1 EDT} + {1004248800 -18000 0 EST} + {1018162800 -14400 1 EDT} + {1035698400 -18000 0 EST} + {1049612400 -14400 1 EDT} + {1067148000 -18000 0 EST} + {1081062000 -14400 1 EDT} + {1099202400 -18000 0 EST} + {1112511600 -14400 1 EDT} + {1130652000 -18000 0 EST} + {1143961200 -14400 1 EDT} + {1162101600 -18000 0 EST} + {1173596400 -14400 1 EDT} + {1194156000 -18000 0 EST} + {1205046000 -14400 1 EDT} + {1225605600 -18000 0 EST} + {1236495600 -14400 1 EDT} + {1257055200 -18000 0 EST} + {1268550000 -14400 1 EDT} + {1289109600 -18000 0 EST} + {1299999600 -14400 1 EDT} + {1320559200 -18000 0 EST} + {1331449200 -14400 1 EDT} + {1352008800 -18000 0 EST} + {1362898800 -14400 1 EDT} + {1383458400 -18000 0 EST} + {1394348400 -14400 1 EDT} + {1414908000 -18000 0 EST} + {1425798000 -14400 1 EDT} + {1446357600 -18000 0 EST} + {1457852400 -14400 1 EDT} + {1478412000 -18000 0 EST} + {1489302000 -14400 1 EDT} + {1509861600 -18000 0 EST} + {1520751600 -14400 1 EDT} + {1541311200 -18000 0 EST} + {1552201200 -14400 1 EDT} + {1572760800 -18000 0 EST} + {1583650800 -14400 1 EDT} + {1604210400 -18000 0 EST} + {1615705200 -14400 1 EDT} + {1636264800 -18000 0 EST} + {1647154800 -14400 1 EDT} + {1667714400 -18000 0 EST} + {1678604400 -14400 1 EDT} + {1699164000 -18000 0 EST} + {1710054000 -14400 1 EDT} + {1730613600 -18000 0 EST} + {1741503600 -14400 1 EDT} + {1762063200 -18000 0 EST} + {1772953200 -14400 1 EDT} + {1793512800 -18000 0 EST} + {1805007600 -14400 1 EDT} + {1825567200 -18000 0 EST} + {1836457200 -14400 1 EDT} + {1857016800 -18000 0 EST} + {1867906800 -14400 1 EDT} + {1888466400 -18000 0 EST} + {1899356400 -14400 1 EDT} + {1919916000 -18000 0 EST} + {1930806000 -14400 1 EDT} + {1951365600 -18000 0 EST} + {1962860400 -14400 1 EDT} + {1983420000 -18000 0 EST} + {1994310000 -14400 1 EDT} + {2014869600 -18000 0 EST} + {2025759600 -14400 1 EDT} + {2046319200 -18000 0 EST} + {2057209200 -14400 1 EDT} + {2077768800 -18000 0 EST} + {2088658800 -14400 1 EDT} + {2109218400 -18000 0 EST} + {2120108400 -14400 1 EDT} + {2140668000 -18000 0 EST} + {2152162800 -14400 1 EDT} + {2172722400 -18000 0 EST} + {2183612400 -14400 1 EDT} + {2204172000 -18000 0 EST} + {2215062000 -14400 1 EDT} + {2235621600 -18000 0 EST} + {2246511600 -14400 1 EDT} + {2267071200 -18000 0 EST} + {2277961200 -14400 1 EDT} + {2298520800 -18000 0 EST} + {2309410800 -14400 1 EDT} + {2329970400 -18000 0 EST} + {2341465200 -14400 1 EDT} + {2362024800 -18000 0 EST} + {2372914800 -14400 1 EDT} + {2393474400 -18000 0 EST} + {2404364400 -14400 1 EDT} + {2424924000 -18000 0 EST} + {2435814000 -14400 1 EDT} + {2456373600 -18000 0 EST} + {2467263600 -14400 1 EDT} + {2487823200 -18000 0 EST} + {2499318000 -14400 1 EDT} + {2519877600 -18000 0 EST} + {2530767600 -14400 1 EDT} + {2551327200 -18000 0 EST} + {2562217200 -14400 1 EDT} + {2582776800 -18000 0 EST} + {2593666800 -14400 1 EDT} + {2614226400 -18000 0 EST} + {2625116400 -14400 1 EDT} + {2645676000 -18000 0 EST} + {2656566000 -14400 1 EDT} + {2677125600 -18000 0 EST} + {2688620400 -14400 1 EDT} + {2709180000 -18000 0 EST} + {2720070000 -14400 1 EDT} + {2740629600 -18000 0 EST} + {2751519600 -14400 1 EDT} + {2772079200 -18000 0 EST} + {2782969200 -14400 1 EDT} + {2803528800 -18000 0 EST} + {2814418800 -14400 1 EDT} + {2834978400 -18000 0 EST} + {2846473200 -14400 1 EDT} + {2867032800 -18000 0 EST} + {2877922800 -14400 1 EDT} + {2898482400 -18000 0 EST} + {2909372400 -14400 1 EDT} + {2929932000 -18000 0 EST} + {2940822000 -14400 1 EDT} + {2961381600 -18000 0 EST} + {2972271600 -14400 1 EDT} + {2992831200 -18000 0 EST} + {3003721200 -14400 1 EDT} + {3024280800 -18000 0 EST} + {3035775600 -14400 1 EDT} + {3056335200 -18000 0 EST} + {3067225200 -14400 1 EDT} + {3087784800 -18000 0 EST} + {3098674800 -14400 1 EDT} + {3119234400 -18000 0 EST} + {3130124400 -14400 1 EDT} + {3150684000 -18000 0 EST} + {3161574000 -14400 1 EDT} + {3182133600 -18000 0 EST} + {3193023600 -14400 1 EDT} + {3213583200 -18000 0 EST} + {3225078000 -14400 1 EDT} + {3245637600 -18000 0 EST} + {3256527600 -14400 1 EDT} + {3277087200 -18000 0 EST} + {3287977200 -14400 1 EDT} + {3308536800 -18000 0 EST} + {3319426800 -14400 1 EDT} + {3339986400 -18000 0 EST} + {3350876400 -14400 1 EDT} + {3371436000 -18000 0 EST} + {3382930800 -14400 1 EDT} + {3403490400 -18000 0 EST} + {3414380400 -14400 1 EDT} + {3434940000 -18000 0 EST} + {3445830000 -14400 1 EDT} + {3466389600 -18000 0 EST} + {3477279600 -14400 1 EDT} + {3497839200 -18000 0 EST} + {3508729200 -14400 1 EDT} + {3529288800 -18000 0 EST} + {3540178800 -14400 1 EDT} + {3560738400 -18000 0 EST} + {3572233200 -14400 1 EDT} + {3592792800 -18000 0 EST} + {3603682800 -14400 1 EDT} + {3624242400 -18000 0 EST} + {3635132400 -14400 1 EDT} + {3655692000 -18000 0 EST} + {3666582000 -14400 1 EDT} + {3687141600 -18000 0 EST} + {3698031600 -14400 1 EDT} + {3718591200 -18000 0 EST} + {3730086000 -14400 1 EDT} + {3750645600 -18000 0 EST} + {3761535600 -14400 1 EDT} + {3782095200 -18000 0 EST} + {3792985200 -14400 1 EDT} + {3813544800 -18000 0 EST} + {3824434800 -14400 1 EDT} + {3844994400 -18000 0 EST} + {3855884400 -14400 1 EDT} + {3876444000 -18000 0 EST} + {3887334000 -14400 1 EDT} + {3907893600 -18000 0 EST} + {3919388400 -14400 1 EDT} + {3939948000 -18000 0 EST} + {3950838000 -14400 1 EDT} + {3971397600 -18000 0 EST} + {3982287600 -14400 1 EDT} + {4002847200 -18000 0 EST} + {4013737200 -14400 1 EDT} + {4034296800 -18000 0 EST} + {4045186800 -14400 1 EDT} + {4065746400 -18000 0 EST} + {4076636400 -14400 1 EDT} + {4097196000 -18000 0 EST} +} diff --git a/env/tcl/tcl8.6/tzdata/America/Dominica b/env/tcl/tcl8.6/tzdata/America/Dominica new file mode 100644 index 0000000..b97cb0e --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/America/Dominica @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(America/Port_of_Spain)]} { + LoadTimeZoneFile America/Port_of_Spain +} +set TZData(:America/Dominica) $TZData(:America/Port_of_Spain) diff --git a/env/tcl/tcl8.6/tzdata/America/Edmonton b/env/tcl/tcl8.6/tzdata/America/Edmonton new file mode 100644 index 0000000..1ed38be --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/America/Edmonton @@ -0,0 +1,284 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:America/Edmonton) { + {-9223372036854775808 -27232 0 LMT} + {-1998663968 -25200 0 MST} + {-1632063600 -21600 1 MDT} + {-1615132800 -25200 0 MST} + {-1600614000 -21600 1 MDT} + {-1596816000 -25200 0 MST} + {-1567954800 -21600 1 MDT} + {-1551628800 -25200 0 MST} + {-1536505200 -21600 1 MDT} + {-1523203200 -25200 0 MST} + {-1504450800 -21600 1 MDT} + {-1491753600 -25200 0 MST} + {-1473001200 -21600 1 MDT} + {-1459699200 -25200 0 MST} + {-880210800 -21600 1 MWT} + {-769395600 -21600 1 MPT} + {-765388800 -25200 0 MST} + {-715791600 -21600 1 MDT} + {-702489600 -25200 0 MST} + {-84380400 -21600 1 MDT} + {-68659200 -25200 0 MST} + {-21481200 -21600 1 MDT} + {-5760000 -25200 0 MST} + {73472400 -21600 1 MDT} + {89193600 -25200 0 MST} + {104922000 -21600 1 MDT} + {120643200 -25200 0 MST} + {136371600 -21600 1 MDT} + {152092800 -25200 0 MST} + {167821200 -21600 1 MDT} + {183542400 -25200 0 MST} + {199270800 -21600 1 MDT} + {215596800 -25200 0 MST} + {230720400 -21600 1 MDT} + {247046400 -25200 0 MST} + {262774800 -21600 1 MDT} + {278496000 -25200 0 MST} + {294224400 -21600 1 MDT} + {309945600 -25200 0 MST} + {325674000 -21600 1 MDT} + {341395200 -25200 0 MST} + {357123600 -21600 1 MDT} + {372844800 -25200 0 MST} + {388573200 -21600 1 MDT} + {404899200 -25200 0 MST} + {420022800 -21600 1 MDT} + {436348800 -25200 0 MST} + {452077200 -21600 1 MDT} + {467798400 -25200 0 MST} + {483526800 -21600 1 MDT} + {499248000 -25200 0 MST} + {514976400 -21600 1 MDT} + {530697600 -25200 0 MST} + {536482800 -25200 0 MST} + {544611600 -21600 1 MDT} + {562147200 -25200 0 MST} + {576061200 -21600 1 MDT} + {594201600 -25200 0 MST} + {607510800 -21600 1 MDT} + {625651200 -25200 0 MST} + {638960400 -21600 1 MDT} + {657100800 -25200 0 MST} + {671014800 -21600 1 MDT} + {688550400 -25200 0 MST} + {702464400 -21600 1 MDT} + {720000000 -25200 0 MST} + {733914000 -21600 1 MDT} + {752054400 -25200 0 MST} + {765363600 -21600 1 MDT} + {783504000 -25200 0 MST} + {796813200 -21600 1 MDT} + {814953600 -25200 0 MST} + {828867600 -21600 1 MDT} + {846403200 -25200 0 MST} + {860317200 -21600 1 MDT} + {877852800 -25200 0 MST} + {891766800 -21600 1 MDT} + {909302400 -25200 0 MST} + {923216400 -21600 1 MDT} + {941356800 -25200 0 MST} + {954666000 -21600 1 MDT} + {972806400 -25200 0 MST} + {986115600 -21600 1 MDT} + {1004256000 -25200 0 MST} + {1018170000 -21600 1 MDT} + {1035705600 -25200 0 MST} + {1049619600 -21600 1 MDT} + {1067155200 -25200 0 MST} + {1081069200 -21600 1 MDT} + {1099209600 -25200 0 MST} + {1112518800 -21600 1 MDT} + {1130659200 -25200 0 MST} + {1143968400 -21600 1 MDT} + {1162108800 -25200 0 MST} + {1173603600 -21600 1 MDT} + {1194163200 -25200 0 MST} + {1205053200 -21600 1 MDT} + {1225612800 -25200 0 MST} + {1236502800 -21600 1 MDT} + {1257062400 -25200 0 MST} + {1268557200 -21600 1 MDT} + {1289116800 -25200 0 MST} + {1300006800 -21600 1 MDT} + {1320566400 -25200 0 MST} + {1331456400 -21600 1 MDT} + {1352016000 -25200 0 MST} + {1362906000 -21600 1 MDT} + {1383465600 -25200 0 MST} + {1394355600 -21600 1 MDT} + {1414915200 -25200 0 MST} + {1425805200 -21600 1 MDT} + {1446364800 -25200 0 MST} + {1457859600 -21600 1 MDT} + {1478419200 -25200 0 MST} + {1489309200 -21600 1 MDT} + {1509868800 -25200 0 MST} + {1520758800 -21600 1 MDT} + {1541318400 -25200 0 MST} + {1552208400 -21600 1 MDT} + {1572768000 -25200 0 MST} + {1583658000 -21600 1 MDT} + {1604217600 -25200 0 MST} + {1615712400 -21600 1 MDT} + {1636272000 -25200 0 MST} + {1647162000 -21600 1 MDT} + {1667721600 -25200 0 MST} + {1678611600 -21600 1 MDT} + {1699171200 -25200 0 MST} + {1710061200 -21600 1 MDT} + {1730620800 -25200 0 MST} + {1741510800 -21600 1 MDT} + {1762070400 -25200 0 MST} + {1772960400 -21600 1 MDT} + {1793520000 -25200 0 MST} + {1805014800 -21600 1 MDT} + {1825574400 -25200 0 MST} + {1836464400 -21600 1 MDT} + {1857024000 -25200 0 MST} + {1867914000 -21600 1 MDT} + {1888473600 -25200 0 MST} + {1899363600 -21600 1 MDT} + {1919923200 -25200 0 MST} + {1930813200 -21600 1 MDT} + {1951372800 -25200 0 MST} + {1962867600 -21600 1 MDT} + {1983427200 -25200 0 MST} + {1994317200 -21600 1 MDT} + {2014876800 -25200 0 MST} + {2025766800 -21600 1 MDT} + {2046326400 -25200 0 MST} + {2057216400 -21600 1 MDT} + {2077776000 -25200 0 MST} + {2088666000 -21600 1 MDT} + {2109225600 -25200 0 MST} + {2120115600 -21600 1 MDT} + {2140675200 -25200 0 MST} + {2152170000 -21600 1 MDT} + {2172729600 -25200 0 MST} + {2183619600 -21600 1 MDT} + {2204179200 -25200 0 MST} + {2215069200 -21600 1 MDT} + {2235628800 -25200 0 MST} + {2246518800 -21600 1 MDT} + {2267078400 -25200 0 MST} + {2277968400 -21600 1 MDT} + {2298528000 -25200 0 MST} + {2309418000 -21600 1 MDT} + {2329977600 -25200 0 MST} + {2341472400 -21600 1 MDT} + {2362032000 -25200 0 MST} + {2372922000 -21600 1 MDT} + {2393481600 -25200 0 MST} + {2404371600 -21600 1 MDT} + {2424931200 -25200 0 MST} + {2435821200 -21600 1 MDT} + {2456380800 -25200 0 MST} + {2467270800 -21600 1 MDT} + {2487830400 -25200 0 MST} + {2499325200 -21600 1 MDT} + {2519884800 -25200 0 MST} + {2530774800 -21600 1 MDT} + {2551334400 -25200 0 MST} + {2562224400 -21600 1 MDT} + {2582784000 -25200 0 MST} + {2593674000 -21600 1 MDT} + {2614233600 -25200 0 MST} + {2625123600 -21600 1 MDT} + {2645683200 -25200 0 MST} + {2656573200 -21600 1 MDT} + {2677132800 -25200 0 MST} + {2688627600 -21600 1 MDT} + {2709187200 -25200 0 MST} + {2720077200 -21600 1 MDT} + {2740636800 -25200 0 MST} + {2751526800 -21600 1 MDT} + {2772086400 -25200 0 MST} + {2782976400 -21600 1 MDT} + {2803536000 -25200 0 MST} + {2814426000 -21600 1 MDT} + {2834985600 -25200 0 MST} + {2846480400 -21600 1 MDT} + {2867040000 -25200 0 MST} + {2877930000 -21600 1 MDT} + {2898489600 -25200 0 MST} + {2909379600 -21600 1 MDT} + {2929939200 -25200 0 MST} + {2940829200 -21600 1 MDT} + {2961388800 -25200 0 MST} + {2972278800 -21600 1 MDT} + {2992838400 -25200 0 MST} + {3003728400 -21600 1 MDT} + {3024288000 -25200 0 MST} + {3035782800 -21600 1 MDT} + {3056342400 -25200 0 MST} + {3067232400 -21600 1 MDT} + {3087792000 -25200 0 MST} + {3098682000 -21600 1 MDT} + {3119241600 -25200 0 MST} + {3130131600 -21600 1 MDT} + {3150691200 -25200 0 MST} + {3161581200 -21600 1 MDT} + {3182140800 -25200 0 MST} + {3193030800 -21600 1 MDT} + {3213590400 -25200 0 MST} + {3225085200 -21600 1 MDT} + {3245644800 -25200 0 MST} + {3256534800 -21600 1 MDT} + {3277094400 -25200 0 MST} + {3287984400 -21600 1 MDT} + {3308544000 -25200 0 MST} + {3319434000 -21600 1 MDT} + {3339993600 -25200 0 MST} + {3350883600 -21600 1 MDT} + {3371443200 -25200 0 MST} + {3382938000 -21600 1 MDT} + {3403497600 -25200 0 MST} + {3414387600 -21600 1 MDT} + {3434947200 -25200 0 MST} + {3445837200 -21600 1 MDT} + {3466396800 -25200 0 MST} + {3477286800 -21600 1 MDT} + {3497846400 -25200 0 MST} + {3508736400 -21600 1 MDT} + {3529296000 -25200 0 MST} + {3540186000 -21600 1 MDT} + {3560745600 -25200 0 MST} + {3572240400 -21600 1 MDT} + {3592800000 -25200 0 MST} + {3603690000 -21600 1 MDT} + {3624249600 -25200 0 MST} + {3635139600 -21600 1 MDT} + {3655699200 -25200 0 MST} + {3666589200 -21600 1 MDT} + {3687148800 -25200 0 MST} + {3698038800 -21600 1 MDT} + {3718598400 -25200 0 MST} + {3730093200 -21600 1 MDT} + {3750652800 -25200 0 MST} + {3761542800 -21600 1 MDT} + {3782102400 -25200 0 MST} + {3792992400 -21600 1 MDT} + {3813552000 -25200 0 MST} + {3824442000 -21600 1 MDT} + {3845001600 -25200 0 MST} + {3855891600 -21600 1 MDT} + {3876451200 -25200 0 MST} + {3887341200 -21600 1 MDT} + {3907900800 -25200 0 MST} + {3919395600 -21600 1 MDT} + {3939955200 -25200 0 MST} + {3950845200 -21600 1 MDT} + {3971404800 -25200 0 MST} + {3982294800 -21600 1 MDT} + {4002854400 -25200 0 MST} + {4013744400 -21600 1 MDT} + {4034304000 -25200 0 MST} + {4045194000 -21600 1 MDT} + {4065753600 -25200 0 MST} + {4076643600 -21600 1 MDT} + {4097203200 -25200 0 MST} +} diff --git a/env/tcl/tcl8.6/tzdata/America/Eirunepe b/env/tcl/tcl8.6/tzdata/America/Eirunepe new file mode 100644 index 0000000..a81b09e --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/America/Eirunepe @@ -0,0 +1,41 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:America/Eirunepe) { + {-9223372036854775808 -16768 0 LMT} + {-1767208832 -18000 0 -05} + {-1206950400 -14400 1 -05} + {-1191355200 -18000 0 -05} + {-1175367600 -14400 1 -05} + {-1159819200 -18000 0 -05} + {-633812400 -14400 1 -05} + {-622062000 -18000 0 -05} + {-602276400 -14400 1 -05} + {-591825600 -18000 0 -05} + {-570740400 -14400 1 -05} + {-560203200 -18000 0 -05} + {-539118000 -14400 1 -05} + {-531345600 -18000 0 -05} + {-191358000 -14400 1 -05} + {-184190400 -18000 0 -05} + {-155156400 -14400 1 -05} + {-150062400 -18000 0 -05} + {-128890800 -14400 1 -05} + {-121118400 -18000 0 -05} + {-99946800 -14400 1 -05} + {-89582400 -18000 0 -05} + {-68410800 -14400 1 -05} + {-57960000 -18000 0 -05} + {499755600 -14400 1 -05} + {511243200 -18000 0 -05} + {530600400 -14400 1 -05} + {540273600 -18000 0 -05} + {562136400 -14400 1 -05} + {571204800 -18000 0 -05} + {590040000 -18000 0 -05} + {749192400 -18000 0 -05} + {750834000 -14400 1 -05} + {761716800 -18000 0 -05} + {780206400 -18000 0 -05} + {1214283600 -14400 0 -04} + {1384056000 -18000 0 -05} +} diff --git a/env/tcl/tcl8.6/tzdata/America/El_Salvador b/env/tcl/tcl8.6/tzdata/America/El_Salvador new file mode 100644 index 0000000..75d8129 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/America/El_Salvador @@ -0,0 +1,10 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:America/El_Salvador) { + {-9223372036854775808 -21408 0 LMT} + {-1546279392 -21600 0 CST} + {547020000 -18000 1 CDT} + {559717200 -21600 0 CST} + {578469600 -18000 1 CDT} + {591166800 -21600 0 CST} +} diff --git a/env/tcl/tcl8.6/tzdata/America/Ensenada b/env/tcl/tcl8.6/tzdata/America/Ensenada new file mode 100644 index 0000000..f600305 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/America/Ensenada @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(America/Tijuana)]} { + LoadTimeZoneFile America/Tijuana +} +set TZData(:America/Ensenada) $TZData(:America/Tijuana) diff --git a/env/tcl/tcl8.6/tzdata/America/Fort_Nelson b/env/tcl/tcl8.6/tzdata/America/Fort_Nelson new file mode 100644 index 0000000..d819368 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/America/Fort_Nelson @@ -0,0 +1,151 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:America/Fort_Nelson) { + {-9223372036854775808 -29447 0 LMT} + {-2713880953 -28800 0 PST} + {-1632060000 -25200 1 PDT} + {-1615129200 -28800 0 PST} + {-880207200 -25200 1 PWT} + {-769395600 -25200 1 PPT} + {-765385200 -28800 0 PST} + {-757353600 -28800 0 PST} + {-725817600 -28800 0 PST} + {-715788000 -25200 1 PDT} + {-702486000 -28800 0 PST} + {-684338400 -25200 1 PDT} + {-671036400 -28800 0 PST} + {-652888800 -25200 1 PDT} + {-639586800 -28800 0 PST} + {-620834400 -25200 1 PDT} + {-608137200 -28800 0 PST} + {-589384800 -25200 1 PDT} + {-576082800 -28800 0 PST} + {-557935200 -25200 1 PDT} + {-544633200 -28800 0 PST} + {-526485600 -25200 1 PDT} + {-513183600 -28800 0 PST} + {-495036000 -25200 1 PDT} + {-481734000 -28800 0 PST} + {-463586400 -25200 1 PDT} + {-450284400 -28800 0 PST} + {-431532000 -25200 1 PDT} + {-418230000 -28800 0 PST} + {-400082400 -25200 1 PDT} + {-386780400 -28800 0 PST} + {-368632800 -25200 1 PDT} + {-355330800 -28800 0 PST} + {-337183200 -25200 1 PDT} + {-323881200 -28800 0 PST} + {-305733600 -25200 1 PDT} + {-292431600 -28800 0 PST} + {-273679200 -25200 1 PDT} + {-260982000 -28800 0 PST} + {-242229600 -25200 1 PDT} + {-226508400 -28800 0 PST} + {-210780000 -25200 1 PDT} + {-195058800 -28800 0 PST} + {-179330400 -25200 1 PDT} + {-163609200 -28800 0 PST} + {-147880800 -25200 1 PDT} + {-131554800 -28800 0 PST} + {-116431200 -25200 1 PDT} + {-100105200 -28800 0 PST} + {-84376800 -25200 1 PDT} + {-68655600 -28800 0 PST} + {-52927200 -25200 1 PDT} + {-37206000 -28800 0 PST} + {-21477600 -25200 1 PDT} + {-5756400 -28800 0 PST} + {9972000 -25200 1 PDT} + {25693200 -28800 0 PST} + {41421600 -25200 1 PDT} + {57747600 -28800 0 PST} + {73476000 -25200 1 PDT} + {89197200 -28800 0 PST} + {104925600 -25200 1 PDT} + {120646800 -28800 0 PST} + {136375200 -25200 1 PDT} + {152096400 -28800 0 PST} + {167824800 -25200 1 PDT} + {183546000 -28800 0 PST} + {199274400 -25200 1 PDT} + {215600400 -28800 0 PST} + {230724000 -25200 1 PDT} + {247050000 -28800 0 PST} + {262778400 -25200 1 PDT} + {278499600 -28800 0 PST} + {294228000 -25200 1 PDT} + {309949200 -28800 0 PST} + {325677600 -25200 1 PDT} + {341398800 -28800 0 PST} + {357127200 -25200 1 PDT} + {372848400 -28800 0 PST} + {388576800 -25200 1 PDT} + {404902800 -28800 0 PST} + {420026400 -25200 1 PDT} + {436352400 -28800 0 PST} + {452080800 -25200 1 PDT} + {467802000 -28800 0 PST} + {483530400 -25200 1 PDT} + {499251600 -28800 0 PST} + {514980000 -25200 1 PDT} + {530701200 -28800 0 PST} + {536486400 -28800 0 PST} + {544615200 -25200 1 PDT} + {562150800 -28800 0 PST} + {576064800 -25200 1 PDT} + {594205200 -28800 0 PST} + {607514400 -25200 1 PDT} + {625654800 -28800 0 PST} + {638964000 -25200 1 PDT} + {657104400 -28800 0 PST} + {671018400 -25200 1 PDT} + {688554000 -28800 0 PST} + {702468000 -25200 1 PDT} + {720003600 -28800 0 PST} + {733917600 -25200 1 PDT} + {752058000 -28800 0 PST} + {765367200 -25200 1 PDT} + {783507600 -28800 0 PST} + {796816800 -25200 1 PDT} + {814957200 -28800 0 PST} + {828871200 -25200 1 PDT} + {846406800 -28800 0 PST} + {860320800 -25200 1 PDT} + {877856400 -28800 0 PST} + {891770400 -25200 1 PDT} + {909306000 -28800 0 PST} + {923220000 -25200 1 PDT} + {941360400 -28800 0 PST} + {954669600 -25200 1 PDT} + {972810000 -28800 0 PST} + {986119200 -25200 1 PDT} + {1004259600 -28800 0 PST} + {1018173600 -25200 1 PDT} + {1035709200 -28800 0 PST} + {1049623200 -25200 1 PDT} + {1067158800 -28800 0 PST} + {1081072800 -25200 1 PDT} + {1099213200 -28800 0 PST} + {1112522400 -25200 1 PDT} + {1130662800 -28800 0 PST} + {1143972000 -25200 1 PDT} + {1162112400 -28800 0 PST} + {1173607200 -25200 1 PDT} + {1194166800 -28800 0 PST} + {1205056800 -25200 1 PDT} + {1225616400 -28800 0 PST} + {1236506400 -25200 1 PDT} + {1257066000 -28800 0 PST} + {1268560800 -25200 1 PDT} + {1289120400 -28800 0 PST} + {1300010400 -25200 1 PDT} + {1320570000 -28800 0 PST} + {1331460000 -25200 1 PDT} + {1352019600 -28800 0 PST} + {1362909600 -25200 1 PDT} + {1383469200 -28800 0 PST} + {1394359200 -25200 1 PDT} + {1414918800 -28800 0 PST} + {1425808800 -25200 0 MST} +} diff --git a/env/tcl/tcl8.6/tzdata/America/Fort_Wayne b/env/tcl/tcl8.6/tzdata/America/Fort_Wayne new file mode 100644 index 0000000..9514d57 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/America/Fort_Wayne @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(America/Indiana/Indianapolis)]} { + LoadTimeZoneFile America/Indiana/Indianapolis +} +set TZData(:America/Fort_Wayne) $TZData(:America/Indiana/Indianapolis) diff --git a/env/tcl/tcl8.6/tzdata/America/Fortaleza b/env/tcl/tcl8.6/tzdata/America/Fortaleza new file mode 100644 index 0000000..bd806f1 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/America/Fortaleza @@ -0,0 +1,48 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:America/Fortaleza) { + {-9223372036854775808 -9240 0 LMT} + {-1767216360 -10800 0 -03} + {-1206957600 -7200 1 -03} + {-1191362400 -10800 0 -03} + {-1175374800 -7200 1 -03} + {-1159826400 -10800 0 -03} + {-633819600 -7200 1 -03} + {-622069200 -10800 0 -03} + {-602283600 -7200 1 -03} + {-591832800 -10800 0 -03} + {-570747600 -7200 1 -03} + {-560210400 -10800 0 -03} + {-539125200 -7200 1 -03} + {-531352800 -10800 0 -03} + {-191365200 -7200 1 -03} + {-184197600 -10800 0 -03} + {-155163600 -7200 1 -03} + {-150069600 -10800 0 -03} + {-128898000 -7200 1 -03} + {-121125600 -10800 0 -03} + {-99954000 -7200 1 -03} + {-89589600 -10800 0 -03} + {-68418000 -7200 1 -03} + {-57967200 -10800 0 -03} + {499748400 -7200 1 -03} + {511236000 -10800 0 -03} + {530593200 -7200 1 -03} + {540266400 -10800 0 -03} + {562129200 -7200 1 -03} + {571197600 -10800 0 -03} + {592974000 -7200 1 -03} + {602042400 -10800 0 -03} + {624423600 -7200 1 -03} + {634701600 -10800 0 -03} + {653536800 -10800 0 -03} + {938660400 -10800 0 -03} + {938919600 -7200 1 -03} + {951616800 -10800 0 -03} + {970974000 -7200 1 -03} + {972180000 -10800 0 -03} + {1000350000 -10800 0 -03} + {1003028400 -7200 1 -03} + {1013911200 -10800 0 -03} + {1033437600 -10800 0 -03} +} diff --git a/env/tcl/tcl8.6/tzdata/America/Glace_Bay b/env/tcl/tcl8.6/tzdata/America/Glace_Bay new file mode 100644 index 0000000..8ee9eec --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/America/Glace_Bay @@ -0,0 +1,273 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:America/Glace_Bay) { + {-9223372036854775808 -14388 0 LMT} + {-2131646412 -14400 0 AST} + {-1632074400 -10800 1 ADT} + {-1615143600 -14400 0 AST} + {-880221600 -10800 1 AWT} + {-769395600 -10800 1 APT} + {-765399600 -14400 0 AST} + {-536443200 -14400 0 AST} + {-526500000 -10800 1 ADT} + {-513198000 -14400 0 AST} + {-504907200 -14400 0 AST} + {63086400 -14400 0 AST} + {73461600 -10800 1 ADT} + {89182800 -14400 0 AST} + {104911200 -10800 1 ADT} + {120632400 -14400 0 AST} + {126244800 -14400 0 AST} + {136360800 -10800 1 ADT} + {152082000 -14400 0 AST} + {167810400 -10800 1 ADT} + {183531600 -14400 0 AST} + {199260000 -10800 1 ADT} + {215586000 -14400 0 AST} + {230709600 -10800 1 ADT} + {247035600 -14400 0 AST} + {262764000 -10800 1 ADT} + {278485200 -14400 0 AST} + {294213600 -10800 1 ADT} + {309934800 -14400 0 AST} + {325663200 -10800 1 ADT} + {341384400 -14400 0 AST} + {357112800 -10800 1 ADT} + {372834000 -14400 0 AST} + {388562400 -10800 1 ADT} + {404888400 -14400 0 AST} + {420012000 -10800 1 ADT} + {436338000 -14400 0 AST} + {452066400 -10800 1 ADT} + {467787600 -14400 0 AST} + {483516000 -10800 1 ADT} + {499237200 -14400 0 AST} + {514965600 -10800 1 ADT} + {530686800 -14400 0 AST} + {544600800 -10800 1 ADT} + {562136400 -14400 0 AST} + {576050400 -10800 1 ADT} + {594190800 -14400 0 AST} + {607500000 -10800 1 ADT} + {625640400 -14400 0 AST} + {638949600 -10800 1 ADT} + {657090000 -14400 0 AST} + {671004000 -10800 1 ADT} + {688539600 -14400 0 AST} + {702453600 -10800 1 ADT} + {719989200 -14400 0 AST} + {733903200 -10800 1 ADT} + {752043600 -14400 0 AST} + {765352800 -10800 1 ADT} + {783493200 -14400 0 AST} + {796802400 -10800 1 ADT} + {814942800 -14400 0 AST} + {828856800 -10800 1 ADT} + {846392400 -14400 0 AST} + {860306400 -10800 1 ADT} + {877842000 -14400 0 AST} + {891756000 -10800 1 ADT} + {909291600 -14400 0 AST} + {923205600 -10800 1 ADT} + {941346000 -14400 0 AST} + {954655200 -10800 1 ADT} + {972795600 -14400 0 AST} + {986104800 -10800 1 ADT} + {1004245200 -14400 0 AST} + {1018159200 -10800 1 ADT} + {1035694800 -14400 0 AST} + {1049608800 -10800 1 ADT} + {1067144400 -14400 0 AST} + {1081058400 -10800 1 ADT} + {1099198800 -14400 0 AST} + {1112508000 -10800 1 ADT} + {1130648400 -14400 0 AST} + {1143957600 -10800 1 ADT} + {1162098000 -14400 0 AST} + {1173592800 -10800 1 ADT} + {1194152400 -14400 0 AST} + {1205042400 -10800 1 ADT} + {1225602000 -14400 0 AST} + {1236492000 -10800 1 ADT} + {1257051600 -14400 0 AST} + {1268546400 -10800 1 ADT} + {1289106000 -14400 0 AST} + {1299996000 -10800 1 ADT} + {1320555600 -14400 0 AST} + {1331445600 -10800 1 ADT} + {1352005200 -14400 0 AST} + {1362895200 -10800 1 ADT} + {1383454800 -14400 0 AST} + {1394344800 -10800 1 ADT} + {1414904400 -14400 0 AST} + {1425794400 -10800 1 ADT} + {1446354000 -14400 0 AST} + {1457848800 -10800 1 ADT} + {1478408400 -14400 0 AST} + {1489298400 -10800 1 ADT} + {1509858000 -14400 0 AST} + {1520748000 -10800 1 ADT} + {1541307600 -14400 0 AST} + {1552197600 -10800 1 ADT} + {1572757200 -14400 0 AST} + {1583647200 -10800 1 ADT} + {1604206800 -14400 0 AST} + {1615701600 -10800 1 ADT} + {1636261200 -14400 0 AST} + {1647151200 -10800 1 ADT} + {1667710800 -14400 0 AST} + {1678600800 -10800 1 ADT} + {1699160400 -14400 0 AST} + {1710050400 -10800 1 ADT} + {1730610000 -14400 0 AST} + {1741500000 -10800 1 ADT} + {1762059600 -14400 0 AST} + {1772949600 -10800 1 ADT} + {1793509200 -14400 0 AST} + {1805004000 -10800 1 ADT} + {1825563600 -14400 0 AST} + {1836453600 -10800 1 ADT} + {1857013200 -14400 0 AST} + {1867903200 -10800 1 ADT} + {1888462800 -14400 0 AST} + {1899352800 -10800 1 ADT} + {1919912400 -14400 0 AST} + {1930802400 -10800 1 ADT} + {1951362000 -14400 0 AST} + {1962856800 -10800 1 ADT} + {1983416400 -14400 0 AST} + {1994306400 -10800 1 ADT} + {2014866000 -14400 0 AST} + {2025756000 -10800 1 ADT} + {2046315600 -14400 0 AST} + {2057205600 -10800 1 ADT} + {2077765200 -14400 0 AST} + {2088655200 -10800 1 ADT} + {2109214800 -14400 0 AST} + {2120104800 -10800 1 ADT} + {2140664400 -14400 0 AST} + {2152159200 -10800 1 ADT} + {2172718800 -14400 0 AST} + {2183608800 -10800 1 ADT} + {2204168400 -14400 0 AST} + {2215058400 -10800 1 ADT} + {2235618000 -14400 0 AST} + {2246508000 -10800 1 ADT} + {2267067600 -14400 0 AST} + {2277957600 -10800 1 ADT} + {2298517200 -14400 0 AST} + {2309407200 -10800 1 ADT} + {2329966800 -14400 0 AST} + {2341461600 -10800 1 ADT} + {2362021200 -14400 0 AST} + {2372911200 -10800 1 ADT} + {2393470800 -14400 0 AST} + {2404360800 -10800 1 ADT} + {2424920400 -14400 0 AST} + {2435810400 -10800 1 ADT} + {2456370000 -14400 0 AST} + {2467260000 -10800 1 ADT} + {2487819600 -14400 0 AST} + {2499314400 -10800 1 ADT} + {2519874000 -14400 0 AST} + {2530764000 -10800 1 ADT} + {2551323600 -14400 0 AST} + {2562213600 -10800 1 ADT} + {2582773200 -14400 0 AST} + {2593663200 -10800 1 ADT} + {2614222800 -14400 0 AST} + {2625112800 -10800 1 ADT} + {2645672400 -14400 0 AST} + {2656562400 -10800 1 ADT} + {2677122000 -14400 0 AST} + {2688616800 -10800 1 ADT} + {2709176400 -14400 0 AST} + {2720066400 -10800 1 ADT} + {2740626000 -14400 0 AST} + {2751516000 -10800 1 ADT} + {2772075600 -14400 0 AST} + {2782965600 -10800 1 ADT} + {2803525200 -14400 0 AST} + {2814415200 -10800 1 ADT} + {2834974800 -14400 0 AST} + {2846469600 -10800 1 ADT} + {2867029200 -14400 0 AST} + {2877919200 -10800 1 ADT} + {2898478800 -14400 0 AST} + {2909368800 -10800 1 ADT} + {2929928400 -14400 0 AST} + {2940818400 -10800 1 ADT} + {2961378000 -14400 0 AST} + {2972268000 -10800 1 ADT} + {2992827600 -14400 0 AST} + {3003717600 -10800 1 ADT} + {3024277200 -14400 0 AST} + {3035772000 -10800 1 ADT} + {3056331600 -14400 0 AST} + {3067221600 -10800 1 ADT} + {3087781200 -14400 0 AST} + {3098671200 -10800 1 ADT} + {3119230800 -14400 0 AST} + {3130120800 -10800 1 ADT} + {3150680400 -14400 0 AST} + {3161570400 -10800 1 ADT} + {3182130000 -14400 0 AST} + {3193020000 -10800 1 ADT} + {3213579600 -14400 0 AST} + {3225074400 -10800 1 ADT} + {3245634000 -14400 0 AST} + {3256524000 -10800 1 ADT} + {3277083600 -14400 0 AST} + {3287973600 -10800 1 ADT} + {3308533200 -14400 0 AST} + {3319423200 -10800 1 ADT} + {3339982800 -14400 0 AST} + {3350872800 -10800 1 ADT} + {3371432400 -14400 0 AST} + {3382927200 -10800 1 ADT} + {3403486800 -14400 0 AST} + {3414376800 -10800 1 ADT} + {3434936400 -14400 0 AST} + {3445826400 -10800 1 ADT} + {3466386000 -14400 0 AST} + {3477276000 -10800 1 ADT} + {3497835600 -14400 0 AST} + {3508725600 -10800 1 ADT} + {3529285200 -14400 0 AST} + {3540175200 -10800 1 ADT} + {3560734800 -14400 0 AST} + {3572229600 -10800 1 ADT} + {3592789200 -14400 0 AST} + {3603679200 -10800 1 ADT} + {3624238800 -14400 0 AST} + {3635128800 -10800 1 ADT} + {3655688400 -14400 0 AST} + {3666578400 -10800 1 ADT} + {3687138000 -14400 0 AST} + {3698028000 -10800 1 ADT} + {3718587600 -14400 0 AST} + {3730082400 -10800 1 ADT} + {3750642000 -14400 0 AST} + {3761532000 -10800 1 ADT} + {3782091600 -14400 0 AST} + {3792981600 -10800 1 ADT} + {3813541200 -14400 0 AST} + {3824431200 -10800 1 ADT} + {3844990800 -14400 0 AST} + {3855880800 -10800 1 ADT} + {3876440400 -14400 0 AST} + {3887330400 -10800 1 ADT} + {3907890000 -14400 0 AST} + {3919384800 -10800 1 ADT} + {3939944400 -14400 0 AST} + {3950834400 -10800 1 ADT} + {3971394000 -14400 0 AST} + {3982284000 -10800 1 ADT} + {4002843600 -14400 0 AST} + {4013733600 -10800 1 ADT} + {4034293200 -14400 0 AST} + {4045183200 -10800 1 ADT} + {4065742800 -14400 0 AST} + {4076632800 -10800 1 ADT} + {4097192400 -14400 0 AST} +} diff --git a/env/tcl/tcl8.6/tzdata/America/Godthab b/env/tcl/tcl8.6/tzdata/America/Godthab new file mode 100644 index 0000000..3e45f87 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/America/Godthab @@ -0,0 +1,246 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:America/Godthab) { + {-9223372036854775808 -12416 0 LMT} + {-1686083584 -10800 0 -03} + {323845200 -7200 0 -02} + {338950800 -10800 0 -03} + {354675600 -7200 1 -02} + {370400400 -10800 0 -03} + {386125200 -7200 1 -02} + {401850000 -10800 0 -03} + {417574800 -7200 1 -02} + {433299600 -10800 0 -03} + {449024400 -7200 1 -02} + {465354000 -10800 0 -03} + {481078800 -7200 1 -02} + {496803600 -10800 0 -03} + {512528400 -7200 1 -02} + {528253200 -10800 0 -03} + {543978000 -7200 1 -02} + {559702800 -10800 0 -03} + {575427600 -7200 1 -02} + {591152400 -10800 0 -03} + {606877200 -7200 1 -02} + {622602000 -10800 0 -03} + {638326800 -7200 1 -02} + {654656400 -10800 0 -03} + {670381200 -7200 1 -02} + {686106000 -10800 0 -03} + {701830800 -7200 1 -02} + {717555600 -10800 0 -03} + {733280400 -7200 1 -02} + {749005200 -10800 0 -03} + {764730000 -7200 1 -02} + {780454800 -10800 0 -03} + {796179600 -7200 1 -02} + {811904400 -10800 0 -03} + {828234000 -7200 1 -02} + {846378000 -10800 0 -03} + {859683600 -7200 1 -02} + {877827600 -10800 0 -03} + {891133200 -7200 1 -02} + {909277200 -10800 0 -03} + {922582800 -7200 1 -02} + {941331600 -10800 0 -03} + {954032400 -7200 1 -02} + {972781200 -10800 0 -03} + {985482000 -7200 1 -02} + {1004230800 -10800 0 -03} + {1017536400 -7200 1 -02} + {1035680400 -10800 0 -03} + {1048986000 -7200 1 -02} + {1067130000 -10800 0 -03} + {1080435600 -7200 1 -02} + {1099184400 -10800 0 -03} + {1111885200 -7200 1 -02} + {1130634000 -10800 0 -03} + {1143334800 -7200 1 -02} + {1162083600 -10800 0 -03} + {1174784400 -7200 1 -02} + {1193533200 -10800 0 -03} + {1206838800 -7200 1 -02} + {1224982800 -10800 0 -03} + {1238288400 -7200 1 -02} + {1256432400 -10800 0 -03} + {1269738000 -7200 1 -02} + {1288486800 -10800 0 -03} + {1301187600 -7200 1 -02} + {1319936400 -10800 0 -03} + {1332637200 -7200 1 -02} + {1351386000 -10800 0 -03} + {1364691600 -7200 1 -02} + {1382835600 -10800 0 -03} + {1396141200 -7200 1 -02} + {1414285200 -10800 0 -03} + {1427590800 -7200 1 -02} + {1445734800 -10800 0 -03} + {1459040400 -7200 1 -02} + {1477789200 -10800 0 -03} + {1490490000 -7200 1 -02} + {1509238800 -10800 0 -03} + {1521939600 -7200 1 -02} + {1540688400 -10800 0 -03} + {1553994000 -7200 1 -02} + {1572138000 -10800 0 -03} + {1585443600 -7200 1 -02} + {1603587600 -10800 0 -03} + {1616893200 -7200 1 -02} + {1635642000 -10800 0 -03} + {1648342800 -7200 1 -02} + {1667091600 -10800 0 -03} + {1679792400 -7200 1 -02} + {1698541200 -10800 0 -03} + {1711846800 -7200 1 -02} + {1729990800 -10800 0 -03} + {1743296400 -7200 1 -02} + {1761440400 -10800 0 -03} + {1774746000 -7200 1 -02} + {1792890000 -10800 0 -03} + {1806195600 -7200 1 -02} + {1824944400 -10800 0 -03} + {1837645200 -7200 1 -02} + {1856394000 -10800 0 -03} + {1869094800 -7200 1 -02} + {1887843600 -10800 0 -03} + {1901149200 -7200 1 -02} + {1919293200 -10800 0 -03} + {1932598800 -7200 1 -02} + {1950742800 -10800 0 -03} + {1964048400 -7200 1 -02} + {1982797200 -10800 0 -03} + {1995498000 -7200 1 -02} + {2014246800 -10800 0 -03} + {2026947600 -7200 1 -02} + {2045696400 -10800 0 -03} + {2058397200 -7200 1 -02} + {2077146000 -10800 0 -03} + {2090451600 -7200 1 -02} + {2108595600 -10800 0 -03} + {2121901200 -7200 1 -02} + {2140045200 -10800 0 -03} + {2153350800 -7200 1 -02} + {2172099600 -10800 0 -03} + {2184800400 -7200 1 -02} + {2203549200 -10800 0 -03} + {2216250000 -7200 1 -02} + {2234998800 -10800 0 -03} + {2248304400 -7200 1 -02} + {2266448400 -10800 0 -03} + {2279754000 -7200 1 -02} + {2297898000 -10800 0 -03} + {2311203600 -7200 1 -02} + {2329347600 -10800 0 -03} + {2342653200 -7200 1 -02} + {2361402000 -10800 0 -03} + {2374102800 -7200 1 -02} + {2392851600 -10800 0 -03} + {2405552400 -7200 1 -02} + {2424301200 -10800 0 -03} + {2437606800 -7200 1 -02} + {2455750800 -10800 0 -03} + {2469056400 -7200 1 -02} + {2487200400 -10800 0 -03} + {2500506000 -7200 1 -02} + {2519254800 -10800 0 -03} + {2531955600 -7200 1 -02} + {2550704400 -10800 0 -03} + {2563405200 -7200 1 -02} + {2582154000 -10800 0 -03} + {2595459600 -7200 1 -02} + {2613603600 -10800 0 -03} + {2626909200 -7200 1 -02} + {2645053200 -10800 0 -03} + {2658358800 -7200 1 -02} + {2676502800 -10800 0 -03} + {2689808400 -7200 1 -02} + {2708557200 -10800 0 -03} + {2721258000 -7200 1 -02} + {2740006800 -10800 0 -03} + {2752707600 -7200 1 -02} + {2771456400 -10800 0 -03} + {2784762000 -7200 1 -02} + {2802906000 -10800 0 -03} + {2816211600 -7200 1 -02} + {2834355600 -10800 0 -03} + {2847661200 -7200 1 -02} + {2866410000 -10800 0 -03} + {2879110800 -7200 1 -02} + {2897859600 -10800 0 -03} + {2910560400 -7200 1 -02} + {2929309200 -10800 0 -03} + {2942010000 -7200 1 -02} + {2960758800 -10800 0 -03} + {2974064400 -7200 1 -02} + {2992208400 -10800 0 -03} + {3005514000 -7200 1 -02} + {3023658000 -10800 0 -03} + {3036963600 -7200 1 -02} + {3055712400 -10800 0 -03} + {3068413200 -7200 1 -02} + {3087162000 -10800 0 -03} + {3099862800 -7200 1 -02} + {3118611600 -10800 0 -03} + {3131917200 -7200 1 -02} + {3150061200 -10800 0 -03} + {3163366800 -7200 1 -02} + {3181510800 -10800 0 -03} + {3194816400 -7200 1 -02} + {3212960400 -10800 0 -03} + {3226266000 -7200 1 -02} + {3245014800 -10800 0 -03} + {3257715600 -7200 1 -02} + {3276464400 -10800 0 -03} + {3289165200 -7200 1 -02} + {3307914000 -10800 0 -03} + {3321219600 -7200 1 -02} + {3339363600 -10800 0 -03} + {3352669200 -7200 1 -02} + {3370813200 -10800 0 -03} + {3384118800 -7200 1 -02} + {3402867600 -10800 0 -03} + {3415568400 -7200 1 -02} + {3434317200 -10800 0 -03} + {3447018000 -7200 1 -02} + {3465766800 -10800 0 -03} + {3479072400 -7200 1 -02} + {3497216400 -10800 0 -03} + {3510522000 -7200 1 -02} + {3528666000 -10800 0 -03} + {3541971600 -7200 1 -02} + {3560115600 -10800 0 -03} + {3573421200 -7200 1 -02} + {3592170000 -10800 0 -03} + {3604870800 -7200 1 -02} + {3623619600 -10800 0 -03} + {3636320400 -7200 1 -02} + {3655069200 -10800 0 -03} + {3668374800 -7200 1 -02} + {3686518800 -10800 0 -03} + {3699824400 -7200 1 -02} + {3717968400 -10800 0 -03} + {3731274000 -7200 1 -02} + {3750022800 -10800 0 -03} + {3762723600 -7200 1 -02} + {3781472400 -10800 0 -03} + {3794173200 -7200 1 -02} + {3812922000 -10800 0 -03} + {3825622800 -7200 1 -02} + {3844371600 -10800 0 -03} + {3857677200 -7200 1 -02} + {3875821200 -10800 0 -03} + {3889126800 -7200 1 -02} + {3907270800 -10800 0 -03} + {3920576400 -7200 1 -02} + {3939325200 -10800 0 -03} + {3952026000 -7200 1 -02} + {3970774800 -10800 0 -03} + {3983475600 -7200 1 -02} + {4002224400 -10800 0 -03} + {4015530000 -7200 1 -02} + {4033674000 -10800 0 -03} + {4046979600 -7200 1 -02} + {4065123600 -10800 0 -03} + {4078429200 -7200 1 -02} + {4096573200 -10800 0 -03} +} diff --git a/env/tcl/tcl8.6/tzdata/America/Goose_Bay b/env/tcl/tcl8.6/tzdata/America/Goose_Bay new file mode 100644 index 0000000..7b7b3d8 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/America/Goose_Bay @@ -0,0 +1,338 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:America/Goose_Bay) { + {-9223372036854775808 -14500 0 LMT} + {-2713895900 -12652 0 NST} + {-1640982548 -12652 0 NST} + {-1632076148 -9052 1 NDT} + {-1615145348 -12652 0 NST} + {-1609446548 -12652 0 NST} + {-1096921748 -12600 0 NST} + {-1072989000 -12600 0 NST} + {-1061670600 -9000 1 NDT} + {-1048973400 -12600 0 NST} + {-1030221000 -9000 1 NDT} + {-1017523800 -12600 0 NST} + {-998771400 -9000 1 NDT} + {-986074200 -12600 0 NST} + {-966717000 -9000 1 NDT} + {-954624600 -12600 0 NST} + {-935267400 -9000 1 NDT} + {-922570200 -12600 0 NST} + {-903817800 -9000 1 NDT} + {-891120600 -12600 0 NST} + {-872368200 -9000 0 NWT} + {-769395600 -9000 1 NPT} + {-765401400 -12600 0 NST} + {-757369800 -12600 0 NST} + {-746044200 -9000 1 NDT} + {-733347000 -12600 0 NST} + {-714594600 -9000 1 NDT} + {-701897400 -12600 0 NST} + {-683145000 -9000 1 NDT} + {-670447800 -12600 0 NST} + {-651695400 -9000 1 NDT} + {-638998200 -12600 0 NST} + {-619641000 -9000 1 NDT} + {-606943800 -12600 0 NST} + {-589401000 -9000 1 NDT} + {-576099000 -12600 0 NST} + {-557951400 -9000 1 NDT} + {-544649400 -12600 0 NST} + {-526501800 -9000 1 NDT} + {-513199800 -12600 0 NST} + {-495052200 -9000 1 NDT} + {-481750200 -12600 0 NST} + {-463602600 -9000 1 NDT} + {-450300600 -12600 0 NST} + {-431548200 -9000 1 NDT} + {-418246200 -12600 0 NST} + {-400098600 -9000 1 NDT} + {-386796600 -12600 0 NST} + {-368649000 -9000 1 NDT} + {-355347000 -12600 0 NST} + {-337199400 -9000 1 NDT} + {-323897400 -12600 0 NST} + {-305749800 -9000 1 NDT} + {-289423800 -12600 0 NST} + {-273695400 -9000 1 NDT} + {-257974200 -12600 0 NST} + {-242245800 -9000 1 NDT} + {-226524600 -12600 0 NST} + {-210796200 -9000 1 NDT} + {-195075000 -12600 0 NST} + {-179346600 -9000 1 NDT} + {-163625400 -12600 0 NST} + {-147897000 -9000 1 NDT} + {-131571000 -12600 0 NST} + {-119903400 -14400 0 AST} + {-116445600 -10800 1 ADT} + {-100119600 -14400 0 AST} + {-84391200 -10800 1 ADT} + {-68670000 -14400 0 AST} + {-52941600 -10800 1 ADT} + {-37220400 -14400 0 AST} + {-21492000 -10800 1 ADT} + {-5770800 -14400 0 AST} + {9957600 -10800 1 ADT} + {25678800 -14400 0 AST} + {41407200 -10800 1 ADT} + {57733200 -14400 0 AST} + {73461600 -10800 1 ADT} + {89182800 -14400 0 AST} + {104911200 -10800 1 ADT} + {120632400 -14400 0 AST} + {136360800 -10800 1 ADT} + {152082000 -14400 0 AST} + {167810400 -10800 1 ADT} + {183531600 -14400 0 AST} + {199260000 -10800 1 ADT} + {215586000 -14400 0 AST} + {230709600 -10800 1 ADT} + {247035600 -14400 0 AST} + {262764000 -10800 1 ADT} + {278485200 -14400 0 AST} + {294213600 -10800 1 ADT} + {309934800 -14400 0 AST} + {325663200 -10800 1 ADT} + {341384400 -14400 0 AST} + {357112800 -10800 1 ADT} + {372834000 -14400 0 AST} + {388562400 -10800 1 ADT} + {404888400 -14400 0 AST} + {420012000 -10800 1 ADT} + {436338000 -14400 0 AST} + {452066400 -10800 1 ADT} + {467787600 -14400 0 AST} + {483516000 -10800 1 ADT} + {499237200 -14400 0 AST} + {514965600 -10800 1 ADT} + {530686800 -14400 0 AST} + {544593660 -10800 1 ADT} + {562129260 -14400 0 AST} + {576043260 -7200 1 ADDT} + {594180060 -14400 0 AST} + {607492860 -10800 1 ADT} + {625633260 -14400 0 AST} + {638942460 -10800 1 ADT} + {657082860 -14400 0 AST} + {670996860 -10800 1 ADT} + {688532460 -14400 0 AST} + {702446460 -10800 1 ADT} + {719982060 -14400 0 AST} + {733896060 -10800 1 ADT} + {752036460 -14400 0 AST} + {765345660 -10800 1 ADT} + {783486060 -14400 0 AST} + {796795260 -10800 1 ADT} + {814935660 -14400 0 AST} + {828849660 -10800 1 ADT} + {846385260 -14400 0 AST} + {860299260 -10800 1 ADT} + {877834860 -14400 0 AST} + {891748860 -10800 1 ADT} + {909284460 -14400 0 AST} + {923198460 -10800 1 ADT} + {941338860 -14400 0 AST} + {954648060 -10800 1 ADT} + {972788460 -14400 0 AST} + {986097660 -10800 1 ADT} + {1004238060 -14400 0 AST} + {1018152060 -10800 1 ADT} + {1035687660 -14400 0 AST} + {1049601660 -10800 1 ADT} + {1067137260 -14400 0 AST} + {1081051260 -10800 1 ADT} + {1099191660 -14400 0 AST} + {1112500860 -10800 1 ADT} + {1130641260 -14400 0 AST} + {1143950460 -10800 1 ADT} + {1162090860 -14400 0 AST} + {1173585660 -10800 1 ADT} + {1194145260 -14400 0 AST} + {1205035260 -10800 1 ADT} + {1225594860 -14400 0 AST} + {1236484860 -10800 1 ADT} + {1257044460 -14400 0 AST} + {1268539260 -10800 1 ADT} + {1289098860 -14400 0 AST} + {1299988860 -10800 1 ADT} + {1320116400 -10800 0 ADT} + {1320555600 -14400 0 AST} + {1331445600 -10800 1 ADT} + {1352005200 -14400 0 AST} + {1362895200 -10800 1 ADT} + {1383454800 -14400 0 AST} + {1394344800 -10800 1 ADT} + {1414904400 -14400 0 AST} + {1425794400 -10800 1 ADT} + {1446354000 -14400 0 AST} + {1457848800 -10800 1 ADT} + {1478408400 -14400 0 AST} + {1489298400 -10800 1 ADT} + {1509858000 -14400 0 AST} + {1520748000 -10800 1 ADT} + {1541307600 -14400 0 AST} + {1552197600 -10800 1 ADT} + {1572757200 -14400 0 AST} + {1583647200 -10800 1 ADT} + {1604206800 -14400 0 AST} + {1615701600 -10800 1 ADT} + {1636261200 -14400 0 AST} + {1647151200 -10800 1 ADT} + {1667710800 -14400 0 AST} + {1678600800 -10800 1 ADT} + {1699160400 -14400 0 AST} + {1710050400 -10800 1 ADT} + {1730610000 -14400 0 AST} + {1741500000 -10800 1 ADT} + {1762059600 -14400 0 AST} + {1772949600 -10800 1 ADT} + {1793509200 -14400 0 AST} + {1805004000 -10800 1 ADT} + {1825563600 -14400 0 AST} + {1836453600 -10800 1 ADT} + {1857013200 -14400 0 AST} + {1867903200 -10800 1 ADT} + {1888462800 -14400 0 AST} + {1899352800 -10800 1 ADT} + {1919912400 -14400 0 AST} + {1930802400 -10800 1 ADT} + {1951362000 -14400 0 AST} + {1962856800 -10800 1 ADT} + {1983416400 -14400 0 AST} + {1994306400 -10800 1 ADT} + {2014866000 -14400 0 AST} + {2025756000 -10800 1 ADT} + {2046315600 -14400 0 AST} + {2057205600 -10800 1 ADT} + {2077765200 -14400 0 AST} + {2088655200 -10800 1 ADT} + {2109214800 -14400 0 AST} + {2120104800 -10800 1 ADT} + {2140664400 -14400 0 AST} + {2152159200 -10800 1 ADT} + {2172718800 -14400 0 AST} + {2183608800 -10800 1 ADT} + {2204168400 -14400 0 AST} + {2215058400 -10800 1 ADT} + {2235618000 -14400 0 AST} + {2246508000 -10800 1 ADT} + {2267067600 -14400 0 AST} + {2277957600 -10800 1 ADT} + {2298517200 -14400 0 AST} + {2309407200 -10800 1 ADT} + {2329966800 -14400 0 AST} + {2341461600 -10800 1 ADT} + {2362021200 -14400 0 AST} + {2372911200 -10800 1 ADT} + {2393470800 -14400 0 AST} + {2404360800 -10800 1 ADT} + {2424920400 -14400 0 AST} + {2435810400 -10800 1 ADT} + {2456370000 -14400 0 AST} + {2467260000 -10800 1 ADT} + {2487819600 -14400 0 AST} + {2499314400 -10800 1 ADT} + {2519874000 -14400 0 AST} + {2530764000 -10800 1 ADT} + {2551323600 -14400 0 AST} + {2562213600 -10800 1 ADT} + {2582773200 -14400 0 AST} + {2593663200 -10800 1 ADT} + {2614222800 -14400 0 AST} + {2625112800 -10800 1 ADT} + {2645672400 -14400 0 AST} + {2656562400 -10800 1 ADT} + {2677122000 -14400 0 AST} + {2688616800 -10800 1 ADT} + {2709176400 -14400 0 AST} + {2720066400 -10800 1 ADT} + {2740626000 -14400 0 AST} + {2751516000 -10800 1 ADT} + {2772075600 -14400 0 AST} + {2782965600 -10800 1 ADT} + {2803525200 -14400 0 AST} + {2814415200 -10800 1 ADT} + {2834974800 -14400 0 AST} + {2846469600 -10800 1 ADT} + {2867029200 -14400 0 AST} + {2877919200 -10800 1 ADT} + {2898478800 -14400 0 AST} + {2909368800 -10800 1 ADT} + {2929928400 -14400 0 AST} + {2940818400 -10800 1 ADT} + {2961378000 -14400 0 AST} + {2972268000 -10800 1 ADT} + {2992827600 -14400 0 AST} + {3003717600 -10800 1 ADT} + {3024277200 -14400 0 AST} + {3035772000 -10800 1 ADT} + {3056331600 -14400 0 AST} + {3067221600 -10800 1 ADT} + {3087781200 -14400 0 AST} + {3098671200 -10800 1 ADT} + {3119230800 -14400 0 AST} + {3130120800 -10800 1 ADT} + {3150680400 -14400 0 AST} + {3161570400 -10800 1 ADT} + {3182130000 -14400 0 AST} + {3193020000 -10800 1 ADT} + {3213579600 -14400 0 AST} + {3225074400 -10800 1 ADT} + {3245634000 -14400 0 AST} + {3256524000 -10800 1 ADT} + {3277083600 -14400 0 AST} + {3287973600 -10800 1 ADT} + {3308533200 -14400 0 AST} + {3319423200 -10800 1 ADT} + {3339982800 -14400 0 AST} + {3350872800 -10800 1 ADT} + {3371432400 -14400 0 AST} + {3382927200 -10800 1 ADT} + {3403486800 -14400 0 AST} + {3414376800 -10800 1 ADT} + {3434936400 -14400 0 AST} + {3445826400 -10800 1 ADT} + {3466386000 -14400 0 AST} + {3477276000 -10800 1 ADT} + {3497835600 -14400 0 AST} + {3508725600 -10800 1 ADT} + {3529285200 -14400 0 AST} + {3540175200 -10800 1 ADT} + {3560734800 -14400 0 AST} + {3572229600 -10800 1 ADT} + {3592789200 -14400 0 AST} + {3603679200 -10800 1 ADT} + {3624238800 -14400 0 AST} + {3635128800 -10800 1 ADT} + {3655688400 -14400 0 AST} + {3666578400 -10800 1 ADT} + {3687138000 -14400 0 AST} + {3698028000 -10800 1 ADT} + {3718587600 -14400 0 AST} + {3730082400 -10800 1 ADT} + {3750642000 -14400 0 AST} + {3761532000 -10800 1 ADT} + {3782091600 -14400 0 AST} + {3792981600 -10800 1 ADT} + {3813541200 -14400 0 AST} + {3824431200 -10800 1 ADT} + {3844990800 -14400 0 AST} + {3855880800 -10800 1 ADT} + {3876440400 -14400 0 AST} + {3887330400 -10800 1 ADT} + {3907890000 -14400 0 AST} + {3919384800 -10800 1 ADT} + {3939944400 -14400 0 AST} + {3950834400 -10800 1 ADT} + {3971394000 -14400 0 AST} + {3982284000 -10800 1 ADT} + {4002843600 -14400 0 AST} + {4013733600 -10800 1 ADT} + {4034293200 -14400 0 AST} + {4045183200 -10800 1 ADT} + {4065742800 -14400 0 AST} + {4076632800 -10800 1 ADT} + {4097192400 -14400 0 AST} +} diff --git a/env/tcl/tcl8.6/tzdata/America/Grand_Turk b/env/tcl/tcl8.6/tzdata/America/Grand_Turk new file mode 100644 index 0000000..da5f09b --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/America/Grand_Turk @@ -0,0 +1,246 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:America/Grand_Turk) { + {-9223372036854775808 -17072 0 LMT} + {-2524504528 -18430 0 KMT} + {-1827687170 -18000 0 EST} + {284014800 -18000 0 EST} + {294217200 -14400 1 EDT} + {309938400 -18000 0 EST} + {325666800 -14400 1 EDT} + {341388000 -18000 0 EST} + {357116400 -14400 1 EDT} + {372837600 -18000 0 EST} + {388566000 -14400 1 EDT} + {404892000 -18000 0 EST} + {420015600 -14400 1 EDT} + {436341600 -18000 0 EST} + {452070000 -14400 1 EDT} + {467791200 -18000 0 EST} + {483519600 -14400 1 EDT} + {499240800 -18000 0 EST} + {514969200 -14400 1 EDT} + {530690400 -18000 0 EST} + {544604400 -14400 1 EDT} + {562140000 -18000 0 EST} + {576054000 -14400 1 EDT} + {594194400 -18000 0 EST} + {607503600 -14400 1 EDT} + {625644000 -18000 0 EST} + {638953200 -14400 1 EDT} + {657093600 -18000 0 EST} + {671007600 -14400 1 EDT} + {688543200 -18000 0 EST} + {702457200 -14400 1 EDT} + {719992800 -18000 0 EST} + {733906800 -14400 1 EDT} + {752047200 -18000 0 EST} + {765356400 -14400 1 EDT} + {783496800 -18000 0 EST} + {796806000 -14400 1 EDT} + {814946400 -18000 0 EST} + {828860400 -14400 1 EDT} + {846396000 -18000 0 EST} + {860310000 -14400 1 EDT} + {877845600 -18000 0 EST} + {891759600 -14400 1 EDT} + {909295200 -18000 0 EST} + {923209200 -14400 1 EDT} + {941349600 -18000 0 EST} + {954658800 -14400 1 EDT} + {972799200 -18000 0 EST} + {986108400 -14400 1 EDT} + {1004248800 -18000 0 EST} + {1018162800 -14400 1 EDT} + {1035698400 -18000 0 EST} + {1049612400 -14400 1 EDT} + {1067148000 -18000 0 EST} + {1081062000 -14400 1 EDT} + {1099202400 -18000 0 EST} + {1112511600 -14400 1 EDT} + {1130652000 -18000 0 EST} + {1143961200 -14400 1 EDT} + {1162101600 -18000 0 EST} + {1173596400 -14400 1 EDT} + {1194156000 -18000 0 EST} + {1205046000 -14400 1 EDT} + {1225605600 -18000 0 EST} + {1236495600 -14400 1 EDT} + {1257055200 -18000 0 EST} + {1268550000 -14400 1 EDT} + {1289109600 -18000 0 EST} + {1299999600 -14400 1 EDT} + {1320559200 -18000 0 EST} + {1331449200 -14400 1 EDT} + {1352008800 -18000 0 EST} + {1362898800 -14400 1 EDT} + {1383458400 -18000 0 EST} + {1394348400 -14400 1 EDT} + {1414908000 -18000 0 EST} + {1425798000 -14400 1 EDT} + {1446361200 -14400 0 AST} + {1520751600 -14400 0 EDT} + {1541311200 -18000 0 EST} + {1552201200 -14400 1 EDT} + {1572760800 -18000 0 EST} + {1583650800 -14400 1 EDT} + {1604210400 -18000 0 EST} + {1615705200 -14400 1 EDT} + {1636264800 -18000 0 EST} + {1647154800 -14400 1 EDT} + {1667714400 -18000 0 EST} + {1678604400 -14400 1 EDT} + {1699164000 -18000 0 EST} + {1710054000 -14400 1 EDT} + {1730613600 -18000 0 EST} + {1741503600 -14400 1 EDT} + {1762063200 -18000 0 EST} + {1772953200 -14400 1 EDT} + {1793512800 -18000 0 EST} + {1805007600 -14400 1 EDT} + {1825567200 -18000 0 EST} + {1836457200 -14400 1 EDT} + {1857016800 -18000 0 EST} + {1867906800 -14400 1 EDT} + {1888466400 -18000 0 EST} + {1899356400 -14400 1 EDT} + {1919916000 -18000 0 EST} + {1930806000 -14400 1 EDT} + {1951365600 -18000 0 EST} + {1962860400 -14400 1 EDT} + {1983420000 -18000 0 EST} + {1994310000 -14400 1 EDT} + {2014869600 -18000 0 EST} + {2025759600 -14400 1 EDT} + {2046319200 -18000 0 EST} + {2057209200 -14400 1 EDT} + {2077768800 -18000 0 EST} + {2088658800 -14400 1 EDT} + {2109218400 -18000 0 EST} + {2120108400 -14400 1 EDT} + {2140668000 -18000 0 EST} + {2152162800 -14400 1 EDT} + {2172722400 -18000 0 EST} + {2183612400 -14400 1 EDT} + {2204172000 -18000 0 EST} + {2215062000 -14400 1 EDT} + {2235621600 -18000 0 EST} + {2246511600 -14400 1 EDT} + {2267071200 -18000 0 EST} + {2277961200 -14400 1 EDT} + {2298520800 -18000 0 EST} + {2309410800 -14400 1 EDT} + {2329970400 -18000 0 EST} + {2341465200 -14400 1 EDT} + {2362024800 -18000 0 EST} + {2372914800 -14400 1 EDT} + {2393474400 -18000 0 EST} + {2404364400 -14400 1 EDT} + {2424924000 -18000 0 EST} + {2435814000 -14400 1 EDT} + {2456373600 -18000 0 EST} + {2467263600 -14400 1 EDT} + {2487823200 -18000 0 EST} + {2499318000 -14400 1 EDT} + {2519877600 -18000 0 EST} + {2530767600 -14400 1 EDT} + {2551327200 -18000 0 EST} + {2562217200 -14400 1 EDT} + {2582776800 -18000 0 EST} + {2593666800 -14400 1 EDT} + {2614226400 -18000 0 EST} + {2625116400 -14400 1 EDT} + {2645676000 -18000 0 EST} + {2656566000 -14400 1 EDT} + {2677125600 -18000 0 EST} + {2688620400 -14400 1 EDT} + {2709180000 -18000 0 EST} + {2720070000 -14400 1 EDT} + {2740629600 -18000 0 EST} + {2751519600 -14400 1 EDT} + {2772079200 -18000 0 EST} + {2782969200 -14400 1 EDT} + {2803528800 -18000 0 EST} + {2814418800 -14400 1 EDT} + {2834978400 -18000 0 EST} + {2846473200 -14400 1 EDT} + {2867032800 -18000 0 EST} + {2877922800 -14400 1 EDT} + {2898482400 -18000 0 EST} + {2909372400 -14400 1 EDT} + {2929932000 -18000 0 EST} + {2940822000 -14400 1 EDT} + {2961381600 -18000 0 EST} + {2972271600 -14400 1 EDT} + {2992831200 -18000 0 EST} + {3003721200 -14400 1 EDT} + {3024280800 -18000 0 EST} + {3035775600 -14400 1 EDT} + {3056335200 -18000 0 EST} + {3067225200 -14400 1 EDT} + {3087784800 -18000 0 EST} + {3098674800 -14400 1 EDT} + {3119234400 -18000 0 EST} + {3130124400 -14400 1 EDT} + {3150684000 -18000 0 EST} + {3161574000 -14400 1 EDT} + {3182133600 -18000 0 EST} + {3193023600 -14400 1 EDT} + {3213583200 -18000 0 EST} + {3225078000 -14400 1 EDT} + {3245637600 -18000 0 EST} + {3256527600 -14400 1 EDT} + {3277087200 -18000 0 EST} + {3287977200 -14400 1 EDT} + {3308536800 -18000 0 EST} + {3319426800 -14400 1 EDT} + {3339986400 -18000 0 EST} + {3350876400 -14400 1 EDT} + {3371436000 -18000 0 EST} + {3382930800 -14400 1 EDT} + {3403490400 -18000 0 EST} + {3414380400 -14400 1 EDT} + {3434940000 -18000 0 EST} + {3445830000 -14400 1 EDT} + {3466389600 -18000 0 EST} + {3477279600 -14400 1 EDT} + {3497839200 -18000 0 EST} + {3508729200 -14400 1 EDT} + {3529288800 -18000 0 EST} + {3540178800 -14400 1 EDT} + {3560738400 -18000 0 EST} + {3572233200 -14400 1 EDT} + {3592792800 -18000 0 EST} + {3603682800 -14400 1 EDT} + {3624242400 -18000 0 EST} + {3635132400 -14400 1 EDT} + {3655692000 -18000 0 EST} + {3666582000 -14400 1 EDT} + {3687141600 -18000 0 EST} + {3698031600 -14400 1 EDT} + {3718591200 -18000 0 EST} + {3730086000 -14400 1 EDT} + {3750645600 -18000 0 EST} + {3761535600 -14400 1 EDT} + {3782095200 -18000 0 EST} + {3792985200 -14400 1 EDT} + {3813544800 -18000 0 EST} + {3824434800 -14400 1 EDT} + {3844994400 -18000 0 EST} + {3855884400 -14400 1 EDT} + {3876444000 -18000 0 EST} + {3887334000 -14400 1 EDT} + {3907893600 -18000 0 EST} + {3919388400 -14400 1 EDT} + {3939948000 -18000 0 EST} + {3950838000 -14400 1 EDT} + {3971397600 -18000 0 EST} + {3982287600 -14400 1 EDT} + {4002847200 -18000 0 EST} + {4013737200 -14400 1 EDT} + {4034296800 -18000 0 EST} + {4045186800 -14400 1 EDT} + {4065746400 -18000 0 EST} + {4076636400 -14400 1 EDT} + {4097196000 -18000 0 EST} +} diff --git a/env/tcl/tcl8.6/tzdata/America/Grenada b/env/tcl/tcl8.6/tzdata/America/Grenada new file mode 100644 index 0000000..92300c3 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/America/Grenada @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(America/Port_of_Spain)]} { + LoadTimeZoneFile America/Port_of_Spain +} +set TZData(:America/Grenada) $TZData(:America/Port_of_Spain) diff --git a/env/tcl/tcl8.6/tzdata/America/Guadeloupe b/env/tcl/tcl8.6/tzdata/America/Guadeloupe new file mode 100644 index 0000000..aba6bd7 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/America/Guadeloupe @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(America/Port_of_Spain)]} { + LoadTimeZoneFile America/Port_of_Spain +} +set TZData(:America/Guadeloupe) $TZData(:America/Port_of_Spain) diff --git a/env/tcl/tcl8.6/tzdata/America/Guatemala b/env/tcl/tcl8.6/tzdata/America/Guatemala new file mode 100644 index 0000000..e4db5ac --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/America/Guatemala @@ -0,0 +1,14 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:America/Guatemala) { + {-9223372036854775808 -21724 0 LMT} + {-1617040676 -21600 0 CST} + {123055200 -18000 1 CDT} + {130914000 -21600 0 CST} + {422344800 -18000 1 CDT} + {433054800 -21600 0 CST} + {669708000 -18000 1 CDT} + {684219600 -21600 0 CST} + {1146376800 -18000 1 CDT} + {1159678800 -21600 0 CST} +} diff --git a/env/tcl/tcl8.6/tzdata/America/Guayaquil b/env/tcl/tcl8.6/tzdata/America/Guayaquil new file mode 100644 index 0000000..6ba7b93 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/America/Guayaquil @@ -0,0 +1,9 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:America/Guayaquil) { + {-9223372036854775808 -19160 0 LMT} + {-2524502440 -18840 0 QMT} + {-1230749160 -18000 0 -05} + {722926800 -14400 1 -05} + {728884800 -18000 0 -05} +} diff --git a/env/tcl/tcl8.6/tzdata/America/Guyana b/env/tcl/tcl8.6/tzdata/America/Guyana new file mode 100644 index 0000000..fab7855 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/America/Guyana @@ -0,0 +1,8 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:America/Guyana) { + {-9223372036854775808 -13960 0 LMT} + {-1730578040 -13500 0 -0345} + {176010300 -10800 0 -03} + {662698800 -14400 0 -04} +} diff --git a/env/tcl/tcl8.6/tzdata/America/Halifax b/env/tcl/tcl8.6/tzdata/America/Halifax new file mode 100644 index 0000000..08e3754 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/America/Halifax @@ -0,0 +1,361 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:America/Halifax) { + {-9223372036854775808 -15264 0 LMT} + {-2131645536 -14400 0 AST} + {-1696276800 -10800 1 ADT} + {-1680469200 -14400 0 AST} + {-1640980800 -14400 0 AST} + {-1632074400 -10800 1 ADT} + {-1615143600 -14400 0 AST} + {-1609444800 -14400 0 AST} + {-1566763200 -10800 1 ADT} + {-1557090000 -14400 0 AST} + {-1535486400 -10800 1 ADT} + {-1524949200 -14400 0 AST} + {-1504468800 -10800 1 ADT} + {-1493413200 -14400 0 AST} + {-1472414400 -10800 1 ADT} + {-1461963600 -14400 0 AST} + {-1440964800 -10800 1 ADT} + {-1429390800 -14400 0 AST} + {-1409515200 -10800 1 ADT} + {-1396731600 -14400 0 AST} + {-1376856000 -10800 1 ADT} + {-1366491600 -14400 0 AST} + {-1346616000 -10800 1 ADT} + {-1333832400 -14400 0 AST} + {-1313956800 -10800 1 ADT} + {-1303678800 -14400 0 AST} + {-1282507200 -10800 1 ADT} + {-1272661200 -14400 0 AST} + {-1251057600 -10800 1 ADT} + {-1240088400 -14400 0 AST} + {-1219608000 -10800 1 ADT} + {-1207429200 -14400 0 AST} + {-1188763200 -10800 1 ADT} + {-1175979600 -14400 0 AST} + {-1157313600 -10800 1 ADT} + {-1143925200 -14400 0 AST} + {-1124049600 -10800 1 ADT} + {-1113771600 -14400 0 AST} + {-1091390400 -10800 1 ADT} + {-1081026000 -14400 0 AST} + {-1059854400 -10800 1 ADT} + {-1050786000 -14400 0 AST} + {-1030910400 -10800 1 ADT} + {-1018126800 -14400 0 AST} + {-999460800 -10800 1 ADT} + {-986677200 -14400 0 AST} + {-965592000 -10800 1 ADT} + {-955227600 -14400 0 AST} + {-935956800 -10800 1 ADT} + {-923173200 -14400 0 AST} + {-904507200 -10800 1 ADT} + {-891723600 -14400 0 AST} + {-880221600 -10800 0 AWT} + {-769395600 -10800 1 APT} + {-765399600 -14400 0 AST} + {-757368000 -14400 0 AST} + {-747252000 -10800 1 ADT} + {-733950000 -14400 0 AST} + {-715802400 -10800 1 ADT} + {-702500400 -14400 0 AST} + {-684352800 -10800 1 ADT} + {-671050800 -14400 0 AST} + {-652903200 -10800 1 ADT} + {-639601200 -14400 0 AST} + {-589399200 -10800 1 ADT} + {-576097200 -14400 0 AST} + {-557949600 -10800 1 ADT} + {-544647600 -14400 0 AST} + {-526500000 -10800 1 ADT} + {-513198000 -14400 0 AST} + {-495050400 -10800 1 ADT} + {-481748400 -14400 0 AST} + {-431546400 -10800 1 ADT} + {-418244400 -14400 0 AST} + {-400096800 -10800 1 ADT} + {-386794800 -14400 0 AST} + {-368647200 -10800 1 ADT} + {-355345200 -14400 0 AST} + {-337197600 -10800 1 ADT} + {-323895600 -14400 0 AST} + {-242244000 -10800 1 ADT} + {-226522800 -14400 0 AST} + {-210794400 -10800 1 ADT} + {-195073200 -14400 0 AST} + {-179344800 -10800 1 ADT} + {-163623600 -14400 0 AST} + {-147895200 -10800 1 ADT} + {-131569200 -14400 0 AST} + {-116445600 -10800 1 ADT} + {-100119600 -14400 0 AST} + {-84391200 -10800 1 ADT} + {-68670000 -14400 0 AST} + {-52941600 -10800 1 ADT} + {-37220400 -14400 0 AST} + {-21492000 -10800 1 ADT} + {-5770800 -14400 0 AST} + {9957600 -10800 1 ADT} + {25678800 -14400 0 AST} + {41407200 -10800 1 ADT} + {57733200 -14400 0 AST} + {73461600 -10800 1 ADT} + {89182800 -14400 0 AST} + {104911200 -10800 1 ADT} + {120632400 -14400 0 AST} + {126244800 -14400 0 AST} + {136360800 -10800 1 ADT} + {152082000 -14400 0 AST} + {167810400 -10800 1 ADT} + {183531600 -14400 0 AST} + {199260000 -10800 1 ADT} + {215586000 -14400 0 AST} + {230709600 -10800 1 ADT} + {247035600 -14400 0 AST} + {262764000 -10800 1 ADT} + {278485200 -14400 0 AST} + {294213600 -10800 1 ADT} + {309934800 -14400 0 AST} + {325663200 -10800 1 ADT} + {341384400 -14400 0 AST} + {357112800 -10800 1 ADT} + {372834000 -14400 0 AST} + {388562400 -10800 1 ADT} + {404888400 -14400 0 AST} + {420012000 -10800 1 ADT} + {436338000 -14400 0 AST} + {452066400 -10800 1 ADT} + {467787600 -14400 0 AST} + {483516000 -10800 1 ADT} + {499237200 -14400 0 AST} + {514965600 -10800 1 ADT} + {530686800 -14400 0 AST} + {544600800 -10800 1 ADT} + {562136400 -14400 0 AST} + {576050400 -10800 1 ADT} + {594190800 -14400 0 AST} + {607500000 -10800 1 ADT} + {625640400 -14400 0 AST} + {638949600 -10800 1 ADT} + {657090000 -14400 0 AST} + {671004000 -10800 1 ADT} + {688539600 -14400 0 AST} + {702453600 -10800 1 ADT} + {719989200 -14400 0 AST} + {733903200 -10800 1 ADT} + {752043600 -14400 0 AST} + {765352800 -10800 1 ADT} + {783493200 -14400 0 AST} + {796802400 -10800 1 ADT} + {814942800 -14400 0 AST} + {828856800 -10800 1 ADT} + {846392400 -14400 0 AST} + {860306400 -10800 1 ADT} + {877842000 -14400 0 AST} + {891756000 -10800 1 ADT} + {909291600 -14400 0 AST} + {923205600 -10800 1 ADT} + {941346000 -14400 0 AST} + {954655200 -10800 1 ADT} + {972795600 -14400 0 AST} + {986104800 -10800 1 ADT} + {1004245200 -14400 0 AST} + {1018159200 -10800 1 ADT} + {1035694800 -14400 0 AST} + {1049608800 -10800 1 ADT} + {1067144400 -14400 0 AST} + {1081058400 -10800 1 ADT} + {1099198800 -14400 0 AST} + {1112508000 -10800 1 ADT} + {1130648400 -14400 0 AST} + {1143957600 -10800 1 ADT} + {1162098000 -14400 0 AST} + {1173592800 -10800 1 ADT} + {1194152400 -14400 0 AST} + {1205042400 -10800 1 ADT} + {1225602000 -14400 0 AST} + {1236492000 -10800 1 ADT} + {1257051600 -14400 0 AST} + {1268546400 -10800 1 ADT} + {1289106000 -14400 0 AST} + {1299996000 -10800 1 ADT} + {1320555600 -14400 0 AST} + {1331445600 -10800 1 ADT} + {1352005200 -14400 0 AST} + {1362895200 -10800 1 ADT} + {1383454800 -14400 0 AST} + {1394344800 -10800 1 ADT} + {1414904400 -14400 0 AST} + {1425794400 -10800 1 ADT} + {1446354000 -14400 0 AST} + {1457848800 -10800 1 ADT} + {1478408400 -14400 0 AST} + {1489298400 -10800 1 ADT} + {1509858000 -14400 0 AST} + {1520748000 -10800 1 ADT} + {1541307600 -14400 0 AST} + {1552197600 -10800 1 ADT} + {1572757200 -14400 0 AST} + {1583647200 -10800 1 ADT} + {1604206800 -14400 0 AST} + {1615701600 -10800 1 ADT} + {1636261200 -14400 0 AST} + {1647151200 -10800 1 ADT} + {1667710800 -14400 0 AST} + {1678600800 -10800 1 ADT} + {1699160400 -14400 0 AST} + {1710050400 -10800 1 ADT} + {1730610000 -14400 0 AST} + {1741500000 -10800 1 ADT} + {1762059600 -14400 0 AST} + {1772949600 -10800 1 ADT} + {1793509200 -14400 0 AST} + {1805004000 -10800 1 ADT} + {1825563600 -14400 0 AST} + {1836453600 -10800 1 ADT} + {1857013200 -14400 0 AST} + {1867903200 -10800 1 ADT} + {1888462800 -14400 0 AST} + {1899352800 -10800 1 ADT} + {1919912400 -14400 0 AST} + {1930802400 -10800 1 ADT} + {1951362000 -14400 0 AST} + {1962856800 -10800 1 ADT} + {1983416400 -14400 0 AST} + {1994306400 -10800 1 ADT} + {2014866000 -14400 0 AST} + {2025756000 -10800 1 ADT} + {2046315600 -14400 0 AST} + {2057205600 -10800 1 ADT} + {2077765200 -14400 0 AST} + {2088655200 -10800 1 ADT} + {2109214800 -14400 0 AST} + {2120104800 -10800 1 ADT} + {2140664400 -14400 0 AST} + {2152159200 -10800 1 ADT} + {2172718800 -14400 0 AST} + {2183608800 -10800 1 ADT} + {2204168400 -14400 0 AST} + {2215058400 -10800 1 ADT} + {2235618000 -14400 0 AST} + {2246508000 -10800 1 ADT} + {2267067600 -14400 0 AST} + {2277957600 -10800 1 ADT} + {2298517200 -14400 0 AST} + {2309407200 -10800 1 ADT} + {2329966800 -14400 0 AST} + {2341461600 -10800 1 ADT} + {2362021200 -14400 0 AST} + {2372911200 -10800 1 ADT} + {2393470800 -14400 0 AST} + {2404360800 -10800 1 ADT} + {2424920400 -14400 0 AST} + {2435810400 -10800 1 ADT} + {2456370000 -14400 0 AST} + {2467260000 -10800 1 ADT} + {2487819600 -14400 0 AST} + {2499314400 -10800 1 ADT} + {2519874000 -14400 0 AST} + {2530764000 -10800 1 ADT} + {2551323600 -14400 0 AST} + {2562213600 -10800 1 ADT} + {2582773200 -14400 0 AST} + {2593663200 -10800 1 ADT} + {2614222800 -14400 0 AST} + {2625112800 -10800 1 ADT} + {2645672400 -14400 0 AST} + {2656562400 -10800 1 ADT} + {2677122000 -14400 0 AST} + {2688616800 -10800 1 ADT} + {2709176400 -14400 0 AST} + {2720066400 -10800 1 ADT} + {2740626000 -14400 0 AST} + {2751516000 -10800 1 ADT} + {2772075600 -14400 0 AST} + {2782965600 -10800 1 ADT} + {2803525200 -14400 0 AST} + {2814415200 -10800 1 ADT} + {2834974800 -14400 0 AST} + {2846469600 -10800 1 ADT} + {2867029200 -14400 0 AST} + {2877919200 -10800 1 ADT} + {2898478800 -14400 0 AST} + {2909368800 -10800 1 ADT} + {2929928400 -14400 0 AST} + {2940818400 -10800 1 ADT} + {2961378000 -14400 0 AST} + {2972268000 -10800 1 ADT} + {2992827600 -14400 0 AST} + {3003717600 -10800 1 ADT} + {3024277200 -14400 0 AST} + {3035772000 -10800 1 ADT} + {3056331600 -14400 0 AST} + {3067221600 -10800 1 ADT} + {3087781200 -14400 0 AST} + {3098671200 -10800 1 ADT} + {3119230800 -14400 0 AST} + {3130120800 -10800 1 ADT} + {3150680400 -14400 0 AST} + {3161570400 -10800 1 ADT} + {3182130000 -14400 0 AST} + {3193020000 -10800 1 ADT} + {3213579600 -14400 0 AST} + {3225074400 -10800 1 ADT} + {3245634000 -14400 0 AST} + {3256524000 -10800 1 ADT} + {3277083600 -14400 0 AST} + {3287973600 -10800 1 ADT} + {3308533200 -14400 0 AST} + {3319423200 -10800 1 ADT} + {3339982800 -14400 0 AST} + {3350872800 -10800 1 ADT} + {3371432400 -14400 0 AST} + {3382927200 -10800 1 ADT} + {3403486800 -14400 0 AST} + {3414376800 -10800 1 ADT} + {3434936400 -14400 0 AST} + {3445826400 -10800 1 ADT} + {3466386000 -14400 0 AST} + {3477276000 -10800 1 ADT} + {3497835600 -14400 0 AST} + {3508725600 -10800 1 ADT} + {3529285200 -14400 0 AST} + {3540175200 -10800 1 ADT} + {3560734800 -14400 0 AST} + {3572229600 -10800 1 ADT} + {3592789200 -14400 0 AST} + {3603679200 -10800 1 ADT} + {3624238800 -14400 0 AST} + {3635128800 -10800 1 ADT} + {3655688400 -14400 0 AST} + {3666578400 -10800 1 ADT} + {3687138000 -14400 0 AST} + {3698028000 -10800 1 ADT} + {3718587600 -14400 0 AST} + {3730082400 -10800 1 ADT} + {3750642000 -14400 0 AST} + {3761532000 -10800 1 ADT} + {3782091600 -14400 0 AST} + {3792981600 -10800 1 ADT} + {3813541200 -14400 0 AST} + {3824431200 -10800 1 ADT} + {3844990800 -14400 0 AST} + {3855880800 -10800 1 ADT} + {3876440400 -14400 0 AST} + {3887330400 -10800 1 ADT} + {3907890000 -14400 0 AST} + {3919384800 -10800 1 ADT} + {3939944400 -14400 0 AST} + {3950834400 -10800 1 ADT} + {3971394000 -14400 0 AST} + {3982284000 -10800 1 ADT} + {4002843600 -14400 0 AST} + {4013733600 -10800 1 ADT} + {4034293200 -14400 0 AST} + {4045183200 -10800 1 ADT} + {4065742800 -14400 0 AST} + {4076632800 -10800 1 ADT} + {4097192400 -14400 0 AST} +} diff --git a/env/tcl/tcl8.6/tzdata/America/Havana b/env/tcl/tcl8.6/tzdata/America/Havana new file mode 100644 index 0000000..5901dae --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/America/Havana @@ -0,0 +1,285 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:America/Havana) { + {-9223372036854775808 -19768 0 LMT} + {-2524501832 -19776 0 HMT} + {-1402813824 -18000 0 CST} + {-1311534000 -14400 1 CDT} + {-1300996800 -18000 0 CST} + {-933534000 -14400 1 CDT} + {-925675200 -18000 0 CST} + {-902084400 -14400 1 CDT} + {-893620800 -18000 0 CST} + {-870030000 -14400 1 CDT} + {-862171200 -18000 0 CST} + {-775681200 -14400 1 CDT} + {-767822400 -18000 0 CST} + {-744231600 -14400 1 CDT} + {-736372800 -18000 0 CST} + {-144702000 -14400 1 CDT} + {-134251200 -18000 0 CST} + {-113425200 -14400 1 CDT} + {-102542400 -18000 0 CST} + {-86295600 -14400 1 CDT} + {-72907200 -18000 0 CST} + {-54154800 -14400 1 CDT} + {-41457600 -18000 0 CST} + {-21495600 -14400 1 CDT} + {-5774400 -18000 0 CST} + {9954000 -14400 1 CDT} + {25675200 -18000 0 CST} + {41403600 -14400 1 CDT} + {57729600 -18000 0 CST} + {73458000 -14400 1 CDT} + {87364800 -18000 0 CST} + {104907600 -14400 1 CDT} + {118900800 -18000 0 CST} + {136357200 -14400 1 CDT} + {150436800 -18000 0 CST} + {167806800 -14400 1 CDT} + {183528000 -18000 0 CST} + {199256400 -14400 1 CDT} + {215582400 -18000 0 CST} + {230706000 -14400 1 CDT} + {247032000 -18000 0 CST} + {263365200 -14400 1 CDT} + {276667200 -18000 0 CST} + {290581200 -14400 1 CDT} + {308721600 -18000 0 CST} + {322030800 -14400 1 CDT} + {340171200 -18000 0 CST} + {358318800 -14400 1 CDT} + {371620800 -18000 0 CST} + {389768400 -14400 1 CDT} + {403070400 -18000 0 CST} + {421218000 -14400 1 CDT} + {434520000 -18000 0 CST} + {452667600 -14400 1 CDT} + {466574400 -18000 0 CST} + {484117200 -14400 1 CDT} + {498024000 -18000 0 CST} + {511333200 -14400 1 CDT} + {529473600 -18000 0 CST} + {542782800 -14400 1 CDT} + {560923200 -18000 0 CST} + {574837200 -14400 1 CDT} + {592372800 -18000 0 CST} + {606286800 -14400 1 CDT} + {623822400 -18000 0 CST} + {638946000 -14400 1 CDT} + {655876800 -18000 0 CST} + {671000400 -14400 1 CDT} + {687330000 -18000 0 CST} + {702450000 -14400 1 CDT} + {718779600 -18000 0 CST} + {733899600 -14400 1 CDT} + {750229200 -18000 0 CST} + {765349200 -14400 1 CDT} + {781678800 -18000 0 CST} + {796798800 -14400 1 CDT} + {813128400 -18000 0 CST} + {828853200 -14400 1 CDT} + {844578000 -18000 0 CST} + {860302800 -14400 1 CDT} + {876632400 -18000 0 CST} + {891147600 -14400 1 CDT} + {909291600 -18000 0 CST} + {922597200 -14400 1 CDT} + {941346000 -18000 0 CST} + {954651600 -14400 1 CDT} + {972795600 -18000 0 CST} + {986101200 -14400 1 CDT} + {1004245200 -18000 0 CST} + {1018155600 -14400 1 CDT} + {1035694800 -18000 0 CST} + {1049605200 -14400 1 CDT} + {1067144400 -18000 0 CST} + {1080450000 -14400 1 CDT} + {1162098000 -18000 0 CST} + {1173589200 -14400 1 CDT} + {1193547600 -18000 0 CST} + {1205643600 -14400 1 CDT} + {1224997200 -18000 0 CST} + {1236488400 -14400 1 CDT} + {1256446800 -18000 0 CST} + {1268542800 -14400 1 CDT} + {1288501200 -18000 0 CST} + {1300597200 -14400 1 CDT} + {1321160400 -18000 0 CST} + {1333256400 -14400 1 CDT} + {1352005200 -18000 0 CST} + {1362891600 -14400 1 CDT} + {1383454800 -18000 0 CST} + {1394341200 -14400 1 CDT} + {1414904400 -18000 0 CST} + {1425790800 -14400 1 CDT} + {1446354000 -18000 0 CST} + {1457845200 -14400 1 CDT} + {1478408400 -18000 0 CST} + {1489294800 -14400 1 CDT} + {1509858000 -18000 0 CST} + {1520744400 -14400 1 CDT} + {1541307600 -18000 0 CST} + {1552194000 -14400 1 CDT} + {1572757200 -18000 0 CST} + {1583643600 -14400 1 CDT} + {1604206800 -18000 0 CST} + {1615698000 -14400 1 CDT} + {1636261200 -18000 0 CST} + {1647147600 -14400 1 CDT} + {1667710800 -18000 0 CST} + {1678597200 -14400 1 CDT} + {1699160400 -18000 0 CST} + {1710046800 -14400 1 CDT} + {1730610000 -18000 0 CST} + {1741496400 -14400 1 CDT} + {1762059600 -18000 0 CST} + {1772946000 -14400 1 CDT} + {1793509200 -18000 0 CST} + {1805000400 -14400 1 CDT} + {1825563600 -18000 0 CST} + {1836450000 -14400 1 CDT} + {1857013200 -18000 0 CST} + {1867899600 -14400 1 CDT} + {1888462800 -18000 0 CST} + {1899349200 -14400 1 CDT} + {1919912400 -18000 0 CST} + {1930798800 -14400 1 CDT} + {1951362000 -18000 0 CST} + {1962853200 -14400 1 CDT} + {1983416400 -18000 0 CST} + {1994302800 -14400 1 CDT} + {2014866000 -18000 0 CST} + {2025752400 -14400 1 CDT} + {2046315600 -18000 0 CST} + {2057202000 -14400 1 CDT} + {2077765200 -18000 0 CST} + {2088651600 -14400 1 CDT} + {2109214800 -18000 0 CST} + {2120101200 -14400 1 CDT} + {2140664400 -18000 0 CST} + {2152155600 -14400 1 CDT} + {2172718800 -18000 0 CST} + {2183605200 -14400 1 CDT} + {2204168400 -18000 0 CST} + {2215054800 -14400 1 CDT} + {2235618000 -18000 0 CST} + {2246504400 -14400 1 CDT} + {2267067600 -18000 0 CST} + {2277954000 -14400 1 CDT} + {2298517200 -18000 0 CST} + {2309403600 -14400 1 CDT} + {2329966800 -18000 0 CST} + {2341458000 -14400 1 CDT} + {2362021200 -18000 0 CST} + {2372907600 -14400 1 CDT} + {2393470800 -18000 0 CST} + {2404357200 -14400 1 CDT} + {2424920400 -18000 0 CST} + {2435806800 -14400 1 CDT} + {2456370000 -18000 0 CST} + {2467256400 -14400 1 CDT} + {2487819600 -18000 0 CST} + {2499310800 -14400 1 CDT} + {2519874000 -18000 0 CST} + {2530760400 -14400 1 CDT} + {2551323600 -18000 0 CST} + {2562210000 -14400 1 CDT} + {2582773200 -18000 0 CST} + {2593659600 -14400 1 CDT} + {2614222800 -18000 0 CST} + {2625109200 -14400 1 CDT} + {2645672400 -18000 0 CST} + {2656558800 -14400 1 CDT} + {2677122000 -18000 0 CST} + {2688613200 -14400 1 CDT} + {2709176400 -18000 0 CST} + {2720062800 -14400 1 CDT} + {2740626000 -18000 0 CST} + {2751512400 -14400 1 CDT} + {2772075600 -18000 0 CST} + {2782962000 -14400 1 CDT} + {2803525200 -18000 0 CST} + {2814411600 -14400 1 CDT} + {2834974800 -18000 0 CST} + {2846466000 -14400 1 CDT} + {2867029200 -18000 0 CST} + {2877915600 -14400 1 CDT} + {2898478800 -18000 0 CST} + {2909365200 -14400 1 CDT} + {2929928400 -18000 0 CST} + {2940814800 -14400 1 CDT} + {2961378000 -18000 0 CST} + {2972264400 -14400 1 CDT} + {2992827600 -18000 0 CST} + {3003714000 -14400 1 CDT} + {3024277200 -18000 0 CST} + {3035768400 -14400 1 CDT} + {3056331600 -18000 0 CST} + {3067218000 -14400 1 CDT} + {3087781200 -18000 0 CST} + {3098667600 -14400 1 CDT} + {3119230800 -18000 0 CST} + {3130117200 -14400 1 CDT} + {3150680400 -18000 0 CST} + {3161566800 -14400 1 CDT} + {3182130000 -18000 0 CST} + {3193016400 -14400 1 CDT} + {3213579600 -18000 0 CST} + {3225070800 -14400 1 CDT} + {3245634000 -18000 0 CST} + {3256520400 -14400 1 CDT} + {3277083600 -18000 0 CST} + {3287970000 -14400 1 CDT} + {3308533200 -18000 0 CST} + {3319419600 -14400 1 CDT} + {3339982800 -18000 0 CST} + {3350869200 -14400 1 CDT} + {3371432400 -18000 0 CST} + {3382923600 -14400 1 CDT} + {3403486800 -18000 0 CST} + {3414373200 -14400 1 CDT} + {3434936400 -18000 0 CST} + {3445822800 -14400 1 CDT} + {3466386000 -18000 0 CST} + {3477272400 -14400 1 CDT} + {3497835600 -18000 0 CST} + {3508722000 -14400 1 CDT} + {3529285200 -18000 0 CST} + {3540171600 -14400 1 CDT} + {3560734800 -18000 0 CST} + {3572226000 -14400 1 CDT} + {3592789200 -18000 0 CST} + {3603675600 -14400 1 CDT} + {3624238800 -18000 0 CST} + {3635125200 -14400 1 CDT} + {3655688400 -18000 0 CST} + {3666574800 -14400 1 CDT} + {3687138000 -18000 0 CST} + {3698024400 -14400 1 CDT} + {3718587600 -18000 0 CST} + {3730078800 -14400 1 CDT} + {3750642000 -18000 0 CST} + {3761528400 -14400 1 CDT} + {3782091600 -18000 0 CST} + {3792978000 -14400 1 CDT} + {3813541200 -18000 0 CST} + {3824427600 -14400 1 CDT} + {3844990800 -18000 0 CST} + {3855877200 -14400 1 CDT} + {3876440400 -18000 0 CST} + {3887326800 -14400 1 CDT} + {3907890000 -18000 0 CST} + {3919381200 -14400 1 CDT} + {3939944400 -18000 0 CST} + {3950830800 -14400 1 CDT} + {3971394000 -18000 0 CST} + {3982280400 -14400 1 CDT} + {4002843600 -18000 0 CST} + {4013730000 -14400 1 CDT} + {4034293200 -18000 0 CST} + {4045179600 -14400 1 CDT} + {4065742800 -18000 0 CST} + {4076629200 -14400 1 CDT} + {4097192400 -18000 0 CST} +} diff --git a/env/tcl/tcl8.6/tzdata/America/Hermosillo b/env/tcl/tcl8.6/tzdata/America/Hermosillo new file mode 100644 index 0000000..779020e --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/America/Hermosillo @@ -0,0 +1,21 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:America/Hermosillo) { + {-9223372036854775808 -26632 0 LMT} + {-1514739600 -25200 0 MST} + {-1343066400 -21600 0 CST} + {-1234807200 -25200 0 MST} + {-1220292000 -21600 0 CST} + {-1207159200 -25200 0 MST} + {-1191344400 -21600 0 CST} + {-873828000 -25200 0 MST} + {-661539600 -28800 0 PST} + {28800 -25200 0 MST} + {828867600 -21600 1 MDT} + {846403200 -25200 0 MST} + {860317200 -21600 1 MDT} + {877852800 -25200 0 MST} + {891766800 -21600 1 MDT} + {909302400 -25200 0 MST} + {915174000 -25200 0 MST} +} diff --git a/env/tcl/tcl8.6/tzdata/America/Indiana/Indianapolis b/env/tcl/tcl8.6/tzdata/America/Indiana/Indianapolis new file mode 100644 index 0000000..63c410c --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/America/Indiana/Indianapolis @@ -0,0 +1,234 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:America/Indiana/Indianapolis) { + {-9223372036854775808 -20678 0 LMT} + {-2717647200 -21600 0 CST} + {-1633276800 -18000 1 CDT} + {-1615136400 -21600 0 CST} + {-1601827200 -18000 1 CDT} + {-1583686800 -21600 0 CST} + {-1577901600 -21600 0 CST} + {-900259200 -18000 1 CDT} + {-891795600 -21600 0 CST} + {-883591200 -21600 0 CST} + {-880214400 -18000 1 CWT} + {-769395600 -18000 1 CPT} + {-765392400 -21600 0 CST} + {-757360800 -21600 0 CST} + {-747244800 -18000 1 CDT} + {-733942800 -21600 0 CST} + {-715795200 -18000 1 CDT} + {-702493200 -21600 0 CST} + {-684345600 -18000 1 CDT} + {-671043600 -21600 0 CST} + {-652896000 -18000 1 CDT} + {-639594000 -21600 0 CST} + {-620841600 -18000 1 CDT} + {-608144400 -21600 0 CST} + {-589392000 -18000 1 CDT} + {-576090000 -21600 0 CST} + {-557942400 -18000 1 CDT} + {-544640400 -21600 0 CST} + {-526492800 -18000 1 CDT} + {-513190800 -21600 0 CST} + {-495043200 -18000 1 CDT} + {-481741200 -21600 0 CST} + {-463593600 -18000 0 EST} + {-386787600 -21600 0 CST} + {-368640000 -18000 0 EST} + {-31518000 -18000 0 EST} + {-21488400 -14400 1 EDT} + {-5767200 -18000 0 EST} + {9961200 -14400 1 EDT} + {25682400 -18000 0 EST} + {31554000 -18000 0 EST} + {1136091600 -18000 0 EST} + {1143961200 -14400 1 EDT} + {1162101600 -18000 0 EST} + {1173596400 -14400 1 EDT} + {1194156000 -18000 0 EST} + {1205046000 -14400 1 EDT} + {1225605600 -18000 0 EST} + {1236495600 -14400 1 EDT} + {1257055200 -18000 0 EST} + {1268550000 -14400 1 EDT} + {1289109600 -18000 0 EST} + {1299999600 -14400 1 EDT} + {1320559200 -18000 0 EST} + {1331449200 -14400 1 EDT} + {1352008800 -18000 0 EST} + {1362898800 -14400 1 EDT} + {1383458400 -18000 0 EST} + {1394348400 -14400 1 EDT} + {1414908000 -18000 0 EST} + {1425798000 -14400 1 EDT} + {1446357600 -18000 0 EST} + {1457852400 -14400 1 EDT} + {1478412000 -18000 0 EST} + {1489302000 -14400 1 EDT} + {1509861600 -18000 0 EST} + {1520751600 -14400 1 EDT} + {1541311200 -18000 0 EST} + {1552201200 -14400 1 EDT} + {1572760800 -18000 0 EST} + {1583650800 -14400 1 EDT} + {1604210400 -18000 0 EST} + {1615705200 -14400 1 EDT} + {1636264800 -18000 0 EST} + {1647154800 -14400 1 EDT} + {1667714400 -18000 0 EST} + {1678604400 -14400 1 EDT} + {1699164000 -18000 0 EST} + {1710054000 -14400 1 EDT} + {1730613600 -18000 0 EST} + {1741503600 -14400 1 EDT} + {1762063200 -18000 0 EST} + {1772953200 -14400 1 EDT} + {1793512800 -18000 0 EST} + {1805007600 -14400 1 EDT} + {1825567200 -18000 0 EST} + {1836457200 -14400 1 EDT} + {1857016800 -18000 0 EST} + {1867906800 -14400 1 EDT} + {1888466400 -18000 0 EST} + {1899356400 -14400 1 EDT} + {1919916000 -18000 0 EST} + {1930806000 -14400 1 EDT} + {1951365600 -18000 0 EST} + {1962860400 -14400 1 EDT} + {1983420000 -18000 0 EST} + {1994310000 -14400 1 EDT} + {2014869600 -18000 0 EST} + {2025759600 -14400 1 EDT} + {2046319200 -18000 0 EST} + {2057209200 -14400 1 EDT} + {2077768800 -18000 0 EST} + {2088658800 -14400 1 EDT} + {2109218400 -18000 0 EST} + {2120108400 -14400 1 EDT} + {2140668000 -18000 0 EST} + {2152162800 -14400 1 EDT} + {2172722400 -18000 0 EST} + {2183612400 -14400 1 EDT} + {2204172000 -18000 0 EST} + {2215062000 -14400 1 EDT} + {2235621600 -18000 0 EST} + {2246511600 -14400 1 EDT} + {2267071200 -18000 0 EST} + {2277961200 -14400 1 EDT} + {2298520800 -18000 0 EST} + {2309410800 -14400 1 EDT} + {2329970400 -18000 0 EST} + {2341465200 -14400 1 EDT} + {2362024800 -18000 0 EST} + {2372914800 -14400 1 EDT} + {2393474400 -18000 0 EST} + {2404364400 -14400 1 EDT} + {2424924000 -18000 0 EST} + {2435814000 -14400 1 EDT} + {2456373600 -18000 0 EST} + {2467263600 -14400 1 EDT} + {2487823200 -18000 0 EST} + {2499318000 -14400 1 EDT} + {2519877600 -18000 0 EST} + {2530767600 -14400 1 EDT} + {2551327200 -18000 0 EST} + {2562217200 -14400 1 EDT} + {2582776800 -18000 0 EST} + {2593666800 -14400 1 EDT} + {2614226400 -18000 0 EST} + {2625116400 -14400 1 EDT} + {2645676000 -18000 0 EST} + {2656566000 -14400 1 EDT} + {2677125600 -18000 0 EST} + {2688620400 -14400 1 EDT} + {2709180000 -18000 0 EST} + {2720070000 -14400 1 EDT} + {2740629600 -18000 0 EST} + {2751519600 -14400 1 EDT} + {2772079200 -18000 0 EST} + {2782969200 -14400 1 EDT} + {2803528800 -18000 0 EST} + {2814418800 -14400 1 EDT} + {2834978400 -18000 0 EST} + {2846473200 -14400 1 EDT} + {2867032800 -18000 0 EST} + {2877922800 -14400 1 EDT} + {2898482400 -18000 0 EST} + {2909372400 -14400 1 EDT} + {2929932000 -18000 0 EST} + {2940822000 -14400 1 EDT} + {2961381600 -18000 0 EST} + {2972271600 -14400 1 EDT} + {2992831200 -18000 0 EST} + {3003721200 -14400 1 EDT} + {3024280800 -18000 0 EST} + {3035775600 -14400 1 EDT} + {3056335200 -18000 0 EST} + {3067225200 -14400 1 EDT} + {3087784800 -18000 0 EST} + {3098674800 -14400 1 EDT} + {3119234400 -18000 0 EST} + {3130124400 -14400 1 EDT} + {3150684000 -18000 0 EST} + {3161574000 -14400 1 EDT} + {3182133600 -18000 0 EST} + {3193023600 -14400 1 EDT} + {3213583200 -18000 0 EST} + {3225078000 -14400 1 EDT} + {3245637600 -18000 0 EST} + {3256527600 -14400 1 EDT} + {3277087200 -18000 0 EST} + {3287977200 -14400 1 EDT} + {3308536800 -18000 0 EST} + {3319426800 -14400 1 EDT} + {3339986400 -18000 0 EST} + {3350876400 -14400 1 EDT} + {3371436000 -18000 0 EST} + {3382930800 -14400 1 EDT} + {3403490400 -18000 0 EST} + {3414380400 -14400 1 EDT} + {3434940000 -18000 0 EST} + {3445830000 -14400 1 EDT} + {3466389600 -18000 0 EST} + {3477279600 -14400 1 EDT} + {3497839200 -18000 0 EST} + {3508729200 -14400 1 EDT} + {3529288800 -18000 0 EST} + {3540178800 -14400 1 EDT} + {3560738400 -18000 0 EST} + {3572233200 -14400 1 EDT} + {3592792800 -18000 0 EST} + {3603682800 -14400 1 EDT} + {3624242400 -18000 0 EST} + {3635132400 -14400 1 EDT} + {3655692000 -18000 0 EST} + {3666582000 -14400 1 EDT} + {3687141600 -18000 0 EST} + {3698031600 -14400 1 EDT} + {3718591200 -18000 0 EST} + {3730086000 -14400 1 EDT} + {3750645600 -18000 0 EST} + {3761535600 -14400 1 EDT} + {3782095200 -18000 0 EST} + {3792985200 -14400 1 EDT} + {3813544800 -18000 0 EST} + {3824434800 -14400 1 EDT} + {3844994400 -18000 0 EST} + {3855884400 -14400 1 EDT} + {3876444000 -18000 0 EST} + {3887334000 -14400 1 EDT} + {3907893600 -18000 0 EST} + {3919388400 -14400 1 EDT} + {3939948000 -18000 0 EST} + {3950838000 -14400 1 EDT} + {3971397600 -18000 0 EST} + {3982287600 -14400 1 EDT} + {4002847200 -18000 0 EST} + {4013737200 -14400 1 EDT} + {4034296800 -18000 0 EST} + {4045186800 -14400 1 EDT} + {4065746400 -18000 0 EST} + {4076636400 -14400 1 EDT} + {4097196000 -18000 0 EST} +} diff --git a/env/tcl/tcl8.6/tzdata/America/Indiana/Knox b/env/tcl/tcl8.6/tzdata/America/Indiana/Knox new file mode 100644 index 0000000..eee3ff4 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/America/Indiana/Knox @@ -0,0 +1,285 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:America/Indiana/Knox) { + {-9223372036854775808 -20790 0 LMT} + {-2717647200 -21600 0 CST} + {-1633276800 -18000 1 CDT} + {-1615136400 -21600 0 CST} + {-1601827200 -18000 1 CDT} + {-1583686800 -21600 0 CST} + {-880214400 -18000 1 CWT} + {-769395600 -18000 1 CPT} + {-765392400 -21600 0 CST} + {-725824800 -21600 0 CST} + {-715795200 -18000 1 CDT} + {-702493200 -21600 0 CST} + {-684345600 -18000 1 CDT} + {-671043600 -21600 0 CST} + {-652896000 -18000 1 CDT} + {-639594000 -21600 0 CST} + {-620841600 -18000 1 CDT} + {-608144400 -21600 0 CST} + {-589392000 -18000 1 CDT} + {-576090000 -21600 0 CST} + {-557942400 -18000 1 CDT} + {-544640400 -21600 0 CST} + {-526492800 -18000 1 CDT} + {-513190800 -21600 0 CST} + {-495043200 -18000 1 CDT} + {-481741200 -21600 0 CST} + {-463593600 -18000 1 CDT} + {-447267600 -21600 0 CST} + {-431539200 -18000 1 CDT} + {-415818000 -21600 0 CST} + {-400089600 -18000 1 CDT} + {-386787600 -21600 0 CST} + {-368640000 -18000 1 CDT} + {-355338000 -21600 0 CST} + {-337190400 -18000 1 CDT} + {-321469200 -21600 0 CST} + {-305740800 -18000 1 CDT} + {-289414800 -21600 0 CST} + {-273686400 -18000 1 CDT} + {-257965200 -21600 0 CST} + {-242236800 -18000 0 EST} + {-195066000 -21600 0 CST} + {-84384000 -18000 1 CDT} + {-68662800 -21600 0 CST} + {-52934400 -18000 1 CDT} + {-37213200 -21600 0 CST} + {-21484800 -18000 1 CDT} + {-5763600 -21600 0 CST} + {9964800 -18000 1 CDT} + {25686000 -21600 0 CST} + {41414400 -18000 1 CDT} + {57740400 -21600 0 CST} + {73468800 -18000 1 CDT} + {89190000 -21600 0 CST} + {104918400 -18000 1 CDT} + {120639600 -21600 0 CST} + {126691200 -18000 1 CDT} + {152089200 -21600 0 CST} + {162374400 -18000 1 CDT} + {183538800 -21600 0 CST} + {199267200 -18000 1 CDT} + {215593200 -21600 0 CST} + {230716800 -18000 1 CDT} + {247042800 -21600 0 CST} + {262771200 -18000 1 CDT} + {278492400 -21600 0 CST} + {294220800 -18000 1 CDT} + {309942000 -21600 0 CST} + {325670400 -18000 1 CDT} + {341391600 -21600 0 CST} + {357120000 -18000 1 CDT} + {372841200 -21600 0 CST} + {388569600 -18000 1 CDT} + {404895600 -21600 0 CST} + {420019200 -18000 1 CDT} + {436345200 -21600 0 CST} + {452073600 -18000 1 CDT} + {467794800 -21600 0 CST} + {483523200 -18000 1 CDT} + {499244400 -21600 0 CST} + {514972800 -18000 1 CDT} + {530694000 -21600 0 CST} + {544608000 -18000 1 CDT} + {562143600 -21600 0 CST} + {576057600 -18000 1 CDT} + {594198000 -21600 0 CST} + {607507200 -18000 1 CDT} + {625647600 -21600 0 CST} + {638956800 -18000 1 CDT} + {657097200 -21600 0 CST} + {671011200 -18000 1 CDT} + {688550400 -18000 0 EST} + {1143961200 -21600 0 CST} + {1143964800 -18000 1 CDT} + {1162105200 -21600 0 CST} + {1173600000 -18000 1 CDT} + {1194159600 -21600 0 CST} + {1205049600 -18000 1 CDT} + {1225609200 -21600 0 CST} + {1236499200 -18000 1 CDT} + {1257058800 -21600 0 CST} + {1268553600 -18000 1 CDT} + {1289113200 -21600 0 CST} + {1300003200 -18000 1 CDT} + {1320562800 -21600 0 CST} + {1331452800 -18000 1 CDT} + {1352012400 -21600 0 CST} + {1362902400 -18000 1 CDT} + {1383462000 -21600 0 CST} + {1394352000 -18000 1 CDT} + {1414911600 -21600 0 CST} + {1425801600 -18000 1 CDT} + {1446361200 -21600 0 CST} + {1457856000 -18000 1 CDT} + {1478415600 -21600 0 CST} + {1489305600 -18000 1 CDT} + {1509865200 -21600 0 CST} + {1520755200 -18000 1 CDT} + {1541314800 -21600 0 CST} + {1552204800 -18000 1 CDT} + {1572764400 -21600 0 CST} + {1583654400 -18000 1 CDT} + {1604214000 -21600 0 CST} + {1615708800 -18000 1 CDT} + {1636268400 -21600 0 CST} + {1647158400 -18000 1 CDT} + {1667718000 -21600 0 CST} + {1678608000 -18000 1 CDT} + {1699167600 -21600 0 CST} + {1710057600 -18000 1 CDT} + {1730617200 -21600 0 CST} + {1741507200 -18000 1 CDT} + {1762066800 -21600 0 CST} + {1772956800 -18000 1 CDT} + {1793516400 -21600 0 CST} + {1805011200 -18000 1 CDT} + {1825570800 -21600 0 CST} + {1836460800 -18000 1 CDT} + {1857020400 -21600 0 CST} + {1867910400 -18000 1 CDT} + {1888470000 -21600 0 CST} + {1899360000 -18000 1 CDT} + {1919919600 -21600 0 CST} + {1930809600 -18000 1 CDT} + {1951369200 -21600 0 CST} + {1962864000 -18000 1 CDT} + {1983423600 -21600 0 CST} + {1994313600 -18000 1 CDT} + {2014873200 -21600 0 CST} + {2025763200 -18000 1 CDT} + {2046322800 -21600 0 CST} + {2057212800 -18000 1 CDT} + {2077772400 -21600 0 CST} + {2088662400 -18000 1 CDT} + {2109222000 -21600 0 CST} + {2120112000 -18000 1 CDT} + {2140671600 -21600 0 CST} + {2152166400 -18000 1 CDT} + {2172726000 -21600 0 CST} + {2183616000 -18000 1 CDT} + {2204175600 -21600 0 CST} + {2215065600 -18000 1 CDT} + {2235625200 -21600 0 CST} + {2246515200 -18000 1 CDT} + {2267074800 -21600 0 CST} + {2277964800 -18000 1 CDT} + {2298524400 -21600 0 CST} + {2309414400 -18000 1 CDT} + {2329974000 -21600 0 CST} + {2341468800 -18000 1 CDT} + {2362028400 -21600 0 CST} + {2372918400 -18000 1 CDT} + {2393478000 -21600 0 CST} + {2404368000 -18000 1 CDT} + {2424927600 -21600 0 CST} + {2435817600 -18000 1 CDT} + {2456377200 -21600 0 CST} + {2467267200 -18000 1 CDT} + {2487826800 -21600 0 CST} + {2499321600 -18000 1 CDT} + {2519881200 -21600 0 CST} + {2530771200 -18000 1 CDT} + {2551330800 -21600 0 CST} + {2562220800 -18000 1 CDT} + {2582780400 -21600 0 CST} + {2593670400 -18000 1 CDT} + {2614230000 -21600 0 CST} + {2625120000 -18000 1 CDT} + {2645679600 -21600 0 CST} + {2656569600 -18000 1 CDT} + {2677129200 -21600 0 CST} + {2688624000 -18000 1 CDT} + {2709183600 -21600 0 CST} + {2720073600 -18000 1 CDT} + {2740633200 -21600 0 CST} + {2751523200 -18000 1 CDT} + {2772082800 -21600 0 CST} + {2782972800 -18000 1 CDT} + {2803532400 -21600 0 CST} + {2814422400 -18000 1 CDT} + {2834982000 -21600 0 CST} + {2846476800 -18000 1 CDT} + {2867036400 -21600 0 CST} + {2877926400 -18000 1 CDT} + {2898486000 -21600 0 CST} + {2909376000 -18000 1 CDT} + {2929935600 -21600 0 CST} + {2940825600 -18000 1 CDT} + {2961385200 -21600 0 CST} + {2972275200 -18000 1 CDT} + {2992834800 -21600 0 CST} + {3003724800 -18000 1 CDT} + {3024284400 -21600 0 CST} + {3035779200 -18000 1 CDT} + {3056338800 -21600 0 CST} + {3067228800 -18000 1 CDT} + {3087788400 -21600 0 CST} + {3098678400 -18000 1 CDT} + {3119238000 -21600 0 CST} + {3130128000 -18000 1 CDT} + {3150687600 -21600 0 CST} + {3161577600 -18000 1 CDT} + {3182137200 -21600 0 CST} + {3193027200 -18000 1 CDT} + {3213586800 -21600 0 CST} + {3225081600 -18000 1 CDT} + {3245641200 -21600 0 CST} + {3256531200 -18000 1 CDT} + {3277090800 -21600 0 CST} + {3287980800 -18000 1 CDT} + {3308540400 -21600 0 CST} + {3319430400 -18000 1 CDT} + {3339990000 -21600 0 CST} + {3350880000 -18000 1 CDT} + {3371439600 -21600 0 CST} + {3382934400 -18000 1 CDT} + {3403494000 -21600 0 CST} + {3414384000 -18000 1 CDT} + {3434943600 -21600 0 CST} + {3445833600 -18000 1 CDT} + {3466393200 -21600 0 CST} + {3477283200 -18000 1 CDT} + {3497842800 -21600 0 CST} + {3508732800 -18000 1 CDT} + {3529292400 -21600 0 CST} + {3540182400 -18000 1 CDT} + {3560742000 -21600 0 CST} + {3572236800 -18000 1 CDT} + {3592796400 -21600 0 CST} + {3603686400 -18000 1 CDT} + {3624246000 -21600 0 CST} + {3635136000 -18000 1 CDT} + {3655695600 -21600 0 CST} + {3666585600 -18000 1 CDT} + {3687145200 -21600 0 CST} + {3698035200 -18000 1 CDT} + {3718594800 -21600 0 CST} + {3730089600 -18000 1 CDT} + {3750649200 -21600 0 CST} + {3761539200 -18000 1 CDT} + {3782098800 -21600 0 CST} + {3792988800 -18000 1 CDT} + {3813548400 -21600 0 CST} + {3824438400 -18000 1 CDT} + {3844998000 -21600 0 CST} + {3855888000 -18000 1 CDT} + {3876447600 -21600 0 CST} + {3887337600 -18000 1 CDT} + {3907897200 -21600 0 CST} + {3919392000 -18000 1 CDT} + {3939951600 -21600 0 CST} + {3950841600 -18000 1 CDT} + {3971401200 -21600 0 CST} + {3982291200 -18000 1 CDT} + {4002850800 -21600 0 CST} + {4013740800 -18000 1 CDT} + {4034300400 -21600 0 CST} + {4045190400 -18000 1 CDT} + {4065750000 -21600 0 CST} + {4076640000 -18000 1 CDT} + {4097199600 -21600 0 CST} +} diff --git a/env/tcl/tcl8.6/tzdata/America/Indiana/Marengo b/env/tcl/tcl8.6/tzdata/America/Indiana/Marengo new file mode 100644 index 0000000..3f1d578 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/America/Indiana/Marengo @@ -0,0 +1,236 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:America/Indiana/Marengo) { + {-9223372036854775808 -20723 0 LMT} + {-2717647200 -21600 0 CST} + {-1633276800 -18000 1 CDT} + {-1615136400 -21600 0 CST} + {-1601827200 -18000 1 CDT} + {-1583686800 -21600 0 CST} + {-880214400 -18000 1 CWT} + {-769395600 -18000 1 CPT} + {-765392400 -21600 0 CST} + {-599594400 -21600 0 CST} + {-589392000 -18000 1 CDT} + {-576090000 -21600 0 CST} + {-495043200 -18000 1 CDT} + {-481741200 -21600 0 CST} + {-463593600 -18000 1 CDT} + {-450291600 -21600 0 CST} + {-431539200 -18000 1 CDT} + {-418237200 -21600 0 CST} + {-400089600 -18000 1 CDT} + {-386787600 -21600 0 CST} + {-368640000 -18000 1 CDT} + {-355338000 -21600 0 CST} + {-337190400 -18000 1 CDT} + {-323888400 -21600 0 CST} + {-305740800 -18000 1 CDT} + {-292438800 -21600 0 CST} + {-273686400 -18000 0 EST} + {-31518000 -18000 0 EST} + {-21488400 -14400 1 EDT} + {-5767200 -18000 0 EST} + {9961200 -14400 1 EDT} + {25682400 -18000 0 EST} + {41410800 -14400 1 EDT} + {57736800 -18000 0 EST} + {73465200 -14400 1 EDT} + {89186400 -18000 0 EST} + {104914800 -14400 1 EDT} + {120636000 -18000 0 EST} + {126687600 -18000 1 CDT} + {152089200 -18000 0 EST} + {162370800 -14400 1 EDT} + {183535200 -18000 0 EST} + {189320400 -18000 0 EST} + {1136091600 -18000 0 EST} + {1143961200 -14400 1 EDT} + {1162101600 -18000 0 EST} + {1173596400 -14400 1 EDT} + {1194156000 -18000 0 EST} + {1205046000 -14400 1 EDT} + {1225605600 -18000 0 EST} + {1236495600 -14400 1 EDT} + {1257055200 -18000 0 EST} + {1268550000 -14400 1 EDT} + {1289109600 -18000 0 EST} + {1299999600 -14400 1 EDT} + {1320559200 -18000 0 EST} + {1331449200 -14400 1 EDT} + {1352008800 -18000 0 EST} + {1362898800 -14400 1 EDT} + {1383458400 -18000 0 EST} + {1394348400 -14400 1 EDT} + {1414908000 -18000 0 EST} + {1425798000 -14400 1 EDT} + {1446357600 -18000 0 EST} + {1457852400 -14400 1 EDT} + {1478412000 -18000 0 EST} + {1489302000 -14400 1 EDT} + {1509861600 -18000 0 EST} + {1520751600 -14400 1 EDT} + {1541311200 -18000 0 EST} + {1552201200 -14400 1 EDT} + {1572760800 -18000 0 EST} + {1583650800 -14400 1 EDT} + {1604210400 -18000 0 EST} + {1615705200 -14400 1 EDT} + {1636264800 -18000 0 EST} + {1647154800 -14400 1 EDT} + {1667714400 -18000 0 EST} + {1678604400 -14400 1 EDT} + {1699164000 -18000 0 EST} + {1710054000 -14400 1 EDT} + {1730613600 -18000 0 EST} + {1741503600 -14400 1 EDT} + {1762063200 -18000 0 EST} + {1772953200 -14400 1 EDT} + {1793512800 -18000 0 EST} + {1805007600 -14400 1 EDT} + {1825567200 -18000 0 EST} + {1836457200 -14400 1 EDT} + {1857016800 -18000 0 EST} + {1867906800 -14400 1 EDT} + {1888466400 -18000 0 EST} + {1899356400 -14400 1 EDT} + {1919916000 -18000 0 EST} + {1930806000 -14400 1 EDT} + {1951365600 -18000 0 EST} + {1962860400 -14400 1 EDT} + {1983420000 -18000 0 EST} + {1994310000 -14400 1 EDT} + {2014869600 -18000 0 EST} + {2025759600 -14400 1 EDT} + {2046319200 -18000 0 EST} + {2057209200 -14400 1 EDT} + {2077768800 -18000 0 EST} + {2088658800 -14400 1 EDT} + {2109218400 -18000 0 EST} + {2120108400 -14400 1 EDT} + {2140668000 -18000 0 EST} + {2152162800 -14400 1 EDT} + {2172722400 -18000 0 EST} + {2183612400 -14400 1 EDT} + {2204172000 -18000 0 EST} + {2215062000 -14400 1 EDT} + {2235621600 -18000 0 EST} + {2246511600 -14400 1 EDT} + {2267071200 -18000 0 EST} + {2277961200 -14400 1 EDT} + {2298520800 -18000 0 EST} + {2309410800 -14400 1 EDT} + {2329970400 -18000 0 EST} + {2341465200 -14400 1 EDT} + {2362024800 -18000 0 EST} + {2372914800 -14400 1 EDT} + {2393474400 -18000 0 EST} + {2404364400 -14400 1 EDT} + {2424924000 -18000 0 EST} + {2435814000 -14400 1 EDT} + {2456373600 -18000 0 EST} + {2467263600 -14400 1 EDT} + {2487823200 -18000 0 EST} + {2499318000 -14400 1 EDT} + {2519877600 -18000 0 EST} + {2530767600 -14400 1 EDT} + {2551327200 -18000 0 EST} + {2562217200 -14400 1 EDT} + {2582776800 -18000 0 EST} + {2593666800 -14400 1 EDT} + {2614226400 -18000 0 EST} + {2625116400 -14400 1 EDT} + {2645676000 -18000 0 EST} + {2656566000 -14400 1 EDT} + {2677125600 -18000 0 EST} + {2688620400 -14400 1 EDT} + {2709180000 -18000 0 EST} + {2720070000 -14400 1 EDT} + {2740629600 -18000 0 EST} + {2751519600 -14400 1 EDT} + {2772079200 -18000 0 EST} + {2782969200 -14400 1 EDT} + {2803528800 -18000 0 EST} + {2814418800 -14400 1 EDT} + {2834978400 -18000 0 EST} + {2846473200 -14400 1 EDT} + {2867032800 -18000 0 EST} + {2877922800 -14400 1 EDT} + {2898482400 -18000 0 EST} + {2909372400 -14400 1 EDT} + {2929932000 -18000 0 EST} + {2940822000 -14400 1 EDT} + {2961381600 -18000 0 EST} + {2972271600 -14400 1 EDT} + {2992831200 -18000 0 EST} + {3003721200 -14400 1 EDT} + {3024280800 -18000 0 EST} + {3035775600 -14400 1 EDT} + {3056335200 -18000 0 EST} + {3067225200 -14400 1 EDT} + {3087784800 -18000 0 EST} + {3098674800 -14400 1 EDT} + {3119234400 -18000 0 EST} + {3130124400 -14400 1 EDT} + {3150684000 -18000 0 EST} + {3161574000 -14400 1 EDT} + {3182133600 -18000 0 EST} + {3193023600 -14400 1 EDT} + {3213583200 -18000 0 EST} + {3225078000 -14400 1 EDT} + {3245637600 -18000 0 EST} + {3256527600 -14400 1 EDT} + {3277087200 -18000 0 EST} + {3287977200 -14400 1 EDT} + {3308536800 -18000 0 EST} + {3319426800 -14400 1 EDT} + {3339986400 -18000 0 EST} + {3350876400 -14400 1 EDT} + {3371436000 -18000 0 EST} + {3382930800 -14400 1 EDT} + {3403490400 -18000 0 EST} + {3414380400 -14400 1 EDT} + {3434940000 -18000 0 EST} + {3445830000 -14400 1 EDT} + {3466389600 -18000 0 EST} + {3477279600 -14400 1 EDT} + {3497839200 -18000 0 EST} + {3508729200 -14400 1 EDT} + {3529288800 -18000 0 EST} + {3540178800 -14400 1 EDT} + {3560738400 -18000 0 EST} + {3572233200 -14400 1 EDT} + {3592792800 -18000 0 EST} + {3603682800 -14400 1 EDT} + {3624242400 -18000 0 EST} + {3635132400 -14400 1 EDT} + {3655692000 -18000 0 EST} + {3666582000 -14400 1 EDT} + {3687141600 -18000 0 EST} + {3698031600 -14400 1 EDT} + {3718591200 -18000 0 EST} + {3730086000 -14400 1 EDT} + {3750645600 -18000 0 EST} + {3761535600 -14400 1 EDT} + {3782095200 -18000 0 EST} + {3792985200 -14400 1 EDT} + {3813544800 -18000 0 EST} + {3824434800 -14400 1 EDT} + {3844994400 -18000 0 EST} + {3855884400 -14400 1 EDT} + {3876444000 -18000 0 EST} + {3887334000 -14400 1 EDT} + {3907893600 -18000 0 EST} + {3919388400 -14400 1 EDT} + {3939948000 -18000 0 EST} + {3950838000 -14400 1 EDT} + {3971397600 -18000 0 EST} + {3982287600 -14400 1 EDT} + {4002847200 -18000 0 EST} + {4013737200 -14400 1 EDT} + {4034296800 -18000 0 EST} + {4045186800 -14400 1 EDT} + {4065746400 -18000 0 EST} + {4076636400 -14400 1 EDT} + {4097196000 -18000 0 EST} +} diff --git a/env/tcl/tcl8.6/tzdata/America/Indiana/Petersburg b/env/tcl/tcl8.6/tzdata/America/Indiana/Petersburg new file mode 100644 index 0000000..6992bfc --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/America/Indiana/Petersburg @@ -0,0 +1,247 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:America/Indiana/Petersburg) { + {-9223372036854775808 -20947 0 LMT} + {-2717647200 -21600 0 CST} + {-1633276800 -18000 1 CDT} + {-1615136400 -21600 0 CST} + {-1601827200 -18000 1 CDT} + {-1583686800 -21600 0 CST} + {-880214400 -18000 1 CWT} + {-769395600 -18000 1 CPT} + {-765392400 -21600 0 CST} + {-473364000 -21600 0 CST} + {-462996000 -18000 1 CDT} + {-450291600 -21600 0 CST} + {-431539200 -18000 1 CDT} + {-418237200 -21600 0 CST} + {-400089600 -18000 1 CDT} + {-386787600 -21600 0 CST} + {-368640000 -18000 1 CDT} + {-355338000 -21600 0 CST} + {-337190400 -18000 1 CDT} + {-323888400 -21600 0 CST} + {-305740800 -18000 1 CDT} + {-292438800 -21600 0 CST} + {-273686400 -18000 1 CDT} + {-257965200 -21600 0 CST} + {-242236800 -18000 1 CDT} + {-226515600 -21600 0 CST} + {-210787200 -18000 1 CDT} + {-195066000 -21600 0 CST} + {-179337600 -18000 1 CDT} + {-163616400 -21600 0 CST} + {-147888000 -18000 0 EST} + {-100112400 -21600 0 CST} + {-84384000 -18000 1 CDT} + {-68662800 -21600 0 CST} + {-52934400 -18000 1 CDT} + {-37213200 -21600 0 CST} + {-21484800 -18000 1 CDT} + {-5763600 -21600 0 CST} + {9964800 -18000 1 CDT} + {25686000 -21600 0 CST} + {41414400 -18000 1 CDT} + {57740400 -21600 0 CST} + {73468800 -18000 1 CDT} + {89190000 -21600 0 CST} + {104918400 -18000 1 CDT} + {120639600 -21600 0 CST} + {126691200 -18000 1 CDT} + {152089200 -21600 0 CST} + {162374400 -18000 1 CDT} + {183538800 -21600 0 CST} + {199267200 -18000 1 CDT} + {215593200 -21600 0 CST} + {230716800 -18000 1 CDT} + {247046400 -18000 0 EST} + {1143961200 -21600 0 CST} + {1143964800 -18000 1 CDT} + {1162105200 -21600 0 CST} + {1173600000 -18000 1 CDT} + {1194163200 -18000 0 EST} + {1205046000 -14400 1 EDT} + {1225605600 -18000 0 EST} + {1236495600 -14400 1 EDT} + {1257055200 -18000 0 EST} + {1268550000 -14400 1 EDT} + {1289109600 -18000 0 EST} + {1299999600 -14400 1 EDT} + {1320559200 -18000 0 EST} + {1331449200 -14400 1 EDT} + {1352008800 -18000 0 EST} + {1362898800 -14400 1 EDT} + {1383458400 -18000 0 EST} + {1394348400 -14400 1 EDT} + {1414908000 -18000 0 EST} + {1425798000 -14400 1 EDT} + {1446357600 -18000 0 EST} + {1457852400 -14400 1 EDT} + {1478412000 -18000 0 EST} + {1489302000 -14400 1 EDT} + {1509861600 -18000 0 EST} + {1520751600 -14400 1 EDT} + {1541311200 -18000 0 EST} + {1552201200 -14400 1 EDT} + {1572760800 -18000 0 EST} + {1583650800 -14400 1 EDT} + {1604210400 -18000 0 EST} + {1615705200 -14400 1 EDT} + {1636264800 -18000 0 EST} + {1647154800 -14400 1 EDT} + {1667714400 -18000 0 EST} + {1678604400 -14400 1 EDT} + {1699164000 -18000 0 EST} + {1710054000 -14400 1 EDT} + {1730613600 -18000 0 EST} + {1741503600 -14400 1 EDT} + {1762063200 -18000 0 EST} + {1772953200 -14400 1 EDT} + {1793512800 -18000 0 EST} + {1805007600 -14400 1 EDT} + {1825567200 -18000 0 EST} + {1836457200 -14400 1 EDT} + {1857016800 -18000 0 EST} + {1867906800 -14400 1 EDT} + {1888466400 -18000 0 EST} + {1899356400 -14400 1 EDT} + {1919916000 -18000 0 EST} + {1930806000 -14400 1 EDT} + {1951365600 -18000 0 EST} + {1962860400 -14400 1 EDT} + {1983420000 -18000 0 EST} + {1994310000 -14400 1 EDT} + {2014869600 -18000 0 EST} + {2025759600 -14400 1 EDT} + {2046319200 -18000 0 EST} + {2057209200 -14400 1 EDT} + {2077768800 -18000 0 EST} + {2088658800 -14400 1 EDT} + {2109218400 -18000 0 EST} + {2120108400 -14400 1 EDT} + {2140668000 -18000 0 EST} + {2152162800 -14400 1 EDT} + {2172722400 -18000 0 EST} + {2183612400 -14400 1 EDT} + {2204172000 -18000 0 EST} + {2215062000 -14400 1 EDT} + {2235621600 -18000 0 EST} + {2246511600 -14400 1 EDT} + {2267071200 -18000 0 EST} + {2277961200 -14400 1 EDT} + {2298520800 -18000 0 EST} + {2309410800 -14400 1 EDT} + {2329970400 -18000 0 EST} + {2341465200 -14400 1 EDT} + {2362024800 -18000 0 EST} + {2372914800 -14400 1 EDT} + {2393474400 -18000 0 EST} + {2404364400 -14400 1 EDT} + {2424924000 -18000 0 EST} + {2435814000 -14400 1 EDT} + {2456373600 -18000 0 EST} + {2467263600 -14400 1 EDT} + {2487823200 -18000 0 EST} + {2499318000 -14400 1 EDT} + {2519877600 -18000 0 EST} + {2530767600 -14400 1 EDT} + {2551327200 -18000 0 EST} + {2562217200 -14400 1 EDT} + {2582776800 -18000 0 EST} + {2593666800 -14400 1 EDT} + {2614226400 -18000 0 EST} + {2625116400 -14400 1 EDT} + {2645676000 -18000 0 EST} + {2656566000 -14400 1 EDT} + {2677125600 -18000 0 EST} + {2688620400 -14400 1 EDT} + {2709180000 -18000 0 EST} + {2720070000 -14400 1 EDT} + {2740629600 -18000 0 EST} + {2751519600 -14400 1 EDT} + {2772079200 -18000 0 EST} + {2782969200 -14400 1 EDT} + {2803528800 -18000 0 EST} + {2814418800 -14400 1 EDT} + {2834978400 -18000 0 EST} + {2846473200 -14400 1 EDT} + {2867032800 -18000 0 EST} + {2877922800 -14400 1 EDT} + {2898482400 -18000 0 EST} + {2909372400 -14400 1 EDT} + {2929932000 -18000 0 EST} + {2940822000 -14400 1 EDT} + {2961381600 -18000 0 EST} + {2972271600 -14400 1 EDT} + {2992831200 -18000 0 EST} + {3003721200 -14400 1 EDT} + {3024280800 -18000 0 EST} + {3035775600 -14400 1 EDT} + {3056335200 -18000 0 EST} + {3067225200 -14400 1 EDT} + {3087784800 -18000 0 EST} + {3098674800 -14400 1 EDT} + {3119234400 -18000 0 EST} + {3130124400 -14400 1 EDT} + {3150684000 -18000 0 EST} + {3161574000 -14400 1 EDT} + {3182133600 -18000 0 EST} + {3193023600 -14400 1 EDT} + {3213583200 -18000 0 EST} + {3225078000 -14400 1 EDT} + {3245637600 -18000 0 EST} + {3256527600 -14400 1 EDT} + {3277087200 -18000 0 EST} + {3287977200 -14400 1 EDT} + {3308536800 -18000 0 EST} + {3319426800 -14400 1 EDT} + {3339986400 -18000 0 EST} + {3350876400 -14400 1 EDT} + {3371436000 -18000 0 EST} + {3382930800 -14400 1 EDT} + {3403490400 -18000 0 EST} + {3414380400 -14400 1 EDT} + {3434940000 -18000 0 EST} + {3445830000 -14400 1 EDT} + {3466389600 -18000 0 EST} + {3477279600 -14400 1 EDT} + {3497839200 -18000 0 EST} + {3508729200 -14400 1 EDT} + {3529288800 -18000 0 EST} + {3540178800 -14400 1 EDT} + {3560738400 -18000 0 EST} + {3572233200 -14400 1 EDT} + {3592792800 -18000 0 EST} + {3603682800 -14400 1 EDT} + {3624242400 -18000 0 EST} + {3635132400 -14400 1 EDT} + {3655692000 -18000 0 EST} + {3666582000 -14400 1 EDT} + {3687141600 -18000 0 EST} + {3698031600 -14400 1 EDT} + {3718591200 -18000 0 EST} + {3730086000 -14400 1 EDT} + {3750645600 -18000 0 EST} + {3761535600 -14400 1 EDT} + {3782095200 -18000 0 EST} + {3792985200 -14400 1 EDT} + {3813544800 -18000 0 EST} + {3824434800 -14400 1 EDT} + {3844994400 -18000 0 EST} + {3855884400 -14400 1 EDT} + {3876444000 -18000 0 EST} + {3887334000 -14400 1 EDT} + {3907893600 -18000 0 EST} + {3919388400 -14400 1 EDT} + {3939948000 -18000 0 EST} + {3950838000 -14400 1 EDT} + {3971397600 -18000 0 EST} + {3982287600 -14400 1 EDT} + {4002847200 -18000 0 EST} + {4013737200 -14400 1 EDT} + {4034296800 -18000 0 EST} + {4045186800 -14400 1 EDT} + {4065746400 -18000 0 EST} + {4076636400 -14400 1 EDT} + {4097196000 -18000 0 EST} +} diff --git a/env/tcl/tcl8.6/tzdata/America/Indiana/Tell_City b/env/tcl/tcl8.6/tzdata/America/Indiana/Tell_City new file mode 100644 index 0000000..9eebcf7 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/America/Indiana/Tell_City @@ -0,0 +1,234 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:America/Indiana/Tell_City) { + {-9223372036854775808 -20823 0 LMT} + {-2717647200 -21600 0 CST} + {-1633276800 -18000 1 CDT} + {-1615136400 -21600 0 CST} + {-1601827200 -18000 1 CDT} + {-1583686800 -21600 0 CST} + {-880214400 -18000 1 CWT} + {-769395600 -18000 1 CPT} + {-765392400 -21600 0 CST} + {-757360800 -21600 0 CST} + {-747244800 -18000 1 CDT} + {-733942800 -21600 0 CST} + {-526492800 -18000 1 CDT} + {-513190800 -21600 0 CST} + {-495043200 -18000 1 CDT} + {-481741200 -21600 0 CST} + {-462996000 -18000 1 CDT} + {-450291600 -21600 0 CST} + {-431539200 -18000 1 CDT} + {-418237200 -21600 0 CST} + {-400089600 -18000 1 CDT} + {-386787600 -21600 0 CST} + {-368640000 -18000 1 CDT} + {-355338000 -21600 0 CST} + {-337190400 -18000 1 CDT} + {-323888400 -21600 0 CST} + {-305740800 -18000 1 CDT} + {-289414800 -21600 0 CST} + {-273686400 -18000 1 CDT} + {-260989200 -21600 0 CST} + {-242236800 -18000 1 CDT} + {-226515600 -21600 0 CST} + {-210787200 -18000 1 CDT} + {-195066000 -21600 0 CST} + {-179337600 -18000 0 EST} + {-31518000 -18000 0 EST} + {-21488400 -14400 1 EDT} + {-5767200 -18000 0 EST} + {9961200 -14400 1 EDT} + {25682400 -18000 0 EST} + {31554000 -18000 0 EST} + {1143961200 -21600 0 CST} + {1143964800 -18000 1 CDT} + {1162105200 -21600 0 CST} + {1173600000 -18000 1 CDT} + {1194159600 -21600 0 CST} + {1205049600 -18000 1 CDT} + {1225609200 -21600 0 CST} + {1236499200 -18000 1 CDT} + {1257058800 -21600 0 CST} + {1268553600 -18000 1 CDT} + {1289113200 -21600 0 CST} + {1300003200 -18000 1 CDT} + {1320562800 -21600 0 CST} + {1331452800 -18000 1 CDT} + {1352012400 -21600 0 CST} + {1362902400 -18000 1 CDT} + {1383462000 -21600 0 CST} + {1394352000 -18000 1 CDT} + {1414911600 -21600 0 CST} + {1425801600 -18000 1 CDT} + {1446361200 -21600 0 CST} + {1457856000 -18000 1 CDT} + {1478415600 -21600 0 CST} + {1489305600 -18000 1 CDT} + {1509865200 -21600 0 CST} + {1520755200 -18000 1 CDT} + {1541314800 -21600 0 CST} + {1552204800 -18000 1 CDT} + {1572764400 -21600 0 CST} + {1583654400 -18000 1 CDT} + {1604214000 -21600 0 CST} + {1615708800 -18000 1 CDT} + {1636268400 -21600 0 CST} + {1647158400 -18000 1 CDT} + {1667718000 -21600 0 CST} + {1678608000 -18000 1 CDT} + {1699167600 -21600 0 CST} + {1710057600 -18000 1 CDT} + {1730617200 -21600 0 CST} + {1741507200 -18000 1 CDT} + {1762066800 -21600 0 CST} + {1772956800 -18000 1 CDT} + {1793516400 -21600 0 CST} + {1805011200 -18000 1 CDT} + {1825570800 -21600 0 CST} + {1836460800 -18000 1 CDT} + {1857020400 -21600 0 CST} + {1867910400 -18000 1 CDT} + {1888470000 -21600 0 CST} + {1899360000 -18000 1 CDT} + {1919919600 -21600 0 CST} + {1930809600 -18000 1 CDT} + {1951369200 -21600 0 CST} + {1962864000 -18000 1 CDT} + {1983423600 -21600 0 CST} + {1994313600 -18000 1 CDT} + {2014873200 -21600 0 CST} + {2025763200 -18000 1 CDT} + {2046322800 -21600 0 CST} + {2057212800 -18000 1 CDT} + {2077772400 -21600 0 CST} + {2088662400 -18000 1 CDT} + {2109222000 -21600 0 CST} + {2120112000 -18000 1 CDT} + {2140671600 -21600 0 CST} + {2152166400 -18000 1 CDT} + {2172726000 -21600 0 CST} + {2183616000 -18000 1 CDT} + {2204175600 -21600 0 CST} + {2215065600 -18000 1 CDT} + {2235625200 -21600 0 CST} + {2246515200 -18000 1 CDT} + {2267074800 -21600 0 CST} + {2277964800 -18000 1 CDT} + {2298524400 -21600 0 CST} + {2309414400 -18000 1 CDT} + {2329974000 -21600 0 CST} + {2341468800 -18000 1 CDT} + {2362028400 -21600 0 CST} + {2372918400 -18000 1 CDT} + {2393478000 -21600 0 CST} + {2404368000 -18000 1 CDT} + {2424927600 -21600 0 CST} + {2435817600 -18000 1 CDT} + {2456377200 -21600 0 CST} + {2467267200 -18000 1 CDT} + {2487826800 -21600 0 CST} + {2499321600 -18000 1 CDT} + {2519881200 -21600 0 CST} + {2530771200 -18000 1 CDT} + {2551330800 -21600 0 CST} + {2562220800 -18000 1 CDT} + {2582780400 -21600 0 CST} + {2593670400 -18000 1 CDT} + {2614230000 -21600 0 CST} + {2625120000 -18000 1 CDT} + {2645679600 -21600 0 CST} + {2656569600 -18000 1 CDT} + {2677129200 -21600 0 CST} + {2688624000 -18000 1 CDT} + {2709183600 -21600 0 CST} + {2720073600 -18000 1 CDT} + {2740633200 -21600 0 CST} + {2751523200 -18000 1 CDT} + {2772082800 -21600 0 CST} + {2782972800 -18000 1 CDT} + {2803532400 -21600 0 CST} + {2814422400 -18000 1 CDT} + {2834982000 -21600 0 CST} + {2846476800 -18000 1 CDT} + {2867036400 -21600 0 CST} + {2877926400 -18000 1 CDT} + {2898486000 -21600 0 CST} + {2909376000 -18000 1 CDT} + {2929935600 -21600 0 CST} + {2940825600 -18000 1 CDT} + {2961385200 -21600 0 CST} + {2972275200 -18000 1 CDT} + {2992834800 -21600 0 CST} + {3003724800 -18000 1 CDT} + {3024284400 -21600 0 CST} + {3035779200 -18000 1 CDT} + {3056338800 -21600 0 CST} + {3067228800 -18000 1 CDT} + {3087788400 -21600 0 CST} + {3098678400 -18000 1 CDT} + {3119238000 -21600 0 CST} + {3130128000 -18000 1 CDT} + {3150687600 -21600 0 CST} + {3161577600 -18000 1 CDT} + {3182137200 -21600 0 CST} + {3193027200 -18000 1 CDT} + {3213586800 -21600 0 CST} + {3225081600 -18000 1 CDT} + {3245641200 -21600 0 CST} + {3256531200 -18000 1 CDT} + {3277090800 -21600 0 CST} + {3287980800 -18000 1 CDT} + {3308540400 -21600 0 CST} + {3319430400 -18000 1 CDT} + {3339990000 -21600 0 CST} + {3350880000 -18000 1 CDT} + {3371439600 -21600 0 CST} + {3382934400 -18000 1 CDT} + {3403494000 -21600 0 CST} + {3414384000 -18000 1 CDT} + {3434943600 -21600 0 CST} + {3445833600 -18000 1 CDT} + {3466393200 -21600 0 CST} + {3477283200 -18000 1 CDT} + {3497842800 -21600 0 CST} + {3508732800 -18000 1 CDT} + {3529292400 -21600 0 CST} + {3540182400 -18000 1 CDT} + {3560742000 -21600 0 CST} + {3572236800 -18000 1 CDT} + {3592796400 -21600 0 CST} + {3603686400 -18000 1 CDT} + {3624246000 -21600 0 CST} + {3635136000 -18000 1 CDT} + {3655695600 -21600 0 CST} + {3666585600 -18000 1 CDT} + {3687145200 -21600 0 CST} + {3698035200 -18000 1 CDT} + {3718594800 -21600 0 CST} + {3730089600 -18000 1 CDT} + {3750649200 -21600 0 CST} + {3761539200 -18000 1 CDT} + {3782098800 -21600 0 CST} + {3792988800 -18000 1 CDT} + {3813548400 -21600 0 CST} + {3824438400 -18000 1 CDT} + {3844998000 -21600 0 CST} + {3855888000 -18000 1 CDT} + {3876447600 -21600 0 CST} + {3887337600 -18000 1 CDT} + {3907897200 -21600 0 CST} + {3919392000 -18000 1 CDT} + {3939951600 -21600 0 CST} + {3950841600 -18000 1 CDT} + {3971401200 -21600 0 CST} + {3982291200 -18000 1 CDT} + {4002850800 -21600 0 CST} + {4013740800 -18000 1 CDT} + {4034300400 -21600 0 CST} + {4045190400 -18000 1 CDT} + {4065750000 -21600 0 CST} + {4076640000 -18000 1 CDT} + {4097199600 -21600 0 CST} +} diff --git a/env/tcl/tcl8.6/tzdata/America/Indiana/Vevay b/env/tcl/tcl8.6/tzdata/America/Indiana/Vevay new file mode 100644 index 0000000..8d4157f --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/America/Indiana/Vevay @@ -0,0 +1,213 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:America/Indiana/Vevay) { + {-9223372036854775808 -20416 0 LMT} + {-2717647200 -21600 0 CST} + {-1633276800 -18000 1 CDT} + {-1615136400 -21600 0 CST} + {-1601827200 -18000 1 CDT} + {-1583686800 -21600 0 CST} + {-880214400 -18000 1 CWT} + {-769395600 -18000 1 CPT} + {-765392400 -21600 0 CST} + {-495043200 -18000 0 EST} + {-31518000 -18000 0 EST} + {-21488400 -14400 1 EDT} + {-5767200 -18000 0 EST} + {9961200 -14400 1 EDT} + {25682400 -18000 0 EST} + {41410800 -14400 1 EDT} + {57736800 -18000 0 EST} + {73465200 -14400 1 EDT} + {89186400 -18000 0 EST} + {94712400 -18000 0 EST} + {1136091600 -18000 0 EST} + {1143961200 -14400 1 EDT} + {1162101600 -18000 0 EST} + {1173596400 -14400 1 EDT} + {1194156000 -18000 0 EST} + {1205046000 -14400 1 EDT} + {1225605600 -18000 0 EST} + {1236495600 -14400 1 EDT} + {1257055200 -18000 0 EST} + {1268550000 -14400 1 EDT} + {1289109600 -18000 0 EST} + {1299999600 -14400 1 EDT} + {1320559200 -18000 0 EST} + {1331449200 -14400 1 EDT} + {1352008800 -18000 0 EST} + {1362898800 -14400 1 EDT} + {1383458400 -18000 0 EST} + {1394348400 -14400 1 EDT} + {1414908000 -18000 0 EST} + {1425798000 -14400 1 EDT} + {1446357600 -18000 0 EST} + {1457852400 -14400 1 EDT} + {1478412000 -18000 0 EST} + {1489302000 -14400 1 EDT} + {1509861600 -18000 0 EST} + {1520751600 -14400 1 EDT} + {1541311200 -18000 0 EST} + {1552201200 -14400 1 EDT} + {1572760800 -18000 0 EST} + {1583650800 -14400 1 EDT} + {1604210400 -18000 0 EST} + {1615705200 -14400 1 EDT} + {1636264800 -18000 0 EST} + {1647154800 -14400 1 EDT} + {1667714400 -18000 0 EST} + {1678604400 -14400 1 EDT} + {1699164000 -18000 0 EST} + {1710054000 -14400 1 EDT} + {1730613600 -18000 0 EST} + {1741503600 -14400 1 EDT} + {1762063200 -18000 0 EST} + {1772953200 -14400 1 EDT} + {1793512800 -18000 0 EST} + {1805007600 -14400 1 EDT} + {1825567200 -18000 0 EST} + {1836457200 -14400 1 EDT} + {1857016800 -18000 0 EST} + {1867906800 -14400 1 EDT} + {1888466400 -18000 0 EST} + {1899356400 -14400 1 EDT} + {1919916000 -18000 0 EST} + {1930806000 -14400 1 EDT} + {1951365600 -18000 0 EST} + {1962860400 -14400 1 EDT} + {1983420000 -18000 0 EST} + {1994310000 -14400 1 EDT} + {2014869600 -18000 0 EST} + {2025759600 -14400 1 EDT} + {2046319200 -18000 0 EST} + {2057209200 -14400 1 EDT} + {2077768800 -18000 0 EST} + {2088658800 -14400 1 EDT} + {2109218400 -18000 0 EST} + {2120108400 -14400 1 EDT} + {2140668000 -18000 0 EST} + {2152162800 -14400 1 EDT} + {2172722400 -18000 0 EST} + {2183612400 -14400 1 EDT} + {2204172000 -18000 0 EST} + {2215062000 -14400 1 EDT} + {2235621600 -18000 0 EST} + {2246511600 -14400 1 EDT} + {2267071200 -18000 0 EST} + {2277961200 -14400 1 EDT} + {2298520800 -18000 0 EST} + {2309410800 -14400 1 EDT} + {2329970400 -18000 0 EST} + {2341465200 -14400 1 EDT} + {2362024800 -18000 0 EST} + {2372914800 -14400 1 EDT} + {2393474400 -18000 0 EST} + {2404364400 -14400 1 EDT} + {2424924000 -18000 0 EST} + {2435814000 -14400 1 EDT} + {2456373600 -18000 0 EST} + {2467263600 -14400 1 EDT} + {2487823200 -18000 0 EST} + {2499318000 -14400 1 EDT} + {2519877600 -18000 0 EST} + {2530767600 -14400 1 EDT} + {2551327200 -18000 0 EST} + {2562217200 -14400 1 EDT} + {2582776800 -18000 0 EST} + {2593666800 -14400 1 EDT} + {2614226400 -18000 0 EST} + {2625116400 -14400 1 EDT} + {2645676000 -18000 0 EST} + {2656566000 -14400 1 EDT} + {2677125600 -18000 0 EST} + {2688620400 -14400 1 EDT} + {2709180000 -18000 0 EST} + {2720070000 -14400 1 EDT} + {2740629600 -18000 0 EST} + {2751519600 -14400 1 EDT} + {2772079200 -18000 0 EST} + {2782969200 -14400 1 EDT} + {2803528800 -18000 0 EST} + {2814418800 -14400 1 EDT} + {2834978400 -18000 0 EST} + {2846473200 -14400 1 EDT} + {2867032800 -18000 0 EST} + {2877922800 -14400 1 EDT} + {2898482400 -18000 0 EST} + {2909372400 -14400 1 EDT} + {2929932000 -18000 0 EST} + {2940822000 -14400 1 EDT} + {2961381600 -18000 0 EST} + {2972271600 -14400 1 EDT} + {2992831200 -18000 0 EST} + {3003721200 -14400 1 EDT} + {3024280800 -18000 0 EST} + {3035775600 -14400 1 EDT} + {3056335200 -18000 0 EST} + {3067225200 -14400 1 EDT} + {3087784800 -18000 0 EST} + {3098674800 -14400 1 EDT} + {3119234400 -18000 0 EST} + {3130124400 -14400 1 EDT} + {3150684000 -18000 0 EST} + {3161574000 -14400 1 EDT} + {3182133600 -18000 0 EST} + {3193023600 -14400 1 EDT} + {3213583200 -18000 0 EST} + {3225078000 -14400 1 EDT} + {3245637600 -18000 0 EST} + {3256527600 -14400 1 EDT} + {3277087200 -18000 0 EST} + {3287977200 -14400 1 EDT} + {3308536800 -18000 0 EST} + {3319426800 -14400 1 EDT} + {3339986400 -18000 0 EST} + {3350876400 -14400 1 EDT} + {3371436000 -18000 0 EST} + {3382930800 -14400 1 EDT} + {3403490400 -18000 0 EST} + {3414380400 -14400 1 EDT} + {3434940000 -18000 0 EST} + {3445830000 -14400 1 EDT} + {3466389600 -18000 0 EST} + {3477279600 -14400 1 EDT} + {3497839200 -18000 0 EST} + {3508729200 -14400 1 EDT} + {3529288800 -18000 0 EST} + {3540178800 -14400 1 EDT} + {3560738400 -18000 0 EST} + {3572233200 -14400 1 EDT} + {3592792800 -18000 0 EST} + {3603682800 -14400 1 EDT} + {3624242400 -18000 0 EST} + {3635132400 -14400 1 EDT} + {3655692000 -18000 0 EST} + {3666582000 -14400 1 EDT} + {3687141600 -18000 0 EST} + {3698031600 -14400 1 EDT} + {3718591200 -18000 0 EST} + {3730086000 -14400 1 EDT} + {3750645600 -18000 0 EST} + {3761535600 -14400 1 EDT} + {3782095200 -18000 0 EST} + {3792985200 -14400 1 EDT} + {3813544800 -18000 0 EST} + {3824434800 -14400 1 EDT} + {3844994400 -18000 0 EST} + {3855884400 -14400 1 EDT} + {3876444000 -18000 0 EST} + {3887334000 -14400 1 EDT} + {3907893600 -18000 0 EST} + {3919388400 -14400 1 EDT} + {3939948000 -18000 0 EST} + {3950838000 -14400 1 EDT} + {3971397600 -18000 0 EST} + {3982287600 -14400 1 EDT} + {4002847200 -18000 0 EST} + {4013737200 -14400 1 EDT} + {4034296800 -18000 0 EST} + {4045186800 -14400 1 EDT} + {4065746400 -18000 0 EST} + {4076636400 -14400 1 EDT} + {4097196000 -18000 0 EST} +} diff --git a/env/tcl/tcl8.6/tzdata/America/Indiana/Vincennes b/env/tcl/tcl8.6/tzdata/America/Indiana/Vincennes new file mode 100644 index 0000000..1af7fc9 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/America/Indiana/Vincennes @@ -0,0 +1,234 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:America/Indiana/Vincennes) { + {-9223372036854775808 -21007 0 LMT} + {-2717647200 -21600 0 CST} + {-1633276800 -18000 1 CDT} + {-1615136400 -21600 0 CST} + {-1601827200 -18000 1 CDT} + {-1583686800 -21600 0 CST} + {-880214400 -18000 1 CWT} + {-769395600 -18000 1 CPT} + {-765392400 -21600 0 CST} + {-757360800 -21600 0 CST} + {-747244800 -18000 1 CDT} + {-733942800 -21600 0 CST} + {-526492800 -18000 1 CDT} + {-513190800 -21600 0 CST} + {-495043200 -18000 1 CDT} + {-481741200 -21600 0 CST} + {-462996000 -18000 1 CDT} + {-450291600 -21600 0 CST} + {-431539200 -18000 1 CDT} + {-418237200 -21600 0 CST} + {-400089600 -18000 1 CDT} + {-386787600 -21600 0 CST} + {-368640000 -18000 1 CDT} + {-355338000 -21600 0 CST} + {-337190400 -18000 1 CDT} + {-323888400 -21600 0 CST} + {-305740800 -18000 1 CDT} + {-289414800 -21600 0 CST} + {-273686400 -18000 1 CDT} + {-260989200 -21600 0 CST} + {-242236800 -18000 1 CDT} + {-226515600 -21600 0 CST} + {-210787200 -18000 1 CDT} + {-195066000 -21600 0 CST} + {-179337600 -18000 0 EST} + {-31518000 -18000 0 EST} + {-21488400 -14400 1 EDT} + {-5767200 -18000 0 EST} + {9961200 -14400 1 EDT} + {25682400 -18000 0 EST} + {31554000 -18000 0 EST} + {1143961200 -21600 0 CST} + {1143964800 -18000 1 CDT} + {1162105200 -21600 0 CST} + {1173600000 -18000 1 CDT} + {1194163200 -18000 0 EST} + {1205046000 -14400 1 EDT} + {1225605600 -18000 0 EST} + {1236495600 -14400 1 EDT} + {1257055200 -18000 0 EST} + {1268550000 -14400 1 EDT} + {1289109600 -18000 0 EST} + {1299999600 -14400 1 EDT} + {1320559200 -18000 0 EST} + {1331449200 -14400 1 EDT} + {1352008800 -18000 0 EST} + {1362898800 -14400 1 EDT} + {1383458400 -18000 0 EST} + {1394348400 -14400 1 EDT} + {1414908000 -18000 0 EST} + {1425798000 -14400 1 EDT} + {1446357600 -18000 0 EST} + {1457852400 -14400 1 EDT} + {1478412000 -18000 0 EST} + {1489302000 -14400 1 EDT} + {1509861600 -18000 0 EST} + {1520751600 -14400 1 EDT} + {1541311200 -18000 0 EST} + {1552201200 -14400 1 EDT} + {1572760800 -18000 0 EST} + {1583650800 -14400 1 EDT} + {1604210400 -18000 0 EST} + {1615705200 -14400 1 EDT} + {1636264800 -18000 0 EST} + {1647154800 -14400 1 EDT} + {1667714400 -18000 0 EST} + {1678604400 -14400 1 EDT} + {1699164000 -18000 0 EST} + {1710054000 -14400 1 EDT} + {1730613600 -18000 0 EST} + {1741503600 -14400 1 EDT} + {1762063200 -18000 0 EST} + {1772953200 -14400 1 EDT} + {1793512800 -18000 0 EST} + {1805007600 -14400 1 EDT} + {1825567200 -18000 0 EST} + {1836457200 -14400 1 EDT} + {1857016800 -18000 0 EST} + {1867906800 -14400 1 EDT} + {1888466400 -18000 0 EST} + {1899356400 -14400 1 EDT} + {1919916000 -18000 0 EST} + {1930806000 -14400 1 EDT} + {1951365600 -18000 0 EST} + {1962860400 -14400 1 EDT} + {1983420000 -18000 0 EST} + {1994310000 -14400 1 EDT} + {2014869600 -18000 0 EST} + {2025759600 -14400 1 EDT} + {2046319200 -18000 0 EST} + {2057209200 -14400 1 EDT} + {2077768800 -18000 0 EST} + {2088658800 -14400 1 EDT} + {2109218400 -18000 0 EST} + {2120108400 -14400 1 EDT} + {2140668000 -18000 0 EST} + {2152162800 -14400 1 EDT} + {2172722400 -18000 0 EST} + {2183612400 -14400 1 EDT} + {2204172000 -18000 0 EST} + {2215062000 -14400 1 EDT} + {2235621600 -18000 0 EST} + {2246511600 -14400 1 EDT} + {2267071200 -18000 0 EST} + {2277961200 -14400 1 EDT} + {2298520800 -18000 0 EST} + {2309410800 -14400 1 EDT} + {2329970400 -18000 0 EST} + {2341465200 -14400 1 EDT} + {2362024800 -18000 0 EST} + {2372914800 -14400 1 EDT} + {2393474400 -18000 0 EST} + {2404364400 -14400 1 EDT} + {2424924000 -18000 0 EST} + {2435814000 -14400 1 EDT} + {2456373600 -18000 0 EST} + {2467263600 -14400 1 EDT} + {2487823200 -18000 0 EST} + {2499318000 -14400 1 EDT} + {2519877600 -18000 0 EST} + {2530767600 -14400 1 EDT} + {2551327200 -18000 0 EST} + {2562217200 -14400 1 EDT} + {2582776800 -18000 0 EST} + {2593666800 -14400 1 EDT} + {2614226400 -18000 0 EST} + {2625116400 -14400 1 EDT} + {2645676000 -18000 0 EST} + {2656566000 -14400 1 EDT} + {2677125600 -18000 0 EST} + {2688620400 -14400 1 EDT} + {2709180000 -18000 0 EST} + {2720070000 -14400 1 EDT} + {2740629600 -18000 0 EST} + {2751519600 -14400 1 EDT} + {2772079200 -18000 0 EST} + {2782969200 -14400 1 EDT} + {2803528800 -18000 0 EST} + {2814418800 -14400 1 EDT} + {2834978400 -18000 0 EST} + {2846473200 -14400 1 EDT} + {2867032800 -18000 0 EST} + {2877922800 -14400 1 EDT} + {2898482400 -18000 0 EST} + {2909372400 -14400 1 EDT} + {2929932000 -18000 0 EST} + {2940822000 -14400 1 EDT} + {2961381600 -18000 0 EST} + {2972271600 -14400 1 EDT} + {2992831200 -18000 0 EST} + {3003721200 -14400 1 EDT} + {3024280800 -18000 0 EST} + {3035775600 -14400 1 EDT} + {3056335200 -18000 0 EST} + {3067225200 -14400 1 EDT} + {3087784800 -18000 0 EST} + {3098674800 -14400 1 EDT} + {3119234400 -18000 0 EST} + {3130124400 -14400 1 EDT} + {3150684000 -18000 0 EST} + {3161574000 -14400 1 EDT} + {3182133600 -18000 0 EST} + {3193023600 -14400 1 EDT} + {3213583200 -18000 0 EST} + {3225078000 -14400 1 EDT} + {3245637600 -18000 0 EST} + {3256527600 -14400 1 EDT} + {3277087200 -18000 0 EST} + {3287977200 -14400 1 EDT} + {3308536800 -18000 0 EST} + {3319426800 -14400 1 EDT} + {3339986400 -18000 0 EST} + {3350876400 -14400 1 EDT} + {3371436000 -18000 0 EST} + {3382930800 -14400 1 EDT} + {3403490400 -18000 0 EST} + {3414380400 -14400 1 EDT} + {3434940000 -18000 0 EST} + {3445830000 -14400 1 EDT} + {3466389600 -18000 0 EST} + {3477279600 -14400 1 EDT} + {3497839200 -18000 0 EST} + {3508729200 -14400 1 EDT} + {3529288800 -18000 0 EST} + {3540178800 -14400 1 EDT} + {3560738400 -18000 0 EST} + {3572233200 -14400 1 EDT} + {3592792800 -18000 0 EST} + {3603682800 -14400 1 EDT} + {3624242400 -18000 0 EST} + {3635132400 -14400 1 EDT} + {3655692000 -18000 0 EST} + {3666582000 -14400 1 EDT} + {3687141600 -18000 0 EST} + {3698031600 -14400 1 EDT} + {3718591200 -18000 0 EST} + {3730086000 -14400 1 EDT} + {3750645600 -18000 0 EST} + {3761535600 -14400 1 EDT} + {3782095200 -18000 0 EST} + {3792985200 -14400 1 EDT} + {3813544800 -18000 0 EST} + {3824434800 -14400 1 EDT} + {3844994400 -18000 0 EST} + {3855884400 -14400 1 EDT} + {3876444000 -18000 0 EST} + {3887334000 -14400 1 EDT} + {3907893600 -18000 0 EST} + {3919388400 -14400 1 EDT} + {3939948000 -18000 0 EST} + {3950838000 -14400 1 EDT} + {3971397600 -18000 0 EST} + {3982287600 -14400 1 EDT} + {4002847200 -18000 0 EST} + {4013737200 -14400 1 EDT} + {4034296800 -18000 0 EST} + {4045186800 -14400 1 EDT} + {4065746400 -18000 0 EST} + {4076636400 -14400 1 EDT} + {4097196000 -18000 0 EST} +} diff --git a/env/tcl/tcl8.6/tzdata/America/Indiana/Winamac b/env/tcl/tcl8.6/tzdata/America/Indiana/Winamac new file mode 100644 index 0000000..fb6cd37 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/America/Indiana/Winamac @@ -0,0 +1,240 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:America/Indiana/Winamac) { + {-9223372036854775808 -20785 0 LMT} + {-2717647200 -21600 0 CST} + {-1633276800 -18000 1 CDT} + {-1615136400 -21600 0 CST} + {-1601827200 -18000 1 CDT} + {-1583686800 -21600 0 CST} + {-880214400 -18000 1 CWT} + {-769395600 -18000 1 CPT} + {-765392400 -21600 0 CST} + {-757360800 -21600 0 CST} + {-747244800 -18000 1 CDT} + {-733942800 -21600 0 CST} + {-715795200 -18000 1 CDT} + {-702493200 -21600 0 CST} + {-684345600 -18000 1 CDT} + {-671043600 -21600 0 CST} + {-652896000 -18000 1 CDT} + {-639594000 -21600 0 CST} + {-620841600 -18000 1 CDT} + {-608144400 -21600 0 CST} + {-589392000 -18000 1 CDT} + {-576090000 -21600 0 CST} + {-557942400 -18000 1 CDT} + {-544640400 -21600 0 CST} + {-526492800 -18000 1 CDT} + {-513190800 -21600 0 CST} + {-495043200 -18000 1 CDT} + {-481741200 -21600 0 CST} + {-463593600 -18000 1 CDT} + {-447267600 -21600 0 CST} + {-431539200 -18000 1 CDT} + {-415818000 -21600 0 CST} + {-400089600 -18000 1 CDT} + {-386787600 -21600 0 CST} + {-368640000 -18000 1 CDT} + {-355338000 -21600 0 CST} + {-337190400 -18000 1 CDT} + {-323888400 -21600 0 CST} + {-305740800 -18000 1 CDT} + {-292438800 -21600 0 CST} + {-273686400 -18000 0 EST} + {-31518000 -18000 0 EST} + {-21488400 -14400 1 EDT} + {-5767200 -18000 0 EST} + {9961200 -14400 1 EDT} + {25682400 -18000 0 EST} + {31554000 -18000 0 EST} + {1143961200 -21600 0 CST} + {1143964800 -18000 1 CDT} + {1162105200 -21600 0 CST} + {1173600000 -14400 0 EDT} + {1194156000 -18000 0 EST} + {1205046000 -14400 1 EDT} + {1225605600 -18000 0 EST} + {1236495600 -14400 1 EDT} + {1257055200 -18000 0 EST} + {1268550000 -14400 1 EDT} + {1289109600 -18000 0 EST} + {1299999600 -14400 1 EDT} + {1320559200 -18000 0 EST} + {1331449200 -14400 1 EDT} + {1352008800 -18000 0 EST} + {1362898800 -14400 1 EDT} + {1383458400 -18000 0 EST} + {1394348400 -14400 1 EDT} + {1414908000 -18000 0 EST} + {1425798000 -14400 1 EDT} + {1446357600 -18000 0 EST} + {1457852400 -14400 1 EDT} + {1478412000 -18000 0 EST} + {1489302000 -14400 1 EDT} + {1509861600 -18000 0 EST} + {1520751600 -14400 1 EDT} + {1541311200 -18000 0 EST} + {1552201200 -14400 1 EDT} + {1572760800 -18000 0 EST} + {1583650800 -14400 1 EDT} + {1604210400 -18000 0 EST} + {1615705200 -14400 1 EDT} + {1636264800 -18000 0 EST} + {1647154800 -14400 1 EDT} + {1667714400 -18000 0 EST} + {1678604400 -14400 1 EDT} + {1699164000 -18000 0 EST} + {1710054000 -14400 1 EDT} + {1730613600 -18000 0 EST} + {1741503600 -14400 1 EDT} + {1762063200 -18000 0 EST} + {1772953200 -14400 1 EDT} + {1793512800 -18000 0 EST} + {1805007600 -14400 1 EDT} + {1825567200 -18000 0 EST} + {1836457200 -14400 1 EDT} + {1857016800 -18000 0 EST} + {1867906800 -14400 1 EDT} + {1888466400 -18000 0 EST} + {1899356400 -14400 1 EDT} + {1919916000 -18000 0 EST} + {1930806000 -14400 1 EDT} + {1951365600 -18000 0 EST} + {1962860400 -14400 1 EDT} + {1983420000 -18000 0 EST} + {1994310000 -14400 1 EDT} + {2014869600 -18000 0 EST} + {2025759600 -14400 1 EDT} + {2046319200 -18000 0 EST} + {2057209200 -14400 1 EDT} + {2077768800 -18000 0 EST} + {2088658800 -14400 1 EDT} + {2109218400 -18000 0 EST} + {2120108400 -14400 1 EDT} + {2140668000 -18000 0 EST} + {2152162800 -14400 1 EDT} + {2172722400 -18000 0 EST} + {2183612400 -14400 1 EDT} + {2204172000 -18000 0 EST} + {2215062000 -14400 1 EDT} + {2235621600 -18000 0 EST} + {2246511600 -14400 1 EDT} + {2267071200 -18000 0 EST} + {2277961200 -14400 1 EDT} + {2298520800 -18000 0 EST} + {2309410800 -14400 1 EDT} + {2329970400 -18000 0 EST} + {2341465200 -14400 1 EDT} + {2362024800 -18000 0 EST} + {2372914800 -14400 1 EDT} + {2393474400 -18000 0 EST} + {2404364400 -14400 1 EDT} + {2424924000 -18000 0 EST} + {2435814000 -14400 1 EDT} + {2456373600 -18000 0 EST} + {2467263600 -14400 1 EDT} + {2487823200 -18000 0 EST} + {2499318000 -14400 1 EDT} + {2519877600 -18000 0 EST} + {2530767600 -14400 1 EDT} + {2551327200 -18000 0 EST} + {2562217200 -14400 1 EDT} + {2582776800 -18000 0 EST} + {2593666800 -14400 1 EDT} + {2614226400 -18000 0 EST} + {2625116400 -14400 1 EDT} + {2645676000 -18000 0 EST} + {2656566000 -14400 1 EDT} + {2677125600 -18000 0 EST} + {2688620400 -14400 1 EDT} + {2709180000 -18000 0 EST} + {2720070000 -14400 1 EDT} + {2740629600 -18000 0 EST} + {2751519600 -14400 1 EDT} + {2772079200 -18000 0 EST} + {2782969200 -14400 1 EDT} + {2803528800 -18000 0 EST} + {2814418800 -14400 1 EDT} + {2834978400 -18000 0 EST} + {2846473200 -14400 1 EDT} + {2867032800 -18000 0 EST} + {2877922800 -14400 1 EDT} + {2898482400 -18000 0 EST} + {2909372400 -14400 1 EDT} + {2929932000 -18000 0 EST} + {2940822000 -14400 1 EDT} + {2961381600 -18000 0 EST} + {2972271600 -14400 1 EDT} + {2992831200 -18000 0 EST} + {3003721200 -14400 1 EDT} + {3024280800 -18000 0 EST} + {3035775600 -14400 1 EDT} + {3056335200 -18000 0 EST} + {3067225200 -14400 1 EDT} + {3087784800 -18000 0 EST} + {3098674800 -14400 1 EDT} + {3119234400 -18000 0 EST} + {3130124400 -14400 1 EDT} + {3150684000 -18000 0 EST} + {3161574000 -14400 1 EDT} + {3182133600 -18000 0 EST} + {3193023600 -14400 1 EDT} + {3213583200 -18000 0 EST} + {3225078000 -14400 1 EDT} + {3245637600 -18000 0 EST} + {3256527600 -14400 1 EDT} + {3277087200 -18000 0 EST} + {3287977200 -14400 1 EDT} + {3308536800 -18000 0 EST} + {3319426800 -14400 1 EDT} + {3339986400 -18000 0 EST} + {3350876400 -14400 1 EDT} + {3371436000 -18000 0 EST} + {3382930800 -14400 1 EDT} + {3403490400 -18000 0 EST} + {3414380400 -14400 1 EDT} + {3434940000 -18000 0 EST} + {3445830000 -14400 1 EDT} + {3466389600 -18000 0 EST} + {3477279600 -14400 1 EDT} + {3497839200 -18000 0 EST} + {3508729200 -14400 1 EDT} + {3529288800 -18000 0 EST} + {3540178800 -14400 1 EDT} + {3560738400 -18000 0 EST} + {3572233200 -14400 1 EDT} + {3592792800 -18000 0 EST} + {3603682800 -14400 1 EDT} + {3624242400 -18000 0 EST} + {3635132400 -14400 1 EDT} + {3655692000 -18000 0 EST} + {3666582000 -14400 1 EDT} + {3687141600 -18000 0 EST} + {3698031600 -14400 1 EDT} + {3718591200 -18000 0 EST} + {3730086000 -14400 1 EDT} + {3750645600 -18000 0 EST} + {3761535600 -14400 1 EDT} + {3782095200 -18000 0 EST} + {3792985200 -14400 1 EDT} + {3813544800 -18000 0 EST} + {3824434800 -14400 1 EDT} + {3844994400 -18000 0 EST} + {3855884400 -14400 1 EDT} + {3876444000 -18000 0 EST} + {3887334000 -14400 1 EDT} + {3907893600 -18000 0 EST} + {3919388400 -14400 1 EDT} + {3939948000 -18000 0 EST} + {3950838000 -14400 1 EDT} + {3971397600 -18000 0 EST} + {3982287600 -14400 1 EDT} + {4002847200 -18000 0 EST} + {4013737200 -14400 1 EDT} + {4034296800 -18000 0 EST} + {4045186800 -14400 1 EDT} + {4065746400 -18000 0 EST} + {4076636400 -14400 1 EDT} + {4097196000 -18000 0 EST} +} diff --git a/env/tcl/tcl8.6/tzdata/America/Indianapolis b/env/tcl/tcl8.6/tzdata/America/Indianapolis new file mode 100644 index 0000000..7398545 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/America/Indianapolis @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(America/Indiana/Indianapolis)]} { + LoadTimeZoneFile America/Indiana/Indianapolis +} +set TZData(:America/Indianapolis) $TZData(:America/Indiana/Indianapolis) diff --git a/env/tcl/tcl8.6/tzdata/America/Inuvik b/env/tcl/tcl8.6/tzdata/America/Inuvik new file mode 100644 index 0000000..08f0fd6 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/America/Inuvik @@ -0,0 +1,249 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:America/Inuvik) { + {-9223372036854775808 0 0 -00} + {-536457600 -28800 0 PST} + {-147888000 -21600 1 PDDT} + {-131558400 -28800 0 PST} + {315558000 -25200 0 MST} + {325674000 -21600 1 MDT} + {341395200 -25200 0 MST} + {357123600 -21600 1 MDT} + {372844800 -25200 0 MST} + {388573200 -21600 1 MDT} + {404899200 -25200 0 MST} + {420022800 -21600 1 MDT} + {436348800 -25200 0 MST} + {452077200 -21600 1 MDT} + {467798400 -25200 0 MST} + {483526800 -21600 1 MDT} + {499248000 -25200 0 MST} + {514976400 -21600 1 MDT} + {530697600 -25200 0 MST} + {544611600 -21600 1 MDT} + {562147200 -25200 0 MST} + {576061200 -21600 1 MDT} + {594201600 -25200 0 MST} + {607510800 -21600 1 MDT} + {625651200 -25200 0 MST} + {638960400 -21600 1 MDT} + {657100800 -25200 0 MST} + {671014800 -21600 1 MDT} + {688550400 -25200 0 MST} + {702464400 -21600 1 MDT} + {720000000 -25200 0 MST} + {733914000 -21600 1 MDT} + {752054400 -25200 0 MST} + {765363600 -21600 1 MDT} + {783504000 -25200 0 MST} + {796813200 -21600 1 MDT} + {814953600 -25200 0 MST} + {828867600 -21600 1 MDT} + {846403200 -25200 0 MST} + {860317200 -21600 1 MDT} + {877852800 -25200 0 MST} + {891766800 -21600 1 MDT} + {909302400 -25200 0 MST} + {923216400 -21600 1 MDT} + {941356800 -25200 0 MST} + {954666000 -21600 1 MDT} + {972806400 -25200 0 MST} + {986115600 -21600 1 MDT} + {1004256000 -25200 0 MST} + {1018170000 -21600 1 MDT} + {1035705600 -25200 0 MST} + {1049619600 -21600 1 MDT} + {1067155200 -25200 0 MST} + {1081069200 -21600 1 MDT} + {1099209600 -25200 0 MST} + {1112518800 -21600 1 MDT} + {1130659200 -25200 0 MST} + {1143968400 -21600 1 MDT} + {1162108800 -25200 0 MST} + {1173603600 -21600 1 MDT} + {1194163200 -25200 0 MST} + {1205053200 -21600 1 MDT} + {1225612800 -25200 0 MST} + {1236502800 -21600 1 MDT} + {1257062400 -25200 0 MST} + {1268557200 -21600 1 MDT} + {1289116800 -25200 0 MST} + {1300006800 -21600 1 MDT} + {1320566400 -25200 0 MST} + {1331456400 -21600 1 MDT} + {1352016000 -25200 0 MST} + {1362906000 -21600 1 MDT} + {1383465600 -25200 0 MST} + {1394355600 -21600 1 MDT} + {1414915200 -25200 0 MST} + {1425805200 -21600 1 MDT} + {1446364800 -25200 0 MST} + {1457859600 -21600 1 MDT} + {1478419200 -25200 0 MST} + {1489309200 -21600 1 MDT} + {1509868800 -25200 0 MST} + {1520758800 -21600 1 MDT} + {1541318400 -25200 0 MST} + {1552208400 -21600 1 MDT} + {1572768000 -25200 0 MST} + {1583658000 -21600 1 MDT} + {1604217600 -25200 0 MST} + {1615712400 -21600 1 MDT} + {1636272000 -25200 0 MST} + {1647162000 -21600 1 MDT} + {1667721600 -25200 0 MST} + {1678611600 -21600 1 MDT} + {1699171200 -25200 0 MST} + {1710061200 -21600 1 MDT} + {1730620800 -25200 0 MST} + {1741510800 -21600 1 MDT} + {1762070400 -25200 0 MST} + {1772960400 -21600 1 MDT} + {1793520000 -25200 0 MST} + {1805014800 -21600 1 MDT} + {1825574400 -25200 0 MST} + {1836464400 -21600 1 MDT} + {1857024000 -25200 0 MST} + {1867914000 -21600 1 MDT} + {1888473600 -25200 0 MST} + {1899363600 -21600 1 MDT} + {1919923200 -25200 0 MST} + {1930813200 -21600 1 MDT} + {1951372800 -25200 0 MST} + {1962867600 -21600 1 MDT} + {1983427200 -25200 0 MST} + {1994317200 -21600 1 MDT} + {2014876800 -25200 0 MST} + {2025766800 -21600 1 MDT} + {2046326400 -25200 0 MST} + {2057216400 -21600 1 MDT} + {2077776000 -25200 0 MST} + {2088666000 -21600 1 MDT} + {2109225600 -25200 0 MST} + {2120115600 -21600 1 MDT} + {2140675200 -25200 0 MST} + {2152170000 -21600 1 MDT} + {2172729600 -25200 0 MST} + {2183619600 -21600 1 MDT} + {2204179200 -25200 0 MST} + {2215069200 -21600 1 MDT} + {2235628800 -25200 0 MST} + {2246518800 -21600 1 MDT} + {2267078400 -25200 0 MST} + {2277968400 -21600 1 MDT} + {2298528000 -25200 0 MST} + {2309418000 -21600 1 MDT} + {2329977600 -25200 0 MST} + {2341472400 -21600 1 MDT} + {2362032000 -25200 0 MST} + {2372922000 -21600 1 MDT} + {2393481600 -25200 0 MST} + {2404371600 -21600 1 MDT} + {2424931200 -25200 0 MST} + {2435821200 -21600 1 MDT} + {2456380800 -25200 0 MST} + {2467270800 -21600 1 MDT} + {2487830400 -25200 0 MST} + {2499325200 -21600 1 MDT} + {2519884800 -25200 0 MST} + {2530774800 -21600 1 MDT} + {2551334400 -25200 0 MST} + {2562224400 -21600 1 MDT} + {2582784000 -25200 0 MST} + {2593674000 -21600 1 MDT} + {2614233600 -25200 0 MST} + {2625123600 -21600 1 MDT} + {2645683200 -25200 0 MST} + {2656573200 -21600 1 MDT} + {2677132800 -25200 0 MST} + {2688627600 -21600 1 MDT} + {2709187200 -25200 0 MST} + {2720077200 -21600 1 MDT} + {2740636800 -25200 0 MST} + {2751526800 -21600 1 MDT} + {2772086400 -25200 0 MST} + {2782976400 -21600 1 MDT} + {2803536000 -25200 0 MST} + {2814426000 -21600 1 MDT} + {2834985600 -25200 0 MST} + {2846480400 -21600 1 MDT} + {2867040000 -25200 0 MST} + {2877930000 -21600 1 MDT} + {2898489600 -25200 0 MST} + {2909379600 -21600 1 MDT} + {2929939200 -25200 0 MST} + {2940829200 -21600 1 MDT} + {2961388800 -25200 0 MST} + {2972278800 -21600 1 MDT} + {2992838400 -25200 0 MST} + {3003728400 -21600 1 MDT} + {3024288000 -25200 0 MST} + {3035782800 -21600 1 MDT} + {3056342400 -25200 0 MST} + {3067232400 -21600 1 MDT} + {3087792000 -25200 0 MST} + {3098682000 -21600 1 MDT} + {3119241600 -25200 0 MST} + {3130131600 -21600 1 MDT} + {3150691200 -25200 0 MST} + {3161581200 -21600 1 MDT} + {3182140800 -25200 0 MST} + {3193030800 -21600 1 MDT} + {3213590400 -25200 0 MST} + {3225085200 -21600 1 MDT} + {3245644800 -25200 0 MST} + {3256534800 -21600 1 MDT} + {3277094400 -25200 0 MST} + {3287984400 -21600 1 MDT} + {3308544000 -25200 0 MST} + {3319434000 -21600 1 MDT} + {3339993600 -25200 0 MST} + {3350883600 -21600 1 MDT} + {3371443200 -25200 0 MST} + {3382938000 -21600 1 MDT} + {3403497600 -25200 0 MST} + {3414387600 -21600 1 MDT} + {3434947200 -25200 0 MST} + {3445837200 -21600 1 MDT} + {3466396800 -25200 0 MST} + {3477286800 -21600 1 MDT} + {3497846400 -25200 0 MST} + {3508736400 -21600 1 MDT} + {3529296000 -25200 0 MST} + {3540186000 -21600 1 MDT} + {3560745600 -25200 0 MST} + {3572240400 -21600 1 MDT} + {3592800000 -25200 0 MST} + {3603690000 -21600 1 MDT} + {3624249600 -25200 0 MST} + {3635139600 -21600 1 MDT} + {3655699200 -25200 0 MST} + {3666589200 -21600 1 MDT} + {3687148800 -25200 0 MST} + {3698038800 -21600 1 MDT} + {3718598400 -25200 0 MST} + {3730093200 -21600 1 MDT} + {3750652800 -25200 0 MST} + {3761542800 -21600 1 MDT} + {3782102400 -25200 0 MST} + {3792992400 -21600 1 MDT} + {3813552000 -25200 0 MST} + {3824442000 -21600 1 MDT} + {3845001600 -25200 0 MST} + {3855891600 -21600 1 MDT} + {3876451200 -25200 0 MST} + {3887341200 -21600 1 MDT} + {3907900800 -25200 0 MST} + {3919395600 -21600 1 MDT} + {3939955200 -25200 0 MST} + {3950845200 -21600 1 MDT} + {3971404800 -25200 0 MST} + {3982294800 -21600 1 MDT} + {4002854400 -25200 0 MST} + {4013744400 -21600 1 MDT} + {4034304000 -25200 0 MST} + {4045194000 -21600 1 MDT} + {4065753600 -25200 0 MST} + {4076643600 -21600 1 MDT} + {4097203200 -25200 0 MST} +} diff --git a/env/tcl/tcl8.6/tzdata/America/Iqaluit b/env/tcl/tcl8.6/tzdata/America/Iqaluit new file mode 100644 index 0000000..ff82866 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/America/Iqaluit @@ -0,0 +1,250 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:America/Iqaluit) { + {-9223372036854775808 0 0 -00} + {-865296000 -14400 0 EWT} + {-769395600 -14400 1 EPT} + {-765396000 -18000 0 EST} + {-147898800 -10800 1 EDDT} + {-131569200 -18000 0 EST} + {325666800 -14400 1 EDT} + {341388000 -18000 0 EST} + {357116400 -14400 1 EDT} + {372837600 -18000 0 EST} + {388566000 -14400 1 EDT} + {404892000 -18000 0 EST} + {420015600 -14400 1 EDT} + {436341600 -18000 0 EST} + {452070000 -14400 1 EDT} + {467791200 -18000 0 EST} + {483519600 -14400 1 EDT} + {499240800 -18000 0 EST} + {514969200 -14400 1 EDT} + {530690400 -18000 0 EST} + {544604400 -14400 1 EDT} + {562140000 -18000 0 EST} + {576054000 -14400 1 EDT} + {594194400 -18000 0 EST} + {607503600 -14400 1 EDT} + {625644000 -18000 0 EST} + {638953200 -14400 1 EDT} + {657093600 -18000 0 EST} + {671007600 -14400 1 EDT} + {688543200 -18000 0 EST} + {702457200 -14400 1 EDT} + {719992800 -18000 0 EST} + {733906800 -14400 1 EDT} + {752047200 -18000 0 EST} + {765356400 -14400 1 EDT} + {783496800 -18000 0 EST} + {796806000 -14400 1 EDT} + {814946400 -18000 0 EST} + {828860400 -14400 1 EDT} + {846396000 -18000 0 EST} + {860310000 -14400 1 EDT} + {877845600 -18000 0 EST} + {891759600 -14400 1 EDT} + {909295200 -18000 0 EST} + {923209200 -14400 1 EDT} + {941353200 -21600 0 CST} + {954662400 -18000 1 CDT} + {972806400 -18000 0 EST} + {986108400 -14400 1 EDT} + {1004248800 -18000 0 EST} + {1018162800 -14400 1 EDT} + {1035698400 -18000 0 EST} + {1049612400 -14400 1 EDT} + {1067148000 -18000 0 EST} + {1081062000 -14400 1 EDT} + {1099202400 -18000 0 EST} + {1112511600 -14400 1 EDT} + {1130652000 -18000 0 EST} + {1143961200 -14400 1 EDT} + {1162101600 -18000 0 EST} + {1173596400 -14400 1 EDT} + {1194156000 -18000 0 EST} + {1205046000 -14400 1 EDT} + {1225605600 -18000 0 EST} + {1236495600 -14400 1 EDT} + {1257055200 -18000 0 EST} + {1268550000 -14400 1 EDT} + {1289109600 -18000 0 EST} + {1299999600 -14400 1 EDT} + {1320559200 -18000 0 EST} + {1331449200 -14400 1 EDT} + {1352008800 -18000 0 EST} + {1362898800 -14400 1 EDT} + {1383458400 -18000 0 EST} + {1394348400 -14400 1 EDT} + {1414908000 -18000 0 EST} + {1425798000 -14400 1 EDT} + {1446357600 -18000 0 EST} + {1457852400 -14400 1 EDT} + {1478412000 -18000 0 EST} + {1489302000 -14400 1 EDT} + {1509861600 -18000 0 EST} + {1520751600 -14400 1 EDT} + {1541311200 -18000 0 EST} + {1552201200 -14400 1 EDT} + {1572760800 -18000 0 EST} + {1583650800 -14400 1 EDT} + {1604210400 -18000 0 EST} + {1615705200 -14400 1 EDT} + {1636264800 -18000 0 EST} + {1647154800 -14400 1 EDT} + {1667714400 -18000 0 EST} + {1678604400 -14400 1 EDT} + {1699164000 -18000 0 EST} + {1710054000 -14400 1 EDT} + {1730613600 -18000 0 EST} + {1741503600 -14400 1 EDT} + {1762063200 -18000 0 EST} + {1772953200 -14400 1 EDT} + {1793512800 -18000 0 EST} + {1805007600 -14400 1 EDT} + {1825567200 -18000 0 EST} + {1836457200 -14400 1 EDT} + {1857016800 -18000 0 EST} + {1867906800 -14400 1 EDT} + {1888466400 -18000 0 EST} + {1899356400 -14400 1 EDT} + {1919916000 -18000 0 EST} + {1930806000 -14400 1 EDT} + {1951365600 -18000 0 EST} + {1962860400 -14400 1 EDT} + {1983420000 -18000 0 EST} + {1994310000 -14400 1 EDT} + {2014869600 -18000 0 EST} + {2025759600 -14400 1 EDT} + {2046319200 -18000 0 EST} + {2057209200 -14400 1 EDT} + {2077768800 -18000 0 EST} + {2088658800 -14400 1 EDT} + {2109218400 -18000 0 EST} + {2120108400 -14400 1 EDT} + {2140668000 -18000 0 EST} + {2152162800 -14400 1 EDT} + {2172722400 -18000 0 EST} + {2183612400 -14400 1 EDT} + {2204172000 -18000 0 EST} + {2215062000 -14400 1 EDT} + {2235621600 -18000 0 EST} + {2246511600 -14400 1 EDT} + {2267071200 -18000 0 EST} + {2277961200 -14400 1 EDT} + {2298520800 -18000 0 EST} + {2309410800 -14400 1 EDT} + {2329970400 -18000 0 EST} + {2341465200 -14400 1 EDT} + {2362024800 -18000 0 EST} + {2372914800 -14400 1 EDT} + {2393474400 -18000 0 EST} + {2404364400 -14400 1 EDT} + {2424924000 -18000 0 EST} + {2435814000 -14400 1 EDT} + {2456373600 -18000 0 EST} + {2467263600 -14400 1 EDT} + {2487823200 -18000 0 EST} + {2499318000 -14400 1 EDT} + {2519877600 -18000 0 EST} + {2530767600 -14400 1 EDT} + {2551327200 -18000 0 EST} + {2562217200 -14400 1 EDT} + {2582776800 -18000 0 EST} + {2593666800 -14400 1 EDT} + {2614226400 -18000 0 EST} + {2625116400 -14400 1 EDT} + {2645676000 -18000 0 EST} + {2656566000 -14400 1 EDT} + {2677125600 -18000 0 EST} + {2688620400 -14400 1 EDT} + {2709180000 -18000 0 EST} + {2720070000 -14400 1 EDT} + {2740629600 -18000 0 EST} + {2751519600 -14400 1 EDT} + {2772079200 -18000 0 EST} + {2782969200 -14400 1 EDT} + {2803528800 -18000 0 EST} + {2814418800 -14400 1 EDT} + {2834978400 -18000 0 EST} + {2846473200 -14400 1 EDT} + {2867032800 -18000 0 EST} + {2877922800 -14400 1 EDT} + {2898482400 -18000 0 EST} + {2909372400 -14400 1 EDT} + {2929932000 -18000 0 EST} + {2940822000 -14400 1 EDT} + {2961381600 -18000 0 EST} + {2972271600 -14400 1 EDT} + {2992831200 -18000 0 EST} + {3003721200 -14400 1 EDT} + {3024280800 -18000 0 EST} + {3035775600 -14400 1 EDT} + {3056335200 -18000 0 EST} + {3067225200 -14400 1 EDT} + {3087784800 -18000 0 EST} + {3098674800 -14400 1 EDT} + {3119234400 -18000 0 EST} + {3130124400 -14400 1 EDT} + {3150684000 -18000 0 EST} + {3161574000 -14400 1 EDT} + {3182133600 -18000 0 EST} + {3193023600 -14400 1 EDT} + {3213583200 -18000 0 EST} + {3225078000 -14400 1 EDT} + {3245637600 -18000 0 EST} + {3256527600 -14400 1 EDT} + {3277087200 -18000 0 EST} + {3287977200 -14400 1 EDT} + {3308536800 -18000 0 EST} + {3319426800 -14400 1 EDT} + {3339986400 -18000 0 EST} + {3350876400 -14400 1 EDT} + {3371436000 -18000 0 EST} + {3382930800 -14400 1 EDT} + {3403490400 -18000 0 EST} + {3414380400 -14400 1 EDT} + {3434940000 -18000 0 EST} + {3445830000 -14400 1 EDT} + {3466389600 -18000 0 EST} + {3477279600 -14400 1 EDT} + {3497839200 -18000 0 EST} + {3508729200 -14400 1 EDT} + {3529288800 -18000 0 EST} + {3540178800 -14400 1 EDT} + {3560738400 -18000 0 EST} + {3572233200 -14400 1 EDT} + {3592792800 -18000 0 EST} + {3603682800 -14400 1 EDT} + {3624242400 -18000 0 EST} + {3635132400 -14400 1 EDT} + {3655692000 -18000 0 EST} + {3666582000 -14400 1 EDT} + {3687141600 -18000 0 EST} + {3698031600 -14400 1 EDT} + {3718591200 -18000 0 EST} + {3730086000 -14400 1 EDT} + {3750645600 -18000 0 EST} + {3761535600 -14400 1 EDT} + {3782095200 -18000 0 EST} + {3792985200 -14400 1 EDT} + {3813544800 -18000 0 EST} + {3824434800 -14400 1 EDT} + {3844994400 -18000 0 EST} + {3855884400 -14400 1 EDT} + {3876444000 -18000 0 EST} + {3887334000 -14400 1 EDT} + {3907893600 -18000 0 EST} + {3919388400 -14400 1 EDT} + {3939948000 -18000 0 EST} + {3950838000 -14400 1 EDT} + {3971397600 -18000 0 EST} + {3982287600 -14400 1 EDT} + {4002847200 -18000 0 EST} + {4013737200 -14400 1 EDT} + {4034296800 -18000 0 EST} + {4045186800 -14400 1 EDT} + {4065746400 -18000 0 EST} + {4076636400 -14400 1 EDT} + {4097196000 -18000 0 EST} +} diff --git a/env/tcl/tcl8.6/tzdata/America/Jamaica b/env/tcl/tcl8.6/tzdata/America/Jamaica new file mode 100644 index 0000000..0f758bd --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/America/Jamaica @@ -0,0 +1,29 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:America/Jamaica) { + {-9223372036854775808 -18430 0 LMT} + {-2524503170 -18430 0 KMT} + {-1827687170 -18000 0 EST} + {126248400 -18000 0 EST} + {126687600 -14400 1 EDT} + {152085600 -18000 0 EST} + {162370800 -14400 1 EDT} + {183535200 -18000 0 EST} + {199263600 -14400 1 EDT} + {215589600 -18000 0 EST} + {230713200 -14400 1 EDT} + {247039200 -18000 0 EST} + {262767600 -14400 1 EDT} + {278488800 -18000 0 EST} + {294217200 -14400 1 EDT} + {309938400 -18000 0 EST} + {325666800 -14400 1 EDT} + {341388000 -18000 0 EST} + {357116400 -14400 1 EDT} + {372837600 -18000 0 EST} + {388566000 -14400 1 EDT} + {404892000 -18000 0 EST} + {420015600 -14400 1 EDT} + {436341600 -18000 0 EST} + {441781200 -18000 0 EST} +} diff --git a/env/tcl/tcl8.6/tzdata/America/Jujuy b/env/tcl/tcl8.6/tzdata/America/Jujuy new file mode 100644 index 0000000..b4c5da3 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/America/Jujuy @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(America/Argentina/Jujuy)]} { + LoadTimeZoneFile America/Argentina/Jujuy +} +set TZData(:America/Jujuy) $TZData(:America/Argentina/Jujuy) diff --git a/env/tcl/tcl8.6/tzdata/America/Juneau b/env/tcl/tcl8.6/tzdata/America/Juneau new file mode 100644 index 0000000..070a27a --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/America/Juneau @@ -0,0 +1,276 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:America/Juneau) { + {-9223372036854775808 54139 0 LMT} + {-3225223727 -32261 0 LMT} + {-2188954939 -28800 0 PST} + {-883584000 -28800 0 PST} + {-880207200 -25200 1 PWT} + {-769395600 -25200 1 PPT} + {-765385200 -28800 0 PST} + {-757353600 -28800 0 PST} + {-31507200 -28800 0 PST} + {-21477600 -25200 1 PDT} + {-5756400 -28800 0 PST} + {9972000 -25200 1 PDT} + {25693200 -28800 0 PST} + {41421600 -25200 1 PDT} + {57747600 -28800 0 PST} + {73476000 -25200 1 PDT} + {89197200 -28800 0 PST} + {104925600 -25200 1 PDT} + {120646800 -28800 0 PST} + {126698400 -25200 1 PDT} + {152096400 -28800 0 PST} + {162381600 -25200 1 PDT} + {183546000 -28800 0 PST} + {199274400 -25200 1 PDT} + {215600400 -28800 0 PST} + {230724000 -25200 1 PDT} + {247050000 -28800 0 PST} + {262778400 -25200 1 PDT} + {278499600 -28800 0 PST} + {294228000 -25200 1 PDT} + {309949200 -28800 0 PST} + {325677600 -32400 0 YST} + {325681200 -28800 1 YDT} + {341406000 -28800 0 PST} + {357127200 -25200 1 PDT} + {372848400 -28800 0 PST} + {388576800 -25200 1 PDT} + {404902800 -28800 0 PST} + {420026400 -25200 1 PDT} + {439030800 -32400 0 AKST} + {452084400 -28800 1 AKDT} + {467805600 -32400 0 AKST} + {483534000 -28800 1 AKDT} + {499255200 -32400 0 AKST} + {514983600 -28800 1 AKDT} + {530704800 -32400 0 AKST} + {544618800 -28800 1 AKDT} + {562154400 -32400 0 AKST} + {576068400 -28800 1 AKDT} + {594208800 -32400 0 AKST} + {607518000 -28800 1 AKDT} + {625658400 -32400 0 AKST} + {638967600 -28800 1 AKDT} + {657108000 -32400 0 AKST} + {671022000 -28800 1 AKDT} + {688557600 -32400 0 AKST} + {702471600 -28800 1 AKDT} + {720007200 -32400 0 AKST} + {733921200 -28800 1 AKDT} + {752061600 -32400 0 AKST} + {765370800 -28800 1 AKDT} + {783511200 -32400 0 AKST} + {796820400 -28800 1 AKDT} + {814960800 -32400 0 AKST} + {828874800 -28800 1 AKDT} + {846410400 -32400 0 AKST} + {860324400 -28800 1 AKDT} + {877860000 -32400 0 AKST} + {891774000 -28800 1 AKDT} + {909309600 -32400 0 AKST} + {923223600 -28800 1 AKDT} + {941364000 -32400 0 AKST} + {954673200 -28800 1 AKDT} + {972813600 -32400 0 AKST} + {986122800 -28800 1 AKDT} + {1004263200 -32400 0 AKST} + {1018177200 -28800 1 AKDT} + {1035712800 -32400 0 AKST} + {1049626800 -28800 1 AKDT} + {1067162400 -32400 0 AKST} + {1081076400 -28800 1 AKDT} + {1099216800 -32400 0 AKST} + {1112526000 -28800 1 AKDT} + {1130666400 -32400 0 AKST} + {1143975600 -28800 1 AKDT} + {1162116000 -32400 0 AKST} + {1173610800 -28800 1 AKDT} + {1194170400 -32400 0 AKST} + {1205060400 -28800 1 AKDT} + {1225620000 -32400 0 AKST} + {1236510000 -28800 1 AKDT} + {1257069600 -32400 0 AKST} + {1268564400 -28800 1 AKDT} + {1289124000 -32400 0 AKST} + {1300014000 -28800 1 AKDT} + {1320573600 -32400 0 AKST} + {1331463600 -28800 1 AKDT} + {1352023200 -32400 0 AKST} + {1362913200 -28800 1 AKDT} + {1383472800 -32400 0 AKST} + {1394362800 -28800 1 AKDT} + {1414922400 -32400 0 AKST} + {1425812400 -28800 1 AKDT} + {1446372000 -32400 0 AKST} + {1457866800 -28800 1 AKDT} + {1478426400 -32400 0 AKST} + {1489316400 -28800 1 AKDT} + {1509876000 -32400 0 AKST} + {1520766000 -28800 1 AKDT} + {1541325600 -32400 0 AKST} + {1552215600 -28800 1 AKDT} + {1572775200 -32400 0 AKST} + {1583665200 -28800 1 AKDT} + {1604224800 -32400 0 AKST} + {1615719600 -28800 1 AKDT} + {1636279200 -32400 0 AKST} + {1647169200 -28800 1 AKDT} + {1667728800 -32400 0 AKST} + {1678618800 -28800 1 AKDT} + {1699178400 -32400 0 AKST} + {1710068400 -28800 1 AKDT} + {1730628000 -32400 0 AKST} + {1741518000 -28800 1 AKDT} + {1762077600 -32400 0 AKST} + {1772967600 -28800 1 AKDT} + {1793527200 -32400 0 AKST} + {1805022000 -28800 1 AKDT} + {1825581600 -32400 0 AKST} + {1836471600 -28800 1 AKDT} + {1857031200 -32400 0 AKST} + {1867921200 -28800 1 AKDT} + {1888480800 -32400 0 AKST} + {1899370800 -28800 1 AKDT} + {1919930400 -32400 0 AKST} + {1930820400 -28800 1 AKDT} + {1951380000 -32400 0 AKST} + {1962874800 -28800 1 AKDT} + {1983434400 -32400 0 AKST} + {1994324400 -28800 1 AKDT} + {2014884000 -32400 0 AKST} + {2025774000 -28800 1 AKDT} + {2046333600 -32400 0 AKST} + {2057223600 -28800 1 AKDT} + {2077783200 -32400 0 AKST} + {2088673200 -28800 1 AKDT} + {2109232800 -32400 0 AKST} + {2120122800 -28800 1 AKDT} + {2140682400 -32400 0 AKST} + {2152177200 -28800 1 AKDT} + {2172736800 -32400 0 AKST} + {2183626800 -28800 1 AKDT} + {2204186400 -32400 0 AKST} + {2215076400 -28800 1 AKDT} + {2235636000 -32400 0 AKST} + {2246526000 -28800 1 AKDT} + {2267085600 -32400 0 AKST} + {2277975600 -28800 1 AKDT} + {2298535200 -32400 0 AKST} + {2309425200 -28800 1 AKDT} + {2329984800 -32400 0 AKST} + {2341479600 -28800 1 AKDT} + {2362039200 -32400 0 AKST} + {2372929200 -28800 1 AKDT} + {2393488800 -32400 0 AKST} + {2404378800 -28800 1 AKDT} + {2424938400 -32400 0 AKST} + {2435828400 -28800 1 AKDT} + {2456388000 -32400 0 AKST} + {2467278000 -28800 1 AKDT} + {2487837600 -32400 0 AKST} + {2499332400 -28800 1 AKDT} + {2519892000 -32400 0 AKST} + {2530782000 -28800 1 AKDT} + {2551341600 -32400 0 AKST} + {2562231600 -28800 1 AKDT} + {2582791200 -32400 0 AKST} + {2593681200 -28800 1 AKDT} + {2614240800 -32400 0 AKST} + {2625130800 -28800 1 AKDT} + {2645690400 -32400 0 AKST} + {2656580400 -28800 1 AKDT} + {2677140000 -32400 0 AKST} + {2688634800 -28800 1 AKDT} + {2709194400 -32400 0 AKST} + {2720084400 -28800 1 AKDT} + {2740644000 -32400 0 AKST} + {2751534000 -28800 1 AKDT} + {2772093600 -32400 0 AKST} + {2782983600 -28800 1 AKDT} + {2803543200 -32400 0 AKST} + {2814433200 -28800 1 AKDT} + {2834992800 -32400 0 AKST} + {2846487600 -28800 1 AKDT} + {2867047200 -32400 0 AKST} + {2877937200 -28800 1 AKDT} + {2898496800 -32400 0 AKST} + {2909386800 -28800 1 AKDT} + {2929946400 -32400 0 AKST} + {2940836400 -28800 1 AKDT} + {2961396000 -32400 0 AKST} + {2972286000 -28800 1 AKDT} + {2992845600 -32400 0 AKST} + {3003735600 -28800 1 AKDT} + {3024295200 -32400 0 AKST} + {3035790000 -28800 1 AKDT} + {3056349600 -32400 0 AKST} + {3067239600 -28800 1 AKDT} + {3087799200 -32400 0 AKST} + {3098689200 -28800 1 AKDT} + {3119248800 -32400 0 AKST} + {3130138800 -28800 1 AKDT} + {3150698400 -32400 0 AKST} + {3161588400 -28800 1 AKDT} + {3182148000 -32400 0 AKST} + {3193038000 -28800 1 AKDT} + {3213597600 -32400 0 AKST} + {3225092400 -28800 1 AKDT} + {3245652000 -32400 0 AKST} + {3256542000 -28800 1 AKDT} + {3277101600 -32400 0 AKST} + {3287991600 -28800 1 AKDT} + {3308551200 -32400 0 AKST} + {3319441200 -28800 1 AKDT} + {3340000800 -32400 0 AKST} + {3350890800 -28800 1 AKDT} + {3371450400 -32400 0 AKST} + {3382945200 -28800 1 AKDT} + {3403504800 -32400 0 AKST} + {3414394800 -28800 1 AKDT} + {3434954400 -32400 0 AKST} + {3445844400 -28800 1 AKDT} + {3466404000 -32400 0 AKST} + {3477294000 -28800 1 AKDT} + {3497853600 -32400 0 AKST} + {3508743600 -28800 1 AKDT} + {3529303200 -32400 0 AKST} + {3540193200 -28800 1 AKDT} + {3560752800 -32400 0 AKST} + {3572247600 -28800 1 AKDT} + {3592807200 -32400 0 AKST} + {3603697200 -28800 1 AKDT} + {3624256800 -32400 0 AKST} + {3635146800 -28800 1 AKDT} + {3655706400 -32400 0 AKST} + {3666596400 -28800 1 AKDT} + {3687156000 -32400 0 AKST} + {3698046000 -28800 1 AKDT} + {3718605600 -32400 0 AKST} + {3730100400 -28800 1 AKDT} + {3750660000 -32400 0 AKST} + {3761550000 -28800 1 AKDT} + {3782109600 -32400 0 AKST} + {3792999600 -28800 1 AKDT} + {3813559200 -32400 0 AKST} + {3824449200 -28800 1 AKDT} + {3845008800 -32400 0 AKST} + {3855898800 -28800 1 AKDT} + {3876458400 -32400 0 AKST} + {3887348400 -28800 1 AKDT} + {3907908000 -32400 0 AKST} + {3919402800 -28800 1 AKDT} + {3939962400 -32400 0 AKST} + {3950852400 -28800 1 AKDT} + {3971412000 -32400 0 AKST} + {3982302000 -28800 1 AKDT} + {4002861600 -32400 0 AKST} + {4013751600 -28800 1 AKDT} + {4034311200 -32400 0 AKST} + {4045201200 -28800 1 AKDT} + {4065760800 -32400 0 AKST} + {4076650800 -28800 1 AKDT} + {4097210400 -32400 0 AKST} +} diff --git a/env/tcl/tcl8.6/tzdata/America/Kentucky/Louisville b/env/tcl/tcl8.6/tzdata/America/Kentucky/Louisville new file mode 100644 index 0000000..c2aa10c --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/America/Kentucky/Louisville @@ -0,0 +1,314 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:America/Kentucky/Louisville) { + {-9223372036854775808 -20582 0 LMT} + {-2717647200 -21600 0 CST} + {-1633276800 -18000 1 CDT} + {-1615136400 -21600 0 CST} + {-1601827200 -18000 1 CDT} + {-1583686800 -21600 0 CST} + {-1546279200 -21600 0 CST} + {-1535904000 -18000 1 CDT} + {-1525280400 -21600 0 CST} + {-905097600 -18000 1 CDT} + {-891795600 -21600 0 CST} + {-883591200 -21600 0 CST} + {-880214400 -18000 1 CWT} + {-769395600 -18000 1 CPT} + {-765392400 -21600 0 CST} + {-757360800 -21600 0 CST} + {-747244800 -18000 1 CDT} + {-744224400 -21600 0 CST} + {-715795200 -18000 1 CDT} + {-684349200 -18000 1 CDT} + {-652899600 -18000 1 CDT} + {-620845200 -18000 1 CDT} + {-608144400 -21600 0 CST} + {-589392000 -18000 1 CDT} + {-576090000 -21600 0 CST} + {-557942400 -18000 1 CDT} + {-544640400 -21600 0 CST} + {-526492800 -18000 1 CDT} + {-513190800 -21600 0 CST} + {-495043200 -18000 1 CDT} + {-481741200 -21600 0 CST} + {-463593600 -18000 1 CDT} + {-450291600 -21600 0 CST} + {-431539200 -18000 1 CDT} + {-415818000 -21600 0 CST} + {-400089600 -18000 1 CDT} + {-384368400 -21600 0 CST} + {-368640000 -18000 1 CDT} + {-352918800 -21600 0 CST} + {-337190400 -18000 1 CDT} + {-321469200 -21600 0 CST} + {-305740800 -18000 1 CDT} + {-289414800 -21600 0 CST} + {-273686400 -18000 1 CDT} + {-266432400 -18000 0 EST} + {-63140400 -18000 0 EST} + {-52938000 -14400 1 EDT} + {-37216800 -18000 0 EST} + {-21488400 -14400 1 EDT} + {-5767200 -18000 0 EST} + {9961200 -14400 1 EDT} + {25682400 -18000 0 EST} + {41410800 -14400 1 EDT} + {57736800 -18000 0 EST} + {73465200 -14400 1 EDT} + {89186400 -18000 0 EST} + {104914800 -14400 1 EDT} + {120636000 -18000 0 EST} + {126687600 -18000 1 CDT} + {152089200 -18000 0 EST} + {162370800 -14400 1 EDT} + {183535200 -18000 0 EST} + {199263600 -14400 1 EDT} + {215589600 -18000 0 EST} + {230713200 -14400 1 EDT} + {247039200 -18000 0 EST} + {262767600 -14400 1 EDT} + {278488800 -18000 0 EST} + {294217200 -14400 1 EDT} + {309938400 -18000 0 EST} + {325666800 -14400 1 EDT} + {341388000 -18000 0 EST} + {357116400 -14400 1 EDT} + {372837600 -18000 0 EST} + {388566000 -14400 1 EDT} + {404892000 -18000 0 EST} + {420015600 -14400 1 EDT} + {436341600 -18000 0 EST} + {452070000 -14400 1 EDT} + {467791200 -18000 0 EST} + {483519600 -14400 1 EDT} + {499240800 -18000 0 EST} + {514969200 -14400 1 EDT} + {530690400 -18000 0 EST} + {544604400 -14400 1 EDT} + {562140000 -18000 0 EST} + {576054000 -14400 1 EDT} + {594194400 -18000 0 EST} + {607503600 -14400 1 EDT} + {625644000 -18000 0 EST} + {638953200 -14400 1 EDT} + {657093600 -18000 0 EST} + {671007600 -14400 1 EDT} + {688543200 -18000 0 EST} + {702457200 -14400 1 EDT} + {719992800 -18000 0 EST} + {733906800 -14400 1 EDT} + {752047200 -18000 0 EST} + {765356400 -14400 1 EDT} + {783496800 -18000 0 EST} + {796806000 -14400 1 EDT} + {814946400 -18000 0 EST} + {828860400 -14400 1 EDT} + {846396000 -18000 0 EST} + {860310000 -14400 1 EDT} + {877845600 -18000 0 EST} + {891759600 -14400 1 EDT} + {909295200 -18000 0 EST} + {923209200 -14400 1 EDT} + {941349600 -18000 0 EST} + {954658800 -14400 1 EDT} + {972799200 -18000 0 EST} + {986108400 -14400 1 EDT} + {1004248800 -18000 0 EST} + {1018162800 -14400 1 EDT} + {1035698400 -18000 0 EST} + {1049612400 -14400 1 EDT} + {1067148000 -18000 0 EST} + {1081062000 -14400 1 EDT} + {1099202400 -18000 0 EST} + {1112511600 -14400 1 EDT} + {1130652000 -18000 0 EST} + {1143961200 -14400 1 EDT} + {1162101600 -18000 0 EST} + {1173596400 -14400 1 EDT} + {1194156000 -18000 0 EST} + {1205046000 -14400 1 EDT} + {1225605600 -18000 0 EST} + {1236495600 -14400 1 EDT} + {1257055200 -18000 0 EST} + {1268550000 -14400 1 EDT} + {1289109600 -18000 0 EST} + {1299999600 -14400 1 EDT} + {1320559200 -18000 0 EST} + {1331449200 -14400 1 EDT} + {1352008800 -18000 0 EST} + {1362898800 -14400 1 EDT} + {1383458400 -18000 0 EST} + {1394348400 -14400 1 EDT} + {1414908000 -18000 0 EST} + {1425798000 -14400 1 EDT} + {1446357600 -18000 0 EST} + {1457852400 -14400 1 EDT} + {1478412000 -18000 0 EST} + {1489302000 -14400 1 EDT} + {1509861600 -18000 0 EST} + {1520751600 -14400 1 EDT} + {1541311200 -18000 0 EST} + {1552201200 -14400 1 EDT} + {1572760800 -18000 0 EST} + {1583650800 -14400 1 EDT} + {1604210400 -18000 0 EST} + {1615705200 -14400 1 EDT} + {1636264800 -18000 0 EST} + {1647154800 -14400 1 EDT} + {1667714400 -18000 0 EST} + {1678604400 -14400 1 EDT} + {1699164000 -18000 0 EST} + {1710054000 -14400 1 EDT} + {1730613600 -18000 0 EST} + {1741503600 -14400 1 EDT} + {1762063200 -18000 0 EST} + {1772953200 -14400 1 EDT} + {1793512800 -18000 0 EST} + {1805007600 -14400 1 EDT} + {1825567200 -18000 0 EST} + {1836457200 -14400 1 EDT} + {1857016800 -18000 0 EST} + {1867906800 -14400 1 EDT} + {1888466400 -18000 0 EST} + {1899356400 -14400 1 EDT} + {1919916000 -18000 0 EST} + {1930806000 -14400 1 EDT} + {1951365600 -18000 0 EST} + {1962860400 -14400 1 EDT} + {1983420000 -18000 0 EST} + {1994310000 -14400 1 EDT} + {2014869600 -18000 0 EST} + {2025759600 -14400 1 EDT} + {2046319200 -18000 0 EST} + {2057209200 -14400 1 EDT} + {2077768800 -18000 0 EST} + {2088658800 -14400 1 EDT} + {2109218400 -18000 0 EST} + {2120108400 -14400 1 EDT} + {2140668000 -18000 0 EST} + {2152162800 -14400 1 EDT} + {2172722400 -18000 0 EST} + {2183612400 -14400 1 EDT} + {2204172000 -18000 0 EST} + {2215062000 -14400 1 EDT} + {2235621600 -18000 0 EST} + {2246511600 -14400 1 EDT} + {2267071200 -18000 0 EST} + {2277961200 -14400 1 EDT} + {2298520800 -18000 0 EST} + {2309410800 -14400 1 EDT} + {2329970400 -18000 0 EST} + {2341465200 -14400 1 EDT} + {2362024800 -18000 0 EST} + {2372914800 -14400 1 EDT} + {2393474400 -18000 0 EST} + {2404364400 -14400 1 EDT} + {2424924000 -18000 0 EST} + {2435814000 -14400 1 EDT} + {2456373600 -18000 0 EST} + {2467263600 -14400 1 EDT} + {2487823200 -18000 0 EST} + {2499318000 -14400 1 EDT} + {2519877600 -18000 0 EST} + {2530767600 -14400 1 EDT} + {2551327200 -18000 0 EST} + {2562217200 -14400 1 EDT} + {2582776800 -18000 0 EST} + {2593666800 -14400 1 EDT} + {2614226400 -18000 0 EST} + {2625116400 -14400 1 EDT} + {2645676000 -18000 0 EST} + {2656566000 -14400 1 EDT} + {2677125600 -18000 0 EST} + {2688620400 -14400 1 EDT} + {2709180000 -18000 0 EST} + {2720070000 -14400 1 EDT} + {2740629600 -18000 0 EST} + {2751519600 -14400 1 EDT} + {2772079200 -18000 0 EST} + {2782969200 -14400 1 EDT} + {2803528800 -18000 0 EST} + {2814418800 -14400 1 EDT} + {2834978400 -18000 0 EST} + {2846473200 -14400 1 EDT} + {2867032800 -18000 0 EST} + {2877922800 -14400 1 EDT} + {2898482400 -18000 0 EST} + {2909372400 -14400 1 EDT} + {2929932000 -18000 0 EST} + {2940822000 -14400 1 EDT} + {2961381600 -18000 0 EST} + {2972271600 -14400 1 EDT} + {2992831200 -18000 0 EST} + {3003721200 -14400 1 EDT} + {3024280800 -18000 0 EST} + {3035775600 -14400 1 EDT} + {3056335200 -18000 0 EST} + {3067225200 -14400 1 EDT} + {3087784800 -18000 0 EST} + {3098674800 -14400 1 EDT} + {3119234400 -18000 0 EST} + {3130124400 -14400 1 EDT} + {3150684000 -18000 0 EST} + {3161574000 -14400 1 EDT} + {3182133600 -18000 0 EST} + {3193023600 -14400 1 EDT} + {3213583200 -18000 0 EST} + {3225078000 -14400 1 EDT} + {3245637600 -18000 0 EST} + {3256527600 -14400 1 EDT} + {3277087200 -18000 0 EST} + {3287977200 -14400 1 EDT} + {3308536800 -18000 0 EST} + {3319426800 -14400 1 EDT} + {3339986400 -18000 0 EST} + {3350876400 -14400 1 EDT} + {3371436000 -18000 0 EST} + {3382930800 -14400 1 EDT} + {3403490400 -18000 0 EST} + {3414380400 -14400 1 EDT} + {3434940000 -18000 0 EST} + {3445830000 -14400 1 EDT} + {3466389600 -18000 0 EST} + {3477279600 -14400 1 EDT} + {3497839200 -18000 0 EST} + {3508729200 -14400 1 EDT} + {3529288800 -18000 0 EST} + {3540178800 -14400 1 EDT} + {3560738400 -18000 0 EST} + {3572233200 -14400 1 EDT} + {3592792800 -18000 0 EST} + {3603682800 -14400 1 EDT} + {3624242400 -18000 0 EST} + {3635132400 -14400 1 EDT} + {3655692000 -18000 0 EST} + {3666582000 -14400 1 EDT} + {3687141600 -18000 0 EST} + {3698031600 -14400 1 EDT} + {3718591200 -18000 0 EST} + {3730086000 -14400 1 EDT} + {3750645600 -18000 0 EST} + {3761535600 -14400 1 EDT} + {3782095200 -18000 0 EST} + {3792985200 -14400 1 EDT} + {3813544800 -18000 0 EST} + {3824434800 -14400 1 EDT} + {3844994400 -18000 0 EST} + {3855884400 -14400 1 EDT} + {3876444000 -18000 0 EST} + {3887334000 -14400 1 EDT} + {3907893600 -18000 0 EST} + {3919388400 -14400 1 EDT} + {3939948000 -18000 0 EST} + {3950838000 -14400 1 EDT} + {3971397600 -18000 0 EST} + {3982287600 -14400 1 EDT} + {4002847200 -18000 0 EST} + {4013737200 -14400 1 EDT} + {4034296800 -18000 0 EST} + {4045186800 -14400 1 EDT} + {4065746400 -18000 0 EST} + {4076636400 -14400 1 EDT} + {4097196000 -18000 0 EST} +} diff --git a/env/tcl/tcl8.6/tzdata/America/Kentucky/Monticello b/env/tcl/tcl8.6/tzdata/America/Kentucky/Monticello new file mode 100644 index 0000000..e523ecb --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/America/Kentucky/Monticello @@ -0,0 +1,279 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:America/Kentucky/Monticello) { + {-9223372036854775808 -20364 0 LMT} + {-2717647200 -21600 0 CST} + {-1633276800 -18000 1 CDT} + {-1615136400 -21600 0 CST} + {-1601827200 -18000 1 CDT} + {-1583686800 -21600 0 CST} + {-880214400 -18000 1 CWT} + {-769395600 -18000 1 CPT} + {-765392400 -21600 0 CST} + {-757360800 -21600 0 CST} + {-63136800 -21600 0 CST} + {-52934400 -18000 1 CDT} + {-37213200 -21600 0 CST} + {-21484800 -18000 1 CDT} + {-5763600 -21600 0 CST} + {9964800 -18000 1 CDT} + {25686000 -21600 0 CST} + {41414400 -18000 1 CDT} + {57740400 -21600 0 CST} + {73468800 -18000 1 CDT} + {89190000 -21600 0 CST} + {104918400 -18000 1 CDT} + {120639600 -21600 0 CST} + {126691200 -18000 1 CDT} + {152089200 -21600 0 CST} + {162374400 -18000 1 CDT} + {183538800 -21600 0 CST} + {199267200 -18000 1 CDT} + {215593200 -21600 0 CST} + {230716800 -18000 1 CDT} + {247042800 -21600 0 CST} + {262771200 -18000 1 CDT} + {278492400 -21600 0 CST} + {294220800 -18000 1 CDT} + {309942000 -21600 0 CST} + {325670400 -18000 1 CDT} + {341391600 -21600 0 CST} + {357120000 -18000 1 CDT} + {372841200 -21600 0 CST} + {388569600 -18000 1 CDT} + {404895600 -21600 0 CST} + {420019200 -18000 1 CDT} + {436345200 -21600 0 CST} + {452073600 -18000 1 CDT} + {467794800 -21600 0 CST} + {483523200 -18000 1 CDT} + {499244400 -21600 0 CST} + {514972800 -18000 1 CDT} + {530694000 -21600 0 CST} + {544608000 -18000 1 CDT} + {562143600 -21600 0 CST} + {576057600 -18000 1 CDT} + {594198000 -21600 0 CST} + {607507200 -18000 1 CDT} + {625647600 -21600 0 CST} + {638956800 -18000 1 CDT} + {657097200 -21600 0 CST} + {671011200 -18000 1 CDT} + {688546800 -21600 0 CST} + {702460800 -18000 1 CDT} + {719996400 -21600 0 CST} + {733910400 -18000 1 CDT} + {752050800 -21600 0 CST} + {765360000 -18000 1 CDT} + {783500400 -21600 0 CST} + {796809600 -18000 1 CDT} + {814950000 -21600 0 CST} + {828864000 -18000 1 CDT} + {846399600 -21600 0 CST} + {860313600 -18000 1 CDT} + {877849200 -21600 0 CST} + {891763200 -18000 1 CDT} + {909298800 -21600 0 CST} + {923212800 -18000 1 CDT} + {941353200 -21600 0 CST} + {954662400 -18000 1 CDT} + {972806400 -18000 0 EST} + {986108400 -14400 1 EDT} + {1004248800 -18000 0 EST} + {1018162800 -14400 1 EDT} + {1035698400 -18000 0 EST} + {1049612400 -14400 1 EDT} + {1067148000 -18000 0 EST} + {1081062000 -14400 1 EDT} + {1099202400 -18000 0 EST} + {1112511600 -14400 1 EDT} + {1130652000 -18000 0 EST} + {1143961200 -14400 1 EDT} + {1162101600 -18000 0 EST} + {1173596400 -14400 1 EDT} + {1194156000 -18000 0 EST} + {1205046000 -14400 1 EDT} + {1225605600 -18000 0 EST} + {1236495600 -14400 1 EDT} + {1257055200 -18000 0 EST} + {1268550000 -14400 1 EDT} + {1289109600 -18000 0 EST} + {1299999600 -14400 1 EDT} + {1320559200 -18000 0 EST} + {1331449200 -14400 1 EDT} + {1352008800 -18000 0 EST} + {1362898800 -14400 1 EDT} + {1383458400 -18000 0 EST} + {1394348400 -14400 1 EDT} + {1414908000 -18000 0 EST} + {1425798000 -14400 1 EDT} + {1446357600 -18000 0 EST} + {1457852400 -14400 1 EDT} + {1478412000 -18000 0 EST} + {1489302000 -14400 1 EDT} + {1509861600 -18000 0 EST} + {1520751600 -14400 1 EDT} + {1541311200 -18000 0 EST} + {1552201200 -14400 1 EDT} + {1572760800 -18000 0 EST} + {1583650800 -14400 1 EDT} + {1604210400 -18000 0 EST} + {1615705200 -14400 1 EDT} + {1636264800 -18000 0 EST} + {1647154800 -14400 1 EDT} + {1667714400 -18000 0 EST} + {1678604400 -14400 1 EDT} + {1699164000 -18000 0 EST} + {1710054000 -14400 1 EDT} + {1730613600 -18000 0 EST} + {1741503600 -14400 1 EDT} + {1762063200 -18000 0 EST} + {1772953200 -14400 1 EDT} + {1793512800 -18000 0 EST} + {1805007600 -14400 1 EDT} + {1825567200 -18000 0 EST} + {1836457200 -14400 1 EDT} + {1857016800 -18000 0 EST} + {1867906800 -14400 1 EDT} + {1888466400 -18000 0 EST} + {1899356400 -14400 1 EDT} + {1919916000 -18000 0 EST} + {1930806000 -14400 1 EDT} + {1951365600 -18000 0 EST} + {1962860400 -14400 1 EDT} + {1983420000 -18000 0 EST} + {1994310000 -14400 1 EDT} + {2014869600 -18000 0 EST} + {2025759600 -14400 1 EDT} + {2046319200 -18000 0 EST} + {2057209200 -14400 1 EDT} + {2077768800 -18000 0 EST} + {2088658800 -14400 1 EDT} + {2109218400 -18000 0 EST} + {2120108400 -14400 1 EDT} + {2140668000 -18000 0 EST} + {2152162800 -14400 1 EDT} + {2172722400 -18000 0 EST} + {2183612400 -14400 1 EDT} + {2204172000 -18000 0 EST} + {2215062000 -14400 1 EDT} + {2235621600 -18000 0 EST} + {2246511600 -14400 1 EDT} + {2267071200 -18000 0 EST} + {2277961200 -14400 1 EDT} + {2298520800 -18000 0 EST} + {2309410800 -14400 1 EDT} + {2329970400 -18000 0 EST} + {2341465200 -14400 1 EDT} + {2362024800 -18000 0 EST} + {2372914800 -14400 1 EDT} + {2393474400 -18000 0 EST} + {2404364400 -14400 1 EDT} + {2424924000 -18000 0 EST} + {2435814000 -14400 1 EDT} + {2456373600 -18000 0 EST} + {2467263600 -14400 1 EDT} + {2487823200 -18000 0 EST} + {2499318000 -14400 1 EDT} + {2519877600 -18000 0 EST} + {2530767600 -14400 1 EDT} + {2551327200 -18000 0 EST} + {2562217200 -14400 1 EDT} + {2582776800 -18000 0 EST} + {2593666800 -14400 1 EDT} + {2614226400 -18000 0 EST} + {2625116400 -14400 1 EDT} + {2645676000 -18000 0 EST} + {2656566000 -14400 1 EDT} + {2677125600 -18000 0 EST} + {2688620400 -14400 1 EDT} + {2709180000 -18000 0 EST} + {2720070000 -14400 1 EDT} + {2740629600 -18000 0 EST} + {2751519600 -14400 1 EDT} + {2772079200 -18000 0 EST} + {2782969200 -14400 1 EDT} + {2803528800 -18000 0 EST} + {2814418800 -14400 1 EDT} + {2834978400 -18000 0 EST} + {2846473200 -14400 1 EDT} + {2867032800 -18000 0 EST} + {2877922800 -14400 1 EDT} + {2898482400 -18000 0 EST} + {2909372400 -14400 1 EDT} + {2929932000 -18000 0 EST} + {2940822000 -14400 1 EDT} + {2961381600 -18000 0 EST} + {2972271600 -14400 1 EDT} + {2992831200 -18000 0 EST} + {3003721200 -14400 1 EDT} + {3024280800 -18000 0 EST} + {3035775600 -14400 1 EDT} + {3056335200 -18000 0 EST} + {3067225200 -14400 1 EDT} + {3087784800 -18000 0 EST} + {3098674800 -14400 1 EDT} + {3119234400 -18000 0 EST} + {3130124400 -14400 1 EDT} + {3150684000 -18000 0 EST} + {3161574000 -14400 1 EDT} + {3182133600 -18000 0 EST} + {3193023600 -14400 1 EDT} + {3213583200 -18000 0 EST} + {3225078000 -14400 1 EDT} + {3245637600 -18000 0 EST} + {3256527600 -14400 1 EDT} + {3277087200 -18000 0 EST} + {3287977200 -14400 1 EDT} + {3308536800 -18000 0 EST} + {3319426800 -14400 1 EDT} + {3339986400 -18000 0 EST} + {3350876400 -14400 1 EDT} + {3371436000 -18000 0 EST} + {3382930800 -14400 1 EDT} + {3403490400 -18000 0 EST} + {3414380400 -14400 1 EDT} + {3434940000 -18000 0 EST} + {3445830000 -14400 1 EDT} + {3466389600 -18000 0 EST} + {3477279600 -14400 1 EDT} + {3497839200 -18000 0 EST} + {3508729200 -14400 1 EDT} + {3529288800 -18000 0 EST} + {3540178800 -14400 1 EDT} + {3560738400 -18000 0 EST} + {3572233200 -14400 1 EDT} + {3592792800 -18000 0 EST} + {3603682800 -14400 1 EDT} + {3624242400 -18000 0 EST} + {3635132400 -14400 1 EDT} + {3655692000 -18000 0 EST} + {3666582000 -14400 1 EDT} + {3687141600 -18000 0 EST} + {3698031600 -14400 1 EDT} + {3718591200 -18000 0 EST} + {3730086000 -14400 1 EDT} + {3750645600 -18000 0 EST} + {3761535600 -14400 1 EDT} + {3782095200 -18000 0 EST} + {3792985200 -14400 1 EDT} + {3813544800 -18000 0 EST} + {3824434800 -14400 1 EDT} + {3844994400 -18000 0 EST} + {3855884400 -14400 1 EDT} + {3876444000 -18000 0 EST} + {3887334000 -14400 1 EDT} + {3907893600 -18000 0 EST} + {3919388400 -14400 1 EDT} + {3939948000 -18000 0 EST} + {3950838000 -14400 1 EDT} + {3971397600 -18000 0 EST} + {3982287600 -14400 1 EDT} + {4002847200 -18000 0 EST} + {4013737200 -14400 1 EDT} + {4034296800 -18000 0 EST} + {4045186800 -14400 1 EDT} + {4065746400 -18000 0 EST} + {4076636400 -14400 1 EDT} + {4097196000 -18000 0 EST} +} diff --git a/env/tcl/tcl8.6/tzdata/America/Knox_IN b/env/tcl/tcl8.6/tzdata/America/Knox_IN new file mode 100644 index 0000000..00d21c0 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/America/Knox_IN @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(America/Indiana/Knox)]} { + LoadTimeZoneFile America/Indiana/Knox +} +set TZData(:America/Knox_IN) $TZData(:America/Indiana/Knox) diff --git a/env/tcl/tcl8.6/tzdata/America/Kralendijk b/env/tcl/tcl8.6/tzdata/America/Kralendijk new file mode 100644 index 0000000..8b6db86 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/America/Kralendijk @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(America/Curacao)]} { + LoadTimeZoneFile America/Curacao +} +set TZData(:America/Kralendijk) $TZData(:America/Curacao) diff --git a/env/tcl/tcl8.6/tzdata/America/La_Paz b/env/tcl/tcl8.6/tzdata/America/La_Paz new file mode 100644 index 0000000..ea2f711 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/America/La_Paz @@ -0,0 +1,8 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:America/La_Paz) { + {-9223372036854775808 -16356 0 LMT} + {-2524505244 -16356 0 CMT} + {-1205954844 -12756 1 BST} + {-1192307244 -14400 0 -04} +} diff --git a/env/tcl/tcl8.6/tzdata/America/Lima b/env/tcl/tcl8.6/tzdata/America/Lima new file mode 100644 index 0000000..e8b69d6 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/America/Lima @@ -0,0 +1,16 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:America/Lima) { + {-9223372036854775808 -18492 0 LMT} + {-2524503108 -18516 0 LMT} + {-1938538284 -14400 0 -05} + {-1002052800 -18000 0 -05} + {-986756400 -14400 1 -05} + {-971035200 -18000 0 -05} + {-955306800 -14400 1 -05} + {-939585600 -18000 0 -05} + {512712000 -18000 0 -05} + {544248000 -18000 0 -05} + {638942400 -18000 0 -05} + {765172800 -18000 0 -05} +} diff --git a/env/tcl/tcl8.6/tzdata/America/Los_Angeles b/env/tcl/tcl8.6/tzdata/America/Los_Angeles new file mode 100644 index 0000000..8e26526 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/America/Los_Angeles @@ -0,0 +1,317 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:America/Los_Angeles) { + {-9223372036854775808 -28378 0 LMT} + {-2717640000 -28800 0 PST} + {-1633269600 -25200 1 PDT} + {-1615129200 -28800 0 PST} + {-1601820000 -25200 1 PDT} + {-1583679600 -28800 0 PST} + {-880207200 -25200 1 PWT} + {-769395600 -25200 1 PPT} + {-765385200 -28800 0 PST} + {-757353600 -28800 0 PST} + {-687967140 -25200 1 PDT} + {-662655600 -28800 0 PST} + {-620838000 -25200 1 PDT} + {-608137200 -28800 0 PST} + {-589388400 -25200 1 PDT} + {-576082800 -28800 0 PST} + {-557938800 -25200 1 PDT} + {-544633200 -28800 0 PST} + {-526489200 -25200 1 PDT} + {-513183600 -28800 0 PST} + {-495039600 -25200 1 PDT} + {-481734000 -28800 0 PST} + {-463590000 -25200 1 PDT} + {-450284400 -28800 0 PST} + {-431535600 -25200 1 PDT} + {-418230000 -28800 0 PST} + {-400086000 -25200 1 PDT} + {-386780400 -28800 0 PST} + {-368636400 -25200 1 PDT} + {-355330800 -28800 0 PST} + {-337186800 -25200 1 PDT} + {-323881200 -28800 0 PST} + {-305737200 -25200 1 PDT} + {-292431600 -28800 0 PST} + {-273682800 -25200 1 PDT} + {-260982000 -28800 0 PST} + {-242233200 -25200 1 PDT} + {-226508400 -28800 0 PST} + {-210783600 -25200 1 PDT} + {-195058800 -28800 0 PST} + {-179334000 -25200 1 PDT} + {-163609200 -28800 0 PST} + {-147884400 -25200 1 PDT} + {-131554800 -28800 0 PST} + {-116434800 -25200 1 PDT} + {-100105200 -28800 0 PST} + {-94665600 -28800 0 PST} + {-84376800 -25200 1 PDT} + {-68655600 -28800 0 PST} + {-52927200 -25200 1 PDT} + {-37206000 -28800 0 PST} + {-21477600 -25200 1 PDT} + {-5756400 -28800 0 PST} + {9972000 -25200 1 PDT} + {25693200 -28800 0 PST} + {41421600 -25200 1 PDT} + {57747600 -28800 0 PST} + {73476000 -25200 1 PDT} + {89197200 -28800 0 PST} + {104925600 -25200 1 PDT} + {120646800 -28800 0 PST} + {126698400 -25200 1 PDT} + {152096400 -28800 0 PST} + {162381600 -25200 1 PDT} + {183546000 -28800 0 PST} + {199274400 -25200 1 PDT} + {215600400 -28800 0 PST} + {230724000 -25200 1 PDT} + {247050000 -28800 0 PST} + {262778400 -25200 1 PDT} + {278499600 -28800 0 PST} + {294228000 -25200 1 PDT} + {309949200 -28800 0 PST} + {325677600 -25200 1 PDT} + {341398800 -28800 0 PST} + {357127200 -25200 1 PDT} + {372848400 -28800 0 PST} + {388576800 -25200 1 PDT} + {404902800 -28800 0 PST} + {420026400 -25200 1 PDT} + {436352400 -28800 0 PST} + {452080800 -25200 1 PDT} + {467802000 -28800 0 PST} + {483530400 -25200 1 PDT} + {499251600 -28800 0 PST} + {514980000 -25200 1 PDT} + {530701200 -28800 0 PST} + {544615200 -25200 1 PDT} + {562150800 -28800 0 PST} + {576064800 -25200 1 PDT} + {594205200 -28800 0 PST} + {607514400 -25200 1 PDT} + {625654800 -28800 0 PST} + {638964000 -25200 1 PDT} + {657104400 -28800 0 PST} + {671018400 -25200 1 PDT} + {688554000 -28800 0 PST} + {702468000 -25200 1 PDT} + {720003600 -28800 0 PST} + {733917600 -25200 1 PDT} + {752058000 -28800 0 PST} + {765367200 -25200 1 PDT} + {783507600 -28800 0 PST} + {796816800 -25200 1 PDT} + {814957200 -28800 0 PST} + {828871200 -25200 1 PDT} + {846406800 -28800 0 PST} + {860320800 -25200 1 PDT} + {877856400 -28800 0 PST} + {891770400 -25200 1 PDT} + {909306000 -28800 0 PST} + {923220000 -25200 1 PDT} + {941360400 -28800 0 PST} + {954669600 -25200 1 PDT} + {972810000 -28800 0 PST} + {986119200 -25200 1 PDT} + {1004259600 -28800 0 PST} + {1018173600 -25200 1 PDT} + {1035709200 -28800 0 PST} + {1049623200 -25200 1 PDT} + {1067158800 -28800 0 PST} + {1081072800 -25200 1 PDT} + {1099213200 -28800 0 PST} + {1112522400 -25200 1 PDT} + {1130662800 -28800 0 PST} + {1143972000 -25200 1 PDT} + {1162112400 -28800 0 PST} + {1173607200 -25200 1 PDT} + {1194166800 -28800 0 PST} + {1205056800 -25200 1 PDT} + {1225616400 -28800 0 PST} + {1236506400 -25200 1 PDT} + {1257066000 -28800 0 PST} + {1268560800 -25200 1 PDT} + {1289120400 -28800 0 PST} + {1300010400 -25200 1 PDT} + {1320570000 -28800 0 PST} + {1331460000 -25200 1 PDT} + {1352019600 -28800 0 PST} + {1362909600 -25200 1 PDT} + {1383469200 -28800 0 PST} + {1394359200 -25200 1 PDT} + {1414918800 -28800 0 PST} + {1425808800 -25200 1 PDT} + {1446368400 -28800 0 PST} + {1457863200 -25200 1 PDT} + {1478422800 -28800 0 PST} + {1489312800 -25200 1 PDT} + {1509872400 -28800 0 PST} + {1520762400 -25200 1 PDT} + {1541322000 -28800 0 PST} + {1552212000 -25200 1 PDT} + {1572771600 -28800 0 PST} + {1583661600 -25200 1 PDT} + {1604221200 -28800 0 PST} + {1615716000 -25200 1 PDT} + {1636275600 -28800 0 PST} + {1647165600 -25200 1 PDT} + {1667725200 -28800 0 PST} + {1678615200 -25200 1 PDT} + {1699174800 -28800 0 PST} + {1710064800 -25200 1 PDT} + {1730624400 -28800 0 PST} + {1741514400 -25200 1 PDT} + {1762074000 -28800 0 PST} + {1772964000 -25200 1 PDT} + {1793523600 -28800 0 PST} + {1805018400 -25200 1 PDT} + {1825578000 -28800 0 PST} + {1836468000 -25200 1 PDT} + {1857027600 -28800 0 PST} + {1867917600 -25200 1 PDT} + {1888477200 -28800 0 PST} + {1899367200 -25200 1 PDT} + {1919926800 -28800 0 PST} + {1930816800 -25200 1 PDT} + {1951376400 -28800 0 PST} + {1962871200 -25200 1 PDT} + {1983430800 -28800 0 PST} + {1994320800 -25200 1 PDT} + {2014880400 -28800 0 PST} + {2025770400 -25200 1 PDT} + {2046330000 -28800 0 PST} + {2057220000 -25200 1 PDT} + {2077779600 -28800 0 PST} + {2088669600 -25200 1 PDT} + {2109229200 -28800 0 PST} + {2120119200 -25200 1 PDT} + {2140678800 -28800 0 PST} + {2152173600 -25200 1 PDT} + {2172733200 -28800 0 PST} + {2183623200 -25200 1 PDT} + {2204182800 -28800 0 PST} + {2215072800 -25200 1 PDT} + {2235632400 -28800 0 PST} + {2246522400 -25200 1 PDT} + {2267082000 -28800 0 PST} + {2277972000 -25200 1 PDT} + {2298531600 -28800 0 PST} + {2309421600 -25200 1 PDT} + {2329981200 -28800 0 PST} + {2341476000 -25200 1 PDT} + {2362035600 -28800 0 PST} + {2372925600 -25200 1 PDT} + {2393485200 -28800 0 PST} + {2404375200 -25200 1 PDT} + {2424934800 -28800 0 PST} + {2435824800 -25200 1 PDT} + {2456384400 -28800 0 PST} + {2467274400 -25200 1 PDT} + {2487834000 -28800 0 PST} + {2499328800 -25200 1 PDT} + {2519888400 -28800 0 PST} + {2530778400 -25200 1 PDT} + {2551338000 -28800 0 PST} + {2562228000 -25200 1 PDT} + {2582787600 -28800 0 PST} + {2593677600 -25200 1 PDT} + {2614237200 -28800 0 PST} + {2625127200 -25200 1 PDT} + {2645686800 -28800 0 PST} + {2656576800 -25200 1 PDT} + {2677136400 -28800 0 PST} + {2688631200 -25200 1 PDT} + {2709190800 -28800 0 PST} + {2720080800 -25200 1 PDT} + {2740640400 -28800 0 PST} + {2751530400 -25200 1 PDT} + {2772090000 -28800 0 PST} + {2782980000 -25200 1 PDT} + {2803539600 -28800 0 PST} + {2814429600 -25200 1 PDT} + {2834989200 -28800 0 PST} + {2846484000 -25200 1 PDT} + {2867043600 -28800 0 PST} + {2877933600 -25200 1 PDT} + {2898493200 -28800 0 PST} + {2909383200 -25200 1 PDT} + {2929942800 -28800 0 PST} + {2940832800 -25200 1 PDT} + {2961392400 -28800 0 PST} + {2972282400 -25200 1 PDT} + {2992842000 -28800 0 PST} + {3003732000 -25200 1 PDT} + {3024291600 -28800 0 PST} + {3035786400 -25200 1 PDT} + {3056346000 -28800 0 PST} + {3067236000 -25200 1 PDT} + {3087795600 -28800 0 PST} + {3098685600 -25200 1 PDT} + {3119245200 -28800 0 PST} + {3130135200 -25200 1 PDT} + {3150694800 -28800 0 PST} + {3161584800 -25200 1 PDT} + {3182144400 -28800 0 PST} + {3193034400 -25200 1 PDT} + {3213594000 -28800 0 PST} + {3225088800 -25200 1 PDT} + {3245648400 -28800 0 PST} + {3256538400 -25200 1 PDT} + {3277098000 -28800 0 PST} + {3287988000 -25200 1 PDT} + {3308547600 -28800 0 PST} + {3319437600 -25200 1 PDT} + {3339997200 -28800 0 PST} + {3350887200 -25200 1 PDT} + {3371446800 -28800 0 PST} + {3382941600 -25200 1 PDT} + {3403501200 -28800 0 PST} + {3414391200 -25200 1 PDT} + {3434950800 -28800 0 PST} + {3445840800 -25200 1 PDT} + {3466400400 -28800 0 PST} + {3477290400 -25200 1 PDT} + {3497850000 -28800 0 PST} + {3508740000 -25200 1 PDT} + {3529299600 -28800 0 PST} + {3540189600 -25200 1 PDT} + {3560749200 -28800 0 PST} + {3572244000 -25200 1 PDT} + {3592803600 -28800 0 PST} + {3603693600 -25200 1 PDT} + {3624253200 -28800 0 PST} + {3635143200 -25200 1 PDT} + {3655702800 -28800 0 PST} + {3666592800 -25200 1 PDT} + {3687152400 -28800 0 PST} + {3698042400 -25200 1 PDT} + {3718602000 -28800 0 PST} + {3730096800 -25200 1 PDT} + {3750656400 -28800 0 PST} + {3761546400 -25200 1 PDT} + {3782106000 -28800 0 PST} + {3792996000 -25200 1 PDT} + {3813555600 -28800 0 PST} + {3824445600 -25200 1 PDT} + {3845005200 -28800 0 PST} + {3855895200 -25200 1 PDT} + {3876454800 -28800 0 PST} + {3887344800 -25200 1 PDT} + {3907904400 -28800 0 PST} + {3919399200 -25200 1 PDT} + {3939958800 -28800 0 PST} + {3950848800 -25200 1 PDT} + {3971408400 -28800 0 PST} + {3982298400 -25200 1 PDT} + {4002858000 -28800 0 PST} + {4013748000 -25200 1 PDT} + {4034307600 -28800 0 PST} + {4045197600 -25200 1 PDT} + {4065757200 -28800 0 PST} + {4076647200 -25200 1 PDT} + {4097206800 -28800 0 PST} +} diff --git a/env/tcl/tcl8.6/tzdata/America/Louisville b/env/tcl/tcl8.6/tzdata/America/Louisville new file mode 100644 index 0000000..c5a3e1c --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/America/Louisville @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(America/Kentucky/Louisville)]} { + LoadTimeZoneFile America/Kentucky/Louisville +} +set TZData(:America/Louisville) $TZData(:America/Kentucky/Louisville) diff --git a/env/tcl/tcl8.6/tzdata/America/Lower_Princes b/env/tcl/tcl8.6/tzdata/America/Lower_Princes new file mode 100644 index 0000000..94c9197 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/America/Lower_Princes @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(America/Curacao)]} { + LoadTimeZoneFile America/Curacao +} +set TZData(:America/Lower_Princes) $TZData(:America/Curacao) diff --git a/env/tcl/tcl8.6/tzdata/America/Maceio b/env/tcl/tcl8.6/tzdata/America/Maceio new file mode 100644 index 0000000..eab534e --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/America/Maceio @@ -0,0 +1,52 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:America/Maceio) { + {-9223372036854775808 -8572 0 LMT} + {-1767217028 -10800 0 -03} + {-1206957600 -7200 1 -03} + {-1191362400 -10800 0 -03} + {-1175374800 -7200 1 -03} + {-1159826400 -10800 0 -03} + {-633819600 -7200 1 -03} + {-622069200 -10800 0 -03} + {-602283600 -7200 1 -03} + {-591832800 -10800 0 -03} + {-570747600 -7200 1 -03} + {-560210400 -10800 0 -03} + {-539125200 -7200 1 -03} + {-531352800 -10800 0 -03} + {-191365200 -7200 1 -03} + {-184197600 -10800 0 -03} + {-155163600 -7200 1 -03} + {-150069600 -10800 0 -03} + {-128898000 -7200 1 -03} + {-121125600 -10800 0 -03} + {-99954000 -7200 1 -03} + {-89589600 -10800 0 -03} + {-68418000 -7200 1 -03} + {-57967200 -10800 0 -03} + {499748400 -7200 1 -03} + {511236000 -10800 0 -03} + {530593200 -7200 1 -03} + {540266400 -10800 0 -03} + {562129200 -7200 1 -03} + {571197600 -10800 0 -03} + {592974000 -7200 1 -03} + {602042400 -10800 0 -03} + {624423600 -7200 1 -03} + {634701600 -10800 0 -03} + {653536800 -10800 0 -03} + {813553200 -10800 0 -03} + {813726000 -7200 1 -03} + {824004000 -10800 0 -03} + {841802400 -10800 0 -03} + {938660400 -10800 0 -03} + {938919600 -7200 1 -03} + {951616800 -10800 0 -03} + {970974000 -7200 1 -03} + {972180000 -10800 0 -03} + {1000350000 -10800 0 -03} + {1003028400 -7200 1 -03} + {1013911200 -10800 0 -03} + {1033437600 -10800 0 -03} +} diff --git a/env/tcl/tcl8.6/tzdata/America/Managua b/env/tcl/tcl8.6/tzdata/America/Managua new file mode 100644 index 0000000..f729b8a --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/America/Managua @@ -0,0 +1,21 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:America/Managua) { + {-9223372036854775808 -20708 0 LMT} + {-2524500892 -20712 0 MMT} + {-1121105688 -21600 0 CST} + {105084000 -18000 0 EST} + {161758800 -21600 0 CST} + {290584800 -18000 1 CDT} + {299134800 -21600 0 CST} + {322034400 -18000 1 CDT} + {330584400 -21600 0 CST} + {694260000 -18000 0 EST} + {717310800 -21600 0 CST} + {725868000 -18000 0 EST} + {852094800 -21600 0 CST} + {1113112800 -18000 1 CDT} + {1128229200 -21600 0 CST} + {1146384000 -18000 1 CDT} + {1159682400 -21600 0 CST} +} diff --git a/env/tcl/tcl8.6/tzdata/America/Manaus b/env/tcl/tcl8.6/tzdata/America/Manaus new file mode 100644 index 0000000..a855062 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/America/Manaus @@ -0,0 +1,39 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:America/Manaus) { + {-9223372036854775808 -14404 0 LMT} + {-1767211196 -14400 0 -04} + {-1206954000 -10800 1 -04} + {-1191358800 -14400 0 -04} + {-1175371200 -10800 1 -04} + {-1159822800 -14400 0 -04} + {-633816000 -10800 1 -04} + {-622065600 -14400 0 -04} + {-602280000 -10800 1 -04} + {-591829200 -14400 0 -04} + {-570744000 -10800 1 -04} + {-560206800 -14400 0 -04} + {-539121600 -10800 1 -04} + {-531349200 -14400 0 -04} + {-191361600 -10800 1 -04} + {-184194000 -14400 0 -04} + {-155160000 -10800 1 -04} + {-150066000 -14400 0 -04} + {-128894400 -10800 1 -04} + {-121122000 -14400 0 -04} + {-99950400 -10800 1 -04} + {-89586000 -14400 0 -04} + {-68414400 -10800 1 -04} + {-57963600 -14400 0 -04} + {499752000 -10800 1 -04} + {511239600 -14400 0 -04} + {530596800 -10800 1 -04} + {540270000 -14400 0 -04} + {562132800 -10800 1 -04} + {571201200 -14400 0 -04} + {590036400 -14400 0 -04} + {749188800 -14400 0 -04} + {750830400 -10800 1 -04} + {761713200 -14400 0 -04} + {780202800 -14400 0 -04} +} diff --git a/env/tcl/tcl8.6/tzdata/America/Marigot b/env/tcl/tcl8.6/tzdata/America/Marigot new file mode 100644 index 0000000..c2b3873 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/America/Marigot @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(America/Port_of_Spain)]} { + LoadTimeZoneFile America/Port_of_Spain +} +set TZData(:America/Marigot) $TZData(:America/Port_of_Spain) diff --git a/env/tcl/tcl8.6/tzdata/America/Martinique b/env/tcl/tcl8.6/tzdata/America/Martinique new file mode 100644 index 0000000..1f1b491 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/America/Martinique @@ -0,0 +1,9 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:America/Martinique) { + {-9223372036854775808 -14660 0 LMT} + {-2524506940 -14660 0 FFMT} + {-1851537340 -14400 0 AST} + {323841600 -10800 1 ADT} + {338958000 -14400 0 AST} +} diff --git a/env/tcl/tcl8.6/tzdata/America/Matamoros b/env/tcl/tcl8.6/tzdata/America/Matamoros new file mode 100644 index 0000000..2b98652 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/America/Matamoros @@ -0,0 +1,219 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:America/Matamoros) { + {-9223372036854775808 -24000 0 LMT} + {-1514743200 -21600 0 CST} + {568015200 -21600 0 CST} + {576057600 -18000 1 CDT} + {594198000 -21600 0 CST} + {599637600 -21600 0 CST} + {828864000 -18000 1 CDT} + {846399600 -21600 0 CST} + {860313600 -18000 1 CDT} + {877849200 -21600 0 CST} + {891763200 -18000 1 CDT} + {909298800 -21600 0 CST} + {923212800 -18000 1 CDT} + {941353200 -21600 0 CST} + {954662400 -18000 1 CDT} + {972802800 -21600 0 CST} + {989136000 -18000 1 CDT} + {1001833200 -21600 0 CST} + {1018166400 -18000 1 CDT} + {1035702000 -21600 0 CST} + {1049616000 -18000 1 CDT} + {1067151600 -21600 0 CST} + {1081065600 -18000 1 CDT} + {1099206000 -21600 0 CST} + {1112515200 -18000 1 CDT} + {1130655600 -21600 0 CST} + {1143964800 -18000 1 CDT} + {1162105200 -21600 0 CST} + {1175414400 -18000 1 CDT} + {1193554800 -21600 0 CST} + {1207468800 -18000 1 CDT} + {1225004400 -21600 0 CST} + {1238918400 -18000 1 CDT} + {1256454000 -21600 0 CST} + {1262325600 -21600 0 CST} + {1268553600 -18000 1 CDT} + {1289113200 -21600 0 CST} + {1300003200 -18000 1 CDT} + {1320562800 -21600 0 CST} + {1331452800 -18000 1 CDT} + {1352012400 -21600 0 CST} + {1362902400 -18000 1 CDT} + {1383462000 -21600 0 CST} + {1394352000 -18000 1 CDT} + {1414911600 -21600 0 CST} + {1425801600 -18000 1 CDT} + {1446361200 -21600 0 CST} + {1457856000 -18000 1 CDT} + {1478415600 -21600 0 CST} + {1489305600 -18000 1 CDT} + {1509865200 -21600 0 CST} + {1520755200 -18000 1 CDT} + {1541314800 -21600 0 CST} + {1552204800 -18000 1 CDT} + {1572764400 -21600 0 CST} + {1583654400 -18000 1 CDT} + {1604214000 -21600 0 CST} + {1615708800 -18000 1 CDT} + {1636268400 -21600 0 CST} + {1647158400 -18000 1 CDT} + {1667718000 -21600 0 CST} + {1678608000 -18000 1 CDT} + {1699167600 -21600 0 CST} + {1710057600 -18000 1 CDT} + {1730617200 -21600 0 CST} + {1741507200 -18000 1 CDT} + {1762066800 -21600 0 CST} + {1772956800 -18000 1 CDT} + {1793516400 -21600 0 CST} + {1805011200 -18000 1 CDT} + {1825570800 -21600 0 CST} + {1836460800 -18000 1 CDT} + {1857020400 -21600 0 CST} + {1867910400 -18000 1 CDT} + {1888470000 -21600 0 CST} + {1899360000 -18000 1 CDT} + {1919919600 -21600 0 CST} + {1930809600 -18000 1 CDT} + {1951369200 -21600 0 CST} + {1962864000 -18000 1 CDT} + {1983423600 -21600 0 CST} + {1994313600 -18000 1 CDT} + {2014873200 -21600 0 CST} + {2025763200 -18000 1 CDT} + {2046322800 -21600 0 CST} + {2057212800 -18000 1 CDT} + {2077772400 -21600 0 CST} + {2088662400 -18000 1 CDT} + {2109222000 -21600 0 CST} + {2120112000 -18000 1 CDT} + {2140671600 -21600 0 CST} + {2152166400 -18000 1 CDT} + {2172726000 -21600 0 CST} + {2183616000 -18000 1 CDT} + {2204175600 -21600 0 CST} + {2215065600 -18000 1 CDT} + {2235625200 -21600 0 CST} + {2246515200 -18000 1 CDT} + {2267074800 -21600 0 CST} + {2277964800 -18000 1 CDT} + {2298524400 -21600 0 CST} + {2309414400 -18000 1 CDT} + {2329974000 -21600 0 CST} + {2341468800 -18000 1 CDT} + {2362028400 -21600 0 CST} + {2372918400 -18000 1 CDT} + {2393478000 -21600 0 CST} + {2404368000 -18000 1 CDT} + {2424927600 -21600 0 CST} + {2435817600 -18000 1 CDT} + {2456377200 -21600 0 CST} + {2467267200 -18000 1 CDT} + {2487826800 -21600 0 CST} + {2499321600 -18000 1 CDT} + {2519881200 -21600 0 CST} + {2530771200 -18000 1 CDT} + {2551330800 -21600 0 CST} + {2562220800 -18000 1 CDT} + {2582780400 -21600 0 CST} + {2593670400 -18000 1 CDT} + {2614230000 -21600 0 CST} + {2625120000 -18000 1 CDT} + {2645679600 -21600 0 CST} + {2656569600 -18000 1 CDT} + {2677129200 -21600 0 CST} + {2688624000 -18000 1 CDT} + {2709183600 -21600 0 CST} + {2720073600 -18000 1 CDT} + {2740633200 -21600 0 CST} + {2751523200 -18000 1 CDT} + {2772082800 -21600 0 CST} + {2782972800 -18000 1 CDT} + {2803532400 -21600 0 CST} + {2814422400 -18000 1 CDT} + {2834982000 -21600 0 CST} + {2846476800 -18000 1 CDT} + {2867036400 -21600 0 CST} + {2877926400 -18000 1 CDT} + {2898486000 -21600 0 CST} + {2909376000 -18000 1 CDT} + {2929935600 -21600 0 CST} + {2940825600 -18000 1 CDT} + {2961385200 -21600 0 CST} + {2972275200 -18000 1 CDT} + {2992834800 -21600 0 CST} + {3003724800 -18000 1 CDT} + {3024284400 -21600 0 CST} + {3035779200 -18000 1 CDT} + {3056338800 -21600 0 CST} + {3067228800 -18000 1 CDT} + {3087788400 -21600 0 CST} + {3098678400 -18000 1 CDT} + {3119238000 -21600 0 CST} + {3130128000 -18000 1 CDT} + {3150687600 -21600 0 CST} + {3161577600 -18000 1 CDT} + {3182137200 -21600 0 CST} + {3193027200 -18000 1 CDT} + {3213586800 -21600 0 CST} + {3225081600 -18000 1 CDT} + {3245641200 -21600 0 CST} + {3256531200 -18000 1 CDT} + {3277090800 -21600 0 CST} + {3287980800 -18000 1 CDT} + {3308540400 -21600 0 CST} + {3319430400 -18000 1 CDT} + {3339990000 -21600 0 CST} + {3350880000 -18000 1 CDT} + {3371439600 -21600 0 CST} + {3382934400 -18000 1 CDT} + {3403494000 -21600 0 CST} + {3414384000 -18000 1 CDT} + {3434943600 -21600 0 CST} + {3445833600 -18000 1 CDT} + {3466393200 -21600 0 CST} + {3477283200 -18000 1 CDT} + {3497842800 -21600 0 CST} + {3508732800 -18000 1 CDT} + {3529292400 -21600 0 CST} + {3540182400 -18000 1 CDT} + {3560742000 -21600 0 CST} + {3572236800 -18000 1 CDT} + {3592796400 -21600 0 CST} + {3603686400 -18000 1 CDT} + {3624246000 -21600 0 CST} + {3635136000 -18000 1 CDT} + {3655695600 -21600 0 CST} + {3666585600 -18000 1 CDT} + {3687145200 -21600 0 CST} + {3698035200 -18000 1 CDT} + {3718594800 -21600 0 CST} + {3730089600 -18000 1 CDT} + {3750649200 -21600 0 CST} + {3761539200 -18000 1 CDT} + {3782098800 -21600 0 CST} + {3792988800 -18000 1 CDT} + {3813548400 -21600 0 CST} + {3824438400 -18000 1 CDT} + {3844998000 -21600 0 CST} + {3855888000 -18000 1 CDT} + {3876447600 -21600 0 CST} + {3887337600 -18000 1 CDT} + {3907897200 -21600 0 CST} + {3919392000 -18000 1 CDT} + {3939951600 -21600 0 CST} + {3950841600 -18000 1 CDT} + {3971401200 -21600 0 CST} + {3982291200 -18000 1 CDT} + {4002850800 -21600 0 CST} + {4013740800 -18000 1 CDT} + {4034300400 -21600 0 CST} + {4045190400 -18000 1 CDT} + {4065750000 -21600 0 CST} + {4076640000 -18000 1 CDT} + {4097199600 -21600 0 CST} +} diff --git a/env/tcl/tcl8.6/tzdata/America/Mazatlan b/env/tcl/tcl8.6/tzdata/America/Mazatlan new file mode 100644 index 0000000..e56d7d0 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/America/Mazatlan @@ -0,0 +1,222 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:America/Mazatlan) { + {-9223372036854775808 -25540 0 LMT} + {-1514739600 -25200 0 MST} + {-1343066400 -21600 0 CST} + {-1234807200 -25200 0 MST} + {-1220292000 -21600 0 CST} + {-1207159200 -25200 0 MST} + {-1191344400 -21600 0 CST} + {-873828000 -25200 0 MST} + {-661539600 -28800 0 PST} + {28800 -25200 0 MST} + {828867600 -21600 1 MDT} + {846403200 -25200 0 MST} + {860317200 -21600 1 MDT} + {877852800 -25200 0 MST} + {891766800 -21600 1 MDT} + {909302400 -25200 0 MST} + {923216400 -21600 1 MDT} + {941356800 -25200 0 MST} + {954666000 -21600 1 MDT} + {972806400 -25200 0 MST} + {989139600 -21600 1 MDT} + {1001836800 -25200 0 MST} + {1018170000 -21600 1 MDT} + {1035705600 -25200 0 MST} + {1049619600 -21600 1 MDT} + {1067155200 -25200 0 MST} + {1081069200 -21600 1 MDT} + {1099209600 -25200 0 MST} + {1112518800 -21600 1 MDT} + {1130659200 -25200 0 MST} + {1143968400 -21600 1 MDT} + {1162108800 -25200 0 MST} + {1175418000 -21600 1 MDT} + {1193558400 -25200 0 MST} + {1207472400 -21600 1 MDT} + {1225008000 -25200 0 MST} + {1238922000 -21600 1 MDT} + {1256457600 -25200 0 MST} + {1270371600 -21600 1 MDT} + {1288512000 -25200 0 MST} + {1301821200 -21600 1 MDT} + {1319961600 -25200 0 MST} + {1333270800 -21600 1 MDT} + {1351411200 -25200 0 MST} + {1365325200 -21600 1 MDT} + {1382860800 -25200 0 MST} + {1396774800 -21600 1 MDT} + {1414310400 -25200 0 MST} + {1428224400 -21600 1 MDT} + {1445760000 -25200 0 MST} + {1459674000 -21600 1 MDT} + {1477814400 -25200 0 MST} + {1491123600 -21600 1 MDT} + {1509264000 -25200 0 MST} + {1522573200 -21600 1 MDT} + {1540713600 -25200 0 MST} + {1554627600 -21600 1 MDT} + {1572163200 -25200 0 MST} + {1586077200 -21600 1 MDT} + {1603612800 -25200 0 MST} + {1617526800 -21600 1 MDT} + {1635667200 -25200 0 MST} + {1648976400 -21600 1 MDT} + {1667116800 -25200 0 MST} + {1680426000 -21600 1 MDT} + {1698566400 -25200 0 MST} + {1712480400 -21600 1 MDT} + {1730016000 -25200 0 MST} + {1743930000 -21600 1 MDT} + {1761465600 -25200 0 MST} + {1775379600 -21600 1 MDT} + {1792915200 -25200 0 MST} + {1806829200 -21600 1 MDT} + {1824969600 -25200 0 MST} + {1838278800 -21600 1 MDT} + {1856419200 -25200 0 MST} + {1869728400 -21600 1 MDT} + {1887868800 -25200 0 MST} + {1901782800 -21600 1 MDT} + {1919318400 -25200 0 MST} + {1933232400 -21600 1 MDT} + {1950768000 -25200 0 MST} + {1964682000 -21600 1 MDT} + {1982822400 -25200 0 MST} + {1996131600 -21600 1 MDT} + {2014272000 -25200 0 MST} + {2027581200 -21600 1 MDT} + {2045721600 -25200 0 MST} + {2059030800 -21600 1 MDT} + {2077171200 -25200 0 MST} + {2091085200 -21600 1 MDT} + {2108620800 -25200 0 MST} + {2122534800 -21600 1 MDT} + {2140070400 -25200 0 MST} + {2153984400 -21600 1 MDT} + {2172124800 -25200 0 MST} + {2185434000 -21600 1 MDT} + {2203574400 -25200 0 MST} + {2216883600 -21600 1 MDT} + {2235024000 -25200 0 MST} + {2248938000 -21600 1 MDT} + {2266473600 -25200 0 MST} + {2280387600 -21600 1 MDT} + {2297923200 -25200 0 MST} + {2311837200 -21600 1 MDT} + {2329372800 -25200 0 MST} + {2343286800 -21600 1 MDT} + {2361427200 -25200 0 MST} + {2374736400 -21600 1 MDT} + {2392876800 -25200 0 MST} + {2406186000 -21600 1 MDT} + {2424326400 -25200 0 MST} + {2438240400 -21600 1 MDT} + {2455776000 -25200 0 MST} + {2469690000 -21600 1 MDT} + {2487225600 -25200 0 MST} + {2501139600 -21600 1 MDT} + {2519280000 -25200 0 MST} + {2532589200 -21600 1 MDT} + {2550729600 -25200 0 MST} + {2564038800 -21600 1 MDT} + {2582179200 -25200 0 MST} + {2596093200 -21600 1 MDT} + {2613628800 -25200 0 MST} + {2627542800 -21600 1 MDT} + {2645078400 -25200 0 MST} + {2658992400 -21600 1 MDT} + {2676528000 -25200 0 MST} + {2690442000 -21600 1 MDT} + {2708582400 -25200 0 MST} + {2721891600 -21600 1 MDT} + {2740032000 -25200 0 MST} + {2753341200 -21600 1 MDT} + {2771481600 -25200 0 MST} + {2785395600 -21600 1 MDT} + {2802931200 -25200 0 MST} + {2816845200 -21600 1 MDT} + {2834380800 -25200 0 MST} + {2848294800 -21600 1 MDT} + {2866435200 -25200 0 MST} + {2879744400 -21600 1 MDT} + {2897884800 -25200 0 MST} + {2911194000 -21600 1 MDT} + {2929334400 -25200 0 MST} + {2942643600 -21600 1 MDT} + {2960784000 -25200 0 MST} + {2974698000 -21600 1 MDT} + {2992233600 -25200 0 MST} + {3006147600 -21600 1 MDT} + {3023683200 -25200 0 MST} + {3037597200 -21600 1 MDT} + {3055737600 -25200 0 MST} + {3069046800 -21600 1 MDT} + {3087187200 -25200 0 MST} + {3100496400 -21600 1 MDT} + {3118636800 -25200 0 MST} + {3132550800 -21600 1 MDT} + {3150086400 -25200 0 MST} + {3164000400 -21600 1 MDT} + {3181536000 -25200 0 MST} + {3195450000 -21600 1 MDT} + {3212985600 -25200 0 MST} + {3226899600 -21600 1 MDT} + {3245040000 -25200 0 MST} + {3258349200 -21600 1 MDT} + {3276489600 -25200 0 MST} + {3289798800 -21600 1 MDT} + {3307939200 -25200 0 MST} + {3321853200 -21600 1 MDT} + {3339388800 -25200 0 MST} + {3353302800 -21600 1 MDT} + {3370838400 -25200 0 MST} + {3384752400 -21600 1 MDT} + {3402892800 -25200 0 MST} + {3416202000 -21600 1 MDT} + {3434342400 -25200 0 MST} + {3447651600 -21600 1 MDT} + {3465792000 -25200 0 MST} + {3479706000 -21600 1 MDT} + {3497241600 -25200 0 MST} + {3511155600 -21600 1 MDT} + {3528691200 -25200 0 MST} + {3542605200 -21600 1 MDT} + {3560140800 -25200 0 MST} + {3574054800 -21600 1 MDT} + {3592195200 -25200 0 MST} + {3605504400 -21600 1 MDT} + {3623644800 -25200 0 MST} + {3636954000 -21600 1 MDT} + {3655094400 -25200 0 MST} + {3669008400 -21600 1 MDT} + {3686544000 -25200 0 MST} + {3700458000 -21600 1 MDT} + {3717993600 -25200 0 MST} + {3731907600 -21600 1 MDT} + {3750048000 -25200 0 MST} + {3763357200 -21600 1 MDT} + {3781497600 -25200 0 MST} + {3794806800 -21600 1 MDT} + {3812947200 -25200 0 MST} + {3826256400 -21600 1 MDT} + {3844396800 -25200 0 MST} + {3858310800 -21600 1 MDT} + {3875846400 -25200 0 MST} + {3889760400 -21600 1 MDT} + {3907296000 -25200 0 MST} + {3921210000 -21600 1 MDT} + {3939350400 -25200 0 MST} + {3952659600 -21600 1 MDT} + {3970800000 -25200 0 MST} + {3984109200 -21600 1 MDT} + {4002249600 -25200 0 MST} + {4016163600 -21600 1 MDT} + {4033699200 -25200 0 MST} + {4047613200 -21600 1 MDT} + {4065148800 -25200 0 MST} + {4079062800 -21600 1 MDT} + {4096598400 -25200 0 MST} +} diff --git a/env/tcl/tcl8.6/tzdata/America/Mendoza b/env/tcl/tcl8.6/tzdata/America/Mendoza new file mode 100644 index 0000000..511d83e --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/America/Mendoza @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(America/Argentina/Mendoza)]} { + LoadTimeZoneFile America/Argentina/Mendoza +} +set TZData(:America/Mendoza) $TZData(:America/Argentina/Mendoza) diff --git a/env/tcl/tcl8.6/tzdata/America/Menominee b/env/tcl/tcl8.6/tzdata/America/Menominee new file mode 100644 index 0000000..382aeda --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/America/Menominee @@ -0,0 +1,274 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:America/Menominee) { + {-9223372036854775808 -21027 0 LMT} + {-2659759773 -21600 0 CST} + {-1633276800 -18000 1 CDT} + {-1615136400 -21600 0 CST} + {-1601827200 -18000 1 CDT} + {-1583686800 -21600 0 CST} + {-880214400 -18000 1 CWT} + {-769395600 -18000 1 CPT} + {-765392400 -21600 0 CST} + {-757360800 -21600 0 CST} + {-747244800 -18000 1 CDT} + {-733942800 -21600 0 CST} + {-116438400 -18000 1 CDT} + {-100112400 -21600 0 CST} + {-21484800 -18000 0 EST} + {104914800 -21600 0 CST} + {104918400 -18000 1 CDT} + {120639600 -21600 0 CST} + {126691200 -18000 1 CDT} + {152089200 -21600 0 CST} + {162374400 -18000 1 CDT} + {183538800 -21600 0 CST} + {199267200 -18000 1 CDT} + {215593200 -21600 0 CST} + {230716800 -18000 1 CDT} + {247042800 -21600 0 CST} + {262771200 -18000 1 CDT} + {278492400 -21600 0 CST} + {294220800 -18000 1 CDT} + {309942000 -21600 0 CST} + {325670400 -18000 1 CDT} + {341391600 -21600 0 CST} + {357120000 -18000 1 CDT} + {372841200 -21600 0 CST} + {388569600 -18000 1 CDT} + {404895600 -21600 0 CST} + {420019200 -18000 1 CDT} + {436345200 -21600 0 CST} + {452073600 -18000 1 CDT} + {467794800 -21600 0 CST} + {483523200 -18000 1 CDT} + {499244400 -21600 0 CST} + {514972800 -18000 1 CDT} + {530694000 -21600 0 CST} + {544608000 -18000 1 CDT} + {562143600 -21600 0 CST} + {576057600 -18000 1 CDT} + {594198000 -21600 0 CST} + {607507200 -18000 1 CDT} + {625647600 -21600 0 CST} + {638956800 -18000 1 CDT} + {657097200 -21600 0 CST} + {671011200 -18000 1 CDT} + {688546800 -21600 0 CST} + {702460800 -18000 1 CDT} + {719996400 -21600 0 CST} + {733910400 -18000 1 CDT} + {752050800 -21600 0 CST} + {765360000 -18000 1 CDT} + {783500400 -21600 0 CST} + {796809600 -18000 1 CDT} + {814950000 -21600 0 CST} + {828864000 -18000 1 CDT} + {846399600 -21600 0 CST} + {860313600 -18000 1 CDT} + {877849200 -21600 0 CST} + {891763200 -18000 1 CDT} + {909298800 -21600 0 CST} + {923212800 -18000 1 CDT} + {941353200 -21600 0 CST} + {954662400 -18000 1 CDT} + {972802800 -21600 0 CST} + {986112000 -18000 1 CDT} + {1004252400 -21600 0 CST} + {1018166400 -18000 1 CDT} + {1035702000 -21600 0 CST} + {1049616000 -18000 1 CDT} + {1067151600 -21600 0 CST} + {1081065600 -18000 1 CDT} + {1099206000 -21600 0 CST} + {1112515200 -18000 1 CDT} + {1130655600 -21600 0 CST} + {1143964800 -18000 1 CDT} + {1162105200 -21600 0 CST} + {1173600000 -18000 1 CDT} + {1194159600 -21600 0 CST} + {1205049600 -18000 1 CDT} + {1225609200 -21600 0 CST} + {1236499200 -18000 1 CDT} + {1257058800 -21600 0 CST} + {1268553600 -18000 1 CDT} + {1289113200 -21600 0 CST} + {1300003200 -18000 1 CDT} + {1320562800 -21600 0 CST} + {1331452800 -18000 1 CDT} + {1352012400 -21600 0 CST} + {1362902400 -18000 1 CDT} + {1383462000 -21600 0 CST} + {1394352000 -18000 1 CDT} + {1414911600 -21600 0 CST} + {1425801600 -18000 1 CDT} + {1446361200 -21600 0 CST} + {1457856000 -18000 1 CDT} + {1478415600 -21600 0 CST} + {1489305600 -18000 1 CDT} + {1509865200 -21600 0 CST} + {1520755200 -18000 1 CDT} + {1541314800 -21600 0 CST} + {1552204800 -18000 1 CDT} + {1572764400 -21600 0 CST} + {1583654400 -18000 1 CDT} + {1604214000 -21600 0 CST} + {1615708800 -18000 1 CDT} + {1636268400 -21600 0 CST} + {1647158400 -18000 1 CDT} + {1667718000 -21600 0 CST} + {1678608000 -18000 1 CDT} + {1699167600 -21600 0 CST} + {1710057600 -18000 1 CDT} + {1730617200 -21600 0 CST} + {1741507200 -18000 1 CDT} + {1762066800 -21600 0 CST} + {1772956800 -18000 1 CDT} + {1793516400 -21600 0 CST} + {1805011200 -18000 1 CDT} + {1825570800 -21600 0 CST} + {1836460800 -18000 1 CDT} + {1857020400 -21600 0 CST} + {1867910400 -18000 1 CDT} + {1888470000 -21600 0 CST} + {1899360000 -18000 1 CDT} + {1919919600 -21600 0 CST} + {1930809600 -18000 1 CDT} + {1951369200 -21600 0 CST} + {1962864000 -18000 1 CDT} + {1983423600 -21600 0 CST} + {1994313600 -18000 1 CDT} + {2014873200 -21600 0 CST} + {2025763200 -18000 1 CDT} + {2046322800 -21600 0 CST} + {2057212800 -18000 1 CDT} + {2077772400 -21600 0 CST} + {2088662400 -18000 1 CDT} + {2109222000 -21600 0 CST} + {2120112000 -18000 1 CDT} + {2140671600 -21600 0 CST} + {2152166400 -18000 1 CDT} + {2172726000 -21600 0 CST} + {2183616000 -18000 1 CDT} + {2204175600 -21600 0 CST} + {2215065600 -18000 1 CDT} + {2235625200 -21600 0 CST} + {2246515200 -18000 1 CDT} + {2267074800 -21600 0 CST} + {2277964800 -18000 1 CDT} + {2298524400 -21600 0 CST} + {2309414400 -18000 1 CDT} + {2329974000 -21600 0 CST} + {2341468800 -18000 1 CDT} + {2362028400 -21600 0 CST} + {2372918400 -18000 1 CDT} + {2393478000 -21600 0 CST} + {2404368000 -18000 1 CDT} + {2424927600 -21600 0 CST} + {2435817600 -18000 1 CDT} + {2456377200 -21600 0 CST} + {2467267200 -18000 1 CDT} + {2487826800 -21600 0 CST} + {2499321600 -18000 1 CDT} + {2519881200 -21600 0 CST} + {2530771200 -18000 1 CDT} + {2551330800 -21600 0 CST} + {2562220800 -18000 1 CDT} + {2582780400 -21600 0 CST} + {2593670400 -18000 1 CDT} + {2614230000 -21600 0 CST} + {2625120000 -18000 1 CDT} + {2645679600 -21600 0 CST} + {2656569600 -18000 1 CDT} + {2677129200 -21600 0 CST} + {2688624000 -18000 1 CDT} + {2709183600 -21600 0 CST} + {2720073600 -18000 1 CDT} + {2740633200 -21600 0 CST} + {2751523200 -18000 1 CDT} + {2772082800 -21600 0 CST} + {2782972800 -18000 1 CDT} + {2803532400 -21600 0 CST} + {2814422400 -18000 1 CDT} + {2834982000 -21600 0 CST} + {2846476800 -18000 1 CDT} + {2867036400 -21600 0 CST} + {2877926400 -18000 1 CDT} + {2898486000 -21600 0 CST} + {2909376000 -18000 1 CDT} + {2929935600 -21600 0 CST} + {2940825600 -18000 1 CDT} + {2961385200 -21600 0 CST} + {2972275200 -18000 1 CDT} + {2992834800 -21600 0 CST} + {3003724800 -18000 1 CDT} + {3024284400 -21600 0 CST} + {3035779200 -18000 1 CDT} + {3056338800 -21600 0 CST} + {3067228800 -18000 1 CDT} + {3087788400 -21600 0 CST} + {3098678400 -18000 1 CDT} + {3119238000 -21600 0 CST} + {3130128000 -18000 1 CDT} + {3150687600 -21600 0 CST} + {3161577600 -18000 1 CDT} + {3182137200 -21600 0 CST} + {3193027200 -18000 1 CDT} + {3213586800 -21600 0 CST} + {3225081600 -18000 1 CDT} + {3245641200 -21600 0 CST} + {3256531200 -18000 1 CDT} + {3277090800 -21600 0 CST} + {3287980800 -18000 1 CDT} + {3308540400 -21600 0 CST} + {3319430400 -18000 1 CDT} + {3339990000 -21600 0 CST} + {3350880000 -18000 1 CDT} + {3371439600 -21600 0 CST} + {3382934400 -18000 1 CDT} + {3403494000 -21600 0 CST} + {3414384000 -18000 1 CDT} + {3434943600 -21600 0 CST} + {3445833600 -18000 1 CDT} + {3466393200 -21600 0 CST} + {3477283200 -18000 1 CDT} + {3497842800 -21600 0 CST} + {3508732800 -18000 1 CDT} + {3529292400 -21600 0 CST} + {3540182400 -18000 1 CDT} + {3560742000 -21600 0 CST} + {3572236800 -18000 1 CDT} + {3592796400 -21600 0 CST} + {3603686400 -18000 1 CDT} + {3624246000 -21600 0 CST} + {3635136000 -18000 1 CDT} + {3655695600 -21600 0 CST} + {3666585600 -18000 1 CDT} + {3687145200 -21600 0 CST} + {3698035200 -18000 1 CDT} + {3718594800 -21600 0 CST} + {3730089600 -18000 1 CDT} + {3750649200 -21600 0 CST} + {3761539200 -18000 1 CDT} + {3782098800 -21600 0 CST} + {3792988800 -18000 1 CDT} + {3813548400 -21600 0 CST} + {3824438400 -18000 1 CDT} + {3844998000 -21600 0 CST} + {3855888000 -18000 1 CDT} + {3876447600 -21600 0 CST} + {3887337600 -18000 1 CDT} + {3907897200 -21600 0 CST} + {3919392000 -18000 1 CDT} + {3939951600 -21600 0 CST} + {3950841600 -18000 1 CDT} + {3971401200 -21600 0 CST} + {3982291200 -18000 1 CDT} + {4002850800 -21600 0 CST} + {4013740800 -18000 1 CDT} + {4034300400 -21600 0 CST} + {4045190400 -18000 1 CDT} + {4065750000 -21600 0 CST} + {4076640000 -18000 1 CDT} + {4097199600 -21600 0 CST} +} diff --git a/env/tcl/tcl8.6/tzdata/America/Merida b/env/tcl/tcl8.6/tzdata/America/Merida new file mode 100644 index 0000000..ebf5927 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/America/Merida @@ -0,0 +1,216 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:America/Merida) { + {-9223372036854775808 -21508 0 LMT} + {-1514743200 -21600 0 CST} + {377935200 -18000 0 EST} + {407653200 -21600 0 CST} + {828864000 -18000 1 CDT} + {846399600 -21600 0 CST} + {860313600 -18000 1 CDT} + {877849200 -21600 0 CST} + {891763200 -18000 1 CDT} + {909298800 -21600 0 CST} + {923212800 -18000 1 CDT} + {941353200 -21600 0 CST} + {954662400 -18000 1 CDT} + {972802800 -21600 0 CST} + {989136000 -18000 1 CDT} + {1001833200 -21600 0 CST} + {1018166400 -18000 1 CDT} + {1035702000 -21600 0 CST} + {1049616000 -18000 1 CDT} + {1067151600 -21600 0 CST} + {1081065600 -18000 1 CDT} + {1099206000 -21600 0 CST} + {1112515200 -18000 1 CDT} + {1130655600 -21600 0 CST} + {1143964800 -18000 1 CDT} + {1162105200 -21600 0 CST} + {1175414400 -18000 1 CDT} + {1193554800 -21600 0 CST} + {1207468800 -18000 1 CDT} + {1225004400 -21600 0 CST} + {1238918400 -18000 1 CDT} + {1256454000 -21600 0 CST} + {1270368000 -18000 1 CDT} + {1288508400 -21600 0 CST} + {1301817600 -18000 1 CDT} + {1319958000 -21600 0 CST} + {1333267200 -18000 1 CDT} + {1351407600 -21600 0 CST} + {1365321600 -18000 1 CDT} + {1382857200 -21600 0 CST} + {1396771200 -18000 1 CDT} + {1414306800 -21600 0 CST} + {1428220800 -18000 1 CDT} + {1445756400 -21600 0 CST} + {1459670400 -18000 1 CDT} + {1477810800 -21600 0 CST} + {1491120000 -18000 1 CDT} + {1509260400 -21600 0 CST} + {1522569600 -18000 1 CDT} + {1540710000 -21600 0 CST} + {1554624000 -18000 1 CDT} + {1572159600 -21600 0 CST} + {1586073600 -18000 1 CDT} + {1603609200 -21600 0 CST} + {1617523200 -18000 1 CDT} + {1635663600 -21600 0 CST} + {1648972800 -18000 1 CDT} + {1667113200 -21600 0 CST} + {1680422400 -18000 1 CDT} + {1698562800 -21600 0 CST} + {1712476800 -18000 1 CDT} + {1730012400 -21600 0 CST} + {1743926400 -18000 1 CDT} + {1761462000 -21600 0 CST} + {1775376000 -18000 1 CDT} + {1792911600 -21600 0 CST} + {1806825600 -18000 1 CDT} + {1824966000 -21600 0 CST} + {1838275200 -18000 1 CDT} + {1856415600 -21600 0 CST} + {1869724800 -18000 1 CDT} + {1887865200 -21600 0 CST} + {1901779200 -18000 1 CDT} + {1919314800 -21600 0 CST} + {1933228800 -18000 1 CDT} + {1950764400 -21600 0 CST} + {1964678400 -18000 1 CDT} + {1982818800 -21600 0 CST} + {1996128000 -18000 1 CDT} + {2014268400 -21600 0 CST} + {2027577600 -18000 1 CDT} + {2045718000 -21600 0 CST} + {2059027200 -18000 1 CDT} + {2077167600 -21600 0 CST} + {2091081600 -18000 1 CDT} + {2108617200 -21600 0 CST} + {2122531200 -18000 1 CDT} + {2140066800 -21600 0 CST} + {2153980800 -18000 1 CDT} + {2172121200 -21600 0 CST} + {2185430400 -18000 1 CDT} + {2203570800 -21600 0 CST} + {2216880000 -18000 1 CDT} + {2235020400 -21600 0 CST} + {2248934400 -18000 1 CDT} + {2266470000 -21600 0 CST} + {2280384000 -18000 1 CDT} + {2297919600 -21600 0 CST} + {2311833600 -18000 1 CDT} + {2329369200 -21600 0 CST} + {2343283200 -18000 1 CDT} + {2361423600 -21600 0 CST} + {2374732800 -18000 1 CDT} + {2392873200 -21600 0 CST} + {2406182400 -18000 1 CDT} + {2424322800 -21600 0 CST} + {2438236800 -18000 1 CDT} + {2455772400 -21600 0 CST} + {2469686400 -18000 1 CDT} + {2487222000 -21600 0 CST} + {2501136000 -18000 1 CDT} + {2519276400 -21600 0 CST} + {2532585600 -18000 1 CDT} + {2550726000 -21600 0 CST} + {2564035200 -18000 1 CDT} + {2582175600 -21600 0 CST} + {2596089600 -18000 1 CDT} + {2613625200 -21600 0 CST} + {2627539200 -18000 1 CDT} + {2645074800 -21600 0 CST} + {2658988800 -18000 1 CDT} + {2676524400 -21600 0 CST} + {2690438400 -18000 1 CDT} + {2708578800 -21600 0 CST} + {2721888000 -18000 1 CDT} + {2740028400 -21600 0 CST} + {2753337600 -18000 1 CDT} + {2771478000 -21600 0 CST} + {2785392000 -18000 1 CDT} + {2802927600 -21600 0 CST} + {2816841600 -18000 1 CDT} + {2834377200 -21600 0 CST} + {2848291200 -18000 1 CDT} + {2866431600 -21600 0 CST} + {2879740800 -18000 1 CDT} + {2897881200 -21600 0 CST} + {2911190400 -18000 1 CDT} + {2929330800 -21600 0 CST} + {2942640000 -18000 1 CDT} + {2960780400 -21600 0 CST} + {2974694400 -18000 1 CDT} + {2992230000 -21600 0 CST} + {3006144000 -18000 1 CDT} + {3023679600 -21600 0 CST} + {3037593600 -18000 1 CDT} + {3055734000 -21600 0 CST} + {3069043200 -18000 1 CDT} + {3087183600 -21600 0 CST} + {3100492800 -18000 1 CDT} + {3118633200 -21600 0 CST} + {3132547200 -18000 1 CDT} + {3150082800 -21600 0 CST} + {3163996800 -18000 1 CDT} + {3181532400 -21600 0 CST} + {3195446400 -18000 1 CDT} + {3212982000 -21600 0 CST} + {3226896000 -18000 1 CDT} + {3245036400 -21600 0 CST} + {3258345600 -18000 1 CDT} + {3276486000 -21600 0 CST} + {3289795200 -18000 1 CDT} + {3307935600 -21600 0 CST} + {3321849600 -18000 1 CDT} + {3339385200 -21600 0 CST} + {3353299200 -18000 1 CDT} + {3370834800 -21600 0 CST} + {3384748800 -18000 1 CDT} + {3402889200 -21600 0 CST} + {3416198400 -18000 1 CDT} + {3434338800 -21600 0 CST} + {3447648000 -18000 1 CDT} + {3465788400 -21600 0 CST} + {3479702400 -18000 1 CDT} + {3497238000 -21600 0 CST} + {3511152000 -18000 1 CDT} + {3528687600 -21600 0 CST} + {3542601600 -18000 1 CDT} + {3560137200 -21600 0 CST} + {3574051200 -18000 1 CDT} + {3592191600 -21600 0 CST} + {3605500800 -18000 1 CDT} + {3623641200 -21600 0 CST} + {3636950400 -18000 1 CDT} + {3655090800 -21600 0 CST} + {3669004800 -18000 1 CDT} + {3686540400 -21600 0 CST} + {3700454400 -18000 1 CDT} + {3717990000 -21600 0 CST} + {3731904000 -18000 1 CDT} + {3750044400 -21600 0 CST} + {3763353600 -18000 1 CDT} + {3781494000 -21600 0 CST} + {3794803200 -18000 1 CDT} + {3812943600 -21600 0 CST} + {3826252800 -18000 1 CDT} + {3844393200 -21600 0 CST} + {3858307200 -18000 1 CDT} + {3875842800 -21600 0 CST} + {3889756800 -18000 1 CDT} + {3907292400 -21600 0 CST} + {3921206400 -18000 1 CDT} + {3939346800 -21600 0 CST} + {3952656000 -18000 1 CDT} + {3970796400 -21600 0 CST} + {3984105600 -18000 1 CDT} + {4002246000 -21600 0 CST} + {4016160000 -18000 1 CDT} + {4033695600 -21600 0 CST} + {4047609600 -18000 1 CDT} + {4065145200 -21600 0 CST} + {4079059200 -18000 1 CDT} + {4096594800 -21600 0 CST} +} diff --git a/env/tcl/tcl8.6/tzdata/America/Metlakatla b/env/tcl/tcl8.6/tzdata/America/Metlakatla new file mode 100644 index 0000000..371fdcf --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/America/Metlakatla @@ -0,0 +1,212 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:America/Metlakatla) { + {-9223372036854775808 54822 0 LMT} + {-3225223727 -31578 0 LMT} + {-2188955622 -28800 0 PST} + {-883584000 -28800 0 PST} + {-880207200 -25200 1 PWT} + {-769395600 -25200 1 PPT} + {-765385200 -28800 0 PST} + {-757353600 -28800 0 PST} + {-31507200 -28800 0 PST} + {-21477600 -25200 1 PDT} + {-5756400 -28800 0 PST} + {9972000 -25200 1 PDT} + {25693200 -28800 0 PST} + {41421600 -25200 1 PDT} + {57747600 -28800 0 PST} + {73476000 -25200 1 PDT} + {89197200 -28800 0 PST} + {104925600 -25200 1 PDT} + {120646800 -28800 0 PST} + {126698400 -25200 1 PDT} + {152096400 -28800 0 PST} + {162381600 -25200 1 PDT} + {183546000 -28800 0 PST} + {199274400 -25200 1 PDT} + {215600400 -28800 0 PST} + {230724000 -25200 1 PDT} + {247050000 -28800 0 PST} + {262778400 -25200 1 PDT} + {278499600 -28800 0 PST} + {294228000 -25200 1 PDT} + {309949200 -28800 0 PST} + {325677600 -25200 1 PDT} + {341398800 -28800 0 PST} + {357127200 -25200 1 PDT} + {372848400 -28800 0 PST} + {388576800 -25200 1 PDT} + {404902800 -28800 0 PST} + {420026400 -25200 1 PDT} + {436356000 -28800 0 PST} + {1446372000 -32400 0 AKST} + {1457866800 -28800 1 AKDT} + {1478426400 -32400 0 AKST} + {1489316400 -28800 1 AKDT} + {1509876000 -32400 0 AKST} + {1520766000 -28800 1 AKDT} + {1541325600 -32400 0 AKST} + {1552215600 -28800 1 AKDT} + {1572775200 -32400 0 AKST} + {1583665200 -28800 1 AKDT} + {1604224800 -32400 0 AKST} + {1615719600 -28800 1 AKDT} + {1636279200 -32400 0 AKST} + {1647169200 -28800 1 AKDT} + {1667728800 -32400 0 AKST} + {1678618800 -28800 1 AKDT} + {1699178400 -32400 0 AKST} + {1710068400 -28800 1 AKDT} + {1730628000 -32400 0 AKST} + {1741518000 -28800 1 AKDT} + {1762077600 -32400 0 AKST} + {1772967600 -28800 1 AKDT} + {1793527200 -32400 0 AKST} + {1805022000 -28800 1 AKDT} + {1825581600 -32400 0 AKST} + {1836471600 -28800 1 AKDT} + {1857031200 -32400 0 AKST} + {1867921200 -28800 1 AKDT} + {1888480800 -32400 0 AKST} + {1899370800 -28800 1 AKDT} + {1919930400 -32400 0 AKST} + {1930820400 -28800 1 AKDT} + {1951380000 -32400 0 AKST} + {1962874800 -28800 1 AKDT} + {1983434400 -32400 0 AKST} + {1994324400 -28800 1 AKDT} + {2014884000 -32400 0 AKST} + {2025774000 -28800 1 AKDT} + {2046333600 -32400 0 AKST} + {2057223600 -28800 1 AKDT} + {2077783200 -32400 0 AKST} + {2088673200 -28800 1 AKDT} + {2109232800 -32400 0 AKST} + {2120122800 -28800 1 AKDT} + {2140682400 -32400 0 AKST} + {2152177200 -28800 1 AKDT} + {2172736800 -32400 0 AKST} + {2183626800 -28800 1 AKDT} + {2204186400 -32400 0 AKST} + {2215076400 -28800 1 AKDT} + {2235636000 -32400 0 AKST} + {2246526000 -28800 1 AKDT} + {2267085600 -32400 0 AKST} + {2277975600 -28800 1 AKDT} + {2298535200 -32400 0 AKST} + {2309425200 -28800 1 AKDT} + {2329984800 -32400 0 AKST} + {2341479600 -28800 1 AKDT} + {2362039200 -32400 0 AKST} + {2372929200 -28800 1 AKDT} + {2393488800 -32400 0 AKST} + {2404378800 -28800 1 AKDT} + {2424938400 -32400 0 AKST} + {2435828400 -28800 1 AKDT} + {2456388000 -32400 0 AKST} + {2467278000 -28800 1 AKDT} + {2487837600 -32400 0 AKST} + {2499332400 -28800 1 AKDT} + {2519892000 -32400 0 AKST} + {2530782000 -28800 1 AKDT} + {2551341600 -32400 0 AKST} + {2562231600 -28800 1 AKDT} + {2582791200 -32400 0 AKST} + {2593681200 -28800 1 AKDT} + {2614240800 -32400 0 AKST} + {2625130800 -28800 1 AKDT} + {2645690400 -32400 0 AKST} + {2656580400 -28800 1 AKDT} + {2677140000 -32400 0 AKST} + {2688634800 -28800 1 AKDT} + {2709194400 -32400 0 AKST} + {2720084400 -28800 1 AKDT} + {2740644000 -32400 0 AKST} + {2751534000 -28800 1 AKDT} + {2772093600 -32400 0 AKST} + {2782983600 -28800 1 AKDT} + {2803543200 -32400 0 AKST} + {2814433200 -28800 1 AKDT} + {2834992800 -32400 0 AKST} + {2846487600 -28800 1 AKDT} + {2867047200 -32400 0 AKST} + {2877937200 -28800 1 AKDT} + {2898496800 -32400 0 AKST} + {2909386800 -28800 1 AKDT} + {2929946400 -32400 0 AKST} + {2940836400 -28800 1 AKDT} + {2961396000 -32400 0 AKST} + {2972286000 -28800 1 AKDT} + {2992845600 -32400 0 AKST} + {3003735600 -28800 1 AKDT} + {3024295200 -32400 0 AKST} + {3035790000 -28800 1 AKDT} + {3056349600 -32400 0 AKST} + {3067239600 -28800 1 AKDT} + {3087799200 -32400 0 AKST} + {3098689200 -28800 1 AKDT} + {3119248800 -32400 0 AKST} + {3130138800 -28800 1 AKDT} + {3150698400 -32400 0 AKST} + {3161588400 -28800 1 AKDT} + {3182148000 -32400 0 AKST} + {3193038000 -28800 1 AKDT} + {3213597600 -32400 0 AKST} + {3225092400 -28800 1 AKDT} + {3245652000 -32400 0 AKST} + {3256542000 -28800 1 AKDT} + {3277101600 -32400 0 AKST} + {3287991600 -28800 1 AKDT} + {3308551200 -32400 0 AKST} + {3319441200 -28800 1 AKDT} + {3340000800 -32400 0 AKST} + {3350890800 -28800 1 AKDT} + {3371450400 -32400 0 AKST} + {3382945200 -28800 1 AKDT} + {3403504800 -32400 0 AKST} + {3414394800 -28800 1 AKDT} + {3434954400 -32400 0 AKST} + {3445844400 -28800 1 AKDT} + {3466404000 -32400 0 AKST} + {3477294000 -28800 1 AKDT} + {3497853600 -32400 0 AKST} + {3508743600 -28800 1 AKDT} + {3529303200 -32400 0 AKST} + {3540193200 -28800 1 AKDT} + {3560752800 -32400 0 AKST} + {3572247600 -28800 1 AKDT} + {3592807200 -32400 0 AKST} + {3603697200 -28800 1 AKDT} + {3624256800 -32400 0 AKST} + {3635146800 -28800 1 AKDT} + {3655706400 -32400 0 AKST} + {3666596400 -28800 1 AKDT} + {3687156000 -32400 0 AKST} + {3698046000 -28800 1 AKDT} + {3718605600 -32400 0 AKST} + {3730100400 -28800 1 AKDT} + {3750660000 -32400 0 AKST} + {3761550000 -28800 1 AKDT} + {3782109600 -32400 0 AKST} + {3792999600 -28800 1 AKDT} + {3813559200 -32400 0 AKST} + {3824449200 -28800 1 AKDT} + {3845008800 -32400 0 AKST} + {3855898800 -28800 1 AKDT} + {3876458400 -32400 0 AKST} + {3887348400 -28800 1 AKDT} + {3907908000 -32400 0 AKST} + {3919402800 -28800 1 AKDT} + {3939962400 -32400 0 AKST} + {3950852400 -28800 1 AKDT} + {3971412000 -32400 0 AKST} + {3982302000 -28800 1 AKDT} + {4002861600 -32400 0 AKST} + {4013751600 -28800 1 AKDT} + {4034311200 -32400 0 AKST} + {4045201200 -28800 1 AKDT} + {4065760800 -32400 0 AKST} + {4076650800 -28800 1 AKDT} + {4097210400 -32400 0 AKST} +} diff --git a/env/tcl/tcl8.6/tzdata/America/Mexico_City b/env/tcl/tcl8.6/tzdata/America/Mexico_City new file mode 100644 index 0000000..48462e4 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/America/Mexico_City @@ -0,0 +1,228 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:America/Mexico_City) { + {-9223372036854775808 -23796 0 LMT} + {-1514739600 -25200 0 MST} + {-1343066400 -21600 0 CST} + {-1234807200 -25200 0 MST} + {-1220292000 -21600 0 CST} + {-1207159200 -25200 0 MST} + {-1191344400 -21600 0 CST} + {-975261600 -18000 1 CDT} + {-963169200 -21600 0 CST} + {-917114400 -18000 1 CDT} + {-907354800 -21600 0 CST} + {-821901600 -18000 1 CWT} + {-810068400 -21600 0 CST} + {-627501600 -18000 1 CDT} + {-612990000 -21600 0 CST} + {828864000 -18000 1 CDT} + {846399600 -21600 0 CST} + {860313600 -18000 1 CDT} + {877849200 -21600 0 CST} + {891763200 -18000 1 CDT} + {909298800 -21600 0 CST} + {923212800 -18000 1 CDT} + {941353200 -21600 0 CST} + {954662400 -18000 1 CDT} + {972802800 -21600 0 CST} + {989136000 -18000 1 CDT} + {1001836800 -21600 0 CST} + {1014184800 -21600 0 CST} + {1018166400 -18000 1 CDT} + {1035702000 -21600 0 CST} + {1049616000 -18000 1 CDT} + {1067151600 -21600 0 CST} + {1081065600 -18000 1 CDT} + {1099206000 -21600 0 CST} + {1112515200 -18000 1 CDT} + {1130655600 -21600 0 CST} + {1143964800 -18000 1 CDT} + {1162105200 -21600 0 CST} + {1175414400 -18000 1 CDT} + {1193554800 -21600 0 CST} + {1207468800 -18000 1 CDT} + {1225004400 -21600 0 CST} + {1238918400 -18000 1 CDT} + {1256454000 -21600 0 CST} + {1270368000 -18000 1 CDT} + {1288508400 -21600 0 CST} + {1301817600 -18000 1 CDT} + {1319958000 -21600 0 CST} + {1333267200 -18000 1 CDT} + {1351407600 -21600 0 CST} + {1365321600 -18000 1 CDT} + {1382857200 -21600 0 CST} + {1396771200 -18000 1 CDT} + {1414306800 -21600 0 CST} + {1428220800 -18000 1 CDT} + {1445756400 -21600 0 CST} + {1459670400 -18000 1 CDT} + {1477810800 -21600 0 CST} + {1491120000 -18000 1 CDT} + {1509260400 -21600 0 CST} + {1522569600 -18000 1 CDT} + {1540710000 -21600 0 CST} + {1554624000 -18000 1 CDT} + {1572159600 -21600 0 CST} + {1586073600 -18000 1 CDT} + {1603609200 -21600 0 CST} + {1617523200 -18000 1 CDT} + {1635663600 -21600 0 CST} + {1648972800 -18000 1 CDT} + {1667113200 -21600 0 CST} + {1680422400 -18000 1 CDT} + {1698562800 -21600 0 CST} + {1712476800 -18000 1 CDT} + {1730012400 -21600 0 CST} + {1743926400 -18000 1 CDT} + {1761462000 -21600 0 CST} + {1775376000 -18000 1 CDT} + {1792911600 -21600 0 CST} + {1806825600 -18000 1 CDT} + {1824966000 -21600 0 CST} + {1838275200 -18000 1 CDT} + {1856415600 -21600 0 CST} + {1869724800 -18000 1 CDT} + {1887865200 -21600 0 CST} + {1901779200 -18000 1 CDT} + {1919314800 -21600 0 CST} + {1933228800 -18000 1 CDT} + {1950764400 -21600 0 CST} + {1964678400 -18000 1 CDT} + {1982818800 -21600 0 CST} + {1996128000 -18000 1 CDT} + {2014268400 -21600 0 CST} + {2027577600 -18000 1 CDT} + {2045718000 -21600 0 CST} + {2059027200 -18000 1 CDT} + {2077167600 -21600 0 CST} + {2091081600 -18000 1 CDT} + {2108617200 -21600 0 CST} + {2122531200 -18000 1 CDT} + {2140066800 -21600 0 CST} + {2153980800 -18000 1 CDT} + {2172121200 -21600 0 CST} + {2185430400 -18000 1 CDT} + {2203570800 -21600 0 CST} + {2216880000 -18000 1 CDT} + {2235020400 -21600 0 CST} + {2248934400 -18000 1 CDT} + {2266470000 -21600 0 CST} + {2280384000 -18000 1 CDT} + {2297919600 -21600 0 CST} + {2311833600 -18000 1 CDT} + {2329369200 -21600 0 CST} + {2343283200 -18000 1 CDT} + {2361423600 -21600 0 CST} + {2374732800 -18000 1 CDT} + {2392873200 -21600 0 CST} + {2406182400 -18000 1 CDT} + {2424322800 -21600 0 CST} + {2438236800 -18000 1 CDT} + {2455772400 -21600 0 CST} + {2469686400 -18000 1 CDT} + {2487222000 -21600 0 CST} + {2501136000 -18000 1 CDT} + {2519276400 -21600 0 CST} + {2532585600 -18000 1 CDT} + {2550726000 -21600 0 CST} + {2564035200 -18000 1 CDT} + {2582175600 -21600 0 CST} + {2596089600 -18000 1 CDT} + {2613625200 -21600 0 CST} + {2627539200 -18000 1 CDT} + {2645074800 -21600 0 CST} + {2658988800 -18000 1 CDT} + {2676524400 -21600 0 CST} + {2690438400 -18000 1 CDT} + {2708578800 -21600 0 CST} + {2721888000 -18000 1 CDT} + {2740028400 -21600 0 CST} + {2753337600 -18000 1 CDT} + {2771478000 -21600 0 CST} + {2785392000 -18000 1 CDT} + {2802927600 -21600 0 CST} + {2816841600 -18000 1 CDT} + {2834377200 -21600 0 CST} + {2848291200 -18000 1 CDT} + {2866431600 -21600 0 CST} + {2879740800 -18000 1 CDT} + {2897881200 -21600 0 CST} + {2911190400 -18000 1 CDT} + {2929330800 -21600 0 CST} + {2942640000 -18000 1 CDT} + {2960780400 -21600 0 CST} + {2974694400 -18000 1 CDT} + {2992230000 -21600 0 CST} + {3006144000 -18000 1 CDT} + {3023679600 -21600 0 CST} + {3037593600 -18000 1 CDT} + {3055734000 -21600 0 CST} + {3069043200 -18000 1 CDT} + {3087183600 -21600 0 CST} + {3100492800 -18000 1 CDT} + {3118633200 -21600 0 CST} + {3132547200 -18000 1 CDT} + {3150082800 -21600 0 CST} + {3163996800 -18000 1 CDT} + {3181532400 -21600 0 CST} + {3195446400 -18000 1 CDT} + {3212982000 -21600 0 CST} + {3226896000 -18000 1 CDT} + {3245036400 -21600 0 CST} + {3258345600 -18000 1 CDT} + {3276486000 -21600 0 CST} + {3289795200 -18000 1 CDT} + {3307935600 -21600 0 CST} + {3321849600 -18000 1 CDT} + {3339385200 -21600 0 CST} + {3353299200 -18000 1 CDT} + {3370834800 -21600 0 CST} + {3384748800 -18000 1 CDT} + {3402889200 -21600 0 CST} + {3416198400 -18000 1 CDT} + {3434338800 -21600 0 CST} + {3447648000 -18000 1 CDT} + {3465788400 -21600 0 CST} + {3479702400 -18000 1 CDT} + {3497238000 -21600 0 CST} + {3511152000 -18000 1 CDT} + {3528687600 -21600 0 CST} + {3542601600 -18000 1 CDT} + {3560137200 -21600 0 CST} + {3574051200 -18000 1 CDT} + {3592191600 -21600 0 CST} + {3605500800 -18000 1 CDT} + {3623641200 -21600 0 CST} + {3636950400 -18000 1 CDT} + {3655090800 -21600 0 CST} + {3669004800 -18000 1 CDT} + {3686540400 -21600 0 CST} + {3700454400 -18000 1 CDT} + {3717990000 -21600 0 CST} + {3731904000 -18000 1 CDT} + {3750044400 -21600 0 CST} + {3763353600 -18000 1 CDT} + {3781494000 -21600 0 CST} + {3794803200 -18000 1 CDT} + {3812943600 -21600 0 CST} + {3826252800 -18000 1 CDT} + {3844393200 -21600 0 CST} + {3858307200 -18000 1 CDT} + {3875842800 -21600 0 CST} + {3889756800 -18000 1 CDT} + {3907292400 -21600 0 CST} + {3921206400 -18000 1 CDT} + {3939346800 -21600 0 CST} + {3952656000 -18000 1 CDT} + {3970796400 -21600 0 CST} + {3984105600 -18000 1 CDT} + {4002246000 -21600 0 CST} + {4016160000 -18000 1 CDT} + {4033695600 -21600 0 CST} + {4047609600 -18000 1 CDT} + {4065145200 -21600 0 CST} + {4079059200 -18000 1 CDT} + {4096594800 -21600 0 CST} +} diff --git a/env/tcl/tcl8.6/tzdata/America/Miquelon b/env/tcl/tcl8.6/tzdata/America/Miquelon new file mode 100644 index 0000000..c299be6 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/America/Miquelon @@ -0,0 +1,234 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:America/Miquelon) { + {-9223372036854775808 -13480 0 LMT} + {-1850328920 -14400 0 AST} + {326001600 -10800 0 -03} + {536468400 -10800 0 -02} + {544597200 -7200 1 -02} + {562132800 -10800 0 -02} + {576046800 -7200 1 -02} + {594187200 -10800 0 -02} + {607496400 -7200 1 -02} + {625636800 -10800 0 -02} + {638946000 -7200 1 -02} + {657086400 -10800 0 -02} + {671000400 -7200 1 -02} + {688536000 -10800 0 -02} + {702450000 -7200 1 -02} + {719985600 -10800 0 -02} + {733899600 -7200 1 -02} + {752040000 -10800 0 -02} + {765349200 -7200 1 -02} + {783489600 -10800 0 -02} + {796798800 -7200 1 -02} + {814939200 -10800 0 -02} + {828853200 -7200 1 -02} + {846388800 -10800 0 -02} + {860302800 -7200 1 -02} + {877838400 -10800 0 -02} + {891752400 -7200 1 -02} + {909288000 -10800 0 -02} + {923202000 -7200 1 -02} + {941342400 -10800 0 -02} + {954651600 -7200 1 -02} + {972792000 -10800 0 -02} + {986101200 -7200 1 -02} + {1004241600 -10800 0 -02} + {1018155600 -7200 1 -02} + {1035691200 -10800 0 -02} + {1049605200 -7200 1 -02} + {1067140800 -10800 0 -02} + {1081054800 -7200 1 -02} + {1099195200 -10800 0 -02} + {1112504400 -7200 1 -02} + {1130644800 -10800 0 -02} + {1143954000 -7200 1 -02} + {1162094400 -10800 0 -02} + {1173589200 -7200 1 -02} + {1194148800 -10800 0 -02} + {1205038800 -7200 1 -02} + {1225598400 -10800 0 -02} + {1236488400 -7200 1 -02} + {1257048000 -10800 0 -02} + {1268542800 -7200 1 -02} + {1289102400 -10800 0 -02} + {1299992400 -7200 1 -02} + {1320552000 -10800 0 -02} + {1331442000 -7200 1 -02} + {1352001600 -10800 0 -02} + {1362891600 -7200 1 -02} + {1383451200 -10800 0 -02} + {1394341200 -7200 1 -02} + {1414900800 -10800 0 -02} + {1425790800 -7200 1 -02} + {1446350400 -10800 0 -02} + {1457845200 -7200 1 -02} + {1478404800 -10800 0 -02} + {1489294800 -7200 1 -02} + {1509854400 -10800 0 -02} + {1520744400 -7200 1 -02} + {1541304000 -10800 0 -02} + {1552194000 -7200 1 -02} + {1572753600 -10800 0 -02} + {1583643600 -7200 1 -02} + {1604203200 -10800 0 -02} + {1615698000 -7200 1 -02} + {1636257600 -10800 0 -02} + {1647147600 -7200 1 -02} + {1667707200 -10800 0 -02} + {1678597200 -7200 1 -02} + {1699156800 -10800 0 -02} + {1710046800 -7200 1 -02} + {1730606400 -10800 0 -02} + {1741496400 -7200 1 -02} + {1762056000 -10800 0 -02} + {1772946000 -7200 1 -02} + {1793505600 -10800 0 -02} + {1805000400 -7200 1 -02} + {1825560000 -10800 0 -02} + {1836450000 -7200 1 -02} + {1857009600 -10800 0 -02} + {1867899600 -7200 1 -02} + {1888459200 -10800 0 -02} + {1899349200 -7200 1 -02} + {1919908800 -10800 0 -02} + {1930798800 -7200 1 -02} + {1951358400 -10800 0 -02} + {1962853200 -7200 1 -02} + {1983412800 -10800 0 -02} + {1994302800 -7200 1 -02} + {2014862400 -10800 0 -02} + {2025752400 -7200 1 -02} + {2046312000 -10800 0 -02} + {2057202000 -7200 1 -02} + {2077761600 -10800 0 -02} + {2088651600 -7200 1 -02} + {2109211200 -10800 0 -02} + {2120101200 -7200 1 -02} + {2140660800 -10800 0 -02} + {2152155600 -7200 1 -02} + {2172715200 -10800 0 -02} + {2183605200 -7200 1 -02} + {2204164800 -10800 0 -02} + {2215054800 -7200 1 -02} + {2235614400 -10800 0 -02} + {2246504400 -7200 1 -02} + {2267064000 -10800 0 -02} + {2277954000 -7200 1 -02} + {2298513600 -10800 0 -02} + {2309403600 -7200 1 -02} + {2329963200 -10800 0 -02} + {2341458000 -7200 1 -02} + {2362017600 -10800 0 -02} + {2372907600 -7200 1 -02} + {2393467200 -10800 0 -02} + {2404357200 -7200 1 -02} + {2424916800 -10800 0 -02} + {2435806800 -7200 1 -02} + {2456366400 -10800 0 -02} + {2467256400 -7200 1 -02} + {2487816000 -10800 0 -02} + {2499310800 -7200 1 -02} + {2519870400 -10800 0 -02} + {2530760400 -7200 1 -02} + {2551320000 -10800 0 -02} + {2562210000 -7200 1 -02} + {2582769600 -10800 0 -02} + {2593659600 -7200 1 -02} + {2614219200 -10800 0 -02} + {2625109200 -7200 1 -02} + {2645668800 -10800 0 -02} + {2656558800 -7200 1 -02} + {2677118400 -10800 0 -02} + {2688613200 -7200 1 -02} + {2709172800 -10800 0 -02} + {2720062800 -7200 1 -02} + {2740622400 -10800 0 -02} + {2751512400 -7200 1 -02} + {2772072000 -10800 0 -02} + {2782962000 -7200 1 -02} + {2803521600 -10800 0 -02} + {2814411600 -7200 1 -02} + {2834971200 -10800 0 -02} + {2846466000 -7200 1 -02} + {2867025600 -10800 0 -02} + {2877915600 -7200 1 -02} + {2898475200 -10800 0 -02} + {2909365200 -7200 1 -02} + {2929924800 -10800 0 -02} + {2940814800 -7200 1 -02} + {2961374400 -10800 0 -02} + {2972264400 -7200 1 -02} + {2992824000 -10800 0 -02} + {3003714000 -7200 1 -02} + {3024273600 -10800 0 -02} + {3035768400 -7200 1 -02} + {3056328000 -10800 0 -02} + {3067218000 -7200 1 -02} + {3087777600 -10800 0 -02} + {3098667600 -7200 1 -02} + {3119227200 -10800 0 -02} + {3130117200 -7200 1 -02} + {3150676800 -10800 0 -02} + {3161566800 -7200 1 -02} + {3182126400 -10800 0 -02} + {3193016400 -7200 1 -02} + {3213576000 -10800 0 -02} + {3225070800 -7200 1 -02} + {3245630400 -10800 0 -02} + {3256520400 -7200 1 -02} + {3277080000 -10800 0 -02} + {3287970000 -7200 1 -02} + {3308529600 -10800 0 -02} + {3319419600 -7200 1 -02} + {3339979200 -10800 0 -02} + {3350869200 -7200 1 -02} + {3371428800 -10800 0 -02} + {3382923600 -7200 1 -02} + {3403483200 -10800 0 -02} + {3414373200 -7200 1 -02} + {3434932800 -10800 0 -02} + {3445822800 -7200 1 -02} + {3466382400 -10800 0 -02} + {3477272400 -7200 1 -02} + {3497832000 -10800 0 -02} + {3508722000 -7200 1 -02} + {3529281600 -10800 0 -02} + {3540171600 -7200 1 -02} + {3560731200 -10800 0 -02} + {3572226000 -7200 1 -02} + {3592785600 -10800 0 -02} + {3603675600 -7200 1 -02} + {3624235200 -10800 0 -02} + {3635125200 -7200 1 -02} + {3655684800 -10800 0 -02} + {3666574800 -7200 1 -02} + {3687134400 -10800 0 -02} + {3698024400 -7200 1 -02} + {3718584000 -10800 0 -02} + {3730078800 -7200 1 -02} + {3750638400 -10800 0 -02} + {3761528400 -7200 1 -02} + {3782088000 -10800 0 -02} + {3792978000 -7200 1 -02} + {3813537600 -10800 0 -02} + {3824427600 -7200 1 -02} + {3844987200 -10800 0 -02} + {3855877200 -7200 1 -02} + {3876436800 -10800 0 -02} + {3887326800 -7200 1 -02} + {3907886400 -10800 0 -02} + {3919381200 -7200 1 -02} + {3939940800 -10800 0 -02} + {3950830800 -7200 1 -02} + {3971390400 -10800 0 -02} + {3982280400 -7200 1 -02} + {4002840000 -10800 0 -02} + {4013730000 -7200 1 -02} + {4034289600 -10800 0 -02} + {4045179600 -7200 1 -02} + {4065739200 -10800 0 -02} + {4076629200 -7200 1 -02} + {4097188800 -10800 0 -02} +} diff --git a/env/tcl/tcl8.6/tzdata/America/Moncton b/env/tcl/tcl8.6/tzdata/America/Moncton new file mode 100644 index 0000000..d286c88 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/America/Moncton @@ -0,0 +1,342 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:America/Moncton) { + {-9223372036854775808 -15548 0 LMT} + {-2715882052 -18000 0 EST} + {-2131642800 -14400 0 AST} + {-1632074400 -10800 1 ADT} + {-1615143600 -14400 0 AST} + {-1167595200 -14400 0 AST} + {-1153681200 -10800 1 ADT} + {-1145822400 -14400 0 AST} + {-1122231600 -10800 1 ADT} + {-1114372800 -14400 0 AST} + {-1090782000 -10800 1 ADT} + {-1082923200 -14400 0 AST} + {-1059332400 -10800 1 ADT} + {-1051473600 -14400 0 AST} + {-1027882800 -10800 1 ADT} + {-1020024000 -14400 0 AST} + {-996433200 -10800 1 ADT} + {-988574400 -14400 0 AST} + {-965674800 -10800 1 ADT} + {-955396800 -14400 0 AST} + {-934743600 -10800 1 ADT} + {-923947200 -14400 0 AST} + {-904503600 -10800 1 ADT} + {-891892800 -14400 0 AST} + {-883598400 -14400 0 AST} + {-880221600 -10800 1 AWT} + {-769395600 -10800 1 APT} + {-765399600 -14400 0 AST} + {-757368000 -14400 0 AST} + {-747252000 -10800 1 ADT} + {-733950000 -14400 0 AST} + {-715802400 -10800 1 ADT} + {-702500400 -14400 0 AST} + {-684352800 -10800 1 ADT} + {-671050800 -14400 0 AST} + {-652903200 -10800 1 ADT} + {-639601200 -14400 0 AST} + {-620848800 -10800 1 ADT} + {-608151600 -14400 0 AST} + {-589399200 -10800 1 ADT} + {-576097200 -14400 0 AST} + {-557949600 -10800 1 ADT} + {-544647600 -14400 0 AST} + {-526500000 -10800 1 ADT} + {-513198000 -14400 0 AST} + {-495050400 -10800 1 ADT} + {-481748400 -14400 0 AST} + {-463600800 -10800 1 ADT} + {-450298800 -14400 0 AST} + {-431546400 -10800 1 ADT} + {-418244400 -14400 0 AST} + {-400096800 -10800 1 ADT} + {-384375600 -14400 0 AST} + {-368647200 -10800 1 ADT} + {-352926000 -14400 0 AST} + {-337197600 -10800 1 ADT} + {-321476400 -14400 0 AST} + {-305748000 -10800 1 ADT} + {-289422000 -14400 0 AST} + {-273693600 -10800 1 ADT} + {-257972400 -14400 0 AST} + {-242244000 -10800 1 ADT} + {-226522800 -14400 0 AST} + {-210794400 -10800 1 ADT} + {-195073200 -14400 0 AST} + {-179344800 -10800 1 ADT} + {-163623600 -14400 0 AST} + {-147895200 -10800 1 ADT} + {-131569200 -14400 0 AST} + {-116445600 -10800 1 ADT} + {-100119600 -14400 0 AST} + {-84391200 -10800 1 ADT} + {-68670000 -14400 0 AST} + {-52941600 -10800 1 ADT} + {-37220400 -14400 0 AST} + {-21492000 -10800 1 ADT} + {-5770800 -14400 0 AST} + {9957600 -10800 1 ADT} + {25678800 -14400 0 AST} + {41407200 -10800 1 ADT} + {57733200 -14400 0 AST} + {73461600 -10800 1 ADT} + {89182800 -14400 0 AST} + {94708800 -14400 0 AST} + {136360800 -10800 1 ADT} + {152082000 -14400 0 AST} + {167810400 -10800 1 ADT} + {183531600 -14400 0 AST} + {199260000 -10800 1 ADT} + {215586000 -14400 0 AST} + {230709600 -10800 1 ADT} + {247035600 -14400 0 AST} + {262764000 -10800 1 ADT} + {278485200 -14400 0 AST} + {294213600 -10800 1 ADT} + {309934800 -14400 0 AST} + {325663200 -10800 1 ADT} + {341384400 -14400 0 AST} + {357112800 -10800 1 ADT} + {372834000 -14400 0 AST} + {388562400 -10800 1 ADT} + {404888400 -14400 0 AST} + {420012000 -10800 1 ADT} + {436338000 -14400 0 AST} + {452066400 -10800 1 ADT} + {467787600 -14400 0 AST} + {483516000 -10800 1 ADT} + {499237200 -14400 0 AST} + {514965600 -10800 1 ADT} + {530686800 -14400 0 AST} + {544600800 -10800 1 ADT} + {562136400 -14400 0 AST} + {576050400 -10800 1 ADT} + {594190800 -14400 0 AST} + {607500000 -10800 1 ADT} + {625640400 -14400 0 AST} + {638949600 -10800 1 ADT} + {657090000 -14400 0 AST} + {671004000 -10800 1 ADT} + {688539600 -14400 0 AST} + {702453600 -10800 1 ADT} + {719989200 -14400 0 AST} + {725860800 -14400 0 AST} + {733896060 -10800 1 ADT} + {752036460 -14400 0 AST} + {765345660 -10800 1 ADT} + {783486060 -14400 0 AST} + {796795260 -10800 1 ADT} + {814935660 -14400 0 AST} + {828849660 -10800 1 ADT} + {846385260 -14400 0 AST} + {860299260 -10800 1 ADT} + {877834860 -14400 0 AST} + {891748860 -10800 1 ADT} + {909284460 -14400 0 AST} + {923198460 -10800 1 ADT} + {941338860 -14400 0 AST} + {954648060 -10800 1 ADT} + {972788460 -14400 0 AST} + {986097660 -10800 1 ADT} + {1004238060 -14400 0 AST} + {1018152060 -10800 1 ADT} + {1035687660 -14400 0 AST} + {1049601660 -10800 1 ADT} + {1067137260 -14400 0 AST} + {1081051260 -10800 1 ADT} + {1099191660 -14400 0 AST} + {1112500860 -10800 1 ADT} + {1130641260 -14400 0 AST} + {1143950460 -10800 1 ADT} + {1162090860 -14400 0 AST} + {1167624000 -14400 0 AST} + {1173592800 -10800 1 ADT} + {1194152400 -14400 0 AST} + {1205042400 -10800 1 ADT} + {1225602000 -14400 0 AST} + {1236492000 -10800 1 ADT} + {1257051600 -14400 0 AST} + {1268546400 -10800 1 ADT} + {1289106000 -14400 0 AST} + {1299996000 -10800 1 ADT} + {1320555600 -14400 0 AST} + {1331445600 -10800 1 ADT} + {1352005200 -14400 0 AST} + {1362895200 -10800 1 ADT} + {1383454800 -14400 0 AST} + {1394344800 -10800 1 ADT} + {1414904400 -14400 0 AST} + {1425794400 -10800 1 ADT} + {1446354000 -14400 0 AST} + {1457848800 -10800 1 ADT} + {1478408400 -14400 0 AST} + {1489298400 -10800 1 ADT} + {1509858000 -14400 0 AST} + {1520748000 -10800 1 ADT} + {1541307600 -14400 0 AST} + {1552197600 -10800 1 ADT} + {1572757200 -14400 0 AST} + {1583647200 -10800 1 ADT} + {1604206800 -14400 0 AST} + {1615701600 -10800 1 ADT} + {1636261200 -14400 0 AST} + {1647151200 -10800 1 ADT} + {1667710800 -14400 0 AST} + {1678600800 -10800 1 ADT} + {1699160400 -14400 0 AST} + {1710050400 -10800 1 ADT} + {1730610000 -14400 0 AST} + {1741500000 -10800 1 ADT} + {1762059600 -14400 0 AST} + {1772949600 -10800 1 ADT} + {1793509200 -14400 0 AST} + {1805004000 -10800 1 ADT} + {1825563600 -14400 0 AST} + {1836453600 -10800 1 ADT} + {1857013200 -14400 0 AST} + {1867903200 -10800 1 ADT} + {1888462800 -14400 0 AST} + {1899352800 -10800 1 ADT} + {1919912400 -14400 0 AST} + {1930802400 -10800 1 ADT} + {1951362000 -14400 0 AST} + {1962856800 -10800 1 ADT} + {1983416400 -14400 0 AST} + {1994306400 -10800 1 ADT} + {2014866000 -14400 0 AST} + {2025756000 -10800 1 ADT} + {2046315600 -14400 0 AST} + {2057205600 -10800 1 ADT} + {2077765200 -14400 0 AST} + {2088655200 -10800 1 ADT} + {2109214800 -14400 0 AST} + {2120104800 -10800 1 ADT} + {2140664400 -14400 0 AST} + {2152159200 -10800 1 ADT} + {2172718800 -14400 0 AST} + {2183608800 -10800 1 ADT} + {2204168400 -14400 0 AST} + {2215058400 -10800 1 ADT} + {2235618000 -14400 0 AST} + {2246508000 -10800 1 ADT} + {2267067600 -14400 0 AST} + {2277957600 -10800 1 ADT} + {2298517200 -14400 0 AST} + {2309407200 -10800 1 ADT} + {2329966800 -14400 0 AST} + {2341461600 -10800 1 ADT} + {2362021200 -14400 0 AST} + {2372911200 -10800 1 ADT} + {2393470800 -14400 0 AST} + {2404360800 -10800 1 ADT} + {2424920400 -14400 0 AST} + {2435810400 -10800 1 ADT} + {2456370000 -14400 0 AST} + {2467260000 -10800 1 ADT} + {2487819600 -14400 0 AST} + {2499314400 -10800 1 ADT} + {2519874000 -14400 0 AST} + {2530764000 -10800 1 ADT} + {2551323600 -14400 0 AST} + {2562213600 -10800 1 ADT} + {2582773200 -14400 0 AST} + {2593663200 -10800 1 ADT} + {2614222800 -14400 0 AST} + {2625112800 -10800 1 ADT} + {2645672400 -14400 0 AST} + {2656562400 -10800 1 ADT} + {2677122000 -14400 0 AST} + {2688616800 -10800 1 ADT} + {2709176400 -14400 0 AST} + {2720066400 -10800 1 ADT} + {2740626000 -14400 0 AST} + {2751516000 -10800 1 ADT} + {2772075600 -14400 0 AST} + {2782965600 -10800 1 ADT} + {2803525200 -14400 0 AST} + {2814415200 -10800 1 ADT} + {2834974800 -14400 0 AST} + {2846469600 -10800 1 ADT} + {2867029200 -14400 0 AST} + {2877919200 -10800 1 ADT} + {2898478800 -14400 0 AST} + {2909368800 -10800 1 ADT} + {2929928400 -14400 0 AST} + {2940818400 -10800 1 ADT} + {2961378000 -14400 0 AST} + {2972268000 -10800 1 ADT} + {2992827600 -14400 0 AST} + {3003717600 -10800 1 ADT} + {3024277200 -14400 0 AST} + {3035772000 -10800 1 ADT} + {3056331600 -14400 0 AST} + {3067221600 -10800 1 ADT} + {3087781200 -14400 0 AST} + {3098671200 -10800 1 ADT} + {3119230800 -14400 0 AST} + {3130120800 -10800 1 ADT} + {3150680400 -14400 0 AST} + {3161570400 -10800 1 ADT} + {3182130000 -14400 0 AST} + {3193020000 -10800 1 ADT} + {3213579600 -14400 0 AST} + {3225074400 -10800 1 ADT} + {3245634000 -14400 0 AST} + {3256524000 -10800 1 ADT} + {3277083600 -14400 0 AST} + {3287973600 -10800 1 ADT} + {3308533200 -14400 0 AST} + {3319423200 -10800 1 ADT} + {3339982800 -14400 0 AST} + {3350872800 -10800 1 ADT} + {3371432400 -14400 0 AST} + {3382927200 -10800 1 ADT} + {3403486800 -14400 0 AST} + {3414376800 -10800 1 ADT} + {3434936400 -14400 0 AST} + {3445826400 -10800 1 ADT} + {3466386000 -14400 0 AST} + {3477276000 -10800 1 ADT} + {3497835600 -14400 0 AST} + {3508725600 -10800 1 ADT} + {3529285200 -14400 0 AST} + {3540175200 -10800 1 ADT} + {3560734800 -14400 0 AST} + {3572229600 -10800 1 ADT} + {3592789200 -14400 0 AST} + {3603679200 -10800 1 ADT} + {3624238800 -14400 0 AST} + {3635128800 -10800 1 ADT} + {3655688400 -14400 0 AST} + {3666578400 -10800 1 ADT} + {3687138000 -14400 0 AST} + {3698028000 -10800 1 ADT} + {3718587600 -14400 0 AST} + {3730082400 -10800 1 ADT} + {3750642000 -14400 0 AST} + {3761532000 -10800 1 ADT} + {3782091600 -14400 0 AST} + {3792981600 -10800 1 ADT} + {3813541200 -14400 0 AST} + {3824431200 -10800 1 ADT} + {3844990800 -14400 0 AST} + {3855880800 -10800 1 ADT} + {3876440400 -14400 0 AST} + {3887330400 -10800 1 ADT} + {3907890000 -14400 0 AST} + {3919384800 -10800 1 ADT} + {3939944400 -14400 0 AST} + {3950834400 -10800 1 ADT} + {3971394000 -14400 0 AST} + {3982284000 -10800 1 ADT} + {4002843600 -14400 0 AST} + {4013733600 -10800 1 ADT} + {4034293200 -14400 0 AST} + {4045183200 -10800 1 ADT} + {4065742800 -14400 0 AST} + {4076632800 -10800 1 ADT} + {4097192400 -14400 0 AST} +} diff --git a/env/tcl/tcl8.6/tzdata/America/Monterrey b/env/tcl/tcl8.6/tzdata/America/Monterrey new file mode 100644 index 0000000..4135884 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/America/Monterrey @@ -0,0 +1,218 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:America/Monterrey) { + {-9223372036854775808 -24076 0 LMT} + {-1514743200 -21600 0 CST} + {568015200 -21600 0 CST} + {576057600 -18000 1 CDT} + {594198000 -21600 0 CST} + {599637600 -21600 0 CST} + {828864000 -18000 1 CDT} + {846399600 -21600 0 CST} + {860313600 -18000 1 CDT} + {877849200 -21600 0 CST} + {891763200 -18000 1 CDT} + {909298800 -21600 0 CST} + {923212800 -18000 1 CDT} + {941353200 -21600 0 CST} + {954662400 -18000 1 CDT} + {972802800 -21600 0 CST} + {989136000 -18000 1 CDT} + {1001833200 -21600 0 CST} + {1018166400 -18000 1 CDT} + {1035702000 -21600 0 CST} + {1049616000 -18000 1 CDT} + {1067151600 -21600 0 CST} + {1081065600 -18000 1 CDT} + {1099206000 -21600 0 CST} + {1112515200 -18000 1 CDT} + {1130655600 -21600 0 CST} + {1143964800 -18000 1 CDT} + {1162105200 -21600 0 CST} + {1175414400 -18000 1 CDT} + {1193554800 -21600 0 CST} + {1207468800 -18000 1 CDT} + {1225004400 -21600 0 CST} + {1238918400 -18000 1 CDT} + {1256454000 -21600 0 CST} + {1270368000 -18000 1 CDT} + {1288508400 -21600 0 CST} + {1301817600 -18000 1 CDT} + {1319958000 -21600 0 CST} + {1333267200 -18000 1 CDT} + {1351407600 -21600 0 CST} + {1365321600 -18000 1 CDT} + {1382857200 -21600 0 CST} + {1396771200 -18000 1 CDT} + {1414306800 -21600 0 CST} + {1428220800 -18000 1 CDT} + {1445756400 -21600 0 CST} + {1459670400 -18000 1 CDT} + {1477810800 -21600 0 CST} + {1491120000 -18000 1 CDT} + {1509260400 -21600 0 CST} + {1522569600 -18000 1 CDT} + {1540710000 -21600 0 CST} + {1554624000 -18000 1 CDT} + {1572159600 -21600 0 CST} + {1586073600 -18000 1 CDT} + {1603609200 -21600 0 CST} + {1617523200 -18000 1 CDT} + {1635663600 -21600 0 CST} + {1648972800 -18000 1 CDT} + {1667113200 -21600 0 CST} + {1680422400 -18000 1 CDT} + {1698562800 -21600 0 CST} + {1712476800 -18000 1 CDT} + {1730012400 -21600 0 CST} + {1743926400 -18000 1 CDT} + {1761462000 -21600 0 CST} + {1775376000 -18000 1 CDT} + {1792911600 -21600 0 CST} + {1806825600 -18000 1 CDT} + {1824966000 -21600 0 CST} + {1838275200 -18000 1 CDT} + {1856415600 -21600 0 CST} + {1869724800 -18000 1 CDT} + {1887865200 -21600 0 CST} + {1901779200 -18000 1 CDT} + {1919314800 -21600 0 CST} + {1933228800 -18000 1 CDT} + {1950764400 -21600 0 CST} + {1964678400 -18000 1 CDT} + {1982818800 -21600 0 CST} + {1996128000 -18000 1 CDT} + {2014268400 -21600 0 CST} + {2027577600 -18000 1 CDT} + {2045718000 -21600 0 CST} + {2059027200 -18000 1 CDT} + {2077167600 -21600 0 CST} + {2091081600 -18000 1 CDT} + {2108617200 -21600 0 CST} + {2122531200 -18000 1 CDT} + {2140066800 -21600 0 CST} + {2153980800 -18000 1 CDT} + {2172121200 -21600 0 CST} + {2185430400 -18000 1 CDT} + {2203570800 -21600 0 CST} + {2216880000 -18000 1 CDT} + {2235020400 -21600 0 CST} + {2248934400 -18000 1 CDT} + {2266470000 -21600 0 CST} + {2280384000 -18000 1 CDT} + {2297919600 -21600 0 CST} + {2311833600 -18000 1 CDT} + {2329369200 -21600 0 CST} + {2343283200 -18000 1 CDT} + {2361423600 -21600 0 CST} + {2374732800 -18000 1 CDT} + {2392873200 -21600 0 CST} + {2406182400 -18000 1 CDT} + {2424322800 -21600 0 CST} + {2438236800 -18000 1 CDT} + {2455772400 -21600 0 CST} + {2469686400 -18000 1 CDT} + {2487222000 -21600 0 CST} + {2501136000 -18000 1 CDT} + {2519276400 -21600 0 CST} + {2532585600 -18000 1 CDT} + {2550726000 -21600 0 CST} + {2564035200 -18000 1 CDT} + {2582175600 -21600 0 CST} + {2596089600 -18000 1 CDT} + {2613625200 -21600 0 CST} + {2627539200 -18000 1 CDT} + {2645074800 -21600 0 CST} + {2658988800 -18000 1 CDT} + {2676524400 -21600 0 CST} + {2690438400 -18000 1 CDT} + {2708578800 -21600 0 CST} + {2721888000 -18000 1 CDT} + {2740028400 -21600 0 CST} + {2753337600 -18000 1 CDT} + {2771478000 -21600 0 CST} + {2785392000 -18000 1 CDT} + {2802927600 -21600 0 CST} + {2816841600 -18000 1 CDT} + {2834377200 -21600 0 CST} + {2848291200 -18000 1 CDT} + {2866431600 -21600 0 CST} + {2879740800 -18000 1 CDT} + {2897881200 -21600 0 CST} + {2911190400 -18000 1 CDT} + {2929330800 -21600 0 CST} + {2942640000 -18000 1 CDT} + {2960780400 -21600 0 CST} + {2974694400 -18000 1 CDT} + {2992230000 -21600 0 CST} + {3006144000 -18000 1 CDT} + {3023679600 -21600 0 CST} + {3037593600 -18000 1 CDT} + {3055734000 -21600 0 CST} + {3069043200 -18000 1 CDT} + {3087183600 -21600 0 CST} + {3100492800 -18000 1 CDT} + {3118633200 -21600 0 CST} + {3132547200 -18000 1 CDT} + {3150082800 -21600 0 CST} + {3163996800 -18000 1 CDT} + {3181532400 -21600 0 CST} + {3195446400 -18000 1 CDT} + {3212982000 -21600 0 CST} + {3226896000 -18000 1 CDT} + {3245036400 -21600 0 CST} + {3258345600 -18000 1 CDT} + {3276486000 -21600 0 CST} + {3289795200 -18000 1 CDT} + {3307935600 -21600 0 CST} + {3321849600 -18000 1 CDT} + {3339385200 -21600 0 CST} + {3353299200 -18000 1 CDT} + {3370834800 -21600 0 CST} + {3384748800 -18000 1 CDT} + {3402889200 -21600 0 CST} + {3416198400 -18000 1 CDT} + {3434338800 -21600 0 CST} + {3447648000 -18000 1 CDT} + {3465788400 -21600 0 CST} + {3479702400 -18000 1 CDT} + {3497238000 -21600 0 CST} + {3511152000 -18000 1 CDT} + {3528687600 -21600 0 CST} + {3542601600 -18000 1 CDT} + {3560137200 -21600 0 CST} + {3574051200 -18000 1 CDT} + {3592191600 -21600 0 CST} + {3605500800 -18000 1 CDT} + {3623641200 -21600 0 CST} + {3636950400 -18000 1 CDT} + {3655090800 -21600 0 CST} + {3669004800 -18000 1 CDT} + {3686540400 -21600 0 CST} + {3700454400 -18000 1 CDT} + {3717990000 -21600 0 CST} + {3731904000 -18000 1 CDT} + {3750044400 -21600 0 CST} + {3763353600 -18000 1 CDT} + {3781494000 -21600 0 CST} + {3794803200 -18000 1 CDT} + {3812943600 -21600 0 CST} + {3826252800 -18000 1 CDT} + {3844393200 -21600 0 CST} + {3858307200 -18000 1 CDT} + {3875842800 -21600 0 CST} + {3889756800 -18000 1 CDT} + {3907292400 -21600 0 CST} + {3921206400 -18000 1 CDT} + {3939346800 -21600 0 CST} + {3952656000 -18000 1 CDT} + {3970796400 -21600 0 CST} + {3984105600 -18000 1 CDT} + {4002246000 -21600 0 CST} + {4016160000 -18000 1 CDT} + {4033695600 -21600 0 CST} + {4047609600 -18000 1 CDT} + {4065145200 -21600 0 CST} + {4079059200 -18000 1 CDT} + {4096594800 -21600 0 CST} +} diff --git a/env/tcl/tcl8.6/tzdata/America/Montevideo b/env/tcl/tcl8.6/tzdata/America/Montevideo new file mode 100644 index 0000000..27fb76e --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/America/Montevideo @@ -0,0 +1,96 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:America/Montevideo) { + {-9223372036854775808 -13491 0 LMT} + {-1942690509 -13491 0 MMT} + {-1567455309 -14400 0 -04} + {-1459627200 -10800 0 -0330} + {-1443819600 -12600 0 -0330} + {-1428006600 -10800 1 -0330} + {-1412283600 -12600 0 -0330} + {-1396470600 -10800 1 -0330} + {-1380747600 -12600 0 -0330} + {-1141590600 -10800 1 -0330} + {-1128286800 -12600 0 -0330} + {-1110141000 -10800 1 -0330} + {-1096837200 -12600 0 -0330} + {-1078691400 -10800 1 -0330} + {-1065387600 -12600 0 -0330} + {-1047241800 -10800 1 -0330} + {-1033938000 -12600 0 -0330} + {-1015187400 -10800 1 -0330} + {-1002488400 -12600 0 -0330} + {-983737800 -10800 1 -0330} + {-971038800 -12600 0 -0330} + {-954707400 -10800 1 -0330} + {-938984400 -12600 0 -0330} + {-920838600 -10800 1 -0330} + {-907534800 -12600 0 -0330} + {-896819400 -10800 1 -0330} + {-853621200 -9000 0 -03} + {-845847000 -10800 0 -03} + {-334789200 -9000 1 -03} + {-319671000 -10800 0 -03} + {-315608400 -10800 0 -03} + {-314226000 -7200 1 -03} + {-309996000 -10800 0 -03} + {-149720400 -7200 1 -03} + {-134604000 -10800 0 -03} + {-63147600 -10800 0 -03} + {-50446800 -9000 1 -03} + {-34205400 -10800 0 -03} + {10800 -10800 0 -03} + {9860400 -7200 1 -03} + {14176800 -10800 0 -03} + {72846000 -7200 1 -03} + {80100000 -10800 0 -03} + {126241200 -10800 0 -03} + {127278000 -5400 1 -03} + {132112800 -9000 0 -03} + {147234600 -10800 0 -03} + {156909600 -10800 0 -03} + {156913200 -7200 1 -03} + {165376800 -10800 0 -03} + {219812400 -7200 1 -03} + {226461600 -10800 0 -03} + {250052400 -7200 1 -03} + {257911200 -10800 0 -03} + {282711600 -7200 1 -03} + {289360800 -10800 0 -03} + {294202800 -7200 1 -03} + {322020000 -10800 0 -03} + {566449200 -7200 1 -03} + {573012000 -10800 0 -03} + {597812400 -7200 1 -03} + {605066400 -10800 0 -03} + {625633200 -7200 1 -03} + {635911200 -10800 0 -03} + {656478000 -7200 1 -03} + {667965600 -10800 0 -03} + {688532400 -7200 1 -03} + {699415200 -10800 0 -03} + {719377200 -7200 1 -03} + {730864800 -10800 0 -03} + {1095562800 -7200 1 -03} + {1111896000 -10800 0 -03} + {1128834000 -7200 1 -03} + {1142136000 -10800 0 -03} + {1159678800 -7200 1 -03} + {1173585600 -10800 0 -03} + {1191733200 -7200 1 -03} + {1205035200 -10800 0 -03} + {1223182800 -7200 1 -03} + {1236484800 -10800 0 -03} + {1254632400 -7200 1 -03} + {1268539200 -10800 0 -03} + {1286082000 -7200 1 -03} + {1299988800 -10800 0 -03} + {1317531600 -7200 1 -03} + {1331438400 -10800 0 -03} + {1349586000 -7200 1 -03} + {1362888000 -10800 0 -03} + {1381035600 -7200 1 -03} + {1394337600 -10800 0 -03} + {1412485200 -7200 1 -03} + {1425787200 -10800 0 -03} +} diff --git a/env/tcl/tcl8.6/tzdata/America/Montreal b/env/tcl/tcl8.6/tzdata/America/Montreal new file mode 100644 index 0000000..0ead8ee --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/America/Montreal @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(America/Toronto)]} { + LoadTimeZoneFile America/Toronto +} +set TZData(:America/Montreal) $TZData(:America/Toronto) diff --git a/env/tcl/tcl8.6/tzdata/America/Montserrat b/env/tcl/tcl8.6/tzdata/America/Montserrat new file mode 100644 index 0000000..0a656d3 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/America/Montserrat @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(America/Port_of_Spain)]} { + LoadTimeZoneFile America/Port_of_Spain +} +set TZData(:America/Montserrat) $TZData(:America/Port_of_Spain) diff --git a/env/tcl/tcl8.6/tzdata/America/Nassau b/env/tcl/tcl8.6/tzdata/America/Nassau new file mode 100644 index 0000000..1c35e93 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/America/Nassau @@ -0,0 +1,279 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:America/Nassau) { + {-9223372036854775808 -18570 0 LMT} + {-1825095030 -18000 0 EST} + {-179341200 -14400 1 EDT} + {-163620000 -18000 0 EST} + {-147891600 -14400 1 EDT} + {-131565600 -18000 0 EST} + {-116442000 -14400 1 EDT} + {-100116000 -18000 0 EST} + {-84387600 -14400 1 EDT} + {-68666400 -18000 0 EST} + {-52938000 -14400 1 EDT} + {-37216800 -18000 0 EST} + {-21488400 -14400 1 EDT} + {-5767200 -18000 0 EST} + {9961200 -14400 1 EDT} + {25682400 -18000 0 EST} + {41410800 -14400 1 EDT} + {57736800 -18000 0 EST} + {73465200 -14400 1 EDT} + {89186400 -18000 0 EST} + {104914800 -14400 1 EDT} + {120636000 -18000 0 EST} + {136364400 -14400 1 EDT} + {152085600 -18000 0 EST} + {167814000 -14400 1 EDT} + {183535200 -18000 0 EST} + {189320400 -18000 0 EST} + {199263600 -14400 1 EDT} + {215589600 -18000 0 EST} + {230713200 -14400 1 EDT} + {247039200 -18000 0 EST} + {262767600 -14400 1 EDT} + {278488800 -18000 0 EST} + {294217200 -14400 1 EDT} + {309938400 -18000 0 EST} + {325666800 -14400 1 EDT} + {341388000 -18000 0 EST} + {357116400 -14400 1 EDT} + {372837600 -18000 0 EST} + {388566000 -14400 1 EDT} + {404892000 -18000 0 EST} + {420015600 -14400 1 EDT} + {436341600 -18000 0 EST} + {452070000 -14400 1 EDT} + {467791200 -18000 0 EST} + {483519600 -14400 1 EDT} + {499240800 -18000 0 EST} + {514969200 -14400 1 EDT} + {530690400 -18000 0 EST} + {544604400 -14400 1 EDT} + {562140000 -18000 0 EST} + {576054000 -14400 1 EDT} + {594194400 -18000 0 EST} + {607503600 -14400 1 EDT} + {625644000 -18000 0 EST} + {638953200 -14400 1 EDT} + {657093600 -18000 0 EST} + {671007600 -14400 1 EDT} + {688543200 -18000 0 EST} + {702457200 -14400 1 EDT} + {719992800 -18000 0 EST} + {733906800 -14400 1 EDT} + {752047200 -18000 0 EST} + {765356400 -14400 1 EDT} + {783496800 -18000 0 EST} + {796806000 -14400 1 EDT} + {814946400 -18000 0 EST} + {828860400 -14400 1 EDT} + {846396000 -18000 0 EST} + {860310000 -14400 1 EDT} + {877845600 -18000 0 EST} + {891759600 -14400 1 EDT} + {909295200 -18000 0 EST} + {923209200 -14400 1 EDT} + {941349600 -18000 0 EST} + {954658800 -14400 1 EDT} + {972799200 -18000 0 EST} + {986108400 -14400 1 EDT} + {1004248800 -18000 0 EST} + {1018162800 -14400 1 EDT} + {1035698400 -18000 0 EST} + {1049612400 -14400 1 EDT} + {1067148000 -18000 0 EST} + {1081062000 -14400 1 EDT} + {1099202400 -18000 0 EST} + {1112511600 -14400 1 EDT} + {1130652000 -18000 0 EST} + {1143961200 -14400 1 EDT} + {1162101600 -18000 0 EST} + {1173596400 -14400 1 EDT} + {1194156000 -18000 0 EST} + {1205046000 -14400 1 EDT} + {1225605600 -18000 0 EST} + {1236495600 -14400 1 EDT} + {1257055200 -18000 0 EST} + {1268550000 -14400 1 EDT} + {1289109600 -18000 0 EST} + {1299999600 -14400 1 EDT} + {1320559200 -18000 0 EST} + {1331449200 -14400 1 EDT} + {1352008800 -18000 0 EST} + {1362898800 -14400 1 EDT} + {1383458400 -18000 0 EST} + {1394348400 -14400 1 EDT} + {1414908000 -18000 0 EST} + {1425798000 -14400 1 EDT} + {1446357600 -18000 0 EST} + {1457852400 -14400 1 EDT} + {1478412000 -18000 0 EST} + {1489302000 -14400 1 EDT} + {1509861600 -18000 0 EST} + {1520751600 -14400 1 EDT} + {1541311200 -18000 0 EST} + {1552201200 -14400 1 EDT} + {1572760800 -18000 0 EST} + {1583650800 -14400 1 EDT} + {1604210400 -18000 0 EST} + {1615705200 -14400 1 EDT} + {1636264800 -18000 0 EST} + {1647154800 -14400 1 EDT} + {1667714400 -18000 0 EST} + {1678604400 -14400 1 EDT} + {1699164000 -18000 0 EST} + {1710054000 -14400 1 EDT} + {1730613600 -18000 0 EST} + {1741503600 -14400 1 EDT} + {1762063200 -18000 0 EST} + {1772953200 -14400 1 EDT} + {1793512800 -18000 0 EST} + {1805007600 -14400 1 EDT} + {1825567200 -18000 0 EST} + {1836457200 -14400 1 EDT} + {1857016800 -18000 0 EST} + {1867906800 -14400 1 EDT} + {1888466400 -18000 0 EST} + {1899356400 -14400 1 EDT} + {1919916000 -18000 0 EST} + {1930806000 -14400 1 EDT} + {1951365600 -18000 0 EST} + {1962860400 -14400 1 EDT} + {1983420000 -18000 0 EST} + {1994310000 -14400 1 EDT} + {2014869600 -18000 0 EST} + {2025759600 -14400 1 EDT} + {2046319200 -18000 0 EST} + {2057209200 -14400 1 EDT} + {2077768800 -18000 0 EST} + {2088658800 -14400 1 EDT} + {2109218400 -18000 0 EST} + {2120108400 -14400 1 EDT} + {2140668000 -18000 0 EST} + {2152162800 -14400 1 EDT} + {2172722400 -18000 0 EST} + {2183612400 -14400 1 EDT} + {2204172000 -18000 0 EST} + {2215062000 -14400 1 EDT} + {2235621600 -18000 0 EST} + {2246511600 -14400 1 EDT} + {2267071200 -18000 0 EST} + {2277961200 -14400 1 EDT} + {2298520800 -18000 0 EST} + {2309410800 -14400 1 EDT} + {2329970400 -18000 0 EST} + {2341465200 -14400 1 EDT} + {2362024800 -18000 0 EST} + {2372914800 -14400 1 EDT} + {2393474400 -18000 0 EST} + {2404364400 -14400 1 EDT} + {2424924000 -18000 0 EST} + {2435814000 -14400 1 EDT} + {2456373600 -18000 0 EST} + {2467263600 -14400 1 EDT} + {2487823200 -18000 0 EST} + {2499318000 -14400 1 EDT} + {2519877600 -18000 0 EST} + {2530767600 -14400 1 EDT} + {2551327200 -18000 0 EST} + {2562217200 -14400 1 EDT} + {2582776800 -18000 0 EST} + {2593666800 -14400 1 EDT} + {2614226400 -18000 0 EST} + {2625116400 -14400 1 EDT} + {2645676000 -18000 0 EST} + {2656566000 -14400 1 EDT} + {2677125600 -18000 0 EST} + {2688620400 -14400 1 EDT} + {2709180000 -18000 0 EST} + {2720070000 -14400 1 EDT} + {2740629600 -18000 0 EST} + {2751519600 -14400 1 EDT} + {2772079200 -18000 0 EST} + {2782969200 -14400 1 EDT} + {2803528800 -18000 0 EST} + {2814418800 -14400 1 EDT} + {2834978400 -18000 0 EST} + {2846473200 -14400 1 EDT} + {2867032800 -18000 0 EST} + {2877922800 -14400 1 EDT} + {2898482400 -18000 0 EST} + {2909372400 -14400 1 EDT} + {2929932000 -18000 0 EST} + {2940822000 -14400 1 EDT} + {2961381600 -18000 0 EST} + {2972271600 -14400 1 EDT} + {2992831200 -18000 0 EST} + {3003721200 -14400 1 EDT} + {3024280800 -18000 0 EST} + {3035775600 -14400 1 EDT} + {3056335200 -18000 0 EST} + {3067225200 -14400 1 EDT} + {3087784800 -18000 0 EST} + {3098674800 -14400 1 EDT} + {3119234400 -18000 0 EST} + {3130124400 -14400 1 EDT} + {3150684000 -18000 0 EST} + {3161574000 -14400 1 EDT} + {3182133600 -18000 0 EST} + {3193023600 -14400 1 EDT} + {3213583200 -18000 0 EST} + {3225078000 -14400 1 EDT} + {3245637600 -18000 0 EST} + {3256527600 -14400 1 EDT} + {3277087200 -18000 0 EST} + {3287977200 -14400 1 EDT} + {3308536800 -18000 0 EST} + {3319426800 -14400 1 EDT} + {3339986400 -18000 0 EST} + {3350876400 -14400 1 EDT} + {3371436000 -18000 0 EST} + {3382930800 -14400 1 EDT} + {3403490400 -18000 0 EST} + {3414380400 -14400 1 EDT} + {3434940000 -18000 0 EST} + {3445830000 -14400 1 EDT} + {3466389600 -18000 0 EST} + {3477279600 -14400 1 EDT} + {3497839200 -18000 0 EST} + {3508729200 -14400 1 EDT} + {3529288800 -18000 0 EST} + {3540178800 -14400 1 EDT} + {3560738400 -18000 0 EST} + {3572233200 -14400 1 EDT} + {3592792800 -18000 0 EST} + {3603682800 -14400 1 EDT} + {3624242400 -18000 0 EST} + {3635132400 -14400 1 EDT} + {3655692000 -18000 0 EST} + {3666582000 -14400 1 EDT} + {3687141600 -18000 0 EST} + {3698031600 -14400 1 EDT} + {3718591200 -18000 0 EST} + {3730086000 -14400 1 EDT} + {3750645600 -18000 0 EST} + {3761535600 -14400 1 EDT} + {3782095200 -18000 0 EST} + {3792985200 -14400 1 EDT} + {3813544800 -18000 0 EST} + {3824434800 -14400 1 EDT} + {3844994400 -18000 0 EST} + {3855884400 -14400 1 EDT} + {3876444000 -18000 0 EST} + {3887334000 -14400 1 EDT} + {3907893600 -18000 0 EST} + {3919388400 -14400 1 EDT} + {3939948000 -18000 0 EST} + {3950838000 -14400 1 EDT} + {3971397600 -18000 0 EST} + {3982287600 -14400 1 EDT} + {4002847200 -18000 0 EST} + {4013737200 -14400 1 EDT} + {4034296800 -18000 0 EST} + {4045186800 -14400 1 EDT} + {4065746400 -18000 0 EST} + {4076636400 -14400 1 EDT} + {4097196000 -18000 0 EST} +} diff --git a/env/tcl/tcl8.6/tzdata/America/New_York b/env/tcl/tcl8.6/tzdata/America/New_York new file mode 100644 index 0000000..72f2c96 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/America/New_York @@ -0,0 +1,369 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:America/New_York) { + {-9223372036854775808 -17762 0 LMT} + {-2717650800 -18000 0 EST} + {-1633280400 -14400 1 EDT} + {-1615140000 -18000 0 EST} + {-1601830800 -14400 1 EDT} + {-1583690400 -18000 0 EST} + {-1577905200 -18000 0 EST} + {-1570381200 -14400 1 EDT} + {-1551636000 -18000 0 EST} + {-1536512400 -14400 1 EDT} + {-1523210400 -18000 0 EST} + {-1504458000 -14400 1 EDT} + {-1491760800 -18000 0 EST} + {-1473008400 -14400 1 EDT} + {-1459706400 -18000 0 EST} + {-1441558800 -14400 1 EDT} + {-1428256800 -18000 0 EST} + {-1410109200 -14400 1 EDT} + {-1396807200 -18000 0 EST} + {-1378659600 -14400 1 EDT} + {-1365357600 -18000 0 EST} + {-1347210000 -14400 1 EDT} + {-1333908000 -18000 0 EST} + {-1315155600 -14400 1 EDT} + {-1301853600 -18000 0 EST} + {-1283706000 -14400 1 EDT} + {-1270404000 -18000 0 EST} + {-1252256400 -14400 1 EDT} + {-1238954400 -18000 0 EST} + {-1220806800 -14400 1 EDT} + {-1207504800 -18000 0 EST} + {-1189357200 -14400 1 EDT} + {-1176055200 -18000 0 EST} + {-1157302800 -14400 1 EDT} + {-1144605600 -18000 0 EST} + {-1125853200 -14400 1 EDT} + {-1112551200 -18000 0 EST} + {-1094403600 -14400 1 EDT} + {-1081101600 -18000 0 EST} + {-1062954000 -14400 1 EDT} + {-1049652000 -18000 0 EST} + {-1031504400 -14400 1 EDT} + {-1018202400 -18000 0 EST} + {-1000054800 -14400 1 EDT} + {-986752800 -18000 0 EST} + {-968000400 -14400 1 EDT} + {-955303200 -18000 0 EST} + {-936550800 -14400 1 EDT} + {-923248800 -18000 0 EST} + {-905101200 -14400 1 EDT} + {-891799200 -18000 0 EST} + {-883594800 -18000 0 EST} + {-880218000 -14400 1 EWT} + {-769395600 -14400 1 EPT} + {-765396000 -18000 0 EST} + {-757364400 -18000 0 EST} + {-747248400 -14400 1 EDT} + {-733946400 -18000 0 EST} + {-715798800 -14400 1 EDT} + {-702496800 -18000 0 EST} + {-684349200 -14400 1 EDT} + {-671047200 -18000 0 EST} + {-652899600 -14400 1 EDT} + {-639597600 -18000 0 EST} + {-620845200 -14400 1 EDT} + {-608148000 -18000 0 EST} + {-589395600 -14400 1 EDT} + {-576093600 -18000 0 EST} + {-557946000 -14400 1 EDT} + {-544644000 -18000 0 EST} + {-526496400 -14400 1 EDT} + {-513194400 -18000 0 EST} + {-495046800 -14400 1 EDT} + {-481744800 -18000 0 EST} + {-463597200 -14400 1 EDT} + {-447271200 -18000 0 EST} + {-431542800 -14400 1 EDT} + {-415821600 -18000 0 EST} + {-400093200 -14400 1 EDT} + {-384372000 -18000 0 EST} + {-368643600 -14400 1 EDT} + {-352922400 -18000 0 EST} + {-337194000 -14400 1 EDT} + {-321472800 -18000 0 EST} + {-305744400 -14400 1 EDT} + {-289418400 -18000 0 EST} + {-273690000 -14400 1 EDT} + {-257968800 -18000 0 EST} + {-242240400 -14400 1 EDT} + {-226519200 -18000 0 EST} + {-210790800 -14400 1 EDT} + {-195069600 -18000 0 EST} + {-179341200 -14400 1 EDT} + {-163620000 -18000 0 EST} + {-147891600 -14400 1 EDT} + {-131565600 -18000 0 EST} + {-116442000 -14400 1 EDT} + {-100116000 -18000 0 EST} + {-94676400 -18000 0 EST} + {-84387600 -14400 1 EDT} + {-68666400 -18000 0 EST} + {-52938000 -14400 1 EDT} + {-37216800 -18000 0 EST} + {-21488400 -14400 1 EDT} + {-5767200 -18000 0 EST} + {9961200 -14400 1 EDT} + {25682400 -18000 0 EST} + {41410800 -14400 1 EDT} + {57736800 -18000 0 EST} + {73465200 -14400 1 EDT} + {89186400 -18000 0 EST} + {104914800 -14400 1 EDT} + {120636000 -18000 0 EST} + {126687600 -14400 1 EDT} + {152085600 -18000 0 EST} + {162370800 -14400 1 EDT} + {183535200 -18000 0 EST} + {199263600 -14400 1 EDT} + {215589600 -18000 0 EST} + {230713200 -14400 1 EDT} + {247039200 -18000 0 EST} + {262767600 -14400 1 EDT} + {278488800 -18000 0 EST} + {294217200 -14400 1 EDT} + {309938400 -18000 0 EST} + {325666800 -14400 1 EDT} + {341388000 -18000 0 EST} + {357116400 -14400 1 EDT} + {372837600 -18000 0 EST} + {388566000 -14400 1 EDT} + {404892000 -18000 0 EST} + {420015600 -14400 1 EDT} + {436341600 -18000 0 EST} + {452070000 -14400 1 EDT} + {467791200 -18000 0 EST} + {483519600 -14400 1 EDT} + {499240800 -18000 0 EST} + {514969200 -14400 1 EDT} + {530690400 -18000 0 EST} + {544604400 -14400 1 EDT} + {562140000 -18000 0 EST} + {576054000 -14400 1 EDT} + {594194400 -18000 0 EST} + {607503600 -14400 1 EDT} + {625644000 -18000 0 EST} + {638953200 -14400 1 EDT} + {657093600 -18000 0 EST} + {671007600 -14400 1 EDT} + {688543200 -18000 0 EST} + {702457200 -14400 1 EDT} + {719992800 -18000 0 EST} + {733906800 -14400 1 EDT} + {752047200 -18000 0 EST} + {765356400 -14400 1 EDT} + {783496800 -18000 0 EST} + {796806000 -14400 1 EDT} + {814946400 -18000 0 EST} + {828860400 -14400 1 EDT} + {846396000 -18000 0 EST} + {860310000 -14400 1 EDT} + {877845600 -18000 0 EST} + {891759600 -14400 1 EDT} + {909295200 -18000 0 EST} + {923209200 -14400 1 EDT} + {941349600 -18000 0 EST} + {954658800 -14400 1 EDT} + {972799200 -18000 0 EST} + {986108400 -14400 1 EDT} + {1004248800 -18000 0 EST} + {1018162800 -14400 1 EDT} + {1035698400 -18000 0 EST} + {1049612400 -14400 1 EDT} + {1067148000 -18000 0 EST} + {1081062000 -14400 1 EDT} + {1099202400 -18000 0 EST} + {1112511600 -14400 1 EDT} + {1130652000 -18000 0 EST} + {1143961200 -14400 1 EDT} + {1162101600 -18000 0 EST} + {1173596400 -14400 1 EDT} + {1194156000 -18000 0 EST} + {1205046000 -14400 1 EDT} + {1225605600 -18000 0 EST} + {1236495600 -14400 1 EDT} + {1257055200 -18000 0 EST} + {1268550000 -14400 1 EDT} + {1289109600 -18000 0 EST} + {1299999600 -14400 1 EDT} + {1320559200 -18000 0 EST} + {1331449200 -14400 1 EDT} + {1352008800 -18000 0 EST} + {1362898800 -14400 1 EDT} + {1383458400 -18000 0 EST} + {1394348400 -14400 1 EDT} + {1414908000 -18000 0 EST} + {1425798000 -14400 1 EDT} + {1446357600 -18000 0 EST} + {1457852400 -14400 1 EDT} + {1478412000 -18000 0 EST} + {1489302000 -14400 1 EDT} + {1509861600 -18000 0 EST} + {1520751600 -14400 1 EDT} + {1541311200 -18000 0 EST} + {1552201200 -14400 1 EDT} + {1572760800 -18000 0 EST} + {1583650800 -14400 1 EDT} + {1604210400 -18000 0 EST} + {1615705200 -14400 1 EDT} + {1636264800 -18000 0 EST} + {1647154800 -14400 1 EDT} + {1667714400 -18000 0 EST} + {1678604400 -14400 1 EDT} + {1699164000 -18000 0 EST} + {1710054000 -14400 1 EDT} + {1730613600 -18000 0 EST} + {1741503600 -14400 1 EDT} + {1762063200 -18000 0 EST} + {1772953200 -14400 1 EDT} + {1793512800 -18000 0 EST} + {1805007600 -14400 1 EDT} + {1825567200 -18000 0 EST} + {1836457200 -14400 1 EDT} + {1857016800 -18000 0 EST} + {1867906800 -14400 1 EDT} + {1888466400 -18000 0 EST} + {1899356400 -14400 1 EDT} + {1919916000 -18000 0 EST} + {1930806000 -14400 1 EDT} + {1951365600 -18000 0 EST} + {1962860400 -14400 1 EDT} + {1983420000 -18000 0 EST} + {1994310000 -14400 1 EDT} + {2014869600 -18000 0 EST} + {2025759600 -14400 1 EDT} + {2046319200 -18000 0 EST} + {2057209200 -14400 1 EDT} + {2077768800 -18000 0 EST} + {2088658800 -14400 1 EDT} + {2109218400 -18000 0 EST} + {2120108400 -14400 1 EDT} + {2140668000 -18000 0 EST} + {2152162800 -14400 1 EDT} + {2172722400 -18000 0 EST} + {2183612400 -14400 1 EDT} + {2204172000 -18000 0 EST} + {2215062000 -14400 1 EDT} + {2235621600 -18000 0 EST} + {2246511600 -14400 1 EDT} + {2267071200 -18000 0 EST} + {2277961200 -14400 1 EDT} + {2298520800 -18000 0 EST} + {2309410800 -14400 1 EDT} + {2329970400 -18000 0 EST} + {2341465200 -14400 1 EDT} + {2362024800 -18000 0 EST} + {2372914800 -14400 1 EDT} + {2393474400 -18000 0 EST} + {2404364400 -14400 1 EDT} + {2424924000 -18000 0 EST} + {2435814000 -14400 1 EDT} + {2456373600 -18000 0 EST} + {2467263600 -14400 1 EDT} + {2487823200 -18000 0 EST} + {2499318000 -14400 1 EDT} + {2519877600 -18000 0 EST} + {2530767600 -14400 1 EDT} + {2551327200 -18000 0 EST} + {2562217200 -14400 1 EDT} + {2582776800 -18000 0 EST} + {2593666800 -14400 1 EDT} + {2614226400 -18000 0 EST} + {2625116400 -14400 1 EDT} + {2645676000 -18000 0 EST} + {2656566000 -14400 1 EDT} + {2677125600 -18000 0 EST} + {2688620400 -14400 1 EDT} + {2709180000 -18000 0 EST} + {2720070000 -14400 1 EDT} + {2740629600 -18000 0 EST} + {2751519600 -14400 1 EDT} + {2772079200 -18000 0 EST} + {2782969200 -14400 1 EDT} + {2803528800 -18000 0 EST} + {2814418800 -14400 1 EDT} + {2834978400 -18000 0 EST} + {2846473200 -14400 1 EDT} + {2867032800 -18000 0 EST} + {2877922800 -14400 1 EDT} + {2898482400 -18000 0 EST} + {2909372400 -14400 1 EDT} + {2929932000 -18000 0 EST} + {2940822000 -14400 1 EDT} + {2961381600 -18000 0 EST} + {2972271600 -14400 1 EDT} + {2992831200 -18000 0 EST} + {3003721200 -14400 1 EDT} + {3024280800 -18000 0 EST} + {3035775600 -14400 1 EDT} + {3056335200 -18000 0 EST} + {3067225200 -14400 1 EDT} + {3087784800 -18000 0 EST} + {3098674800 -14400 1 EDT} + {3119234400 -18000 0 EST} + {3130124400 -14400 1 EDT} + {3150684000 -18000 0 EST} + {3161574000 -14400 1 EDT} + {3182133600 -18000 0 EST} + {3193023600 -14400 1 EDT} + {3213583200 -18000 0 EST} + {3225078000 -14400 1 EDT} + {3245637600 -18000 0 EST} + {3256527600 -14400 1 EDT} + {3277087200 -18000 0 EST} + {3287977200 -14400 1 EDT} + {3308536800 -18000 0 EST} + {3319426800 -14400 1 EDT} + {3339986400 -18000 0 EST} + {3350876400 -14400 1 EDT} + {3371436000 -18000 0 EST} + {3382930800 -14400 1 EDT} + {3403490400 -18000 0 EST} + {3414380400 -14400 1 EDT} + {3434940000 -18000 0 EST} + {3445830000 -14400 1 EDT} + {3466389600 -18000 0 EST} + {3477279600 -14400 1 EDT} + {3497839200 -18000 0 EST} + {3508729200 -14400 1 EDT} + {3529288800 -18000 0 EST} + {3540178800 -14400 1 EDT} + {3560738400 -18000 0 EST} + {3572233200 -14400 1 EDT} + {3592792800 -18000 0 EST} + {3603682800 -14400 1 EDT} + {3624242400 -18000 0 EST} + {3635132400 -14400 1 EDT} + {3655692000 -18000 0 EST} + {3666582000 -14400 1 EDT} + {3687141600 -18000 0 EST} + {3698031600 -14400 1 EDT} + {3718591200 -18000 0 EST} + {3730086000 -14400 1 EDT} + {3750645600 -18000 0 EST} + {3761535600 -14400 1 EDT} + {3782095200 -18000 0 EST} + {3792985200 -14400 1 EDT} + {3813544800 -18000 0 EST} + {3824434800 -14400 1 EDT} + {3844994400 -18000 0 EST} + {3855884400 -14400 1 EDT} + {3876444000 -18000 0 EST} + {3887334000 -14400 1 EDT} + {3907893600 -18000 0 EST} + {3919388400 -14400 1 EDT} + {3939948000 -18000 0 EST} + {3950838000 -14400 1 EDT} + {3971397600 -18000 0 EST} + {3982287600 -14400 1 EDT} + {4002847200 -18000 0 EST} + {4013737200 -14400 1 EDT} + {4034296800 -18000 0 EST} + {4045186800 -14400 1 EDT} + {4065746400 -18000 0 EST} + {4076636400 -14400 1 EDT} + {4097196000 -18000 0 EST} +} diff --git a/env/tcl/tcl8.6/tzdata/America/Nipigon b/env/tcl/tcl8.6/tzdata/America/Nipigon new file mode 100644 index 0000000..30690aa --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/America/Nipigon @@ -0,0 +1,264 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:America/Nipigon) { + {-9223372036854775808 -21184 0 LMT} + {-2366734016 -18000 0 EST} + {-1632070800 -14400 1 EDT} + {-1615140000 -18000 0 EST} + {-923252400 -14400 1 EDT} + {-880218000 -14400 0 EWT} + {-769395600 -14400 1 EPT} + {-765396000 -18000 0 EST} + {136364400 -14400 1 EDT} + {152085600 -18000 0 EST} + {167814000 -14400 1 EDT} + {183535200 -18000 0 EST} + {199263600 -14400 1 EDT} + {215589600 -18000 0 EST} + {230713200 -14400 1 EDT} + {247039200 -18000 0 EST} + {262767600 -14400 1 EDT} + {278488800 -18000 0 EST} + {294217200 -14400 1 EDT} + {309938400 -18000 0 EST} + {325666800 -14400 1 EDT} + {341388000 -18000 0 EST} + {357116400 -14400 1 EDT} + {372837600 -18000 0 EST} + {388566000 -14400 1 EDT} + {404892000 -18000 0 EST} + {420015600 -14400 1 EDT} + {436341600 -18000 0 EST} + {452070000 -14400 1 EDT} + {467791200 -18000 0 EST} + {483519600 -14400 1 EDT} + {499240800 -18000 0 EST} + {514969200 -14400 1 EDT} + {530690400 -18000 0 EST} + {544604400 -14400 1 EDT} + {562140000 -18000 0 EST} + {576054000 -14400 1 EDT} + {594194400 -18000 0 EST} + {607503600 -14400 1 EDT} + {625644000 -18000 0 EST} + {638953200 -14400 1 EDT} + {657093600 -18000 0 EST} + {671007600 -14400 1 EDT} + {688543200 -18000 0 EST} + {702457200 -14400 1 EDT} + {719992800 -18000 0 EST} + {733906800 -14400 1 EDT} + {752047200 -18000 0 EST} + {765356400 -14400 1 EDT} + {783496800 -18000 0 EST} + {796806000 -14400 1 EDT} + {814946400 -18000 0 EST} + {828860400 -14400 1 EDT} + {846396000 -18000 0 EST} + {860310000 -14400 1 EDT} + {877845600 -18000 0 EST} + {891759600 -14400 1 EDT} + {909295200 -18000 0 EST} + {923209200 -14400 1 EDT} + {941349600 -18000 0 EST} + {954658800 -14400 1 EDT} + {972799200 -18000 0 EST} + {986108400 -14400 1 EDT} + {1004248800 -18000 0 EST} + {1018162800 -14400 1 EDT} + {1035698400 -18000 0 EST} + {1049612400 -14400 1 EDT} + {1067148000 -18000 0 EST} + {1081062000 -14400 1 EDT} + {1099202400 -18000 0 EST} + {1112511600 -14400 1 EDT} + {1130652000 -18000 0 EST} + {1143961200 -14400 1 EDT} + {1162101600 -18000 0 EST} + {1173596400 -14400 1 EDT} + {1194156000 -18000 0 EST} + {1205046000 -14400 1 EDT} + {1225605600 -18000 0 EST} + {1236495600 -14400 1 EDT} + {1257055200 -18000 0 EST} + {1268550000 -14400 1 EDT} + {1289109600 -18000 0 EST} + {1299999600 -14400 1 EDT} + {1320559200 -18000 0 EST} + {1331449200 -14400 1 EDT} + {1352008800 -18000 0 EST} + {1362898800 -14400 1 EDT} + {1383458400 -18000 0 EST} + {1394348400 -14400 1 EDT} + {1414908000 -18000 0 EST} + {1425798000 -14400 1 EDT} + {1446357600 -18000 0 EST} + {1457852400 -14400 1 EDT} + {1478412000 -18000 0 EST} + {1489302000 -14400 1 EDT} + {1509861600 -18000 0 EST} + {1520751600 -14400 1 EDT} + {1541311200 -18000 0 EST} + {1552201200 -14400 1 EDT} + {1572760800 -18000 0 EST} + {1583650800 -14400 1 EDT} + {1604210400 -18000 0 EST} + {1615705200 -14400 1 EDT} + {1636264800 -18000 0 EST} + {1647154800 -14400 1 EDT} + {1667714400 -18000 0 EST} + {1678604400 -14400 1 EDT} + {1699164000 -18000 0 EST} + {1710054000 -14400 1 EDT} + {1730613600 -18000 0 EST} + {1741503600 -14400 1 EDT} + {1762063200 -18000 0 EST} + {1772953200 -14400 1 EDT} + {1793512800 -18000 0 EST} + {1805007600 -14400 1 EDT} + {1825567200 -18000 0 EST} + {1836457200 -14400 1 EDT} + {1857016800 -18000 0 EST} + {1867906800 -14400 1 EDT} + {1888466400 -18000 0 EST} + {1899356400 -14400 1 EDT} + {1919916000 -18000 0 EST} + {1930806000 -14400 1 EDT} + {1951365600 -18000 0 EST} + {1962860400 -14400 1 EDT} + {1983420000 -18000 0 EST} + {1994310000 -14400 1 EDT} + {2014869600 -18000 0 EST} + {2025759600 -14400 1 EDT} + {2046319200 -18000 0 EST} + {2057209200 -14400 1 EDT} + {2077768800 -18000 0 EST} + {2088658800 -14400 1 EDT} + {2109218400 -18000 0 EST} + {2120108400 -14400 1 EDT} + {2140668000 -18000 0 EST} + {2152162800 -14400 1 EDT} + {2172722400 -18000 0 EST} + {2183612400 -14400 1 EDT} + {2204172000 -18000 0 EST} + {2215062000 -14400 1 EDT} + {2235621600 -18000 0 EST} + {2246511600 -14400 1 EDT} + {2267071200 -18000 0 EST} + {2277961200 -14400 1 EDT} + {2298520800 -18000 0 EST} + {2309410800 -14400 1 EDT} + {2329970400 -18000 0 EST} + {2341465200 -14400 1 EDT} + {2362024800 -18000 0 EST} + {2372914800 -14400 1 EDT} + {2393474400 -18000 0 EST} + {2404364400 -14400 1 EDT} + {2424924000 -18000 0 EST} + {2435814000 -14400 1 EDT} + {2456373600 -18000 0 EST} + {2467263600 -14400 1 EDT} + {2487823200 -18000 0 EST} + {2499318000 -14400 1 EDT} + {2519877600 -18000 0 EST} + {2530767600 -14400 1 EDT} + {2551327200 -18000 0 EST} + {2562217200 -14400 1 EDT} + {2582776800 -18000 0 EST} + {2593666800 -14400 1 EDT} + {2614226400 -18000 0 EST} + {2625116400 -14400 1 EDT} + {2645676000 -18000 0 EST} + {2656566000 -14400 1 EDT} + {2677125600 -18000 0 EST} + {2688620400 -14400 1 EDT} + {2709180000 -18000 0 EST} + {2720070000 -14400 1 EDT} + {2740629600 -18000 0 EST} + {2751519600 -14400 1 EDT} + {2772079200 -18000 0 EST} + {2782969200 -14400 1 EDT} + {2803528800 -18000 0 EST} + {2814418800 -14400 1 EDT} + {2834978400 -18000 0 EST} + {2846473200 -14400 1 EDT} + {2867032800 -18000 0 EST} + {2877922800 -14400 1 EDT} + {2898482400 -18000 0 EST} + {2909372400 -14400 1 EDT} + {2929932000 -18000 0 EST} + {2940822000 -14400 1 EDT} + {2961381600 -18000 0 EST} + {2972271600 -14400 1 EDT} + {2992831200 -18000 0 EST} + {3003721200 -14400 1 EDT} + {3024280800 -18000 0 EST} + {3035775600 -14400 1 EDT} + {3056335200 -18000 0 EST} + {3067225200 -14400 1 EDT} + {3087784800 -18000 0 EST} + {3098674800 -14400 1 EDT} + {3119234400 -18000 0 EST} + {3130124400 -14400 1 EDT} + {3150684000 -18000 0 EST} + {3161574000 -14400 1 EDT} + {3182133600 -18000 0 EST} + {3193023600 -14400 1 EDT} + {3213583200 -18000 0 EST} + {3225078000 -14400 1 EDT} + {3245637600 -18000 0 EST} + {3256527600 -14400 1 EDT} + {3277087200 -18000 0 EST} + {3287977200 -14400 1 EDT} + {3308536800 -18000 0 EST} + {3319426800 -14400 1 EDT} + {3339986400 -18000 0 EST} + {3350876400 -14400 1 EDT} + {3371436000 -18000 0 EST} + {3382930800 -14400 1 EDT} + {3403490400 -18000 0 EST} + {3414380400 -14400 1 EDT} + {3434940000 -18000 0 EST} + {3445830000 -14400 1 EDT} + {3466389600 -18000 0 EST} + {3477279600 -14400 1 EDT} + {3497839200 -18000 0 EST} + {3508729200 -14400 1 EDT} + {3529288800 -18000 0 EST} + {3540178800 -14400 1 EDT} + {3560738400 -18000 0 EST} + {3572233200 -14400 1 EDT} + {3592792800 -18000 0 EST} + {3603682800 -14400 1 EDT} + {3624242400 -18000 0 EST} + {3635132400 -14400 1 EDT} + {3655692000 -18000 0 EST} + {3666582000 -14400 1 EDT} + {3687141600 -18000 0 EST} + {3698031600 -14400 1 EDT} + {3718591200 -18000 0 EST} + {3730086000 -14400 1 EDT} + {3750645600 -18000 0 EST} + {3761535600 -14400 1 EDT} + {3782095200 -18000 0 EST} + {3792985200 -14400 1 EDT} + {3813544800 -18000 0 EST} + {3824434800 -14400 1 EDT} + {3844994400 -18000 0 EST} + {3855884400 -14400 1 EDT} + {3876444000 -18000 0 EST} + {3887334000 -14400 1 EDT} + {3907893600 -18000 0 EST} + {3919388400 -14400 1 EDT} + {3939948000 -18000 0 EST} + {3950838000 -14400 1 EDT} + {3971397600 -18000 0 EST} + {3982287600 -14400 1 EDT} + {4002847200 -18000 0 EST} + {4013737200 -14400 1 EDT} + {4034296800 -18000 0 EST} + {4045186800 -14400 1 EDT} + {4065746400 -18000 0 EST} + {4076636400 -14400 1 EDT} + {4097196000 -18000 0 EST} +} diff --git a/env/tcl/tcl8.6/tzdata/America/Nome b/env/tcl/tcl8.6/tzdata/America/Nome new file mode 100644 index 0000000..d7a9186 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/America/Nome @@ -0,0 +1,276 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:America/Nome) { + {-9223372036854775808 46702 0 LMT} + {-3225223727 -39698 0 LMT} + {-2188947502 -39600 0 NST} + {-883573200 -39600 0 NST} + {-880196400 -36000 1 NWT} + {-769395600 -36000 1 NPT} + {-765374400 -39600 0 NST} + {-757342800 -39600 0 NST} + {-86878800 -39600 0 BST} + {-31496400 -39600 0 BST} + {-21466800 -36000 1 BDT} + {-5745600 -39600 0 BST} + {9982800 -36000 1 BDT} + {25704000 -39600 0 BST} + {41432400 -36000 1 BDT} + {57758400 -39600 0 BST} + {73486800 -36000 1 BDT} + {89208000 -39600 0 BST} + {104936400 -36000 1 BDT} + {120657600 -39600 0 BST} + {126709200 -36000 1 BDT} + {152107200 -39600 0 BST} + {162392400 -36000 1 BDT} + {183556800 -39600 0 BST} + {199285200 -36000 1 BDT} + {215611200 -39600 0 BST} + {230734800 -36000 1 BDT} + {247060800 -39600 0 BST} + {262789200 -36000 1 BDT} + {278510400 -39600 0 BST} + {294238800 -36000 1 BDT} + {309960000 -39600 0 BST} + {325688400 -36000 1 BDT} + {341409600 -39600 0 BST} + {357138000 -36000 1 BDT} + {372859200 -39600 0 BST} + {388587600 -36000 1 BDT} + {404913600 -39600 0 BST} + {420037200 -36000 1 BDT} + {439030800 -32400 0 AKST} + {452084400 -28800 1 AKDT} + {467805600 -32400 0 AKST} + {483534000 -28800 1 AKDT} + {499255200 -32400 0 AKST} + {514983600 -28800 1 AKDT} + {530704800 -32400 0 AKST} + {544618800 -28800 1 AKDT} + {562154400 -32400 0 AKST} + {576068400 -28800 1 AKDT} + {594208800 -32400 0 AKST} + {607518000 -28800 1 AKDT} + {625658400 -32400 0 AKST} + {638967600 -28800 1 AKDT} + {657108000 -32400 0 AKST} + {671022000 -28800 1 AKDT} + {688557600 -32400 0 AKST} + {702471600 -28800 1 AKDT} + {720007200 -32400 0 AKST} + {733921200 -28800 1 AKDT} + {752061600 -32400 0 AKST} + {765370800 -28800 1 AKDT} + {783511200 -32400 0 AKST} + {796820400 -28800 1 AKDT} + {814960800 -32400 0 AKST} + {828874800 -28800 1 AKDT} + {846410400 -32400 0 AKST} + {860324400 -28800 1 AKDT} + {877860000 -32400 0 AKST} + {891774000 -28800 1 AKDT} + {909309600 -32400 0 AKST} + {923223600 -28800 1 AKDT} + {941364000 -32400 0 AKST} + {954673200 -28800 1 AKDT} + {972813600 -32400 0 AKST} + {986122800 -28800 1 AKDT} + {1004263200 -32400 0 AKST} + {1018177200 -28800 1 AKDT} + {1035712800 -32400 0 AKST} + {1049626800 -28800 1 AKDT} + {1067162400 -32400 0 AKST} + {1081076400 -28800 1 AKDT} + {1099216800 -32400 0 AKST} + {1112526000 -28800 1 AKDT} + {1130666400 -32400 0 AKST} + {1143975600 -28800 1 AKDT} + {1162116000 -32400 0 AKST} + {1173610800 -28800 1 AKDT} + {1194170400 -32400 0 AKST} + {1205060400 -28800 1 AKDT} + {1225620000 -32400 0 AKST} + {1236510000 -28800 1 AKDT} + {1257069600 -32400 0 AKST} + {1268564400 -28800 1 AKDT} + {1289124000 -32400 0 AKST} + {1300014000 -28800 1 AKDT} + {1320573600 -32400 0 AKST} + {1331463600 -28800 1 AKDT} + {1352023200 -32400 0 AKST} + {1362913200 -28800 1 AKDT} + {1383472800 -32400 0 AKST} + {1394362800 -28800 1 AKDT} + {1414922400 -32400 0 AKST} + {1425812400 -28800 1 AKDT} + {1446372000 -32400 0 AKST} + {1457866800 -28800 1 AKDT} + {1478426400 -32400 0 AKST} + {1489316400 -28800 1 AKDT} + {1509876000 -32400 0 AKST} + {1520766000 -28800 1 AKDT} + {1541325600 -32400 0 AKST} + {1552215600 -28800 1 AKDT} + {1572775200 -32400 0 AKST} + {1583665200 -28800 1 AKDT} + {1604224800 -32400 0 AKST} + {1615719600 -28800 1 AKDT} + {1636279200 -32400 0 AKST} + {1647169200 -28800 1 AKDT} + {1667728800 -32400 0 AKST} + {1678618800 -28800 1 AKDT} + {1699178400 -32400 0 AKST} + {1710068400 -28800 1 AKDT} + {1730628000 -32400 0 AKST} + {1741518000 -28800 1 AKDT} + {1762077600 -32400 0 AKST} + {1772967600 -28800 1 AKDT} + {1793527200 -32400 0 AKST} + {1805022000 -28800 1 AKDT} + {1825581600 -32400 0 AKST} + {1836471600 -28800 1 AKDT} + {1857031200 -32400 0 AKST} + {1867921200 -28800 1 AKDT} + {1888480800 -32400 0 AKST} + {1899370800 -28800 1 AKDT} + {1919930400 -32400 0 AKST} + {1930820400 -28800 1 AKDT} + {1951380000 -32400 0 AKST} + {1962874800 -28800 1 AKDT} + {1983434400 -32400 0 AKST} + {1994324400 -28800 1 AKDT} + {2014884000 -32400 0 AKST} + {2025774000 -28800 1 AKDT} + {2046333600 -32400 0 AKST} + {2057223600 -28800 1 AKDT} + {2077783200 -32400 0 AKST} + {2088673200 -28800 1 AKDT} + {2109232800 -32400 0 AKST} + {2120122800 -28800 1 AKDT} + {2140682400 -32400 0 AKST} + {2152177200 -28800 1 AKDT} + {2172736800 -32400 0 AKST} + {2183626800 -28800 1 AKDT} + {2204186400 -32400 0 AKST} + {2215076400 -28800 1 AKDT} + {2235636000 -32400 0 AKST} + {2246526000 -28800 1 AKDT} + {2267085600 -32400 0 AKST} + {2277975600 -28800 1 AKDT} + {2298535200 -32400 0 AKST} + {2309425200 -28800 1 AKDT} + {2329984800 -32400 0 AKST} + {2341479600 -28800 1 AKDT} + {2362039200 -32400 0 AKST} + {2372929200 -28800 1 AKDT} + {2393488800 -32400 0 AKST} + {2404378800 -28800 1 AKDT} + {2424938400 -32400 0 AKST} + {2435828400 -28800 1 AKDT} + {2456388000 -32400 0 AKST} + {2467278000 -28800 1 AKDT} + {2487837600 -32400 0 AKST} + {2499332400 -28800 1 AKDT} + {2519892000 -32400 0 AKST} + {2530782000 -28800 1 AKDT} + {2551341600 -32400 0 AKST} + {2562231600 -28800 1 AKDT} + {2582791200 -32400 0 AKST} + {2593681200 -28800 1 AKDT} + {2614240800 -32400 0 AKST} + {2625130800 -28800 1 AKDT} + {2645690400 -32400 0 AKST} + {2656580400 -28800 1 AKDT} + {2677140000 -32400 0 AKST} + {2688634800 -28800 1 AKDT} + {2709194400 -32400 0 AKST} + {2720084400 -28800 1 AKDT} + {2740644000 -32400 0 AKST} + {2751534000 -28800 1 AKDT} + {2772093600 -32400 0 AKST} + {2782983600 -28800 1 AKDT} + {2803543200 -32400 0 AKST} + {2814433200 -28800 1 AKDT} + {2834992800 -32400 0 AKST} + {2846487600 -28800 1 AKDT} + {2867047200 -32400 0 AKST} + {2877937200 -28800 1 AKDT} + {2898496800 -32400 0 AKST} + {2909386800 -28800 1 AKDT} + {2929946400 -32400 0 AKST} + {2940836400 -28800 1 AKDT} + {2961396000 -32400 0 AKST} + {2972286000 -28800 1 AKDT} + {2992845600 -32400 0 AKST} + {3003735600 -28800 1 AKDT} + {3024295200 -32400 0 AKST} + {3035790000 -28800 1 AKDT} + {3056349600 -32400 0 AKST} + {3067239600 -28800 1 AKDT} + {3087799200 -32400 0 AKST} + {3098689200 -28800 1 AKDT} + {3119248800 -32400 0 AKST} + {3130138800 -28800 1 AKDT} + {3150698400 -32400 0 AKST} + {3161588400 -28800 1 AKDT} + {3182148000 -32400 0 AKST} + {3193038000 -28800 1 AKDT} + {3213597600 -32400 0 AKST} + {3225092400 -28800 1 AKDT} + {3245652000 -32400 0 AKST} + {3256542000 -28800 1 AKDT} + {3277101600 -32400 0 AKST} + {3287991600 -28800 1 AKDT} + {3308551200 -32400 0 AKST} + {3319441200 -28800 1 AKDT} + {3340000800 -32400 0 AKST} + {3350890800 -28800 1 AKDT} + {3371450400 -32400 0 AKST} + {3382945200 -28800 1 AKDT} + {3403504800 -32400 0 AKST} + {3414394800 -28800 1 AKDT} + {3434954400 -32400 0 AKST} + {3445844400 -28800 1 AKDT} + {3466404000 -32400 0 AKST} + {3477294000 -28800 1 AKDT} + {3497853600 -32400 0 AKST} + {3508743600 -28800 1 AKDT} + {3529303200 -32400 0 AKST} + {3540193200 -28800 1 AKDT} + {3560752800 -32400 0 AKST} + {3572247600 -28800 1 AKDT} + {3592807200 -32400 0 AKST} + {3603697200 -28800 1 AKDT} + {3624256800 -32400 0 AKST} + {3635146800 -28800 1 AKDT} + {3655706400 -32400 0 AKST} + {3666596400 -28800 1 AKDT} + {3687156000 -32400 0 AKST} + {3698046000 -28800 1 AKDT} + {3718605600 -32400 0 AKST} + {3730100400 -28800 1 AKDT} + {3750660000 -32400 0 AKST} + {3761550000 -28800 1 AKDT} + {3782109600 -32400 0 AKST} + {3792999600 -28800 1 AKDT} + {3813559200 -32400 0 AKST} + {3824449200 -28800 1 AKDT} + {3845008800 -32400 0 AKST} + {3855898800 -28800 1 AKDT} + {3876458400 -32400 0 AKST} + {3887348400 -28800 1 AKDT} + {3907908000 -32400 0 AKST} + {3919402800 -28800 1 AKDT} + {3939962400 -32400 0 AKST} + {3950852400 -28800 1 AKDT} + {3971412000 -32400 0 AKST} + {3982302000 -28800 1 AKDT} + {4002861600 -32400 0 AKST} + {4013751600 -28800 1 AKDT} + {4034311200 -32400 0 AKST} + {4045201200 -28800 1 AKDT} + {4065760800 -32400 0 AKST} + {4076650800 -28800 1 AKDT} + {4097210400 -32400 0 AKST} +} diff --git a/env/tcl/tcl8.6/tzdata/America/Noronha b/env/tcl/tcl8.6/tzdata/America/Noronha new file mode 100644 index 0000000..01fb745 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/America/Noronha @@ -0,0 +1,48 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:America/Noronha) { + {-9223372036854775808 -7780 0 LMT} + {-1767217820 -7200 0 -02} + {-1206961200 -3600 1 -02} + {-1191366000 -7200 0 -02} + {-1175378400 -3600 1 -02} + {-1159830000 -7200 0 -02} + {-633823200 -3600 1 -02} + {-622072800 -7200 0 -02} + {-602287200 -3600 1 -02} + {-591836400 -7200 0 -02} + {-570751200 -3600 1 -02} + {-560214000 -7200 0 -02} + {-539128800 -3600 1 -02} + {-531356400 -7200 0 -02} + {-191368800 -3600 1 -02} + {-184201200 -7200 0 -02} + {-155167200 -3600 1 -02} + {-150073200 -7200 0 -02} + {-128901600 -3600 1 -02} + {-121129200 -7200 0 -02} + {-99957600 -3600 1 -02} + {-89593200 -7200 0 -02} + {-68421600 -3600 1 -02} + {-57970800 -7200 0 -02} + {499744800 -3600 1 -02} + {511232400 -7200 0 -02} + {530589600 -3600 1 -02} + {540262800 -7200 0 -02} + {562125600 -3600 1 -02} + {571194000 -7200 0 -02} + {592970400 -3600 1 -02} + {602038800 -7200 0 -02} + {624420000 -3600 1 -02} + {634698000 -7200 0 -02} + {653533200 -7200 0 -02} + {938656800 -7200 0 -02} + {938916000 -3600 1 -02} + {951613200 -7200 0 -02} + {970970400 -3600 1 -02} + {971571600 -7200 0 -02} + {1000346400 -7200 0 -02} + {1003024800 -3600 1 -02} + {1013907600 -7200 0 -02} + {1033434000 -7200 0 -02} +} diff --git a/env/tcl/tcl8.6/tzdata/America/North_Dakota/Beulah b/env/tcl/tcl8.6/tzdata/America/North_Dakota/Beulah new file mode 100644 index 0000000..95407c6 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/America/North_Dakota/Beulah @@ -0,0 +1,279 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:America/North_Dakota/Beulah) { + {-9223372036854775808 -24427 0 LMT} + {-2717643600 -25200 0 MST} + {-1633273200 -21600 1 MDT} + {-1615132800 -25200 0 MST} + {-1601823600 -21600 1 MDT} + {-1583683200 -25200 0 MST} + {-880210800 -21600 1 MWT} + {-769395600 -21600 1 MPT} + {-765388800 -25200 0 MST} + {-84380400 -21600 1 MDT} + {-68659200 -25200 0 MST} + {-52930800 -21600 1 MDT} + {-37209600 -25200 0 MST} + {-21481200 -21600 1 MDT} + {-5760000 -25200 0 MST} + {9968400 -21600 1 MDT} + {25689600 -25200 0 MST} + {41418000 -21600 1 MDT} + {57744000 -25200 0 MST} + {73472400 -21600 1 MDT} + {89193600 -25200 0 MST} + {104922000 -21600 1 MDT} + {120643200 -25200 0 MST} + {126694800 -21600 1 MDT} + {152092800 -25200 0 MST} + {162378000 -21600 1 MDT} + {183542400 -25200 0 MST} + {199270800 -21600 1 MDT} + {215596800 -25200 0 MST} + {230720400 -21600 1 MDT} + {247046400 -25200 0 MST} + {262774800 -21600 1 MDT} + {278496000 -25200 0 MST} + {294224400 -21600 1 MDT} + {309945600 -25200 0 MST} + {325674000 -21600 1 MDT} + {341395200 -25200 0 MST} + {357123600 -21600 1 MDT} + {372844800 -25200 0 MST} + {388573200 -21600 1 MDT} + {404899200 -25200 0 MST} + {420022800 -21600 1 MDT} + {436348800 -25200 0 MST} + {452077200 -21600 1 MDT} + {467798400 -25200 0 MST} + {483526800 -21600 1 MDT} + {499248000 -25200 0 MST} + {514976400 -21600 1 MDT} + {530697600 -25200 0 MST} + {544611600 -21600 1 MDT} + {562147200 -25200 0 MST} + {576061200 -21600 1 MDT} + {594201600 -25200 0 MST} + {607510800 -21600 1 MDT} + {625651200 -25200 0 MST} + {638960400 -21600 1 MDT} + {657100800 -25200 0 MST} + {671014800 -21600 1 MDT} + {688550400 -25200 0 MST} + {702464400 -21600 1 MDT} + {720000000 -25200 0 MST} + {733914000 -21600 1 MDT} + {752054400 -25200 0 MST} + {765363600 -21600 1 MDT} + {783504000 -25200 0 MST} + {796813200 -21600 1 MDT} + {814953600 -25200 0 MST} + {828867600 -21600 1 MDT} + {846403200 -25200 0 MST} + {860317200 -21600 1 MDT} + {877852800 -25200 0 MST} + {891766800 -21600 1 MDT} + {909302400 -25200 0 MST} + {923216400 -21600 1 MDT} + {941356800 -25200 0 MST} + {954666000 -21600 1 MDT} + {972806400 -25200 0 MST} + {986115600 -21600 1 MDT} + {1004256000 -25200 0 MST} + {1018170000 -21600 1 MDT} + {1035705600 -25200 0 MST} + {1049619600 -21600 1 MDT} + {1067155200 -25200 0 MST} + {1081069200 -21600 1 MDT} + {1099209600 -25200 0 MST} + {1112518800 -21600 1 MDT} + {1130659200 -25200 0 MST} + {1143968400 -21600 1 MDT} + {1162108800 -25200 0 MST} + {1173603600 -21600 1 MDT} + {1194163200 -25200 0 MST} + {1205053200 -21600 1 MDT} + {1225612800 -25200 0 MST} + {1236502800 -21600 1 MDT} + {1257062400 -25200 0 MST} + {1268557200 -21600 1 MDT} + {1289120400 -21600 0 CST} + {1300003200 -18000 1 CDT} + {1320562800 -21600 0 CST} + {1331452800 -18000 1 CDT} + {1352012400 -21600 0 CST} + {1362902400 -18000 1 CDT} + {1383462000 -21600 0 CST} + {1394352000 -18000 1 CDT} + {1414911600 -21600 0 CST} + {1425801600 -18000 1 CDT} + {1446361200 -21600 0 CST} + {1457856000 -18000 1 CDT} + {1478415600 -21600 0 CST} + {1489305600 -18000 1 CDT} + {1509865200 -21600 0 CST} + {1520755200 -18000 1 CDT} + {1541314800 -21600 0 CST} + {1552204800 -18000 1 CDT} + {1572764400 -21600 0 CST} + {1583654400 -18000 1 CDT} + {1604214000 -21600 0 CST} + {1615708800 -18000 1 CDT} + {1636268400 -21600 0 CST} + {1647158400 -18000 1 CDT} + {1667718000 -21600 0 CST} + {1678608000 -18000 1 CDT} + {1699167600 -21600 0 CST} + {1710057600 -18000 1 CDT} + {1730617200 -21600 0 CST} + {1741507200 -18000 1 CDT} + {1762066800 -21600 0 CST} + {1772956800 -18000 1 CDT} + {1793516400 -21600 0 CST} + {1805011200 -18000 1 CDT} + {1825570800 -21600 0 CST} + {1836460800 -18000 1 CDT} + {1857020400 -21600 0 CST} + {1867910400 -18000 1 CDT} + {1888470000 -21600 0 CST} + {1899360000 -18000 1 CDT} + {1919919600 -21600 0 CST} + {1930809600 -18000 1 CDT} + {1951369200 -21600 0 CST} + {1962864000 -18000 1 CDT} + {1983423600 -21600 0 CST} + {1994313600 -18000 1 CDT} + {2014873200 -21600 0 CST} + {2025763200 -18000 1 CDT} + {2046322800 -21600 0 CST} + {2057212800 -18000 1 CDT} + {2077772400 -21600 0 CST} + {2088662400 -18000 1 CDT} + {2109222000 -21600 0 CST} + {2120112000 -18000 1 CDT} + {2140671600 -21600 0 CST} + {2152166400 -18000 1 CDT} + {2172726000 -21600 0 CST} + {2183616000 -18000 1 CDT} + {2204175600 -21600 0 CST} + {2215065600 -18000 1 CDT} + {2235625200 -21600 0 CST} + {2246515200 -18000 1 CDT} + {2267074800 -21600 0 CST} + {2277964800 -18000 1 CDT} + {2298524400 -21600 0 CST} + {2309414400 -18000 1 CDT} + {2329974000 -21600 0 CST} + {2341468800 -18000 1 CDT} + {2362028400 -21600 0 CST} + {2372918400 -18000 1 CDT} + {2393478000 -21600 0 CST} + {2404368000 -18000 1 CDT} + {2424927600 -21600 0 CST} + {2435817600 -18000 1 CDT} + {2456377200 -21600 0 CST} + {2467267200 -18000 1 CDT} + {2487826800 -21600 0 CST} + {2499321600 -18000 1 CDT} + {2519881200 -21600 0 CST} + {2530771200 -18000 1 CDT} + {2551330800 -21600 0 CST} + {2562220800 -18000 1 CDT} + {2582780400 -21600 0 CST} + {2593670400 -18000 1 CDT} + {2614230000 -21600 0 CST} + {2625120000 -18000 1 CDT} + {2645679600 -21600 0 CST} + {2656569600 -18000 1 CDT} + {2677129200 -21600 0 CST} + {2688624000 -18000 1 CDT} + {2709183600 -21600 0 CST} + {2720073600 -18000 1 CDT} + {2740633200 -21600 0 CST} + {2751523200 -18000 1 CDT} + {2772082800 -21600 0 CST} + {2782972800 -18000 1 CDT} + {2803532400 -21600 0 CST} + {2814422400 -18000 1 CDT} + {2834982000 -21600 0 CST} + {2846476800 -18000 1 CDT} + {2867036400 -21600 0 CST} + {2877926400 -18000 1 CDT} + {2898486000 -21600 0 CST} + {2909376000 -18000 1 CDT} + {2929935600 -21600 0 CST} + {2940825600 -18000 1 CDT} + {2961385200 -21600 0 CST} + {2972275200 -18000 1 CDT} + {2992834800 -21600 0 CST} + {3003724800 -18000 1 CDT} + {3024284400 -21600 0 CST} + {3035779200 -18000 1 CDT} + {3056338800 -21600 0 CST} + {3067228800 -18000 1 CDT} + {3087788400 -21600 0 CST} + {3098678400 -18000 1 CDT} + {3119238000 -21600 0 CST} + {3130128000 -18000 1 CDT} + {3150687600 -21600 0 CST} + {3161577600 -18000 1 CDT} + {3182137200 -21600 0 CST} + {3193027200 -18000 1 CDT} + {3213586800 -21600 0 CST} + {3225081600 -18000 1 CDT} + {3245641200 -21600 0 CST} + {3256531200 -18000 1 CDT} + {3277090800 -21600 0 CST} + {3287980800 -18000 1 CDT} + {3308540400 -21600 0 CST} + {3319430400 -18000 1 CDT} + {3339990000 -21600 0 CST} + {3350880000 -18000 1 CDT} + {3371439600 -21600 0 CST} + {3382934400 -18000 1 CDT} + {3403494000 -21600 0 CST} + {3414384000 -18000 1 CDT} + {3434943600 -21600 0 CST} + {3445833600 -18000 1 CDT} + {3466393200 -21600 0 CST} + {3477283200 -18000 1 CDT} + {3497842800 -21600 0 CST} + {3508732800 -18000 1 CDT} + {3529292400 -21600 0 CST} + {3540182400 -18000 1 CDT} + {3560742000 -21600 0 CST} + {3572236800 -18000 1 CDT} + {3592796400 -21600 0 CST} + {3603686400 -18000 1 CDT} + {3624246000 -21600 0 CST} + {3635136000 -18000 1 CDT} + {3655695600 -21600 0 CST} + {3666585600 -18000 1 CDT} + {3687145200 -21600 0 CST} + {3698035200 -18000 1 CDT} + {3718594800 -21600 0 CST} + {3730089600 -18000 1 CDT} + {3750649200 -21600 0 CST} + {3761539200 -18000 1 CDT} + {3782098800 -21600 0 CST} + {3792988800 -18000 1 CDT} + {3813548400 -21600 0 CST} + {3824438400 -18000 1 CDT} + {3844998000 -21600 0 CST} + {3855888000 -18000 1 CDT} + {3876447600 -21600 0 CST} + {3887337600 -18000 1 CDT} + {3907897200 -21600 0 CST} + {3919392000 -18000 1 CDT} + {3939951600 -21600 0 CST} + {3950841600 -18000 1 CDT} + {3971401200 -21600 0 CST} + {3982291200 -18000 1 CDT} + {4002850800 -21600 0 CST} + {4013740800 -18000 1 CDT} + {4034300400 -21600 0 CST} + {4045190400 -18000 1 CDT} + {4065750000 -21600 0 CST} + {4076640000 -18000 1 CDT} + {4097199600 -21600 0 CST} +} diff --git a/env/tcl/tcl8.6/tzdata/America/North_Dakota/Center b/env/tcl/tcl8.6/tzdata/America/North_Dakota/Center new file mode 100644 index 0000000..30782f7 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/America/North_Dakota/Center @@ -0,0 +1,279 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:America/North_Dakota/Center) { + {-9223372036854775808 -24312 0 LMT} + {-2717643600 -25200 0 MST} + {-1633273200 -21600 1 MDT} + {-1615132800 -25200 0 MST} + {-1601823600 -21600 1 MDT} + {-1583683200 -25200 0 MST} + {-880210800 -21600 1 MWT} + {-769395600 -21600 1 MPT} + {-765388800 -25200 0 MST} + {-84380400 -21600 1 MDT} + {-68659200 -25200 0 MST} + {-52930800 -21600 1 MDT} + {-37209600 -25200 0 MST} + {-21481200 -21600 1 MDT} + {-5760000 -25200 0 MST} + {9968400 -21600 1 MDT} + {25689600 -25200 0 MST} + {41418000 -21600 1 MDT} + {57744000 -25200 0 MST} + {73472400 -21600 1 MDT} + {89193600 -25200 0 MST} + {104922000 -21600 1 MDT} + {120643200 -25200 0 MST} + {126694800 -21600 1 MDT} + {152092800 -25200 0 MST} + {162378000 -21600 1 MDT} + {183542400 -25200 0 MST} + {199270800 -21600 1 MDT} + {215596800 -25200 0 MST} + {230720400 -21600 1 MDT} + {247046400 -25200 0 MST} + {262774800 -21600 1 MDT} + {278496000 -25200 0 MST} + {294224400 -21600 1 MDT} + {309945600 -25200 0 MST} + {325674000 -21600 1 MDT} + {341395200 -25200 0 MST} + {357123600 -21600 1 MDT} + {372844800 -25200 0 MST} + {388573200 -21600 1 MDT} + {404899200 -25200 0 MST} + {420022800 -21600 1 MDT} + {436348800 -25200 0 MST} + {452077200 -21600 1 MDT} + {467798400 -25200 0 MST} + {483526800 -21600 1 MDT} + {499248000 -25200 0 MST} + {514976400 -21600 1 MDT} + {530697600 -25200 0 MST} + {544611600 -21600 1 MDT} + {562147200 -25200 0 MST} + {576061200 -21600 1 MDT} + {594201600 -25200 0 MST} + {607510800 -21600 1 MDT} + {625651200 -25200 0 MST} + {638960400 -21600 1 MDT} + {657100800 -25200 0 MST} + {671014800 -21600 1 MDT} + {688550400 -25200 0 MST} + {702464400 -21600 1 MDT} + {720003600 -21600 0 CST} + {733910400 -18000 1 CDT} + {752050800 -21600 0 CST} + {765360000 -18000 1 CDT} + {783500400 -21600 0 CST} + {796809600 -18000 1 CDT} + {814950000 -21600 0 CST} + {828864000 -18000 1 CDT} + {846399600 -21600 0 CST} + {860313600 -18000 1 CDT} + {877849200 -21600 0 CST} + {891763200 -18000 1 CDT} + {909298800 -21600 0 CST} + {923212800 -18000 1 CDT} + {941353200 -21600 0 CST} + {954662400 -18000 1 CDT} + {972802800 -21600 0 CST} + {986112000 -18000 1 CDT} + {1004252400 -21600 0 CST} + {1018166400 -18000 1 CDT} + {1035702000 -21600 0 CST} + {1049616000 -18000 1 CDT} + {1067151600 -21600 0 CST} + {1081065600 -18000 1 CDT} + {1099206000 -21600 0 CST} + {1112515200 -18000 1 CDT} + {1130655600 -21600 0 CST} + {1143964800 -18000 1 CDT} + {1162105200 -21600 0 CST} + {1173600000 -18000 1 CDT} + {1194159600 -21600 0 CST} + {1205049600 -18000 1 CDT} + {1225609200 -21600 0 CST} + {1236499200 -18000 1 CDT} + {1257058800 -21600 0 CST} + {1268553600 -18000 1 CDT} + {1289113200 -21600 0 CST} + {1300003200 -18000 1 CDT} + {1320562800 -21600 0 CST} + {1331452800 -18000 1 CDT} + {1352012400 -21600 0 CST} + {1362902400 -18000 1 CDT} + {1383462000 -21600 0 CST} + {1394352000 -18000 1 CDT} + {1414911600 -21600 0 CST} + {1425801600 -18000 1 CDT} + {1446361200 -21600 0 CST} + {1457856000 -18000 1 CDT} + {1478415600 -21600 0 CST} + {1489305600 -18000 1 CDT} + {1509865200 -21600 0 CST} + {1520755200 -18000 1 CDT} + {1541314800 -21600 0 CST} + {1552204800 -18000 1 CDT} + {1572764400 -21600 0 CST} + {1583654400 -18000 1 CDT} + {1604214000 -21600 0 CST} + {1615708800 -18000 1 CDT} + {1636268400 -21600 0 CST} + {1647158400 -18000 1 CDT} + {1667718000 -21600 0 CST} + {1678608000 -18000 1 CDT} + {1699167600 -21600 0 CST} + {1710057600 -18000 1 CDT} + {1730617200 -21600 0 CST} + {1741507200 -18000 1 CDT} + {1762066800 -21600 0 CST} + {1772956800 -18000 1 CDT} + {1793516400 -21600 0 CST} + {1805011200 -18000 1 CDT} + {1825570800 -21600 0 CST} + {1836460800 -18000 1 CDT} + {1857020400 -21600 0 CST} + {1867910400 -18000 1 CDT} + {1888470000 -21600 0 CST} + {1899360000 -18000 1 CDT} + {1919919600 -21600 0 CST} + {1930809600 -18000 1 CDT} + {1951369200 -21600 0 CST} + {1962864000 -18000 1 CDT} + {1983423600 -21600 0 CST} + {1994313600 -18000 1 CDT} + {2014873200 -21600 0 CST} + {2025763200 -18000 1 CDT} + {2046322800 -21600 0 CST} + {2057212800 -18000 1 CDT} + {2077772400 -21600 0 CST} + {2088662400 -18000 1 CDT} + {2109222000 -21600 0 CST} + {2120112000 -18000 1 CDT} + {2140671600 -21600 0 CST} + {2152166400 -18000 1 CDT} + {2172726000 -21600 0 CST} + {2183616000 -18000 1 CDT} + {2204175600 -21600 0 CST} + {2215065600 -18000 1 CDT} + {2235625200 -21600 0 CST} + {2246515200 -18000 1 CDT} + {2267074800 -21600 0 CST} + {2277964800 -18000 1 CDT} + {2298524400 -21600 0 CST} + {2309414400 -18000 1 CDT} + {2329974000 -21600 0 CST} + {2341468800 -18000 1 CDT} + {2362028400 -21600 0 CST} + {2372918400 -18000 1 CDT} + {2393478000 -21600 0 CST} + {2404368000 -18000 1 CDT} + {2424927600 -21600 0 CST} + {2435817600 -18000 1 CDT} + {2456377200 -21600 0 CST} + {2467267200 -18000 1 CDT} + {2487826800 -21600 0 CST} + {2499321600 -18000 1 CDT} + {2519881200 -21600 0 CST} + {2530771200 -18000 1 CDT} + {2551330800 -21600 0 CST} + {2562220800 -18000 1 CDT} + {2582780400 -21600 0 CST} + {2593670400 -18000 1 CDT} + {2614230000 -21600 0 CST} + {2625120000 -18000 1 CDT} + {2645679600 -21600 0 CST} + {2656569600 -18000 1 CDT} + {2677129200 -21600 0 CST} + {2688624000 -18000 1 CDT} + {2709183600 -21600 0 CST} + {2720073600 -18000 1 CDT} + {2740633200 -21600 0 CST} + {2751523200 -18000 1 CDT} + {2772082800 -21600 0 CST} + {2782972800 -18000 1 CDT} + {2803532400 -21600 0 CST} + {2814422400 -18000 1 CDT} + {2834982000 -21600 0 CST} + {2846476800 -18000 1 CDT} + {2867036400 -21600 0 CST} + {2877926400 -18000 1 CDT} + {2898486000 -21600 0 CST} + {2909376000 -18000 1 CDT} + {2929935600 -21600 0 CST} + {2940825600 -18000 1 CDT} + {2961385200 -21600 0 CST} + {2972275200 -18000 1 CDT} + {2992834800 -21600 0 CST} + {3003724800 -18000 1 CDT} + {3024284400 -21600 0 CST} + {3035779200 -18000 1 CDT} + {3056338800 -21600 0 CST} + {3067228800 -18000 1 CDT} + {3087788400 -21600 0 CST} + {3098678400 -18000 1 CDT} + {3119238000 -21600 0 CST} + {3130128000 -18000 1 CDT} + {3150687600 -21600 0 CST} + {3161577600 -18000 1 CDT} + {3182137200 -21600 0 CST} + {3193027200 -18000 1 CDT} + {3213586800 -21600 0 CST} + {3225081600 -18000 1 CDT} + {3245641200 -21600 0 CST} + {3256531200 -18000 1 CDT} + {3277090800 -21600 0 CST} + {3287980800 -18000 1 CDT} + {3308540400 -21600 0 CST} + {3319430400 -18000 1 CDT} + {3339990000 -21600 0 CST} + {3350880000 -18000 1 CDT} + {3371439600 -21600 0 CST} + {3382934400 -18000 1 CDT} + {3403494000 -21600 0 CST} + {3414384000 -18000 1 CDT} + {3434943600 -21600 0 CST} + {3445833600 -18000 1 CDT} + {3466393200 -21600 0 CST} + {3477283200 -18000 1 CDT} + {3497842800 -21600 0 CST} + {3508732800 -18000 1 CDT} + {3529292400 -21600 0 CST} + {3540182400 -18000 1 CDT} + {3560742000 -21600 0 CST} + {3572236800 -18000 1 CDT} + {3592796400 -21600 0 CST} + {3603686400 -18000 1 CDT} + {3624246000 -21600 0 CST} + {3635136000 -18000 1 CDT} + {3655695600 -21600 0 CST} + {3666585600 -18000 1 CDT} + {3687145200 -21600 0 CST} + {3698035200 -18000 1 CDT} + {3718594800 -21600 0 CST} + {3730089600 -18000 1 CDT} + {3750649200 -21600 0 CST} + {3761539200 -18000 1 CDT} + {3782098800 -21600 0 CST} + {3792988800 -18000 1 CDT} + {3813548400 -21600 0 CST} + {3824438400 -18000 1 CDT} + {3844998000 -21600 0 CST} + {3855888000 -18000 1 CDT} + {3876447600 -21600 0 CST} + {3887337600 -18000 1 CDT} + {3907897200 -21600 0 CST} + {3919392000 -18000 1 CDT} + {3939951600 -21600 0 CST} + {3950841600 -18000 1 CDT} + {3971401200 -21600 0 CST} + {3982291200 -18000 1 CDT} + {4002850800 -21600 0 CST} + {4013740800 -18000 1 CDT} + {4034300400 -21600 0 CST} + {4045190400 -18000 1 CDT} + {4065750000 -21600 0 CST} + {4076640000 -18000 1 CDT} + {4097199600 -21600 0 CST} +} diff --git a/env/tcl/tcl8.6/tzdata/America/North_Dakota/New_Salem b/env/tcl/tcl8.6/tzdata/America/North_Dakota/New_Salem new file mode 100644 index 0000000..5a9d229 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/America/North_Dakota/New_Salem @@ -0,0 +1,279 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:America/North_Dakota/New_Salem) { + {-9223372036854775808 -24339 0 LMT} + {-2717643600 -25200 0 MST} + {-1633273200 -21600 1 MDT} + {-1615132800 -25200 0 MST} + {-1601823600 -21600 1 MDT} + {-1583683200 -25200 0 MST} + {-880210800 -21600 1 MWT} + {-769395600 -21600 1 MPT} + {-765388800 -25200 0 MST} + {-84380400 -21600 1 MDT} + {-68659200 -25200 0 MST} + {-52930800 -21600 1 MDT} + {-37209600 -25200 0 MST} + {-21481200 -21600 1 MDT} + {-5760000 -25200 0 MST} + {9968400 -21600 1 MDT} + {25689600 -25200 0 MST} + {41418000 -21600 1 MDT} + {57744000 -25200 0 MST} + {73472400 -21600 1 MDT} + {89193600 -25200 0 MST} + {104922000 -21600 1 MDT} + {120643200 -25200 0 MST} + {126694800 -21600 1 MDT} + {152092800 -25200 0 MST} + {162378000 -21600 1 MDT} + {183542400 -25200 0 MST} + {199270800 -21600 1 MDT} + {215596800 -25200 0 MST} + {230720400 -21600 1 MDT} + {247046400 -25200 0 MST} + {262774800 -21600 1 MDT} + {278496000 -25200 0 MST} + {294224400 -21600 1 MDT} + {309945600 -25200 0 MST} + {325674000 -21600 1 MDT} + {341395200 -25200 0 MST} + {357123600 -21600 1 MDT} + {372844800 -25200 0 MST} + {388573200 -21600 1 MDT} + {404899200 -25200 0 MST} + {420022800 -21600 1 MDT} + {436348800 -25200 0 MST} + {452077200 -21600 1 MDT} + {467798400 -25200 0 MST} + {483526800 -21600 1 MDT} + {499248000 -25200 0 MST} + {514976400 -21600 1 MDT} + {530697600 -25200 0 MST} + {544611600 -21600 1 MDT} + {562147200 -25200 0 MST} + {576061200 -21600 1 MDT} + {594201600 -25200 0 MST} + {607510800 -21600 1 MDT} + {625651200 -25200 0 MST} + {638960400 -21600 1 MDT} + {657100800 -25200 0 MST} + {671014800 -21600 1 MDT} + {688550400 -25200 0 MST} + {702464400 -21600 1 MDT} + {720000000 -25200 0 MST} + {733914000 -21600 1 MDT} + {752054400 -25200 0 MST} + {765363600 -21600 1 MDT} + {783504000 -25200 0 MST} + {796813200 -21600 1 MDT} + {814953600 -25200 0 MST} + {828867600 -21600 1 MDT} + {846403200 -25200 0 MST} + {860317200 -21600 1 MDT} + {877852800 -25200 0 MST} + {891766800 -21600 1 MDT} + {909302400 -25200 0 MST} + {923216400 -21600 1 MDT} + {941356800 -25200 0 MST} + {954666000 -21600 1 MDT} + {972806400 -25200 0 MST} + {986115600 -21600 1 MDT} + {1004256000 -25200 0 MST} + {1018170000 -21600 1 MDT} + {1035705600 -25200 0 MST} + {1049619600 -21600 1 MDT} + {1067158800 -21600 0 CST} + {1081065600 -18000 1 CDT} + {1099206000 -21600 0 CST} + {1112515200 -18000 1 CDT} + {1130655600 -21600 0 CST} + {1143964800 -18000 1 CDT} + {1162105200 -21600 0 CST} + {1173600000 -18000 1 CDT} + {1194159600 -21600 0 CST} + {1205049600 -18000 1 CDT} + {1225609200 -21600 0 CST} + {1236499200 -18000 1 CDT} + {1257058800 -21600 0 CST} + {1268553600 -18000 1 CDT} + {1289113200 -21600 0 CST} + {1300003200 -18000 1 CDT} + {1320562800 -21600 0 CST} + {1331452800 -18000 1 CDT} + {1352012400 -21600 0 CST} + {1362902400 -18000 1 CDT} + {1383462000 -21600 0 CST} + {1394352000 -18000 1 CDT} + {1414911600 -21600 0 CST} + {1425801600 -18000 1 CDT} + {1446361200 -21600 0 CST} + {1457856000 -18000 1 CDT} + {1478415600 -21600 0 CST} + {1489305600 -18000 1 CDT} + {1509865200 -21600 0 CST} + {1520755200 -18000 1 CDT} + {1541314800 -21600 0 CST} + {1552204800 -18000 1 CDT} + {1572764400 -21600 0 CST} + {1583654400 -18000 1 CDT} + {1604214000 -21600 0 CST} + {1615708800 -18000 1 CDT} + {1636268400 -21600 0 CST} + {1647158400 -18000 1 CDT} + {1667718000 -21600 0 CST} + {1678608000 -18000 1 CDT} + {1699167600 -21600 0 CST} + {1710057600 -18000 1 CDT} + {1730617200 -21600 0 CST} + {1741507200 -18000 1 CDT} + {1762066800 -21600 0 CST} + {1772956800 -18000 1 CDT} + {1793516400 -21600 0 CST} + {1805011200 -18000 1 CDT} + {1825570800 -21600 0 CST} + {1836460800 -18000 1 CDT} + {1857020400 -21600 0 CST} + {1867910400 -18000 1 CDT} + {1888470000 -21600 0 CST} + {1899360000 -18000 1 CDT} + {1919919600 -21600 0 CST} + {1930809600 -18000 1 CDT} + {1951369200 -21600 0 CST} + {1962864000 -18000 1 CDT} + {1983423600 -21600 0 CST} + {1994313600 -18000 1 CDT} + {2014873200 -21600 0 CST} + {2025763200 -18000 1 CDT} + {2046322800 -21600 0 CST} + {2057212800 -18000 1 CDT} + {2077772400 -21600 0 CST} + {2088662400 -18000 1 CDT} + {2109222000 -21600 0 CST} + {2120112000 -18000 1 CDT} + {2140671600 -21600 0 CST} + {2152166400 -18000 1 CDT} + {2172726000 -21600 0 CST} + {2183616000 -18000 1 CDT} + {2204175600 -21600 0 CST} + {2215065600 -18000 1 CDT} + {2235625200 -21600 0 CST} + {2246515200 -18000 1 CDT} + {2267074800 -21600 0 CST} + {2277964800 -18000 1 CDT} + {2298524400 -21600 0 CST} + {2309414400 -18000 1 CDT} + {2329974000 -21600 0 CST} + {2341468800 -18000 1 CDT} + {2362028400 -21600 0 CST} + {2372918400 -18000 1 CDT} + {2393478000 -21600 0 CST} + {2404368000 -18000 1 CDT} + {2424927600 -21600 0 CST} + {2435817600 -18000 1 CDT} + {2456377200 -21600 0 CST} + {2467267200 -18000 1 CDT} + {2487826800 -21600 0 CST} + {2499321600 -18000 1 CDT} + {2519881200 -21600 0 CST} + {2530771200 -18000 1 CDT} + {2551330800 -21600 0 CST} + {2562220800 -18000 1 CDT} + {2582780400 -21600 0 CST} + {2593670400 -18000 1 CDT} + {2614230000 -21600 0 CST} + {2625120000 -18000 1 CDT} + {2645679600 -21600 0 CST} + {2656569600 -18000 1 CDT} + {2677129200 -21600 0 CST} + {2688624000 -18000 1 CDT} + {2709183600 -21600 0 CST} + {2720073600 -18000 1 CDT} + {2740633200 -21600 0 CST} + {2751523200 -18000 1 CDT} + {2772082800 -21600 0 CST} + {2782972800 -18000 1 CDT} + {2803532400 -21600 0 CST} + {2814422400 -18000 1 CDT} + {2834982000 -21600 0 CST} + {2846476800 -18000 1 CDT} + {2867036400 -21600 0 CST} + {2877926400 -18000 1 CDT} + {2898486000 -21600 0 CST} + {2909376000 -18000 1 CDT} + {2929935600 -21600 0 CST} + {2940825600 -18000 1 CDT} + {2961385200 -21600 0 CST} + {2972275200 -18000 1 CDT} + {2992834800 -21600 0 CST} + {3003724800 -18000 1 CDT} + {3024284400 -21600 0 CST} + {3035779200 -18000 1 CDT} + {3056338800 -21600 0 CST} + {3067228800 -18000 1 CDT} + {3087788400 -21600 0 CST} + {3098678400 -18000 1 CDT} + {3119238000 -21600 0 CST} + {3130128000 -18000 1 CDT} + {3150687600 -21600 0 CST} + {3161577600 -18000 1 CDT} + {3182137200 -21600 0 CST} + {3193027200 -18000 1 CDT} + {3213586800 -21600 0 CST} + {3225081600 -18000 1 CDT} + {3245641200 -21600 0 CST} + {3256531200 -18000 1 CDT} + {3277090800 -21600 0 CST} + {3287980800 -18000 1 CDT} + {3308540400 -21600 0 CST} + {3319430400 -18000 1 CDT} + {3339990000 -21600 0 CST} + {3350880000 -18000 1 CDT} + {3371439600 -21600 0 CST} + {3382934400 -18000 1 CDT} + {3403494000 -21600 0 CST} + {3414384000 -18000 1 CDT} + {3434943600 -21600 0 CST} + {3445833600 -18000 1 CDT} + {3466393200 -21600 0 CST} + {3477283200 -18000 1 CDT} + {3497842800 -21600 0 CST} + {3508732800 -18000 1 CDT} + {3529292400 -21600 0 CST} + {3540182400 -18000 1 CDT} + {3560742000 -21600 0 CST} + {3572236800 -18000 1 CDT} + {3592796400 -21600 0 CST} + {3603686400 -18000 1 CDT} + {3624246000 -21600 0 CST} + {3635136000 -18000 1 CDT} + {3655695600 -21600 0 CST} + {3666585600 -18000 1 CDT} + {3687145200 -21600 0 CST} + {3698035200 -18000 1 CDT} + {3718594800 -21600 0 CST} + {3730089600 -18000 1 CDT} + {3750649200 -21600 0 CST} + {3761539200 -18000 1 CDT} + {3782098800 -21600 0 CST} + {3792988800 -18000 1 CDT} + {3813548400 -21600 0 CST} + {3824438400 -18000 1 CDT} + {3844998000 -21600 0 CST} + {3855888000 -18000 1 CDT} + {3876447600 -21600 0 CST} + {3887337600 -18000 1 CDT} + {3907897200 -21600 0 CST} + {3919392000 -18000 1 CDT} + {3939951600 -21600 0 CST} + {3950841600 -18000 1 CDT} + {3971401200 -21600 0 CST} + {3982291200 -18000 1 CDT} + {4002850800 -21600 0 CST} + {4013740800 -18000 1 CDT} + {4034300400 -21600 0 CST} + {4045190400 -18000 1 CDT} + {4065750000 -21600 0 CST} + {4076640000 -18000 1 CDT} + {4097199600 -21600 0 CST} +} diff --git a/env/tcl/tcl8.6/tzdata/America/Ojinaga b/env/tcl/tcl8.6/tzdata/America/Ojinaga new file mode 100644 index 0000000..1172708 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/America/Ojinaga @@ -0,0 +1,222 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:America/Ojinaga) { + {-9223372036854775808 -25060 0 LMT} + {-1514739600 -25200 0 MST} + {-1343066400 -21600 0 CST} + {-1234807200 -25200 0 MST} + {-1220292000 -21600 0 CST} + {-1207159200 -25200 0 MST} + {-1191344400 -21600 0 CST} + {820476000 -21600 0 CST} + {828864000 -18000 1 CDT} + {846399600 -21600 0 CST} + {860313600 -18000 1 CDT} + {877849200 -21600 0 CST} + {883634400 -21600 0 CST} + {891766800 -21600 0 MDT} + {909302400 -25200 0 MST} + {923216400 -21600 1 MDT} + {941356800 -25200 0 MST} + {954666000 -21600 1 MDT} + {972806400 -25200 0 MST} + {989139600 -21600 1 MDT} + {1001836800 -25200 0 MST} + {1018170000 -21600 1 MDT} + {1035705600 -25200 0 MST} + {1049619600 -21600 1 MDT} + {1067155200 -25200 0 MST} + {1081069200 -21600 1 MDT} + {1099209600 -25200 0 MST} + {1112518800 -21600 1 MDT} + {1130659200 -25200 0 MST} + {1143968400 -21600 1 MDT} + {1162108800 -25200 0 MST} + {1175418000 -21600 1 MDT} + {1193558400 -25200 0 MST} + {1207472400 -21600 1 MDT} + {1225008000 -25200 0 MST} + {1238922000 -21600 1 MDT} + {1256457600 -25200 0 MST} + {1262329200 -25200 0 MST} + {1268557200 -21600 1 MDT} + {1289116800 -25200 0 MST} + {1300006800 -21600 1 MDT} + {1320566400 -25200 0 MST} + {1331456400 -21600 1 MDT} + {1352016000 -25200 0 MST} + {1362906000 -21600 1 MDT} + {1383465600 -25200 0 MST} + {1394355600 -21600 1 MDT} + {1414915200 -25200 0 MST} + {1425805200 -21600 1 MDT} + {1446364800 -25200 0 MST} + {1457859600 -21600 1 MDT} + {1478419200 -25200 0 MST} + {1489309200 -21600 1 MDT} + {1509868800 -25200 0 MST} + {1520758800 -21600 1 MDT} + {1541318400 -25200 0 MST} + {1552208400 -21600 1 MDT} + {1572768000 -25200 0 MST} + {1583658000 -21600 1 MDT} + {1604217600 -25200 0 MST} + {1615712400 -21600 1 MDT} + {1636272000 -25200 0 MST} + {1647162000 -21600 1 MDT} + {1667721600 -25200 0 MST} + {1678611600 -21600 1 MDT} + {1699171200 -25200 0 MST} + {1710061200 -21600 1 MDT} + {1730620800 -25200 0 MST} + {1741510800 -21600 1 MDT} + {1762070400 -25200 0 MST} + {1772960400 -21600 1 MDT} + {1793520000 -25200 0 MST} + {1805014800 -21600 1 MDT} + {1825574400 -25200 0 MST} + {1836464400 -21600 1 MDT} + {1857024000 -25200 0 MST} + {1867914000 -21600 1 MDT} + {1888473600 -25200 0 MST} + {1899363600 -21600 1 MDT} + {1919923200 -25200 0 MST} + {1930813200 -21600 1 MDT} + {1951372800 -25200 0 MST} + {1962867600 -21600 1 MDT} + {1983427200 -25200 0 MST} + {1994317200 -21600 1 MDT} + {2014876800 -25200 0 MST} + {2025766800 -21600 1 MDT} + {2046326400 -25200 0 MST} + {2057216400 -21600 1 MDT} + {2077776000 -25200 0 MST} + {2088666000 -21600 1 MDT} + {2109225600 -25200 0 MST} + {2120115600 -21600 1 MDT} + {2140675200 -25200 0 MST} + {2152170000 -21600 1 MDT} + {2172729600 -25200 0 MST} + {2183619600 -21600 1 MDT} + {2204179200 -25200 0 MST} + {2215069200 -21600 1 MDT} + {2235628800 -25200 0 MST} + {2246518800 -21600 1 MDT} + {2267078400 -25200 0 MST} + {2277968400 -21600 1 MDT} + {2298528000 -25200 0 MST} + {2309418000 -21600 1 MDT} + {2329977600 -25200 0 MST} + {2341472400 -21600 1 MDT} + {2362032000 -25200 0 MST} + {2372922000 -21600 1 MDT} + {2393481600 -25200 0 MST} + {2404371600 -21600 1 MDT} + {2424931200 -25200 0 MST} + {2435821200 -21600 1 MDT} + {2456380800 -25200 0 MST} + {2467270800 -21600 1 MDT} + {2487830400 -25200 0 MST} + {2499325200 -21600 1 MDT} + {2519884800 -25200 0 MST} + {2530774800 -21600 1 MDT} + {2551334400 -25200 0 MST} + {2562224400 -21600 1 MDT} + {2582784000 -25200 0 MST} + {2593674000 -21600 1 MDT} + {2614233600 -25200 0 MST} + {2625123600 -21600 1 MDT} + {2645683200 -25200 0 MST} + {2656573200 -21600 1 MDT} + {2677132800 -25200 0 MST} + {2688627600 -21600 1 MDT} + {2709187200 -25200 0 MST} + {2720077200 -21600 1 MDT} + {2740636800 -25200 0 MST} + {2751526800 -21600 1 MDT} + {2772086400 -25200 0 MST} + {2782976400 -21600 1 MDT} + {2803536000 -25200 0 MST} + {2814426000 -21600 1 MDT} + {2834985600 -25200 0 MST} + {2846480400 -21600 1 MDT} + {2867040000 -25200 0 MST} + {2877930000 -21600 1 MDT} + {2898489600 -25200 0 MST} + {2909379600 -21600 1 MDT} + {2929939200 -25200 0 MST} + {2940829200 -21600 1 MDT} + {2961388800 -25200 0 MST} + {2972278800 -21600 1 MDT} + {2992838400 -25200 0 MST} + {3003728400 -21600 1 MDT} + {3024288000 -25200 0 MST} + {3035782800 -21600 1 MDT} + {3056342400 -25200 0 MST} + {3067232400 -21600 1 MDT} + {3087792000 -25200 0 MST} + {3098682000 -21600 1 MDT} + {3119241600 -25200 0 MST} + {3130131600 -21600 1 MDT} + {3150691200 -25200 0 MST} + {3161581200 -21600 1 MDT} + {3182140800 -25200 0 MST} + {3193030800 -21600 1 MDT} + {3213590400 -25200 0 MST} + {3225085200 -21600 1 MDT} + {3245644800 -25200 0 MST} + {3256534800 -21600 1 MDT} + {3277094400 -25200 0 MST} + {3287984400 -21600 1 MDT} + {3308544000 -25200 0 MST} + {3319434000 -21600 1 MDT} + {3339993600 -25200 0 MST} + {3350883600 -21600 1 MDT} + {3371443200 -25200 0 MST} + {3382938000 -21600 1 MDT} + {3403497600 -25200 0 MST} + {3414387600 -21600 1 MDT} + {3434947200 -25200 0 MST} + {3445837200 -21600 1 MDT} + {3466396800 -25200 0 MST} + {3477286800 -21600 1 MDT} + {3497846400 -25200 0 MST} + {3508736400 -21600 1 MDT} + {3529296000 -25200 0 MST} + {3540186000 -21600 1 MDT} + {3560745600 -25200 0 MST} + {3572240400 -21600 1 MDT} + {3592800000 -25200 0 MST} + {3603690000 -21600 1 MDT} + {3624249600 -25200 0 MST} + {3635139600 -21600 1 MDT} + {3655699200 -25200 0 MST} + {3666589200 -21600 1 MDT} + {3687148800 -25200 0 MST} + {3698038800 -21600 1 MDT} + {3718598400 -25200 0 MST} + {3730093200 -21600 1 MDT} + {3750652800 -25200 0 MST} + {3761542800 -21600 1 MDT} + {3782102400 -25200 0 MST} + {3792992400 -21600 1 MDT} + {3813552000 -25200 0 MST} + {3824442000 -21600 1 MDT} + {3845001600 -25200 0 MST} + {3855891600 -21600 1 MDT} + {3876451200 -25200 0 MST} + {3887341200 -21600 1 MDT} + {3907900800 -25200 0 MST} + {3919395600 -21600 1 MDT} + {3939955200 -25200 0 MST} + {3950845200 -21600 1 MDT} + {3971404800 -25200 0 MST} + {3982294800 -21600 1 MDT} + {4002854400 -25200 0 MST} + {4013744400 -21600 1 MDT} + {4034304000 -25200 0 MST} + {4045194000 -21600 1 MDT} + {4065753600 -25200 0 MST} + {4076643600 -21600 1 MDT} + {4097203200 -25200 0 MST} +} diff --git a/env/tcl/tcl8.6/tzdata/America/Panama b/env/tcl/tcl8.6/tzdata/America/Panama new file mode 100644 index 0000000..3006785 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/America/Panama @@ -0,0 +1,7 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:America/Panama) { + {-9223372036854775808 -19088 0 LMT} + {-2524502512 -19176 0 CMT} + {-1946918424 -18000 0 EST} +} diff --git a/env/tcl/tcl8.6/tzdata/America/Pangnirtung b/env/tcl/tcl8.6/tzdata/America/Pangnirtung new file mode 100644 index 0000000..14d8516 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/America/Pangnirtung @@ -0,0 +1,252 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:America/Pangnirtung) { + {-9223372036854775808 0 0 -00} + {-1546300800 -14400 0 AST} + {-880221600 -10800 1 AWT} + {-769395600 -10800 1 APT} + {-765399600 -14400 0 AST} + {-147902400 -7200 1 ADDT} + {-131572800 -14400 0 AST} + {325663200 -10800 1 ADT} + {341384400 -14400 0 AST} + {357112800 -10800 1 ADT} + {372834000 -14400 0 AST} + {388562400 -10800 1 ADT} + {404888400 -14400 0 AST} + {420012000 -10800 1 ADT} + {436338000 -14400 0 AST} + {452066400 -10800 1 ADT} + {467787600 -14400 0 AST} + {483516000 -10800 1 ADT} + {499237200 -14400 0 AST} + {514965600 -10800 1 ADT} + {530686800 -14400 0 AST} + {544600800 -10800 1 ADT} + {562136400 -14400 0 AST} + {576050400 -10800 1 ADT} + {594190800 -14400 0 AST} + {607500000 -10800 1 ADT} + {625640400 -14400 0 AST} + {638949600 -10800 1 ADT} + {657090000 -14400 0 AST} + {671004000 -10800 1 ADT} + {688539600 -14400 0 AST} + {702453600 -10800 1 ADT} + {719989200 -14400 0 AST} + {733903200 -10800 1 ADT} + {752043600 -14400 0 AST} + {765352800 -10800 1 ADT} + {783493200 -14400 0 AST} + {796802400 -18000 0 EST} + {796806000 -14400 1 EDT} + {814946400 -18000 0 EST} + {828860400 -14400 1 EDT} + {846396000 -18000 0 EST} + {860310000 -14400 1 EDT} + {877845600 -18000 0 EST} + {891759600 -14400 1 EDT} + {909295200 -18000 0 EST} + {923209200 -14400 1 EDT} + {941353200 -21600 0 CST} + {954662400 -18000 1 CDT} + {972806400 -18000 0 EST} + {986108400 -14400 1 EDT} + {1004248800 -18000 0 EST} + {1018162800 -14400 1 EDT} + {1035698400 -18000 0 EST} + {1049612400 -14400 1 EDT} + {1067148000 -18000 0 EST} + {1081062000 -14400 1 EDT} + {1099202400 -18000 0 EST} + {1112511600 -14400 1 EDT} + {1130652000 -18000 0 EST} + {1143961200 -14400 1 EDT} + {1162101600 -18000 0 EST} + {1173596400 -14400 1 EDT} + {1194156000 -18000 0 EST} + {1205046000 -14400 1 EDT} + {1225605600 -18000 0 EST} + {1236495600 -14400 1 EDT} + {1257055200 -18000 0 EST} + {1268550000 -14400 1 EDT} + {1289109600 -18000 0 EST} + {1299999600 -14400 1 EDT} + {1320559200 -18000 0 EST} + {1331449200 -14400 1 EDT} + {1352008800 -18000 0 EST} + {1362898800 -14400 1 EDT} + {1383458400 -18000 0 EST} + {1394348400 -14400 1 EDT} + {1414908000 -18000 0 EST} + {1425798000 -14400 1 EDT} + {1446357600 -18000 0 EST} + {1457852400 -14400 1 EDT} + {1478412000 -18000 0 EST} + {1489302000 -14400 1 EDT} + {1509861600 -18000 0 EST} + {1520751600 -14400 1 EDT} + {1541311200 -18000 0 EST} + {1552201200 -14400 1 EDT} + {1572760800 -18000 0 EST} + {1583650800 -14400 1 EDT} + {1604210400 -18000 0 EST} + {1615705200 -14400 1 EDT} + {1636264800 -18000 0 EST} + {1647154800 -14400 1 EDT} + {1667714400 -18000 0 EST} + {1678604400 -14400 1 EDT} + {1699164000 -18000 0 EST} + {1710054000 -14400 1 EDT} + {1730613600 -18000 0 EST} + {1741503600 -14400 1 EDT} + {1762063200 -18000 0 EST} + {1772953200 -14400 1 EDT} + {1793512800 -18000 0 EST} + {1805007600 -14400 1 EDT} + {1825567200 -18000 0 EST} + {1836457200 -14400 1 EDT} + {1857016800 -18000 0 EST} + {1867906800 -14400 1 EDT} + {1888466400 -18000 0 EST} + {1899356400 -14400 1 EDT} + {1919916000 -18000 0 EST} + {1930806000 -14400 1 EDT} + {1951365600 -18000 0 EST} + {1962860400 -14400 1 EDT} + {1983420000 -18000 0 EST} + {1994310000 -14400 1 EDT} + {2014869600 -18000 0 EST} + {2025759600 -14400 1 EDT} + {2046319200 -18000 0 EST} + {2057209200 -14400 1 EDT} + {2077768800 -18000 0 EST} + {2088658800 -14400 1 EDT} + {2109218400 -18000 0 EST} + {2120108400 -14400 1 EDT} + {2140668000 -18000 0 EST} + {2152162800 -14400 1 EDT} + {2172722400 -18000 0 EST} + {2183612400 -14400 1 EDT} + {2204172000 -18000 0 EST} + {2215062000 -14400 1 EDT} + {2235621600 -18000 0 EST} + {2246511600 -14400 1 EDT} + {2267071200 -18000 0 EST} + {2277961200 -14400 1 EDT} + {2298520800 -18000 0 EST} + {2309410800 -14400 1 EDT} + {2329970400 -18000 0 EST} + {2341465200 -14400 1 EDT} + {2362024800 -18000 0 EST} + {2372914800 -14400 1 EDT} + {2393474400 -18000 0 EST} + {2404364400 -14400 1 EDT} + {2424924000 -18000 0 EST} + {2435814000 -14400 1 EDT} + {2456373600 -18000 0 EST} + {2467263600 -14400 1 EDT} + {2487823200 -18000 0 EST} + {2499318000 -14400 1 EDT} + {2519877600 -18000 0 EST} + {2530767600 -14400 1 EDT} + {2551327200 -18000 0 EST} + {2562217200 -14400 1 EDT} + {2582776800 -18000 0 EST} + {2593666800 -14400 1 EDT} + {2614226400 -18000 0 EST} + {2625116400 -14400 1 EDT} + {2645676000 -18000 0 EST} + {2656566000 -14400 1 EDT} + {2677125600 -18000 0 EST} + {2688620400 -14400 1 EDT} + {2709180000 -18000 0 EST} + {2720070000 -14400 1 EDT} + {2740629600 -18000 0 EST} + {2751519600 -14400 1 EDT} + {2772079200 -18000 0 EST} + {2782969200 -14400 1 EDT} + {2803528800 -18000 0 EST} + {2814418800 -14400 1 EDT} + {2834978400 -18000 0 EST} + {2846473200 -14400 1 EDT} + {2867032800 -18000 0 EST} + {2877922800 -14400 1 EDT} + {2898482400 -18000 0 EST} + {2909372400 -14400 1 EDT} + {2929932000 -18000 0 EST} + {2940822000 -14400 1 EDT} + {2961381600 -18000 0 EST} + {2972271600 -14400 1 EDT} + {2992831200 -18000 0 EST} + {3003721200 -14400 1 EDT} + {3024280800 -18000 0 EST} + {3035775600 -14400 1 EDT} + {3056335200 -18000 0 EST} + {3067225200 -14400 1 EDT} + {3087784800 -18000 0 EST} + {3098674800 -14400 1 EDT} + {3119234400 -18000 0 EST} + {3130124400 -14400 1 EDT} + {3150684000 -18000 0 EST} + {3161574000 -14400 1 EDT} + {3182133600 -18000 0 EST} + {3193023600 -14400 1 EDT} + {3213583200 -18000 0 EST} + {3225078000 -14400 1 EDT} + {3245637600 -18000 0 EST} + {3256527600 -14400 1 EDT} + {3277087200 -18000 0 EST} + {3287977200 -14400 1 EDT} + {3308536800 -18000 0 EST} + {3319426800 -14400 1 EDT} + {3339986400 -18000 0 EST} + {3350876400 -14400 1 EDT} + {3371436000 -18000 0 EST} + {3382930800 -14400 1 EDT} + {3403490400 -18000 0 EST} + {3414380400 -14400 1 EDT} + {3434940000 -18000 0 EST} + {3445830000 -14400 1 EDT} + {3466389600 -18000 0 EST} + {3477279600 -14400 1 EDT} + {3497839200 -18000 0 EST} + {3508729200 -14400 1 EDT} + {3529288800 -18000 0 EST} + {3540178800 -14400 1 EDT} + {3560738400 -18000 0 EST} + {3572233200 -14400 1 EDT} + {3592792800 -18000 0 EST} + {3603682800 -14400 1 EDT} + {3624242400 -18000 0 EST} + {3635132400 -14400 1 EDT} + {3655692000 -18000 0 EST} + {3666582000 -14400 1 EDT} + {3687141600 -18000 0 EST} + {3698031600 -14400 1 EDT} + {3718591200 -18000 0 EST} + {3730086000 -14400 1 EDT} + {3750645600 -18000 0 EST} + {3761535600 -14400 1 EDT} + {3782095200 -18000 0 EST} + {3792985200 -14400 1 EDT} + {3813544800 -18000 0 EST} + {3824434800 -14400 1 EDT} + {3844994400 -18000 0 EST} + {3855884400 -14400 1 EDT} + {3876444000 -18000 0 EST} + {3887334000 -14400 1 EDT} + {3907893600 -18000 0 EST} + {3919388400 -14400 1 EDT} + {3939948000 -18000 0 EST} + {3950838000 -14400 1 EDT} + {3971397600 -18000 0 EST} + {3982287600 -14400 1 EDT} + {4002847200 -18000 0 EST} + {4013737200 -14400 1 EDT} + {4034296800 -18000 0 EST} + {4045186800 -14400 1 EDT} + {4065746400 -18000 0 EST} + {4076636400 -14400 1 EDT} + {4097196000 -18000 0 EST} +} diff --git a/env/tcl/tcl8.6/tzdata/America/Paramaribo b/env/tcl/tcl8.6/tzdata/America/Paramaribo new file mode 100644 index 0000000..7a80f1d --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/America/Paramaribo @@ -0,0 +1,9 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:America/Paramaribo) { + {-9223372036854775808 -13240 0 LMT} + {-1861906760 -13252 0 PMT} + {-1104524348 -13236 0 PMT} + {-765317964 -12600 0 -0330} + {465449400 -10800 0 -03} +} diff --git a/env/tcl/tcl8.6/tzdata/America/Phoenix b/env/tcl/tcl8.6/tzdata/America/Phoenix new file mode 100644 index 0000000..3d37bb4 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/America/Phoenix @@ -0,0 +1,17 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:America/Phoenix) { + {-9223372036854775808 -26898 0 LMT} + {-2717643600 -25200 0 MST} + {-1633273200 -21600 1 MDT} + {-1615132800 -25200 0 MST} + {-1601823600 -21600 1 MDT} + {-1583683200 -25200 0 MST} + {-880210800 -21600 1 MWT} + {-820519140 -25200 0 MST} + {-796841940 -25200 0 MST} + {-94669200 -25200 0 MST} + {-84380400 -21600 1 MDT} + {-68659200 -25200 0 MST} + {-56221200 -25200 0 MST} +} diff --git a/env/tcl/tcl8.6/tzdata/America/Port-au-Prince b/env/tcl/tcl8.6/tzdata/America/Port-au-Prince new file mode 100644 index 0000000..23e7de4 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/America/Port-au-Prince @@ -0,0 +1,215 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:America/Port-au-Prince) { + {-9223372036854775808 -17360 0 LMT} + {-2524504240 -17340 0 PPMT} + {-1670483460 -18000 0 EST} + {421218000 -14400 1 EDT} + {436334400 -18000 0 EST} + {452062800 -14400 1 EDT} + {467784000 -18000 0 EST} + {483512400 -14400 1 EDT} + {499233600 -18000 0 EST} + {514962000 -14400 1 EDT} + {530683200 -18000 0 EST} + {546411600 -14400 1 EDT} + {562132800 -18000 0 EST} + {576050400 -14400 1 EDT} + {594194400 -18000 0 EST} + {607500000 -14400 1 EDT} + {625644000 -18000 0 EST} + {638949600 -14400 1 EDT} + {657093600 -18000 0 EST} + {671004000 -14400 1 EDT} + {688543200 -18000 0 EST} + {702453600 -14400 1 EDT} + {719992800 -18000 0 EST} + {733903200 -14400 1 EDT} + {752047200 -18000 0 EST} + {765352800 -14400 1 EDT} + {783496800 -18000 0 EST} + {796802400 -14400 1 EDT} + {814946400 -18000 0 EST} + {828856800 -14400 1 EDT} + {846396000 -18000 0 EST} + {860306400 -14400 1 EDT} + {877845600 -18000 0 EST} + {1112504400 -14400 1 EDT} + {1130644800 -18000 0 EST} + {1143954000 -14400 1 EDT} + {1162094400 -18000 0 EST} + {1331449200 -14400 1 EDT} + {1352008800 -18000 0 EST} + {1362898800 -14400 1 EDT} + {1383458400 -18000 0 EST} + {1394348400 -14400 1 EDT} + {1414908000 -18000 0 EST} + {1425798000 -14400 1 EDT} + {1446357600 -18000 0 EST} + {1489302000 -14400 1 EDT} + {1509861600 -18000 0 EST} + {1520751600 -14400 1 EDT} + {1541311200 -18000 0 EST} + {1552201200 -14400 1 EDT} + {1572760800 -18000 0 EST} + {1583650800 -14400 1 EDT} + {1604210400 -18000 0 EST} + {1615705200 -14400 1 EDT} + {1636264800 -18000 0 EST} + {1647154800 -14400 1 EDT} + {1667714400 -18000 0 EST} + {1678604400 -14400 1 EDT} + {1699164000 -18000 0 EST} + {1710054000 -14400 1 EDT} + {1730613600 -18000 0 EST} + {1741503600 -14400 1 EDT} + {1762063200 -18000 0 EST} + {1772953200 -14400 1 EDT} + {1793512800 -18000 0 EST} + {1805007600 -14400 1 EDT} + {1825567200 -18000 0 EST} + {1836457200 -14400 1 EDT} + {1857016800 -18000 0 EST} + {1867906800 -14400 1 EDT} + {1888466400 -18000 0 EST} + {1899356400 -14400 1 EDT} + {1919916000 -18000 0 EST} + {1930806000 -14400 1 EDT} + {1951365600 -18000 0 EST} + {1962860400 -14400 1 EDT} + {1983420000 -18000 0 EST} + {1994310000 -14400 1 EDT} + {2014869600 -18000 0 EST} + {2025759600 -14400 1 EDT} + {2046319200 -18000 0 EST} + {2057209200 -14400 1 EDT} + {2077768800 -18000 0 EST} + {2088658800 -14400 1 EDT} + {2109218400 -18000 0 EST} + {2120108400 -14400 1 EDT} + {2140668000 -18000 0 EST} + {2152162800 -14400 1 EDT} + {2172722400 -18000 0 EST} + {2183612400 -14400 1 EDT} + {2204172000 -18000 0 EST} + {2215062000 -14400 1 EDT} + {2235621600 -18000 0 EST} + {2246511600 -14400 1 EDT} + {2267071200 -18000 0 EST} + {2277961200 -14400 1 EDT} + {2298520800 -18000 0 EST} + {2309410800 -14400 1 EDT} + {2329970400 -18000 0 EST} + {2341465200 -14400 1 EDT} + {2362024800 -18000 0 EST} + {2372914800 -14400 1 EDT} + {2393474400 -18000 0 EST} + {2404364400 -14400 1 EDT} + {2424924000 -18000 0 EST} + {2435814000 -14400 1 EDT} + {2456373600 -18000 0 EST} + {2467263600 -14400 1 EDT} + {2487823200 -18000 0 EST} + {2499318000 -14400 1 EDT} + {2519877600 -18000 0 EST} + {2530767600 -14400 1 EDT} + {2551327200 -18000 0 EST} + {2562217200 -14400 1 EDT} + {2582776800 -18000 0 EST} + {2593666800 -14400 1 EDT} + {2614226400 -18000 0 EST} + {2625116400 -14400 1 EDT} + {2645676000 -18000 0 EST} + {2656566000 -14400 1 EDT} + {2677125600 -18000 0 EST} + {2688620400 -14400 1 EDT} + {2709180000 -18000 0 EST} + {2720070000 -14400 1 EDT} + {2740629600 -18000 0 EST} + {2751519600 -14400 1 EDT} + {2772079200 -18000 0 EST} + {2782969200 -14400 1 EDT} + {2803528800 -18000 0 EST} + {2814418800 -14400 1 EDT} + {2834978400 -18000 0 EST} + {2846473200 -14400 1 EDT} + {2867032800 -18000 0 EST} + {2877922800 -14400 1 EDT} + {2898482400 -18000 0 EST} + {2909372400 -14400 1 EDT} + {2929932000 -18000 0 EST} + {2940822000 -14400 1 EDT} + {2961381600 -18000 0 EST} + {2972271600 -14400 1 EDT} + {2992831200 -18000 0 EST} + {3003721200 -14400 1 EDT} + {3024280800 -18000 0 EST} + {3035775600 -14400 1 EDT} + {3056335200 -18000 0 EST} + {3067225200 -14400 1 EDT} + {3087784800 -18000 0 EST} + {3098674800 -14400 1 EDT} + {3119234400 -18000 0 EST} + {3130124400 -14400 1 EDT} + {3150684000 -18000 0 EST} + {3161574000 -14400 1 EDT} + {3182133600 -18000 0 EST} + {3193023600 -14400 1 EDT} + {3213583200 -18000 0 EST} + {3225078000 -14400 1 EDT} + {3245637600 -18000 0 EST} + {3256527600 -14400 1 EDT} + {3277087200 -18000 0 EST} + {3287977200 -14400 1 EDT} + {3308536800 -18000 0 EST} + {3319426800 -14400 1 EDT} + {3339986400 -18000 0 EST} + {3350876400 -14400 1 EDT} + {3371436000 -18000 0 EST} + {3382930800 -14400 1 EDT} + {3403490400 -18000 0 EST} + {3414380400 -14400 1 EDT} + {3434940000 -18000 0 EST} + {3445830000 -14400 1 EDT} + {3466389600 -18000 0 EST} + {3477279600 -14400 1 EDT} + {3497839200 -18000 0 EST} + {3508729200 -14400 1 EDT} + {3529288800 -18000 0 EST} + {3540178800 -14400 1 EDT} + {3560738400 -18000 0 EST} + {3572233200 -14400 1 EDT} + {3592792800 -18000 0 EST} + {3603682800 -14400 1 EDT} + {3624242400 -18000 0 EST} + {3635132400 -14400 1 EDT} + {3655692000 -18000 0 EST} + {3666582000 -14400 1 EDT} + {3687141600 -18000 0 EST} + {3698031600 -14400 1 EDT} + {3718591200 -18000 0 EST} + {3730086000 -14400 1 EDT} + {3750645600 -18000 0 EST} + {3761535600 -14400 1 EDT} + {3782095200 -18000 0 EST} + {3792985200 -14400 1 EDT} + {3813544800 -18000 0 EST} + {3824434800 -14400 1 EDT} + {3844994400 -18000 0 EST} + {3855884400 -14400 1 EDT} + {3876444000 -18000 0 EST} + {3887334000 -14400 1 EDT} + {3907893600 -18000 0 EST} + {3919388400 -14400 1 EDT} + {3939948000 -18000 0 EST} + {3950838000 -14400 1 EDT} + {3971397600 -18000 0 EST} + {3982287600 -14400 1 EDT} + {4002847200 -18000 0 EST} + {4013737200 -14400 1 EDT} + {4034296800 -18000 0 EST} + {4045186800 -14400 1 EDT} + {4065746400 -18000 0 EST} + {4076636400 -14400 1 EDT} + {4097196000 -18000 0 EST} +} diff --git a/env/tcl/tcl8.6/tzdata/America/Port_of_Spain b/env/tcl/tcl8.6/tzdata/America/Port_of_Spain new file mode 100644 index 0000000..c360c87 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/America/Port_of_Spain @@ -0,0 +1,6 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:America/Port_of_Spain) { + {-9223372036854775808 -14764 0 LMT} + {-1825098836 -14400 0 AST} +} diff --git a/env/tcl/tcl8.6/tzdata/America/Porto_Acre b/env/tcl/tcl8.6/tzdata/America/Porto_Acre new file mode 100644 index 0000000..0626001 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/America/Porto_Acre @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(America/Rio_Branco)]} { + LoadTimeZoneFile America/Rio_Branco +} +set TZData(:America/Porto_Acre) $TZData(:America/Rio_Branco) diff --git a/env/tcl/tcl8.6/tzdata/America/Porto_Velho b/env/tcl/tcl8.6/tzdata/America/Porto_Velho new file mode 100644 index 0000000..8d7c8fd --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/America/Porto_Velho @@ -0,0 +1,35 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:America/Porto_Velho) { + {-9223372036854775808 -15336 0 LMT} + {-1767210264 -14400 0 -04} + {-1206954000 -10800 1 -04} + {-1191358800 -14400 0 -04} + {-1175371200 -10800 1 -04} + {-1159822800 -14400 0 -04} + {-633816000 -10800 1 -04} + {-622065600 -14400 0 -04} + {-602280000 -10800 1 -04} + {-591829200 -14400 0 -04} + {-570744000 -10800 1 -04} + {-560206800 -14400 0 -04} + {-539121600 -10800 1 -04} + {-531349200 -14400 0 -04} + {-191361600 -10800 1 -04} + {-184194000 -14400 0 -04} + {-155160000 -10800 1 -04} + {-150066000 -14400 0 -04} + {-128894400 -10800 1 -04} + {-121122000 -14400 0 -04} + {-99950400 -10800 1 -04} + {-89586000 -14400 0 -04} + {-68414400 -10800 1 -04} + {-57963600 -14400 0 -04} + {499752000 -10800 1 -04} + {511239600 -14400 0 -04} + {530596800 -10800 1 -04} + {540270000 -14400 0 -04} + {562132800 -10800 1 -04} + {571201200 -14400 0 -04} + {590036400 -14400 0 -04} +} diff --git a/env/tcl/tcl8.6/tzdata/America/Puerto_Rico b/env/tcl/tcl8.6/tzdata/America/Puerto_Rico new file mode 100644 index 0000000..0d5c9b4 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/America/Puerto_Rico @@ -0,0 +1,10 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:America/Puerto_Rico) { + {-9223372036854775808 -15865 0 LMT} + {-2233035335 -14400 0 AST} + {-873057600 -10800 0 AWT} + {-769395600 -10800 1 APT} + {-765399600 -14400 0 AST} + {-757368000 -14400 0 AST} +} diff --git a/env/tcl/tcl8.6/tzdata/America/Punta_Arenas b/env/tcl/tcl8.6/tzdata/America/Punta_Arenas new file mode 100644 index 0000000..5e8202a --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/America/Punta_Arenas @@ -0,0 +1,122 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:America/Punta_Arenas) { + {-9223372036854775808 -17020 0 LMT} + {-2524504580 -16966 0 SMT} + {-1892661434 -18000 0 -05} + {-1688410800 -16966 0 SMT} + {-1619205434 -14400 0 -04} + {-1593806400 -16966 0 SMT} + {-1335986234 -18000 0 -05} + {-1335985200 -14400 1 -05} + {-1317585600 -18000 0 -05} + {-1304362800 -14400 1 -05} + {-1286049600 -18000 0 -05} + {-1272826800 -14400 1 -05} + {-1254513600 -18000 0 -05} + {-1241290800 -14400 1 -05} + {-1222977600 -18000 0 -05} + {-1209754800 -14400 1 -05} + {-1191355200 -18000 0 -05} + {-1178132400 -14400 0 -04} + {-870552000 -18000 0 -05} + {-865278000 -14400 0 -04} + {-718056000 -18000 0 -05} + {-713649600 -14400 0 -04} + {-36619200 -10800 1 -04} + {-23922000 -14400 0 -04} + {-3355200 -10800 1 -04} + {7527600 -14400 0 -04} + {24465600 -10800 1 -04} + {37767600 -14400 0 -04} + {55915200 -10800 1 -04} + {69217200 -14400 0 -04} + {87969600 -10800 1 -04} + {100666800 -14400 0 -04} + {118209600 -10800 1 -04} + {132116400 -14400 0 -04} + {150868800 -10800 1 -04} + {163566000 -14400 0 -04} + {182318400 -10800 1 -04} + {195620400 -14400 0 -04} + {213768000 -10800 1 -04} + {227070000 -14400 0 -04} + {245217600 -10800 1 -04} + {258519600 -14400 0 -04} + {277272000 -10800 1 -04} + {289969200 -14400 0 -04} + {308721600 -10800 1 -04} + {321418800 -14400 0 -04} + {340171200 -10800 1 -04} + {353473200 -14400 0 -04} + {371620800 -10800 1 -04} + {384922800 -14400 0 -04} + {403070400 -10800 1 -04} + {416372400 -14400 0 -04} + {434520000 -10800 1 -04} + {447822000 -14400 0 -04} + {466574400 -10800 1 -04} + {479271600 -14400 0 -04} + {498024000 -10800 1 -04} + {510721200 -14400 0 -04} + {529473600 -10800 1 -04} + {545194800 -14400 0 -04} + {560923200 -10800 1 -04} + {574225200 -14400 0 -04} + {592372800 -10800 1 -04} + {605674800 -14400 0 -04} + {624427200 -10800 1 -04} + {637124400 -14400 0 -04} + {653457600 -10800 1 -04} + {668574000 -14400 0 -04} + {687326400 -10800 1 -04} + {700628400 -14400 0 -04} + {718776000 -10800 1 -04} + {732078000 -14400 0 -04} + {750225600 -10800 1 -04} + {763527600 -14400 0 -04} + {781675200 -10800 1 -04} + {794977200 -14400 0 -04} + {813729600 -10800 1 -04} + {826426800 -14400 0 -04} + {845179200 -10800 1 -04} + {859690800 -14400 0 -04} + {876628800 -10800 1 -04} + {889930800 -14400 0 -04} + {906868800 -10800 1 -04} + {923194800 -14400 0 -04} + {939528000 -10800 1 -04} + {952830000 -14400 0 -04} + {971582400 -10800 1 -04} + {984279600 -14400 0 -04} + {1003032000 -10800 1 -04} + {1015729200 -14400 0 -04} + {1034481600 -10800 1 -04} + {1047178800 -14400 0 -04} + {1065931200 -10800 1 -04} + {1079233200 -14400 0 -04} + {1097380800 -10800 1 -04} + {1110682800 -14400 0 -04} + {1128830400 -10800 1 -04} + {1142132400 -14400 0 -04} + {1160884800 -10800 1 -04} + {1173582000 -14400 0 -04} + {1192334400 -10800 1 -04} + {1206846000 -14400 0 -04} + {1223784000 -10800 1 -04} + {1237086000 -14400 0 -04} + {1255233600 -10800 1 -04} + {1270350000 -14400 0 -04} + {1286683200 -10800 1 -04} + {1304823600 -14400 0 -04} + {1313899200 -10800 1 -04} + {1335668400 -14400 0 -04} + {1346558400 -10800 1 -04} + {1367118000 -14400 0 -04} + {1378612800 -10800 1 -04} + {1398567600 -14400 0 -04} + {1410062400 -10800 1 -04} + {1463281200 -14400 0 -04} + {1471147200 -10800 1 -04} + {1480820400 -10800 0 -03} +} diff --git a/env/tcl/tcl8.6/tzdata/America/Rainy_River b/env/tcl/tcl8.6/tzdata/America/Rainy_River new file mode 100644 index 0000000..a2b11aa --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/America/Rainy_River @@ -0,0 +1,264 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:America/Rainy_River) { + {-9223372036854775808 -22696 0 LMT} + {-2366732504 -21600 0 CST} + {-1632067200 -18000 1 CDT} + {-1615136400 -21600 0 CST} + {-923248800 -18000 1 CDT} + {-880214400 -18000 0 CWT} + {-769395600 -18000 1 CPT} + {-765392400 -21600 0 CST} + {136368000 -18000 1 CDT} + {152089200 -21600 0 CST} + {167817600 -18000 1 CDT} + {183538800 -21600 0 CST} + {199267200 -18000 1 CDT} + {215593200 -21600 0 CST} + {230716800 -18000 1 CDT} + {247042800 -21600 0 CST} + {262771200 -18000 1 CDT} + {278492400 -21600 0 CST} + {294220800 -18000 1 CDT} + {309942000 -21600 0 CST} + {325670400 -18000 1 CDT} + {341391600 -21600 0 CST} + {357120000 -18000 1 CDT} + {372841200 -21600 0 CST} + {388569600 -18000 1 CDT} + {404895600 -21600 0 CST} + {420019200 -18000 1 CDT} + {436345200 -21600 0 CST} + {452073600 -18000 1 CDT} + {467794800 -21600 0 CST} + {483523200 -18000 1 CDT} + {499244400 -21600 0 CST} + {514972800 -18000 1 CDT} + {530694000 -21600 0 CST} + {544608000 -18000 1 CDT} + {562143600 -21600 0 CST} + {576057600 -18000 1 CDT} + {594198000 -21600 0 CST} + {607507200 -18000 1 CDT} + {625647600 -21600 0 CST} + {638956800 -18000 1 CDT} + {657097200 -21600 0 CST} + {671011200 -18000 1 CDT} + {688546800 -21600 0 CST} + {702460800 -18000 1 CDT} + {719996400 -21600 0 CST} + {733910400 -18000 1 CDT} + {752050800 -21600 0 CST} + {765360000 -18000 1 CDT} + {783500400 -21600 0 CST} + {796809600 -18000 1 CDT} + {814950000 -21600 0 CST} + {828864000 -18000 1 CDT} + {846399600 -21600 0 CST} + {860313600 -18000 1 CDT} + {877849200 -21600 0 CST} + {891763200 -18000 1 CDT} + {909298800 -21600 0 CST} + {923212800 -18000 1 CDT} + {941353200 -21600 0 CST} + {954662400 -18000 1 CDT} + {972802800 -21600 0 CST} + {986112000 -18000 1 CDT} + {1004252400 -21600 0 CST} + {1018166400 -18000 1 CDT} + {1035702000 -21600 0 CST} + {1049616000 -18000 1 CDT} + {1067151600 -21600 0 CST} + {1081065600 -18000 1 CDT} + {1099206000 -21600 0 CST} + {1112515200 -18000 1 CDT} + {1130655600 -21600 0 CST} + {1143964800 -18000 1 CDT} + {1162105200 -21600 0 CST} + {1173600000 -18000 1 CDT} + {1194159600 -21600 0 CST} + {1205049600 -18000 1 CDT} + {1225609200 -21600 0 CST} + {1236499200 -18000 1 CDT} + {1257058800 -21600 0 CST} + {1268553600 -18000 1 CDT} + {1289113200 -21600 0 CST} + {1300003200 -18000 1 CDT} + {1320562800 -21600 0 CST} + {1331452800 -18000 1 CDT} + {1352012400 -21600 0 CST} + {1362902400 -18000 1 CDT} + {1383462000 -21600 0 CST} + {1394352000 -18000 1 CDT} + {1414911600 -21600 0 CST} + {1425801600 -18000 1 CDT} + {1446361200 -21600 0 CST} + {1457856000 -18000 1 CDT} + {1478415600 -21600 0 CST} + {1489305600 -18000 1 CDT} + {1509865200 -21600 0 CST} + {1520755200 -18000 1 CDT} + {1541314800 -21600 0 CST} + {1552204800 -18000 1 CDT} + {1572764400 -21600 0 CST} + {1583654400 -18000 1 CDT} + {1604214000 -21600 0 CST} + {1615708800 -18000 1 CDT} + {1636268400 -21600 0 CST} + {1647158400 -18000 1 CDT} + {1667718000 -21600 0 CST} + {1678608000 -18000 1 CDT} + {1699167600 -21600 0 CST} + {1710057600 -18000 1 CDT} + {1730617200 -21600 0 CST} + {1741507200 -18000 1 CDT} + {1762066800 -21600 0 CST} + {1772956800 -18000 1 CDT} + {1793516400 -21600 0 CST} + {1805011200 -18000 1 CDT} + {1825570800 -21600 0 CST} + {1836460800 -18000 1 CDT} + {1857020400 -21600 0 CST} + {1867910400 -18000 1 CDT} + {1888470000 -21600 0 CST} + {1899360000 -18000 1 CDT} + {1919919600 -21600 0 CST} + {1930809600 -18000 1 CDT} + {1951369200 -21600 0 CST} + {1962864000 -18000 1 CDT} + {1983423600 -21600 0 CST} + {1994313600 -18000 1 CDT} + {2014873200 -21600 0 CST} + {2025763200 -18000 1 CDT} + {2046322800 -21600 0 CST} + {2057212800 -18000 1 CDT} + {2077772400 -21600 0 CST} + {2088662400 -18000 1 CDT} + {2109222000 -21600 0 CST} + {2120112000 -18000 1 CDT} + {2140671600 -21600 0 CST} + {2152166400 -18000 1 CDT} + {2172726000 -21600 0 CST} + {2183616000 -18000 1 CDT} + {2204175600 -21600 0 CST} + {2215065600 -18000 1 CDT} + {2235625200 -21600 0 CST} + {2246515200 -18000 1 CDT} + {2267074800 -21600 0 CST} + {2277964800 -18000 1 CDT} + {2298524400 -21600 0 CST} + {2309414400 -18000 1 CDT} + {2329974000 -21600 0 CST} + {2341468800 -18000 1 CDT} + {2362028400 -21600 0 CST} + {2372918400 -18000 1 CDT} + {2393478000 -21600 0 CST} + {2404368000 -18000 1 CDT} + {2424927600 -21600 0 CST} + {2435817600 -18000 1 CDT} + {2456377200 -21600 0 CST} + {2467267200 -18000 1 CDT} + {2487826800 -21600 0 CST} + {2499321600 -18000 1 CDT} + {2519881200 -21600 0 CST} + {2530771200 -18000 1 CDT} + {2551330800 -21600 0 CST} + {2562220800 -18000 1 CDT} + {2582780400 -21600 0 CST} + {2593670400 -18000 1 CDT} + {2614230000 -21600 0 CST} + {2625120000 -18000 1 CDT} + {2645679600 -21600 0 CST} + {2656569600 -18000 1 CDT} + {2677129200 -21600 0 CST} + {2688624000 -18000 1 CDT} + {2709183600 -21600 0 CST} + {2720073600 -18000 1 CDT} + {2740633200 -21600 0 CST} + {2751523200 -18000 1 CDT} + {2772082800 -21600 0 CST} + {2782972800 -18000 1 CDT} + {2803532400 -21600 0 CST} + {2814422400 -18000 1 CDT} + {2834982000 -21600 0 CST} + {2846476800 -18000 1 CDT} + {2867036400 -21600 0 CST} + {2877926400 -18000 1 CDT} + {2898486000 -21600 0 CST} + {2909376000 -18000 1 CDT} + {2929935600 -21600 0 CST} + {2940825600 -18000 1 CDT} + {2961385200 -21600 0 CST} + {2972275200 -18000 1 CDT} + {2992834800 -21600 0 CST} + {3003724800 -18000 1 CDT} + {3024284400 -21600 0 CST} + {3035779200 -18000 1 CDT} + {3056338800 -21600 0 CST} + {3067228800 -18000 1 CDT} + {3087788400 -21600 0 CST} + {3098678400 -18000 1 CDT} + {3119238000 -21600 0 CST} + {3130128000 -18000 1 CDT} + {3150687600 -21600 0 CST} + {3161577600 -18000 1 CDT} + {3182137200 -21600 0 CST} + {3193027200 -18000 1 CDT} + {3213586800 -21600 0 CST} + {3225081600 -18000 1 CDT} + {3245641200 -21600 0 CST} + {3256531200 -18000 1 CDT} + {3277090800 -21600 0 CST} + {3287980800 -18000 1 CDT} + {3308540400 -21600 0 CST} + {3319430400 -18000 1 CDT} + {3339990000 -21600 0 CST} + {3350880000 -18000 1 CDT} + {3371439600 -21600 0 CST} + {3382934400 -18000 1 CDT} + {3403494000 -21600 0 CST} + {3414384000 -18000 1 CDT} + {3434943600 -21600 0 CST} + {3445833600 -18000 1 CDT} + {3466393200 -21600 0 CST} + {3477283200 -18000 1 CDT} + {3497842800 -21600 0 CST} + {3508732800 -18000 1 CDT} + {3529292400 -21600 0 CST} + {3540182400 -18000 1 CDT} + {3560742000 -21600 0 CST} + {3572236800 -18000 1 CDT} + {3592796400 -21600 0 CST} + {3603686400 -18000 1 CDT} + {3624246000 -21600 0 CST} + {3635136000 -18000 1 CDT} + {3655695600 -21600 0 CST} + {3666585600 -18000 1 CDT} + {3687145200 -21600 0 CST} + {3698035200 -18000 1 CDT} + {3718594800 -21600 0 CST} + {3730089600 -18000 1 CDT} + {3750649200 -21600 0 CST} + {3761539200 -18000 1 CDT} + {3782098800 -21600 0 CST} + {3792988800 -18000 1 CDT} + {3813548400 -21600 0 CST} + {3824438400 -18000 1 CDT} + {3844998000 -21600 0 CST} + {3855888000 -18000 1 CDT} + {3876447600 -21600 0 CST} + {3887337600 -18000 1 CDT} + {3907897200 -21600 0 CST} + {3919392000 -18000 1 CDT} + {3939951600 -21600 0 CST} + {3950841600 -18000 1 CDT} + {3971401200 -21600 0 CST} + {3982291200 -18000 1 CDT} + {4002850800 -21600 0 CST} + {4013740800 -18000 1 CDT} + {4034300400 -21600 0 CST} + {4045190400 -18000 1 CDT} + {4065750000 -21600 0 CST} + {4076640000 -18000 1 CDT} + {4097199600 -21600 0 CST} +} diff --git a/env/tcl/tcl8.6/tzdata/America/Rankin_Inlet b/env/tcl/tcl8.6/tzdata/America/Rankin_Inlet new file mode 100644 index 0000000..9ce9f8d --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/America/Rankin_Inlet @@ -0,0 +1,248 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:America/Rankin_Inlet) { + {-9223372036854775808 0 0 -00} + {-410227200 -21600 0 CST} + {-147895200 -14400 1 CDDT} + {-131565600 -21600 0 CST} + {325670400 -18000 1 CDT} + {341391600 -21600 0 CST} + {357120000 -18000 1 CDT} + {372841200 -21600 0 CST} + {388569600 -18000 1 CDT} + {404895600 -21600 0 CST} + {420019200 -18000 1 CDT} + {436345200 -21600 0 CST} + {452073600 -18000 1 CDT} + {467794800 -21600 0 CST} + {483523200 -18000 1 CDT} + {499244400 -21600 0 CST} + {514972800 -18000 1 CDT} + {530694000 -21600 0 CST} + {544608000 -18000 1 CDT} + {562143600 -21600 0 CST} + {576057600 -18000 1 CDT} + {594198000 -21600 0 CST} + {607507200 -18000 1 CDT} + {625647600 -21600 0 CST} + {638956800 -18000 1 CDT} + {657097200 -21600 0 CST} + {671011200 -18000 1 CDT} + {688546800 -21600 0 CST} + {702460800 -18000 1 CDT} + {719996400 -21600 0 CST} + {733910400 -18000 1 CDT} + {752050800 -21600 0 CST} + {765360000 -18000 1 CDT} + {783500400 -21600 0 CST} + {796809600 -18000 1 CDT} + {814950000 -21600 0 CST} + {828864000 -18000 1 CDT} + {846399600 -21600 0 CST} + {860313600 -18000 1 CDT} + {877849200 -21600 0 CST} + {891763200 -18000 1 CDT} + {909298800 -21600 0 CST} + {923212800 -18000 1 CDT} + {941353200 -21600 0 CST} + {954662400 -18000 1 CDT} + {972806400 -18000 0 EST} + {986112000 -18000 0 CDT} + {1004252400 -21600 0 CST} + {1018166400 -18000 1 CDT} + {1035702000 -21600 0 CST} + {1049616000 -18000 1 CDT} + {1067151600 -21600 0 CST} + {1081065600 -18000 1 CDT} + {1099206000 -21600 0 CST} + {1112515200 -18000 1 CDT} + {1130655600 -21600 0 CST} + {1143964800 -18000 1 CDT} + {1162105200 -21600 0 CST} + {1173600000 -18000 1 CDT} + {1194159600 -21600 0 CST} + {1205049600 -18000 1 CDT} + {1225609200 -21600 0 CST} + {1236499200 -18000 1 CDT} + {1257058800 -21600 0 CST} + {1268553600 -18000 1 CDT} + {1289113200 -21600 0 CST} + {1300003200 -18000 1 CDT} + {1320562800 -21600 0 CST} + {1331452800 -18000 1 CDT} + {1352012400 -21600 0 CST} + {1362902400 -18000 1 CDT} + {1383462000 -21600 0 CST} + {1394352000 -18000 1 CDT} + {1414911600 -21600 0 CST} + {1425801600 -18000 1 CDT} + {1446361200 -21600 0 CST} + {1457856000 -18000 1 CDT} + {1478415600 -21600 0 CST} + {1489305600 -18000 1 CDT} + {1509865200 -21600 0 CST} + {1520755200 -18000 1 CDT} + {1541314800 -21600 0 CST} + {1552204800 -18000 1 CDT} + {1572764400 -21600 0 CST} + {1583654400 -18000 1 CDT} + {1604214000 -21600 0 CST} + {1615708800 -18000 1 CDT} + {1636268400 -21600 0 CST} + {1647158400 -18000 1 CDT} + {1667718000 -21600 0 CST} + {1678608000 -18000 1 CDT} + {1699167600 -21600 0 CST} + {1710057600 -18000 1 CDT} + {1730617200 -21600 0 CST} + {1741507200 -18000 1 CDT} + {1762066800 -21600 0 CST} + {1772956800 -18000 1 CDT} + {1793516400 -21600 0 CST} + {1805011200 -18000 1 CDT} + {1825570800 -21600 0 CST} + {1836460800 -18000 1 CDT} + {1857020400 -21600 0 CST} + {1867910400 -18000 1 CDT} + {1888470000 -21600 0 CST} + {1899360000 -18000 1 CDT} + {1919919600 -21600 0 CST} + {1930809600 -18000 1 CDT} + {1951369200 -21600 0 CST} + {1962864000 -18000 1 CDT} + {1983423600 -21600 0 CST} + {1994313600 -18000 1 CDT} + {2014873200 -21600 0 CST} + {2025763200 -18000 1 CDT} + {2046322800 -21600 0 CST} + {2057212800 -18000 1 CDT} + {2077772400 -21600 0 CST} + {2088662400 -18000 1 CDT} + {2109222000 -21600 0 CST} + {2120112000 -18000 1 CDT} + {2140671600 -21600 0 CST} + {2152166400 -18000 1 CDT} + {2172726000 -21600 0 CST} + {2183616000 -18000 1 CDT} + {2204175600 -21600 0 CST} + {2215065600 -18000 1 CDT} + {2235625200 -21600 0 CST} + {2246515200 -18000 1 CDT} + {2267074800 -21600 0 CST} + {2277964800 -18000 1 CDT} + {2298524400 -21600 0 CST} + {2309414400 -18000 1 CDT} + {2329974000 -21600 0 CST} + {2341468800 -18000 1 CDT} + {2362028400 -21600 0 CST} + {2372918400 -18000 1 CDT} + {2393478000 -21600 0 CST} + {2404368000 -18000 1 CDT} + {2424927600 -21600 0 CST} + {2435817600 -18000 1 CDT} + {2456377200 -21600 0 CST} + {2467267200 -18000 1 CDT} + {2487826800 -21600 0 CST} + {2499321600 -18000 1 CDT} + {2519881200 -21600 0 CST} + {2530771200 -18000 1 CDT} + {2551330800 -21600 0 CST} + {2562220800 -18000 1 CDT} + {2582780400 -21600 0 CST} + {2593670400 -18000 1 CDT} + {2614230000 -21600 0 CST} + {2625120000 -18000 1 CDT} + {2645679600 -21600 0 CST} + {2656569600 -18000 1 CDT} + {2677129200 -21600 0 CST} + {2688624000 -18000 1 CDT} + {2709183600 -21600 0 CST} + {2720073600 -18000 1 CDT} + {2740633200 -21600 0 CST} + {2751523200 -18000 1 CDT} + {2772082800 -21600 0 CST} + {2782972800 -18000 1 CDT} + {2803532400 -21600 0 CST} + {2814422400 -18000 1 CDT} + {2834982000 -21600 0 CST} + {2846476800 -18000 1 CDT} + {2867036400 -21600 0 CST} + {2877926400 -18000 1 CDT} + {2898486000 -21600 0 CST} + {2909376000 -18000 1 CDT} + {2929935600 -21600 0 CST} + {2940825600 -18000 1 CDT} + {2961385200 -21600 0 CST} + {2972275200 -18000 1 CDT} + {2992834800 -21600 0 CST} + {3003724800 -18000 1 CDT} + {3024284400 -21600 0 CST} + {3035779200 -18000 1 CDT} + {3056338800 -21600 0 CST} + {3067228800 -18000 1 CDT} + {3087788400 -21600 0 CST} + {3098678400 -18000 1 CDT} + {3119238000 -21600 0 CST} + {3130128000 -18000 1 CDT} + {3150687600 -21600 0 CST} + {3161577600 -18000 1 CDT} + {3182137200 -21600 0 CST} + {3193027200 -18000 1 CDT} + {3213586800 -21600 0 CST} + {3225081600 -18000 1 CDT} + {3245641200 -21600 0 CST} + {3256531200 -18000 1 CDT} + {3277090800 -21600 0 CST} + {3287980800 -18000 1 CDT} + {3308540400 -21600 0 CST} + {3319430400 -18000 1 CDT} + {3339990000 -21600 0 CST} + {3350880000 -18000 1 CDT} + {3371439600 -21600 0 CST} + {3382934400 -18000 1 CDT} + {3403494000 -21600 0 CST} + {3414384000 -18000 1 CDT} + {3434943600 -21600 0 CST} + {3445833600 -18000 1 CDT} + {3466393200 -21600 0 CST} + {3477283200 -18000 1 CDT} + {3497842800 -21600 0 CST} + {3508732800 -18000 1 CDT} + {3529292400 -21600 0 CST} + {3540182400 -18000 1 CDT} + {3560742000 -21600 0 CST} + {3572236800 -18000 1 CDT} + {3592796400 -21600 0 CST} + {3603686400 -18000 1 CDT} + {3624246000 -21600 0 CST} + {3635136000 -18000 1 CDT} + {3655695600 -21600 0 CST} + {3666585600 -18000 1 CDT} + {3687145200 -21600 0 CST} + {3698035200 -18000 1 CDT} + {3718594800 -21600 0 CST} + {3730089600 -18000 1 CDT} + {3750649200 -21600 0 CST} + {3761539200 -18000 1 CDT} + {3782098800 -21600 0 CST} + {3792988800 -18000 1 CDT} + {3813548400 -21600 0 CST} + {3824438400 -18000 1 CDT} + {3844998000 -21600 0 CST} + {3855888000 -18000 1 CDT} + {3876447600 -21600 0 CST} + {3887337600 -18000 1 CDT} + {3907897200 -21600 0 CST} + {3919392000 -18000 1 CDT} + {3939951600 -21600 0 CST} + {3950841600 -18000 1 CDT} + {3971401200 -21600 0 CST} + {3982291200 -18000 1 CDT} + {4002850800 -21600 0 CST} + {4013740800 -18000 1 CDT} + {4034300400 -21600 0 CST} + {4045190400 -18000 1 CDT} + {4065750000 -21600 0 CST} + {4076640000 -18000 1 CDT} + {4097199600 -21600 0 CST} +} diff --git a/env/tcl/tcl8.6/tzdata/America/Recife b/env/tcl/tcl8.6/tzdata/America/Recife new file mode 100644 index 0000000..db0a445 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/America/Recife @@ -0,0 +1,48 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:America/Recife) { + {-9223372036854775808 -8376 0 LMT} + {-1767217224 -10800 0 -03} + {-1206957600 -7200 1 -03} + {-1191362400 -10800 0 -03} + {-1175374800 -7200 1 -03} + {-1159826400 -10800 0 -03} + {-633819600 -7200 1 -03} + {-622069200 -10800 0 -03} + {-602283600 -7200 1 -03} + {-591832800 -10800 0 -03} + {-570747600 -7200 1 -03} + {-560210400 -10800 0 -03} + {-539125200 -7200 1 -03} + {-531352800 -10800 0 -03} + {-191365200 -7200 1 -03} + {-184197600 -10800 0 -03} + {-155163600 -7200 1 -03} + {-150069600 -10800 0 -03} + {-128898000 -7200 1 -03} + {-121125600 -10800 0 -03} + {-99954000 -7200 1 -03} + {-89589600 -10800 0 -03} + {-68418000 -7200 1 -03} + {-57967200 -10800 0 -03} + {499748400 -7200 1 -03} + {511236000 -10800 0 -03} + {530593200 -7200 1 -03} + {540266400 -10800 0 -03} + {562129200 -7200 1 -03} + {571197600 -10800 0 -03} + {592974000 -7200 1 -03} + {602042400 -10800 0 -03} + {624423600 -7200 1 -03} + {634701600 -10800 0 -03} + {653536800 -10800 0 -03} + {938660400 -10800 0 -03} + {938919600 -7200 1 -03} + {951616800 -10800 0 -03} + {970974000 -7200 1 -03} + {971575200 -10800 0 -03} + {1000350000 -10800 0 -03} + {1003028400 -7200 1 -03} + {1013911200 -10800 0 -03} + {1033437600 -10800 0 -03} +} diff --git a/env/tcl/tcl8.6/tzdata/America/Regina b/env/tcl/tcl8.6/tzdata/America/Regina new file mode 100644 index 0000000..e42b5be --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/America/Regina @@ -0,0 +1,58 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:America/Regina) { + {-9223372036854775808 -25116 0 LMT} + {-2030202084 -25200 0 MST} + {-1632063600 -21600 1 MDT} + {-1615132800 -25200 0 MST} + {-1251651600 -21600 1 MDT} + {-1238349600 -25200 0 MST} + {-1220202000 -21600 1 MDT} + {-1206900000 -25200 0 MST} + {-1188752400 -21600 1 MDT} + {-1175450400 -25200 0 MST} + {-1156698000 -21600 1 MDT} + {-1144000800 -25200 0 MST} + {-1125248400 -21600 1 MDT} + {-1111946400 -25200 0 MST} + {-1032714000 -21600 1 MDT} + {-1016992800 -25200 0 MST} + {-1001264400 -21600 1 MDT} + {-986148000 -25200 0 MST} + {-969814800 -21600 1 MDT} + {-954093600 -25200 0 MST} + {-937760400 -21600 1 MDT} + {-922039200 -25200 0 MST} + {-906310800 -21600 1 MDT} + {-890589600 -25200 0 MST} + {-880210800 -21600 1 MWT} + {-769395600 -21600 1 MPT} + {-765388800 -25200 0 MST} + {-748450800 -21600 1 MDT} + {-732729600 -25200 0 MST} + {-715791600 -21600 1 MDT} + {-702489600 -25200 0 MST} + {-684342000 -21600 1 MDT} + {-671040000 -25200 0 MST} + {-652892400 -21600 1 MDT} + {-639590400 -25200 0 MST} + {-620838000 -21600 1 MDT} + {-608140800 -25200 0 MST} + {-589388400 -21600 1 MDT} + {-576086400 -25200 0 MST} + {-557938800 -21600 1 MDT} + {-544636800 -25200 0 MST} + {-526489200 -21600 1 MDT} + {-513187200 -25200 0 MST} + {-495039600 -21600 1 MDT} + {-481737600 -25200 0 MST} + {-463590000 -21600 1 MDT} + {-450288000 -25200 0 MST} + {-431535600 -21600 1 MDT} + {-418233600 -25200 0 MST} + {-400086000 -21600 1 MDT} + {-386784000 -25200 0 MST} + {-337186800 -21600 1 MDT} + {-321465600 -25200 0 MST} + {-305737200 -21600 0 CST} +} diff --git a/env/tcl/tcl8.6/tzdata/America/Resolute b/env/tcl/tcl8.6/tzdata/America/Resolute new file mode 100644 index 0000000..a9881b4 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/America/Resolute @@ -0,0 +1,248 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:America/Resolute) { + {-9223372036854775808 0 0 -00} + {-704937600 -21600 0 CST} + {-147895200 -14400 1 CDDT} + {-131565600 -21600 0 CST} + {325670400 -18000 1 CDT} + {341391600 -21600 0 CST} + {357120000 -18000 1 CDT} + {372841200 -21600 0 CST} + {388569600 -18000 1 CDT} + {404895600 -21600 0 CST} + {420019200 -18000 1 CDT} + {436345200 -21600 0 CST} + {452073600 -18000 1 CDT} + {467794800 -21600 0 CST} + {483523200 -18000 1 CDT} + {499244400 -21600 0 CST} + {514972800 -18000 1 CDT} + {530694000 -21600 0 CST} + {544608000 -18000 1 CDT} + {562143600 -21600 0 CST} + {576057600 -18000 1 CDT} + {594198000 -21600 0 CST} + {607507200 -18000 1 CDT} + {625647600 -21600 0 CST} + {638956800 -18000 1 CDT} + {657097200 -21600 0 CST} + {671011200 -18000 1 CDT} + {688546800 -21600 0 CST} + {702460800 -18000 1 CDT} + {719996400 -21600 0 CST} + {733910400 -18000 1 CDT} + {752050800 -21600 0 CST} + {765360000 -18000 1 CDT} + {783500400 -21600 0 CST} + {796809600 -18000 1 CDT} + {814950000 -21600 0 CST} + {828864000 -18000 1 CDT} + {846399600 -21600 0 CST} + {860313600 -18000 1 CDT} + {877849200 -21600 0 CST} + {891763200 -18000 1 CDT} + {909298800 -21600 0 CST} + {923212800 -18000 1 CDT} + {941353200 -21600 0 CST} + {954662400 -18000 1 CDT} + {972806400 -18000 0 EST} + {986112000 -18000 0 CDT} + {1004252400 -21600 0 CST} + {1018166400 -18000 1 CDT} + {1035702000 -21600 0 CST} + {1049616000 -18000 1 CDT} + {1067151600 -21600 0 CST} + {1081065600 -18000 1 CDT} + {1099206000 -21600 0 CST} + {1112515200 -18000 1 CDT} + {1130655600 -21600 0 CST} + {1143964800 -18000 1 CDT} + {1162108800 -18000 0 EST} + {1173600000 -18000 0 CDT} + {1194159600 -21600 0 CST} + {1205049600 -18000 1 CDT} + {1225609200 -21600 0 CST} + {1236499200 -18000 1 CDT} + {1257058800 -21600 0 CST} + {1268553600 -18000 1 CDT} + {1289113200 -21600 0 CST} + {1300003200 -18000 1 CDT} + {1320562800 -21600 0 CST} + {1331452800 -18000 1 CDT} + {1352012400 -21600 0 CST} + {1362902400 -18000 1 CDT} + {1383462000 -21600 0 CST} + {1394352000 -18000 1 CDT} + {1414911600 -21600 0 CST} + {1425801600 -18000 1 CDT} + {1446361200 -21600 0 CST} + {1457856000 -18000 1 CDT} + {1478415600 -21600 0 CST} + {1489305600 -18000 1 CDT} + {1509865200 -21600 0 CST} + {1520755200 -18000 1 CDT} + {1541314800 -21600 0 CST} + {1552204800 -18000 1 CDT} + {1572764400 -21600 0 CST} + {1583654400 -18000 1 CDT} + {1604214000 -21600 0 CST} + {1615708800 -18000 1 CDT} + {1636268400 -21600 0 CST} + {1647158400 -18000 1 CDT} + {1667718000 -21600 0 CST} + {1678608000 -18000 1 CDT} + {1699167600 -21600 0 CST} + {1710057600 -18000 1 CDT} + {1730617200 -21600 0 CST} + {1741507200 -18000 1 CDT} + {1762066800 -21600 0 CST} + {1772956800 -18000 1 CDT} + {1793516400 -21600 0 CST} + {1805011200 -18000 1 CDT} + {1825570800 -21600 0 CST} + {1836460800 -18000 1 CDT} + {1857020400 -21600 0 CST} + {1867910400 -18000 1 CDT} + {1888470000 -21600 0 CST} + {1899360000 -18000 1 CDT} + {1919919600 -21600 0 CST} + {1930809600 -18000 1 CDT} + {1951369200 -21600 0 CST} + {1962864000 -18000 1 CDT} + {1983423600 -21600 0 CST} + {1994313600 -18000 1 CDT} + {2014873200 -21600 0 CST} + {2025763200 -18000 1 CDT} + {2046322800 -21600 0 CST} + {2057212800 -18000 1 CDT} + {2077772400 -21600 0 CST} + {2088662400 -18000 1 CDT} + {2109222000 -21600 0 CST} + {2120112000 -18000 1 CDT} + {2140671600 -21600 0 CST} + {2152166400 -18000 1 CDT} + {2172726000 -21600 0 CST} + {2183616000 -18000 1 CDT} + {2204175600 -21600 0 CST} + {2215065600 -18000 1 CDT} + {2235625200 -21600 0 CST} + {2246515200 -18000 1 CDT} + {2267074800 -21600 0 CST} + {2277964800 -18000 1 CDT} + {2298524400 -21600 0 CST} + {2309414400 -18000 1 CDT} + {2329974000 -21600 0 CST} + {2341468800 -18000 1 CDT} + {2362028400 -21600 0 CST} + {2372918400 -18000 1 CDT} + {2393478000 -21600 0 CST} + {2404368000 -18000 1 CDT} + {2424927600 -21600 0 CST} + {2435817600 -18000 1 CDT} + {2456377200 -21600 0 CST} + {2467267200 -18000 1 CDT} + {2487826800 -21600 0 CST} + {2499321600 -18000 1 CDT} + {2519881200 -21600 0 CST} + {2530771200 -18000 1 CDT} + {2551330800 -21600 0 CST} + {2562220800 -18000 1 CDT} + {2582780400 -21600 0 CST} + {2593670400 -18000 1 CDT} + {2614230000 -21600 0 CST} + {2625120000 -18000 1 CDT} + {2645679600 -21600 0 CST} + {2656569600 -18000 1 CDT} + {2677129200 -21600 0 CST} + {2688624000 -18000 1 CDT} + {2709183600 -21600 0 CST} + {2720073600 -18000 1 CDT} + {2740633200 -21600 0 CST} + {2751523200 -18000 1 CDT} + {2772082800 -21600 0 CST} + {2782972800 -18000 1 CDT} + {2803532400 -21600 0 CST} + {2814422400 -18000 1 CDT} + {2834982000 -21600 0 CST} + {2846476800 -18000 1 CDT} + {2867036400 -21600 0 CST} + {2877926400 -18000 1 CDT} + {2898486000 -21600 0 CST} + {2909376000 -18000 1 CDT} + {2929935600 -21600 0 CST} + {2940825600 -18000 1 CDT} + {2961385200 -21600 0 CST} + {2972275200 -18000 1 CDT} + {2992834800 -21600 0 CST} + {3003724800 -18000 1 CDT} + {3024284400 -21600 0 CST} + {3035779200 -18000 1 CDT} + {3056338800 -21600 0 CST} + {3067228800 -18000 1 CDT} + {3087788400 -21600 0 CST} + {3098678400 -18000 1 CDT} + {3119238000 -21600 0 CST} + {3130128000 -18000 1 CDT} + {3150687600 -21600 0 CST} + {3161577600 -18000 1 CDT} + {3182137200 -21600 0 CST} + {3193027200 -18000 1 CDT} + {3213586800 -21600 0 CST} + {3225081600 -18000 1 CDT} + {3245641200 -21600 0 CST} + {3256531200 -18000 1 CDT} + {3277090800 -21600 0 CST} + {3287980800 -18000 1 CDT} + {3308540400 -21600 0 CST} + {3319430400 -18000 1 CDT} + {3339990000 -21600 0 CST} + {3350880000 -18000 1 CDT} + {3371439600 -21600 0 CST} + {3382934400 -18000 1 CDT} + {3403494000 -21600 0 CST} + {3414384000 -18000 1 CDT} + {3434943600 -21600 0 CST} + {3445833600 -18000 1 CDT} + {3466393200 -21600 0 CST} + {3477283200 -18000 1 CDT} + {3497842800 -21600 0 CST} + {3508732800 -18000 1 CDT} + {3529292400 -21600 0 CST} + {3540182400 -18000 1 CDT} + {3560742000 -21600 0 CST} + {3572236800 -18000 1 CDT} + {3592796400 -21600 0 CST} + {3603686400 -18000 1 CDT} + {3624246000 -21600 0 CST} + {3635136000 -18000 1 CDT} + {3655695600 -21600 0 CST} + {3666585600 -18000 1 CDT} + {3687145200 -21600 0 CST} + {3698035200 -18000 1 CDT} + {3718594800 -21600 0 CST} + {3730089600 -18000 1 CDT} + {3750649200 -21600 0 CST} + {3761539200 -18000 1 CDT} + {3782098800 -21600 0 CST} + {3792988800 -18000 1 CDT} + {3813548400 -21600 0 CST} + {3824438400 -18000 1 CDT} + {3844998000 -21600 0 CST} + {3855888000 -18000 1 CDT} + {3876447600 -21600 0 CST} + {3887337600 -18000 1 CDT} + {3907897200 -21600 0 CST} + {3919392000 -18000 1 CDT} + {3939951600 -21600 0 CST} + {3950841600 -18000 1 CDT} + {3971401200 -21600 0 CST} + {3982291200 -18000 1 CDT} + {4002850800 -21600 0 CST} + {4013740800 -18000 1 CDT} + {4034300400 -21600 0 CST} + {4045190400 -18000 1 CDT} + {4065750000 -21600 0 CST} + {4076640000 -18000 1 CDT} + {4097199600 -21600 0 CST} +} diff --git a/env/tcl/tcl8.6/tzdata/America/Rio_Branco b/env/tcl/tcl8.6/tzdata/America/Rio_Branco new file mode 100644 index 0000000..088800b --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/America/Rio_Branco @@ -0,0 +1,37 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:America/Rio_Branco) { + {-9223372036854775808 -16272 0 LMT} + {-1767209328 -18000 0 -05} + {-1206950400 -14400 1 -05} + {-1191355200 -18000 0 -05} + {-1175367600 -14400 1 -05} + {-1159819200 -18000 0 -05} + {-633812400 -14400 1 -05} + {-622062000 -18000 0 -05} + {-602276400 -14400 1 -05} + {-591825600 -18000 0 -05} + {-570740400 -14400 1 -05} + {-560203200 -18000 0 -05} + {-539118000 -14400 1 -05} + {-531345600 -18000 0 -05} + {-191358000 -14400 1 -05} + {-184190400 -18000 0 -05} + {-155156400 -14400 1 -05} + {-150062400 -18000 0 -05} + {-128890800 -14400 1 -05} + {-121118400 -18000 0 -05} + {-99946800 -14400 1 -05} + {-89582400 -18000 0 -05} + {-68410800 -14400 1 -05} + {-57960000 -18000 0 -05} + {499755600 -14400 1 -05} + {511243200 -18000 0 -05} + {530600400 -14400 1 -05} + {540273600 -18000 0 -05} + {562136400 -14400 1 -05} + {571204800 -18000 0 -05} + {590040000 -18000 0 -05} + {1214283600 -14400 0 -04} + {1384056000 -18000 0 -05} +} diff --git a/env/tcl/tcl8.6/tzdata/America/Rosario b/env/tcl/tcl8.6/tzdata/America/Rosario new file mode 100644 index 0000000..6687f88 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/America/Rosario @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(America/Argentina/Cordoba)]} { + LoadTimeZoneFile America/Argentina/Cordoba +} +set TZData(:America/Rosario) $TZData(:America/Argentina/Cordoba) diff --git a/env/tcl/tcl8.6/tzdata/America/Santa_Isabel b/env/tcl/tcl8.6/tzdata/America/Santa_Isabel new file mode 100644 index 0000000..a3a3b4f --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/America/Santa_Isabel @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(America/Tijuana)]} { + LoadTimeZoneFile America/Tijuana +} +set TZData(:America/Santa_Isabel) $TZData(:America/Tijuana) diff --git a/env/tcl/tcl8.6/tzdata/America/Santarem b/env/tcl/tcl8.6/tzdata/America/Santarem new file mode 100644 index 0000000..5fa3551 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/America/Santarem @@ -0,0 +1,36 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:America/Santarem) { + {-9223372036854775808 -13128 0 LMT} + {-1767212472 -14400 0 -04} + {-1206954000 -10800 1 -04} + {-1191358800 -14400 0 -04} + {-1175371200 -10800 1 -04} + {-1159822800 -14400 0 -04} + {-633816000 -10800 1 -04} + {-622065600 -14400 0 -04} + {-602280000 -10800 1 -04} + {-591829200 -14400 0 -04} + {-570744000 -10800 1 -04} + {-560206800 -14400 0 -04} + {-539121600 -10800 1 -04} + {-531349200 -14400 0 -04} + {-191361600 -10800 1 -04} + {-184194000 -14400 0 -04} + {-155160000 -10800 1 -04} + {-150066000 -14400 0 -04} + {-128894400 -10800 1 -04} + {-121122000 -14400 0 -04} + {-99950400 -10800 1 -04} + {-89586000 -14400 0 -04} + {-68414400 -10800 1 -04} + {-57963600 -14400 0 -04} + {499752000 -10800 1 -04} + {511239600 -14400 0 -04} + {530596800 -10800 1 -04} + {540270000 -14400 0 -04} + {562132800 -10800 1 -04} + {571201200 -14400 0 -04} + {590036400 -14400 0 -04} + {1214280000 -10800 0 -03} +} diff --git a/env/tcl/tcl8.6/tzdata/America/Santiago b/env/tcl/tcl8.6/tzdata/America/Santiago new file mode 100644 index 0000000..55212b9 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/America/Santiago @@ -0,0 +1,289 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:America/Santiago) { + {-9223372036854775808 -16966 0 LMT} + {-2524504634 -16966 0 SMT} + {-1892661434 -18000 0 -05} + {-1688410800 -16966 0 SMT} + {-1619205434 -14400 0 -04} + {-1593806400 -16966 0 SMT} + {-1335986234 -18000 0 -05} + {-1335985200 -14400 1 -05} + {-1317585600 -18000 0 -05} + {-1304362800 -14400 1 -05} + {-1286049600 -18000 0 -05} + {-1272826800 -14400 1 -05} + {-1254513600 -18000 0 -05} + {-1241290800 -14400 1 -05} + {-1222977600 -18000 0 -05} + {-1209754800 -14400 1 -05} + {-1191355200 -18000 0 -05} + {-1178132400 -14400 0 -04} + {-870552000 -18000 0 -05} + {-865278000 -14400 0 -04} + {-740520000 -10800 1 -03} + {-736376400 -14400 0 -04} + {-718056000 -18000 0 -05} + {-713649600 -14400 0 -04} + {-36619200 -10800 1 -04} + {-23922000 -14400 0 -04} + {-3355200 -10800 1 -04} + {7527600 -14400 0 -04} + {24465600 -10800 1 -04} + {37767600 -14400 0 -04} + {55915200 -10800 1 -04} + {69217200 -14400 0 -04} + {87969600 -10800 1 -04} + {100666800 -14400 0 -04} + {118209600 -10800 1 -04} + {132116400 -14400 0 -04} + {150868800 -10800 1 -04} + {163566000 -14400 0 -04} + {182318400 -10800 1 -04} + {195620400 -14400 0 -04} + {213768000 -10800 1 -04} + {227070000 -14400 0 -04} + {245217600 -10800 1 -04} + {258519600 -14400 0 -04} + {277272000 -10800 1 -04} + {289969200 -14400 0 -04} + {308721600 -10800 1 -04} + {321418800 -14400 0 -04} + {340171200 -10800 1 -04} + {353473200 -14400 0 -04} + {371620800 -10800 1 -04} + {384922800 -14400 0 -04} + {403070400 -10800 1 -04} + {416372400 -14400 0 -04} + {434520000 -10800 1 -04} + {447822000 -14400 0 -04} + {466574400 -10800 1 -04} + {479271600 -14400 0 -04} + {498024000 -10800 1 -04} + {510721200 -14400 0 -04} + {529473600 -10800 1 -04} + {545194800 -14400 0 -04} + {560923200 -10800 1 -04} + {574225200 -14400 0 -04} + {592372800 -10800 1 -04} + {605674800 -14400 0 -04} + {624427200 -10800 1 -04} + {637124400 -14400 0 -04} + {653457600 -10800 1 -04} + {668574000 -14400 0 -04} + {687326400 -10800 1 -04} + {700628400 -14400 0 -04} + {718776000 -10800 1 -04} + {732078000 -14400 0 -04} + {750225600 -10800 1 -04} + {763527600 -14400 0 -04} + {781675200 -10800 1 -04} + {794977200 -14400 0 -04} + {813729600 -10800 1 -04} + {826426800 -14400 0 -04} + {845179200 -10800 1 -04} + {859690800 -14400 0 -04} + {876628800 -10800 1 -04} + {889930800 -14400 0 -04} + {906868800 -10800 1 -04} + {923194800 -14400 0 -04} + {939528000 -10800 1 -04} + {952830000 -14400 0 -04} + {971582400 -10800 1 -04} + {984279600 -14400 0 -04} + {1003032000 -10800 1 -04} + {1015729200 -14400 0 -04} + {1034481600 -10800 1 -04} + {1047178800 -14400 0 -04} + {1065931200 -10800 1 -04} + {1079233200 -14400 0 -04} + {1097380800 -10800 1 -04} + {1110682800 -14400 0 -04} + {1128830400 -10800 1 -04} + {1142132400 -14400 0 -04} + {1160884800 -10800 1 -04} + {1173582000 -14400 0 -04} + {1192334400 -10800 1 -04} + {1206846000 -14400 0 -04} + {1223784000 -10800 1 -04} + {1237086000 -14400 0 -04} + {1255233600 -10800 1 -04} + {1270350000 -14400 0 -04} + {1286683200 -10800 1 -04} + {1304823600 -14400 0 -04} + {1313899200 -10800 1 -04} + {1335668400 -14400 0 -04} + {1346558400 -10800 1 -04} + {1367118000 -14400 0 -04} + {1378612800 -10800 1 -04} + {1398567600 -14400 0 -04} + {1410062400 -10800 1 -04} + {1463281200 -14400 0 -04} + {1471147200 -10800 1 -04} + {1494730800 -14400 0 -04} + {1502596800 -10800 1 -04} + {1526180400 -14400 0 -04} + {1534046400 -10800 1 -04} + {1554606000 -14400 0 -04} + {1567915200 -10800 1 -04} + {1586055600 -14400 0 -04} + {1599364800 -10800 1 -04} + {1617505200 -14400 0 -04} + {1630814400 -10800 1 -04} + {1648954800 -14400 0 -04} + {1662264000 -10800 1 -04} + {1680404400 -14400 0 -04} + {1693713600 -10800 1 -04} + {1712458800 -14400 0 -04} + {1725768000 -10800 1 -04} + {1743908400 -14400 0 -04} + {1757217600 -10800 1 -04} + {1775358000 -14400 0 -04} + {1788667200 -10800 1 -04} + {1806807600 -14400 0 -04} + {1820116800 -10800 1 -04} + {1838257200 -14400 0 -04} + {1851566400 -10800 1 -04} + {1870311600 -14400 0 -04} + {1883016000 -10800 1 -04} + {1901761200 -14400 0 -04} + {1915070400 -10800 1 -04} + {1933210800 -14400 0 -04} + {1946520000 -10800 1 -04} + {1964660400 -14400 0 -04} + {1977969600 -10800 1 -04} + {1996110000 -14400 0 -04} + {2009419200 -10800 1 -04} + {2027559600 -14400 0 -04} + {2040868800 -10800 1 -04} + {2059614000 -14400 0 -04} + {2072318400 -10800 1 -04} + {2091063600 -14400 0 -04} + {2104372800 -10800 1 -04} + {2122513200 -14400 0 -04} + {2135822400 -10800 1 -04} + {2153962800 -14400 0 -04} + {2167272000 -10800 1 -04} + {2185412400 -14400 0 -04} + {2198721600 -10800 1 -04} + {2217466800 -14400 0 -04} + {2230171200 -10800 1 -04} + {2248916400 -14400 0 -04} + {2262225600 -10800 1 -04} + {2280366000 -14400 0 -04} + {2293675200 -10800 1 -04} + {2311815600 -14400 0 -04} + {2325124800 -10800 1 -04} + {2343265200 -14400 0 -04} + {2356574400 -10800 1 -04} + {2374714800 -14400 0 -04} + {2388024000 -10800 1 -04} + {2406769200 -14400 0 -04} + {2419473600 -10800 1 -04} + {2438218800 -14400 0 -04} + {2451528000 -10800 1 -04} + {2469668400 -14400 0 -04} + {2482977600 -10800 1 -04} + {2501118000 -14400 0 -04} + {2514427200 -10800 1 -04} + {2532567600 -14400 0 -04} + {2545876800 -10800 1 -04} + {2564017200 -14400 0 -04} + {2577326400 -10800 1 -04} + {2596071600 -14400 0 -04} + {2609380800 -10800 1 -04} + {2627521200 -14400 0 -04} + {2640830400 -10800 1 -04} + {2658970800 -14400 0 -04} + {2672280000 -10800 1 -04} + {2690420400 -14400 0 -04} + {2703729600 -10800 1 -04} + {2721870000 -14400 0 -04} + {2735179200 -10800 1 -04} + {2753924400 -14400 0 -04} + {2766628800 -10800 1 -04} + {2785374000 -14400 0 -04} + {2798683200 -10800 1 -04} + {2816823600 -14400 0 -04} + {2830132800 -10800 1 -04} + {2848273200 -14400 0 -04} + {2861582400 -10800 1 -04} + {2879722800 -14400 0 -04} + {2893032000 -10800 1 -04} + {2911172400 -14400 0 -04} + {2924481600 -10800 1 -04} + {2943226800 -14400 0 -04} + {2955931200 -10800 1 -04} + {2974676400 -14400 0 -04} + {2987985600 -10800 1 -04} + {3006126000 -14400 0 -04} + {3019435200 -10800 1 -04} + {3037575600 -14400 0 -04} + {3050884800 -10800 1 -04} + {3069025200 -14400 0 -04} + {3082334400 -10800 1 -04} + {3101079600 -14400 0 -04} + {3113784000 -10800 1 -04} + {3132529200 -14400 0 -04} + {3145838400 -10800 1 -04} + {3163978800 -14400 0 -04} + {3177288000 -10800 1 -04} + {3195428400 -14400 0 -04} + {3208737600 -10800 1 -04} + {3226878000 -14400 0 -04} + {3240187200 -10800 1 -04} + {3258327600 -14400 0 -04} + {3271636800 -10800 1 -04} + {3290382000 -14400 0 -04} + {3303086400 -10800 1 -04} + {3321831600 -14400 0 -04} + {3335140800 -10800 1 -04} + {3353281200 -14400 0 -04} + {3366590400 -10800 1 -04} + {3384730800 -14400 0 -04} + {3398040000 -10800 1 -04} + {3416180400 -14400 0 -04} + {3429489600 -10800 1 -04} + {3447630000 -14400 0 -04} + {3460939200 -10800 1 -04} + {3479684400 -14400 0 -04} + {3492993600 -10800 1 -04} + {3511134000 -14400 0 -04} + {3524443200 -10800 1 -04} + {3542583600 -14400 0 -04} + {3555892800 -10800 1 -04} + {3574033200 -14400 0 -04} + {3587342400 -10800 1 -04} + {3605482800 -14400 0 -04} + {3618792000 -10800 1 -04} + {3637537200 -14400 0 -04} + {3650241600 -10800 1 -04} + {3668986800 -14400 0 -04} + {3682296000 -10800 1 -04} + {3700436400 -14400 0 -04} + {3713745600 -10800 1 -04} + {3731886000 -14400 0 -04} + {3745195200 -10800 1 -04} + {3763335600 -14400 0 -04} + {3776644800 -10800 1 -04} + {3794785200 -14400 0 -04} + {3808094400 -10800 1 -04} + {3826839600 -14400 0 -04} + {3839544000 -10800 1 -04} + {3858289200 -14400 0 -04} + {3871598400 -10800 1 -04} + {3889738800 -14400 0 -04} + {3903048000 -10800 1 -04} + {3921188400 -14400 0 -04} + {3934497600 -10800 1 -04} + {3952638000 -14400 0 -04} + {3965947200 -10800 1 -04} + {3984692400 -14400 0 -04} + {3997396800 -10800 1 -04} + {4016142000 -14400 0 -04} + {4029451200 -10800 1 -04} + {4047591600 -14400 0 -04} + {4060900800 -10800 1 -04} + {4079041200 -14400 0 -04} + {4092350400 -10800 1 -04} +} diff --git a/env/tcl/tcl8.6/tzdata/America/Santo_Domingo b/env/tcl/tcl8.6/tzdata/America/Santo_Domingo new file mode 100644 index 0000000..28d3a9c --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/America/Santo_Domingo @@ -0,0 +1,21 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:America/Santo_Domingo) { + {-9223372036854775808 -16776 0 LMT} + {-2524504824 -16800 0 SDMT} + {-1159773600 -18000 0 EST} + {-100119600 -14400 1 EDT} + {-89668800 -18000 0 EST} + {-5770800 -16200 1 -0430} + {4422600 -18000 0 EST} + {25678800 -16200 1 -0430} + {33193800 -18000 0 EST} + {57733200 -16200 1 -0430} + {64816200 -18000 0 EST} + {89182800 -16200 1 -0430} + {96438600 -18000 0 EST} + {120632400 -16200 1 -0430} + {127974600 -18000 0 EST} + {152082000 -14400 0 AST} + {975823200 -14400 0 AST} +} diff --git a/env/tcl/tcl8.6/tzdata/America/Sao_Paulo b/env/tcl/tcl8.6/tzdata/America/Sao_Paulo new file mode 100644 index 0000000..235f57a --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/America/Sao_Paulo @@ -0,0 +1,258 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:America/Sao_Paulo) { + {-9223372036854775808 -11188 0 LMT} + {-1767214412 -10800 0 -03} + {-1206957600 -7200 1 -03} + {-1191362400 -10800 0 -03} + {-1175374800 -7200 1 -03} + {-1159826400 -10800 0 -03} + {-633819600 -7200 1 -03} + {-622069200 -10800 0 -03} + {-602283600 -7200 1 -03} + {-591832800 -10800 0 -03} + {-570747600 -7200 1 -03} + {-560210400 -10800 0 -03} + {-539125200 -7200 1 -03} + {-531352800 -10800 0 -03} + {-195429600 -7200 1 -02} + {-189381600 -7200 0 -03} + {-184197600 -10800 0 -03} + {-155163600 -7200 1 -03} + {-150069600 -10800 0 -03} + {-128898000 -7200 1 -03} + {-121125600 -10800 0 -03} + {-99954000 -7200 1 -03} + {-89589600 -10800 0 -03} + {-68418000 -7200 1 -03} + {-57967200 -10800 0 -03} + {499748400 -7200 1 -03} + {511236000 -10800 0 -03} + {530593200 -7200 1 -03} + {540266400 -10800 0 -03} + {562129200 -7200 1 -03} + {571197600 -10800 0 -03} + {592974000 -7200 1 -03} + {602042400 -10800 0 -03} + {624423600 -7200 1 -03} + {634701600 -10800 0 -03} + {656478000 -7200 1 -03} + {666756000 -10800 0 -03} + {687927600 -7200 1 -03} + {697600800 -10800 0 -03} + {719982000 -7200 1 -03} + {728445600 -10800 0 -03} + {750826800 -7200 1 -03} + {761709600 -10800 0 -03} + {782276400 -7200 1 -03} + {793159200 -10800 0 -03} + {813726000 -7200 1 -03} + {824004000 -10800 0 -03} + {844570800 -7200 1 -03} + {856058400 -10800 0 -03} + {876106800 -7200 1 -03} + {888717600 -10800 0 -03} + {908074800 -7200 1 -03} + {919562400 -10800 0 -03} + {938919600 -7200 1 -03} + {951616800 -10800 0 -03} + {970974000 -7200 1 -03} + {982461600 -10800 0 -03} + {1003028400 -7200 1 -03} + {1013911200 -10800 0 -03} + {1036292400 -7200 1 -03} + {1045360800 -10800 0 -03} + {1066532400 -7200 1 -03} + {1076810400 -10800 0 -03} + {1099364400 -7200 1 -03} + {1108864800 -10800 0 -03} + {1129431600 -7200 1 -03} + {1140314400 -10800 0 -03} + {1162695600 -7200 1 -03} + {1172368800 -10800 0 -03} + {1192330800 -7200 1 -03} + {1203213600 -10800 0 -03} + {1224385200 -7200 1 -03} + {1234663200 -10800 0 -03} + {1255834800 -7200 1 -03} + {1266717600 -10800 0 -03} + {1287284400 -7200 1 -03} + {1298167200 -10800 0 -03} + {1318734000 -7200 1 -03} + {1330221600 -10800 0 -03} + {1350788400 -7200 1 -03} + {1361066400 -10800 0 -03} + {1382238000 -7200 1 -03} + {1392516000 -10800 0 -03} + {1413687600 -7200 1 -03} + {1424570400 -10800 0 -03} + {1445137200 -7200 1 -03} + {1456020000 -10800 0 -03} + {1476586800 -7200 1 -03} + {1487469600 -10800 0 -03} + {1508036400 -7200 1 -03} + {1518919200 -10800 0 -03} + {1541300400 -7200 1 -03} + {1550368800 -10800 0 -03} + {1572750000 -7200 1 -03} + {1581818400 -10800 0 -03} + {1604199600 -7200 1 -03} + {1613872800 -10800 0 -03} + {1636254000 -7200 1 -03} + {1645322400 -10800 0 -03} + {1667703600 -7200 1 -03} + {1677376800 -10800 0 -03} + {1699153200 -7200 1 -03} + {1708221600 -10800 0 -03} + {1730602800 -7200 1 -03} + {1739671200 -10800 0 -03} + {1762052400 -7200 1 -03} + {1771725600 -10800 0 -03} + {1793502000 -7200 1 -03} + {1803175200 -10800 0 -03} + {1825556400 -7200 1 -03} + {1834624800 -10800 0 -03} + {1857006000 -7200 1 -03} + {1866074400 -10800 0 -03} + {1888455600 -7200 1 -03} + {1897524000 -10800 0 -03} + {1919905200 -7200 1 -03} + {1928973600 -10800 0 -03} + {1951354800 -7200 1 -03} + {1960423200 -10800 0 -03} + {1983409200 -7200 1 -03} + {1992477600 -10800 0 -03} + {2014858800 -7200 1 -03} + {2024532000 -10800 0 -03} + {2046308400 -7200 1 -03} + {2055376800 -10800 0 -03} + {2077758000 -7200 1 -03} + {2086826400 -10800 0 -03} + {2109207600 -7200 1 -03} + {2118880800 -10800 0 -03} + {2140657200 -7200 1 -03} + {2150330400 -10800 0 -03} + {2172711600 -7200 1 -03} + {2181780000 -10800 0 -03} + {2204161200 -7200 1 -03} + {2213229600 -10800 0 -03} + {2235610800 -7200 1 -03} + {2244679200 -10800 0 -03} + {2267060400 -7200 1 -03} + {2276128800 -10800 0 -03} + {2298510000 -7200 1 -03} + {2307578400 -10800 0 -03} + {2329959600 -7200 1 -03} + {2339632800 -10800 0 -03} + {2362014000 -7200 1 -03} + {2371082400 -10800 0 -03} + {2393463600 -7200 1 -03} + {2402532000 -10800 0 -03} + {2424913200 -7200 1 -03} + {2433981600 -10800 0 -03} + {2456362800 -7200 1 -03} + {2465431200 -10800 0 -03} + {2487812400 -7200 1 -03} + {2497485600 -10800 0 -03} + {2519866800 -7200 1 -03} + {2528935200 -10800 0 -03} + {2551316400 -7200 1 -03} + {2560384800 -10800 0 -03} + {2582766000 -7200 1 -03} + {2591834400 -10800 0 -03} + {2614215600 -7200 1 -03} + {2623284000 -10800 0 -03} + {2645665200 -7200 1 -03} + {2654733600 -10800 0 -03} + {2677114800 -7200 1 -03} + {2686788000 -10800 0 -03} + {2709169200 -7200 1 -03} + {2718237600 -10800 0 -03} + {2740618800 -7200 1 -03} + {2749687200 -10800 0 -03} + {2772068400 -7200 1 -03} + {2781136800 -10800 0 -03} + {2803518000 -7200 1 -03} + {2812586400 -10800 0 -03} + {2834967600 -7200 1 -03} + {2844036000 -10800 0 -03} + {2867022000 -7200 1 -03} + {2876090400 -10800 0 -03} + {2898471600 -7200 1 -03} + {2907540000 -10800 0 -03} + {2929921200 -7200 1 -03} + {2938989600 -10800 0 -03} + {2961370800 -7200 1 -03} + {2970439200 -10800 0 -03} + {2992820400 -7200 1 -03} + {3001888800 -10800 0 -03} + {3024270000 -7200 1 -03} + {3033943200 -10800 0 -03} + {3056324400 -7200 1 -03} + {3065392800 -10800 0 -03} + {3087774000 -7200 1 -03} + {3096842400 -10800 0 -03} + {3119223600 -7200 1 -03} + {3128292000 -10800 0 -03} + {3150673200 -7200 1 -03} + {3159741600 -10800 0 -03} + {3182122800 -7200 1 -03} + {3191191200 -10800 0 -03} + {3213572400 -7200 1 -03} + {3223245600 -10800 0 -03} + {3245626800 -7200 1 -03} + {3254695200 -10800 0 -03} + {3277076400 -7200 1 -03} + {3286144800 -10800 0 -03} + {3308526000 -7200 1 -03} + {3317594400 -10800 0 -03} + {3339975600 -7200 1 -03} + {3349044000 -10800 0 -03} + {3371425200 -7200 1 -03} + {3381098400 -10800 0 -03} + {3403479600 -7200 1 -03} + {3412548000 -10800 0 -03} + {3434929200 -7200 1 -03} + {3443997600 -10800 0 -03} + {3466378800 -7200 1 -03} + {3475447200 -10800 0 -03} + {3497828400 -7200 1 -03} + {3506896800 -10800 0 -03} + {3529278000 -7200 1 -03} + {3538346400 -10800 0 -03} + {3560727600 -7200 1 -03} + {3570400800 -10800 0 -03} + {3592782000 -7200 1 -03} + {3601850400 -10800 0 -03} + {3624231600 -7200 1 -03} + {3633300000 -10800 0 -03} + {3655681200 -7200 1 -03} + {3664749600 -10800 0 -03} + {3687130800 -7200 1 -03} + {3696199200 -10800 0 -03} + {3718580400 -7200 1 -03} + {3727648800 -10800 0 -03} + {3750634800 -7200 1 -03} + {3759703200 -10800 0 -03} + {3782084400 -7200 1 -03} + {3791152800 -10800 0 -03} + {3813534000 -7200 1 -03} + {3822602400 -10800 0 -03} + {3844983600 -7200 1 -03} + {3854052000 -10800 0 -03} + {3876433200 -7200 1 -03} + {3885501600 -10800 0 -03} + {3907882800 -7200 1 -03} + {3917556000 -10800 0 -03} + {3939937200 -7200 1 -03} + {3949005600 -10800 0 -03} + {3971386800 -7200 1 -03} + {3980455200 -10800 0 -03} + {4002836400 -7200 1 -03} + {4011904800 -10800 0 -03} + {4034286000 -7200 1 -03} + {4043354400 -10800 0 -03} + {4065735600 -7200 1 -03} + {4074804000 -10800 0 -03} + {4097185200 -7200 1 -03} +} diff --git a/env/tcl/tcl8.6/tzdata/America/Scoresbysund b/env/tcl/tcl8.6/tzdata/America/Scoresbysund new file mode 100644 index 0000000..7430635 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/America/Scoresbysund @@ -0,0 +1,246 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:America/Scoresbysund) { + {-9223372036854775808 -5272 0 LMT} + {-1686090728 -7200 0 -02} + {323841600 -3600 0 -01} + {338961600 -7200 0 -02} + {354679200 0 0 +00} + {370400400 -3600 0 -01} + {386125200 0 1 +00} + {401850000 -3600 0 -01} + {417574800 0 1 +00} + {433299600 -3600 0 -01} + {449024400 0 1 +00} + {465354000 -3600 0 -01} + {481078800 0 1 +00} + {496803600 -3600 0 -01} + {512528400 0 1 +00} + {528253200 -3600 0 -01} + {543978000 0 1 +00} + {559702800 -3600 0 -01} + {575427600 0 1 +00} + {591152400 -3600 0 -01} + {606877200 0 1 +00} + {622602000 -3600 0 -01} + {638326800 0 1 +00} + {654656400 -3600 0 -01} + {670381200 0 1 +00} + {686106000 -3600 0 -01} + {701830800 0 1 +00} + {717555600 -3600 0 -01} + {733280400 0 1 +00} + {749005200 -3600 0 -01} + {764730000 0 1 +00} + {780454800 -3600 0 -01} + {796179600 0 1 +00} + {811904400 -3600 0 -01} + {828234000 0 1 +00} + {846378000 -3600 0 -01} + {859683600 0 1 +00} + {877827600 -3600 0 -01} + {891133200 0 1 +00} + {909277200 -3600 0 -01} + {922582800 0 1 +00} + {941331600 -3600 0 -01} + {954032400 0 1 +00} + {972781200 -3600 0 -01} + {985482000 0 1 +00} + {1004230800 -3600 0 -01} + {1017536400 0 1 +00} + {1035680400 -3600 0 -01} + {1048986000 0 1 +00} + {1067130000 -3600 0 -01} + {1080435600 0 1 +00} + {1099184400 -3600 0 -01} + {1111885200 0 1 +00} + {1130634000 -3600 0 -01} + {1143334800 0 1 +00} + {1162083600 -3600 0 -01} + {1174784400 0 1 +00} + {1193533200 -3600 0 -01} + {1206838800 0 1 +00} + {1224982800 -3600 0 -01} + {1238288400 0 1 +00} + {1256432400 -3600 0 -01} + {1269738000 0 1 +00} + {1288486800 -3600 0 -01} + {1301187600 0 1 +00} + {1319936400 -3600 0 -01} + {1332637200 0 1 +00} + {1351386000 -3600 0 -01} + {1364691600 0 1 +00} + {1382835600 -3600 0 -01} + {1396141200 0 1 +00} + {1414285200 -3600 0 -01} + {1427590800 0 1 +00} + {1445734800 -3600 0 -01} + {1459040400 0 1 +00} + {1477789200 -3600 0 -01} + {1490490000 0 1 +00} + {1509238800 -3600 0 -01} + {1521939600 0 1 +00} + {1540688400 -3600 0 -01} + {1553994000 0 1 +00} + {1572138000 -3600 0 -01} + {1585443600 0 1 +00} + {1603587600 -3600 0 -01} + {1616893200 0 1 +00} + {1635642000 -3600 0 -01} + {1648342800 0 1 +00} + {1667091600 -3600 0 -01} + {1679792400 0 1 +00} + {1698541200 -3600 0 -01} + {1711846800 0 1 +00} + {1729990800 -3600 0 -01} + {1743296400 0 1 +00} + {1761440400 -3600 0 -01} + {1774746000 0 1 +00} + {1792890000 -3600 0 -01} + {1806195600 0 1 +00} + {1824944400 -3600 0 -01} + {1837645200 0 1 +00} + {1856394000 -3600 0 -01} + {1869094800 0 1 +00} + {1887843600 -3600 0 -01} + {1901149200 0 1 +00} + {1919293200 -3600 0 -01} + {1932598800 0 1 +00} + {1950742800 -3600 0 -01} + {1964048400 0 1 +00} + {1982797200 -3600 0 -01} + {1995498000 0 1 +00} + {2014246800 -3600 0 -01} + {2026947600 0 1 +00} + {2045696400 -3600 0 -01} + {2058397200 0 1 +00} + {2077146000 -3600 0 -01} + {2090451600 0 1 +00} + {2108595600 -3600 0 -01} + {2121901200 0 1 +00} + {2140045200 -3600 0 -01} + {2153350800 0 1 +00} + {2172099600 -3600 0 -01} + {2184800400 0 1 +00} + {2203549200 -3600 0 -01} + {2216250000 0 1 +00} + {2234998800 -3600 0 -01} + {2248304400 0 1 +00} + {2266448400 -3600 0 -01} + {2279754000 0 1 +00} + {2297898000 -3600 0 -01} + {2311203600 0 1 +00} + {2329347600 -3600 0 -01} + {2342653200 0 1 +00} + {2361402000 -3600 0 -01} + {2374102800 0 1 +00} + {2392851600 -3600 0 -01} + {2405552400 0 1 +00} + {2424301200 -3600 0 -01} + {2437606800 0 1 +00} + {2455750800 -3600 0 -01} + {2469056400 0 1 +00} + {2487200400 -3600 0 -01} + {2500506000 0 1 +00} + {2519254800 -3600 0 -01} + {2531955600 0 1 +00} + {2550704400 -3600 0 -01} + {2563405200 0 1 +00} + {2582154000 -3600 0 -01} + {2595459600 0 1 +00} + {2613603600 -3600 0 -01} + {2626909200 0 1 +00} + {2645053200 -3600 0 -01} + {2658358800 0 1 +00} + {2676502800 -3600 0 -01} + {2689808400 0 1 +00} + {2708557200 -3600 0 -01} + {2721258000 0 1 +00} + {2740006800 -3600 0 -01} + {2752707600 0 1 +00} + {2771456400 -3600 0 -01} + {2784762000 0 1 +00} + {2802906000 -3600 0 -01} + {2816211600 0 1 +00} + {2834355600 -3600 0 -01} + {2847661200 0 1 +00} + {2866410000 -3600 0 -01} + {2879110800 0 1 +00} + {2897859600 -3600 0 -01} + {2910560400 0 1 +00} + {2929309200 -3600 0 -01} + {2942010000 0 1 +00} + {2960758800 -3600 0 -01} + {2974064400 0 1 +00} + {2992208400 -3600 0 -01} + {3005514000 0 1 +00} + {3023658000 -3600 0 -01} + {3036963600 0 1 +00} + {3055712400 -3600 0 -01} + {3068413200 0 1 +00} + {3087162000 -3600 0 -01} + {3099862800 0 1 +00} + {3118611600 -3600 0 -01} + {3131917200 0 1 +00} + {3150061200 -3600 0 -01} + {3163366800 0 1 +00} + {3181510800 -3600 0 -01} + {3194816400 0 1 +00} + {3212960400 -3600 0 -01} + {3226266000 0 1 +00} + {3245014800 -3600 0 -01} + {3257715600 0 1 +00} + {3276464400 -3600 0 -01} + {3289165200 0 1 +00} + {3307914000 -3600 0 -01} + {3321219600 0 1 +00} + {3339363600 -3600 0 -01} + {3352669200 0 1 +00} + {3370813200 -3600 0 -01} + {3384118800 0 1 +00} + {3402867600 -3600 0 -01} + {3415568400 0 1 +00} + {3434317200 -3600 0 -01} + {3447018000 0 1 +00} + {3465766800 -3600 0 -01} + {3479072400 0 1 +00} + {3497216400 -3600 0 -01} + {3510522000 0 1 +00} + {3528666000 -3600 0 -01} + {3541971600 0 1 +00} + {3560115600 -3600 0 -01} + {3573421200 0 1 +00} + {3592170000 -3600 0 -01} + {3604870800 0 1 +00} + {3623619600 -3600 0 -01} + {3636320400 0 1 +00} + {3655069200 -3600 0 -01} + {3668374800 0 1 +00} + {3686518800 -3600 0 -01} + {3699824400 0 1 +00} + {3717968400 -3600 0 -01} + {3731274000 0 1 +00} + {3750022800 -3600 0 -01} + {3762723600 0 1 +00} + {3781472400 -3600 0 -01} + {3794173200 0 1 +00} + {3812922000 -3600 0 -01} + {3825622800 0 1 +00} + {3844371600 -3600 0 -01} + {3857677200 0 1 +00} + {3875821200 -3600 0 -01} + {3889126800 0 1 +00} + {3907270800 -3600 0 -01} + {3920576400 0 1 +00} + {3939325200 -3600 0 -01} + {3952026000 0 1 +00} + {3970774800 -3600 0 -01} + {3983475600 0 1 +00} + {4002224400 -3600 0 -01} + {4015530000 0 1 +00} + {4033674000 -3600 0 -01} + {4046979600 0 1 +00} + {4065123600 -3600 0 -01} + {4078429200 0 1 +00} + {4096573200 -3600 0 -01} +} diff --git a/env/tcl/tcl8.6/tzdata/America/Shiprock b/env/tcl/tcl8.6/tzdata/America/Shiprock new file mode 100644 index 0000000..995d25d --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/America/Shiprock @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(America/Denver)]} { + LoadTimeZoneFile America/Denver +} +set TZData(:America/Shiprock) $TZData(:America/Denver) diff --git a/env/tcl/tcl8.6/tzdata/America/Sitka b/env/tcl/tcl8.6/tzdata/America/Sitka new file mode 100644 index 0000000..7cef02a --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/America/Sitka @@ -0,0 +1,275 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:America/Sitka) { + {-9223372036854775808 53927 0 LMT} + {-3225223727 -32473 0 LMT} + {-2188954727 -28800 0 PST} + {-883584000 -28800 0 PST} + {-880207200 -25200 1 PWT} + {-769395600 -25200 1 PPT} + {-765385200 -28800 0 PST} + {-757353600 -28800 0 PST} + {-31507200 -28800 0 PST} + {-21477600 -25200 1 PDT} + {-5756400 -28800 0 PST} + {9972000 -25200 1 PDT} + {25693200 -28800 0 PST} + {41421600 -25200 1 PDT} + {57747600 -28800 0 PST} + {73476000 -25200 1 PDT} + {89197200 -28800 0 PST} + {104925600 -25200 1 PDT} + {120646800 -28800 0 PST} + {126698400 -25200 1 PDT} + {152096400 -28800 0 PST} + {162381600 -25200 1 PDT} + {183546000 -28800 0 PST} + {199274400 -25200 1 PDT} + {215600400 -28800 0 PST} + {230724000 -25200 1 PDT} + {247050000 -28800 0 PST} + {262778400 -25200 1 PDT} + {278499600 -28800 0 PST} + {294228000 -25200 1 PDT} + {309949200 -28800 0 PST} + {325677600 -25200 1 PDT} + {341398800 -28800 0 PST} + {357127200 -25200 1 PDT} + {372848400 -28800 0 PST} + {388576800 -25200 1 PDT} + {404902800 -28800 0 PST} + {420026400 -25200 1 PDT} + {439030800 -32400 0 AKST} + {452084400 -28800 1 AKDT} + {467805600 -32400 0 AKST} + {483534000 -28800 1 AKDT} + {499255200 -32400 0 AKST} + {514983600 -28800 1 AKDT} + {530704800 -32400 0 AKST} + {544618800 -28800 1 AKDT} + {562154400 -32400 0 AKST} + {576068400 -28800 1 AKDT} + {594208800 -32400 0 AKST} + {607518000 -28800 1 AKDT} + {625658400 -32400 0 AKST} + {638967600 -28800 1 AKDT} + {657108000 -32400 0 AKST} + {671022000 -28800 1 AKDT} + {688557600 -32400 0 AKST} + {702471600 -28800 1 AKDT} + {720007200 -32400 0 AKST} + {733921200 -28800 1 AKDT} + {752061600 -32400 0 AKST} + {765370800 -28800 1 AKDT} + {783511200 -32400 0 AKST} + {796820400 -28800 1 AKDT} + {814960800 -32400 0 AKST} + {828874800 -28800 1 AKDT} + {846410400 -32400 0 AKST} + {860324400 -28800 1 AKDT} + {877860000 -32400 0 AKST} + {891774000 -28800 1 AKDT} + {909309600 -32400 0 AKST} + {923223600 -28800 1 AKDT} + {941364000 -32400 0 AKST} + {954673200 -28800 1 AKDT} + {972813600 -32400 0 AKST} + {986122800 -28800 1 AKDT} + {1004263200 -32400 0 AKST} + {1018177200 -28800 1 AKDT} + {1035712800 -32400 0 AKST} + {1049626800 -28800 1 AKDT} + {1067162400 -32400 0 AKST} + {1081076400 -28800 1 AKDT} + {1099216800 -32400 0 AKST} + {1112526000 -28800 1 AKDT} + {1130666400 -32400 0 AKST} + {1143975600 -28800 1 AKDT} + {1162116000 -32400 0 AKST} + {1173610800 -28800 1 AKDT} + {1194170400 -32400 0 AKST} + {1205060400 -28800 1 AKDT} + {1225620000 -32400 0 AKST} + {1236510000 -28800 1 AKDT} + {1257069600 -32400 0 AKST} + {1268564400 -28800 1 AKDT} + {1289124000 -32400 0 AKST} + {1300014000 -28800 1 AKDT} + {1320573600 -32400 0 AKST} + {1331463600 -28800 1 AKDT} + {1352023200 -32400 0 AKST} + {1362913200 -28800 1 AKDT} + {1383472800 -32400 0 AKST} + {1394362800 -28800 1 AKDT} + {1414922400 -32400 0 AKST} + {1425812400 -28800 1 AKDT} + {1446372000 -32400 0 AKST} + {1457866800 -28800 1 AKDT} + {1478426400 -32400 0 AKST} + {1489316400 -28800 1 AKDT} + {1509876000 -32400 0 AKST} + {1520766000 -28800 1 AKDT} + {1541325600 -32400 0 AKST} + {1552215600 -28800 1 AKDT} + {1572775200 -32400 0 AKST} + {1583665200 -28800 1 AKDT} + {1604224800 -32400 0 AKST} + {1615719600 -28800 1 AKDT} + {1636279200 -32400 0 AKST} + {1647169200 -28800 1 AKDT} + {1667728800 -32400 0 AKST} + {1678618800 -28800 1 AKDT} + {1699178400 -32400 0 AKST} + {1710068400 -28800 1 AKDT} + {1730628000 -32400 0 AKST} + {1741518000 -28800 1 AKDT} + {1762077600 -32400 0 AKST} + {1772967600 -28800 1 AKDT} + {1793527200 -32400 0 AKST} + {1805022000 -28800 1 AKDT} + {1825581600 -32400 0 AKST} + {1836471600 -28800 1 AKDT} + {1857031200 -32400 0 AKST} + {1867921200 -28800 1 AKDT} + {1888480800 -32400 0 AKST} + {1899370800 -28800 1 AKDT} + {1919930400 -32400 0 AKST} + {1930820400 -28800 1 AKDT} + {1951380000 -32400 0 AKST} + {1962874800 -28800 1 AKDT} + {1983434400 -32400 0 AKST} + {1994324400 -28800 1 AKDT} + {2014884000 -32400 0 AKST} + {2025774000 -28800 1 AKDT} + {2046333600 -32400 0 AKST} + {2057223600 -28800 1 AKDT} + {2077783200 -32400 0 AKST} + {2088673200 -28800 1 AKDT} + {2109232800 -32400 0 AKST} + {2120122800 -28800 1 AKDT} + {2140682400 -32400 0 AKST} + {2152177200 -28800 1 AKDT} + {2172736800 -32400 0 AKST} + {2183626800 -28800 1 AKDT} + {2204186400 -32400 0 AKST} + {2215076400 -28800 1 AKDT} + {2235636000 -32400 0 AKST} + {2246526000 -28800 1 AKDT} + {2267085600 -32400 0 AKST} + {2277975600 -28800 1 AKDT} + {2298535200 -32400 0 AKST} + {2309425200 -28800 1 AKDT} + {2329984800 -32400 0 AKST} + {2341479600 -28800 1 AKDT} + {2362039200 -32400 0 AKST} + {2372929200 -28800 1 AKDT} + {2393488800 -32400 0 AKST} + {2404378800 -28800 1 AKDT} + {2424938400 -32400 0 AKST} + {2435828400 -28800 1 AKDT} + {2456388000 -32400 0 AKST} + {2467278000 -28800 1 AKDT} + {2487837600 -32400 0 AKST} + {2499332400 -28800 1 AKDT} + {2519892000 -32400 0 AKST} + {2530782000 -28800 1 AKDT} + {2551341600 -32400 0 AKST} + {2562231600 -28800 1 AKDT} + {2582791200 -32400 0 AKST} + {2593681200 -28800 1 AKDT} + {2614240800 -32400 0 AKST} + {2625130800 -28800 1 AKDT} + {2645690400 -32400 0 AKST} + {2656580400 -28800 1 AKDT} + {2677140000 -32400 0 AKST} + {2688634800 -28800 1 AKDT} + {2709194400 -32400 0 AKST} + {2720084400 -28800 1 AKDT} + {2740644000 -32400 0 AKST} + {2751534000 -28800 1 AKDT} + {2772093600 -32400 0 AKST} + {2782983600 -28800 1 AKDT} + {2803543200 -32400 0 AKST} + {2814433200 -28800 1 AKDT} + {2834992800 -32400 0 AKST} + {2846487600 -28800 1 AKDT} + {2867047200 -32400 0 AKST} + {2877937200 -28800 1 AKDT} + {2898496800 -32400 0 AKST} + {2909386800 -28800 1 AKDT} + {2929946400 -32400 0 AKST} + {2940836400 -28800 1 AKDT} + {2961396000 -32400 0 AKST} + {2972286000 -28800 1 AKDT} + {2992845600 -32400 0 AKST} + {3003735600 -28800 1 AKDT} + {3024295200 -32400 0 AKST} + {3035790000 -28800 1 AKDT} + {3056349600 -32400 0 AKST} + {3067239600 -28800 1 AKDT} + {3087799200 -32400 0 AKST} + {3098689200 -28800 1 AKDT} + {3119248800 -32400 0 AKST} + {3130138800 -28800 1 AKDT} + {3150698400 -32400 0 AKST} + {3161588400 -28800 1 AKDT} + {3182148000 -32400 0 AKST} + {3193038000 -28800 1 AKDT} + {3213597600 -32400 0 AKST} + {3225092400 -28800 1 AKDT} + {3245652000 -32400 0 AKST} + {3256542000 -28800 1 AKDT} + {3277101600 -32400 0 AKST} + {3287991600 -28800 1 AKDT} + {3308551200 -32400 0 AKST} + {3319441200 -28800 1 AKDT} + {3340000800 -32400 0 AKST} + {3350890800 -28800 1 AKDT} + {3371450400 -32400 0 AKST} + {3382945200 -28800 1 AKDT} + {3403504800 -32400 0 AKST} + {3414394800 -28800 1 AKDT} + {3434954400 -32400 0 AKST} + {3445844400 -28800 1 AKDT} + {3466404000 -32400 0 AKST} + {3477294000 -28800 1 AKDT} + {3497853600 -32400 0 AKST} + {3508743600 -28800 1 AKDT} + {3529303200 -32400 0 AKST} + {3540193200 -28800 1 AKDT} + {3560752800 -32400 0 AKST} + {3572247600 -28800 1 AKDT} + {3592807200 -32400 0 AKST} + {3603697200 -28800 1 AKDT} + {3624256800 -32400 0 AKST} + {3635146800 -28800 1 AKDT} + {3655706400 -32400 0 AKST} + {3666596400 -28800 1 AKDT} + {3687156000 -32400 0 AKST} + {3698046000 -28800 1 AKDT} + {3718605600 -32400 0 AKST} + {3730100400 -28800 1 AKDT} + {3750660000 -32400 0 AKST} + {3761550000 -28800 1 AKDT} + {3782109600 -32400 0 AKST} + {3792999600 -28800 1 AKDT} + {3813559200 -32400 0 AKST} + {3824449200 -28800 1 AKDT} + {3845008800 -32400 0 AKST} + {3855898800 -28800 1 AKDT} + {3876458400 -32400 0 AKST} + {3887348400 -28800 1 AKDT} + {3907908000 -32400 0 AKST} + {3919402800 -28800 1 AKDT} + {3939962400 -32400 0 AKST} + {3950852400 -28800 1 AKDT} + {3971412000 -32400 0 AKST} + {3982302000 -28800 1 AKDT} + {4002861600 -32400 0 AKST} + {4013751600 -28800 1 AKDT} + {4034311200 -32400 0 AKST} + {4045201200 -28800 1 AKDT} + {4065760800 -32400 0 AKST} + {4076650800 -28800 1 AKDT} + {4097210400 -32400 0 AKST} +} diff --git a/env/tcl/tcl8.6/tzdata/America/St_Barthelemy b/env/tcl/tcl8.6/tzdata/America/St_Barthelemy new file mode 100644 index 0000000..46bc287 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/America/St_Barthelemy @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(America/Port_of_Spain)]} { + LoadTimeZoneFile America/Port_of_Spain +} +set TZData(:America/St_Barthelemy) $TZData(:America/Port_of_Spain) diff --git a/env/tcl/tcl8.6/tzdata/America/St_Johns b/env/tcl/tcl8.6/tzdata/America/St_Johns new file mode 100644 index 0000000..1492961 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/America/St_Johns @@ -0,0 +1,372 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:America/St_Johns) { + {-9223372036854775808 -12652 0 LMT} + {-2713897748 -12652 0 NST} + {-1664130548 -9052 1 NDT} + {-1650137348 -12652 0 NST} + {-1640982548 -12652 0 NST} + {-1632076148 -9052 1 NDT} + {-1615145348 -12652 0 NST} + {-1609446548 -12652 0 NST} + {-1598650148 -9052 1 NDT} + {-1590100148 -12652 0 NST} + {-1567286948 -9052 1 NDT} + {-1551565748 -12652 0 NST} + {-1535837348 -9052 1 NDT} + {-1520116148 -12652 0 NST} + {-1503782948 -9052 1 NDT} + {-1488666548 -12652 0 NST} + {-1472333348 -9052 1 NDT} + {-1457216948 -12652 0 NST} + {-1440883748 -9052 1 NDT} + {-1425767348 -12652 0 NST} + {-1409434148 -9052 1 NDT} + {-1394317748 -12652 0 NST} + {-1377984548 -9052 1 NDT} + {-1362263348 -12652 0 NST} + {-1346534948 -9052 1 NDT} + {-1330813748 -12652 0 NST} + {-1314480548 -9052 1 NDT} + {-1299364148 -12652 0 NST} + {-1283030948 -9052 1 NDT} + {-1267914548 -12652 0 NST} + {-1251581348 -9052 1 NDT} + {-1236464948 -12652 0 NST} + {-1220131748 -9052 1 NDT} + {-1205015348 -12652 0 NST} + {-1188682148 -9052 1 NDT} + {-1172960948 -12652 0 NST} + {-1156627748 -9052 1 NDT} + {-1141511348 -12652 0 NST} + {-1125178148 -9052 1 NDT} + {-1110061748 -12652 0 NST} + {-1096921748 -12600 0 NST} + {-1093728600 -9000 1 NDT} + {-1078612200 -12600 0 NST} + {-1061670600 -9000 1 NDT} + {-1048973400 -12600 0 NST} + {-1030221000 -9000 1 NDT} + {-1017523800 -12600 0 NST} + {-998771400 -9000 1 NDT} + {-986074200 -12600 0 NST} + {-966717000 -9000 1 NDT} + {-954624600 -12600 0 NST} + {-935267400 -9000 1 NDT} + {-922570200 -12600 0 NST} + {-903817800 -9000 1 NDT} + {-891120600 -12600 0 NST} + {-872368200 -9000 0 NWT} + {-769395600 -9000 1 NPT} + {-765401400 -12600 0 NST} + {-757369800 -12600 0 NST} + {-746044200 -9000 1 NDT} + {-733347000 -12600 0 NST} + {-714594600 -9000 1 NDT} + {-701897400 -12600 0 NST} + {-683145000 -9000 1 NDT} + {-670447800 -12600 0 NST} + {-651695400 -9000 1 NDT} + {-638998200 -12600 0 NST} + {-619641000 -9000 1 NDT} + {-606943800 -12600 0 NST} + {-589401000 -9000 1 NDT} + {-576099000 -12600 0 NST} + {-557951400 -9000 1 NDT} + {-544649400 -12600 0 NST} + {-526501800 -9000 1 NDT} + {-513199800 -12600 0 NST} + {-495052200 -9000 1 NDT} + {-481750200 -12600 0 NST} + {-463602600 -9000 1 NDT} + {-450300600 -12600 0 NST} + {-431548200 -9000 1 NDT} + {-418246200 -12600 0 NST} + {-400098600 -9000 1 NDT} + {-386796600 -12600 0 NST} + {-368649000 -9000 1 NDT} + {-355347000 -12600 0 NST} + {-337199400 -9000 1 NDT} + {-323897400 -12600 0 NST} + {-305749800 -9000 1 NDT} + {-289423800 -12600 0 NST} + {-273695400 -9000 1 NDT} + {-257974200 -12600 0 NST} + {-242245800 -9000 1 NDT} + {-226524600 -12600 0 NST} + {-210796200 -9000 1 NDT} + {-195075000 -12600 0 NST} + {-179346600 -9000 1 NDT} + {-163625400 -12600 0 NST} + {-147897000 -9000 1 NDT} + {-131571000 -12600 0 NST} + {-116447400 -9000 1 NDT} + {-100121400 -12600 0 NST} + {-84393000 -9000 1 NDT} + {-68671800 -12600 0 NST} + {-52943400 -9000 1 NDT} + {-37222200 -12600 0 NST} + {-21493800 -9000 1 NDT} + {-5772600 -12600 0 NST} + {9955800 -9000 1 NDT} + {25677000 -12600 0 NST} + {41405400 -9000 1 NDT} + {57731400 -12600 0 NST} + {73459800 -9000 1 NDT} + {89181000 -12600 0 NST} + {104909400 -9000 1 NDT} + {120630600 -12600 0 NST} + {136359000 -9000 1 NDT} + {152080200 -12600 0 NST} + {167808600 -9000 1 NDT} + {183529800 -12600 0 NST} + {199258200 -9000 1 NDT} + {215584200 -12600 0 NST} + {230707800 -9000 1 NDT} + {247033800 -12600 0 NST} + {262762200 -9000 1 NDT} + {278483400 -12600 0 NST} + {294211800 -9000 1 NDT} + {309933000 -12600 0 NST} + {325661400 -9000 1 NDT} + {341382600 -12600 0 NST} + {357111000 -9000 1 NDT} + {372832200 -12600 0 NST} + {388560600 -9000 1 NDT} + {404886600 -12600 0 NST} + {420010200 -9000 1 NDT} + {436336200 -12600 0 NST} + {452064600 -9000 1 NDT} + {467785800 -12600 0 NST} + {483514200 -9000 1 NDT} + {499235400 -12600 0 NST} + {514963800 -9000 1 NDT} + {530685000 -12600 0 NST} + {544591860 -9000 1 NDT} + {562127460 -12600 0 NST} + {576041460 -5400 1 NDDT} + {594178260 -12600 0 NST} + {607491060 -9000 1 NDT} + {625631460 -12600 0 NST} + {638940660 -9000 1 NDT} + {657081060 -12600 0 NST} + {670995060 -9000 1 NDT} + {688530660 -12600 0 NST} + {702444660 -9000 1 NDT} + {719980260 -12600 0 NST} + {733894260 -9000 1 NDT} + {752034660 -12600 0 NST} + {765343860 -9000 1 NDT} + {783484260 -12600 0 NST} + {796793460 -9000 1 NDT} + {814933860 -12600 0 NST} + {828847860 -9000 1 NDT} + {846383460 -12600 0 NST} + {860297460 -9000 1 NDT} + {877833060 -12600 0 NST} + {891747060 -9000 1 NDT} + {909282660 -12600 0 NST} + {923196660 -9000 1 NDT} + {941337060 -12600 0 NST} + {954646260 -9000 1 NDT} + {972786660 -12600 0 NST} + {986095860 -9000 1 NDT} + {1004236260 -12600 0 NST} + {1018150260 -9000 1 NDT} + {1035685860 -12600 0 NST} + {1049599860 -9000 1 NDT} + {1067135460 -12600 0 NST} + {1081049460 -9000 1 NDT} + {1099189860 -12600 0 NST} + {1112499060 -9000 1 NDT} + {1130639460 -12600 0 NST} + {1143948660 -9000 1 NDT} + {1162089060 -12600 0 NST} + {1173583860 -9000 1 NDT} + {1194143460 -12600 0 NST} + {1205033460 -9000 1 NDT} + {1225593060 -12600 0 NST} + {1236483060 -9000 1 NDT} + {1257042660 -12600 0 NST} + {1268537460 -9000 1 NDT} + {1289097060 -12600 0 NST} + {1299987060 -9000 1 NDT} + {1320114600 -9000 0 NDT} + {1320553800 -12600 0 NST} + {1331443800 -9000 1 NDT} + {1352003400 -12600 0 NST} + {1362893400 -9000 1 NDT} + {1383453000 -12600 0 NST} + {1394343000 -9000 1 NDT} + {1414902600 -12600 0 NST} + {1425792600 -9000 1 NDT} + {1446352200 -12600 0 NST} + {1457847000 -9000 1 NDT} + {1478406600 -12600 0 NST} + {1489296600 -9000 1 NDT} + {1509856200 -12600 0 NST} + {1520746200 -9000 1 NDT} + {1541305800 -12600 0 NST} + {1552195800 -9000 1 NDT} + {1572755400 -12600 0 NST} + {1583645400 -9000 1 NDT} + {1604205000 -12600 0 NST} + {1615699800 -9000 1 NDT} + {1636259400 -12600 0 NST} + {1647149400 -9000 1 NDT} + {1667709000 -12600 0 NST} + {1678599000 -9000 1 NDT} + {1699158600 -12600 0 NST} + {1710048600 -9000 1 NDT} + {1730608200 -12600 0 NST} + {1741498200 -9000 1 NDT} + {1762057800 -12600 0 NST} + {1772947800 -9000 1 NDT} + {1793507400 -12600 0 NST} + {1805002200 -9000 1 NDT} + {1825561800 -12600 0 NST} + {1836451800 -9000 1 NDT} + {1857011400 -12600 0 NST} + {1867901400 -9000 1 NDT} + {1888461000 -12600 0 NST} + {1899351000 -9000 1 NDT} + {1919910600 -12600 0 NST} + {1930800600 -9000 1 NDT} + {1951360200 -12600 0 NST} + {1962855000 -9000 1 NDT} + {1983414600 -12600 0 NST} + {1994304600 -9000 1 NDT} + {2014864200 -12600 0 NST} + {2025754200 -9000 1 NDT} + {2046313800 -12600 0 NST} + {2057203800 -9000 1 NDT} + {2077763400 -12600 0 NST} + {2088653400 -9000 1 NDT} + {2109213000 -12600 0 NST} + {2120103000 -9000 1 NDT} + {2140662600 -12600 0 NST} + {2152157400 -9000 1 NDT} + {2172717000 -12600 0 NST} + {2183607000 -9000 1 NDT} + {2204166600 -12600 0 NST} + {2215056600 -9000 1 NDT} + {2235616200 -12600 0 NST} + {2246506200 -9000 1 NDT} + {2267065800 -12600 0 NST} + {2277955800 -9000 1 NDT} + {2298515400 -12600 0 NST} + {2309405400 -9000 1 NDT} + {2329965000 -12600 0 NST} + {2341459800 -9000 1 NDT} + {2362019400 -12600 0 NST} + {2372909400 -9000 1 NDT} + {2393469000 -12600 0 NST} + {2404359000 -9000 1 NDT} + {2424918600 -12600 0 NST} + {2435808600 -9000 1 NDT} + {2456368200 -12600 0 NST} + {2467258200 -9000 1 NDT} + {2487817800 -12600 0 NST} + {2499312600 -9000 1 NDT} + {2519872200 -12600 0 NST} + {2530762200 -9000 1 NDT} + {2551321800 -12600 0 NST} + {2562211800 -9000 1 NDT} + {2582771400 -12600 0 NST} + {2593661400 -9000 1 NDT} + {2614221000 -12600 0 NST} + {2625111000 -9000 1 NDT} + {2645670600 -12600 0 NST} + {2656560600 -9000 1 NDT} + {2677120200 -12600 0 NST} + {2688615000 -9000 1 NDT} + {2709174600 -12600 0 NST} + {2720064600 -9000 1 NDT} + {2740624200 -12600 0 NST} + {2751514200 -9000 1 NDT} + {2772073800 -12600 0 NST} + {2782963800 -9000 1 NDT} + {2803523400 -12600 0 NST} + {2814413400 -9000 1 NDT} + {2834973000 -12600 0 NST} + {2846467800 -9000 1 NDT} + {2867027400 -12600 0 NST} + {2877917400 -9000 1 NDT} + {2898477000 -12600 0 NST} + {2909367000 -9000 1 NDT} + {2929926600 -12600 0 NST} + {2940816600 -9000 1 NDT} + {2961376200 -12600 0 NST} + {2972266200 -9000 1 NDT} + {2992825800 -12600 0 NST} + {3003715800 -9000 1 NDT} + {3024275400 -12600 0 NST} + {3035770200 -9000 1 NDT} + {3056329800 -12600 0 NST} + {3067219800 -9000 1 NDT} + {3087779400 -12600 0 NST} + {3098669400 -9000 1 NDT} + {3119229000 -12600 0 NST} + {3130119000 -9000 1 NDT} + {3150678600 -12600 0 NST} + {3161568600 -9000 1 NDT} + {3182128200 -12600 0 NST} + {3193018200 -9000 1 NDT} + {3213577800 -12600 0 NST} + {3225072600 -9000 1 NDT} + {3245632200 -12600 0 NST} + {3256522200 -9000 1 NDT} + {3277081800 -12600 0 NST} + {3287971800 -9000 1 NDT} + {3308531400 -12600 0 NST} + {3319421400 -9000 1 NDT} + {3339981000 -12600 0 NST} + {3350871000 -9000 1 NDT} + {3371430600 -12600 0 NST} + {3382925400 -9000 1 NDT} + {3403485000 -12600 0 NST} + {3414375000 -9000 1 NDT} + {3434934600 -12600 0 NST} + {3445824600 -9000 1 NDT} + {3466384200 -12600 0 NST} + {3477274200 -9000 1 NDT} + {3497833800 -12600 0 NST} + {3508723800 -9000 1 NDT} + {3529283400 -12600 0 NST} + {3540173400 -9000 1 NDT} + {3560733000 -12600 0 NST} + {3572227800 -9000 1 NDT} + {3592787400 -12600 0 NST} + {3603677400 -9000 1 NDT} + {3624237000 -12600 0 NST} + {3635127000 -9000 1 NDT} + {3655686600 -12600 0 NST} + {3666576600 -9000 1 NDT} + {3687136200 -12600 0 NST} + {3698026200 -9000 1 NDT} + {3718585800 -12600 0 NST} + {3730080600 -9000 1 NDT} + {3750640200 -12600 0 NST} + {3761530200 -9000 1 NDT} + {3782089800 -12600 0 NST} + {3792979800 -9000 1 NDT} + {3813539400 -12600 0 NST} + {3824429400 -9000 1 NDT} + {3844989000 -12600 0 NST} + {3855879000 -9000 1 NDT} + {3876438600 -12600 0 NST} + {3887328600 -9000 1 NDT} + {3907888200 -12600 0 NST} + {3919383000 -9000 1 NDT} + {3939942600 -12600 0 NST} + {3950832600 -9000 1 NDT} + {3971392200 -12600 0 NST} + {3982282200 -9000 1 NDT} + {4002841800 -12600 0 NST} + {4013731800 -9000 1 NDT} + {4034291400 -12600 0 NST} + {4045181400 -9000 1 NDT} + {4065741000 -12600 0 NST} + {4076631000 -9000 1 NDT} + {4097190600 -12600 0 NST} +} diff --git a/env/tcl/tcl8.6/tzdata/America/St_Kitts b/env/tcl/tcl8.6/tzdata/America/St_Kitts new file mode 100644 index 0000000..6ad7f04 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/America/St_Kitts @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(America/Port_of_Spain)]} { + LoadTimeZoneFile America/Port_of_Spain +} +set TZData(:America/St_Kitts) $TZData(:America/Port_of_Spain) diff --git a/env/tcl/tcl8.6/tzdata/America/St_Lucia b/env/tcl/tcl8.6/tzdata/America/St_Lucia new file mode 100644 index 0000000..e479b31 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/America/St_Lucia @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(America/Port_of_Spain)]} { + LoadTimeZoneFile America/Port_of_Spain +} +set TZData(:America/St_Lucia) $TZData(:America/Port_of_Spain) diff --git a/env/tcl/tcl8.6/tzdata/America/St_Thomas b/env/tcl/tcl8.6/tzdata/America/St_Thomas new file mode 100644 index 0000000..24698b8 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/America/St_Thomas @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(America/Port_of_Spain)]} { + LoadTimeZoneFile America/Port_of_Spain +} +set TZData(:America/St_Thomas) $TZData(:America/Port_of_Spain) diff --git a/env/tcl/tcl8.6/tzdata/America/St_Vincent b/env/tcl/tcl8.6/tzdata/America/St_Vincent new file mode 100644 index 0000000..e3b32fb --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/America/St_Vincent @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(America/Port_of_Spain)]} { + LoadTimeZoneFile America/Port_of_Spain +} +set TZData(:America/St_Vincent) $TZData(:America/Port_of_Spain) diff --git a/env/tcl/tcl8.6/tzdata/America/Swift_Current b/env/tcl/tcl8.6/tzdata/America/Swift_Current new file mode 100644 index 0000000..ad07762 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/America/Swift_Current @@ -0,0 +1,29 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:America/Swift_Current) { + {-9223372036854775808 -25880 0 LMT} + {-2030201320 -25200 0 MST} + {-1632063600 -21600 1 MDT} + {-1615132800 -25200 0 MST} + {-880210800 -21600 1 MWT} + {-769395600 -21600 1 MPT} + {-765388800 -25200 0 MST} + {-747241200 -21600 0 MDT} + {-732729600 -25200 0 MST} + {-715791600 -21600 1 MDT} + {-702489600 -25200 0 MST} + {-684342000 -21600 1 MDT} + {-671040000 -25200 0 MST} + {-652892400 -21600 1 MDT} + {-639590400 -25200 0 MST} + {-631126800 -25200 0 MST} + {-400086000 -21600 1 MDT} + {-384364800 -25200 0 MST} + {-337186800 -21600 1 MDT} + {-321465600 -25200 0 MST} + {-305737200 -21600 1 MDT} + {-292435200 -25200 0 MST} + {-273682800 -21600 1 MDT} + {-260985600 -25200 0 MST} + {73472400 -21600 0 CST} +} diff --git a/env/tcl/tcl8.6/tzdata/America/Tegucigalpa b/env/tcl/tcl8.6/tzdata/America/Tegucigalpa new file mode 100644 index 0000000..050661e --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/America/Tegucigalpa @@ -0,0 +1,12 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:America/Tegucigalpa) { + {-9223372036854775808 -20932 0 LMT} + {-1538503868 -21600 0 CST} + {547020000 -18000 1 CDT} + {559717200 -21600 0 CST} + {578469600 -18000 1 CDT} + {591166800 -21600 0 CST} + {1146981600 -18000 1 CDT} + {1154926800 -21600 0 CST} +} diff --git a/env/tcl/tcl8.6/tzdata/America/Thule b/env/tcl/tcl8.6/tzdata/America/Thule new file mode 100644 index 0000000..0aaf9a1 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/America/Thule @@ -0,0 +1,224 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:America/Thule) { + {-9223372036854775808 -16508 0 LMT} + {-1686079492 -14400 0 AST} + {670399200 -10800 1 ADT} + {686120400 -14400 0 AST} + {701848800 -10800 1 ADT} + {717570000 -14400 0 AST} + {733903200 -10800 1 ADT} + {752043600 -14400 0 AST} + {765352800 -10800 1 ADT} + {783493200 -14400 0 AST} + {796802400 -10800 1 ADT} + {814942800 -14400 0 AST} + {828856800 -10800 1 ADT} + {846392400 -14400 0 AST} + {860306400 -10800 1 ADT} + {877842000 -14400 0 AST} + {891756000 -10800 1 ADT} + {909291600 -14400 0 AST} + {923205600 -10800 1 ADT} + {941346000 -14400 0 AST} + {954655200 -10800 1 ADT} + {972795600 -14400 0 AST} + {986104800 -10800 1 ADT} + {1004245200 -14400 0 AST} + {1018159200 -10800 1 ADT} + {1035694800 -14400 0 AST} + {1049608800 -10800 1 ADT} + {1067144400 -14400 0 AST} + {1081058400 -10800 1 ADT} + {1099198800 -14400 0 AST} + {1112508000 -10800 1 ADT} + {1130648400 -14400 0 AST} + {1143957600 -10800 1 ADT} + {1162098000 -14400 0 AST} + {1173592800 -10800 1 ADT} + {1194152400 -14400 0 AST} + {1205042400 -10800 1 ADT} + {1225602000 -14400 0 AST} + {1236492000 -10800 1 ADT} + {1257051600 -14400 0 AST} + {1268546400 -10800 1 ADT} + {1289106000 -14400 0 AST} + {1299996000 -10800 1 ADT} + {1320555600 -14400 0 AST} + {1331445600 -10800 1 ADT} + {1352005200 -14400 0 AST} + {1362895200 -10800 1 ADT} + {1383454800 -14400 0 AST} + {1394344800 -10800 1 ADT} + {1414904400 -14400 0 AST} + {1425794400 -10800 1 ADT} + {1446354000 -14400 0 AST} + {1457848800 -10800 1 ADT} + {1478408400 -14400 0 AST} + {1489298400 -10800 1 ADT} + {1509858000 -14400 0 AST} + {1520748000 -10800 1 ADT} + {1541307600 -14400 0 AST} + {1552197600 -10800 1 ADT} + {1572757200 -14400 0 AST} + {1583647200 -10800 1 ADT} + {1604206800 -14400 0 AST} + {1615701600 -10800 1 ADT} + {1636261200 -14400 0 AST} + {1647151200 -10800 1 ADT} + {1667710800 -14400 0 AST} + {1678600800 -10800 1 ADT} + {1699160400 -14400 0 AST} + {1710050400 -10800 1 ADT} + {1730610000 -14400 0 AST} + {1741500000 -10800 1 ADT} + {1762059600 -14400 0 AST} + {1772949600 -10800 1 ADT} + {1793509200 -14400 0 AST} + {1805004000 -10800 1 ADT} + {1825563600 -14400 0 AST} + {1836453600 -10800 1 ADT} + {1857013200 -14400 0 AST} + {1867903200 -10800 1 ADT} + {1888462800 -14400 0 AST} + {1899352800 -10800 1 ADT} + {1919912400 -14400 0 AST} + {1930802400 -10800 1 ADT} + {1951362000 -14400 0 AST} + {1962856800 -10800 1 ADT} + {1983416400 -14400 0 AST} + {1994306400 -10800 1 ADT} + {2014866000 -14400 0 AST} + {2025756000 -10800 1 ADT} + {2046315600 -14400 0 AST} + {2057205600 -10800 1 ADT} + {2077765200 -14400 0 AST} + {2088655200 -10800 1 ADT} + {2109214800 -14400 0 AST} + {2120104800 -10800 1 ADT} + {2140664400 -14400 0 AST} + {2152159200 -10800 1 ADT} + {2172718800 -14400 0 AST} + {2183608800 -10800 1 ADT} + {2204168400 -14400 0 AST} + {2215058400 -10800 1 ADT} + {2235618000 -14400 0 AST} + {2246508000 -10800 1 ADT} + {2267067600 -14400 0 AST} + {2277957600 -10800 1 ADT} + {2298517200 -14400 0 AST} + {2309407200 -10800 1 ADT} + {2329966800 -14400 0 AST} + {2341461600 -10800 1 ADT} + {2362021200 -14400 0 AST} + {2372911200 -10800 1 ADT} + {2393470800 -14400 0 AST} + {2404360800 -10800 1 ADT} + {2424920400 -14400 0 AST} + {2435810400 -10800 1 ADT} + {2456370000 -14400 0 AST} + {2467260000 -10800 1 ADT} + {2487819600 -14400 0 AST} + {2499314400 -10800 1 ADT} + {2519874000 -14400 0 AST} + {2530764000 -10800 1 ADT} + {2551323600 -14400 0 AST} + {2562213600 -10800 1 ADT} + {2582773200 -14400 0 AST} + {2593663200 -10800 1 ADT} + {2614222800 -14400 0 AST} + {2625112800 -10800 1 ADT} + {2645672400 -14400 0 AST} + {2656562400 -10800 1 ADT} + {2677122000 -14400 0 AST} + {2688616800 -10800 1 ADT} + {2709176400 -14400 0 AST} + {2720066400 -10800 1 ADT} + {2740626000 -14400 0 AST} + {2751516000 -10800 1 ADT} + {2772075600 -14400 0 AST} + {2782965600 -10800 1 ADT} + {2803525200 -14400 0 AST} + {2814415200 -10800 1 ADT} + {2834974800 -14400 0 AST} + {2846469600 -10800 1 ADT} + {2867029200 -14400 0 AST} + {2877919200 -10800 1 ADT} + {2898478800 -14400 0 AST} + {2909368800 -10800 1 ADT} + {2929928400 -14400 0 AST} + {2940818400 -10800 1 ADT} + {2961378000 -14400 0 AST} + {2972268000 -10800 1 ADT} + {2992827600 -14400 0 AST} + {3003717600 -10800 1 ADT} + {3024277200 -14400 0 AST} + {3035772000 -10800 1 ADT} + {3056331600 -14400 0 AST} + {3067221600 -10800 1 ADT} + {3087781200 -14400 0 AST} + {3098671200 -10800 1 ADT} + {3119230800 -14400 0 AST} + {3130120800 -10800 1 ADT} + {3150680400 -14400 0 AST} + {3161570400 -10800 1 ADT} + {3182130000 -14400 0 AST} + {3193020000 -10800 1 ADT} + {3213579600 -14400 0 AST} + {3225074400 -10800 1 ADT} + {3245634000 -14400 0 AST} + {3256524000 -10800 1 ADT} + {3277083600 -14400 0 AST} + {3287973600 -10800 1 ADT} + {3308533200 -14400 0 AST} + {3319423200 -10800 1 ADT} + {3339982800 -14400 0 AST} + {3350872800 -10800 1 ADT} + {3371432400 -14400 0 AST} + {3382927200 -10800 1 ADT} + {3403486800 -14400 0 AST} + {3414376800 -10800 1 ADT} + {3434936400 -14400 0 AST} + {3445826400 -10800 1 ADT} + {3466386000 -14400 0 AST} + {3477276000 -10800 1 ADT} + {3497835600 -14400 0 AST} + {3508725600 -10800 1 ADT} + {3529285200 -14400 0 AST} + {3540175200 -10800 1 ADT} + {3560734800 -14400 0 AST} + {3572229600 -10800 1 ADT} + {3592789200 -14400 0 AST} + {3603679200 -10800 1 ADT} + {3624238800 -14400 0 AST} + {3635128800 -10800 1 ADT} + {3655688400 -14400 0 AST} + {3666578400 -10800 1 ADT} + {3687138000 -14400 0 AST} + {3698028000 -10800 1 ADT} + {3718587600 -14400 0 AST} + {3730082400 -10800 1 ADT} + {3750642000 -14400 0 AST} + {3761532000 -10800 1 ADT} + {3782091600 -14400 0 AST} + {3792981600 -10800 1 ADT} + {3813541200 -14400 0 AST} + {3824431200 -10800 1 ADT} + {3844990800 -14400 0 AST} + {3855880800 -10800 1 ADT} + {3876440400 -14400 0 AST} + {3887330400 -10800 1 ADT} + {3907890000 -14400 0 AST} + {3919384800 -10800 1 ADT} + {3939944400 -14400 0 AST} + {3950834400 -10800 1 ADT} + {3971394000 -14400 0 AST} + {3982284000 -10800 1 ADT} + {4002843600 -14400 0 AST} + {4013733600 -10800 1 ADT} + {4034293200 -14400 0 AST} + {4045183200 -10800 1 ADT} + {4065742800 -14400 0 AST} + {4076632800 -10800 1 ADT} + {4097192400 -14400 0 AST} +} diff --git a/env/tcl/tcl8.6/tzdata/America/Thunder_Bay b/env/tcl/tcl8.6/tzdata/America/Thunder_Bay new file mode 100644 index 0000000..8a454be --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/America/Thunder_Bay @@ -0,0 +1,272 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:America/Thunder_Bay) { + {-9223372036854775808 -21420 0 LMT} + {-2366733780 -21600 0 CST} + {-1893434400 -18000 0 EST} + {-883594800 -18000 0 EST} + {-880218000 -14400 1 EWT} + {-769395600 -14400 1 EPT} + {-765396000 -18000 0 EST} + {18000 -18000 0 EST} + {9961200 -14400 1 EDT} + {25682400 -18000 0 EST} + {41410800 -14400 1 EDT} + {57736800 -18000 0 EST} + {73465200 -14400 1 EDT} + {89186400 -18000 0 EST} + {94712400 -18000 0 EST} + {126248400 -18000 0 EST} + {136364400 -14400 1 EDT} + {152085600 -18000 0 EST} + {167814000 -14400 1 EDT} + {183535200 -18000 0 EST} + {199263600 -14400 1 EDT} + {215589600 -18000 0 EST} + {230713200 -14400 1 EDT} + {247039200 -18000 0 EST} + {262767600 -14400 1 EDT} + {278488800 -18000 0 EST} + {294217200 -14400 1 EDT} + {309938400 -18000 0 EST} + {325666800 -14400 1 EDT} + {341388000 -18000 0 EST} + {357116400 -14400 1 EDT} + {372837600 -18000 0 EST} + {388566000 -14400 1 EDT} + {404892000 -18000 0 EST} + {420015600 -14400 1 EDT} + {436341600 -18000 0 EST} + {452070000 -14400 1 EDT} + {467791200 -18000 0 EST} + {483519600 -14400 1 EDT} + {499240800 -18000 0 EST} + {514969200 -14400 1 EDT} + {530690400 -18000 0 EST} + {544604400 -14400 1 EDT} + {562140000 -18000 0 EST} + {576054000 -14400 1 EDT} + {594194400 -18000 0 EST} + {607503600 -14400 1 EDT} + {625644000 -18000 0 EST} + {638953200 -14400 1 EDT} + {657093600 -18000 0 EST} + {671007600 -14400 1 EDT} + {688543200 -18000 0 EST} + {702457200 -14400 1 EDT} + {719992800 -18000 0 EST} + {733906800 -14400 1 EDT} + {752047200 -18000 0 EST} + {765356400 -14400 1 EDT} + {783496800 -18000 0 EST} + {796806000 -14400 1 EDT} + {814946400 -18000 0 EST} + {828860400 -14400 1 EDT} + {846396000 -18000 0 EST} + {860310000 -14400 1 EDT} + {877845600 -18000 0 EST} + {891759600 -14400 1 EDT} + {909295200 -18000 0 EST} + {923209200 -14400 1 EDT} + {941349600 -18000 0 EST} + {954658800 -14400 1 EDT} + {972799200 -18000 0 EST} + {986108400 -14400 1 EDT} + {1004248800 -18000 0 EST} + {1018162800 -14400 1 EDT} + {1035698400 -18000 0 EST} + {1049612400 -14400 1 EDT} + {1067148000 -18000 0 EST} + {1081062000 -14400 1 EDT} + {1099202400 -18000 0 EST} + {1112511600 -14400 1 EDT} + {1130652000 -18000 0 EST} + {1143961200 -14400 1 EDT} + {1162101600 -18000 0 EST} + {1173596400 -14400 1 EDT} + {1194156000 -18000 0 EST} + {1205046000 -14400 1 EDT} + {1225605600 -18000 0 EST} + {1236495600 -14400 1 EDT} + {1257055200 -18000 0 EST} + {1268550000 -14400 1 EDT} + {1289109600 -18000 0 EST} + {1299999600 -14400 1 EDT} + {1320559200 -18000 0 EST} + {1331449200 -14400 1 EDT} + {1352008800 -18000 0 EST} + {1362898800 -14400 1 EDT} + {1383458400 -18000 0 EST} + {1394348400 -14400 1 EDT} + {1414908000 -18000 0 EST} + {1425798000 -14400 1 EDT} + {1446357600 -18000 0 EST} + {1457852400 -14400 1 EDT} + {1478412000 -18000 0 EST} + {1489302000 -14400 1 EDT} + {1509861600 -18000 0 EST} + {1520751600 -14400 1 EDT} + {1541311200 -18000 0 EST} + {1552201200 -14400 1 EDT} + {1572760800 -18000 0 EST} + {1583650800 -14400 1 EDT} + {1604210400 -18000 0 EST} + {1615705200 -14400 1 EDT} + {1636264800 -18000 0 EST} + {1647154800 -14400 1 EDT} + {1667714400 -18000 0 EST} + {1678604400 -14400 1 EDT} + {1699164000 -18000 0 EST} + {1710054000 -14400 1 EDT} + {1730613600 -18000 0 EST} + {1741503600 -14400 1 EDT} + {1762063200 -18000 0 EST} + {1772953200 -14400 1 EDT} + {1793512800 -18000 0 EST} + {1805007600 -14400 1 EDT} + {1825567200 -18000 0 EST} + {1836457200 -14400 1 EDT} + {1857016800 -18000 0 EST} + {1867906800 -14400 1 EDT} + {1888466400 -18000 0 EST} + {1899356400 -14400 1 EDT} + {1919916000 -18000 0 EST} + {1930806000 -14400 1 EDT} + {1951365600 -18000 0 EST} + {1962860400 -14400 1 EDT} + {1983420000 -18000 0 EST} + {1994310000 -14400 1 EDT} + {2014869600 -18000 0 EST} + {2025759600 -14400 1 EDT} + {2046319200 -18000 0 EST} + {2057209200 -14400 1 EDT} + {2077768800 -18000 0 EST} + {2088658800 -14400 1 EDT} + {2109218400 -18000 0 EST} + {2120108400 -14400 1 EDT} + {2140668000 -18000 0 EST} + {2152162800 -14400 1 EDT} + {2172722400 -18000 0 EST} + {2183612400 -14400 1 EDT} + {2204172000 -18000 0 EST} + {2215062000 -14400 1 EDT} + {2235621600 -18000 0 EST} + {2246511600 -14400 1 EDT} + {2267071200 -18000 0 EST} + {2277961200 -14400 1 EDT} + {2298520800 -18000 0 EST} + {2309410800 -14400 1 EDT} + {2329970400 -18000 0 EST} + {2341465200 -14400 1 EDT} + {2362024800 -18000 0 EST} + {2372914800 -14400 1 EDT} + {2393474400 -18000 0 EST} + {2404364400 -14400 1 EDT} + {2424924000 -18000 0 EST} + {2435814000 -14400 1 EDT} + {2456373600 -18000 0 EST} + {2467263600 -14400 1 EDT} + {2487823200 -18000 0 EST} + {2499318000 -14400 1 EDT} + {2519877600 -18000 0 EST} + {2530767600 -14400 1 EDT} + {2551327200 -18000 0 EST} + {2562217200 -14400 1 EDT} + {2582776800 -18000 0 EST} + {2593666800 -14400 1 EDT} + {2614226400 -18000 0 EST} + {2625116400 -14400 1 EDT} + {2645676000 -18000 0 EST} + {2656566000 -14400 1 EDT} + {2677125600 -18000 0 EST} + {2688620400 -14400 1 EDT} + {2709180000 -18000 0 EST} + {2720070000 -14400 1 EDT} + {2740629600 -18000 0 EST} + {2751519600 -14400 1 EDT} + {2772079200 -18000 0 EST} + {2782969200 -14400 1 EDT} + {2803528800 -18000 0 EST} + {2814418800 -14400 1 EDT} + {2834978400 -18000 0 EST} + {2846473200 -14400 1 EDT} + {2867032800 -18000 0 EST} + {2877922800 -14400 1 EDT} + {2898482400 -18000 0 EST} + {2909372400 -14400 1 EDT} + {2929932000 -18000 0 EST} + {2940822000 -14400 1 EDT} + {2961381600 -18000 0 EST} + {2972271600 -14400 1 EDT} + {2992831200 -18000 0 EST} + {3003721200 -14400 1 EDT} + {3024280800 -18000 0 EST} + {3035775600 -14400 1 EDT} + {3056335200 -18000 0 EST} + {3067225200 -14400 1 EDT} + {3087784800 -18000 0 EST} + {3098674800 -14400 1 EDT} + {3119234400 -18000 0 EST} + {3130124400 -14400 1 EDT} + {3150684000 -18000 0 EST} + {3161574000 -14400 1 EDT} + {3182133600 -18000 0 EST} + {3193023600 -14400 1 EDT} + {3213583200 -18000 0 EST} + {3225078000 -14400 1 EDT} + {3245637600 -18000 0 EST} + {3256527600 -14400 1 EDT} + {3277087200 -18000 0 EST} + {3287977200 -14400 1 EDT} + {3308536800 -18000 0 EST} + {3319426800 -14400 1 EDT} + {3339986400 -18000 0 EST} + {3350876400 -14400 1 EDT} + {3371436000 -18000 0 EST} + {3382930800 -14400 1 EDT} + {3403490400 -18000 0 EST} + {3414380400 -14400 1 EDT} + {3434940000 -18000 0 EST} + {3445830000 -14400 1 EDT} + {3466389600 -18000 0 EST} + {3477279600 -14400 1 EDT} + {3497839200 -18000 0 EST} + {3508729200 -14400 1 EDT} + {3529288800 -18000 0 EST} + {3540178800 -14400 1 EDT} + {3560738400 -18000 0 EST} + {3572233200 -14400 1 EDT} + {3592792800 -18000 0 EST} + {3603682800 -14400 1 EDT} + {3624242400 -18000 0 EST} + {3635132400 -14400 1 EDT} + {3655692000 -18000 0 EST} + {3666582000 -14400 1 EDT} + {3687141600 -18000 0 EST} + {3698031600 -14400 1 EDT} + {3718591200 -18000 0 EST} + {3730086000 -14400 1 EDT} + {3750645600 -18000 0 EST} + {3761535600 -14400 1 EDT} + {3782095200 -18000 0 EST} + {3792985200 -14400 1 EDT} + {3813544800 -18000 0 EST} + {3824434800 -14400 1 EDT} + {3844994400 -18000 0 EST} + {3855884400 -14400 1 EDT} + {3876444000 -18000 0 EST} + {3887334000 -14400 1 EDT} + {3907893600 -18000 0 EST} + {3919388400 -14400 1 EDT} + {3939948000 -18000 0 EST} + {3950838000 -14400 1 EDT} + {3971397600 -18000 0 EST} + {3982287600 -14400 1 EDT} + {4002847200 -18000 0 EST} + {4013737200 -14400 1 EDT} + {4034296800 -18000 0 EST} + {4045186800 -14400 1 EDT} + {4065746400 -18000 0 EST} + {4076636400 -14400 1 EDT} + {4097196000 -18000 0 EST} +} diff --git a/env/tcl/tcl8.6/tzdata/America/Tijuana b/env/tcl/tcl8.6/tzdata/America/Tijuana new file mode 100644 index 0000000..4b7ebe7 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/America/Tijuana @@ -0,0 +1,285 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:America/Tijuana) { + {-9223372036854775808 -28084 0 LMT} + {-1514736000 -25200 0 MST} + {-1451667600 -28800 0 PST} + {-1343062800 -25200 0 MST} + {-1234803600 -28800 0 PST} + {-1222963200 -25200 1 PDT} + {-1207242000 -28800 0 PST} + {-873820800 -25200 1 PWT} + {-769395600 -25200 1 PPT} + {-761677200 -28800 0 PST} + {-686073600 -25200 1 PDT} + {-661539600 -28800 0 PST} + {-504892800 -28800 0 PST} + {-495039600 -25200 1 PDT} + {-481734000 -28800 0 PST} + {-463590000 -25200 1 PDT} + {-450284400 -28800 0 PST} + {-431535600 -25200 1 PDT} + {-418230000 -28800 0 PST} + {-400086000 -25200 1 PDT} + {-386780400 -28800 0 PST} + {-368636400 -25200 1 PDT} + {-355330800 -28800 0 PST} + {-337186800 -25200 1 PDT} + {-323881200 -28800 0 PST} + {-305737200 -25200 1 PDT} + {-292431600 -28800 0 PST} + {-283968000 -28800 0 PST} + {189331200 -28800 0 PST} + {199274400 -25200 1 PDT} + {215600400 -28800 0 PST} + {230724000 -25200 1 PDT} + {247050000 -28800 0 PST} + {262778400 -25200 1 PDT} + {278499600 -28800 0 PST} + {294228000 -25200 1 PDT} + {309949200 -28800 0 PST} + {325677600 -25200 1 PDT} + {341398800 -28800 0 PST} + {357127200 -25200 1 PDT} + {372848400 -28800 0 PST} + {388576800 -25200 1 PDT} + {404902800 -28800 0 PST} + {420026400 -25200 1 PDT} + {436352400 -28800 0 PST} + {452080800 -25200 1 PDT} + {467802000 -28800 0 PST} + {483530400 -25200 1 PDT} + {499251600 -28800 0 PST} + {514980000 -25200 1 PDT} + {530701200 -28800 0 PST} + {544615200 -25200 1 PDT} + {562150800 -28800 0 PST} + {576064800 -25200 1 PDT} + {594205200 -28800 0 PST} + {607514400 -25200 1 PDT} + {625654800 -28800 0 PST} + {638964000 -25200 1 PDT} + {657104400 -28800 0 PST} + {671018400 -25200 1 PDT} + {688554000 -28800 0 PST} + {702468000 -25200 1 PDT} + {720003600 -28800 0 PST} + {733917600 -25200 1 PDT} + {752058000 -28800 0 PST} + {765367200 -25200 1 PDT} + {783507600 -28800 0 PST} + {796816800 -25200 1 PDT} + {814957200 -28800 0 PST} + {820483200 -28800 0 PST} + {828871200 -25200 1 PDT} + {846406800 -28800 0 PST} + {860320800 -25200 1 PDT} + {877856400 -28800 0 PST} + {891770400 -25200 1 PDT} + {909306000 -28800 0 PST} + {923220000 -25200 1 PDT} + {941360400 -28800 0 PST} + {954669600 -25200 1 PDT} + {972810000 -28800 0 PST} + {978336000 -28800 0 PST} + {986119200 -25200 1 PDT} + {1004259600 -28800 0 PST} + {1014192000 -28800 0 PST} + {1018173600 -25200 1 PDT} + {1035709200 -28800 0 PST} + {1049623200 -25200 1 PDT} + {1067158800 -28800 0 PST} + {1081072800 -25200 1 PDT} + {1099213200 -28800 0 PST} + {1112522400 -25200 1 PDT} + {1130662800 -28800 0 PST} + {1143972000 -25200 1 PDT} + {1162112400 -28800 0 PST} + {1175421600 -25200 1 PDT} + {1193562000 -28800 0 PST} + {1207476000 -25200 1 PDT} + {1225011600 -28800 0 PST} + {1238925600 -25200 1 PDT} + {1256461200 -28800 0 PST} + {1262332800 -28800 0 PST} + {1268560800 -25200 1 PDT} + {1289120400 -28800 0 PST} + {1300010400 -25200 1 PDT} + {1320570000 -28800 0 PST} + {1331460000 -25200 1 PDT} + {1352019600 -28800 0 PST} + {1362909600 -25200 1 PDT} + {1383469200 -28800 0 PST} + {1394359200 -25200 1 PDT} + {1414918800 -28800 0 PST} + {1425808800 -25200 1 PDT} + {1446368400 -28800 0 PST} + {1457863200 -25200 1 PDT} + {1478422800 -28800 0 PST} + {1489312800 -25200 1 PDT} + {1509872400 -28800 0 PST} + {1520762400 -25200 1 PDT} + {1541322000 -28800 0 PST} + {1552212000 -25200 1 PDT} + {1572771600 -28800 0 PST} + {1583661600 -25200 1 PDT} + {1604221200 -28800 0 PST} + {1615716000 -25200 1 PDT} + {1636275600 -28800 0 PST} + {1647165600 -25200 1 PDT} + {1667725200 -28800 0 PST} + {1678615200 -25200 1 PDT} + {1699174800 -28800 0 PST} + {1710064800 -25200 1 PDT} + {1730624400 -28800 0 PST} + {1741514400 -25200 1 PDT} + {1762074000 -28800 0 PST} + {1772964000 -25200 1 PDT} + {1793523600 -28800 0 PST} + {1805018400 -25200 1 PDT} + {1825578000 -28800 0 PST} + {1836468000 -25200 1 PDT} + {1857027600 -28800 0 PST} + {1867917600 -25200 1 PDT} + {1888477200 -28800 0 PST} + {1899367200 -25200 1 PDT} + {1919926800 -28800 0 PST} + {1930816800 -25200 1 PDT} + {1951376400 -28800 0 PST} + {1962871200 -25200 1 PDT} + {1983430800 -28800 0 PST} + {1994320800 -25200 1 PDT} + {2014880400 -28800 0 PST} + {2025770400 -25200 1 PDT} + {2046330000 -28800 0 PST} + {2057220000 -25200 1 PDT} + {2077779600 -28800 0 PST} + {2088669600 -25200 1 PDT} + {2109229200 -28800 0 PST} + {2120119200 -25200 1 PDT} + {2140678800 -28800 0 PST} + {2152173600 -25200 1 PDT} + {2172733200 -28800 0 PST} + {2183623200 -25200 1 PDT} + {2204182800 -28800 0 PST} + {2215072800 -25200 1 PDT} + {2235632400 -28800 0 PST} + {2246522400 -25200 1 PDT} + {2267082000 -28800 0 PST} + {2277972000 -25200 1 PDT} + {2298531600 -28800 0 PST} + {2309421600 -25200 1 PDT} + {2329981200 -28800 0 PST} + {2341476000 -25200 1 PDT} + {2362035600 -28800 0 PST} + {2372925600 -25200 1 PDT} + {2393485200 -28800 0 PST} + {2404375200 -25200 1 PDT} + {2424934800 -28800 0 PST} + {2435824800 -25200 1 PDT} + {2456384400 -28800 0 PST} + {2467274400 -25200 1 PDT} + {2487834000 -28800 0 PST} + {2499328800 -25200 1 PDT} + {2519888400 -28800 0 PST} + {2530778400 -25200 1 PDT} + {2551338000 -28800 0 PST} + {2562228000 -25200 1 PDT} + {2582787600 -28800 0 PST} + {2593677600 -25200 1 PDT} + {2614237200 -28800 0 PST} + {2625127200 -25200 1 PDT} + {2645686800 -28800 0 PST} + {2656576800 -25200 1 PDT} + {2677136400 -28800 0 PST} + {2688631200 -25200 1 PDT} + {2709190800 -28800 0 PST} + {2720080800 -25200 1 PDT} + {2740640400 -28800 0 PST} + {2751530400 -25200 1 PDT} + {2772090000 -28800 0 PST} + {2782980000 -25200 1 PDT} + {2803539600 -28800 0 PST} + {2814429600 -25200 1 PDT} + {2834989200 -28800 0 PST} + {2846484000 -25200 1 PDT} + {2867043600 -28800 0 PST} + {2877933600 -25200 1 PDT} + {2898493200 -28800 0 PST} + {2909383200 -25200 1 PDT} + {2929942800 -28800 0 PST} + {2940832800 -25200 1 PDT} + {2961392400 -28800 0 PST} + {2972282400 -25200 1 PDT} + {2992842000 -28800 0 PST} + {3003732000 -25200 1 PDT} + {3024291600 -28800 0 PST} + {3035786400 -25200 1 PDT} + {3056346000 -28800 0 PST} + {3067236000 -25200 1 PDT} + {3087795600 -28800 0 PST} + {3098685600 -25200 1 PDT} + {3119245200 -28800 0 PST} + {3130135200 -25200 1 PDT} + {3150694800 -28800 0 PST} + {3161584800 -25200 1 PDT} + {3182144400 -28800 0 PST} + {3193034400 -25200 1 PDT} + {3213594000 -28800 0 PST} + {3225088800 -25200 1 PDT} + {3245648400 -28800 0 PST} + {3256538400 -25200 1 PDT} + {3277098000 -28800 0 PST} + {3287988000 -25200 1 PDT} + {3308547600 -28800 0 PST} + {3319437600 -25200 1 PDT} + {3339997200 -28800 0 PST} + {3350887200 -25200 1 PDT} + {3371446800 -28800 0 PST} + {3382941600 -25200 1 PDT} + {3403501200 -28800 0 PST} + {3414391200 -25200 1 PDT} + {3434950800 -28800 0 PST} + {3445840800 -25200 1 PDT} + {3466400400 -28800 0 PST} + {3477290400 -25200 1 PDT} + {3497850000 -28800 0 PST} + {3508740000 -25200 1 PDT} + {3529299600 -28800 0 PST} + {3540189600 -25200 1 PDT} + {3560749200 -28800 0 PST} + {3572244000 -25200 1 PDT} + {3592803600 -28800 0 PST} + {3603693600 -25200 1 PDT} + {3624253200 -28800 0 PST} + {3635143200 -25200 1 PDT} + {3655702800 -28800 0 PST} + {3666592800 -25200 1 PDT} + {3687152400 -28800 0 PST} + {3698042400 -25200 1 PDT} + {3718602000 -28800 0 PST} + {3730096800 -25200 1 PDT} + {3750656400 -28800 0 PST} + {3761546400 -25200 1 PDT} + {3782106000 -28800 0 PST} + {3792996000 -25200 1 PDT} + {3813555600 -28800 0 PST} + {3824445600 -25200 1 PDT} + {3845005200 -28800 0 PST} + {3855895200 -25200 1 PDT} + {3876454800 -28800 0 PST} + {3887344800 -25200 1 PDT} + {3907904400 -28800 0 PST} + {3919399200 -25200 1 PDT} + {3939958800 -28800 0 PST} + {3950848800 -25200 1 PDT} + {3971408400 -28800 0 PST} + {3982298400 -25200 1 PDT} + {4002858000 -28800 0 PST} + {4013748000 -25200 1 PDT} + {4034307600 -28800 0 PST} + {4045197600 -25200 1 PDT} + {4065757200 -28800 0 PST} + {4076647200 -25200 1 PDT} + {4097206800 -28800 0 PST} +} diff --git a/env/tcl/tcl8.6/tzdata/America/Toronto b/env/tcl/tcl8.6/tzdata/America/Toronto new file mode 100644 index 0000000..09bf786 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/America/Toronto @@ -0,0 +1,365 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:America/Toronto) { + {-9223372036854775808 -19052 0 LMT} + {-2366736148 -18000 0 EST} + {-1632070800 -14400 1 EDT} + {-1615140000 -18000 0 EST} + {-1609441200 -18000 0 EST} + {-1601753400 -14400 1 EDT} + {-1583697600 -18000 0 EST} + {-1567357200 -14400 1 EDT} + {-1554667200 -18000 0 EST} + {-1534698000 -14400 1 EDT} + {-1524074400 -18000 0 EST} + {-1503248400 -14400 1 EDT} + {-1492365600 -18000 0 EST} + {-1471798800 -14400 1 EDT} + {-1460916000 -18000 0 EST} + {-1440954000 -14400 1 EDT} + {-1428861600 -18000 0 EST} + {-1409504400 -14400 1 EDT} + {-1397412000 -18000 0 EST} + {-1378054800 -14400 1 EDT} + {-1365962400 -18000 0 EST} + {-1346605200 -14400 1 EDT} + {-1333908000 -18000 0 EST} + {-1315155600 -14400 1 EDT} + {-1301853600 -18000 0 EST} + {-1283706000 -14400 1 EDT} + {-1270404000 -18000 0 EST} + {-1252256400 -14400 1 EDT} + {-1238954400 -18000 0 EST} + {-1220806800 -14400 1 EDT} + {-1207504800 -18000 0 EST} + {-1188752400 -14400 1 EDT} + {-1176055200 -18000 0 EST} + {-1157302800 -14400 1 EDT} + {-1144000800 -18000 0 EST} + {-1125853200 -14400 1 EDT} + {-1112551200 -18000 0 EST} + {-1094403600 -14400 1 EDT} + {-1081101600 -18000 0 EST} + {-1062954000 -14400 1 EDT} + {-1049652000 -18000 0 EST} + {-1031504400 -14400 1 EDT} + {-1018202400 -18000 0 EST} + {-1000054800 -14400 1 EDT} + {-986752800 -18000 0 EST} + {-968000400 -14400 1 EDT} + {-955303200 -18000 0 EST} + {-936550800 -14400 1 EDT} + {-880218000 -14400 0 EWT} + {-769395600 -14400 1 EPT} + {-765396000 -18000 0 EST} + {-757364400 -18000 0 EST} + {-747248400 -14400 1 EDT} + {-733946400 -18000 0 EST} + {-715806000 -14400 1 EDT} + {-702504000 -18000 0 EST} + {-684356400 -14400 1 EDT} + {-671054400 -18000 0 EST} + {-652906800 -14400 1 EDT} + {-634161600 -18000 0 EST} + {-620845200 -14400 1 EDT} + {-602704800 -18000 0 EST} + {-589395600 -14400 1 EDT} + {-576093600 -18000 0 EST} + {-557946000 -14400 1 EDT} + {-544644000 -18000 0 EST} + {-526496400 -14400 1 EDT} + {-513194400 -18000 0 EST} + {-495046800 -14400 1 EDT} + {-481744800 -18000 0 EST} + {-463597200 -14400 1 EDT} + {-450295200 -18000 0 EST} + {-431542800 -14400 1 EDT} + {-418240800 -18000 0 EST} + {-400093200 -14400 1 EDT} + {-384372000 -18000 0 EST} + {-368643600 -14400 1 EDT} + {-352922400 -18000 0 EST} + {-337194000 -14400 1 EDT} + {-321472800 -18000 0 EST} + {-305744400 -14400 1 EDT} + {-289418400 -18000 0 EST} + {-273690000 -14400 1 EDT} + {-257968800 -18000 0 EST} + {-242240400 -14400 1 EDT} + {-226519200 -18000 0 EST} + {-210790800 -14400 1 EDT} + {-195069600 -18000 0 EST} + {-179341200 -14400 1 EDT} + {-163620000 -18000 0 EST} + {-147891600 -14400 1 EDT} + {-131565600 -18000 0 EST} + {-116442000 -14400 1 EDT} + {-100116000 -18000 0 EST} + {-84387600 -14400 1 EDT} + {-68666400 -18000 0 EST} + {-52938000 -14400 1 EDT} + {-37216800 -18000 0 EST} + {-21488400 -14400 1 EDT} + {-5767200 -18000 0 EST} + {9961200 -14400 1 EDT} + {25682400 -18000 0 EST} + {41410800 -14400 1 EDT} + {57736800 -18000 0 EST} + {73465200 -14400 1 EDT} + {89186400 -18000 0 EST} + {104914800 -14400 1 EDT} + {120636000 -18000 0 EST} + {126248400 -18000 0 EST} + {136364400 -14400 1 EDT} + {152085600 -18000 0 EST} + {167814000 -14400 1 EDT} + {183535200 -18000 0 EST} + {199263600 -14400 1 EDT} + {215589600 -18000 0 EST} + {230713200 -14400 1 EDT} + {247039200 -18000 0 EST} + {262767600 -14400 1 EDT} + {278488800 -18000 0 EST} + {294217200 -14400 1 EDT} + {309938400 -18000 0 EST} + {325666800 -14400 1 EDT} + {341388000 -18000 0 EST} + {357116400 -14400 1 EDT} + {372837600 -18000 0 EST} + {388566000 -14400 1 EDT} + {404892000 -18000 0 EST} + {420015600 -14400 1 EDT} + {436341600 -18000 0 EST} + {452070000 -14400 1 EDT} + {467791200 -18000 0 EST} + {483519600 -14400 1 EDT} + {499240800 -18000 0 EST} + {514969200 -14400 1 EDT} + {530690400 -18000 0 EST} + {544604400 -14400 1 EDT} + {562140000 -18000 0 EST} + {576054000 -14400 1 EDT} + {594194400 -18000 0 EST} + {607503600 -14400 1 EDT} + {625644000 -18000 0 EST} + {638953200 -14400 1 EDT} + {657093600 -18000 0 EST} + {671007600 -14400 1 EDT} + {688543200 -18000 0 EST} + {702457200 -14400 1 EDT} + {719992800 -18000 0 EST} + {733906800 -14400 1 EDT} + {752047200 -18000 0 EST} + {765356400 -14400 1 EDT} + {783496800 -18000 0 EST} + {796806000 -14400 1 EDT} + {814946400 -18000 0 EST} + {828860400 -14400 1 EDT} + {846396000 -18000 0 EST} + {860310000 -14400 1 EDT} + {877845600 -18000 0 EST} + {891759600 -14400 1 EDT} + {909295200 -18000 0 EST} + {923209200 -14400 1 EDT} + {941349600 -18000 0 EST} + {954658800 -14400 1 EDT} + {972799200 -18000 0 EST} + {986108400 -14400 1 EDT} + {1004248800 -18000 0 EST} + {1018162800 -14400 1 EDT} + {1035698400 -18000 0 EST} + {1049612400 -14400 1 EDT} + {1067148000 -18000 0 EST} + {1081062000 -14400 1 EDT} + {1099202400 -18000 0 EST} + {1112511600 -14400 1 EDT} + {1130652000 -18000 0 EST} + {1143961200 -14400 1 EDT} + {1162101600 -18000 0 EST} + {1173596400 -14400 1 EDT} + {1194156000 -18000 0 EST} + {1205046000 -14400 1 EDT} + {1225605600 -18000 0 EST} + {1236495600 -14400 1 EDT} + {1257055200 -18000 0 EST} + {1268550000 -14400 1 EDT} + {1289109600 -18000 0 EST} + {1299999600 -14400 1 EDT} + {1320559200 -18000 0 EST} + {1331449200 -14400 1 EDT} + {1352008800 -18000 0 EST} + {1362898800 -14400 1 EDT} + {1383458400 -18000 0 EST} + {1394348400 -14400 1 EDT} + {1414908000 -18000 0 EST} + {1425798000 -14400 1 EDT} + {1446357600 -18000 0 EST} + {1457852400 -14400 1 EDT} + {1478412000 -18000 0 EST} + {1489302000 -14400 1 EDT} + {1509861600 -18000 0 EST} + {1520751600 -14400 1 EDT} + {1541311200 -18000 0 EST} + {1552201200 -14400 1 EDT} + {1572760800 -18000 0 EST} + {1583650800 -14400 1 EDT} + {1604210400 -18000 0 EST} + {1615705200 -14400 1 EDT} + {1636264800 -18000 0 EST} + {1647154800 -14400 1 EDT} + {1667714400 -18000 0 EST} + {1678604400 -14400 1 EDT} + {1699164000 -18000 0 EST} + {1710054000 -14400 1 EDT} + {1730613600 -18000 0 EST} + {1741503600 -14400 1 EDT} + {1762063200 -18000 0 EST} + {1772953200 -14400 1 EDT} + {1793512800 -18000 0 EST} + {1805007600 -14400 1 EDT} + {1825567200 -18000 0 EST} + {1836457200 -14400 1 EDT} + {1857016800 -18000 0 EST} + {1867906800 -14400 1 EDT} + {1888466400 -18000 0 EST} + {1899356400 -14400 1 EDT} + {1919916000 -18000 0 EST} + {1930806000 -14400 1 EDT} + {1951365600 -18000 0 EST} + {1962860400 -14400 1 EDT} + {1983420000 -18000 0 EST} + {1994310000 -14400 1 EDT} + {2014869600 -18000 0 EST} + {2025759600 -14400 1 EDT} + {2046319200 -18000 0 EST} + {2057209200 -14400 1 EDT} + {2077768800 -18000 0 EST} + {2088658800 -14400 1 EDT} + {2109218400 -18000 0 EST} + {2120108400 -14400 1 EDT} + {2140668000 -18000 0 EST} + {2152162800 -14400 1 EDT} + {2172722400 -18000 0 EST} + {2183612400 -14400 1 EDT} + {2204172000 -18000 0 EST} + {2215062000 -14400 1 EDT} + {2235621600 -18000 0 EST} + {2246511600 -14400 1 EDT} + {2267071200 -18000 0 EST} + {2277961200 -14400 1 EDT} + {2298520800 -18000 0 EST} + {2309410800 -14400 1 EDT} + {2329970400 -18000 0 EST} + {2341465200 -14400 1 EDT} + {2362024800 -18000 0 EST} + {2372914800 -14400 1 EDT} + {2393474400 -18000 0 EST} + {2404364400 -14400 1 EDT} + {2424924000 -18000 0 EST} + {2435814000 -14400 1 EDT} + {2456373600 -18000 0 EST} + {2467263600 -14400 1 EDT} + {2487823200 -18000 0 EST} + {2499318000 -14400 1 EDT} + {2519877600 -18000 0 EST} + {2530767600 -14400 1 EDT} + {2551327200 -18000 0 EST} + {2562217200 -14400 1 EDT} + {2582776800 -18000 0 EST} + {2593666800 -14400 1 EDT} + {2614226400 -18000 0 EST} + {2625116400 -14400 1 EDT} + {2645676000 -18000 0 EST} + {2656566000 -14400 1 EDT} + {2677125600 -18000 0 EST} + {2688620400 -14400 1 EDT} + {2709180000 -18000 0 EST} + {2720070000 -14400 1 EDT} + {2740629600 -18000 0 EST} + {2751519600 -14400 1 EDT} + {2772079200 -18000 0 EST} + {2782969200 -14400 1 EDT} + {2803528800 -18000 0 EST} + {2814418800 -14400 1 EDT} + {2834978400 -18000 0 EST} + {2846473200 -14400 1 EDT} + {2867032800 -18000 0 EST} + {2877922800 -14400 1 EDT} + {2898482400 -18000 0 EST} + {2909372400 -14400 1 EDT} + {2929932000 -18000 0 EST} + {2940822000 -14400 1 EDT} + {2961381600 -18000 0 EST} + {2972271600 -14400 1 EDT} + {2992831200 -18000 0 EST} + {3003721200 -14400 1 EDT} + {3024280800 -18000 0 EST} + {3035775600 -14400 1 EDT} + {3056335200 -18000 0 EST} + {3067225200 -14400 1 EDT} + {3087784800 -18000 0 EST} + {3098674800 -14400 1 EDT} + {3119234400 -18000 0 EST} + {3130124400 -14400 1 EDT} + {3150684000 -18000 0 EST} + {3161574000 -14400 1 EDT} + {3182133600 -18000 0 EST} + {3193023600 -14400 1 EDT} + {3213583200 -18000 0 EST} + {3225078000 -14400 1 EDT} + {3245637600 -18000 0 EST} + {3256527600 -14400 1 EDT} + {3277087200 -18000 0 EST} + {3287977200 -14400 1 EDT} + {3308536800 -18000 0 EST} + {3319426800 -14400 1 EDT} + {3339986400 -18000 0 EST} + {3350876400 -14400 1 EDT} + {3371436000 -18000 0 EST} + {3382930800 -14400 1 EDT} + {3403490400 -18000 0 EST} + {3414380400 -14400 1 EDT} + {3434940000 -18000 0 EST} + {3445830000 -14400 1 EDT} + {3466389600 -18000 0 EST} + {3477279600 -14400 1 EDT} + {3497839200 -18000 0 EST} + {3508729200 -14400 1 EDT} + {3529288800 -18000 0 EST} + {3540178800 -14400 1 EDT} + {3560738400 -18000 0 EST} + {3572233200 -14400 1 EDT} + {3592792800 -18000 0 EST} + {3603682800 -14400 1 EDT} + {3624242400 -18000 0 EST} + {3635132400 -14400 1 EDT} + {3655692000 -18000 0 EST} + {3666582000 -14400 1 EDT} + {3687141600 -18000 0 EST} + {3698031600 -14400 1 EDT} + {3718591200 -18000 0 EST} + {3730086000 -14400 1 EDT} + {3750645600 -18000 0 EST} + {3761535600 -14400 1 EDT} + {3782095200 -18000 0 EST} + {3792985200 -14400 1 EDT} + {3813544800 -18000 0 EST} + {3824434800 -14400 1 EDT} + {3844994400 -18000 0 EST} + {3855884400 -14400 1 EDT} + {3876444000 -18000 0 EST} + {3887334000 -14400 1 EDT} + {3907893600 -18000 0 EST} + {3919388400 -14400 1 EDT} + {3939948000 -18000 0 EST} + {3950838000 -14400 1 EDT} + {3971397600 -18000 0 EST} + {3982287600 -14400 1 EDT} + {4002847200 -18000 0 EST} + {4013737200 -14400 1 EDT} + {4034296800 -18000 0 EST} + {4045186800 -14400 1 EDT} + {4065746400 -18000 0 EST} + {4076636400 -14400 1 EDT} + {4097196000 -18000 0 EST} +} diff --git a/env/tcl/tcl8.6/tzdata/America/Tortola b/env/tcl/tcl8.6/tzdata/America/Tortola new file mode 100644 index 0000000..aa6f655 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/America/Tortola @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(America/Port_of_Spain)]} { + LoadTimeZoneFile America/Port_of_Spain +} +set TZData(:America/Tortola) $TZData(:America/Port_of_Spain) diff --git a/env/tcl/tcl8.6/tzdata/America/Vancouver b/env/tcl/tcl8.6/tzdata/America/Vancouver new file mode 100644 index 0000000..aef639a --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/America/Vancouver @@ -0,0 +1,320 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:America/Vancouver) { + {-9223372036854775808 -29548 0 LMT} + {-2713880852 -28800 0 PST} + {-1632060000 -25200 1 PDT} + {-1615129200 -28800 0 PST} + {-880207200 -25200 1 PWT} + {-769395600 -25200 1 PPT} + {-765385200 -28800 0 PST} + {-747237600 -25200 1 PDT} + {-732726000 -28800 0 PST} + {-715788000 -25200 1 PDT} + {-702486000 -28800 0 PST} + {-684338400 -25200 1 PDT} + {-671036400 -28800 0 PST} + {-652888800 -25200 1 PDT} + {-639586800 -28800 0 PST} + {-620834400 -25200 1 PDT} + {-608137200 -28800 0 PST} + {-589384800 -25200 1 PDT} + {-576082800 -28800 0 PST} + {-557935200 -25200 1 PDT} + {-544633200 -28800 0 PST} + {-526485600 -25200 1 PDT} + {-513183600 -28800 0 PST} + {-495036000 -25200 1 PDT} + {-481734000 -28800 0 PST} + {-463586400 -25200 1 PDT} + {-450284400 -28800 0 PST} + {-431532000 -25200 1 PDT} + {-418230000 -28800 0 PST} + {-400082400 -25200 1 PDT} + {-386780400 -28800 0 PST} + {-368632800 -25200 1 PDT} + {-355330800 -28800 0 PST} + {-337183200 -25200 1 PDT} + {-323881200 -28800 0 PST} + {-305733600 -25200 1 PDT} + {-292431600 -28800 0 PST} + {-273679200 -25200 1 PDT} + {-260982000 -28800 0 PST} + {-242229600 -25200 1 PDT} + {-226508400 -28800 0 PST} + {-210780000 -25200 1 PDT} + {-195058800 -28800 0 PST} + {-179330400 -25200 1 PDT} + {-163609200 -28800 0 PST} + {-147880800 -25200 1 PDT} + {-131554800 -28800 0 PST} + {-116431200 -25200 1 PDT} + {-100105200 -28800 0 PST} + {-84376800 -25200 1 PDT} + {-68655600 -28800 0 PST} + {-52927200 -25200 1 PDT} + {-37206000 -28800 0 PST} + {-21477600 -25200 1 PDT} + {-5756400 -28800 0 PST} + {9972000 -25200 1 PDT} + {25693200 -28800 0 PST} + {41421600 -25200 1 PDT} + {57747600 -28800 0 PST} + {73476000 -25200 1 PDT} + {89197200 -28800 0 PST} + {104925600 -25200 1 PDT} + {120646800 -28800 0 PST} + {136375200 -25200 1 PDT} + {152096400 -28800 0 PST} + {167824800 -25200 1 PDT} + {183546000 -28800 0 PST} + {199274400 -25200 1 PDT} + {215600400 -28800 0 PST} + {230724000 -25200 1 PDT} + {247050000 -28800 0 PST} + {262778400 -25200 1 PDT} + {278499600 -28800 0 PST} + {294228000 -25200 1 PDT} + {309949200 -28800 0 PST} + {325677600 -25200 1 PDT} + {341398800 -28800 0 PST} + {357127200 -25200 1 PDT} + {372848400 -28800 0 PST} + {388576800 -25200 1 PDT} + {404902800 -28800 0 PST} + {420026400 -25200 1 PDT} + {436352400 -28800 0 PST} + {452080800 -25200 1 PDT} + {467802000 -28800 0 PST} + {483530400 -25200 1 PDT} + {499251600 -28800 0 PST} + {514980000 -25200 1 PDT} + {530701200 -28800 0 PST} + {536486400 -28800 0 PST} + {544615200 -25200 1 PDT} + {562150800 -28800 0 PST} + {576064800 -25200 1 PDT} + {594205200 -28800 0 PST} + {607514400 -25200 1 PDT} + {625654800 -28800 0 PST} + {638964000 -25200 1 PDT} + {657104400 -28800 0 PST} + {671018400 -25200 1 PDT} + {688554000 -28800 0 PST} + {702468000 -25200 1 PDT} + {720003600 -28800 0 PST} + {733917600 -25200 1 PDT} + {752058000 -28800 0 PST} + {765367200 -25200 1 PDT} + {783507600 -28800 0 PST} + {796816800 -25200 1 PDT} + {814957200 -28800 0 PST} + {828871200 -25200 1 PDT} + {846406800 -28800 0 PST} + {860320800 -25200 1 PDT} + {877856400 -28800 0 PST} + {891770400 -25200 1 PDT} + {909306000 -28800 0 PST} + {923220000 -25200 1 PDT} + {941360400 -28800 0 PST} + {954669600 -25200 1 PDT} + {972810000 -28800 0 PST} + {986119200 -25200 1 PDT} + {1004259600 -28800 0 PST} + {1018173600 -25200 1 PDT} + {1035709200 -28800 0 PST} + {1049623200 -25200 1 PDT} + {1067158800 -28800 0 PST} + {1081072800 -25200 1 PDT} + {1099213200 -28800 0 PST} + {1112522400 -25200 1 PDT} + {1130662800 -28800 0 PST} + {1143972000 -25200 1 PDT} + {1162112400 -28800 0 PST} + {1173607200 -25200 1 PDT} + {1194166800 -28800 0 PST} + {1205056800 -25200 1 PDT} + {1225616400 -28800 0 PST} + {1236506400 -25200 1 PDT} + {1257066000 -28800 0 PST} + {1268560800 -25200 1 PDT} + {1289120400 -28800 0 PST} + {1300010400 -25200 1 PDT} + {1320570000 -28800 0 PST} + {1331460000 -25200 1 PDT} + {1352019600 -28800 0 PST} + {1362909600 -25200 1 PDT} + {1383469200 -28800 0 PST} + {1394359200 -25200 1 PDT} + {1414918800 -28800 0 PST} + {1425808800 -25200 1 PDT} + {1446368400 -28800 0 PST} + {1457863200 -25200 1 PDT} + {1478422800 -28800 0 PST} + {1489312800 -25200 1 PDT} + {1509872400 -28800 0 PST} + {1520762400 -25200 1 PDT} + {1541322000 -28800 0 PST} + {1552212000 -25200 1 PDT} + {1572771600 -28800 0 PST} + {1583661600 -25200 1 PDT} + {1604221200 -28800 0 PST} + {1615716000 -25200 1 PDT} + {1636275600 -28800 0 PST} + {1647165600 -25200 1 PDT} + {1667725200 -28800 0 PST} + {1678615200 -25200 1 PDT} + {1699174800 -28800 0 PST} + {1710064800 -25200 1 PDT} + {1730624400 -28800 0 PST} + {1741514400 -25200 1 PDT} + {1762074000 -28800 0 PST} + {1772964000 -25200 1 PDT} + {1793523600 -28800 0 PST} + {1805018400 -25200 1 PDT} + {1825578000 -28800 0 PST} + {1836468000 -25200 1 PDT} + {1857027600 -28800 0 PST} + {1867917600 -25200 1 PDT} + {1888477200 -28800 0 PST} + {1899367200 -25200 1 PDT} + {1919926800 -28800 0 PST} + {1930816800 -25200 1 PDT} + {1951376400 -28800 0 PST} + {1962871200 -25200 1 PDT} + {1983430800 -28800 0 PST} + {1994320800 -25200 1 PDT} + {2014880400 -28800 0 PST} + {2025770400 -25200 1 PDT} + {2046330000 -28800 0 PST} + {2057220000 -25200 1 PDT} + {2077779600 -28800 0 PST} + {2088669600 -25200 1 PDT} + {2109229200 -28800 0 PST} + {2120119200 -25200 1 PDT} + {2140678800 -28800 0 PST} + {2152173600 -25200 1 PDT} + {2172733200 -28800 0 PST} + {2183623200 -25200 1 PDT} + {2204182800 -28800 0 PST} + {2215072800 -25200 1 PDT} + {2235632400 -28800 0 PST} + {2246522400 -25200 1 PDT} + {2267082000 -28800 0 PST} + {2277972000 -25200 1 PDT} + {2298531600 -28800 0 PST} + {2309421600 -25200 1 PDT} + {2329981200 -28800 0 PST} + {2341476000 -25200 1 PDT} + {2362035600 -28800 0 PST} + {2372925600 -25200 1 PDT} + {2393485200 -28800 0 PST} + {2404375200 -25200 1 PDT} + {2424934800 -28800 0 PST} + {2435824800 -25200 1 PDT} + {2456384400 -28800 0 PST} + {2467274400 -25200 1 PDT} + {2487834000 -28800 0 PST} + {2499328800 -25200 1 PDT} + {2519888400 -28800 0 PST} + {2530778400 -25200 1 PDT} + {2551338000 -28800 0 PST} + {2562228000 -25200 1 PDT} + {2582787600 -28800 0 PST} + {2593677600 -25200 1 PDT} + {2614237200 -28800 0 PST} + {2625127200 -25200 1 PDT} + {2645686800 -28800 0 PST} + {2656576800 -25200 1 PDT} + {2677136400 -28800 0 PST} + {2688631200 -25200 1 PDT} + {2709190800 -28800 0 PST} + {2720080800 -25200 1 PDT} + {2740640400 -28800 0 PST} + {2751530400 -25200 1 PDT} + {2772090000 -28800 0 PST} + {2782980000 -25200 1 PDT} + {2803539600 -28800 0 PST} + {2814429600 -25200 1 PDT} + {2834989200 -28800 0 PST} + {2846484000 -25200 1 PDT} + {2867043600 -28800 0 PST} + {2877933600 -25200 1 PDT} + {2898493200 -28800 0 PST} + {2909383200 -25200 1 PDT} + {2929942800 -28800 0 PST} + {2940832800 -25200 1 PDT} + {2961392400 -28800 0 PST} + {2972282400 -25200 1 PDT} + {2992842000 -28800 0 PST} + {3003732000 -25200 1 PDT} + {3024291600 -28800 0 PST} + {3035786400 -25200 1 PDT} + {3056346000 -28800 0 PST} + {3067236000 -25200 1 PDT} + {3087795600 -28800 0 PST} + {3098685600 -25200 1 PDT} + {3119245200 -28800 0 PST} + {3130135200 -25200 1 PDT} + {3150694800 -28800 0 PST} + {3161584800 -25200 1 PDT} + {3182144400 -28800 0 PST} + {3193034400 -25200 1 PDT} + {3213594000 -28800 0 PST} + {3225088800 -25200 1 PDT} + {3245648400 -28800 0 PST} + {3256538400 -25200 1 PDT} + {3277098000 -28800 0 PST} + {3287988000 -25200 1 PDT} + {3308547600 -28800 0 PST} + {3319437600 -25200 1 PDT} + {3339997200 -28800 0 PST} + {3350887200 -25200 1 PDT} + {3371446800 -28800 0 PST} + {3382941600 -25200 1 PDT} + {3403501200 -28800 0 PST} + {3414391200 -25200 1 PDT} + {3434950800 -28800 0 PST} + {3445840800 -25200 1 PDT} + {3466400400 -28800 0 PST} + {3477290400 -25200 1 PDT} + {3497850000 -28800 0 PST} + {3508740000 -25200 1 PDT} + {3529299600 -28800 0 PST} + {3540189600 -25200 1 PDT} + {3560749200 -28800 0 PST} + {3572244000 -25200 1 PDT} + {3592803600 -28800 0 PST} + {3603693600 -25200 1 PDT} + {3624253200 -28800 0 PST} + {3635143200 -25200 1 PDT} + {3655702800 -28800 0 PST} + {3666592800 -25200 1 PDT} + {3687152400 -28800 0 PST} + {3698042400 -25200 1 PDT} + {3718602000 -28800 0 PST} + {3730096800 -25200 1 PDT} + {3750656400 -28800 0 PST} + {3761546400 -25200 1 PDT} + {3782106000 -28800 0 PST} + {3792996000 -25200 1 PDT} + {3813555600 -28800 0 PST} + {3824445600 -25200 1 PDT} + {3845005200 -28800 0 PST} + {3855895200 -25200 1 PDT} + {3876454800 -28800 0 PST} + {3887344800 -25200 1 PDT} + {3907904400 -28800 0 PST} + {3919399200 -25200 1 PDT} + {3939958800 -28800 0 PST} + {3950848800 -25200 1 PDT} + {3971408400 -28800 0 PST} + {3982298400 -25200 1 PDT} + {4002858000 -28800 0 PST} + {4013748000 -25200 1 PDT} + {4034307600 -28800 0 PST} + {4045197600 -25200 1 PDT} + {4065757200 -28800 0 PST} + {4076647200 -25200 1 PDT} + {4097206800 -28800 0 PST} +} diff --git a/env/tcl/tcl8.6/tzdata/America/Virgin b/env/tcl/tcl8.6/tzdata/America/Virgin new file mode 100644 index 0000000..c267e5b --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/America/Virgin @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(America/Port_of_Spain)]} { + LoadTimeZoneFile America/Port_of_Spain +} +set TZData(:America/Virgin) $TZData(:America/Port_of_Spain) diff --git a/env/tcl/tcl8.6/tzdata/America/Whitehorse b/env/tcl/tcl8.6/tzdata/America/Whitehorse new file mode 100644 index 0000000..1d61093 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/America/Whitehorse @@ -0,0 +1,256 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:America/Whitehorse) { + {-9223372036854775808 -32412 0 LMT} + {-2188997988 -32400 0 YST} + {-1632056400 -28800 1 YDT} + {-1615125600 -32400 0 YST} + {-1596978000 -28800 1 YDT} + {-1583164800 -32400 0 YST} + {-880203600 -28800 1 YWT} + {-769395600 -28800 1 YPT} + {-765381600 -32400 0 YST} + {-147884400 -25200 1 YDDT} + {-131554800 -32400 0 YST} + {315561600 -28800 0 PST} + {325677600 -25200 1 PDT} + {341398800 -28800 0 PST} + {357127200 -25200 1 PDT} + {372848400 -28800 0 PST} + {388576800 -25200 1 PDT} + {404902800 -28800 0 PST} + {420026400 -25200 1 PDT} + {436352400 -28800 0 PST} + {452080800 -25200 1 PDT} + {467802000 -28800 0 PST} + {483530400 -25200 1 PDT} + {499251600 -28800 0 PST} + {514980000 -25200 1 PDT} + {530701200 -28800 0 PST} + {544615200 -25200 1 PDT} + {562150800 -28800 0 PST} + {576064800 -25200 1 PDT} + {594205200 -28800 0 PST} + {607514400 -25200 1 PDT} + {625654800 -28800 0 PST} + {638964000 -25200 1 PDT} + {657104400 -28800 0 PST} + {671018400 -25200 1 PDT} + {688554000 -28800 0 PST} + {702468000 -25200 1 PDT} + {720003600 -28800 0 PST} + {733917600 -25200 1 PDT} + {752058000 -28800 0 PST} + {765367200 -25200 1 PDT} + {783507600 -28800 0 PST} + {796816800 -25200 1 PDT} + {814957200 -28800 0 PST} + {828871200 -25200 1 PDT} + {846406800 -28800 0 PST} + {860320800 -25200 1 PDT} + {877856400 -28800 0 PST} + {891770400 -25200 1 PDT} + {909306000 -28800 0 PST} + {923220000 -25200 1 PDT} + {941360400 -28800 0 PST} + {954669600 -25200 1 PDT} + {972810000 -28800 0 PST} + {986119200 -25200 1 PDT} + {1004259600 -28800 0 PST} + {1018173600 -25200 1 PDT} + {1035709200 -28800 0 PST} + {1049623200 -25200 1 PDT} + {1067158800 -28800 0 PST} + {1081072800 -25200 1 PDT} + {1099213200 -28800 0 PST} + {1112522400 -25200 1 PDT} + {1130662800 -28800 0 PST} + {1143972000 -25200 1 PDT} + {1162112400 -28800 0 PST} + {1173607200 -25200 1 PDT} + {1194166800 -28800 0 PST} + {1205056800 -25200 1 PDT} + {1225616400 -28800 0 PST} + {1236506400 -25200 1 PDT} + {1257066000 -28800 0 PST} + {1268560800 -25200 1 PDT} + {1289120400 -28800 0 PST} + {1300010400 -25200 1 PDT} + {1320570000 -28800 0 PST} + {1331460000 -25200 1 PDT} + {1352019600 -28800 0 PST} + {1362909600 -25200 1 PDT} + {1383469200 -28800 0 PST} + {1394359200 -25200 1 PDT} + {1414918800 -28800 0 PST} + {1425808800 -25200 1 PDT} + {1446368400 -28800 0 PST} + {1457863200 -25200 1 PDT} + {1478422800 -28800 0 PST} + {1489312800 -25200 1 PDT} + {1509872400 -28800 0 PST} + {1520762400 -25200 1 PDT} + {1541322000 -28800 0 PST} + {1552212000 -25200 1 PDT} + {1572771600 -28800 0 PST} + {1583661600 -25200 1 PDT} + {1604221200 -28800 0 PST} + {1615716000 -25200 1 PDT} + {1636275600 -28800 0 PST} + {1647165600 -25200 1 PDT} + {1667725200 -28800 0 PST} + {1678615200 -25200 1 PDT} + {1699174800 -28800 0 PST} + {1710064800 -25200 1 PDT} + {1730624400 -28800 0 PST} + {1741514400 -25200 1 PDT} + {1762074000 -28800 0 PST} + {1772964000 -25200 1 PDT} + {1793523600 -28800 0 PST} + {1805018400 -25200 1 PDT} + {1825578000 -28800 0 PST} + {1836468000 -25200 1 PDT} + {1857027600 -28800 0 PST} + {1867917600 -25200 1 PDT} + {1888477200 -28800 0 PST} + {1899367200 -25200 1 PDT} + {1919926800 -28800 0 PST} + {1930816800 -25200 1 PDT} + {1951376400 -28800 0 PST} + {1962871200 -25200 1 PDT} + {1983430800 -28800 0 PST} + {1994320800 -25200 1 PDT} + {2014880400 -28800 0 PST} + {2025770400 -25200 1 PDT} + {2046330000 -28800 0 PST} + {2057220000 -25200 1 PDT} + {2077779600 -28800 0 PST} + {2088669600 -25200 1 PDT} + {2109229200 -28800 0 PST} + {2120119200 -25200 1 PDT} + {2140678800 -28800 0 PST} + {2152173600 -25200 1 PDT} + {2172733200 -28800 0 PST} + {2183623200 -25200 1 PDT} + {2204182800 -28800 0 PST} + {2215072800 -25200 1 PDT} + {2235632400 -28800 0 PST} + {2246522400 -25200 1 PDT} + {2267082000 -28800 0 PST} + {2277972000 -25200 1 PDT} + {2298531600 -28800 0 PST} + {2309421600 -25200 1 PDT} + {2329981200 -28800 0 PST} + {2341476000 -25200 1 PDT} + {2362035600 -28800 0 PST} + {2372925600 -25200 1 PDT} + {2393485200 -28800 0 PST} + {2404375200 -25200 1 PDT} + {2424934800 -28800 0 PST} + {2435824800 -25200 1 PDT} + {2456384400 -28800 0 PST} + {2467274400 -25200 1 PDT} + {2487834000 -28800 0 PST} + {2499328800 -25200 1 PDT} + {2519888400 -28800 0 PST} + {2530778400 -25200 1 PDT} + {2551338000 -28800 0 PST} + {2562228000 -25200 1 PDT} + {2582787600 -28800 0 PST} + {2593677600 -25200 1 PDT} + {2614237200 -28800 0 PST} + {2625127200 -25200 1 PDT} + {2645686800 -28800 0 PST} + {2656576800 -25200 1 PDT} + {2677136400 -28800 0 PST} + {2688631200 -25200 1 PDT} + {2709190800 -28800 0 PST} + {2720080800 -25200 1 PDT} + {2740640400 -28800 0 PST} + {2751530400 -25200 1 PDT} + {2772090000 -28800 0 PST} + {2782980000 -25200 1 PDT} + {2803539600 -28800 0 PST} + {2814429600 -25200 1 PDT} + {2834989200 -28800 0 PST} + {2846484000 -25200 1 PDT} + {2867043600 -28800 0 PST} + {2877933600 -25200 1 PDT} + {2898493200 -28800 0 PST} + {2909383200 -25200 1 PDT} + {2929942800 -28800 0 PST} + {2940832800 -25200 1 PDT} + {2961392400 -28800 0 PST} + {2972282400 -25200 1 PDT} + {2992842000 -28800 0 PST} + {3003732000 -25200 1 PDT} + {3024291600 -28800 0 PST} + {3035786400 -25200 1 PDT} + {3056346000 -28800 0 PST} + {3067236000 -25200 1 PDT} + {3087795600 -28800 0 PST} + {3098685600 -25200 1 PDT} + {3119245200 -28800 0 PST} + {3130135200 -25200 1 PDT} + {3150694800 -28800 0 PST} + {3161584800 -25200 1 PDT} + {3182144400 -28800 0 PST} + {3193034400 -25200 1 PDT} + {3213594000 -28800 0 PST} + {3225088800 -25200 1 PDT} + {3245648400 -28800 0 PST} + {3256538400 -25200 1 PDT} + {3277098000 -28800 0 PST} + {3287988000 -25200 1 PDT} + {3308547600 -28800 0 PST} + {3319437600 -25200 1 PDT} + {3339997200 -28800 0 PST} + {3350887200 -25200 1 PDT} + {3371446800 -28800 0 PST} + {3382941600 -25200 1 PDT} + {3403501200 -28800 0 PST} + {3414391200 -25200 1 PDT} + {3434950800 -28800 0 PST} + {3445840800 -25200 1 PDT} + {3466400400 -28800 0 PST} + {3477290400 -25200 1 PDT} + {3497850000 -28800 0 PST} + {3508740000 -25200 1 PDT} + {3529299600 -28800 0 PST} + {3540189600 -25200 1 PDT} + {3560749200 -28800 0 PST} + {3572244000 -25200 1 PDT} + {3592803600 -28800 0 PST} + {3603693600 -25200 1 PDT} + {3624253200 -28800 0 PST} + {3635143200 -25200 1 PDT} + {3655702800 -28800 0 PST} + {3666592800 -25200 1 PDT} + {3687152400 -28800 0 PST} + {3698042400 -25200 1 PDT} + {3718602000 -28800 0 PST} + {3730096800 -25200 1 PDT} + {3750656400 -28800 0 PST} + {3761546400 -25200 1 PDT} + {3782106000 -28800 0 PST} + {3792996000 -25200 1 PDT} + {3813555600 -28800 0 PST} + {3824445600 -25200 1 PDT} + {3845005200 -28800 0 PST} + {3855895200 -25200 1 PDT} + {3876454800 -28800 0 PST} + {3887344800 -25200 1 PDT} + {3907904400 -28800 0 PST} + {3919399200 -25200 1 PDT} + {3939958800 -28800 0 PST} + {3950848800 -25200 1 PDT} + {3971408400 -28800 0 PST} + {3982298400 -25200 1 PDT} + {4002858000 -28800 0 PST} + {4013748000 -25200 1 PDT} + {4034307600 -28800 0 PST} + {4045197600 -25200 1 PDT} + {4065757200 -28800 0 PST} + {4076647200 -25200 1 PDT} + {4097206800 -28800 0 PST} +} diff --git a/env/tcl/tcl8.6/tzdata/America/Winnipeg b/env/tcl/tcl8.6/tzdata/America/Winnipeg new file mode 100644 index 0000000..e6efe47 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/America/Winnipeg @@ -0,0 +1,316 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:America/Winnipeg) { + {-9223372036854775808 -23316 0 LMT} + {-2602258284 -21600 0 CST} + {-1694368800 -18000 1 CDT} + {-1681671600 -21600 0 CST} + {-1632067200 -18000 1 CDT} + {-1615136400 -21600 0 CST} + {-1029686400 -18000 1 CDT} + {-1018198800 -21600 0 CST} + {-880214400 -18000 1 CWT} + {-769395600 -18000 1 CPT} + {-765392400 -21600 0 CST} + {-746035200 -18000 1 CDT} + {-732733200 -21600 0 CST} + {-715795200 -18000 1 CDT} + {-702493200 -21600 0 CST} + {-684345600 -18000 1 CDT} + {-671043600 -21600 0 CST} + {-652896000 -18000 1 CDT} + {-639594000 -21600 0 CST} + {-620755200 -18000 1 CDT} + {-607626000 -21600 0 CST} + {-589392000 -18000 1 CDT} + {-576090000 -21600 0 CST} + {-557942400 -18000 1 CDT} + {-544640400 -21600 0 CST} + {-526492800 -18000 1 CDT} + {-513190800 -21600 0 CST} + {-495043200 -18000 1 CDT} + {-481741200 -21600 0 CST} + {-463593600 -18000 1 CDT} + {-450291600 -21600 0 CST} + {-431539200 -18000 1 CDT} + {-418237200 -21600 0 CST} + {-400089600 -18000 1 CDT} + {-386787600 -21600 0 CST} + {-368640000 -18000 1 CDT} + {-355338000 -21600 0 CST} + {-337190400 -18000 1 CDT} + {-321469200 -21600 0 CST} + {-305740800 -18000 1 CDT} + {-292438800 -21600 0 CST} + {-210787200 -18000 1 CDT} + {-198090000 -21600 0 CST} + {-116438400 -18000 1 CDT} + {-100108800 -21600 0 CST} + {-84384000 -18000 1 CDT} + {-68659200 -21600 0 CST} + {-52934400 -18000 1 CDT} + {-37209600 -21600 0 CST} + {-21484800 -18000 1 CDT} + {-5760000 -21600 0 CST} + {9964800 -18000 1 CDT} + {25689600 -21600 0 CST} + {41414400 -18000 1 CDT} + {57744000 -21600 0 CST} + {73468800 -18000 1 CDT} + {89193600 -21600 0 CST} + {104918400 -18000 1 CDT} + {120643200 -21600 0 CST} + {136368000 -18000 1 CDT} + {152092800 -21600 0 CST} + {167817600 -18000 1 CDT} + {183542400 -21600 0 CST} + {199267200 -18000 1 CDT} + {215596800 -21600 0 CST} + {230716800 -18000 1 CDT} + {247046400 -21600 0 CST} + {262771200 -18000 1 CDT} + {278496000 -21600 0 CST} + {294220800 -18000 1 CDT} + {309945600 -21600 0 CST} + {325670400 -18000 1 CDT} + {341395200 -21600 0 CST} + {357120000 -18000 1 CDT} + {372844800 -21600 0 CST} + {388569600 -18000 1 CDT} + {404899200 -21600 0 CST} + {420019200 -18000 1 CDT} + {436348800 -21600 0 CST} + {452073600 -18000 1 CDT} + {467798400 -21600 0 CST} + {483523200 -18000 1 CDT} + {499248000 -21600 0 CST} + {514972800 -18000 1 CDT} + {530697600 -21600 0 CST} + {544608000 -18000 1 CDT} + {562147200 -21600 0 CST} + {576057600 -18000 1 CDT} + {594201600 -21600 0 CST} + {607507200 -18000 1 CDT} + {625651200 -21600 0 CST} + {638956800 -18000 1 CDT} + {657100800 -21600 0 CST} + {671011200 -18000 1 CDT} + {688550400 -21600 0 CST} + {702460800 -18000 1 CDT} + {720000000 -21600 0 CST} + {733910400 -18000 1 CDT} + {752054400 -21600 0 CST} + {765360000 -18000 1 CDT} + {783504000 -21600 0 CST} + {796809600 -18000 1 CDT} + {814953600 -21600 0 CST} + {828864000 -18000 1 CDT} + {846403200 -21600 0 CST} + {860313600 -18000 1 CDT} + {877852800 -21600 0 CST} + {891763200 -18000 1 CDT} + {909302400 -21600 0 CST} + {923212800 -18000 1 CDT} + {941356800 -21600 0 CST} + {954662400 -18000 1 CDT} + {972806400 -21600 0 CST} + {986112000 -18000 1 CDT} + {1004256000 -21600 0 CST} + {1018166400 -18000 1 CDT} + {1035705600 -21600 0 CST} + {1049616000 -18000 1 CDT} + {1067155200 -21600 0 CST} + {1081065600 -18000 1 CDT} + {1099209600 -21600 0 CST} + {1112515200 -18000 1 CDT} + {1130659200 -21600 0 CST} + {1136095200 -21600 0 CST} + {1143964800 -18000 1 CDT} + {1162105200 -21600 0 CST} + {1173600000 -18000 1 CDT} + {1194159600 -21600 0 CST} + {1205049600 -18000 1 CDT} + {1225609200 -21600 0 CST} + {1236499200 -18000 1 CDT} + {1257058800 -21600 0 CST} + {1268553600 -18000 1 CDT} + {1289113200 -21600 0 CST} + {1300003200 -18000 1 CDT} + {1320562800 -21600 0 CST} + {1331452800 -18000 1 CDT} + {1352012400 -21600 0 CST} + {1362902400 -18000 1 CDT} + {1383462000 -21600 0 CST} + {1394352000 -18000 1 CDT} + {1414911600 -21600 0 CST} + {1425801600 -18000 1 CDT} + {1446361200 -21600 0 CST} + {1457856000 -18000 1 CDT} + {1478415600 -21600 0 CST} + {1489305600 -18000 1 CDT} + {1509865200 -21600 0 CST} + {1520755200 -18000 1 CDT} + {1541314800 -21600 0 CST} + {1552204800 -18000 1 CDT} + {1572764400 -21600 0 CST} + {1583654400 -18000 1 CDT} + {1604214000 -21600 0 CST} + {1615708800 -18000 1 CDT} + {1636268400 -21600 0 CST} + {1647158400 -18000 1 CDT} + {1667718000 -21600 0 CST} + {1678608000 -18000 1 CDT} + {1699167600 -21600 0 CST} + {1710057600 -18000 1 CDT} + {1730617200 -21600 0 CST} + {1741507200 -18000 1 CDT} + {1762066800 -21600 0 CST} + {1772956800 -18000 1 CDT} + {1793516400 -21600 0 CST} + {1805011200 -18000 1 CDT} + {1825570800 -21600 0 CST} + {1836460800 -18000 1 CDT} + {1857020400 -21600 0 CST} + {1867910400 -18000 1 CDT} + {1888470000 -21600 0 CST} + {1899360000 -18000 1 CDT} + {1919919600 -21600 0 CST} + {1930809600 -18000 1 CDT} + {1951369200 -21600 0 CST} + {1962864000 -18000 1 CDT} + {1983423600 -21600 0 CST} + {1994313600 -18000 1 CDT} + {2014873200 -21600 0 CST} + {2025763200 -18000 1 CDT} + {2046322800 -21600 0 CST} + {2057212800 -18000 1 CDT} + {2077772400 -21600 0 CST} + {2088662400 -18000 1 CDT} + {2109222000 -21600 0 CST} + {2120112000 -18000 1 CDT} + {2140671600 -21600 0 CST} + {2152166400 -18000 1 CDT} + {2172726000 -21600 0 CST} + {2183616000 -18000 1 CDT} + {2204175600 -21600 0 CST} + {2215065600 -18000 1 CDT} + {2235625200 -21600 0 CST} + {2246515200 -18000 1 CDT} + {2267074800 -21600 0 CST} + {2277964800 -18000 1 CDT} + {2298524400 -21600 0 CST} + {2309414400 -18000 1 CDT} + {2329974000 -21600 0 CST} + {2341468800 -18000 1 CDT} + {2362028400 -21600 0 CST} + {2372918400 -18000 1 CDT} + {2393478000 -21600 0 CST} + {2404368000 -18000 1 CDT} + {2424927600 -21600 0 CST} + {2435817600 -18000 1 CDT} + {2456377200 -21600 0 CST} + {2467267200 -18000 1 CDT} + {2487826800 -21600 0 CST} + {2499321600 -18000 1 CDT} + {2519881200 -21600 0 CST} + {2530771200 -18000 1 CDT} + {2551330800 -21600 0 CST} + {2562220800 -18000 1 CDT} + {2582780400 -21600 0 CST} + {2593670400 -18000 1 CDT} + {2614230000 -21600 0 CST} + {2625120000 -18000 1 CDT} + {2645679600 -21600 0 CST} + {2656569600 -18000 1 CDT} + {2677129200 -21600 0 CST} + {2688624000 -18000 1 CDT} + {2709183600 -21600 0 CST} + {2720073600 -18000 1 CDT} + {2740633200 -21600 0 CST} + {2751523200 -18000 1 CDT} + {2772082800 -21600 0 CST} + {2782972800 -18000 1 CDT} + {2803532400 -21600 0 CST} + {2814422400 -18000 1 CDT} + {2834982000 -21600 0 CST} + {2846476800 -18000 1 CDT} + {2867036400 -21600 0 CST} + {2877926400 -18000 1 CDT} + {2898486000 -21600 0 CST} + {2909376000 -18000 1 CDT} + {2929935600 -21600 0 CST} + {2940825600 -18000 1 CDT} + {2961385200 -21600 0 CST} + {2972275200 -18000 1 CDT} + {2992834800 -21600 0 CST} + {3003724800 -18000 1 CDT} + {3024284400 -21600 0 CST} + {3035779200 -18000 1 CDT} + {3056338800 -21600 0 CST} + {3067228800 -18000 1 CDT} + {3087788400 -21600 0 CST} + {3098678400 -18000 1 CDT} + {3119238000 -21600 0 CST} + {3130128000 -18000 1 CDT} + {3150687600 -21600 0 CST} + {3161577600 -18000 1 CDT} + {3182137200 -21600 0 CST} + {3193027200 -18000 1 CDT} + {3213586800 -21600 0 CST} + {3225081600 -18000 1 CDT} + {3245641200 -21600 0 CST} + {3256531200 -18000 1 CDT} + {3277090800 -21600 0 CST} + {3287980800 -18000 1 CDT} + {3308540400 -21600 0 CST} + {3319430400 -18000 1 CDT} + {3339990000 -21600 0 CST} + {3350880000 -18000 1 CDT} + {3371439600 -21600 0 CST} + {3382934400 -18000 1 CDT} + {3403494000 -21600 0 CST} + {3414384000 -18000 1 CDT} + {3434943600 -21600 0 CST} + {3445833600 -18000 1 CDT} + {3466393200 -21600 0 CST} + {3477283200 -18000 1 CDT} + {3497842800 -21600 0 CST} + {3508732800 -18000 1 CDT} + {3529292400 -21600 0 CST} + {3540182400 -18000 1 CDT} + {3560742000 -21600 0 CST} + {3572236800 -18000 1 CDT} + {3592796400 -21600 0 CST} + {3603686400 -18000 1 CDT} + {3624246000 -21600 0 CST} + {3635136000 -18000 1 CDT} + {3655695600 -21600 0 CST} + {3666585600 -18000 1 CDT} + {3687145200 -21600 0 CST} + {3698035200 -18000 1 CDT} + {3718594800 -21600 0 CST} + {3730089600 -18000 1 CDT} + {3750649200 -21600 0 CST} + {3761539200 -18000 1 CDT} + {3782098800 -21600 0 CST} + {3792988800 -18000 1 CDT} + {3813548400 -21600 0 CST} + {3824438400 -18000 1 CDT} + {3844998000 -21600 0 CST} + {3855888000 -18000 1 CDT} + {3876447600 -21600 0 CST} + {3887337600 -18000 1 CDT} + {3907897200 -21600 0 CST} + {3919392000 -18000 1 CDT} + {3939951600 -21600 0 CST} + {3950841600 -18000 1 CDT} + {3971401200 -21600 0 CST} + {3982291200 -18000 1 CDT} + {4002850800 -21600 0 CST} + {4013740800 -18000 1 CDT} + {4034300400 -21600 0 CST} + {4045190400 -18000 1 CDT} + {4065750000 -21600 0 CST} + {4076640000 -18000 1 CDT} + {4097199600 -21600 0 CST} +} diff --git a/env/tcl/tcl8.6/tzdata/America/Yakutat b/env/tcl/tcl8.6/tzdata/America/Yakutat new file mode 100644 index 0000000..b1d66ff --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/America/Yakutat @@ -0,0 +1,276 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:America/Yakutat) { + {-9223372036854775808 52865 0 LMT} + {-3225223727 -33535 0 LMT} + {-2188953665 -32400 0 YST} + {-883580400 -32400 0 YST} + {-880203600 -28800 1 YWT} + {-769395600 -28800 1 YPT} + {-765381600 -32400 0 YST} + {-757350000 -32400 0 YST} + {-31503600 -32400 0 YST} + {-21474000 -28800 1 YDT} + {-5752800 -32400 0 YST} + {9975600 -28800 1 YDT} + {25696800 -32400 0 YST} + {41425200 -28800 1 YDT} + {57751200 -32400 0 YST} + {73479600 -28800 1 YDT} + {89200800 -32400 0 YST} + {104929200 -28800 1 YDT} + {120650400 -32400 0 YST} + {126702000 -28800 1 YDT} + {152100000 -32400 0 YST} + {162385200 -28800 1 YDT} + {183549600 -32400 0 YST} + {199278000 -28800 1 YDT} + {215604000 -32400 0 YST} + {230727600 -28800 1 YDT} + {247053600 -32400 0 YST} + {262782000 -28800 1 YDT} + {278503200 -32400 0 YST} + {294231600 -28800 1 YDT} + {309952800 -32400 0 YST} + {325681200 -28800 1 YDT} + {341402400 -32400 0 YST} + {357130800 -28800 1 YDT} + {372852000 -32400 0 YST} + {388580400 -28800 1 YDT} + {404906400 -32400 0 YST} + {420030000 -28800 1 YDT} + {436356000 -32400 0 YST} + {439030800 -32400 0 AKST} + {452084400 -28800 1 AKDT} + {467805600 -32400 0 AKST} + {483534000 -28800 1 AKDT} + {499255200 -32400 0 AKST} + {514983600 -28800 1 AKDT} + {530704800 -32400 0 AKST} + {544618800 -28800 1 AKDT} + {562154400 -32400 0 AKST} + {576068400 -28800 1 AKDT} + {594208800 -32400 0 AKST} + {607518000 -28800 1 AKDT} + {625658400 -32400 0 AKST} + {638967600 -28800 1 AKDT} + {657108000 -32400 0 AKST} + {671022000 -28800 1 AKDT} + {688557600 -32400 0 AKST} + {702471600 -28800 1 AKDT} + {720007200 -32400 0 AKST} + {733921200 -28800 1 AKDT} + {752061600 -32400 0 AKST} + {765370800 -28800 1 AKDT} + {783511200 -32400 0 AKST} + {796820400 -28800 1 AKDT} + {814960800 -32400 0 AKST} + {828874800 -28800 1 AKDT} + {846410400 -32400 0 AKST} + {860324400 -28800 1 AKDT} + {877860000 -32400 0 AKST} + {891774000 -28800 1 AKDT} + {909309600 -32400 0 AKST} + {923223600 -28800 1 AKDT} + {941364000 -32400 0 AKST} + {954673200 -28800 1 AKDT} + {972813600 -32400 0 AKST} + {986122800 -28800 1 AKDT} + {1004263200 -32400 0 AKST} + {1018177200 -28800 1 AKDT} + {1035712800 -32400 0 AKST} + {1049626800 -28800 1 AKDT} + {1067162400 -32400 0 AKST} + {1081076400 -28800 1 AKDT} + {1099216800 -32400 0 AKST} + {1112526000 -28800 1 AKDT} + {1130666400 -32400 0 AKST} + {1143975600 -28800 1 AKDT} + {1162116000 -32400 0 AKST} + {1173610800 -28800 1 AKDT} + {1194170400 -32400 0 AKST} + {1205060400 -28800 1 AKDT} + {1225620000 -32400 0 AKST} + {1236510000 -28800 1 AKDT} + {1257069600 -32400 0 AKST} + {1268564400 -28800 1 AKDT} + {1289124000 -32400 0 AKST} + {1300014000 -28800 1 AKDT} + {1320573600 -32400 0 AKST} + {1331463600 -28800 1 AKDT} + {1352023200 -32400 0 AKST} + {1362913200 -28800 1 AKDT} + {1383472800 -32400 0 AKST} + {1394362800 -28800 1 AKDT} + {1414922400 -32400 0 AKST} + {1425812400 -28800 1 AKDT} + {1446372000 -32400 0 AKST} + {1457866800 -28800 1 AKDT} + {1478426400 -32400 0 AKST} + {1489316400 -28800 1 AKDT} + {1509876000 -32400 0 AKST} + {1520766000 -28800 1 AKDT} + {1541325600 -32400 0 AKST} + {1552215600 -28800 1 AKDT} + {1572775200 -32400 0 AKST} + {1583665200 -28800 1 AKDT} + {1604224800 -32400 0 AKST} + {1615719600 -28800 1 AKDT} + {1636279200 -32400 0 AKST} + {1647169200 -28800 1 AKDT} + {1667728800 -32400 0 AKST} + {1678618800 -28800 1 AKDT} + {1699178400 -32400 0 AKST} + {1710068400 -28800 1 AKDT} + {1730628000 -32400 0 AKST} + {1741518000 -28800 1 AKDT} + {1762077600 -32400 0 AKST} + {1772967600 -28800 1 AKDT} + {1793527200 -32400 0 AKST} + {1805022000 -28800 1 AKDT} + {1825581600 -32400 0 AKST} + {1836471600 -28800 1 AKDT} + {1857031200 -32400 0 AKST} + {1867921200 -28800 1 AKDT} + {1888480800 -32400 0 AKST} + {1899370800 -28800 1 AKDT} + {1919930400 -32400 0 AKST} + {1930820400 -28800 1 AKDT} + {1951380000 -32400 0 AKST} + {1962874800 -28800 1 AKDT} + {1983434400 -32400 0 AKST} + {1994324400 -28800 1 AKDT} + {2014884000 -32400 0 AKST} + {2025774000 -28800 1 AKDT} + {2046333600 -32400 0 AKST} + {2057223600 -28800 1 AKDT} + {2077783200 -32400 0 AKST} + {2088673200 -28800 1 AKDT} + {2109232800 -32400 0 AKST} + {2120122800 -28800 1 AKDT} + {2140682400 -32400 0 AKST} + {2152177200 -28800 1 AKDT} + {2172736800 -32400 0 AKST} + {2183626800 -28800 1 AKDT} + {2204186400 -32400 0 AKST} + {2215076400 -28800 1 AKDT} + {2235636000 -32400 0 AKST} + {2246526000 -28800 1 AKDT} + {2267085600 -32400 0 AKST} + {2277975600 -28800 1 AKDT} + {2298535200 -32400 0 AKST} + {2309425200 -28800 1 AKDT} + {2329984800 -32400 0 AKST} + {2341479600 -28800 1 AKDT} + {2362039200 -32400 0 AKST} + {2372929200 -28800 1 AKDT} + {2393488800 -32400 0 AKST} + {2404378800 -28800 1 AKDT} + {2424938400 -32400 0 AKST} + {2435828400 -28800 1 AKDT} + {2456388000 -32400 0 AKST} + {2467278000 -28800 1 AKDT} + {2487837600 -32400 0 AKST} + {2499332400 -28800 1 AKDT} + {2519892000 -32400 0 AKST} + {2530782000 -28800 1 AKDT} + {2551341600 -32400 0 AKST} + {2562231600 -28800 1 AKDT} + {2582791200 -32400 0 AKST} + {2593681200 -28800 1 AKDT} + {2614240800 -32400 0 AKST} + {2625130800 -28800 1 AKDT} + {2645690400 -32400 0 AKST} + {2656580400 -28800 1 AKDT} + {2677140000 -32400 0 AKST} + {2688634800 -28800 1 AKDT} + {2709194400 -32400 0 AKST} + {2720084400 -28800 1 AKDT} + {2740644000 -32400 0 AKST} + {2751534000 -28800 1 AKDT} + {2772093600 -32400 0 AKST} + {2782983600 -28800 1 AKDT} + {2803543200 -32400 0 AKST} + {2814433200 -28800 1 AKDT} + {2834992800 -32400 0 AKST} + {2846487600 -28800 1 AKDT} + {2867047200 -32400 0 AKST} + {2877937200 -28800 1 AKDT} + {2898496800 -32400 0 AKST} + {2909386800 -28800 1 AKDT} + {2929946400 -32400 0 AKST} + {2940836400 -28800 1 AKDT} + {2961396000 -32400 0 AKST} + {2972286000 -28800 1 AKDT} + {2992845600 -32400 0 AKST} + {3003735600 -28800 1 AKDT} + {3024295200 -32400 0 AKST} + {3035790000 -28800 1 AKDT} + {3056349600 -32400 0 AKST} + {3067239600 -28800 1 AKDT} + {3087799200 -32400 0 AKST} + {3098689200 -28800 1 AKDT} + {3119248800 -32400 0 AKST} + {3130138800 -28800 1 AKDT} + {3150698400 -32400 0 AKST} + {3161588400 -28800 1 AKDT} + {3182148000 -32400 0 AKST} + {3193038000 -28800 1 AKDT} + {3213597600 -32400 0 AKST} + {3225092400 -28800 1 AKDT} + {3245652000 -32400 0 AKST} + {3256542000 -28800 1 AKDT} + {3277101600 -32400 0 AKST} + {3287991600 -28800 1 AKDT} + {3308551200 -32400 0 AKST} + {3319441200 -28800 1 AKDT} + {3340000800 -32400 0 AKST} + {3350890800 -28800 1 AKDT} + {3371450400 -32400 0 AKST} + {3382945200 -28800 1 AKDT} + {3403504800 -32400 0 AKST} + {3414394800 -28800 1 AKDT} + {3434954400 -32400 0 AKST} + {3445844400 -28800 1 AKDT} + {3466404000 -32400 0 AKST} + {3477294000 -28800 1 AKDT} + {3497853600 -32400 0 AKST} + {3508743600 -28800 1 AKDT} + {3529303200 -32400 0 AKST} + {3540193200 -28800 1 AKDT} + {3560752800 -32400 0 AKST} + {3572247600 -28800 1 AKDT} + {3592807200 -32400 0 AKST} + {3603697200 -28800 1 AKDT} + {3624256800 -32400 0 AKST} + {3635146800 -28800 1 AKDT} + {3655706400 -32400 0 AKST} + {3666596400 -28800 1 AKDT} + {3687156000 -32400 0 AKST} + {3698046000 -28800 1 AKDT} + {3718605600 -32400 0 AKST} + {3730100400 -28800 1 AKDT} + {3750660000 -32400 0 AKST} + {3761550000 -28800 1 AKDT} + {3782109600 -32400 0 AKST} + {3792999600 -28800 1 AKDT} + {3813559200 -32400 0 AKST} + {3824449200 -28800 1 AKDT} + {3845008800 -32400 0 AKST} + {3855898800 -28800 1 AKDT} + {3876458400 -32400 0 AKST} + {3887348400 -28800 1 AKDT} + {3907908000 -32400 0 AKST} + {3919402800 -28800 1 AKDT} + {3939962400 -32400 0 AKST} + {3950852400 -28800 1 AKDT} + {3971412000 -32400 0 AKST} + {3982302000 -28800 1 AKDT} + {4002861600 -32400 0 AKST} + {4013751600 -28800 1 AKDT} + {4034311200 -32400 0 AKST} + {4045201200 -28800 1 AKDT} + {4065760800 -32400 0 AKST} + {4076650800 -28800 1 AKDT} + {4097210400 -32400 0 AKST} +} diff --git a/env/tcl/tcl8.6/tzdata/America/Yellowknife b/env/tcl/tcl8.6/tzdata/America/Yellowknife new file mode 100644 index 0000000..c6c4ed5 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/America/Yellowknife @@ -0,0 +1,252 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:America/Yellowknife) { + {-9223372036854775808 0 0 -00} + {-1104537600 -25200 0 MST} + {-880210800 -21600 1 MWT} + {-769395600 -21600 1 MPT} + {-765388800 -25200 0 MST} + {-147891600 -18000 1 MDDT} + {-131562000 -25200 0 MST} + {315558000 -25200 0 MST} + {325674000 -21600 1 MDT} + {341395200 -25200 0 MST} + {357123600 -21600 1 MDT} + {372844800 -25200 0 MST} + {388573200 -21600 1 MDT} + {404899200 -25200 0 MST} + {420022800 -21600 1 MDT} + {436348800 -25200 0 MST} + {452077200 -21600 1 MDT} + {467798400 -25200 0 MST} + {483526800 -21600 1 MDT} + {499248000 -25200 0 MST} + {514976400 -21600 1 MDT} + {530697600 -25200 0 MST} + {544611600 -21600 1 MDT} + {562147200 -25200 0 MST} + {576061200 -21600 1 MDT} + {594201600 -25200 0 MST} + {607510800 -21600 1 MDT} + {625651200 -25200 0 MST} + {638960400 -21600 1 MDT} + {657100800 -25200 0 MST} + {671014800 -21600 1 MDT} + {688550400 -25200 0 MST} + {702464400 -21600 1 MDT} + {720000000 -25200 0 MST} + {733914000 -21600 1 MDT} + {752054400 -25200 0 MST} + {765363600 -21600 1 MDT} + {783504000 -25200 0 MST} + {796813200 -21600 1 MDT} + {814953600 -25200 0 MST} + {828867600 -21600 1 MDT} + {846403200 -25200 0 MST} + {860317200 -21600 1 MDT} + {877852800 -25200 0 MST} + {891766800 -21600 1 MDT} + {909302400 -25200 0 MST} + {923216400 -21600 1 MDT} + {941356800 -25200 0 MST} + {954666000 -21600 1 MDT} + {972806400 -25200 0 MST} + {986115600 -21600 1 MDT} + {1004256000 -25200 0 MST} + {1018170000 -21600 1 MDT} + {1035705600 -25200 0 MST} + {1049619600 -21600 1 MDT} + {1067155200 -25200 0 MST} + {1081069200 -21600 1 MDT} + {1099209600 -25200 0 MST} + {1112518800 -21600 1 MDT} + {1130659200 -25200 0 MST} + {1143968400 -21600 1 MDT} + {1162108800 -25200 0 MST} + {1173603600 -21600 1 MDT} + {1194163200 -25200 0 MST} + {1205053200 -21600 1 MDT} + {1225612800 -25200 0 MST} + {1236502800 -21600 1 MDT} + {1257062400 -25200 0 MST} + {1268557200 -21600 1 MDT} + {1289116800 -25200 0 MST} + {1300006800 -21600 1 MDT} + {1320566400 -25200 0 MST} + {1331456400 -21600 1 MDT} + {1352016000 -25200 0 MST} + {1362906000 -21600 1 MDT} + {1383465600 -25200 0 MST} + {1394355600 -21600 1 MDT} + {1414915200 -25200 0 MST} + {1425805200 -21600 1 MDT} + {1446364800 -25200 0 MST} + {1457859600 -21600 1 MDT} + {1478419200 -25200 0 MST} + {1489309200 -21600 1 MDT} + {1509868800 -25200 0 MST} + {1520758800 -21600 1 MDT} + {1541318400 -25200 0 MST} + {1552208400 -21600 1 MDT} + {1572768000 -25200 0 MST} + {1583658000 -21600 1 MDT} + {1604217600 -25200 0 MST} + {1615712400 -21600 1 MDT} + {1636272000 -25200 0 MST} + {1647162000 -21600 1 MDT} + {1667721600 -25200 0 MST} + {1678611600 -21600 1 MDT} + {1699171200 -25200 0 MST} + {1710061200 -21600 1 MDT} + {1730620800 -25200 0 MST} + {1741510800 -21600 1 MDT} + {1762070400 -25200 0 MST} + {1772960400 -21600 1 MDT} + {1793520000 -25200 0 MST} + {1805014800 -21600 1 MDT} + {1825574400 -25200 0 MST} + {1836464400 -21600 1 MDT} + {1857024000 -25200 0 MST} + {1867914000 -21600 1 MDT} + {1888473600 -25200 0 MST} + {1899363600 -21600 1 MDT} + {1919923200 -25200 0 MST} + {1930813200 -21600 1 MDT} + {1951372800 -25200 0 MST} + {1962867600 -21600 1 MDT} + {1983427200 -25200 0 MST} + {1994317200 -21600 1 MDT} + {2014876800 -25200 0 MST} + {2025766800 -21600 1 MDT} + {2046326400 -25200 0 MST} + {2057216400 -21600 1 MDT} + {2077776000 -25200 0 MST} + {2088666000 -21600 1 MDT} + {2109225600 -25200 0 MST} + {2120115600 -21600 1 MDT} + {2140675200 -25200 0 MST} + {2152170000 -21600 1 MDT} + {2172729600 -25200 0 MST} + {2183619600 -21600 1 MDT} + {2204179200 -25200 0 MST} + {2215069200 -21600 1 MDT} + {2235628800 -25200 0 MST} + {2246518800 -21600 1 MDT} + {2267078400 -25200 0 MST} + {2277968400 -21600 1 MDT} + {2298528000 -25200 0 MST} + {2309418000 -21600 1 MDT} + {2329977600 -25200 0 MST} + {2341472400 -21600 1 MDT} + {2362032000 -25200 0 MST} + {2372922000 -21600 1 MDT} + {2393481600 -25200 0 MST} + {2404371600 -21600 1 MDT} + {2424931200 -25200 0 MST} + {2435821200 -21600 1 MDT} + {2456380800 -25200 0 MST} + {2467270800 -21600 1 MDT} + {2487830400 -25200 0 MST} + {2499325200 -21600 1 MDT} + {2519884800 -25200 0 MST} + {2530774800 -21600 1 MDT} + {2551334400 -25200 0 MST} + {2562224400 -21600 1 MDT} + {2582784000 -25200 0 MST} + {2593674000 -21600 1 MDT} + {2614233600 -25200 0 MST} + {2625123600 -21600 1 MDT} + {2645683200 -25200 0 MST} + {2656573200 -21600 1 MDT} + {2677132800 -25200 0 MST} + {2688627600 -21600 1 MDT} + {2709187200 -25200 0 MST} + {2720077200 -21600 1 MDT} + {2740636800 -25200 0 MST} + {2751526800 -21600 1 MDT} + {2772086400 -25200 0 MST} + {2782976400 -21600 1 MDT} + {2803536000 -25200 0 MST} + {2814426000 -21600 1 MDT} + {2834985600 -25200 0 MST} + {2846480400 -21600 1 MDT} + {2867040000 -25200 0 MST} + {2877930000 -21600 1 MDT} + {2898489600 -25200 0 MST} + {2909379600 -21600 1 MDT} + {2929939200 -25200 0 MST} + {2940829200 -21600 1 MDT} + {2961388800 -25200 0 MST} + {2972278800 -21600 1 MDT} + {2992838400 -25200 0 MST} + {3003728400 -21600 1 MDT} + {3024288000 -25200 0 MST} + {3035782800 -21600 1 MDT} + {3056342400 -25200 0 MST} + {3067232400 -21600 1 MDT} + {3087792000 -25200 0 MST} + {3098682000 -21600 1 MDT} + {3119241600 -25200 0 MST} + {3130131600 -21600 1 MDT} + {3150691200 -25200 0 MST} + {3161581200 -21600 1 MDT} + {3182140800 -25200 0 MST} + {3193030800 -21600 1 MDT} + {3213590400 -25200 0 MST} + {3225085200 -21600 1 MDT} + {3245644800 -25200 0 MST} + {3256534800 -21600 1 MDT} + {3277094400 -25200 0 MST} + {3287984400 -21600 1 MDT} + {3308544000 -25200 0 MST} + {3319434000 -21600 1 MDT} + {3339993600 -25200 0 MST} + {3350883600 -21600 1 MDT} + {3371443200 -25200 0 MST} + {3382938000 -21600 1 MDT} + {3403497600 -25200 0 MST} + {3414387600 -21600 1 MDT} + {3434947200 -25200 0 MST} + {3445837200 -21600 1 MDT} + {3466396800 -25200 0 MST} + {3477286800 -21600 1 MDT} + {3497846400 -25200 0 MST} + {3508736400 -21600 1 MDT} + {3529296000 -25200 0 MST} + {3540186000 -21600 1 MDT} + {3560745600 -25200 0 MST} + {3572240400 -21600 1 MDT} + {3592800000 -25200 0 MST} + {3603690000 -21600 1 MDT} + {3624249600 -25200 0 MST} + {3635139600 -21600 1 MDT} + {3655699200 -25200 0 MST} + {3666589200 -21600 1 MDT} + {3687148800 -25200 0 MST} + {3698038800 -21600 1 MDT} + {3718598400 -25200 0 MST} + {3730093200 -21600 1 MDT} + {3750652800 -25200 0 MST} + {3761542800 -21600 1 MDT} + {3782102400 -25200 0 MST} + {3792992400 -21600 1 MDT} + {3813552000 -25200 0 MST} + {3824442000 -21600 1 MDT} + {3845001600 -25200 0 MST} + {3855891600 -21600 1 MDT} + {3876451200 -25200 0 MST} + {3887341200 -21600 1 MDT} + {3907900800 -25200 0 MST} + {3919395600 -21600 1 MDT} + {3939955200 -25200 0 MST} + {3950845200 -21600 1 MDT} + {3971404800 -25200 0 MST} + {3982294800 -21600 1 MDT} + {4002854400 -25200 0 MST} + {4013744400 -21600 1 MDT} + {4034304000 -25200 0 MST} + {4045194000 -21600 1 MDT} + {4065753600 -25200 0 MST} + {4076643600 -21600 1 MDT} + {4097203200 -25200 0 MST} +} diff --git a/env/tcl/tcl8.6/tzdata/Antarctica/Casey b/env/tcl/tcl8.6/tzdata/Antarctica/Casey new file mode 100644 index 0000000..aa37480 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Antarctica/Casey @@ -0,0 +1,12 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Antarctica/Casey) { + {-9223372036854775808 0 0 -00} + {-31536000 28800 0 +08} + {1255802400 39600 0 +11} + {1267714800 28800 0 +08} + {1319738400 39600 0 +11} + {1329843600 28800 0 +08} + {1477065600 39600 0 +11} + {1520701200 28800 0 +08} +} diff --git a/env/tcl/tcl8.6/tzdata/Antarctica/Davis b/env/tcl/tcl8.6/tzdata/Antarctica/Davis new file mode 100644 index 0000000..9bb178b --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Antarctica/Davis @@ -0,0 +1,12 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Antarctica/Davis) { + {-9223372036854775808 0 0 -00} + {-409190400 25200 0 +07} + {-163062000 0 0 -00} + {-28857600 25200 0 +07} + {1255806000 18000 0 +05} + {1268251200 25200 0 +07} + {1319742000 18000 0 +05} + {1329854400 25200 0 +07} +} diff --git a/env/tcl/tcl8.6/tzdata/Antarctica/DumontDUrville b/env/tcl/tcl8.6/tzdata/Antarctica/DumontDUrville new file mode 100644 index 0000000..f734aed --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Antarctica/DumontDUrville @@ -0,0 +1,8 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Antarctica/DumontDUrville) { + {-9223372036854775808 0 0 -00} + {-725846400 36000 0 +10} + {-566992800 0 0 -00} + {-415497600 36000 0 +10} +} diff --git a/env/tcl/tcl8.6/tzdata/Antarctica/Macquarie b/env/tcl/tcl8.6/tzdata/Antarctica/Macquarie new file mode 100644 index 0000000..60bf7a6 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Antarctica/Macquarie @@ -0,0 +1,97 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Antarctica/Macquarie) { + {-9223372036854775808 0 0 -00} + {-2214259200 36000 0 AEST} + {-1680508800 39600 1 AEDT} + {-1669892400 39600 0 AEDT} + {-1665392400 36000 0 AEST} + {-1601719200 0 0 -00} + {-94730400 36000 0 AEST} + {-71136000 39600 1 AEDT} + {-55411200 36000 0 AEST} + {-37267200 39600 1 AEDT} + {-25776000 36000 0 AEST} + {-5817600 39600 1 AEDT} + {5673600 36000 0 AEST} + {25632000 39600 1 AEDT} + {37728000 36000 0 AEST} + {57686400 39600 1 AEDT} + {67968000 36000 0 AEST} + {89136000 39600 1 AEDT} + {100022400 36000 0 AEST} + {120585600 39600 1 AEDT} + {131472000 36000 0 AEST} + {152035200 39600 1 AEDT} + {162921600 36000 0 AEST} + {183484800 39600 1 AEDT} + {194976000 36000 0 AEST} + {215539200 39600 1 AEDT} + {226425600 36000 0 AEST} + {246988800 39600 1 AEDT} + {257875200 36000 0 AEST} + {278438400 39600 1 AEDT} + {289324800 36000 0 AEST} + {309888000 39600 1 AEDT} + {320774400 36000 0 AEST} + {341337600 39600 1 AEDT} + {352224000 36000 0 AEST} + {372787200 39600 1 AEDT} + {386092800 36000 0 AEST} + {404841600 39600 1 AEDT} + {417542400 36000 0 AEST} + {436291200 39600 1 AEDT} + {447177600 36000 0 AEST} + {467740800 39600 1 AEDT} + {478627200 36000 0 AEST} + {499190400 39600 1 AEDT} + {510076800 36000 0 AEST} + {530035200 39600 1 AEDT} + {542736000 36000 0 AEST} + {562089600 39600 1 AEDT} + {574790400 36000 0 AEST} + {594144000 39600 1 AEDT} + {606240000 36000 0 AEST} + {625593600 39600 1 AEDT} + {637689600 36000 0 AEST} + {657043200 39600 1 AEDT} + {670348800 36000 0 AEST} + {686678400 39600 1 AEDT} + {701798400 36000 0 AEST} + {718128000 39600 1 AEDT} + {733248000 36000 0 AEST} + {749577600 39600 1 AEDT} + {764697600 36000 0 AEST} + {781027200 39600 1 AEDT} + {796147200 36000 0 AEST} + {812476800 39600 1 AEDT} + {828201600 36000 0 AEST} + {844531200 39600 1 AEDT} + {859651200 36000 0 AEST} + {875980800 39600 1 AEDT} + {891100800 36000 0 AEST} + {907430400 39600 1 AEDT} + {922550400 36000 0 AEST} + {938880000 39600 1 AEDT} + {954000000 36000 0 AEST} + {967305600 39600 1 AEDT} + {985449600 36000 0 AEST} + {1002384000 39600 1 AEDT} + {1017504000 36000 0 AEST} + {1033833600 39600 1 AEDT} + {1048953600 36000 0 AEST} + {1065283200 39600 1 AEDT} + {1080403200 36000 0 AEST} + {1096732800 39600 1 AEDT} + {1111852800 36000 0 AEST} + {1128182400 39600 1 AEDT} + {1143907200 36000 0 AEST} + {1159632000 39600 1 AEDT} + {1174752000 36000 0 AEST} + {1191686400 39600 1 AEDT} + {1207411200 36000 0 AEST} + {1223136000 39600 1 AEDT} + {1238860800 36000 0 AEST} + {1254585600 39600 1 AEDT} + {1270310400 39600 0 +11} +} diff --git a/env/tcl/tcl8.6/tzdata/Antarctica/Mawson b/env/tcl/tcl8.6/tzdata/Antarctica/Mawson new file mode 100644 index 0000000..4828b1a --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Antarctica/Mawson @@ -0,0 +1,7 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Antarctica/Mawson) { + {-9223372036854775808 0 0 -00} + {-501206400 21600 0 +06} + {1255809600 18000 0 +05} +} diff --git a/env/tcl/tcl8.6/tzdata/Antarctica/McMurdo b/env/tcl/tcl8.6/tzdata/Antarctica/McMurdo new file mode 100644 index 0000000..3b29ba1 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Antarctica/McMurdo @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(Pacific/Auckland)]} { + LoadTimeZoneFile Pacific/Auckland +} +set TZData(:Antarctica/McMurdo) $TZData(:Pacific/Auckland) diff --git a/env/tcl/tcl8.6/tzdata/Antarctica/Palmer b/env/tcl/tcl8.6/tzdata/Antarctica/Palmer new file mode 100644 index 0000000..f450e3b --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Antarctica/Palmer @@ -0,0 +1,87 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Antarctica/Palmer) { + {-9223372036854775808 0 0 -00} + {-157766400 -14400 0 -04} + {-152654400 -14400 0 -04} + {-132955200 -10800 1 -04} + {-121122000 -14400 0 -04} + {-101419200 -10800 1 -04} + {-86821200 -14400 0 -04} + {-71092800 -10800 1 -04} + {-54766800 -14400 0 -04} + {-39038400 -10800 1 -04} + {-23317200 -14400 0 -04} + {-7588800 -10800 0 -03} + {128142000 -7200 1 -03} + {136605600 -10800 0 -03} + {389070000 -14400 0 -04} + {403070400 -10800 1 -04} + {416372400 -14400 0 -04} + {434520000 -10800 1 -04} + {447822000 -14400 0 -04} + {466574400 -10800 1 -04} + {479271600 -14400 0 -04} + {498024000 -10800 1 -04} + {510721200 -14400 0 -04} + {529473600 -10800 1 -04} + {545194800 -14400 0 -04} + {560923200 -10800 1 -04} + {574225200 -14400 0 -04} + {592372800 -10800 1 -04} + {605674800 -14400 0 -04} + {624427200 -10800 1 -04} + {637124400 -14400 0 -04} + {653457600 -10800 1 -04} + {668574000 -14400 0 -04} + {687326400 -10800 1 -04} + {700628400 -14400 0 -04} + {718776000 -10800 1 -04} + {732078000 -14400 0 -04} + {750225600 -10800 1 -04} + {763527600 -14400 0 -04} + {781675200 -10800 1 -04} + {794977200 -14400 0 -04} + {813729600 -10800 1 -04} + {826426800 -14400 0 -04} + {845179200 -10800 1 -04} + {859690800 -14400 0 -04} + {876628800 -10800 1 -04} + {889930800 -14400 0 -04} + {906868800 -10800 1 -04} + {923194800 -14400 0 -04} + {939528000 -10800 1 -04} + {952830000 -14400 0 -04} + {971582400 -10800 1 -04} + {984279600 -14400 0 -04} + {1003032000 -10800 1 -04} + {1015729200 -14400 0 -04} + {1034481600 -10800 1 -04} + {1047178800 -14400 0 -04} + {1065931200 -10800 1 -04} + {1079233200 -14400 0 -04} + {1097380800 -10800 1 -04} + {1110682800 -14400 0 -04} + {1128830400 -10800 1 -04} + {1142132400 -14400 0 -04} + {1160884800 -10800 1 -04} + {1173582000 -14400 0 -04} + {1192334400 -10800 1 -04} + {1206846000 -14400 0 -04} + {1223784000 -10800 1 -04} + {1237086000 -14400 0 -04} + {1255233600 -10800 1 -04} + {1270350000 -14400 0 -04} + {1286683200 -10800 1 -04} + {1304823600 -14400 0 -04} + {1313899200 -10800 1 -04} + {1335668400 -14400 0 -04} + {1346558400 -10800 1 -04} + {1367118000 -14400 0 -04} + {1378612800 -10800 1 -04} + {1398567600 -14400 0 -04} + {1410062400 -10800 1 -04} + {1463281200 -14400 0 -04} + {1471147200 -10800 1 -04} + {1480820400 -10800 0 -03} +} diff --git a/env/tcl/tcl8.6/tzdata/Antarctica/Rothera b/env/tcl/tcl8.6/tzdata/Antarctica/Rothera new file mode 100644 index 0000000..7f0134f --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Antarctica/Rothera @@ -0,0 +1,6 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Antarctica/Rothera) { + {-9223372036854775808 0 0 -00} + {218246400 -10800 0 -03} +} diff --git a/env/tcl/tcl8.6/tzdata/Antarctica/South_Pole b/env/tcl/tcl8.6/tzdata/Antarctica/South_Pole new file mode 100644 index 0000000..544bde4 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Antarctica/South_Pole @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(Pacific/Auckland)]} { + LoadTimeZoneFile Pacific/Auckland +} +set TZData(:Antarctica/South_Pole) $TZData(:Pacific/Auckland) diff --git a/env/tcl/tcl8.6/tzdata/Antarctica/Syowa b/env/tcl/tcl8.6/tzdata/Antarctica/Syowa new file mode 100644 index 0000000..a44dd5c --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Antarctica/Syowa @@ -0,0 +1,6 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Antarctica/Syowa) { + {-9223372036854775808 0 0 -00} + {-407808000 10800 0 +03} +} diff --git a/env/tcl/tcl8.6/tzdata/Antarctica/Troll b/env/tcl/tcl8.6/tzdata/Antarctica/Troll new file mode 100644 index 0000000..fe44578 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Antarctica/Troll @@ -0,0 +1,196 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Antarctica/Troll) { + {-9223372036854775808 0 0 -00} + {1108166400 0 0 +00} + {1111885200 7200 1 +02} + {1130634000 0 0 +00} + {1143334800 7200 1 +02} + {1162083600 0 0 +00} + {1174784400 7200 1 +02} + {1193533200 0 0 +00} + {1206838800 7200 1 +02} + {1224982800 0 0 +00} + {1238288400 7200 1 +02} + {1256432400 0 0 +00} + {1269738000 7200 1 +02} + {1288486800 0 0 +00} + {1301187600 7200 1 +02} + {1319936400 0 0 +00} + {1332637200 7200 1 +02} + {1351386000 0 0 +00} + {1364691600 7200 1 +02} + {1382835600 0 0 +00} + {1396141200 7200 1 +02} + {1414285200 0 0 +00} + {1427590800 7200 1 +02} + {1445734800 0 0 +00} + {1459040400 7200 1 +02} + {1477789200 0 0 +00} + {1490490000 7200 1 +02} + {1509238800 0 0 +00} + {1521939600 7200 1 +02} + {1540688400 0 0 +00} + {1553994000 7200 1 +02} + {1572138000 0 0 +00} + {1585443600 7200 1 +02} + {1603587600 0 0 +00} + {1616893200 7200 1 +02} + {1635642000 0 0 +00} + {1648342800 7200 1 +02} + {1667091600 0 0 +00} + {1679792400 7200 1 +02} + {1698541200 0 0 +00} + {1711846800 7200 1 +02} + {1729990800 0 0 +00} + {1743296400 7200 1 +02} + {1761440400 0 0 +00} + {1774746000 7200 1 +02} + {1792890000 0 0 +00} + {1806195600 7200 1 +02} + {1824944400 0 0 +00} + {1837645200 7200 1 +02} + {1856394000 0 0 +00} + {1869094800 7200 1 +02} + {1887843600 0 0 +00} + {1901149200 7200 1 +02} + {1919293200 0 0 +00} + {1932598800 7200 1 +02} + {1950742800 0 0 +00} + {1964048400 7200 1 +02} + {1982797200 0 0 +00} + {1995498000 7200 1 +02} + {2014246800 0 0 +00} + {2026947600 7200 1 +02} + {2045696400 0 0 +00} + {2058397200 7200 1 +02} + {2077146000 0 0 +00} + {2090451600 7200 1 +02} + {2108595600 0 0 +00} + {2121901200 7200 1 +02} + {2140045200 0 0 +00} + {2153350800 7200 1 +02} + {2172099600 0 0 +00} + {2184800400 7200 1 +02} + {2203549200 0 0 +00} + {2216250000 7200 1 +02} + {2234998800 0 0 +00} + {2248304400 7200 1 +02} + {2266448400 0 0 +00} + {2279754000 7200 1 +02} + {2297898000 0 0 +00} + {2311203600 7200 1 +02} + {2329347600 0 0 +00} + {2342653200 7200 1 +02} + {2361402000 0 0 +00} + {2374102800 7200 1 +02} + {2392851600 0 0 +00} + {2405552400 7200 1 +02} + {2424301200 0 0 +00} + {2437606800 7200 1 +02} + {2455750800 0 0 +00} + {2469056400 7200 1 +02} + {2487200400 0 0 +00} + {2500506000 7200 1 +02} + {2519254800 0 0 +00} + {2531955600 7200 1 +02} + {2550704400 0 0 +00} + {2563405200 7200 1 +02} + {2582154000 0 0 +00} + {2595459600 7200 1 +02} + {2613603600 0 0 +00} + {2626909200 7200 1 +02} + {2645053200 0 0 +00} + {2658358800 7200 1 +02} + {2676502800 0 0 +00} + {2689808400 7200 1 +02} + {2708557200 0 0 +00} + {2721258000 7200 1 +02} + {2740006800 0 0 +00} + {2752707600 7200 1 +02} + {2771456400 0 0 +00} + {2784762000 7200 1 +02} + {2802906000 0 0 +00} + {2816211600 7200 1 +02} + {2834355600 0 0 +00} + {2847661200 7200 1 +02} + {2866410000 0 0 +00} + {2879110800 7200 1 +02} + {2897859600 0 0 +00} + {2910560400 7200 1 +02} + {2929309200 0 0 +00} + {2942010000 7200 1 +02} + {2960758800 0 0 +00} + {2974064400 7200 1 +02} + {2992208400 0 0 +00} + {3005514000 7200 1 +02} + {3023658000 0 0 +00} + {3036963600 7200 1 +02} + {3055712400 0 0 +00} + {3068413200 7200 1 +02} + {3087162000 0 0 +00} + {3099862800 7200 1 +02} + {3118611600 0 0 +00} + {3131917200 7200 1 +02} + {3150061200 0 0 +00} + {3163366800 7200 1 +02} + {3181510800 0 0 +00} + {3194816400 7200 1 +02} + {3212960400 0 0 +00} + {3226266000 7200 1 +02} + {3245014800 0 0 +00} + {3257715600 7200 1 +02} + {3276464400 0 0 +00} + {3289165200 7200 1 +02} + {3307914000 0 0 +00} + {3321219600 7200 1 +02} + {3339363600 0 0 +00} + {3352669200 7200 1 +02} + {3370813200 0 0 +00} + {3384118800 7200 1 +02} + {3402867600 0 0 +00} + {3415568400 7200 1 +02} + {3434317200 0 0 +00} + {3447018000 7200 1 +02} + {3465766800 0 0 +00} + {3479072400 7200 1 +02} + {3497216400 0 0 +00} + {3510522000 7200 1 +02} + {3528666000 0 0 +00} + {3541971600 7200 1 +02} + {3560115600 0 0 +00} + {3573421200 7200 1 +02} + {3592170000 0 0 +00} + {3604870800 7200 1 +02} + {3623619600 0 0 +00} + {3636320400 7200 1 +02} + {3655069200 0 0 +00} + {3668374800 7200 1 +02} + {3686518800 0 0 +00} + {3699824400 7200 1 +02} + {3717968400 0 0 +00} + {3731274000 7200 1 +02} + {3750022800 0 0 +00} + {3762723600 7200 1 +02} + {3781472400 0 0 +00} + {3794173200 7200 1 +02} + {3812922000 0 0 +00} + {3825622800 7200 1 +02} + {3844371600 0 0 +00} + {3857677200 7200 1 +02} + {3875821200 0 0 +00} + {3889126800 7200 1 +02} + {3907270800 0 0 +00} + {3920576400 7200 1 +02} + {3939325200 0 0 +00} + {3952026000 7200 1 +02} + {3970774800 0 0 +00} + {3983475600 7200 1 +02} + {4002224400 0 0 +00} + {4015530000 7200 1 +02} + {4033674000 0 0 +00} + {4046979600 7200 1 +02} + {4065123600 0 0 +00} + {4078429200 7200 1 +02} + {4096573200 0 0 +00} +} diff --git a/env/tcl/tcl8.6/tzdata/Antarctica/Vostok b/env/tcl/tcl8.6/tzdata/Antarctica/Vostok new file mode 100644 index 0000000..7f345a2 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Antarctica/Vostok @@ -0,0 +1,6 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Antarctica/Vostok) { + {-9223372036854775808 0 0 -00} + {-380073600 21600 0 +06} +} diff --git a/env/tcl/tcl8.6/tzdata/Arctic/Longyearbyen b/env/tcl/tcl8.6/tzdata/Arctic/Longyearbyen new file mode 100644 index 0000000..51f83dc --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Arctic/Longyearbyen @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(Europe/Oslo)]} { + LoadTimeZoneFile Europe/Oslo +} +set TZData(:Arctic/Longyearbyen) $TZData(:Europe/Oslo) diff --git a/env/tcl/tcl8.6/tzdata/Asia/Aden b/env/tcl/tcl8.6/tzdata/Asia/Aden new file mode 100644 index 0000000..5c5515e --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Asia/Aden @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(Asia/Riyadh)]} { + LoadTimeZoneFile Asia/Riyadh +} +set TZData(:Asia/Aden) $TZData(:Asia/Riyadh) diff --git a/env/tcl/tcl8.6/tzdata/Asia/Almaty b/env/tcl/tcl8.6/tzdata/Asia/Almaty new file mode 100644 index 0000000..f42935d --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Asia/Almaty @@ -0,0 +1,57 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Asia/Almaty) { + {-9223372036854775808 18468 0 LMT} + {-1441170468 18000 0 +05} + {-1247547600 21600 0 +06} + {354909600 25200 1 +06} + {370717200 21600 0 +06} + {386445600 25200 1 +06} + {402253200 21600 0 +06} + {417981600 25200 1 +06} + {433789200 21600 0 +06} + {449604000 25200 1 +06} + {465336000 21600 0 +06} + {481060800 25200 1 +06} + {496785600 21600 0 +06} + {512510400 25200 1 +06} + {528235200 21600 0 +06} + {543960000 25200 1 +06} + {559684800 21600 0 +06} + {575409600 25200 1 +06} + {591134400 21600 0 +06} + {606859200 25200 1 +06} + {622584000 21600 0 +06} + {638308800 25200 1 +06} + {654638400 21600 0 +06} + {670363200 18000 0 +05} + {670366800 21600 1 +05} + {686091600 18000 0 +05} + {695768400 21600 0 +06} + {701812800 25200 1 +06} + {717537600 21600 0 +06} + {733262400 25200 1 +06} + {748987200 21600 0 +06} + {764712000 25200 1 +06} + {780436800 21600 0 +06} + {796161600 25200 1 +06} + {811886400 21600 0 +06} + {828216000 25200 1 +06} + {846360000 21600 0 +06} + {859665600 25200 1 +06} + {877809600 21600 0 +06} + {891115200 25200 1 +06} + {909259200 21600 0 +06} + {922564800 25200 1 +06} + {941313600 21600 0 +06} + {954014400 25200 1 +06} + {972763200 21600 0 +06} + {985464000 25200 1 +06} + {1004212800 21600 0 +06} + {1017518400 25200 1 +06} + {1035662400 21600 0 +06} + {1048968000 25200 1 +06} + {1067112000 21600 0 +06} + {1080417600 25200 1 +06} + {1099166400 21600 0 +06} +} diff --git a/env/tcl/tcl8.6/tzdata/Asia/Amman b/env/tcl/tcl8.6/tzdata/Asia/Amman new file mode 100644 index 0000000..c2f6904 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Asia/Amman @@ -0,0 +1,246 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Asia/Amman) { + {-9223372036854775808 8624 0 LMT} + {-1230776624 7200 0 EET} + {108165600 10800 1 EEST} + {118270800 7200 0 EET} + {136591200 10800 1 EEST} + {149806800 7200 0 EET} + {168127200 10800 1 EEST} + {181342800 7200 0 EET} + {199749600 10800 1 EEST} + {215643600 7200 0 EET} + {231285600 10800 1 EEST} + {244501200 7200 0 EET} + {262735200 10800 1 EEST} + {275950800 7200 0 EET} + {481154400 10800 1 EEST} + {496962000 7200 0 EET} + {512949600 10800 1 EEST} + {528670800 7200 0 EET} + {544399200 10800 1 EEST} + {560120400 7200 0 EET} + {575848800 10800 1 EEST} + {592174800 7200 0 EET} + {610581600 10800 1 EEST} + {623624400 7200 0 EET} + {641167200 10800 1 EEST} + {655074000 7200 0 EET} + {671839200 10800 1 EEST} + {685918800 7200 0 EET} + {702856800 10800 1 EEST} + {717973200 7200 0 EET} + {733701600 10800 1 EEST} + {749422800 7200 0 EET} + {765151200 10800 1 EEST} + {779662800 7200 0 EET} + {797205600 10800 1 EEST} + {811116000 7200 0 EET} + {828655200 10800 1 EEST} + {843170400 7200 0 EET} + {860104800 10800 1 EEST} + {874620000 7200 0 EET} + {891554400 10800 1 EEST} + {906069600 7200 0 EET} + {930780000 10800 1 EEST} + {938124000 7200 0 EET} + {954367200 10800 1 EEST} + {970178400 7200 0 EET} + {985816800 10800 1 EEST} + {1001628000 7200 0 EET} + {1017352800 10800 1 EEST} + {1033077600 7200 0 EET} + {1048802400 10800 1 EEST} + {1066946400 7200 0 EET} + {1080252000 10800 1 EEST} + {1097791200 7200 0 EET} + {1112306400 10800 1 EEST} + {1128031200 7200 0 EET} + {1143756000 10800 1 EEST} + {1161900000 7200 0 EET} + {1175205600 10800 1 EEST} + {1193349600 7200 0 EET} + {1206655200 10800 1 EEST} + {1225404000 7200 0 EET} + {1238104800 10800 1 EEST} + {1256853600 7200 0 EET} + {1269554400 10800 1 EEST} + {1288303200 7200 0 EET} + {1301608800 10800 1 EEST} + {1319752800 7200 0 EET} + {1333058400 10800 1 EEST} + {1387486800 7200 0 EET} + {1395957600 10800 1 EEST} + {1414706400 7200 0 EET} + {1427407200 10800 1 EEST} + {1446156000 7200 0 EET} + {1459461600 10800 1 EEST} + {1477605600 7200 0 EET} + {1490911200 10800 1 EEST} + {1509055200 7200 0 EET} + {1522360800 10800 1 EEST} + {1540504800 7200 0 EET} + {1553810400 10800 1 EEST} + {1571954400 7200 0 EET} + {1585260000 10800 1 EEST} + {1604008800 7200 0 EET} + {1616709600 10800 1 EEST} + {1635458400 7200 0 EET} + {1648764000 10800 1 EEST} + {1666908000 7200 0 EET} + {1680213600 10800 1 EEST} + {1698357600 7200 0 EET} + {1711663200 10800 1 EEST} + {1729807200 7200 0 EET} + {1743112800 10800 1 EEST} + {1761861600 7200 0 EET} + {1774562400 10800 1 EEST} + {1793311200 7200 0 EET} + {1806012000 10800 1 EEST} + {1824760800 7200 0 EET} + {1838066400 10800 1 EEST} + {1856210400 7200 0 EET} + {1869516000 10800 1 EEST} + {1887660000 7200 0 EET} + {1900965600 10800 1 EEST} + {1919109600 7200 0 EET} + {1932415200 10800 1 EEST} + {1951164000 7200 0 EET} + {1963864800 10800 1 EEST} + {1982613600 7200 0 EET} + {1995919200 10800 1 EEST} + {2014063200 7200 0 EET} + {2027368800 10800 1 EEST} + {2045512800 7200 0 EET} + {2058818400 10800 1 EEST} + {2076962400 7200 0 EET} + {2090268000 10800 1 EEST} + {2109016800 7200 0 EET} + {2121717600 10800 1 EEST} + {2140466400 7200 0 EET} + {2153167200 10800 1 EEST} + {2171916000 7200 0 EET} + {2185221600 10800 1 EEST} + {2203365600 7200 0 EET} + {2216671200 10800 1 EEST} + {2234815200 7200 0 EET} + {2248120800 10800 1 EEST} + {2266264800 7200 0 EET} + {2279570400 10800 1 EEST} + {2298319200 7200 0 EET} + {2311020000 10800 1 EEST} + {2329768800 7200 0 EET} + {2343074400 10800 1 EEST} + {2361218400 7200 0 EET} + {2374524000 10800 1 EEST} + {2392668000 7200 0 EET} + {2405973600 10800 1 EEST} + {2424117600 7200 0 EET} + {2437423200 10800 1 EEST} + {2455567200 7200 0 EET} + {2468872800 10800 1 EEST} + {2487621600 7200 0 EET} + {2500322400 10800 1 EEST} + {2519071200 7200 0 EET} + {2532376800 10800 1 EEST} + {2550520800 7200 0 EET} + {2563826400 10800 1 EEST} + {2581970400 7200 0 EET} + {2595276000 10800 1 EEST} + {2613420000 7200 0 EET} + {2626725600 10800 1 EEST} + {2645474400 7200 0 EET} + {2658175200 10800 1 EEST} + {2676924000 7200 0 EET} + {2689624800 10800 1 EEST} + {2708373600 7200 0 EET} + {2721679200 10800 1 EEST} + {2739823200 7200 0 EET} + {2753128800 10800 1 EEST} + {2771272800 7200 0 EET} + {2784578400 10800 1 EEST} + {2802722400 7200 0 EET} + {2816028000 10800 1 EEST} + {2834776800 7200 0 EET} + {2847477600 10800 1 EEST} + {2866226400 7200 0 EET} + {2879532000 10800 1 EEST} + {2897676000 7200 0 EET} + {2910981600 10800 1 EEST} + {2929125600 7200 0 EET} + {2942431200 10800 1 EEST} + {2960575200 7200 0 EET} + {2973880800 10800 1 EEST} + {2992629600 7200 0 EET} + {3005330400 10800 1 EEST} + {3024079200 7200 0 EET} + {3036780000 10800 1 EEST} + {3055528800 7200 0 EET} + {3068834400 10800 1 EEST} + {3086978400 7200 0 EET} + {3100284000 10800 1 EEST} + {3118428000 7200 0 EET} + {3131733600 10800 1 EEST} + {3149877600 7200 0 EET} + {3163183200 10800 1 EEST} + {3181932000 7200 0 EET} + {3194632800 10800 1 EEST} + {3213381600 7200 0 EET} + {3226687200 10800 1 EEST} + {3244831200 7200 0 EET} + {3258136800 10800 1 EEST} + {3276280800 7200 0 EET} + {3289586400 10800 1 EEST} + {3307730400 7200 0 EET} + {3321036000 10800 1 EEST} + {3339180000 7200 0 EET} + {3352485600 10800 1 EEST} + {3371234400 7200 0 EET} + {3383935200 10800 1 EEST} + {3402684000 7200 0 EET} + {3415989600 10800 1 EEST} + {3434133600 7200 0 EET} + {3447439200 10800 1 EEST} + {3465583200 7200 0 EET} + {3478888800 10800 1 EEST} + {3497032800 7200 0 EET} + {3510338400 10800 1 EEST} + {3529087200 7200 0 EET} + {3541788000 10800 1 EEST} + {3560536800 7200 0 EET} + {3573237600 10800 1 EEST} + {3591986400 7200 0 EET} + {3605292000 10800 1 EEST} + {3623436000 7200 0 EET} + {3636741600 10800 1 EEST} + {3654885600 7200 0 EET} + {3668191200 10800 1 EEST} + {3686335200 7200 0 EET} + {3699640800 10800 1 EEST} + {3718389600 7200 0 EET} + {3731090400 10800 1 EEST} + {3749839200 7200 0 EET} + {3763144800 10800 1 EEST} + {3781288800 7200 0 EET} + {3794594400 10800 1 EEST} + {3812738400 7200 0 EET} + {3826044000 10800 1 EEST} + {3844188000 7200 0 EET} + {3857493600 10800 1 EEST} + {3876242400 7200 0 EET} + {3888943200 10800 1 EEST} + {3907692000 7200 0 EET} + {3920392800 10800 1 EEST} + {3939141600 7200 0 EET} + {3952447200 10800 1 EEST} + {3970591200 7200 0 EET} + {3983896800 10800 1 EEST} + {4002040800 7200 0 EET} + {4015346400 10800 1 EEST} + {4033490400 7200 0 EET} + {4046796000 10800 1 EEST} + {4065544800 7200 0 EET} + {4078245600 10800 1 EEST} + {4096994400 7200 0 EET} +} diff --git a/env/tcl/tcl8.6/tzdata/Asia/Anadyr b/env/tcl/tcl8.6/tzdata/Asia/Anadyr new file mode 100644 index 0000000..d1314c6 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Asia/Anadyr @@ -0,0 +1,72 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Asia/Anadyr) { + {-9223372036854775808 42596 0 LMT} + {-1441194596 43200 0 +12} + {-1247572800 46800 0 +14} + {354884400 50400 1 +14} + {370692000 46800 0 +13} + {386420400 43200 0 +13} + {386424000 46800 1 +13} + {402231600 43200 0 +12} + {417960000 46800 1 +13} + {433767600 43200 0 +12} + {449582400 46800 1 +13} + {465314400 43200 0 +12} + {481039200 46800 1 +13} + {496764000 43200 0 +12} + {512488800 46800 1 +13} + {528213600 43200 0 +12} + {543938400 46800 1 +13} + {559663200 43200 0 +12} + {575388000 46800 1 +13} + {591112800 43200 0 +12} + {606837600 46800 1 +13} + {622562400 43200 0 +12} + {638287200 46800 1 +13} + {654616800 43200 0 +12} + {670341600 39600 0 +12} + {670345200 43200 1 +12} + {686070000 39600 0 +11} + {695746800 43200 0 +13} + {701791200 46800 1 +13} + {717516000 43200 0 +12} + {733240800 46800 1 +13} + {748965600 43200 0 +12} + {764690400 46800 1 +13} + {780415200 43200 0 +12} + {796140000 46800 1 +13} + {811864800 43200 0 +12} + {828194400 46800 1 +13} + {846338400 43200 0 +12} + {859644000 46800 1 +13} + {877788000 43200 0 +12} + {891093600 46800 1 +13} + {909237600 43200 0 +12} + {922543200 46800 1 +13} + {941292000 43200 0 +12} + {953992800 46800 1 +13} + {972741600 43200 0 +12} + {985442400 46800 1 +13} + {1004191200 43200 0 +12} + {1017496800 46800 1 +13} + {1035640800 43200 0 +12} + {1048946400 46800 1 +13} + {1067090400 43200 0 +12} + {1080396000 46800 1 +13} + {1099144800 43200 0 +12} + {1111845600 46800 1 +13} + {1130594400 43200 0 +12} + {1143295200 46800 1 +13} + {1162044000 43200 0 +12} + {1174744800 46800 1 +13} + {1193493600 43200 0 +12} + {1206799200 46800 1 +13} + {1224943200 43200 0 +12} + {1238248800 46800 1 +13} + {1256392800 43200 0 +12} + {1269698400 39600 0 +12} + {1269702000 43200 1 +12} + {1288450800 39600 0 +11} + {1301151600 43200 0 +12} +} diff --git a/env/tcl/tcl8.6/tzdata/Asia/Aqtau b/env/tcl/tcl8.6/tzdata/Asia/Aqtau new file mode 100644 index 0000000..41da2ca --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Asia/Aqtau @@ -0,0 +1,58 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Asia/Aqtau) { + {-9223372036854775808 12064 0 LMT} + {-1441164064 14400 0 +04} + {-1247544000 18000 0 +05} + {370724400 21600 0 +06} + {386445600 18000 0 +05} + {386449200 21600 1 +05} + {402256800 18000 0 +05} + {417985200 21600 1 +05} + {433792800 18000 0 +05} + {449607600 21600 1 +05} + {465339600 18000 0 +05} + {481064400 21600 1 +05} + {496789200 18000 0 +05} + {512514000 21600 1 +05} + {528238800 18000 0 +05} + {543963600 21600 1 +05} + {559688400 18000 0 +05} + {575413200 21600 1 +05} + {591138000 18000 0 +05} + {606862800 21600 1 +05} + {622587600 18000 0 +05} + {638312400 21600 1 +05} + {654642000 18000 0 +05} + {670366800 14400 0 +04} + {670370400 18000 1 +04} + {686095200 14400 0 +04} + {695772000 18000 0 +05} + {701816400 21600 1 +05} + {717541200 18000 0 +05} + {733266000 21600 1 +05} + {748990800 18000 0 +05} + {764715600 21600 1 +05} + {780440400 18000 0 +04} + {780444000 14400 0 +04} + {796168800 18000 1 +04} + {811893600 14400 0 +04} + {828223200 18000 1 +04} + {846367200 14400 0 +04} + {859672800 18000 1 +04} + {877816800 14400 0 +04} + {891122400 18000 1 +04} + {909266400 14400 0 +04} + {922572000 18000 1 +04} + {941320800 14400 0 +04} + {954021600 18000 1 +04} + {972770400 14400 0 +04} + {985471200 18000 1 +04} + {1004220000 14400 0 +04} + {1017525600 18000 1 +04} + {1035669600 14400 0 +04} + {1048975200 18000 1 +04} + {1067119200 14400 0 +04} + {1080424800 18000 1 +04} + {1099173600 18000 0 +05} +} diff --git a/env/tcl/tcl8.6/tzdata/Asia/Aqtobe b/env/tcl/tcl8.6/tzdata/Asia/Aqtobe new file mode 100644 index 0000000..2316e68 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Asia/Aqtobe @@ -0,0 +1,58 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Asia/Aqtobe) { + {-9223372036854775808 13720 0 LMT} + {-1441165720 14400 0 +04} + {-1247544000 18000 0 +05} + {354913200 21600 1 +06} + {370720800 21600 0 +06} + {386445600 18000 0 +05} + {386449200 21600 1 +05} + {402256800 18000 0 +05} + {417985200 21600 1 +05} + {433792800 18000 0 +05} + {449607600 21600 1 +05} + {465339600 18000 0 +05} + {481064400 21600 1 +05} + {496789200 18000 0 +05} + {512514000 21600 1 +05} + {528238800 18000 0 +05} + {543963600 21600 1 +05} + {559688400 18000 0 +05} + {575413200 21600 1 +05} + {591138000 18000 0 +05} + {606862800 21600 1 +05} + {622587600 18000 0 +05} + {638312400 21600 1 +05} + {654642000 18000 0 +05} + {670366800 14400 0 +04} + {670370400 18000 1 +04} + {686095200 14400 0 +04} + {695772000 18000 0 +05} + {701816400 21600 1 +05} + {717541200 18000 0 +05} + {733266000 21600 1 +05} + {748990800 18000 0 +05} + {764715600 21600 1 +05} + {780440400 18000 0 +05} + {796165200 21600 1 +05} + {811890000 18000 0 +05} + {828219600 21600 1 +05} + {846363600 18000 0 +05} + {859669200 21600 1 +05} + {877813200 18000 0 +05} + {891118800 21600 1 +05} + {909262800 18000 0 +05} + {922568400 21600 1 +05} + {941317200 18000 0 +05} + {954018000 21600 1 +05} + {972766800 18000 0 +05} + {985467600 21600 1 +05} + {1004216400 18000 0 +05} + {1017522000 21600 1 +05} + {1035666000 18000 0 +05} + {1048971600 21600 1 +05} + {1067115600 18000 0 +05} + {1080421200 21600 1 +05} + {1099170000 18000 0 +05} +} diff --git a/env/tcl/tcl8.6/tzdata/Asia/Ashgabat b/env/tcl/tcl8.6/tzdata/Asia/Ashgabat new file mode 100644 index 0000000..feb7725 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Asia/Ashgabat @@ -0,0 +1,31 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Asia/Ashgabat) { + {-9223372036854775808 14012 0 LMT} + {-1441166012 14400 0 +04} + {-1247544000 18000 0 +05} + {354913200 21600 1 +05} + {370720800 18000 0 +05} + {386449200 21600 1 +05} + {402256800 18000 0 +05} + {417985200 21600 1 +05} + {433792800 18000 0 +05} + {449607600 21600 1 +05} + {465339600 18000 0 +05} + {481064400 21600 1 +05} + {496789200 18000 0 +05} + {512514000 21600 1 +05} + {528238800 18000 0 +05} + {543963600 21600 1 +05} + {559688400 18000 0 +05} + {575413200 21600 1 +05} + {591138000 18000 0 +05} + {606862800 21600 1 +05} + {622587600 18000 0 +05} + {638312400 21600 1 +05} + {654642000 18000 0 +05} + {670366800 14400 0 +04} + {670370400 18000 1 +04} + {686095200 14400 0 +04} + {695772000 18000 0 +05} +} diff --git a/env/tcl/tcl8.6/tzdata/Asia/Ashkhabad b/env/tcl/tcl8.6/tzdata/Asia/Ashkhabad new file mode 100644 index 0000000..3000c94 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Asia/Ashkhabad @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(Asia/Ashgabat)]} { + LoadTimeZoneFile Asia/Ashgabat +} +set TZData(:Asia/Ashkhabad) $TZData(:Asia/Ashgabat) diff --git a/env/tcl/tcl8.6/tzdata/Asia/Atyrau b/env/tcl/tcl8.6/tzdata/Asia/Atyrau new file mode 100644 index 0000000..b6d8253 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Asia/Atyrau @@ -0,0 +1,58 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Asia/Atyrau) { + {-9223372036854775808 12464 0 LMT} + {-1441164464 10800 0 +03} + {-1247540400 18000 0 +05} + {370724400 21600 0 +06} + {386445600 18000 0 +05} + {386449200 21600 1 +05} + {402256800 18000 0 +05} + {417985200 21600 1 +05} + {433792800 18000 0 +05} + {449607600 21600 1 +05} + {465339600 18000 0 +05} + {481064400 21600 1 +05} + {496789200 18000 0 +05} + {512514000 21600 1 +05} + {528238800 18000 0 +05} + {543963600 21600 1 +05} + {559688400 18000 0 +05} + {575413200 21600 1 +05} + {591138000 18000 0 +05} + {606862800 21600 1 +05} + {622587600 18000 0 +05} + {638312400 21600 1 +05} + {654642000 18000 0 +05} + {670366800 14400 0 +04} + {670370400 18000 1 +04} + {686095200 14400 0 +04} + {695772000 18000 0 +05} + {701816400 21600 1 +05} + {717541200 18000 0 +05} + {733266000 21600 1 +05} + {748990800 18000 0 +05} + {764715600 21600 1 +05} + {780440400 18000 0 +05} + {796165200 21600 1 +05} + {811890000 18000 0 +05} + {828219600 21600 1 +05} + {846363600 18000 0 +05} + {859669200 21600 1 +05} + {877813200 18000 0 +05} + {891118800 21600 1 +05} + {909262800 18000 0 +05} + {922568400 14400 0 +04} + {922572000 18000 1 +04} + {941320800 14400 0 +04} + {954021600 18000 1 +04} + {972770400 14400 0 +04} + {985471200 18000 1 +04} + {1004220000 14400 0 +04} + {1017525600 18000 1 +04} + {1035669600 14400 0 +04} + {1048975200 18000 1 +04} + {1067119200 14400 0 +04} + {1080424800 18000 1 +04} + {1099173600 18000 0 +05} +} diff --git a/env/tcl/tcl8.6/tzdata/Asia/Baghdad b/env/tcl/tcl8.6/tzdata/Asia/Baghdad new file mode 100644 index 0000000..c76a6a1 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Asia/Baghdad @@ -0,0 +1,59 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Asia/Baghdad) { + {-9223372036854775808 10660 0 LMT} + {-2524532260 10656 0 BMT} + {-1641005856 10800 0 +03} + {389048400 14400 0 +03} + {402264000 10800 0 +03} + {417906000 14400 1 +03} + {433800000 10800 0 +03} + {449614800 14400 1 +03} + {465422400 10800 0 +03} + {481150800 14400 1 +03} + {496792800 10800 0 +03} + {512517600 14400 1 +03} + {528242400 10800 0 +03} + {543967200 14400 1 +03} + {559692000 10800 0 +03} + {575416800 14400 1 +03} + {591141600 10800 0 +03} + {606866400 14400 1 +03} + {622591200 10800 0 +03} + {638316000 14400 1 +03} + {654645600 10800 0 +03} + {670464000 14400 1 +03} + {686275200 10800 0 +03} + {702086400 14400 1 +03} + {717897600 10800 0 +03} + {733622400 14400 1 +03} + {749433600 10800 0 +03} + {765158400 14400 1 +03} + {780969600 10800 0 +03} + {796694400 14400 1 +03} + {812505600 10800 0 +03} + {828316800 14400 1 +03} + {844128000 10800 0 +03} + {859852800 14400 1 +03} + {875664000 10800 0 +03} + {891388800 14400 1 +03} + {907200000 10800 0 +03} + {922924800 14400 1 +03} + {938736000 10800 0 +03} + {954547200 14400 1 +03} + {970358400 10800 0 +03} + {986083200 14400 1 +03} + {1001894400 10800 0 +03} + {1017619200 14400 1 +03} + {1033430400 10800 0 +03} + {1049155200 14400 1 +03} + {1064966400 10800 0 +03} + {1080777600 14400 1 +03} + {1096588800 10800 0 +03} + {1112313600 14400 1 +03} + {1128124800 10800 0 +03} + {1143849600 14400 1 +03} + {1159660800 10800 0 +03} + {1175385600 14400 1 +03} + {1191196800 10800 0 +03} +} diff --git a/env/tcl/tcl8.6/tzdata/Asia/Bahrain b/env/tcl/tcl8.6/tzdata/Asia/Bahrain new file mode 100644 index 0000000..aab5b7d --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Asia/Bahrain @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(Asia/Qatar)]} { + LoadTimeZoneFile Asia/Qatar +} +set TZData(:Asia/Bahrain) $TZData(:Asia/Qatar) diff --git a/env/tcl/tcl8.6/tzdata/Asia/Baku b/env/tcl/tcl8.6/tzdata/Asia/Baku new file mode 100644 index 0000000..03dee19 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Asia/Baku @@ -0,0 +1,74 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Asia/Baku) { + {-9223372036854775808 11964 0 LMT} + {-1441163964 10800 0 +03} + {-405140400 14400 0 +04} + {354916800 18000 1 +04} + {370724400 14400 0 +04} + {386452800 18000 1 +04} + {402260400 14400 0 +04} + {417988800 18000 1 +04} + {433796400 14400 0 +04} + {449611200 18000 1 +04} + {465343200 14400 0 +04} + {481068000 18000 1 +04} + {496792800 14400 0 +04} + {512517600 18000 1 +04} + {528242400 14400 0 +04} + {543967200 18000 1 +04} + {559692000 14400 0 +04} + {575416800 18000 1 +04} + {591141600 14400 0 +04} + {606866400 18000 1 +04} + {622591200 14400 0 +04} + {638316000 18000 1 +04} + {654645600 14400 0 +04} + {670370400 10800 0 +03} + {670374000 14400 1 +03} + {686098800 10800 0 +03} + {701823600 14400 1 +03} + {717548400 14400 0 +04} + {820440000 14400 0 +04} + {828234000 18000 1 +05} + {846378000 14400 0 +04} + {852062400 14400 0 +04} + {859680000 18000 1 +04} + {877824000 14400 0 +04} + {891129600 18000 1 +04} + {909273600 14400 0 +04} + {922579200 18000 1 +04} + {941328000 14400 0 +04} + {954028800 18000 1 +04} + {972777600 14400 0 +04} + {985478400 18000 1 +04} + {1004227200 14400 0 +04} + {1017532800 18000 1 +04} + {1035676800 14400 0 +04} + {1048982400 18000 1 +04} + {1067126400 14400 0 +04} + {1080432000 18000 1 +04} + {1099180800 14400 0 +04} + {1111881600 18000 1 +04} + {1130630400 14400 0 +04} + {1143331200 18000 1 +04} + {1162080000 14400 0 +04} + {1174780800 18000 1 +04} + {1193529600 14400 0 +04} + {1206835200 18000 1 +04} + {1224979200 14400 0 +04} + {1238284800 18000 1 +04} + {1256428800 14400 0 +04} + {1269734400 18000 1 +04} + {1288483200 14400 0 +04} + {1301184000 18000 1 +04} + {1319932800 14400 0 +04} + {1332633600 18000 1 +04} + {1351382400 14400 0 +04} + {1364688000 18000 1 +04} + {1382832000 14400 0 +04} + {1396137600 18000 1 +04} + {1414281600 14400 0 +04} + {1427587200 18000 1 +04} + {1445731200 14400 0 +04} +} diff --git a/env/tcl/tcl8.6/tzdata/Asia/Bangkok b/env/tcl/tcl8.6/tzdata/Asia/Bangkok new file mode 100644 index 0000000..aeb5473 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Asia/Bangkok @@ -0,0 +1,7 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Asia/Bangkok) { + {-9223372036854775808 24124 0 LMT} + {-2840164924 24124 0 BMT} + {-1570084924 25200 0 +07} +} diff --git a/env/tcl/tcl8.6/tzdata/Asia/Barnaul b/env/tcl/tcl8.6/tzdata/Asia/Barnaul new file mode 100644 index 0000000..bf6abbf --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Asia/Barnaul @@ -0,0 +1,73 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Asia/Barnaul) { + {-9223372036854775808 20100 0 LMT} + {-1579844100 21600 0 +06} + {-1247551200 25200 0 +08} + {354906000 28800 1 +08} + {370713600 25200 0 +07} + {386442000 28800 1 +08} + {402249600 25200 0 +07} + {417978000 28800 1 +08} + {433785600 25200 0 +07} + {449600400 28800 1 +08} + {465332400 25200 0 +07} + {481057200 28800 1 +08} + {496782000 25200 0 +07} + {512506800 28800 1 +08} + {528231600 25200 0 +07} + {543956400 28800 1 +08} + {559681200 25200 0 +07} + {575406000 28800 1 +08} + {591130800 25200 0 +07} + {606855600 28800 1 +08} + {622580400 25200 0 +07} + {638305200 28800 1 +08} + {654634800 25200 0 +07} + {670359600 21600 0 +07} + {670363200 25200 1 +07} + {686088000 21600 0 +06} + {695764800 25200 0 +08} + {701809200 28800 1 +08} + {717534000 25200 0 +07} + {733258800 28800 1 +08} + {748983600 25200 0 +07} + {764708400 28800 1 +08} + {780433200 25200 0 +07} + {796158000 28800 1 +08} + {801594000 25200 0 +07} + {811886400 21600 0 +06} + {828216000 25200 1 +07} + {846360000 21600 0 +06} + {859665600 25200 1 +07} + {877809600 21600 0 +06} + {891115200 25200 1 +07} + {909259200 21600 0 +06} + {922564800 25200 1 +07} + {941313600 21600 0 +06} + {954014400 25200 1 +07} + {972763200 21600 0 +06} + {985464000 25200 1 +07} + {1004212800 21600 0 +06} + {1017518400 25200 1 +07} + {1035662400 21600 0 +06} + {1048968000 25200 1 +07} + {1067112000 21600 0 +06} + {1080417600 25200 1 +07} + {1099166400 21600 0 +06} + {1111867200 25200 1 +07} + {1130616000 21600 0 +06} + {1143316800 25200 1 +07} + {1162065600 21600 0 +06} + {1174766400 25200 1 +07} + {1193515200 21600 0 +06} + {1206820800 25200 1 +07} + {1224964800 21600 0 +06} + {1238270400 25200 1 +07} + {1256414400 21600 0 +06} + {1269720000 25200 1 +07} + {1288468800 21600 0 +06} + {1301169600 25200 0 +07} + {1414263600 21600 0 +06} + {1459022400 25200 0 +07} +} diff --git a/env/tcl/tcl8.6/tzdata/Asia/Beirut b/env/tcl/tcl8.6/tzdata/Asia/Beirut new file mode 100644 index 0000000..ac0a64e --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Asia/Beirut @@ -0,0 +1,270 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Asia/Beirut) { + {-9223372036854775808 8520 0 LMT} + {-2840149320 7200 0 EET} + {-1570413600 10800 1 EEST} + {-1552186800 7200 0 EET} + {-1538359200 10800 1 EEST} + {-1522551600 7200 0 EET} + {-1507514400 10800 1 EEST} + {-1490583600 7200 0 EET} + {-1473645600 10800 1 EEST} + {-1460948400 7200 0 EET} + {-399866400 10800 1 EEST} + {-386650800 7200 0 EET} + {-368330400 10800 1 EEST} + {-355114800 7200 0 EET} + {-336794400 10800 1 EEST} + {-323578800 7200 0 EET} + {-305172000 10800 1 EEST} + {-291956400 7200 0 EET} + {-273636000 10800 1 EEST} + {-260420400 7200 0 EET} + {78012000 10800 1 EEST} + {86734800 7200 0 EET} + {105055200 10800 1 EEST} + {118270800 7200 0 EET} + {136591200 10800 1 EEST} + {149806800 7200 0 EET} + {168127200 10800 1 EEST} + {181342800 7200 0 EET} + {199749600 10800 1 EEST} + {212965200 7200 0 EET} + {231285600 10800 1 EEST} + {244501200 7200 0 EET} + {262735200 10800 1 EEST} + {275950800 7200 0 EET} + {452210400 10800 1 EEST} + {466722000 7200 0 EET} + {483746400 10800 1 EEST} + {498258000 7200 0 EET} + {515282400 10800 1 EEST} + {529794000 7200 0 EET} + {546818400 10800 1 EEST} + {561330000 7200 0 EET} + {581119200 10800 1 EEST} + {592952400 7200 0 EET} + {610754400 10800 1 EEST} + {624488400 7200 0 EET} + {641512800 10800 1 EEST} + {656024400 7200 0 EET} + {673048800 10800 1 EEST} + {687560400 7200 0 EET} + {704671200 10800 1 EEST} + {718146000 7200 0 EET} + {733269600 10800 1 EEST} + {748990800 7200 0 EET} + {764719200 10800 1 EEST} + {780440400 7200 0 EET} + {796168800 10800 1 EEST} + {811890000 7200 0 EET} + {828223200 10800 1 EEST} + {843944400 7200 0 EET} + {859672800 10800 1 EEST} + {875394000 7200 0 EET} + {891122400 10800 1 EEST} + {906843600 7200 0 EET} + {922572000 10800 1 EEST} + {941317200 7200 0 EET} + {954021600 10800 1 EEST} + {972766800 7200 0 EET} + {985471200 10800 1 EEST} + {1004216400 7200 0 EET} + {1017525600 10800 1 EEST} + {1035666000 7200 0 EET} + {1048975200 10800 1 EEST} + {1067115600 7200 0 EET} + {1080424800 10800 1 EEST} + {1099170000 7200 0 EET} + {1111874400 10800 1 EEST} + {1130619600 7200 0 EET} + {1143324000 10800 1 EEST} + {1162069200 7200 0 EET} + {1174773600 10800 1 EEST} + {1193518800 7200 0 EET} + {1206828000 10800 1 EEST} + {1224968400 7200 0 EET} + {1238277600 10800 1 EEST} + {1256418000 7200 0 EET} + {1269727200 10800 1 EEST} + {1288472400 7200 0 EET} + {1301176800 10800 1 EEST} + {1319922000 7200 0 EET} + {1332626400 10800 1 EEST} + {1351371600 7200 0 EET} + {1364680800 10800 1 EEST} + {1382821200 7200 0 EET} + {1396130400 10800 1 EEST} + {1414270800 7200 0 EET} + {1427580000 10800 1 EEST} + {1445720400 7200 0 EET} + {1459029600 10800 1 EEST} + {1477774800 7200 0 EET} + {1490479200 10800 1 EEST} + {1509224400 7200 0 EET} + {1521928800 10800 1 EEST} + {1540674000 7200 0 EET} + {1553983200 10800 1 EEST} + {1572123600 7200 0 EET} + {1585432800 10800 1 EEST} + {1603573200 7200 0 EET} + {1616882400 10800 1 EEST} + {1635627600 7200 0 EET} + {1648332000 10800 1 EEST} + {1667077200 7200 0 EET} + {1679781600 10800 1 EEST} + {1698526800 7200 0 EET} + {1711836000 10800 1 EEST} + {1729976400 7200 0 EET} + {1743285600 10800 1 EEST} + {1761426000 7200 0 EET} + {1774735200 10800 1 EEST} + {1792875600 7200 0 EET} + {1806184800 10800 1 EEST} + {1824930000 7200 0 EET} + {1837634400 10800 1 EEST} + {1856379600 7200 0 EET} + {1869084000 10800 1 EEST} + {1887829200 7200 0 EET} + {1901138400 10800 1 EEST} + {1919278800 7200 0 EET} + {1932588000 10800 1 EEST} + {1950728400 7200 0 EET} + {1964037600 10800 1 EEST} + {1982782800 7200 0 EET} + {1995487200 10800 1 EEST} + {2014232400 7200 0 EET} + {2026936800 10800 1 EEST} + {2045682000 7200 0 EET} + {2058386400 10800 1 EEST} + {2077131600 7200 0 EET} + {2090440800 10800 1 EEST} + {2108581200 7200 0 EET} + {2121890400 10800 1 EEST} + {2140030800 7200 0 EET} + {2153340000 10800 1 EEST} + {2172085200 7200 0 EET} + {2184789600 10800 1 EEST} + {2203534800 7200 0 EET} + {2216239200 10800 1 EEST} + {2234984400 7200 0 EET} + {2248293600 10800 1 EEST} + {2266434000 7200 0 EET} + {2279743200 10800 1 EEST} + {2297883600 7200 0 EET} + {2311192800 10800 1 EEST} + {2329333200 7200 0 EET} + {2342642400 10800 1 EEST} + {2361387600 7200 0 EET} + {2374092000 10800 1 EEST} + {2392837200 7200 0 EET} + {2405541600 10800 1 EEST} + {2424286800 7200 0 EET} + {2437596000 10800 1 EEST} + {2455736400 7200 0 EET} + {2469045600 10800 1 EEST} + {2487186000 7200 0 EET} + {2500495200 10800 1 EEST} + {2519240400 7200 0 EET} + {2531944800 10800 1 EEST} + {2550690000 7200 0 EET} + {2563394400 10800 1 EEST} + {2582139600 7200 0 EET} + {2595448800 10800 1 EEST} + {2613589200 7200 0 EET} + {2626898400 10800 1 EEST} + {2645038800 7200 0 EET} + {2658348000 10800 1 EEST} + {2676488400 7200 0 EET} + {2689797600 10800 1 EEST} + {2708542800 7200 0 EET} + {2721247200 10800 1 EEST} + {2739992400 7200 0 EET} + {2752696800 10800 1 EEST} + {2771442000 7200 0 EET} + {2784751200 10800 1 EEST} + {2802891600 7200 0 EET} + {2816200800 10800 1 EEST} + {2834341200 7200 0 EET} + {2847650400 10800 1 EEST} + {2866395600 7200 0 EET} + {2879100000 10800 1 EEST} + {2897845200 7200 0 EET} + {2910549600 10800 1 EEST} + {2929294800 7200 0 EET} + {2941999200 10800 1 EEST} + {2960744400 7200 0 EET} + {2974053600 10800 1 EEST} + {2992194000 7200 0 EET} + {3005503200 10800 1 EEST} + {3023643600 7200 0 EET} + {3036952800 10800 1 EEST} + {3055698000 7200 0 EET} + {3068402400 10800 1 EEST} + {3087147600 7200 0 EET} + {3099852000 10800 1 EEST} + {3118597200 7200 0 EET} + {3131906400 10800 1 EEST} + {3150046800 7200 0 EET} + {3163356000 10800 1 EEST} + {3181496400 7200 0 EET} + {3194805600 10800 1 EEST} + {3212946000 7200 0 EET} + {3226255200 10800 1 EEST} + {3245000400 7200 0 EET} + {3257704800 10800 1 EEST} + {3276450000 7200 0 EET} + {3289154400 10800 1 EEST} + {3307899600 7200 0 EET} + {3321208800 10800 1 EEST} + {3339349200 7200 0 EET} + {3352658400 10800 1 EEST} + {3370798800 7200 0 EET} + {3384108000 10800 1 EEST} + {3402853200 7200 0 EET} + {3415557600 10800 1 EEST} + {3434302800 7200 0 EET} + {3447007200 10800 1 EEST} + {3465752400 7200 0 EET} + {3479061600 10800 1 EEST} + {3497202000 7200 0 EET} + {3510511200 10800 1 EEST} + {3528651600 7200 0 EET} + {3541960800 10800 1 EEST} + {3560101200 7200 0 EET} + {3573410400 10800 1 EEST} + {3592155600 7200 0 EET} + {3604860000 10800 1 EEST} + {3623605200 7200 0 EET} + {3636309600 10800 1 EEST} + {3655054800 7200 0 EET} + {3668364000 10800 1 EEST} + {3686504400 7200 0 EET} + {3699813600 10800 1 EEST} + {3717954000 7200 0 EET} + {3731263200 10800 1 EEST} + {3750008400 7200 0 EET} + {3762712800 10800 1 EEST} + {3781458000 7200 0 EET} + {3794162400 10800 1 EEST} + {3812907600 7200 0 EET} + {3825612000 10800 1 EEST} + {3844357200 7200 0 EET} + {3857666400 10800 1 EEST} + {3875806800 7200 0 EET} + {3889116000 10800 1 EEST} + {3907256400 7200 0 EET} + {3920565600 10800 1 EEST} + {3939310800 7200 0 EET} + {3952015200 10800 1 EEST} + {3970760400 7200 0 EET} + {3983464800 10800 1 EEST} + {4002210000 7200 0 EET} + {4015519200 10800 1 EEST} + {4033659600 7200 0 EET} + {4046968800 10800 1 EEST} + {4065109200 7200 0 EET} + {4078418400 10800 1 EEST} + {4096558800 7200 0 EET} +} diff --git a/env/tcl/tcl8.6/tzdata/Asia/Bishkek b/env/tcl/tcl8.6/tzdata/Asia/Bishkek new file mode 100644 index 0000000..bc4cbdd --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Asia/Bishkek @@ -0,0 +1,58 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Asia/Bishkek) { + {-9223372036854775808 17904 0 LMT} + {-1441169904 18000 0 +05} + {-1247547600 21600 0 +06} + {354909600 25200 1 +06} + {370717200 21600 0 +06} + {386445600 25200 1 +06} + {402253200 21600 0 +06} + {417981600 25200 1 +06} + {433789200 21600 0 +06} + {449604000 25200 1 +06} + {465336000 21600 0 +06} + {481060800 25200 1 +06} + {496785600 21600 0 +06} + {512510400 25200 1 +06} + {528235200 21600 0 +06} + {543960000 25200 1 +06} + {559684800 21600 0 +06} + {575409600 25200 1 +06} + {591134400 21600 0 +06} + {606859200 25200 1 +06} + {622584000 21600 0 +06} + {638308800 25200 1 +06} + {654638400 21600 0 +06} + {670363200 18000 0 +05} + {670366800 21600 1 +05} + {683586000 18000 0 +05} + {703018800 21600 1 +05} + {717530400 18000 0 +05} + {734468400 21600 1 +05} + {748980000 18000 0 +05} + {765918000 21600 1 +05} + {780429600 18000 0 +05} + {797367600 21600 1 +05} + {811879200 18000 0 +05} + {828817200 21600 1 +05} + {843933600 18000 0 +05} + {859671000 21600 1 +05} + {877811400 18000 0 +05} + {891120600 21600 1 +05} + {909261000 18000 0 +05} + {922570200 21600 1 +05} + {941315400 18000 0 +05} + {954019800 21600 1 +05} + {972765000 18000 0 +05} + {985469400 21600 1 +05} + {1004214600 18000 0 +05} + {1017523800 21600 1 +05} + {1035664200 18000 0 +05} + {1048973400 21600 1 +05} + {1067113800 18000 0 +05} + {1080423000 21600 1 +05} + {1099168200 18000 0 +05} + {1111872600 21600 1 +05} + {1123783200 21600 0 +06} +} diff --git a/env/tcl/tcl8.6/tzdata/Asia/Brunei b/env/tcl/tcl8.6/tzdata/Asia/Brunei new file mode 100644 index 0000000..e8cc8c3 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Asia/Brunei @@ -0,0 +1,7 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Asia/Brunei) { + {-9223372036854775808 27580 0 LMT} + {-1383464380 27000 0 +0730} + {-1167636600 28800 0 +08} +} diff --git a/env/tcl/tcl8.6/tzdata/Asia/Calcutta b/env/tcl/tcl8.6/tzdata/Asia/Calcutta new file mode 100644 index 0000000..7243ef8 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Asia/Calcutta @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(Asia/Kolkata)]} { + LoadTimeZoneFile Asia/Kolkata +} +set TZData(:Asia/Calcutta) $TZData(:Asia/Kolkata) diff --git a/env/tcl/tcl8.6/tzdata/Asia/Chita b/env/tcl/tcl8.6/tzdata/Asia/Chita new file mode 100644 index 0000000..279c016 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Asia/Chita @@ -0,0 +1,72 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Asia/Chita) { + {-9223372036854775808 27232 0 LMT} + {-1579419232 28800 0 +08} + {-1247558400 32400 0 +10} + {354898800 36000 1 +10} + {370706400 32400 0 +09} + {386434800 36000 1 +10} + {402242400 32400 0 +09} + {417970800 36000 1 +10} + {433778400 32400 0 +09} + {449593200 36000 1 +10} + {465325200 32400 0 +09} + {481050000 36000 1 +10} + {496774800 32400 0 +09} + {512499600 36000 1 +10} + {528224400 32400 0 +09} + {543949200 36000 1 +10} + {559674000 32400 0 +09} + {575398800 36000 1 +10} + {591123600 32400 0 +09} + {606848400 36000 1 +10} + {622573200 32400 0 +09} + {638298000 36000 1 +10} + {654627600 32400 0 +09} + {670352400 28800 0 +09} + {670356000 32400 1 +09} + {686080800 28800 0 +08} + {695757600 32400 0 +10} + {701802000 36000 1 +10} + {717526800 32400 0 +09} + {733251600 36000 1 +10} + {748976400 32400 0 +09} + {764701200 36000 1 +10} + {780426000 32400 0 +09} + {796150800 36000 1 +10} + {811875600 32400 0 +09} + {828205200 36000 1 +10} + {846349200 32400 0 +09} + {859654800 36000 1 +10} + {877798800 32400 0 +09} + {891104400 36000 1 +10} + {909248400 32400 0 +09} + {922554000 36000 1 +10} + {941302800 32400 0 +09} + {954003600 36000 1 +10} + {972752400 32400 0 +09} + {985453200 36000 1 +10} + {1004202000 32400 0 +09} + {1017507600 36000 1 +10} + {1035651600 32400 0 +09} + {1048957200 36000 1 +10} + {1067101200 32400 0 +09} + {1080406800 36000 1 +10} + {1099155600 32400 0 +09} + {1111856400 36000 1 +10} + {1130605200 32400 0 +09} + {1143306000 36000 1 +10} + {1162054800 32400 0 +09} + {1174755600 36000 1 +10} + {1193504400 32400 0 +09} + {1206810000 36000 1 +10} + {1224954000 32400 0 +09} + {1238259600 36000 1 +10} + {1256403600 32400 0 +09} + {1269709200 36000 1 +10} + {1288458000 32400 0 +09} + {1301158800 36000 0 +10} + {1414252800 28800 0 +08} + {1459015200 32400 0 +09} +} diff --git a/env/tcl/tcl8.6/tzdata/Asia/Choibalsan b/env/tcl/tcl8.6/tzdata/Asia/Choibalsan new file mode 100644 index 0000000..b072c76 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Asia/Choibalsan @@ -0,0 +1,56 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Asia/Choibalsan) { + {-9223372036854775808 27480 0 LMT} + {-2032933080 25200 0 +07} + {252435600 28800 0 +08} + {417974400 36000 0 +09} + {433778400 32400 0 +09} + {449593200 36000 1 +09} + {465314400 32400 0 +09} + {481042800 36000 1 +09} + {496764000 32400 0 +09} + {512492400 36000 1 +09} + {528213600 32400 0 +09} + {543942000 36000 1 +09} + {559663200 32400 0 +09} + {575391600 36000 1 +09} + {591112800 32400 0 +09} + {606841200 36000 1 +09} + {622562400 32400 0 +09} + {638290800 36000 1 +09} + {654616800 32400 0 +09} + {670345200 36000 1 +09} + {686066400 32400 0 +09} + {701794800 36000 1 +09} + {717516000 32400 0 +09} + {733244400 36000 1 +09} + {748965600 32400 0 +09} + {764694000 36000 1 +09} + {780415200 32400 0 +09} + {796143600 36000 1 +09} + {811864800 32400 0 +09} + {828198000 36000 1 +09} + {843919200 32400 0 +09} + {859647600 36000 1 +09} + {875368800 32400 0 +09} + {891097200 36000 1 +09} + {906818400 32400 0 +09} + {988390800 36000 1 +09} + {1001692800 32400 0 +09} + {1017421200 36000 1 +09} + {1033142400 32400 0 +09} + {1048870800 36000 1 +09} + {1064592000 32400 0 +09} + {1080320400 36000 1 +09} + {1096041600 32400 0 +09} + {1111770000 36000 1 +09} + {1127491200 32400 0 +09} + {1143219600 36000 1 +09} + {1159545600 32400 0 +09} + {1206889200 28800 0 +08} + {1427479200 32400 1 +08} + {1443193200 28800 0 +08} + {1458928800 32400 1 +08} + {1474642800 28800 0 +08} +} diff --git a/env/tcl/tcl8.6/tzdata/Asia/Chongqing b/env/tcl/tcl8.6/tzdata/Asia/Chongqing new file mode 100644 index 0000000..ba515fe --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Asia/Chongqing @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(Asia/Shanghai)]} { + LoadTimeZoneFile Asia/Shanghai +} +set TZData(:Asia/Chongqing) $TZData(:Asia/Shanghai) diff --git a/env/tcl/tcl8.6/tzdata/Asia/Chungking b/env/tcl/tcl8.6/tzdata/Asia/Chungking new file mode 100644 index 0000000..fa857dd --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Asia/Chungking @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(Asia/Shanghai)]} { + LoadTimeZoneFile Asia/Shanghai +} +set TZData(:Asia/Chungking) $TZData(:Asia/Shanghai) diff --git a/env/tcl/tcl8.6/tzdata/Asia/Colombo b/env/tcl/tcl8.6/tzdata/Asia/Colombo new file mode 100644 index 0000000..7a14a9b --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Asia/Colombo @@ -0,0 +1,13 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Asia/Colombo) { + {-9223372036854775808 19164 0 LMT} + {-2840159964 19172 0 MMT} + {-2019705572 19800 0 +0530} + {-883287000 21600 1 +06} + {-862639200 23400 1 +0630} + {-764051400 19800 0 +0530} + {832962600 23400 0 +0630} + {846266400 21600 0 +06} + {1145039400 19800 0 +0530} +} diff --git a/env/tcl/tcl8.6/tzdata/Asia/Dacca b/env/tcl/tcl8.6/tzdata/Asia/Dacca new file mode 100644 index 0000000..b91d7fa --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Asia/Dacca @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(Asia/Dhaka)]} { + LoadTimeZoneFile Asia/Dhaka +} +set TZData(:Asia/Dacca) $TZData(:Asia/Dhaka) diff --git a/env/tcl/tcl8.6/tzdata/Asia/Damascus b/env/tcl/tcl8.6/tzdata/Asia/Damascus new file mode 100644 index 0000000..fafef49 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Asia/Damascus @@ -0,0 +1,280 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Asia/Damascus) { + {-9223372036854775808 8712 0 LMT} + {-1577931912 7200 0 EET} + {-1568592000 10800 1 EEST} + {-1554080400 7200 0 EET} + {-1537142400 10800 1 EEST} + {-1522630800 7200 0 EET} + {-1505692800 10800 1 EEST} + {-1491181200 7200 0 EET} + {-1474243200 10800 1 EEST} + {-1459126800 7200 0 EET} + {-242265600 10800 1 EEST} + {-228877200 7200 0 EET} + {-210556800 10800 1 EEST} + {-197427600 7200 0 EET} + {-178934400 10800 1 EEST} + {-165718800 7200 0 EET} + {-147398400 10800 1 EEST} + {-134269200 7200 0 EET} + {-116467200 10800 1 EEST} + {-102646800 7200 0 EET} + {-84326400 10800 1 EEST} + {-71110800 7200 0 EET} + {-52704000 10800 1 EEST} + {-39488400 7200 0 EET} + {-21168000 10800 1 EEST} + {-7952400 7200 0 EET} + {10368000 10800 1 EEST} + {23583600 7200 0 EET} + {41904000 10800 1 EEST} + {55119600 7200 0 EET} + {73526400 10800 1 EEST} + {86742000 7200 0 EET} + {105062400 10800 1 EEST} + {118278000 7200 0 EET} + {136598400 10800 1 EEST} + {149814000 7200 0 EET} + {168134400 10800 1 EEST} + {181350000 7200 0 EET} + {199756800 10800 1 EEST} + {212972400 7200 0 EET} + {231292800 10800 1 EEST} + {241916400 7200 0 EET} + {262828800 10800 1 EEST} + {273452400 7200 0 EET} + {418694400 10800 1 EEST} + {433810800 7200 0 EET} + {450316800 10800 1 EEST} + {465433200 7200 0 EET} + {508896000 10800 1 EEST} + {529196400 7200 0 EET} + {541555200 10800 1 EEST} + {562633200 7200 0 EET} + {574387200 10800 1 EEST} + {594255600 7200 0 EET} + {607305600 10800 1 EEST} + {623199600 7200 0 EET} + {638928000 10800 1 EEST} + {654649200 7200 0 EET} + {670456800 10800 1 EEST} + {686264400 7200 0 EET} + {702684000 10800 1 EEST} + {717886800 7200 0 EET} + {733096800 10800 1 EEST} + {748904400 7200 0 EET} + {765151200 10800 1 EEST} + {780958800 7200 0 EET} + {796687200 10800 1 EEST} + {812494800 7200 0 EET} + {828309600 10800 1 EEST} + {844117200 7200 0 EET} + {859759200 10800 1 EEST} + {875653200 7200 0 EET} + {891208800 10800 1 EEST} + {907189200 7200 0 EET} + {922917600 10800 1 EEST} + {938725200 7200 0 EET} + {954540000 10800 1 EEST} + {970347600 7200 0 EET} + {986076000 10800 1 EEST} + {1001883600 7200 0 EET} + {1017612000 10800 1 EEST} + {1033419600 7200 0 EET} + {1049148000 10800 1 EEST} + {1064955600 7200 0 EET} + {1080770400 10800 1 EEST} + {1096578000 7200 0 EET} + {1112306400 10800 1 EEST} + {1128114000 7200 0 EET} + {1143842400 10800 1 EEST} + {1158872400 7200 0 EET} + {1175205600 10800 1 EEST} + {1193950800 7200 0 EET} + {1207260000 10800 1 EEST} + {1225486800 7200 0 EET} + {1238104800 10800 1 EEST} + {1256850000 7200 0 EET} + {1270159200 10800 1 EEST} + {1288299600 7200 0 EET} + {1301608800 10800 1 EEST} + {1319749200 7200 0 EET} + {1333058400 10800 1 EEST} + {1351198800 7200 0 EET} + {1364508000 10800 1 EEST} + {1382648400 7200 0 EET} + {1395957600 10800 1 EEST} + {1414702800 7200 0 EET} + {1427407200 10800 1 EEST} + {1446152400 7200 0 EET} + {1458856800 10800 1 EEST} + {1477602000 7200 0 EET} + {1490911200 10800 1 EEST} + {1509051600 7200 0 EET} + {1522360800 10800 1 EEST} + {1540501200 7200 0 EET} + {1553810400 10800 1 EEST} + {1571950800 7200 0 EET} + {1585260000 10800 1 EEST} + {1604005200 7200 0 EET} + {1616709600 10800 1 EEST} + {1635454800 7200 0 EET} + {1648159200 10800 1 EEST} + {1666904400 7200 0 EET} + {1680213600 10800 1 EEST} + {1698354000 7200 0 EET} + {1711663200 10800 1 EEST} + {1729803600 7200 0 EET} + {1743112800 10800 1 EEST} + {1761858000 7200 0 EET} + {1774562400 10800 1 EEST} + {1793307600 7200 0 EET} + {1806012000 10800 1 EEST} + {1824757200 7200 0 EET} + {1838066400 10800 1 EEST} + {1856206800 7200 0 EET} + {1869516000 10800 1 EEST} + {1887656400 7200 0 EET} + {1900965600 10800 1 EEST} + {1919106000 7200 0 EET} + {1932415200 10800 1 EEST} + {1951160400 7200 0 EET} + {1963864800 10800 1 EEST} + {1982610000 7200 0 EET} + {1995314400 10800 1 EEST} + {2014059600 7200 0 EET} + {2027368800 10800 1 EEST} + {2045509200 7200 0 EET} + {2058818400 10800 1 EEST} + {2076958800 7200 0 EET} + {2090268000 10800 1 EEST} + {2109013200 7200 0 EET} + {2121717600 10800 1 EEST} + {2140462800 7200 0 EET} + {2153167200 10800 1 EEST} + {2171912400 7200 0 EET} + {2184616800 10800 1 EEST} + {2203362000 7200 0 EET} + {2216671200 10800 1 EEST} + {2234811600 7200 0 EET} + {2248120800 10800 1 EEST} + {2266261200 7200 0 EET} + {2279570400 10800 1 EEST} + {2298315600 7200 0 EET} + {2311020000 10800 1 EEST} + {2329765200 7200 0 EET} + {2342469600 10800 1 EEST} + {2361214800 7200 0 EET} + {2374524000 10800 1 EEST} + {2392664400 7200 0 EET} + {2405973600 10800 1 EEST} + {2424114000 7200 0 EET} + {2437423200 10800 1 EEST} + {2455563600 7200 0 EET} + {2468872800 10800 1 EEST} + {2487618000 7200 0 EET} + {2500322400 10800 1 EEST} + {2519067600 7200 0 EET} + {2531772000 10800 1 EEST} + {2550517200 7200 0 EET} + {2563826400 10800 1 EEST} + {2581966800 7200 0 EET} + {2595276000 10800 1 EEST} + {2613416400 7200 0 EET} + {2626725600 10800 1 EEST} + {2645470800 7200 0 EET} + {2658175200 10800 1 EEST} + {2676920400 7200 0 EET} + {2689624800 10800 1 EEST} + {2708370000 7200 0 EET} + {2721679200 10800 1 EEST} + {2739819600 7200 0 EET} + {2753128800 10800 1 EEST} + {2771269200 7200 0 EET} + {2784578400 10800 1 EEST} + {2802718800 7200 0 EET} + {2816028000 10800 1 EEST} + {2834773200 7200 0 EET} + {2847477600 10800 1 EEST} + {2866222800 7200 0 EET} + {2878927200 10800 1 EEST} + {2897672400 7200 0 EET} + {2910981600 10800 1 EEST} + {2929122000 7200 0 EET} + {2942431200 10800 1 EEST} + {2960571600 7200 0 EET} + {2973880800 10800 1 EEST} + {2992626000 7200 0 EET} + {3005330400 10800 1 EEST} + {3024075600 7200 0 EET} + {3036780000 10800 1 EEST} + {3055525200 7200 0 EET} + {3068229600 10800 1 EEST} + {3086974800 7200 0 EET} + {3100284000 10800 1 EEST} + {3118424400 7200 0 EET} + {3131733600 10800 1 EEST} + {3149874000 7200 0 EET} + {3163183200 10800 1 EEST} + {3181928400 7200 0 EET} + {3194632800 10800 1 EEST} + {3213378000 7200 0 EET} + {3226082400 10800 1 EEST} + {3244827600 7200 0 EET} + {3258136800 10800 1 EEST} + {3276277200 7200 0 EET} + {3289586400 10800 1 EEST} + {3307726800 7200 0 EET} + {3321036000 10800 1 EEST} + {3339176400 7200 0 EET} + {3352485600 10800 1 EEST} + {3371230800 7200 0 EET} + {3383935200 10800 1 EEST} + {3402680400 7200 0 EET} + {3415384800 10800 1 EEST} + {3434130000 7200 0 EET} + {3447439200 10800 1 EEST} + {3465579600 7200 0 EET} + {3478888800 10800 1 EEST} + {3497029200 7200 0 EET} + {3510338400 10800 1 EEST} + {3529083600 7200 0 EET} + {3541788000 10800 1 EEST} + {3560533200 7200 0 EET} + {3573237600 10800 1 EEST} + {3591982800 7200 0 EET} + {3605292000 10800 1 EEST} + {3623432400 7200 0 EET} + {3636741600 10800 1 EEST} + {3654882000 7200 0 EET} + {3668191200 10800 1 EEST} + {3686331600 7200 0 EET} + {3699640800 10800 1 EEST} + {3718386000 7200 0 EET} + {3731090400 10800 1 EEST} + {3749835600 7200 0 EET} + {3762540000 10800 1 EEST} + {3781285200 7200 0 EET} + {3794594400 10800 1 EEST} + {3812734800 7200 0 EET} + {3826044000 10800 1 EEST} + {3844184400 7200 0 EET} + {3857493600 10800 1 EEST} + {3876238800 7200 0 EET} + {3888943200 10800 1 EEST} + {3907688400 7200 0 EET} + {3920392800 10800 1 EEST} + {3939138000 7200 0 EET} + {3951842400 10800 1 EEST} + {3970587600 7200 0 EET} + {3983896800 10800 1 EEST} + {4002037200 7200 0 EET} + {4015346400 10800 1 EEST} + {4033486800 7200 0 EET} + {4046796000 10800 1 EEST} + {4065541200 7200 0 EET} + {4078245600 10800 1 EEST} + {4096990800 7200 0 EET} +} diff --git a/env/tcl/tcl8.6/tzdata/Asia/Dhaka b/env/tcl/tcl8.6/tzdata/Asia/Dhaka new file mode 100644 index 0000000..c044095 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Asia/Dhaka @@ -0,0 +1,13 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Asia/Dhaka) { + {-9223372036854775808 21700 0 LMT} + {-2524543300 21200 0 HMT} + {-891582800 23400 0 +0630} + {-872058600 19800 0 +0530} + {-862637400 23400 0 +0630} + {-576138600 21600 0 +06} + {1230746400 21600 0 +06} + {1245430800 25200 1 +06} + {1262278800 21600 0 +06} +} diff --git a/env/tcl/tcl8.6/tzdata/Asia/Dili b/env/tcl/tcl8.6/tzdata/Asia/Dili new file mode 100644 index 0000000..89cf22f --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Asia/Dili @@ -0,0 +1,9 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Asia/Dili) { + {-9223372036854775808 30140 0 LMT} + {-1830414140 28800 0 +08} + {-879152400 32400 0 +09} + {199897200 28800 0 +08} + {969120000 32400 0 +09} +} diff --git a/env/tcl/tcl8.6/tzdata/Asia/Dubai b/env/tcl/tcl8.6/tzdata/Asia/Dubai new file mode 100644 index 0000000..6c18e79 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Asia/Dubai @@ -0,0 +1,6 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Asia/Dubai) { + {-9223372036854775808 13272 0 LMT} + {-1577936472 14400 0 +04} +} diff --git a/env/tcl/tcl8.6/tzdata/Asia/Dushanbe b/env/tcl/tcl8.6/tzdata/Asia/Dushanbe new file mode 100644 index 0000000..fe82ce7 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Asia/Dushanbe @@ -0,0 +1,29 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Asia/Dushanbe) { + {-9223372036854775808 16512 0 LMT} + {-1441168512 18000 0 +05} + {-1247547600 21600 0 +06} + {354909600 25200 1 +06} + {370717200 21600 0 +06} + {386445600 25200 1 +06} + {402253200 21600 0 +06} + {417981600 25200 1 +06} + {433789200 21600 0 +06} + {449604000 25200 1 +06} + {465336000 21600 0 +06} + {481060800 25200 1 +06} + {496785600 21600 0 +06} + {512510400 25200 1 +06} + {528235200 21600 0 +06} + {543960000 25200 1 +06} + {559684800 21600 0 +06} + {575409600 25200 1 +06} + {591134400 21600 0 +06} + {606859200 25200 1 +06} + {622584000 21600 0 +06} + {638308800 25200 1 +06} + {654638400 21600 0 +06} + {670363200 21600 1 +06} + {684363600 18000 0 +05} +} diff --git a/env/tcl/tcl8.6/tzdata/Asia/Famagusta b/env/tcl/tcl8.6/tzdata/Asia/Famagusta new file mode 100644 index 0000000..55eade6 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Asia/Famagusta @@ -0,0 +1,256 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Asia/Famagusta) { + {-9223372036854775808 8148 0 LMT} + {-1518920148 7200 0 EET} + {166572000 10800 1 EEST} + {182293200 7200 0 EET} + {200959200 10800 1 EEST} + {213829200 7200 0 EET} + {228866400 10800 1 EEST} + {243982800 7200 0 EET} + {260316000 10800 1 EEST} + {276123600 7200 0 EET} + {291765600 10800 1 EEST} + {307486800 7200 0 EET} + {323820000 10800 1 EEST} + {338936400 7200 0 EET} + {354664800 10800 1 EEST} + {370386000 7200 0 EET} + {386114400 10800 1 EEST} + {401835600 7200 0 EET} + {417564000 10800 1 EEST} + {433285200 7200 0 EET} + {449013600 10800 1 EEST} + {465339600 7200 0 EET} + {481068000 10800 1 EEST} + {496789200 7200 0 EET} + {512517600 10800 1 EEST} + {528238800 7200 0 EET} + {543967200 10800 1 EEST} + {559688400 7200 0 EET} + {575416800 10800 1 EEST} + {591138000 7200 0 EET} + {606866400 10800 1 EEST} + {622587600 7200 0 EET} + {638316000 10800 1 EEST} + {654642000 7200 0 EET} + {670370400 10800 1 EEST} + {686091600 7200 0 EET} + {701820000 10800 1 EEST} + {717541200 7200 0 EET} + {733269600 10800 1 EEST} + {748990800 7200 0 EET} + {764719200 10800 1 EEST} + {780440400 7200 0 EET} + {796168800 10800 1 EEST} + {811890000 7200 0 EET} + {828223200 10800 1 EEST} + {843944400 7200 0 EET} + {859672800 10800 1 EEST} + {875394000 7200 0 EET} + {891122400 10800 1 EEST} + {904597200 10800 0 EEST} + {909277200 7200 0 EET} + {922582800 10800 1 EEST} + {941331600 7200 0 EET} + {954032400 10800 1 EEST} + {972781200 7200 0 EET} + {985482000 10800 1 EEST} + {1004230800 7200 0 EET} + {1017536400 10800 1 EEST} + {1035680400 7200 0 EET} + {1048986000 10800 1 EEST} + {1067130000 7200 0 EET} + {1080435600 10800 1 EEST} + {1099184400 7200 0 EET} + {1111885200 10800 1 EEST} + {1130634000 7200 0 EET} + {1143334800 10800 1 EEST} + {1162083600 7200 0 EET} + {1174784400 10800 1 EEST} + {1193533200 7200 0 EET} + {1206838800 10800 1 EEST} + {1224982800 7200 0 EET} + {1238288400 10800 1 EEST} + {1256432400 7200 0 EET} + {1269738000 10800 1 EEST} + {1288486800 7200 0 EET} + {1301187600 10800 1 EEST} + {1319936400 7200 0 EET} + {1332637200 10800 1 EEST} + {1351386000 7200 0 EET} + {1364691600 10800 1 EEST} + {1382835600 7200 0 EET} + {1396141200 10800 1 EEST} + {1414285200 7200 0 EET} + {1427590800 10800 1 EEST} + {1445734800 7200 0 EET} + {1459040400 10800 1 EEST} + {1473285600 10800 0 +03} + {1509238800 7200 0 EET} + {1521939600 10800 1 EEST} + {1540688400 7200 0 EET} + {1553994000 10800 1 EEST} + {1572138000 7200 0 EET} + {1585443600 10800 1 EEST} + {1603587600 7200 0 EET} + {1616893200 10800 1 EEST} + {1635642000 7200 0 EET} + {1648342800 10800 1 EEST} + {1667091600 7200 0 EET} + {1679792400 10800 1 EEST} + {1698541200 7200 0 EET} + {1711846800 10800 1 EEST} + {1729990800 7200 0 EET} + {1743296400 10800 1 EEST} + {1761440400 7200 0 EET} + {1774746000 10800 1 EEST} + {1792890000 7200 0 EET} + {1806195600 10800 1 EEST} + {1824944400 7200 0 EET} + {1837645200 10800 1 EEST} + {1856394000 7200 0 EET} + {1869094800 10800 1 EEST} + {1887843600 7200 0 EET} + {1901149200 10800 1 EEST} + {1919293200 7200 0 EET} + {1932598800 10800 1 EEST} + {1950742800 7200 0 EET} + {1964048400 10800 1 EEST} + {1982797200 7200 0 EET} + {1995498000 10800 1 EEST} + {2014246800 7200 0 EET} + {2026947600 10800 1 EEST} + {2045696400 7200 0 EET} + {2058397200 10800 1 EEST} + {2077146000 7200 0 EET} + {2090451600 10800 1 EEST} + {2108595600 7200 0 EET} + {2121901200 10800 1 EEST} + {2140045200 7200 0 EET} + {2153350800 10800 1 EEST} + {2172099600 7200 0 EET} + {2184800400 10800 1 EEST} + {2203549200 7200 0 EET} + {2216250000 10800 1 EEST} + {2234998800 7200 0 EET} + {2248304400 10800 1 EEST} + {2266448400 7200 0 EET} + {2279754000 10800 1 EEST} + {2297898000 7200 0 EET} + {2311203600 10800 1 EEST} + {2329347600 7200 0 EET} + {2342653200 10800 1 EEST} + {2361402000 7200 0 EET} + {2374102800 10800 1 EEST} + {2392851600 7200 0 EET} + {2405552400 10800 1 EEST} + {2424301200 7200 0 EET} + {2437606800 10800 1 EEST} + {2455750800 7200 0 EET} + {2469056400 10800 1 EEST} + {2487200400 7200 0 EET} + {2500506000 10800 1 EEST} + {2519254800 7200 0 EET} + {2531955600 10800 1 EEST} + {2550704400 7200 0 EET} + {2563405200 10800 1 EEST} + {2582154000 7200 0 EET} + {2595459600 10800 1 EEST} + {2613603600 7200 0 EET} + {2626909200 10800 1 EEST} + {2645053200 7200 0 EET} + {2658358800 10800 1 EEST} + {2676502800 7200 0 EET} + {2689808400 10800 1 EEST} + {2708557200 7200 0 EET} + {2721258000 10800 1 EEST} + {2740006800 7200 0 EET} + {2752707600 10800 1 EEST} + {2771456400 7200 0 EET} + {2784762000 10800 1 EEST} + {2802906000 7200 0 EET} + {2816211600 10800 1 EEST} + {2834355600 7200 0 EET} + {2847661200 10800 1 EEST} + {2866410000 7200 0 EET} + {2879110800 10800 1 EEST} + {2897859600 7200 0 EET} + {2910560400 10800 1 EEST} + {2929309200 7200 0 EET} + {2942010000 10800 1 EEST} + {2960758800 7200 0 EET} + {2974064400 10800 1 EEST} + {2992208400 7200 0 EET} + {3005514000 10800 1 EEST} + {3023658000 7200 0 EET} + {3036963600 10800 1 EEST} + {3055712400 7200 0 EET} + {3068413200 10800 1 EEST} + {3087162000 7200 0 EET} + {3099862800 10800 1 EEST} + {3118611600 7200 0 EET} + {3131917200 10800 1 EEST} + {3150061200 7200 0 EET} + {3163366800 10800 1 EEST} + {3181510800 7200 0 EET} + {3194816400 10800 1 EEST} + {3212960400 7200 0 EET} + {3226266000 10800 1 EEST} + {3245014800 7200 0 EET} + {3257715600 10800 1 EEST} + {3276464400 7200 0 EET} + {3289165200 10800 1 EEST} + {3307914000 7200 0 EET} + {3321219600 10800 1 EEST} + {3339363600 7200 0 EET} + {3352669200 10800 1 EEST} + {3370813200 7200 0 EET} + {3384118800 10800 1 EEST} + {3402867600 7200 0 EET} + {3415568400 10800 1 EEST} + {3434317200 7200 0 EET} + {3447018000 10800 1 EEST} + {3465766800 7200 0 EET} + {3479072400 10800 1 EEST} + {3497216400 7200 0 EET} + {3510522000 10800 1 EEST} + {3528666000 7200 0 EET} + {3541971600 10800 1 EEST} + {3560115600 7200 0 EET} + {3573421200 10800 1 EEST} + {3592170000 7200 0 EET} + {3604870800 10800 1 EEST} + {3623619600 7200 0 EET} + {3636320400 10800 1 EEST} + {3655069200 7200 0 EET} + {3668374800 10800 1 EEST} + {3686518800 7200 0 EET} + {3699824400 10800 1 EEST} + {3717968400 7200 0 EET} + {3731274000 10800 1 EEST} + {3750022800 7200 0 EET} + {3762723600 10800 1 EEST} + {3781472400 7200 0 EET} + {3794173200 10800 1 EEST} + {3812922000 7200 0 EET} + {3825622800 10800 1 EEST} + {3844371600 7200 0 EET} + {3857677200 10800 1 EEST} + {3875821200 7200 0 EET} + {3889126800 10800 1 EEST} + {3907270800 7200 0 EET} + {3920576400 10800 1 EEST} + {3939325200 7200 0 EET} + {3952026000 10800 1 EEST} + {3970774800 7200 0 EET} + {3983475600 10800 1 EEST} + {4002224400 7200 0 EET} + {4015530000 10800 1 EEST} + {4033674000 7200 0 EET} + {4046979600 10800 1 EEST} + {4065123600 7200 0 EET} + {4078429200 10800 1 EEST} + {4096573200 7200 0 EET} +} diff --git a/env/tcl/tcl8.6/tzdata/Asia/Gaza b/env/tcl/tcl8.6/tzdata/Asia/Gaza new file mode 100644 index 0000000..85b9f67 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Asia/Gaza @@ -0,0 +1,278 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Asia/Gaza) { + {-9223372036854775808 8272 0 LMT} + {-2185409872 7200 0 EEST} + {-933645600 10800 1 EEST} + {-857358000 7200 0 EEST} + {-844300800 10800 1 EEST} + {-825822000 7200 0 EEST} + {-812685600 10800 1 EEST} + {-794199600 7200 0 EEST} + {-779853600 10800 1 EEST} + {-762656400 7200 0 EEST} + {-748310400 10800 1 EEST} + {-731127600 7200 0 EEST} + {-682653600 7200 0 EET} + {-399088800 10800 1 EEST} + {-386650800 7200 0 EET} + {-368330400 10800 1 EEST} + {-355114800 7200 0 EET} + {-336790800 10800 1 EEST} + {-323654400 7200 0 EET} + {-305168400 10800 1 EEST} + {-292032000 7200 0 EET} + {-273632400 10800 1 EEST} + {-260496000 7200 0 EET} + {-242096400 10800 1 EEST} + {-228960000 7200 0 EET} + {-210560400 10800 1 EEST} + {-197424000 7200 0 EET} + {-178938000 10800 1 EEST} + {-165801600 7200 0 EET} + {-147402000 10800 1 EEST} + {-134265600 7200 0 EET} + {-115866000 10800 1 EEST} + {-102643200 7200 0 EET} + {-84330000 10800 1 EEST} + {-81313200 10800 0 IST} + {142376400 10800 1 IDT} + {150843600 7200 0 IST} + {167176800 10800 1 IDT} + {178664400 7200 0 IST} + {482277600 10800 1 IDT} + {495579600 7200 0 IST} + {516751200 10800 1 IDT} + {526424400 7200 0 IST} + {545436000 10800 1 IDT} + {558478800 7200 0 IST} + {576626400 10800 1 IDT} + {589323600 7200 0 IST} + {609890400 10800 1 IDT} + {620773200 7200 0 IST} + {638316000 10800 1 IDT} + {651618000 7200 0 IST} + {669765600 10800 1 IDT} + {683672400 7200 0 IST} + {701820000 10800 1 IDT} + {715726800 7200 0 IST} + {733701600 10800 1 IDT} + {747176400 7200 0 IST} + {765151200 10800 1 IDT} + {778021200 7200 0 IST} + {796600800 10800 1 IDT} + {810075600 7200 0 IST} + {820447200 7200 0 EET} + {828655200 10800 1 EEST} + {843170400 7200 0 EET} + {860104800 10800 1 EEST} + {874620000 7200 0 EET} + {891554400 10800 1 EEST} + {906069600 7200 0 EET} + {915141600 7200 0 EET} + {924213600 10800 1 EEST} + {939934800 7200 0 EET} + {956268000 10800 1 EEST} + {971989200 7200 0 EET} + {987717600 10800 1 EEST} + {1003438800 7200 0 EET} + {1019167200 10800 1 EEST} + {1034888400 7200 0 EET} + {1050616800 10800 1 EEST} + {1066338000 7200 0 EET} + {1082066400 10800 1 EEST} + {1096581600 7200 0 EET} + {1113516000 10800 1 EEST} + {1128380400 7200 0 EET} + {1143842400 10800 1 EEST} + {1158872400 7200 0 EET} + {1175378400 10800 1 EEST} + {1189638000 7200 0 EET} + {1206655200 10800 1 EEST} + {1219960800 7200 0 EET} + {1220220000 7200 0 EET} + {1238104800 10800 1 EEST} + {1252015200 7200 0 EET} + {1262296800 7200 0 EET} + {1269640860 10800 0 EEST} + {1281474000 7200 0 EET} + {1301608860 10800 1 EEST} + {1312149600 7200 0 EET} + {1325368800 7200 0 EET} + {1333058400 10800 1 EEST} + {1348178400 7200 0 EET} + {1364508000 10800 1 EEST} + {1380229200 7200 0 EET} + {1395957600 10800 1 EEST} + {1414098000 7200 0 EET} + {1427493600 10800 1 EEST} + {1445547600 7200 0 EET} + {1458946800 10800 1 EEST} + {1477692000 7200 0 EET} + {1490396400 10800 1 EEST} + {1509141600 7200 0 EET} + {1521846000 10800 1 EEST} + {1540591200 7200 0 EET} + {1553295600 10800 1 EEST} + {1572040800 7200 0 EET} + {1585350000 10800 1 EEST} + {1604095200 7200 0 EET} + {1616799600 10800 1 EEST} + {1635544800 7200 0 EET} + {1648249200 10800 1 EEST} + {1666994400 7200 0 EET} + {1679698800 10800 1 EEST} + {1698444000 7200 0 EET} + {1711148400 10800 1 EEST} + {1729893600 7200 0 EET} + {1742598000 10800 1 EEST} + {1761343200 7200 0 EET} + {1774652400 10800 1 EEST} + {1793397600 7200 0 EET} + {1806102000 10800 1 EEST} + {1824847200 7200 0 EET} + {1837551600 10800 1 EEST} + {1856296800 7200 0 EET} + {1869001200 10800 1 EEST} + {1887746400 7200 0 EET} + {1900450800 10800 1 EEST} + {1919196000 7200 0 EET} + {1931900400 10800 1 EEST} + {1950645600 7200 0 EET} + {1963954800 10800 1 EEST} + {1982700000 7200 0 EET} + {1995404400 10800 1 EEST} + {2014149600 7200 0 EET} + {2026854000 10800 1 EEST} + {2045599200 7200 0 EET} + {2058303600 10800 1 EEST} + {2077048800 7200 0 EET} + {2089753200 10800 1 EEST} + {2108498400 7200 0 EET} + {2121807600 10800 1 EEST} + {2140552800 7200 0 EET} + {2153257200 10800 1 EEST} + {2172002400 7200 0 EET} + {2184706800 10800 1 EEST} + {2203452000 7200 0 EET} + {2216156400 10800 1 EEST} + {2234901600 7200 0 EET} + {2247606000 10800 1 EEST} + {2266351200 7200 0 EET} + {2279055600 10800 1 EEST} + {2297800800 7200 0 EET} + {2311110000 10800 1 EEST} + {2329855200 7200 0 EET} + {2342559600 10800 1 EEST} + {2361304800 7200 0 EET} + {2374009200 10800 1 EEST} + {2392754400 7200 0 EET} + {2405458800 10800 1 EEST} + {2424204000 7200 0 EET} + {2436908400 10800 1 EEST} + {2455653600 7200 0 EET} + {2468962800 10800 1 EEST} + {2487708000 7200 0 EET} + {2500412400 10800 1 EEST} + {2519157600 7200 0 EET} + {2531862000 10800 1 EEST} + {2550607200 7200 0 EET} + {2563311600 10800 1 EEST} + {2582056800 7200 0 EET} + {2594761200 10800 1 EEST} + {2613506400 7200 0 EET} + {2626210800 10800 1 EEST} + {2644956000 7200 0 EET} + {2658265200 10800 1 EEST} + {2677010400 7200 0 EET} + {2689714800 10800 1 EEST} + {2708460000 7200 0 EET} + {2721164400 10800 1 EEST} + {2739909600 7200 0 EET} + {2752614000 10800 1 EEST} + {2771359200 7200 0 EET} + {2784063600 10800 1 EEST} + {2802808800 7200 0 EET} + {2815513200 10800 1 EEST} + {2834258400 7200 0 EET} + {2847567600 10800 1 EEST} + {2866312800 7200 0 EET} + {2879017200 10800 1 EEST} + {2897762400 7200 0 EET} + {2910466800 10800 1 EEST} + {2929212000 7200 0 EET} + {2941916400 10800 1 EEST} + {2960661600 7200 0 EET} + {2973366000 10800 1 EEST} + {2992111200 7200 0 EET} + {3005420400 10800 1 EEST} + {3024165600 7200 0 EET} + {3036870000 10800 1 EEST} + {3055615200 7200 0 EET} + {3068319600 10800 1 EEST} + {3087064800 7200 0 EET} + {3099769200 10800 1 EEST} + {3118514400 7200 0 EET} + {3131218800 10800 1 EEST} + {3149964000 7200 0 EET} + {3162668400 10800 1 EEST} + {3181413600 7200 0 EET} + {3194722800 10800 1 EEST} + {3213468000 7200 0 EET} + {3226172400 10800 1 EEST} + {3244917600 7200 0 EET} + {3257622000 10800 1 EEST} + {3276367200 7200 0 EET} + {3289071600 10800 1 EEST} + {3307816800 7200 0 EET} + {3320521200 10800 1 EEST} + {3339266400 7200 0 EET} + {3352575600 10800 1 EEST} + {3371320800 7200 0 EET} + {3384025200 10800 1 EEST} + {3402770400 7200 0 EET} + {3415474800 10800 1 EEST} + {3434220000 7200 0 EET} + {3446924400 10800 1 EEST} + {3465669600 7200 0 EET} + {3478374000 10800 1 EEST} + {3497119200 7200 0 EET} + {3509823600 10800 1 EEST} + {3528568800 7200 0 EET} + {3541878000 10800 1 EEST} + {3560623200 7200 0 EET} + {3573327600 10800 1 EEST} + {3592072800 7200 0 EET} + {3604777200 10800 1 EEST} + {3623522400 7200 0 EET} + {3636226800 10800 1 EEST} + {3654972000 7200 0 EET} + {3667676400 10800 1 EEST} + {3686421600 7200 0 EET} + {3699126000 10800 1 EEST} + {3717871200 7200 0 EET} + {3731180400 10800 1 EEST} + {3749925600 7200 0 EET} + {3762630000 10800 1 EEST} + {3781375200 7200 0 EET} + {3794079600 10800 1 EEST} + {3812824800 7200 0 EET} + {3825529200 10800 1 EEST} + {3844274400 7200 0 EET} + {3856978800 10800 1 EEST} + {3875724000 7200 0 EET} + {3889033200 10800 1 EEST} + {3907778400 7200 0 EET} + {3920482800 10800 1 EEST} + {3939228000 7200 0 EET} + {3951932400 10800 1 EEST} + {3970677600 7200 0 EET} + {3983382000 10800 1 EEST} + {4002127200 7200 0 EET} + {4014831600 10800 1 EEST} + {4033576800 7200 0 EET} + {4046281200 10800 1 EEST} + {4065026400 7200 0 EET} + {4078335600 10800 1 EEST} + {4097080800 7200 0 EET} +} diff --git a/env/tcl/tcl8.6/tzdata/Asia/Harbin b/env/tcl/tcl8.6/tzdata/Asia/Harbin new file mode 100644 index 0000000..dfcb549 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Asia/Harbin @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(Asia/Shanghai)]} { + LoadTimeZoneFile Asia/Shanghai +} +set TZData(:Asia/Harbin) $TZData(:Asia/Shanghai) diff --git a/env/tcl/tcl8.6/tzdata/Asia/Hebron b/env/tcl/tcl8.6/tzdata/Asia/Hebron new file mode 100644 index 0000000..c0f5447 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Asia/Hebron @@ -0,0 +1,277 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Asia/Hebron) { + {-9223372036854775808 8423 0 LMT} + {-2185410023 7200 0 EEST} + {-933645600 10800 1 EEST} + {-857358000 7200 0 EEST} + {-844300800 10800 1 EEST} + {-825822000 7200 0 EEST} + {-812685600 10800 1 EEST} + {-794199600 7200 0 EEST} + {-779853600 10800 1 EEST} + {-762656400 7200 0 EEST} + {-748310400 10800 1 EEST} + {-731127600 7200 0 EEST} + {-682653600 7200 0 EET} + {-399088800 10800 1 EEST} + {-386650800 7200 0 EET} + {-368330400 10800 1 EEST} + {-355114800 7200 0 EET} + {-336790800 10800 1 EEST} + {-323654400 7200 0 EET} + {-305168400 10800 1 EEST} + {-292032000 7200 0 EET} + {-273632400 10800 1 EEST} + {-260496000 7200 0 EET} + {-242096400 10800 1 EEST} + {-228960000 7200 0 EET} + {-210560400 10800 1 EEST} + {-197424000 7200 0 EET} + {-178938000 10800 1 EEST} + {-165801600 7200 0 EET} + {-147402000 10800 1 EEST} + {-134265600 7200 0 EET} + {-115866000 10800 1 EEST} + {-102643200 7200 0 EET} + {-84330000 10800 1 EEST} + {-81313200 10800 0 IST} + {142376400 10800 1 IDT} + {150843600 7200 0 IST} + {167176800 10800 1 IDT} + {178664400 7200 0 IST} + {482277600 10800 1 IDT} + {495579600 7200 0 IST} + {516751200 10800 1 IDT} + {526424400 7200 0 IST} + {545436000 10800 1 IDT} + {558478800 7200 0 IST} + {576626400 10800 1 IDT} + {589323600 7200 0 IST} + {609890400 10800 1 IDT} + {620773200 7200 0 IST} + {638316000 10800 1 IDT} + {651618000 7200 0 IST} + {669765600 10800 1 IDT} + {683672400 7200 0 IST} + {701820000 10800 1 IDT} + {715726800 7200 0 IST} + {733701600 10800 1 IDT} + {747176400 7200 0 IST} + {765151200 10800 1 IDT} + {778021200 7200 0 IST} + {796600800 10800 1 IDT} + {810075600 7200 0 IST} + {820447200 7200 0 EET} + {828655200 10800 1 EEST} + {843170400 7200 0 EET} + {860104800 10800 1 EEST} + {874620000 7200 0 EET} + {891554400 10800 1 EEST} + {906069600 7200 0 EET} + {915141600 7200 0 EET} + {924213600 10800 1 EEST} + {939934800 7200 0 EET} + {956268000 10800 1 EEST} + {971989200 7200 0 EET} + {987717600 10800 1 EEST} + {1003438800 7200 0 EET} + {1019167200 10800 1 EEST} + {1034888400 7200 0 EET} + {1050616800 10800 1 EEST} + {1066338000 7200 0 EET} + {1082066400 10800 1 EEST} + {1096581600 7200 0 EET} + {1113516000 10800 1 EEST} + {1128380400 7200 0 EET} + {1143842400 10800 1 EEST} + {1158872400 7200 0 EET} + {1175378400 10800 1 EEST} + {1189638000 7200 0 EET} + {1206655200 10800 1 EEST} + {1220216400 7200 0 EET} + {1238104800 10800 1 EEST} + {1252015200 7200 0 EET} + {1269554400 10800 1 EEST} + {1281474000 7200 0 EET} + {1301608860 10800 1 EEST} + {1312146000 7200 0 EET} + {1314655200 10800 1 EEST} + {1317330000 7200 0 EET} + {1333058400 10800 1 EEST} + {1348178400 7200 0 EET} + {1364508000 10800 1 EEST} + {1380229200 7200 0 EET} + {1395957600 10800 1 EEST} + {1414098000 7200 0 EET} + {1427493600 10800 1 EEST} + {1445547600 7200 0 EET} + {1458946800 10800 1 EEST} + {1477692000 7200 0 EET} + {1490396400 10800 1 EEST} + {1509141600 7200 0 EET} + {1521846000 10800 1 EEST} + {1540591200 7200 0 EET} + {1553295600 10800 1 EEST} + {1572040800 7200 0 EET} + {1585350000 10800 1 EEST} + {1604095200 7200 0 EET} + {1616799600 10800 1 EEST} + {1635544800 7200 0 EET} + {1648249200 10800 1 EEST} + {1666994400 7200 0 EET} + {1679698800 10800 1 EEST} + {1698444000 7200 0 EET} + {1711148400 10800 1 EEST} + {1729893600 7200 0 EET} + {1742598000 10800 1 EEST} + {1761343200 7200 0 EET} + {1774652400 10800 1 EEST} + {1793397600 7200 0 EET} + {1806102000 10800 1 EEST} + {1824847200 7200 0 EET} + {1837551600 10800 1 EEST} + {1856296800 7200 0 EET} + {1869001200 10800 1 EEST} + {1887746400 7200 0 EET} + {1900450800 10800 1 EEST} + {1919196000 7200 0 EET} + {1931900400 10800 1 EEST} + {1950645600 7200 0 EET} + {1963954800 10800 1 EEST} + {1982700000 7200 0 EET} + {1995404400 10800 1 EEST} + {2014149600 7200 0 EET} + {2026854000 10800 1 EEST} + {2045599200 7200 0 EET} + {2058303600 10800 1 EEST} + {2077048800 7200 0 EET} + {2089753200 10800 1 EEST} + {2108498400 7200 0 EET} + {2121807600 10800 1 EEST} + {2140552800 7200 0 EET} + {2153257200 10800 1 EEST} + {2172002400 7200 0 EET} + {2184706800 10800 1 EEST} + {2203452000 7200 0 EET} + {2216156400 10800 1 EEST} + {2234901600 7200 0 EET} + {2247606000 10800 1 EEST} + {2266351200 7200 0 EET} + {2279055600 10800 1 EEST} + {2297800800 7200 0 EET} + {2311110000 10800 1 EEST} + {2329855200 7200 0 EET} + {2342559600 10800 1 EEST} + {2361304800 7200 0 EET} + {2374009200 10800 1 EEST} + {2392754400 7200 0 EET} + {2405458800 10800 1 EEST} + {2424204000 7200 0 EET} + {2436908400 10800 1 EEST} + {2455653600 7200 0 EET} + {2468962800 10800 1 EEST} + {2487708000 7200 0 EET} + {2500412400 10800 1 EEST} + {2519157600 7200 0 EET} + {2531862000 10800 1 EEST} + {2550607200 7200 0 EET} + {2563311600 10800 1 EEST} + {2582056800 7200 0 EET} + {2594761200 10800 1 EEST} + {2613506400 7200 0 EET} + {2626210800 10800 1 EEST} + {2644956000 7200 0 EET} + {2658265200 10800 1 EEST} + {2677010400 7200 0 EET} + {2689714800 10800 1 EEST} + {2708460000 7200 0 EET} + {2721164400 10800 1 EEST} + {2739909600 7200 0 EET} + {2752614000 10800 1 EEST} + {2771359200 7200 0 EET} + {2784063600 10800 1 EEST} + {2802808800 7200 0 EET} + {2815513200 10800 1 EEST} + {2834258400 7200 0 EET} + {2847567600 10800 1 EEST} + {2866312800 7200 0 EET} + {2879017200 10800 1 EEST} + {2897762400 7200 0 EET} + {2910466800 10800 1 EEST} + {2929212000 7200 0 EET} + {2941916400 10800 1 EEST} + {2960661600 7200 0 EET} + {2973366000 10800 1 EEST} + {2992111200 7200 0 EET} + {3005420400 10800 1 EEST} + {3024165600 7200 0 EET} + {3036870000 10800 1 EEST} + {3055615200 7200 0 EET} + {3068319600 10800 1 EEST} + {3087064800 7200 0 EET} + {3099769200 10800 1 EEST} + {3118514400 7200 0 EET} + {3131218800 10800 1 EEST} + {3149964000 7200 0 EET} + {3162668400 10800 1 EEST} + {3181413600 7200 0 EET} + {3194722800 10800 1 EEST} + {3213468000 7200 0 EET} + {3226172400 10800 1 EEST} + {3244917600 7200 0 EET} + {3257622000 10800 1 EEST} + {3276367200 7200 0 EET} + {3289071600 10800 1 EEST} + {3307816800 7200 0 EET} + {3320521200 10800 1 EEST} + {3339266400 7200 0 EET} + {3352575600 10800 1 EEST} + {3371320800 7200 0 EET} + {3384025200 10800 1 EEST} + {3402770400 7200 0 EET} + {3415474800 10800 1 EEST} + {3434220000 7200 0 EET} + {3446924400 10800 1 EEST} + {3465669600 7200 0 EET} + {3478374000 10800 1 EEST} + {3497119200 7200 0 EET} + {3509823600 10800 1 EEST} + {3528568800 7200 0 EET} + {3541878000 10800 1 EEST} + {3560623200 7200 0 EET} + {3573327600 10800 1 EEST} + {3592072800 7200 0 EET} + {3604777200 10800 1 EEST} + {3623522400 7200 0 EET} + {3636226800 10800 1 EEST} + {3654972000 7200 0 EET} + {3667676400 10800 1 EEST} + {3686421600 7200 0 EET} + {3699126000 10800 1 EEST} + {3717871200 7200 0 EET} + {3731180400 10800 1 EEST} + {3749925600 7200 0 EET} + {3762630000 10800 1 EEST} + {3781375200 7200 0 EET} + {3794079600 10800 1 EEST} + {3812824800 7200 0 EET} + {3825529200 10800 1 EEST} + {3844274400 7200 0 EET} + {3856978800 10800 1 EEST} + {3875724000 7200 0 EET} + {3889033200 10800 1 EEST} + {3907778400 7200 0 EET} + {3920482800 10800 1 EEST} + {3939228000 7200 0 EET} + {3951932400 10800 1 EEST} + {3970677600 7200 0 EET} + {3983382000 10800 1 EEST} + {4002127200 7200 0 EET} + {4014831600 10800 1 EEST} + {4033576800 7200 0 EET} + {4046281200 10800 1 EEST} + {4065026400 7200 0 EET} + {4078335600 10800 1 EEST} + {4097080800 7200 0 EET} +} diff --git a/env/tcl/tcl8.6/tzdata/Asia/Ho_Chi_Minh b/env/tcl/tcl8.6/tzdata/Asia/Ho_Chi_Minh new file mode 100644 index 0000000..b4e749b --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Asia/Ho_Chi_Minh @@ -0,0 +1,14 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Asia/Ho_Chi_Minh) { + {-9223372036854775808 25600 0 LMT} + {-2004073600 25590 0 PLMT} + {-1851577590 25200 0 +07} + {-852105600 28800 0 +08} + {-782643600 32400 0 +09} + {-767869200 25200 0 +07} + {-718095600 28800 0 +08} + {-457776000 25200 0 +07} + {-315648000 28800 0 +08} + {171820800 25200 0 +07} +} diff --git a/env/tcl/tcl8.6/tzdata/Asia/Hong_Kong b/env/tcl/tcl8.6/tzdata/Asia/Hong_Kong new file mode 100644 index 0000000..fcf98a6 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Asia/Hong_Kong @@ -0,0 +1,75 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Asia/Hong_Kong) { + {-9223372036854775808 27402 0 LMT} + {-2056693002 28800 0 HKT} + {-907389000 32400 1 HKST} + {-891667800 28800 0 HKT} + {-884246400 32400 0 JST} + {-766746000 28800 0 HKT} + {-747981000 32400 1 HKST} + {-728544600 28800 0 HKT} + {-717049800 32400 1 HKST} + {-694503000 28800 0 HKT} + {-683785800 32400 1 HKST} + {-668064600 28800 0 HKT} + {-654755400 32400 1 HKST} + {-636615000 28800 0 HKT} + {-623305800 32400 1 HKST} + {-605165400 28800 0 HKT} + {-591856200 32400 1 HKST} + {-573715800 28800 0 HKT} + {-559801800 32400 1 HKST} + {-542352600 28800 0 HKT} + {-528352200 32400 1 HKST} + {-510211800 28800 0 HKT} + {-498112200 32400 1 HKST} + {-478762200 28800 0 HKT} + {-466662600 32400 1 HKST} + {-446707800 28800 0 HKT} + {-435213000 32400 1 HKST} + {-415258200 28800 0 HKT} + {-403158600 32400 1 HKST} + {-383808600 28800 0 HKT} + {-371709000 32400 1 HKST} + {-352359000 28800 0 HKT} + {-340259400 32400 1 HKST} + {-320909400 28800 0 HKT} + {-308809800 32400 1 HKST} + {-288855000 28800 0 HKT} + {-277360200 32400 1 HKST} + {-257405400 28800 0 HKT} + {-245910600 32400 1 HKST} + {-225955800 28800 0 HKT} + {-213856200 32400 1 HKST} + {-194506200 28800 0 HKT} + {-182406600 32400 1 HKST} + {-163056600 28800 0 HKT} + {-148537800 32400 1 HKST} + {-132816600 28800 0 HKT} + {-117088200 32400 1 HKST} + {-101367000 28800 0 HKT} + {-85638600 32400 1 HKST} + {-69312600 28800 0 HKT} + {-53584200 32400 1 HKST} + {-37863000 28800 0 HKT} + {-22134600 32400 1 HKST} + {-6413400 28800 0 HKT} + {9315000 32400 1 HKST} + {25036200 28800 0 HKT} + {40764600 32400 1 HKST} + {56485800 28800 0 HKT} + {72214200 32400 1 HKST} + {88540200 28800 0 HKT} + {104268600 32400 1 HKST} + {119989800 28800 0 HKT} + {126041400 32400 1 HKST} + {135714600 32400 1 HKST} + {151439400 28800 0 HKT} + {167167800 32400 1 HKST} + {182889000 28800 0 HKT} + {198617400 32400 1 HKST} + {214338600 28800 0 HKT} + {295385400 32400 1 HKST} + {309292200 28800 0 HKT} +} diff --git a/env/tcl/tcl8.6/tzdata/Asia/Hovd b/env/tcl/tcl8.6/tzdata/Asia/Hovd new file mode 100644 index 0000000..9b14d5b --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Asia/Hovd @@ -0,0 +1,55 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Asia/Hovd) { + {-9223372036854775808 21996 0 LMT} + {-2032927596 21600 0 +06} + {252439200 25200 0 +07} + {417978000 28800 1 +07} + {433785600 25200 0 +07} + {449600400 28800 1 +07} + {465321600 25200 0 +07} + {481050000 28800 1 +07} + {496771200 25200 0 +07} + {512499600 28800 1 +07} + {528220800 25200 0 +07} + {543949200 28800 1 +07} + {559670400 25200 0 +07} + {575398800 28800 1 +07} + {591120000 25200 0 +07} + {606848400 28800 1 +07} + {622569600 25200 0 +07} + {638298000 28800 1 +07} + {654624000 25200 0 +07} + {670352400 28800 1 +07} + {686073600 25200 0 +07} + {701802000 28800 1 +07} + {717523200 25200 0 +07} + {733251600 28800 1 +07} + {748972800 25200 0 +07} + {764701200 28800 1 +07} + {780422400 25200 0 +07} + {796150800 28800 1 +07} + {811872000 25200 0 +07} + {828205200 28800 1 +07} + {843926400 25200 0 +07} + {859654800 28800 1 +07} + {875376000 25200 0 +07} + {891104400 28800 1 +07} + {906825600 25200 0 +07} + {988398000 28800 1 +07} + {1001700000 25200 0 +07} + {1017428400 28800 1 +07} + {1033149600 25200 0 +07} + {1048878000 28800 1 +07} + {1064599200 25200 0 +07} + {1080327600 28800 1 +07} + {1096048800 25200 0 +07} + {1111777200 28800 1 +07} + {1127498400 25200 0 +07} + {1143226800 28800 1 +07} + {1159552800 25200 0 +07} + {1427482800 28800 1 +07} + {1443196800 25200 0 +07} + {1458932400 28800 1 +07} + {1474646400 25200 0 +07} +} diff --git a/env/tcl/tcl8.6/tzdata/Asia/Irkutsk b/env/tcl/tcl8.6/tzdata/Asia/Irkutsk new file mode 100644 index 0000000..9666969 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Asia/Irkutsk @@ -0,0 +1,72 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Asia/Irkutsk) { + {-9223372036854775808 25025 0 LMT} + {-2840165825 25025 0 IMT} + {-1575874625 25200 0 +07} + {-1247554800 28800 0 +09} + {354902400 32400 1 +09} + {370710000 28800 0 +08} + {386438400 32400 1 +09} + {402246000 28800 0 +08} + {417974400 32400 1 +09} + {433782000 28800 0 +08} + {449596800 32400 1 +09} + {465328800 28800 0 +08} + {481053600 32400 1 +09} + {496778400 28800 0 +08} + {512503200 32400 1 +09} + {528228000 28800 0 +08} + {543952800 32400 1 +09} + {559677600 28800 0 +08} + {575402400 32400 1 +09} + {591127200 28800 0 +08} + {606852000 32400 1 +09} + {622576800 28800 0 +08} + {638301600 32400 1 +09} + {654631200 28800 0 +08} + {670356000 25200 0 +08} + {670359600 28800 1 +08} + {686084400 25200 0 +07} + {695761200 28800 0 +09} + {701805600 32400 1 +09} + {717530400 28800 0 +08} + {733255200 32400 1 +09} + {748980000 28800 0 +08} + {764704800 32400 1 +09} + {780429600 28800 0 +08} + {796154400 32400 1 +09} + {811879200 28800 0 +08} + {828208800 32400 1 +09} + {846352800 28800 0 +08} + {859658400 32400 1 +09} + {877802400 28800 0 +08} + {891108000 32400 1 +09} + {909252000 28800 0 +08} + {922557600 32400 1 +09} + {941306400 28800 0 +08} + {954007200 32400 1 +09} + {972756000 28800 0 +08} + {985456800 32400 1 +09} + {1004205600 28800 0 +08} + {1017511200 32400 1 +09} + {1035655200 28800 0 +08} + {1048960800 32400 1 +09} + {1067104800 28800 0 +08} + {1080410400 32400 1 +09} + {1099159200 28800 0 +08} + {1111860000 32400 1 +09} + {1130608800 28800 0 +08} + {1143309600 32400 1 +09} + {1162058400 28800 0 +08} + {1174759200 32400 1 +09} + {1193508000 28800 0 +08} + {1206813600 32400 1 +09} + {1224957600 28800 0 +08} + {1238263200 32400 1 +09} + {1256407200 28800 0 +08} + {1269712800 32400 1 +09} + {1288461600 28800 0 +08} + {1301162400 32400 0 +09} + {1414256400 28800 0 +08} +} diff --git a/env/tcl/tcl8.6/tzdata/Asia/Istanbul b/env/tcl/tcl8.6/tzdata/Asia/Istanbul new file mode 100644 index 0000000..85b3fc2 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Asia/Istanbul @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(Europe/Istanbul)]} { + LoadTimeZoneFile Europe/Istanbul +} +set TZData(:Asia/Istanbul) $TZData(:Europe/Istanbul) diff --git a/env/tcl/tcl8.6/tzdata/Asia/Jakarta b/env/tcl/tcl8.6/tzdata/Asia/Jakarta new file mode 100644 index 0000000..21da168 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Asia/Jakarta @@ -0,0 +1,13 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Asia/Jakarta) { + {-9223372036854775808 25632 0 LMT} + {-3231299232 25632 0 BMT} + {-1451719200 26400 0 +0720} + {-1172906400 27000 0 +0730} + {-876641400 32400 0 +09} + {-766054800 27000 0 +0730} + {-683883000 28800 0 +08} + {-620812800 27000 0 +0730} + {-189415800 25200 0 WIB} +} diff --git a/env/tcl/tcl8.6/tzdata/Asia/Jayapura b/env/tcl/tcl8.6/tzdata/Asia/Jayapura new file mode 100644 index 0000000..1432488 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Asia/Jayapura @@ -0,0 +1,8 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Asia/Jayapura) { + {-9223372036854775808 33768 0 LMT} + {-1172913768 32400 0 +09} + {-799491600 34200 0 +0930} + {-189423000 32400 0 WIT} +} diff --git a/env/tcl/tcl8.6/tzdata/Asia/Jerusalem b/env/tcl/tcl8.6/tzdata/Asia/Jerusalem new file mode 100644 index 0000000..2714963 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Asia/Jerusalem @@ -0,0 +1,272 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Asia/Jerusalem) { + {-9223372036854775808 8454 0 LMT} + {-2840149254 8440 0 JMT} + {-1641003640 7200 0 IST} + {-933645600 10800 1 IDT} + {-857358000 7200 0 IST} + {-844300800 10800 1 IDT} + {-825822000 7200 0 IST} + {-812685600 10800 1 IDT} + {-794199600 7200 0 IST} + {-779853600 10800 1 IDT} + {-762656400 7200 0 IST} + {-748310400 10800 1 IDT} + {-731127600 7200 0 IST} + {-681962400 14400 1 IDDT} + {-673243200 10800 1 IDT} + {-667962000 7200 0 IST} + {-652327200 10800 1 IDT} + {-636426000 7200 0 IST} + {-622087200 10800 1 IDT} + {-608947200 7200 0 IST} + {-591847200 10800 1 IDT} + {-572486400 7200 0 IST} + {-558576000 10800 1 IDT} + {-542851200 7200 0 IST} + {-527731200 10800 1 IDT} + {-514425600 7200 0 IST} + {-490845600 10800 1 IDT} + {-482986800 7200 0 IST} + {-459475200 10800 1 IDT} + {-451537200 7200 0 IST} + {-428551200 10800 1 IDT} + {-418262400 7200 0 IST} + {-400032000 10800 1 IDT} + {-387428400 7200 0 IST} + {142380000 10800 1 IDT} + {150843600 7200 0 IST} + {167176800 10800 1 IDT} + {178664400 7200 0 IST} + {482277600 10800 1 IDT} + {495579600 7200 0 IST} + {516751200 10800 1 IDT} + {526424400 7200 0 IST} + {545436000 10800 1 IDT} + {558478800 7200 0 IST} + {576626400 10800 1 IDT} + {589323600 7200 0 IST} + {609890400 10800 1 IDT} + {620773200 7200 0 IST} + {638316000 10800 1 IDT} + {651618000 7200 0 IST} + {669765600 10800 1 IDT} + {683672400 7200 0 IST} + {701820000 10800 1 IDT} + {715726800 7200 0 IST} + {733701600 10800 1 IDT} + {747176400 7200 0 IST} + {765151200 10800 1 IDT} + {778021200 7200 0 IST} + {796600800 10800 1 IDT} + {810075600 7200 0 IST} + {826840800 10800 1 IDT} + {842821200 7200 0 IST} + {858895200 10800 1 IDT} + {874184400 7200 0 IST} + {890344800 10800 1 IDT} + {905029200 7200 0 IST} + {923011200 10800 1 IDT} + {936313200 7200 0 IST} + {955670400 10800 1 IDT} + {970783200 7200 0 IST} + {986770800 10800 1 IDT} + {1001282400 7200 0 IST} + {1017356400 10800 1 IDT} + {1033941600 7200 0 IST} + {1048806000 10800 1 IDT} + {1065132000 7200 0 IST} + {1081292400 10800 1 IDT} + {1095804000 7200 0 IST} + {1112313600 10800 1 IDT} + {1128812400 7200 0 IST} + {1143763200 10800 1 IDT} + {1159657200 7200 0 IST} + {1175212800 10800 1 IDT} + {1189897200 7200 0 IST} + {1206662400 10800 1 IDT} + {1223161200 7200 0 IST} + {1238112000 10800 1 IDT} + {1254006000 7200 0 IST} + {1269561600 10800 1 IDT} + {1284246000 7200 0 IST} + {1301616000 10800 1 IDT} + {1317510000 7200 0 IST} + {1333065600 10800 1 IDT} + {1348354800 7200 0 IST} + {1364515200 10800 1 IDT} + {1382828400 7200 0 IST} + {1395964800 10800 1 IDT} + {1414278000 7200 0 IST} + {1427414400 10800 1 IDT} + {1445727600 7200 0 IST} + {1458864000 10800 1 IDT} + {1477782000 7200 0 IST} + {1490313600 10800 1 IDT} + {1509231600 7200 0 IST} + {1521763200 10800 1 IDT} + {1540681200 7200 0 IST} + {1553817600 10800 1 IDT} + {1572130800 7200 0 IST} + {1585267200 10800 1 IDT} + {1603580400 7200 0 IST} + {1616716800 10800 1 IDT} + {1635634800 7200 0 IST} + {1648166400 10800 1 IDT} + {1667084400 7200 0 IST} + {1679616000 10800 1 IDT} + {1698534000 7200 0 IST} + {1711670400 10800 1 IDT} + {1729983600 7200 0 IST} + {1743120000 10800 1 IDT} + {1761433200 7200 0 IST} + {1774569600 10800 1 IDT} + {1792882800 7200 0 IST} + {1806019200 10800 1 IDT} + {1824937200 7200 0 IST} + {1837468800 10800 1 IDT} + {1856386800 7200 0 IST} + {1868918400 10800 1 IDT} + {1887836400 7200 0 IST} + {1900972800 10800 1 IDT} + {1919286000 7200 0 IST} + {1932422400 10800 1 IDT} + {1950735600 7200 0 IST} + {1963872000 10800 1 IDT} + {1982790000 7200 0 IST} + {1995321600 10800 1 IDT} + {2014239600 7200 0 IST} + {2026771200 10800 1 IDT} + {2045689200 7200 0 IST} + {2058220800 10800 1 IDT} + {2077138800 7200 0 IST} + {2090275200 10800 1 IDT} + {2108588400 7200 0 IST} + {2121724800 10800 1 IDT} + {2140038000 7200 0 IST} + {2153174400 10800 1 IDT} + {2172092400 7200 0 IST} + {2184624000 10800 1 IDT} + {2203542000 7200 0 IST} + {2216073600 10800 1 IDT} + {2234991600 7200 0 IST} + {2248128000 10800 1 IDT} + {2266441200 7200 0 IST} + {2279577600 10800 1 IDT} + {2297890800 7200 0 IST} + {2311027200 10800 1 IDT} + {2329340400 7200 0 IST} + {2342476800 10800 1 IDT} + {2361394800 7200 0 IST} + {2373926400 10800 1 IDT} + {2392844400 7200 0 IST} + {2405376000 10800 1 IDT} + {2424294000 7200 0 IST} + {2437430400 10800 1 IDT} + {2455743600 7200 0 IST} + {2468880000 10800 1 IDT} + {2487193200 7200 0 IST} + {2500329600 10800 1 IDT} + {2519247600 7200 0 IST} + {2531779200 10800 1 IDT} + {2550697200 7200 0 IST} + {2563228800 10800 1 IDT} + {2582146800 7200 0 IST} + {2595283200 10800 1 IDT} + {2613596400 7200 0 IST} + {2626732800 10800 1 IDT} + {2645046000 7200 0 IST} + {2658182400 10800 1 IDT} + {2676495600 7200 0 IST} + {2689632000 10800 1 IDT} + {2708550000 7200 0 IST} + {2721081600 10800 1 IDT} + {2739999600 7200 0 IST} + {2752531200 10800 1 IDT} + {2771449200 7200 0 IST} + {2784585600 10800 1 IDT} + {2802898800 7200 0 IST} + {2816035200 10800 1 IDT} + {2834348400 7200 0 IST} + {2847484800 10800 1 IDT} + {2866402800 7200 0 IST} + {2878934400 10800 1 IDT} + {2897852400 7200 0 IST} + {2910384000 10800 1 IDT} + {2929302000 7200 0 IST} + {2941833600 10800 1 IDT} + {2960751600 7200 0 IST} + {2973888000 10800 1 IDT} + {2992201200 7200 0 IST} + {3005337600 10800 1 IDT} + {3023650800 7200 0 IST} + {3036787200 10800 1 IDT} + {3055705200 7200 0 IST} + {3068236800 10800 1 IDT} + {3087154800 7200 0 IST} + {3099686400 10800 1 IDT} + {3118604400 7200 0 IST} + {3131740800 10800 1 IDT} + {3150054000 7200 0 IST} + {3163190400 10800 1 IDT} + {3181503600 7200 0 IST} + {3194640000 10800 1 IDT} + {3212953200 7200 0 IST} + {3226089600 10800 1 IDT} + {3245007600 7200 0 IST} + {3257539200 10800 1 IDT} + {3276457200 7200 0 IST} + {3288988800 10800 1 IDT} + {3307906800 7200 0 IST} + {3321043200 10800 1 IDT} + {3339356400 7200 0 IST} + {3352492800 10800 1 IDT} + {3370806000 7200 0 IST} + {3383942400 10800 1 IDT} + {3402860400 7200 0 IST} + {3415392000 10800 1 IDT} + {3434310000 7200 0 IST} + {3446841600 10800 1 IDT} + {3465759600 7200 0 IST} + {3478896000 10800 1 IDT} + {3497209200 7200 0 IST} + {3510345600 10800 1 IDT} + {3528658800 7200 0 IST} + {3541795200 10800 1 IDT} + {3560108400 7200 0 IST} + {3573244800 10800 1 IDT} + {3592162800 7200 0 IST} + {3604694400 10800 1 IDT} + {3623612400 7200 0 IST} + {3636144000 10800 1 IDT} + {3655062000 7200 0 IST} + {3668198400 10800 1 IDT} + {3686511600 7200 0 IST} + {3699648000 10800 1 IDT} + {3717961200 7200 0 IST} + {3731097600 10800 1 IDT} + {3750015600 7200 0 IST} + {3762547200 10800 1 IDT} + {3781465200 7200 0 IST} + {3793996800 10800 1 IDT} + {3812914800 7200 0 IST} + {3825446400 10800 1 IDT} + {3844364400 7200 0 IST} + {3857500800 10800 1 IDT} + {3875814000 7200 0 IST} + {3888950400 10800 1 IDT} + {3907263600 7200 0 IST} + {3920400000 10800 1 IDT} + {3939318000 7200 0 IST} + {3951849600 10800 1 IDT} + {3970767600 7200 0 IST} + {3983299200 10800 1 IDT} + {4002217200 7200 0 IST} + {4015353600 10800 1 IDT} + {4033666800 7200 0 IST} + {4046803200 10800 1 IDT} + {4065116400 7200 0 IST} + {4078252800 10800 1 IDT} + {4096566000 7200 0 IST} +} diff --git a/env/tcl/tcl8.6/tzdata/Asia/Kabul b/env/tcl/tcl8.6/tzdata/Asia/Kabul new file mode 100644 index 0000000..3613de4 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Asia/Kabul @@ -0,0 +1,7 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Asia/Kabul) { + {-9223372036854775808 16608 0 LMT} + {-2524538208 14400 0 +04} + {-788932800 16200 0 +0430} +} diff --git a/env/tcl/tcl8.6/tzdata/Asia/Kamchatka b/env/tcl/tcl8.6/tzdata/Asia/Kamchatka new file mode 100644 index 0000000..818fc2d --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Asia/Kamchatka @@ -0,0 +1,71 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Asia/Kamchatka) { + {-9223372036854775808 38076 0 LMT} + {-1487759676 39600 0 +11} + {-1247569200 43200 0 +13} + {354888000 46800 1 +13} + {370695600 43200 0 +12} + {386424000 46800 1 +13} + {402231600 43200 0 +12} + {417960000 46800 1 +13} + {433767600 43200 0 +12} + {449582400 46800 1 +13} + {465314400 43200 0 +12} + {481039200 46800 1 +13} + {496764000 43200 0 +12} + {512488800 46800 1 +13} + {528213600 43200 0 +12} + {543938400 46800 1 +13} + {559663200 43200 0 +12} + {575388000 46800 1 +13} + {591112800 43200 0 +12} + {606837600 46800 1 +13} + {622562400 43200 0 +12} + {638287200 46800 1 +13} + {654616800 43200 0 +12} + {670341600 39600 0 +12} + {670345200 43200 1 +12} + {686070000 39600 0 +11} + {695746800 43200 0 +13} + {701791200 46800 1 +13} + {717516000 43200 0 +12} + {733240800 46800 1 +13} + {748965600 43200 0 +12} + {764690400 46800 1 +13} + {780415200 43200 0 +12} + {796140000 46800 1 +13} + {811864800 43200 0 +12} + {828194400 46800 1 +13} + {846338400 43200 0 +12} + {859644000 46800 1 +13} + {877788000 43200 0 +12} + {891093600 46800 1 +13} + {909237600 43200 0 +12} + {922543200 46800 1 +13} + {941292000 43200 0 +12} + {953992800 46800 1 +13} + {972741600 43200 0 +12} + {985442400 46800 1 +13} + {1004191200 43200 0 +12} + {1017496800 46800 1 +13} + {1035640800 43200 0 +12} + {1048946400 46800 1 +13} + {1067090400 43200 0 +12} + {1080396000 46800 1 +13} + {1099144800 43200 0 +12} + {1111845600 46800 1 +13} + {1130594400 43200 0 +12} + {1143295200 46800 1 +13} + {1162044000 43200 0 +12} + {1174744800 46800 1 +13} + {1193493600 43200 0 +12} + {1206799200 46800 1 +13} + {1224943200 43200 0 +12} + {1238248800 46800 1 +13} + {1256392800 43200 0 +12} + {1269698400 39600 0 +12} + {1269702000 43200 1 +12} + {1288450800 39600 0 +11} + {1301151600 43200 0 +12} +} diff --git a/env/tcl/tcl8.6/tzdata/Asia/Karachi b/env/tcl/tcl8.6/tzdata/Asia/Karachi new file mode 100644 index 0000000..1d81926 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Asia/Karachi @@ -0,0 +1,16 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Asia/Karachi) { + {-9223372036854775808 16092 0 LMT} + {-1988166492 19800 0 +0530} + {-862637400 23400 1 +0630} + {-764145000 19800 0 +0530} + {-576135000 18000 0 +05} + {38775600 18000 0 PKT} + {1018119600 21600 1 PKST} + {1033840800 18000 0 PKT} + {1212260400 21600 1 PKST} + {1225476000 18000 0 PKT} + {1239735600 21600 1 PKST} + {1257012000 18000 0 PKT} +} diff --git a/env/tcl/tcl8.6/tzdata/Asia/Kashgar b/env/tcl/tcl8.6/tzdata/Asia/Kashgar new file mode 100644 index 0000000..f67cbf1 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Asia/Kashgar @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(Asia/Urumqi)]} { + LoadTimeZoneFile Asia/Urumqi +} +set TZData(:Asia/Kashgar) $TZData(:Asia/Urumqi) diff --git a/env/tcl/tcl8.6/tzdata/Asia/Kathmandu b/env/tcl/tcl8.6/tzdata/Asia/Kathmandu new file mode 100644 index 0000000..f88a5a2 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Asia/Kathmandu @@ -0,0 +1,7 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Asia/Kathmandu) { + {-9223372036854775808 20476 0 LMT} + {-1577943676 19800 0 +0530} + {504901800 20700 0 +0545} +} diff --git a/env/tcl/tcl8.6/tzdata/Asia/Katmandu b/env/tcl/tcl8.6/tzdata/Asia/Katmandu new file mode 100644 index 0000000..2d6d060 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Asia/Katmandu @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(Asia/Kathmandu)]} { + LoadTimeZoneFile Asia/Kathmandu +} +set TZData(:Asia/Katmandu) $TZData(:Asia/Kathmandu) diff --git a/env/tcl/tcl8.6/tzdata/Asia/Khandyga b/env/tcl/tcl8.6/tzdata/Asia/Khandyga new file mode 100644 index 0000000..07bffac --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Asia/Khandyga @@ -0,0 +1,73 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Asia/Khandyga) { + {-9223372036854775808 32533 0 LMT} + {-1579424533 28800 0 +08} + {-1247558400 32400 0 +10} + {354898800 36000 1 +10} + {370706400 32400 0 +09} + {386434800 36000 1 +10} + {402242400 32400 0 +09} + {417970800 36000 1 +10} + {433778400 32400 0 +09} + {449593200 36000 1 +10} + {465325200 32400 0 +09} + {481050000 36000 1 +10} + {496774800 32400 0 +09} + {512499600 36000 1 +10} + {528224400 32400 0 +09} + {543949200 36000 1 +10} + {559674000 32400 0 +09} + {575398800 36000 1 +10} + {591123600 32400 0 +09} + {606848400 36000 1 +10} + {622573200 32400 0 +09} + {638298000 36000 1 +10} + {654627600 32400 0 +09} + {670352400 28800 0 +09} + {670356000 32400 1 +09} + {686080800 28800 0 +08} + {695757600 32400 0 +10} + {701802000 36000 1 +10} + {717526800 32400 0 +09} + {733251600 36000 1 +10} + {748976400 32400 0 +09} + {764701200 36000 1 +10} + {780426000 32400 0 +09} + {796150800 36000 1 +10} + {811875600 32400 0 +09} + {828205200 36000 1 +10} + {846349200 32400 0 +09} + {859654800 36000 1 +10} + {877798800 32400 0 +09} + {891104400 36000 1 +10} + {909248400 32400 0 +09} + {922554000 36000 1 +10} + {941302800 32400 0 +09} + {954003600 36000 1 +10} + {972752400 32400 0 +09} + {985453200 36000 1 +10} + {1004202000 32400 0 +09} + {1017507600 36000 1 +10} + {1035651600 32400 0 +09} + {1048957200 36000 1 +10} + {1067101200 32400 0 +09} + {1072882800 36000 0 +11} + {1080403200 39600 1 +11} + {1099152000 36000 0 +10} + {1111852800 39600 1 +11} + {1130601600 36000 0 +10} + {1143302400 39600 1 +11} + {1162051200 36000 0 +10} + {1174752000 39600 1 +11} + {1193500800 36000 0 +10} + {1206806400 39600 1 +11} + {1224950400 36000 0 +10} + {1238256000 39600 1 +11} + {1256400000 36000 0 +10} + {1269705600 39600 1 +11} + {1288454400 36000 0 +10} + {1301155200 39600 0 +11} + {1315832400 36000 0 +10} + {1414252800 32400 0 +09} +} diff --git a/env/tcl/tcl8.6/tzdata/Asia/Kolkata b/env/tcl/tcl8.6/tzdata/Asia/Kolkata new file mode 100644 index 0000000..b78f8cd --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Asia/Kolkata @@ -0,0 +1,12 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Asia/Kolkata) { + {-9223372036854775808 21208 0 LMT} + {-3645237208 21200 0 HMT} + {-3155694800 19270 0 MMT} + {-2019705670 19800 0 IST} + {-891581400 23400 1 +0630} + {-872058600 19800 0 IST} + {-862637400 23400 1 +0630} + {-764145000 19800 0 IST} +} diff --git a/env/tcl/tcl8.6/tzdata/Asia/Krasnoyarsk b/env/tcl/tcl8.6/tzdata/Asia/Krasnoyarsk new file mode 100644 index 0000000..0721425 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Asia/Krasnoyarsk @@ -0,0 +1,71 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Asia/Krasnoyarsk) { + {-9223372036854775808 22286 0 LMT} + {-1577513486 21600 0 +06} + {-1247551200 25200 0 +08} + {354906000 28800 1 +08} + {370713600 25200 0 +07} + {386442000 28800 1 +08} + {402249600 25200 0 +07} + {417978000 28800 1 +08} + {433785600 25200 0 +07} + {449600400 28800 1 +08} + {465332400 25200 0 +07} + {481057200 28800 1 +08} + {496782000 25200 0 +07} + {512506800 28800 1 +08} + {528231600 25200 0 +07} + {543956400 28800 1 +08} + {559681200 25200 0 +07} + {575406000 28800 1 +08} + {591130800 25200 0 +07} + {606855600 28800 1 +08} + {622580400 25200 0 +07} + {638305200 28800 1 +08} + {654634800 25200 0 +07} + {670359600 21600 0 +07} + {670363200 25200 1 +07} + {686088000 21600 0 +06} + {695764800 25200 0 +08} + {701809200 28800 1 +08} + {717534000 25200 0 +07} + {733258800 28800 1 +08} + {748983600 25200 0 +07} + {764708400 28800 1 +08} + {780433200 25200 0 +07} + {796158000 28800 1 +08} + {811882800 25200 0 +07} + {828212400 28800 1 +08} + {846356400 25200 0 +07} + {859662000 28800 1 +08} + {877806000 25200 0 +07} + {891111600 28800 1 +08} + {909255600 25200 0 +07} + {922561200 28800 1 +08} + {941310000 25200 0 +07} + {954010800 28800 1 +08} + {972759600 25200 0 +07} + {985460400 28800 1 +08} + {1004209200 25200 0 +07} + {1017514800 28800 1 +08} + {1035658800 25200 0 +07} + {1048964400 28800 1 +08} + {1067108400 25200 0 +07} + {1080414000 28800 1 +08} + {1099162800 25200 0 +07} + {1111863600 28800 1 +08} + {1130612400 25200 0 +07} + {1143313200 28800 1 +08} + {1162062000 25200 0 +07} + {1174762800 28800 1 +08} + {1193511600 25200 0 +07} + {1206817200 28800 1 +08} + {1224961200 25200 0 +07} + {1238266800 28800 1 +08} + {1256410800 25200 0 +07} + {1269716400 28800 1 +08} + {1288465200 25200 0 +07} + {1301166000 28800 0 +08} + {1414260000 25200 0 +07} +} diff --git a/env/tcl/tcl8.6/tzdata/Asia/Kuala_Lumpur b/env/tcl/tcl8.6/tzdata/Asia/Kuala_Lumpur new file mode 100644 index 0000000..84eae1d --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Asia/Kuala_Lumpur @@ -0,0 +1,13 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Asia/Kuala_Lumpur) { + {-9223372036854775808 24406 0 LMT} + {-2177477206 24925 0 SMT} + {-2038200925 25200 0 +07} + {-1167634800 26400 1 +0720} + {-1073028000 26400 0 +0720} + {-894180000 27000 0 +0730} + {-879665400 32400 0 +09} + {-767005200 27000 0 +0730} + {378664200 28800 0 +08} +} diff --git a/env/tcl/tcl8.6/tzdata/Asia/Kuching b/env/tcl/tcl8.6/tzdata/Asia/Kuching new file mode 100644 index 0000000..e5dc1b7 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Asia/Kuching @@ -0,0 +1,23 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Asia/Kuching) { + {-9223372036854775808 26480 0 LMT} + {-1383463280 27000 0 +0730} + {-1167636600 28800 0 +08} + {-1082448000 30000 1 +08} + {-1074586800 28800 0 +08} + {-1050825600 30000 1 +08} + {-1042964400 28800 0 +08} + {-1019289600 30000 1 +08} + {-1011428400 28800 0 +08} + {-987753600 30000 1 +08} + {-979892400 28800 0 +08} + {-956217600 30000 1 +08} + {-948356400 28800 0 +08} + {-924595200 30000 1 +08} + {-916734000 28800 0 +08} + {-893059200 30000 1 +08} + {-885198000 28800 0 +08} + {-879667200 32400 0 +09} + {-767005200 28800 0 +08} +} diff --git a/env/tcl/tcl8.6/tzdata/Asia/Kuwait b/env/tcl/tcl8.6/tzdata/Asia/Kuwait new file mode 100644 index 0000000..e618c56 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Asia/Kuwait @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(Asia/Riyadh)]} { + LoadTimeZoneFile Asia/Riyadh +} +set TZData(:Asia/Kuwait) $TZData(:Asia/Riyadh) diff --git a/env/tcl/tcl8.6/tzdata/Asia/Macao b/env/tcl/tcl8.6/tzdata/Asia/Macao new file mode 100644 index 0000000..6e972ff --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Asia/Macao @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(Asia/Macau)]} { + LoadTimeZoneFile Asia/Macau +} +set TZData(:Asia/Macao) $TZData(:Asia/Macau) diff --git a/env/tcl/tcl8.6/tzdata/Asia/Macau b/env/tcl/tcl8.6/tzdata/Asia/Macau new file mode 100644 index 0000000..cbafd0e --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Asia/Macau @@ -0,0 +1,76 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Asia/Macau) { + {-9223372036854775808 27250 0 LMT} + {-2056692850 28800 0 CST} + {-884509200 32400 0 +09} + {-873280800 36000 1 +09} + {-855918000 32400 0 +09} + {-841744800 36000 1 +09} + {-828529200 32400 0 +10} + {-765363600 28800 0 CT} + {-747046800 32400 1 CDT} + {-733827600 28800 0 CST} + {-716461200 32400 1 CDT} + {-697021200 28800 0 CST} + {-683715600 32400 1 CDT} + {-667990800 28800 0 CST} + {-654771600 32400 1 CDT} + {-636627600 28800 0 CST} + {-623322000 32400 1 CDT} + {-605178000 28800 0 CST} + {-591872400 32400 1 CDT} + {-573642000 28800 0 CST} + {-559818000 32400 1 CDT} + {-541674000 28800 0 CST} + {-528368400 32400 1 CDT} + {-510224400 28800 0 CST} + {-498128400 32400 1 CDT} + {-478774800 28800 0 CST} + {-466678800 32400 1 CDT} + {-446720400 28800 0 CST} + {-435229200 32400 1 CDT} + {-415258200 28800 0 CST} + {-403158600 32400 1 CDT} + {-383808600 28800 0 CST} + {-371709000 32400 1 CDT} + {-352359000 28800 0 CST} + {-340259400 32400 1 CDT} + {-320909400 28800 0 CST} + {-308809800 32400 1 CDT} + {-288855000 28800 0 CST} + {-277360200 32400 1 CDT} + {-257405400 28800 0 CST} + {-245910600 32400 1 CDT} + {-225955800 28800 0 CST} + {-213856200 32400 1 CDT} + {-194506200 28800 0 CST} + {-182406600 32400 1 CDT} + {-163056600 28800 0 CST} + {-148537800 32400 1 CDT} + {-132820200 28800 0 CST} + {-117088200 32400 1 CDT} + {-101370600 28800 0 CST} + {-85638600 32400 1 CDT} + {-69312600 28800 0 CST} + {-53584200 32400 1 CDT} + {-37863000 28800 0 CST} + {-22134600 32400 1 CDT} + {-6413400 28800 0 CST} + {9315000 32400 1 CDT} + {25036200 28800 0 CST} + {40764600 32400 1 CDT} + {56485800 28800 0 CST} + {72214200 32400 1 CDT} + {88540200 28800 0 CST} + {104268600 32400 1 CDT} + {119989800 28800 0 CST} + {126041400 32400 1 CDT} + {151439400 28800 0 CST} + {167167800 32400 1 CDT} + {182889000 28800 0 CST} + {198617400 32400 1 CDT} + {214338600 28800 0 CST} + {295385400 32400 1 CDT} + {309292200 28800 0 CST} +} diff --git a/env/tcl/tcl8.6/tzdata/Asia/Magadan b/env/tcl/tcl8.6/tzdata/Asia/Magadan new file mode 100644 index 0000000..0626899 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Asia/Magadan @@ -0,0 +1,72 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Asia/Magadan) { + {-9223372036854775808 36192 0 LMT} + {-1441188192 36000 0 +10} + {-1247565600 39600 0 +12} + {354891600 43200 1 +12} + {370699200 39600 0 +11} + {386427600 43200 1 +12} + {402235200 39600 0 +11} + {417963600 43200 1 +12} + {433771200 39600 0 +11} + {449586000 43200 1 +12} + {465318000 39600 0 +11} + {481042800 43200 1 +12} + {496767600 39600 0 +11} + {512492400 43200 1 +12} + {528217200 39600 0 +11} + {543942000 43200 1 +12} + {559666800 39600 0 +11} + {575391600 43200 1 +12} + {591116400 39600 0 +11} + {606841200 43200 1 +12} + {622566000 39600 0 +11} + {638290800 43200 1 +12} + {654620400 39600 0 +11} + {670345200 36000 0 +11} + {670348800 39600 1 +11} + {686073600 36000 0 +10} + {695750400 39600 0 +12} + {701794800 43200 1 +12} + {717519600 39600 0 +11} + {733244400 43200 1 +12} + {748969200 39600 0 +11} + {764694000 43200 1 +12} + {780418800 39600 0 +11} + {796143600 43200 1 +12} + {811868400 39600 0 +11} + {828198000 43200 1 +12} + {846342000 39600 0 +11} + {859647600 43200 1 +12} + {877791600 39600 0 +11} + {891097200 43200 1 +12} + {909241200 39600 0 +11} + {922546800 43200 1 +12} + {941295600 39600 0 +11} + {953996400 43200 1 +12} + {972745200 39600 0 +11} + {985446000 43200 1 +12} + {1004194800 39600 0 +11} + {1017500400 43200 1 +12} + {1035644400 39600 0 +11} + {1048950000 43200 1 +12} + {1067094000 39600 0 +11} + {1080399600 43200 1 +12} + {1099148400 39600 0 +11} + {1111849200 43200 1 +12} + {1130598000 39600 0 +11} + {1143298800 43200 1 +12} + {1162047600 39600 0 +11} + {1174748400 43200 1 +12} + {1193497200 39600 0 +11} + {1206802800 43200 1 +12} + {1224946800 39600 0 +11} + {1238252400 43200 1 +12} + {1256396400 39600 0 +11} + {1269702000 43200 1 +12} + {1288450800 39600 0 +11} + {1301151600 43200 0 +12} + {1414245600 36000 0 +10} + {1461427200 39600 0 +11} +} diff --git a/env/tcl/tcl8.6/tzdata/Asia/Makassar b/env/tcl/tcl8.6/tzdata/Asia/Makassar new file mode 100644 index 0000000..1be5c59 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Asia/Makassar @@ -0,0 +1,9 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Asia/Makassar) { + {-9223372036854775808 28656 0 LMT} + {-1577951856 28656 0 MMT} + {-1172908656 28800 0 +08} + {-880272000 32400 0 +09} + {-766054800 28800 0 WITA} +} diff --git a/env/tcl/tcl8.6/tzdata/Asia/Manila b/env/tcl/tcl8.6/tzdata/Asia/Manila new file mode 100644 index 0000000..6eb1db3 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Asia/Manila @@ -0,0 +1,15 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Asia/Manila) { + {-9223372036854775808 -57360 0 LMT} + {-3944621040 29040 0 LMT} + {-2229321840 28800 0 PST} + {-1046678400 32400 1 PDT} + {-1038733200 28800 0 PST} + {-873273600 32400 0 JST} + {-794221200 28800 0 PST} + {-496224000 32400 1 PDT} + {-489315600 28800 0 PST} + {259344000 32400 1 PDT} + {275151600 28800 0 PST} +} diff --git a/env/tcl/tcl8.6/tzdata/Asia/Muscat b/env/tcl/tcl8.6/tzdata/Asia/Muscat new file mode 100644 index 0000000..fdd34c1 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Asia/Muscat @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(Asia/Dubai)]} { + LoadTimeZoneFile Asia/Dubai +} +set TZData(:Asia/Muscat) $TZData(:Asia/Dubai) diff --git a/env/tcl/tcl8.6/tzdata/Asia/Nicosia b/env/tcl/tcl8.6/tzdata/Asia/Nicosia new file mode 100644 index 0000000..73a7b4c --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Asia/Nicosia @@ -0,0 +1,257 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Asia/Nicosia) { + {-9223372036854775808 8008 0 LMT} + {-1518920008 7200 0 EET} + {166572000 10800 1 EEST} + {182293200 7200 0 EET} + {200959200 10800 1 EEST} + {213829200 7200 0 EET} + {228866400 10800 1 EEST} + {243982800 7200 0 EET} + {260316000 10800 1 EEST} + {276123600 7200 0 EET} + {291765600 10800 1 EEST} + {307486800 7200 0 EET} + {323820000 10800 1 EEST} + {338936400 7200 0 EET} + {354664800 10800 1 EEST} + {370386000 7200 0 EET} + {386114400 10800 1 EEST} + {401835600 7200 0 EET} + {417564000 10800 1 EEST} + {433285200 7200 0 EET} + {449013600 10800 1 EEST} + {465339600 7200 0 EET} + {481068000 10800 1 EEST} + {496789200 7200 0 EET} + {512517600 10800 1 EEST} + {528238800 7200 0 EET} + {543967200 10800 1 EEST} + {559688400 7200 0 EET} + {575416800 10800 1 EEST} + {591138000 7200 0 EET} + {606866400 10800 1 EEST} + {622587600 7200 0 EET} + {638316000 10800 1 EEST} + {654642000 7200 0 EET} + {670370400 10800 1 EEST} + {686091600 7200 0 EET} + {701820000 10800 1 EEST} + {717541200 7200 0 EET} + {733269600 10800 1 EEST} + {748990800 7200 0 EET} + {764719200 10800 1 EEST} + {780440400 7200 0 EET} + {796168800 10800 1 EEST} + {811890000 7200 0 EET} + {828223200 10800 1 EEST} + {843944400 7200 0 EET} + {859672800 10800 1 EEST} + {875394000 7200 0 EET} + {891122400 10800 1 EEST} + {904597200 10800 0 EEST} + {909277200 7200 0 EET} + {922582800 10800 1 EEST} + {941331600 7200 0 EET} + {954032400 10800 1 EEST} + {972781200 7200 0 EET} + {985482000 10800 1 EEST} + {1004230800 7200 0 EET} + {1017536400 10800 1 EEST} + {1035680400 7200 0 EET} + {1048986000 10800 1 EEST} + {1067130000 7200 0 EET} + {1080435600 10800 1 EEST} + {1099184400 7200 0 EET} + {1111885200 10800 1 EEST} + {1130634000 7200 0 EET} + {1143334800 10800 1 EEST} + {1162083600 7200 0 EET} + {1174784400 10800 1 EEST} + {1193533200 7200 0 EET} + {1206838800 10800 1 EEST} + {1224982800 7200 0 EET} + {1238288400 10800 1 EEST} + {1256432400 7200 0 EET} + {1269738000 10800 1 EEST} + {1288486800 7200 0 EET} + {1301187600 10800 1 EEST} + {1319936400 7200 0 EET} + {1332637200 10800 1 EEST} + {1351386000 7200 0 EET} + {1364691600 10800 1 EEST} + {1382835600 7200 0 EET} + {1396141200 10800 1 EEST} + {1414285200 7200 0 EET} + {1427590800 10800 1 EEST} + {1445734800 7200 0 EET} + {1459040400 10800 1 EEST} + {1477789200 7200 0 EET} + {1490490000 10800 1 EEST} + {1509238800 7200 0 EET} + {1521939600 10800 1 EEST} + {1540688400 7200 0 EET} + {1553994000 10800 1 EEST} + {1572138000 7200 0 EET} + {1585443600 10800 1 EEST} + {1603587600 7200 0 EET} + {1616893200 10800 1 EEST} + {1635642000 7200 0 EET} + {1648342800 10800 1 EEST} + {1667091600 7200 0 EET} + {1679792400 10800 1 EEST} + {1698541200 7200 0 EET} + {1711846800 10800 1 EEST} + {1729990800 7200 0 EET} + {1743296400 10800 1 EEST} + {1761440400 7200 0 EET} + {1774746000 10800 1 EEST} + {1792890000 7200 0 EET} + {1806195600 10800 1 EEST} + {1824944400 7200 0 EET} + {1837645200 10800 1 EEST} + {1856394000 7200 0 EET} + {1869094800 10800 1 EEST} + {1887843600 7200 0 EET} + {1901149200 10800 1 EEST} + {1919293200 7200 0 EET} + {1932598800 10800 1 EEST} + {1950742800 7200 0 EET} + {1964048400 10800 1 EEST} + {1982797200 7200 0 EET} + {1995498000 10800 1 EEST} + {2014246800 7200 0 EET} + {2026947600 10800 1 EEST} + {2045696400 7200 0 EET} + {2058397200 10800 1 EEST} + {2077146000 7200 0 EET} + {2090451600 10800 1 EEST} + {2108595600 7200 0 EET} + {2121901200 10800 1 EEST} + {2140045200 7200 0 EET} + {2153350800 10800 1 EEST} + {2172099600 7200 0 EET} + {2184800400 10800 1 EEST} + {2203549200 7200 0 EET} + {2216250000 10800 1 EEST} + {2234998800 7200 0 EET} + {2248304400 10800 1 EEST} + {2266448400 7200 0 EET} + {2279754000 10800 1 EEST} + {2297898000 7200 0 EET} + {2311203600 10800 1 EEST} + {2329347600 7200 0 EET} + {2342653200 10800 1 EEST} + {2361402000 7200 0 EET} + {2374102800 10800 1 EEST} + {2392851600 7200 0 EET} + {2405552400 10800 1 EEST} + {2424301200 7200 0 EET} + {2437606800 10800 1 EEST} + {2455750800 7200 0 EET} + {2469056400 10800 1 EEST} + {2487200400 7200 0 EET} + {2500506000 10800 1 EEST} + {2519254800 7200 0 EET} + {2531955600 10800 1 EEST} + {2550704400 7200 0 EET} + {2563405200 10800 1 EEST} + {2582154000 7200 0 EET} + {2595459600 10800 1 EEST} + {2613603600 7200 0 EET} + {2626909200 10800 1 EEST} + {2645053200 7200 0 EET} + {2658358800 10800 1 EEST} + {2676502800 7200 0 EET} + {2689808400 10800 1 EEST} + {2708557200 7200 0 EET} + {2721258000 10800 1 EEST} + {2740006800 7200 0 EET} + {2752707600 10800 1 EEST} + {2771456400 7200 0 EET} + {2784762000 10800 1 EEST} + {2802906000 7200 0 EET} + {2816211600 10800 1 EEST} + {2834355600 7200 0 EET} + {2847661200 10800 1 EEST} + {2866410000 7200 0 EET} + {2879110800 10800 1 EEST} + {2897859600 7200 0 EET} + {2910560400 10800 1 EEST} + {2929309200 7200 0 EET} + {2942010000 10800 1 EEST} + {2960758800 7200 0 EET} + {2974064400 10800 1 EEST} + {2992208400 7200 0 EET} + {3005514000 10800 1 EEST} + {3023658000 7200 0 EET} + {3036963600 10800 1 EEST} + {3055712400 7200 0 EET} + {3068413200 10800 1 EEST} + {3087162000 7200 0 EET} + {3099862800 10800 1 EEST} + {3118611600 7200 0 EET} + {3131917200 10800 1 EEST} + {3150061200 7200 0 EET} + {3163366800 10800 1 EEST} + {3181510800 7200 0 EET} + {3194816400 10800 1 EEST} + {3212960400 7200 0 EET} + {3226266000 10800 1 EEST} + {3245014800 7200 0 EET} + {3257715600 10800 1 EEST} + {3276464400 7200 0 EET} + {3289165200 10800 1 EEST} + {3307914000 7200 0 EET} + {3321219600 10800 1 EEST} + {3339363600 7200 0 EET} + {3352669200 10800 1 EEST} + {3370813200 7200 0 EET} + {3384118800 10800 1 EEST} + {3402867600 7200 0 EET} + {3415568400 10800 1 EEST} + {3434317200 7200 0 EET} + {3447018000 10800 1 EEST} + {3465766800 7200 0 EET} + {3479072400 10800 1 EEST} + {3497216400 7200 0 EET} + {3510522000 10800 1 EEST} + {3528666000 7200 0 EET} + {3541971600 10800 1 EEST} + {3560115600 7200 0 EET} + {3573421200 10800 1 EEST} + {3592170000 7200 0 EET} + {3604870800 10800 1 EEST} + {3623619600 7200 0 EET} + {3636320400 10800 1 EEST} + {3655069200 7200 0 EET} + {3668374800 10800 1 EEST} + {3686518800 7200 0 EET} + {3699824400 10800 1 EEST} + {3717968400 7200 0 EET} + {3731274000 10800 1 EEST} + {3750022800 7200 0 EET} + {3762723600 10800 1 EEST} + {3781472400 7200 0 EET} + {3794173200 10800 1 EEST} + {3812922000 7200 0 EET} + {3825622800 10800 1 EEST} + {3844371600 7200 0 EET} + {3857677200 10800 1 EEST} + {3875821200 7200 0 EET} + {3889126800 10800 1 EEST} + {3907270800 7200 0 EET} + {3920576400 10800 1 EEST} + {3939325200 7200 0 EET} + {3952026000 10800 1 EEST} + {3970774800 7200 0 EET} + {3983475600 10800 1 EEST} + {4002224400 7200 0 EET} + {4015530000 10800 1 EEST} + {4033674000 7200 0 EET} + {4046979600 10800 1 EEST} + {4065123600 7200 0 EET} + {4078429200 10800 1 EEST} + {4096573200 7200 0 EET} +} diff --git a/env/tcl/tcl8.6/tzdata/Asia/Novokuznetsk b/env/tcl/tcl8.6/tzdata/Asia/Novokuznetsk new file mode 100644 index 0000000..a43a984 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Asia/Novokuznetsk @@ -0,0 +1,71 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Asia/Novokuznetsk) { + {-9223372036854775808 20928 0 LMT} + {-1441259328 21600 0 +06} + {-1247551200 25200 0 +08} + {354906000 28800 1 +08} + {370713600 25200 0 +07} + {386442000 28800 1 +08} + {402249600 25200 0 +07} + {417978000 28800 1 +08} + {433785600 25200 0 +07} + {449600400 28800 1 +08} + {465332400 25200 0 +07} + {481057200 28800 1 +08} + {496782000 25200 0 +07} + {512506800 28800 1 +08} + {528231600 25200 0 +07} + {543956400 28800 1 +08} + {559681200 25200 0 +07} + {575406000 28800 1 +08} + {591130800 25200 0 +07} + {606855600 28800 1 +08} + {622580400 25200 0 +07} + {638305200 28800 1 +08} + {654634800 25200 0 +07} + {670359600 21600 0 +07} + {670363200 25200 1 +07} + {686088000 21600 0 +06} + {695764800 25200 0 +08} + {701809200 28800 1 +08} + {717534000 25200 0 +07} + {733258800 28800 1 +08} + {748983600 25200 0 +07} + {764708400 28800 1 +08} + {780433200 25200 0 +07} + {796158000 28800 1 +08} + {811882800 25200 0 +07} + {828212400 28800 1 +08} + {846356400 25200 0 +07} + {859662000 28800 1 +08} + {877806000 25200 0 +07} + {891111600 28800 1 +08} + {909255600 25200 0 +07} + {922561200 28800 1 +08} + {941310000 25200 0 +07} + {954010800 28800 1 +08} + {972759600 25200 0 +07} + {985460400 28800 1 +08} + {1004209200 25200 0 +07} + {1017514800 28800 1 +08} + {1035658800 25200 0 +07} + {1048964400 28800 1 +08} + {1067108400 25200 0 +07} + {1080414000 28800 1 +08} + {1099162800 25200 0 +07} + {1111863600 28800 1 +08} + {1130612400 25200 0 +07} + {1143313200 28800 1 +08} + {1162062000 25200 0 +07} + {1174762800 28800 1 +08} + {1193511600 25200 0 +07} + {1206817200 28800 1 +08} + {1224961200 25200 0 +07} + {1238266800 28800 1 +08} + {1256410800 25200 0 +07} + {1269716400 21600 0 +07} + {1269720000 25200 1 +07} + {1288468800 21600 0 +06} + {1301169600 25200 0 +07} +} diff --git a/env/tcl/tcl8.6/tzdata/Asia/Novosibirsk b/env/tcl/tcl8.6/tzdata/Asia/Novosibirsk new file mode 100644 index 0000000..21f5c00 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Asia/Novosibirsk @@ -0,0 +1,73 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Asia/Novosibirsk) { + {-9223372036854775808 19900 0 LMT} + {-1579476700 21600 0 +06} + {-1247551200 25200 0 +08} + {354906000 28800 1 +08} + {370713600 25200 0 +07} + {386442000 28800 1 +08} + {402249600 25200 0 +07} + {417978000 28800 1 +08} + {433785600 25200 0 +07} + {449600400 28800 1 +08} + {465332400 25200 0 +07} + {481057200 28800 1 +08} + {496782000 25200 0 +07} + {512506800 28800 1 +08} + {528231600 25200 0 +07} + {543956400 28800 1 +08} + {559681200 25200 0 +07} + {575406000 28800 1 +08} + {591130800 25200 0 +07} + {606855600 28800 1 +08} + {622580400 25200 0 +07} + {638305200 28800 1 +08} + {654634800 25200 0 +07} + {670359600 21600 0 +07} + {670363200 25200 1 +07} + {686088000 21600 0 +06} + {695764800 25200 0 +08} + {701809200 28800 1 +08} + {717534000 25200 0 +07} + {733258800 28800 1 +08} + {738090000 25200 0 +07} + {748987200 21600 0 +06} + {764712000 25200 1 +07} + {780436800 21600 0 +06} + {796161600 25200 1 +07} + {811886400 21600 0 +06} + {828216000 25200 1 +07} + {846360000 21600 0 +06} + {859665600 25200 1 +07} + {877809600 21600 0 +06} + {891115200 25200 1 +07} + {909259200 21600 0 +06} + {922564800 25200 1 +07} + {941313600 21600 0 +06} + {954014400 25200 1 +07} + {972763200 21600 0 +06} + {985464000 25200 1 +07} + {1004212800 21600 0 +06} + {1017518400 25200 1 +07} + {1035662400 21600 0 +06} + {1048968000 25200 1 +07} + {1067112000 21600 0 +06} + {1080417600 25200 1 +07} + {1099166400 21600 0 +06} + {1111867200 25200 1 +07} + {1130616000 21600 0 +06} + {1143316800 25200 1 +07} + {1162065600 21600 0 +06} + {1174766400 25200 1 +07} + {1193515200 21600 0 +06} + {1206820800 25200 1 +07} + {1224964800 21600 0 +06} + {1238270400 25200 1 +07} + {1256414400 21600 0 +06} + {1269720000 25200 1 +07} + {1288468800 21600 0 +06} + {1301169600 25200 0 +07} + {1414263600 21600 0 +06} + {1469304000 25200 0 +07} +} diff --git a/env/tcl/tcl8.6/tzdata/Asia/Omsk b/env/tcl/tcl8.6/tzdata/Asia/Omsk new file mode 100644 index 0000000..74163d5 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Asia/Omsk @@ -0,0 +1,71 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Asia/Omsk) { + {-9223372036854775808 17610 0 LMT} + {-1582088010 18000 0 +05} + {-1247547600 21600 0 +07} + {354909600 25200 1 +07} + {370717200 21600 0 +06} + {386445600 25200 1 +07} + {402253200 21600 0 +06} + {417981600 25200 1 +07} + {433789200 21600 0 +06} + {449604000 25200 1 +07} + {465336000 21600 0 +06} + {481060800 25200 1 +07} + {496785600 21600 0 +06} + {512510400 25200 1 +07} + {528235200 21600 0 +06} + {543960000 25200 1 +07} + {559684800 21600 0 +06} + {575409600 25200 1 +07} + {591134400 21600 0 +06} + {606859200 25200 1 +07} + {622584000 21600 0 +06} + {638308800 25200 1 +07} + {654638400 21600 0 +06} + {670363200 18000 0 +06} + {670366800 21600 1 +06} + {686091600 18000 0 +05} + {695768400 21600 0 +07} + {701812800 25200 1 +07} + {717537600 21600 0 +06} + {733262400 25200 1 +07} + {748987200 21600 0 +06} + {764712000 25200 1 +07} + {780436800 21600 0 +06} + {796161600 25200 1 +07} + {811886400 21600 0 +06} + {828216000 25200 1 +07} + {846360000 21600 0 +06} + {859665600 25200 1 +07} + {877809600 21600 0 +06} + {891115200 25200 1 +07} + {909259200 21600 0 +06} + {922564800 25200 1 +07} + {941313600 21600 0 +06} + {954014400 25200 1 +07} + {972763200 21600 0 +06} + {985464000 25200 1 +07} + {1004212800 21600 0 +06} + {1017518400 25200 1 +07} + {1035662400 21600 0 +06} + {1048968000 25200 1 +07} + {1067112000 21600 0 +06} + {1080417600 25200 1 +07} + {1099166400 21600 0 +06} + {1111867200 25200 1 +07} + {1130616000 21600 0 +06} + {1143316800 25200 1 +07} + {1162065600 21600 0 +06} + {1174766400 25200 1 +07} + {1193515200 21600 0 +06} + {1206820800 25200 1 +07} + {1224964800 21600 0 +06} + {1238270400 25200 1 +07} + {1256414400 21600 0 +06} + {1269720000 25200 1 +07} + {1288468800 21600 0 +06} + {1301169600 25200 0 +07} + {1414263600 21600 0 +06} +} diff --git a/env/tcl/tcl8.6/tzdata/Asia/Oral b/env/tcl/tcl8.6/tzdata/Asia/Oral new file mode 100644 index 0000000..e781b60 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Asia/Oral @@ -0,0 +1,58 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Asia/Oral) { + {-9223372036854775808 12324 0 LMT} + {-1441164324 10800 0 +03} + {-1247540400 18000 0 +05} + {354913200 21600 1 +06} + {370720800 21600 0 +06} + {386445600 18000 0 +05} + {386449200 21600 1 +05} + {402256800 18000 0 +05} + {417985200 21600 1 +05} + {433792800 18000 0 +05} + {449607600 21600 1 +05} + {465339600 18000 0 +05} + {481064400 21600 1 +05} + {496789200 18000 0 +05} + {512514000 21600 1 +05} + {528238800 18000 0 +05} + {543963600 21600 1 +05} + {559688400 18000 0 +05} + {575413200 21600 1 +05} + {591138000 18000 0 +05} + {606862800 14400 0 +04} + {606866400 18000 1 +04} + {622591200 14400 0 +04} + {638316000 18000 1 +04} + {654645600 14400 0 +04} + {670370400 18000 1 +04} + {686095200 14400 0 +04} + {701816400 14400 0 +04} + {701820000 18000 1 +04} + {717544800 14400 0 +04} + {733269600 18000 1 +04} + {748994400 14400 0 +04} + {764719200 18000 1 +04} + {780444000 14400 0 +04} + {796168800 18000 1 +04} + {811893600 14400 0 +04} + {828223200 18000 1 +04} + {846367200 14400 0 +04} + {859672800 18000 1 +04} + {877816800 14400 0 +04} + {891122400 18000 1 +04} + {909266400 14400 0 +04} + {922572000 18000 1 +04} + {941320800 14400 0 +04} + {954021600 18000 1 +04} + {972770400 14400 0 +04} + {985471200 18000 1 +04} + {1004220000 14400 0 +04} + {1017525600 18000 1 +04} + {1035669600 14400 0 +04} + {1048975200 18000 1 +04} + {1067119200 14400 0 +04} + {1080424800 18000 1 +04} + {1099173600 18000 0 +05} +} diff --git a/env/tcl/tcl8.6/tzdata/Asia/Phnom_Penh b/env/tcl/tcl8.6/tzdata/Asia/Phnom_Penh new file mode 100644 index 0000000..114c786 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Asia/Phnom_Penh @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(Asia/Bangkok)]} { + LoadTimeZoneFile Asia/Bangkok +} +set TZData(:Asia/Phnom_Penh) $TZData(:Asia/Bangkok) diff --git a/env/tcl/tcl8.6/tzdata/Asia/Pontianak b/env/tcl/tcl8.6/tzdata/Asia/Pontianak new file mode 100644 index 0000000..ed59e9d --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Asia/Pontianak @@ -0,0 +1,13 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Asia/Pontianak) { + {-9223372036854775808 26240 0 LMT} + {-1946186240 26240 0 PMT} + {-1172906240 27000 0 +0730} + {-881220600 32400 0 +09} + {-766054800 27000 0 +0730} + {-683883000 28800 0 +08} + {-620812800 27000 0 +0730} + {-189415800 28800 0 WITA} + {567964800 25200 0 WIB} +} diff --git a/env/tcl/tcl8.6/tzdata/Asia/Pyongyang b/env/tcl/tcl8.6/tzdata/Asia/Pyongyang new file mode 100644 index 0000000..5351736 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Asia/Pyongyang @@ -0,0 +1,10 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Asia/Pyongyang) { + {-9223372036854775808 30180 0 LMT} + {-1948782180 30600 0 KST} + {-1830414600 32400 0 JST} + {-768646800 32400 0 KST} + {1439564400 30600 0 KST} + {1525446000 32400 0 KST} +} diff --git a/env/tcl/tcl8.6/tzdata/Asia/Qatar b/env/tcl/tcl8.6/tzdata/Asia/Qatar new file mode 100644 index 0000000..10b4f6d --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Asia/Qatar @@ -0,0 +1,7 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Asia/Qatar) { + {-9223372036854775808 12368 0 LMT} + {-1577935568 14400 0 +04} + {76190400 10800 0 +03} +} diff --git a/env/tcl/tcl8.6/tzdata/Asia/Qyzylorda b/env/tcl/tcl8.6/tzdata/Asia/Qyzylorda new file mode 100644 index 0000000..7c6df32 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Asia/Qyzylorda @@ -0,0 +1,57 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Asia/Qyzylorda) { + {-9223372036854775808 15712 0 LMT} + {-1441167712 14400 0 +04} + {-1247544000 18000 0 +05} + {354913200 21600 1 +06} + {370720800 21600 0 +06} + {386445600 18000 0 +05} + {386449200 21600 1 +05} + {402256800 18000 0 +05} + {417985200 21600 1 +05} + {433792800 18000 0 +05} + {449607600 21600 1 +05} + {465339600 18000 0 +05} + {481064400 21600 1 +05} + {496789200 18000 0 +05} + {512514000 21600 1 +05} + {528238800 18000 0 +05} + {543963600 21600 1 +05} + {559688400 18000 0 +05} + {575413200 21600 1 +05} + {591138000 18000 0 +05} + {606862800 21600 1 +05} + {622587600 18000 0 +05} + {638312400 21600 1 +05} + {654642000 18000 0 +05} + {670366800 14400 0 +04} + {670370400 18000 1 +04} + {701812800 18000 0 +05} + {701816400 21600 1 +05} + {717541200 18000 0 +05} + {733266000 21600 1 +05} + {748990800 18000 0 +05} + {764715600 21600 1 +05} + {780440400 18000 0 +05} + {796165200 21600 1 +05} + {811890000 18000 0 +05} + {828219600 21600 1 +05} + {846363600 18000 0 +05} + {859669200 21600 1 +05} + {877813200 18000 0 +05} + {891118800 21600 1 +05} + {909262800 18000 0 +05} + {922568400 21600 1 +05} + {941317200 18000 0 +05} + {954018000 21600 1 +05} + {972766800 18000 0 +05} + {985467600 21600 1 +05} + {1004216400 18000 0 +05} + {1017522000 21600 1 +05} + {1035666000 18000 0 +05} + {1048971600 21600 1 +05} + {1067115600 18000 0 +05} + {1080421200 21600 1 +05} + {1099170000 21600 0 +06} +} diff --git a/env/tcl/tcl8.6/tzdata/Asia/Rangoon b/env/tcl/tcl8.6/tzdata/Asia/Rangoon new file mode 100644 index 0000000..8ea2748 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Asia/Rangoon @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(Asia/Yangon)]} { + LoadTimeZoneFile Asia/Yangon +} +set TZData(:Asia/Rangoon) $TZData(:Asia/Yangon) diff --git a/env/tcl/tcl8.6/tzdata/Asia/Riyadh b/env/tcl/tcl8.6/tzdata/Asia/Riyadh new file mode 100644 index 0000000..af5efa8 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Asia/Riyadh @@ -0,0 +1,6 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Asia/Riyadh) { + {-9223372036854775808 11212 0 LMT} + {-719636812 10800 0 +03} +} diff --git a/env/tcl/tcl8.6/tzdata/Asia/Saigon b/env/tcl/tcl8.6/tzdata/Asia/Saigon new file mode 100644 index 0000000..1e42eed --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Asia/Saigon @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(Asia/Ho_Chi_Minh)]} { + LoadTimeZoneFile Asia/Ho_Chi_Minh +} +set TZData(:Asia/Saigon) $TZData(:Asia/Ho_Chi_Minh) diff --git a/env/tcl/tcl8.6/tzdata/Asia/Sakhalin b/env/tcl/tcl8.6/tzdata/Asia/Sakhalin new file mode 100644 index 0000000..4ba7c8c --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Asia/Sakhalin @@ -0,0 +1,73 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Asia/Sakhalin) { + {-9223372036854775808 34248 0 LMT} + {-2031039048 32400 0 +09} + {-768560400 39600 0 +12} + {354891600 43200 1 +12} + {370699200 39600 0 +11} + {386427600 43200 1 +12} + {402235200 39600 0 +11} + {417963600 43200 1 +12} + {433771200 39600 0 +11} + {449586000 43200 1 +12} + {465318000 39600 0 +11} + {481042800 43200 1 +12} + {496767600 39600 0 +11} + {512492400 43200 1 +12} + {528217200 39600 0 +11} + {543942000 43200 1 +12} + {559666800 39600 0 +11} + {575391600 43200 1 +12} + {591116400 39600 0 +11} + {606841200 43200 1 +12} + {622566000 39600 0 +11} + {638290800 43200 1 +12} + {654620400 39600 0 +11} + {670345200 36000 0 +11} + {670348800 39600 1 +11} + {686073600 36000 0 +10} + {695750400 39600 0 +12} + {701794800 43200 1 +12} + {717519600 39600 0 +11} + {733244400 43200 1 +12} + {748969200 39600 0 +11} + {764694000 43200 1 +12} + {780418800 39600 0 +11} + {796143600 43200 1 +12} + {811868400 39600 0 +11} + {828198000 43200 1 +12} + {846342000 39600 0 +11} + {859647600 36000 0 +11} + {859651200 39600 1 +11} + {877795200 36000 0 +10} + {891100800 39600 1 +11} + {909244800 36000 0 +10} + {922550400 39600 1 +11} + {941299200 36000 0 +10} + {954000000 39600 1 +11} + {972748800 36000 0 +10} + {985449600 39600 1 +11} + {1004198400 36000 0 +10} + {1017504000 39600 1 +11} + {1035648000 36000 0 +10} + {1048953600 39600 1 +11} + {1067097600 36000 0 +10} + {1080403200 39600 1 +11} + {1099152000 36000 0 +10} + {1111852800 39600 1 +11} + {1130601600 36000 0 +10} + {1143302400 39600 1 +11} + {1162051200 36000 0 +10} + {1174752000 39600 1 +11} + {1193500800 36000 0 +10} + {1206806400 39600 1 +11} + {1224950400 36000 0 +10} + {1238256000 39600 1 +11} + {1256400000 36000 0 +10} + {1269705600 39600 1 +11} + {1288454400 36000 0 +10} + {1301155200 39600 0 +11} + {1414249200 36000 0 +10} + {1459008000 39600 0 +11} +} diff --git a/env/tcl/tcl8.6/tzdata/Asia/Samarkand b/env/tcl/tcl8.6/tzdata/Asia/Samarkand new file mode 100644 index 0000000..805bab7 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Asia/Samarkand @@ -0,0 +1,31 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Asia/Samarkand) { + {-9223372036854775808 16073 0 LMT} + {-1441168073 14400 0 +04} + {-1247544000 18000 0 +05} + {354913200 21600 1 +06} + {370720800 21600 0 +06} + {386445600 18000 0 +05} + {386449200 21600 1 +05} + {402256800 18000 0 +05} + {417985200 21600 1 +05} + {433792800 18000 0 +05} + {449607600 21600 1 +05} + {465339600 18000 0 +05} + {481064400 21600 1 +05} + {496789200 18000 0 +05} + {512514000 21600 1 +05} + {528238800 18000 0 +05} + {543963600 21600 1 +05} + {559688400 18000 0 +05} + {575413200 21600 1 +05} + {591138000 18000 0 +05} + {606862800 21600 1 +05} + {622587600 18000 0 +05} + {638312400 21600 1 +05} + {654642000 18000 0 +05} + {670366800 21600 1 +05} + {686091600 18000 0 +05} + {694206000 18000 0 +05} +} diff --git a/env/tcl/tcl8.6/tzdata/Asia/Seoul b/env/tcl/tcl8.6/tzdata/Asia/Seoul new file mode 100644 index 0000000..b226eb5 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Asia/Seoul @@ -0,0 +1,26 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Asia/Seoul) { + {-9223372036854775808 30472 0 LMT} + {-1948782472 30600 0 KST} + {-1830414600 32400 0 JST} + {-767350800 32400 0 KST} + {-498128400 30600 0 KST} + {-462702600 34200 1 KDT} + {-451733400 30600 0 KST} + {-429784200 34200 1 KDT} + {-418296600 30600 0 KST} + {-399544200 34200 1 KDT} + {-387451800 30600 0 KST} + {-368094600 34200 1 KDT} + {-356002200 30600 0 KST} + {-336645000 34200 1 KDT} + {-324552600 30600 0 KST} + {-305195400 34200 1 KDT} + {-293103000 30600 0 KST} + {-264933000 32400 0 KST} + {547578000 36000 1 KDT} + {560883600 32400 0 KST} + {579027600 36000 1 KDT} + {592333200 32400 0 KST} +} diff --git a/env/tcl/tcl8.6/tzdata/Asia/Shanghai b/env/tcl/tcl8.6/tzdata/Asia/Shanghai new file mode 100644 index 0000000..66bc433 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Asia/Shanghai @@ -0,0 +1,32 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Asia/Shanghai) { + {-9223372036854775808 29143 0 LMT} + {-2177481943 28800 0 CST} + {-933667200 32400 1 CDT} + {-922093200 28800 0 CST} + {-908870400 32400 1 CDT} + {-888829200 28800 0 CST} + {-881049600 32400 1 CDT} + {-767869200 28800 0 CST} + {-745833600 32400 1 CDT} + {-733827600 28800 0 CST} + {-716889600 32400 1 CDT} + {-699613200 28800 0 CST} + {-683884800 32400 1 CDT} + {-670669200 28800 0 CST} + {-652348800 32400 1 CDT} + {-650016000 28800 0 CST} + {515527200 32400 1 CDT} + {527014800 28800 0 CST} + {545162400 32400 1 CDT} + {558464400 28800 0 CST} + {577216800 32400 1 CDT} + {589914000 28800 0 CST} + {608666400 32400 1 CDT} + {621968400 28800 0 CST} + {640116000 32400 1 CDT} + {653418000 28800 0 CST} + {671565600 32400 1 CDT} + {684867600 28800 0 CST} +} diff --git a/env/tcl/tcl8.6/tzdata/Asia/Singapore b/env/tcl/tcl8.6/tzdata/Asia/Singapore new file mode 100644 index 0000000..f10eb1f --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Asia/Singapore @@ -0,0 +1,13 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Asia/Singapore) { + {-9223372036854775808 24925 0 LMT} + {-2177477725 24925 0 SMT} + {-2038200925 25200 0 +07} + {-1167634800 26400 1 +0720} + {-1073028000 26400 0 +0720} + {-894180000 27000 0 +0730} + {-879665400 32400 0 +09} + {-767005200 27000 0 +0730} + {378664200 28800 0 +08} +} diff --git a/env/tcl/tcl8.6/tzdata/Asia/Srednekolymsk b/env/tcl/tcl8.6/tzdata/Asia/Srednekolymsk new file mode 100644 index 0000000..1099a4b --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Asia/Srednekolymsk @@ -0,0 +1,71 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Asia/Srednekolymsk) { + {-9223372036854775808 36892 0 LMT} + {-1441188892 36000 0 +10} + {-1247565600 39600 0 +12} + {354891600 43200 1 +12} + {370699200 39600 0 +11} + {386427600 43200 1 +12} + {402235200 39600 0 +11} + {417963600 43200 1 +12} + {433771200 39600 0 +11} + {449586000 43200 1 +12} + {465318000 39600 0 +11} + {481042800 43200 1 +12} + {496767600 39600 0 +11} + {512492400 43200 1 +12} + {528217200 39600 0 +11} + {543942000 43200 1 +12} + {559666800 39600 0 +11} + {575391600 43200 1 +12} + {591116400 39600 0 +11} + {606841200 43200 1 +12} + {622566000 39600 0 +11} + {638290800 43200 1 +12} + {654620400 39600 0 +11} + {670345200 36000 0 +11} + {670348800 39600 1 +11} + {686073600 36000 0 +10} + {695750400 39600 0 +12} + {701794800 43200 1 +12} + {717519600 39600 0 +11} + {733244400 43200 1 +12} + {748969200 39600 0 +11} + {764694000 43200 1 +12} + {780418800 39600 0 +11} + {796143600 43200 1 +12} + {811868400 39600 0 +11} + {828198000 43200 1 +12} + {846342000 39600 0 +11} + {859647600 43200 1 +12} + {877791600 39600 0 +11} + {891097200 43200 1 +12} + {909241200 39600 0 +11} + {922546800 43200 1 +12} + {941295600 39600 0 +11} + {953996400 43200 1 +12} + {972745200 39600 0 +11} + {985446000 43200 1 +12} + {1004194800 39600 0 +11} + {1017500400 43200 1 +12} + {1035644400 39600 0 +11} + {1048950000 43200 1 +12} + {1067094000 39600 0 +11} + {1080399600 43200 1 +12} + {1099148400 39600 0 +11} + {1111849200 43200 1 +12} + {1130598000 39600 0 +11} + {1143298800 43200 1 +12} + {1162047600 39600 0 +11} + {1174748400 43200 1 +12} + {1193497200 39600 0 +11} + {1206802800 43200 1 +12} + {1224946800 39600 0 +11} + {1238252400 43200 1 +12} + {1256396400 39600 0 +11} + {1269702000 43200 1 +12} + {1288450800 39600 0 +11} + {1301151600 43200 0 +12} + {1414245600 39600 0 +11} +} diff --git a/env/tcl/tcl8.6/tzdata/Asia/Taipei b/env/tcl/tcl8.6/tzdata/Asia/Taipei new file mode 100644 index 0000000..cb8fb89 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Asia/Taipei @@ -0,0 +1,46 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Asia/Taipei) { + {-9223372036854775808 29160 0 LMT} + {-2335248360 28800 0 CST} + {-1017820800 32400 0 JST} + {-766224000 28800 0 CST} + {-745833600 32400 1 CDT} + {-733827600 28800 0 CST} + {-716889600 32400 1 CDT} + {-699613200 28800 0 CST} + {-683884800 32400 1 CDT} + {-670669200 28800 0 CST} + {-652348800 32400 1 CDT} + {-639133200 28800 0 CST} + {-620812800 32400 1 CDT} + {-607597200 28800 0 CST} + {-589276800 32400 1 CDT} + {-576061200 28800 0 CST} + {-562924800 32400 1 CDT} + {-541760400 28800 0 CST} + {-528710400 32400 1 CDT} + {-510224400 28800 0 CST} + {-497174400 32400 1 CDT} + {-478688400 28800 0 CST} + {-465638400 32400 1 CDT} + {-449830800 28800 0 CST} + {-434016000 32400 1 CDT} + {-418208400 28800 0 CST} + {-402480000 32400 1 CDT} + {-386672400 28800 0 CST} + {-370944000 32400 1 CDT} + {-355136400 28800 0 CST} + {-339408000 32400 1 CDT} + {-323600400 28800 0 CST} + {-302515200 32400 1 CDT} + {-291978000 28800 0 CST} + {-270979200 32400 1 CDT} + {-260442000 28800 0 CST} + {133977600 32400 1 CDT} + {149785200 28800 0 CST} + {165513600 32400 1 CDT} + {181321200 28800 0 CST} + {299606400 32400 1 CDT} + {307551600 28800 0 CST} +} diff --git a/env/tcl/tcl8.6/tzdata/Asia/Tashkent b/env/tcl/tcl8.6/tzdata/Asia/Tashkent new file mode 100644 index 0000000..bd16c91 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Asia/Tashkent @@ -0,0 +1,31 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Asia/Tashkent) { + {-9223372036854775808 16631 0 LMT} + {-1441168631 18000 0 +05} + {-1247547600 21600 0 +06} + {354909600 25200 1 +06} + {370717200 21600 0 +06} + {386445600 25200 1 +06} + {402253200 21600 0 +06} + {417981600 25200 1 +06} + {433789200 21600 0 +06} + {449604000 25200 1 +06} + {465336000 21600 0 +06} + {481060800 25200 1 +06} + {496785600 21600 0 +06} + {512510400 25200 1 +06} + {528235200 21600 0 +06} + {543960000 25200 1 +06} + {559684800 21600 0 +06} + {575409600 25200 1 +06} + {591134400 21600 0 +06} + {606859200 25200 1 +06} + {622584000 21600 0 +06} + {638308800 25200 1 +06} + {654638400 21600 0 +06} + {670363200 18000 0 +05} + {670366800 21600 1 +05} + {686091600 18000 0 +05} + {694206000 18000 0 +05} +} diff --git a/env/tcl/tcl8.6/tzdata/Asia/Tbilisi b/env/tcl/tcl8.6/tzdata/Asia/Tbilisi new file mode 100644 index 0000000..71e7695 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Asia/Tbilisi @@ -0,0 +1,60 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Asia/Tbilisi) { + {-9223372036854775808 10751 0 LMT} + {-2840151551 10751 0 TBMT} + {-1441162751 10800 0 +03} + {-405140400 14400 0 +04} + {354916800 18000 1 +04} + {370724400 14400 0 +04} + {386452800 18000 1 +04} + {402260400 14400 0 +04} + {417988800 18000 1 +04} + {433796400 14400 0 +04} + {449611200 18000 1 +04} + {465343200 14400 0 +04} + {481068000 18000 1 +04} + {496792800 14400 0 +04} + {512517600 18000 1 +04} + {528242400 14400 0 +04} + {543967200 18000 1 +04} + {559692000 14400 0 +04} + {575416800 18000 1 +04} + {591141600 14400 0 +04} + {606866400 18000 1 +04} + {622591200 14400 0 +04} + {638316000 18000 1 +04} + {654645600 14400 0 +04} + {670370400 10800 0 +03} + {670374000 14400 1 +03} + {686098800 10800 0 +03} + {694213200 10800 0 +03} + {701816400 14400 1 +03} + {717537600 10800 0 +03} + {733266000 14400 1 +03} + {748987200 10800 0 +03} + {764715600 14400 1 +03} + {780440400 14400 0 +04} + {796161600 18000 1 +04} + {811882800 14400 0 +04} + {828216000 18000 1 +04} + {846360000 18000 1 +05} + {859662000 18000 0 +04} + {877806000 14400 0 +04} + {891115200 18000 1 +04} + {909255600 14400 0 +04} + {922564800 18000 1 +04} + {941310000 14400 0 +04} + {954014400 18000 1 +04} + {972759600 14400 0 +04} + {985464000 18000 1 +04} + {1004209200 14400 0 +04} + {1017518400 18000 1 +04} + {1035658800 14400 0 +04} + {1048968000 18000 1 +04} + {1067108400 14400 0 +04} + {1080417600 18000 1 +04} + {1088280000 14400 0 +03} + {1099177200 10800 0 +03} + {1111878000 14400 0 +04} +} diff --git a/env/tcl/tcl8.6/tzdata/Asia/Tehran b/env/tcl/tcl8.6/tzdata/Asia/Tehran new file mode 100644 index 0000000..3d44e42 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Asia/Tehran @@ -0,0 +1,229 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Asia/Tehran) { + {-9223372036854775808 12344 0 LMT} + {-1704165944 12344 0 TMT} + {-757394744 12600 0 +0330} + {247177800 14400 0 +04} + {259272000 18000 1 +04} + {277758000 14400 0 +04} + {283982400 12600 0 +0330} + {290809800 16200 1 +0330} + {306531000 12600 0 +0330} + {322432200 16200 1 +0330} + {338499000 12600 0 +0330} + {673216200 16200 1 +0330} + {685481400 12600 0 +0330} + {701209800 16200 1 +0330} + {717103800 12600 0 +0330} + {732745800 16200 1 +0330} + {748639800 12600 0 +0330} + {764281800 16200 1 +0330} + {780175800 12600 0 +0330} + {795817800 16200 1 +0330} + {811711800 12600 0 +0330} + {827353800 16200 1 +0330} + {843247800 12600 0 +0330} + {858976200 16200 1 +0330} + {874870200 12600 0 +0330} + {890512200 16200 1 +0330} + {906406200 12600 0 +0330} + {922048200 16200 1 +0330} + {937942200 12600 0 +0330} + {953584200 16200 1 +0330} + {969478200 12600 0 +0330} + {985206600 16200 1 +0330} + {1001100600 12600 0 +0330} + {1016742600 16200 1 +0330} + {1032636600 12600 0 +0330} + {1048278600 16200 1 +0330} + {1064172600 12600 0 +0330} + {1079814600 16200 1 +0330} + {1095708600 12600 0 +0330} + {1111437000 16200 1 +0330} + {1127331000 12600 0 +0330} + {1206045000 16200 1 +0330} + {1221939000 12600 0 +0330} + {1237667400 16200 1 +0330} + {1253561400 12600 0 +0330} + {1269203400 16200 1 +0330} + {1285097400 12600 0 +0330} + {1300739400 16200 1 +0330} + {1316633400 12600 0 +0330} + {1332275400 16200 1 +0330} + {1348169400 12600 0 +0330} + {1363897800 16200 1 +0330} + {1379791800 12600 0 +0330} + {1395433800 16200 1 +0330} + {1411327800 12600 0 +0330} + {1426969800 16200 1 +0330} + {1442863800 12600 0 +0330} + {1458505800 16200 1 +0330} + {1474399800 12600 0 +0330} + {1490128200 16200 1 +0330} + {1506022200 12600 0 +0330} + {1521664200 16200 1 +0330} + {1537558200 12600 0 +0330} + {1553200200 16200 1 +0330} + {1569094200 12600 0 +0330} + {1584736200 16200 1 +0330} + {1600630200 12600 0 +0330} + {1616358600 16200 1 +0330} + {1632252600 12600 0 +0330} + {1647894600 16200 1 +0330} + {1663788600 12600 0 +0330} + {1679430600 16200 1 +0330} + {1695324600 12600 0 +0330} + {1710966600 16200 1 +0330} + {1726860600 12600 0 +0330} + {1742589000 16200 1 +0330} + {1758483000 12600 0 +0330} + {1774125000 16200 1 +0330} + {1790019000 12600 0 +0330} + {1805661000 16200 1 +0330} + {1821555000 12600 0 +0330} + {1837197000 16200 1 +0330} + {1853091000 12600 0 +0330} + {1868733000 16200 1 +0330} + {1884627000 12600 0 +0330} + {1900355400 16200 1 +0330} + {1916249400 12600 0 +0330} + {1931891400 16200 1 +0330} + {1947785400 12600 0 +0330} + {1963427400 16200 1 +0330} + {1979321400 12600 0 +0330} + {1994963400 16200 1 +0330} + {2010857400 12600 0 +0330} + {2026585800 16200 1 +0330} + {2042479800 12600 0 +0330} + {2058121800 16200 1 +0330} + {2074015800 12600 0 +0330} + {2089657800 16200 1 +0330} + {2105551800 12600 0 +0330} + {2121193800 16200 1 +0330} + {2137087800 12600 0 +0330} + {2152729800 16200 1 +0330} + {2168623800 12600 0 +0330} + {2184265800 16200 1 +0330} + {2200159800 12600 0 +0330} + {2215888200 16200 1 +0330} + {2231782200 12600 0 +0330} + {2247424200 16200 1 +0330} + {2263318200 12600 0 +0330} + {2278960200 16200 1 +0330} + {2294854200 12600 0 +0330} + {2310496200 16200 1 +0330} + {2326390200 12600 0 +0330} + {2342118600 16200 1 +0330} + {2358012600 12600 0 +0330} + {2373654600 16200 1 +0330} + {2389548600 12600 0 +0330} + {2405190600 16200 1 +0330} + {2421084600 12600 0 +0330} + {2436726600 16200 1 +0330} + {2452620600 12600 0 +0330} + {2468349000 16200 1 +0330} + {2484243000 12600 0 +0330} + {2499885000 16200 1 +0330} + {2515779000 12600 0 +0330} + {2531421000 16200 1 +0330} + {2547315000 12600 0 +0330} + {2562957000 16200 1 +0330} + {2578851000 12600 0 +0330} + {2594579400 16200 1 +0330} + {2610473400 12600 0 +0330} + {2626115400 16200 1 +0330} + {2642009400 12600 0 +0330} + {2657651400 16200 1 +0330} + {2673545400 12600 0 +0330} + {2689187400 16200 1 +0330} + {2705081400 12600 0 +0330} + {2720809800 16200 1 +0330} + {2736703800 12600 0 +0330} + {2752345800 16200 1 +0330} + {2768239800 12600 0 +0330} + {2783881800 16200 1 +0330} + {2799775800 12600 0 +0330} + {2815417800 16200 1 +0330} + {2831311800 12600 0 +0330} + {2847040200 16200 1 +0330} + {2862934200 12600 0 +0330} + {2878576200 16200 1 +0330} + {2894470200 12600 0 +0330} + {2910112200 16200 1 +0330} + {2926006200 12600 0 +0330} + {2941648200 16200 1 +0330} + {2957542200 12600 0 +0330} + {2973270600 16200 1 +0330} + {2989164600 12600 0 +0330} + {3004806600 16200 1 +0330} + {3020700600 12600 0 +0330} + {3036342600 16200 1 +0330} + {3052236600 12600 0 +0330} + {3067878600 16200 1 +0330} + {3083772600 12600 0 +0330} + {3099501000 16200 1 +0330} + {3115395000 12600 0 +0330} + {3131037000 16200 1 +0330} + {3146931000 12600 0 +0330} + {3162573000 16200 1 +0330} + {3178467000 12600 0 +0330} + {3194109000 16200 1 +0330} + {3210003000 12600 0 +0330} + {3225731400 16200 1 +0330} + {3241625400 12600 0 +0330} + {3257267400 16200 1 +0330} + {3273161400 12600 0 +0330} + {3288803400 16200 1 +0330} + {3304697400 12600 0 +0330} + {3320339400 16200 1 +0330} + {3336233400 12600 0 +0330} + {3351961800 16200 1 +0330} + {3367855800 12600 0 +0330} + {3383497800 16200 1 +0330} + {3399391800 12600 0 +0330} + {3415033800 16200 1 +0330} + {3430927800 12600 0 +0330} + {3446569800 16200 1 +0330} + {3462463800 12600 0 +0330} + {3478192200 16200 1 +0330} + {3494086200 12600 0 +0330} + {3509728200 16200 1 +0330} + {3525622200 12600 0 +0330} + {3541264200 16200 1 +0330} + {3557158200 12600 0 +0330} + {3572800200 16200 1 +0330} + {3588694200 12600 0 +0330} + {3604422600 16200 1 +0330} + {3620316600 12600 0 +0330} + {3635958600 16200 1 +0330} + {3651852600 12600 0 +0330} + {3667494600 16200 1 +0330} + {3683388600 12600 0 +0330} + {3699030600 16200 1 +0330} + {3714924600 12600 0 +0330} + {3730653000 16200 1 +0330} + {3746547000 12600 0 +0330} + {3762189000 16200 1 +0330} + {3778083000 12600 0 +0330} + {3793725000 16200 1 +0330} + {3809619000 12600 0 +0330} + {3825261000 16200 1 +0330} + {3841155000 12600 0 +0330} + {3856883400 16200 1 +0330} + {3872777400 12600 0 +0330} + {3888419400 16200 1 +0330} + {3904313400 12600 0 +0330} + {3919955400 16200 1 +0330} + {3935849400 12600 0 +0330} + {3951491400 16200 1 +0330} + {3967385400 12600 0 +0330} + {3983113800 16200 1 +0330} + {3999007800 12600 0 +0330} + {4014649800 16200 1 +0330} + {4030543800 12600 0 +0330} + {4046185800 16200 1 +0330} + {4062079800 12600 0 +0330} + {4077721800 16200 1 +0330} + {4093615800 12600 0 +0330} +} diff --git a/env/tcl/tcl8.6/tzdata/Asia/Tel_Aviv b/env/tcl/tcl8.6/tzdata/Asia/Tel_Aviv new file mode 100644 index 0000000..3e7278d --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Asia/Tel_Aviv @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(Asia/Jerusalem)]} { + LoadTimeZoneFile Asia/Jerusalem +} +set TZData(:Asia/Tel_Aviv) $TZData(:Asia/Jerusalem) diff --git a/env/tcl/tcl8.6/tzdata/Asia/Thimbu b/env/tcl/tcl8.6/tzdata/Asia/Thimbu new file mode 100644 index 0000000..94b0846 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Asia/Thimbu @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(Asia/Thimphu)]} { + LoadTimeZoneFile Asia/Thimphu +} +set TZData(:Asia/Thimbu) $TZData(:Asia/Thimphu) diff --git a/env/tcl/tcl8.6/tzdata/Asia/Thimphu b/env/tcl/tcl8.6/tzdata/Asia/Thimphu new file mode 100644 index 0000000..55c3d7f --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Asia/Thimphu @@ -0,0 +1,7 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Asia/Thimphu) { + {-9223372036854775808 21516 0 LMT} + {-706341516 19800 0 +0530} + {560025000 21600 0 +06} +} diff --git a/env/tcl/tcl8.6/tzdata/Asia/Tokyo b/env/tcl/tcl8.6/tzdata/Asia/Tokyo new file mode 100644 index 0000000..cc7a857 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Asia/Tokyo @@ -0,0 +1,14 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Asia/Tokyo) { + {-9223372036854775808 33539 0 LMT} + {-2587712400 32400 0 JST} + {-683802000 36000 1 JDT} + {-672310800 32400 0 JST} + {-654771600 36000 1 JDT} + {-640861200 32400 0 JST} + {-620298000 36000 1 JDT} + {-609411600 32400 0 JST} + {-588848400 36000 1 JDT} + {-577962000 32400 0 JST} +} diff --git a/env/tcl/tcl8.6/tzdata/Asia/Tomsk b/env/tcl/tcl8.6/tzdata/Asia/Tomsk new file mode 100644 index 0000000..0694d01 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Asia/Tomsk @@ -0,0 +1,73 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Asia/Tomsk) { + {-9223372036854775808 20391 0 LMT} + {-1578807591 21600 0 +06} + {-1247551200 25200 0 +08} + {354906000 28800 1 +08} + {370713600 25200 0 +07} + {386442000 28800 1 +08} + {402249600 25200 0 +07} + {417978000 28800 1 +08} + {433785600 25200 0 +07} + {449600400 28800 1 +08} + {465332400 25200 0 +07} + {481057200 28800 1 +08} + {496782000 25200 0 +07} + {512506800 28800 1 +08} + {528231600 25200 0 +07} + {543956400 28800 1 +08} + {559681200 25200 0 +07} + {575406000 28800 1 +08} + {591130800 25200 0 +07} + {606855600 28800 1 +08} + {622580400 25200 0 +07} + {638305200 28800 1 +08} + {654634800 25200 0 +07} + {670359600 21600 0 +07} + {670363200 25200 1 +07} + {686088000 21600 0 +06} + {695764800 25200 0 +08} + {701809200 28800 1 +08} + {717534000 25200 0 +07} + {733258800 28800 1 +08} + {748983600 25200 0 +07} + {764708400 28800 1 +08} + {780433200 25200 0 +07} + {796158000 28800 1 +08} + {811882800 25200 0 +07} + {828212400 28800 1 +08} + {846356400 25200 0 +07} + {859662000 28800 1 +08} + {877806000 25200 0 +07} + {891111600 28800 1 +08} + {909255600 25200 0 +07} + {922561200 28800 1 +08} + {941310000 25200 0 +07} + {954010800 28800 1 +08} + {972759600 25200 0 +07} + {985460400 28800 1 +08} + {1004209200 25200 0 +07} + {1017514800 28800 1 +08} + {1020196800 25200 0 +07} + {1035662400 21600 0 +06} + {1048968000 25200 1 +07} + {1067112000 21600 0 +06} + {1080417600 25200 1 +07} + {1099166400 21600 0 +06} + {1111867200 25200 1 +07} + {1130616000 21600 0 +06} + {1143316800 25200 1 +07} + {1162065600 21600 0 +06} + {1174766400 25200 1 +07} + {1193515200 21600 0 +06} + {1206820800 25200 1 +07} + {1224964800 21600 0 +06} + {1238270400 25200 1 +07} + {1256414400 21600 0 +06} + {1269720000 25200 1 +07} + {1288468800 21600 0 +06} + {1301169600 25200 0 +07} + {1414263600 21600 0 +06} + {1464465600 25200 0 +07} +} diff --git a/env/tcl/tcl8.6/tzdata/Asia/Ujung_Pandang b/env/tcl/tcl8.6/tzdata/Asia/Ujung_Pandang new file mode 100644 index 0000000..abe142e --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Asia/Ujung_Pandang @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(Asia/Makassar)]} { + LoadTimeZoneFile Asia/Makassar +} +set TZData(:Asia/Ujung_Pandang) $TZData(:Asia/Makassar) diff --git a/env/tcl/tcl8.6/tzdata/Asia/Ulaanbaatar b/env/tcl/tcl8.6/tzdata/Asia/Ulaanbaatar new file mode 100644 index 0000000..3a33ef9 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Asia/Ulaanbaatar @@ -0,0 +1,55 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Asia/Ulaanbaatar) { + {-9223372036854775808 25652 0 LMT} + {-2032931252 25200 0 +07} + {252435600 28800 0 +08} + {417974400 32400 1 +08} + {433782000 28800 0 +08} + {449596800 32400 1 +08} + {465318000 28800 0 +08} + {481046400 32400 1 +08} + {496767600 28800 0 +08} + {512496000 32400 1 +08} + {528217200 28800 0 +08} + {543945600 32400 1 +08} + {559666800 28800 0 +08} + {575395200 32400 1 +08} + {591116400 28800 0 +08} + {606844800 32400 1 +08} + {622566000 28800 0 +08} + {638294400 32400 1 +08} + {654620400 28800 0 +08} + {670348800 32400 1 +08} + {686070000 28800 0 +08} + {701798400 32400 1 +08} + {717519600 28800 0 +08} + {733248000 32400 1 +08} + {748969200 28800 0 +08} + {764697600 32400 1 +08} + {780418800 28800 0 +08} + {796147200 32400 1 +08} + {811868400 28800 0 +08} + {828201600 32400 1 +08} + {843922800 28800 0 +08} + {859651200 32400 1 +08} + {875372400 28800 0 +08} + {891100800 32400 1 +08} + {906822000 28800 0 +08} + {988394400 32400 1 +08} + {1001696400 28800 0 +08} + {1017424800 32400 1 +08} + {1033146000 28800 0 +08} + {1048874400 32400 1 +08} + {1064595600 28800 0 +08} + {1080324000 32400 1 +08} + {1096045200 28800 0 +08} + {1111773600 32400 1 +08} + {1127494800 28800 0 +08} + {1143223200 32400 1 +08} + {1159549200 28800 0 +08} + {1427479200 32400 1 +08} + {1443193200 28800 0 +08} + {1458928800 32400 1 +08} + {1474642800 28800 0 +08} +} diff --git a/env/tcl/tcl8.6/tzdata/Asia/Ulan_Bator b/env/tcl/tcl8.6/tzdata/Asia/Ulan_Bator new file mode 100644 index 0000000..3215ee7 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Asia/Ulan_Bator @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(Asia/Ulaanbaatar)]} { + LoadTimeZoneFile Asia/Ulaanbaatar +} +set TZData(:Asia/Ulan_Bator) $TZData(:Asia/Ulaanbaatar) diff --git a/env/tcl/tcl8.6/tzdata/Asia/Urumqi b/env/tcl/tcl8.6/tzdata/Asia/Urumqi new file mode 100644 index 0000000..194e090 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Asia/Urumqi @@ -0,0 +1,6 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Asia/Urumqi) { + {-9223372036854775808 21020 0 LMT} + {-1325483420 21600 0 +06} +} diff --git a/env/tcl/tcl8.6/tzdata/Asia/Ust-Nera b/env/tcl/tcl8.6/tzdata/Asia/Ust-Nera new file mode 100644 index 0000000..021fa62 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Asia/Ust-Nera @@ -0,0 +1,71 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Asia/Ust-Nera) { + {-9223372036854775808 34374 0 LMT} + {-1579426374 28800 0 +08} + {354898800 43200 0 +12} + {370699200 39600 0 +11} + {386427600 43200 1 +12} + {402235200 39600 0 +11} + {417963600 43200 1 +12} + {433771200 39600 0 +11} + {449586000 43200 1 +12} + {465318000 39600 0 +11} + {481042800 43200 1 +12} + {496767600 39600 0 +11} + {512492400 43200 1 +12} + {528217200 39600 0 +11} + {543942000 43200 1 +12} + {559666800 39600 0 +11} + {575391600 43200 1 +12} + {591116400 39600 0 +11} + {606841200 43200 1 +12} + {622566000 39600 0 +11} + {638290800 43200 1 +12} + {654620400 39600 0 +11} + {670345200 36000 0 +11} + {670348800 39600 1 +11} + {686073600 36000 0 +10} + {695750400 39600 0 +12} + {701794800 43200 1 +12} + {717519600 39600 0 +11} + {733244400 43200 1 +12} + {748969200 39600 0 +11} + {764694000 43200 1 +12} + {780418800 39600 0 +11} + {796143600 43200 1 +12} + {811868400 39600 0 +11} + {828198000 43200 1 +12} + {846342000 39600 0 +11} + {859647600 43200 1 +12} + {877791600 39600 0 +11} + {891097200 43200 1 +12} + {909241200 39600 0 +11} + {922546800 43200 1 +12} + {941295600 39600 0 +11} + {953996400 43200 1 +12} + {972745200 39600 0 +11} + {985446000 43200 1 +12} + {1004194800 39600 0 +11} + {1017500400 43200 1 +12} + {1035644400 39600 0 +11} + {1048950000 43200 1 +12} + {1067094000 39600 0 +11} + {1080399600 43200 1 +12} + {1099148400 39600 0 +11} + {1111849200 43200 1 +12} + {1130598000 39600 0 +11} + {1143298800 43200 1 +12} + {1162047600 39600 0 +11} + {1174748400 43200 1 +12} + {1193497200 39600 0 +11} + {1206802800 43200 1 +12} + {1224946800 39600 0 +11} + {1238252400 43200 1 +12} + {1256396400 39600 0 +11} + {1269702000 43200 1 +12} + {1288450800 39600 0 +11} + {1301151600 43200 0 +12} + {1315828800 39600 0 +11} + {1414249200 36000 0 +10} +} diff --git a/env/tcl/tcl8.6/tzdata/Asia/Vientiane b/env/tcl/tcl8.6/tzdata/Asia/Vientiane new file mode 100644 index 0000000..27b20ce --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Asia/Vientiane @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(Asia/Bangkok)]} { + LoadTimeZoneFile Asia/Bangkok +} +set TZData(:Asia/Vientiane) $TZData(:Asia/Bangkok) diff --git a/env/tcl/tcl8.6/tzdata/Asia/Vladivostok b/env/tcl/tcl8.6/tzdata/Asia/Vladivostok new file mode 100644 index 0000000..e8f651c --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Asia/Vladivostok @@ -0,0 +1,71 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Asia/Vladivostok) { + {-9223372036854775808 31651 0 LMT} + {-1487321251 32400 0 +09} + {-1247562000 36000 0 +11} + {354895200 39600 1 +11} + {370702800 36000 0 +10} + {386431200 39600 1 +11} + {402238800 36000 0 +10} + {417967200 39600 1 +11} + {433774800 36000 0 +10} + {449589600 39600 1 +11} + {465321600 36000 0 +10} + {481046400 39600 1 +11} + {496771200 36000 0 +10} + {512496000 39600 1 +11} + {528220800 36000 0 +10} + {543945600 39600 1 +11} + {559670400 36000 0 +10} + {575395200 39600 1 +11} + {591120000 36000 0 +10} + {606844800 39600 1 +11} + {622569600 36000 0 +10} + {638294400 39600 1 +11} + {654624000 36000 0 +10} + {670348800 32400 0 +10} + {670352400 36000 1 +10} + {686077200 32400 0 +09} + {695754000 36000 0 +11} + {701798400 39600 1 +11} + {717523200 36000 0 +10} + {733248000 39600 1 +11} + {748972800 36000 0 +10} + {764697600 39600 1 +11} + {780422400 36000 0 +10} + {796147200 39600 1 +11} + {811872000 36000 0 +10} + {828201600 39600 1 +11} + {846345600 36000 0 +10} + {859651200 39600 1 +11} + {877795200 36000 0 +10} + {891100800 39600 1 +11} + {909244800 36000 0 +10} + {922550400 39600 1 +11} + {941299200 36000 0 +10} + {954000000 39600 1 +11} + {972748800 36000 0 +10} + {985449600 39600 1 +11} + {1004198400 36000 0 +10} + {1017504000 39600 1 +11} + {1035648000 36000 0 +10} + {1048953600 39600 1 +11} + {1067097600 36000 0 +10} + {1080403200 39600 1 +11} + {1099152000 36000 0 +10} + {1111852800 39600 1 +11} + {1130601600 36000 0 +10} + {1143302400 39600 1 +11} + {1162051200 36000 0 +10} + {1174752000 39600 1 +11} + {1193500800 36000 0 +10} + {1206806400 39600 1 +11} + {1224950400 36000 0 +10} + {1238256000 39600 1 +11} + {1256400000 36000 0 +10} + {1269705600 39600 1 +11} + {1288454400 36000 0 +10} + {1301155200 39600 0 +11} + {1414249200 36000 0 +10} +} diff --git a/env/tcl/tcl8.6/tzdata/Asia/Yakutsk b/env/tcl/tcl8.6/tzdata/Asia/Yakutsk new file mode 100644 index 0000000..8ee153a --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Asia/Yakutsk @@ -0,0 +1,71 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Asia/Yakutsk) { + {-9223372036854775808 31138 0 LMT} + {-1579423138 28800 0 +08} + {-1247558400 32400 0 +10} + {354898800 36000 1 +10} + {370706400 32400 0 +09} + {386434800 36000 1 +10} + {402242400 32400 0 +09} + {417970800 36000 1 +10} + {433778400 32400 0 +09} + {449593200 36000 1 +10} + {465325200 32400 0 +09} + {481050000 36000 1 +10} + {496774800 32400 0 +09} + {512499600 36000 1 +10} + {528224400 32400 0 +09} + {543949200 36000 1 +10} + {559674000 32400 0 +09} + {575398800 36000 1 +10} + {591123600 32400 0 +09} + {606848400 36000 1 +10} + {622573200 32400 0 +09} + {638298000 36000 1 +10} + {654627600 32400 0 +09} + {670352400 28800 0 +09} + {670356000 32400 1 +09} + {686080800 28800 0 +08} + {695757600 32400 0 +10} + {701802000 36000 1 +10} + {717526800 32400 0 +09} + {733251600 36000 1 +10} + {748976400 32400 0 +09} + {764701200 36000 1 +10} + {780426000 32400 0 +09} + {796150800 36000 1 +10} + {811875600 32400 0 +09} + {828205200 36000 1 +10} + {846349200 32400 0 +09} + {859654800 36000 1 +10} + {877798800 32400 0 +09} + {891104400 36000 1 +10} + {909248400 32400 0 +09} + {922554000 36000 1 +10} + {941302800 32400 0 +09} + {954003600 36000 1 +10} + {972752400 32400 0 +09} + {985453200 36000 1 +10} + {1004202000 32400 0 +09} + {1017507600 36000 1 +10} + {1035651600 32400 0 +09} + {1048957200 36000 1 +10} + {1067101200 32400 0 +09} + {1080406800 36000 1 +10} + {1099155600 32400 0 +09} + {1111856400 36000 1 +10} + {1130605200 32400 0 +09} + {1143306000 36000 1 +10} + {1162054800 32400 0 +09} + {1174755600 36000 1 +10} + {1193504400 32400 0 +09} + {1206810000 36000 1 +10} + {1224954000 32400 0 +09} + {1238259600 36000 1 +10} + {1256403600 32400 0 +09} + {1269709200 36000 1 +10} + {1288458000 32400 0 +09} + {1301158800 36000 0 +10} + {1414252800 32400 0 +09} +} diff --git a/env/tcl/tcl8.6/tzdata/Asia/Yangon b/env/tcl/tcl8.6/tzdata/Asia/Yangon new file mode 100644 index 0000000..82870c6 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Asia/Yangon @@ -0,0 +1,9 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Asia/Yangon) { + {-9223372036854775808 23087 0 LMT} + {-2840163887 23087 0 RMT} + {-1577946287 23400 0 +0630} + {-873268200 32400 0 +09} + {-778410000 23400 0 +0630} +} diff --git a/env/tcl/tcl8.6/tzdata/Asia/Yekaterinburg b/env/tcl/tcl8.6/tzdata/Asia/Yekaterinburg new file mode 100644 index 0000000..d2133b1 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Asia/Yekaterinburg @@ -0,0 +1,72 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Asia/Yekaterinburg) { + {-9223372036854775808 14553 0 LMT} + {-1688270553 13505 0 PMT} + {-1592610305 14400 0 +04} + {-1247544000 18000 0 +06} + {354913200 21600 1 +06} + {370720800 18000 0 +05} + {386449200 21600 1 +06} + {402256800 18000 0 +05} + {417985200 21600 1 +06} + {433792800 18000 0 +05} + {449607600 21600 1 +06} + {465339600 18000 0 +05} + {481064400 21600 1 +06} + {496789200 18000 0 +05} + {512514000 21600 1 +06} + {528238800 18000 0 +05} + {543963600 21600 1 +06} + {559688400 18000 0 +05} + {575413200 21600 1 +06} + {591138000 18000 0 +05} + {606862800 21600 1 +06} + {622587600 18000 0 +05} + {638312400 21600 1 +06} + {654642000 18000 0 +05} + {670366800 14400 0 +05} + {670370400 18000 1 +05} + {686095200 14400 0 +04} + {695772000 18000 0 +06} + {701816400 21600 1 +06} + {717541200 18000 0 +05} + {733266000 21600 1 +06} + {748990800 18000 0 +05} + {764715600 21600 1 +06} + {780440400 18000 0 +05} + {796165200 21600 1 +06} + {811890000 18000 0 +05} + {828219600 21600 1 +06} + {846363600 18000 0 +05} + {859669200 21600 1 +06} + {877813200 18000 0 +05} + {891118800 21600 1 +06} + {909262800 18000 0 +05} + {922568400 21600 1 +06} + {941317200 18000 0 +05} + {954018000 21600 1 +06} + {972766800 18000 0 +05} + {985467600 21600 1 +06} + {1004216400 18000 0 +05} + {1017522000 21600 1 +06} + {1035666000 18000 0 +05} + {1048971600 21600 1 +06} + {1067115600 18000 0 +05} + {1080421200 21600 1 +06} + {1099170000 18000 0 +05} + {1111870800 21600 1 +06} + {1130619600 18000 0 +05} + {1143320400 21600 1 +06} + {1162069200 18000 0 +05} + {1174770000 21600 1 +06} + {1193518800 18000 0 +05} + {1206824400 21600 1 +06} + {1224968400 18000 0 +05} + {1238274000 21600 1 +06} + {1256418000 18000 0 +05} + {1269723600 21600 1 +06} + {1288472400 18000 0 +05} + {1301173200 21600 0 +06} + {1414267200 18000 0 +05} +} diff --git a/env/tcl/tcl8.6/tzdata/Asia/Yerevan b/env/tcl/tcl8.6/tzdata/Asia/Yerevan new file mode 100644 index 0000000..463bed0 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Asia/Yerevan @@ -0,0 +1,70 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Asia/Yerevan) { + {-9223372036854775808 10680 0 LMT} + {-1441162680 10800 0 +03} + {-405140400 14400 0 +04} + {354916800 18000 1 +04} + {370724400 14400 0 +04} + {386452800 18000 1 +04} + {402260400 14400 0 +04} + {417988800 18000 1 +04} + {433796400 14400 0 +04} + {449611200 18000 1 +04} + {465343200 14400 0 +04} + {481068000 18000 1 +04} + {496792800 14400 0 +04} + {512517600 18000 1 +04} + {528242400 14400 0 +04} + {543967200 18000 1 +04} + {559692000 14400 0 +04} + {575416800 18000 1 +04} + {591141600 14400 0 +04} + {606866400 18000 1 +04} + {622591200 14400 0 +04} + {638316000 18000 1 +04} + {654645600 14400 0 +04} + {670370400 10800 0 +03} + {670374000 14400 1 +03} + {686098800 10800 0 +03} + {701823600 14400 1 +03} + {717548400 10800 0 +03} + {733273200 14400 1 +03} + {748998000 10800 0 +03} + {764722800 14400 1 +03} + {780447600 10800 0 +03} + {796172400 14400 1 +03} + {811897200 14400 0 +04} + {852062400 14400 0 +04} + {859672800 18000 1 +04} + {877816800 14400 0 +04} + {891122400 18000 1 +04} + {909266400 14400 0 +04} + {922572000 18000 1 +04} + {941320800 14400 0 +04} + {954021600 18000 1 +04} + {972770400 14400 0 +04} + {985471200 18000 1 +04} + {1004220000 14400 0 +04} + {1017525600 18000 1 +04} + {1035669600 14400 0 +04} + {1048975200 18000 1 +04} + {1067119200 14400 0 +04} + {1080424800 18000 1 +04} + {1099173600 14400 0 +04} + {1111874400 18000 1 +04} + {1130623200 14400 0 +04} + {1143324000 18000 1 +04} + {1162072800 14400 0 +04} + {1174773600 18000 1 +04} + {1193522400 14400 0 +04} + {1206828000 18000 1 +04} + {1224972000 14400 0 +04} + {1238277600 18000 1 +04} + {1256421600 14400 0 +04} + {1269727200 18000 1 +04} + {1288476000 14400 0 +04} + {1293825600 14400 0 +04} + {1301176800 18000 1 +04} + {1319925600 14400 0 +04} +} diff --git a/env/tcl/tcl8.6/tzdata/Atlantic/Azores b/env/tcl/tcl8.6/tzdata/Atlantic/Azores new file mode 100644 index 0000000..088dd9a --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Atlantic/Azores @@ -0,0 +1,345 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Atlantic/Azores) { + {-9223372036854775808 -6160 0 LMT} + {-2713904240 -6872 0 HMT} + {-1830376800 -7200 0 -02} + {-1689548400 -3600 1 -01} + {-1677794400 -7200 0 -02} + {-1667430000 -3600 1 -01} + {-1647730800 -7200 0 -02} + {-1635807600 -3600 1 -01} + {-1616194800 -7200 0 -02} + {-1604358000 -3600 1 -01} + {-1584658800 -7200 0 -02} + {-1572735600 -3600 1 -01} + {-1553036400 -7200 0 -02} + {-1541199600 -3600 1 -01} + {-1521500400 -7200 0 -02} + {-1442444400 -3600 1 -01} + {-1426806000 -7200 0 -02} + {-1379286000 -3600 1 -01} + {-1364770800 -7200 0 -02} + {-1348441200 -3600 1 -01} + {-1333321200 -7200 0 -02} + {-1316386800 -3600 1 -01} + {-1301266800 -7200 0 -02} + {-1284332400 -3600 1 -01} + {-1269817200 -7200 0 -02} + {-1221433200 -3600 1 -01} + {-1206918000 -7200 0 -02} + {-1191193200 -3600 1 -01} + {-1175468400 -7200 0 -02} + {-1127689200 -3600 1 -01} + {-1111964400 -7200 0 -02} + {-1096844400 -3600 1 -01} + {-1080514800 -7200 0 -02} + {-1063580400 -3600 1 -01} + {-1049065200 -7200 0 -02} + {-1033340400 -3600 1 -01} + {-1017615600 -7200 0 -02} + {-1002495600 -3600 1 -01} + {-986166000 -7200 0 -02} + {-969231600 -3600 1 -01} + {-950482800 -7200 0 -02} + {-942015600 -3600 1 -01} + {-922662000 -7200 0 -02} + {-906937200 -3600 1 -01} + {-891126000 -7200 0 -02} + {-877302000 -3600 1 -01} + {-864000000 -3600 0 -01} + {-857948400 -7200 0 -02} + {-845852400 -3600 1 -01} + {-831340800 -3600 0 -01} + {-825894000 -7200 0 -02} + {-814402800 -3600 1 -01} + {-799891200 -3600 0 -01} + {-794444400 -7200 0 -02} + {-782953200 -3600 1 -01} + {-768441600 -3600 0 -01} + {-762994800 -7200 0 -02} + {-749084400 -3600 1 -01} + {-733359600 -7200 0 -02} + {-717624000 -3600 1 -01} + {-701899200 -7200 0 -02} + {-686174400 -3600 1 -01} + {-670449600 -7200 0 -02} + {-654724800 -3600 1 -01} + {-639000000 -7200 0 -02} + {-591825600 -3600 1 -01} + {-575496000 -7200 0 -02} + {-559771200 -3600 1 -01} + {-544046400 -7200 0 -02} + {-528321600 -3600 1 -01} + {-512596800 -7200 0 -02} + {-496872000 -3600 1 -01} + {-481147200 -7200 0 -02} + {-465422400 -3600 1 -01} + {-449697600 -7200 0 -02} + {-433972800 -3600 1 -01} + {-417643200 -7200 0 -02} + {-401918400 -3600 1 -01} + {-386193600 -7200 0 -02} + {-370468800 -3600 1 -01} + {-354744000 -7200 0 -02} + {-339019200 -3600 1 -01} + {-323294400 -7200 0 -02} + {-307569600 -3600 1 -01} + {-291844800 -7200 0 -02} + {-276120000 -3600 1 -01} + {-260395200 -7200 0 -02} + {-244670400 -3600 1 -01} + {-228340800 -7200 0 -02} + {-212616000 -3600 1 -01} + {-196891200 -7200 0 -02} + {-181166400 -3600 1 -01} + {-165441600 -7200 0 -02} + {-149716800 -3600 1 -01} + {-133992000 -7200 0 -02} + {-118267200 -3600 0 -01} + {228272400 0 1 +00} + {243997200 -3600 0 -01} + {260326800 0 1 +00} + {276051600 -3600 0 -01} + {291776400 0 1 +00} + {307504800 -3600 0 -01} + {323226000 0 1 +00} + {338954400 -3600 0 -01} + {354679200 0 1 +00} + {370404000 -3600 0 -01} + {386128800 0 1 +00} + {401853600 -3600 0 -01} + {417582000 0 1 +00} + {433303200 -3600 0 -01} + {449028000 0 1 +00} + {465357600 -3600 0 -01} + {481082400 0 1 +00} + {496807200 -3600 0 -01} + {512532000 0 1 +00} + {528256800 -3600 0 -01} + {543981600 0 1 +00} + {559706400 -3600 0 -01} + {575431200 0 1 +00} + {591156000 -3600 0 -01} + {606880800 0 1 +00} + {622605600 -3600 0 -01} + {638330400 0 1 +00} + {654660000 -3600 0 -01} + {670384800 0 1 +00} + {686109600 -3600 0 -01} + {701834400 0 1 +00} + {733280400 0 0 +00} + {749005200 -3600 0 -01} + {764730000 0 1 +00} + {780454800 -3600 0 -01} + {796179600 0 1 +00} + {811904400 -3600 0 -01} + {828234000 0 1 +00} + {846378000 -3600 0 -01} + {859683600 0 1 +00} + {877827600 -3600 0 -01} + {891133200 0 1 +00} + {909277200 -3600 0 -01} + {922582800 0 1 +00} + {941331600 -3600 0 -01} + {954032400 0 1 +00} + {972781200 -3600 0 -01} + {985482000 0 1 +00} + {1004230800 -3600 0 -01} + {1017536400 0 1 +00} + {1035680400 -3600 0 -01} + {1048986000 0 1 +00} + {1067130000 -3600 0 -01} + {1080435600 0 1 +00} + {1099184400 -3600 0 -01} + {1111885200 0 1 +00} + {1130634000 -3600 0 -01} + {1143334800 0 1 +00} + {1162083600 -3600 0 -01} + {1174784400 0 1 +00} + {1193533200 -3600 0 -01} + {1206838800 0 1 +00} + {1224982800 -3600 0 -01} + {1238288400 0 1 +00} + {1256432400 -3600 0 -01} + {1269738000 0 1 +00} + {1288486800 -3600 0 -01} + {1301187600 0 1 +00} + {1319936400 -3600 0 -01} + {1332637200 0 1 +00} + {1351386000 -3600 0 -01} + {1364691600 0 1 +00} + {1382835600 -3600 0 -01} + {1396141200 0 1 +00} + {1414285200 -3600 0 -01} + {1427590800 0 1 +00} + {1445734800 -3600 0 -01} + {1459040400 0 1 +00} + {1477789200 -3600 0 -01} + {1490490000 0 1 +00} + {1509238800 -3600 0 -01} + {1521939600 0 1 +00} + {1540688400 -3600 0 -01} + {1553994000 0 1 +00} + {1572138000 -3600 0 -01} + {1585443600 0 1 +00} + {1603587600 -3600 0 -01} + {1616893200 0 1 +00} + {1635642000 -3600 0 -01} + {1648342800 0 1 +00} + {1667091600 -3600 0 -01} + {1679792400 0 1 +00} + {1698541200 -3600 0 -01} + {1711846800 0 1 +00} + {1729990800 -3600 0 -01} + {1743296400 0 1 +00} + {1761440400 -3600 0 -01} + {1774746000 0 1 +00} + {1792890000 -3600 0 -01} + {1806195600 0 1 +00} + {1824944400 -3600 0 -01} + {1837645200 0 1 +00} + {1856394000 -3600 0 -01} + {1869094800 0 1 +00} + {1887843600 -3600 0 -01} + {1901149200 0 1 +00} + {1919293200 -3600 0 -01} + {1932598800 0 1 +00} + {1950742800 -3600 0 -01} + {1964048400 0 1 +00} + {1982797200 -3600 0 -01} + {1995498000 0 1 +00} + {2014246800 -3600 0 -01} + {2026947600 0 1 +00} + {2045696400 -3600 0 -01} + {2058397200 0 1 +00} + {2077146000 -3600 0 -01} + {2090451600 0 1 +00} + {2108595600 -3600 0 -01} + {2121901200 0 1 +00} + {2140045200 -3600 0 -01} + {2153350800 0 1 +00} + {2172099600 -3600 0 -01} + {2184800400 0 1 +00} + {2203549200 -3600 0 -01} + {2216250000 0 1 +00} + {2234998800 -3600 0 -01} + {2248304400 0 1 +00} + {2266448400 -3600 0 -01} + {2279754000 0 1 +00} + {2297898000 -3600 0 -01} + {2311203600 0 1 +00} + {2329347600 -3600 0 -01} + {2342653200 0 1 +00} + {2361402000 -3600 0 -01} + {2374102800 0 1 +00} + {2392851600 -3600 0 -01} + {2405552400 0 1 +00} + {2424301200 -3600 0 -01} + {2437606800 0 1 +00} + {2455750800 -3600 0 -01} + {2469056400 0 1 +00} + {2487200400 -3600 0 -01} + {2500506000 0 1 +00} + {2519254800 -3600 0 -01} + {2531955600 0 1 +00} + {2550704400 -3600 0 -01} + {2563405200 0 1 +00} + {2582154000 -3600 0 -01} + {2595459600 0 1 +00} + {2613603600 -3600 0 -01} + {2626909200 0 1 +00} + {2645053200 -3600 0 -01} + {2658358800 0 1 +00} + {2676502800 -3600 0 -01} + {2689808400 0 1 +00} + {2708557200 -3600 0 -01} + {2721258000 0 1 +00} + {2740006800 -3600 0 -01} + {2752707600 0 1 +00} + {2771456400 -3600 0 -01} + {2784762000 0 1 +00} + {2802906000 -3600 0 -01} + {2816211600 0 1 +00} + {2834355600 -3600 0 -01} + {2847661200 0 1 +00} + {2866410000 -3600 0 -01} + {2879110800 0 1 +00} + {2897859600 -3600 0 -01} + {2910560400 0 1 +00} + {2929309200 -3600 0 -01} + {2942010000 0 1 +00} + {2960758800 -3600 0 -01} + {2974064400 0 1 +00} + {2992208400 -3600 0 -01} + {3005514000 0 1 +00} + {3023658000 -3600 0 -01} + {3036963600 0 1 +00} + {3055712400 -3600 0 -01} + {3068413200 0 1 +00} + {3087162000 -3600 0 -01} + {3099862800 0 1 +00} + {3118611600 -3600 0 -01} + {3131917200 0 1 +00} + {3150061200 -3600 0 -01} + {3163366800 0 1 +00} + {3181510800 -3600 0 -01} + {3194816400 0 1 +00} + {3212960400 -3600 0 -01} + {3226266000 0 1 +00} + {3245014800 -3600 0 -01} + {3257715600 0 1 +00} + {3276464400 -3600 0 -01} + {3289165200 0 1 +00} + {3307914000 -3600 0 -01} + {3321219600 0 1 +00} + {3339363600 -3600 0 -01} + {3352669200 0 1 +00} + {3370813200 -3600 0 -01} + {3384118800 0 1 +00} + {3402867600 -3600 0 -01} + {3415568400 0 1 +00} + {3434317200 -3600 0 -01} + {3447018000 0 1 +00} + {3465766800 -3600 0 -01} + {3479072400 0 1 +00} + {3497216400 -3600 0 -01} + {3510522000 0 1 +00} + {3528666000 -3600 0 -01} + {3541971600 0 1 +00} + {3560115600 -3600 0 -01} + {3573421200 0 1 +00} + {3592170000 -3600 0 -01} + {3604870800 0 1 +00} + {3623619600 -3600 0 -01} + {3636320400 0 1 +00} + {3655069200 -3600 0 -01} + {3668374800 0 1 +00} + {3686518800 -3600 0 -01} + {3699824400 0 1 +00} + {3717968400 -3600 0 -01} + {3731274000 0 1 +00} + {3750022800 -3600 0 -01} + {3762723600 0 1 +00} + {3781472400 -3600 0 -01} + {3794173200 0 1 +00} + {3812922000 -3600 0 -01} + {3825622800 0 1 +00} + {3844371600 -3600 0 -01} + {3857677200 0 1 +00} + {3875821200 -3600 0 -01} + {3889126800 0 1 +00} + {3907270800 -3600 0 -01} + {3920576400 0 1 +00} + {3939325200 -3600 0 -01} + {3952026000 0 1 +00} + {3970774800 -3600 0 -01} + {3983475600 0 1 +00} + {4002224400 -3600 0 -01} + {4015530000 0 1 +00} + {4033674000 -3600 0 -01} + {4046979600 0 1 +00} + {4065123600 -3600 0 -01} + {4078429200 0 1 +00} + {4096573200 -3600 0 -01} +} diff --git a/env/tcl/tcl8.6/tzdata/Atlantic/Bermuda b/env/tcl/tcl8.6/tzdata/Atlantic/Bermuda new file mode 100644 index 0000000..2d4d983 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Atlantic/Bermuda @@ -0,0 +1,259 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Atlantic/Bermuda) { + {-9223372036854775808 -15558 0 LMT} + {-1262281242 -14400 0 AST} + {136360800 -10800 0 ADT} + {152082000 -14400 0 AST} + {167810400 -10800 1 ADT} + {183531600 -14400 0 AST} + {189316800 -14400 0 AST} + {199260000 -10800 1 ADT} + {215586000 -14400 0 AST} + {230709600 -10800 1 ADT} + {247035600 -14400 0 AST} + {262764000 -10800 1 ADT} + {278485200 -14400 0 AST} + {294213600 -10800 1 ADT} + {309934800 -14400 0 AST} + {325663200 -10800 1 ADT} + {341384400 -14400 0 AST} + {357112800 -10800 1 ADT} + {372834000 -14400 0 AST} + {388562400 -10800 1 ADT} + {404888400 -14400 0 AST} + {420012000 -10800 1 ADT} + {436338000 -14400 0 AST} + {452066400 -10800 1 ADT} + {467787600 -14400 0 AST} + {483516000 -10800 1 ADT} + {499237200 -14400 0 AST} + {514965600 -10800 1 ADT} + {530686800 -14400 0 AST} + {544600800 -10800 1 ADT} + {562136400 -14400 0 AST} + {576050400 -10800 1 ADT} + {594190800 -14400 0 AST} + {607500000 -10800 1 ADT} + {625640400 -14400 0 AST} + {638949600 -10800 1 ADT} + {657090000 -14400 0 AST} + {671004000 -10800 1 ADT} + {688539600 -14400 0 AST} + {702453600 -10800 1 ADT} + {719989200 -14400 0 AST} + {733903200 -10800 1 ADT} + {752043600 -14400 0 AST} + {765352800 -10800 1 ADT} + {783493200 -14400 0 AST} + {796802400 -10800 1 ADT} + {814942800 -14400 0 AST} + {828856800 -10800 1 ADT} + {846392400 -14400 0 AST} + {860306400 -10800 1 ADT} + {877842000 -14400 0 AST} + {891756000 -10800 1 ADT} + {909291600 -14400 0 AST} + {923205600 -10800 1 ADT} + {941346000 -14400 0 AST} + {954655200 -10800 1 ADT} + {972795600 -14400 0 AST} + {986104800 -10800 1 ADT} + {1004245200 -14400 0 AST} + {1018159200 -10800 1 ADT} + {1035694800 -14400 0 AST} + {1049608800 -10800 1 ADT} + {1067144400 -14400 0 AST} + {1081058400 -10800 1 ADT} + {1099198800 -14400 0 AST} + {1112508000 -10800 1 ADT} + {1130648400 -14400 0 AST} + {1143957600 -10800 1 ADT} + {1162098000 -14400 0 AST} + {1173592800 -10800 1 ADT} + {1194152400 -14400 0 AST} + {1205042400 -10800 1 ADT} + {1225602000 -14400 0 AST} + {1236492000 -10800 1 ADT} + {1257051600 -14400 0 AST} + {1268546400 -10800 1 ADT} + {1289106000 -14400 0 AST} + {1299996000 -10800 1 ADT} + {1320555600 -14400 0 AST} + {1331445600 -10800 1 ADT} + {1352005200 -14400 0 AST} + {1362895200 -10800 1 ADT} + {1383454800 -14400 0 AST} + {1394344800 -10800 1 ADT} + {1414904400 -14400 0 AST} + {1425794400 -10800 1 ADT} + {1446354000 -14400 0 AST} + {1457848800 -10800 1 ADT} + {1478408400 -14400 0 AST} + {1489298400 -10800 1 ADT} + {1509858000 -14400 0 AST} + {1520748000 -10800 1 ADT} + {1541307600 -14400 0 AST} + {1552197600 -10800 1 ADT} + {1572757200 -14400 0 AST} + {1583647200 -10800 1 ADT} + {1604206800 -14400 0 AST} + {1615701600 -10800 1 ADT} + {1636261200 -14400 0 AST} + {1647151200 -10800 1 ADT} + {1667710800 -14400 0 AST} + {1678600800 -10800 1 ADT} + {1699160400 -14400 0 AST} + {1710050400 -10800 1 ADT} + {1730610000 -14400 0 AST} + {1741500000 -10800 1 ADT} + {1762059600 -14400 0 AST} + {1772949600 -10800 1 ADT} + {1793509200 -14400 0 AST} + {1805004000 -10800 1 ADT} + {1825563600 -14400 0 AST} + {1836453600 -10800 1 ADT} + {1857013200 -14400 0 AST} + {1867903200 -10800 1 ADT} + {1888462800 -14400 0 AST} + {1899352800 -10800 1 ADT} + {1919912400 -14400 0 AST} + {1930802400 -10800 1 ADT} + {1951362000 -14400 0 AST} + {1962856800 -10800 1 ADT} + {1983416400 -14400 0 AST} + {1994306400 -10800 1 ADT} + {2014866000 -14400 0 AST} + {2025756000 -10800 1 ADT} + {2046315600 -14400 0 AST} + {2057205600 -10800 1 ADT} + {2077765200 -14400 0 AST} + {2088655200 -10800 1 ADT} + {2109214800 -14400 0 AST} + {2120104800 -10800 1 ADT} + {2140664400 -14400 0 AST} + {2152159200 -10800 1 ADT} + {2172718800 -14400 0 AST} + {2183608800 -10800 1 ADT} + {2204168400 -14400 0 AST} + {2215058400 -10800 1 ADT} + {2235618000 -14400 0 AST} + {2246508000 -10800 1 ADT} + {2267067600 -14400 0 AST} + {2277957600 -10800 1 ADT} + {2298517200 -14400 0 AST} + {2309407200 -10800 1 ADT} + {2329966800 -14400 0 AST} + {2341461600 -10800 1 ADT} + {2362021200 -14400 0 AST} + {2372911200 -10800 1 ADT} + {2393470800 -14400 0 AST} + {2404360800 -10800 1 ADT} + {2424920400 -14400 0 AST} + {2435810400 -10800 1 ADT} + {2456370000 -14400 0 AST} + {2467260000 -10800 1 ADT} + {2487819600 -14400 0 AST} + {2499314400 -10800 1 ADT} + {2519874000 -14400 0 AST} + {2530764000 -10800 1 ADT} + {2551323600 -14400 0 AST} + {2562213600 -10800 1 ADT} + {2582773200 -14400 0 AST} + {2593663200 -10800 1 ADT} + {2614222800 -14400 0 AST} + {2625112800 -10800 1 ADT} + {2645672400 -14400 0 AST} + {2656562400 -10800 1 ADT} + {2677122000 -14400 0 AST} + {2688616800 -10800 1 ADT} + {2709176400 -14400 0 AST} + {2720066400 -10800 1 ADT} + {2740626000 -14400 0 AST} + {2751516000 -10800 1 ADT} + {2772075600 -14400 0 AST} + {2782965600 -10800 1 ADT} + {2803525200 -14400 0 AST} + {2814415200 -10800 1 ADT} + {2834974800 -14400 0 AST} + {2846469600 -10800 1 ADT} + {2867029200 -14400 0 AST} + {2877919200 -10800 1 ADT} + {2898478800 -14400 0 AST} + {2909368800 -10800 1 ADT} + {2929928400 -14400 0 AST} + {2940818400 -10800 1 ADT} + {2961378000 -14400 0 AST} + {2972268000 -10800 1 ADT} + {2992827600 -14400 0 AST} + {3003717600 -10800 1 ADT} + {3024277200 -14400 0 AST} + {3035772000 -10800 1 ADT} + {3056331600 -14400 0 AST} + {3067221600 -10800 1 ADT} + {3087781200 -14400 0 AST} + {3098671200 -10800 1 ADT} + {3119230800 -14400 0 AST} + {3130120800 -10800 1 ADT} + {3150680400 -14400 0 AST} + {3161570400 -10800 1 ADT} + {3182130000 -14400 0 AST} + {3193020000 -10800 1 ADT} + {3213579600 -14400 0 AST} + {3225074400 -10800 1 ADT} + {3245634000 -14400 0 AST} + {3256524000 -10800 1 ADT} + {3277083600 -14400 0 AST} + {3287973600 -10800 1 ADT} + {3308533200 -14400 0 AST} + {3319423200 -10800 1 ADT} + {3339982800 -14400 0 AST} + {3350872800 -10800 1 ADT} + {3371432400 -14400 0 AST} + {3382927200 -10800 1 ADT} + {3403486800 -14400 0 AST} + {3414376800 -10800 1 ADT} + {3434936400 -14400 0 AST} + {3445826400 -10800 1 ADT} + {3466386000 -14400 0 AST} + {3477276000 -10800 1 ADT} + {3497835600 -14400 0 AST} + {3508725600 -10800 1 ADT} + {3529285200 -14400 0 AST} + {3540175200 -10800 1 ADT} + {3560734800 -14400 0 AST} + {3572229600 -10800 1 ADT} + {3592789200 -14400 0 AST} + {3603679200 -10800 1 ADT} + {3624238800 -14400 0 AST} + {3635128800 -10800 1 ADT} + {3655688400 -14400 0 AST} + {3666578400 -10800 1 ADT} + {3687138000 -14400 0 AST} + {3698028000 -10800 1 ADT} + {3718587600 -14400 0 AST} + {3730082400 -10800 1 ADT} + {3750642000 -14400 0 AST} + {3761532000 -10800 1 ADT} + {3782091600 -14400 0 AST} + {3792981600 -10800 1 ADT} + {3813541200 -14400 0 AST} + {3824431200 -10800 1 ADT} + {3844990800 -14400 0 AST} + {3855880800 -10800 1 ADT} + {3876440400 -14400 0 AST} + {3887330400 -10800 1 ADT} + {3907890000 -14400 0 AST} + {3919384800 -10800 1 ADT} + {3939944400 -14400 0 AST} + {3950834400 -10800 1 ADT} + {3971394000 -14400 0 AST} + {3982284000 -10800 1 ADT} + {4002843600 -14400 0 AST} + {4013733600 -10800 1 ADT} + {4034293200 -14400 0 AST} + {4045183200 -10800 1 ADT} + {4065742800 -14400 0 AST} + {4076632800 -10800 1 ADT} + {4097192400 -14400 0 AST} +} diff --git a/env/tcl/tcl8.6/tzdata/Atlantic/Canary b/env/tcl/tcl8.6/tzdata/Atlantic/Canary new file mode 100644 index 0000000..b5c2997 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Atlantic/Canary @@ -0,0 +1,247 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Atlantic/Canary) { + {-9223372036854775808 -3696 0 LMT} + {-1509663504 -3600 0 -01} + {-733874400 0 0 WET} + {323827200 3600 1 WEST} + {338950800 0 0 WET} + {354675600 3600 1 WEST} + {370400400 0 0 WET} + {386125200 3600 1 WEST} + {401850000 0 0 WET} + {417574800 3600 1 WEST} + {433299600 0 0 WET} + {449024400 3600 1 WEST} + {465354000 0 0 WET} + {481078800 3600 1 WEST} + {496803600 0 0 WET} + {512528400 3600 1 WEST} + {528253200 0 0 WET} + {543978000 3600 1 WEST} + {559702800 0 0 WET} + {575427600 3600 1 WEST} + {591152400 0 0 WET} + {606877200 3600 1 WEST} + {622602000 0 0 WET} + {638326800 3600 1 WEST} + {654656400 0 0 WET} + {670381200 3600 1 WEST} + {686106000 0 0 WET} + {701830800 3600 1 WEST} + {717555600 0 0 WET} + {733280400 3600 1 WEST} + {749005200 0 0 WET} + {764730000 3600 1 WEST} + {780454800 0 0 WET} + {796179600 3600 1 WEST} + {811904400 0 0 WET} + {828234000 3600 1 WEST} + {846378000 0 0 WET} + {859683600 3600 1 WEST} + {877827600 0 0 WET} + {891133200 3600 1 WEST} + {909277200 0 0 WET} + {922582800 3600 1 WEST} + {941331600 0 0 WET} + {954032400 3600 1 WEST} + {972781200 0 0 WET} + {985482000 3600 1 WEST} + {1004230800 0 0 WET} + {1017536400 3600 1 WEST} + {1035680400 0 0 WET} + {1048986000 3600 1 WEST} + {1067130000 0 0 WET} + {1080435600 3600 1 WEST} + {1099184400 0 0 WET} + {1111885200 3600 1 WEST} + {1130634000 0 0 WET} + {1143334800 3600 1 WEST} + {1162083600 0 0 WET} + {1174784400 3600 1 WEST} + {1193533200 0 0 WET} + {1206838800 3600 1 WEST} + {1224982800 0 0 WET} + {1238288400 3600 1 WEST} + {1256432400 0 0 WET} + {1269738000 3600 1 WEST} + {1288486800 0 0 WET} + {1301187600 3600 1 WEST} + {1319936400 0 0 WET} + {1332637200 3600 1 WEST} + {1351386000 0 0 WET} + {1364691600 3600 1 WEST} + {1382835600 0 0 WET} + {1396141200 3600 1 WEST} + {1414285200 0 0 WET} + {1427590800 3600 1 WEST} + {1445734800 0 0 WET} + {1459040400 3600 1 WEST} + {1477789200 0 0 WET} + {1490490000 3600 1 WEST} + {1509238800 0 0 WET} + {1521939600 3600 1 WEST} + {1540688400 0 0 WET} + {1553994000 3600 1 WEST} + {1572138000 0 0 WET} + {1585443600 3600 1 WEST} + {1603587600 0 0 WET} + {1616893200 3600 1 WEST} + {1635642000 0 0 WET} + {1648342800 3600 1 WEST} + {1667091600 0 0 WET} + {1679792400 3600 1 WEST} + {1698541200 0 0 WET} + {1711846800 3600 1 WEST} + {1729990800 0 0 WET} + {1743296400 3600 1 WEST} + {1761440400 0 0 WET} + {1774746000 3600 1 WEST} + {1792890000 0 0 WET} + {1806195600 3600 1 WEST} + {1824944400 0 0 WET} + {1837645200 3600 1 WEST} + {1856394000 0 0 WET} + {1869094800 3600 1 WEST} + {1887843600 0 0 WET} + {1901149200 3600 1 WEST} + {1919293200 0 0 WET} + {1932598800 3600 1 WEST} + {1950742800 0 0 WET} + {1964048400 3600 1 WEST} + {1982797200 0 0 WET} + {1995498000 3600 1 WEST} + {2014246800 0 0 WET} + {2026947600 3600 1 WEST} + {2045696400 0 0 WET} + {2058397200 3600 1 WEST} + {2077146000 0 0 WET} + {2090451600 3600 1 WEST} + {2108595600 0 0 WET} + {2121901200 3600 1 WEST} + {2140045200 0 0 WET} + {2153350800 3600 1 WEST} + {2172099600 0 0 WET} + {2184800400 3600 1 WEST} + {2203549200 0 0 WET} + {2216250000 3600 1 WEST} + {2234998800 0 0 WET} + {2248304400 3600 1 WEST} + {2266448400 0 0 WET} + {2279754000 3600 1 WEST} + {2297898000 0 0 WET} + {2311203600 3600 1 WEST} + {2329347600 0 0 WET} + {2342653200 3600 1 WEST} + {2361402000 0 0 WET} + {2374102800 3600 1 WEST} + {2392851600 0 0 WET} + {2405552400 3600 1 WEST} + {2424301200 0 0 WET} + {2437606800 3600 1 WEST} + {2455750800 0 0 WET} + {2469056400 3600 1 WEST} + {2487200400 0 0 WET} + {2500506000 3600 1 WEST} + {2519254800 0 0 WET} + {2531955600 3600 1 WEST} + {2550704400 0 0 WET} + {2563405200 3600 1 WEST} + {2582154000 0 0 WET} + {2595459600 3600 1 WEST} + {2613603600 0 0 WET} + {2626909200 3600 1 WEST} + {2645053200 0 0 WET} + {2658358800 3600 1 WEST} + {2676502800 0 0 WET} + {2689808400 3600 1 WEST} + {2708557200 0 0 WET} + {2721258000 3600 1 WEST} + {2740006800 0 0 WET} + {2752707600 3600 1 WEST} + {2771456400 0 0 WET} + {2784762000 3600 1 WEST} + {2802906000 0 0 WET} + {2816211600 3600 1 WEST} + {2834355600 0 0 WET} + {2847661200 3600 1 WEST} + {2866410000 0 0 WET} + {2879110800 3600 1 WEST} + {2897859600 0 0 WET} + {2910560400 3600 1 WEST} + {2929309200 0 0 WET} + {2942010000 3600 1 WEST} + {2960758800 0 0 WET} + {2974064400 3600 1 WEST} + {2992208400 0 0 WET} + {3005514000 3600 1 WEST} + {3023658000 0 0 WET} + {3036963600 3600 1 WEST} + {3055712400 0 0 WET} + {3068413200 3600 1 WEST} + {3087162000 0 0 WET} + {3099862800 3600 1 WEST} + {3118611600 0 0 WET} + {3131917200 3600 1 WEST} + {3150061200 0 0 WET} + {3163366800 3600 1 WEST} + {3181510800 0 0 WET} + {3194816400 3600 1 WEST} + {3212960400 0 0 WET} + {3226266000 3600 1 WEST} + {3245014800 0 0 WET} + {3257715600 3600 1 WEST} + {3276464400 0 0 WET} + {3289165200 3600 1 WEST} + {3307914000 0 0 WET} + {3321219600 3600 1 WEST} + {3339363600 0 0 WET} + {3352669200 3600 1 WEST} + {3370813200 0 0 WET} + {3384118800 3600 1 WEST} + {3402867600 0 0 WET} + {3415568400 3600 1 WEST} + {3434317200 0 0 WET} + {3447018000 3600 1 WEST} + {3465766800 0 0 WET} + {3479072400 3600 1 WEST} + {3497216400 0 0 WET} + {3510522000 3600 1 WEST} + {3528666000 0 0 WET} + {3541971600 3600 1 WEST} + {3560115600 0 0 WET} + {3573421200 3600 1 WEST} + {3592170000 0 0 WET} + {3604870800 3600 1 WEST} + {3623619600 0 0 WET} + {3636320400 3600 1 WEST} + {3655069200 0 0 WET} + {3668374800 3600 1 WEST} + {3686518800 0 0 WET} + {3699824400 3600 1 WEST} + {3717968400 0 0 WET} + {3731274000 3600 1 WEST} + {3750022800 0 0 WET} + {3762723600 3600 1 WEST} + {3781472400 0 0 WET} + {3794173200 3600 1 WEST} + {3812922000 0 0 WET} + {3825622800 3600 1 WEST} + {3844371600 0 0 WET} + {3857677200 3600 1 WEST} + {3875821200 0 0 WET} + {3889126800 3600 1 WEST} + {3907270800 0 0 WET} + {3920576400 3600 1 WEST} + {3939325200 0 0 WET} + {3952026000 3600 1 WEST} + {3970774800 0 0 WET} + {3983475600 3600 1 WEST} + {4002224400 0 0 WET} + {4015530000 3600 1 WEST} + {4033674000 0 0 WET} + {4046979600 3600 1 WEST} + {4065123600 0 0 WET} + {4078429200 3600 1 WEST} + {4096573200 0 0 WET} +} diff --git a/env/tcl/tcl8.6/tzdata/Atlantic/Cape_Verde b/env/tcl/tcl8.6/tzdata/Atlantic/Cape_Verde new file mode 100644 index 0000000..595db0b --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Atlantic/Cape_Verde @@ -0,0 +1,9 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Atlantic/Cape_Verde) { + {-9223372036854775808 -5644 0 LMT} + {-1830376800 -7200 0 -02} + {-862610400 -3600 1 -01} + {-764118000 -7200 0 -02} + {186120000 -3600 0 -01} +} diff --git a/env/tcl/tcl8.6/tzdata/Atlantic/Faeroe b/env/tcl/tcl8.6/tzdata/Atlantic/Faeroe new file mode 100644 index 0000000..4cafc34 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Atlantic/Faeroe @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(Atlantic/Faroe)]} { + LoadTimeZoneFile Atlantic/Faroe +} +set TZData(:Atlantic/Faeroe) $TZData(:Atlantic/Faroe) diff --git a/env/tcl/tcl8.6/tzdata/Atlantic/Faroe b/env/tcl/tcl8.6/tzdata/Atlantic/Faroe new file mode 100644 index 0000000..d2c314a --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Atlantic/Faroe @@ -0,0 +1,245 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Atlantic/Faroe) { + {-9223372036854775808 -1624 0 LMT} + {-1955748776 0 0 WET} + {347155200 0 0 WET} + {354675600 3600 1 WEST} + {370400400 0 0 WET} + {386125200 3600 1 WEST} + {401850000 0 0 WET} + {417574800 3600 1 WEST} + {433299600 0 0 WET} + {449024400 3600 1 WEST} + {465354000 0 0 WET} + {481078800 3600 1 WEST} + {496803600 0 0 WET} + {512528400 3600 1 WEST} + {528253200 0 0 WET} + {543978000 3600 1 WEST} + {559702800 0 0 WET} + {575427600 3600 1 WEST} + {591152400 0 0 WET} + {606877200 3600 1 WEST} + {622602000 0 0 WET} + {638326800 3600 1 WEST} + {654656400 0 0 WET} + {670381200 3600 1 WEST} + {686106000 0 0 WET} + {701830800 3600 1 WEST} + {717555600 0 0 WET} + {733280400 3600 1 WEST} + {749005200 0 0 WET} + {764730000 3600 1 WEST} + {780454800 0 0 WET} + {796179600 3600 1 WEST} + {811904400 0 0 WET} + {828234000 3600 1 WEST} + {846378000 0 0 WET} + {859683600 3600 1 WEST} + {877827600 0 0 WET} + {891133200 3600 1 WEST} + {909277200 0 0 WET} + {922582800 3600 1 WEST} + {941331600 0 0 WET} + {954032400 3600 1 WEST} + {972781200 0 0 WET} + {985482000 3600 1 WEST} + {1004230800 0 0 WET} + {1017536400 3600 1 WEST} + {1035680400 0 0 WET} + {1048986000 3600 1 WEST} + {1067130000 0 0 WET} + {1080435600 3600 1 WEST} + {1099184400 0 0 WET} + {1111885200 3600 1 WEST} + {1130634000 0 0 WET} + {1143334800 3600 1 WEST} + {1162083600 0 0 WET} + {1174784400 3600 1 WEST} + {1193533200 0 0 WET} + {1206838800 3600 1 WEST} + {1224982800 0 0 WET} + {1238288400 3600 1 WEST} + {1256432400 0 0 WET} + {1269738000 3600 1 WEST} + {1288486800 0 0 WET} + {1301187600 3600 1 WEST} + {1319936400 0 0 WET} + {1332637200 3600 1 WEST} + {1351386000 0 0 WET} + {1364691600 3600 1 WEST} + {1382835600 0 0 WET} + {1396141200 3600 1 WEST} + {1414285200 0 0 WET} + {1427590800 3600 1 WEST} + {1445734800 0 0 WET} + {1459040400 3600 1 WEST} + {1477789200 0 0 WET} + {1490490000 3600 1 WEST} + {1509238800 0 0 WET} + {1521939600 3600 1 WEST} + {1540688400 0 0 WET} + {1553994000 3600 1 WEST} + {1572138000 0 0 WET} + {1585443600 3600 1 WEST} + {1603587600 0 0 WET} + {1616893200 3600 1 WEST} + {1635642000 0 0 WET} + {1648342800 3600 1 WEST} + {1667091600 0 0 WET} + {1679792400 3600 1 WEST} + {1698541200 0 0 WET} + {1711846800 3600 1 WEST} + {1729990800 0 0 WET} + {1743296400 3600 1 WEST} + {1761440400 0 0 WET} + {1774746000 3600 1 WEST} + {1792890000 0 0 WET} + {1806195600 3600 1 WEST} + {1824944400 0 0 WET} + {1837645200 3600 1 WEST} + {1856394000 0 0 WET} + {1869094800 3600 1 WEST} + {1887843600 0 0 WET} + {1901149200 3600 1 WEST} + {1919293200 0 0 WET} + {1932598800 3600 1 WEST} + {1950742800 0 0 WET} + {1964048400 3600 1 WEST} + {1982797200 0 0 WET} + {1995498000 3600 1 WEST} + {2014246800 0 0 WET} + {2026947600 3600 1 WEST} + {2045696400 0 0 WET} + {2058397200 3600 1 WEST} + {2077146000 0 0 WET} + {2090451600 3600 1 WEST} + {2108595600 0 0 WET} + {2121901200 3600 1 WEST} + {2140045200 0 0 WET} + {2153350800 3600 1 WEST} + {2172099600 0 0 WET} + {2184800400 3600 1 WEST} + {2203549200 0 0 WET} + {2216250000 3600 1 WEST} + {2234998800 0 0 WET} + {2248304400 3600 1 WEST} + {2266448400 0 0 WET} + {2279754000 3600 1 WEST} + {2297898000 0 0 WET} + {2311203600 3600 1 WEST} + {2329347600 0 0 WET} + {2342653200 3600 1 WEST} + {2361402000 0 0 WET} + {2374102800 3600 1 WEST} + {2392851600 0 0 WET} + {2405552400 3600 1 WEST} + {2424301200 0 0 WET} + {2437606800 3600 1 WEST} + {2455750800 0 0 WET} + {2469056400 3600 1 WEST} + {2487200400 0 0 WET} + {2500506000 3600 1 WEST} + {2519254800 0 0 WET} + {2531955600 3600 1 WEST} + {2550704400 0 0 WET} + {2563405200 3600 1 WEST} + {2582154000 0 0 WET} + {2595459600 3600 1 WEST} + {2613603600 0 0 WET} + {2626909200 3600 1 WEST} + {2645053200 0 0 WET} + {2658358800 3600 1 WEST} + {2676502800 0 0 WET} + {2689808400 3600 1 WEST} + {2708557200 0 0 WET} + {2721258000 3600 1 WEST} + {2740006800 0 0 WET} + {2752707600 3600 1 WEST} + {2771456400 0 0 WET} + {2784762000 3600 1 WEST} + {2802906000 0 0 WET} + {2816211600 3600 1 WEST} + {2834355600 0 0 WET} + {2847661200 3600 1 WEST} + {2866410000 0 0 WET} + {2879110800 3600 1 WEST} + {2897859600 0 0 WET} + {2910560400 3600 1 WEST} + {2929309200 0 0 WET} + {2942010000 3600 1 WEST} + {2960758800 0 0 WET} + {2974064400 3600 1 WEST} + {2992208400 0 0 WET} + {3005514000 3600 1 WEST} + {3023658000 0 0 WET} + {3036963600 3600 1 WEST} + {3055712400 0 0 WET} + {3068413200 3600 1 WEST} + {3087162000 0 0 WET} + {3099862800 3600 1 WEST} + {3118611600 0 0 WET} + {3131917200 3600 1 WEST} + {3150061200 0 0 WET} + {3163366800 3600 1 WEST} + {3181510800 0 0 WET} + {3194816400 3600 1 WEST} + {3212960400 0 0 WET} + {3226266000 3600 1 WEST} + {3245014800 0 0 WET} + {3257715600 3600 1 WEST} + {3276464400 0 0 WET} + {3289165200 3600 1 WEST} + {3307914000 0 0 WET} + {3321219600 3600 1 WEST} + {3339363600 0 0 WET} + {3352669200 3600 1 WEST} + {3370813200 0 0 WET} + {3384118800 3600 1 WEST} + {3402867600 0 0 WET} + {3415568400 3600 1 WEST} + {3434317200 0 0 WET} + {3447018000 3600 1 WEST} + {3465766800 0 0 WET} + {3479072400 3600 1 WEST} + {3497216400 0 0 WET} + {3510522000 3600 1 WEST} + {3528666000 0 0 WET} + {3541971600 3600 1 WEST} + {3560115600 0 0 WET} + {3573421200 3600 1 WEST} + {3592170000 0 0 WET} + {3604870800 3600 1 WEST} + {3623619600 0 0 WET} + {3636320400 3600 1 WEST} + {3655069200 0 0 WET} + {3668374800 3600 1 WEST} + {3686518800 0 0 WET} + {3699824400 3600 1 WEST} + {3717968400 0 0 WET} + {3731274000 3600 1 WEST} + {3750022800 0 0 WET} + {3762723600 3600 1 WEST} + {3781472400 0 0 WET} + {3794173200 3600 1 WEST} + {3812922000 0 0 WET} + {3825622800 3600 1 WEST} + {3844371600 0 0 WET} + {3857677200 3600 1 WEST} + {3875821200 0 0 WET} + {3889126800 3600 1 WEST} + {3907270800 0 0 WET} + {3920576400 3600 1 WEST} + {3939325200 0 0 WET} + {3952026000 3600 1 WEST} + {3970774800 0 0 WET} + {3983475600 3600 1 WEST} + {4002224400 0 0 WET} + {4015530000 3600 1 WEST} + {4033674000 0 0 WET} + {4046979600 3600 1 WEST} + {4065123600 0 0 WET} + {4078429200 3600 1 WEST} + {4096573200 0 0 WET} +} diff --git a/env/tcl/tcl8.6/tzdata/Atlantic/Jan_Mayen b/env/tcl/tcl8.6/tzdata/Atlantic/Jan_Mayen new file mode 100644 index 0000000..e592187 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Atlantic/Jan_Mayen @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(Europe/Oslo)]} { + LoadTimeZoneFile Europe/Oslo +} +set TZData(:Atlantic/Jan_Mayen) $TZData(:Europe/Oslo) diff --git a/env/tcl/tcl8.6/tzdata/Atlantic/Madeira b/env/tcl/tcl8.6/tzdata/Atlantic/Madeira new file mode 100644 index 0000000..fed9c19 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Atlantic/Madeira @@ -0,0 +1,346 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Atlantic/Madeira) { + {-9223372036854775808 -4056 0 LMT} + {-2713906344 -4056 0 FMT} + {-1830380400 -3600 0 -01} + {-1689552000 0 1 +00} + {-1677798000 -3600 0 -01} + {-1667433600 0 1 +00} + {-1647734400 -3600 0 -01} + {-1635811200 0 1 +00} + {-1616198400 -3600 0 -01} + {-1604361600 0 1 +00} + {-1584662400 -3600 0 -01} + {-1572739200 0 1 +00} + {-1553040000 -3600 0 -01} + {-1541203200 0 1 +00} + {-1521504000 -3600 0 -01} + {-1442448000 0 1 +00} + {-1426809600 -3600 0 -01} + {-1379289600 0 1 +00} + {-1364774400 -3600 0 -01} + {-1348444800 0 1 +00} + {-1333324800 -3600 0 -01} + {-1316390400 0 1 +00} + {-1301270400 -3600 0 -01} + {-1284336000 0 1 +00} + {-1269820800 -3600 0 -01} + {-1221436800 0 1 +00} + {-1206921600 -3600 0 -01} + {-1191196800 0 1 +00} + {-1175472000 -3600 0 -01} + {-1127692800 0 1 +00} + {-1111968000 -3600 0 -01} + {-1096848000 0 1 +00} + {-1080518400 -3600 0 -01} + {-1063584000 0 1 +00} + {-1049068800 -3600 0 -01} + {-1033344000 0 1 +00} + {-1017619200 -3600 0 -01} + {-1002499200 0 1 +00} + {-986169600 -3600 0 -01} + {-969235200 0 1 +00} + {-950486400 -3600 0 -01} + {-942019200 0 1 +00} + {-922665600 -3600 0 -01} + {-906940800 0 1 +00} + {-891129600 -3600 0 -01} + {-877305600 0 1 +00} + {-864003600 0 0 +00} + {-857952000 -3600 0 -01} + {-845856000 0 1 +00} + {-831344400 0 0 +00} + {-825897600 -3600 0 -01} + {-814406400 0 1 +00} + {-799894800 0 0 +00} + {-794448000 -3600 0 -01} + {-782956800 0 1 +00} + {-768445200 0 0 +00} + {-762998400 -3600 0 -01} + {-749088000 0 1 +00} + {-733363200 -3600 0 -01} + {-717627600 0 1 +00} + {-701902800 -3600 0 -01} + {-686178000 0 1 +00} + {-670453200 -3600 0 -01} + {-654728400 0 1 +00} + {-639003600 -3600 0 -01} + {-591829200 0 1 +00} + {-575499600 -3600 0 -01} + {-559774800 0 1 +00} + {-544050000 -3600 0 -01} + {-528325200 0 1 +00} + {-512600400 -3600 0 -01} + {-496875600 0 1 +00} + {-481150800 -3600 0 -01} + {-465426000 0 1 +00} + {-449701200 -3600 0 -01} + {-433976400 0 1 +00} + {-417646800 -3600 0 -01} + {-401922000 0 1 +00} + {-386197200 -3600 0 -01} + {-370472400 0 1 +00} + {-354747600 -3600 0 -01} + {-339022800 0 1 +00} + {-323298000 -3600 0 -01} + {-307573200 0 1 +00} + {-291848400 -3600 0 -01} + {-276123600 0 1 +00} + {-260398800 -3600 0 -01} + {-244674000 0 1 +00} + {-228344400 -3600 0 -01} + {-212619600 0 1 +00} + {-196894800 -3600 0 -01} + {-181170000 0 1 +00} + {-165445200 -3600 0 -01} + {-149720400 0 1 +00} + {-133995600 -3600 0 -01} + {-118270800 0 0 WET} + {228268800 3600 1 WEST} + {243993600 0 0 WET} + {260323200 3600 1 WEST} + {276048000 0 0 WET} + {291772800 3600 1 WEST} + {307501200 0 0 WET} + {323222400 3600 1 WEST} + {338950800 0 0 WET} + {354675600 3600 1 WEST} + {370400400 0 0 WET} + {386125200 3600 1 WEST} + {401850000 0 0 WET} + {417578400 3600 1 WEST} + {433299600 0 0 WET} + {449024400 3600 1 WEST} + {465354000 0 0 WET} + {481078800 3600 1 WEST} + {496803600 0 0 WET} + {512528400 3600 1 WEST} + {528253200 0 0 WET} + {543978000 3600 1 WEST} + {559702800 0 0 WET} + {575427600 3600 1 WEST} + {591152400 0 0 WET} + {606877200 3600 1 WEST} + {622602000 0 0 WET} + {638326800 3600 1 WEST} + {654656400 0 0 WET} + {670381200 3600 1 WEST} + {686106000 0 0 WET} + {701830800 3600 1 WEST} + {717555600 0 0 WET} + {733280400 3600 1 WEST} + {749005200 0 0 WET} + {764730000 3600 1 WEST} + {780454800 0 0 WET} + {796179600 3600 1 WEST} + {811904400 0 0 WET} + {828234000 3600 1 WEST} + {846378000 0 0 WET} + {859683600 3600 1 WEST} + {877827600 0 0 WET} + {891133200 3600 1 WEST} + {909277200 0 0 WET} + {922582800 3600 1 WEST} + {941331600 0 0 WET} + {954032400 3600 1 WEST} + {972781200 0 0 WET} + {985482000 3600 1 WEST} + {1004230800 0 0 WET} + {1017536400 3600 1 WEST} + {1035680400 0 0 WET} + {1048986000 3600 1 WEST} + {1067130000 0 0 WET} + {1080435600 3600 1 WEST} + {1099184400 0 0 WET} + {1111885200 3600 1 WEST} + {1130634000 0 0 WET} + {1143334800 3600 1 WEST} + {1162083600 0 0 WET} + {1174784400 3600 1 WEST} + {1193533200 0 0 WET} + {1206838800 3600 1 WEST} + {1224982800 0 0 WET} + {1238288400 3600 1 WEST} + {1256432400 0 0 WET} + {1269738000 3600 1 WEST} + {1288486800 0 0 WET} + {1301187600 3600 1 WEST} + {1319936400 0 0 WET} + {1332637200 3600 1 WEST} + {1351386000 0 0 WET} + {1364691600 3600 1 WEST} + {1382835600 0 0 WET} + {1396141200 3600 1 WEST} + {1414285200 0 0 WET} + {1427590800 3600 1 WEST} + {1445734800 0 0 WET} + {1459040400 3600 1 WEST} + {1477789200 0 0 WET} + {1490490000 3600 1 WEST} + {1509238800 0 0 WET} + {1521939600 3600 1 WEST} + {1540688400 0 0 WET} + {1553994000 3600 1 WEST} + {1572138000 0 0 WET} + {1585443600 3600 1 WEST} + {1603587600 0 0 WET} + {1616893200 3600 1 WEST} + {1635642000 0 0 WET} + {1648342800 3600 1 WEST} + {1667091600 0 0 WET} + {1679792400 3600 1 WEST} + {1698541200 0 0 WET} + {1711846800 3600 1 WEST} + {1729990800 0 0 WET} + {1743296400 3600 1 WEST} + {1761440400 0 0 WET} + {1774746000 3600 1 WEST} + {1792890000 0 0 WET} + {1806195600 3600 1 WEST} + {1824944400 0 0 WET} + {1837645200 3600 1 WEST} + {1856394000 0 0 WET} + {1869094800 3600 1 WEST} + {1887843600 0 0 WET} + {1901149200 3600 1 WEST} + {1919293200 0 0 WET} + {1932598800 3600 1 WEST} + {1950742800 0 0 WET} + {1964048400 3600 1 WEST} + {1982797200 0 0 WET} + {1995498000 3600 1 WEST} + {2014246800 0 0 WET} + {2026947600 3600 1 WEST} + {2045696400 0 0 WET} + {2058397200 3600 1 WEST} + {2077146000 0 0 WET} + {2090451600 3600 1 WEST} + {2108595600 0 0 WET} + {2121901200 3600 1 WEST} + {2140045200 0 0 WET} + {2153350800 3600 1 WEST} + {2172099600 0 0 WET} + {2184800400 3600 1 WEST} + {2203549200 0 0 WET} + {2216250000 3600 1 WEST} + {2234998800 0 0 WET} + {2248304400 3600 1 WEST} + {2266448400 0 0 WET} + {2279754000 3600 1 WEST} + {2297898000 0 0 WET} + {2311203600 3600 1 WEST} + {2329347600 0 0 WET} + {2342653200 3600 1 WEST} + {2361402000 0 0 WET} + {2374102800 3600 1 WEST} + {2392851600 0 0 WET} + {2405552400 3600 1 WEST} + {2424301200 0 0 WET} + {2437606800 3600 1 WEST} + {2455750800 0 0 WET} + {2469056400 3600 1 WEST} + {2487200400 0 0 WET} + {2500506000 3600 1 WEST} + {2519254800 0 0 WET} + {2531955600 3600 1 WEST} + {2550704400 0 0 WET} + {2563405200 3600 1 WEST} + {2582154000 0 0 WET} + {2595459600 3600 1 WEST} + {2613603600 0 0 WET} + {2626909200 3600 1 WEST} + {2645053200 0 0 WET} + {2658358800 3600 1 WEST} + {2676502800 0 0 WET} + {2689808400 3600 1 WEST} + {2708557200 0 0 WET} + {2721258000 3600 1 WEST} + {2740006800 0 0 WET} + {2752707600 3600 1 WEST} + {2771456400 0 0 WET} + {2784762000 3600 1 WEST} + {2802906000 0 0 WET} + {2816211600 3600 1 WEST} + {2834355600 0 0 WET} + {2847661200 3600 1 WEST} + {2866410000 0 0 WET} + {2879110800 3600 1 WEST} + {2897859600 0 0 WET} + {2910560400 3600 1 WEST} + {2929309200 0 0 WET} + {2942010000 3600 1 WEST} + {2960758800 0 0 WET} + {2974064400 3600 1 WEST} + {2992208400 0 0 WET} + {3005514000 3600 1 WEST} + {3023658000 0 0 WET} + {3036963600 3600 1 WEST} + {3055712400 0 0 WET} + {3068413200 3600 1 WEST} + {3087162000 0 0 WET} + {3099862800 3600 1 WEST} + {3118611600 0 0 WET} + {3131917200 3600 1 WEST} + {3150061200 0 0 WET} + {3163366800 3600 1 WEST} + {3181510800 0 0 WET} + {3194816400 3600 1 WEST} + {3212960400 0 0 WET} + {3226266000 3600 1 WEST} + {3245014800 0 0 WET} + {3257715600 3600 1 WEST} + {3276464400 0 0 WET} + {3289165200 3600 1 WEST} + {3307914000 0 0 WET} + {3321219600 3600 1 WEST} + {3339363600 0 0 WET} + {3352669200 3600 1 WEST} + {3370813200 0 0 WET} + {3384118800 3600 1 WEST} + {3402867600 0 0 WET} + {3415568400 3600 1 WEST} + {3434317200 0 0 WET} + {3447018000 3600 1 WEST} + {3465766800 0 0 WET} + {3479072400 3600 1 WEST} + {3497216400 0 0 WET} + {3510522000 3600 1 WEST} + {3528666000 0 0 WET} + {3541971600 3600 1 WEST} + {3560115600 0 0 WET} + {3573421200 3600 1 WEST} + {3592170000 0 0 WET} + {3604870800 3600 1 WEST} + {3623619600 0 0 WET} + {3636320400 3600 1 WEST} + {3655069200 0 0 WET} + {3668374800 3600 1 WEST} + {3686518800 0 0 WET} + {3699824400 3600 1 WEST} + {3717968400 0 0 WET} + {3731274000 3600 1 WEST} + {3750022800 0 0 WET} + {3762723600 3600 1 WEST} + {3781472400 0 0 WET} + {3794173200 3600 1 WEST} + {3812922000 0 0 WET} + {3825622800 3600 1 WEST} + {3844371600 0 0 WET} + {3857677200 3600 1 WEST} + {3875821200 0 0 WET} + {3889126800 3600 1 WEST} + {3907270800 0 0 WET} + {3920576400 3600 1 WEST} + {3939325200 0 0 WET} + {3952026000 3600 1 WEST} + {3970774800 0 0 WET} + {3983475600 3600 1 WEST} + {4002224400 0 0 WET} + {4015530000 3600 1 WEST} + {4033674000 0 0 WET} + {4046979600 3600 1 WEST} + {4065123600 0 0 WET} + {4078429200 3600 1 WEST} + {4096573200 0 0 WET} +} diff --git a/env/tcl/tcl8.6/tzdata/Atlantic/Reykjavik b/env/tcl/tcl8.6/tzdata/Atlantic/Reykjavik new file mode 100644 index 0000000..6270572 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Atlantic/Reykjavik @@ -0,0 +1,73 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Atlantic/Reykjavik) { + {-9223372036854775808 -5280 0 LMT} + {-1956609120 -3600 0 -01} + {-1668211200 0 1 -01} + {-1647212400 -3600 0 -01} + {-1636675200 0 1 -01} + {-1613430000 -3600 0 -01} + {-1605139200 0 1 -01} + {-1581894000 -3600 0 -01} + {-1539561600 0 1 -01} + {-1531350000 -3600 0 -01} + {-968025600 0 1 -01} + {-952293600 -3600 0 -01} + {-942008400 0 1 -01} + {-920239200 -3600 0 -01} + {-909957600 0 1 -01} + {-888789600 -3600 0 -01} + {-877903200 0 1 -01} + {-857944800 -3600 0 -01} + {-846453600 0 1 -01} + {-826495200 -3600 0 -01} + {-815004000 0 1 -01} + {-795045600 -3600 0 -01} + {-783554400 0 1 -01} + {-762991200 -3600 0 -01} + {-752104800 0 1 -01} + {-731541600 -3600 0 -01} + {-717631200 0 1 -01} + {-700092000 -3600 0 -01} + {-686181600 0 1 -01} + {-668642400 -3600 0 -01} + {-654732000 0 1 -01} + {-636588000 -3600 0 -01} + {-623282400 0 1 -01} + {-605743200 -3600 0 -01} + {-591832800 0 1 -01} + {-573688800 -3600 0 -01} + {-559778400 0 1 -01} + {-542239200 -3600 0 -01} + {-528328800 0 1 -01} + {-510789600 -3600 0 -01} + {-496879200 0 1 -01} + {-479340000 -3600 0 -01} + {-465429600 0 1 -01} + {-447890400 -3600 0 -01} + {-433980000 0 1 -01} + {-415836000 -3600 0 -01} + {-401925600 0 1 -01} + {-384386400 -3600 0 -01} + {-370476000 0 1 -01} + {-352936800 -3600 0 -01} + {-339026400 0 1 -01} + {-321487200 -3600 0 -01} + {-307576800 0 1 -01} + {-290037600 -3600 0 -01} + {-276127200 0 1 -01} + {-258588000 -3600 0 -01} + {-244677600 0 1 -01} + {-226533600 -3600 0 -01} + {-212623200 0 1 -01} + {-195084000 -3600 0 -01} + {-181173600 0 1 -01} + {-163634400 -3600 0 -01} + {-149724000 0 1 -01} + {-132184800 -3600 0 -01} + {-118274400 0 1 -01} + {-100735200 -3600 0 -01} + {-86824800 0 1 -01} + {-68680800 -3600 0 -01} + {-54770400 0 0 GMT} +} diff --git a/env/tcl/tcl8.6/tzdata/Atlantic/South_Georgia b/env/tcl/tcl8.6/tzdata/Atlantic/South_Georgia new file mode 100644 index 0000000..eb7307c --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Atlantic/South_Georgia @@ -0,0 +1,6 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Atlantic/South_Georgia) { + {-9223372036854775808 -8768 0 LMT} + {-2524512832 -7200 0 -02} +} diff --git a/env/tcl/tcl8.6/tzdata/Atlantic/St_Helena b/env/tcl/tcl8.6/tzdata/Atlantic/St_Helena new file mode 100644 index 0000000..bf36c6a --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Atlantic/St_Helena @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(Africa/Abidjan)]} { + LoadTimeZoneFile Africa/Abidjan +} +set TZData(:Atlantic/St_Helena) $TZData(:Africa/Abidjan) diff --git a/env/tcl/tcl8.6/tzdata/Atlantic/Stanley b/env/tcl/tcl8.6/tzdata/Atlantic/Stanley new file mode 100644 index 0000000..48473ca --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Atlantic/Stanley @@ -0,0 +1,75 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Atlantic/Stanley) { + {-9223372036854775808 -13884 0 LMT} + {-2524507716 -13884 0 SMT} + {-1824235716 -14400 0 -04} + {-1018209600 -10800 1 -04} + {-1003093200 -14400 0 -04} + {-986760000 -10800 1 -04} + {-971643600 -14400 0 -04} + {-954705600 -10800 1 -04} + {-939589200 -14400 0 -04} + {-923256000 -10800 1 -04} + {-908139600 -14400 0 -04} + {-891806400 -10800 1 -04} + {-876690000 -14400 0 -04} + {-860356800 -10800 1 -04} + {420606000 -7200 0 -03} + {433303200 -7200 1 -03} + {452052000 -10800 0 -03} + {464151600 -7200 1 -03} + {483501600 -10800 0 -03} + {495597600 -14400 0 -04} + {495604800 -10800 1 -04} + {514350000 -14400 0 -04} + {527054400 -10800 1 -04} + {545799600 -14400 0 -04} + {558504000 -10800 1 -04} + {577249200 -14400 0 -04} + {589953600 -10800 1 -04} + {608698800 -14400 0 -04} + {621403200 -10800 1 -04} + {640753200 -14400 0 -04} + {652852800 -10800 1 -04} + {672202800 -14400 0 -04} + {684907200 -10800 1 -04} + {703652400 -14400 0 -04} + {716356800 -10800 1 -04} + {735102000 -14400 0 -04} + {747806400 -10800 1 -04} + {766551600 -14400 0 -04} + {779256000 -10800 1 -04} + {798001200 -14400 0 -04} + {810705600 -10800 1 -04} + {830055600 -14400 0 -04} + {842760000 -10800 1 -04} + {861505200 -14400 0 -04} + {874209600 -10800 1 -04} + {892954800 -14400 0 -04} + {905659200 -10800 1 -04} + {924404400 -14400 0 -04} + {937108800 -10800 1 -04} + {955854000 -14400 0 -04} + {968558400 -10800 1 -04} + {987310800 -14400 0 -04} + {999410400 -10800 1 -04} + {1019365200 -14400 0 -04} + {1030860000 -10800 1 -04} + {1050814800 -14400 0 -04} + {1062914400 -10800 1 -04} + {1082264400 -14400 0 -04} + {1094364000 -10800 1 -04} + {1113714000 -14400 0 -04} + {1125813600 -10800 1 -04} + {1145163600 -14400 0 -04} + {1157263200 -10800 1 -04} + {1176613200 -14400 0 -04} + {1188712800 -10800 1 -04} + {1208667600 -14400 0 -04} + {1220767200 -10800 1 -04} + {1240117200 -14400 0 -04} + {1252216800 -10800 1 -04} + {1271566800 -14400 0 -04} + {1283662800 -10800 0 -03} +} diff --git a/env/tcl/tcl8.6/tzdata/Australia/ACT b/env/tcl/tcl8.6/tzdata/Australia/ACT new file mode 100644 index 0000000..f7da281 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Australia/ACT @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(Australia/Sydney)]} { + LoadTimeZoneFile Australia/Sydney +} +set TZData(:Australia/ACT) $TZData(:Australia/Sydney) diff --git a/env/tcl/tcl8.6/tzdata/Australia/Adelaide b/env/tcl/tcl8.6/tzdata/Australia/Adelaide new file mode 100644 index 0000000..7e1b04e --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Australia/Adelaide @@ -0,0 +1,273 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Australia/Adelaide) { + {-9223372036854775808 33260 0 LMT} + {-2364110060 32400 0 ACST} + {-2230189200 34200 0 ACST} + {-1672565340 37800 1 ACDT} + {-1665390600 34200 0 ACST} + {-883639800 37800 1 ACDT} + {-876126600 34200 0 ACST} + {-860398200 37800 1 ACDT} + {-844677000 34200 0 ACST} + {-828343800 37800 1 ACDT} + {-813227400 34200 0 ACST} + {31501800 34200 0 ACST} + {57688200 37800 1 ACDT} + {67969800 34200 0 ACST} + {89137800 37800 1 ACDT} + {100024200 34200 0 ACST} + {120587400 37800 1 ACDT} + {131473800 34200 0 ACST} + {152037000 37800 1 ACDT} + {162923400 34200 0 ACST} + {183486600 37800 1 ACDT} + {194977800 34200 0 ACST} + {215541000 37800 1 ACDT} + {226427400 34200 0 ACST} + {246990600 37800 1 ACDT} + {257877000 34200 0 ACST} + {278440200 37800 1 ACDT} + {289326600 34200 0 ACST} + {309889800 37800 1 ACDT} + {320776200 34200 0 ACST} + {341339400 37800 1 ACDT} + {352225800 34200 0 ACST} + {372789000 37800 1 ACDT} + {384280200 34200 0 ACST} + {404843400 37800 1 ACDT} + {415729800 34200 0 ACST} + {436293000 37800 1 ACDT} + {447179400 34200 0 ACST} + {467742600 37800 1 ACDT} + {478629000 34200 0 ACST} + {499192200 37800 1 ACDT} + {511288200 34200 0 ACST} + {530037000 37800 1 ACDT} + {542737800 34200 0 ACST} + {562091400 37800 1 ACDT} + {574792200 34200 0 ACST} + {594145800 37800 1 ACDT} + {606241800 34200 0 ACST} + {625595400 37800 1 ACDT} + {637691400 34200 0 ACST} + {657045000 37800 1 ACDT} + {667931400 34200 0 ACST} + {688494600 37800 1 ACDT} + {701195400 34200 0 ACST} + {719944200 37800 1 ACDT} + {731435400 34200 0 ACST} + {751998600 37800 1 ACDT} + {764094600 34200 0 ACST} + {783448200 37800 1 ACDT} + {796149000 34200 0 ACST} + {814897800 37800 1 ACDT} + {828203400 34200 0 ACST} + {846347400 37800 1 ACDT} + {859653000 34200 0 ACST} + {877797000 37800 1 ACDT} + {891102600 34200 0 ACST} + {909246600 37800 1 ACDT} + {922552200 34200 0 ACST} + {941301000 37800 1 ACDT} + {954001800 34200 0 ACST} + {972750600 37800 1 ACDT} + {985451400 34200 0 ACST} + {1004200200 37800 1 ACDT} + {1017505800 34200 0 ACST} + {1035649800 37800 1 ACDT} + {1048955400 34200 0 ACST} + {1067099400 37800 1 ACDT} + {1080405000 34200 0 ACST} + {1099153800 37800 1 ACDT} + {1111854600 34200 0 ACST} + {1130603400 37800 1 ACDT} + {1143909000 34200 0 ACST} + {1162053000 37800 1 ACDT} + {1174753800 34200 0 ACST} + {1193502600 37800 1 ACDT} + {1207413000 34200 0 ACST} + {1223137800 37800 1 ACDT} + {1238862600 34200 0 ACST} + {1254587400 37800 1 ACDT} + {1270312200 34200 0 ACST} + {1286037000 37800 1 ACDT} + {1301761800 34200 0 ACST} + {1317486600 37800 1 ACDT} + {1333211400 34200 0 ACST} + {1349541000 37800 1 ACDT} + {1365265800 34200 0 ACST} + {1380990600 37800 1 ACDT} + {1396715400 34200 0 ACST} + {1412440200 37800 1 ACDT} + {1428165000 34200 0 ACST} + {1443889800 37800 1 ACDT} + {1459614600 34200 0 ACST} + {1475339400 37800 1 ACDT} + {1491064200 34200 0 ACST} + {1506789000 37800 1 ACDT} + {1522513800 34200 0 ACST} + {1538843400 37800 1 ACDT} + {1554568200 34200 0 ACST} + {1570293000 37800 1 ACDT} + {1586017800 34200 0 ACST} + {1601742600 37800 1 ACDT} + {1617467400 34200 0 ACST} + {1633192200 37800 1 ACDT} + {1648917000 34200 0 ACST} + {1664641800 37800 1 ACDT} + {1680366600 34200 0 ACST} + {1696091400 37800 1 ACDT} + {1712421000 34200 0 ACST} + {1728145800 37800 1 ACDT} + {1743870600 34200 0 ACST} + {1759595400 37800 1 ACDT} + {1775320200 34200 0 ACST} + {1791045000 37800 1 ACDT} + {1806769800 34200 0 ACST} + {1822494600 37800 1 ACDT} + {1838219400 34200 0 ACST} + {1853944200 37800 1 ACDT} + {1869669000 34200 0 ACST} + {1885998600 37800 1 ACDT} + {1901723400 34200 0 ACST} + {1917448200 37800 1 ACDT} + {1933173000 34200 0 ACST} + {1948897800 37800 1 ACDT} + {1964622600 34200 0 ACST} + {1980347400 37800 1 ACDT} + {1996072200 34200 0 ACST} + {2011797000 37800 1 ACDT} + {2027521800 34200 0 ACST} + {2043246600 37800 1 ACDT} + {2058971400 34200 0 ACST} + {2075301000 37800 1 ACDT} + {2091025800 34200 0 ACST} + {2106750600 37800 1 ACDT} + {2122475400 34200 0 ACST} + {2138200200 37800 1 ACDT} + {2153925000 34200 0 ACST} + {2169649800 37800 1 ACDT} + {2185374600 34200 0 ACST} + {2201099400 37800 1 ACDT} + {2216824200 34200 0 ACST} + {2233153800 37800 1 ACDT} + {2248878600 34200 0 ACST} + {2264603400 37800 1 ACDT} + {2280328200 34200 0 ACST} + {2296053000 37800 1 ACDT} + {2311777800 34200 0 ACST} + {2327502600 37800 1 ACDT} + {2343227400 34200 0 ACST} + {2358952200 37800 1 ACDT} + {2374677000 34200 0 ACST} + {2390401800 37800 1 ACDT} + {2406126600 34200 0 ACST} + {2422456200 37800 1 ACDT} + {2438181000 34200 0 ACST} + {2453905800 37800 1 ACDT} + {2469630600 34200 0 ACST} + {2485355400 37800 1 ACDT} + {2501080200 34200 0 ACST} + {2516805000 37800 1 ACDT} + {2532529800 34200 0 ACST} + {2548254600 37800 1 ACDT} + {2563979400 34200 0 ACST} + {2579704200 37800 1 ACDT} + {2596033800 34200 0 ACST} + {2611758600 37800 1 ACDT} + {2627483400 34200 0 ACST} + {2643208200 37800 1 ACDT} + {2658933000 34200 0 ACST} + {2674657800 37800 1 ACDT} + {2690382600 34200 0 ACST} + {2706107400 37800 1 ACDT} + {2721832200 34200 0 ACST} + {2737557000 37800 1 ACDT} + {2753281800 34200 0 ACST} + {2769611400 37800 1 ACDT} + {2785336200 34200 0 ACST} + {2801061000 37800 1 ACDT} + {2816785800 34200 0 ACST} + {2832510600 37800 1 ACDT} + {2848235400 34200 0 ACST} + {2863960200 37800 1 ACDT} + {2879685000 34200 0 ACST} + {2895409800 37800 1 ACDT} + {2911134600 34200 0 ACST} + {2926859400 37800 1 ACDT} + {2942584200 34200 0 ACST} + {2958913800 37800 1 ACDT} + {2974638600 34200 0 ACST} + {2990363400 37800 1 ACDT} + {3006088200 34200 0 ACST} + {3021813000 37800 1 ACDT} + {3037537800 34200 0 ACST} + {3053262600 37800 1 ACDT} + {3068987400 34200 0 ACST} + {3084712200 37800 1 ACDT} + {3100437000 34200 0 ACST} + {3116766600 37800 1 ACDT} + {3132491400 34200 0 ACST} + {3148216200 37800 1 ACDT} + {3163941000 34200 0 ACST} + {3179665800 37800 1 ACDT} + {3195390600 34200 0 ACST} + {3211115400 37800 1 ACDT} + {3226840200 34200 0 ACST} + {3242565000 37800 1 ACDT} + {3258289800 34200 0 ACST} + {3274014600 37800 1 ACDT} + {3289739400 34200 0 ACST} + {3306069000 37800 1 ACDT} + {3321793800 34200 0 ACST} + {3337518600 37800 1 ACDT} + {3353243400 34200 0 ACST} + {3368968200 37800 1 ACDT} + {3384693000 34200 0 ACST} + {3400417800 37800 1 ACDT} + {3416142600 34200 0 ACST} + {3431867400 37800 1 ACDT} + {3447592200 34200 0 ACST} + {3463317000 37800 1 ACDT} + {3479646600 34200 0 ACST} + {3495371400 37800 1 ACDT} + {3511096200 34200 0 ACST} + {3526821000 37800 1 ACDT} + {3542545800 34200 0 ACST} + {3558270600 37800 1 ACDT} + {3573995400 34200 0 ACST} + {3589720200 37800 1 ACDT} + {3605445000 34200 0 ACST} + {3621169800 37800 1 ACDT} + {3636894600 34200 0 ACST} + {3653224200 37800 1 ACDT} + {3668949000 34200 0 ACST} + {3684673800 37800 1 ACDT} + {3700398600 34200 0 ACST} + {3716123400 37800 1 ACDT} + {3731848200 34200 0 ACST} + {3747573000 37800 1 ACDT} + {3763297800 34200 0 ACST} + {3779022600 37800 1 ACDT} + {3794747400 34200 0 ACST} + {3810472200 37800 1 ACDT} + {3826197000 34200 0 ACST} + {3842526600 37800 1 ACDT} + {3858251400 34200 0 ACST} + {3873976200 37800 1 ACDT} + {3889701000 34200 0 ACST} + {3905425800 37800 1 ACDT} + {3921150600 34200 0 ACST} + {3936875400 37800 1 ACDT} + {3952600200 34200 0 ACST} + {3968325000 37800 1 ACDT} + {3984049800 34200 0 ACST} + {4000379400 37800 1 ACDT} + {4016104200 34200 0 ACST} + {4031829000 37800 1 ACDT} + {4047553800 34200 0 ACST} + {4063278600 37800 1 ACDT} + {4079003400 34200 0 ACST} + {4094728200 37800 1 ACDT} +} diff --git a/env/tcl/tcl8.6/tzdata/Australia/Brisbane b/env/tcl/tcl8.6/tzdata/Australia/Brisbane new file mode 100644 index 0000000..8422ae6 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Australia/Brisbane @@ -0,0 +1,23 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Australia/Brisbane) { + {-9223372036854775808 36728 0 LMT} + {-2366791928 36000 0 AEST} + {-1672567140 39600 1 AEDT} + {-1665392400 36000 0 AEST} + {-883641600 39600 1 AEDT} + {-876128400 36000 0 AEST} + {-860400000 39600 1 AEDT} + {-844678800 36000 0 AEST} + {-828345600 39600 1 AEDT} + {-813229200 36000 0 AEST} + {31500000 36000 0 AEST} + {57686400 39600 1 AEDT} + {67968000 36000 0 AEST} + {625593600 39600 1 AEDT} + {636480000 36000 0 AEST} + {657043200 39600 1 AEDT} + {667929600 36000 0 AEST} + {688492800 39600 1 AEDT} + {699379200 36000 0 AEST} +} diff --git a/env/tcl/tcl8.6/tzdata/Australia/Broken_Hill b/env/tcl/tcl8.6/tzdata/Australia/Broken_Hill new file mode 100644 index 0000000..c428061 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Australia/Broken_Hill @@ -0,0 +1,275 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Australia/Broken_Hill) { + {-9223372036854775808 33948 0 LMT} + {-2364110748 36000 0 AEST} + {-2314951200 32400 0 ACST} + {-2230189200 34200 0 ACST} + {-1672565340 37800 1 ACDT} + {-1665390600 34200 0 ACST} + {-883639800 37800 1 ACDT} + {-876126600 34200 0 ACST} + {-860398200 37800 1 ACDT} + {-844677000 34200 0 ACST} + {-828343800 37800 1 ACDT} + {-813227400 34200 0 ACST} + {31501800 34200 0 ACST} + {57688200 37800 1 ACDT} + {67969800 34200 0 ACST} + {89137800 37800 1 ACDT} + {100024200 34200 0 ACST} + {120587400 37800 1 ACDT} + {131473800 34200 0 ACST} + {152037000 37800 1 ACDT} + {162923400 34200 0 ACST} + {183486600 37800 1 ACDT} + {194977800 34200 0 ACST} + {215541000 37800 1 ACDT} + {226427400 34200 0 ACST} + {246990600 37800 1 ACDT} + {257877000 34200 0 ACST} + {278440200 37800 1 ACDT} + {289326600 34200 0 ACST} + {309889800 37800 1 ACDT} + {320776200 34200 0 ACST} + {341339400 37800 1 ACDT} + {352225800 34200 0 ACST} + {372789000 37800 1 ACDT} + {386699400 34200 0 ACST} + {404843400 37800 1 ACDT} + {415729800 34200 0 ACST} + {436293000 37800 1 ACDT} + {447179400 34200 0 ACST} + {467742600 37800 1 ACDT} + {478629000 34200 0 ACST} + {499192200 37800 1 ACDT} + {511288200 34200 0 ACST} + {530037000 37800 1 ACDT} + {542737800 34200 0 ACST} + {562091400 37800 1 ACDT} + {574792200 34200 0 ACST} + {594145800 37800 1 ACDT} + {606241800 34200 0 ACST} + {625595400 37800 1 ACDT} + {636481800 34200 0 ACST} + {657045000 37800 1 ACDT} + {667931400 34200 0 ACST} + {688494600 37800 1 ACDT} + {699381000 34200 0 ACST} + {719944200 37800 1 ACDT} + {731435400 34200 0 ACST} + {751998600 37800 1 ACDT} + {762885000 34200 0 ACST} + {783448200 37800 1 ACDT} + {794334600 34200 0 ACST} + {814897800 37800 1 ACDT} + {828203400 34200 0 ACST} + {846347400 37800 1 ACDT} + {859653000 34200 0 ACST} + {877797000 37800 1 ACDT} + {891102600 34200 0 ACST} + {909246600 37800 1 ACDT} + {922552200 34200 0 ACST} + {941301000 37800 1 ACDT} + {946647000 37800 0 ACST} + {954001800 34200 0 ACST} + {972750600 37800 1 ACDT} + {985451400 34200 0 ACST} + {1004200200 37800 1 ACDT} + {1017505800 34200 0 ACST} + {1035649800 37800 1 ACDT} + {1048955400 34200 0 ACST} + {1067099400 37800 1 ACDT} + {1080405000 34200 0 ACST} + {1099153800 37800 1 ACDT} + {1111854600 34200 0 ACST} + {1130603400 37800 1 ACDT} + {1143909000 34200 0 ACST} + {1162053000 37800 1 ACDT} + {1174753800 34200 0 ACST} + {1193502600 37800 1 ACDT} + {1207413000 34200 0 ACST} + {1223137800 37800 1 ACDT} + {1238862600 34200 0 ACST} + {1254587400 37800 1 ACDT} + {1270312200 34200 0 ACST} + {1286037000 37800 1 ACDT} + {1301761800 34200 0 ACST} + {1317486600 37800 1 ACDT} + {1333211400 34200 0 ACST} + {1349541000 37800 1 ACDT} + {1365265800 34200 0 ACST} + {1380990600 37800 1 ACDT} + {1396715400 34200 0 ACST} + {1412440200 37800 1 ACDT} + {1428165000 34200 0 ACST} + {1443889800 37800 1 ACDT} + {1459614600 34200 0 ACST} + {1475339400 37800 1 ACDT} + {1491064200 34200 0 ACST} + {1506789000 37800 1 ACDT} + {1522513800 34200 0 ACST} + {1538843400 37800 1 ACDT} + {1554568200 34200 0 ACST} + {1570293000 37800 1 ACDT} + {1586017800 34200 0 ACST} + {1601742600 37800 1 ACDT} + {1617467400 34200 0 ACST} + {1633192200 37800 1 ACDT} + {1648917000 34200 0 ACST} + {1664641800 37800 1 ACDT} + {1680366600 34200 0 ACST} + {1696091400 37800 1 ACDT} + {1712421000 34200 0 ACST} + {1728145800 37800 1 ACDT} + {1743870600 34200 0 ACST} + {1759595400 37800 1 ACDT} + {1775320200 34200 0 ACST} + {1791045000 37800 1 ACDT} + {1806769800 34200 0 ACST} + {1822494600 37800 1 ACDT} + {1838219400 34200 0 ACST} + {1853944200 37800 1 ACDT} + {1869669000 34200 0 ACST} + {1885998600 37800 1 ACDT} + {1901723400 34200 0 ACST} + {1917448200 37800 1 ACDT} + {1933173000 34200 0 ACST} + {1948897800 37800 1 ACDT} + {1964622600 34200 0 ACST} + {1980347400 37800 1 ACDT} + {1996072200 34200 0 ACST} + {2011797000 37800 1 ACDT} + {2027521800 34200 0 ACST} + {2043246600 37800 1 ACDT} + {2058971400 34200 0 ACST} + {2075301000 37800 1 ACDT} + {2091025800 34200 0 ACST} + {2106750600 37800 1 ACDT} + {2122475400 34200 0 ACST} + {2138200200 37800 1 ACDT} + {2153925000 34200 0 ACST} + {2169649800 37800 1 ACDT} + {2185374600 34200 0 ACST} + {2201099400 37800 1 ACDT} + {2216824200 34200 0 ACST} + {2233153800 37800 1 ACDT} + {2248878600 34200 0 ACST} + {2264603400 37800 1 ACDT} + {2280328200 34200 0 ACST} + {2296053000 37800 1 ACDT} + {2311777800 34200 0 ACST} + {2327502600 37800 1 ACDT} + {2343227400 34200 0 ACST} + {2358952200 37800 1 ACDT} + {2374677000 34200 0 ACST} + {2390401800 37800 1 ACDT} + {2406126600 34200 0 ACST} + {2422456200 37800 1 ACDT} + {2438181000 34200 0 ACST} + {2453905800 37800 1 ACDT} + {2469630600 34200 0 ACST} + {2485355400 37800 1 ACDT} + {2501080200 34200 0 ACST} + {2516805000 37800 1 ACDT} + {2532529800 34200 0 ACST} + {2548254600 37800 1 ACDT} + {2563979400 34200 0 ACST} + {2579704200 37800 1 ACDT} + {2596033800 34200 0 ACST} + {2611758600 37800 1 ACDT} + {2627483400 34200 0 ACST} + {2643208200 37800 1 ACDT} + {2658933000 34200 0 ACST} + {2674657800 37800 1 ACDT} + {2690382600 34200 0 ACST} + {2706107400 37800 1 ACDT} + {2721832200 34200 0 ACST} + {2737557000 37800 1 ACDT} + {2753281800 34200 0 ACST} + {2769611400 37800 1 ACDT} + {2785336200 34200 0 ACST} + {2801061000 37800 1 ACDT} + {2816785800 34200 0 ACST} + {2832510600 37800 1 ACDT} + {2848235400 34200 0 ACST} + {2863960200 37800 1 ACDT} + {2879685000 34200 0 ACST} + {2895409800 37800 1 ACDT} + {2911134600 34200 0 ACST} + {2926859400 37800 1 ACDT} + {2942584200 34200 0 ACST} + {2958913800 37800 1 ACDT} + {2974638600 34200 0 ACST} + {2990363400 37800 1 ACDT} + {3006088200 34200 0 ACST} + {3021813000 37800 1 ACDT} + {3037537800 34200 0 ACST} + {3053262600 37800 1 ACDT} + {3068987400 34200 0 ACST} + {3084712200 37800 1 ACDT} + {3100437000 34200 0 ACST} + {3116766600 37800 1 ACDT} + {3132491400 34200 0 ACST} + {3148216200 37800 1 ACDT} + {3163941000 34200 0 ACST} + {3179665800 37800 1 ACDT} + {3195390600 34200 0 ACST} + {3211115400 37800 1 ACDT} + {3226840200 34200 0 ACST} + {3242565000 37800 1 ACDT} + {3258289800 34200 0 ACST} + {3274014600 37800 1 ACDT} + {3289739400 34200 0 ACST} + {3306069000 37800 1 ACDT} + {3321793800 34200 0 ACST} + {3337518600 37800 1 ACDT} + {3353243400 34200 0 ACST} + {3368968200 37800 1 ACDT} + {3384693000 34200 0 ACST} + {3400417800 37800 1 ACDT} + {3416142600 34200 0 ACST} + {3431867400 37800 1 ACDT} + {3447592200 34200 0 ACST} + {3463317000 37800 1 ACDT} + {3479646600 34200 0 ACST} + {3495371400 37800 1 ACDT} + {3511096200 34200 0 ACST} + {3526821000 37800 1 ACDT} + {3542545800 34200 0 ACST} + {3558270600 37800 1 ACDT} + {3573995400 34200 0 ACST} + {3589720200 37800 1 ACDT} + {3605445000 34200 0 ACST} + {3621169800 37800 1 ACDT} + {3636894600 34200 0 ACST} + {3653224200 37800 1 ACDT} + {3668949000 34200 0 ACST} + {3684673800 37800 1 ACDT} + {3700398600 34200 0 ACST} + {3716123400 37800 1 ACDT} + {3731848200 34200 0 ACST} + {3747573000 37800 1 ACDT} + {3763297800 34200 0 ACST} + {3779022600 37800 1 ACDT} + {3794747400 34200 0 ACST} + {3810472200 37800 1 ACDT} + {3826197000 34200 0 ACST} + {3842526600 37800 1 ACDT} + {3858251400 34200 0 ACST} + {3873976200 37800 1 ACDT} + {3889701000 34200 0 ACST} + {3905425800 37800 1 ACDT} + {3921150600 34200 0 ACST} + {3936875400 37800 1 ACDT} + {3952600200 34200 0 ACST} + {3968325000 37800 1 ACDT} + {3984049800 34200 0 ACST} + {4000379400 37800 1 ACDT} + {4016104200 34200 0 ACST} + {4031829000 37800 1 ACDT} + {4047553800 34200 0 ACST} + {4063278600 37800 1 ACDT} + {4079003400 34200 0 ACST} + {4094728200 37800 1 ACDT} +} diff --git a/env/tcl/tcl8.6/tzdata/Australia/Canberra b/env/tcl/tcl8.6/tzdata/Australia/Canberra new file mode 100644 index 0000000..0b7b9ca --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Australia/Canberra @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(Australia/Sydney)]} { + LoadTimeZoneFile Australia/Sydney +} +set TZData(:Australia/Canberra) $TZData(:Australia/Sydney) diff --git a/env/tcl/tcl8.6/tzdata/Australia/Currie b/env/tcl/tcl8.6/tzdata/Australia/Currie new file mode 100644 index 0000000..936327b --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Australia/Currie @@ -0,0 +1,273 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Australia/Currie) { + {-9223372036854775808 34528 0 LMT} + {-2345794528 36000 0 AEST} + {-1680508800 39600 1 AEDT} + {-1669892400 39600 0 AEDT} + {-1665392400 36000 0 AEST} + {-883641600 39600 1 AEDT} + {-876128400 36000 0 AEST} + {-860400000 39600 1 AEDT} + {-844678800 36000 0 AEST} + {-828345600 39600 1 AEDT} + {-813229200 36000 0 AEST} + {47138400 36000 0 AEST} + {57686400 39600 1 AEDT} + {67968000 36000 0 AEST} + {89136000 39600 1 AEDT} + {100022400 36000 0 AEST} + {120585600 39600 1 AEDT} + {131472000 36000 0 AEST} + {152035200 39600 1 AEDT} + {162921600 36000 0 AEST} + {183484800 39600 1 AEDT} + {194976000 36000 0 AEST} + {215539200 39600 1 AEDT} + {226425600 36000 0 AEST} + {246988800 39600 1 AEDT} + {257875200 36000 0 AEST} + {278438400 39600 1 AEDT} + {289324800 36000 0 AEST} + {309888000 39600 1 AEDT} + {320774400 36000 0 AEST} + {341337600 39600 1 AEDT} + {352224000 36000 0 AEST} + {372787200 39600 1 AEDT} + {386092800 36000 0 AEST} + {404841600 39600 1 AEDT} + {417542400 36000 0 AEST} + {436291200 39600 1 AEDT} + {447177600 36000 0 AEST} + {467740800 39600 1 AEDT} + {478627200 36000 0 AEST} + {499190400 39600 1 AEDT} + {510076800 36000 0 AEST} + {530035200 39600 1 AEDT} + {542736000 36000 0 AEST} + {562089600 39600 1 AEDT} + {574790400 36000 0 AEST} + {594144000 39600 1 AEDT} + {606240000 36000 0 AEST} + {625593600 39600 1 AEDT} + {637689600 36000 0 AEST} + {657043200 39600 1 AEDT} + {670348800 36000 0 AEST} + {686678400 39600 1 AEDT} + {701798400 36000 0 AEST} + {718128000 39600 1 AEDT} + {733248000 36000 0 AEST} + {749577600 39600 1 AEDT} + {764697600 36000 0 AEST} + {781027200 39600 1 AEDT} + {796147200 36000 0 AEST} + {812476800 39600 1 AEDT} + {828201600 36000 0 AEST} + {844531200 39600 1 AEDT} + {859651200 36000 0 AEST} + {875980800 39600 1 AEDT} + {891100800 36000 0 AEST} + {907430400 39600 1 AEDT} + {922550400 36000 0 AEST} + {938880000 39600 1 AEDT} + {954000000 36000 0 AEST} + {967305600 39600 1 AEDT} + {985449600 36000 0 AEST} + {1002384000 39600 1 AEDT} + {1017504000 36000 0 AEST} + {1033833600 39600 1 AEDT} + {1048953600 36000 0 AEST} + {1065283200 39600 1 AEDT} + {1080403200 36000 0 AEST} + {1096732800 39600 1 AEDT} + {1111852800 36000 0 AEST} + {1128182400 39600 1 AEDT} + {1143907200 36000 0 AEST} + {1159632000 39600 1 AEDT} + {1174752000 36000 0 AEST} + {1191686400 39600 1 AEDT} + {1207411200 36000 0 AEST} + {1223136000 39600 1 AEDT} + {1238860800 36000 0 AEST} + {1254585600 39600 1 AEDT} + {1270310400 36000 0 AEST} + {1286035200 39600 1 AEDT} + {1301760000 36000 0 AEST} + {1317484800 39600 1 AEDT} + {1333209600 36000 0 AEST} + {1349539200 39600 1 AEDT} + {1365264000 36000 0 AEST} + {1380988800 39600 1 AEDT} + {1396713600 36000 0 AEST} + {1412438400 39600 1 AEDT} + {1428163200 36000 0 AEST} + {1443888000 39600 1 AEDT} + {1459612800 36000 0 AEST} + {1475337600 39600 1 AEDT} + {1491062400 36000 0 AEST} + {1506787200 39600 1 AEDT} + {1522512000 36000 0 AEST} + {1538841600 39600 1 AEDT} + {1554566400 36000 0 AEST} + {1570291200 39600 1 AEDT} + {1586016000 36000 0 AEST} + {1601740800 39600 1 AEDT} + {1617465600 36000 0 AEST} + {1633190400 39600 1 AEDT} + {1648915200 36000 0 AEST} + {1664640000 39600 1 AEDT} + {1680364800 36000 0 AEST} + {1696089600 39600 1 AEDT} + {1712419200 36000 0 AEST} + {1728144000 39600 1 AEDT} + {1743868800 36000 0 AEST} + {1759593600 39600 1 AEDT} + {1775318400 36000 0 AEST} + {1791043200 39600 1 AEDT} + {1806768000 36000 0 AEST} + {1822492800 39600 1 AEDT} + {1838217600 36000 0 AEST} + {1853942400 39600 1 AEDT} + {1869667200 36000 0 AEST} + {1885996800 39600 1 AEDT} + {1901721600 36000 0 AEST} + {1917446400 39600 1 AEDT} + {1933171200 36000 0 AEST} + {1948896000 39600 1 AEDT} + {1964620800 36000 0 AEST} + {1980345600 39600 1 AEDT} + {1996070400 36000 0 AEST} + {2011795200 39600 1 AEDT} + {2027520000 36000 0 AEST} + {2043244800 39600 1 AEDT} + {2058969600 36000 0 AEST} + {2075299200 39600 1 AEDT} + {2091024000 36000 0 AEST} + {2106748800 39600 1 AEDT} + {2122473600 36000 0 AEST} + {2138198400 39600 1 AEDT} + {2153923200 36000 0 AEST} + {2169648000 39600 1 AEDT} + {2185372800 36000 0 AEST} + {2201097600 39600 1 AEDT} + {2216822400 36000 0 AEST} + {2233152000 39600 1 AEDT} + {2248876800 36000 0 AEST} + {2264601600 39600 1 AEDT} + {2280326400 36000 0 AEST} + {2296051200 39600 1 AEDT} + {2311776000 36000 0 AEST} + {2327500800 39600 1 AEDT} + {2343225600 36000 0 AEST} + {2358950400 39600 1 AEDT} + {2374675200 36000 0 AEST} + {2390400000 39600 1 AEDT} + {2406124800 36000 0 AEST} + {2422454400 39600 1 AEDT} + {2438179200 36000 0 AEST} + {2453904000 39600 1 AEDT} + {2469628800 36000 0 AEST} + {2485353600 39600 1 AEDT} + {2501078400 36000 0 AEST} + {2516803200 39600 1 AEDT} + {2532528000 36000 0 AEST} + {2548252800 39600 1 AEDT} + {2563977600 36000 0 AEST} + {2579702400 39600 1 AEDT} + {2596032000 36000 0 AEST} + {2611756800 39600 1 AEDT} + {2627481600 36000 0 AEST} + {2643206400 39600 1 AEDT} + {2658931200 36000 0 AEST} + {2674656000 39600 1 AEDT} + {2690380800 36000 0 AEST} + {2706105600 39600 1 AEDT} + {2721830400 36000 0 AEST} + {2737555200 39600 1 AEDT} + {2753280000 36000 0 AEST} + {2769609600 39600 1 AEDT} + {2785334400 36000 0 AEST} + {2801059200 39600 1 AEDT} + {2816784000 36000 0 AEST} + {2832508800 39600 1 AEDT} + {2848233600 36000 0 AEST} + {2863958400 39600 1 AEDT} + {2879683200 36000 0 AEST} + {2895408000 39600 1 AEDT} + {2911132800 36000 0 AEST} + {2926857600 39600 1 AEDT} + {2942582400 36000 0 AEST} + {2958912000 39600 1 AEDT} + {2974636800 36000 0 AEST} + {2990361600 39600 1 AEDT} + {3006086400 36000 0 AEST} + {3021811200 39600 1 AEDT} + {3037536000 36000 0 AEST} + {3053260800 39600 1 AEDT} + {3068985600 36000 0 AEST} + {3084710400 39600 1 AEDT} + {3100435200 36000 0 AEST} + {3116764800 39600 1 AEDT} + {3132489600 36000 0 AEST} + {3148214400 39600 1 AEDT} + {3163939200 36000 0 AEST} + {3179664000 39600 1 AEDT} + {3195388800 36000 0 AEST} + {3211113600 39600 1 AEDT} + {3226838400 36000 0 AEST} + {3242563200 39600 1 AEDT} + {3258288000 36000 0 AEST} + {3274012800 39600 1 AEDT} + {3289737600 36000 0 AEST} + {3306067200 39600 1 AEDT} + {3321792000 36000 0 AEST} + {3337516800 39600 1 AEDT} + {3353241600 36000 0 AEST} + {3368966400 39600 1 AEDT} + {3384691200 36000 0 AEST} + {3400416000 39600 1 AEDT} + {3416140800 36000 0 AEST} + {3431865600 39600 1 AEDT} + {3447590400 36000 0 AEST} + {3463315200 39600 1 AEDT} + {3479644800 36000 0 AEST} + {3495369600 39600 1 AEDT} + {3511094400 36000 0 AEST} + {3526819200 39600 1 AEDT} + {3542544000 36000 0 AEST} + {3558268800 39600 1 AEDT} + {3573993600 36000 0 AEST} + {3589718400 39600 1 AEDT} + {3605443200 36000 0 AEST} + {3621168000 39600 1 AEDT} + {3636892800 36000 0 AEST} + {3653222400 39600 1 AEDT} + {3668947200 36000 0 AEST} + {3684672000 39600 1 AEDT} + {3700396800 36000 0 AEST} + {3716121600 39600 1 AEDT} + {3731846400 36000 0 AEST} + {3747571200 39600 1 AEDT} + {3763296000 36000 0 AEST} + {3779020800 39600 1 AEDT} + {3794745600 36000 0 AEST} + {3810470400 39600 1 AEDT} + {3826195200 36000 0 AEST} + {3842524800 39600 1 AEDT} + {3858249600 36000 0 AEST} + {3873974400 39600 1 AEDT} + {3889699200 36000 0 AEST} + {3905424000 39600 1 AEDT} + {3921148800 36000 0 AEST} + {3936873600 39600 1 AEDT} + {3952598400 36000 0 AEST} + {3968323200 39600 1 AEDT} + {3984048000 36000 0 AEST} + {4000377600 39600 1 AEDT} + {4016102400 36000 0 AEST} + {4031827200 39600 1 AEDT} + {4047552000 36000 0 AEST} + {4063276800 39600 1 AEDT} + {4079001600 36000 0 AEST} + {4094726400 39600 1 AEDT} +} diff --git a/env/tcl/tcl8.6/tzdata/Australia/Darwin b/env/tcl/tcl8.6/tzdata/Australia/Darwin new file mode 100644 index 0000000..e77605d --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Australia/Darwin @@ -0,0 +1,15 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Australia/Darwin) { + {-9223372036854775808 31400 0 LMT} + {-2364108200 32400 0 ACST} + {-2230189200 34200 0 ACST} + {-1672565340 37800 1 ACDT} + {-1665390600 34200 0 ACST} + {-883639800 37800 1 ACDT} + {-876126600 34200 0 ACST} + {-860398200 37800 1 ACDT} + {-844677000 34200 0 ACST} + {-828343800 37800 1 ACDT} + {-813227400 34200 0 ACST} +} diff --git a/env/tcl/tcl8.6/tzdata/Australia/Eucla b/env/tcl/tcl8.6/tzdata/Australia/Eucla new file mode 100644 index 0000000..8008980 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Australia/Eucla @@ -0,0 +1,25 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Australia/Eucla) { + {-9223372036854775808 30928 0 LMT} + {-2337928528 31500 0 +0945} + {-1672562640 35100 1 +0945} + {-1665387900 31500 0 +0945} + {-883637100 35100 1 +0945} + {-876123900 31500 0 +0945} + {-860395500 35100 1 +0945} + {-844674300 31500 0 +0945} + {-836473500 35100 0 +0945} + {152039700 35100 1 +0945} + {162926100 31500 0 +0945} + {436295700 35100 1 +0945} + {447182100 31500 0 +0945} + {690311700 35100 1 +0945} + {699383700 31500 0 +0945} + {1165079700 35100 1 +0945} + {1174756500 31500 0 +0945} + {1193505300 35100 1 +0945} + {1206810900 31500 0 +0945} + {1224954900 35100 1 +0945} + {1238260500 31500 0 +0945} +} diff --git a/env/tcl/tcl8.6/tzdata/Australia/Hobart b/env/tcl/tcl8.6/tzdata/Australia/Hobart new file mode 100644 index 0000000..bf5adf0 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Australia/Hobart @@ -0,0 +1,281 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Australia/Hobart) { + {-9223372036854775808 35356 0 LMT} + {-2345795356 36000 0 AEST} + {-1680508800 39600 1 AEDT} + {-1669892400 39600 0 AEDT} + {-1665392400 36000 0 AEST} + {-883641600 39600 1 AEDT} + {-876128400 36000 0 AEST} + {-860400000 39600 1 AEDT} + {-844678800 36000 0 AEST} + {-828345600 39600 1 AEDT} + {-813229200 36000 0 AEST} + {-94730400 36000 0 AEST} + {-71136000 39600 1 AEDT} + {-55411200 36000 0 AEST} + {-37267200 39600 1 AEDT} + {-25776000 36000 0 AEST} + {-5817600 39600 1 AEDT} + {5673600 36000 0 AEST} + {25632000 39600 1 AEDT} + {37728000 36000 0 AEST} + {57686400 39600 1 AEDT} + {67968000 36000 0 AEST} + {89136000 39600 1 AEDT} + {100022400 36000 0 AEST} + {120585600 39600 1 AEDT} + {131472000 36000 0 AEST} + {152035200 39600 1 AEDT} + {162921600 36000 0 AEST} + {183484800 39600 1 AEDT} + {194976000 36000 0 AEST} + {215539200 39600 1 AEDT} + {226425600 36000 0 AEST} + {246988800 39600 1 AEDT} + {257875200 36000 0 AEST} + {278438400 39600 1 AEDT} + {289324800 36000 0 AEST} + {309888000 39600 1 AEDT} + {320774400 36000 0 AEST} + {341337600 39600 1 AEDT} + {352224000 36000 0 AEST} + {372787200 39600 1 AEDT} + {386092800 36000 0 AEST} + {404841600 39600 1 AEDT} + {417542400 36000 0 AEST} + {436291200 39600 1 AEDT} + {447177600 36000 0 AEST} + {467740800 39600 1 AEDT} + {478627200 36000 0 AEST} + {499190400 39600 1 AEDT} + {510076800 36000 0 AEST} + {530035200 39600 1 AEDT} + {542736000 36000 0 AEST} + {562089600 39600 1 AEDT} + {574790400 36000 0 AEST} + {594144000 39600 1 AEDT} + {606240000 36000 0 AEST} + {625593600 39600 1 AEDT} + {637689600 36000 0 AEST} + {657043200 39600 1 AEDT} + {670348800 36000 0 AEST} + {686678400 39600 1 AEDT} + {701798400 36000 0 AEST} + {718128000 39600 1 AEDT} + {733248000 36000 0 AEST} + {749577600 39600 1 AEDT} + {764697600 36000 0 AEST} + {781027200 39600 1 AEDT} + {796147200 36000 0 AEST} + {812476800 39600 1 AEDT} + {828201600 36000 0 AEST} + {844531200 39600 1 AEDT} + {859651200 36000 0 AEST} + {875980800 39600 1 AEDT} + {891100800 36000 0 AEST} + {907430400 39600 1 AEDT} + {922550400 36000 0 AEST} + {938880000 39600 1 AEDT} + {954000000 36000 0 AEST} + {967305600 39600 1 AEDT} + {985449600 36000 0 AEST} + {1002384000 39600 1 AEDT} + {1017504000 36000 0 AEST} + {1033833600 39600 1 AEDT} + {1048953600 36000 0 AEST} + {1065283200 39600 1 AEDT} + {1080403200 36000 0 AEST} + {1096732800 39600 1 AEDT} + {1111852800 36000 0 AEST} + {1128182400 39600 1 AEDT} + {1143907200 36000 0 AEST} + {1159632000 39600 1 AEDT} + {1174752000 36000 0 AEST} + {1191686400 39600 1 AEDT} + {1207411200 36000 0 AEST} + {1223136000 39600 1 AEDT} + {1238860800 36000 0 AEST} + {1254585600 39600 1 AEDT} + {1270310400 36000 0 AEST} + {1286035200 39600 1 AEDT} + {1301760000 36000 0 AEST} + {1317484800 39600 1 AEDT} + {1333209600 36000 0 AEST} + {1349539200 39600 1 AEDT} + {1365264000 36000 0 AEST} + {1380988800 39600 1 AEDT} + {1396713600 36000 0 AEST} + {1412438400 39600 1 AEDT} + {1428163200 36000 0 AEST} + {1443888000 39600 1 AEDT} + {1459612800 36000 0 AEST} + {1475337600 39600 1 AEDT} + {1491062400 36000 0 AEST} + {1506787200 39600 1 AEDT} + {1522512000 36000 0 AEST} + {1538841600 39600 1 AEDT} + {1554566400 36000 0 AEST} + {1570291200 39600 1 AEDT} + {1586016000 36000 0 AEST} + {1601740800 39600 1 AEDT} + {1617465600 36000 0 AEST} + {1633190400 39600 1 AEDT} + {1648915200 36000 0 AEST} + {1664640000 39600 1 AEDT} + {1680364800 36000 0 AEST} + {1696089600 39600 1 AEDT} + {1712419200 36000 0 AEST} + {1728144000 39600 1 AEDT} + {1743868800 36000 0 AEST} + {1759593600 39600 1 AEDT} + {1775318400 36000 0 AEST} + {1791043200 39600 1 AEDT} + {1806768000 36000 0 AEST} + {1822492800 39600 1 AEDT} + {1838217600 36000 0 AEST} + {1853942400 39600 1 AEDT} + {1869667200 36000 0 AEST} + {1885996800 39600 1 AEDT} + {1901721600 36000 0 AEST} + {1917446400 39600 1 AEDT} + {1933171200 36000 0 AEST} + {1948896000 39600 1 AEDT} + {1964620800 36000 0 AEST} + {1980345600 39600 1 AEDT} + {1996070400 36000 0 AEST} + {2011795200 39600 1 AEDT} + {2027520000 36000 0 AEST} + {2043244800 39600 1 AEDT} + {2058969600 36000 0 AEST} + {2075299200 39600 1 AEDT} + {2091024000 36000 0 AEST} + {2106748800 39600 1 AEDT} + {2122473600 36000 0 AEST} + {2138198400 39600 1 AEDT} + {2153923200 36000 0 AEST} + {2169648000 39600 1 AEDT} + {2185372800 36000 0 AEST} + {2201097600 39600 1 AEDT} + {2216822400 36000 0 AEST} + {2233152000 39600 1 AEDT} + {2248876800 36000 0 AEST} + {2264601600 39600 1 AEDT} + {2280326400 36000 0 AEST} + {2296051200 39600 1 AEDT} + {2311776000 36000 0 AEST} + {2327500800 39600 1 AEDT} + {2343225600 36000 0 AEST} + {2358950400 39600 1 AEDT} + {2374675200 36000 0 AEST} + {2390400000 39600 1 AEDT} + {2406124800 36000 0 AEST} + {2422454400 39600 1 AEDT} + {2438179200 36000 0 AEST} + {2453904000 39600 1 AEDT} + {2469628800 36000 0 AEST} + {2485353600 39600 1 AEDT} + {2501078400 36000 0 AEST} + {2516803200 39600 1 AEDT} + {2532528000 36000 0 AEST} + {2548252800 39600 1 AEDT} + {2563977600 36000 0 AEST} + {2579702400 39600 1 AEDT} + {2596032000 36000 0 AEST} + {2611756800 39600 1 AEDT} + {2627481600 36000 0 AEST} + {2643206400 39600 1 AEDT} + {2658931200 36000 0 AEST} + {2674656000 39600 1 AEDT} + {2690380800 36000 0 AEST} + {2706105600 39600 1 AEDT} + {2721830400 36000 0 AEST} + {2737555200 39600 1 AEDT} + {2753280000 36000 0 AEST} + {2769609600 39600 1 AEDT} + {2785334400 36000 0 AEST} + {2801059200 39600 1 AEDT} + {2816784000 36000 0 AEST} + {2832508800 39600 1 AEDT} + {2848233600 36000 0 AEST} + {2863958400 39600 1 AEDT} + {2879683200 36000 0 AEST} + {2895408000 39600 1 AEDT} + {2911132800 36000 0 AEST} + {2926857600 39600 1 AEDT} + {2942582400 36000 0 AEST} + {2958912000 39600 1 AEDT} + {2974636800 36000 0 AEST} + {2990361600 39600 1 AEDT} + {3006086400 36000 0 AEST} + {3021811200 39600 1 AEDT} + {3037536000 36000 0 AEST} + {3053260800 39600 1 AEDT} + {3068985600 36000 0 AEST} + {3084710400 39600 1 AEDT} + {3100435200 36000 0 AEST} + {3116764800 39600 1 AEDT} + {3132489600 36000 0 AEST} + {3148214400 39600 1 AEDT} + {3163939200 36000 0 AEST} + {3179664000 39600 1 AEDT} + {3195388800 36000 0 AEST} + {3211113600 39600 1 AEDT} + {3226838400 36000 0 AEST} + {3242563200 39600 1 AEDT} + {3258288000 36000 0 AEST} + {3274012800 39600 1 AEDT} + {3289737600 36000 0 AEST} + {3306067200 39600 1 AEDT} + {3321792000 36000 0 AEST} + {3337516800 39600 1 AEDT} + {3353241600 36000 0 AEST} + {3368966400 39600 1 AEDT} + {3384691200 36000 0 AEST} + {3400416000 39600 1 AEDT} + {3416140800 36000 0 AEST} + {3431865600 39600 1 AEDT} + {3447590400 36000 0 AEST} + {3463315200 39600 1 AEDT} + {3479644800 36000 0 AEST} + {3495369600 39600 1 AEDT} + {3511094400 36000 0 AEST} + {3526819200 39600 1 AEDT} + {3542544000 36000 0 AEST} + {3558268800 39600 1 AEDT} + {3573993600 36000 0 AEST} + {3589718400 39600 1 AEDT} + {3605443200 36000 0 AEST} + {3621168000 39600 1 AEDT} + {3636892800 36000 0 AEST} + {3653222400 39600 1 AEDT} + {3668947200 36000 0 AEST} + {3684672000 39600 1 AEDT} + {3700396800 36000 0 AEST} + {3716121600 39600 1 AEDT} + {3731846400 36000 0 AEST} + {3747571200 39600 1 AEDT} + {3763296000 36000 0 AEST} + {3779020800 39600 1 AEDT} + {3794745600 36000 0 AEST} + {3810470400 39600 1 AEDT} + {3826195200 36000 0 AEST} + {3842524800 39600 1 AEDT} + {3858249600 36000 0 AEST} + {3873974400 39600 1 AEDT} + {3889699200 36000 0 AEST} + {3905424000 39600 1 AEDT} + {3921148800 36000 0 AEST} + {3936873600 39600 1 AEDT} + {3952598400 36000 0 AEST} + {3968323200 39600 1 AEDT} + {3984048000 36000 0 AEST} + {4000377600 39600 1 AEDT} + {4016102400 36000 0 AEST} + {4031827200 39600 1 AEDT} + {4047552000 36000 0 AEST} + {4063276800 39600 1 AEDT} + {4079001600 36000 0 AEST} + {4094726400 39600 1 AEDT} +} diff --git a/env/tcl/tcl8.6/tzdata/Australia/LHI b/env/tcl/tcl8.6/tzdata/Australia/LHI new file mode 100644 index 0000000..ddc79ce --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Australia/LHI @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(Australia/Lord_Howe)]} { + LoadTimeZoneFile Australia/Lord_Howe +} +set TZData(:Australia/LHI) $TZData(:Australia/Lord_Howe) diff --git a/env/tcl/tcl8.6/tzdata/Australia/Lindeman b/env/tcl/tcl8.6/tzdata/Australia/Lindeman new file mode 100644 index 0000000..91ad0a6 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Australia/Lindeman @@ -0,0 +1,28 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Australia/Lindeman) { + {-9223372036854775808 35756 0 LMT} + {-2366790956 36000 0 AEST} + {-1672567140 39600 1 AEDT} + {-1665392400 36000 0 AEST} + {-883641600 39600 1 AEDT} + {-876128400 36000 0 AEST} + {-860400000 39600 1 AEDT} + {-844678800 36000 0 AEST} + {-828345600 39600 1 AEDT} + {-813229200 36000 0 AEST} + {31500000 36000 0 AEST} + {57686400 39600 1 AEDT} + {67968000 36000 0 AEST} + {625593600 39600 1 AEDT} + {636480000 36000 0 AEST} + {657043200 39600 1 AEDT} + {667929600 36000 0 AEST} + {688492800 39600 1 AEDT} + {699379200 36000 0 AEST} + {709912800 36000 0 AEST} + {719942400 39600 1 AEDT} + {731433600 36000 0 AEST} + {751996800 39600 1 AEDT} + {762883200 36000 0 AEST} +} diff --git a/env/tcl/tcl8.6/tzdata/Australia/Lord_Howe b/env/tcl/tcl8.6/tzdata/Australia/Lord_Howe new file mode 100644 index 0000000..c595967 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Australia/Lord_Howe @@ -0,0 +1,245 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Australia/Lord_Howe) { + {-9223372036854775808 38180 0 LMT} + {-2364114980 36000 0 AEST} + {352216800 37800 0 +1030} + {372785400 41400 1 +1030} + {384273000 37800 0 +1030} + {404839800 41400 1 +1030} + {415722600 37800 0 +1030} + {436289400 41400 1 +1030} + {447172200 37800 0 +1030} + {467739000 41400 1 +1030} + {478621800 37800 0 +1030} + {488984400 37800 0 +1030} + {499188600 39600 1 +1030} + {511282800 37800 0 +1030} + {530033400 39600 1 +1030} + {542732400 37800 0 +1030} + {562087800 39600 1 +1030} + {574786800 37800 0 +1030} + {594142200 39600 1 +1030} + {606236400 37800 0 +1030} + {625591800 39600 1 +1030} + {636476400 37800 0 +1030} + {657041400 39600 1 +1030} + {667926000 37800 0 +1030} + {688491000 39600 1 +1030} + {699375600 37800 0 +1030} + {719940600 39600 1 +1030} + {731430000 37800 0 +1030} + {751995000 39600 1 +1030} + {762879600 37800 0 +1030} + {783444600 39600 1 +1030} + {794329200 37800 0 +1030} + {814894200 39600 1 +1030} + {828198000 37800 0 +1030} + {846343800 39600 1 +1030} + {859647600 37800 0 +1030} + {877793400 39600 1 +1030} + {891097200 37800 0 +1030} + {909243000 39600 1 +1030} + {922546800 37800 0 +1030} + {941297400 39600 1 +1030} + {953996400 37800 0 +1030} + {967303800 39600 1 +1030} + {985446000 37800 0 +1030} + {1004196600 39600 1 +1030} + {1017500400 37800 0 +1030} + {1035646200 39600 1 +1030} + {1048950000 37800 0 +1030} + {1067095800 39600 1 +1030} + {1080399600 37800 0 +1030} + {1099150200 39600 1 +1030} + {1111849200 37800 0 +1030} + {1130599800 39600 1 +1030} + {1143903600 37800 0 +1030} + {1162049400 39600 1 +1030} + {1174748400 37800 0 +1030} + {1193499000 39600 1 +1030} + {1207407600 37800 0 +1030} + {1223134200 39600 1 +1030} + {1238857200 37800 0 +1030} + {1254583800 39600 1 +1030} + {1270306800 37800 0 +1030} + {1286033400 39600 1 +1030} + {1301756400 37800 0 +1030} + {1317483000 39600 1 +1030} + {1333206000 37800 0 +1030} + {1349537400 39600 1 +1030} + {1365260400 37800 0 +1030} + {1380987000 39600 1 +1030} + {1396710000 37800 0 +1030} + {1412436600 39600 1 +1030} + {1428159600 37800 0 +1030} + {1443886200 39600 1 +1030} + {1459609200 37800 0 +1030} + {1475335800 39600 1 +1030} + {1491058800 37800 0 +1030} + {1506785400 39600 1 +1030} + {1522508400 37800 0 +1030} + {1538839800 39600 1 +1030} + {1554562800 37800 0 +1030} + {1570289400 39600 1 +1030} + {1586012400 37800 0 +1030} + {1601739000 39600 1 +1030} + {1617462000 37800 0 +1030} + {1633188600 39600 1 +1030} + {1648911600 37800 0 +1030} + {1664638200 39600 1 +1030} + {1680361200 37800 0 +1030} + {1696087800 39600 1 +1030} + {1712415600 37800 0 +1030} + {1728142200 39600 1 +1030} + {1743865200 37800 0 +1030} + {1759591800 39600 1 +1030} + {1775314800 37800 0 +1030} + {1791041400 39600 1 +1030} + {1806764400 37800 0 +1030} + {1822491000 39600 1 +1030} + {1838214000 37800 0 +1030} + {1853940600 39600 1 +1030} + {1869663600 37800 0 +1030} + {1885995000 39600 1 +1030} + {1901718000 37800 0 +1030} + {1917444600 39600 1 +1030} + {1933167600 37800 0 +1030} + {1948894200 39600 1 +1030} + {1964617200 37800 0 +1030} + {1980343800 39600 1 +1030} + {1996066800 37800 0 +1030} + {2011793400 39600 1 +1030} + {2027516400 37800 0 +1030} + {2043243000 39600 1 +1030} + {2058966000 37800 0 +1030} + {2075297400 39600 1 +1030} + {2091020400 37800 0 +1030} + {2106747000 39600 1 +1030} + {2122470000 37800 0 +1030} + {2138196600 39600 1 +1030} + {2153919600 37800 0 +1030} + {2169646200 39600 1 +1030} + {2185369200 37800 0 +1030} + {2201095800 39600 1 +1030} + {2216818800 37800 0 +1030} + {2233150200 39600 1 +1030} + {2248873200 37800 0 +1030} + {2264599800 39600 1 +1030} + {2280322800 37800 0 +1030} + {2296049400 39600 1 +1030} + {2311772400 37800 0 +1030} + {2327499000 39600 1 +1030} + {2343222000 37800 0 +1030} + {2358948600 39600 1 +1030} + {2374671600 37800 0 +1030} + {2390398200 39600 1 +1030} + {2406121200 37800 0 +1030} + {2422452600 39600 1 +1030} + {2438175600 37800 0 +1030} + {2453902200 39600 1 +1030} + {2469625200 37800 0 +1030} + {2485351800 39600 1 +1030} + {2501074800 37800 0 +1030} + {2516801400 39600 1 +1030} + {2532524400 37800 0 +1030} + {2548251000 39600 1 +1030} + {2563974000 37800 0 +1030} + {2579700600 39600 1 +1030} + {2596028400 37800 0 +1030} + {2611755000 39600 1 +1030} + {2627478000 37800 0 +1030} + {2643204600 39600 1 +1030} + {2658927600 37800 0 +1030} + {2674654200 39600 1 +1030} + {2690377200 37800 0 +1030} + {2706103800 39600 1 +1030} + {2721826800 37800 0 +1030} + {2737553400 39600 1 +1030} + {2753276400 37800 0 +1030} + {2769607800 39600 1 +1030} + {2785330800 37800 0 +1030} + {2801057400 39600 1 +1030} + {2816780400 37800 0 +1030} + {2832507000 39600 1 +1030} + {2848230000 37800 0 +1030} + {2863956600 39600 1 +1030} + {2879679600 37800 0 +1030} + {2895406200 39600 1 +1030} + {2911129200 37800 0 +1030} + {2926855800 39600 1 +1030} + {2942578800 37800 0 +1030} + {2958910200 39600 1 +1030} + {2974633200 37800 0 +1030} + {2990359800 39600 1 +1030} + {3006082800 37800 0 +1030} + {3021809400 39600 1 +1030} + {3037532400 37800 0 +1030} + {3053259000 39600 1 +1030} + {3068982000 37800 0 +1030} + {3084708600 39600 1 +1030} + {3100431600 37800 0 +1030} + {3116763000 39600 1 +1030} + {3132486000 37800 0 +1030} + {3148212600 39600 1 +1030} + {3163935600 37800 0 +1030} + {3179662200 39600 1 +1030} + {3195385200 37800 0 +1030} + {3211111800 39600 1 +1030} + {3226834800 37800 0 +1030} + {3242561400 39600 1 +1030} + {3258284400 37800 0 +1030} + {3274011000 39600 1 +1030} + {3289734000 37800 0 +1030} + {3306065400 39600 1 +1030} + {3321788400 37800 0 +1030} + {3337515000 39600 1 +1030} + {3353238000 37800 0 +1030} + {3368964600 39600 1 +1030} + {3384687600 37800 0 +1030} + {3400414200 39600 1 +1030} + {3416137200 37800 0 +1030} + {3431863800 39600 1 +1030} + {3447586800 37800 0 +1030} + {3463313400 39600 1 +1030} + {3479641200 37800 0 +1030} + {3495367800 39600 1 +1030} + {3511090800 37800 0 +1030} + {3526817400 39600 1 +1030} + {3542540400 37800 0 +1030} + {3558267000 39600 1 +1030} + {3573990000 37800 0 +1030} + {3589716600 39600 1 +1030} + {3605439600 37800 0 +1030} + {3621166200 39600 1 +1030} + {3636889200 37800 0 +1030} + {3653220600 39600 1 +1030} + {3668943600 37800 0 +1030} + {3684670200 39600 1 +1030} + {3700393200 37800 0 +1030} + {3716119800 39600 1 +1030} + {3731842800 37800 0 +1030} + {3747569400 39600 1 +1030} + {3763292400 37800 0 +1030} + {3779019000 39600 1 +1030} + {3794742000 37800 0 +1030} + {3810468600 39600 1 +1030} + {3826191600 37800 0 +1030} + {3842523000 39600 1 +1030} + {3858246000 37800 0 +1030} + {3873972600 39600 1 +1030} + {3889695600 37800 0 +1030} + {3905422200 39600 1 +1030} + {3921145200 37800 0 +1030} + {3936871800 39600 1 +1030} + {3952594800 37800 0 +1030} + {3968321400 39600 1 +1030} + {3984044400 37800 0 +1030} + {4000375800 39600 1 +1030} + {4016098800 37800 0 +1030} + {4031825400 39600 1 +1030} + {4047548400 37800 0 +1030} + {4063275000 39600 1 +1030} + {4078998000 37800 0 +1030} + {4094724600 39600 1 +1030} +} diff --git a/env/tcl/tcl8.6/tzdata/Australia/Melbourne b/env/tcl/tcl8.6/tzdata/Australia/Melbourne new file mode 100644 index 0000000..81777df --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Australia/Melbourne @@ -0,0 +1,272 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Australia/Melbourne) { + {-9223372036854775808 34792 0 LMT} + {-2364111592 36000 0 AEST} + {-1672567140 39600 1 AEDT} + {-1665392400 36000 0 AEST} + {-883641600 39600 1 AEDT} + {-876128400 36000 0 AEST} + {-860400000 39600 1 AEDT} + {-844678800 36000 0 AEST} + {-828345600 39600 1 AEDT} + {-813229200 36000 0 AEST} + {31500000 36000 0 AEST} + {57686400 39600 1 AEDT} + {67968000 36000 0 AEST} + {89136000 39600 1 AEDT} + {100022400 36000 0 AEST} + {120585600 39600 1 AEDT} + {131472000 36000 0 AEST} + {152035200 39600 1 AEDT} + {162921600 36000 0 AEST} + {183484800 39600 1 AEDT} + {194976000 36000 0 AEST} + {215539200 39600 1 AEDT} + {226425600 36000 0 AEST} + {246988800 39600 1 AEDT} + {257875200 36000 0 AEST} + {278438400 39600 1 AEDT} + {289324800 36000 0 AEST} + {309888000 39600 1 AEDT} + {320774400 36000 0 AEST} + {341337600 39600 1 AEDT} + {352224000 36000 0 AEST} + {372787200 39600 1 AEDT} + {384278400 36000 0 AEST} + {404841600 39600 1 AEDT} + {415728000 36000 0 AEST} + {436291200 39600 1 AEDT} + {447177600 36000 0 AEST} + {467740800 39600 1 AEDT} + {478627200 36000 0 AEST} + {499190400 39600 1 AEDT} + {511286400 36000 0 AEST} + {530035200 39600 1 AEDT} + {542736000 36000 0 AEST} + {561484800 39600 1 AEDT} + {574790400 36000 0 AEST} + {594144000 39600 1 AEDT} + {606240000 36000 0 AEST} + {625593600 39600 1 AEDT} + {637689600 36000 0 AEST} + {657043200 39600 1 AEDT} + {667929600 36000 0 AEST} + {688492800 39600 1 AEDT} + {699379200 36000 0 AEST} + {719942400 39600 1 AEDT} + {731433600 36000 0 AEST} + {751996800 39600 1 AEDT} + {762883200 36000 0 AEST} + {783446400 39600 1 AEDT} + {796147200 36000 0 AEST} + {814896000 39600 1 AEDT} + {828201600 36000 0 AEST} + {846345600 39600 1 AEDT} + {859651200 36000 0 AEST} + {877795200 39600 1 AEDT} + {891100800 36000 0 AEST} + {909244800 39600 1 AEDT} + {922550400 36000 0 AEST} + {941299200 39600 1 AEDT} + {954000000 36000 0 AEST} + {967305600 39600 1 AEDT} + {985449600 36000 0 AEST} + {1004198400 39600 1 AEDT} + {1017504000 36000 0 AEST} + {1035648000 39600 1 AEDT} + {1048953600 36000 0 AEST} + {1067097600 39600 1 AEDT} + {1080403200 36000 0 AEST} + {1099152000 39600 1 AEDT} + {1111852800 36000 0 AEST} + {1130601600 39600 1 AEDT} + {1143907200 36000 0 AEST} + {1162051200 39600 1 AEDT} + {1174752000 36000 0 AEST} + {1193500800 39600 1 AEDT} + {1207411200 36000 0 AEST} + {1223136000 39600 1 AEDT} + {1238860800 36000 0 AEST} + {1254585600 39600 1 AEDT} + {1270310400 36000 0 AEST} + {1286035200 39600 1 AEDT} + {1301760000 36000 0 AEST} + {1317484800 39600 1 AEDT} + {1333209600 36000 0 AEST} + {1349539200 39600 1 AEDT} + {1365264000 36000 0 AEST} + {1380988800 39600 1 AEDT} + {1396713600 36000 0 AEST} + {1412438400 39600 1 AEDT} + {1428163200 36000 0 AEST} + {1443888000 39600 1 AEDT} + {1459612800 36000 0 AEST} + {1475337600 39600 1 AEDT} + {1491062400 36000 0 AEST} + {1506787200 39600 1 AEDT} + {1522512000 36000 0 AEST} + {1538841600 39600 1 AEDT} + {1554566400 36000 0 AEST} + {1570291200 39600 1 AEDT} + {1586016000 36000 0 AEST} + {1601740800 39600 1 AEDT} + {1617465600 36000 0 AEST} + {1633190400 39600 1 AEDT} + {1648915200 36000 0 AEST} + {1664640000 39600 1 AEDT} + {1680364800 36000 0 AEST} + {1696089600 39600 1 AEDT} + {1712419200 36000 0 AEST} + {1728144000 39600 1 AEDT} + {1743868800 36000 0 AEST} + {1759593600 39600 1 AEDT} + {1775318400 36000 0 AEST} + {1791043200 39600 1 AEDT} + {1806768000 36000 0 AEST} + {1822492800 39600 1 AEDT} + {1838217600 36000 0 AEST} + {1853942400 39600 1 AEDT} + {1869667200 36000 0 AEST} + {1885996800 39600 1 AEDT} + {1901721600 36000 0 AEST} + {1917446400 39600 1 AEDT} + {1933171200 36000 0 AEST} + {1948896000 39600 1 AEDT} + {1964620800 36000 0 AEST} + {1980345600 39600 1 AEDT} + {1996070400 36000 0 AEST} + {2011795200 39600 1 AEDT} + {2027520000 36000 0 AEST} + {2043244800 39600 1 AEDT} + {2058969600 36000 0 AEST} + {2075299200 39600 1 AEDT} + {2091024000 36000 0 AEST} + {2106748800 39600 1 AEDT} + {2122473600 36000 0 AEST} + {2138198400 39600 1 AEDT} + {2153923200 36000 0 AEST} + {2169648000 39600 1 AEDT} + {2185372800 36000 0 AEST} + {2201097600 39600 1 AEDT} + {2216822400 36000 0 AEST} + {2233152000 39600 1 AEDT} + {2248876800 36000 0 AEST} + {2264601600 39600 1 AEDT} + {2280326400 36000 0 AEST} + {2296051200 39600 1 AEDT} + {2311776000 36000 0 AEST} + {2327500800 39600 1 AEDT} + {2343225600 36000 0 AEST} + {2358950400 39600 1 AEDT} + {2374675200 36000 0 AEST} + {2390400000 39600 1 AEDT} + {2406124800 36000 0 AEST} + {2422454400 39600 1 AEDT} + {2438179200 36000 0 AEST} + {2453904000 39600 1 AEDT} + {2469628800 36000 0 AEST} + {2485353600 39600 1 AEDT} + {2501078400 36000 0 AEST} + {2516803200 39600 1 AEDT} + {2532528000 36000 0 AEST} + {2548252800 39600 1 AEDT} + {2563977600 36000 0 AEST} + {2579702400 39600 1 AEDT} + {2596032000 36000 0 AEST} + {2611756800 39600 1 AEDT} + {2627481600 36000 0 AEST} + {2643206400 39600 1 AEDT} + {2658931200 36000 0 AEST} + {2674656000 39600 1 AEDT} + {2690380800 36000 0 AEST} + {2706105600 39600 1 AEDT} + {2721830400 36000 0 AEST} + {2737555200 39600 1 AEDT} + {2753280000 36000 0 AEST} + {2769609600 39600 1 AEDT} + {2785334400 36000 0 AEST} + {2801059200 39600 1 AEDT} + {2816784000 36000 0 AEST} + {2832508800 39600 1 AEDT} + {2848233600 36000 0 AEST} + {2863958400 39600 1 AEDT} + {2879683200 36000 0 AEST} + {2895408000 39600 1 AEDT} + {2911132800 36000 0 AEST} + {2926857600 39600 1 AEDT} + {2942582400 36000 0 AEST} + {2958912000 39600 1 AEDT} + {2974636800 36000 0 AEST} + {2990361600 39600 1 AEDT} + {3006086400 36000 0 AEST} + {3021811200 39600 1 AEDT} + {3037536000 36000 0 AEST} + {3053260800 39600 1 AEDT} + {3068985600 36000 0 AEST} + {3084710400 39600 1 AEDT} + {3100435200 36000 0 AEST} + {3116764800 39600 1 AEDT} + {3132489600 36000 0 AEST} + {3148214400 39600 1 AEDT} + {3163939200 36000 0 AEST} + {3179664000 39600 1 AEDT} + {3195388800 36000 0 AEST} + {3211113600 39600 1 AEDT} + {3226838400 36000 0 AEST} + {3242563200 39600 1 AEDT} + {3258288000 36000 0 AEST} + {3274012800 39600 1 AEDT} + {3289737600 36000 0 AEST} + {3306067200 39600 1 AEDT} + {3321792000 36000 0 AEST} + {3337516800 39600 1 AEDT} + {3353241600 36000 0 AEST} + {3368966400 39600 1 AEDT} + {3384691200 36000 0 AEST} + {3400416000 39600 1 AEDT} + {3416140800 36000 0 AEST} + {3431865600 39600 1 AEDT} + {3447590400 36000 0 AEST} + {3463315200 39600 1 AEDT} + {3479644800 36000 0 AEST} + {3495369600 39600 1 AEDT} + {3511094400 36000 0 AEST} + {3526819200 39600 1 AEDT} + {3542544000 36000 0 AEST} + {3558268800 39600 1 AEDT} + {3573993600 36000 0 AEST} + {3589718400 39600 1 AEDT} + {3605443200 36000 0 AEST} + {3621168000 39600 1 AEDT} + {3636892800 36000 0 AEST} + {3653222400 39600 1 AEDT} + {3668947200 36000 0 AEST} + {3684672000 39600 1 AEDT} + {3700396800 36000 0 AEST} + {3716121600 39600 1 AEDT} + {3731846400 36000 0 AEST} + {3747571200 39600 1 AEDT} + {3763296000 36000 0 AEST} + {3779020800 39600 1 AEDT} + {3794745600 36000 0 AEST} + {3810470400 39600 1 AEDT} + {3826195200 36000 0 AEST} + {3842524800 39600 1 AEDT} + {3858249600 36000 0 AEST} + {3873974400 39600 1 AEDT} + {3889699200 36000 0 AEST} + {3905424000 39600 1 AEDT} + {3921148800 36000 0 AEST} + {3936873600 39600 1 AEDT} + {3952598400 36000 0 AEST} + {3968323200 39600 1 AEDT} + {3984048000 36000 0 AEST} + {4000377600 39600 1 AEDT} + {4016102400 36000 0 AEST} + {4031827200 39600 1 AEDT} + {4047552000 36000 0 AEST} + {4063276800 39600 1 AEDT} + {4079001600 36000 0 AEST} + {4094726400 39600 1 AEDT} +} diff --git a/env/tcl/tcl8.6/tzdata/Australia/NSW b/env/tcl/tcl8.6/tzdata/Australia/NSW new file mode 100644 index 0000000..905bdfe --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Australia/NSW @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(Australia/Sydney)]} { + LoadTimeZoneFile Australia/Sydney +} +set TZData(:Australia/NSW) $TZData(:Australia/Sydney) diff --git a/env/tcl/tcl8.6/tzdata/Australia/North b/env/tcl/tcl8.6/tzdata/Australia/North new file mode 100644 index 0000000..950c88c --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Australia/North @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(Australia/Darwin)]} { + LoadTimeZoneFile Australia/Darwin +} +set TZData(:Australia/North) $TZData(:Australia/Darwin) diff --git a/env/tcl/tcl8.6/tzdata/Australia/Perth b/env/tcl/tcl8.6/tzdata/Australia/Perth new file mode 100644 index 0000000..6ccbca8 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Australia/Perth @@ -0,0 +1,25 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Australia/Perth) { + {-9223372036854775808 27804 0 LMT} + {-2337925404 28800 0 AWST} + {-1672559940 32400 1 AWDT} + {-1665385200 28800 0 AWST} + {-883634400 32400 1 AWDT} + {-876121200 28800 0 AWST} + {-860392800 32400 1 AWDT} + {-844671600 28800 0 AWST} + {-836470800 32400 0 AWST} + {152042400 32400 1 AWDT} + {162928800 28800 0 AWST} + {436298400 32400 1 AWDT} + {447184800 28800 0 AWST} + {690314400 32400 1 AWDT} + {699386400 28800 0 AWST} + {1165082400 32400 1 AWDT} + {1174759200 28800 0 AWST} + {1193508000 32400 1 AWDT} + {1206813600 28800 0 AWST} + {1224957600 32400 1 AWDT} + {1238263200 28800 0 AWST} +} diff --git a/env/tcl/tcl8.6/tzdata/Australia/Queensland b/env/tcl/tcl8.6/tzdata/Australia/Queensland new file mode 100644 index 0000000..6246e92 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Australia/Queensland @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(Australia/Brisbane)]} { + LoadTimeZoneFile Australia/Brisbane +} +set TZData(:Australia/Queensland) $TZData(:Australia/Brisbane) diff --git a/env/tcl/tcl8.6/tzdata/Australia/South b/env/tcl/tcl8.6/tzdata/Australia/South new file mode 100644 index 0000000..9c7dd95 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Australia/South @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(Australia/Adelaide)]} { + LoadTimeZoneFile Australia/Adelaide +} +set TZData(:Australia/South) $TZData(:Australia/Adelaide) diff --git a/env/tcl/tcl8.6/tzdata/Australia/Sydney b/env/tcl/tcl8.6/tzdata/Australia/Sydney new file mode 100644 index 0000000..b1c4411 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Australia/Sydney @@ -0,0 +1,272 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Australia/Sydney) { + {-9223372036854775808 36292 0 LMT} + {-2364113092 36000 0 AEST} + {-1672567140 39600 1 AEDT} + {-1665392400 36000 0 AEST} + {-883641600 39600 1 AEDT} + {-876128400 36000 0 AEST} + {-860400000 39600 1 AEDT} + {-844678800 36000 0 AEST} + {-828345600 39600 1 AEDT} + {-813229200 36000 0 AEST} + {31500000 36000 0 AEST} + {57686400 39600 1 AEDT} + {67968000 36000 0 AEST} + {89136000 39600 1 AEDT} + {100022400 36000 0 AEST} + {120585600 39600 1 AEDT} + {131472000 36000 0 AEST} + {152035200 39600 1 AEDT} + {162921600 36000 0 AEST} + {183484800 39600 1 AEDT} + {194976000 36000 0 AEST} + {215539200 39600 1 AEDT} + {226425600 36000 0 AEST} + {246988800 39600 1 AEDT} + {257875200 36000 0 AEST} + {278438400 39600 1 AEDT} + {289324800 36000 0 AEST} + {309888000 39600 1 AEDT} + {320774400 36000 0 AEST} + {341337600 39600 1 AEDT} + {352224000 36000 0 AEST} + {372787200 39600 1 AEDT} + {386697600 36000 0 AEST} + {404841600 39600 1 AEDT} + {415728000 36000 0 AEST} + {436291200 39600 1 AEDT} + {447177600 36000 0 AEST} + {467740800 39600 1 AEDT} + {478627200 36000 0 AEST} + {499190400 39600 1 AEDT} + {511286400 36000 0 AEST} + {530035200 39600 1 AEDT} + {542736000 36000 0 AEST} + {562089600 39600 1 AEDT} + {574790400 36000 0 AEST} + {594144000 39600 1 AEDT} + {606240000 36000 0 AEST} + {625593600 39600 1 AEDT} + {636480000 36000 0 AEST} + {657043200 39600 1 AEDT} + {667929600 36000 0 AEST} + {688492800 39600 1 AEDT} + {699379200 36000 0 AEST} + {719942400 39600 1 AEDT} + {731433600 36000 0 AEST} + {751996800 39600 1 AEDT} + {762883200 36000 0 AEST} + {783446400 39600 1 AEDT} + {794332800 36000 0 AEST} + {814896000 39600 1 AEDT} + {828201600 36000 0 AEST} + {846345600 39600 1 AEDT} + {859651200 36000 0 AEST} + {877795200 39600 1 AEDT} + {891100800 36000 0 AEST} + {909244800 39600 1 AEDT} + {922550400 36000 0 AEST} + {941299200 39600 1 AEDT} + {954000000 36000 0 AEST} + {967305600 39600 1 AEDT} + {985449600 36000 0 AEST} + {1004198400 39600 1 AEDT} + {1017504000 36000 0 AEST} + {1035648000 39600 1 AEDT} + {1048953600 36000 0 AEST} + {1067097600 39600 1 AEDT} + {1080403200 36000 0 AEST} + {1099152000 39600 1 AEDT} + {1111852800 36000 0 AEST} + {1130601600 39600 1 AEDT} + {1143907200 36000 0 AEST} + {1162051200 39600 1 AEDT} + {1174752000 36000 0 AEST} + {1193500800 39600 1 AEDT} + {1207411200 36000 0 AEST} + {1223136000 39600 1 AEDT} + {1238860800 36000 0 AEST} + {1254585600 39600 1 AEDT} + {1270310400 36000 0 AEST} + {1286035200 39600 1 AEDT} + {1301760000 36000 0 AEST} + {1317484800 39600 1 AEDT} + {1333209600 36000 0 AEST} + {1349539200 39600 1 AEDT} + {1365264000 36000 0 AEST} + {1380988800 39600 1 AEDT} + {1396713600 36000 0 AEST} + {1412438400 39600 1 AEDT} + {1428163200 36000 0 AEST} + {1443888000 39600 1 AEDT} + {1459612800 36000 0 AEST} + {1475337600 39600 1 AEDT} + {1491062400 36000 0 AEST} + {1506787200 39600 1 AEDT} + {1522512000 36000 0 AEST} + {1538841600 39600 1 AEDT} + {1554566400 36000 0 AEST} + {1570291200 39600 1 AEDT} + {1586016000 36000 0 AEST} + {1601740800 39600 1 AEDT} + {1617465600 36000 0 AEST} + {1633190400 39600 1 AEDT} + {1648915200 36000 0 AEST} + {1664640000 39600 1 AEDT} + {1680364800 36000 0 AEST} + {1696089600 39600 1 AEDT} + {1712419200 36000 0 AEST} + {1728144000 39600 1 AEDT} + {1743868800 36000 0 AEST} + {1759593600 39600 1 AEDT} + {1775318400 36000 0 AEST} + {1791043200 39600 1 AEDT} + {1806768000 36000 0 AEST} + {1822492800 39600 1 AEDT} + {1838217600 36000 0 AEST} + {1853942400 39600 1 AEDT} + {1869667200 36000 0 AEST} + {1885996800 39600 1 AEDT} + {1901721600 36000 0 AEST} + {1917446400 39600 1 AEDT} + {1933171200 36000 0 AEST} + {1948896000 39600 1 AEDT} + {1964620800 36000 0 AEST} + {1980345600 39600 1 AEDT} + {1996070400 36000 0 AEST} + {2011795200 39600 1 AEDT} + {2027520000 36000 0 AEST} + {2043244800 39600 1 AEDT} + {2058969600 36000 0 AEST} + {2075299200 39600 1 AEDT} + {2091024000 36000 0 AEST} + {2106748800 39600 1 AEDT} + {2122473600 36000 0 AEST} + {2138198400 39600 1 AEDT} + {2153923200 36000 0 AEST} + {2169648000 39600 1 AEDT} + {2185372800 36000 0 AEST} + {2201097600 39600 1 AEDT} + {2216822400 36000 0 AEST} + {2233152000 39600 1 AEDT} + {2248876800 36000 0 AEST} + {2264601600 39600 1 AEDT} + {2280326400 36000 0 AEST} + {2296051200 39600 1 AEDT} + {2311776000 36000 0 AEST} + {2327500800 39600 1 AEDT} + {2343225600 36000 0 AEST} + {2358950400 39600 1 AEDT} + {2374675200 36000 0 AEST} + {2390400000 39600 1 AEDT} + {2406124800 36000 0 AEST} + {2422454400 39600 1 AEDT} + {2438179200 36000 0 AEST} + {2453904000 39600 1 AEDT} + {2469628800 36000 0 AEST} + {2485353600 39600 1 AEDT} + {2501078400 36000 0 AEST} + {2516803200 39600 1 AEDT} + {2532528000 36000 0 AEST} + {2548252800 39600 1 AEDT} + {2563977600 36000 0 AEST} + {2579702400 39600 1 AEDT} + {2596032000 36000 0 AEST} + {2611756800 39600 1 AEDT} + {2627481600 36000 0 AEST} + {2643206400 39600 1 AEDT} + {2658931200 36000 0 AEST} + {2674656000 39600 1 AEDT} + {2690380800 36000 0 AEST} + {2706105600 39600 1 AEDT} + {2721830400 36000 0 AEST} + {2737555200 39600 1 AEDT} + {2753280000 36000 0 AEST} + {2769609600 39600 1 AEDT} + {2785334400 36000 0 AEST} + {2801059200 39600 1 AEDT} + {2816784000 36000 0 AEST} + {2832508800 39600 1 AEDT} + {2848233600 36000 0 AEST} + {2863958400 39600 1 AEDT} + {2879683200 36000 0 AEST} + {2895408000 39600 1 AEDT} + {2911132800 36000 0 AEST} + {2926857600 39600 1 AEDT} + {2942582400 36000 0 AEST} + {2958912000 39600 1 AEDT} + {2974636800 36000 0 AEST} + {2990361600 39600 1 AEDT} + {3006086400 36000 0 AEST} + {3021811200 39600 1 AEDT} + {3037536000 36000 0 AEST} + {3053260800 39600 1 AEDT} + {3068985600 36000 0 AEST} + {3084710400 39600 1 AEDT} + {3100435200 36000 0 AEST} + {3116764800 39600 1 AEDT} + {3132489600 36000 0 AEST} + {3148214400 39600 1 AEDT} + {3163939200 36000 0 AEST} + {3179664000 39600 1 AEDT} + {3195388800 36000 0 AEST} + {3211113600 39600 1 AEDT} + {3226838400 36000 0 AEST} + {3242563200 39600 1 AEDT} + {3258288000 36000 0 AEST} + {3274012800 39600 1 AEDT} + {3289737600 36000 0 AEST} + {3306067200 39600 1 AEDT} + {3321792000 36000 0 AEST} + {3337516800 39600 1 AEDT} + {3353241600 36000 0 AEST} + {3368966400 39600 1 AEDT} + {3384691200 36000 0 AEST} + {3400416000 39600 1 AEDT} + {3416140800 36000 0 AEST} + {3431865600 39600 1 AEDT} + {3447590400 36000 0 AEST} + {3463315200 39600 1 AEDT} + {3479644800 36000 0 AEST} + {3495369600 39600 1 AEDT} + {3511094400 36000 0 AEST} + {3526819200 39600 1 AEDT} + {3542544000 36000 0 AEST} + {3558268800 39600 1 AEDT} + {3573993600 36000 0 AEST} + {3589718400 39600 1 AEDT} + {3605443200 36000 0 AEST} + {3621168000 39600 1 AEDT} + {3636892800 36000 0 AEST} + {3653222400 39600 1 AEDT} + {3668947200 36000 0 AEST} + {3684672000 39600 1 AEDT} + {3700396800 36000 0 AEST} + {3716121600 39600 1 AEDT} + {3731846400 36000 0 AEST} + {3747571200 39600 1 AEDT} + {3763296000 36000 0 AEST} + {3779020800 39600 1 AEDT} + {3794745600 36000 0 AEST} + {3810470400 39600 1 AEDT} + {3826195200 36000 0 AEST} + {3842524800 39600 1 AEDT} + {3858249600 36000 0 AEST} + {3873974400 39600 1 AEDT} + {3889699200 36000 0 AEST} + {3905424000 39600 1 AEDT} + {3921148800 36000 0 AEST} + {3936873600 39600 1 AEDT} + {3952598400 36000 0 AEST} + {3968323200 39600 1 AEDT} + {3984048000 36000 0 AEST} + {4000377600 39600 1 AEDT} + {4016102400 36000 0 AEST} + {4031827200 39600 1 AEDT} + {4047552000 36000 0 AEST} + {4063276800 39600 1 AEDT} + {4079001600 36000 0 AEST} + {4094726400 39600 1 AEDT} +} diff --git a/env/tcl/tcl8.6/tzdata/Australia/Tasmania b/env/tcl/tcl8.6/tzdata/Australia/Tasmania new file mode 100644 index 0000000..1849bde --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Australia/Tasmania @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(Australia/Hobart)]} { + LoadTimeZoneFile Australia/Hobart +} +set TZData(:Australia/Tasmania) $TZData(:Australia/Hobart) diff --git a/env/tcl/tcl8.6/tzdata/Australia/Victoria b/env/tcl/tcl8.6/tzdata/Australia/Victoria new file mode 100644 index 0000000..037bfeb --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Australia/Victoria @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(Australia/Melbourne)]} { + LoadTimeZoneFile Australia/Melbourne +} +set TZData(:Australia/Victoria) $TZData(:Australia/Melbourne) diff --git a/env/tcl/tcl8.6/tzdata/Australia/West b/env/tcl/tcl8.6/tzdata/Australia/West new file mode 100644 index 0000000..4689f7e --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Australia/West @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(Australia/Perth)]} { + LoadTimeZoneFile Australia/Perth +} +set TZData(:Australia/West) $TZData(:Australia/Perth) diff --git a/env/tcl/tcl8.6/tzdata/Australia/Yancowinna b/env/tcl/tcl8.6/tzdata/Australia/Yancowinna new file mode 100644 index 0000000..b7d668d --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Australia/Yancowinna @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(Australia/Broken_Hill)]} { + LoadTimeZoneFile Australia/Broken_Hill +} +set TZData(:Australia/Yancowinna) $TZData(:Australia/Broken_Hill) diff --git a/env/tcl/tcl8.6/tzdata/Brazil/Acre b/env/tcl/tcl8.6/tzdata/Brazil/Acre new file mode 100644 index 0000000..abb0b98 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Brazil/Acre @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(America/Rio_Branco)]} { + LoadTimeZoneFile America/Rio_Branco +} +set TZData(:Brazil/Acre) $TZData(:America/Rio_Branco) diff --git a/env/tcl/tcl8.6/tzdata/Brazil/DeNoronha b/env/tcl/tcl8.6/tzdata/Brazil/DeNoronha new file mode 100644 index 0000000..53accb4 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Brazil/DeNoronha @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(America/Noronha)]} { + LoadTimeZoneFile America/Noronha +} +set TZData(:Brazil/DeNoronha) $TZData(:America/Noronha) diff --git a/env/tcl/tcl8.6/tzdata/Brazil/East b/env/tcl/tcl8.6/tzdata/Brazil/East new file mode 100644 index 0000000..f684633 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Brazil/East @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(America/Sao_Paulo)]} { + LoadTimeZoneFile America/Sao_Paulo +} +set TZData(:Brazil/East) $TZData(:America/Sao_Paulo) diff --git a/env/tcl/tcl8.6/tzdata/Brazil/West b/env/tcl/tcl8.6/tzdata/Brazil/West new file mode 100644 index 0000000..67676d9 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Brazil/West @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(America/Manaus)]} { + LoadTimeZoneFile America/Manaus +} +set TZData(:Brazil/West) $TZData(:America/Manaus) diff --git a/env/tcl/tcl8.6/tzdata/CET b/env/tcl/tcl8.6/tzdata/CET new file mode 100644 index 0000000..b08750a --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/CET @@ -0,0 +1,265 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:CET) { + {-9223372036854775808 3600 0 CET} + {-1693706400 7200 1 CEST} + {-1680483600 3600 0 CET} + {-1663455600 7200 1 CEST} + {-1650150000 3600 0 CET} + {-1632006000 7200 1 CEST} + {-1618700400 3600 0 CET} + {-938905200 7200 1 CEST} + {-857257200 3600 0 CET} + {-844556400 7200 1 CEST} + {-828226800 3600 0 CET} + {-812502000 7200 1 CEST} + {-796777200 3600 0 CET} + {-781052400 7200 1 CEST} + {-766623600 3600 0 CET} + {228877200 7200 1 CEST} + {243997200 3600 0 CET} + {260326800 7200 1 CEST} + {276051600 3600 0 CET} + {291776400 7200 1 CEST} + {307501200 3600 0 CET} + {323830800 7200 1 CEST} + {338950800 3600 0 CET} + {354675600 7200 1 CEST} + {370400400 3600 0 CET} + {386125200 7200 1 CEST} + {401850000 3600 0 CET} + {417574800 7200 1 CEST} + {433299600 3600 0 CET} + {449024400 7200 1 CEST} + {465354000 3600 0 CET} + {481078800 7200 1 CEST} + {496803600 3600 0 CET} + {512528400 7200 1 CEST} + {528253200 3600 0 CET} + {543978000 7200 1 CEST} + {559702800 3600 0 CET} + {575427600 7200 1 CEST} + {591152400 3600 0 CET} + {606877200 7200 1 CEST} + {622602000 3600 0 CET} + {638326800 7200 1 CEST} + {654656400 3600 0 CET} + {670381200 7200 1 CEST} + {686106000 3600 0 CET} + {701830800 7200 1 CEST} + {717555600 3600 0 CET} + {733280400 7200 1 CEST} + {749005200 3600 0 CET} + {764730000 7200 1 CEST} + {780454800 3600 0 CET} + {796179600 7200 1 CEST} + {811904400 3600 0 CET} + {828234000 7200 1 CEST} + {846378000 3600 0 CET} + {859683600 7200 1 CEST} + {877827600 3600 0 CET} + {891133200 7200 1 CEST} + {909277200 3600 0 CET} + {922582800 7200 1 CEST} + {941331600 3600 0 CET} + {954032400 7200 1 CEST} + {972781200 3600 0 CET} + {985482000 7200 1 CEST} + {1004230800 3600 0 CET} + {1017536400 7200 1 CEST} + {1035680400 3600 0 CET} + {1048986000 7200 1 CEST} + {1067130000 3600 0 CET} + {1080435600 7200 1 CEST} + {1099184400 3600 0 CET} + {1111885200 7200 1 CEST} + {1130634000 3600 0 CET} + {1143334800 7200 1 CEST} + {1162083600 3600 0 CET} + {1174784400 7200 1 CEST} + {1193533200 3600 0 CET} + {1206838800 7200 1 CEST} + {1224982800 3600 0 CET} + {1238288400 7200 1 CEST} + {1256432400 3600 0 CET} + {1269738000 7200 1 CEST} + {1288486800 3600 0 CET} + {1301187600 7200 1 CEST} + {1319936400 3600 0 CET} + {1332637200 7200 1 CEST} + {1351386000 3600 0 CET} + {1364691600 7200 1 CEST} + {1382835600 3600 0 CET} + {1396141200 7200 1 CEST} + {1414285200 3600 0 CET} + {1427590800 7200 1 CEST} + {1445734800 3600 0 CET} + {1459040400 7200 1 CEST} + {1477789200 3600 0 CET} + {1490490000 7200 1 CEST} + {1509238800 3600 0 CET} + {1521939600 7200 1 CEST} + {1540688400 3600 0 CET} + {1553994000 7200 1 CEST} + {1572138000 3600 0 CET} + {1585443600 7200 1 CEST} + {1603587600 3600 0 CET} + {1616893200 7200 1 CEST} + {1635642000 3600 0 CET} + {1648342800 7200 1 CEST} + {1667091600 3600 0 CET} + {1679792400 7200 1 CEST} + {1698541200 3600 0 CET} + {1711846800 7200 1 CEST} + {1729990800 3600 0 CET} + {1743296400 7200 1 CEST} + {1761440400 3600 0 CET} + {1774746000 7200 1 CEST} + {1792890000 3600 0 CET} + {1806195600 7200 1 CEST} + {1824944400 3600 0 CET} + {1837645200 7200 1 CEST} + {1856394000 3600 0 CET} + {1869094800 7200 1 CEST} + {1887843600 3600 0 CET} + {1901149200 7200 1 CEST} + {1919293200 3600 0 CET} + {1932598800 7200 1 CEST} + {1950742800 3600 0 CET} + {1964048400 7200 1 CEST} + {1982797200 3600 0 CET} + {1995498000 7200 1 CEST} + {2014246800 3600 0 CET} + {2026947600 7200 1 CEST} + {2045696400 3600 0 CET} + {2058397200 7200 1 CEST} + {2077146000 3600 0 CET} + {2090451600 7200 1 CEST} + {2108595600 3600 0 CET} + {2121901200 7200 1 CEST} + {2140045200 3600 0 CET} + {2153350800 7200 1 CEST} + {2172099600 3600 0 CET} + {2184800400 7200 1 CEST} + {2203549200 3600 0 CET} + {2216250000 7200 1 CEST} + {2234998800 3600 0 CET} + {2248304400 7200 1 CEST} + {2266448400 3600 0 CET} + {2279754000 7200 1 CEST} + {2297898000 3600 0 CET} + {2311203600 7200 1 CEST} + {2329347600 3600 0 CET} + {2342653200 7200 1 CEST} + {2361402000 3600 0 CET} + {2374102800 7200 1 CEST} + {2392851600 3600 0 CET} + {2405552400 7200 1 CEST} + {2424301200 3600 0 CET} + {2437606800 7200 1 CEST} + {2455750800 3600 0 CET} + {2469056400 7200 1 CEST} + {2487200400 3600 0 CET} + {2500506000 7200 1 CEST} + {2519254800 3600 0 CET} + {2531955600 7200 1 CEST} + {2550704400 3600 0 CET} + {2563405200 7200 1 CEST} + {2582154000 3600 0 CET} + {2595459600 7200 1 CEST} + {2613603600 3600 0 CET} + {2626909200 7200 1 CEST} + {2645053200 3600 0 CET} + {2658358800 7200 1 CEST} + {2676502800 3600 0 CET} + {2689808400 7200 1 CEST} + {2708557200 3600 0 CET} + {2721258000 7200 1 CEST} + {2740006800 3600 0 CET} + {2752707600 7200 1 CEST} + {2771456400 3600 0 CET} + {2784762000 7200 1 CEST} + {2802906000 3600 0 CET} + {2816211600 7200 1 CEST} + {2834355600 3600 0 CET} + {2847661200 7200 1 CEST} + {2866410000 3600 0 CET} + {2879110800 7200 1 CEST} + {2897859600 3600 0 CET} + {2910560400 7200 1 CEST} + {2929309200 3600 0 CET} + {2942010000 7200 1 CEST} + {2960758800 3600 0 CET} + {2974064400 7200 1 CEST} + {2992208400 3600 0 CET} + {3005514000 7200 1 CEST} + {3023658000 3600 0 CET} + {3036963600 7200 1 CEST} + {3055712400 3600 0 CET} + {3068413200 7200 1 CEST} + {3087162000 3600 0 CET} + {3099862800 7200 1 CEST} + {3118611600 3600 0 CET} + {3131917200 7200 1 CEST} + {3150061200 3600 0 CET} + {3163366800 7200 1 CEST} + {3181510800 3600 0 CET} + {3194816400 7200 1 CEST} + {3212960400 3600 0 CET} + {3226266000 7200 1 CEST} + {3245014800 3600 0 CET} + {3257715600 7200 1 CEST} + {3276464400 3600 0 CET} + {3289165200 7200 1 CEST} + {3307914000 3600 0 CET} + {3321219600 7200 1 CEST} + {3339363600 3600 0 CET} + {3352669200 7200 1 CEST} + {3370813200 3600 0 CET} + {3384118800 7200 1 CEST} + {3402867600 3600 0 CET} + {3415568400 7200 1 CEST} + {3434317200 3600 0 CET} + {3447018000 7200 1 CEST} + {3465766800 3600 0 CET} + {3479072400 7200 1 CEST} + {3497216400 3600 0 CET} + {3510522000 7200 1 CEST} + {3528666000 3600 0 CET} + {3541971600 7200 1 CEST} + {3560115600 3600 0 CET} + {3573421200 7200 1 CEST} + {3592170000 3600 0 CET} + {3604870800 7200 1 CEST} + {3623619600 3600 0 CET} + {3636320400 7200 1 CEST} + {3655069200 3600 0 CET} + {3668374800 7200 1 CEST} + {3686518800 3600 0 CET} + {3699824400 7200 1 CEST} + {3717968400 3600 0 CET} + {3731274000 7200 1 CEST} + {3750022800 3600 0 CET} + {3762723600 7200 1 CEST} + {3781472400 3600 0 CET} + {3794173200 7200 1 CEST} + {3812922000 3600 0 CET} + {3825622800 7200 1 CEST} + {3844371600 3600 0 CET} + {3857677200 7200 1 CEST} + {3875821200 3600 0 CET} + {3889126800 7200 1 CEST} + {3907270800 3600 0 CET} + {3920576400 7200 1 CEST} + {3939325200 3600 0 CET} + {3952026000 7200 1 CEST} + {3970774800 3600 0 CET} + {3983475600 7200 1 CEST} + {4002224400 3600 0 CET} + {4015530000 7200 1 CEST} + {4033674000 3600 0 CET} + {4046979600 7200 1 CEST} + {4065123600 3600 0 CET} + {4078429200 7200 1 CEST} + {4096573200 3600 0 CET} +} diff --git a/env/tcl/tcl8.6/tzdata/CST6CDT b/env/tcl/tcl8.6/tzdata/CST6CDT new file mode 100644 index 0000000..11e45f0 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/CST6CDT @@ -0,0 +1,278 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:CST6CDT) { + {-9223372036854775808 -21600 0 CST} + {-1633276800 -18000 1 CDT} + {-1615136400 -21600 0 CST} + {-1601827200 -18000 1 CDT} + {-1583686800 -21600 0 CST} + {-880214400 -18000 1 CWT} + {-769395600 -18000 1 CPT} + {-765392400 -21600 0 CST} + {-84384000 -18000 1 CDT} + {-68662800 -21600 0 CST} + {-52934400 -18000 1 CDT} + {-37213200 -21600 0 CST} + {-21484800 -18000 1 CDT} + {-5763600 -21600 0 CST} + {9964800 -18000 1 CDT} + {25686000 -21600 0 CST} + {41414400 -18000 1 CDT} + {57740400 -21600 0 CST} + {73468800 -18000 1 CDT} + {89190000 -21600 0 CST} + {104918400 -18000 1 CDT} + {120639600 -21600 0 CST} + {126691200 -18000 1 CDT} + {152089200 -21600 0 CST} + {162374400 -18000 1 CDT} + {183538800 -21600 0 CST} + {199267200 -18000 1 CDT} + {215593200 -21600 0 CST} + {230716800 -18000 1 CDT} + {247042800 -21600 0 CST} + {262771200 -18000 1 CDT} + {278492400 -21600 0 CST} + {294220800 -18000 1 CDT} + {309942000 -21600 0 CST} + {325670400 -18000 1 CDT} + {341391600 -21600 0 CST} + {357120000 -18000 1 CDT} + {372841200 -21600 0 CST} + {388569600 -18000 1 CDT} + {404895600 -21600 0 CST} + {420019200 -18000 1 CDT} + {436345200 -21600 0 CST} + {452073600 -18000 1 CDT} + {467794800 -21600 0 CST} + {483523200 -18000 1 CDT} + {499244400 -21600 0 CST} + {514972800 -18000 1 CDT} + {530694000 -21600 0 CST} + {544608000 -18000 1 CDT} + {562143600 -21600 0 CST} + {576057600 -18000 1 CDT} + {594198000 -21600 0 CST} + {607507200 -18000 1 CDT} + {625647600 -21600 0 CST} + {638956800 -18000 1 CDT} + {657097200 -21600 0 CST} + {671011200 -18000 1 CDT} + {688546800 -21600 0 CST} + {702460800 -18000 1 CDT} + {719996400 -21600 0 CST} + {733910400 -18000 1 CDT} + {752050800 -21600 0 CST} + {765360000 -18000 1 CDT} + {783500400 -21600 0 CST} + {796809600 -18000 1 CDT} + {814950000 -21600 0 CST} + {828864000 -18000 1 CDT} + {846399600 -21600 0 CST} + {860313600 -18000 1 CDT} + {877849200 -21600 0 CST} + {891763200 -18000 1 CDT} + {909298800 -21600 0 CST} + {923212800 -18000 1 CDT} + {941353200 -21600 0 CST} + {954662400 -18000 1 CDT} + {972802800 -21600 0 CST} + {986112000 -18000 1 CDT} + {1004252400 -21600 0 CST} + {1018166400 -18000 1 CDT} + {1035702000 -21600 0 CST} + {1049616000 -18000 1 CDT} + {1067151600 -21600 0 CST} + {1081065600 -18000 1 CDT} + {1099206000 -21600 0 CST} + {1112515200 -18000 1 CDT} + {1130655600 -21600 0 CST} + {1143964800 -18000 1 CDT} + {1162105200 -21600 0 CST} + {1173600000 -18000 1 CDT} + {1194159600 -21600 0 CST} + {1205049600 -18000 1 CDT} + {1225609200 -21600 0 CST} + {1236499200 -18000 1 CDT} + {1257058800 -21600 0 CST} + {1268553600 -18000 1 CDT} + {1289113200 -21600 0 CST} + {1300003200 -18000 1 CDT} + {1320562800 -21600 0 CST} + {1331452800 -18000 1 CDT} + {1352012400 -21600 0 CST} + {1362902400 -18000 1 CDT} + {1383462000 -21600 0 CST} + {1394352000 -18000 1 CDT} + {1414911600 -21600 0 CST} + {1425801600 -18000 1 CDT} + {1446361200 -21600 0 CST} + {1457856000 -18000 1 CDT} + {1478415600 -21600 0 CST} + {1489305600 -18000 1 CDT} + {1509865200 -21600 0 CST} + {1520755200 -18000 1 CDT} + {1541314800 -21600 0 CST} + {1552204800 -18000 1 CDT} + {1572764400 -21600 0 CST} + {1583654400 -18000 1 CDT} + {1604214000 -21600 0 CST} + {1615708800 -18000 1 CDT} + {1636268400 -21600 0 CST} + {1647158400 -18000 1 CDT} + {1667718000 -21600 0 CST} + {1678608000 -18000 1 CDT} + {1699167600 -21600 0 CST} + {1710057600 -18000 1 CDT} + {1730617200 -21600 0 CST} + {1741507200 -18000 1 CDT} + {1762066800 -21600 0 CST} + {1772956800 -18000 1 CDT} + {1793516400 -21600 0 CST} + {1805011200 -18000 1 CDT} + {1825570800 -21600 0 CST} + {1836460800 -18000 1 CDT} + {1857020400 -21600 0 CST} + {1867910400 -18000 1 CDT} + {1888470000 -21600 0 CST} + {1899360000 -18000 1 CDT} + {1919919600 -21600 0 CST} + {1930809600 -18000 1 CDT} + {1951369200 -21600 0 CST} + {1962864000 -18000 1 CDT} + {1983423600 -21600 0 CST} + {1994313600 -18000 1 CDT} + {2014873200 -21600 0 CST} + {2025763200 -18000 1 CDT} + {2046322800 -21600 0 CST} + {2057212800 -18000 1 CDT} + {2077772400 -21600 0 CST} + {2088662400 -18000 1 CDT} + {2109222000 -21600 0 CST} + {2120112000 -18000 1 CDT} + {2140671600 -21600 0 CST} + {2152166400 -18000 1 CDT} + {2172726000 -21600 0 CST} + {2183616000 -18000 1 CDT} + {2204175600 -21600 0 CST} + {2215065600 -18000 1 CDT} + {2235625200 -21600 0 CST} + {2246515200 -18000 1 CDT} + {2267074800 -21600 0 CST} + {2277964800 -18000 1 CDT} + {2298524400 -21600 0 CST} + {2309414400 -18000 1 CDT} + {2329974000 -21600 0 CST} + {2341468800 -18000 1 CDT} + {2362028400 -21600 0 CST} + {2372918400 -18000 1 CDT} + {2393478000 -21600 0 CST} + {2404368000 -18000 1 CDT} + {2424927600 -21600 0 CST} + {2435817600 -18000 1 CDT} + {2456377200 -21600 0 CST} + {2467267200 -18000 1 CDT} + {2487826800 -21600 0 CST} + {2499321600 -18000 1 CDT} + {2519881200 -21600 0 CST} + {2530771200 -18000 1 CDT} + {2551330800 -21600 0 CST} + {2562220800 -18000 1 CDT} + {2582780400 -21600 0 CST} + {2593670400 -18000 1 CDT} + {2614230000 -21600 0 CST} + {2625120000 -18000 1 CDT} + {2645679600 -21600 0 CST} + {2656569600 -18000 1 CDT} + {2677129200 -21600 0 CST} + {2688624000 -18000 1 CDT} + {2709183600 -21600 0 CST} + {2720073600 -18000 1 CDT} + {2740633200 -21600 0 CST} + {2751523200 -18000 1 CDT} + {2772082800 -21600 0 CST} + {2782972800 -18000 1 CDT} + {2803532400 -21600 0 CST} + {2814422400 -18000 1 CDT} + {2834982000 -21600 0 CST} + {2846476800 -18000 1 CDT} + {2867036400 -21600 0 CST} + {2877926400 -18000 1 CDT} + {2898486000 -21600 0 CST} + {2909376000 -18000 1 CDT} + {2929935600 -21600 0 CST} + {2940825600 -18000 1 CDT} + {2961385200 -21600 0 CST} + {2972275200 -18000 1 CDT} + {2992834800 -21600 0 CST} + {3003724800 -18000 1 CDT} + {3024284400 -21600 0 CST} + {3035779200 -18000 1 CDT} + {3056338800 -21600 0 CST} + {3067228800 -18000 1 CDT} + {3087788400 -21600 0 CST} + {3098678400 -18000 1 CDT} + {3119238000 -21600 0 CST} + {3130128000 -18000 1 CDT} + {3150687600 -21600 0 CST} + {3161577600 -18000 1 CDT} + {3182137200 -21600 0 CST} + {3193027200 -18000 1 CDT} + {3213586800 -21600 0 CST} + {3225081600 -18000 1 CDT} + {3245641200 -21600 0 CST} + {3256531200 -18000 1 CDT} + {3277090800 -21600 0 CST} + {3287980800 -18000 1 CDT} + {3308540400 -21600 0 CST} + {3319430400 -18000 1 CDT} + {3339990000 -21600 0 CST} + {3350880000 -18000 1 CDT} + {3371439600 -21600 0 CST} + {3382934400 -18000 1 CDT} + {3403494000 -21600 0 CST} + {3414384000 -18000 1 CDT} + {3434943600 -21600 0 CST} + {3445833600 -18000 1 CDT} + {3466393200 -21600 0 CST} + {3477283200 -18000 1 CDT} + {3497842800 -21600 0 CST} + {3508732800 -18000 1 CDT} + {3529292400 -21600 0 CST} + {3540182400 -18000 1 CDT} + {3560742000 -21600 0 CST} + {3572236800 -18000 1 CDT} + {3592796400 -21600 0 CST} + {3603686400 -18000 1 CDT} + {3624246000 -21600 0 CST} + {3635136000 -18000 1 CDT} + {3655695600 -21600 0 CST} + {3666585600 -18000 1 CDT} + {3687145200 -21600 0 CST} + {3698035200 -18000 1 CDT} + {3718594800 -21600 0 CST} + {3730089600 -18000 1 CDT} + {3750649200 -21600 0 CST} + {3761539200 -18000 1 CDT} + {3782098800 -21600 0 CST} + {3792988800 -18000 1 CDT} + {3813548400 -21600 0 CST} + {3824438400 -18000 1 CDT} + {3844998000 -21600 0 CST} + {3855888000 -18000 1 CDT} + {3876447600 -21600 0 CST} + {3887337600 -18000 1 CDT} + {3907897200 -21600 0 CST} + {3919392000 -18000 1 CDT} + {3939951600 -21600 0 CST} + {3950841600 -18000 1 CDT} + {3971401200 -21600 0 CST} + {3982291200 -18000 1 CDT} + {4002850800 -21600 0 CST} + {4013740800 -18000 1 CDT} + {4034300400 -21600 0 CST} + {4045190400 -18000 1 CDT} + {4065750000 -21600 0 CST} + {4076640000 -18000 1 CDT} + {4097199600 -21600 0 CST} +} diff --git a/env/tcl/tcl8.6/tzdata/Canada/Atlantic b/env/tcl/tcl8.6/tzdata/Canada/Atlantic new file mode 100644 index 0000000..d1478d9 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Canada/Atlantic @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(America/Halifax)]} { + LoadTimeZoneFile America/Halifax +} +set TZData(:Canada/Atlantic) $TZData(:America/Halifax) diff --git a/env/tcl/tcl8.6/tzdata/Canada/Central b/env/tcl/tcl8.6/tzdata/Canada/Central new file mode 100644 index 0000000..b04bef9 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Canada/Central @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(America/Winnipeg)]} { + LoadTimeZoneFile America/Winnipeg +} +set TZData(:Canada/Central) $TZData(:America/Winnipeg) diff --git a/env/tcl/tcl8.6/tzdata/Canada/East-Saskatchewan b/env/tcl/tcl8.6/tzdata/Canada/East-Saskatchewan new file mode 100644 index 0000000..f7e500c --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Canada/East-Saskatchewan @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(America/Regina)]} { + LoadTimeZoneFile America/Regina +} +set TZData(:Canada/East-Saskatchewan) $TZData(:America/Regina) diff --git a/env/tcl/tcl8.6/tzdata/Canada/Eastern b/env/tcl/tcl8.6/tzdata/Canada/Eastern new file mode 100644 index 0000000..74528eb --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Canada/Eastern @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(America/Toronto)]} { + LoadTimeZoneFile America/Toronto +} +set TZData(:Canada/Eastern) $TZData(:America/Toronto) diff --git a/env/tcl/tcl8.6/tzdata/Canada/Mountain b/env/tcl/tcl8.6/tzdata/Canada/Mountain new file mode 100644 index 0000000..8c6458d --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Canada/Mountain @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(America/Edmonton)]} { + LoadTimeZoneFile America/Edmonton +} +set TZData(:Canada/Mountain) $TZData(:America/Edmonton) diff --git a/env/tcl/tcl8.6/tzdata/Canada/Newfoundland b/env/tcl/tcl8.6/tzdata/Canada/Newfoundland new file mode 100644 index 0000000..6904cde --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Canada/Newfoundland @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(America/St_Johns)]} { + LoadTimeZoneFile America/St_Johns +} +set TZData(:Canada/Newfoundland) $TZData(:America/St_Johns) diff --git a/env/tcl/tcl8.6/tzdata/Canada/Pacific b/env/tcl/tcl8.6/tzdata/Canada/Pacific new file mode 100644 index 0000000..4d70342 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Canada/Pacific @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(America/Vancouver)]} { + LoadTimeZoneFile America/Vancouver +} +set TZData(:Canada/Pacific) $TZData(:America/Vancouver) diff --git a/env/tcl/tcl8.6/tzdata/Canada/Saskatchewan b/env/tcl/tcl8.6/tzdata/Canada/Saskatchewan new file mode 100644 index 0000000..cd56446 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Canada/Saskatchewan @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(America/Regina)]} { + LoadTimeZoneFile America/Regina +} +set TZData(:Canada/Saskatchewan) $TZData(:America/Regina) diff --git a/env/tcl/tcl8.6/tzdata/Canada/Yukon b/env/tcl/tcl8.6/tzdata/Canada/Yukon new file mode 100644 index 0000000..04b8368 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Canada/Yukon @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(America/Whitehorse)]} { + LoadTimeZoneFile America/Whitehorse +} +set TZData(:Canada/Yukon) $TZData(:America/Whitehorse) diff --git a/env/tcl/tcl8.6/tzdata/Chile/Continental b/env/tcl/tcl8.6/tzdata/Chile/Continental new file mode 100644 index 0000000..0f858a3 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Chile/Continental @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(America/Santiago)]} { + LoadTimeZoneFile America/Santiago +} +set TZData(:Chile/Continental) $TZData(:America/Santiago) diff --git a/env/tcl/tcl8.6/tzdata/Chile/EasterIsland b/env/tcl/tcl8.6/tzdata/Chile/EasterIsland new file mode 100644 index 0000000..4edc034 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Chile/EasterIsland @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(Pacific/Easter)]} { + LoadTimeZoneFile Pacific/Easter +} +set TZData(:Chile/EasterIsland) $TZData(:Pacific/Easter) diff --git a/env/tcl/tcl8.6/tzdata/Cuba b/env/tcl/tcl8.6/tzdata/Cuba new file mode 100644 index 0000000..17f7b45 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Cuba @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(America/Havana)]} { + LoadTimeZoneFile America/Havana +} +set TZData(:Cuba) $TZData(:America/Havana) diff --git a/env/tcl/tcl8.6/tzdata/EET b/env/tcl/tcl8.6/tzdata/EET new file mode 100644 index 0000000..e7c102a --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/EET @@ -0,0 +1,251 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:EET) { + {-9223372036854775808 7200 0 EET} + {228877200 10800 1 EEST} + {243997200 7200 0 EET} + {260326800 10800 1 EEST} + {276051600 7200 0 EET} + {291776400 10800 1 EEST} + {307501200 7200 0 EET} + {323830800 10800 1 EEST} + {338950800 7200 0 EET} + {354675600 10800 1 EEST} + {370400400 7200 0 EET} + {386125200 10800 1 EEST} + {401850000 7200 0 EET} + {417574800 10800 1 EEST} + {433299600 7200 0 EET} + {449024400 10800 1 EEST} + {465354000 7200 0 EET} + {481078800 10800 1 EEST} + {496803600 7200 0 EET} + {512528400 10800 1 EEST} + {528253200 7200 0 EET} + {543978000 10800 1 EEST} + {559702800 7200 0 EET} + {575427600 10800 1 EEST} + {591152400 7200 0 EET} + {606877200 10800 1 EEST} + {622602000 7200 0 EET} + {638326800 10800 1 EEST} + {654656400 7200 0 EET} + {670381200 10800 1 EEST} + {686106000 7200 0 EET} + {701830800 10800 1 EEST} + {717555600 7200 0 EET} + {733280400 10800 1 EEST} + {749005200 7200 0 EET} + {764730000 10800 1 EEST} + {780454800 7200 0 EET} + {796179600 10800 1 EEST} + {811904400 7200 0 EET} + {828234000 10800 1 EEST} + {846378000 7200 0 EET} + {859683600 10800 1 EEST} + {877827600 7200 0 EET} + {891133200 10800 1 EEST} + {909277200 7200 0 EET} + {922582800 10800 1 EEST} + {941331600 7200 0 EET} + {954032400 10800 1 EEST} + {972781200 7200 0 EET} + {985482000 10800 1 EEST} + {1004230800 7200 0 EET} + {1017536400 10800 1 EEST} + {1035680400 7200 0 EET} + {1048986000 10800 1 EEST} + {1067130000 7200 0 EET} + {1080435600 10800 1 EEST} + {1099184400 7200 0 EET} + {1111885200 10800 1 EEST} + {1130634000 7200 0 EET} + {1143334800 10800 1 EEST} + {1162083600 7200 0 EET} + {1174784400 10800 1 EEST} + {1193533200 7200 0 EET} + {1206838800 10800 1 EEST} + {1224982800 7200 0 EET} + {1238288400 10800 1 EEST} + {1256432400 7200 0 EET} + {1269738000 10800 1 EEST} + {1288486800 7200 0 EET} + {1301187600 10800 1 EEST} + {1319936400 7200 0 EET} + {1332637200 10800 1 EEST} + {1351386000 7200 0 EET} + {1364691600 10800 1 EEST} + {1382835600 7200 0 EET} + {1396141200 10800 1 EEST} + {1414285200 7200 0 EET} + {1427590800 10800 1 EEST} + {1445734800 7200 0 EET} + {1459040400 10800 1 EEST} + {1477789200 7200 0 EET} + {1490490000 10800 1 EEST} + {1509238800 7200 0 EET} + {1521939600 10800 1 EEST} + {1540688400 7200 0 EET} + {1553994000 10800 1 EEST} + {1572138000 7200 0 EET} + {1585443600 10800 1 EEST} + {1603587600 7200 0 EET} + {1616893200 10800 1 EEST} + {1635642000 7200 0 EET} + {1648342800 10800 1 EEST} + {1667091600 7200 0 EET} + {1679792400 10800 1 EEST} + {1698541200 7200 0 EET} + {1711846800 10800 1 EEST} + {1729990800 7200 0 EET} + {1743296400 10800 1 EEST} + {1761440400 7200 0 EET} + {1774746000 10800 1 EEST} + {1792890000 7200 0 EET} + {1806195600 10800 1 EEST} + {1824944400 7200 0 EET} + {1837645200 10800 1 EEST} + {1856394000 7200 0 EET} + {1869094800 10800 1 EEST} + {1887843600 7200 0 EET} + {1901149200 10800 1 EEST} + {1919293200 7200 0 EET} + {1932598800 10800 1 EEST} + {1950742800 7200 0 EET} + {1964048400 10800 1 EEST} + {1982797200 7200 0 EET} + {1995498000 10800 1 EEST} + {2014246800 7200 0 EET} + {2026947600 10800 1 EEST} + {2045696400 7200 0 EET} + {2058397200 10800 1 EEST} + {2077146000 7200 0 EET} + {2090451600 10800 1 EEST} + {2108595600 7200 0 EET} + {2121901200 10800 1 EEST} + {2140045200 7200 0 EET} + {2153350800 10800 1 EEST} + {2172099600 7200 0 EET} + {2184800400 10800 1 EEST} + {2203549200 7200 0 EET} + {2216250000 10800 1 EEST} + {2234998800 7200 0 EET} + {2248304400 10800 1 EEST} + {2266448400 7200 0 EET} + {2279754000 10800 1 EEST} + {2297898000 7200 0 EET} + {2311203600 10800 1 EEST} + {2329347600 7200 0 EET} + {2342653200 10800 1 EEST} + {2361402000 7200 0 EET} + {2374102800 10800 1 EEST} + {2392851600 7200 0 EET} + {2405552400 10800 1 EEST} + {2424301200 7200 0 EET} + {2437606800 10800 1 EEST} + {2455750800 7200 0 EET} + {2469056400 10800 1 EEST} + {2487200400 7200 0 EET} + {2500506000 10800 1 EEST} + {2519254800 7200 0 EET} + {2531955600 10800 1 EEST} + {2550704400 7200 0 EET} + {2563405200 10800 1 EEST} + {2582154000 7200 0 EET} + {2595459600 10800 1 EEST} + {2613603600 7200 0 EET} + {2626909200 10800 1 EEST} + {2645053200 7200 0 EET} + {2658358800 10800 1 EEST} + {2676502800 7200 0 EET} + {2689808400 10800 1 EEST} + {2708557200 7200 0 EET} + {2721258000 10800 1 EEST} + {2740006800 7200 0 EET} + {2752707600 10800 1 EEST} + {2771456400 7200 0 EET} + {2784762000 10800 1 EEST} + {2802906000 7200 0 EET} + {2816211600 10800 1 EEST} + {2834355600 7200 0 EET} + {2847661200 10800 1 EEST} + {2866410000 7200 0 EET} + {2879110800 10800 1 EEST} + {2897859600 7200 0 EET} + {2910560400 10800 1 EEST} + {2929309200 7200 0 EET} + {2942010000 10800 1 EEST} + {2960758800 7200 0 EET} + {2974064400 10800 1 EEST} + {2992208400 7200 0 EET} + {3005514000 10800 1 EEST} + {3023658000 7200 0 EET} + {3036963600 10800 1 EEST} + {3055712400 7200 0 EET} + {3068413200 10800 1 EEST} + {3087162000 7200 0 EET} + {3099862800 10800 1 EEST} + {3118611600 7200 0 EET} + {3131917200 10800 1 EEST} + {3150061200 7200 0 EET} + {3163366800 10800 1 EEST} + {3181510800 7200 0 EET} + {3194816400 10800 1 EEST} + {3212960400 7200 0 EET} + {3226266000 10800 1 EEST} + {3245014800 7200 0 EET} + {3257715600 10800 1 EEST} + {3276464400 7200 0 EET} + {3289165200 10800 1 EEST} + {3307914000 7200 0 EET} + {3321219600 10800 1 EEST} + {3339363600 7200 0 EET} + {3352669200 10800 1 EEST} + {3370813200 7200 0 EET} + {3384118800 10800 1 EEST} + {3402867600 7200 0 EET} + {3415568400 10800 1 EEST} + {3434317200 7200 0 EET} + {3447018000 10800 1 EEST} + {3465766800 7200 0 EET} + {3479072400 10800 1 EEST} + {3497216400 7200 0 EET} + {3510522000 10800 1 EEST} + {3528666000 7200 0 EET} + {3541971600 10800 1 EEST} + {3560115600 7200 0 EET} + {3573421200 10800 1 EEST} + {3592170000 7200 0 EET} + {3604870800 10800 1 EEST} + {3623619600 7200 0 EET} + {3636320400 10800 1 EEST} + {3655069200 7200 0 EET} + {3668374800 10800 1 EEST} + {3686518800 7200 0 EET} + {3699824400 10800 1 EEST} + {3717968400 7200 0 EET} + {3731274000 10800 1 EEST} + {3750022800 7200 0 EET} + {3762723600 10800 1 EEST} + {3781472400 7200 0 EET} + {3794173200 10800 1 EEST} + {3812922000 7200 0 EET} + {3825622800 10800 1 EEST} + {3844371600 7200 0 EET} + {3857677200 10800 1 EEST} + {3875821200 7200 0 EET} + {3889126800 10800 1 EEST} + {3907270800 7200 0 EET} + {3920576400 10800 1 EEST} + {3939325200 7200 0 EET} + {3952026000 10800 1 EEST} + {3970774800 7200 0 EET} + {3983475600 10800 1 EEST} + {4002224400 7200 0 EET} + {4015530000 10800 1 EEST} + {4033674000 7200 0 EET} + {4046979600 10800 1 EEST} + {4065123600 7200 0 EET} + {4078429200 10800 1 EEST} + {4096573200 7200 0 EET} +} diff --git a/env/tcl/tcl8.6/tzdata/EST b/env/tcl/tcl8.6/tzdata/EST new file mode 100644 index 0000000..72c5b17 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/EST @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:EST) { + {-9223372036854775808 -18000 0 EST} +} diff --git a/env/tcl/tcl8.6/tzdata/EST5EDT b/env/tcl/tcl8.6/tzdata/EST5EDT new file mode 100644 index 0000000..968833e --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/EST5EDT @@ -0,0 +1,278 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:EST5EDT) { + {-9223372036854775808 -18000 0 EST} + {-1633280400 -14400 1 EDT} + {-1615140000 -18000 0 EST} + {-1601830800 -14400 1 EDT} + {-1583690400 -18000 0 EST} + {-880218000 -14400 1 EWT} + {-769395600 -14400 1 EPT} + {-765396000 -18000 0 EST} + {-84387600 -14400 1 EDT} + {-68666400 -18000 0 EST} + {-52938000 -14400 1 EDT} + {-37216800 -18000 0 EST} + {-21488400 -14400 1 EDT} + {-5767200 -18000 0 EST} + {9961200 -14400 1 EDT} + {25682400 -18000 0 EST} + {41410800 -14400 1 EDT} + {57736800 -18000 0 EST} + {73465200 -14400 1 EDT} + {89186400 -18000 0 EST} + {104914800 -14400 1 EDT} + {120636000 -18000 0 EST} + {126687600 -14400 1 EDT} + {152085600 -18000 0 EST} + {162370800 -14400 1 EDT} + {183535200 -18000 0 EST} + {199263600 -14400 1 EDT} + {215589600 -18000 0 EST} + {230713200 -14400 1 EDT} + {247039200 -18000 0 EST} + {262767600 -14400 1 EDT} + {278488800 -18000 0 EST} + {294217200 -14400 1 EDT} + {309938400 -18000 0 EST} + {325666800 -14400 1 EDT} + {341388000 -18000 0 EST} + {357116400 -14400 1 EDT} + {372837600 -18000 0 EST} + {388566000 -14400 1 EDT} + {404892000 -18000 0 EST} + {420015600 -14400 1 EDT} + {436341600 -18000 0 EST} + {452070000 -14400 1 EDT} + {467791200 -18000 0 EST} + {483519600 -14400 1 EDT} + {499240800 -18000 0 EST} + {514969200 -14400 1 EDT} + {530690400 -18000 0 EST} + {544604400 -14400 1 EDT} + {562140000 -18000 0 EST} + {576054000 -14400 1 EDT} + {594194400 -18000 0 EST} + {607503600 -14400 1 EDT} + {625644000 -18000 0 EST} + {638953200 -14400 1 EDT} + {657093600 -18000 0 EST} + {671007600 -14400 1 EDT} + {688543200 -18000 0 EST} + {702457200 -14400 1 EDT} + {719992800 -18000 0 EST} + {733906800 -14400 1 EDT} + {752047200 -18000 0 EST} + {765356400 -14400 1 EDT} + {783496800 -18000 0 EST} + {796806000 -14400 1 EDT} + {814946400 -18000 0 EST} + {828860400 -14400 1 EDT} + {846396000 -18000 0 EST} + {860310000 -14400 1 EDT} + {877845600 -18000 0 EST} + {891759600 -14400 1 EDT} + {909295200 -18000 0 EST} + {923209200 -14400 1 EDT} + {941349600 -18000 0 EST} + {954658800 -14400 1 EDT} + {972799200 -18000 0 EST} + {986108400 -14400 1 EDT} + {1004248800 -18000 0 EST} + {1018162800 -14400 1 EDT} + {1035698400 -18000 0 EST} + {1049612400 -14400 1 EDT} + {1067148000 -18000 0 EST} + {1081062000 -14400 1 EDT} + {1099202400 -18000 0 EST} + {1112511600 -14400 1 EDT} + {1130652000 -18000 0 EST} + {1143961200 -14400 1 EDT} + {1162101600 -18000 0 EST} + {1173596400 -14400 1 EDT} + {1194156000 -18000 0 EST} + {1205046000 -14400 1 EDT} + {1225605600 -18000 0 EST} + {1236495600 -14400 1 EDT} + {1257055200 -18000 0 EST} + {1268550000 -14400 1 EDT} + {1289109600 -18000 0 EST} + {1299999600 -14400 1 EDT} + {1320559200 -18000 0 EST} + {1331449200 -14400 1 EDT} + {1352008800 -18000 0 EST} + {1362898800 -14400 1 EDT} + {1383458400 -18000 0 EST} + {1394348400 -14400 1 EDT} + {1414908000 -18000 0 EST} + {1425798000 -14400 1 EDT} + {1446357600 -18000 0 EST} + {1457852400 -14400 1 EDT} + {1478412000 -18000 0 EST} + {1489302000 -14400 1 EDT} + {1509861600 -18000 0 EST} + {1520751600 -14400 1 EDT} + {1541311200 -18000 0 EST} + {1552201200 -14400 1 EDT} + {1572760800 -18000 0 EST} + {1583650800 -14400 1 EDT} + {1604210400 -18000 0 EST} + {1615705200 -14400 1 EDT} + {1636264800 -18000 0 EST} + {1647154800 -14400 1 EDT} + {1667714400 -18000 0 EST} + {1678604400 -14400 1 EDT} + {1699164000 -18000 0 EST} + {1710054000 -14400 1 EDT} + {1730613600 -18000 0 EST} + {1741503600 -14400 1 EDT} + {1762063200 -18000 0 EST} + {1772953200 -14400 1 EDT} + {1793512800 -18000 0 EST} + {1805007600 -14400 1 EDT} + {1825567200 -18000 0 EST} + {1836457200 -14400 1 EDT} + {1857016800 -18000 0 EST} + {1867906800 -14400 1 EDT} + {1888466400 -18000 0 EST} + {1899356400 -14400 1 EDT} + {1919916000 -18000 0 EST} + {1930806000 -14400 1 EDT} + {1951365600 -18000 0 EST} + {1962860400 -14400 1 EDT} + {1983420000 -18000 0 EST} + {1994310000 -14400 1 EDT} + {2014869600 -18000 0 EST} + {2025759600 -14400 1 EDT} + {2046319200 -18000 0 EST} + {2057209200 -14400 1 EDT} + {2077768800 -18000 0 EST} + {2088658800 -14400 1 EDT} + {2109218400 -18000 0 EST} + {2120108400 -14400 1 EDT} + {2140668000 -18000 0 EST} + {2152162800 -14400 1 EDT} + {2172722400 -18000 0 EST} + {2183612400 -14400 1 EDT} + {2204172000 -18000 0 EST} + {2215062000 -14400 1 EDT} + {2235621600 -18000 0 EST} + {2246511600 -14400 1 EDT} + {2267071200 -18000 0 EST} + {2277961200 -14400 1 EDT} + {2298520800 -18000 0 EST} + {2309410800 -14400 1 EDT} + {2329970400 -18000 0 EST} + {2341465200 -14400 1 EDT} + {2362024800 -18000 0 EST} + {2372914800 -14400 1 EDT} + {2393474400 -18000 0 EST} + {2404364400 -14400 1 EDT} + {2424924000 -18000 0 EST} + {2435814000 -14400 1 EDT} + {2456373600 -18000 0 EST} + {2467263600 -14400 1 EDT} + {2487823200 -18000 0 EST} + {2499318000 -14400 1 EDT} + {2519877600 -18000 0 EST} + {2530767600 -14400 1 EDT} + {2551327200 -18000 0 EST} + {2562217200 -14400 1 EDT} + {2582776800 -18000 0 EST} + {2593666800 -14400 1 EDT} + {2614226400 -18000 0 EST} + {2625116400 -14400 1 EDT} + {2645676000 -18000 0 EST} + {2656566000 -14400 1 EDT} + {2677125600 -18000 0 EST} + {2688620400 -14400 1 EDT} + {2709180000 -18000 0 EST} + {2720070000 -14400 1 EDT} + {2740629600 -18000 0 EST} + {2751519600 -14400 1 EDT} + {2772079200 -18000 0 EST} + {2782969200 -14400 1 EDT} + {2803528800 -18000 0 EST} + {2814418800 -14400 1 EDT} + {2834978400 -18000 0 EST} + {2846473200 -14400 1 EDT} + {2867032800 -18000 0 EST} + {2877922800 -14400 1 EDT} + {2898482400 -18000 0 EST} + {2909372400 -14400 1 EDT} + {2929932000 -18000 0 EST} + {2940822000 -14400 1 EDT} + {2961381600 -18000 0 EST} + {2972271600 -14400 1 EDT} + {2992831200 -18000 0 EST} + {3003721200 -14400 1 EDT} + {3024280800 -18000 0 EST} + {3035775600 -14400 1 EDT} + {3056335200 -18000 0 EST} + {3067225200 -14400 1 EDT} + {3087784800 -18000 0 EST} + {3098674800 -14400 1 EDT} + {3119234400 -18000 0 EST} + {3130124400 -14400 1 EDT} + {3150684000 -18000 0 EST} + {3161574000 -14400 1 EDT} + {3182133600 -18000 0 EST} + {3193023600 -14400 1 EDT} + {3213583200 -18000 0 EST} + {3225078000 -14400 1 EDT} + {3245637600 -18000 0 EST} + {3256527600 -14400 1 EDT} + {3277087200 -18000 0 EST} + {3287977200 -14400 1 EDT} + {3308536800 -18000 0 EST} + {3319426800 -14400 1 EDT} + {3339986400 -18000 0 EST} + {3350876400 -14400 1 EDT} + {3371436000 -18000 0 EST} + {3382930800 -14400 1 EDT} + {3403490400 -18000 0 EST} + {3414380400 -14400 1 EDT} + {3434940000 -18000 0 EST} + {3445830000 -14400 1 EDT} + {3466389600 -18000 0 EST} + {3477279600 -14400 1 EDT} + {3497839200 -18000 0 EST} + {3508729200 -14400 1 EDT} + {3529288800 -18000 0 EST} + {3540178800 -14400 1 EDT} + {3560738400 -18000 0 EST} + {3572233200 -14400 1 EDT} + {3592792800 -18000 0 EST} + {3603682800 -14400 1 EDT} + {3624242400 -18000 0 EST} + {3635132400 -14400 1 EDT} + {3655692000 -18000 0 EST} + {3666582000 -14400 1 EDT} + {3687141600 -18000 0 EST} + {3698031600 -14400 1 EDT} + {3718591200 -18000 0 EST} + {3730086000 -14400 1 EDT} + {3750645600 -18000 0 EST} + {3761535600 -14400 1 EDT} + {3782095200 -18000 0 EST} + {3792985200 -14400 1 EDT} + {3813544800 -18000 0 EST} + {3824434800 -14400 1 EDT} + {3844994400 -18000 0 EST} + {3855884400 -14400 1 EDT} + {3876444000 -18000 0 EST} + {3887334000 -14400 1 EDT} + {3907893600 -18000 0 EST} + {3919388400 -14400 1 EDT} + {3939948000 -18000 0 EST} + {3950838000 -14400 1 EDT} + {3971397600 -18000 0 EST} + {3982287600 -14400 1 EDT} + {4002847200 -18000 0 EST} + {4013737200 -14400 1 EDT} + {4034296800 -18000 0 EST} + {4045186800 -14400 1 EDT} + {4065746400 -18000 0 EST} + {4076636400 -14400 1 EDT} + {4097196000 -18000 0 EST} +} diff --git a/env/tcl/tcl8.6/tzdata/Egypt b/env/tcl/tcl8.6/tzdata/Egypt new file mode 100644 index 0000000..63341bc --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Egypt @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(Africa/Cairo)]} { + LoadTimeZoneFile Africa/Cairo +} +set TZData(:Egypt) $TZData(:Africa/Cairo) diff --git a/env/tcl/tcl8.6/tzdata/Eire b/env/tcl/tcl8.6/tzdata/Eire new file mode 100644 index 0000000..c86c91c --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Eire @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(Europe/Dublin)]} { + LoadTimeZoneFile Europe/Dublin +} +set TZData(:Eire) $TZData(:Europe/Dublin) diff --git a/env/tcl/tcl8.6/tzdata/Etc/GMT b/env/tcl/tcl8.6/tzdata/Etc/GMT new file mode 100644 index 0000000..7454fd5 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Etc/GMT @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Etc/GMT) { + {-9223372036854775808 0 0 GMT} +} diff --git a/env/tcl/tcl8.6/tzdata/Etc/GMT+0 b/env/tcl/tcl8.6/tzdata/Etc/GMT+0 new file mode 100644 index 0000000..017dee1 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Etc/GMT+0 @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(Etc/GMT)]} { + LoadTimeZoneFile Etc/GMT +} +set TZData(:Etc/GMT+0) $TZData(:Etc/GMT) diff --git a/env/tcl/tcl8.6/tzdata/Etc/GMT+1 b/env/tcl/tcl8.6/tzdata/Etc/GMT+1 new file mode 100644 index 0000000..70d39cf --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Etc/GMT+1 @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Etc/GMT+1) { + {-9223372036854775808 -3600 0 -01} +} diff --git a/env/tcl/tcl8.6/tzdata/Etc/GMT+10 b/env/tcl/tcl8.6/tzdata/Etc/GMT+10 new file mode 100644 index 0000000..9165a08 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Etc/GMT+10 @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Etc/GMT+10) { + {-9223372036854775808 -36000 0 -10} +} diff --git a/env/tcl/tcl8.6/tzdata/Etc/GMT+11 b/env/tcl/tcl8.6/tzdata/Etc/GMT+11 new file mode 100644 index 0000000..a1aaf74 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Etc/GMT+11 @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Etc/GMT+11) { + {-9223372036854775808 -39600 0 -11} +} diff --git a/env/tcl/tcl8.6/tzdata/Etc/GMT+12 b/env/tcl/tcl8.6/tzdata/Etc/GMT+12 new file mode 100644 index 0000000..d2c082a --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Etc/GMT+12 @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Etc/GMT+12) { + {-9223372036854775808 -43200 0 -12} +} diff --git a/env/tcl/tcl8.6/tzdata/Etc/GMT+2 b/env/tcl/tcl8.6/tzdata/Etc/GMT+2 new file mode 100644 index 0000000..46cca7d --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Etc/GMT+2 @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Etc/GMT+2) { + {-9223372036854775808 -7200 0 -02} +} diff --git a/env/tcl/tcl8.6/tzdata/Etc/GMT+3 b/env/tcl/tcl8.6/tzdata/Etc/GMT+3 new file mode 100644 index 0000000..e1e3001 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Etc/GMT+3 @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Etc/GMT+3) { + {-9223372036854775808 -10800 0 -03} +} diff --git a/env/tcl/tcl8.6/tzdata/Etc/GMT+4 b/env/tcl/tcl8.6/tzdata/Etc/GMT+4 new file mode 100644 index 0000000..32afa24 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Etc/GMT+4 @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Etc/GMT+4) { + {-9223372036854775808 -14400 0 -04} +} diff --git a/env/tcl/tcl8.6/tzdata/Etc/GMT+5 b/env/tcl/tcl8.6/tzdata/Etc/GMT+5 new file mode 100644 index 0000000..747abf5 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Etc/GMT+5 @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Etc/GMT+5) { + {-9223372036854775808 -18000 0 -05} +} diff --git a/env/tcl/tcl8.6/tzdata/Etc/GMT+6 b/env/tcl/tcl8.6/tzdata/Etc/GMT+6 new file mode 100644 index 0000000..1096839 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Etc/GMT+6 @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Etc/GMT+6) { + {-9223372036854775808 -21600 0 -06} +} diff --git a/env/tcl/tcl8.6/tzdata/Etc/GMT+7 b/env/tcl/tcl8.6/tzdata/Etc/GMT+7 new file mode 100644 index 0000000..6d47863 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Etc/GMT+7 @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Etc/GMT+7) { + {-9223372036854775808 -25200 0 -07} +} diff --git a/env/tcl/tcl8.6/tzdata/Etc/GMT+8 b/env/tcl/tcl8.6/tzdata/Etc/GMT+8 new file mode 100644 index 0000000..33c0f69 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Etc/GMT+8 @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Etc/GMT+8) { + {-9223372036854775808 -28800 0 -08} +} diff --git a/env/tcl/tcl8.6/tzdata/Etc/GMT+9 b/env/tcl/tcl8.6/tzdata/Etc/GMT+9 new file mode 100644 index 0000000..4119bf4 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Etc/GMT+9 @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Etc/GMT+9) { + {-9223372036854775808 -32400 0 -09} +} diff --git a/env/tcl/tcl8.6/tzdata/Etc/GMT-0 b/env/tcl/tcl8.6/tzdata/Etc/GMT-0 new file mode 100644 index 0000000..d8913d5 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Etc/GMT-0 @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(Etc/GMT)]} { + LoadTimeZoneFile Etc/GMT +} +set TZData(:Etc/GMT-0) $TZData(:Etc/GMT) diff --git a/env/tcl/tcl8.6/tzdata/Etc/GMT-1 b/env/tcl/tcl8.6/tzdata/Etc/GMT-1 new file mode 100644 index 0000000..e7ac44b --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Etc/GMT-1 @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Etc/GMT-1) { + {-9223372036854775808 3600 0 +01} +} diff --git a/env/tcl/tcl8.6/tzdata/Etc/GMT-10 b/env/tcl/tcl8.6/tzdata/Etc/GMT-10 new file mode 100644 index 0000000..fdbd1e3 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Etc/GMT-10 @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Etc/GMT-10) { + {-9223372036854775808 36000 0 +10} +} diff --git a/env/tcl/tcl8.6/tzdata/Etc/GMT-11 b/env/tcl/tcl8.6/tzdata/Etc/GMT-11 new file mode 100644 index 0000000..4b28ad0 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Etc/GMT-11 @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Etc/GMT-11) { + {-9223372036854775808 39600 0 +11} +} diff --git a/env/tcl/tcl8.6/tzdata/Etc/GMT-12 b/env/tcl/tcl8.6/tzdata/Etc/GMT-12 new file mode 100644 index 0000000..594bac3 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Etc/GMT-12 @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Etc/GMT-12) { + {-9223372036854775808 43200 0 +12} +} diff --git a/env/tcl/tcl8.6/tzdata/Etc/GMT-13 b/env/tcl/tcl8.6/tzdata/Etc/GMT-13 new file mode 100644 index 0000000..f61159e --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Etc/GMT-13 @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Etc/GMT-13) { + {-9223372036854775808 46800 0 +13} +} diff --git a/env/tcl/tcl8.6/tzdata/Etc/GMT-14 b/env/tcl/tcl8.6/tzdata/Etc/GMT-14 new file mode 100644 index 0000000..493800f --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Etc/GMT-14 @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Etc/GMT-14) { + {-9223372036854775808 50400 0 +14} +} diff --git a/env/tcl/tcl8.6/tzdata/Etc/GMT-2 b/env/tcl/tcl8.6/tzdata/Etc/GMT-2 new file mode 100644 index 0000000..51fdbed --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Etc/GMT-2 @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Etc/GMT-2) { + {-9223372036854775808 7200 0 +02} +} diff --git a/env/tcl/tcl8.6/tzdata/Etc/GMT-3 b/env/tcl/tcl8.6/tzdata/Etc/GMT-3 new file mode 100644 index 0000000..7aed39d --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Etc/GMT-3 @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Etc/GMT-3) { + {-9223372036854775808 10800 0 +03} +} diff --git a/env/tcl/tcl8.6/tzdata/Etc/GMT-4 b/env/tcl/tcl8.6/tzdata/Etc/GMT-4 new file mode 100644 index 0000000..6ca6372 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Etc/GMT-4 @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Etc/GMT-4) { + {-9223372036854775808 14400 0 +04} +} diff --git a/env/tcl/tcl8.6/tzdata/Etc/GMT-5 b/env/tcl/tcl8.6/tzdata/Etc/GMT-5 new file mode 100644 index 0000000..6c47a31 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Etc/GMT-5 @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Etc/GMT-5) { + {-9223372036854775808 18000 0 +05} +} diff --git a/env/tcl/tcl8.6/tzdata/Etc/GMT-6 b/env/tcl/tcl8.6/tzdata/Etc/GMT-6 new file mode 100644 index 0000000..202e7f8 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Etc/GMT-6 @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Etc/GMT-6) { + {-9223372036854775808 21600 0 +06} +} diff --git a/env/tcl/tcl8.6/tzdata/Etc/GMT-7 b/env/tcl/tcl8.6/tzdata/Etc/GMT-7 new file mode 100644 index 0000000..c6deaf3 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Etc/GMT-7 @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Etc/GMT-7) { + {-9223372036854775808 25200 0 +07} +} diff --git a/env/tcl/tcl8.6/tzdata/Etc/GMT-8 b/env/tcl/tcl8.6/tzdata/Etc/GMT-8 new file mode 100644 index 0000000..4bed42e --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Etc/GMT-8 @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Etc/GMT-8) { + {-9223372036854775808 28800 0 +08} +} diff --git a/env/tcl/tcl8.6/tzdata/Etc/GMT-9 b/env/tcl/tcl8.6/tzdata/Etc/GMT-9 new file mode 100644 index 0000000..2a7625b --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Etc/GMT-9 @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Etc/GMT-9) { + {-9223372036854775808 32400 0 +09} +} diff --git a/env/tcl/tcl8.6/tzdata/Etc/GMT0 b/env/tcl/tcl8.6/tzdata/Etc/GMT0 new file mode 100644 index 0000000..dba1fe9 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Etc/GMT0 @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(Etc/GMT)]} { + LoadTimeZoneFile Etc/GMT +} +set TZData(:Etc/GMT0) $TZData(:Etc/GMT) diff --git a/env/tcl/tcl8.6/tzdata/Etc/Greenwich b/env/tcl/tcl8.6/tzdata/Etc/Greenwich new file mode 100644 index 0000000..53acea0 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Etc/Greenwich @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(Etc/GMT)]} { + LoadTimeZoneFile Etc/GMT +} +set TZData(:Etc/Greenwich) $TZData(:Etc/GMT) diff --git a/env/tcl/tcl8.6/tzdata/Etc/UCT b/env/tcl/tcl8.6/tzdata/Etc/UCT new file mode 100644 index 0000000..f7d795e --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Etc/UCT @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Etc/UCT) { + {-9223372036854775808 0 0 UCT} +} diff --git a/env/tcl/tcl8.6/tzdata/Etc/UTC b/env/tcl/tcl8.6/tzdata/Etc/UTC new file mode 100644 index 0000000..db5954b --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Etc/UTC @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Etc/UTC) { + {-9223372036854775808 0 0 UTC} +} diff --git a/env/tcl/tcl8.6/tzdata/Etc/Universal b/env/tcl/tcl8.6/tzdata/Etc/Universal new file mode 100644 index 0000000..a3b7547 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Etc/Universal @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(Etc/UTC)]} { + LoadTimeZoneFile Etc/UTC +} +set TZData(:Etc/Universal) $TZData(:Etc/UTC) diff --git a/env/tcl/tcl8.6/tzdata/Etc/Zulu b/env/tcl/tcl8.6/tzdata/Etc/Zulu new file mode 100644 index 0000000..f643db9 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Etc/Zulu @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(Etc/UTC)]} { + LoadTimeZoneFile Etc/UTC +} +set TZData(:Etc/Zulu) $TZData(:Etc/UTC) diff --git a/env/tcl/tcl8.6/tzdata/Europe/Amsterdam b/env/tcl/tcl8.6/tzdata/Europe/Amsterdam new file mode 100644 index 0000000..b683c99 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Europe/Amsterdam @@ -0,0 +1,310 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Europe/Amsterdam) { + {-9223372036854775808 1172 0 LMT} + {-4260212372 1172 0 AMT} + {-1693700372 4772 1 NST} + {-1680484772 1172 0 AMT} + {-1663453172 4772 1 NST} + {-1650147572 1172 0 AMT} + {-1633213172 4772 1 NST} + {-1617488372 1172 0 AMT} + {-1601158772 4772 1 NST} + {-1586038772 1172 0 AMT} + {-1569709172 4772 1 NST} + {-1554589172 1172 0 AMT} + {-1538259572 4772 1 NST} + {-1523139572 1172 0 AMT} + {-1507501172 4772 1 NST} + {-1490566772 1172 0 AMT} + {-1470176372 4772 1 NST} + {-1459117172 1172 0 AMT} + {-1443997172 4772 1 NST} + {-1427667572 1172 0 AMT} + {-1406672372 4772 1 NST} + {-1396217972 1172 0 AMT} + {-1376950772 4772 1 NST} + {-1364768372 1172 0 AMT} + {-1345414772 4772 1 NST} + {-1333318772 1172 0 AMT} + {-1313792372 4772 1 NST} + {-1301264372 1172 0 AMT} + {-1282256372 4772 1 NST} + {-1269814772 1172 0 AMT} + {-1250720372 4772 1 NST} + {-1238365172 1172 0 AMT} + {-1219184372 4772 1 NST} + {-1206915572 1172 0 AMT} + {-1186957172 4772 1 NST} + {-1175465972 1172 0 AMT} + {-1156025972 4772 1 NST} + {-1143411572 1172 0 AMT} + {-1124489972 4772 1 NST} + {-1111961972 1172 0 AMT} + {-1092953972 4772 1 NST} + {-1080512372 1172 0 AMT} + {-1061331572 4772 1 NST} + {-1049062772 1172 0 AMT} + {-1029190772 4772 1 NST} + {-1025741972 4800 0 +0120} + {-1017613200 1200 0 +0020} + {-998259600 4800 1 +0120} + {-986163600 1200 0 +0020} + {-966723600 4800 1 +0120} + {-954109200 1200 0 +0020} + {-935022000 7200 0 CEST} + {-857257200 3600 0 CET} + {-844556400 7200 1 CEST} + {-828226800 3600 0 CET} + {-812502000 7200 1 CEST} + {-796777200 3600 0 CET} + {-781052400 7200 0 CEST} + {-766623600 3600 0 CET} + {220921200 3600 0 CET} + {228877200 7200 1 CEST} + {243997200 3600 0 CET} + {260326800 7200 1 CEST} + {276051600 3600 0 CET} + {291776400 7200 1 CEST} + {307501200 3600 0 CET} + {323830800 7200 1 CEST} + {338950800 3600 0 CET} + {354675600 7200 1 CEST} + {370400400 3600 0 CET} + {386125200 7200 1 CEST} + {401850000 3600 0 CET} + {417574800 7200 1 CEST} + {433299600 3600 0 CET} + {449024400 7200 1 CEST} + {465354000 3600 0 CET} + {481078800 7200 1 CEST} + {496803600 3600 0 CET} + {512528400 7200 1 CEST} + {528253200 3600 0 CET} + {543978000 7200 1 CEST} + {559702800 3600 0 CET} + {575427600 7200 1 CEST} + {591152400 3600 0 CET} + {606877200 7200 1 CEST} + {622602000 3600 0 CET} + {638326800 7200 1 CEST} + {654656400 3600 0 CET} + {670381200 7200 1 CEST} + {686106000 3600 0 CET} + {701830800 7200 1 CEST} + {717555600 3600 0 CET} + {733280400 7200 1 CEST} + {749005200 3600 0 CET} + {764730000 7200 1 CEST} + {780454800 3600 0 CET} + {796179600 7200 1 CEST} + {811904400 3600 0 CET} + {828234000 7200 1 CEST} + {846378000 3600 0 CET} + {859683600 7200 1 CEST} + {877827600 3600 0 CET} + {891133200 7200 1 CEST} + {909277200 3600 0 CET} + {922582800 7200 1 CEST} + {941331600 3600 0 CET} + {954032400 7200 1 CEST} + {972781200 3600 0 CET} + {985482000 7200 1 CEST} + {1004230800 3600 0 CET} + {1017536400 7200 1 CEST} + {1035680400 3600 0 CET} + {1048986000 7200 1 CEST} + {1067130000 3600 0 CET} + {1080435600 7200 1 CEST} + {1099184400 3600 0 CET} + {1111885200 7200 1 CEST} + {1130634000 3600 0 CET} + {1143334800 7200 1 CEST} + {1162083600 3600 0 CET} + {1174784400 7200 1 CEST} + {1193533200 3600 0 CET} + {1206838800 7200 1 CEST} + {1224982800 3600 0 CET} + {1238288400 7200 1 CEST} + {1256432400 3600 0 CET} + {1269738000 7200 1 CEST} + {1288486800 3600 0 CET} + {1301187600 7200 1 CEST} + {1319936400 3600 0 CET} + {1332637200 7200 1 CEST} + {1351386000 3600 0 CET} + {1364691600 7200 1 CEST} + {1382835600 3600 0 CET} + {1396141200 7200 1 CEST} + {1414285200 3600 0 CET} + {1427590800 7200 1 CEST} + {1445734800 3600 0 CET} + {1459040400 7200 1 CEST} + {1477789200 3600 0 CET} + {1490490000 7200 1 CEST} + {1509238800 3600 0 CET} + {1521939600 7200 1 CEST} + {1540688400 3600 0 CET} + {1553994000 7200 1 CEST} + {1572138000 3600 0 CET} + {1585443600 7200 1 CEST} + {1603587600 3600 0 CET} + {1616893200 7200 1 CEST} + {1635642000 3600 0 CET} + {1648342800 7200 1 CEST} + {1667091600 3600 0 CET} + {1679792400 7200 1 CEST} + {1698541200 3600 0 CET} + {1711846800 7200 1 CEST} + {1729990800 3600 0 CET} + {1743296400 7200 1 CEST} + {1761440400 3600 0 CET} + {1774746000 7200 1 CEST} + {1792890000 3600 0 CET} + {1806195600 7200 1 CEST} + {1824944400 3600 0 CET} + {1837645200 7200 1 CEST} + {1856394000 3600 0 CET} + {1869094800 7200 1 CEST} + {1887843600 3600 0 CET} + {1901149200 7200 1 CEST} + {1919293200 3600 0 CET} + {1932598800 7200 1 CEST} + {1950742800 3600 0 CET} + {1964048400 7200 1 CEST} + {1982797200 3600 0 CET} + {1995498000 7200 1 CEST} + {2014246800 3600 0 CET} + {2026947600 7200 1 CEST} + {2045696400 3600 0 CET} + {2058397200 7200 1 CEST} + {2077146000 3600 0 CET} + {2090451600 7200 1 CEST} + {2108595600 3600 0 CET} + {2121901200 7200 1 CEST} + {2140045200 3600 0 CET} + {2153350800 7200 1 CEST} + {2172099600 3600 0 CET} + {2184800400 7200 1 CEST} + {2203549200 3600 0 CET} + {2216250000 7200 1 CEST} + {2234998800 3600 0 CET} + {2248304400 7200 1 CEST} + {2266448400 3600 0 CET} + {2279754000 7200 1 CEST} + {2297898000 3600 0 CET} + {2311203600 7200 1 CEST} + {2329347600 3600 0 CET} + {2342653200 7200 1 CEST} + {2361402000 3600 0 CET} + {2374102800 7200 1 CEST} + {2392851600 3600 0 CET} + {2405552400 7200 1 CEST} + {2424301200 3600 0 CET} + {2437606800 7200 1 CEST} + {2455750800 3600 0 CET} + {2469056400 7200 1 CEST} + {2487200400 3600 0 CET} + {2500506000 7200 1 CEST} + {2519254800 3600 0 CET} + {2531955600 7200 1 CEST} + {2550704400 3600 0 CET} + {2563405200 7200 1 CEST} + {2582154000 3600 0 CET} + {2595459600 7200 1 CEST} + {2613603600 3600 0 CET} + {2626909200 7200 1 CEST} + {2645053200 3600 0 CET} + {2658358800 7200 1 CEST} + {2676502800 3600 0 CET} + {2689808400 7200 1 CEST} + {2708557200 3600 0 CET} + {2721258000 7200 1 CEST} + {2740006800 3600 0 CET} + {2752707600 7200 1 CEST} + {2771456400 3600 0 CET} + {2784762000 7200 1 CEST} + {2802906000 3600 0 CET} + {2816211600 7200 1 CEST} + {2834355600 3600 0 CET} + {2847661200 7200 1 CEST} + {2866410000 3600 0 CET} + {2879110800 7200 1 CEST} + {2897859600 3600 0 CET} + {2910560400 7200 1 CEST} + {2929309200 3600 0 CET} + {2942010000 7200 1 CEST} + {2960758800 3600 0 CET} + {2974064400 7200 1 CEST} + {2992208400 3600 0 CET} + {3005514000 7200 1 CEST} + {3023658000 3600 0 CET} + {3036963600 7200 1 CEST} + {3055712400 3600 0 CET} + {3068413200 7200 1 CEST} + {3087162000 3600 0 CET} + {3099862800 7200 1 CEST} + {3118611600 3600 0 CET} + {3131917200 7200 1 CEST} + {3150061200 3600 0 CET} + {3163366800 7200 1 CEST} + {3181510800 3600 0 CET} + {3194816400 7200 1 CEST} + {3212960400 3600 0 CET} + {3226266000 7200 1 CEST} + {3245014800 3600 0 CET} + {3257715600 7200 1 CEST} + {3276464400 3600 0 CET} + {3289165200 7200 1 CEST} + {3307914000 3600 0 CET} + {3321219600 7200 1 CEST} + {3339363600 3600 0 CET} + {3352669200 7200 1 CEST} + {3370813200 3600 0 CET} + {3384118800 7200 1 CEST} + {3402867600 3600 0 CET} + {3415568400 7200 1 CEST} + {3434317200 3600 0 CET} + {3447018000 7200 1 CEST} + {3465766800 3600 0 CET} + {3479072400 7200 1 CEST} + {3497216400 3600 0 CET} + {3510522000 7200 1 CEST} + {3528666000 3600 0 CET} + {3541971600 7200 1 CEST} + {3560115600 3600 0 CET} + {3573421200 7200 1 CEST} + {3592170000 3600 0 CET} + {3604870800 7200 1 CEST} + {3623619600 3600 0 CET} + {3636320400 7200 1 CEST} + {3655069200 3600 0 CET} + {3668374800 7200 1 CEST} + {3686518800 3600 0 CET} + {3699824400 7200 1 CEST} + {3717968400 3600 0 CET} + {3731274000 7200 1 CEST} + {3750022800 3600 0 CET} + {3762723600 7200 1 CEST} + {3781472400 3600 0 CET} + {3794173200 7200 1 CEST} + {3812922000 3600 0 CET} + {3825622800 7200 1 CEST} + {3844371600 3600 0 CET} + {3857677200 7200 1 CEST} + {3875821200 3600 0 CET} + {3889126800 7200 1 CEST} + {3907270800 3600 0 CET} + {3920576400 7200 1 CEST} + {3939325200 3600 0 CET} + {3952026000 7200 1 CEST} + {3970774800 3600 0 CET} + {3983475600 7200 1 CEST} + {4002224400 3600 0 CET} + {4015530000 7200 1 CEST} + {4033674000 3600 0 CET} + {4046979600 7200 1 CEST} + {4065123600 3600 0 CET} + {4078429200 7200 1 CEST} + {4096573200 3600 0 CET} +} diff --git a/env/tcl/tcl8.6/tzdata/Europe/Andorra b/env/tcl/tcl8.6/tzdata/Europe/Andorra new file mode 100644 index 0000000..89233fe --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Europe/Andorra @@ -0,0 +1,237 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Europe/Andorra) { + {-9223372036854775808 364 0 LMT} + {-2177453164 0 0 WET} + {-733881600 3600 0 CET} + {481078800 7200 0 CEST} + {496803600 3600 0 CET} + {512528400 7200 1 CEST} + {528253200 3600 0 CET} + {543978000 7200 1 CEST} + {559702800 3600 0 CET} + {575427600 7200 1 CEST} + {591152400 3600 0 CET} + {606877200 7200 1 CEST} + {622602000 3600 0 CET} + {638326800 7200 1 CEST} + {654656400 3600 0 CET} + {670381200 7200 1 CEST} + {686106000 3600 0 CET} + {701830800 7200 1 CEST} + {717555600 3600 0 CET} + {733280400 7200 1 CEST} + {749005200 3600 0 CET} + {764730000 7200 1 CEST} + {780454800 3600 0 CET} + {796179600 7200 1 CEST} + {811904400 3600 0 CET} + {828234000 7200 1 CEST} + {846378000 3600 0 CET} + {859683600 7200 1 CEST} + {877827600 3600 0 CET} + {891133200 7200 1 CEST} + {909277200 3600 0 CET} + {922582800 7200 1 CEST} + {941331600 3600 0 CET} + {954032400 7200 1 CEST} + {972781200 3600 0 CET} + {985482000 7200 1 CEST} + {1004230800 3600 0 CET} + {1017536400 7200 1 CEST} + {1035680400 3600 0 CET} + {1048986000 7200 1 CEST} + {1067130000 3600 0 CET} + {1080435600 7200 1 CEST} + {1099184400 3600 0 CET} + {1111885200 7200 1 CEST} + {1130634000 3600 0 CET} + {1143334800 7200 1 CEST} + {1162083600 3600 0 CET} + {1174784400 7200 1 CEST} + {1193533200 3600 0 CET} + {1206838800 7200 1 CEST} + {1224982800 3600 0 CET} + {1238288400 7200 1 CEST} + {1256432400 3600 0 CET} + {1269738000 7200 1 CEST} + {1288486800 3600 0 CET} + {1301187600 7200 1 CEST} + {1319936400 3600 0 CET} + {1332637200 7200 1 CEST} + {1351386000 3600 0 CET} + {1364691600 7200 1 CEST} + {1382835600 3600 0 CET} + {1396141200 7200 1 CEST} + {1414285200 3600 0 CET} + {1427590800 7200 1 CEST} + {1445734800 3600 0 CET} + {1459040400 7200 1 CEST} + {1477789200 3600 0 CET} + {1490490000 7200 1 CEST} + {1509238800 3600 0 CET} + {1521939600 7200 1 CEST} + {1540688400 3600 0 CET} + {1553994000 7200 1 CEST} + {1572138000 3600 0 CET} + {1585443600 7200 1 CEST} + {1603587600 3600 0 CET} + {1616893200 7200 1 CEST} + {1635642000 3600 0 CET} + {1648342800 7200 1 CEST} + {1667091600 3600 0 CET} + {1679792400 7200 1 CEST} + {1698541200 3600 0 CET} + {1711846800 7200 1 CEST} + {1729990800 3600 0 CET} + {1743296400 7200 1 CEST} + {1761440400 3600 0 CET} + {1774746000 7200 1 CEST} + {1792890000 3600 0 CET} + {1806195600 7200 1 CEST} + {1824944400 3600 0 CET} + {1837645200 7200 1 CEST} + {1856394000 3600 0 CET} + {1869094800 7200 1 CEST} + {1887843600 3600 0 CET} + {1901149200 7200 1 CEST} + {1919293200 3600 0 CET} + {1932598800 7200 1 CEST} + {1950742800 3600 0 CET} + {1964048400 7200 1 CEST} + {1982797200 3600 0 CET} + {1995498000 7200 1 CEST} + {2014246800 3600 0 CET} + {2026947600 7200 1 CEST} + {2045696400 3600 0 CET} + {2058397200 7200 1 CEST} + {2077146000 3600 0 CET} + {2090451600 7200 1 CEST} + {2108595600 3600 0 CET} + {2121901200 7200 1 CEST} + {2140045200 3600 0 CET} + {2153350800 7200 1 CEST} + {2172099600 3600 0 CET} + {2184800400 7200 1 CEST} + {2203549200 3600 0 CET} + {2216250000 7200 1 CEST} + {2234998800 3600 0 CET} + {2248304400 7200 1 CEST} + {2266448400 3600 0 CET} + {2279754000 7200 1 CEST} + {2297898000 3600 0 CET} + {2311203600 7200 1 CEST} + {2329347600 3600 0 CET} + {2342653200 7200 1 CEST} + {2361402000 3600 0 CET} + {2374102800 7200 1 CEST} + {2392851600 3600 0 CET} + {2405552400 7200 1 CEST} + {2424301200 3600 0 CET} + {2437606800 7200 1 CEST} + {2455750800 3600 0 CET} + {2469056400 7200 1 CEST} + {2487200400 3600 0 CET} + {2500506000 7200 1 CEST} + {2519254800 3600 0 CET} + {2531955600 7200 1 CEST} + {2550704400 3600 0 CET} + {2563405200 7200 1 CEST} + {2582154000 3600 0 CET} + {2595459600 7200 1 CEST} + {2613603600 3600 0 CET} + {2626909200 7200 1 CEST} + {2645053200 3600 0 CET} + {2658358800 7200 1 CEST} + {2676502800 3600 0 CET} + {2689808400 7200 1 CEST} + {2708557200 3600 0 CET} + {2721258000 7200 1 CEST} + {2740006800 3600 0 CET} + {2752707600 7200 1 CEST} + {2771456400 3600 0 CET} + {2784762000 7200 1 CEST} + {2802906000 3600 0 CET} + {2816211600 7200 1 CEST} + {2834355600 3600 0 CET} + {2847661200 7200 1 CEST} + {2866410000 3600 0 CET} + {2879110800 7200 1 CEST} + {2897859600 3600 0 CET} + {2910560400 7200 1 CEST} + {2929309200 3600 0 CET} + {2942010000 7200 1 CEST} + {2960758800 3600 0 CET} + {2974064400 7200 1 CEST} + {2992208400 3600 0 CET} + {3005514000 7200 1 CEST} + {3023658000 3600 0 CET} + {3036963600 7200 1 CEST} + {3055712400 3600 0 CET} + {3068413200 7200 1 CEST} + {3087162000 3600 0 CET} + {3099862800 7200 1 CEST} + {3118611600 3600 0 CET} + {3131917200 7200 1 CEST} + {3150061200 3600 0 CET} + {3163366800 7200 1 CEST} + {3181510800 3600 0 CET} + {3194816400 7200 1 CEST} + {3212960400 3600 0 CET} + {3226266000 7200 1 CEST} + {3245014800 3600 0 CET} + {3257715600 7200 1 CEST} + {3276464400 3600 0 CET} + {3289165200 7200 1 CEST} + {3307914000 3600 0 CET} + {3321219600 7200 1 CEST} + {3339363600 3600 0 CET} + {3352669200 7200 1 CEST} + {3370813200 3600 0 CET} + {3384118800 7200 1 CEST} + {3402867600 3600 0 CET} + {3415568400 7200 1 CEST} + {3434317200 3600 0 CET} + {3447018000 7200 1 CEST} + {3465766800 3600 0 CET} + {3479072400 7200 1 CEST} + {3497216400 3600 0 CET} + {3510522000 7200 1 CEST} + {3528666000 3600 0 CET} + {3541971600 7200 1 CEST} + {3560115600 3600 0 CET} + {3573421200 7200 1 CEST} + {3592170000 3600 0 CET} + {3604870800 7200 1 CEST} + {3623619600 3600 0 CET} + {3636320400 7200 1 CEST} + {3655069200 3600 0 CET} + {3668374800 7200 1 CEST} + {3686518800 3600 0 CET} + {3699824400 7200 1 CEST} + {3717968400 3600 0 CET} + {3731274000 7200 1 CEST} + {3750022800 3600 0 CET} + {3762723600 7200 1 CEST} + {3781472400 3600 0 CET} + {3794173200 7200 1 CEST} + {3812922000 3600 0 CET} + {3825622800 7200 1 CEST} + {3844371600 3600 0 CET} + {3857677200 7200 1 CEST} + {3875821200 3600 0 CET} + {3889126800 7200 1 CEST} + {3907270800 3600 0 CET} + {3920576400 7200 1 CEST} + {3939325200 3600 0 CET} + {3952026000 7200 1 CEST} + {3970774800 3600 0 CET} + {3983475600 7200 1 CEST} + {4002224400 3600 0 CET} + {4015530000 7200 1 CEST} + {4033674000 3600 0 CET} + {4046979600 7200 1 CEST} + {4065123600 3600 0 CET} + {4078429200 7200 1 CEST} + {4096573200 3600 0 CET} +} diff --git a/env/tcl/tcl8.6/tzdata/Europe/Astrakhan b/env/tcl/tcl8.6/tzdata/Europe/Astrakhan new file mode 100644 index 0000000..9881bb8 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Europe/Astrakhan @@ -0,0 +1,71 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Europe/Astrakhan) { + {-9223372036854775808 11532 0 LMT} + {-1441249932 10800 0 +03} + {-1247540400 14400 0 +05} + {354916800 18000 1 +05} + {370724400 14400 0 +04} + {386452800 18000 1 +05} + {402260400 14400 0 +04} + {417988800 18000 1 +05} + {433796400 14400 0 +04} + {449611200 18000 1 +05} + {465343200 14400 0 +04} + {481068000 18000 1 +05} + {496792800 14400 0 +04} + {512517600 18000 1 +05} + {528242400 14400 0 +04} + {543967200 18000 1 +05} + {559692000 14400 0 +04} + {575416800 18000 1 +05} + {591141600 14400 0 +04} + {606866400 10800 0 +04} + {606870000 14400 1 +04} + {622594800 10800 0 +03} + {638319600 14400 1 +04} + {654649200 10800 0 +03} + {670374000 14400 0 +04} + {701820000 10800 0 +04} + {701823600 14400 1 +04} + {717548400 10800 0 +03} + {733273200 14400 1 +04} + {748998000 10800 0 +03} + {764722800 14400 1 +04} + {780447600 10800 0 +03} + {796172400 14400 1 +04} + {811897200 10800 0 +03} + {828226800 14400 1 +04} + {846370800 10800 0 +03} + {859676400 14400 1 +04} + {877820400 10800 0 +03} + {891126000 14400 1 +04} + {909270000 10800 0 +03} + {922575600 14400 1 +04} + {941324400 10800 0 +03} + {954025200 14400 1 +04} + {972774000 10800 0 +03} + {985474800 14400 1 +04} + {1004223600 10800 0 +03} + {1017529200 14400 1 +04} + {1035673200 10800 0 +03} + {1048978800 14400 1 +04} + {1067122800 10800 0 +03} + {1080428400 14400 1 +04} + {1099177200 10800 0 +03} + {1111878000 14400 1 +04} + {1130626800 10800 0 +03} + {1143327600 14400 1 +04} + {1162076400 10800 0 +03} + {1174777200 14400 1 +04} + {1193526000 10800 0 +03} + {1206831600 14400 1 +04} + {1224975600 10800 0 +03} + {1238281200 14400 1 +04} + {1256425200 10800 0 +03} + {1269730800 14400 1 +04} + {1288479600 10800 0 +03} + {1301180400 14400 0 +04} + {1414274400 10800 0 +03} + {1459033200 14400 0 +04} +} diff --git a/env/tcl/tcl8.6/tzdata/Europe/Athens b/env/tcl/tcl8.6/tzdata/Europe/Athens new file mode 100644 index 0000000..f8df408 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Europe/Athens @@ -0,0 +1,268 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Europe/Athens) { + {-9223372036854775808 5692 0 LMT} + {-2344642492 5692 0 AMT} + {-1686101632 7200 0 EET} + {-1182996000 10800 1 EEST} + {-1178161200 7200 0 EET} + {-906861600 10800 1 EEST} + {-904878000 7200 0 CEST} + {-857257200 3600 0 CET} + {-844477200 7200 1 CEST} + {-828237600 3600 0 CET} + {-812422800 7200 0 EET} + {-552362400 10800 1 EEST} + {-541652400 7200 0 EET} + {166485600 10800 1 EEST} + {186184800 7200 0 EET} + {198028800 10800 1 EEST} + {213753600 7200 0 EET} + {228873600 10800 1 EEST} + {244080000 7200 0 EET} + {260323200 10800 1 EEST} + {275446800 7200 0 EET} + {291798000 10800 1 EEST} + {307407600 7200 0 EET} + {323388000 10800 1 EEST} + {338936400 7200 0 EET} + {347148000 7200 0 EET} + {354675600 10800 1 EEST} + {370400400 7200 0 EET} + {386125200 10800 1 EEST} + {401850000 7200 0 EET} + {417574800 10800 1 EEST} + {433299600 7200 0 EET} + {449024400 10800 1 EEST} + {465354000 7200 0 EET} + {481078800 10800 1 EEST} + {496803600 7200 0 EET} + {512528400 10800 1 EEST} + {528253200 7200 0 EET} + {543978000 10800 1 EEST} + {559702800 7200 0 EET} + {575427600 10800 1 EEST} + {591152400 7200 0 EET} + {606877200 10800 1 EEST} + {622602000 7200 0 EET} + {638326800 10800 1 EEST} + {654656400 7200 0 EET} + {670381200 10800 1 EEST} + {686106000 7200 0 EET} + {701830800 10800 1 EEST} + {717555600 7200 0 EET} + {733280400 10800 1 EEST} + {749005200 7200 0 EET} + {764730000 10800 1 EEST} + {780454800 7200 0 EET} + {796179600 10800 1 EEST} + {811904400 7200 0 EET} + {828234000 10800 1 EEST} + {846378000 7200 0 EET} + {859683600 10800 1 EEST} + {877827600 7200 0 EET} + {891133200 10800 1 EEST} + {909277200 7200 0 EET} + {922582800 10800 1 EEST} + {941331600 7200 0 EET} + {954032400 10800 1 EEST} + {972781200 7200 0 EET} + {985482000 10800 1 EEST} + {1004230800 7200 0 EET} + {1017536400 10800 1 EEST} + {1035680400 7200 0 EET} + {1048986000 10800 1 EEST} + {1067130000 7200 0 EET} + {1080435600 10800 1 EEST} + {1099184400 7200 0 EET} + {1111885200 10800 1 EEST} + {1130634000 7200 0 EET} + {1143334800 10800 1 EEST} + {1162083600 7200 0 EET} + {1174784400 10800 1 EEST} + {1193533200 7200 0 EET} + {1206838800 10800 1 EEST} + {1224982800 7200 0 EET} + {1238288400 10800 1 EEST} + {1256432400 7200 0 EET} + {1269738000 10800 1 EEST} + {1288486800 7200 0 EET} + {1301187600 10800 1 EEST} + {1319936400 7200 0 EET} + {1332637200 10800 1 EEST} + {1351386000 7200 0 EET} + {1364691600 10800 1 EEST} + {1382835600 7200 0 EET} + {1396141200 10800 1 EEST} + {1414285200 7200 0 EET} + {1427590800 10800 1 EEST} + {1445734800 7200 0 EET} + {1459040400 10800 1 EEST} + {1477789200 7200 0 EET} + {1490490000 10800 1 EEST} + {1509238800 7200 0 EET} + {1521939600 10800 1 EEST} + {1540688400 7200 0 EET} + {1553994000 10800 1 EEST} + {1572138000 7200 0 EET} + {1585443600 10800 1 EEST} + {1603587600 7200 0 EET} + {1616893200 10800 1 EEST} + {1635642000 7200 0 EET} + {1648342800 10800 1 EEST} + {1667091600 7200 0 EET} + {1679792400 10800 1 EEST} + {1698541200 7200 0 EET} + {1711846800 10800 1 EEST} + {1729990800 7200 0 EET} + {1743296400 10800 1 EEST} + {1761440400 7200 0 EET} + {1774746000 10800 1 EEST} + {1792890000 7200 0 EET} + {1806195600 10800 1 EEST} + {1824944400 7200 0 EET} + {1837645200 10800 1 EEST} + {1856394000 7200 0 EET} + {1869094800 10800 1 EEST} + {1887843600 7200 0 EET} + {1901149200 10800 1 EEST} + {1919293200 7200 0 EET} + {1932598800 10800 1 EEST} + {1950742800 7200 0 EET} + {1964048400 10800 1 EEST} + {1982797200 7200 0 EET} + {1995498000 10800 1 EEST} + {2014246800 7200 0 EET} + {2026947600 10800 1 EEST} + {2045696400 7200 0 EET} + {2058397200 10800 1 EEST} + {2077146000 7200 0 EET} + {2090451600 10800 1 EEST} + {2108595600 7200 0 EET} + {2121901200 10800 1 EEST} + {2140045200 7200 0 EET} + {2153350800 10800 1 EEST} + {2172099600 7200 0 EET} + {2184800400 10800 1 EEST} + {2203549200 7200 0 EET} + {2216250000 10800 1 EEST} + {2234998800 7200 0 EET} + {2248304400 10800 1 EEST} + {2266448400 7200 0 EET} + {2279754000 10800 1 EEST} + {2297898000 7200 0 EET} + {2311203600 10800 1 EEST} + {2329347600 7200 0 EET} + {2342653200 10800 1 EEST} + {2361402000 7200 0 EET} + {2374102800 10800 1 EEST} + {2392851600 7200 0 EET} + {2405552400 10800 1 EEST} + {2424301200 7200 0 EET} + {2437606800 10800 1 EEST} + {2455750800 7200 0 EET} + {2469056400 10800 1 EEST} + {2487200400 7200 0 EET} + {2500506000 10800 1 EEST} + {2519254800 7200 0 EET} + {2531955600 10800 1 EEST} + {2550704400 7200 0 EET} + {2563405200 10800 1 EEST} + {2582154000 7200 0 EET} + {2595459600 10800 1 EEST} + {2613603600 7200 0 EET} + {2626909200 10800 1 EEST} + {2645053200 7200 0 EET} + {2658358800 10800 1 EEST} + {2676502800 7200 0 EET} + {2689808400 10800 1 EEST} + {2708557200 7200 0 EET} + {2721258000 10800 1 EEST} + {2740006800 7200 0 EET} + {2752707600 10800 1 EEST} + {2771456400 7200 0 EET} + {2784762000 10800 1 EEST} + {2802906000 7200 0 EET} + {2816211600 10800 1 EEST} + {2834355600 7200 0 EET} + {2847661200 10800 1 EEST} + {2866410000 7200 0 EET} + {2879110800 10800 1 EEST} + {2897859600 7200 0 EET} + {2910560400 10800 1 EEST} + {2929309200 7200 0 EET} + {2942010000 10800 1 EEST} + {2960758800 7200 0 EET} + {2974064400 10800 1 EEST} + {2992208400 7200 0 EET} + {3005514000 10800 1 EEST} + {3023658000 7200 0 EET} + {3036963600 10800 1 EEST} + {3055712400 7200 0 EET} + {3068413200 10800 1 EEST} + {3087162000 7200 0 EET} + {3099862800 10800 1 EEST} + {3118611600 7200 0 EET} + {3131917200 10800 1 EEST} + {3150061200 7200 0 EET} + {3163366800 10800 1 EEST} + {3181510800 7200 0 EET} + {3194816400 10800 1 EEST} + {3212960400 7200 0 EET} + {3226266000 10800 1 EEST} + {3245014800 7200 0 EET} + {3257715600 10800 1 EEST} + {3276464400 7200 0 EET} + {3289165200 10800 1 EEST} + {3307914000 7200 0 EET} + {3321219600 10800 1 EEST} + {3339363600 7200 0 EET} + {3352669200 10800 1 EEST} + {3370813200 7200 0 EET} + {3384118800 10800 1 EEST} + {3402867600 7200 0 EET} + {3415568400 10800 1 EEST} + {3434317200 7200 0 EET} + {3447018000 10800 1 EEST} + {3465766800 7200 0 EET} + {3479072400 10800 1 EEST} + {3497216400 7200 0 EET} + {3510522000 10800 1 EEST} + {3528666000 7200 0 EET} + {3541971600 10800 1 EEST} + {3560115600 7200 0 EET} + {3573421200 10800 1 EEST} + {3592170000 7200 0 EET} + {3604870800 10800 1 EEST} + {3623619600 7200 0 EET} + {3636320400 10800 1 EEST} + {3655069200 7200 0 EET} + {3668374800 10800 1 EEST} + {3686518800 7200 0 EET} + {3699824400 10800 1 EEST} + {3717968400 7200 0 EET} + {3731274000 10800 1 EEST} + {3750022800 7200 0 EET} + {3762723600 10800 1 EEST} + {3781472400 7200 0 EET} + {3794173200 10800 1 EEST} + {3812922000 7200 0 EET} + {3825622800 10800 1 EEST} + {3844371600 7200 0 EET} + {3857677200 10800 1 EEST} + {3875821200 7200 0 EET} + {3889126800 10800 1 EEST} + {3907270800 7200 0 EET} + {3920576400 10800 1 EEST} + {3939325200 7200 0 EET} + {3952026000 10800 1 EEST} + {3970774800 7200 0 EET} + {3983475600 10800 1 EEST} + {4002224400 7200 0 EET} + {4015530000 10800 1 EEST} + {4033674000 7200 0 EET} + {4046979600 10800 1 EEST} + {4065123600 7200 0 EET} + {4078429200 10800 1 EEST} + {4096573200 7200 0 EET} +} diff --git a/env/tcl/tcl8.6/tzdata/Europe/Belfast b/env/tcl/tcl8.6/tzdata/Europe/Belfast new file mode 100644 index 0000000..51cd3ce --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Europe/Belfast @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(Europe/London)]} { + LoadTimeZoneFile Europe/London +} +set TZData(:Europe/Belfast) $TZData(:Europe/London) diff --git a/env/tcl/tcl8.6/tzdata/Europe/Belgrade b/env/tcl/tcl8.6/tzdata/Europe/Belgrade new file mode 100644 index 0000000..b11f7b3 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Europe/Belgrade @@ -0,0 +1,250 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Europe/Belgrade) { + {-9223372036854775808 4920 0 LMT} + {-2713915320 3600 0 CET} + {-905824800 3600 0 CET} + {-857257200 3600 0 CET} + {-844556400 7200 1 CEST} + {-828226800 3600 0 CET} + {-812502000 7200 1 CEST} + {-796777200 3600 0 CET} + {-788922000 3600 0 CET} + {-777942000 7200 1 CEST} + {-766623600 3600 0 CET} + {407199600 3600 0 CET} + {417574800 7200 1 CEST} + {433299600 3600 0 CET} + {449024400 7200 1 CEST} + {465354000 3600 0 CET} + {481078800 7200 1 CEST} + {496803600 3600 0 CET} + {512528400 7200 1 CEST} + {528253200 3600 0 CET} + {543978000 7200 1 CEST} + {559702800 3600 0 CET} + {575427600 7200 1 CEST} + {591152400 3600 0 CET} + {606877200 7200 1 CEST} + {622602000 3600 0 CET} + {638326800 7200 1 CEST} + {654656400 3600 0 CET} + {670381200 7200 1 CEST} + {686106000 3600 0 CET} + {701830800 7200 1 CEST} + {717555600 3600 0 CET} + {733280400 7200 1 CEST} + {749005200 3600 0 CET} + {764730000 7200 1 CEST} + {780454800 3600 0 CET} + {796179600 7200 1 CEST} + {811904400 3600 0 CET} + {828234000 7200 1 CEST} + {846378000 3600 0 CET} + {859683600 7200 1 CEST} + {877827600 3600 0 CET} + {891133200 7200 1 CEST} + {909277200 3600 0 CET} + {922582800 7200 1 CEST} + {941331600 3600 0 CET} + {954032400 7200 1 CEST} + {972781200 3600 0 CET} + {985482000 7200 1 CEST} + {1004230800 3600 0 CET} + {1017536400 7200 1 CEST} + {1035680400 3600 0 CET} + {1048986000 7200 1 CEST} + {1067130000 3600 0 CET} + {1080435600 7200 1 CEST} + {1099184400 3600 0 CET} + {1111885200 7200 1 CEST} + {1130634000 3600 0 CET} + {1143334800 7200 1 CEST} + {1162083600 3600 0 CET} + {1174784400 7200 1 CEST} + {1193533200 3600 0 CET} + {1206838800 7200 1 CEST} + {1224982800 3600 0 CET} + {1238288400 7200 1 CEST} + {1256432400 3600 0 CET} + {1269738000 7200 1 CEST} + {1288486800 3600 0 CET} + {1301187600 7200 1 CEST} + {1319936400 3600 0 CET} + {1332637200 7200 1 CEST} + {1351386000 3600 0 CET} + {1364691600 7200 1 CEST} + {1382835600 3600 0 CET} + {1396141200 7200 1 CEST} + {1414285200 3600 0 CET} + {1427590800 7200 1 CEST} + {1445734800 3600 0 CET} + {1459040400 7200 1 CEST} + {1477789200 3600 0 CET} + {1490490000 7200 1 CEST} + {1509238800 3600 0 CET} + {1521939600 7200 1 CEST} + {1540688400 3600 0 CET} + {1553994000 7200 1 CEST} + {1572138000 3600 0 CET} + {1585443600 7200 1 CEST} + {1603587600 3600 0 CET} + {1616893200 7200 1 CEST} + {1635642000 3600 0 CET} + {1648342800 7200 1 CEST} + {1667091600 3600 0 CET} + {1679792400 7200 1 CEST} + {1698541200 3600 0 CET} + {1711846800 7200 1 CEST} + {1729990800 3600 0 CET} + {1743296400 7200 1 CEST} + {1761440400 3600 0 CET} + {1774746000 7200 1 CEST} + {1792890000 3600 0 CET} + {1806195600 7200 1 CEST} + {1824944400 3600 0 CET} + {1837645200 7200 1 CEST} + {1856394000 3600 0 CET} + {1869094800 7200 1 CEST} + {1887843600 3600 0 CET} + {1901149200 7200 1 CEST} + {1919293200 3600 0 CET} + {1932598800 7200 1 CEST} + {1950742800 3600 0 CET} + {1964048400 7200 1 CEST} + {1982797200 3600 0 CET} + {1995498000 7200 1 CEST} + {2014246800 3600 0 CET} + {2026947600 7200 1 CEST} + {2045696400 3600 0 CET} + {2058397200 7200 1 CEST} + {2077146000 3600 0 CET} + {2090451600 7200 1 CEST} + {2108595600 3600 0 CET} + {2121901200 7200 1 CEST} + {2140045200 3600 0 CET} + {2153350800 7200 1 CEST} + {2172099600 3600 0 CET} + {2184800400 7200 1 CEST} + {2203549200 3600 0 CET} + {2216250000 7200 1 CEST} + {2234998800 3600 0 CET} + {2248304400 7200 1 CEST} + {2266448400 3600 0 CET} + {2279754000 7200 1 CEST} + {2297898000 3600 0 CET} + {2311203600 7200 1 CEST} + {2329347600 3600 0 CET} + {2342653200 7200 1 CEST} + {2361402000 3600 0 CET} + {2374102800 7200 1 CEST} + {2392851600 3600 0 CET} + {2405552400 7200 1 CEST} + {2424301200 3600 0 CET} + {2437606800 7200 1 CEST} + {2455750800 3600 0 CET} + {2469056400 7200 1 CEST} + {2487200400 3600 0 CET} + {2500506000 7200 1 CEST} + {2519254800 3600 0 CET} + {2531955600 7200 1 CEST} + {2550704400 3600 0 CET} + {2563405200 7200 1 CEST} + {2582154000 3600 0 CET} + {2595459600 7200 1 CEST} + {2613603600 3600 0 CET} + {2626909200 7200 1 CEST} + {2645053200 3600 0 CET} + {2658358800 7200 1 CEST} + {2676502800 3600 0 CET} + {2689808400 7200 1 CEST} + {2708557200 3600 0 CET} + {2721258000 7200 1 CEST} + {2740006800 3600 0 CET} + {2752707600 7200 1 CEST} + {2771456400 3600 0 CET} + {2784762000 7200 1 CEST} + {2802906000 3600 0 CET} + {2816211600 7200 1 CEST} + {2834355600 3600 0 CET} + {2847661200 7200 1 CEST} + {2866410000 3600 0 CET} + {2879110800 7200 1 CEST} + {2897859600 3600 0 CET} + {2910560400 7200 1 CEST} + {2929309200 3600 0 CET} + {2942010000 7200 1 CEST} + {2960758800 3600 0 CET} + {2974064400 7200 1 CEST} + {2992208400 3600 0 CET} + {3005514000 7200 1 CEST} + {3023658000 3600 0 CET} + {3036963600 7200 1 CEST} + {3055712400 3600 0 CET} + {3068413200 7200 1 CEST} + {3087162000 3600 0 CET} + {3099862800 7200 1 CEST} + {3118611600 3600 0 CET} + {3131917200 7200 1 CEST} + {3150061200 3600 0 CET} + {3163366800 7200 1 CEST} + {3181510800 3600 0 CET} + {3194816400 7200 1 CEST} + {3212960400 3600 0 CET} + {3226266000 7200 1 CEST} + {3245014800 3600 0 CET} + {3257715600 7200 1 CEST} + {3276464400 3600 0 CET} + {3289165200 7200 1 CEST} + {3307914000 3600 0 CET} + {3321219600 7200 1 CEST} + {3339363600 3600 0 CET} + {3352669200 7200 1 CEST} + {3370813200 3600 0 CET} + {3384118800 7200 1 CEST} + {3402867600 3600 0 CET} + {3415568400 7200 1 CEST} + {3434317200 3600 0 CET} + {3447018000 7200 1 CEST} + {3465766800 3600 0 CET} + {3479072400 7200 1 CEST} + {3497216400 3600 0 CET} + {3510522000 7200 1 CEST} + {3528666000 3600 0 CET} + {3541971600 7200 1 CEST} + {3560115600 3600 0 CET} + {3573421200 7200 1 CEST} + {3592170000 3600 0 CET} + {3604870800 7200 1 CEST} + {3623619600 3600 0 CET} + {3636320400 7200 1 CEST} + {3655069200 3600 0 CET} + {3668374800 7200 1 CEST} + {3686518800 3600 0 CET} + {3699824400 7200 1 CEST} + {3717968400 3600 0 CET} + {3731274000 7200 1 CEST} + {3750022800 3600 0 CET} + {3762723600 7200 1 CEST} + {3781472400 3600 0 CET} + {3794173200 7200 1 CEST} + {3812922000 3600 0 CET} + {3825622800 7200 1 CEST} + {3844371600 3600 0 CET} + {3857677200 7200 1 CEST} + {3875821200 3600 0 CET} + {3889126800 7200 1 CEST} + {3907270800 3600 0 CET} + {3920576400 7200 1 CEST} + {3939325200 3600 0 CET} + {3952026000 7200 1 CEST} + {3970774800 3600 0 CET} + {3983475600 7200 1 CEST} + {4002224400 3600 0 CET} + {4015530000 7200 1 CEST} + {4033674000 3600 0 CET} + {4046979600 7200 1 CEST} + {4065123600 3600 0 CET} + {4078429200 7200 1 CEST} + {4096573200 3600 0 CET} +} diff --git a/env/tcl/tcl8.6/tzdata/Europe/Berlin b/env/tcl/tcl8.6/tzdata/Europe/Berlin new file mode 100644 index 0000000..5469cf6 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Europe/Berlin @@ -0,0 +1,274 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Europe/Berlin) { + {-9223372036854775808 3208 0 LMT} + {-2422054408 3600 0 CET} + {-1693706400 7200 1 CEST} + {-1680483600 3600 0 CET} + {-1663455600 7200 1 CEST} + {-1650150000 3600 0 CET} + {-1632006000 7200 1 CEST} + {-1618700400 3600 0 CET} + {-938905200 7200 1 CEST} + {-857257200 3600 0 CET} + {-844556400 7200 1 CEST} + {-828226800 3600 0 CET} + {-812502000 7200 1 CEST} + {-796777200 3600 0 CET} + {-781052400 7200 1 CEST} + {-776559600 10800 0 CEMT} + {-765936000 7200 1 CEST} + {-761180400 3600 0 CET} + {-757386000 3600 0 CET} + {-748479600 7200 1 CEST} + {-733273200 3600 0 CET} + {-717631200 7200 1 CEST} + {-714610800 10800 1 CEMT} + {-710380800 7200 1 CEST} + {-701910000 3600 0 CET} + {-684975600 7200 1 CEST} + {-670460400 3600 0 CET} + {-654130800 7200 1 CEST} + {-639010800 3600 0 CET} + {315529200 3600 0 CET} + {323830800 7200 1 CEST} + {338950800 3600 0 CET} + {354675600 7200 1 CEST} + {370400400 3600 0 CET} + {386125200 7200 1 CEST} + {401850000 3600 0 CET} + {417574800 7200 1 CEST} + {433299600 3600 0 CET} + {449024400 7200 1 CEST} + {465354000 3600 0 CET} + {481078800 7200 1 CEST} + {496803600 3600 0 CET} + {512528400 7200 1 CEST} + {528253200 3600 0 CET} + {543978000 7200 1 CEST} + {559702800 3600 0 CET} + {575427600 7200 1 CEST} + {591152400 3600 0 CET} + {606877200 7200 1 CEST} + {622602000 3600 0 CET} + {638326800 7200 1 CEST} + {654656400 3600 0 CET} + {670381200 7200 1 CEST} + {686106000 3600 0 CET} + {701830800 7200 1 CEST} + {717555600 3600 0 CET} + {733280400 7200 1 CEST} + {749005200 3600 0 CET} + {764730000 7200 1 CEST} + {780454800 3600 0 CET} + {796179600 7200 1 CEST} + {811904400 3600 0 CET} + {828234000 7200 1 CEST} + {846378000 3600 0 CET} + {859683600 7200 1 CEST} + {877827600 3600 0 CET} + {891133200 7200 1 CEST} + {909277200 3600 0 CET} + {922582800 7200 1 CEST} + {941331600 3600 0 CET} + {954032400 7200 1 CEST} + {972781200 3600 0 CET} + {985482000 7200 1 CEST} + {1004230800 3600 0 CET} + {1017536400 7200 1 CEST} + {1035680400 3600 0 CET} + {1048986000 7200 1 CEST} + {1067130000 3600 0 CET} + {1080435600 7200 1 CEST} + {1099184400 3600 0 CET} + {1111885200 7200 1 CEST} + {1130634000 3600 0 CET} + {1143334800 7200 1 CEST} + {1162083600 3600 0 CET} + {1174784400 7200 1 CEST} + {1193533200 3600 0 CET} + {1206838800 7200 1 CEST} + {1224982800 3600 0 CET} + {1238288400 7200 1 CEST} + {1256432400 3600 0 CET} + {1269738000 7200 1 CEST} + {1288486800 3600 0 CET} + {1301187600 7200 1 CEST} + {1319936400 3600 0 CET} + {1332637200 7200 1 CEST} + {1351386000 3600 0 CET} + {1364691600 7200 1 CEST} + {1382835600 3600 0 CET} + {1396141200 7200 1 CEST} + {1414285200 3600 0 CET} + {1427590800 7200 1 CEST} + {1445734800 3600 0 CET} + {1459040400 7200 1 CEST} + {1477789200 3600 0 CET} + {1490490000 7200 1 CEST} + {1509238800 3600 0 CET} + {1521939600 7200 1 CEST} + {1540688400 3600 0 CET} + {1553994000 7200 1 CEST} + {1572138000 3600 0 CET} + {1585443600 7200 1 CEST} + {1603587600 3600 0 CET} + {1616893200 7200 1 CEST} + {1635642000 3600 0 CET} + {1648342800 7200 1 CEST} + {1667091600 3600 0 CET} + {1679792400 7200 1 CEST} + {1698541200 3600 0 CET} + {1711846800 7200 1 CEST} + {1729990800 3600 0 CET} + {1743296400 7200 1 CEST} + {1761440400 3600 0 CET} + {1774746000 7200 1 CEST} + {1792890000 3600 0 CET} + {1806195600 7200 1 CEST} + {1824944400 3600 0 CET} + {1837645200 7200 1 CEST} + {1856394000 3600 0 CET} + {1869094800 7200 1 CEST} + {1887843600 3600 0 CET} + {1901149200 7200 1 CEST} + {1919293200 3600 0 CET} + {1932598800 7200 1 CEST} + {1950742800 3600 0 CET} + {1964048400 7200 1 CEST} + {1982797200 3600 0 CET} + {1995498000 7200 1 CEST} + {2014246800 3600 0 CET} + {2026947600 7200 1 CEST} + {2045696400 3600 0 CET} + {2058397200 7200 1 CEST} + {2077146000 3600 0 CET} + {2090451600 7200 1 CEST} + {2108595600 3600 0 CET} + {2121901200 7200 1 CEST} + {2140045200 3600 0 CET} + {2153350800 7200 1 CEST} + {2172099600 3600 0 CET} + {2184800400 7200 1 CEST} + {2203549200 3600 0 CET} + {2216250000 7200 1 CEST} + {2234998800 3600 0 CET} + {2248304400 7200 1 CEST} + {2266448400 3600 0 CET} + {2279754000 7200 1 CEST} + {2297898000 3600 0 CET} + {2311203600 7200 1 CEST} + {2329347600 3600 0 CET} + {2342653200 7200 1 CEST} + {2361402000 3600 0 CET} + {2374102800 7200 1 CEST} + {2392851600 3600 0 CET} + {2405552400 7200 1 CEST} + {2424301200 3600 0 CET} + {2437606800 7200 1 CEST} + {2455750800 3600 0 CET} + {2469056400 7200 1 CEST} + {2487200400 3600 0 CET} + {2500506000 7200 1 CEST} + {2519254800 3600 0 CET} + {2531955600 7200 1 CEST} + {2550704400 3600 0 CET} + {2563405200 7200 1 CEST} + {2582154000 3600 0 CET} + {2595459600 7200 1 CEST} + {2613603600 3600 0 CET} + {2626909200 7200 1 CEST} + {2645053200 3600 0 CET} + {2658358800 7200 1 CEST} + {2676502800 3600 0 CET} + {2689808400 7200 1 CEST} + {2708557200 3600 0 CET} + {2721258000 7200 1 CEST} + {2740006800 3600 0 CET} + {2752707600 7200 1 CEST} + {2771456400 3600 0 CET} + {2784762000 7200 1 CEST} + {2802906000 3600 0 CET} + {2816211600 7200 1 CEST} + {2834355600 3600 0 CET} + {2847661200 7200 1 CEST} + {2866410000 3600 0 CET} + {2879110800 7200 1 CEST} + {2897859600 3600 0 CET} + {2910560400 7200 1 CEST} + {2929309200 3600 0 CET} + {2942010000 7200 1 CEST} + {2960758800 3600 0 CET} + {2974064400 7200 1 CEST} + {2992208400 3600 0 CET} + {3005514000 7200 1 CEST} + {3023658000 3600 0 CET} + {3036963600 7200 1 CEST} + {3055712400 3600 0 CET} + {3068413200 7200 1 CEST} + {3087162000 3600 0 CET} + {3099862800 7200 1 CEST} + {3118611600 3600 0 CET} + {3131917200 7200 1 CEST} + {3150061200 3600 0 CET} + {3163366800 7200 1 CEST} + {3181510800 3600 0 CET} + {3194816400 7200 1 CEST} + {3212960400 3600 0 CET} + {3226266000 7200 1 CEST} + {3245014800 3600 0 CET} + {3257715600 7200 1 CEST} + {3276464400 3600 0 CET} + {3289165200 7200 1 CEST} + {3307914000 3600 0 CET} + {3321219600 7200 1 CEST} + {3339363600 3600 0 CET} + {3352669200 7200 1 CEST} + {3370813200 3600 0 CET} + {3384118800 7200 1 CEST} + {3402867600 3600 0 CET} + {3415568400 7200 1 CEST} + {3434317200 3600 0 CET} + {3447018000 7200 1 CEST} + {3465766800 3600 0 CET} + {3479072400 7200 1 CEST} + {3497216400 3600 0 CET} + {3510522000 7200 1 CEST} + {3528666000 3600 0 CET} + {3541971600 7200 1 CEST} + {3560115600 3600 0 CET} + {3573421200 7200 1 CEST} + {3592170000 3600 0 CET} + {3604870800 7200 1 CEST} + {3623619600 3600 0 CET} + {3636320400 7200 1 CEST} + {3655069200 3600 0 CET} + {3668374800 7200 1 CEST} + {3686518800 3600 0 CET} + {3699824400 7200 1 CEST} + {3717968400 3600 0 CET} + {3731274000 7200 1 CEST} + {3750022800 3600 0 CET} + {3762723600 7200 1 CEST} + {3781472400 3600 0 CET} + {3794173200 7200 1 CEST} + {3812922000 3600 0 CET} + {3825622800 7200 1 CEST} + {3844371600 3600 0 CET} + {3857677200 7200 1 CEST} + {3875821200 3600 0 CET} + {3889126800 7200 1 CEST} + {3907270800 3600 0 CET} + {3920576400 7200 1 CEST} + {3939325200 3600 0 CET} + {3952026000 7200 1 CEST} + {3970774800 3600 0 CET} + {3983475600 7200 1 CEST} + {4002224400 3600 0 CET} + {4015530000 7200 1 CEST} + {4033674000 3600 0 CET} + {4046979600 7200 1 CEST} + {4065123600 3600 0 CET} + {4078429200 7200 1 CEST} + {4096573200 3600 0 CET} +} diff --git a/env/tcl/tcl8.6/tzdata/Europe/Bratislava b/env/tcl/tcl8.6/tzdata/Europe/Bratislava new file mode 100644 index 0000000..d65ea5a --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Europe/Bratislava @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(Europe/Prague)]} { + LoadTimeZoneFile Europe/Prague +} +set TZData(:Europe/Bratislava) $TZData(:Europe/Prague) diff --git a/env/tcl/tcl8.6/tzdata/Europe/Brussels b/env/tcl/tcl8.6/tzdata/Europe/Brussels new file mode 100644 index 0000000..3cb9b14 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Europe/Brussels @@ -0,0 +1,316 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Europe/Brussels) { + {-9223372036854775808 1050 0 LMT} + {-2840141850 1050 0 BMT} + {-2450953050 0 0 WET} + {-1740355200 3600 0 CET} + {-1693702800 7200 0 CEST} + {-1680483600 3600 0 CET} + {-1663455600 7200 1 CEST} + {-1650150000 3600 0 CET} + {-1632006000 7200 1 CEST} + {-1618700400 3600 0 CET} + {-1613826000 0 0 WET} + {-1604278800 3600 1 WEST} + {-1585530000 0 0 WET} + {-1574038800 3600 1 WEST} + {-1552266000 0 0 WET} + {-1539997200 3600 1 WEST} + {-1520557200 0 0 WET} + {-1507510800 3600 1 WEST} + {-1490576400 0 0 WET} + {-1473642000 3600 1 WEST} + {-1459126800 0 0 WET} + {-1444006800 3600 1 WEST} + {-1427677200 0 0 WET} + {-1411952400 3600 1 WEST} + {-1396227600 0 0 WET} + {-1379293200 3600 1 WEST} + {-1364778000 0 0 WET} + {-1348448400 3600 1 WEST} + {-1333328400 0 0 WET} + {-1316394000 3600 1 WEST} + {-1301263200 0 0 WET} + {-1284328800 3600 1 WEST} + {-1269813600 0 0 WET} + {-1253484000 3600 1 WEST} + {-1238364000 0 0 WET} + {-1221429600 3600 1 WEST} + {-1206914400 0 0 WET} + {-1191189600 3600 1 WEST} + {-1175464800 0 0 WET} + {-1160344800 3600 1 WEST} + {-1143410400 0 0 WET} + {-1127685600 3600 1 WEST} + {-1111960800 0 0 WET} + {-1096840800 3600 1 WEST} + {-1080511200 0 0 WET} + {-1063576800 3600 1 WEST} + {-1049061600 0 0 WET} + {-1033336800 3600 1 WEST} + {-1017612000 0 0 WET} + {-1002492000 3600 1 WEST} + {-986162400 0 0 WET} + {-969228000 3600 1 WEST} + {-950479200 0 0 WET} + {-942012000 3600 1 WEST} + {-934668000 7200 0 CEST} + {-857257200 3600 0 CET} + {-844556400 7200 1 CEST} + {-828226800 3600 0 CET} + {-812502000 7200 1 CEST} + {-799290000 3600 0 CET} + {-798073200 3600 0 CET} + {-781052400 7200 1 CEST} + {-766623600 3600 0 CET} + {-745455600 7200 1 CEST} + {-733273200 3600 0 CET} + {220921200 3600 0 CET} + {228877200 7200 1 CEST} + {243997200 3600 0 CET} + {260326800 7200 1 CEST} + {276051600 3600 0 CET} + {291776400 7200 1 CEST} + {307501200 3600 0 CET} + {323830800 7200 1 CEST} + {338950800 3600 0 CET} + {354675600 7200 1 CEST} + {370400400 3600 0 CET} + {386125200 7200 1 CEST} + {401850000 3600 0 CET} + {417574800 7200 1 CEST} + {433299600 3600 0 CET} + {449024400 7200 1 CEST} + {465354000 3600 0 CET} + {481078800 7200 1 CEST} + {496803600 3600 0 CET} + {512528400 7200 1 CEST} + {528253200 3600 0 CET} + {543978000 7200 1 CEST} + {559702800 3600 0 CET} + {575427600 7200 1 CEST} + {591152400 3600 0 CET} + {606877200 7200 1 CEST} + {622602000 3600 0 CET} + {638326800 7200 1 CEST} + {654656400 3600 0 CET} + {670381200 7200 1 CEST} + {686106000 3600 0 CET} + {701830800 7200 1 CEST} + {717555600 3600 0 CET} + {733280400 7200 1 CEST} + {749005200 3600 0 CET} + {764730000 7200 1 CEST} + {780454800 3600 0 CET} + {796179600 7200 1 CEST} + {811904400 3600 0 CET} + {828234000 7200 1 CEST} + {846378000 3600 0 CET} + {859683600 7200 1 CEST} + {877827600 3600 0 CET} + {891133200 7200 1 CEST} + {909277200 3600 0 CET} + {922582800 7200 1 CEST} + {941331600 3600 0 CET} + {954032400 7200 1 CEST} + {972781200 3600 0 CET} + {985482000 7200 1 CEST} + {1004230800 3600 0 CET} + {1017536400 7200 1 CEST} + {1035680400 3600 0 CET} + {1048986000 7200 1 CEST} + {1067130000 3600 0 CET} + {1080435600 7200 1 CEST} + {1099184400 3600 0 CET} + {1111885200 7200 1 CEST} + {1130634000 3600 0 CET} + {1143334800 7200 1 CEST} + {1162083600 3600 0 CET} + {1174784400 7200 1 CEST} + {1193533200 3600 0 CET} + {1206838800 7200 1 CEST} + {1224982800 3600 0 CET} + {1238288400 7200 1 CEST} + {1256432400 3600 0 CET} + {1269738000 7200 1 CEST} + {1288486800 3600 0 CET} + {1301187600 7200 1 CEST} + {1319936400 3600 0 CET} + {1332637200 7200 1 CEST} + {1351386000 3600 0 CET} + {1364691600 7200 1 CEST} + {1382835600 3600 0 CET} + {1396141200 7200 1 CEST} + {1414285200 3600 0 CET} + {1427590800 7200 1 CEST} + {1445734800 3600 0 CET} + {1459040400 7200 1 CEST} + {1477789200 3600 0 CET} + {1490490000 7200 1 CEST} + {1509238800 3600 0 CET} + {1521939600 7200 1 CEST} + {1540688400 3600 0 CET} + {1553994000 7200 1 CEST} + {1572138000 3600 0 CET} + {1585443600 7200 1 CEST} + {1603587600 3600 0 CET} + {1616893200 7200 1 CEST} + {1635642000 3600 0 CET} + {1648342800 7200 1 CEST} + {1667091600 3600 0 CET} + {1679792400 7200 1 CEST} + {1698541200 3600 0 CET} + {1711846800 7200 1 CEST} + {1729990800 3600 0 CET} + {1743296400 7200 1 CEST} + {1761440400 3600 0 CET} + {1774746000 7200 1 CEST} + {1792890000 3600 0 CET} + {1806195600 7200 1 CEST} + {1824944400 3600 0 CET} + {1837645200 7200 1 CEST} + {1856394000 3600 0 CET} + {1869094800 7200 1 CEST} + {1887843600 3600 0 CET} + {1901149200 7200 1 CEST} + {1919293200 3600 0 CET} + {1932598800 7200 1 CEST} + {1950742800 3600 0 CET} + {1964048400 7200 1 CEST} + {1982797200 3600 0 CET} + {1995498000 7200 1 CEST} + {2014246800 3600 0 CET} + {2026947600 7200 1 CEST} + {2045696400 3600 0 CET} + {2058397200 7200 1 CEST} + {2077146000 3600 0 CET} + {2090451600 7200 1 CEST} + {2108595600 3600 0 CET} + {2121901200 7200 1 CEST} + {2140045200 3600 0 CET} + {2153350800 7200 1 CEST} + {2172099600 3600 0 CET} + {2184800400 7200 1 CEST} + {2203549200 3600 0 CET} + {2216250000 7200 1 CEST} + {2234998800 3600 0 CET} + {2248304400 7200 1 CEST} + {2266448400 3600 0 CET} + {2279754000 7200 1 CEST} + {2297898000 3600 0 CET} + {2311203600 7200 1 CEST} + {2329347600 3600 0 CET} + {2342653200 7200 1 CEST} + {2361402000 3600 0 CET} + {2374102800 7200 1 CEST} + {2392851600 3600 0 CET} + {2405552400 7200 1 CEST} + {2424301200 3600 0 CET} + {2437606800 7200 1 CEST} + {2455750800 3600 0 CET} + {2469056400 7200 1 CEST} + {2487200400 3600 0 CET} + {2500506000 7200 1 CEST} + {2519254800 3600 0 CET} + {2531955600 7200 1 CEST} + {2550704400 3600 0 CET} + {2563405200 7200 1 CEST} + {2582154000 3600 0 CET} + {2595459600 7200 1 CEST} + {2613603600 3600 0 CET} + {2626909200 7200 1 CEST} + {2645053200 3600 0 CET} + {2658358800 7200 1 CEST} + {2676502800 3600 0 CET} + {2689808400 7200 1 CEST} + {2708557200 3600 0 CET} + {2721258000 7200 1 CEST} + {2740006800 3600 0 CET} + {2752707600 7200 1 CEST} + {2771456400 3600 0 CET} + {2784762000 7200 1 CEST} + {2802906000 3600 0 CET} + {2816211600 7200 1 CEST} + {2834355600 3600 0 CET} + {2847661200 7200 1 CEST} + {2866410000 3600 0 CET} + {2879110800 7200 1 CEST} + {2897859600 3600 0 CET} + {2910560400 7200 1 CEST} + {2929309200 3600 0 CET} + {2942010000 7200 1 CEST} + {2960758800 3600 0 CET} + {2974064400 7200 1 CEST} + {2992208400 3600 0 CET} + {3005514000 7200 1 CEST} + {3023658000 3600 0 CET} + {3036963600 7200 1 CEST} + {3055712400 3600 0 CET} + {3068413200 7200 1 CEST} + {3087162000 3600 0 CET} + {3099862800 7200 1 CEST} + {3118611600 3600 0 CET} + {3131917200 7200 1 CEST} + {3150061200 3600 0 CET} + {3163366800 7200 1 CEST} + {3181510800 3600 0 CET} + {3194816400 7200 1 CEST} + {3212960400 3600 0 CET} + {3226266000 7200 1 CEST} + {3245014800 3600 0 CET} + {3257715600 7200 1 CEST} + {3276464400 3600 0 CET} + {3289165200 7200 1 CEST} + {3307914000 3600 0 CET} + {3321219600 7200 1 CEST} + {3339363600 3600 0 CET} + {3352669200 7200 1 CEST} + {3370813200 3600 0 CET} + {3384118800 7200 1 CEST} + {3402867600 3600 0 CET} + {3415568400 7200 1 CEST} + {3434317200 3600 0 CET} + {3447018000 7200 1 CEST} + {3465766800 3600 0 CET} + {3479072400 7200 1 CEST} + {3497216400 3600 0 CET} + {3510522000 7200 1 CEST} + {3528666000 3600 0 CET} + {3541971600 7200 1 CEST} + {3560115600 3600 0 CET} + {3573421200 7200 1 CEST} + {3592170000 3600 0 CET} + {3604870800 7200 1 CEST} + {3623619600 3600 0 CET} + {3636320400 7200 1 CEST} + {3655069200 3600 0 CET} + {3668374800 7200 1 CEST} + {3686518800 3600 0 CET} + {3699824400 7200 1 CEST} + {3717968400 3600 0 CET} + {3731274000 7200 1 CEST} + {3750022800 3600 0 CET} + {3762723600 7200 1 CEST} + {3781472400 3600 0 CET} + {3794173200 7200 1 CEST} + {3812922000 3600 0 CET} + {3825622800 7200 1 CEST} + {3844371600 3600 0 CET} + {3857677200 7200 1 CEST} + {3875821200 3600 0 CET} + {3889126800 7200 1 CEST} + {3907270800 3600 0 CET} + {3920576400 7200 1 CEST} + {3939325200 3600 0 CET} + {3952026000 7200 1 CEST} + {3970774800 3600 0 CET} + {3983475600 7200 1 CEST} + {4002224400 3600 0 CET} + {4015530000 7200 1 CEST} + {4033674000 3600 0 CET} + {4046979600 7200 1 CEST} + {4065123600 3600 0 CET} + {4078429200 7200 1 CEST} + {4096573200 3600 0 CET} +} diff --git a/env/tcl/tcl8.6/tzdata/Europe/Bucharest b/env/tcl/tcl8.6/tzdata/Europe/Bucharest new file mode 100644 index 0000000..7b3bed4 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Europe/Bucharest @@ -0,0 +1,268 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Europe/Bucharest) { + {-9223372036854775808 6264 0 LMT} + {-2469404664 6264 0 BMT} + {-1213148664 7200 0 EET} + {-1187056800 10800 1 EEST} + {-1175479200 7200 0 EET} + {-1159754400 10800 1 EEST} + {-1144029600 7200 0 EET} + {-1127700000 10800 1 EEST} + {-1111975200 7200 0 EET} + {-1096250400 10800 1 EEST} + {-1080525600 7200 0 EET} + {-1064800800 10800 1 EEST} + {-1049076000 7200 0 EET} + {-1033351200 10800 1 EEST} + {-1017626400 7200 0 EET} + {-1001901600 10800 1 EEST} + {-986176800 7200 0 EET} + {-970452000 10800 1 EEST} + {-954727200 7200 0 EET} + {296604000 10800 1 EEST} + {307486800 7200 0 EET} + {323816400 10800 1 EEST} + {338940000 7200 0 EET} + {354672000 10800 0 EEST} + {370396800 7200 0 EET} + {386121600 10800 1 EEST} + {401846400 7200 0 EET} + {417571200 10800 1 EEST} + {433296000 7200 0 EET} + {449020800 10800 1 EEST} + {465350400 7200 0 EET} + {481075200 10800 1 EEST} + {496800000 7200 0 EET} + {512524800 10800 1 EEST} + {528249600 7200 0 EET} + {543974400 10800 1 EEST} + {559699200 7200 0 EET} + {575424000 10800 1 EEST} + {591148800 7200 0 EET} + {606873600 10800 1 EEST} + {622598400 7200 0 EET} + {638323200 10800 1 EEST} + {654652800 7200 0 EET} + {662680800 7200 0 EET} + {670370400 10800 1 EEST} + {686095200 7200 0 EET} + {701820000 10800 1 EEST} + {717544800 7200 0 EET} + {733269600 10800 1 EEST} + {748994400 7200 0 EET} + {757375200 7200 0 EET} + {764719200 10800 1 EEST} + {780440400 7200 0 EET} + {796168800 10800 1 EEST} + {811890000 7200 0 EET} + {828223200 10800 1 EEST} + {846363600 7200 0 EET} + {852069600 7200 0 EET} + {859683600 10800 1 EEST} + {877827600 7200 0 EET} + {891133200 10800 1 EEST} + {909277200 7200 0 EET} + {922582800 10800 1 EEST} + {941331600 7200 0 EET} + {954032400 10800 1 EEST} + {972781200 7200 0 EET} + {985482000 10800 1 EEST} + {1004230800 7200 0 EET} + {1017536400 10800 1 EEST} + {1035680400 7200 0 EET} + {1048986000 10800 1 EEST} + {1067130000 7200 0 EET} + {1080435600 10800 1 EEST} + {1099184400 7200 0 EET} + {1111885200 10800 1 EEST} + {1130634000 7200 0 EET} + {1143334800 10800 1 EEST} + {1162083600 7200 0 EET} + {1174784400 10800 1 EEST} + {1193533200 7200 0 EET} + {1206838800 10800 1 EEST} + {1224982800 7200 0 EET} + {1238288400 10800 1 EEST} + {1256432400 7200 0 EET} + {1269738000 10800 1 EEST} + {1288486800 7200 0 EET} + {1301187600 10800 1 EEST} + {1319936400 7200 0 EET} + {1332637200 10800 1 EEST} + {1351386000 7200 0 EET} + {1364691600 10800 1 EEST} + {1382835600 7200 0 EET} + {1396141200 10800 1 EEST} + {1414285200 7200 0 EET} + {1427590800 10800 1 EEST} + {1445734800 7200 0 EET} + {1459040400 10800 1 EEST} + {1477789200 7200 0 EET} + {1490490000 10800 1 EEST} + {1509238800 7200 0 EET} + {1521939600 10800 1 EEST} + {1540688400 7200 0 EET} + {1553994000 10800 1 EEST} + {1572138000 7200 0 EET} + {1585443600 10800 1 EEST} + {1603587600 7200 0 EET} + {1616893200 10800 1 EEST} + {1635642000 7200 0 EET} + {1648342800 10800 1 EEST} + {1667091600 7200 0 EET} + {1679792400 10800 1 EEST} + {1698541200 7200 0 EET} + {1711846800 10800 1 EEST} + {1729990800 7200 0 EET} + {1743296400 10800 1 EEST} + {1761440400 7200 0 EET} + {1774746000 10800 1 EEST} + {1792890000 7200 0 EET} + {1806195600 10800 1 EEST} + {1824944400 7200 0 EET} + {1837645200 10800 1 EEST} + {1856394000 7200 0 EET} + {1869094800 10800 1 EEST} + {1887843600 7200 0 EET} + {1901149200 10800 1 EEST} + {1919293200 7200 0 EET} + {1932598800 10800 1 EEST} + {1950742800 7200 0 EET} + {1964048400 10800 1 EEST} + {1982797200 7200 0 EET} + {1995498000 10800 1 EEST} + {2014246800 7200 0 EET} + {2026947600 10800 1 EEST} + {2045696400 7200 0 EET} + {2058397200 10800 1 EEST} + {2077146000 7200 0 EET} + {2090451600 10800 1 EEST} + {2108595600 7200 0 EET} + {2121901200 10800 1 EEST} + {2140045200 7200 0 EET} + {2153350800 10800 1 EEST} + {2172099600 7200 0 EET} + {2184800400 10800 1 EEST} + {2203549200 7200 0 EET} + {2216250000 10800 1 EEST} + {2234998800 7200 0 EET} + {2248304400 10800 1 EEST} + {2266448400 7200 0 EET} + {2279754000 10800 1 EEST} + {2297898000 7200 0 EET} + {2311203600 10800 1 EEST} + {2329347600 7200 0 EET} + {2342653200 10800 1 EEST} + {2361402000 7200 0 EET} + {2374102800 10800 1 EEST} + {2392851600 7200 0 EET} + {2405552400 10800 1 EEST} + {2424301200 7200 0 EET} + {2437606800 10800 1 EEST} + {2455750800 7200 0 EET} + {2469056400 10800 1 EEST} + {2487200400 7200 0 EET} + {2500506000 10800 1 EEST} + {2519254800 7200 0 EET} + {2531955600 10800 1 EEST} + {2550704400 7200 0 EET} + {2563405200 10800 1 EEST} + {2582154000 7200 0 EET} + {2595459600 10800 1 EEST} + {2613603600 7200 0 EET} + {2626909200 10800 1 EEST} + {2645053200 7200 0 EET} + {2658358800 10800 1 EEST} + {2676502800 7200 0 EET} + {2689808400 10800 1 EEST} + {2708557200 7200 0 EET} + {2721258000 10800 1 EEST} + {2740006800 7200 0 EET} + {2752707600 10800 1 EEST} + {2771456400 7200 0 EET} + {2784762000 10800 1 EEST} + {2802906000 7200 0 EET} + {2816211600 10800 1 EEST} + {2834355600 7200 0 EET} + {2847661200 10800 1 EEST} + {2866410000 7200 0 EET} + {2879110800 10800 1 EEST} + {2897859600 7200 0 EET} + {2910560400 10800 1 EEST} + {2929309200 7200 0 EET} + {2942010000 10800 1 EEST} + {2960758800 7200 0 EET} + {2974064400 10800 1 EEST} + {2992208400 7200 0 EET} + {3005514000 10800 1 EEST} + {3023658000 7200 0 EET} + {3036963600 10800 1 EEST} + {3055712400 7200 0 EET} + {3068413200 10800 1 EEST} + {3087162000 7200 0 EET} + {3099862800 10800 1 EEST} + {3118611600 7200 0 EET} + {3131917200 10800 1 EEST} + {3150061200 7200 0 EET} + {3163366800 10800 1 EEST} + {3181510800 7200 0 EET} + {3194816400 10800 1 EEST} + {3212960400 7200 0 EET} + {3226266000 10800 1 EEST} + {3245014800 7200 0 EET} + {3257715600 10800 1 EEST} + {3276464400 7200 0 EET} + {3289165200 10800 1 EEST} + {3307914000 7200 0 EET} + {3321219600 10800 1 EEST} + {3339363600 7200 0 EET} + {3352669200 10800 1 EEST} + {3370813200 7200 0 EET} + {3384118800 10800 1 EEST} + {3402867600 7200 0 EET} + {3415568400 10800 1 EEST} + {3434317200 7200 0 EET} + {3447018000 10800 1 EEST} + {3465766800 7200 0 EET} + {3479072400 10800 1 EEST} + {3497216400 7200 0 EET} + {3510522000 10800 1 EEST} + {3528666000 7200 0 EET} + {3541971600 10800 1 EEST} + {3560115600 7200 0 EET} + {3573421200 10800 1 EEST} + {3592170000 7200 0 EET} + {3604870800 10800 1 EEST} + {3623619600 7200 0 EET} + {3636320400 10800 1 EEST} + {3655069200 7200 0 EET} + {3668374800 10800 1 EEST} + {3686518800 7200 0 EET} + {3699824400 10800 1 EEST} + {3717968400 7200 0 EET} + {3731274000 10800 1 EEST} + {3750022800 7200 0 EET} + {3762723600 10800 1 EEST} + {3781472400 7200 0 EET} + {3794173200 10800 1 EEST} + {3812922000 7200 0 EET} + {3825622800 10800 1 EEST} + {3844371600 7200 0 EET} + {3857677200 10800 1 EEST} + {3875821200 7200 0 EET} + {3889126800 10800 1 EEST} + {3907270800 7200 0 EET} + {3920576400 10800 1 EEST} + {3939325200 7200 0 EET} + {3952026000 10800 1 EEST} + {3970774800 7200 0 EET} + {3983475600 10800 1 EEST} + {4002224400 7200 0 EET} + {4015530000 10800 1 EEST} + {4033674000 7200 0 EET} + {4046979600 10800 1 EEST} + {4065123600 7200 0 EET} + {4078429200 10800 1 EEST} + {4096573200 7200 0 EET} +} diff --git a/env/tcl/tcl8.6/tzdata/Europe/Budapest b/env/tcl/tcl8.6/tzdata/Europe/Budapest new file mode 100644 index 0000000..e660ad1 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Europe/Budapest @@ -0,0 +1,282 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Europe/Budapest) { + {-9223372036854775808 4580 0 LMT} + {-2500938980 3600 0 CET} + {-1693706400 7200 1 CEST} + {-1680483600 3600 0 CET} + {-1663455600 7200 1 CEST} + {-1650150000 3600 0 CET} + {-1640998800 3600 0 CET} + {-1633212000 7200 1 CEST} + {-1618700400 3600 0 CET} + {-1600466400 7200 1 CEST} + {-1581202800 3600 0 CET} + {-906771600 3600 0 CET} + {-857257200 3600 0 CET} + {-844556400 7200 1 CEST} + {-828226800 3600 0 CET} + {-812502000 7200 1 CEST} + {-796777200 3600 0 CET} + {-788922000 3600 0 CET} + {-778471200 7200 1 CEST} + {-762660000 3600 0 CET} + {-749689200 7200 1 CEST} + {-733359600 3600 0 CET} + {-717634800 7200 1 CEST} + {-701910000 3600 0 CET} + {-686185200 7200 1 CEST} + {-670460400 3600 0 CET} + {-654130800 7200 1 CEST} + {-639010800 3600 0 CET} + {-621990000 7200 1 CEST} + {-605660400 3600 0 CET} + {-492656400 7200 1 CEST} + {-481168800 3600 0 CET} + {-461120400 7200 1 CEST} + {-449632800 3600 0 CET} + {-428547600 7200 1 CEST} + {-418269600 3600 0 CET} + {-397094400 7200 1 CEST} + {-386809200 3600 0 CET} + {323827200 7200 1 CEST} + {338950800 3600 0 CET} + {354675600 7200 1 CEST} + {370400400 3600 0 CET} + {386125200 7200 1 CEST} + {401850000 3600 0 CET} + {417574800 7200 1 CEST} + {433299600 3600 0 CET} + {449024400 7200 1 CEST} + {465354000 3600 0 CET} + {481078800 7200 1 CEST} + {496803600 3600 0 CET} + {512528400 7200 1 CEST} + {528253200 3600 0 CET} + {543978000 7200 1 CEST} + {559702800 3600 0 CET} + {575427600 7200 1 CEST} + {591152400 3600 0 CET} + {606877200 7200 1 CEST} + {622602000 3600 0 CET} + {638326800 7200 1 CEST} + {654656400 3600 0 CET} + {670381200 7200 1 CEST} + {686106000 3600 0 CET} + {701830800 7200 1 CEST} + {717555600 3600 0 CET} + {733280400 7200 1 CEST} + {749005200 3600 0 CET} + {764730000 7200 1 CEST} + {780454800 3600 0 CET} + {796179600 7200 1 CEST} + {811904400 3600 0 CET} + {828234000 7200 1 CEST} + {846378000 3600 0 CET} + {859683600 7200 1 CEST} + {877827600 3600 0 CET} + {891133200 7200 1 CEST} + {909277200 3600 0 CET} + {922582800 7200 1 CEST} + {941331600 3600 0 CET} + {954032400 7200 1 CEST} + {972781200 3600 0 CET} + {985482000 7200 1 CEST} + {1004230800 3600 0 CET} + {1017536400 7200 1 CEST} + {1035680400 3600 0 CET} + {1048986000 7200 1 CEST} + {1067130000 3600 0 CET} + {1080435600 7200 1 CEST} + {1099184400 3600 0 CET} + {1111885200 7200 1 CEST} + {1130634000 3600 0 CET} + {1143334800 7200 1 CEST} + {1162083600 3600 0 CET} + {1174784400 7200 1 CEST} + {1193533200 3600 0 CET} + {1206838800 7200 1 CEST} + {1224982800 3600 0 CET} + {1238288400 7200 1 CEST} + {1256432400 3600 0 CET} + {1269738000 7200 1 CEST} + {1288486800 3600 0 CET} + {1301187600 7200 1 CEST} + {1319936400 3600 0 CET} + {1332637200 7200 1 CEST} + {1351386000 3600 0 CET} + {1364691600 7200 1 CEST} + {1382835600 3600 0 CET} + {1396141200 7200 1 CEST} + {1414285200 3600 0 CET} + {1427590800 7200 1 CEST} + {1445734800 3600 0 CET} + {1459040400 7200 1 CEST} + {1477789200 3600 0 CET} + {1490490000 7200 1 CEST} + {1509238800 3600 0 CET} + {1521939600 7200 1 CEST} + {1540688400 3600 0 CET} + {1553994000 7200 1 CEST} + {1572138000 3600 0 CET} + {1585443600 7200 1 CEST} + {1603587600 3600 0 CET} + {1616893200 7200 1 CEST} + {1635642000 3600 0 CET} + {1648342800 7200 1 CEST} + {1667091600 3600 0 CET} + {1679792400 7200 1 CEST} + {1698541200 3600 0 CET} + {1711846800 7200 1 CEST} + {1729990800 3600 0 CET} + {1743296400 7200 1 CEST} + {1761440400 3600 0 CET} + {1774746000 7200 1 CEST} + {1792890000 3600 0 CET} + {1806195600 7200 1 CEST} + {1824944400 3600 0 CET} + {1837645200 7200 1 CEST} + {1856394000 3600 0 CET} + {1869094800 7200 1 CEST} + {1887843600 3600 0 CET} + {1901149200 7200 1 CEST} + {1919293200 3600 0 CET} + {1932598800 7200 1 CEST} + {1950742800 3600 0 CET} + {1964048400 7200 1 CEST} + {1982797200 3600 0 CET} + {1995498000 7200 1 CEST} + {2014246800 3600 0 CET} + {2026947600 7200 1 CEST} + {2045696400 3600 0 CET} + {2058397200 7200 1 CEST} + {2077146000 3600 0 CET} + {2090451600 7200 1 CEST} + {2108595600 3600 0 CET} + {2121901200 7200 1 CEST} + {2140045200 3600 0 CET} + {2153350800 7200 1 CEST} + {2172099600 3600 0 CET} + {2184800400 7200 1 CEST} + {2203549200 3600 0 CET} + {2216250000 7200 1 CEST} + {2234998800 3600 0 CET} + {2248304400 7200 1 CEST} + {2266448400 3600 0 CET} + {2279754000 7200 1 CEST} + {2297898000 3600 0 CET} + {2311203600 7200 1 CEST} + {2329347600 3600 0 CET} + {2342653200 7200 1 CEST} + {2361402000 3600 0 CET} + {2374102800 7200 1 CEST} + {2392851600 3600 0 CET} + {2405552400 7200 1 CEST} + {2424301200 3600 0 CET} + {2437606800 7200 1 CEST} + {2455750800 3600 0 CET} + {2469056400 7200 1 CEST} + {2487200400 3600 0 CET} + {2500506000 7200 1 CEST} + {2519254800 3600 0 CET} + {2531955600 7200 1 CEST} + {2550704400 3600 0 CET} + {2563405200 7200 1 CEST} + {2582154000 3600 0 CET} + {2595459600 7200 1 CEST} + {2613603600 3600 0 CET} + {2626909200 7200 1 CEST} + {2645053200 3600 0 CET} + {2658358800 7200 1 CEST} + {2676502800 3600 0 CET} + {2689808400 7200 1 CEST} + {2708557200 3600 0 CET} + {2721258000 7200 1 CEST} + {2740006800 3600 0 CET} + {2752707600 7200 1 CEST} + {2771456400 3600 0 CET} + {2784762000 7200 1 CEST} + {2802906000 3600 0 CET} + {2816211600 7200 1 CEST} + {2834355600 3600 0 CET} + {2847661200 7200 1 CEST} + {2866410000 3600 0 CET} + {2879110800 7200 1 CEST} + {2897859600 3600 0 CET} + {2910560400 7200 1 CEST} + {2929309200 3600 0 CET} + {2942010000 7200 1 CEST} + {2960758800 3600 0 CET} + {2974064400 7200 1 CEST} + {2992208400 3600 0 CET} + {3005514000 7200 1 CEST} + {3023658000 3600 0 CET} + {3036963600 7200 1 CEST} + {3055712400 3600 0 CET} + {3068413200 7200 1 CEST} + {3087162000 3600 0 CET} + {3099862800 7200 1 CEST} + {3118611600 3600 0 CET} + {3131917200 7200 1 CEST} + {3150061200 3600 0 CET} + {3163366800 7200 1 CEST} + {3181510800 3600 0 CET} + {3194816400 7200 1 CEST} + {3212960400 3600 0 CET} + {3226266000 7200 1 CEST} + {3245014800 3600 0 CET} + {3257715600 7200 1 CEST} + {3276464400 3600 0 CET} + {3289165200 7200 1 CEST} + {3307914000 3600 0 CET} + {3321219600 7200 1 CEST} + {3339363600 3600 0 CET} + {3352669200 7200 1 CEST} + {3370813200 3600 0 CET} + {3384118800 7200 1 CEST} + {3402867600 3600 0 CET} + {3415568400 7200 1 CEST} + {3434317200 3600 0 CET} + {3447018000 7200 1 CEST} + {3465766800 3600 0 CET} + {3479072400 7200 1 CEST} + {3497216400 3600 0 CET} + {3510522000 7200 1 CEST} + {3528666000 3600 0 CET} + {3541971600 7200 1 CEST} + {3560115600 3600 0 CET} + {3573421200 7200 1 CEST} + {3592170000 3600 0 CET} + {3604870800 7200 1 CEST} + {3623619600 3600 0 CET} + {3636320400 7200 1 CEST} + {3655069200 3600 0 CET} + {3668374800 7200 1 CEST} + {3686518800 3600 0 CET} + {3699824400 7200 1 CEST} + {3717968400 3600 0 CET} + {3731274000 7200 1 CEST} + {3750022800 3600 0 CET} + {3762723600 7200 1 CEST} + {3781472400 3600 0 CET} + {3794173200 7200 1 CEST} + {3812922000 3600 0 CET} + {3825622800 7200 1 CEST} + {3844371600 3600 0 CET} + {3857677200 7200 1 CEST} + {3875821200 3600 0 CET} + {3889126800 7200 1 CEST} + {3907270800 3600 0 CET} + {3920576400 7200 1 CEST} + {3939325200 3600 0 CET} + {3952026000 7200 1 CEST} + {3970774800 3600 0 CET} + {3983475600 7200 1 CEST} + {4002224400 3600 0 CET} + {4015530000 7200 1 CEST} + {4033674000 3600 0 CET} + {4046979600 7200 1 CEST} + {4065123600 3600 0 CET} + {4078429200 7200 1 CEST} + {4096573200 3600 0 CET} +} diff --git a/env/tcl/tcl8.6/tzdata/Europe/Busingen b/env/tcl/tcl8.6/tzdata/Europe/Busingen new file mode 100644 index 0000000..62abc29 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Europe/Busingen @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(Europe/Zurich)]} { + LoadTimeZoneFile Europe/Zurich +} +set TZData(:Europe/Busingen) $TZData(:Europe/Zurich) diff --git a/env/tcl/tcl8.6/tzdata/Europe/Chisinau b/env/tcl/tcl8.6/tzdata/Europe/Chisinau new file mode 100644 index 0000000..db4c6db --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Europe/Chisinau @@ -0,0 +1,272 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Europe/Chisinau) { + {-9223372036854775808 6920 0 LMT} + {-2840147720 6900 0 CMT} + {-1637114100 6264 0 BMT} + {-1213148664 7200 0 EET} + {-1187056800 10800 1 EEST} + {-1175479200 7200 0 EET} + {-1159754400 10800 1 EEST} + {-1144029600 7200 0 EET} + {-1127700000 10800 1 EEST} + {-1111975200 7200 0 EET} + {-1096250400 10800 1 EEST} + {-1080525600 7200 0 EET} + {-1064800800 10800 1 EEST} + {-1049076000 7200 0 EET} + {-1033351200 10800 1 EEST} + {-1017626400 7200 0 EET} + {-1001901600 10800 1 EEST} + {-986176800 7200 0 EET} + {-970452000 10800 1 EEST} + {-954727200 7200 0 EET} + {-927165600 10800 1 EEST} + {-898138800 7200 0 CET} + {-857257200 3600 0 CET} + {-844556400 7200 1 CEST} + {-828226800 3600 0 CET} + {-812502000 7200 1 CEST} + {-800154000 10800 0 MSD} + {354920400 14400 1 MSD} + {370728000 10800 0 MSK} + {386456400 14400 1 MSD} + {402264000 10800 0 MSK} + {417992400 14400 1 MSD} + {433800000 10800 0 MSK} + {449614800 14400 1 MSD} + {465346800 10800 0 MSK} + {481071600 14400 1 MSD} + {496796400 10800 0 MSK} + {512521200 14400 1 MSD} + {528246000 10800 0 MSK} + {543970800 14400 1 MSD} + {559695600 10800 0 MSK} + {575420400 14400 1 MSD} + {591145200 10800 0 MSK} + {606870000 14400 1 MSD} + {622594800 10800 0 MSK} + {638319600 14400 1 MSD} + {641948400 10800 0 EEST} + {654652800 7200 0 EET} + {670377600 10800 1 EEST} + {686102400 7200 0 EET} + {694216800 7200 0 EET} + {701820000 10800 1 EEST} + {717541200 7200 0 EET} + {733269600 10800 1 EEST} + {748990800 7200 0 EET} + {764719200 10800 1 EEST} + {780440400 7200 0 EET} + {796168800 10800 1 EEST} + {811890000 7200 0 EET} + {828223200 10800 1 EEST} + {846363600 7200 0 EET} + {852069600 7200 0 EET} + {859680000 10800 1 EEST} + {877824000 7200 0 EET} + {891129600 10800 1 EEST} + {909273600 7200 0 EET} + {922579200 10800 1 EEST} + {941328000 7200 0 EET} + {954028800 10800 1 EEST} + {972777600 7200 0 EET} + {985478400 10800 1 EEST} + {1004227200 7200 0 EET} + {1017532800 10800 1 EEST} + {1035676800 7200 0 EET} + {1048982400 10800 1 EEST} + {1067126400 7200 0 EET} + {1080432000 10800 1 EEST} + {1099180800 7200 0 EET} + {1111881600 10800 1 EEST} + {1130630400 7200 0 EET} + {1143331200 10800 1 EEST} + {1162080000 7200 0 EET} + {1174780800 10800 1 EEST} + {1193529600 7200 0 EET} + {1206835200 10800 1 EEST} + {1224979200 7200 0 EET} + {1238284800 10800 1 EEST} + {1256428800 7200 0 EET} + {1269734400 10800 1 EEST} + {1288483200 7200 0 EET} + {1301184000 10800 1 EEST} + {1319932800 7200 0 EET} + {1332633600 10800 1 EEST} + {1351382400 7200 0 EET} + {1364688000 10800 1 EEST} + {1382832000 7200 0 EET} + {1396137600 10800 1 EEST} + {1414281600 7200 0 EET} + {1427587200 10800 1 EEST} + {1445731200 7200 0 EET} + {1459036800 10800 1 EEST} + {1477785600 7200 0 EET} + {1490486400 10800 1 EEST} + {1509235200 7200 0 EET} + {1521936000 10800 1 EEST} + {1540684800 7200 0 EET} + {1553990400 10800 1 EEST} + {1572134400 7200 0 EET} + {1585440000 10800 1 EEST} + {1603584000 7200 0 EET} + {1616889600 10800 1 EEST} + {1635638400 7200 0 EET} + {1648339200 10800 1 EEST} + {1667088000 7200 0 EET} + {1679788800 10800 1 EEST} + {1698537600 7200 0 EET} + {1711843200 10800 1 EEST} + {1729987200 7200 0 EET} + {1743292800 10800 1 EEST} + {1761436800 7200 0 EET} + {1774742400 10800 1 EEST} + {1792886400 7200 0 EET} + {1806192000 10800 1 EEST} + {1824940800 7200 0 EET} + {1837641600 10800 1 EEST} + {1856390400 7200 0 EET} + {1869091200 10800 1 EEST} + {1887840000 7200 0 EET} + {1901145600 10800 1 EEST} + {1919289600 7200 0 EET} + {1932595200 10800 1 EEST} + {1950739200 7200 0 EET} + {1964044800 10800 1 EEST} + {1982793600 7200 0 EET} + {1995494400 10800 1 EEST} + {2014243200 7200 0 EET} + {2026944000 10800 1 EEST} + {2045692800 7200 0 EET} + {2058393600 10800 1 EEST} + {2077142400 7200 0 EET} + {2090448000 10800 1 EEST} + {2108592000 7200 0 EET} + {2121897600 10800 1 EEST} + {2140041600 7200 0 EET} + {2153347200 10800 1 EEST} + {2172096000 7200 0 EET} + {2184796800 10800 1 EEST} + {2203545600 7200 0 EET} + {2216246400 10800 1 EEST} + {2234995200 7200 0 EET} + {2248300800 10800 1 EEST} + {2266444800 7200 0 EET} + {2279750400 10800 1 EEST} + {2297894400 7200 0 EET} + {2311200000 10800 1 EEST} + {2329344000 7200 0 EET} + {2342649600 10800 1 EEST} + {2361398400 7200 0 EET} + {2374099200 10800 1 EEST} + {2392848000 7200 0 EET} + {2405548800 10800 1 EEST} + {2424297600 7200 0 EET} + {2437603200 10800 1 EEST} + {2455747200 7200 0 EET} + {2469052800 10800 1 EEST} + {2487196800 7200 0 EET} + {2500502400 10800 1 EEST} + {2519251200 7200 0 EET} + {2531952000 10800 1 EEST} + {2550700800 7200 0 EET} + {2563401600 10800 1 EEST} + {2582150400 7200 0 EET} + {2595456000 10800 1 EEST} + {2613600000 7200 0 EET} + {2626905600 10800 1 EEST} + {2645049600 7200 0 EET} + {2658355200 10800 1 EEST} + {2676499200 7200 0 EET} + {2689804800 10800 1 EEST} + {2708553600 7200 0 EET} + {2721254400 10800 1 EEST} + {2740003200 7200 0 EET} + {2752704000 10800 1 EEST} + {2771452800 7200 0 EET} + {2784758400 10800 1 EEST} + {2802902400 7200 0 EET} + {2816208000 10800 1 EEST} + {2834352000 7200 0 EET} + {2847657600 10800 1 EEST} + {2866406400 7200 0 EET} + {2879107200 10800 1 EEST} + {2897856000 7200 0 EET} + {2910556800 10800 1 EEST} + {2929305600 7200 0 EET} + {2942006400 10800 1 EEST} + {2960755200 7200 0 EET} + {2974060800 10800 1 EEST} + {2992204800 7200 0 EET} + {3005510400 10800 1 EEST} + {3023654400 7200 0 EET} + {3036960000 10800 1 EEST} + {3055708800 7200 0 EET} + {3068409600 10800 1 EEST} + {3087158400 7200 0 EET} + {3099859200 10800 1 EEST} + {3118608000 7200 0 EET} + {3131913600 10800 1 EEST} + {3150057600 7200 0 EET} + {3163363200 10800 1 EEST} + {3181507200 7200 0 EET} + {3194812800 10800 1 EEST} + {3212956800 7200 0 EET} + {3226262400 10800 1 EEST} + {3245011200 7200 0 EET} + {3257712000 10800 1 EEST} + {3276460800 7200 0 EET} + {3289161600 10800 1 EEST} + {3307910400 7200 0 EET} + {3321216000 10800 1 EEST} + {3339360000 7200 0 EET} + {3352665600 10800 1 EEST} + {3370809600 7200 0 EET} + {3384115200 10800 1 EEST} + {3402864000 7200 0 EET} + {3415564800 10800 1 EEST} + {3434313600 7200 0 EET} + {3447014400 10800 1 EEST} + {3465763200 7200 0 EET} + {3479068800 10800 1 EEST} + {3497212800 7200 0 EET} + {3510518400 10800 1 EEST} + {3528662400 7200 0 EET} + {3541968000 10800 1 EEST} + {3560112000 7200 0 EET} + {3573417600 10800 1 EEST} + {3592166400 7200 0 EET} + {3604867200 10800 1 EEST} + {3623616000 7200 0 EET} + {3636316800 10800 1 EEST} + {3655065600 7200 0 EET} + {3668371200 10800 1 EEST} + {3686515200 7200 0 EET} + {3699820800 10800 1 EEST} + {3717964800 7200 0 EET} + {3731270400 10800 1 EEST} + {3750019200 7200 0 EET} + {3762720000 10800 1 EEST} + {3781468800 7200 0 EET} + {3794169600 10800 1 EEST} + {3812918400 7200 0 EET} + {3825619200 10800 1 EEST} + {3844368000 7200 0 EET} + {3857673600 10800 1 EEST} + {3875817600 7200 0 EET} + {3889123200 10800 1 EEST} + {3907267200 7200 0 EET} + {3920572800 10800 1 EEST} + {3939321600 7200 0 EET} + {3952022400 10800 1 EEST} + {3970771200 7200 0 EET} + {3983472000 10800 1 EEST} + {4002220800 7200 0 EET} + {4015526400 10800 1 EEST} + {4033670400 7200 0 EET} + {4046976000 10800 1 EEST} + {4065120000 7200 0 EET} + {4078425600 10800 1 EEST} + {4096569600 7200 0 EET} +} diff --git a/env/tcl/tcl8.6/tzdata/Europe/Copenhagen b/env/tcl/tcl8.6/tzdata/Europe/Copenhagen new file mode 100644 index 0000000..c747e58 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Europe/Copenhagen @@ -0,0 +1,264 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Europe/Copenhagen) { + {-9223372036854775808 3020 0 LMT} + {-2524524620 3020 0 CMT} + {-2398294220 3600 0 CET} + {-1692496800 7200 1 CEST} + {-1680490800 3600 0 CET} + {-935110800 7200 1 CEST} + {-857257200 3600 0 CET} + {-844556400 7200 1 CEST} + {-828226800 3600 0 CET} + {-812502000 7200 1 CEST} + {-796777200 3600 0 CET} + {-781052400 7200 0 CEST} + {-769388400 3600 0 CET} + {-747010800 7200 1 CEST} + {-736383600 3600 0 CET} + {-715215600 7200 1 CEST} + {-706748400 3600 0 CET} + {-683161200 7200 1 CEST} + {-675298800 3600 0 CET} + {315529200 3600 0 CET} + {323830800 7200 1 CEST} + {338950800 3600 0 CET} + {354675600 7200 1 CEST} + {370400400 3600 0 CET} + {386125200 7200 1 CEST} + {401850000 3600 0 CET} + {417574800 7200 1 CEST} + {433299600 3600 0 CET} + {449024400 7200 1 CEST} + {465354000 3600 0 CET} + {481078800 7200 1 CEST} + {496803600 3600 0 CET} + {512528400 7200 1 CEST} + {528253200 3600 0 CET} + {543978000 7200 1 CEST} + {559702800 3600 0 CET} + {575427600 7200 1 CEST} + {591152400 3600 0 CET} + {606877200 7200 1 CEST} + {622602000 3600 0 CET} + {638326800 7200 1 CEST} + {654656400 3600 0 CET} + {670381200 7200 1 CEST} + {686106000 3600 0 CET} + {701830800 7200 1 CEST} + {717555600 3600 0 CET} + {733280400 7200 1 CEST} + {749005200 3600 0 CET} + {764730000 7200 1 CEST} + {780454800 3600 0 CET} + {796179600 7200 1 CEST} + {811904400 3600 0 CET} + {828234000 7200 1 CEST} + {846378000 3600 0 CET} + {859683600 7200 1 CEST} + {877827600 3600 0 CET} + {891133200 7200 1 CEST} + {909277200 3600 0 CET} + {922582800 7200 1 CEST} + {941331600 3600 0 CET} + {954032400 7200 1 CEST} + {972781200 3600 0 CET} + {985482000 7200 1 CEST} + {1004230800 3600 0 CET} + {1017536400 7200 1 CEST} + {1035680400 3600 0 CET} + {1048986000 7200 1 CEST} + {1067130000 3600 0 CET} + {1080435600 7200 1 CEST} + {1099184400 3600 0 CET} + {1111885200 7200 1 CEST} + {1130634000 3600 0 CET} + {1143334800 7200 1 CEST} + {1162083600 3600 0 CET} + {1174784400 7200 1 CEST} + {1193533200 3600 0 CET} + {1206838800 7200 1 CEST} + {1224982800 3600 0 CET} + {1238288400 7200 1 CEST} + {1256432400 3600 0 CET} + {1269738000 7200 1 CEST} + {1288486800 3600 0 CET} + {1301187600 7200 1 CEST} + {1319936400 3600 0 CET} + {1332637200 7200 1 CEST} + {1351386000 3600 0 CET} + {1364691600 7200 1 CEST} + {1382835600 3600 0 CET} + {1396141200 7200 1 CEST} + {1414285200 3600 0 CET} + {1427590800 7200 1 CEST} + {1445734800 3600 0 CET} + {1459040400 7200 1 CEST} + {1477789200 3600 0 CET} + {1490490000 7200 1 CEST} + {1509238800 3600 0 CET} + {1521939600 7200 1 CEST} + {1540688400 3600 0 CET} + {1553994000 7200 1 CEST} + {1572138000 3600 0 CET} + {1585443600 7200 1 CEST} + {1603587600 3600 0 CET} + {1616893200 7200 1 CEST} + {1635642000 3600 0 CET} + {1648342800 7200 1 CEST} + {1667091600 3600 0 CET} + {1679792400 7200 1 CEST} + {1698541200 3600 0 CET} + {1711846800 7200 1 CEST} + {1729990800 3600 0 CET} + {1743296400 7200 1 CEST} + {1761440400 3600 0 CET} + {1774746000 7200 1 CEST} + {1792890000 3600 0 CET} + {1806195600 7200 1 CEST} + {1824944400 3600 0 CET} + {1837645200 7200 1 CEST} + {1856394000 3600 0 CET} + {1869094800 7200 1 CEST} + {1887843600 3600 0 CET} + {1901149200 7200 1 CEST} + {1919293200 3600 0 CET} + {1932598800 7200 1 CEST} + {1950742800 3600 0 CET} + {1964048400 7200 1 CEST} + {1982797200 3600 0 CET} + {1995498000 7200 1 CEST} + {2014246800 3600 0 CET} + {2026947600 7200 1 CEST} + {2045696400 3600 0 CET} + {2058397200 7200 1 CEST} + {2077146000 3600 0 CET} + {2090451600 7200 1 CEST} + {2108595600 3600 0 CET} + {2121901200 7200 1 CEST} + {2140045200 3600 0 CET} + {2153350800 7200 1 CEST} + {2172099600 3600 0 CET} + {2184800400 7200 1 CEST} + {2203549200 3600 0 CET} + {2216250000 7200 1 CEST} + {2234998800 3600 0 CET} + {2248304400 7200 1 CEST} + {2266448400 3600 0 CET} + {2279754000 7200 1 CEST} + {2297898000 3600 0 CET} + {2311203600 7200 1 CEST} + {2329347600 3600 0 CET} + {2342653200 7200 1 CEST} + {2361402000 3600 0 CET} + {2374102800 7200 1 CEST} + {2392851600 3600 0 CET} + {2405552400 7200 1 CEST} + {2424301200 3600 0 CET} + {2437606800 7200 1 CEST} + {2455750800 3600 0 CET} + {2469056400 7200 1 CEST} + {2487200400 3600 0 CET} + {2500506000 7200 1 CEST} + {2519254800 3600 0 CET} + {2531955600 7200 1 CEST} + {2550704400 3600 0 CET} + {2563405200 7200 1 CEST} + {2582154000 3600 0 CET} + {2595459600 7200 1 CEST} + {2613603600 3600 0 CET} + {2626909200 7200 1 CEST} + {2645053200 3600 0 CET} + {2658358800 7200 1 CEST} + {2676502800 3600 0 CET} + {2689808400 7200 1 CEST} + {2708557200 3600 0 CET} + {2721258000 7200 1 CEST} + {2740006800 3600 0 CET} + {2752707600 7200 1 CEST} + {2771456400 3600 0 CET} + {2784762000 7200 1 CEST} + {2802906000 3600 0 CET} + {2816211600 7200 1 CEST} + {2834355600 3600 0 CET} + {2847661200 7200 1 CEST} + {2866410000 3600 0 CET} + {2879110800 7200 1 CEST} + {2897859600 3600 0 CET} + {2910560400 7200 1 CEST} + {2929309200 3600 0 CET} + {2942010000 7200 1 CEST} + {2960758800 3600 0 CET} + {2974064400 7200 1 CEST} + {2992208400 3600 0 CET} + {3005514000 7200 1 CEST} + {3023658000 3600 0 CET} + {3036963600 7200 1 CEST} + {3055712400 3600 0 CET} + {3068413200 7200 1 CEST} + {3087162000 3600 0 CET} + {3099862800 7200 1 CEST} + {3118611600 3600 0 CET} + {3131917200 7200 1 CEST} + {3150061200 3600 0 CET} + {3163366800 7200 1 CEST} + {3181510800 3600 0 CET} + {3194816400 7200 1 CEST} + {3212960400 3600 0 CET} + {3226266000 7200 1 CEST} + {3245014800 3600 0 CET} + {3257715600 7200 1 CEST} + {3276464400 3600 0 CET} + {3289165200 7200 1 CEST} + {3307914000 3600 0 CET} + {3321219600 7200 1 CEST} + {3339363600 3600 0 CET} + {3352669200 7200 1 CEST} + {3370813200 3600 0 CET} + {3384118800 7200 1 CEST} + {3402867600 3600 0 CET} + {3415568400 7200 1 CEST} + {3434317200 3600 0 CET} + {3447018000 7200 1 CEST} + {3465766800 3600 0 CET} + {3479072400 7200 1 CEST} + {3497216400 3600 0 CET} + {3510522000 7200 1 CEST} + {3528666000 3600 0 CET} + {3541971600 7200 1 CEST} + {3560115600 3600 0 CET} + {3573421200 7200 1 CEST} + {3592170000 3600 0 CET} + {3604870800 7200 1 CEST} + {3623619600 3600 0 CET} + {3636320400 7200 1 CEST} + {3655069200 3600 0 CET} + {3668374800 7200 1 CEST} + {3686518800 3600 0 CET} + {3699824400 7200 1 CEST} + {3717968400 3600 0 CET} + {3731274000 7200 1 CEST} + {3750022800 3600 0 CET} + {3762723600 7200 1 CEST} + {3781472400 3600 0 CET} + {3794173200 7200 1 CEST} + {3812922000 3600 0 CET} + {3825622800 7200 1 CEST} + {3844371600 3600 0 CET} + {3857677200 7200 1 CEST} + {3875821200 3600 0 CET} + {3889126800 7200 1 CEST} + {3907270800 3600 0 CET} + {3920576400 7200 1 CEST} + {3939325200 3600 0 CET} + {3952026000 7200 1 CEST} + {3970774800 3600 0 CET} + {3983475600 7200 1 CEST} + {4002224400 3600 0 CET} + {4015530000 7200 1 CEST} + {4033674000 3600 0 CET} + {4046979600 7200 1 CEST} + {4065123600 3600 0 CET} + {4078429200 7200 1 CEST} + {4096573200 3600 0 CET} +} diff --git a/env/tcl/tcl8.6/tzdata/Europe/Dublin b/env/tcl/tcl8.6/tzdata/Europe/Dublin new file mode 100644 index 0000000..56afc93 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Europe/Dublin @@ -0,0 +1,358 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Europe/Dublin) { + {-9223372036854775808 -1500 0 LMT} + {-2821649700 -1521 0 DMT} + {-1691962479 2079 1 IST} + {-1680471279 0 0 GMT} + {-1664143200 3600 1 BST} + {-1650146400 0 0 GMT} + {-1633903200 3600 1 BST} + {-1617487200 0 0 GMT} + {-1601848800 3600 1 BST} + {-1586037600 0 0 GMT} + {-1570399200 3600 1 BST} + {-1552168800 0 0 GMT} + {-1538344800 3600 1 BST} + {-1522533600 0 0 GMT} + {-1517011200 0 0 IST} + {-1507500000 3600 1 IST} + {-1490565600 0 0 IST} + {-1473631200 3600 1 IST} + {-1460930400 0 0 IST} + {-1442786400 3600 1 IST} + {-1428876000 0 0 IST} + {-1410732000 3600 1 IST} + {-1396216800 0 0 IST} + {-1379282400 3600 1 IST} + {-1364767200 0 0 IST} + {-1348437600 3600 1 IST} + {-1333317600 0 0 IST} + {-1315778400 3600 1 IST} + {-1301263200 0 0 IST} + {-1284328800 3600 1 IST} + {-1269813600 0 0 IST} + {-1253484000 3600 1 IST} + {-1238364000 0 0 IST} + {-1221429600 3600 1 IST} + {-1206914400 0 0 IST} + {-1189980000 3600 1 IST} + {-1175464800 0 0 IST} + {-1159135200 3600 1 IST} + {-1143410400 0 0 IST} + {-1126476000 3600 1 IST} + {-1111960800 0 0 IST} + {-1095631200 3600 1 IST} + {-1080511200 0 0 IST} + {-1063576800 3600 1 IST} + {-1049061600 0 0 IST} + {-1032127200 3600 1 IST} + {-1017612000 0 0 IST} + {-1001282400 3600 1 IST} + {-986162400 0 0 IST} + {-969228000 3600 1 IST} + {-950479200 0 0 IST} + {-942012000 3600 1 IST} + {-733356000 0 0 GMT} + {-719445600 3600 1 IST} + {-699487200 0 0 GMT} + {-684972000 3600 0 IST} + {-668037600 0 0 IST} + {-654732000 3600 1 IST} + {-636588000 0 0 IST} + {-622072800 3600 1 IST} + {-605743200 0 0 IST} + {-590623200 3600 1 IST} + {-574293600 0 0 IST} + {-558568800 3600 1 IST} + {-542239200 0 0 IST} + {-527119200 3600 1 IST} + {-512604000 0 0 IST} + {-496274400 3600 1 IST} + {-481154400 0 0 IST} + {-464220000 3600 1 IST} + {-449704800 0 0 IST} + {-432165600 3600 1 IST} + {-417650400 0 0 IST} + {-401320800 3600 1 IST} + {-386200800 0 0 IST} + {-369266400 3600 1 IST} + {-354751200 0 0 IST} + {-337816800 3600 1 IST} + {-323301600 0 0 IST} + {-306972000 3600 1 IST} + {-291852000 0 0 IST} + {-276732000 3600 1 IST} + {-257983200 0 0 IST} + {-245282400 3600 1 IST} + {-226533600 0 0 IST} + {-213228000 3600 1 IST} + {-195084000 0 0 IST} + {-182383200 3600 1 IST} + {-163634400 0 0 IST} + {-150933600 3600 1 IST} + {-132184800 0 0 IST} + {-119484000 3600 1 IST} + {-100735200 0 0 IST} + {-88034400 3600 1 IST} + {-68680800 0 0 IST} + {-59004000 3600 1 IST} + {-37238400 3600 0 IST} + {57722400 0 1 IST} + {69818400 3600 0 IST} + {89172000 0 1 IST} + {101268000 3600 0 IST} + {120621600 0 1 IST} + {132717600 3600 0 IST} + {152071200 0 1 IST} + {164167200 3600 0 IST} + {183520800 0 1 IST} + {196221600 3600 0 IST} + {214970400 0 1 IST} + {227671200 3600 0 IST} + {246420000 0 1 IST} + {259120800 3600 0 IST} + {278474400 0 1 IST} + {290570400 3600 0 IST} + {309924000 0 1 IST} + {322020000 3600 0 IST} + {341373600 0 1 IST} + {354675600 3600 0 IST} + {372819600 0 1 IST} + {386125200 3600 0 IST} + {404269200 0 1 IST} + {417574800 3600 0 IST} + {435718800 0 1 IST} + {449024400 3600 0 IST} + {467773200 0 1 IST} + {481078800 3600 0 IST} + {499222800 0 1 IST} + {512528400 3600 0 IST} + {530672400 0 1 IST} + {543978000 3600 0 IST} + {562122000 0 1 IST} + {575427600 3600 0 IST} + {593571600 0 1 IST} + {606877200 3600 0 IST} + {625626000 0 1 IST} + {638326800 3600 0 IST} + {657075600 0 1 IST} + {670381200 3600 0 IST} + {688525200 0 1 IST} + {701830800 3600 0 IST} + {719974800 0 1 IST} + {733280400 3600 0 IST} + {751424400 0 1 IST} + {764730000 3600 0 IST} + {782874000 0 1 IST} + {796179600 3600 0 IST} + {814323600 0 1 IST} + {828234000 3600 0 IST} + {846378000 0 1 IST} + {859683600 3600 0 IST} + {877827600 0 1 IST} + {891133200 3600 0 IST} + {909277200 0 1 IST} + {922582800 3600 0 IST} + {941331600 0 1 IST} + {954032400 3600 0 IST} + {972781200 0 1 IST} + {985482000 3600 0 IST} + {1004230800 0 1 IST} + {1017536400 3600 0 IST} + {1035680400 0 1 IST} + {1048986000 3600 0 IST} + {1067130000 0 1 IST} + {1080435600 3600 0 IST} + {1099184400 0 1 IST} + {1111885200 3600 0 IST} + {1130634000 0 1 IST} + {1143334800 3600 0 IST} + {1162083600 0 1 IST} + {1174784400 3600 0 IST} + {1193533200 0 1 IST} + {1206838800 3600 0 IST} + {1224982800 0 1 IST} + {1238288400 3600 0 IST} + {1256432400 0 1 IST} + {1269738000 3600 0 IST} + {1288486800 0 1 IST} + {1301187600 3600 0 IST} + {1319936400 0 1 IST} + {1332637200 3600 0 IST} + {1351386000 0 1 IST} + {1364691600 3600 0 IST} + {1382835600 0 1 IST} + {1396141200 3600 0 IST} + {1414285200 0 1 IST} + {1427590800 3600 0 IST} + {1445734800 0 1 IST} + {1459040400 3600 0 IST} + {1477789200 0 1 IST} + {1490490000 3600 0 IST} + {1509238800 0 1 IST} + {1521939600 3600 0 IST} + {1540688400 0 1 IST} + {1553994000 3600 0 IST} + {1572138000 0 1 IST} + {1585443600 3600 0 IST} + {1603587600 0 1 IST} + {1616893200 3600 0 IST} + {1635642000 0 1 IST} + {1648342800 3600 0 IST} + {1667091600 0 1 IST} + {1679792400 3600 0 IST} + {1698541200 0 1 IST} + {1711846800 3600 0 IST} + {1729990800 0 1 IST} + {1743296400 3600 0 IST} + {1761440400 0 1 IST} + {1774746000 3600 0 IST} + {1792890000 0 1 IST} + {1806195600 3600 0 IST} + {1824944400 0 1 IST} + {1837645200 3600 0 IST} + {1856394000 0 1 IST} + {1869094800 3600 0 IST} + {1887843600 0 1 IST} + {1901149200 3600 0 IST} + {1919293200 0 1 IST} + {1932598800 3600 0 IST} + {1950742800 0 1 IST} + {1964048400 3600 0 IST} + {1982797200 0 1 IST} + {1995498000 3600 0 IST} + {2014246800 0 1 IST} + {2026947600 3600 0 IST} + {2045696400 0 1 IST} + {2058397200 3600 0 IST} + {2077146000 0 1 IST} + {2090451600 3600 0 IST} + {2108595600 0 1 IST} + {2121901200 3600 0 IST} + {2140045200 0 1 IST} + {2153350800 3600 0 IST} + {2172099600 0 1 IST} + {2184800400 3600 0 IST} + {2203549200 0 1 IST} + {2216250000 3600 0 IST} + {2234998800 0 1 IST} + {2248304400 3600 0 IST} + {2266448400 0 1 IST} + {2279754000 3600 0 IST} + {2297898000 0 1 IST} + {2311203600 3600 0 IST} + {2329347600 0 1 IST} + {2342653200 3600 0 IST} + {2361402000 0 1 IST} + {2374102800 3600 0 IST} + {2392851600 0 1 IST} + {2405552400 3600 0 IST} + {2424301200 0 1 IST} + {2437606800 3600 0 IST} + {2455750800 0 1 IST} + {2469056400 3600 0 IST} + {2487200400 0 1 IST} + {2500506000 3600 0 IST} + {2519254800 0 1 IST} + {2531955600 3600 0 IST} + {2550704400 0 1 IST} + {2563405200 3600 0 IST} + {2582154000 0 1 IST} + {2595459600 3600 0 IST} + {2613603600 0 1 IST} + {2626909200 3600 0 IST} + {2645053200 0 1 IST} + {2658358800 3600 0 IST} + {2676502800 0 1 IST} + {2689808400 3600 0 IST} + {2708557200 0 1 IST} + {2721258000 3600 0 IST} + {2740006800 0 1 IST} + {2752707600 3600 0 IST} + {2771456400 0 1 IST} + {2784762000 3600 0 IST} + {2802906000 0 1 IST} + {2816211600 3600 0 IST} + {2834355600 0 1 IST} + {2847661200 3600 0 IST} + {2866410000 0 1 IST} + {2879110800 3600 0 IST} + {2897859600 0 1 IST} + {2910560400 3600 0 IST} + {2929309200 0 1 IST} + {2942010000 3600 0 IST} + {2960758800 0 1 IST} + {2974064400 3600 0 IST} + {2992208400 0 1 IST} + {3005514000 3600 0 IST} + {3023658000 0 1 IST} + {3036963600 3600 0 IST} + {3055712400 0 1 IST} + {3068413200 3600 0 IST} + {3087162000 0 1 IST} + {3099862800 3600 0 IST} + {3118611600 0 1 IST} + {3131917200 3600 0 IST} + {3150061200 0 1 IST} + {3163366800 3600 0 IST} + {3181510800 0 1 IST} + {3194816400 3600 0 IST} + {3212960400 0 1 IST} + {3226266000 3600 0 IST} + {3245014800 0 1 IST} + {3257715600 3600 0 IST} + {3276464400 0 1 IST} + {3289165200 3600 0 IST} + {3307914000 0 1 IST} + {3321219600 3600 0 IST} + {3339363600 0 1 IST} + {3352669200 3600 0 IST} + {3370813200 0 1 IST} + {3384118800 3600 0 IST} + {3402867600 0 1 IST} + {3415568400 3600 0 IST} + {3434317200 0 1 IST} + {3447018000 3600 0 IST} + {3465766800 0 1 IST} + {3479072400 3600 0 IST} + {3497216400 0 1 IST} + {3510522000 3600 0 IST} + {3528666000 0 1 IST} + {3541971600 3600 0 IST} + {3560115600 0 1 IST} + {3573421200 3600 0 IST} + {3592170000 0 1 IST} + {3604870800 3600 0 IST} + {3623619600 0 1 IST} + {3636320400 3600 0 IST} + {3655069200 0 1 IST} + {3668374800 3600 0 IST} + {3686518800 0 1 IST} + {3699824400 3600 0 IST} + {3717968400 0 1 IST} + {3731274000 3600 0 IST} + {3750022800 0 1 IST} + {3762723600 3600 0 IST} + {3781472400 0 1 IST} + {3794173200 3600 0 IST} + {3812922000 0 1 IST} + {3825622800 3600 0 IST} + {3844371600 0 1 IST} + {3857677200 3600 0 IST} + {3875821200 0 1 IST} + {3889126800 3600 0 IST} + {3907270800 0 1 IST} + {3920576400 3600 0 IST} + {3939325200 0 1 IST} + {3952026000 3600 0 IST} + {3970774800 0 1 IST} + {3983475600 3600 0 IST} + {4002224400 0 1 IST} + {4015530000 3600 0 IST} + {4033674000 0 1 IST} + {4046979600 3600 0 IST} + {4065123600 0 1 IST} + {4078429200 3600 0 IST} + {4096573200 0 1 IST} +} diff --git a/env/tcl/tcl8.6/tzdata/Europe/Gibraltar b/env/tcl/tcl8.6/tzdata/Europe/Gibraltar new file mode 100644 index 0000000..de29c03 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Europe/Gibraltar @@ -0,0 +1,328 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Europe/Gibraltar) { + {-9223372036854775808 -1284 0 LMT} + {-2821649916 0 0 GMT} + {-1691964000 3600 1 BST} + {-1680472800 0 0 GMT} + {-1664143200 3600 1 BST} + {-1650146400 0 0 GMT} + {-1633903200 3600 1 BST} + {-1617487200 0 0 GMT} + {-1601848800 3600 1 BST} + {-1586037600 0 0 GMT} + {-1570399200 3600 1 BST} + {-1552168800 0 0 GMT} + {-1538344800 3600 1 BST} + {-1522533600 0 0 GMT} + {-1507500000 3600 1 BST} + {-1490565600 0 0 GMT} + {-1473631200 3600 1 BST} + {-1460930400 0 0 GMT} + {-1442786400 3600 1 BST} + {-1428876000 0 0 GMT} + {-1410732000 3600 1 BST} + {-1396216800 0 0 GMT} + {-1379282400 3600 1 BST} + {-1364767200 0 0 GMT} + {-1348437600 3600 1 BST} + {-1333317600 0 0 GMT} + {-1315778400 3600 1 BST} + {-1301263200 0 0 GMT} + {-1284328800 3600 1 BST} + {-1269813600 0 0 GMT} + {-1253484000 3600 1 BST} + {-1238364000 0 0 GMT} + {-1221429600 3600 1 BST} + {-1206914400 0 0 GMT} + {-1189980000 3600 1 BST} + {-1175464800 0 0 GMT} + {-1159135200 3600 1 BST} + {-1143410400 0 0 GMT} + {-1126476000 3600 1 BST} + {-1111960800 0 0 GMT} + {-1095631200 3600 1 BST} + {-1080511200 0 0 GMT} + {-1063576800 3600 1 BST} + {-1049061600 0 0 GMT} + {-1032127200 3600 1 BST} + {-1017612000 0 0 GMT} + {-1001282400 3600 1 BST} + {-986162400 0 0 GMT} + {-969228000 3600 1 BST} + {-950479200 0 0 GMT} + {-942012000 3600 1 BST} + {-904518000 7200 1 BDST} + {-896050800 3600 1 BST} + {-875487600 7200 1 BDST} + {-864601200 3600 1 BST} + {-844038000 7200 1 BDST} + {-832546800 3600 1 BST} + {-812588400 7200 1 BDST} + {-798073200 3600 1 BST} + {-781052400 7200 1 BDST} + {-772066800 3600 1 BST} + {-764805600 0 0 GMT} + {-748476000 3600 1 BST} + {-733356000 0 0 GMT} + {-719445600 3600 1 BST} + {-717030000 7200 1 BDST} + {-706748400 3600 1 BST} + {-699487200 0 0 GMT} + {-687996000 3600 1 BST} + {-668037600 0 0 GMT} + {-654732000 3600 1 BST} + {-636588000 0 0 GMT} + {-622072800 3600 1 BST} + {-605743200 0 0 GMT} + {-590623200 3600 1 BST} + {-574293600 0 0 GMT} + {-558568800 3600 1 BST} + {-542239200 0 0 GMT} + {-527119200 3600 1 BST} + {-512604000 0 0 GMT} + {-496274400 3600 1 BST} + {-481154400 0 0 GMT} + {-464220000 3600 1 BST} + {-449704800 0 0 GMT} + {-432165600 3600 1 BST} + {-417650400 0 0 GMT} + {-401320800 3600 0 CET} + {378687600 3600 0 CET} + {386125200 7200 1 CEST} + {401850000 3600 0 CET} + {417574800 7200 1 CEST} + {433299600 3600 0 CET} + {449024400 7200 1 CEST} + {465354000 3600 0 CET} + {481078800 7200 1 CEST} + {496803600 3600 0 CET} + {512528400 7200 1 CEST} + {528253200 3600 0 CET} + {543978000 7200 1 CEST} + {559702800 3600 0 CET} + {575427600 7200 1 CEST} + {591152400 3600 0 CET} + {606877200 7200 1 CEST} + {622602000 3600 0 CET} + {638326800 7200 1 CEST} + {654656400 3600 0 CET} + {670381200 7200 1 CEST} + {686106000 3600 0 CET} + {701830800 7200 1 CEST} + {717555600 3600 0 CET} + {733280400 7200 1 CEST} + {749005200 3600 0 CET} + {764730000 7200 1 CEST} + {780454800 3600 0 CET} + {796179600 7200 1 CEST} + {811904400 3600 0 CET} + {828234000 7200 1 CEST} + {846378000 3600 0 CET} + {859683600 7200 1 CEST} + {877827600 3600 0 CET} + {891133200 7200 1 CEST} + {909277200 3600 0 CET} + {922582800 7200 1 CEST} + {941331600 3600 0 CET} + {954032400 7200 1 CEST} + {972781200 3600 0 CET} + {985482000 7200 1 CEST} + {1004230800 3600 0 CET} + {1017536400 7200 1 CEST} + {1035680400 3600 0 CET} + {1048986000 7200 1 CEST} + {1067130000 3600 0 CET} + {1080435600 7200 1 CEST} + {1099184400 3600 0 CET} + {1111885200 7200 1 CEST} + {1130634000 3600 0 CET} + {1143334800 7200 1 CEST} + {1162083600 3600 0 CET} + {1174784400 7200 1 CEST} + {1193533200 3600 0 CET} + {1206838800 7200 1 CEST} + {1224982800 3600 0 CET} + {1238288400 7200 1 CEST} + {1256432400 3600 0 CET} + {1269738000 7200 1 CEST} + {1288486800 3600 0 CET} + {1301187600 7200 1 CEST} + {1319936400 3600 0 CET} + {1332637200 7200 1 CEST} + {1351386000 3600 0 CET} + {1364691600 7200 1 CEST} + {1382835600 3600 0 CET} + {1396141200 7200 1 CEST} + {1414285200 3600 0 CET} + {1427590800 7200 1 CEST} + {1445734800 3600 0 CET} + {1459040400 7200 1 CEST} + {1477789200 3600 0 CET} + {1490490000 7200 1 CEST} + {1509238800 3600 0 CET} + {1521939600 7200 1 CEST} + {1540688400 3600 0 CET} + {1553994000 7200 1 CEST} + {1572138000 3600 0 CET} + {1585443600 7200 1 CEST} + {1603587600 3600 0 CET} + {1616893200 7200 1 CEST} + {1635642000 3600 0 CET} + {1648342800 7200 1 CEST} + {1667091600 3600 0 CET} + {1679792400 7200 1 CEST} + {1698541200 3600 0 CET} + {1711846800 7200 1 CEST} + {1729990800 3600 0 CET} + {1743296400 7200 1 CEST} + {1761440400 3600 0 CET} + {1774746000 7200 1 CEST} + {1792890000 3600 0 CET} + {1806195600 7200 1 CEST} + {1824944400 3600 0 CET} + {1837645200 7200 1 CEST} + {1856394000 3600 0 CET} + {1869094800 7200 1 CEST} + {1887843600 3600 0 CET} + {1901149200 7200 1 CEST} + {1919293200 3600 0 CET} + {1932598800 7200 1 CEST} + {1950742800 3600 0 CET} + {1964048400 7200 1 CEST} + {1982797200 3600 0 CET} + {1995498000 7200 1 CEST} + {2014246800 3600 0 CET} + {2026947600 7200 1 CEST} + {2045696400 3600 0 CET} + {2058397200 7200 1 CEST} + {2077146000 3600 0 CET} + {2090451600 7200 1 CEST} + {2108595600 3600 0 CET} + {2121901200 7200 1 CEST} + {2140045200 3600 0 CET} + {2153350800 7200 1 CEST} + {2172099600 3600 0 CET} + {2184800400 7200 1 CEST} + {2203549200 3600 0 CET} + {2216250000 7200 1 CEST} + {2234998800 3600 0 CET} + {2248304400 7200 1 CEST} + {2266448400 3600 0 CET} + {2279754000 7200 1 CEST} + {2297898000 3600 0 CET} + {2311203600 7200 1 CEST} + {2329347600 3600 0 CET} + {2342653200 7200 1 CEST} + {2361402000 3600 0 CET} + {2374102800 7200 1 CEST} + {2392851600 3600 0 CET} + {2405552400 7200 1 CEST} + {2424301200 3600 0 CET} + {2437606800 7200 1 CEST} + {2455750800 3600 0 CET} + {2469056400 7200 1 CEST} + {2487200400 3600 0 CET} + {2500506000 7200 1 CEST} + {2519254800 3600 0 CET} + {2531955600 7200 1 CEST} + {2550704400 3600 0 CET} + {2563405200 7200 1 CEST} + {2582154000 3600 0 CET} + {2595459600 7200 1 CEST} + {2613603600 3600 0 CET} + {2626909200 7200 1 CEST} + {2645053200 3600 0 CET} + {2658358800 7200 1 CEST} + {2676502800 3600 0 CET} + {2689808400 7200 1 CEST} + {2708557200 3600 0 CET} + {2721258000 7200 1 CEST} + {2740006800 3600 0 CET} + {2752707600 7200 1 CEST} + {2771456400 3600 0 CET} + {2784762000 7200 1 CEST} + {2802906000 3600 0 CET} + {2816211600 7200 1 CEST} + {2834355600 3600 0 CET} + {2847661200 7200 1 CEST} + {2866410000 3600 0 CET} + {2879110800 7200 1 CEST} + {2897859600 3600 0 CET} + {2910560400 7200 1 CEST} + {2929309200 3600 0 CET} + {2942010000 7200 1 CEST} + {2960758800 3600 0 CET} + {2974064400 7200 1 CEST} + {2992208400 3600 0 CET} + {3005514000 7200 1 CEST} + {3023658000 3600 0 CET} + {3036963600 7200 1 CEST} + {3055712400 3600 0 CET} + {3068413200 7200 1 CEST} + {3087162000 3600 0 CET} + {3099862800 7200 1 CEST} + {3118611600 3600 0 CET} + {3131917200 7200 1 CEST} + {3150061200 3600 0 CET} + {3163366800 7200 1 CEST} + {3181510800 3600 0 CET} + {3194816400 7200 1 CEST} + {3212960400 3600 0 CET} + {3226266000 7200 1 CEST} + {3245014800 3600 0 CET} + {3257715600 7200 1 CEST} + {3276464400 3600 0 CET} + {3289165200 7200 1 CEST} + {3307914000 3600 0 CET} + {3321219600 7200 1 CEST} + {3339363600 3600 0 CET} + {3352669200 7200 1 CEST} + {3370813200 3600 0 CET} + {3384118800 7200 1 CEST} + {3402867600 3600 0 CET} + {3415568400 7200 1 CEST} + {3434317200 3600 0 CET} + {3447018000 7200 1 CEST} + {3465766800 3600 0 CET} + {3479072400 7200 1 CEST} + {3497216400 3600 0 CET} + {3510522000 7200 1 CEST} + {3528666000 3600 0 CET} + {3541971600 7200 1 CEST} + {3560115600 3600 0 CET} + {3573421200 7200 1 CEST} + {3592170000 3600 0 CET} + {3604870800 7200 1 CEST} + {3623619600 3600 0 CET} + {3636320400 7200 1 CEST} + {3655069200 3600 0 CET} + {3668374800 7200 1 CEST} + {3686518800 3600 0 CET} + {3699824400 7200 1 CEST} + {3717968400 3600 0 CET} + {3731274000 7200 1 CEST} + {3750022800 3600 0 CET} + {3762723600 7200 1 CEST} + {3781472400 3600 0 CET} + {3794173200 7200 1 CEST} + {3812922000 3600 0 CET} + {3825622800 7200 1 CEST} + {3844371600 3600 0 CET} + {3857677200 7200 1 CEST} + {3875821200 3600 0 CET} + {3889126800 7200 1 CEST} + {3907270800 3600 0 CET} + {3920576400 7200 1 CEST} + {3939325200 3600 0 CET} + {3952026000 7200 1 CEST} + {3970774800 3600 0 CET} + {3983475600 7200 1 CEST} + {4002224400 3600 0 CET} + {4015530000 7200 1 CEST} + {4033674000 3600 0 CET} + {4046979600 7200 1 CEST} + {4065123600 3600 0 CET} + {4078429200 7200 1 CEST} + {4096573200 3600 0 CET} +} diff --git a/env/tcl/tcl8.6/tzdata/Europe/Guernsey b/env/tcl/tcl8.6/tzdata/Europe/Guernsey new file mode 100644 index 0000000..4372c64 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Europe/Guernsey @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(Europe/London)]} { + LoadTimeZoneFile Europe/London +} +set TZData(:Europe/Guernsey) $TZData(:Europe/London) diff --git a/env/tcl/tcl8.6/tzdata/Europe/Helsinki b/env/tcl/tcl8.6/tzdata/Europe/Helsinki new file mode 100644 index 0000000..39c5e78 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Europe/Helsinki @@ -0,0 +1,248 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Europe/Helsinki) { + {-9223372036854775808 5989 0 LMT} + {-2890258789 5989 0 HMT} + {-1535938789 7200 0 EET} + {-875671200 10800 1 EEST} + {-859773600 7200 0 EET} + {354672000 10800 1 EEST} + {370396800 7200 0 EET} + {386121600 10800 1 EEST} + {401846400 7200 0 EET} + {410220000 7200 0 EET} + {417574800 10800 1 EEST} + {433299600 7200 0 EET} + {449024400 10800 1 EEST} + {465354000 7200 0 EET} + {481078800 10800 1 EEST} + {496803600 7200 0 EET} + {512528400 10800 1 EEST} + {528253200 7200 0 EET} + {543978000 10800 1 EEST} + {559702800 7200 0 EET} + {575427600 10800 1 EEST} + {591152400 7200 0 EET} + {606877200 10800 1 EEST} + {622602000 7200 0 EET} + {638326800 10800 1 EEST} + {654656400 7200 0 EET} + {670381200 10800 1 EEST} + {686106000 7200 0 EET} + {701830800 10800 1 EEST} + {717555600 7200 0 EET} + {733280400 10800 1 EEST} + {749005200 7200 0 EET} + {764730000 10800 1 EEST} + {780454800 7200 0 EET} + {796179600 10800 1 EEST} + {811904400 7200 0 EET} + {828234000 10800 1 EEST} + {846378000 7200 0 EET} + {859683600 10800 1 EEST} + {877827600 7200 0 EET} + {891133200 10800 1 EEST} + {909277200 7200 0 EET} + {922582800 10800 1 EEST} + {941331600 7200 0 EET} + {954032400 10800 1 EEST} + {972781200 7200 0 EET} + {985482000 10800 1 EEST} + {1004230800 7200 0 EET} + {1017536400 10800 1 EEST} + {1035680400 7200 0 EET} + {1048986000 10800 1 EEST} + {1067130000 7200 0 EET} + {1080435600 10800 1 EEST} + {1099184400 7200 0 EET} + {1111885200 10800 1 EEST} + {1130634000 7200 0 EET} + {1143334800 10800 1 EEST} + {1162083600 7200 0 EET} + {1174784400 10800 1 EEST} + {1193533200 7200 0 EET} + {1206838800 10800 1 EEST} + {1224982800 7200 0 EET} + {1238288400 10800 1 EEST} + {1256432400 7200 0 EET} + {1269738000 10800 1 EEST} + {1288486800 7200 0 EET} + {1301187600 10800 1 EEST} + {1319936400 7200 0 EET} + {1332637200 10800 1 EEST} + {1351386000 7200 0 EET} + {1364691600 10800 1 EEST} + {1382835600 7200 0 EET} + {1396141200 10800 1 EEST} + {1414285200 7200 0 EET} + {1427590800 10800 1 EEST} + {1445734800 7200 0 EET} + {1459040400 10800 1 EEST} + {1477789200 7200 0 EET} + {1490490000 10800 1 EEST} + {1509238800 7200 0 EET} + {1521939600 10800 1 EEST} + {1540688400 7200 0 EET} + {1553994000 10800 1 EEST} + {1572138000 7200 0 EET} + {1585443600 10800 1 EEST} + {1603587600 7200 0 EET} + {1616893200 10800 1 EEST} + {1635642000 7200 0 EET} + {1648342800 10800 1 EEST} + {1667091600 7200 0 EET} + {1679792400 10800 1 EEST} + {1698541200 7200 0 EET} + {1711846800 10800 1 EEST} + {1729990800 7200 0 EET} + {1743296400 10800 1 EEST} + {1761440400 7200 0 EET} + {1774746000 10800 1 EEST} + {1792890000 7200 0 EET} + {1806195600 10800 1 EEST} + {1824944400 7200 0 EET} + {1837645200 10800 1 EEST} + {1856394000 7200 0 EET} + {1869094800 10800 1 EEST} + {1887843600 7200 0 EET} + {1901149200 10800 1 EEST} + {1919293200 7200 0 EET} + {1932598800 10800 1 EEST} + {1950742800 7200 0 EET} + {1964048400 10800 1 EEST} + {1982797200 7200 0 EET} + {1995498000 10800 1 EEST} + {2014246800 7200 0 EET} + {2026947600 10800 1 EEST} + {2045696400 7200 0 EET} + {2058397200 10800 1 EEST} + {2077146000 7200 0 EET} + {2090451600 10800 1 EEST} + {2108595600 7200 0 EET} + {2121901200 10800 1 EEST} + {2140045200 7200 0 EET} + {2153350800 10800 1 EEST} + {2172099600 7200 0 EET} + {2184800400 10800 1 EEST} + {2203549200 7200 0 EET} + {2216250000 10800 1 EEST} + {2234998800 7200 0 EET} + {2248304400 10800 1 EEST} + {2266448400 7200 0 EET} + {2279754000 10800 1 EEST} + {2297898000 7200 0 EET} + {2311203600 10800 1 EEST} + {2329347600 7200 0 EET} + {2342653200 10800 1 EEST} + {2361402000 7200 0 EET} + {2374102800 10800 1 EEST} + {2392851600 7200 0 EET} + {2405552400 10800 1 EEST} + {2424301200 7200 0 EET} + {2437606800 10800 1 EEST} + {2455750800 7200 0 EET} + {2469056400 10800 1 EEST} + {2487200400 7200 0 EET} + {2500506000 10800 1 EEST} + {2519254800 7200 0 EET} + {2531955600 10800 1 EEST} + {2550704400 7200 0 EET} + {2563405200 10800 1 EEST} + {2582154000 7200 0 EET} + {2595459600 10800 1 EEST} + {2613603600 7200 0 EET} + {2626909200 10800 1 EEST} + {2645053200 7200 0 EET} + {2658358800 10800 1 EEST} + {2676502800 7200 0 EET} + {2689808400 10800 1 EEST} + {2708557200 7200 0 EET} + {2721258000 10800 1 EEST} + {2740006800 7200 0 EET} + {2752707600 10800 1 EEST} + {2771456400 7200 0 EET} + {2784762000 10800 1 EEST} + {2802906000 7200 0 EET} + {2816211600 10800 1 EEST} + {2834355600 7200 0 EET} + {2847661200 10800 1 EEST} + {2866410000 7200 0 EET} + {2879110800 10800 1 EEST} + {2897859600 7200 0 EET} + {2910560400 10800 1 EEST} + {2929309200 7200 0 EET} + {2942010000 10800 1 EEST} + {2960758800 7200 0 EET} + {2974064400 10800 1 EEST} + {2992208400 7200 0 EET} + {3005514000 10800 1 EEST} + {3023658000 7200 0 EET} + {3036963600 10800 1 EEST} + {3055712400 7200 0 EET} + {3068413200 10800 1 EEST} + {3087162000 7200 0 EET} + {3099862800 10800 1 EEST} + {3118611600 7200 0 EET} + {3131917200 10800 1 EEST} + {3150061200 7200 0 EET} + {3163366800 10800 1 EEST} + {3181510800 7200 0 EET} + {3194816400 10800 1 EEST} + {3212960400 7200 0 EET} + {3226266000 10800 1 EEST} + {3245014800 7200 0 EET} + {3257715600 10800 1 EEST} + {3276464400 7200 0 EET} + {3289165200 10800 1 EEST} + {3307914000 7200 0 EET} + {3321219600 10800 1 EEST} + {3339363600 7200 0 EET} + {3352669200 10800 1 EEST} + {3370813200 7200 0 EET} + {3384118800 10800 1 EEST} + {3402867600 7200 0 EET} + {3415568400 10800 1 EEST} + {3434317200 7200 0 EET} + {3447018000 10800 1 EEST} + {3465766800 7200 0 EET} + {3479072400 10800 1 EEST} + {3497216400 7200 0 EET} + {3510522000 10800 1 EEST} + {3528666000 7200 0 EET} + {3541971600 10800 1 EEST} + {3560115600 7200 0 EET} + {3573421200 10800 1 EEST} + {3592170000 7200 0 EET} + {3604870800 10800 1 EEST} + {3623619600 7200 0 EET} + {3636320400 10800 1 EEST} + {3655069200 7200 0 EET} + {3668374800 10800 1 EEST} + {3686518800 7200 0 EET} + {3699824400 10800 1 EEST} + {3717968400 7200 0 EET} + {3731274000 10800 1 EEST} + {3750022800 7200 0 EET} + {3762723600 10800 1 EEST} + {3781472400 7200 0 EET} + {3794173200 10800 1 EEST} + {3812922000 7200 0 EET} + {3825622800 10800 1 EEST} + {3844371600 7200 0 EET} + {3857677200 10800 1 EEST} + {3875821200 7200 0 EET} + {3889126800 10800 1 EEST} + {3907270800 7200 0 EET} + {3920576400 10800 1 EEST} + {3939325200 7200 0 EET} + {3952026000 10800 1 EEST} + {3970774800 7200 0 EET} + {3983475600 10800 1 EEST} + {4002224400 7200 0 EET} + {4015530000 10800 1 EEST} + {4033674000 7200 0 EET} + {4046979600 10800 1 EEST} + {4065123600 7200 0 EET} + {4078429200 10800 1 EEST} + {4096573200 7200 0 EET} +} diff --git a/env/tcl/tcl8.6/tzdata/Europe/Isle_of_Man b/env/tcl/tcl8.6/tzdata/Europe/Isle_of_Man new file mode 100644 index 0000000..870ac45 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Europe/Isle_of_Man @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(Europe/London)]} { + LoadTimeZoneFile Europe/London +} +set TZData(:Europe/Isle_of_Man) $TZData(:Europe/London) diff --git a/env/tcl/tcl8.6/tzdata/Europe/Istanbul b/env/tcl/tcl8.6/tzdata/Europe/Istanbul new file mode 100644 index 0000000..d00533f --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Europe/Istanbul @@ -0,0 +1,140 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Europe/Istanbul) { + {-9223372036854775808 6952 0 LMT} + {-2840147752 7016 0 IMT} + {-1869875816 7200 0 EET} + {-1693706400 10800 1 EEST} + {-1680490800 7200 0 EET} + {-1570413600 10800 1 EEST} + {-1552186800 7200 0 EET} + {-1538359200 10800 1 EEST} + {-1522551600 7200 0 EET} + {-1507514400 10800 1 EEST} + {-1490583600 7200 0 EET} + {-1440208800 10800 1 EEST} + {-1428030000 7200 0 EET} + {-1409709600 10800 1 EEST} + {-1396494000 7200 0 EET} + {-931140000 10800 1 EEST} + {-922762800 7200 0 EET} + {-917834400 10800 1 EEST} + {-892436400 7200 0 EET} + {-875844000 10800 1 EEST} + {-857358000 7200 0 EET} + {-781063200 10800 1 EEST} + {-764737200 7200 0 EET} + {-744343200 10800 1 EEST} + {-733806000 7200 0 EET} + {-716436000 10800 1 EEST} + {-701924400 7200 0 EET} + {-684986400 10800 1 EEST} + {-670474800 7200 0 EET} + {-654141600 10800 1 EEST} + {-639025200 7200 0 EET} + {-621828000 10800 1 EEST} + {-606970800 7200 0 EET} + {-590032800 10800 1 EEST} + {-575434800 7200 0 EET} + {-235620000 10800 1 EEST} + {-228279600 7200 0 EET} + {-177732000 10800 1 EEST} + {-165726000 7200 0 EET} + {10533600 10800 1 EEST} + {23835600 7200 0 EET} + {41983200 10800 1 EEST} + {55285200 7200 0 EET} + {74037600 10800 1 EEST} + {87339600 7200 0 EET} + {107910000 10800 1 EEST} + {121219200 7200 0 EET} + {133920000 10800 1 EEST} + {152676000 7200 0 EET} + {165362400 10800 1 EEST} + {183502800 7200 0 EET} + {202428000 10800 1 EEST} + {215557200 7200 0 EET} + {228866400 10800 1 EEST} + {245797200 7200 0 EET} + {260316000 10800 1 EEST} + {277246800 14400 0 +04} + {291769200 14400 1 +04} + {308779200 10800 0 +03} + {323827200 14400 1 +04} + {340228800 10800 0 +03} + {354672000 14400 1 +04} + {371678400 10800 0 +03} + {386121600 14400 1 +04} + {403128000 10800 0 +03} + {428446800 14400 1 +04} + {433886400 10800 0 +03} + {482792400 7200 0 EET} + {482796000 10800 1 EEST} + {496702800 7200 0 EET} + {512521200 10800 1 EEST} + {528246000 7200 0 EET} + {543970800 10800 1 EEST} + {559695600 7200 0 EET} + {575420400 10800 1 EEST} + {591145200 7200 0 EET} + {606870000 10800 1 EEST} + {622594800 7200 0 EET} + {638319600 10800 1 EEST} + {654649200 7200 0 EET} + {670374000 10800 1 EEST} + {686098800 7200 0 EET} + {701823600 10800 1 EEST} + {717548400 7200 0 EET} + {733273200 10800 1 EEST} + {748998000 7200 0 EET} + {764118000 10800 1 EEST} + {780447600 7200 0 EET} + {796172400 10800 1 EEST} + {811897200 7200 0 EET} + {828226800 10800 1 EEST} + {846370800 7200 0 EET} + {859676400 10800 1 EEST} + {877820400 7200 0 EET} + {891126000 10800 1 EEST} + {909270000 7200 0 EET} + {922575600 10800 1 EEST} + {941324400 7200 0 EET} + {954025200 10800 1 EEST} + {972774000 7200 0 EET} + {985474800 10800 1 EEST} + {1004223600 7200 0 EET} + {1017529200 10800 1 EEST} + {1035673200 7200 0 EET} + {1048978800 10800 1 EEST} + {1067122800 7200 0 EET} + {1080428400 10800 1 EEST} + {1099177200 7200 0 EET} + {1111878000 10800 1 EEST} + {1130626800 7200 0 EET} + {1143327600 10800 1 EEST} + {1162076400 7200 0 EET} + {1167602400 7200 0 EET} + {1174784400 10800 1 EEST} + {1193533200 7200 0 EET} + {1206838800 10800 1 EEST} + {1224982800 7200 0 EET} + {1238288400 10800 1 EEST} + {1256432400 7200 0 EET} + {1269738000 10800 1 EEST} + {1288486800 7200 0 EET} + {1301187600 7200 0 EET} + {1301274000 10800 0 EEST} + {1319936400 7200 0 EET} + {1332637200 10800 1 EEST} + {1351386000 7200 0 EET} + {1364691600 10800 1 EEST} + {1382835600 7200 0 EET} + {1396141200 7200 0 EET} + {1396227600 10800 0 EEST} + {1414285200 7200 0 EET} + {1427590800 10800 1 EEST} + {1445734800 10800 1 EEST} + {1446944400 7200 0 EET} + {1459040400 10800 1 EEST} + {1473199200 10800 0 +03} +} diff --git a/env/tcl/tcl8.6/tzdata/Europe/Jersey b/env/tcl/tcl8.6/tzdata/Europe/Jersey new file mode 100644 index 0000000..e4da512 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Europe/Jersey @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(Europe/London)]} { + LoadTimeZoneFile Europe/London +} +set TZData(:Europe/Jersey) $TZData(:Europe/London) diff --git a/env/tcl/tcl8.6/tzdata/Europe/Kaliningrad b/env/tcl/tcl8.6/tzdata/Europe/Kaliningrad new file mode 100644 index 0000000..e1713ae --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Europe/Kaliningrad @@ -0,0 +1,85 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Europe/Kaliningrad) { + {-9223372036854775808 4920 0 LMT} + {-2422056120 3600 0 CET} + {-1693706400 7200 1 CEST} + {-1680483600 3600 0 CET} + {-1663455600 7200 1 CEST} + {-1650150000 3600 0 CET} + {-1632006000 7200 1 CEST} + {-1618700400 3600 0 CET} + {-938905200 7200 1 CEST} + {-857257200 3600 0 CET} + {-844556400 7200 1 CEST} + {-828226800 3600 0 CET} + {-812502000 7200 1 CEST} + {-796777200 3600 0 CET} + {-788922000 7200 0 CET} + {-778730400 10800 1 CEST} + {-762663600 7200 0 CET} + {-757389600 10800 0 MSD} + {354920400 14400 1 MSD} + {370728000 10800 0 MSK} + {386456400 14400 1 MSD} + {402264000 10800 0 MSK} + {417992400 14400 1 MSD} + {433800000 10800 0 MSK} + {449614800 14400 1 MSD} + {465346800 10800 0 MSK} + {481071600 14400 1 MSD} + {496796400 10800 0 MSK} + {512521200 14400 1 MSD} + {528246000 10800 0 MSK} + {543970800 14400 1 MSD} + {559695600 10800 0 MSK} + {575420400 14400 1 MSD} + {591145200 10800 0 MSK} + {606870000 7200 0 EEMMTT} + {606873600 10800 1 EEST} + {622598400 7200 0 EET} + {638323200 10800 1 EEST} + {654652800 7200 0 EET} + {670377600 10800 1 EEST} + {686102400 7200 0 EET} + {701827200 10800 1 EEST} + {717552000 7200 0 EET} + {733276800 10800 1 EEST} + {749001600 7200 0 EET} + {764726400 10800 1 EEST} + {780451200 7200 0 EET} + {796176000 10800 1 EEST} + {811900800 7200 0 EET} + {828230400 10800 1 EEST} + {846374400 7200 0 EET} + {859680000 10800 1 EEST} + {877824000 7200 0 EET} + {891129600 10800 1 EEST} + {909273600 7200 0 EET} + {922579200 10800 1 EEST} + {941328000 7200 0 EET} + {954028800 10800 1 EEST} + {972777600 7200 0 EET} + {985478400 10800 1 EEST} + {1004227200 7200 0 EET} + {1017532800 10800 1 EEST} + {1035676800 7200 0 EET} + {1048982400 10800 1 EEST} + {1067126400 7200 0 EET} + {1080432000 10800 1 EEST} + {1099180800 7200 0 EET} + {1111881600 10800 1 EEST} + {1130630400 7200 0 EET} + {1143331200 10800 1 EEST} + {1162080000 7200 0 EET} + {1174780800 10800 1 EEST} + {1193529600 7200 0 EET} + {1206835200 10800 1 EEST} + {1224979200 7200 0 EET} + {1238284800 10800 1 EEST} + {1256428800 7200 0 EET} + {1269734400 10800 1 EEST} + {1288483200 7200 0 EET} + {1301184000 10800 0 +03} + {1414278000 7200 0 EET} +} diff --git a/env/tcl/tcl8.6/tzdata/Europe/Kiev b/env/tcl/tcl8.6/tzdata/Europe/Kiev new file mode 100644 index 0000000..55015fa --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Europe/Kiev @@ -0,0 +1,251 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Europe/Kiev) { + {-9223372036854775808 7324 0 LMT} + {-2840148124 7324 0 KMT} + {-1441159324 7200 0 EET} + {-1247536800 10800 0 MSK} + {-892522800 3600 0 CET} + {-857257200 3600 0 CET} + {-844556400 7200 1 CEST} + {-828226800 3600 0 CET} + {-825382800 10800 0 MSD} + {354920400 14400 1 MSD} + {370728000 10800 0 MSK} + {386456400 14400 1 MSD} + {402264000 10800 0 MSK} + {417992400 14400 1 MSD} + {433800000 10800 0 MSK} + {449614800 14400 1 MSD} + {465346800 10800 0 MSK} + {481071600 14400 1 MSD} + {496796400 10800 0 MSK} + {512521200 14400 1 MSD} + {528246000 10800 0 MSK} + {543970800 14400 1 MSD} + {559695600 10800 0 MSK} + {575420400 14400 1 MSD} + {591145200 10800 0 MSK} + {606870000 14400 1 MSD} + {622594800 10800 0 MSK} + {638319600 14400 1 MSD} + {646786800 10800 1 EEST} + {686102400 7200 0 EET} + {701820000 10800 1 EEST} + {717541200 7200 0 EET} + {733269600 10800 1 EEST} + {748990800 7200 0 EET} + {764719200 10800 1 EEST} + {780440400 7200 0 EET} + {788911200 7200 0 EET} + {796179600 10800 1 EEST} + {811904400 7200 0 EET} + {828234000 10800 1 EEST} + {846378000 7200 0 EET} + {859683600 10800 1 EEST} + {877827600 7200 0 EET} + {891133200 10800 1 EEST} + {909277200 7200 0 EET} + {922582800 10800 1 EEST} + {941331600 7200 0 EET} + {954032400 10800 1 EEST} + {972781200 7200 0 EET} + {985482000 10800 1 EEST} + {1004230800 7200 0 EET} + {1017536400 10800 1 EEST} + {1035680400 7200 0 EET} + {1048986000 10800 1 EEST} + {1067130000 7200 0 EET} + {1080435600 10800 1 EEST} + {1099184400 7200 0 EET} + {1111885200 10800 1 EEST} + {1130634000 7200 0 EET} + {1143334800 10800 1 EEST} + {1162083600 7200 0 EET} + {1174784400 10800 1 EEST} + {1193533200 7200 0 EET} + {1206838800 10800 1 EEST} + {1224982800 7200 0 EET} + {1238288400 10800 1 EEST} + {1256432400 7200 0 EET} + {1269738000 10800 1 EEST} + {1288486800 7200 0 EET} + {1301187600 10800 1 EEST} + {1319936400 7200 0 EET} + {1332637200 10800 1 EEST} + {1351386000 7200 0 EET} + {1364691600 10800 1 EEST} + {1382835600 7200 0 EET} + {1396141200 10800 1 EEST} + {1414285200 7200 0 EET} + {1427590800 10800 1 EEST} + {1445734800 7200 0 EET} + {1459040400 10800 1 EEST} + {1477789200 7200 0 EET} + {1490490000 10800 1 EEST} + {1509238800 7200 0 EET} + {1521939600 10800 1 EEST} + {1540688400 7200 0 EET} + {1553994000 10800 1 EEST} + {1572138000 7200 0 EET} + {1585443600 10800 1 EEST} + {1603587600 7200 0 EET} + {1616893200 10800 1 EEST} + {1635642000 7200 0 EET} + {1648342800 10800 1 EEST} + {1667091600 7200 0 EET} + {1679792400 10800 1 EEST} + {1698541200 7200 0 EET} + {1711846800 10800 1 EEST} + {1729990800 7200 0 EET} + {1743296400 10800 1 EEST} + {1761440400 7200 0 EET} + {1774746000 10800 1 EEST} + {1792890000 7200 0 EET} + {1806195600 10800 1 EEST} + {1824944400 7200 0 EET} + {1837645200 10800 1 EEST} + {1856394000 7200 0 EET} + {1869094800 10800 1 EEST} + {1887843600 7200 0 EET} + {1901149200 10800 1 EEST} + {1919293200 7200 0 EET} + {1932598800 10800 1 EEST} + {1950742800 7200 0 EET} + {1964048400 10800 1 EEST} + {1982797200 7200 0 EET} + {1995498000 10800 1 EEST} + {2014246800 7200 0 EET} + {2026947600 10800 1 EEST} + {2045696400 7200 0 EET} + {2058397200 10800 1 EEST} + {2077146000 7200 0 EET} + {2090451600 10800 1 EEST} + {2108595600 7200 0 EET} + {2121901200 10800 1 EEST} + {2140045200 7200 0 EET} + {2153350800 10800 1 EEST} + {2172099600 7200 0 EET} + {2184800400 10800 1 EEST} + {2203549200 7200 0 EET} + {2216250000 10800 1 EEST} + {2234998800 7200 0 EET} + {2248304400 10800 1 EEST} + {2266448400 7200 0 EET} + {2279754000 10800 1 EEST} + {2297898000 7200 0 EET} + {2311203600 10800 1 EEST} + {2329347600 7200 0 EET} + {2342653200 10800 1 EEST} + {2361402000 7200 0 EET} + {2374102800 10800 1 EEST} + {2392851600 7200 0 EET} + {2405552400 10800 1 EEST} + {2424301200 7200 0 EET} + {2437606800 10800 1 EEST} + {2455750800 7200 0 EET} + {2469056400 10800 1 EEST} + {2487200400 7200 0 EET} + {2500506000 10800 1 EEST} + {2519254800 7200 0 EET} + {2531955600 10800 1 EEST} + {2550704400 7200 0 EET} + {2563405200 10800 1 EEST} + {2582154000 7200 0 EET} + {2595459600 10800 1 EEST} + {2613603600 7200 0 EET} + {2626909200 10800 1 EEST} + {2645053200 7200 0 EET} + {2658358800 10800 1 EEST} + {2676502800 7200 0 EET} + {2689808400 10800 1 EEST} + {2708557200 7200 0 EET} + {2721258000 10800 1 EEST} + {2740006800 7200 0 EET} + {2752707600 10800 1 EEST} + {2771456400 7200 0 EET} + {2784762000 10800 1 EEST} + {2802906000 7200 0 EET} + {2816211600 10800 1 EEST} + {2834355600 7200 0 EET} + {2847661200 10800 1 EEST} + {2866410000 7200 0 EET} + {2879110800 10800 1 EEST} + {2897859600 7200 0 EET} + {2910560400 10800 1 EEST} + {2929309200 7200 0 EET} + {2942010000 10800 1 EEST} + {2960758800 7200 0 EET} + {2974064400 10800 1 EEST} + {2992208400 7200 0 EET} + {3005514000 10800 1 EEST} + {3023658000 7200 0 EET} + {3036963600 10800 1 EEST} + {3055712400 7200 0 EET} + {3068413200 10800 1 EEST} + {3087162000 7200 0 EET} + {3099862800 10800 1 EEST} + {3118611600 7200 0 EET} + {3131917200 10800 1 EEST} + {3150061200 7200 0 EET} + {3163366800 10800 1 EEST} + {3181510800 7200 0 EET} + {3194816400 10800 1 EEST} + {3212960400 7200 0 EET} + {3226266000 10800 1 EEST} + {3245014800 7200 0 EET} + {3257715600 10800 1 EEST} + {3276464400 7200 0 EET} + {3289165200 10800 1 EEST} + {3307914000 7200 0 EET} + {3321219600 10800 1 EEST} + {3339363600 7200 0 EET} + {3352669200 10800 1 EEST} + {3370813200 7200 0 EET} + {3384118800 10800 1 EEST} + {3402867600 7200 0 EET} + {3415568400 10800 1 EEST} + {3434317200 7200 0 EET} + {3447018000 10800 1 EEST} + {3465766800 7200 0 EET} + {3479072400 10800 1 EEST} + {3497216400 7200 0 EET} + {3510522000 10800 1 EEST} + {3528666000 7200 0 EET} + {3541971600 10800 1 EEST} + {3560115600 7200 0 EET} + {3573421200 10800 1 EEST} + {3592170000 7200 0 EET} + {3604870800 10800 1 EEST} + {3623619600 7200 0 EET} + {3636320400 10800 1 EEST} + {3655069200 7200 0 EET} + {3668374800 10800 1 EEST} + {3686518800 7200 0 EET} + {3699824400 10800 1 EEST} + {3717968400 7200 0 EET} + {3731274000 10800 1 EEST} + {3750022800 7200 0 EET} + {3762723600 10800 1 EEST} + {3781472400 7200 0 EET} + {3794173200 10800 1 EEST} + {3812922000 7200 0 EET} + {3825622800 10800 1 EEST} + {3844371600 7200 0 EET} + {3857677200 10800 1 EEST} + {3875821200 7200 0 EET} + {3889126800 10800 1 EEST} + {3907270800 7200 0 EET} + {3920576400 10800 1 EEST} + {3939325200 7200 0 EET} + {3952026000 10800 1 EEST} + {3970774800 7200 0 EET} + {3983475600 10800 1 EEST} + {4002224400 7200 0 EET} + {4015530000 10800 1 EEST} + {4033674000 7200 0 EET} + {4046979600 10800 1 EEST} + {4065123600 7200 0 EET} + {4078429200 10800 1 EEST} + {4096573200 7200 0 EET} +} diff --git a/env/tcl/tcl8.6/tzdata/Europe/Kirov b/env/tcl/tcl8.6/tzdata/Europe/Kirov new file mode 100644 index 0000000..8762d22 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Europe/Kirov @@ -0,0 +1,70 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Europe/Kirov) { + {-9223372036854775808 11928 0 LMT} + {-1593820800 10800 0 +03} + {-1247540400 14400 0 +05} + {354916800 18000 1 +05} + {370724400 14400 0 +04} + {386452800 18000 1 +05} + {402260400 14400 0 +04} + {417988800 18000 1 +05} + {433796400 14400 0 +04} + {449611200 18000 1 +05} + {465343200 14400 0 +04} + {481068000 18000 1 +05} + {496792800 14400 0 +04} + {512517600 18000 1 +05} + {528242400 14400 0 +04} + {543967200 18000 1 +05} + {559692000 14400 0 +04} + {575416800 18000 1 +05} + {591141600 14400 0 +04} + {606866400 10800 0 +04} + {606870000 14400 1 +04} + {622594800 10800 0 +03} + {638319600 14400 1 +04} + {654649200 10800 0 +03} + {670374000 14400 0 +04} + {701820000 10800 0 +04} + {701823600 14400 1 +04} + {717548400 10800 0 +03} + {733273200 14400 1 +04} + {748998000 10800 0 +03} + {764722800 14400 1 +04} + {780447600 10800 0 +03} + {796172400 14400 1 +04} + {811897200 10800 0 +03} + {828226800 14400 1 +04} + {846370800 10800 0 +03} + {859676400 14400 1 +04} + {877820400 10800 0 +03} + {891126000 14400 1 +04} + {909270000 10800 0 +03} + {922575600 14400 1 +04} + {941324400 10800 0 +03} + {954025200 14400 1 +04} + {972774000 10800 0 +03} + {985474800 14400 1 +04} + {1004223600 10800 0 +03} + {1017529200 14400 1 +04} + {1035673200 10800 0 +03} + {1048978800 14400 1 +04} + {1067122800 10800 0 +03} + {1080428400 14400 1 +04} + {1099177200 10800 0 +03} + {1111878000 14400 1 +04} + {1130626800 10800 0 +03} + {1143327600 14400 1 +04} + {1162076400 10800 0 +03} + {1174777200 14400 1 +04} + {1193526000 10800 0 +03} + {1206831600 14400 1 +04} + {1224975600 10800 0 +03} + {1238281200 14400 1 +04} + {1256425200 10800 0 +03} + {1269730800 14400 1 +04} + {1288479600 10800 0 +03} + {1301180400 14400 0 +04} + {1414274400 10800 0 +03} +} diff --git a/env/tcl/tcl8.6/tzdata/Europe/Lisbon b/env/tcl/tcl8.6/tzdata/Europe/Lisbon new file mode 100644 index 0000000..b566b51 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Europe/Lisbon @@ -0,0 +1,351 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Europe/Lisbon) { + {-9223372036854775808 -2205 0 LMT} + {-2713908195 -2205 0 LMT} + {-1830384000 0 0 WET} + {-1689555600 3600 1 WEST} + {-1677801600 0 0 WET} + {-1667437200 3600 1 WEST} + {-1647738000 0 0 WET} + {-1635814800 3600 1 WEST} + {-1616202000 0 0 WET} + {-1604365200 3600 1 WEST} + {-1584666000 0 0 WET} + {-1572742800 3600 1 WEST} + {-1553043600 0 0 WET} + {-1541206800 3600 1 WEST} + {-1521507600 0 0 WET} + {-1442451600 3600 1 WEST} + {-1426813200 0 0 WET} + {-1379293200 3600 1 WEST} + {-1364778000 0 0 WET} + {-1348448400 3600 1 WEST} + {-1333328400 0 0 WET} + {-1316394000 3600 1 WEST} + {-1301274000 0 0 WET} + {-1284339600 3600 1 WEST} + {-1269824400 0 0 WET} + {-1221440400 3600 1 WEST} + {-1206925200 0 0 WET} + {-1191200400 3600 1 WEST} + {-1175475600 0 0 WET} + {-1127696400 3600 1 WEST} + {-1111971600 0 0 WET} + {-1096851600 3600 1 WEST} + {-1080522000 0 0 WET} + {-1063587600 3600 1 WEST} + {-1049072400 0 0 WET} + {-1033347600 3600 1 WEST} + {-1017622800 0 0 WET} + {-1002502800 3600 1 WEST} + {-986173200 0 0 WET} + {-969238800 3600 1 WEST} + {-950490000 0 0 WET} + {-942022800 3600 1 WEST} + {-922669200 0 0 WET} + {-906944400 3600 1 WEST} + {-891133200 0 0 WET} + {-877309200 3600 1 WEST} + {-873684000 7200 1 WEMT} + {-864007200 3600 1 WEST} + {-857955600 0 0 WET} + {-845859600 3600 1 WEST} + {-842839200 7200 1 WEMT} + {-831348000 3600 1 WEST} + {-825901200 0 0 WET} + {-814410000 3600 1 WEST} + {-810784800 7200 1 WEMT} + {-799898400 3600 1 WEST} + {-794451600 0 0 WET} + {-782960400 3600 1 WEST} + {-779335200 7200 1 WEMT} + {-768448800 3600 1 WEST} + {-763002000 0 0 WET} + {-749091600 3600 1 WEST} + {-733366800 0 0 WET} + {-717631200 3600 1 WEST} + {-701906400 0 0 WET} + {-686181600 3600 1 WEST} + {-670456800 0 0 WET} + {-654732000 3600 1 WEST} + {-639007200 0 0 WET} + {-591832800 3600 1 WEST} + {-575503200 0 0 WET} + {-559778400 3600 1 WEST} + {-544053600 0 0 WET} + {-528328800 3600 1 WEST} + {-512604000 0 0 WET} + {-496879200 3600 1 WEST} + {-481154400 0 0 WET} + {-465429600 3600 1 WEST} + {-449704800 0 0 WET} + {-433980000 3600 1 WEST} + {-417650400 0 0 WET} + {-401925600 3600 1 WEST} + {-386200800 0 0 WET} + {-370476000 3600 1 WEST} + {-354751200 0 0 WET} + {-339026400 3600 1 WEST} + {-323301600 0 0 WET} + {-307576800 3600 1 WEST} + {-291852000 0 0 WET} + {-276127200 3600 1 WEST} + {-260402400 0 0 WET} + {-244677600 3600 1 WEST} + {-228348000 0 0 WET} + {-212623200 3600 1 WEST} + {-196898400 0 0 WET} + {-181173600 3600 1 WEST} + {-165448800 0 0 WET} + {-149724000 3600 1 WEST} + {-133999200 0 0 WET} + {-118274400 3600 0 CET} + {212544000 0 0 WET} + {228268800 3600 1 WEST} + {243993600 0 0 WET} + {260323200 3600 1 WEST} + {276048000 0 0 WET} + {291772800 3600 1 WEST} + {307501200 0 0 WET} + {323222400 3600 1 WEST} + {338950800 0 0 WET} + {354675600 3600 1 WEST} + {370400400 0 0 WET} + {386125200 3600 1 WEST} + {401850000 0 0 WET} + {417578400 3600 1 WEST} + {433299600 0 0 WET} + {449024400 3600 1 WEST} + {465354000 0 0 WET} + {481078800 3600 1 WEST} + {496803600 0 0 WET} + {512528400 3600 1 WEST} + {528253200 0 0 WET} + {543978000 3600 1 WEST} + {559702800 0 0 WET} + {575427600 3600 1 WEST} + {591152400 0 0 WET} + {606877200 3600 1 WEST} + {622602000 0 0 WET} + {638326800 3600 1 WEST} + {654656400 0 0 WET} + {670381200 3600 1 WEST} + {686106000 0 0 WET} + {701830800 3600 1 WEST} + {717555600 3600 0 CET} + {733280400 7200 1 CEST} + {749005200 3600 0 CET} + {764730000 7200 1 CEST} + {780454800 3600 0 CET} + {796179600 7200 1 CEST} + {811904400 3600 0 CET} + {828234000 3600 0 WEST} + {846378000 0 0 WET} + {859683600 3600 1 WEST} + {877827600 0 0 WET} + {891133200 3600 1 WEST} + {909277200 0 0 WET} + {922582800 3600 1 WEST} + {941331600 0 0 WET} + {954032400 3600 1 WEST} + {972781200 0 0 WET} + {985482000 3600 1 WEST} + {1004230800 0 0 WET} + {1017536400 3600 1 WEST} + {1035680400 0 0 WET} + {1048986000 3600 1 WEST} + {1067130000 0 0 WET} + {1080435600 3600 1 WEST} + {1099184400 0 0 WET} + {1111885200 3600 1 WEST} + {1130634000 0 0 WET} + {1143334800 3600 1 WEST} + {1162083600 0 0 WET} + {1174784400 3600 1 WEST} + {1193533200 0 0 WET} + {1206838800 3600 1 WEST} + {1224982800 0 0 WET} + {1238288400 3600 1 WEST} + {1256432400 0 0 WET} + {1269738000 3600 1 WEST} + {1288486800 0 0 WET} + {1301187600 3600 1 WEST} + {1319936400 0 0 WET} + {1332637200 3600 1 WEST} + {1351386000 0 0 WET} + {1364691600 3600 1 WEST} + {1382835600 0 0 WET} + {1396141200 3600 1 WEST} + {1414285200 0 0 WET} + {1427590800 3600 1 WEST} + {1445734800 0 0 WET} + {1459040400 3600 1 WEST} + {1477789200 0 0 WET} + {1490490000 3600 1 WEST} + {1509238800 0 0 WET} + {1521939600 3600 1 WEST} + {1540688400 0 0 WET} + {1553994000 3600 1 WEST} + {1572138000 0 0 WET} + {1585443600 3600 1 WEST} + {1603587600 0 0 WET} + {1616893200 3600 1 WEST} + {1635642000 0 0 WET} + {1648342800 3600 1 WEST} + {1667091600 0 0 WET} + {1679792400 3600 1 WEST} + {1698541200 0 0 WET} + {1711846800 3600 1 WEST} + {1729990800 0 0 WET} + {1743296400 3600 1 WEST} + {1761440400 0 0 WET} + {1774746000 3600 1 WEST} + {1792890000 0 0 WET} + {1806195600 3600 1 WEST} + {1824944400 0 0 WET} + {1837645200 3600 1 WEST} + {1856394000 0 0 WET} + {1869094800 3600 1 WEST} + {1887843600 0 0 WET} + {1901149200 3600 1 WEST} + {1919293200 0 0 WET} + {1932598800 3600 1 WEST} + {1950742800 0 0 WET} + {1964048400 3600 1 WEST} + {1982797200 0 0 WET} + {1995498000 3600 1 WEST} + {2014246800 0 0 WET} + {2026947600 3600 1 WEST} + {2045696400 0 0 WET} + {2058397200 3600 1 WEST} + {2077146000 0 0 WET} + {2090451600 3600 1 WEST} + {2108595600 0 0 WET} + {2121901200 3600 1 WEST} + {2140045200 0 0 WET} + {2153350800 3600 1 WEST} + {2172099600 0 0 WET} + {2184800400 3600 1 WEST} + {2203549200 0 0 WET} + {2216250000 3600 1 WEST} + {2234998800 0 0 WET} + {2248304400 3600 1 WEST} + {2266448400 0 0 WET} + {2279754000 3600 1 WEST} + {2297898000 0 0 WET} + {2311203600 3600 1 WEST} + {2329347600 0 0 WET} + {2342653200 3600 1 WEST} + {2361402000 0 0 WET} + {2374102800 3600 1 WEST} + {2392851600 0 0 WET} + {2405552400 3600 1 WEST} + {2424301200 0 0 WET} + {2437606800 3600 1 WEST} + {2455750800 0 0 WET} + {2469056400 3600 1 WEST} + {2487200400 0 0 WET} + {2500506000 3600 1 WEST} + {2519254800 0 0 WET} + {2531955600 3600 1 WEST} + {2550704400 0 0 WET} + {2563405200 3600 1 WEST} + {2582154000 0 0 WET} + {2595459600 3600 1 WEST} + {2613603600 0 0 WET} + {2626909200 3600 1 WEST} + {2645053200 0 0 WET} + {2658358800 3600 1 WEST} + {2676502800 0 0 WET} + {2689808400 3600 1 WEST} + {2708557200 0 0 WET} + {2721258000 3600 1 WEST} + {2740006800 0 0 WET} + {2752707600 3600 1 WEST} + {2771456400 0 0 WET} + {2784762000 3600 1 WEST} + {2802906000 0 0 WET} + {2816211600 3600 1 WEST} + {2834355600 0 0 WET} + {2847661200 3600 1 WEST} + {2866410000 0 0 WET} + {2879110800 3600 1 WEST} + {2897859600 0 0 WET} + {2910560400 3600 1 WEST} + {2929309200 0 0 WET} + {2942010000 3600 1 WEST} + {2960758800 0 0 WET} + {2974064400 3600 1 WEST} + {2992208400 0 0 WET} + {3005514000 3600 1 WEST} + {3023658000 0 0 WET} + {3036963600 3600 1 WEST} + {3055712400 0 0 WET} + {3068413200 3600 1 WEST} + {3087162000 0 0 WET} + {3099862800 3600 1 WEST} + {3118611600 0 0 WET} + {3131917200 3600 1 WEST} + {3150061200 0 0 WET} + {3163366800 3600 1 WEST} + {3181510800 0 0 WET} + {3194816400 3600 1 WEST} + {3212960400 0 0 WET} + {3226266000 3600 1 WEST} + {3245014800 0 0 WET} + {3257715600 3600 1 WEST} + {3276464400 0 0 WET} + {3289165200 3600 1 WEST} + {3307914000 0 0 WET} + {3321219600 3600 1 WEST} + {3339363600 0 0 WET} + {3352669200 3600 1 WEST} + {3370813200 0 0 WET} + {3384118800 3600 1 WEST} + {3402867600 0 0 WET} + {3415568400 3600 1 WEST} + {3434317200 0 0 WET} + {3447018000 3600 1 WEST} + {3465766800 0 0 WET} + {3479072400 3600 1 WEST} + {3497216400 0 0 WET} + {3510522000 3600 1 WEST} + {3528666000 0 0 WET} + {3541971600 3600 1 WEST} + {3560115600 0 0 WET} + {3573421200 3600 1 WEST} + {3592170000 0 0 WET} + {3604870800 3600 1 WEST} + {3623619600 0 0 WET} + {3636320400 3600 1 WEST} + {3655069200 0 0 WET} + {3668374800 3600 1 WEST} + {3686518800 0 0 WET} + {3699824400 3600 1 WEST} + {3717968400 0 0 WET} + {3731274000 3600 1 WEST} + {3750022800 0 0 WET} + {3762723600 3600 1 WEST} + {3781472400 0 0 WET} + {3794173200 3600 1 WEST} + {3812922000 0 0 WET} + {3825622800 3600 1 WEST} + {3844371600 0 0 WET} + {3857677200 3600 1 WEST} + {3875821200 0 0 WET} + {3889126800 3600 1 WEST} + {3907270800 0 0 WET} + {3920576400 3600 1 WEST} + {3939325200 0 0 WET} + {3952026000 3600 1 WEST} + {3970774800 0 0 WET} + {3983475600 3600 1 WEST} + {4002224400 0 0 WET} + {4015530000 3600 1 WEST} + {4033674000 0 0 WET} + {4046979600 3600 1 WEST} + {4065123600 0 0 WET} + {4078429200 3600 1 WEST} + {4096573200 0 0 WET} +} diff --git a/env/tcl/tcl8.6/tzdata/Europe/Ljubljana b/env/tcl/tcl8.6/tzdata/Europe/Ljubljana new file mode 100644 index 0000000..42c7df4 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Europe/Ljubljana @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(Europe/Belgrade)]} { + LoadTimeZoneFile Europe/Belgrade +} +set TZData(:Europe/Ljubljana) $TZData(:Europe/Belgrade) diff --git a/env/tcl/tcl8.6/tzdata/Europe/London b/env/tcl/tcl8.6/tzdata/Europe/London new file mode 100644 index 0000000..2014e00 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Europe/London @@ -0,0 +1,372 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Europe/London) { + {-9223372036854775808 -75 0 LMT} + {-3852662325 0 0 GMT} + {-1691964000 3600 1 BST} + {-1680472800 0 0 GMT} + {-1664143200 3600 1 BST} + {-1650146400 0 0 GMT} + {-1633903200 3600 1 BST} + {-1617487200 0 0 GMT} + {-1601848800 3600 1 BST} + {-1586037600 0 0 GMT} + {-1570399200 3600 1 BST} + {-1552168800 0 0 GMT} + {-1538344800 3600 1 BST} + {-1522533600 0 0 GMT} + {-1507500000 3600 1 BST} + {-1490565600 0 0 GMT} + {-1473631200 3600 1 BST} + {-1460930400 0 0 GMT} + {-1442786400 3600 1 BST} + {-1428876000 0 0 GMT} + {-1410732000 3600 1 BST} + {-1396216800 0 0 GMT} + {-1379282400 3600 1 BST} + {-1364767200 0 0 GMT} + {-1348437600 3600 1 BST} + {-1333317600 0 0 GMT} + {-1315778400 3600 1 BST} + {-1301263200 0 0 GMT} + {-1284328800 3600 1 BST} + {-1269813600 0 0 GMT} + {-1253484000 3600 1 BST} + {-1238364000 0 0 GMT} + {-1221429600 3600 1 BST} + {-1206914400 0 0 GMT} + {-1189980000 3600 1 BST} + {-1175464800 0 0 GMT} + {-1159135200 3600 1 BST} + {-1143410400 0 0 GMT} + {-1126476000 3600 1 BST} + {-1111960800 0 0 GMT} + {-1095631200 3600 1 BST} + {-1080511200 0 0 GMT} + {-1063576800 3600 1 BST} + {-1049061600 0 0 GMT} + {-1032127200 3600 1 BST} + {-1017612000 0 0 GMT} + {-1001282400 3600 1 BST} + {-986162400 0 0 GMT} + {-969228000 3600 1 BST} + {-950479200 0 0 GMT} + {-942012000 3600 1 BST} + {-904518000 7200 1 BDST} + {-896050800 3600 1 BST} + {-875487600 7200 1 BDST} + {-864601200 3600 1 BST} + {-844038000 7200 1 BDST} + {-832546800 3600 1 BST} + {-812588400 7200 1 BDST} + {-798073200 3600 1 BST} + {-781052400 7200 1 BDST} + {-772066800 3600 1 BST} + {-764805600 0 0 GMT} + {-748476000 3600 1 BST} + {-733356000 0 0 GMT} + {-719445600 3600 1 BST} + {-717030000 7200 1 BDST} + {-706748400 3600 1 BST} + {-699487200 0 0 GMT} + {-687996000 3600 1 BST} + {-668037600 0 0 GMT} + {-654732000 3600 1 BST} + {-636588000 0 0 GMT} + {-622072800 3600 1 BST} + {-605743200 0 0 GMT} + {-590623200 3600 1 BST} + {-574293600 0 0 GMT} + {-558568800 3600 1 BST} + {-542239200 0 0 GMT} + {-527119200 3600 1 BST} + {-512604000 0 0 GMT} + {-496274400 3600 1 BST} + {-481154400 0 0 GMT} + {-464220000 3600 1 BST} + {-449704800 0 0 GMT} + {-432165600 3600 1 BST} + {-417650400 0 0 GMT} + {-401320800 3600 1 BST} + {-386200800 0 0 GMT} + {-369266400 3600 1 BST} + {-354751200 0 0 GMT} + {-337816800 3600 1 BST} + {-323301600 0 0 GMT} + {-306972000 3600 1 BST} + {-291852000 0 0 GMT} + {-276732000 3600 1 BST} + {-257983200 0 0 GMT} + {-245282400 3600 1 BST} + {-226533600 0 0 GMT} + {-213228000 3600 1 BST} + {-195084000 0 0 GMT} + {-182383200 3600 1 BST} + {-163634400 0 0 GMT} + {-150933600 3600 1 BST} + {-132184800 0 0 GMT} + {-119484000 3600 1 BST} + {-100735200 0 0 GMT} + {-88034400 3600 1 BST} + {-68680800 0 0 GMT} + {-59004000 3600 1 BST} + {-37238400 3600 0 BST} + {57722400 0 0 GMT} + {69818400 3600 1 BST} + {89172000 0 0 GMT} + {101268000 3600 1 BST} + {120621600 0 0 GMT} + {132717600 3600 1 BST} + {152071200 0 0 GMT} + {164167200 3600 1 BST} + {183520800 0 0 GMT} + {196221600 3600 1 BST} + {214970400 0 0 GMT} + {227671200 3600 1 BST} + {246420000 0 0 GMT} + {259120800 3600 1 BST} + {278474400 0 0 GMT} + {290570400 3600 1 BST} + {309924000 0 0 GMT} + {322020000 3600 1 BST} + {341373600 0 0 GMT} + {354675600 3600 1 BST} + {372819600 0 0 GMT} + {386125200 3600 1 BST} + {404269200 0 0 GMT} + {417574800 3600 1 BST} + {435718800 0 0 GMT} + {449024400 3600 1 BST} + {467773200 0 0 GMT} + {481078800 3600 1 BST} + {499222800 0 0 GMT} + {512528400 3600 1 BST} + {530672400 0 0 GMT} + {543978000 3600 1 BST} + {562122000 0 0 GMT} + {575427600 3600 1 BST} + {593571600 0 0 GMT} + {606877200 3600 1 BST} + {625626000 0 0 GMT} + {638326800 3600 1 BST} + {657075600 0 0 GMT} + {670381200 3600 1 BST} + {688525200 0 0 GMT} + {701830800 3600 1 BST} + {719974800 0 0 GMT} + {733280400 3600 1 BST} + {751424400 0 0 GMT} + {764730000 3600 1 BST} + {782874000 0 0 GMT} + {796179600 3600 1 BST} + {814323600 0 0 GMT} + {820454400 0 0 GMT} + {828234000 3600 1 BST} + {846378000 0 0 GMT} + {859683600 3600 1 BST} + {877827600 0 0 GMT} + {891133200 3600 1 BST} + {909277200 0 0 GMT} + {922582800 3600 1 BST} + {941331600 0 0 GMT} + {954032400 3600 1 BST} + {972781200 0 0 GMT} + {985482000 3600 1 BST} + {1004230800 0 0 GMT} + {1017536400 3600 1 BST} + {1035680400 0 0 GMT} + {1048986000 3600 1 BST} + {1067130000 0 0 GMT} + {1080435600 3600 1 BST} + {1099184400 0 0 GMT} + {1111885200 3600 1 BST} + {1130634000 0 0 GMT} + {1143334800 3600 1 BST} + {1162083600 0 0 GMT} + {1174784400 3600 1 BST} + {1193533200 0 0 GMT} + {1206838800 3600 1 BST} + {1224982800 0 0 GMT} + {1238288400 3600 1 BST} + {1256432400 0 0 GMT} + {1269738000 3600 1 BST} + {1288486800 0 0 GMT} + {1301187600 3600 1 BST} + {1319936400 0 0 GMT} + {1332637200 3600 1 BST} + {1351386000 0 0 GMT} + {1364691600 3600 1 BST} + {1382835600 0 0 GMT} + {1396141200 3600 1 BST} + {1414285200 0 0 GMT} + {1427590800 3600 1 BST} + {1445734800 0 0 GMT} + {1459040400 3600 1 BST} + {1477789200 0 0 GMT} + {1490490000 3600 1 BST} + {1509238800 0 0 GMT} + {1521939600 3600 1 BST} + {1540688400 0 0 GMT} + {1553994000 3600 1 BST} + {1572138000 0 0 GMT} + {1585443600 3600 1 BST} + {1603587600 0 0 GMT} + {1616893200 3600 1 BST} + {1635642000 0 0 GMT} + {1648342800 3600 1 BST} + {1667091600 0 0 GMT} + {1679792400 3600 1 BST} + {1698541200 0 0 GMT} + {1711846800 3600 1 BST} + {1729990800 0 0 GMT} + {1743296400 3600 1 BST} + {1761440400 0 0 GMT} + {1774746000 3600 1 BST} + {1792890000 0 0 GMT} + {1806195600 3600 1 BST} + {1824944400 0 0 GMT} + {1837645200 3600 1 BST} + {1856394000 0 0 GMT} + {1869094800 3600 1 BST} + {1887843600 0 0 GMT} + {1901149200 3600 1 BST} + {1919293200 0 0 GMT} + {1932598800 3600 1 BST} + {1950742800 0 0 GMT} + {1964048400 3600 1 BST} + {1982797200 0 0 GMT} + {1995498000 3600 1 BST} + {2014246800 0 0 GMT} + {2026947600 3600 1 BST} + {2045696400 0 0 GMT} + {2058397200 3600 1 BST} + {2077146000 0 0 GMT} + {2090451600 3600 1 BST} + {2108595600 0 0 GMT} + {2121901200 3600 1 BST} + {2140045200 0 0 GMT} + {2153350800 3600 1 BST} + {2172099600 0 0 GMT} + {2184800400 3600 1 BST} + {2203549200 0 0 GMT} + {2216250000 3600 1 BST} + {2234998800 0 0 GMT} + {2248304400 3600 1 BST} + {2266448400 0 0 GMT} + {2279754000 3600 1 BST} + {2297898000 0 0 GMT} + {2311203600 3600 1 BST} + {2329347600 0 0 GMT} + {2342653200 3600 1 BST} + {2361402000 0 0 GMT} + {2374102800 3600 1 BST} + {2392851600 0 0 GMT} + {2405552400 3600 1 BST} + {2424301200 0 0 GMT} + {2437606800 3600 1 BST} + {2455750800 0 0 GMT} + {2469056400 3600 1 BST} + {2487200400 0 0 GMT} + {2500506000 3600 1 BST} + {2519254800 0 0 GMT} + {2531955600 3600 1 BST} + {2550704400 0 0 GMT} + {2563405200 3600 1 BST} + {2582154000 0 0 GMT} + {2595459600 3600 1 BST} + {2613603600 0 0 GMT} + {2626909200 3600 1 BST} + {2645053200 0 0 GMT} + {2658358800 3600 1 BST} + {2676502800 0 0 GMT} + {2689808400 3600 1 BST} + {2708557200 0 0 GMT} + {2721258000 3600 1 BST} + {2740006800 0 0 GMT} + {2752707600 3600 1 BST} + {2771456400 0 0 GMT} + {2784762000 3600 1 BST} + {2802906000 0 0 GMT} + {2816211600 3600 1 BST} + {2834355600 0 0 GMT} + {2847661200 3600 1 BST} + {2866410000 0 0 GMT} + {2879110800 3600 1 BST} + {2897859600 0 0 GMT} + {2910560400 3600 1 BST} + {2929309200 0 0 GMT} + {2942010000 3600 1 BST} + {2960758800 0 0 GMT} + {2974064400 3600 1 BST} + {2992208400 0 0 GMT} + {3005514000 3600 1 BST} + {3023658000 0 0 GMT} + {3036963600 3600 1 BST} + {3055712400 0 0 GMT} + {3068413200 3600 1 BST} + {3087162000 0 0 GMT} + {3099862800 3600 1 BST} + {3118611600 0 0 GMT} + {3131917200 3600 1 BST} + {3150061200 0 0 GMT} + {3163366800 3600 1 BST} + {3181510800 0 0 GMT} + {3194816400 3600 1 BST} + {3212960400 0 0 GMT} + {3226266000 3600 1 BST} + {3245014800 0 0 GMT} + {3257715600 3600 1 BST} + {3276464400 0 0 GMT} + {3289165200 3600 1 BST} + {3307914000 0 0 GMT} + {3321219600 3600 1 BST} + {3339363600 0 0 GMT} + {3352669200 3600 1 BST} + {3370813200 0 0 GMT} + {3384118800 3600 1 BST} + {3402867600 0 0 GMT} + {3415568400 3600 1 BST} + {3434317200 0 0 GMT} + {3447018000 3600 1 BST} + {3465766800 0 0 GMT} + {3479072400 3600 1 BST} + {3497216400 0 0 GMT} + {3510522000 3600 1 BST} + {3528666000 0 0 GMT} + {3541971600 3600 1 BST} + {3560115600 0 0 GMT} + {3573421200 3600 1 BST} + {3592170000 0 0 GMT} + {3604870800 3600 1 BST} + {3623619600 0 0 GMT} + {3636320400 3600 1 BST} + {3655069200 0 0 GMT} + {3668374800 3600 1 BST} + {3686518800 0 0 GMT} + {3699824400 3600 1 BST} + {3717968400 0 0 GMT} + {3731274000 3600 1 BST} + {3750022800 0 0 GMT} + {3762723600 3600 1 BST} + {3781472400 0 0 GMT} + {3794173200 3600 1 BST} + {3812922000 0 0 GMT} + {3825622800 3600 1 BST} + {3844371600 0 0 GMT} + {3857677200 3600 1 BST} + {3875821200 0 0 GMT} + {3889126800 3600 1 BST} + {3907270800 0 0 GMT} + {3920576400 3600 1 BST} + {3939325200 0 0 GMT} + {3952026000 3600 1 BST} + {3970774800 0 0 GMT} + {3983475600 3600 1 BST} + {4002224400 0 0 GMT} + {4015530000 3600 1 BST} + {4033674000 0 0 GMT} + {4046979600 3600 1 BST} + {4065123600 0 0 GMT} + {4078429200 3600 1 BST} + {4096573200 0 0 GMT} +} diff --git a/env/tcl/tcl8.6/tzdata/Europe/Luxembourg b/env/tcl/tcl8.6/tzdata/Europe/Luxembourg new file mode 100644 index 0000000..2a88c4b --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Europe/Luxembourg @@ -0,0 +1,313 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Europe/Luxembourg) { + {-9223372036854775808 1476 0 LMT} + {-2069713476 3600 0 CET} + {-1692496800 7200 1 CEST} + {-1680483600 3600 0 CET} + {-1662343200 7200 1 CEST} + {-1650157200 3600 0 CET} + {-1632006000 7200 1 CEST} + {-1618700400 3600 0 CET} + {-1612659600 0 0 WET} + {-1604278800 3600 1 WEST} + {-1585519200 0 0 WET} + {-1574038800 3600 1 WEST} + {-1552258800 0 0 WET} + {-1539997200 3600 1 WEST} + {-1520550000 0 0 WET} + {-1507510800 3600 1 WEST} + {-1490572800 0 0 WET} + {-1473642000 3600 1 WEST} + {-1459119600 0 0 WET} + {-1444006800 3600 1 WEST} + {-1427673600 0 0 WET} + {-1411866000 3600 1 WEST} + {-1396224000 0 0 WET} + {-1379293200 3600 1 WEST} + {-1364774400 0 0 WET} + {-1348448400 3600 1 WEST} + {-1333324800 0 0 WET} + {-1316394000 3600 1 WEST} + {-1301270400 0 0 WET} + {-1284339600 3600 1 WEST} + {-1269813600 0 0 WET} + {-1253484000 3600 1 WEST} + {-1238364000 0 0 WET} + {-1221429600 3600 1 WEST} + {-1206914400 0 0 WET} + {-1191189600 3600 1 WEST} + {-1175464800 0 0 WET} + {-1160344800 3600 1 WEST} + {-1143410400 0 0 WET} + {-1127685600 3600 1 WEST} + {-1111960800 0 0 WET} + {-1096840800 3600 1 WEST} + {-1080511200 0 0 WET} + {-1063576800 3600 1 WEST} + {-1049061600 0 0 WET} + {-1033336800 3600 1 WEST} + {-1017612000 0 0 WET} + {-1002492000 3600 1 WEST} + {-986162400 0 0 WET} + {-969228000 3600 1 WEST} + {-950479200 0 0 WET} + {-942012000 3600 1 WEST} + {-935186400 7200 0 WEST} + {-857257200 3600 0 WET} + {-844556400 7200 1 WEST} + {-828226800 3600 0 WET} + {-812502000 7200 1 WEST} + {-797983200 3600 0 CET} + {-781052400 7200 1 CEST} + {-766623600 3600 0 CET} + {-745455600 7200 1 CEST} + {-733273200 3600 0 CET} + {220921200 3600 0 CET} + {228877200 7200 1 CEST} + {243997200 3600 0 CET} + {260326800 7200 1 CEST} + {276051600 3600 0 CET} + {291776400 7200 1 CEST} + {307501200 3600 0 CET} + {323830800 7200 1 CEST} + {338950800 3600 0 CET} + {354675600 7200 1 CEST} + {370400400 3600 0 CET} + {386125200 7200 1 CEST} + {401850000 3600 0 CET} + {417574800 7200 1 CEST} + {433299600 3600 0 CET} + {449024400 7200 1 CEST} + {465354000 3600 0 CET} + {481078800 7200 1 CEST} + {496803600 3600 0 CET} + {512528400 7200 1 CEST} + {528253200 3600 0 CET} + {543978000 7200 1 CEST} + {559702800 3600 0 CET} + {575427600 7200 1 CEST} + {591152400 3600 0 CET} + {606877200 7200 1 CEST} + {622602000 3600 0 CET} + {638326800 7200 1 CEST} + {654656400 3600 0 CET} + {670381200 7200 1 CEST} + {686106000 3600 0 CET} + {701830800 7200 1 CEST} + {717555600 3600 0 CET} + {733280400 7200 1 CEST} + {749005200 3600 0 CET} + {764730000 7200 1 CEST} + {780454800 3600 0 CET} + {796179600 7200 1 CEST} + {811904400 3600 0 CET} + {828234000 7200 1 CEST} + {846378000 3600 0 CET} + {859683600 7200 1 CEST} + {877827600 3600 0 CET} + {891133200 7200 1 CEST} + {909277200 3600 0 CET} + {922582800 7200 1 CEST} + {941331600 3600 0 CET} + {954032400 7200 1 CEST} + {972781200 3600 0 CET} + {985482000 7200 1 CEST} + {1004230800 3600 0 CET} + {1017536400 7200 1 CEST} + {1035680400 3600 0 CET} + {1048986000 7200 1 CEST} + {1067130000 3600 0 CET} + {1080435600 7200 1 CEST} + {1099184400 3600 0 CET} + {1111885200 7200 1 CEST} + {1130634000 3600 0 CET} + {1143334800 7200 1 CEST} + {1162083600 3600 0 CET} + {1174784400 7200 1 CEST} + {1193533200 3600 0 CET} + {1206838800 7200 1 CEST} + {1224982800 3600 0 CET} + {1238288400 7200 1 CEST} + {1256432400 3600 0 CET} + {1269738000 7200 1 CEST} + {1288486800 3600 0 CET} + {1301187600 7200 1 CEST} + {1319936400 3600 0 CET} + {1332637200 7200 1 CEST} + {1351386000 3600 0 CET} + {1364691600 7200 1 CEST} + {1382835600 3600 0 CET} + {1396141200 7200 1 CEST} + {1414285200 3600 0 CET} + {1427590800 7200 1 CEST} + {1445734800 3600 0 CET} + {1459040400 7200 1 CEST} + {1477789200 3600 0 CET} + {1490490000 7200 1 CEST} + {1509238800 3600 0 CET} + {1521939600 7200 1 CEST} + {1540688400 3600 0 CET} + {1553994000 7200 1 CEST} + {1572138000 3600 0 CET} + {1585443600 7200 1 CEST} + {1603587600 3600 0 CET} + {1616893200 7200 1 CEST} + {1635642000 3600 0 CET} + {1648342800 7200 1 CEST} + {1667091600 3600 0 CET} + {1679792400 7200 1 CEST} + {1698541200 3600 0 CET} + {1711846800 7200 1 CEST} + {1729990800 3600 0 CET} + {1743296400 7200 1 CEST} + {1761440400 3600 0 CET} + {1774746000 7200 1 CEST} + {1792890000 3600 0 CET} + {1806195600 7200 1 CEST} + {1824944400 3600 0 CET} + {1837645200 7200 1 CEST} + {1856394000 3600 0 CET} + {1869094800 7200 1 CEST} + {1887843600 3600 0 CET} + {1901149200 7200 1 CEST} + {1919293200 3600 0 CET} + {1932598800 7200 1 CEST} + {1950742800 3600 0 CET} + {1964048400 7200 1 CEST} + {1982797200 3600 0 CET} + {1995498000 7200 1 CEST} + {2014246800 3600 0 CET} + {2026947600 7200 1 CEST} + {2045696400 3600 0 CET} + {2058397200 7200 1 CEST} + {2077146000 3600 0 CET} + {2090451600 7200 1 CEST} + {2108595600 3600 0 CET} + {2121901200 7200 1 CEST} + {2140045200 3600 0 CET} + {2153350800 7200 1 CEST} + {2172099600 3600 0 CET} + {2184800400 7200 1 CEST} + {2203549200 3600 0 CET} + {2216250000 7200 1 CEST} + {2234998800 3600 0 CET} + {2248304400 7200 1 CEST} + {2266448400 3600 0 CET} + {2279754000 7200 1 CEST} + {2297898000 3600 0 CET} + {2311203600 7200 1 CEST} + {2329347600 3600 0 CET} + {2342653200 7200 1 CEST} + {2361402000 3600 0 CET} + {2374102800 7200 1 CEST} + {2392851600 3600 0 CET} + {2405552400 7200 1 CEST} + {2424301200 3600 0 CET} + {2437606800 7200 1 CEST} + {2455750800 3600 0 CET} + {2469056400 7200 1 CEST} + {2487200400 3600 0 CET} + {2500506000 7200 1 CEST} + {2519254800 3600 0 CET} + {2531955600 7200 1 CEST} + {2550704400 3600 0 CET} + {2563405200 7200 1 CEST} + {2582154000 3600 0 CET} + {2595459600 7200 1 CEST} + {2613603600 3600 0 CET} + {2626909200 7200 1 CEST} + {2645053200 3600 0 CET} + {2658358800 7200 1 CEST} + {2676502800 3600 0 CET} + {2689808400 7200 1 CEST} + {2708557200 3600 0 CET} + {2721258000 7200 1 CEST} + {2740006800 3600 0 CET} + {2752707600 7200 1 CEST} + {2771456400 3600 0 CET} + {2784762000 7200 1 CEST} + {2802906000 3600 0 CET} + {2816211600 7200 1 CEST} + {2834355600 3600 0 CET} + {2847661200 7200 1 CEST} + {2866410000 3600 0 CET} + {2879110800 7200 1 CEST} + {2897859600 3600 0 CET} + {2910560400 7200 1 CEST} + {2929309200 3600 0 CET} + {2942010000 7200 1 CEST} + {2960758800 3600 0 CET} + {2974064400 7200 1 CEST} + {2992208400 3600 0 CET} + {3005514000 7200 1 CEST} + {3023658000 3600 0 CET} + {3036963600 7200 1 CEST} + {3055712400 3600 0 CET} + {3068413200 7200 1 CEST} + {3087162000 3600 0 CET} + {3099862800 7200 1 CEST} + {3118611600 3600 0 CET} + {3131917200 7200 1 CEST} + {3150061200 3600 0 CET} + {3163366800 7200 1 CEST} + {3181510800 3600 0 CET} + {3194816400 7200 1 CEST} + {3212960400 3600 0 CET} + {3226266000 7200 1 CEST} + {3245014800 3600 0 CET} + {3257715600 7200 1 CEST} + {3276464400 3600 0 CET} + {3289165200 7200 1 CEST} + {3307914000 3600 0 CET} + {3321219600 7200 1 CEST} + {3339363600 3600 0 CET} + {3352669200 7200 1 CEST} + {3370813200 3600 0 CET} + {3384118800 7200 1 CEST} + {3402867600 3600 0 CET} + {3415568400 7200 1 CEST} + {3434317200 3600 0 CET} + {3447018000 7200 1 CEST} + {3465766800 3600 0 CET} + {3479072400 7200 1 CEST} + {3497216400 3600 0 CET} + {3510522000 7200 1 CEST} + {3528666000 3600 0 CET} + {3541971600 7200 1 CEST} + {3560115600 3600 0 CET} + {3573421200 7200 1 CEST} + {3592170000 3600 0 CET} + {3604870800 7200 1 CEST} + {3623619600 3600 0 CET} + {3636320400 7200 1 CEST} + {3655069200 3600 0 CET} + {3668374800 7200 1 CEST} + {3686518800 3600 0 CET} + {3699824400 7200 1 CEST} + {3717968400 3600 0 CET} + {3731274000 7200 1 CEST} + {3750022800 3600 0 CET} + {3762723600 7200 1 CEST} + {3781472400 3600 0 CET} + {3794173200 7200 1 CEST} + {3812922000 3600 0 CET} + {3825622800 7200 1 CEST} + {3844371600 3600 0 CET} + {3857677200 7200 1 CEST} + {3875821200 3600 0 CET} + {3889126800 7200 1 CEST} + {3907270800 3600 0 CET} + {3920576400 7200 1 CEST} + {3939325200 3600 0 CET} + {3952026000 7200 1 CEST} + {3970774800 3600 0 CET} + {3983475600 7200 1 CEST} + {4002224400 3600 0 CET} + {4015530000 7200 1 CEST} + {4033674000 3600 0 CET} + {4046979600 7200 1 CEST} + {4065123600 3600 0 CET} + {4078429200 7200 1 CEST} + {4096573200 3600 0 CET} +} diff --git a/env/tcl/tcl8.6/tzdata/Europe/Madrid b/env/tcl/tcl8.6/tzdata/Europe/Madrid new file mode 100644 index 0000000..f4dd484 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Europe/Madrid @@ -0,0 +1,292 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Europe/Madrid) { + {-9223372036854775808 -884 0 LMT} + {-2177452800 0 0 WET} + {-1631926800 3600 1 WEST} + {-1616889600 0 0 WET} + {-1601168400 3600 1 WEST} + {-1585353600 0 0 WET} + {-1442451600 3600 1 WEST} + {-1427673600 0 0 WET} + {-1379293200 3600 1 WEST} + {-1364774400 0 0 WET} + {-1348448400 3600 1 WEST} + {-1333324800 0 0 WET} + {-1316390400 3600 1 WEST} + {-1301270400 0 0 WET} + {-1284339600 3600 1 WEST} + {-1269820800 0 0 WET} + {-1026954000 3600 1 WEST} + {-1017619200 0 0 WET} + {-1001898000 3600 1 WEST} + {-999482400 7200 1 WEMT} + {-986090400 3600 1 WEST} + {-954115200 0 0 WET} + {-940208400 3600 0 CET} + {-873079200 7200 1 CEST} + {-862621200 3600 0 CET} + {-842839200 7200 1 CEST} + {-828320400 3600 0 CET} + {-811389600 7200 1 CEST} + {-796870800 3600 0 CET} + {-779940000 7200 1 CEST} + {-765421200 3600 0 CET} + {-748490400 7200 1 CEST} + {-733971600 3600 0 CET} + {-652327200 7200 1 CEST} + {-639018000 3600 0 CET} + {135122400 7200 1 CEST} + {150246000 3600 0 CET} + {166572000 7200 1 CEST} + {181695600 3600 0 CET} + {196812000 7200 1 CEST} + {212540400 3600 0 CET} + {228866400 7200 1 CEST} + {243990000 3600 0 CET} + {260326800 7200 1 CEST} + {276051600 3600 0 CET} + {283993200 3600 0 CET} + {291776400 7200 1 CEST} + {307501200 3600 0 CET} + {323830800 7200 1 CEST} + {338950800 3600 0 CET} + {354675600 7200 1 CEST} + {370400400 3600 0 CET} + {386125200 7200 1 CEST} + {401850000 3600 0 CET} + {417574800 7200 1 CEST} + {433299600 3600 0 CET} + {449024400 7200 1 CEST} + {465354000 3600 0 CET} + {481078800 7200 1 CEST} + {496803600 3600 0 CET} + {512528400 7200 1 CEST} + {528253200 3600 0 CET} + {543978000 7200 1 CEST} + {559702800 3600 0 CET} + {575427600 7200 1 CEST} + {591152400 3600 0 CET} + {606877200 7200 1 CEST} + {622602000 3600 0 CET} + {638326800 7200 1 CEST} + {654656400 3600 0 CET} + {670381200 7200 1 CEST} + {686106000 3600 0 CET} + {701830800 7200 1 CEST} + {717555600 3600 0 CET} + {733280400 7200 1 CEST} + {749005200 3600 0 CET} + {764730000 7200 1 CEST} + {780454800 3600 0 CET} + {796179600 7200 1 CEST} + {811904400 3600 0 CET} + {828234000 7200 1 CEST} + {846378000 3600 0 CET} + {859683600 7200 1 CEST} + {877827600 3600 0 CET} + {891133200 7200 1 CEST} + {909277200 3600 0 CET} + {922582800 7200 1 CEST} + {941331600 3600 0 CET} + {954032400 7200 1 CEST} + {972781200 3600 0 CET} + {985482000 7200 1 CEST} + {1004230800 3600 0 CET} + {1017536400 7200 1 CEST} + {1035680400 3600 0 CET} + {1048986000 7200 1 CEST} + {1067130000 3600 0 CET} + {1080435600 7200 1 CEST} + {1099184400 3600 0 CET} + {1111885200 7200 1 CEST} + {1130634000 3600 0 CET} + {1143334800 7200 1 CEST} + {1162083600 3600 0 CET} + {1174784400 7200 1 CEST} + {1193533200 3600 0 CET} + {1206838800 7200 1 CEST} + {1224982800 3600 0 CET} + {1238288400 7200 1 CEST} + {1256432400 3600 0 CET} + {1269738000 7200 1 CEST} + {1288486800 3600 0 CET} + {1301187600 7200 1 CEST} + {1319936400 3600 0 CET} + {1332637200 7200 1 CEST} + {1351386000 3600 0 CET} + {1364691600 7200 1 CEST} + {1382835600 3600 0 CET} + {1396141200 7200 1 CEST} + {1414285200 3600 0 CET} + {1427590800 7200 1 CEST} + {1445734800 3600 0 CET} + {1459040400 7200 1 CEST} + {1477789200 3600 0 CET} + {1490490000 7200 1 CEST} + {1509238800 3600 0 CET} + {1521939600 7200 1 CEST} + {1540688400 3600 0 CET} + {1553994000 7200 1 CEST} + {1572138000 3600 0 CET} + {1585443600 7200 1 CEST} + {1603587600 3600 0 CET} + {1616893200 7200 1 CEST} + {1635642000 3600 0 CET} + {1648342800 7200 1 CEST} + {1667091600 3600 0 CET} + {1679792400 7200 1 CEST} + {1698541200 3600 0 CET} + {1711846800 7200 1 CEST} + {1729990800 3600 0 CET} + {1743296400 7200 1 CEST} + {1761440400 3600 0 CET} + {1774746000 7200 1 CEST} + {1792890000 3600 0 CET} + {1806195600 7200 1 CEST} + {1824944400 3600 0 CET} + {1837645200 7200 1 CEST} + {1856394000 3600 0 CET} + {1869094800 7200 1 CEST} + {1887843600 3600 0 CET} + {1901149200 7200 1 CEST} + {1919293200 3600 0 CET} + {1932598800 7200 1 CEST} + {1950742800 3600 0 CET} + {1964048400 7200 1 CEST} + {1982797200 3600 0 CET} + {1995498000 7200 1 CEST} + {2014246800 3600 0 CET} + {2026947600 7200 1 CEST} + {2045696400 3600 0 CET} + {2058397200 7200 1 CEST} + {2077146000 3600 0 CET} + {2090451600 7200 1 CEST} + {2108595600 3600 0 CET} + {2121901200 7200 1 CEST} + {2140045200 3600 0 CET} + {2153350800 7200 1 CEST} + {2172099600 3600 0 CET} + {2184800400 7200 1 CEST} + {2203549200 3600 0 CET} + {2216250000 7200 1 CEST} + {2234998800 3600 0 CET} + {2248304400 7200 1 CEST} + {2266448400 3600 0 CET} + {2279754000 7200 1 CEST} + {2297898000 3600 0 CET} + {2311203600 7200 1 CEST} + {2329347600 3600 0 CET} + {2342653200 7200 1 CEST} + {2361402000 3600 0 CET} + {2374102800 7200 1 CEST} + {2392851600 3600 0 CET} + {2405552400 7200 1 CEST} + {2424301200 3600 0 CET} + {2437606800 7200 1 CEST} + {2455750800 3600 0 CET} + {2469056400 7200 1 CEST} + {2487200400 3600 0 CET} + {2500506000 7200 1 CEST} + {2519254800 3600 0 CET} + {2531955600 7200 1 CEST} + {2550704400 3600 0 CET} + {2563405200 7200 1 CEST} + {2582154000 3600 0 CET} + {2595459600 7200 1 CEST} + {2613603600 3600 0 CET} + {2626909200 7200 1 CEST} + {2645053200 3600 0 CET} + {2658358800 7200 1 CEST} + {2676502800 3600 0 CET} + {2689808400 7200 1 CEST} + {2708557200 3600 0 CET} + {2721258000 7200 1 CEST} + {2740006800 3600 0 CET} + {2752707600 7200 1 CEST} + {2771456400 3600 0 CET} + {2784762000 7200 1 CEST} + {2802906000 3600 0 CET} + {2816211600 7200 1 CEST} + {2834355600 3600 0 CET} + {2847661200 7200 1 CEST} + {2866410000 3600 0 CET} + {2879110800 7200 1 CEST} + {2897859600 3600 0 CET} + {2910560400 7200 1 CEST} + {2929309200 3600 0 CET} + {2942010000 7200 1 CEST} + {2960758800 3600 0 CET} + {2974064400 7200 1 CEST} + {2992208400 3600 0 CET} + {3005514000 7200 1 CEST} + {3023658000 3600 0 CET} + {3036963600 7200 1 CEST} + {3055712400 3600 0 CET} + {3068413200 7200 1 CEST} + {3087162000 3600 0 CET} + {3099862800 7200 1 CEST} + {3118611600 3600 0 CET} + {3131917200 7200 1 CEST} + {3150061200 3600 0 CET} + {3163366800 7200 1 CEST} + {3181510800 3600 0 CET} + {3194816400 7200 1 CEST} + {3212960400 3600 0 CET} + {3226266000 7200 1 CEST} + {3245014800 3600 0 CET} + {3257715600 7200 1 CEST} + {3276464400 3600 0 CET} + {3289165200 7200 1 CEST} + {3307914000 3600 0 CET} + {3321219600 7200 1 CEST} + {3339363600 3600 0 CET} + {3352669200 7200 1 CEST} + {3370813200 3600 0 CET} + {3384118800 7200 1 CEST} + {3402867600 3600 0 CET} + {3415568400 7200 1 CEST} + {3434317200 3600 0 CET} + {3447018000 7200 1 CEST} + {3465766800 3600 0 CET} + {3479072400 7200 1 CEST} + {3497216400 3600 0 CET} + {3510522000 7200 1 CEST} + {3528666000 3600 0 CET} + {3541971600 7200 1 CEST} + {3560115600 3600 0 CET} + {3573421200 7200 1 CEST} + {3592170000 3600 0 CET} + {3604870800 7200 1 CEST} + {3623619600 3600 0 CET} + {3636320400 7200 1 CEST} + {3655069200 3600 0 CET} + {3668374800 7200 1 CEST} + {3686518800 3600 0 CET} + {3699824400 7200 1 CEST} + {3717968400 3600 0 CET} + {3731274000 7200 1 CEST} + {3750022800 3600 0 CET} + {3762723600 7200 1 CEST} + {3781472400 3600 0 CET} + {3794173200 7200 1 CEST} + {3812922000 3600 0 CET} + {3825622800 7200 1 CEST} + {3844371600 3600 0 CET} + {3857677200 7200 1 CEST} + {3875821200 3600 0 CET} + {3889126800 7200 1 CEST} + {3907270800 3600 0 CET} + {3920576400 7200 1 CEST} + {3939325200 3600 0 CET} + {3952026000 7200 1 CEST} + {3970774800 3600 0 CET} + {3983475600 7200 1 CEST} + {4002224400 3600 0 CET} + {4015530000 7200 1 CEST} + {4033674000 3600 0 CET} + {4046979600 7200 1 CEST} + {4065123600 3600 0 CET} + {4078429200 7200 1 CEST} + {4096573200 3600 0 CET} +} diff --git a/env/tcl/tcl8.6/tzdata/Europe/Malta b/env/tcl/tcl8.6/tzdata/Europe/Malta new file mode 100644 index 0000000..0ebe2f6 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Europe/Malta @@ -0,0 +1,299 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Europe/Malta) { + {-9223372036854775808 3484 0 LMT} + {-2403478684 3600 0 CET} + {-1690765200 7200 1 CEST} + {-1680487200 3600 0 CET} + {-1664758800 7200 1 CEST} + {-1648951200 3600 0 CET} + {-1635123600 7200 1 CEST} + {-1616896800 3600 0 CET} + {-1604278800 7200 1 CEST} + {-1585533600 3600 0 CET} + {-1571014800 7200 1 CEST} + {-1555293600 3600 0 CET} + {-932432400 7200 1 CEST} + {-857257200 3600 0 CET} + {-844556400 7200 1 CEST} + {-828226800 3600 0 CET} + {-812588400 7200 1 CEST} + {-798073200 3600 0 CET} + {-781052400 7200 1 CEST} + {-766717200 3600 0 CET} + {-750898800 7200 1 CEST} + {-733359600 3600 0 CET} + {-719456400 7200 1 CEST} + {-701917200 3600 0 CET} + {-689209200 7200 1 CEST} + {-670460400 3600 0 CET} + {-114051600 7200 1 CEST} + {-103168800 3600 0 CET} + {-81997200 7200 1 CEST} + {-71715600 3600 0 CET} + {-50547600 7200 1 CEST} + {-40266000 3600 0 CET} + {-18493200 7200 1 CEST} + {-8211600 3600 0 CET} + {12956400 7200 1 CEST} + {23238000 3600 0 CET} + {43801200 7200 1 CEST} + {54687600 3600 0 CET} + {75855600 7200 1 CEST} + {86742000 3600 0 CET} + {102380400 7200 0 CEST} + {118105200 3600 0 CET} + {135730800 7200 1 CEST} + {148518000 3600 0 CET} + {167187600 7200 1 CEST} + {180489600 3600 0 CET} + {198637200 7200 1 CEST} + {211939200 3600 0 CET} + {230086800 7200 1 CEST} + {243388800 3600 0 CET} + {261536400 7200 1 CEST} + {274838400 3600 0 CET} + {292986000 7200 1 CEST} + {306288000 3600 0 CET} + {323312400 7200 1 CEST} + {338342400 3600 0 CET} + {347151600 3600 0 CET} + {354675600 7200 1 CEST} + {370400400 3600 0 CET} + {386125200 7200 1 CEST} + {401850000 3600 0 CET} + {417574800 7200 1 CEST} + {433299600 3600 0 CET} + {449024400 7200 1 CEST} + {465354000 3600 0 CET} + {481078800 7200 1 CEST} + {496803600 3600 0 CET} + {512528400 7200 1 CEST} + {528253200 3600 0 CET} + {543978000 7200 1 CEST} + {559702800 3600 0 CET} + {575427600 7200 1 CEST} + {591152400 3600 0 CET} + {606877200 7200 1 CEST} + {622602000 3600 0 CET} + {638326800 7200 1 CEST} + {654656400 3600 0 CET} + {670381200 7200 1 CEST} + {686106000 3600 0 CET} + {701830800 7200 1 CEST} + {717555600 3600 0 CET} + {733280400 7200 1 CEST} + {749005200 3600 0 CET} + {764730000 7200 1 CEST} + {780454800 3600 0 CET} + {796179600 7200 1 CEST} + {811904400 3600 0 CET} + {828234000 7200 1 CEST} + {846378000 3600 0 CET} + {859683600 7200 1 CEST} + {877827600 3600 0 CET} + {891133200 7200 1 CEST} + {909277200 3600 0 CET} + {922582800 7200 1 CEST} + {941331600 3600 0 CET} + {954032400 7200 1 CEST} + {972781200 3600 0 CET} + {985482000 7200 1 CEST} + {1004230800 3600 0 CET} + {1017536400 7200 1 CEST} + {1035680400 3600 0 CET} + {1048986000 7200 1 CEST} + {1067130000 3600 0 CET} + {1080435600 7200 1 CEST} + {1099184400 3600 0 CET} + {1111885200 7200 1 CEST} + {1130634000 3600 0 CET} + {1143334800 7200 1 CEST} + {1162083600 3600 0 CET} + {1174784400 7200 1 CEST} + {1193533200 3600 0 CET} + {1206838800 7200 1 CEST} + {1224982800 3600 0 CET} + {1238288400 7200 1 CEST} + {1256432400 3600 0 CET} + {1269738000 7200 1 CEST} + {1288486800 3600 0 CET} + {1301187600 7200 1 CEST} + {1319936400 3600 0 CET} + {1332637200 7200 1 CEST} + {1351386000 3600 0 CET} + {1364691600 7200 1 CEST} + {1382835600 3600 0 CET} + {1396141200 7200 1 CEST} + {1414285200 3600 0 CET} + {1427590800 7200 1 CEST} + {1445734800 3600 0 CET} + {1459040400 7200 1 CEST} + {1477789200 3600 0 CET} + {1490490000 7200 1 CEST} + {1509238800 3600 0 CET} + {1521939600 7200 1 CEST} + {1540688400 3600 0 CET} + {1553994000 7200 1 CEST} + {1572138000 3600 0 CET} + {1585443600 7200 1 CEST} + {1603587600 3600 0 CET} + {1616893200 7200 1 CEST} + {1635642000 3600 0 CET} + {1648342800 7200 1 CEST} + {1667091600 3600 0 CET} + {1679792400 7200 1 CEST} + {1698541200 3600 0 CET} + {1711846800 7200 1 CEST} + {1729990800 3600 0 CET} + {1743296400 7200 1 CEST} + {1761440400 3600 0 CET} + {1774746000 7200 1 CEST} + {1792890000 3600 0 CET} + {1806195600 7200 1 CEST} + {1824944400 3600 0 CET} + {1837645200 7200 1 CEST} + {1856394000 3600 0 CET} + {1869094800 7200 1 CEST} + {1887843600 3600 0 CET} + {1901149200 7200 1 CEST} + {1919293200 3600 0 CET} + {1932598800 7200 1 CEST} + {1950742800 3600 0 CET} + {1964048400 7200 1 CEST} + {1982797200 3600 0 CET} + {1995498000 7200 1 CEST} + {2014246800 3600 0 CET} + {2026947600 7200 1 CEST} + {2045696400 3600 0 CET} + {2058397200 7200 1 CEST} + {2077146000 3600 0 CET} + {2090451600 7200 1 CEST} + {2108595600 3600 0 CET} + {2121901200 7200 1 CEST} + {2140045200 3600 0 CET} + {2153350800 7200 1 CEST} + {2172099600 3600 0 CET} + {2184800400 7200 1 CEST} + {2203549200 3600 0 CET} + {2216250000 7200 1 CEST} + {2234998800 3600 0 CET} + {2248304400 7200 1 CEST} + {2266448400 3600 0 CET} + {2279754000 7200 1 CEST} + {2297898000 3600 0 CET} + {2311203600 7200 1 CEST} + {2329347600 3600 0 CET} + {2342653200 7200 1 CEST} + {2361402000 3600 0 CET} + {2374102800 7200 1 CEST} + {2392851600 3600 0 CET} + {2405552400 7200 1 CEST} + {2424301200 3600 0 CET} + {2437606800 7200 1 CEST} + {2455750800 3600 0 CET} + {2469056400 7200 1 CEST} + {2487200400 3600 0 CET} + {2500506000 7200 1 CEST} + {2519254800 3600 0 CET} + {2531955600 7200 1 CEST} + {2550704400 3600 0 CET} + {2563405200 7200 1 CEST} + {2582154000 3600 0 CET} + {2595459600 7200 1 CEST} + {2613603600 3600 0 CET} + {2626909200 7200 1 CEST} + {2645053200 3600 0 CET} + {2658358800 7200 1 CEST} + {2676502800 3600 0 CET} + {2689808400 7200 1 CEST} + {2708557200 3600 0 CET} + {2721258000 7200 1 CEST} + {2740006800 3600 0 CET} + {2752707600 7200 1 CEST} + {2771456400 3600 0 CET} + {2784762000 7200 1 CEST} + {2802906000 3600 0 CET} + {2816211600 7200 1 CEST} + {2834355600 3600 0 CET} + {2847661200 7200 1 CEST} + {2866410000 3600 0 CET} + {2879110800 7200 1 CEST} + {2897859600 3600 0 CET} + {2910560400 7200 1 CEST} + {2929309200 3600 0 CET} + {2942010000 7200 1 CEST} + {2960758800 3600 0 CET} + {2974064400 7200 1 CEST} + {2992208400 3600 0 CET} + {3005514000 7200 1 CEST} + {3023658000 3600 0 CET} + {3036963600 7200 1 CEST} + {3055712400 3600 0 CET} + {3068413200 7200 1 CEST} + {3087162000 3600 0 CET} + {3099862800 7200 1 CEST} + {3118611600 3600 0 CET} + {3131917200 7200 1 CEST} + {3150061200 3600 0 CET} + {3163366800 7200 1 CEST} + {3181510800 3600 0 CET} + {3194816400 7200 1 CEST} + {3212960400 3600 0 CET} + {3226266000 7200 1 CEST} + {3245014800 3600 0 CET} + {3257715600 7200 1 CEST} + {3276464400 3600 0 CET} + {3289165200 7200 1 CEST} + {3307914000 3600 0 CET} + {3321219600 7200 1 CEST} + {3339363600 3600 0 CET} + {3352669200 7200 1 CEST} + {3370813200 3600 0 CET} + {3384118800 7200 1 CEST} + {3402867600 3600 0 CET} + {3415568400 7200 1 CEST} + {3434317200 3600 0 CET} + {3447018000 7200 1 CEST} + {3465766800 3600 0 CET} + {3479072400 7200 1 CEST} + {3497216400 3600 0 CET} + {3510522000 7200 1 CEST} + {3528666000 3600 0 CET} + {3541971600 7200 1 CEST} + {3560115600 3600 0 CET} + {3573421200 7200 1 CEST} + {3592170000 3600 0 CET} + {3604870800 7200 1 CEST} + {3623619600 3600 0 CET} + {3636320400 7200 1 CEST} + {3655069200 3600 0 CET} + {3668374800 7200 1 CEST} + {3686518800 3600 0 CET} + {3699824400 7200 1 CEST} + {3717968400 3600 0 CET} + {3731274000 7200 1 CEST} + {3750022800 3600 0 CET} + {3762723600 7200 1 CEST} + {3781472400 3600 0 CET} + {3794173200 7200 1 CEST} + {3812922000 3600 0 CET} + {3825622800 7200 1 CEST} + {3844371600 3600 0 CET} + {3857677200 7200 1 CEST} + {3875821200 3600 0 CET} + {3889126800 7200 1 CEST} + {3907270800 3600 0 CET} + {3920576400 7200 1 CEST} + {3939325200 3600 0 CET} + {3952026000 7200 1 CEST} + {3970774800 3600 0 CET} + {3983475600 7200 1 CEST} + {4002224400 3600 0 CET} + {4015530000 7200 1 CEST} + {4033674000 3600 0 CET} + {4046979600 7200 1 CEST} + {4065123600 3600 0 CET} + {4078429200 7200 1 CEST} + {4096573200 3600 0 CET} +} diff --git a/env/tcl/tcl8.6/tzdata/Europe/Mariehamn b/env/tcl/tcl8.6/tzdata/Europe/Mariehamn new file mode 100644 index 0000000..26d9177 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Europe/Mariehamn @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(Europe/Helsinki)]} { + LoadTimeZoneFile Europe/Helsinki +} +set TZData(:Europe/Mariehamn) $TZData(:Europe/Helsinki) diff --git a/env/tcl/tcl8.6/tzdata/Europe/Minsk b/env/tcl/tcl8.6/tzdata/Europe/Minsk new file mode 100644 index 0000000..7a6232e --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Europe/Minsk @@ -0,0 +1,75 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Europe/Minsk) { + {-9223372036854775808 6616 0 LMT} + {-2840147416 6600 0 MMT} + {-1441158600 7200 0 EET} + {-1247536800 10800 0 MSK} + {-899780400 3600 0 CET} + {-857257200 3600 0 CET} + {-844556400 7200 1 CEST} + {-828226800 3600 0 CET} + {-812502000 7200 1 CEST} + {-804646800 10800 0 MSD} + {354920400 14400 1 MSD} + {370728000 10800 0 MSK} + {386456400 14400 1 MSD} + {402264000 10800 0 MSK} + {417992400 14400 1 MSD} + {433800000 10800 0 MSK} + {449614800 14400 1 MSD} + {465346800 10800 0 MSK} + {481071600 14400 1 MSD} + {496796400 10800 0 MSK} + {512521200 14400 1 MSD} + {528246000 10800 0 MSK} + {543970800 14400 1 MSD} + {559695600 10800 0 MSK} + {575420400 14400 1 MSD} + {591145200 10800 0 MSK} + {606870000 14400 1 MSD} + {622594800 10800 0 MSK} + {631141200 10800 0 MSK} + {670374000 7200 0 EEMMTT} + {670377600 10800 1 EEST} + {686102400 7200 0 EET} + {701827200 10800 1 EEST} + {717552000 7200 0 EET} + {733276800 10800 1 EEST} + {749001600 7200 0 EET} + {764726400 10800 1 EEST} + {780451200 7200 0 EET} + {796176000 10800 1 EEST} + {811900800 7200 0 EET} + {828230400 10800 1 EEST} + {846374400 7200 0 EET} + {859680000 10800 1 EEST} + {877824000 7200 0 EET} + {891129600 10800 1 EEST} + {909273600 7200 0 EET} + {922579200 10800 1 EEST} + {941328000 7200 0 EET} + {954028800 10800 1 EEST} + {972777600 7200 0 EET} + {985478400 10800 1 EEST} + {1004227200 7200 0 EET} + {1017532800 10800 1 EEST} + {1035676800 7200 0 EET} + {1048982400 10800 1 EEST} + {1067126400 7200 0 EET} + {1080432000 10800 1 EEST} + {1099180800 7200 0 EET} + {1111881600 10800 1 EEST} + {1130630400 7200 0 EET} + {1143331200 10800 1 EEST} + {1162080000 7200 0 EET} + {1174780800 10800 1 EEST} + {1193529600 7200 0 EET} + {1206835200 10800 1 EEST} + {1224979200 7200 0 EET} + {1238284800 10800 1 EEST} + {1256428800 7200 0 EET} + {1269734400 10800 1 EEST} + {1288483200 7200 0 EET} + {1301184000 10800 0 +03} +} diff --git a/env/tcl/tcl8.6/tzdata/Europe/Monaco b/env/tcl/tcl8.6/tzdata/Europe/Monaco new file mode 100644 index 0000000..f887b0b --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Europe/Monaco @@ -0,0 +1,315 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Europe/Monaco) { + {-9223372036854775808 1772 0 LMT} + {-2486680172 561 0 PMT} + {-1855958961 0 0 WET} + {-1689814800 3600 1 WEST} + {-1680397200 0 0 WET} + {-1665363600 3600 1 WEST} + {-1648342800 0 0 WET} + {-1635123600 3600 1 WEST} + {-1616893200 0 0 WET} + {-1604278800 3600 1 WEST} + {-1585443600 0 0 WET} + {-1574038800 3600 1 WEST} + {-1552266000 0 0 WET} + {-1539997200 3600 1 WEST} + {-1520557200 0 0 WET} + {-1507510800 3600 1 WEST} + {-1490576400 0 0 WET} + {-1470618000 3600 1 WEST} + {-1459126800 0 0 WET} + {-1444006800 3600 1 WEST} + {-1427677200 0 0 WET} + {-1411952400 3600 1 WEST} + {-1396227600 0 0 WET} + {-1379293200 3600 1 WEST} + {-1364778000 0 0 WET} + {-1348448400 3600 1 WEST} + {-1333328400 0 0 WET} + {-1316394000 3600 1 WEST} + {-1301274000 0 0 WET} + {-1284339600 3600 1 WEST} + {-1269824400 0 0 WET} + {-1253494800 3600 1 WEST} + {-1238374800 0 0 WET} + {-1221440400 3600 1 WEST} + {-1206925200 0 0 WET} + {-1191200400 3600 1 WEST} + {-1175475600 0 0 WET} + {-1160355600 3600 1 WEST} + {-1143421200 0 0 WET} + {-1127696400 3600 1 WEST} + {-1111971600 0 0 WET} + {-1096851600 3600 1 WEST} + {-1080522000 0 0 WET} + {-1063587600 3600 1 WEST} + {-1049072400 0 0 WET} + {-1033347600 3600 1 WEST} + {-1017622800 0 0 WET} + {-1002502800 3600 1 WEST} + {-986173200 0 0 WET} + {-969238800 3600 1 WEST} + {-950490000 0 0 WET} + {-942012000 3600 1 WEST} + {-904438800 7200 1 WEMT} + {-891136800 3600 1 WEST} + {-877827600 7200 1 WEMT} + {-857257200 3600 1 WEST} + {-844556400 7200 1 WEMT} + {-828226800 3600 1 WEST} + {-812502000 7200 1 WEMT} + {-796266000 3600 1 WEST} + {-781052400 7200 1 WEMT} + {-766616400 3600 0 CET} + {196819200 7200 1 CEST} + {212540400 3600 0 CET} + {220921200 3600 0 CET} + {228877200 7200 1 CEST} + {243997200 3600 0 CET} + {260326800 7200 1 CEST} + {276051600 3600 0 CET} + {291776400 7200 1 CEST} + {307501200 3600 0 CET} + {323830800 7200 1 CEST} + {338950800 3600 0 CET} + {354675600 7200 1 CEST} + {370400400 3600 0 CET} + {386125200 7200 1 CEST} + {401850000 3600 0 CET} + {417574800 7200 1 CEST} + {433299600 3600 0 CET} + {449024400 7200 1 CEST} + {465354000 3600 0 CET} + {481078800 7200 1 CEST} + {496803600 3600 0 CET} + {512528400 7200 1 CEST} + {528253200 3600 0 CET} + {543978000 7200 1 CEST} + {559702800 3600 0 CET} + {575427600 7200 1 CEST} + {591152400 3600 0 CET} + {606877200 7200 1 CEST} + {622602000 3600 0 CET} + {638326800 7200 1 CEST} + {654656400 3600 0 CET} + {670381200 7200 1 CEST} + {686106000 3600 0 CET} + {701830800 7200 1 CEST} + {717555600 3600 0 CET} + {733280400 7200 1 CEST} + {749005200 3600 0 CET} + {764730000 7200 1 CEST} + {780454800 3600 0 CET} + {796179600 7200 1 CEST} + {811904400 3600 0 CET} + {828234000 7200 1 CEST} + {846378000 3600 0 CET} + {859683600 7200 1 CEST} + {877827600 3600 0 CET} + {891133200 7200 1 CEST} + {909277200 3600 0 CET} + {922582800 7200 1 CEST} + {941331600 3600 0 CET} + {954032400 7200 1 CEST} + {972781200 3600 0 CET} + {985482000 7200 1 CEST} + {1004230800 3600 0 CET} + {1017536400 7200 1 CEST} + {1035680400 3600 0 CET} + {1048986000 7200 1 CEST} + {1067130000 3600 0 CET} + {1080435600 7200 1 CEST} + {1099184400 3600 0 CET} + {1111885200 7200 1 CEST} + {1130634000 3600 0 CET} + {1143334800 7200 1 CEST} + {1162083600 3600 0 CET} + {1174784400 7200 1 CEST} + {1193533200 3600 0 CET} + {1206838800 7200 1 CEST} + {1224982800 3600 0 CET} + {1238288400 7200 1 CEST} + {1256432400 3600 0 CET} + {1269738000 7200 1 CEST} + {1288486800 3600 0 CET} + {1301187600 7200 1 CEST} + {1319936400 3600 0 CET} + {1332637200 7200 1 CEST} + {1351386000 3600 0 CET} + {1364691600 7200 1 CEST} + {1382835600 3600 0 CET} + {1396141200 7200 1 CEST} + {1414285200 3600 0 CET} + {1427590800 7200 1 CEST} + {1445734800 3600 0 CET} + {1459040400 7200 1 CEST} + {1477789200 3600 0 CET} + {1490490000 7200 1 CEST} + {1509238800 3600 0 CET} + {1521939600 7200 1 CEST} + {1540688400 3600 0 CET} + {1553994000 7200 1 CEST} + {1572138000 3600 0 CET} + {1585443600 7200 1 CEST} + {1603587600 3600 0 CET} + {1616893200 7200 1 CEST} + {1635642000 3600 0 CET} + {1648342800 7200 1 CEST} + {1667091600 3600 0 CET} + {1679792400 7200 1 CEST} + {1698541200 3600 0 CET} + {1711846800 7200 1 CEST} + {1729990800 3600 0 CET} + {1743296400 7200 1 CEST} + {1761440400 3600 0 CET} + {1774746000 7200 1 CEST} + {1792890000 3600 0 CET} + {1806195600 7200 1 CEST} + {1824944400 3600 0 CET} + {1837645200 7200 1 CEST} + {1856394000 3600 0 CET} + {1869094800 7200 1 CEST} + {1887843600 3600 0 CET} + {1901149200 7200 1 CEST} + {1919293200 3600 0 CET} + {1932598800 7200 1 CEST} + {1950742800 3600 0 CET} + {1964048400 7200 1 CEST} + {1982797200 3600 0 CET} + {1995498000 7200 1 CEST} + {2014246800 3600 0 CET} + {2026947600 7200 1 CEST} + {2045696400 3600 0 CET} + {2058397200 7200 1 CEST} + {2077146000 3600 0 CET} + {2090451600 7200 1 CEST} + {2108595600 3600 0 CET} + {2121901200 7200 1 CEST} + {2140045200 3600 0 CET} + {2153350800 7200 1 CEST} + {2172099600 3600 0 CET} + {2184800400 7200 1 CEST} + {2203549200 3600 0 CET} + {2216250000 7200 1 CEST} + {2234998800 3600 0 CET} + {2248304400 7200 1 CEST} + {2266448400 3600 0 CET} + {2279754000 7200 1 CEST} + {2297898000 3600 0 CET} + {2311203600 7200 1 CEST} + {2329347600 3600 0 CET} + {2342653200 7200 1 CEST} + {2361402000 3600 0 CET} + {2374102800 7200 1 CEST} + {2392851600 3600 0 CET} + {2405552400 7200 1 CEST} + {2424301200 3600 0 CET} + {2437606800 7200 1 CEST} + {2455750800 3600 0 CET} + {2469056400 7200 1 CEST} + {2487200400 3600 0 CET} + {2500506000 7200 1 CEST} + {2519254800 3600 0 CET} + {2531955600 7200 1 CEST} + {2550704400 3600 0 CET} + {2563405200 7200 1 CEST} + {2582154000 3600 0 CET} + {2595459600 7200 1 CEST} + {2613603600 3600 0 CET} + {2626909200 7200 1 CEST} + {2645053200 3600 0 CET} + {2658358800 7200 1 CEST} + {2676502800 3600 0 CET} + {2689808400 7200 1 CEST} + {2708557200 3600 0 CET} + {2721258000 7200 1 CEST} + {2740006800 3600 0 CET} + {2752707600 7200 1 CEST} + {2771456400 3600 0 CET} + {2784762000 7200 1 CEST} + {2802906000 3600 0 CET} + {2816211600 7200 1 CEST} + {2834355600 3600 0 CET} + {2847661200 7200 1 CEST} + {2866410000 3600 0 CET} + {2879110800 7200 1 CEST} + {2897859600 3600 0 CET} + {2910560400 7200 1 CEST} + {2929309200 3600 0 CET} + {2942010000 7200 1 CEST} + {2960758800 3600 0 CET} + {2974064400 7200 1 CEST} + {2992208400 3600 0 CET} + {3005514000 7200 1 CEST} + {3023658000 3600 0 CET} + {3036963600 7200 1 CEST} + {3055712400 3600 0 CET} + {3068413200 7200 1 CEST} + {3087162000 3600 0 CET} + {3099862800 7200 1 CEST} + {3118611600 3600 0 CET} + {3131917200 7200 1 CEST} + {3150061200 3600 0 CET} + {3163366800 7200 1 CEST} + {3181510800 3600 0 CET} + {3194816400 7200 1 CEST} + {3212960400 3600 0 CET} + {3226266000 7200 1 CEST} + {3245014800 3600 0 CET} + {3257715600 7200 1 CEST} + {3276464400 3600 0 CET} + {3289165200 7200 1 CEST} + {3307914000 3600 0 CET} + {3321219600 7200 1 CEST} + {3339363600 3600 0 CET} + {3352669200 7200 1 CEST} + {3370813200 3600 0 CET} + {3384118800 7200 1 CEST} + {3402867600 3600 0 CET} + {3415568400 7200 1 CEST} + {3434317200 3600 0 CET} + {3447018000 7200 1 CEST} + {3465766800 3600 0 CET} + {3479072400 7200 1 CEST} + {3497216400 3600 0 CET} + {3510522000 7200 1 CEST} + {3528666000 3600 0 CET} + {3541971600 7200 1 CEST} + {3560115600 3600 0 CET} + {3573421200 7200 1 CEST} + {3592170000 3600 0 CET} + {3604870800 7200 1 CEST} + {3623619600 3600 0 CET} + {3636320400 7200 1 CEST} + {3655069200 3600 0 CET} + {3668374800 7200 1 CEST} + {3686518800 3600 0 CET} + {3699824400 7200 1 CEST} + {3717968400 3600 0 CET} + {3731274000 7200 1 CEST} + {3750022800 3600 0 CET} + {3762723600 7200 1 CEST} + {3781472400 3600 0 CET} + {3794173200 7200 1 CEST} + {3812922000 3600 0 CET} + {3825622800 7200 1 CEST} + {3844371600 3600 0 CET} + {3857677200 7200 1 CEST} + {3875821200 3600 0 CET} + {3889126800 7200 1 CEST} + {3907270800 3600 0 CET} + {3920576400 7200 1 CEST} + {3939325200 3600 0 CET} + {3952026000 7200 1 CEST} + {3970774800 3600 0 CET} + {3983475600 7200 1 CEST} + {4002224400 3600 0 CET} + {4015530000 7200 1 CEST} + {4033674000 3600 0 CET} + {4046979600 7200 1 CEST} + {4065123600 3600 0 CET} + {4078429200 7200 1 CEST} + {4096573200 3600 0 CET} +} diff --git a/env/tcl/tcl8.6/tzdata/Europe/Moscow b/env/tcl/tcl8.6/tzdata/Europe/Moscow new file mode 100644 index 0000000..9b513b1 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Europe/Moscow @@ -0,0 +1,83 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Europe/Moscow) { + {-9223372036854775808 9017 0 LMT} + {-2840149817 9017 0 MMT} + {-1688265017 9079 0 MMT} + {-1656819079 12679 1 MST} + {-1641353479 9079 0 MMT} + {-1627965079 16279 1 MDST} + {-1618716679 12679 1 MST} + {-1596429079 16279 1 MDST} + {-1593820800 14400 0 MSD} + {-1589860800 10800 0 MSK} + {-1542427200 14400 1 MSD} + {-1539493200 18000 1 +05} + {-1525323600 14400 1 MSD} + {-1491188400 7200 0 EET} + {-1247536800 10800 0 MSD} + {354920400 14400 1 MSD} + {370728000 10800 0 MSK} + {386456400 14400 1 MSD} + {402264000 10800 0 MSK} + {417992400 14400 1 MSD} + {433800000 10800 0 MSK} + {449614800 14400 1 MSD} + {465346800 10800 0 MSK} + {481071600 14400 1 MSD} + {496796400 10800 0 MSK} + {512521200 14400 1 MSD} + {528246000 10800 0 MSK} + {543970800 14400 1 MSD} + {559695600 10800 0 MSK} + {575420400 14400 1 MSD} + {591145200 10800 0 MSK} + {606870000 14400 1 MSD} + {622594800 10800 0 MSK} + {638319600 14400 1 MSD} + {654649200 10800 0 MSK} + {670374000 7200 0 EEMMTT} + {670377600 10800 1 EEST} + {686102400 7200 0 EET} + {695779200 10800 0 MSD} + {701823600 14400 1 MSD} + {717548400 10800 0 MSK} + {733273200 14400 1 MSD} + {748998000 10800 0 MSK} + {764722800 14400 1 MSD} + {780447600 10800 0 MSK} + {796172400 14400 1 MSD} + {811897200 10800 0 MSK} + {828226800 14400 1 MSD} + {846370800 10800 0 MSK} + {859676400 14400 1 MSD} + {877820400 10800 0 MSK} + {891126000 14400 1 MSD} + {909270000 10800 0 MSK} + {922575600 14400 1 MSD} + {941324400 10800 0 MSK} + {954025200 14400 1 MSD} + {972774000 10800 0 MSK} + {985474800 14400 1 MSD} + {1004223600 10800 0 MSK} + {1017529200 14400 1 MSD} + {1035673200 10800 0 MSK} + {1048978800 14400 1 MSD} + {1067122800 10800 0 MSK} + {1080428400 14400 1 MSD} + {1099177200 10800 0 MSK} + {1111878000 14400 1 MSD} + {1130626800 10800 0 MSK} + {1143327600 14400 1 MSD} + {1162076400 10800 0 MSK} + {1174777200 14400 1 MSD} + {1193526000 10800 0 MSK} + {1206831600 14400 1 MSD} + {1224975600 10800 0 MSK} + {1238281200 14400 1 MSD} + {1256425200 10800 0 MSK} + {1269730800 14400 1 MSD} + {1288479600 10800 0 MSK} + {1301180400 14400 0 MSK} + {1414274400 10800 0 MSK} +} diff --git a/env/tcl/tcl8.6/tzdata/Europe/Nicosia b/env/tcl/tcl8.6/tzdata/Europe/Nicosia new file mode 100644 index 0000000..2d58355 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Europe/Nicosia @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(Asia/Nicosia)]} { + LoadTimeZoneFile Asia/Nicosia +} +set TZData(:Europe/Nicosia) $TZData(:Asia/Nicosia) diff --git a/env/tcl/tcl8.6/tzdata/Europe/Oslo b/env/tcl/tcl8.6/tzdata/Europe/Oslo new file mode 100644 index 0000000..6787c1e --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Europe/Oslo @@ -0,0 +1,271 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Europe/Oslo) { + {-9223372036854775808 2580 0 LMT} + {-2366757780 3600 0 CET} + {-1691884800 7200 1 CEST} + {-1680573600 3600 0 CET} + {-927511200 7200 0 CEST} + {-857257200 3600 0 CET} + {-844556400 7200 1 CEST} + {-828226800 3600 0 CET} + {-812502000 7200 1 CEST} + {-796777200 3600 0 CET} + {-781052400 7200 0 CEST} + {-765327600 3600 0 CET} + {-340844400 7200 1 CEST} + {-324514800 3600 0 CET} + {-308790000 7200 1 CEST} + {-293065200 3600 0 CET} + {-277340400 7200 1 CEST} + {-261615600 3600 0 CET} + {-245890800 7200 1 CEST} + {-230166000 3600 0 CET} + {-214441200 7200 1 CEST} + {-198716400 3600 0 CET} + {-182991600 7200 1 CEST} + {-166662000 3600 0 CET} + {-147913200 7200 1 CEST} + {-135212400 3600 0 CET} + {315529200 3600 0 CET} + {323830800 7200 1 CEST} + {338950800 3600 0 CET} + {354675600 7200 1 CEST} + {370400400 3600 0 CET} + {386125200 7200 1 CEST} + {401850000 3600 0 CET} + {417574800 7200 1 CEST} + {433299600 3600 0 CET} + {449024400 7200 1 CEST} + {465354000 3600 0 CET} + {481078800 7200 1 CEST} + {496803600 3600 0 CET} + {512528400 7200 1 CEST} + {528253200 3600 0 CET} + {543978000 7200 1 CEST} + {559702800 3600 0 CET} + {575427600 7200 1 CEST} + {591152400 3600 0 CET} + {606877200 7200 1 CEST} + {622602000 3600 0 CET} + {638326800 7200 1 CEST} + {654656400 3600 0 CET} + {670381200 7200 1 CEST} + {686106000 3600 0 CET} + {701830800 7200 1 CEST} + {717555600 3600 0 CET} + {733280400 7200 1 CEST} + {749005200 3600 0 CET} + {764730000 7200 1 CEST} + {780454800 3600 0 CET} + {796179600 7200 1 CEST} + {811904400 3600 0 CET} + {828234000 7200 1 CEST} + {846378000 3600 0 CET} + {859683600 7200 1 CEST} + {877827600 3600 0 CET} + {891133200 7200 1 CEST} + {909277200 3600 0 CET} + {922582800 7200 1 CEST} + {941331600 3600 0 CET} + {954032400 7200 1 CEST} + {972781200 3600 0 CET} + {985482000 7200 1 CEST} + {1004230800 3600 0 CET} + {1017536400 7200 1 CEST} + {1035680400 3600 0 CET} + {1048986000 7200 1 CEST} + {1067130000 3600 0 CET} + {1080435600 7200 1 CEST} + {1099184400 3600 0 CET} + {1111885200 7200 1 CEST} + {1130634000 3600 0 CET} + {1143334800 7200 1 CEST} + {1162083600 3600 0 CET} + {1174784400 7200 1 CEST} + {1193533200 3600 0 CET} + {1206838800 7200 1 CEST} + {1224982800 3600 0 CET} + {1238288400 7200 1 CEST} + {1256432400 3600 0 CET} + {1269738000 7200 1 CEST} + {1288486800 3600 0 CET} + {1301187600 7200 1 CEST} + {1319936400 3600 0 CET} + {1332637200 7200 1 CEST} + {1351386000 3600 0 CET} + {1364691600 7200 1 CEST} + {1382835600 3600 0 CET} + {1396141200 7200 1 CEST} + {1414285200 3600 0 CET} + {1427590800 7200 1 CEST} + {1445734800 3600 0 CET} + {1459040400 7200 1 CEST} + {1477789200 3600 0 CET} + {1490490000 7200 1 CEST} + {1509238800 3600 0 CET} + {1521939600 7200 1 CEST} + {1540688400 3600 0 CET} + {1553994000 7200 1 CEST} + {1572138000 3600 0 CET} + {1585443600 7200 1 CEST} + {1603587600 3600 0 CET} + {1616893200 7200 1 CEST} + {1635642000 3600 0 CET} + {1648342800 7200 1 CEST} + {1667091600 3600 0 CET} + {1679792400 7200 1 CEST} + {1698541200 3600 0 CET} + {1711846800 7200 1 CEST} + {1729990800 3600 0 CET} + {1743296400 7200 1 CEST} + {1761440400 3600 0 CET} + {1774746000 7200 1 CEST} + {1792890000 3600 0 CET} + {1806195600 7200 1 CEST} + {1824944400 3600 0 CET} + {1837645200 7200 1 CEST} + {1856394000 3600 0 CET} + {1869094800 7200 1 CEST} + {1887843600 3600 0 CET} + {1901149200 7200 1 CEST} + {1919293200 3600 0 CET} + {1932598800 7200 1 CEST} + {1950742800 3600 0 CET} + {1964048400 7200 1 CEST} + {1982797200 3600 0 CET} + {1995498000 7200 1 CEST} + {2014246800 3600 0 CET} + {2026947600 7200 1 CEST} + {2045696400 3600 0 CET} + {2058397200 7200 1 CEST} + {2077146000 3600 0 CET} + {2090451600 7200 1 CEST} + {2108595600 3600 0 CET} + {2121901200 7200 1 CEST} + {2140045200 3600 0 CET} + {2153350800 7200 1 CEST} + {2172099600 3600 0 CET} + {2184800400 7200 1 CEST} + {2203549200 3600 0 CET} + {2216250000 7200 1 CEST} + {2234998800 3600 0 CET} + {2248304400 7200 1 CEST} + {2266448400 3600 0 CET} + {2279754000 7200 1 CEST} + {2297898000 3600 0 CET} + {2311203600 7200 1 CEST} + {2329347600 3600 0 CET} + {2342653200 7200 1 CEST} + {2361402000 3600 0 CET} + {2374102800 7200 1 CEST} + {2392851600 3600 0 CET} + {2405552400 7200 1 CEST} + {2424301200 3600 0 CET} + {2437606800 7200 1 CEST} + {2455750800 3600 0 CET} + {2469056400 7200 1 CEST} + {2487200400 3600 0 CET} + {2500506000 7200 1 CEST} + {2519254800 3600 0 CET} + {2531955600 7200 1 CEST} + {2550704400 3600 0 CET} + {2563405200 7200 1 CEST} + {2582154000 3600 0 CET} + {2595459600 7200 1 CEST} + {2613603600 3600 0 CET} + {2626909200 7200 1 CEST} + {2645053200 3600 0 CET} + {2658358800 7200 1 CEST} + {2676502800 3600 0 CET} + {2689808400 7200 1 CEST} + {2708557200 3600 0 CET} + {2721258000 7200 1 CEST} + {2740006800 3600 0 CET} + {2752707600 7200 1 CEST} + {2771456400 3600 0 CET} + {2784762000 7200 1 CEST} + {2802906000 3600 0 CET} + {2816211600 7200 1 CEST} + {2834355600 3600 0 CET} + {2847661200 7200 1 CEST} + {2866410000 3600 0 CET} + {2879110800 7200 1 CEST} + {2897859600 3600 0 CET} + {2910560400 7200 1 CEST} + {2929309200 3600 0 CET} + {2942010000 7200 1 CEST} + {2960758800 3600 0 CET} + {2974064400 7200 1 CEST} + {2992208400 3600 0 CET} + {3005514000 7200 1 CEST} + {3023658000 3600 0 CET} + {3036963600 7200 1 CEST} + {3055712400 3600 0 CET} + {3068413200 7200 1 CEST} + {3087162000 3600 0 CET} + {3099862800 7200 1 CEST} + {3118611600 3600 0 CET} + {3131917200 7200 1 CEST} + {3150061200 3600 0 CET} + {3163366800 7200 1 CEST} + {3181510800 3600 0 CET} + {3194816400 7200 1 CEST} + {3212960400 3600 0 CET} + {3226266000 7200 1 CEST} + {3245014800 3600 0 CET} + {3257715600 7200 1 CEST} + {3276464400 3600 0 CET} + {3289165200 7200 1 CEST} + {3307914000 3600 0 CET} + {3321219600 7200 1 CEST} + {3339363600 3600 0 CET} + {3352669200 7200 1 CEST} + {3370813200 3600 0 CET} + {3384118800 7200 1 CEST} + {3402867600 3600 0 CET} + {3415568400 7200 1 CEST} + {3434317200 3600 0 CET} + {3447018000 7200 1 CEST} + {3465766800 3600 0 CET} + {3479072400 7200 1 CEST} + {3497216400 3600 0 CET} + {3510522000 7200 1 CEST} + {3528666000 3600 0 CET} + {3541971600 7200 1 CEST} + {3560115600 3600 0 CET} + {3573421200 7200 1 CEST} + {3592170000 3600 0 CET} + {3604870800 7200 1 CEST} + {3623619600 3600 0 CET} + {3636320400 7200 1 CEST} + {3655069200 3600 0 CET} + {3668374800 7200 1 CEST} + {3686518800 3600 0 CET} + {3699824400 7200 1 CEST} + {3717968400 3600 0 CET} + {3731274000 7200 1 CEST} + {3750022800 3600 0 CET} + {3762723600 7200 1 CEST} + {3781472400 3600 0 CET} + {3794173200 7200 1 CEST} + {3812922000 3600 0 CET} + {3825622800 7200 1 CEST} + {3844371600 3600 0 CET} + {3857677200 7200 1 CEST} + {3875821200 3600 0 CET} + {3889126800 7200 1 CEST} + {3907270800 3600 0 CET} + {3920576400 7200 1 CEST} + {3939325200 3600 0 CET} + {3952026000 7200 1 CEST} + {3970774800 3600 0 CET} + {3983475600 7200 1 CEST} + {4002224400 3600 0 CET} + {4015530000 7200 1 CEST} + {4033674000 3600 0 CET} + {4046979600 7200 1 CEST} + {4065123600 3600 0 CET} + {4078429200 7200 1 CEST} + {4096573200 3600 0 CET} +} diff --git a/env/tcl/tcl8.6/tzdata/Europe/Paris b/env/tcl/tcl8.6/tzdata/Europe/Paris new file mode 100644 index 0000000..4b22a09 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Europe/Paris @@ -0,0 +1,314 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Europe/Paris) { + {-9223372036854775808 561 0 LMT} + {-2486678901 561 0 PMT} + {-1855958901 0 0 WET} + {-1689814800 3600 1 WEST} + {-1680397200 0 0 WET} + {-1665363600 3600 1 WEST} + {-1648342800 0 0 WET} + {-1635123600 3600 1 WEST} + {-1616893200 0 0 WET} + {-1604278800 3600 1 WEST} + {-1585443600 0 0 WET} + {-1574038800 3600 1 WEST} + {-1552266000 0 0 WET} + {-1539997200 3600 1 WEST} + {-1520557200 0 0 WET} + {-1507510800 3600 1 WEST} + {-1490576400 0 0 WET} + {-1470618000 3600 1 WEST} + {-1459126800 0 0 WET} + {-1444006800 3600 1 WEST} + {-1427677200 0 0 WET} + {-1411952400 3600 1 WEST} + {-1396227600 0 0 WET} + {-1379293200 3600 1 WEST} + {-1364778000 0 0 WET} + {-1348448400 3600 1 WEST} + {-1333328400 0 0 WET} + {-1316394000 3600 1 WEST} + {-1301274000 0 0 WET} + {-1284339600 3600 1 WEST} + {-1269824400 0 0 WET} + {-1253494800 3600 1 WEST} + {-1238374800 0 0 WET} + {-1221440400 3600 1 WEST} + {-1206925200 0 0 WET} + {-1191200400 3600 1 WEST} + {-1175475600 0 0 WET} + {-1160355600 3600 1 WEST} + {-1143421200 0 0 WET} + {-1127696400 3600 1 WEST} + {-1111971600 0 0 WET} + {-1096851600 3600 1 WEST} + {-1080522000 0 0 WET} + {-1063587600 3600 1 WEST} + {-1049072400 0 0 WET} + {-1033347600 3600 1 WEST} + {-1017622800 0 0 WET} + {-1002502800 3600 1 WEST} + {-986173200 0 0 WET} + {-969238800 3600 1 WEST} + {-950490000 0 0 WET} + {-942012000 3600 1 WEST} + {-932436000 7200 0 CEST} + {-857257200 3600 0 CET} + {-844556400 7200 1 CEST} + {-828226800 3600 0 CET} + {-812502000 7200 1 CEST} + {-800067600 7200 0 WEMT} + {-796266000 3600 1 WEST} + {-781052400 7200 1 WEMT} + {-766616400 3600 0 CET} + {196819200 7200 1 CEST} + {212540400 3600 0 CET} + {220921200 3600 0 CET} + {228877200 7200 1 CEST} + {243997200 3600 0 CET} + {260326800 7200 1 CEST} + {276051600 3600 0 CET} + {291776400 7200 1 CEST} + {307501200 3600 0 CET} + {323830800 7200 1 CEST} + {338950800 3600 0 CET} + {354675600 7200 1 CEST} + {370400400 3600 0 CET} + {386125200 7200 1 CEST} + {401850000 3600 0 CET} + {417574800 7200 1 CEST} + {433299600 3600 0 CET} + {449024400 7200 1 CEST} + {465354000 3600 0 CET} + {481078800 7200 1 CEST} + {496803600 3600 0 CET} + {512528400 7200 1 CEST} + {528253200 3600 0 CET} + {543978000 7200 1 CEST} + {559702800 3600 0 CET} + {575427600 7200 1 CEST} + {591152400 3600 0 CET} + {606877200 7200 1 CEST} + {622602000 3600 0 CET} + {638326800 7200 1 CEST} + {654656400 3600 0 CET} + {670381200 7200 1 CEST} + {686106000 3600 0 CET} + {701830800 7200 1 CEST} + {717555600 3600 0 CET} + {733280400 7200 1 CEST} + {749005200 3600 0 CET} + {764730000 7200 1 CEST} + {780454800 3600 0 CET} + {796179600 7200 1 CEST} + {811904400 3600 0 CET} + {828234000 7200 1 CEST} + {846378000 3600 0 CET} + {859683600 7200 1 CEST} + {877827600 3600 0 CET} + {891133200 7200 1 CEST} + {909277200 3600 0 CET} + {922582800 7200 1 CEST} + {941331600 3600 0 CET} + {954032400 7200 1 CEST} + {972781200 3600 0 CET} + {985482000 7200 1 CEST} + {1004230800 3600 0 CET} + {1017536400 7200 1 CEST} + {1035680400 3600 0 CET} + {1048986000 7200 1 CEST} + {1067130000 3600 0 CET} + {1080435600 7200 1 CEST} + {1099184400 3600 0 CET} + {1111885200 7200 1 CEST} + {1130634000 3600 0 CET} + {1143334800 7200 1 CEST} + {1162083600 3600 0 CET} + {1174784400 7200 1 CEST} + {1193533200 3600 0 CET} + {1206838800 7200 1 CEST} + {1224982800 3600 0 CET} + {1238288400 7200 1 CEST} + {1256432400 3600 0 CET} + {1269738000 7200 1 CEST} + {1288486800 3600 0 CET} + {1301187600 7200 1 CEST} + {1319936400 3600 0 CET} + {1332637200 7200 1 CEST} + {1351386000 3600 0 CET} + {1364691600 7200 1 CEST} + {1382835600 3600 0 CET} + {1396141200 7200 1 CEST} + {1414285200 3600 0 CET} + {1427590800 7200 1 CEST} + {1445734800 3600 0 CET} + {1459040400 7200 1 CEST} + {1477789200 3600 0 CET} + {1490490000 7200 1 CEST} + {1509238800 3600 0 CET} + {1521939600 7200 1 CEST} + {1540688400 3600 0 CET} + {1553994000 7200 1 CEST} + {1572138000 3600 0 CET} + {1585443600 7200 1 CEST} + {1603587600 3600 0 CET} + {1616893200 7200 1 CEST} + {1635642000 3600 0 CET} + {1648342800 7200 1 CEST} + {1667091600 3600 0 CET} + {1679792400 7200 1 CEST} + {1698541200 3600 0 CET} + {1711846800 7200 1 CEST} + {1729990800 3600 0 CET} + {1743296400 7200 1 CEST} + {1761440400 3600 0 CET} + {1774746000 7200 1 CEST} + {1792890000 3600 0 CET} + {1806195600 7200 1 CEST} + {1824944400 3600 0 CET} + {1837645200 7200 1 CEST} + {1856394000 3600 0 CET} + {1869094800 7200 1 CEST} + {1887843600 3600 0 CET} + {1901149200 7200 1 CEST} + {1919293200 3600 0 CET} + {1932598800 7200 1 CEST} + {1950742800 3600 0 CET} + {1964048400 7200 1 CEST} + {1982797200 3600 0 CET} + {1995498000 7200 1 CEST} + {2014246800 3600 0 CET} + {2026947600 7200 1 CEST} + {2045696400 3600 0 CET} + {2058397200 7200 1 CEST} + {2077146000 3600 0 CET} + {2090451600 7200 1 CEST} + {2108595600 3600 0 CET} + {2121901200 7200 1 CEST} + {2140045200 3600 0 CET} + {2153350800 7200 1 CEST} + {2172099600 3600 0 CET} + {2184800400 7200 1 CEST} + {2203549200 3600 0 CET} + {2216250000 7200 1 CEST} + {2234998800 3600 0 CET} + {2248304400 7200 1 CEST} + {2266448400 3600 0 CET} + {2279754000 7200 1 CEST} + {2297898000 3600 0 CET} + {2311203600 7200 1 CEST} + {2329347600 3600 0 CET} + {2342653200 7200 1 CEST} + {2361402000 3600 0 CET} + {2374102800 7200 1 CEST} + {2392851600 3600 0 CET} + {2405552400 7200 1 CEST} + {2424301200 3600 0 CET} + {2437606800 7200 1 CEST} + {2455750800 3600 0 CET} + {2469056400 7200 1 CEST} + {2487200400 3600 0 CET} + {2500506000 7200 1 CEST} + {2519254800 3600 0 CET} + {2531955600 7200 1 CEST} + {2550704400 3600 0 CET} + {2563405200 7200 1 CEST} + {2582154000 3600 0 CET} + {2595459600 7200 1 CEST} + {2613603600 3600 0 CET} + {2626909200 7200 1 CEST} + {2645053200 3600 0 CET} + {2658358800 7200 1 CEST} + {2676502800 3600 0 CET} + {2689808400 7200 1 CEST} + {2708557200 3600 0 CET} + {2721258000 7200 1 CEST} + {2740006800 3600 0 CET} + {2752707600 7200 1 CEST} + {2771456400 3600 0 CET} + {2784762000 7200 1 CEST} + {2802906000 3600 0 CET} + {2816211600 7200 1 CEST} + {2834355600 3600 0 CET} + {2847661200 7200 1 CEST} + {2866410000 3600 0 CET} + {2879110800 7200 1 CEST} + {2897859600 3600 0 CET} + {2910560400 7200 1 CEST} + {2929309200 3600 0 CET} + {2942010000 7200 1 CEST} + {2960758800 3600 0 CET} + {2974064400 7200 1 CEST} + {2992208400 3600 0 CET} + {3005514000 7200 1 CEST} + {3023658000 3600 0 CET} + {3036963600 7200 1 CEST} + {3055712400 3600 0 CET} + {3068413200 7200 1 CEST} + {3087162000 3600 0 CET} + {3099862800 7200 1 CEST} + {3118611600 3600 0 CET} + {3131917200 7200 1 CEST} + {3150061200 3600 0 CET} + {3163366800 7200 1 CEST} + {3181510800 3600 0 CET} + {3194816400 7200 1 CEST} + {3212960400 3600 0 CET} + {3226266000 7200 1 CEST} + {3245014800 3600 0 CET} + {3257715600 7200 1 CEST} + {3276464400 3600 0 CET} + {3289165200 7200 1 CEST} + {3307914000 3600 0 CET} + {3321219600 7200 1 CEST} + {3339363600 3600 0 CET} + {3352669200 7200 1 CEST} + {3370813200 3600 0 CET} + {3384118800 7200 1 CEST} + {3402867600 3600 0 CET} + {3415568400 7200 1 CEST} + {3434317200 3600 0 CET} + {3447018000 7200 1 CEST} + {3465766800 3600 0 CET} + {3479072400 7200 1 CEST} + {3497216400 3600 0 CET} + {3510522000 7200 1 CEST} + {3528666000 3600 0 CET} + {3541971600 7200 1 CEST} + {3560115600 3600 0 CET} + {3573421200 7200 1 CEST} + {3592170000 3600 0 CET} + {3604870800 7200 1 CEST} + {3623619600 3600 0 CET} + {3636320400 7200 1 CEST} + {3655069200 3600 0 CET} + {3668374800 7200 1 CEST} + {3686518800 3600 0 CET} + {3699824400 7200 1 CEST} + {3717968400 3600 0 CET} + {3731274000 7200 1 CEST} + {3750022800 3600 0 CET} + {3762723600 7200 1 CEST} + {3781472400 3600 0 CET} + {3794173200 7200 1 CEST} + {3812922000 3600 0 CET} + {3825622800 7200 1 CEST} + {3844371600 3600 0 CET} + {3857677200 7200 1 CEST} + {3875821200 3600 0 CET} + {3889126800 7200 1 CEST} + {3907270800 3600 0 CET} + {3920576400 7200 1 CEST} + {3939325200 3600 0 CET} + {3952026000 7200 1 CEST} + {3970774800 3600 0 CET} + {3983475600 7200 1 CEST} + {4002224400 3600 0 CET} + {4015530000 7200 1 CEST} + {4033674000 3600 0 CET} + {4046979600 7200 1 CEST} + {4065123600 3600 0 CET} + {4078429200 7200 1 CEST} + {4096573200 3600 0 CET} +} diff --git a/env/tcl/tcl8.6/tzdata/Europe/Podgorica b/env/tcl/tcl8.6/tzdata/Europe/Podgorica new file mode 100644 index 0000000..f4f9066 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Europe/Podgorica @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(Europe/Belgrade)]} { + LoadTimeZoneFile Europe/Belgrade +} +set TZData(:Europe/Podgorica) $TZData(:Europe/Belgrade) diff --git a/env/tcl/tcl8.6/tzdata/Europe/Prague b/env/tcl/tcl8.6/tzdata/Europe/Prague new file mode 100644 index 0000000..34df8ed --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Europe/Prague @@ -0,0 +1,275 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Europe/Prague) { + {-9223372036854775808 3464 0 LMT} + {-3786829064 3464 0 PMT} + {-2469401864 3600 0 CET} + {-1693706400 7200 1 CEST} + {-1680483600 3600 0 CET} + {-1663455600 7200 1 CEST} + {-1650150000 3600 0 CET} + {-1632006000 7200 1 CEST} + {-1618700400 3600 0 CET} + {-938905200 7200 1 CEST} + {-857257200 3600 0 CET} + {-844556400 7200 1 CEST} + {-828226800 3600 0 CET} + {-812502000 7200 1 CEST} + {-796777200 3600 0 CET} + {-781052400 7200 1 CEST} + {-777862800 7200 0 CEST} + {-765327600 3600 0 CET} + {-746578800 7200 1 CEST} + {-733359600 3600 0 CET} + {-728517600 0 1 GMT} + {-721260000 0 0 CET} + {-716425200 7200 1 CEST} + {-701910000 3600 0 CET} + {-684975600 7200 1 CEST} + {-670460400 3600 0 CET} + {-654217200 7200 1 CEST} + {-639010800 3600 0 CET} + {283993200 3600 0 CET} + {291776400 7200 1 CEST} + {307501200 3600 0 CET} + {323830800 7200 1 CEST} + {338950800 3600 0 CET} + {354675600 7200 1 CEST} + {370400400 3600 0 CET} + {386125200 7200 1 CEST} + {401850000 3600 0 CET} + {417574800 7200 1 CEST} + {433299600 3600 0 CET} + {449024400 7200 1 CEST} + {465354000 3600 0 CET} + {481078800 7200 1 CEST} + {496803600 3600 0 CET} + {512528400 7200 1 CEST} + {528253200 3600 0 CET} + {543978000 7200 1 CEST} + {559702800 3600 0 CET} + {575427600 7200 1 CEST} + {591152400 3600 0 CET} + {606877200 7200 1 CEST} + {622602000 3600 0 CET} + {638326800 7200 1 CEST} + {654656400 3600 0 CET} + {670381200 7200 1 CEST} + {686106000 3600 0 CET} + {701830800 7200 1 CEST} + {717555600 3600 0 CET} + {733280400 7200 1 CEST} + {749005200 3600 0 CET} + {764730000 7200 1 CEST} + {780454800 3600 0 CET} + {796179600 7200 1 CEST} + {811904400 3600 0 CET} + {828234000 7200 1 CEST} + {846378000 3600 0 CET} + {859683600 7200 1 CEST} + {877827600 3600 0 CET} + {891133200 7200 1 CEST} + {909277200 3600 0 CET} + {922582800 7200 1 CEST} + {941331600 3600 0 CET} + {954032400 7200 1 CEST} + {972781200 3600 0 CET} + {985482000 7200 1 CEST} + {1004230800 3600 0 CET} + {1017536400 7200 1 CEST} + {1035680400 3600 0 CET} + {1048986000 7200 1 CEST} + {1067130000 3600 0 CET} + {1080435600 7200 1 CEST} + {1099184400 3600 0 CET} + {1111885200 7200 1 CEST} + {1130634000 3600 0 CET} + {1143334800 7200 1 CEST} + {1162083600 3600 0 CET} + {1174784400 7200 1 CEST} + {1193533200 3600 0 CET} + {1206838800 7200 1 CEST} + {1224982800 3600 0 CET} + {1238288400 7200 1 CEST} + {1256432400 3600 0 CET} + {1269738000 7200 1 CEST} + {1288486800 3600 0 CET} + {1301187600 7200 1 CEST} + {1319936400 3600 0 CET} + {1332637200 7200 1 CEST} + {1351386000 3600 0 CET} + {1364691600 7200 1 CEST} + {1382835600 3600 0 CET} + {1396141200 7200 1 CEST} + {1414285200 3600 0 CET} + {1427590800 7200 1 CEST} + {1445734800 3600 0 CET} + {1459040400 7200 1 CEST} + {1477789200 3600 0 CET} + {1490490000 7200 1 CEST} + {1509238800 3600 0 CET} + {1521939600 7200 1 CEST} + {1540688400 3600 0 CET} + {1553994000 7200 1 CEST} + {1572138000 3600 0 CET} + {1585443600 7200 1 CEST} + {1603587600 3600 0 CET} + {1616893200 7200 1 CEST} + {1635642000 3600 0 CET} + {1648342800 7200 1 CEST} + {1667091600 3600 0 CET} + {1679792400 7200 1 CEST} + {1698541200 3600 0 CET} + {1711846800 7200 1 CEST} + {1729990800 3600 0 CET} + {1743296400 7200 1 CEST} + {1761440400 3600 0 CET} + {1774746000 7200 1 CEST} + {1792890000 3600 0 CET} + {1806195600 7200 1 CEST} + {1824944400 3600 0 CET} + {1837645200 7200 1 CEST} + {1856394000 3600 0 CET} + {1869094800 7200 1 CEST} + {1887843600 3600 0 CET} + {1901149200 7200 1 CEST} + {1919293200 3600 0 CET} + {1932598800 7200 1 CEST} + {1950742800 3600 0 CET} + {1964048400 7200 1 CEST} + {1982797200 3600 0 CET} + {1995498000 7200 1 CEST} + {2014246800 3600 0 CET} + {2026947600 7200 1 CEST} + {2045696400 3600 0 CET} + {2058397200 7200 1 CEST} + {2077146000 3600 0 CET} + {2090451600 7200 1 CEST} + {2108595600 3600 0 CET} + {2121901200 7200 1 CEST} + {2140045200 3600 0 CET} + {2153350800 7200 1 CEST} + {2172099600 3600 0 CET} + {2184800400 7200 1 CEST} + {2203549200 3600 0 CET} + {2216250000 7200 1 CEST} + {2234998800 3600 0 CET} + {2248304400 7200 1 CEST} + {2266448400 3600 0 CET} + {2279754000 7200 1 CEST} + {2297898000 3600 0 CET} + {2311203600 7200 1 CEST} + {2329347600 3600 0 CET} + {2342653200 7200 1 CEST} + {2361402000 3600 0 CET} + {2374102800 7200 1 CEST} + {2392851600 3600 0 CET} + {2405552400 7200 1 CEST} + {2424301200 3600 0 CET} + {2437606800 7200 1 CEST} + {2455750800 3600 0 CET} + {2469056400 7200 1 CEST} + {2487200400 3600 0 CET} + {2500506000 7200 1 CEST} + {2519254800 3600 0 CET} + {2531955600 7200 1 CEST} + {2550704400 3600 0 CET} + {2563405200 7200 1 CEST} + {2582154000 3600 0 CET} + {2595459600 7200 1 CEST} + {2613603600 3600 0 CET} + {2626909200 7200 1 CEST} + {2645053200 3600 0 CET} + {2658358800 7200 1 CEST} + {2676502800 3600 0 CET} + {2689808400 7200 1 CEST} + {2708557200 3600 0 CET} + {2721258000 7200 1 CEST} + {2740006800 3600 0 CET} + {2752707600 7200 1 CEST} + {2771456400 3600 0 CET} + {2784762000 7200 1 CEST} + {2802906000 3600 0 CET} + {2816211600 7200 1 CEST} + {2834355600 3600 0 CET} + {2847661200 7200 1 CEST} + {2866410000 3600 0 CET} + {2879110800 7200 1 CEST} + {2897859600 3600 0 CET} + {2910560400 7200 1 CEST} + {2929309200 3600 0 CET} + {2942010000 7200 1 CEST} + {2960758800 3600 0 CET} + {2974064400 7200 1 CEST} + {2992208400 3600 0 CET} + {3005514000 7200 1 CEST} + {3023658000 3600 0 CET} + {3036963600 7200 1 CEST} + {3055712400 3600 0 CET} + {3068413200 7200 1 CEST} + {3087162000 3600 0 CET} + {3099862800 7200 1 CEST} + {3118611600 3600 0 CET} + {3131917200 7200 1 CEST} + {3150061200 3600 0 CET} + {3163366800 7200 1 CEST} + {3181510800 3600 0 CET} + {3194816400 7200 1 CEST} + {3212960400 3600 0 CET} + {3226266000 7200 1 CEST} + {3245014800 3600 0 CET} + {3257715600 7200 1 CEST} + {3276464400 3600 0 CET} + {3289165200 7200 1 CEST} + {3307914000 3600 0 CET} + {3321219600 7200 1 CEST} + {3339363600 3600 0 CET} + {3352669200 7200 1 CEST} + {3370813200 3600 0 CET} + {3384118800 7200 1 CEST} + {3402867600 3600 0 CET} + {3415568400 7200 1 CEST} + {3434317200 3600 0 CET} + {3447018000 7200 1 CEST} + {3465766800 3600 0 CET} + {3479072400 7200 1 CEST} + {3497216400 3600 0 CET} + {3510522000 7200 1 CEST} + {3528666000 3600 0 CET} + {3541971600 7200 1 CEST} + {3560115600 3600 0 CET} + {3573421200 7200 1 CEST} + {3592170000 3600 0 CET} + {3604870800 7200 1 CEST} + {3623619600 3600 0 CET} + {3636320400 7200 1 CEST} + {3655069200 3600 0 CET} + {3668374800 7200 1 CEST} + {3686518800 3600 0 CET} + {3699824400 7200 1 CEST} + {3717968400 3600 0 CET} + {3731274000 7200 1 CEST} + {3750022800 3600 0 CET} + {3762723600 7200 1 CEST} + {3781472400 3600 0 CET} + {3794173200 7200 1 CEST} + {3812922000 3600 0 CET} + {3825622800 7200 1 CEST} + {3844371600 3600 0 CET} + {3857677200 7200 1 CEST} + {3875821200 3600 0 CET} + {3889126800 7200 1 CEST} + {3907270800 3600 0 CET} + {3920576400 7200 1 CEST} + {3939325200 3600 0 CET} + {3952026000 7200 1 CEST} + {3970774800 3600 0 CET} + {3983475600 7200 1 CEST} + {4002224400 3600 0 CET} + {4015530000 7200 1 CEST} + {4033674000 3600 0 CET} + {4046979600 7200 1 CEST} + {4065123600 3600 0 CET} + {4078429200 7200 1 CEST} + {4096573200 3600 0 CET} +} diff --git a/env/tcl/tcl8.6/tzdata/Europe/Riga b/env/tcl/tcl8.6/tzdata/Europe/Riga new file mode 100644 index 0000000..c829ffb --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Europe/Riga @@ -0,0 +1,258 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Europe/Riga) { + {-9223372036854775808 5794 0 LMT} + {-2840146594 5794 0 RMT} + {-1632008194 9394 1 LST} + {-1618702594 5794 0 RMT} + {-1601681794 9394 1 LST} + {-1597275394 5794 0 RMT} + {-1377308194 7200 0 EET} + {-928029600 10800 0 MSK} + {-899521200 3600 0 CET} + {-857257200 3600 0 CET} + {-844556400 7200 1 CEST} + {-828226800 3600 0 CET} + {-812502000 7200 1 CEST} + {-796777200 3600 0 CET} + {-795834000 10800 0 MSD} + {354920400 14400 1 MSD} + {370728000 10800 0 MSK} + {386456400 14400 1 MSD} + {402264000 10800 0 MSK} + {417992400 14400 1 MSD} + {433800000 10800 0 MSK} + {449614800 14400 1 MSD} + {465346800 10800 0 MSK} + {481071600 14400 1 MSD} + {496796400 10800 0 MSK} + {512521200 14400 1 MSD} + {528246000 10800 0 MSK} + {543970800 14400 1 MSD} + {559695600 10800 0 MSK} + {575420400 14400 1 MSD} + {591145200 10800 0 MSK} + {606870000 10800 1 EEST} + {622598400 7200 0 EET} + {638323200 10800 1 EEST} + {654652800 7200 0 EET} + {670377600 10800 1 EEST} + {686102400 7200 0 EET} + {701827200 10800 1 EEST} + {717552000 7200 0 EET} + {733276800 10800 1 EEST} + {749001600 7200 0 EET} + {764726400 10800 1 EEST} + {780451200 7200 0 EET} + {796176000 10800 1 EEST} + {811900800 7200 0 EET} + {828230400 10800 1 EEST} + {843955200 7200 0 EET} + {853797600 7200 0 EET} + {859683600 10800 1 EEST} + {877827600 7200 0 EET} + {891133200 10800 1 EEST} + {909277200 7200 0 EET} + {922582800 10800 1 EEST} + {941331600 7200 0 EET} + {951775200 7200 0 EET} + {978386400 7200 0 EET} + {985482000 10800 1 EEST} + {1004230800 7200 0 EET} + {1017536400 10800 1 EEST} + {1035680400 7200 0 EET} + {1048986000 10800 1 EEST} + {1067130000 7200 0 EET} + {1080435600 10800 1 EEST} + {1099184400 7200 0 EET} + {1111885200 10800 1 EEST} + {1130634000 7200 0 EET} + {1143334800 10800 1 EEST} + {1162083600 7200 0 EET} + {1174784400 10800 1 EEST} + {1193533200 7200 0 EET} + {1206838800 10800 1 EEST} + {1224982800 7200 0 EET} + {1238288400 10800 1 EEST} + {1256432400 7200 0 EET} + {1269738000 10800 1 EEST} + {1288486800 7200 0 EET} + {1301187600 10800 1 EEST} + {1319936400 7200 0 EET} + {1332637200 10800 1 EEST} + {1351386000 7200 0 EET} + {1364691600 10800 1 EEST} + {1382835600 7200 0 EET} + {1396141200 10800 1 EEST} + {1414285200 7200 0 EET} + {1427590800 10800 1 EEST} + {1445734800 7200 0 EET} + {1459040400 10800 1 EEST} + {1477789200 7200 0 EET} + {1490490000 10800 1 EEST} + {1509238800 7200 0 EET} + {1521939600 10800 1 EEST} + {1540688400 7200 0 EET} + {1553994000 10800 1 EEST} + {1572138000 7200 0 EET} + {1585443600 10800 1 EEST} + {1603587600 7200 0 EET} + {1616893200 10800 1 EEST} + {1635642000 7200 0 EET} + {1648342800 10800 1 EEST} + {1667091600 7200 0 EET} + {1679792400 10800 1 EEST} + {1698541200 7200 0 EET} + {1711846800 10800 1 EEST} + {1729990800 7200 0 EET} + {1743296400 10800 1 EEST} + {1761440400 7200 0 EET} + {1774746000 10800 1 EEST} + {1792890000 7200 0 EET} + {1806195600 10800 1 EEST} + {1824944400 7200 0 EET} + {1837645200 10800 1 EEST} + {1856394000 7200 0 EET} + {1869094800 10800 1 EEST} + {1887843600 7200 0 EET} + {1901149200 10800 1 EEST} + {1919293200 7200 0 EET} + {1932598800 10800 1 EEST} + {1950742800 7200 0 EET} + {1964048400 10800 1 EEST} + {1982797200 7200 0 EET} + {1995498000 10800 1 EEST} + {2014246800 7200 0 EET} + {2026947600 10800 1 EEST} + {2045696400 7200 0 EET} + {2058397200 10800 1 EEST} + {2077146000 7200 0 EET} + {2090451600 10800 1 EEST} + {2108595600 7200 0 EET} + {2121901200 10800 1 EEST} + {2140045200 7200 0 EET} + {2153350800 10800 1 EEST} + {2172099600 7200 0 EET} + {2184800400 10800 1 EEST} + {2203549200 7200 0 EET} + {2216250000 10800 1 EEST} + {2234998800 7200 0 EET} + {2248304400 10800 1 EEST} + {2266448400 7200 0 EET} + {2279754000 10800 1 EEST} + {2297898000 7200 0 EET} + {2311203600 10800 1 EEST} + {2329347600 7200 0 EET} + {2342653200 10800 1 EEST} + {2361402000 7200 0 EET} + {2374102800 10800 1 EEST} + {2392851600 7200 0 EET} + {2405552400 10800 1 EEST} + {2424301200 7200 0 EET} + {2437606800 10800 1 EEST} + {2455750800 7200 0 EET} + {2469056400 10800 1 EEST} + {2487200400 7200 0 EET} + {2500506000 10800 1 EEST} + {2519254800 7200 0 EET} + {2531955600 10800 1 EEST} + {2550704400 7200 0 EET} + {2563405200 10800 1 EEST} + {2582154000 7200 0 EET} + {2595459600 10800 1 EEST} + {2613603600 7200 0 EET} + {2626909200 10800 1 EEST} + {2645053200 7200 0 EET} + {2658358800 10800 1 EEST} + {2676502800 7200 0 EET} + {2689808400 10800 1 EEST} + {2708557200 7200 0 EET} + {2721258000 10800 1 EEST} + {2740006800 7200 0 EET} + {2752707600 10800 1 EEST} + {2771456400 7200 0 EET} + {2784762000 10800 1 EEST} + {2802906000 7200 0 EET} + {2816211600 10800 1 EEST} + {2834355600 7200 0 EET} + {2847661200 10800 1 EEST} + {2866410000 7200 0 EET} + {2879110800 10800 1 EEST} + {2897859600 7200 0 EET} + {2910560400 10800 1 EEST} + {2929309200 7200 0 EET} + {2942010000 10800 1 EEST} + {2960758800 7200 0 EET} + {2974064400 10800 1 EEST} + {2992208400 7200 0 EET} + {3005514000 10800 1 EEST} + {3023658000 7200 0 EET} + {3036963600 10800 1 EEST} + {3055712400 7200 0 EET} + {3068413200 10800 1 EEST} + {3087162000 7200 0 EET} + {3099862800 10800 1 EEST} + {3118611600 7200 0 EET} + {3131917200 10800 1 EEST} + {3150061200 7200 0 EET} + {3163366800 10800 1 EEST} + {3181510800 7200 0 EET} + {3194816400 10800 1 EEST} + {3212960400 7200 0 EET} + {3226266000 10800 1 EEST} + {3245014800 7200 0 EET} + {3257715600 10800 1 EEST} + {3276464400 7200 0 EET} + {3289165200 10800 1 EEST} + {3307914000 7200 0 EET} + {3321219600 10800 1 EEST} + {3339363600 7200 0 EET} + {3352669200 10800 1 EEST} + {3370813200 7200 0 EET} + {3384118800 10800 1 EEST} + {3402867600 7200 0 EET} + {3415568400 10800 1 EEST} + {3434317200 7200 0 EET} + {3447018000 10800 1 EEST} + {3465766800 7200 0 EET} + {3479072400 10800 1 EEST} + {3497216400 7200 0 EET} + {3510522000 10800 1 EEST} + {3528666000 7200 0 EET} + {3541971600 10800 1 EEST} + {3560115600 7200 0 EET} + {3573421200 10800 1 EEST} + {3592170000 7200 0 EET} + {3604870800 10800 1 EEST} + {3623619600 7200 0 EET} + {3636320400 10800 1 EEST} + {3655069200 7200 0 EET} + {3668374800 10800 1 EEST} + {3686518800 7200 0 EET} + {3699824400 10800 1 EEST} + {3717968400 7200 0 EET} + {3731274000 10800 1 EEST} + {3750022800 7200 0 EET} + {3762723600 10800 1 EEST} + {3781472400 7200 0 EET} + {3794173200 10800 1 EEST} + {3812922000 7200 0 EET} + {3825622800 10800 1 EEST} + {3844371600 7200 0 EET} + {3857677200 10800 1 EEST} + {3875821200 7200 0 EET} + {3889126800 10800 1 EEST} + {3907270800 7200 0 EET} + {3920576400 10800 1 EEST} + {3939325200 7200 0 EET} + {3952026000 10800 1 EEST} + {3970774800 7200 0 EET} + {3983475600 10800 1 EEST} + {4002224400 7200 0 EET} + {4015530000 10800 1 EEST} + {4033674000 7200 0 EET} + {4046979600 10800 1 EEST} + {4065123600 7200 0 EET} + {4078429200 10800 1 EEST} + {4096573200 7200 0 EET} +} diff --git a/env/tcl/tcl8.6/tzdata/Europe/Rome b/env/tcl/tcl8.6/tzdata/Europe/Rome new file mode 100644 index 0000000..f53340c --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Europe/Rome @@ -0,0 +1,302 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Europe/Rome) { + {-9223372036854775808 2996 0 LMT} + {-3259097396 2996 0 RMT} + {-2403565200 3600 0 CET} + {-1690765200 7200 1 CEST} + {-1680487200 3600 0 CET} + {-1664758800 7200 1 CEST} + {-1648951200 3600 0 CET} + {-1635123600 7200 1 CEST} + {-1616896800 3600 0 CET} + {-1604278800 7200 1 CEST} + {-1585533600 3600 0 CET} + {-1571014800 7200 1 CEST} + {-1555293600 3600 0 CET} + {-932432400 7200 1 CEST} + {-857257200 3600 0 CET} + {-844556400 7200 1 CEST} + {-830307600 7200 0 CEST} + {-828226800 3600 0 CET} + {-812502000 7200 1 CEST} + {-807152400 7200 0 CEST} + {-798073200 3600 0 CET} + {-781052400 7200 1 CEST} + {-766717200 3600 0 CET} + {-750898800 7200 1 CEST} + {-733359600 3600 0 CET} + {-719456400 7200 1 CEST} + {-701917200 3600 0 CET} + {-689209200 7200 1 CEST} + {-670460400 3600 0 CET} + {-114051600 7200 1 CEST} + {-103168800 3600 0 CET} + {-81997200 7200 1 CEST} + {-71715600 3600 0 CET} + {-50547600 7200 1 CEST} + {-40266000 3600 0 CET} + {-18493200 7200 1 CEST} + {-8211600 3600 0 CET} + {12956400 7200 1 CEST} + {23238000 3600 0 CET} + {43801200 7200 1 CEST} + {54687600 3600 0 CET} + {75855600 7200 1 CEST} + {86742000 3600 0 CET} + {107910000 7200 1 CEST} + {118191600 3600 0 CET} + {138754800 7200 1 CEST} + {149641200 3600 0 CET} + {170809200 7200 1 CEST} + {181090800 3600 0 CET} + {202258800 7200 1 CEST} + {212540400 3600 0 CET} + {233103600 7200 1 CEST} + {243990000 3600 0 CET} + {265158000 7200 1 CEST} + {276044400 3600 0 CET} + {296607600 7200 1 CEST} + {307494000 3600 0 CET} + {315529200 3600 0 CET} + {323830800 7200 1 CEST} + {338950800 3600 0 CET} + {354675600 7200 1 CEST} + {370400400 3600 0 CET} + {386125200 7200 1 CEST} + {401850000 3600 0 CET} + {417574800 7200 1 CEST} + {433299600 3600 0 CET} + {449024400 7200 1 CEST} + {465354000 3600 0 CET} + {481078800 7200 1 CEST} + {496803600 3600 0 CET} + {512528400 7200 1 CEST} + {528253200 3600 0 CET} + {543978000 7200 1 CEST} + {559702800 3600 0 CET} + {575427600 7200 1 CEST} + {591152400 3600 0 CET} + {606877200 7200 1 CEST} + {622602000 3600 0 CET} + {638326800 7200 1 CEST} + {654656400 3600 0 CET} + {670381200 7200 1 CEST} + {686106000 3600 0 CET} + {701830800 7200 1 CEST} + {717555600 3600 0 CET} + {733280400 7200 1 CEST} + {749005200 3600 0 CET} + {764730000 7200 1 CEST} + {780454800 3600 0 CET} + {796179600 7200 1 CEST} + {811904400 3600 0 CET} + {828234000 7200 1 CEST} + {846378000 3600 0 CET} + {859683600 7200 1 CEST} + {877827600 3600 0 CET} + {891133200 7200 1 CEST} + {909277200 3600 0 CET} + {922582800 7200 1 CEST} + {941331600 3600 0 CET} + {954032400 7200 1 CEST} + {972781200 3600 0 CET} + {985482000 7200 1 CEST} + {1004230800 3600 0 CET} + {1017536400 7200 1 CEST} + {1035680400 3600 0 CET} + {1048986000 7200 1 CEST} + {1067130000 3600 0 CET} + {1080435600 7200 1 CEST} + {1099184400 3600 0 CET} + {1111885200 7200 1 CEST} + {1130634000 3600 0 CET} + {1143334800 7200 1 CEST} + {1162083600 3600 0 CET} + {1174784400 7200 1 CEST} + {1193533200 3600 0 CET} + {1206838800 7200 1 CEST} + {1224982800 3600 0 CET} + {1238288400 7200 1 CEST} + {1256432400 3600 0 CET} + {1269738000 7200 1 CEST} + {1288486800 3600 0 CET} + {1301187600 7200 1 CEST} + {1319936400 3600 0 CET} + {1332637200 7200 1 CEST} + {1351386000 3600 0 CET} + {1364691600 7200 1 CEST} + {1382835600 3600 0 CET} + {1396141200 7200 1 CEST} + {1414285200 3600 0 CET} + {1427590800 7200 1 CEST} + {1445734800 3600 0 CET} + {1459040400 7200 1 CEST} + {1477789200 3600 0 CET} + {1490490000 7200 1 CEST} + {1509238800 3600 0 CET} + {1521939600 7200 1 CEST} + {1540688400 3600 0 CET} + {1553994000 7200 1 CEST} + {1572138000 3600 0 CET} + {1585443600 7200 1 CEST} + {1603587600 3600 0 CET} + {1616893200 7200 1 CEST} + {1635642000 3600 0 CET} + {1648342800 7200 1 CEST} + {1667091600 3600 0 CET} + {1679792400 7200 1 CEST} + {1698541200 3600 0 CET} + {1711846800 7200 1 CEST} + {1729990800 3600 0 CET} + {1743296400 7200 1 CEST} + {1761440400 3600 0 CET} + {1774746000 7200 1 CEST} + {1792890000 3600 0 CET} + {1806195600 7200 1 CEST} + {1824944400 3600 0 CET} + {1837645200 7200 1 CEST} + {1856394000 3600 0 CET} + {1869094800 7200 1 CEST} + {1887843600 3600 0 CET} + {1901149200 7200 1 CEST} + {1919293200 3600 0 CET} + {1932598800 7200 1 CEST} + {1950742800 3600 0 CET} + {1964048400 7200 1 CEST} + {1982797200 3600 0 CET} + {1995498000 7200 1 CEST} + {2014246800 3600 0 CET} + {2026947600 7200 1 CEST} + {2045696400 3600 0 CET} + {2058397200 7200 1 CEST} + {2077146000 3600 0 CET} + {2090451600 7200 1 CEST} + {2108595600 3600 0 CET} + {2121901200 7200 1 CEST} + {2140045200 3600 0 CET} + {2153350800 7200 1 CEST} + {2172099600 3600 0 CET} + {2184800400 7200 1 CEST} + {2203549200 3600 0 CET} + {2216250000 7200 1 CEST} + {2234998800 3600 0 CET} + {2248304400 7200 1 CEST} + {2266448400 3600 0 CET} + {2279754000 7200 1 CEST} + {2297898000 3600 0 CET} + {2311203600 7200 1 CEST} + {2329347600 3600 0 CET} + {2342653200 7200 1 CEST} + {2361402000 3600 0 CET} + {2374102800 7200 1 CEST} + {2392851600 3600 0 CET} + {2405552400 7200 1 CEST} + {2424301200 3600 0 CET} + {2437606800 7200 1 CEST} + {2455750800 3600 0 CET} + {2469056400 7200 1 CEST} + {2487200400 3600 0 CET} + {2500506000 7200 1 CEST} + {2519254800 3600 0 CET} + {2531955600 7200 1 CEST} + {2550704400 3600 0 CET} + {2563405200 7200 1 CEST} + {2582154000 3600 0 CET} + {2595459600 7200 1 CEST} + {2613603600 3600 0 CET} + {2626909200 7200 1 CEST} + {2645053200 3600 0 CET} + {2658358800 7200 1 CEST} + {2676502800 3600 0 CET} + {2689808400 7200 1 CEST} + {2708557200 3600 0 CET} + {2721258000 7200 1 CEST} + {2740006800 3600 0 CET} + {2752707600 7200 1 CEST} + {2771456400 3600 0 CET} + {2784762000 7200 1 CEST} + {2802906000 3600 0 CET} + {2816211600 7200 1 CEST} + {2834355600 3600 0 CET} + {2847661200 7200 1 CEST} + {2866410000 3600 0 CET} + {2879110800 7200 1 CEST} + {2897859600 3600 0 CET} + {2910560400 7200 1 CEST} + {2929309200 3600 0 CET} + {2942010000 7200 1 CEST} + {2960758800 3600 0 CET} + {2974064400 7200 1 CEST} + {2992208400 3600 0 CET} + {3005514000 7200 1 CEST} + {3023658000 3600 0 CET} + {3036963600 7200 1 CEST} + {3055712400 3600 0 CET} + {3068413200 7200 1 CEST} + {3087162000 3600 0 CET} + {3099862800 7200 1 CEST} + {3118611600 3600 0 CET} + {3131917200 7200 1 CEST} + {3150061200 3600 0 CET} + {3163366800 7200 1 CEST} + {3181510800 3600 0 CET} + {3194816400 7200 1 CEST} + {3212960400 3600 0 CET} + {3226266000 7200 1 CEST} + {3245014800 3600 0 CET} + {3257715600 7200 1 CEST} + {3276464400 3600 0 CET} + {3289165200 7200 1 CEST} + {3307914000 3600 0 CET} + {3321219600 7200 1 CEST} + {3339363600 3600 0 CET} + {3352669200 7200 1 CEST} + {3370813200 3600 0 CET} + {3384118800 7200 1 CEST} + {3402867600 3600 0 CET} + {3415568400 7200 1 CEST} + {3434317200 3600 0 CET} + {3447018000 7200 1 CEST} + {3465766800 3600 0 CET} + {3479072400 7200 1 CEST} + {3497216400 3600 0 CET} + {3510522000 7200 1 CEST} + {3528666000 3600 0 CET} + {3541971600 7200 1 CEST} + {3560115600 3600 0 CET} + {3573421200 7200 1 CEST} + {3592170000 3600 0 CET} + {3604870800 7200 1 CEST} + {3623619600 3600 0 CET} + {3636320400 7200 1 CEST} + {3655069200 3600 0 CET} + {3668374800 7200 1 CEST} + {3686518800 3600 0 CET} + {3699824400 7200 1 CEST} + {3717968400 3600 0 CET} + {3731274000 7200 1 CEST} + {3750022800 3600 0 CET} + {3762723600 7200 1 CEST} + {3781472400 3600 0 CET} + {3794173200 7200 1 CEST} + {3812922000 3600 0 CET} + {3825622800 7200 1 CEST} + {3844371600 3600 0 CET} + {3857677200 7200 1 CEST} + {3875821200 3600 0 CET} + {3889126800 7200 1 CEST} + {3907270800 3600 0 CET} + {3920576400 7200 1 CEST} + {3939325200 3600 0 CET} + {3952026000 7200 1 CEST} + {3970774800 3600 0 CET} + {3983475600 7200 1 CEST} + {4002224400 3600 0 CET} + {4015530000 7200 1 CEST} + {4033674000 3600 0 CET} + {4046979600 7200 1 CEST} + {4065123600 3600 0 CET} + {4078429200 7200 1 CEST} + {4096573200 3600 0 CET} +} diff --git a/env/tcl/tcl8.6/tzdata/Europe/Samara b/env/tcl/tcl8.6/tzdata/Europe/Samara new file mode 100644 index 0000000..8f21c57 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Europe/Samara @@ -0,0 +1,73 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Europe/Samara) { + {-9223372036854775808 12020 0 LMT} + {-1593820800 10800 0 +03} + {-1247540400 14400 0 +04} + {-1102305600 14400 0 +05} + {354916800 18000 1 +05} + {370724400 14400 0 +04} + {386452800 18000 1 +05} + {402260400 14400 0 +04} + {417988800 18000 1 +05} + {433796400 14400 0 +04} + {449611200 18000 1 +05} + {465343200 14400 0 +04} + {481068000 18000 1 +05} + {496792800 14400 0 +04} + {512517600 18000 1 +05} + {528242400 14400 0 +04} + {543967200 18000 1 +05} + {559692000 14400 0 +04} + {575416800 18000 1 +05} + {591141600 14400 0 +04} + {606866400 10800 0 +04} + {606870000 14400 1 +04} + {622594800 10800 0 +03} + {638319600 14400 1 +04} + {654649200 10800 0 +03} + {670374000 7200 0 +03} + {670377600 10800 1 +03} + {686102400 10800 0 +03} + {687916800 14400 0 +04} + {701820000 18000 1 +05} + {717544800 14400 0 +04} + {733269600 18000 1 +05} + {748994400 14400 0 +04} + {764719200 18000 1 +05} + {780444000 14400 0 +04} + {796168800 18000 1 +05} + {811893600 14400 0 +04} + {828223200 18000 1 +05} + {846367200 14400 0 +04} + {859672800 18000 1 +05} + {877816800 14400 0 +04} + {891122400 18000 1 +05} + {909266400 14400 0 +04} + {922572000 18000 1 +05} + {941320800 14400 0 +04} + {954021600 18000 1 +05} + {972770400 14400 0 +04} + {985471200 18000 1 +05} + {1004220000 14400 0 +04} + {1017525600 18000 1 +05} + {1035669600 14400 0 +04} + {1048975200 18000 1 +05} + {1067119200 14400 0 +04} + {1080424800 18000 1 +05} + {1099173600 14400 0 +04} + {1111874400 18000 1 +05} + {1130623200 14400 0 +04} + {1143324000 18000 1 +05} + {1162072800 14400 0 +04} + {1174773600 18000 1 +05} + {1193522400 14400 0 +04} + {1206828000 18000 1 +05} + {1224972000 14400 0 +04} + {1238277600 18000 1 +05} + {1256421600 14400 0 +04} + {1269727200 10800 0 +04} + {1269730800 14400 1 +04} + {1288479600 10800 0 +03} + {1301180400 14400 0 +04} +} diff --git a/env/tcl/tcl8.6/tzdata/Europe/San_Marino b/env/tcl/tcl8.6/tzdata/Europe/San_Marino new file mode 100644 index 0000000..927ad29 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Europe/San_Marino @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(Europe/Rome)]} { + LoadTimeZoneFile Europe/Rome +} +set TZData(:Europe/San_Marino) $TZData(:Europe/Rome) diff --git a/env/tcl/tcl8.6/tzdata/Europe/Sarajevo b/env/tcl/tcl8.6/tzdata/Europe/Sarajevo new file mode 100644 index 0000000..1b14286 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Europe/Sarajevo @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(Europe/Belgrade)]} { + LoadTimeZoneFile Europe/Belgrade +} +set TZData(:Europe/Sarajevo) $TZData(:Europe/Belgrade) diff --git a/env/tcl/tcl8.6/tzdata/Europe/Saratov b/env/tcl/tcl8.6/tzdata/Europe/Saratov new file mode 100644 index 0000000..d89a217 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Europe/Saratov @@ -0,0 +1,71 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Europe/Saratov) { + {-9223372036854775808 11058 0 LMT} + {-1593820800 10800 0 +03} + {-1247540400 14400 0 +05} + {354916800 18000 1 +05} + {370724400 14400 0 +04} + {386452800 18000 1 +05} + {402260400 14400 0 +04} + {417988800 18000 1 +05} + {433796400 14400 0 +04} + {449611200 18000 1 +05} + {465343200 14400 0 +04} + {481068000 18000 1 +05} + {496792800 14400 0 +04} + {512517600 18000 1 +05} + {528242400 14400 0 +04} + {543967200 18000 1 +05} + {559692000 14400 0 +04} + {575416800 10800 0 +04} + {575420400 14400 1 +04} + {591145200 10800 0 +03} + {606870000 14400 1 +04} + {622594800 10800 0 +03} + {638319600 14400 1 +04} + {654649200 10800 0 +03} + {670374000 14400 0 +04} + {701820000 10800 0 +04} + {701823600 14400 1 +04} + {717548400 10800 0 +03} + {733273200 14400 1 +04} + {748998000 10800 0 +03} + {764722800 14400 1 +04} + {780447600 10800 0 +03} + {796172400 14400 1 +04} + {811897200 10800 0 +03} + {828226800 14400 1 +04} + {846370800 10800 0 +03} + {859676400 14400 1 +04} + {877820400 10800 0 +03} + {891126000 14400 1 +04} + {909270000 10800 0 +03} + {922575600 14400 1 +04} + {941324400 10800 0 +03} + {954025200 14400 1 +04} + {972774000 10800 0 +03} + {985474800 14400 1 +04} + {1004223600 10800 0 +03} + {1017529200 14400 1 +04} + {1035673200 10800 0 +03} + {1048978800 14400 1 +04} + {1067122800 10800 0 +03} + {1080428400 14400 1 +04} + {1099177200 10800 0 +03} + {1111878000 14400 1 +04} + {1130626800 10800 0 +03} + {1143327600 14400 1 +04} + {1162076400 10800 0 +03} + {1174777200 14400 1 +04} + {1193526000 10800 0 +03} + {1206831600 14400 1 +04} + {1224975600 10800 0 +03} + {1238281200 14400 1 +04} + {1256425200 10800 0 +03} + {1269730800 14400 1 +04} + {1288479600 10800 0 +03} + {1301180400 14400 0 +04} + {1414274400 10800 0 +03} + {1480806000 14400 0 +04} +} diff --git a/env/tcl/tcl8.6/tzdata/Europe/Simferopol b/env/tcl/tcl8.6/tzdata/Europe/Simferopol new file mode 100644 index 0000000..3e4b60a --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Europe/Simferopol @@ -0,0 +1,82 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Europe/Simferopol) { + {-9223372036854775808 8184 0 LMT} + {-2840148984 8160 0 SMT} + {-1441160160 7200 0 EET} + {-1247536800 10800 0 MSK} + {-888894000 3600 0 CET} + {-857257200 3600 0 CET} + {-844556400 7200 1 CEST} + {-828226800 3600 0 CET} + {-812502000 7200 1 CEST} + {-811645200 10800 0 MSD} + {354920400 14400 1 MSD} + {370728000 10800 0 MSK} + {386456400 14400 1 MSD} + {402264000 10800 0 MSK} + {417992400 14400 1 MSD} + {433800000 10800 0 MSK} + {449614800 14400 1 MSD} + {465346800 10800 0 MSK} + {481071600 14400 1 MSD} + {496796400 10800 0 MSK} + {512521200 14400 1 MSD} + {528246000 10800 0 MSK} + {543970800 14400 1 MSD} + {559695600 10800 0 MSK} + {575420400 14400 1 MSD} + {591145200 10800 0 MSK} + {606870000 14400 1 MSD} + {622594800 10800 0 MSK} + {631141200 10800 0 MSK} + {646786800 7200 0 EET} + {694216800 7200 0 EET} + {701820000 10800 1 EEST} + {717541200 7200 0 EET} + {733269600 10800 1 EEST} + {748990800 7200 0 EET} + {764719200 10800 1 EEST} + {767743200 14400 0 MSD} + {780436800 10800 0 MSK} + {796165200 14400 1 MSD} + {811886400 10800 0 MSK} + {828219600 14400 1 MSD} + {852066000 10800 0 MSK} + {859683600 10800 0 EEST} + {877827600 7200 0 EET} + {891133200 10800 1 EEST} + {909277200 7200 0 EET} + {922582800 10800 1 EEST} + {941331600 7200 0 EET} + {954032400 10800 1 EEST} + {972781200 7200 0 EET} + {985482000 10800 1 EEST} + {1004230800 7200 0 EET} + {1017536400 10800 1 EEST} + {1035680400 7200 0 EET} + {1048986000 10800 1 EEST} + {1067130000 7200 0 EET} + {1080435600 10800 1 EEST} + {1099184400 7200 0 EET} + {1111885200 10800 1 EEST} + {1130634000 7200 0 EET} + {1143334800 10800 1 EEST} + {1162083600 7200 0 EET} + {1174784400 10800 1 EEST} + {1193533200 7200 0 EET} + {1206838800 10800 1 EEST} + {1224982800 7200 0 EET} + {1238288400 10800 1 EEST} + {1256432400 7200 0 EET} + {1269738000 10800 1 EEST} + {1288486800 7200 0 EET} + {1301187600 10800 1 EEST} + {1319936400 7200 0 EET} + {1332637200 10800 1 EEST} + {1351386000 7200 0 EET} + {1364691600 10800 1 EEST} + {1382835600 7200 0 EET} + {1396137600 14400 0 MSK} + {1414274400 10800 0 MSK} +} diff --git a/env/tcl/tcl8.6/tzdata/Europe/Skopje b/env/tcl/tcl8.6/tzdata/Europe/Skopje new file mode 100644 index 0000000..07eedbe --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Europe/Skopje @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(Europe/Belgrade)]} { + LoadTimeZoneFile Europe/Belgrade +} +set TZData(:Europe/Skopje) $TZData(:Europe/Belgrade) diff --git a/env/tcl/tcl8.6/tzdata/Europe/Sofia b/env/tcl/tcl8.6/tzdata/Europe/Sofia new file mode 100644 index 0000000..a07f3bc --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Europe/Sofia @@ -0,0 +1,258 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Europe/Sofia) { + {-9223372036854775808 5596 0 LMT} + {-2840146396 7016 0 IMT} + {-2369527016 7200 0 EET} + {-857257200 3600 0 CET} + {-844556400 7200 1 CEST} + {-828226800 3600 0 CET} + {-812502000 7200 1 CEST} + {-796777200 3600 0 CET} + {-788922000 3600 0 CET} + {-781048800 7200 0 EET} + {291762000 10800 0 EEST} + {307576800 7200 0 EET} + {323816400 10800 1 EEST} + {339026400 7200 0 EET} + {355266000 10800 1 EEST} + {370393200 7200 0 EET} + {386715600 10800 1 EEST} + {401846400 7200 0 EET} + {417571200 10800 1 EEST} + {433296000 7200 0 EET} + {449020800 10800 1 EEST} + {465350400 7200 0 EET} + {481075200 10800 1 EEST} + {496800000 7200 0 EET} + {512524800 10800 1 EEST} + {528249600 7200 0 EET} + {543974400 10800 1 EEST} + {559699200 7200 0 EET} + {575424000 10800 1 EEST} + {591148800 7200 0 EET} + {606873600 10800 1 EEST} + {622598400 7200 0 EET} + {638323200 10800 1 EEST} + {654652800 7200 0 EET} + {662680800 7200 0 EET} + {670370400 10800 1 EEST} + {686091600 7200 0 EET} + {701820000 10800 1 EEST} + {717541200 7200 0 EET} + {733269600 10800 1 EEST} + {748990800 7200 0 EET} + {764719200 10800 1 EEST} + {780440400 7200 0 EET} + {796168800 10800 1 EEST} + {811890000 7200 0 EET} + {828223200 10800 1 EEST} + {846363600 7200 0 EET} + {852069600 7200 0 EET} + {859683600 10800 1 EEST} + {877827600 7200 0 EET} + {891133200 10800 1 EEST} + {909277200 7200 0 EET} + {922582800 10800 1 EEST} + {941331600 7200 0 EET} + {954032400 10800 1 EEST} + {972781200 7200 0 EET} + {985482000 10800 1 EEST} + {1004230800 7200 0 EET} + {1017536400 10800 1 EEST} + {1035680400 7200 0 EET} + {1048986000 10800 1 EEST} + {1067130000 7200 0 EET} + {1080435600 10800 1 EEST} + {1099184400 7200 0 EET} + {1111885200 10800 1 EEST} + {1130634000 7200 0 EET} + {1143334800 10800 1 EEST} + {1162083600 7200 0 EET} + {1174784400 10800 1 EEST} + {1193533200 7200 0 EET} + {1206838800 10800 1 EEST} + {1224982800 7200 0 EET} + {1238288400 10800 1 EEST} + {1256432400 7200 0 EET} + {1269738000 10800 1 EEST} + {1288486800 7200 0 EET} + {1301187600 10800 1 EEST} + {1319936400 7200 0 EET} + {1332637200 10800 1 EEST} + {1351386000 7200 0 EET} + {1364691600 10800 1 EEST} + {1382835600 7200 0 EET} + {1396141200 10800 1 EEST} + {1414285200 7200 0 EET} + {1427590800 10800 1 EEST} + {1445734800 7200 0 EET} + {1459040400 10800 1 EEST} + {1477789200 7200 0 EET} + {1490490000 10800 1 EEST} + {1509238800 7200 0 EET} + {1521939600 10800 1 EEST} + {1540688400 7200 0 EET} + {1553994000 10800 1 EEST} + {1572138000 7200 0 EET} + {1585443600 10800 1 EEST} + {1603587600 7200 0 EET} + {1616893200 10800 1 EEST} + {1635642000 7200 0 EET} + {1648342800 10800 1 EEST} + {1667091600 7200 0 EET} + {1679792400 10800 1 EEST} + {1698541200 7200 0 EET} + {1711846800 10800 1 EEST} + {1729990800 7200 0 EET} + {1743296400 10800 1 EEST} + {1761440400 7200 0 EET} + {1774746000 10800 1 EEST} + {1792890000 7200 0 EET} + {1806195600 10800 1 EEST} + {1824944400 7200 0 EET} + {1837645200 10800 1 EEST} + {1856394000 7200 0 EET} + {1869094800 10800 1 EEST} + {1887843600 7200 0 EET} + {1901149200 10800 1 EEST} + {1919293200 7200 0 EET} + {1932598800 10800 1 EEST} + {1950742800 7200 0 EET} + {1964048400 10800 1 EEST} + {1982797200 7200 0 EET} + {1995498000 10800 1 EEST} + {2014246800 7200 0 EET} + {2026947600 10800 1 EEST} + {2045696400 7200 0 EET} + {2058397200 10800 1 EEST} + {2077146000 7200 0 EET} + {2090451600 10800 1 EEST} + {2108595600 7200 0 EET} + {2121901200 10800 1 EEST} + {2140045200 7200 0 EET} + {2153350800 10800 1 EEST} + {2172099600 7200 0 EET} + {2184800400 10800 1 EEST} + {2203549200 7200 0 EET} + {2216250000 10800 1 EEST} + {2234998800 7200 0 EET} + {2248304400 10800 1 EEST} + {2266448400 7200 0 EET} + {2279754000 10800 1 EEST} + {2297898000 7200 0 EET} + {2311203600 10800 1 EEST} + {2329347600 7200 0 EET} + {2342653200 10800 1 EEST} + {2361402000 7200 0 EET} + {2374102800 10800 1 EEST} + {2392851600 7200 0 EET} + {2405552400 10800 1 EEST} + {2424301200 7200 0 EET} + {2437606800 10800 1 EEST} + {2455750800 7200 0 EET} + {2469056400 10800 1 EEST} + {2487200400 7200 0 EET} + {2500506000 10800 1 EEST} + {2519254800 7200 0 EET} + {2531955600 10800 1 EEST} + {2550704400 7200 0 EET} + {2563405200 10800 1 EEST} + {2582154000 7200 0 EET} + {2595459600 10800 1 EEST} + {2613603600 7200 0 EET} + {2626909200 10800 1 EEST} + {2645053200 7200 0 EET} + {2658358800 10800 1 EEST} + {2676502800 7200 0 EET} + {2689808400 10800 1 EEST} + {2708557200 7200 0 EET} + {2721258000 10800 1 EEST} + {2740006800 7200 0 EET} + {2752707600 10800 1 EEST} + {2771456400 7200 0 EET} + {2784762000 10800 1 EEST} + {2802906000 7200 0 EET} + {2816211600 10800 1 EEST} + {2834355600 7200 0 EET} + {2847661200 10800 1 EEST} + {2866410000 7200 0 EET} + {2879110800 10800 1 EEST} + {2897859600 7200 0 EET} + {2910560400 10800 1 EEST} + {2929309200 7200 0 EET} + {2942010000 10800 1 EEST} + {2960758800 7200 0 EET} + {2974064400 10800 1 EEST} + {2992208400 7200 0 EET} + {3005514000 10800 1 EEST} + {3023658000 7200 0 EET} + {3036963600 10800 1 EEST} + {3055712400 7200 0 EET} + {3068413200 10800 1 EEST} + {3087162000 7200 0 EET} + {3099862800 10800 1 EEST} + {3118611600 7200 0 EET} + {3131917200 10800 1 EEST} + {3150061200 7200 0 EET} + {3163366800 10800 1 EEST} + {3181510800 7200 0 EET} + {3194816400 10800 1 EEST} + {3212960400 7200 0 EET} + {3226266000 10800 1 EEST} + {3245014800 7200 0 EET} + {3257715600 10800 1 EEST} + {3276464400 7200 0 EET} + {3289165200 10800 1 EEST} + {3307914000 7200 0 EET} + {3321219600 10800 1 EEST} + {3339363600 7200 0 EET} + {3352669200 10800 1 EEST} + {3370813200 7200 0 EET} + {3384118800 10800 1 EEST} + {3402867600 7200 0 EET} + {3415568400 10800 1 EEST} + {3434317200 7200 0 EET} + {3447018000 10800 1 EEST} + {3465766800 7200 0 EET} + {3479072400 10800 1 EEST} + {3497216400 7200 0 EET} + {3510522000 10800 1 EEST} + {3528666000 7200 0 EET} + {3541971600 10800 1 EEST} + {3560115600 7200 0 EET} + {3573421200 10800 1 EEST} + {3592170000 7200 0 EET} + {3604870800 10800 1 EEST} + {3623619600 7200 0 EET} + {3636320400 10800 1 EEST} + {3655069200 7200 0 EET} + {3668374800 10800 1 EEST} + {3686518800 7200 0 EET} + {3699824400 10800 1 EEST} + {3717968400 7200 0 EET} + {3731274000 10800 1 EEST} + {3750022800 7200 0 EET} + {3762723600 10800 1 EEST} + {3781472400 7200 0 EET} + {3794173200 10800 1 EEST} + {3812922000 7200 0 EET} + {3825622800 10800 1 EEST} + {3844371600 7200 0 EET} + {3857677200 10800 1 EEST} + {3875821200 7200 0 EET} + {3889126800 10800 1 EEST} + {3907270800 7200 0 EET} + {3920576400 10800 1 EEST} + {3939325200 7200 0 EET} + {3952026000 10800 1 EEST} + {3970774800 7200 0 EET} + {3983475600 10800 1 EEST} + {4002224400 7200 0 EET} + {4015530000 10800 1 EEST} + {4033674000 7200 0 EET} + {4046979600 10800 1 EEST} + {4065123600 7200 0 EET} + {4078429200 10800 1 EEST} + {4096573200 7200 0 EET} +} diff --git a/env/tcl/tcl8.6/tzdata/Europe/Stockholm b/env/tcl/tcl8.6/tzdata/Europe/Stockholm new file mode 100644 index 0000000..b74d327 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Europe/Stockholm @@ -0,0 +1,250 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Europe/Stockholm) { + {-9223372036854775808 4332 0 LMT} + {-2871681132 3614 0 SET} + {-2208992414 3600 0 CET} + {-1692496800 7200 1 CEST} + {-1680483600 3600 0 CET} + {315529200 3600 0 CET} + {323830800 7200 1 CEST} + {338950800 3600 0 CET} + {354675600 7200 1 CEST} + {370400400 3600 0 CET} + {386125200 7200 1 CEST} + {401850000 3600 0 CET} + {417574800 7200 1 CEST} + {433299600 3600 0 CET} + {449024400 7200 1 CEST} + {465354000 3600 0 CET} + {481078800 7200 1 CEST} + {496803600 3600 0 CET} + {512528400 7200 1 CEST} + {528253200 3600 0 CET} + {543978000 7200 1 CEST} + {559702800 3600 0 CET} + {575427600 7200 1 CEST} + {591152400 3600 0 CET} + {606877200 7200 1 CEST} + {622602000 3600 0 CET} + {638326800 7200 1 CEST} + {654656400 3600 0 CET} + {670381200 7200 1 CEST} + {686106000 3600 0 CET} + {701830800 7200 1 CEST} + {717555600 3600 0 CET} + {733280400 7200 1 CEST} + {749005200 3600 0 CET} + {764730000 7200 1 CEST} + {780454800 3600 0 CET} + {796179600 7200 1 CEST} + {811904400 3600 0 CET} + {828234000 7200 1 CEST} + {846378000 3600 0 CET} + {859683600 7200 1 CEST} + {877827600 3600 0 CET} + {891133200 7200 1 CEST} + {909277200 3600 0 CET} + {922582800 7200 1 CEST} + {941331600 3600 0 CET} + {954032400 7200 1 CEST} + {972781200 3600 0 CET} + {985482000 7200 1 CEST} + {1004230800 3600 0 CET} + {1017536400 7200 1 CEST} + {1035680400 3600 0 CET} + {1048986000 7200 1 CEST} + {1067130000 3600 0 CET} + {1080435600 7200 1 CEST} + {1099184400 3600 0 CET} + {1111885200 7200 1 CEST} + {1130634000 3600 0 CET} + {1143334800 7200 1 CEST} + {1162083600 3600 0 CET} + {1174784400 7200 1 CEST} + {1193533200 3600 0 CET} + {1206838800 7200 1 CEST} + {1224982800 3600 0 CET} + {1238288400 7200 1 CEST} + {1256432400 3600 0 CET} + {1269738000 7200 1 CEST} + {1288486800 3600 0 CET} + {1301187600 7200 1 CEST} + {1319936400 3600 0 CET} + {1332637200 7200 1 CEST} + {1351386000 3600 0 CET} + {1364691600 7200 1 CEST} + {1382835600 3600 0 CET} + {1396141200 7200 1 CEST} + {1414285200 3600 0 CET} + {1427590800 7200 1 CEST} + {1445734800 3600 0 CET} + {1459040400 7200 1 CEST} + {1477789200 3600 0 CET} + {1490490000 7200 1 CEST} + {1509238800 3600 0 CET} + {1521939600 7200 1 CEST} + {1540688400 3600 0 CET} + {1553994000 7200 1 CEST} + {1572138000 3600 0 CET} + {1585443600 7200 1 CEST} + {1603587600 3600 0 CET} + {1616893200 7200 1 CEST} + {1635642000 3600 0 CET} + {1648342800 7200 1 CEST} + {1667091600 3600 0 CET} + {1679792400 7200 1 CEST} + {1698541200 3600 0 CET} + {1711846800 7200 1 CEST} + {1729990800 3600 0 CET} + {1743296400 7200 1 CEST} + {1761440400 3600 0 CET} + {1774746000 7200 1 CEST} + {1792890000 3600 0 CET} + {1806195600 7200 1 CEST} + {1824944400 3600 0 CET} + {1837645200 7200 1 CEST} + {1856394000 3600 0 CET} + {1869094800 7200 1 CEST} + {1887843600 3600 0 CET} + {1901149200 7200 1 CEST} + {1919293200 3600 0 CET} + {1932598800 7200 1 CEST} + {1950742800 3600 0 CET} + {1964048400 7200 1 CEST} + {1982797200 3600 0 CET} + {1995498000 7200 1 CEST} + {2014246800 3600 0 CET} + {2026947600 7200 1 CEST} + {2045696400 3600 0 CET} + {2058397200 7200 1 CEST} + {2077146000 3600 0 CET} + {2090451600 7200 1 CEST} + {2108595600 3600 0 CET} + {2121901200 7200 1 CEST} + {2140045200 3600 0 CET} + {2153350800 7200 1 CEST} + {2172099600 3600 0 CET} + {2184800400 7200 1 CEST} + {2203549200 3600 0 CET} + {2216250000 7200 1 CEST} + {2234998800 3600 0 CET} + {2248304400 7200 1 CEST} + {2266448400 3600 0 CET} + {2279754000 7200 1 CEST} + {2297898000 3600 0 CET} + {2311203600 7200 1 CEST} + {2329347600 3600 0 CET} + {2342653200 7200 1 CEST} + {2361402000 3600 0 CET} + {2374102800 7200 1 CEST} + {2392851600 3600 0 CET} + {2405552400 7200 1 CEST} + {2424301200 3600 0 CET} + {2437606800 7200 1 CEST} + {2455750800 3600 0 CET} + {2469056400 7200 1 CEST} + {2487200400 3600 0 CET} + {2500506000 7200 1 CEST} + {2519254800 3600 0 CET} + {2531955600 7200 1 CEST} + {2550704400 3600 0 CET} + {2563405200 7200 1 CEST} + {2582154000 3600 0 CET} + {2595459600 7200 1 CEST} + {2613603600 3600 0 CET} + {2626909200 7200 1 CEST} + {2645053200 3600 0 CET} + {2658358800 7200 1 CEST} + {2676502800 3600 0 CET} + {2689808400 7200 1 CEST} + {2708557200 3600 0 CET} + {2721258000 7200 1 CEST} + {2740006800 3600 0 CET} + {2752707600 7200 1 CEST} + {2771456400 3600 0 CET} + {2784762000 7200 1 CEST} + {2802906000 3600 0 CET} + {2816211600 7200 1 CEST} + {2834355600 3600 0 CET} + {2847661200 7200 1 CEST} + {2866410000 3600 0 CET} + {2879110800 7200 1 CEST} + {2897859600 3600 0 CET} + {2910560400 7200 1 CEST} + {2929309200 3600 0 CET} + {2942010000 7200 1 CEST} + {2960758800 3600 0 CET} + {2974064400 7200 1 CEST} + {2992208400 3600 0 CET} + {3005514000 7200 1 CEST} + {3023658000 3600 0 CET} + {3036963600 7200 1 CEST} + {3055712400 3600 0 CET} + {3068413200 7200 1 CEST} + {3087162000 3600 0 CET} + {3099862800 7200 1 CEST} + {3118611600 3600 0 CET} + {3131917200 7200 1 CEST} + {3150061200 3600 0 CET} + {3163366800 7200 1 CEST} + {3181510800 3600 0 CET} + {3194816400 7200 1 CEST} + {3212960400 3600 0 CET} + {3226266000 7200 1 CEST} + {3245014800 3600 0 CET} + {3257715600 7200 1 CEST} + {3276464400 3600 0 CET} + {3289165200 7200 1 CEST} + {3307914000 3600 0 CET} + {3321219600 7200 1 CEST} + {3339363600 3600 0 CET} + {3352669200 7200 1 CEST} + {3370813200 3600 0 CET} + {3384118800 7200 1 CEST} + {3402867600 3600 0 CET} + {3415568400 7200 1 CEST} + {3434317200 3600 0 CET} + {3447018000 7200 1 CEST} + {3465766800 3600 0 CET} + {3479072400 7200 1 CEST} + {3497216400 3600 0 CET} + {3510522000 7200 1 CEST} + {3528666000 3600 0 CET} + {3541971600 7200 1 CEST} + {3560115600 3600 0 CET} + {3573421200 7200 1 CEST} + {3592170000 3600 0 CET} + {3604870800 7200 1 CEST} + {3623619600 3600 0 CET} + {3636320400 7200 1 CEST} + {3655069200 3600 0 CET} + {3668374800 7200 1 CEST} + {3686518800 3600 0 CET} + {3699824400 7200 1 CEST} + {3717968400 3600 0 CET} + {3731274000 7200 1 CEST} + {3750022800 3600 0 CET} + {3762723600 7200 1 CEST} + {3781472400 3600 0 CET} + {3794173200 7200 1 CEST} + {3812922000 3600 0 CET} + {3825622800 7200 1 CEST} + {3844371600 3600 0 CET} + {3857677200 7200 1 CEST} + {3875821200 3600 0 CET} + {3889126800 7200 1 CEST} + {3907270800 3600 0 CET} + {3920576400 7200 1 CEST} + {3939325200 3600 0 CET} + {3952026000 7200 1 CEST} + {3970774800 3600 0 CET} + {3983475600 7200 1 CEST} + {4002224400 3600 0 CET} + {4015530000 7200 1 CEST} + {4033674000 3600 0 CET} + {4046979600 7200 1 CEST} + {4065123600 3600 0 CET} + {4078429200 7200 1 CEST} + {4096573200 3600 0 CET} +} diff --git a/env/tcl/tcl8.6/tzdata/Europe/Tallinn b/env/tcl/tcl8.6/tzdata/Europe/Tallinn new file mode 100644 index 0000000..e0f22a5 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Europe/Tallinn @@ -0,0 +1,254 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Europe/Tallinn) { + {-9223372036854775808 5940 0 LMT} + {-2840146740 5940 0 TMT} + {-1638322740 3600 0 CET} + {-1632006000 7200 1 CEST} + {-1618700400 3600 0 CET} + {-1593824400 5940 0 TMT} + {-1535938740 7200 0 EET} + {-927943200 10800 0 MSK} + {-892954800 3600 0 CET} + {-857257200 3600 0 CET} + {-844556400 7200 1 CEST} + {-828226800 3600 0 CET} + {-812502000 7200 1 CEST} + {-797648400 10800 0 MSD} + {354920400 14400 1 MSD} + {370728000 10800 0 MSK} + {386456400 14400 1 MSD} + {402264000 10800 0 MSK} + {417992400 14400 1 MSD} + {433800000 10800 0 MSK} + {449614800 14400 1 MSD} + {465346800 10800 0 MSK} + {481071600 14400 1 MSD} + {496796400 10800 0 MSK} + {512521200 14400 1 MSD} + {528246000 10800 0 MSK} + {543970800 14400 1 MSD} + {559695600 10800 0 MSK} + {575420400 14400 1 MSD} + {591145200 10800 0 MSK} + {606870000 10800 1 EEST} + {622598400 7200 0 EET} + {638323200 10800 1 EEST} + {654652800 7200 0 EET} + {670377600 10800 1 EEST} + {686102400 7200 0 EET} + {701827200 10800 1 EEST} + {717552000 7200 0 EET} + {733276800 10800 1 EEST} + {749001600 7200 0 EET} + {764726400 10800 1 EEST} + {780451200 7200 0 EET} + {796176000 10800 1 EEST} + {811900800 7200 0 EET} + {828230400 10800 1 EEST} + {846374400 7200 0 EET} + {859680000 10800 1 EEST} + {877824000 7200 0 EET} + {891129600 10800 1 EEST} + {906415200 10800 0 EEST} + {909277200 7200 0 EET} + {922582800 10800 1 EEST} + {941335200 7200 0 EET} + {1014242400 7200 0 EET} + {1017536400 10800 1 EEST} + {1035680400 7200 0 EET} + {1048986000 10800 1 EEST} + {1067130000 7200 0 EET} + {1080435600 10800 1 EEST} + {1099184400 7200 0 EET} + {1111885200 10800 1 EEST} + {1130634000 7200 0 EET} + {1143334800 10800 1 EEST} + {1162083600 7200 0 EET} + {1174784400 10800 1 EEST} + {1193533200 7200 0 EET} + {1206838800 10800 1 EEST} + {1224982800 7200 0 EET} + {1238288400 10800 1 EEST} + {1256432400 7200 0 EET} + {1269738000 10800 1 EEST} + {1288486800 7200 0 EET} + {1301187600 10800 1 EEST} + {1319936400 7200 0 EET} + {1332637200 10800 1 EEST} + {1351386000 7200 0 EET} + {1364691600 10800 1 EEST} + {1382835600 7200 0 EET} + {1396141200 10800 1 EEST} + {1414285200 7200 0 EET} + {1427590800 10800 1 EEST} + {1445734800 7200 0 EET} + {1459040400 10800 1 EEST} + {1477789200 7200 0 EET} + {1490490000 10800 1 EEST} + {1509238800 7200 0 EET} + {1521939600 10800 1 EEST} + {1540688400 7200 0 EET} + {1553994000 10800 1 EEST} + {1572138000 7200 0 EET} + {1585443600 10800 1 EEST} + {1603587600 7200 0 EET} + {1616893200 10800 1 EEST} + {1635642000 7200 0 EET} + {1648342800 10800 1 EEST} + {1667091600 7200 0 EET} + {1679792400 10800 1 EEST} + {1698541200 7200 0 EET} + {1711846800 10800 1 EEST} + {1729990800 7200 0 EET} + {1743296400 10800 1 EEST} + {1761440400 7200 0 EET} + {1774746000 10800 1 EEST} + {1792890000 7200 0 EET} + {1806195600 10800 1 EEST} + {1824944400 7200 0 EET} + {1837645200 10800 1 EEST} + {1856394000 7200 0 EET} + {1869094800 10800 1 EEST} + {1887843600 7200 0 EET} + {1901149200 10800 1 EEST} + {1919293200 7200 0 EET} + {1932598800 10800 1 EEST} + {1950742800 7200 0 EET} + {1964048400 10800 1 EEST} + {1982797200 7200 0 EET} + {1995498000 10800 1 EEST} + {2014246800 7200 0 EET} + {2026947600 10800 1 EEST} + {2045696400 7200 0 EET} + {2058397200 10800 1 EEST} + {2077146000 7200 0 EET} + {2090451600 10800 1 EEST} + {2108595600 7200 0 EET} + {2121901200 10800 1 EEST} + {2140045200 7200 0 EET} + {2153350800 10800 1 EEST} + {2172099600 7200 0 EET} + {2184800400 10800 1 EEST} + {2203549200 7200 0 EET} + {2216250000 10800 1 EEST} + {2234998800 7200 0 EET} + {2248304400 10800 1 EEST} + {2266448400 7200 0 EET} + {2279754000 10800 1 EEST} + {2297898000 7200 0 EET} + {2311203600 10800 1 EEST} + {2329347600 7200 0 EET} + {2342653200 10800 1 EEST} + {2361402000 7200 0 EET} + {2374102800 10800 1 EEST} + {2392851600 7200 0 EET} + {2405552400 10800 1 EEST} + {2424301200 7200 0 EET} + {2437606800 10800 1 EEST} + {2455750800 7200 0 EET} + {2469056400 10800 1 EEST} + {2487200400 7200 0 EET} + {2500506000 10800 1 EEST} + {2519254800 7200 0 EET} + {2531955600 10800 1 EEST} + {2550704400 7200 0 EET} + {2563405200 10800 1 EEST} + {2582154000 7200 0 EET} + {2595459600 10800 1 EEST} + {2613603600 7200 0 EET} + {2626909200 10800 1 EEST} + {2645053200 7200 0 EET} + {2658358800 10800 1 EEST} + {2676502800 7200 0 EET} + {2689808400 10800 1 EEST} + {2708557200 7200 0 EET} + {2721258000 10800 1 EEST} + {2740006800 7200 0 EET} + {2752707600 10800 1 EEST} + {2771456400 7200 0 EET} + {2784762000 10800 1 EEST} + {2802906000 7200 0 EET} + {2816211600 10800 1 EEST} + {2834355600 7200 0 EET} + {2847661200 10800 1 EEST} + {2866410000 7200 0 EET} + {2879110800 10800 1 EEST} + {2897859600 7200 0 EET} + {2910560400 10800 1 EEST} + {2929309200 7200 0 EET} + {2942010000 10800 1 EEST} + {2960758800 7200 0 EET} + {2974064400 10800 1 EEST} + {2992208400 7200 0 EET} + {3005514000 10800 1 EEST} + {3023658000 7200 0 EET} + {3036963600 10800 1 EEST} + {3055712400 7200 0 EET} + {3068413200 10800 1 EEST} + {3087162000 7200 0 EET} + {3099862800 10800 1 EEST} + {3118611600 7200 0 EET} + {3131917200 10800 1 EEST} + {3150061200 7200 0 EET} + {3163366800 10800 1 EEST} + {3181510800 7200 0 EET} + {3194816400 10800 1 EEST} + {3212960400 7200 0 EET} + {3226266000 10800 1 EEST} + {3245014800 7200 0 EET} + {3257715600 10800 1 EEST} + {3276464400 7200 0 EET} + {3289165200 10800 1 EEST} + {3307914000 7200 0 EET} + {3321219600 10800 1 EEST} + {3339363600 7200 0 EET} + {3352669200 10800 1 EEST} + {3370813200 7200 0 EET} + {3384118800 10800 1 EEST} + {3402867600 7200 0 EET} + {3415568400 10800 1 EEST} + {3434317200 7200 0 EET} + {3447018000 10800 1 EEST} + {3465766800 7200 0 EET} + {3479072400 10800 1 EEST} + {3497216400 7200 0 EET} + {3510522000 10800 1 EEST} + {3528666000 7200 0 EET} + {3541971600 10800 1 EEST} + {3560115600 7200 0 EET} + {3573421200 10800 1 EEST} + {3592170000 7200 0 EET} + {3604870800 10800 1 EEST} + {3623619600 7200 0 EET} + {3636320400 10800 1 EEST} + {3655069200 7200 0 EET} + {3668374800 10800 1 EEST} + {3686518800 7200 0 EET} + {3699824400 10800 1 EEST} + {3717968400 7200 0 EET} + {3731274000 10800 1 EEST} + {3750022800 7200 0 EET} + {3762723600 10800 1 EEST} + {3781472400 7200 0 EET} + {3794173200 10800 1 EEST} + {3812922000 7200 0 EET} + {3825622800 10800 1 EEST} + {3844371600 7200 0 EET} + {3857677200 10800 1 EEST} + {3875821200 7200 0 EET} + {3889126800 10800 1 EEST} + {3907270800 7200 0 EET} + {3920576400 10800 1 EEST} + {3939325200 7200 0 EET} + {3952026000 10800 1 EEST} + {3970774800 7200 0 EET} + {3983475600 10800 1 EEST} + {4002224400 7200 0 EET} + {4015530000 10800 1 EEST} + {4033674000 7200 0 EET} + {4046979600 10800 1 EEST} + {4065123600 7200 0 EET} + {4078429200 10800 1 EEST} + {4096573200 7200 0 EET} +} diff --git a/env/tcl/tcl8.6/tzdata/Europe/Tirane b/env/tcl/tcl8.6/tzdata/Europe/Tirane new file mode 100644 index 0000000..14ace2e --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Europe/Tirane @@ -0,0 +1,263 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Europe/Tirane) { + {-9223372036854775808 4760 0 LMT} + {-1767230360 3600 0 CET} + {-932346000 7200 0 CEST} + {-857257200 3600 0 CET} + {-844556400 7200 1 CEST} + {-843519600 3600 0 CET} + {136854000 7200 1 CEST} + {149896800 3600 0 CET} + {168130800 7200 1 CEST} + {181432800 3600 0 CET} + {199839600 7200 1 CEST} + {213141600 3600 0 CET} + {231894000 7200 1 CEST} + {244591200 3600 0 CET} + {263257200 7200 1 CEST} + {276040800 3600 0 CET} + {294706800 7200 1 CEST} + {307490400 3600 0 CET} + {326156400 7200 1 CEST} + {339458400 3600 0 CET} + {357087600 7200 1 CEST} + {370389600 3600 0 CET} + {389142000 7200 1 CEST} + {402444000 3600 0 CET} + {419468400 7200 1 CEST} + {433807200 3600 0 CET} + {449622000 7200 1 CEST} + {457480800 7200 0 CEST} + {465354000 3600 0 CET} + {481078800 7200 1 CEST} + {496803600 3600 0 CET} + {512528400 7200 1 CEST} + {528253200 3600 0 CET} + {543978000 7200 1 CEST} + {559702800 3600 0 CET} + {575427600 7200 1 CEST} + {591152400 3600 0 CET} + {606877200 7200 1 CEST} + {622602000 3600 0 CET} + {638326800 7200 1 CEST} + {654656400 3600 0 CET} + {670381200 7200 1 CEST} + {686106000 3600 0 CET} + {701830800 7200 1 CEST} + {717555600 3600 0 CET} + {733280400 7200 1 CEST} + {749005200 3600 0 CET} + {764730000 7200 1 CEST} + {780454800 3600 0 CET} + {796179600 7200 1 CEST} + {811904400 3600 0 CET} + {828234000 7200 1 CEST} + {846378000 3600 0 CET} + {859683600 7200 1 CEST} + {877827600 3600 0 CET} + {891133200 7200 1 CEST} + {909277200 3600 0 CET} + {922582800 7200 1 CEST} + {941331600 3600 0 CET} + {954032400 7200 1 CEST} + {972781200 3600 0 CET} + {985482000 7200 1 CEST} + {1004230800 3600 0 CET} + {1017536400 7200 1 CEST} + {1035680400 3600 0 CET} + {1048986000 7200 1 CEST} + {1067130000 3600 0 CET} + {1080435600 7200 1 CEST} + {1099184400 3600 0 CET} + {1111885200 7200 1 CEST} + {1130634000 3600 0 CET} + {1143334800 7200 1 CEST} + {1162083600 3600 0 CET} + {1174784400 7200 1 CEST} + {1193533200 3600 0 CET} + {1206838800 7200 1 CEST} + {1224982800 3600 0 CET} + {1238288400 7200 1 CEST} + {1256432400 3600 0 CET} + {1269738000 7200 1 CEST} + {1288486800 3600 0 CET} + {1301187600 7200 1 CEST} + {1319936400 3600 0 CET} + {1332637200 7200 1 CEST} + {1351386000 3600 0 CET} + {1364691600 7200 1 CEST} + {1382835600 3600 0 CET} + {1396141200 7200 1 CEST} + {1414285200 3600 0 CET} + {1427590800 7200 1 CEST} + {1445734800 3600 0 CET} + {1459040400 7200 1 CEST} + {1477789200 3600 0 CET} + {1490490000 7200 1 CEST} + {1509238800 3600 0 CET} + {1521939600 7200 1 CEST} + {1540688400 3600 0 CET} + {1553994000 7200 1 CEST} + {1572138000 3600 0 CET} + {1585443600 7200 1 CEST} + {1603587600 3600 0 CET} + {1616893200 7200 1 CEST} + {1635642000 3600 0 CET} + {1648342800 7200 1 CEST} + {1667091600 3600 0 CET} + {1679792400 7200 1 CEST} + {1698541200 3600 0 CET} + {1711846800 7200 1 CEST} + {1729990800 3600 0 CET} + {1743296400 7200 1 CEST} + {1761440400 3600 0 CET} + {1774746000 7200 1 CEST} + {1792890000 3600 0 CET} + {1806195600 7200 1 CEST} + {1824944400 3600 0 CET} + {1837645200 7200 1 CEST} + {1856394000 3600 0 CET} + {1869094800 7200 1 CEST} + {1887843600 3600 0 CET} + {1901149200 7200 1 CEST} + {1919293200 3600 0 CET} + {1932598800 7200 1 CEST} + {1950742800 3600 0 CET} + {1964048400 7200 1 CEST} + {1982797200 3600 0 CET} + {1995498000 7200 1 CEST} + {2014246800 3600 0 CET} + {2026947600 7200 1 CEST} + {2045696400 3600 0 CET} + {2058397200 7200 1 CEST} + {2077146000 3600 0 CET} + {2090451600 7200 1 CEST} + {2108595600 3600 0 CET} + {2121901200 7200 1 CEST} + {2140045200 3600 0 CET} + {2153350800 7200 1 CEST} + {2172099600 3600 0 CET} + {2184800400 7200 1 CEST} + {2203549200 3600 0 CET} + {2216250000 7200 1 CEST} + {2234998800 3600 0 CET} + {2248304400 7200 1 CEST} + {2266448400 3600 0 CET} + {2279754000 7200 1 CEST} + {2297898000 3600 0 CET} + {2311203600 7200 1 CEST} + {2329347600 3600 0 CET} + {2342653200 7200 1 CEST} + {2361402000 3600 0 CET} + {2374102800 7200 1 CEST} + {2392851600 3600 0 CET} + {2405552400 7200 1 CEST} + {2424301200 3600 0 CET} + {2437606800 7200 1 CEST} + {2455750800 3600 0 CET} + {2469056400 7200 1 CEST} + {2487200400 3600 0 CET} + {2500506000 7200 1 CEST} + {2519254800 3600 0 CET} + {2531955600 7200 1 CEST} + {2550704400 3600 0 CET} + {2563405200 7200 1 CEST} + {2582154000 3600 0 CET} + {2595459600 7200 1 CEST} + {2613603600 3600 0 CET} + {2626909200 7200 1 CEST} + {2645053200 3600 0 CET} + {2658358800 7200 1 CEST} + {2676502800 3600 0 CET} + {2689808400 7200 1 CEST} + {2708557200 3600 0 CET} + {2721258000 7200 1 CEST} + {2740006800 3600 0 CET} + {2752707600 7200 1 CEST} + {2771456400 3600 0 CET} + {2784762000 7200 1 CEST} + {2802906000 3600 0 CET} + {2816211600 7200 1 CEST} + {2834355600 3600 0 CET} + {2847661200 7200 1 CEST} + {2866410000 3600 0 CET} + {2879110800 7200 1 CEST} + {2897859600 3600 0 CET} + {2910560400 7200 1 CEST} + {2929309200 3600 0 CET} + {2942010000 7200 1 CEST} + {2960758800 3600 0 CET} + {2974064400 7200 1 CEST} + {2992208400 3600 0 CET} + {3005514000 7200 1 CEST} + {3023658000 3600 0 CET} + {3036963600 7200 1 CEST} + {3055712400 3600 0 CET} + {3068413200 7200 1 CEST} + {3087162000 3600 0 CET} + {3099862800 7200 1 CEST} + {3118611600 3600 0 CET} + {3131917200 7200 1 CEST} + {3150061200 3600 0 CET} + {3163366800 7200 1 CEST} + {3181510800 3600 0 CET} + {3194816400 7200 1 CEST} + {3212960400 3600 0 CET} + {3226266000 7200 1 CEST} + {3245014800 3600 0 CET} + {3257715600 7200 1 CEST} + {3276464400 3600 0 CET} + {3289165200 7200 1 CEST} + {3307914000 3600 0 CET} + {3321219600 7200 1 CEST} + {3339363600 3600 0 CET} + {3352669200 7200 1 CEST} + {3370813200 3600 0 CET} + {3384118800 7200 1 CEST} + {3402867600 3600 0 CET} + {3415568400 7200 1 CEST} + {3434317200 3600 0 CET} + {3447018000 7200 1 CEST} + {3465766800 3600 0 CET} + {3479072400 7200 1 CEST} + {3497216400 3600 0 CET} + {3510522000 7200 1 CEST} + {3528666000 3600 0 CET} + {3541971600 7200 1 CEST} + {3560115600 3600 0 CET} + {3573421200 7200 1 CEST} + {3592170000 3600 0 CET} + {3604870800 7200 1 CEST} + {3623619600 3600 0 CET} + {3636320400 7200 1 CEST} + {3655069200 3600 0 CET} + {3668374800 7200 1 CEST} + {3686518800 3600 0 CET} + {3699824400 7200 1 CEST} + {3717968400 3600 0 CET} + {3731274000 7200 1 CEST} + {3750022800 3600 0 CET} + {3762723600 7200 1 CEST} + {3781472400 3600 0 CET} + {3794173200 7200 1 CEST} + {3812922000 3600 0 CET} + {3825622800 7200 1 CEST} + {3844371600 3600 0 CET} + {3857677200 7200 1 CEST} + {3875821200 3600 0 CET} + {3889126800 7200 1 CEST} + {3907270800 3600 0 CET} + {3920576400 7200 1 CEST} + {3939325200 3600 0 CET} + {3952026000 7200 1 CEST} + {3970774800 3600 0 CET} + {3983475600 7200 1 CEST} + {4002224400 3600 0 CET} + {4015530000 7200 1 CEST} + {4033674000 3600 0 CET} + {4046979600 7200 1 CEST} + {4065123600 3600 0 CET} + {4078429200 7200 1 CEST} + {4096573200 3600 0 CET} +} diff --git a/env/tcl/tcl8.6/tzdata/Europe/Tiraspol b/env/tcl/tcl8.6/tzdata/Europe/Tiraspol new file mode 100644 index 0000000..ea8f671 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Europe/Tiraspol @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(Europe/Chisinau)]} { + LoadTimeZoneFile Europe/Chisinau +} +set TZData(:Europe/Tiraspol) $TZData(:Europe/Chisinau) diff --git a/env/tcl/tcl8.6/tzdata/Europe/Ulyanovsk b/env/tcl/tcl8.6/tzdata/Europe/Ulyanovsk new file mode 100644 index 0000000..8fb3f9e --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Europe/Ulyanovsk @@ -0,0 +1,73 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Europe/Ulyanovsk) { + {-9223372036854775808 11616 0 LMT} + {-1593820800 10800 0 +03} + {-1247540400 14400 0 +05} + {354916800 18000 1 +05} + {370724400 14400 0 +04} + {386452800 18000 1 +05} + {402260400 14400 0 +04} + {417988800 18000 1 +05} + {433796400 14400 0 +04} + {449611200 18000 1 +05} + {465343200 14400 0 +04} + {481068000 18000 1 +05} + {496792800 14400 0 +04} + {512517600 18000 1 +05} + {528242400 14400 0 +04} + {543967200 18000 1 +05} + {559692000 14400 0 +04} + {575416800 18000 1 +05} + {591141600 14400 0 +04} + {606866400 10800 0 +04} + {606870000 14400 1 +04} + {622594800 10800 0 +03} + {638319600 14400 1 +04} + {654649200 10800 0 +03} + {670374000 7200 0 +03} + {670377600 10800 1 +03} + {686102400 7200 0 +02} + {695779200 10800 0 +04} + {701823600 14400 1 +04} + {717548400 10800 0 +03} + {733273200 14400 1 +04} + {748998000 10800 0 +03} + {764722800 14400 1 +04} + {780447600 10800 0 +03} + {796172400 14400 1 +04} + {811897200 10800 0 +03} + {828226800 14400 1 +04} + {846370800 10800 0 +03} + {859676400 14400 1 +04} + {877820400 10800 0 +03} + {891126000 14400 1 +04} + {909270000 10800 0 +03} + {922575600 14400 1 +04} + {941324400 10800 0 +03} + {954025200 14400 1 +04} + {972774000 10800 0 +03} + {985474800 14400 1 +04} + {1004223600 10800 0 +03} + {1017529200 14400 1 +04} + {1035673200 10800 0 +03} + {1048978800 14400 1 +04} + {1067122800 10800 0 +03} + {1080428400 14400 1 +04} + {1099177200 10800 0 +03} + {1111878000 14400 1 +04} + {1130626800 10800 0 +03} + {1143327600 14400 1 +04} + {1162076400 10800 0 +03} + {1174777200 14400 1 +04} + {1193526000 10800 0 +03} + {1206831600 14400 1 +04} + {1224975600 10800 0 +03} + {1238281200 14400 1 +04} + {1256425200 10800 0 +03} + {1269730800 14400 1 +04} + {1288479600 10800 0 +03} + {1301180400 14400 0 +04} + {1414274400 10800 0 +03} + {1459033200 14400 0 +04} +} diff --git a/env/tcl/tcl8.6/tzdata/Europe/Uzhgorod b/env/tcl/tcl8.6/tzdata/Europe/Uzhgorod new file mode 100644 index 0000000..f6e580b --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Europe/Uzhgorod @@ -0,0 +1,254 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Europe/Uzhgorod) { + {-9223372036854775808 5352 0 LMT} + {-2500939752 3600 0 CET} + {-946774800 3600 0 CET} + {-938905200 7200 1 CEST} + {-857257200 3600 0 CET} + {-844556400 7200 1 CEST} + {-828226800 3600 0 CET} + {-812502000 7200 1 CEST} + {-796870800 7200 1 CEST} + {-794714400 3600 0 CET} + {-773456400 10800 0 MSD} + {354920400 14400 1 MSD} + {370728000 10800 0 MSK} + {386456400 14400 1 MSD} + {402264000 10800 0 MSK} + {417992400 14400 1 MSD} + {433800000 10800 0 MSK} + {449614800 14400 1 MSD} + {465346800 10800 0 MSK} + {481071600 14400 1 MSD} + {496796400 10800 0 MSK} + {512521200 14400 1 MSD} + {528246000 10800 0 MSK} + {543970800 14400 1 MSD} + {559695600 10800 0 MSK} + {575420400 14400 1 MSD} + {591145200 10800 0 MSK} + {606870000 14400 1 MSD} + {622594800 10800 0 MSK} + {631141200 10800 0 MSK} + {646786800 3600 0 CET} + {670384800 7200 0 EET} + {694216800 7200 0 EET} + {701820000 10800 1 EEST} + {717541200 7200 0 EET} + {733269600 10800 1 EEST} + {748990800 7200 0 EET} + {764719200 10800 1 EEST} + {780440400 7200 0 EET} + {788911200 7200 0 EET} + {796179600 10800 1 EEST} + {811904400 7200 0 EET} + {828234000 10800 1 EEST} + {846378000 7200 0 EET} + {859683600 10800 1 EEST} + {877827600 7200 0 EET} + {891133200 10800 1 EEST} + {909277200 7200 0 EET} + {922582800 10800 1 EEST} + {941331600 7200 0 EET} + {954032400 10800 1 EEST} + {972781200 7200 0 EET} + {985482000 10800 1 EEST} + {1004230800 7200 0 EET} + {1017536400 10800 1 EEST} + {1035680400 7200 0 EET} + {1048986000 10800 1 EEST} + {1067130000 7200 0 EET} + {1080435600 10800 1 EEST} + {1099184400 7200 0 EET} + {1111885200 10800 1 EEST} + {1130634000 7200 0 EET} + {1143334800 10800 1 EEST} + {1162083600 7200 0 EET} + {1174784400 10800 1 EEST} + {1193533200 7200 0 EET} + {1206838800 10800 1 EEST} + {1224982800 7200 0 EET} + {1238288400 10800 1 EEST} + {1256432400 7200 0 EET} + {1269738000 10800 1 EEST} + {1288486800 7200 0 EET} + {1301187600 10800 1 EEST} + {1319936400 7200 0 EET} + {1332637200 10800 1 EEST} + {1351386000 7200 0 EET} + {1364691600 10800 1 EEST} + {1382835600 7200 0 EET} + {1396141200 10800 1 EEST} + {1414285200 7200 0 EET} + {1427590800 10800 1 EEST} + {1445734800 7200 0 EET} + {1459040400 10800 1 EEST} + {1477789200 7200 0 EET} + {1490490000 10800 1 EEST} + {1509238800 7200 0 EET} + {1521939600 10800 1 EEST} + {1540688400 7200 0 EET} + {1553994000 10800 1 EEST} + {1572138000 7200 0 EET} + {1585443600 10800 1 EEST} + {1603587600 7200 0 EET} + {1616893200 10800 1 EEST} + {1635642000 7200 0 EET} + {1648342800 10800 1 EEST} + {1667091600 7200 0 EET} + {1679792400 10800 1 EEST} + {1698541200 7200 0 EET} + {1711846800 10800 1 EEST} + {1729990800 7200 0 EET} + {1743296400 10800 1 EEST} + {1761440400 7200 0 EET} + {1774746000 10800 1 EEST} + {1792890000 7200 0 EET} + {1806195600 10800 1 EEST} + {1824944400 7200 0 EET} + {1837645200 10800 1 EEST} + {1856394000 7200 0 EET} + {1869094800 10800 1 EEST} + {1887843600 7200 0 EET} + {1901149200 10800 1 EEST} + {1919293200 7200 0 EET} + {1932598800 10800 1 EEST} + {1950742800 7200 0 EET} + {1964048400 10800 1 EEST} + {1982797200 7200 0 EET} + {1995498000 10800 1 EEST} + {2014246800 7200 0 EET} + {2026947600 10800 1 EEST} + {2045696400 7200 0 EET} + {2058397200 10800 1 EEST} + {2077146000 7200 0 EET} + {2090451600 10800 1 EEST} + {2108595600 7200 0 EET} + {2121901200 10800 1 EEST} + {2140045200 7200 0 EET} + {2153350800 10800 1 EEST} + {2172099600 7200 0 EET} + {2184800400 10800 1 EEST} + {2203549200 7200 0 EET} + {2216250000 10800 1 EEST} + {2234998800 7200 0 EET} + {2248304400 10800 1 EEST} + {2266448400 7200 0 EET} + {2279754000 10800 1 EEST} + {2297898000 7200 0 EET} + {2311203600 10800 1 EEST} + {2329347600 7200 0 EET} + {2342653200 10800 1 EEST} + {2361402000 7200 0 EET} + {2374102800 10800 1 EEST} + {2392851600 7200 0 EET} + {2405552400 10800 1 EEST} + {2424301200 7200 0 EET} + {2437606800 10800 1 EEST} + {2455750800 7200 0 EET} + {2469056400 10800 1 EEST} + {2487200400 7200 0 EET} + {2500506000 10800 1 EEST} + {2519254800 7200 0 EET} + {2531955600 10800 1 EEST} + {2550704400 7200 0 EET} + {2563405200 10800 1 EEST} + {2582154000 7200 0 EET} + {2595459600 10800 1 EEST} + {2613603600 7200 0 EET} + {2626909200 10800 1 EEST} + {2645053200 7200 0 EET} + {2658358800 10800 1 EEST} + {2676502800 7200 0 EET} + {2689808400 10800 1 EEST} + {2708557200 7200 0 EET} + {2721258000 10800 1 EEST} + {2740006800 7200 0 EET} + {2752707600 10800 1 EEST} + {2771456400 7200 0 EET} + {2784762000 10800 1 EEST} + {2802906000 7200 0 EET} + {2816211600 10800 1 EEST} + {2834355600 7200 0 EET} + {2847661200 10800 1 EEST} + {2866410000 7200 0 EET} + {2879110800 10800 1 EEST} + {2897859600 7200 0 EET} + {2910560400 10800 1 EEST} + {2929309200 7200 0 EET} + {2942010000 10800 1 EEST} + {2960758800 7200 0 EET} + {2974064400 10800 1 EEST} + {2992208400 7200 0 EET} + {3005514000 10800 1 EEST} + {3023658000 7200 0 EET} + {3036963600 10800 1 EEST} + {3055712400 7200 0 EET} + {3068413200 10800 1 EEST} + {3087162000 7200 0 EET} + {3099862800 10800 1 EEST} + {3118611600 7200 0 EET} + {3131917200 10800 1 EEST} + {3150061200 7200 0 EET} + {3163366800 10800 1 EEST} + {3181510800 7200 0 EET} + {3194816400 10800 1 EEST} + {3212960400 7200 0 EET} + {3226266000 10800 1 EEST} + {3245014800 7200 0 EET} + {3257715600 10800 1 EEST} + {3276464400 7200 0 EET} + {3289165200 10800 1 EEST} + {3307914000 7200 0 EET} + {3321219600 10800 1 EEST} + {3339363600 7200 0 EET} + {3352669200 10800 1 EEST} + {3370813200 7200 0 EET} + {3384118800 10800 1 EEST} + {3402867600 7200 0 EET} + {3415568400 10800 1 EEST} + {3434317200 7200 0 EET} + {3447018000 10800 1 EEST} + {3465766800 7200 0 EET} + {3479072400 10800 1 EEST} + {3497216400 7200 0 EET} + {3510522000 10800 1 EEST} + {3528666000 7200 0 EET} + {3541971600 10800 1 EEST} + {3560115600 7200 0 EET} + {3573421200 10800 1 EEST} + {3592170000 7200 0 EET} + {3604870800 10800 1 EEST} + {3623619600 7200 0 EET} + {3636320400 10800 1 EEST} + {3655069200 7200 0 EET} + {3668374800 10800 1 EEST} + {3686518800 7200 0 EET} + {3699824400 10800 1 EEST} + {3717968400 7200 0 EET} + {3731274000 10800 1 EEST} + {3750022800 7200 0 EET} + {3762723600 10800 1 EEST} + {3781472400 7200 0 EET} + {3794173200 10800 1 EEST} + {3812922000 7200 0 EET} + {3825622800 10800 1 EEST} + {3844371600 7200 0 EET} + {3857677200 10800 1 EEST} + {3875821200 7200 0 EET} + {3889126800 10800 1 EEST} + {3907270800 7200 0 EET} + {3920576400 10800 1 EEST} + {3939325200 7200 0 EET} + {3952026000 10800 1 EEST} + {3970774800 7200 0 EET} + {3983475600 10800 1 EEST} + {4002224400 7200 0 EET} + {4015530000 10800 1 EEST} + {4033674000 7200 0 EET} + {4046979600 10800 1 EEST} + {4065123600 7200 0 EET} + {4078429200 10800 1 EEST} + {4096573200 7200 0 EET} +} diff --git a/env/tcl/tcl8.6/tzdata/Europe/Vaduz b/env/tcl/tcl8.6/tzdata/Europe/Vaduz new file mode 100644 index 0000000..095e018 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Europe/Vaduz @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(Europe/Zurich)]} { + LoadTimeZoneFile Europe/Zurich +} +set TZData(:Europe/Vaduz) $TZData(:Europe/Zurich) diff --git a/env/tcl/tcl8.6/tzdata/Europe/Vatican b/env/tcl/tcl8.6/tzdata/Europe/Vatican new file mode 100644 index 0000000..fe50765 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Europe/Vatican @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(Europe/Rome)]} { + LoadTimeZoneFile Europe/Rome +} +set TZData(:Europe/Vatican) $TZData(:Europe/Rome) diff --git a/env/tcl/tcl8.6/tzdata/Europe/Vienna b/env/tcl/tcl8.6/tzdata/Europe/Vienna new file mode 100644 index 0000000..95283eb --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Europe/Vienna @@ -0,0 +1,271 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Europe/Vienna) { + {-9223372036854775808 3921 0 LMT} + {-2422055121 3600 0 CET} + {-1693706400 7200 1 CEST} + {-1680483600 3600 0 CET} + {-1663455600 7200 1 CEST} + {-1650150000 3600 0 CET} + {-1632006000 7200 1 CEST} + {-1618700400 3600 0 CET} + {-1577926800 3600 0 CET} + {-1569711600 7200 1 CEST} + {-1555801200 3600 0 CET} + {-938905200 7200 0 CEST} + {-857257200 3600 0 CET} + {-844556400 7200 1 CEST} + {-828226800 3600 0 CET} + {-812502000 7200 1 CEST} + {-796777200 3600 0 CET} + {-781052400 7200 1 CEST} + {-780188400 3600 0 CET} + {-757386000 3600 0 CET} + {-748479600 7200 1 CEST} + {-733359600 3600 0 CET} + {-717634800 7200 1 CEST} + {-701910000 3600 0 CET} + {-684975600 7200 1 CEST} + {-670460400 3600 0 CET} + {323823600 7200 1 CEST} + {338940000 3600 0 CET} + {347151600 3600 0 CET} + {354675600 7200 1 CEST} + {370400400 3600 0 CET} + {386125200 7200 1 CEST} + {401850000 3600 0 CET} + {417574800 7200 1 CEST} + {433299600 3600 0 CET} + {449024400 7200 1 CEST} + {465354000 3600 0 CET} + {481078800 7200 1 CEST} + {496803600 3600 0 CET} + {512528400 7200 1 CEST} + {528253200 3600 0 CET} + {543978000 7200 1 CEST} + {559702800 3600 0 CET} + {575427600 7200 1 CEST} + {591152400 3600 0 CET} + {606877200 7200 1 CEST} + {622602000 3600 0 CET} + {638326800 7200 1 CEST} + {654656400 3600 0 CET} + {670381200 7200 1 CEST} + {686106000 3600 0 CET} + {701830800 7200 1 CEST} + {717555600 3600 0 CET} + {733280400 7200 1 CEST} + {749005200 3600 0 CET} + {764730000 7200 1 CEST} + {780454800 3600 0 CET} + {796179600 7200 1 CEST} + {811904400 3600 0 CET} + {828234000 7200 1 CEST} + {846378000 3600 0 CET} + {859683600 7200 1 CEST} + {877827600 3600 0 CET} + {891133200 7200 1 CEST} + {909277200 3600 0 CET} + {922582800 7200 1 CEST} + {941331600 3600 0 CET} + {954032400 7200 1 CEST} + {972781200 3600 0 CET} + {985482000 7200 1 CEST} + {1004230800 3600 0 CET} + {1017536400 7200 1 CEST} + {1035680400 3600 0 CET} + {1048986000 7200 1 CEST} + {1067130000 3600 0 CET} + {1080435600 7200 1 CEST} + {1099184400 3600 0 CET} + {1111885200 7200 1 CEST} + {1130634000 3600 0 CET} + {1143334800 7200 1 CEST} + {1162083600 3600 0 CET} + {1174784400 7200 1 CEST} + {1193533200 3600 0 CET} + {1206838800 7200 1 CEST} + {1224982800 3600 0 CET} + {1238288400 7200 1 CEST} + {1256432400 3600 0 CET} + {1269738000 7200 1 CEST} + {1288486800 3600 0 CET} + {1301187600 7200 1 CEST} + {1319936400 3600 0 CET} + {1332637200 7200 1 CEST} + {1351386000 3600 0 CET} + {1364691600 7200 1 CEST} + {1382835600 3600 0 CET} + {1396141200 7200 1 CEST} + {1414285200 3600 0 CET} + {1427590800 7200 1 CEST} + {1445734800 3600 0 CET} + {1459040400 7200 1 CEST} + {1477789200 3600 0 CET} + {1490490000 7200 1 CEST} + {1509238800 3600 0 CET} + {1521939600 7200 1 CEST} + {1540688400 3600 0 CET} + {1553994000 7200 1 CEST} + {1572138000 3600 0 CET} + {1585443600 7200 1 CEST} + {1603587600 3600 0 CET} + {1616893200 7200 1 CEST} + {1635642000 3600 0 CET} + {1648342800 7200 1 CEST} + {1667091600 3600 0 CET} + {1679792400 7200 1 CEST} + {1698541200 3600 0 CET} + {1711846800 7200 1 CEST} + {1729990800 3600 0 CET} + {1743296400 7200 1 CEST} + {1761440400 3600 0 CET} + {1774746000 7200 1 CEST} + {1792890000 3600 0 CET} + {1806195600 7200 1 CEST} + {1824944400 3600 0 CET} + {1837645200 7200 1 CEST} + {1856394000 3600 0 CET} + {1869094800 7200 1 CEST} + {1887843600 3600 0 CET} + {1901149200 7200 1 CEST} + {1919293200 3600 0 CET} + {1932598800 7200 1 CEST} + {1950742800 3600 0 CET} + {1964048400 7200 1 CEST} + {1982797200 3600 0 CET} + {1995498000 7200 1 CEST} + {2014246800 3600 0 CET} + {2026947600 7200 1 CEST} + {2045696400 3600 0 CET} + {2058397200 7200 1 CEST} + {2077146000 3600 0 CET} + {2090451600 7200 1 CEST} + {2108595600 3600 0 CET} + {2121901200 7200 1 CEST} + {2140045200 3600 0 CET} + {2153350800 7200 1 CEST} + {2172099600 3600 0 CET} + {2184800400 7200 1 CEST} + {2203549200 3600 0 CET} + {2216250000 7200 1 CEST} + {2234998800 3600 0 CET} + {2248304400 7200 1 CEST} + {2266448400 3600 0 CET} + {2279754000 7200 1 CEST} + {2297898000 3600 0 CET} + {2311203600 7200 1 CEST} + {2329347600 3600 0 CET} + {2342653200 7200 1 CEST} + {2361402000 3600 0 CET} + {2374102800 7200 1 CEST} + {2392851600 3600 0 CET} + {2405552400 7200 1 CEST} + {2424301200 3600 0 CET} + {2437606800 7200 1 CEST} + {2455750800 3600 0 CET} + {2469056400 7200 1 CEST} + {2487200400 3600 0 CET} + {2500506000 7200 1 CEST} + {2519254800 3600 0 CET} + {2531955600 7200 1 CEST} + {2550704400 3600 0 CET} + {2563405200 7200 1 CEST} + {2582154000 3600 0 CET} + {2595459600 7200 1 CEST} + {2613603600 3600 0 CET} + {2626909200 7200 1 CEST} + {2645053200 3600 0 CET} + {2658358800 7200 1 CEST} + {2676502800 3600 0 CET} + {2689808400 7200 1 CEST} + {2708557200 3600 0 CET} + {2721258000 7200 1 CEST} + {2740006800 3600 0 CET} + {2752707600 7200 1 CEST} + {2771456400 3600 0 CET} + {2784762000 7200 1 CEST} + {2802906000 3600 0 CET} + {2816211600 7200 1 CEST} + {2834355600 3600 0 CET} + {2847661200 7200 1 CEST} + {2866410000 3600 0 CET} + {2879110800 7200 1 CEST} + {2897859600 3600 0 CET} + {2910560400 7200 1 CEST} + {2929309200 3600 0 CET} + {2942010000 7200 1 CEST} + {2960758800 3600 0 CET} + {2974064400 7200 1 CEST} + {2992208400 3600 0 CET} + {3005514000 7200 1 CEST} + {3023658000 3600 0 CET} + {3036963600 7200 1 CEST} + {3055712400 3600 0 CET} + {3068413200 7200 1 CEST} + {3087162000 3600 0 CET} + {3099862800 7200 1 CEST} + {3118611600 3600 0 CET} + {3131917200 7200 1 CEST} + {3150061200 3600 0 CET} + {3163366800 7200 1 CEST} + {3181510800 3600 0 CET} + {3194816400 7200 1 CEST} + {3212960400 3600 0 CET} + {3226266000 7200 1 CEST} + {3245014800 3600 0 CET} + {3257715600 7200 1 CEST} + {3276464400 3600 0 CET} + {3289165200 7200 1 CEST} + {3307914000 3600 0 CET} + {3321219600 7200 1 CEST} + {3339363600 3600 0 CET} + {3352669200 7200 1 CEST} + {3370813200 3600 0 CET} + {3384118800 7200 1 CEST} + {3402867600 3600 0 CET} + {3415568400 7200 1 CEST} + {3434317200 3600 0 CET} + {3447018000 7200 1 CEST} + {3465766800 3600 0 CET} + {3479072400 7200 1 CEST} + {3497216400 3600 0 CET} + {3510522000 7200 1 CEST} + {3528666000 3600 0 CET} + {3541971600 7200 1 CEST} + {3560115600 3600 0 CET} + {3573421200 7200 1 CEST} + {3592170000 3600 0 CET} + {3604870800 7200 1 CEST} + {3623619600 3600 0 CET} + {3636320400 7200 1 CEST} + {3655069200 3600 0 CET} + {3668374800 7200 1 CEST} + {3686518800 3600 0 CET} + {3699824400 7200 1 CEST} + {3717968400 3600 0 CET} + {3731274000 7200 1 CEST} + {3750022800 3600 0 CET} + {3762723600 7200 1 CEST} + {3781472400 3600 0 CET} + {3794173200 7200 1 CEST} + {3812922000 3600 0 CET} + {3825622800 7200 1 CEST} + {3844371600 3600 0 CET} + {3857677200 7200 1 CEST} + {3875821200 3600 0 CET} + {3889126800 7200 1 CEST} + {3907270800 3600 0 CET} + {3920576400 7200 1 CEST} + {3939325200 3600 0 CET} + {3952026000 7200 1 CEST} + {3970774800 3600 0 CET} + {3983475600 7200 1 CEST} + {4002224400 3600 0 CET} + {4015530000 7200 1 CEST} + {4033674000 3600 0 CET} + {4046979600 7200 1 CEST} + {4065123600 3600 0 CET} + {4078429200 7200 1 CEST} + {4096573200 3600 0 CET} +} diff --git a/env/tcl/tcl8.6/tzdata/Europe/Vilnius b/env/tcl/tcl8.6/tzdata/Europe/Vilnius new file mode 100644 index 0000000..5e73150 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Europe/Vilnius @@ -0,0 +1,252 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Europe/Vilnius) { + {-9223372036854775808 6076 0 LMT} + {-2840146876 5040 0 WMT} + {-1672536240 5736 0 KMT} + {-1585100136 3600 0 CET} + {-1561251600 7200 0 EET} + {-1553565600 3600 0 CET} + {-928198800 10800 0 MSK} + {-900126000 3600 0 CET} + {-857257200 3600 0 CET} + {-844556400 7200 1 CEST} + {-828226800 3600 0 CET} + {-812502000 7200 1 CEST} + {-802141200 10800 0 MSD} + {354920400 14400 1 MSD} + {370728000 10800 0 MSK} + {386456400 14400 1 MSD} + {402264000 10800 0 MSK} + {417992400 14400 1 MSD} + {433800000 10800 0 MSK} + {449614800 14400 1 MSD} + {465346800 10800 0 MSK} + {481071600 14400 1 MSD} + {496796400 10800 0 MSK} + {512521200 14400 1 MSD} + {528246000 10800 0 MSK} + {543970800 14400 1 MSD} + {559695600 10800 0 MSK} + {575420400 14400 1 MSD} + {591145200 10800 0 MSK} + {606870000 7200 0 EEMMTT} + {606873600 10800 1 EEST} + {622598400 7200 0 EET} + {638323200 10800 1 EEST} + {654652800 7200 0 EET} + {670377600 10800 1 EEST} + {686102400 7200 0 EET} + {701827200 10800 1 EEST} + {717552000 7200 0 EET} + {733276800 10800 1 EEST} + {749001600 7200 0 EET} + {764726400 10800 1 EEST} + {780451200 7200 0 EET} + {796176000 10800 1 EEST} + {811900800 7200 0 EET} + {828230400 10800 1 EEST} + {846374400 7200 0 EET} + {859680000 10800 1 EEST} + {877824000 7200 0 EET} + {883605600 7200 0 EET} + {891133200 7200 0 CEST} + {909277200 3600 0 CET} + {922582800 7200 1 CEST} + {941331600 7200 0 EET} + {1041372000 7200 0 EET} + {1048986000 10800 1 EEST} + {1067130000 7200 0 EET} + {1080435600 10800 1 EEST} + {1099184400 7200 0 EET} + {1111885200 10800 1 EEST} + {1130634000 7200 0 EET} + {1143334800 10800 1 EEST} + {1162083600 7200 0 EET} + {1174784400 10800 1 EEST} + {1193533200 7200 0 EET} + {1206838800 10800 1 EEST} + {1224982800 7200 0 EET} + {1238288400 10800 1 EEST} + {1256432400 7200 0 EET} + {1269738000 10800 1 EEST} + {1288486800 7200 0 EET} + {1301187600 10800 1 EEST} + {1319936400 7200 0 EET} + {1332637200 10800 1 EEST} + {1351386000 7200 0 EET} + {1364691600 10800 1 EEST} + {1382835600 7200 0 EET} + {1396141200 10800 1 EEST} + {1414285200 7200 0 EET} + {1427590800 10800 1 EEST} + {1445734800 7200 0 EET} + {1459040400 10800 1 EEST} + {1477789200 7200 0 EET} + {1490490000 10800 1 EEST} + {1509238800 7200 0 EET} + {1521939600 10800 1 EEST} + {1540688400 7200 0 EET} + {1553994000 10800 1 EEST} + {1572138000 7200 0 EET} + {1585443600 10800 1 EEST} + {1603587600 7200 0 EET} + {1616893200 10800 1 EEST} + {1635642000 7200 0 EET} + {1648342800 10800 1 EEST} + {1667091600 7200 0 EET} + {1679792400 10800 1 EEST} + {1698541200 7200 0 EET} + {1711846800 10800 1 EEST} + {1729990800 7200 0 EET} + {1743296400 10800 1 EEST} + {1761440400 7200 0 EET} + {1774746000 10800 1 EEST} + {1792890000 7200 0 EET} + {1806195600 10800 1 EEST} + {1824944400 7200 0 EET} + {1837645200 10800 1 EEST} + {1856394000 7200 0 EET} + {1869094800 10800 1 EEST} + {1887843600 7200 0 EET} + {1901149200 10800 1 EEST} + {1919293200 7200 0 EET} + {1932598800 10800 1 EEST} + {1950742800 7200 0 EET} + {1964048400 10800 1 EEST} + {1982797200 7200 0 EET} + {1995498000 10800 1 EEST} + {2014246800 7200 0 EET} + {2026947600 10800 1 EEST} + {2045696400 7200 0 EET} + {2058397200 10800 1 EEST} + {2077146000 7200 0 EET} + {2090451600 10800 1 EEST} + {2108595600 7200 0 EET} + {2121901200 10800 1 EEST} + {2140045200 7200 0 EET} + {2153350800 10800 1 EEST} + {2172099600 7200 0 EET} + {2184800400 10800 1 EEST} + {2203549200 7200 0 EET} + {2216250000 10800 1 EEST} + {2234998800 7200 0 EET} + {2248304400 10800 1 EEST} + {2266448400 7200 0 EET} + {2279754000 10800 1 EEST} + {2297898000 7200 0 EET} + {2311203600 10800 1 EEST} + {2329347600 7200 0 EET} + {2342653200 10800 1 EEST} + {2361402000 7200 0 EET} + {2374102800 10800 1 EEST} + {2392851600 7200 0 EET} + {2405552400 10800 1 EEST} + {2424301200 7200 0 EET} + {2437606800 10800 1 EEST} + {2455750800 7200 0 EET} + {2469056400 10800 1 EEST} + {2487200400 7200 0 EET} + {2500506000 10800 1 EEST} + {2519254800 7200 0 EET} + {2531955600 10800 1 EEST} + {2550704400 7200 0 EET} + {2563405200 10800 1 EEST} + {2582154000 7200 0 EET} + {2595459600 10800 1 EEST} + {2613603600 7200 0 EET} + {2626909200 10800 1 EEST} + {2645053200 7200 0 EET} + {2658358800 10800 1 EEST} + {2676502800 7200 0 EET} + {2689808400 10800 1 EEST} + {2708557200 7200 0 EET} + {2721258000 10800 1 EEST} + {2740006800 7200 0 EET} + {2752707600 10800 1 EEST} + {2771456400 7200 0 EET} + {2784762000 10800 1 EEST} + {2802906000 7200 0 EET} + {2816211600 10800 1 EEST} + {2834355600 7200 0 EET} + {2847661200 10800 1 EEST} + {2866410000 7200 0 EET} + {2879110800 10800 1 EEST} + {2897859600 7200 0 EET} + {2910560400 10800 1 EEST} + {2929309200 7200 0 EET} + {2942010000 10800 1 EEST} + {2960758800 7200 0 EET} + {2974064400 10800 1 EEST} + {2992208400 7200 0 EET} + {3005514000 10800 1 EEST} + {3023658000 7200 0 EET} + {3036963600 10800 1 EEST} + {3055712400 7200 0 EET} + {3068413200 10800 1 EEST} + {3087162000 7200 0 EET} + {3099862800 10800 1 EEST} + {3118611600 7200 0 EET} + {3131917200 10800 1 EEST} + {3150061200 7200 0 EET} + {3163366800 10800 1 EEST} + {3181510800 7200 0 EET} + {3194816400 10800 1 EEST} + {3212960400 7200 0 EET} + {3226266000 10800 1 EEST} + {3245014800 7200 0 EET} + {3257715600 10800 1 EEST} + {3276464400 7200 0 EET} + {3289165200 10800 1 EEST} + {3307914000 7200 0 EET} + {3321219600 10800 1 EEST} + {3339363600 7200 0 EET} + {3352669200 10800 1 EEST} + {3370813200 7200 0 EET} + {3384118800 10800 1 EEST} + {3402867600 7200 0 EET} + {3415568400 10800 1 EEST} + {3434317200 7200 0 EET} + {3447018000 10800 1 EEST} + {3465766800 7200 0 EET} + {3479072400 10800 1 EEST} + {3497216400 7200 0 EET} + {3510522000 10800 1 EEST} + {3528666000 7200 0 EET} + {3541971600 10800 1 EEST} + {3560115600 7200 0 EET} + {3573421200 10800 1 EEST} + {3592170000 7200 0 EET} + {3604870800 10800 1 EEST} + {3623619600 7200 0 EET} + {3636320400 10800 1 EEST} + {3655069200 7200 0 EET} + {3668374800 10800 1 EEST} + {3686518800 7200 0 EET} + {3699824400 10800 1 EEST} + {3717968400 7200 0 EET} + {3731274000 10800 1 EEST} + {3750022800 7200 0 EET} + {3762723600 10800 1 EEST} + {3781472400 7200 0 EET} + {3794173200 10800 1 EEST} + {3812922000 7200 0 EET} + {3825622800 10800 1 EEST} + {3844371600 7200 0 EET} + {3857677200 10800 1 EEST} + {3875821200 7200 0 EET} + {3889126800 10800 1 EEST} + {3907270800 7200 0 EET} + {3920576400 10800 1 EEST} + {3939325200 7200 0 EET} + {3952026000 10800 1 EEST} + {3970774800 7200 0 EET} + {3983475600 10800 1 EEST} + {4002224400 7200 0 EET} + {4015530000 10800 1 EEST} + {4033674000 7200 0 EET} + {4046979600 10800 1 EEST} + {4065123600 7200 0 EET} + {4078429200 10800 1 EEST} + {4096573200 7200 0 EET} +} diff --git a/env/tcl/tcl8.6/tzdata/Europe/Volgograd b/env/tcl/tcl8.6/tzdata/Europe/Volgograd new file mode 100644 index 0000000..3938683 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Europe/Volgograd @@ -0,0 +1,72 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Europe/Volgograd) { + {-9223372036854775808 10660 0 LMT} + {-1577761060 10800 0 +03} + {-1247540400 14400 0 +04} + {-256881600 14400 0 +05} + {354916800 18000 1 +05} + {370724400 14400 0 +04} + {386452800 18000 1 +05} + {402260400 14400 0 +04} + {417988800 18000 1 +05} + {433796400 14400 0 +04} + {449611200 18000 1 +05} + {465343200 14400 0 +04} + {481068000 18000 1 +05} + {496792800 14400 0 +04} + {512517600 18000 1 +05} + {528242400 14400 0 +04} + {543967200 18000 1 +05} + {559692000 14400 0 +04} + {575416800 10800 0 +04} + {575420400 14400 1 +04} + {591145200 10800 0 +03} + {606870000 14400 1 +04} + {622594800 10800 0 +03} + {638319600 14400 1 +04} + {654649200 10800 0 +03} + {670374000 14400 0 +04} + {701820000 10800 0 +04} + {701823600 14400 1 +04} + {717548400 10800 0 +03} + {733273200 14400 1 +04} + {748998000 10800 0 +03} + {764722800 14400 1 +04} + {780447600 10800 0 +03} + {796172400 14400 1 +04} + {811897200 10800 0 +03} + {828226800 14400 1 +04} + {846370800 10800 0 +03} + {859676400 14400 1 +04} + {877820400 10800 0 +03} + {891126000 14400 1 +04} + {909270000 10800 0 +03} + {922575600 14400 1 +04} + {941324400 10800 0 +03} + {954025200 14400 1 +04} + {972774000 10800 0 +03} + {985474800 14400 1 +04} + {1004223600 10800 0 +03} + {1017529200 14400 1 +04} + {1035673200 10800 0 +03} + {1048978800 14400 1 +04} + {1067122800 10800 0 +03} + {1080428400 14400 1 +04} + {1099177200 10800 0 +03} + {1111878000 14400 1 +04} + {1130626800 10800 0 +03} + {1143327600 14400 1 +04} + {1162076400 10800 0 +03} + {1174777200 14400 1 +04} + {1193526000 10800 0 +03} + {1206831600 14400 1 +04} + {1224975600 10800 0 +03} + {1238281200 14400 1 +04} + {1256425200 10800 0 +03} + {1269730800 14400 1 +04} + {1288479600 10800 0 +03} + {1301180400 14400 0 +04} + {1414274400 10800 0 +03} + {1540681200 14400 0 +04} +} diff --git a/env/tcl/tcl8.6/tzdata/Europe/Warsaw b/env/tcl/tcl8.6/tzdata/Europe/Warsaw new file mode 100644 index 0000000..6288a8a --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Europe/Warsaw @@ -0,0 +1,296 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Europe/Warsaw) { + {-9223372036854775808 5040 0 LMT} + {-2840145840 5040 0 WMT} + {-1717032240 3600 0 CET} + {-1693706400 7200 1 CEST} + {-1680483600 3600 0 CET} + {-1663455600 7200 1 CEST} + {-1650150000 3600 0 CET} + {-1632006000 7200 1 CEST} + {-1618696800 7200 0 EET} + {-1600473600 10800 1 EEST} + {-1587168000 7200 0 EET} + {-931734000 7200 0 CEST} + {-857257200 3600 0 CET} + {-844556400 7200 1 CEST} + {-828226800 3600 0 CET} + {-812502000 7200 1 CEST} + {-796870800 7200 0 CEST} + {-796608000 3600 0 CET} + {-778726800 7200 1 CEST} + {-762660000 3600 0 CET} + {-748486800 7200 1 CEST} + {-733273200 3600 0 CET} + {-715215600 7200 1 CEST} + {-701910000 3600 0 CET} + {-684975600 7200 1 CEST} + {-670460400 3600 0 CET} + {-654130800 7200 1 CEST} + {-639010800 3600 0 CET} + {-397094400 7200 1 CEST} + {-386812800 3600 0 CET} + {-371088000 7200 1 CEST} + {-355363200 3600 0 CET} + {-334195200 7200 1 CEST} + {-323308800 3600 0 CET} + {-307584000 7200 1 CEST} + {-291859200 3600 0 CET} + {-271296000 7200 1 CEST} + {-260409600 3600 0 CET} + {-239846400 7200 1 CEST} + {-228960000 3600 0 CET} + {-208396800 7200 1 CEST} + {-197510400 3600 0 CET} + {-176342400 7200 1 CEST} + {-166060800 3600 0 CET} + {220921200 3600 0 CET} + {228873600 7200 1 CEST} + {243993600 3600 0 CET} + {260323200 7200 1 CEST} + {276048000 3600 0 CET} + {291772800 7200 1 CEST} + {307497600 3600 0 CET} + {323827200 7200 1 CEST} + {338947200 3600 0 CET} + {354672000 7200 1 CEST} + {370396800 3600 0 CET} + {386121600 7200 1 CEST} + {401846400 3600 0 CET} + {417571200 7200 1 CEST} + {433296000 3600 0 CET} + {449020800 7200 1 CEST} + {465350400 3600 0 CET} + {481075200 7200 1 CEST} + {496800000 3600 0 CET} + {512524800 7200 1 CEST} + {528249600 3600 0 CET} + {543974400 7200 1 CEST} + {559699200 3600 0 CET} + {567990000 3600 0 CET} + {575427600 7200 1 CEST} + {591152400 3600 0 CET} + {606877200 7200 1 CEST} + {622602000 3600 0 CET} + {638326800 7200 1 CEST} + {654656400 3600 0 CET} + {670381200 7200 1 CEST} + {686106000 3600 0 CET} + {701830800 7200 1 CEST} + {717555600 3600 0 CET} + {733280400 7200 1 CEST} + {749005200 3600 0 CET} + {764730000 7200 1 CEST} + {780454800 3600 0 CET} + {796179600 7200 1 CEST} + {811904400 3600 0 CET} + {828234000 7200 1 CEST} + {846378000 3600 0 CET} + {859683600 7200 1 CEST} + {877827600 3600 0 CET} + {891133200 7200 1 CEST} + {909277200 3600 0 CET} + {922582800 7200 1 CEST} + {941331600 3600 0 CET} + {954032400 7200 1 CEST} + {972781200 3600 0 CET} + {985482000 7200 1 CEST} + {1004230800 3600 0 CET} + {1017536400 7200 1 CEST} + {1035680400 3600 0 CET} + {1048986000 7200 1 CEST} + {1067130000 3600 0 CET} + {1080435600 7200 1 CEST} + {1099184400 3600 0 CET} + {1111885200 7200 1 CEST} + {1130634000 3600 0 CET} + {1143334800 7200 1 CEST} + {1162083600 3600 0 CET} + {1174784400 7200 1 CEST} + {1193533200 3600 0 CET} + {1206838800 7200 1 CEST} + {1224982800 3600 0 CET} + {1238288400 7200 1 CEST} + {1256432400 3600 0 CET} + {1269738000 7200 1 CEST} + {1288486800 3600 0 CET} + {1301187600 7200 1 CEST} + {1319936400 3600 0 CET} + {1332637200 7200 1 CEST} + {1351386000 3600 0 CET} + {1364691600 7200 1 CEST} + {1382835600 3600 0 CET} + {1396141200 7200 1 CEST} + {1414285200 3600 0 CET} + {1427590800 7200 1 CEST} + {1445734800 3600 0 CET} + {1459040400 7200 1 CEST} + {1477789200 3600 0 CET} + {1490490000 7200 1 CEST} + {1509238800 3600 0 CET} + {1521939600 7200 1 CEST} + {1540688400 3600 0 CET} + {1553994000 7200 1 CEST} + {1572138000 3600 0 CET} + {1585443600 7200 1 CEST} + {1603587600 3600 0 CET} + {1616893200 7200 1 CEST} + {1635642000 3600 0 CET} + {1648342800 7200 1 CEST} + {1667091600 3600 0 CET} + {1679792400 7200 1 CEST} + {1698541200 3600 0 CET} + {1711846800 7200 1 CEST} + {1729990800 3600 0 CET} + {1743296400 7200 1 CEST} + {1761440400 3600 0 CET} + {1774746000 7200 1 CEST} + {1792890000 3600 0 CET} + {1806195600 7200 1 CEST} + {1824944400 3600 0 CET} + {1837645200 7200 1 CEST} + {1856394000 3600 0 CET} + {1869094800 7200 1 CEST} + {1887843600 3600 0 CET} + {1901149200 7200 1 CEST} + {1919293200 3600 0 CET} + {1932598800 7200 1 CEST} + {1950742800 3600 0 CET} + {1964048400 7200 1 CEST} + {1982797200 3600 0 CET} + {1995498000 7200 1 CEST} + {2014246800 3600 0 CET} + {2026947600 7200 1 CEST} + {2045696400 3600 0 CET} + {2058397200 7200 1 CEST} + {2077146000 3600 0 CET} + {2090451600 7200 1 CEST} + {2108595600 3600 0 CET} + {2121901200 7200 1 CEST} + {2140045200 3600 0 CET} + {2153350800 7200 1 CEST} + {2172099600 3600 0 CET} + {2184800400 7200 1 CEST} + {2203549200 3600 0 CET} + {2216250000 7200 1 CEST} + {2234998800 3600 0 CET} + {2248304400 7200 1 CEST} + {2266448400 3600 0 CET} + {2279754000 7200 1 CEST} + {2297898000 3600 0 CET} + {2311203600 7200 1 CEST} + {2329347600 3600 0 CET} + {2342653200 7200 1 CEST} + {2361402000 3600 0 CET} + {2374102800 7200 1 CEST} + {2392851600 3600 0 CET} + {2405552400 7200 1 CEST} + {2424301200 3600 0 CET} + {2437606800 7200 1 CEST} + {2455750800 3600 0 CET} + {2469056400 7200 1 CEST} + {2487200400 3600 0 CET} + {2500506000 7200 1 CEST} + {2519254800 3600 0 CET} + {2531955600 7200 1 CEST} + {2550704400 3600 0 CET} + {2563405200 7200 1 CEST} + {2582154000 3600 0 CET} + {2595459600 7200 1 CEST} + {2613603600 3600 0 CET} + {2626909200 7200 1 CEST} + {2645053200 3600 0 CET} + {2658358800 7200 1 CEST} + {2676502800 3600 0 CET} + {2689808400 7200 1 CEST} + {2708557200 3600 0 CET} + {2721258000 7200 1 CEST} + {2740006800 3600 0 CET} + {2752707600 7200 1 CEST} + {2771456400 3600 0 CET} + {2784762000 7200 1 CEST} + {2802906000 3600 0 CET} + {2816211600 7200 1 CEST} + {2834355600 3600 0 CET} + {2847661200 7200 1 CEST} + {2866410000 3600 0 CET} + {2879110800 7200 1 CEST} + {2897859600 3600 0 CET} + {2910560400 7200 1 CEST} + {2929309200 3600 0 CET} + {2942010000 7200 1 CEST} + {2960758800 3600 0 CET} + {2974064400 7200 1 CEST} + {2992208400 3600 0 CET} + {3005514000 7200 1 CEST} + {3023658000 3600 0 CET} + {3036963600 7200 1 CEST} + {3055712400 3600 0 CET} + {3068413200 7200 1 CEST} + {3087162000 3600 0 CET} + {3099862800 7200 1 CEST} + {3118611600 3600 0 CET} + {3131917200 7200 1 CEST} + {3150061200 3600 0 CET} + {3163366800 7200 1 CEST} + {3181510800 3600 0 CET} + {3194816400 7200 1 CEST} + {3212960400 3600 0 CET} + {3226266000 7200 1 CEST} + {3245014800 3600 0 CET} + {3257715600 7200 1 CEST} + {3276464400 3600 0 CET} + {3289165200 7200 1 CEST} + {3307914000 3600 0 CET} + {3321219600 7200 1 CEST} + {3339363600 3600 0 CET} + {3352669200 7200 1 CEST} + {3370813200 3600 0 CET} + {3384118800 7200 1 CEST} + {3402867600 3600 0 CET} + {3415568400 7200 1 CEST} + {3434317200 3600 0 CET} + {3447018000 7200 1 CEST} + {3465766800 3600 0 CET} + {3479072400 7200 1 CEST} + {3497216400 3600 0 CET} + {3510522000 7200 1 CEST} + {3528666000 3600 0 CET} + {3541971600 7200 1 CEST} + {3560115600 3600 0 CET} + {3573421200 7200 1 CEST} + {3592170000 3600 0 CET} + {3604870800 7200 1 CEST} + {3623619600 3600 0 CET} + {3636320400 7200 1 CEST} + {3655069200 3600 0 CET} + {3668374800 7200 1 CEST} + {3686518800 3600 0 CET} + {3699824400 7200 1 CEST} + {3717968400 3600 0 CET} + {3731274000 7200 1 CEST} + {3750022800 3600 0 CET} + {3762723600 7200 1 CEST} + {3781472400 3600 0 CET} + {3794173200 7200 1 CEST} + {3812922000 3600 0 CET} + {3825622800 7200 1 CEST} + {3844371600 3600 0 CET} + {3857677200 7200 1 CEST} + {3875821200 3600 0 CET} + {3889126800 7200 1 CEST} + {3907270800 3600 0 CET} + {3920576400 7200 1 CEST} + {3939325200 3600 0 CET} + {3952026000 7200 1 CEST} + {3970774800 3600 0 CET} + {3983475600 7200 1 CEST} + {4002224400 3600 0 CET} + {4015530000 7200 1 CEST} + {4033674000 3600 0 CET} + {4046979600 7200 1 CEST} + {4065123600 3600 0 CET} + {4078429200 7200 1 CEST} + {4096573200 3600 0 CET} +} diff --git a/env/tcl/tcl8.6/tzdata/Europe/Zagreb b/env/tcl/tcl8.6/tzdata/Europe/Zagreb new file mode 100644 index 0000000..46319a4 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Europe/Zagreb @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(Europe/Belgrade)]} { + LoadTimeZoneFile Europe/Belgrade +} +set TZData(:Europe/Zagreb) $TZData(:Europe/Belgrade) diff --git a/env/tcl/tcl8.6/tzdata/Europe/Zaporozhye b/env/tcl/tcl8.6/tzdata/Europe/Zaporozhye new file mode 100644 index 0000000..478a61c --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Europe/Zaporozhye @@ -0,0 +1,252 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Europe/Zaporozhye) { + {-9223372036854775808 8440 0 LMT} + {-2840149240 8400 0 +0220} + {-1441160400 7200 0 EET} + {-1247536800 10800 0 MSK} + {-894769200 3600 0 CET} + {-857257200 3600 0 CET} + {-844556400 7200 1 CEST} + {-828226800 3600 0 CET} + {-826419600 10800 0 MSD} + {354920400 14400 1 MSD} + {370728000 10800 0 MSK} + {386456400 14400 1 MSD} + {402264000 10800 0 MSK} + {417992400 14400 1 MSD} + {433800000 10800 0 MSK} + {449614800 14400 1 MSD} + {465346800 10800 0 MSK} + {481071600 14400 1 MSD} + {496796400 10800 0 MSK} + {512521200 14400 1 MSD} + {528246000 10800 0 MSK} + {543970800 14400 1 MSD} + {559695600 10800 0 MSK} + {575420400 14400 1 MSD} + {591145200 10800 0 MSK} + {606870000 14400 1 MSD} + {622594800 10800 0 MSK} + {638319600 14400 1 MSD} + {654649200 10800 0 MSK} + {670374000 10800 0 EEST} + {686091600 7200 0 EET} + {701820000 10800 1 EEST} + {717541200 7200 0 EET} + {733269600 10800 1 EEST} + {748990800 7200 0 EET} + {764719200 10800 1 EEST} + {780440400 7200 0 EET} + {788911200 7200 0 EET} + {796179600 10800 1 EEST} + {811904400 7200 0 EET} + {828234000 10800 1 EEST} + {846378000 7200 0 EET} + {859683600 10800 1 EEST} + {877827600 7200 0 EET} + {891133200 10800 1 EEST} + {909277200 7200 0 EET} + {922582800 10800 1 EEST} + {941331600 7200 0 EET} + {954032400 10800 1 EEST} + {972781200 7200 0 EET} + {985482000 10800 1 EEST} + {1004230800 7200 0 EET} + {1017536400 10800 1 EEST} + {1035680400 7200 0 EET} + {1048986000 10800 1 EEST} + {1067130000 7200 0 EET} + {1080435600 10800 1 EEST} + {1099184400 7200 0 EET} + {1111885200 10800 1 EEST} + {1130634000 7200 0 EET} + {1143334800 10800 1 EEST} + {1162083600 7200 0 EET} + {1174784400 10800 1 EEST} + {1193533200 7200 0 EET} + {1206838800 10800 1 EEST} + {1224982800 7200 0 EET} + {1238288400 10800 1 EEST} + {1256432400 7200 0 EET} + {1269738000 10800 1 EEST} + {1288486800 7200 0 EET} + {1301187600 10800 1 EEST} + {1319936400 7200 0 EET} + {1332637200 10800 1 EEST} + {1351386000 7200 0 EET} + {1364691600 10800 1 EEST} + {1382835600 7200 0 EET} + {1396141200 10800 1 EEST} + {1414285200 7200 0 EET} + {1427590800 10800 1 EEST} + {1445734800 7200 0 EET} + {1459040400 10800 1 EEST} + {1477789200 7200 0 EET} + {1490490000 10800 1 EEST} + {1509238800 7200 0 EET} + {1521939600 10800 1 EEST} + {1540688400 7200 0 EET} + {1553994000 10800 1 EEST} + {1572138000 7200 0 EET} + {1585443600 10800 1 EEST} + {1603587600 7200 0 EET} + {1616893200 10800 1 EEST} + {1635642000 7200 0 EET} + {1648342800 10800 1 EEST} + {1667091600 7200 0 EET} + {1679792400 10800 1 EEST} + {1698541200 7200 0 EET} + {1711846800 10800 1 EEST} + {1729990800 7200 0 EET} + {1743296400 10800 1 EEST} + {1761440400 7200 0 EET} + {1774746000 10800 1 EEST} + {1792890000 7200 0 EET} + {1806195600 10800 1 EEST} + {1824944400 7200 0 EET} + {1837645200 10800 1 EEST} + {1856394000 7200 0 EET} + {1869094800 10800 1 EEST} + {1887843600 7200 0 EET} + {1901149200 10800 1 EEST} + {1919293200 7200 0 EET} + {1932598800 10800 1 EEST} + {1950742800 7200 0 EET} + {1964048400 10800 1 EEST} + {1982797200 7200 0 EET} + {1995498000 10800 1 EEST} + {2014246800 7200 0 EET} + {2026947600 10800 1 EEST} + {2045696400 7200 0 EET} + {2058397200 10800 1 EEST} + {2077146000 7200 0 EET} + {2090451600 10800 1 EEST} + {2108595600 7200 0 EET} + {2121901200 10800 1 EEST} + {2140045200 7200 0 EET} + {2153350800 10800 1 EEST} + {2172099600 7200 0 EET} + {2184800400 10800 1 EEST} + {2203549200 7200 0 EET} + {2216250000 10800 1 EEST} + {2234998800 7200 0 EET} + {2248304400 10800 1 EEST} + {2266448400 7200 0 EET} + {2279754000 10800 1 EEST} + {2297898000 7200 0 EET} + {2311203600 10800 1 EEST} + {2329347600 7200 0 EET} + {2342653200 10800 1 EEST} + {2361402000 7200 0 EET} + {2374102800 10800 1 EEST} + {2392851600 7200 0 EET} + {2405552400 10800 1 EEST} + {2424301200 7200 0 EET} + {2437606800 10800 1 EEST} + {2455750800 7200 0 EET} + {2469056400 10800 1 EEST} + {2487200400 7200 0 EET} + {2500506000 10800 1 EEST} + {2519254800 7200 0 EET} + {2531955600 10800 1 EEST} + {2550704400 7200 0 EET} + {2563405200 10800 1 EEST} + {2582154000 7200 0 EET} + {2595459600 10800 1 EEST} + {2613603600 7200 0 EET} + {2626909200 10800 1 EEST} + {2645053200 7200 0 EET} + {2658358800 10800 1 EEST} + {2676502800 7200 0 EET} + {2689808400 10800 1 EEST} + {2708557200 7200 0 EET} + {2721258000 10800 1 EEST} + {2740006800 7200 0 EET} + {2752707600 10800 1 EEST} + {2771456400 7200 0 EET} + {2784762000 10800 1 EEST} + {2802906000 7200 0 EET} + {2816211600 10800 1 EEST} + {2834355600 7200 0 EET} + {2847661200 10800 1 EEST} + {2866410000 7200 0 EET} + {2879110800 10800 1 EEST} + {2897859600 7200 0 EET} + {2910560400 10800 1 EEST} + {2929309200 7200 0 EET} + {2942010000 10800 1 EEST} + {2960758800 7200 0 EET} + {2974064400 10800 1 EEST} + {2992208400 7200 0 EET} + {3005514000 10800 1 EEST} + {3023658000 7200 0 EET} + {3036963600 10800 1 EEST} + {3055712400 7200 0 EET} + {3068413200 10800 1 EEST} + {3087162000 7200 0 EET} + {3099862800 10800 1 EEST} + {3118611600 7200 0 EET} + {3131917200 10800 1 EEST} + {3150061200 7200 0 EET} + {3163366800 10800 1 EEST} + {3181510800 7200 0 EET} + {3194816400 10800 1 EEST} + {3212960400 7200 0 EET} + {3226266000 10800 1 EEST} + {3245014800 7200 0 EET} + {3257715600 10800 1 EEST} + {3276464400 7200 0 EET} + {3289165200 10800 1 EEST} + {3307914000 7200 0 EET} + {3321219600 10800 1 EEST} + {3339363600 7200 0 EET} + {3352669200 10800 1 EEST} + {3370813200 7200 0 EET} + {3384118800 10800 1 EEST} + {3402867600 7200 0 EET} + {3415568400 10800 1 EEST} + {3434317200 7200 0 EET} + {3447018000 10800 1 EEST} + {3465766800 7200 0 EET} + {3479072400 10800 1 EEST} + {3497216400 7200 0 EET} + {3510522000 10800 1 EEST} + {3528666000 7200 0 EET} + {3541971600 10800 1 EEST} + {3560115600 7200 0 EET} + {3573421200 10800 1 EEST} + {3592170000 7200 0 EET} + {3604870800 10800 1 EEST} + {3623619600 7200 0 EET} + {3636320400 10800 1 EEST} + {3655069200 7200 0 EET} + {3668374800 10800 1 EEST} + {3686518800 7200 0 EET} + {3699824400 10800 1 EEST} + {3717968400 7200 0 EET} + {3731274000 10800 1 EEST} + {3750022800 7200 0 EET} + {3762723600 10800 1 EEST} + {3781472400 7200 0 EET} + {3794173200 10800 1 EEST} + {3812922000 7200 0 EET} + {3825622800 10800 1 EEST} + {3844371600 7200 0 EET} + {3857677200 10800 1 EEST} + {3875821200 7200 0 EET} + {3889126800 10800 1 EEST} + {3907270800 7200 0 EET} + {3920576400 10800 1 EEST} + {3939325200 7200 0 EET} + {3952026000 10800 1 EEST} + {3970774800 7200 0 EET} + {3983475600 10800 1 EEST} + {4002224400 7200 0 EET} + {4015530000 10800 1 EEST} + {4033674000 7200 0 EET} + {4046979600 10800 1 EEST} + {4065123600 7200 0 EET} + {4078429200 10800 1 EEST} + {4096573200 7200 0 EET} +} diff --git a/env/tcl/tcl8.6/tzdata/Europe/Zurich b/env/tcl/tcl8.6/tzdata/Europe/Zurich new file mode 100644 index 0000000..87a20db --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Europe/Zurich @@ -0,0 +1,250 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Europe/Zurich) { + {-9223372036854775808 2048 0 LMT} + {-3675198848 1786 0 BMT} + {-2385246586 3600 0 CET} + {-904435200 7200 1 CEST} + {-891129600 3600 0 CET} + {-872985600 7200 1 CEST} + {-859680000 3600 0 CET} + {347151600 3600 0 CET} + {354675600 7200 1 CEST} + {370400400 3600 0 CET} + {386125200 7200 1 CEST} + {401850000 3600 0 CET} + {417574800 7200 1 CEST} + {433299600 3600 0 CET} + {449024400 7200 1 CEST} + {465354000 3600 0 CET} + {481078800 7200 1 CEST} + {496803600 3600 0 CET} + {512528400 7200 1 CEST} + {528253200 3600 0 CET} + {543978000 7200 1 CEST} + {559702800 3600 0 CET} + {575427600 7200 1 CEST} + {591152400 3600 0 CET} + {606877200 7200 1 CEST} + {622602000 3600 0 CET} + {638326800 7200 1 CEST} + {654656400 3600 0 CET} + {670381200 7200 1 CEST} + {686106000 3600 0 CET} + {701830800 7200 1 CEST} + {717555600 3600 0 CET} + {733280400 7200 1 CEST} + {749005200 3600 0 CET} + {764730000 7200 1 CEST} + {780454800 3600 0 CET} + {796179600 7200 1 CEST} + {811904400 3600 0 CET} + {828234000 7200 1 CEST} + {846378000 3600 0 CET} + {859683600 7200 1 CEST} + {877827600 3600 0 CET} + {891133200 7200 1 CEST} + {909277200 3600 0 CET} + {922582800 7200 1 CEST} + {941331600 3600 0 CET} + {954032400 7200 1 CEST} + {972781200 3600 0 CET} + {985482000 7200 1 CEST} + {1004230800 3600 0 CET} + {1017536400 7200 1 CEST} + {1035680400 3600 0 CET} + {1048986000 7200 1 CEST} + {1067130000 3600 0 CET} + {1080435600 7200 1 CEST} + {1099184400 3600 0 CET} + {1111885200 7200 1 CEST} + {1130634000 3600 0 CET} + {1143334800 7200 1 CEST} + {1162083600 3600 0 CET} + {1174784400 7200 1 CEST} + {1193533200 3600 0 CET} + {1206838800 7200 1 CEST} + {1224982800 3600 0 CET} + {1238288400 7200 1 CEST} + {1256432400 3600 0 CET} + {1269738000 7200 1 CEST} + {1288486800 3600 0 CET} + {1301187600 7200 1 CEST} + {1319936400 3600 0 CET} + {1332637200 7200 1 CEST} + {1351386000 3600 0 CET} + {1364691600 7200 1 CEST} + {1382835600 3600 0 CET} + {1396141200 7200 1 CEST} + {1414285200 3600 0 CET} + {1427590800 7200 1 CEST} + {1445734800 3600 0 CET} + {1459040400 7200 1 CEST} + {1477789200 3600 0 CET} + {1490490000 7200 1 CEST} + {1509238800 3600 0 CET} + {1521939600 7200 1 CEST} + {1540688400 3600 0 CET} + {1553994000 7200 1 CEST} + {1572138000 3600 0 CET} + {1585443600 7200 1 CEST} + {1603587600 3600 0 CET} + {1616893200 7200 1 CEST} + {1635642000 3600 0 CET} + {1648342800 7200 1 CEST} + {1667091600 3600 0 CET} + {1679792400 7200 1 CEST} + {1698541200 3600 0 CET} + {1711846800 7200 1 CEST} + {1729990800 3600 0 CET} + {1743296400 7200 1 CEST} + {1761440400 3600 0 CET} + {1774746000 7200 1 CEST} + {1792890000 3600 0 CET} + {1806195600 7200 1 CEST} + {1824944400 3600 0 CET} + {1837645200 7200 1 CEST} + {1856394000 3600 0 CET} + {1869094800 7200 1 CEST} + {1887843600 3600 0 CET} + {1901149200 7200 1 CEST} + {1919293200 3600 0 CET} + {1932598800 7200 1 CEST} + {1950742800 3600 0 CET} + {1964048400 7200 1 CEST} + {1982797200 3600 0 CET} + {1995498000 7200 1 CEST} + {2014246800 3600 0 CET} + {2026947600 7200 1 CEST} + {2045696400 3600 0 CET} + {2058397200 7200 1 CEST} + {2077146000 3600 0 CET} + {2090451600 7200 1 CEST} + {2108595600 3600 0 CET} + {2121901200 7200 1 CEST} + {2140045200 3600 0 CET} + {2153350800 7200 1 CEST} + {2172099600 3600 0 CET} + {2184800400 7200 1 CEST} + {2203549200 3600 0 CET} + {2216250000 7200 1 CEST} + {2234998800 3600 0 CET} + {2248304400 7200 1 CEST} + {2266448400 3600 0 CET} + {2279754000 7200 1 CEST} + {2297898000 3600 0 CET} + {2311203600 7200 1 CEST} + {2329347600 3600 0 CET} + {2342653200 7200 1 CEST} + {2361402000 3600 0 CET} + {2374102800 7200 1 CEST} + {2392851600 3600 0 CET} + {2405552400 7200 1 CEST} + {2424301200 3600 0 CET} + {2437606800 7200 1 CEST} + {2455750800 3600 0 CET} + {2469056400 7200 1 CEST} + {2487200400 3600 0 CET} + {2500506000 7200 1 CEST} + {2519254800 3600 0 CET} + {2531955600 7200 1 CEST} + {2550704400 3600 0 CET} + {2563405200 7200 1 CEST} + {2582154000 3600 0 CET} + {2595459600 7200 1 CEST} + {2613603600 3600 0 CET} + {2626909200 7200 1 CEST} + {2645053200 3600 0 CET} + {2658358800 7200 1 CEST} + {2676502800 3600 0 CET} + {2689808400 7200 1 CEST} + {2708557200 3600 0 CET} + {2721258000 7200 1 CEST} + {2740006800 3600 0 CET} + {2752707600 7200 1 CEST} + {2771456400 3600 0 CET} + {2784762000 7200 1 CEST} + {2802906000 3600 0 CET} + {2816211600 7200 1 CEST} + {2834355600 3600 0 CET} + {2847661200 7200 1 CEST} + {2866410000 3600 0 CET} + {2879110800 7200 1 CEST} + {2897859600 3600 0 CET} + {2910560400 7200 1 CEST} + {2929309200 3600 0 CET} + {2942010000 7200 1 CEST} + {2960758800 3600 0 CET} + {2974064400 7200 1 CEST} + {2992208400 3600 0 CET} + {3005514000 7200 1 CEST} + {3023658000 3600 0 CET} + {3036963600 7200 1 CEST} + {3055712400 3600 0 CET} + {3068413200 7200 1 CEST} + {3087162000 3600 0 CET} + {3099862800 7200 1 CEST} + {3118611600 3600 0 CET} + {3131917200 7200 1 CEST} + {3150061200 3600 0 CET} + {3163366800 7200 1 CEST} + {3181510800 3600 0 CET} + {3194816400 7200 1 CEST} + {3212960400 3600 0 CET} + {3226266000 7200 1 CEST} + {3245014800 3600 0 CET} + {3257715600 7200 1 CEST} + {3276464400 3600 0 CET} + {3289165200 7200 1 CEST} + {3307914000 3600 0 CET} + {3321219600 7200 1 CEST} + {3339363600 3600 0 CET} + {3352669200 7200 1 CEST} + {3370813200 3600 0 CET} + {3384118800 7200 1 CEST} + {3402867600 3600 0 CET} + {3415568400 7200 1 CEST} + {3434317200 3600 0 CET} + {3447018000 7200 1 CEST} + {3465766800 3600 0 CET} + {3479072400 7200 1 CEST} + {3497216400 3600 0 CET} + {3510522000 7200 1 CEST} + {3528666000 3600 0 CET} + {3541971600 7200 1 CEST} + {3560115600 3600 0 CET} + {3573421200 7200 1 CEST} + {3592170000 3600 0 CET} + {3604870800 7200 1 CEST} + {3623619600 3600 0 CET} + {3636320400 7200 1 CEST} + {3655069200 3600 0 CET} + {3668374800 7200 1 CEST} + {3686518800 3600 0 CET} + {3699824400 7200 1 CEST} + {3717968400 3600 0 CET} + {3731274000 7200 1 CEST} + {3750022800 3600 0 CET} + {3762723600 7200 1 CEST} + {3781472400 3600 0 CET} + {3794173200 7200 1 CEST} + {3812922000 3600 0 CET} + {3825622800 7200 1 CEST} + {3844371600 3600 0 CET} + {3857677200 7200 1 CEST} + {3875821200 3600 0 CET} + {3889126800 7200 1 CEST} + {3907270800 3600 0 CET} + {3920576400 7200 1 CEST} + {3939325200 3600 0 CET} + {3952026000 7200 1 CEST} + {3970774800 3600 0 CET} + {3983475600 7200 1 CEST} + {4002224400 3600 0 CET} + {4015530000 7200 1 CEST} + {4033674000 3600 0 CET} + {4046979600 7200 1 CEST} + {4065123600 3600 0 CET} + {4078429200 7200 1 CEST} + {4096573200 3600 0 CET} +} diff --git a/env/tcl/tcl8.6/tzdata/GB b/env/tcl/tcl8.6/tzdata/GB new file mode 100644 index 0000000..72d77ee --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/GB @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(Europe/London)]} { + LoadTimeZoneFile Europe/London +} +set TZData(:GB) $TZData(:Europe/London) diff --git a/env/tcl/tcl8.6/tzdata/GB-Eire b/env/tcl/tcl8.6/tzdata/GB-Eire new file mode 100644 index 0000000..1622417 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/GB-Eire @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(Europe/London)]} { + LoadTimeZoneFile Europe/London +} +set TZData(:GB-Eire) $TZData(:Europe/London) diff --git a/env/tcl/tcl8.6/tzdata/GMT b/env/tcl/tcl8.6/tzdata/GMT new file mode 100644 index 0000000..4258564 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/GMT @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(Etc/GMT)]} { + LoadTimeZoneFile Etc/GMT +} +set TZData(:GMT) $TZData(:Etc/GMT) diff --git a/env/tcl/tcl8.6/tzdata/GMT+0 b/env/tcl/tcl8.6/tzdata/GMT+0 new file mode 100644 index 0000000..a1e8126 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/GMT+0 @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(Etc/GMT)]} { + LoadTimeZoneFile Etc/GMT +} +set TZData(:GMT+0) $TZData(:Etc/GMT) diff --git a/env/tcl/tcl8.6/tzdata/GMT-0 b/env/tcl/tcl8.6/tzdata/GMT-0 new file mode 100644 index 0000000..04ccafe --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/GMT-0 @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(Etc/GMT)]} { + LoadTimeZoneFile Etc/GMT +} +set TZData(:GMT-0) $TZData(:Etc/GMT) diff --git a/env/tcl/tcl8.6/tzdata/GMT0 b/env/tcl/tcl8.6/tzdata/GMT0 new file mode 100644 index 0000000..92e95a3 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/GMT0 @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(Etc/GMT)]} { + LoadTimeZoneFile Etc/GMT +} +set TZData(:GMT0) $TZData(:Etc/GMT) diff --git a/env/tcl/tcl8.6/tzdata/Greenwich b/env/tcl/tcl8.6/tzdata/Greenwich new file mode 100644 index 0000000..6115233 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Greenwich @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(Etc/GMT)]} { + LoadTimeZoneFile Etc/GMT +} +set TZData(:Greenwich) $TZData(:Etc/GMT) diff --git a/env/tcl/tcl8.6/tzdata/HST b/env/tcl/tcl8.6/tzdata/HST new file mode 100644 index 0000000..fea7f14 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/HST @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:HST) { + {-9223372036854775808 -36000 0 HST} +} diff --git a/env/tcl/tcl8.6/tzdata/Hongkong b/env/tcl/tcl8.6/tzdata/Hongkong new file mode 100644 index 0000000..f9d4dac --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Hongkong @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(Asia/Hong_Kong)]} { + LoadTimeZoneFile Asia/Hong_Kong +} +set TZData(:Hongkong) $TZData(:Asia/Hong_Kong) diff --git a/env/tcl/tcl8.6/tzdata/Iceland b/env/tcl/tcl8.6/tzdata/Iceland new file mode 100644 index 0000000..eb3f3eb --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Iceland @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(Atlantic/Reykjavik)]} { + LoadTimeZoneFile Atlantic/Reykjavik +} +set TZData(:Iceland) $TZData(:Atlantic/Reykjavik) diff --git a/env/tcl/tcl8.6/tzdata/Indian/Antananarivo b/env/tcl/tcl8.6/tzdata/Indian/Antananarivo new file mode 100644 index 0000000..c56a893 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Indian/Antananarivo @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(Africa/Nairobi)]} { + LoadTimeZoneFile Africa/Nairobi +} +set TZData(:Indian/Antananarivo) $TZData(:Africa/Nairobi) diff --git a/env/tcl/tcl8.6/tzdata/Indian/Chagos b/env/tcl/tcl8.6/tzdata/Indian/Chagos new file mode 100644 index 0000000..23ea790 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Indian/Chagos @@ -0,0 +1,7 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Indian/Chagos) { + {-9223372036854775808 17380 0 LMT} + {-1988167780 18000 0 +05} + {820436400 21600 0 +06} +} diff --git a/env/tcl/tcl8.6/tzdata/Indian/Christmas b/env/tcl/tcl8.6/tzdata/Indian/Christmas new file mode 100644 index 0000000..76f8cbe --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Indian/Christmas @@ -0,0 +1,6 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Indian/Christmas) { + {-9223372036854775808 25372 0 LMT} + {-2364102172 25200 0 +07} +} diff --git a/env/tcl/tcl8.6/tzdata/Indian/Cocos b/env/tcl/tcl8.6/tzdata/Indian/Cocos new file mode 100644 index 0000000..833eb20 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Indian/Cocos @@ -0,0 +1,6 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Indian/Cocos) { + {-9223372036854775808 23260 0 LMT} + {-2209012060 23400 0 +0630} +} diff --git a/env/tcl/tcl8.6/tzdata/Indian/Comoro b/env/tcl/tcl8.6/tzdata/Indian/Comoro new file mode 100644 index 0000000..06071de --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Indian/Comoro @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(Africa/Nairobi)]} { + LoadTimeZoneFile Africa/Nairobi +} +set TZData(:Indian/Comoro) $TZData(:Africa/Nairobi) diff --git a/env/tcl/tcl8.6/tzdata/Indian/Kerguelen b/env/tcl/tcl8.6/tzdata/Indian/Kerguelen new file mode 100644 index 0000000..93f2d94 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Indian/Kerguelen @@ -0,0 +1,6 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Indian/Kerguelen) { + {-9223372036854775808 0 0 -00} + {-631152000 18000 0 +05} +} diff --git a/env/tcl/tcl8.6/tzdata/Indian/Mahe b/env/tcl/tcl8.6/tzdata/Indian/Mahe new file mode 100644 index 0000000..3dd5b40 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Indian/Mahe @@ -0,0 +1,6 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Indian/Mahe) { + {-9223372036854775808 13308 0 LMT} + {-2006653308 14400 0 +04} +} diff --git a/env/tcl/tcl8.6/tzdata/Indian/Maldives b/env/tcl/tcl8.6/tzdata/Indian/Maldives new file mode 100644 index 0000000..b23bf2b --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Indian/Maldives @@ -0,0 +1,7 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Indian/Maldives) { + {-9223372036854775808 17640 0 LMT} + {-2840158440 17640 0 MMT} + {-315636840 18000 0 +05} +} diff --git a/env/tcl/tcl8.6/tzdata/Indian/Mauritius b/env/tcl/tcl8.6/tzdata/Indian/Mauritius new file mode 100644 index 0000000..4c9a051 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Indian/Mauritius @@ -0,0 +1,10 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Indian/Mauritius) { + {-9223372036854775808 13800 0 LMT} + {-1988164200 14400 0 +04} + {403041600 18000 1 +04} + {417034800 14400 0 +04} + {1224972000 18000 1 +04} + {1238274000 14400 0 +04} +} diff --git a/env/tcl/tcl8.6/tzdata/Indian/Mayotte b/env/tcl/tcl8.6/tzdata/Indian/Mayotte new file mode 100644 index 0000000..da55521 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Indian/Mayotte @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(Africa/Nairobi)]} { + LoadTimeZoneFile Africa/Nairobi +} +set TZData(:Indian/Mayotte) $TZData(:Africa/Nairobi) diff --git a/env/tcl/tcl8.6/tzdata/Indian/Reunion b/env/tcl/tcl8.6/tzdata/Indian/Reunion new file mode 100644 index 0000000..aa78dec --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Indian/Reunion @@ -0,0 +1,6 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Indian/Reunion) { + {-9223372036854775808 13312 0 LMT} + {-1848886912 14400 0 +04} +} diff --git a/env/tcl/tcl8.6/tzdata/Iran b/env/tcl/tcl8.6/tzdata/Iran new file mode 100644 index 0000000..e200b4d --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Iran @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(Asia/Tehran)]} { + LoadTimeZoneFile Asia/Tehran +} +set TZData(:Iran) $TZData(:Asia/Tehran) diff --git a/env/tcl/tcl8.6/tzdata/Israel b/env/tcl/tcl8.6/tzdata/Israel new file mode 100644 index 0000000..af521f5 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Israel @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(Asia/Jerusalem)]} { + LoadTimeZoneFile Asia/Jerusalem +} +set TZData(:Israel) $TZData(:Asia/Jerusalem) diff --git a/env/tcl/tcl8.6/tzdata/Jamaica b/env/tcl/tcl8.6/tzdata/Jamaica new file mode 100644 index 0000000..ddb5d45 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Jamaica @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(America/Jamaica)]} { + LoadTimeZoneFile America/Jamaica +} +set TZData(:Jamaica) $TZData(:America/Jamaica) diff --git a/env/tcl/tcl8.6/tzdata/Japan b/env/tcl/tcl8.6/tzdata/Japan new file mode 100644 index 0000000..428a79f --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Japan @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(Asia/Tokyo)]} { + LoadTimeZoneFile Asia/Tokyo +} +set TZData(:Japan) $TZData(:Asia/Tokyo) diff --git a/env/tcl/tcl8.6/tzdata/Kwajalein b/env/tcl/tcl8.6/tzdata/Kwajalein new file mode 100644 index 0000000..586db6d --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Kwajalein @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(Pacific/Kwajalein)]} { + LoadTimeZoneFile Pacific/Kwajalein +} +set TZData(:Kwajalein) $TZData(:Pacific/Kwajalein) diff --git a/env/tcl/tcl8.6/tzdata/Libya b/env/tcl/tcl8.6/tzdata/Libya new file mode 100644 index 0000000..6cd77e1 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Libya @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(Africa/Tripoli)]} { + LoadTimeZoneFile Africa/Tripoli +} +set TZData(:Libya) $TZData(:Africa/Tripoli) diff --git a/env/tcl/tcl8.6/tzdata/MET b/env/tcl/tcl8.6/tzdata/MET new file mode 100644 index 0000000..8789c97 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/MET @@ -0,0 +1,265 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:MET) { + {-9223372036854775808 3600 0 MET} + {-1693706400 7200 1 MEST} + {-1680483600 3600 0 MET} + {-1663455600 7200 1 MEST} + {-1650150000 3600 0 MET} + {-1632006000 7200 1 MEST} + {-1618700400 3600 0 MET} + {-938905200 7200 1 MEST} + {-857257200 3600 0 MET} + {-844556400 7200 1 MEST} + {-828226800 3600 0 MET} + {-812502000 7200 1 MEST} + {-796777200 3600 0 MET} + {-781052400 7200 1 MEST} + {-766623600 3600 0 MET} + {228877200 7200 1 MEST} + {243997200 3600 0 MET} + {260326800 7200 1 MEST} + {276051600 3600 0 MET} + {291776400 7200 1 MEST} + {307501200 3600 0 MET} + {323830800 7200 1 MEST} + {338950800 3600 0 MET} + {354675600 7200 1 MEST} + {370400400 3600 0 MET} + {386125200 7200 1 MEST} + {401850000 3600 0 MET} + {417574800 7200 1 MEST} + {433299600 3600 0 MET} + {449024400 7200 1 MEST} + {465354000 3600 0 MET} + {481078800 7200 1 MEST} + {496803600 3600 0 MET} + {512528400 7200 1 MEST} + {528253200 3600 0 MET} + {543978000 7200 1 MEST} + {559702800 3600 0 MET} + {575427600 7200 1 MEST} + {591152400 3600 0 MET} + {606877200 7200 1 MEST} + {622602000 3600 0 MET} + {638326800 7200 1 MEST} + {654656400 3600 0 MET} + {670381200 7200 1 MEST} + {686106000 3600 0 MET} + {701830800 7200 1 MEST} + {717555600 3600 0 MET} + {733280400 7200 1 MEST} + {749005200 3600 0 MET} + {764730000 7200 1 MEST} + {780454800 3600 0 MET} + {796179600 7200 1 MEST} + {811904400 3600 0 MET} + {828234000 7200 1 MEST} + {846378000 3600 0 MET} + {859683600 7200 1 MEST} + {877827600 3600 0 MET} + {891133200 7200 1 MEST} + {909277200 3600 0 MET} + {922582800 7200 1 MEST} + {941331600 3600 0 MET} + {954032400 7200 1 MEST} + {972781200 3600 0 MET} + {985482000 7200 1 MEST} + {1004230800 3600 0 MET} + {1017536400 7200 1 MEST} + {1035680400 3600 0 MET} + {1048986000 7200 1 MEST} + {1067130000 3600 0 MET} + {1080435600 7200 1 MEST} + {1099184400 3600 0 MET} + {1111885200 7200 1 MEST} + {1130634000 3600 0 MET} + {1143334800 7200 1 MEST} + {1162083600 3600 0 MET} + {1174784400 7200 1 MEST} + {1193533200 3600 0 MET} + {1206838800 7200 1 MEST} + {1224982800 3600 0 MET} + {1238288400 7200 1 MEST} + {1256432400 3600 0 MET} + {1269738000 7200 1 MEST} + {1288486800 3600 0 MET} + {1301187600 7200 1 MEST} + {1319936400 3600 0 MET} + {1332637200 7200 1 MEST} + {1351386000 3600 0 MET} + {1364691600 7200 1 MEST} + {1382835600 3600 0 MET} + {1396141200 7200 1 MEST} + {1414285200 3600 0 MET} + {1427590800 7200 1 MEST} + {1445734800 3600 0 MET} + {1459040400 7200 1 MEST} + {1477789200 3600 0 MET} + {1490490000 7200 1 MEST} + {1509238800 3600 0 MET} + {1521939600 7200 1 MEST} + {1540688400 3600 0 MET} + {1553994000 7200 1 MEST} + {1572138000 3600 0 MET} + {1585443600 7200 1 MEST} + {1603587600 3600 0 MET} + {1616893200 7200 1 MEST} + {1635642000 3600 0 MET} + {1648342800 7200 1 MEST} + {1667091600 3600 0 MET} + {1679792400 7200 1 MEST} + {1698541200 3600 0 MET} + {1711846800 7200 1 MEST} + {1729990800 3600 0 MET} + {1743296400 7200 1 MEST} + {1761440400 3600 0 MET} + {1774746000 7200 1 MEST} + {1792890000 3600 0 MET} + {1806195600 7200 1 MEST} + {1824944400 3600 0 MET} + {1837645200 7200 1 MEST} + {1856394000 3600 0 MET} + {1869094800 7200 1 MEST} + {1887843600 3600 0 MET} + {1901149200 7200 1 MEST} + {1919293200 3600 0 MET} + {1932598800 7200 1 MEST} + {1950742800 3600 0 MET} + {1964048400 7200 1 MEST} + {1982797200 3600 0 MET} + {1995498000 7200 1 MEST} + {2014246800 3600 0 MET} + {2026947600 7200 1 MEST} + {2045696400 3600 0 MET} + {2058397200 7200 1 MEST} + {2077146000 3600 0 MET} + {2090451600 7200 1 MEST} + {2108595600 3600 0 MET} + {2121901200 7200 1 MEST} + {2140045200 3600 0 MET} + {2153350800 7200 1 MEST} + {2172099600 3600 0 MET} + {2184800400 7200 1 MEST} + {2203549200 3600 0 MET} + {2216250000 7200 1 MEST} + {2234998800 3600 0 MET} + {2248304400 7200 1 MEST} + {2266448400 3600 0 MET} + {2279754000 7200 1 MEST} + {2297898000 3600 0 MET} + {2311203600 7200 1 MEST} + {2329347600 3600 0 MET} + {2342653200 7200 1 MEST} + {2361402000 3600 0 MET} + {2374102800 7200 1 MEST} + {2392851600 3600 0 MET} + {2405552400 7200 1 MEST} + {2424301200 3600 0 MET} + {2437606800 7200 1 MEST} + {2455750800 3600 0 MET} + {2469056400 7200 1 MEST} + {2487200400 3600 0 MET} + {2500506000 7200 1 MEST} + {2519254800 3600 0 MET} + {2531955600 7200 1 MEST} + {2550704400 3600 0 MET} + {2563405200 7200 1 MEST} + {2582154000 3600 0 MET} + {2595459600 7200 1 MEST} + {2613603600 3600 0 MET} + {2626909200 7200 1 MEST} + {2645053200 3600 0 MET} + {2658358800 7200 1 MEST} + {2676502800 3600 0 MET} + {2689808400 7200 1 MEST} + {2708557200 3600 0 MET} + {2721258000 7200 1 MEST} + {2740006800 3600 0 MET} + {2752707600 7200 1 MEST} + {2771456400 3600 0 MET} + {2784762000 7200 1 MEST} + {2802906000 3600 0 MET} + {2816211600 7200 1 MEST} + {2834355600 3600 0 MET} + {2847661200 7200 1 MEST} + {2866410000 3600 0 MET} + {2879110800 7200 1 MEST} + {2897859600 3600 0 MET} + {2910560400 7200 1 MEST} + {2929309200 3600 0 MET} + {2942010000 7200 1 MEST} + {2960758800 3600 0 MET} + {2974064400 7200 1 MEST} + {2992208400 3600 0 MET} + {3005514000 7200 1 MEST} + {3023658000 3600 0 MET} + {3036963600 7200 1 MEST} + {3055712400 3600 0 MET} + {3068413200 7200 1 MEST} + {3087162000 3600 0 MET} + {3099862800 7200 1 MEST} + {3118611600 3600 0 MET} + {3131917200 7200 1 MEST} + {3150061200 3600 0 MET} + {3163366800 7200 1 MEST} + {3181510800 3600 0 MET} + {3194816400 7200 1 MEST} + {3212960400 3600 0 MET} + {3226266000 7200 1 MEST} + {3245014800 3600 0 MET} + {3257715600 7200 1 MEST} + {3276464400 3600 0 MET} + {3289165200 7200 1 MEST} + {3307914000 3600 0 MET} + {3321219600 7200 1 MEST} + {3339363600 3600 0 MET} + {3352669200 7200 1 MEST} + {3370813200 3600 0 MET} + {3384118800 7200 1 MEST} + {3402867600 3600 0 MET} + {3415568400 7200 1 MEST} + {3434317200 3600 0 MET} + {3447018000 7200 1 MEST} + {3465766800 3600 0 MET} + {3479072400 7200 1 MEST} + {3497216400 3600 0 MET} + {3510522000 7200 1 MEST} + {3528666000 3600 0 MET} + {3541971600 7200 1 MEST} + {3560115600 3600 0 MET} + {3573421200 7200 1 MEST} + {3592170000 3600 0 MET} + {3604870800 7200 1 MEST} + {3623619600 3600 0 MET} + {3636320400 7200 1 MEST} + {3655069200 3600 0 MET} + {3668374800 7200 1 MEST} + {3686518800 3600 0 MET} + {3699824400 7200 1 MEST} + {3717968400 3600 0 MET} + {3731274000 7200 1 MEST} + {3750022800 3600 0 MET} + {3762723600 7200 1 MEST} + {3781472400 3600 0 MET} + {3794173200 7200 1 MEST} + {3812922000 3600 0 MET} + {3825622800 7200 1 MEST} + {3844371600 3600 0 MET} + {3857677200 7200 1 MEST} + {3875821200 3600 0 MET} + {3889126800 7200 1 MEST} + {3907270800 3600 0 MET} + {3920576400 7200 1 MEST} + {3939325200 3600 0 MET} + {3952026000 7200 1 MEST} + {3970774800 3600 0 MET} + {3983475600 7200 1 MEST} + {4002224400 3600 0 MET} + {4015530000 7200 1 MEST} + {4033674000 3600 0 MET} + {4046979600 7200 1 MEST} + {4065123600 3600 0 MET} + {4078429200 7200 1 MEST} + {4096573200 3600 0 MET} +} diff --git a/env/tcl/tcl8.6/tzdata/MST b/env/tcl/tcl8.6/tzdata/MST new file mode 100644 index 0000000..8c967ab --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/MST @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:MST) { + {-9223372036854775808 -25200 0 MST} +} diff --git a/env/tcl/tcl8.6/tzdata/MST7MDT b/env/tcl/tcl8.6/tzdata/MST7MDT new file mode 100644 index 0000000..ff52048 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/MST7MDT @@ -0,0 +1,278 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:MST7MDT) { + {-9223372036854775808 -25200 0 MST} + {-1633273200 -21600 1 MDT} + {-1615132800 -25200 0 MST} + {-1601823600 -21600 1 MDT} + {-1583683200 -25200 0 MST} + {-880210800 -21600 1 MWT} + {-769395600 -21600 1 MPT} + {-765388800 -25200 0 MST} + {-84380400 -21600 1 MDT} + {-68659200 -25200 0 MST} + {-52930800 -21600 1 MDT} + {-37209600 -25200 0 MST} + {-21481200 -21600 1 MDT} + {-5760000 -25200 0 MST} + {9968400 -21600 1 MDT} + {25689600 -25200 0 MST} + {41418000 -21600 1 MDT} + {57744000 -25200 0 MST} + {73472400 -21600 1 MDT} + {89193600 -25200 0 MST} + {104922000 -21600 1 MDT} + {120643200 -25200 0 MST} + {126694800 -21600 1 MDT} + {152092800 -25200 0 MST} + {162378000 -21600 1 MDT} + {183542400 -25200 0 MST} + {199270800 -21600 1 MDT} + {215596800 -25200 0 MST} + {230720400 -21600 1 MDT} + {247046400 -25200 0 MST} + {262774800 -21600 1 MDT} + {278496000 -25200 0 MST} + {294224400 -21600 1 MDT} + {309945600 -25200 0 MST} + {325674000 -21600 1 MDT} + {341395200 -25200 0 MST} + {357123600 -21600 1 MDT} + {372844800 -25200 0 MST} + {388573200 -21600 1 MDT} + {404899200 -25200 0 MST} + {420022800 -21600 1 MDT} + {436348800 -25200 0 MST} + {452077200 -21600 1 MDT} + {467798400 -25200 0 MST} + {483526800 -21600 1 MDT} + {499248000 -25200 0 MST} + {514976400 -21600 1 MDT} + {530697600 -25200 0 MST} + {544611600 -21600 1 MDT} + {562147200 -25200 0 MST} + {576061200 -21600 1 MDT} + {594201600 -25200 0 MST} + {607510800 -21600 1 MDT} + {625651200 -25200 0 MST} + {638960400 -21600 1 MDT} + {657100800 -25200 0 MST} + {671014800 -21600 1 MDT} + {688550400 -25200 0 MST} + {702464400 -21600 1 MDT} + {720000000 -25200 0 MST} + {733914000 -21600 1 MDT} + {752054400 -25200 0 MST} + {765363600 -21600 1 MDT} + {783504000 -25200 0 MST} + {796813200 -21600 1 MDT} + {814953600 -25200 0 MST} + {828867600 -21600 1 MDT} + {846403200 -25200 0 MST} + {860317200 -21600 1 MDT} + {877852800 -25200 0 MST} + {891766800 -21600 1 MDT} + {909302400 -25200 0 MST} + {923216400 -21600 1 MDT} + {941356800 -25200 0 MST} + {954666000 -21600 1 MDT} + {972806400 -25200 0 MST} + {986115600 -21600 1 MDT} + {1004256000 -25200 0 MST} + {1018170000 -21600 1 MDT} + {1035705600 -25200 0 MST} + {1049619600 -21600 1 MDT} + {1067155200 -25200 0 MST} + {1081069200 -21600 1 MDT} + {1099209600 -25200 0 MST} + {1112518800 -21600 1 MDT} + {1130659200 -25200 0 MST} + {1143968400 -21600 1 MDT} + {1162108800 -25200 0 MST} + {1173603600 -21600 1 MDT} + {1194163200 -25200 0 MST} + {1205053200 -21600 1 MDT} + {1225612800 -25200 0 MST} + {1236502800 -21600 1 MDT} + {1257062400 -25200 0 MST} + {1268557200 -21600 1 MDT} + {1289116800 -25200 0 MST} + {1300006800 -21600 1 MDT} + {1320566400 -25200 0 MST} + {1331456400 -21600 1 MDT} + {1352016000 -25200 0 MST} + {1362906000 -21600 1 MDT} + {1383465600 -25200 0 MST} + {1394355600 -21600 1 MDT} + {1414915200 -25200 0 MST} + {1425805200 -21600 1 MDT} + {1446364800 -25200 0 MST} + {1457859600 -21600 1 MDT} + {1478419200 -25200 0 MST} + {1489309200 -21600 1 MDT} + {1509868800 -25200 0 MST} + {1520758800 -21600 1 MDT} + {1541318400 -25200 0 MST} + {1552208400 -21600 1 MDT} + {1572768000 -25200 0 MST} + {1583658000 -21600 1 MDT} + {1604217600 -25200 0 MST} + {1615712400 -21600 1 MDT} + {1636272000 -25200 0 MST} + {1647162000 -21600 1 MDT} + {1667721600 -25200 0 MST} + {1678611600 -21600 1 MDT} + {1699171200 -25200 0 MST} + {1710061200 -21600 1 MDT} + {1730620800 -25200 0 MST} + {1741510800 -21600 1 MDT} + {1762070400 -25200 0 MST} + {1772960400 -21600 1 MDT} + {1793520000 -25200 0 MST} + {1805014800 -21600 1 MDT} + {1825574400 -25200 0 MST} + {1836464400 -21600 1 MDT} + {1857024000 -25200 0 MST} + {1867914000 -21600 1 MDT} + {1888473600 -25200 0 MST} + {1899363600 -21600 1 MDT} + {1919923200 -25200 0 MST} + {1930813200 -21600 1 MDT} + {1951372800 -25200 0 MST} + {1962867600 -21600 1 MDT} + {1983427200 -25200 0 MST} + {1994317200 -21600 1 MDT} + {2014876800 -25200 0 MST} + {2025766800 -21600 1 MDT} + {2046326400 -25200 0 MST} + {2057216400 -21600 1 MDT} + {2077776000 -25200 0 MST} + {2088666000 -21600 1 MDT} + {2109225600 -25200 0 MST} + {2120115600 -21600 1 MDT} + {2140675200 -25200 0 MST} + {2152170000 -21600 1 MDT} + {2172729600 -25200 0 MST} + {2183619600 -21600 1 MDT} + {2204179200 -25200 0 MST} + {2215069200 -21600 1 MDT} + {2235628800 -25200 0 MST} + {2246518800 -21600 1 MDT} + {2267078400 -25200 0 MST} + {2277968400 -21600 1 MDT} + {2298528000 -25200 0 MST} + {2309418000 -21600 1 MDT} + {2329977600 -25200 0 MST} + {2341472400 -21600 1 MDT} + {2362032000 -25200 0 MST} + {2372922000 -21600 1 MDT} + {2393481600 -25200 0 MST} + {2404371600 -21600 1 MDT} + {2424931200 -25200 0 MST} + {2435821200 -21600 1 MDT} + {2456380800 -25200 0 MST} + {2467270800 -21600 1 MDT} + {2487830400 -25200 0 MST} + {2499325200 -21600 1 MDT} + {2519884800 -25200 0 MST} + {2530774800 -21600 1 MDT} + {2551334400 -25200 0 MST} + {2562224400 -21600 1 MDT} + {2582784000 -25200 0 MST} + {2593674000 -21600 1 MDT} + {2614233600 -25200 0 MST} + {2625123600 -21600 1 MDT} + {2645683200 -25200 0 MST} + {2656573200 -21600 1 MDT} + {2677132800 -25200 0 MST} + {2688627600 -21600 1 MDT} + {2709187200 -25200 0 MST} + {2720077200 -21600 1 MDT} + {2740636800 -25200 0 MST} + {2751526800 -21600 1 MDT} + {2772086400 -25200 0 MST} + {2782976400 -21600 1 MDT} + {2803536000 -25200 0 MST} + {2814426000 -21600 1 MDT} + {2834985600 -25200 0 MST} + {2846480400 -21600 1 MDT} + {2867040000 -25200 0 MST} + {2877930000 -21600 1 MDT} + {2898489600 -25200 0 MST} + {2909379600 -21600 1 MDT} + {2929939200 -25200 0 MST} + {2940829200 -21600 1 MDT} + {2961388800 -25200 0 MST} + {2972278800 -21600 1 MDT} + {2992838400 -25200 0 MST} + {3003728400 -21600 1 MDT} + {3024288000 -25200 0 MST} + {3035782800 -21600 1 MDT} + {3056342400 -25200 0 MST} + {3067232400 -21600 1 MDT} + {3087792000 -25200 0 MST} + {3098682000 -21600 1 MDT} + {3119241600 -25200 0 MST} + {3130131600 -21600 1 MDT} + {3150691200 -25200 0 MST} + {3161581200 -21600 1 MDT} + {3182140800 -25200 0 MST} + {3193030800 -21600 1 MDT} + {3213590400 -25200 0 MST} + {3225085200 -21600 1 MDT} + {3245644800 -25200 0 MST} + {3256534800 -21600 1 MDT} + {3277094400 -25200 0 MST} + {3287984400 -21600 1 MDT} + {3308544000 -25200 0 MST} + {3319434000 -21600 1 MDT} + {3339993600 -25200 0 MST} + {3350883600 -21600 1 MDT} + {3371443200 -25200 0 MST} + {3382938000 -21600 1 MDT} + {3403497600 -25200 0 MST} + {3414387600 -21600 1 MDT} + {3434947200 -25200 0 MST} + {3445837200 -21600 1 MDT} + {3466396800 -25200 0 MST} + {3477286800 -21600 1 MDT} + {3497846400 -25200 0 MST} + {3508736400 -21600 1 MDT} + {3529296000 -25200 0 MST} + {3540186000 -21600 1 MDT} + {3560745600 -25200 0 MST} + {3572240400 -21600 1 MDT} + {3592800000 -25200 0 MST} + {3603690000 -21600 1 MDT} + {3624249600 -25200 0 MST} + {3635139600 -21600 1 MDT} + {3655699200 -25200 0 MST} + {3666589200 -21600 1 MDT} + {3687148800 -25200 0 MST} + {3698038800 -21600 1 MDT} + {3718598400 -25200 0 MST} + {3730093200 -21600 1 MDT} + {3750652800 -25200 0 MST} + {3761542800 -21600 1 MDT} + {3782102400 -25200 0 MST} + {3792992400 -21600 1 MDT} + {3813552000 -25200 0 MST} + {3824442000 -21600 1 MDT} + {3845001600 -25200 0 MST} + {3855891600 -21600 1 MDT} + {3876451200 -25200 0 MST} + {3887341200 -21600 1 MDT} + {3907900800 -25200 0 MST} + {3919395600 -21600 1 MDT} + {3939955200 -25200 0 MST} + {3950845200 -21600 1 MDT} + {3971404800 -25200 0 MST} + {3982294800 -21600 1 MDT} + {4002854400 -25200 0 MST} + {4013744400 -21600 1 MDT} + {4034304000 -25200 0 MST} + {4045194000 -21600 1 MDT} + {4065753600 -25200 0 MST} + {4076643600 -21600 1 MDT} + {4097203200 -25200 0 MST} +} diff --git a/env/tcl/tcl8.6/tzdata/Mexico/BajaNorte b/env/tcl/tcl8.6/tzdata/Mexico/BajaNorte new file mode 100644 index 0000000..8f6f459 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Mexico/BajaNorte @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(America/Tijuana)]} { + LoadTimeZoneFile America/Tijuana +} +set TZData(:Mexico/BajaNorte) $TZData(:America/Tijuana) diff --git a/env/tcl/tcl8.6/tzdata/Mexico/BajaSur b/env/tcl/tcl8.6/tzdata/Mexico/BajaSur new file mode 100644 index 0000000..6d335a1 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Mexico/BajaSur @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(America/Mazatlan)]} { + LoadTimeZoneFile America/Mazatlan +} +set TZData(:Mexico/BajaSur) $TZData(:America/Mazatlan) diff --git a/env/tcl/tcl8.6/tzdata/Mexico/General b/env/tcl/tcl8.6/tzdata/Mexico/General new file mode 100644 index 0000000..0cac92f --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Mexico/General @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(America/Mexico_City)]} { + LoadTimeZoneFile America/Mexico_City +} +set TZData(:Mexico/General) $TZData(:America/Mexico_City) diff --git a/env/tcl/tcl8.6/tzdata/NZ b/env/tcl/tcl8.6/tzdata/NZ new file mode 100644 index 0000000..36d22a7 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/NZ @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(Pacific/Auckland)]} { + LoadTimeZoneFile Pacific/Auckland +} +set TZData(:NZ) $TZData(:Pacific/Auckland) diff --git a/env/tcl/tcl8.6/tzdata/NZ-CHAT b/env/tcl/tcl8.6/tzdata/NZ-CHAT new file mode 100644 index 0000000..7f7c918 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/NZ-CHAT @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(Pacific/Chatham)]} { + LoadTimeZoneFile Pacific/Chatham +} +set TZData(:NZ-CHAT) $TZData(:Pacific/Chatham) diff --git a/env/tcl/tcl8.6/tzdata/Navajo b/env/tcl/tcl8.6/tzdata/Navajo new file mode 100644 index 0000000..78cc2e2 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Navajo @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(America/Denver)]} { + LoadTimeZoneFile America/Denver +} +set TZData(:Navajo) $TZData(:America/Denver) diff --git a/env/tcl/tcl8.6/tzdata/PRC b/env/tcl/tcl8.6/tzdata/PRC new file mode 100644 index 0000000..1d8bb7c --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/PRC @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(Asia/Shanghai)]} { + LoadTimeZoneFile Asia/Shanghai +} +set TZData(:PRC) $TZData(:Asia/Shanghai) diff --git a/env/tcl/tcl8.6/tzdata/PST8PDT b/env/tcl/tcl8.6/tzdata/PST8PDT new file mode 100644 index 0000000..87a94da --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/PST8PDT @@ -0,0 +1,278 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:PST8PDT) { + {-9223372036854775808 -28800 0 PST} + {-1633269600 -25200 1 PDT} + {-1615129200 -28800 0 PST} + {-1601820000 -25200 1 PDT} + {-1583679600 -28800 0 PST} + {-880207200 -25200 1 PWT} + {-769395600 -25200 1 PPT} + {-765385200 -28800 0 PST} + {-84376800 -25200 1 PDT} + {-68655600 -28800 0 PST} + {-52927200 -25200 1 PDT} + {-37206000 -28800 0 PST} + {-21477600 -25200 1 PDT} + {-5756400 -28800 0 PST} + {9972000 -25200 1 PDT} + {25693200 -28800 0 PST} + {41421600 -25200 1 PDT} + {57747600 -28800 0 PST} + {73476000 -25200 1 PDT} + {89197200 -28800 0 PST} + {104925600 -25200 1 PDT} + {120646800 -28800 0 PST} + {126698400 -25200 1 PDT} + {152096400 -28800 0 PST} + {162381600 -25200 1 PDT} + {183546000 -28800 0 PST} + {199274400 -25200 1 PDT} + {215600400 -28800 0 PST} + {230724000 -25200 1 PDT} + {247050000 -28800 0 PST} + {262778400 -25200 1 PDT} + {278499600 -28800 0 PST} + {294228000 -25200 1 PDT} + {309949200 -28800 0 PST} + {325677600 -25200 1 PDT} + {341398800 -28800 0 PST} + {357127200 -25200 1 PDT} + {372848400 -28800 0 PST} + {388576800 -25200 1 PDT} + {404902800 -28800 0 PST} + {420026400 -25200 1 PDT} + {436352400 -28800 0 PST} + {452080800 -25200 1 PDT} + {467802000 -28800 0 PST} + {483530400 -25200 1 PDT} + {499251600 -28800 0 PST} + {514980000 -25200 1 PDT} + {530701200 -28800 0 PST} + {544615200 -25200 1 PDT} + {562150800 -28800 0 PST} + {576064800 -25200 1 PDT} + {594205200 -28800 0 PST} + {607514400 -25200 1 PDT} + {625654800 -28800 0 PST} + {638964000 -25200 1 PDT} + {657104400 -28800 0 PST} + {671018400 -25200 1 PDT} + {688554000 -28800 0 PST} + {702468000 -25200 1 PDT} + {720003600 -28800 0 PST} + {733917600 -25200 1 PDT} + {752058000 -28800 0 PST} + {765367200 -25200 1 PDT} + {783507600 -28800 0 PST} + {796816800 -25200 1 PDT} + {814957200 -28800 0 PST} + {828871200 -25200 1 PDT} + {846406800 -28800 0 PST} + {860320800 -25200 1 PDT} + {877856400 -28800 0 PST} + {891770400 -25200 1 PDT} + {909306000 -28800 0 PST} + {923220000 -25200 1 PDT} + {941360400 -28800 0 PST} + {954669600 -25200 1 PDT} + {972810000 -28800 0 PST} + {986119200 -25200 1 PDT} + {1004259600 -28800 0 PST} + {1018173600 -25200 1 PDT} + {1035709200 -28800 0 PST} + {1049623200 -25200 1 PDT} + {1067158800 -28800 0 PST} + {1081072800 -25200 1 PDT} + {1099213200 -28800 0 PST} + {1112522400 -25200 1 PDT} + {1130662800 -28800 0 PST} + {1143972000 -25200 1 PDT} + {1162112400 -28800 0 PST} + {1173607200 -25200 1 PDT} + {1194166800 -28800 0 PST} + {1205056800 -25200 1 PDT} + {1225616400 -28800 0 PST} + {1236506400 -25200 1 PDT} + {1257066000 -28800 0 PST} + {1268560800 -25200 1 PDT} + {1289120400 -28800 0 PST} + {1300010400 -25200 1 PDT} + {1320570000 -28800 0 PST} + {1331460000 -25200 1 PDT} + {1352019600 -28800 0 PST} + {1362909600 -25200 1 PDT} + {1383469200 -28800 0 PST} + {1394359200 -25200 1 PDT} + {1414918800 -28800 0 PST} + {1425808800 -25200 1 PDT} + {1446368400 -28800 0 PST} + {1457863200 -25200 1 PDT} + {1478422800 -28800 0 PST} + {1489312800 -25200 1 PDT} + {1509872400 -28800 0 PST} + {1520762400 -25200 1 PDT} + {1541322000 -28800 0 PST} + {1552212000 -25200 1 PDT} + {1572771600 -28800 0 PST} + {1583661600 -25200 1 PDT} + {1604221200 -28800 0 PST} + {1615716000 -25200 1 PDT} + {1636275600 -28800 0 PST} + {1647165600 -25200 1 PDT} + {1667725200 -28800 0 PST} + {1678615200 -25200 1 PDT} + {1699174800 -28800 0 PST} + {1710064800 -25200 1 PDT} + {1730624400 -28800 0 PST} + {1741514400 -25200 1 PDT} + {1762074000 -28800 0 PST} + {1772964000 -25200 1 PDT} + {1793523600 -28800 0 PST} + {1805018400 -25200 1 PDT} + {1825578000 -28800 0 PST} + {1836468000 -25200 1 PDT} + {1857027600 -28800 0 PST} + {1867917600 -25200 1 PDT} + {1888477200 -28800 0 PST} + {1899367200 -25200 1 PDT} + {1919926800 -28800 0 PST} + {1930816800 -25200 1 PDT} + {1951376400 -28800 0 PST} + {1962871200 -25200 1 PDT} + {1983430800 -28800 0 PST} + {1994320800 -25200 1 PDT} + {2014880400 -28800 0 PST} + {2025770400 -25200 1 PDT} + {2046330000 -28800 0 PST} + {2057220000 -25200 1 PDT} + {2077779600 -28800 0 PST} + {2088669600 -25200 1 PDT} + {2109229200 -28800 0 PST} + {2120119200 -25200 1 PDT} + {2140678800 -28800 0 PST} + {2152173600 -25200 1 PDT} + {2172733200 -28800 0 PST} + {2183623200 -25200 1 PDT} + {2204182800 -28800 0 PST} + {2215072800 -25200 1 PDT} + {2235632400 -28800 0 PST} + {2246522400 -25200 1 PDT} + {2267082000 -28800 0 PST} + {2277972000 -25200 1 PDT} + {2298531600 -28800 0 PST} + {2309421600 -25200 1 PDT} + {2329981200 -28800 0 PST} + {2341476000 -25200 1 PDT} + {2362035600 -28800 0 PST} + {2372925600 -25200 1 PDT} + {2393485200 -28800 0 PST} + {2404375200 -25200 1 PDT} + {2424934800 -28800 0 PST} + {2435824800 -25200 1 PDT} + {2456384400 -28800 0 PST} + {2467274400 -25200 1 PDT} + {2487834000 -28800 0 PST} + {2499328800 -25200 1 PDT} + {2519888400 -28800 0 PST} + {2530778400 -25200 1 PDT} + {2551338000 -28800 0 PST} + {2562228000 -25200 1 PDT} + {2582787600 -28800 0 PST} + {2593677600 -25200 1 PDT} + {2614237200 -28800 0 PST} + {2625127200 -25200 1 PDT} + {2645686800 -28800 0 PST} + {2656576800 -25200 1 PDT} + {2677136400 -28800 0 PST} + {2688631200 -25200 1 PDT} + {2709190800 -28800 0 PST} + {2720080800 -25200 1 PDT} + {2740640400 -28800 0 PST} + {2751530400 -25200 1 PDT} + {2772090000 -28800 0 PST} + {2782980000 -25200 1 PDT} + {2803539600 -28800 0 PST} + {2814429600 -25200 1 PDT} + {2834989200 -28800 0 PST} + {2846484000 -25200 1 PDT} + {2867043600 -28800 0 PST} + {2877933600 -25200 1 PDT} + {2898493200 -28800 0 PST} + {2909383200 -25200 1 PDT} + {2929942800 -28800 0 PST} + {2940832800 -25200 1 PDT} + {2961392400 -28800 0 PST} + {2972282400 -25200 1 PDT} + {2992842000 -28800 0 PST} + {3003732000 -25200 1 PDT} + {3024291600 -28800 0 PST} + {3035786400 -25200 1 PDT} + {3056346000 -28800 0 PST} + {3067236000 -25200 1 PDT} + {3087795600 -28800 0 PST} + {3098685600 -25200 1 PDT} + {3119245200 -28800 0 PST} + {3130135200 -25200 1 PDT} + {3150694800 -28800 0 PST} + {3161584800 -25200 1 PDT} + {3182144400 -28800 0 PST} + {3193034400 -25200 1 PDT} + {3213594000 -28800 0 PST} + {3225088800 -25200 1 PDT} + {3245648400 -28800 0 PST} + {3256538400 -25200 1 PDT} + {3277098000 -28800 0 PST} + {3287988000 -25200 1 PDT} + {3308547600 -28800 0 PST} + {3319437600 -25200 1 PDT} + {3339997200 -28800 0 PST} + {3350887200 -25200 1 PDT} + {3371446800 -28800 0 PST} + {3382941600 -25200 1 PDT} + {3403501200 -28800 0 PST} + {3414391200 -25200 1 PDT} + {3434950800 -28800 0 PST} + {3445840800 -25200 1 PDT} + {3466400400 -28800 0 PST} + {3477290400 -25200 1 PDT} + {3497850000 -28800 0 PST} + {3508740000 -25200 1 PDT} + {3529299600 -28800 0 PST} + {3540189600 -25200 1 PDT} + {3560749200 -28800 0 PST} + {3572244000 -25200 1 PDT} + {3592803600 -28800 0 PST} + {3603693600 -25200 1 PDT} + {3624253200 -28800 0 PST} + {3635143200 -25200 1 PDT} + {3655702800 -28800 0 PST} + {3666592800 -25200 1 PDT} + {3687152400 -28800 0 PST} + {3698042400 -25200 1 PDT} + {3718602000 -28800 0 PST} + {3730096800 -25200 1 PDT} + {3750656400 -28800 0 PST} + {3761546400 -25200 1 PDT} + {3782106000 -28800 0 PST} + {3792996000 -25200 1 PDT} + {3813555600 -28800 0 PST} + {3824445600 -25200 1 PDT} + {3845005200 -28800 0 PST} + {3855895200 -25200 1 PDT} + {3876454800 -28800 0 PST} + {3887344800 -25200 1 PDT} + {3907904400 -28800 0 PST} + {3919399200 -25200 1 PDT} + {3939958800 -28800 0 PST} + {3950848800 -25200 1 PDT} + {3971408400 -28800 0 PST} + {3982298400 -25200 1 PDT} + {4002858000 -28800 0 PST} + {4013748000 -25200 1 PDT} + {4034307600 -28800 0 PST} + {4045197600 -25200 1 PDT} + {4065757200 -28800 0 PST} + {4076647200 -25200 1 PDT} + {4097206800 -28800 0 PST} +} diff --git a/env/tcl/tcl8.6/tzdata/Pacific/Apia b/env/tcl/tcl8.6/tzdata/Pacific/Apia new file mode 100644 index 0000000..4fc91f4 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Pacific/Apia @@ -0,0 +1,188 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Pacific/Apia) { + {-9223372036854775808 45184 0 LMT} + {-2445424384 -41216 0 LMT} + {-1861878784 -41400 0 -1130} + {-631110600 -39600 0 -11} + {1285498800 -36000 1 -11} + {1301752800 -39600 0 -11} + {1316872800 -36000 1 -11} + {1325239200 50400 0 +13} + {1333202400 46800 0 +13} + {1348927200 50400 1 +13} + {1365256800 46800 0 +13} + {1380376800 50400 1 +13} + {1396706400 46800 0 +13} + {1411826400 50400 1 +13} + {1428156000 46800 0 +13} + {1443276000 50400 1 +13} + {1459605600 46800 0 +13} + {1474725600 50400 1 +13} + {1491055200 46800 0 +13} + {1506175200 50400 1 +13} + {1522504800 46800 0 +13} + {1538229600 50400 1 +13} + {1554559200 46800 0 +13} + {1569679200 50400 1 +13} + {1586008800 46800 0 +13} + {1601128800 50400 1 +13} + {1617458400 46800 0 +13} + {1632578400 50400 1 +13} + {1648908000 46800 0 +13} + {1664028000 50400 1 +13} + {1680357600 46800 0 +13} + {1695477600 50400 1 +13} + {1712412000 46800 0 +13} + {1727532000 50400 1 +13} + {1743861600 46800 0 +13} + {1758981600 50400 1 +13} + {1775311200 46800 0 +13} + {1790431200 50400 1 +13} + {1806760800 46800 0 +13} + {1821880800 50400 1 +13} + {1838210400 46800 0 +13} + {1853330400 50400 1 +13} + {1869660000 46800 0 +13} + {1885384800 50400 1 +13} + {1901714400 46800 0 +13} + {1916834400 50400 1 +13} + {1933164000 46800 0 +13} + {1948284000 50400 1 +13} + {1964613600 46800 0 +13} + {1979733600 50400 1 +13} + {1996063200 46800 0 +13} + {2011183200 50400 1 +13} + {2027512800 46800 0 +13} + {2042632800 50400 1 +13} + {2058962400 46800 0 +13} + {2074687200 50400 1 +13} + {2091016800 46800 0 +13} + {2106136800 50400 1 +13} + {2122466400 46800 0 +13} + {2137586400 50400 1 +13} + {2153916000 46800 0 +13} + {2169036000 50400 1 +13} + {2185365600 46800 0 +13} + {2200485600 50400 1 +13} + {2216815200 46800 0 +13} + {2232540000 50400 1 +13} + {2248869600 46800 0 +13} + {2263989600 50400 1 +13} + {2280319200 46800 0 +13} + {2295439200 50400 1 +13} + {2311768800 46800 0 +13} + {2326888800 50400 1 +13} + {2343218400 46800 0 +13} + {2358338400 50400 1 +13} + {2374668000 46800 0 +13} + {2389788000 50400 1 +13} + {2406117600 46800 0 +13} + {2421842400 50400 1 +13} + {2438172000 46800 0 +13} + {2453292000 50400 1 +13} + {2469621600 46800 0 +13} + {2484741600 50400 1 +13} + {2501071200 46800 0 +13} + {2516191200 50400 1 +13} + {2532520800 46800 0 +13} + {2547640800 50400 1 +13} + {2563970400 46800 0 +13} + {2579090400 50400 1 +13} + {2596024800 46800 0 +13} + {2611144800 50400 1 +13} + {2627474400 46800 0 +13} + {2642594400 50400 1 +13} + {2658924000 46800 0 +13} + {2674044000 50400 1 +13} + {2690373600 46800 0 +13} + {2705493600 50400 1 +13} + {2721823200 46800 0 +13} + {2736943200 50400 1 +13} + {2753272800 46800 0 +13} + {2768997600 50400 1 +13} + {2785327200 46800 0 +13} + {2800447200 50400 1 +13} + {2816776800 46800 0 +13} + {2831896800 50400 1 +13} + {2848226400 46800 0 +13} + {2863346400 50400 1 +13} + {2879676000 46800 0 +13} + {2894796000 50400 1 +13} + {2911125600 46800 0 +13} + {2926245600 50400 1 +13} + {2942575200 46800 0 +13} + {2958300000 50400 1 +13} + {2974629600 46800 0 +13} + {2989749600 50400 1 +13} + {3006079200 46800 0 +13} + {3021199200 50400 1 +13} + {3037528800 46800 0 +13} + {3052648800 50400 1 +13} + {3068978400 46800 0 +13} + {3084098400 50400 1 +13} + {3100428000 46800 0 +13} + {3116152800 50400 1 +13} + {3132482400 46800 0 +13} + {3147602400 50400 1 +13} + {3163932000 46800 0 +13} + {3179052000 50400 1 +13} + {3195381600 46800 0 +13} + {3210501600 50400 1 +13} + {3226831200 46800 0 +13} + {3241951200 50400 1 +13} + {3258280800 46800 0 +13} + {3273400800 50400 1 +13} + {3289730400 46800 0 +13} + {3305455200 50400 1 +13} + {3321784800 46800 0 +13} + {3336904800 50400 1 +13} + {3353234400 46800 0 +13} + {3368354400 50400 1 +13} + {3384684000 46800 0 +13} + {3399804000 50400 1 +13} + {3416133600 46800 0 +13} + {3431253600 50400 1 +13} + {3447583200 46800 0 +13} + {3462703200 50400 1 +13} + {3479637600 46800 0 +13} + {3494757600 50400 1 +13} + {3511087200 46800 0 +13} + {3526207200 50400 1 +13} + {3542536800 46800 0 +13} + {3557656800 50400 1 +13} + {3573986400 46800 0 +13} + {3589106400 50400 1 +13} + {3605436000 46800 0 +13} + {3620556000 50400 1 +13} + {3636885600 46800 0 +13} + {3652610400 50400 1 +13} + {3668940000 46800 0 +13} + {3684060000 50400 1 +13} + {3700389600 46800 0 +13} + {3715509600 50400 1 +13} + {3731839200 46800 0 +13} + {3746959200 50400 1 +13} + {3763288800 46800 0 +13} + {3778408800 50400 1 +13} + {3794738400 46800 0 +13} + {3809858400 50400 1 +13} + {3826188000 46800 0 +13} + {3841912800 50400 1 +13} + {3858242400 46800 0 +13} + {3873362400 50400 1 +13} + {3889692000 46800 0 +13} + {3904812000 50400 1 +13} + {3921141600 46800 0 +13} + {3936261600 50400 1 +13} + {3952591200 46800 0 +13} + {3967711200 50400 1 +13} + {3984040800 46800 0 +13} + {3999765600 50400 1 +13} + {4016095200 46800 0 +13} + {4031215200 50400 1 +13} + {4047544800 46800 0 +13} + {4062664800 50400 1 +13} + {4078994400 46800 0 +13} + {4094114400 50400 1 +13} +} diff --git a/env/tcl/tcl8.6/tzdata/Pacific/Auckland b/env/tcl/tcl8.6/tzdata/Pacific/Auckland new file mode 100644 index 0000000..5f7e238 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Pacific/Auckland @@ -0,0 +1,285 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Pacific/Auckland) { + {-9223372036854775808 41944 0 LMT} + {-3192435544 41400 0 NZMT} + {-1330335000 45000 1 NZST} + {-1320057000 41400 0 NZMT} + {-1300699800 43200 1 NZST} + {-1287396000 41400 0 NZMT} + {-1269250200 43200 1 NZST} + {-1255946400 41400 0 NZMT} + {-1237800600 43200 1 NZST} + {-1224496800 41400 0 NZMT} + {-1206351000 43200 1 NZST} + {-1192442400 41400 0 NZMT} + {-1174901400 43200 1 NZST} + {-1160992800 41400 0 NZMT} + {-1143451800 43200 1 NZST} + {-1125914400 41400 0 NZMT} + {-1112607000 43200 1 NZST} + {-1094464800 41400 0 NZMT} + {-1081157400 43200 1 NZST} + {-1063015200 41400 0 NZMT} + {-1049707800 43200 1 NZST} + {-1031565600 41400 0 NZMT} + {-1018258200 43200 1 NZST} + {-1000116000 41400 0 NZMT} + {-986808600 43200 1 NZST} + {-968061600 41400 0 NZMT} + {-955359000 43200 1 NZST} + {-936612000 41400 0 NZMT} + {-923304600 43200 1 NZST} + {-757425600 43200 0 NZST} + {152632800 46800 1 NZDT} + {162309600 43200 0 NZST} + {183477600 46800 1 NZDT} + {194968800 43200 0 NZST} + {215532000 46800 1 NZDT} + {226418400 43200 0 NZST} + {246981600 46800 1 NZDT} + {257868000 43200 0 NZST} + {278431200 46800 1 NZDT} + {289317600 43200 0 NZST} + {309880800 46800 1 NZDT} + {320767200 43200 0 NZST} + {341330400 46800 1 NZDT} + {352216800 43200 0 NZST} + {372780000 46800 1 NZDT} + {384271200 43200 0 NZST} + {404834400 46800 1 NZDT} + {415720800 43200 0 NZST} + {436284000 46800 1 NZDT} + {447170400 43200 0 NZST} + {467733600 46800 1 NZDT} + {478620000 43200 0 NZST} + {499183200 46800 1 NZDT} + {510069600 43200 0 NZST} + {530632800 46800 1 NZDT} + {541519200 43200 0 NZST} + {562082400 46800 1 NZDT} + {573573600 43200 0 NZST} + {594136800 46800 1 NZDT} + {605023200 43200 0 NZST} + {623772000 46800 1 NZDT} + {637682400 43200 0 NZST} + {655221600 46800 1 NZDT} + {669132000 43200 0 NZST} + {686671200 46800 1 NZDT} + {700581600 43200 0 NZST} + {718120800 46800 1 NZDT} + {732636000 43200 0 NZST} + {749570400 46800 1 NZDT} + {764085600 43200 0 NZST} + {781020000 46800 1 NZDT} + {795535200 43200 0 NZST} + {812469600 46800 1 NZDT} + {826984800 43200 0 NZST} + {844524000 46800 1 NZDT} + {858434400 43200 0 NZST} + {875973600 46800 1 NZDT} + {889884000 43200 0 NZST} + {907423200 46800 1 NZDT} + {921938400 43200 0 NZST} + {938872800 46800 1 NZDT} + {953388000 43200 0 NZST} + {970322400 46800 1 NZDT} + {984837600 43200 0 NZST} + {1002376800 46800 1 NZDT} + {1016287200 43200 0 NZST} + {1033826400 46800 1 NZDT} + {1047736800 43200 0 NZST} + {1065276000 46800 1 NZDT} + {1079791200 43200 0 NZST} + {1096725600 46800 1 NZDT} + {1111240800 43200 0 NZST} + {1128175200 46800 1 NZDT} + {1142690400 43200 0 NZST} + {1159624800 46800 1 NZDT} + {1174140000 43200 0 NZST} + {1191074400 46800 1 NZDT} + {1207404000 43200 0 NZST} + {1222524000 46800 1 NZDT} + {1238853600 43200 0 NZST} + {1253973600 46800 1 NZDT} + {1270303200 43200 0 NZST} + {1285423200 46800 1 NZDT} + {1301752800 43200 0 NZST} + {1316872800 46800 1 NZDT} + {1333202400 43200 0 NZST} + {1348927200 46800 1 NZDT} + {1365256800 43200 0 NZST} + {1380376800 46800 1 NZDT} + {1396706400 43200 0 NZST} + {1411826400 46800 1 NZDT} + {1428156000 43200 0 NZST} + {1443276000 46800 1 NZDT} + {1459605600 43200 0 NZST} + {1474725600 46800 1 NZDT} + {1491055200 43200 0 NZST} + {1506175200 46800 1 NZDT} + {1522504800 43200 0 NZST} + {1538229600 46800 1 NZDT} + {1554559200 43200 0 NZST} + {1569679200 46800 1 NZDT} + {1586008800 43200 0 NZST} + {1601128800 46800 1 NZDT} + {1617458400 43200 0 NZST} + {1632578400 46800 1 NZDT} + {1648908000 43200 0 NZST} + {1664028000 46800 1 NZDT} + {1680357600 43200 0 NZST} + {1695477600 46800 1 NZDT} + {1712412000 43200 0 NZST} + {1727532000 46800 1 NZDT} + {1743861600 43200 0 NZST} + {1758981600 46800 1 NZDT} + {1775311200 43200 0 NZST} + {1790431200 46800 1 NZDT} + {1806760800 43200 0 NZST} + {1821880800 46800 1 NZDT} + {1838210400 43200 0 NZST} + {1853330400 46800 1 NZDT} + {1869660000 43200 0 NZST} + {1885384800 46800 1 NZDT} + {1901714400 43200 0 NZST} + {1916834400 46800 1 NZDT} + {1933164000 43200 0 NZST} + {1948284000 46800 1 NZDT} + {1964613600 43200 0 NZST} + {1979733600 46800 1 NZDT} + {1996063200 43200 0 NZST} + {2011183200 46800 1 NZDT} + {2027512800 43200 0 NZST} + {2042632800 46800 1 NZDT} + {2058962400 43200 0 NZST} + {2074687200 46800 1 NZDT} + {2091016800 43200 0 NZST} + {2106136800 46800 1 NZDT} + {2122466400 43200 0 NZST} + {2137586400 46800 1 NZDT} + {2153916000 43200 0 NZST} + {2169036000 46800 1 NZDT} + {2185365600 43200 0 NZST} + {2200485600 46800 1 NZDT} + {2216815200 43200 0 NZST} + {2232540000 46800 1 NZDT} + {2248869600 43200 0 NZST} + {2263989600 46800 1 NZDT} + {2280319200 43200 0 NZST} + {2295439200 46800 1 NZDT} + {2311768800 43200 0 NZST} + {2326888800 46800 1 NZDT} + {2343218400 43200 0 NZST} + {2358338400 46800 1 NZDT} + {2374668000 43200 0 NZST} + {2389788000 46800 1 NZDT} + {2406117600 43200 0 NZST} + {2421842400 46800 1 NZDT} + {2438172000 43200 0 NZST} + {2453292000 46800 1 NZDT} + {2469621600 43200 0 NZST} + {2484741600 46800 1 NZDT} + {2501071200 43200 0 NZST} + {2516191200 46800 1 NZDT} + {2532520800 43200 0 NZST} + {2547640800 46800 1 NZDT} + {2563970400 43200 0 NZST} + {2579090400 46800 1 NZDT} + {2596024800 43200 0 NZST} + {2611144800 46800 1 NZDT} + {2627474400 43200 0 NZST} + {2642594400 46800 1 NZDT} + {2658924000 43200 0 NZST} + {2674044000 46800 1 NZDT} + {2690373600 43200 0 NZST} + {2705493600 46800 1 NZDT} + {2721823200 43200 0 NZST} + {2736943200 46800 1 NZDT} + {2753272800 43200 0 NZST} + {2768997600 46800 1 NZDT} + {2785327200 43200 0 NZST} + {2800447200 46800 1 NZDT} + {2816776800 43200 0 NZST} + {2831896800 46800 1 NZDT} + {2848226400 43200 0 NZST} + {2863346400 46800 1 NZDT} + {2879676000 43200 0 NZST} + {2894796000 46800 1 NZDT} + {2911125600 43200 0 NZST} + {2926245600 46800 1 NZDT} + {2942575200 43200 0 NZST} + {2958300000 46800 1 NZDT} + {2974629600 43200 0 NZST} + {2989749600 46800 1 NZDT} + {3006079200 43200 0 NZST} + {3021199200 46800 1 NZDT} + {3037528800 43200 0 NZST} + {3052648800 46800 1 NZDT} + {3068978400 43200 0 NZST} + {3084098400 46800 1 NZDT} + {3100428000 43200 0 NZST} + {3116152800 46800 1 NZDT} + {3132482400 43200 0 NZST} + {3147602400 46800 1 NZDT} + {3163932000 43200 0 NZST} + {3179052000 46800 1 NZDT} + {3195381600 43200 0 NZST} + {3210501600 46800 1 NZDT} + {3226831200 43200 0 NZST} + {3241951200 46800 1 NZDT} + {3258280800 43200 0 NZST} + {3273400800 46800 1 NZDT} + {3289730400 43200 0 NZST} + {3305455200 46800 1 NZDT} + {3321784800 43200 0 NZST} + {3336904800 46800 1 NZDT} + {3353234400 43200 0 NZST} + {3368354400 46800 1 NZDT} + {3384684000 43200 0 NZST} + {3399804000 46800 1 NZDT} + {3416133600 43200 0 NZST} + {3431253600 46800 1 NZDT} + {3447583200 43200 0 NZST} + {3462703200 46800 1 NZDT} + {3479637600 43200 0 NZST} + {3494757600 46800 1 NZDT} + {3511087200 43200 0 NZST} + {3526207200 46800 1 NZDT} + {3542536800 43200 0 NZST} + {3557656800 46800 1 NZDT} + {3573986400 43200 0 NZST} + {3589106400 46800 1 NZDT} + {3605436000 43200 0 NZST} + {3620556000 46800 1 NZDT} + {3636885600 43200 0 NZST} + {3652610400 46800 1 NZDT} + {3668940000 43200 0 NZST} + {3684060000 46800 1 NZDT} + {3700389600 43200 0 NZST} + {3715509600 46800 1 NZDT} + {3731839200 43200 0 NZST} + {3746959200 46800 1 NZDT} + {3763288800 43200 0 NZST} + {3778408800 46800 1 NZDT} + {3794738400 43200 0 NZST} + {3809858400 46800 1 NZDT} + {3826188000 43200 0 NZST} + {3841912800 46800 1 NZDT} + {3858242400 43200 0 NZST} + {3873362400 46800 1 NZDT} + {3889692000 43200 0 NZST} + {3904812000 46800 1 NZDT} + {3921141600 43200 0 NZST} + {3936261600 46800 1 NZDT} + {3952591200 43200 0 NZST} + {3967711200 46800 1 NZDT} + {3984040800 43200 0 NZST} + {3999765600 46800 1 NZDT} + {4016095200 43200 0 NZST} + {4031215200 46800 1 NZDT} + {4047544800 43200 0 NZST} + {4062664800 46800 1 NZDT} + {4078994400 43200 0 NZST} + {4094114400 46800 1 NZDT} +} diff --git a/env/tcl/tcl8.6/tzdata/Pacific/Bougainville b/env/tcl/tcl8.6/tzdata/Pacific/Bougainville new file mode 100644 index 0000000..3c00b29 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Pacific/Bougainville @@ -0,0 +1,10 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Pacific/Bougainville) { + {-9223372036854775808 37336 0 LMT} + {-2840178136 35312 0 PMMT} + {-2366790512 36000 0 +10} + {-868010400 32400 0 +09} + {-768906000 36000 0 +10} + {1419696000 39600 0 +11} +} diff --git a/env/tcl/tcl8.6/tzdata/Pacific/Chatham b/env/tcl/tcl8.6/tzdata/Pacific/Chatham new file mode 100644 index 0000000..6c1ab19 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Pacific/Chatham @@ -0,0 +1,258 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Pacific/Chatham) { + {-9223372036854775808 44028 0 LMT} + {-3192437628 44100 0 +1215} + {-757426500 45900 0 +1245} + {152632800 49500 1 +1245} + {162309600 45900 0 +1245} + {183477600 49500 1 +1245} + {194968800 45900 0 +1245} + {215532000 49500 1 +1245} + {226418400 45900 0 +1245} + {246981600 49500 1 +1245} + {257868000 45900 0 +1245} + {278431200 49500 1 +1245} + {289317600 45900 0 +1245} + {309880800 49500 1 +1245} + {320767200 45900 0 +1245} + {341330400 49500 1 +1245} + {352216800 45900 0 +1245} + {372780000 49500 1 +1245} + {384271200 45900 0 +1245} + {404834400 49500 1 +1245} + {415720800 45900 0 +1245} + {436284000 49500 1 +1245} + {447170400 45900 0 +1245} + {467733600 49500 1 +1245} + {478620000 45900 0 +1245} + {499183200 49500 1 +1245} + {510069600 45900 0 +1245} + {530632800 49500 1 +1245} + {541519200 45900 0 +1245} + {562082400 49500 1 +1245} + {573573600 45900 0 +1245} + {594136800 49500 1 +1245} + {605023200 45900 0 +1245} + {623772000 49500 1 +1245} + {637682400 45900 0 +1245} + {655221600 49500 1 +1245} + {669132000 45900 0 +1245} + {686671200 49500 1 +1245} + {700581600 45900 0 +1245} + {718120800 49500 1 +1245} + {732636000 45900 0 +1245} + {749570400 49500 1 +1245} + {764085600 45900 0 +1245} + {781020000 49500 1 +1245} + {795535200 45900 0 +1245} + {812469600 49500 1 +1245} + {826984800 45900 0 +1245} + {844524000 49500 1 +1245} + {858434400 45900 0 +1245} + {875973600 49500 1 +1245} + {889884000 45900 0 +1245} + {907423200 49500 1 +1245} + {921938400 45900 0 +1245} + {938872800 49500 1 +1245} + {953388000 45900 0 +1245} + {970322400 49500 1 +1245} + {984837600 45900 0 +1245} + {1002376800 49500 1 +1245} + {1016287200 45900 0 +1245} + {1033826400 49500 1 +1245} + {1047736800 45900 0 +1245} + {1065276000 49500 1 +1245} + {1079791200 45900 0 +1245} + {1096725600 49500 1 +1245} + {1111240800 45900 0 +1245} + {1128175200 49500 1 +1245} + {1142690400 45900 0 +1245} + {1159624800 49500 1 +1245} + {1174140000 45900 0 +1245} + {1191074400 49500 1 +1245} + {1207404000 45900 0 +1245} + {1222524000 49500 1 +1245} + {1238853600 45900 0 +1245} + {1253973600 49500 1 +1245} + {1270303200 45900 0 +1245} + {1285423200 49500 1 +1245} + {1301752800 45900 0 +1245} + {1316872800 49500 1 +1245} + {1333202400 45900 0 +1245} + {1348927200 49500 1 +1245} + {1365256800 45900 0 +1245} + {1380376800 49500 1 +1245} + {1396706400 45900 0 +1245} + {1411826400 49500 1 +1245} + {1428156000 45900 0 +1245} + {1443276000 49500 1 +1245} + {1459605600 45900 0 +1245} + {1474725600 49500 1 +1245} + {1491055200 45900 0 +1245} + {1506175200 49500 1 +1245} + {1522504800 45900 0 +1245} + {1538229600 49500 1 +1245} + {1554559200 45900 0 +1245} + {1569679200 49500 1 +1245} + {1586008800 45900 0 +1245} + {1601128800 49500 1 +1245} + {1617458400 45900 0 +1245} + {1632578400 49500 1 +1245} + {1648908000 45900 0 +1245} + {1664028000 49500 1 +1245} + {1680357600 45900 0 +1245} + {1695477600 49500 1 +1245} + {1712412000 45900 0 +1245} + {1727532000 49500 1 +1245} + {1743861600 45900 0 +1245} + {1758981600 49500 1 +1245} + {1775311200 45900 0 +1245} + {1790431200 49500 1 +1245} + {1806760800 45900 0 +1245} + {1821880800 49500 1 +1245} + {1838210400 45900 0 +1245} + {1853330400 49500 1 +1245} + {1869660000 45900 0 +1245} + {1885384800 49500 1 +1245} + {1901714400 45900 0 +1245} + {1916834400 49500 1 +1245} + {1933164000 45900 0 +1245} + {1948284000 49500 1 +1245} + {1964613600 45900 0 +1245} + {1979733600 49500 1 +1245} + {1996063200 45900 0 +1245} + {2011183200 49500 1 +1245} + {2027512800 45900 0 +1245} + {2042632800 49500 1 +1245} + {2058962400 45900 0 +1245} + {2074687200 49500 1 +1245} + {2091016800 45900 0 +1245} + {2106136800 49500 1 +1245} + {2122466400 45900 0 +1245} + {2137586400 49500 1 +1245} + {2153916000 45900 0 +1245} + {2169036000 49500 1 +1245} + {2185365600 45900 0 +1245} + {2200485600 49500 1 +1245} + {2216815200 45900 0 +1245} + {2232540000 49500 1 +1245} + {2248869600 45900 0 +1245} + {2263989600 49500 1 +1245} + {2280319200 45900 0 +1245} + {2295439200 49500 1 +1245} + {2311768800 45900 0 +1245} + {2326888800 49500 1 +1245} + {2343218400 45900 0 +1245} + {2358338400 49500 1 +1245} + {2374668000 45900 0 +1245} + {2389788000 49500 1 +1245} + {2406117600 45900 0 +1245} + {2421842400 49500 1 +1245} + {2438172000 45900 0 +1245} + {2453292000 49500 1 +1245} + {2469621600 45900 0 +1245} + {2484741600 49500 1 +1245} + {2501071200 45900 0 +1245} + {2516191200 49500 1 +1245} + {2532520800 45900 0 +1245} + {2547640800 49500 1 +1245} + {2563970400 45900 0 +1245} + {2579090400 49500 1 +1245} + {2596024800 45900 0 +1245} + {2611144800 49500 1 +1245} + {2627474400 45900 0 +1245} + {2642594400 49500 1 +1245} + {2658924000 45900 0 +1245} + {2674044000 49500 1 +1245} + {2690373600 45900 0 +1245} + {2705493600 49500 1 +1245} + {2721823200 45900 0 +1245} + {2736943200 49500 1 +1245} + {2753272800 45900 0 +1245} + {2768997600 49500 1 +1245} + {2785327200 45900 0 +1245} + {2800447200 49500 1 +1245} + {2816776800 45900 0 +1245} + {2831896800 49500 1 +1245} + {2848226400 45900 0 +1245} + {2863346400 49500 1 +1245} + {2879676000 45900 0 +1245} + {2894796000 49500 1 +1245} + {2911125600 45900 0 +1245} + {2926245600 49500 1 +1245} + {2942575200 45900 0 +1245} + {2958300000 49500 1 +1245} + {2974629600 45900 0 +1245} + {2989749600 49500 1 +1245} + {3006079200 45900 0 +1245} + {3021199200 49500 1 +1245} + {3037528800 45900 0 +1245} + {3052648800 49500 1 +1245} + {3068978400 45900 0 +1245} + {3084098400 49500 1 +1245} + {3100428000 45900 0 +1245} + {3116152800 49500 1 +1245} + {3132482400 45900 0 +1245} + {3147602400 49500 1 +1245} + {3163932000 45900 0 +1245} + {3179052000 49500 1 +1245} + {3195381600 45900 0 +1245} + {3210501600 49500 1 +1245} + {3226831200 45900 0 +1245} + {3241951200 49500 1 +1245} + {3258280800 45900 0 +1245} + {3273400800 49500 1 +1245} + {3289730400 45900 0 +1245} + {3305455200 49500 1 +1245} + {3321784800 45900 0 +1245} + {3336904800 49500 1 +1245} + {3353234400 45900 0 +1245} + {3368354400 49500 1 +1245} + {3384684000 45900 0 +1245} + {3399804000 49500 1 +1245} + {3416133600 45900 0 +1245} + {3431253600 49500 1 +1245} + {3447583200 45900 0 +1245} + {3462703200 49500 1 +1245} + {3479637600 45900 0 +1245} + {3494757600 49500 1 +1245} + {3511087200 45900 0 +1245} + {3526207200 49500 1 +1245} + {3542536800 45900 0 +1245} + {3557656800 49500 1 +1245} + {3573986400 45900 0 +1245} + {3589106400 49500 1 +1245} + {3605436000 45900 0 +1245} + {3620556000 49500 1 +1245} + {3636885600 45900 0 +1245} + {3652610400 49500 1 +1245} + {3668940000 45900 0 +1245} + {3684060000 49500 1 +1245} + {3700389600 45900 0 +1245} + {3715509600 49500 1 +1245} + {3731839200 45900 0 +1245} + {3746959200 49500 1 +1245} + {3763288800 45900 0 +1245} + {3778408800 49500 1 +1245} + {3794738400 45900 0 +1245} + {3809858400 49500 1 +1245} + {3826188000 45900 0 +1245} + {3841912800 49500 1 +1245} + {3858242400 45900 0 +1245} + {3873362400 49500 1 +1245} + {3889692000 45900 0 +1245} + {3904812000 49500 1 +1245} + {3921141600 45900 0 +1245} + {3936261600 49500 1 +1245} + {3952591200 45900 0 +1245} + {3967711200 49500 1 +1245} + {3984040800 45900 0 +1245} + {3999765600 49500 1 +1245} + {4016095200 45900 0 +1245} + {4031215200 49500 1 +1245} + {4047544800 45900 0 +1245} + {4062664800 49500 1 +1245} + {4078994400 45900 0 +1245} + {4094114400 49500 1 +1245} +} diff --git a/env/tcl/tcl8.6/tzdata/Pacific/Chuuk b/env/tcl/tcl8.6/tzdata/Pacific/Chuuk new file mode 100644 index 0000000..4e9d099 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Pacific/Chuuk @@ -0,0 +1,6 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Pacific/Chuuk) { + {-9223372036854775808 36428 0 LMT} + {-2177489228 36000 0 +10} +} diff --git a/env/tcl/tcl8.6/tzdata/Pacific/Easter b/env/tcl/tcl8.6/tzdata/Pacific/Easter new file mode 100644 index 0000000..7a8d525 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Pacific/Easter @@ -0,0 +1,268 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Pacific/Easter) { + {-9223372036854775808 -26248 0 LMT} + {-2524495352 -26248 0 EMT} + {-1178124152 -25200 0 -07} + {-36619200 -21600 1 -07} + {-23922000 -25200 0 -07} + {-3355200 -21600 1 -07} + {7527600 -25200 0 -07} + {24465600 -21600 1 -07} + {37767600 -25200 0 -07} + {55915200 -21600 1 -07} + {69217200 -25200 0 -07} + {87969600 -21600 1 -07} + {100666800 -25200 0 -07} + {118209600 -21600 1 -07} + {132116400 -25200 0 -07} + {150868800 -21600 1 -07} + {163566000 -25200 0 -07} + {182318400 -21600 1 -07} + {195620400 -25200 0 -07} + {213768000 -21600 1 -07} + {227070000 -25200 0 -07} + {245217600 -21600 1 -07} + {258519600 -25200 0 -07} + {277272000 -21600 1 -07} + {289969200 -25200 0 -07} + {308721600 -21600 1 -07} + {321418800 -25200 0 -07} + {340171200 -21600 1 -07} + {353473200 -25200 0 -07} + {371620800 -21600 1 -07} + {384922800 -21600 0 -06} + {403070400 -18000 1 -06} + {416372400 -21600 0 -06} + {434520000 -18000 1 -06} + {447822000 -21600 0 -06} + {466574400 -18000 1 -06} + {479271600 -21600 0 -06} + {498024000 -18000 1 -06} + {510721200 -21600 0 -06} + {529473600 -18000 1 -06} + {545194800 -21600 0 -06} + {560923200 -18000 1 -06} + {574225200 -21600 0 -06} + {592372800 -18000 1 -06} + {605674800 -21600 0 -06} + {624427200 -18000 1 -06} + {637124400 -21600 0 -06} + {653457600 -18000 1 -06} + {668574000 -21600 0 -06} + {687326400 -18000 1 -06} + {700628400 -21600 0 -06} + {718776000 -18000 1 -06} + {732078000 -21600 0 -06} + {750225600 -18000 1 -06} + {763527600 -21600 0 -06} + {781675200 -18000 1 -06} + {794977200 -21600 0 -06} + {813729600 -18000 1 -06} + {826426800 -21600 0 -06} + {845179200 -18000 1 -06} + {859690800 -21600 0 -06} + {876628800 -18000 1 -06} + {889930800 -21600 0 -06} + {906868800 -18000 1 -06} + {923194800 -21600 0 -06} + {939528000 -18000 1 -06} + {952830000 -21600 0 -06} + {971582400 -18000 1 -06} + {984279600 -21600 0 -06} + {1003032000 -18000 1 -06} + {1015729200 -21600 0 -06} + {1034481600 -18000 1 -06} + {1047178800 -21600 0 -06} + {1065931200 -18000 1 -06} + {1079233200 -21600 0 -06} + {1097380800 -18000 1 -06} + {1110682800 -21600 0 -06} + {1128830400 -18000 1 -06} + {1142132400 -21600 0 -06} + {1160884800 -18000 1 -06} + {1173582000 -21600 0 -06} + {1192334400 -18000 1 -06} + {1206846000 -21600 0 -06} + {1223784000 -18000 1 -06} + {1237086000 -21600 0 -06} + {1255233600 -18000 1 -06} + {1270350000 -21600 0 -06} + {1286683200 -18000 1 -06} + {1304823600 -21600 0 -06} + {1313899200 -18000 1 -06} + {1335668400 -21600 0 -06} + {1346558400 -18000 1 -06} + {1367118000 -21600 0 -06} + {1378612800 -18000 1 -06} + {1398567600 -21600 0 -06} + {1410062400 -18000 1 -06} + {1463281200 -21600 0 -06} + {1471147200 -18000 1 -06} + {1494730800 -21600 0 -06} + {1502596800 -18000 1 -06} + {1526180400 -21600 0 -06} + {1534046400 -18000 1 -06} + {1554606000 -21600 0 -06} + {1567915200 -18000 1 -06} + {1586055600 -21600 0 -06} + {1599364800 -18000 1 -06} + {1617505200 -21600 0 -06} + {1630814400 -18000 1 -06} + {1648954800 -21600 0 -06} + {1662264000 -18000 1 -06} + {1680404400 -21600 0 -06} + {1693713600 -18000 1 -06} + {1712458800 -21600 0 -06} + {1725768000 -18000 1 -06} + {1743908400 -21600 0 -06} + {1757217600 -18000 1 -06} + {1775358000 -21600 0 -06} + {1788667200 -18000 1 -06} + {1806807600 -21600 0 -06} + {1820116800 -18000 1 -06} + {1838257200 -21600 0 -06} + {1851566400 -18000 1 -06} + {1870311600 -21600 0 -06} + {1883016000 -18000 1 -06} + {1901761200 -21600 0 -06} + {1915070400 -18000 1 -06} + {1933210800 -21600 0 -06} + {1946520000 -18000 1 -06} + {1964660400 -21600 0 -06} + {1977969600 -18000 1 -06} + {1996110000 -21600 0 -06} + {2009419200 -18000 1 -06} + {2027559600 -21600 0 -06} + {2040868800 -18000 1 -06} + {2059614000 -21600 0 -06} + {2072318400 -18000 1 -06} + {2091063600 -21600 0 -06} + {2104372800 -18000 1 -06} + {2122513200 -21600 0 -06} + {2135822400 -18000 1 -06} + {2153962800 -21600 0 -06} + {2167272000 -18000 1 -06} + {2185412400 -21600 0 -06} + {2198721600 -18000 1 -06} + {2217466800 -21600 0 -06} + {2230171200 -18000 1 -06} + {2248916400 -21600 0 -06} + {2262225600 -18000 1 -06} + {2280366000 -21600 0 -06} + {2293675200 -18000 1 -06} + {2311815600 -21600 0 -06} + {2325124800 -18000 1 -06} + {2343265200 -21600 0 -06} + {2356574400 -18000 1 -06} + {2374714800 -21600 0 -06} + {2388024000 -18000 1 -06} + {2406769200 -21600 0 -06} + {2419473600 -18000 1 -06} + {2438218800 -21600 0 -06} + {2451528000 -18000 1 -06} + {2469668400 -21600 0 -06} + {2482977600 -18000 1 -06} + {2501118000 -21600 0 -06} + {2514427200 -18000 1 -06} + {2532567600 -21600 0 -06} + {2545876800 -18000 1 -06} + {2564017200 -21600 0 -06} + {2577326400 -18000 1 -06} + {2596071600 -21600 0 -06} + {2609380800 -18000 1 -06} + {2627521200 -21600 0 -06} + {2640830400 -18000 1 -06} + {2658970800 -21600 0 -06} + {2672280000 -18000 1 -06} + {2690420400 -21600 0 -06} + {2703729600 -18000 1 -06} + {2721870000 -21600 0 -06} + {2735179200 -18000 1 -06} + {2753924400 -21600 0 -06} + {2766628800 -18000 1 -06} + {2785374000 -21600 0 -06} + {2798683200 -18000 1 -06} + {2816823600 -21600 0 -06} + {2830132800 -18000 1 -06} + {2848273200 -21600 0 -06} + {2861582400 -18000 1 -06} + {2879722800 -21600 0 -06} + {2893032000 -18000 1 -06} + {2911172400 -21600 0 -06} + {2924481600 -18000 1 -06} + {2943226800 -21600 0 -06} + {2955931200 -18000 1 -06} + {2974676400 -21600 0 -06} + {2987985600 -18000 1 -06} + {3006126000 -21600 0 -06} + {3019435200 -18000 1 -06} + {3037575600 -21600 0 -06} + {3050884800 -18000 1 -06} + {3069025200 -21600 0 -06} + {3082334400 -18000 1 -06} + {3101079600 -21600 0 -06} + {3113784000 -18000 1 -06} + {3132529200 -21600 0 -06} + {3145838400 -18000 1 -06} + {3163978800 -21600 0 -06} + {3177288000 -18000 1 -06} + {3195428400 -21600 0 -06} + {3208737600 -18000 1 -06} + {3226878000 -21600 0 -06} + {3240187200 -18000 1 -06} + {3258327600 -21600 0 -06} + {3271636800 -18000 1 -06} + {3290382000 -21600 0 -06} + {3303086400 -18000 1 -06} + {3321831600 -21600 0 -06} + {3335140800 -18000 1 -06} + {3353281200 -21600 0 -06} + {3366590400 -18000 1 -06} + {3384730800 -21600 0 -06} + {3398040000 -18000 1 -06} + {3416180400 -21600 0 -06} + {3429489600 -18000 1 -06} + {3447630000 -21600 0 -06} + {3460939200 -18000 1 -06} + {3479684400 -21600 0 -06} + {3492993600 -18000 1 -06} + {3511134000 -21600 0 -06} + {3524443200 -18000 1 -06} + {3542583600 -21600 0 -06} + {3555892800 -18000 1 -06} + {3574033200 -21600 0 -06} + {3587342400 -18000 1 -06} + {3605482800 -21600 0 -06} + {3618792000 -18000 1 -06} + {3637537200 -21600 0 -06} + {3650241600 -18000 1 -06} + {3668986800 -21600 0 -06} + {3682296000 -18000 1 -06} + {3700436400 -21600 0 -06} + {3713745600 -18000 1 -06} + {3731886000 -21600 0 -06} + {3745195200 -18000 1 -06} + {3763335600 -21600 0 -06} + {3776644800 -18000 1 -06} + {3794785200 -21600 0 -06} + {3808094400 -18000 1 -06} + {3826839600 -21600 0 -06} + {3839544000 -18000 1 -06} + {3858289200 -21600 0 -06} + {3871598400 -18000 1 -06} + {3889738800 -21600 0 -06} + {3903048000 -18000 1 -06} + {3921188400 -21600 0 -06} + {3934497600 -18000 1 -06} + {3952638000 -21600 0 -06} + {3965947200 -18000 1 -06} + {3984692400 -21600 0 -06} + {3997396800 -18000 1 -06} + {4016142000 -21600 0 -06} + {4029451200 -18000 1 -06} + {4047591600 -21600 0 -06} + {4060900800 -18000 1 -06} + {4079041200 -21600 0 -06} + {4092350400 -18000 1 -06} +} diff --git a/env/tcl/tcl8.6/tzdata/Pacific/Efate b/env/tcl/tcl8.6/tzdata/Pacific/Efate new file mode 100644 index 0000000..a026ee1 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Pacific/Efate @@ -0,0 +1,26 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Pacific/Efate) { + {-9223372036854775808 40396 0 LMT} + {-1829387596 39600 0 +11} + {433256400 43200 1 +11} + {448977600 39600 0 +11} + {467298000 43200 1 +11} + {480427200 39600 0 +11} + {496760400 43200 1 +11} + {511876800 39600 0 +11} + {528210000 43200 1 +11} + {543931200 39600 0 +11} + {559659600 43200 1 +11} + {575380800 39600 0 +11} + {591109200 43200 1 +11} + {606830400 39600 0 +11} + {622558800 43200 1 +11} + {638280000 39600 0 +11} + {654008400 43200 1 +11} + {669729600 39600 0 +11} + {686062800 43200 1 +11} + {696340800 39600 0 +11} + {719931600 43200 1 +11} + {727790400 39600 0 +11} +} diff --git a/env/tcl/tcl8.6/tzdata/Pacific/Enderbury b/env/tcl/tcl8.6/tzdata/Pacific/Enderbury new file mode 100644 index 0000000..48eaafe --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Pacific/Enderbury @@ -0,0 +1,8 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Pacific/Enderbury) { + {-9223372036854775808 -41060 0 LMT} + {-2177411740 -43200 0 -12} + {307627200 -39600 0 -11} + {788871600 46800 0 +13} +} diff --git a/env/tcl/tcl8.6/tzdata/Pacific/Fakaofo b/env/tcl/tcl8.6/tzdata/Pacific/Fakaofo new file mode 100644 index 0000000..d75030d --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Pacific/Fakaofo @@ -0,0 +1,7 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Pacific/Fakaofo) { + {-9223372036854775808 -41096 0 LMT} + {-2177411704 -39600 0 -11} + {1325242800 46800 0 +13} +} diff --git a/env/tcl/tcl8.6/tzdata/Pacific/Fiji b/env/tcl/tcl8.6/tzdata/Pacific/Fiji new file mode 100644 index 0000000..b05985c --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Pacific/Fiji @@ -0,0 +1,191 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Pacific/Fiji) { + {-9223372036854775808 42944 0 LMT} + {-1709985344 43200 0 +12} + {909842400 46800 1 +12} + {920124000 43200 0 +12} + {941896800 46800 1 +12} + {951573600 43200 0 +12} + {1259416800 46800 1 +12} + {1269698400 43200 0 +12} + {1287842400 46800 1 +12} + {1299333600 43200 0 +12} + {1319292000 46800 1 +12} + {1327154400 43200 0 +12} + {1350741600 46800 1 +12} + {1358604000 43200 0 +12} + {1382796000 46800 1 +12} + {1390050000 43200 0 +12} + {1414850400 46800 1 +12} + {1421503200 43200 0 +12} + {1446300000 46800 1 +12} + {1452952800 43200 0 +12} + {1478354400 46800 1 +12} + {1484402400 43200 0 +12} + {1509804000 46800 1 +12} + {1515852000 43200 0 +12} + {1541253600 46800 1 +12} + {1547301600 43200 0 +12} + {1572703200 46800 1 +12} + {1579356000 43200 0 +12} + {1604152800 46800 1 +12} + {1610805600 43200 0 +12} + {1636207200 46800 1 +12} + {1642255200 43200 0 +12} + {1667656800 46800 1 +12} + {1673704800 43200 0 +12} + {1699106400 46800 1 +12} + {1705154400 43200 0 +12} + {1730556000 46800 1 +12} + {1737208800 43200 0 +12} + {1762005600 46800 1 +12} + {1768658400 43200 0 +12} + {1793455200 46800 1 +12} + {1800108000 43200 0 +12} + {1825509600 46800 1 +12} + {1831557600 43200 0 +12} + {1856959200 46800 1 +12} + {1863007200 43200 0 +12} + {1888408800 46800 1 +12} + {1894456800 43200 0 +12} + {1919858400 46800 1 +12} + {1926511200 43200 0 +12} + {1951308000 46800 1 +12} + {1957960800 43200 0 +12} + {1983362400 46800 1 +12} + {1989410400 43200 0 +12} + {2014812000 46800 1 +12} + {2020860000 43200 0 +12} + {2046261600 46800 1 +12} + {2052309600 43200 0 +12} + {2077711200 46800 1 +12} + {2083759200 43200 0 +12} + {2109160800 46800 1 +12} + {2115813600 43200 0 +12} + {2140610400 46800 1 +12} + {2147263200 43200 0 +12} + {2172664800 46800 1 +12} + {2178712800 43200 0 +12} + {2204114400 46800 1 +12} + {2210162400 43200 0 +12} + {2235564000 46800 1 +12} + {2241612000 43200 0 +12} + {2267013600 46800 1 +12} + {2273666400 43200 0 +12} + {2298463200 46800 1 +12} + {2305116000 43200 0 +12} + {2329912800 46800 1 +12} + {2336565600 43200 0 +12} + {2361967200 46800 1 +12} + {2368015200 43200 0 +12} + {2393416800 46800 1 +12} + {2399464800 43200 0 +12} + {2424866400 46800 1 +12} + {2430914400 43200 0 +12} + {2456316000 46800 1 +12} + {2462968800 43200 0 +12} + {2487765600 46800 1 +12} + {2494418400 43200 0 +12} + {2519820000 46800 1 +12} + {2525868000 43200 0 +12} + {2551269600 46800 1 +12} + {2557317600 43200 0 +12} + {2582719200 46800 1 +12} + {2588767200 43200 0 +12} + {2614168800 46800 1 +12} + {2620821600 43200 0 +12} + {2645618400 46800 1 +12} + {2652271200 43200 0 +12} + {2677068000 46800 1 +12} + {2683720800 43200 0 +12} + {2709122400 46800 1 +12} + {2715170400 43200 0 +12} + {2740572000 46800 1 +12} + {2746620000 43200 0 +12} + {2772021600 46800 1 +12} + {2778069600 43200 0 +12} + {2803471200 46800 1 +12} + {2810124000 43200 0 +12} + {2834920800 46800 1 +12} + {2841573600 43200 0 +12} + {2866975200 46800 1 +12} + {2873023200 43200 0 +12} + {2898424800 46800 1 +12} + {2904472800 43200 0 +12} + {2929874400 46800 1 +12} + {2935922400 43200 0 +12} + {2961324000 46800 1 +12} + {2967372000 43200 0 +12} + {2992773600 46800 1 +12} + {2999426400 43200 0 +12} + {3024223200 46800 1 +12} + {3030876000 43200 0 +12} + {3056277600 46800 1 +12} + {3062325600 43200 0 +12} + {3087727200 46800 1 +12} + {3093775200 43200 0 +12} + {3119176800 46800 1 +12} + {3125224800 43200 0 +12} + {3150626400 46800 1 +12} + {3157279200 43200 0 +12} + {3182076000 46800 1 +12} + {3188728800 43200 0 +12} + {3213525600 46800 1 +12} + {3220178400 43200 0 +12} + {3245580000 46800 1 +12} + {3251628000 43200 0 +12} + {3277029600 46800 1 +12} + {3283077600 43200 0 +12} + {3308479200 46800 1 +12} + {3314527200 43200 0 +12} + {3339928800 46800 1 +12} + {3346581600 43200 0 +12} + {3371378400 46800 1 +12} + {3378031200 43200 0 +12} + {3403432800 46800 1 +12} + {3409480800 43200 0 +12} + {3434882400 46800 1 +12} + {3440930400 43200 0 +12} + {3466332000 46800 1 +12} + {3472380000 43200 0 +12} + {3497781600 46800 1 +12} + {3504434400 43200 0 +12} + {3529231200 46800 1 +12} + {3535884000 43200 0 +12} + {3560680800 46800 1 +12} + {3567333600 43200 0 +12} + {3592735200 46800 1 +12} + {3598783200 43200 0 +12} + {3624184800 46800 1 +12} + {3630232800 43200 0 +12} + {3655634400 46800 1 +12} + {3661682400 43200 0 +12} + {3687084000 46800 1 +12} + {3693736800 43200 0 +12} + {3718533600 46800 1 +12} + {3725186400 43200 0 +12} + {3750588000 46800 1 +12} + {3756636000 43200 0 +12} + {3782037600 46800 1 +12} + {3788085600 43200 0 +12} + {3813487200 46800 1 +12} + {3819535200 43200 0 +12} + {3844936800 46800 1 +12} + {3850984800 43200 0 +12} + {3876386400 46800 1 +12} + {3883039200 43200 0 +12} + {3907836000 46800 1 +12} + {3914488800 43200 0 +12} + {3939890400 46800 1 +12} + {3945938400 43200 0 +12} + {3971340000 46800 1 +12} + {3977388000 43200 0 +12} + {4002789600 46800 1 +12} + {4008837600 43200 0 +12} + {4034239200 46800 1 +12} + {4040892000 43200 0 +12} + {4065688800 46800 1 +12} + {4072341600 43200 0 +12} + {4097138400 46800 1 +12} +} diff --git a/env/tcl/tcl8.6/tzdata/Pacific/Funafuti b/env/tcl/tcl8.6/tzdata/Pacific/Funafuti new file mode 100644 index 0000000..d806525 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Pacific/Funafuti @@ -0,0 +1,6 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Pacific/Funafuti) { + {-9223372036854775808 43012 0 LMT} + {-2177495812 43200 0 +12} +} diff --git a/env/tcl/tcl8.6/tzdata/Pacific/Galapagos b/env/tcl/tcl8.6/tzdata/Pacific/Galapagos new file mode 100644 index 0000000..180ce6a --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Pacific/Galapagos @@ -0,0 +1,9 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Pacific/Galapagos) { + {-9223372036854775808 -21504 0 LMT} + {-1230746496 -18000 0 -05} + {504939600 -21600 0 -06} + {722930400 -18000 1 -06} + {728888400 -21600 0 -06} +} diff --git a/env/tcl/tcl8.6/tzdata/Pacific/Gambier b/env/tcl/tcl8.6/tzdata/Pacific/Gambier new file mode 100644 index 0000000..9ebd97c --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Pacific/Gambier @@ -0,0 +1,6 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Pacific/Gambier) { + {-9223372036854775808 -32388 0 LMT} + {-1806678012 -32400 0 -09} +} diff --git a/env/tcl/tcl8.6/tzdata/Pacific/Guadalcanal b/env/tcl/tcl8.6/tzdata/Pacific/Guadalcanal new file mode 100644 index 0000000..7e13e6e --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Pacific/Guadalcanal @@ -0,0 +1,6 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Pacific/Guadalcanal) { + {-9223372036854775808 38388 0 LMT} + {-1806748788 39600 0 +11} +} diff --git a/env/tcl/tcl8.6/tzdata/Pacific/Guam b/env/tcl/tcl8.6/tzdata/Pacific/Guam new file mode 100644 index 0000000..79cca80 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Pacific/Guam @@ -0,0 +1,8 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Pacific/Guam) { + {-9223372036854775808 -51660 0 LMT} + {-3944626740 34740 0 LMT} + {-2177487540 36000 0 GST} + {977493600 36000 0 ChST} +} diff --git a/env/tcl/tcl8.6/tzdata/Pacific/Honolulu b/env/tcl/tcl8.6/tzdata/Pacific/Honolulu new file mode 100644 index 0000000..7d03b45 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Pacific/Honolulu @@ -0,0 +1,12 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Pacific/Honolulu) { + {-9223372036854775808 -37886 0 LMT} + {-2334101314 -37800 0 HST} + {-1157283000 -34200 1 HDT} + {-1155436200 -34200 0 HST} + {-880201800 -34200 1 HWT} + {-769395600 -34200 1 HPT} + {-765376200 -37800 0 HST} + {-712150200 -36000 0 HST} +} diff --git a/env/tcl/tcl8.6/tzdata/Pacific/Johnston b/env/tcl/tcl8.6/tzdata/Pacific/Johnston new file mode 100644 index 0000000..21ab39a --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Pacific/Johnston @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(Pacific/Honolulu)]} { + LoadTimeZoneFile Pacific/Honolulu +} +set TZData(:Pacific/Johnston) $TZData(:Pacific/Honolulu) diff --git a/env/tcl/tcl8.6/tzdata/Pacific/Kiritimati b/env/tcl/tcl8.6/tzdata/Pacific/Kiritimati new file mode 100644 index 0000000..7d600f3 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Pacific/Kiritimati @@ -0,0 +1,8 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Pacific/Kiritimati) { + {-9223372036854775808 -37760 0 LMT} + {-2177415040 -38400 0 -1040} + {307622400 -36000 0 -10} + {788868000 50400 0 +14} +} diff --git a/env/tcl/tcl8.6/tzdata/Pacific/Kosrae b/env/tcl/tcl8.6/tzdata/Pacific/Kosrae new file mode 100644 index 0000000..04bed35 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Pacific/Kosrae @@ -0,0 +1,8 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Pacific/Kosrae) { + {-9223372036854775808 39116 0 LMT} + {-2177491916 39600 0 +11} + {-7988400 43200 0 +12} + {915105600 39600 0 +11} +} diff --git a/env/tcl/tcl8.6/tzdata/Pacific/Kwajalein b/env/tcl/tcl8.6/tzdata/Pacific/Kwajalein new file mode 100644 index 0000000..19e1067 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Pacific/Kwajalein @@ -0,0 +1,8 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Pacific/Kwajalein) { + {-9223372036854775808 40160 0 LMT} + {-2177492960 39600 0 +11} + {-7988400 -43200 0 -12} + {745848000 43200 0 +12} +} diff --git a/env/tcl/tcl8.6/tzdata/Pacific/Majuro b/env/tcl/tcl8.6/tzdata/Pacific/Majuro new file mode 100644 index 0000000..5e9ac99 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Pacific/Majuro @@ -0,0 +1,7 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Pacific/Majuro) { + {-9223372036854775808 41088 0 LMT} + {-2177493888 39600 0 +11} + {-7988400 43200 0 +12} +} diff --git a/env/tcl/tcl8.6/tzdata/Pacific/Marquesas b/env/tcl/tcl8.6/tzdata/Pacific/Marquesas new file mode 100644 index 0000000..ac77a2f --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Pacific/Marquesas @@ -0,0 +1,6 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Pacific/Marquesas) { + {-9223372036854775808 -33480 0 LMT} + {-1806676920 -34200 0 -0930} +} diff --git a/env/tcl/tcl8.6/tzdata/Pacific/Midway b/env/tcl/tcl8.6/tzdata/Pacific/Midway new file mode 100644 index 0000000..d044569 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Pacific/Midway @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(Pacific/Pago_Pago)]} { + LoadTimeZoneFile Pacific/Pago_Pago +} +set TZData(:Pacific/Midway) $TZData(:Pacific/Pago_Pago) diff --git a/env/tcl/tcl8.6/tzdata/Pacific/Nauru b/env/tcl/tcl8.6/tzdata/Pacific/Nauru new file mode 100644 index 0000000..de10811 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Pacific/Nauru @@ -0,0 +1,9 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Pacific/Nauru) { + {-9223372036854775808 40060 0 LMT} + {-1545131260 41400 0 +1130} + {-877347000 32400 0 +09} + {-800960400 41400 0 +1130} + {294323400 43200 0 +12} +} diff --git a/env/tcl/tcl8.6/tzdata/Pacific/Niue b/env/tcl/tcl8.6/tzdata/Pacific/Niue new file mode 100644 index 0000000..fe19c59 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Pacific/Niue @@ -0,0 +1,8 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Pacific/Niue) { + {-9223372036854775808 -40780 0 LMT} + {-2177412020 -40800 0 -1120} + {-599575200 -41400 0 -1130} + {276089400 -39600 0 -11} +} diff --git a/env/tcl/tcl8.6/tzdata/Pacific/Norfolk b/env/tcl/tcl8.6/tzdata/Pacific/Norfolk new file mode 100644 index 0000000..f0556ab --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Pacific/Norfolk @@ -0,0 +1,10 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Pacific/Norfolk) { + {-9223372036854775808 40312 0 LMT} + {-2177493112 40320 0 +1112} + {-599656320 41400 0 +1130} + {152029800 45000 1 +1230} + {162912600 41400 0 +1130} + {1443882600 39600 0 +11} +} diff --git a/env/tcl/tcl8.6/tzdata/Pacific/Noumea b/env/tcl/tcl8.6/tzdata/Pacific/Noumea new file mode 100644 index 0000000..c9da825 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Pacific/Noumea @@ -0,0 +1,12 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Pacific/Noumea) { + {-9223372036854775808 39948 0 LMT} + {-1829387148 39600 0 +11} + {250002000 43200 1 +11} + {257342400 39600 0 +11} + {281451600 43200 1 +11} + {288878400 39600 0 +11} + {849366000 43200 1 +11} + {857228400 39600 0 +11} +} diff --git a/env/tcl/tcl8.6/tzdata/Pacific/Pago_Pago b/env/tcl/tcl8.6/tzdata/Pacific/Pago_Pago new file mode 100644 index 0000000..9b5607f --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Pacific/Pago_Pago @@ -0,0 +1,7 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Pacific/Pago_Pago) { + {-9223372036854775808 45432 0 LMT} + {-2445424632 -40968 0 LMT} + {-1861879032 -39600 0 SST} +} diff --git a/env/tcl/tcl8.6/tzdata/Pacific/Palau b/env/tcl/tcl8.6/tzdata/Pacific/Palau new file mode 100644 index 0000000..a50fd2a --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Pacific/Palau @@ -0,0 +1,6 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Pacific/Palau) { + {-9223372036854775808 32276 0 LMT} + {-2177485076 32400 0 +09} +} diff --git a/env/tcl/tcl8.6/tzdata/Pacific/Pitcairn b/env/tcl/tcl8.6/tzdata/Pacific/Pitcairn new file mode 100644 index 0000000..6813978 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Pacific/Pitcairn @@ -0,0 +1,7 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Pacific/Pitcairn) { + {-9223372036854775808 -31220 0 LMT} + {-2177421580 -30600 0 -0830} + {893665800 -28800 0 -08} +} diff --git a/env/tcl/tcl8.6/tzdata/Pacific/Pohnpei b/env/tcl/tcl8.6/tzdata/Pacific/Pohnpei new file mode 100644 index 0000000..3fcb5d0 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Pacific/Pohnpei @@ -0,0 +1,6 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Pacific/Pohnpei) { + {-9223372036854775808 37972 0 LMT} + {-2177490772 39600 0 +11} +} diff --git a/env/tcl/tcl8.6/tzdata/Pacific/Ponape b/env/tcl/tcl8.6/tzdata/Pacific/Ponape new file mode 100644 index 0000000..89644f7 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Pacific/Ponape @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(Pacific/Pohnpei)]} { + LoadTimeZoneFile Pacific/Pohnpei +} +set TZData(:Pacific/Ponape) $TZData(:Pacific/Pohnpei) diff --git a/env/tcl/tcl8.6/tzdata/Pacific/Port_Moresby b/env/tcl/tcl8.6/tzdata/Pacific/Port_Moresby new file mode 100644 index 0000000..c3a5e4f --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Pacific/Port_Moresby @@ -0,0 +1,7 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Pacific/Port_Moresby) { + {-9223372036854775808 35320 0 LMT} + {-2840176120 35312 0 PMMT} + {-2366790512 36000 0 +10} +} diff --git a/env/tcl/tcl8.6/tzdata/Pacific/Rarotonga b/env/tcl/tcl8.6/tzdata/Pacific/Rarotonga new file mode 100644 index 0000000..2913d68 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Pacific/Rarotonga @@ -0,0 +1,32 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Pacific/Rarotonga) { + {-9223372036854775808 -38344 0 LMT} + {-2177414456 -37800 0 -1030} + {279714600 -34200 0 -10} + {289387800 -36000 0 -10} + {309952800 -34200 1 -10} + {320837400 -36000 0 -10} + {341402400 -34200 1 -10} + {352287000 -36000 0 -10} + {372852000 -34200 1 -10} + {384341400 -36000 0 -10} + {404906400 -34200 1 -10} + {415791000 -36000 0 -10} + {436356000 -34200 1 -10} + {447240600 -36000 0 -10} + {467805600 -34200 1 -10} + {478690200 -36000 0 -10} + {499255200 -34200 1 -10} + {510139800 -36000 0 -10} + {530704800 -34200 1 -10} + {541589400 -36000 0 -10} + {562154400 -34200 1 -10} + {573643800 -36000 0 -10} + {594208800 -34200 1 -10} + {605093400 -36000 0 -10} + {625658400 -34200 1 -10} + {636543000 -36000 0 -10} + {657108000 -34200 1 -10} + {667992600 -36000 0 -10} +} diff --git a/env/tcl/tcl8.6/tzdata/Pacific/Saipan b/env/tcl/tcl8.6/tzdata/Pacific/Saipan new file mode 100644 index 0000000..4e769cd --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Pacific/Saipan @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(Pacific/Guam)]} { + LoadTimeZoneFile Pacific/Guam +} +set TZData(:Pacific/Saipan) $TZData(:Pacific/Guam) diff --git a/env/tcl/tcl8.6/tzdata/Pacific/Samoa b/env/tcl/tcl8.6/tzdata/Pacific/Samoa new file mode 100644 index 0000000..686eb34 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Pacific/Samoa @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(Pacific/Pago_Pago)]} { + LoadTimeZoneFile Pacific/Pago_Pago +} +set TZData(:Pacific/Samoa) $TZData(:Pacific/Pago_Pago) diff --git a/env/tcl/tcl8.6/tzdata/Pacific/Tahiti b/env/tcl/tcl8.6/tzdata/Pacific/Tahiti new file mode 100644 index 0000000..768553c --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Pacific/Tahiti @@ -0,0 +1,6 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Pacific/Tahiti) { + {-9223372036854775808 -35896 0 LMT} + {-1806674504 -36000 0 -10} +} diff --git a/env/tcl/tcl8.6/tzdata/Pacific/Tarawa b/env/tcl/tcl8.6/tzdata/Pacific/Tarawa new file mode 100644 index 0000000..2b9b556 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Pacific/Tarawa @@ -0,0 +1,6 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Pacific/Tarawa) { + {-9223372036854775808 41524 0 LMT} + {-2177494324 43200 0 +12} +} diff --git a/env/tcl/tcl8.6/tzdata/Pacific/Tongatapu b/env/tcl/tcl8.6/tzdata/Pacific/Tongatapu new file mode 100644 index 0000000..104888a --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Pacific/Tongatapu @@ -0,0 +1,16 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Pacific/Tongatapu) { + {-9223372036854775808 44360 0 LMT} + {-2177497160 44400 0 +1220} + {-915193200 46800 0 +13} + {915102000 46800 0 +13} + {939214800 50400 1 +13} + {953384400 46800 0 +13} + {973342800 50400 1 +13} + {980596800 46800 0 +13} + {1004792400 50400 1 +13} + {1012046400 46800 0 +13} + {1478350800 50400 1 +13} + {1484398800 46800 0 +13} +} diff --git a/env/tcl/tcl8.6/tzdata/Pacific/Truk b/env/tcl/tcl8.6/tzdata/Pacific/Truk new file mode 100644 index 0000000..c9b1894 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Pacific/Truk @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(Pacific/Chuuk)]} { + LoadTimeZoneFile Pacific/Chuuk +} +set TZData(:Pacific/Truk) $TZData(:Pacific/Chuuk) diff --git a/env/tcl/tcl8.6/tzdata/Pacific/Wake b/env/tcl/tcl8.6/tzdata/Pacific/Wake new file mode 100644 index 0000000..67eab37 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Pacific/Wake @@ -0,0 +1,6 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Pacific/Wake) { + {-9223372036854775808 39988 0 LMT} + {-2177492788 43200 0 +12} +} diff --git a/env/tcl/tcl8.6/tzdata/Pacific/Wallis b/env/tcl/tcl8.6/tzdata/Pacific/Wallis new file mode 100644 index 0000000..152e6af --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Pacific/Wallis @@ -0,0 +1,6 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:Pacific/Wallis) { + {-9223372036854775808 44120 0 LMT} + {-2177496920 43200 0 +12} +} diff --git a/env/tcl/tcl8.6/tzdata/Pacific/Yap b/env/tcl/tcl8.6/tzdata/Pacific/Yap new file mode 100644 index 0000000..4931030 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Pacific/Yap @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(Pacific/Chuuk)]} { + LoadTimeZoneFile Pacific/Chuuk +} +set TZData(:Pacific/Yap) $TZData(:Pacific/Chuuk) diff --git a/env/tcl/tcl8.6/tzdata/Poland b/env/tcl/tcl8.6/tzdata/Poland new file mode 100644 index 0000000..bd24028 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Poland @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(Europe/Warsaw)]} { + LoadTimeZoneFile Europe/Warsaw +} +set TZData(:Poland) $TZData(:Europe/Warsaw) diff --git a/env/tcl/tcl8.6/tzdata/Portugal b/env/tcl/tcl8.6/tzdata/Portugal new file mode 100644 index 0000000..d1ffd9f --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Portugal @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(Europe/Lisbon)]} { + LoadTimeZoneFile Europe/Lisbon +} +set TZData(:Portugal) $TZData(:Europe/Lisbon) diff --git a/env/tcl/tcl8.6/tzdata/ROC b/env/tcl/tcl8.6/tzdata/ROC new file mode 100644 index 0000000..5dd196d --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/ROC @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(Asia/Taipei)]} { + LoadTimeZoneFile Asia/Taipei +} +set TZData(:ROC) $TZData(:Asia/Taipei) diff --git a/env/tcl/tcl8.6/tzdata/ROK b/env/tcl/tcl8.6/tzdata/ROK new file mode 100644 index 0000000..1162ce4 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/ROK @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(Asia/Seoul)]} { + LoadTimeZoneFile Asia/Seoul +} +set TZData(:ROK) $TZData(:Asia/Seoul) diff --git a/env/tcl/tcl8.6/tzdata/Singapore b/env/tcl/tcl8.6/tzdata/Singapore new file mode 100644 index 0000000..1584b35 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Singapore @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(Asia/Singapore)]} { + LoadTimeZoneFile Asia/Singapore +} +set TZData(:Singapore) $TZData(:Asia/Singapore) diff --git a/env/tcl/tcl8.6/tzdata/SystemV/AST4 b/env/tcl/tcl8.6/tzdata/SystemV/AST4 new file mode 100644 index 0000000..eced0d2 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/SystemV/AST4 @@ -0,0 +1,5 @@ +# created by ../tools/tclZIC.tcl - do not edit +if {![info exists TZData(America/Puerto_Rico)]} { + LoadTimeZoneFile America/Puerto_Rico +} +set TZData(:SystemV/AST4) $TZData(:America/Puerto_Rico) diff --git a/env/tcl/tcl8.6/tzdata/SystemV/AST4ADT b/env/tcl/tcl8.6/tzdata/SystemV/AST4ADT new file mode 100644 index 0000000..c24308f --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/SystemV/AST4ADT @@ -0,0 +1,5 @@ +# created by ../tools/tclZIC.tcl - do not edit +if {![info exists TZData(America/Halifax)]} { + LoadTimeZoneFile America/Halifax +} +set TZData(:SystemV/AST4ADT) $TZData(:America/Halifax) diff --git a/env/tcl/tcl8.6/tzdata/SystemV/CST6 b/env/tcl/tcl8.6/tzdata/SystemV/CST6 new file mode 100644 index 0000000..d46c015 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/SystemV/CST6 @@ -0,0 +1,5 @@ +# created by ../tools/tclZIC.tcl - do not edit +if {![info exists TZData(America/Regina)]} { + LoadTimeZoneFile America/Regina +} +set TZData(:SystemV/CST6) $TZData(:America/Regina) diff --git a/env/tcl/tcl8.6/tzdata/SystemV/CST6CDT b/env/tcl/tcl8.6/tzdata/SystemV/CST6CDT new file mode 100644 index 0000000..234af89 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/SystemV/CST6CDT @@ -0,0 +1,5 @@ +# created by ../tools/tclZIC.tcl - do not edit +if {![info exists TZData(America/Chicago)]} { + LoadTimeZoneFile America/Chicago +} +set TZData(:SystemV/CST6CDT) $TZData(:America/Chicago) diff --git a/env/tcl/tcl8.6/tzdata/SystemV/EST5 b/env/tcl/tcl8.6/tzdata/SystemV/EST5 new file mode 100644 index 0000000..52818c1 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/SystemV/EST5 @@ -0,0 +1,5 @@ +# created by ../tools/tclZIC.tcl - do not edit +if {![info exists TZData(America/Indianapolis)]} { + LoadTimeZoneFile America/Indianapolis +} +set TZData(:SystemV/EST5) $TZData(:America/Indianapolis) diff --git a/env/tcl/tcl8.6/tzdata/SystemV/EST5EDT b/env/tcl/tcl8.6/tzdata/SystemV/EST5EDT new file mode 100644 index 0000000..6cf2743 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/SystemV/EST5EDT @@ -0,0 +1,5 @@ +# created by ../tools/tclZIC.tcl - do not edit +if {![info exists TZData(America/New_York)]} { + LoadTimeZoneFile America/New_York +} +set TZData(:SystemV/EST5EDT) $TZData(:America/New_York) diff --git a/env/tcl/tcl8.6/tzdata/SystemV/HST10 b/env/tcl/tcl8.6/tzdata/SystemV/HST10 new file mode 100644 index 0000000..a4316af --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/SystemV/HST10 @@ -0,0 +1,5 @@ +# created by ../tools/tclZIC.tcl - do not edit +if {![info exists TZData(Pacific/Honolulu)]} { + LoadTimeZoneFile Pacific/Honolulu +} +set TZData(:SystemV/HST10) $TZData(:Pacific/Honolulu) diff --git a/env/tcl/tcl8.6/tzdata/SystemV/MST7 b/env/tcl/tcl8.6/tzdata/SystemV/MST7 new file mode 100644 index 0000000..e67a781 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/SystemV/MST7 @@ -0,0 +1,5 @@ +# created by ../tools/tclZIC.tcl - do not edit +if {![info exists TZData(America/Phoenix)]} { + LoadTimeZoneFile America/Phoenix +} +set TZData(:SystemV/MST7) $TZData(:America/Phoenix) diff --git a/env/tcl/tcl8.6/tzdata/SystemV/MST7MDT b/env/tcl/tcl8.6/tzdata/SystemV/MST7MDT new file mode 100644 index 0000000..fda5bf1 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/SystemV/MST7MDT @@ -0,0 +1,5 @@ +# created by ../tools/tclZIC.tcl - do not edit +if {![info exists TZData(America/Denver)]} { + LoadTimeZoneFile America/Denver +} +set TZData(:SystemV/MST7MDT) $TZData(:America/Denver) diff --git a/env/tcl/tcl8.6/tzdata/SystemV/PST8 b/env/tcl/tcl8.6/tzdata/SystemV/PST8 new file mode 100644 index 0000000..8e30bb8 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/SystemV/PST8 @@ -0,0 +1,5 @@ +# created by ../tools/tclZIC.tcl - do not edit +if {![info exists TZData(Pacific/Pitcairn)]} { + LoadTimeZoneFile Pacific/Pitcairn +} +set TZData(:SystemV/PST8) $TZData(:Pacific/Pitcairn) diff --git a/env/tcl/tcl8.6/tzdata/SystemV/PST8PDT b/env/tcl/tcl8.6/tzdata/SystemV/PST8PDT new file mode 100644 index 0000000..8281a9a --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/SystemV/PST8PDT @@ -0,0 +1,5 @@ +# created by ../tools/tclZIC.tcl - do not edit +if {![info exists TZData(America/Los_Angeles)]} { + LoadTimeZoneFile America/Los_Angeles +} +set TZData(:SystemV/PST8PDT) $TZData(:America/Los_Angeles) diff --git a/env/tcl/tcl8.6/tzdata/SystemV/YST9 b/env/tcl/tcl8.6/tzdata/SystemV/YST9 new file mode 100644 index 0000000..32d3717 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/SystemV/YST9 @@ -0,0 +1,5 @@ +# created by ../tools/tclZIC.tcl - do not edit +if {![info exists TZData(Pacific/Gambier)]} { + LoadTimeZoneFile Pacific/Gambier +} +set TZData(:SystemV/YST9) $TZData(:Pacific/Gambier) diff --git a/env/tcl/tcl8.6/tzdata/SystemV/YST9YDT b/env/tcl/tcl8.6/tzdata/SystemV/YST9YDT new file mode 100644 index 0000000..fba405f --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/SystemV/YST9YDT @@ -0,0 +1,5 @@ +# created by ../tools/tclZIC.tcl - do not edit +if {![info exists TZData(America/Anchorage)]} { + LoadTimeZoneFile America/Anchorage +} +set TZData(:SystemV/YST9YDT) $TZData(:America/Anchorage) diff --git a/env/tcl/tcl8.6/tzdata/Turkey b/env/tcl/tcl8.6/tzdata/Turkey new file mode 100644 index 0000000..e20a7a5 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Turkey @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(Europe/Istanbul)]} { + LoadTimeZoneFile Europe/Istanbul +} +set TZData(:Turkey) $TZData(:Europe/Istanbul) diff --git a/env/tcl/tcl8.6/tzdata/UCT b/env/tcl/tcl8.6/tzdata/UCT new file mode 100644 index 0000000..8449328 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/UCT @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(Etc/UCT)]} { + LoadTimeZoneFile Etc/UCT +} +set TZData(:UCT) $TZData(:Etc/UCT) diff --git a/env/tcl/tcl8.6/tzdata/US/Alaska b/env/tcl/tcl8.6/tzdata/US/Alaska new file mode 100644 index 0000000..69a3899 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/US/Alaska @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(America/Anchorage)]} { + LoadTimeZoneFile America/Anchorage +} +set TZData(:US/Alaska) $TZData(:America/Anchorage) diff --git a/env/tcl/tcl8.6/tzdata/US/Aleutian b/env/tcl/tcl8.6/tzdata/US/Aleutian new file mode 100644 index 0000000..024e70b --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/US/Aleutian @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(America/Adak)]} { + LoadTimeZoneFile America/Adak +} +set TZData(:US/Aleutian) $TZData(:America/Adak) diff --git a/env/tcl/tcl8.6/tzdata/US/Arizona b/env/tcl/tcl8.6/tzdata/US/Arizona new file mode 100644 index 0000000..8eaa961 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/US/Arizona @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(America/Phoenix)]} { + LoadTimeZoneFile America/Phoenix +} +set TZData(:US/Arizona) $TZData(:America/Phoenix) diff --git a/env/tcl/tcl8.6/tzdata/US/Central b/env/tcl/tcl8.6/tzdata/US/Central new file mode 100644 index 0000000..2aab66e --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/US/Central @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(America/Chicago)]} { + LoadTimeZoneFile America/Chicago +} +set TZData(:US/Central) $TZData(:America/Chicago) diff --git a/env/tcl/tcl8.6/tzdata/US/East-Indiana b/env/tcl/tcl8.6/tzdata/US/East-Indiana new file mode 100644 index 0000000..2035a06 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/US/East-Indiana @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(America/Indiana/Indianapolis)]} { + LoadTimeZoneFile America/Indiana/Indianapolis +} +set TZData(:US/East-Indiana) $TZData(:America/Indiana/Indianapolis) diff --git a/env/tcl/tcl8.6/tzdata/US/Eastern b/env/tcl/tcl8.6/tzdata/US/Eastern new file mode 100644 index 0000000..3cf2651 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/US/Eastern @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(America/New_York)]} { + LoadTimeZoneFile America/New_York +} +set TZData(:US/Eastern) $TZData(:America/New_York) diff --git a/env/tcl/tcl8.6/tzdata/US/Hawaii b/env/tcl/tcl8.6/tzdata/US/Hawaii new file mode 100644 index 0000000..6d1af65 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/US/Hawaii @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(Pacific/Honolulu)]} { + LoadTimeZoneFile Pacific/Honolulu +} +set TZData(:US/Hawaii) $TZData(:Pacific/Honolulu) diff --git a/env/tcl/tcl8.6/tzdata/US/Indiana-Starke b/env/tcl/tcl8.6/tzdata/US/Indiana-Starke new file mode 100644 index 0000000..6ffe0e2 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/US/Indiana-Starke @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(America/Indiana/Knox)]} { + LoadTimeZoneFile America/Indiana/Knox +} +set TZData(:US/Indiana-Starke) $TZData(:America/Indiana/Knox) diff --git a/env/tcl/tcl8.6/tzdata/US/Michigan b/env/tcl/tcl8.6/tzdata/US/Michigan new file mode 100644 index 0000000..b15035c --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/US/Michigan @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(America/Detroit)]} { + LoadTimeZoneFile America/Detroit +} +set TZData(:US/Michigan) $TZData(:America/Detroit) diff --git a/env/tcl/tcl8.6/tzdata/US/Mountain b/env/tcl/tcl8.6/tzdata/US/Mountain new file mode 100644 index 0000000..b54235f --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/US/Mountain @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(America/Denver)]} { + LoadTimeZoneFile America/Denver +} +set TZData(:US/Mountain) $TZData(:America/Denver) diff --git a/env/tcl/tcl8.6/tzdata/US/Pacific b/env/tcl/tcl8.6/tzdata/US/Pacific new file mode 100644 index 0000000..7232215 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/US/Pacific @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(America/Los_Angeles)]} { + LoadTimeZoneFile America/Los_Angeles +} +set TZData(:US/Pacific) $TZData(:America/Los_Angeles) diff --git a/env/tcl/tcl8.6/tzdata/US/Pacific-New b/env/tcl/tcl8.6/tzdata/US/Pacific-New new file mode 100644 index 0000000..2eb30f8 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/US/Pacific-New @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(America/Los_Angeles)]} { + LoadTimeZoneFile America/Los_Angeles +} +set TZData(:US/Pacific-New) $TZData(:America/Los_Angeles) diff --git a/env/tcl/tcl8.6/tzdata/US/Samoa b/env/tcl/tcl8.6/tzdata/US/Samoa new file mode 100644 index 0000000..ad86b4f --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/US/Samoa @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(Pacific/Pago_Pago)]} { + LoadTimeZoneFile Pacific/Pago_Pago +} +set TZData(:US/Samoa) $TZData(:Pacific/Pago_Pago) diff --git a/env/tcl/tcl8.6/tzdata/UTC b/env/tcl/tcl8.6/tzdata/UTC new file mode 100644 index 0000000..6d04d96 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/UTC @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(Etc/UTC)]} { + LoadTimeZoneFile Etc/UTC +} +set TZData(:UTC) $TZData(:Etc/UTC) diff --git a/env/tcl/tcl8.6/tzdata/Universal b/env/tcl/tcl8.6/tzdata/Universal new file mode 100644 index 0000000..4a9ed5e --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Universal @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(Etc/UTC)]} { + LoadTimeZoneFile Etc/UTC +} +set TZData(:Universal) $TZData(:Etc/UTC) diff --git a/env/tcl/tcl8.6/tzdata/W-SU b/env/tcl/tcl8.6/tzdata/W-SU new file mode 100644 index 0000000..7e1f613 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/W-SU @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(Europe/Moscow)]} { + LoadTimeZoneFile Europe/Moscow +} +set TZData(:W-SU) $TZData(:Europe/Moscow) diff --git a/env/tcl/tcl8.6/tzdata/WET b/env/tcl/tcl8.6/tzdata/WET new file mode 100644 index 0000000..60366a3 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/WET @@ -0,0 +1,251 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:WET) { + {-9223372036854775808 0 0 WET} + {228877200 3600 1 WEST} + {243997200 0 0 WET} + {260326800 3600 1 WEST} + {276051600 0 0 WET} + {291776400 3600 1 WEST} + {307501200 0 0 WET} + {323830800 3600 1 WEST} + {338950800 0 0 WET} + {354675600 3600 1 WEST} + {370400400 0 0 WET} + {386125200 3600 1 WEST} + {401850000 0 0 WET} + {417574800 3600 1 WEST} + {433299600 0 0 WET} + {449024400 3600 1 WEST} + {465354000 0 0 WET} + {481078800 3600 1 WEST} + {496803600 0 0 WET} + {512528400 3600 1 WEST} + {528253200 0 0 WET} + {543978000 3600 1 WEST} + {559702800 0 0 WET} + {575427600 3600 1 WEST} + {591152400 0 0 WET} + {606877200 3600 1 WEST} + {622602000 0 0 WET} + {638326800 3600 1 WEST} + {654656400 0 0 WET} + {670381200 3600 1 WEST} + {686106000 0 0 WET} + {701830800 3600 1 WEST} + {717555600 0 0 WET} + {733280400 3600 1 WEST} + {749005200 0 0 WET} + {764730000 3600 1 WEST} + {780454800 0 0 WET} + {796179600 3600 1 WEST} + {811904400 0 0 WET} + {828234000 3600 1 WEST} + {846378000 0 0 WET} + {859683600 3600 1 WEST} + {877827600 0 0 WET} + {891133200 3600 1 WEST} + {909277200 0 0 WET} + {922582800 3600 1 WEST} + {941331600 0 0 WET} + {954032400 3600 1 WEST} + {972781200 0 0 WET} + {985482000 3600 1 WEST} + {1004230800 0 0 WET} + {1017536400 3600 1 WEST} + {1035680400 0 0 WET} + {1048986000 3600 1 WEST} + {1067130000 0 0 WET} + {1080435600 3600 1 WEST} + {1099184400 0 0 WET} + {1111885200 3600 1 WEST} + {1130634000 0 0 WET} + {1143334800 3600 1 WEST} + {1162083600 0 0 WET} + {1174784400 3600 1 WEST} + {1193533200 0 0 WET} + {1206838800 3600 1 WEST} + {1224982800 0 0 WET} + {1238288400 3600 1 WEST} + {1256432400 0 0 WET} + {1269738000 3600 1 WEST} + {1288486800 0 0 WET} + {1301187600 3600 1 WEST} + {1319936400 0 0 WET} + {1332637200 3600 1 WEST} + {1351386000 0 0 WET} + {1364691600 3600 1 WEST} + {1382835600 0 0 WET} + {1396141200 3600 1 WEST} + {1414285200 0 0 WET} + {1427590800 3600 1 WEST} + {1445734800 0 0 WET} + {1459040400 3600 1 WEST} + {1477789200 0 0 WET} + {1490490000 3600 1 WEST} + {1509238800 0 0 WET} + {1521939600 3600 1 WEST} + {1540688400 0 0 WET} + {1553994000 3600 1 WEST} + {1572138000 0 0 WET} + {1585443600 3600 1 WEST} + {1603587600 0 0 WET} + {1616893200 3600 1 WEST} + {1635642000 0 0 WET} + {1648342800 3600 1 WEST} + {1667091600 0 0 WET} + {1679792400 3600 1 WEST} + {1698541200 0 0 WET} + {1711846800 3600 1 WEST} + {1729990800 0 0 WET} + {1743296400 3600 1 WEST} + {1761440400 0 0 WET} + {1774746000 3600 1 WEST} + {1792890000 0 0 WET} + {1806195600 3600 1 WEST} + {1824944400 0 0 WET} + {1837645200 3600 1 WEST} + {1856394000 0 0 WET} + {1869094800 3600 1 WEST} + {1887843600 0 0 WET} + {1901149200 3600 1 WEST} + {1919293200 0 0 WET} + {1932598800 3600 1 WEST} + {1950742800 0 0 WET} + {1964048400 3600 1 WEST} + {1982797200 0 0 WET} + {1995498000 3600 1 WEST} + {2014246800 0 0 WET} + {2026947600 3600 1 WEST} + {2045696400 0 0 WET} + {2058397200 3600 1 WEST} + {2077146000 0 0 WET} + {2090451600 3600 1 WEST} + {2108595600 0 0 WET} + {2121901200 3600 1 WEST} + {2140045200 0 0 WET} + {2153350800 3600 1 WEST} + {2172099600 0 0 WET} + {2184800400 3600 1 WEST} + {2203549200 0 0 WET} + {2216250000 3600 1 WEST} + {2234998800 0 0 WET} + {2248304400 3600 1 WEST} + {2266448400 0 0 WET} + {2279754000 3600 1 WEST} + {2297898000 0 0 WET} + {2311203600 3600 1 WEST} + {2329347600 0 0 WET} + {2342653200 3600 1 WEST} + {2361402000 0 0 WET} + {2374102800 3600 1 WEST} + {2392851600 0 0 WET} + {2405552400 3600 1 WEST} + {2424301200 0 0 WET} + {2437606800 3600 1 WEST} + {2455750800 0 0 WET} + {2469056400 3600 1 WEST} + {2487200400 0 0 WET} + {2500506000 3600 1 WEST} + {2519254800 0 0 WET} + {2531955600 3600 1 WEST} + {2550704400 0 0 WET} + {2563405200 3600 1 WEST} + {2582154000 0 0 WET} + {2595459600 3600 1 WEST} + {2613603600 0 0 WET} + {2626909200 3600 1 WEST} + {2645053200 0 0 WET} + {2658358800 3600 1 WEST} + {2676502800 0 0 WET} + {2689808400 3600 1 WEST} + {2708557200 0 0 WET} + {2721258000 3600 1 WEST} + {2740006800 0 0 WET} + {2752707600 3600 1 WEST} + {2771456400 0 0 WET} + {2784762000 3600 1 WEST} + {2802906000 0 0 WET} + {2816211600 3600 1 WEST} + {2834355600 0 0 WET} + {2847661200 3600 1 WEST} + {2866410000 0 0 WET} + {2879110800 3600 1 WEST} + {2897859600 0 0 WET} + {2910560400 3600 1 WEST} + {2929309200 0 0 WET} + {2942010000 3600 1 WEST} + {2960758800 0 0 WET} + {2974064400 3600 1 WEST} + {2992208400 0 0 WET} + {3005514000 3600 1 WEST} + {3023658000 0 0 WET} + {3036963600 3600 1 WEST} + {3055712400 0 0 WET} + {3068413200 3600 1 WEST} + {3087162000 0 0 WET} + {3099862800 3600 1 WEST} + {3118611600 0 0 WET} + {3131917200 3600 1 WEST} + {3150061200 0 0 WET} + {3163366800 3600 1 WEST} + {3181510800 0 0 WET} + {3194816400 3600 1 WEST} + {3212960400 0 0 WET} + {3226266000 3600 1 WEST} + {3245014800 0 0 WET} + {3257715600 3600 1 WEST} + {3276464400 0 0 WET} + {3289165200 3600 1 WEST} + {3307914000 0 0 WET} + {3321219600 3600 1 WEST} + {3339363600 0 0 WET} + {3352669200 3600 1 WEST} + {3370813200 0 0 WET} + {3384118800 3600 1 WEST} + {3402867600 0 0 WET} + {3415568400 3600 1 WEST} + {3434317200 0 0 WET} + {3447018000 3600 1 WEST} + {3465766800 0 0 WET} + {3479072400 3600 1 WEST} + {3497216400 0 0 WET} + {3510522000 3600 1 WEST} + {3528666000 0 0 WET} + {3541971600 3600 1 WEST} + {3560115600 0 0 WET} + {3573421200 3600 1 WEST} + {3592170000 0 0 WET} + {3604870800 3600 1 WEST} + {3623619600 0 0 WET} + {3636320400 3600 1 WEST} + {3655069200 0 0 WET} + {3668374800 3600 1 WEST} + {3686518800 0 0 WET} + {3699824400 3600 1 WEST} + {3717968400 0 0 WET} + {3731274000 3600 1 WEST} + {3750022800 0 0 WET} + {3762723600 3600 1 WEST} + {3781472400 0 0 WET} + {3794173200 3600 1 WEST} + {3812922000 0 0 WET} + {3825622800 3600 1 WEST} + {3844371600 0 0 WET} + {3857677200 3600 1 WEST} + {3875821200 0 0 WET} + {3889126800 3600 1 WEST} + {3907270800 0 0 WET} + {3920576400 3600 1 WEST} + {3939325200 0 0 WET} + {3952026000 3600 1 WEST} + {3970774800 0 0 WET} + {3983475600 3600 1 WEST} + {4002224400 0 0 WET} + {4015530000 3600 1 WEST} + {4033674000 0 0 WET} + {4046979600 3600 1 WEST} + {4065123600 0 0 WET} + {4078429200 3600 1 WEST} + {4096573200 0 0 WET} +} diff --git a/env/tcl/tcl8.6/tzdata/Zulu b/env/tcl/tcl8.6/tzdata/Zulu new file mode 100644 index 0000000..e9748e4 --- /dev/null +++ b/env/tcl/tcl8.6/tzdata/Zulu @@ -0,0 +1,5 @@ +# created by tools/tclZIC.tcl - do not edit +if {![info exists TZData(Etc/UTC)]} { + LoadTimeZoneFile Etc/UTC +} +set TZData(:Zulu) $TZData(:Etc/UTC) diff --git a/env/tcl/tcl8.6/word.tcl b/env/tcl/tcl8.6/word.tcl new file mode 100644 index 0000000..3e4bc3a --- /dev/null +++ b/env/tcl/tcl8.6/word.tcl @@ -0,0 +1,152 @@ +# word.tcl -- +# +# This file defines various procedures for computing word boundaries in +# strings. This file is primarily needed so Tk text and entry widgets behave +# properly for different platforms. +# +# Copyright (c) 1996 by Sun Microsystems, Inc. +# Copyright (c) 1998 by Scritpics Corporation. +# +# See the file "license.terms" for information on usage and redistribution +# of this file, and for a DISCLAIMER OF ALL WARRANTIES. + +# The following variables are used to determine which characters are +# interpreted as white space. + +if {$::tcl_platform(platform) eq "windows"} { + # Windows style - any but a unicode space char + if {![info exists ::tcl_wordchars]} { + set ::tcl_wordchars {\S} + } + if {![info exists ::tcl_nonwordchars]} { + set ::tcl_nonwordchars {\s} + } +} else { + # Motif style - any unicode word char (number, letter, or underscore) + if {![info exists ::tcl_wordchars]} { + set ::tcl_wordchars {\w} + } + if {![info exists ::tcl_nonwordchars]} { + set ::tcl_nonwordchars {\W} + } +} + +# Arrange for caches of the real matcher REs to be kept, which enables the REs +# themselves to be cached for greater performance (and somewhat greater +# clarity too). + +namespace eval ::tcl { + variable WordBreakRE + array set WordBreakRE {} + + proc UpdateWordBreakREs args { + # Ignores the arguments + global tcl_wordchars tcl_nonwordchars + variable WordBreakRE + + # To keep the RE strings short... + set letter $tcl_wordchars + set space $tcl_nonwordchars + + set WordBreakRE(after) "$letter$space|$space$letter" + set WordBreakRE(before) "^.*($letter$space|$space$letter)" + set WordBreakRE(end) "$space*$letter+$space" + set WordBreakRE(next) "$letter*$space+$letter" + set WordBreakRE(previous) "$space*($letter+)$space*\$" + } + + # Initialize the cache + UpdateWordBreakREs + trace add variable ::tcl_wordchars write ::tcl::UpdateWordBreakREs + trace add variable ::tcl_nonwordchars write ::tcl::UpdateWordBreakREs +} + +# tcl_wordBreakAfter -- +# +# This procedure returns the index of the first word boundary after the +# starting point in the given string, or -1 if there are no more boundaries in +# the given string. The index returned refers to the first character of the +# pair that comprises a boundary. +# +# Arguments: +# str - String to search. +# start - Index into string specifying starting point. + +proc tcl_wordBreakAfter {str start} { + variable ::tcl::WordBreakRE + set result {-1 -1} + regexp -indices -start $start -- $WordBreakRE(after) $str result + return [lindex $result 1] +} + +# tcl_wordBreakBefore -- +# +# This procedure returns the index of the first word boundary before the +# starting point in the given string, or -1 if there are no more boundaries in +# the given string. The index returned refers to the second character of the +# pair that comprises a boundary. +# +# Arguments: +# str - String to search. +# start - Index into string specifying starting point. + +proc tcl_wordBreakBefore {str start} { + variable ::tcl::WordBreakRE + set result {-1 -1} + regexp -indices -- $WordBreakRE(before) [string range $str 0 $start] result + return [lindex $result 1] +} + +# tcl_endOfWord -- +# +# This procedure returns the index of the first end-of-word location after a +# starting index in the given string. An end-of-word location is defined to be +# the first whitespace character following the first non-whitespace character +# after the starting point. Returns -1 if there are no more words after the +# starting point. +# +# Arguments: +# str - String to search. +# start - Index into string specifying starting point. + +proc tcl_endOfWord {str start} { + variable ::tcl::WordBreakRE + set result {-1 -1} + regexp -indices -start $start -- $WordBreakRE(end) $str result + return [lindex $result 1] +} + +# tcl_startOfNextWord -- +# +# This procedure returns the index of the first start-of-word location after a +# starting index in the given string. A start-of-word location is defined to +# be a non-whitespace character following a whitespace character. Returns -1 +# if there are no more start-of-word locations after the starting point. +# +# Arguments: +# str - String to search. +# start - Index into string specifying starting point. + +proc tcl_startOfNextWord {str start} { + variable ::tcl::WordBreakRE + set result {-1 -1} + regexp -indices -start $start -- $WordBreakRE(next) $str result + return [lindex $result 1] +} + +# tcl_startOfPreviousWord -- +# +# This procedure returns the index of the first start-of-word location before +# a starting index in the given string. +# +# Arguments: +# str - String to search. +# start - Index into string specifying starting point. + +proc tcl_startOfPreviousWord {str start} { + variable ::tcl::WordBreakRE + set word {-1 -1} + regexp -indices -- $WordBreakRE(previous) [string range $str 0 $start-1] \ + result word + return [lindex $word 0] +} diff --git a/env/tcl/tk8.6/bgerror.tcl b/env/tcl/tk8.6/bgerror.tcl new file mode 100644 index 0000000..b15387e --- /dev/null +++ b/env/tcl/tk8.6/bgerror.tcl @@ -0,0 +1,265 @@ +# bgerror.tcl -- +# +# Implementation of the bgerror procedure. It posts a dialog box with +# the error message and gives the user a chance to see a more detailed +# stack trace, and possible do something more interesting with that +# trace (like save it to a log). This is adapted from work done by +# Donal K. Fellows. +# +# Copyright (c) 1998-2000 by Ajuba Solutions. +# Copyright (c) 2007 by ActiveState Software Inc. +# Copyright (c) 2007 Daniel A. Steffen +# Copyright (c) 2009 Pat Thoyts + +namespace eval ::tk::dialog::error { + namespace import -force ::tk::msgcat::* + namespace export bgerror + option add *ErrorDialog.function.text [mc "Save To Log"] \ + widgetDefault + option add *ErrorDialog.function.command [namespace code SaveToLog] + option add *ErrorDialog*Label.font TkCaptionFont widgetDefault + if {[tk windowingsystem] eq "aqua"} { + option add *ErrorDialog*background systemAlertBackgroundActive \ + widgetDefault + option add *ErrorDialog*info.text.background white widgetDefault + option add *ErrorDialog*Button.highlightBackground \ + systemAlertBackgroundActive widgetDefault + } +} + +proc ::tk::dialog::error::Return {which code} { + variable button + + .bgerrorDialog.$which state {active selected focus} + update idletasks + after 100 + set button $code +} + +proc ::tk::dialog::error::Details {} { + set w .bgerrorDialog + set caption [option get $w.function text {}] + set command [option get $w.function command {}] + if { ($caption eq "") || ($command eq "") } { + grid forget $w.function + } + lappend command [$w.top.info.text get 1.0 end-1c] + $w.function configure -text $caption -command $command + grid $w.top.info - -sticky nsew -padx 3m -pady 3m +} + +proc ::tk::dialog::error::SaveToLog {text} { + if { $::tcl_platform(platform) eq "windows" } { + set allFiles *.* + } else { + set allFiles * + } + set types [list \ + [list [mc "Log Files"] .log] \ + [list [mc "Text Files"] .txt] \ + [list [mc "All Files"] $allFiles] \ + ] + set filename [tk_getSaveFile -title [mc "Select Log File"] \ + -filetypes $types -defaultextension .log -parent .bgerrorDialog] + if {$filename ne {}} { + set f [open $filename w] + puts -nonewline $f $text + close $f + } + return +} + +proc ::tk::dialog::error::Destroy {w} { + if {$w eq ".bgerrorDialog"} { + variable button + set button -1 + } +} + +proc ::tk::dialog::error::DeleteByProtocol {} { + variable button + set button 1 +} + +proc ::tk::dialog::error::ReturnInDetails w { + bind $w {}; # Remove this binding + $w invoke + return -code break +} + +# ::tk::dialog::error::bgerror -- +# +# This is the default version of bgerror. +# It tries to execute tkerror, if that fails it posts a dialog box +# containing the error message and gives the user a chance to ask +# to see a stack trace. +# +# Arguments: +# err - The error message. +# +proc ::tk::dialog::error::bgerror err { + global errorInfo + variable button + + set info $errorInfo + + set ret [catch {::tkerror $err} msg]; + if {$ret != 1} {return -code $ret $msg} + + # Ok the application's tkerror either failed or was not found + # we use the default dialog then : + set windowingsystem [tk windowingsystem] + if {$windowingsystem eq "aqua"} { + set ok [mc Ok] + } else { + set ok [mc OK] + } + + # Truncate the message if it is too wide (>maxLine characters) or + # too tall (>4 lines). Truncation occurs at the first point at + # which one of those conditions is met. + set displayedErr "" + set lines 0 + set maxLine 45 + foreach line [split $err \n] { + if { [string length $line] > $maxLine } { + append displayedErr "[string range $line 0 [expr {$maxLine-3}]]..." + break + } + if { $lines > 4 } { + append displayedErr "..." + break + } else { + append displayedErr "${line}\n" + } + incr lines + } + + set title [mc "Application Error"] + set text [mc "Error: %1\$s" $displayedErr] + set buttons [list ok $ok dismiss [mc "Skip Messages"] \ + function [mc "Details >>"]] + + # 1. Create the top-level window and divide it into top + # and bottom parts. + + set dlg .bgerrorDialog + set bg [ttk::style lookup . -background] + destroy $dlg + toplevel $dlg -class ErrorDialog -background $bg + wm withdraw $dlg + wm title $dlg $title + wm iconname $dlg ErrorDialog + wm protocol $dlg WM_DELETE_WINDOW [namespace code DeleteByProtocol] + + if {$windowingsystem eq "aqua"} { + ::tk::unsupported::MacWindowStyle style $dlg moveableAlert {} + } elseif {$windowingsystem eq "x11"} { + wm attributes $dlg -type dialog + } + + ttk::frame $dlg.bot + ttk::frame $dlg.top + pack $dlg.bot -side bottom -fill both + pack $dlg.top -side top -fill both -expand 1 + + set W [ttk::frame $dlg.top.info] + text $W.text -setgrid true -height 10 -wrap char \ + -yscrollcommand [list $W.scroll set] + if {$windowingsystem ne "aqua"} { + $W.text configure -width 40 + } + + ttk::scrollbar $W.scroll -command [list $W.text yview] + pack $W.scroll -side right -fill y + pack $W.text -side left -expand yes -fill both + $W.text insert 0.0 "$err\n$info" + $W.text mark set insert 0.0 + bind $W.text { focus %W } + $W.text configure -state disabled + + # 2. Fill the top part with bitmap and message + + # Max-width of message is the width of the screen... + set wrapwidth [winfo screenwidth $dlg] + # ...minus the width of the icon, padding and a fudge factor for + # the window manager decorations and aesthetics. + set wrapwidth [expr {$wrapwidth-60-[winfo pixels $dlg 9m]}] + ttk::label $dlg.msg -justify left -text $text -wraplength $wrapwidth + ttk::label $dlg.bitmap -image ::tk::icons::error + + grid $dlg.bitmap $dlg.msg -in $dlg.top -row 0 -padx 3m -pady 3m + grid configure $dlg.bitmap -sticky ne + grid configure $dlg.msg -sticky nsw -padx {0 3m} + grid rowconfigure $dlg.top 1 -weight 1 + grid columnconfigure $dlg.top 1 -weight 1 + + # 3. Create a row of buttons at the bottom of the dialog. + + set i 0 + foreach {name caption} $buttons { + ttk::button $dlg.$name -text $caption -default normal \ + -command [namespace code [list set button $i]] + grid $dlg.$name -in $dlg.bot -column $i -row 0 -sticky ew -padx 10 + grid columnconfigure $dlg.bot $i -weight 1 + # We boost the size of some Mac buttons for l&f + if {$windowingsystem eq "aqua"} { + if {($name eq "ok") || ($name eq "dismiss")} { + grid columnconfigure $dlg.bot $i -minsize 90 + } + grid configure $dlg.$name -pady 7 + } + incr i + } + # The "OK" button is the default for this dialog. + $dlg.ok configure -default active + + bind $dlg [namespace code {Return ok 0}] + bind $dlg [namespace code {Return dismiss 1}] + bind $dlg [namespace code {Destroy %W}] + bind $dlg.function [namespace code {ReturnInDetails %W}] + $dlg.function configure -command [namespace code Details] + + # 6. Withdraw the window, then update all the geometry information + # so we know how big it wants to be, then center the window in the + # display (Motif style) and de-iconify it. + + ::tk::PlaceWindow $dlg + + # 7. Set a grab and claim the focus too. + + ::tk::SetFocusGrab $dlg $dlg.ok + + # 8. Ensure that we are topmost. + + raise $dlg + if {[tk windowingsystem] eq "win32"} { + # Place it topmost if we aren't at the top of the stacking + # order to ensure that it's seen + if {[lindex [wm stackorder .] end] ne "$dlg"} { + wm attributes $dlg -topmost 1 + } + } + + # 9. Wait for the user to respond, then restore the focus and + # return the index of the selected button. Restore the focus + # before deleting the window, since otherwise the window manager + # may take the focus away so we can't redirect it. Finally, + # restore any grab that was in effect. + + vwait [namespace which -variable button] + set copy $button; # Save a copy... + + ::tk::RestoreFocusGrab $dlg $dlg.ok destroy + + if {$copy == 1} { + return -code break + } +} + +namespace eval :: { + # Fool the indexer + proc bgerror err {} + rename bgerror {} + namespace import ::tk::dialog::error::bgerror +} diff --git a/env/tcl/tk8.6/button.tcl b/env/tcl/tk8.6/button.tcl new file mode 100644 index 0000000..80d8bf9 --- /dev/null +++ b/env/tcl/tk8.6/button.tcl @@ -0,0 +1,778 @@ +# button.tcl -- +# +# This file defines the default bindings for Tk label, button, +# checkbutton, and radiobutton widgets and provides procedures +# that help in implementing those bindings. +# +# Copyright (c) 1992-1994 The Regents of the University of California. +# Copyright (c) 1994-1996 Sun Microsystems, Inc. +# Copyright (c) 2002 ActiveState Corporation. +# +# See the file "license.terms" for information on usage and redistribution +# of this file, and for a DISCLAIMER OF ALL WARRANTIES. +# + +#------------------------------------------------------------------------- +# The code below creates the default class bindings for buttons. +#------------------------------------------------------------------------- + +if {[tk windowingsystem] eq "aqua"} { + + bind Radiobutton { + tk::ButtonEnter %W + } + bind Radiobutton <1> { + tk::ButtonDown %W + } + bind Radiobutton { + tk::ButtonUp %W + } + bind Checkbutton { + tk::ButtonEnter %W + } + bind Checkbutton <1> { + tk::ButtonDown %W + } + bind Checkbutton { + tk::ButtonUp %W + } + bind Checkbutton { + tk::ButtonLeave %W + } +} +if {"win32" eq [tk windowingsystem]} { + bind Checkbutton { + tk::CheckRadioInvoke %W select + } + bind Checkbutton { + tk::CheckRadioInvoke %W select + } + bind Checkbutton { + tk::CheckRadioInvoke %W deselect + } + bind Checkbutton <1> { + tk::CheckRadioDown %W + } + bind Checkbutton { + tk::ButtonUp %W + } + bind Checkbutton { + tk::CheckRadioEnter %W + } + bind Checkbutton { + tk::ButtonLeave %W + } + + bind Radiobutton <1> { + tk::CheckRadioDown %W + } + bind Radiobutton { + tk::ButtonUp %W + } + bind Radiobutton { + tk::CheckRadioEnter %W + } +} +if {"x11" eq [tk windowingsystem]} { + bind Checkbutton { + if {!$tk_strictMotif} { + tk::CheckInvoke %W + } + } + bind Radiobutton { + if {!$tk_strictMotif} { + tk::CheckRadioInvoke %W + } + } + bind Checkbutton <1> { + tk::CheckInvoke %W + } + bind Radiobutton <1> { + tk::CheckRadioInvoke %W + } + bind Checkbutton { + tk::CheckEnter %W + } + bind Radiobutton { + tk::ButtonEnter %W + } + bind Checkbutton { + tk::CheckLeave %W + } +} + +bind Button { + tk::ButtonInvoke %W +} +bind Checkbutton { + tk::CheckRadioInvoke %W +} +bind Radiobutton { + tk::CheckRadioInvoke %W +} +bind Button <> { + tk::ButtonInvoke %W +} +bind Checkbutton <> { + tk::CheckRadioInvoke %W +} +bind Radiobutton <> { + tk::CheckRadioInvoke %W +} + +bind Button {} +bind Button { + tk::ButtonEnter %W +} +bind Button { + tk::ButtonLeave %W +} +bind Button <1> { + tk::ButtonDown %W +} +bind Button { + tk::ButtonUp %W +} + +bind Checkbutton {} + +bind Radiobutton {} +bind Radiobutton { + tk::ButtonLeave %W +} + +if {"win32" eq [tk windowingsystem]} { + +######################### +# Windows implementation +######################### + +# ::tk::ButtonEnter -- +# The procedure below is invoked when the mouse pointer enters a +# button widget. It records the button we're in and changes the +# state of the button to active unless the button is disabled. +# +# Arguments: +# w - The name of the widget. + +proc ::tk::ButtonEnter w { + variable ::tk::Priv + if {[$w cget -state] ne "disabled"} { + + # If the mouse button is down, set the relief to sunken on entry. + # Overwise, if there's an -overrelief value, set the relief to that. + + set Priv($w,relief) [$w cget -relief] + if {$Priv(buttonWindow) eq $w} { + $w configure -relief sunken -state active + set Priv($w,prelief) sunken + } elseif {[set over [$w cget -overrelief]] ne ""} { + $w configure -relief $over + set Priv($w,prelief) $over + } + } + set Priv(window) $w +} + +# ::tk::ButtonLeave -- +# The procedure below is invoked when the mouse pointer leaves a +# button widget. It changes the state of the button back to inactive. +# Restore any modified relief too. +# +# Arguments: +# w - The name of the widget. + +proc ::tk::ButtonLeave w { + variable ::tk::Priv + if {[$w cget -state] ne "disabled"} { + $w configure -state normal + } + + # Restore the original button relief if it was changed by Tk. + # That is signaled by the existence of Priv($w,prelief). + + if {[info exists Priv($w,relief)]} { + if {[info exists Priv($w,prelief)] && \ + $Priv($w,prelief) eq [$w cget -relief]} { + $w configure -relief $Priv($w,relief) + } + unset -nocomplain Priv($w,relief) Priv($w,prelief) + } + + set Priv(window) "" +} + +# ::tk::ButtonDown -- +# The procedure below is invoked when the mouse button is pressed in +# a button widget. It records the fact that the mouse is in the button, +# saves the button's relief so it can be restored later, and changes +# the relief to sunken. +# +# Arguments: +# w - The name of the widget. + +proc ::tk::ButtonDown w { + variable ::tk::Priv + + # Only save the button's relief if it does not yet exist. If there + # is an overrelief setting, Priv($w,relief) will already have been set, + # and the current value of the -relief option will be incorrect. + + if {![info exists Priv($w,relief)]} { + set Priv($w,relief) [$w cget -relief] + } + + if {[$w cget -state] ne "disabled"} { + set Priv(buttonWindow) $w + $w configure -relief sunken -state active + set Priv($w,prelief) sunken + + # If this button has a repeatdelay set up, get it going with an after + after cancel $Priv(afterId) + set delay [$w cget -repeatdelay] + set Priv(repeated) 0 + if {$delay > 0} { + set Priv(afterId) [after $delay [list tk::ButtonAutoInvoke $w]] + } + } +} + +# ::tk::ButtonUp -- +# The procedure below is invoked when the mouse button is released +# in a button widget. It restores the button's relief and invokes +# the command as long as the mouse hasn't left the button. +# +# Arguments: +# w - The name of the widget. + +proc ::tk::ButtonUp w { + variable ::tk::Priv + if {$Priv(buttonWindow) eq $w} { + set Priv(buttonWindow) "" + + # Restore the button's relief if it was cached. + + if {[info exists Priv($w,relief)]} { + if {[info exists Priv($w,prelief)] && \ + $Priv($w,prelief) eq [$w cget -relief]} { + $w configure -relief $Priv($w,relief) + } + unset -nocomplain Priv($w,relief) Priv($w,prelief) + } + + # Clean up the after event from the auto-repeater + after cancel $Priv(afterId) + + if {$Priv(window) eq $w && [$w cget -state] ne "disabled"} { + $w configure -state normal + + # Only invoke the command if it wasn't already invoked by the + # auto-repeater functionality + if { $Priv(repeated) == 0 } { + uplevel #0 [list $w invoke] + } + } + } +} + +# ::tk::CheckRadioEnter -- +# The procedure below is invoked when the mouse pointer enters a +# checkbutton or radiobutton widget. It records the button we're in +# and changes the state of the button to active unless the button is +# disabled. +# +# Arguments: +# w - The name of the widget. + +proc ::tk::CheckRadioEnter w { + variable ::tk::Priv + if {[$w cget -state] ne "disabled"} { + if {$Priv(buttonWindow) eq $w} { + $w configure -state active + } + if {[set over [$w cget -overrelief]] ne ""} { + set Priv($w,relief) [$w cget -relief] + set Priv($w,prelief) $over + $w configure -relief $over + } + } + set Priv(window) $w +} + +# ::tk::CheckRadioDown -- +# The procedure below is invoked when the mouse button is pressed in +# a button widget. It records the fact that the mouse is in the button, +# saves the button's relief so it can be restored later, and changes +# the relief to sunken. +# +# Arguments: +# w - The name of the widget. + +proc ::tk::CheckRadioDown w { + variable ::tk::Priv + if {![info exists Priv($w,relief)]} { + set Priv($w,relief) [$w cget -relief] + } + if {[$w cget -state] ne "disabled"} { + set Priv(buttonWindow) $w + set Priv(repeated) 0 + $w configure -state active + } +} + +} + +if {"x11" eq [tk windowingsystem]} { + +##################### +# Unix implementation +##################### + +# ::tk::ButtonEnter -- +# The procedure below is invoked when the mouse pointer enters a +# button widget. It records the button we're in and changes the +# state of the button to active unless the button is disabled. +# +# Arguments: +# w - The name of the widget. + +proc ::tk::ButtonEnter {w} { + variable ::tk::Priv + if {[$w cget -state] ne "disabled"} { + # On unix the state is active just with mouse-over + $w configure -state active + + # If the mouse button is down, set the relief to sunken on entry. + # Overwise, if there's an -overrelief value, set the relief to that. + + set Priv($w,relief) [$w cget -relief] + if {$Priv(buttonWindow) eq $w} { + $w configure -relief sunken + set Priv($w,prelief) sunken + } elseif {[set over [$w cget -overrelief]] ne ""} { + $w configure -relief $over + set Priv($w,prelief) $over + } + } + set Priv(window) $w +} + +# ::tk::ButtonLeave -- +# The procedure below is invoked when the mouse pointer leaves a +# button widget. It changes the state of the button back to inactive. +# Restore any modified relief too. +# +# Arguments: +# w - The name of the widget. + +proc ::tk::ButtonLeave w { + variable ::tk::Priv + if {[$w cget -state] ne "disabled"} { + $w configure -state normal + } + + # Restore the original button relief if it was changed by Tk. + # That is signaled by the existence of Priv($w,prelief). + + if {[info exists Priv($w,relief)]} { + if {[info exists Priv($w,prelief)] && \ + $Priv($w,prelief) eq [$w cget -relief]} { + $w configure -relief $Priv($w,relief) + } + unset -nocomplain Priv($w,relief) Priv($w,prelief) + } + + set Priv(window) "" +} + +# ::tk::ButtonDown -- +# The procedure below is invoked when the mouse button is pressed in +# a button widget. It records the fact that the mouse is in the button, +# saves the button's relief so it can be restored later, and changes +# the relief to sunken. +# +# Arguments: +# w - The name of the widget. + +proc ::tk::ButtonDown w { + variable ::tk::Priv + + # Only save the button's relief if it does not yet exist. If there + # is an overrelief setting, Priv($w,relief) will already have been set, + # and the current value of the -relief option will be incorrect. + + if {![info exists Priv($w,relief)]} { + set Priv($w,relief) [$w cget -relief] + } + + if {[$w cget -state] ne "disabled"} { + set Priv(buttonWindow) $w + $w configure -relief sunken + set Priv($w,prelief) sunken + + # If this button has a repeatdelay set up, get it going with an after + after cancel $Priv(afterId) + set delay [$w cget -repeatdelay] + set Priv(repeated) 0 + if {$delay > 0} { + set Priv(afterId) [after $delay [list tk::ButtonAutoInvoke $w]] + } + } +} + +# ::tk::ButtonUp -- +# The procedure below is invoked when the mouse button is released +# in a button widget. It restores the button's relief and invokes +# the command as long as the mouse hasn't left the button. +# +# Arguments: +# w - The name of the widget. + +proc ::tk::ButtonUp w { + variable ::tk::Priv + if {$w eq $Priv(buttonWindow)} { + set Priv(buttonWindow) "" + + # Restore the button's relief if it was cached. + + if {[info exists Priv($w,relief)]} { + if {[info exists Priv($w,prelief)] && \ + $Priv($w,prelief) eq [$w cget -relief]} { + $w configure -relief $Priv($w,relief) + } + unset -nocomplain Priv($w,relief) Priv($w,prelief) + } + + # Clean up the after event from the auto-repeater + after cancel $Priv(afterId) + + if {$Priv(window) eq $w && [$w cget -state] ne "disabled"} { + # Only invoke the command if it wasn't already invoked by the + # auto-repeater functionality + if { $Priv(repeated) == 0 } { + uplevel #0 [list $w invoke] + } + } + } +} + +} + +if {[tk windowingsystem] eq "aqua"} { + +#################### +# Mac implementation +#################### + +# ::tk::ButtonEnter -- +# The procedure below is invoked when the mouse pointer enters a +# button widget. It records the button we're in and changes the +# state of the button to active unless the button is disabled. +# +# Arguments: +# w - The name of the widget. + +proc ::tk::ButtonEnter {w} { + variable ::tk::Priv + if {[$w cget -state] ne "disabled"} { + + # If there's an -overrelief value, set the relief to that. + + if {$Priv(buttonWindow) eq $w} { + $w configure -state active + } elseif {[set over [$w cget -overrelief]] ne ""} { + set Priv($w,relief) [$w cget -relief] + set Priv($w,prelief) $over + $w configure -relief $over + } + } + set Priv(window) $w +} + +# ::tk::ButtonLeave -- +# The procedure below is invoked when the mouse pointer leaves a +# button widget. It changes the state of the button back to +# inactive. If we're leaving the button window with a mouse button +# pressed (Priv(buttonWindow) == $w), restore the relief of the +# button too. +# +# Arguments: +# w - The name of the widget. + +proc ::tk::ButtonLeave w { + variable ::tk::Priv + if {$w eq $Priv(buttonWindow)} { + $w configure -state normal + } + + # Restore the original button relief if it was changed by Tk. + # That is signaled by the existence of Priv($w,prelief). + + if {[info exists Priv($w,relief)]} { + if {[info exists Priv($w,prelief)] && \ + $Priv($w,prelief) eq [$w cget -relief]} { + $w configure -relief $Priv($w,relief) + } + unset -nocomplain Priv($w,relief) Priv($w,prelief) + } + + set Priv(window) "" +} + +# ::tk::ButtonDown -- +# The procedure below is invoked when the mouse button is pressed in +# a button widget. It records the fact that the mouse is in the button, +# saves the button's relief so it can be restored later, and changes +# the relief to sunken. +# +# Arguments: +# w - The name of the widget. + +proc ::tk::ButtonDown w { + variable ::tk::Priv + + if {[$w cget -state] ne "disabled"} { + set Priv(buttonWindow) $w + $w configure -state active + + # If this button has a repeatdelay set up, get it going with an after + after cancel $Priv(afterId) + set Priv(repeated) 0 + if { ![catch {$w cget -repeatdelay} delay] } { + if {$delay > 0} { + set Priv(afterId) [after $delay [list tk::ButtonAutoInvoke $w]] + } + } + } +} + +# ::tk::ButtonUp -- +# The procedure below is invoked when the mouse button is released +# in a button widget. It restores the button's relief and invokes +# the command as long as the mouse hasn't left the button. +# +# Arguments: +# w - The name of the widget. + +proc ::tk::ButtonUp w { + variable ::tk::Priv + if {$Priv(buttonWindow) eq $w} { + set Priv(buttonWindow) "" + $w configure -state normal + + # Restore the button's relief if it was cached. + + if {[info exists Priv($w,relief)]} { + if {[info exists Priv($w,prelief)] && \ + $Priv($w,prelief) eq [$w cget -relief]} { + $w configure -relief $Priv($w,relief) + } + unset -nocomplain Priv($w,relief) Priv($w,prelief) + } + + # Clean up the after event from the auto-repeater + after cancel $Priv(afterId) + + if {$Priv(window) eq $w && [$w cget -state] ne "disabled"} { + # Only invoke the command if it wasn't already invoked by the + # auto-repeater functionality + if { $Priv(repeated) == 0 } { + uplevel #0 [list $w invoke] + } + } + } +} + +} + +################## +# Shared routines +################## + +# ::tk::ButtonInvoke -- +# The procedure below is called when a button is invoked through +# the keyboard. It simulate a press of the button via the mouse. +# +# Arguments: +# w - The name of the widget. + +proc ::tk::ButtonInvoke w { + if {[winfo exists $w] && [$w cget -state] ne "disabled"} { + set oldRelief [$w cget -relief] + set oldState [$w cget -state] + $w configure -state active -relief sunken + after 100 [list ::tk::ButtonInvokeEnd $w $oldState $oldRelief] + } +} + +# ::tk::ButtonInvokeEnd -- +# The procedure below is called after a button is invoked through +# the keyboard. It simulate a release of the button via the mouse. +# +# Arguments: +# w - The name of the widget. +# oldState - Old state to be set back. +# oldRelief - Old relief to be set back. + +proc ::tk::ButtonInvokeEnd {w oldState oldRelief} { + if {[winfo exists $w]} { + $w configure -state $oldState -relief $oldRelief + uplevel #0 [list $w invoke] + } +} + +# ::tk::ButtonAutoInvoke -- +# +# Invoke an auto-repeating button, and set it up to continue to repeat. +# +# Arguments: +# w button to invoke. +# +# Results: +# None. +# +# Side effects: +# May create an after event to call ::tk::ButtonAutoInvoke. + +proc ::tk::ButtonAutoInvoke {w} { + variable ::tk::Priv + after cancel $Priv(afterId) + set delay [$w cget -repeatinterval] + if {$Priv(window) eq $w} { + incr Priv(repeated) + uplevel #0 [list $w invoke] + } + if {$delay > 0} { + set Priv(afterId) [after $delay [list tk::ButtonAutoInvoke $w]] + } +} + +# ::tk::CheckRadioInvoke -- +# The procedure below is invoked when the mouse button is pressed in +# a checkbutton or radiobutton widget, or when the widget is invoked +# through the keyboard. It invokes the widget if it +# isn't disabled. +# +# Arguments: +# w - The name of the widget. +# cmd - The subcommand to invoke (one of invoke, select, or deselect). + +proc ::tk::CheckRadioInvoke {w {cmd invoke}} { + if {[$w cget -state] ne "disabled"} { + uplevel #0 [list $w $cmd] + } +} + +# Special versions of the handlers for checkbuttons on Unix that do the magic +# to make things work right when the checkbutton indicator is hidden; +# radiobuttons don't need this complexity. + +# ::tk::CheckInvoke -- +# The procedure below invokes the checkbutton, like ButtonInvoke, but handles +# what to do when the checkbutton indicator is missing. Only used on Unix. +# +# Arguments: +# w - The name of the widget. + +proc ::tk::CheckInvoke {w} { + variable ::tk::Priv + if {[$w cget -state] ne "disabled"} { + # Additional logic to switch the "selected" colors around if necessary + # (when we're indicator-less). + + if {![$w cget -indicatoron] && [info exist Priv($w,selectcolor)]} { + if {[$w cget -selectcolor] eq $Priv($w,aselectcolor)} { + $w configure -selectcolor $Priv($w,selectcolor) + } else { + $w configure -selectcolor $Priv($w,aselectcolor) + } + } + uplevel #0 [list $w invoke] + } +} + +# ::tk::CheckEnter -- +# The procedure below enters the checkbutton, like ButtonEnter, but handles +# what to do when the checkbutton indicator is missing. Only used on Unix. +# +# Arguments: +# w - The name of the widget. + +proc ::tk::CheckEnter {w} { + variable ::tk::Priv + if {[$w cget -state] ne "disabled"} { + # On unix the state is active just with mouse-over + $w configure -state active + + # If the mouse button is down, set the relief to sunken on entry. + # Overwise, if there's an -overrelief value, set the relief to that. + + set Priv($w,relief) [$w cget -relief] + if {$Priv(buttonWindow) eq $w} { + $w configure -relief sunken + set Priv($w,prelief) sunken + } elseif {[set over [$w cget -overrelief]] ne ""} { + $w configure -relief $over + set Priv($w,prelief) $over + } + + # Compute what the "selected and active" color should be. + + if {![$w cget -indicatoron] && [$w cget -selectcolor] ne ""} { + set Priv($w,selectcolor) [$w cget -selectcolor] + lassign [winfo rgb $w [$w cget -selectcolor]] r1 g1 b1 + lassign [winfo rgb $w [$w cget -activebackground]] r2 g2 b2 + set Priv($w,aselectcolor) \ + [format "#%04x%04x%04x" [expr {($r1+$r2)/2}] \ + [expr {($g1+$g2)/2}] [expr {($b1+$b2)/2}]] + # use uplevel to work with other var resolvers + if {[uplevel #0 [list set [$w cget -variable]]] + eq [$w cget -onvalue]} { + $w configure -selectcolor $Priv($w,aselectcolor) + } + } + } + set Priv(window) $w +} + +# ::tk::CheckLeave -- +# The procedure below leaves the checkbutton, like ButtonLeave, but handles +# what to do when the checkbutton indicator is missing. Only used on Unix. +# +# Arguments: +# w - The name of the widget. + +proc ::tk::CheckLeave {w} { + variable ::tk::Priv + if {[$w cget -state] ne "disabled"} { + $w configure -state normal + } + + # Restore the original button "selected" color; assume that the user + # wasn't monkeying around with things too much. + + if {![$w cget -indicatoron] && [info exist Priv($w,selectcolor)]} { + $w configure -selectcolor $Priv($w,selectcolor) + } + unset -nocomplain Priv($w,selectcolor) Priv($w,aselectcolor) + + # Restore the original button relief if it was changed by Tk. That is + # signaled by the existence of Priv($w,prelief). + + if {[info exists Priv($w,relief)]} { + if {[info exists Priv($w,prelief)] && \ + $Priv($w,prelief) eq [$w cget -relief]} { + $w configure -relief $Priv($w,relief) + } + unset -nocomplain Priv($w,relief) Priv($w,prelief) + } + + set Priv(window) "" +} + +return + +# Local Variables: +# mode: tcl +# fill-column: 78 +# End: diff --git a/env/tcl/tk8.6/choosedir.tcl b/env/tcl/tk8.6/choosedir.tcl new file mode 100644 index 0000000..68dd9b0 --- /dev/null +++ b/env/tcl/tk8.6/choosedir.tcl @@ -0,0 +1,308 @@ +# choosedir.tcl -- +# +# Choose directory dialog implementation for Unix/Mac. +# +# Copyright (c) 1998-2000 by Scriptics Corporation. +# All rights reserved. + +# Make sure the tk::dialog namespace, in which all dialogs should live, exists +namespace eval ::tk::dialog {} +namespace eval ::tk::dialog::file {} + +# Make the chooseDir namespace inside the dialog namespace +namespace eval ::tk::dialog::file::chooseDir { + namespace import -force ::tk::msgcat::* +} + +# ::tk::dialog::file::chooseDir:: -- +# +# Implements the TK directory selection dialog. +# +# Arguments: +# args Options parsed by the procedure. +# +proc ::tk::dialog::file::chooseDir:: {args} { + variable ::tk::Priv + set dataName __tk_choosedir + upvar ::tk::dialog::file::$dataName data + Config $dataName $args + + if {$data(-parent) eq "."} { + set w .$dataName + } else { + set w $data(-parent).$dataName + } + + # (re)create the dialog box if necessary + # + if {![winfo exists $w]} { + ::tk::dialog::file::Create $w TkChooseDir + } elseif {[winfo class $w] ne "TkChooseDir"} { + destroy $w + ::tk::dialog::file::Create $w TkChooseDir + } else { + set data(dirMenuBtn) $w.contents.f1.menu + set data(dirMenu) $w.contents.f1.menu.menu + set data(upBtn) $w.contents.f1.up + set data(icons) $w.contents.icons + set data(ent) $w.contents.f2.ent + set data(okBtn) $w.contents.f2.ok + set data(cancelBtn) $w.contents.f2.cancel + set data(hiddenBtn) $w.contents.f2.hidden + } + if {$::tk::dialog::file::showHiddenBtn} { + $data(hiddenBtn) configure -state normal + grid $data(hiddenBtn) + } else { + $data(hiddenBtn) configure -state disabled + grid remove $data(hiddenBtn) + } + + # When using -mustexist, manage the OK button state for validity + $data(okBtn) configure -state normal + if {$data(-mustexist)} { + $data(ent) configure -validate key \ + -validatecommand [list ::tk::dialog::file::chooseDir::IsOK? $w %P] + } else { + $data(ent) configure -validate none + } + + # Dialog boxes should be transient with respect to their parent, + # so that they will always stay on top of their parent window. However, + # some window managers will create the window as withdrawn if the parent + # window is withdrawn or iconified. Combined with the grab we put on the + # window, this can hang the entire application. Therefore we only make + # the dialog transient if the parent is viewable. + + if {[winfo viewable [winfo toplevel $data(-parent)]] } { + wm transient $w $data(-parent) + } + + trace add variable data(selectPath) write \ + [list ::tk::dialog::file::SetPath $w] + $data(dirMenuBtn) configure \ + -textvariable ::tk::dialog::file::${dataName}(selectPath) + + set data(filter) "*" + set data(previousEntryText) "" + ::tk::dialog::file::UpdateWhenIdle $w + + # Withdraw the window, then update all the geometry information + # so we know how big it wants to be, then center the window in the + # display (Motif style) and de-iconify it. + + ::tk::PlaceWindow $w widget $data(-parent) + wm title $w $data(-title) + + # Set a grab and claim the focus too. + + ::tk::SetFocusGrab $w $data(ent) + $data(ent) delete 0 end + $data(ent) insert 0 $data(selectPath) + $data(ent) selection range 0 end + $data(ent) icursor end + + # Wait for the user to respond, then restore the focus and + # return the index of the selected button. Restore the focus + # before deleting the window, since otherwise the window manager + # may take the focus away so we can't redirect it. Finally, + # restore any grab that was in effect. + + vwait ::tk::Priv(selectFilePath) + + ::tk::RestoreFocusGrab $w $data(ent) withdraw + + # Cleanup traces on selectPath variable + # + + foreach trace [trace info variable data(selectPath)] { + trace remove variable data(selectPath) [lindex $trace 0] [lindex $trace 1] + } + $data(dirMenuBtn) configure -textvariable {} + + # Return value to user + # + + return $Priv(selectFilePath) +} + +# ::tk::dialog::file::chooseDir::Config -- +# +# Configures the Tk choosedir dialog according to the argument list +# +proc ::tk::dialog::file::chooseDir::Config {dataName argList} { + upvar ::tk::dialog::file::$dataName data + + # 0: Delete all variable that were set on data(selectPath) the + # last time the file dialog is used. The traces may cause troubles + # if the dialog is now used with a different -parent option. + # + foreach trace [trace info variable data(selectPath)] { + trace remove variable data(selectPath) [lindex $trace 0] [lindex $trace 1] + } + + # 1: the configuration specs + # + set specs { + {-mustexist "" "" 0} + {-initialdir "" "" ""} + {-parent "" "" "."} + {-title "" "" ""} + } + + # 2: default values depending on the type of the dialog + # + if {![info exists data(selectPath)]} { + # first time the dialog has been popped up + set data(selectPath) [pwd] + } + + # 3: parse the arguments + # + tclParseConfigSpec ::tk::dialog::file::$dataName $specs "" $argList + + if {$data(-title) eq ""} { + set data(-title) "[mc "Choose Directory"]" + } + + # Stub out the -multiple value for the dialog; it doesn't make sense for + # choose directory dialogs, but we have to have something there because we + # share so much code with the file dialogs. + set data(-multiple) 0 + + # 4: set the default directory and selection according to the -initial + # settings + # + if {$data(-initialdir) ne ""} { + # Ensure that initialdir is an absolute path name. + if {[file isdirectory $data(-initialdir)]} { + set old [pwd] + cd $data(-initialdir) + set data(selectPath) [pwd] + cd $old + } else { + set data(selectPath) [pwd] + } + } + + if {![winfo exists $data(-parent)]} { + return -code error -errorcode [list TK LOOKUP WINDOW $data(-parent)] \ + "bad window path name \"$data(-parent)\"" + } +} + +# Gets called when user presses Return in the "Selection" entry or presses OK. +# +proc ::tk::dialog::file::chooseDir::OkCmd {w} { + upvar ::tk::dialog::file::[winfo name $w] data + + # This is the brains behind selecting non-existant directories. Here's + # the flowchart: + # 1. If the icon list has a selection, join it with the current dir, + # and return that value. + # 1a. If the icon list does not have a selection ... + # 2. If the entry is empty, do nothing. + # 3. If the entry contains an invalid directory, then... + # 3a. If the value is the same as last time through here, end dialog. + # 3b. If the value is different than last time, save it and return. + # 4. If entry contains a valid directory, then... + # 4a. If the value is the same as the current directory, end dialog. + # 4b. If the value is different from the current directory, change to + # that directory. + + set selection [$data(icons) selection get] + if {[llength $selection] != 0} { + set iconText [$data(icons) get [lindex $selection 0]] + set iconText [file join $data(selectPath) $iconText] + Done $w $iconText + } else { + set text [$data(ent) get] + if {$text eq ""} { + return + } + set text [file join {*}[file split [string trim $text]]] + if {![file exists $text] || ![file isdirectory $text]} { + # Entry contains an invalid directory. If it's the same as the + # last time they came through here, reset the saved value and end + # the dialog. Otherwise, save the value (so we can do this test + # next time). + if {$text eq $data(previousEntryText)} { + set data(previousEntryText) "" + Done $w $text + } else { + set data(previousEntryText) $text + } + } else { + # Entry contains a valid directory. If it is the same as the + # current directory, end the dialog. Otherwise, change to that + # directory. + if {$text eq $data(selectPath)} { + Done $w $text + } else { + set data(selectPath) $text + } + } + } + return +} + +# Change state of OK button to match -mustexist correctness of entry +# +proc ::tk::dialog::file::chooseDir::IsOK? {w text} { + upvar ::tk::dialog::file::[winfo name $w] data + + set ok [file isdirectory $text] + $data(okBtn) configure -state [expr {$ok ? "normal" : "disabled"}] + + # always return 1 + return 1 +} + +proc ::tk::dialog::file::chooseDir::DblClick {w} { + upvar ::tk::dialog::file::[winfo name $w] data + set selection [$data(icons) selection get] + if {[llength $selection] != 0} { + set filenameFragment [$data(icons) get [lindex $selection 0]] + set file $data(selectPath) + if {[file isdirectory $file]} { + ::tk::dialog::file::ListInvoke $w [list $filenameFragment] + return + } + } +} + +# Gets called when user browses the IconList widget (dragging mouse, arrow +# keys, etc) +# +proc ::tk::dialog::file::chooseDir::ListBrowse {w text} { + upvar ::tk::dialog::file::[winfo name $w] data + + if {$text eq ""} { + return + } + + set file [::tk::dialog::file::JoinFile $data(selectPath) $text] + $data(ent) delete 0 end + $data(ent) insert 0 $file +} + +# ::tk::dialog::file::chooseDir::Done -- +# +# Gets called when user has input a valid filename. Pops up a +# dialog box to confirm selection when necessary. Sets the +# Priv(selectFilePath) variable, which will break the "vwait" +# loop in tk_chooseDirectory and return the selected filename to the +# script that calls tk_getOpenFile or tk_getSaveFile +# +proc ::tk::dialog::file::chooseDir::Done {w {selectFilePath ""}} { + upvar ::tk::dialog::file::[winfo name $w] data + variable ::tk::Priv + + if {$selectFilePath eq ""} { + set selectFilePath $data(selectPath) + } + if {$data(-mustexist) && ![file isdirectory $selectFilePath]} { + return + } + set Priv(selectFilePath) $selectFilePath +} diff --git a/env/tcl/tk8.6/clrpick.tcl b/env/tcl/tk8.6/clrpick.tcl new file mode 100644 index 0000000..600be16 --- /dev/null +++ b/env/tcl/tk8.6/clrpick.tcl @@ -0,0 +1,695 @@ +# clrpick.tcl -- +# +# Color selection dialog for platforms that do not support a +# standard color selection dialog. +# +# Copyright (c) 1996 Sun Microsystems, Inc. +# +# See the file "license.terms" for information on usage and redistribution +# of this file, and for a DISCLAIMER OF ALL WARRANTIES. +# +# ToDo: +# +# (1): Find out how many free colors are left in the colormap and +# don't allocate too many colors. +# (2): Implement HSV color selection. +# + +# Make sure namespaces exist +namespace eval ::tk {} +namespace eval ::tk::dialog {} +namespace eval ::tk::dialog::color { + namespace import ::tk::msgcat::* +} + +# ::tk::dialog::color:: -- +# +# Create a color dialog and let the user choose a color. This function +# should not be called directly. It is called by the tk_chooseColor +# function when a native color selector widget does not exist +# +proc ::tk::dialog::color:: {args} { + variable ::tk::Priv + set dataName __tk__color + upvar ::tk::dialog::color::$dataName data + set w .$dataName + + # The lines variables track the start and end indices of the line + # elements in the colorbar canvases. + set data(lines,red,start) 0 + set data(lines,red,last) -1 + set data(lines,green,start) 0 + set data(lines,green,last) -1 + set data(lines,blue,start) 0 + set data(lines,blue,last) -1 + + # This is the actual number of lines that are drawn in each color strip. + # Note that the bars may be of any width. + # However, NUM_COLORBARS must be a number that evenly divides 256. + # Such as 256, 128, 64, etc. + set data(NUM_COLORBARS) 16 + + # BARS_WIDTH is the number of pixels wide the color bar portion of the + # canvas is. This number must be a multiple of NUM_COLORBARS + set data(BARS_WIDTH) 160 + + # PLGN_WIDTH is the number of pixels wide of the triangular selection + # polygon. This also results in the definition of the padding on the + # left and right sides which is half of PLGN_WIDTH. Make this number even. + set data(PLGN_HEIGHT) 10 + + # PLGN_HEIGHT is the height of the selection polygon and the height of the + # selection rectangle at the bottom of the color bar. No restrictions. + set data(PLGN_WIDTH) 10 + + Config $dataName $args + InitValues $dataName + + set sc [winfo screen $data(-parent)] + set winExists [winfo exists $w] + if {!$winExists || $sc ne [winfo screen $w]} { + if {$winExists} { + destroy $w + } + toplevel $w -class TkColorDialog -screen $sc + if {[tk windowingsystem] eq "x11"} {wm attributes $w -type dialog} + BuildDialog $w + } + + # Dialog boxes should be transient with respect to their parent, + # so that they will always stay on top of their parent window. However, + # some window managers will create the window as withdrawn if the parent + # window is withdrawn or iconified. Combined with the grab we put on the + # window, this can hang the entire application. Therefore we only make + # the dialog transient if the parent is viewable. + + if {[winfo viewable [winfo toplevel $data(-parent)]] } { + wm transient $w $data(-parent) + } + + # 5. Withdraw the window, then update all the geometry information + # so we know how big it wants to be, then center the window in the + # display (Motif style) and de-iconify it. + + ::tk::PlaceWindow $w widget $data(-parent) + wm title $w $data(-title) + + # 6. Set a grab and claim the focus too. + + ::tk::SetFocusGrab $w $data(okBtn) + + # 7. Wait for the user to respond, then restore the focus and + # return the index of the selected button. Restore the focus + # before deleting the window, since otherwise the window manager + # may take the focus away so we can't redirect it. Finally, + # restore any grab that was in effect. + + vwait ::tk::Priv(selectColor) + set result $Priv(selectColor) + ::tk::RestoreFocusGrab $w $data(okBtn) + unset data + + return $result +} + +# ::tk::dialog::color::InitValues -- +# +# Get called during initialization or when user resets NUM_COLORBARS +# +proc ::tk::dialog::color::InitValues {dataName} { + upvar ::tk::dialog::color::$dataName data + + # IntensityIncr is the difference in color intensity between a colorbar + # and its neighbors. + set data(intensityIncr) [expr {256 / $data(NUM_COLORBARS)}] + + # ColorbarWidth is the width of each colorbar + set data(colorbarWidth) [expr {$data(BARS_WIDTH) / $data(NUM_COLORBARS)}] + + # Indent is the width of the space at the left and right side of the + # colorbar. It is always half the selector polygon width, because the + # polygon extends into the space. + set data(indent) [expr {$data(PLGN_WIDTH) / 2}] + + set data(colorPad) 2 + set data(selPad) [expr {$data(PLGN_WIDTH) / 2}] + + # + # minX is the x coordinate of the first colorbar + # + set data(minX) $data(indent) + + # + # maxX is the x coordinate of the last colorbar + # + set data(maxX) [expr {$data(BARS_WIDTH) + $data(indent)-1}] + + # + # canvasWidth is the width of the entire canvas, including the indents + # + set data(canvasWidth) [expr {$data(BARS_WIDTH) + $data(PLGN_WIDTH)}] + + # Set the initial color, specified by -initialcolor, or the + # color chosen by the user the last time. + set data(selection) $data(-initialcolor) + set data(finalColor) $data(-initialcolor) + set rgb [winfo rgb . $data(selection)] + + set data(red,intensity) [expr {[lindex $rgb 0]/0x100}] + set data(green,intensity) [expr {[lindex $rgb 1]/0x100}] + set data(blue,intensity) [expr {[lindex $rgb 2]/0x100}] +} + +# ::tk::dialog::color::Config -- +# +# Parses the command line arguments to tk_chooseColor +# +proc ::tk::dialog::color::Config {dataName argList} { + variable ::tk::Priv + upvar ::tk::dialog::color::$dataName data + + # 1: the configuration specs + # + if {[info exists Priv(selectColor)] && $Priv(selectColor) ne ""} { + set defaultColor $Priv(selectColor) + } else { + set defaultColor [. cget -background] + } + + set specs [list \ + [list -initialcolor "" "" $defaultColor] \ + [list -parent "" "" "."] \ + [list -title "" "" [mc "Color"]] \ + ] + + # 2: parse the arguments + # + tclParseConfigSpec ::tk::dialog::color::$dataName $specs "" $argList + + if {$data(-title) eq ""} { + set data(-title) " " + } + if {[catch {winfo rgb . $data(-initialcolor)} err]} { + return -code error -errorcode [list TK LOOKUP COLOR $data(-initialcolor)] \ + $err + } + + if {![winfo exists $data(-parent)]} { + return -code error -errorcode [list TK LOOKUP WINDOW $data(-parent)] \ + "bad window path name \"$data(-parent)\"" + } +} + +# ::tk::dialog::color::BuildDialog -- +# +# Build the dialog. +# +proc ::tk::dialog::color::BuildDialog {w} { + upvar ::tk::dialog::color::[winfo name $w] data + + # TopFrame contains the color strips and the color selection + # + set topFrame [frame $w.top -relief raised -bd 1] + + # StripsFrame contains the colorstrips and the individual RGB entries + set stripsFrame [frame $topFrame.colorStrip] + + set maxWidth [::tk::mcmaxamp &Red &Green &Blue] + set maxWidth [expr {$maxWidth<6 ? 6 : $maxWidth}] + set colorList { + red "&Red" + green "&Green" + blue "&Blue" + } + foreach {color l} $colorList { + # each f frame contains an [R|G|B] entry and the equiv. color strip. + set f [frame $stripsFrame.$color] + + # The box frame contains the label and entry widget for an [R|G|B] + set box [frame $f.box] + + ::tk::AmpWidget label $box.label -text "[mc $l]:" \ + -width $maxWidth -anchor ne + bind $box.label <> [list focus $box.entry] + + entry $box.entry -textvariable \ + ::tk::dialog::color::[winfo name $w]($color,intensity) \ + -width 4 + pack $box.label -side left -fill y -padx 2 -pady 3 + pack $box.entry -side left -anchor n -pady 0 + pack $box -side left -fill both + + set height [expr { + [winfo reqheight $box.entry] - + 2*([$box.entry cget -highlightthickness] + [$box.entry cget -bd]) + }] + + canvas $f.color -height $height \ + -width $data(BARS_WIDTH) -relief sunken -bd 2 + canvas $f.sel -height $data(PLGN_HEIGHT) \ + -width $data(canvasWidth) -highlightthickness 0 + pack $f.color -expand yes -fill both + pack $f.sel -expand yes -fill both + + pack $f -side top -fill x -padx 0 -pady 2 + + set data($color,entry) $box.entry + set data($color,col) $f.color + set data($color,sel) $f.sel + + bind $data($color,col) \ + [list tk::dialog::color::DrawColorScale $w $color 1] + bind $data($color,col) \ + [list tk::dialog::color::EnterColorBar $w $color] + bind $data($color,col) \ + [list tk::dialog::color::LeaveColorBar $w $color] + + bind $data($color,sel) \ + [list tk::dialog::color::EnterColorBar $w $color] + bind $data($color,sel) \ + [list tk::dialog::color::LeaveColorBar $w $color] + + bind $box.entry [list tk::dialog::color::HandleRGBEntry $w] + } + + pack $stripsFrame -side left -fill both -padx 4 -pady 10 + + # The selFrame contains a frame that demonstrates the currently + # selected color + # + set selFrame [frame $topFrame.sel] + set lab [::tk::AmpWidget label $selFrame.lab \ + -text [mc "&Selection:"] -anchor sw] + set ent [entry $selFrame.ent \ + -textvariable ::tk::dialog::color::[winfo name $w](selection) \ + -width 16] + set f1 [frame $selFrame.f1 -relief sunken -bd 2] + set data(finalCanvas) [frame $f1.demo -bd 0 -width 100 -height 70] + + pack $lab $ent -side top -fill x -padx 4 -pady 2 + pack $f1 -expand yes -anchor nw -fill both -padx 6 -pady 10 + pack $data(finalCanvas) -expand yes -fill both + + bind $ent [list tk::dialog::color::HandleSelEntry $w] + + pack $selFrame -side left -fill none -anchor nw + pack $topFrame -side top -expand yes -fill both -anchor nw + + # the botFrame frame contains the buttons + # + set botFrame [frame $w.bot -relief raised -bd 1] + + ::tk::AmpWidget button $botFrame.ok -text [mc "&OK"] \ + -command [list tk::dialog::color::OkCmd $w] + ::tk::AmpWidget button $botFrame.cancel -text [mc "&Cancel"] \ + -command [list tk::dialog::color::CancelCmd $w] + + set data(okBtn) $botFrame.ok + set data(cancelBtn) $botFrame.cancel + + grid x $botFrame.ok x $botFrame.cancel x -sticky ew + grid configure $botFrame.ok $botFrame.cancel -padx 10 -pady 10 + grid columnconfigure $botFrame {0 4} -weight 1 -uniform space + grid columnconfigure $botFrame {1 3} -weight 1 -uniform button + grid columnconfigure $botFrame 2 -weight 2 -uniform space + pack $botFrame -side bottom -fill x + + # Accelerator bindings + bind $lab <> [list focus $ent] + bind $w [list tk::ButtonInvoke $data(cancelBtn)] + bind $w [list tk::AltKeyInDialog $w %A] + + wm protocol $w WM_DELETE_WINDOW [list tk::dialog::color::CancelCmd $w] + bind $lab [list tk::dialog::color::CancelCmd $w] +} + +# ::tk::dialog::color::SetRGBValue -- +# +# Sets the current selection of the dialog box +# +proc ::tk::dialog::color::SetRGBValue {w color} { + upvar ::tk::dialog::color::[winfo name $w] data + + set data(red,intensity) [lindex $color 0] + set data(green,intensity) [lindex $color 1] + set data(blue,intensity) [lindex $color 2] + + RedrawColorBars $w all + + # Now compute the new x value of each colorbars pointer polygon + foreach color {red green blue} { + set x [RgbToX $w $data($color,intensity)] + MoveSelector $w $data($color,sel) $color $x 0 + } +} + +# ::tk::dialog::color::XToRgb -- +# +# Converts a screen coordinate to intensity +# +proc ::tk::dialog::color::XToRgb {w x} { + upvar ::tk::dialog::color::[winfo name $w] data + + set x [expr {($x * $data(intensityIncr))/ $data(colorbarWidth)}] + if {$x > 255} { + set x 255 + } + return $x +} + +# ::tk::dialog::color::RgbToX +# +# Converts an intensity to screen coordinate. +# +proc ::tk::dialog::color::RgbToX {w color} { + upvar ::tk::dialog::color::[winfo name $w] data + + return [expr {($color * $data(colorbarWidth)/ $data(intensityIncr))}] +} + +# ::tk::dialog::color::DrawColorScale -- +# +# Draw color scale is called whenever the size of one of the color +# scale canvases is changed. +# +proc ::tk::dialog::color::DrawColorScale {w c {create 0}} { + upvar ::tk::dialog::color::[winfo name $w] data + + # col: color bar canvas + # sel: selector canvas + set col $data($c,col) + set sel $data($c,sel) + + # First handle the case that we are creating everything for the first time. + if {$create} { + # First remove all the lines that already exist. + if { $data(lines,$c,last) > $data(lines,$c,start)} { + for {set i $data(lines,$c,start)} \ + {$i <= $data(lines,$c,last)} {incr i} { + $sel delete $i + } + } + # Delete the selector if it exists + if {[info exists data($c,index)]} { + $sel delete $data($c,index) + } + + # Draw the selection polygons + CreateSelector $w $sel $c + $sel bind $data($c,index) \ + [list tk::dialog::color::StartMove $w $sel $c %x $data(selPad) 1] + $sel bind $data($c,index) \ + [list tk::dialog::color::MoveSelector $w $sel $c %x $data(selPad)] + $sel bind $data($c,index) \ + [list tk::dialog::color::ReleaseMouse $w $sel $c %x $data(selPad)] + + set height [winfo height $col] + # Create an invisible region under the colorstrip to catch mouse clicks + # that aren't on the selector. + set data($c,clickRegion) [$sel create rectangle 0 0 \ + $data(canvasWidth) $height -fill {} -outline {}] + + bind $col \ + [list tk::dialog::color::StartMove $w $sel $c %x $data(colorPad)] + bind $col \ + [list tk::dialog::color::MoveSelector $w $sel $c %x $data(colorPad)] + bind $col \ + [list tk::dialog::color::ReleaseMouse $w $sel $c %x $data(colorPad)] + + $sel bind $data($c,clickRegion) \ + [list tk::dialog::color::StartMove $w $sel $c %x $data(selPad)] + $sel bind $data($c,clickRegion) \ + [list tk::dialog::color::MoveSelector $w $sel $c %x $data(selPad)] + $sel bind $data($c,clickRegion) \ + [list tk::dialog::color::ReleaseMouse $w $sel $c %x $data(selPad)] + } else { + # l is the canvas index of the first colorbar. + set l $data(lines,$c,start) + } + + # Draw the color bars. + set highlightW [expr {[$col cget -highlightthickness] + [$col cget -bd]}] + for {set i 0} { $i < $data(NUM_COLORBARS)} { incr i} { + set intensity [expr {$i * $data(intensityIncr)}] + set startx [expr {$i * $data(colorbarWidth) + $highlightW}] + if {$c eq "red"} { + set color [format "#%02x%02x%02x" \ + $intensity $data(green,intensity) $data(blue,intensity)] + } elseif {$c eq "green"} { + set color [format "#%02x%02x%02x" \ + $data(red,intensity) $intensity $data(blue,intensity)] + } else { + set color [format "#%02x%02x%02x" \ + $data(red,intensity) $data(green,intensity) $intensity] + } + + if {$create} { + set index [$col create rect $startx $highlightW \ + [expr {$startx +$data(colorbarWidth)}] \ + [expr {[winfo height $col] + $highlightW}] \ + -fill $color -outline $color] + } else { + $col itemconfigure $l -fill $color -outline $color + incr l + } + } + $sel raise $data($c,index) + + if {$create} { + set data(lines,$c,last) $index + set data(lines,$c,start) [expr {$index - $data(NUM_COLORBARS) + 1}] + } + + RedrawFinalColor $w +} + +# ::tk::dialog::color::CreateSelector -- +# +# Creates and draws the selector polygon at the position +# $data($c,intensity). +# +proc ::tk::dialog::color::CreateSelector {w sel c } { + upvar ::tk::dialog::color::[winfo name $w] data + set data($c,index) [$sel create polygon \ + 0 $data(PLGN_HEIGHT) \ + $data(PLGN_WIDTH) $data(PLGN_HEIGHT) \ + $data(indent) 0] + set data($c,x) [RgbToX $w $data($c,intensity)] + $sel move $data($c,index) $data($c,x) 0 +} + +# ::tk::dialog::color::RedrawFinalColor +# +# Combines the intensities of the three colors into the final color +# +proc ::tk::dialog::color::RedrawFinalColor {w} { + upvar ::tk::dialog::color::[winfo name $w] data + + set color [format "#%02x%02x%02x" $data(red,intensity) \ + $data(green,intensity) $data(blue,intensity)] + + $data(finalCanvas) configure -bg $color + set data(finalColor) $color + set data(selection) $color + set data(finalRGB) [list \ + $data(red,intensity) \ + $data(green,intensity) \ + $data(blue,intensity)] +} + +# ::tk::dialog::color::RedrawColorBars -- +# +# Only redraws the colors on the color strips that were not manipulated. +# Params: color of colorstrip that changed. If color is not [red|green|blue] +# Then all colorstrips will be updated +# +proc ::tk::dialog::color::RedrawColorBars {w colorChanged} { + upvar ::tk::dialog::color::[winfo name $w] data + + switch $colorChanged { + red { + DrawColorScale $w green + DrawColorScale $w blue + } + green { + DrawColorScale $w red + DrawColorScale $w blue + } + blue { + DrawColorScale $w red + DrawColorScale $w green + } + default { + DrawColorScale $w red + DrawColorScale $w green + DrawColorScale $w blue + } + } + RedrawFinalColor $w +} + +#---------------------------------------------------------------------- +# Event handlers +#---------------------------------------------------------------------- + +# ::tk::dialog::color::StartMove -- +# +# Handles a mousedown button event over the selector polygon. +# Adds the bindings for moving the mouse while the button is +# pressed. Sets the binding for the button-release event. +# +# Params: sel is the selector canvas window, color is the color of the strip. +# +proc ::tk::dialog::color::StartMove {w sel color x delta {dontMove 0}} { + upvar ::tk::dialog::color::[winfo name $w] data + + if {!$dontMove} { + MoveSelector $w $sel $color $x $delta + } +} + +# ::tk::dialog::color::MoveSelector -- +# +# Moves the polygon selector so that its middle point has the same +# x value as the specified x. If x is outside the bounds [0,255], +# the selector is set to the closest endpoint. +# +# Params: sel is the selector canvas, c is [red|green|blue] +# x is a x-coordinate. +# +proc ::tk::dialog::color::MoveSelector {w sel color x delta} { + upvar ::tk::dialog::color::[winfo name $w] data + + incr x -$delta + + if { $x < 0 } { + set x 0 + } elseif { $x > $data(BARS_WIDTH)} { + set x $data(BARS_WIDTH) + } + set diff [expr {$x - $data($color,x)}] + $sel move $data($color,index) $diff 0 + set data($color,x) [expr {$data($color,x) + $diff}] + + # Return the x value that it was actually set at + return $x +} + +# ::tk::dialog::color::ReleaseMouse +# +# Removes mouse tracking bindings, updates the colorbars. +# +# Params: sel is the selector canvas, color is the color of the strip, +# x is the x-coord of the mouse. +# +proc ::tk::dialog::color::ReleaseMouse {w sel color x delta} { + upvar ::tk::dialog::color::[winfo name $w] data + + set x [MoveSelector $w $sel $color $x $delta] + + # Determine exactly what color we are looking at. + set data($color,intensity) [XToRgb $w $x] + + RedrawColorBars $w $color +} + +# ::tk::dialog::color::ResizeColorbars -- +# +# Completely redraws the colorbars, including resizing the +# colorstrips +# +proc ::tk::dialog::color::ResizeColorBars {w} { + upvar ::tk::dialog::color::[winfo name $w] data + + if { + ($data(BARS_WIDTH) < $data(NUM_COLORBARS)) || + (($data(BARS_WIDTH) % $data(NUM_COLORBARS)) != 0) + } then { + set data(BARS_WIDTH) $data(NUM_COLORBARS) + } + InitValues [winfo name $w] + foreach color {red green blue} { + $data($color,col) configure -width $data(canvasWidth) + DrawColorScale $w $color 1 + } +} + +# ::tk::dialog::color::HandleSelEntry -- +# +# Handles the return keypress event in the "Selection:" entry +# +proc ::tk::dialog::color::HandleSelEntry {w} { + upvar ::tk::dialog::color::[winfo name $w] data + + set text [string trim $data(selection)] + # Check to make sure that the color is valid + if {[catch {set color [winfo rgb . $text]} ]} { + set data(selection) $data(finalColor) + return + } + + set R [expr {[lindex $color 0]/0x100}] + set G [expr {[lindex $color 1]/0x100}] + set B [expr {[lindex $color 2]/0x100}] + + SetRGBValue $w "$R $G $B" + set data(selection) $text +} + +# ::tk::dialog::color::HandleRGBEntry -- +# +# Handles the return keypress event in the R, G or B entry +# +proc ::tk::dialog::color::HandleRGBEntry {w} { + upvar ::tk::dialog::color::[winfo name $w] data + + foreach c {red green blue} { + if {[catch { + set data($c,intensity) [expr {int($data($c,intensity))}] + }]} { + set data($c,intensity) 0 + } + + if {$data($c,intensity) < 0} { + set data($c,intensity) 0 + } + if {$data($c,intensity) > 255} { + set data($c,intensity) 255 + } + } + + SetRGBValue $w "$data(red,intensity) \ + $data(green,intensity) $data(blue,intensity)" +} + +# mouse cursor enters a color bar +# +proc ::tk::dialog::color::EnterColorBar {w color} { + upvar ::tk::dialog::color::[winfo name $w] data + + $data($color,sel) itemconfigure $data($color,index) -fill red +} + +# mouse leaves enters a color bar +# +proc ::tk::dialog::color::LeaveColorBar {w color} { + upvar ::tk::dialog::color::[winfo name $w] data + + $data($color,sel) itemconfigure $data($color,index) -fill black +} + +# user hits OK button +# +proc ::tk::dialog::color::OkCmd {w} { + variable ::tk::Priv + upvar ::tk::dialog::color::[winfo name $w] data + + set Priv(selectColor) $data(finalColor) +} + +# user hits Cancel button or destroys window +# +proc ::tk::dialog::color::CancelCmd {w} { + variable ::tk::Priv + set Priv(selectColor) "" +} diff --git a/env/tcl/tk8.6/comdlg.tcl b/env/tcl/tk8.6/comdlg.tcl new file mode 100644 index 0000000..18df8a6 --- /dev/null +++ b/env/tcl/tk8.6/comdlg.tcl @@ -0,0 +1,319 @@ +# comdlg.tcl -- +# +# Some functions needed for the common dialog boxes. Probably need to go +# in a different file. +# +# Copyright (c) 1996 Sun Microsystems, Inc. +# +# See the file "license.terms" for information on usage and redistribution +# of this file, and for a DISCLAIMER OF ALL WARRANTIES. +# + +# tclParseConfigSpec -- +# +# Parses a list of "-option value" pairs. If all options and +# values are legal, the values are stored in +# $data($option). Otherwise an error message is returned. When +# an error happens, the data() array may have been partially +# modified, but all the modified members of the data(0 array are +# guaranteed to have valid values. This is different than +# Tk_ConfigureWidget() which does not modify the value of a +# widget record if any error occurs. +# +# Arguments: +# +# w = widget record to modify. Must be the pathname of a widget. +# +# specs = { +# {-commandlineswitch resourceName ResourceClass defaultValue verifier} +# {....} +# } +# +# flags = currently unused. +# +# argList = The list of "-option value" pairs. +# +proc tclParseConfigSpec {w specs flags argList} { + upvar #0 $w data + + # 1: Put the specs in associative arrays for faster access + # + foreach spec $specs { + if {[llength $spec] < 4} { + return -code error -errorcode {TK VALUE CONFIG_SPEC} \ + "\"spec\" should contain 5 or 4 elements" + } + set cmdsw [lindex $spec 0] + set cmd($cmdsw) "" + set rname($cmdsw) [lindex $spec 1] + set rclass($cmdsw) [lindex $spec 2] + set def($cmdsw) [lindex $spec 3] + set verproc($cmdsw) [lindex $spec 4] + } + + if {[llength $argList] & 1} { + set cmdsw [lindex $argList end] + if {![info exists cmd($cmdsw)]} { + return -code error -errorcode [list TK LOOKUP OPTION $cmdsw] \ + "bad option \"$cmdsw\": must be [tclListValidFlags cmd]" + } + return -code error -errorcode {TK VALUE_MISSING} \ + "value for \"$cmdsw\" missing" + } + + # 2: set the default values + # + foreach cmdsw [array names cmd] { + set data($cmdsw) $def($cmdsw) + } + + # 3: parse the argument list + # + foreach {cmdsw value} $argList { + if {![info exists cmd($cmdsw)]} { + return -code error -errorcode [list TK LOOKUP OPTION $cmdsw] \ + "bad option \"$cmdsw\": must be [tclListValidFlags cmd]" + } + set data($cmdsw) $value + } + + # Done! +} + +proc tclListValidFlags {v} { + upvar $v cmd + + set len [llength [array names cmd]] + set i 1 + set separator "" + set errormsg "" + foreach cmdsw [lsort [array names cmd]] { + append errormsg "$separator$cmdsw" + incr i + if {$i == $len} { + set separator ", or " + } else { + set separator ", " + } + } + return $errormsg +} + +#---------------------------------------------------------------------- +# +# Focus Group +# +# Focus groups are used to handle the user's focusing actions inside a +# toplevel. +# +# One example of using focus groups is: when the user focuses on an +# entry, the text in the entry is highlighted and the cursor is put to +# the end of the text. When the user changes focus to another widget, +# the text in the previously focused entry is validated. +# +#---------------------------------------------------------------------- + + +# ::tk::FocusGroup_Create -- +# +# Create a focus group. All the widgets in a focus group must be +# within the same focus toplevel. Each toplevel can have only +# one focus group, which is identified by the name of the +# toplevel widget. +# +proc ::tk::FocusGroup_Create {t} { + variable ::tk::Priv + if {[winfo toplevel $t] ne $t} { + return -code error -errorcode [list TK LOOKUP TOPLEVEL $t] \ + "$t is not a toplevel window" + } + if {![info exists Priv(fg,$t)]} { + set Priv(fg,$t) 1 + set Priv(focus,$t) "" + bind $t [list tk::FocusGroup_In $t %W %d] + bind $t [list tk::FocusGroup_Out $t %W %d] + bind $t [list tk::FocusGroup_Destroy $t %W] + } +} + +# ::tk::FocusGroup_BindIn -- +# +# Add a widget into the "FocusIn" list of the focus group. The $cmd will be +# called when the widget is focused on by the user. +# +proc ::tk::FocusGroup_BindIn {t w cmd} { + variable FocusIn + variable ::tk::Priv + if {![info exists Priv(fg,$t)]} { + return -code error -errorcode [list TK LOOKUP FOCUS_GROUP $t] \ + "focus group \"$t\" doesn't exist" + } + set FocusIn($t,$w) $cmd +} + + +# ::tk::FocusGroup_BindOut -- +# +# Add a widget into the "FocusOut" list of the focus group. The +# $cmd will be called when the widget loses the focus (User +# types Tab or click on another widget). +# +proc ::tk::FocusGroup_BindOut {t w cmd} { + variable FocusOut + variable ::tk::Priv + if {![info exists Priv(fg,$t)]} { + return -code error -errorcode [list TK LOOKUP FOCUS_GROUP $t] \ + "focus group \"$t\" doesn't exist" + } + set FocusOut($t,$w) $cmd +} + +# ::tk::FocusGroup_Destroy -- +# +# Cleans up when members of the focus group is deleted, or when the +# toplevel itself gets deleted. +# +proc ::tk::FocusGroup_Destroy {t w} { + variable FocusIn + variable FocusOut + variable ::tk::Priv + + if {$t eq $w} { + unset Priv(fg,$t) + unset Priv(focus,$t) + + foreach name [array names FocusIn $t,*] { + unset FocusIn($name) + } + foreach name [array names FocusOut $t,*] { + unset FocusOut($name) + } + } else { + if {[info exists Priv(focus,$t)] && ($Priv(focus,$t) eq $w)} { + set Priv(focus,$t) "" + } + unset -nocomplain FocusIn($t,$w) FocusOut($t,$w) + } +} + +# ::tk::FocusGroup_In -- +# +# Handles the event. Calls the FocusIn command for the newly +# focused widget in the focus group. +# +proc ::tk::FocusGroup_In {t w detail} { + variable FocusIn + variable ::tk::Priv + + if {$detail ne "NotifyNonlinear" && $detail ne "NotifyNonlinearVirtual"} { + # This is caused by mouse moving out&in of the window *or* + # ordinary keypresses some window managers (ie: CDE [Bug: 2960]). + return + } + if {![info exists FocusIn($t,$w)]} { + set FocusIn($t,$w) "" + return + } + if {![info exists Priv(focus,$t)]} { + return + } + if {$Priv(focus,$t) eq $w} { + # This is already in focus + # + return + } else { + set Priv(focus,$t) $w + eval $FocusIn($t,$w) + } +} + +# ::tk::FocusGroup_Out -- +# +# Handles the event. Checks if this is really a lose +# focus event, not one generated by the mouse moving out of the +# toplevel window. Calls the FocusOut command for the widget +# who loses its focus. +# +proc ::tk::FocusGroup_Out {t w detail} { + variable FocusOut + variable ::tk::Priv + + if {$detail ne "NotifyNonlinear" && $detail ne "NotifyNonlinearVirtual"} { + # This is caused by mouse moving out of the window + return + } + if {![info exists Priv(focus,$t)]} { + return + } + if {![info exists FocusOut($t,$w)]} { + return + } else { + eval $FocusOut($t,$w) + set Priv(focus,$t) "" + } +} + +# ::tk::FDGetFileTypes -- +# +# Process the string given by the -filetypes option of the file +# dialogs. Similar to the C function TkGetFileFilters() on the Mac +# and Windows platform. +# +proc ::tk::FDGetFileTypes {string} { + foreach t $string { + if {[llength $t] < 2 || [llength $t] > 3} { + return -code error -errorcode {TK VALUE FILE_TYPE} \ + "bad file type \"$t\", should be \"typeName {extension ?extensions ...?} ?{macType ?macTypes ...?}?\"" + } + lappend fileTypes([lindex $t 0]) {*}[lindex $t 1] + } + + set types {} + foreach t $string { + set label [lindex $t 0] + set exts {} + + if {[info exists hasDoneType($label)]} { + continue + } + + # Validate each macType. This is to agree with the + # behaviour of TkGetFileFilters(). This list may be + # empty. + foreach macType [lindex $t 2] { + if {[string length $macType] != 4} { + return -code error -errorcode {TK VALUE MAC_TYPE} \ + "bad Macintosh file type \"$macType\"" + } + } + + set name "$label \(" + set sep "" + set doAppend 1 + foreach ext $fileTypes($label) { + if {$ext eq ""} { + continue + } + regsub {^[.]} $ext "*." ext + if {![info exists hasGotExt($label,$ext)]} { + if {$doAppend} { + if {[string length $sep] && [string length $name]>40} { + set doAppend 0 + append name $sep... + } else { + append name $sep$ext + } + } + lappend exts $ext + set hasGotExt($label,$ext) 1 + } + set sep "," + } + append name "\)" + lappend types [list $name $exts] + + set hasDoneType($label) 1 + } + + return $types +} diff --git a/env/tcl/tk8.6/console.tcl b/env/tcl/tk8.6/console.tcl new file mode 100644 index 0000000..355a43b --- /dev/null +++ b/env/tcl/tk8.6/console.tcl @@ -0,0 +1,1150 @@ +# console.tcl -- +# +# This code constructs the console window for an application. It +# can be used by non-unix systems that do not have built-in support +# for shells. +# +# Copyright (c) 1995-1997 Sun Microsystems, Inc. +# Copyright (c) 1998-2000 Ajuba Solutions. +# Copyright (c) 2007-2008 Daniel A. Steffen +# +# See the file "license.terms" for information on usage and redistribution +# of this file, and for a DISCLAIMER OF ALL WARRANTIES. +# + +# TODO: history - remember partially written command + +namespace eval ::tk::console { + variable blinkTime 500 ; # msecs to blink braced range for + variable blinkRange 1 ; # enable blinking of the entire braced range + variable magicKeys 1 ; # enable brace matching and proc/var recognition + variable maxLines 600 ; # maximum # of lines buffered in console + variable showMatches 1 ; # show multiple expand matches + variable useFontchooser [llength [info command ::tk::fontchooser]] + variable inPlugin [info exists embed_args] + variable defaultPrompt ; # default prompt if tcl_prompt1 isn't used + + if {$inPlugin} { + set defaultPrompt {subst {[history nextid] % }} + } else { + set defaultPrompt {subst {([file tail [pwd]]) [history nextid] % }} + } +} + +# simple compat function for tkcon code added for this console +interp alias {} EvalAttached {} consoleinterp eval + +# ::tk::ConsoleInit -- +# This procedure constructs and configures the console windows. +# +# Arguments: +# None. + +proc ::tk::ConsoleInit {} { + if {![consoleinterp eval {set tcl_interactive}]} { + wm withdraw . + } + + if {[tk windowingsystem] eq "aqua"} { + set mod "Cmd" + } else { + set mod "Ctrl" + } + + if {[catch {menu .menubar} err]} { + bgerror "INIT: $err" + } + AmpMenuArgs .menubar add cascade -label [mc &File] -menu .menubar.file + AmpMenuArgs .menubar add cascade -label [mc &Edit] -menu .menubar.edit + + menu .menubar.file -tearoff 0 + AmpMenuArgs .menubar.file add command -label [mc "&Source..."] \ + -command {tk::ConsoleSource} + AmpMenuArgs .menubar.file add command -label [mc "&Hide Console"] \ + -command {wm withdraw .} + AmpMenuArgs .menubar.file add command -label [mc "&Clear Console"] \ + -command {.console delete 1.0 "promptEnd linestart"} + if {[tk windowingsystem] ne "aqua"} { + AmpMenuArgs .menubar.file add command -label [mc E&xit] -command {exit} + } + + menu .menubar.edit -tearoff 0 + AmpMenuArgs .menubar.edit add command -label [mc Cu&t] -accel "$mod+X"\ + -command {event generate .console <>} + AmpMenuArgs .menubar.edit add command -label [mc &Copy] -accel "$mod+C"\ + -command {event generate .console <>} + AmpMenuArgs .menubar.edit add command -label [mc P&aste] -accel "$mod+V"\ + -command {event generate .console <>} + + if {[tk windowingsystem] ne "win32"} { + AmpMenuArgs .menubar.edit add command -label [mc Cl&ear] \ + -command {event generate .console <>} + } else { + AmpMenuArgs .menubar.edit add command -label [mc &Delete] \ + -command {event generate .console <>} -accel "Del" + + AmpMenuArgs .menubar add cascade -label [mc &Help] -menu .menubar.help + menu .menubar.help -tearoff 0 + AmpMenuArgs .menubar.help add command -label [mc &About...] \ + -command tk::ConsoleAbout + } + + AmpMenuArgs .menubar.edit add separator + if {$::tk::console::useFontchooser} { + if {[tk windowingsystem] eq "aqua"} { + .menubar.edit add command -label tk_choose_font_marker + set index [.menubar.edit index tk_choose_font_marker] + .menubar.edit entryconfigure $index \ + -label [mc "Show Fonts"]\ + -accelerator "$mod-T"\ + -command [list ::tk::console::FontchooserToggle] + bind Console <> \ + [list ::tk::console::FontchooserVisibility $index] + ::tk::console::FontchooserVisibility $index + } else { + AmpMenuArgs .menubar.edit add command -label [mc "&Font..."] \ + -command [list ::tk::console::FontchooserToggle] + } + bind Console [list ::tk::console::FontchooserFocus %W 1] + bind Console [list ::tk::console::FontchooserFocus %W 0] + } + AmpMenuArgs .menubar.edit add command -label [mc "&Increase Font Size"] \ + -accel "$mod++" -command {event generate .console <>} + AmpMenuArgs .menubar.edit add command -label [mc "&Decrease Font Size"] \ + -accel "$mod+-" -command {event generate .console <>} + AmpMenuArgs .menubar.edit add command -label [mc "Fit To Screen Width"] \ + -command {event generate .console <>} + + if {[tk windowingsystem] eq "aqua"} { + .menubar add cascade -label [mc Window] -menu [menu .menubar.window] + .menubar add cascade -label [mc Help] -menu [menu .menubar.help] + } + + . configure -menu .menubar + + # See if we can find a better font than the TkFixedFont + catch {font create TkConsoleFont {*}[font configure TkFixedFont]} + set families [font families] + switch -exact -- [tk windowingsystem] { + aqua { set preferred {Monaco 10} } + win32 { set preferred {ProFontWindows 8 Consolas 8} } + default { set preferred {} } + } + foreach {family size} $preferred { + if {[lsearch -exact $families $family] != -1} { + font configure TkConsoleFont -family $family -size $size + break + } + } + + # Provide the right border for the text widget (platform dependent). + ::ttk::style layout ConsoleFrame { + Entry.field -sticky news -border 1 -children { + ConsoleFrame.padding -sticky news + } + } + ::ttk::frame .consoleframe -style ConsoleFrame + + set con [text .console -yscrollcommand [list .sb set] -setgrid true \ + -borderwidth 0 -highlightthickness 0 -font TkConsoleFont] + if {[tk windowingsystem] eq "aqua"} { + scrollbar .sb -command [list $con yview] + } else { + ::ttk::scrollbar .sb -command [list $con yview] + } + pack .sb -in .consoleframe -fill both -side right -padx 1 -pady 1 + pack $con -in .consoleframe -fill both -expand 1 -side left -padx 1 -pady 1 + pack .consoleframe -fill both -expand 1 -side left + + ConsoleBind $con + + $con tag configure stderr -foreground red + $con tag configure stdin -foreground blue + $con tag configure prompt -foreground \#8F4433 + $con tag configure proc -foreground \#008800 + $con tag configure var -background \#FFC0D0 + $con tag raise sel + $con tag configure blink -background \#FFFF00 + $con tag configure find -background \#FFFF00 + + focus $con + + # Avoid listing this console in [winfo interps] + if {[info command ::send] eq "::send"} {rename ::send {}} + + wm protocol . WM_DELETE_WINDOW { wm withdraw . } + wm title . [mc "Console"] + flush stdout + $con mark set output [$con index "end - 1 char"] + tk::TextSetCursor $con end + $con mark set promptEnd insert + $con mark gravity promptEnd left + + # A variant of ConsolePrompt to avoid a 'puts' call + set w $con + set temp [$w index "end - 1 char"] + $w mark set output end + if {![consoleinterp eval "info exists tcl_prompt1"]} { + set string [EvalAttached $::tk::console::defaultPrompt] + $w insert output $string stdout + } + $w mark set output $temp + ::tk::TextSetCursor $w end + $w mark set promptEnd insert + $w mark gravity promptEnd left + + if {[tk windowingsystem] ne "aqua"} { + # Subtle work-around to erase the '% ' that tclMain.c prints out + after idle [subst -nocommand { + if {[$con get 1.0 output] eq "% "} { $con delete 1.0 output } + }] + } +} + +# ::tk::ConsoleSource -- +# +# Prompts the user for a file to source in the main interpreter. +# +# Arguments: +# None. + +proc ::tk::ConsoleSource {} { + set filename [tk_getOpenFile -defaultextension .tcl -parent . \ + -title [mc "Select a file to source"] \ + -filetypes [list \ + [list [mc "Tcl Scripts"] .tcl] \ + [list [mc "All Files"] *]]] + if {$filename ne ""} { + set cmd [list source $filename] + if {[catch {consoleinterp eval $cmd} result]} { + ConsoleOutput stderr "$result\n" + } + } +} + +# ::tk::ConsoleInvoke -- +# Processes the command line input. If the command is complete it +# is evaled in the main interpreter. Otherwise, the continuation +# prompt is added and more input may be added. +# +# Arguments: +# None. + +proc ::tk::ConsoleInvoke {args} { + set ranges [.console tag ranges input] + set cmd "" + if {[llength $ranges]} { + set pos 0 + while {[lindex $ranges $pos] ne ""} { + set start [lindex $ranges $pos] + set end [lindex $ranges [incr pos]] + append cmd [.console get $start $end] + incr pos + } + } + if {$cmd eq ""} { + ConsolePrompt + } elseif {[info complete $cmd]} { + .console mark set output end + .console tag delete input + set result [consoleinterp record $cmd] + if {$result ne ""} { + puts $result + } + ConsoleHistory reset + ConsolePrompt + } else { + ConsolePrompt partial + } + .console yview -pickplace insert +} + +# ::tk::ConsoleHistory -- +# This procedure implements command line history for the +# console. In general is evals the history command in the +# main interpreter to obtain the history. The variable +# ::tk::HistNum is used to store the current location in the history. +# +# Arguments: +# cmd - Which action to take: prev, next, reset. + +set ::tk::HistNum 1 +proc ::tk::ConsoleHistory {cmd} { + variable HistNum + + switch $cmd { + prev { + incr HistNum -1 + if {$HistNum == 0} { + set cmd {history event [expr {[history nextid] -1}]} + } else { + set cmd "history event $HistNum" + } + if {[catch {consoleinterp eval $cmd} cmd]} { + incr HistNum + return + } + .console delete promptEnd end + .console insert promptEnd $cmd {input stdin} + .console see end + } + next { + incr HistNum + if {$HistNum == 0} { + set cmd {history event [expr {[history nextid] -1}]} + } elseif {$HistNum > 0} { + set cmd "" + set HistNum 1 + } else { + set cmd "history event $HistNum" + } + if {$cmd ne ""} { + catch {consoleinterp eval $cmd} cmd + } + .console delete promptEnd end + .console insert promptEnd $cmd {input stdin} + .console see end + } + reset { + set HistNum 1 + } + } +} + +# ::tk::ConsolePrompt -- +# This procedure draws the prompt. If tcl_prompt1 or tcl_prompt2 +# exists in the main interpreter it will be called to generate the +# prompt. Otherwise, a hard coded default prompt is printed. +# +# Arguments: +# partial - Flag to specify which prompt to print. + +proc ::tk::ConsolePrompt {{partial normal}} { + set w .console + if {$partial eq "normal"} { + set temp [$w index "end - 1 char"] + $w mark set output end + if {[consoleinterp eval "info exists tcl_prompt1"]} { + consoleinterp eval "eval \[set tcl_prompt1\]" + } else { + puts -nonewline [EvalAttached $::tk::console::defaultPrompt] + } + } else { + set temp [$w index output] + $w mark set output end + if {[consoleinterp eval "info exists tcl_prompt2"]} { + consoleinterp eval "eval \[set tcl_prompt2\]" + } else { + puts -nonewline "> " + } + } + flush stdout + $w mark set output $temp + ::tk::TextSetCursor $w end + $w mark set promptEnd insert + $w mark gravity promptEnd left + ::tk::console::ConstrainBuffer $w $::tk::console::maxLines + $w see end +} + +# Copy selected text from the console +proc ::tk::console::Copy {w} { + if {![catch {set data [$w get sel.first sel.last]}]} { + clipboard clear -displayof $w + clipboard append -displayof $w $data + } +} +# Copies selected text. If the selection is within the current active edit +# region then it will be cut, if not it is only copied. +proc ::tk::console::Cut {w} { + if {![catch {set data [$w get sel.first sel.last]}]} { + clipboard clear -displayof $w + clipboard append -displayof $w $data + if {[$w compare sel.first >= output]} { + $w delete sel.first sel.last + } + } +} +# Paste text from the clipboard +proc ::tk::console::Paste {w} { + catch { + set clip [::tk::GetSelection $w CLIPBOARD] + set list [split $clip \n\r] + tk::ConsoleInsert $w [lindex $list 0] + foreach x [lrange $list 1 end] { + $w mark set insert {end - 1c} + tk::ConsoleInsert $w "\n" + tk::ConsoleInvoke + tk::ConsoleInsert $w $x + } + } +} + +# Fit TkConsoleFont to window width +proc ::tk::console::FitScreenWidth {w} { + set width [winfo screenwidth $w] + set cwidth [$w cget -width] + set s -50 + set fit 0 + array set fi [font configure TkConsoleFont] + while {$s < 0} { + set fi(-size) $s + set f [font create {*}[array get fi]] + set c [font measure $f "eM"] + font delete $f + if {$c * $cwidth < 1.667 * $width} { + font configure TkConsoleFont -size $s + break + } + incr s 2 + } +} + +# ::tk::ConsoleBind -- +# This procedure first ensures that the default bindings for the Text +# class have been defined. Then certain bindings are overridden for +# the class. +# +# Arguments: +# None. + +proc ::tk::ConsoleBind {w} { + bindtags $w [list $w Console PostConsole [winfo toplevel $w] all] + + ## Get all Text bindings into Console + foreach ev [bind Text] { + bind Console $ev [bind Text $ev] + } + ## We really didn't want the newline insertion... + bind Console {} + ## ...or any Control-v binding (would block <>) + bind Console {} + + # For the moment, transpose isn't enabled until the console + # gets and overhaul of how it handles input -- hobbs + bind Console {} + + # Ignore all Alt, Meta, and Control keypresses unless explicitly bound. + # Otherwise, if a widget binding for one of these is defined, the + # class binding will also fire and insert the character + # which is wrong. + + bind Console {# nothing } + bind Console {# nothing} + bind Console {# nothing} + + foreach {ev key} { + <> + <> + <> + <> + + <> + <> + <> + <> + <> + <> + <> + <> + <> + + <> + <> + <> + <> + <> + <> + <> + } { + event add $ev $key + bind Console $key {} + } + if {[tk windowingsystem] eq "aqua"} { + foreach {ev key} { + <> + <> + } { + event add $ev $key + bind Console $key {} + } + if {$::tk::console::useFontchooser} { + bind Console [list ::tk::console::FontchooserToggle] + } + } + bind Console <> { + if {[%W compare insert > promptEnd]} { + ::tk::console::Expand %W + } + } + bind Console <> { + if {[%W compare insert > promptEnd]} { + ::tk::console::Expand %W path + } + } + bind Console <> { + if {[%W compare insert > promptEnd]} { + ::tk::console::Expand %W proc + } + } + bind Console <> { + if {[%W compare insert > promptEnd]} { + ::tk::console::Expand %W var + } + } + bind Console <> { + %W mark set insert {end - 1c} + tk::ConsoleInsert %W "\n" + tk::ConsoleInvoke + break + } + bind Console { + if {{} ne [%W tag nextrange sel 1.0 end] \ + && [%W compare sel.first >= promptEnd]} { + %W delete sel.first sel.last + } elseif {[%W compare insert >= promptEnd]} { + %W delete insert + %W see insert + } + } + bind Console { + if {{} ne [%W tag nextrange sel 1.0 end] \ + && [%W compare sel.first >= promptEnd]} { + %W delete sel.first sel.last + } elseif {[%W compare insert != 1.0] && \ + [%W compare insert > promptEnd]} { + %W delete insert-1c + %W see insert + } + } + bind Console [bind Console ] + + bind Console <> { + if {[%W compare insert < promptEnd]} { + tk::TextSetCursor %W {insert linestart} + } else { + tk::TextSetCursor %W promptEnd + } + } + bind Console <> { + tk::TextSetCursor %W {insert lineend} + } + bind Console { + if {[%W compare insert < promptEnd]} { + break + } + %W delete insert + } + bind Console <> { + if {[%W compare insert < promptEnd]} { + break + } + if {[%W compare insert == {insert lineend}]} { + %W delete insert + } else { + %W delete insert {insert lineend} + } + } + bind Console <> { + ## Clear console display + %W delete 1.0 "promptEnd linestart" + } + bind Console <> { + ## Clear command line (Unix shell staple) + %W delete promptEnd end + } + bind Console { + if {[%W compare insert >= promptEnd]} { + %W delete insert {insert wordend} + } + } + bind Console { + if {[%W compare {insert -1c wordstart} >= promptEnd]} { + %W delete {insert -1c wordstart} insert + } + } + bind Console { + if {[%W compare insert >= promptEnd]} { + %W delete insert {insert wordend} + } + } + bind Console { + if {[%W compare {insert -1c wordstart} >= promptEnd]} { + %W delete {insert -1c wordstart} insert + } + } + bind Console { + if {[%W compare insert >= promptEnd]} { + %W delete insert {insert wordend} + } + } + bind Console <> { + tk::ConsoleHistory prev + } + bind Console <> { + tk::ConsoleHistory next + } + bind Console { + catch {tk::ConsoleInsert %W [::tk::GetSelection %W PRIMARY]} + } + bind Console { + tk::ConsoleInsert %W %A + } + bind Console { + eval destroy [winfo child .] + source [file join $tk_library console.tcl] + } + if {[tk windowingsystem] eq "aqua"} { + bind Console { + exit + } + } + bind Console <> { ::tk::console::Cut %W } + bind Console <> { ::tk::console::Copy %W } + bind Console <> { ::tk::console::Paste %W } + + bind Console <> { + set size [font configure TkConsoleFont -size] + if {$size < 0} {set sign -1} else {set sign 1} + set size [expr {(abs($size) + 1) * $sign}] + font configure TkConsoleFont -size $size + if {$::tk::console::useFontchooser} { + tk fontchooser configure -font TkConsoleFont + } + } + bind Console <> { + set size [font configure TkConsoleFont -size] + if {abs($size) < 2} { return } + if {$size < 0} {set sign -1} else {set sign 1} + set size [expr {(abs($size) - 1) * $sign}] + font configure TkConsoleFont -size $size + if {$::tk::console::useFontchooser} { + tk fontchooser configure -font TkConsoleFont + } + } + bind Console <> { + ::tk::console::FitScreenWidth %W + } + + ## + ## Bindings for doing special things based on certain keys + ## + bind PostConsole { + if {"\\" ne [%W get insert-2c]} { + ::tk::console::MatchPair %W \( \) promptEnd + } + } + bind PostConsole { + if {"\\" ne [%W get insert-2c]} { + ::tk::console::MatchPair %W \[ \] promptEnd + } + } + bind PostConsole { + if {"\\" ne [%W get insert-2c]} { + ::tk::console::MatchPair %W \{ \} promptEnd + } + } + bind PostConsole { + if {"\\" ne [%W get insert-2c]} { + ::tk::console::MatchQuote %W promptEnd + } + } + + bind PostConsole { + if {"%A" ne ""} { + ::tk::console::TagProc %W + } + } +} + +# ::tk::ConsoleInsert -- +# Insert a string into a text at the point of the insertion cursor. +# If there is a selection in the text, and it covers the point of the +# insertion cursor, then delete the selection before inserting. Insertion +# is restricted to the prompt area. +# +# Arguments: +# w - The text window in which to insert the string +# s - The string to insert (usually just a single character) + +proc ::tk::ConsoleInsert {w s} { + if {$s eq ""} { + return + } + catch { + if {[$w compare sel.first <= insert] \ + && [$w compare sel.last >= insert]} { + $w tag remove sel sel.first promptEnd + $w delete sel.first sel.last + } + } + if {[$w compare insert < promptEnd]} { + $w mark set insert end + } + $w insert insert $s {input stdin} + $w see insert +} + +# ::tk::ConsoleOutput -- +# +# This routine is called directly by ConsolePutsCmd to cause a string +# to be displayed in the console. +# +# Arguments: +# dest - The output tag to be used: either "stderr" or "stdout". +# string - The string to be displayed. + +proc ::tk::ConsoleOutput {dest string} { + set w .console + $w insert output $string $dest + ::tk::console::ConstrainBuffer $w $::tk::console::maxLines + $w see insert +} + +# ::tk::ConsoleExit -- +# +# This routine is called by ConsoleEventProc when the main window of +# the application is destroyed. Don't call exit - that probably already +# happened. Just delete our window. +# +# Arguments: +# None. + +proc ::tk::ConsoleExit {} { + destroy . +} + +# ::tk::ConsoleAbout -- +# +# This routine displays an About box to show Tcl/Tk version info. +# +# Arguments: +# None. + +proc ::tk::ConsoleAbout {} { + tk_messageBox -type ok -message "[mc {Tcl for Windows}] + +Tcl $::tcl_patchLevel +Tk $::tk_patchLevel" +} + +# ::tk::console::Fontchooser* -- +# Let the user select the console font (TIP 324). + +proc ::tk::console::FontchooserToggle {} { + if {[tk fontchooser configure -visible]} { + tk fontchooser hide + } else { + tk fontchooser show + } +} +proc ::tk::console::FontchooserVisibility {index} { + if {[tk fontchooser configure -visible]} { + .menubar.edit entryconfigure $index -label [msgcat::mc "Hide Fonts"] + } else { + .menubar.edit entryconfigure $index -label [msgcat::mc "Show Fonts"] + } +} +proc ::tk::console::FontchooserFocus {w isFocusIn} { + if {$isFocusIn} { + tk fontchooser configure -parent $w -font TkConsoleFont \ + -command [namespace code [list FontchooserApply]] + } else { + tk fontchooser configure -parent $w -font {} -command {} + } +} +proc ::tk::console::FontchooserApply {font args} { + catch {font configure TkConsoleFont {*}[font actual $font]} +} + +# ::tk::console::TagProc -- +# +# Tags a procedure in the console if it's recognized +# This procedure is not perfect. However, making it perfect wastes +# too much CPU time... +# +# Arguments: +# w - console text widget + +proc ::tk::console::TagProc w { + if {!$::tk::console::magicKeys} { + return + } + set exp "\[^\\\\\]\[\[ \t\n\r\;{}\"\$\]" + set i [$w search -backwards -regexp $exp insert-1c promptEnd-1c] + if {$i eq ""} { + set i promptEnd + } else { + append i +2c + } + regsub -all "\[\[\\\\\\?\\*\]" [$w get $i "insert-1c wordend"] {\\\0} c + if {[llength [EvalAttached [list info commands $c]]]} { + $w tag add proc $i "insert-1c wordend" + } else { + $w tag remove proc $i "insert-1c wordend" + } + if {[llength [EvalAttached [list info vars $c]]]} { + $w tag add var $i "insert-1c wordend" + } else { + $w tag remove var $i "insert-1c wordend" + } +} + +# ::tk::console::MatchPair -- +# +# Blinks a matching pair of characters +# c2 is assumed to be at the text index 'insert'. +# This proc is really loopy and took me an hour to figure out given +# all possible combinations with escaping except for escaped \'s. +# It doesn't take into account possible commenting... Oh well. If +# anyone has something better, I'd like to see/use it. This is really +# only efficient for small contexts. +# +# Arguments: +# w - console text widget +# c1 - first char of pair +# c2 - second char of pair +# +# Calls: ::tk::console::Blink + +proc ::tk::console::MatchPair {w c1 c2 {lim 1.0}} { + if {!$::tk::console::magicKeys} { + return + } + if {{} ne [set ix [$w search -back $c1 insert $lim]]} { + while { + [string match {\\} [$w get $ix-1c]] && + [set ix [$w search -back $c1 $ix-1c $lim]] ne {} + } {} + set i1 insert-1c + while {$ix ne {}} { + set i0 $ix + set j 0 + while {[set i0 [$w search $c2 $i0 $i1]] ne {}} { + append i0 +1c + if {[string match {\\} [$w get $i0-2c]]} { + continue + } + incr j + } + if {!$j} { + break + } + set i1 $ix + while {$j && [set ix [$w search -back $c1 $ix $lim]] ne {}} { + if {[string match {\\} [$w get $ix-1c]]} { + continue + } + incr j -1 + } + } + if {[string match {} $ix]} { + set ix [$w index $lim] + } + } else { + set ix [$w index $lim] + } + if {$::tk::console::blinkRange} { + Blink $w $ix [$w index insert] + } else { + Blink $w $ix $ix+1c [$w index insert-1c] [$w index insert] + } +} + +# ::tk::console::MatchQuote -- +# +# Blinks between matching quotes. +# Blinks just the quote if it's unmatched, otherwise blinks quoted string +# The quote to match is assumed to be at the text index 'insert'. +# +# Arguments: +# w - console text widget +# +# Calls: ::tk::console::Blink + +proc ::tk::console::MatchQuote {w {lim 1.0}} { + if {!$::tk::console::magicKeys} { + return + } + set i insert-1c + set j 0 + while {[set i [$w search -back \" $i $lim]] ne {}} { + if {[string match {\\} [$w get $i-1c]]} { + continue + } + if {!$j} { + set i0 $i + } + incr j + } + if {$j&1} { + if {$::tk::console::blinkRange} { + Blink $w $i0 [$w index insert] + } else { + Blink $w $i0 $i0+1c [$w index insert-1c] [$w index insert] + } + } else { + Blink $w [$w index insert-1c] [$w index insert] + } +} + +# ::tk::console::Blink -- +# +# Blinks between n index pairs for a specified duration. +# +# Arguments: +# w - console text widget +# i1 - start index to blink region +# i2 - end index of blink region +# dur - duration in usecs to blink for +# +# Outputs: +# blinks selected characters in $w + +proc ::tk::console::Blink {w args} { + eval [list $w tag add blink] $args + after $::tk::console::blinkTime [list $w] tag remove blink $args +} + +# ::tk::console::ConstrainBuffer -- +# +# This limits the amount of data in the text widget +# Called by Prompt and ConsoleOutput +# +# Arguments: +# w - console text widget +# size - # of lines to constrain to +# +# Outputs: +# may delete data in console widget + +proc ::tk::console::ConstrainBuffer {w size} { + if {[$w index end] > $size} { + $w delete 1.0 [expr {int([$w index end])-$size}].0 + } +} + +# ::tk::console::Expand -- +# +# Arguments: +# ARGS: w - text widget in which to expand str +# type - type of expansion (path / proc / variable) +# +# Calls: ::tk::console::Expand(Pathname|Procname|Variable) +# +# Outputs: The string to match is expanded to the longest possible match. +# If ::tk::console::showMatches is non-zero and the longest match +# equaled the string to expand, then all possible matches are +# output to stdout. Triggers bell if no matches are found. +# +# Returns: number of matches found + +proc ::tk::console::Expand {w {type ""}} { + set exp "\[^\\\\\]\[\[ \t\n\r\\\{\"\\\\\$\]" + set tmp [$w search -backwards -regexp $exp insert-1c promptEnd-1c] + if {$tmp eq ""} { + set tmp promptEnd + } else { + append tmp +2c + } + if {[$w compare $tmp >= insert]} { + return + } + set str [$w get $tmp insert] + switch -glob $type { + path* { + set res [ExpandPathname $str] + } + proc* { + set res [ExpandProcname $str] + } + var* { + set res [ExpandVariable $str] + } + default { + set res {} + foreach t {Pathname Procname Variable} { + if {![catch {Expand$t $str} res] && ($res ne "")} { + break + } + } + } + } + set len [llength $res] + if {$len} { + set repl [lindex $res 0] + $w delete $tmp insert + $w insert $tmp $repl {input stdin} + if {($len > 1) && ($::tk::console::showMatches) && ($repl eq $str)} { + puts stdout [lsort [lreplace $res 0 0]] + } + } else { + bell + } + return [incr len -1] +} + +# ::tk::console::ExpandPathname -- +# +# Expand a file pathname based on $str +# This is based on UNIX file name conventions +# +# Arguments: +# str - partial file pathname to expand +# +# Calls: ::tk::console::ExpandBestMatch +# +# Returns: list containing longest unique match followed by all the +# possible further matches + +proc ::tk::console::ExpandPathname str { + set pwd [EvalAttached pwd] + if {[catch {EvalAttached [list cd [file dirname $str]]} err opt]} { + return -options $opt $err + } + set dir [file tail $str] + ## Check to see if it was known to be a directory and keep the trailing + ## slash if so (file tail cuts it off) + if {[string match */ $str]} { + append dir / + } + if {[catch {lsort [EvalAttached [list glob $dir*]]} m]} { + set match {} + } else { + if {[llength $m] > 1} { + if { $::tcl_platform(platform) eq "windows" } { + ## Windows is screwy because it's case insensitive + set tmp [ExpandBestMatch [string tolower $m] \ + [string tolower $dir]] + ## Don't change case if we haven't changed the word + if {[string length $dir]==[string length $tmp]} { + set tmp $dir + } + } else { + set tmp [ExpandBestMatch $m $dir] + } + if {[string match ?*/* $str]} { + set tmp [file dirname $str]/$tmp + } elseif {[string match /* $str]} { + set tmp /$tmp + } + regsub -all { } $tmp {\\ } tmp + set match [linsert $m 0 $tmp] + } else { + ## This may look goofy, but it handles spaces in path names + eval append match $m + if {[file isdir $match]} { + append match / + } + if {[string match ?*/* $str]} { + set match [file dirname $str]/$match + } elseif {[string match /* $str]} { + set match /$match + } + regsub -all { } $match {\\ } match + ## Why is this one needed and the ones below aren't!! + set match [list $match] + } + } + EvalAttached [list cd $pwd] + return $match +} + +# ::tk::console::ExpandProcname -- +# +# Expand a tcl proc name based on $str +# +# Arguments: +# str - partial proc name to expand +# +# Calls: ::tk::console::ExpandBestMatch +# +# Returns: list containing longest unique match followed by all the +# possible further matches + +proc ::tk::console::ExpandProcname str { + set match [EvalAttached [list info commands $str*]] + if {[llength $match] == 0} { + set ns [EvalAttached \ + "namespace children \[namespace current\] [list $str*]"] + if {[llength $ns]==1} { + set match [EvalAttached [list info commands ${ns}::*]] + } else { + set match $ns + } + } + if {[llength $match] > 1} { + regsub -all { } [ExpandBestMatch $match $str] {\\ } str + set match [linsert $match 0 $str] + } else { + regsub -all { } $match {\\ } match + } + return $match +} + +# ::tk::console::ExpandVariable -- +# +# Expand a tcl variable name based on $str +# +# Arguments: +# str - partial tcl var name to expand +# +# Calls: ::tk::console::ExpandBestMatch +# +# Returns: list containing longest unique match followed by all the +# possible further matches + +proc ::tk::console::ExpandVariable str { + if {[regexp {([^\(]*)\((.*)} $str -> ary str]} { + ## Looks like they're trying to expand an array. + set match [EvalAttached [list array names $ary $str*]] + if {[llength $match] > 1} { + set vars $ary\([ExpandBestMatch $match $str] + foreach var $match { + lappend vars $ary\($var\) + } + return $vars + } elseif {[llength $match] == 1} { + set match $ary\($match\) + } + ## Space transformation avoided for array names. + } else { + set match [EvalAttached [list info vars $str*]] + if {[llength $match] > 1} { + regsub -all { } [ExpandBestMatch $match $str] {\\ } str + set match [linsert $match 0 $str] + } else { + regsub -all { } $match {\\ } match + } + } + return $match +} + +# ::tk::console::ExpandBestMatch -- +# +# Finds the best unique match in a list of names. +# The extra $e in this argument allows us to limit the innermost loop a little +# further. This improves speed as $l becomes large or $e becomes long. +# +# Arguments: +# l - list to find best unique match in +# e - currently best known unique match +# +# Returns: longest unique match in the list + +proc ::tk::console::ExpandBestMatch {l {e {}}} { + set ec [lindex $l 0] + if {[llength $l]>1} { + set e [expr {[string length $e] - 1}] + set ei [expr {[string length $ec] - 1}] + foreach l $l { + while {$ei>=$e && [string first $ec $l]} { + set ec [string range $ec 0 [incr ei -1]] + } + } + } + return $ec +} + +# now initialize the console +::tk::ConsoleInit diff --git a/env/tcl/tk8.6/demos/README b/env/tcl/tk8.6/demos/README new file mode 100644 index 0000000..7285a93 --- /dev/null +++ b/env/tcl/tk8.6/demos/README @@ -0,0 +1,44 @@ +This directory contains a collection of programs to demonstrate +the features of the Tk toolkit. The programs are all scripts for +"wish", a windowing shell. If wish has been installed on your path +then you can invoke any of the programs in this directory just +by typing its file name to your command shell under Unix. Otherwise +invoke wish with the file as its first argument, e.g., "wish hello". +The rest of this file contains a brief description of each program. +Files with names ending in ".tcl" are procedure packages used by one +or more of the demo programs; they can't be used as programs by +themselves so they aren't described below. + +hello - Creates a single button; if you click on it, a message + is typed and the application terminates. + +widget - Contains a collection of demonstrations of the widgets + currently available in the Tk library. Most of the .tcl + files are scripts for individual demos available through + the "widget" program. + +ixset - A simple Tk-based wrapper for the "xset" program, which + allows you to interactively query and set various X options + such as mouse acceleration and bell volume. Thanks to + Pierre David for contributing this example. + +rolodex - A mock-up of a simple rolodex application. It has much of + the user interface for such an application but no back-end + database. This program was written in response to Tom + LaStrange's toolkit benchmark challenge. + +tcolor - A color editor. Allows you to edit colors in several + different ways, and will also perform automatic updates + using "send". + +rmt - Allows you to "hook-up" remotely to any Tk application + on the display. Select an application with the menu, + then just type commands: they'll go to that application. + +timer - Displays a seconds timer with start and stop buttons. + Control-c and control-q cause it to exit. + +browse - A simple directory browser. Invoke it with and argument + giving the name of the directory you'd like to browse. + Double-click on files or subdirectories to browse them. + Control-c and control-q cause the program to exit. diff --git a/env/tcl/tk8.6/demos/anilabel.tcl b/env/tcl/tk8.6/demos/anilabel.tcl new file mode 100644 index 0000000..61e6315 --- /dev/null +++ b/env/tcl/tk8.6/demos/anilabel.tcl @@ -0,0 +1,160 @@ +# anilabel.tcl -- +# +# This demonstration script creates a toplevel window containing +# several animated label widgets. + +if {![info exists widgetDemo]} { + error "This script should be run from the \"widget\" demo." +} + +package require Tk + +set w .anilabel +catch {destroy $w} +toplevel $w +wm title $w "Animated Label Demonstration" +wm iconname $w "anilabel" +positionWindow $w + +label $w.msg -font $font -wraplength 4i -justify left -text "Four animated labels are displayed below; each of the labels on the left is animated by making the text message inside it appear to scroll, and the label on the right is animated by animating the image that it displays." +pack $w.msg -side top + +## See Code / Dismiss buttons +set btns [addSeeDismiss $w.buttons $w] +pack $btns -side bottom -fill x + +# Ensure that this this is an array +array set animationCallbacks {} + +## This callback is the core of how to do animation in Tcl/Tk; all +## animations work in basically the same way, with a procedure that +## uses the [after] command to reschedule itself at some point in the +## future. Of course, the details of how to update the state will vary +## according to what is being animated. +proc RotateLabelText {w interval} { + global animationCallbacks + + # Schedule the calling of this procedure again in the future + set animationCallbacks($w) [after $interval RotateLabelText $w $interval] + + # We do marquee-like scrolling text by chopping characters off the + # front of the text and sticking them on the end. + set text [$w cget -text] + set newText [string range $text 1 end][string index $text 0] + $w configure -text $newText +} + +## A helper procedure to start the animation happening. +proc animateLabelText {w text interval} { + global animationCallbacks + + # Install the text into the widget + $w configure -text $text + + # Schedule the start of the animation loop + set animationCallbacks($w) [after $interval RotateLabelText $w $interval] + + # Make sure that the animation stops and is cleaned up after itself + # when the animated label is destroyed. Note that at this point we + # cannot manipulate the widget itself, as that has already died. + bind $w { + after cancel $animationCallbacks(%W) + unset animationCallbacks(%W) + } +} + +## Next, a similar pair of procedures to animate a GIF loaded into a +## photo image. +proc SelectNextImageFrame {w interval} { + global animationCallbacks + set animationCallbacks($w) \ + [after $interval SelectNextImageFrame $w $interval] + set image [$w cget -image] + + # The easy way to animate a GIF! + set idx -1 + scan [$image cget -format] "GIF -index %d" idx + if {[catch { + # Note that we get an error if the index is out of range + $image configure -format "GIF -index [incr idx]" + }]} then { + $image configure -format "GIF -index 0" + } +} +proc animateLabelImage {w imageData interval} { + global animationCallbacks + + # Create a multi-frame GIF from base-64-encoded data + set image [image create photo -format GIF -data $imageData] + + # Install the image into the widget + $w configure -image $image + + # Schedule the start of the animation loop + set animationCallbacks($w) \ + [after $interval SelectNextImageFrame $w $interval] + + # Make sure that the animation stops and is cleaned up after itself + # when the animated label is destroyed. Note that at this point we + # cannot manipulate the widget itself, as that has already died. + # Also note that this script is in double-quotes; this is always OK + # because image names are chosen automatically to be simple words. + bind $w " + after cancel \$animationCallbacks(%W) + unset animationCallbacks(%W) + rename $image {} + " +} + +# Make some widgets to contain the animations +labelframe $w.left -text "Scrolling Texts" +labelframe $w.right -text "GIF Image" +pack $w.left $w.right -side left -padx 10 -pady 10 -expand yes + +# This method of scrolling text looks far better with a fixed-width font +label $w.left.l1 -bd 4 -relief ridge -font fixedFont +label $w.left.l2 -bd 4 -relief groove -font fixedFont +label $w.left.l3 -bd 4 -relief flat -font fixedFont -width 18 +pack $w.left.l1 $w.left.l2 $w.left.l3 -side top -expand yes -padx 10 -pady 10 -anchor w +# Don't need to do very much with this label except turn off the border +label $w.right.l -bd 0 +pack $w.right.l -side top -expand yes -padx 10 -pady 10 + +# This is a base-64-encoded animated GIF file. +set tclPoweredData { + R0lGODlhKgBAAPQAAP//////zP//AP/MzP/Mmf/MAP+Zmf+ZZv+ZAMz//8zM + zMyZmcyZZsxmZsxmAMwzAJnMzJmZzJmZmZlmmZlmZplmM5kzM2aZzGZmzGZm + mWZmZmYzZmYzMzNmzDMzZgAzmSH+IE1hZGUgd2l0aCBHSU1QIGJ5IExARGVt + YWlsbHkuY29tACH5BAVkAAEALAAAAAAqAEAAAAX+YCCOZEkyTKM2jOm66yPP + dF03bx7YcuHIDkGBR7SZeIyhTID4FZ+4Es8nQyCe2EeUNJ0peY2s9mi7PhAM + ngEAMGRbUpvzSxskLh1J+Hkg134OdDIDEB+GHxtYMEQMTjMGEYeGFoomezaC + DZGSHFmLXTQKkh8eNQVpZ2afmDQGHaOYSoEyhhcklzVmMpuHnaZmDqiGJbg0 + qFqvh6UNAwB7VA+OwydEjgujkgrPNhbTI8dFvNgEYcHcHx0lB1kX2IYeA2G6 + NN0YfkXJ2BsAMuAzHB9cZMk3qoEbRzUACsRCUBK5JxsC3iMiKd8GN088SIyT + 0RAFSROyeEg38caDiB/+JEgqxsODrZJ1BkT0oHKSmI0ceQxo94HDpg0qsuDk + UmRAMgu8OgwQ+uIJgUMVeGXA+IQkzEeHGvD8cIGlDXsLiRjQ+EHroQhea7xY + 8IQBSgYYDi1IS+OFBCgaDMGVS3fGi5BPJpBaENdQ0EomKGD56IHwO39EXiSC + Ysgxor5+Xfgq0qByYUpiXmwuoredB2aYH4gWWda0B7SeNENpEJHC1ghi+pS4 + AJpIAwWvKPBi+8YEht5EriEqpFfMlhEdkBNpx0HUhwypx5T4IB1MBg/Ws2sn + wV3MSQOkzI8fUd48Aw3dOZto71x85hHtHijYv18Gf/3GqCdDCXHNoICBobSo + IqBqJLyCoH8JPrLgdh88CKCFD0CGmAiGYPgffwceZh6FC2ohIIklnkhehTNY + 4CIHHGzgwYw01ujBBhvAqKOLLq5AAk9kuSPkkKO40NB+h1gnypJIIvkBf09a + N5QIRz5p5ZJXJpmlIVhOGQA2TmIJZZhKKmmll2BqyWSXWUrZpQtpatlmk1c2 + KaWRHeTZEJF8SqLDn/hhsOeQgBbqAh6DGqronxeARUIIACH5BAUeAAAALAUA + LgAFAAUAAAUM4CeKz/OV5YmqaRkCACH5BAUeAAEALAUALgAKAAUAAAUUICCK + z/OdJVCaa7p+7aOWcDvTZwgAIfkEBR4AAQAsCwAuAAkABQAABRPgA4zP95zA + eZqoWqqpyqLkZ38hACH5BAUKAAEALAcALgANAA4AAAU7ICA+jwiUJEqeKau+ + r+vGaTmac63v/GP9HM7GQyx+jsgkkoRUHJ3Qx0cK/VQVTKtWwbVKn9suNunc + WkMAIfkEBQoAAAAsBwA3AAcABQAABRGgIHzk842j+Yjlt5KuO8JmCAAh+QQF + CgAAACwLADcABwAFAAAFEeAnfN9TjqP5oOWziq05lmUIACH5BAUKAAAALA8A + NwAHAAUAAAUPoPCJTymS3yiQj4qOcPmEACH5BAUKAAAALBMANwAHAAUAAAUR + oCB+z/MJX2o+I2miKimiawgAIfkEBQoAAAAsFwA3AAcABQAABRGgIHzfY47j + Q4qk+aHl+pZmCAAh+QQFCgAAACwbADcABwAFAAAFEaAgfs/zCV9qPiNJouo7 + ll8IACH5BAUKAAAALB8ANwADAAUAAAUIoCB8o0iWZggAOw== +} + +# Finally, set up the text scrolling animation +animateLabelText $w.left.l1 "* Slow Animation *" 300 +animateLabelText $w.left.l2 "* Fast Animation *" 80 +animateLabelText $w.left.l3 "This is a longer scrolling text in a widget that will not show the whole message at once. " 150 +animateLabelImage $w.right.l $tclPoweredData 100 diff --git a/env/tcl/tk8.6/demos/aniwave.tcl b/env/tcl/tk8.6/demos/aniwave.tcl new file mode 100644 index 0000000..a7539fb --- /dev/null +++ b/env/tcl/tk8.6/demos/aniwave.tcl @@ -0,0 +1,104 @@ +# aniwave.tcl -- +# +# This demonstration script illustrates how to adjust canvas item +# coordinates in a way that does something fairly similar to waveform +# display. + +if {![info exists widgetDemo]} { + error "This script should be run from the \"widget\" demo." +} + +package require Tk + +set w .aniwave +catch {destroy $w} +toplevel $w +wm title $w "Animated Wave Demonstration" +wm iconname $w "aniwave" +positionWindow $w + +label $w.msg -font $font -wraplength 4i -justify left -text "This demonstration contains a canvas widget with a line item inside it. The animation routines work by adjusting the coordinates list of the line; a trace on a variable is used so updates to the variable result in a change of position of the line." +pack $w.msg -side top + +## See Code / Dismiss buttons +set btns [addSeeDismiss $w.buttons $w] +pack $btns -side bottom -fill x + +# Create a canvas large enough to hold the wave. In fact, the wave +# sticks off both sides of the canvas to prevent visual glitches. +pack [canvas $w.c -width 300 -height 200 -background black] -padx 10 -pady 10 -expand yes + +# Ensure that this this is an array +array set animationCallbacks {} + +# Creates a coordinates list of a wave. This code does a very sketchy +# job and relies on Tk's line smoothing to make things look better. +set waveCoords {} +for {set x -10} {$x<=300} {incr x 5} { + lappend waveCoords $x 100 +} +lappend waveCoords $x 0 [incr x 5] 200 + +# Create a smoothed line and arrange for its coordinates to be the +# contents of the variable waveCoords. +$w.c create line $waveCoords -tags wave -width 1 -fill green -smooth 1 +proc waveCoordsTracer {w args} { + global waveCoords + # Actual visual update will wait until we have finished + # processing; Tk does that for us automatically. + $w.c coords wave $waveCoords +} +trace add variable waveCoords write [list waveCoordsTracer $w] + +# Basic motion handler. Given what direction the wave is travelling +# in, it advances the y coordinates in the coordinate-list one step in +# that direction. +proc basicMotion {} { + global waveCoords direction + set oc $waveCoords + for {set i 1} {$i<[llength $oc]} {incr i 2} { + if {$direction eq "left"} { + lset waveCoords $i [lindex $oc \ + [expr {$i+2>[llength $oc] ? 1 : $i+2}]] + } else { + lset waveCoords $i \ + [lindex $oc [expr {$i-2<0 ? "end" : $i-2}]] + } + } +} + +# Oscillation handler. This detects whether to reverse the direction +# of the wave by checking to see if the peak of the wave has moved off +# the screen (whose size we know already.) +proc reverser {} { + global waveCoords direction + if {[lindex $waveCoords 1] < 10} { + set direction "right" + } elseif {[lindex $waveCoords end] < 10} { + set direction "left" + } +} + +# Main animation "loop". This calls the two procedures that handle the +# movement repeatedly by scheduling asynchronous calls back to itself +# using the [after] command. This procedure is the fundamental basis +# for all animated effect handling in Tk. +proc move {} { + basicMotion + reverser + + # Theoretically 100 frames-per-second (==10ms between frames) + global animationCallbacks + set animationCallbacks(simpleWave) [after 10 move] +} + +# Initialise our remaining animation variables +set direction "left" +set animateAfterCallback {} +# Arrange for the animation loop to stop when the canvas is deleted +bind $w.c { + after cancel $animationCallbacks(simpleWave) + unset animationCallbacks(simpleWave) +} +# Start the animation processing +move diff --git a/env/tcl/tk8.6/demos/arrow.tcl b/env/tcl/tk8.6/demos/arrow.tcl new file mode 100644 index 0000000..5011f6f --- /dev/null +++ b/env/tcl/tk8.6/demos/arrow.tcl @@ -0,0 +1,237 @@ +# arrow.tcl -- +# +# This demonstration script creates a canvas widget that displays a +# large line with an arrowhead whose shape can be edited interactively. + +if {![info exists widgetDemo]} { + error "This script should be run from the \"widget\" demo." +} + +package require Tk + +# arrowSetup -- +# This procedure regenerates all the text and graphics in the canvas +# window. It's called when the canvas is initially created, and also +# whenever any of the parameters of the arrow head are changed +# interactively. +# +# Arguments: +# c - Name of the canvas widget. + +proc arrowSetup c { + upvar #0 demo_arrowInfo v + + # Remember the current box, if there is one. + + set tags [$c gettags current] + if {$tags != ""} { + set cur [lindex $tags [lsearch -glob $tags box?]] + } else { + set cur "" + } + + # Create the arrow and outline. + + $c delete all + eval {$c create line $v(x1) $v(y) $v(x2) $v(y) -arrow last \ + -width [expr {10*$v(width)}] -arrowshape [list \ + [expr {10*$v(a)}] [expr {10*$v(b)}] [expr {10*$v(c)}]]} \ + $v(bigLineStyle) + set xtip [expr {$v(x2)-10*$v(b)}] + set deltaY [expr {10*$v(c)+5*$v(width)}] + $c create line $v(x2) $v(y) $xtip [expr {$v(y)+$deltaY}] \ + [expr {$v(x2)-10*$v(a)}] $v(y) $xtip [expr {$v(y)-$deltaY}] \ + $v(x2) $v(y) -width 2 -capstyle round -joinstyle round + + # Create the boxes for reshaping the line and arrowhead. + + eval {$c create rect [expr {$v(x2)-10*$v(a)-5}] [expr {$v(y)-5}] \ + [expr {$v(x2)-10*$v(a)+5}] [expr {$v(y)+5}] \ + -tags {box1 box}} $v(boxStyle) + eval {$c create rect [expr {$xtip-5}] [expr {$v(y)-$deltaY-5}] \ + [expr {$xtip+5}] [expr {$v(y)-$deltaY+5}] \ + -tags {box2 box}} $v(boxStyle) + eval {$c create rect [expr {$v(x1)-5}] [expr {$v(y)-5*$v(width)-5}] \ + [expr {$v(x1)+5}] [expr {$v(y)-5*$v(width)+5}] \ + -tags {box3 box}} $v(boxStyle) + if {$cur != ""} { + eval $c itemconfigure $cur $v(activeStyle) + } + + # Create three arrows in actual size with the same parameters + + $c create line [expr {$v(x2)+50}] 0 [expr {$v(x2)+50}] 1000 \ + -width 2 + set tmp [expr {$v(x2)+100}] + $c create line $tmp [expr {$v(y)-125}] $tmp [expr {$v(y)-75}] \ + -width $v(width) \ + -arrow both -arrowshape "$v(a) $v(b) $v(c)" + $c create line [expr {$tmp-25}] $v(y) [expr {$tmp+25}] $v(y) \ + -width $v(width) \ + -arrow both -arrowshape "$v(a) $v(b) $v(c)" + $c create line [expr {$tmp-25}] [expr {$v(y)+75}] [expr {$tmp+25}] \ + [expr {$v(y)+125}] -width $v(width) \ + -arrow both -arrowshape "$v(a) $v(b) $v(c)" + + # Create a bunch of other arrows and text items showing the + # current dimensions. + + set tmp [expr {$v(x2)+10}] + $c create line $tmp [expr {$v(y)-5*$v(width)}] \ + $tmp [expr {$v(y)-$deltaY}] \ + -arrow both -arrowshape $v(smallTips) + $c create text [expr {$v(x2)+15}] [expr {$v(y)-$deltaY+5*$v(c)}] \ + -text $v(c) -anchor w + set tmp [expr {$v(x1)-10}] + $c create line $tmp [expr {$v(y)-5*$v(width)}] \ + $tmp [expr {$v(y)+5*$v(width)}] \ + -arrow both -arrowshape $v(smallTips) + $c create text [expr {$v(x1)-15}] $v(y) -text $v(width) -anchor e + set tmp [expr {$v(y)+5*$v(width)+10*$v(c)+10}] + $c create line [expr {$v(x2)-10*$v(a)}] $tmp $v(x2) $tmp \ + -arrow both -arrowshape $v(smallTips) + $c create text [expr {$v(x2)-5*$v(a)}] [expr {$tmp+5}] \ + -text $v(a) -anchor n + set tmp [expr {$tmp+25}] + $c create line [expr {$v(x2)-10*$v(b)}] $tmp $v(x2) $tmp \ + -arrow both -arrowshape $v(smallTips) + $c create text [expr {$v(x2)-5*$v(b)}] [expr {$tmp+5}] \ + -text $v(b) -anchor n + + $c create text $v(x1) 310 -text "-width $v(width)" \ + -anchor w -font {Helvetica 18} + $c create text $v(x1) 330 -text "-arrowshape {$v(a) $v(b) $v(c)}" \ + -anchor w -font {Helvetica 18} + + incr v(count) +} + +set w .arrow +catch {destroy $w} +toplevel $w +wm title $w "Arrowhead Editor Demonstration" +wm iconname $w "arrow" +positionWindow $w +set c $w.c + +label $w.msg -font $font -wraplength 5i -justify left -text "This widget allows you to experiment with different widths and arrowhead shapes for lines in canvases. To change the line width or the shape of the arrowhead, drag any of the three boxes attached to the oversized arrow. The arrows on the right give examples at normal scale. The text at the bottom shows the configuration options as you'd enter them for a canvas line item." +pack $w.msg -side top + +## See Code / Dismiss buttons +set btns [addSeeDismiss $w.buttons $w] +pack $btns -side bottom -fill x + +canvas $c -width 500 -height 350 -relief sunken -borderwidth 2 +pack $c -expand yes -fill both + +set demo_arrowInfo(a) 8 +set demo_arrowInfo(b) 10 +set demo_arrowInfo(c) 3 +set demo_arrowInfo(width) 2 +set demo_arrowInfo(motionProc) arrowMoveNull +set demo_arrowInfo(x1) 40 +set demo_arrowInfo(x2) 350 +set demo_arrowInfo(y) 150 +set demo_arrowInfo(smallTips) {5 5 2} +set demo_arrowInfo(count) 0 +if {[winfo depth $c] > 1} { + set demo_arrowInfo(bigLineStyle) "-fill SkyBlue1" + set demo_arrowInfo(boxStyle) "-fill {} -outline black -width 1" + set demo_arrowInfo(activeStyle) "-fill red -outline black -width 1" +} else { + # Main widget program sets variable tk_demoDirectory + set demo_arrowInfo(bigLineStyle) "-fill black \ + -stipple @[file join $tk_demoDirectory images grey.25]" + set demo_arrowInfo(boxStyle) "-fill {} -outline black -width 1" + set demo_arrowInfo(activeStyle) "-fill black -outline black -width 1" +} +arrowSetup $c +$c bind box "$c itemconfigure current $demo_arrowInfo(activeStyle)" +$c bind box "$c itemconfigure current $demo_arrowInfo(boxStyle)" +$c bind box " " +$c bind box " " +$c bind box1 <1> {set demo_arrowInfo(motionProc) arrowMove1} +$c bind box2 <1> {set demo_arrowInfo(motionProc) arrowMove2} +$c bind box3 <1> {set demo_arrowInfo(motionProc) arrowMove3} +$c bind box "\$demo_arrowInfo(motionProc) $c %x %y" +bind $c "arrowSetup $c" + +# arrowMove1 -- +# This procedure is called for each mouse motion event on box1 (the +# one at the vertex of the arrow). It updates the controlling parameters +# for the line and arrowhead. +# +# Arguments: +# c - The name of the canvas window. +# x, y - The coordinates of the mouse. + +proc arrowMove1 {c x y} { + upvar #0 demo_arrowInfo v + set newA [expr {($v(x2)+5-round([$c canvasx $x]))/10}] + if {$newA < 0} { + set newA 0 + } + if {$newA > 25} { + set newA 25 + } + if {$newA != $v(a)} { + $c move box1 [expr {10*($v(a)-$newA)}] 0 + set v(a) $newA + } +} + +# arrowMove2 -- +# This procedure is called for each mouse motion event on box2 (the +# one at the trailing tip of the arrowhead). It updates the controlling +# parameters for the line and arrowhead. +# +# Arguments: +# c - The name of the canvas window. +# x, y - The coordinates of the mouse. + +proc arrowMove2 {c x y} { + upvar #0 demo_arrowInfo v + set newB [expr {($v(x2)+5-round([$c canvasx $x]))/10}] + if {$newB < 0} { + set newB 0 + } + if {$newB > 25} { + set newB 25 + } + set newC [expr {($v(y)+5-round([$c canvasy $y])-5*$v(width))/10}] + if {$newC < 0} { + set newC 0 + } + if {$newC > 20} { + set newC 20 + } + if {($newB != $v(b)) || ($newC != $v(c))} { + $c move box2 [expr {10*($v(b)-$newB)}] [expr {10*($v(c)-$newC)}] + set v(b) $newB + set v(c) $newC + } +} + +# arrowMove3 -- +# This procedure is called for each mouse motion event on box3 (the +# one that controls the thickness of the line). It updates the +# controlling parameters for the line and arrowhead. +# +# Arguments: +# c - The name of the canvas window. +# x, y - The coordinates of the mouse. + +proc arrowMove3 {c x y} { + upvar #0 demo_arrowInfo v + set newWidth [expr {($v(y)+2-round([$c canvasy $y]))/5}] + if {$newWidth < 0} { + set newWidth 0 + } + if {$newWidth > 20} { + set newWidth 20 + } + if {$newWidth != $v(width)} { + $c move box3 0 [expr {5*($v(width)-$newWidth)}] + set v(width) $newWidth + } +} diff --git a/env/tcl/tk8.6/demos/bind.tcl b/env/tcl/tk8.6/demos/bind.tcl new file mode 100644 index 0000000..03f6d3b --- /dev/null +++ b/env/tcl/tk8.6/demos/bind.tcl @@ -0,0 +1,78 @@ +# bind.tcl -- +# +# This demonstration script creates a text widget with bindings set +# up for hypertext-like effects. + +if {![info exists widgetDemo]} { + error "This script should be run from the \"widget\" demo." +} + +package require Tk + +set w .bind +catch {destroy $w} +toplevel $w +wm title $w "Text Demonstration - Tag Bindings" +wm iconname $w "bind" +positionWindow $w + +## See Code / Dismiss buttons +set btns [addSeeDismiss $w.buttons $w] +pack $btns -side bottom -fill x + +text $w.text -yscrollcommand "$w.scroll set" -setgrid true \ + -width 60 -height 24 -font $font -wrap word +ttk::scrollbar $w.scroll -command "$w.text yview" +pack $w.scroll -side right -fill y +pack $w.text -expand yes -fill both + +# Set up display styles. + +if {[winfo depth $w] > 1} { + set bold "-background #43ce80 -relief raised -borderwidth 1" + set normal "-background {} -relief flat" +} else { + set bold "-foreground white -background black" + set normal "-foreground {} -background {}" +} + +# Add text to widget. + +$w.text insert 0.0 {\ +The same tag mechanism that controls display styles in text widgets can also be used to associate Tcl commands with regions of text, so that mouse or keyboard actions on the text cause particular Tcl commands to be invoked. For example, in the text below the descriptions of the canvas demonstrations have been tagged. When you move the mouse over a demo description the description lights up, and when you press button 1 over a description then that particular demonstration is invoked. + +} +$w.text insert end \ +{1. Samples of all the different types of items that can be created in canvas widgets.} d1 +$w.text insert end \n\n +$w.text insert end \ +{2. A simple two-dimensional plot that allows you to adjust the positions of the data points.} d2 +$w.text insert end \n\n +$w.text insert end \ +{3. Anchoring and justification modes for text items.} d3 +$w.text insert end \n\n +$w.text insert end \ +{4. An editor for arrow-head shapes for line items.} d4 +$w.text insert end \n\n +$w.text insert end \ +{5. A ruler with facilities for editing tab stops.} d5 +$w.text insert end \n\n +$w.text insert end \ +{6. A grid that demonstrates how canvases can be scrolled.} d6 + +# Create bindings for tags. + +foreach tag {d1 d2 d3 d4 d5 d6} { + $w.text tag bind $tag "$w.text tag configure $tag $bold" + $w.text tag bind $tag "$w.text tag configure $tag $normal" +} +# Main widget program sets variable tk_demoDirectory +$w.text tag bind d1 <1> {source [file join $tk_demoDirectory items.tcl]} +$w.text tag bind d2 <1> {source [file join $tk_demoDirectory plot.tcl]} +$w.text tag bind d3 <1> {source [file join $tk_demoDirectory ctext.tcl]} +$w.text tag bind d4 <1> {source [file join $tk_demoDirectory arrow.tcl]} +$w.text tag bind d5 <1> {source [file join $tk_demoDirectory ruler.tcl]} +$w.text tag bind d6 <1> {source [file join $tk_demoDirectory cscroll.tcl]} + +$w.text mark set insert 0.0 +$w.text configure -state disabled diff --git a/env/tcl/tk8.6/demos/bitmap.tcl b/env/tcl/tk8.6/demos/bitmap.tcl new file mode 100644 index 0000000..453987d --- /dev/null +++ b/env/tcl/tk8.6/demos/bitmap.tcl @@ -0,0 +1,52 @@ +# bitmap.tcl -- +# +# This demonstration script creates a toplevel window that displays +# all of Tk's built-in bitmaps. + +if {![info exists widgetDemo]} { + error "This script should be run from the \"widget\" demo." +} + +package require Tk + +# bitmapRow -- +# Create a row of bitmap items in a window. +# +# Arguments: +# w - The window that is to contain the row. +# args - The names of one or more bitmaps, which will be displayed +# in a new row across the bottom of w along with their +# names. + +proc bitmapRow {w args} { + frame $w + pack $w -side top -fill both + set i 0 + foreach bitmap $args { + frame $w.$i + pack $w.$i -side left -fill both -pady .25c -padx .25c + label $w.$i.bitmap -bitmap $bitmap + label $w.$i.label -text $bitmap -width 9 + pack $w.$i.label $w.$i.bitmap -side bottom + incr i + } +} + +set w .bitmap +catch {destroy $w} +toplevel $w +wm title $w "Bitmap Demonstration" +wm iconname $w "bitmap" +positionWindow $w + +label $w.msg -font $font -wraplength 4i -justify left -text "This window displays all of Tk's built-in bitmaps, along with the names you can use for them in Tcl scripts." +pack $w.msg -side top + +## See Code / Dismiss buttons +set btns [addSeeDismiss $w.buttons $w] +pack $btns -side bottom -fill x + +frame $w.frame +bitmapRow $w.frame.0 error gray12 gray25 gray50 gray75 +bitmapRow $w.frame.1 hourglass info question questhead warning +pack $w.frame -side top -expand yes -fill both diff --git a/env/tcl/tk8.6/demos/browse b/env/tcl/tk8.6/demos/browse new file mode 100644 index 0000000..d107f28 --- /dev/null +++ b/env/tcl/tk8.6/demos/browse @@ -0,0 +1,66 @@ +#!/bin/sh +# the next line restarts using wish \ +exec wish "$0" ${1+"$@"} + +# browse -- +# This script generates a directory browser, which lists the working +# directory and allows you to open files or subdirectories by +# double-clicking. + +package require Tk + +# Create a scrollbar on the right side of the main window and a listbox +# on the left side. + +scrollbar .scroll -command ".list yview" +pack .scroll -side right -fill y +listbox .list -yscroll ".scroll set" -relief sunken -width 20 -height 20 \ + -setgrid yes +pack .list -side left -fill both -expand yes +wm minsize . 1 1 + +# The procedure below is invoked to open a browser on a given file; if the +# file is a directory then another instance of this program is invoked; if +# the file is a regular file then the Mx editor is invoked to display +# the file. + +set browseScript [file join [pwd] $argv0] +proc browse {dir file} { + global env browseScript + if {[string compare $dir "."] != 0} {set file $dir/$file} + switch [file type $file] { + directory { + exec [info nameofexecutable] $browseScript $file & + } + file { + if {[info exists env(EDITOR)]} { + eval exec $env(EDITOR) $file & + } else { + exec xedit $file & + } + } + default { + puts stdout "\"$file\" isn't a directory or regular file" + } + } +} + +# Fill the listbox with a list of all the files in the directory. + +if {$argc>0} {set dir [lindex $argv 0]} else {set dir "."} +foreach i [lsort [glob * .* *.*]] { + if {[file type $i] eq "directory"} { + # Safe to do since it is still a directory. + append i / + } + .list insert end $i +} + +# Set up bindings for the browser. + +bind all {destroy .} +bind .list {foreach i [selection get] {browse $dir $i}} + +# Local Variables: +# mode: tcl +# End: diff --git a/env/tcl/tk8.6/demos/button.tcl b/env/tcl/tk8.6/demos/button.tcl new file mode 100644 index 0000000..bb943e6 --- /dev/null +++ b/env/tcl/tk8.6/demos/button.tcl @@ -0,0 +1,47 @@ +# button.tcl -- +# +# This demonstration script creates a toplevel window containing +# several button widgets. + +if {![info exists widgetDemo]} { + error "This script should be run from the \"widget\" demo." +} + +package require Tk + +set w .button +catch {destroy $w} +toplevel $w +wm title $w "Button Demonstration" +wm iconname $w "button" +positionWindow $w + +label $w.msg -font $font -wraplength 4i -justify left -text "If you click on any of the four buttons below, the background of the button area will change to the color indicated in the button. You can press Tab to move among the buttons, then press Space to invoke the current button." +pack $w.msg -side top + +## See Code / Dismiss buttons +pack [addSeeDismiss $w.buttons $w] -side bottom -fill x + +proc colorrefresh {w col} { + $w configure -bg $col + if {[tk windowingsystem] eq "aqua"} { + # set highlightbackground of all buttons in $w + set l [list $w] + while {[llength $l]} { + set l [concat [lassign $l b] [winfo children $b]] + if {[winfo class $b] eq "Button"} { + $b configure -highlightbackground $col + } + } + } +} + +button $w.b1 -text "Peach Puff" -width 10 \ + -command [list colorrefresh $w PeachPuff1] +button $w.b2 -text "Light Blue" -width 10 \ + -command [list colorrefresh $w LightBlue1] +button $w.b3 -text "Sea Green" -width 10 \ + -command [list colorrefresh $w SeaGreen2] +button $w.b4 -text "Yellow" -width 10 \ + -command [list colorrefresh $w Yellow1] +pack $w.b1 $w.b2 $w.b3 $w.b4 -side top -expand yes -pady 2 diff --git a/env/tcl/tk8.6/demos/check.tcl b/env/tcl/tk8.6/demos/check.tcl new file mode 100644 index 0000000..c072096 --- /dev/null +++ b/env/tcl/tk8.6/demos/check.tcl @@ -0,0 +1,71 @@ +# check.tcl -- +# +# This demonstration script creates a toplevel window containing +# several checkbuttons. + +if {![info exists widgetDemo]} { + error "This script should be run from the \"widget\" demo." +} + +package require Tk + +set w .check +catch {destroy $w} +toplevel $w +wm title $w "Checkbutton Demonstration" +wm iconname $w "check" +positionWindow $w + +label $w.msg -font $font -wraplength 4i -justify left -text "Four checkbuttons are displayed below. If you click on a button, it will toggle the button's selection state and set a Tcl variable to a value indicating the state of the checkbutton. The first button also follows the state of the other three. If only some of the three are checked, the first button will display the tri-state mode. Click the \"See Variables\" button to see the current values of the variables." +pack $w.msg -side top + +## See Code / Dismiss buttons +set btns [addSeeDismiss $w.buttons $w [list safety wipers brakes sober]] +pack $btns -side bottom -fill x + +checkbutton $w.b0 -text "Safety Check" -variable safety -relief flat \ + -onvalue "all" \ + -offvalue "none" \ + -tristatevalue "partial" +checkbutton $w.b1 -text "Wipers OK" -variable wipers -relief flat +checkbutton $w.b2 -text "Brakes OK" -variable brakes -relief flat +checkbutton $w.b3 -text "Driver Sober" -variable sober -relief flat +pack $w.b0 -side top -pady 2 -anchor w +pack $w.b1 $w.b2 $w.b3 -side top -pady 2 -anchor w -padx 15 + +## This code makes $w.b0 function as a tri-state button; it's not +## needed at all for just straight yes/no buttons. + +set in_check 0 +proc tristate_check {n1 n2 op} { + global safety wipers brakes sober in_check + if {$in_check} { + return + } + set in_check 1 + if {$n1 eq "safety"} { + if {$safety eq "none"} { + set wipers 0 + set brakes 0 + set sober 0 + } elseif {$safety eq "all"} { + set wipers 1 + set brakes 1 + set sober 1 + } + } else { + if {$wipers == 1 && $brakes == 1 && $sober == 1} { + set safety all + } elseif {$wipers == 1 || $brakes == 1 || $sober == 1} { + set safety partial + } else { + set safety none + } + } + set in_check 0 +} + +trace variable wipers w tristate_check +trace variable brakes w tristate_check +trace variable sober w tristate_check +trace variable safety w tristate_check diff --git a/env/tcl/tk8.6/demos/clrpick.tcl b/env/tcl/tk8.6/demos/clrpick.tcl new file mode 100644 index 0000000..ba50b75 --- /dev/null +++ b/env/tcl/tk8.6/demos/clrpick.tcl @@ -0,0 +1,54 @@ +# clrpick.tcl -- +# +# This demonstration script prompts the user to select a color. + +if {![info exists widgetDemo]} { + error "This script should be run from the \"widget\" demo." +} + +package require Tk + +set w .clrpick +catch {destroy $w} +toplevel $w +wm title $w "Color Selection Dialog" +wm iconname $w "colors" +positionWindow $w + +label $w.msg -font $font -wraplength 4i -justify left -text "Press the buttons below to choose the foreground and background colors for the widgets in this window." +pack $w.msg -side top + +## See Code / Dismiss buttons +set btns [addSeeDismiss $w.buttons $w] +pack $btns -side bottom -fill x + +button $w.back -text "Set background color ..." \ + -command \ + "setColor $w $w.back background {-background -highlightbackground}" +button $w.fore -text "Set foreground color ..." \ + -command \ + "setColor $w $w.back foreground -foreground" + +pack $w.back $w.fore -side top -anchor c -pady 2m + +proc setColor {w button name options} { + grab $w + set initialColor [$button cget -$name] + set color [tk_chooseColor -title "Choose a $name color" -parent $w \ + -initialcolor $initialColor] + if {[string compare $color ""]} { + setColor_helper $w $options $color + } + grab release $w +} + +proc setColor_helper {w options color} { + foreach option $options { + catch { + $w config $option $color + } + } + foreach child [winfo children $w] { + setColor_helper $child $options $color + } +} diff --git a/env/tcl/tk8.6/demos/colors.tcl b/env/tcl/tk8.6/demos/colors.tcl new file mode 100644 index 0000000..99dec92 --- /dev/null +++ b/env/tcl/tk8.6/demos/colors.tcl @@ -0,0 +1,99 @@ +# colors.tcl -- +# +# This demonstration script creates a listbox widget that displays +# many of the colors from the X color database. You can click on +# a color to change the application's palette. + +if {![info exists widgetDemo]} { + error "This script should be run from the \"widget\" demo." +} + +package require Tk + +set w .colors +catch {destroy $w} +toplevel $w +wm title $w "Listbox Demonstration (colors)" +wm iconname $w "Listbox" +positionWindow $w + +label $w.msg -font $font -wraplength 4i -justify left -text "A listbox containing several color names is displayed below, along with a scrollbar. You can scan the list either using the scrollbar or by dragging in the listbox window with button 2 pressed. If you double-click button 1 on a color, then the application's color palette will be set to match that color" +pack $w.msg -side top + +## See Code / Dismiss buttons +set btns [addSeeDismiss $w.buttons $w] +pack $btns -side bottom -fill x + +frame $w.frame -borderwidth 10 +pack $w.frame -side top -expand yes -fill y + +scrollbar $w.frame.scroll -command "$w.frame.list yview" +listbox $w.frame.list -yscroll "$w.frame.scroll set" \ + -width 20 -height 16 -setgrid 1 +pack $w.frame.list $w.frame.scroll -side left -fill y -expand 1 + +bind $w.frame.list { + tk_setPalette [selection get] +} +$w.frame.list insert 0 gray60 gray70 gray80 gray85 gray90 gray95 \ + snow1 snow2 snow3 snow4 seashell1 seashell2 \ + seashell3 seashell4 AntiqueWhite1 AntiqueWhite2 AntiqueWhite3 \ + AntiqueWhite4 bisque1 bisque2 bisque3 bisque4 PeachPuff1 \ + PeachPuff2 PeachPuff3 PeachPuff4 NavajoWhite1 NavajoWhite2 \ + NavajoWhite3 NavajoWhite4 LemonChiffon1 LemonChiffon2 \ + LemonChiffon3 LemonChiffon4 cornsilk1 cornsilk2 cornsilk3 \ + cornsilk4 ivory1 ivory2 ivory3 ivory4 honeydew1 honeydew2 \ + honeydew3 honeydew4 LavenderBlush1 LavenderBlush2 \ + LavenderBlush3 LavenderBlush4 MistyRose1 MistyRose2 \ + MistyRose3 MistyRose4 azure1 azure2 azure3 azure4 \ + SlateBlue1 SlateBlue2 SlateBlue3 SlateBlue4 RoyalBlue1 \ + RoyalBlue2 RoyalBlue3 RoyalBlue4 blue1 blue2 blue3 blue4 \ + DodgerBlue1 DodgerBlue2 DodgerBlue3 DodgerBlue4 SteelBlue1 \ + SteelBlue2 SteelBlue3 SteelBlue4 DeepSkyBlue1 DeepSkyBlue2 \ + DeepSkyBlue3 DeepSkyBlue4 SkyBlue1 SkyBlue2 SkyBlue3 \ + SkyBlue4 LightSkyBlue1 LightSkyBlue2 LightSkyBlue3 \ + LightSkyBlue4 SlateGray1 SlateGray2 SlateGray3 SlateGray4 \ + LightSteelBlue1 LightSteelBlue2 LightSteelBlue3 \ + LightSteelBlue4 LightBlue1 LightBlue2 LightBlue3 \ + LightBlue4 LightCyan1 LightCyan2 LightCyan3 LightCyan4 \ + PaleTurquoise1 PaleTurquoise2 PaleTurquoise3 PaleTurquoise4 \ + CadetBlue1 CadetBlue2 CadetBlue3 CadetBlue4 turquoise1 \ + turquoise2 turquoise3 turquoise4 cyan1 cyan2 cyan3 cyan4 \ + DarkSlateGray1 DarkSlateGray2 DarkSlateGray3 \ + DarkSlateGray4 aquamarine1 aquamarine2 aquamarine3 \ + aquamarine4 DarkSeaGreen1 DarkSeaGreen2 DarkSeaGreen3 \ + DarkSeaGreen4 SeaGreen1 SeaGreen2 SeaGreen3 SeaGreen4 \ + PaleGreen1 PaleGreen2 PaleGreen3 PaleGreen4 SpringGreen1 \ + SpringGreen2 SpringGreen3 SpringGreen4 green1 green2 \ + green3 green4 chartreuse1 chartreuse2 chartreuse3 \ + chartreuse4 OliveDrab1 OliveDrab2 OliveDrab3 OliveDrab4 \ + DarkOliveGreen1 DarkOliveGreen2 DarkOliveGreen3 \ + DarkOliveGreen4 khaki1 khaki2 khaki3 khaki4 \ + LightGoldenrod1 LightGoldenrod2 LightGoldenrod3 \ + LightGoldenrod4 LightYellow1 LightYellow2 LightYellow3 \ + LightYellow4 yellow1 yellow2 yellow3 yellow4 gold1 gold2 \ + gold3 gold4 goldenrod1 goldenrod2 goldenrod3 goldenrod4 \ + DarkGoldenrod1 DarkGoldenrod2 DarkGoldenrod3 DarkGoldenrod4 \ + RosyBrown1 RosyBrown2 RosyBrown3 RosyBrown4 IndianRed1 \ + IndianRed2 IndianRed3 IndianRed4 sienna1 sienna2 sienna3 \ + sienna4 burlywood1 burlywood2 burlywood3 burlywood4 wheat1 \ + wheat2 wheat3 wheat4 tan1 tan2 tan3 tan4 chocolate1 \ + chocolate2 chocolate3 chocolate4 firebrick1 firebrick2 \ + firebrick3 firebrick4 brown1 brown2 brown3 brown4 salmon1 \ + salmon2 salmon3 salmon4 LightSalmon1 LightSalmon2 \ + LightSalmon3 LightSalmon4 orange1 orange2 orange3 orange4 \ + DarkOrange1 DarkOrange2 DarkOrange3 DarkOrange4 coral1 \ + coral2 coral3 coral4 tomato1 tomato2 tomato3 tomato4 \ + OrangeRed1 OrangeRed2 OrangeRed3 OrangeRed4 red1 red2 red3 \ + red4 DeepPink1 DeepPink2 DeepPink3 DeepPink4 HotPink1 \ + HotPink2 HotPink3 HotPink4 pink1 pink2 pink3 pink4 \ + LightPink1 LightPink2 LightPink3 LightPink4 PaleVioletRed1 \ + PaleVioletRed2 PaleVioletRed3 PaleVioletRed4 maroon1 \ + maroon2 maroon3 maroon4 VioletRed1 VioletRed2 VioletRed3 \ + VioletRed4 magenta1 magenta2 magenta3 magenta4 orchid1 \ + orchid2 orchid3 orchid4 plum1 plum2 plum3 plum4 \ + MediumOrchid1 MediumOrchid2 MediumOrchid3 MediumOrchid4 \ + DarkOrchid1 DarkOrchid2 DarkOrchid3 DarkOrchid4 purple1 \ + purple2 purple3 purple4 MediumPurple1 MediumPurple2 \ + MediumPurple3 MediumPurple4 thistle1 thistle2 thistle3 \ + thistle4 diff --git a/env/tcl/tk8.6/demos/combo.tcl b/env/tcl/tk8.6/demos/combo.tcl new file mode 100644 index 0000000..8631904 --- /dev/null +++ b/env/tcl/tk8.6/demos/combo.tcl @@ -0,0 +1,61 @@ +# combo.tcl -- +# +# This demonstration script creates several combobox widgets. + +if {![info exists widgetDemo]} { + error "This script should be run from the \"widget\" demo." +} + +package require Tk + +set w .combo +catch {destroy $w} +toplevel $w +wm title $w "Combobox Demonstration" +wm iconname $w "combo" +positionWindow $w + +ttk::label $w.msg -font $font -wraplength 5i -justify left -text "Three different\ + combo-boxes are displayed below. You can add characters to the first\ + one by pointing, clicking and typing, just as with an entry; pressing\ + Return will cause the current value to be added to the list that is\ + selectable from the drop-down list, and you can choose other values\ + by pressing the Down key, using the arrow keys to pick another one,\ + and pressing Return again. The second combo-box is fixed to a\ + particular value, and cannot be modified at all. The third one only\ + allows you to select values from its drop-down list of Australian\ + cities." +pack $w.msg -side top -fill x + +## See Code / Dismiss buttons +set btns [addSeeDismiss $w.buttons $w {firstValue secondValue ozCity}] +pack $btns -side bottom -fill x + +ttk::frame $w.f +pack $w.f -fill both -expand 1 +set w $w.f + +set australianCities { + Canberra Sydney Melbourne Perth Adelaide Brisbane + Hobart Darwin "Alice Springs" +} +set secondValue unchangable +set ozCity Sydney + +ttk::labelframe $w.c1 -text "Fully Editable" +ttk::combobox $w.c1.c -textvariable firstValue +ttk::labelframe $w.c2 -text Disabled +ttk::combobox $w.c2.c -textvariable secondValue -state disabled +ttk::labelframe $w.c3 -text "Defined List Only" +ttk::combobox $w.c3.c -textvariable ozCity -state readonly \ + -values $australianCities +bind $w.c1.c { + if {[%W get] ni [%W cget -values]} { + %W configure -values [concat [%W cget -values] [list [%W get]]] + } +} + +pack $w.c1 $w.c2 $w.c3 -side top -pady 5 -padx 10 +pack $w.c1.c -pady 5 -padx 10 +pack $w.c2.c -pady 5 -padx 10 +pack $w.c3.c -pady 5 -padx 10 diff --git a/env/tcl/tk8.6/demos/cscroll.tcl b/env/tcl/tk8.6/demos/cscroll.tcl new file mode 100644 index 0000000..f6e88f4 --- /dev/null +++ b/env/tcl/tk8.6/demos/cscroll.tcl @@ -0,0 +1,108 @@ +# cscroll.tcl -- +# +# This demonstration script creates a simple canvas that can be +# scrolled in two dimensions. + +if {![info exists widgetDemo]} { + error "This script should be run from the \"widget\" demo." +} + +package require Tk + +set w .cscroll +catch {destroy $w} +toplevel $w +wm title $w "Scrollable Canvas Demonstration" +wm iconname $w "cscroll" +positionWindow $w +set c $w.c + +label $w.msg -font $font -wraplength 4i -justify left -text "This window displays a canvas widget that can be scrolled either using the scrollbars or by dragging with button 2 in the canvas. If you click button 1 on one of the rectangles, its indices will be printed on stdout." +pack $w.msg -side top + +## See Code / Dismiss buttons +set btns [addSeeDismiss $w.buttons $w] +pack $btns -side bottom -fill x + +frame $w.grid +scrollbar $w.hscroll -orient horiz -command "$c xview" +scrollbar $w.vscroll -command "$c yview" +canvas $c -relief sunken -borderwidth 2 -scrollregion {-11c -11c 50c 20c} \ + -xscrollcommand "$w.hscroll set" \ + -yscrollcommand "$w.vscroll set" +pack $w.grid -expand yes -fill both -padx 1 -pady 1 +grid rowconfig $w.grid 0 -weight 1 -minsize 0 +grid columnconfig $w.grid 0 -weight 1 -minsize 0 + +grid $c -padx 1 -in $w.grid -pady 1 \ + -row 0 -column 0 -rowspan 1 -columnspan 1 -sticky news +grid $w.vscroll -in $w.grid -padx 1 -pady 1 \ + -row 0 -column 1 -rowspan 1 -columnspan 1 -sticky news +grid $w.hscroll -in $w.grid -padx 1 -pady 1 \ + -row 1 -column 0 -rowspan 1 -columnspan 1 -sticky news + + +set bg [lindex [$c config -bg] 4] +for {set i 0} {$i < 20} {incr i} { + set x [expr {-10 + 3*$i}] + for {set j 0; set y -10} {$j < 10} {incr j; incr y 3} { + $c create rect ${x}c ${y}c [expr {$x+2}]c [expr {$y+2}]c \ + -outline black -fill $bg -tags rect + $c create text [expr {$x+1}]c [expr {$y+1}]c -text "$i,$j" \ + -anchor center -tags text + } +} + +$c bind all "scrollEnter $c" +$c bind all "scrollLeave $c" +$c bind all <1> "scrollButton $c" +bind $c <2> "$c scan mark %x %y" +bind $c "$c scan dragto %x %y" +if {[tk windowingsystem] eq "aqua"} { + bind $c { + %W yview scroll [expr {- (%D)}] units + } + bind $c { + %W yview scroll [expr {-10 * (%D)}] units + } + bind $c { + %W xview scroll [expr {- (%D)}] units + } + bind $c { + %W xview scroll [expr {-10 * (%D)}] units + } +} + +proc scrollEnter canvas { + global oldFill + set id [$canvas find withtag current] + if {[lsearch [$canvas gettags current] text] >= 0} { + set id [expr {$id-1}] + } + set oldFill [lindex [$canvas itemconfig $id -fill] 4] + if {[winfo depth $canvas] > 1} { + $canvas itemconfigure $id -fill SeaGreen1 + } else { + $canvas itemconfigure $id -fill black + $canvas itemconfigure [expr {$id+1}] -fill white + } +} + +proc scrollLeave canvas { + global oldFill + set id [$canvas find withtag current] + if {[lsearch [$canvas gettags current] text] >= 0} { + set id [expr {$id-1}] + } + $canvas itemconfigure $id -fill $oldFill + $canvas itemconfigure [expr {$id+1}] -fill black +} + +proc scrollButton canvas { + global oldFill + set id [$canvas find withtag current] + if {[lsearch [$canvas gettags current] text] < 0} { + set id [expr {$id+1}] + } + puts stdout "You buttoned at [lindex [$canvas itemconf $id -text] 4]" +} diff --git a/env/tcl/tk8.6/demos/ctext.tcl b/env/tcl/tk8.6/demos/ctext.tcl new file mode 100644 index 0000000..4b8c644 --- /dev/null +++ b/env/tcl/tk8.6/demos/ctext.tcl @@ -0,0 +1,172 @@ +# ctext.tcl -- +# +# This demonstration script creates a canvas widget with a text +# item that can be edited and reconfigured in various ways. + +if {![info exists widgetDemo]} { + error "This script should be run from the \"widget\" demo." +} + +package require Tk + +set w .ctext +catch {destroy $w} +toplevel $w +wm title $w "Canvas Text Demonstration" +wm iconname $w "Text" +positionWindow $w +set c $w.c + +label $w.msg -font $font -wraplength 5i -justify left -text "This window displays a string of text to demonstrate the text facilities of canvas widgets. You can click in the boxes to adjust the position of the text relative to its positioning point or change its justification, and on a pie slice to change its angle. The text also supports the following simple bindings for editing: + 1. You can point, click, and type. + 2. You can also select with button 1. + 3. You can copy the selection to the mouse position with button 2. + 4. Backspace and Control+h delete the selection if there is one; + otherwise they delete the character just before the insertion cursor. + 5. Delete deletes the selection if there is one; otherwise it deletes + the character just after the insertion cursor." +pack $w.msg -side top + +## See Code / Dismiss buttons +set btns [addSeeDismiss $w.buttons $w] +pack $btns -side bottom -fill x + +canvas $c -relief flat -borderwidth 0 -width 500 -height 350 +pack $w.c -side top -expand yes -fill both + +set textFont {Helvetica 24} + +$c create rectangle 245 195 255 205 -outline black -fill red + +# First, create the text item and give it bindings so it can be edited. + +$c addtag text withtag [$c create text 250 200 -text "This is just a string of text to demonstrate the text facilities of canvas widgets. Bindings have been been defined to support editing (see above)." -width 440 -anchor n -font $textFont -justify left] +$c bind text <1> "textB1Press $c %x %y" +$c bind text "textB1Move $c %x %y" +$c bind text "$c select adjust current @%x,%y" +$c bind text "textB1Move $c %x %y" +$c bind text "textInsert $c %A" +$c bind text "textInsert $c \\n" +$c bind text "textBs $c" +$c bind text "textBs $c" +$c bind text "textDel $c" +$c bind text <2> "textPaste $c @%x,%y" + +# Next, create some items that allow the text's anchor position +# to be edited. + +proc mkTextConfigBox {w x y option value color} { + set item [$w create rect $x $y [expr {$x+30}] [expr {$y+30}] \ + -outline black -fill $color -width 1] + $w bind $item <1> "$w itemconf text $option $value" + $w addtag config withtag $item +} +proc mkTextConfigPie {w x y a option value color} { + set item [$w create arc $x $y [expr {$x+90}] [expr {$y+90}] \ + -start [expr {$a-15}] -extent 30 -outline black -fill $color \ + -width 1] + $w bind $item <1> "$w itemconf text $option $value" + $w addtag config withtag $item +} + +set x 50 +set y 50 +set color LightSkyBlue1 +mkTextConfigBox $c $x $y -anchor se $color +mkTextConfigBox $c [expr {$x+30}] [expr {$y }] -anchor s $color +mkTextConfigBox $c [expr {$x+60}] [expr {$y }] -anchor sw $color +mkTextConfigBox $c [expr {$x }] [expr {$y+30}] -anchor e $color +mkTextConfigBox $c [expr {$x+30}] [expr {$y+30}] -anchor center $color +mkTextConfigBox $c [expr {$x+60}] [expr {$y+30}] -anchor w $color +mkTextConfigBox $c [expr {$x }] [expr {$y+60}] -anchor ne $color +mkTextConfigBox $c [expr {$x+30}] [expr {$y+60}] -anchor n $color +mkTextConfigBox $c [expr {$x+60}] [expr {$y+60}] -anchor nw $color +set item [$c create rect \ + [expr {$x+40}] [expr {$y+40}] [expr {$x+50}] [expr {$y+50}] \ + -outline black -fill red] +$c bind $item <1> "$c itemconf text -anchor center" +$c create text [expr {$x+45}] [expr {$y-5}] \ + -text {Text Position} -anchor s -font {Times 20} -fill brown + +# Now create some items that allow the text's angle to be changed. + +set x 205 +set y 50 +set color Yellow +mkTextConfigPie $c $x $y 0 -angle 90 $color +mkTextConfigPie $c $x $y 30 -angle 120 $color +mkTextConfigPie $c $x $y 60 -angle 150 $color +mkTextConfigPie $c $x $y 90 -angle 180 $color +mkTextConfigPie $c $x $y 120 -angle 210 $color +mkTextConfigPie $c $x $y 150 -angle 240 $color +mkTextConfigPie $c $x $y 180 -angle 270 $color +mkTextConfigPie $c $x $y 210 -angle 300 $color +mkTextConfigPie $c $x $y 240 -angle 330 $color +mkTextConfigPie $c $x $y 270 -angle 0 $color +mkTextConfigPie $c $x $y 300 -angle 30 $color +mkTextConfigPie $c $x $y 330 -angle 60 $color +$c create text [expr {$x+45}] [expr {$y-5}] \ + -text {Text Angle} -anchor s -font {Times 20} -fill brown + +# Lastly, create some items that allow the text's justification to be +# changed. + +set x 350 +set y 50 +set color SeaGreen2 +mkTextConfigBox $c $x $y -justify left $color +mkTextConfigBox $c [expr {$x+30}] $y -justify center $color +mkTextConfigBox $c [expr {$x+60}] $y -justify right $color +$c create text [expr {$x+45}] [expr {$y-5}] \ + -text {Justification} -anchor s -font {Times 20} -fill brown + +$c bind config "textEnter $c" +$c bind config "$c itemconf current -fill \$textConfigFill" + +set textConfigFill {} + +proc textEnter {w} { + global textConfigFill + set textConfigFill [lindex [$w itemconfig current -fill] 4] + $w itemconfig current -fill black +} + +proc textInsert {w string} { + if {$string == ""} { + return + } + catch {$w dchars text sel.first sel.last} + $w insert text insert $string +} + +proc textPaste {w pos} { + catch { + $w insert text $pos [selection get] + } +} + +proc textB1Press {w x y} { + $w icursor current @$x,$y + $w focus current + focus $w + $w select from current @$x,$y +} + +proc textB1Move {w x y} { + $w select to current @$x,$y +} + +proc textBs {w} { + if {![catch {$w dchars text sel.first sel.last}]} { + return + } + set char [expr {[$w index text insert] - 1}] + if {$char >= 0} {$w dchar text $char} +} + +proc textDel {w} { + if {![catch {$w dchars text sel.first sel.last}]} { + return + } + $w dchars text insert +} diff --git a/env/tcl/tk8.6/demos/dialog1.tcl b/env/tcl/tk8.6/demos/dialog1.tcl new file mode 100644 index 0000000..5c572be --- /dev/null +++ b/env/tcl/tk8.6/demos/dialog1.tcl @@ -0,0 +1,13 @@ +# dialog1.tcl -- +# +# This demonstration script creates a dialog box with a local grab. + +after idle {.dialog1.msg configure -wraplength 4i} +set i [tk_dialog .dialog1 "Dialog with local grab" {This is a modal dialog box. It uses Tk's "grab" command to create a "local grab" on the dialog box. The grab prevents any pointer-related events from getting to any other windows in the application until you have answered the dialog by invoking one of the buttons below. However, you can still interact with other applications.} \ +info 0 OK Cancel {Show Code}] + +switch $i { + 0 {puts "You pressed OK"} + 1 {puts "You pressed Cancel"} + 2 {showCode .dialog1} +} diff --git a/env/tcl/tk8.6/demos/dialog2.tcl b/env/tcl/tk8.6/demos/dialog2.tcl new file mode 100644 index 0000000..2f45da8 --- /dev/null +++ b/env/tcl/tk8.6/demos/dialog2.tcl @@ -0,0 +1,17 @@ +# dialog2.tcl -- +# +# This demonstration script creates a dialog box with a global grab. + +after idle { + .dialog2.msg configure -wraplength 4i +} +after 100 { + grab -global .dialog2 +} +set i [tk_dialog .dialog2 "Dialog with global grab" {This dialog box uses a global grab, so it prevents you from interacting with anything on your display until you invoke one of the buttons below. Global grabs are almost always a bad idea; don't use them unless you're truly desperate.} warning 0 OK Cancel {Show Code}] + +switch $i { + 0 {puts "You pressed OK"} + 1 {puts "You pressed Cancel"} + 2 {showCode .dialog2} +} diff --git a/env/tcl/tk8.6/demos/en.msg b/env/tcl/tk8.6/demos/en.msg new file mode 100644 index 0000000..05d4a64 --- /dev/null +++ b/env/tcl/tk8.6/demos/en.msg @@ -0,0 +1,97 @@ +::msgcat::mcset en "Widget Demonstration" +::msgcat::mcset en "tkWidgetDemo" +::msgcat::mcset en "&File" +::msgcat::mcset en "About..." +::msgcat::mcset en "&About..." +::msgcat::mcset en "" +::msgcat::mcset en "&Quit" +::msgcat::mcset en "Meta+Q" ;# Displayed hotkey +::msgcat::mcset en "Meta-q" ;# Actual binding sequence +::msgcat::mcset en "Ctrl+Q" ;# Displayed hotkey +::msgcat::mcset en "Control-q" ;# Actual binding sequence +::msgcat::mcset en "Variable values" +::msgcat::mcset en "Variable values:" +::msgcat::mcset en "OK" +::msgcat::mcset en "Run the \"%s\" sample program" +::msgcat::mcset en "Dismiss" +::msgcat::mcset en "Rerun Demo" +::msgcat::mcset en "Demo code: %s" +::msgcat::mcset en "About Widget Demo" +::msgcat::mcset en "Tk widget demonstration application" +::msgcat::mcset en "Copyright © %s" +::msgcat::mcset en " + @@title + Tk Widget Demonstrations + @@newline + @@normal + @@newline + + This application provides a front end for several short scripts + that demonstrate what you can do with Tk widgets. Each of the + numbered lines below describes a demonstration; you can click on + it to invoke the demonstration. Once the demonstration window + appears, you can click the + @@bold + See Code + @@normal + button to see the Tcl/Tk code that created the demonstration. If + you wish, you can edit the code and click the + @@bold + Rerun Demo + @@normal + button in the code window to reinvoke the demonstration with the + modified code. + @@newline +" +::msgcat::mcset en "Labels, buttons, checkbuttons, and radiobuttons" +::msgcat::mcset en "Labels (text and bitmaps)" +::msgcat::mcset en "Labels and UNICODE text" +::msgcat::mcset en "Buttons" +::msgcat::mcset en "Check-buttons (select any of a group)" +::msgcat::mcset en "Radio-buttons (select one of a group)" +::msgcat::mcset en "A 15-puzzle game made out of buttons" +::msgcat::mcset en "Iconic buttons that use bitmaps" +::msgcat::mcset en "Two labels displaying images" +::msgcat::mcset en "A simple user interface for viewing images" +::msgcat::mcset en "Labelled frames" +::msgcat::mcset en "Listboxes" +::msgcat::mcset en "The 50 states" +::msgcat::mcset en "Colors: change the color scheme for the application" +::msgcat::mcset en "A collection of famous and infamous sayings" +::msgcat::mcset en "Entries and Spin-boxes" +::msgcat::mcset en "Entries without scrollbars" +::msgcat::mcset en "Entries with scrollbars" +::msgcat::mcset en "Validated entries and password fields" +::msgcat::mcset en "Spin-boxes" +::msgcat::mcset en "Simple Rolodex-like form" +::msgcat::mcset en "Text" +::msgcat::mcset en "Basic editable text" +::msgcat::mcset en "Text display styles" +::msgcat::mcset en "Hypertext (tag bindings)" +::msgcat::mcset en "A text widget with embedded windows" +::msgcat::mcset en "A search tool built with a text widget" +::msgcat::mcset en "Canvases" +::msgcat::mcset en "The canvas item types" +::msgcat::mcset en "A simple 2-D plot" +::msgcat::mcset en "Text items in canvases" +::msgcat::mcset en "An editor for arrowheads on canvas lines" +::msgcat::mcset en "A ruler with adjustable tab stops" +::msgcat::mcset en "A building floor plan" +::msgcat::mcset en "A simple scrollable canvas" +::msgcat::mcset en "Scales" +::msgcat::mcset en "Horizontal scale" +::msgcat::mcset en "Vertical scale" +::msgcat::mcset en "Paned Windows" +::msgcat::mcset en "Horizontal paned window" +::msgcat::mcset en "Vertical paned window" +::msgcat::mcset en "Menus" +::msgcat::mcset en "Menus and cascades (sub-menus)" +::msgcat::mcset en "Menu-buttons" +::msgcat::mcset en "Common Dialogs" +::msgcat::mcset en "Message boxes" +::msgcat::mcset en "File selection dialog" +::msgcat::mcset en "Color picker" +::msgcat::mcset en "Miscellaneous" +::msgcat::mcset en "The built-in bitmaps" +::msgcat::mcset en "A dialog box with a local grab" +::msgcat::mcset en "A dialog box with a global grab" diff --git a/env/tcl/tk8.6/demos/entry1.tcl b/env/tcl/tk8.6/demos/entry1.tcl new file mode 100644 index 0000000..eef8964 --- /dev/null +++ b/env/tcl/tk8.6/demos/entry1.tcl @@ -0,0 +1,34 @@ +# entry1.tcl -- +# +# This demonstration script creates several entry widgets without +# scrollbars. + +if {![info exists widgetDemo]} { + error "This script should be run from the \"widget\" demo." +} + +package require Tk + +set w .entry1 +catch {destroy $w} +toplevel $w +wm title $w "Entry Demonstration (no scrollbars)" +wm iconname $w "entry1" +positionWindow $w + +label $w.msg -font $font -wraplength 5i -justify left -text "Three different entries are displayed below. You can add characters by pointing, clicking and typing. The normal Motif editing characters are supported, along with many Emacs bindings. For example, Backspace and Control-h delete the character to the left of the insertion cursor and Delete and Control-d delete the chararacter to the right of the insertion cursor. For entries that are too large to fit in the window all at once, you can scan through the entries by dragging with mouse button2 pressed." +pack $w.msg -side top + +## See Code / Dismiss buttons +set btns [addSeeDismiss $w.buttons $w] +pack $btns -side bottom -fill x + +entry $w.e1 +entry $w.e2 +entry $w.e3 +pack $w.e1 $w.e2 $w.e3 -side top -pady 5 -padx 10 -fill x + +$w.e1 insert 0 "Initial value" +$w.e2 insert end "This entry contains a long value, much too long " +$w.e2 insert end "to fit in the window at one time, so long in fact " +$w.e2 insert end "that you'll have to scan or scroll to see the end." diff --git a/env/tcl/tk8.6/demos/entry2.tcl b/env/tcl/tk8.6/demos/entry2.tcl new file mode 100644 index 0000000..9e3f4ef --- /dev/null +++ b/env/tcl/tk8.6/demos/entry2.tcl @@ -0,0 +1,46 @@ +# entry2.tcl -- +# +# This demonstration script is the same as the entry1.tcl script +# except that it creates scrollbars for the entries. + +if {![info exists widgetDemo]} { + error "This script should be run from the \"widget\" demo." +} + +package require Tk + +set w .entry2 +catch {destroy $w} +toplevel $w +wm title $w "Entry Demonstration (with scrollbars)" +wm iconname $w "entry2" +positionWindow $w + +label $w.msg -font $font -wraplength 5i -justify left -text "Three different entries are displayed below, with a scrollbar for each entry. You can add characters by pointing, clicking and typing. The normal Motif editing characters are supported, along with many Emacs bindings. For example, Backspace and Control-h delete the character to the left of the insertion cursor and Delete and Control-d delete the chararacter to the right of the insertion cursor. For entries that are too large to fit in the window all at once, you can scan through the entries with the scrollbars, or by dragging with mouse button2 pressed." +pack $w.msg -side top + +## See Code / Dismiss buttons +set btns [addSeeDismiss $w.buttons $w] +pack $btns -side bottom -fill x + +frame $w.frame -borderwidth 10 +pack $w.frame -side top -fill x -expand 1 + +entry $w.frame.e1 -xscrollcommand "$w.frame.s1 set" +ttk::scrollbar $w.frame.s1 -orient horiz -command \ + "$w.frame.e1 xview" +frame $w.frame.spacer1 -width 20 -height 10 +entry $w.frame.e2 -xscrollcommand "$w.frame.s2 set" +ttk::scrollbar $w.frame.s2 -orient horiz -command \ + "$w.frame.e2 xview" +frame $w.frame.spacer2 -width 20 -height 10 +entry $w.frame.e3 -xscrollcommand "$w.frame.s3 set" +ttk::scrollbar $w.frame.s3 -orient horiz -command \ + "$w.frame.e3 xview" +pack $w.frame.e1 $w.frame.s1 $w.frame.spacer1 $w.frame.e2 $w.frame.s2 \ + $w.frame.spacer2 $w.frame.e3 $w.frame.s3 -side top -fill x + +$w.frame.e1 insert 0 "Initial value" +$w.frame.e2 insert end "This entry contains a long value, much too long " +$w.frame.e2 insert end "to fit in the window at one time, so long in fact " +$w.frame.e2 insert end "that you'll have to scan or scroll to see the end." diff --git a/env/tcl/tk8.6/demos/entry3.tcl b/env/tcl/tk8.6/demos/entry3.tcl new file mode 100644 index 0000000..d4435c6 --- /dev/null +++ b/env/tcl/tk8.6/demos/entry3.tcl @@ -0,0 +1,185 @@ +# entry3.tcl -- +# +# This demonstration script creates several entry widgets whose +# permitted input is constrained in some way. It also shows off a +# password entry. + +if {![info exists widgetDemo]} { + error "This script should be run from the \"widget\" demo." +} + +package require Tk + +set w .entry3 +catch {destroy $w} +toplevel $w +wm title $w "Constrained Entry Demonstration" +wm iconname $w "entry3" +positionWindow $w + +label $w.msg -font $font -wraplength 5i -justify left -text "Four different\ + entries are displayed below. You can add characters by pointing,\ + clicking and typing, though each is constrained in what it will\ + accept. The first only accepts 32-bit integers or the empty string\ + (checking when focus leaves it) and will flash to indicate any\ + problem. The second only accepts strings with fewer than ten\ + characters and sounds the bell when an attempt to go over the limit\ + is made. The third accepts US phone numbers, mapping letters to\ + their digit equivalent and sounding the bell on encountering an\ + illegal character or if trying to type over a character that is not\ + a digit. The fourth is a password field that accepts up to eight\ + characters (silently ignoring further ones), and displaying them as\ + asterisk characters." + +## See Code / Dismiss buttons +set btns [addSeeDismiss $w.buttons $w] +pack $btns -side bottom -fill x + +# focusAndFlash -- +# Error handler for entry widgets that forces the focus onto the +# widget and makes the widget flash by exchanging the foreground and +# background colours at intervals of 200ms (i.e. at approximately +# 2.5Hz). +# +# Arguments: +# W - Name of entry widget to flash +# fg - Initial foreground colour +# bg - Initial background colour +# count - Counter to control the number of times flashed + +proc focusAndFlash {W fg bg {count 9}} { + focus -force $W + if {$count<1} { + $W configure -foreground $fg -background $bg + } else { + if {$count%2} { + $W configure -foreground $bg -background $fg + } else { + $W configure -foreground $fg -background $bg + } + after 200 [list focusAndFlash $W $fg $bg [expr {$count-1}]] + } +} + +labelframe $w.l1 -text "Integer Entry" +# Alternatively try using {string is digit} for arbitrary length numbers, +# and not just 32-bit ones. +entry $w.l1.e -validate focus -vcmd {string is integer %P} +$w.l1.e configure -invalidcommand \ + "focusAndFlash %W [$w.l1.e cget -fg] [$w.l1.e cget -bg]" +pack $w.l1.e -fill x -expand 1 -padx 1m -pady 1m + +labelframe $w.l2 -text "Length-Constrained Entry" +entry $w.l2.e -validate key -invcmd bell -vcmd {expr {[string length %P]<10}} +pack $w.l2.e -fill x -expand 1 -padx 1m -pady 1m + +### PHONE NUMBER ENTRY ### +# Note that the source to this is quite a bit longer as the behaviour +# demonstrated is a lot more ambitious than with the others. + +# Initial content for the third entry widget +set entry3content "1-(000)-000-0000" +# Mapping from alphabetic characters to numbers. This is probably +# wrong, but it is the only mapping I have; the UK doesn't really go +# for associating letters with digits for some reason. +set phoneNumberMap {} +foreach {chars digit} {abc 2 def 3 ghi 4 jkl 5 mno 6 pqrs 7 tuv 8 wxyz 9} { + foreach char [split $chars ""] { + lappend phoneNumberMap $char $digit [string toupper $char] $digit + } +} + +# validatePhoneChange -- +# Checks that the replacement (mapped to a digit) of the given +# character in an entry widget at the given position will leave a +# valid phone number in the widget. +# +# W - The entry widget to validate +# vmode - The widget's validation mode +# idx - The index where replacement is to occur +# char - The character (or string, though that will always be +# refused) to be overwritten at that point. + +proc validatePhoneChange {W vmode idx char} { + global phoneNumberMap entry3content + if {$idx == -1} {return 1} + after idle [list $W configure -validate $vmode -invcmd bell] + if { + !($idx<3 || $idx==6 || $idx==7 || $idx==11 || $idx>15) && + [string match {[0-9A-Za-z]} $char] + } then { + $W delete $idx + $W insert $idx [string map $phoneNumberMap $char] + after idle [list phoneSkipRight $W -1] + return 1 + } + return 0 +} + +# phoneSkipLeft -- +# Skip over fixed characters in a phone-number string when moving left. +# +# Arguments: +# W - The entry widget containing the phone-number. + +proc phoneSkipLeft {W} { + set idx [$W index insert] + if {$idx == 8} { + # Skip back two extra characters + $W icursor [incr idx -2] + } elseif {$idx == 7 || $idx == 12} { + # Skip back one extra character + $W icursor [incr idx -1] + } elseif {$idx <= 3} { + # Can't move any further + bell + return -code break + } +} + +# phoneSkipRight -- +# Skip over fixed characters in a phone-number string when moving right. +# +# Arguments: +# W - The entry widget containing the phone-number. +# add - Offset to add to index before calculation (used by validation.) + +proc phoneSkipRight {W {add 0}} { + set idx [$W index insert] + if {$idx+$add == 5} { + # Skip forward two extra characters + $W icursor [incr idx 2] + } elseif {$idx+$add == 6 || $idx+$add == 10} { + # Skip forward one extra character + $W icursor [incr idx] + } elseif {$idx+$add == 15 && !$add} { + # Can't move any further + bell + return -code break + } +} + +labelframe $w.l3 -text "US Phone-Number Entry" +entry $w.l3.e -validate key -invcmd bell -textvariable entry3content \ + -vcmd {validatePhoneChange %W %v %i %S} +# Click to focus goes to the first editable character... +bind $w.l3.e { + if {"%d" ne "NotifyAncestor"} { + %W icursor 3 + after idle {%W selection clear} + } +} +bind $w.l3.e <> {phoneSkipLeft %W} +bind $w.l3.e <> {phoneSkipRight %W} +pack $w.l3.e -fill x -expand 1 -padx 1m -pady 1m + +labelframe $w.l4 -text "Password Entry" +entry $w.l4.e -validate key -show "*" -vcmd {expr {[string length %P]<=8}} +pack $w.l4.e -fill x -expand 1 -padx 1m -pady 1m + +lower [frame $w.mid] +grid $w.l1 $w.l2 -in $w.mid -padx 3m -pady 1m -sticky ew +grid $w.l3 $w.l4 -in $w.mid -padx 3m -pady 1m -sticky ew +grid columnconfigure $w.mid {0 1} -uniform 1 +pack $w.msg -side top +pack $w.mid -fill both -expand 1 diff --git a/env/tcl/tk8.6/demos/filebox.tcl b/env/tcl/tk8.6/demos/filebox.tcl new file mode 100644 index 0000000..e06ebba --- /dev/null +++ b/env/tcl/tk8.6/demos/filebox.tcl @@ -0,0 +1,81 @@ +# filebox.tcl -- +# +# This demonstration script prompts the user to select a file. + +if {![info exists widgetDemo]} { + error "This script should be run from the \"widget\" demo." +} + +package require Tk + +set w .filebox +catch {destroy $w} +toplevel $w +wm title $w "File Selection Dialogs" +wm iconname $w "filebox" +positionWindow $w + +ttk::frame $w._bg +place $w._bg -x 0 -y 0 -relwidth 1 -relheight 1 + +ttk::label $w.msg -font $font -wraplength 4i -justify left -text "Enter a file name in the entry box or click on the \"Browse\" buttons to select a file name using the file selection dialog." +pack $w.msg -side top + +## See Code / Dismiss buttons +set btns [addSeeDismiss $w.buttons $w] +pack $btns -side bottom -fill x + +foreach i {open save} { + set f [ttk::frame $w.$i] + ttk::label $f.lab -text "Select a file to $i: " -anchor e + ttk::entry $f.ent -width 20 + ttk::button $f.but -text "Browse ..." -command "fileDialog $w $f.ent $i" + pack $f.lab -side left + pack $f.ent -side left -expand yes -fill x + pack $f.but -side left + pack $f -fill x -padx 1c -pady 3 +} + +if {[tk windowingsystem] eq "x11"} { + ttk::checkbutton $w.strict -text "Use Motif Style Dialog" \ + -variable tk_strictMotif -onvalue 1 -offvalue 0 + pack $w.strict -anchor c + + # This binding ensures that we don't run the rest of the demos + # with motif style interactions + bind $w.strict {set tk_strictMotif 0} +} + +proc fileDialog {w ent operation} { + # Type names Extension(s) Mac File Type(s) + # + #--------------------------------------------------------- + set types { + {"Text files" {.txt .doc} } + {"Text files" {} TEXT} + {"Tcl Scripts" {.tcl} TEXT} + {"C Source Files" {.c .h} } + {"All Source Files" {.tcl .c .h} } + {"Image Files" {.gif} } + {"Image Files" {.jpeg .jpg} } + {"Image Files" "" {GIFF JPEG}} + {"All files" *} + } + if {$operation == "open"} { + global selected_type + if {![info exists selected_type]} { + set selected_type "Tcl Scripts" + } + set file [tk_getOpenFile -filetypes $types -parent $w \ + -typevariable selected_type] + puts "You selected filetype \"$selected_type\"" + } else { + set file [tk_getSaveFile -filetypes $types -parent $w \ + -initialfile Untitled -defaultextension .txt] + } + if {[string compare $file ""]} { + $ent delete 0 end + $ent insert 0 $file + $ent xview end + } +} diff --git a/env/tcl/tk8.6/demos/floor.tcl b/env/tcl/tk8.6/demos/floor.tcl new file mode 100644 index 0000000..c36979b --- /dev/null +++ b/env/tcl/tk8.6/demos/floor.tcl @@ -0,0 +1,1366 @@ +# floor.tcl -- +# +# This demonstration script creates a canvas widet that displays the +# floorplan for DEC's Western Research Laboratory. + +if {![info exists widgetDemo]} { + error "This script should be run from the \"widget\" demo." +} + +package require Tk + +# floorDisplay -- +# Recreate the floorplan display in the canvas given by "w". The +# floor given by "active" is displayed on top with its office structure +# visible. +# +# Arguments: +# w - Name of the canvas window. +# active - Number of active floor (1, 2, or 3). + +proc floorDisplay {w active} { + global floorLabels floorItems colors activeFloor + + if {$activeFloor == $active} { + return + } + + $w delete all + set activeFloor $active + + # First go through the three floors, displaying the backgrounds for + # each floor. + + bg1 $w $colors(bg1) $colors(outline1) + bg2 $w $colors(bg2) $colors(outline2) + bg3 $w $colors(bg3) $colors(outline3) + + # Raise the background for the active floor so that it's on top. + + $w raise floor$active + + # Create a dummy item just to mark this point in the display list, + # so we can insert highlights here. + + $w create rect 0 100 1 101 -fill {} -outline {} -tags marker + + # Add the walls and labels for the active floor, along with + # transparent polygons that define the rooms on the floor. + # Make sure that the room polygons are on top. + + catch {unset floorLabels} + catch {unset floorItems} + fg$active $w $colors(offices) + $w raise room + + # Offset the floors diagonally from each other. + + $w move floor1 2c 2c + $w move floor2 1c 1c + + # Create items for the room entry and its label. + + $w create window 600 100 -anchor w -window $w.entry + $w create text 600 100 -anchor e -text "Room: " + $w config -scrollregion [$w bbox all] +} + +# newRoom -- +# This procedure is invoked whenever the mouse enters a room +# in the floorplan. It changes tags so that the current room is +# highlighted. +# +# Arguments: +# w - The name of the canvas window. + +proc newRoom w { + global currentRoom floorLabels + + set id [$w find withtag current] + if {$id != ""} { + set currentRoom $floorLabels($id) + } + update idletasks +} + +# roomChanged -- +# This procedure is invoked whenever the currentRoom variable changes. +# It highlights the current room and unhighlights any previous room. +# +# Arguments: +# w - The canvas window displaying the floorplan. +# args - Not used. + +proc roomChanged {w args} { + global currentRoom floorItems colors + $w delete highlight + if {[catch {set item $floorItems($currentRoom)}]} { + return + } + set new [eval \ + "$w create polygon [$w coords $item] -fill $colors(active) \ + -tags highlight"] + $w raise $new marker +} + +# bg1 -- +# This procedure represents part of the floorplan database. When +# invoked, it instantiates the background information for the first +# floor. +# +# Arguments: +# w - The canvas window. +# fill - Fill color to use for the floor's background. +# outline - Color to use for the floor's outline. + +proc bg1 {w fill outline} { + $w create poly 347 80 349 82 351 84 353 85 363 92 375 99 386 104 \ + 386 129 398 129 398 162 484 162 484 129 559 129 559 133 725 \ + 133 725 129 802 129 802 389 644 389 644 391 559 391 559 327 \ + 508 327 508 311 484 311 484 278 395 278 395 288 400 288 404 \ + 288 409 290 413 292 418 297 421 302 422 309 421 318 417 325 \ + 411 330 405 332 397 333 344 333 340 334 336 336 335 338 332 \ + 342 331 347 332 351 334 354 336 357 341 359 340 360 335 363 \ + 331 365 326 366 304 366 304 355 258 355 258 387 60 387 60 391 \ + 0 391 0 337 3 337 3 114 8 114 8 25 30 25 30 5 93 5 98 5 104 7 \ + 110 10 116 16 119 20 122 28 123 32 123 68 220 68 220 34 221 \ + 22 223 17 227 13 231 8 236 4 242 2 246 0 260 0 283 1 300 5 \ + 321 14 335 22 348 25 365 29 363 39 358 48 352 56 337 70 \ + 344 76 347 80 \ + -tags {floor1 bg} -fill $fill + $w create line 386 129 398 129 -fill $outline -tags {floor1 bg} + $w create line 258 355 258 387 -fill $outline -tags {floor1 bg} + $w create line 60 387 60 391 -fill $outline -tags {floor1 bg} + $w create line 0 337 0 391 -fill $outline -tags {floor1 bg} + $w create line 60 391 0 391 -fill $outline -tags {floor1 bg} + $w create line 3 114 3 337 -fill $outline -tags {floor1 bg} + $w create line 258 387 60 387 -fill $outline -tags {floor1 bg} + $w create line 484 162 398 162 -fill $outline -tags {floor1 bg} + $w create line 398 162 398 129 -fill $outline -tags {floor1 bg} + $w create line 484 278 484 311 -fill $outline -tags {floor1 bg} + $w create line 484 311 508 311 -fill $outline -tags {floor1 bg} + $w create line 508 327 508 311 -fill $outline -tags {floor1 bg} + $w create line 559 327 508 327 -fill $outline -tags {floor1 bg} + $w create line 644 391 559 391 -fill $outline -tags {floor1 bg} + $w create line 644 389 644 391 -fill $outline -tags {floor1 bg} + $w create line 559 129 484 129 -fill $outline -tags {floor1 bg} + $w create line 484 162 484 129 -fill $outline -tags {floor1 bg} + $w create line 725 133 559 133 -fill $outline -tags {floor1 bg} + $w create line 559 129 559 133 -fill $outline -tags {floor1 bg} + $w create line 725 129 802 129 -fill $outline -tags {floor1 bg} + $w create line 802 389 802 129 -fill $outline -tags {floor1 bg} + $w create line 3 337 0 337 -fill $outline -tags {floor1 bg} + $w create line 559 391 559 327 -fill $outline -tags {floor1 bg} + $w create line 802 389 644 389 -fill $outline -tags {floor1 bg} + $w create line 725 133 725 129 -fill $outline -tags {floor1 bg} + $w create line 8 25 8 114 -fill $outline -tags {floor1 bg} + $w create line 8 114 3 114 -fill $outline -tags {floor1 bg} + $w create line 30 25 8 25 -fill $outline -tags {floor1 bg} + $w create line 484 278 395 278 -fill $outline -tags {floor1 bg} + $w create line 30 25 30 5 -fill $outline -tags {floor1 bg} + $w create line 93 5 30 5 -fill $outline -tags {floor1 bg} + $w create line 98 5 93 5 -fill $outline -tags {floor1 bg} + $w create line 104 7 98 5 -fill $outline -tags {floor1 bg} + $w create line 110 10 104 7 -fill $outline -tags {floor1 bg} + $w create line 116 16 110 10 -fill $outline -tags {floor1 bg} + $w create line 119 20 116 16 -fill $outline -tags {floor1 bg} + $w create line 122 28 119 20 -fill $outline -tags {floor1 bg} + $w create line 123 32 122 28 -fill $outline -tags {floor1 bg} + $w create line 123 68 123 32 -fill $outline -tags {floor1 bg} + $w create line 220 68 123 68 -fill $outline -tags {floor1 bg} + $w create line 386 129 386 104 -fill $outline -tags {floor1 bg} + $w create line 386 104 375 99 -fill $outline -tags {floor1 bg} + $w create line 375 99 363 92 -fill $outline -tags {floor1 bg} + $w create line 353 85 363 92 -fill $outline -tags {floor1 bg} + $w create line 220 68 220 34 -fill $outline -tags {floor1 bg} + $w create line 337 70 352 56 -fill $outline -tags {floor1 bg} + $w create line 352 56 358 48 -fill $outline -tags {floor1 bg} + $w create line 358 48 363 39 -fill $outline -tags {floor1 bg} + $w create line 363 39 365 29 -fill $outline -tags {floor1 bg} + $w create line 365 29 348 25 -fill $outline -tags {floor1 bg} + $w create line 348 25 335 22 -fill $outline -tags {floor1 bg} + $w create line 335 22 321 14 -fill $outline -tags {floor1 bg} + $w create line 321 14 300 5 -fill $outline -tags {floor1 bg} + $w create line 300 5 283 1 -fill $outline -tags {floor1 bg} + $w create line 283 1 260 0 -fill $outline -tags {floor1 bg} + $w create line 260 0 246 0 -fill $outline -tags {floor1 bg} + $w create line 246 0 242 2 -fill $outline -tags {floor1 bg} + $w create line 242 2 236 4 -fill $outline -tags {floor1 bg} + $w create line 236 4 231 8 -fill $outline -tags {floor1 bg} + $w create line 231 8 227 13 -fill $outline -tags {floor1 bg} + $w create line 223 17 227 13 -fill $outline -tags {floor1 bg} + $w create line 221 22 223 17 -fill $outline -tags {floor1 bg} + $w create line 220 34 221 22 -fill $outline -tags {floor1 bg} + $w create line 340 360 335 363 -fill $outline -tags {floor1 bg} + $w create line 335 363 331 365 -fill $outline -tags {floor1 bg} + $w create line 331 365 326 366 -fill $outline -tags {floor1 bg} + $w create line 326 366 304 366 -fill $outline -tags {floor1 bg} + $w create line 304 355 304 366 -fill $outline -tags {floor1 bg} + $w create line 395 288 400 288 -fill $outline -tags {floor1 bg} + $w create line 404 288 400 288 -fill $outline -tags {floor1 bg} + $w create line 409 290 404 288 -fill $outline -tags {floor1 bg} + $w create line 413 292 409 290 -fill $outline -tags {floor1 bg} + $w create line 418 297 413 292 -fill $outline -tags {floor1 bg} + $w create line 421 302 418 297 -fill $outline -tags {floor1 bg} + $w create line 422 309 421 302 -fill $outline -tags {floor1 bg} + $w create line 421 318 422 309 -fill $outline -tags {floor1 bg} + $w create line 421 318 417 325 -fill $outline -tags {floor1 bg} + $w create line 417 325 411 330 -fill $outline -tags {floor1 bg} + $w create line 411 330 405 332 -fill $outline -tags {floor1 bg} + $w create line 405 332 397 333 -fill $outline -tags {floor1 bg} + $w create line 397 333 344 333 -fill $outline -tags {floor1 bg} + $w create line 344 333 340 334 -fill $outline -tags {floor1 bg} + $w create line 340 334 336 336 -fill $outline -tags {floor1 bg} + $w create line 336 336 335 338 -fill $outline -tags {floor1 bg} + $w create line 335 338 332 342 -fill $outline -tags {floor1 bg} + $w create line 331 347 332 342 -fill $outline -tags {floor1 bg} + $w create line 332 351 331 347 -fill $outline -tags {floor1 bg} + $w create line 334 354 332 351 -fill $outline -tags {floor1 bg} + $w create line 336 357 334 354 -fill $outline -tags {floor1 bg} + $w create line 341 359 336 357 -fill $outline -tags {floor1 bg} + $w create line 341 359 340 360 -fill $outline -tags {floor1 bg} + $w create line 395 288 395 278 -fill $outline -tags {floor1 bg} + $w create line 304 355 258 355 -fill $outline -tags {floor1 bg} + $w create line 347 80 344 76 -fill $outline -tags {floor1 bg} + $w create line 344 76 337 70 -fill $outline -tags {floor1 bg} + $w create line 349 82 347 80 -fill $outline -tags {floor1 bg} + $w create line 351 84 349 82 -fill $outline -tags {floor1 bg} + $w create line 353 85 351 84 -fill $outline -tags {floor1 bg} +} + +# bg2 -- +# This procedure represents part of the floorplan database. When +# invoked, it instantiates the background information for the second +# floor. +# +# Arguments: +# w - The canvas window. +# fill - Fill color to use for the floor's background. +# outline - Color to use for the floor's outline. + +proc bg2 {w fill outline} { + $w create poly 559 129 484 129 484 162 398 162 398 129 315 129 \ + 315 133 176 133 176 129 96 129 96 133 3 133 3 339 0 339 0 391 \ + 60 391 60 387 258 387 258 329 350 329 350 311 395 311 395 280 \ + 484 280 484 311 508 311 508 327 558 327 558 391 644 391 644 \ + 367 802 367 802 129 725 129 725 133 559 133 559 129 \ + -tags {floor2 bg} -fill $fill + $w create line 350 311 350 329 -fill $outline -tags {floor2 bg} + $w create line 398 129 398 162 -fill $outline -tags {floor2 bg} + $w create line 802 367 802 129 -fill $outline -tags {floor2 bg} + $w create line 802 129 725 129 -fill $outline -tags {floor2 bg} + $w create line 725 133 725 129 -fill $outline -tags {floor2 bg} + $w create line 559 129 559 133 -fill $outline -tags {floor2 bg} + $w create line 559 133 725 133 -fill $outline -tags {floor2 bg} + $w create line 484 162 484 129 -fill $outline -tags {floor2 bg} + $w create line 559 129 484 129 -fill $outline -tags {floor2 bg} + $w create line 802 367 644 367 -fill $outline -tags {floor2 bg} + $w create line 644 367 644 391 -fill $outline -tags {floor2 bg} + $w create line 644 391 558 391 -fill $outline -tags {floor2 bg} + $w create line 558 327 558 391 -fill $outline -tags {floor2 bg} + $w create line 558 327 508 327 -fill $outline -tags {floor2 bg} + $w create line 508 327 508 311 -fill $outline -tags {floor2 bg} + $w create line 484 311 508 311 -fill $outline -tags {floor2 bg} + $w create line 484 280 484 311 -fill $outline -tags {floor2 bg} + $w create line 398 162 484 162 -fill $outline -tags {floor2 bg} + $w create line 484 280 395 280 -fill $outline -tags {floor2 bg} + $w create line 395 280 395 311 -fill $outline -tags {floor2 bg} + $w create line 258 387 60 387 -fill $outline -tags {floor2 bg} + $w create line 3 133 3 339 -fill $outline -tags {floor2 bg} + $w create line 3 339 0 339 -fill $outline -tags {floor2 bg} + $w create line 60 391 0 391 -fill $outline -tags {floor2 bg} + $w create line 0 339 0 391 -fill $outline -tags {floor2 bg} + $w create line 60 387 60 391 -fill $outline -tags {floor2 bg} + $w create line 258 329 258 387 -fill $outline -tags {floor2 bg} + $w create line 350 329 258 329 -fill $outline -tags {floor2 bg} + $w create line 395 311 350 311 -fill $outline -tags {floor2 bg} + $w create line 398 129 315 129 -fill $outline -tags {floor2 bg} + $w create line 176 133 315 133 -fill $outline -tags {floor2 bg} + $w create line 176 129 96 129 -fill $outline -tags {floor2 bg} + $w create line 3 133 96 133 -fill $outline -tags {floor2 bg} + $w create line 315 133 315 129 -fill $outline -tags {floor2 bg} + $w create line 176 133 176 129 -fill $outline -tags {floor2 bg} + $w create line 96 133 96 129 -fill $outline -tags {floor2 bg} +} + +# bg3 -- +# This procedure represents part of the floorplan database. When +# invoked, it instantiates the background information for the third +# floor. +# +# Arguments: +# w - The canvas window. +# fill - Fill color to use for the floor's background. +# outline - Color to use for the floor's outline. + +proc bg3 {w fill outline} { + $w create poly 159 300 107 300 107 248 159 248 159 129 96 129 96 \ + 133 21 133 21 331 0 331 0 391 60 391 60 370 159 370 159 300 \ + -tags {floor3 bg} -fill $fill + $w create poly 258 370 258 329 350 329 350 311 399 311 399 129 \ + 315 129 315 133 176 133 176 129 159 129 159 370 258 370 \ + -tags {floor3 bg} -fill $fill + $w create line 96 133 96 129 -fill $outline -tags {floor3 bg} + $w create line 176 129 96 129 -fill $outline -tags {floor3 bg} + $w create line 176 129 176 133 -fill $outline -tags {floor3 bg} + $w create line 315 133 176 133 -fill $outline -tags {floor3 bg} + $w create line 315 133 315 129 -fill $outline -tags {floor3 bg} + $w create line 399 129 315 129 -fill $outline -tags {floor3 bg} + $w create line 399 311 399 129 -fill $outline -tags {floor3 bg} + $w create line 399 311 350 311 -fill $outline -tags {floor3 bg} + $w create line 350 329 350 311 -fill $outline -tags {floor3 bg} + $w create line 350 329 258 329 -fill $outline -tags {floor3 bg} + $w create line 258 370 258 329 -fill $outline -tags {floor3 bg} + $w create line 60 370 258 370 -fill $outline -tags {floor3 bg} + $w create line 60 370 60 391 -fill $outline -tags {floor3 bg} + $w create line 60 391 0 391 -fill $outline -tags {floor3 bg} + $w create line 0 391 0 331 -fill $outline -tags {floor3 bg} + $w create line 21 331 0 331 -fill $outline -tags {floor3 bg} + $w create line 21 331 21 133 -fill $outline -tags {floor3 bg} + $w create line 96 133 21 133 -fill $outline -tags {floor3 bg} + $w create line 107 300 159 300 159 248 107 248 107 300 \ + -fill $outline -tags {floor3 bg} +} + +# fg1 -- +# This procedure represents part of the floorplan database. When +# invoked, it instantiates the foreground information for the first +# floor (office outlines and numbers). +# +# Arguments: +# w - The canvas window. +# color - Color to use for drawing foreground information. + +proc fg1 {w color} { + global floorLabels floorItems + set i [$w create polygon 375 246 375 172 341 172 341 246 -fill {} -tags {floor1 room}] + set floorLabels($i) 101 + set {floorItems(101)} $i + $w create text 358 209 -text 101 -fill $color -anchor c -tags {floor1 label} + set i [$w create polygon 307 240 339 240 339 206 307 206 -fill {} -tags {floor1 room}] + set floorLabels($i) {Pub Lift1} + set {floorItems(Pub Lift1)} $i + $w create text 323 223 -text {Pub Lift1} -fill $color -anchor c -tags {floor1 label} + set i [$w create polygon 339 205 307 205 307 171 339 171 -fill {} -tags {floor1 room}] + set floorLabels($i) {Priv Lift1} + set {floorItems(Priv Lift1)} $i + $w create text 323 188 -text {Priv Lift1} -fill $color -anchor c -tags {floor1 label} + set i [$w create polygon 42 389 42 337 1 337 1 389 -fill {} -tags {floor1 room}] + set floorLabels($i) 110 + set {floorItems(110)} $i + $w create text 21.5 363 -text 110 -fill $color -anchor c -tags {floor1 label} + set i [$w create polygon 59 389 59 385 90 385 90 337 44 337 44 389 -fill {} -tags {floor1 room}] + set floorLabels($i) 109 + set {floorItems(109)} $i + $w create text 67 363 -text 109 -fill $color -anchor c -tags {floor1 label} + set i [$w create polygon 51 300 51 253 6 253 6 300 -fill {} -tags {floor1 room}] + set floorLabels($i) 111 + set {floorItems(111)} $i + $w create text 28.5 276.5 -text 111 -fill $color -anchor c -tags {floor1 label} + set i [$w create polygon 98 248 98 309 79 309 79 248 -fill {} -tags {floor1 room}] + set floorLabels($i) 117B + set {floorItems(117B)} $i + $w create text 88.5 278.5 -text 117B -fill $color -anchor c -tags {floor1 label} + set i [$w create polygon 51 251 51 204 6 204 6 251 -fill {} -tags {floor1 room}] + set floorLabels($i) 112 + set {floorItems(112)} $i + $w create text 28.5 227.5 -text 112 -fill $color -anchor c -tags {floor1 label} + set i [$w create polygon 6 156 51 156 51 203 6 203 -fill {} -tags {floor1 room}] + set floorLabels($i) 113 + set {floorItems(113)} $i + $w create text 28.5 179.5 -text 113 -fill $color -anchor c -tags {floor1 label} + set i [$w create polygon 85 169 79 169 79 192 85 192 -fill {} -tags {floor1 room}] + set floorLabels($i) 117A + set {floorItems(117A)} $i + $w create text 82 180.5 -text 117A -fill $color -anchor c -tags {floor1 label} + set i [$w create polygon 77 302 77 168 53 168 53 302 -fill {} -tags {floor1 room}] + set floorLabels($i) 117 + set {floorItems(117)} $i + $w create text 65 235 -text 117 -fill $color -anchor c -tags {floor1 label} + set i [$w create polygon 51 155 51 115 6 115 6 155 -fill {} -tags {floor1 room}] + set floorLabels($i) 114 + set {floorItems(114)} $i + $w create text 28.5 135 -text 114 -fill $color -anchor c -tags {floor1 label} + set i [$w create polygon 95 115 53 115 53 168 95 168 -fill {} -tags {floor1 room}] + set floorLabels($i) 115 + set {floorItems(115)} $i + $w create text 74 141.5 -text 115 -fill $color -anchor c -tags {floor1 label} + set i [$w create polygon 87 113 87 27 10 27 10 113 -fill {} -tags {floor1 room}] + set floorLabels($i) 116 + set {floorItems(116)} $i + $w create text 48.5 70 -text 116 -fill $color -anchor c -tags {floor1 label} + set i [$w create polygon 89 91 128 91 128 113 89 113 -fill {} -tags {floor1 room}] + set floorLabels($i) 118 + set {floorItems(118)} $i + $w create text 108.5 102 -text 118 -fill $color -anchor c -tags {floor1 label} + set i [$w create polygon 178 128 178 132 216 132 216 91 163 91 163 112 149 112 149 128 -fill {} -tags {floor1 room}] + set floorLabels($i) 120 + set {floorItems(120)} $i + $w create text 189.5 111.5 -text 120 -fill $color -anchor c -tags {floor1 label} + set i [$w create polygon 79 193 87 193 87 169 136 169 136 192 156 192 156 169 175 169 175 246 79 246 -fill {} -tags {floor1 room}] + set floorLabels($i) 122 + set {floorItems(122)} $i + $w create text 131 207.5 -text 122 -fill $color -anchor c -tags {floor1 label} + set i [$w create polygon 138 169 154 169 154 191 138 191 -fill {} -tags {floor1 room}] + set floorLabels($i) 121 + set {floorItems(121)} $i + $w create text 146 180 -text 121 -fill $color -anchor c -tags {floor1 label} + set i [$w create polygon 99 300 126 300 126 309 99 309 -fill {} -tags {floor1 room}] + set floorLabels($i) 106A + set {floorItems(106A)} $i + $w create text 112.5 304.5 -text 106A -fill $color -anchor c -tags {floor1 label} + set i [$w create polygon 128 299 128 309 150 309 150 248 99 248 99 299 -fill {} -tags {floor1 room}] + set floorLabels($i) 105 + set {floorItems(105)} $i + $w create text 124.5 278.5 -text 105 -fill $color -anchor c -tags {floor1 label} + set i [$w create polygon 174 309 174 300 152 300 152 309 -fill {} -tags {floor1 room}] + set floorLabels($i) 106B + set {floorItems(106B)} $i + $w create text 163 304.5 -text 106B -fill $color -anchor c -tags {floor1 label} + set i [$w create polygon 176 299 176 309 216 309 216 248 152 248 152 299 -fill {} -tags {floor1 room}] + set floorLabels($i) 104 + set {floorItems(104)} $i + $w create text 184 278.5 -text 104 -fill $color -anchor c -tags {floor1 label} + set i [$w create polygon 138 385 138 337 91 337 91 385 -fill {} -tags {floor1 room}] + set floorLabels($i) 108 + set {floorItems(108)} $i + $w create text 114.5 361 -text 108 -fill $color -anchor c -tags {floor1 label} + set i [$w create polygon 256 337 140 337 140 385 256 385 -fill {} -tags {floor1 room}] + set floorLabels($i) 107 + set {floorItems(107)} $i + $w create text 198 361 -text 107 -fill $color -anchor c -tags {floor1 label} + set i [$w create polygon 300 353 300 329 260 329 260 353 -fill {} -tags {floor1 room}] + set floorLabels($i) Smoking + set {floorItems(Smoking)} $i + $w create text 280 341 -text Smoking -fill $color -anchor c -tags {floor1 label} + set i [$w create polygon 314 135 314 170 306 170 306 246 177 246 177 135 -fill {} -tags {floor1 room}] + set floorLabels($i) 123 + set {floorItems(123)} $i + $w create text 245.5 190.5 -text 123 -fill $color -anchor c -tags {floor1 label} + set i [$w create polygon 217 248 301 248 301 326 257 326 257 310 217 310 -fill {} -tags {floor1 room}] + set floorLabels($i) 103 + set {floorItems(103)} $i + $w create text 259 287 -text 103 -fill $color -anchor c -tags {floor1 label} + set i [$w create polygon 396 188 377 188 377 169 316 169 316 131 396 131 -fill {} -tags {floor1 room}] + set floorLabels($i) 124 + set {floorItems(124)} $i + $w create text 356 150 -text 124 -fill $color -anchor c -tags {floor1 label} + set i [$w create polygon 397 226 407 226 407 189 377 189 377 246 397 246 -fill {} -tags {floor1 room}] + set floorLabels($i) 125 + set {floorItems(125)} $i + $w create text 392 217.5 -text 125 -fill $color -anchor c -tags {floor1 label} + set i [$w create polygon 399 187 409 187 409 207 474 207 474 164 399 164 -fill {} -tags {floor1 room}] + set floorLabels($i) 126 + set {floorItems(126)} $i + $w create text 436.5 185.5 -text 126 -fill $color -anchor c -tags {floor1 label} + set i [$w create polygon 409 209 409 229 399 229 399 253 486 253 486 239 474 239 474 209 -fill {} -tags {floor1 room}] + set floorLabels($i) 127 + set {floorItems(127)} $i + $w create text 436.5 231 -text 127 -fill $color -anchor c -tags {floor1 label} + set i [$w create polygon 501 164 501 174 495 174 495 188 490 188 490 204 476 204 476 164 -fill {} -tags {floor1 room}] + set floorLabels($i) MShower + set {floorItems(MShower)} $i + $w create text 488.5 184 -text MShower -fill $color -anchor c -tags {floor1 label} + set i [$w create polygon 497 176 513 176 513 204 492 204 492 190 497 190 -fill {} -tags {floor1 room}] + set floorLabels($i) Closet + set {floorItems(Closet)} $i + $w create text 502.5 190 -text Closet -fill $color -anchor c -tags {floor1 label} + set i [$w create polygon 476 237 476 206 513 206 513 254 488 254 488 237 -fill {} -tags {floor1 room}] + set floorLabels($i) WShower + set {floorItems(WShower)} $i + $w create text 494.5 230 -text WShower -fill $color -anchor c -tags {floor1 label} + set i [$w create polygon 486 131 558 131 558 135 724 135 724 166 697 166 697 275 553 275 531 254 515 254 515 174 503 174 503 161 486 161 -fill {} -tags {floor1 room}] + set floorLabels($i) 130 + set {floorItems(130)} $i + $w create text 638.5 205 -text 130 -fill $color -anchor c -tags {floor1 label} + set i [$w create polygon 308 242 339 242 339 248 342 248 342 246 397 246 397 276 393 276 393 309 300 309 300 248 308 248 -fill {} -tags {floor1 room}] + set floorLabels($i) 102 + set {floorItems(102)} $i + $w create text 367.5 278.5 -text 102 -fill $color -anchor c -tags {floor1 label} + set i [$w create polygon 397 255 486 255 486 276 397 276 -fill {} -tags {floor1 room}] + set floorLabels($i) 128 + set {floorItems(128)} $i + $w create text 441.5 265.5 -text 128 -fill $color -anchor c -tags {floor1 label} + set i [$w create polygon 510 309 486 309 486 255 530 255 552 277 561 277 561 325 510 325 -fill {} -tags {floor1 room}] + set floorLabels($i) 129 + set {floorItems(129)} $i + $w create text 535.5 293 -text 129 -fill $color -anchor c -tags {floor1 label} + set i [$w create polygon 696 281 740 281 740 387 642 387 642 389 561 389 561 277 696 277 -fill {} -tags {floor1 room}] + set floorLabels($i) 133 + set {floorItems(133)} $i + $w create text 628.5 335 -text 133 -fill $color -anchor c -tags {floor1 label} + set i [$w create polygon 742 387 742 281 800 281 800 387 -fill {} -tags {floor1 room}] + set floorLabels($i) 132 + set {floorItems(132)} $i + $w create text 771 334 -text 132 -fill $color -anchor c -tags {floor1 label} + set i [$w create polygon 800 168 800 280 699 280 699 168 -fill {} -tags {floor1 room}] + set floorLabels($i) 134 + set {floorItems(134)} $i + $w create text 749.5 224 -text 134 -fill $color -anchor c -tags {floor1 label} + set i [$w create polygon 726 131 726 166 800 166 800 131 -fill {} -tags {floor1 room}] + set floorLabels($i) 135 + set {floorItems(135)} $i + $w create text 763 148.5 -text 135 -fill $color -anchor c -tags {floor1 label} + set i [$w create polygon 340 360 335 363 331 365 326 366 304 366 304 312 396 312 396 288 400 288 404 288 409 290 413 292 418 297 421 302 422 309 421 318 417 325 411 330 405 332 397 333 344 333 340 334 336 336 335 338 332 342 331 347 332 351 334 354 336 357 341 359 -fill {} -tags {floor1 room}] + set floorLabels($i) {Ramona Stair} + set {floorItems(Ramona Stair)} $i + $w create text 368 323 -text {Ramona Stair} -fill $color -anchor c -tags {floor1 label} + set i [$w create polygon 30 23 30 5 93 5 98 5 104 7 110 10 116 16 119 20 122 28 123 32 123 68 220 68 220 87 90 87 90 23 -fill {} -tags {floor1 room}] + set floorLabels($i) {University Stair} + set {floorItems(University Stair)} $i + $w create text 155 77.5 -text {University Stair} -fill $color -anchor c -tags {floor1 label} + set i [$w create polygon 282 37 295 40 312 49 323 56 337 70 352 56 358 48 363 39 365 29 348 25 335 22 321 14 300 5 283 1 260 0 246 0 242 2 236 4 231 8 227 13 223 17 221 22 220 34 260 34 -fill {} -tags {floor1 room}] + set floorLabels($i) {Plaza Stair} + set {floorItems(Plaza Stair)} $i + $w create text 317.5 28.5 -text {Plaza Stair} -fill $color -anchor c -tags {floor1 label} + set i [$w create polygon 220 34 260 34 282 37 295 40 312 49 323 56 337 70 350 83 365 94 377 100 386 104 386 128 220 128 -fill {} -tags {floor1 room}] + set floorLabels($i) {Plaza Deck} + set {floorItems(Plaza Deck)} $i + $w create text 303 81 -text {Plaza Deck} -fill $color -anchor c -tags {floor1 label} + set i [$w create polygon 257 336 77 336 6 336 6 301 77 301 77 310 257 310 -fill {} -tags {floor1 room}] + set floorLabels($i) 106 + set {floorItems(106)} $i + $w create text 131.5 318.5 -text 106 -fill $color -anchor c -tags {floor1 label} + set i [$w create polygon 146 110 162 110 162 91 130 91 130 115 95 115 95 128 114 128 114 151 157 151 157 153 112 153 112 130 97 130 97 168 175 168 175 131 146 131 -fill {} -tags {floor1 room}] + set floorLabels($i) 119 + set {floorItems(119)} $i + $w create text 143.5 133 -text 119 -fill $color -anchor c -tags {floor1 label} + $w create line 155 191 155 189 -fill $color -tags {floor1 wall} + $w create line 155 177 155 169 -fill $color -tags {floor1 wall} + $w create line 96 129 96 169 -fill $color -tags {floor1 wall} + $w create line 78 169 176 169 -fill $color -tags {floor1 wall} + $w create line 176 247 176 129 -fill $color -tags {floor1 wall} + $w create line 340 206 307 206 -fill $color -tags {floor1 wall} + $w create line 340 187 340 170 -fill $color -tags {floor1 wall} + $w create line 340 210 340 201 -fill $color -tags {floor1 wall} + $w create line 340 247 340 224 -fill $color -tags {floor1 wall} + $w create line 340 241 307 241 -fill $color -tags {floor1 wall} + $w create line 376 246 376 170 -fill $color -tags {floor1 wall} + $w create line 307 247 307 170 -fill $color -tags {floor1 wall} + $w create line 376 170 307 170 -fill $color -tags {floor1 wall} + $w create line 315 129 315 170 -fill $color -tags {floor1 wall} + $w create line 147 129 176 129 -fill $color -tags {floor1 wall} + $w create line 202 133 176 133 -fill $color -tags {floor1 wall} + $w create line 398 129 315 129 -fill $color -tags {floor1 wall} + $w create line 258 352 258 387 -fill $color -tags {floor1 wall} + $w create line 60 387 60 391 -fill $color -tags {floor1 wall} + $w create line 0 337 0 391 -fill $color -tags {floor1 wall} + $w create line 60 391 0 391 -fill $color -tags {floor1 wall} + $w create line 3 114 3 337 -fill $color -tags {floor1 wall} + $w create line 258 387 60 387 -fill $color -tags {floor1 wall} + $w create line 52 237 52 273 -fill $color -tags {floor1 wall} + $w create line 52 189 52 225 -fill $color -tags {floor1 wall} + $w create line 52 140 52 177 -fill $color -tags {floor1 wall} + $w create line 395 306 395 311 -fill $color -tags {floor1 wall} + $w create line 531 254 398 254 -fill $color -tags {floor1 wall} + $w create line 475 178 475 238 -fill $color -tags {floor1 wall} + $w create line 502 162 398 162 -fill $color -tags {floor1 wall} + $w create line 398 129 398 188 -fill $color -tags {floor1 wall} + $w create line 383 188 376 188 -fill $color -tags {floor1 wall} + $w create line 408 188 408 194 -fill $color -tags {floor1 wall} + $w create line 398 227 398 254 -fill $color -tags {floor1 wall} + $w create line 408 227 398 227 -fill $color -tags {floor1 wall} + $w create line 408 222 408 227 -fill $color -tags {floor1 wall} + $w create line 408 206 408 210 -fill $color -tags {floor1 wall} + $w create line 408 208 475 208 -fill $color -tags {floor1 wall} + $w create line 484 278 484 311 -fill $color -tags {floor1 wall} + $w create line 484 311 508 311 -fill $color -tags {floor1 wall} + $w create line 508 327 508 311 -fill $color -tags {floor1 wall} + $w create line 559 327 508 327 -fill $color -tags {floor1 wall} + $w create line 644 391 559 391 -fill $color -tags {floor1 wall} + $w create line 644 389 644 391 -fill $color -tags {floor1 wall} + $w create line 514 205 475 205 -fill $color -tags {floor1 wall} + $w create line 496 189 496 187 -fill $color -tags {floor1 wall} + $w create line 559 129 484 129 -fill $color -tags {floor1 wall} + $w create line 484 162 484 129 -fill $color -tags {floor1 wall} + $w create line 725 133 559 133 -fill $color -tags {floor1 wall} + $w create line 559 129 559 133 -fill $color -tags {floor1 wall} + $w create line 725 149 725 167 -fill $color -tags {floor1 wall} + $w create line 725 129 802 129 -fill $color -tags {floor1 wall} + $w create line 802 389 802 129 -fill $color -tags {floor1 wall} + $w create line 739 167 802 167 -fill $color -tags {floor1 wall} + $w create line 396 188 408 188 -fill $color -tags {floor1 wall} + $w create line 0 337 9 337 -fill $color -tags {floor1 wall} + $w create line 58 337 21 337 -fill $color -tags {floor1 wall} + $w create line 43 391 43 337 -fill $color -tags {floor1 wall} + $w create line 105 337 75 337 -fill $color -tags {floor1 wall} + $w create line 91 387 91 337 -fill $color -tags {floor1 wall} + $w create line 154 337 117 337 -fill $color -tags {floor1 wall} + $w create line 139 387 139 337 -fill $color -tags {floor1 wall} + $w create line 227 337 166 337 -fill $color -tags {floor1 wall} + $w create line 258 337 251 337 -fill $color -tags {floor1 wall} + $w create line 258 328 302 328 -fill $color -tags {floor1 wall} + $w create line 302 355 302 311 -fill $color -tags {floor1 wall} + $w create line 395 311 302 311 -fill $color -tags {floor1 wall} + $w create line 484 278 395 278 -fill $color -tags {floor1 wall} + $w create line 395 294 395 278 -fill $color -tags {floor1 wall} + $w create line 473 278 473 275 -fill $color -tags {floor1 wall} + $w create line 473 256 473 254 -fill $color -tags {floor1 wall} + $w create line 533 257 531 254 -fill $color -tags {floor1 wall} + $w create line 553 276 551 274 -fill $color -tags {floor1 wall} + $w create line 698 276 553 276 -fill $color -tags {floor1 wall} + $w create line 559 391 559 327 -fill $color -tags {floor1 wall} + $w create line 802 389 644 389 -fill $color -tags {floor1 wall} + $w create line 741 314 741 389 -fill $color -tags {floor1 wall} + $w create line 698 280 698 167 -fill $color -tags {floor1 wall} + $w create line 707 280 698 280 -fill $color -tags {floor1 wall} + $w create line 802 280 731 280 -fill $color -tags {floor1 wall} + $w create line 741 280 741 302 -fill $color -tags {floor1 wall} + $w create line 698 167 727 167 -fill $color -tags {floor1 wall} + $w create line 725 137 725 129 -fill $color -tags {floor1 wall} + $w create line 514 254 514 175 -fill $color -tags {floor1 wall} + $w create line 496 175 514 175 -fill $color -tags {floor1 wall} + $w create line 502 175 502 162 -fill $color -tags {floor1 wall} + $w create line 475 166 475 162 -fill $color -tags {floor1 wall} + $w create line 496 176 496 175 -fill $color -tags {floor1 wall} + $w create line 491 189 496 189 -fill $color -tags {floor1 wall} + $w create line 491 205 491 189 -fill $color -tags {floor1 wall} + $w create line 487 238 475 238 -fill $color -tags {floor1 wall} + $w create line 487 240 487 238 -fill $color -tags {floor1 wall} + $w create line 487 252 487 254 -fill $color -tags {floor1 wall} + $w create line 315 133 304 133 -fill $color -tags {floor1 wall} + $w create line 256 133 280 133 -fill $color -tags {floor1 wall} + $w create line 78 247 270 247 -fill $color -tags {floor1 wall} + $w create line 307 247 294 247 -fill $color -tags {floor1 wall} + $w create line 214 133 232 133 -fill $color -tags {floor1 wall} + $w create line 217 247 217 266 -fill $color -tags {floor1 wall} + $w create line 217 309 217 291 -fill $color -tags {floor1 wall} + $w create line 217 309 172 309 -fill $color -tags {floor1 wall} + $w create line 154 309 148 309 -fill $color -tags {floor1 wall} + $w create line 175 300 175 309 -fill $color -tags {floor1 wall} + $w create line 151 300 175 300 -fill $color -tags {floor1 wall} + $w create line 151 247 151 309 -fill $color -tags {floor1 wall} + $w create line 78 237 78 265 -fill $color -tags {floor1 wall} + $w create line 78 286 78 309 -fill $color -tags {floor1 wall} + $w create line 106 309 78 309 -fill $color -tags {floor1 wall} + $w create line 130 309 125 309 -fill $color -tags {floor1 wall} + $w create line 99 309 99 247 -fill $color -tags {floor1 wall} + $w create line 127 299 99 299 -fill $color -tags {floor1 wall} + $w create line 127 309 127 299 -fill $color -tags {floor1 wall} + $w create line 155 191 137 191 -fill $color -tags {floor1 wall} + $w create line 137 169 137 191 -fill $color -tags {floor1 wall} + $w create line 78 171 78 169 -fill $color -tags {floor1 wall} + $w create line 78 190 78 218 -fill $color -tags {floor1 wall} + $w create line 86 192 86 169 -fill $color -tags {floor1 wall} + $w create line 86 192 78 192 -fill $color -tags {floor1 wall} + $w create line 52 301 3 301 -fill $color -tags {floor1 wall} + $w create line 52 286 52 301 -fill $color -tags {floor1 wall} + $w create line 52 252 3 252 -fill $color -tags {floor1 wall} + $w create line 52 203 3 203 -fill $color -tags {floor1 wall} + $w create line 3 156 52 156 -fill $color -tags {floor1 wall} + $w create line 8 25 8 114 -fill $color -tags {floor1 wall} + $w create line 63 114 3 114 -fill $color -tags {floor1 wall} + $w create line 75 114 97 114 -fill $color -tags {floor1 wall} + $w create line 108 114 129 114 -fill $color -tags {floor1 wall} + $w create line 129 114 129 89 -fill $color -tags {floor1 wall} + $w create line 52 114 52 128 -fill $color -tags {floor1 wall} + $w create line 132 89 88 89 -fill $color -tags {floor1 wall} + $w create line 88 25 88 89 -fill $color -tags {floor1 wall} + $w create line 88 114 88 89 -fill $color -tags {floor1 wall} + $w create line 218 89 144 89 -fill $color -tags {floor1 wall} + $w create line 147 111 147 129 -fill $color -tags {floor1 wall} + $w create line 162 111 147 111 -fill $color -tags {floor1 wall} + $w create line 162 109 162 111 -fill $color -tags {floor1 wall} + $w create line 162 96 162 89 -fill $color -tags {floor1 wall} + $w create line 218 89 218 94 -fill $color -tags {floor1 wall} + $w create line 218 89 218 119 -fill $color -tags {floor1 wall} + $w create line 8 25 88 25 -fill $color -tags {floor1 wall} + $w create line 258 337 258 328 -fill $color -tags {floor1 wall} + $w create line 113 129 96 129 -fill $color -tags {floor1 wall} + $w create line 302 355 258 355 -fill $color -tags {floor1 wall} + $w create line 386 104 386 129 -fill $color -tags {floor1 wall} + $w create line 377 100 386 104 -fill $color -tags {floor1 wall} + $w create line 365 94 377 100 -fill $color -tags {floor1 wall} + $w create line 350 83 365 94 -fill $color -tags {floor1 wall} + $w create line 337 70 350 83 -fill $color -tags {floor1 wall} + $w create line 337 70 323 56 -fill $color -tags {floor1 wall} + $w create line 312 49 323 56 -fill $color -tags {floor1 wall} + $w create line 295 40 312 49 -fill $color -tags {floor1 wall} + $w create line 282 37 295 40 -fill $color -tags {floor1 wall} + $w create line 260 34 282 37 -fill $color -tags {floor1 wall} + $w create line 253 34 260 34 -fill $color -tags {floor1 wall} + $w create line 386 128 386 104 -fill $color -tags {floor1 wall} + $w create line 113 152 156 152 -fill $color -tags {floor1 wall} + $w create line 113 152 156 152 -fill $color -tags {floor1 wall} + $w create line 113 152 113 129 -fill $color -tags {floor1 wall} +} + +# fg2 -- +# This procedure represents part of the floorplan database. When +# invoked, it instantiates the foreground information for the second +# floor (office outlines and numbers). +# +# Arguments: +# w - The canvas window. +# color - Color to use for drawing foreground information. + +proc fg2 {w color} { + global floorLabels floorItems + set i [$w create polygon 748 188 755 188 755 205 758 205 758 222 800 222 800 168 748 168 -fill {} -tags {floor2 room}] + set floorLabels($i) 238 + set {floorItems(238)} $i + $w create text 774 195 -text 238 -fill $color -anchor c -tags {floor2 label} + set i [$w create polygon 726 188 746 188 746 166 800 166 800 131 726 131 -fill {} -tags {floor2 room}] + set floorLabels($i) 237 + set {floorItems(237)} $i + $w create text 763 148.5 -text 237 -fill $color -anchor c -tags {floor2 label} + set i [$w create polygon 497 187 497 204 559 204 559 324 641 324 643 324 643 291 641 291 641 205 696 205 696 291 694 291 694 314 715 314 715 291 715 205 755 205 755 190 724 190 724 187 -fill {} -tags {floor2 room}] + set floorLabels($i) 246 + set {floorItems(246)} $i + $w create text 600 264 -text 246 -fill $color -anchor c -tags {floor2 label} + set i [$w create polygon 694 279 643 279 643 314 694 314 -fill {} -tags {floor2 room}] + set floorLabels($i) 247 + set {floorItems(247)} $i + $w create text 668.5 296.5 -text 247 -fill $color -anchor c -tags {floor2 label} + set i [$w create polygon 232 250 308 250 308 242 339 242 339 246 397 246 397 255 476 255 476 250 482 250 559 250 559 274 482 274 482 278 396 278 396 274 232 274 -fill {} -tags {floor2 room}] + set floorLabels($i) 202 + set {floorItems(202)} $i + $w create text 285.5 260 -text 202 -fill $color -anchor c -tags {floor2 label} + set i [$w create polygon 53 228 53 338 176 338 233 338 233 196 306 196 306 180 175 180 175 169 156 169 156 196 176 196 176 228 -fill {} -tags {floor2 room}] + set floorLabels($i) 206 + set {floorItems(206)} $i + $w create text 143 267 -text 206 -fill $color -anchor c -tags {floor2 label} + set i [$w create polygon 51 277 6 277 6 338 51 338 -fill {} -tags {floor2 room}] + set floorLabels($i) 212 + set {floorItems(212)} $i + $w create text 28.5 307.5 -text 212 -fill $color -anchor c -tags {floor2 label} + set i [$w create polygon 557 276 486 276 486 309 510 309 510 325 557 325 -fill {} -tags {floor2 room}] + set floorLabels($i) 245 + set {floorItems(245)} $i + $w create text 521.5 300.5 -text 245 -fill $color -anchor c -tags {floor2 label} + set i [$w create polygon 560 389 599 389 599 326 560 326 -fill {} -tags {floor2 room}] + set floorLabels($i) 244 + set {floorItems(244)} $i + $w create text 579.5 357.5 -text 244 -fill $color -anchor c -tags {floor2 label} + set i [$w create polygon 601 389 601 326 643 326 643 389 -fill {} -tags {floor2 room}] + set floorLabels($i) 243 + set {floorItems(243)} $i + $w create text 622 357.5 -text 243 -fill $color -anchor c -tags {floor2 label} + set i [$w create polygon 688 316 645 316 645 365 688 365 -fill {} -tags {floor2 room}] + set floorLabels($i) 242 + set {floorItems(242)} $i + $w create text 666.5 340.5 -text 242 -fill $color -anchor c -tags {floor2 label} + set i [$w create polygon 802 367 759 367 759 226 802 226 -fill {} -tags {floor2 room}] + set floorLabels($i) {Barbecue Deck} + set {floorItems(Barbecue Deck)} $i + $w create text 780.5 296.5 -text {Barbecue Deck} -fill $color -anchor c -tags {floor2 label} + set i [$w create polygon 755 262 755 314 717 314 717 262 -fill {} -tags {floor2 room}] + set floorLabels($i) 240 + set {floorItems(240)} $i + $w create text 736 288 -text 240 -fill $color -anchor c -tags {floor2 label} + set i [$w create polygon 755 316 689 316 689 365 755 365 -fill {} -tags {floor2 room}] + set floorLabels($i) 241 + set {floorItems(241)} $i + $w create text 722 340.5 -text 241 -fill $color -anchor c -tags {floor2 label} + set i [$w create polygon 755 206 717 206 717 261 755 261 -fill {} -tags {floor2 room}] + set floorLabels($i) 239 + set {floorItems(239)} $i + $w create text 736 233.5 -text 239 -fill $color -anchor c -tags {floor2 label} + set i [$w create polygon 695 277 643 277 643 206 695 206 -fill {} -tags {floor2 room}] + set floorLabels($i) 248 + set {floorItems(248)} $i + $w create text 669 241.5 -text 248 -fill $color -anchor c -tags {floor2 label} + set i [$w create polygon 676 135 676 185 724 185 724 135 -fill {} -tags {floor2 room}] + set floorLabels($i) 236 + set {floorItems(236)} $i + $w create text 700 160 -text 236 -fill $color -anchor c -tags {floor2 label} + set i [$w create polygon 675 135 635 135 635 145 628 145 628 185 675 185 -fill {} -tags {floor2 room}] + set floorLabels($i) 235 + set {floorItems(235)} $i + $w create text 651.5 160 -text 235 -fill $color -anchor c -tags {floor2 label} + set i [$w create polygon 626 143 633 143 633 135 572 135 572 143 579 143 579 185 626 185 -fill {} -tags {floor2 room}] + set floorLabels($i) 234 + set {floorItems(234)} $i + $w create text 606 160 -text 234 -fill $color -anchor c -tags {floor2 label} + set i [$w create polygon 557 135 571 135 571 145 578 145 578 185 527 185 527 131 557 131 -fill {} -tags {floor2 room}] + set floorLabels($i) 233 + set {floorItems(233)} $i + $w create text 552.5 158 -text 233 -fill $color -anchor c -tags {floor2 label} + set i [$w create polygon 476 249 557 249 557 205 476 205 -fill {} -tags {floor2 room}] + set floorLabels($i) 230 + set {floorItems(230)} $i + $w create text 516.5 227 -text 230 -fill $color -anchor c -tags {floor2 label} + set i [$w create polygon 476 164 486 164 486 131 525 131 525 185 476 185 -fill {} -tags {floor2 room}] + set floorLabels($i) 232 + set {floorItems(232)} $i + $w create text 500.5 158 -text 232 -fill $color -anchor c -tags {floor2 label} + set i [$w create polygon 476 186 495 186 495 204 476 204 -fill {} -tags {floor2 room}] + set floorLabels($i) 229 + set {floorItems(229)} $i + $w create text 485.5 195 -text 229 -fill $color -anchor c -tags {floor2 label} + set i [$w create polygon 474 207 409 207 409 187 399 187 399 164 474 164 -fill {} -tags {floor2 room}] + set floorLabels($i) 227 + set {floorItems(227)} $i + $w create text 436.5 185.5 -text 227 -fill $color -anchor c -tags {floor2 label} + set i [$w create polygon 399 228 399 253 474 253 474 209 409 209 409 228 -fill {} -tags {floor2 room}] + set floorLabels($i) 228 + set {floorItems(228)} $i + $w create text 436.5 231 -text 228 -fill $color -anchor c -tags {floor2 label} + set i [$w create polygon 397 246 397 226 407 226 407 189 377 189 377 246 -fill {} -tags {floor2 room}] + set floorLabels($i) 226 + set {floorItems(226)} $i + $w create text 392 217.5 -text 226 -fill $color -anchor c -tags {floor2 label} + set i [$w create polygon 377 169 316 169 316 131 397 131 397 188 377 188 -fill {} -tags {floor2 room}] + set floorLabels($i) 225 + set {floorItems(225)} $i + $w create text 356.5 150 -text 225 -fill $color -anchor c -tags {floor2 label} + set i [$w create polygon 234 198 306 198 306 249 234 249 -fill {} -tags {floor2 room}] + set floorLabels($i) 224 + set {floorItems(224)} $i + $w create text 270 223.5 -text 224 -fill $color -anchor c -tags {floor2 label} + set i [$w create polygon 270 179 306 179 306 170 314 170 314 135 270 135 -fill {} -tags {floor2 room}] + set floorLabels($i) 223 + set {floorItems(223)} $i + $w create text 292 157 -text 223 -fill $color -anchor c -tags {floor2 label} + set i [$w create polygon 268 179 221 179 221 135 268 135 -fill {} -tags {floor2 room}] + set floorLabels($i) 222 + set {floorItems(222)} $i + $w create text 244.5 157 -text 222 -fill $color -anchor c -tags {floor2 label} + set i [$w create polygon 177 179 219 179 219 135 177 135 -fill {} -tags {floor2 room}] + set floorLabels($i) 221 + set {floorItems(221)} $i + $w create text 198 157 -text 221 -fill $color -anchor c -tags {floor2 label} + set i [$w create polygon 299 327 349 327 349 284 341 284 341 276 299 276 -fill {} -tags {floor2 room}] + set floorLabels($i) 204 + set {floorItems(204)} $i + $w create text 324 301.5 -text 204 -fill $color -anchor c -tags {floor2 label} + set i [$w create polygon 234 276 297 276 297 327 257 327 257 338 234 338 -fill {} -tags {floor2 room}] + set floorLabels($i) 205 + set {floorItems(205)} $i + $w create text 265.5 307 -text 205 -fill $color -anchor c -tags {floor2 label} + set i [$w create polygon 256 385 256 340 212 340 212 385 -fill {} -tags {floor2 room}] + set floorLabels($i) 207 + set {floorItems(207)} $i + $w create text 234 362.5 -text 207 -fill $color -anchor c -tags {floor2 label} + set i [$w create polygon 210 340 164 340 164 385 210 385 -fill {} -tags {floor2 room}] + set floorLabels($i) 208 + set {floorItems(208)} $i + $w create text 187 362.5 -text 208 -fill $color -anchor c -tags {floor2 label} + set i [$w create polygon 115 340 162 340 162 385 115 385 -fill {} -tags {floor2 room}] + set floorLabels($i) 209 + set {floorItems(209)} $i + $w create text 138.5 362.5 -text 209 -fill $color -anchor c -tags {floor2 label} + set i [$w create polygon 89 228 89 156 53 156 53 228 -fill {} -tags {floor2 room}] + set floorLabels($i) 217 + set {floorItems(217)} $i + $w create text 71 192 -text 217 -fill $color -anchor c -tags {floor2 label} + set i [$w create polygon 89 169 97 169 97 190 89 190 -fill {} -tags {floor2 room}] + set floorLabels($i) 217A + set {floorItems(217A)} $i + $w create text 93 179.5 -text 217A -fill $color -anchor c -tags {floor2 label} + set i [$w create polygon 89 156 89 168 95 168 95 135 53 135 53 156 -fill {} -tags {floor2 room}] + set floorLabels($i) 216 + set {floorItems(216)} $i + $w create text 71 145.5 -text 216 -fill $color -anchor c -tags {floor2 label} + set i [$w create polygon 51 179 51 135 6 135 6 179 -fill {} -tags {floor2 room}] + set floorLabels($i) 215 + set {floorItems(215)} $i + $w create text 28.5 157 -text 215 -fill $color -anchor c -tags {floor2 label} + set i [$w create polygon 51 227 6 227 6 180 51 180 -fill {} -tags {floor2 room}] + set floorLabels($i) 214 + set {floorItems(214)} $i + $w create text 28.5 203.5 -text 214 -fill $color -anchor c -tags {floor2 label} + set i [$w create polygon 51 275 6 275 6 229 51 229 -fill {} -tags {floor2 room}] + set floorLabels($i) 213 + set {floorItems(213)} $i + $w create text 28.5 252 -text 213 -fill $color -anchor c -tags {floor2 label} + set i [$w create polygon 114 340 67 340 67 385 114 385 -fill {} -tags {floor2 room}] + set floorLabels($i) 210 + set {floorItems(210)} $i + $w create text 90.5 362.5 -text 210 -fill $color -anchor c -tags {floor2 label} + set i [$w create polygon 59 389 59 385 65 385 65 340 1 340 1 389 -fill {} -tags {floor2 room}] + set floorLabels($i) 211 + set {floorItems(211)} $i + $w create text 33 364.5 -text 211 -fill $color -anchor c -tags {floor2 label} + set i [$w create polygon 393 309 350 309 350 282 342 282 342 276 393 276 -fill {} -tags {floor2 room}] + set floorLabels($i) 203 + set {floorItems(203)} $i + $w create text 367.5 292.5 -text 203 -fill $color -anchor c -tags {floor2 label} + set i [$w create polygon 99 191 91 191 91 226 174 226 174 198 154 198 154 192 109 192 109 169 99 169 -fill {} -tags {floor2 room}] + set floorLabels($i) 220 + set {floorItems(220)} $i + $w create text 132.5 208.5 -text 220 -fill $color -anchor c -tags {floor2 label} + set i [$w create polygon 339 205 307 205 307 171 339 171 -fill {} -tags {floor2 room}] + set floorLabels($i) {Priv Lift2} + set {floorItems(Priv Lift2)} $i + $w create text 323 188 -text {Priv Lift2} -fill $color -anchor c -tags {floor2 label} + set i [$w create polygon 307 240 339 240 339 206 307 206 -fill {} -tags {floor2 room}] + set floorLabels($i) {Pub Lift 2} + set {floorItems(Pub Lift 2)} $i + $w create text 323 223 -text {Pub Lift 2} -fill $color -anchor c -tags {floor2 label} + set i [$w create polygon 175 168 97 168 97 131 175 131 -fill {} -tags {floor2 room}] + set floorLabels($i) 218 + set {floorItems(218)} $i + $w create text 136 149.5 -text 218 -fill $color -anchor c -tags {floor2 label} + set i [$w create polygon 154 191 111 191 111 169 154 169 -fill {} -tags {floor2 room}] + set floorLabels($i) 219 + set {floorItems(219)} $i + $w create text 132.5 180 -text 219 -fill $color -anchor c -tags {floor2 label} + set i [$w create polygon 375 246 375 172 341 172 341 246 -fill {} -tags {floor2 room}] + set floorLabels($i) 201 + set {floorItems(201)} $i + $w create text 358 209 -text 201 -fill $color -anchor c -tags {floor2 label} + $w create line 641 186 678 186 -fill $color -tags {floor2 wall} + $w create line 757 350 757 367 -fill $color -tags {floor2 wall} + $w create line 634 133 634 144 -fill $color -tags {floor2 wall} + $w create line 634 144 627 144 -fill $color -tags {floor2 wall} + $w create line 572 133 572 144 -fill $color -tags {floor2 wall} + $w create line 572 144 579 144 -fill $color -tags {floor2 wall} + $w create line 398 129 398 162 -fill $color -tags {floor2 wall} + $w create line 174 197 175 197 -fill $color -tags {floor2 wall} + $w create line 175 197 175 227 -fill $color -tags {floor2 wall} + $w create line 757 206 757 221 -fill $color -tags {floor2 wall} + $w create line 396 188 408 188 -fill $color -tags {floor2 wall} + $w create line 727 189 725 189 -fill $color -tags {floor2 wall} + $w create line 747 167 802 167 -fill $color -tags {floor2 wall} + $w create line 747 167 747 189 -fill $color -tags {floor2 wall} + $w create line 755 189 739 189 -fill $color -tags {floor2 wall} + $w create line 769 224 757 224 -fill $color -tags {floor2 wall} + $w create line 802 224 802 129 -fill $color -tags {floor2 wall} + $w create line 802 129 725 129 -fill $color -tags {floor2 wall} + $w create line 725 189 725 129 -fill $color -tags {floor2 wall} + $w create line 725 186 690 186 -fill $color -tags {floor2 wall} + $w create line 676 133 676 186 -fill $color -tags {floor2 wall} + $w create line 627 144 627 186 -fill $color -tags {floor2 wall} + $w create line 629 186 593 186 -fill $color -tags {floor2 wall} + $w create line 579 144 579 186 -fill $color -tags {floor2 wall} + $w create line 559 129 559 133 -fill $color -tags {floor2 wall} + $w create line 725 133 559 133 -fill $color -tags {floor2 wall} + $w create line 484 162 484 129 -fill $color -tags {floor2 wall} + $w create line 559 129 484 129 -fill $color -tags {floor2 wall} + $w create line 526 129 526 186 -fill $color -tags {floor2 wall} + $w create line 540 186 581 186 -fill $color -tags {floor2 wall} + $w create line 528 186 523 186 -fill $color -tags {floor2 wall} + $w create line 511 186 475 186 -fill $color -tags {floor2 wall} + $w create line 496 190 496 186 -fill $color -tags {floor2 wall} + $w create line 496 205 496 202 -fill $color -tags {floor2 wall} + $w create line 475 205 527 205 -fill $color -tags {floor2 wall} + $w create line 558 205 539 205 -fill $color -tags {floor2 wall} + $w create line 558 205 558 249 -fill $color -tags {floor2 wall} + $w create line 558 249 475 249 -fill $color -tags {floor2 wall} + $w create line 662 206 642 206 -fill $color -tags {floor2 wall} + $w create line 695 206 675 206 -fill $color -tags {floor2 wall} + $w create line 695 278 642 278 -fill $color -tags {floor2 wall} + $w create line 642 291 642 206 -fill $color -tags {floor2 wall} + $w create line 695 291 695 206 -fill $color -tags {floor2 wall} + $w create line 716 208 716 206 -fill $color -tags {floor2 wall} + $w create line 757 206 716 206 -fill $color -tags {floor2 wall} + $w create line 757 221 757 224 -fill $color -tags {floor2 wall} + $w create line 793 224 802 224 -fill $color -tags {floor2 wall} + $w create line 757 262 716 262 -fill $color -tags {floor2 wall} + $w create line 716 220 716 264 -fill $color -tags {floor2 wall} + $w create line 716 315 716 276 -fill $color -tags {floor2 wall} + $w create line 757 315 703 315 -fill $color -tags {floor2 wall} + $w create line 757 325 757 224 -fill $color -tags {floor2 wall} + $w create line 757 367 644 367 -fill $color -tags {floor2 wall} + $w create line 689 367 689 315 -fill $color -tags {floor2 wall} + $w create line 647 315 644 315 -fill $color -tags {floor2 wall} + $w create line 659 315 691 315 -fill $color -tags {floor2 wall} + $w create line 600 325 600 391 -fill $color -tags {floor2 wall} + $w create line 627 325 644 325 -fill $color -tags {floor2 wall} + $w create line 644 391 644 315 -fill $color -tags {floor2 wall} + $w create line 615 325 575 325 -fill $color -tags {floor2 wall} + $w create line 644 391 558 391 -fill $color -tags {floor2 wall} + $w create line 563 325 558 325 -fill $color -tags {floor2 wall} + $w create line 558 391 558 314 -fill $color -tags {floor2 wall} + $w create line 558 327 508 327 -fill $color -tags {floor2 wall} + $w create line 558 275 484 275 -fill $color -tags {floor2 wall} + $w create line 558 302 558 275 -fill $color -tags {floor2 wall} + $w create line 508 327 508 311 -fill $color -tags {floor2 wall} + $w create line 484 311 508 311 -fill $color -tags {floor2 wall} + $w create line 484 275 484 311 -fill $color -tags {floor2 wall} + $w create line 475 208 408 208 -fill $color -tags {floor2 wall} + $w create line 408 206 408 210 -fill $color -tags {floor2 wall} + $w create line 408 222 408 227 -fill $color -tags {floor2 wall} + $w create line 408 227 398 227 -fill $color -tags {floor2 wall} + $w create line 398 227 398 254 -fill $color -tags {floor2 wall} + $w create line 408 188 408 194 -fill $color -tags {floor2 wall} + $w create line 383 188 376 188 -fill $color -tags {floor2 wall} + $w create line 398 188 398 162 -fill $color -tags {floor2 wall} + $w create line 398 162 484 162 -fill $color -tags {floor2 wall} + $w create line 475 162 475 254 -fill $color -tags {floor2 wall} + $w create line 398 254 475 254 -fill $color -tags {floor2 wall} + $w create line 484 280 395 280 -fill $color -tags {floor2 wall} + $w create line 395 311 395 275 -fill $color -tags {floor2 wall} + $w create line 307 197 293 197 -fill $color -tags {floor2 wall} + $w create line 278 197 233 197 -fill $color -tags {floor2 wall} + $w create line 233 197 233 249 -fill $color -tags {floor2 wall} + $w create line 307 179 284 179 -fill $color -tags {floor2 wall} + $w create line 233 249 278 249 -fill $color -tags {floor2 wall} + $w create line 269 179 269 133 -fill $color -tags {floor2 wall} + $w create line 220 179 220 133 -fill $color -tags {floor2 wall} + $w create line 155 191 110 191 -fill $color -tags {floor2 wall} + $w create line 90 190 98 190 -fill $color -tags {floor2 wall} + $w create line 98 169 98 190 -fill $color -tags {floor2 wall} + $w create line 52 133 52 165 -fill $color -tags {floor2 wall} + $w create line 52 214 52 177 -fill $color -tags {floor2 wall} + $w create line 52 226 52 262 -fill $color -tags {floor2 wall} + $w create line 52 274 52 276 -fill $color -tags {floor2 wall} + $w create line 234 275 234 339 -fill $color -tags {floor2 wall} + $w create line 226 339 258 339 -fill $color -tags {floor2 wall} + $w create line 211 387 211 339 -fill $color -tags {floor2 wall} + $w create line 214 339 177 339 -fill $color -tags {floor2 wall} + $w create line 258 387 60 387 -fill $color -tags {floor2 wall} + $w create line 3 133 3 339 -fill $color -tags {floor2 wall} + $w create line 165 339 129 339 -fill $color -tags {floor2 wall} + $w create line 117 339 80 339 -fill $color -tags {floor2 wall} + $w create line 68 339 59 339 -fill $color -tags {floor2 wall} + $w create line 0 339 46 339 -fill $color -tags {floor2 wall} + $w create line 60 391 0 391 -fill $color -tags {floor2 wall} + $w create line 0 339 0 391 -fill $color -tags {floor2 wall} + $w create line 60 387 60 391 -fill $color -tags {floor2 wall} + $w create line 258 329 258 387 -fill $color -tags {floor2 wall} + $w create line 350 329 258 329 -fill $color -tags {floor2 wall} + $w create line 395 311 350 311 -fill $color -tags {floor2 wall} + $w create line 398 129 315 129 -fill $color -tags {floor2 wall} + $w create line 176 133 315 133 -fill $color -tags {floor2 wall} + $w create line 176 129 96 129 -fill $color -tags {floor2 wall} + $w create line 3 133 96 133 -fill $color -tags {floor2 wall} + $w create line 66 387 66 339 -fill $color -tags {floor2 wall} + $w create line 115 387 115 339 -fill $color -tags {floor2 wall} + $w create line 163 387 163 339 -fill $color -tags {floor2 wall} + $w create line 234 275 276 275 -fill $color -tags {floor2 wall} + $w create line 288 275 309 275 -fill $color -tags {floor2 wall} + $w create line 298 275 298 329 -fill $color -tags {floor2 wall} + $w create line 341 283 350 283 -fill $color -tags {floor2 wall} + $w create line 321 275 341 275 -fill $color -tags {floor2 wall} + $w create line 375 275 395 275 -fill $color -tags {floor2 wall} + $w create line 315 129 315 170 -fill $color -tags {floor2 wall} + $w create line 376 170 307 170 -fill $color -tags {floor2 wall} + $w create line 307 250 307 170 -fill $color -tags {floor2 wall} + $w create line 376 245 376 170 -fill $color -tags {floor2 wall} + $w create line 340 241 307 241 -fill $color -tags {floor2 wall} + $w create line 340 245 340 224 -fill $color -tags {floor2 wall} + $w create line 340 210 340 201 -fill $color -tags {floor2 wall} + $w create line 340 187 340 170 -fill $color -tags {floor2 wall} + $w create line 340 206 307 206 -fill $color -tags {floor2 wall} + $w create line 293 250 307 250 -fill $color -tags {floor2 wall} + $w create line 271 179 238 179 -fill $color -tags {floor2 wall} + $w create line 226 179 195 179 -fill $color -tags {floor2 wall} + $w create line 176 129 176 179 -fill $color -tags {floor2 wall} + $w create line 182 179 176 179 -fill $color -tags {floor2 wall} + $w create line 174 169 176 169 -fill $color -tags {floor2 wall} + $w create line 162 169 90 169 -fill $color -tags {floor2 wall} + $w create line 96 169 96 129 -fill $color -tags {floor2 wall} + $w create line 175 227 90 227 -fill $color -tags {floor2 wall} + $w create line 90 190 90 227 -fill $color -tags {floor2 wall} + $w create line 52 179 3 179 -fill $color -tags {floor2 wall} + $w create line 52 228 3 228 -fill $color -tags {floor2 wall} + $w create line 52 276 3 276 -fill $color -tags {floor2 wall} + $w create line 155 177 155 169 -fill $color -tags {floor2 wall} + $w create line 110 191 110 169 -fill $color -tags {floor2 wall} + $w create line 155 189 155 197 -fill $color -tags {floor2 wall} + $w create line 350 283 350 329 -fill $color -tags {floor2 wall} + $w create line 162 197 155 197 -fill $color -tags {floor2 wall} + $w create line 341 275 341 283 -fill $color -tags {floor2 wall} +} + +# fg3 -- +# This procedure represents part of the floorplan database. When +# invoked, it instantiates the foreground information for the third +# floor (office outlines and numbers). +# +# Arguments: +# w - The canvas window. +# color - Color to use for drawing foreground information. + +proc fg3 {w color} { + global floorLabels floorItems + set i [$w create polygon 89 228 89 180 70 180 70 228 -fill {} -tags {floor3 room}] + set floorLabels($i) 316 + set {floorItems(316)} $i + $w create text 79.5 204 -text 316 -fill $color -anchor c -tags {floor3 label} + set i [$w create polygon 115 368 162 368 162 323 115 323 -fill {} -tags {floor3 room}] + set floorLabels($i) 309 + set {floorItems(309)} $i + $w create text 138.5 345.5 -text 309 -fill $color -anchor c -tags {floor3 label} + set i [$w create polygon 164 323 164 368 211 368 211 323 -fill {} -tags {floor3 room}] + set floorLabels($i) 308 + set {floorItems(308)} $i + $w create text 187.5 345.5 -text 308 -fill $color -anchor c -tags {floor3 label} + set i [$w create polygon 256 368 212 368 212 323 256 323 -fill {} -tags {floor3 room}] + set floorLabels($i) 307 + set {floorItems(307)} $i + $w create text 234 345.5 -text 307 -fill $color -anchor c -tags {floor3 label} + set i [$w create polygon 244 276 297 276 297 327 260 327 260 321 244 321 -fill {} -tags {floor3 room}] + set floorLabels($i) 305 + set {floorItems(305)} $i + $w create text 270.5 301.5 -text 305 -fill $color -anchor c -tags {floor3 label} + set i [$w create polygon 251 219 251 203 244 203 244 219 -fill {} -tags {floor3 room}] + set floorLabels($i) 324B + set {floorItems(324B)} $i + $w create text 247.5 211 -text 324B -fill $color -anchor c -tags {floor3 label} + set i [$w create polygon 251 249 244 249 244 232 251 232 -fill {} -tags {floor3 room}] + set floorLabels($i) 324A + set {floorItems(324A)} $i + $w create text 247.5 240.5 -text 324A -fill $color -anchor c -tags {floor3 label} + set i [$w create polygon 223 135 223 179 177 179 177 135 -fill {} -tags {floor3 room}] + set floorLabels($i) 320 + set {floorItems(320)} $i + $w create text 200 157 -text 320 -fill $color -anchor c -tags {floor3 label} + set i [$w create polygon 114 368 114 323 67 323 67 368 -fill {} -tags {floor3 room}] + set floorLabels($i) 310 + set {floorItems(310)} $i + $w create text 90.5 345.5 -text 310 -fill $color -anchor c -tags {floor3 label} + set i [$w create polygon 23 277 23 321 68 321 68 277 -fill {} -tags {floor3 room}] + set floorLabels($i) 312 + set {floorItems(312)} $i + $w create text 45.5 299 -text 312 -fill $color -anchor c -tags {floor3 label} + set i [$w create polygon 23 229 68 229 68 275 23 275 -fill {} -tags {floor3 room}] + set floorLabels($i) 313 + set {floorItems(313)} $i + $w create text 45.5 252 -text 313 -fill $color -anchor c -tags {floor3 label} + set i [$w create polygon 68 227 23 227 23 180 68 180 -fill {} -tags {floor3 room}] + set floorLabels($i) 314 + set {floorItems(314)} $i + $w create text 45.5 203.5 -text 314 -fill $color -anchor c -tags {floor3 label} + set i [$w create polygon 95 179 95 135 23 135 23 179 -fill {} -tags {floor3 room}] + set floorLabels($i) 315 + set {floorItems(315)} $i + $w create text 59 157 -text 315 -fill $color -anchor c -tags {floor3 label} + set i [$w create polygon 99 226 99 204 91 204 91 226 -fill {} -tags {floor3 room}] + set floorLabels($i) 316B + set {floorItems(316B)} $i + $w create text 95 215 -text 316B -fill $color -anchor c -tags {floor3 label} + set i [$w create polygon 91 202 99 202 99 180 91 180 -fill {} -tags {floor3 room}] + set floorLabels($i) 316A + set {floorItems(316A)} $i + $w create text 95 191 -text 316A -fill $color -anchor c -tags {floor3 label} + set i [$w create polygon 97 169 109 169 109 192 154 192 154 198 174 198 174 226 101 226 101 179 97 179 -fill {} -tags {floor3 room}] + set floorLabels($i) 319 + set {floorItems(319)} $i + $w create text 141.5 209 -text 319 -fill $color -anchor c -tags {floor3 label} + set i [$w create polygon 65 368 58 368 58 389 1 389 1 333 23 333 23 323 65 323 -fill {} -tags {floor3 room}] + set floorLabels($i) 311 + set {floorItems(311)} $i + $w create text 29.5 361 -text 311 -fill $color -anchor c -tags {floor3 label} + set i [$w create polygon 154 191 111 191 111 169 154 169 -fill {} -tags {floor3 room}] + set floorLabels($i) 318 + set {floorItems(318)} $i + $w create text 132.5 180 -text 318 -fill $color -anchor c -tags {floor3 label} + set i [$w create polygon 175 168 97 168 97 131 175 131 -fill {} -tags {floor3 room}] + set floorLabels($i) 317 + set {floorItems(317)} $i + $w create text 136 149.5 -text 317 -fill $color -anchor c -tags {floor3 label} + set i [$w create polygon 274 194 274 221 306 221 306 194 -fill {} -tags {floor3 room}] + set floorLabels($i) 323 + set {floorItems(323)} $i + $w create text 290 207.5 -text 323 -fill $color -anchor c -tags {floor3 label} + set i [$w create polygon 306 222 274 222 274 249 306 249 -fill {} -tags {floor3 room}] + set floorLabels($i) 325 + set {floorItems(325)} $i + $w create text 290 235.5 -text 325 -fill $color -anchor c -tags {floor3 label} + set i [$w create polygon 263 179 224 179 224 135 263 135 -fill {} -tags {floor3 room}] + set floorLabels($i) 321 + set {floorItems(321)} $i + $w create text 243.5 157 -text 321 -fill $color -anchor c -tags {floor3 label} + set i [$w create polygon 314 169 306 169 306 192 273 192 264 181 264 135 314 135 -fill {} -tags {floor3 room}] + set floorLabels($i) 322 + set {floorItems(322)} $i + $w create text 293.5 163.5 -text 322 -fill $color -anchor c -tags {floor3 label} + set i [$w create polygon 307 240 339 240 339 206 307 206 -fill {} -tags {floor3 room}] + set floorLabels($i) {Pub Lift3} + set {floorItems(Pub Lift3)} $i + $w create text 323 223 -text {Pub Lift3} -fill $color -anchor c -tags {floor3 label} + set i [$w create polygon 339 205 307 205 307 171 339 171 -fill {} -tags {floor3 room}] + set floorLabels($i) {Priv Lift3} + set {floorItems(Priv Lift3)} $i + $w create text 323 188 -text {Priv Lift3} -fill $color -anchor c -tags {floor3 label} + set i [$w create polygon 350 284 376 284 376 276 397 276 397 309 350 309 -fill {} -tags {floor3 room}] + set floorLabels($i) 303 + set {floorItems(303)} $i + $w create text 373.5 292.5 -text 303 -fill $color -anchor c -tags {floor3 label} + set i [$w create polygon 272 203 272 249 252 249 252 230 244 230 244 221 252 221 252 203 -fill {} -tags {floor3 room}] + set floorLabels($i) 324 + set {floorItems(324)} $i + $w create text 262 226 -text 324 -fill $color -anchor c -tags {floor3 label} + set i [$w create polygon 299 276 299 327 349 327 349 284 341 284 341 276 -fill {} -tags {floor3 room}] + set floorLabels($i) 304 + set {floorItems(304)} $i + $w create text 324 301.5 -text 304 -fill $color -anchor c -tags {floor3 label} + set i [$w create polygon 375 246 375 172 341 172 341 246 -fill {} -tags {floor3 room}] + set floorLabels($i) 301 + set {floorItems(301)} $i + $w create text 358 209 -text 301 -fill $color -anchor c -tags {floor3 label} + set i [$w create polygon 397 246 377 246 377 185 397 185 -fill {} -tags {floor3 room}] + set floorLabels($i) 327 + set {floorItems(327)} $i + $w create text 387 215.5 -text 327 -fill $color -anchor c -tags {floor3 label} + set i [$w create polygon 316 131 316 169 377 169 377 185 397 185 397 131 -fill {} -tags {floor3 room}] + set floorLabels($i) 326 + set {floorItems(326)} $i + $w create text 356.5 150 -text 326 -fill $color -anchor c -tags {floor3 label} + set i [$w create polygon 308 251 242 251 242 274 342 274 342 282 375 282 375 274 397 274 397 248 339 248 339 242 308 242 -fill {} -tags {floor3 room}] + set floorLabels($i) 302 + set {floorItems(302)} $i + $w create text 319.5 261 -text 302 -fill $color -anchor c -tags {floor3 label} + set i [$w create polygon 70 321 242 321 242 200 259 200 259 203 272 203 272 193 263 180 242 180 175 180 175 169 156 169 156 196 177 196 177 228 107 228 70 228 70 275 107 275 107 248 160 248 160 301 107 301 107 275 70 275 -fill {} -tags {floor3 room}] + set floorLabels($i) 306 + set {floorItems(306)} $i + $w create text 200.5 284.5 -text 306 -fill $color -anchor c -tags {floor3 label} + $w create line 341 275 341 283 -fill $color -tags {floor3 wall} + $w create line 162 197 155 197 -fill $color -tags {floor3 wall} + $w create line 396 247 399 247 -fill $color -tags {floor3 wall} + $w create line 399 129 399 311 -fill $color -tags {floor3 wall} + $w create line 258 202 243 202 -fill $color -tags {floor3 wall} + $w create line 350 283 350 329 -fill $color -tags {floor3 wall} + $w create line 251 231 243 231 -fill $color -tags {floor3 wall} + $w create line 243 220 251 220 -fill $color -tags {floor3 wall} + $w create line 243 250 243 202 -fill $color -tags {floor3 wall} + $w create line 155 197 155 190 -fill $color -tags {floor3 wall} + $w create line 110 192 110 169 -fill $color -tags {floor3 wall} + $w create line 155 192 110 192 -fill $color -tags {floor3 wall} + $w create line 155 177 155 169 -fill $color -tags {floor3 wall} + $w create line 176 197 176 227 -fill $color -tags {floor3 wall} + $w create line 69 280 69 274 -fill $color -tags {floor3 wall} + $w create line 21 276 69 276 -fill $color -tags {floor3 wall} + $w create line 69 262 69 226 -fill $color -tags {floor3 wall} + $w create line 21 228 69 228 -fill $color -tags {floor3 wall} + $w create line 21 179 75 179 -fill $color -tags {floor3 wall} + $w create line 69 179 69 214 -fill $color -tags {floor3 wall} + $w create line 90 220 90 227 -fill $color -tags {floor3 wall} + $w create line 90 204 90 202 -fill $color -tags {floor3 wall} + $w create line 90 203 100 203 -fill $color -tags {floor3 wall} + $w create line 90 187 90 179 -fill $color -tags {floor3 wall} + $w create line 90 227 176 227 -fill $color -tags {floor3 wall} + $w create line 100 179 100 227 -fill $color -tags {floor3 wall} + $w create line 100 179 87 179 -fill $color -tags {floor3 wall} + $w create line 96 179 96 129 -fill $color -tags {floor3 wall} + $w create line 162 169 96 169 -fill $color -tags {floor3 wall} + $w create line 173 169 176 169 -fill $color -tags {floor3 wall} + $w create line 182 179 176 179 -fill $color -tags {floor3 wall} + $w create line 176 129 176 179 -fill $color -tags {floor3 wall} + $w create line 195 179 226 179 -fill $color -tags {floor3 wall} + $w create line 224 133 224 179 -fill $color -tags {floor3 wall} + $w create line 264 179 264 133 -fill $color -tags {floor3 wall} + $w create line 238 179 264 179 -fill $color -tags {floor3 wall} + $w create line 273 207 273 193 -fill $color -tags {floor3 wall} + $w create line 273 235 273 250 -fill $color -tags {floor3 wall} + $w create line 273 224 273 219 -fill $color -tags {floor3 wall} + $w create line 273 193 307 193 -fill $color -tags {floor3 wall} + $w create line 273 222 307 222 -fill $color -tags {floor3 wall} + $w create line 273 250 307 250 -fill $color -tags {floor3 wall} + $w create line 384 247 376 247 -fill $color -tags {floor3 wall} + $w create line 340 206 307 206 -fill $color -tags {floor3 wall} + $w create line 340 187 340 170 -fill $color -tags {floor3 wall} + $w create line 340 210 340 201 -fill $color -tags {floor3 wall} + $w create line 340 247 340 224 -fill $color -tags {floor3 wall} + $w create line 340 241 307 241 -fill $color -tags {floor3 wall} + $w create line 376 247 376 170 -fill $color -tags {floor3 wall} + $w create line 307 250 307 170 -fill $color -tags {floor3 wall} + $w create line 376 170 307 170 -fill $color -tags {floor3 wall} + $w create line 315 129 315 170 -fill $color -tags {floor3 wall} + $w create line 376 283 366 283 -fill $color -tags {floor3 wall} + $w create line 376 283 376 275 -fill $color -tags {floor3 wall} + $w create line 399 275 376 275 -fill $color -tags {floor3 wall} + $w create line 341 275 320 275 -fill $color -tags {floor3 wall} + $w create line 341 283 350 283 -fill $color -tags {floor3 wall} + $w create line 298 275 298 329 -fill $color -tags {floor3 wall} + $w create line 308 275 298 275 -fill $color -tags {floor3 wall} + $w create line 243 322 243 275 -fill $color -tags {floor3 wall} + $w create line 243 275 284 275 -fill $color -tags {floor3 wall} + $w create line 258 322 226 322 -fill $color -tags {floor3 wall} + $w create line 212 370 212 322 -fill $color -tags {floor3 wall} + $w create line 214 322 177 322 -fill $color -tags {floor3 wall} + $w create line 163 370 163 322 -fill $color -tags {floor3 wall} + $w create line 165 322 129 322 -fill $color -tags {floor3 wall} + $w create line 84 322 117 322 -fill $color -tags {floor3 wall} + $w create line 71 322 64 322 -fill $color -tags {floor3 wall} + $w create line 115 322 115 370 -fill $color -tags {floor3 wall} + $w create line 66 322 66 370 -fill $color -tags {floor3 wall} + $w create line 52 322 21 322 -fill $color -tags {floor3 wall} + $w create line 21 331 0 331 -fill $color -tags {floor3 wall} + $w create line 21 331 21 133 -fill $color -tags {floor3 wall} + $w create line 96 133 21 133 -fill $color -tags {floor3 wall} + $w create line 176 129 96 129 -fill $color -tags {floor3 wall} + $w create line 315 133 176 133 -fill $color -tags {floor3 wall} + $w create line 315 129 399 129 -fill $color -tags {floor3 wall} + $w create line 399 311 350 311 -fill $color -tags {floor3 wall} + $w create line 350 329 258 329 -fill $color -tags {floor3 wall} + $w create line 258 322 258 370 -fill $color -tags {floor3 wall} + $w create line 60 370 258 370 -fill $color -tags {floor3 wall} + $w create line 60 370 60 391 -fill $color -tags {floor3 wall} + $w create line 0 391 0 331 -fill $color -tags {floor3 wall} + $w create line 60 391 0 391 -fill $color -tags {floor3 wall} + $w create line 307 250 307 242 -fill $color -tags {floor3 wall} + $w create line 273 250 307 250 -fill $color -tags {floor3 wall} + $w create line 258 250 243 250 -fill $color -tags {floor3 wall} +} + +# Below is the "main program" that creates the floorplan demonstration. + +set w .floor +global c currentRoom colors activeFloor +catch {destroy $w} +toplevel $w +wm title $w "Floorplan Canvas Demonstration" +wm iconname $w "Floorplan" +wm geometry $w +20+20 +wm minsize $w 100 100 + +label $w.msg -font $font -wraplength 8i -justify left -text "This window contains a canvas widget showing the floorplan of Digital Equipment Corporation's Western Research Laboratory. It has three levels. At any given time one of the levels is active, meaning that you can see its room structure. To activate a level, click the left mouse button anywhere on it. As the mouse moves over the active level, the room under the mouse lights up and its room number appears in the \"Room:\" entry. You can also type a room number in the entry and the room will light up." +pack $w.msg -side top + +## See Code / Dismiss buttons +set btns [addSeeDismiss $w.buttons $w] +pack $btns -side bottom -fill x + +set f [frame $w.frame] +pack $f -side top -fill both -expand yes +set h [ttk::scrollbar $f.hscroll -orient horizontal] +set v [ttk::scrollbar $f.vscroll -orient vertical] +set f1 [frame $f.f1 -borderwidth 2 -relief sunken] +set c [canvas $f1.c -width 900 -height 500 -highlightthickness 0 \ + -xscrollcommand [list $h set] \ + -yscrollcommand [list $v set]] +pack $c -expand yes -fill both +grid $f1 -padx 1 -pady 1 -row 0 -column 0 -rowspan 1 -columnspan 1 -sticky news +grid $v -padx 1 -pady 1 -row 0 -column 1 -rowspan 1 -columnspan 1 -sticky news +grid $h -padx 1 -pady 1 -row 1 -column 0 -rowspan 1 -columnspan 1 -sticky news +grid rowconfig $f 0 -weight 1 -minsize 0 +grid columnconfig $f 0 -weight 1 -minsize 0 +pack $f -expand yes -fill both -padx 1 -pady 1 + +$v configure -command [list $c yview] +$h configure -command [list $c xview] + +# Create an entry for displaying and typing in current room. + +entry $c.entry -width 10 -textvariable currentRoom + +# Choose colors, then fill in the floorplan. + +if {[winfo depth $c] > 1} { + set colors(bg1) #a9c1da + set colors(outline1) #77889a + set colors(bg2) #9ab0c6 + set colors(outline2) #687786 + set colors(bg3) #8ba0b3 + set colors(outline3) #596673 + set colors(offices) Black + set colors(active) #c4d1df +} else { + set colors(bg1) white + set colors(outline1) black + set colors(bg2) white + set colors(outline2) black + set colors(bg3) white + set colors(outline3) black + set colors(offices) Black + set colors(active) black +} +set activeFloor "" +floorDisplay $c 3 + +# Set up event bindings for canvas: + +$c bind floor1 <1> "floorDisplay $c 1" +$c bind floor2 <1> "floorDisplay $c 2" +$c bind floor3 <1> "floorDisplay $c 3" +$c bind room "newRoom $c" +$c bind room {set currentRoom ""} +bind $c <2> "$c scan mark %x %y" +bind $c "$c scan dragto %x %y" +bind $c "unset currentRoom" +set currentRoom "" +trace variable currentRoom w "roomChanged $c" diff --git a/env/tcl/tk8.6/demos/fontchoose.tcl b/env/tcl/tk8.6/demos/fontchoose.tcl new file mode 100644 index 0000000..8b34377 --- /dev/null +++ b/env/tcl/tk8.6/demos/fontchoose.tcl @@ -0,0 +1,69 @@ +# fontchoose.tcl -- +# +# Show off the stock font selector dialog + +if {![info exists widgetDemo]} { + error "This script should be run from the \"widget\" demo." +} + +package require Tk + +set w .fontchoose +catch {destroy $w} +toplevel $w +wm title $w "Font Selection Dialog" +wm iconname $w "fontchooser" +positionWindow $w + +catch {font create FontchooseDemoFont {*}[font actual TkDefaultFont]} + +# The font chooser needs to be configured and then shown. +proc SelectFont {parent} { + tk fontchooser configure -font FontchooseDemoFont \ + -command ApplyFont -parent $parent + tk fontchooser show +} + +proc ApplyFont {font} { + font configure FontchooseDemoFont {*}[font actual $font] +} + +# When the visibility of the fontchooser changes, the following event is fired +# to the parent widget. +# +bind $w <> { + if {[tk fontchooser configure -visible]} { + %W.f.font state disabled + } else { + %W.f.font state !disabled + } +} + + +set f [ttk::frame $w.f -relief sunken -padding 2] + +text $f.msg -font FontchooseDemoFont -width 40 -height 6 -borderwidth 0 \ + -yscrollcommand [list $f.vs set] +ttk::scrollbar $f.vs -command [list $f.msg yview] + +$f.msg insert end "Press the buttons below to choose a new font for the\ + text shown in this window.\n" {} + +ttk::button $f.font -text "Set font ..." -command [list SelectFont $w] + +grid $f.msg $f.vs -sticky news +grid $f.font - -sticky e +grid columnconfigure $f 0 -weight 1 +grid rowconfigure $f 0 -weight 1 +bind $w { + bind %W {} + grid propagate %W.f 0 +} + +## See Code / Dismiss buttons +set btns [addSeeDismiss $w.buttons $w] + +grid $f -sticky news +grid $btns -sticky ew +grid columnconfigure $w 0 -weight 1 +grid rowconfigure $w 0 -weight 1 diff --git a/env/tcl/tk8.6/demos/form.tcl b/env/tcl/tk8.6/demos/form.tcl new file mode 100644 index 0000000..4d80437 --- /dev/null +++ b/env/tcl/tk8.6/demos/form.tcl @@ -0,0 +1,38 @@ +# form.tcl -- +# +# This demonstration script creates a simple form with a bunch +# of entry widgets. + +if {![info exists widgetDemo]} { + error "This script should be run from the \"widget\" demo." +} + +package require Tk + +set w .form +catch {destroy $w} +toplevel $w +wm title $w "Form Demonstration" +wm iconname $w "form" +positionWindow $w + +label $w.msg -font $font -wraplength 4i -justify left -text "This window contains a simple form where you can type in the various entries and use tabs to move circularly between the entries." +pack $w.msg -side top + +## See Code / Dismiss buttons +set btns [addSeeDismiss $w.buttons $w] +pack $btns -side bottom -fill x + +foreach i {f1 f2 f3 f4 f5} { + frame $w.$i -bd 2 + entry $w.$i.entry -relief sunken -width 40 + label $w.$i.label + pack $w.$i.entry -side right + pack $w.$i.label -side left +} +$w.f1.label config -text Name: +$w.f2.label config -text Address: +$w.f5.label config -text Phone: +pack $w.msg $w.f1 $w.f2 $w.f3 $w.f4 $w.f5 -side top -fill x +bind $w "destroy $w" +focus $w.f1.entry diff --git a/env/tcl/tk8.6/demos/goldberg.tcl b/env/tcl/tk8.6/demos/goldberg.tcl new file mode 100644 index 0000000..284b5c2 --- /dev/null +++ b/env/tcl/tk8.6/demos/goldberg.tcl @@ -0,0 +1,1833 @@ +##+################################################################# +# +# TkGoldberg.tcl +# by Keith Vetter, March 13, 2003 +# +# "Man will always find a difficult means to perform a simple task" +# Rube Goldberg +# +# Reproduced here with permission. +# +##+################################################################# +# +# Keith Vetter 2003-03-21: this started out as a simple little program +# but was so much fun that it grew and grew. So I apologize about the +# size but I just couldn't resist sharing it. +# +# This is a whizzlet that does a Rube Goldberg type animation, the +# design of which comes from an New Years e-card from IncrediMail. +# That version had nice sound effects which I eschewed. On the other +# hand, that version was in black and white (actually dark blue and +# light blue) and this one is fully colorized. +# +# One thing I learned from this project is that drawing filled complex +# objects on a canvas is really hard. More often than not I had to +# draw each item twice--once with the desired fill color but no +# outline, and once with no fill but with the outline. Another trick +# is erasing by drawing with the background color. Having a flood fill +# command would have been extremely helpful. +# +# Two wiki pages were extremely helpful: Drawing rounded rectangles +# which I generalized into Drawing rounded polygons, and regular +# polygons which allowed me to convert ovals and arcs into polygons +# which could then be rotated (see Canvas Rotation). I also wrote +# Named Colors to aid in the color selection. +# +# I could comment on the code, but it's just 26 state machines with +# lots of canvas create and move calls. + +if {![info exists widgetDemo]} { + error "This script should be run from the \"widget\" demo." +} + +package require Tk + +set w .goldberg +catch {destroy $w} +toplevel $w +wm title $w "Tk Goldberg (demonstration)" +wm iconname $w "goldberg" +wm resizable $w 0 0 +#positionWindow $w + +label $w.msg -font {Arial 10} -wraplength 4i -justify left -text "This is a\ + demonstration of just how complex you can make your animations\ + become. Click the ball to start things moving!\n\n\"Man will always\ + find a difficult means to perform a simple task\"\n - Rube Goldberg" +pack $w.msg -side top + +###--- End of Boilerplate ---### + +# Ensure that this this is an array +array set animationCallbacks {} +bind $w { + if {"%W" eq [winfo toplevel %W]} { + unset S C speed + } +} + +set S(title) "Tk Goldberg" +set S(speed) 5 +set S(cnt) 0 +set S(message) "\\nWelcome\\nto\\nTcl/Tk" +array set speed {1 10 2 20 3 50 4 80 5 100 6 150 7 200 8 300 9 400 10 500} + +set MSTART 0; set MGO 1; set MPAUSE 2; set MSSTEP 3; set MBSTEP 4; set MDONE 5 +set S(mode) $::MSTART + +# Colors for everything +set C(fg) black +set C(bg) gray75 +set C(bg) cornflowerblue + +set C(0) white; set C(1a) darkgreen; set C(1b) yellow +set C(2) red; set C(3a) green; set C(3b) darkblue +set C(4) $C(fg); set C(5a) brown; set C(5b) white +set C(6) magenta; set C(7) green; set C(8) $C(fg) +set C(9) blue4; set C(10a) white; set C(10b) cyan +set C(11a) yellow; set C(11b) mediumblue; set C(12) tan2 +set C(13a) yellow; set C(13b) red; set C(14) white +set C(15a) green; set C(15b) yellow; set C(16) gray65 +set C(17) \#A65353; set C(18) $C(fg); set C(19) gray50 +set C(20) cyan; set C(21) gray65; set C(22) $C(20) +set C(23a) blue; set C(23b) red; set C(23c) yellow +set C(24a) red; set C(24b) white; + +proc DoDisplay {w} { + global S C + + ttk::frame $w.ctrl -relief ridge -borderwidth 2 -padding 5 + pack [frame $w.screen -bd 2 -relief raised] \ + -side left -fill both -expand 1 + + canvas $w.c -width 860 -height 730 -bg $C(bg) -highlightthickness 0 + $w.c config -scrollregion {0 0 1000 1000} ;# Kludge: move everything up + $w.c yview moveto .05 + pack $w.c -in $w.screen -side top -fill both -expand 1 + + bind $w.c <3> [list $w.pause invoke] + bind $w.c { + after cancel $animationCallbacks(goldberg) + unset animationCallbacks(goldberg) + } + DoCtrlFrame $w + DoDetailFrame $w + if {[tk windowingsystem] ne "aqua"} { + ttk::button $w.show -text "\u00bb" -command [list ShowCtrl $w] -width 2 + } else { + button $w.show -text "\u00bb" -command [list ShowCtrl $w] -width 2 -highlightbackground $C(bg) + } + place $w.show -in $w.c -relx 1 -rely 0 -anchor ne + update +} + +proc DoCtrlFrame {w} { + global S + ttk::button $w.start -text "Start" -command [list DoButton $w 0] + ttk::checkbutton $w.pause -text "Pause" -command [list DoButton $w 1] \ + -variable S(pause) + ttk::button $w.step -text "Single Step" -command [list DoButton $w 2] + ttk::button $w.bstep -text "Big Step" -command [list DoButton $w 4] + ttk::button $w.reset -text "Reset" -command [list DoButton $w 3] + ttk::labelframe $w.details + raise $w.details + set S(details) 0 + ttk::checkbutton $w.details.cb -text "Details" -variable S(details) + ttk::labelframe $w.message -text "Message" + ttk::entry $w.message.e -textvariable S(message) -justify center + ttk::labelframe $w.speed -text "Speed: 0" + ttk::scale $w.speed.scale -orient h -from 1 -to 10 -variable S(speed) + ttk::button $w.about -text About -command [list About $w] + + grid $w.start -in $w.ctrl -row 0 -sticky ew + grid rowconfigure $w.ctrl 1 -minsize 10 + grid $w.pause -in $w.ctrl -row 2 -sticky ew + grid $w.step -in $w.ctrl -sticky ew -pady 2 + grid $w.bstep -in $w.ctrl -sticky ew + grid $w.reset -in $w.ctrl -sticky ew -pady 2 + grid rowconfigure $w.ctrl 10 -minsize 18 + grid $w.details -in $w.ctrl -row 11 -sticky ew + grid rowconfigure $w.ctrl 11 -minsize 20 + $w.details configure -labelwidget $w.details.cb + grid [ttk::frame $w.details.b -height 1] ;# Work around minor bug + raise $w.details + raise $w.details.cb + grid rowconfigure $w.ctrl 50 -weight 1 + trace variable ::S(mode) w [list ActiveGUI $w] + trace variable ::S(details) w [list ActiveGUI $w] + trace variable ::S(speed) w [list ActiveGUI $w] + + grid $w.message -in $w.ctrl -row 98 -sticky ew -pady 5 + grid $w.message.e -sticky nsew + grid $w.speed -in $w.ctrl -row 99 -sticky ew -pady {0 5} + pack $w.speed.scale -fill both -expand 1 + grid $w.about -in $w.ctrl -row 100 -sticky ew + bind $w.reset <3> {set S(mode) -1} ;# Debugging + + ## See Code / Dismiss buttons hack! + set btns [addSeeDismiss $w.ctrl.buttons $w] + grid [ttk::separator $w.ctrl.sep] -sticky ew -pady 4 + set i 0 + foreach b [winfo children $btns] { + if {[winfo class $b] eq "TButton"} { + grid [set b2 [ttk::button $w.ctrl.b[incr i]]] -sticky ew + foreach b3 [$b configure] { + set b3 [lindex $b3 0] + # Some options are read-only; ignore those errors + catch {$b2 configure $b3 [$b cget $b3]} + } + } + } + destroy $btns +} + +proc DoDetailFrame {w} { + set w2 $w.details.f + ttk::frame $w2 + + set bd 2 + ttk::label $w2.l -textvariable S(cnt) -background white + grid $w2.l - - - -sticky ew -row 0 + for {set i 1} {1} {incr i} { + if {[info procs "Move$i"] eq ""} break + ttk::label $w2.l$i -text $i -anchor e -width 2 -background white + ttk::label $w2.ll$i -textvariable STEP($i) -width 5 -background white + set row [expr {($i + 1) / 2}] + set col [expr {(($i + 1) & 1) * 2}] + grid $w2.l$i -sticky ew -row $row -column $col + grid $w2.ll$i -sticky ew -row $row -column [incr col] + } + grid columnconfigure $w2 1 -weight 1 +} + +# Map or unmap the ctrl window +proc ShowCtrl {w} { + if {[winfo ismapped $w.ctrl]} { + pack forget $w.ctrl + $w.show config -text "\u00bb" + } else { + pack $w.ctrl -side right -fill both -ipady 5 + $w.show config -text "\u00ab" + } +} + +proc DrawAll {w} { + ResetStep + $w.c delete all + for {set i 0} {1} {incr i} { + set p "Draw$i" + if {[info procs $p] eq ""} break + $p $w + } +} + +proc ActiveGUI {w var1 var2 op} { + global S MGO MSTART MDONE + array set z {0 disabled 1 normal} + + set m $S(mode) + set S(pause) [expr {$m == 2}] + $w.start config -state $z([expr {$m != $MGO}]) + $w.pause config -state $z([expr {$m != $MSTART && $m != $MDONE}]) + $w.step config -state $z([expr {$m != $MGO && $m != $MDONE}]) + $w.bstep config -state $z([expr {$m != $MGO && $m != $MDONE}]) + $w.reset config -state $z([expr {$m != $MSTART}]) + + if {$S(details)} { + grid $w.details.f -sticky ew + } else { + grid forget $w.details.f + } + set S(speed) [expr {round($S(speed))}] + $w.speed config -text "Speed: $S(speed)" +} + +proc Start {} { + global S MGO + set S(mode) $MGO +} + +proc DoButton {w what} { + global S MDONE MGO MSSTEP MBSTEP MPAUSE + + if {$what == 0} { ;# Start + if {$S(mode) == $MDONE} { + Reset $w + } + set S(mode) $MGO + } elseif {$what == 1} { ;# Pause + set S(mode) [expr {$S(pause) ? $MPAUSE : $MGO}] + } elseif {$what == 2} { ;# Step + set S(mode) $MSSTEP + } elseif {$what == 3} { ;# Reset + Reset $w + } elseif {$what == 4} { ;# Big step + set S(mode) $MBSTEP + } +} + +proc Go {w {who {}}} { + global S speed animationCallbacks MGO MPAUSE MSSTEP MBSTEP + + set now [clock clicks -milliseconds] + catch {after cancel $animationCallbacks(goldberg)} + if {$who ne ""} { ;# Start here for debugging + set S(active) $who; + set S(mode) $MGO + } + if {$S(mode) == -1} return ;# Debugging + set n 0 + if {$S(mode) != $MPAUSE} { ;# Not paused + set n [NextStep $w] ;# Do the next move + } + if {$S(mode) == $MSSTEP} { ;# Single step + set S(mode) $MPAUSE + } + if {$S(mode) == $MBSTEP && $n} { ;# Big step + set S(mode) $MSSTEP + } + + set elapsed [expr {[clock click -milliseconds] - $now}] + set delay [expr {$speed($S(speed)) - $elapsed}] + if {$delay <= 0} { + set delay 1 + } + set animationCallbacks(goldberg) [after $delay [list Go $w]] +} + +# NextStep: drives the next step of the animation +proc NextStep {w} { + global S MSTART MDONE + set rval 0 ;# Return value + + if {$S(mode) != $MSTART && $S(mode) != $MDONE} { + incr S(cnt) + } + set alive {} + foreach {who} $S(active) { + set n ["Move$who" $w] + if {$n & 1} { ;# This guy still alive + lappend alive $who + } + if {$n & 2} { ;# Next guy is active + lappend alive [expr {$who + 1}] + set rval 1 + } + if {$n & 4} { ;# End of puzzle flag + set S(mode) $MDONE ;# Done mode + set S(active) {} ;# No more animation + return 1 + } + } + set S(active) $alive + return $rval +} +proc About {w} { + set msg "$::S(title)\nby Keith Vetter, March 2003\n(Reproduced by kind\ + permission of the author)\n\n\"Man will always find a difficult\ + means to perform a simple task.\"\nRube Goldberg" + tk_messageBox -parent $w -message $msg -title About +} +################################################################ +# +# All the drawing and moving routines +# + +# START HERE! banner +proc Draw0 {w} { + set color $::C(0) + set xy {579 119} + $w.c create text $xy -text "START HERE!" -fill $color -anchor w \ + -tag I0 -font {{Times Roman} 12 italic bold} + set xy {719 119 763 119} + $w.c create line $xy -tag I0 -fill $color -width 5 -arrow last \ + -arrowshape {18 18 5} + $w.c bind I0 <1> Start +} +proc Move0 {w {step {}}} { + set step [GetStep 0 $step] + + if {$::S(mode) > $::MSTART} { ;# Start the ball rolling + MoveAbs $w I0 {-100 -100} ;# Hide the banner + return 2 + } + + set pos { + {673 119} {678 119} {683 119} {688 119} + {693 119} {688 119} {683 119} {678 119} + } + set step [expr {$step % [llength $pos]}] + MoveAbs $w I0 [lindex $pos $step] + return 1 +} + +# Dropping ball +proc Draw1 {w} { + set color $::C(1a) + set color2 $::C(1b) + set xy {844 133 800 133 800 346 820 346 820 168 844 168 844 133} + $w.c create poly $xy -width 3 -fill $color -outline {} + set xy {771 133 685 133 685 168 751 168 751 346 771 346 771 133} + $w.c create poly $xy -width 3 -fill $color -outline {} + + set xy [box 812 122 9] + $w.c create oval $xy -tag I1 -fill $color2 -outline {} + $w.c bind I1 <1> Start +} +proc Move1 {w {step {}}} { + set step [GetStep 1 $step] + set pos { + {807 122} {802 122} {797 123} {793 124} {789 129} {785 153} + {785 203} {785 278 x} {785 367} {810 392} {816 438} {821 503} + {824 585 y} {838 587} {848 593} {857 601} {-100 -100} + } + if {$step >= [llength $pos]} { + return 0 + } + set where [lindex $pos $step] + MoveAbs $w I1 $where + + if {[lindex $where 2] eq "y"} { + Move15a $w + } + if {[lindex $where 2] eq "x"} { + return 3 + } + return 1 +} + +# Lighting the match +proc Draw2 {w} { + set color red + set color $::C(2) + set xy {750 369 740 392 760 392} ;# Fulcrum + $w.c create poly $xy -fill $::C(fg) -outline $::C(fg) + set xy {628 335 660 383} ;# Strike box + $w.c create rect $xy -fill {} -outline $::C(fg) + for {set y 0} {$y < 3} {incr y} { + set yy [expr {335+$y*16}] + $w.c create bitmap 628 $yy -bitmap gray25 -anchor nw \ + -foreground $::C(fg) + $w.c create bitmap 644 $yy -bitmap gray25 -anchor nw \ + -foreground $::C(fg) + } + + set xy {702 366 798 366} ;# Lever + $w.c create line $xy -fill $::C(fg) -width 6 -tag I2_0 + set xy {712 363 712 355} ;# R strap + $w.c create line $xy -fill $::C(fg) -width 3 -tag I2_1 + set xy {705 363 705 355} ;# L strap + $w.c create line $xy -fill $::C(fg) -width 3 -tag I2_2 + set xy {679 356 679 360 717 360 717 356 679 356} ;# Match stick + $w.c create line $xy -fill $::C(fg) -tag I2_3 + + #set xy {662 352 680 365} ;# Match head + set xy { + 671 352 677.4 353.9 680 358.5 677.4 363.1 671 365 664.6 363.1 + 662 358.5 664.6 353.9 + } + $w.c create poly $xy -fill $color -outline $color -tag I2_4 +} +proc Move2 {w {step {}}} { + set step [GetStep 2 $step] + + set stages {0 0 1 2 0 2 1 0 1 2 0 2 1} + set xy(0) { + 686 333 692 323 682 316 674 309 671 295 668 307 662 318 662 328 + 671 336 + } + set xy(1) {687 331 698 322 703 295 680 320 668 297 663 311 661 327 671 335} + set xy(2) { + 686 331 704 322 688 300 678 283 678 283 674 298 666 309 660 324 + 672 336 + } + + if {$step >= [llength $stages]} { + $w.c delete I2 + return 0 + } + + if {$step == 0} { ;# Rotate the match + set beta 20 + lassign [Anchor $w I2_0 s] Ox Oy ;# Where to pivot + for {set i 0} {[$w.c find withtag I2_$i] ne ""} {incr i} { + RotateItem $w I2_$i $Ox $Oy $beta + } + $w.c create poly -tag I2 -smooth 1 -fill $::C(2) ;# For the flame + return 1 + } + $w.c coords I2 $xy([lindex $stages $step]) + return [expr {$step == 7 ? 3 : 1}] +} + +# Weight and pulleys +proc Draw3 {w} { + set color $::C(3a) + set color2 $::C(3b) + + set xy {602 296 577 174 518 174} + foreach {x y} $xy { ;# 3 Pulleys + $w.c create oval [box $x $y 13] -fill $color -outline $::C(fg) \ + -width 3 + $w.c create oval [box $x $y 2] -fill $::C(fg) -outline $::C(fg) + } + + set xy {750 309 670 309} ;# Wall to flame + $w.c create line $xy -tag I3_s -width 3 -fill $::C(fg) -smooth 1 + set xy {670 309 650 309} ;# Flame to pulley 1 + $w.c create line $xy -tag I3_0 -width 3 -fill $::C(fg) + set xy {650 309 600 309} ;# Flame to pulley 1 + $w.c create line $xy -tag I3_1 -width 3 -fill $::C(fg) + set xy {589 296 589 235} ;# Pulley 1 half way to 2 + $w.c create line $xy -tag I3_2 -width 3 -fill $::C(fg) + set xy {589 235 589 174} ;# Pulley 1 other half to 2 + $w.c create line $xy -width 3 -fill $::C(fg) + set xy {577 161 518 161} ;# Across the top + $w.c create line $xy -width 3 -fill $::C(fg) + set xy {505 174 505 205} ;# Down to weight + $w.c create line $xy -tag I3_w -width 3 -fill $::C(fg) + + # Draw the weight as 2 circles, two rectangles and 1 rounded rectangle + set xy {515 207 495 207} + foreach {x1 y1 x2 y2} $xy { + $w.c create oval [box $x1 $y1 6] -tag I3_ -fill $color2 \ + -outline $color2 + $w.c create oval [box $x2 $y2 6] -tag I3_ -fill $color2 \ + -outline $color2 + incr y1 -6; incr y2 6 + $w.c create rect $x1 $y1 $x2 $y2 -tag I3_ -fill $color2 \ + -outline $color2 + } + set xy {492 220 518 263} + set xy [RoundRect $w $xy 15] + $w.c create poly $xy -smooth 1 -tag I3_ -fill $color2 -outline $color2 + set xy {500 217 511 217} + $w.c create line $xy -tag I3_ -fill $color2 -width 10 + + set xy {502 393 522 393 522 465} ;# Bottom weight target + $w.c create line $xy -tag I3__ -fill $::C(fg) -join miter -width 10 +} +proc Move3 {w {step {}}} { + set step [GetStep 3 $step] + + set pos {{505 247} {505 297} {505 386.5} {505 386.5}} + set rope(0) {750 309 729 301 711 324 690 300} + set rope(1) {750 309 737 292 736 335 717 315 712 320} + set rope(2) {750 309 737 309 740 343 736 351 725 340} + set rope(3) {750 309 738 321 746 345 742 356} + + if {$step >= [llength $pos]} { + return 0 + } + + $w.c delete "I3_$step" ;# Delete part of the rope + MoveAbs $w I3_ [lindex $pos $step] ;# Move weight down + $w.c coords I3_s $rope($step) ;# Flapping rope end + $w.c coords I3_w [concat 505 174 [lindex $pos $step]] + if {$step == 2} { + $w.c move I3__ 0 30 + return 2 + } + return 1 +} + +# Cage and door +proc Draw4 {w} { + set color $::C(4) + lassign {527 356 611 464} x0 y0 x1 y1 + + for {set y $y0} {$y <= $y1} {incr y 12} { ;# Horizontal bars + $w.c create line $x0 $y $x1 $y -fill $color -width 1 + } + for {set x $x0} {$x <= $x1} {incr x 12} { ;# Vertical bars + $w.c create line $x $y0 $x $y1 -fill $color -width 1 + } + + set xy {518 464 518 428} ;# Swing gate + $w.c create line $xy -tag I4 -fill $color -width 3 +} +proc Move4 {w {step {}}} { + set step [GetStep 4 $step] + + set angles {-10 -20 -30 -30} + if {$step >= [llength $angles]} { + return 0 + } + RotateItem $w I4 518 464 [lindex $angles $step] + $w.c raise I4 + return [expr {$step == 3 ? 3 : 1}] +} + +# Mouse +proc Draw5 {w} { + set color $::C(5a) + set color2 $::C(5b) + set xy {377 248 410 248 410 465 518 465} ;# Mouse course + lappend xy 518 428 451 428 451 212 377 212 + $w.c create poly $xy -fill $color2 -outline $::C(fg) -width 3 + + set xy { + 534.5 445.5 541 440 552 436 560 436 569 440 574 446 575 452 574 454 + 566 456 554 456 545 456 537 454 530 452 + } + $w.c create poly $xy -tag {I5 I5_0} -fill $color + set xy {573 452 592 458 601 460 613 456} ;# Tail + $w.c create line $xy -tag {I5 I5_1} -fill $color -smooth 1 -width 3 + set xy [box 540 446 2] ;# Eye + set xy {540 444 541 445 541 447 540 448 538 447 538 445} + #.c create oval $xy -tag {I5 I5_2} -fill $::C(bg) -outline {} + $w.c create poly $xy -tag {I5 I5_2} -fill $::C(bg) -outline {} -smooth 1 + set xy {538 454 535 461} ;# Front leg + $w.c create line $xy -tag {I5 I5_3} -fill $color -width 2 + set xy {566 455 569 462} ;# Back leg + $w.c create line $xy -tag {I5 I5_4} -fill $color -width 2 + set xy {544 455 545 460} ;# 2nd front leg + $w.c create line $xy -tag {I5 I5_5} -fill $color -width 2 + set xy {560 455 558 460} ;# 2nd back leg + $w.c create line $xy -tag {I5 I5_6} -fill $color -width 2 +} +proc Move5 {w {step {}}} { + set step [GetStep 5 $step] + + set pos { + {553 452} {533 452} {513 452} {493 452} {473 452} + {463 442 30} {445.5 441.5 30} {425.5 434.5 30} {422 414} {422 394} + {422 374} {422 354} {422 334} {422 314} {422 294} + {422 274 -30} {422 260.5 -30 x} {422.5 248.5 -28} {425 237} + } + if {$step >= [llength $pos]} { + return 0 + } + + lassign [lindex $pos $step] x y beta next + MoveAbs $w I5 [list $x $y] + if {$beta ne ""} { + lassign [Centroid $w I5_0] Ox Oy + foreach id {0 1 2 3 4 5 6} { + RotateItem $w I5_$id $Ox $Oy $beta + } + } + if {$next eq "x"} { + return 3 + } + return 1 +} + +# Dropping gumballs +array set XY6 { + -1 {366 207} -2 {349 204} -3 {359 193} -4 {375 192} -5 {340 190} + -6 {349 177} -7 {366 177} -8 {380 176} -9 {332 172} -10 {342 161} + -11 {357 164} -12 {372 163} -13 {381 149} -14 {364 151} -15 {349 146} + -16 {333 148} 0 {357 219} + 1 {359 261} 2 {359 291} 3 {359 318} 4 {361 324} 5 {365 329} 6 {367 334} + 7 {367 340} 8 {366 346} 9 {364 350} 10 {361 355} 11 {359 370} 12 {359 391} + 13,0 {360 456} 13,1 {376 456} 13,2 {346 456} 13,3 {330 456} + 13,4 {353 444} 13,5 {368 443} 13,6 {339 442} 13,7 {359 431} + 13,8 {380 437} 13,9 {345 428} 13,10 {328 434} 13,11 {373 424} + 13,12 {331 420} 13,13 {360 417} 13,14 {345 412} 13,15 {376 410} + 13,16 {360 403} +} +proc Draw6 {w} { + set color $::C(6) + set xy {324 130 391 204} ;# Ball holder + set xy [RoundRect $w $xy 10] + $w.c create poly $xy -smooth 1 -outline $::C(fg) -width 3 -fill $color + set xy {339 204 376 253} ;# Below the ball holder + $w.c create rect $xy -fill {} -outline $::C(fg) -width 3 -fill $color \ + -tag I6c + set xy [box 346 339 28] + $w.c create oval $xy -fill $color -outline {} ;# Rotor + $w.c create arc $xy -outline $::C(fg) -width 2 -style arc \ + -start 80 -extent 205 + $w.c create arc $xy -outline $::C(fg) -width 2 -style arc \ + -start -41 -extent 85 + + set xy [box 346 339 15] ;# Center of rotor + $w.c create oval $xy -outline $::C(fg) -fill $::C(fg) -tag I6m + set xy {352 312 352 254 368 254 368 322} ;# Top drop to rotor + $w.c create poly $xy -fill $color -outline {} + $w.c create line $xy -fill $::C(fg) -width 2 + + set xy {353 240 367 300} ;# Poke bottom hole + $w.c create rect $xy -fill $color -outline {} + set xy {341 190 375 210} ;# Poke another hole + $w.c create rect $xy -fill $color -outline {} + + set xy {368 356 368 403 389 403 389 464 320 464 320 403 352 403 352 366} + $w.c create poly $xy -fill $color -outline {} -width 2 ;# Below rotor + $w.c create line $xy -fill $::C(fg) -width 2 + set xy [box 275 342 7] ;# On/off rotor + $w.c create oval $xy -outline $::C(fg) -fill $::C(fg) + set xy {276 334 342 325} ;# Fan belt top + $w.c create line $xy -fill $::C(fg) -width 3 + set xy {276 349 342 353} ;# Fan belt bottom + $w.c create line $xy -fill $::C(fg) -width 3 + + set xy {337 212 337 247} ;# What the mouse pushes + $w.c create line $xy -fill $::C(fg) -width 3 -tag I6_ + set xy {392 212 392 247} + $w.c create line $xy -fill $::C(fg) -width 3 -tag I6_ + set xy {337 230 392 230} + $w.c create line $xy -fill $::C(fg) -width 7 -tag I6_ + + set who -1 ;# All the balls + set colors {red cyan orange green blue darkblue} + lappend colors {*}$colors {*}$colors + + for {set i 0} {$i < 17} {incr i} { + set loc [expr {-1 * $i}] + set color [lindex $colors $i] + $w.c create oval [box {*}$::XY6($loc) 5] -fill $color \ + -outline $color -tag I6_b$i + } + Draw6a $w 12 ;# The wheel +} +proc Draw6a {w beta} { + $w.c delete I6_0 + lassign {346 339} Ox Oy + for {set i 0} {$i < 4} {incr i} { + set b [expr {$beta + $i * 45}] + lassign [RotateC 28 0 0 0 $b] x y + set xy [list [expr {$Ox+$x}] [expr {$Oy+$y}] \ + [expr {$Ox-$x}] [expr {$Oy-$y}]] + $w.c create line $xy -tag I6_0 -fill $::C(fg) -width 2 + } +} +proc Move6 {w {step {}}} { + set step [GetStep 6 $step] + if {$step > 62} { + return 0 + } + + if {$step < 2} { ;# Open gate for balls to drop + $w.c move I6_ -7 0 + if {$step == 1} { ;# Poke a hole + set xy {348 226 365 240} + $w.c create rect $xy -fill [$w.c itemcget I6c -fill] -outline {} + } + return 1 + } + + set s [expr {$step - 1}] ;# Do the gumball drop dance + for {set i 0} {$i <= int(($s-1) / 3)} {incr i} { + set tag "I6_b$i" + if {[$w.c find withtag $tag] eq ""} break + set loc [expr {$s - 3 * $i}] + + if {[info exists ::XY6($loc,$i)]} { + MoveAbs $w $tag $::XY6($loc,$i) + } elseif {[info exists ::XY6($loc)]} { + MoveAbs $w $tag $::XY6($loc) + } + } + if {($s % 3) == 1} { + set first [expr {($s + 2) / 3}] + for {set i $first} {1} {incr i} { + set tag "I6_b$i" + if {[$w.c find withtag $tag] eq ""} break + set loc [expr {$first - $i}] + MoveAbs $w $tag $::XY6($loc) + } + } + if {$s >= 3} { ;# Rotate the motor + set idx [expr {$s % 3}] + #Draw6a $w [lindex {12 35 64} $idx] + Draw6a $w [expr {12 + $s * 15}] + } + return [expr {$s == 3 ? 3 : 1}] +} + +# On/off switch +proc Draw7 {w} { + set color $::C(7) + set xy {198 306 277 374} ;# Box + $w.c create rect $xy -outline $::C(fg) -width 2 -fill $color -tag I7z + $w.c lower I7z + set xy {275 343 230 349} + $w.c create line $xy -tag I7 -fill $::C(fg) -arrow last \ + -arrowshape {23 23 8} -width 6 + set xy {225 324} ;# On button + $w.c create oval [box {*}$xy 3] -fill $::C(fg) -outline $::C(fg) + set xy {218 323} ;# On text + set font {{Times Roman} 8} + $w.c create text $xy -text "on" -anchor e -fill $::C(fg) -font $font + set xy {225 350} ;# Off button + $w.c create oval [box {*}$xy 3] -fill $::C(fg) -outline $::C(fg) + set xy {218 349} ;# Off button + $w.c create text $xy -text "off" -anchor e -fill $::C(fg) -font $font +} +proc Move7 {w {step {}}} { + set step [GetStep 7 $step] + set numsteps 30 + if {$step > $numsteps} { + return 0 + } + set beta [expr {30.0 / $numsteps}] + RotateItem $w I7 275 343 $beta + + return [expr {$step == $numsteps ? 3 : 1}] +} + +# Electricity to the fan +proc Draw8 {w} { + Sine $w 271 248 271 306 5 8 -tag I8_s -fill $::C(8) -width 3 +} +proc Move8 {w {step {}}} { + set step [GetStep 8 $step] + + if {$step > 3} { + return 0 + } + if {$step == 0} { + Sparkle $w [Anchor $w I8_s s] I8 + return 1 + + } elseif {$step == 1} { + MoveAbs $w I8 [Anchor $w I8_s c] + } elseif {$step == 2} { + MoveAbs $w I8 [Anchor $w I8_s n] + } else { + $w.c delete I8 + } + return [expr {$step == 2 ? 3 : 1}] +} + +# Fan +proc Draw9 {w} { + set color $::C(9) + set xy {266 194 310 220} + $w.c create oval $xy -outline $color -fill $color + set xy {280 209 296 248} + $w.c create oval $xy -outline $color -fill $color + set xy {288 249 252 249 260 240 280 234 296 234 316 240 324 249 288 249} + $w.c create poly $xy -fill $color -smooth 1 + + set xy {248 205 265 214 264 205 265 196} ;# Spinner + $w.c create poly $xy -fill $color + + set xy {255 206 265 234} ;# Fan blades + $w.c create oval $xy -fill {} -outline $::C(fg) -width 3 -tag I9_0 + set xy {255 176 265 204} + $w.c create oval $xy -fill {} -outline $::C(fg) -width 3 -tag I9_0 + set xy {255 206 265 220} + $w.c create oval $xy -fill {} -outline $::C(fg) -width 1 -tag I9_1 + set xy {255 190 265 204} + $w.c create oval $xy -fill {} -outline $::C(fg) -width 1 -tag I9_1 +} +proc Move9 {w {step {}}} { + set step [GetStep 9 $step] + + if {$step & 1} { + $w.c itemconfig I9_0 -width 4 + $w.c itemconfig I9_1 -width 1 + $w.c lower I9_1 I9_0 + } else { + $w.c itemconfig I9_0 -width 1 + $w.c itemconfig I9_1 -width 4 + $w.c lower I9_0 I9_1 + } + if {$step == 0} { + return 3 + } + return 1 +} + +# Boat +proc Draw10 {w} { + set color $::C(10a) + set color2 $::C(10b) + set xy {191 230 233 230 233 178 191 178} ;# Sail + $w.c create poly $xy -fill $color -width 3 -outline $::C(fg) -tag I10 + set xy [box 209 204 31] ;# Front + $w.c create arc $xy -outline {} -fill $color -style pie \ + -start 120 -extent 120 -tag I10 + $w.c create arc $xy -outline $::C(fg) -width 3 -style arc \ + -start 120 -extent 120 -tag I10 + set xy [box 249 204 31] ;# Back + $w.c create arc $xy -outline {} -fill $::C(bg) -width 3 -style pie \ + -start 120 -extent 120 -tag I10 + $w.c create arc $xy -outline $::C(fg) -width 3 -style arc \ + -start 120 -extent 120 -tag I10 + + set xy {200 171 200 249} ;# Mast + $w.c create line $xy -fill $::C(fg) -width 3 -tag I10 + set xy {159 234 182 234} ;# Bow sprit + $w.c create line $xy -fill $::C(fg) -width 3 -tag I10 + set xy {180 234 180 251 220 251} ;# Hull + $w.c create line $xy -fill $::C(fg) -width 6 -tag I10 + + set xy {92 255 221 255} ;# Waves + Sine $w {*}$xy 2 25 -fill $color2 -width 1 -tag I10w + + set xy [lrange [$w.c coords I10w] 4 end-4] ;# Water + set xy [concat $xy 222 266 222 277 99 277] + $w.c create poly $xy -fill $color2 -outline $color2 + set xy {222 266 222 277 97 277 97 266} ;# Water bottom + $w.c create line $xy -fill $::C(fg) -width 3 + + set xy [box 239 262 17] + $w.c create arc $xy -outline $::C(fg) -width 3 -style arc \ + -start 95 -extent 103 + set xy [box 76 266 21] + $w.c create arc $xy -outline $::C(fg) -width 3 -style arc -extent 190 +} +proc Move10 {w {step {}}} { + set step [GetStep 10 $step] + set pos { + {195 212} {193 212} {190 212} {186 212} {181 212} {176 212} + {171 212} {166 212} {161 212} {156 212} {151 212} {147 212} {142 212} + {137 212} {132 212 x} {127 212} {121 212} {116 212} {111 212} + } + + if {$step >= [llength $pos]} { + return 0 + } + set where [lindex $pos $step] + MoveAbs $w I10 $where + + if {[lindex $where 2] eq "x"} { + return 3 + } + return 1 +} + +# 2nd ball drop +proc Draw11 {w} { + set color $::C(11a) + set color2 $::C(11b) + set xy {23 264 55 591} ;# Color the down tube + $w.c create rect $xy -fill $color -outline {} + set xy [box 71 460 48] ;# Color the outer loop + $w.c create oval $xy -fill $color -outline {} + + set xy {55 264 55 458} ;# Top right side + $w.c create line $xy -fill $::C(fg) -width 3 + set xy {55 504 55 591} ;# Bottom right side + $w.c create line $xy -fill $::C(fg) -width 3 + set xy [box 71 460 48] ;# Outer loop + $w.c create arc $xy -outline $::C(fg) -width 3 -style arc \ + -start 110 -extent -290 -tag I11i + set xy [box 71 460 16] ;# Inner loop + $w.c create oval $xy -outline $::C(fg) -fill {} -width 3 -tag I11i + $w.c create oval $xy -outline $::C(fg) -fill $::C(bg) -width 3 + + set xy {23 264 23 591} ;# Left side + $w.c create line $xy -fill $::C(fg) -width 3 + set xy [box 1 266 23] ;# Top left curve + $w.c create arc $xy -outline $::C(fg) -width 3 -style arc -extent 90 + + set xy [box 75 235 9] ;# The ball + $w.c create oval $xy -fill $color2 -outline {} -width 3 -tag I11 +} +proc Move11 {w {step {}}} { + set step [GetStep 11 $step] + set pos { + {75 235} {70 235} {65 237} {56 240} {46 247} {38 266} {38 296} + {38 333} {38 399} {38 475} {74 496} {105 472} {100 437} {65 423} + {-100 -100} {38 505} {38 527 x} {38 591} + } + + if {$step >= [llength $pos]} { + return 0 + } + set where [lindex $pos $step] + MoveAbs $w I11 $where + if {[lindex $where 2] eq "x"} { + return 3 + } + return 1 +} + +# Hand +proc Draw12 {w} { + set xy {20 637 20 617 20 610 20 590 40 590 40 590 60 590 60 610 60 610} + lappend xy 60 610 65 620 60 631 ;# Thumb + lappend xy 60 631 60 637 60 662 60 669 52 669 56 669 50 669 50 662 50 637 + + set y0 637 ;# Bumps for fingers + set y1 645 + for {set x 50} {$x > 20} {incr x -10} { + set x1 [expr {$x - 5}] + set x2 [expr {$x - 10}] + lappend xy $x $y0 $x1 $y1 $x2 $y0 + } + $w.c create poly $xy -fill $::C(12) -outline $::C(fg) -smooth 1 -tag I12 \ + -width 3 +} +proc Move12 {w {step {}}} { + set step [GetStep 12 $step] + set pos {{42.5 641 x}} + if {$step >= [llength $pos]} { + return 0 + } + + set where [lindex $pos $step] + MoveAbs $w I12 $where + if {[lindex $where 2] eq "x"} { + return 3 + } + return 1 +} + +# Fax +proc Draw13 {w} { + set color $::C(13a) + set xy {86 663 149 663 149 704 50 704 50 681 64 681 86 671} + set xy2 {784 663 721 663 721 704 820 704 820 681 806 681 784 671} + set radii {2 9 9 8 5 5 2} + + RoundPoly $w.c $xy $radii -width 3 -outline $::C(fg) -fill $color + RoundPoly $w.c $xy2 $radii -width 3 -outline $::C(fg) -fill $color + + set xy {56 677} + $w.c create rect [box {*}$xy 4] -fill {} -outline $::C(fg) -width 3 \ + -tag I13 + set xy {809 677} + $w.c create rect [box {*}$xy 4] -fill {} -outline $::C(fg) -width 3 \ + -tag I13R + + set xy {112 687} ;# Label + $w.c create text $xy -text "FAX" -fill $::C(fg) \ + -font {{Times Roman} 12 bold} + set xy {762 687} + $w.c create text $xy -text "FAX" -fill $::C(fg) \ + -font {{Times Roman} 12 bold} + + set xy {138 663 148 636 178 636} ;# Paper guide + $w.c create line $xy -smooth 1 -fill $::C(fg) -width 3 + set xy {732 663 722 636 692 636} + $w.c create line $xy -smooth 1 -fill $::C(fg) -width 3 + + Sine $w 149 688 720 688 5 15 -tag I13_s -fill $::C(fg) -width 3 +} +proc Move13 {w {step {}}} { + set step [GetStep 13 $step] + set numsteps 7 + + if {$step == $numsteps+2} { + MoveAbs $w I13_star {-100 -100} + $w.c itemconfig I13R -fill $::C(13b) -width 2 + return 2 + } + if {$step == 0} { ;# Button down + $w.c delete I13 + Sparkle $w {-100 -100} I13_star ;# Create off screen + return 1 + } + lassign [Anchor $w I13_s w] x0 y0 + lassign [Anchor $w I13_s e] x1 y1 + set x [expr {$x0 + ($x1-$x0) * ($step - 1) / double($numsteps)}] + MoveAbs $w I13_star [list $x $y0] + return 1 +} + +# Paper in fax +proc Draw14 {w} { + set color $::C(14) + set xy {102 661 113 632 130 618} ;# Left paper edge + $w.c create line $xy -smooth 1 -fill $color -width 3 -tag I14L_0 + set xy {148 629 125 640 124 662} ;# Right paper edge + $w.c create line $xy -smooth 1 -fill $color -width 3 -tag I14L_1 + Draw14a $w L + + set xy { + 768.0 662.5 767.991316225 662.433786215 767.926187912 662.396880171 + } + $w.c create line $xy -smooth 1 -fill $color -width 3 -tag I14R_0 + $w.c lower I14R_0 + # NB. these numbers are VERY sensitive, you must start with final size + # and shrink down to get the values + set xy { + 745.947897349 662.428358855 745.997829056 662.452239237 746.0 662.5 + } + $w.c create line $xy -smooth 1 -fill $color -width 3 -tag I14R_1 + $w.c lower I14R_1 +} +proc Draw14a {w side} { + set color $::C(14) + set xy [$w.c coords I14${side}_0] + set xy2 [$w.c coords I14${side}_1] + lassign $xy x0 y0 x1 y1 x2 y2 + lassign $xy2 x3 y3 x4 y4 x5 y5 + set zz [concat \ + $x0 $y0 $x0 $y0 $xy $x2 $y2 $x2 $y2 \ + $x3 $y3 $x3 $y3 $xy2 $x5 $y5 $x5 $y5] + $w.c delete I14$side + $w.c create poly $zz -tag I14$side -smooth 1 -fill $color -outline $color \ + -width 3 + $w.c lower I14$side +} +proc Move14 {w {step {}}} { + set step [GetStep 14 $step] + + # Paper going down + set sc [expr {.9 - .05*$step}] + if {$sc < .3} { + $w.c delete I14L + return 0 + } + + lassign [$w.c coords I14L_0] Ox Oy + $w.c scale I14L_0 $Ox $Oy $sc $sc + lassign [lrange [$w.c coords I14L_1] end-1 end] Ox Oy + $w.c scale I14L_1 $Ox $Oy $sc $sc + Draw14a $w L + + # Paper going up + set sc [expr {.35 + .05*$step}] + set sc [expr {1 / $sc}] + + lassign [$w.c coords I14R_0] Ox Oy + $w.c scale I14R_0 $Ox $Oy $sc $sc + lassign [lrange [$w.c coords I14R_1] end-1 end] Ox Oy + $w.c scale I14R_1 $Ox $Oy $sc $sc + Draw14a $w R + + return [expr {$step == 10 ? 3 : 1}] +} + +# Light beam +proc Draw15 {w} { + set color $::C(15a) + set xy {824 599 824 585 820 585 829 585} + $w.c create line $xy -fill $::C(fg) -width 3 -tag I15a + set xy {789 599 836 643} + $w.c create rect $xy -fill $color -outline $::C(fg) -width 3 + set xy {778 610 788 632} + $w.c create rect $xy -fill $color -outline $::C(fg) -width 3 + set xy {766 617 776 625} + $w.c create rect $xy -fill $color -outline $::C(fg) -width 3 + + set xy {633 600 681 640} + $w.c create rect $xy -fill $color -outline $::C(fg) -width 3 + set xy {635 567 657 599} + $w.c create rect $xy -fill $color -outline $::C(fg) -width 2 + set xy {765 557 784 583} + $w.c create rect $xy -fill $color -outline $::C(fg) -width 2 + + Sine $w 658 580 765 580 3 15 -tag I15_s -fill $::C(fg) -width 3 +} +proc Move15a {w} { + set color $::C(15b) + $w.c scale I15a 824 599 1 .3 ;# Button down + set xy {765 621 681 621} + $w.c create line $xy -dash "-" -width 3 -fill $color -tag I15 +} +proc Move15 {w {step {}}} { + set step [GetStep 15 $step] + set numsteps 6 + + if {$step == $numsteps+2} { + MoveAbs $w I15_star {-100 -100} + return 2 + } + if {$step == 0} { ;# Break the light beam + Sparkle $w {-100 -100} I15_star + set xy {765 621 745 621} + $w.c coords I15 $xy + return 1 + } + lassign [Anchor $w I15_s w] x0 y0 + lassign [Anchor $w I15_s e] x1 y1 + set x [expr {$x0 + ($x1-$x0) * ($step - 1) / double($numsteps)}] + MoveAbs $w I15_star [list $x $y0] + return 1 +} + +# Bell +proc Draw16 {w} { + set color $::C(16) + set xy {722 485 791 556} + $w.c create rect $xy -fill {} -outline $::C(fg) -width 3 + set xy [box 752 515 25] ;# Bell + $w.c create oval $xy -fill $color -outline black -tag I16b -width 2 + set xy [box 752 515 5] ;# Bell button + $w.c create oval $xy -fill black -outline black -tag I16b + + set xy {784 523 764 549} ;# Clapper + $w.c create line $xy -width 3 -tag I16c -fill $::C(fg) + set xy [box 784 523 4] + $w.c create oval $xy -fill $::C(fg) -outline $::C(fg) -tag I16d +} +proc Move16 {w {step {}}} { + set step [GetStep 16 $step] + + # Note: we never stop + lassign {760 553} Ox Oy + if {$step & 1} { + set beta 12 + $w.c move I16b 3 0 + } else { + set beta -12 + $w.c move I16b -3 0 + } + RotateItem $w I16c $Ox $Oy $beta + RotateItem $w I16d $Ox $Oy $beta + + return [expr {$step == 1 ? 3 : 1}] +} + +# Cat +proc Draw17 {w} { + set color $::C(17) + + set xy {584 556 722 556} + $w.c create line $xy -fill $::C(fg) -width 3 + set xy {584 485 722 485} + $w.c create line $xy -fill $::C(fg) -width 3 + + set xy {664 523 717 549} ;# Body + $w.c create arc $xy -outline $::C(fg) -fill $color -width 3 \ + -style chord -start 128 -extent -260 -tag I17 + + set xy {709 554 690 543} ;# Paw + $w.c create oval $xy -outline $::C(fg) -fill $color -width 3 -tag I17 + set xy {657 544 676 555} + $w.c create oval $xy -outline $::C(fg) -fill $color -width 3 -tag I17 + + set xy [box 660 535 15] ;# Lower face + $w.c create arc $xy -outline $::C(fg) -width 3 -style arc \ + -start 150 -extent 240 -tag I17_ + $w.c create arc $xy -outline {} -fill $color -width 1 -style chord \ + -start 150 -extent 240 -tag I17_ + set xy {674 529 670 513 662 521 658 521 650 513 647 529} ;# Ears + $w.c create line $xy -fill $::C(fg) -width 3 -tag I17_ + $w.c create poly $xy -fill $color -outline {} -width 1 -tag {I17_ I17_c} + set xy {652 542 628 539} ;# Whiskers + $w.c create line $xy -fill $::C(fg) -width 3 -tag I17_ + set xy {652 543 632 545} + $w.c create line $xy -fill $::C(fg) -width 3 -tag I17_ + set xy {652 546 632 552} + $w.c create line $xy -fill $::C(fg) -width 3 -tag I17_ + + set xy {668 543 687 538} + $w.c create line $xy -fill $::C(fg) -width 3 -tag {I17_ I17w} + set xy {668 544 688 546} + $w.c create line $xy -fill $::C(fg) -width 3 -tag {I17_ I17w} + set xy {668 547 688 553} + $w.c create line $xy -fill $::C(fg) -width 3 -tag {I17_ I17w} + + set xy {649 530 654 538 659 530} ;# Left eye + $w.c create line $xy -fill $::C(fg) -width 2 -smooth 1 -tag I17 + set xy {671 530 666 538 661 530} ;# Right eye + $w.c create line $xy -fill $::C(fg) -width 2 -smooth 1 -tag I17 + set xy {655 543 660 551 665 543} ;# Mouth + $w.c create line $xy -fill $::C(fg) -width 2 -smooth 1 -tag I17 +} +proc Move17 {w {step {}}} { + set step [GetStep 17 $step] + + if {$step == 0} { + $w.c delete I17 ;# Delete most of the cat + set xy {655 543 660 535 665 543} ;# Mouth + $w.c create line $xy -fill $::C(fg) -width 3 -smooth 1 -tag I17_ + set xy [box 654 530 4] ;# Left eye + $w.c create oval $xy -outline $::C(fg) -width 3 -fill {} -tag I17_ + set xy [box 666 530 4] ;# Right eye + $w.c create oval $xy -outline $::C(fg) -width 3 -fill {} -tag I17_ + + $w.c move I17_ 0 -20 ;# Move face up + set xy {652 528 652 554} ;# Front leg + $w.c create line $xy -fill $::C(fg) -width 3 -tag I17_ + set xy {670 528 670 554} ;# 2nd front leg + $w.c create line $xy -fill $::C(fg) -width 3 -tag I17_ + + set xy { + 675 506 694 489 715 513 715 513 715 513 716 525 716 525 716 525 + 706 530 695 530 679 535 668 527 668 527 668 527 675 522 676 517 + 677 512 + } ;# Body + $w.c create poly $xy -fill [$w.c itemcget I17_c -fill] \ + -outline $::C(fg) -width 3 -smooth 1 -tag I17_ + set xy {716 514 716 554} ;# Back leg + $w.c create line $xy -fill $::C(fg) -width 3 -tag I17_ + set xy {694 532 694 554} ;# 2nd back leg + $w.c create line $xy -fill $::C(fg) -width 3 -tag I17_ + set xy {715 514 718 506 719 495 716 488};# Tail + $w.c create line $xy -fill $::C(fg) -width 3 -smooth 1 -tag I17_ + + $w.c raise I17w ;# Make whiskers visible + $w.c move I17_ -5 0 ;# Move away from wall a bit + return 2 + } + return 0 +} + +# Sling shot +proc Draw18 {w} { + set color $::C(18) + set xy {721 506 627 506} ;# Sling hold + $w.c create line $xy -width 4 -fill $::C(fg) -tag I18 + + set xy {607 500 628 513} ;# Sling rock + $w.c create oval $xy -fill $color -outline {} -tag I18a + + set xy {526 513 606 507 494 502} ;# Sling band + $w.c create line $xy -fill $::C(fg) -width 4 -tag I18b + set xy { 485 490 510 540 510 575 510 540 535 491 } ;# Sling + $w.c create line $xy -fill $::C(fg) -width 6 +} +proc Move18 {w {step {}}} { + set step [GetStep 18 $step] + + set pos { + {587 506} {537 506} {466 506} {376 506} {266 506 x} {136 506} + {16 506} {-100 -100} + } + + set b(0) {490 502 719 507 524 512} ;# Band collapsing + set b(1) { + 491 503 524 557 563 505 559 496 546 506 551 525 553 536 538 534 + 532 519 529 499 + } + set b(2) {491 503 508 563 542 533 551 526 561 539 549 550 530 500} + set b(3) {491 503 508 563 530 554 541 562 525 568 519 544 530 501} + + if {$step >= [llength $pos]} { + return 0 + } + + if {$step == 0} { + $w.c delete I18 + $w.c itemconfig I18b -smooth 1 + } + if {[info exists b($step)]} { + $w.c coords I18b $b($step) + } + + set where [lindex $pos $step] + MoveAbs $w I18a $where + if {[lindex $where 2] eq "x"} { + return 3 + } + return 1 +} + +# Water pipe +proc Draw19 {w} { + set color $::C(19) + set xx {249 181 155 118 86 55 22 0} + foreach {x1 x2} $xx { + $w.c create rect $x1 453 $x2 467 -fill $color -outline {} -tag I19 + $w.c create line $x1 453 $x2 453 -fill $::C(fg) -width 1;# Pipe top + $w.c create line $x1 467 $x2 467 -fill $::C(fg) -width 1;# Pipe bottom + } + $w.c raise I11i + + set xy [box 168 460 16] ;# Bulge by the joint + $w.c create oval $xy -fill $color -outline {} + $w.c create arc $xy -outline $::C(fg) -width 1 -style arc \ + -start 21 -extent 136 + $w.c create arc $xy -outline $::C(fg) -width 1 -style arc \ + -start -21 -extent -130 + + set xy {249 447 255 473} ;# First joint 26x6 + $w.c create rect $xy -fill $color -outline $::C(fg) -width 1 + + set xy [box 257 433 34] ;# Bend up + $w.c create arc $xy -outline {} -fill $color -width 1 \ + -style pie -start 0 -extent -91 + $w.c create arc $xy -outline $::C(fg) -width 1 \ + -style arc -start 0 -extent -90 + set xy [box 257 433 20] + $w.c create arc $xy -outline {} -fill $::C(bg) -width 1 \ + -style pie -start 0 -extent -92 + $w.c create arc $xy -outline $::C(fg) -width 1 \ + -style arc -start 0 -extent -90 + set xy [box 257 421 34] ;# Bend left + $w.c create arc $xy -outline {} -fill $color -width 1 \ + -style pie -start 1 -extent 91 + $w.c create arc $xy -outline $::C(fg) -width 1 \ + -style arc -start 0 -extent 90 + set xy [box 257 421 20] + $w.c create arc $xy -outline {} -fill $::C(bg) -width 1 \ + -style pie -start 0 -extent 90 + $w.c create arc $xy -outline $::C(fg) -width 1 \ + -style arc -start 0 -extent 90 + set xy [box 243 421 34] ;# Bend down + $w.c create arc $xy -outline {} -fill $color -width 1 \ + -style pie -start 90 -extent 90 + $w.c create arc $xy -outline $::C(fg) -width 1 \ + -style arc -start 90 -extent 90 + set xy [box 243 421 20] + $w.c create arc $xy -outline {} -fill $::C(bg) -width 1 \ + -style pie -start 90 -extent 90 + $w.c create arc $xy -outline $::C(fg) -width 1 \ + -style arc -start 90 -extent 90 + + set xy {270 427 296 433} ;# 2nd joint bottom + $w.c create rect $xy -fill $color -outline $::C(fg) -width 1 + set xy {270 421 296 427} ;# 2nd joint top + $w.c create rect $xy -fill $color -outline $::C(fg) -width 1 + set xy {249 382 255 408} ;# Third joint right + $w.c create rect $xy -fill $color -outline $::C(fg) -width 1 + set xy {243 382 249 408} ;# Third joint left + $w.c create rect $xy -fill $color -outline $::C(fg) -width 1 + set xy {203 420 229 426} ;# Last joint + $w.c create rect $xy -fill $color -outline $::C(fg) -width 1 + + set xy [box 168 460 6] ;# Handle joint + $w.c create oval $xy -fill $::C(fg) -outline {} -tag I19a + set xy {168 460 168 512} ;# Handle bar + $w.c create line $xy -fill $::C(fg) -width 5 -tag I19b +} +proc Move19 {w {step {}}} { + set step [GetStep 19 $step] + + set angles {30 30 30} + if {$step == [llength $angles]} { + return 2 + } + + RotateItem $w I19b {*}[Centroid $w I19a] [lindex $angles $step] + return 1 +} + +# Water pouring +proc Draw20 {w} { +} +proc Move20 {w {step {}}} { + set step [GetStep 20 $step] + + set pos {451 462 473 484 496 504 513 523 532} + set freq {20 40 40 40 40 40 40 40 40} + set pos { + {451 20} {462 40} {473 40} {484 40} {496 40} {504 40} {513 40} + {523 40} {532 40 x} + } + if {$step >= [llength $pos]} { + return 0 + } + + $w.c delete I20 + set where [lindex $pos $step] + lassign $where y f + H2O $w $y $f + if {[lindex $where 2] eq "x"} { + return 3 + } + return 1 +} +proc H2O {w y f} { + set color $::C(20) + $w.c delete I20 + + Sine $w 208 428 208 $y 4 $f -tag {I20 I20s} -width 3 -fill $color \ + -smooth 1 + $w.c create line [$w.c coords I20s] -width 3 -fill $color -smooth 1 \ + -tag {I20 I20a} + $w.c create line [$w.c coords I20s] -width 3 -fill $color -smooth 1 \ + -tag {I20 I20b} + $w.c move I20a 8 0 + $w.c move I20b 16 0 +} + +# Bucket +proc Draw21 {w} { + set color $::C(21) + set xy {217 451 244 490} ;# Right handle + $w.c create line $xy -fill $::C(fg) -width 2 -tag I21_a + set xy {201 467 182 490} ;# Left handle + $w.c create line $xy -fill $::C(fg) -width 2 -tag I21_a + + set xy {245 490 237 535} ;# Right side + set xy2 {189 535 181 490} ;# Left side + $w.c create poly [concat $xy $xy2] -fill $color -outline {} \ + -tag {I21 I21f} + $w.c create line $xy -fill $::C(fg) -width 2 -tag I21 + $w.c create line $xy2 -fill $::C(fg) -width 2 -tag I21 + + set xy {182 486 244 498} ;# Top + $w.c create oval $xy -fill $color -outline {} -width 2 -tag {I21 I21f} + $w.c create oval $xy -fill {} -outline $::C(fg) -width 2 -tag {I21 I21t} + set xy {189 532 237 540} ;# Bottom + $w.c create oval $xy -fill $color -outline $::C(fg) -width 2 \ + -tag {I21 I21b} +} +proc Move21 {w {step {}}} { + set step [GetStep 21 $step] + + set numsteps 30 + if {$step >= $numsteps} { + return 0 + } + + lassign [$w.c coords I21b] x1 y1 x2 y2 + #lassign [$w.c coords I21t] X1 Y1 X2 Y2 + lassign {183 492 243 504} X1 Y1 X2 Y2 + + set f [expr {$step / double($numsteps)}] + set y2 [expr {$y2 - 3}] + set xx1 [expr {$x1 + ($X1 - $x1) * $f}] + set yy1 [expr {$y1 + ($Y1 - $y1) * $f}] + set xx2 [expr {$x2 + ($X2 - $x2) * $f}] + set yy2 [expr {$y2 + ($Y2 - $y2) * $f}] + #H2O $w $yy1 40 + + $w.c itemconfig I21b -fill $::C(20) + $w.c delete I21w + $w.c create poly $x2 $y2 $x1 $y1 $xx1 $yy1 $xx2 $yy1 -tag {I21 I21w} \ + -outline {} -fill $::C(20) + $w.c lower I21w I21 + $w.c raise I21b + $w.c lower I21f + + return [expr {$step == $numsteps-1 ? 3 : 1}] +} + +# Bucket drop +proc Draw22 {w} { +} +proc Move22 {w {step {}}} { + set step [GetStep 22 $step] + set pos {{213 513} {213 523} {213 543 x} {213 583} {213 593}} + + if {$step == 0} {$w.c itemconfig I21f -fill $::C(22)} + if {$step >= [llength $pos]} { + return 0 + } + set where [lindex $pos $step] + MoveAbs $w I21 $where + H2O $w [lindex $where 1] 40 + $w.c delete I21_a ;# Delete handles + + if {[lindex $where 2] eq "x"} { + return 3 + } + return 1 +} + +# Blow dart +proc Draw23 {w} { + set color $::C(23a) + set color2 $::C(23b) + set color3 $::C(23c) + + set xy {185 623 253 650} ;# Block + $w.c create rect $xy -fill black -outline $::C(fg) -width 2 -tag I23a + set xy {187 592 241 623} ;# Balloon + $w.c create oval $xy -outline {} -fill $color -tag I23b + $w.c create arc $xy -outline $::C(fg) -width 3 -tag I23b \ + -style arc -start 12 -extent 336 + set xy {239 604 258 589 258 625 239 610} ;# Balloon nozzle + $w.c create poly $xy -outline {} -fill $color -tag I23b + $w.c create line $xy -fill $::C(fg) -width 3 -tag I23b + + set xy {285 611 250 603} ;# Dart body + $w.c create oval $xy -fill $color2 -outline $::C(fg) -width 3 -tag I23d + set xy {249 596 249 618 264 607 249 596} ;# Dart tail + $w.c create poly $xy -fill $color3 -outline $::C(fg) -width 3 -tag I23d + set xy {249 607 268 607} ;# Dart detail + $w.c create line $xy -fill $::C(fg) -width 3 -tag I23d + set xy {285 607 305 607} ;# Dart needle + $w.c create line $xy -fill $::C(fg) -width 3 -tag I23d +} +proc Move23 {w {step {}}} { + set step [GetStep 23 $step] + + set pos { + {277 607} {287 607} {307 607 x} {347 607} {407 607} {487 607} + {587 607} {687 607} {787 607} {-100 -100} + } + + if {$step >= [llength $pos]} { + return 0 + } + if {$step <= 1} { + $w.c scale I23b {*}[Anchor $w I23a n] .9 .5 + } + set where [lindex $pos $step] + MoveAbs $w I23d $where + + if {[lindex $where 2] eq "x"} { + return 3 + } + return 1 +} + +# Balloon +proc Draw24 {w} { + set color $::C(24a) + set xy {366 518 462 665} ;# Balloon + $w.c create oval $xy -fill $color -outline $::C(fg) -width 3 -tag I24 + set xy {414 666 414 729} ;# String + $w.c create line $xy -fill $::C(fg) -width 3 -tag I24 + set xy {410 666 404 673 422 673 418 666} ;# Nozzle + $w.c create poly $xy -fill $color -outline $::C(fg) -width 3 -tag I24 + + set xy {387 567 390 549 404 542} ;# Reflections + $w.c create line $xy -fill $::C(fg) -smooth 1 -width 2 -tag I24 + set xy {395 568 399 554 413 547} + $w.c create line $xy -fill $::C(fg) -smooth 1 -width 2 -tag I24 + set xy {403 570 396 555 381 553} + $w.c create line $xy -fill $::C(fg) -smooth 1 -width 2 -tag I24 + set xy {408 564 402 547 386 545} + $w.c create line $xy -fill $::C(fg) -smooth 1 -width 2 -tag I24 +} +proc Move24 {w {step {}}} { + global S + set step [GetStep 24 $step] + + if {$step > 4} { + return 0 + } elseif {$step == 4} { + return 2 + } + + if {$step == 0} { + $w.c delete I24 ;# Exploding balloon + set xy { + 347 465 361 557 271 503 272 503 342 574 259 594 259 593 362 626 + 320 737 320 740 398 691 436 738 436 739 476 679 528 701 527 702 + 494 627 548 613 548 613 480 574 577 473 577 473 474 538 445 508 + 431 441 431 440 400 502 347 465 347 465 + } + $w.c create poly $xy -tag I24 -fill $::C(24b) -outline $::C(24a) \ + -width 10 -smooth 1 + set msg [subst $S(message)] + $w.c create text [Centroid $w I24] -text $msg -tag {I24 I24t} \ + -justify center -font {{Times Roman} 18 bold} + return 1 + } + + $w.c itemconfig I24t -font [list {Times Roman} [expr {18 + 6*$step}] bold] + $w.c move I24 0 -60 + $w.c scale I24 {*}[Centroid $w I24] 1.25 1.25 + return 1 +} + +# Displaying the message +proc Move25 {w {step {}}} { + global S + set step [GetStep 25 $step] + if {$step == 0} { + set ::XY(25) [clock clicks -milliseconds] + return 1 + } + set elapsed [expr {[clock clicks -milliseconds] - $::XY(25)}] + if {$elapsed < 5000} { + return 1 + } + return 2 +} + +# Collapsing balloon +proc Move26 {w {step {}}} { + global S + set step [GetStep 26 $step] + + if {$step >= 3} { + $w.c delete I24 I26 + $w.c create text 430 755 -anchor s -tag I26 \ + -text "click to continue" -font {{Times Roman} 24 bold} + bind $w.c <1> [list Reset $w] + return 4 + } + + $w.c scale I24 {*}[Centroid $w I24] .8 .8 + $w.c move I24 0 60 + $w.c itemconfig I24t -font [list {Times Roman} [expr {30 - 6*$step}] bold] + return 1 +} + +################################################################ +# +# Helper functions +# + +proc box {x y r} { + return [list [expr {$x-$r}] [expr {$y-$r}] [expr {$x+$r}] [expr {$y+$r}]] +} + +proc MoveAbs {w item xy} { + lassign $xy x y + lassign [Centroid $w $item] Ox Oy + set dx [expr {$x - $Ox}] + set dy [expr {$y - $Oy}] + $w.c move $item $dx $dy +} + +proc RotateItem {w item Ox Oy beta} { + set xy [$w.c coords $item] + set xy2 {} + foreach {x y} $xy { + lappend xy2 {*}[RotateC $x $y $Ox $Oy $beta] + } + $w.c coords $item $xy2 +} + +proc RotateC {x y Ox Oy beta} { + # rotates vector (Ox,Oy)->(x,y) by beta degrees clockwise + + set x [expr {$x - $Ox}] ;# Shift to origin + set y [expr {$y - $Oy}] + + set beta [expr {$beta * atan(1) * 4 / 180.0}] ;# Radians + set xx [expr {$x * cos($beta) - $y * sin($beta)}] ;# Rotate + set yy [expr {$x * sin($beta) + $y * cos($beta)}] + + set xx [expr {$xx + $Ox}] ;# Shift back + set yy [expr {$yy + $Oy}] + + return [list $xx $yy] +} + +proc Reset {w} { + global S + DrawAll $w + bind $w.c <1> {} + set S(mode) $::MSTART + set S(active) 0 +} + +# Each Move## keeps its state info in STEP, this retrieves and increments it +proc GetStep {who step} { + global STEP + if {$step ne ""} { + set STEP($who) $step + } elseif {![info exists STEP($who)] || $STEP($who) eq ""} { + set STEP($who) 0 + } else { + incr STEP($who) + } + return $STEP($who) +} + +proc ResetStep {} { + global STEP + set ::S(cnt) 0 + foreach a [array names STEP] { + set STEP($a) "" + } +} + +proc Sine {w x0 y0 x1 y1 amp freq args} { + set PI [expr {4 * atan(1)}] + set step 2 + set xy {} + if {$y0 == $y1} { ;# Horizontal + for {set x $x0} {$x <= $x1} {incr x $step} { + set beta [expr {($x - $x0) * 2 * $PI / $freq}] + set y [expr {$y0 + $amp * sin($beta)}] + lappend xy $x $y + } + } else { + for {set y $y0} {$y <= $y1} {incr y $step} { + set beta [expr {($y - $y0) * 2 * $PI / $freq}] + set x [expr {$x0 + $amp * sin($beta)}] + lappend xy $x $y + } + } + return [$w.c create line $xy {*}$args] +} + +proc RoundRect {w xy radius args} { + lassign $xy x0 y0 x3 y3 + set r [winfo pixels $w.c $radius] + set d [expr {2 * $r}] + + # Make sure that the radius of the curve is less than 3/8 size of the box! + set maxr 0.75 + if {$d > $maxr * ($x3 - $x0)} { + set d [expr {$maxr * ($x3 - $x0)}] + } + if {$d > $maxr * ($y3 - $y0)} { + set d [expr {$maxr * ($y3 - $y0)}] + } + + set x1 [expr { $x0 + $d }] + set x2 [expr { $x3 - $d }] + set y1 [expr { $y0 + $d }] + set y2 [expr { $y3 - $d }] + + set xy [list $x0 $y0 $x1 $y0 $x2 $y0 $x3 $y0 $x3 $y1 $x3 $y2] + lappend xy $x3 $y3 $x2 $y3 $x1 $y3 $x0 $y3 $x0 $y2 $x0 $y1 + return $xy +} + +proc RoundPoly {canv xy radii args} { + set lenXY [llength $xy] + set lenR [llength $radii] + if {$lenXY != 2*$lenR} { + error "wrong number of vertices and radii" + } + + set knots {} + lassign [lrange $xy end-1 end] x0 y0 + lassign $xy x1 y1 + lappend xy {*}[lrange $xy 0 1] + + for {set i 0} {$i < $lenXY} {incr i 2} { + set radius [lindex $radii [expr {$i/2}]] + set r [winfo pixels $canv $radius] + + lassign [lrange $xy [expr {$i + 2}] [expr {$i + 3}]] x2 y2 + set z [_RoundPoly2 $x0 $y0 $x1 $y1 $x2 $y2 $r] + lappend knots {*}$z + + lassign [list $x1 $y1] x0 y0 + lassign [list $x2 $y2] x1 y1 + } + set n [$canv create polygon $knots -smooth 1 {*}$args] + return $n +} + +proc _RoundPoly2 {x0 y0 x1 y1 x2 y2 radius} { + set d [expr {2 * $radius}] + set maxr 0.75 + + set v1x [expr {$x0 - $x1}] + set v1y [expr {$y0 - $y1}] + set v2x [expr {$x2 - $x1}] + set v2y [expr {$y2 - $y1}] + + set vlen1 [expr {sqrt($v1x*$v1x + $v1y*$v1y)}] + set vlen2 [expr {sqrt($v2x*$v2x + $v2y*$v2y)}] + if {$d > $maxr * $vlen1} { + set d [expr {$maxr * $vlen1}] + } + if {$d > $maxr * $vlen2} { + set d [expr {$maxr * $vlen2}] + } + + lappend xy [expr {$x1 + $d * $v1x/$vlen1}] [expr {$y1 + $d * $v1y/$vlen1}] + lappend xy $x1 $y1 + lappend xy [expr {$x1 + $d * $v2x/$vlen2}] [expr {$y1 + $d * $v2y/$vlen2}] + + return $xy +} + +proc Sparkle {w Oxy tag} { + set xy {299 283 298 302 295 314 271 331 239 310 242 292 256 274 281 273} + foreach {x y} $xy { + $w.c create line 271 304 $x $y -fill white -width 3 -tag $tag + } + MoveAbs $w $tag $Oxy +} + +proc Centroid {w item} { + return [Anchor $w $item c] +} + +proc Anchor {w item where} { + lassign [$w.c bbox $item] x1 y1 x2 y2 + if {[string match *n* $where]} { + set y $y1 + } elseif {[string match *s* $where]} { + set y $y2 + } else { + set y [expr {($y1 + $y2) / 2.0}] + } + if {[string match *w* $where]} { + set x $x1 + } elseif {[string match *e* $where]} { + set x $x2 + } else { + set x [expr {($x1 + $x2) / 2.0}] + } + return [list $x $y] +} + +DoDisplay $w +Reset $w +Go $w ;# Start everything going diff --git a/env/tcl/tk8.6/demos/hello b/env/tcl/tk8.6/demos/hello new file mode 100644 index 0000000..d10b8d5 --- /dev/null +++ b/env/tcl/tk8.6/demos/hello @@ -0,0 +1,22 @@ +#!/bin/sh +# the next line restarts using wish \ +exec wish "$0" ${1+"$@"} + +# hello -- +# Simple Tk script to create a button that prints "Hello, world". +# Click on the button to terminate the program. + +package require Tk + +# The first line below creates the button, and the second line +# asks the packer to shrink-wrap the application's main window +# around the button. + +button .hello -text "Hello, world" -command { + puts stdout "Hello, world"; destroy . +} +pack .hello + +# Local Variables: +# mode: tcl +# End: diff --git a/env/tcl/tk8.6/demos/hscale.tcl b/env/tcl/tk8.6/demos/hscale.tcl new file mode 100644 index 0000000..1df144d --- /dev/null +++ b/env/tcl/tk8.6/demos/hscale.tcl @@ -0,0 +1,45 @@ +# hscale.tcl -- +# +# This demonstration script shows an example with a horizontal scale. + +if {![info exists widgetDemo]} { + error "This script should be run from the \"widget\" demo." +} + +package require Tk + +set w .hscale +catch {destroy $w} +toplevel $w +wm title $w "Horizontal Scale Demonstration" +wm iconname $w "hscale" +positionWindow $w + +label $w.msg -font $font -wraplength 3.5i -justify left -text "An arrow and a horizontal scale are displayed below. If you click or drag mouse button 1 in the scale, you can change the length of the arrow." +pack $w.msg -side top -padx .5c + +## See Code / Dismiss buttons +set btns [addSeeDismiss $w.buttons $w] +pack $btns -side bottom -fill x + +frame $w.frame -borderwidth 10 +pack $w.frame -side top -fill x + +canvas $w.frame.canvas -width 50 -height 50 -bd 0 -highlightthickness 0 +$w.frame.canvas create polygon 0 0 1 1 2 2 -fill DeepSkyBlue3 -tags poly +$w.frame.canvas create line 0 0 1 1 2 2 0 0 -fill black -tags line +scale $w.frame.scale -orient horizontal -length 284 -from 0 -to 250 \ + -command "setWidth $w.frame.canvas" -tickinterval 50 +pack $w.frame.canvas -side top -expand yes -anchor s -fill x -padx 15 +pack $w.frame.scale -side bottom -expand yes -anchor n +$w.frame.scale set 75 + +proc setWidth {w width} { + incr width 21 + set x2 [expr {$width - 30}] + if {$x2 < 21} { + set x2 21 + } + $w coords poly 20 15 20 35 $x2 35 $x2 45 $width 25 $x2 5 $x2 15 20 15 + $w coords line 20 15 20 35 $x2 35 $x2 45 $width 25 $x2 5 $x2 15 20 15 +} diff --git a/env/tcl/tk8.6/demos/icon.tcl b/env/tcl/tk8.6/demos/icon.tcl new file mode 100644 index 0000000..224d8f9 --- /dev/null +++ b/env/tcl/tk8.6/demos/icon.tcl @@ -0,0 +1,51 @@ +# icon.tcl -- +# +# This demonstration script creates a toplevel window containing +# buttons that display bitmaps instead of text. + +if {![info exists widgetDemo]} { + error "This script should be run from the \"widget\" demo." +} + +package require Tk + +set w .icon +catch {destroy $w} +toplevel $w +wm title $w "Iconic Button Demonstration" +wm iconname $w "icon" +positionWindow $w + +label $w.msg -font $font -wraplength 5i -justify left -text "This window shows three ways of using bitmaps or images in radiobuttons and checkbuttons. On the left are two radiobuttons, each of which displays a bitmap and an indicator. In the middle is a checkbutton that displays a different image depending on whether it is selected or not. On the right is a checkbutton that displays a single bitmap but changes its background color to indicate whether or not it is selected." +pack $w.msg -side top + +## See Code / Dismiss buttons +set btns [addSeeDismiss $w.buttons $w] +pack $btns -side bottom -fill x + +# Main widget program sets variable tk_demoDirectory +image create bitmap flagup \ + -file [file join $tk_demoDirectory images flagup.xbm] \ + -maskfile [file join $tk_demoDirectory images flagup.xbm] +image create bitmap flagdown \ + -file [file join $tk_demoDirectory images flagdown.xbm] \ + -maskfile [file join $tk_demoDirectory images flagdown.xbm] +frame $w.frame -borderwidth 10 +pack $w.frame -side top + +checkbutton $w.frame.b1 -image flagdown -selectimage flagup \ + -indicatoron 0 +$w.frame.b1 configure -selectcolor [$w.frame.b1 cget -background] +checkbutton $w.frame.b2 \ + -bitmap @[file join $tk_demoDirectory images letters.xbm] \ + -indicatoron 0 -selectcolor SeaGreen1 +frame $w.frame.left +pack $w.frame.left $w.frame.b1 $w.frame.b2 -side left -expand yes -padx 5m + +radiobutton $w.frame.left.b3 \ + -bitmap @[file join $tk_demoDirectory images letters.xbm] \ + -variable letters -value full +radiobutton $w.frame.left.b4 \ + -bitmap @[file join $tk_demoDirectory images noletter.xbm] \ + -variable letters -value empty +pack $w.frame.left.b3 $w.frame.left.b4 -side top -expand yes diff --git a/env/tcl/tk8.6/demos/image1.tcl b/env/tcl/tk8.6/demos/image1.tcl new file mode 100644 index 0000000..0bd2f49 --- /dev/null +++ b/env/tcl/tk8.6/demos/image1.tcl @@ -0,0 +1,35 @@ +# image1.tcl -- +# +# This demonstration script displays two image widgets. + +if {![info exists widgetDemo]} { + error "This script should be run from the \"widget\" demo." +} + +package require Tk + +set w .image1 +catch {destroy $w} +toplevel $w +wm title $w "Image Demonstration #1" +wm iconname $w "Image1" +positionWindow $w + +label $w.msg -font $font -wraplength 4i -justify left -text "This demonstration displays two images, each in a separate label widget." +pack $w.msg -side top + +## See Code / Dismiss buttons +set btns [addSeeDismiss $w.buttons $w] +pack $btns -side bottom -fill x + +# Main widget program sets variable tk_demoDirectory +catch {image delete image1a} +image create photo image1a -file [file join $tk_demoDirectory images earth.gif] +label $w.l1 -image image1a -bd 1 -relief sunken + +catch {image delete image1b} +image create photo image1b \ + -file [file join $tk_demoDirectory images earthris.gif] +label $w.l2 -image image1b -bd 1 -relief sunken + +pack $w.l1 $w.l2 -side top -padx .5m -pady .5m diff --git a/env/tcl/tk8.6/demos/image2.tcl b/env/tcl/tk8.6/demos/image2.tcl new file mode 100644 index 0000000..2d7ba03 --- /dev/null +++ b/env/tcl/tk8.6/demos/image2.tcl @@ -0,0 +1,108 @@ +# image2.tcl -- +# +# This demonstration script creates a simple collection of widgets +# that allow you to select and view images in a Tk label. + +if {![info exists widgetDemo]} { + error "This script should be run from the \"widget\" demo." +} + +package require Tk + +# loadDir -- +# This procedure reloads the directory listbox from the directory +# named in the demo's entry. +# +# Arguments: +# w - Name of the toplevel window of the demo. + +proc loadDir w { + global dirName + + $w.f.list delete 0 end + foreach i [lsort [glob -type f -directory $dirName *]] { + $w.f.list insert end [file tail $i] + } +} + +# selectAndLoadDir -- +# This procedure pops up a dialog to ask for a directory to load into +# the listobx and (if the user presses OK) reloads the directory +# listbox from the directory named in the demo's entry. +# +# Arguments: +# w - Name of the toplevel window of the demo. + +proc selectAndLoadDir w { + global dirName + set dir [tk_chooseDirectory -initialdir $dirName -parent $w -mustexist 1] + if {$dir ne ""} { + set dirName $dir + loadDir $w + } +} + +# loadImage -- +# Given the name of the toplevel window of the demo and the mouse +# position, extracts the directory entry under the mouse and loads +# that file into a photo image for display. +# +# Arguments: +# w - Name of the toplevel window of the demo. +# x, y- Mouse position within the listbox. + +proc loadImage {w x y} { + global dirName + + set file [file join $dirName [$w.f.list get @$x,$y]] + if {[catch { + image2a configure -file $file + }]} then { + # Mark the file as not loadable + $w.f.list itemconfigure @$x,$y -bg \#c00000 -selectbackground \#ff0000 + } +} + +set w .image2 +catch {destroy $w} +toplevel $w +wm title $w "Image Demonstration #2" +wm iconname $w "Image2" +positionWindow $w + +label $w.msg -font $font -wraplength 4i -justify left -text "This demonstration allows you to view images using a Tk \"photo\" image. First type a directory name in the listbox, then type Return to load the directory into the listbox. Then double-click on a file name in the listbox to see that image." +pack $w.msg -side top + +## See Code / Dismiss buttons +set btns [addSeeDismiss $w.buttons $w] +pack $btns -side bottom -fill x + +frame $w.mid +pack $w.mid -fill both -expand 1 + +labelframe $w.dir -text "Directory:" +# Main widget program sets variable tk_demoDirectory +set dirName [file join $tk_demoDirectory images] +entry $w.dir.e -width 30 -textvariable dirName +button $w.dir.b -pady 0 -padx 2m -text "Select Dir." \ + -command "selectAndLoadDir $w" +bind $w.dir.e "loadDir $w" +pack $w.dir.e -side left -fill both -padx 2m -pady 2m -expand true +pack $w.dir.b -side left -fill y -padx {0 2m} -pady 2m +labelframe $w.f -text "File:" -padx 2m -pady 2m + +listbox $w.f.list -width 20 -height 10 -yscrollcommand "$w.f.scroll set" +ttk::scrollbar $w.f.scroll -command "$w.f.list yview" +pack $w.f.list $w.f.scroll -side left -fill y -expand 1 +$w.f.list insert 0 earth.gif earthris.gif teapot.ppm +bind $w.f.list "loadImage $w %x %y" + +catch {image delete image2a} +image create photo image2a +labelframe $w.image -text "Image:" +label $w.image.image -image image2a +pack $w.image.image -padx 2m -pady 2m + +grid $w.dir - -sticky ew -padx 1m -pady 1m -in $w.mid +grid $w.f $w.image -sticky nw -padx 1m -pady 1m -in $w.mid +grid columnconfigure $w.mid 1 -weight 1 diff --git a/env/tcl/tk8.6/demos/images/earth.gif b/env/tcl/tk8.6/demos/images/earth.gif new file mode 100644 index 0000000000000000000000000000000000000000..2c229eb1101cfd51df5cc91a4cef18e38b5fcef6 GIT binary patch literal 51712 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 DqGhER literal 0 HcmV?d00001 diff --git a/env/tcl/tk8.6/demos/images/earthris.gif b/env/tcl/tk8.6/demos/images/earthris.gif new file mode 100644 index 0000000000000000000000000000000000000000..c4ee4737279f15b585de27a7f218a1ad63ad4ce9 GIT binary patch literal 6343 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 literal 0 HcmV?d00001 diff --git a/env/tcl/tk8.6/demos/images/flagdown.xbm b/env/tcl/tk8.6/demos/images/flagdown.xbm new file mode 100644 index 0000000..55abc51 --- /dev/null +++ b/env/tcl/tk8.6/demos/images/flagdown.xbm @@ -0,0 +1,27 @@ +#define flagdown_width 48 +#define flagdown_height 48 +static char flagdown_bits[] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, + 0x00, 0x00, 0x80, 0x7f, 0x00, 0x00, 0x00, 0x00, 0xe0, 0xe1, 0x00, 0x00, + 0x00, 0x00, 0x70, 0x80, 0x01, 0x00, 0x00, 0x00, 0x18, 0x00, 0x03, 0x00, + 0x00, 0x00, 0x0c, 0x00, 0x03, 0x00, 0x00, 0x00, 0x06, 0x00, 0x06, 0x04, + 0x00, 0x00, 0x03, 0x00, 0x06, 0x06, 0x00, 0x80, 0x01, 0x00, 0x06, 0x07, + 0x00, 0xc0, 0x1f, 0x00, 0x87, 0x07, 0x00, 0xe0, 0x7f, 0x80, 0xc7, 0x07, + 0x00, 0x70, 0xe0, 0xc0, 0xe5, 0x07, 0x00, 0x38, 0x80, 0xe1, 0x74, 0x07, + 0x00, 0x18, 0x80, 0x71, 0x3c, 0x07, 0x00, 0x0c, 0x00, 0x3b, 0x1e, 0x03, + 0x00, 0x0c, 0x00, 0x1f, 0x0f, 0x00, 0x00, 0x86, 0x1f, 0x8e, 0x07, 0x00, + 0x00, 0x06, 0x06, 0xc6, 0x05, 0x00, 0x00, 0x06, 0x00, 0xc6, 0x05, 0x00, + 0x00, 0x06, 0x00, 0xc6, 0x04, 0x00, 0x00, 0x06, 0x00, 0x06, 0x04, 0x00, + 0x7f, 0x06, 0x00, 0x06, 0xe4, 0xff, 0x00, 0x06, 0x00, 0x06, 0x04, 0x00, + 0x00, 0x06, 0x00, 0x06, 0x04, 0x00, 0x00, 0x06, 0x00, 0x06, 0x06, 0x00, + 0x00, 0x06, 0x00, 0x06, 0x03, 0x00, 0x00, 0x06, 0x00, 0x86, 0x01, 0x00, + 0x00, 0x06, 0x00, 0xc6, 0x00, 0x00, 0x00, 0x06, 0x00, 0x66, 0x00, 0x00, + 0x00, 0x06, 0x00, 0x36, 0x00, 0x00, 0x00, 0x06, 0x00, 0x3e, 0x00, 0x00, + 0x00, 0xfe, 0xff, 0x2f, 0x00, 0x00, 0x00, 0xfc, 0xff, 0x27, 0x00, 0x00, + 0x00, 0x00, 0x88, 0x20, 0x00, 0x00, 0x00, 0x00, 0x88, 0x20, 0x00, 0x00, + 0x00, 0x00, 0x88, 0x20, 0x00, 0x00, 0x00, 0x00, 0x88, 0x20, 0x00, 0x00, + 0x00, 0x00, 0x88, 0x20, 0x00, 0x00, 0x00, 0x00, 0x88, 0x20, 0x00, 0x00, + 0x00, 0x00, 0x88, 0x20, 0x00, 0x00, 0x00, 0x00, 0x88, 0x20, 0x00, 0x00, + 0xf7, 0xbf, 0x8e, 0xfc, 0xdf, 0xf8, 0x9d, 0xeb, 0x9b, 0x76, 0xd2, 0x7a, + 0x46, 0x30, 0xe2, 0x0f, 0xe1, 0x47, 0x55, 0x84, 0x48, 0x11, 0x84, 0x19}; diff --git a/env/tcl/tk8.6/demos/images/flagup.xbm b/env/tcl/tk8.6/demos/images/flagup.xbm new file mode 100644 index 0000000..6eb0d84 --- /dev/null +++ b/env/tcl/tk8.6/demos/images/flagup.xbm @@ -0,0 +1,27 @@ +#define flagup_width 48 +#define flagup_height 48 +static char flagup_bits[] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x7f, 0x00, + 0x00, 0x00, 0x00, 0xe0, 0x7f, 0x00, 0x00, 0x00, 0x00, 0xef, 0x6a, 0x00, + 0x00, 0x00, 0xc0, 0x7b, 0x75, 0x00, 0x00, 0x00, 0xe0, 0xe0, 0x6a, 0x00, + 0x00, 0x00, 0x30, 0x60, 0x75, 0x00, 0x00, 0x00, 0x18, 0xe0, 0x7f, 0x00, + 0x00, 0x00, 0x0c, 0xe0, 0x7f, 0x00, 0x00, 0x00, 0x06, 0xe0, 0x04, 0x00, + 0x00, 0x00, 0x03, 0xe0, 0x04, 0x00, 0x00, 0x80, 0x01, 0xe0, 0x06, 0x00, + 0x00, 0xc0, 0x1f, 0xe0, 0x07, 0x00, 0x00, 0xe0, 0x7f, 0xe0, 0x07, 0x00, + 0x00, 0x70, 0xe0, 0xe0, 0x05, 0x00, 0x00, 0x38, 0x80, 0xe1, 0x04, 0x00, + 0x00, 0x18, 0x80, 0xf1, 0x04, 0x00, 0x00, 0x0c, 0x00, 0xfb, 0x04, 0x00, + 0x00, 0x0c, 0x00, 0xff, 0x04, 0x00, 0x00, 0x86, 0x1f, 0xee, 0x04, 0x00, + 0x00, 0x06, 0x06, 0xe6, 0x04, 0x00, 0x00, 0x06, 0x00, 0xe6, 0x04, 0x00, + 0x00, 0x06, 0x00, 0xe6, 0x04, 0x00, 0x00, 0x06, 0x00, 0x66, 0x04, 0x00, + 0x7f, 0x56, 0x52, 0x06, 0xe4, 0xff, 0x00, 0x76, 0x55, 0x06, 0x04, 0x00, + 0x00, 0x56, 0x57, 0x06, 0x04, 0x00, 0x00, 0x56, 0x55, 0x06, 0x06, 0x00, + 0x00, 0x56, 0xd5, 0x06, 0x03, 0x00, 0x00, 0x06, 0x00, 0x86, 0x01, 0x00, + 0x54, 0x06, 0x00, 0xc6, 0x54, 0x55, 0xaa, 0x06, 0x00, 0x66, 0xaa, 0x2a, + 0x54, 0x06, 0x00, 0x36, 0x55, 0x55, 0xaa, 0x06, 0x00, 0xbe, 0xaa, 0x2a, + 0x54, 0xfe, 0xff, 0x6f, 0x55, 0x55, 0xaa, 0xfc, 0xff, 0xa7, 0xaa, 0x2a, + 0x54, 0x01, 0x88, 0x60, 0x55, 0x55, 0xaa, 0xaa, 0x8a, 0xa0, 0xaa, 0x2a, + 0x54, 0x55, 0x8d, 0x60, 0x55, 0x55, 0xaa, 0xaa, 0x8a, 0xa0, 0xaa, 0x2a, + 0x54, 0x55, 0x8d, 0x60, 0x55, 0x55, 0xaa, 0xaa, 0x8a, 0xa0, 0xaa, 0x2a, + 0x54, 0x55, 0x8d, 0x50, 0x55, 0x55, 0xaa, 0xaa, 0x8a, 0xa8, 0xaa, 0x2a, + 0x54, 0x55, 0x95, 0x54, 0x55, 0x55, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x2a, + 0x54, 0x55, 0x55, 0x55, 0x55, 0x15, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; diff --git a/env/tcl/tk8.6/demos/images/gray25.xbm b/env/tcl/tk8.6/demos/images/gray25.xbm new file mode 100644 index 0000000..b234b3c --- /dev/null +++ b/env/tcl/tk8.6/demos/images/gray25.xbm @@ -0,0 +1,6 @@ +#define grey_width 16 +#define grey_height 16 +static char grey_bits[] = { + 0x11, 0x11, 0x44, 0x44, 0x11, 0x11, 0x44, 0x44, 0x11, 0x11, 0x44, 0x44, + 0x11, 0x11, 0x44, 0x44, 0x11, 0x11, 0x44, 0x44, 0x11, 0x11, 0x44, 0x44, + 0x11, 0x11, 0x44, 0x44, 0x11, 0x11, 0x44, 0x44}; diff --git a/env/tcl/tk8.6/demos/images/letters.xbm b/env/tcl/tk8.6/demos/images/letters.xbm new file mode 100644 index 0000000..0f12568 --- /dev/null +++ b/env/tcl/tk8.6/demos/images/letters.xbm @@ -0,0 +1,27 @@ +#define letters_width 48 +#define letters_height 48 +static char letters_bits[] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xfe, 0xff, 0xff, 0xff, 0x3f, 0x00, 0x02, 0x00, 0x00, 0x00, 0x20, + 0x00, 0xfa, 0x00, 0x00, 0x00, 0x2e, 0x00, 0x02, 0x00, 0x00, 0x00, 0x2a, + 0x00, 0x3a, 0x00, 0x00, 0x00, 0x2a, 0x00, 0x02, 0x00, 0x00, 0x00, 0x2e, + 0xe0, 0xff, 0xff, 0xff, 0xff, 0x21, 0x20, 0x00, 0x00, 0x00, 0x00, 0x21, + 0xa0, 0x03, 0x00, 0x00, 0x70, 0x21, 0x20, 0x00, 0x00, 0x00, 0x50, 0x21, + 0xa0, 0x1f, 0x00, 0x00, 0x50, 0x21, 0x20, 0x00, 0x00, 0x00, 0x70, 0x21, + 0xfe, 0xff, 0xff, 0xff, 0x0f, 0x21, 0x02, 0x00, 0x00, 0x00, 0x08, 0x21, + 0xfa, 0x01, 0x00, 0x80, 0x0b, 0x21, 0x02, 0x00, 0x00, 0x80, 0x0a, 0x21, + 0xba, 0x01, 0x00, 0x80, 0x0a, 0x21, 0x02, 0x00, 0x00, 0x80, 0x0b, 0x21, + 0x3a, 0x00, 0x00, 0x00, 0x08, 0x21, 0x02, 0x00, 0x00, 0x00, 0x08, 0x21, + 0x02, 0xc0, 0xfb, 0x03, 0x08, 0x21, 0x02, 0x00, 0x00, 0x00, 0x08, 0x3f, + 0x02, 0xc0, 0xbd, 0x0f, 0x08, 0x01, 0x02, 0x00, 0x00, 0x00, 0x08, 0x01, + 0x02, 0xc0, 0x7f, 0x7b, 0x08, 0x01, 0x02, 0x00, 0x00, 0x00, 0x08, 0x01, + 0x02, 0x00, 0x00, 0x00, 0xf8, 0x01, 0x02, 0x00, 0x00, 0x00, 0x08, 0x00, + 0x02, 0x00, 0x00, 0x00, 0x08, 0x00, 0x02, 0x00, 0x00, 0x00, 0x08, 0x00, + 0x02, 0x00, 0x00, 0x00, 0x08, 0x00, 0x02, 0x00, 0x00, 0x00, 0x08, 0x00, + 0xfe, 0xff, 0xff, 0xff, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; diff --git a/env/tcl/tk8.6/demos/images/noletter.xbm b/env/tcl/tk8.6/demos/images/noletter.xbm new file mode 100644 index 0000000..5774124 --- /dev/null +++ b/env/tcl/tk8.6/demos/images/noletter.xbm @@ -0,0 +1,27 @@ +#define noletters_width 48 +#define noletters_height 48 +static char noletters_bits[] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x1f, 0x00, 0x00, + 0x00, 0x00, 0xff, 0xff, 0x01, 0x00, 0x00, 0xc0, 0xff, 0xff, 0x07, 0x00, + 0x00, 0xf0, 0x0f, 0xe0, 0x1f, 0x00, 0x00, 0xfc, 0x01, 0x00, 0x7f, 0x00, + 0x00, 0x3e, 0x00, 0x00, 0xf8, 0x00, 0x00, 0x1f, 0x00, 0x00, 0xf0, 0x01, + 0x80, 0x07, 0x00, 0x00, 0xc0, 0x03, 0xc0, 0x03, 0x00, 0x00, 0xe0, 0x07, + 0xe0, 0x01, 0x00, 0x00, 0xf0, 0x0f, 0xe0, 0x00, 0x00, 0x00, 0x78, 0x0e, + 0xf0, 0x00, 0x00, 0x00, 0x3c, 0x1e, 0x70, 0x00, 0x00, 0x00, 0x1e, 0x1c, + 0x38, 0x00, 0x00, 0x00, 0x0f, 0x38, 0x38, 0x00, 0x00, 0x80, 0x07, 0x38, + 0x3c, 0xfc, 0xff, 0xff, 0x7f, 0x78, 0x1c, 0x04, 0x00, 0xe0, 0x41, 0x70, + 0x1c, 0x04, 0x00, 0xf0, 0x40, 0x70, 0x1c, 0x74, 0x00, 0x78, 0x4e, 0x70, + 0x0e, 0x04, 0x00, 0x3c, 0x4a, 0xe0, 0x0e, 0x74, 0x03, 0x1e, 0x4a, 0xe0, + 0x0e, 0x04, 0x00, 0x0f, 0x4e, 0xe0, 0x0e, 0x04, 0x80, 0x07, 0x40, 0xe0, + 0x0e, 0x04, 0xf8, 0x0f, 0x40, 0xe0, 0x0e, 0x04, 0xe0, 0x01, 0x40, 0xe0, + 0x0e, 0x04, 0xf8, 0x00, 0x40, 0xe0, 0x0e, 0x04, 0x78, 0x00, 0x40, 0xe0, + 0x0e, 0x04, 0xfc, 0xf3, 0x40, 0xe0, 0x1c, 0x04, 0x1e, 0x00, 0x40, 0x70, + 0x1c, 0x04, 0x0f, 0x00, 0x40, 0x70, 0x1c, 0x84, 0x07, 0x00, 0x40, 0x70, + 0x3c, 0xfc, 0xff, 0xff, 0x7f, 0x78, 0x38, 0xe0, 0x01, 0x00, 0x00, 0x38, + 0x38, 0xf0, 0x00, 0x00, 0x00, 0x38, 0x70, 0x78, 0x00, 0x00, 0x00, 0x1c, + 0xf0, 0x3c, 0x00, 0x00, 0x00, 0x1e, 0xe0, 0x1e, 0x00, 0x00, 0x00, 0x0e, + 0xe0, 0x0f, 0x00, 0x00, 0x00, 0x0f, 0xc0, 0x07, 0x00, 0x00, 0x80, 0x07, + 0x80, 0x07, 0x00, 0x00, 0xc0, 0x03, 0x00, 0x1f, 0x00, 0x00, 0xf0, 0x01, + 0x00, 0x3e, 0x00, 0x00, 0xf8, 0x00, 0x00, 0xfc, 0x01, 0x00, 0x7f, 0x00, + 0x00, 0xf0, 0x0f, 0xe0, 0x1f, 0x00, 0x00, 0xc0, 0xff, 0xff, 0x07, 0x00, + 0x00, 0x00, 0xff, 0xff, 0x01, 0x00, 0x00, 0x00, 0xf0, 0x1f, 0x00, 0x00}; diff --git a/env/tcl/tk8.6/demos/images/ouster.png b/env/tcl/tk8.6/demos/images/ouster.png new file mode 100644 index 0000000000000000000000000000000000000000..259b8f9f9e386dd11a0aff0d3f17c8a0b19ffec8 GIT binary patch literal 54257 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

    i_JVF#Aw_0Y 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 Q-#541xs+_MkcmA12d>*S0{{R3 literal 0 HcmV?d00001 diff --git a/env/tcl/tk8.6/demos/images/teapot.ppm b/env/tcl/tk8.6/demos/images/teapot.ppm new file mode 100644 index 0000000..b8ab85f --- /dev/null +++ b/env/tcl/tk8.6/demos/images/teapot.ppm @@ -0,0 +1,31 @@ +P6 +256 256 +255 +\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À[7 eOLjQLmSMoTMnSMlRMhPL_9 \À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\ÀnSMtVMzYN~[N~[N\N\O€\O€]O€]O€]O€]O€\O€\O}[NyYNtVM\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\ÀG-wXN}[N€]O„^O†_O†`O‡`Oˆ`Oˆ`OˆaO‰aO‰aO‰aO‰aO‰aO‰aOˆaOˆ`O†_Oƒ^O\N \À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\ÀaMLyYN…_O‰aP‹bPcPŽcPŽdPŽdPdPdPdPdPdPdPdPeP‘eP’eP’eP‘ePdPcP…_OpUM\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\ÀwXN…_OdP“fP•gQ–hQ˜hQ˜iQ™iQ™iQšiQšiQšjQ›jQ›jQœjQœjQœjQœjQœjQ›jQœjQ™iQ“fP‡`O\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\ÀNCJiQL‹bP—hQkQ¡mR¤nR¥oR¥oR¥oR¥oR¥oR¥oR¦oR¦oR¦pR¨pS©qSªqS«rS¬rS«rS©qS¤oRœjQ€]O\KK\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\ÀfOLrUMcPŸlR©qS¯tS²uTµwT·xT¸xT¹yTºyT»zT»zU¼zU¼zU¼zU»zUºyT¸xT¶wT¯tS¡mR‰aOhPL\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\Àa0 cNLqUM€\O”fQ¦pS²wVºzV¿|VÂ}VÄVÆVÇ€VÉ‚WÌ…[Õeæ w÷³‹êª…Ĉg§qT“fQ{ZNYIK9\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\ÀO1{G#‘JkRMqUMtVN–iS¨v\·€d¹bµzZ±vU°uT®sSªqS¤nRœjQ’eP„^OrUMHh>!T4\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\ÀG-V5wE"~I#†M%U+¥e7²l:°g2®b*­a(­`(©^(¥])¡^-›]1ŠS,qC$`9 R3G-\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À@)J/i>!pA"tD"wF$yH&xH&tE$wE#yG%}M+ƒT4S5mE*Z7!K/B*;'\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À‰aO¦oR½{UÇ€VÏ…X<(F-a: e!j@#k@$h>"dµf-¨^(¡Z'šW&–T&œN>)F-J/b; g>#nD(jB&c y< u: r9 o7 l6 +j5 +h4 +g3 +5$D,K/b; h>"wM1tK.e="a<#cA,U8&E-<(9&.!a0 b1 c1     + ++3#@)46G<:HMCIXHK\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\ÀU*´vT¿~X¸{YÃk+›W&‰N$|> u: p8 k5 +f3 +a0 _/ ]. [- I¡\*ª_(‘LkRMmSMmSMnSMnSMD,R3W5mA"|O0|P1j?"c!a: X/K%&4$+2F=;HPEJL&\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\ÀŸlR¶xT­sTµd)ŠO$w; m6 +g3 +a0 Z- \/ T*Q(ŠHµm8kRMmSMnTMoTMpTMpUM15G15G05G04G04GpUMpTM5^9 d!Y0W+]. s=‡M$dPŸlR\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\ÀoTM¥oRdPvE"V+K%A 99†F¤['qUMtVM99H:9H:9H:9H:9H:9H:9H:9H:9H:9H99H99H99H99H99H99H:9H;:H>;HB=HPDJ\JKmSMwXN|ZN°y[ᦆ֘uº{W¹yU¿€]Á„b­tU£nR—hQˆaO{ZNvWNtVMvXNwXNyYNzYN{ZN|ZN}[N}[N~[N~[N~[N~[N~[N~[N~[N}[N}[N{ZNzYNxXN…L$f3 +I$L&P(U*\. €J#\O›jQ\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\ÀžkR‰aOo9 L&C!:4f3 +X&pUMuWMwXNxXN<:H<:H<:H<:H<;H<;H<;H<;H=;H=;H=;H=;H>;H>;H?HG@ILBIREJ[JKcNLjQL§pR±uTºzUÃ~VÈWË‚XÖŽcäsÒŽe¼{V²vT¨pSžkR•gQŒbP†_O‚^O]O€\O€\O€\O€\O€]O]O]O]O]O]O]O]O]O]O]O€\O€\O~\N}[N|ZNxXN•T%H$G#K%Q(W+zG#nTM˜iQ\À\À\À\À\À\À\À\À\À\À\À\ÀdOLrUMuWNwXNyYN{ZN}[N{ZNwXNsVM \À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\Àˆ`OcPnA"M&@ 8F#m6 +›W&rVMvWNyYNzYN|ZN}[N}[N>HE?IG@IIAIKBIODJSFJWHK—hQŸlR§pR°b(¾i*Én+Ù|7Û|6Ïr,Íq+Êp-Ãl+»g)±b(®sS§pS lRšiQ•gQePcPŠaPˆaO‡`O‡`O†_O†_O…_O…_O…_O…_O…_O…_O…_O„_O„^O„^Oƒ^Oƒ^O‚]O]O€\O~[N{ZN•T%F#B!Y,L&U*~I#„^O†`O\À\À\À\ÀcNLrUMzYN\O„^Oˆ`OŠbPŒcPdPeP’fP“fP“fQ“fQ”fQ‘ePcP‰aP~[N\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À’fPsVM^/ C!7 ŽQ%tVMwXNzYN|ZN}[N\N\O€\O]O]O‚]O‚]OA=HB=HB=HB>HC>HC>ID?IE?IF@IG@IIAIKBIŒcPdP’eP–gQšiQŸlR£nR¤\'´d)¿i*Æm+Îs/Ïs/Êo+Én+Ål*¾i*ºg)³c(ª_(ªqS¦oR¡mRkQ™iQ•gQ“fP‘ePŽdPcPŒbP‹bPŠbPŠaP‰aP‰aO‰aOˆaOˆ`Oˆ`O‡`O‡`O‡`O†`O†_O…_O„^Oƒ^O‚]O\O}[N›QD"?D"K%_/ kRL’fPODJSFJ†_OŠbPŽcP‘eP“fQ–gQ™iQœjQžkR lR¡mR£nR¤nR¥oR¥oR¥oR¤nR¢mRŸlRšiQ‘eP…_O\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\ÀB+‘ePI#L&90y< šPxXN{ZN}[N\N€\O]O‚]Oƒ^Oƒ^O„^O„_O…_O…_O†_O†`O‡`O‡`Oˆ`O‰aOŠaP‹bPŒbPcPŽdP‘eP“fP•gQ˜hQšiQžkR¢mR¡Z'«_(¶e)½h)Âk*Çn,Çn,Æm*Æl*Áj*ºf)¶e)²c(«_(¦]'§pR¤nR¡mRžkR›jQ™iQ–gQ”gQ“fP‘ePdPdPŽdPŽcPcPŒcPŒbP‹bP‹bP‹bPŠbPŠaP‰aP‰aO‰aOˆ`O‡`O†_O…_Oƒ^O]Oª_(@ B!I$B!N'w=‘eP`LKbNLeOLkR mR£nR¥oR§pSªqS¬rS®sS¯tS°tS°tS±uS±uS°tS¯tS­sSªrS§pS¢mRšjQŒbPjQL\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À‹bPpTME"5‡M$tVM{ZN}[N\O]O‚^Oƒ^O„_O…_O†_O†`O‡`Oˆ`Oˆ`O‰aO‰aPŠaPŠbP‹bPŒbPcPŽcPdPdP’eP“fP•gQ—hQ™iQ›jQkR lR¢mR¡Z'¬`(µd)ºg)ÇgÀj*Àj*¾i*¿i*»g)µd)²c(¯a(ª_(¤\'§pR¥oR¢nR mRžkRœjQšiQ˜iQ—hQ•gQ”gQ“fP’eP‘eP‘ePdPdPdPŽcPŽcPcPcPŒcPŒbP‹bP‹bPŠbPŠaP‰aOˆ`O†_O„^O\NœQ@ <G#_LKŽcPlSMnTMpUMsVM°tS²uT³vTµwT¶wT¶xT¶xT¶wTµwT´vT²uT¯tS¬sSªqS§pS¤oR¢nRžkR˜hQ‹bPeOL\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\ÀwXN\NJ%01ŽJvWN}[N\O]Oƒ^O…_O†_O†`O‡`Oˆ`O‰aO‰aPŠaPŠbP‹bPŒbPŒbPcPŽcPŽdPdPdP‘eP’eP”fQ•gQ–gQ˜hQ™iQ›jQkQŸlR¡mRžY&¦]'­`(³c(·e)Àc¸\¸\¹\º]»]¶^®a(¬`(©^'£['¢['¥oR£nR¡mR lRžkRœkQ›jQšiQ˜iQ—hQ–gQ•gQ”gQ”fQ“fP’eP’eP‘eP‘ePdPdPdPdPŽdPŽcPcPcPŒbP‹bPŠaPˆaO†`O]O˜OG#7F#uWMƒ^OwXNxXNzYN{ZN|ZN¹yT¸yT·xT´wT±uT­sS¨pS¡mRœjQ•gQdPŒbP‰aP‰aPŒbPŽcP‘ePcP|ZN\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À[JKŠbP^/ 1 01|> wXN}[N]Oƒ^O…_O‡`O‡`OˆaO‰aPŠaP‹bP‹bPŒbPŒcPcPŽcPŽcPdPdPdP‘eP’eP“fP”fQ•gQ–gQ—hQ˜hQ™iQ›jQœkQžkRŸlR mRžY&¦]'­`(±b(·[ÇgÉiÉhÅfÂdÃe¿c«Uª_(§]'£[' Z'¤nR£nR¡mR mRŸlRžkRkQœjQšjQšiQ™iQ˜hQ—hQ–gQ•gQ•gQ”fQ”fQ“fP“fP’eP’eP‘eP‘ePePdPdPdPŽcPcPŒbPŠbPˆ`Oƒ^O‰D 4M&dPnSM|[N|[O|[OzZOxXNªrS¢nR˜hQŽcPƒ^OvXNiQL^KKRFJMCJJAIKBISFJ\JKnSMxYN†_O€\OaMK\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\ÀB!qUMŠaPC!/00a0 uWN}[N‚]O…_O†`Oˆ`O‰aPŠaP‹bPŒbPŒcPcPŽcPŽcPdPdPdP‘eP‘eP’eP“fP“fQ”fQ•gQ–gQ—hQ˜hQ™iQ™iQ›jQœjQkRžlRŸlRœX&¢['¨^'¬`(´ZÂdÄfÈiÆgÂd¿c¿c¼a¸_©T¥\'£[' Z'ŸY&£nR¢mR¡mR lRŸlRžkRkQœjQ›jQšjQšiQ™iQ˜hQ—hQ—hQ–hQ–gQ•gQ•gQ”gQ”fQ”fQ“fQ“fP’fP’eP‘eP‘ePdPdPŽcPŒbP‰aOƒ^Ox< :ŠaP]Oj8sVMmSMfOL^KKUGJIAIQEJ?IeZY638*  B\À\À\À\À\À,  4 .G1!\TU¡ƒrsVM{ZN`MK\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À[JKyYNŒbP/0ˆN$]O…_Oˆ`O‹bPŒbPcPŽcPdPdPdP‘eP‘eP’eP’fP“fP“fQ”fQ”gQ•gQ–gQ–gQ—hQ—hQ˜hQ™iQ™iQšiQ›jQœjQœkQkRžkRŸlRœO¡Z'¥\'©^'­V¼a¾bÁeÆi!Ãf¾b»a¹`·_³]²\µZ¢[' Z'ŸY&œQ¡mR¡mR mR lRŸlRŸlRžkRkRkQœkQœjQ›jQ›jQšjQšiQšiQ™iQ™iQ˜iQ˜hQ˜hQ—hQ—hQ—hQ–hQ–gQ–gQ•gQ•gQ”fQ’fPdPcPšW&dPŠaPrUM + B\À\À\À\À\À\À\À\À\À\À%7!!C*F#P) {dYœze»p€\OgPL\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\ÀSFJ`LKvWNŠaPm6 + X,uWM‚]O‡`OŠbPcPŽdPdPdP‘eP’eP’fP“fP“fQ”fQ”gQ•gQ•gQ–gQ–gQ—hQ—hQ˜hQ˜iQ™iQ™iQšiQ›jQ›jQœjQœkQkQžkRžlRŸlR¢Z'¤\'§]'·_¹`¼a½bÁeÅi"Áe¼aº`·_¶_²]²\±\«Y¡Z' Z'¡Z'¡mR¡mR mR lR lRŸlRŸlRžlRžkRžkRkRkQœkQœjQœjQ›jQ›jQ›jQšjQšiQšiQšiQ™iQ™iQ™iQ˜iQ˜hQ˜hQ—hQ–gQ•gQ“fQdP†_Oq8 –gQˆ`OuWM”T%\À\À\À\À\À\À\À\À\À\À B B!!T,c5ƒF‚T3È›~Æ“qƒ^OfOL\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\ÀXHK_LKsVM‡`OcP ’S%]OŠbPcPdP‘eP’eP“fP“fQ”fQ”gQ•gQ•gQ–gQ–gQ—hQ—hQ—hQ˜hQ˜iQ™iQ™iQšiQšiQ›jQ›jQœjQœjQkQkRžkRžlRŸlRŸlR¥\'¦]'¨^'­Vº`»a½bÁfÄi"Àe»a¹`·_¶_³]±\±\¤R¢Z'¢Z'£['¡mR¡mR¡mR¡mR mR lR lRŸlRŸlRŸlRžlRžkRžkRkRkRkQkQœjQœjQœjQœjQœjQ›jQ›jQ›jQ›jQšjQšiQ™iQ™iQ˜hQ–gQ‘eP§Sq8 ‰aO•gQ‡`OtVMœX&\À\À\À\À\À\À\À\À\À\À B B B l@!{A…L$›Y'½†a“fPˆaO]KK\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\ÀODJ[JKaMKqUM\OcPƒ^OvE"‚]OŠaPdP‘eP“fP”fQ•gQ•gQ–gQ–hQ—hQ—hQ˜hQ˜hQ˜iQ™iQ™iQ™iQšiQšjQ›jQ›jQœjQœjQœkQkQkRžkRžkRŸlRŸlRŸlR lR©^'©^'ª_(®W»a¼a¾cÂg Äi"¿e»a¹`·_¶_³^±\±\¤R£['£['§]'¢mR¢mR¡mR¡mR¡mR¡mR mR lR lR lR lRŸlRŸlRŸlRŸlRžlRžlRžkRžkRžkRžkRkRkRkRkRkQkQkQœjQœjQšiQ˜hQ’ePšW&M&oTMšiQ‘eP…_OtVMmSMdOL\À\À\À\À\À\À\À\À\À B B B ‘J Z'ª_(œkQ™iQ‡`OSFJ\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\ÀTFJ\JKcNLlRMzYN‡`O’ePzZN \Nˆ`OdP“fQ•gQ–gQ—hQ˜hQ˜hQ™iQ™iQ™iQšiQšiQšiQ›jQ›jQ›jQœjQœjQœjQœkQkQkRžkRžkRžlRŸlRŸlRŸlR lR lR mR®a(­`(¬`(¶[½a½b¿dÃh!Äi"¿d»a¹`¸_¶_µ^²]³]¦S¤\'§]'«_(¢nR¢mR¢mR¢mR¢mR¢mR¢mR¡mR¡mR¡mR¡mR¡mR mR mR mR mR lR lR lR lR lR lR lR lR lRŸlRŸlR lRŸlRžkRœkQ™iQePt: kQ˜hQcP€]OtVMlSMa2 \À\À\À\À\À\À\À\À\À B B +$5 ¬`(¶e)£nRœjQƒ^OJAI\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\ÀXIK^KKdNLhPLuWM‚]OŒbP”fQeP m6 +†`OŽcP“fQ—hQ˜hQ™iQšiQšjQ›jQ›jQ›jQœjQœjQœjQœkQkQkQkRžkRžkRžkRžlRŸlRŸlRŸlR lR lR lR¡mR¡mR¡mR¡mRºg)³c(²c(±b(­V¿cÂeÅi!Åi!Àd¼bº`¹`·_·_¶^¢Q§]'ª_(­`(¹f)£nR£nR£nR£nR£nR£nR£nR¢nR¢nR¢nR¢nR¢nR¢nR¢mR¢mR¢mR¢mR¢mR¢mR¢mR¢mR¢mR¢nR¢mR¢mR£nR¢mR¢mR¡mR mRkR—hQˆGa0 ŠbP mRœjQ“fQ‰aP}[NrUMmSM…L$\À\À\À\À\À\À\À\À B B #C, 8&H.Z7 §pR›jQ{ZN\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\ÀQEJ[JK`LKdNLhQLqUM{ZN…_OŽcP–gQ—hQ +‹bP‘eP–hQšiQ›jQœjQkQkQkRžkRžkRžlRžlRŸlRŸlRŸlRŸlRŸlR lR lR lR mR¡mR¡mR¡mR¡mR¡mR¢mR¢mR¢mR¢nR£nRÀj*ºg)·e)¶d)Âd°XÅgÅhÂe¿c½b½b¾bªU­`(®a(¯a(³c(¾i*¤oR¤oR¤nR¤nR¤nR¤nR¤nR¤nR¤nR¤nR¤nR¤nR¤nR¤nR¤nR¤nR¤nR¤oR¤oR¥oR¥oR¥oR¥oR¥oR¥oR¦oR¦oR¥oR¥oR¤nR¡mR›jQŽQ%Z- œjQ£nRŸlR—hQŽdP…_OuWMpTMnSMkRLa: \À\À\À\À\À\À\À B B&D2 @*S6#G@IPDJ˜hQmSM\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\ÀVGJ]KKbMLeOLiQLlRMvWN\OˆaO‘eP—hQœjQ•gQoTM•gQ™iQkQŸlRŸlR lR mR¡mR¡mR¡mR¡mR¡mR¡mR¡mR¢mR¢mR¢mR¢mR¢mR¢mR¢nR£nR£nR£nR£nR£nR¤nR¤nR¤nR¤nR¤nR¤nRÆl*Ãl+¾j+¹g)¸f)¶e)µd)¶e)¶e)·e)·e)¸f)¾i*Ìs0Ðs.¦oR¦oR¦oR¦oR¦oR¦oR¦oR¦oR¦oR¦oR¦oR¦oR¦oR¦oR¦oR¦oR¦pR§pR§pR§pR§pR§pS§pS¨pS¨qS©qS©qS©qS¨pS©qS§pS¤nRŸlR‘I˜hQ§pR¥oR¡mRšiQ’ePŠaP€\OsVMpTMnTMlRM–X)\À\À\À\À\À\À\À B%C)D$;J/[8"LBITGJYIKWHK\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\ÀNCJYIK_LKcNLgPLjQLlRMpUMzYNƒ^O‹bP‘eP˜hQkQŸlR”fQ- —hQ›jQŸlR¢mR£nR£nR£nR¤nR¤nR¤nR¤nR¤nR¤nR¤nR¤oR¤oR¥oR¥oR¥oR¥oR¥oR¥oR¥oR¥oR¥oR¥oR¥oR¦oR¦oR¦oR¦oR¦oR¦pR¦pR§pRàpßy-Ûw-Ûw-Þy.â{-ãu§pS§pS§pS§pS§pS¨pS¨pS¨pS¨pS¨pS¨pS¨pS¨pS¨pS¨pS¨qS©qS©qS©qS©qS©qS©qS©qSªqSªrS«rS«rS¬rS¬rS¬rS¬rS¬sS«rSªqS¦oRšiQ™iQ©qSªqS§pR¡mRœjQ•gQcP„_O{ZNtVMpUMoTMmSMjQL_9 \À\À\À\À\À B "C(D#*A$[<)dI\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\ÀSFJ[JKaMKeOLhPLkRLmSMoTMuWM}[N…_O‹bP’eP˜hQžkR¢mR£nRžkR!-EkR¡mR¤nR¥oR¦pR§pR§pS§pS§pS§pS§pS§pS§pS§pR§pS§pS§pS§pS¨pS¨pS¨pS¨pS¨pS¨pS¨pS¨pS¨pS¨pS¨pS¨pS¨pS¨pS¨qS¨qS¨qS©qS©qS©qS©qS©qS©qS©qS©qS©qS©qS©qSªqSªqSªqSªqSªrS«rS«rS«rS«rS«rS«rS¬rS¬rS¬rS¬sS­sS®sS®sS¯tS¯tS¯tS¯tS°tS°uS°tS®sS«rS£nR¦oR®sS­sS«rS§pR¢mRœjQ–gQdPˆaO\OyYNuWMqUMoTMnSMkRLo8 \À\À\À\À\À B'D+E$(1 J/jH1NCJUGJYIKUGJ\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\ÀXHK]KKbNLfOLiQLkRMmSMoTMqUMxXN\N†_OŒbP’fP˜hQkQ¡mR¥oR§pS¦pR˜hQ¢mR¥oR¨pSªqS«rS«rS«rS«rS«rS«rS«rS«rS«rS«rS«rSªrSªrSªrS«rS«rS«rS«rS«rS«rS«rS«rS«rS«rS«rS«rS«rS«rS«rS«rS¬rS¬rS¬rS¬rS¬rS¬rS¬rS¬sS¬sS­sS­sS­sS­sS­sS­sS®sS®sS®sS®sS®tS¯tS°tS°uS±uS±uT±uT²uT²uT²uT´vTµwT´vT³vT²uT¯tS¢mR¯tS±uT±uS®tS«rS§pR¢mRkQ—hQ‘ePŠaPƒ^O\N{ZNvXNqUMpTMnSMlRMP%\À\À\À\À B#C*E$.E- .!G$Y:%d<"SFJYIKZIKNCJ\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\ÀPDJZIK_LKdNLgPLjQLlRMnSMpTMqUMuWMyYN€\O†`OcP’fP—hQœjQ¡mR¥oR¨qS«rS«rSªrS mR«rS­sS¯tS°tS°tS°tS¯tS¯tS¯tS¯tS¯tS¯tS¯tS¯tS¯tS¯tS®tS®sS®sS®sS®sS®sS®sS®sS®sS®sS®tS®tS®tS¯tS¯tS¯tS¯tS¯tS¯tS¯tS¯tS¯tS¯tS°tS°tS°tS±uS±uS±uT²uT²vT³vT³vT´vT´vT´wTµwTµwTµwT·xT·xT¸xT¸yT¸yU·xU¥\'©qS³vTµwTµwT´vT±uT®tTªrS¦oR¡mRkQ˜hQ’eP‹bP‡`Oƒ^O€\O|ZNxXNtVMpTMoTMmSMjQLh7\À\À\À B(D"-E*1F, 4#K)pL5PEJWHK[JKXHK:9H\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\ÀUGJ\JKaMLeOLhPLkRLmSMoTMpUMrVMvWNyYN|ZN]O‡`OŒcP‘eP—hQ›jQ lR¤nR§pSªqS­sS¯tS°uS¯tS­sS mR^/ ²vT³vT´vT´wTµwT´wT´vT³vT´vT´vT´vT³vT³vT³vT³vT³vT³vT³vT³vT³vT³vT³vT³vT³vT³vT³vT³vT³vT´vT´vT´vT´vT´wTµwTµwTµwTµwT¶wT¶wT¶xT·xT·xT·xT¸xT¸xT¸xT¹yTºyT»zU¼zU½{U½{V½|V•gQ¬rSµwT¸xT¹yU¹yU¹zV·yVµxV±vU­tT©qS¥oS mRœjQ—hQ’ePcPŠbP‡`O„_O]O}[NyYNuWMpUMoTMmSMkRL}H#\À\À &D -E(1F/!2#8 W7"iA&UGJ[JK\JKREJ\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\ÀMCIXIK^KKcNLfOLiQLkRMmSMoTMqUMsVMwXNzYN}[N€\Oƒ^O‡`OŒbP‘eP–gQšjQžkR¢mR¥oR©qS¬rS¯tS±uS³vT´vTµwT´wT²uT­sS lR«_(¹yT¹yTºyTºyTºyTºyTºyT¹yT¹yT¸yT¸xT¸xT¸xT¸xT¸xT¸xT¸yT¸yT¸yT¸yT¹yT¹yT¹yT¹yT¹yT¹yT¹yTºyTºyTºyTºyTºzT»zT¼zU¼{U½{U¾{U¾|U¿|UÀ}VÁ~VÂWÀY™iQ«rSµwT¹yT¼zU½|V¿}XÁ€ZÂ]Á]¾€]»~[¶zY±wW¬tU¨qS¤nSŸlR›jQ–gQ“fPePŽcP‹bPˆ`O…_O‚]O~\NzZNvXNqUMoTMnSMlRMiQLg=!\À +!C+E'0F.4F7%8%U/lG.SFJZIK]KKZIKB=H\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\ÀREJZJK`LKdNLgPLjQLlRMnSMpTMqUMtWMxXN{ZN~[N]O„^O†`O‰aO‹bPdP•gQ™iQœkQ lR¤nR§pSªrS­sS¯tT²uT´vT¶wT·xT¹yT¹yTºyTºyT¹yT¶xT´vT¬rS¢nR—hQ¿|U¿|UÀ|UÀ|UÀ|UÀ|UÀ|UÀ|UÀ|UÀ|UÀ|UÀ|UÀ|UÀ|UÀ}UÀ}UÁ}UÁ}UÁ}UÁ}UÂ}UÂ~UÃ~UÃ~VÃ~VÄVÅ€WÆX®a(ŸlRªrS´vT¸yT¼zU¾|UÁ~VÃXÆ‚[Ɇ_΋dÓ‘jÔ“mÔ“nБlÊŒhĆd½_¶{[°vWªsU¦pS¢nRžkRšiQ˜hQ•gQ“fQ‘ePdPŒbP‰aO†_Oƒ^O€\O|ZNxXNsVMpTMnTMmSMjQL€C B)D&/F-3F47G6%>" Y7 kA$YIK]KK^KKSFJ\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\ÀVGJ\KKbMLeOLhPLkRLmSMnTMpTMrUMuWNyYN|ZN\N‚]O„_O‡`OŠaPŒbPŽcPeP“fP—hQ›jQžlR¢nR¥oS©qT¬sT¯uU²vU´wV¶xV¸yV¹yUºzU»zU¼{U½{U¾{U¾|U¿|U¿|U¿|U¿|U¾{U½{U¼{U¼zU»zTºyT¹yT¸xTµwT³vT´vT´vT´vT´wT´wTµwT·xT¹yTºzT¼zU½{U¾{U¿|UÀ|UÂ}UÄVÅ€WÇ‚YÉ„\͈_ÑŒdÙ”láuç£|쩂ſt명æ¦ÞŸ{Õ—sËŽl†d¹^³yZ­uW¨qU¤oSŸlRžkRœjQšiQ˜hQ–gQ”fQ‘ePdPcPŠaP‡`O„^O]O}[NyYNuWMpTMoTMmSMkRLgPL&D#.E,3F46G;'<(D"iB(VGJ]KK`LK[JKB>H\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\ÀNCJYIK^LKcNLfOLiQLkRMmSMoTMqUMsVMvXNzYN}[N€\O‚^O…_Oˆ`OŠaPŒcPdP‘eP“fQ•gQ—hQ™iQkR mS¤oT¨rU¬tW°wY´zZ¸}\»]¾€^À^Á‚^‚^Â\Á€ZÁYÁXÁ~WÁ~WÂ~VÂ~VÂ~VÃ~VÃ~UÃ~UÄ~UÄ~UÄUÄUÅVÅVÅVÅVÆVÆ€VÆ€VÇ€WÇWÈ‚XɃZË…[͇^ЊaÓdØ’iÜ—nâtè£zî©ó¯‡ø´û¸‘üº“û¹“÷¶ñ±Œé©…à¡~Ö˜vËmÇf»€`´z[®vX©rU¥pT£oS¢nS lRžkRœkRšjQ˜iQ–hQ”fQ’ePdPcP‹bPˆ`O…_O‚]O~[NzYNvWNpTMoTMnSMkRMhQLo7 ,2F36G99HC+@ ]8 nA"\JK`ML_LKSFJ\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\ÀSFJ[JK`LKdNLgPLjQLlRMnSMpTMqUMtVMwXNzZN}[N€]Oƒ^O†_OˆaO‹bPcPdP‘eP“fQ•gQ—hQ™iQ›jRžlR mS£oU§rW¬vZ²{]¹€a¿…fÅŠjËnГqÓ•sÕ–sÕ–rÕ–qÕ”oÓ’mÑjÏgÍŠcˈaɆ^È„\Ç‚[ÆYÅ€XÅ€WÅWÅWÅVÅVÅWÅ€WÆ€WÇXÈ‚YɃ[Ê…\͇_ÏŠaÒeÕ‘hÙ•mÝ™qávä¡zç¤}꧀멃몄騃奀ߠ|Ù›wÓ•rÌmƉh¿„c¸~^²yZ®vX¬tWªsV¨qU¦pT¤oS¢nS mRžlRœkR›jQ™iQ—hQ•gQ“fPePŽcP‹bPˆaO…_O‚^O\N{ZNwXNsVMoTMnSMlRMiQL~I#26G99G?IQ2P+XHK_LLfQOcNLXIK\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À©qSºyTÃ~VΈ`遲ޜv¾€]ªqS–LŽG|> g3 +S)?*%.—hQ—hQ‘eP‡`OuWM\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\ÀSFJ[JK`LKdNLgPLjQLlRMnSMoTMqUMsVMwXNzYN}[N€\O‚^O…_O‡`OŠaPŒbPŽdP‘eP“fP•gQ—hQ˜iQšjRœkRŸlS¡nT¤pV§sX«vZ°z^¶b¼…gËmÊ’sјzØŸ€Þ¤…㩊è­ê¯ë°ê¯Žè¬‹å¨‡à¤‚Ûž|Ö™wÑ“qÌŽlljgÃ…bÀ‚_½\»}Zº{X¹zW¸yV·yU·xU·xU·xT·xT·xU·xU·xU·yV·yV·yW¸zW¸{X¹{Y¹|Zº}[º}[º}\º~\¹~]¹~]¸}]·|\µ{\´z[²yZ°wY®vX¬tWªsV¨rU¦pT¤oS¢nS¡mRŸlRkRœjQšiQ˜hQ–gQ”fQ’ePdPcPŠbP‡`O…_O‚]O~[NzZNvWNrUMoTMmSMlRMiQLeOLJAIJ(h>!]KKfQOgQN_LKD>I\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À™iQ°tS¸yT¼{UÂYÎŒeï­ˆô´Õ—u¶|\ Z'™LˆD |> ’eP¦oR¨qS¦oR¡mRšjQ‘eP„^OhPL\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\ÀWHJ\KKaMLeOLhPLjQLlRMnSMpTMqUMtVMwXNzZN}[N€]Oƒ^O†_Oˆ`OŠbPcPdP‘eP“fQ•gQ—hQ™iQ›jRkRŸmS¢nT¤qV¨sX¬w[±{_¶€c½†hÄŒnË’tÒ™zØŸ€Þ¥…㩉ç­ê¯Žê¯Žê®ç«Šä§†ß£Ûž|Õ˜vГpËŽkljfÃ…bÀ‚_½\»}Yº{X¸zW¸yV·xU·xU·xT¶xT¶xT¶xU¶xU·xU·xU·yV·yV·zW¸zX¸{Y¹|Y¹|Z¹}[¹}[¹}\¹}\¸}\·}\¶|\µ{[³zZ²yZ°wY®vX¬tWªsV¨rU¦pT¤oS£nS¡mRŸlRžkRœjQšiQ˜hQ–gQ”fQ’ePdPŽcP‹bPˆ`O…_O‚^O\N{ZNwXNsVMoTMnSMlRMiQLfOLJ(V.]KKePNkUQcNLQEJ\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À‚]O¡mR©qS¬rS°tS³vTµwT·xUº{WĆbÒ“qךxÊo +K«rS´vT¶wT´vT²uT®sSªqS¤nRkQ•gQˆ`OuWNY,\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\ÀNCJYIK^KKbNLfOLhQLkRLmSMoTMpUMrUMuWMxXN{ZN~[N]O„^O†_O‰aO‹bPcPdP‘eP“fQ•gQ—hQ™iQ›jRkRŸmS¢oT¥qV¨tX­w[±|_·d½†iÄŒnË“tÒ™zØŸ€Þ¥…㩉笌鮎ꮎ魌檉㧅ߢ€Ú{Õ—uÏ’pËjƈfÂ…b¿^½\»|Y¹{X¸zV·yV·xU·xU¶xT¶xT¶xT¶xU¶xU¶xU¶xU·yV·yV·yW¸zW¸{X¸{Y¸|Z¹|Z¹|[¹}[¸}\¸}\·|\¶|[µ{[³zZ±xY°wX®vX¬tWªsV¨rU¦pT¥oS£nS¡mRŸlRžkRœjQšjQ˜iQ—hQ”gQ’fPdPŽcP‹bP‰aO†_Oƒ^O€\O|ZNxXNtVMoTMnSMlRMjQLgPLzG#\JKcOMoXUgPMZIK\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À’fP”gQ•gQ—hQ™iQkQ lR¤nR§pRªqS¬sS¯tS:"r<zYN­sS¹yT¾|UÁ~WÆ„^ËŠeË‹gƈe¾‚aµz[­tV¦pS¢mRkQ–gQŠbPzYNkRL\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\ÀRFJZJK`LKcNLfPLiQLkRMmSMoTMqUMrVMvWNyYN|ZN\N]O„^O‡`O‰aO‹bPcPdP’eP”fQ–gQ—hQ™iQ›jRlR mS¢oU¥qV©tY­x\²|`¸d¾‡iÅoË“uÒ™{ÙŸ€Þ¥…㩉笌é®é®è¬‹å©ˆâ¦„Þ¡ÙœzÔ—tÏ‘oÊŒjƈe„a¿^½~[»|Y¹{X¸zV·yV·xU¶xU¶xT¶xT¶xT¶xT¶xU¶xU¶xU¶xV·yV·yW·zW·zX¸{Y¸{Y¸|Z¸|Z¸|[¸|[·|[·|[¶{[´z[³yZ±xY°wX®vW¬tWªsV¨rU¦pT¥oS£nS¡mRŸlRžkRœkRšjQ™iQ—hQ•gQ“fP‘ePŽdPŒbP‰aP†`Oƒ^O€]O}[NyYNuWNqUMnSMlSMkRLhPLcNLbNLpYVlUP`LK>;H\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À›jQ‡`O{ZN©^'¨^'­`(·e)½h)Ãk*Êo+±b(£nRºyTÃ~UÇXÒdãŸwò°‰ñ°‹è©…ÝŸ}Ô˜vÈm¾„eµ}_®x[°y\®x[«tW§qT¡mRœjQ–gQ‹bP}[NlRM\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\ÀVGJ\JKaMKdNLgPLjQLlRMnSMpTMqUMsVMvXNzYN|[N\O‚]O…_O‡`O‰aPŒbPŽcPdP’eP”fQ–gQ˜hQšiQœjRžlS mS£oU¦rW©uY®x\³|`¸d¾‡jÅoÌ“uÒš{Ù €Þ¥…㩉欋è­è­Œç«Šå©‡á¥ƒÝ ~Ø›yÓ–tΑoÊŒjňe„a¿^¼~[º|Y¹{W¸zV·yV·xU¶xU¶xT¶xT¶xT¶xT¶xU¶xU¶xU¶xU¶xV·yV·yW·zX·zX¸{Y¸{Z¸{Z·|Z·|[·|[¶{[µ{[´zZ³yZ±xY¯wX®uW¬tVªsV¨rU¦pT¥oS£nS¡mR lRžkRœkR›jQ™iQ—hQ•gQ“fQ‘ePdPŒcPŠaP‡`O„^O]O~[NzYNvWNrUMnSMmSMkRLiQLeOLoXUu]XdOLKBI\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À:9H\N–hQ¸}\¯uU­sT¯tT¯tS¨qS¤nR£nR¢nRŸlR›jQšiQ˜hQ—hQ–gQ”fQ’eP‘eP—hQœkR mS¥pUªtX«uY¨sW¦qU mS›jQ•gQƒB’S%jQL\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\ÀLBIXHK^KKbMLeOLhPLjRLlSMnSMpTMqUMtVMwXNzYN}[N€\O‚^O…_O‡`OŠaPŒbPŽcPeP’fP”fQ–gQ˜hQšiRœkRžlS nT£pU¦rWªuY®y]³}`¹‚e¿ˆjÅŽpÌ”vÓš{Ù Þ¤…⨉櫋笌笋櫊䨆ंܟ~ךxÒ•sÎnÉŒiŇeÁ„a¾€^¼~[º|Y¹{W¸yV·yV·xU¶xU¶xT¶wT¶wT¶wT¶xT¶xU¶xU¶xU¶xV¶yV¶yW·zW·zX·zY·{Y·{Z·{Z·{Z¶{Z¶{ZµzZ³yZ²yY±xY¯vX­uW¬tVªsU¨rU¦pT¥oS£nS¡mR lRžlRkR›jQ™iQ—hQ•gQ“fQ‘ePdPcPŠaP‡`O…_O‚]O\N{ZNwXNsVMnSMmSMkRMiQLfOL_LKhQMUGJ\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À (6BFP>=DKHMqjk€trwf`~kc„ndŠqesete¯Ž{w`¡v[\N†_OcP“fP˜iQœjRŸlS£oT¦qV¥qV£oTžlR™iQº^‡`OQ%hPL\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\ÀQEJZIK_LKcNLfOLiQLkRLmSMoTMpUMrUMuWMxXN{ZN~[N€]Oƒ^O…_Oˆ`OŠaPŒcPŽdP‘eP“fP”gQ–hQ˜iQšjRœkRžlS¡nT£pU¦rWªuZ®y]³}a¹‚e¿ˆkÆŽpÌ”vÓš{ÙŸ€Þ¤…⨈媊櫋櫊婈⦅ߣ۞}ÖšxÑ•rÍmÈ‹ićdÁƒa¾€]¼~[º|Y¹zW¸yV·yU¶xU¶xU¶wT¶wT¶wT¶wT¶wT¶xU¶xU¶xU¶xU¶xV¶yV¶yW¶zX·zX·zY¶zY¶{Y¶{Z¶{ZµzZ´zZ³yY²xY°wX¯vX­uW«tVªsU¨rU¦pT¥oS£nS¡mS mRžlRkR›jQ™iQ˜hQ–gQ”fQ‘ePdPcP‹bPˆ`O…_O‚]O\O|ZNxXNtVMoTMmSMlRMjQLgPLbML[JK\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À%5 (6$/79CEEKjgkrc_›…{‘uf±{Ÿw_ºq]Oˆ`OŽcP”fQ˜hQ›jRžlR¡nT¢oT¡nTkR˜hQŽdP¦]'ŽQ%\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\ÀUGJ[JK`MKdNLgPLiQLkRMmSMoTMqUMrUMuWNxXN{ZN~[N]Oƒ^O†_Oˆ`OŠbPcPdP£['µd)•gQ—hQ˜iQšjRœkRžlS¡nT£pU§rWªvZ¯y]´~aºƒfÀˆkÆŽpÌ”vÓš{ØŸ€Ý¤„ᧇ䩉媊媉䨇᥄ޡ€Ú|Õ˜wДrÌmÈŠhĆdÀƒ`¾€]»}[º|Y¸zW·yV·xU¶xU¶xU¶wTµwTµwTµwTµwTµwUµwUµxUµxUµxV¶xV¶yW¶yW¶yX¶zX¶zY¶zYµzYµzY´zY´yY²yY±xY°wX®vW­uW«tVªsU¨qU¦pT¥oS£nS¢mS mRžlRkR›jQ™iQ˜hQ–gQ”fQ’ePdPcP‹bPˆaO†_Oƒ^O€\O|[NxYNtWMpUMmSMlRMjQLgPLcNLA;=\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À#*6+.8;:AHEJmgjd\]‡pe«}œxc w^»pƒ^OŠaP‘eP–gQšiQžlR mS¢nT mS›jR•gQ»h*œX&ˆM$\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\ÀC+WHJ]KKaMLdOLgPLjQLlRMnSMoTMqUMrVMvWNyYN|ZN\N]O„^O†_OˆaO‹bPcPžY&«_(³c(•gQ—hQ™iQšjRœkRŸlS¡nT¤pV§sX«vZ¯z^´~bºƒfÀ‰kÆŽpÌ”vÒš{ØŸ€Ý£„ই㩉䩉䩈⧆ःܠØœ{Ô—vÏ“qËŽlljgÆcÀ‚`½]»}Z¹{Y¸zW·yV¶xU¶xU¶wUµwTµwTµwTµwTµwTµwTµwUµwUµxUµxVµxVµxVµyWµyWµyXµyXµyYµzY´yY´yY³yY²xY±wX°wX®vW­uV«tVªrU¨qU¦pT¥oS£nS¢mS mRžlRkR›jQ™iQ˜hQ–gQ”fQ’ePdPŽcP‹bP‰aO†_Oƒ^O€\O}[NyYNuWNqUMmSMlRMjQLhPLdNL\1\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À+.775;ICFphhŠztŠre¯}Ÿya¢vZ]OŠaP‘eP–gQšiQkRŸlS¡nTžlS™iQÌq.¯b*“S%zG#\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\ÀMCJXHK^KKbMLeOLhPLjRLlSMnSMpTMqUMsVMvWNyYN|ZN\N‚]O„^O†`O‰aO‹bP—U&¥\'¯a(»g)Ìr/—hQ™iQ›jRkRŸmS¡nT¤pV§sX«v[¯z^´~bºƒfÀ‰kÆŽpÌ”vÒ™{מÜ£ƒà¦†â¨ˆã¨ˆã¨‡á¦…Þ£‚ÛŸ~×›yÓ–uÎ’pÊkƉgÂ…c¿‚_½]»}Z¹{X¸zW·yV¶xU¶xUµwTµwTµwTµwTµwTµwTµwTµwUµwUµwUµxUµxVµxVµxWµyWµyWµyXµyX´yX´yY³yY³xX²xX°wX¯vW®uW¬tV«sV©rU¨qT¦pT¥oS£nS¡mR mRžlRkR›jQšiQ˜hQ–gQ”fQ’ePdPŽcPŒbP‰aO†`Oƒ^O€]O}[NzYNvWNrUMmSMlRMjQLhQLeOL_LK\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À,)/ZTVXON„uq‡od®}Ÿyb»s]OŠaPeP•gQšiQkRžlRŸlSœkR–hQ»g*¤\(ŽQ%`LK\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À B B_LKcNLfOLiQLkRLmSMoTMpTMrUMtVMwXNzYN}[N\O‚]O„_O‡`O‰aOQ%ŸY&©^'±b(¾i*Õ{8—hQ™iQ›jRkRŸmS¡nT¤qV§sX«v[°z^µ~bºƒfÀ‰kÆŽpÌ”vÒ™{מÛ¢ƒß¥…ᧇ⧇ᦆऄݢڞ}ÖšxÒ•tÍ‘oÉŒjňfÂ…b¿_¼\º}Z¹{X·zW·yV¶xU¶xUµwTµwTµwTµwTµwTµwTµwTµwT´wU´wU´wU´xVµxVµxVµxW´xW´yW´yX´yX³xX³xX²xX±wX°wW¯vW­uW¬tV«sU©rU§qT¦pT¤oS£nS¡mR mRžlRkR›jQšiQ˜hQ–gQ”gQ’fPdPŽcPŒbP‰aP‡`O„^O]O~[N{ZNvXNrVMnSMlRMjRLhQLeOLaML+O+O\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\ÀHFLXQRTJH~pm‚la¬Ž}Ÿzc»t¤tT‰aPdP•gQšiQœjRžlRžlS›jRÖ|:´e*˜V&ˆN$\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À B B`LKdNLgPLiQLkRMmSMoTMpUMrUMtVMwXNzYN}[N€\O‚]O…_O‡`O‰aPšW&£['«_(´d)Âl,݃@Òt.™iQ›jRkRŸmS¡oU¤qV¨sX«w[°z^µbºƒgÀ‰kÆŽpÌ”uÑ™zÖ~Ú¡‚Þ¤„ॆআॅޣ‚Ü Ø{Õ™wÑ”sÌnÈŒjňfÁ„b¾_¼~\º|Z¸{X·yW¶yV¶xUµwUµwTµwTµwTµwT´wT´wT´wT´wT´wU´wU´wU´wU´wV´xV´xV´xW´xW³xW³xW³xX²xX±wX°wW¯vW®uW­uV¬tVªsU©rU§qT¦pT¤oS£nS¡mR lRžlRkR›jQšiQ˜hQ–hQ”gQ’fPdPŽcPŒbPŠaP‡`O„^O]O~[N{ZNwXNsVMoTMlRMjRLiQLfOLbML+O+O‚+O‚+O‚\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À6./fZXeVRHAIZIKiQLuWM¤tU‰aOdP–gQšjQkRžlRkR˜iQÄn/¬b,‘R%rC"\À\À\À\À\À\À\À\À\À\À\À\À"Fx"Fx!Fx!Fx B B BdNLgPLjQLlRMmSMoTMqUMrUMtWMwXNzZN}[N€\O‚^O…_O‡`O“S%X&¥\'®a(·g+Ês2Ó{9Àj*™iQ›jRkSŸmS¢oU¤qV¨sX«w[°z^µbº„gÀ‰kÆŽpË“uИyÕœ}٠ܢƒÞ¤„ߤ„Þ£ƒÝ¡ÚŸ~×›zÓ—vÏ“rËmÇ‹ićeÀƒa¾€^»~\¹|Z¸zX·yW¶xVµxUµwUµwTµwT´wT´wT´wT´wT´wT´wT´wT´wU´wU´wU´wU´wV³wV³xV³xW³xW²wW²wW±wW±wW°vW¯vW®uV¬tV«sUªsU¨rT§qT¦pT¤oS£nS¡mR lRžlRkR›jQšiQ˜hQ–gQ”gQ’fPePŽcPŒbPŠaP‡`O„_O]O~\N{ZNxXNsVMoTMlRMjRLiQLfPLbNL +O‚+O‚+P‚+P‚+P‚\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À@89dWT@IIAI\JKlRMyYN„^OcP”gQ™iQkRžlRžkR™iRÍt3±d-’S%I#\À\À\À:^‘:^‘:^‘:^‘:^:^:^:^:^"Fx"Fx B B B BeOLhPLjRLlSMnSMpTMqUMrVMuWMxXN{ZN~[N€]Oƒ^O…_O“S%›W&¢['©^(¹k2½i+Ó{:•gQ—hQ™iQ›jRkSŸmT¢oU¤qV¨tY¬w[°{_µbºƒf¿ˆkÄoÊ’tÏ–xÓš|×~Ù €Û¡Û¡Û €Ùž~×›{Ô˜wДsÌoÉŒkʼngÂ…c¿‚`¼]º}[¸{Y·zX¶yVµxVµwU´wU´wT´wT´vT´vT´vT´vT³vT³vT³vT³vT³vU³vU³vU³wU²wU²wV²wV²wV±wV±vV°vV°vV¯uV®uV­tV¬tUªsU©rU¨qT§pT¥pS¤oS¢nS¡mR lRžlRkR›jQ™iQ˜hQ–gQ”gQ’fPePŽdPŒbPŠaPˆ`O…_O‚]O\N|ZNxYNtWMpTMlRMjRLiQLgPLcNL_LK+P‚+P‚+P‚,P‚,P‚,P‚,P‚,P‚Nr¤\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À]QNl\VG@IMCI_LKoTM|ZN†`OdP–gQšjQkRžlRœkR—hQºh*¤^,ŒP%X3:_‘:_‘:_‘:_‘:_‘:_‘:_‘:_‘:^‘:^‘:^‘:^‘"Fx B B B BfOLiQLkRLmSMnTMpTMqUMrVMuWNxYN{ZN~[N€]Oƒ^OŽP%—U&X&£['¬`)½n4Ãn/Àj*•gQ—hQ™iQ›jRkSŸmT¢oU¤qW¨tY«w[°z^´~b¹ƒf¿ˆjÄŒoÉ‘sΕwÒ™{Õœ}ØžÙŸ€ÚŸ€Ùž~ל|ÕšyÒ—vÏ“rËnÇ‹jĈfÁ„c¾`¼]¹}[¸{Y·zW¶xVµxU´wU´wT´wT´vT´vT³vT³vT³vT³vT³vT³vT³vT³vT²vU²vU²vU²vU²vU±vV±vV±vV°vV°vV¯uV®uV­uV¬tU«sUªrU©rT¨qT¦pT¥oS£oS¢nS¡mRŸlRžkRœkR›jQ™iQ˜hQ–gQ”gQ“fPePŽdPŒbPŠaPˆ`O…_O‚]O\N|ZNyYNuWMpUMlRMjQLiQLgPLdNL_LK,P‚,P‚,P‚,P‚,P‚Nr¤Nr¤Nr¤Nr¤Nr¥Nr¥\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\ÀaSOD>IJAIQEJbNLrUM~[NˆaO‘eP—hQœjQžkRŸlR›jRÌs0²e,“T&ƒK$;_‘;_‘;_‘;_‘;_‘;_‘;_‘:_‘:_‘:_‘:_‘:_‘:_‘ B B B BgPLiQLkRLmSMoTMpTMqUMsVMuWNxYN{ZN~[N]O‡M$“S%™V&ŸY&¥\'±e-¹j/Ñz:”fQ•gQ—hQ™iR›jRkSŸmT¢oU¤qW¨tY«w[¯z^´~b¹ƒf¾‡jÃŒnÈrÍ”vјyÔ›|Ö~מ~Øž~×}Õ›{Ó˜xЕtÍ’qÊŽmÆŠiÇeÀ„b½_»~\¹|Z·{Y¶yWµxVµxU´wU´wT´vT³vT³vT³vT³vT³vT³vT³vT³vT²vT²vT²vT²vU²vU²vU±vU±vU±vU°vV°vV¯uV®uV®uV­tU¬sU«sUªrU¨qT§qT¦pS¥oS£nS¢nR¡mRŸlRžkRœkR›jQ™iQ˜hQ–gQ”gQ’fPePŽdPŒbPŠaPˆ`O…_O‚]O\O|ZNyYNuWMqUMlSMjQLhQLfPLdNL_LK,P‚,P‚Nr¤Nr¤Nr¤Nr¤Nr¥Nr¥Nr¥Ns¥Ns¥Ns¥Ns¥\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\ÀdUOG@IMCITFJeOLtWM€]O‹bP“fP™iQkRŸlRkR™iQ¾j,©c/P%[JK;_‘;_‘;_‘;_‘;_‘;_‘;_‘;_‘;_‘;_‘;_‘;_‘ B B B BgPLiQLkRMmSMoTMpTMqUMsVMvWNyYN{ZN~[N|H#ŽQ%•T%›W& Z'¦]'ºm5¸f*Ív5”fQ•gQ—hQ™iR›jRkSŸmT¡oU¤qW§sY«v[¯z^³~b¸‚e½‡i‹nÇqË“uÏ–xÒ™zÔ›|Öœ}Öœ|Õ›{Ô™yÑ–vÏ“sÌoÈlʼnh†e¿ƒa¼€_º~\¸|Z·zX¶yWµxV´wU´wU³vT³vT³vT³vT³vT³vT³vT²vT²vT²vT²vT²vT²vT±vT±vU±vU±vU°uU°uU°uU¯uU®uU®tU­tU¬tU«sUªrU©rT¨qT§pT¥pS¤oS£nS¢mR mRŸlRžkRœjR›jQ™iQ—hQ–gQ”fQ’fPePŽcPŒbPŠaPˆ`O…_O‚^O\O|ZNyYNuWNqUMmSMjQLhQLfPLdNL`LKNr¤Nr¤Nr¥Nr¥Nr¥Ns¥Ns¥Ns¥Ns¥Os¥Os¥Os¥Os¥Os¥Os¥\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À2#TB3REJVGJ`LKpTM}[N‰aO’ePšiQžkR lRžlR˜hQ·e)¢^.P%^8 #Gy#Gy#Gy#Gy#Gy#Gy#Gy#Gy * B B B B BjQLlRMnSMoTMpUMrUMsVMxF#‡M$ŽQ%’S%–U&šW&žY&¢['ªa+¿s;¹g+dP‘eP“fQ”gQ–hQ˜iQšjRœkSžlS nU£pV¦rX©uZ¬x]°{_´~b¸‚e¼…iÀ‰kÃŒnÆŽpÈrÊ‘sË’sË‘rÊqÉoÇmÅ‹kÈhÀ…e¾ƒb¼€`º~^¸|[¶{ZµyX´xW³wV²vU²vU²vT±uT±uT±uT±uT±uT±uT±uT±uT°uT°uT°tT°tT¯tT¯tT¯tT¯tT®tT®tT­sT­sT¬sT¬sT«rTªrT©rT©qT¨qS§pS¦pS¥oS£nS¢nR¡mR lRŸlRkRœjQ›jQ™iQ˜hQ–gQ•gQ“fP‘ePdPcP‹bP‰aO‡`O„^O‚]O\N|ZNxXNuWMqUMmSMhPLgPLeOLcNL`LKZIK,Pƒ,Pƒ,QƒOs¦Os¦Ot¦Ot¦Ot¦Ot¦Pt¦Pt¦Pt¦Pt¦Pt¦-Qƒ-Qƒ-Qƒ-Qƒ-Qƒ-Qƒ-Qƒ-Qƒ-Qƒ-Qƒ\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\ÀvšÍvšÍv›Ív›Ív›Ív›Ív›Íw›Íw›Í=a“=a“=a“#Gy#Gy#Gy#Gy#Gy#Gy#Gy#GymYPODJUGJXIKeOLtWM‚]OcP•gQœjQ lR mRkRÈp.´g0”T&ˆN$]8 #Gy#Gy#Gy#Gy#Gy#Gy#Gy * B B B B BjQLlRMnSMoTMpUMrUMv>„L$ŒP%‘R%•T%˜V&œX& Z'¤\'°f0¹m5Äq3dP‘eP“fQ”gQ–gQ˜hQ™jR›kSlS nT¢pV¥rX¨tZ«w\¯z_³}a·dº„g¾‡jÁŠlÄŒnÆŽpÇqÈqÈpÇŽoÆmÅ‹kÉiÁ‡g¿„d½‚aº_¸}]·|[µzY´yX³xW³wV²vU²vU±uT±uT±uT±uT±uT±uT°uS°uS°tS°tS°tS¯tS¯tT¯tT¯tT®tT®tT®sT­sT­sT¬sT¬sT«rTªrTªrT©qT¨qS§pS¦pS¥oS¤oS£nS¢mR¡mRŸlRžlRkRœjQšjQ™iQ—hQ–gQ”fQ’fP‘ePdPcP‹bP‰aO†`O„^O]O~\N{ZNxXNuWMqUMiQLgPLfOLeOLbNL_LKZIK,Qƒ,Qƒ,Qƒ,Qƒ,QƒOt¦Pt¦Pt¦Pt¦Pt¦Pt¦-Qƒ-Qƒ-Qƒ-Qƒ-Qƒ-Qƒ-Qƒ-Qƒ-Qƒ-Qƒ-Qƒ-Qƒ-Qƒ-Qƒ-Qƒ\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\Àv›Ív›Ív›Ív›Íw›Íw›Íw›Íw›Íw›Íw›Íw›Íw›Í=a“=a“=a“=a“=a“#Gz#Gz#Gz#Gz#Gz#Gz#GzgUOS=2RFJWHJ[JKlRMzYN†`OeP˜iQžkR mRŸlR™iQ¼h*°h4‘R%ˆN$^9 [JK#Gy#Gy#Gy#Gy#Gy * B B B B BjQLlRMnSMoTMpUMI#†L$‹O$Q%“S%—U&šW&X&¡Z'¦](·l5´f,Èt5dPeP’fP”fQ–gQ—hQ™iR›kRlSŸmT¢oV¤qW§tY«v[®y^±|aµc¸‚f¼…h¿ˆkÁŠlÃŒnÅnÅoÅnÅŒmÄ‹k‰iÁ‡g¿…e½ƒc»€`¹~^·|\¶{Z´yY³xW²wV²vU±vU±uT±uT±uT°uT°uT°tS°tS°tS°tS°tS¯tS¯tS¯tS¯tS®tS®tS®sS­sT­sT­sT¬sT¬rT«rTªrTªrS©qS¨qS§pS¦pS¦oS¥oS¤nS¢nR¡mR mRŸlRžkRkR›jQšiQ˜iQ—hQ•gQ”fQ’ePePdPcPŠbPˆ`O†_Oƒ^O]O~[N{ZNxXNtVMqUMhPLgPLfOLdNLbML_LKbE6,Qƒ,Qƒ,Qƒ,Qƒ-Qƒ-Qƒ-QƒPt¦-Qƒ-Qƒ-Qƒ-Qƒ-Qƒ-Qƒ-Qƒ-Qƒ-Qƒ-Qƒ-Qƒ-Qƒ-Qƒ-Qƒ-Qƒ-Qƒ-Qƒ-Q„-Q„-Q„\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À@d–w›Íw›Íw›Íw›Íw›Íw›Íw›Íw›Íw›Íw›Íw›Íw›Îw›Îw›Î=a”=a”=a”=a”=a”=a”=a“#Hz#Gz#Gz#Gz#Gz#Gz#GzmYPPDJUGJYIKbMLqUM\NŠbP”fQ›jQŸlR¡mRžlRËp,µe+ \+R%ˆN$b; ]8 [7 XHKO+N1L/L/L/K/K/ eb”>b”>b”>b”>b”>b”>b”>b”=b”=b”=b”=b”=b”=b”=b”=b”YEUGJYIK_LKnSM|ZNˆ`O’ePšiQŸlR¡mR mR™iQºg*´j4šW'‘R%ŽQ%h>!g=!f=!db”>b”>b”>b”>b”>b”>b”$Hz$Hz$Hz$Hz$Hz>b”>b”>b”>b”>b”gVOS=2RFJWHK[JKeOLsVM€]OŒbP•gQœjQ lR¡mRžlRÌr/¹g*²h2–U&“S%‘R%Q%ŽQ%ŒP%£['¨]'¬`(°b(´d)¸f)»g)¾i*Áj*I#¡Z'¡Z' Z' Z'¡Z'£['¤['¥\'¦]'ª_)±d,³d)Äq3‹bPcPdP‘eP’fQ”fQ–gQ—hQ™iR›kSlSŸmU¡oV¤qW¦sY©u[¬x]¯z^±|`´~b¶€d¸‚eºƒf»„f»„f¼„f»ƒe»‚dºb¹€a·~_¶}^µ{\´zZ³yY²wX±wW°vV°uU¯uU¯tT¯tT¯tT®tS®tS®tS®sS®sS®sS®sS®sS­sS­sS­sS­sS¬sS¬rS¬rS«rS«rSªrSªqS©qS©qS¨pS§pS¦pS¦oS¥oS¤oR£nR¢nR¡mR mRŸlRžkRkRœjQšjQ™iQ˜hQ–hQ•gQ“fQ’ePdPŽcPŒcPŠbPˆ`O†_O„^O]O\N|ZNyYNuWNrUMnSMjQLdNLcNLaMK_LK[JK`D6Pt¦Pt¦Pt§Pt§Pt§Pu§Pu§Pu§Pu§Qu§Qu§Qu§Qu§Qu§Qu§-Q„-Q„-Q„-R„-R„-R„-R„-R„-R„-R„-R„-R„.R„.R„Rv¨Rv¨Rv¨~¢Ô~¢Ô~¢Ô~¢Ô\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À@e—@e—@e—@e—Ae—Ae—Ae—Ae—Ae—Ae—Ae—Ae—Ae—Ae—Ae—xœÏxœÏxœÏxÏxÏxÏxÏyÏyÏ>b•>b”>b”$Hz$Hz$Hz$Hz$Hz$Hz$Hz$Hz$Hz$Hz>b”>b”>b”>b”>b”YDb”>b”>b”>b”Q@:R<2fL@WHJZJKaMKoTM|ZNˆ`O‘eP™iQŸlR¡mR¡mRœjRÇo-»i-´h0«`)§]'¨]'¬`(°b(´d)¸f)¼h)Àj*Ãk*Æm*Én+Ìp+Ïq+Òr,§]'§]'§]'¨^'ª_(«_(¬`(­`(¯b)²c)ºi.ˆ`OŠaPŒbPŽcPdP‘eP“fQ”gQ–hQ˜iRšjR›kSlTŸnU¢oV¤qW¦sY©uZ«w\­y]°{_²|`³}aµ~b¶b¶b¶b¶a¶~`µ}_µ|^´{]³z[²yZ±xY°wX¯vW¯uV®uU®tU®tT­tT­sT­sS­sS­sS­sS­sS­sS­sS­sS¬sS¬rS¬rS¬rS«rS«rS«rSªrSªqS©qS©qS¨qS¨pS§pS¦pS¦oS¥oR¤oR¤nR£nR¢mR¡mR lRŸlRžkRkRœjQšjQ™iQ˜hQ–hQ•gQ“fQ’ePdPdPcP‹bP‰aO‡`O…_O‚]O\O}[NzYNwXNtVMpTMlRMhPLcNLaMK_LK]KKbR]C5Pu§Pu§Pu§Qu§Qu§Qu§Qu§Qu§Qu§Qu§Qu§Qu§Qu§Qu¨Qu¨Qu¨Qv¨Qv¨Qv¨-R„-R„.R„.R„.R„Rv¨Rv¨Rv¨Rv¨Rv¨Rv¨Rv¨£Õ£Õ£Õ£Õ£Õ£Õ£Õ£Õ£Õ£Õ\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\ÀAe—Ae—Ae—Ae—Ae—Ae—Ae—Ae—Ae—Ae—Ae—Ae—Ae—Ae˜Ae˜Ae˜Ae˜yÏyÏyÏAf˜Af˜Af˜$Hz$Hz$Hz$Hz$Hz$Hz$Hz$Hz$Hz$Hz$Hz$Hz$Hz$Hz$Hz$Hz>b•>b•>b”>b”WD3TFJXHK[JKfOLsVM€]O‹bP”gQœjQ lR¡mR mRœkRÅm,½i,ºj/²d+±c)²c(¶e)ºf)¾h*Áj*Ål*Én+Ëo+Îq+Ñr+Ós,Õt,ƒK$ª^(ª_(«_(¬`(®a(¯a)°b)³d*¶f+¾m1‡`O‰aP‹bPcPdPeP’fQ”fQ•gQ—hR™iR›kSlTŸmT¡oV£pW¥rX§tY©v[¬w\®y]¯z^±{_²|`³}`´}`´}`´}_´|^³{^³{\²z[±yZ°xY°wX¯vW®uV®tU­tU­tT­sT­sT­sS­sS¬sS¬sS¬sS¬rS¬rS¬rS¬rS¬rS«rS«rS«rS«rSªrSªqSªqS©qS©qS¨qS¨pS§pS¦pS¦oS¥oR¤oR¤nR£nR¢mR¡mR mRŸlRžlRkRœjQ›jQšiQ˜iQ—hQ–gQ”fQ“fP‘ePdPŽcPŒbPŠaPˆ`O†_O„^O]O\N|ZNyYNvWNsVMoTMkRLgPLbML`LK^KK\JK~aR[B5Pu§Qu§Qu§Qu§Qu§Qu§Qu§Qu§Qu§Qu§Qu§Qu¨Qu¨Qu¨Qv¨Qv¨Qv¨Rv¨Rv¨Rv¨Rv¨Rv¨Rv¨Rv¨Rv¨Rv¨Rv¨Rv¨Rv©Rv©£Õ£Õ£Õ£Õ£Õ£Õ£Õ£Õ£Õ£Õ£Õ£Õ£Õ\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\ÀAe—Ae—Ae—Ae—Ae—Ae—Ae˜Ae˜Ae˜Ae˜Ae˜Ae˜Ae˜Af˜Af˜Af˜yÐAf˜Af˜Af˜Af˜Af˜Bf˜$H{$Hz$Hz$Hz$Hz$Hz$Hz$Hz$Hz$Hz$Hz$Hz$Hz$Hz$Hz$Hz>c•>c•>b•>b•O?:[E|aRZA5-QƒQu§Qu§Qu§Qu§Qu§Qu§Qu§Qu¨Qu¨Qu¨Qv¨Qv¨Qv¨Qv¨Rv¨Rv¨Rv¨Rv¨.R„.R„.R„.R„Rv¨Rv¨Rv©Rv©Rv©Rw©£Ö£Ö£Ö£Ö£Ö£Ö£Ö£Ö£Ö£Ö£Ö£Ö£Ö£Ö£Ö£Ö\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\ÀAe˜Ae˜Ae˜Ae˜Ae˜Ae˜Ae˜Af˜Af˜Af˜Af˜Af˜yžÐyžÐyžÐzžÐzžÐzžÐBf˜Bf˜Bf˜Bf˜Bf˜$H{$H{$H{$H{$H{$H{$H{$H{$H{$Hz$Hz$Hz$Hz$Hz$Hz$Hz$Hz>c•>c•>c•>c•VC^C6W@5-Q„-Q„Qu§Qu§Qu§Qu§Qu¨Qu¨Qv¨Qv¨Qv¨Qv¨Rv¨Rv¨Rv¨Rv¨.R„.R„.R„.R„.R„.R„.R„.R„.R„Rv©Rw©Rw©Rw©¤Ö¤Ö¤Ö¤Ö€¤Ö€¤Ö€¤Ö€¤Ö€¤Ö€¤Ö€¤Ö€¤Ö€¤Ö€¤Ö€¤Ö¤Ö¤Ö¤Ö\À\À\À\À\À\À\À\À\À\À\À\À\À\À\À\ÀAf˜Af˜Af˜Af˜Af˜Af˜Af˜Af˜zžÐzžÐzžÐzžÐzžÐzžÐzžÐzžÐzžÐzžÐzžÐBf˜Bf˜Bf˜Bf˜$I{$I{$I{$H{$H{$H{$H{$H{$H{$H{$H{$H{$H{$H{$H{$H{$Hz$Hz$Hz$Hz$Hz YE\C6T>4-Q„-Q„-Q„-R„Qu¨Qu¨Qv¨Qv¨Qv¨Qv¨Rv¨Rv¨Rv¨.R„.R„.R„.R„.R„.R„.R„.R„.R„.R„.R„.R„.R„Rw©Sw©€¤Ö€¤Ö€¤Ö€¤Ö€¤Ö€¤Ö€¤Ö€¤Ö€¤Ö€¤Ö€¤Ö€¤Ö€¤Ö€¤Ö€¤Ö€¤Ö€¤Ö€¤ÖEi›Ei›Ei›\À\À\À\À\À\À\À\À\À\À\À\À\À\ÀAf˜Af˜Bf˜Bf˜Bf˜zžÐzžÐzžÐzžÐzžÐzžÐzžÐzžÐzžÑzžÑzžÑzŸÑzŸÑzŸÑzŸÑBf˜Bf˜Bf˜$I{$I{$I{$I{$I{$I{$I{$I{$I{$I{$I{$H{$H{$H{$H{?c•?c•?c•?c•$H{$H{$H{SB;R<2zbVUGJXIK[JK[JKuWN€\OŠaP’fP™iQŸlR¡mR£nS£nS¥pTà€9Þ9Õw2Öw0Öv/Öv.Ùx/Üz0Þz0á|1ã~2æ€3è5éƒ6ë…8ë…8ºm4¼o7¾q8Äu;Ãs9Ãs8ºj0‚]O„^O†_Oˆ`OŠaPŒbPcPdP‘eP’fQ”fQ•gQ—hR™iRšjSœkSlTŸnU¡oV¢pV¤qW¦rX§sY¨tY©uYªuZ«uZ«vZ«vY«uY«uX«uX«tW«tV«sVªsUªsUªrTªrTªrTªrSªqSªqSªqSªqSªqS©qS©qS©qS©qS©qS©qS©qS©qS¨qS¨pS¨pS§pS§pR§pR¦oR¦oR¥oR¥oR¤nR£nR£nR¢mR¡mR mR lRŸlRžkRkRœjQ›jQšiQ™iQ—hQ–gQ•gQ”fQ’eP‘ePdPcPŒbPŠaPˆ`O†_O„^O‚]O\O}[NzYNwXNtVMqUMnSMiQLeOL`LK]KKmP?kN?|aSZA5P<4-R„-R„-R„-R„-R„-R„Qv¨Rv¨Rv¨Rv¨Rv¨.R„.R„.R„.R„.R„.R„.R„.R„.R„.R„.R„.R„.R„.R„.R„.R„.R„€¤×€¤×€¤×€¤×€¤×€¤×€¤×€¤×€¤×€¤×€¤×€¤×€¤×€¤×€¤×€¤×Ei›Ei›Ei›Ei›Ei›Ei›Ei›\À\À\À\À\À\À\À\À\À\À\À\ÀBf˜zžÐzžÐzžÐzžÐzžÐzžÐzžÑzžÑzžÑzŸÑzŸÑzŸÑzŸÑ{ŸÑ{ŸÑ{ŸÑ{ŸÑ{ŸÑ{ŸÑBf™Bf™Bf™%I{$I{$I{$I{$I{$I{$I{$I{$I{$I{$I{?c–?c–?c–?c–?c–?c•?c•?c•?c•$H{$H{$H{jXP^H=}dXUGJXHKZIKkRLwXN‚]O‹bP”fQšiQžkR mR£nS¥pT¨qU¨rUç…;ç†>ì‰?è†<å‚9ê†;î‰=ðŠ=ðŠ>ôŽAø‘Dü•Hÿ˜Kù’E¿r:Àt;Àt;Át<Ãt:½n4´f,]Oƒ^O…_O‡`O‰aO‹bPŒcPŽcPdP‘eP“fQ”gQ–hQ˜iR™jR›kSœlSžmTŸnU¡oV¢pV¤qW¥rW¦rX§sX¨tX©tX©tX©tX©tXªtWªsW©sV©sV©rU©rU©rT©qT©qT©qS©qS©qS©qS©qS©qS©qS©qS©qS¨qS¨qS¨pS¨pS¨pS¨pS§pS§pS§pR¦pR¦oR¦oR¥oR¥oR¤nR¤nR£nR¢nR¢mR¡mR mR lRŸlRžkRkRœjQ›jQšiQ™iQ˜hQ–hQ•gQ”fQ’fP‘ePdPŽcPŒcP‹bP‰aO‡`O…_Oƒ^O]O~[N{ZNyYNvWNsVMpTMlRMgPLcNL†gUƒeUlO?~bT{`SW@5-R„-R„-R„-R„-R„-R„.R„.R„.R„.R„.R„.R„.R„.R„.R„.R„.R„.R„.R„.R„.R„.R„.R„.R„.R„.R„.R….R…Ei›Ei›Ei›€¥×€¥×€¥×€¥×€¥×€¥×€¥×€¥×€¥×€¥×€¥×€¥×Ei›Ei›Ei›Ei›Ei›Ei›Ei›Ei›Ei›Ei›Ei›\À\À\À\À\À\À\À\À\À\ÀzžÑzžÑzžÑzžÑzŸÑzŸÑzŸÑzŸÑ{ŸÑ{ŸÑ{ŸÑ{ŸÑ{ŸÑ{ŸÑ{ŸÑ{ŸÑ{ŸÑ{ŸÑ{ŸÑ{ŸÑ{ŸÒBg™Bg™Bg™%I{%I{%I{%I{%I{%I{%I{@d–?d–?d–?d–?d–?d–?d–?d–?d–?c–?c–?c–?c–$I{$I{L=:WD`KA-R„-R„-R„.R„.R„.R„.R„Rv¨Rv¨Rv¨Rv¨.R„.R„.R„.R„.R„.R„.R„.R„.R„.R„.R„.R„.R….R….R….R…EiœEiœEiœEiœEiœEiœ¥×¥×¥×¥×¥×¥×¥×EiœEiœEiœEiœEiœEiœEiœEiœEiœEiœEiœEiœEiœEiœEiœEiœ\À\À\À\À\À\À\À\ÀzŸÑzŸÑ{ŸÑ{ŸÑ{ŸÑ{ŸÑ{ŸÑ{ŸÑ{ŸÑ{ŸÑ{ŸÑ{ŸÑ{ŸÑ{ŸÒ{ŸÒ{ŸÒ{ŸÒ{ Ò{ Ò{ Ò{ Ò| ÒCg™Cg™%I{%I{%I{@d–@d–@d–@d–@d–@d–@d–@d–@d–@d–@d–@d–?d–?d–?d–?d–?d–?d–$I{$I{dUPYEXG@-R„.R„.R„.R„Rv¨Rv¨Rv¨Rv¨Rv¨Rv¨Rv¨Rv©.R„.R„.R„.R„.R„.R„.R„.R„.R….R….R….R….R….R….S…EiœEiœEiœEjœEjœEjœEjœEjœ¥×¥×¥×EjœEjœEjœEjœEjœEjœEjœEjœEjœEjœEjœEjœEjœEjœEjœEjœEjœEiœEiœEiœ\À\À\À\À\À\À{ŸÑ{ŸÑ{ŸÑ{ŸÑ{ŸÑ{ŸÑ{ŸÑ{ŸÒ{ŸÒ{ŸÒ{ Ò{ Ò{ Ò{ Ò| Ò| Ò| Ò| Ò| Ò| Ò| Ò| Ò| ÒCg™@d–@d–@d–@d–@d–@d–@d–@d–@d–@d–@d–@d–@d–@d–@d–@d–@d–@d–@d–@d–@d–?d–$I{$I{RA;P<3zcXnVIuh™~pdNLpUMÁ”w¬zZ«vS‘eP–gQœjQžlR¡mR¤oS§pT­uV¯vW±xY¶|\¼€_ÆdƉgÈŠhÊŒiÌŽkÎlÿRñF¶k4²g1¯d-­b+ª_(¢Z'}[N€\O‚]O„^O†_Oˆ`O‰aP‹bPcPŽcPdP‘eQ’fQ”gQ•gQ—hR˜iR™jR›kSœkSlTžmT nT¡nU¡oU¢oU£pU¤pU¤pU¤pU¥pU¥pT¥pT¥pT¥pT¥pS¥pS¥oS¦oS¦oS¦oS¦oS¦oS¦oR¦oR¦oR¦oR¦oR¦oR¦oR¦oR¥oR¥oR¥oR¥oR¤oR¤nR¤nR£nR£nR¢nR¢mR¡mR¡mR lRŸlRŸlRžkRkRœkQœjQ›jQšiQ™iQ˜hQ—hQ•gQ”gQ“fP’ePePdPcPŒbPŠbP‰aO‡`O…_Oƒ^O]O~\N|[NzYNwXNtVMpUM—pY”oXzWBuUB…gVlP@jO@|bUx`TcMB3!.R„Rv¨Rv¨Rv¨Rv¨Rv¨Rv¨Rv¨Rv©Rv©Rv©Rw©Rw©Rw©.R„.R„.R„.R„.R….R….R….R….R….S….S….S…EjœEjœEjœEjœEjœEjœEjœEjœEjœ¦Ø¦ØEjœEjœEjœEjœEjœEjœEjœEjœEjœEjœEjœEjœEjœEjœEjœEjœEjœEjœEjœEjœEjœEjœEjœ\À\À\À\ÀBg™{ŸÒ{ŸÒ{ŸÒ{ Ò{ Ò{ Ò{ Ò| Ò| Ò| Ò| Ò| Ò| Ò| Ò| Ò| Ò| Ò| Ò| ÒCg™Cg™Cg™Cg™|¡Ó@d—@d—@d—@d—@d—@d—@d–@d–@d–@d–@d–@d–@d–@d–@d–@d–@d–@d–@d–@d–@d–@d–%I{;0/SB;R=4fODpXL‘xkš€r˜vbº“zÀ”x«{[ÃldP•gQ™iQ›jQŸlR£nR¦pS¨qTªrT¬tU°wWµ{Z¸}\¸|\¸}\¹~]»]å}+Ý~6­d.ªa+¨_)§^(¤\'zYN|ZN~\N€]Oƒ^O„_O†_Oˆ`OŠaP‹bPcPŽdPdP‘eQ“fQ”gQ•gQ—hR˜iR™jRšjSœkSlSžlTŸmT mT nT¡nT¢nT¢oT£oT£oT£oT£oT¤oS¤oS¤oS¤oS¤oS¤oS¤oS¥oR¥oR¥oR¥oR¥oR¥oR¥oR¥oR¥oR¥oR¤oR¤oR¤nR¤nR¤nR£nR£nR£nR¢mR¢mR¡mR¡mR lR lRŸlRžlRžkRkQœjQ›jQšjQ™iQ™iQ˜hQ—hQ•gQ”gQ“fQ’ePePdPŽcPŒbPŠbP‰aO‡`O…_Oƒ^O]O\N}[NzZNxXNuWMrUM™rZ–pY|XCxVCsTBmQAkOA~cVzaU`I>\IARv¨Rv¨Rv¨Rv¨Rv¨Rv¨Rv¨Rv©Rv©Rv©Rw©Rw©Rw©Sw©Sw©Sw©Sw©.R….R….R….R….R….S….S….S….S…FjœFjœFjœFjœFjœFjœFjœFjœ‚¦Ø‚¦Ø‚¦Ø‚¦Ø‚¦Ø‚¦ØFjœFjœFjœFjœFjœFjœFjœFjœFjœFjœFjœFjœFjœFjœFjœFjœFjœFjœFjœFjœFjœFjœFjœ\À\ÀBg™{ Ò| Ò| Ò| Ò| Ò| Ò| Ò| Ò| Ò| Ò| Ò| Ò| Ò| Ó| ÓCg™Cg™Cg™Cg™Cg™Cg™Cg™Cg™}¡Ó@e—@e—@e—@e—@e—@e—@d—@d—@d—@d—@d—@d—@d–@d–@d–@d–@d–@d–@d–@d–@d–@d–@d–%I{<1/J82^I@gQFqYN‘xl™€s—vc¢{d¿”yª{\«wUÄi‘eP•gQ˜hQkQ mR¢mR¤nR¥oS§pSªrT¬tU¬tU¬tU¬tU­tU®tUÒt.ƒL&¤](¢['¡Z'žY&xYN{ZN}[N\N]Oƒ^O…_O‡`OˆaOŠaPŒbPcPdPeP‘eQ“fQ”gQ•gQ—hR˜iR™iRšjR›kSœkSlSžlSŸmSŸmS mS nS¡nS¡nS¢nS¢nS¢nS¢nS£nS£nS£nR£nR£nR£nR¤nR¤nR¤nR¤nR¤nR¤nR¤nR¤nR£nR£nR£nR£nR£nR¢nR¢mR¢mR¡mR¡mR¡mR lR lRŸlRžlRžkRkRœkQœjQ›jQšiQ™iQ˜iQ—hQ–hQ•gQ”fQ“fP’ePePdPŽcPŒbP‹bP‰aO‡`O†_O„^O‚]O\O}[N{ZNxYNvWNsVM›s[˜rZ~ZDnYŒkYqSBkPAiOA|cVbK?\G>NB?Rv¨Rv¨Rv¨Rv¨Rv¨Rv©Rv©Rv©Rw©Rw©Rw©Sw©Sw©Sw©Sw©Sw©Sw©Sw©Sw©.S….S….S….S….S….S…FjœFjœFjœFjœFjœFjœ‚¦Ø‚¦Ø‚¦Ø‚¦Ø‚¦Ø‚¦Ø‚¦Ø‚¦Ø‚¦Ø‚¦Ø‚¦ØFjœFjœFjœFjœFjœFjœFjœFjœFjœFjœFjœFjœFjœFjœFjœFjœFjœFjœFjœFjœFjœFjœFjœCg™Cg™| Ò| Ò| Ò| Ò| Ò| Ó| Ó| Ó| Ó|¡Ó|¡ÓCg™Cg™Cg™Cg™Cg™Cg™Cg™CgšCgšCgšCgšCgš}¡ÓAe—Ae—Ae—@e—@e—@e—@e—@e—@e—@e—@e—@d—@d—@d—@d—@d—@d—@d–@d–@d–@d–%I{@d–@d–<1/H72\I@ePGpYNxm˜€t–vc¡{e¾”zÁ“u‘p«wU¬uQ‘eP•gQ™iQšjQœjQžlR¡mR£nR¤nR¤oR¤oR¤oR¤oR¤oRÇgb;  Z'žY&›W&“S%vXNyYN{ZN~[N€\O‚]Oƒ^O…_O‡`O‰aOŠaPŒbPcPdPdP‘eQ“fQ”gQ•gQ–hQ˜iR™iRšjR›jR›kSœkSlSžlSžlSŸlSŸmS mS mS¡mS¡mS¡mR¡mR¢mR¢mR¢mR¢mR¢nR¢nR¢nR£nR£nR£nR£nR£nR¢nR¢nR¢mR¢mR¢mR¢mR¡mR¡mR¡mR mR lRŸlRŸlRžlRžkRkRkQœjQ›jQ›jQšiQ™iQ˜hQ—hQ–gQ•gQ”fQ“fP‘ePdPdPcPŒbP‹bP‰aO‡`O†_O„^O‚]O€\O}[N{ZNyYNvXNtVMu\„]E€[E’oZŽmZŠkYnRBjOB}cVdL@`I?XGARv¨Rv¨Rv¨Rv¨Rv©Rv©Rw©Rw©Rw©Rw©Sw©Sw©Sw©Sw©Sw©Sw©Sw©Sw©Sw©SwªSwª.S….S….S….S…/S…FjœFjœFjœFjœ‚¦Ù‚¦Ù‚¦Ù‚¦Ù‚¦Ù‚¦Ù‚¦Ù‚¦Ù‚¦Ù‚¦Ù‚¦Ù‚¦Ù‚¦Ù‚¦Ù‚¦ÙFjœFjœFjœFjœFjœFjœFjœFjœFjœFjœFjœFjœFjœFjœFjœFjœFjœFjœFjœ‚¦Ù‚¦ÙCg™Cg™| Ó| Ó|¡Ó|¡Ó|¡Ó|¡Ó|¡ÓCg™Cg™Cg™Cg™CgšCgšCgšCgšCgšCgšCgšCgšChšChšChšChšChš}¢ÔAe—Ae—Ae—Ae—Ae—Ae—Ae—Ae—Ae—@e—@e—@e—@e—@e—@e—@e—@d—%I{%I{%I{%I{%I{@d–@d–<10F61o]Vye]„oeŽxmœ‚u”udŸ{e¥}d¨|aÀ’tÁpÃl¬uQdP’eP”fQ–gQ˜iQ›jQœjQœjQœjQœjQœkQœkQkQ_9 œX&™V&•T%rUMuWMwXNzYN|ZN~[N€\O‚]O„^O…_O‡`O‰aOŠbPŒbPcPŽdPdP‘eQ’fQ”fQ•gQ–hQ—hR˜iR™iRšjR›jRœkRœkRkRlRžlRžlRŸlRŸlRŸlR lR mR mR mR¡mR¡mR¡mR¡mR¡mR¡mR¡mR¡mR¡mR¡mR¡mR¡mR¡mR¡mR¡mR mR lR lRŸlRŸlRŸlRžkRžkRkRkQœjQ›jQ›jQšiQ™iQ˜iQ—hQ–hQ•gQ”gQ“fQ’fP‘ePdPdPcPŒbPŠbP‰aO‡`O†_O„^O‚]O€\O~[N{ZNyYNwXNtVMrUM†^F‚]F”q\o[ŒlZqTD€fX}dWeMAbK@O=6NB@Rv¨Rv©Rv©Rv©Rw©Rw©Rw©Rw©Sw©Sw©Sw©Sw©Sw©Sw©Sw©Sw©Sw©SwªSwªSwªSxªSxªSxª/S…/S…FjœFjœFjœƒ§Ùƒ§Ùƒ§Ùƒ§Ùƒ§Ùƒ§Ùƒ§Ùƒ§Ùƒ§Ùƒ§Ùƒ§Ùƒ§Ùƒ§Ùƒ§Ùƒ§Ùƒ§Ùƒ§Ùƒ§Ùƒ§ÙFjœFjœFjœFjœFjœFjœFjœFjœFjœFjœFjœFjœFjœFjœFjœƒ§Ùƒ§Ùƒ§Ùƒ§ÙCg™Cg™Cg™}¡Ó}¡Ó}¡ÓCg™CgšCgšCgšCgšCgšCgšCgšChšChšChšChšChšChšChšChšChšChšDhšDhšDhš~¢ÔAe—Ae—Ae—Ae—Ae—Ae—Ae—Ae—Ae—Ae—Ae—Ae—Ae—%I{%I{%I{%I{%I{%I{%I{%I{%I{@d—@d—E:9D61m\Vwe]lXOuaX„k_¨‹z±|¡|e¥|c§|`©z]ªyXÂnÃlÄŽkÄŽidP’eP“fP“fP“fP’fP“fP“fP“fP[7 —U&”T%P%pTMsVMuWMxXNzYN|ZN~[N€\O‚]O„^O†_O‡`O‰aOŠbPŒbPcPŽdPdP‘eP’eQ“fQ”gQ•gQ–hQ—hQ˜iR™iRšjR›jR›jRœkRœkRkRkRžkRžlRžlRŸlRŸlRŸlRŸlR lR lR lR lR lR lR lR lR lR lR lR lR lRŸlRŸlRŸlRŸlRžkRžkRkRkQœkQœjQ›jQ›jQšiQ™iQ˜iQ˜hQ—hQ–gQ•gQ”fQ“fP’eP‘ePdPŽdPcPŒbPŠbP‰aO‡`O…_O„^O‚]O€\O~[N|ZNyYNwXNuWMrUM‡`G„^G–r]|ZFxXFtVEgY~eY{cXbLA[H?REA.R„.R„Rv©Rw©Rw©Rw©Sw©Sw©Sw©Sw©Sw©Sw©Sw©Sw©Sw©Sw©SwªSwªSxªSxªSxªSxªTxªTxªTxªƒ§Ùƒ§Ùƒ§Ùƒ§Ùƒ§Ùƒ§Ùƒ§Ùƒ§Ùƒ§Ùƒ§Ùƒ§Ùƒ§Ùƒ§Ùƒ§Ùƒ§Ùƒ§Ùƒ§Ùƒ§Ùƒ§Ùƒ§Ùƒ§Ùƒ§Ùƒ§Ùƒ§Ùƒ§ÙFjFjFjFjFjFjFjFjFjFjFjƒ§Ùƒ§Ùƒ§Ùƒ§Ùƒ§Ùƒ§ÙCg™Cgš}¡Ó}¡ÓCgšCgšCgšCgšChšChšChšChšChšChšChšChšChšDhšDhšDhšDhšDhšDhšDhšDhšDhšDhš~¢ÔAe—Ae—Ae—Ae—Ae—Ae—Ae—Ae—Ae—%I|%I|%I|%I{%I{%I{%I{%I{%I{%I{%I{%I{%I{%I{@e—@e—B99B51k[Vud]iWPr_Wye] †yªŒ|²}¡|e¤|c¾’w¨{^¨z\©yZÁp«xW«wU«wU«wU«wUÃŽlÃŽlÂŽlÂŽlkD(’S%ŒP%nSMoTMqUMsVMvWNxXNzYN|ZN~[N€\O‚]O„^O†_O‡`O‰aOŠaP‹bPcPŽcPdPeP’eQ“fQ”fQ•gQ–gQ–hQ—hQ˜iQ™iR™iRšjR›jR›jRœjRœkRœkRkRkRkRžkRžkRžlRžlRŸlRŸlRŸlRŸlRŸlRŸlRŸlRŸlRŸlRžlRžkRžkRžkRkRkQkQœkQœjQ›jQ›jQšjQšiQ™iQ˜iQ˜hQ—hQ–gQ•gQ”gQ“fQ’fP‘ePePdPŽcPcP‹bPŠaPˆaO‡`O…_Oƒ^O‚]O€\O~[N|ZNyYNwXNuWMrUMŸw_œv_˜t^~\GzYGvWF†j[fZ|dYybX\I@VGB5/2.R„.R„.R„.R„Sw©Sw©Sw©Sw©Sw©Sw©Sw©Sw©Sw©SwªSwªSwªSxªSxªSxªSxªTxªTxªTxªTxªFkFkFkFkƒ§Úƒ§Úƒ§Úƒ§Úƒ§Úƒ§Úƒ§Úƒ§Úƒ§Úƒ§Úƒ§Úƒ§Úƒ§Úƒ§Úƒ§Úƒ§Úƒ§Úƒ§Úƒ§Úƒ§Úƒ§Úƒ§Úƒ§ÚFkFkFkFkFkFkFkFkƒ§Úƒ§Úƒ§Úƒ§Úƒ§Úƒ§Úƒ§Úƒ§Ú}¡Ó}¡Ó}¡Ô}¡ÔChšChšChšChšChšChšChšDhšDhšDhšDhšDhšDhšDhšDhšDhšDhšDhšDhšDhšDhšDhšDhšDhš~£ÕAe˜Ae˜Ae˜Ae˜Ae˜%J|%I|%I|%I|%I|%I|%I|%I|%I|%I|%I|%I|%I{%I{%I{%I{%I{%I{@e—@e—<68?31gYVpa\bRMjYTq`Z€j`¡‡z«}²‘}¶’|¸’{º’z»’x¼’w§z^¿‘t¿‘s¿‘s¿s¿r¿r¾r¾r°h2‹O$„L$mSMnSMnTMoTMtVMvWNxXNzYN|ZN~[N€\O‚]O„^O…_O‡`OˆaOŠaP‹bPŒcPŽcPdPdP‘eP’eQ“fQ”fQ•gQ–gQ–hQ—hQ˜hQ˜iQ™iQšiQšiQšjQ›jQ›jQœjQœjQœkQœkQkQkRkRkRkRkRkRkRkRkRkQkQkQœkQœjQœjQœjQ›jQ›jQšjQšiQ™iQ™iQ˜hQ—hQ—hQ–gQ•gQ•gQ”fQ“fP’eP‘ePdPdPcPŒbP‹bP‰aPˆ`O†`O…_Oƒ^O]O€\O~[N|ZNyYNwXNtWM£z` y`w`šu_€]I|[HwXGˆl\ƒi[}eZycYr_WjZU;23.R„.R„.R„.R„.R….R….R…Sw©Sw©Sw©Sw©Sw©SwªSwªSwªSxªSxªSxªTxªTxªTxªTxª/S…/S…GkGkGkGkGkGkGkƒ¨Úƒ¨Úƒ¨Úƒ¨Úƒ¨Úƒ¨Úƒ¨Úƒ¨Úƒ¨Úƒ¨Úƒ¨Úƒ¨Úƒ¨Úƒ¨Úƒ¨Úƒ¨Úƒ¨Úƒ¨Úƒ¨Úƒ¨Úƒ¨Úƒ¨Úƒ¨ÚGkGkGkƒ¨Úƒ¨Úƒ¨Úƒ¨Úƒ¨Úƒ¨Úƒ¨Úƒ¨Úƒ¨Úƒ¨Úƒ¨Ú}¢Ô}¢Ô}¢Ô}¢Ô~¢ÔDhšDhšDhšDhšDhšDhšDhšDhšDhšDhšDhšDhšDhšDhšDhšDhšDhšDhšDhšDhšDhšDhšDhšDhš£ÕAf˜%J|%J|%J|%J|%J|%J|%J|%J|%J|%I|%I|%I|%I|%I|%I|%I|%I|%I|%I|%I|%I{%I{Ae—Ae—Ae—?89H=:?YUY`QGfVLudXjeitlm{po|qp}rp~rpsqsq€tqŒr_=1+xJ)’o[~[F€\G‚^H„_I…`IkRLlRMnSMpTMrVMuWMwXNyYN{ZN}[N~\N€\O‚]Oƒ^O„_O†_O‡`Oˆ`O‰aPŠbP‹bPŒcPcPŽcPdPdPeP‘eP’eP’fP“fQ“fQ”fQ”gQ•gQ•gQ•gQ–gQ–gQ–gQ–hQ–hQ—hQ—hQ—hQ—hQ—hQ–hQ–hQ–gQ–gQ–gQ•gQ•gQ•gQ”fQ”fQ“fQ“fP’eP‘eP‘ePdPdPŽdPŽcPcPŒbP‹bPŠaP‰aO‡`O†_O…_Oƒ^O‚]O€\O~\N}[N{ZNyYNwXNuWM“iOhOŽgO‹eOžze›yd—wd”tcrbtYKjTIaOG[KFj]Y^UU?;@.R….R….S….S….S….S….S….S…/S…/S…/S…/S…/S…/S…/S…/S…/S…/S…/S…/S…/S…/S…/S…GkžGkžGkžGkžGkžGkžGkžGkžGkžGkžGkžGkžGkžGkžGkžGkžGkžGkž…©Û…©Û…©Û…©Û…©Û…©Û…©Û…©Û…©Û…©Û…©ÛGlžGlžGlžGlžGlžGlžGlžGlžGlžGlžGlžGlžGlž…©Û…©Û…©Û…©Û…©Û…©Û£Õ£Õ£Õ£Õ£Õ£Õ£Õ£ÕDh›Dh›Dh›Dh›Di›Di›Di›Di›Di›¤Ö¤Ö¤Ö¤Ö€¤Ö€¤Ö€¤Ö€¤Ö€¤Ö€¤Ö€¤Ö€¤Ö€¤Ö€¤Ö€¤ÖEi›Ei›&J|&J|&J|&J|&J|&J|&J|&J|&J|&J|&J|&J|&J|%J|%J|%J|%J|%J|%J|Af˜Ae˜Ae˜%J|%J|%J|%I|%I|%I|%I|#-#%.()1MEAQIEUMI]SL]TM=4.1+(=.#6,&5( 1%"ŒlYn[“p\•r]]Hƒ_I…`JœwažybkRLmSMpTMrUMtVMvWNxXNzYN|ZN}[N\N€]O‚]Oƒ^O…_O†_O‡`OˆaO‰aPŠaP‹bPŒbPcPŽcPŽdPdPdPeP‘eP‘eP’eP’fP“fP“fQ“fQ”fQ”fQ”fQ”gQ”gQ•gQ•gQ•gQ•gQ•gQ”gQ”fQ”fQ”fQ”fQ“fQ“fP“fP’eP’eP‘eP‘ePdPdPdPŽcPcPŒcPŒbP‹bPŠaP‰aO‡`O†_O…_Oƒ^O‚]O]O\O}[N|ZNzYNxXNvWN¬‚gªg¨€ghPŒfPŸ|fœzf˜xe”vdscsYLiTK_NHYKFh\Z]UV=;@.R….S….S….S….S….S….S…/S…/S…/S…/S…/S…/S…/S…TxªTxªTxªTxªTxª/S…/S…/S…/S…GlžGlžGlžGlžGlžGlžGlžGlžGlžGlžGlžGlžGlžGlžGlžGlžGlžGlžGlžGlž…©Û…©Û…©Û…©Û…©Û…©Û…©ÛGlžGlžGlžGlžGlžGlžGlžGlžGlžGlžGlžGlžGlžGlžGlžGlžGlžGlž…©Û…©Û…©Û…©Û£Õ£Õ£Õ£Õ£Õ£Õ£Ö£ÖDi›Di›Di›Di›Di›Di›¤Ö€¤Ö€¤Ö€¤Ö€¤Ö€¤Ö€¤Ö€¤Ö€¤Ö€¤Ö€¤Ö€¤Ö€¤Ö€¤Ö€¤Ö€¤×€¤×€¤×€¤×Ei›&J|&J|&J|&J|&J|&J|&J|&J|&J|&J|&J|&J|&J|&J|&J|&J|Bf˜Bf˜Af˜Af˜Af˜Af˜Af˜%J|%J|%J|%J|%J|%J|%I|%I|%I|, +,!.! "`E6†iYŒlZo\“q]•s^^J™va›wbycŸzd {e¤}foTMqUMsVMuWNwXNyYN{ZN|ZN~[N\O]O‚]Oƒ^O…_O†_O‡`Oˆ`O‰aOŠaP‹bPŒbPŒcPcPŽcPŽdPdPdPdPeP‘eP‘eP‘eP’eP’eP’eP’eP’fP’fP’fP“fP’fP’fP’fP’eP’eP’eP‘eP‘eP‘ePePdPdPdPŽdPŽcPcPŒcPŒbP‹bPŠaP‰aOˆ`O‡`O†_O…_Oƒ^O‚]O]O\O~[N|[N{ZNyYNwXN®ƒi¬ƒiª‚i¨i¦€hŒhR‰fQ†dQ‚bP•wfx]Oˆpdkbtd_m`]OEDG?A;:@.S….S….S….S….S…/S…/S…/S…/S…/S…/S…/S…/S…TxªTxªTxªTxªTxªTx«Tx«Tx«Ty«/S†GlžHlžHlžHlžHlžHlžHlžHlžHlžHlžHlžHlžHlžHlžHlžHlžHlžHlžHlžHlžHlžHlžHlž…ªÜ…ªÜ…ªÜHlžHlžHlžHlžHlžHlžHlžHlžHlžHlžHlžHlžHlžHlžHlžHlžHlžHlžHlžHlžHlžHlž…ªÜ…ªÜ£Ö£Ö£Ö£Ö¤Ö¤Ö¤Ö¤Ö¤ÖEi›€¤Ö€¤Ö€¤Ö€¤Ö€¤Ö€¤Ö€¤Ö€¤Ö€¤Ö€¤Ö€¤Ö€¤Ö€¤×€¤×€¤×€¤×€¥×€¥×€¥×Bg™Bg™Bg™Bg™Bg™&J|&J|&J|&J|&J|&J|&J|&J|&J|&J|&J|&J|&J|Bf˜Bf˜Bf˜Bf˜Bf˜Bf˜Bf˜Bf˜Bf˜Af˜Af˜%J|%J|%J|%J|%J|%J|%J|%J|%J|%J|%I|%I|%I|%I|%I|%I| +,YA5jPBpSD‹l[o]’q^–t`‚_Kšwbœycžze {f¡}g¤h¨i”lSrVMtWMvWNxXNyYN{ZN|[N~[N\O]O‚]Oƒ^O„_O…_O†`O‡`Oˆ`O‰aPŠaP‹bP‹bPŒbPcPcPŽcPŽcPdPdPdPdPdPdPdPdPePePePePePdPdPdPdPdPdPdPŽcPŽcPcPcPŒbP‹bP‹bPŠaP‰aOˆ`O‡`O†`O…_O„^Oƒ^O‚]O€]O\O~[N|[N{ZNyYNxXN°…j®„j¬„jªƒj¨‚j¦€jŒhSŠgS†eRƒcR|`QŒsf…oe}jcrd`k_]LCDC=@,,3(4F(4F.S….S…/S…/S…/S…/S…/S…/S…/S…TxªTxªTxªTxªTxªTxªTx«Tx«Tx«Ty«Ty«Ty«…ªÜHlžHlžHlžHlžHlžHlžHlžHlžHlžHlžHlžHlžHlžHlžHlžHlžHlžHlžHlžHlžHlžHlžHlžHlž†ªÜHlžHlžHlžHlžHlžHlžHlžHlžHlžHlžHlžHlžHlžHlžHlžHlžHlžHlžHlžHlžHlžHlžHlžHlžHlžChšChš¤Ö€¤Ö€¤Ö€¤Ö€¤ÖEi›Ei›Ei›€¤Ö€¤Ö€¤Ö€¤Ö€¤Ö€¤Ö€¤×€¤×€¤×€¤×Cg™Cg™Cg™Cg™Cg™Cg™Cg™Cg™Cg™Cg™Cg™Cg™Bg™Bg™&J|&J|&J|&J|&J|&J|&J|&J|&J|&J|Bf˜Bf˜Bf˜Bf˜Bf˜Bf˜Bf˜Bf˜Bf˜Bf˜Bf˜Bf˜Bf˜Bf˜Bf˜&J|%J|%J|%J|%J|%J|%J|%J|%J|%J|%J|%J|%I|%I|%I|%I|%I|#5H71O;3V?4iOBoSDsVFo]{[I^Kƒ`L…bN‡dOŸ{f }g¢~h¥€j’kT•mU˜oVšqWrWwXNxXNzYN{ZN}[N~[N\O€]O‚]Oƒ^O„^O…_O…_O†`O‡`Oˆ`O‰aO‰aPŠaP‹bP‹bPŒbPŒbPŒcPcPcPcPŽcPŽcPŽcPŽcPŽcPŽcPŽcPŽcPŽcPŽcPcPcPcPŒcPŒbP‹bP‹bP‹bPŠaP‰aP‰aOˆ`O‡`O†_O…_O„_O„^Oƒ^O]O€\O\N~[N|ZN{ZNyYN›oTšoT™oT—nT¬„lªƒl¨‚ljUŒiTŠhT†fT€cSvi‰rgnfyidqdah^^HBD?<@)+3OZkMYk(5F(5F(5F/S…/S…/S…/S…/S…TxªTxªTxªTxªTxªTxªTx«Tx«Ty«Ty«Ty«Ty«Uy«†ªÜ†ªÜ†ªÜ†ªÜHlžHlžHlžHlžHlžHlžHlžHlžHlžHlžHlžHlžHlžHlžHlžHlžHlžHlžHlžHlž†ªÜ†ªÜ†ªÜ†ªÜ†ªÜHlžHlžHlžHlžHlžHlžHlžHlžHlžHlžHlžHlžHlžHlžHlžHlžHlžHlžHlžHlžHlžHlžHlžDhšDhšDhšChš&K}&K}&K}&K}&K}&K}ChšChšCgšCgšCgšCgšCgšCgšCg™Cg™Cg™Cg™Cg™Cg™Cg™Cg™Cg™Cg™Cg™Cg™Cg™Cg™Cg™Cg™Cg™&J|&J|&J|&J|&J|&J|Bg™Bg™Bg™Bf™Bf™Bf™Bf™Bf™Bf˜Bf˜Bf˜Bf˜Bf˜Bf˜Bf˜Bf˜Bf˜Bf˜Bf˜&J|&J|&J|&J|%J|%J|%J|%J|%J|%J|%J|%J|%J|%J|%J|%I|%I|A99N?;L:2T>4gNBlRD‡k\‹n^z[J~^LaN…cO‡dP‰fQŠgRŒhTjU’lV•nW˜pXšrXsY¶‹q¸qºŽr¼r½r¿s©z[©z[ªz[«{[¬{[¬{ZÅ“rÅ’qÅ’qÅ’pÅ’pÅ‘o­yV­xV¬xU¬wT¬wTŠaPŠbP‹bP‹bP‹bP‹bP‹bP‹bP‹bP‹bP‹bP‹bP‹bP‹bPŠaPŠaPŠaP‰aP‰aOˆaOˆ`O‡`O‡`O†_O…_O„^Oƒ^O‚^O‚]O]O€\O~\N}[N|ZNzYNpTœpU›pUšpU˜oV—oV•nV“mV‘lVkVŒjVˆhVƒfU~cUuj†qh~mfugdkaad\^E@D98?$(2minffm^blV^lMYk(5F(5F/S…TxªTxªTxªTxªTxªTxªTxªTx«Tx«Ty«Ty«Ty«Uy«Uy«†ªÜ†ªÜ†ªÜ†ªÜ†ªÜ†ªÜ†ªÜ†ªÜHlžHlžHlžHlžHlŸHlŸHlŸHlŸHlŸHlŸHlŸHlŸHlŸHlŸHlŸ†ªÝ†ªÝ†ªÝ†ªÝ†ªÝ†ªÝ†ªÝ†ªÝ†ªÝ†ªÝHlŸHlŸHlŸHlŸHlŸHlŸHlŸHlŸHlŸHlŸHlŸHlŸHlŸHlŸHlŸHlŸHlŸHlŸHlŸHlŸHlŸ'K}'K}'K}'K}'K}'K}'K}'K}'K}&K}&K}ChšChšChšChšChšChšChšCgšCgšCgšCgšCgšCgšCg™Cg™Cg™Cg™Cg™Cg™Cg™Cg™Cg™Cg™Cg™Cg™&J|Cg™Cg™Cg™Cg™Cg™Bg™Bg™Bg™Bg™Bg™Bg™Bf™Bf™Bf™Bf™Bf™Bf˜Bf˜Bf˜Bf˜Bf˜Bf˜Bf˜Bf˜&J|&J|&J|&J|&J|&J|&J|%J|%J|%J|%J|%J|%J|%J|Ae˜Ae˜;GY<68I=:I82Q=4XA6~fZ„j\‰m^p`|]L€`NƒcP†eQˆgS¡j£€l¦‚m©„n•oX˜qYšrZt[¶Œr¸sºs¼t½t¾‘t¨z]©{]ª{]«{\«{\¬{\¬{[Ä“sÄ“rÄ’rÄ’qÄ’pÄ‘p¬yWÄoÃnÃmÃlÂŽlÂŽkÁkˆaOˆaOˆaOˆaOˆaOˆaOˆaOˆ`Oˆ`O‡`O‡`O‡`O†`O†_O…_O…_O„_O„^Oƒ^O‚]O]O€]O\O~\N}[N|ZN¶‰l¶‰lµˆmœqV›qVšqV™pW˜pW–oW¬…nª…n§„n¤‚nŸ€n›~n€eW‘xlŠtk‚piykfodcf_`JDG@>C*,5$1MYktr~tstmolinadmX_lNZkMZkTxªTxªTxªTxªTx«Tx«Tx«Ty«Ty«Ty«Uy«Uy«Uy«†ªÝ†ªÝ†ªÝ†ªÝ†ªÝ†ªÝ†«Ý†«Ý†«Ý†«ÝHlŸHlŸHmŸHmŸHmŸHmŸHmŸHmŸHmŸHmŸHmŸHmŸ†«Ý†«Ý†«Ý‡«Ý‡«Ý‡«Ý‡«Ý‡«Ý‡«Ý‡«Ý‡«Ý‡«Ý‡«ÝHmŸHmŸHmŸHmŸHmŸHmŸHmŸHmŸHmŸHmŸHmŸHmŸHmŸHmŸHmŸHmŸHmŸHmŸHmŸHmŸ'K}'K}'K}'K}'K}'K}'K}'K}'K}'K}'K}'K}DhšDhšDhšDhšChšChšChšChšChšChšChšCgšCgšCgšCgšCgšCgšCg™Cg™Cg™Cg™Cg™&J}&J}&J}Cg™Cg™Cg™Cg™Cg™Cg™Cg™Cg™Cg™Cg™Bg™Bg™Bg™Bg™Bg™Bg™Bf™Bf™Bf™Bf™Bf˜Bf˜Bf˜Bf˜Bf˜&J|&J|&J|&J|&J|&J|&J|&J|&J|&J|Af˜Af˜Af˜Af˜;GY;GY;GY1'!D:9N?;N;3]I?zdY€h[†l^‹oasc“ue€bQ„dR‡fT l¢m¦ƒn©…o«‡p®ˆq±Šr³‹sžv] w]¹u»u¼‘u¾‘u¿’v¨{^©{^ª|^«|]«|]«{\¬{\¬{[¬{[¬zZ«zZ«yY«yX«xXÂoÂnÂnÁŽmÁŽm¨uT¨uS§tS§tS§tR¦sR¦sQ…_O…_O…_O„^O„^Oƒ^Oƒ^O‚^O‚]O]O€]O¢rS¡rS¡rS¸‰k·‰l·‰l¶‰m¶‰mµ‰m´‰n³‰n›qWšqX™qX®‡o­‡o«†p¨…p¤ƒp pœp—}o{cXv`Vp]U}nishfhaba\_DAF::B$)4MYkMYkMYkŒtctq\QPPIKFDI;>H/8GMZkTxªTx«Tx«Tx«Ty«Ty«Ty«Uy«Uy«Uy«†«Ý†«Ý†«Ý‡«Ý‡«Ý‡«Ý‡«Ý‡«Ý‡«Ý‡«Ý‡«Ý‡«Ý‡«Ý‡«ÝHmŸHmŸHmŸImŸImŸImŸImŸImŸ‡«Ý‡«Ý‡«Ý‡«Ý‡«Ý‡«Ý‡«Ý‡«Ý‡«Ý‡«Ý‡«Ý‡«Ý‡«Ý‡«Ý‡«Ý‡«Ý‡«ÝImŸImŸImŸImŸImŸImŸImŸImŸImŸImŸImŸImŸImŸImŸImŸImŸImŸImŸ'K}'K}'K}'K}'K}'K}'K}'K}'K}'K}'K}'K}DhšDhšDhšDhšDhšDhšDhšDhšDhšChšChšChšChšChšChšChšChšCgšCgš&K}&K}&K}&K}&J}&J}Cg™Cg™Cg™Cg™Cg™Cg™Cg™Cg™Cg™Cg™Cg™Cg™Cg™Cg™Bg™Bg™Bg™Bg™Bg™Bg™Bf™Bf™Bf™Bf™Bf˜Bf˜&J|&J|&J|&J|&J|&J|Bf˜Bf˜Bf˜Bf˜Bf˜Bf˜;HY;HY;GY;GY;GY;GY;,#I=:H82YF?^JA|e[‚j]ˆn`Œqcte”wg—yiš|k~l €n£‚o¤ƒp¦…q­‰s°Šs›u]žv^Ÿw^¡x_£y_¤z_¥z_¦{_¿“w¿“wÀ“vÁ“vÁ“v“u“u“tª{\ª{\ªz[ªzZªyZªyY©xXÁpÀo¨wW¨vV§vV§uU¦uU¦uT¥tT½Œl¼‹k¼‹k¼‹k»‹k»‹kºŠk¢sT¢rT¢rT¡rT¡rT¡rU rU rV·Šn¶ŠnµŠnµŠo´Šo³‰o²‰p±‰p™qY®ˆq¬‡qª†r§…r¤„r ‚rœ€q€gZ{dYvaXp^WiYU`TRVNOb]aEBH<+[NL^SQWNNKFJ?AI2:HTx«Ty«Ty«Ty«Uy«Uy«Uy«Uy«Uy«‡«Ý‡«Ý‡«Ý‡«Ý‡«Ý‡«Ý‡«Ý‡«Ý‡«Ý‡«Ý‡«Ý‡«Ý‡«Ý‡«Ý‡«Ý‡«Ý‡«ÝImŸImŸImŸImŸ‡«Ý‡«Ý‡«Ý‡«Ý‡«Þ‡«Þ‡«Þ‡«Þ‡«Þ‡«Þ‡«Þ‡«Þ‡«Þ‡«Þ‡«Þ‡«Þ‡«Þ‡«Þ‡«Þ‡«Þ‡«ÞImŸImŸImŸImŸImŸImŸImŸImŸImŸImŸImŸImŸImŸImŸImŸImŸ'K}'K}'K}'K}'K}'K}'K}'K}'K}'K}'K}'K}'K}DhšDhšDhšDhšDhšDhšDhšDhšDhšDhšDhšDhšDhšDhšChš&K}&K}&K}&K}&K}&K}&K}&K}&K}&K}CgšCg™Cg™Cg™Cg™Cg™Cg™Cg™Cg™Cg™Cg™Cg™Cg™Cg™Cg™Cg™Cg™Bg™Bg™Bg™Bg™Bg™Bg™Bf™Bf™Bf™&J|&J|Bf˜Bf˜Bf˜Bf˜Bf˜Bf˜Bf˜Bf˜Bf˜;HY;HY;HY;HY;HY;HY;GY3("D::B41RB=YG@wcZ}g\ƒk_‡nbŒrdug}aRdT„gV‡iX‰kY¢ƒq¤„r¥…s§†t‘p^’q^Ÿw` x`¢y`£z`¤za¥{a½“x¾“x¿“w¿“wÀ“wÀ“vÀ“vÀ“vÀ“uÀ’uÀ’tÀ‘sÀ‘sÀ‘r¿r¿q¿q¾p¾Žp¾Žo½Žo¥vW¼n¼Œn»Œn»Œn»ŒnºŒnº‹m¢tV¡sV¡sV¡sV sV sWŸsWŸsXžsXµŠpµŠp´ŠpœsY›sYšrZ˜r[–r\”q\‘p]¦†t£„tŸƒsœs€h\{e[vbYo^XhZV`USXPQNJMECJRS[47A+((MYkMYkMYkMZk(5F(5F(5FOHJT=+YML_SRZQQMGJABI2:H/T†Uy«Uy«Uy«Uy«Uy«Uy«‡«Ý‡«Ý‡«Ý‡«Ý‡«Ý‡«Þ‡«Þ‡«Þ‡«Þ‡«Þ‡«Þ‡«Þ‡«Þ‡«Þ‡«Þ‡¬Þ‡¬Þ‡¬Þ‡¬Þ‡¬Þ‡¬Þ‡¬Þ‡¬Þ‡¬Þ‡¬Þ‡¬Þ‡¬Þ‡¬Þ‡¬Þ‡¬Þ‡¬Þ‡¬Þ‡¬Þ‡¬Þ‡¬Þ‡¬Þ‡¬Þ‡¬Þˆ¬Þˆ¬Þˆ¬Þˆ¬Þˆ¬Þˆ¬Þˆ¬ÞImŸImŸImŸImŸImŸImŸImŸImŸImŸImŸImŸImŸˆ¬Þˆ¬Þ'K}'K}'K}'K}'K}'K}'K}'K}'K}'K}'K}'K}'K}DhšDhšDhšDhšDhšDhšDhšDhšDhšDhšDhšDhš'K}'K}'K}'K}'K}'K}&K}&K}&K}&K}&K}&K}&K}&K}CgšCgšCgšCgšCg™Cg™Cg™Cg™Cg™Cg™Cg™Cg™Cg™Cg™Cg™Cg™Cg™Cg™Cg™Cg™Bg™Bg™Bg™Bg™&J|&J|Bf™Bf™Bf™Bf™Bf˜Bf˜Bf˜Bf˜Bf˜;HY;HY;HY;HY;HY;HY>DM>DM;HY89<:+#9&B52I94ZHAxd[}g^k`†nc‹rey_R}bTeVƒgX…iYˆk[Šl\Œn]o^¥‡v§ˆvšvaœwažxa yb¢zb¤{b¤{a¼“x½“x¦|a§|a§|`§{`§{_§{_§{^§z^¾‘u¾‘t¾‘t¾s½s½r½r¥wZ¤wZ¤vY¤vY£vY£uX¢uX¢uX¢uX¹Œp¸Œp¸Œp·Œp·‹p¶‹p¶‹pµ‹qµ‹qtZ›t[šs\™s\˜s]–r]”r^’q^p^o^Šn^‡l^ƒj^h]{f\ub[n^YgZW_UTWPQOKOEEKST]JNY>=?JJIMYkMYk(5F(5F(5F(5F(5F)5G)5GK=4S<*XMLbWVYPPLGJ@AI/T†/T†Uy«Uy«Uy«‡¬Þ‡¬Þ‡¬Þ‡¬Þ‡¬Þ‡¬Þ‡¬Þ‡¬Þ‡¬Þ‡¬Þ‡¬Þ‡¬Þˆ¬Þˆ¬Þˆ¬Þˆ¬Þˆ¬Þˆ¬Þˆ¬ÞImŸImŸImŸIm ˆ¬Þˆ¬Þˆ¬Þˆ¬Þˆ¬Þˆ¬Þˆ¬Þˆ¬Þˆ¬Þˆ¬Þˆ¬Þˆ¬Þˆ¬Þˆ¬Þˆ¬Þˆ¬Þˆ¬Þˆ¬Þˆ¬Þˆ¬Þˆ¬Þˆ¬Þˆ¬Þˆ¬Þˆ¬Þˆ¬ÞIm Im Im Im Im Im Im Im ˆ¬Þˆ¬Þˆ¬Þˆ¬Þ'K}'K}'K}'K}'K}'K}'K}'K}'K}'K}'K}'K}'K}'K}Dh›Dh›Dh›Dh›DhšDhšDhšDhš'K}'K}'K}'K}'K}'K}'K}'K}'K}'K}'K}'K}'K}'K}&K}&K}&K}&K}ChšChšCgšCgšCgšCgšCgšCg™Cg™Cg™Cg™Cg™Cg™Cg™Cg™Cg™Cg™Cg™Cg™Cg™&J|&J|&J|&J|&J|Bg™Bg™Bg™Bf™Bf™Bf™Bf™Bf˜Bf˜;HY;HY;HY;HY;HY;HYCIR>DMCIR;HYCIR.$0"8&?*G/V=+w[F{g^€kanXMs\Px_S{bU~dWfYƒhZ†j\ˆl]Šm^¢…v§ˆwªŠx­Œy¯y±Žz´zµz·‘z¹’z£{b£{b¤{b¥{b¥{a¥{a¥{`¥{`¥z_¥z_¥z^¼‘u¥y]¤y]¤x]¤x\£w\£w[¢w[¢v[¢v[¡v[¡v[¸r·r¶r¶ŒsµŒs´Œs´Œs²Œt±‹u°‹u˜t^–s_•s_“r_’r`q`p`¡…wž„v›‚v—€u“~twd]sb[l^ZeYW]TUUORLJOYYaRU^JOZ>>@!$)RXaMYk39B-3<-3<(5F)5G)5G)5G)5G)5GFDJK9*^K=YONg\\TLMIFJ:>I0T†0T†ImŸˆ¬Þˆ¬Þˆ¬Þˆ¬Þˆ¬Þˆ¬Þˆ¬Þˆ¬Þˆ¬Þˆ¬Þˆ¬Þˆ¬Þˆ¬Þˆ¬Þˆ¬Þˆ¬Þˆ¬Þˆ¬ÞIm Im In In In In In In ˆ¬Þˆ¬Þˆ¬Þˆ¬Þˆ¬Þˆ¬Þˆ¬Þˆ¬Þˆ¬Þˆ¬ßˆ¬ßˆ¬ßˆ¬ßˆ¬ßˆ¬ßˆ¬ßˆ¬ßˆ¬ßˆ¬ßˆ¬ßˆ¬ßˆ¬ßˆ¬ßˆ¬ßˆ¬ßIn In In In In ˆ¬ßˆ¬ßˆ¬ßˆ¬ßˆ¬ßˆ¬ß'K~'K}'K}'K}'K}'K}'K}'K}'K}'K}'K}'K}'K}'K}'K}Di›Di›Dh›'K}'K}'K}'K}'K}'K}'K}'K}'K}'K}'K}'K}'K}'K}'K}'K}'K}'K}'K}'K}'K}'K}&K}ChšChšChšChšChšCgšCgšCgšCgšCgšCg™Cg™Cg™Cg™Cg™Cg™&J}&J}&J}&J}&J|&J|&J|&J|&J|Bg™Bg™Bg™Bg™Bg™Bf™Bf™EM>EMCIR;HY;HYCIRCIR)6&8&@*H0I1!\B0}_JhTKjM8q[Pt]Sw`U{cW~eYg[ƒi\…k^‡m_Ÿ…v¢†w¥ˆx¨Šyª‹z­z¯Ž{±{²{³{´{žzdŸzd zc zc¡zc¸‘y¸‘y¸‘y¸‘x¸x¸x·w·w·w·wŸw_Ÿw_žw_µŽv´Žv³v²v²w±w°Œw¯Œw®Œw­‹w«‹xªŠx¨‰x¦‰x¥ˆx£‡x¡†xž…x›ƒw—v’~vŽ|t‰ys„vrh\YcXX[TUSNRIHOUXaNS^JFE>>A')+"%(4:C(5F(5F3:B3:B-3<-3<)5G)5G)5G)5G)5G)5GE:4O:*TKLbXWcZZPIKDCJIm Im Im Im ˆ¬Þˆ¬Þˆ¬Þˆ¬Þˆ¬Þˆ¬Þˆ¬Þˆ¬Þˆ¬Þˆ¬Þˆ¬Þˆ¬ßˆ¬ßˆ¬ßˆ¬ßIn In In In In In Jn Jn Jn Jn Jn ˆ­ßˆ­ßˆ­ßˆ­ßˆ­ßˆ­ßˆ­ßˆ­ßˆ­ßˆ­ßˆ­ßˆ­ßˆ­ßˆ­ßˆ­ßˆ­ßˆ­ßˆ­ßˆ­ßˆ­ßˆ­ß‰­ß‰­ß‰­ß‰­ß‰­ßJn ‰­ß‰­ß‰­ß‰­ßˆ­ßˆ­ßˆ­ßˆ­ß'K~'K~'K~'K~'K~'K~'K~'K}'K}'K}'K}'K}'K}'K}'K}'K}'K}'K}'K}'K}'K}'K}'K}'K}'K}'K}'K}'K}'K}'K}'K}'K}'K}'K}'K}'K}'K}'K}'K}'K}'K}DhšDhšDhšChšChšChšChšChšChšCgšCgšCgšCgš&K}&K}&J}&J}&J}&J}&J}&J}&J}&J}&J|&J|&J|Cg™Cg™Cg™Bg™Bg™Bg™EMCIRCIRCIR888DGNCJRCIRBBB(0 8&<)G0M5"X@0z^K†bFŠkUlXPp[Rs^TvaVzcX}fZg\i]™u›‚v„wŸ†x¢‡y¥‰z§Šz©‹{ªŒ{•ve–ve—we˜we°|°|±{²{²{²{²{²{±z±z±Žz±Žz±Žz°Žy™vb˜vb—vb–ub•ub•uc”tc“tc’sbscrcqc¢‡y †y…y›„x˜‚x•w’w|uˆytƒvs~sqyooslmVQTOLR[\dQU`KHHAAD:<@68; &Z`i-4<%');AJ4:C4:C4:C-4<)5G)5G)5G)5G)6G)6G@84H8-N?5YPQmccoghd`dIn In In In In In ˆ¬ßˆ¬ßˆ­ßˆ­ßˆ­ßˆ­ßˆ­ßˆ­ßˆ­ßˆ­ßJn Jn Jn Jn Jn Jn Jn Jn Jn Jn Jn Jn Jn Jn Jn Jn ‰­ß‰­ß‰­ß‰­ß‰­ß‰­ß‰­ß‰­ß‰­ß‰­ß‰­ß‰­ß‰­ß‰­ß‰­ß‰­ß‰­ß‰­ß‰­ß‰­ß‰­ß‰­ß‰­ßJn Jn Jn ‰­ß‰­ß‰­ß‰­ß‰­ß‰­ß‰­ß'K~'K~'K~'K~'K~'K~'K~'K~'K~'K~'K~'K~Ei›Ei›Ei›Ei›'K}'K}'K}'K}'K}'K}'K}'K}'K}'K}'K}'K}'K}'K}'K}'K}'K}'K}'K}'K}'K}'K}'K}'K}'K}'K}DhšDhšDhšDhšDhšDhšChšChšChš&K}&K}&K}&K}&K}&K}&K}&K}&J}&J}&J}&J}&J}&J}&J}&J}&J}Cg™Cg™Cg™Cg™B9;>68;Z`iZ`iMZk)5G4:C-4<4:C4:C-4<;BJ)5G)6G)6G)6G)6G)6GC6-L;.leg„{{ypqhbeVYcJn Jn Jn Jn Jn Jn Jn ‰­ß‰­ß‰­ß‰­ß‰­ß‰­ßJn Jn Jn Jn Jn Jn Jn Jn Jn Jn Jn Jn Jn Jn Jn Jn Jn Jn Jn Jn ‰­ß‰­ß‰­ß‰­ß‰­ß‰­ß‰­à‰­à‰­à‰­à‰­à‰­à‰­à‰­à‰­à‰­à‰­à‰­à‰­àJn¡Jn¡Jn¡Jn¡Jn¡Jn¡Jn¡‰­à‰­à‰­à‰­à‰­à'L~'L~'L~'L~'L~'L~'K~'K~'K~Ei›Ei›Ei›Ei›Ei›Ei›Ei›Ei›'K~'K}'K}'K}'K}'K}'K}'K}'K}'K}'K}'K}'K}'K}'K}'K}'K}'K}'K}'K}'K}'K}'K}'K}'K}'K}DhšDhšDhšDhšDhš'K}'K}'K}'K}&K}&K}&K}&K}&K}&K}&K}&K}&K}&K}&K}&J}&J}&J}&J}&J}&J}Cg™Cg™Cg™<535=AG=?D?AD==1(B3)B2&F4'E4)gTGlXJs^OzcTzaPqfethgvjhbVTcWUdXVeYWfZXg[Yh\Zi]Zi][j^\€us€ususts~tt~tt}tt|st{stut~tt|sszrsyqrwpquoqsmpqloXTXTQWPOULLSSJEA<:=99757335./2113)+.'),)+.8:="(3@QJMPV\eT[cNZlNZlZ`iZ`iZ`iZ`iSYbY`h4;C.4=)6GCPaCPaCPaCPaCPaEQbZOGa_emhkŠƒ„nfgeaeJn¡Jn¡Jn¡Jn¡Jn¡Jn¡Š®àŠ®àŠ®àŠ®àŠ®àJo¡Jo¡Jo¡Jo¡Jo¡Jo¡Jo¡Ko¡Ko¡Ko¡Ko¡Ko¡Ko¡Ko¡Ko¡Ko¡Ko¡Ko¡Ko¡Ko¡Ko¡Ko¡Ko¡Ko¡Ko¡Ko¡Ko¡Š®àŠ®áŠ®áŠ®áŠ®áŠ®áŠ®áŠ®áKo¡Ko¡Ko¡Ko¡Ko¡Ko¡Ko¡Ko¡Ko¡Ko¡Ko¡Ko¡Ko¡Ko¡Ko¡Ko¡Ko¡Ko¡ƒ§Úƒ§Úƒ§Úƒ¨Úƒ¨Úƒ¨Úƒ¨Úƒ¨Ú„¨Ú„¨Ú„¨Ú„¨Ú„¨Ú„¨ÚEjœEiœEiœEiœEiœ'L~'L~'K~'K~'K~'K~'K~'K~'K~'K~'K~'K~'K~'K}'K}'K}'K}'K}'K}'K}Di›Di›Di›Di›Dh›Dh›'K}'K}'K}'K}'K}'K}'K}'K}'K}'K}'K}'K}'K}'K}'K}'K}'K}&K}&K}&K}&K}&K}&K}&K}&K}&K}$.>=I[=I[2)>0&A2'C3(I8-^OFbRHfUJjXMq^RwcVzfYfRDfQCdN@zdTqijrjksklrklrklrklqjmpjmpjmojmojmnimmimkhliflscYm`Xg\VbYT^VRE>;A<:>98:77645:873220/0,-/)+.*,/#%( &15;5BSKKKJMP]dlU[dNZlNZlZ`iTZcZaiZaiZ`iZ`iSZbŽ”LS[V]eDPbDPbDPbDPbDPbDPbWMF^^diei®”†…rkeaeJo¡Jo¡Jo¡Jo¡Š®àŠ®àŠ®àŠ®àŠ®àŠ®àŠ®àŠ®àŠ®àKo¡Ko¡Ko¡Ko¡Ko¡Ko¡Ko¡Ko¡Ko¡Ko¡Ko¡Ko¡Ko¡Ko¡Ko¡Ko¡Ko¡Ko¡Ko¡Ko¡Ko¡Ko¡Ko¡Ko¡Ko¡Ko¡Š¯áŠ¯áŠ¯áŠ¯áKo¡Ko¡Ko¡Ko¡Ko¡Ko¡Ko¡Ko¡Ko¡Ko¡Ko¡Ko¡Ko¡Ko¡Ko¡Ko¡Ko¡Ko¡Ko¡Ko¡Ko¡ƒ¨Úƒ¨Ú„¨Ú„¨Ú„¨Ú„¨Ú„¨Ú„¨Ú„¨Ú„¨Ú„¨Ú„¨Ú„¨Ú„¨Ú„¨Ú„¨Ú„¨Ú„¨Û„¨ÛGk'L~'L~'L~'L~'L~'L~'K~'K~'K~'K~'K~'K~'K~'K~'K~'K~Ei›Ei›Ei›Ei›Ei›Di›Di›Di›Di›Di›'K}'K}'K}'K}'K}'K}'K}'K}'K}'K}'K}'K}'K}'K}'K}'K}'K}'K}'K}'K}&K}&K}&K}&K}&K}%/> ,>=I[=I[ ,> ,>#)2(.7#)2(.7#)2#)2#)2#)2(.7(.7(.767@D>A214$+3#%("$'###""""""&&&888888cB*}\I@!%+%!5*$:/(;0)<1*>3+@4+>1(bUKN@6OA6L=3QB8M?4_RKaTLbUMcVNcVNcVObVOaVOaUO`UO_UO^UO^TO\SOYRNWPNUOMWPKYSOWRN;63953:76755333,/2'),%(+"%(!' "&,KXi04:JMP]_b^emU[dNZlNZlT[cU[dU[dU[d[aj•ž•ž•žˆŽ—–¥W]fDPbDPbDPbDPbDPbDPb‘nSž…w—|m¨‚ƒqjKo¡Ko¡Ko¡Š®àŠ®àŠ®àŠ®áŠ®áŠ®áŠ®áŠ®áŠ®áŠ¯áŠ¯áŠ¯áKo¡Ko¡Ko¡Ko¡Ko¡Ko¡Ko¡Ko¡Ko¡Ko¡Ko¡Ko¡Ko¡Ko¢Ko¢Ko¢Ko¢Ko¢Ko¢Ko¢Ko¢Ko¢Ko¢Ko¢Ko¢Ko¢Ko¢Ko¢Kp¢Kp¢Kp¢Kp¢Kp¢Kp¢Kp¢Kp¢Kp¢Kp¢Kp¢Kp¢Kp¢Kp¢Kp¢Kp¢Kp¢Kp¢Kp¢Kp¢Kp¢Kp¢„¨Ú„¨Ú„¨Ú„¨Ú„¨Ú„¨Ú„¨Ú„¨Ú„¨Ú„¨Ú„¨Ú„¨Û„¨Û„¨Û„¨Û„¨Û„©Û„©Û„©Û„©ÛGkGkGkGkGkGk'L~'L~'L~'L~'K~'K~'K~Ei›Ei›Ei›Ei›Ei›Ei›Ei›Ei›Ei›Ei›Ei›Ei›Di›Di›'K}'K}'K}'K}HlžHlžHlžHlžHlžHlžHlžHlž'K}'K}'K}'K}'K}'K}'K}'K}'K}'K}&K}*2? ->=I[=I[ ,> ,> ,>#)2#)2#)2(.7(.7#)2#)2(.7(.7(.7(.7/28:79G@A<89',4#%(#%(######""""""8888888887'vS:‹jW;) + &3#.$-% .% .& /&!,#,#@70A71XNHXNHWNHWNHZRLYQLYQLXQLWQLWPLUOLSNLQMKOLJMJJ0//.-.,,-&(+"(!' 15;6CT37=MMMKMP^ad_enY`hNZlNZlU\dV\eŠ‘™Š™Š™–Ÿ–Ÿ–ž•ž“œ—¦Œ’›ƒ¡DQbDQbDQbDQbDQbMUc¤ƒ‘ylŸ‡|€oiKo¡Š¯áŠ¯áŠ¯áŠ¯áŠ¯áŠ¯áŠ¯á‹¯á‹¯á‹¯á‹¯á‹¯á‹¯á‹¯á‹¯á‹¯áKo¢Ko¢Ko¢Ko¢Ko¢Ko¢Ko¢Kp¢Kp¢Kp¢Kp¢Kp¢Kp¢Kp¢Kp¢Kp¢Kp¢Kp¢Kp¢Kp¢Kp¢Kp¢Kp¢‹¯â‹¯â‹¯â‹¯âLp¢Lp¢Lp¢Lp¢Lp¢Lp¢Lp¢Lp¢Lp¢Lp¢Lp¢Lp¢Lp¢Lp¢Lp¢Lp¢Lp¢Lp¢Lp¢Lp¢Lp¢„¨Ú„¨Ú„¨Ú„¨Ú„¨Ú„¨Û„¨Û„¨Û„¨Û„©Û„©Û„©Û„©Û„©Û„©Û…©Û…©Û…©Û…©Û…©Û…©ÛGkžGkžGkžGkžGkžGkžGkžGkžGkž…©Û…©Ü…©Ü…©Ü…©Ü…©Ü…©Ü…ªÜ…ªÜ…ªÜ…ªÜ…ªÜ…ªÜ†ªÜ†ªÜ†ªÜ†ªÜ†ªÜHlžHlžHlžHlžHlžHlžHlžHlžHlžHlžHlžHlžHlž'K}'K}'K}'K}'K}'K}'K}'K}'K}HO\=J[=J[=J[ -> ,> ,>(.7#)2#)2(.7(.7(.7#)2(.7(.7(/7(/7)/8/28114H7,99@.05&,5$&)$$$######"""(((8888888888888884"nO9„gXˆjZE/ (-" + %' %$#" ! !$ 48>7CU:GX JJJLLLKMPagp_enNZlLPV˜Ÿ§Œ’›Œ’›Œ’›‹’š‹‘šŠ‘™‘— –Ÿ–Ÿ–Ÿ“œ“œ—¦„¢„¢DQbDQbDQbDQbNVc…uo‡rjѼ³º«§‹¯á‹¯á‹¯á‹¯á‹¯á‹¯á‹¯á‹¯á‹¯á‹¯á‹¯á‹¯á‹¯á‹¯á‹¯á‹¯á‹¯á‹¯áKp¢Kp¢Kp¢Kp¢Kp¢Lp¢Lp¢Lp¢Lp¢Lp¢Lp¢Lp¢Lp¢Lp¢Lp¢Lp¢Lp¢Lp¢Lp¢Lp¢‹°â‹°â‹°â‹°âŒ°âŒ°âŒ°âLp¢Lp¢Lp¢Lp¢Lp¢Lp¢Lp¢Lp¢Lp¢Lp¢Lp¢Lp¢Lp¢Lp¢Lp¢Lp¢Lp¢Lp¢Lp¢Lp¢„¨Û„¨Û„¨Û„©Û„©Û„©Û„©Û„©Û„©Û…©Û…©Û…©Û…©Û…©Û…©Û…©Û…©Û…©Û…©Û…©Û…©ÛGkžGkžGkžGlžGlžGlž…©Ü…©Ü…©Ü…ªÜ…ªÜ…ªÜ…ªÜ…ªÜ…ªÜ†ªÜ†ªÜ†ªÜ†ªÜ†ªÜ†ªÜ†ªÜ†ªÜ†ªÜ†ªÜ†ªÜ†ªÜHlžHlžHlžHlžHlžHlžHlžHlžHlžHlžHlžHlžHlžHlžHlž'K}'K}'K}'K}DhšDhšDhšIP\=J[=J[=J[=J[ -> ->(.7#)2#)2(.7(.7(.7#)2(.7(/7(/7)/8)/8)/803966:E?AC>A856,07%'*%')$$$######(((DDDBBB8888888880 cF1w]OcS{`QS;+57'   *      ;?E7CU;HY=I[ JJJMMMKMPacfbhq‘— ƒ¡ƒ¡‘— “œ“œ“œŒ“›Œ’›Œ’›‹‘š‘— ‘— —Ÿ™Ÿ¨”œ“œ“œ„‘¢„‘¢„‘¢„‘¢EQcHScNVd´¨§¿®¨Èµ®¯‘‹¯á‹¯á‹¯á‹¯á‹¯á‹¯á‹¯á‹¯â‹¯â‹¯â‹¯â‹¯â‹¯â‹°â‹°â‹°â‹°â‹°â‹°â‹°âLp¢Lp¢Lp¢Lp¢Lp¢Lp¢Lp¢Lp¢Lp¢Lp¢Lp¢Lp¢Lp¢Lp¢Lp¢Lp¢Œ°âŒ°âŒ°âŒ°âŒ°âŒ°âŒ°âŒ°âŒ°âŒ°âŒ°âLp¢Lp¢Lp¢Lp¢Lp¢Lp¢Lp¢Lp£Lp£Lp£Lp£Lp£Lp£Lp£Lp£Lp£Lp£Lp£„©Û„©Û„©Û…©Û…©Û…©Û…©Û…©Û…©Û…©Û…©Û…©Û…©Û…©Û…©Û…©Û…©Û…©Û…©Û…©Ü…©Ü…©ÜGlžGlž…ªÜ…ªÜ…ªÜ…ªÜ…ªÜ…ªÜ†ªÜ†ªÜ†ªÜ†ªÜ†ªÜ†ªÜ†ªÜ†ªÜ†ªÜ†ªÜ†ªÜ†ªÜ†ªÜ†ªÜ†ªÜ†ªÜ†ªÜ†ªÜ†ªÝHlžHlžHlžHlžHlžHlžHlžHlžHlžHlžHlžHlžHlžHlžHlž‡«Ý‡«ÝDhšDhšDhšDhš=J[=J[=J[=J[=J[=J[ ->(/7#)2#)2(.7(.7(.7#*2(/7)/8)/8)/8)/8)08*0903:56:88@KBB=;@348*08&(+'(*%%%$$$(((EEE(((&&&">-"bF3oXMs[Ow]Py^PqbpXMdH5R<,Q;, &%%#'-"'-&3DS_qP\nR_p>J\?K]AG@B::@66:-29'),)'%BBBFFFEEE)))))))))&&& @@@FFFACFZ\_[ajagp„¢„¢„¢ž¥­Ÿ¦®—¦–¥–ž•žŽ•Ž””œ“œ‘— —Ÿ›¡ªš ©™ ¨Ž•ޔޔ…‘£…‘£…‘£EQcGRcKTdPWd­¥§¿¯ª‹°âŒ°âŒ°âŒ°âŒ°âŒ°âŒ°âŒ°âŒ°âŒ°âŒ°âŒ°âŒ°âŒ°âŒ°âŒ°âŒ°âŒ°âŒ°âŒ°âŒ°ãŒ°ãŒ°ãŒ°ãŒ°ãLp£Lp£Lq£Lq£Lq£Lq£Lq£Lq£Lq£Œ±ãŒ±ãŒ±ãŒ±ãŒ±ãŒ±ã±ã±ã±ã±ã±ã±ã±ã±ã±ã±ã±ã±ãMq£Mq£Mq£Mq£Mq£Mq£Mq£Mq£Mq£Mq£Mq£Mq£Mq£Mq£Mq£…©Û…©Û…©Û…©Û…©Û…©Û…©Ü…©Ü…©Ü…©Ü…©Ü…ªÜ…ªÜ…ªÜ…ªÜ…ªÜ…ªÜ†ªÜHlžHlžHlžHlžHlž†ªÜ†ªÜ†ªÜ†ªÜ†ªÜ†ªÜ†ªÜ†ªÜ†ªÜ†ªÜ†ªÜ†ªÝ†ªÝ†ªÝ†ªÝ†ªÝ†«Ý†«Ý†«Ý†«Ý†«Ý†«Ý†«Ý‡«Ý‡«Ý‡«Ý‡«Ý‡«ÝHlžHlžHlŸHlŸHlŸHlŸHlŸ‡«Ý‡«Ý‡«Ý‡«Ý‡«Ý‡«Ý‡«Ý‡«Ý‡«Þ‡«Þ‡«Þ‡«ÞŸ>J\>J\=J[=J[=J[=J[FLU39B#*2(/7)/7)/8$*3$*3$*3)/8)08*09*09*19',5(-5*.6.17338@<=G@BH@BXW]UUXLPWFHKDFHKKKHHH+++%%%%%%$$$###!!!!!!777777777777777777777AAAFFFACFACF\^aeltbhqDQbDQbDQbŸ¥®¡§°¡§°¡§°¡§°—¦–Ÿ”š£”š£“™¢’™¡’˜¡‘˜ ‘— ›¡ª›¡ªš ©•ž™Ÿ¨Ž”ERcERcERcERcHScLUdRXd|njŒ°âŒ°âŒ°âŒ°âŒ°âŒ°âŒ°âŒ°âŒ°âŒ°âŒ°ãŒ°ãŒ°ãŒ°ãŒ°ãŒ±ãŒ±ãŒ±ãŒ±ãŒ±ãŒ±ãŒ±ãŒ±ã±ã±ã±ã±ãMq£Mq£Mq£Mq£Mq£Mq£±ã±ã±ã±ã±ã±ã±ã±ã±ã±ã±ã±ã±ã±ã±ã±ã±ã±ã±ã±ã±ã±ãMq£Mq£Mq£Mq£Mq£Mq£Mq£Mq£Mq£Mq£Mq£Mq£Mq£…©Ü…©Ü…©Ü…©Ü…©Ü…ªÜ…ªÜ…ªÜ…ªÜ…ªÜ…ªÜ†ªÜ†ªÜ†ªÜ†ªÜHlžHlžHlžHlžHlžHlžHlžHlžHlž†ªÜ†ªÜ†ªÜ†ªÝ†ªÝ†ªÝ†ªÝ†ªÝ†ªÝ†«Ý†«Ý†«Ý†«Ý†«Ý†«Ý‡«Ý‡«Ý‡«Ý‡«Ý‡«Ý‡«Ý‡«Ý‡«Ý‡«Ý‡«Ý‡«Ý‡«ÝHlŸHlŸHlŸHlŸHlŸ‡«Ý‡«Ý‡«Ý‡«Þ‡«Þ‡«Þ‡«Þ‡«Þ‡¬Þ‡¬Þ‡¬Þ‡¬Þ‡¬Þ‡¬ÞŽŸŽŸŽŸŽŸ>J\=J[=J[FLUFLU(/7(/7*08*08%+3$*3$+3$+3*09*09*19&,5&,5'-6).6*/7-18NPURRVXUVc]^f^_[X]\XYTUZLQYKMPFHJ)))(((&&&%%%%%%$$$$$$###!!!!!!!!!777777777BBBEEEACGADGFIL\ckZ`iTZcDQbDQbDQbagpbiqcircir¢©±¢¨±¡¨°¡§°•œ¤•›¤”›£”𣓙¢’™¡’˜¡œ¢«œ¢«›¡ªš¡©•žY`hY_hERcERcERcGSdJTdNVdTYeLp¢Lp¢Œ°ãŒ°ãŒ°ãŒ°ãŒ±ãŒ±ãŒ±ãŒ±ãŒ±ãŒ±ãŒ±ã±ã±ã±ã±ã±ã±ã±ã±ã±ã±ã±ã±ã±ã±ã±ã±ã±ãMq£Mq£±ã±ã±ã±ä±ä±ä±ä±ä±ä±ä±ä±ä±ä²ä²ä²ä²ä²ä²ä²ä²ä²ä²ä²ä²ä²äMq¤Mq¤Mq¤Mq¤Mq¤Mq¤Mq¤Mq¤Mq¤Mq¤Mq¤…ªÜ…ªÜ…ªÜ…ªÜ†ªÜ†ªÜ†ªÜ†ªÜ†ªÜ†ªÜ†ªÜ†ªÜHlžHlžHlžHlžHlžHlžHlžHlžHlžHlžHlžHlž†ªÝ†ªÝ†«Ý†«Ý†«Ý†«Ý†«Ý†«Ý†«Ý‡«Ý‡«Ý‡«Ý‡«Ý‡«Ý‡«Ý‡«Ý‡«Ý‡«Ý‡«Ý‡«Ý‡«Ý‡«Ý‡«Ý‡«Ý‡«Ý‡«Ý‡«Ý‡«ÝHmŸ‡«Þ‡«Þ‡«Þ‡«Þ‡¬Þ‡¬Þ‡¬Þ‡¬Þ‡¬Þ‡¬Þ‡¬Þ‡¬Þˆ¬Þˆ¬Þˆ¬Þˆ¬Þˆ¬ÞŽŸŽŸŽŸŽŸŽŸŽŸŽŸFLUFLUFLU)/8+08+08&+3&+3%+4%+4%+4*19+1:&,5'-5'-6(.6FLTHMTINUKOVOQWSTXYWX`[^lbac]_f_\a_aY\aRX_,.1*,.*+-***((('''&&&%%%%%%$$$$$$$$$###!!!!!!!!!!!!!!!%%%%%%%%%%%%"""""""""KKKJJJFFFGIL]_b^dm\bkV]eDQbEQcEQcEQccirdjsdksektdjsdjscir£©²¢¨±¢¨±–œ¥•œ¤•›¤”›£”𣓙¢’™¡£¬œ¢«›¢ª[ajZ`iOU^ERcERcFRdFRdITdLUdPWeVZeLp£Lq£Lq£Lq£±ã±ã±ã±ã±ã±ã±ã±ã±ã±ã±ã±ã±ã±ã±ã±ã±ã±ä±ä±ä±ä±ä±ä²ä²ä²äMq£²ä²ä²ä²ä²ä²äŽ²äŽ²äŽ²äŽ²äŽ²äŽ²äŽ²äŽ²äŽ²äŽ²äŽ²äŽ²äŽ²äŽ²äŽ²äŽ²äŽ²äŽ²äŽ²äŽ²äŽ²äŽ²äMr¤Mr¤Mr¤Mr¤Mr¤Mr¤Mr¤Mr¤Mr¤Mr¤†ªÜ†ªÜ†ªÜ†ªÜ†ªÜ†ªÜ†ªÜ†ªÜ†ªÜHlžHlžHlžHlžHlžHlžHlžHlžHlžHlžHlžHlžHlžHlžHlžHlž†«Ý‡«Ý‡«Ý‡«Ý‡«Ý‡«Ý‡«Ý‡«Ý‡«Ý‡«Ý‡«Ý‡«Ý‡«Ý‡«Ý‡«Ý‡«Ý‡«Ý‡«Ý‡«Ý‡«Ý‡«Þ‡«Þ‡«Þ‡«Þ‡«ÞHmŸHmŸHmŸ‡¬Þ‡¬Þ‡¬Þ‡¬Þ‡¬Þˆ¬Þˆ¬Þˆ¬Þˆ¬Þˆ¬Þˆ¬Þˆ¬Þˆ¬Þˆ¬Þˆ¬Þˆ¬Þˆ¬ÞŽŸŽŸŽŸŽŸ‚Ž ‚Ž ‚Ž ‚Ž ”›£Š™ŠŽ•-18,18',3',4',4&,4%,4+1:,2:'-5DJSEKSEKTFLTFLUHMUINVKOWLPWQSYTUZWWZpjje^`offb\_h`]eaaCCG8;A27?-/2+-/.+)******)))((('''&&&&&&%%%%%%$$$$$$$$$$$$$$$$$$######???EEEEEEEEE((((((###&&&%%%HJMHJMHJMHJM_en]dlZ`i_enEQcEQcEQcEQcbhqektflufluflufluektektdksdjscjr£©²¢©±¢¨±–œ¥•œ¤•›¤”›£”𣓙¢£¬\ckQW`[ajZaiOU^FRdFRdFRdHSdKUdNVeRXeX\fLq£Mq£Mq£Mq£Mq£±ã±ã±ã±ã±ã±ä±ä±ä±ä±ä²ä²ä²ä²ä²ä²ä²ä²äŽ²äŽ²äŽ²äŽ²äŽ²äMr¤Mr¤Mr¤Mr¤Mr¤Ž²äŽ²äŽ²äŽ²äŽ²äŽ²äŽ²äŽ²äŽ²äŽ²äŽ²äŽ²äŽ²äŽ²äŽ²äŽ²äŽ²äŽ²äŽ²äŽ²åŽ²åŽ²åŽ²åŽ²åŽ²åŽ²åŽ²åŽ²åNr¤Nr¤Nr¤Nr¤Nr¤Nr¤Nr¤Nr¤†ªÜ†ªÜ†ªÜ†ªÜ†ªÜ†ªÜHlžHlžHlžHlžHlžHlžHlžHlžHlžHlžHlžHlžHlžHlžHlžHlžHlžHlžHlžHlž‡«Ý‡«Ý‡«Ý‡«Ý‡«Ý‡«Ý‡«Ý‡«Ý‡«Ý‡«Ý‡«Ý‡«Ý‡«Þ‡«Þ‡«Þ‡«Þ‡«Þ‡«Þ‡¬Þ‡¬Þ‡¬ÞHmŸHmŸHmŸHmŸImŸImŸImŸˆ¬Þˆ¬Þˆ¬Þˆ¬Þˆ¬Þˆ¬Þˆ¬Þˆ¬Þˆ¬Þˆ¬Þˆ¬Þˆ¬Þˆ¬Þˆ¬Þˆ¬Þˆ¬Þ‚Ž ‚Ž ‚Ž ‚Ž ‚Ž ‚Ž ‚Ž ‚Ž ”›£Š‘™‹•‹•PT[KOVJOV(-4(-4'-5'-5JOXEKSEKSEKTFLTFLTGMUGMUHNVIOWKPWLQXMRYPTZTV[\]a_^asljd^azporjkE@CLEBIEFEDG29A28A17@135,.1+-0+,/./1..0'),)))++++++++++++***FFFFFFACFACFEEEACFACFŠŒJLOJLOKQZ_en]clY_hU[dEQcEQcEQcEQcEQcagp[aj\bk\bkgnvgnvgmvgmvfluflueltektdksdjscjrcir¢©±—¦–œ¥•œ¤•›¤TZcSYbRYaRXaQW`[bj[ajZ`iFSdFSdGSdJTdLVePXeTZfZ]fMq£Mq£Mq£Mq£Mq£Mq£Mq£²ä²ä²ä²ä²äŽ²äŽ²äŽ²äŽ²äŽ²äŽ²äŽ²äŽ²äŽ²äŽ²äŽ²äŽ²äŽ²äŽ²äNr¤Nr¤Nr¤Nr¤Nr¤Nr¤Nr¤Nr¤Nr¤Ž²åŽ²åŽ²åŽ²åŽ³åŽ³åŽ³åŽ³åŽ³åŽ³åŽ³åŽ³åŽ³åŽ³åŽ³åŽ³åŽ³åŽ³åŽ³åŽ³å³å³å³å³å³å³å³åNr¤Nr¤Nr¤Nr¤Nr¤³å³å†ªÜ†ªÜ†ªÝHlžHlžHlžHlžHlžHlžHlžHlžHlžHlžHlžHlžHlžHlžHlžHlžHlžHlŸHlŸHlŸHlŸHlŸHlŸ‡«Ý‡«Ý‡«Ý‡«Ý‡«Ý‡«Þ‡«Þ‡«Þ‡«Þ‡«Þ‡«Þ‡¬Þ‡¬Þ‡¬Þ‡¬Þ‡¬Þ‡¬Þ‡¬ÞImŸImŸImŸImŸImŸImŸImŸImŸImŸImŸˆ¬Þˆ¬Þˆ¬Þˆ¬Þˆ¬Þˆ¬Þˆ¬Þˆ¬Þˆ¬Þˆ¬ßˆ¬ßˆ¬ßˆ¬ßˆ¬ßˆ¬ßˆ­ß‚Ž ‚Ž ‚Ž ‚Ž ‚ ‚ ‚ ‚ ‚ …Œ”’•šŒ•‘”›LPVLPWKPW‹—‹—‹˜•‹‘™FLTFLTFLUGMUGMUHMVHNVINWIOWKPXLQYMRYNSZTX`X[a[]b]^c__ccacib`JDGi__aYYPJLD@C=;AKEDTQR@?A>>A;/5>.4=-4 1} { + set blue DeepSkyBlue3 + set red red + set bisque bisque3 + set green SeaGreen3 +} else { + set blue black + set red black + set bisque black + set green black +} + +# Set up demos within each of the areas of the grid. + +$c create text 5c .2c -text Lines -anchor n +$c create line 1c 1c 3c 1c 1c 4c 3c 4c -width 2m -fill $blue \ + -cap butt -join miter -tags item +$c create line 4.67c 1c 4.67c 4c -arrow last -tags item +$c create line 6.33c 1c 6.33c 4c -arrow both -tags item +$c create line 5c 6c 9c 6c 9c 1c 8c 1c 8c 4.8c 8.8c 4.8c 8.8c 1.2c \ + 8.2c 1.2c 8.2c 4.6c 8.6c 4.6c 8.6c 1.4c 8.4c 1.4c 8.4c 4.4c \ + -width 3 -fill $red -tags item +# Main widget program sets variable tk_demoDirectory +$c create line 1c 5c 7c 5c 7c 7c 9c 7c -width .5c \ + -stipple @[file join $tk_demoDirectory images gray25.xbm] \ + -arrow both -arrowshape {15 15 7} -tags item +$c create line 1c 7c 1.75c 5.8c 2.5c 7c 3.25c 5.8c 4c 7c -width .5c \ + -cap round -join round -tags item + +$c create text 15c .2c -text "Curves (smoothed lines)" -anchor n +$c create line 11c 4c 11.5c 1c 13.5c 1c 14c 4c -smooth on \ + -fill $blue -tags item +$c create line 15.5c 1c 19.5c 1.5c 15.5c 4.5c 19.5c 4c -smooth on \ + -arrow both -width 3 -tags item +$c create line 12c 6c 13.5c 4.5c 16.5c 7.5c 18c 6c \ + 16.5c 4.5c 13.5c 7.5c 12c 6c -smooth on -width 3m -cap round \ + -stipple @[file join $tk_demoDirectory images gray25.xbm] \ + -fill $red -tags item + +$c create text 25c .2c -text Polygons -anchor n +$c create polygon 21c 1.0c 22.5c 1.75c 24c 1.0c 23.25c 2.5c \ + 24c 4.0c 22.5c 3.25c 21c 4.0c 21.75c 2.5c -fill $green \ + -outline black -width 4 -tags item +$c create polygon 25c 4c 25c 4c 25c 1c 26c 1c 27c 4c 28c 1c \ + 29c 1c 29c 4c 29c 4c -fill $red -smooth on -tags item +$c create polygon 22c 4.5c 25c 4.5c 25c 6.75c 28c 6.75c \ + 28c 5.25c 24c 5.25c 24c 6.0c 26c 6c 26c 7.5c 22c 7.5c \ + -stipple @[file join $tk_demoDirectory images gray25.xbm] \ + -outline black -tags item + +$c create text 5c 8.2c -text Rectangles -anchor n +$c create rectangle 1c 9.5c 4c 12.5c -outline $red -width 3m -tags item +$c create rectangle 0.5c 13.5c 4.5c 15.5c -fill $green -tags item +$c create rectangle 6c 10c 9c 15c -outline {} \ + -stipple @[file join $tk_demoDirectory images gray25.xbm] \ + -fill $blue -tags item + +$c create text 15c 8.2c -text Ovals -anchor n +$c create oval 11c 9.5c 14c 12.5c -outline $red -width 3m -tags item +$c create oval 10.5c 13.5c 14.5c 15.5c -fill $green -tags item +$c create oval 16c 10c 19c 15c -outline {} \ + -stipple @[file join $tk_demoDirectory images gray25.xbm] \ + -fill $blue -tags item + +$c create text 25c 8.2c -text Text -anchor n +$c create rectangle 22.4c 8.9c 22.6c 9.1c +$c create text 22.5c 9c -anchor n -font $font1 -width 4c \ + -text "A short string of text, word-wrapped, justified left, and anchored north (at the top). The rectangles show the anchor points for each piece of text." -tags item +$c create rectangle 25.4c 10.9c 25.6c 11.1c +$c create text 25.5c 11c -anchor w -font $font1 -fill $blue \ + -text "Several lines,\n each centered\nindividually,\nand all anchored\nat the left edge." \ + -justify center -tags item +$c create rectangle 24.9c 13.9c 25.1c 14.1c +$c create text 25c 14c -font $font2 -anchor c -fill $red -angle 15 \ + -text "Angled characters" -tags item + +$c create text 5c 16.2c -text Arcs -anchor n +$c create arc 0.5c 17c 7c 20c -fill $green -outline black \ + -start 45 -extent 270 -style pieslice -tags item +$c create arc 6.5c 17c 9.5c 20c -width 4m -style arc \ + -outline $blue -start -135 -extent 270 -tags item \ + -outlinestipple @[file join $tk_demoDirectory images gray25.xbm] +$c create arc 0.5c 20c 9.5c 24c -width 4m -style pieslice \ + -fill {} -outline $red -start 225 -extent -90 -tags item +$c create arc 5.5c 20.5c 9.5c 23.5c -width 4m -style chord \ + -fill $blue -outline {} -start 45 -extent 270 -tags item + +image create photo items.ousterhout \ + -file [file join $tk_demoDirectory images ouster.png] +image create photo items.ousterhout.active -format "png -alpha 0.5" \ + -file [file join $tk_demoDirectory images ouster.png] +$c create text 15c 16.2c -text "Bitmaps and Images" -anchor n +$c create image 13c 20c -tags item -image items.ousterhout \ + -activeimage items.ousterhout.active +$c create bitmap 17c 18.5c -tags item \ + -bitmap @[file join $tk_demoDirectory images noletter.xbm] +$c create bitmap 17c 21.5c -tags item \ + -bitmap @[file join $tk_demoDirectory images letters.xbm] + +$c create text 25c 16.2c -text Windows -anchor n +button $c.button -text "Press Me" -command "butPress $c $red" +$c create window 21c 18c -window $c.button -anchor nw -tags item +entry $c.entry -width 20 -relief sunken +$c.entry insert end "Edit this text" +$c create window 21c 21c -window $c.entry -anchor nw -tags item +scale $c.scale -from 0 -to 100 -length 6c -sliderlength .4c \ + -width .5c -tickinterval 0 +$c create window 28.5c 17.5c -window $c.scale -anchor n -tags item +$c create text 21c 17.9c -text Button: -anchor sw +$c create text 21c 20.9c -text Entry: -anchor sw +$c create text 28.5c 17.4c -text Scale: -anchor s + +# Set up event bindings for canvas: + +$c bind item "itemEnter $c" +$c bind item "itemLeave $c" +bind $c <2> "$c scan mark %x %y" +bind $c "$c scan dragto %x %y" +bind $c <3> "itemMark $c %x %y" +bind $c "itemStroke $c %x %y" +bind $c <> "itemsUnderArea $c" +bind $c <1> "itemStartDrag $c %x %y" +bind $c "itemDrag $c %x %y" + +# Utility procedures for highlighting the item under the pointer: + +proc itemEnter {c} { + global restoreCmd + + if {[winfo depth $c] == 1} { + set restoreCmd {} + return + } + set type [$c type current] + if {$type == "window" || $type == "image"} { + set restoreCmd {} + return + } elseif {$type == "bitmap"} { + set bg [lindex [$c itemconf current -background] 4] + set restoreCmd [list $c itemconfig current -background $bg] + $c itemconfig current -background SteelBlue2 + return + } elseif {$type == "image"} { + set restoreCmd [list $c itemconfig current -state normal] + $c itemconfig current -state active + return + } + set fill [lindex [$c itemconfig current -fill] 4] + if {(($type == "rectangle") || ($type == "oval") || ($type == "arc")) + && ($fill == "")} { + set outline [lindex [$c itemconfig current -outline] 4] + set restoreCmd "$c itemconfig current -outline $outline" + $c itemconfig current -outline SteelBlue2 + } else { + set restoreCmd "$c itemconfig current -fill $fill" + $c itemconfig current -fill SteelBlue2 + } +} + +proc itemLeave {c} { + global restoreCmd + + eval $restoreCmd +} + +# Utility procedures for stroking out a rectangle and printing what's +# underneath the rectangle's area. + +proc itemMark {c x y} { + global areaX1 areaY1 + set areaX1 [$c canvasx $x] + set areaY1 [$c canvasy $y] + $c delete area +} + +proc itemStroke {c x y} { + global areaX1 areaY1 areaX2 areaY2 + set x [$c canvasx $x] + set y [$c canvasy $y] + if {($areaX1 != $x) && ($areaY1 != $y)} { + $c delete area + $c addtag area withtag [$c create rect $areaX1 $areaY1 $x $y \ + -outline black] + set areaX2 $x + set areaY2 $y + } +} + +proc itemsUnderArea {c} { + global areaX1 areaY1 areaX2 areaY2 + set area [$c find withtag area] + set items "" + foreach i [$c find enclosed $areaX1 $areaY1 $areaX2 $areaY2] { + if {[lsearch [$c gettags $i] item] != -1} { + lappend items $i + } + } + puts stdout "Items enclosed by area: $items" + set items "" + foreach i [$c find overlapping $areaX1 $areaY1 $areaX2 $areaY2] { + if {[lsearch [$c gettags $i] item] != -1} { + lappend items $i + } + } + puts stdout "Items overlapping area: $items" +} + +set areaX1 0 +set areaY1 0 +set areaX2 0 +set areaY2 0 + +# Utility procedures to support dragging of items. + +proc itemStartDrag {c x y} { + global lastX lastY + set lastX [$c canvasx $x] + set lastY [$c canvasy $y] +} + +proc itemDrag {c x y} { + global lastX lastY + set x [$c canvasx $x] + set y [$c canvasy $y] + $c move current [expr {$x-$lastX}] [expr {$y-$lastY}] + set lastX $x + set lastY $y +} + +# Procedure that's invoked when the button embedded in the canvas +# is invoked. + +proc butPress {w color} { + set i [$w create text 25c 18.1c -text "Oooohhh!!" -fill $color -anchor n] + after 500 "$w delete $i" +} diff --git a/env/tcl/tk8.6/demos/ixset b/env/tcl/tk8.6/demos/ixset new file mode 100644 index 0000000..13235de --- /dev/null +++ b/env/tcl/tk8.6/demos/ixset @@ -0,0 +1,328 @@ +#!/bin/sh +# the next line restarts using wish \ +exec wish "$0" ${1+"$@"} + +# ixset -- +# A nice interface to "xset" to change X server settings +# +# History : +# 91/11/23 : pda@masi.ibp.fr, jt@ratp.fr : design +# 92/08/01 : pda@masi.ibp.fr : cleaning + +package require Tk + +# +# Button actions +# + +proc quit {} { + destroy . +} + +proc ok {} { + writesettings + quit +} + +proc cancel {} { + readsettings + dispsettings + .buttons.apply configure -state disabled + .buttons.cancel configure -state disabled +} + +proc apply {} { + writesettings + .buttons.apply configure -state disabled + .buttons.cancel configure -state disabled +} + +# +# Read current settings +# + +proc readsettings {} { + global kbdrep ; set kbdrep "on" + global kbdcli ; set kbdcli 0 + global bellvol ; set bellvol 100 + global bellpit ; set bellpit 440 + global belldur ; set belldur 100 + global mouseacc ; set mouseacc "3/1" + global mousethr ; set mousethr 4 + global screenbla ; set screenbla "blank" + global screentim ; set screentim 600 + global screencyc ; set screencyc 600 + + set xfd [open "|xset q" r] + while {[gets $xfd line] > -1} { + switch -- [lindex $line 0] { + auto { + set rpt [lindex $line 1] + if {$rpt eq "repeat:"} { + set kbdrep [lindex $line 2] + set kbdcli [lindex $line 6] + } + } + bell { + set bellvol [lindex $line 2] + set bellpit [lindex $line 5] + set belldur [lindex $line 8] + } + acceleration: { + set mouseacc [lindex $line 1] + set mousethr [lindex $line 3] + } + prefer { + set bla [lindex $line 2] + set screenbla [expr {$bla eq "yes" ? "blank" : "noblank"}] + } + timeout: { + set screentim [lindex $line 1] + set screencyc [lindex $line 3] + } + } + } + close $xfd + + # puts stdout [format "Key REPEAT = %s\n" $kbdrep] + # puts stdout [format "Key CLICK = %s\n" $kbdcli] + # puts stdout [format "Bell VOLUME = %s\n" $bellvol] + # puts stdout [format "Bell PITCH = %s\n" $bellpit] + # puts stdout [format "Bell DURATION = %s\n" $belldur] + # puts stdout [format "Mouse ACCELERATION = %s\n" $mouseacc] + # puts stdout [format "Mouse THRESHOLD = %s\n" $mousethr] + # puts stdout [format "Screen BLANCK = %s\n" $screenbla] + # puts stdout [format "Screen TIMEOUT = %s\n" $screentim] + # puts stdout [format "Screen CYCLE = %s\n" $screencyc] +} + + +# +# Write settings into the X server +# + +proc writesettings {} { + global kbdrep kbdcli bellvol bellpit belldur + global mouseacc mousethr screenbla screentim screencyc + + set bellvol [.bell.vol get] + set bellpit [.bell.val.pit.entry get] + set belldur [.bell.val.dur.entry get] + + if {$kbdrep eq "on"} { + set kbdcli [.kbd.val.cli get] + } else { + set kbdcli "off" + } + + set mouseacc [.mouse.hor.acc.entry get] + set mousethr [.mouse.hor.thr.entry get] + + set screentim [.screen.tim.entry get] + set screencyc [.screen.cyc.entry get] + + exec xset \ + b $bellvol $bellpit $belldur \ + c $kbdcli \ + r $kbdrep \ + m $mouseacc $mousethr \ + s $screentim $screencyc \ + s $screenbla +} + + +# +# Sends all settings to the window +# + +proc dispsettings {} { + global kbdrep kbdcli bellvol bellpit belldur + global mouseacc mousethr screenbla screentim screencyc + + .bell.vol set $bellvol + .bell.val.pit.entry delete 0 end + .bell.val.pit.entry insert 0 $bellpit + .bell.val.dur.entry delete 0 end + .bell.val.dur.entry insert 0 $belldur + + .kbd.val.onoff [expr {$kbdrep eq "on" ? "select" : "deselect"}] + .kbd.val.cli set $kbdcli + + .mouse.hor.acc.entry delete 0 end + .mouse.hor.acc.entry insert 0 $mouseacc + .mouse.hor.thr.entry delete 0 end + .mouse.hor.thr.entry insert 0 $mousethr + + .screen.blank [expr {$screenbla eq "blank" ? "select" : "deselect"}] + .screen.pat [expr {$screenbla ne "blank" ? "select" : "deselect"}] + .screen.tim.entry delete 0 end + .screen.tim.entry insert 0 $screentim + .screen.cyc.entry delete 0 end + .screen.cyc.entry insert 0 $screencyc +} + + +# +# Create all windows, and pack them +# + +proc labelentry {path text length {range {}}} { + frame $path + label $path.label -text $text + if {[llength $range]} { + spinbox $path.entry -width $length -relief sunken \ + -from [lindex $range 0] -to [lindex $range 1] + } else { + entry $path.entry -width $length -relief sunken + } + pack $path.label -side left + pack $path.entry -side right -expand y -fill x +} + +proc createwindows {} { + # + # Buttons + # + + frame .buttons + button .buttons.ok -default active -command ok -text "Ok" + button .buttons.apply -default normal -command apply -text "Apply" \ + -state disabled + button .buttons.cancel -default normal -command cancel -text "Cancel" \ + -state disabled + button .buttons.quit -default normal -command quit -text "Quit" + + pack .buttons.ok .buttons.apply .buttons.cancel .buttons.quit \ + -side left -expand yes -pady 5 + + bind . {.buttons.ok flash; .buttons.ok invoke} + bind . {.buttons.quit flash; .buttons.quit invoke} + bind . <1> { + if {![string match .buttons* %W]} { + .buttons.apply configure -state normal + .buttons.cancel configure -state normal + } + } + bind . { + if {![string match .buttons* %W]} { + switch -glob %K { + Return - Escape - Tab - *Shift* {} + default { + .buttons.apply configure -state normal + .buttons.cancel configure -state normal + } + } + } + } + + # + # Bell settings + # + + labelframe .bell -text "Bell Settings" -padx 1.5m -pady 1.5m + scale .bell.vol \ + -from 0 -to 100 -length 200 -tickinterval 20 \ + -label "Volume (%)" -orient horizontal + + frame .bell.val + labelentry .bell.val.pit "Pitch (Hz)" 6 {25 20000} + labelentry .bell.val.dur "Duration (ms)" 6 {1 10000} + pack .bell.val.pit -side left -padx 5 + pack .bell.val.dur -side right -padx 5 + pack .bell.vol .bell.val -side top -expand yes + + # + # Keyboard settings + # + + labelframe .kbd -text "Keyboard Repeat Settings" -padx 1.5m -pady 1.5m + + frame .kbd.val + checkbutton .kbd.val.onoff \ + -text "On" \ + -onvalue "on" -offvalue "off" -variable kbdrep \ + -relief flat + scale .kbd.val.cli \ + -from 0 -to 100 -length 200 -tickinterval 20 \ + -label "Click Volume (%)" -orient horizontal + pack .kbd.val.onoff -side left -fill x -expand yes -padx {0 1m} + pack .kbd.val.cli -side left -expand yes -fill x -padx {1m 0} + + pack .kbd.val -side top -expand yes -pady 2 -fill x + + # + # Mouse settings + # + + labelframe .mouse -text "Mouse Settings" -padx 1.5m -pady 1.5m + + frame .mouse.hor + labelentry .mouse.hor.acc "Acceleration" 5 + labelentry .mouse.hor.thr "Threshold (pixels)" 3 {1 2000} + + pack .mouse.hor.acc -side left -padx {0 1m} + pack .mouse.hor.thr -side right -padx {1m 0} + + pack .mouse.hor -side top -expand yes + + # + # Screen Saver settings + # + + labelframe .screen -text "Screen-saver Settings" -padx 1.5m -pady 1.5m + + radiobutton .screen.blank \ + -variable screenblank -text "Blank" -relief flat \ + -value "blank" -variable screenbla -anchor w + radiobutton .screen.pat \ + -variable screenblank -text "Pattern" -relief flat \ + -value "noblank" -variable screenbla -anchor w + labelentry .screen.tim "Timeout (s)" 5 {1 100000} + labelentry .screen.cyc "Cycle (s)" 5 {1 100000} + + grid .screen.blank .screen.tim -sticky e + grid .screen.pat .screen.cyc -sticky e + grid configure .screen.blank .screen.pat -sticky ew + + # + # Main window + # + + pack .buttons -side top -fill both + pack .bell .kbd .mouse .screen -side top -fill both -expand yes \ + -padx 1m -pady 1m + + # + # Let the user resize our window + # + wm minsize . 10 10 +} + +############################################################################## +# Main program + +# +# Listen what "xset" tells us... +# + +readsettings + +# +# Create all windows +# + +createwindows + +# +# Write xset parameters +# + +dispsettings + +# +# Now, wait for user actions... +# + +# Local Variables: +# mode: tcl +# End: diff --git a/env/tcl/tk8.6/demos/knightstour.tcl b/env/tcl/tk8.6/demos/knightstour.tcl new file mode 100644 index 0000000..6113db2 --- /dev/null +++ b/env/tcl/tk8.6/demos/knightstour.tcl @@ -0,0 +1,268 @@ +# Copyright (C) 2008 Pat Thoyts +# +# Calculate a Knight's tour of a chessboard. +# +# This uses Warnsdorff's rule to calculate the next square each +# time. This specifies that the next square should be the one that +# has the least number of available moves. +# +# Using this rule it is possible to get to a position where +# there are no squares available to move into. In this implementation +# this occurs when the starting square is d6. +# +# To solve this fault an enhancement to the rule is that if we +# have a choice of squares with an equal score, we should choose +# the one nearest the edge of the board. +# +# If the call to the Edgemost function is commented out you can see +# this occur. +# +# You can drag the knight to a specific square to start if you wish. +# If you let it repeat then it will choose random start positions +# for each new tour. + +package require Tk 8.5 + +# Return a list of accessible squares from a given square +proc ValidMoves {square} { + set moves {} + foreach pair {{-1 -2} {-2 -1} {-2 1} {-1 2} {1 2} {2 1} {2 -1} {1 -2}} { + set col [expr {($square % 8) + [lindex $pair 0]}] + set row [expr {($square / 8) + [lindex $pair 1]}] + if {$row > -1 && $row < 8 && $col > -1 && $col < 8} { + lappend moves [expr {$row * 8 + $col}] + } + } + return $moves +} + +# Return the number of available moves for this square +proc CheckSquare {square} { + variable visited + set moves 0 + foreach test [ValidMoves $square] { + if {[lsearch -exact -integer $visited $test] == -1} { + incr moves + } + } + return $moves +} + +# Select the next square to move to. Returns -1 if there are no available +# squares remaining that we can move to. +proc Next {square} { + variable visited + set minimum 9 + set nextSquare -1 + foreach testSquare [ValidMoves $square] { + if {[lsearch -exact -integer $visited $testSquare] == -1} { + set count [CheckSquare $testSquare] + if {$count < $minimum} { + set minimum $count + set nextSquare $testSquare + } elseif {$count == $minimum} { + # to remove the enhancement to Warnsdorff's rule + # remove the next line: + set nextSquare [Edgemost $nextSquare $testSquare] + } + } + } + return $nextSquare +} + +# Select the square nearest the edge of the board +proc Edgemost {a b} { + set colA [expr {3-int(abs(3.5-($a%8)))}] + set colB [expr {3-int(abs(3.5-($b%8)))}] + set rowA [expr {3-int(abs(3.5-($a/8)))}] + set rowB [expr {3-int(abs(3.5-($b/8)))}] + return [expr {($colA * $rowA) < ($colB * $rowB) ? $a : $b}] +} + +# Display a square number as a standard chess square notation. +proc N {square} { + return [format %c%d [expr {97 + $square % 8}] \ + [expr {$square / 8 + 1}]] +} + +# Perform a Knight's move and schedule the next move. +proc MovePiece {dlg last square} { + variable visited + variable delay + variable continuous + $dlg.f.txt insert end "[llength $visited]. [N $last] .. [N $square]\n" {} + $dlg.f.txt see end + $dlg.f.c itemconfigure [expr {1+$last}] -state normal -outline black + $dlg.f.c itemconfigure [expr {1+$square}] -state normal -outline red + $dlg.f.c moveto knight {*}[lrange [$dlg.f.c coords [expr {1+$square}]] 0 1] + lappend visited $square + set next [Next $square] + if {$next ne -1} { + variable aid [after $delay [list MovePiece $dlg $square $next]] + } else { + $dlg.tf.b1 configure -state normal + if {[llength $visited] == 64} { + variable initial + if {$initial == $square} { + $dlg.f.txt insert end "Closed tour!" + } else { + $dlg.f.txt insert end "Success\n" {} + if {$continuous} { + after [expr {$delay * 2}] [namespace code \ + [list Tour $dlg [expr {int(rand() * 64)}]]] + } + } + } else { + $dlg.f.txt insert end "FAILED!\n" {} + } + } +} + +# Begin a new tour of the board given a random start position +proc Tour {dlg {square {}}} { + variable visited {} + $dlg.f.txt delete 1.0 end + $dlg.tf.b1 configure -state disabled + for {set n 0} {$n < 64} {incr n} { + $dlg.f.c itemconfigure $n -state disabled -outline black + } + if {$square eq {}} { + set coords [lrange [$dlg.f.c coords knight] 0 1] + set square [expr {[$dlg.f.c find closest {*}$coords 0 65]-1}] + } + variable initial $square + after idle [list MovePiece $dlg $initial $initial] +} + +proc Stop {} { + variable aid + catch {after cancel $aid} +} + +proc Exit {dlg} { + Stop + destroy $dlg +} + +proc SetDelay {new} { + variable delay [expr {int($new)}] +} + +proc DragStart {w x y} { + $w dtag selected + $w addtag selected withtag current + variable dragging [list $x $y] +} +proc DragMotion {w x y} { + variable dragging + if {[info exists dragging]} { + $w move selected [expr {$x - [lindex $dragging 0]}] \ + [expr {$y - [lindex $dragging 1]}] + variable dragging [list $x $y] + } +} +proc DragEnd {w x y} { + set square [$w find closest $x $y 0 65] + $w moveto selected {*}[lrange [$w coords $square] 0 1] + $w dtag selected + variable dragging ; unset dragging +} + +proc CreateGUI {} { + catch {destroy .knightstour} + set dlg [toplevel .knightstour] + wm title $dlg "Knights tour" + wm withdraw $dlg + set f [ttk::frame $dlg.f] + set c [canvas $f.c -width 240 -height 240] + text $f.txt -width 10 -height 1 -background white \ + -yscrollcommand [list $f.vs set] -font {Arial 8} + ttk::scrollbar $f.vs -command [list $f.txt yview] + + variable delay 600 + variable continuous 0 + ttk::frame $dlg.tf + ttk::label $dlg.tf.ls -text Speed + ttk::scale $dlg.tf.sc -from 8 -to 2000 -command [list SetDelay] \ + -variable [namespace which -variable delay] + ttk::checkbutton $dlg.tf.cc -text Repeat \ + -variable [namespace which -variable continuous] + ttk::button $dlg.tf.b1 -text Start -command [list Tour $dlg] + ttk::button $dlg.tf.b2 -text Exit -command [list Exit $dlg] + set square 0 + for {set row 7} {$row != -1} {incr row -1} { + for {set col 0} {$col < 8} {incr col} { + if {(($col & 1) ^ ($row & 1))} { + set fill tan3 ; set dfill tan4 + } else { + set fill bisque ; set dfill bisque3 + } + set coords [list [expr {$col * 30 + 4}] [expr {$row * 30 + 4}] \ + [expr {$col * 30 + 30}] [expr {$row * 30 + 30}]] + $c create rectangle $coords -fill $fill -disabledfill $dfill \ + -width 2 -state disabled + } + } + if {[tk windowingsystem] ne "x11"} { + catch {eval font create KnightFont -size -24} + $c create text 0 0 -font KnightFont -text "\u265e" \ + -anchor nw -tags knight -fill black -activefill "#600000" + } else { + # On X11 we cannot reliably tell if the \u265e glyph is available + # so just use a polygon + set pts { + 2 25 24 25 21 19 20 8 14 0 10 0 0 13 0 16 + 2 17 4 14 5 15 3 17 5 17 9 14 10 15 5 21 + } + $c create polygon $pts -tag knight -offset 8 \ + -fill black -activefill "#600000" + } + $c moveto knight {*}[lrange [$c coords [expr {1 + int(rand() * 64)}]] 0 1] + $c bind knight [namespace code [list DragStart %W %x %y]] + $c bind knight [namespace code [list DragMotion %W %x %y]] + $c bind knight [namespace code [list DragEnd %W %x %y]] + + grid $c $f.txt $f.vs -sticky news + grid rowconfigure $f 0 -weight 1 + grid columnconfigure $f 1 -weight 1 + + grid $f - - - - - -sticky news + set things [list $dlg.tf.ls $dlg.tf.sc $dlg.tf.cc $dlg.tf.b1] + if {![info exists ::widgetDemo]} { + lappend things $dlg.tf.b2 + if {[tk windowingsystem] ne "aqua"} { + set things [linsert $things 0 [ttk::sizegrip $dlg.tf.sg]] + } + } + pack {*}$things -side right + if {[tk windowingsystem] eq "aqua"} { + pack configure {*}$things -padx {4 4} -pady {12 12} + pack configure [lindex $things 0] -padx {4 24} + pack configure [lindex $things end] -padx {16 4} + } + grid $dlg.tf - - - - - -sticky ew + if {[info exists ::widgetDemo]} { + grid [addSeeDismiss $dlg.buttons $dlg] - - - - - -sticky ew + } + + grid rowconfigure $dlg 0 -weight 1 + grid columnconfigure $dlg 0 -weight 1 + + bind $dlg {console show} + bind $dlg [list $dlg.tf.b1 invoke] + bind $dlg [list $dlg.tf.b2 invoke] + bind $dlg [namespace code [list Stop]] + wm protocol $dlg WM_DELETE_WINDOW [namespace code [list Exit $dlg]] + + wm deiconify $dlg + tkwait window $dlg +} + +if {![winfo exists .knightstour]} { + if {![info exists widgetDemo]} { wm withdraw . } + set r [catch [linsert $argv 0 CreateGUI] err] + if {$r} { + tk_messageBox -icon error -title "Error" -message $err + } + if {![info exists widgetDemo]} { exit $r } +} diff --git a/env/tcl/tk8.6/demos/label.tcl b/env/tcl/tk8.6/demos/label.tcl new file mode 100644 index 0000000..13463f7 --- /dev/null +++ b/env/tcl/tk8.6/demos/label.tcl @@ -0,0 +1,40 @@ +# label.tcl -- +# +# This demonstration script creates a toplevel window containing +# several label widgets. + +if {![info exists widgetDemo]} { + error "This script should be run from the \"widget\" demo." +} + +package require Tk + +set w .label +catch {destroy $w} +toplevel $w +wm title $w "Label Demonstration" +wm iconname $w "label" +positionWindow $w + +label $w.msg -font $font -wraplength 4i -justify left -text "Five labels are displayed below: three textual ones on the left, and an image label and a text label on the right. Labels are pretty boring because you can't do anything with them." +pack $w.msg -side top + +## See Code / Dismiss buttons +set btns [addSeeDismiss $w.buttons $w] +pack $btns -side bottom -fill x + +frame $w.left +frame $w.right +pack $w.left $w.right -side left -expand yes -padx 10 -pady 10 -fill both + +label $w.left.l1 -text "First label" +label $w.left.l2 -text "Second label, raised" -relief raised +label $w.left.l3 -text "Third label, sunken" -relief sunken +pack $w.left.l1 $w.left.l2 $w.left.l3 -side top -expand yes -pady 2 -anchor w + +# Main widget program sets variable tk_demoDirectory +image create photo label.ousterhout \ + -file [file join $tk_demoDirectory images ouster.png] +label $w.right.picture -borderwidth 2 -relief sunken -image label.ousterhout +label $w.right.caption -text "Tcl/Tk Creator" +pack $w.right.picture $w.right.caption -side top diff --git a/env/tcl/tk8.6/demos/labelframe.tcl b/env/tcl/tk8.6/demos/labelframe.tcl new file mode 100644 index 0000000..21d079f --- /dev/null +++ b/env/tcl/tk8.6/demos/labelframe.tcl @@ -0,0 +1,76 @@ +# labelframe.tcl -- +# +# This demonstration script creates a toplevel window containing +# several labelframe widgets. + +if {![info exists widgetDemo]} { + error "This script should be run from the \"widget\" demo." +} + +package require Tk + +set w .labelframe +catch {destroy $w} +toplevel $w +wm title $w "Labelframe Demonstration" +wm iconname $w "labelframe" +positionWindow $w + +# Some information + +label $w.msg -font $font -wraplength 4i -justify left -text "Labelframes are\ + used to group related widgets together. The label may be either \ + plain text or another widget." +pack $w.msg -side top + +## See Code / Dismiss buttons +set btns [addSeeDismiss $w.buttons $w] +pack $btns -side bottom -fill x + +# Demo area + +frame $w.f +pack $w.f -side bottom -fill both -expand 1 +set w $w.f + +# A group of radiobuttons in a labelframe + +labelframe $w.f -text "Value" -padx 2 -pady 2 +grid $w.f -row 0 -column 0 -pady 2m -padx 2m + +foreach value {1 2 3 4} { + radiobutton $w.f.b$value -text "This is value $value" \ + -variable lfdummy -value $value + pack $w.f.b$value -side top -fill x -pady 2 +} + + +# Using a label window to control a group of options. + +proc lfEnableButtons {w} { + foreach child [winfo children $w] { + if {$child == "$w.cb"} continue + if {$::lfdummy2} { + $child configure -state normal + } else { + $child configure -state disabled + } + } +} + +labelframe $w.f2 -pady 2 -padx 2 +checkbutton $w.f2.cb -text "Use this option." -variable lfdummy2 \ + -command "lfEnableButtons $w.f2" -padx 0 +$w.f2 configure -labelwidget $w.f2.cb +grid $w.f2 -row 0 -column 1 -pady 2m -padx 2m + +set t 0 +foreach str {Option1 Option2 Option3} { + checkbutton $w.f2.b$t -text $str + pack $w.f2.b$t -side top -fill x -pady 2 + incr t +} +lfEnableButtons $w.f2 + + +grid columnconfigure $w {0 1} -weight 1 diff --git a/env/tcl/tk8.6/demos/license.terms b/env/tcl/tk8.6/demos/license.terms new file mode 100644 index 0000000..0126435 --- /dev/null +++ b/env/tcl/tk8.6/demos/license.terms @@ -0,0 +1,40 @@ +This software is copyrighted by the Regents of the University of +California, Sun Microsystems, Inc., Scriptics Corporation, ActiveState +Corporation, Apple Inc. and other parties. The following terms apply to +all files associated with the software unless explicitly disclaimed in +individual files. + +The authors hereby grant permission to use, copy, modify, distribute, +and license this software and its documentation for any purpose, provided +that existing copyright notices are retained in all copies and that this +notice is included verbatim in any distributions. No written agreement, +license, or royalty fee is required for any of the authorized uses. +Modifications to this software may be copyrighted by their authors +and need not follow the licensing terms described here, provided that +the new terms are clearly indicated on the first page of each file where +they apply. + +IN NO EVENT SHALL THE AUTHORS OR DISTRIBUTORS BE LIABLE TO ANY PARTY +FOR DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES +ARISING OUT OF THE USE OF THIS SOFTWARE, ITS DOCUMENTATION, OR ANY +DERIVATIVES THEREOF, EVEN IF THE AUTHORS HAVE BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. + +THE AUTHORS AND DISTRIBUTORS SPECIFICALLY DISCLAIM ANY WARRANTIES, +INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE, AND NON-INFRINGEMENT. THIS SOFTWARE +IS PROVIDED ON AN "AS IS" BASIS, AND THE AUTHORS AND DISTRIBUTORS HAVE +NO OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR +MODIFICATIONS. + +GOVERNMENT USE: If you are acquiring this software on behalf of the +U.S. government, the Government shall have only "Restricted Rights" +in the software and related documentation as defined in the Federal +Acquisition Regulations (FARs) in Clause 52.227.19 (c) (2). If you +are acquiring the software on behalf of the Department of Defense, the +software shall be classified as "Commercial Computer Software" and the +Government shall have only "Restricted Rights" as defined in Clause +252.227-7013 (b) (3) of DFARs. Notwithstanding the foregoing, the +authors grant the U.S. Government and others acting in its behalf +permission to use and distribute the software in accordance with the +terms specified in this license. diff --git a/env/tcl/tk8.6/demos/mclist.tcl b/env/tcl/tk8.6/demos/mclist.tcl new file mode 100644 index 0000000..7a4dd4c --- /dev/null +++ b/env/tcl/tk8.6/demos/mclist.tcl @@ -0,0 +1,119 @@ +# mclist.tcl -- +# +# This demonstration script creates a toplevel window containing a Ttk +# tree widget configured as a multi-column listbox. + +if {![info exists widgetDemo]} { + error "This script should be run from the \"widget\" demo." +} + +package require Tk + +set w .mclist +catch {destroy $w} +toplevel $w +wm title $w "Multi-Column List" +wm iconname $w "mclist" +positionWindow $w + +## Explanatory text +ttk::label $w.msg -font $font -wraplength 4i -justify left -anchor n -padding {10 2 10 6} -text "Ttk is the new Tk themed widget set. One of the widgets it includes is a tree widget, which can be configured to display multiple columns of informational data without displaying the tree itself. This is a simple way to build a listbox that has multiple columns. Clicking on the heading for a column will sort the data by that column. You can also change the width of the columns by dragging the boundary between them." +pack $w.msg -fill x + +## See Code / Dismiss +pack [addSeeDismiss $w.seeDismiss $w] -side bottom -fill x + +ttk::frame $w.container +ttk::treeview $w.tree -columns {country capital currency} -show headings \ + -yscroll "$w.vsb set" -xscroll "$w.hsb set" +ttk::scrollbar $w.vsb -orient vertical -command "$w.tree yview" +ttk::scrollbar $w.hsb -orient horizontal -command "$w.tree xview" +pack $w.container -fill both -expand 1 +grid $w.tree $w.vsb -in $w.container -sticky nsew +grid $w.hsb -in $w.container -sticky nsew +grid column $w.container 0 -weight 1 +grid row $w.container 0 -weight 1 + +image create photo upArrow -data { + R0lGODlhDgAOAJEAANnZ2YCAgPz8/P///yH5BAEAAAAALAAAAAAOAA4AAAImhI+ + py+1LIsJHiBAh+BgmiEAJQITgW6DgUQIAECH4JN8IPqYuNxUAOw==} +image create photo downArrow -data { + R0lGODlhDgAOAJEAANnZ2YCAgPz8/P///yH5BAEAAAAALAAAAAAOAA4AAAInhI+ + py+1I4ocQ/IgDEYIPgYJICUCE4F+YIBolEoKPEJKZmVJK6ZACADs=} +image create photo noArrow -height 14 -width 14 + +## The data we're going to insert +set data { + Argentina {Buenos Aires} ARS + Australia Canberra AUD + Brazil Brazilia BRL + Canada Ottawa CAD + China Beijing CNY + France Paris EUR + Germany Berlin EUR + India {New Delhi} INR + Italy Rome EUR + Japan Tokyo JPY + Mexico {Mexico City} MXN + Russia Moscow RUB + {South Africa} Pretoria ZAR + {United Kingdom} London GBP + {United States} {Washington, D.C.} USD +} + +## Code to insert the data nicely +set font [ttk::style lookup Heading -font] +foreach col {country capital currency} name {Country Capital Currency} { + $w.tree heading $col -text $name -image noArrow -anchor w \ + -command [list SortBy $w.tree $col 0] + $w.tree column $col -width [expr { + [font measure $font $name] + [image width noArrow] + 5 + }] +} +set font [ttk::style lookup Treeview -font] +foreach {country capital currency} $data { + $w.tree insert {} end -values [list $country $capital $currency] + foreach col {country capital currency} { + set len [font measure $font "[set $col] "] + if {[$w.tree column $col -width] < $len} { + $w.tree column $col -width $len + } + } +} + +## Code to do the sorting of the tree contents when clicked on +proc SortBy {tree col direction} { + # Determine currently sorted column and its sort direction + foreach c {country capital currency} { + set s [$tree heading $c state] + if {("selected" in $s || "alternate" in $s) && $col ne $c} { + # Sorted column has changed + $tree heading $c -image noArrow state {!selected !alternate !user1} + set direction [expr {"alternate" in $s}] + } + } + + # Build something we can sort + set data {} + foreach row [$tree children {}] { + lappend data [list [$tree set $row $col] $row] + } + + set dir [expr {$direction ? "-decreasing" : "-increasing"}] + set r -1 + + # Now reshuffle the rows into the sorted order + foreach info [lsort -dictionary -index 0 $dir $data] { + $tree move [lindex $info 1] {} [incr r] + } + + # Switch the heading so that it will sort in the opposite direction + $tree heading $col -command [list SortBy $tree $col [expr {!$direction}]] \ + state [expr {$direction?"!selected alternate":"selected !alternate"}] + if {[ttk::style theme use] eq "aqua"} { + # Aqua theme displays native sort arrows when user1 state is set + $tree heading $col state "user1" + } else { + $tree heading $col -image [expr {$direction?"upArrow":"downArrow"}] + } +} diff --git a/env/tcl/tk8.6/demos/menu.tcl b/env/tcl/tk8.6/demos/menu.tcl new file mode 100644 index 0000000..a788a65 --- /dev/null +++ b/env/tcl/tk8.6/demos/menu.tcl @@ -0,0 +1,163 @@ +# menu.tcl -- +# +# This demonstration script creates a window with a bunch of menus +# and cascaded menus using menubars. + +if {![info exists widgetDemo]} { + error "This script should be run from the \"widget\" demo." +} + +package require Tk + +set w .menu +catch {destroy $w} +toplevel $w +wm title $w "Menu Demonstration" +wm iconname $w "menu" +positionWindow $w + +label $w.msg -font $font -wraplength 4i -justify left +if {[tk windowingsystem] eq "aqua"} { + catch {set origUseCustomMDEF $::tk::mac::useCustomMDEF; set ::tk::mac::useCustomMDEF 1} + $w.msg configure -text "This window has a menubar with cascaded menus. You can invoke entries with an accelerator by typing Command+x, where \"x\" is the character next to the command key symbol. The rightmost menu can be torn off into a palette by selecting the first item in the menu." +} else { + $w.msg configure -text "This window contains a menubar with cascaded menus. You can post a menu from the keyboard by typing Alt+x, where \"x\" is the character underlined on the menu. You can then traverse among the menus using the arrow keys. When a menu is posted, you can invoke the current entry by typing space, or you can invoke any entry by typing its underlined character. If a menu entry has an accelerator, you can invoke the entry without posting the menu just by typing the accelerator. The rightmost menu can be torn off into a palette by selecting the first item in the menu." +} +pack $w.msg -side top + +set menustatus " " +frame $w.statusBar +label $w.statusBar.label -textvariable menustatus -relief sunken -bd 1 -font "Helvetica 10" -anchor w +pack $w.statusBar.label -side left -padx 2 -expand yes -fill both +pack $w.statusBar -side bottom -fill x -pady 2 + +## See Code / Dismiss buttons +set btns [addSeeDismiss $w.buttons $w] +pack $btns -side bottom -fill x + +menu $w.menu -tearoff 0 + +set m $w.menu.file +menu $m -tearoff 0 +$w.menu add cascade -label "File" -menu $m -underline 0 +$m add command -label "Open..." -command {error "this is just a demo: no action has been defined for the \"Open...\" entry"} +$m add command -label "New" -command {error "this is just a demo: no action has been defined for the \"New\" entry"} +$m add command -label "Save" -command {error "this is just a demo: no action has been defined for the \"Save\" entry"} +$m add command -label "Save As..." -command {error "this is just a demo: no action has been defined for the \"Save As...\" entry"} +$m add separator +$m add command -label "Print Setup..." -command {error "this is just a demo: no action has been defined for the \"Print Setup...\" entry"} +$m add command -label "Print..." -command {error "this is just a demo: no action has been defined for the \"Print...\" entry"} +$m add separator +$m add command -label "Dismiss Menus Demo" -command "destroy $w" + +set m $w.menu.basic +$w.menu add cascade -label "Basic" -menu $m -underline 0 +menu $m -tearoff 0 +$m add command -label "Long entry that does nothing" +if {[tk windowingsystem] eq "aqua"} { + set modifier Command +} elseif {[tk windowingsystem] == "win32"} { + set modifier Control +} else { + set modifier Meta +} +foreach i {A B C D E F} { + $m add command -label "Print letter \"$i\"" -underline 14 \ + -accelerator Meta+$i -command "puts $i" -accelerator $modifier+$i + bind $w <$modifier-[string tolower $i]> "puts $i" +} + +set m $w.menu.cascade +$w.menu add cascade -label "Cascades" -menu $m -underline 0 +menu $m -tearoff 0 +$m add command -label "Print hello" \ + -command {puts stdout "Hello"} -accelerator $modifier+H -underline 6 +bind $w <$modifier-h> {puts stdout "Hello"} +$m add command -label "Print goodbye" -command {\ + puts stdout "Goodbye"} -accelerator $modifier+G -underline 6 +bind $w <$modifier-g> {puts stdout "Goodbye"} +$m add cascade -label "Check buttons" \ + -menu $w.menu.cascade.check -underline 0 +$m add cascade -label "Radio buttons" \ + -menu $w.menu.cascade.radio -underline 0 + +set m $w.menu.cascade.check +menu $m -tearoff 0 +$m add check -label "Oil checked" -variable oil +$m add check -label "Transmission checked" -variable trans +$m add check -label "Brakes checked" -variable brakes +$m add check -label "Lights checked" -variable lights +$m add separator +$m add command -label "Show current values" \ + -command "showVars $w.menu.cascade.dialog oil trans brakes lights" +$m invoke 1 +$m invoke 3 + +set m $w.menu.cascade.radio +menu $m -tearoff 0 +$m add radio -label "10 point" -variable pointSize -value 10 +$m add radio -label "14 point" -variable pointSize -value 14 +$m add radio -label "18 point" -variable pointSize -value 18 +$m add radio -label "24 point" -variable pointSize -value 24 +$m add radio -label "32 point" -variable pointSize -value 32 +$m add sep +$m add radio -label "Roman" -variable style -value roman +$m add radio -label "Bold" -variable style -value bold +$m add radio -label "Italic" -variable style -value italic +$m add sep +$m add command -label "Show current values" \ + -command "showVars $w.menu.cascade.dialog pointSize style" +$m invoke 1 +$m invoke 7 + +set m $w.menu.icon +$w.menu add cascade -label "Icons" -menu $m -underline 0 +menu $m -tearoff 0 +# Main widget program sets variable tk_demoDirectory +image create photo lilearth -file [file join $tk_demoDirectory \ +images earthmenu.png] +$m add command -image lilearth \ + -hidemargin 1 -command [list \ + tk_dialog $w.pattern {Bitmap Menu Entry} \ + "The menu entry you invoked displays a photoimage rather than\ + a text string. Other than this, it is just like any other\ + menu entry." {} 0 OK ] +foreach i {info questhead error} { + $m add command -bitmap $i -hidemargin 1 -command [list \ + puts "You invoked the $i bitmap" ] +} +$m entryconfigure 2 -columnbreak 1 + +set m $w.menu.more +$w.menu add cascade -label "More" -menu $m -underline 0 +menu $m -tearoff 0 +foreach i {{An entry} {Another entry} {Does nothing} {Does almost nothing} {Make life meaningful}} { + $m add command -label $i -command [list puts "You invoked \"$i\""] +} +$m entryconfigure "Does almost nothing" -bitmap questhead -compound left \ + -command [list \ + tk_dialog $w.compound {Compound Menu Entry} \ + "The menu entry you invoked displays both a bitmap and a\ + text string. Other than this, it is just like any other\ + menu entry." {} 0 OK ] + +set m $w.menu.colors +$w.menu add cascade -label "Colors" -menu $m -underline 1 +menu $m -tearoff 1 +foreach i {red orange yellow green blue} { + $m add command -label $i -background $i -command [list \ + puts "You invoked \"$i\"" ] +} + +$w configure -menu $w.menu + +bind Menu <> { + global $menustatus + if {[catch {%W entrycget active -label} label]} { + set label " " + } + set menustatus $label + update idletasks +} + +if {[tk windowingsystem] eq "aqua"} {catch {set ::tk::mac::useCustomMDEF $origUseCustomMDEF}} diff --git a/env/tcl/tk8.6/demos/menubu.tcl b/env/tcl/tk8.6/demos/menubu.tcl new file mode 100644 index 0000000..96e3b15 --- /dev/null +++ b/env/tcl/tk8.6/demos/menubu.tcl @@ -0,0 +1,90 @@ +# menubu.tcl -- +# +# This demonstration script creates a window with a bunch of menus +# and cascaded menus using menubuttons. + +if {![info exists widgetDemo]} { + error "This script should be run from the \"widget\" demo." +} + +package require Tk + +set w .menubu +catch {destroy $w} +toplevel $w +wm title $w "Menu Button Demonstration" +wm iconname $w "menubutton" +positionWindow $w + +frame $w.body +pack $w.body -expand 1 -fill both +if {[tk windowingsystem] eq "aqua"} {catch {set origUseCustomMDEF $::tk::mac::useCustomMDEF; set ::tk::mac::useCustomMDEF 1}} + +menubutton $w.body.below -text "Below" -underline 0 -direction below -menu $w.body.below.m -relief raised +menu $w.body.below.m -tearoff 0 +$w.body.below.m add command -label "Below menu: first item" -command "puts \"You have selected the first item from the Below menu.\"" +$w.body.below.m add command -label "Below menu: second item" -command "puts \"You have selected the second item from the Below menu.\"" +grid $w.body.below -row 0 -column 1 -sticky n +menubutton $w.body.right -text "Right" -underline 0 -direction right -menu $w.body.right.m -relief raised +menu $w.body.right.m -tearoff 0 +$w.body.right.m add command -label "Right menu: first item" -command "puts \"You have selected the first item from the Right menu.\"" +$w.body.right.m add command -label "Right menu: second item" -command "puts \"You have selected the second item from the Right menu.\"" +frame $w.body.center +menubutton $w.body.left -text "Left" -underline 0 -direction left -menu $w.body.left.m -relief raised +menu $w.body.left.m -tearoff 0 +$w.body.left.m add command -label "Left menu: first item" -command "puts \"You have selected the first item from the Left menu.\"" +$w.body.left.m add command -label "Left menu: second item" -command "puts \"You have selected the second item from the Left menu.\"" +grid $w.body.right -row 1 -column 0 -sticky w +grid $w.body.center -row 1 -column 1 -sticky news +grid $w.body.left -row 1 -column 2 -sticky e +menubutton $w.body.above -text "Above" -underline 0 -direction above -menu $w.body.above.m -relief raised +menu $w.body.above.m -tearoff 0 +$w.body.above.m add command -label "Above menu: first item" -command "puts \"You have selected the first item from the Above menu.\"" +$w.body.above.m add command -label "Above menu: second item" -command "puts \"You have selected the second item from the Above menu.\"" +grid $w.body.above -row 2 -column 1 -sticky s + +## See Code / Dismiss buttons +set btns [addSeeDismiss $w.buttons $w] +pack $btns -side bottom -fill x + +set body $w.body.center +label $body.label -wraplength 300 -font "Helvetica 14" -justify left -text "This is a demonstration of menubuttons. The \"Below\" menubutton pops its menu below the button; the \"Right\" button pops to the right, etc. There are two option menus directly below this text; one is just a standard menu and the other is a 16-color palette." +pack $body.label -side top -padx 25 -pady 25 +frame $body.buttons +pack $body.buttons -padx 25 -pady 25 +tk_optionMenu $body.buttons.options menubuttonoptions one two three +pack $body.buttons.options -side left -padx 25 -pady 25 +set m [tk_optionMenu $body.buttons.colors paletteColor Black red4 DarkGreen NavyBlue gray75 Red Green Blue gray50 Yellow Cyan Magenta White Brown DarkSeaGreen DarkViolet] +if {[tk windowingsystem] eq "aqua"} { + set topBorderColor Black + set bottomBorderColor Black +} else { + set topBorderColor gray50 + set bottomBorderColor gray75 +} +for {set i 0} {$i <= [$m index last]} {incr i} { + set name [$m entrycget $i -label] + image create photo image_$name -height 16 -width 16 + image_$name put $topBorderColor -to 0 0 16 1 + image_$name put $topBorderColor -to 0 1 1 16 + image_$name put $bottomBorderColor -to 0 15 16 16 + image_$name put $bottomBorderColor -to 15 1 16 16 + image_$name put $name -to 1 1 15 15 + + image create photo image_${name}_s -height 16 -width 16 + image_${name}_s put Black -to 0 0 16 2 + image_${name}_s put Black -to 0 2 2 16 + image_${name}_s put Black -to 2 14 16 16 + image_${name}_s put Black -to 14 2 16 14 + image_${name}_s put $name -to 2 2 14 14 + + $m entryconfigure $i -image image_$name -selectimage image_${name}_s -hidemargin 1 +} +$m configure -tearoff 1 +foreach i {Black gray75 gray50 White} { + $m entryconfigure $i -columnbreak 1 +} + +pack $body.buttons.colors -side left -padx 25 -pady 25 + +if {[tk windowingsystem] eq "aqua"} {catch {set ::tk::mac::useCustomMDEF $origUseCustomMDEF}} diff --git a/env/tcl/tk8.6/demos/msgbox.tcl b/env/tcl/tk8.6/demos/msgbox.tcl new file mode 100644 index 0000000..2c2cc2d --- /dev/null +++ b/env/tcl/tk8.6/demos/msgbox.tcl @@ -0,0 +1,62 @@ +# msgbox.tcl -- +# +# This demonstration script creates message boxes of various type + +if {![info exists widgetDemo]} { + error "This script should be run from the \"widget\" demo." +} + +package require Tk + +set w .msgbox +catch {destroy $w} +toplevel $w +wm title $w "Message Box Demonstration" +wm iconname $w "messagebox" +positionWindow $w + +label $w.msg -font $font -wraplength 4i -justify left -text "Choose the icon and type option of the message box. Then press the \"Message Box\" button to see the message box." +pack $w.msg -side top + +pack [addSeeDismiss $w.buttons $w {} { + ttk::button $w.buttons.vars -text "Message Box" -command "showMessageBox $w" +}] -side bottom -fill x +#pack $w.buttons.dismiss $w.buttons.code $w.buttons.vars -side left -expand 1 + +frame $w.left +frame $w.right +pack $w.left $w.right -side left -expand yes -fill y -pady .5c -padx .5c + +label $w.left.label -text "Icon" +frame $w.left.sep -relief ridge -bd 1 -height 2 +pack $w.left.label -side top +pack $w.left.sep -side top -fill x -expand no + +set msgboxIcon info +foreach i {error info question warning} { + radiobutton $w.left.b$i -text $i -variable msgboxIcon \ + -relief flat -value $i -width 16 -anchor w + pack $w.left.b$i -side top -pady 2 -anchor w -fill x +} + +label $w.right.label -text "Type" +frame $w.right.sep -relief ridge -bd 1 -height 2 +pack $w.right.label -side top +pack $w.right.sep -side top -fill x -expand no + +set msgboxType ok +foreach t {abortretryignore ok okcancel retrycancel yesno yesnocancel} { + radiobutton $w.right.$t -text $t -variable msgboxType \ + -relief flat -value $t -width 16 -anchor w + pack $w.right.$t -side top -pady 2 -anchor w -fill x +} + +proc showMessageBox {w} { + global msgboxIcon msgboxType + set button [tk_messageBox -icon $msgboxIcon -type $msgboxType \ + -title Message -parent $w\ + -message "This is a \"$msgboxType\" type messagebox with the \"$msgboxIcon\" icon"] + + tk_messageBox -icon info -message "You have selected \"$button\"" -type ok\ + -parent $w +} diff --git a/env/tcl/tk8.6/demos/nl.msg b/env/tcl/tk8.6/demos/nl.msg new file mode 100644 index 0000000..cd52630 --- /dev/null +++ b/env/tcl/tk8.6/demos/nl.msg @@ -0,0 +1,125 @@ +::msgcat::mcset nl "Widget Demonstration" "Demonstratie van widgets" +::msgcat::mcset nl "tkWidgetDemo" "tkWidgetDemo" +::msgcat::mcset nl "&File" "&Bestand" +::msgcat::mcset nl "About..." "Info..." +::msgcat::mcset nl "&About..." "&Info..." +::msgcat::mcset nl "" "" +::msgcat::mcset nl "&Quit" "&Einde" +::msgcat::mcset nl "Meta+Q" "Meta+E" ;# Displayed hotkey +::msgcat::mcset nl "Meta-q" "Meta-e" ;# Actual binding sequence +::msgcat::mcset nl "Ctrl+Q" "Ctrl+E" ;# Displayed hotkey +::msgcat::mcset nl "Control-q" "Control-e" ;# Actual binding sequence +::msgcat::mcset nl "Dismiss" "Sluiten" +::msgcat::mcset nl "See Variables" "Bekijk Variabelen" +::msgcat::mcset nl "Variable Values" "Waarden Variabelen" +::msgcat::mcset nl "OK" "OK" +::msgcat::mcset nl "Run the \"%s\" sample program" "Start voorbeeld \"%s\"" +::msgcat::mcset nl "Print Code" "Code Afdrukken" +::msgcat::mcset nl "Demo code: %s" "Code van Demo %s" +::msgcat::mcset nl "About Widget Demo" "Over deze demonstratie" +::msgcat::mcset nl "Tk widget demonstration" "Demonstratie van Tk widgets" +::msgcat::mcset nl "Copyright © %s" + +::msgcat::mcset nl "Tk Widget Demonstrations" "Demonstratie van Tk widgets" +::msgcat::mcset nl "This application provides a front end for several short scripts" \ + "Dit programma is een schil rond enkele korte scripts waarmee" +::msgcat::mcset nl "that demonstrate what you can do with Tk widgets. Each of the" \ + "gedemonstreerd wordt wat je kunt doen met Tk widgets. Elk van de" +::msgcat::mcset nl "numbered lines below describes a demonstration; you can click on" \ + "genummerde regels hieronder omschrijft een demonstratie; je kunt de" +::msgcat::mcset nl "it to invoke the demonstration. Once the demonstration window" \ + "demonstratie starten door op de regel te klikken." +::msgcat::mcset nl "appears, you can click the" \ + "Zodra het nieuwe venster verschijnt, kun je op de knop" +::msgcat::mcset nl "See Code" "Bekijk Code" ;# This is also button text! +::msgcat::mcset nl "button to see the Tcl/Tk code that created the demonstration. If" \ + "drukken om de achterliggende Tcl/Tk code te zien. Als je dat wilt," +::msgcat::mcset nl "you wish, you can edit the code and click the" \ + "kun je de code wijzigen en op de knop" +::msgcat::mcset nl "Rerun Demo" "Herstart Demo" ;# This is also button text! +::msgcat::mcset nl "button in the code window to reinvoke the demonstration with the" \ + "drukken in het codevenster om de demonstratie uit te voeren met de" +::msgcat::mcset nl "modified code." \ + "nieuwe code." + +::msgcat::mcset nl "Labels, buttons, checkbuttons, and radiobuttons" \ + "Labels, knoppen, vinkjes/aankruishokjes en radioknoppen" + +::msgcat::mcset nl "Labels (text and bitmaps)" "Labels (tekst en plaatjes)" +::msgcat::mcset nl "Labels and UNICODE text" "Labels en tekst in UNICODE" +::msgcat::mcset nl "Buttons" "Buttons (drukknoppen)" +::msgcat::mcset nl "Check-buttons (select any of a group)" \ + "Check-buttons (een of meer uit een groep)" +::msgcat::mcset nl "Radio-buttons (select one of a group)" \ + "Radio-buttons (een van een groep)" +::msgcat::mcset nl "A 15-puzzle game made out of buttons" \ + "Een schuifpuzzel van buttons" +::msgcat::mcset nl "Iconic buttons that use bitmaps" \ + "Buttons met pictogrammen" +::msgcat::mcset nl "Two labels displaying images" \ + "Twee labels met plaatjes in plaats van tekst" +::msgcat::mcset nl "A simple user interface for viewing images" \ + "Een eenvoudige user-interface voor het bekijken van plaatjes" +::msgcat::mcset nl "Labelled frames" \ + "Kaders met bijschrift" + +::msgcat::mcset nl "Listboxes" "Keuzelijsten" +::msgcat::mcset nl "The 50 states" "De 50 staten van de VS" +::msgcat::mcset nl "Colors: change the color scheme for the application" \ + "Kleuren: verander het kleurenschema voor het programma" +::msgcat::mcset nl "A collection of famous and infamous sayings" \ + "Beroemde en beruchte citaten en gezegden" + +::msgcat::mcset nl "Entries and Spin-boxes" "Invulvelden en Spinboxen" +::msgcat::mcset nl "Entries without scrollbars" "Invulvelden zonder schuifbalk" +::msgcat::mcset nl "Entries with scrollbars" "Invulvelden met schuifbalk" +::msgcat::mcset nl "Validated entries and password fields" \ + "Invulvelden met controle of wachtwoorden" +::msgcat::mcset nl "Spin-boxes" "Spinboxen" +::msgcat::mcset nl "Simple Rolodex-like form" "Simpel kaartsysteem" + +::msgcat::mcset nl "Text" "Tekst" +::msgcat::mcset nl "Basic editable text" "Voorbeeld met te wijzigen tekst" +::msgcat::mcset nl "Text display styles" "Tekst met verschillende stijlen" +::msgcat::mcset nl "Hypertext (tag bindings)" \ + "Hypertext (verwijzingen via \"tags\")" +::msgcat::mcset nl "A text widget with embedded windows" \ + "Tekstwidget met windows erin" +::msgcat::mcset nl "A search tool built with a text widget" \ + "Zoeken in tekst met behulp van een tekstwidget" + +::msgcat::mcset nl "Canvases" "Canvaswidgets" +::msgcat::mcset nl "The canvas item types" "Objecten in een canvas" +::msgcat::mcset nl "A simple 2-D plot" "Eenvoudige 2D-grafiek" +::msgcat::mcset nl "Text items in canvases" "Tekstobjecten in een canvas" +::msgcat::mcset nl "An editor for arrowheads on canvas lines" \ + "Editor voor de vorm van de pijl (begin/eind van een lijn)" +::msgcat::mcset nl "A ruler with adjustable tab stops" \ + "Een meetlat met aanpasbare ruiters" +::msgcat::mcset nl "A building floor plan" "Plattegrond van een gebouw" +::msgcat::mcset nl "A simple scrollable canvas" "Een schuifbaar canvas" + +::msgcat::mcset nl "Scales" "Schaalverdelingen" +::msgcat::mcset nl "Horizontal scale" "Horizontale schaal" +::msgcat::mcset nl "Vertical scale" "Verticale schaal" + +::msgcat::mcset nl "Paned Windows" "Vensters opgedeeld in stukken" +::msgcat::mcset nl "Horizontal paned window" "Horizontaal gedeeld venster" +::msgcat::mcset nl "Vertical paned window" "Verticaal gedeeld venster" + +::msgcat::mcset nl "Menus" "Menu's" +::msgcat::mcset nl "Menus and cascades (sub-menus)" \ + "Menu's en cascades (submenu's)" +::msgcat::mcset nl "Menu-buttons" "Menu-buttons" + +::msgcat::mcset nl "Common Dialogs" "Veel voorkomende dialoogvensters" +::msgcat::mcset nl "Message boxes" "Mededeling (message box)" +::msgcat::mcset nl "File selection dialog" "Selectie van bestanden" +::msgcat::mcset nl "Color picker" "Kleurenpalet" + +::msgcat::mcset nl "Miscellaneous" "Diversen" +::msgcat::mcset nl "The built-in bitmaps" "Ingebouwde plaatjes" +::msgcat::mcset nl "A dialog box with a local grab" \ + "Een dialoogvenster met een locale \"grab\"" +::msgcat::mcset nl "A dialog box with a global grab" \ + "Een dialoogvenster met een globale \"grab\"" diff --git a/env/tcl/tk8.6/demos/paned1.tcl b/env/tcl/tk8.6/demos/paned1.tcl new file mode 100644 index 0000000..783b7f3 --- /dev/null +++ b/env/tcl/tk8.6/demos/paned1.tcl @@ -0,0 +1,32 @@ +# paned1.tcl -- +# +# This demonstration script creates a toplevel window containing +# a paned window that separates two windows horizontally. + +if {![info exists widgetDemo]} { + error "This script should be run from the \"widget\" demo." +} + +package require Tk + +set w .paned1 +catch {destroy $w} +toplevel $w +wm title $w "Horizontal Paned Window Demonstration" +wm iconname $w "paned1" +positionWindow $w + +label $w.msg -font $font -wraplength 4i -justify left -text "The sash between the two coloured windows below can be used to divide the area between them. Use the left mouse button to resize without redrawing by just moving the sash, and use the middle mouse button to resize opaquely (always redrawing the windows in each position.)" +pack $w.msg -side top + +## See Code / Dismiss buttons +set btns [addSeeDismiss $w.buttons $w] +pack $btns -side bottom -fill x + +panedwindow $w.pane +pack $w.pane -side top -expand yes -fill both -pady 2 -padx 2m + +label $w.pane.left -text "This is the\nleft side" -bg yellow +label $w.pane.right -text "This is the\nright side" -bg cyan + +$w.pane add $w.pane.left $w.pane.right diff --git a/env/tcl/tk8.6/demos/paned2.tcl b/env/tcl/tk8.6/demos/paned2.tcl new file mode 100644 index 0000000..c549249 --- /dev/null +++ b/env/tcl/tk8.6/demos/paned2.tcl @@ -0,0 +1,74 @@ +# paned2.tcl -- +# +# This demonstration script creates a toplevel window containing +# a paned window that separates two windows vertically. + +if {![info exists widgetDemo]} { + error "This script should be run from the \"widget\" demo." +} + +package require Tk + +set w .paned2 +catch {destroy $w} +toplevel $w +wm title $w "Vertical Paned Window Demonstration" +wm iconname $w "paned2" +positionWindow $w + +label $w.msg -font $font -wraplength 4i -justify left -text "The sash between the two scrolled windows below can be used to divide the area between them. Use the left mouse button to resize without redrawing by just moving the sash, and use the middle mouse button to resize opaquely (always redrawing the windows in each position.)" +pack $w.msg -side top + +## See Code / Dismiss buttons +set btns [addSeeDismiss $w.buttons $w] +pack $btns -side bottom -fill x + +# Create the pane itself +panedwindow $w.pane -orient vertical +pack $w.pane -side top -expand yes -fill both -pady 2 -padx 2m + +# The top window is a listbox with scrollbar +set paneList { + {List of Tk Widgets} + button + canvas + checkbutton + entry + frame + label + labelframe + listbox + menu + menubutton + message + panedwindow + radiobutton + scale + scrollbar + spinbox + text + toplevel +} +set f [frame $w.pane.top] +listbox $f.list -listvariable paneList -yscrollcommand "$f.scr set" +# Invert the first item to highlight it +$f.list itemconfigure 0 \ + -background [$f.list cget -fg] -foreground [$f.list cget -bg] +ttk::scrollbar $f.scr -orient vertical -command "$f.list yview" +pack $f.scr -side right -fill y +pack $f.list -fill both -expand 1 + +# The bottom window is a text widget with scrollbar +set f [frame $w.pane.bottom] +text $f.text -xscrollcommand "$f.xscr set" -yscrollcommand "$f.yscr set" \ + -width 30 -height 8 -wrap none +ttk::scrollbar $f.xscr -orient horizontal -command "$f.text xview" +ttk::scrollbar $f.yscr -orient vertical -command "$f.text yview" +grid $f.text $f.yscr -sticky nsew +grid $f.xscr -sticky nsew +grid columnconfigure $f 0 -weight 1 +grid rowconfigure $f 0 -weight 1 +$f.text insert 1.0 "This is just a normal text widget" + +# Now add our contents to the paned window +$w.pane add $w.pane.top $w.pane.bottom diff --git a/env/tcl/tk8.6/demos/pendulum.tcl b/env/tcl/tk8.6/demos/pendulum.tcl new file mode 100644 index 0000000..d344d8d --- /dev/null +++ b/env/tcl/tk8.6/demos/pendulum.tcl @@ -0,0 +1,197 @@ +# pendulum.tcl -- +# +# This demonstration illustrates how Tcl/Tk can be used to construct +# simulations of physical systems. + +if {![info exists widgetDemo]} { + error "This script should be run from the \"widget\" demo." +} + +package require Tk + +set w .pendulum +catch {destroy $w} +toplevel $w +wm title $w "Pendulum Animation Demonstration" +wm iconname $w "pendulum" +positionWindow $w + +label $w.msg -font $font -wraplength 4i -justify left -text "This demonstration shows how Tcl/Tk can be used to carry out animations that are linked to simulations of physical systems. In the left canvas is a graphical representation of the physical system itself, a simple pendulum, and in the right canvas is a graph of the phase space of the system, which is a plot of the angle (relative to the vertical) against the angular velocity. The pendulum bob may be repositioned by clicking and dragging anywhere on the left canvas." +pack $w.msg + +## See Code / Dismiss buttons +set btns [addSeeDismiss $w.buttons $w] +pack $btns -side bottom -fill x + +# Create some structural widgets +pack [panedwindow $w.p] -fill both -expand 1 +$w.p add [labelframe $w.p.l1 -text "Pendulum Simulation"] +$w.p add [labelframe $w.p.l2 -text "Phase Space"] + +# Create the canvas containing the graphical representation of the +# simulated system. +canvas $w.c -width 320 -height 200 -background white -bd 2 -relief sunken +$w.c create text 5 5 -anchor nw -text "Click to Adjust Bob Start Position" +# Coordinates of these items don't matter; they will be set properly below +$w.c create line 0 25 320 25 -tags plate -fill grey50 -width 2 +$w.c create oval 155 20 165 30 -tags pivot -fill grey50 -outline {} +$w.c create line 1 1 1 1 -tags rod -fill black -width 3 +$w.c create oval 1 1 2 2 -tags bob -fill yellow -outline black +pack $w.c -in $w.p.l1 -fill both -expand true + +# Create the canvas containing the phase space graph; this consists of +# a line that gets gradually paler as it ages, which is an extremely +# effective visual trick. +canvas $w.k -width 320 -height 200 -background white -bd 2 -relief sunken +$w.k create line 160 200 160 0 -fill grey75 -arrow last -tags y_axis +$w.k create line 0 100 320 100 -fill grey75 -arrow last -tags x_axis +for {set i 90} {$i>=0} {incr i -10} { + # Coordinates of these items don't matter; they will be set properly below + $w.k create line 0 0 1 1 -smooth true -tags graph$i -fill grey$i +} + +$w.k create text 0 0 -anchor ne -text "\u03b8" -tags label_theta +$w.k create text 0 0 -anchor ne -text "\u03b4\u03b8" -tags label_dtheta +pack $w.k -in $w.p.l2 -fill both -expand true + +# Initialize some variables +set points {} +set Theta 45.0 +set dTheta 0.0 +set pi 3.1415926535897933 +set length 150 +set home 160 + +# This procedure makes the pendulum appear at the correct place on the +# canvas. If the additional arguments "at $x $y" are passed (the 'at' +# is really just syntactic sugar) instead of computing the position of +# the pendulum from the length of the pendulum rod and its angle, the +# length and angle are computed in reverse from the given location +# (which is taken to be the centre of the pendulum bob.) +proc showPendulum {canvas {at {}} {x {}} {y {}}} { + global Theta dTheta pi length home + if {$at eq "at" && ($x!=$home || $y!=25)} { + set dTheta 0.0 + set x2 [expr {$x - $home}] + set y2 [expr {$y - 25}] + set length [expr {hypot($x2, $y2)}] + set Theta [expr {atan2($x2, $y2) * 180/$pi}] + } else { + set angle [expr {$Theta * $pi/180}] + set x [expr {$home + $length*sin($angle)}] + set y [expr {25 + $length*cos($angle)}] + } + $canvas coords rod $home 25 $x $y + $canvas coords bob \ + [expr {$x-15}] [expr {$y-15}] [expr {$x+15}] [expr {$y+15}] +} +showPendulum $w.c + +# Update the phase-space graph according to the current angle and the +# rate at which the angle is changing (the first derivative with +# respect to time.) +proc showPhase {canvas} { + global Theta dTheta points psw psh + lappend points [expr {$Theta+$psw}] [expr {-20*$dTheta+$psh}] + if {[llength $points] > 100} { + set points [lrange $points end-99 end] + } + for {set i 0} {$i<100} {incr i 10} { + set list [lrange $points end-[expr {$i-1}] end-[expr {$i-12}]] + if {[llength $list] >= 4} { + $canvas coords graph$i $list + } + } +} + +# Set up some bindings on the canvases. Note that when the user +# clicks we stop the animation until they release the mouse +# button. Also note that both canvases are sensitive to +# events, which allows them to find out when they have been resized by +# the user. +bind $w.c { + after cancel $animationCallbacks(pendulum) + unset animationCallbacks(pendulum) +} +bind $w.c <1> { + after cancel $animationCallbacks(pendulum) + showPendulum %W at %x %y +} +bind $w.c { + showPendulum %W at %x %y +} +bind $w.c { + showPendulum %W at %x %y + set animationCallbacks(pendulum) [after 15 repeat [winfo toplevel %W]] +} +bind $w.c { + %W coords plate 0 25 %w 25 + set home [expr %w/2] + %W coords pivot [expr $home-5] 20 [expr $home+5] 30 +} +bind $w.k { + set psh [expr %h/2] + set psw [expr %w/2] + %W coords x_axis 2 $psh [expr %w-2] $psh + %W coords y_axis $psw [expr %h-2] $psw 2 + %W coords label_dtheta [expr $psw-4] 6 + %W coords label_theta [expr %w-6] [expr $psh+4] +} + +# This procedure is the "business" part of the simulation that does +# simple numerical integration of the formula for a simple rotational +# pendulum. +proc recomputeAngle {} { + global Theta dTheta pi length + set scaling [expr {3000.0/$length/$length}] + + # To estimate the integration accurately, we really need to + # compute the end-point of our time-step. But to do *that*, we + # need to estimate the integration accurately! So we try this + # technique, which is inaccurate, but better than doing it in a + # single step. What we really want is bound up in the + # differential equation: + # .. - sin theta + # theta + theta = ----------- + # length + # But my math skills are not good enough to solve this! + + # first estimate + set firstDDTheta [expr {-sin($Theta * $pi/180)*$scaling}] + set midDTheta [expr {$dTheta + $firstDDTheta}] + set midTheta [expr {$Theta + ($dTheta + $midDTheta)/2}] + # second estimate + set midDDTheta [expr {-sin($midTheta * $pi/180)*$scaling}] + set midDTheta [expr {$dTheta + ($firstDDTheta + $midDDTheta)/2}] + set midTheta [expr {$Theta + ($dTheta + $midDTheta)/2}] + # Now we do a double-estimate approach for getting the final value + # first estimate + set midDDTheta [expr {-sin($midTheta * $pi/180)*$scaling}] + set lastDTheta [expr {$midDTheta + $midDDTheta}] + set lastTheta [expr {$midTheta + ($midDTheta + $lastDTheta)/2}] + # second estimate + set lastDDTheta [expr {-sin($lastTheta * $pi/180)*$scaling}] + set lastDTheta [expr {$midDTheta + ($midDDTheta + $lastDDTheta)/2}] + set lastTheta [expr {$midTheta + ($midDTheta + $lastDTheta)/2}] + # Now put the values back in our globals + set dTheta $lastDTheta + set Theta $lastTheta +} + +# This method ties together the simulation engine and the graphical +# display code that visualizes it. +proc repeat w { + global animationCallbacks + + # Simulate + recomputeAngle + + # Update the display + showPendulum $w.c + showPhase $w.k + + # Reschedule ourselves + set animationCallbacks(pendulum) [after 15 [list repeat $w]] +} +# Start the simulation after a short pause +set animationCallbacks(pendulum) [after 500 [list repeat $w]] diff --git a/env/tcl/tk8.6/demos/plot.tcl b/env/tcl/tk8.6/demos/plot.tcl new file mode 100644 index 0000000..e7f0361 --- /dev/null +++ b/env/tcl/tk8.6/demos/plot.tcl @@ -0,0 +1,97 @@ +# plot.tcl -- +# +# This demonstration script creates a canvas widget showing a 2-D +# plot with data points that can be dragged with the mouse. + +if {![info exists widgetDemo]} { + error "This script should be run from the \"widget\" demo." +} + +package require Tk + +set w .plot +catch {destroy $w} +toplevel $w +wm title $w "Plot Demonstration" +wm iconname $w "Plot" +positionWindow $w +set c $w.c + +label $w.msg -font $font -wraplength 4i -justify left -text "This window displays a canvas widget containing a simple 2-dimensional plot. You can doctor the data by dragging any of the points with mouse button 1." +pack $w.msg -side top + +## See Code / Dismiss buttons +set btns [addSeeDismiss $w.buttons $w] +pack $btns -side bottom -fill x + +canvas $c -relief raised -width 450 -height 300 +pack $w.c -side top -fill x + +set plotFont {Helvetica 18} + +$c create line 100 250 400 250 -width 2 +$c create line 100 250 100 50 -width 2 +$c create text 225 20 -text "A Simple Plot" -font $plotFont -fill brown + +for {set i 0} {$i <= 10} {incr i} { + set x [expr {100 + ($i*30)}] + $c create line $x 250 $x 245 -width 2 + $c create text $x 254 -text [expr {10*$i}] -anchor n -font $plotFont +} +for {set i 0} {$i <= 5} {incr i} { + set y [expr {250 - ($i*40)}] + $c create line 100 $y 105 $y -width 2 + $c create text 96 $y -text [expr {$i*50}].0 -anchor e -font $plotFont +} + +foreach point { + {12 56} {20 94} {33 98} {32 120} {61 180} {75 160} {98 223} +} { + set x [expr {100 + (3*[lindex $point 0])}] + set y [expr {250 - (4*[lindex $point 1])/5}] + set item [$c create oval [expr {$x-6}] [expr {$y-6}] \ + [expr {$x+6}] [expr {$y+6}] -width 1 -outline black \ + -fill SkyBlue2] + $c addtag point withtag $item +} + +$c bind point "$c itemconfig current -fill red" +$c bind point "$c itemconfig current -fill SkyBlue2" +$c bind point <1> "plotDown $c %x %y" +$c bind point "$c dtag selected" +bind $c "plotMove $c %x %y" + +set plot(lastX) 0 +set plot(lastY) 0 + +# plotDown -- +# This procedure is invoked when the mouse is pressed over one of the +# data points. It sets up state to allow the point to be dragged. +# +# Arguments: +# w - The canvas window. +# x, y - The coordinates of the mouse press. + +proc plotDown {w x y} { + global plot + $w dtag selected + $w addtag selected withtag current + $w raise current + set plot(lastX) $x + set plot(lastY) $y +} + +# plotMove -- +# This procedure is invoked during mouse motion events. It drags the +# current item. +# +# Arguments: +# w - The canvas window. +# x, y - The coordinates of the mouse. + +proc plotMove {w x y} { + global plot + $w move selected [expr {$x-$plot(lastX)}] [expr {$y-$plot(lastY)}] + set plot(lastX) $x + set plot(lastY) $y +} diff --git a/env/tcl/tk8.6/demos/puzzle.tcl b/env/tcl/tk8.6/demos/puzzle.tcl new file mode 100644 index 0000000..4f7f955 --- /dev/null +++ b/env/tcl/tk8.6/demos/puzzle.tcl @@ -0,0 +1,82 @@ +# puzzle.tcl -- +# +# This demonstration script creates a 15-puzzle game using a collection +# of buttons. + +if {![info exists widgetDemo]} { + error "This script should be run from the \"widget\" demo." +} + +package require Tk + +# puzzleSwitch -- +# This procedure is invoked when the user clicks on a particular button; +# if the button is next to the empty space, it moves the button into th +# empty space. + +proc puzzleSwitch {w num} { + global xpos ypos + if {(($ypos($num) >= ($ypos(space) - .01)) + && ($ypos($num) <= ($ypos(space) + .01)) + && ($xpos($num) >= ($xpos(space) - .26)) + && ($xpos($num) <= ($xpos(space) + .26))) + || (($xpos($num) >= ($xpos(space) - .01)) + && ($xpos($num) <= ($xpos(space) + .01)) + && ($ypos($num) >= ($ypos(space) - .26)) + && ($ypos($num) <= ($ypos(space) + .26)))} { + set tmp $xpos(space) + set xpos(space) $xpos($num) + set xpos($num) $tmp + set tmp $ypos(space) + set ypos(space) $ypos($num) + set ypos($num) $tmp + place $w.frame.$num -relx $xpos($num) -rely $ypos($num) + } +} + +set w .puzzle +catch {destroy $w} +toplevel $w +wm title $w "15-Puzzle Demonstration" +wm iconname $w "15-Puzzle" +positionWindow $w + +label $w.msg -font $font -wraplength 4i -justify left -text "A 15-puzzle appears below as a collection of buttons. Click on any of the pieces next to the space, and that piece will slide over the space. Continue this until the pieces are arranged in numerical order from upper-left to lower-right." +pack $w.msg -side top + +## See Code / Dismiss buttons +set btns [addSeeDismiss $w.buttons $w] +pack $btns -side bottom -fill x + +# Special trick: select a darker color for the space by creating a +# scrollbar widget and using its trough color. + +scrollbar $w.s + +# The button metrics are a bit bigger in Aqua, and since we are +# using place which doesn't autosize, then we need to have a +# slightly larger frame here... + +if {[tk windowingsystem] eq "aqua"} { + set frameSize 168 +} else { + set frameSize 120 +} + +frame $w.frame -width $frameSize -height $frameSize -borderwidth 2\ + -relief sunken -bg [$w.s cget -troughcolor] +pack $w.frame -side top -pady 1c -padx 1c +destroy $w.s + +set order {3 1 6 2 5 7 15 13 4 11 8 9 14 10 12} +for {set i 0} {$i < 15} {set i [expr {$i+1}]} { + set num [lindex $order $i] + set xpos($num) [expr {($i%4)*.25}] + set ypos($num) [expr {($i/4)*.25}] + button $w.frame.$num -relief raised -text $num -highlightthickness 0 \ + -command "puzzleSwitch $w $num" + place $w.frame.$num -relx $xpos($num) -rely $ypos($num) \ + -relwidth .25 -relheight .25 +} +set xpos(space) .75 +set ypos(space) .75 diff --git a/env/tcl/tk8.6/demos/radio.tcl b/env/tcl/tk8.6/demos/radio.tcl new file mode 100644 index 0000000..5c73703 --- /dev/null +++ b/env/tcl/tk8.6/demos/radio.tcl @@ -0,0 +1,66 @@ +# radio.tcl -- +# +# This demonstration script creates a toplevel window containing +# several radiobutton widgets. + +if {![info exists widgetDemo]} { + error "This script should be run from the \"widget\" demo." +} + +package require Tk + +set w .radio +catch {destroy $w} +toplevel $w +wm title $w "Radiobutton Demonstration" +wm iconname $w "radio" +positionWindow $w +label $w.msg -font $font -wraplength 5i -justify left -text "Three groups of radiobuttons are displayed below. If you click on a button then the button will become selected exclusively among all the buttons in its group. A Tcl variable is associated with each group to indicate which of the group's buttons is selected. When the 'Tristate' button is pressed, the radio buttons will display the tri-state mode. Selecting any radio button will return the buttons to their respective on/off state. Click the \"See Variables\" button to see the current values of the variables." +grid $w.msg -row 0 -column 0 -columnspan 3 -sticky nsew + +## See Code / Dismiss buttons +set btns [addSeeDismiss $w.buttons $w [list size color align]] +grid $btns -row 3 -column 0 -columnspan 3 -sticky ew + +labelframe $w.left -pady 2 -text "Point Size" -padx 2 +labelframe $w.mid -pady 2 -text "Color" -padx 2 +labelframe $w.right -pady 2 -text "Alignment" -padx 2 +button $w.tristate -text Tristate -command "set size multi; set color multi" \ + -pady 2 -padx 2 +if {[tk windowingsystem] eq "aqua"} { + $w.tristate configure -padx 10 +} +grid $w.left -column 0 -row 1 -pady .5c -padx .5c -rowspan 2 +grid $w.mid -column 1 -row 1 -pady .5c -padx .5c -rowspan 2 +grid $w.right -column 2 -row 1 -pady .5c -padx .5c +grid $w.tristate -column 2 -row 2 -pady .5c -padx .5c + +foreach i {10 12 14 18 24} { + radiobutton $w.left.b$i -text "Point Size $i" -variable size \ + -relief flat -value $i -tristatevalue "multi" + pack $w.left.b$i -side top -pady 2 -anchor w -fill x +} + +foreach c {Red Green Blue Yellow Orange Purple} { + set lower [string tolower $c] + radiobutton $w.mid.$lower -text $c -variable color \ + -relief flat -value $lower -anchor w \ + -command "$w.mid configure -fg \$color" \ + -tristatevalue "multi" + pack $w.mid.$lower -side top -pady 2 -fill x +} + + +label $w.right.l -text "Label" -bitmap questhead -compound left +$w.right.l configure -width [winfo reqwidth $w.right.l] -compound top +$w.right.l configure -height [winfo reqheight $w.right.l] +foreach a {Top Left Right Bottom} { + set lower [string tolower $a] + radiobutton $w.right.$lower -text $a -variable align \ + -relief flat -value $lower -indicatoron 0 -width 7 \ + -command "$w.right.l configure -compound \$align" +} + +grid x $w.right.top +grid $w.right.left $w.right.l $w.right.right +grid x $w.right.bottom diff --git a/env/tcl/tk8.6/demos/rmt b/env/tcl/tk8.6/demos/rmt new file mode 100644 index 0000000..00bdc9d --- /dev/null +++ b/env/tcl/tk8.6/demos/rmt @@ -0,0 +1,210 @@ +#!/bin/sh +# the next line restarts using wish \ +exec wish "$0" ${1+"$@"} + +# rmt -- +# This script implements a simple remote-control mechanism for +# Tk applications. It allows you to select an application and +# then type commands to that application. + +package require Tk + +wm title . "Tk Remote Controller" +wm iconname . "Tk Remote" +wm minsize . 1 1 + +# The global variable below keeps track of the remote application +# that we're sending to. If it's an empty string then we execute +# the commands locally. + +set app "local" + +# The global variable below keeps track of whether we're in the +# middle of executing a command entered via the text. + +set executing 0 + +# The global variable below keeps track of the last command executed, +# so it can be re-executed in response to !! commands. + +set lastCommand "" + +# Create menu bar. Arrange to recreate all the information in the +# applications sub-menu whenever it is cascaded to. + +. configure -menu [menu .menu] +menu .menu.file +menu .menu.file.apps -postcommand fillAppsMenu +.menu add cascade -label "File" -underline 0 -menu .menu.file +.menu.file add cascade -label "Select Application" -underline 0 \ + -menu .menu.file.apps +.menu.file add command -label "Quit" -command "destroy ." -underline 0 + +# Create text window and scrollbar. + +text .t -yscrollcommand ".s set" -setgrid true +scrollbar .s -command ".t yview" +grid .t .s -sticky nsew +grid rowconfigure . 0 -weight 1 +grid columnconfigure . 0 -weight 1 + +# Create a binding to forward commands to the target application, +# plus modify many of the built-in bindings so that only information +# in the current command can be deleted (can still set the cursor +# earlier in the text and select and insert; just can't delete). + +bindtags .t {.t Text . all} +bind .t { + .t mark set insert {end - 1c} + .t insert insert \n + invoke + break +} +bind .t { + catch {.t tag remove sel sel.first promptEnd} + if {[.t tag nextrange sel 1.0 end] eq ""} { + if {[.t compare insert < promptEnd]} { + break + } + } +} +bind .t { + catch {.t tag remove sel sel.first promptEnd} + if {[.t tag nextrange sel 1.0 end] eq ""} { + if {[.t compare insert <= promptEnd]} { + break + } + } +} +bind .t { + if {[.t compare insert < promptEnd]} { + break + } +} +bind .t { + if {[.t compare insert < promptEnd]} { + .t mark set insert promptEnd + } +} +bind .t { + if {[.t compare insert < promptEnd]} { + break + } +} +bind .t { + if {[.t compare insert < promptEnd]} { + break + } +} +bind .t { + if {[.t compare insert <= promptEnd]} { + break + } +} +bind .t { + if {[.t compare insert <= promptEnd]} { + break + } +} +### This next bit *isn't* nice - DKF ### +auto_load tk::TextInsert +proc tk::TextInsert {w s} { + if {$s eq ""} { + return + } + catch { + if { + [$w compare sel.first <= insert] && [$w compare sel.last >= insert] + } then { + $w tag remove sel sel.first promptEnd + $w delete sel.first sel.last + } + } + $w insert insert $s + $w see insert +} + +.t configure -font {Courier 12} +.t tag configure bold -font {Courier 12 bold} + +# The procedure below is used to print out a prompt at the +# insertion point (which should be at the beginning of a line +# right now). + +proc prompt {} { + global app + .t insert insert "$app: " + .t mark set promptEnd {insert} + .t mark gravity promptEnd left + .t tag add bold {promptEnd linestart} promptEnd +} + +# The procedure below executes a command (it takes everything on the +# current line after the prompt and either sends it to the remote +# application or executes it locally, depending on "app". + +proc invoke {} { + global app executing lastCommand + set cmd [.t get promptEnd insert] + incr executing 1 + if {[info complete $cmd]} { + if {$cmd eq "!!\n"} { + set cmd $lastCommand + } else { + set lastCommand $cmd + } + if {$app eq "local"} { + set result [catch [list uplevel #0 $cmd] msg] + } else { + set result [catch [list send $app $cmd] msg] + } + if {$result != 0} { + .t insert insert "Error: $msg\n" + } elseif {$msg ne ""} { + .t insert insert $msg\n + } + prompt + .t mark set promptEnd insert + } + incr executing -1 + .t yview -pickplace insert +} + +# The following procedure is invoked to change the application that +# we're talking to. It also updates the prompt for the current +# command, unless we're in the middle of executing a command from +# the text item (in which case a new prompt is about to be output +# so there's no need to change the old one). + +proc newApp appName { + global app executing + set app $appName + if {!$executing} { + .t mark gravity promptEnd right + .t delete "promptEnd linestart" promptEnd + .t insert promptEnd "$appName: " + .t tag add bold "promptEnd linestart" promptEnd + .t mark gravity promptEnd left + } + return +} + +# The procedure below will fill in the applications sub-menu with a list +# of all the applications that currently exist. + +proc fillAppsMenu {} { + set m .menu.file.apps + catch {$m delete 0 last} + foreach i [lsort [winfo interps]] { + $m add command -label $i -command [list newApp $i] + } + $m add command -label local -command {newApp local} +} + +set app [winfo name .] +prompt +focus .t + +# Local Variables: +# mode: tcl +# End: diff --git a/env/tcl/tk8.6/demos/rolodex b/env/tcl/tk8.6/demos/rolodex new file mode 100644 index 0000000..8941570 --- /dev/null +++ b/env/tcl/tk8.6/demos/rolodex @@ -0,0 +1,204 @@ +#!/bin/sh +# the next line restarts using wish \ +exec wish "$0" ${1+"$@"} + +# rolodex -- +# This script was written as an entry in Tom LaStrange's rolodex +# benchmark. It creates something that has some of the look and +# feel of a rolodex program, although it's lifeless and doesn't +# actually do the rolodex application. + +package require Tk + +foreach i [winfo child .] { + catch {destroy $i} +} + +set version 1.2 + +#------------------------------------------ +# Phase 0: create the front end. +#------------------------------------------ + +frame .frame -relief flat +pack .frame -side top -fill y -anchor center + +set names {{} Name: Address: {} {} {Home Phone:} {Work Phone:} Fax:} +foreach i {1 2 3 4 5 6 7} { + label .frame.label$i -text [lindex $names $i] -anchor e + entry .frame.entry$i -width 35 + grid .frame.label$i .frame.entry$i -sticky ew -pady 2 -padx 1 +} + +frame .buttons +pack .buttons -side bottom -pady 2 -anchor center +button .buttons.clear -text Clear +button .buttons.add -text Add +button .buttons.search -text Search +button .buttons.delete -text "Delete ..." +pack .buttons.clear .buttons.add .buttons.search .buttons.delete \ + -side left -padx 2 + +#------------------------------------------ +# Phase 1: Add menus, dialog boxes +#------------------------------------------ + +# DKF - note that this is an old-style menu bar; I just have not yet +# got around to converting the context help code to work with the new +# menu system and its <> virtual event. + +frame .menu -relief raised -borderwidth 1 +pack .menu -before .frame -side top -fill x + +menubutton .menu.file -text "File" -menu .menu.file.m -underline 0 +menu .menu.file.m +.menu.file.m add command -label "Load ..." -command fileAction -underline 0 +.menu.file.m add command -label "Exit" -command {destroy .} -underline 0 +pack .menu.file -side left + +menubutton .menu.help -text "Help" -menu .menu.help.m -underline 0 +menu .menu.help.m +pack .menu.help -side right + +proc deleteAction {} { + if {[tk_dialog .delete {Confirm Action} {Are you sure?} {} 0 Cancel] + == 0} { + clearAction + } +} +.buttons.delete config -command deleteAction + +proc fileAction {} { + tk_dialog .fileSelection {File Selection} {This is a dummy file selection dialog box, which is used because there isn't a good file selection dialog built into Tk yet.} {} 0 OK + puts stderr {dummy file name} +} + +#------------------------------------------ +# Phase 3: Print contents of card +#------------------------------------------ + +proc addAction {} { + global names + foreach i {1 2 3 4 5 6 7} { + puts stderr [format "%-12s %s" [lindex $names $i] [.frame.entry$i get]] + } +} +.buttons.add config -command addAction + +#------------------------------------------ +# Phase 4: Miscellaneous other actions +#------------------------------------------ + +proc clearAction {} { + foreach i {1 2 3 4 5 6 7} { + .frame.entry$i delete 0 end + } +} +.buttons.clear config -command clearAction + +proc fillCard {} { + clearAction + .frame.entry1 insert 0 "John Ousterhout" + .frame.entry2 insert 0 "CS Division, Department of EECS" + .frame.entry3 insert 0 "University of California" + .frame.entry4 insert 0 "Berkeley, CA 94720" + .frame.entry5 insert 0 "private" + .frame.entry6 insert 0 "510-642-0865" + .frame.entry7 insert 0 "510-642-5775" +} +.buttons.search config -command "addAction; fillCard" + +#---------------------------------------------------- +# Phase 5: Accelerators, mnemonics, command-line info +#---------------------------------------------------- + +.buttons.clear config -text "Clear Ctrl+C" +bind . clearAction +.buttons.add config -text "Add Ctrl+A" +bind . addAction +.buttons.search config -text "Search Ctrl+S" +bind . "addAction; fillCard" +.buttons.delete config -text "Delete... Ctrl+D" +bind . deleteAction + +.menu.file.m entryconfig 1 -accel Ctrl+F +bind . fileAction +.menu.file.m entryconfig 2 -accel Ctrl+Q +bind . {destroy .} + +focus .frame.entry1 + +#---------------------------------------------------- +# Phase 6: help +#---------------------------------------------------- + +proc Help {topic {x 0} {y 0}} { + global helpTopics helpCmds + if {$topic == ""} return + while {[info exists helpCmds($topic)]} { + set topic [eval $helpCmds($topic)] + } + if [info exists helpTopics($topic)] { + set msg $helpTopics($topic) + } else { + set msg "Sorry, but no help is available for this topic" + } + tk_dialog .help {Rolodex Help} "Information on $topic:\n\n$msg" \ + {} 0 OK +} + +proc getMenuTopic {w x y} { + return $w.[$w index @[expr {$y-[winfo rooty $w]}]] +} + +event add <> +bind . <> {Help [winfo containing %X %Y] %X %Y} +bind Menu <> {Help [winfo containing %X %Y] %X %Y} + +# Help text and commands follow: + +set helpTopics(.menu.file) {This is the "file" menu. It can be used to invoke some overall operations on the rolodex applications, such as loading a file or exiting.} + +set helpCmds(.menu.file.m) {getMenuTopic $topic $x $y} +set helpTopics(.menu.file.m.1) {The "Load" entry in the "File" menu posts a dialog box that you can use to select a rolodex file} +set helpTopics(.menu.file.m.2) {The "Exit" entry in the "File" menu causes the rolodex application to terminate} +set helpCmds(.menu.file.m.none) {set topic ".menu.file"} + +set helpTopics(.frame.entry1) {In this field of the rolodex entry you should type the person's name} +set helpTopics(.frame.entry2) {In this field of the rolodex entry you should type the first line of the person's address} +set helpTopics(.frame.entry3) {In this field of the rolodex entry you should type the second line of the person's address} +set helpTopics(.frame.entry4) {In this field of the rolodex entry you should type the third line of the person's address} +set helpTopics(.frame.entry5) {In this field of the rolodex entry you should type the person's home phone number, or "private" if the person doesn't want his or her number publicized} +set helpTopics(.frame.entry6) {In this field of the rolodex entry you should type the person's work phone number} +set helpTopics(.frame.entry7) {In this field of the rolodex entry you should type the phone number for the person's FAX machine} + +set helpCmds(.frame.label1) {set topic .frame.entry1} +set helpCmds(.frame.label2) {set topic .frame.entry2} +set helpCmds(.frame.label3) {set topic .frame.entry3} +set helpCmds(.frame.label4) {set topic .frame.entry4} +set helpCmds(.frame.label5) {set topic .frame.entry5} +set helpCmds(.frame.label6) {set topic .frame.entry6} +set helpCmds(.frame.label7) {set topic .frame.entry7} + +set helpTopics(context) {Unfortunately, this application doesn't support context-sensitive help in the usual way, because when this demo was written Tk didn't have a grab mechanism and this is needed for context-sensitive help. Instead, you can achieve much the same effect by simply moving the mouse over the window you're curious about and pressing the Help or F1 keys. You can do this anytime.} +set helpTopics(help) {This application provides only very crude help. Besides the entries in this menu, you can get help on individual windows by moving the mouse cursor over the window and pressing the Help or F1 keys.} +set helpTopics(window) {This window is a dummy rolodex application created as part of Tom LaStrange's toolkit benchmark. It doesn't really do anything useful except to demonstrate a few features of the Tk toolkit.} +set helpTopics(keys) "The following accelerator keys are defined for this application (in addition to those already available for the entry windows):\n\nCtrl+A:\t\tAdd\nCtrl+C:\t\tClear\nCtrl+D:\t\tDelete\nCtrl+F:\t\tEnter file name\nCtrl+Q:\t\tExit application (quit)\nCtrl+S:\t\tSearch (dummy operation)" +set helpTopics(version) "This is version $version." + +# Entries in "Help" menu + +.menu.help.m add command -label "On Context..." -command {Help context} \ + -underline 3 +.menu.help.m add command -label "On Help..." -command {Help help} \ + -underline 3 +.menu.help.m add command -label "On Window..." -command {Help window} \ + -underline 3 +.menu.help.m add command -label "On Keys..." -command {Help keys} \ + -underline 3 +.menu.help.m add command -label "On Version..." -command {Help version} \ + -underline 3 + +# Local Variables: +# mode: tcl +# End: diff --git a/env/tcl/tk8.6/demos/ruler.tcl b/env/tcl/tk8.6/demos/ruler.tcl new file mode 100644 index 0000000..557b680 --- /dev/null +++ b/env/tcl/tk8.6/demos/ruler.tcl @@ -0,0 +1,171 @@ +# ruler.tcl -- +# +# This demonstration script creates a canvas widget that displays a ruler +# with tab stops that can be set, moved, and deleted. + +if {![info exists widgetDemo]} { + error "This script should be run from the \"widget\" demo." +} + +package require Tk + +# rulerMkTab -- +# This procedure creates a new triangular polygon in a canvas to +# represent a tab stop. +# +# Arguments: +# c - The canvas window. +# x, y - Coordinates at which to create the tab stop. + +proc rulerMkTab {c x y} { + upvar #0 demo_rulerInfo v + $c create polygon $x $y [expr {$x+$v(size)}] [expr {$y+$v(size)}] \ + [expr {$x-$v(size)}] [expr {$y+$v(size)}] +} + +set w .ruler +catch {destroy $w} +toplevel $w +wm title $w "Ruler Demonstration" +wm iconname $w "ruler" +positionWindow $w +set c $w.c + +label $w.msg -font $font -wraplength 5i -justify left -text "This canvas widget shows a mock-up of a ruler. You can create tab stops by dragging them out of the well to the right of the ruler. You can also drag existing tab stops. If you drag a tab stop far enough up or down so that it turns dim, it will be deleted when you release the mouse button." +pack $w.msg -side top + +## See Code / Dismiss buttons +set btns [addSeeDismiss $w.buttons $w] +pack $btns -side bottom -fill x + +canvas $c -width 14.8c -height 2.5c +pack $w.c -side top -fill x + +set demo_rulerInfo(grid) .25c +set demo_rulerInfo(left) [winfo fpixels $c 1c] +set demo_rulerInfo(right) [winfo fpixels $c 13c] +set demo_rulerInfo(top) [winfo fpixels $c 1c] +set demo_rulerInfo(bottom) [winfo fpixels $c 1.5c] +set demo_rulerInfo(size) [winfo fpixels $c .2c] +set demo_rulerInfo(normalStyle) "-fill black" +# Main widget program sets variable tk_demoDirectory +if {[winfo depth $c] > 1} { + set demo_rulerInfo(activeStyle) "-fill red -stipple {}" + set demo_rulerInfo(deleteStyle) [list -fill red \ + -stipple @[file join $tk_demoDirectory images gray25.xbm]] +} else { + set demo_rulerInfo(activeStyle) "-fill black -stipple {}" + set demo_rulerInfo(deleteStyle) [list -fill black \ + -stipple @[file join $tk_demoDirectory images gray25.xbm]] +} + +$c create line 1c 0.5c 1c 1c 13c 1c 13c 0.5c -width 1 +for {set i 0} {$i < 12} {incr i} { + set x [expr {$i+1}] + $c create line ${x}c 1c ${x}c 0.6c -width 1 + $c create line $x.25c 1c $x.25c 0.8c -width 1 + $c create line $x.5c 1c $x.5c 0.7c -width 1 + $c create line $x.75c 1c $x.75c 0.8c -width 1 + $c create text $x.15c .75c -text $i -anchor sw +} +$c addtag well withtag [$c create rect 13.2c 1c 13.8c 0.5c \ + -outline black -fill [lindex [$c config -bg] 4]] +$c addtag well withtag [rulerMkTab $c [winfo pixels $c 13.5c] \ + [winfo pixels $c .65c]] + +$c bind well <1> "rulerNewTab $c %x %y" +$c bind tab <1> "rulerSelectTab $c %x %y" +bind $c "rulerMoveTab $c %x %y" +bind $c "rulerReleaseTab $c" + +# rulerNewTab -- +# Does all the work of creating a tab stop, including creating the +# triangle object and adding tags to it to give it tab behavior. +# +# Arguments: +# c - The canvas window. +# x, y - The coordinates of the tab stop. + +proc rulerNewTab {c x y} { + upvar #0 demo_rulerInfo v + $c addtag active withtag [rulerMkTab $c $x $y] + $c addtag tab withtag active + set v(x) $x + set v(y) $y + rulerMoveTab $c $x $y +} + +# rulerSelectTab -- +# This procedure is invoked when mouse button 1 is pressed over +# a tab. It remembers information about the tab so that it can +# be dragged interactively. +# +# Arguments: +# c - The canvas widget. +# x, y - The coordinates of the mouse (identifies the point by +# which the tab was picked up for dragging). + +proc rulerSelectTab {c x y} { + upvar #0 demo_rulerInfo v + set v(x) [$c canvasx $x $v(grid)] + set v(y) [expr {$v(top)+2}] + $c addtag active withtag current + eval "$c itemconf active $v(activeStyle)" + $c raise active +} + +# rulerMoveTab -- +# This procedure is invoked during mouse motion events to drag a tab. +# It adjusts the position of the tab, and changes its appearance if +# it is about to be dragged out of the ruler. +# +# Arguments: +# c - The canvas widget. +# x, y - The coordinates of the mouse. + +proc rulerMoveTab {c x y} { + upvar #0 demo_rulerInfo v + if {[$c find withtag active] == ""} { + return + } + set cx [$c canvasx $x $v(grid)] + set cy [$c canvasy $y] + if {$cx < $v(left)} { + set cx $v(left) + } + if {$cx > $v(right)} { + set cx $v(right) + } + if {($cy >= $v(top)) && ($cy <= $v(bottom))} { + set cy [expr {$v(top)+2}] + eval "$c itemconf active $v(activeStyle)" + } else { + set cy [expr {$cy-$v(size)-2}] + eval "$c itemconf active $v(deleteStyle)" + } + $c move active [expr {$cx-$v(x)}] [expr {$cy-$v(y)}] + set v(x) $cx + set v(y) $cy +} + +# rulerReleaseTab -- +# This procedure is invoked during button release events that end +# a tab drag operation. It deselects the tab and deletes the tab if +# it was dragged out of the ruler. +# +# Arguments: +# c - The canvas widget. +# x, y - The coordinates of the mouse. + +proc rulerReleaseTab c { + upvar #0 demo_rulerInfo v + if {[$c find withtag active] == {}} { + return + } + if {$v(y) != $v(top)+2} { + $c delete active + } else { + eval "$c itemconf active $v(normalStyle)" + $c dtag active + } +} diff --git a/env/tcl/tk8.6/demos/sayings.tcl b/env/tcl/tk8.6/demos/sayings.tcl new file mode 100644 index 0000000..aa3479c --- /dev/null +++ b/env/tcl/tk8.6/demos/sayings.tcl @@ -0,0 +1,44 @@ +# sayings.tcl -- +# +# This demonstration script creates a listbox that can be scrolled +# both horizontally and vertically. It displays a collection of +# well-known sayings. + +if {![info exists widgetDemo]} { + error "This script should be run from the \"widget\" demo." +} + +package require Tk + +set w .sayings +catch {destroy $w} +toplevel $w +wm title $w "Listbox Demonstration (well-known sayings)" +wm iconname $w "sayings" +positionWindow $w + +label $w.msg -font $font -wraplength 4i -justify left -text "The listbox below contains a collection of well-known sayings. You can scan the list using either of the scrollbars or by dragging in the listbox window with button 2 pressed." +pack $w.msg -side top + +## See Code / Dismiss buttons +set btns [addSeeDismiss $w.buttons $w] +pack $btns -side bottom -fill x + +frame $w.frame -borderwidth 10 +pack $w.frame -side top -expand yes -fill both -padx 1c + + +ttk::scrollbar $w.frame.yscroll -command "$w.frame.list yview" +ttk::scrollbar $w.frame.xscroll -orient horizontal \ + -command "$w.frame.list xview" +listbox $w.frame.list -width 20 -height 10 -setgrid 1 \ + -yscroll "$w.frame.yscroll set" -xscroll "$w.frame.xscroll set" + +grid $w.frame.list -row 0 -column 0 -rowspan 1 -columnspan 1 -sticky news +grid $w.frame.yscroll -row 0 -column 1 -rowspan 1 -columnspan 1 -sticky news +grid $w.frame.xscroll -row 1 -column 0 -rowspan 1 -columnspan 1 -sticky news +grid rowconfig $w.frame 0 -weight 1 -minsize 0 +grid columnconfig $w.frame 0 -weight 1 -minsize 0 + + +$w.frame.list insert 0 "Don't speculate, measure" "Waste not, want not" "Early to bed and early to rise makes a man healthy, wealthy, and wise" "Ask not what your country can do for you, ask what you can do for your country" "I shall return" "NOT" "A picture is worth a thousand words" "User interfaces are hard to build" "Thou shalt not steal" "A penny for your thoughts" "Fool me once, shame on you; fool me twice, shame on me" "Every cloud has a silver lining" "Where there's smoke there's fire" "It takes one to know one" "Curiosity killed the cat" "Take this job and shove it" "Up a creek without a paddle" "I'm mad as hell and I'm not going to take it any more" "An apple a day keeps the doctor away" "Don't look a gift horse in the mouth" "Measure twice, cut once" diff --git a/env/tcl/tk8.6/demos/search.tcl b/env/tcl/tk8.6/demos/search.tcl new file mode 100644 index 0000000..a1a3d7f --- /dev/null +++ b/env/tcl/tk8.6/demos/search.tcl @@ -0,0 +1,139 @@ +# search.tcl -- +# +# This demonstration script creates a collection of widgets that +# allow you to load a file into a text widget, then perform searches +# on that file. + +if {![info exists widgetDemo]} { + error "This script should be run from the \"widget\" demo." +} + +package require Tk + +# textLoadFile -- +# This procedure below loads a file into a text widget, discarding +# the previous contents of the widget. Tags for the old widget are +# not affected, however. +# +# Arguments: +# w - The window into which to load the file. Must be a +# text widget. +# file - The name of the file to load. Must be readable. + +proc textLoadFile {w file} { + set f [open $file] + $w delete 1.0 end + while {![eof $f]} { + $w insert end [read $f 10000] + } + close $f +} + +# textSearch -- +# Search for all instances of a given string in a text widget and +# apply a given tag to each instance found. +# +# Arguments: +# w - The window in which to search. Must be a text widget. +# string - The string to search for. The search is done using +# exact matching only; no special characters. +# tag - Tag to apply to each instance of a matching string. + +proc textSearch {w string tag} { + $w tag remove search 0.0 end + if {$string == ""} { + return + } + set cur 1.0 + while 1 { + set cur [$w search -count length $string $cur end] + if {$cur == ""} { + break + } + $w tag add $tag $cur "$cur + $length char" + set cur [$w index "$cur + $length char"] + } +} + +# textToggle -- +# This procedure is invoked repeatedly to invoke two commands at +# periodic intervals. It normally reschedules itself after each +# execution but if an error occurs (e.g. because the window was +# deleted) then it doesn't reschedule itself. +# +# Arguments: +# cmd1 - Command to execute when procedure is called. +# sleep1 - Ms to sleep after executing cmd1 before executing cmd2. +# cmd2 - Command to execute in the *next* invocation of this +# procedure. +# sleep2 - Ms to sleep after executing cmd2 before executing cmd1 again. + +proc textToggle {cmd1 sleep1 cmd2 sleep2} { + catch { + eval $cmd1 + after $sleep1 [list textToggle $cmd2 $sleep2 $cmd1 $sleep1] + } +} + +set w .search +catch {destroy $w} +toplevel $w +wm title $w "Text Demonstration - Search and Highlight" +wm iconname $w "search" +positionWindow $w + +## See Code / Dismiss buttons +set btns [addSeeDismiss $w.buttons $w] +pack $btns -side bottom -fill x + +frame $w.file +label $w.file.label -text "File name:" -width 13 -anchor w +entry $w.file.entry -width 40 -textvariable fileName +button $w.file.button -text "Load File" \ + -command "textLoadFile $w.text \$fileName" +pack $w.file.label $w.file.entry -side left +pack $w.file.button -side left -pady 5 -padx 10 +bind $w.file.entry " + textLoadFile $w.text \$fileName + focus $w.string.entry +" +focus $w.file.entry + +frame $w.string +label $w.string.label -text "Search string:" -width 13 -anchor w +entry $w.string.entry -width 40 -textvariable searchString +button $w.string.button -text "Highlight" \ + -command "textSearch $w.text \$searchString search" +pack $w.string.label $w.string.entry -side left +pack $w.string.button -side left -pady 5 -padx 10 +bind $w.string.entry "textSearch $w.text \$searchString search" + +text $w.text -yscrollcommand "$w.scroll set" -setgrid true +ttk::scrollbar $w.scroll -command "$w.text yview" +pack $w.file $w.string -side top -fill x +pack $w.scroll -side right -fill y +pack $w.text -expand yes -fill both + +# Set up display styles for text highlighting. + +if {[winfo depth $w] > 1} { + textToggle "$w.text tag configure search -background \ + #ce5555 -foreground white" 800 "$w.text tag configure \ + search -background {} -foreground {}" 200 +} else { + textToggle "$w.text tag configure search -background \ + black -foreground white" 800 "$w.text tag configure \ + search -background {} -foreground {}" 200 +} +$w.text insert 1.0 \ +{This window demonstrates how to use the tagging facilities in text +widgets to implement a searching mechanism. First, type a file name +in the top entry, then type or click on "Load File". Then +type a string in the lower entry and type or click on +"Load File". This will cause all of the instances of the string to +be tagged with the tag "search", and it will arrange for the tag's +display attributes to change to make all of the strings blink.} +$w.text mark set insert 0.0 + +set fileName "" +set searchString "" diff --git a/env/tcl/tk8.6/demos/spin.tcl b/env/tcl/tk8.6/demos/spin.tcl new file mode 100644 index 0000000..d897e6d --- /dev/null +++ b/env/tcl/tk8.6/demos/spin.tcl @@ -0,0 +1,53 @@ +# spin.tcl -- +# +# This demonstration script creates several spinbox widgets. + +if {![info exists widgetDemo]} { + error "This script should be run from the \"widget\" demo." +} + +package require Tk + +set w .spin +catch {destroy $w} +toplevel $w +wm title $w "Spinbox Demonstration" +wm iconname $w "spin" +positionWindow $w + +label $w.msg -font $font -wraplength 5i -justify left -text "Three different\ + spin-boxes are displayed below. You can add characters by pointing,\ + clicking and typing. The normal Motif editing characters are\ + supported, along with many Emacs bindings. For example, Backspace\ + and Control-h delete the character to the left of the insertion\ + cursor and Delete and Control-d delete the chararacter to the right\ + of the insertion cursor. For values that are too large to fit in the\ + window all at once, you can scan through the value by dragging with\ + mouse button2 pressed. Note that the first spin-box will only permit\ + you to type in integers, and the third selects from a list of\ + Australian cities." +pack $w.msg -side top + +## See Code / Dismiss buttons +set btns [addSeeDismiss $w.buttons $w] +pack $btns -side bottom -fill x + +set australianCities { + Canberra Sydney Melbourne Perth Adelaide Brisbane + Hobart Darwin "Alice Springs" +} + +spinbox $w.s1 -from 1 -to 10 -width 10 -validate key \ + -vcmd {string is integer %P} +spinbox $w.s2 -from 0 -to 3 -increment .5 -format %05.2f -width 10 +spinbox $w.s3 -values $australianCities -width 10 + +#entry $w.e1 +#entry $w.e2 +#entry $w.e3 +pack $w.s1 $w.s2 $w.s3 -side top -pady 5 -padx 10 ;#-fill x + +#$w.e1 insert 0 "Initial value" +#$w.e2 insert end "This entry contains a long value, much too long " +#$w.e2 insert end "to fit in the window at one time, so long in fact " +#$w.e2 insert end "that you'll have to scan or scroll to see the end." diff --git a/env/tcl/tk8.6/demos/square b/env/tcl/tk8.6/demos/square new file mode 100644 index 0000000..1d7eb20 --- /dev/null +++ b/env/tcl/tk8.6/demos/square @@ -0,0 +1,60 @@ +#!/bin/sh +# the next line restarts using wish \ +exec wish "$0" ${1+"$@"} + +# square -- +# This script generates a demo application containing only a "square" +# widget. It's only usable in the "tktest" application or if Tk has +# been compiled with tkSquare.c. This demo arranges the following +# bindings for the widget: +# +# Button-1 press/drag: moves square to mouse +# "a": toggle size animation on/off + +package require Tk ;# We use Tk generally, and... +package require Tktest ;# ... we use the square widget too. + +square .s +pack .s -expand yes -fill both +wm minsize . 1 1 + +bind .s <1> {center %x %y} +bind .s {center %x %y} +bind .s a animate +focus .s + +# The procedure below centers the square on a given position. + +proc center {x y} { + set a [.s size] + .s position [expr $x-($a/2)] [expr $y-($a/2)] +} + +# The procedures below provide a simple form of animation where +# the box changes size in a pulsing pattern: larger, smaller, larger, +# and so on. + +set inc 0 +proc animate {} { + global inc + if {$inc == 0} { + set inc 3 + timer + } else { + set inc 0 + } +} + +proc timer {} { + global inc + set s [.s size] + if {$inc == 0} return + if {$s >= 40} {set inc -3} + if {$s <= 10} {set inc 3} + .s size [expr {$s+$inc}] + after 30 timer +} + +# Local Variables: +# mode: tcl +# End: diff --git a/env/tcl/tk8.6/demos/states.tcl b/env/tcl/tk8.6/demos/states.tcl new file mode 100644 index 0000000..aeb3d5b --- /dev/null +++ b/env/tcl/tk8.6/demos/states.tcl @@ -0,0 +1,54 @@ +# states.tcl -- +# +# This demonstration script creates a listbox widget that displays +# the names of the 50 states in the United States of America. + +if {![info exists widgetDemo]} { + error "This script should be run from the \"widget\" demo." +} + +package require Tk + +set w .states +catch {destroy $w} +toplevel $w +wm title $w "Listbox Demonstration (50 states)" +wm iconname $w "states" +positionWindow $w + +label $w.msg -font $font -wraplength 4i -justify left -text "A listbox containing the 50 states is displayed below, along with a scrollbar. You can scan the list either using the scrollbar or by scanning. To scan, press button 2 in the widget and drag up or down." +pack $w.msg -side top + +labelframe $w.justif -text Justification +foreach c {Left Center Right} { + set lower [string tolower $c] + radiobutton $w.justif.$lower -text $c -variable just \ + -relief flat -value $lower -anchor w \ + -command "$w.frame.list configure -justify \$just" \ + -tristatevalue "multi" + pack $w.justif.$lower -side left -pady 2 -fill x +} +pack $w.justif + +## See Code / Dismiss buttons +set btns [addSeeDismiss $w.buttons $w] +pack $btns -side bottom -fill x + +frame $w.frame -borderwidth .5c +pack $w.frame -side top -expand yes -fill y + +ttk::scrollbar $w.frame.scroll -command "$w.frame.list yview" +listbox $w.frame.list -yscroll "$w.frame.scroll set" -setgrid 1 -height 12 +pack $w.frame.scroll -side right -fill y +pack $w.frame.list -side left -expand 1 -fill both + +$w.frame.list insert 0 Alabama Alaska Arizona Arkansas California \ + Colorado Connecticut Delaware Florida Georgia Hawaii Idaho Illinois \ + Indiana Iowa Kansas Kentucky Louisiana Maine Maryland \ + Massachusetts Michigan Minnesota Mississippi Missouri \ + Montana Nebraska Nevada "New Hampshire" "New Jersey" "New Mexico" \ + "New York" "North Carolina" "North Dakota" \ + Ohio Oklahoma Oregon Pennsylvania "Rhode Island" \ + "South Carolina" "South Dakota" \ + Tennessee Texas Utah Vermont Virginia Washington \ + "West Virginia" Wisconsin Wyoming diff --git a/env/tcl/tk8.6/demos/style.tcl b/env/tcl/tk8.6/demos/style.tcl new file mode 100644 index 0000000..a529a03 --- /dev/null +++ b/env/tcl/tk8.6/demos/style.tcl @@ -0,0 +1,155 @@ +# style.tcl -- +# +# This demonstration script creates a text widget that illustrates the +# various display styles that may be set for tags. + +if {![info exists widgetDemo]} { + error "This script should be run from the \"widget\" demo." +} + +package require Tk + +set w .style +catch {destroy $w} +toplevel $w +wm title $w "Text Demonstration - Display Styles" +wm iconname $w "style" +positionWindow $w + +## See Code / Dismiss buttons +set btns [addSeeDismiss $w.buttons $w] +pack $btns -side bottom -fill x + +# Only set the font family in one place for simplicity and consistency + +set family Courier + +text $w.text -yscrollcommand "$w.scroll set" -setgrid true \ + -width 70 -height 32 -wrap word -font "$family 12" +ttk::scrollbar $w.scroll -command "$w.text yview" +pack $w.scroll -side right -fill y +pack $w.text -expand yes -fill both + +# Set up display styles + +$w.text tag configure bold -font "$family 12 bold italic" +$w.text tag configure big -font "$family 14 bold" +$w.text tag configure verybig -font "Helvetica 24 bold" +$w.text tag configure tiny -font "Times 8 bold" +if {[winfo depth $w] > 1} { + $w.text tag configure color1 -background #a0b7ce + $w.text tag configure color2 -foreground red + $w.text tag configure raised -relief raised -borderwidth 1 + $w.text tag configure sunken -relief sunken -borderwidth 1 +} else { + $w.text tag configure color1 -background black -foreground white + $w.text tag configure color2 -background black -foreground white + $w.text tag configure raised -background white -relief raised \ + -borderwidth 1 + $w.text tag configure sunken -background white -relief sunken \ + -borderwidth 1 +} +$w.text tag configure bgstipple -background black -borderwidth 0 \ + -bgstipple gray12 +$w.text tag configure fgstipple -fgstipple gray50 +$w.text tag configure underline -underline on +$w.text tag configure overstrike -overstrike on +$w.text tag configure right -justify right +$w.text tag configure center -justify center +$w.text tag configure super -offset 4p -font "$family 10" +$w.text tag configure sub -offset -2p -font "$family 10" +$w.text tag configure margins -lmargin1 12m -lmargin2 6m -rmargin 10m +$w.text tag configure spacing -spacing1 10p -spacing2 2p \ + -lmargin1 12m -lmargin2 6m -rmargin 10m + +$w.text insert end {Text widgets like this one allow you to display information in a +variety of styles. Display styles are controlled using a mechanism +called } +$w.text insert end tags bold +$w.text insert end {. Tags are just textual names that you can apply to one +or more ranges of characters within a text widget. You can configure +tags with various display styles. If you do this, then the tagged +characters will be displayed with the styles you chose. The +available display styles are: +} +$w.text insert end "\n1. Font." big +$w.text insert end " You can choose any system font, " +$w.text insert end large verybig +$w.text insert end " or " +$w.text insert end "small" tiny ".\n" +$w.text insert end "\n2. Color." big +$w.text insert end " You can change either the " +$w.text insert end background color1 +$w.text insert end " or " +$w.text insert end foreground color2 +$w.text insert end "\ncolor, or " +$w.text insert end both {color1 color2} +$w.text insert end ".\n" +$w.text insert end "\n3. Stippling." big +$w.text insert end " You can cause either the " +$w.text insert end background bgstipple +$w.text insert end " or " +$w.text insert end foreground fgstipple +$w.text insert end { +information to be drawn with a stipple fill instead of a solid fill. +} +$w.text insert end "\n4. Underlining." big +$w.text insert end " You can " +$w.text insert end underline underline +$w.text insert end " ranges of text.\n" +$w.text insert end "\n5. Overstrikes." big +$w.text insert end " You can " +$w.text insert end "draw lines through" overstrike +$w.text insert end " ranges of text.\n" +$w.text insert end "\n6. 3-D effects." big +$w.text insert end { You can arrange for the background to be drawn +with a border that makes characters appear either } +$w.text insert end raised raised +$w.text insert end " or " +$w.text insert end sunken sunken +$w.text insert end ".\n" +$w.text insert end "\n7. Justification." big +$w.text insert end " You can arrange for lines to be displayed\n" +$w.text insert end "left-justified,\n" +$w.text insert end "right-justified, or\n" right +$w.text insert end "centered.\n" center +$w.text insert end "\n8. Superscripts and subscripts." big +$w.text insert end " You can control the vertical\n" +$w.text insert end "position of text to generate superscript effects like 10" +$w.text insert end "n" super +$w.text insert end " or\nsubscript effects like X" +$w.text insert end "i" sub +$w.text insert end ".\n" +$w.text insert end "\n9. Margins." big +$w.text insert end " You can control the amount of extra space left" +$w.text insert end " on\neach side of the text:\n" +$w.text insert end "This paragraph is an example of the use of " margins +$w.text insert end "margins. It consists of a single line of text " margins +$w.text insert end "that wraps around on the screen. There are two " margins +$w.text insert end "separate left margin values, one for the first " margins +$w.text insert end "display line associated with the text line, " margins +$w.text insert end "and one for the subsequent display lines, which " margins +$w.text insert end "occur because of wrapping. There is also a " margins +$w.text insert end "separate specification for the right margin, " margins +$w.text insert end "which is used to choose wrap points for lines.\n" margins +$w.text insert end "\n10. Spacing." big +$w.text insert end " You can control the spacing of lines with three\n" +$w.text insert end "separate parameters. \"Spacing1\" tells how much " +$w.text insert end "extra space to leave\nabove a line, \"spacing3\" " +$w.text insert end "tells how much space to leave below a line,\nand " +$w.text insert end "if a text line wraps, \"spacing2\" tells how much " +$w.text insert end "space to leave\nbetween the display lines that " +$w.text insert end "make up the text line.\n" +$w.text insert end "These indented paragraphs illustrate how spacing " spacing +$w.text insert end "can be used. Each paragraph is actually a " spacing +$w.text insert end "single line in the text widget, which is " spacing +$w.text insert end "word-wrapped by the widget.\n" spacing +$w.text insert end "Spacing1 is set to 10 points for this text, " spacing +$w.text insert end "which results in relatively large gaps between " spacing +$w.text insert end "the paragraphs. Spacing2 is set to 2 points, " spacing +$w.text insert end "which results in just a bit of extra space " spacing +$w.text insert end "within a pararaph. Spacing3 isn't used " spacing +$w.text insert end "in this example.\n" spacing +$w.text insert end "To see where the space is, select ranges of " spacing +$w.text insert end "text within these paragraphs. The selection " spacing +$w.text insert end "highlight will cover the extra space." spacing diff --git a/env/tcl/tk8.6/demos/tclIndex b/env/tcl/tk8.6/demos/tclIndex new file mode 100644 index 0000000..86a72e2 --- /dev/null +++ b/env/tcl/tk8.6/demos/tclIndex @@ -0,0 +1,67 @@ +# Tcl autoload index file, version 2.0 +# This file is generated by the "auto_mkindex" command +# and sourced to set up indexing information for one or +# more commands. Typically each line is a command that +# sets an element in the auto_index array, where the +# element name is the name of a command and the value is +# a script that loads the command. + +set auto_index(arrowSetup) [list source [file join $dir arrow.tcl]] +set auto_index(arrowMove1) [list source [file join $dir arrow.tcl]] +set auto_index(arrowMove2) [list source [file join $dir arrow.tcl]] +set auto_index(arrowMove3) [list source [file join $dir arrow.tcl]] +set auto_index(textLoadFile) [list source [file join $dir search.tcl]] +set auto_index(textSearch) [list source [file join $dir search.tcl]] +set auto_index(textToggle) [list source [file join $dir search.tcl]] +set auto_index(itemEnter) [list source [file join $dir items.tcl]] +set auto_index(itemLeave) [list source [file join $dir items.tcl]] +set auto_index(itemMark) [list source [file join $dir items.tcl]] +set auto_index(itemStroke) [list source [file join $dir items.tcl]] +set auto_index(itemsUnderArea) [list source [file join $dir items.tcl]] +set auto_index(itemStartDrag) [list source [file join $dir items.tcl]] +set auto_index(itemDrag) [list source [file join $dir items.tcl]] +set auto_index(butPress) [list source [file join $dir items.tcl]] +set auto_index(loadDir) [list source [file join $dir image2.tcl]] +set auto_index(loadImage) [list source [file join $dir image2.tcl]] +set auto_index(rulerMkTab) [list source [file join $dir ruler.tcl]] +set auto_index(rulerNewTab) [list source [file join $dir ruler.tcl]] +set auto_index(rulerSelectTab) [list source [file join $dir ruler.tcl]] +set auto_index(rulerMoveTab) [list source [file join $dir ruler.tcl]] +set auto_index(rulerReleaseTab) [list source [file join $dir ruler.tcl]] +set auto_index(mkTextConfig) [list source [file join $dir ctext.tcl]] +set auto_index(textEnter) [list source [file join $dir ctext.tcl]] +set auto_index(textInsert) [list source [file join $dir ctext.tcl]] +set auto_index(textPaste) [list source [file join $dir ctext.tcl]] +set auto_index(textB1Press) [list source [file join $dir ctext.tcl]] +set auto_index(textB1Move) [list source [file join $dir ctext.tcl]] +set auto_index(textBs) [list source [file join $dir ctext.tcl]] +set auto_index(textDel) [list source [file join $dir ctext.tcl]] +set auto_index(bitmapRow) [list source [file join $dir bitmap.tcl]] +set auto_index(scrollEnter) [list source [file join $dir cscroll.tcl]] +set auto_index(scrollLeave) [list source [file join $dir cscroll.tcl]] +set auto_index(scrollButton) [list source [file join $dir cscroll.tcl]] +set auto_index(textWindOn) [list source [file join $dir twind.tcl]] +set auto_index(textWindOff) [list source [file join $dir twind.tcl]] +set auto_index(textWindPlot) [list source [file join $dir twind.tcl]] +set auto_index(embPlotDown) [list source [file join $dir twind.tcl]] +set auto_index(embPlotMove) [list source [file join $dir twind.tcl]] +set auto_index(textWindDel) [list source [file join $dir twind.tcl]] +set auto_index(embDefBg) [list source [file join $dir twind.tcl]] +set auto_index(floorDisplay) [list source [file join $dir floor.tcl]] +set auto_index(newRoom) [list source [file join $dir floor.tcl]] +set auto_index(roomChanged) [list source [file join $dir floor.tcl]] +set auto_index(bg1) [list source [file join $dir floor.tcl]] +set auto_index(bg2) [list source [file join $dir floor.tcl]] +set auto_index(bg3) [list source [file join $dir floor.tcl]] +set auto_index(fg1) [list source [file join $dir floor.tcl]] +set auto_index(fg2) [list source [file join $dir floor.tcl]] +set auto_index(fg3) [list source [file join $dir floor.tcl]] +set auto_index(setWidth) [list source [file join $dir hscale.tcl]] +set auto_index(plotDown) [list source [file join $dir plot.tcl]] +set auto_index(plotMove) [list source [file join $dir plot.tcl]] +set auto_index(puzzleSwitch) [list source [file join $dir puzzle.tcl]] +set auto_index(setHeight) [list source [file join $dir vscale.tcl]] +set auto_index(showMessageBox) [list source [file join $dir msgbox.tcl]] +set auto_index(setColor) [list source [file join $dir clrpick.tcl]] +set auto_index(setColor_helper) [list source [file join $dir clrpick.tcl]] +set auto_index(fileDialog) [list source [file join $dir filebox.tcl]] diff --git a/env/tcl/tk8.6/demos/tcolor b/env/tcl/tk8.6/demos/tcolor new file mode 100644 index 0000000..6e50c61 --- /dev/null +++ b/env/tcl/tk8.6/demos/tcolor @@ -0,0 +1,358 @@ +#!/bin/sh +# the next line restarts using wish \ +exec wish "$0" ${1+"$@"} + +# tcolor -- +# This script implements a simple color editor, where you can +# create colors using either the RGB, HSB, or CYM color spaces +# and apply the color to existing applications. + +package require Tk 8.4 +wm title . "Color Editor" + +# Global variables that control the program: +# +# colorSpace - Color space currently being used for +# editing. Must be "rgb", "cmy", or "hsb". +# label1, label2, label3 - Labels for the scales. +# red, green, blue - Current color intensities in decimal +# on a scale of 0-65535. +# color - A string giving the current color value +# in the proper form for x: +# #RRRRGGGGBBBB +# updating - Non-zero means that we're in the middle of +# updating the scales to load a new color,so +# information shouldn't be propagating back +# from the scales to other elements of the +# program: this would make an infinite loop. +# command - Holds the command that has been typed +# into the "Command" entry. +# autoUpdate - 1 means execute the update command +# automatically whenever the color changes. +# name - Name for new color, typed into entry. + +set colorSpace hsb +set red 65535 +set green 0 +set blue 0 +set color #ffff00000000 +set updating 0 +set autoUpdate 1 +set name "" + +# Create the menu bar at the top of the window. + +. configure -menu [menu .menu] +menu .menu.file +.menu add cascade -menu .menu.file -label File -underline 0 +.menu.file add radio -label "RGB color space" -variable colorSpace \ + -value rgb -underline 0 -command {changeColorSpace rgb} +.menu.file add radio -label "CMY color space" -variable colorSpace \ + -value cmy -underline 0 -command {changeColorSpace cmy} +.menu.file add radio -label "HSB color space" -variable colorSpace \ + -value hsb -underline 0 -command {changeColorSpace hsb} +.menu.file add separator +.menu.file add radio -label "Automatic updates" -variable autoUpdate \ + -value 1 -underline 0 +.menu.file add radio -label "Manual updates" -variable autoUpdate \ + -value 0 -underline 0 +.menu.file add separator +.menu.file add command -label "Exit program" -underline 0 -command {exit} + +# Create the command entry window at the bottom of the window, along +# with the update button. + +labelframe .command -text "Command:" -padx {1m 0} +entry .command.e -textvariable command +button .command.update -text Update -command doUpdate +pack .command.update -side right -pady .1c -padx {.25c 0} +pack .command.e -expand yes -fill x -ipadx 0.25c + + +# Create the listbox that holds all of the color names in rgb.txt, +# if an rgb.txt file can be found. + +grid .command -sticky nsew -row 2 -columnspan 3 -padx 1m -pady {0 1m} + +grid columnconfigure . {1 2} -weight 1 +grid rowconfigure . 0 -weight 1 +foreach i { + /usr/local/lib/X11/rgb.txt /usr/lib/X11/rgb.txt + /X11/R5/lib/X11/rgb.txt /X11/R4/lib/rgb/rgb.txt + /usr/openwin/lib/X11/rgb.txt +} { + if {![file readable $i]} { + continue; + } + set f [open $i] + labelframe .names -text "Select:" -padx .1c -pady .1c + grid .names -row 0 -column 0 -sticky nsew -padx .15c -pady .15c -rowspan 2 + grid columnconfigure . 0 -weight 1 + listbox .names.lb -width 20 -height 12 -yscrollcommand ".names.s set" \ + -exportselection false + bind .names.lb { + tc_loadNamedColor [.names.lb get [.names.lb curselection]] + } + scrollbar .names.s -orient vertical -command ".names.lb yview" + pack .names.lb .names.s -side left -fill y -expand 1 + while {[gets $f line] >= 0} { + if {[regexp {^\s*\d+\s+\d+\s+\d+\s+(\S+)$} $line -> col]} { + .names.lb insert end $col + } + } + close $f + break +} + +# Create the three scales for editing the color, and the entry for +# typing in a color value. + +frame .adjust +foreach i {1 2 3} { + label .adjust.l$i -textvariable label$i -pady 0 + labelframe .adjust.$i -labelwidget .adjust.l$i -padx 1m -pady 1m + scale .scale$i -from 0 -to 1000 -length 6c -orient horizontal \ + -command tc_scaleChanged + pack .scale$i -in .adjust.$i + pack .adjust.$i +} +grid .adjust -row 0 -column 1 -sticky nsew -padx .15c -pady .15c + +labelframe .name -text "Name:" -padx 1m -pady 1m +entry .name.e -textvariable name -width 10 +pack .name.e -side right -expand 1 -fill x +bind .name.e {tc_loadNamedColor $name} +grid .name -column 1 -row 1 -sticky nsew -padx .15c -pady .15c + +# Create the color display swatch on the right side of the window. + +labelframe .sample -text "Color:" -padx 1m -pady 1m +frame .sample.swatch -width 2c -height 5c -background $color +label .sample.value -textvariable color -width 13 -font {Courier 12} +pack .sample.swatch -side top -expand yes -fill both +pack .sample.value -side bottom -pady .25c +grid .sample -row 0 -column 2 -sticky nsew -padx .15c -pady .15c -rowspan 2 + + +# The procedure below is invoked when one of the scales is adjusted. +# It propagates color information from the current scale readings +# to everywhere else that it is used. + +proc tc_scaleChanged args { + global red green blue colorSpace color updating autoUpdate + if {$updating} { + return + } + switch $colorSpace { + rgb { + set red [format %.0f [expr {[.scale1 get]*65.535}]] + set green [format %.0f [expr {[.scale2 get]*65.535}]] + set blue [format %.0f [expr {[.scale3 get]*65.535}]] + } + cmy { + set red [format %.0f [expr {65535 - [.scale1 get]*65.535}]] + set green [format %.0f [expr {65535 - [.scale2 get]*65.535}]] + set blue [format %.0f [expr {65535 - [.scale3 get]*65.535}]] + } + hsb { + set list [hsbToRgb [expr {[.scale1 get]/1000.0}] \ + [expr {[.scale2 get]/1000.0}] \ + [expr {[.scale3 get]/1000.0}]] + set red [lindex $list 0] + set green [lindex $list 1] + set blue [lindex $list 2] + } + } + set color [format "#%04x%04x%04x" $red $green $blue] + .sample.swatch config -bg $color + if {$autoUpdate} doUpdate + update idletasks +} + +# The procedure below is invoked to update the scales from the +# current red, green, and blue intensities. It's invoked after +# a change in the color space and after a named color value has +# been loaded. + +proc tc_setScales {} { + global red green blue colorSpace updating + set updating 1 + switch $colorSpace { + rgb { + .scale1 set [format %.0f [expr {$red/65.535}]] + .scale2 set [format %.0f [expr {$green/65.535}]] + .scale3 set [format %.0f [expr {$blue/65.535}]] + } + cmy { + .scale1 set [format %.0f [expr {(65535-$red)/65.535}]] + .scale2 set [format %.0f [expr {(65535-$green)/65.535}]] + .scale3 set [format %.0f [expr {(65535-$blue)/65.535}]] + } + hsb { + set list [rgbToHsv $red $green $blue] + .scale1 set [format %.0f [expr {[lindex $list 0] * 1000.0}]] + .scale2 set [format %.0f [expr {[lindex $list 1] * 1000.0}]] + .scale3 set [format %.0f [expr {[lindex $list 2] * 1000.0}]] + } + } + set updating 0 +} + +# The procedure below is invoked when a named color has been +# selected from the listbox or typed into the entry. It loads +# the color into the editor. + +proc tc_loadNamedColor name { + global red green blue color autoUpdate + + if {[string index $name 0] != "#"} { + set list [winfo rgb .sample.swatch $name] + set red [lindex $list 0] + set green [lindex $list 1] + set blue [lindex $list 2] + } else { + switch [string length $name] { + 4 {set format "#%1x%1x%1x"; set shift 12} + 7 {set format "#%2x%2x%2x"; set shift 8} + 10 {set format "#%3x%3x%3x"; set shift 4} + 13 {set format "#%4x%4x%4x"; set shift 0} + default {error "syntax error in color name \"$name\""} + } + if {[scan $name $format red green blue] != 3} { + error "syntax error in color name \"$name\"" + } + set red [expr {$red<<$shift}] + set green [expr {$green<<$shift}] + set blue [expr {$blue<<$shift}] + } + tc_setScales + set color [format "#%04x%04x%04x" $red $green $blue] + .sample.swatch config -bg $color + if {$autoUpdate} doUpdate +} + +# The procedure below is invoked when a new color space is selected. +# It changes the labels on the scales and re-loads the scales with +# the appropriate values for the current color in the new color space + +proc changeColorSpace space { + global label1 label2 label3 + switch $space { + rgb { + set label1 "Adjust Red:" + set label2 "Adjust Green:" + set label3 "Adjust Blue:" + tc_setScales + return + } + cmy { + set label1 "Adjust Cyan:" + set label2 "Adjust Magenta:" + set label3 "Adjust Yellow:" + tc_setScales + return + } + hsb { + set label1 "Adjust Hue:" + set label2 "Adjust Saturation:" + set label3 "Adjust Brightness:" + tc_setScales + return + } + } +} + +# The procedure below converts an RGB value to HSB. It takes red, green, +# and blue components (0-65535) as arguments, and returns a list containing +# HSB components (floating-point, 0-1) as result. The code here is a copy +# of the code on page 615 of "Fundamentals of Interactive Computer Graphics" +# by Foley and Van Dam. + +proc rgbToHsv {red green blue} { + if {$red > $green} { + set max [expr {double($red)}] + set min [expr {double($green)}] + } else { + set max [expr {double($green)}] + set min [expr {double($red)}] + } + if {$blue > $max} { + set max [expr {double($blue)}] + } elseif {$blue < $min} { + set min [expr {double($blue)}] + } + set range [expr {$max-$min}] + if {$max == 0} { + set sat 0 + } else { + set sat [expr {($max-$min)/$max}] + } + if {$sat == 0} { + set hue 0 + } else { + set rc [expr {($max - $red)/$range}] + set gc [expr {($max - $green)/$range}] + set bc [expr {($max - $blue)/$range}] + if {$red == $max} { + set hue [expr {($bc - $gc)/6.0}] + } elseif {$green == $max} { + set hue [expr {(2 + $rc - $bc)/6.0}] + } else { + set hue [expr {(4 + $gc - $rc)/6.0}] + } + if {$hue < 0.0} { + set hue [expr {$hue + 1.0}] + } + } + return [list $hue $sat [expr {$max/65535}]] +} + +# The procedure below converts an HSB value to RGB. It takes hue, saturation, +# and value components (floating-point, 0-1.0) as arguments, and returns a +# list containing RGB components (integers, 0-65535) as result. The code +# here is a copy of the code on page 616 of "Fundamentals of Interactive +# Computer Graphics" by Foley and Van Dam. + +proc hsbToRgb {hue sat value} { + set v [format %.0f [expr {65535.0*$value}]] + if {$sat == 0} { + return "$v $v $v" + } else { + set hue [expr {$hue*6.0}] + if {$hue >= 6.0} { + set hue 0.0 + } + scan $hue. %d i + set f [expr {$hue-$i}] + set p [format %.0f [expr {65535.0*$value*(1 - $sat)}]] + set q [format %.0f [expr {65535.0*$value*(1 - ($sat*$f))}]] + set t [format %.0f [expr {65535.0*$value*(1 - ($sat*(1 - $f)))}]] + switch $i { + 0 {return "$v $t $p"} + 1 {return "$q $v $p"} + 2 {return "$p $v $t"} + 3 {return "$p $q $v"} + 4 {return "$t $p $v"} + 5 {return "$v $p $q"} + default {error "i value $i is out of range"} + } + } +} + +# The procedure below is invoked when the "Update" button is pressed, +# and whenever the color changes if update mode is enabled. It +# propagates color information as determined by the command in the +# Command entry. + +proc doUpdate {} { + global color command + set newCmd $command + regsub -all %% $command $color newCmd + eval $newCmd +} + +changeColorSpace hsb + +# Local Variables: +# mode: tcl +# End: diff --git a/env/tcl/tk8.6/demos/text.tcl b/env/tcl/tk8.6/demos/text.tcl new file mode 100644 index 0000000..d1801d1 --- /dev/null +++ b/env/tcl/tk8.6/demos/text.tcl @@ -0,0 +1,111 @@ +# text.tcl -- +# +# This demonstration script creates a text widget that describes +# the basic editing functions. + +if {![info exists widgetDemo]} { + error "This script should be run from the \"widget\" demo." +} + +package require Tk + +set w .text +catch {destroy $w} +toplevel $w +wm title $w "Text Demonstration - Basic Facilities" +wm iconname $w "text" +positionWindow $w + +## See Code / Dismiss buttons +set btns [addSeeDismiss $w.buttons $w {} \ + {ttk::button $w.buttons.fontchooser -command fontchooserToggle}] +pack $btns -side bottom -fill x + +text $w.text -yscrollcommand [list $w.scroll set] -setgrid 1 \ + -height 30 -undo 1 -autosep 1 +ttk::scrollbar $w.scroll -command [list $w.text yview] +pack $w.scroll -side right -fill y +pack $w.text -expand yes -fill both + +# TIP 324 Demo: [tk fontchooser] +proc fontchooserToggle {} { + tk fontchooser [expr {[tk fontchooser configure -visible] ? + "hide" : "show"}] +} +proc fontchooserVisibility {w} { + $w configure -text [expr {[tk fontchooser configure -visible] ? + "Hide Font Dialog" : "Show Font Dialog"}] +} +proc fontchooserFocus {w} { + tk fontchooser configure -font [$w cget -font] \ + -command [list fontchooserFontSel $w] +} +proc fontchooserFontSel {w font args} { + $w configure -font [font actual $font] +} +tk fontchooser configure -parent $w +bind $w.text [list fontchooserFocus $w.text] +fontchooserVisibility $w.buttons.fontchooser +bind $w <> [list \ + fontchooserVisibility $w.buttons.fontchooser] +focus $w.text + +$w.text insert 0.0 \ +{This window is a text widget. It displays one or more lines of text +and allows you to edit the text. Here is a summary of the things you +can do to a text widget: + +1. Scrolling. Use the scrollbar to adjust the view in the text window. + +2. Scanning. Press mouse button 2 in the text window and drag up or down. +This will drag the text at high speed to allow you to scan its contents. + +3. Insert text. Press mouse button 1 to set the insertion cursor, then +type text. What you type will be added to the widget. + +4. Select. Press mouse button 1 and drag to select a range of characters. +Once you've released the button, you can adjust the selection by pressing +button 1 with the shift key down. This will reset the end of the +selection nearest the mouse cursor and you can drag that end of the +selection by dragging the mouse before releasing the mouse button. +You can double-click to select whole words or triple-click to select +whole lines. + +5. Delete and replace. To delete text, select the characters you'd like +to delete and type Backspace or Delete. Alternatively, you can type new +text, in which case it will replace the selected text. + +6. Copy the selection. To copy the selection into this window, select +what you want to copy (either here or in another application), then +click button 2 to copy the selection to the point of the mouse cursor. + +7. Edit. Text widgets support the standard Motif editing characters +plus many Emacs editing characters. Backspace and Control-h erase the +character to the left of the insertion cursor. Delete and Control-d +erase the character to the right of the insertion cursor. Meta-backspace +deletes the word to the left of the insertion cursor, and Meta-d deletes +the word to the right of the insertion cursor. Control-k deletes from +the insertion cursor to the end of the line, or it deletes the newline +character if that is the only thing left on the line. Control-o opens +a new line by inserting a newline character to the right of the insertion +cursor. Control-t transposes the two characters on either side of the +insertion cursor. Control-z undoes the last editing action performed, +and } + +switch [tk windowingsystem] { + "aqua" - "x11" { + $w.text insert end "Control-Shift-z" + } + "win32" { + $w.text insert end "Control-y" + } +} + +$w.text insert end { redoes undone edits. + +7. Resize the window. This widget has been configured with the "setGrid" +option on, so that if you resize the window it will always resize to an +even number of characters high and wide. Also, if you make the window +narrow you can see that long lines automatically wrap around onto +additional lines so that all the information is always visible.} +$w.text mark set insert 0.0 diff --git a/env/tcl/tk8.6/demos/textpeer.tcl b/env/tcl/tk8.6/demos/textpeer.tcl new file mode 100644 index 0000000..83e8e14 --- /dev/null +++ b/env/tcl/tk8.6/demos/textpeer.tcl @@ -0,0 +1,62 @@ +# textpeer.tcl -- +# +# This demonstration script creates a pair of text widgets that can edit a +# single logical buffer. This is particularly useful when editing related text +# in two (or more) parts of the same file. + +if {![info exists widgetDemo]} { + error "This script should be run from the \"widget\" demo." +} + +package require Tk + +set w .textpeer +catch {destroy $w} +toplevel $w +wm title $w "Text Widget Peering Demonstration" +wm iconname $w "textpeer" +positionWindow $w + +set count 0 + +## Define a widget that we peer from; it won't ever actually be shown though +set first [text $w.text[incr count]] +$first insert end "This is a coupled pair of text widgets; they are peers to " +$first insert end "each other. They have the same underlying data model, but " +$first insert end "can show different locations, have different current edit " +$first insert end "locations, and have different selections. You can also " +$first insert end "create additional peers of any of these text widgets using " +$first insert end "the Make Peer button beside the text widget to clone, and " +$first insert end "delete a particular peer widget using the Delete Peer " +$first insert end "button." + +## Procedures to make and kill clones; most of this is just so that the demo +## looks nice... +proc makeClone {w parent} { + global count + set t [$parent peer create $w.text[incr count] -yscroll "$w.sb$count set"\ + -height 10 -wrap word] + set sb [ttk::scrollbar $w.sb$count -command "$t yview" -orient vertical] + set b1 [button $w.clone$count -command "makeClone $w $t" \ + -text "Make Peer"] + set b2 [button $w.kill$count -command "killClone $w $count" \ + -text "Delete Peer"] + set row [expr {$count * 2}] + grid $t $sb $b1 -sticky nsew -row $row + grid ^ ^ $b2 -row [incr row] + grid configure $b1 $b2 -sticky new + grid rowconfigure $w $b2 -weight 1 +} +proc killClone {w count} { + destroy $w.text$count $w.sb$count + destroy $w.clone$count $w.kill$count +} + +## Now set up the GUI +makeClone $w $first +makeClone $w $first +destroy $first + +## See Code / Dismiss buttons +grid [addSeeDismiss $w.buttons $w] - - -sticky ew -row 5000 +grid columnconfigure $w 0 -weight 1 diff --git a/env/tcl/tk8.6/demos/timer b/env/tcl/tk8.6/demos/timer new file mode 100644 index 0000000..6b61ca4 --- /dev/null +++ b/env/tcl/tk8.6/demos/timer @@ -0,0 +1,47 @@ +#!/bin/sh +# the next line restarts using wish \ +exec wish "$0" ${1+"$@"} + +# timer -- +# This script generates a counter with start and stop buttons. + +package require Tk + +label .counter -text 0.00 -relief raised -width 10 -padx 2m -pady 1m +button .start -text Start -command { + if {$stopped} { + set stopped 0 + set startMoment [clock clicks -milliseconds] + tick + .stop configure -state normal + .start configure -state disabled + } +} +button .stop -text Stop -state disabled -command { + set stopped 1 + .stop configure -state disabled + .start configure -state normal +} +pack .counter -side bottom -fill both +pack .start -side left -fill both -expand yes +pack .stop -side right -fill both -expand yes + +set startMoment {} + +set stopped 1 + +proc tick {} { + global startMoment stopped + if {$stopped} {return} + after 50 tick + set elapsedMS [expr {[clock clicks -milliseconds] - $startMoment}] + .counter config -text [format "%.2f" [expr {double($elapsedMS)/1000}]] +} + +bind . {destroy .} +bind . {destroy .} +focus . + +# Local Variables: +# mode: tcl +# End: diff --git a/env/tcl/tk8.6/demos/toolbar.tcl b/env/tcl/tk8.6/demos/toolbar.tcl new file mode 100644 index 0000000..0ae4669 --- /dev/null +++ b/env/tcl/tk8.6/demos/toolbar.tcl @@ -0,0 +1,92 @@ +# toolbar.tcl -- +# +# This demonstration script creates a toolbar that can be torn off. + +if {![info exists widgetDemo]} { + error "This script should be run from the \"widget\" demo." +} + +package require Tk + +set w .toolbar +destroy $w +toplevel $w +wm title $w "Toolbar Demonstration" +wm iconname $w "toolbar" +positionWindow $w + +ttk::label $w.msg -wraplength 4i -text "This is a demonstration of how to do\ + a toolbar that is styled correctly and which can be torn off. The\ + buttons are configured to be \u201Ctoolbar style\u201D buttons by\ + telling them that they are to use the Toolbutton style. At the left\ + end of the toolbar is a simple marker that the cursor changes to a\ + movement icon over; drag that away from the toolbar to tear off the\ + whole toolbar into a separate toplevel widget. When the dragged-off\ + toolbar is no longer needed, just close it like any normal toplevel\ + and it will reattach to the window it was torn off from." + +## Set up the toolbar hull +set t [frame $w.toolbar] ;# Must be a frame! +ttk::separator $w.sep +ttk::frame $t.tearoff -cursor fleur +ttk::separator $t.tearoff.to -orient vertical +ttk::separator $t.tearoff.to2 -orient vertical +pack $t.tearoff.to -fill y -expand 1 -padx 2 -side left +pack $t.tearoff.to2 -fill y -expand 1 -side left +ttk::frame $t.contents +grid $t.tearoff $t.contents -sticky nsew +grid columnconfigure $t $t.contents -weight 1 +grid columnconfigure $t.contents 1000 -weight 1 + +## Bindings so that the toolbar can be torn off and reattached +bind $t.tearoff [list tearoff $t %X %Y] +bind $t.tearoff.to [list tearoff $t %X %Y] +bind $t.tearoff.to2 [list tearoff $t %X %Y] +proc tearoff {w x y} { + if {[string match $w* [winfo containing $x $y]]} { + return + } + grid remove $w + grid remove $w.tearoff + wm manage $w + wm protocol $w WM_DELETE_WINDOW [list untearoff $w] +} +proc untearoff {w} { + wm forget $w + grid $w.tearoff + grid $w +} + +## Toolbar contents +ttk::button $t.button -text "Button" -style Toolbutton -command [list \ + $w.txt insert end "Button Pressed\n"] +ttk::checkbutton $t.check -text "Check" -variable check -style Toolbutton \ + -command [concat [list $w.txt insert end] {"check is $check\n"}] +ttk::menubutton $t.menu -text "Menu" -menu $t.menu.m +ttk::combobox $t.combo -value [lsort [font families]] -state readonly +menu $t.menu.m +$t.menu.m add command -label "Just" -command [list $w.txt insert end Just\n] +$t.menu.m add command -label "An" -command [list $w.txt insert end An\n] +$t.menu.m add command -label "Example" \ + -command [list $w.txt insert end Example\n] +bind $t.combo <> [list changeFont $w.txt $t.combo] +proc changeFont {txt combo} { + $txt configure -font [list [$combo get] 10] +} + +## Some content for the rest of the toplevel +text $w.txt -width 40 -height 10 +interp alias {} doInsert {} $w.txt insert end ;# Make bindings easy to write + +## Arrange contents +grid $t.button $t.check $t.menu $t.combo -in $t.contents -padx 2 -sticky ns +grid $t -sticky ew +grid $w.sep -sticky ew +grid $w.msg -sticky ew +grid $w.txt -sticky nsew +grid rowconfigure $w $w.txt -weight 1 +grid columnconfigure $w $w.txt -weight 1 + +## See Code / Dismiss buttons +set btns [addSeeDismiss $w.buttons $w] +grid $btns -sticky ew diff --git a/env/tcl/tk8.6/demos/tree.tcl b/env/tcl/tk8.6/demos/tree.tcl new file mode 100644 index 0000000..71c32c1 --- /dev/null +++ b/env/tcl/tk8.6/demos/tree.tcl @@ -0,0 +1,88 @@ +# tree.tcl -- +# +# This demonstration script creates a toplevel window containing a Ttk +# tree widget. + +if {![info exists widgetDemo]} { + error "This script should be run from the \"widget\" demo." +} + +package require Tk + +set w .tree +catch {destroy $w} +toplevel $w +wm title $w "Directory Browser" +wm iconname $w "tree" +positionWindow $w + +## Explanatory text +ttk::label $w.msg -font $font -wraplength 4i -justify left -anchor n -padding {10 2 10 6} -text "Ttk is the new Tk themed widget set. One of the widgets it includes is a tree widget, which allows the user to browse a hierarchical data-set such as a filesystem. The tree widget not only allows for the tree part itself, but it also supports an arbitrary number of additional columns which can show additional data (in this case, the size of the files found in your filesystem). You can also change the width of the columns by dragging the boundary between them." +pack $w.msg -fill x + +## See Code / Dismiss +pack [addSeeDismiss $w.seeDismiss $w] -side bottom -fill x + +## Code to populate the roots of the tree (can be more than one on Windows) +proc populateRoots {tree} { + foreach dir [lsort -dictionary [file volumes]] { + populateTree $tree [$tree insert {} end -text $dir \ + -values [list $dir directory]] + } +} + +## Code to populate a node of the tree +proc populateTree {tree node} { + if {[$tree set $node type] ne "directory"} { + return + } + set path [$tree set $node fullpath] + $tree delete [$tree children $node] + foreach f [lsort -dictionary [glob -nocomplain -dir $path *]] { + set type [file type $f] + set id [$tree insert $node end -text [file tail $f] \ + -values [list $f $type]] + + if {$type eq "directory"} { + ## Make it so that this node is openable + $tree insert $id 0 -text dummy ;# a dummy + $tree item $id -text [file tail $f]/ + + } elseif {$type eq "file"} { + set size [file size $f] + ## Format the file size nicely + if {$size >= 1024*1024*1024} { + set size [format %.1f\ GB [expr {$size/1024/1024/1024.}]] + } elseif {$size >= 1024*1024} { + set size [format %.1f\ MB [expr {$size/1024/1024.}]] + } elseif {$size >= 1024} { + set size [format %.1f\ kB [expr {$size/1024.}]] + } else { + append size " bytes" + } + $tree set $id size $size + } + } + + # Stop this code from rerunning on the current node + $tree set $node type processedDirectory +} + +## Create the tree and set it up +ttk::treeview $w.tree -columns {fullpath type size} -displaycolumns {size} \ + -yscroll "$w.vsb set" -xscroll "$w.hsb set" +ttk::scrollbar $w.vsb -orient vertical -command "$w.tree yview" +ttk::scrollbar $w.hsb -orient horizontal -command "$w.tree xview" +$w.tree heading \#0 -text "Directory Structure" +$w.tree heading size -text "File Size" +$w.tree column size -stretch 0 -width 70 +populateRoots $w.tree +bind $w.tree <> {populateTree %W [%W focus]} + +## Arrange the tree and its scrollbars in the toplevel +lower [ttk::frame $w.dummy] +pack $w.dummy -fill both -expand 1 +grid $w.tree $w.vsb -sticky nsew -in $w.dummy +grid $w.hsb -sticky nsew -in $w.dummy +grid columnconfigure $w.dummy 0 -weight 1 +grid rowconfigure $w.dummy 0 -weight 1 diff --git a/env/tcl/tk8.6/demos/ttkbut.tcl b/env/tcl/tk8.6/demos/ttkbut.tcl new file mode 100644 index 0000000..904cd31 --- /dev/null +++ b/env/tcl/tk8.6/demos/ttkbut.tcl @@ -0,0 +1,84 @@ +# ttkbut.tcl -- +# +# This demonstration script creates a toplevel window containing several +# simple Ttk widgets, such as labels, labelframes, buttons, checkbuttons and +# radiobuttons. + +if {![info exists widgetDemo]} { + error "This script should be run from the \"widget\" demo." +} + +package require Tk + +set w .ttkbut +catch {destroy $w} +toplevel $w +wm title $w "Simple Ttk Widgets" +wm iconname $w "ttkbut" +positionWindow $w + +ttk::label $w.msg -font $font -wraplength 4i -justify left -text "Ttk is the new Tk themed widget set. This is a Ttk themed label, and below are three groups of Ttk widgets in Ttk labelframes. The first group are all buttons that set the current application theme when pressed. The second group contains three sets of checkbuttons, with a separator widget between the sets. Note that the \u201cEnabled\u201d button controls whether all the other themed widgets in this toplevel are in the disabled state. The third group has a collection of linked radiobuttons." +pack $w.msg -side top -fill x + +## See Code / Dismiss +pack [addSeeDismiss $w.seeDismiss $w {enabled cheese tomato basil oregano happyness}]\ + -side bottom -fill x + +## Add buttons for setting the theme +ttk::labelframe $w.buttons -text "Buttons" +foreach theme [ttk::themes] { + ttk::button $w.buttons.$theme -text $theme \ + -command [list ttk::setTheme $theme] + pack $w.buttons.$theme -pady 2 +} + +## Helper procedure for the top checkbutton +proc setState {rootWidget exceptThese value} { + if {$rootWidget in $exceptThese} { + return + } + ## Non-Ttk widgets (e.g. the toplevel) will fail, so make it silent + catch { + $rootWidget state $value + } + ## Recursively invoke on all children of this root that are in the same + ## toplevel widget + foreach w [winfo children $rootWidget] { + if {[winfo toplevel $w] eq [winfo toplevel $rootWidget]} { + setState $w $exceptThese $value + } + } +} + +## Set up the checkbutton group +ttk::labelframe $w.checks -text "Checkbuttons" +ttk::checkbutton $w.checks.e -text Enabled -variable enabled -command { + setState .ttkbut .ttkbut.checks.e \ + [expr {$enabled ? "!disabled" : "disabled"}] +} +set enabled 1 +## See ttk_widget(n) for other possible state flags +ttk::separator $w.checks.sep1 +ttk::checkbutton $w.checks.c1 -text Cheese -variable cheese +ttk::checkbutton $w.checks.c2 -text Tomato -variable tomato +ttk::separator $w.checks.sep2 +ttk::checkbutton $w.checks.c3 -text Basil -variable basil +ttk::checkbutton $w.checks.c4 -text Oregano -variable oregano +pack $w.checks.e $w.checks.sep1 $w.checks.c1 $w.checks.c2 $w.checks.sep2 \ + $w.checks.c3 $w.checks.c4 -fill x -pady 2 + +## Set up the radiobutton group +ttk::labelframe $w.radios -text "Radiobuttons" +ttk::radiobutton $w.radios.r1 -text "Great" -variable happyness -value great +ttk::radiobutton $w.radios.r2 -text "Good" -variable happyness -value good +ttk::radiobutton $w.radios.r3 -text "OK" -variable happyness -value ok +ttk::radiobutton $w.radios.r4 -text "Poor" -variable happyness -value poor +ttk::radiobutton $w.radios.r5 -text "Awful" -variable happyness -value awful +pack $w.radios.r1 $w.radios.r2 $w.radios.r3 $w.radios.r4 $w.radios.r5 \ + -fill x -padx 3 -pady 2 + +## Arrange things neatly +pack [ttk::frame $w.f] -fill both -expand 1 +lower $w.f +grid $w.buttons $w.checks $w.radios -in $w.f -sticky nwe -pady 2 -padx 3 +grid columnconfigure $w.f {0 1 2} -weight 1 -uniform yes diff --git a/env/tcl/tk8.6/demos/ttkmenu.tcl b/env/tcl/tk8.6/demos/ttkmenu.tcl new file mode 100644 index 0000000..0084dd6 --- /dev/null +++ b/env/tcl/tk8.6/demos/ttkmenu.tcl @@ -0,0 +1,53 @@ +# ttkmenu.tcl -- +# +# This demonstration script creates a toplevel window containing several Ttk +# menubutton widgets. + +if {![info exists widgetDemo]} { + error "This script should be run from the \"widget\" demo." +} + +package require Tk + +set w .ttkmenu +catch {destroy $w} +toplevel $w +wm title $w "Ttk Menu Buttons" +wm iconname $w "ttkmenu" +positionWindow $w + +ttk::label $w.msg -font $font -wraplength 4i -justify left -text "Ttk is the new Tk themed widget set, and one widget that is available in themed form is the menubutton. Below are some themed menu buttons that allow you to pick the current theme in use. Notice how picking a theme changes the way that the menu buttons themselves look, and that the central menu button is styled differently (in a way that is normally suitable for toolbars). However, there are no themed menus; the standard Tk menus were judged to have a sufficiently good look-and-feel on all platforms, especially as they are implemented as native controls in many places." +pack $w.msg [ttk::separator $w.msgSep] -side top -fill x + +## See Code / Dismiss +pack [addSeeDismiss $w.seeDismiss $w] -side bottom -fill x + +ttk::menubutton $w.m1 -menu $w.m1.menu -text "Select a theme" -direction above +ttk::menubutton $w.m2 -menu $w.m1.menu -text "Select a theme" -direction left +ttk::menubutton $w.m3 -menu $w.m1.menu -text "Select a theme" -direction right +ttk::menubutton $w.m4 -menu $w.m1.menu -text "Select a theme" \ + -direction flush -style TMenubutton.Toolbutton +ttk::menubutton $w.m5 -menu $w.m1.menu -text "Select a theme" -direction below + +menu $w.m1.menu -tearoff 0 +menu $w.m2.menu -tearoff 0 +menu $w.m3.menu -tearoff 0 +menu $w.m4.menu -tearoff 0 +menu $w.m5.menu -tearoff 0 + +foreach theme [ttk::themes] { + $w.m1.menu add command -label $theme -command [list ttk::setTheme $theme] + $w.m2.menu add command -label $theme -command [list ttk::setTheme $theme] + $w.m3.menu add command -label $theme -command [list ttk::setTheme $theme] + $w.m4.menu add command -label $theme -command [list ttk::setTheme $theme] + $w.m5.menu add command -label $theme -command [list ttk::setTheme $theme] +} + +pack [ttk::frame $w.f] -fill x +pack [ttk::frame $w.f1] -fill both -expand yes +lower $w.f + +grid anchor $w.f center +grid x $w.m1 x -in $w.f -padx 3 -pady 2 +grid $w.m2 $w.m4 $w.m3 -in $w.f -padx 3 -pady 2 +grid x $w.m5 x -in $w.f -padx 3 -pady 2 diff --git a/env/tcl/tk8.6/demos/ttknote.tcl b/env/tcl/tk8.6/demos/ttknote.tcl new file mode 100644 index 0000000..50a9258 --- /dev/null +++ b/env/tcl/tk8.6/demos/ttknote.tcl @@ -0,0 +1,57 @@ +# ttknote.tcl -- +# +# This demonstration script creates a toplevel window containing a Ttk +# notebook widget. + +if {![info exists widgetDemo]} { + error "This script should be run from the \"widget\" demo." +} + +package require Tk + +set w .ttknote +catch {destroy $w} +toplevel $w +wm title $w "Ttk Notebook Widget" +wm iconname $w "ttknote" +positionWindow $w + +## See Code / Dismiss +pack [addSeeDismiss $w.seeDismiss $w] -side bottom -fill x + +ttk::frame $w.f +pack $w.f -fill both -expand 1 +set w $w.f + +## Make the notebook and set up Ctrl+Tab traversal +ttk::notebook $w.note +pack $w.note -fill both -expand 1 -padx 2 -pady 3 +ttk::notebook::enableTraversal $w.note + +## Popuplate the first pane +ttk::frame $w.note.msg +ttk::label $w.note.msg.m -font $font -wraplength 4i -justify left -anchor n -text "Ttk is the new Tk themed widget set. One of the widgets it includes is the notebook widget, which provides a set of tabs that allow the selection of a group of panels, each with distinct content. They are a feature of many modern user interfaces. Not only can the tabs be selected with the mouse, but they can also be switched between using Ctrl+Tab when the notebook page heading itself is selected. Note that the second tab is disabled, and cannot be selected." +ttk::button $w.note.msg.b -text "Neat!" -underline 0 -command { + set neat "Yeah, I know..." + after 500 {set neat {}} +} +bind $w "focus $w.note.msg.b; $w.note.msg.b invoke" +ttk::label $w.note.msg.l -textvariable neat +$w.note add $w.note.msg -text "Description" -underline 0 -padding 2 +grid $w.note.msg.m - -sticky new -pady 2 +grid $w.note.msg.b $w.note.msg.l -pady {2 4} +grid rowconfigure $w.note.msg 1 -weight 1 +grid columnconfigure $w.note.msg {0 1} -weight 1 -uniform 1 + +## Populate the second pane. Note that the content doesn't really matter +ttk::frame $w.note.disabled +$w.note add $w.note.disabled -text "Disabled" -state disabled + +## Popuplate the third pane +ttk::frame $w.note.editor +$w.note add $w.note.editor -text "Text Editor" -underline 0 +text $w.note.editor.t -width 40 -height 10 -wrap char \ + -yscroll "$w.note.editor.s set" +ttk::scrollbar $w.note.editor.s -orient vertical -command "$w.note.editor.t yview" +pack $w.note.editor.s -side right -fill y -padx {0 2} -pady 2 +pack $w.note.editor.t -fill both -expand 1 -pady 2 -padx {2 0} diff --git a/env/tcl/tk8.6/demos/ttkpane.tcl b/env/tcl/tk8.6/demos/ttkpane.tcl new file mode 100644 index 0000000..7575d76 --- /dev/null +++ b/env/tcl/tk8.6/demos/ttkpane.tcl @@ -0,0 +1,112 @@ +# ttkpane.tcl -- +# +# This demonstration script creates a Ttk pane with some content. + +if {![info exists widgetDemo]} { + error "This script should be run from the \"widget\" demo." +} + +package require Tk + +set w .ttkpane +catch {destroy $w} +toplevel $w +wm title $w "Themed Nested Panes" +wm iconname $w "ttkpane" +positionWindow $w + +ttk::label $w.msg -font $font -wraplength 4i -justify left -text "This demonstration shows off a nested set of themed paned windows. Their sizes can be changed by grabbing the area between each contained pane and dragging the divider." +pack $w.msg [ttk::separator $w.msgSep] -side top -fill x + +## See Code / Dismiss +pack [addSeeDismiss $w.seeDismiss $w] -side bottom -fill x + +ttk::frame $w.f +pack $w.f -fill both -expand 1 +set w $w.f +ttk::panedwindow $w.outer -orient horizontal +$w.outer add [ttk::panedwindow $w.outer.inLeft -orient vertical] +$w.outer add [ttk::panedwindow $w.outer.inRight -orient vertical] +$w.outer.inLeft add [ttk::labelframe $w.outer.inLeft.top -text Button] +$w.outer.inLeft add [ttk::labelframe $w.outer.inLeft.bot -text Clocks] +$w.outer.inRight add [ttk::labelframe $w.outer.inRight.top -text Progress] +$w.outer.inRight add [ttk::labelframe $w.outer.inRight.bot -text Text] +if {[tk windowingsystem] eq "aqua"} { + foreach i [list inLeft.top inLeft.bot inRight.top inRight.bot] { + $w.outer.$i configure -padding 3 + } +} + +# Fill the button pane +ttk::button $w.outer.inLeft.top.b -text "Press Me" -command { + tk_messageBox -type ok -icon info -message "Ouch!" -detail "That hurt..." \ + -parent .ttkpane -title "Button Pressed" +} +pack $w.outer.inLeft.top.b -padx 2 -pady 5 + +# Fill the clocks pane +set i 0 +proc every {delay script} { + uplevel #0 $script + after $delay [list every $delay $script] +} +set testzones { + :Europe/Berlin + :America/Argentina/Buenos_Aires + :Africa/Johannesburg + :Europe/London + :America/Los_Angeles + :Europe/Moscow + :America/New_York + :Asia/Singapore + :Australia/Sydney + :Asia/Tokyo +} +# Force a pre-load of all the timezones needed; otherwise can end up +# poor-looking synch problems! +set zones {} +foreach zone $testzones { + if {![catch {clock format 0 -timezone $zone}]} { + lappend zones $zone + } +} +if {[llength $zones] < 2} { lappend zones -0200 :GMT :UTC +0200 } +foreach zone $zones { + set city [string map {_ " "} [regexp -inline {[^/]+$} $zone]] + if {$i} { + pack [ttk::separator $w.outer.inLeft.bot.s$i] -fill x + } + ttk::label $w.outer.inLeft.bot.l$i -text $city -anchor w + ttk::label $w.outer.inLeft.bot.t$i -textvariable time($zone) -anchor w + pack $w.outer.inLeft.bot.l$i $w.outer.inLeft.bot.t$i -fill x + every 1000 "set time($zone) \[clock format \[clock seconds\] -timezone $zone -format %T\]" + incr i +} + +# Fill the progress pane +ttk::progressbar $w.outer.inRight.top.progress -mode indeterminate +pack $w.outer.inRight.top.progress -fill both -expand 1 +$w.outer.inRight.top.progress start + +# Fill the text pane +if {[tk windowingsystem] ne "aqua"} { + # The trick with the ttk::frame makes the text widget look like it fits with + # the current Ttk theme despite not being a themed widget itself. It is done + # by styling the frame like an entry, turning off the border in the text + # widget, and putting the text widget in the frame with enough space to allow + # the surrounding border to show through (2 pixels seems to be enough). + ttk::frame $w.outer.inRight.bot.f -style TEntry + text $w.txt -wrap word -yscroll "$w.sb set" -width 30 -borderwidth 0 + pack $w.txt -fill both -expand 1 -in $w.outer.inRight.bot.f -pady 2 -padx 2 + ttk::scrollbar $w.sb -orient vertical -command "$w.txt yview" + pack $w.sb -side right -fill y -in $w.outer.inRight.bot + pack $w.outer.inRight.bot.f -fill both -expand 1 + pack $w.outer -fill both -expand 1 +} else { + text $w.txt -wrap word -yscroll "$w.sb set" -width 30 -borderwidth 0 + scrollbar $w.sb -orient vertical -command "$w.txt yview" + pack $w.sb -side right -fill y -in $w.outer.inRight.bot + pack $w.txt -fill both -expand 1 -in $w.outer.inRight.bot + pack $w.outer -fill both -expand 1 -padx 10 -pady {6 10} +} + diff --git a/env/tcl/tk8.6/demos/ttkprogress.tcl b/env/tcl/tk8.6/demos/ttkprogress.tcl new file mode 100644 index 0000000..8a72cf9 --- /dev/null +++ b/env/tcl/tk8.6/demos/ttkprogress.tcl @@ -0,0 +1,46 @@ +# ttkprogress.tcl -- +# +# This demonstration script creates several progress bar widgets. + +if {![info exists widgetDemo]} { + error "This script should be run from the \"widget\" demo." +} + +package require Tk + +set w .ttkprogress +catch {destroy $w} +toplevel $w +wm title $w "Progress Bar Demonstration" +wm iconname $w "ttkprogress" +positionWindow $w + +ttk::label $w.msg -font $font -wraplength 4i -justify left -text "Below are two progress bars. The top one is a \u201Cdeterminate\u201D progress bar, which is used for showing how far through a defined task the program has got. The bottom one is an \u201Cindeterminate\u201D progress bar, which is used to show that the program is busy but does not know how long for. Both are run here in self-animated mode, which can be turned on and off using the buttons underneath." +pack $w.msg -side top -fill x + +## See Code / Dismiss buttons +set btns [addSeeDismiss $w.buttons $w] +pack $btns -side bottom -fill x + +ttk::frame $w.f +pack $w.f -fill both -expand 1 +set w $w.f + +proc doBars {op args} { + foreach w $args { + $w $op + } +} +ttk::progressbar $w.p1 -mode determinate +ttk::progressbar $w.p2 -mode indeterminate +ttk::button $w.start -text "Start Progress" -command [list \ + doBars start $w.p1 $w.p2] +ttk::button $w.stop -text "Stop Progress" -command [list \ + doBars stop $w.p1 $w.p2] + +grid $w.p1 - -pady 5 -padx 10 +grid $w.p2 - -pady 5 -padx 10 +grid $w.start $w.stop -padx 10 -pady 5 +grid configure $w.start -sticky e +grid configure $w.stop -sticky w +grid columnconfigure $w all -weight 1 diff --git a/env/tcl/tk8.6/demos/ttkscale.tcl b/env/tcl/tk8.6/demos/ttkscale.tcl new file mode 100644 index 0000000..1a95416 --- /dev/null +++ b/env/tcl/tk8.6/demos/ttkscale.tcl @@ -0,0 +1,39 @@ +# ttkscale.tcl -- +# +# This demonstration script shows an example with a horizontal scale. + +if {![info exists widgetDemo]} { + error "This script should be run from the \"widget\" demo." +} + +package require Tk + +set w .ttkscale +catch {destroy $w} +toplevel $w -bg [ttk::style lookup TLabel -background] +wm title $w "Themed Scale Demonstration" +wm iconname $w "ttkscale" +positionWindow $w + +pack [ttk::frame [set w $w.contents]] -fill both -expand 1 + +ttk::label $w.msg -font $font -wraplength 3.5i -justify left -text "A label tied to a horizontal scale is displayed below. If you click or drag mouse button 1 in the scale, you can change the contents of the label; a callback command is used to couple the slider to both the text and the coloring of the label." +pack $w.msg -side top -padx .5c + +## See Code / Dismiss buttons +set btns [addSeeDismiss $w.buttons [winfo toplevel $w]] +pack $btns -side bottom -fill x + +ttk::frame $w.frame -borderwidth 10 +pack $w.frame -side top -fill x + +# List of colors from rainbox; "Indigo" is not a standard color +set colorList {Red Orange Yellow Green Blue Violet} +ttk::label $w.frame.label +ttk::scale $w.frame.scale -from 0 -to 5 -command [list apply {{w idx} { + set c [lindex $::colorList [tcl::mathfunc::int $idx]] + $w.frame.label configure -foreground $c -text "Color: $c" +}} $w] +# Trigger the setting of the label's text +$w.frame.scale set 0 +pack $w.frame.label $w.frame.scale diff --git a/env/tcl/tk8.6/demos/twind.tcl b/env/tcl/tk8.6/demos/twind.tcl new file mode 100644 index 0000000..39e5110 --- /dev/null +++ b/env/tcl/tk8.6/demos/twind.tcl @@ -0,0 +1,327 @@ +# twind.tcl -- +# +# This demonstration script creates a text widget with a bunch of +# embedded windows. + +if {![info exists widgetDemo]} { + error "This script should be run from the \"widget\" demo." +} + +package require Tk + +set w .twind +catch {destroy $w} +toplevel $w +wm title $w "Text Demonstration - Embedded Windows and Other Features" +wm iconname $w "Embedded Windows" +positionWindow $w + +## See Code / Dismiss buttons +set btns [addSeeDismiss $w.buttons $w] +pack $btns -side bottom -fill x + +frame $w.f -highlightthickness 1 -borderwidth 1 -relief sunken +set t $w.f.text +text $t -yscrollcommand "$w.scroll set" -setgrid true -font $font -width 70 \ + -height 35 -wrap word -highlightthickness 0 -borderwidth 0 +pack $t -expand yes -fill both +ttk::scrollbar $w.scroll -command "$t yview" +pack $w.scroll -side right -fill y +panedwindow $w.pane +pack $w.pane -expand yes -fill both +$w.pane add $w.f +# Import to raise given creation order above +raise $w.f + +$t tag configure center -justify center -spacing1 5m -spacing3 5m +$t tag configure buttons -lmargin1 1c -lmargin2 1c -rmargin 1c \ + -spacing1 3m -spacing2 0 -spacing3 0 + +button $t.on -text "Turn On" -command "textWindOn $w" \ + -cursor top_left_arrow +button $t.off -text "Turn Off" -command "textWindOff $w" \ + -cursor top_left_arrow + +$t insert end "A text widget can contain many different kinds of items, " +$t insert end "both active and passive. It can lay these out in various " +$t insert end "ways, with wrapping, tabs, centering, etc. In addition, " +$t insert end "when the contents are too big for the window, smooth " +$t insert end "scrolling in all directions is provided.\n\n" + +$t insert end "A text widget can contain other widgets embedded " +$t insert end "it. These are called \"embedded windows\", " +$t insert end "and they can consist of arbitrary widgets. " +$t insert end "For example, here are two embedded button " +$t insert end "widgets. You can click on the first button to " +$t window create end -window $t.on +$t insert end " horizontal scrolling, which also turns off " +$t insert end "word wrapping. Or, you can click on the second " +$t insert end "button to\n" +$t window create end -window $t.off +$t insert end " horizontal scrolling and turn back on word wrapping.\n\n" + +$t insert end "Or, here is another example. If you " +$t window create end -create { + button %W.click -text "Click Here" -command "textWindPlot %W" \ + -cursor top_left_arrow} + +$t insert end " a canvas displaying an x-y plot will appear right here." +$t mark set plot insert +$t mark gravity plot left +$t insert end " You can drag the data points around with the mouse, " +$t insert end "or you can click here to " +$t window create end -create { + button %W.delete -text "Delete" -command "textWindDel %W" \ + -cursor top_left_arrow +} +$t insert end " the plot again.\n\n" + +$t insert end "You can also create multiple text widgets each of which " +$t insert end "display the same underlying text. Click this button to " +$t window create end \ + -create {button %W.peer -text "Make A Peer" -command "textMakePeer %W" \ + -cursor top_left_arrow} -padx 3 +$t insert end " widget. Notice how peer widgets can have different " +$t insert end "font settings, and by default contain all the images " +$t insert end "of the 'parent', but that the embedded windows, " +$t insert end "such as buttons may not appear in the peer. To ensure " +$t insert end "that embedded windows appear in all peers you can set the " +$t insert end "'-create' option to a script or a string containing %W. " +$t insert end "(The plot above and the 'Make A Peer' button are " +$t insert end "designed to show up in all peers.) A good use of " +$t insert end "peers is for " +$t window create end \ + -create {button %W.split -text "Split Windows" -command "textSplitWindow %W" \ + -cursor top_left_arrow} -padx 3 +$t insert end " \n\n" + +$t insert end "Users of previous versions of Tk will also be interested " +$t insert end "to note that now cursor movement is now by visual line by " +$t insert end "default, and that all scrolling of this widget is by pixel.\n\n" + +$t insert end "You may also find it useful to put embedded windows in " +$t insert end "a text without any actual text. In this case the " +$t insert end "text widget acts like a geometry manager. For " +$t insert end "example, here is a collection of buttons laid out " +$t insert end "neatly into rows by the text widget. These buttons " +$t insert end "can be used to change the background color of the " +$t insert end "text widget (\"Default\" restores the color to " +$t insert end "its default). If you click on the button labeled " +$t insert end "\"Short\", it changes to a longer string so that " +$t insert end "you can see how the text widget automatically " +$t insert end "changes the layout. Click on the button again " +$t insert end "to restore the short string.\n" + +$t insert end "\nNOTE: these buttons will not appear in peers!\n" "peer_warning" +button $t.default -text Default -command "embDefBg $t" \ + -cursor top_left_arrow +$t window create end -window $t.default -padx 3 +global embToggle +set embToggle Short +checkbutton $t.toggle -textvariable embToggle -indicatoron 0 \ + -variable embToggle -onvalue "A much longer string" \ + -offvalue "Short" -cursor top_left_arrow -pady 5 -padx 2 +$t window create end -window $t.toggle -padx 3 -pady 2 +set i 1 +foreach color {AntiqueWhite3 Bisque1 Bisque2 Bisque3 Bisque4 + SlateBlue3 RoyalBlue1 SteelBlue2 DeepSkyBlue3 LightBlue1 + DarkSlateGray1 Aquamarine2 DarkSeaGreen2 SeaGreen1 + Yellow1 IndianRed1 IndianRed2 Tan1 Tan4} { + button $t.color$i -text $color -cursor top_left_arrow -command \ + "$t configure -bg $color" + $t window create end -window $t.color$i -padx 3 -pady 2 + incr i +} +$t tag add buttons $t.default end + +button $t.bigB -text "Big borders" -command "textWindBigB $t" \ + -cursor top_left_arrow +button $t.smallB -text "Small borders" -command "textWindSmallB $t" \ + -cursor top_left_arrow +button $t.bigH -text "Big highlight" -command "textWindBigH $t" \ + -cursor top_left_arrow +button $t.smallH -text "Small highlight" -command "textWindSmallH $t" \ + -cursor top_left_arrow +button $t.bigP -text "Big pad" -command "textWindBigP $t" \ + -cursor top_left_arrow +button $t.smallP -text "Small pad" -command "textWindSmallP $t" \ + -cursor top_left_arrow + +set text_normal(border) [$t cget -borderwidth] +set text_normal(highlight) [$t cget -highlightthickness] +set text_normal(pad) [$t cget -padx] + +$t insert end "\nYou can also change the usual border width and " +$t insert end "highlightthickness and padding.\n" +$t window create end -window $t.bigB +$t window create end -window $t.smallB +$t window create end -window $t.bigH +$t window create end -window $t.smallH +$t window create end -window $t.bigP +$t window create end -window $t.smallP + +$t insert end "\n\nFinally, images fit comfortably in text widgets too:" + +$t image create end -image \ + [image create photo -file [file join $tk_demoDirectory images ouster.png]] + +proc textWindBigB w { + $w configure -borderwidth 15 +} + +proc textWindBigH w { + $w configure -highlightthickness 15 +} + +proc textWindBigP w { + $w configure -padx 15 -pady 15 +} + +proc textWindSmallB w { + $w configure -borderwidth $::text_normal(border) +} + +proc textWindSmallH w { + $w configure -highlightthickness $::text_normal(highlight) +} + +proc textWindSmallP w { + $w configure -padx $::text_normal(pad) -pady $::text_normal(pad) +} + + +proc textWindOn w { + catch {destroy $w.scroll2} + set t $w.f.text + ttk::scrollbar $w.scroll2 -orient horizontal -command "$t xview" + pack $w.scroll2 -after $w.buttons -side bottom -fill x + $t configure -xscrollcommand "$w.scroll2 set" -wrap none +} + +proc textWindOff w { + catch {destroy $w.scroll2} + set t $w.f.text + $t configure -xscrollcommand {} -wrap word +} + +proc textWindPlot t { + set c $t.c + if {[winfo exists $c]} { + return + } + + while {[string first [$t get plot] " \t\n"] >= 0} { + $t delete plot + } + $t insert plot "\n" + + $t window create plot -create {createPlot %W} + $t tag add center plot + $t insert plot "\n" +} + +proc createPlot {t} { + set c $t.c + + canvas $c -relief sunken -width 450 -height 300 -cursor top_left_arrow + + set font {Helvetica 18} + + $c create line 100 250 400 250 -width 2 + $c create line 100 250 100 50 -width 2 + $c create text 225 20 -text "A Simple Plot" -font $font -fill brown + + for {set i 0} {$i <= 10} {incr i} { + set x [expr {100 + ($i*30)}] + $c create line $x 250 $x 245 -width 2 + $c create text $x 254 -text [expr {10*$i}] -anchor n -font $font + } + for {set i 0} {$i <= 5} {incr i} { + set y [expr {250 - ($i*40)}] + $c create line 100 $y 105 $y -width 2 + $c create text 96 $y -text [expr {$i*50}].0 -anchor e -font $font + } + + foreach point { + {12 56} {20 94} {33 98} {32 120} {61 180} {75 160} {98 223} + } { + set x [expr {100 + (3*[lindex $point 0])}] + set y [expr {250 - (4*[lindex $point 1])/5}] + set item [$c create oval [expr {$x-6}] [expr {$y-6}] \ + [expr {$x+6}] [expr {$y+6}] -width 1 -outline black \ + -fill SkyBlue2] + $c addtag point withtag $item + } + + $c bind point "$c itemconfig current -fill red" + $c bind point "$c itemconfig current -fill SkyBlue2" + $c bind point <1> "embPlotDown $c %x %y" + $c bind point "$c dtag selected" + bind $c "embPlotMove $c %x %y" + return $c +} + +set embPlot(lastX) 0 +set embPlot(lastY) 0 + +proc embPlotDown {w x y} { + global embPlot + $w dtag selected + $w addtag selected withtag current + $w raise current + set embPlot(lastX) $x + set embPlot(lastY) $y +} + +proc embPlotMove {w x y} { + global embPlot + $w move selected [expr {$x-$embPlot(lastX)}] [expr {$y-$embPlot(lastY)}] + set embPlot(lastX) $x + set embPlot(lastY) $y +} + +proc textWindDel t { + if {[winfo exists $t.c]} { + $t delete $t.c + while {[string first [$t get plot] " \t\n"] >= 0} { + $t delete plot + } + $t insert plot " " + } +} + +proc embDefBg t { + $t configure -background [lindex [$t configure -background] 3] +} + +proc textMakePeer {parent} { + set n 1 + while {[winfo exists .peer$n]} { incr n } + set w [toplevel .peer$n] + wm title $w "Text Peer #$n" + frame $w.f -highlightthickness 1 -borderwidth 1 -relief sunken + set t [$parent peer create $w.f.text -yscrollcommand "$w.scroll set" \ + -borderwidth 0 -highlightthickness 0] + $t tag configure peer_warning -font boldFont + pack $t -expand yes -fill both + ttk::scrollbar $w.scroll -command "$t yview" + pack $w.scroll -side right -fill y + pack $w.f -expand yes -fill both +} + +proc textSplitWindow {textW} { + if {$textW eq ".twind.f.text"} { + if {[winfo exists .twind.peer]} { + destroy .twind.peer + } else { + set parent [winfo parent $textW] + set w [winfo parent $parent] + set t [$textW peer create $w.peer \ + -yscrollcommand "$w.scroll set"] + $t tag configure peer_warning -font boldFont + $w.pane add $t + } + } else { + return + } +} diff --git a/env/tcl/tk8.6/demos/unicodeout.tcl b/env/tcl/tk8.6/demos/unicodeout.tcl new file mode 100644 index 0000000..faa9f90 --- /dev/null +++ b/env/tcl/tk8.6/demos/unicodeout.tcl @@ -0,0 +1,137 @@ +# unicodeout.tcl -- +# +# This demonstration script shows how you can produce output (in label +# widgets) using many different alphabets. + +if {![info exists widgetDemo]} { + error "This script should be run from the \"widget\" demo." +} + +package require Tk + +set w .unicodeout +catch {destroy $w} +toplevel $w +wm title $w "Unicode Label Demonstration" +wm iconname $w "unicodeout" +positionWindow $w + +label $w.msg -font $font -wraplength 4i -anchor w -justify left \ + -text "This is a sample of Tk's support for languages that use\ + non-Western character sets. However, what you will actually see\ + below depends largely on what character sets you have installed,\ + and what you see for characters that are not present varies greatly\ + between platforms as well. The strings are written in Tcl using\ + UNICODE characters using the \\uXXXX escape so as to do so in a\ + portable fashion." +pack $w.msg -side top + +## See Code / Dismiss buttons +set btns [addSeeDismiss $w.buttons $w] +pack $btns -side bottom -fill x + +## The frame that will contain the sample texts. +pack [frame $w.f] -side bottom -expand 1 -fill both -padx 2m -pady 1m +grid columnconfigure $w.f 1 -weight 1 +set i 0 +proc addSample {w language args} { + global font i + set sample [join $args ""] + set j [incr i] + label $w.f.l$j -font $font -text "${language}:" -anchor nw -pady 0 + label $w.f.s$j -font $font -text $sample -anchor nw -width 30 -pady 0 + grid $w.f.l$j $w.f.s$j -sticky ew -pady 0 + grid configure $w.f.l$j -padx 1m +} + +## A helper procedure that determines what form to use to express languages +## that have complex rendering rules... +proc usePresentationFormsFor {language} { + switch [tk windowingsystem] { + aqua { + # OSX wants natural character order; the renderer knows how to + # compose things for display for all languages. + return false + } + x11 { + # The X11 font renderers that Tk supports all know nothing about + # composing characters, so we need to use presentation forms. + return true + } + win32 { + # On Windows, we need to determine whether the font system will + # render right-to-left text. This varies by language! + try { + package require registry + set rkey [join { + HKEY_LOCAL_MACHINE + SOFTWARE + Microsoft + {Windows NT} + CurrentVersion + LanguagePack + } \\] + return [expr { + [string toupper $language] ni [registry values $rkey] + }] + } trap error {} { + # Cannot work it out, so use presentation forms. + return true + } + } + default { + # Default to using presentation forms. + return true + } + } +} + +## Processing when some characters are not currently cached by the display +## engine might take a while, so make sure we're displaying something in the +## meantime... +pack [label $w.wait -text "Please wait while loading fonts..." \ + -font {Helvetica 12 italic}] +set oldCursor [$w cget -cursor] +$w conf -cursor watch +update + +## Add the samples... +if {[usePresentationFormsFor Arabic]} { + # Using presentation forms (pre-layouted) + addSample $w Arabic \ + "\uFE94\uFEF4\uFE91\uFEAE\uFECC\uFEDF\uFE8D " \ + "\uFE94\uFEE4\uFEE0\uFEDC\uFEDF\uFE8D" +} else { + # Using standard text characters + addSample $w Arabic \ + "\u0627\u0644\u0643\u0644\u0645\u0629 " \ + "\u0627\u0644\u0639\u0631\u0628\u064A\u0629" +} +addSample $w "Trad. Chinese" "\u4E2D\u570B\u7684\u6F22\u5B57" +addSample $w "Simpl. Chinese" "\u6C49\u8BED" +addSample $w French "Langue fran\u00E7aise" +addSample $w Greek \ + "\u0395\u03BB\u03BB\u03B7\u03BD\u03B9\u03BA\u03AE " \ + "\u03B3\u03BB\u03CE\u03C3\u03C3\u03B1" +if {[usePresentationFormsFor Hebrew]} { + # Visual order (pre-layouted) + addSample $w Hebrew \ + "\u05EA\u05D9\u05E8\u05D1\u05E2 \u05D1\u05EA\u05DB" +} else { + # Standard logical order + addSample $w Hebrew \ + "\u05DB\u05EA\u05D1 \u05E2\u05D1\u05E8\u05D9\u05EA" +} +addSample $w Hindi \ + "\u0939\u093f\u0928\u094d\u0926\u0940 \u092d\u093e\u0937\u093e" +addSample $w Icelandic "\u00CDslenska" +addSample $w Japanese \ + "\u65E5\u672C\u8A9E\u306E\u3072\u3089\u304C\u306A, " \ + "\u6F22\u5B57\u3068\u30AB\u30BF\u30AB\u30CA" +addSample $w Korean "\uB300\uD55C\uBBFC\uAD6D\uC758 \uD55C\uAE00" +addSample $w Russian \ + "\u0420\u0443\u0441\u0441\u043A\u0438\u0439 \u044F\u0437\u044B\u043A" + +## We're done processing, so change things back to normal running... +destroy $w.wait +$w conf -cursor $oldCursor diff --git a/env/tcl/tk8.6/demos/vscale.tcl b/env/tcl/tk8.6/demos/vscale.tcl new file mode 100644 index 0000000..2c7ea76 --- /dev/null +++ b/env/tcl/tk8.6/demos/vscale.tcl @@ -0,0 +1,46 @@ +# vscale.tcl -- +# +# This demonstration script shows an example with a vertical scale. + +if {![info exists widgetDemo]} { + error "This script should be run from the \"widget\" demo." +} + +package require Tk + +set w .vscale +catch {destroy $w} +toplevel $w +wm title $w "Vertical Scale Demonstration" +wm iconname $w "vscale" +positionWindow $w + +label $w.msg -font $font -wraplength 3.5i -justify left -text "An arrow and a vertical scale are displayed below. If you click or drag mouse button 1 in the scale, you can change the size of the arrow." +pack $w.msg -side top -padx .5c + +## See Code / Dismiss buttons +set btns [addSeeDismiss $w.buttons $w] +pack $btns -side bottom -fill x + +frame $w.frame -borderwidth 10 +pack $w.frame + +scale $w.frame.scale -orient vertical -length 284 -from 0 -to 250 \ + -command "setHeight $w.frame.canvas" -tickinterval 50 +canvas $w.frame.canvas -width 50 -height 50 -bd 0 -highlightthickness 0 +$w.frame.canvas create polygon 0 0 1 1 2 2 -fill SeaGreen3 -tags poly +$w.frame.canvas create line 0 0 1 1 2 2 0 0 -fill black -tags line +frame $w.frame.right -borderwidth 15 +pack $w.frame.scale -side left -anchor ne +pack $w.frame.canvas -side left -anchor nw -fill y +$w.frame.scale set 75 + +proc setHeight {w height} { + incr height 21 + set y2 [expr {$height - 30}] + if {$y2 < 21} { + set y2 21 + } + $w coords poly 15 20 35 20 35 $y2 45 $y2 25 $height 5 $y2 15 $y2 15 20 + $w coords line 15 20 35 20 35 $y2 45 $y2 25 $height 5 $y2 15 $y2 15 20 +} diff --git a/env/tcl/tk8.6/demos/widget b/env/tcl/tk8.6/demos/widget new file mode 100644 index 0000000..1d838ad --- /dev/null +++ b/env/tcl/tk8.6/demos/widget @@ -0,0 +1,721 @@ +#!/bin/sh +# the next line restarts using wish \ +exec wish "$0" ${1+"$@"} + +# widget -- +# This script demonstrates the various widgets provided by Tk, along with many +# of the features of the Tk toolkit. This file only contains code to generate +# the main window for the application, which invokes individual +# demonstrations. The code for the actual demonstrations is contained in +# separate ".tcl" files is this directory, which are sourced by this script as +# needed. + +package require Tk 8.5 +package require msgcat + +eval destroy [winfo child .] +set tk_demoDirectory [file join [pwd] [file dirname [info script]]] +::msgcat::mcload $tk_demoDirectory +namespace import ::msgcat::mc +wm title . [mc "Widget Demonstration"] +if {[tk windowingsystem] eq "x11"} { + # This won't work everywhere, but there's no other way in core Tk at the + # moment to display a coloured icon. + image create photo TclPowered \ + -file [file join $tk_library images logo64.gif] + wm iconwindow . [toplevel ._iconWindow] + pack [label ._iconWindow.i -image TclPowered] + wm iconname . [mc "tkWidgetDemo"] +} + +if {"defaultFont" ni [font names]} { + # TIP #145 defines some standard named fonts + if {"TkDefaultFont" in [font names] && "TkFixedFont" in [font names]} { + # FIX ME: the following technique of cloning the font to copy it works + # fine but means that if the system font is changed by Tk + # cannot update the copied font. font alias might be useful + # here -- or fix the app to use TkDefaultFont etc. + font create mainFont {*}[font configure TkDefaultFont] + font create fixedFont {*}[font configure TkFixedFont] + font create boldFont {*}[font configure TkDefaultFont] -weight bold + font create titleFont {*}[font configure TkDefaultFont] -weight bold + font create statusFont {*}[font configure TkDefaultFont] + font create varsFont {*}[font configure TkDefaultFont] + if {[tk windowingsystem] eq "aqua"} { + font configure titleFont -size 17 + } + } else { + font create mainFont -family Helvetica -size 12 + font create fixedFont -family Courier -size 10 + font create boldFont -family Helvetica -size 12 -weight bold + font create titleFont -family Helvetica -size 18 -weight bold + font create statusFont -family Helvetica -size 10 + font create varsFont -family Helvetica -size 14 + } +} + +set widgetDemo 1 +set font mainFont + +image create photo ::img::refresh -format GIF -data { + R0lGODlhEAAQAJEDAP///wAAACpnKv///yH5BAEAAAMALAAAAAAQABAAAAI63IKp + xgcPH2ouwgBCw1HIxHCQ4F3hSJKmwZXqWrmWxj7lKJ2dndcon9EBUq+gz3brVXAR + 2tICU0gXBQA7 +} + +image create photo ::img::view -format GIF -data { + R0lGODlhEAAQAKIHAP///wwMDAAAAMDAwNnZ2SYmJmZmZv///yH5BAEAAAcALAAA + AAAQABAAAANMKLos90+ASamDRxJCgw9YVnlDOXiQBgRDBRgHKE6sW8QR3doPKK27 + yg33q/GIOhdg6OsEJzeZykiBSUcs06e56Xx6np8ScIkFGuhQAgA7 +} + +image create photo ::img::delete -format GIF -data { + R0lGODlhEAAQAIABAIQAAP///yH5BAEAAAEALAAAAAAQABAAAAIjjI+pmwAc3HGy + PUSvqYpuvWQg40FfSVacBa5nN6JYDI3mzRQAOw== +} + +image create photo ::img::print -format GIF -data { + R0lGODlhEAAQALMKAAAAAP///52VunNkl8C82Yl+qldBgq+pyrOzs1fYAP///wAA + AAAAAAAAAAAAAAAAACH5BAEAAAoALAAAAAAQABAAAARGUMlJKwU4AztB+ODGeUiJ + fGLlgeEYmGWQXmx7aXgmAUTv/74N4EAsGhOJg1DAbDqbwoJ0Sp0KB9isNis0eL/g + ryhH5pgnEQA7 +} + +# Note that this is run through the message catalog! This is because this is +# actually an image of a word. +image create photo ::img::new -format GIF -data [mc { + R0lGODlhHgAOALMPALMAANyIiOu7u8dEROaqqvru7sxVVeGZmbgREfXd3b0iItZ3 + d8IzM9FmZvDMzP///yH5BAEAAA8ALAAAAAAeAA4AAASa8MlJq7046827WVOCHEkw + nANhUgJlEBIABJIwL3K+4IcUALCHjfbItYZDSgJgkBiYPmBMAUAkkLPKs/BAyLgM + wAQwOAAY2ByCaw4QAFQSoDEePJ6DmU1xInYZTw5nOEFFdgVUelkVDTIMd3AKFGQ1 + MgI2AwEmQW8APZ0gdRONAks5nhIFVVxdAAkUAS2pAVwFl7ITB4UqHb0XEQA7 +}] + +#---------------------------------------------------------------- +# The code below create the main window, consisting of a menu bar and a text +# widget that explains how to use the program, plus lists all of the demos as +# hypertext items. +#---------------------------------------------------------------- + +menu .menuBar -tearoff 0 + +if {[tk windowingsystem] ne "aqua"} { + # This is a tk-internal procedure to make i18n easier + ::tk::AmpMenuArgs .menuBar add cascade -label [mc "&File"] \ + -menu .menuBar.file + menu .menuBar.file -tearoff 0 + ::tk::AmpMenuArgs .menuBar.file add command -label [mc "&About..."] \ + -command {tkAboutDialog} -accelerator [mc ""] + bind . {tkAboutDialog} + .menuBar.file add sep + if {[string match win* [tk windowingsystem]]} { + # Windows doesn't usually have a Meta key + ::tk::AmpMenuArgs .menuBar.file add command -label [mc "&Quit"] \ + -command {exit} -accelerator [mc "Ctrl+Q"] + bind . <[mc "Control-q"]> {exit} + } else { + ::tk::AmpMenuArgs .menuBar.file add command -label [mc "&Quit"] \ + -command {exit} -accelerator [mc "Meta-Q"] + bind . <[mc "Meta-q"]> {exit} + } +} + +. configure -menu .menuBar + +ttk::frame .statusBar +ttk::label .statusBar.lab -text " " -anchor w +if {[tk windowingsystem] eq "aqua"} { + ttk::separator .statusBar.sep + pack .statusBar.sep -side top -expand yes -fill x -pady 0 +} +pack .statusBar.lab -side left -padx 2 -expand yes -fill both +if {[tk windowingsystem] ne "aqua"} { + ttk::sizegrip .statusBar.foo + pack .statusBar.foo -side left -padx 2 +} +pack .statusBar -side bottom -fill x -pady 2 + +set textheight 30 +catch { + set textheight [expr { + ([winfo screenheight .] * 0.7) / + [font metrics mainFont -displayof . -linespace] + }] +} + +ttk::frame .textFrame +ttk::scrollbar .s -orient vertical -command {.t yview} -takefocus 1 +pack .s -in .textFrame -side right -fill y +text .t -yscrollcommand {.s set} -wrap word -width 70 -height $textheight \ + -font mainFont -setgrid 1 -highlightthickness 0 \ + -padx 4 -pady 2 -takefocus 0 +pack .t -in .textFrame -expand y -fill both -padx 1 +pack .textFrame -expand yes -fill both +if {[tk windowingsystem] eq "aqua"} { + pack configure .statusBar.lab -padx {10 18} -pady {4 6} + pack configure .statusBar -pady 0 + .t configure -padx 10 -pady 0 +} + +# Create a bunch of tags to use in the text widget, such as those for section +# titles and demo descriptions. Also define the bindings for tags. + +.t tag configure title -font titleFont +.t tag configure subtitle -font titleFont +.t tag configure bold -font boldFont +if {[tk windowingsystem] eq "aqua"} { + .t tag configure title -spacing1 8 + .t tag configure subtitle -spacing3 3 +} + +# We put some "space" characters to the left and right of each demo +# description so that the descriptions are highlighted only when the mouse +# cursor is right over them (but not when the cursor is to their left or +# right). +# +.t tag configure demospace -lmargin1 1c -lmargin2 1c + +if {[winfo depth .] == 1} { + .t tag configure demo -lmargin1 1c -lmargin2 1c \ + -underline 1 + .t tag configure visited -lmargin1 1c -lmargin2 1c \ + -underline 1 + .t tag configure hot -background black -foreground white +} else { + .t tag configure demo -lmargin1 1c -lmargin2 1c \ + -foreground blue -underline 1 + .t tag configure visited -lmargin1 1c -lmargin2 1c \ + -foreground #303080 -underline 1 + .t tag configure hot -foreground red -underline 1 +} +.t tag bind demo { + invoke [.t index {@%x,%y}] +} +set lastLine "" +.t tag bind demo { + set lastLine [.t index {@%x,%y linestart}] + .t tag add hot "$lastLine +1 chars" "$lastLine lineend -1 chars" + .t config -cursor [::ttk::cursor link] + showStatus [.t index {@%x,%y}] +} +.t tag bind demo { + .t tag remove hot 1.0 end + .t config -cursor [::ttk::cursor text] + .statusBar.lab config -text "" +} +.t tag bind demo { + set newLine [.t index {@%x,%y linestart}] + if {$newLine ne $lastLine} { + .t tag remove hot 1.0 end + set lastLine $newLine + + set tags [.t tag names {@%x,%y}] + set i [lsearch -glob $tags demo-*] + if {$i >= 0} { + .t tag add hot "$lastLine +1 chars" "$lastLine lineend -1 chars" + } + } + showStatus [.t index {@%x,%y}] +} + +############################################################################## +# Create the text for the text widget. + +# addFormattedText -- +# +# Add formatted text (but not hypertext) to the text widget after first +# passing it through the message catalog to allow for localization. +# Lines starting with @@ are formatting directives (insert title, insert +# demo hyperlink, begin newline, or change style) and all other lines +# are literal strings to be inserted. Substitutions are performed, +# allowing processing pieces through the message catalog. Blank lines +# are ignored. +# +proc addFormattedText {formattedText} { + set style normal + set isNL 1 + set demoCount 0 + set new 0 + foreach line [split $formattedText \n] { + set line [string trim $line] + if {$line eq ""} { + continue + } + if {[string match @@* $line]} { + set data [string range $line 2 end] + set key [lindex $data 0] + set values [lrange $data 1 end] + switch -exact -- $key { + title { + .t insert end [mc $values]\n title \n normal + } + newline { + .t insert end \n $style + set isNL 1 + } + subtitle { + .t insert end "\n" {} [mc $values] subtitle \ + " \n " demospace + set demoCount 0 + } + demo { + set description [lassign $values name] + .t insert end "[incr demoCount]. [mc $description]" \ + [list demo demo-$name] + if {$new} { + .t image create end -image ::img::new -padx 5 + set new 0 + } + .t insert end " \n " demospace + } + new { + set new 1 + } + default { + set style $key + } + } + continue + } + if {!$isNL} { + .t insert end " " $style + } + set isNL 0 + .t insert end [mc $line] $style + } +} + +addFormattedText { + @@title Tk Widget Demonstrations + + This application provides a front end for several short scripts + that demonstrate what you can do with Tk widgets. Each of the + numbered lines below describes a demonstration; you can click on + it to invoke the demonstration. Once the demonstration window + appears, you can click the + @@bold + See Code + @@normal + button to see the Tcl/Tk code that created the demonstration. If + you wish, you can edit the code and click the + @@bold + Rerun Demo + @@normal + button in the code window to reinvoke the demonstration with the + modified code. + @@newline + + @@subtitle Labels, buttons, checkbuttons, and radiobuttons + @@demo label Labels (text and bitmaps) + @@demo unicodeout Labels and UNICODE text + @@demo button Buttons + @@demo check Check-buttons (select any of a group) + @@demo radio Radio-buttons (select one of a group) + @@demo puzzle A 15-puzzle game made out of buttons + @@demo icon Iconic buttons that use bitmaps + @@demo image1 Two labels displaying images + @@demo image2 A simple user interface for viewing images + @@demo labelframe Labelled frames + @@demo ttkbut The simple Themed Tk widgets + + @@subtitle Listboxes and Trees + @@demo states The 50 states + @@demo colors Colors: change the color scheme for the application + @@demo sayings A collection of famous and infamous sayings + @@demo mclist A multi-column list of countries + @@demo tree A directory browser tree + + @@subtitle Entries, Spin-boxes and Combo-boxes + @@demo entry1 Entries without scrollbars + @@demo entry2 Entries with scrollbars + @@demo entry3 Validated entries and password fields + @@demo spin Spin-boxes + @@demo combo Combo-boxes + @@demo form Simple Rolodex-like form + + @@subtitle Text + @@demo text Basic editable text + @@demo style Text display styles + @@demo bind Hypertext (tag bindings) + @@demo twind A text widget with embedded windows and other features + @@demo search A search tool built with a text widget + @@demo textpeer Peering text widgets + + @@subtitle Canvases + @@demo items The canvas item types + @@demo plot A simple 2-D plot + @@demo ctext Text items in canvases + @@demo arrow An editor for arrowheads on canvas lines + @@demo ruler A ruler with adjustable tab stops + @@demo floor A building floor plan + @@demo cscroll A simple scrollable canvas + @@demo knightstour A Knight's tour of the chess board + + @@subtitle Scales and Progress Bars + @@demo hscale Horizontal scale + @@demo vscale Vertical scale + @@new + @@demo ttkscale Themed scale linked to a label with traces + @@demo ttkprogress Progress bar + + @@subtitle Paned Windows and Notebooks + @@demo paned1 Horizontal paned window + @@demo paned2 Vertical paned window + @@demo ttkpane Themed nested panes + @@demo ttknote Notebook widget + + @@subtitle Menus and Toolbars + @@demo menu Menus and cascades (sub-menus) + @@demo menubu Menu-buttons + @@demo ttkmenu Themed menu buttons + @@demo toolbar Themed toolbar + + @@subtitle Common Dialogs + @@demo msgbox Message boxes + @@demo filebox File selection dialog + @@demo clrpick Color picker + @@demo fontchoose Font selection dialog + + @@subtitle Animation + @@demo anilabel Animated labels + @@demo aniwave Animated wave + @@demo pendulum Pendulum simulation + @@demo goldberg A celebration of Rube Goldberg + + @@subtitle Miscellaneous + @@demo bitmap The built-in bitmaps + @@demo dialog1 A dialog box with a local grab + @@demo dialog2 A dialog box with a global grab +} + +############################################################################## + +.t configure -state disabled +focus .s + +# addSeeDismiss -- +# Add "See Code" and "Dismiss" button frame, with optional "See Vars" +# +# Arguments: +# w - The name of the frame to use. + +proc addSeeDismiss {w show {vars {}} {extra {}}} { + ## See Code / Dismiss buttons + ttk::frame $w + ttk::separator $w.sep + #ttk::frame $w.sep -height 2 -relief sunken + grid $w.sep -columnspan 4 -row 0 -sticky ew -pady 2 + ttk::button $w.dismiss -text [mc "Dismiss"] \ + -image ::img::delete -compound left \ + -command [list destroy [winfo toplevel $w]] + ttk::button $w.code -text [mc "See Code"] \ + -image ::img::view -compound left \ + -command [list showCode $show] + set buttons [list x $w.code $w.dismiss] + if {[llength $vars]} { + ttk::button $w.vars -text [mc "See Variables"] \ + -image ::img::view -compound left \ + -command [concat [list showVars $w.dialog] $vars] + set buttons [linsert $buttons 1 $w.vars] + } + if {$extra ne ""} { + set buttons [linsert $buttons 1 [uplevel 1 $extra]] + } + grid {*}$buttons -padx 4 -pady 4 + grid columnconfigure $w 0 -weight 1 + if {[tk windowingsystem] eq "aqua"} { + foreach b [lrange $buttons 1 end] {$b configure -takefocus 0} + grid configure $w.sep -pady 0 + grid configure {*}$buttons -pady {10 12} + grid configure [lindex $buttons 1] -padx {16 4} + grid configure [lindex $buttons end] -padx {4 18} + } + return $w +} + +# positionWindow -- +# This procedure is invoked by most of the demos to position a new demo +# window. +# +# Arguments: +# w - The name of the window to position. + +proc positionWindow w { + wm geometry $w +300+300 +} + +# showVars -- +# Displays the values of one or more variables in a window, and updates the +# display whenever any of the variables changes. +# +# Arguments: +# w - Name of new window to create for display. +# args - Any number of names of variables. + +proc showVars {w args} { + catch {destroy $w} + toplevel $w + if {[tk windowingsystem] eq "x11"} {wm attributes $w -type dialog} + wm title $w [mc "Variable values"] + + set b [ttk::frame $w.frame] + grid $b -sticky news + set f [ttk::labelframe $b.title -text [mc "Variable values:"]] + foreach var $args { + ttk::label $f.n$var -text "$var:" -anchor w + ttk::label $f.v$var -textvariable $var -anchor w + grid $f.n$var $f.v$var -padx 2 -pady 2 -sticky w + } + ttk::button $b.ok -text [mc "OK"] \ + -command [list destroy $w] -default active + bind $w [list $b.ok invoke] + bind $w [list $b.ok invoke] + + grid $f -sticky news -padx 4 + grid $b.ok -sticky e -padx 4 -pady {6 4} + if {[tk windowingsystem] eq "aqua"} { + $b.ok configure -takefocus 0 + grid configure $b.ok -pady {10 12} -padx {16 18} + grid configure $f -padx 10 -pady {10 0} + } + grid columnconfig $f 1 -weight 1 + grid rowconfigure $f 100 -weight 1 + grid columnconfig $b 0 -weight 1 + grid rowconfigure $b 0 -weight 1 + grid columnconfig $w 0 -weight 1 + grid rowconfigure $w 0 -weight 1 +} + +# invoke -- +# This procedure is called when the user clicks on a demo description. It is +# responsible for invoking the demonstration. +# +# Arguments: +# index - The index of the character that the user clicked on. + +proc invoke index { + global tk_demoDirectory + set tags [.t tag names $index] + set i [lsearch -glob $tags demo-*] + if {$i < 0} { + return + } + set cursor [.t cget -cursor] + .t configure -cursor [::ttk::cursor busy] + update + set demo [string range [lindex $tags $i] 5 end] + uplevel 1 [list source [file join $tk_demoDirectory $demo.tcl]] + update + .t configure -cursor $cursor + + .t tag add visited "$index linestart +1 chars" "$index lineend -1 chars" +} + +# showStatus -- +# +# Show the name of the demo program in the status bar. This procedure is +# called when the user moves the cursor over a demo description. +# +proc showStatus index { + set tags [.t tag names $index] + set i [lsearch -glob $tags demo-*] + set cursor [.t cget -cursor] + if {$i < 0} { + .statusBar.lab config -text " " + set newcursor [::ttk::cursor text] + } else { + set demo [string range [lindex $tags $i] 5 end] + .statusBar.lab config -text [mc "Run the \"%s\" sample program" $demo] + set newcursor [::ttk::cursor link] + } + if {$cursor ne $newcursor} { + .t config -cursor $newcursor + } +} + +# evalShowCode -- +# +# Arguments: +# w - Name of text widget containing code to eval + +proc evalShowCode {w} { + set code [$w get 1.0 end-1c] + uplevel #0 $code +} + +# showCode -- +# This procedure creates a toplevel window that displays the code for a +# demonstration and allows it to be edited and reinvoked. +# +# Arguments: +# w - The name of the demonstration's window, which can be used to +# derive the name of the file containing its code. + +proc showCode w { + global tk_demoDirectory + set file [string range $w 1 end].tcl + set top .code + if {![winfo exists $top]} { + toplevel $top + if {[tk windowingsystem] eq "x11"} {wm attributes $top -type dialog} + + set t [frame $top.f] + set text [text $t.text -font fixedFont -height 24 -wrap word \ + -xscrollcommand [list $t.xscroll set] \ + -yscrollcommand [list $t.yscroll set] \ + -setgrid 1 -highlightthickness 0 -pady 2 -padx 3] + ttk::scrollbar $t.xscroll -command [list $t.text xview] \ + -orient horizontal + ttk::scrollbar $t.yscroll -command [list $t.text yview] \ + -orient vertical + + grid $t.text $t.yscroll -sticky news + #grid $t.xscroll + grid rowconfigure $t 0 -weight 1 + grid columnconfig $t 0 -weight 1 + + set btns [ttk::frame $top.btns] + ttk::separator $btns.sep + grid $btns.sep -columnspan 4 -row 0 -sticky ew -pady 2 + ttk::button $btns.dismiss -text [mc "Dismiss"] \ + -default active -command [list destroy $top] \ + -image ::img::delete -compound left + ttk::button $btns.print -text [mc "Print Code"] \ + -command [list printCode $text $file] \ + -image ::img::print -compound left + ttk::button $btns.rerun -text [mc "Rerun Demo"] \ + -command [list evalShowCode $text] \ + -image ::img::refresh -compound left + set buttons [list x $btns.rerun $btns.print $btns.dismiss] + grid {*}$buttons -padx 4 -pady 4 + grid columnconfigure $btns 0 -weight 1 + if {[tk windowingsystem] eq "aqua"} { + foreach b [lrange $buttons 1 end] {$b configure -takefocus 0} + grid configure $btns.sep -pady 0 + grid configure {*}$buttons -pady {10 12} + grid configure [lindex $buttons 1] -padx {16 4} + grid configure [lindex $buttons end] -padx {4 18} + } + grid $t -sticky news + grid $btns -sticky ew + grid rowconfigure $top 0 -weight 1 + grid columnconfig $top 0 -weight 1 + + bind $top { + if {[winfo class %W] ne "Text"} { .code.btns.dismiss invoke } + } + bind $top [bind $top ] + } else { + wm deiconify $top + raise $top + } + wm title $top [mc "Demo code: %s" [file join $tk_demoDirectory $file]] + wm iconname $top $file + set id [open [file join $tk_demoDirectory $file]] + $top.f.text delete 1.0 end + $top.f.text insert 1.0 [read $id] + $top.f.text mark set insert 1.0 + close $id +} + +# printCode -- +# Prints the source code currently displayed in the See Code dialog. Much +# thanks to Arjen Markus for this. +# +# Arguments: +# w - Name of text widget containing code to print +# file - Name of the original file (implicitly for title) + +proc printCode {w file} { + set code [$w get 1.0 end-1c] + + set dir "." + if {[info exists ::env(HOME)]} { + set dir "$::env(HOME)" + } + if {[info exists ::env(TMP)]} { + set dir $::env(TMP) + } + if {[info exists ::env(TEMP)]} { + set dir $::env(TEMP) + } + + set filename [file join $dir "tkdemo-$file"] + set outfile [open $filename "w"] + puts $outfile $code + close $outfile + + switch -- $::tcl_platform(platform) { + unix { + if {[catch {exec lp -c $filename} msg]} { + tk_messageBox -title "Print spooling failure" \ + -message "Print spooling probably failed: $msg" + } + } + windows { + if {[catch {PrintTextWin32 $filename} msg]} { + tk_messageBox -title "Print spooling failure" \ + -message "Print spooling probably failed: $msg" + } + } + default { + tk_messageBox -title "Operation not Implemented" \ + -message "Wow! Unknown platform: $::tcl_platform(platform)" + } + } + + # + # Be careful to throw away the temporary file in a gentle manner ... + # + if {[file exists $filename]} { + catch {file delete $filename} + } +} + +# PrintTextWin32 -- +# Print a file under Windows using all the "intelligence" necessary +# +# Arguments: +# filename - Name of the file +# +# Note: +# Taken from the Wiki page by Keith Vetter, "Printing text files under +# Windows". +# Note: +# Do not execute the command in the background: that way we can dispose of the +# file smoothly. +# +proc PrintTextWin32 {filename} { + package require registry + set app [auto_execok notepad.exe] + set pcmd "$app /p %1" + catch { + set app [registry get {HKEY_CLASSES_ROOT\.txt} {}] + set pcmd [registry get \ + {HKEY_CLASSES_ROOT\\$app\\shell\\print\\command} {}] + } + + regsub -all {%1} $pcmd $filename pcmd + puts $pcmd + + regsub -all {\\} $pcmd {\\\\} pcmd + set command "[auto_execok start] /min $pcmd" + eval exec $command +} + +# tkAboutDialog -- +# +# Pops up a message box with an "about" message +# +proc tkAboutDialog {} { + tk_messageBox -icon info -type ok -title [mc "About Widget Demo"] \ + -message [mc "Tk widget demonstration application"] -detail \ +"[mc "Copyright \u00a9 %s" {1996-1997 Sun Microsystems, Inc.}] +[mc "Copyright \u00a9 %s" {1997-2000 Ajuba Solutions, Inc.}] +[mc "Copyright \u00a9 %s" {2001-2009 Donal K. Fellows}] +[mc "Copyright \u00a9 %s" {2002-2007 Daniel A. Steffen}]" +} + +# Local Variables: +# mode: tcl +# End: diff --git a/env/tcl/tk8.6/dialog.tcl b/env/tcl/tk8.6/dialog.tcl new file mode 100644 index 0000000..c751621 --- /dev/null +++ b/env/tcl/tk8.6/dialog.tcl @@ -0,0 +1,180 @@ +# dialog.tcl -- +# +# This file defines the procedure tk_dialog, which creates a dialog +# box containing a bitmap, a message, and one or more buttons. +# +# Copyright (c) 1992-1993 The Regents of the University of California. +# Copyright (c) 1994-1997 Sun Microsystems, Inc. +# +# See the file "license.terms" for information on usage and redistribution +# of this file, and for a DISCLAIMER OF ALL WARRANTIES. +# + +# +# ::tk_dialog: +# +# This procedure displays a dialog box, waits for a button in the dialog +# to be invoked, then returns the index of the selected button. If the +# dialog somehow gets destroyed, -1 is returned. +# +# Arguments: +# w - Window to use for dialog top-level. +# title - Title to display in dialog's decorative frame. +# text - Message to display in dialog. +# bitmap - Bitmap to display in dialog (empty string means none). +# default - Index of button that is to display the default ring +# (-1 means none). +# args - One or more strings to display in buttons across the +# bottom of the dialog box. + +proc ::tk_dialog {w title text bitmap default args} { + variable ::tk::Priv + + # Check that $default was properly given + if {[string is integer -strict $default]} { + if {$default >= [llength $args]} { + return -code error -errorcode {TK DIALOG BAD_DEFAULT} \ + "default button index greater than number of buttons\ + specified for tk_dialog" + } + } elseif {"" eq $default} { + set default -1 + } else { + set default [lsearch -exact $args $default] + } + + set windowingsystem [tk windowingsystem] + if {$windowingsystem eq "aqua"} { + option add *Dialog*background systemDialogBackgroundActive widgetDefault + option add *Dialog*Button.highlightBackground \ + systemDialogBackgroundActive widgetDefault + } + + # 1. Create the top-level window and divide it into top + # and bottom parts. + + destroy $w + toplevel $w -class Dialog + wm title $w $title + wm iconname $w Dialog + wm protocol $w WM_DELETE_WINDOW { } + + # Dialog boxes should be transient with respect to their parent, + # so that they will always stay on top of their parent window. However, + # some window managers will create the window as withdrawn if the parent + # window is withdrawn or iconified. Combined with the grab we put on the + # window, this can hang the entire application. Therefore we only make + # the dialog transient if the parent is viewable. + # + if {[winfo viewable [winfo toplevel [winfo parent $w]]] } { + wm transient $w [winfo toplevel [winfo parent $w]] + } + + if {$windowingsystem eq "aqua"} { + ::tk::unsupported::MacWindowStyle style $w moveableModal {} + } elseif {$windowingsystem eq "x11"} { + wm attributes $w -type dialog + } + + frame $w.bot + frame $w.top + if {$windowingsystem eq "x11"} { + $w.bot configure -relief raised -bd 1 + $w.top configure -relief raised -bd 1 + } + pack $w.bot -side bottom -fill both + pack $w.top -side top -fill both -expand 1 + grid anchor $w.bot center + + # 2. Fill the top part with bitmap and message (use the option + # database for -wraplength and -font so that they can be + # overridden by the caller). + + option add *Dialog.msg.wrapLength 3i widgetDefault + option add *Dialog.msg.font TkCaptionFont widgetDefault + + label $w.msg -justify left -text $text + pack $w.msg -in $w.top -side right -expand 1 -fill both -padx 3m -pady 3m + if {$bitmap ne ""} { + if {$windowingsystem eq "aqua" && $bitmap eq "error"} { + set bitmap "stop" + } + label $w.bitmap -bitmap $bitmap + pack $w.bitmap -in $w.top -side left -padx 3m -pady 3m + } + + # 3. Create a row of buttons at the bottom of the dialog. + + set i 0 + foreach but $args { + button $w.button$i -text $but -command [list set ::tk::Priv(button) $i] + if {$i == $default} { + $w.button$i configure -default active + } else { + $w.button$i configure -default normal + } + grid $w.button$i -in $w.bot -column $i -row 0 -sticky ew \ + -padx 10 -pady 4 + grid columnconfigure $w.bot $i + # We boost the size of some Mac buttons for l&f + if {$windowingsystem eq "aqua"} { + set tmp [string tolower $but] + if {$tmp eq "ok" || $tmp eq "cancel"} { + grid columnconfigure $w.bot $i -minsize 90 + } + grid configure $w.button$i -pady 7 + } + incr i + } + + # 4. Create a binding for on the dialog if there is a + # default button. + # Convention also dictates that if the keyboard focus moves among the + # the buttons that the binding affects the button with the focus. + + if {$default >= 0} { + bind $w [list $w.button$default invoke] + } + bind $w <> [list bind $w {[tk_focusPrev %W] invoke}] + bind $w <> [list bind $w {[tk_focusNext %W] invoke}] + + # 5. Create a binding for the window that sets the + # button variable to -1; this is needed in case something happens + # that destroys the window, such as its parent window being destroyed. + + bind $w {set ::tk::Priv(button) -1} + + # 6. Withdraw the window, then update all the geometry information + # so we know how big it wants to be, then center the window in the + # display (Motif style) and de-iconify it. + + ::tk::PlaceWindow $w + tkwait visibility $w + + # 7. Set a grab and claim the focus too. + + if {$default >= 0} { + set focus $w.button$default + } else { + set focus $w + } + tk::SetFocusGrab $w $focus + + # 8. Wait for the user to respond, then restore the focus and + # return the index of the selected button. Restore the focus + # before deleting the window, since otherwise the window manager + # may take the focus away so we can't redirect it. Finally, + # restore any grab that was in effect. + + vwait ::tk::Priv(button) + + catch { + # It's possible that the window has already been destroyed, + # hence this "catch". Delete the Destroy handler so that + # Priv(button) doesn't get reset by it. + + bind $w {} + } + tk::RestoreFocusGrab $w $focus + return $Priv(button) +} diff --git a/env/tcl/tk8.6/entry.tcl b/env/tcl/tk8.6/entry.tcl new file mode 100644 index 0000000..6243d26 --- /dev/null +++ b/env/tcl/tk8.6/entry.tcl @@ -0,0 +1,654 @@ +# entry.tcl -- +# +# This file defines the default bindings for Tk entry widgets and provides +# procedures that help in implementing those bindings. +# +# Copyright (c) 1992-1994 The Regents of the University of California. +# Copyright (c) 1994-1997 Sun Microsystems, Inc. +# +# See the file "license.terms" for information on usage and redistribution +# of this file, and for a DISCLAIMER OF ALL WARRANTIES. +# + +#------------------------------------------------------------------------- +# Elements of tk::Priv that are used in this file: +# +# afterId - If non-null, it means that auto-scanning is underway +# and it gives the "after" id for the next auto-scan +# command to be executed. +# mouseMoved - Non-zero means the mouse has moved a significant +# amount since the button went down (so, for example, +# start dragging out a selection). +# pressX - X-coordinate at which the mouse button was pressed. +# selectMode - The style of selection currently underway: +# char, word, or line. +# x, y - Last known mouse coordinates for scanning +# and auto-scanning. +# data - Used for Cut and Copy +#------------------------------------------------------------------------- + +#------------------------------------------------------------------------- +# The code below creates the default class bindings for entries. +#------------------------------------------------------------------------- +bind Entry <> { + if {![catch {tk::EntryGetSelection %W} tk::Priv(data)]} { + clipboard clear -displayof %W + clipboard append -displayof %W $tk::Priv(data) + %W delete sel.first sel.last + unset tk::Priv(data) + } +} +bind Entry <> { + if {![catch {tk::EntryGetSelection %W} tk::Priv(data)]} { + clipboard clear -displayof %W + clipboard append -displayof %W $tk::Priv(data) + unset tk::Priv(data) + } +} +bind Entry <> { + catch { + if {[tk windowingsystem] ne "x11"} { + catch { + %W delete sel.first sel.last + } + } + %W insert insert [::tk::GetSelection %W CLIPBOARD] + tk::EntrySeeInsert %W + } +} +bind Entry <> { + # ignore if there is no selection + catch { %W delete sel.first sel.last } +} +bind Entry <> { + if {$tk_strictMotif || ![info exists tk::Priv(mouseMoved)] + || !$tk::Priv(mouseMoved)} { + tk::EntryPaste %W %x + } +} + +bind Entry <> { + %W selection range 0 end + %W icursor end +} + +# Standard Motif bindings: + +bind Entry <1> { + tk::EntryButton1 %W %x + %W selection clear +} +bind Entry { + set tk::Priv(x) %x + tk::EntryMouseSelect %W %x +} +bind Entry { + set tk::Priv(selectMode) word + tk::EntryMouseSelect %W %x + catch {%W icursor sel.last} +} +bind Entry { + set tk::Priv(selectMode) line + tk::EntryMouseSelect %W %x + catch {%W icursor sel.last} +} +bind Entry { + set tk::Priv(selectMode) char + %W selection adjust @%x +} +bind Entry { + set tk::Priv(selectMode) word + tk::EntryMouseSelect %W %x +} +bind Entry { + set tk::Priv(selectMode) line + tk::EntryMouseSelect %W %x +} +bind Entry { + set tk::Priv(x) %x + tk::EntryAutoScan %W +} +bind Entry { + tk::CancelRepeat +} +bind Entry { + tk::CancelRepeat +} +bind Entry { + %W icursor @%x +} + +bind Entry <> { + tk::EntrySetCursor %W [expr {[%W index insert] - 1}] +} +bind Entry <> { + tk::EntrySetCursor %W [expr {[%W index insert] + 1}] +} +bind Entry <> { + tk::EntryKeySelect %W [expr {[%W index insert] - 1}] + tk::EntrySeeInsert %W +} +bind Entry <> { + tk::EntryKeySelect %W [expr {[%W index insert] + 1}] + tk::EntrySeeInsert %W +} +bind Entry <> { + tk::EntrySetCursor %W [tk::EntryPreviousWord %W insert] +} +bind Entry <> { + tk::EntrySetCursor %W [tk::EntryNextWord %W insert] +} +bind Entry <> { + tk::EntryKeySelect %W [tk::EntryPreviousWord %W insert] + tk::EntrySeeInsert %W +} +bind Entry <> { + tk::EntryKeySelect %W [tk::EntryNextWord %W insert] + tk::EntrySeeInsert %W +} +bind Entry <> { + tk::EntrySetCursor %W 0 +} +bind Entry <> { + tk::EntryKeySelect %W 0 + tk::EntrySeeInsert %W +} +bind Entry <> { + tk::EntrySetCursor %W end +} +bind Entry <> { + tk::EntryKeySelect %W end + tk::EntrySeeInsert %W +} + +bind Entry { + if {[%W selection present]} { + %W delete sel.first sel.last + } else { + %W delete insert + } +} +bind Entry { + tk::EntryBackspace %W +} + +bind Entry { + %W selection from insert +} +bind Entry { + tk::ListboxBeginSelect %W [%W index active] +} +bind Listbox { + tk::ListboxBeginExtend %W [%W index active] +} +bind Listbox { + tk::ListboxBeginExtend %W [%W index active] +} +bind Listbox { + tk::ListboxCancel %W +} +bind Listbox <> { + tk::ListboxSelectAll %W +} +bind Listbox <> { + if {[%W cget -selectmode] ne "browse"} { + %W selection clear 0 end + tk::FireListboxSelectEvent %W + } +} + +# Additional Tk bindings that aren't part of the Motif look and feel: + +bind Listbox <2> { + %W scan mark %x %y +} +bind Listbox { + %W scan dragto %x %y +} + +# The MouseWheel will typically only fire on Windows and Mac OS X. +# However, someone could use the "event generate" command to produce +# one on other platforms. + +if {[tk windowingsystem] eq "aqua"} { + bind Listbox { + %W yview scroll [expr {- (%D)}] units + } + bind Listbox { + %W yview scroll [expr {-10 * (%D)}] units + } + bind Listbox { + %W xview scroll [expr {- (%D)}] units + } + bind Listbox { + %W xview scroll [expr {-10 * (%D)}] units + } +} else { + bind Listbox { + %W yview scroll [expr {- (%D / 120) * 4}] units + } + bind Listbox { + %W xview scroll [expr {- (%D / 120) * 4}] units + } +} + +if {"x11" eq [tk windowingsystem]} { + # Support for mousewheels on Linux/Unix commonly comes through mapping + # the wheel to the extended buttons. If you have a mousewheel, find + # Linux configuration info at: + # http://linuxreviews.org/howtos/xfree/mouse/ + bind Listbox <4> { + if {!$tk_strictMotif} { + %W yview scroll -5 units + } + } + bind Listbox { + if {!$tk_strictMotif} { + %W xview scroll -5 units + } + } + bind Listbox <5> { + if {!$tk_strictMotif} { + %W yview scroll 5 units + } + } + bind Listbox { + if {!$tk_strictMotif} { + %W xview scroll 5 units + } + } +} + +# ::tk::ListboxBeginSelect -- +# +# This procedure is typically invoked on button-1 presses. It begins +# the process of making a selection in the listbox. Its exact behavior +# depends on the selection mode currently in effect for the listbox; +# see the Motif documentation for details. +# +# Arguments: +# w - The listbox widget. +# el - The element for the selection operation (typically the +# one under the pointer). Must be in numerical form. + +proc ::tk::ListboxBeginSelect {w el {focus 1}} { + variable ::tk::Priv + if {[$w cget -selectmode] eq "multiple"} { + if {[$w selection includes $el]} { + $w selection clear $el + } else { + $w selection set $el + } + } else { + $w selection clear 0 end + $w selection set $el + $w selection anchor $el + set Priv(listboxSelection) {} + set Priv(listboxPrev) $el + } + tk::FireListboxSelectEvent $w + # check existence as ListboxSelect may destroy us + if {$focus && [winfo exists $w] && [$w cget -state] eq "normal"} { + focus $w + } +} + +# ::tk::ListboxMotion -- +# +# This procedure is called to process mouse motion events while +# button 1 is down. It may move or extend the selection, depending +# on the listbox's selection mode. +# +# Arguments: +# w - The listbox widget. +# el - The element under the pointer (must be a number). + +proc ::tk::ListboxMotion {w el} { + variable ::tk::Priv + if {$el == $Priv(listboxPrev)} { + return + } + set anchor [$w index anchor] + switch [$w cget -selectmode] { + browse { + $w selection clear 0 end + $w selection set $el + set Priv(listboxPrev) $el + tk::FireListboxSelectEvent $w + } + extended { + set i $Priv(listboxPrev) + if {$i eq ""} { + set i $el + $w selection set $el + } + if {[$w selection includes anchor]} { + $w selection clear $i $el + $w selection set anchor $el + } else { + $w selection clear $i $el + $w selection clear anchor $el + } + if {![info exists Priv(listboxSelection)]} { + set Priv(listboxSelection) [$w curselection] + } + while {($i < $el) && ($i < $anchor)} { + if {[lsearch $Priv(listboxSelection) $i] >= 0} { + $w selection set $i + } + incr i + } + while {($i > $el) && ($i > $anchor)} { + if {[lsearch $Priv(listboxSelection) $i] >= 0} { + $w selection set $i + } + incr i -1 + } + set Priv(listboxPrev) $el + tk::FireListboxSelectEvent $w + } + } +} + +# ::tk::ListboxBeginExtend -- +# +# This procedure is typically invoked on shift-button-1 presses. It +# begins the process of extending a selection in the listbox. Its +# exact behavior depends on the selection mode currently in effect +# for the listbox; see the Motif documentation for details. +# +# Arguments: +# w - The listbox widget. +# el - The element for the selection operation (typically the +# one under the pointer). Must be in numerical form. + +proc ::tk::ListboxBeginExtend {w el} { + if {[$w cget -selectmode] eq "extended"} { + if {[$w selection includes anchor]} { + ListboxMotion $w $el + } else { + # No selection yet; simulate the begin-select operation. + ListboxBeginSelect $w $el + } + } +} + +# ::tk::ListboxBeginToggle -- +# +# This procedure is typically invoked on control-button-1 presses. It +# begins the process of toggling a selection in the listbox. Its +# exact behavior depends on the selection mode currently in effect +# for the listbox; see the Motif documentation for details. +# +# Arguments: +# w - The listbox widget. +# el - The element for the selection operation (typically the +# one under the pointer). Must be in numerical form. + +proc ::tk::ListboxBeginToggle {w el} { + variable ::tk::Priv + if {[$w cget -selectmode] eq "extended"} { + set Priv(listboxSelection) [$w curselection] + set Priv(listboxPrev) $el + $w selection anchor $el + if {[$w selection includes $el]} { + $w selection clear $el + } else { + $w selection set $el + } + tk::FireListboxSelectEvent $w + } +} + +# ::tk::ListboxAutoScan -- +# This procedure is invoked when the mouse leaves an entry window +# with button 1 down. It scrolls the window up, down, left, or +# right, depending on where the mouse left the window, and reschedules +# itself as an "after" command so that the window continues to scroll until +# the mouse moves back into the window or the mouse button is released. +# +# Arguments: +# w - The entry window. + +proc ::tk::ListboxAutoScan {w} { + variable ::tk::Priv + if {![winfo exists $w]} return + set x $Priv(x) + set y $Priv(y) + if {$y >= [winfo height $w]} { + $w yview scroll 1 units + } elseif {$y < 0} { + $w yview scroll -1 units + } elseif {$x >= [winfo width $w]} { + $w xview scroll 2 units + } elseif {$x < 0} { + $w xview scroll -2 units + } else { + return + } + ListboxMotion $w [$w index @$x,$y] + set Priv(afterId) [after 50 [list tk::ListboxAutoScan $w]] +} + +# ::tk::ListboxUpDown -- +# +# Moves the location cursor (active element) up or down by one element, +# and changes the selection if we're in browse or extended selection +# mode. +# +# Arguments: +# w - The listbox widget. +# amount - +1 to move down one item, -1 to move back one item. + +proc ::tk::ListboxUpDown {w amount} { + variable ::tk::Priv + $w activate [expr {[$w index active] + $amount}] + $w see active + switch [$w cget -selectmode] { + browse { + $w selection clear 0 end + $w selection set active + tk::FireListboxSelectEvent $w + } + extended { + $w selection clear 0 end + $w selection set active + $w selection anchor active + set Priv(listboxPrev) [$w index active] + set Priv(listboxSelection) {} + tk::FireListboxSelectEvent $w + } + } +} + +# ::tk::ListboxExtendUpDown -- +# +# Does nothing unless we're in extended selection mode; in this +# case it moves the location cursor (active element) up or down by +# one element, and extends the selection to that point. +# +# Arguments: +# w - The listbox widget. +# amount - +1 to move down one item, -1 to move back one item. + +proc ::tk::ListboxExtendUpDown {w amount} { + variable ::tk::Priv + if {[$w cget -selectmode] ne "extended"} { + return + } + set active [$w index active] + if {![info exists Priv(listboxSelection)]} { + $w selection set $active + set Priv(listboxSelection) [$w curselection] + } + $w activate [expr {$active + $amount}] + $w see active + ListboxMotion $w [$w index active] +} + +# ::tk::ListboxDataExtend +# +# This procedure is called for key-presses such as Shift-KEndData. +# If the selection mode isn't multiple or extend then it does nothing. +# Otherwise it moves the active element to el and, if we're in +# extended mode, extends the selection to that point. +# +# Arguments: +# w - The listbox widget. +# el - An integer element number. + +proc ::tk::ListboxDataExtend {w el} { + set mode [$w cget -selectmode] + if {$mode eq "extended"} { + $w activate $el + $w see $el + if {[$w selection includes anchor]} { + ListboxMotion $w $el + } + } elseif {$mode eq "multiple"} { + $w activate $el + $w see $el + } +} + +# ::tk::ListboxCancel +# +# This procedure is invoked to cancel an extended selection in +# progress. If there is an extended selection in progress, it +# restores all of the items between the active one and the anchor +# to their previous selection state. +# +# Arguments: +# w - The listbox widget. + +proc ::tk::ListboxCancel w { + variable ::tk::Priv + if {[$w cget -selectmode] ne "extended"} { + return + } + set first [$w index anchor] + set last $Priv(listboxPrev) + if {$last eq ""} { + # Not actually doing any selection right now + return + } + if {$first > $last} { + set tmp $first + set first $last + set last $tmp + } + $w selection clear $first $last + while {$first <= $last} { + if {[lsearch $Priv(listboxSelection) $first] >= 0} { + $w selection set $first + } + incr first + } + tk::FireListboxSelectEvent $w +} + +# ::tk::ListboxSelectAll +# +# This procedure is invoked to handle the "select all" operation. +# For single and browse mode, it just selects the active element. +# Otherwise it selects everything in the widget. +# +# Arguments: +# w - The listbox widget. + +proc ::tk::ListboxSelectAll w { + set mode [$w cget -selectmode] + if {$mode eq "single" || $mode eq "browse"} { + $w selection clear 0 end + $w selection set active + } else { + $w selection set 0 end + } + tk::FireListboxSelectEvent $w +} + +# ::tk::FireListboxSelectEvent +# +# Fire the <> event if the listbox is not in disabled +# state. +# +# Arguments: +# w - The listbox widget. + +proc ::tk::FireListboxSelectEvent w { + if {[$w cget -state] eq "normal"} { + event generate $w <> + } +} diff --git a/env/tcl/tk8.6/megawidget.tcl b/env/tcl/tk8.6/megawidget.tcl new file mode 100644 index 0000000..aeb1263 --- /dev/null +++ b/env/tcl/tk8.6/megawidget.tcl @@ -0,0 +1,297 @@ +# megawidget.tcl +# +# Basic megawidget support classes. Experimental for any use other than +# the ::tk::IconList megawdget, which is itself only designed for use in +# the Unix file dialogs. +# +# Copyright (c) 2009-2010 Donal K. Fellows +# +# See the file "license.terms" for information on usage and redistribution of +# this file, and for a DISCLAIMER OF ALL WARRANTIES. +# + +package require Tk 8.6 + +::oo::class create ::tk::Megawidget { + superclass ::oo::class + method unknown {w args} { + if {[string match .* $w]} { + [self] create $w {*}$args + return $w + } + next $w {*}$args + } + unexport new unknown + self method create {name superclasses body} { + next $name [list \ + superclass ::tk::MegawidgetClass {*}$superclasses]\;$body + } +} + +::oo::class create ::tk::MegawidgetClass { + variable w hull options IdleCallbacks + constructor args { + # Extract the "widget name" from the object name + set w [namespace tail [self]] + + # Configure things + tclParseConfigSpec [my varname options] [my GetSpecs] "" $args + + # Move the object out of the way of the hull widget + rename [self] _tmp + + # Make the hull widget(s) + my CreateHull + bind $hull [list [namespace which my] destroy] + + # Rename things into their final places + rename ::$w theWidget + rename [self] ::$w + + # Make the contents + my Create + } + destructor { + foreach {name cb} [array get IdleCallbacks] { + after cancel $cb + unset IdleCallbacks($name) + } + if {[winfo exists $w]} { + bind $hull {} + destroy $w + } + } + + #################################################################### + # + # MegawidgetClass::configure -- + # + # Implementation of 'configure' for megawidgets. Emulates the operation + # of the standard Tk configure method fairly closely, which makes things + # substantially more complex than they otherwise would be. + # + # This method assumes that the 'GetSpecs' method returns a description + # of all the specifications of the options (i.e., as Tk returns except + # with the actual values removed). It also assumes that the 'options' + # array in the class holds all options; it is up to subclasses to set + # traces on that array if they want to respond to configuration changes. + # + # TODO: allow unambiguous abbreviations. + # + method configure args { + # Configure behaves differently depending on the number of arguments + set argc [llength $args] + if {$argc == 0} { + return [lmap spec [my GetSpecs] { + lappend spec $options([lindex $spec 0]) + }] + } elseif {$argc == 1} { + set opt [lindex $args 0] + if {[info exists options($opt)]} { + set spec [lsearch -inline -index 0 -exact [my GetSpecs] $opt] + return [linsert $spec end $options($opt)] + } + } elseif {$argc == 2} { + # Special case for where we're setting a single option. This + # avoids some of the costly operations. We still do the [array + # get] as this gives a sufficiently-consistent trace. + set opt [lindex $args 0] + if {[dict exists [array get options] $opt]} { + # Actually set the new value of the option. Use a catch to + # allow a megawidget user to throw an error from a write trace + # on the options array to reject invalid values. + try { + array set options $args + } on error {ret info} { + # Rethrow the error to get a clean stack trace + return -code error -errorcode [dict get $info -errorcode] $ret + } + return + } + } elseif {$argc % 2 == 0} { + # Check that all specified options exist. Any unknown option will + # cause the merged dictionary to be bigger than the options array + set merge [dict merge [array get options] $args] + if {[dict size $merge] == [array size options]} { + # Actually set the new values of the options. Use a catch to + # allow a megawidget user to throw an error from a write trace + # on the options array to reject invalid values + try { + array set options $args + } on error {ret info} { + # Rethrow the error to get a clean stack trace + return -code error -errorcode [dict get $info -errorcode] $ret + } + return + } + # Due to the order of the merge, the unknown options will be at + # the end of the dict. This makes the first unknown option easy to + # find. + set opt [lindex [dict keys $merge] [array size options]] + } else { + set opt [lindex $args end] + return -code error -errorcode [list TK VALUE_MISSING] \ + "value for \"$opt\" missing" + } + return -code error -errorcode [list TK LOOKUP OPTION $opt] \ + "bad option \"$opt\": must be [tclListValidFlags options]" + } + + #################################################################### + # + # MegawidgetClass::cget -- + # + # Implementation of 'cget' for megawidgets. Emulates the operation of + # the standard Tk cget method fairly closely. + # + # This method assumes that the 'options' array in the class holds all + # options; it is up to subclasses to set traces on that array if they + # want to respond to configuration reads. + # + # TODO: allow unambiguous abbreviations. + # + method cget option { + return $options($option) + } + + #################################################################### + # + # MegawidgetClass::TraceOption -- + # + # Sets up the tracing of an element of the options variable. + # + method TraceOption {option method args} { + set callback [list my $method {*}$args] + trace add variable options($option) write [namespace code $callback] + } + + #################################################################### + # + # MegawidgetClass::GetSpecs -- + # + # Return a list of descriptions of options supported by this + # megawidget. Each option is described by the 4-tuple list, consisting + # of the name of the option, the "option database" name, the "option + # database" class-name, and the default value of the option. These are + # the same values returned by calling the configure method of a widget, + # except without the current values of the options. + # + method GetSpecs {} { + return { + {-takefocus takeFocus TakeFocus {}} + } + } + + #################################################################### + # + # MegawidgetClass::CreateHull -- + # + # Creates the real main widget of the megawidget. This is often a frame + # or toplevel widget, but isn't always (lightweight megawidgets might + # use a content widget directly). + # + # The name of the hull widget is given by the 'w' instance variable. The + # name should be written into the 'hull' instance variable. The command + # created by this method will be renamed. + # + method CreateHull {} { + return -code error -errorcode {TCL OO ABSTRACT_METHOD} \ + "method must be overridden" + } + + #################################################################### + # + # MegawidgetClass::Create -- + # + # Creates the content of the megawidget. The name of the widget to + # create the content in will be in the 'hull' instance variable. + # + method Create {} { + return -code error -errorcode {TCL OO ABSTRACT_METHOD} \ + "method must be overridden" + } + + #################################################################### + # + # MegawidgetClass::WhenIdle -- + # + # Arrange for a method to be called on the current instance when Tk is + # idle. Only one such method call per method will be queued; subsequent + # queuing actions before the callback fires will be silently ignored. + # The additional args will be passed to the callback, and the callbacks + # will be properly cancelled if the widget is destroyed. + # + method WhenIdle {method args} { + if {![info exists IdleCallbacks($method)]} { + set IdleCallbacks($method) [after idle [list \ + [namespace which my] DoWhenIdle $method $args]] + } + } + method DoWhenIdle {method arguments} { + unset IdleCallbacks($method) + tailcall my $method {*}$arguments + } +} + +#################################################################### +# +# tk::SimpleWidget -- +# +# Simple megawidget class that makes it easy create widgets that behave +# like a ttk widget. It creates the hull as a ttk::frame and maps the +# state manipulation methods of the overall megawidget to the equivalent +# operations on the ttk::frame. +# +::tk::Megawidget create ::tk::SimpleWidget {} { + variable w hull options + method GetSpecs {} { + return { + {-cursor cursor Cursor {}} + {-takefocus takeFocus TakeFocus {}} + } + } + method CreateHull {} { + set hull [::ttk::frame $w -cursor $options(-cursor)] + my TraceOption -cursor UpdateCursorOption + } + method UpdateCursorOption args { + $hull configure -cursor $options(-cursor) + } + # Not fixed names, so can't forward + method state args { + tailcall $hull state {*}$args + } + method instate args { + tailcall $hull instate {*}$args + } +} + +#################################################################### +# +# tk::FocusableWidget -- +# +# Simple megawidget class that makes a ttk-like widget that has a focus +# ring. +# +::tk::Megawidget create ::tk::FocusableWidget ::tk::SimpleWidget { + variable w hull options + method GetSpecs {} { + return { + {-cursor cursor Cursor {}} + {-takefocus takeFocus TakeFocus ::ttk::takefocus} + } + } + method CreateHull {} { + ttk::frame $w + set hull [ttk::entry $w.cHull -takefocus 0 -cursor $options(-cursor)] + pack $hull -expand yes -fill both -ipadx 2 -ipady 2 + my TraceOption -cursor UpdateCursorOption + } +} + +return + +# Local Variables: +# mode: tcl +# fill-column: 78 +# End: diff --git a/env/tcl/tk8.6/menu.tcl b/env/tcl/tk8.6/menu.tcl new file mode 100644 index 0000000..ba66b92 --- /dev/null +++ b/env/tcl/tk8.6/menu.tcl @@ -0,0 +1,1356 @@ +# menu.tcl -- +# +# This file defines the default bindings for Tk menus and menubuttons. +# It also implements keyboard traversal of menus and implements a few +# other utility procedures related to menus. +# +# Copyright (c) 1992-1994 The Regents of the University of California. +# Copyright (c) 1994-1997 Sun Microsystems, Inc. +# Copyright (c) 1998-1999 by Scriptics Corporation. +# Copyright (c) 2007 Daniel A. Steffen +# +# See the file "license.terms" for information on usage and redistribution +# of this file, and for a DISCLAIMER OF ALL WARRANTIES. +# + +#------------------------------------------------------------------------- +# Elements of tk::Priv that are used in this file: +# +# cursor - Saves the -cursor option for the posted menubutton. +# focus - Saves the focus during a menu selection operation. +# Focus gets restored here when the menu is unposted. +# grabGlobal - Used in conjunction with tk::Priv(oldGrab): if +# tk::Priv(oldGrab) is non-empty, then tk::Priv(grabGlobal) +# contains either an empty string or "-global" to +# indicate whether the old grab was a local one or +# a global one. +# inMenubutton - The name of the menubutton widget containing +# the mouse, or an empty string if the mouse is +# not over any menubutton. +# menuBar - The name of the menubar that is the root +# of the cascade hierarchy which is currently +# posted. This is null when there is no menu currently +# being pulled down from a menu bar. +# oldGrab - Window that had the grab before a menu was posted. +# Used to restore the grab state after the menu +# is unposted. Empty string means there was no +# grab previously set. +# popup - If a menu has been popped up via tk_popup, this +# gives the name of the menu. Otherwise this +# value is empty. +# postedMb - Name of the menubutton whose menu is currently +# posted, or an empty string if nothing is posted +# A grab is set on this widget. +# relief - Used to save the original relief of the current +# menubutton. +# window - When the mouse is over a menu, this holds the +# name of the menu; it's cleared when the mouse +# leaves the menu. +# tearoff - Whether the last menu posted was a tearoff or not. +# This is true always for unix, for tearoffs for Mac +# and Windows. +# activeMenu - This is the last active menu for use +# with the <> virtual event. +# activeItem - This is the last active menu item for +# use with the <> virtual event. +#------------------------------------------------------------------------- + +#------------------------------------------------------------------------- +# Overall note: +# This file is tricky because there are five different ways that menus +# can be used: +# +# 1. As a pulldown from a menubutton. In this style, the variable +# tk::Priv(postedMb) identifies the posted menubutton. +# 2. As a torn-off menu copied from some other menu. In this style +# tk::Priv(postedMb) is empty, and menu's type is "tearoff". +# 3. As an option menu, triggered from an option menubutton. In this +# style tk::Priv(postedMb) identifies the posted menubutton. +# 4. As a popup menu. In this style tk::Priv(postedMb) is empty and +# the top-level menu's type is "normal". +# 5. As a pulldown from a menubar. The variable tk::Priv(menubar) has +# the owning menubar, and the menu itself is of type "normal". +# +# The various binding procedures use the state described above to +# distinguish the various cases and take different actions in each +# case. +#------------------------------------------------------------------------- + +#------------------------------------------------------------------------- +# The code below creates the default class bindings for menus +# and menubuttons. +#------------------------------------------------------------------------- + +bind Menubutton {} +bind Menubutton { + tk::MbEnter %W +} +bind Menubutton { + tk::MbLeave %W +} +bind Menubutton <1> { + if {$tk::Priv(inMenubutton) ne ""} { + tk::MbPost $tk::Priv(inMenubutton) %X %Y + } +} +bind Menubutton { + tk::MbMotion %W up %X %Y +} +bind Menubutton { + tk::MbMotion %W down %X %Y +} +bind Menubutton { + tk::MbButtonUp %W +} +bind Menubutton { + tk::MbPost %W + tk::MenuFirstEntry [%W cget -menu] +} +bind Menubutton <> { + tk::MbPost %W + tk::MenuFirstEntry [%W cget -menu] +} + +# Must set focus when mouse enters a menu, in order to allow +# mixed-mode processing using both the mouse and the keyboard. +# Don't set the focus if the event comes from a grab release, +# though: such an event can happen after as part of unposting +# a cascaded chain of menus, after the focus has already been +# restored to wherever it was before menu selection started. + +bind Menu {} + +bind Menu { + set tk::Priv(window) %W + if {[%W cget -type] eq "tearoff"} { + if {"%m" ne "NotifyUngrab"} { + if {[tk windowingsystem] eq "x11"} { + tk_menuSetFocus %W + } + } + } + tk::MenuMotion %W %x %y %s +} + +bind Menu { + tk::MenuLeave %W %X %Y %s +} +bind Menu { + tk::MenuMotion %W %x %y %s +} +bind Menu { + tk::MenuButtonDown %W +} +bind Menu { + tk::MenuInvoke %W 1 +} +bind Menu { + tk::MenuInvoke %W 0 +} +bind Menu <> { + tk::MenuInvoke %W 0 +} +bind Menu { + tk::MenuInvoke %W 0 +} +bind Menu { + tk::MenuEscape %W +} +bind Menu <> { + tk::MenuLeftArrow %W +} +bind Menu <> { + tk::MenuRightArrow %W +} +bind Menu <> { + tk::MenuUpArrow %W +} +bind Menu <> { + tk::MenuDownArrow %W +} +bind Menu { + tk::TraverseWithinMenu %W %A + break +} + +# The following bindings apply to all windows, and are used to +# implement keyboard menu traversal. + +if {[tk windowingsystem] eq "x11"} { + bind all { + tk::TraverseToMenu %W %A + } + + bind all { + tk::FirstMenu %W + } +} else { + bind Menubutton { + tk::TraverseToMenu %W %A + } + + bind Menubutton { + tk::FirstMenu %W + } +} + +# ::tk::MbEnter -- +# This procedure is invoked when the mouse enters a menubutton +# widget. It activates the widget unless it is disabled. Note: +# this procedure is only invoked when mouse button 1 is *not* down. +# The procedure ::tk::MbB1Enter is invoked if the button is down. +# +# Arguments: +# w - The name of the widget. + +proc ::tk::MbEnter w { + variable ::tk::Priv + + if {$Priv(inMenubutton) ne ""} { + MbLeave $Priv(inMenubutton) + } + set Priv(inMenubutton) $w + if {[$w cget -state] ne "disabled" && [tk windowingsystem] ne "aqua"} { + $w configure -state active + } +} + +# ::tk::MbLeave -- +# This procedure is invoked when the mouse leaves a menubutton widget. +# It de-activates the widget, if the widget still exists. +# +# Arguments: +# w - The name of the widget. + +proc ::tk::MbLeave w { + variable ::tk::Priv + + set Priv(inMenubutton) {} + if {![winfo exists $w]} { + return + } + if {[$w cget -state] eq "active" && [tk windowingsystem] ne "aqua"} { + $w configure -state normal + } +} + +# ::tk::MbPost -- +# Given a menubutton, this procedure does all the work of posting +# its associated menu and unposting any other menu that is currently +# posted. +# +# Arguments: +# w - The name of the menubutton widget whose menu +# is to be posted. +# x, y - Root coordinates of cursor, used for positioning +# option menus. If not specified, then the center +# of the menubutton is used for an option menu. + +proc ::tk::MbPost {w {x {}} {y {}}} { + global errorInfo + variable ::tk::Priv + + if {[$w cget -state] eq "disabled" || $w eq $Priv(postedMb)} { + return + } + set menu [$w cget -menu] + if {$menu eq ""} { + return + } + set tearoff [expr {[tk windowingsystem] eq "x11" \ + || [$menu cget -type] eq "tearoff"}] + if {[string first $w $menu] != 0} { + return -code error -errorcode {TK MENUBUTTON POST_NONCHILD} \ + "can't post $menu: it isn't a descendant of $w" + } + set cur $Priv(postedMb) + if {$cur ne ""} { + MenuUnpost {} + } + if {$::tk_strictMotif} { + set Priv(cursor) [$w cget -cursor] + $w configure -cursor arrow + } + if {[tk windowingsystem] ne "aqua"} { + set Priv(relief) [$w cget -relief] + $w configure -relief raised + } else { + $w configure -state active + } + + set Priv(postedMb) $w + set Priv(focus) [focus] + $menu activate none + GenerateMenuSelect $menu + + # If this looks like an option menubutton then post the menu so + # that the current entry is on top of the mouse. Otherwise post + # the menu just below the menubutton, as for a pull-down. + + update idletasks + if {[catch { + switch [$w cget -direction] { + above { + set x [winfo rootx $w] + set y [expr {[winfo rooty $w] - [winfo reqheight $menu]}] + # if we go offscreen to the top, show as 'below' + if {$y < [winfo vrooty $w]} { + set y [expr {[winfo vrooty $w] + [winfo rooty $w] + [winfo reqheight $w]}] + } + PostOverPoint $menu $x $y + } + below { + set x [winfo rootx $w] + set y [expr {[winfo rooty $w] + [winfo height $w]}] + # if we go offscreen to the bottom, show as 'above' + set mh [winfo reqheight $menu] + if {($y + $mh) > ([winfo vrooty $w] + [winfo vrootheight $w])} { + set y [expr {[winfo vrooty $w] + [winfo vrootheight $w] + [winfo rooty $w] - $mh}] + } + PostOverPoint $menu $x $y + } + left { + set x [expr {[winfo rootx $w] - [winfo reqwidth $menu]}] + set y [expr {(2 * [winfo rooty $w] + [winfo height $w]) / 2}] + set entry [MenuFindName $menu [$w cget -text]] + if {$entry eq ""} { + set entry 0 + } + if {[$w cget -indicatoron]} { + if {$entry == [$menu index last]} { + incr y [expr {-([$menu yposition $entry] \ + + [winfo reqheight $menu])/2}] + } else { + incr y [expr {-([$menu yposition $entry] \ + + [$menu yposition [expr {$entry+1}]])/2}] + } + } + PostOverPoint $menu $x $y + if {$entry ne "" \ + && [$menu entrycget $entry -state] ne "disabled"} { + $menu activate $entry + GenerateMenuSelect $menu + } + } + right { + set x [expr {[winfo rootx $w] + [winfo width $w]}] + set y [expr {(2 * [winfo rooty $w] + [winfo height $w]) / 2}] + set entry [MenuFindName $menu [$w cget -text]] + if {$entry eq ""} { + set entry 0 + } + if {[$w cget -indicatoron]} { + if {$entry == [$menu index last]} { + incr y [expr {-([$menu yposition $entry] \ + + [winfo reqheight $menu])/2}] + } else { + incr y [expr {-([$menu yposition $entry] \ + + [$menu yposition [expr {$entry+1}]])/2}] + } + } + PostOverPoint $menu $x $y + if {$entry ne "" \ + && [$menu entrycget $entry -state] ne "disabled"} { + $menu activate $entry + GenerateMenuSelect $menu + } + } + default { + if {[$w cget -indicatoron]} { + if {$y eq ""} { + set x [expr {[winfo rootx $w] + [winfo width $w]/2}] + set y [expr {[winfo rooty $w] + [winfo height $w]/2}] + } + PostOverPoint $menu $x $y [MenuFindName $menu [$w cget -text]] + } else { + PostOverPoint $menu [winfo rootx $w] [expr {[winfo rooty $w]+[winfo height $w]}] + } + } + } + } msg opt]} { + # Error posting menu (e.g. bogus -postcommand). Unpost it and + # reflect the error. + + MenuUnpost {} + return -options $opt $msg + } + + set Priv(tearoff) $tearoff + if {$tearoff != 0} { + focus $menu + if {[winfo viewable $w]} { + SaveGrabInfo $w + grab -global $w + } + } +} + +# ::tk::MenuUnpost -- +# This procedure unposts a given menu, plus all of its ancestors up +# to (and including) a menubutton, if any. It also restores various +# values to what they were before the menu was posted, and releases +# a grab if there's a menubutton involved. Special notes: +# 1. It's important to unpost all menus before releasing the grab, so +# that any Enter-Leave events (e.g. from menu back to main +# application) have mode NotifyGrab. +# 2. Be sure to enclose various groups of commands in "catch" so that +# the procedure will complete even if the menubutton or the menu +# or the grab window has been deleted. +# +# Arguments: +# menu - Name of a menu to unpost. Ignored if there +# is a posted menubutton. + +proc ::tk::MenuUnpost menu { + variable ::tk::Priv + set mb $Priv(postedMb) + + # Restore focus right away (otherwise X will take focus away when + # the menu is unmapped and under some window managers (e.g. olvwm) + # we'll lose the focus completely). + + catch {focus $Priv(focus)} + set Priv(focus) "" + + # Unpost menu(s) and restore some stuff that's dependent on + # what was posted. + + after cancel [array get Priv menuActivatedTimer] + unset -nocomplain Priv(menuActivated) + after cancel [array get Priv menuDeactivatedTimer] + unset -nocomplain Priv(menuDeactivated) + + catch { + if {$mb ne ""} { + set menu [$mb cget -menu] + $menu unpost + set Priv(postedMb) {} + if {$::tk_strictMotif} { + $mb configure -cursor $Priv(cursor) + } + if {[tk windowingsystem] ne "aqua"} { + $mb configure -relief $Priv(relief) + } else { + $mb configure -state normal + } + } elseif {$Priv(popup) ne ""} { + $Priv(popup) unpost + set Priv(popup) {} + } elseif {[$menu cget -type] ne "menubar" && [$menu cget -type] ne "tearoff"} { + # We're in a cascaded sub-menu from a torn-off menu or popup. + # Unpost all the menus up to the toplevel one (but not + # including the top-level torn-off one) and deactivate the + # top-level torn off menu if there is one. + + while {1} { + set parent [winfo parent $menu] + if {[winfo class $parent] ne "Menu" || ![winfo ismapped $parent]} { + break + } + $parent activate none + $parent postcascade none + GenerateMenuSelect $parent + set type [$parent cget -type] + if {$type eq "menubar" || $type eq "tearoff"} { + break + } + set menu $parent + } + if {[$menu cget -type] ne "menubar"} { + $menu unpost + } + } + } + + if {($Priv(tearoff) != 0) || $Priv(menuBar) ne ""} { + # Release grab, if any, and restore the previous grab, if there + # was one. + if {$menu ne ""} { + set grab [grab current $menu] + if {$grab ne ""} { + grab release $grab + } + } + RestoreOldGrab + if {$Priv(menuBar) ne ""} { + if {$::tk_strictMotif} { + $Priv(menuBar) configure -cursor $Priv(cursor) + } + set Priv(menuBar) {} + } + if {[tk windowingsystem] ne "x11"} { + set Priv(tearoff) 0 + } + } +} + +# ::tk::MbMotion -- +# This procedure handles mouse motion events inside menubuttons, and +# also outside menubuttons when a menubutton has a grab (e.g. when a +# menu selection operation is in progress). +# +# Arguments: +# w - The name of the menubutton widget. +# upDown - "down" means button 1 is pressed, "up" means +# it isn't. +# rootx, rooty - Coordinates of mouse, in (virtual?) root window. + +proc ::tk::MbMotion {w upDown rootx rooty} { + variable ::tk::Priv + + if {$Priv(inMenubutton) eq $w} { + return + } + set new [winfo containing $rootx $rooty] + if {$new ne $Priv(inMenubutton) \ + && ($new eq "" || [winfo toplevel $new] eq [winfo toplevel $w])} { + if {$Priv(inMenubutton) ne ""} { + MbLeave $Priv(inMenubutton) + } + if {$new ne "" \ + && [winfo class $new] eq "Menubutton" \ + && ([$new cget -indicatoron] == 0) \ + && ([$w cget -indicatoron] == 0)} { + if {$upDown eq "down"} { + MbPost $new $rootx $rooty + } else { + MbEnter $new + } + } + } +} + +# ::tk::MbButtonUp -- +# This procedure is invoked to handle button 1 releases for menubuttons. +# If the release happens inside the menubutton then leave its menu +# posted with element 0 activated. Otherwise, unpost the menu. +# +# Arguments: +# w - The name of the menubutton widget. + +proc ::tk::MbButtonUp w { + variable ::tk::Priv + + set menu [$w cget -menu] + set tearoff [expr {[tk windowingsystem] eq "x11" || \ + ($menu ne "" && [$menu cget -type] eq "tearoff")}] + if {($tearoff != 0) && $Priv(postedMb) eq $w \ + && $Priv(inMenubutton) eq $w} { + MenuFirstEntry [$Priv(postedMb) cget -menu] + } else { + MenuUnpost {} + } +} + +# ::tk::MenuMotion -- +# This procedure is called to handle mouse motion events for menus. +# It does two things. First, it resets the active element in the +# menu, if the mouse is over the menu. Second, if a mouse button +# is down, it posts and unposts cascade entries to match the mouse +# position. +# +# Arguments: +# menu - The menu window. +# x - The x position of the mouse. +# y - The y position of the mouse. +# state - Modifier state (tells whether buttons are down). + +proc ::tk::MenuMotion {menu x y state} { + variable ::tk::Priv + if {$menu eq $Priv(window)} { + set activeindex [$menu index active] + if {[$menu cget -type] eq "menubar"} { + if {[info exists Priv(focus)] && $menu ne $Priv(focus)} { + $menu activate @$x,$y + GenerateMenuSelect $menu + } + } else { + $menu activate @$x,$y + GenerateMenuSelect $menu + } + set index [$menu index @$x,$y] + if {[info exists Priv(menuActivated)] \ + && $index ne "none" \ + && $index ne $activeindex} { + set mode [option get $menu clickToFocus ClickToFocus] + if {[string is false $mode]} { + set delay [expr {[$menu cget -type] eq "menubar" ? 0 : 50}] + if {[$menu type $index] eq "cascade"} { + set Priv(menuActivatedTimer) \ + [after $delay [list $menu postcascade active]] + } else { + set Priv(menuDeactivatedTimer) \ + [after $delay [list $menu postcascade none]] + } + } + } + } +} + +# ::tk::MenuButtonDown -- +# Handles button presses in menus. There are a couple of tricky things +# here: +# 1. Change the posted cascade entry (if any) to match the mouse position. +# 2. If there is a posted menubutton, must grab to the menubutton; this +# overrrides the implicit grab on button press, so that the menu +# button can track mouse motions over other menubuttons and change +# the posted menu. +# 3. If there's no posted menubutton (e.g. because we're a torn-off menu +# or one of its descendants) must grab to the top-level menu so that +# we can track mouse motions across the entire menu hierarchy. +# +# Arguments: +# menu - The menu window. + +proc ::tk::MenuButtonDown menu { + variable ::tk::Priv + + if {![winfo viewable $menu]} { + return + } + if {[$menu index active] eq "none"} { + if {[$menu cget -type] ne "menubar" } { + set Priv(window) {} + } + return + } + $menu postcascade active + if {$Priv(postedMb) ne "" && [winfo viewable $Priv(postedMb)]} { + grab -global $Priv(postedMb) + } else { + while {[$menu cget -type] eq "normal" \ + && [winfo class [winfo parent $menu]] eq "Menu" \ + && [winfo ismapped [winfo parent $menu]]} { + set menu [winfo parent $menu] + } + + if {$Priv(menuBar) eq {}} { + set Priv(menuBar) $menu + if {$::tk_strictMotif} { + set Priv(cursor) [$menu cget -cursor] + $menu configure -cursor arrow + } + if {[$menu type active] eq "cascade"} { + set Priv(menuActivated) 1 + } + } + + # Don't update grab information if the grab window isn't changing. + # Otherwise, we'll get an error when we unpost the menus and + # restore the grab, since the old grab window will not be viewable + # anymore. + + if {$menu ne [grab current $menu]} { + SaveGrabInfo $menu + } + + # Must re-grab even if the grab window hasn't changed, in order + # to release the implicit grab from the button press. + + if {[tk windowingsystem] eq "x11"} { + grab -global $menu + } + } +} + +# ::tk::MenuLeave -- +# This procedure is invoked to handle Leave events for a menu. It +# deactivates everything unless the active element is a cascade element +# and the mouse is now over the submenu. +# +# Arguments: +# menu - The menu window. +# rootx, rooty - Root coordinates of mouse. +# state - Modifier state. + +proc ::tk::MenuLeave {menu rootx rooty state} { + variable ::tk::Priv + set Priv(window) {} + if {[$menu index active] eq "none"} { + return + } + if {[$menu type active] eq "cascade" \ + && [winfo containing $rootx $rooty] eq \ + [$menu entrycget active -menu]} { + return + } + $menu activate none + GenerateMenuSelect $menu +} + +# ::tk::MenuInvoke -- +# This procedure is invoked when button 1 is released over a menu. +# It invokes the appropriate menu action and unposts the menu if +# it came from a menubutton. +# +# Arguments: +# w - Name of the menu widget. +# buttonRelease - 1 means this procedure is called because of +# a button release; 0 means because of keystroke. + +proc ::tk::MenuInvoke {w buttonRelease} { + variable ::tk::Priv + + if {$buttonRelease && $Priv(window) eq ""} { + # Mouse was pressed over a menu without a menu button, then + # dragged off the menu (possibly with a cascade posted) and + # released. Unpost everything and quit. + + $w postcascade none + $w activate none + event generate $w <> + MenuUnpost $w + return + } + if {[$w type active] eq "cascade"} { + $w postcascade active + set menu [$w entrycget active -menu] + MenuFirstEntry $menu + } elseif {[$w type active] eq "tearoff"} { + ::tk::TearOffMenu $w + MenuUnpost $w + } elseif {[$w cget -type] eq "menubar"} { + $w postcascade none + set active [$w index active] + set isCascade [string equal [$w type $active] "cascade"] + + # Only de-activate the active item if it's a cascade; this prevents + # the annoying "activation flicker" you otherwise get with + # checkbuttons/commands/etc. on menubars + + if { $isCascade } { + $w activate none + event generate $w <> + } + + MenuUnpost $w + + # If the active item is not a cascade, invoke it. This enables + # the use of checkbuttons/commands/etc. on menubars (which is legal, + # but not recommended) + + if { !$isCascade } { + uplevel #0 [list $w invoke $active] + } + } else { + set active [$w index active] + if {$Priv(popup) eq "" || $active ne "none"} { + MenuUnpost $w + } + uplevel #0 [list $w invoke active] + } +} + +# ::tk::MenuEscape -- +# This procedure is invoked for the Cancel (or Escape) key. It unposts +# the given menu and, if it is the top-level menu for a menu button, +# unposts the menu button as well. +# +# Arguments: +# menu - Name of the menu window. + +proc ::tk::MenuEscape menu { + set parent [winfo parent $menu] + if {[winfo class $parent] ne "Menu"} { + MenuUnpost $menu + } elseif {[$parent cget -type] eq "menubar"} { + MenuUnpost $menu + RestoreOldGrab + } else { + MenuNextMenu $menu left + } +} + +# The following routines handle arrow keys. Arrow keys behave +# differently depending on whether the menu is a menu bar or not. + +proc ::tk::MenuUpArrow {menu} { + if {[$menu cget -type] eq "menubar"} { + MenuNextMenu $menu left + } else { + MenuNextEntry $menu -1 + } +} + +proc ::tk::MenuDownArrow {menu} { + if {[$menu cget -type] eq "menubar"} { + MenuNextMenu $menu right + } else { + MenuNextEntry $menu 1 + } +} + +proc ::tk::MenuLeftArrow {menu} { + if {[$menu cget -type] eq "menubar"} { + MenuNextEntry $menu -1 + } else { + MenuNextMenu $menu left + } +} + +proc ::tk::MenuRightArrow {menu} { + if {[$menu cget -type] eq "menubar"} { + MenuNextEntry $menu 1 + } else { + MenuNextMenu $menu right + } +} + +# ::tk::MenuNextMenu -- +# This procedure is invoked to handle "left" and "right" traversal +# motions in menus. It traverses to the next menu in a menu bar, +# or into or out of a cascaded menu. +# +# Arguments: +# menu - The menu that received the keyboard +# event. +# direction - Direction in which to move: "left" or "right" + +proc ::tk::MenuNextMenu {menu direction} { + variable ::tk::Priv + + # First handle traversals into and out of cascaded menus. + + if {$direction eq "right"} { + set count 1 + set parent [winfo parent $menu] + set class [winfo class $parent] + if {[$menu type active] eq "cascade"} { + $menu postcascade active + set m2 [$menu entrycget active -menu] + if {$m2 ne ""} { + MenuFirstEntry $m2 + } + return + } else { + set parent [winfo parent $menu] + while {$parent ne "."} { + if {[winfo class $parent] eq "Menu" \ + && [$parent cget -type] eq "menubar"} { + tk_menuSetFocus $parent + MenuNextEntry $parent 1 + return + } + set parent [winfo parent $parent] + } + } + } else { + set count -1 + set m2 [winfo parent $menu] + if {[winfo class $m2] eq "Menu"} { + $menu activate none + GenerateMenuSelect $menu + tk_menuSetFocus $m2 + + $m2 postcascade none + + if {[$m2 cget -type] ne "menubar"} { + return + } + } + } + + # Can't traverse into or out of a cascaded menu. Go to the next + # or previous menubutton, if that makes sense. + + set m2 [winfo parent $menu] + if {[winfo class $m2] eq "Menu" && [$m2 cget -type] eq "menubar"} { + tk_menuSetFocus $m2 + MenuNextEntry $m2 -1 + return + } + + set w $Priv(postedMb) + if {$w eq ""} { + return + } + set buttons [winfo children [winfo parent $w]] + set length [llength $buttons] + set i [expr {[lsearch -exact $buttons $w] + $count}] + while {1} { + while {$i < 0} { + incr i $length + } + while {$i >= $length} { + incr i -$length + } + set mb [lindex $buttons $i] + if {[winfo class $mb] eq "Menubutton" \ + && [$mb cget -state] ne "disabled" \ + && [$mb cget -menu] ne "" \ + && [[$mb cget -menu] index last] ne "none"} { + break + } + if {$mb eq $w} { + return + } + incr i $count + } + MbPost $mb + MenuFirstEntry [$mb cget -menu] +} + +# ::tk::MenuNextEntry -- +# Activate the next higher or lower entry in the posted menu, +# wrapping around at the ends. Disabled entries are skipped. +# +# Arguments: +# menu - Menu window that received the keystroke. +# count - 1 means go to the next lower entry, +# -1 means go to the next higher entry. + +proc ::tk::MenuNextEntry {menu count} { + if {[$menu index last] eq "none"} { + return + } + set length [expr {[$menu index last]+1}] + set quitAfter $length + set active [$menu index active] + if {$active eq "none"} { + set i 0 + } else { + set i [expr {$active + $count}] + } + while {1} { + if {$quitAfter <= 0} { + # We've tried every entry in the menu. Either there are + # none, or they're all disabled. Just give up. + + return + } + while {$i < 0} { + incr i $length + } + while {$i >= $length} { + incr i -$length + } + if {[catch {$menu entrycget $i -state} state] == 0} { + if {$state ne "disabled" && \ + ($i!=0 || [$menu cget -type] ne "tearoff" \ + || [$menu type 0] ne "tearoff")} { + break + } + } + if {$i == $active} { + return + } + incr i $count + incr quitAfter -1 + } + $menu activate $i + GenerateMenuSelect $menu + + if {[$menu type $i] eq "cascade" && [$menu cget -type] eq "menubar"} { + set cascade [$menu entrycget $i -menu] + if {$cascade ne ""} { + # Here we auto-post a cascade. This is necessary when + # we traverse left/right in the menubar, but undesirable when + # we traverse up/down in a menu. + $menu postcascade $i + MenuFirstEntry $cascade + } + } +} + +# ::tk::MenuFind -- +# This procedure searches the entire window hierarchy under w for +# a menubutton that isn't disabled and whose underlined character +# is "char" or an entry in a menubar that isn't disabled and whose +# underlined character is "char". +# It returns the name of that window, if found, or an +# empty string if no matching window was found. If "char" is an +# empty string then the procedure returns the name of the first +# menubutton found that isn't disabled. +# +# Arguments: +# w - Name of window where key was typed. +# char - Underlined character to search for; +# may be either upper or lower case, and +# will match either upper or lower case. + +proc ::tk::MenuFind {w char} { + set char [string tolower $char] + set windowlist [winfo child $w] + + foreach child $windowlist { + # Don't descend into other toplevels. + if {[winfo toplevel $w] ne [winfo toplevel $child]} { + continue + } + if {[winfo class $child] eq "Menu" && \ + [$child cget -type] eq "menubar"} { + if {$char eq ""} { + return $child + } + set last [$child index last] + for {set i [$child cget -tearoff]} {$i <= $last} {incr i} { + if {[$child type $i] eq "separator"} { + continue + } + set char2 [string index [$child entrycget $i -label] \ + [$child entrycget $i -underline]] + if {$char eq [string tolower $char2] || $char eq ""} { + if {[$child entrycget $i -state] ne "disabled"} { + return $child + } + } + } + } + } + + foreach child $windowlist { + # Don't descend into other toplevels. + if {[winfo toplevel $w] ne [winfo toplevel $child]} { + continue + } + switch -- [winfo class $child] { + Menubutton { + set char2 [string index [$child cget -text] \ + [$child cget -underline]] + if {$char eq [string tolower $char2] || $char eq ""} { + if {[$child cget -state] ne "disabled"} { + return $child + } + } + } + + default { + set match [MenuFind $child $char] + if {$match ne ""} { + return $match + } + } + } + } + return {} +} + +# ::tk::TraverseToMenu -- +# This procedure implements keyboard traversal of menus. Given an +# ASCII character "char", it looks for a menubutton with that character +# underlined. If one is found, it posts the menubutton's menu +# +# Arguments: +# w - Window in which the key was typed (selects +# a toplevel window). +# char - Character that selects a menu. The case +# is ignored. If an empty string, nothing +# happens. + +proc ::tk::TraverseToMenu {w char} { + variable ::tk::Priv + if {![winfo exists $w] || $char eq ""} { + return + } + while {[winfo class $w] eq "Menu"} { + if {[$w cget -type] eq "menubar"} { + break + } elseif {$Priv(postedMb) eq ""} { + return + } + set w [winfo parent $w] + } + set w [MenuFind [winfo toplevel $w] $char] + if {$w ne ""} { + if {[winfo class $w] eq "Menu"} { + tk_menuSetFocus $w + set Priv(window) $w + SaveGrabInfo $w + grab -global $w + TraverseWithinMenu $w $char + } else { + MbPost $w + MenuFirstEntry [$w cget -menu] + } + } +} + +# ::tk::FirstMenu -- +# This procedure traverses to the first menubutton in the toplevel +# for a given window, and posts that menubutton's menu. +# +# Arguments: +# w - Name of a window. Selects which toplevel +# to search for menubuttons. + +proc ::tk::FirstMenu w { + variable ::tk::Priv + set w [MenuFind [winfo toplevel $w] ""] + if {$w ne ""} { + if {[winfo class $w] eq "Menu"} { + tk_menuSetFocus $w + set Priv(window) $w + SaveGrabInfo $w + grab -global $w + MenuFirstEntry $w + } else { + MbPost $w + MenuFirstEntry [$w cget -menu] + } + } +} + +# ::tk::TraverseWithinMenu +# This procedure implements keyboard traversal within a menu. It +# searches for an entry in the menu that has "char" underlined. If +# such an entry is found, it is invoked and the menu is unposted. +# +# Arguments: +# w - The name of the menu widget. +# char - The character to look for; case is +# ignored. If the string is empty then +# nothing happens. + +proc ::tk::TraverseWithinMenu {w char} { + if {$char eq ""} { + return + } + set char [string tolower $char] + set last [$w index last] + if {$last eq "none"} { + return + } + for {set i 0} {$i <= $last} {incr i} { + if {[catch {set char2 [string index \ + [$w entrycget $i -label] [$w entrycget $i -underline]]}]} { + continue + } + if {$char eq [string tolower $char2]} { + if {[$w type $i] eq "cascade"} { + $w activate $i + $w postcascade active + event generate $w <> + set m2 [$w entrycget $i -menu] + if {$m2 ne ""} { + MenuFirstEntry $m2 + } + } else { + MenuUnpost $w + uplevel #0 [list $w invoke $i] + } + return + } + } +} + +# ::tk::MenuFirstEntry -- +# Given a menu, this procedure finds the first entry that isn't +# disabled or a tear-off or separator, and activates that entry. +# However, if there is already an active entry in the menu (e.g., +# because of a previous call to tk::PostOverPoint) then the active +# entry isn't changed. This procedure also sets the input focus +# to the menu. +# +# Arguments: +# menu - Name of the menu window (possibly empty). + +proc ::tk::MenuFirstEntry menu { + if {$menu eq ""} { + return + } + tk_menuSetFocus $menu + if {[$menu index active] ne "none"} { + return + } + set last [$menu index last] + if {$last eq "none"} { + return + } + for {set i 0} {$i <= $last} {incr i} { + if {([catch {set state [$menu entrycget $i -state]}] == 0) \ + && $state ne "disabled" && [$menu type $i] ne "tearoff"} { + $menu activate $i + GenerateMenuSelect $menu + # Only post the cascade if the current menu is a menubar; + # otherwise, if the first entry of the cascade is a cascade, + # we can get an annoying cascading effect resulting in a bunch of + # menus getting posted (bug 676) + if {[$menu type $i] eq "cascade" && [$menu cget -type] eq "menubar"} { + set cascade [$menu entrycget $i -menu] + if {$cascade ne ""} { + $menu postcascade $i + MenuFirstEntry $cascade + } + } + return + } + } +} + +# ::tk::MenuFindName -- +# Given a menu and a text string, return the index of the menu entry +# that displays the string as its label. If there is no such entry, +# return an empty string. This procedure is tricky because some names +# like "active" have a special meaning in menu commands, so we can't +# always use the "index" widget command. +# +# Arguments: +# menu - Name of the menu widget. +# s - String to look for. + +proc ::tk::MenuFindName {menu s} { + set i "" + if {![regexp {^active$|^last$|^none$|^[0-9]|^@} $s]} { + catch {set i [$menu index $s]} + return $i + } + set last [$menu index last] + if {$last eq "none"} { + return + } + for {set i 0} {$i <= $last} {incr i} { + if {![catch {$menu entrycget $i -label} label]} { + if {$label eq $s} { + return $i + } + } + } + return "" +} + +# ::tk::PostOverPoint -- +# This procedure posts a given menu such that a given entry in the +# menu is centered over a given point in the root window. It also +# activates the given entry. +# +# Arguments: +# menu - Menu to post. +# x, y - Root coordinates of point. +# entry - Index of entry within menu to center over (x,y). +# If omitted or specified as {}, then the menu's +# upper-left corner goes at (x,y). + +proc ::tk::PostOverPoint {menu x y {entry {}}} { + if {$entry ne ""} { + if {$entry == [$menu index last]} { + incr y [expr {-([$menu yposition $entry] \ + + [winfo reqheight $menu])/2}] + } else { + incr y [expr {-([$menu yposition $entry] \ + + [$menu yposition [expr {$entry+1}]])/2}] + } + incr x [expr {-[winfo reqwidth $menu]/2}] + } + + if {[tk windowingsystem] eq "win32"} { + # osVersion is not available in safe interps + set ver 5 + if {[info exists ::tcl_platform(osVersion)]} { + scan $::tcl_platform(osVersion) %d ver + } + + # We need to fix some problems with menu posting on Windows, + # where, if the menu would overlap top or bottom of screen, + # Windows puts it in the wrong place for us. We must also + # subtract an extra amount for half the height of the current + # entry. To be safe we subtract an extra 10. + # NOTE: this issue appears to have been resolved in the Window + # manager provided with Vista and Windows 7. + if {$ver < 6} { + set yoffset [expr {[winfo screenheight $menu] \ + - $y - [winfo reqheight $menu] - 10}] + if {$yoffset < [winfo vrooty $menu]} { + # The bottom of the menu is offscreen, so adjust upwards + incr y [expr {$yoffset - [winfo vrooty $menu]}] + } + # If we're off the top of the screen (either because we were + # originally or because we just adjusted too far upwards), + # then make the menu popup on the top edge. + if {$y < [winfo vrooty $menu]} { + set y [winfo vrooty $menu] + } + } + } + $menu post $x $y + if {$entry ne "" && [$menu entrycget $entry -state] ne "disabled"} { + $menu activate $entry + GenerateMenuSelect $menu + } +} + +# ::tk::SaveGrabInfo -- +# Sets the variables tk::Priv(oldGrab) and tk::Priv(grabStatus) to record +# the state of any existing grab on the w's display. +# +# Arguments: +# w - Name of a window; used to select the display +# whose grab information is to be recorded. + +proc tk::SaveGrabInfo w { + variable ::tk::Priv + set Priv(oldGrab) [grab current $w] + if {$Priv(oldGrab) ne ""} { + set Priv(grabStatus) [grab status $Priv(oldGrab)] + } +} + +# ::tk::RestoreOldGrab -- +# Restores the grab to what it was before TkSaveGrabInfo was called. +# + +proc ::tk::RestoreOldGrab {} { + variable ::tk::Priv + + if {$Priv(oldGrab) ne ""} { + # Be careful restoring the old grab, since it's window may not + # be visible anymore. + + catch { + if {$Priv(grabStatus) eq "global"} { + grab set -global $Priv(oldGrab) + } else { + grab set $Priv(oldGrab) + } + } + set Priv(oldGrab) "" + } +} + +proc ::tk_menuSetFocus {menu} { + variable ::tk::Priv + if {![info exists Priv(focus)] || $Priv(focus) eq ""} { + set Priv(focus) [focus] + } + focus $menu +} + +proc ::tk::GenerateMenuSelect {menu} { + variable ::tk::Priv + + if {$Priv(activeMenu) eq $menu \ + && $Priv(activeItem) eq [$menu index active]} { + return + } + + set Priv(activeMenu) $menu + set Priv(activeItem) [$menu index active] + event generate $menu <> +} + +# ::tk_popup -- +# This procedure pops up a menu and sets things up for traversing +# the menu and its submenus. +# +# Arguments: +# menu - Name of the menu to be popped up. +# x, y - Root coordinates at which to pop up the +# menu. +# entry - Index of a menu entry to center over (x,y). +# If omitted or specified as {}, then menu's +# upper-left corner goes at (x,y). + +proc ::tk_popup {menu x y {entry {}}} { + variable ::tk::Priv + if {$Priv(popup) ne "" || $Priv(postedMb) ne ""} { + tk::MenuUnpost {} + } + tk::PostOverPoint $menu $x $y $entry + if {[tk windowingsystem] eq "x11" && [winfo viewable $menu]} { + tk::SaveGrabInfo $menu + grab -global $menu + set Priv(popup) $menu + set Priv(window) $menu + set Priv(menuActivated) 1 + tk_menuSetFocus $menu + } +} diff --git a/env/tcl/tk8.6/mkpsenc.tcl b/env/tcl/tk8.6/mkpsenc.tcl new file mode 100644 index 0000000..b3fd13d --- /dev/null +++ b/env/tcl/tk8.6/mkpsenc.tcl @@ -0,0 +1,1488 @@ +# mkpsenc.tcl -- +# +# This file generates the postscript prolog used by Tk. + +namespace eval ::tk { + # Creates Postscript encoding vector for ISO-8859-1 (could theoretically + # handle any 8-bit encoding, but Tk never generates characters outside + # ASCII). + # + proc CreatePostscriptEncoding {} { + variable psglyphs + # Now check for known. Even if it is known, it can be other than we + # need. GhostScript seems to be happy with such approach + set result "\[\n" + for {set i 0} {$i<256} {incr i 8} { + for {set j 0} {$j<8} {incr j} { + set enc [encoding convertfrom "iso8859-1" \ + [format %c [expr {$i+$j}]]] + catch { + set hexcode {} + set hexcode [format %04X [scan $enc %c]] + } + if {[info exists psglyphs($hexcode)]} { + append result "/$psglyphs($hexcode)" + } else { + append result "/space" + } + } + append result "\n" + } + append result "\]" + return $result + } + + # List of adobe glyph names. Converted from glyphlist.txt, downloaded from + # Adobe. + + variable psglyphs + array set psglyphs { + 0020 space + 0021 exclam + 0022 quotedbl + 0023 numbersign + 0024 dollar + 0025 percent + 0026 ampersand + 0027 quotesingle + 0028 parenleft + 0029 parenright + 002A asterisk + 002B plus + 002C comma + 002D hyphen + 002E period + 002F slash + 0030 zero + 0031 one + 0032 two + 0033 three + 0034 four + 0035 five + 0036 six + 0037 seven + 0038 eight + 0039 nine + 003A colon + 003B semicolon + 003C less + 003D equal + 003E greater + 003F question + 0040 at + 0041 A + 0042 B + 0043 C + 0044 D + 0045 E + 0046 F + 0047 G + 0048 H + 0049 I + 004A J + 004B K + 004C L + 004D M + 004E N + 004F O + 0050 P + 0051 Q + 0052 R + 0053 S + 0054 T + 0055 U + 0056 V + 0057 W + 0058 X + 0059 Y + 005A Z + 005B bracketleft + 005C backslash + 005D bracketright + 005E asciicircum + 005F underscore + 0060 grave + 0061 a + 0062 b + 0063 c + 0064 d + 0065 e + 0066 f + 0067 g + 0068 h + 0069 i + 006A j + 006B k + 006C l + 006D m + 006E n + 006F o + 0070 p + 0071 q + 0072 r + 0073 s + 0074 t + 0075 u + 0076 v + 0077 w + 0078 x + 0079 y + 007A z + 007B braceleft + 007C bar + 007D braceright + 007E asciitilde + 00A0 space + 00A1 exclamdown + 00A2 cent + 00A3 sterling + 00A4 currency + 00A5 yen + 00A6 brokenbar + 00A7 section + 00A8 dieresis + 00A9 copyright + 00AA ordfeminine + 00AB guillemotleft + 00AC logicalnot + 00AD hyphen + 00AE registered + 00AF macron + 00B0 degree + 00B1 plusminus + 00B2 twosuperior + 00B3 threesuperior + 00B4 acute + 00B5 mu + 00B6 paragraph + 00B7 periodcentered + 00B8 cedilla + 00B9 onesuperior + 00BA ordmasculine + 00BB guillemotright + 00BC onequarter + 00BD onehalf + 00BE threequarters + 00BF questiondown + 00C0 Agrave + 00C1 Aacute + 00C2 Acircumflex + 00C3 Atilde + 00C4 Adieresis + 00C5 Aring + 00C6 AE + 00C7 Ccedilla + 00C8 Egrave + 00C9 Eacute + 00CA Ecircumflex + 00CB Edieresis + 00CC Igrave + 00CD Iacute + 00CE Icircumflex + 00CF Idieresis + 00D0 Eth + 00D1 Ntilde + 00D2 Ograve + 00D3 Oacute + 00D4 Ocircumflex + 00D5 Otilde + 00D6 Odieresis + 00D7 multiply + 00D8 Oslash + 00D9 Ugrave + 00DA Uacute + 00DB Ucircumflex + 00DC Udieresis + 00DD Yacute + 00DE Thorn + 00DF germandbls + 00E0 agrave + 00E1 aacute + 00E2 acircumflex + 00E3 atilde + 00E4 adieresis + 00E5 aring + 00E6 ae + 00E7 ccedilla + 00E8 egrave + 00E9 eacute + 00EA ecircumflex + 00EB edieresis + 00EC igrave + 00ED iacute + 00EE icircumflex + 00EF idieresis + 00F0 eth + 00F1 ntilde + 00F2 ograve + 00F3 oacute + 00F4 ocircumflex + 00F5 otilde + 00F6 odieresis + 00F7 divide + 00F8 oslash + 00F9 ugrave + 00FA uacute + 00FB ucircumflex + 00FC udieresis + 00FD yacute + 00FE thorn + 00FF ydieresis + 0100 Amacron + 0101 amacron + 0102 Abreve + 0103 abreve + 0104 Aogonek + 0105 aogonek + 0106 Cacute + 0107 cacute + 0108 Ccircumflex + 0109 ccircumflex + 010A Cdotaccent + 010B cdotaccent + 010C Ccaron + 010D ccaron + 010E Dcaron + 010F dcaron + 0110 Dcroat + 0111 dcroat + 0112 Emacron + 0113 emacron + 0114 Ebreve + 0115 ebreve + 0116 Edotaccent + 0117 edotaccent + 0118 Eogonek + 0119 eogonek + 011A Ecaron + 011B ecaron + 011C Gcircumflex + 011D gcircumflex + 011E Gbreve + 011F gbreve + 0120 Gdotaccent + 0121 gdotaccent + 0122 Gcommaaccent + 0123 gcommaaccent + 0124 Hcircumflex + 0125 hcircumflex + 0126 Hbar + 0127 hbar + 0128 Itilde + 0129 itilde + 012A Imacron + 012B imacron + 012C Ibreve + 012D ibreve + 012E Iogonek + 012F iogonek + 0130 Idotaccent + 0131 dotlessi + 0132 IJ + 0133 ij + 0134 Jcircumflex + 0135 jcircumflex + 0136 Kcommaaccent + 0137 kcommaaccent + 0138 kgreenlandic + 0139 Lacute + 013A lacute + 013B Lcommaaccent + 013C lcommaaccent + 013D Lcaron + 013E lcaron + 013F Ldot + 0140 ldot + 0141 Lslash + 0142 lslash + 0143 Nacute + 0144 nacute + 0145 Ncommaaccent + 0146 ncommaaccent + 0147 Ncaron + 0148 ncaron + 0149 napostrophe + 014A Eng + 014B eng + 014C Omacron + 014D omacron + 014E Obreve + 014F obreve + 0150 Ohungarumlaut + 0151 ohungarumlaut + 0152 OE + 0153 oe + 0154 Racute + 0155 racute + 0156 Rcommaaccent + 0157 rcommaaccent + 0158 Rcaron + 0159 rcaron + 015A Sacute + 015B sacute + 015C Scircumflex + 015D scircumflex + 015E Scedilla + 015F scedilla + 0160 Scaron + 0161 scaron + 0162 Tcommaaccent + 0163 tcommaaccent + 0164 Tcaron + 0165 tcaron + 0166 Tbar + 0167 tbar + 0168 Utilde + 0169 utilde + 016A Umacron + 016B umacron + 016C Ubreve + 016D ubreve + 016E Uring + 016F uring + 0170 Uhungarumlaut + 0171 uhungarumlaut + 0172 Uogonek + 0173 uogonek + 0174 Wcircumflex + 0175 wcircumflex + 0176 Ycircumflex + 0177 ycircumflex + 0178 Ydieresis + 0179 Zacute + 017A zacute + 017B Zdotaccent + 017C zdotaccent + 017D Zcaron + 017E zcaron + 017F longs + 0192 florin + 01A0 Ohorn + 01A1 ohorn + 01AF Uhorn + 01B0 uhorn + 01E6 Gcaron + 01E7 gcaron + 01FA Aringacute + 01FB aringacute + 01FC AEacute + 01FD aeacute + 01FE Oslashacute + 01FF oslashacute + 0218 Scommaaccent + 0219 scommaaccent + 021A Tcommaaccent + 021B tcommaaccent + 02BC afii57929 + 02BD afii64937 + 02C6 circumflex + 02C7 caron + 02C9 macron + 02D8 breve + 02D9 dotaccent + 02DA ring + 02DB ogonek + 02DC tilde + 02DD hungarumlaut + 0300 gravecomb + 0301 acutecomb + 0303 tildecomb + 0309 hookabovecomb + 0323 dotbelowcomb + 0384 tonos + 0385 dieresistonos + 0386 Alphatonos + 0387 anoteleia + 0388 Epsilontonos + 0389 Etatonos + 038A Iotatonos + 038C Omicrontonos + 038E Upsilontonos + 038F Omegatonos + 0390 iotadieresistonos + 0391 Alpha + 0392 Beta + 0393 Gamma + 0394 Delta + 0395 Epsilon + 0396 Zeta + 0397 Eta + 0398 Theta + 0399 Iota + 039A Kappa + 039B Lambda + 039C Mu + 039D Nu + 039E Xi + 039F Omicron + 03A0 Pi + 03A1 Rho + 03A3 Sigma + 03A4 Tau + 03A5 Upsilon + 03A6 Phi + 03A7 Chi + 03A8 Psi + 03A9 Omega + 03AA Iotadieresis + 03AB Upsilondieresis + 03AC alphatonos + 03AD epsilontonos + 03AE etatonos + 03AF iotatonos + 03B0 upsilondieresistonos + 03B1 alpha + 03B2 beta + 03B3 gamma + 03B4 delta + 03B5 epsilon + 03B6 zeta + 03B7 eta + 03B8 theta + 03B9 iota + 03BA kappa + 03BB lambda + 03BC mu + 03BD nu + 03BE xi + 03BF omicron + 03C0 pi + 03C1 rho + 03C2 sigma1 + 03C3 sigma + 03C4 tau + 03C5 upsilon + 03C6 phi + 03C7 chi + 03C8 psi + 03C9 omega + 03CA iotadieresis + 03CB upsilondieresis + 03CC omicrontonos + 03CD upsilontonos + 03CE omegatonos + 03D1 theta1 + 03D2 Upsilon1 + 03D5 phi1 + 03D6 omega1 + 0401 afii10023 + 0402 afii10051 + 0403 afii10052 + 0404 afii10053 + 0405 afii10054 + 0406 afii10055 + 0407 afii10056 + 0408 afii10057 + 0409 afii10058 + 040A afii10059 + 040B afii10060 + 040C afii10061 + 040E afii10062 + 040F afii10145 + 0410 afii10017 + 0411 afii10018 + 0412 afii10019 + 0413 afii10020 + 0414 afii10021 + 0415 afii10022 + 0416 afii10024 + 0417 afii10025 + 0418 afii10026 + 0419 afii10027 + 041A afii10028 + 041B afii10029 + 041C afii10030 + 041D afii10031 + 041E afii10032 + 041F afii10033 + 0420 afii10034 + 0421 afii10035 + 0422 afii10036 + 0423 afii10037 + 0424 afii10038 + 0425 afii10039 + 0426 afii10040 + 0427 afii10041 + 0428 afii10042 + 0429 afii10043 + 042A afii10044 + 042B afii10045 + 042C afii10046 + 042D afii10047 + 042E afii10048 + 042F afii10049 + 0430 afii10065 + 0431 afii10066 + 0432 afii10067 + 0433 afii10068 + 0434 afii10069 + 0435 afii10070 + 0436 afii10072 + 0437 afii10073 + 0438 afii10074 + 0439 afii10075 + 043A afii10076 + 043B afii10077 + 043C afii10078 + 043D afii10079 + 043E afii10080 + 043F afii10081 + 0440 afii10082 + 0441 afii10083 + 0442 afii10084 + 0443 afii10085 + 0444 afii10086 + 0445 afii10087 + 0446 afii10088 + 0447 afii10089 + 0448 afii10090 + 0449 afii10091 + 044A afii10092 + 044B afii10093 + 044C afii10094 + 044D afii10095 + 044E afii10096 + 044F afii10097 + 0451 afii10071 + 0452 afii10099 + 0453 afii10100 + 0454 afii10101 + 0455 afii10102 + 0456 afii10103 + 0457 afii10104 + 0458 afii10105 + 0459 afii10106 + 045A afii10107 + 045B afii10108 + 045C afii10109 + 045E afii10110 + 045F afii10193 + 0462 afii10146 + 0463 afii10194 + 0472 afii10147 + 0473 afii10195 + 0474 afii10148 + 0475 afii10196 + 0490 afii10050 + 0491 afii10098 + 04D9 afii10846 + 05B0 afii57799 + 05B1 afii57801 + 05B2 afii57800 + 05B3 afii57802 + 05B4 afii57793 + 05B5 afii57794 + 05B6 afii57795 + 05B7 afii57798 + 05B8 afii57797 + 05B9 afii57806 + 05BB afii57796 + 05BC afii57807 + 05BD afii57839 + 05BE afii57645 + 05BF afii57841 + 05C0 afii57842 + 05C1 afii57804 + 05C2 afii57803 + 05C3 afii57658 + 05D0 afii57664 + 05D1 afii57665 + 05D2 afii57666 + 05D3 afii57667 + 05D4 afii57668 + 05D5 afii57669 + 05D6 afii57670 + 05D7 afii57671 + 05D8 afii57672 + 05D9 afii57673 + 05DA afii57674 + 05DB afii57675 + 05DC afii57676 + 05DD afii57677 + 05DE afii57678 + 05DF afii57679 + 05E0 afii57680 + 05E1 afii57681 + 05E2 afii57682 + 05E3 afii57683 + 05E4 afii57684 + 05E5 afii57685 + 05E6 afii57686 + 05E7 afii57687 + 05E8 afii57688 + 05E9 afii57689 + 05EA afii57690 + 05F0 afii57716 + 05F1 afii57717 + 05F2 afii57718 + 060C afii57388 + 061B afii57403 + 061F afii57407 + 0621 afii57409 + 0622 afii57410 + 0623 afii57411 + 0624 afii57412 + 0625 afii57413 + 0626 afii57414 + 0627 afii57415 + 0628 afii57416 + 0629 afii57417 + 062A afii57418 + 062B afii57419 + 062C afii57420 + 062D afii57421 + 062E afii57422 + 062F afii57423 + 0630 afii57424 + 0631 afii57425 + 0632 afii57426 + 0633 afii57427 + 0634 afii57428 + 0635 afii57429 + 0636 afii57430 + 0637 afii57431 + 0638 afii57432 + 0639 afii57433 + 063A afii57434 + 0640 afii57440 + 0641 afii57441 + 0642 afii57442 + 0643 afii57443 + 0644 afii57444 + 0645 afii57445 + 0646 afii57446 + 0647 afii57470 + 0648 afii57448 + 0649 afii57449 + 064A afii57450 + 064B afii57451 + 064C afii57452 + 064D afii57453 + 064E afii57454 + 064F afii57455 + 0650 afii57456 + 0651 afii57457 + 0652 afii57458 + 0660 afii57392 + 0661 afii57393 + 0662 afii57394 + 0663 afii57395 + 0664 afii57396 + 0665 afii57397 + 0666 afii57398 + 0667 afii57399 + 0668 afii57400 + 0669 afii57401 + 066A afii57381 + 066D afii63167 + 0679 afii57511 + 067E afii57506 + 0686 afii57507 + 0688 afii57512 + 0691 afii57513 + 0698 afii57508 + 06A4 afii57505 + 06AF afii57509 + 06BA afii57514 + 06D2 afii57519 + 06D5 afii57534 + 1E80 Wgrave + 1E81 wgrave + 1E82 Wacute + 1E83 wacute + 1E84 Wdieresis + 1E85 wdieresis + 1EF2 Ygrave + 1EF3 ygrave + 200C afii61664 + 200D afii301 + 200E afii299 + 200F afii300 + 2012 figuredash + 2013 endash + 2014 emdash + 2015 afii00208 + 2017 underscoredbl + 2018 quoteleft + 2019 quoteright + 201A quotesinglbase + 201B quotereversed + 201C quotedblleft + 201D quotedblright + 201E quotedblbase + 2020 dagger + 2021 daggerdbl + 2022 bullet + 2024 onedotenleader + 2025 twodotenleader + 2026 ellipsis + 202C afii61573 + 202D afii61574 + 202E afii61575 + 2030 perthousand + 2032 minute + 2033 second + 2039 guilsinglleft + 203A guilsinglright + 203C exclamdbl + 2044 fraction + 2070 zerosuperior + 2074 foursuperior + 2075 fivesuperior + 2076 sixsuperior + 2077 sevensuperior + 2078 eightsuperior + 2079 ninesuperior + 207D parenleftsuperior + 207E parenrightsuperior + 207F nsuperior + 2080 zeroinferior + 2081 oneinferior + 2082 twoinferior + 2083 threeinferior + 2084 fourinferior + 2085 fiveinferior + 2086 sixinferior + 2087 seveninferior + 2088 eightinferior + 2089 nineinferior + 208D parenleftinferior + 208E parenrightinferior + 20A1 colonmonetary + 20A3 franc + 20A4 lira + 20A7 peseta + 20AA afii57636 + 20AB dong + 20AC Euro + 2105 afii61248 + 2111 Ifraktur + 2113 afii61289 + 2116 afii61352 + 2118 weierstrass + 211C Rfraktur + 211E prescription + 2122 trademark + 2126 Omega + 212E estimated + 2135 aleph + 2153 onethird + 2154 twothirds + 215B oneeighth + 215C threeeighths + 215D fiveeighths + 215E seveneighths + 2190 arrowleft + 2191 arrowup + 2192 arrowright + 2193 arrowdown + 2194 arrowboth + 2195 arrowupdn + 21A8 arrowupdnbse + 21B5 carriagereturn + 21D0 arrowdblleft + 21D1 arrowdblup + 21D2 arrowdblright + 21D3 arrowdbldown + 21D4 arrowdblboth + 2200 universal + 2202 partialdiff + 2203 existential + 2205 emptyset + 2206 Delta + 2207 gradient + 2208 element + 2209 notelement + 220B suchthat + 220F product + 2211 summation + 2212 minus + 2215 fraction + 2217 asteriskmath + 2219 periodcentered + 221A radical + 221D proportional + 221E infinity + 221F orthogonal + 2220 angle + 2227 logicaland + 2228 logicalor + 2229 intersection + 222A union + 222B integral + 2234 therefore + 223C similar + 2245 congruent + 2248 approxequal + 2260 notequal + 2261 equivalence + 2264 lessequal + 2265 greaterequal + 2282 propersubset + 2283 propersuperset + 2284 notsubset + 2286 reflexsubset + 2287 reflexsuperset + 2295 circleplus + 2297 circlemultiply + 22A5 perpendicular + 22C5 dotmath + 2302 house + 2310 revlogicalnot + 2320 integraltp + 2321 integralbt + 2329 angleleft + 232A angleright + 2500 SF100000 + 2502 SF110000 + 250C SF010000 + 2510 SF030000 + 2514 SF020000 + 2518 SF040000 + 251C SF080000 + 2524 SF090000 + 252C SF060000 + 2534 SF070000 + 253C SF050000 + 2550 SF430000 + 2551 SF240000 + 2552 SF510000 + 2553 SF520000 + 2554 SF390000 + 2555 SF220000 + 2556 SF210000 + 2557 SF250000 + 2558 SF500000 + 2559 SF490000 + 255A SF380000 + 255B SF280000 + 255C SF270000 + 255D SF260000 + 255E SF360000 + 255F SF370000 + 2560 SF420000 + 2561 SF190000 + 2562 SF200000 + 2563 SF230000 + 2564 SF470000 + 2565 SF480000 + 2566 SF410000 + 2567 SF450000 + 2568 SF460000 + 2569 SF400000 + 256A SF540000 + 256B SF530000 + 256C SF440000 + 2580 upblock + 2584 dnblock + 2588 block + 258C lfblock + 2590 rtblock + 2591 ltshade + 2592 shade + 2593 dkshade + 25A0 filledbox + 25A1 H22073 + 25AA H18543 + 25AB H18551 + 25AC filledrect + 25B2 triagup + 25BA triagrt + 25BC triagdn + 25C4 triaglf + 25CA lozenge + 25CB circle + 25CF H18533 + 25D8 invbullet + 25D9 invcircle + 25E6 openbullet + 263A smileface + 263B invsmileface + 263C sun + 2640 female + 2642 male + 2660 spade + 2663 club + 2665 heart + 2666 diamond + 266A musicalnote + 266B musicalnotedbl + F6BE dotlessj + F6BF LL + F6C0 ll + F6C1 Scedilla + F6C2 scedilla + F6C3 commaaccent + F6C4 afii10063 + F6C5 afii10064 + F6C6 afii10192 + F6C7 afii10831 + F6C8 afii10832 + F6C9 Acute + F6CA Caron + F6CB Dieresis + F6CC DieresisAcute + F6CD DieresisGrave + F6CE Grave + F6CF Hungarumlaut + F6D0 Macron + F6D1 cyrBreve + F6D2 cyrFlex + F6D3 dblGrave + F6D4 cyrbreve + F6D5 cyrflex + F6D6 dblgrave + F6D7 dieresisacute + F6D8 dieresisgrave + F6D9 copyrightserif + F6DA registerserif + F6DB trademarkserif + F6DC onefitted + F6DD rupiah + F6DE threequartersemdash + F6DF centinferior + F6E0 centsuperior + F6E1 commainferior + F6E2 commasuperior + F6E3 dollarinferior + F6E4 dollarsuperior + F6E5 hypheninferior + F6E6 hyphensuperior + F6E7 periodinferior + F6E8 periodsuperior + F6E9 asuperior + F6EA bsuperior + F6EB dsuperior + F6EC esuperior + F6ED isuperior + F6EE lsuperior + F6EF msuperior + F6F0 osuperior + F6F1 rsuperior + F6F2 ssuperior + F6F3 tsuperior + F6F4 Brevesmall + F6F5 Caronsmall + F6F6 Circumflexsmall + F6F7 Dotaccentsmall + F6F8 Hungarumlautsmall + F6F9 Lslashsmall + F6FA OEsmall + F6FB Ogoneksmall + F6FC Ringsmall + F6FD Scaronsmall + F6FE Tildesmall + F6FF Zcaronsmall + F721 exclamsmall + F724 dollaroldstyle + F726 ampersandsmall + F730 zerooldstyle + F731 oneoldstyle + F732 twooldstyle + F733 threeoldstyle + F734 fouroldstyle + F735 fiveoldstyle + F736 sixoldstyle + F737 sevenoldstyle + F738 eightoldstyle + F739 nineoldstyle + F73F questionsmall + F760 Gravesmall + F761 Asmall + F762 Bsmall + F763 Csmall + F764 Dsmall + F765 Esmall + F766 Fsmall + F767 Gsmall + F768 Hsmall + F769 Ismall + F76A Jsmall + F76B Ksmall + F76C Lsmall + F76D Msmall + F76E Nsmall + F76F Osmall + F770 Psmall + F771 Qsmall + F772 Rsmall + F773 Ssmall + F774 Tsmall + F775 Usmall + F776 Vsmall + F777 Wsmall + F778 Xsmall + F779 Ysmall + F77A Zsmall + F7A1 exclamdownsmall + F7A2 centoldstyle + F7A8 Dieresissmall + F7AF Macronsmall + F7B4 Acutesmall + F7B8 Cedillasmall + F7BF questiondownsmall + F7E0 Agravesmall + F7E1 Aacutesmall + F7E2 Acircumflexsmall + F7E3 Atildesmall + F7E4 Adieresissmall + F7E5 Aringsmall + F7E6 AEsmall + F7E7 Ccedillasmall + F7E8 Egravesmall + F7E9 Eacutesmall + F7EA Ecircumflexsmall + F7EB Edieresissmall + F7EC Igravesmall + F7ED Iacutesmall + F7EE Icircumflexsmall + F7EF Idieresissmall + F7F0 Ethsmall + F7F1 Ntildesmall + F7F2 Ogravesmall + F7F3 Oacutesmall + F7F4 Ocircumflexsmall + F7F5 Otildesmall + F7F6 Odieresissmall + F7F8 Oslashsmall + F7F9 Ugravesmall + F7FA Uacutesmall + F7FB Ucircumflexsmall + F7FC Udieresissmall + F7FD Yacutesmall + F7FE Thornsmall + F7FF Ydieresissmall + F8E5 radicalex + F8E6 arrowvertex + F8E7 arrowhorizex + F8E8 registersans + F8E9 copyrightsans + F8EA trademarksans + F8EB parenlefttp + F8EC parenleftex + F8ED parenleftbt + F8EE bracketlefttp + F8EF bracketleftex + F8F0 bracketleftbt + F8F1 bracelefttp + F8F2 braceleftmid + F8F3 braceleftbt + F8F4 braceex + F8F5 integralex + F8F6 parenrighttp + F8F7 parenrightex + F8F8 parenrightbt + F8F9 bracketrighttp + F8FA bracketrightex + F8FB bracketrightbt + F8FC bracerighttp + F8FD bracerightmid + F8FE bracerightbt + FB00 ff + FB01 fi + FB02 fl + FB03 ffi + FB04 ffl + FB1F afii57705 + FB2A afii57694 + FB2B afii57695 + FB35 afii57723 + FB4B afii57700 + } + + variable ps_preamble {} + + namespace eval ps { + namespace ensemble create + namespace export {[a-z]*} + proc literal {string} { + upvar 0 ::tk::ps_preamble preamble + foreach line [split $string \n] { + set line [string trim $line] + if {$line eq ""} continue + append preamble $line \n + } + return + } + proc variable {name value} { + upvar 0 ::tk::ps_preamble preamble + append preamble "/$name $value def\n" + return + } + proc function {name body} { + upvar 0 ::tk::ps_preamble preamble + append preamble "/$name \{" + foreach line [split $body \n] { + set line [string trim $line] + # Strip blank lines and comments from the bodies of functions + if {$line eq "" } continue + if {[string match {[%#]*} $line]} continue + append preamble $line " " + } + append preamble "\} bind def\n" + return + } + } + + ps literal { + %%BeginProlog + % This is a standard prolog for Postscript generated by Tk's canvas + % widget. + } + ps variable CurrentEncoding [CreatePostscriptEncoding] + ps literal {50 dict begin} + + # The definitions below just define all of the variables used in any of + # the procedures here. This is needed for obscure reasons explained on + # p. 716 of the Postscript manual (Section H.2.7, "Initializing + # Variables," in the section on Encapsulated Postscript). + ps variable baseline 0 + ps variable stipimage 0 + ps variable height 0 + ps variable justify 0 + ps variable lineLength 0 + ps variable spacing 0 + ps variable stipple 0 + ps variable strings 0 + ps variable xoffset 0 + ps variable yoffset 0 + ps variable tmpstip null + ps variable baselineSampler "( TXygqPZ)" + # Put an extra-tall character in; done this way to avoid encoding trouble + ps literal {baselineSampler 0 196 put} + + ps function cstringshow { + { + dup type /stringtype eq + { show } { glyphshow } + ifelse + } forall + } + + ps function cstringwidth { + 0 exch 0 exch + { + dup type /stringtype eq + { stringwidth } { + currentfont /Encoding get exch 1 exch put (\001) + stringwidth + } + ifelse + exch 3 1 roll add 3 1 roll add exch + } forall + } + + # font ISOEncode font + # + # This procedure changes the encoding of a font from the default + # Postscript encoding to current system encoding. It's typically invoked + # just before invoking "setfont". The body of this procedure comes from + # Section 5.6.1 of the Postscript book. + ps function ISOEncode { + dup length dict begin + {1 index /FID ne {def} {pop pop} ifelse} forall + /Encoding CurrentEncoding def + currentdict + end + % I'm not sure why it's necessary to use "definefont" on this new + % font, but it seems to be important; just use the name "Temporary" + % for the font. + /Temporary exch definefont + } + + # StrokeClip + # + # This procedure converts the current path into a clip area under the + # assumption of stroking. It's a bit tricky because some Postscript + # interpreters get errors during strokepath for dashed lines. If this + # happens then turn off dashes and try again. + ps function StrokeClip { + {strokepath} stopped { + (This Postscript printer gets limitcheck overflows when) = + (stippling dashed lines; lines will be printed solid instead.) = + [] 0 setdash strokepath} if + clip + } + + # desiredSize EvenPixels closestSize + # + # The procedure below is used for stippling. Given the optimal size of a + # dot in a stipple pattern in the current user coordinate system, compute + # the closest size that is an exact multiple of the device's pixel + # size. This allows stipple patterns to be displayed without aliasing + # effects. + ps function EvenPixels { + % Compute exact number of device pixels per stipple dot. + dup 0 matrix currentmatrix dtransform + dup mul exch dup mul add sqrt + % Round to an integer, make sure the number is at least 1, and + % compute user coord distance corresponding to this. + dup round dup 1 lt {pop 1} if + exch div mul + } + + # width height string StippleFill -- + # + # Given a path already set up and a clipping region generated from it, + # this procedure will fill the clipping region with a stipple pattern. + # "String" contains a proper image description of the stipple pattern and + # "width" and "height" give its dimensions. Each stipple dot is assumed to + # be about one unit across in the current user coordinate system. This + # procedure trashes the graphics state. + ps function StippleFill { + % The following code is needed to work around a NeWSprint bug. + /tmpstip 1 index def + % Change the scaling so that one user unit in user coordinates + % corresponds to the size of one stipple dot. + 1 EvenPixels dup scale + % Compute the bounding box occupied by the path (which is now the + % clipping region), and round the lower coordinates down to the + % nearest starting point for the stipple pattern. Be careful about + % negative numbers, since the rounding works differently on them. + pathbbox + 4 2 roll + 5 index div dup 0 lt {1 sub} if cvi 5 index mul 4 1 roll + 6 index div dup 0 lt {1 sub} if cvi 6 index mul 3 2 roll + % Stack now: width height string y1 y2 x1 x2 + % Below is a doubly-nested for loop to iterate across this area + % in units of the stipple pattern size, going up columns then + % across rows, blasting out a stipple-pattern-sized rectangle at + % each position + 6 index exch { + 2 index 5 index 3 index { + % Stack now: width height string y1 y2 x y + gsave + 1 index exch translate + 5 index 5 index true matrix tmpstip imagemask + grestore + } for + pop + } for + pop pop pop pop pop + } + + # -- AdjustColor -- + # + # Given a color value already set for output by the caller, adjusts that + # value to a grayscale or mono value if requested by the CL variable. + ps function AdjustColor { + CL 2 lt { + currentgray + CL 0 eq { + .5 lt {0} {1} ifelse + } if + setgray + } if + } + + # x y strings spacing xoffset yoffset justify stipple DrawText -- + # + # This procedure does all of the real work of drawing text. The color and + # font must already have been set by the caller, and the following + # arguments must be on the stack: + # + # x, y - Coordinates at which to draw text. + # strings - An array of strings, one for each line of the text item, in + # order from top to bottom. + # spacing - Spacing between lines. + # xoffset - Horizontal offset for text bbox relative to x and y: 0 for + # nw/w/sw anchor, -0.5 for n/center/s, and -1.0 for ne/e/se. + # yoffset - Vertical offset for text bbox relative to x and y: 0 for + # nw/n/ne anchor, +0.5 for w/center/e, and +1.0 for sw/s/se. + # justify - 0 for left justification, 0.5 for center, 1 for right justify. + # stipple - Boolean value indicating whether or not text is to be drawn in + # stippled fashion. If text is stippled, function StippleText + # must have been defined to call StippleFill in the right way. + # + # Also, when this procedure is invoked, the color and font must already + # have been set for the text. + ps function DrawText { + /stipple exch def + /justify exch def + /yoffset exch def + /xoffset exch def + /spacing exch def + /strings exch def + % First scan through all of the text to find the widest line. + /lineLength 0 def + strings { + cstringwidth pop + dup lineLength gt {/lineLength exch def} {pop} ifelse + newpath + } forall + % Compute the baseline offset and the actual font height. + 0 0 moveto baselineSampler false charpath + pathbbox dup /baseline exch def + exch pop exch sub /height exch def pop + newpath + % Translate and rotate coordinates first so that the origin is at + % the upper-left corner of the text's bounding box. Remember that + % angle for rotating, and x and y for positioning are still on the + % stack. + translate + rotate + lineLength xoffset mul + strings length 1 sub spacing mul height add yoffset mul translate + % Now use the baseline and justification information to translate + % so that the origin is at the baseline and positioning point for + % the first line of text. + justify lineLength mul baseline neg translate + % Iterate over each of the lines to output it. For each line, + % compute its width again so it can be properly justified, then + % display it. + strings { + dup cstringwidth pop + justify neg mul 0 moveto + stipple { + % The text is stippled, so turn it into a path and print + % by calling StippledText, which in turn calls + % StippleFill. Unfortunately, many Postscript interpreters + % will get overflow errors if we try to do the whole + % string at once, so do it a character at a time. + gsave + /char (X) def + { + dup type /stringtype eq { + % This segment is a string. + { + char 0 3 -1 roll put + currentpoint + gsave + char true charpath clip StippleText + grestore + char stringwidth translate + moveto + } forall + } { + % This segment is glyph name + % Temporary override + currentfont /Encoding get exch 1 exch put + currentpoint + gsave (\001) true charpath clip StippleText + grestore + (\001) stringwidth translate + moveto + } ifelse + } forall + grestore + } {cstringshow} ifelse + 0 spacing neg translate + } forall + } + + # Define the "TkPhoto" function variants, which are modified versions + # of the original "transparentimage" function posted by ian@five-d.com + # (Ian Kemmish) to comp.lang.postscript. For a monochrome colorLevel + # this is a slightly different version that uses the imagemask command + # instead of image. + + ps function TkPhotoColor { + gsave + 32 dict begin + /tinteger exch def + /transparent 1 string def + transparent 0 tinteger put + /olddict exch def + olddict /DataSource get dup type /filetype ne { + olddict /DataSource 3 -1 roll + 0 () /SubFileDecode filter put + } { + pop + } ifelse + /newdict olddict maxlength dict def + olddict newdict copy pop + /w newdict /Width get def + /crpp newdict /Decode get length 2 idiv def + /str w string def + /pix w crpp mul string def + /substrlen 2 w log 2 log div floor exp cvi def + /substrs [ { + substrlen string + 0 1 substrlen 1 sub { + 1 index exch tinteger put + } for + /substrlen substrlen 2 idiv def + substrlen 0 eq {exit} if + } loop ] def + /h newdict /Height get def + 1 w div 1 h div matrix scale + olddict /ImageMatrix get exch matrix concatmatrix + matrix invertmatrix concat + newdict /Height 1 put + newdict /DataSource pix put + /mat [w 0 0 h 0 0] def + newdict /ImageMatrix mat put + 0 1 h 1 sub { + mat 5 3 -1 roll neg put + olddict /DataSource get str readstring pop pop + /tail str def + /x 0 def + olddict /DataSource get pix readstring pop pop + { + tail transparent search dup /done exch not def + {exch pop exch pop} if + /w1 exch length def + w1 0 ne { + newdict /DataSource + pix x crpp mul w1 crpp mul getinterval put + newdict /Width w1 put + mat 4 x neg put + /x x w1 add def + newdict image + /tail tail w1 tail length w1 sub getinterval def + } if + done {exit} if + tail substrs { + anchorsearch {pop} if + } forall + /tail exch def + tail length 0 eq {exit} if + /x w tail length sub def + } loop + } for + end + grestore + } + ps function TkPhotoMono { + gsave + 32 dict begin + /dummyInteger exch def + /olddict exch def + olddict /DataSource get dup type /filetype ne { + olddict /DataSource 3 -1 roll + 0 () /SubFileDecode filter put + } { + pop + } ifelse + /newdict olddict maxlength dict def + olddict newdict copy pop + /w newdict /Width get def + /pix w 7 add 8 idiv string def + /h newdict /Height get def + 1 w div 1 h div matrix scale + olddict /ImageMatrix get exch matrix concatmatrix + matrix invertmatrix concat + newdict /Height 1 put + newdict /DataSource pix put + /mat [w 0 0 h 0 0] def + newdict /ImageMatrix mat put + 0 1 h 1 sub { + mat 5 3 -1 roll neg put + 0.000 0.000 0.000 setrgbcolor + olddict /DataSource get pix readstring pop pop + newdict /DataSource pix put + newdict imagemask + 1.000 1.000 1.000 setrgbcolor + olddict /DataSource get pix readstring pop pop + newdict /DataSource pix put + newdict imagemask + } for + end + grestore + } + + ps literal %%EndProlog +} + +proc tk::ensure_psenc_is_loaded {} { +} diff --git a/env/tcl/tk8.6/msgbox.tcl b/env/tcl/tk8.6/msgbox.tcl new file mode 100644 index 0000000..98603af --- /dev/null +++ b/env/tcl/tk8.6/msgbox.tcl @@ -0,0 +1,430 @@ +# msgbox.tcl -- +# +# Implements messageboxes for platforms that do not have native +# messagebox support. +# +# Copyright (c) 1994-1997 Sun Microsystems, Inc. +# +# See the file "license.terms" for information on usage and redistribution +# of this file, and for a DISCLAIMER OF ALL WARRANTIES. +# + +# Ensure existence of ::tk::dialog namespace +# +namespace eval ::tk::dialog {} + +image create bitmap ::tk::dialog::b1 -foreground black \ +-data "#define b1_width 32\n#define b1_height 32 +static unsigned char q1_bits[] = { + 0x00, 0xf8, 0x1f, 0x00, 0x00, 0x07, 0xe0, 0x00, 0xc0, 0x00, 0x00, 0x03, + 0x20, 0x00, 0x00, 0x04, 0x10, 0x00, 0x00, 0x08, 0x08, 0x00, 0x00, 0x10, + 0x04, 0x00, 0x00, 0x20, 0x02, 0x00, 0x00, 0x40, 0x02, 0x00, 0x00, 0x40, + 0x01, 0x00, 0x00, 0x80, 0x01, 0x00, 0x00, 0x80, 0x01, 0x00, 0x00, 0x80, + 0x01, 0x00, 0x00, 0x80, 0x01, 0x00, 0x00, 0x80, 0x01, 0x00, 0x00, 0x80, + 0x01, 0x00, 0x00, 0x80, 0x02, 0x00, 0x00, 0x40, 0x02, 0x00, 0x00, 0x40, + 0x04, 0x00, 0x00, 0x20, 0x08, 0x00, 0x00, 0x10, 0x10, 0x00, 0x00, 0x08, + 0x60, 0x00, 0x00, 0x04, 0x80, 0x03, 0x80, 0x03, 0x00, 0x0c, 0x78, 0x00, + 0x00, 0x30, 0x04, 0x00, 0x00, 0x40, 0x04, 0x00, 0x00, 0x40, 0x04, 0x00, + 0x00, 0x80, 0x04, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x06, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};" +image create bitmap ::tk::dialog::b2 -foreground white \ +-data "#define b2_width 32\n#define b2_height 32 +static unsigned char b2_bits[] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x1f, 0x00, 0x00, 0xff, 0xff, 0x00, + 0xc0, 0xff, 0xff, 0x03, 0xe0, 0xff, 0xff, 0x07, 0xf0, 0xff, 0xff, 0x0f, + 0xf8, 0xff, 0xff, 0x1f, 0xfc, 0xff, 0xff, 0x3f, 0xfc, 0xff, 0xff, 0x3f, + 0xfe, 0xff, 0xff, 0x7f, 0xfe, 0xff, 0xff, 0x7f, 0xfe, 0xff, 0xff, 0x7f, + 0xfe, 0xff, 0xff, 0x7f, 0xfe, 0xff, 0xff, 0x7f, 0xfe, 0xff, 0xff, 0x7f, + 0xfe, 0xff, 0xff, 0x7f, 0xfc, 0xff, 0xff, 0x3f, 0xfc, 0xff, 0xff, 0x3f, + 0xf8, 0xff, 0xff, 0x1f, 0xf0, 0xff, 0xff, 0x0f, 0xe0, 0xff, 0xff, 0x07, + 0x80, 0xff, 0xff, 0x03, 0x00, 0xfc, 0x7f, 0x00, 0x00, 0xf0, 0x07, 0x00, + 0x00, 0xc0, 0x03, 0x00, 0x00, 0x80, 0x03, 0x00, 0x00, 0x80, 0x03, 0x00, + 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};" +image create bitmap ::tk::dialog::q -foreground blue \ +-data "#define q_width 32\n#define q_height 32 +static unsigned char q_bits[] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x07, 0x00, + 0x00, 0x10, 0x0f, 0x00, 0x00, 0x18, 0x1e, 0x00, 0x00, 0x38, 0x1e, 0x00, + 0x00, 0x38, 0x1e, 0x00, 0x00, 0x10, 0x0f, 0x00, 0x00, 0x80, 0x07, 0x00, + 0x00, 0xc0, 0x01, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, 0xe0, 0x01, 0x00, + 0x00, 0xe0, 0x01, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};" +image create bitmap ::tk::dialog::i -foreground blue \ +-data "#define i_width 32\n#define i_height 32 +static unsigned char i_bits[] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xe0, 0x01, 0x00, 0x00, 0xf0, 0x03, 0x00, 0x00, 0xf0, 0x03, 0x00, + 0x00, 0xe0, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xf8, 0x03, 0x00, 0x00, 0xf0, 0x03, 0x00, 0x00, 0xe0, 0x03, 0x00, + 0x00, 0xe0, 0x03, 0x00, 0x00, 0xe0, 0x03, 0x00, 0x00, 0xe0, 0x03, 0x00, + 0x00, 0xe0, 0x03, 0x00, 0x00, 0xe0, 0x03, 0x00, 0x00, 0xf0, 0x07, 0x00, + 0x00, 0xf8, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};" +image create bitmap ::tk::dialog::w1 -foreground black \ +-data "#define w1_width 32\n#define w1_height 32 +static unsigned char w1_bits[] = { + 0x00, 0x80, 0x01, 0x00, 0x00, 0x40, 0x02, 0x00, 0x00, 0x20, 0x04, 0x00, + 0x00, 0x10, 0x04, 0x00, 0x00, 0x10, 0x08, 0x00, 0x00, 0x08, 0x08, 0x00, + 0x00, 0x08, 0x10, 0x00, 0x00, 0x04, 0x10, 0x00, 0x00, 0x04, 0x20, 0x00, + 0x00, 0x02, 0x20, 0x00, 0x00, 0x02, 0x40, 0x00, 0x00, 0x01, 0x40, 0x00, + 0x00, 0x01, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x00, 0x01, + 0x40, 0x00, 0x00, 0x01, 0x40, 0x00, 0x00, 0x02, 0x20, 0x00, 0x00, 0x02, + 0x20, 0x00, 0x00, 0x04, 0x10, 0x00, 0x00, 0x04, 0x10, 0x00, 0x00, 0x08, + 0x08, 0x00, 0x00, 0x08, 0x08, 0x00, 0x00, 0x10, 0x04, 0x00, 0x00, 0x10, + 0x04, 0x00, 0x00, 0x20, 0x02, 0x00, 0x00, 0x20, 0x01, 0x00, 0x00, 0x40, + 0x01, 0x00, 0x00, 0x40, 0x01, 0x00, 0x00, 0x40, 0x02, 0x00, 0x00, 0x20, + 0xfc, 0xff, 0xff, 0x1f, 0x00, 0x00, 0x00, 0x00};" +image create bitmap ::tk::dialog::w2 -foreground yellow \ +-data "#define w2_width 32\n#define w2_height 32 +static unsigned char w2_bits[] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x01, 0x00, 0x00, 0xc0, 0x03, 0x00, + 0x00, 0xe0, 0x03, 0x00, 0x00, 0xe0, 0x07, 0x00, 0x00, 0xf0, 0x07, 0x00, + 0x00, 0xf0, 0x0f, 0x00, 0x00, 0xf8, 0x0f, 0x00, 0x00, 0xf8, 0x1f, 0x00, + 0x00, 0xfc, 0x1f, 0x00, 0x00, 0xfc, 0x3f, 0x00, 0x00, 0xfe, 0x3f, 0x00, + 0x00, 0xfe, 0x7f, 0x00, 0x00, 0xff, 0x7f, 0x00, 0x00, 0xff, 0xff, 0x00, + 0x80, 0xff, 0xff, 0x00, 0x80, 0xff, 0xff, 0x01, 0xc0, 0xff, 0xff, 0x01, + 0xc0, 0xff, 0xff, 0x03, 0xe0, 0xff, 0xff, 0x03, 0xe0, 0xff, 0xff, 0x07, + 0xf0, 0xff, 0xff, 0x07, 0xf0, 0xff, 0xff, 0x0f, 0xf8, 0xff, 0xff, 0x0f, + 0xf8, 0xff, 0xff, 0x1f, 0xfc, 0xff, 0xff, 0x1f, 0xfe, 0xff, 0xff, 0x3f, + 0xfe, 0xff, 0xff, 0x3f, 0xfe, 0xff, 0xff, 0x3f, 0xfc, 0xff, 0xff, 0x1f, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};" +image create bitmap ::tk::dialog::w3 -foreground black \ +-data "#define w3_width 32\n#define w3_height 32 +static unsigned char w3_bits[] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xc0, 0x03, 0x00, 0x00, 0xe0, 0x07, 0x00, 0x00, 0xe0, 0x07, 0x00, + 0x00, 0xe0, 0x07, 0x00, 0x00, 0xe0, 0x07, 0x00, 0x00, 0xe0, 0x07, 0x00, + 0x00, 0xc0, 0x03, 0x00, 0x00, 0xc0, 0x03, 0x00, 0x00, 0xc0, 0x03, 0x00, + 0x00, 0x80, 0x01, 0x00, 0x00, 0x80, 0x01, 0x00, 0x00, 0x80, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x01, 0x00, 0x00, 0xc0, 0x03, 0x00, + 0x00, 0xc0, 0x03, 0x00, 0x00, 0x80, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};" + +# ::tk::MessageBox -- +# +# Pops up a messagebox with an application-supplied message with +# an icon and a list of buttons. This procedure will be called +# by tk_messageBox if the platform does not have native +# messagebox support, or if the particular type of messagebox is +# not supported natively. +# +# Color icons are used on Unix displays that have a color +# depth of 4 or more and $tk_strictMotif is not on. +# +# This procedure is a private procedure shouldn't be called +# directly. Call tk_messageBox instead. +# +# See the user documentation for details on what tk_messageBox does. +# +proc ::tk::MessageBox {args} { + global tk_strictMotif + variable ::tk::Priv + + set w ::tk::PrivMsgBox + upvar $w data + + # + # The default value of the title is space (" ") not the empty string + # because for some window managers, a + # wm title .foo "" + # causes the window title to be "foo" instead of the empty string. + # + set specs { + {-default "" "" ""} + {-detail "" "" ""} + {-icon "" "" "info"} + {-message "" "" ""} + {-parent "" "" .} + {-title "" "" " "} + {-type "" "" "ok"} + } + + tclParseConfigSpec $w $specs "" $args + + if {$data(-icon) ni {info warning error question}} { + return -code error -errorcode [list TK LOOKUP ICON $data(-icon)] \ + "bad -icon value \"$data(-icon)\": must be error, info, question, or warning" + } + set windowingsystem [tk windowingsystem] + if {$windowingsystem eq "aqua"} { + switch -- $data(-icon) { + "error" {set data(-icon) "stop"} + "warning" {set data(-icon) "caution"} + "info" {set data(-icon) "note"} + } + option add *Dialog*background systemDialogBackgroundActive widgetDefault + option add *Dialog*Button.highlightBackground \ + systemDialogBackgroundActive widgetDefault + } + + if {![winfo exists $data(-parent)]} { + return -code error -errorcode [list TK LOOKUP WINDOW $data(-parent)] \ + "bad window path name \"$data(-parent)\"" + } + + switch -- $data(-type) { + abortretryignore { + set names [list abort retry ignore] + set labels [list &Abort &Retry &Ignore] + set cancel abort + } + ok { + set names [list ok] + set labels {&OK} + set cancel ok + } + okcancel { + set names [list ok cancel] + set labels [list &OK &Cancel] + set cancel cancel + } + retrycancel { + set names [list retry cancel] + set labels [list &Retry &Cancel] + set cancel cancel + } + yesno { + set names [list yes no] + set labels [list &Yes &No] + set cancel no + } + yesnocancel { + set names [list yes no cancel] + set labels [list &Yes &No &Cancel] + set cancel cancel + } + default { + return -code error -errorcode [list TK LOOKUP DLG_TYPE $data(-type)] \ + "bad -type value \"$data(-type)\": must be\ + abortretryignore, ok, okcancel, retrycancel,\ + yesno, or yesnocancel" + } + } + + set buttons {} + foreach name $names lab $labels { + lappend buttons [list $name -text [mc $lab]] + } + + # If no default button was specified, the default default is the + # first button (Bug: 2218). + + if {$data(-default) eq ""} { + set data(-default) [lindex [lindex $buttons 0] 0] + } + + set valid 0 + foreach btn $buttons { + if {[lindex $btn 0] eq $data(-default)} { + set valid 1 + break + } + } + if {!$valid} { + return -code error -errorcode {TK MSGBOX DEFAULT} \ + "bad -default value \"$data(-default)\": must be\ + abort, retry, ignore, ok, cancel, no, or yes" + } + + # 2. Set the dialog to be a child window of $parent + # + # + if {$data(-parent) ne "."} { + set w $data(-parent).__tk__messagebox + } else { + set w .__tk__messagebox + } + + # There is only one background colour for the whole dialog + set bg [ttk::style lookup . -background] + + # 3. Create the top-level window and divide it into top + # and bottom parts. + + catch {destroy $w} + toplevel $w -class Dialog -bg $bg + wm title $w $data(-title) + wm iconname $w Dialog + wm protocol $w WM_DELETE_WINDOW [list $w.$cancel invoke] + + # Message boxes should be transient with respect to their parent so that + # they always stay on top of the parent window. But some window managers + # will simply create the child window as withdrawn if the parent is not + # viewable (because it is withdrawn or iconified). This is not good for + # "grab"bed windows. So only make the message box transient if the parent + # is viewable. + # + if {[winfo viewable [winfo toplevel $data(-parent)]] } { + wm transient $w $data(-parent) + } + + if {$windowingsystem eq "aqua"} { + ::tk::unsupported::MacWindowStyle style $w moveableModal {} + } elseif {$windowingsystem eq "x11"} { + wm attributes $w -type dialog + } + + ttk::frame $w.bot + grid anchor $w.bot center + pack $w.bot -side bottom -fill both + ttk::frame $w.top + pack $w.top -side top -fill both -expand 1 + + # 4. Fill the top part with bitmap, message and detail (use the + # option database for -wraplength and -font so that they can be + # overridden by the caller). + + option add *Dialog.msg.wrapLength 3i widgetDefault + option add *Dialog.dtl.wrapLength 3i widgetDefault + option add *Dialog.msg.font TkCaptionFont widgetDefault + option add *Dialog.dtl.font TkDefaultFont widgetDefault + + ttk::label $w.msg -anchor nw -justify left -text $data(-message) + if {$data(-detail) ne ""} { + ttk::label $w.dtl -anchor nw -justify left -text $data(-detail) + } + if {$data(-icon) ne ""} { + if {([winfo depth $w] < 4) || $tk_strictMotif} { + # ttk::label has no -bitmap option + label $w.bitmap -bitmap $data(-icon) -background $bg + } else { + switch $data(-icon) { + error { + ttk::label $w.bitmap -image ::tk::icons::error + } + info { + ttk::label $w.bitmap -image ::tk::icons::information + } + question { + ttk::label $w.bitmap -image ::tk::icons::question + } + default { + ttk::label $w.bitmap -image ::tk::icons::warning + } + } + } + } + grid $w.bitmap $w.msg -in $w.top -sticky news -padx 2m -pady 2m + grid configure $w.bitmap -sticky nw + grid columnconfigure $w.top 1 -weight 1 + if {$data(-detail) ne ""} { + grid ^ $w.dtl -in $w.top -sticky news -padx 2m -pady {0 2m} + grid rowconfigure $w.top 1 -weight 1 + } else { + grid rowconfigure $w.top 0 -weight 1 + } + + # 5. Create a row of buttons at the bottom of the dialog. + + set i 0 + foreach but $buttons { + set name [lindex $but 0] + set opts [lrange $but 1 end] + if {![llength $opts]} { + # Capitalize the first letter of $name + set capName [string toupper $name 0] + set opts [list -text $capName] + } + + eval [list tk::AmpWidget ttk::button $w.$name] $opts \ + [list -command [list set tk::Priv(button) $name]] + + if {$name eq $data(-default)} { + $w.$name configure -default active + } else { + $w.$name configure -default normal + } + grid $w.$name -in $w.bot -row 0 -column $i -padx 3m -pady 2m -sticky ew + grid columnconfigure $w.bot $i -uniform buttons + # We boost the size of some Mac buttons for l&f + if {$windowingsystem eq "aqua"} { + set tmp [string tolower $name] + if {$tmp eq "ok" || $tmp eq "cancel" || $tmp eq "yes" || + $tmp eq "no" || $tmp eq "abort" || $tmp eq "retry" || + $tmp eq "ignore"} { + grid columnconfigure $w.bot $i -minsize 90 + } + grid configure $w.$name -pady 7 + } + incr i + + # create the binding for the key accelerator, based on the underline + # + # set underIdx [$w.$name cget -under] + # if {$underIdx >= 0} { + # set key [string index [$w.$name cget -text] $underIdx] + # bind $w [list $w.$name invoke] + # bind $w [list $w.$name invoke] + # } + } + bind $w [list ::tk::AltKeyInDialog $w %A] + + if {$data(-default) ne ""} { + bind $w { + if {[winfo class %W] in "Button TButton"} { + %W configure -default active + } + } + bind $w { + if {[winfo class %W] in "Button TButton"} { + %W configure -default normal + } + } + } + + # 6. Create bindings for , and on the dialog + + bind $w { + if {[winfo class %W] in "Button TButton"} { + %W invoke + } + } + + # Invoke the designated cancelling operation + bind $w [list $w.$cancel invoke] + + # At the buttons have vanished, so must do this directly. + bind $w.msg [list set tk::Priv(button) $cancel] + + # 7. Withdraw the window, then update all the geometry information + # so we know how big it wants to be, then center the window in the + # display (Motif style) and de-iconify it. + + ::tk::PlaceWindow $w widget $data(-parent) + + # 8. Set a grab and claim the focus too. + + if {$data(-default) ne ""} { + set focus $w.$data(-default) + } else { + set focus $w + } + ::tk::SetFocusGrab $w $focus + + # 9. Wait for the user to respond, then restore the focus and + # return the index of the selected button. Restore the focus + # before deleting the window, since otherwise the window manager + # may take the focus away so we can't redirect it. Finally, + # restore any grab that was in effect. + + vwait ::tk::Priv(button) + # Copy the result now so any that happens won't cause + # trouble + set result $Priv(button) + + ::tk::RestoreFocusGrab $w $focus + + return $result +} diff --git a/env/tcl/tk8.6/msgs/cs.msg b/env/tcl/tk8.6/msgs/cs.msg new file mode 100644 index 0000000..d6be730 --- /dev/null +++ b/env/tcl/tk8.6/msgs/cs.msg @@ -0,0 +1,77 @@ +namespace eval ::tk { + ::msgcat::mcset cs "&Abort" "&P\u0159eru\u0161it" + ::msgcat::mcset cs "&About..." "&O programu..." + ::msgcat::mcset cs "All Files" "V\u0161echny soubory" + ::msgcat::mcset cs "Application Error" "Chyba programu" + ::msgcat::mcset cs "Bold Italic" + ::msgcat::mcset cs "&Blue" "&Modr\341" + ::msgcat::mcset cs "Cancel" "Zru\u0161it" + ::msgcat::mcset cs "&Cancel" "&Zru\u0161it" + ::msgcat::mcset cs "Cannot change to the directory \"%1\$s\".\nPermission denied." "Nemohu zm\u011bnit atku\341ln\355 adres\341\u0159 na \"%1\$s\".\nP\u0159\355stup odm\355tnut." + ::msgcat::mcset cs "Choose Directory" "V\375b\u011br adres\341\u0159e" + ::msgcat::mcset cs "Cl&ear" "Sma&zat" + ::msgcat::mcset cs "&Clear Console" "&Smazat konzolu" + ::msgcat::mcset cs "Color" "Barva" + ::msgcat::mcset cs "Console" "Konzole" + ::msgcat::mcset cs "&Copy" "&Kop\355rovat" + ::msgcat::mcset cs "Cu&t" "V&y\u0159\355znout" + ::msgcat::mcset cs "&Delete" "&Smazat" + ::msgcat::mcset cs "Details >>" "Detaily >>" + ::msgcat::mcset cs "Directory \"%1\$s\" does not exist." "Adres\341\u0159 \"%1\$s\" neexistuje." + ::msgcat::mcset cs "&Directory:" "&Adres\341\u0159:" + ::msgcat::mcset cs "&Edit" "&\332pravy" + ::msgcat::mcset cs "Error: %1\$s" "Chyba: %1\$s" + ::msgcat::mcset cs "E&xit" "&Konec" + ::msgcat::mcset cs "&File" "&Soubor" + ::msgcat::mcset cs "File \"%1\$s\" already exists.\nDo you want to overwrite it?" "Soubor \"%1\$s\" ji\u017e existuje.\nChcete jej p\u0159epsat?" + ::msgcat::mcset cs "File \"%1\$s\" already exists.\n\n" "Soubor \"%1\$s\" ji\u017e existuje.\n\n" + ::msgcat::mcset cs "File \"%1\$s\" does not exist." "Soubor \"%1\$s\" neexistuje." + ::msgcat::mcset cs "File &name:" "&Jm\351no souboru:" + ::msgcat::mcset cs "File &names:" "&Jm\351na soubor\u016f:" + ::msgcat::mcset cs "Files of &type:" "&Typy soubor\u016f:" + ::msgcat::mcset cs "Fi&les:" "Sou&bory:" + ::msgcat::mcset cs "&Filter" "&Filtr" + ::msgcat::mcset cs "Fil&ter:" "Fil&tr:" + ::msgcat::mcset cs "Font st&yle:" + ::msgcat::mcset cs "&Green" "Ze&len\341" + ::msgcat::mcset cs "&Help" "&N\341pov\u011bda" + ::msgcat::mcset cs "Hi" "Ahoj" + ::msgcat::mcset cs "&Hide Console" "&Schovat Konzolu" + ::msgcat::mcset cs "&Ignore" "&Ignorovat" + ::msgcat::mcset cs "Invalid file name \"%1\$s\"." "\u0160patn\351 jm\351no souboru \"%1\$s\"." + ::msgcat::mcset cs "Log Files" "Log soubory" + ::msgcat::mcset cs "&No" "&Ne" + ::msgcat::mcset cs "&OK" + ::msgcat::mcset cs "OK" + ::msgcat::mcset cs "Ok" + ::msgcat::mcset cs "Open" "Otev\u0159\355t" + ::msgcat::mcset cs "&Open" "&Otev\u0159\355t" + ::msgcat::mcset cs "Open Multiple Files" "Otev\u0159\355t v\355ce soubor\u016f" + ::msgcat::mcset cs "P&aste" "&Vlo\u017eit" + ::msgcat::mcset cs "&Quit" "&Ukon\u010dit" + ::msgcat::mcset cs "&Red" "\u010ce&rven\341" + ::msgcat::mcset cs "Replace existing file?" "Nahradit st\341vaj\355c\355 soubor?" + ::msgcat::mcset cs "&Retry" "Z&novu" + ::msgcat::mcset cs "&Save" "&Ulo\u017eit" + ::msgcat::mcset cs "Save As" "Ulo\u017eit jako" + ::msgcat::mcset cs "Save To Log" "Ulo\u017eit do logu" + ::msgcat::mcset cs "Select Log File" "Vybrat log soubor" + ::msgcat::mcset cs "Select a file to source" "Vybrat soubor k nahr\341n\355" + ::msgcat::mcset cs "&Selection:" "&V\375b\u011br:" + ::msgcat::mcset cs "Skip Messages" "P\u0159esko\u010dit zpr\341vy" + ::msgcat::mcset cs "&Source..." "&Zdroj..." + ::msgcat::mcset cs "Tcl Scripts" "Tcl skripty" + ::msgcat::mcset cs "Tcl for Windows" "Tcl pro Windows" + ::msgcat::mcset cs "Text Files" "Textov\351 soubory" + ::msgcat::mcset cs "abort" "p\u0159eru\u0161it" + ::msgcat::mcset cs "blue" "modr\341" + ::msgcat::mcset cs "cancel" "zru\u0161it" + ::msgcat::mcset cs "extension" "p\u0159\355pona" + ::msgcat::mcset cs "extensions" "p\u0159\355pony" + ::msgcat::mcset cs "green" "zelen\341" + ::msgcat::mcset cs "ignore" "ignorovat" + ::msgcat::mcset cs "ok" + ::msgcat::mcset cs "red" "\u010derven\341" + ::msgcat::mcset cs "retry" "znovu" + ::msgcat::mcset cs "yes" "ano" +} diff --git a/env/tcl/tk8.6/msgs/da.msg b/env/tcl/tk8.6/msgs/da.msg new file mode 100644 index 0000000..c302c79 --- /dev/null +++ b/env/tcl/tk8.6/msgs/da.msg @@ -0,0 +1,78 @@ +namespace eval ::tk { + ::msgcat::mcset da "&Abort" "&Afbryd" + ::msgcat::mcset da "&About..." "&Om..." + ::msgcat::mcset da "All Files" "Alle filer" + ::msgcat::mcset da "Application Error" "Programfejl" + ::msgcat::mcset da "&Blue" "&Bl\u00E5" + ::msgcat::mcset da "Cancel" "Annuller" + ::msgcat::mcset da "&Cancel" "&Annuller" + ::msgcat::mcset da "Cannot change to the directory \"%1\$s\".\nPermission denied." "Kan ikke skifte til katalog \"%1\$s\".\nIngen rettigheder." + ::msgcat::mcset da "Choose Directory" "V\u00E6lg katalog" + ::msgcat::mcset da "Cl&ear" "&Ryd" + ::msgcat::mcset da "&Clear Console" "&Ryd konsolen" + ::msgcat::mcset da "Color" "Farve" + ::msgcat::mcset da "Console" "Konsol" + ::msgcat::mcset da "&Copy" "&Kopier" + ::msgcat::mcset da "Cu&t" "Kli&p" + ::msgcat::mcset da "&Delete" "&Slet" + ::msgcat::mcset da "Details >>" "Detailer" + ::msgcat::mcset da "Directory \"%1\$s\" does not exist." "Katalog \"%1\$s\" findes ikke." + ::msgcat::mcset da "&Directory:" "&Katalog:" + ::msgcat::mcset da "&Edit" "&Rediger" + ::msgcat::mcset da "Error: %1\$s" "Fejl: %1\$s" + ::msgcat::mcset da "E&xit" "&Afslut" + ::msgcat::mcset da "&File" "&Fil" + ::msgcat::mcset da "File \"%1\$s\" already exists.\nDo you want to overwrite it?" "Filen \"%1\$s\" findes allerede.\nSkal den overskrives?" + ::msgcat::mcset da "File \"%1\$s\" already exists.\n\n" "Filen \"%1\$s\" findes allerede.\n\n" + ::msgcat::mcset da "File \"%1\$s\" does not exist." "Filen \"%1\$s\" findes ikke." + ::msgcat::mcset da "File &name:" "Fil&navn:" + ::msgcat::mcset da "File &names:" "Fil&navne:" + ::msgcat::mcset da "Files of &type:" "Fil&typer:" + ::msgcat::mcset da "Fi&les:" "Fi&ler:" + ::msgcat::mcset da "&Filter" + ::msgcat::mcset da "Fil&ter:" + ::msgcat::mcset da "&Green" "&Gr\u00F8n" + ::msgcat::mcset da "&Help" "&Hj\u00E6lp" + ::msgcat::mcset da "Hi" "Hej" + ::msgcat::mcset da "&Hide Console" "Skjul &konsol" + ::msgcat::mcset da "&Ignore" "&Ignorer" + ::msgcat::mcset da "Invalid file name \"%1\$s\"." "Ugyldig fil navn \"%1\$s\"." + ::msgcat::mcset da "Log Files" "Logfiler" + ::msgcat::mcset da "&No" "&Nej" + ::msgcat::mcset da "&OK" "&O.K." + ::msgcat::mcset da "OK" "O.K." + ::msgcat::mcset da "Ok" + ::msgcat::mcset da "Open" "\u00C5bn" + ::msgcat::mcset da "&Open" "&\u00C5bn" + ::msgcat::mcset da "Open Multiple Files" "\u00C5bn flere filer" + ::msgcat::mcset da "P&aste" "&Inds\u00E6t" + ::msgcat::mcset da "&Quit" "&Afslut" + ::msgcat::mcset da "&Red" "&R\u00F8d" + ::msgcat::mcset da "Replace existing file?" "Erstat eksisterende fil?" + ::msgcat::mcset da "&Retry" "&Gentag" + ::msgcat::mcset da "&Save" "&Gem" + ::msgcat::mcset da "Save As" "Gem som" + ::msgcat::mcset da "Save To Log" "Gem i log" + ::msgcat::mcset da "Select Log File" "V\u00E6lg logfil" + ::msgcat::mcset da "Select a file to source" "V\u00E6lg k\u00F8rbar fil" + ::msgcat::mcset da "&Selection:" "&Udvalg:" + ::msgcat::mcset da "Show &Hidden Directories" "Vis &skjulte kataloger" + ::msgcat::mcset da "Show &Hidden Files and Directories" "Vis &skjulte filer og kataloger" + ::msgcat::mcset da "Skip Messages" "Overspring beskeder" + ::msgcat::mcset da "&Source..." "&K\u00F8r..." + ::msgcat::mcset da "Tcl Scripts" "Tcl-Skripter" + ::msgcat::mcset da "Tcl for Windows" "Tcl for Windows" + ::msgcat::mcset da "Text Files" "Tekstfiler" + ::msgcat::mcset da "&Yes" "&Ja" + ::msgcat::mcset da "abort" "afbryd" + ::msgcat::mcset da "blue" "bl\u00E5" + ::msgcat::mcset da "cancel" "afbryd" + ::msgcat::mcset da "extension" + ::msgcat::mcset da "extensions" + ::msgcat::mcset da "green" "gr\u00F8n" + ::msgcat::mcset da "ignore" "ignorer" + ::msgcat::mcset da "ok" + ::msgcat::mcset da "red" "r\u00F8d" + ::msgcat::mcset da "retry" "gentag" + ::msgcat::mcset da "yes" "ja" +} diff --git a/env/tcl/tk8.6/msgs/de.msg b/env/tcl/tk8.6/msgs/de.msg new file mode 100644 index 0000000..e420f8a --- /dev/null +++ b/env/tcl/tk8.6/msgs/de.msg @@ -0,0 +1,91 @@ +namespace eval ::tk { + ::msgcat::mcset de "&Abort" "&Abbruch" + ::msgcat::mcset de "&About..." "&\u00dcber..." + ::msgcat::mcset de "All Files" "Alle Dateien" + ::msgcat::mcset de "Application Error" "Applikationsfehler" + ::msgcat::mcset de "&Apply" "&Anwenden" + ::msgcat::mcset de "Bold" "Fett" + ::msgcat::mcset de "Bold Italic" "Fett kursiv" + ::msgcat::mcset de "&Blue" "&Blau" + ::msgcat::mcset de "Cancel" "Abbruch" + ::msgcat::mcset de "&Cancel" "&Abbruch" + ::msgcat::mcset de "Cannot change to the directory \"%1\$s\".\nPermission denied." "Kann nicht in das Verzeichnis \"%1\$s\" wechseln.\nKeine Rechte vorhanden." + ::msgcat::mcset de "Choose Directory" "W\u00e4hle Verzeichnis" + ::msgcat::mcset de "Cl&ear" "&R\u00fccksetzen" + ::msgcat::mcset de "&Clear Console" "&Konsole l\u00f6schen" + ::msgcat::mcset de "Color" "Farbe" + ::msgcat::mcset de "Console" "Konsole" + ::msgcat::mcset de "&Copy" "&Kopieren" + ::msgcat::mcset de "Cu&t" "Aus&schneiden" + ::msgcat::mcset de "&Delete" "&L\u00f6schen" + ::msgcat::mcset de "Details >>" + ::msgcat::mcset de "Directory \"%1\$s\" does not exist." "Das Verzeichnis \"%1\$s\" existiert nicht." + ::msgcat::mcset de "&Directory:" "&Verzeichnis:" + ::msgcat::mcset de "&Edit" "&Bearbeiten" + ::msgcat::mcset de "Effects" "Effekte" + ::msgcat::mcset de "Error: %1\$s" "Fehler: %1\$s" + ::msgcat::mcset de "E&xit" "&Ende" + ::msgcat::mcset de "&File" "&Datei" + ::msgcat::mcset de "File \"%1\$s\" already exists.\nDo you want to overwrite it?" "Die Datei \"%1\$s\" ist bereits vorhanden.\nWollen sie diese Datei \u00fcberschreiben ?" + ::msgcat::mcset de "File \"%1\$s\" already exists.\n\n" "Die Datei \"%1\$s\" ist bereits vorhanden.\n\n" + ::msgcat::mcset de "File \"%1\$s\" does not exist." "Die Datei \"%1\$s\" existiert nicht." + ::msgcat::mcset de "File &name:" "Datei&name:" + ::msgcat::mcset de "File &names:" "Datei&namen:" + ::msgcat::mcset de "Files of &type:" "Dateien des &Typs:" + ::msgcat::mcset de "Fi&les:" "Dat&eien:" + ::msgcat::mcset de "&Filter" + ::msgcat::mcset de "Fil&ter:" + ::msgcat::mcset de "Font" "Schriftart" + ::msgcat::mcset de "&Font:" "Schriftart:" + ::msgcat::mcset de "Font st&yle:" "Schriftschnitt:" + ::msgcat::mcset de "&Green" "&Gr\u00fcn" + ::msgcat::mcset de "&Help" "&Hilfe" + ::msgcat::mcset de "Hi" "Hallo" + ::msgcat::mcset de "&Hide Console" "&Konsole unsichtbar machen" + ::msgcat::mcset de "&Ignore" "&Ignorieren" + ::msgcat::mcset de "Invalid file name \"%1\$s\"." "Ung\u00fcltiger Dateiname \"%1\$s\"." + ::msgcat::mcset de "Italic" "Kursiv" + ::msgcat::mcset de "Log Files" "Protokolldatei" + ::msgcat::mcset de "&No" "&Nein" + ::msgcat::mcset de "&OK" + ::msgcat::mcset de "OK" + ::msgcat::mcset de "Ok" + ::msgcat::mcset de "Open" "\u00d6ffnen" + ::msgcat::mcset de "&Open" "\u00d6&ffnen" + ::msgcat::mcset de "Open Multiple Files" "Mehrere Dateien \u00F6ffnen" + ::msgcat::mcset de "P&aste" "E&inf\u00fcgen" + ::msgcat::mcset de "&Quit" "&Beenden" + ::msgcat::mcset de "&Red" "&Rot" + ::msgcat::mcset de "Regular" "Standard" + ::msgcat::mcset de "Replace existing file?" "Existierende Datei ersetzen?" + ::msgcat::mcset de "&Retry" "&Wiederholen" + ::msgcat::mcset de "Sample" "Beispiel" + ::msgcat::mcset de "&Save" "&Speichern" + ::msgcat::mcset de "Save As" "Speichern unter" + ::msgcat::mcset de "Save To Log" "In Protokoll speichern" + ::msgcat::mcset de "Select Log File" "Protokolldatei ausw\u00e4hlen" + ::msgcat::mcset de "Select a file to source" "Auszuf\u00fchrende Datei ausw\u00e4hlen" + ::msgcat::mcset de "&Selection:" "Auswah&l:" + ::msgcat::mcset de "&Size:" "Schriftgrad:" + ::msgcat::mcset de "Show &Hidden Directories" "Zeige versteckte Dateien" + ::msgcat::mcset de "Show &Hidden Files and Directories" "Zeige versteckte Dateien und Verzeichnisse" + ::msgcat::mcset de "Skip Messages" "Weitere Nachrichten \u00fcberspringen" + ::msgcat::mcset de "&Source..." "&Ausf\u00fchren..." + ::msgcat::mcset de "Stri&keout" "&Durchgestrichen" + ::msgcat::mcset de "Tcl Scripts" "Tcl-Skripte" + ::msgcat::mcset de "Tcl for Windows" "Tcl f\u00fcr Windows" + ::msgcat::mcset de "Text Files" "Textdateien" + ::msgcat::mcset de "&Underline" "&Unterstrichen" + ::msgcat::mcset de "&Yes" "&Ja" + ::msgcat::mcset de "abort" "abbrechen" + ::msgcat::mcset de "blue" "blau" + ::msgcat::mcset de "cancel" "abbrechen" + ::msgcat::mcset de "extension" "Erweiterung" + ::msgcat::mcset de "extensions" "Erweiterungen" + ::msgcat::mcset de "green" "gr\u00fcn" + ::msgcat::mcset de "ignore" "ignorieren" + ::msgcat::mcset de "ok" + ::msgcat::mcset de "red" "rot" + ::msgcat::mcset de "retry" "wiederholen" + ::msgcat::mcset de "yes" "ja" +} diff --git a/env/tcl/tk8.6/msgs/el.msg b/env/tcl/tk8.6/msgs/el.msg new file mode 100644 index 0000000..2e3f236 --- /dev/null +++ b/env/tcl/tk8.6/msgs/el.msg @@ -0,0 +1,86 @@ +## Messages for the Greek (Hellenic - "el") language. +## Please report any changes/suggestions to: +## petasis@iit.demokritos.gr + +namespace eval ::tk { + ::msgcat::mcset el "&Abort" "\u03a4\u03b5\u03c1\u03bc\u03b1\u03c4\u03b9\u03c3\u03bc\u03cc\u03c2" + ::msgcat::mcset el "About..." "\u03a3\u03c7\u03b5\u03c4\u03b9\u03ba\u03ac..." + ::msgcat::mcset el "All Files" "\u038c\u03bb\u03b1 \u03c4\u03b1 \u0391\u03c1\u03c7\u03b5\u03af\u03b1" + ::msgcat::mcset el "Application Error" "\u039b\u03ac\u03b8\u03bf\u03c2 \u0395\u03c6\u03b1\u03c1\u03bc\u03bf\u03b3\u03ae\u03c2" + ::msgcat::mcset el "&Blue" "\u039c\u03c0\u03bb\u03b5" + ::msgcat::mcset el "&Cancel" "\u0391\u03ba\u03cd\u03c1\u03c9\u03c3\u03b7" + ::msgcat::mcset el \ +"Cannot change to the directory \"%1\$s\".\nPermission denied." \ +"\u0394\u03b5\u03bd \u03b5\u03af\u03bd\u03b1\u03b9 \u03b4\u03c5\u03bd\u03b1\u03c4\u03ae \u03b7 \u03b1\u03bb\u03bb\u03b1\u03b3\u03ae \u03ba\u03b1\u03c4\u03b1\u03bb\u03cc\u03b3\u03bf\u03c5 \u03c3\u03b5 \"%1\$s\".\n\u0397 \u03c0\u03c1\u03cc\u03c3\u03b2\u03b1\u03c3\u03b7 \u03b4\u03b5\u03bd \u03b5\u03c0\u03b9\u03c4\u03c1\u03ad\u03c0\u03b5\u03c4\u03b1\u03b9." + ::msgcat::mcset el "Choose Directory" "\u0395\u03c0\u03b9\u03bb\u03bf\u03b3\u03ae \u039a\u03b1\u03c4\u03b1\u03bb\u03cc\u03b3\u03bf\u03c5" + ::msgcat::mcset el "Clear" "\u039a\u03b1\u03b8\u03b1\u03c1\u03b9\u03c3\u03bc\u03cc\u03c2" + ::msgcat::mcset el "Color" "\u03a7\u03c1\u03ce\u03bc\u03b1" + ::msgcat::mcset el "Console" "\u039a\u03bf\u03bd\u03c3\u03cc\u03bb\u03b1" + ::msgcat::mcset el "Copy" "\u0391\u03bd\u03c4\u03b9\u03b3\u03c1\u03b1\u03c6\u03ae" + ::msgcat::mcset el "Cut" "\u0391\u03c0\u03bf\u03ba\u03bf\u03c0\u03ae" + ::msgcat::mcset el "Delete" "\u0394\u03b9\u03b1\u03b3\u03c1\u03b1\u03c6\u03ae" + ::msgcat::mcset el "Details >>" "\u039b\u03b5\u03c0\u03c4\u03bf\u03bc\u03ad\u03c1\u03b5\u03b9\u03b5\u03c2 >>" + ::msgcat::mcset el "Directory \"%1\$s\" does not exist." \ + "\u039f \u03ba\u03b1\u03c4\u03ac\u03bb\u03bf\u03b3\u03bf\u03c2 \"%1\$s\" \u03b4\u03b5\u03bd \u03c5\u03c0\u03ac\u03c1\u03c7\u03b5\u03b9." + ::msgcat::mcset el "&Directory:" "&\u039a\u03b1\u03c4\u03ac\u03bb\u03bf\u03b3\u03bf\u03c2:" + ::msgcat::mcset el "Error: %1\$s" "\u039b\u03ac\u03b8\u03bf\u03c2: %1\$s" + ::msgcat::mcset el "Exit" "\u0388\u03be\u03bf\u03b4\u03bf\u03c2" + ::msgcat::mcset el \ + "File \"%1\$s\" already exists.\nDo you want to overwrite it?" \ + "\u03a4\u03bf \u03b1\u03c1\u03c7\u03b5\u03af\u03bf \"%1\$s\" \u03ae\u03b4\u03b7 \u03c5\u03c0\u03ac\u03c1\u03c7\u03b5\u03b9.\n\u0398\u03ad\u03bb\u03b5\u03c4\u03b5 \u03bd\u03b1 \u03b5\u03c0\u03b9\u03ba\u03b1\u03bb\u03c5\u03c6\u03b8\u03b5\u03af;" + ::msgcat::mcset el "File \"%1\$s\" already exists.\n\n" \ + "\u03a4\u03bf \u03b1\u03c1\u03c7\u03b5\u03af\u03bf \"%1\$s\" \u03ae\u03b4\u03b7 \u03c5\u03c0\u03ac\u03c1\u03c7\u03b5\u03b9.\n\n" + ::msgcat::mcset el "File \"%1\$s\" does not exist." \ + "\u03a4\u03bf \u03b1\u03c1\u03c7\u03b5\u03af\u03bf \"%1\$s\" \u03b4\u03b5\u03bd \u03c5\u03c0\u03ac\u03c1\u03c7\u03b5\u03b9." + ::msgcat::mcset el "File &name:" "\u038c&\u03bd\u03bf\u03bc\u03b1 \u03b1\u03c1\u03c7\u03b5\u03af\u03bf\u03c5:" + ::msgcat::mcset el "File &names:" "\u038c&\u03bd\u03bf\u03bc\u03b1 \u03b1\u03c1\u03c7\u03b5\u03af\u03c9\u03bd:" + ::msgcat::mcset el "Files of &type:" "\u0391\u03c1\u03c7\u03b5\u03af\u03b1 \u03c4\u03bf\u03c5 &\u03c4\u03cd\u03c0\u03bf\u03c5:" + ::msgcat::mcset el "Fi&les:" "\u0391\u03c1\u03c7\u03b5\u03af\u03b1:" + ::msgcat::mcset el "&Filter" "\u03a6\u03af\u03bb\u03c4\u03c1\u03bf" + ::msgcat::mcset el "Fil&ter:" "\u03a6\u03af\u03bb\u03c4\u03c1\u03bf:" + ::msgcat::mcset el "&Green" "\u03a0\u03c1\u03ac\u03c3\u03b9\u03bd\u03bf" + ::msgcat::mcset el "Hi" "\u0393\u03b5\u03b9\u03b1" + ::msgcat::mcset el "Hide Console" "\u0391\u03c0\u03cc\u03ba\u03c1\u03c5\u03c8\u03b7 \u03ba\u03bf\u03bd\u03c3\u03cc\u03bb\u03b1\u03c2" + ::msgcat::mcset el "&Ignore" "\u0391\u03b3\u03bd\u03cc\u03b7\u03c3\u03b7" + ::msgcat::mcset el "Invalid file name \"%1\$s\"." \ + "\u0386\u03ba\u03c5\u03c1\u03bf \u03cc\u03bd\u03bf\u03bc\u03b1 \u03b1\u03c1\u03c7\u03b5\u03af\u03bf\u03c5 \"%1\$s\"." + ::msgcat::mcset el "Log Files" "\u0391\u03c1\u03c7\u03b5\u03af\u03b1 \u039a\u03b1\u03c4\u03b1\u03b3\u03c1\u03b1\u03c6\u03ae\u03c2" + ::msgcat::mcset el "&No" "\u038c\u03c7\u03b9" + ::msgcat::mcset el "&OK" "\u0395\u03bd\u03c4\u03ac\u03be\u03b5\u03b9" + ::msgcat::mcset el "OK" "\u0395\u03bd\u03c4\u03ac\u03be\u03b5\u03b9" + ::msgcat::mcset el "Ok" "\u0395\u03bd\u03c4\u03ac\u03be\u03b5\u03b9" + ::msgcat::mcset el "Open" "\u0386\u03bd\u03bf\u03b9\u03b3\u03bc\u03b1" + ::msgcat::mcset el "&Open" "\u0386\u03bd\u03bf\u03b9\u03b3\u03bc\u03b1" + ::msgcat::mcset el "Open Multiple Files" \ + "\u0386\u03bd\u03bf\u03b9\u03b3\u03bc\u03b1 \u03c0\u03bf\u03bb\u03bb\u03b1\u03c0\u03bb\u03ce\u03bd \u03b1\u03c1\u03c7\u03b5\u03af\u03c9\u03bd" + ::msgcat::mcset el "P&aste" "\u0395\u03c0\u03b9\u03ba\u03cc\u03bb\u03bb\u03b7\u03c3\u03b7" + ::msgcat::mcset el "Quit" "\u0388\u03be\u03bf\u03b4\u03bf\u03c2" + ::msgcat::mcset el "&Red" "\u039a\u03cc\u03ba\u03ba\u03b9\u03bd\u03bf" + ::msgcat::mcset el "Replace existing file?" \ + "\u0395\u03c0\u03b9\u03ba\u03ac\u03bb\u03c5\u03c8\u03b7 \u03c5\u03c0\u03ac\u03c1\u03c7\u03bf\u03bd\u03c4\u03bf\u03c2 \u03b1\u03c1\u03c7\u03b5\u03af\u03bf\u03c5;" + ::msgcat::mcset el "&Retry" "\u03a0\u03c1\u03bf\u03c3\u03c0\u03ac\u03b8\u03b7\u03c3\u03b5 \u03be\u03b1\u03bd\u03ac" + ::msgcat::mcset el "&Save" "\u0391\u03c0\u03bf\u03b8\u03ae\u03ba\u03b5\u03c5\u03c3\u03b7" + ::msgcat::mcset el "Save As" "\u0391\u03c0\u03bf\u03b8\u03ae\u03ba\u03b5\u03c5\u03c3\u03b7 \u03c3\u03b1\u03bd" + ::msgcat::mcset el "Save To Log" "\u0391\u03c0\u03bf\u03b8\u03ae\u03ba\u03b5\u03c5\u03c3\u03b7 \u03c3\u03c4\u03bf \u03b1\u03c1\u03c7\u03b5\u03af\u03bf \u03ba\u03b1\u03c4\u03b1\u03b3\u03c1\u03b1\u03c6\u03ae\u03c2" + ::msgcat::mcset el "Select Log File" "\u0395\u03c0\u03b9\u03bb\u03bf\u03b3\u03ae \u03b1\u03c1\u03c7\u03b5\u03af\u03bf\u03c5 \u03ba\u03b1\u03c4\u03b1\u03b3\u03c1\u03b1\u03c6\u03ae\u03c2" + ::msgcat::mcset el "Select a file to source" \ + "\u0395\u03c0\u03b9\u03bb\u03ad\u03be\u03c4\u03b5 \u03b1\u03c1\u03c7\u03b5\u03af\u03bf \u03b3\u03b9\u03b1 \u03b5\u03ba\u03c4\u03ad\u03bb\u03b5\u03c3\u03b7" + ::msgcat::mcset el "&Selection:" "\u0395\u03c0\u03b9\u03bb\u03bf\u03b3\u03ae:" + ::msgcat::mcset el "Skip Messages" "\u0391\u03c0\u03bf\u03c6\u03c5\u03b3\u03ae\u03bc\u03b7\u03bd\u03c5\u03bc\u03ac\u03c4\u03c9\u03bd" + ::msgcat::mcset el "&Source..." "\u0395\u03ba\u03c4\u03ad\u03bb\u03b5\u03c3\u03b7..." + ::msgcat::mcset el "Tcl Scripts" "Tcl Scripts" + ::msgcat::mcset el "Tcl for Windows" "Tcl \u03b3\u03b9\u03b1 Windows" + ::msgcat::mcset el "Text Files" "\u0391\u03c1\u03c7\u03b5\u03af\u03b1 \u039a\u03b5\u03b9\u03bc\u03ad\u03bd\u03bf\u03c5" + ::msgcat::mcset el "&Yes" "\u039d\u03b1\u03b9" + ::msgcat::mcset el "abort" "\u03c4\u03b5\u03c1\u03bc\u03b1\u03c4\u03b9\u03c3\u03bc\u03cc\u03c2" + ::msgcat::mcset el "blue" "\u03bc\u03c0\u03bb\u03b5" + ::msgcat::mcset el "cancel" "\u03b1\u03ba\u03cd\u03c1\u03c9\u03c3\u03b7" + ::msgcat::mcset el "extension" "\u03b5\u03c0\u03ad\u03ba\u03c4\u03b1\u03c3\u03b7" + ::msgcat::mcset el "extensions" "\u03b5\u03c0\u03b5\u03ba\u03c4\u03ac\u03c3\u03b5\u03b9\u03c2" + ::msgcat::mcset el "green" "\u03c0\u03c1\u03ac\u03c3\u03b9\u03bd\u03bf" + ::msgcat::mcset el "ignore" "\u03b1\u03b3\u03bd\u03cc\u03b7\u03c3\u03b7" + ::msgcat::mcset el "ok" "\u03b5\u03bd\u03c4\u03ac\u03be\u03b5\u03b9" + ::msgcat::mcset el "red" "\u03ba\u03cc\u03ba\u03ba\u03b9\u03bd\u03bf" + ::msgcat::mcset el "retry" "\u03c0\u03c1\u03bf\u03c3\u03c0\u03ac\u03b8\u03b7\u03c3\u03b5 \u03be\u03b1\u03bd\u03ac" + ::msgcat::mcset el "yes" "\u03bd\u03b1\u03b9" +} diff --git a/env/tcl/tk8.6/msgs/en.msg b/env/tcl/tk8.6/msgs/en.msg new file mode 100644 index 0000000..5ad1094 --- /dev/null +++ b/env/tcl/tk8.6/msgs/en.msg @@ -0,0 +1,91 @@ +namespace eval ::tk { + ::msgcat::mcset en "&Abort" + ::msgcat::mcset en "&About..." + ::msgcat::mcset en "All Files" + ::msgcat::mcset en "Application Error" + ::msgcat::mcset en "&Apply" + ::msgcat::mcset en "Bold" + ::msgcat::mcset en "Bold Italic" + ::msgcat::mcset en "&Blue" + ::msgcat::mcset en "Cancel" + ::msgcat::mcset en "&Cancel" + ::msgcat::mcset en "Cannot change to the directory \"%1\$s\".\nPermission denied." + ::msgcat::mcset en "Choose Directory" + ::msgcat::mcset en "Cl&ear" + ::msgcat::mcset en "&Clear Console" + ::msgcat::mcset en "Color" + ::msgcat::mcset en "Console" + ::msgcat::mcset en "&Copy" + ::msgcat::mcset en "Cu&t" + ::msgcat::mcset en "&Delete" + ::msgcat::mcset en "Details >>" + ::msgcat::mcset en "Directory \"%1\$s\" does not exist." + ::msgcat::mcset en "&Directory:" + ::msgcat::mcset en "&Edit" + ::msgcat::mcset en "Effects" + ::msgcat::mcset en "Error: %1\$s" + ::msgcat::mcset en "E&xit" + ::msgcat::mcset en "&File" + ::msgcat::mcset en "File \"%1\$s\" already exists.\nDo you want to overwrite it?" + ::msgcat::mcset en "File \"%1\$s\" already exists.\n\n" + ::msgcat::mcset en "File \"%1\$s\" does not exist." + ::msgcat::mcset en "File &name:" + ::msgcat::mcset en "File &names:" + ::msgcat::mcset en "Files of &type:" + ::msgcat::mcset en "Fi&les:" + ::msgcat::mcset en "&Filter" + ::msgcat::mcset en "Fil&ter:" + ::msgcat::mcset en "Font" + ::msgcat::mcset en "&Font:" + ::msgcat::mcset en "Font st&yle:" + ::msgcat::mcset en "&Green" + ::msgcat::mcset en "&Help" + ::msgcat::mcset en "Hi" + ::msgcat::mcset en "&Hide Console" + ::msgcat::mcset en "&Ignore" + ::msgcat::mcset en "Invalid file name \"%1\$s\"." + ::msgcat::mcset en "Italic" + ::msgcat::mcset en "Log Files" + ::msgcat::mcset en "&No" + ::msgcat::mcset en "&OK" + ::msgcat::mcset en "OK" + ::msgcat::mcset en "Ok" + ::msgcat::mcset en "Open" + ::msgcat::mcset en "&Open" + ::msgcat::mcset en "Open Multiple Files" + ::msgcat::mcset en "P&aste" + ::msgcat::mcset en "&Quit" + ::msgcat::mcset en "&Red" + ::msgcat::mcset en "Regular" + ::msgcat::mcset en "Replace existing file?" + ::msgcat::mcset en "&Retry" + ::msgcat::mcset en "Sample" + ::msgcat::mcset en "&Save" + ::msgcat::mcset en "Save As" + ::msgcat::mcset en "Save To Log" + ::msgcat::mcset en "Select Log File" + ::msgcat::mcset en "Select a file to source" + ::msgcat::mcset en "&Selection:" + ::msgcat::mcset en "&Size:" + ::msgcat::mcset en "Show &Hidden Directories" + ::msgcat::mcset en "Show &Hidden Files and Directories" + ::msgcat::mcset en "Skip Messages" + ::msgcat::mcset en "&Source..." + ::msgcat::mcset en "Stri&keout" + ::msgcat::mcset en "Tcl Scripts" + ::msgcat::mcset en "Tcl for Windows" + ::msgcat::mcset en "Text Files" + ::msgcat::mcset en "&Underline" + ::msgcat::mcset en "&Yes" + ::msgcat::mcset en "abort" + ::msgcat::mcset en "blue" + ::msgcat::mcset en "cancel" + ::msgcat::mcset en "extension" + ::msgcat::mcset en "extensions" + ::msgcat::mcset en "green" + ::msgcat::mcset en "ignore" + ::msgcat::mcset en "ok" + ::msgcat::mcset en "red" + ::msgcat::mcset en "retry" + ::msgcat::mcset en "yes" +} diff --git a/env/tcl/tk8.6/msgs/en_gb.msg b/env/tcl/tk8.6/msgs/en_gb.msg new file mode 100644 index 0000000..efafa38 --- /dev/null +++ b/env/tcl/tk8.6/msgs/en_gb.msg @@ -0,0 +1,3 @@ +namespace eval ::tk { + ::msgcat::mcset en_gb Color Colour +} diff --git a/env/tcl/tk8.6/msgs/eo.msg b/env/tcl/tk8.6/msgs/eo.msg new file mode 100644 index 0000000..3645630 --- /dev/null +++ b/env/tcl/tk8.6/msgs/eo.msg @@ -0,0 +1,75 @@ +namespace eval ::tk { + ::msgcat::mcset eo "&Abort" "&\u0108esigo" + ::msgcat::mcset eo "&About..." "Pri..." + ::msgcat::mcset eo "All Files" "\u0108ioj dosieroj" + ::msgcat::mcset eo "Application Error" "Aplikoerraro" + ::msgcat::mcset eo "&Blue" "&Blua" + ::msgcat::mcset eo "Cancel" "Rezignu" + ::msgcat::mcset eo "&Cancel" "&Rezignu" + ::msgcat::mcset eo "Cannot change to the directory \"%1\$s\".\nPermission denied." "Neeble \u0109angi al dosierulon \"%1\$s\".\nVi ne rajtas tion." + ::msgcat::mcset eo "Choose Directory" "Elektu Dosierujo" + ::msgcat::mcset eo "Cl&ear" "&Klaru" + ::msgcat::mcset eo "&Clear Console" "&Klaru konzolon" + ::msgcat::mcset eo "Color" "Farbo" + ::msgcat::mcset eo "Console" "Konzolo" + ::msgcat::mcset eo "&Copy" "&Kopiu" + ::msgcat::mcset eo "Cu&t" "&Enpo\u015digu" + ::msgcat::mcset eo "&Delete" "&Forprenu" + ::msgcat::mcset eo "Details >>" "Detaloj >>" + ::msgcat::mcset eo "Directory \"%1\$s\" does not exist." "La dosierujo \"%1\$s\" ne ekzistas." + ::msgcat::mcset eo "&Directory:" "&Dosierujo:" + ::msgcat::mcset eo "&Edit" "&Redaktu" + ::msgcat::mcset eo "Error: %1\$s" "Eraro: %1\$s" + ::msgcat::mcset eo "E&xit" "&Eliru" + ::msgcat::mcset eo "&File" "&Dosiero" + ::msgcat::mcset eo "File \"%1\$s\" already exists.\nDo you want to overwrite it?" "La dosiero \"%1\$s\" jam ekzistas.\n\u0108u vi volas anstata\u00fbigi la dosieron?" + ::msgcat::mcset eo "File \"%1\$s\" already exists.\n\n" "La dosiero \"%1\$s\" jam egzistas. \n\n" + ::msgcat::mcset eo "File \"%1\$s\" does not exist." "La dosierp \"%1\$s\" ne estas." + ::msgcat::mcset eo "File &name:" "Dosiero&nomo:" + ::msgcat::mcset eo "File &names:" "Dosiero&nomoj:" + ::msgcat::mcset eo "Files of &type:" "Dosieroj de &Typo:" + ::msgcat::mcset eo "Fi&les:" "Do&sieroj:" + ::msgcat::mcset eo "&Filter" "&Filtrilo" + ::msgcat::mcset eo "Fil&ter:" "&Filtrilo:" + ::msgcat::mcset eo "&Green" "&Verda" + ::msgcat::mcset eo "&Help" "&Helpu" + ::msgcat::mcset eo "Hi" "Saluton" + ::msgcat::mcset eo "&Hide Console" "&Ka\u015du konzolon" + ::msgcat::mcset eo "&Ignore" "&Ignoru" + ::msgcat::mcset eo "Invalid file name \"%1\$s\"." "Malvalida dosieronomo \"%1\$s\"." + ::msgcat::mcset eo "Log Files" "Protokolo" + ::msgcat::mcset eo "&No" "&Ne" + ::msgcat::mcset eo "&OK" + ::msgcat::mcset eo "OK" + ::msgcat::mcset eo "Ok" + ::msgcat::mcset eo "Open" "Malfermu" + ::msgcat::mcset eo "&Open" "&Malfermu" + ::msgcat::mcset eo "Open Multiple Files" "Melfermu multan dosierojn" + ::msgcat::mcset eo "P&aste" "&Elpo\u015digi" + ::msgcat::mcset eo "&Quit" "&Finigu" + ::msgcat::mcset eo "&Red" "&Rosa" + ::msgcat::mcset eo "Replace existing file?" "\u0108u anstata\u00fbu ekzistantan dosieron?" + ::msgcat::mcset eo "&Retry" "&Ripetu" + ::msgcat::mcset eo "&Save" "&Savu" + ::msgcat::mcset eo "Save As" "Savu kiel" + ::msgcat::mcset eo "Save To Log" "Savu en protokolon" + ::msgcat::mcset eo "Select Log File" "Elektu prokolodosieron" + ::msgcat::mcset eo "Select a file to source" "Elektu dosieron por interpreti" + ::msgcat::mcset eo "&Selection:" "&Elekto:" + ::msgcat::mcset eo "Skip Messages" "transsaltu pluajn mesa\u011dojn" + ::msgcat::mcset eo "&Source..." "&Fontoprogramo..." + ::msgcat::mcset eo "Tcl Scripts" "Tcl-skriptoj" + ::msgcat::mcset eo "Tcl for Windows" "Tcl por vindoso" + ::msgcat::mcset eo "Text Files" "Tekstodosierojn" + ::msgcat::mcset eo "&Yes" "&Jes" + ::msgcat::mcset eo "abort" "\u0109esigo" + ::msgcat::mcset eo "blue" "blua" + ::msgcat::mcset eo "cancel" "rezignu" + ::msgcat::mcset eo "extension" "ekspansio" + ::msgcat::mcset eo "extensions" "ekspansioj" + ::msgcat::mcset eo "green" "verda" + ::msgcat::mcset eo "ignore" "ignorieren" + ::msgcat::mcset eo "red" "ru\u011da" + ::msgcat::mcset eo "retry" "ripetu" + ::msgcat::mcset eo "yes" "jes" +} diff --git a/env/tcl/tk8.6/msgs/es.msg b/env/tcl/tk8.6/msgs/es.msg new file mode 100644 index 0000000..578c52c --- /dev/null +++ b/env/tcl/tk8.6/msgs/es.msg @@ -0,0 +1,76 @@ +namespace eval ::tk { + ::msgcat::mcset es "&Abort" "&Abortar" + ::msgcat::mcset es "&About..." "&Acerca de ..." + ::msgcat::mcset es "All Files" "Todos los archivos" + ::msgcat::mcset es "Application Error" "Error de la aplicaci\u00f3n" + ::msgcat::mcset es "&Blue" "&Azul" + ::msgcat::mcset es "Cancel" "Cancelar" + ::msgcat::mcset es "&Cancel" "&Cancelar" + ::msgcat::mcset es "Cannot change to the directory \"%1\$s\".\nPermission denied." "No es posible acceder al directorio \"%1\$s\".\nPermiso denegado." + ::msgcat::mcset es "Choose Directory" "Elegir directorio" + ::msgcat::mcset es "Cl&ear" "&Borrar" + ::msgcat::mcset es "&Clear Console" "&Borrar consola" + ::msgcat::mcset es "Color" + ::msgcat::mcset es "Console" "Consola" + ::msgcat::mcset es "&Copy" "&Copiar" + ::msgcat::mcset es "Cu&t" "Cor&tar" + ::msgcat::mcset es "&Delete" "&Borrar" + ::msgcat::mcset es "Details >>" "Detalles >>" + ::msgcat::mcset es "Directory \"%1\$s\" does not exist." "El directorio \"%1\$s\" no existe." + ::msgcat::mcset es "&Directory:" "&Directorio:" + ::msgcat::mcset es "&Edit" "&Editar" + ::msgcat::mcset es "Error: %1\$s" + ::msgcat::mcset es "E&xit" "Salir" + ::msgcat::mcset es "&File" "&Archivo" + ::msgcat::mcset es "File \"%1\$s\" already exists.\nDo you want to overwrite it?" "El archivo \"%1\$s\" ya existe.\n\u00bfDesea sobreescribirlo?" + ::msgcat::mcset es "File \"%1\$s\" already exists.\n\n" "El archivo \"%1\$s\" ya existe.\n\n" + ::msgcat::mcset es "File \"%1\$s\" does not exist." "El archivo \"%1\$s\" no existe." + ::msgcat::mcset es "File &name:" "&Nombre de archivo:" + ::msgcat::mcset es "File &names:" "&Nombres de archivo:" + ::msgcat::mcset es "Files of &type:" "Archivos de &tipo:" + ::msgcat::mcset es "Fi&les:" "&Archivos:" + ::msgcat::mcset es "&Filter" "&Filtro" + ::msgcat::mcset es "Fil&ter:" "Fil&tro:" + ::msgcat::mcset es "&Green" "&Verde" + ::msgcat::mcset es "&Help" "&Ayuda" + ::msgcat::mcset es "Hi" "Hola" + ::msgcat::mcset es "&Hide Console" "&Esconder la consola" + ::msgcat::mcset es "&Ignore" "&Ignorar" + ::msgcat::mcset es "Invalid file name \"%1\$s\"." "Nombre de archivo inv\u00e1lido \"%1\$s\"." + ::msgcat::mcset es "Log Files" "Ficheros de traza" + ::msgcat::mcset es "&No" + ::msgcat::mcset es "&OK" + ::msgcat::mcset es "OK" + ::msgcat::mcset es "Ok" + ::msgcat::mcset es "Open" "Abrir" + ::msgcat::mcset es "&Open" "&Abrir" + ::msgcat::mcset es "Open Multiple Files" "Abrir m\u00faltiples archivos" + ::msgcat::mcset es "P&aste" "Peg&ar" + ::msgcat::mcset es "&Quit" "&Abandonar" + ::msgcat::mcset es "&Red" "&Rojo" + ::msgcat::mcset es "Replace existing file?" "\u00bfReemplazar el archivo existente?" + ::msgcat::mcset es "&Retry" "&Reintentar" + ::msgcat::mcset es "&Save" "&Guardar" + ::msgcat::mcset es "Save As" "Guardar como" + ::msgcat::mcset es "Save To Log" "Guardar al archivo de traza" + ::msgcat::mcset es "Select Log File" "Elegir un archivo de traza" + ::msgcat::mcset es "Select a file to source" "Seleccionar un archivo a evaluar" + ::msgcat::mcset es "&Selection:" "&Selecci\u00f3n:" + ::msgcat::mcset es "Skip Messages" "Omitir los mensajes" + ::msgcat::mcset es "&Source..." "E&valuar..." + ::msgcat::mcset es "Tcl Scripts" "Scripts Tcl" + ::msgcat::mcset es "Tcl for Windows" "Tcl para Windows" + ::msgcat::mcset es "Text Files" "Archivos de texto" + ::msgcat::mcset es "&Yes" "&S\u00ed" + ::msgcat::mcset es "abort" "abortar" + ::msgcat::mcset es "blue" "azul" + ::msgcat::mcset es "cancel" "cancelar" + ::msgcat::mcset es "extension" "extensi\u00f3n" + ::msgcat::mcset es "extensions" "extensiones" + ::msgcat::mcset es "green" "verde" + ::msgcat::mcset es "ignore" "ignorar" + ::msgcat::mcset es "ok" + ::msgcat::mcset es "red" "rojo" + ::msgcat::mcset es "retry" "reintentar" + ::msgcat::mcset es "yes" "s\u00ed" +} diff --git a/env/tcl/tk8.6/msgs/fr.msg b/env/tcl/tk8.6/msgs/fr.msg new file mode 100644 index 0000000..7f42aca --- /dev/null +++ b/env/tcl/tk8.6/msgs/fr.msg @@ -0,0 +1,72 @@ +namespace eval ::tk { + ::msgcat::mcset fr "&Abort" "&Annuler" + ::msgcat::mcset fr "About..." "\u00c0 propos..." + ::msgcat::mcset fr "All Files" "Tous les fichiers" + ::msgcat::mcset fr "Application Error" "Erreur d'application" + ::msgcat::mcset fr "&Blue" "&Bleu" + ::msgcat::mcset fr "Cancel" "Annuler" + ::msgcat::mcset fr "&Cancel" "&Annuler" + ::msgcat::mcset fr "Cannot change to the directory \"%1\$s\".\nPermission denied." "Impossible d'acc\u00e9der au r\u00e9pertoire \"%1\$s\".\nPermission refus\u00e9e." + ::msgcat::mcset fr "Choose Directory" "Choisir r\u00e9pertoire" + ::msgcat::mcset fr "Cl&ear" "Effacer" + ::msgcat::mcset fr "Color" "Couleur" + ::msgcat::mcset fr "Console" + ::msgcat::mcset fr "Copy" "Copier" + ::msgcat::mcset fr "Cu&t" "Couper" + ::msgcat::mcset fr "Delete" "Effacer" + ::msgcat::mcset fr "Details >>" "D\u00e9tails >>" + ::msgcat::mcset fr "Directory \"%1\$s\" does not exist." "Le r\u00e9pertoire \"%1\$s\" n'existe pas." + ::msgcat::mcset fr "&Directory:" "&R\u00e9pertoire:" + ::msgcat::mcset fr "Error: %1\$s" "Erreur: %1\$s" + ::msgcat::mcset fr "E&xit" "Quitter" + ::msgcat::mcset fr "File \"%1\$s\" already exists.\nDo you want to overwrite it?" "Le fichier \"%1\$s\" existe d\u00e9j\u00e0.\nVoulez-vous l'\u00e9craser?" + ::msgcat::mcset fr "File \"%1\$s\" already exists.\n\n" "Le fichier \"%1\$s\" existe d\u00e9j\u00e0.\n\n" + ::msgcat::mcset fr "File \"%1\$s\" does not exist." "Le fichier \"%1\$s\" n'existe pas." + ::msgcat::mcset fr "File &name:" "&Nom de fichier:" + ::msgcat::mcset fr "File &names:" "&Noms de fichiers:" + ::msgcat::mcset fr "Files of &type:" "&Type de fichiers:" + ::msgcat::mcset fr "Fi&les:" "Fich&iers:" + ::msgcat::mcset fr "&Filter" "&Filtre" + ::msgcat::mcset fr "Fil&ter:" "Fil&tre:" + ::msgcat::mcset fr "&Green" "&Vert" + ::msgcat::mcset fr "Hi" "Salut" + ::msgcat::mcset fr "&Hide Console" "Cacher la Console" + ::msgcat::mcset fr "&Ignore" "&Ignorer" + ::msgcat::mcset fr "Invalid file name \"%1\$s\"." "Nom de fichier invalide \"%1\$s\"." + ::msgcat::mcset fr "Log Files" "Fichiers de trace" + ::msgcat::mcset fr "&No" "&Non" + ::msgcat::mcset fr "&OK" + ::msgcat::mcset fr "OK" + ::msgcat::mcset fr "Ok" + ::msgcat::mcset fr "Open" "Ouvrir" + ::msgcat::mcset fr "&Open" "&Ouvrir" + ::msgcat::mcset fr "Open Multiple Files" "Ouvrir plusieurs fichiers" + ::msgcat::mcset fr "P&aste" "Coller" + ::msgcat::mcset fr "&Quit" "&Quitter" + ::msgcat::mcset fr "&Red" "&Rouge" + ::msgcat::mcset fr "Replace existing file?" "Remplacer le fichier existant?" + ::msgcat::mcset fr "&Retry" "&R\u00e9-essayer" + ::msgcat::mcset fr "&Save" "&Sauvegarder" + ::msgcat::mcset fr "Save As" "Sauvegarder sous" + ::msgcat::mcset fr "Save To Log" "Sauvegarde au fichier de trace" + ::msgcat::mcset fr "Select Log File" "Choisir un fichier de trace" + ::msgcat::mcset fr "Select a file to source" "Choisir un fichier \u00e0 \u00e9valuer" + ::msgcat::mcset fr "&Selection:" "&S\u00e9lection:" + ::msgcat::mcset fr "Skip Messages" "Omettre les messages" + ::msgcat::mcset fr "&Source..." "\u00c9valuer..." + ::msgcat::mcset fr "Tcl Scripts" "Scripts Tcl" + ::msgcat::mcset fr "Tcl for Windows" "Tcl pour Windows" + ::msgcat::mcset fr "Text Files" "Fichiers texte" + ::msgcat::mcset fr "&Yes" "&Oui" + ::msgcat::mcset fr "abort" "abandonner" + ::msgcat::mcset fr "blue" "bleu" + ::msgcat::mcset fr "cancel" "annuler" + ::msgcat::mcset fr "extension" + ::msgcat::mcset fr "extensions" + ::msgcat::mcset fr "green" "vert" + ::msgcat::mcset fr "ignore" "ignorer" + ::msgcat::mcset fr "ok" + ::msgcat::mcset fr "red" "rouge" + ::msgcat::mcset fr "retry" "r\u00e9essayer" + ::msgcat::mcset fr "yes" "oui" +} diff --git a/env/tcl/tk8.6/msgs/hu.msg b/env/tcl/tk8.6/msgs/hu.msg new file mode 100644 index 0000000..38ef0b8 --- /dev/null +++ b/env/tcl/tk8.6/msgs/hu.msg @@ -0,0 +1,78 @@ +namespace eval ::tk { + ::msgcat::mcset hu "&Abort" "&Megszak\u00edt\u00e1s" + ::msgcat::mcset hu "&About..." "N\u00e9vjegy..." + ::msgcat::mcset hu "All Files" "Minden f\u00e1jl" + ::msgcat::mcset hu "Application Error" "Alkalmaz\u00e1s hiba" + ::msgcat::mcset hu "&Blue" "&K\u00e9k" + ::msgcat::mcset hu "Cancel" "M\u00e9gsem" + ::msgcat::mcset hu "&Cancel" "M\u00e9g&sem" + ::msgcat::mcset hu "Cannot change to the directory \"%1\$s\".\nPermission denied." "A k\u00f6nyvt\u00e1rv\u00e1lt\u00e1s nem siker\u00fclt: \"%1\$s\".\nHozz\u00e1f\u00e9r\u00e9s megtagadva." + ::msgcat::mcset hu "Choose Directory" "K\u00f6nyvt\u00e1r kiv\u00e1laszt\u00e1sa" + ::msgcat::mcset hu "Cl&ear" "T\u00f6rl\u00e9s" + ::msgcat::mcset hu "&Clear Console" "&T\u00f6rl\u00e9s Konzol" + ::msgcat::mcset hu "Color" "Sz\u00edn" + ::msgcat::mcset hu "Console" "Konzol" + ::msgcat::mcset hu "&Copy" "&M\u00e1sol\u00e1s" + ::msgcat::mcset hu "Cu&t" "&Kiv\u00e1g\u00e1s" + ::msgcat::mcset hu "&Delete" "&T\u00f6rl\u00e9s" + ::msgcat::mcset hu "Details >>" "R\u00e9szletek >>" + ::msgcat::mcset hu "Directory \"%1\$s\" does not exist." "\"%1\$s\" k\u00f6nyvt\u00e1r nem l\u00e9tezik." + ::msgcat::mcset hu "&Directory:" "&K\u00f6nyvt\u00e1r:" + #::msgcat::mcset hu "&Edit" + ::msgcat::mcset hu "Error: %1\$s" "Hiba: %1\$s" + ::msgcat::mcset hu "E&xit" "Kil\u00e9p\u00e9s" + ::msgcat::mcset hu "&File" "&F\u00e1jl" + ::msgcat::mcset hu "File \"%1\$s\" already exists.\nDo you want to overwrite it?" "\"%1\$s\" f\u00e1jl m\u00e1r l\u00e9tezik.\nFel\u00fcl\u00edrjam?" + ::msgcat::mcset hu "File \"%1\$s\" already exists.\n\n" "\"%1\$s\" f\u00e1jl m\u00e1r l\u00e9tezik.\n\n" + ::msgcat::mcset hu "File \"%1\$s\" does not exist." "\"%1\$s\" f\u00e1jl nem l\u00e9tezik." + ::msgcat::mcset hu "File &name:" "F\u00e1jl &neve:" + ::msgcat::mcset hu "File &names:" "F\u00e1jlok &nevei:" + ::msgcat::mcset hu "Files of &type:" "F\u00e1jlok &t\u00edpusa:" + ::msgcat::mcset hu "Fi&les:" "F\u00e1j&lok:" + ::msgcat::mcset hu "&Filter" "&Sz\u0171r\u0151" + ::msgcat::mcset hu "Fil&ter:" "S&z\u0171r\u0151:" + ::msgcat::mcset hu "&Green" "&Z\u00f6ld" + #::msgcat::mcset hu "&Help" + ::msgcat::mcset hu "Hi" "\u00dcdv" + ::msgcat::mcset hu "&Hide Console" "Konzol &elrejt\u00e9se" + ::msgcat::mcset hu "&Ignore" "K&ihagy\u00e1s" + ::msgcat::mcset hu "Invalid file name \"%1\$s\"." "\u00c9rv\u00e9nytelen f\u00e1jln\u00e9v: \"%1\$s\"." + ::msgcat::mcset hu "Log Files" "Log f\u00e1jlok" + ::msgcat::mcset hu "&No" "&Nem" + ::msgcat::mcset hu "&OK" + ::msgcat::mcset hu "OK" + ::msgcat::mcset hu "Ok" + ::msgcat::mcset hu "Open" "Megnyit\u00e1s" + ::msgcat::mcset hu "&Open" "&Megnyit\u00e1s" + ::msgcat::mcset hu "Open Multiple Files" "T\u00f6bb f\u00e1jl megnyit\u00e1sa" + ::msgcat::mcset hu "P&aste" "&Beilleszt\u00e9s" + ::msgcat::mcset hu "&Quit" "&Kil\u00e9p\u00e9s" + ::msgcat::mcset hu "&Red" "&V\u00f6r\u00f6s" + ::msgcat::mcset hu "Replace existing file?" "Megl\u00e9v\u0151 f\u00e1jl cser\u00e9je?" + ::msgcat::mcset hu "&Retry" "\u00daj&ra" + ::msgcat::mcset hu "&Save" "&Ment\u00e9s" + ::msgcat::mcset hu "Save As" "Ment\u00e9s m\u00e1sk\u00e9nt" + ::msgcat::mcset hu "Save To Log" "Ment\u00e9s log f\u00e1jlba" + ::msgcat::mcset hu "Select Log File" "Log f\u00e1jl kiv\u00e1laszt\u00e1sa" + ::msgcat::mcset hu "Select a file to source" "Forr\u00e1sf\u00e1jl kiv\u00e1laszt\u00e1sa" + ::msgcat::mcset hu "&Selection:" "&Kijel\u00f6l\u00e9s:" + ::msgcat::mcset hu "Show &Hidden Directories" "&Rejtett k\u00f6nyvt\u00e1rak megjelen\u00edt\u00e9se" + ::msgcat::mcset hu "Show &Hidden Files and Directories" "&Rejtett f\u00e1jlok \u00e9s k\u00f6nyvt\u00e1rak megjelen\u00edt\u00e9se" + ::msgcat::mcset hu "Skip Messages" "\u00dczenetek kihagy\u00e1sa" + ::msgcat::mcset hu "&Source..." "&Forr\u00e1s..." + ::msgcat::mcset hu "Tcl Scripts" "Tcl scriptek" + ::msgcat::mcset hu "Tcl for Windows" "Tcl Windows-hoz" + ::msgcat::mcset hu "Text Files" "Sz\u00f6vegf\u00e1jlok" + ::msgcat::mcset hu "&Yes" "&Igen" + ::msgcat::mcset hu "abort" "megszak\u00edt\u00e1s" + ::msgcat::mcset hu "blue" "k\u00e9k" + ::msgcat::mcset hu "cancel" "m\u00e9gsem" + ::msgcat::mcset hu "extension" "kiterjeszt\u00e9s" + ::msgcat::mcset hu "extensions" "kiterjeszt\u00e9sek" + ::msgcat::mcset hu "green" "z\u00f6ld" + ::msgcat::mcset hu "ignore" "ignorer" + ::msgcat::mcset hu "ok" + ::msgcat::mcset hu "red" "v\u00f6r\u00f6s" + ::msgcat::mcset hu "retry" "\u00fajra" + ::msgcat::mcset hu "yes" "igen" +} diff --git a/env/tcl/tk8.6/msgs/it.msg b/env/tcl/tk8.6/msgs/it.msg new file mode 100644 index 0000000..2e1b4bd --- /dev/null +++ b/env/tcl/tk8.6/msgs/it.msg @@ -0,0 +1,73 @@ +namespace eval ::tk { + ::msgcat::mcset it "&Abort" "&Interrompi" + ::msgcat::mcset it "&About..." "Informazioni..." + ::msgcat::mcset it "All Files" "Tutti i file" + ::msgcat::mcset it "Application Error" "Errore dell' applicazione" + ::msgcat::mcset it "&Blue" "&Blu" + ::msgcat::mcset it "Cancel" "Annulla" + ::msgcat::mcset it "&Cancel" "&Annulla" + ::msgcat::mcset it "Cannot change to the directory \"%1\$s\".\nPermission denied." "Impossibile accedere alla directory \"%1\$s\".\nPermesso negato." + ::msgcat::mcset it "Choose Directory" "Scegli una directory" + ::msgcat::mcset it "Cl&ear" "Azzera" + ::msgcat::mcset it "&Clear Console" "Azzera Console" + ::msgcat::mcset it "Color" "Colore" + ::msgcat::mcset it "Console" + ::msgcat::mcset it "&Copy" "Copia" + ::msgcat::mcset it "Cu&t" "Taglia" + ::msgcat::mcset it "Delete" "Cancella" + ::msgcat::mcset it "Details >>" "Dettagli >>" + ::msgcat::mcset it "Directory \"%1\$s\" does not exist." "La directory \"%1\$s\" non esiste." + ::msgcat::mcset it "&Directory:" + ::msgcat::mcset it "Error: %1\$s" "Errore: %1\$s" + ::msgcat::mcset it "E&xit" "Esci" + ::msgcat::mcset it "File \"%1\$s\" already exists.\nDo you want to overwrite it?" "Il file \"%1\$s\" esiste gi\u00e0.\nVuoi sovrascriverlo?" + ::msgcat::mcset it "File \"%1\$s\" already exists.\n\n" "Il file \"%1\$s\" esiste gi\u00e0.\n\n" + ::msgcat::mcset it "File \"%1\$s\" does not exist." "Il file \"%1\$s\" non esiste." + ::msgcat::mcset it "File &name:" "&Nome del file:" + ::msgcat::mcset it "File &names:" "&Nomi dei file:" + ::msgcat::mcset it "Files of &type:" "File di &tipo:" + ::msgcat::mcset it "Fi&les:" "Fi&le:" + ::msgcat::mcset it "&Filter" "&Filtro" + ::msgcat::mcset it "Fil&ter:" "Fil&tro:" + ::msgcat::mcset it "&Green" "&Verde" + ::msgcat::mcset it "Hi" "Salve" + ::msgcat::mcset it "&Hide Console" "Nascondi la console" + ::msgcat::mcset it "&Ignore" "&Ignora" + ::msgcat::mcset it "Invalid file name \"%1\$s\"." "Nome di file non valido \"%1\$s\"." + ::msgcat::mcset it "Log Files" "File di log" + ::msgcat::mcset it "&No" + ::msgcat::mcset it "&OK" + ::msgcat::mcset it "OK" + ::msgcat::mcset it "Ok" + ::msgcat::mcset it "Open" "Apri" + ::msgcat::mcset it "&Open" "A&pri" + ::msgcat::mcset it "Open Multiple Files" "Apri file multipli" + ::msgcat::mcset it "P&aste" "Incolla" + ::msgcat::mcset it "&Quit" "Esci" + ::msgcat::mcset it "&Red" "&Rosso" + ::msgcat::mcset it "Replace existing file?" "Sostituisci il file esistente?" + ::msgcat::mcset it "&Retry" "&Riprova" + ::msgcat::mcset it "&Save" "&Salva" + ::msgcat::mcset it "Save As" "Salva come" + ::msgcat::mcset it "Save To Log" "Salva il log" + ::msgcat::mcset it "Select Log File" "Scegli un file di log" + ::msgcat::mcset it "Select a file to source" "Scegli un file da eseguire" + ::msgcat::mcset it "&Selection:" "&Selezione:" + ::msgcat::mcset it "Skip Messages" "Salta i messaggi" + ::msgcat::mcset it "Source..." "Esegui..." + ::msgcat::mcset it "Tcl Scripts" "Script Tcl" + ::msgcat::mcset it "Tcl for Windows" "Tcl per Windows" + ::msgcat::mcset it "Text Files" "File di testo" + ::msgcat::mcset it "&Yes" "&S\u00ec" + ::msgcat::mcset it "abort" "interrompi" + ::msgcat::mcset it "blue" "blu" + ::msgcat::mcset it "cancel" "annulla" + ::msgcat::mcset it "extension" "estensione" + ::msgcat::mcset it "extensions" "estensioni" + ::msgcat::mcset it "green" "verde" + ::msgcat::mcset it "ignore" "ignora" + ::msgcat::mcset it "ok" + ::msgcat::mcset it "red" "rosso" + ::msgcat::mcset it "retry" "riprova" + ::msgcat::mcset it "yes" "s\u00ec" +} diff --git a/env/tcl/tk8.6/msgs/nl.msg b/env/tcl/tk8.6/msgs/nl.msg new file mode 100644 index 0000000..148a9e6 --- /dev/null +++ b/env/tcl/tk8.6/msgs/nl.msg @@ -0,0 +1,91 @@ +namespace eval ::tk { + ::msgcat::mcset nl "&Abort" "&Afbreken" + ::msgcat::mcset nl "&About..." "Over..." + ::msgcat::mcset nl "All Files" "Alle Bestanden" + ::msgcat::mcset nl "Application Error" "Toepassingsfout" + ::msgcat::mcset nl "&Apply" "Toepassen" + ::msgcat::mcset nl "Bold" "Vet" + ::msgcat::mcset nl "Bold Italic" "Vet Cursief" + ::msgcat::mcset nl "&Blue" "&Blauw" + ::msgcat::mcset nl "Cancel" "Annuleren" + ::msgcat::mcset nl "&Cancel" "&Annuleren" + ::msgcat::mcset nl "Cannot change to the directory \"%1\$s\".\nPermission denied." "Kan niet naar map \"%1\$s\" gaan.\nU heeft hiervoor geen toestemming." + ::msgcat::mcset nl "Choose Directory" "Kies map" + ::msgcat::mcset nl "Cl&ear" "Wissen" + ::msgcat::mcset nl "&Clear Console" "&Wis Console" + ::msgcat::mcset nl "Color" "Kleur" + ::msgcat::mcset nl "Console" + ::msgcat::mcset nl "&Copy" "Kopi\u00ebren" + ::msgcat::mcset nl "Cu&t" "Knippen" + ::msgcat::mcset nl "&Delete" "Wissen" + ::msgcat::mcset nl "Details >>" + ::msgcat::mcset nl "Directory \"%1\$s\" does not exist." "Map \"%1\$s\" bestaat niet." + ::msgcat::mcset nl "&Directory:" "&Map:" + ::msgcat::mcset nl "&Edit" "Bewerken" + ::msgcat::mcset nl "Effects" "Effecten" + ::msgcat::mcset nl "Error: %1\$s" "Fout: %1\$s" + ::msgcat::mcset nl "E&xit" "Be\u00ebindigen" + ::msgcat::mcset nl "&File" "Bestand" + ::msgcat::mcset nl "File \"%1\$s\" already exists.\nDo you want to overwrite it?" "Bestand \"%1\$s\" bestaat al.\nWilt u het overschrijven?" + ::msgcat::mcset nl "File \"%1\$s\" already exists.\n\n" "Bestand \"%1\$s\" bestaat al.\n\n" + ::msgcat::mcset nl "File \"%1\$s\" does not exist." "Bestand \"%1\$s\" bestaat niet." + ::msgcat::mcset nl "File &name:" "Bestands&naam:" + ::msgcat::mcset nl "File &names:" "Bestands&namen:" + ::msgcat::mcset nl "Files of &type:" "Bestanden van het &type:" + ::msgcat::mcset nl "Fi&les:" "&Bestanden:" + ::msgcat::mcset nl "&Filter" + ::msgcat::mcset nl "Fil&ter:" + ::msgcat::mcset nl "Font" + ::msgcat::mcset nl "&Font:" + ::msgcat::mcset nl "Font st&yle:" "Font stijl:" + ::msgcat::mcset nl "&Green" "&Groen" + ::msgcat::mcset nl "&Help" + ::msgcat::mcset nl "Hi" "H\u00e9" + ::msgcat::mcset nl "&Hide Console" "Verberg Console" + ::msgcat::mcset nl "&Ignore" "&Negeren" + ::msgcat::mcset nl "Invalid file name \"%1\$s\"." "Ongeldige bestandsnaam \"%1\$s\"." + ::msgcat::mcset nl "Italic" "Cursief" + ::msgcat::mcset nl "Log Files" "Log Bestanden" + ::msgcat::mcset nl "&No" "&Nee" + ::msgcat::mcset nl "&OK" + ::msgcat::mcset nl "OK" + ::msgcat::mcset nl "Ok" + ::msgcat::mcset nl "Open" "Openen" + ::msgcat::mcset nl "&Open" "&Openen" + ::msgcat::mcset nl "Open Multiple Files" "Open meerdere bestanden" + ::msgcat::mcset nl "P&aste" "Pl&akken" + ::msgcat::mcset nl "&Quit" "Stoppen" + ::msgcat::mcset nl "&Red" "&Rood" + ::msgcat::mcset nl "Regular" "Standaard" + ::msgcat::mcset nl "Replace existing file?" "Vervang bestaand bestand?" + ::msgcat::mcset nl "&Retry" "&Herhalen" + ::msgcat::mcset nl "Sample" + ::msgcat::mcset nl "&Save" "Op&slaan" + ::msgcat::mcset nl "Save As" "Opslaan als" + ::msgcat::mcset nl "Save To Log" "Opslaan naar Log" + ::msgcat::mcset nl "Select Log File" "Selecteer Log bestand" + ::msgcat::mcset nl "Select a file to source" "Selecteer bronbestand" + ::msgcat::mcset nl "&Selection:" "&Selectie:" + ::msgcat::mcset nl "&Size:" "Grootte" + ::msgcat::mcset nl "Show &Hidden Directories" "Laat verborgen mappen zien" + ::msgcat::mcset nl "Show &Hidden Files and Directories" "Laat verborgen bestanden mappen zien" + ::msgcat::mcset nl "Skip Messages" "Berichten overslaan" + ::msgcat::mcset nl "&Source..." "Bron..." + ::msgcat::mcset nl "Stri&keout" + ::msgcat::mcset nl "Tcl Scripts" + ::msgcat::mcset nl "Tcl for Windows" "Tcl voor Windows" + ::msgcat::mcset nl "Text Files" "Tekstbestanden" + ::msgcat::mcset nl "&Underline" "Onderstreept" + ::msgcat::mcset nl "&Yes" "&Ja" + ::msgcat::mcset nl "abort" "afbreken" + ::msgcat::mcset nl "blue" "blauw" + ::msgcat::mcset nl "cancel" "annuleren" + ::msgcat::mcset nl "extension" + ::msgcat::mcset nl "extensions" + ::msgcat::mcset nl "green" "groen" + ::msgcat::mcset nl "ignore" "negeren" + ::msgcat::mcset nl "ok" + ::msgcat::mcset nl "red" "rood" + ::msgcat::mcset nl "retry" "opnieuw" + ::msgcat::mcset nl "yes" "ja" +} diff --git a/env/tcl/tk8.6/msgs/pl.msg b/env/tcl/tk8.6/msgs/pl.msg new file mode 100644 index 0000000..c20f41e --- /dev/null +++ b/env/tcl/tk8.6/msgs/pl.msg @@ -0,0 +1,91 @@ +namespace eval ::tk { + ::msgcat::mcset pl "&Abort" "&Przerwij" + ::msgcat::mcset pl "&About..." "O programie..." + ::msgcat::mcset pl "All Files" "Wszystkie pliki" + ::msgcat::mcset pl "Application Error" "B\u0142\u0105d w programie" + ::msgcat::mcset pl "&Apply" "Zastosuj" + ::msgcat::mcset pl "Bold" "Pogrubienie" + ::msgcat::mcset pl "Bold Italic" "Pogrubiona kursywa" + ::msgcat::mcset pl "&Blue" "&Niebieski" + ::msgcat::mcset pl "Cancel" "Anuluj" + ::msgcat::mcset pl "&Cancel" "&Anuluj" + ::msgcat::mcset pl "Cannot change to the directory \"%1\$s\".\nPermission denied." "Nie mo\u017cna otworzy\u0107 katalogu \"%1\$s\".\nOdmowa dost\u0119pu." + ::msgcat::mcset pl "Choose Directory" "Wybierz katalog" + ::msgcat::mcset pl "Cl&ear" "&Wyczy\u015b\u0107" + ::msgcat::mcset pl "&Clear Console" "&Wyczy\u015b\u0107 konsol\u0119" + ::msgcat::mcset pl "Color" "Kolor" + ::msgcat::mcset pl "Console" "Konsola" + ::msgcat::mcset pl "&Copy" "&Kopiuj" + ::msgcat::mcset pl "Cu&t" "&Wytnij" + ::msgcat::mcset pl "&Delete" "&Usu\u0144" + ::msgcat::mcset pl "Details >>" "Szczeg\u00f3\u0142y >>" + ::msgcat::mcset pl "Directory \"%1\$s\" does not exist." "Katalog \"%1\$s\" nie istnieje." + ::msgcat::mcset pl "&Directory:" "&Katalog:" + ::msgcat::mcset pl "&Edit" "&Edytuj" + ::msgcat::mcset pl "Effects" "Efekty" + ::msgcat::mcset pl "Error: %1\$s" "B\u0142\u0105d: %1\$s" + ::msgcat::mcset pl "E&xit" "&Wyjd\u017a" + ::msgcat::mcset pl "&File" "&Plik" + ::msgcat::mcset pl "File \"%1\$s\" already exists.\nDo you want to overwrite it?" "Plik \"%1\$s\" ju\u017c istnieje.\nCzy chcesz go nadpisa\u0107?" + ::msgcat::mcset pl "File \"%1\$s\" already exists.\n\n" "Plik \"%1\$s\" ju\u017c istnieje.\n\n" + ::msgcat::mcset pl "File \"%1\$s\" does not exist." "Plik \"%1\$s\" nie istnieje." + ::msgcat::mcset pl "File &name:" "Nazwa &pliku:" + ::msgcat::mcset pl "File &names:" "Nazwy &plik\u00f3w:" + ::msgcat::mcset pl "Files of &type:" "Pliki &typu:" + ::msgcat::mcset pl "Fi&les:" "Pli&ki:" + ::msgcat::mcset pl "&Filter" "&Filtr" + ::msgcat::mcset pl "Fil&ter:" "&Filtr:" + ::msgcat::mcset pl "Font" "Czcionka" + ::msgcat::mcset pl "&Font:" "Czcio&nka:" + ::msgcat::mcset pl "Font st&yle:" "&Styl czcionki:" + ::msgcat::mcset pl "&Green" "&Zielony" + ::msgcat::mcset pl "&Help" "&Pomoc" + ::msgcat::mcset pl "Hi" "Witaj" + ::msgcat::mcset pl "&Hide Console" "&Ukryj konsol\u0119" + ::msgcat::mcset pl "&Ignore" "&Ignoruj" + ::msgcat::mcset pl "Invalid file name \"%1\$s\"." "Niew\u0142a\u015bciwa nazwa pliku \"%1\$s\"." + ::msgcat::mcset pl "Italic" "Kursywa" + ::msgcat::mcset pl "Log Files" "Pliki dziennika" + ::msgcat::mcset pl "&No" "&Nie" + ::msgcat::mcset pl "&OK" + ::msgcat::mcset pl "OK" + ::msgcat::mcset pl "Ok" + ::msgcat::mcset pl "Open" "Otw\u00f3rz" + ::msgcat::mcset pl "&Open" "&Otw\u00f3rz" + ::msgcat::mcset pl "Open Multiple Files" "Otw\u00f3rz wiele plik\u00f3w" + ::msgcat::mcset pl "P&aste" "&Wklej" + ::msgcat::mcset pl "&Quit" "&Zako\u0144cz" + ::msgcat::mcset pl "&Red" "&Czerwony" + ::msgcat::mcset pl "Regular" "Regularne" + ::msgcat::mcset pl "Replace existing file?" "Czy zast\u0105pi\u0107 istniej\u0105cy plik?" + ::msgcat::mcset pl "&Retry" "&Pon\u00f3w" + ::msgcat::mcset pl "Sample" "Przyk\u0142ad" + ::msgcat::mcset pl "&Save" "&Zapisz" + ::msgcat::mcset pl "Save As" "Zapisz jako" + ::msgcat::mcset pl "Save To Log" "Wpisz do dziennika" + ::msgcat::mcset pl "Select Log File" "Wybierz plik dziennika" + ::msgcat::mcset pl "Select a file to source" "Wybierz plik do wykonania" + ::msgcat::mcset pl "&Selection:" "&Wyb\u00f3r:" + ::msgcat::mcset pl "&Size:" "&Rozmiar:" + ::msgcat::mcset pl "Show &Hidden Directories" "Poka\u017c &ukryte katalogi" + ::msgcat::mcset pl "Show &Hidden Files and Directories" "Poka\u017c &ukryte pliki i katalogi" + ::msgcat::mcset pl "Skip Messages" "Pomi\u0144 pozosta\u0142e komunikaty" + ::msgcat::mcset pl "&Source..." "&Kod \u017ar\u00f3d\u0142owy..." + ::msgcat::mcset pl "Stri&keout" "&Przekre\u015blenie" + ::msgcat::mcset pl "Tcl Scripts" "Skrypty Tcl" + ::msgcat::mcset pl "Tcl for Windows" "Tcl dla Windows" + ::msgcat::mcset pl "Text Files" "Pliki tekstowe" + ::msgcat::mcset pl "&Underline" "Po&dkre\u015blenie" + ::msgcat::mcset pl "&Yes" "&Tak" + ::msgcat::mcset pl "abort" "przerwij" + ::msgcat::mcset pl "blue" "niebieski" + ::msgcat::mcset pl "cancel" "anuluj" + ::msgcat::mcset pl "extension" "rozszerzenie" + ::msgcat::mcset pl "extensions" "rozszerzenia" + ::msgcat::mcset pl "green" "zielony" + ::msgcat::mcset pl "ignore" "ignoruj" + ::msgcat::mcset pl "ok" + ::msgcat::mcset pl "red" "czerwony" + ::msgcat::mcset pl "retry" "pon\u00f3w" + ::msgcat::mcset pl "yes" "tak" +} diff --git a/env/tcl/tk8.6/msgs/pt.msg b/env/tcl/tk8.6/msgs/pt.msg new file mode 100644 index 0000000..c29e293 --- /dev/null +++ b/env/tcl/tk8.6/msgs/pt.msg @@ -0,0 +1,74 @@ +namespace eval ::tk { + ::msgcat::mcset pt "&Abort" "&Abortar" + ::msgcat::mcset pt "About..." "Sobre ..." + ::msgcat::mcset pt "All Files" "Todos os arquivos" + ::msgcat::mcset pt "Application Error" "Erro de aplica\u00e7\u00e3o" + ::msgcat::mcset pt "&Blue" "&Azul" + ::msgcat::mcset pt "Cancel" "Cancelar" + ::msgcat::mcset pt "&Cancel" "&Cancelar" + ::msgcat::mcset pt "Cannot change to the directory \"%1\$s\".\nPermission denied." "N\u00e3o foi poss\u00edvel mudar para o diret\u00f3rio \"%1\$s\".\nPermiss\u00e3o negada." + ::msgcat::mcset pt "Choose Directory" "Escolha um diret\u00f3rio" + ::msgcat::mcset pt "Cl&ear" "Apagar" + ::msgcat::mcset pt "&Clear Console" "Apagar Console" + ::msgcat::mcset pt "Color" "Cor" + ::msgcat::mcset pt "Console" + ::msgcat::mcset pt "&Copy" "Copiar" + ::msgcat::mcset pt "Cu&t" "Recortar" + ::msgcat::mcset pt "&Delete" "Excluir" + ::msgcat::mcset pt "Details >>" "Detalhes >>" + ::msgcat::mcset pt "Directory \"%1\$s\" does not exist." "O diret\u00f3rio \"%1\$s\" n\u00e3o existe." + ::msgcat::mcset pt "&Directory:" "&Diret\u00f3rio:" + ::msgcat::mcset pt "Error: %1\$s" "Erro: %1\$s" + ::msgcat::mcset pt "E&xit" "Sair" + ::msgcat::mcset pt "&File" "Arquivo" + ::msgcat::mcset pt "File \"%1\$s\" already exists.\nDo you want to overwrite it?" "O arquivo \"%1\$s\" j\u00e1 existe.\nDeseja sobrescreve-lo?" + ::msgcat::mcset pt "File \"%1\$s\" already exists.\n\n" "O arquivo \"%1\$s\" j\u00e1 existe.\n\n" + ::msgcat::mcset pt "File \"%1\$s\" does not exist." "Arquivo \"%1\$s\" n\u00e3o existe." + ::msgcat::mcset pt "File &name:" "&Nome do arquivo:" + ::msgcat::mcset pt "File &names:" "&Nomes dos arquivos:" + ::msgcat::mcset pt "Files of &type:" "Arquivos do &tipo:" + ::msgcat::mcset pt "Fi&les:" "&Arquivos:" + ::msgcat::mcset pt "&Filter" "&Filtro" + ::msgcat::mcset pt "Fil&ter:" "Fil&tro:" + ::msgcat::mcset pt "&Green" "&Verde" + ::msgcat::mcset pt "Hi" "Oi" + ::msgcat::mcset pt "&Hide Console" "Ocultar console" + ::msgcat::mcset pt "&Ignore" "&Ignorar" + ::msgcat::mcset pt "Invalid file name \"%1\$s\"." "O nome do arquivo \u00e9 inv\u00e1lido \"%1\$s\"." + ::msgcat::mcset pt "Log Files" "Arquivos de log" + ::msgcat::mcset pt "&No" "&N\u00e3o" + ::msgcat::mcset pt "&OK" + ::msgcat::mcset pt "OK" + ::msgcat::mcset pt "Ok" + ::msgcat::mcset pt "Open" "Abrir" + ::msgcat::mcset pt "&Open" "&Abrir" + ::msgcat::mcset pt "Open Multiple Files" "Abrir m\u00faltiplos arquivos" + ::msgcat::mcset pt "P&aste" "Col&ar" + ::msgcat::mcset pt "Quit" "Encerrar" + ::msgcat::mcset pt "&Red" "&Vermelho" + ::msgcat::mcset pt "Replace existing file?" "Substituir arquivo existente?" + ::msgcat::mcset pt "&Retry" "Tenta&r novamente" + ::msgcat::mcset pt "&Save" "&Salvar" + ::msgcat::mcset pt "Save As" "Salvar como" + ::msgcat::mcset pt "Save To Log" "Salvar arquivo de log" + ::msgcat::mcset pt "Select Log File" "Selecionar arquivo de log" + ::msgcat::mcset pt "Select a file to source" "Selecione um arquivo como fonte" + ::msgcat::mcset pt "&Selection:" "&Sele\u00e7\u00e3o:" + ::msgcat::mcset pt "Skip Messages" "Omitir as mensagens" + ::msgcat::mcset pt "&Source..." "&Fonte..." + ::msgcat::mcset pt "Tcl Scripts" "Scripts Tcl" + ::msgcat::mcset pt "Tcl for Windows" "Tcl para Windows" + ::msgcat::mcset pt "Text Files" "Arquivos de texto" + ::msgcat::mcset pt "&Yes" "&Sim" + ::msgcat::mcset pt "abort" "abortar" + ::msgcat::mcset pt "blue" "azul" + ::msgcat::mcset pt "cancel" "cancelar" + ::msgcat::mcset pt "extension" "extens\u00e3o" + ::msgcat::mcset pt "extensions" "extens\u00f5es" + ::msgcat::mcset pt "green" "verde" + ::msgcat::mcset pt "ignore" "ignorar" + ::msgcat::mcset pt "ok" + ::msgcat::mcset pt "red" "vermelho" + ::msgcat::mcset pt "retry" "tentar novamente" + ::msgcat::mcset pt "yes" "sim" +} diff --git a/env/tcl/tk8.6/msgs/ru.msg b/env/tcl/tk8.6/msgs/ru.msg new file mode 100644 index 0000000..2aac5bb --- /dev/null +++ b/env/tcl/tk8.6/msgs/ru.msg @@ -0,0 +1,75 @@ +namespace eval ::tk { + ::msgcat::mcset ru "&Abort" "&\u041e\u0442\u043c\u0435\u043d\u0438\u0442\u044c" + ::msgcat::mcset ru "&About..." "\u041f\u0440\u043e..." + ::msgcat::mcset ru "All Files" "\u0412\u0441\u0435 \u0444\u0430\u0439\u043b\u044b" + ::msgcat::mcset ru "Application Error" "\u041e\u0448\u0438\u0431\u043a\u0430 \u0432 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0435" + ::msgcat::mcset ru "&Blue" " &\u0413\u043e\u043b\u0443\u0431\u043e\u0439" + ::msgcat::mcset ru "Cancel" "\u041e\u0442&\u043c\u0435\u043d\u0430" + ::msgcat::mcset ru "&Cancel" "\u041e\u0442&\u043c\u0435\u043d\u0430" + ::msgcat::mcset ru "Cannot change to the directory \"%1\$s\".\nPermission denied." \ + "\u041d\u0435 \u043c\u043e\u0433\u0443 \u043f\u0435\u0440\u0435\u0439\u0442\u0438 \u0432 \u043a\u0430\u0442\u0430\u043b\u043e\u0433 \"%1\$s\".\n\u041d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043f\u0440\u0430\u0432 \u0434\u043e\u0441\u0442\u0443\u043f\u0430" + ::msgcat::mcset ru "Choose Directory" "\u0412\u044b\u0431\u0435\u0440\u0438\u0442\u0435 \u043a\u0430\u0442\u0430\u043b\u043e\u0433" + ::msgcat::mcset ru "Cl&ear" "\u041e\u0447\u0438\u0441\u0442\u0438\u0442\u044c" + ::msgcat::mcset ru "Color" "\u0426\u0432\u0435\u0442" + ::msgcat::mcset ru "Console" "\u041a\u043e\u043d\u0441\u043e\u043b\u044c" + ::msgcat::mcset ru "&Copy" "\u041a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c" + ::msgcat::mcset ru "Cu&t" "\u0412\u044b\u0440\u0435\u0437\u0430\u0442\u044c" + ::msgcat::mcset ru "&Delete" "\u0423\u0434\u0430\u043b\u0438\u0442\u044c" + ::msgcat::mcset ru "Details >>" "\u041f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435 >>" + ::msgcat::mcset ru "Directory \"%1\$s\" does not exist." "\u041a\u0430\u0442\u0430\u043b\u043e\u0433\u0430 \"%1\$s\" \u043d\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442." + ::msgcat::mcset ru "&Directory:" "&\u041a\u0430\u0442\u0430\u043b\u043e\u0433:" + ::msgcat::mcset ru "Error: %1\$s" "\u041e\u0448\u0438\u0431\u043a\u0430: %1\$s" + ::msgcat::mcset ru "E&xit" "\u0412\u044b\u0445\u043e\u0434" + ::msgcat::mcset ru "File \"%1\$s\" already exists.\nDo you want to overwrite it?" \ + "\u0424\u0430\u0439\u043b \"%1\$s\" \u0443\u0436\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442.\n\u0417\u0430\u043c\u0435\u043d\u0438\u0442\u044c \u0435\u0433\u043e?" + ::msgcat::mcset ru "File \"%1\$s\" already exists.\n\n" "\u0424\u0430\u0439\u043b \"%1\$s\" \u0443\u0436\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442.\n\n" + ::msgcat::mcset ru "File \"%1\$s\" does not exist." "\u0424\u0430\u0439\u043b \"%1\$s\" \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d." + ::msgcat::mcset ru "File &name:" "&\u0418\u043c\u044f \u0444\u0430\u0439\u043b\u0430:" + ::msgcat::mcset ru "File &names:" "&\u0418\u043c\u0435\u043d\u0430 \u0444\u0430\u0439\u043b\u043e\u0432:" + ::msgcat::mcset ru "Files of &type:" "&\u0422\u0438\u043f \u0444\u0430\u0439\u043b\u043e\u0432:" + ::msgcat::mcset ru "Fi&les:" "\u0424\u0430\u0439&\u043b\u044b:" + ::msgcat::mcset ru "&Filter" "&\u0424\u0438\u043b\u044c\u0442\u0440" + ::msgcat::mcset ru "Fil&ter:" "\u0424\u0438\u043b\u044c&\u0442\u0440:" + ::msgcat::mcset ru "&Green" " &\u0417\u0435\u043b\u0435\u043d\u044b\u0439" + ::msgcat::mcset ru "Hi" "\u041f\u0440\u0438\u0432\u0435\u0442" + ::msgcat::mcset ru "&Hide Console" "\u0421\u043f\u0440\u044f\u0442\u0430\u0442\u044c \u043a\u043e\u043d\u0441\u043e\u043b\u044c" + ::msgcat::mcset ru "&Ignore" "&\u0418\u0433\u043d\u043e\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c" + ::msgcat::mcset ru "Invalid file name \"%1\$s\"." "\u041d\u0435\u0432\u0435\u0440\u043d\u043e\u0435 \u0438\u043c\u044f \u0444\u0430\u0439\u043b\u0430 \"%1\$s\"." + ::msgcat::mcset ru "Log Files" "\u0424\u0430\u0439\u043b\u044b \u0436\u0443\u0440\u043d\u0430\u043b\u0430" + ::msgcat::mcset ru "&No" "&\u041d\u0435\u0442" + ::msgcat::mcset ru "&OK" "&\u041e\u041a" + ::msgcat::mcset ru "OK" "\u041e\u041a" + ::msgcat::mcset ru "Ok" "\u0414\u0430" + ::msgcat::mcset ru "Open" "\u041e\u0442\u043a\u0440\u044b\u0442\u044c" + ::msgcat::mcset ru "&Open" "&\u041e\u0442\u043a\u0440\u044b\u0442\u044c" + ::msgcat::mcset ru "Open Multiple Files" "\u041e\u0442\u043a\u0440\u044b\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0444\u0430\u0439\u043b\u043e\u0432" + ::msgcat::mcset ru "P&aste" "\u0412\u0441\u0442\u0430\u0432\u0438\u0442\u044c" + ::msgcat::mcset ru "&Quit" "\u0412\u044b\u0445\u043e\u0434" + ::msgcat::mcset ru "&Red" " &\u041a\u0440\u0430\u0441\u043d\u044b\u0439" + ::msgcat::mcset ru "Replace existing file?" "\u0417\u0430\u043c\u0435\u043d\u0438\u0442\u044c \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0439 \u0444\u0430\u0439\u043b?" + ::msgcat::mcset ru "&Retry" "&\u041f\u043e\u0432\u0442\u043e\u0440\u0438\u0442\u044c" + ::msgcat::mcset ru "&Save" "&\u0421\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c" + ::msgcat::mcset ru "Save As" "\u0421\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u043a\u0430\u043a" + ::msgcat::mcset ru "Save To Log" "\u0421\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0432 \u0436\u0443\u0440\u043d\u0430\u043b" + ::msgcat::mcset ru "Select Log File" "\u0412\u044b\u0431\u0440\u0430\u0442\u044c \u0436\u0443\u0440\u043d\u0430\u043b" + ::msgcat::mcset ru "Select a file to source" "\u0412\u044b\u0431\u0435\u0440\u0438\u0442\u0435 \u0444\u0430\u0439\u043b \u0434\u043b\u044f \u0438\u043d\u0442\u0435\u0440\u043f\u0440\u0435\u0442\u0430\u0446\u0438\u0438" + ::msgcat::mcset ru "&Selection:" + ::msgcat::mcset ru "Skip Messages" "\u041f\u0440\u043e\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f" + ::msgcat::mcset ru "&Source..." "\u0418\u043d\u0442\u0435\u0440\u043f\u0440\u0435\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0444\u0430\u0439\u043b..." + ::msgcat::mcset ru "Tcl Scripts" "\u041f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430 \u043d\u0430 \u044f\u0437\u044b\u043a\u0435 TCL" + ::msgcat::mcset ru "Tcl for Windows" "TCL \u0434\u043b\u044f Windows" + ::msgcat::mcset ru "Text Files" "\u0422\u0435\u043a\u0441\u0442\u043e\u0432\u044b\u0435 \u0444\u0430\u0439\u043b\u044b" + ::msgcat::mcset ru "&Yes" "&\u0414\u0430" + ::msgcat::mcset ru "abort" "\u043e\u0442\u043c\u0435\u043d\u0430" + ::msgcat::mcset ru "blue" " \u0433\u043e\u043b\u0443\u0431\u043e\u0439" + ::msgcat::mcset ru "cancel" "\u043e\u0442\u043c\u0435\u043d\u0430" + ::msgcat::mcset ru "extension" "\u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0435" + ::msgcat::mcset ru "extensions" "\u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f" + ::msgcat::mcset ru "green" " \u0437\u0435\u043b\u0435\u043d\u044b\u0439" + ::msgcat::mcset ru "ignore" "\u043f\u0440\u043e\u043f\u0443\u0441\u0442\u0438\u0442\u044c" + ::msgcat::mcset ru "ok" "\u043e\u043a" + ::msgcat::mcset ru "red" " \u043a\u0440\u0430\u0441\u043d\u044b\u0439" + ::msgcat::mcset ru "retry" "\u043f\u043e\u0432\u0442\u043e\u0440\u0438\u0442\u044c" + ::msgcat::mcset ru "yes" "\u0434\u0430" +} + diff --git a/env/tcl/tk8.6/msgs/sv.msg b/env/tcl/tk8.6/msgs/sv.msg new file mode 100644 index 0000000..62bfcbd --- /dev/null +++ b/env/tcl/tk8.6/msgs/sv.msg @@ -0,0 +1,76 @@ +namespace eval ::tk { + ::msgcat::mcset sv "&Abort" "&Avsluta" + ::msgcat::mcset sv "&About..." "&Om..." + ::msgcat::mcset sv "All Files" "Samtliga filer" + ::msgcat::mcset sv "Application Error" "Programfel" + ::msgcat::mcset sv "&Blue" "&Bl\u00e5" + ::msgcat::mcset sv "Cancel" "Avbryt" + ::msgcat::mcset sv "&Cancel" "&Avbryt" + ::msgcat::mcset sv "Cannot change to the directory \"%1\$s\".\nPermission denied." "Kan ej n\u00e5 mappen \"%1\$s\".\nSaknar r\u00e4ttigheter." + ::msgcat::mcset sv "Choose Directory" "V\u00e4lj mapp" + ::msgcat::mcset sv "Cl&ear" "&Radera" + ::msgcat::mcset sv "&Clear Console" "&Radera konsollen" + ::msgcat::mcset sv "Color" "F\u00e4rg" + ::msgcat::mcset sv "Console" "Konsoll" + ::msgcat::mcset sv "&Copy" "&Kopiera" + ::msgcat::mcset sv "Cu&t" "Klipp u&t" + ::msgcat::mcset sv "&Delete" "&Radera" + ::msgcat::mcset sv "Details >>" "Detaljer >>" + ::msgcat::mcset sv "Directory \"%1\$s\" does not exist." "Mappen \"%1\$s\" finns ej." + ::msgcat::mcset sv "&Directory:" "&Mapp:" + ::msgcat::mcset sv "&Edit" "R&edigera" + ::msgcat::mcset sv "Error: %1\$s" "Fel: %1\$s" + ::msgcat::mcset sv "E&xit" "&Avsluta" + ::msgcat::mcset sv "&File" "&Fil" + ::msgcat::mcset sv "File \"%1\$s\" already exists.\nDo you want to overwrite it?" "Filen \"%1\$s\" finns redan.\nVill du skriva \u00f6ver den?" + ::msgcat::mcset sv "File \"%1\$s\" already exists.\n\n" "Filen \"%1\$s\" finns redan.\n\n" + ::msgcat::mcset sv "File \"%1\$s\" does not exist." "Filen \"%1\$s\" finns ej." + ::msgcat::mcset sv "File &name:" "Fil&namn:" + ::msgcat::mcset sv "File &names:" "Fil&namn:" + ::msgcat::mcset sv "Files of &type:" "Filer av &typ:" + ::msgcat::mcset sv "Fi&les:" "Fi&ler:" + ::msgcat::mcset sv "&Filter" + ::msgcat::mcset sv "Fil&ter:" + ::msgcat::mcset sv "&Green" "&Gr\u00f6n" + ::msgcat::mcset sv "&Help" "&Hj\u00e4lp" + ::msgcat::mcset sv "Hi" "Hej" + ::msgcat::mcset sv "&Hide Console" "&G\u00f6m konsollen" + ::msgcat::mcset sv "&Ignore" "&Ignorera" + ::msgcat::mcset sv "Invalid file name \"%1\$s\"." "Ogiltigt filnamn \"%1\$s\"." + ::msgcat::mcset sv "Log Files" "Loggfiler" + ::msgcat::mcset sv "&No" "&Nej" + ::msgcat::mcset sv "&OK" + ::msgcat::mcset sv "OK" + ::msgcat::mcset sv "Ok" + ::msgcat::mcset sv "Open" "\u00d6ppna" + ::msgcat::mcset sv "&Open" "&\u00d6ppna" + ::msgcat::mcset sv "Open Multiple Files" "\u00d6ppna flera filer" + ::msgcat::mcset sv "P&aste" "&Klistra in" + ::msgcat::mcset sv "&Quit" "&Avsluta" + ::msgcat::mcset sv "&Red" "&R\u00f6d" + ::msgcat::mcset sv "Replace existing file?" "Ers\u00e4tt existerande fil?" + ::msgcat::mcset sv "&Retry" "&F\u00f6rs\u00f6k igen" + ::msgcat::mcset sv "&Save" "&Spara" + ::msgcat::mcset sv "Save As" "Spara som" + ::msgcat::mcset sv "Save To Log" "Spara till logg" + ::msgcat::mcset sv "Select Log File" "V\u00e4lj loggfil" + ::msgcat::mcset sv "Select a file to source" "V\u00e4lj k\u00e4llfil" + ::msgcat::mcset sv "&Selection:" "&Val:" + ::msgcat::mcset sv "Skip Messages" "Hoppa \u00f6ver meddelanden" + ::msgcat::mcset sv "&Source..." "&K\u00e4lla..." + ::msgcat::mcset sv "Tcl Scripts" "Tcl skript" + ::msgcat::mcset sv "Tcl for Windows" "Tcl f\u00f6r Windows" + ::msgcat::mcset sv "Text Files" "Textfiler" + ::msgcat::mcset sv "&Yes" "&Ja" + ::msgcat::mcset sv "abort" "avbryt" + ::msgcat::mcset sv "blue" "bl\u00e5" + ::msgcat::mcset sv "cancel" "avbryt" + ::msgcat::mcset sv "extension" "utvidgning" + ::msgcat::mcset sv "extensions" "utvidgningar" + ::msgcat::mcset sv "green" "gr\u00f6n" + ::msgcat::mcset sv "ignore" "ignorera" + ::msgcat::mcset sv "ok" + ::msgcat::mcset sv "red" "r\u00f6d" + ::msgcat::mcset sv "retry" "f\u00f6rs\u00f6k igen" + ::msgcat::mcset sv "yes" "ja" +} diff --git a/env/tcl/tk8.6/obsolete.tcl b/env/tcl/tk8.6/obsolete.tcl new file mode 100644 index 0000000..3ee7f28 --- /dev/null +++ b/env/tcl/tk8.6/obsolete.tcl @@ -0,0 +1,178 @@ +# obsolete.tcl -- +# +# This file contains obsolete procedures that people really shouldn't +# be using anymore, but which are kept around for backward compatibility. +# +# Copyright (c) 1994 The Regents of the University of California. +# Copyright (c) 1994 Sun Microsystems, Inc. +# +# See the file "license.terms" for information on usage and redistribution +# of this file, and for a DISCLAIMER OF ALL WARRANTIES. +# + +# The procedures below are here strictly for backward compatibility with +# Tk version 3.6 and earlier. The procedures are no longer needed, so +# they are no-ops. You should not use these procedures anymore, since +# they may be removed in some future release. + +proc tk_menuBar args {} +proc tk_bindForTraversal args {} + +# ::tk::classic::restore -- +# +# Restore the pre-8.5 (Tk classic) look as the widget defaults for classic +# Tk widgets. +# +# The value following an 'option add' call is the new 8.5 value. +# +namespace eval ::tk::classic { + # This may need to be adjusted for some window managers that are + # more aggressive with their own Xdefaults (like KDE and CDE) + variable prio "widgetDefault" +} + +proc ::tk::classic::restore {args} { + # Restore classic (8.4) look to classic Tk widgets + variable prio + + if {[llength $args]} { + foreach what $args { + ::tk::classic::restore_$what + } + } else { + foreach cmd [info procs restore_*] { + $cmd + } + } +} + +proc ::tk::classic::restore_font {args} { + # Many widgets were adjusted from hard-coded defaults to using the + # TIP#145 fonts defined in fonts.tcl (eg TkDefaultFont, TkFixedFont, ...) + # For restoring compatibility, we only correct size and weighting changes, + # as the fonts themselves remained mostly the same. + if {[tk windowingsystem] eq "x11"} { + font configure TkDefaultFont -weight bold ; # normal + font configure TkFixedFont -size -12 ; # -10 + } + # Add these with prio 21 to override value in dialog/msgbox.tcl + if {[tk windowingsystem] eq "aqua"} { + option add *Dialog.msg.font system 21; # TkCaptionFont + option add *Dialog.dtl.font system 21; # TkCaptionFont + option add *ErrorDialog*Label.font system 21; # TkCaptionFont + } else { + option add *Dialog.msg.font {Times 12} 21; # TkCaptionFont + option add *Dialog.dtl.font {Times 10} 21; # TkCaptionFont + option add *ErrorDialog*Label.font {Times -18} 21; # TkCaptionFont + } +} + +proc ::tk::classic::restore_button {args} { + variable prio + if {[tk windowingsystem] eq "x11"} { + foreach cls {Button Radiobutton Checkbutton} { + option add *$cls.borderWidth 2 $prio; # 1 + } + } +} + +proc ::tk::classic::restore_entry {args} { + variable prio + # Entry and Spinbox share core defaults + foreach cls {Entry Spinbox} { + if {[tk windowingsystem] ne "aqua"} { + option add *$cls.borderWidth 2 $prio; # 1 + } + if {[tk windowingsystem] eq "x11"} { + option add *$cls.background "#d9d9d9" $prio; # "white" + option add *$cls.selectBorderWidth 1 $prio; # 0 + } + } +} + +proc ::tk::classic::restore_listbox {args} { + variable prio + if {[tk windowingsystem] ne "win32"} { + option add *Listbox.background "#d9d9d9" $prio; # "white" + option add *Listbox.activeStyle "underline" $prio; # "dotbox" + } + if {[tk windowingsystem] ne "aqua"} { + option add *Listbox.borderWidth 2 $prio; # 1 + } + if {[tk windowingsystem] eq "x11"} { + option add *Listbox.selectBorderWidth 1 $prio; # 0 + } + # Remove focus into Listbox added for 8.5 + bind Listbox <1> { + if {[winfo exists %W]} { + tk::ListboxBeginSelect %W [%W index @%x,%y] + } + } +} + +proc ::tk::classic::restore_menu {args} { + variable prio + if {[tk windowingsystem] eq "x11"} { + option add *Menu.activeBorderWidth 2 $prio; # 1 + option add *Menu.borderWidth 2 $prio; # 1 + option add *Menu.clickToFocus true $prio + option add *Menu.useMotifHelp true $prio + } + if {[tk windowingsystem] ne "aqua"} { + option add *Menu.font "TkDefaultFont" $prio; # "TkMenuFont" + } +} + +proc ::tk::classic::restore_menubutton {args} { + variable prio + option add *Menubutton.borderWidth 2 $prio; # 1 +} + +proc ::tk::classic::restore_message {args} { + variable prio + option add *Message.borderWidth 2 $prio; # 1 +} + +proc ::tk::classic::restore_panedwindow {args} { + variable prio + option add *Panedwindow.borderWidth 2 $prio; # 1 + option add *Panedwindow.sashWidth 2 $prio; # 3 + option add *Panedwindow.sashPad 2 $prio; # 0 + option add *Panedwindow.sashRelief raised $prio; # flat + option add *Panedwindow.opaqueResize 0 $prio; # 1 + if {[tk windowingsystem] ne "win32"} { + option add *Panedwindow.showHandle 1 $prio; # 0 + } +} + +proc ::tk::classic::restore_scale {args} { + variable prio + option add *Scale.borderWidth 2 $prio; # 1 + if {[tk windowingsystem] eq "x11"} { + option add *Scale.troughColor "#c3c3c3" $prio; # "#b3b3b3" + } +} + +proc ::tk::classic::restore_scrollbar {args} { + variable prio + if {[tk windowingsystem] eq "x11"} { + option add *Scrollbar.borderWidth 2 $prio; # 1 + option add *Scrollbar.highlightThickness 1 $prio; # 0 + option add *Scrollbar.width 15 $prio; # 11 + option add *Scrollbar.troughColor "#c3c3c3" $prio; # "#b3b3b3" + } +} + +proc ::tk::classic::restore_text {args} { + variable prio + if {[tk windowingsystem] ne "aqua"} { + option add *Text.borderWidth 2 $prio; # 1 + } + if {[tk windowingsystem] eq "win32"} { + option add *Text.font "TkDefaultFont" $prio; # "TkFixedFont" + } + if {[tk windowingsystem] eq "x11"} { + option add *Text.background "#d9d9d9" $prio; # white + option add *Text.selectBorderWidth 1 $prio; # 0 + } +} diff --git a/env/tcl/tk8.6/optMenu.tcl b/env/tcl/tk8.6/optMenu.tcl new file mode 100644 index 0000000..7cfdaa0 --- /dev/null +++ b/env/tcl/tk8.6/optMenu.tcl @@ -0,0 +1,43 @@ +# optMenu.tcl -- +# +# This file defines the procedure tk_optionMenu, which creates +# an option button and its associated menu. +# +# Copyright (c) 1994 The Regents of the University of California. +# Copyright (c) 1994 Sun Microsystems, Inc. +# +# See the file "license.terms" for information on usage and redistribution +# of this file, and for a DISCLAIMER OF ALL WARRANTIES. +# + +# ::tk_optionMenu -- +# This procedure creates an option button named $w and an associated +# menu. Together they provide the functionality of Motif option menus: +# they can be used to select one of many values, and the current value +# appears in the global variable varName, as well as in the text of +# the option menubutton. The name of the menu is returned as the +# procedure's result, so that the caller can use it to change configuration +# options on the menu or otherwise manipulate it. +# +# Arguments: +# w - The name to use for the menubutton. +# varName - Global variable to hold the currently selected value. +# firstValue - First of legal values for option (must be >= 1). +# args - Any number of additional values. + +proc ::tk_optionMenu {w varName firstValue args} { + upvar #0 $varName var + + if {![info exists var]} { + set var $firstValue + } + menubutton $w -textvariable $varName -indicatoron 1 -menu $w.menu \ + -relief raised -highlightthickness 1 -anchor c \ + -direction flush + menu $w.menu -tearoff 0 + $w.menu add radiobutton -label $firstValue -variable $varName + foreach i $args { + $w.menu add radiobutton -label $i -variable $varName + } + return $w.menu +} diff --git a/env/tcl/tk8.6/palette.tcl b/env/tcl/tk8.6/palette.tcl new file mode 100644 index 0000000..42c6a90 --- /dev/null +++ b/env/tcl/tk8.6/palette.tcl @@ -0,0 +1,244 @@ +# palette.tcl -- +# +# This file contains procedures that change the color palette used +# by Tk. +# +# Copyright (c) 1995-1997 Sun Microsystems, Inc. +# +# See the file "license.terms" for information on usage and redistribution +# of this file, and for a DISCLAIMER OF ALL WARRANTIES. +# + +# ::tk_setPalette -- +# Changes the default color scheme for a Tk application by setting +# default colors in the option database and by modifying all of the +# color options for existing widgets that have the default value. +# +# Arguments: +# The arguments consist of either a single color name, which +# will be used as the new background color (all other colors will +# be computed from this) or an even number of values consisting of +# option names and values. The name for an option is the one used +# for the option database, such as activeForeground, not -activeforeground. + +proc ::tk_setPalette {args} { + if {[winfo depth .] == 1} { + # Just return on monochrome displays, otherwise errors will occur + return + } + + # Create an array that has the complete new palette. If some colors + # aren't specified, compute them from other colors that are specified. + + if {[llength $args] == 1} { + set new(background) [lindex $args 0] + } else { + array set new $args + } + if {![info exists new(background)]} { + return -code error -errorcode {TK SET_PALETTE BACKGROUND} \ + "must specify a background color" + } + set bg [winfo rgb . $new(background)] + if {![info exists new(foreground)]} { + # Note that the range of each value in the triple returned by + # [winfo rgb] is 0-65535, and your eyes are more sensitive to + # green than to red, and more to red than to blue. + foreach {r g b} $bg {break} + if {$r+1.5*$g+0.5*$b > 100000} { + set new(foreground) black + } else { + set new(foreground) white + } + } + lassign [winfo rgb . $new(foreground)] fg_r fg_g fg_b + lassign $bg bg_r bg_g bg_b + set darkerBg [format #%02x%02x%02x [expr {(9*$bg_r)/2560}] \ + [expr {(9*$bg_g)/2560}] [expr {(9*$bg_b)/2560}]] + + foreach i {activeForeground insertBackground selectForeground \ + highlightColor} { + if {![info exists new($i)]} { + set new($i) $new(foreground) + } + } + if {![info exists new(disabledForeground)]} { + set new(disabledForeground) [format #%02x%02x%02x \ + [expr {(3*$bg_r + $fg_r)/1024}] \ + [expr {(3*$bg_g + $fg_g)/1024}] \ + [expr {(3*$bg_b + $fg_b)/1024}]] + } + if {![info exists new(highlightBackground)]} { + set new(highlightBackground) $new(background) + } + if {![info exists new(activeBackground)]} { + # Pick a default active background that islighter than the + # normal background. To do this, round each color component + # up by 15% or 1/3 of the way to full white, whichever is + # greater. + + foreach i {0 1 2} color $bg { + set light($i) [expr {$color/256}] + set inc1 [expr {($light($i)*15)/100}] + set inc2 [expr {(255-$light($i))/3}] + if {$inc1 > $inc2} { + incr light($i) $inc1 + } else { + incr light($i) $inc2 + } + if {$light($i) > 255} { + set light($i) 255 + } + } + set new(activeBackground) [format #%02x%02x%02x $light(0) \ + $light(1) $light(2)] + } + if {![info exists new(selectBackground)]} { + set new(selectBackground) $darkerBg + } + if {![info exists new(troughColor)]} { + set new(troughColor) $darkerBg + } + + # let's make one of each of the widgets so we know what the + # defaults are currently for this platform. + toplevel .___tk_set_palette + wm withdraw .___tk_set_palette + foreach q { + button canvas checkbutton entry frame label labelframe + listbox menubutton menu message radiobutton scale scrollbar + spinbox text + } { + $q .___tk_set_palette.$q + } + + # Walk the widget hierarchy, recoloring all existing windows. + # The option database must be set according to what we do here, + # but it breaks things if we set things in the database while + # we are changing colors...so, ::tk::RecolorTree now returns the + # option database changes that need to be made, and they + # need to be evalled here to take effect. + # We have to walk the whole widget tree instead of just + # relying on the widgets we've created above to do the work + # because different extensions may provide other kinds + # of widgets that we don't currently know about, so we'll + # walk the whole hierarchy just in case. + + eval [tk::RecolorTree . new] + + destroy .___tk_set_palette + + # Change the option database so that future windows will get the + # same colors. + + foreach option [array names new] { + option add *$option $new($option) widgetDefault + } + + # Save the options in the variable ::tk::Palette, for use the + # next time we change the options. + + array set ::tk::Palette [array get new] +} + +# ::tk::RecolorTree -- +# This procedure changes the colors in a window and all of its +# descendants, according to information provided by the colors +# argument. This looks at the defaults provided by the option +# database, if it exists, and if not, then it looks at the default +# value of the widget itself. +# +# Arguments: +# w - The name of a window. This window and all its +# descendants are recolored. +# colors - The name of an array variable in the caller, +# which contains color information. Each element +# is named after a widget configuration option, and +# each value is the value for that option. + +proc ::tk::RecolorTree {w colors} { + upvar $colors c + set result {} + set prototype .___tk_set_palette.[string tolower [winfo class $w]] + if {![winfo exists $prototype]} { + unset prototype + } + foreach dbOption [array names c] { + set option -[string tolower $dbOption] + set class [string replace $dbOption 0 0 [string toupper \ + [string index $dbOption 0]]] + if {![catch {$w configure $option} value]} { + # if the option database has a preference for this + # dbOption, then use it, otherwise use the defaults + # for the widget. + set defaultcolor [option get $w $dbOption $class] + if {$defaultcolor eq "" || \ + ([info exists prototype] && \ + [$prototype cget $option] ne "$defaultcolor")} { + set defaultcolor [lindex $value 3] + } + if {$defaultcolor ne ""} { + set defaultcolor [winfo rgb . $defaultcolor] + } + set chosencolor [lindex $value 4] + if {$chosencolor ne ""} { + set chosencolor [winfo rgb . $chosencolor] + } + if {[string match $defaultcolor $chosencolor]} { + # Change the option database so that future windows will get + # the same colors. + append result ";\noption add [list \ + *[winfo class $w].$dbOption $c($dbOption) 60]" + $w configure $option $c($dbOption) + } + } + } + foreach child [winfo children $w] { + append result ";\n[::tk::RecolorTree $child c]" + } + return $result +} + +# ::tk::Darken -- +# Given a color name, computes a new color value that darkens (or +# brightens) the given color by a given percent. +# +# Arguments: +# color - Name of starting color. +# percent - Integer telling how much to brighten or darken as a +# percent: 50 means darken by 50%, 110 means brighten +# by 10%. + +proc ::tk::Darken {color percent} { + if {$percent < 0} { + return #000000 + } elseif {$percent > 200} { + return #ffffff + } elseif {$percent <= 100} { + lassign [winfo rgb . $color] r g b + set r [expr {($r/256)*$percent/100}] + set g [expr {($g/256)*$percent/100}] + set b [expr {($b/256)*$percent/100}] + } elseif {$percent > 100} { + lassign [winfo rgb . $color] r g b + set r [expr {255 - ((65535-$r)/256)*(200-$percent)/100}] + set g [expr {255 - ((65535-$g)/256)*(200-$percent)/100}] + set b [expr {255 - ((65535-$b)/256)*(200-$percent)/100}] + } + return [format #%02x%02x%02x $r $g $b] +} + +# ::tk_bisque -- +# Reset the Tk color palette to the old "bisque" colors. +# +# Arguments: +# None. + +proc ::tk_bisque {} { + tk_setPalette activeBackground #e6ceb1 activeForeground black \ + background #ffe4c4 disabledForeground #b0b0b0 foreground black \ + highlightBackground #ffe4c4 highlightColor black \ + insertBackground black \ + selectBackground #e6ceb1 selectForeground black \ + troughColor #cdb79e +} diff --git a/env/tcl/tk8.6/panedwindow.tcl b/env/tcl/tk8.6/panedwindow.tcl new file mode 100644 index 0000000..d3dfabc --- /dev/null +++ b/env/tcl/tk8.6/panedwindow.tcl @@ -0,0 +1,194 @@ +# panedwindow.tcl -- +# +# This file defines the default bindings for Tk panedwindow widgets and +# provides procedures that help in implementing those bindings. + +bind Panedwindow { ::tk::panedwindow::MarkSash %W %x %y 1 } +bind Panedwindow { ::tk::panedwindow::MarkSash %W %x %y 0 } + +bind Panedwindow { ::tk::panedwindow::DragSash %W %x %y 1 } +bind Panedwindow { ::tk::panedwindow::DragSash %W %x %y 0 } + +bind Panedwindow {::tk::panedwindow::ReleaseSash %W 1} +bind Panedwindow {::tk::panedwindow::ReleaseSash %W 0} + +bind Panedwindow { ::tk::panedwindow::Motion %W %x %y } + +bind Panedwindow { ::tk::panedwindow::Leave %W } + +# Initialize namespace +namespace eval ::tk::panedwindow {} + +# ::tk::panedwindow::MarkSash -- +# +# Handle marking the correct sash for possible dragging +# +# Arguments: +# w the widget +# x widget local x coord +# y widget local y coord +# proxy whether this should be a proxy sash +# Results: +# None +# +proc ::tk::panedwindow::MarkSash {w x y proxy} { + variable ::tk::Priv + if {[$w cget -opaqueresize]} { + set proxy 0 + } + set what [$w identify $x $y] + if { [llength $what] == 2 } { + lassign $what index which + if {!$::tk_strictMotif || $which eq "handle"} { + if {!$proxy} { + $w sash mark $index $x $y + } + set Priv(sash) $index + lassign [$w sash coord $index] sx sy + set Priv(dx) [expr {$sx-$x}] + set Priv(dy) [expr {$sy-$y}] + # Do this to init the proxy location + DragSash $w $x $y $proxy + } + } +} + +# ::tk::panedwindow::DragSash -- +# +# Handle dragging of the correct sash +# +# Arguments: +# w the widget +# x widget local x coord +# y widget local y coord +# proxy whether this should be a proxy sash +# Results: +# Moves sash +# +proc ::tk::panedwindow::DragSash {w x y proxy} { + variable ::tk::Priv + if {[$w cget -opaqueresize]} { + set proxy 0 + } + if {[info exists Priv(sash)]} { + if {$proxy} { + $w proxy place [expr {$x+$Priv(dx)}] [expr {$y+$Priv(dy)}] + } else { + $w sash place $Priv(sash) \ + [expr {$x+$Priv(dx)}] [expr {$y+$Priv(dy)}] + } + } +} + +# ::tk::panedwindow::ReleaseSash -- +# +# Handle releasing of the sash +# +# Arguments: +# w the widget +# proxy whether this should be a proxy sash +# Results: +# Returns ... +# +proc ::tk::panedwindow::ReleaseSash {w proxy} { + variable ::tk::Priv + if {[$w cget -opaqueresize]} { + set proxy 0 + } + if {[info exists Priv(sash)]} { + if {$proxy} { + lassign [$w proxy coord] x y + $w sash place $Priv(sash) $x $y + $w proxy forget + } + unset Priv(sash) Priv(dx) Priv(dy) + } +} + +# ::tk::panedwindow::Motion -- +# +# Handle motion on the widget. This is used to change the cursor +# when the user moves over the sash area. +# +# Arguments: +# w the widget +# x widget local x coord +# y widget local y coord +# Results: +# May change the cursor. Sets up a timer to verify that we are still +# over the widget. +# +proc ::tk::panedwindow::Motion {w x y} { + variable ::tk::Priv + set id [$w identify $x $y] + if {([llength $id] == 2) && \ + (!$::tk_strictMotif || [lindex $id 1] eq "handle")} { + if {![info exists Priv($w,panecursor)]} { + set Priv($w,panecursor) [$w cget -cursor] + if {[$w cget -sashcursor] ne ""} { + $w configure -cursor [$w cget -sashcursor] + } elseif {[$w cget -orient] eq "horizontal"} { + $w configure -cursor sb_h_double_arrow + } else { + $w configure -cursor sb_v_double_arrow + } + if {[info exists Priv($w,pwAfterId)]} { + after cancel $Priv($w,pwAfterId) + } + set Priv($w,pwAfterId) [after 150 \ + [list ::tk::panedwindow::Cursor $w]] + } + return + } + if {[info exists Priv($w,panecursor)]} { + $w configure -cursor $Priv($w,panecursor) + unset Priv($w,panecursor) + } +} + +# ::tk::panedwindow::Cursor -- +# +# Handles returning the normal cursor when we are no longer over the +# sash area. This needs to be done this way, because the panedwindow +# won't see Leave events when the mouse moves from the sash to a +# paned child, although the child does receive an Enter event. +# +# Arguments: +# w the widget +# Results: +# May restore the default cursor, or schedule a timer to do it. +# +proc ::tk::panedwindow::Cursor {w} { + variable ::tk::Priv + # Make sure to check window existence in case it is destroyed. + if {[info exists Priv($w,panecursor)] && [winfo exists $w]} { + if {[winfo containing [winfo pointerx $w] [winfo pointery $w]] eq $w} { + set Priv($w,pwAfterId) [after 150 \ + [list ::tk::panedwindow::Cursor $w]] + } else { + $w configure -cursor $Priv($w,panecursor) + unset Priv($w,panecursor) + if {[info exists Priv($w,pwAfterId)]} { + after cancel $Priv($w,pwAfterId) + unset Priv($w,pwAfterId) + } + } + } +} + +# ::tk::panedwindow::Leave -- +# +# Return to default cursor when leaving the pw widget. +# +# Arguments: +# w the widget +# Results: +# Restores the default cursor +# +proc ::tk::panedwindow::Leave {w} { + variable ::tk::Priv + if {[info exists Priv($w,panecursor)]} { + $w configure -cursor $Priv($w,panecursor) + unset Priv($w,panecursor) + } +} diff --git a/env/tcl/tk8.6/pkgIndex.tcl b/env/tcl/tk8.6/pkgIndex.tcl new file mode 100644 index 0000000..f3acba7 --- /dev/null +++ b/env/tcl/tk8.6/pkgIndex.tcl @@ -0,0 +1,7 @@ +if {[catch {package present Tcl 8.6.0}]} { return } +if {($::tcl_platform(platform) eq "unix") && ([info exists ::env(DISPLAY)] + || ([info exists ::argv] && ("-display" in $::argv)))} { + package ifneeded Tk 8.6.9 [list load [file join $dir .. .. bin libtk8.6.dll] Tk] +} else { + package ifneeded Tk 8.6.9 [list load [file join $dir .. .. bin tk86t.dll] Tk] +} diff --git a/env/tcl/tk8.6/safetk.tcl b/env/tcl/tk8.6/safetk.tcl new file mode 100644 index 0000000..9f8e25d --- /dev/null +++ b/env/tcl/tk8.6/safetk.tcl @@ -0,0 +1,262 @@ +# safetk.tcl -- +# +# Support procs to use Tk in safe interpreters. +# +# Copyright (c) 1997 Sun Microsystems, Inc. +# +# See the file "license.terms" for information on usage and redistribution +# of this file, and for a DISCLAIMER OF ALL WARRANTIES. + +# see safetk.n for documentation + +# +# +# Note: It is now ok to let untrusted code being executed +# between the creation of the interp and the actual loading +# of Tk in that interp because the C side Tk_Init will +# now look up the master interp and ask its safe::TkInit +# for the actual parameters to use for it's initialization (if allowed), +# not relying on the slave state. +# + +# We use opt (optional arguments parsing) +package require opt 0.4.1; + +namespace eval ::safe { + + # counter for safe toplevels + variable tkSafeId 0 +} + +# +# tkInterpInit : prepare the slave interpreter for tk loading +# most of the real job is done by loadTk +# returns the slave name (tkInterpInit does) +# +proc ::safe::tkInterpInit {slave argv} { + global env tk_library + + # We have to make sure that the tk_library variable is normalized. + set tk_library [file normalize $tk_library] + + # Clear Tk's access for that interp (path). + allowTk $slave $argv + + # Ensure tk_library and subdirs (eg, ttk) are on the access path + ::interp eval $slave [list set tk_library [::safe::interpAddToAccessPath $slave $tk_library]] + foreach subdir [::safe::AddSubDirs [list $tk_library]] { + ::safe::interpAddToAccessPath $slave $subdir + } + return $slave +} + + +# tkInterpLoadTk: +# Do additional configuration as needed (calling tkInterpInit) +# and actually load Tk into the slave. +# +# Either contained in the specified windowId (-use) or +# creating a decorated toplevel for it. + +# empty definition for auto_mkIndex +proc ::safe::loadTk {} {} + +::tcl::OptProc ::safe::loadTk { + {slave -interp "name of the slave interpreter"} + {-use -windowId {} "window Id to use (new toplevel otherwise)"} + {-display -displayName {} "display name to use (current one otherwise)"} +} { + set displayGiven [::tcl::OptProcArgGiven "-display"] + if {!$displayGiven} { + # Try to get the current display from "." + # (which might not exist if the master is tk-less) + if {[catch {set display [winfo screen .]}]} { + if {[info exists ::env(DISPLAY)]} { + set display $::env(DISPLAY) + } else { + Log $slave "no winfo screen . nor env(DISPLAY)" WARNING + set display ":0.0" + } + } + } + + # Get state for access to the cleanupHook. + namespace upvar ::safe S$slave state + + if {![::tcl::OptProcArgGiven "-use"]} { + # create a decorated toplevel + lassign [tkTopLevel $slave $display] w use + + # set our delete hook (slave arg is added by interpDelete) + # to clean up both window related code and tkInit(slave) + set state(cleanupHook) [list tkDelete {} $w] + } else { + # set our delete hook (slave arg is added by interpDelete) + # to clean up tkInit(slave) + set state(cleanupHook) [list disallowTk] + + # Let's be nice and also accept tk window names instead of ids + if {[string match ".*" $use]} { + set windowName $use + set use [winfo id $windowName] + set nDisplay [winfo screen $windowName] + } else { + # Check for a better -display value + # (works only for multi screens on single host, but not + # cross hosts, for that a tk window name would be better + # but embeding is also usefull for non tk names) + if {![catch {winfo pathname $use} name]} { + set nDisplay [winfo screen $name] + } else { + # Can't have a better one + set nDisplay $display + } + } + if {$nDisplay ne $display} { + if {$displayGiven} { + return -code error -errorcode {TK DISPLAY SAFE} \ + "conflicting -display $display and -use $use -> $nDisplay" + } else { + set display $nDisplay + } + } + } + + # Prepares the slave for tk with those parameters + tkInterpInit $slave [list "-use" $use "-display" $display] + + load {} Tk $slave + + return $slave +} + +proc ::safe::TkInit {interpPath} { + variable tkInit + if {[info exists tkInit($interpPath)]} { + set value $tkInit($interpPath) + Log $interpPath "TkInit called, returning \"$value\"" NOTICE + return $value + } else { + Log $interpPath "TkInit called for interp with clearance:\ + preventing Tk init" ERROR + return -code error -errorcode {TK SAFE PERMISSION} "not allowed" + } +} + +# safe::allowTk -- +# +# Set tkInit(interpPath) to allow Tk to be initialized in +# safe::TkInit. +# +# Arguments: +# interpPath slave interpreter handle +# argv arguments passed to safe::TkInterpInit +# +# Results: +# none. + +proc ::safe::allowTk {interpPath argv} { + variable tkInit + set tkInit($interpPath) $argv + return +} + + +# safe::disallowTk -- +# +# Unset tkInit(interpPath) to disallow Tk from getting initialized +# in safe::TkInit. +# +# Arguments: +# interpPath slave interpreter handle +# +# Results: +# none. + +proc ::safe::disallowTk {interpPath} { + variable tkInit + # This can already be deleted by the DeleteHook of the interp + if {[info exists tkInit($interpPath)]} { + unset tkInit($interpPath) + } + return +} + + +# safe::tkDelete -- +# +# Clean up the window associated with the interp being deleted. +# +# Arguments: +# interpPath slave interpreter handle +# +# Results: +# none. + +proc ::safe::tkDelete {W window slave} { + + # we are going to be called for each widget... skip untill it's + # top level + + Log $slave "Called tkDelete $W $window" NOTICE + if {[::interp exists $slave]} { + if {[catch {::safe::interpDelete $slave} msg]} { + Log $slave "Deletion error : $msg" + } + } + if {[winfo exists $window]} { + Log $slave "Destroy toplevel $window" NOTICE + destroy $window + } + + # clean up tkInit(slave) + disallowTk $slave + return +} + +proc ::safe::tkTopLevel {slave display} { + variable tkSafeId + incr tkSafeId + set w ".safe$tkSafeId" + if {[catch {toplevel $w -screen $display -class SafeTk} msg]} { + return -code error -errorcode {TK TOPLEVEL SAFE} \ + "Unable to create toplevel for safe slave \"$slave\" ($msg)" + } + Log $slave "New toplevel $w" NOTICE + + set msg "Untrusted Tcl applet ($slave)" + wm title $w $msg + + # Control frame (we must create a style for it) + ttk::style layout TWarningFrame {WarningFrame.border -sticky nswe} + ttk::style configure TWarningFrame -background red + + set wc $w.fc + ttk::frame $wc -relief ridge -borderwidth 4 -style TWarningFrame + + # We will destroy the interp when the window is destroyed + bindtags $wc [concat Safe$wc [bindtags $wc]] + bind Safe$wc [list ::safe::tkDelete %W $w $slave] + + ttk::label $wc.l -text $msg -anchor w + + # We want the button to be the last visible item + # (so be packed first) and at the right and not resizing horizontally + + # frame the button so it does not expand horizontally + # but still have the default background instead of red one from the parent + ttk::frame $wc.fb -borderwidth 0 + ttk::button $wc.fb.b -text "Delete" \ + -command [list ::safe::tkDelete $w $w $slave] + pack $wc.fb.b -side right -fill both + pack $wc.fb -side right -fill both -expand 1 + pack $wc.l -side left -fill both -expand 1 -ipady 2 + pack $wc -side bottom -fill x + + # Container frame + frame $w.c -container 1 + pack $w.c -fill both -expand 1 + + # return both the toplevel window name and the id to use for embedding + list $w [winfo id $w.c] +} diff --git a/env/tcl/tk8.6/scale.tcl b/env/tcl/tk8.6/scale.tcl new file mode 100644 index 0000000..fb9b81b --- /dev/null +++ b/env/tcl/tk8.6/scale.tcl @@ -0,0 +1,290 @@ +# scale.tcl -- +# +# This file defines the default bindings for Tk scale widgets and provides +# procedures that help in implementing the bindings. +# +# Copyright (c) 1994 The Regents of the University of California. +# Copyright (c) 1994-1995 Sun Microsystems, Inc. +# +# See the file "license.terms" for information on usage and redistribution +# of this file, and for a DISCLAIMER OF ALL WARRANTIES. +# + +#------------------------------------------------------------------------- +# The code below creates the default class bindings for entries. +#------------------------------------------------------------------------- + +# Standard Motif bindings: + +bind Scale { + if {$tk_strictMotif} { + set tk::Priv(activeBg) [%W cget -activebackground] + %W configure -activebackground [%W cget -background] + } + tk::ScaleActivate %W %x %y +} +bind Scale { + tk::ScaleActivate %W %x %y +} +bind Scale { + if {$tk_strictMotif} { + %W configure -activebackground $tk::Priv(activeBg) + } + if {[%W cget -state] eq "active"} { + %W configure -state normal + } +} +bind Scale <1> { + tk::ScaleButtonDown %W %x %y +} +bind Scale { + tk::ScaleDrag %W %x %y +} +bind Scale { } +bind Scale { } +bind Scale { + tk::CancelRepeat + tk::ScaleEndDrag %W + tk::ScaleActivate %W %x %y +} +bind Scale <2> { + tk::ScaleButton2Down %W %x %y +} +bind Scale { + tk::ScaleDrag %W %x %y +} +bind Scale { } +bind Scale { } +bind Scale { + tk::CancelRepeat + tk::ScaleEndDrag %W + tk::ScaleActivate %W %x %y +} +if {[tk windowingsystem] eq "win32"} { + # On Windows do the same with button 3, as that is the right mouse button + bind Scale <3> [bind Scale <2>] + bind Scale [bind Scale ] + bind Scale [bind Scale ] + bind Scale [bind Scale ] + bind Scale [bind Scale ] +} +bind Scale { + tk::ScaleControlPress %W %x %y +} +bind Scale <> { + tk::ScaleIncrement %W up little noRepeat +} +bind Scale <> { + tk::ScaleIncrement %W down little noRepeat +} +bind Scale <> { + tk::ScaleIncrement %W up little noRepeat +} +bind Scale <> { + tk::ScaleIncrement %W down little noRepeat +} +bind Scale <> { + tk::ScaleIncrement %W up big noRepeat +} +bind Scale <> { + tk::ScaleIncrement %W down big noRepeat +} +bind Scale <> { + tk::ScaleIncrement %W up big noRepeat +} +bind Scale <> { + tk::ScaleIncrement %W down big noRepeat +} +bind Scale <> { + %W set [%W cget -from] +} +bind Scale <> { + %W set [%W cget -to] +} + +# ::tk::ScaleActivate -- +# This procedure is invoked to check a given x-y position in the +# scale and activate the slider if the x-y position falls within +# the slider. +# +# Arguments: +# w - The scale widget. +# x, y - Mouse coordinates. + +proc ::tk::ScaleActivate {w x y} { + if {[$w cget -state] eq "disabled"} { + return + } + if {[$w identify $x $y] eq "slider"} { + set state active + } else { + set state normal + } + if {[$w cget -state] ne $state} { + $w configure -state $state + } +} + +# ::tk::ScaleButtonDown -- +# This procedure is invoked when a button is pressed in a scale. It +# takes different actions depending on where the button was pressed. +# +# Arguments: +# w - The scale widget. +# x, y - Mouse coordinates of button press. + +proc ::tk::ScaleButtonDown {w x y} { + variable ::tk::Priv + set Priv(dragging) 0 + set el [$w identify $x $y] + + # save the relief + set Priv($w,relief) [$w cget -sliderrelief] + + if {$el eq "trough1"} { + ScaleIncrement $w up little initial + } elseif {$el eq "trough2"} { + ScaleIncrement $w down little initial + } elseif {$el eq "slider"} { + set Priv(dragging) 1 + set Priv(initValue) [$w get] + set coords [$w coords] + set Priv(deltaX) [expr {$x - [lindex $coords 0]}] + set Priv(deltaY) [expr {$y - [lindex $coords 1]}] + switch -exact -- $Priv($w,relief) { + "raised" { $w configure -sliderrelief sunken } + "ridge" { $w configure -sliderrelief groove } + } + } +} + +# ::tk::ScaleDrag -- +# This procedure is called when the mouse is dragged with +# mouse button 1 down. If the drag started inside the slider +# (i.e. the scale is active) then the scale's value is adjusted +# to reflect the mouse's position. +# +# Arguments: +# w - The scale widget. +# x, y - Mouse coordinates. + +proc ::tk::ScaleDrag {w x y} { + variable ::tk::Priv + if {!$Priv(dragging)} { + return + } + $w set [$w get [expr {$x-$Priv(deltaX)}] [expr {$y-$Priv(deltaY)}]] +} + +# ::tk::ScaleEndDrag -- +# This procedure is called to end an interactive drag of the +# slider. It just marks the drag as over. +# +# Arguments: +# w - The scale widget. + +proc ::tk::ScaleEndDrag {w} { + variable ::tk::Priv + set Priv(dragging) 0 + if {[info exists Priv($w,relief)]} { + $w configure -sliderrelief $Priv($w,relief) + unset Priv($w,relief) + } +} + +# ::tk::ScaleIncrement -- +# This procedure is invoked to increment the value of a scale and +# to set up auto-repeating of the action if that is desired. The +# way the value is incremented depends on the "dir" and "big" +# arguments. +# +# Arguments: +# w - The scale widget. +# dir - "up" means move value towards -from, "down" means +# move towards -to. +# big - Size of increments: "big" or "little". +# repeat - Whether and how to auto-repeat the action: "noRepeat" +# means don't auto-repeat, "initial" means this is the +# first action in an auto-repeat sequence, and "again" +# means this is the second repetition or later. + +proc ::tk::ScaleIncrement {w dir big repeat} { + variable ::tk::Priv + if {![winfo exists $w]} return + if {$big eq "big"} { + set inc [$w cget -bigincrement] + if {$inc == 0} { + set inc [expr {abs([$w cget -to] - [$w cget -from])/10.0}] + } + if {$inc < [$w cget -resolution]} { + set inc [$w cget -resolution] + } + } else { + set inc [$w cget -resolution] + } + if {([$w cget -from] > [$w cget -to]) ^ ($dir eq "up")} { + if {$inc > 0} { + set inc [expr {-$inc}] + } + } else { + if {$inc < 0} { + set inc [expr {-$inc}] + } + } + $w set [expr {[$w get] + $inc}] + + if {$repeat eq "again"} { + set Priv(afterId) [after [$w cget -repeatinterval] \ + [list tk::ScaleIncrement $w $dir $big again]] + } elseif {$repeat eq "initial"} { + set delay [$w cget -repeatdelay] + if {$delay > 0} { + set Priv(afterId) [after $delay \ + [list tk::ScaleIncrement $w $dir $big again]] + } + } +} + +# ::tk::ScaleControlPress -- +# This procedure handles button presses that are made with the Control +# key down. Depending on the mouse position, it adjusts the scale +# value to one end of the range or the other. +# +# Arguments: +# w - The scale widget. +# x, y - Mouse coordinates where the button was pressed. + +proc ::tk::ScaleControlPress {w x y} { + set el [$w identify $x $y] + if {$el eq "trough1"} { + $w set [$w cget -from] + } elseif {$el eq "trough2"} { + $w set [$w cget -to] + } +} + +# ::tk::ScaleButton2Down +# This procedure is invoked when button 2 is pressed over a scale. +# It sets the value to correspond to the mouse position and starts +# a slider drag. +# +# Arguments: +# w - The scrollbar widget. +# x, y - Mouse coordinates within the widget. + +proc ::tk::ScaleButton2Down {w x y} { + variable ::tk::Priv + + if {[$w cget -state] eq "disabled"} { + return + } + + $w configure -state active + $w set [$w get $x $y] + set Priv(dragging) 1 + set Priv(initValue) [$w get] + set Priv($w,relief) [$w cget -sliderrelief] + set coords "$x $y" + set Priv(deltaX) 0 + set Priv(deltaY) 0 +} diff --git a/env/tcl/tk8.6/scrlbar.tcl b/env/tcl/tk8.6/scrlbar.tcl new file mode 100644 index 0000000..6f1caa2 --- /dev/null +++ b/env/tcl/tk8.6/scrlbar.tcl @@ -0,0 +1,454 @@ +# scrlbar.tcl -- +# +# This file defines the default bindings for Tk scrollbar widgets. +# It also provides procedures that help in implementing the bindings. +# +# Copyright (c) 1994 The Regents of the University of California. +# Copyright (c) 1994-1996 Sun Microsystems, Inc. +# +# See the file "license.terms" for information on usage and redistribution +# of this file, and for a DISCLAIMER OF ALL WARRANTIES. +# + +#------------------------------------------------------------------------- +# The code below creates the default class bindings for scrollbars. +#------------------------------------------------------------------------- + +# Standard Motif bindings: +if {[tk windowingsystem] eq "x11" || [tk windowingsystem] eq "aqua"} { + +bind Scrollbar { + if {$tk_strictMotif} { + set tk::Priv(activeBg) [%W cget -activebackground] + %W configure -activebackground [%W cget -background] + } + %W activate [%W identify %x %y] +} +bind Scrollbar { + %W activate [%W identify %x %y] +} + +# The "info exists" command in the following binding handles the +# situation where a Leave event occurs for a scrollbar without the Enter +# event. This seems to happen on some systems (such as Solaris 2.4) for +# unknown reasons. + +bind Scrollbar { + if {$tk_strictMotif && [info exists tk::Priv(activeBg)]} { + %W configure -activebackground $tk::Priv(activeBg) + } + %W activate {} +} +bind Scrollbar <1> { + tk::ScrollButtonDown %W %x %y +} +bind Scrollbar { + tk::ScrollDrag %W %x %y +} +bind Scrollbar { + tk::ScrollDrag %W %x %y +} +bind Scrollbar { + tk::ScrollButtonUp %W %x %y +} +bind Scrollbar { + # Prevents binding from being invoked. +} +bind Scrollbar { + # Prevents binding from being invoked. +} +bind Scrollbar <2> { + tk::ScrollButton2Down %W %x %y +} +bind Scrollbar { + # Do nothing, since button 1 is already down. +} +bind Scrollbar { + # Do nothing, since button 2 is already down. +} +bind Scrollbar { + tk::ScrollDrag %W %x %y +} +bind Scrollbar { + tk::ScrollButtonUp %W %x %y +} +bind Scrollbar { + # Do nothing: B1 release will handle it. +} +bind Scrollbar { + # Do nothing: B2 release will handle it. +} +bind Scrollbar { + # Prevents binding from being invoked. +} +bind Scrollbar { + # Prevents binding from being invoked. +} +bind Scrollbar { + tk::ScrollTopBottom %W %x %y +} +bind Scrollbar { + tk::ScrollTopBottom %W %x %y +} + +bind Scrollbar <> { + tk::ScrollByUnits %W v -1 +} +bind Scrollbar <> { + tk::ScrollByUnits %W v 1 +} +bind Scrollbar <> { + tk::ScrollByPages %W v -1 +} +bind Scrollbar <> { + tk::ScrollByPages %W v 1 +} +bind Scrollbar <> { + tk::ScrollByUnits %W h -1 +} +bind Scrollbar <> { + tk::ScrollByUnits %W h 1 +} +bind Scrollbar <> { + tk::ScrollByPages %W h -1 +} +bind Scrollbar <> { + tk::ScrollByPages %W h 1 +} +bind Scrollbar { + tk::ScrollByPages %W hv -1 +} +bind Scrollbar { + tk::ScrollByPages %W hv 1 +} +bind Scrollbar <> { + tk::ScrollToPos %W 0 +} +bind Scrollbar <> { + tk::ScrollToPos %W 1 +} +} +switch [tk windowingsystem] { + "aqua" { + bind Scrollbar { + tk::ScrollByUnits %W v [expr {- (%D)}] + } + bind Scrollbar { + tk::ScrollByUnits %W v [expr {-10 * (%D)}] + } + bind Scrollbar { + tk::ScrollByUnits %W h [expr {- (%D)}] + } + bind Scrollbar { + tk::ScrollByUnits %W h [expr {-10 * (%D)}] + } + } + "win32" { + bind Scrollbar { + tk::ScrollByUnits %W v [expr {- (%D / 120) * 4}] + } + bind Scrollbar { + tk::ScrollByUnits %W h [expr {- (%D / 120) * 4}] + } + } + "x11" { + bind Scrollbar { + tk::ScrollByUnits %W v [expr {- (%D /120 ) * 4}] + } + bind Scrollbar { + tk::ScrollByUnits %W h [expr {- (%D /120 ) * 4}] + } + bind Scrollbar <4> {tk::ScrollByUnits %W v -5} + bind Scrollbar <5> {tk::ScrollByUnits %W v 5} + bind Scrollbar {tk::ScrollByUnits %W h -5} + bind Scrollbar {tk::ScrollByUnits %W h 5} + } +} +# tk::ScrollButtonDown -- +# This procedure is invoked when a button is pressed in a scrollbar. +# It changes the way the scrollbar is displayed and takes actions +# depending on where the mouse is. +# +# Arguments: +# w - The scrollbar widget. +# x, y - Mouse coordinates. + +proc tk::ScrollButtonDown {w x y} { + variable ::tk::Priv + set Priv(relief) [$w cget -activerelief] + $w configure -activerelief sunken + set element [$w identify $x $y] + if {$element eq "slider"} { + ScrollStartDrag $w $x $y + } else { + ScrollSelect $w $element initial + } +} + +# ::tk::ScrollButtonUp -- +# This procedure is invoked when a button is released in a scrollbar. +# It cancels scans and auto-repeats that were in progress, and restores +# the way the active element is displayed. +# +# Arguments: +# w - The scrollbar widget. +# x, y - Mouse coordinates. + +proc ::tk::ScrollButtonUp {w x y} { + variable ::tk::Priv + tk::CancelRepeat + if {[info exists Priv(relief)]} { + # Avoid error due to spurious release events + $w configure -activerelief $Priv(relief) + ScrollEndDrag $w $x $y + $w activate [$w identify $x $y] + } +} + +# ::tk::ScrollSelect -- +# This procedure is invoked when a button is pressed over the scrollbar. +# It invokes one of several scrolling actions depending on where in +# the scrollbar the button was pressed. +# +# Arguments: +# w - The scrollbar widget. +# element - The element of the scrollbar that was selected, such +# as "arrow1" or "trough2". Shouldn't be "slider". +# repeat - Whether and how to auto-repeat the action: "noRepeat" +# means don't auto-repeat, "initial" means this is the +# first action in an auto-repeat sequence, and "again" +# means this is the second repetition or later. + +proc ::tk::ScrollSelect {w element repeat} { + variable ::tk::Priv + if {![winfo exists $w]} return + switch -- $element { + "arrow1" {ScrollByUnits $w hv -1} + "trough1" {ScrollByPages $w hv -1} + "trough2" {ScrollByPages $w hv 1} + "arrow2" {ScrollByUnits $w hv 1} + default {return} + } + if {$repeat eq "again"} { + set Priv(afterId) [after [$w cget -repeatinterval] \ + [list tk::ScrollSelect $w $element again]] + } elseif {$repeat eq "initial"} { + set delay [$w cget -repeatdelay] + if {$delay > 0} { + set Priv(afterId) [after $delay \ + [list tk::ScrollSelect $w $element again]] + } + } +} + +# ::tk::ScrollStartDrag -- +# This procedure is called to initiate a drag of the slider. It just +# remembers the starting position of the mouse and slider. +# +# Arguments: +# w - The scrollbar widget. +# x, y - The mouse position at the start of the drag operation. + +proc ::tk::ScrollStartDrag {w x y} { + variable ::tk::Priv + + if {[$w cget -command] eq ""} { + return + } + set Priv(pressX) $x + set Priv(pressY) $y + set Priv(initValues) [$w get] + set iv0 [lindex $Priv(initValues) 0] + if {[llength $Priv(initValues)] == 2} { + set Priv(initPos) $iv0 + } elseif {$iv0 == 0} { + set Priv(initPos) 0.0 + } else { + set Priv(initPos) [expr {(double([lindex $Priv(initValues) 2])) \ + / [lindex $Priv(initValues) 0]}] + } +} + +# ::tk::ScrollDrag -- +# This procedure is called for each mouse motion even when the slider +# is being dragged. It notifies the associated widget if we're not +# jump scrolling, and it just updates the scrollbar if we are jump +# scrolling. +# +# Arguments: +# w - The scrollbar widget. +# x, y - The current mouse position. + +proc ::tk::ScrollDrag {w x y} { + variable ::tk::Priv + + if {$Priv(initPos) eq ""} { + return + } + set delta [$w delta [expr {$x - $Priv(pressX)}] [expr {$y - $Priv(pressY)}]] + if {[$w cget -jump]} { + if {[llength $Priv(initValues)] == 2} { + $w set [expr {[lindex $Priv(initValues) 0] + $delta}] \ + [expr {[lindex $Priv(initValues) 1] + $delta}] + } else { + set delta [expr {round($delta * [lindex $Priv(initValues) 0])}] + eval [list $w] set [lreplace $Priv(initValues) 2 3 \ + [expr {[lindex $Priv(initValues) 2] + $delta}] \ + [expr {[lindex $Priv(initValues) 3] + $delta}]] + } + } else { + ScrollToPos $w [expr {$Priv(initPos) + $delta}] + } +} + +# ::tk::ScrollEndDrag -- +# This procedure is called to end an interactive drag of the slider. +# It scrolls the window if we're in jump mode, otherwise it does nothing. +# +# Arguments: +# w - The scrollbar widget. +# x, y - The mouse position at the end of the drag operation. + +proc ::tk::ScrollEndDrag {w x y} { + variable ::tk::Priv + + if {$Priv(initPos) eq ""} { + return + } + if {[$w cget -jump]} { + set delta [$w delta [expr {$x - $Priv(pressX)}] \ + [expr {$y - $Priv(pressY)}]] + ScrollToPos $w [expr {$Priv(initPos) + $delta}] + } + set Priv(initPos) "" +} + +# ::tk::ScrollByUnits -- +# This procedure tells the scrollbar's associated widget to scroll up +# or down by a given number of units. It notifies the associated widget +# in different ways for old and new command syntaxes. +# +# Arguments: +# w - The scrollbar widget. +# orient - Which kinds of scrollbars this applies to: "h" for +# horizontal, "v" for vertical, "hv" for both. +# amount - How many units to scroll: typically 1 or -1. + +proc ::tk::ScrollByUnits {w orient amount} { + set cmd [$w cget -command] + if {$cmd eq "" || ([string first \ + [string index [$w cget -orient] 0] $orient] < 0)} { + return + } + set info [$w get] + if {[llength $info] == 2} { + uplevel #0 $cmd scroll $amount units + } else { + uplevel #0 $cmd [expr {[lindex $info 2] + $amount}] + } +} + +# ::tk::ScrollByPages -- +# This procedure tells the scrollbar's associated widget to scroll up +# or down by a given number of screenfuls. It notifies the associated +# widget in different ways for old and new command syntaxes. +# +# Arguments: +# w - The scrollbar widget. +# orient - Which kinds of scrollbars this applies to: "h" for +# horizontal, "v" for vertical, "hv" for both. +# amount - How many screens to scroll: typically 1 or -1. + +proc ::tk::ScrollByPages {w orient amount} { + set cmd [$w cget -command] + if {$cmd eq "" || ([string first \ + [string index [$w cget -orient] 0] $orient] < 0)} { + return + } + set info [$w get] + if {[llength $info] == 2} { + uplevel #0 $cmd scroll $amount pages + } else { + uplevel #0 $cmd [expr {[lindex $info 2] + $amount*([lindex $info 1] - 1)}] + } +} + +# ::tk::ScrollToPos -- +# This procedure tells the scrollbar's associated widget to scroll to +# a particular location, given by a fraction between 0 and 1. It notifies +# the associated widget in different ways for old and new command syntaxes. +# +# Arguments: +# w - The scrollbar widget. +# pos - A fraction between 0 and 1 indicating a desired position +# in the document. + +proc ::tk::ScrollToPos {w pos} { + set cmd [$w cget -command] + if {$cmd eq ""} { + return + } + set info [$w get] + if {[llength $info] == 2} { + uplevel #0 $cmd moveto $pos + } else { + uplevel #0 $cmd [expr {round([lindex $info 0]*$pos)}] + } +} + +# ::tk::ScrollTopBottom +# Scroll to the top or bottom of the document, depending on the mouse +# position. +# +# Arguments: +# w - The scrollbar widget. +# x, y - Mouse coordinates within the widget. + +proc ::tk::ScrollTopBottom {w x y} { + variable ::tk::Priv + set element [$w identify $x $y] + if {[string match *1 $element]} { + ScrollToPos $w 0 + } elseif {[string match *2 $element]} { + ScrollToPos $w 1 + } + + # Set Priv(relief), since it's needed by tk::ScrollButtonUp. + + set Priv(relief) [$w cget -activerelief] +} + +# ::tk::ScrollButton2Down +# This procedure is invoked when button 2 is pressed over a scrollbar. +# If the button is over the trough or slider, it sets the scrollbar to +# the mouse position and starts a slider drag. Otherwise it just +# behaves the same as button 1. +# +# Arguments: +# w - The scrollbar widget. +# x, y - Mouse coordinates within the widget. + +proc ::tk::ScrollButton2Down {w x y} { + variable ::tk::Priv + if {![winfo exists $w]} { + return + } + set element [$w identify $x $y] + if {[string match {arrow[12]} $element]} { + ScrollButtonDown $w $x $y + return + } + ScrollToPos $w [$w fraction $x $y] + set Priv(relief) [$w cget -activerelief] + + # Need the "update idletasks" below so that the widget calls us + # back to reset the actual scrollbar position before we start the + # slider drag. + + update idletasks + if {[winfo exists $w]} { + $w configure -activerelief sunken + $w activate slider + ScrollStartDrag $w $x $y + } +} diff --git a/env/tcl/tk8.6/spinbox.tcl b/env/tcl/tk8.6/spinbox.tcl new file mode 100644 index 0000000..1965ed8 --- /dev/null +++ b/env/tcl/tk8.6/spinbox.tcl @@ -0,0 +1,580 @@ +# spinbox.tcl -- +# +# This file defines the default bindings for Tk spinbox widgets and provides +# procedures that help in implementing those bindings. The spinbox builds +# off the entry widget, so it can reuse Entry bindings and procedures. +# +# Copyright (c) 1992-1994 The Regents of the University of California. +# Copyright (c) 1994-1997 Sun Microsystems, Inc. +# Copyright (c) 1999-2000 Jeffrey Hobbs +# Copyright (c) 2000 Ajuba Solutions +# +# See the file "license.terms" for information on usage and redistribution +# of this file, and for a DISCLAIMER OF ALL WARRANTIES. +# + +#------------------------------------------------------------------------- +# Elements of tk::Priv that are used in this file: +# +# afterId - If non-null, it means that auto-scanning is underway +# and it gives the "after" id for the next auto-scan +# command to be executed. +# mouseMoved - Non-zero means the mouse has moved a significant +# amount since the button went down (so, for example, +# start dragging out a selection). +# pressX - X-coordinate at which the mouse button was pressed. +# selectMode - The style of selection currently underway: +# char, word, or line. +# x, y - Last known mouse coordinates for scanning +# and auto-scanning. +# data - Used for Cut and Copy +#------------------------------------------------------------------------- + +# Initialize namespace +namespace eval ::tk::spinbox {} + +#------------------------------------------------------------------------- +# The code below creates the default class bindings for entries. +#------------------------------------------------------------------------- +bind Spinbox <> { + if {![catch {::tk::spinbox::GetSelection %W} tk::Priv(data)]} { + clipboard clear -displayof %W + clipboard append -displayof %W $tk::Priv(data) + %W delete sel.first sel.last + unset tk::Priv(data) + } +} +bind Spinbox <> { + if {![catch {::tk::spinbox::GetSelection %W} tk::Priv(data)]} { + clipboard clear -displayof %W + clipboard append -displayof %W $tk::Priv(data) + unset tk::Priv(data) + } +} +bind Spinbox <> { + catch { + if {[tk windowingsystem] ne "x11"} { + catch { + %W delete sel.first sel.last + } + } + %W insert insert [::tk::GetSelection %W CLIPBOARD] + ::tk::EntrySeeInsert %W + } +} +bind Spinbox <> { + %W delete sel.first sel.last +} +bind Spinbox <> { + if {$tk_strictMotif || ![info exists tk::Priv(mouseMoved)] + || !$tk::Priv(mouseMoved)} { + ::tk::spinbox::Paste %W %x + } +} + +bind Spinbox <> { + %W selection range 0 end + %W icursor end +} + +# Standard Motif bindings: + +bind Spinbox <1> { + ::tk::spinbox::ButtonDown %W %x %y +} +bind Spinbox { + ::tk::spinbox::Motion %W %x %y +} +bind Spinbox { + ::tk::spinbox::ArrowPress %W %x %y + set tk::Priv(selectMode) word + ::tk::spinbox::MouseSelect %W %x sel.first +} +bind Spinbox { + ::tk::spinbox::ArrowPress %W %x %y + set tk::Priv(selectMode) line + ::tk::spinbox::MouseSelect %W %x 0 +} +bind Spinbox { + set tk::Priv(selectMode) char + %W selection adjust @%x +} +bind Spinbox { + set tk::Priv(selectMode) word + ::tk::spinbox::MouseSelect %W %x +} +bind Spinbox { + set tk::Priv(selectMode) line + ::tk::spinbox::MouseSelect %W %x +} +bind Spinbox { + set tk::Priv(x) %x + ::tk::spinbox::AutoScan %W +} +bind Spinbox { + tk::CancelRepeat +} +bind Spinbox { + ::tk::spinbox::ButtonUp %W %x %y +} +bind Spinbox { + %W icursor @%x +} + +bind Spinbox <> { + %W invoke buttonup +} +bind Spinbox <> { + %W invoke buttondown +} + +bind Spinbox <> { + ::tk::EntrySetCursor %W [expr {[%W index insert] - 1}] +} +bind Spinbox <> { + ::tk::EntrySetCursor %W [expr {[%W index insert] + 1}] +} +bind Spinbox <> { + ::tk::EntryKeySelect %W [expr {[%W index insert] - 1}] + ::tk::EntrySeeInsert %W +} +bind Spinbox <> { + ::tk::EntryKeySelect %W [expr {[%W index insert] + 1}] + ::tk::EntrySeeInsert %W +} +bind Spinbox <> { + ::tk::EntrySetCursor %W [::tk::EntryPreviousWord %W insert] +} +bind Spinbox <> { + ::tk::EntrySetCursor %W [::tk::EntryNextWord %W insert] +} +bind Spinbox <> { + ::tk::EntryKeySelect %W [::tk::EntryPreviousWord %W insert] + ::tk::EntrySeeInsert %W +} +bind Spinbox <> { + ::tk::EntryKeySelect %W [::tk::EntryNextWord %W insert] + ::tk::EntrySeeInsert %W +} +bind Spinbox <> { + ::tk::EntrySetCursor %W 0 +} +bind Spinbox <> { + ::tk::EntryKeySelect %W 0 + ::tk::EntrySeeInsert %W +} +bind Spinbox <> { + ::tk::EntrySetCursor %W end +} +bind Spinbox <> { + ::tk::EntryKeySelect %W end + ::tk::EntrySeeInsert %W +} + +bind Spinbox { + if {[%W selection present]} { + %W delete sel.first sel.last + } else { + %W delete insert + } +} +bind Spinbox { + ::tk::EntryBackspace %W +} + +bind Spinbox { + %W selection from insert +} +bind Spinbox { + %W mark set [tk::TextAnchor %W] insert +} +bind Text { + set tk::Priv(selectMode) char + tk::TextKeyExtend %W insert +} +bind Text { + set tk::Priv(selectMode) char + tk::TextKeyExtend %W insert +} +bind Text <> { + %W tag add sel 1.0 end +} +bind Text <> { + %W tag remove sel 1.0 end + # An operation that clears the selection must insert an autoseparator, + # because the selection operation may have moved the insert mark + if {[%W cget -autoseparators]} { + %W edit separator + } +} +bind Text <> { + tk_textCut %W +} +bind Text <> { + tk_textCopy %W +} +bind Text <> { + tk_textPaste %W +} +bind Text <> { + # Make <> an atomic operation on the Undo stack, + # i.e. separate it from other delete operations on either side + if {[%W cget -autoseparators]} { + %W edit separator + } + catch {%W delete sel.first sel.last} + if {[%W cget -autoseparators]} { + %W edit separator + } +} +bind Text <> { + if {$tk_strictMotif || ![info exists tk::Priv(mouseMoved)] + || !$tk::Priv(mouseMoved)} { + tk::TextPasteSelection %W %x %y + } +} +bind Text { + catch {tk::TextInsert %W [::tk::GetSelection %W PRIMARY]} +} +bind Text { + tk::TextInsert %W %A +} + +# Ignore all Alt, Meta, and Control keypresses unless explicitly bound. +# Otherwise, if a widget binding for one of these is defined, the +# class binding will also fire and insert the character, +# which is wrong. Ditto for . + +bind Text {# nothing } +bind Text {# nothing} +bind Text {# nothing} +bind Text {# nothing} +bind Text {# nothing} +if {[tk windowingsystem] eq "aqua"} { + bind Text {# nothing} +} + +# Additional emacs-like bindings: + +bind Text { + if {!$tk_strictMotif && [%W compare end != insert+1c]} { + %W delete insert + } +} +bind Text { + if {!$tk_strictMotif && [%W compare end != insert+1c]} { + if {[%W compare insert == {insert lineend}]} { + %W delete insert + } else { + %W delete insert {insert lineend} + } + } +} +bind Text { + if {!$tk_strictMotif} { + %W insert insert \n + %W mark set insert insert-1c + } +} +bind Text { + if {!$tk_strictMotif} { + tk::TextTranspose %W + } +} + +bind Text <> { + # An Undo operation may remove the separator at the top of the Undo stack. + # Then the item at the top of the stack gets merged with the subsequent changes. + # Place separators before and after Undo to prevent this. + if {[%W cget -autoseparators]} { + %W edit separator + } + catch { %W edit undo } + if {[%W cget -autoseparators]} { + %W edit separator + } +} + +bind Text <> { + catch { %W edit redo } +} + +bind Text { + if {!$tk_strictMotif} { + tk::TextSetCursor %W [tk::TextPrevPos %W insert tcl_startOfPreviousWord] + } +} +bind Text { + if {!$tk_strictMotif && [%W compare end != insert+1c]} { + %W delete insert [tk::TextNextWord %W insert] + } +} +bind Text { + if {!$tk_strictMotif} { + tk::TextSetCursor %W [tk::TextNextWord %W insert] + } +} +bind Text { + if {!$tk_strictMotif} { + tk::TextSetCursor %W 1.0 + } +} +bind Text { + if {!$tk_strictMotif} { + tk::TextSetCursor %W end-1c + } +} +bind Text { + if {!$tk_strictMotif} { + %W delete [tk::TextPrevPos %W insert tcl_startOfPreviousWord] insert + } +} +bind Text { + if {!$tk_strictMotif} { + %W delete [tk::TextPrevPos %W insert tcl_startOfPreviousWord] insert + } +} + +# Macintosh only bindings: + +if {[tk windowingsystem] eq "aqua"} { +bind Text { + tk::TextScrollPages %W 1 +} + +# End of Mac only bindings +} + +# A few additional bindings of my own. + +bind Text { + if {!$tk_strictMotif && [%W compare insert != 1.0]} { + %W delete insert-1c + %W see insert + } +} +bind Text <2> { + if {!$tk_strictMotif} { + tk::TextScanMark %W %x %y + } +} +bind Text { + if {!$tk_strictMotif} { + tk::TextScanDrag %W %x %y + } +} +set ::tk::Priv(prevPos) {} + +# The MouseWheel will typically only fire on Windows and MacOS X. +# However, someone could use the "event generate" command to produce one +# on other platforms. We must be careful not to round -ve values of %D +# down to zero. + +if {[tk windowingsystem] eq "aqua"} { + bind Text { + %W yview scroll [expr {-15 * (%D)}] pixels + } + bind Text { + %W yview scroll [expr {-150 * (%D)}] pixels + } + bind Text { + %W xview scroll [expr {-15 * (%D)}] pixels + } + bind Text { + %W xview scroll [expr {-150 * (%D)}] pixels + } +} else { + # We must make sure that positive and negative movements are rounded + # equally to integers, avoiding the problem that + # (int)1/3 = 0, + # but + # (int)-1/3 = -1 + # The following code ensure equal +/- behaviour. + bind Text { + if {%D >= 0} { + %W yview scroll [expr {-%D/3}] pixels + } else { + %W yview scroll [expr {(2-%D)/3}] pixels + } + } + bind Text { + if {%D >= 0} { + %W xview scroll [expr {-%D/3}] pixels + } else { + %W xview scroll [expr {(2-%D)/3}] pixels + } + } +} + +if {"x11" eq [tk windowingsystem]} { + # Support for mousewheels on Linux/Unix commonly comes through mapping + # the wheel to the extended buttons. If you have a mousewheel, find + # Linux configuration info at: + # http://linuxreviews.org/howtos/xfree/mouse/ + bind Text <4> { + if {!$tk_strictMotif} { + %W yview scroll -50 pixels + } + } + bind Text <5> { + if {!$tk_strictMotif} { + %W yview scroll 50 pixels + } + } + bind Text { + if {!$tk_strictMotif} { + %W xview scroll -50 pixels + } + } + bind Text { + if {!$tk_strictMotif} { + %W xview scroll 50 pixels + } + } +} + +# ::tk::TextClosestGap -- +# Given x and y coordinates, this procedure finds the closest boundary +# between characters to the given coordinates and returns the index +# of the character just after the boundary. +# +# Arguments: +# w - The text window. +# x - X-coordinate within the window. +# y - Y-coordinate within the window. + +proc ::tk::TextClosestGap {w x y} { + set pos [$w index @$x,$y] + set bbox [$w bbox $pos] + if {$bbox eq ""} { + return $pos + } + if {($x - [lindex $bbox 0]) < ([lindex $bbox 2]/2)} { + return $pos + } + $w index "$pos + 1 char" +} + +# ::tk::TextButton1 -- +# This procedure is invoked to handle button-1 presses in text +# widgets. It moves the insertion cursor, sets the selection anchor, +# and claims the input focus. +# +# Arguments: +# w - The text window in which the button was pressed. +# x - The x-coordinate of the button press. +# y - The x-coordinate of the button press. + +proc ::tk::TextButton1 {w x y} { + variable ::tk::Priv + + set Priv(selectMode) char + set Priv(mouseMoved) 0 + set Priv(pressX) $x + set anchorname [tk::TextAnchor $w] + $w mark set insert [TextClosestGap $w $x $y] + $w mark set $anchorname insert + # Set the anchor mark's gravity depending on the click position + # relative to the gap + set bbox [$w bbox [$w index $anchorname]] + if {$x > [lindex $bbox 0]} { + $w mark gravity $anchorname right + } else { + $w mark gravity $anchorname left + } + # Allow focus in any case on Windows, because that will let the + # selection be displayed even for state disabled text widgets. + if {[tk windowingsystem] eq "win32" \ + || [$w cget -state] eq "normal"} { + focus $w + } + if {[$w cget -autoseparators]} { + $w edit separator + } +} + +# ::tk::TextSelectTo -- +# This procedure is invoked to extend the selection, typically when +# dragging it with the mouse. Depending on the selection mode (character, +# word, line) it selects in different-sized units. This procedure +# ignores mouse motions initially until the mouse has moved from +# one character to another or until there have been multiple clicks. +# +# Note that the 'anchor' is implemented programmatically using +# a text widget mark, and uses a name that will be unique for each +# text widget (even when there are multiple peers). Currently the +# anchor is considered private to Tk, hence the name 'tk::anchor$w'. +# +# Arguments: +# w - The text window in which the button was pressed. +# x - Mouse x position. +# y - Mouse y position. + +set ::tk::Priv(textanchoruid) 0 + +proc ::tk::TextAnchor {w} { + variable Priv + if {![info exists Priv(textanchor,$w)]} { + set Priv(textanchor,$w) tk::anchor[incr Priv(textanchoruid)] + } + return $Priv(textanchor,$w) +} + +proc ::tk::TextSelectTo {w x y {extend 0}} { + variable ::tk::Priv + + set anchorname [tk::TextAnchor $w] + set cur [TextClosestGap $w $x $y] + if {[catch {$w index $anchorname}]} { + $w mark set $anchorname $cur + } + set anchor [$w index $anchorname] + if {[$w compare $cur != $anchor] || (abs($Priv(pressX) - $x) >= 3)} { + set Priv(mouseMoved) 1 + } + switch -- $Priv(selectMode) { + char { + if {[$w compare $cur < $anchorname]} { + set first $cur + set last $anchorname + } else { + set first $anchorname + set last $cur + } + } + word { + # Set initial range based only on the anchor (1 char min width) + if {[$w mark gravity $anchorname] eq "right"} { + set first $anchorname + set last "$anchorname + 1c" + } else { + set first "$anchorname - 1c" + set last $anchorname + } + # Extend range (if necessary) based on the current point + if {[$w compare $cur < $first]} { + set first $cur + } elseif {[$w compare $cur > $last]} { + set last $cur + } + + # Now find word boundaries + set first [TextPrevPos $w "$first + 1c" tcl_wordBreakBefore] + set last [TextNextPos $w "$last - 1c" tcl_wordBreakAfter] + } + line { + # Set initial range based only on the anchor + set first "$anchorname linestart" + set last "$anchorname lineend" + + # Extend range (if necessary) based on the current point + if {[$w compare $cur < $first]} { + set first "$cur linestart" + } elseif {[$w compare $cur > $last]} { + set last "$cur lineend" + } + set first [$w index $first] + set last [$w index "$last + 1c"] + } + } + if {$Priv(mouseMoved) || ($Priv(selectMode) ne "char")} { + $w tag remove sel 0.0 end + $w mark set insert $cur + $w tag add sel $first $last + $w tag remove sel $last end + update idletasks + } +} + +# ::tk::TextKeyExtend -- +# This procedure handles extending the selection from the keyboard, +# where the point to extend to is really the boundary between two +# characters rather than a particular character. +# +# Arguments: +# w - The text window. +# index - The point to which the selection is to be extended. + +proc ::tk::TextKeyExtend {w index} { + + set anchorname [tk::TextAnchor $w] + set cur [$w index $index] + if {[catch {$w index $anchorname}]} { + $w mark set $anchorname $cur + } + set anchor [$w index $anchorname] + if {[$w compare $cur < $anchorname]} { + set first $cur + set last $anchorname + } else { + set first $anchorname + set last $cur + } + $w tag remove sel 0.0 $first + $w tag add sel $first $last + $w tag remove sel $last end +} + +# ::tk::TextPasteSelection -- +# This procedure sets the insertion cursor to the mouse position, +# inserts the selection, and sets the focus to the window. +# +# Arguments: +# w - The text window. +# x, y - Position of the mouse. + +proc ::tk::TextPasteSelection {w x y} { + $w mark set insert [TextClosestGap $w $x $y] + if {![catch {::tk::GetSelection $w PRIMARY} sel]} { + set oldSeparator [$w cget -autoseparators] + if {$oldSeparator} { + $w configure -autoseparators 0 + $w edit separator + } + $w insert insert $sel + if {$oldSeparator} { + $w edit separator + $w configure -autoseparators 1 + } + } + if {[$w cget -state] eq "normal"} { + focus $w + } +} + +# ::tk::TextAutoScan -- +# This procedure is invoked when the mouse leaves a text window +# with button 1 down. It scrolls the window up, down, left, or right, +# depending on where the mouse is (this information was saved in +# ::tk::Priv(x) and ::tk::Priv(y)), and reschedules itself as an "after" +# command so that the window continues to scroll until the mouse +# moves back into the window or the mouse button is released. +# +# Arguments: +# w - The text window. + +proc ::tk::TextAutoScan {w} { + variable ::tk::Priv + if {![winfo exists $w]} { + return + } + if {$Priv(y) >= [winfo height $w]} { + $w yview scroll [expr {1 + $Priv(y) - [winfo height $w]}] pixels + } elseif {$Priv(y) < 0} { + $w yview scroll [expr {-1 + $Priv(y)}] pixels + } elseif {$Priv(x) >= [winfo width $w]} { + $w xview scroll 2 units + } elseif {$Priv(x) < 0} { + $w xview scroll -2 units + } else { + return + } + TextSelectTo $w $Priv(x) $Priv(y) + set Priv(afterId) [after 50 [list tk::TextAutoScan $w]] +} + +# ::tk::TextSetCursor +# Move the insertion cursor to a given position in a text. Also +# clears the selection, if there is one in the text, and makes sure +# that the insertion cursor is visible. Also, don't let the insertion +# cursor appear on the dummy last line of the text. +# +# Arguments: +# w - The text window. +# pos - The desired new position for the cursor in the window. + +proc ::tk::TextSetCursor {w pos} { + if {[$w compare $pos == end]} { + set pos {end - 1 chars} + } + $w mark set insert $pos + $w tag remove sel 1.0 end + $w see insert + if {[$w cget -autoseparators]} { + $w edit separator + } +} + +# ::tk::TextKeySelect +# This procedure is invoked when stroking out selections using the +# keyboard. It moves the cursor to a new position, then extends +# the selection to that position. +# +# Arguments: +# w - The text window. +# new - A new position for the insertion cursor (the cursor hasn't +# actually been moved to this position yet). + +proc ::tk::TextKeySelect {w new} { + set anchorname [tk::TextAnchor $w] + if {[$w tag nextrange sel 1.0 end] eq ""} { + if {[$w compare $new < insert]} { + $w tag add sel $new insert + } else { + $w tag add sel insert $new + } + $w mark set $anchorname insert + } else { + if {[catch {$w index $anchorname}]} { + $w mark set $anchorname insert + } + if {[$w compare $new < $anchorname]} { + set first $new + set last $anchorname + } else { + set first $anchorname + set last $new + } + $w tag remove sel 1.0 $first + $w tag add sel $first $last + $w tag remove sel $last end + } + $w mark set insert $new + $w see insert + update idletasks +} + +# ::tk::TextResetAnchor -- +# Set the selection anchor to whichever end is farthest from the +# index argument. One special trick: if the selection has two or +# fewer characters, just leave the anchor where it is. In this +# case it doesn't matter which point gets chosen for the anchor, +# and for the things like Shift-Left and Shift-Right this produces +# better behavior when the cursor moves back and forth across the +# anchor. +# +# Arguments: +# w - The text widget. +# index - Position at which mouse button was pressed, which determines +# which end of selection should be used as anchor point. + +proc ::tk::TextResetAnchor {w index} { + if {[$w tag ranges sel] eq ""} { + # Don't move the anchor if there is no selection now; this + # makes the widget behave "correctly" when the user clicks + # once, then shift-clicks somewhere -- ie, the area between + # the two clicks will be selected. [Bug: 5929]. + return + } + set anchorname [tk::TextAnchor $w] + set a [$w index $index] + set b [$w index sel.first] + set c [$w index sel.last] + if {[$w compare $a < $b]} { + $w mark set $anchorname sel.last + return + } + if {[$w compare $a > $c]} { + $w mark set $anchorname sel.first + return + } + scan $a "%d.%d" lineA chA + scan $b "%d.%d" lineB chB + scan $c "%d.%d" lineC chC + if {$lineB < $lineC+2} { + set total [string length [$w get $b $c]] + if {$total <= 2} { + return + } + if {[string length [$w get $b $a]] < ($total/2)} { + $w mark set $anchorname sel.last + } else { + $w mark set $anchorname sel.first + } + return + } + if {($lineA-$lineB) < ($lineC-$lineA)} { + $w mark set $anchorname sel.last + } else { + $w mark set $anchorname sel.first + } +} + +# ::tk::TextCursorInSelection -- +# Check whether the selection exists and contains the insertion cursor. Note +# that it assumes that the selection is contiguous. +# +# Arguments: +# w - The text widget whose selection is to be checked + +proc ::tk::TextCursorInSelection {w} { + expr { + [llength [$w tag ranges sel]] + && [$w compare sel.first <= insert] + && [$w compare sel.last >= insert] + } +} + +# ::tk::TextInsert -- +# Insert a string into a text at the point of the insertion cursor. +# If there is a selection in the text, and it covers the point of the +# insertion cursor, then delete the selection before inserting. +# +# Arguments: +# w - The text window in which to insert the string +# s - The string to insert (usually just a single character) + +proc ::tk::TextInsert {w s} { + if {$s eq "" || [$w cget -state] eq "disabled"} { + return + } + set compound 0 + if {[TextCursorInSelection $w]} { + set oldSeparator [$w cget -autoseparators] + if {$oldSeparator} { + $w configure -autoseparators 0 + $w edit separator + set compound 1 + } + $w delete sel.first sel.last + } + $w insert insert $s + $w see insert + if {$compound && $oldSeparator} { + $w edit separator + $w configure -autoseparators 1 + } +} + +# ::tk::TextUpDownLine -- +# Returns the index of the character one display line above or below the +# insertion cursor. There are two tricky things here. First, we want to +# maintain the original x position across repeated operations, even though +# some lines that will get passed through don't have enough characters to +# cover the original column. Second, don't try to scroll past the +# beginning or end of the text. +# +# Arguments: +# w - The text window in which the cursor is to move. +# n - The number of display lines to move: -1 for up one line, +# +1 for down one line. + +proc ::tk::TextUpDownLine {w n} { + variable ::tk::Priv + + set i [$w index insert] + if {$Priv(prevPos) ne $i} { + set Priv(textPosOrig) $i + } + set lines [$w count -displaylines $Priv(textPosOrig) $i] + set new [$w index \ + "$Priv(textPosOrig) + [expr {$lines + $n}] displaylines"] + if {[$w compare $new == end] \ + || [$w compare $new == "insert display linestart"]} { + set new $i + } + set Priv(prevPos) $new + return $new +} + +# ::tk::TextPrevPara -- +# Returns the index of the beginning of the paragraph just before a given +# position in the text (the beginning of a paragraph is the first non-blank +# character after a blank line). +# +# Arguments: +# w - The text window in which the cursor is to move. +# pos - Position at which to start search. + +proc ::tk::TextPrevPara {w pos} { + set pos [$w index "$pos linestart"] + while {1} { + if {([$w get "$pos - 1 line"] eq "\n" && ([$w get $pos] ne "\n")) \ + || $pos eq "1.0"} { + if {[regexp -indices -- {^[ \t]+(.)} \ + [$w get $pos "$pos lineend"] -> index]} { + set pos [$w index "$pos + [lindex $index 0] chars"] + } + if {[$w compare $pos != insert] || [lindex [split $pos .] 0]==1} { + return $pos + } + } + set pos [$w index "$pos - 1 line"] + } +} + +# ::tk::TextNextPara -- +# Returns the index of the beginning of the paragraph just after a given +# position in the text (the beginning of a paragraph is the first non-blank +# character after a blank line). +# +# Arguments: +# w - The text window in which the cursor is to move. +# start - Position at which to start search. + +proc ::tk::TextNextPara {w start} { + set pos [$w index "$start linestart + 1 line"] + while {[$w get $pos] ne "\n"} { + if {[$w compare $pos == end]} { + return [$w index "end - 1c"] + } + set pos [$w index "$pos + 1 line"] + } + while {[$w get $pos] eq "\n"} { + set pos [$w index "$pos + 1 line"] + if {[$w compare $pos == end]} { + return [$w index "end - 1c"] + } + } + if {[regexp -indices -- {^[ \t]+(.)} \ + [$w get $pos "$pos lineend"] -> index]} { + return [$w index "$pos + [lindex $index 0] chars"] + } + return $pos +} + +# ::tk::TextScrollPages -- +# This is a utility procedure used in bindings for moving up and down +# pages and possibly extending the selection along the way. It scrolls +# the view in the widget by the number of pages, and it returns the +# index of the character that is at the same position in the new view +# as the insertion cursor used to be in the old view. +# +# Arguments: +# w - The text window in which the cursor is to move. +# count - Number of pages forward to scroll; may be negative +# to scroll backwards. + +proc ::tk::TextScrollPages {w count} { + set bbox [$w bbox insert] + $w yview scroll $count pages + if {$bbox eq ""} { + return [$w index @[expr {[winfo height $w]/2}],0] + } + return [$w index @[lindex $bbox 0],[lindex $bbox 1]] +} + +# ::tk::TextTranspose -- +# This procedure implements the "transpose" function for text widgets. +# It tranposes the characters on either side of the insertion cursor, +# unless the cursor is at the end of the line. In this case it +# transposes the two characters to the left of the cursor. In either +# case, the cursor ends up to the right of the transposed characters. +# +# Arguments: +# w - Text window in which to transpose. + +proc ::tk::TextTranspose w { + set pos insert + if {[$w compare $pos != "$pos lineend"]} { + set pos [$w index "$pos + 1 char"] + } + set new [$w get "$pos - 1 char"][$w get "$pos - 2 char"] + if {[$w compare "$pos - 1 char" == 1.0]} { + return + } + # ensure this is seen as an atomic op to undo + set autosep [$w cget -autoseparators] + if {$autosep} { + $w configure -autoseparators 0 + $w edit separator + } + $w delete "$pos - 2 char" $pos + $w insert insert $new + $w see insert + if {$autosep} { + $w edit separator + $w configure -autoseparators $autosep + } +} + +# ::tk_textCopy -- +# This procedure copies the selection from a text widget into the +# clipboard. +# +# Arguments: +# w - Name of a text widget. + +proc ::tk_textCopy w { + if {![catch {set data [$w get sel.first sel.last]}]} { + clipboard clear -displayof $w + clipboard append -displayof $w $data + } +} + +# ::tk_textCut -- +# This procedure copies the selection from a text widget into the +# clipboard, then deletes the selection (if it exists in the given +# widget). +# +# Arguments: +# w - Name of a text widget. + +proc ::tk_textCut w { + if {![catch {set data [$w get sel.first sel.last]}]} { + # make <> an atomic operation on the Undo stack, + # i.e. separate it from other delete operations on either side + set oldSeparator [$w cget -autoseparators] + if {([$w cget -state] eq "normal") && $oldSeparator} { + $w edit separator + } + clipboard clear -displayof $w + clipboard append -displayof $w $data + $w delete sel.first sel.last + if {([$w cget -state] eq "normal") && $oldSeparator} { + $w edit separator + } + } +} + +# ::tk_textPaste -- +# This procedure pastes the contents of the clipboard to the insertion +# point in a text widget. +# +# Arguments: +# w - Name of a text widget. + +proc ::tk_textPaste w { + if {![catch {::tk::GetSelection $w CLIPBOARD} sel]} { + set oldSeparator [$w cget -autoseparators] + if {$oldSeparator} { + $w configure -autoseparators 0 + $w edit separator + } + if {[tk windowingsystem] ne "x11"} { + catch { $w delete sel.first sel.last } + } + $w insert insert $sel + if {$oldSeparator} { + $w edit separator + $w configure -autoseparators 1 + } + } +} + +# ::tk::TextNextWord -- +# Returns the index of the next word position after a given position in the +# text. The next word is platform dependent and may be either the next +# end-of-word position or the next start-of-word position after the next +# end-of-word position. +# +# Arguments: +# w - The text window in which the cursor is to move. +# start - Position at which to start search. + +if {[tk windowingsystem] eq "win32"} { + proc ::tk::TextNextWord {w start} { + TextNextPos $w [TextNextPos $w $start tcl_endOfWord] \ + tcl_startOfNextWord + } +} else { + proc ::tk::TextNextWord {w start} { + TextNextPos $w $start tcl_endOfWord + } +} + +# ::tk::TextNextPos -- +# Returns the index of the next position after the given starting +# position in the text as computed by a specified function. +# +# Arguments: +# w - The text window in which the cursor is to move. +# start - Position at which to start search. +# op - Function to use to find next position. + +proc ::tk::TextNextPos {w start op} { + set text "" + set cur $start + while {[$w compare $cur < end]} { + set text $text[$w get -displaychars $cur "$cur lineend + 1c"] + set pos [$op $text 0] + if {$pos >= 0} { + return [$w index "$start + $pos display chars"] + } + set cur [$w index "$cur lineend +1c"] + } + return end +} + +# ::tk::TextPrevPos -- +# Returns the index of the previous position before the given starting +# position in the text as computed by a specified function. +# +# Arguments: +# w - The text window in which the cursor is to move. +# start - Position at which to start search. +# op - Function to use to find next position. + +proc ::tk::TextPrevPos {w start op} { + set text "" + set cur $start + while {[$w compare $cur > 0.0]} { + set text [$w get -displaychars "$cur linestart - 1c" $cur]$text + set pos [$op $text end] + if {$pos >= 0} { + return [$w index "$cur linestart - 1c + $pos display chars"] + } + set cur [$w index "$cur linestart - 1c"] + } + return 0.0 +} + +# ::tk::TextScanMark -- +# +# Marks the start of a possible scan drag operation +# +# Arguments: +# w - The text window from which the text to get +# x - x location on screen +# y - y location on screen + +proc ::tk::TextScanMark {w x y} { + variable ::tk::Priv + $w scan mark $x $y + set Priv(x) $x + set Priv(y) $y + set Priv(mouseMoved) 0 +} + +# ::tk::TextScanDrag -- +# +# Marks the start of a possible scan drag operation +# +# Arguments: +# w - The text window from which the text to get +# x - x location on screen +# y - y location on screen + +proc ::tk::TextScanDrag {w x y} { + variable ::tk::Priv + # Make sure these exist, as some weird situations can trigger the + # motion binding without the initial press. [Bug #220269] + if {![info exists Priv(x)]} { + set Priv(x) $x + } + if {![info exists Priv(y)]} { + set Priv(y) $y + } + if {($x != $Priv(x)) || ($y != $Priv(y))} { + set Priv(mouseMoved) 1 + } + if {[info exists Priv(mouseMoved)] && $Priv(mouseMoved)} { + $w scan dragto $x $y + } +} diff --git a/env/tcl/tk8.6/tk.tcl b/env/tcl/tk8.6/tk.tcl new file mode 100644 index 0000000..61d1354 --- /dev/null +++ b/env/tcl/tk8.6/tk.tcl @@ -0,0 +1,695 @@ +# tk.tcl -- +# +# Initialization script normally executed in the interpreter for each Tk-based +# application. Arranges class bindings for widgets. +# +# Copyright (c) 1992-1994 The Regents of the University of California. +# Copyright (c) 1994-1996 Sun Microsystems, Inc. +# Copyright (c) 1998-2000 Ajuba Solutions. +# +# See the file "license.terms" for information on usage and redistribution of +# this file, and for a DISCLAIMER OF ALL WARRANTIES. + +# Verify that we have Tk binary and script components from the same release +package require -exact Tk 8.6.9 + +# Create a ::tk namespace +namespace eval ::tk { + # Set up the msgcat commands + namespace eval msgcat { + namespace export mc mcmax + if {[interp issafe] || [catch {package require msgcat}]} { + # The msgcat package is not available. Supply our own + # minimal replacement. + proc mc {src args} { + return [format $src {*}$args] + } + proc mcmax {args} { + set max 0 + foreach string $args { + set len [string length $string] + if {$len>$max} { + set max $len + } + } + return $max + } + } else { + # Get the commands from the msgcat package that Tk uses. + namespace import ::msgcat::mc + namespace import ::msgcat::mcmax + ::msgcat::mcload [file join $::tk_library msgs] + } + } + namespace import ::tk::msgcat::* +} +# and a ::ttk namespace +namespace eval ::ttk { + if {$::tk_library ne ""} { + # avoid file join to work in safe interps, but this is also x-plat ok + variable library $::tk_library/ttk + } +} + +# Add Ttk & Tk's directory to the end of the auto-load search path, if it +# isn't already on the path: + +if {[info exists ::auto_path] && ($::tk_library ne "") + && ($::tk_library ni $::auto_path) +} then { + lappend ::auto_path $::tk_library $::ttk::library +} + +# Turn off strict Motif look and feel as a default. + +set ::tk_strictMotif 0 + +# Turn on useinputmethods (X Input Methods) by default. +# We catch this because safe interpreters may not allow the call. + +catch {tk useinputmethods 1} + +# ::tk::PlaceWindow -- +# place a toplevel at a particular position +# Arguments: +# toplevel name of toplevel window +# ?placement? pointer ?center? ; places $w centered on the pointer +# widget widgetPath ; centers $w over widget_name +# defaults to placing toplevel in the middle of the screen +# ?anchor? center or widgetPath +# Results: +# Returns nothing +# +proc ::tk::PlaceWindow {w {place ""} {anchor ""}} { + wm withdraw $w + update idletasks + set checkBounds 1 + if {$place eq ""} { + set x [expr {([winfo screenwidth $w]-[winfo reqwidth $w])/2}] + set y [expr {([winfo screenheight $w]-[winfo reqheight $w])/2}] + set checkBounds 0 + } elseif {[string equal -length [string length $place] $place "pointer"]} { + ## place at POINTER (centered if $anchor == center) + if {[string equal -length [string length $anchor] $anchor "center"]} { + set x [expr {[winfo pointerx $w]-[winfo reqwidth $w]/2}] + set y [expr {[winfo pointery $w]-[winfo reqheight $w]/2}] + } else { + set x [winfo pointerx $w] + set y [winfo pointery $w] + } + } elseif {[string equal -length [string length $place] $place "widget"] && \ + [winfo exists $anchor] && [winfo ismapped $anchor]} { + ## center about WIDGET $anchor, widget must be mapped + set x [expr {[winfo rootx $anchor] + \ + ([winfo width $anchor]-[winfo reqwidth $w])/2}] + set y [expr {[winfo rooty $anchor] + \ + ([winfo height $anchor]-[winfo reqheight $w])/2}] + } else { + set x [expr {([winfo screenwidth $w]-[winfo reqwidth $w])/2}] + set y [expr {([winfo screenheight $w]-[winfo reqheight $w])/2}] + set checkBounds 0 + } + if {$checkBounds} { + if {$x < [winfo vrootx $w]} { + set x [winfo vrootx $w] + } elseif {$x > ([winfo vrootx $w]+[winfo vrootwidth $w]-[winfo reqwidth $w])} { + set x [expr {[winfo vrootx $w]+[winfo vrootwidth $w]-[winfo reqwidth $w]}] + } + if {$y < [winfo vrooty $w]} { + set y [winfo vrooty $w] + } elseif {$y > ([winfo vrooty $w]+[winfo vrootheight $w]-[winfo reqheight $w])} { + set y [expr {[winfo vrooty $w]+[winfo vrootheight $w]-[winfo reqheight $w]}] + } + if {[tk windowingsystem] eq "aqua"} { + # Avoid the native menu bar which sits on top of everything. + if {$y < 22} { + set y 22 + } + } + } + wm maxsize $w [winfo vrootwidth $w] [winfo vrootheight $w] + wm geometry $w +$x+$y + wm deiconify $w +} + +# ::tk::SetFocusGrab -- +# swap out current focus and grab temporarily (for dialogs) +# Arguments: +# grab new window to grab +# focus window to give focus to +# Results: +# Returns nothing +# +proc ::tk::SetFocusGrab {grab {focus {}}} { + set index "$grab,$focus" + upvar ::tk::FocusGrab($index) data + + lappend data [focus] + set oldGrab [grab current $grab] + lappend data $oldGrab + if {[winfo exists $oldGrab]} { + lappend data [grab status $oldGrab] + } + # The "grab" command will fail if another application + # already holds the grab. So catch it. + catch {grab $grab} + if {[winfo exists $focus]} { + focus $focus + } +} + +# ::tk::RestoreFocusGrab -- +# restore old focus and grab (for dialogs) +# Arguments: +# grab window that had taken grab +# focus window that had taken focus +# destroy destroy|withdraw - how to handle the old grabbed window +# Results: +# Returns nothing +# +proc ::tk::RestoreFocusGrab {grab focus {destroy destroy}} { + set index "$grab,$focus" + if {[info exists ::tk::FocusGrab($index)]} { + foreach {oldFocus oldGrab oldStatus} $::tk::FocusGrab($index) { break } + unset ::tk::FocusGrab($index) + } else { + set oldGrab "" + } + + catch {focus $oldFocus} + grab release $grab + if {$destroy eq "withdraw"} { + wm withdraw $grab + } else { + destroy $grab + } + if {[winfo exists $oldGrab] && [winfo ismapped $oldGrab]} { + if {$oldStatus eq "global"} { + grab -global $oldGrab + } else { + grab $oldGrab + } + } +} + +# ::tk::GetSelection -- +# This tries to obtain the default selection. On Unix, we first try +# and get a UTF8_STRING, a type supported by modern Unix apps for +# passing Unicode data safely. We fall back on the default STRING +# type otherwise. On Windows, only the STRING type is necessary. +# Arguments: +# w The widget for which the selection will be retrieved. +# Important for the -displayof property. +# sel The source of the selection (PRIMARY or CLIPBOARD) +# Results: +# Returns the selection, or an error if none could be found +# +if {[tk windowingsystem] ne "win32"} { + proc ::tk::GetSelection {w {sel PRIMARY}} { + if {[catch { + selection get -displayof $w -selection $sel -type UTF8_STRING + } txt] && [catch { + selection get -displayof $w -selection $sel + } txt]} then { + return -code error -errorcode {TK SELECTION NONE} \ + "could not find default selection" + } else { + return $txt + } + } +} else { + proc ::tk::GetSelection {w {sel PRIMARY}} { + if {[catch { + selection get -displayof $w -selection $sel + } txt]} then { + return -code error -errorcode {TK SELECTION NONE} \ + "could not find default selection" + } else { + return $txt + } + } +} + +# ::tk::ScreenChanged -- +# This procedure is invoked by the binding mechanism whenever the +# "current" screen is changing. The procedure does two things. +# First, it uses "upvar" to make variable "::tk::Priv" point at an +# array variable that holds state for the current display. Second, +# it initializes the array if it didn't already exist. +# +# Arguments: +# screen - The name of the new screen. + +proc ::tk::ScreenChanged screen { + # Extract the display name. + set disp [string range $screen 0 [string last . $screen]-1] + + # Ensure that namespace separators never occur in the display name (as + # they cause problems in variable names). Double-colons exist in some VNC + # display names. [Bug 2912473] + set disp [string map {:: _doublecolon_} $disp] + + uplevel #0 [list upvar #0 ::tk::Priv.$disp ::tk::Priv] + variable ::tk::Priv + + if {[info exists Priv]} { + set Priv(screen) $screen + return + } + array set Priv { + activeMenu {} + activeItem {} + afterId {} + buttons 0 + buttonWindow {} + dragging 0 + focus {} + grab {} + initPos {} + inMenubutton {} + listboxPrev {} + menuBar {} + mouseMoved 0 + oldGrab {} + popup {} + postedMb {} + pressX 0 + pressY 0 + prevPos 0 + selectMode char + } + set Priv(screen) $screen + set Priv(tearoff) [string equal [tk windowingsystem] "x11"] + set Priv(window) {} +} + +# Do initial setup for Priv, so that it is always bound to something +# (otherwise, if someone references it, it may get set to a non-upvar-ed +# value, which will cause trouble later). + +tk::ScreenChanged [winfo screen .] + +# ::tk::EventMotifBindings -- +# This procedure is invoked as a trace whenever ::tk_strictMotif is +# changed. It is used to turn on or turn off the motif virtual +# bindings. +# +# Arguments: +# n1 - the name of the variable being changed ("::tk_strictMotif"). + +proc ::tk::EventMotifBindings {n1 dummy dummy} { + upvar $n1 name + + if {$name} { + set op delete + } else { + set op add + } + + event $op <> + event $op <> + event $op <> + event $op <> + event $op <> + event $op <> + event $op <> + event $op <> + event $op <> + event $op <> + event $op <> + event $op <> + event $op <> + event $op <> + event $op <> +} + +#---------------------------------------------------------------------- +# Define common dialogs on platforms where they are not implemented +# using compiled code. +#---------------------------------------------------------------------- + +if {![llength [info commands tk_chooseColor]]} { + proc ::tk_chooseColor {args} { + return [::tk::dialog::color:: {*}$args] + } +} +if {![llength [info commands tk_getOpenFile]]} { + proc ::tk_getOpenFile {args} { + if {$::tk_strictMotif} { + return [::tk::MotifFDialog open {*}$args] + } else { + return [::tk::dialog::file:: open {*}$args] + } + } +} +if {![llength [info commands tk_getSaveFile]]} { + proc ::tk_getSaveFile {args} { + if {$::tk_strictMotif} { + return [::tk::MotifFDialog save {*}$args] + } else { + return [::tk::dialog::file:: save {*}$args] + } + } +} +if {![llength [info commands tk_messageBox]]} { + proc ::tk_messageBox {args} { + return [::tk::MessageBox {*}$args] + } +} +if {![llength [info command tk_chooseDirectory]]} { + proc ::tk_chooseDirectory {args} { + return [::tk::dialog::file::chooseDir:: {*}$args] + } +} + +#---------------------------------------------------------------------- +# Define the set of common virtual events. +#---------------------------------------------------------------------- + +switch -exact -- [tk windowingsystem] { + "x11" { + event add <> + event add <> + event add <> + event add <> + event add <> + event add <> + event add <> + # On Darwin/Aqua, buttons from left to right are 1,3,2. On Darwin/X11 with recent + # XQuartz as the X server, they are 1,2,3; other X servers may differ. + + event add <> + event add <> + event add <> + event add <> + event add <> + event add <> + event add <> + event add <> + event add <> + event add <> + event add <> + event add <> + event add <> + event add <> + event add <> + event add <> + event add <> + event add <> + event add <> + event add <> + event add <> + event add <> + event add <> + + # Some OS's define a goofy (as in, not ) keysym that is + # returned when the user presses . In order for tab + # traversal to work, we have to add these keysyms to the PrevWindow + # event. We use catch just in case the keysym isn't recognized. + + # This is needed for XFree86 systems + catch { event add <> } + # This seems to be correct on *some* HP systems. + catch { event add <> } + + trace add variable ::tk_strictMotif write ::tk::EventMotifBindings + set ::tk_strictMotif $::tk_strictMotif + # On unix, we want to always display entry/text selection, + # regardless of which window has focus + set ::tk::AlwaysShowSelection 1 + } + "win32" { + event add <> + event add <> + event add <> + event add <> + event add <> + event add <> + event add <> + + event add <> + event add <> + event add <> + event add <> + event add <> + event add <> + event add <> + event add <> + event add <> + event add <> + event add <> + event add <> + event add <> + event add <> + event add <> + event add <> + event add <> + event add <> + event add <> + event add <> + event add <> + event add <> + event add <> + } + "aqua" { + event add <> + event add <> + event add <> + event add <> + event add <> + event add <> + + # Official bindings + # See http://support.apple.com/kb/HT1343 + event add <> + event add <> + event add <> + event add <> + event add <> + event add <> + event add <> + event add <> + event add <> + event add <> + event add <> + event add <> + event add <> + event add <> + event add <> + event add <> + event add <> + event add <> + event add <> + event add <> + # Not official, but logical extensions of above. Also derived from + # bindings present in MS Word on OSX. + event add <> + event add <> + event add <> + event add <> + event add <> + } +} + +# ---------------------------------------------------------------------- +# Read in files that define all of the class bindings. +# ---------------------------------------------------------------------- + +if {$::tk_library ne ""} { + proc ::tk::SourceLibFile {file} { + namespace eval :: [list source [file join $::tk_library $file.tcl]] + } + namespace eval ::tk { + SourceLibFile icons + SourceLibFile button + SourceLibFile entry + SourceLibFile listbox + SourceLibFile menu + SourceLibFile panedwindow + SourceLibFile scale + SourceLibFile scrlbar + SourceLibFile spinbox + SourceLibFile text + } +} + +# ---------------------------------------------------------------------- +# Default bindings for keyboard traversal. +# ---------------------------------------------------------------------- + +event add <> +event add <> +bind all <> {tk::TabToWindow [tk_focusNext %W]} +bind all <> {tk::TabToWindow [tk_focusPrev %W]} + +# ::tk::CancelRepeat -- +# This procedure is invoked to cancel an auto-repeat action described +# by ::tk::Priv(afterId). It's used by several widgets to auto-scroll +# the widget when the mouse is dragged out of the widget with a +# button pressed. +# +# Arguments: +# None. + +proc ::tk::CancelRepeat {} { + variable ::tk::Priv + after cancel $Priv(afterId) + set Priv(afterId) {} +} + +# ::tk::TabToWindow -- +# This procedure moves the focus to the given widget. +# It sends a <> virtual event to the previous focus window, +# if any, before changing the focus, and a <> event +# to the new focus window afterwards. +# +# Arguments: +# w - Window to which focus should be set. + +proc ::tk::TabToWindow {w} { + set focus [focus] + if {$focus ne ""} { + event generate $focus <> + } + focus $w + event generate $w <> +} + +# ::tk::UnderlineAmpersand -- +# This procedure takes some text with ampersand and returns text w/o +# ampersand and position of the ampersand. Double ampersands are +# converted to single ones. Position returned is -1 when there is no +# ampersand. +# +proc ::tk::UnderlineAmpersand {text} { + set s [string map {&& & & \ufeff} $text] + set idx [string first \ufeff $s] + return [list [string map {\ufeff {}} $s] $idx] +} + +# ::tk::SetAmpText -- +# Given widget path and text with "magic ampersands", sets -text and +# -underline options for the widget +# +proc ::tk::SetAmpText {widget text} { + lassign [UnderlineAmpersand $text] newtext under + $widget configure -text $newtext -underline $under +} + +# ::tk::AmpWidget -- +# Creates new widget, turning -text option into -text and -underline +# options, returned by ::tk::UnderlineAmpersand. +# +proc ::tk::AmpWidget {class path args} { + set options {} + foreach {opt val} $args { + if {$opt eq "-text"} { + lassign [UnderlineAmpersand $val] newtext under + lappend options -text $newtext -underline $under + } else { + lappend options $opt $val + } + } + set result [$class $path {*}$options] + if {[string match "*button" $class]} { + bind $path <> [list $path invoke] + } + return $result +} + +# ::tk::AmpMenuArgs -- +# Processes arguments for a menu entry, turning -label option into +# -label and -underline options, returned by ::tk::UnderlineAmpersand. +# The cmd argument is supposed to be either "add" or "entryconfigure" +# +proc ::tk::AmpMenuArgs {widget cmd type args} { + set options {} + foreach {opt val} $args { + if {$opt eq "-label"} { + lassign [UnderlineAmpersand $val] newlabel under + lappend options -label $newlabel -underline $under + } else { + lappend options $opt $val + } + } + $widget $cmd $type {*}$options +} + +# ::tk::FindAltKeyTarget -- +# Search recursively through the hierarchy of visible widgets to find +# button or label which has $char as underlined character. +# +proc ::tk::FindAltKeyTarget {path char} { + set class [winfo class $path] + if {$class in { + Button Checkbutton Label Radiobutton + TButton TCheckbutton TLabel TRadiobutton + } && [string equal -nocase $char \ + [string index [$path cget -text] [$path cget -underline]]]} { + return $path + } + set subwins [concat [grid slaves $path] [pack slaves $path] \ + [place slaves $path]] + if {$class eq "Canvas"} { + foreach item [$path find all] { + if {[$path type $item] eq "window"} { + set w [$path itemcget $item -window] + if {$w ne ""} {lappend subwins $w} + } + } + } elseif {$class eq "Text"} { + lappend subwins {*}[$path window names] + } + foreach child $subwins { + set target [FindAltKeyTarget $child $char] + if {$target ne ""} { + return $target + } + } +} + +# ::tk::AltKeyInDialog -- +# event handler for standard dialogs. Sends <> +# to button or label which has appropriate underlined character. +# +proc ::tk::AltKeyInDialog {path key} { + set target [FindAltKeyTarget $path $key] + if {$target ne ""} { + event generate $target <> + } +} + +# ::tk::mcmaxamp -- +# Replacement for mcmax, used for texts with "magic ampersand" in it. +# + +proc ::tk::mcmaxamp {args} { + set maxlen 0 + foreach arg $args { + # Should we run [mc] in caller's namespace? + lassign [UnderlineAmpersand [mc $arg]] msg + set length [string length $msg] + if {$length > $maxlen} { + set maxlen $length + } + } + return $maxlen +} + +# For now, turn off the custom mdef proc for the mac: + +if {[tk windowingsystem] eq "aqua"} { + namespace eval ::tk::mac { + set useCustomMDEF 0 + } +} + +# Run the Ttk themed widget set initialization +if {$::ttk::library ne ""} { + uplevel \#0 [list source $::ttk::library/ttk.tcl] +} + +# Local Variables: +# mode: tcl +# fill-column: 78 +# End: diff --git a/env/tcl/tk8.6/tkfbox.tcl b/env/tcl/tk8.6/tkfbox.tcl new file mode 100644 index 0000000..f73fdc5 --- /dev/null +++ b/env/tcl/tk8.6/tkfbox.tcl @@ -0,0 +1,1240 @@ +# tkfbox.tcl -- +# +# Implements the "TK" standard file selection dialog box. This dialog +# box is used on the Unix platforms whenever the tk_strictMotif flag is +# not set. +# +# The "TK" standard file selection dialog box is similar to the file +# selection dialog box on Win95(TM). The user can navigate the +# directories by clicking on the folder icons or by selecting the +# "Directory" option menu. The user can select files by clicking on the +# file icons or by entering a filename in the "Filename:" entry. +# +# Copyright (c) 1994-1998 Sun Microsystems, Inc. +# +# See the file "license.terms" for information on usage and redistribution +# of this file, and for a DISCLAIMER OF ALL WARRANTIES. +# + +namespace eval ::tk::dialog {} +namespace eval ::tk::dialog::file { + namespace import -force ::tk::msgcat::* + variable showHiddenBtn 0 + variable showHiddenVar 1 + + # Create the images if they did not already exist. + if {![info exists ::tk::Priv(updirImage)]} { + set ::tk::Priv(updirImage) [image create photo -data { + iVBORw0KGgoAAAANSUhEUgAAABYAAAAWCAYAAADEtGw7AAAABmJLR0QA/gD+AP7rGN + SCAAAACXBIWXMAAA3WAAAN1gGQb3mcAAAACXZwQWcAAAAWAAAAFgDcxelYAAAENUlE + QVQ4y7WUbWiVZRjHf/f9POcc9+Kc5bC2aIq5sGG0XnTzNU13zAIlFMNc9CEhTCKwCC + JIgt7AglaR0RcrolAKg14+GBbiGL6xZiYyy63cmzvu7MVznnOe537rw7bDyvlBoT/c + n+6L3/3nf13XLZLJJP+HfICysjKvqqpq+rWKysvLR1tbW+11g+fPn/+bEGIe4KYqCs + Owu66u7oG2trah6wJrrRc0NTVhjME5h7Vj5pxzCCE4duxYZUdHx/aGhoZmgJ+yb+wF + uCO19RmAffv25f8LFslkktraWtvU1CS6u7vRWmOtxVpbAPu+T0tLS04pFU/J34Wd3S + cdFtlfZWeZBU4IcaS5uXn1ZLAEMMY4ay1aa4wx/zpKKYIgoL6+vmjxqoXe5ZLTcsPq + bTyycjODpe1y3WMrvDAMV14jCuW0VhhjiJQpOJ5w7Zwjk8/y9R+vsHHNNq6oFMrkeX + BxI+8d2sktap3YvOPD0lRQrH+Z81fE7t3WB4gihVKazsuaA20aKSUgAG/seQdy2l6W + 37+EyopqTv39I6HJUT2zlnlza2jLdgiTaxwmDov6alLHcZUTzXPGGAauWJbfO4dHl9 + bgJs3HyfNf0N4ZsOa+jbT3/ownY/hO09p1kBULtjBw+Tvq7xzwauds4dWPDleAcP5E + xlprgtBRUZRgYCRPTzoHwEi2g6OnX+eFrW/RM9qBE4p43CeTz5ATaU6nDrFm2cPs/+ + E1SopqkZ7MFJqntXZaa7IKppckwIEvJbg8LWd28OT6nVihCPQQ8UScWCLGqO4hXuQx + qDtJ204eWrqWb1ufRspwtABWaqx5gRKUFSdwDnxPcuLcyyxbuIyaqntIBV34MY9YzC + Owg+S9YeJFkniRpGPkCLMrZzG3+jbktA/KClMxFoUhiKC0OAbAhd79CO8i6xe/STyW + 4O7KVRgUJ/sP0heeJV4kEVKw/vZd40sFKxat4mLvp6VLdvnb/XHHGGPIKwBBpC1/9n + 3DpfRZnn9/AwCxRII9O79kVPdjvByxuET6Ai8mePeTt4lyheXzhOSpCcdWa00uckTG + kckbGu76nEhbIm2xznH4VB3OWYaiXqQn8GKSWGIMHuXyPL76LBcupmhp69pz4uMnXi + w4VloTGcdQRtGdzmHs1f+RdYZslMZJhzUOHVnceN1ooEiP5JUzdqCQMWCD0JCIeQzn + NNpO+clhrCYf5rC+A2cxWmDUWG2oHEOZMEKIwclgMnnLrTeXUV7sUzpNXgU9DmijWV + v9LEKCkAIhKIBnlvpks6F21qUZ31u/sbExPa9h0/RzwzMov2nGlG5TmW1YOzzlnSfL + mVnyGf19Q7lwZHBp+1fPtflAIgiC7389n9qkihP+lWyeqfUO15ZwQTqlw9H+o2cOvN + QJCAHEgEqgYnI0NyALjAJdyWQy7wMa6AEujUdzo3LjcAXwD/XCTKIRjWytAAAAJXRF + WHRjcmVhdGUtZGF0ZQAyMDA5LTA0LTA2VDIxOjI1OjQxLTAzOjAw8s+uCAAAACV0RV + h0bW9kaWZ5LWRhdGUAMjAwOC0wMS0wM1QxNTowODoyMS0wMjowMJEc/44AAAAZdEVY + dFNvZnR3YXJlAHd3dy5pbmtzY2FwZS5vcmeb7jwaAAAAAElFTkSuQmCC + }] + } + if {![info exists ::tk::Priv(folderImage)]} { + set ::tk::Priv(folderImage) [image create photo -data { + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiA + AAAAlwSFlzAAAN1wAADdcBQiibeAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBl + Lm9yZ5vuPBoAAAHCSURBVDiNpZAxa5NRFIafc+9XLCni4BC6FBycMnbrLpkcgtDVX6 + C70D/g4lZX/4coxLlgxFkpiiSSUGm/JiXfveee45AmNlhawXc53HvPee55X+l2u/yP + qt3d3Tfu/viatwt3fzIYDI5uBJhZr9fr3TMzzAx3B+D09PR+v98/7HQ6z5fNOWdCCG + U4HH6s67oAVDlnV1UmkwmllBUkhMD29nYHeLuEAkyn06qU8qqu64MrgIyqYmZrkHa7 + 3drc3KTVahFjJITAaDRiPB4/XFlQVVMtHH5IzJo/P4EA4MyB+erWPQB7++zs7ccYvl + U5Z08pMW2cl88eIXLZeDUpXzsBkNQ5eP1+p0opmaoCTgzw6fjs6gLLsp58FB60t0Dc + K1Ul54yIEIMQ43Uj68pquDmCeJVztpwzuBNE2LgBoMVpslHMCUEAFgDVxQbzVAiA+a + K5uGPmmDtZF3VpoUm2ArhqQaRiUjcMf81p1G60UEVhcjZfAFTVUkrgkS+jc06mDX9n + vq4YhJ9nlxZExMwMEaHJRutOdWuIIsJFUoBSuTvHJ4YIfP46unV4qdlsjsBRZRtb/X + fHd5+C8+P7+J8BIoxFwovfRxYhnhxjpzEAAAAASUVORK5CYII= + }] + } + if {![info exists ::tk::Priv(fileImage)]} { + set ::tk::Priv(fileImage) [image create photo -data { + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gva + eTAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH1QQWFA84umAmQgAAANpJREFU + OMutkj1uhDAQhb8HSLtbISGfgZ+zbJkix0HmFhwhUdocBnMBGvqtTIqIFSReWKK8ai + x73nwzHrVt+zEMwwvH9FrX9TsA1trpqKy10+yUzME4jnjvAZB0LzXHkojjmDRNVyh3 + A+89zrlVwlKSqKrqVy/J8lAUxSZBSMny4ZLgp54iyPM8UPHGNJ2IomibAKDv+9VlWZ + bABbgB5/0WQgSSkC4PF2JF4JzbHN430c4vhAm0TyCJruuClefph4yCBCGT3T3Isoy/ + KDHGfDZNcz2SZIx547/0BVRRX7n8uT/sAAAAAElFTkSuQmCC + }] + } +} + +# ::tk::dialog::file:: -- +# +# Implements the TK file selection dialog. This dialog is used when the +# tk_strictMotif flag is set to false. This procedure shouldn't be +# called directly. Call tk_getOpenFile or tk_getSaveFile instead. +# +# Arguments: +# type "open" or "save" +# args Options parsed by the procedure. +# + +proc ::tk::dialog::file:: {type args} { + variable ::tk::Priv + variable showHiddenBtn + set dataName __tk_filedialog + upvar ::tk::dialog::file::$dataName data + + Config $dataName $type $args + + if {$data(-parent) eq "."} { + set w .$dataName + } else { + set w $data(-parent).$dataName + } + + # (re)create the dialog box if necessary + # + if {![winfo exists $w]} { + Create $w TkFDialog + } elseif {[winfo class $w] ne "TkFDialog"} { + destroy $w + Create $w TkFDialog + } else { + set data(dirMenuBtn) $w.contents.f1.menu + set data(dirMenu) $w.contents.f1.menu.menu + set data(upBtn) $w.contents.f1.up + set data(icons) $w.contents.icons + set data(ent) $w.contents.f2.ent + set data(typeMenuLab) $w.contents.f2.lab2 + set data(typeMenuBtn) $w.contents.f2.menu + set data(typeMenu) $data(typeMenuBtn).m + set data(okBtn) $w.contents.f2.ok + set data(cancelBtn) $w.contents.f2.cancel + set data(hiddenBtn) $w.contents.f2.hidden + SetSelectMode $w $data(-multiple) + } + if {$showHiddenBtn} { + $data(hiddenBtn) configure -state normal + grid $data(hiddenBtn) + } else { + $data(hiddenBtn) configure -state disabled + grid remove $data(hiddenBtn) + } + + # Make sure subseqent uses of this dialog are independent [Bug 845189] + unset -nocomplain data(extUsed) + + # Dialog boxes should be transient with respect to their parent, so that + # they will always stay on top of their parent window. However, some + # window managers will create the window as withdrawn if the parent window + # is withdrawn or iconified. Combined with the grab we put on the window, + # this can hang the entire application. Therefore we only make the dialog + # transient if the parent is viewable. + + if {[winfo viewable [winfo toplevel $data(-parent)]]} { + wm transient $w $data(-parent) + } + + # Add traces on the selectPath variable + # + + trace add variable data(selectPath) write \ + [list ::tk::dialog::file::SetPath $w] + $data(dirMenuBtn) configure \ + -textvariable ::tk::dialog::file::${dataName}(selectPath) + + # Cleanup previous menu + # + $data(typeMenu) delete 0 end + $data(typeMenuBtn) configure -state normal -text "" + + # Initialize the file types menu + # + if {[llength $data(-filetypes)]} { + # Default type and name to first entry + set initialtype [lindex $data(-filetypes) 0] + set initialTypeName [lindex $initialtype 0] + if {$data(-typevariable) ne ""} { + upvar #0 $data(-typevariable) typeVariable + if {[info exists typeVariable]} { + set initialTypeName $typeVariable + } + } + foreach type $data(-filetypes) { + set title [lindex $type 0] + set filter [lindex $type 1] + $data(typeMenu) add command -label $title \ + -command [list ::tk::dialog::file::SetFilter $w $type] + # [string first] avoids glob-pattern char issues + if {[string first ${initialTypeName} $title] == 0} { + set initialtype $type + } + } + SetFilter $w $initialtype + $data(typeMenuBtn) configure -state normal + $data(typeMenuLab) configure -state normal + } else { + set data(filter) "*" + $data(typeMenuBtn) configure -state disabled -takefocus 0 + $data(typeMenuLab) configure -state disabled + } + UpdateWhenIdle $w + + # Withdraw the window, then update all the geometry information + # so we know how big it wants to be, then center the window in the + # display (Motif style) and de-iconify it. + + ::tk::PlaceWindow $w widget $data(-parent) + wm title $w $data(-title) + + # Set a grab and claim the focus too. + + ::tk::SetFocusGrab $w $data(ent) + $data(ent) delete 0 end + $data(ent) insert 0 $data(selectFile) + $data(ent) selection range 0 end + $data(ent) icursor end + + # Wait for the user to respond, then restore the focus and return the + # index of the selected button. Restore the focus before deleting the + # window, since otherwise the window manager may take the focus away so we + # can't redirect it. Finally, restore any grab that was in effect. + + vwait ::tk::Priv(selectFilePath) + + ::tk::RestoreFocusGrab $w $data(ent) withdraw + + # Cleanup traces on selectPath variable + # + + foreach trace [trace info variable data(selectPath)] { + trace remove variable data(selectPath) {*}$trace + } + $data(dirMenuBtn) configure -textvariable {} + + return $Priv(selectFilePath) +} + +# ::tk::dialog::file::Config -- +# +# Configures the TK filedialog according to the argument list +# +proc ::tk::dialog::file::Config {dataName type argList} { + upvar ::tk::dialog::file::$dataName data + + set data(type) $type + + # 0: Delete all variable that were set on data(selectPath) the + # last time the file dialog is used. The traces may cause troubles + # if the dialog is now used with a different -parent option. + + foreach trace [trace info variable data(selectPath)] { + trace remove variable data(selectPath) {*}$trace + } + + # 1: the configuration specs + # + set specs { + {-defaultextension "" "" ""} + {-filetypes "" "" ""} + {-initialdir "" "" ""} + {-initialfile "" "" ""} + {-parent "" "" "."} + {-title "" "" ""} + {-typevariable "" "" ""} + } + + # The "-multiple" option is only available for the "open" file dialog. + # + if {$type eq "open"} { + lappend specs {-multiple "" "" "0"} + } + + # The "-confirmoverwrite" option is only for the "save" file dialog. + # + if {$type eq "save"} { + lappend specs {-confirmoverwrite "" "" "1"} + } + + # 2: default values depending on the type of the dialog + # + if {![info exists data(selectPath)]} { + # first time the dialog has been popped up + set data(selectPath) [pwd] + set data(selectFile) "" + } + + # 3: parse the arguments + # + tclParseConfigSpec ::tk::dialog::file::$dataName $specs "" $argList + + if {$data(-title) eq ""} { + if {$type eq "open"} { + set data(-title) [mc "Open"] + } else { + set data(-title) [mc "Save As"] + } + } + + # 4: set the default directory and selection according to the -initial + # settings + # + if {$data(-initialdir) ne ""} { + # Ensure that initialdir is an absolute path name. + if {[file isdirectory $data(-initialdir)]} { + set old [pwd] + cd $data(-initialdir) + set data(selectPath) [pwd] + cd $old + } else { + set data(selectPath) [pwd] + } + } + set data(selectFile) $data(-initialfile) + + # 5. Parse the -filetypes option + # + set data(origfiletypes) $data(-filetypes) + set data(-filetypes) [::tk::FDGetFileTypes $data(-filetypes)] + + if {![winfo exists $data(-parent)]} { + return -code error -errorcode [list TK LOOKUP WINDOW $data(-parent)] \ + "bad window path name \"$data(-parent)\"" + } + + # Set -multiple to a one or zero value (not other boolean types like + # "yes") so we can use it in tests more easily. + if {$type eq "save"} { + set data(-multiple) 0 + } elseif {$data(-multiple)} { + set data(-multiple) 1 + } else { + set data(-multiple) 0 + } +} + +proc ::tk::dialog::file::Create {w class} { + set dataName [lindex [split $w .] end] + upvar ::tk::dialog::file::$dataName data + variable ::tk::Priv + global tk_library + + toplevel $w -class $class + if {[tk windowingsystem] eq "x11"} {wm attributes $w -type dialog} + pack [ttk::frame $w.contents] -expand 1 -fill both + #set w $w.contents + + # f1: the frame with the directory option menu + # + set f1 [ttk::frame $w.contents.f1] + bind [::tk::AmpWidget ttk::label $f1.lab -text [mc "&Directory:"]] \ + <> [list focus $f1.menu] + + set data(dirMenuBtn) $f1.menu + if {![info exists data(selectPath)]} { + set data(selectPath) "" + } + set data(dirMenu) $f1.menu.menu + ttk::menubutton $f1.menu -menu $data(dirMenu) -direction flush \ + -textvariable [format %s(selectPath) ::tk::dialog::file::$dataName] + menu $data(dirMenu) -tearoff 0 + $data(dirMenu) add radiobutton -label "" -variable \ + [format %s(selectPath) ::tk::dialog::file::$dataName] + set data(upBtn) [ttk::button $f1.up] + $data(upBtn) configure -image $Priv(updirImage) + + $f1.menu configure -takefocus 1;# -highlightthickness 2 + + pack $data(upBtn) -side right -padx 4 -fill both + pack $f1.lab -side left -padx 4 -fill both + pack $f1.menu -expand yes -fill both -padx 4 + + # data(icons): the IconList that list the files and directories. + # + if {$class eq "TkFDialog"} { + if { $data(-multiple) } { + set fNameCaption [mc "File &names:"] + } else { + set fNameCaption [mc "File &name:"] + } + set fTypeCaption [mc "Files of &type:"] + set iconListCommand [list ::tk::dialog::file::OkCmd $w] + } else { + set fNameCaption [mc "&Selection:"] + set iconListCommand [list ::tk::dialog::file::chooseDir::DblClick $w] + } + set data(icons) [::tk::IconList $w.contents.icons \ + -command $iconListCommand -multiple $data(-multiple)] + bind $data(icons) <> \ + [list ::tk::dialog::file::ListBrowse $w] + + # f2: the frame with the OK button, cancel button, "file name" field + # and file types field. + # + set f2 [ttk::frame $w.contents.f2] + bind [::tk::AmpWidget ttk::label $f2.lab -text $fNameCaption -anchor e]\ + <> [list focus $f2.ent] + # -pady 0 + set data(ent) [ttk::entry $f2.ent] + + # The font to use for the icons. The default Canvas font on Unix is just + # deviant. + set ::tk::$w.contents.icons(font) [$data(ent) cget -font] + + # Make the file types bits only if this is a File Dialog + if {$class eq "TkFDialog"} { + set data(typeMenuLab) [::tk::AmpWidget ttk::label $f2.lab2 \ + -text $fTypeCaption -anchor e] + # -pady [$f2.lab cget -pady] + set data(typeMenuBtn) [ttk::menubutton $f2.menu \ + -menu $f2.menu.m] + # -indicatoron 1 + set data(typeMenu) [menu $data(typeMenuBtn).m -tearoff 0] + # $data(typeMenuBtn) configure -takefocus 1 -relief raised -anchor w + bind $data(typeMenuLab) <> [list \ + focus $data(typeMenuBtn)] + } + + # The hidden button is displayed when ::tk::dialog::file::showHiddenBtn is + # true. Create it disabled so the binding doesn't trigger if it isn't + # shown. + if {$class eq "TkFDialog"} { + set text [mc "Show &Hidden Files and Directories"] + } else { + set text [mc "Show &Hidden Directories"] + } + set data(hiddenBtn) [::tk::AmpWidget ttk::checkbutton $f2.hidden \ + -text $text -state disabled \ + -variable ::tk::dialog::file::showHiddenVar \ + -command [list ::tk::dialog::file::UpdateWhenIdle $w]] +# -anchor w -padx 3 + + # the okBtn is created after the typeMenu so that the keyboard traversal + # is in the right order, and add binding so that we find out when the + # dialog is destroyed by the user (added here instead of to the overall + # window so no confusion about how much gets called; exactly + # once will do). [Bug 987169] + + set data(okBtn) [::tk::AmpWidget ttk::button $f2.ok \ + -text [mc "&OK"] -default active];# -pady 3] + bind $data(okBtn) [list ::tk::dialog::file::Destroyed $w] + set data(cancelBtn) [::tk::AmpWidget ttk::button $f2.cancel \ + -text [mc "&Cancel"] -default normal];# -pady 3] + + # grid the widgets in f2 + # + grid $f2.lab $f2.ent $data(okBtn) -padx 4 -pady 3 -sticky ew + grid configure $f2.ent -padx 2 + if {$class eq "TkFDialog"} { + grid $data(typeMenuLab) $data(typeMenuBtn) $data(cancelBtn) \ + -padx 4 -sticky ew + grid configure $data(typeMenuBtn) -padx 0 + grid $data(hiddenBtn) -columnspan 2 -padx 4 -sticky ew + } else { + grid $data(hiddenBtn) - $data(cancelBtn) -padx 4 -sticky ew + } + grid columnconfigure $f2 1 -weight 1 + + # Pack all the frames together. We are done with widget construction. + # + pack $f1 -side top -fill x -pady 4 + pack $f2 -side bottom -pady 4 -fill x + pack $data(icons) -expand yes -fill both -padx 4 -pady 1 + + # Set up the event handlers that are common to Directory and File Dialogs + # + + wm protocol $w WM_DELETE_WINDOW [list ::tk::dialog::file::CancelCmd $w] + $data(upBtn) configure -command [list ::tk::dialog::file::UpDirCmd $w] + $data(cancelBtn) configure -command [list ::tk::dialog::file::CancelCmd $w] + bind $w [list $data(cancelBtn) invoke] + bind $w [list tk::AltKeyInDialog $w %A] + + # Set up event handlers specific to File or Directory Dialogs + # + if {$class eq "TkFDialog"} { + bind $data(ent) [list ::tk::dialog::file::ActivateEnt $w] + $data(okBtn) configure -command [list ::tk::dialog::file::OkCmd $w] + bind $w [format { + if {[%s cget -state] eq "normal"} { + focus %s + } + } $data(typeMenuBtn) $data(typeMenuBtn)] + } else { + set okCmd [list ::tk::dialog::file::chooseDir::OkCmd $w] + bind $data(ent) $okCmd + $data(okBtn) configure -command $okCmd + bind $w [list focus $data(ent)] + bind $w [list $data(okBtn) invoke] + } + bind $w [list $data(hiddenBtn) invoke] + bind $data(ent) [list ::tk::dialog::file::CompleteEnt $w] + + # Build the focus group for all the entries + # + ::tk::FocusGroup_Create $w + ::tk::FocusGroup_BindIn $w $data(ent) [list \ + ::tk::dialog::file::EntFocusIn $w] + ::tk::FocusGroup_BindOut $w $data(ent) [list \ + ::tk::dialog::file::EntFocusOut $w] +} + +# ::tk::dialog::file::SetSelectMode -- +# +# Set the select mode of the dialog to single select or multi-select. +# +# Arguments: +# w The dialog path. +# multi 1 if the dialog is multi-select; 0 otherwise. +# +# Results: +# None. + +proc ::tk::dialog::file::SetSelectMode {w multi} { + set dataName __tk_filedialog + upvar ::tk::dialog::file::$dataName data + if { $multi } { + set fNameCaption [mc "File &names:"] + } else { + set fNameCaption [mc "File &name:"] + } + set iconListCommand [list ::tk::dialog::file::OkCmd $w] + ::tk::SetAmpText $w.contents.f2.lab $fNameCaption + $data(icons) configure -multiple $multi -command $iconListCommand + return +} + +# ::tk::dialog::file::UpdateWhenIdle -- +# +# Creates an idle event handler which updates the dialog in idle time. +# This is important because loading the directory may take a long time +# and we don't want to load the same directory for multiple times due to +# multiple concurrent events. +# +proc ::tk::dialog::file::UpdateWhenIdle {w} { + upvar ::tk::dialog::file::[winfo name $w] data + + if {[info exists data(updateId)]} { + return + } + set data(updateId) [after idle [list ::tk::dialog::file::Update $w]] +} + +# ::tk::dialog::file::Update -- +# +# Loads the files and directories into the IconList widget. Also sets up +# the directory option menu for quick access to parent directories. +# +proc ::tk::dialog::file::Update {w} { + # This proc may be called within an idle handler. Make sure that the + # window has not been destroyed before this proc is called + if {![winfo exists $w]} { + return + } + set class [winfo class $w] + if {($class ne "TkFDialog") && ($class ne "TkChooseDir")} { + return + } + + set dataName [winfo name $w] + upvar ::tk::dialog::file::$dataName data + variable ::tk::Priv + variable showHiddenVar + global tk_library + unset -nocomplain data(updateId) + + set folder $Priv(folderImage) + set file $Priv(fileImage) + + set appPWD [pwd] + if {[catch { + cd $data(selectPath) + }]} then { + # We cannot change directory to $data(selectPath). $data(selectPath) + # should have been checked before ::tk::dialog::file::Update is + # called, so we normally won't come to here. Anyways, give an error + # and abort action. + tk_messageBox -type ok -parent $w -icon warning -message [mc \ + "Cannot change to the directory \"%1\$s\".\nPermission denied."\ + $data(selectPath)] + cd $appPWD + return + } + + # Turn on the busy cursor. BUG?? We haven't disabled X events, though, + # so the user may still click and cause havoc ... + # + set entCursor [$data(ent) cget -cursor] + set dlgCursor [$w cget -cursor] + $data(ent) configure -cursor watch + $w configure -cursor watch + update idletasks + + $data(icons) deleteall + + set showHidden $showHiddenVar + + # Make the dir list. Note that using an explicit [pwd] (instead of '.') is + # better in some VFS cases. + $data(icons) add $folder [GlobFiltered [pwd] d 1] + + if {$class eq "TkFDialog"} { + # Make the file list if this is a File Dialog, selecting all but + # 'd'irectory type files. + # + $data(icons) add $file [GlobFiltered [pwd] {f b c l p s}] + } + + # Update the Directory: option menu + # + set list "" + set dir "" + foreach subdir [file split $data(selectPath)] { + set dir [file join $dir $subdir] + lappend list $dir + } + + $data(dirMenu) delete 0 end + set var [format %s(selectPath) ::tk::dialog::file::$dataName] + foreach path $list { + $data(dirMenu) add command -label $path -command [list set $var $path] + } + + # Restore the PWD to the application's PWD + # + cd $appPWD + + if {$class eq "TkFDialog"} { + # Restore the Open/Save Button if this is a File Dialog + # + if {$data(type) eq "open"} { + ::tk::SetAmpText $data(okBtn) [mc "&Open"] + } else { + ::tk::SetAmpText $data(okBtn) [mc "&Save"] + } + } + + # turn off the busy cursor. + # + $data(ent) configure -cursor $entCursor + $w configure -cursor $dlgCursor +} + +# ::tk::dialog::file::SetPathSilently -- +# +# Sets data(selectPath) without invoking the trace procedure +# +proc ::tk::dialog::file::SetPathSilently {w path} { + upvar ::tk::dialog::file::[winfo name $w] data + + set cb [list ::tk::dialog::file::SetPath $w] + trace remove variable data(selectPath) write $cb + set data(selectPath) $path + trace add variable data(selectPath) write $cb +} + + +# This proc gets called whenever data(selectPath) is set +# +proc ::tk::dialog::file::SetPath {w name1 name2 op} { + if {[winfo exists $w]} { + upvar ::tk::dialog::file::[winfo name $w] data + UpdateWhenIdle $w + # On directory dialogs, we keep the entry in sync with the currentdir. + if {[winfo class $w] eq "TkChooseDir"} { + $data(ent) delete 0 end + $data(ent) insert end $data(selectPath) + } + } +} + +# This proc gets called whenever data(filter) is set +# +proc ::tk::dialog::file::SetFilter {w type} { + upvar ::tk::dialog::file::[winfo name $w] data + + set data(filterType) $type + set data(filter) [lindex $type 1] + $data(typeMenuBtn) configure -text [lindex $type 0] ;#-indicatoron 1 + + # If we aren't using a default extension, use the one suppled by the + # filter. + if {![info exists data(extUsed)]} { + if {[string length $data(-defaultextension)]} { + set data(extUsed) 1 + } else { + set data(extUsed) 0 + } + } + + if {!$data(extUsed)} { + # Get the first extension in the list that matches {^\*\.\w+$} and + # remove all * from the filter. + set index [lsearch -regexp $data(filter) {^\*\.\w+$}] + if {$index >= 0} { + set data(-defaultextension) \ + [string trimleft [lindex $data(filter) $index] "*"] + } else { + # Couldn't find anything! Reset to a safe default... + set data(-defaultextension) "" + } + } + + $data(icons) see 0 + + UpdateWhenIdle $w +} + +# tk::dialog::file::ResolveFile -- +# +# Interpret the user's text input in a file selection dialog. Performs: +# +# (1) ~ substitution +# (2) resolve all instances of . and .. +# (3) check for non-existent files/directories +# (4) check for chdir permissions +# (5) conversion of environment variable references to their +# contents (once only) +# +# Arguments: +# context: the current directory you are in +# text: the text entered by the user +# defaultext: the default extension to add to files with no extension +# expandEnv: whether to expand environment variables (yes by default) +# +# Return vaue: +# [list $flag $directory $file] +# +# flag = OK : valid input +# = PATTERN : valid directory/pattern +# = PATH : the directory does not exist +# = FILE : the directory exists by the file doesn't exist +# = CHDIR : Cannot change to the directory +# = ERROR : Invalid entry +# +# directory : valid only if flag = OK or PATTERN or FILE +# file : valid only if flag = OK or PATTERN +# +# directory may not be the same as context, because text may contain a +# subdirectory name +# +proc ::tk::dialog::file::ResolveFile {context text defaultext {expandEnv 1}} { + set appPWD [pwd] + + set path [JoinFile $context $text] + + # If the file has no extension, append the default. Be careful not to do + # this for directories, otherwise typing a dirname in the box will give + # back "dirname.extension" instead of trying to change dir. + if { + ![file isdirectory $path] && ([file ext $path] eq "") && + ![string match {$*} [file tail $path]] + } then { + set path "$path$defaultext" + } + + if {[catch {file exists $path}]} { + # This "if" block can be safely removed if the following code stop + # generating errors. + # + # file exists ~nonsuchuser + # + return [list ERROR $path ""] + } + + if {[file exists $path]} { + if {[file isdirectory $path]} { + if {[catch {cd $path}]} { + return [list CHDIR $path ""] + } + set directory [pwd] + set file "" + set flag OK + cd $appPWD + } else { + if {[catch {cd [file dirname $path]}]} { + return [list CHDIR [file dirname $path] ""] + } + set directory [pwd] + set file [file tail $path] + set flag OK + cd $appPWD + } + } else { + set dirname [file dirname $path] + if {[file exists $dirname]} { + if {[catch {cd $dirname}]} { + return [list CHDIR $dirname ""] + } + set directory [pwd] + cd $appPWD + set file [file tail $path] + # It's nothing else, so check to see if it is an env-reference + if {$expandEnv && [string match {$*} $file]} { + set var [string range $file 1 end] + if {[info exist ::env($var)]} { + return [ResolveFile $context $::env($var) $defaultext 0] + } + } + if {[regexp {[*?]} $file]} { + set flag PATTERN + } else { + set flag FILE + } + } else { + set directory $dirname + set file [file tail $path] + set flag PATH + # It's nothing else, so check to see if it is an env-reference + if {$expandEnv && [string match {$*} $file]} { + set var [string range $file 1 end] + if {[info exist ::env($var)]} { + return [ResolveFile $context $::env($var) $defaultext 0] + } + } + } + } + + return [list $flag $directory $file] +} + + +# Gets called when the entry box gets keyboard focus. We clear the selection +# from the icon list . This way the user can be certain that the input in the +# entry box is the selection. +# +proc ::tk::dialog::file::EntFocusIn {w} { + upvar ::tk::dialog::file::[winfo name $w] data + + if {[$data(ent) get] ne ""} { + $data(ent) selection range 0 end + $data(ent) icursor end + } else { + $data(ent) selection clear + } + + if {[winfo class $w] eq "TkFDialog"} { + # If this is a File Dialog, make sure the buttons are labeled right. + if {$data(type) eq "open"} { + ::tk::SetAmpText $data(okBtn) [mc "&Open"] + } else { + ::tk::SetAmpText $data(okBtn) [mc "&Save"] + } + } +} + +proc ::tk::dialog::file::EntFocusOut {w} { + upvar ::tk::dialog::file::[winfo name $w] data + + $data(ent) selection clear +} + + +# Gets called when user presses Return in the "File name" entry. +# +proc ::tk::dialog::file::ActivateEnt {w} { + upvar ::tk::dialog::file::[winfo name $w] data + + set text [$data(ent) get] + if {$data(-multiple)} { + foreach t $text { + VerifyFileName $w $t + } + } else { + VerifyFileName $w $text + } +} + +# Verification procedure +# +proc ::tk::dialog::file::VerifyFileName {w filename} { + upvar ::tk::dialog::file::[winfo name $w] data + + set list [ResolveFile $data(selectPath) $filename $data(-defaultextension)] + foreach {flag path file} $list { + break + } + + switch -- $flag { + OK { + if {$file eq ""} { + # user has entered an existing (sub)directory + set data(selectPath) $path + $data(ent) delete 0 end + } else { + SetPathSilently $w $path + if {$data(-multiple)} { + lappend data(selectFile) $file + } else { + set data(selectFile) $file + } + Done $w + } + } + PATTERN { + set data(selectPath) $path + set data(filter) $file + } + FILE { + if {$data(type) eq "open"} { + tk_messageBox -icon warning -type ok -parent $w \ + -message [mc "File \"%1\$s\" does not exist." \ + [file join $path $file]] + $data(ent) selection range 0 end + $data(ent) icursor end + } else { + SetPathSilently $w $path + if {$data(-multiple)} { + lappend data(selectFile) $file + } else { + set data(selectFile) $file + } + Done $w + } + } + PATH { + tk_messageBox -icon warning -type ok -parent $w \ + -message [mc "Directory \"%1\$s\" does not exist." $path] + $data(ent) selection range 0 end + $data(ent) icursor end + } + CHDIR { + tk_messageBox -type ok -parent $w -icon warning -message \ + [mc "Cannot change to the directory\ + \"%1\$s\".\nPermission denied." $path] + $data(ent) selection range 0 end + $data(ent) icursor end + } + ERROR { + tk_messageBox -type ok -parent $w -icon warning -message \ + [mc "Invalid file name \"%1\$s\"." $path] + $data(ent) selection range 0 end + $data(ent) icursor end + } + } +} + +# Gets called when user presses the Alt-s or Alt-o keys. +# +proc ::tk::dialog::file::InvokeBtn {w key} { + upvar ::tk::dialog::file::[winfo name $w] data + + if {[$data(okBtn) cget -text] eq $key} { + $data(okBtn) invoke + } +} + +# Gets called when user presses the "parent directory" button +# +proc ::tk::dialog::file::UpDirCmd {w} { + upvar ::tk::dialog::file::[winfo name $w] data + + if {$data(selectPath) ne "/"} { + set data(selectPath) [file dirname $data(selectPath)] + } +} + +# Join a file name to a path name. The "file join" command will break if the +# filename begins with ~ +# +proc ::tk::dialog::file::JoinFile {path file} { + if {[string match {~*} $file] && [file exists $path/$file]} { + return [file join $path ./$file] + } else { + return [file join $path $file] + } +} + +# Gets called when user presses the "OK" button +# +proc ::tk::dialog::file::OkCmd {w} { + upvar ::tk::dialog::file::[winfo name $w] data + + set filenames {} + foreach item [$data(icons) selection get] { + lappend filenames [$data(icons) get $item] + } + + if { + ([llength $filenames] && !$data(-multiple)) || + ($data(-multiple) && ([llength $filenames] == 1)) + } then { + set filename [lindex $filenames 0] + set file [JoinFile $data(selectPath) $filename] + if {[file isdirectory $file]} { + ListInvoke $w [list $filename] + return + } + } + + ActivateEnt $w +} + +# Gets called when user presses the "Cancel" button +# +proc ::tk::dialog::file::CancelCmd {w} { + upvar ::tk::dialog::file::[winfo name $w] data + variable ::tk::Priv + + bind $data(okBtn) {} + set Priv(selectFilePath) "" +} + +# Gets called when user destroys the dialog directly [Bug 987169] +# +proc ::tk::dialog::file::Destroyed {w} { + upvar ::tk::dialog::file::[winfo name $w] data + variable ::tk::Priv + + set Priv(selectFilePath) "" +} + +# Gets called when user browses the IconList widget (dragging mouse, arrow +# keys, etc) +# +proc ::tk::dialog::file::ListBrowse {w} { + upvar ::tk::dialog::file::[winfo name $w] data + + set text {} + foreach item [$data(icons) selection get] { + lappend text [$data(icons) get $item] + } + if {[llength $text] == 0} { + return + } + if {$data(-multiple)} { + set newtext {} + foreach file $text { + set fullfile [JoinFile $data(selectPath) $file] + if { ![file isdirectory $fullfile] } { + lappend newtext $file + } + } + set text $newtext + set isDir 0 + } else { + set text [lindex $text 0] + set file [JoinFile $data(selectPath) $text] + set isDir [file isdirectory $file] + } + if {!$isDir} { + $data(ent) delete 0 end + $data(ent) insert 0 $text + + if {[winfo class $w] eq "TkFDialog"} { + if {$data(type) eq "open"} { + ::tk::SetAmpText $data(okBtn) [mc "&Open"] + } else { + ::tk::SetAmpText $data(okBtn) [mc "&Save"] + } + } + } elseif {[winfo class $w] eq "TkFDialog"} { + ::tk::SetAmpText $data(okBtn) [mc "&Open"] + } +} + +# Gets called when user invokes the IconList widget (double-click, Return key, +# etc) +# +proc ::tk::dialog::file::ListInvoke {w filenames} { + upvar ::tk::dialog::file::[winfo name $w] data + + if {[llength $filenames] == 0} { + return + } + + set file [JoinFile $data(selectPath) [lindex $filenames 0]] + + set class [winfo class $w] + if {$class eq "TkChooseDir" || [file isdirectory $file]} { + set appPWD [pwd] + if {[catch {cd $file}]} { + tk_messageBox -type ok -parent $w -icon warning -message \ + [mc "Cannot change to the directory \"%1\$s\".\nPermission denied." $file] + } else { + cd $appPWD + set data(selectPath) $file + } + } else { + if {$data(-multiple)} { + set data(selectFile) $filenames + } else { + set data(selectFile) $file + } + Done $w + } +} + +# ::tk::dialog::file::Done -- +# +# Gets called when user has input a valid filename. Pops up a dialog +# box to confirm selection when necessary. Sets the +# tk::Priv(selectFilePath) variable, which will break the "vwait" loop +# in ::tk::dialog::file:: and return the selected filename to the script +# that calls tk_getOpenFile or tk_getSaveFile +# +proc ::tk::dialog::file::Done {w {selectFilePath ""}} { + upvar ::tk::dialog::file::[winfo name $w] data + variable ::tk::Priv + + if {$selectFilePath eq ""} { + if {$data(-multiple)} { + set selectFilePath {} + foreach f $data(selectFile) { + lappend selectFilePath [JoinFile $data(selectPath) $f] + } + } else { + set selectFilePath [JoinFile $data(selectPath) $data(selectFile)] + } + + set Priv(selectFile) $data(selectFile) + set Priv(selectPath) $data(selectPath) + + if {($data(type) eq "save") && $data(-confirmoverwrite) && [file exists $selectFilePath]} { + set reply [tk_messageBox -icon warning -type yesno -parent $w \ + -message [mc "File \"%1\$s\" already exists.\nDo you want\ + to overwrite it?" $selectFilePath]] + if {$reply eq "no"} { + return + } + } + if { + [info exists data(-typevariable)] && $data(-typevariable) ne "" + && [info exists data(-filetypes)] && [llength $data(-filetypes)] + && [info exists data(filterType)] && $data(filterType) ne "" + } then { + upvar #0 $data(-typevariable) typeVariable + set typeVariable [lindex $data(origfiletypes) \ + [lsearch -exact $data(-filetypes) $data(filterType)] 0] + + } + } + bind $data(okBtn) {} + set Priv(selectFilePath) $selectFilePath +} + +# ::tk::dialog::file::GlobFiltered -- +# +# Gets called to do globbing, returning the results and filtering them +# according to the current filter (and removing the entries for '.' and +# '..' which are never shown). Deals with evil cases such as where the +# user is supplying a filter which is an invalid list or where it has an +# unbalanced brace. The resulting list will be dictionary sorted. +# +# Arguments: +# dir Which directory to search +# type List of filetypes to look for ('d' or 'f b c l p s') +# overrideFilter Whether to ignore the filter for this search. +# +# NB: Assumes that the caller has mapped the state variable to 'data'. +# +proc ::tk::dialog::file::GlobFiltered {dir type {overrideFilter 0}} { + variable showHiddenVar + upvar 1 data(filter) filter + + if {$filter eq "*" || $overrideFilter} { + set patterns [list *] + if {$showHiddenVar} { + lappend patterns .* + } + } elseif {[string is list $filter]} { + set patterns $filter + } else { + # Invalid list; assume we can use non-whitespace sequences as words + set patterns [regexp -inline -all {\S+} $filter] + } + + set opts [list -tails -directory $dir -type $type -nocomplain] + + set result {} + catch { + # We have a catch because we might have a really bad pattern (e.g., + # with an unbalanced brace); even [glob -nocomplain] doesn't like it. + # Using a catch ensures that it just means we match nothing instead of + # throwing a nasty error at the user... + foreach f [glob {*}$opts -- {*}$patterns] { + if {$f eq "." || $f eq ".."} { + continue + } + # See ticket [1641721], $f might be a link pointing to a dir + if {$type != "d" && [file isdir [file join $dir $f]]} { + continue + } + lappend result $f + } + } + return [lsort -dictionary -unique $result] +} + +proc ::tk::dialog::file::CompleteEnt {w} { + upvar ::tk::dialog::file::[winfo name $w] data + set f [$data(ent) get] + if {$data(-multiple)} { + if {![string is list $f] || [llength $f] != 1} { + return -code break + } + set f [lindex $f 0] + } + + # Get list of matching filenames and dirnames + set files [if {[winfo class $w] eq "TkFDialog"} { + GlobFiltered $data(selectPath) {f b c l p s} + }] + set dirs2 {} + foreach d [GlobFiltered $data(selectPath) d] {lappend dirs2 $d/} + + set targets [concat \ + [lsearch -glob -all -inline $files $f*] \ + [lsearch -glob -all -inline $dirs2 $f*]] + + if {[llength $targets] == 1} { + # We have a winner! + set f [lindex $targets 0] + } elseif {$f in $targets || [llength $targets] == 0} { + if {[string length $f] > 0} { + bell + } + return + } elseif {[llength $targets] > 1} { + # Multiple possibles + if {[string length $f] == 0} { + return + } + set t0 [lindex $targets 0] + for {set len [string length $t0]} {$len>0} {} { + set allmatch 1 + foreach s $targets { + if {![string equal -length $len $s $t0]} { + set allmatch 0 + break + } + } + incr len -1 + if {$allmatch} break + } + set f [string range $t0 0 $len] + } + + if {$data(-multiple)} { + set f [list $f] + } + $data(ent) delete 0 end + $data(ent) insert 0 $f + return -code break +} diff --git a/env/tcl/tk8.6/ttk/altTheme.tcl b/env/tcl/tk8.6/ttk/altTheme.tcl new file mode 100644 index 0000000..6fc76f8 --- /dev/null +++ b/env/tcl/tk8.6/ttk/altTheme.tcl @@ -0,0 +1,111 @@ +# +# Ttk widget set: Alternate theme +# + +namespace eval ttk::theme::alt { + + variable colors + array set colors { + -frame "#d9d9d9" + -window "#ffffff" + -darker "#c3c3c3" + -border "#414141" + -activebg "#ececec" + -disabledfg "#a3a3a3" + -selectbg "#4a6984" + -selectfg "#ffffff" + -altindicator "#aaaaaa" + } + + ttk::style theme settings alt { + + ttk::style configure "." \ + -background $colors(-frame) \ + -foreground black \ + -troughcolor $colors(-darker) \ + -bordercolor $colors(-border) \ + -selectbackground $colors(-selectbg) \ + -selectforeground $colors(-selectfg) \ + -font TkDefaultFont \ + ; + + ttk::style map "." -background \ + [list disabled $colors(-frame) active $colors(-activebg)] ; + ttk::style map "." -foreground [list disabled $colors(-disabledfg)] ; + ttk::style map "." -embossed [list disabled 1] ; + + ttk::style configure TButton \ + -anchor center -width -11 -padding "1 1" \ + -relief raised -shiftrelief 1 \ + -highlightthickness 1 -highlightcolor $colors(-frame) + + ttk::style map TButton -relief { + {pressed !disabled} sunken + {active !disabled} raised + } -highlightcolor {alternate black} + + ttk::style configure TCheckbutton -indicatorcolor "#ffffff" -padding 2 + ttk::style configure TRadiobutton -indicatorcolor "#ffffff" -padding 2 + ttk::style map TCheckbutton -indicatorcolor \ + [list pressed $colors(-frame) \ + alternate $colors(-altindicator) \ + disabled $colors(-frame)] + ttk::style map TRadiobutton -indicatorcolor \ + [list pressed $colors(-frame) \ + alternate $colors(-altindicator) \ + disabled $colors(-frame)] + + ttk::style configure TMenubutton \ + -width -11 -padding "3 3" -relief raised + + ttk::style configure TEntry -padding 1 + ttk::style map TEntry -fieldbackground \ + [list readonly $colors(-frame) disabled $colors(-frame)] + ttk::style configure TCombobox -padding 1 + ttk::style map TCombobox -fieldbackground \ + [list readonly $colors(-frame) disabled $colors(-frame)] \ + -arrowcolor [list disabled $colors(-disabledfg)] + ttk::style configure ComboboxPopdownFrame \ + -relief solid -borderwidth 1 + + ttk::style configure TSpinbox -arrowsize 10 -padding {2 0 10 0} + ttk::style map TSpinbox -fieldbackground \ + [list readonly $colors(-frame) disabled $colors(-frame)] \ + -arrowcolor [list disabled $colors(-disabledfg)] + + ttk::style configure Toolbutton -relief flat -padding 2 + ttk::style map Toolbutton -relief \ + {disabled flat selected sunken pressed sunken active raised} + ttk::style map Toolbutton -background \ + [list pressed $colors(-darker) active $colors(-activebg)] + + ttk::style configure TScrollbar -relief raised + + ttk::style configure TLabelframe -relief groove -borderwidth 2 + + ttk::style configure TNotebook -tabmargins {2 2 1 0} + ttk::style configure TNotebook.Tab \ + -padding {4 2} -background $colors(-darker) + ttk::style map TNotebook.Tab \ + -background [list selected $colors(-frame)] \ + -expand [list selected {2 2 1 0}] \ + ; + + # Treeview: + ttk::style configure Heading -font TkHeadingFont -relief raised + ttk::style configure Treeview -background $colors(-window) + ttk::style map Treeview \ + -background [list disabled $colors(-frame)\ + {!disabled !selected} $colors(-window) \ + selected $colors(-selectbg)] \ + -foreground [list disabled $colors(-disabledfg) \ + {!disabled !selected} black \ + selected $colors(-selectfg)] + + ttk::style configure TScale \ + -groovewidth 4 -troughrelief sunken \ + -sliderwidth raised -borderwidth 2 + ttk::style configure TProgressbar \ + -background $colors(-selectbg) -borderwidth 0 + } +} diff --git a/env/tcl/tk8.6/ttk/aquaTheme.tcl b/env/tcl/tk8.6/ttk/aquaTheme.tcl new file mode 100644 index 0000000..d6be5a3 --- /dev/null +++ b/env/tcl/tk8.6/ttk/aquaTheme.tcl @@ -0,0 +1,64 @@ +# +# Aqua theme (OSX native look and feel) +# + +namespace eval ttk::theme::aqua { + ttk::style theme settings aqua { + + ttk::style configure . \ + -font TkDefaultFont \ + -background systemWindowBody \ + -foreground systemModelessDialogActiveText \ + -selectbackground systemHighlight \ + -selectforeground systemModelessDialogActiveText \ + -selectborderwidth 0 \ + -insertwidth 1 + + ttk::style map . \ + -foreground {disabled systemModelessDialogInactiveText + background systemModelessDialogInactiveText} \ + -selectbackground {background systemHighlightSecondary + !focus systemHighlightSecondary} \ + -selectforeground {background systemModelessDialogInactiveText + !focus systemDialogActiveText} + + # Workaround for #1100117: + # Actually, on Aqua we probably shouldn't stipple images in + # disabled buttons even if it did work... + ttk::style configure . -stipple {} + + ttk::style configure TButton -anchor center -width -6 + ttk::style configure Toolbutton -padding 4 + + ttk::style configure TNotebook -tabmargins {10 0} -tabposition n + ttk::style configure TNotebook -padding {18 8 18 17} + ttk::style configure TNotebook.Tab -padding {12 3 12 2} + + # Combobox: + ttk::style configure TCombobox -postoffset {5 -2 -10 0} + + # Treeview: + ttk::style configure Heading -font TkHeadingFont + ttk::style configure Treeview -rowheight 18 -background White + ttk::style map Treeview \ + -background [list disabled systemDialogBackgroundInactive \ + {!disabled !selected} systemWindowBody \ + {selected background} systemHighlightSecondary \ + selected systemHighlight] \ + -foreground [list disabled systemModelessDialogInactiveText \ + {!disabled !selected} black \ + selected systemModelessDialogActiveText] + + # Enable animation for ttk::progressbar widget: + ttk::style configure TProgressbar -period 100 -maxphase 255 + + # For Aqua, labelframe labels should appear outside the border, + # with a 14 pixel inset and 4 pixels spacing between border and label + # (ref: Apple Human Interface Guidelines / Controls / Grouping Controls) + # + ttk::style configure TLabelframe \ + -labeloutside true -labelmargins {14 0 14 4} + + # TODO: panedwindow sashes should be 9 pixels (HIG:Controls:Split Views) + } +} diff --git a/env/tcl/tk8.6/ttk/button.tcl b/env/tcl/tk8.6/ttk/button.tcl new file mode 100644 index 0000000..9f2cec7 --- /dev/null +++ b/env/tcl/tk8.6/ttk/button.tcl @@ -0,0 +1,83 @@ +# +# Bindings for Buttons, Checkbuttons, and Radiobuttons. +# +# Notes: , only control the "pressed" +# state; widgets remain "active" if the pointer is dragged out. +# This doesn't seem to be conventional, but it's a nice way +# to provide extra feedback while the grab is active. +# (If the button is released off the widget, the grab deactivates and +# we get a event then, which turns off the "active" state) +# +# Normally, and events are +# delivered to the widget which received the initial +# event. However, Tk [grab]s (#1223103) and menu interactions +# (#1222605) can interfere with this. To guard against spurious +# events, the binding only sets +# the pressed state if the button is currently active. +# + +namespace eval ttk::button {} + +bind TButton { %W instate !disabled {%W state active} } +bind TButton { %W state !active } +bind TButton { ttk::button::activate %W } +bind TButton <> { ttk::button::activate %W } + +bind TButton \ + { %W instate !disabled { ttk::clickToFocus %W; %W state pressed } } +bind TButton \ + { %W instate pressed { %W state !pressed; %W instate !disabled { %W invoke } } } +bind TButton \ + { %W state !pressed } +bind TButton \ + { %W instate {active !disabled} { %W state pressed } } + +# Checkbuttons and Radiobuttons have the same bindings as Buttons: +# +ttk::copyBindings TButton TCheckbutton +ttk::copyBindings TButton TRadiobutton + +# ...plus a few more: + +bind TRadiobutton { ttk::button::RadioTraverse %W -1 } +bind TRadiobutton { ttk::button::RadioTraverse %W +1 } + +# bind TCheckbutton { %W select } +# bind TCheckbutton { %W deselect } + +# activate -- +# Simulate a button press: temporarily set the state to 'pressed', +# then invoke the button. +# +proc ttk::button::activate {w} { + $w instate disabled { return } + set oldState [$w state pressed] + update idletasks; after 100 ;# block event loop to avoid reentrancy + $w state $oldState + $w invoke +} + +# RadioTraverse -- up/down keyboard traversal for radiobutton groups. +# Set focus to previous/next radiobutton in a group. +# A radiobutton group consists of all the radiobuttons with +# the same parent and -variable; this is a pretty good heuristic +# that works most of the time. +# +proc ttk::button::RadioTraverse {w dir} { + set group [list] + foreach sibling [winfo children [winfo parent $w]] { + if { [winfo class $sibling] eq "TRadiobutton" + && [$sibling cget -variable] eq [$w cget -variable] + && ![$sibling instate disabled] + } { + lappend group $sibling + } + } + + if {![llength $group]} { # Shouldn't happen, but can. + return + } + + set pos [expr {([lsearch -exact $group $w] + $dir) % [llength $group]}] + tk::TabToWindow [lindex $group $pos] +} diff --git a/env/tcl/tk8.6/ttk/clamTheme.tcl b/env/tcl/tk8.6/ttk/clamTheme.tcl new file mode 100644 index 0000000..3c6f5c3 --- /dev/null +++ b/env/tcl/tk8.6/ttk/clamTheme.tcl @@ -0,0 +1,149 @@ +# +# "Clam" theme. +# +# Inspired by the XFCE family of Gnome themes. +# + +namespace eval ttk::theme::clam { + variable colors + array set colors { + -disabledfg "#999999" + -frame "#dcdad5" + -window "#ffffff" + -dark "#cfcdc8" + -darker "#bab5ab" + -darkest "#9e9a91" + -lighter "#eeebe7" + -lightest "#ffffff" + -selectbg "#4a6984" + -selectfg "#ffffff" + -altindicator "#5895bc" + -disabledaltindicator "#a0a0a0" + } + + ttk::style theme settings clam { + + ttk::style configure "." \ + -background $colors(-frame) \ + -foreground black \ + -bordercolor $colors(-darkest) \ + -darkcolor $colors(-dark) \ + -lightcolor $colors(-lighter) \ + -troughcolor $colors(-darker) \ + -selectbackground $colors(-selectbg) \ + -selectforeground $colors(-selectfg) \ + -selectborderwidth 0 \ + -font TkDefaultFont \ + ; + + ttk::style map "." \ + -background [list disabled $colors(-frame) \ + active $colors(-lighter)] \ + -foreground [list disabled $colors(-disabledfg)] \ + -selectbackground [list !focus $colors(-darkest)] \ + -selectforeground [list !focus white] \ + ; + # -selectbackground [list !focus "#847d73"] + + ttk::style configure TButton \ + -anchor center -width -11 -padding 5 -relief raised + ttk::style map TButton \ + -background [list \ + disabled $colors(-frame) \ + pressed $colors(-darker) \ + active $colors(-lighter)] \ + -lightcolor [list pressed $colors(-darker)] \ + -darkcolor [list pressed $colors(-darker)] \ + -bordercolor [list alternate "#000000"] \ + ; + + ttk::style configure Toolbutton \ + -anchor center -padding 2 -relief flat + ttk::style map Toolbutton \ + -relief [list \ + disabled flat \ + selected sunken \ + pressed sunken \ + active raised] \ + -background [list \ + disabled $colors(-frame) \ + pressed $colors(-darker) \ + active $colors(-lighter)] \ + -lightcolor [list pressed $colors(-darker)] \ + -darkcolor [list pressed $colors(-darker)] \ + ; + + ttk::style configure TCheckbutton \ + -indicatorbackground "#ffffff" \ + -indicatormargin {1 1 4 1} \ + -padding 2 ; + ttk::style configure TRadiobutton \ + -indicatorbackground "#ffffff" \ + -indicatormargin {1 1 4 1} \ + -padding 2 ; + ttk::style map TCheckbutton -indicatorbackground \ + [list pressed $colors(-frame) \ + {!disabled alternate} $colors(-altindicator) \ + {disabled alternate} $colors(-disabledaltindicator) \ + disabled $colors(-frame)] + ttk::style map TRadiobutton -indicatorbackground \ + [list pressed $colors(-frame) \ + {!disabled alternate} $colors(-altindicator) \ + {disabled alternate} $colors(-disabledaltindicator) \ + disabled $colors(-frame)] + + ttk::style configure TMenubutton \ + -width -11 -padding 5 -relief raised + + ttk::style configure TEntry -padding 1 -insertwidth 1 + ttk::style map TEntry \ + -background [list readonly $colors(-frame)] \ + -bordercolor [list focus $colors(-selectbg)] \ + -lightcolor [list focus "#6f9dc6"] \ + -darkcolor [list focus "#6f9dc6"] \ + ; + + ttk::style configure TCombobox -padding 1 -insertwidth 1 + ttk::style map TCombobox \ + -background [list active $colors(-lighter) \ + pressed $colors(-lighter)] \ + -fieldbackground [list {readonly focus} $colors(-selectbg) \ + readonly $colors(-frame)] \ + -foreground [list {readonly focus} $colors(-selectfg)] \ + -arrowcolor [list disabled $colors(-disabledfg)] + ttk::style configure ComboboxPopdownFrame \ + -relief solid -borderwidth 1 + + ttk::style configure TSpinbox -arrowsize 10 -padding {2 0 10 0} + ttk::style map TSpinbox \ + -background [list readonly $colors(-frame)] \ + -arrowcolor [list disabled $colors(-disabledfg)] + + ttk::style configure TNotebook.Tab -padding {6 2 6 2} + ttk::style map TNotebook.Tab \ + -padding [list selected {6 4 6 2}] \ + -background [list selected $colors(-frame) {} $colors(-darker)] \ + -lightcolor [list selected $colors(-lighter) {} $colors(-dark)] \ + ; + + # Treeview: + ttk::style configure Heading \ + -font TkHeadingFont -relief raised -padding {3} + ttk::style configure Treeview -background $colors(-window) + ttk::style map Treeview \ + -background [list disabled $colors(-frame)\ + {!disabled !selected} $colors(-window) \ + selected $colors(-selectbg)] \ + -foreground [list disabled $colors(-disabledfg) \ + {!disabled !selected} black \ + selected $colors(-selectfg)] + + ttk::style configure TLabelframe \ + -labeloutside true -labelmargins {0 0 0 4} \ + -borderwidth 2 -relief raised + + ttk::style configure TProgressbar -background $colors(-frame) + + ttk::style configure Sash -sashthickness 6 -gripcount 10 + } +} diff --git a/env/tcl/tk8.6/ttk/classicTheme.tcl b/env/tcl/tk8.6/ttk/classicTheme.tcl new file mode 100644 index 0000000..fefdb99 --- /dev/null +++ b/env/tcl/tk8.6/ttk/classicTheme.tcl @@ -0,0 +1,117 @@ +# +# "classic" Tk theme. +# +# Implements Tk's traditional Motif-like look and feel. +# + +namespace eval ttk::theme::classic { + + variable colors; array set colors { + -frame "#d9d9d9" + -window "#ffffff" + -activebg "#ececec" + -troughbg "#c3c3c3" + -selectbg "#c3c3c3" + -selectfg "#000000" + -disabledfg "#a3a3a3" + -indicator "#b03060" + -altindicator "#b05e5e" + } + + ttk::style theme settings classic { + ttk::style configure "." \ + -font TkDefaultFont \ + -background $colors(-frame) \ + -foreground black \ + -selectbackground $colors(-selectbg) \ + -selectforeground $colors(-selectfg) \ + -troughcolor $colors(-troughbg) \ + -indicatorcolor $colors(-frame) \ + -highlightcolor $colors(-frame) \ + -highlightthickness 1 \ + -selectborderwidth 1 \ + -insertwidth 2 \ + ; + + # To match pre-Xft X11 appearance, use: + # ttk::style configure . -font {Helvetica 12 bold} + + ttk::style map "." -background \ + [list disabled $colors(-frame) active $colors(-activebg)] + ttk::style map "." -foreground \ + [list disabled $colors(-disabledfg)] + + ttk::style map "." -highlightcolor [list focus black] + + ttk::style configure TButton \ + -anchor center -padding "3m 1m" -relief raised -shiftrelief 1 + ttk::style map TButton -relief [list {!disabled pressed} sunken] + + ttk::style configure TCheckbutton -indicatorrelief raised + ttk::style map TCheckbutton \ + -indicatorcolor [list \ + pressed $colors(-frame) \ + alternate $colors(-altindicator) \ + selected $colors(-indicator)] \ + -indicatorrelief {alternate raised selected sunken pressed sunken} \ + ; + + ttk::style configure TRadiobutton -indicatorrelief raised + ttk::style map TRadiobutton \ + -indicatorcolor [list \ + pressed $colors(-frame) \ + alternate $colors(-altindicator) \ + selected $colors(-indicator)] \ + -indicatorrelief {alternate raised selected sunken pressed sunken} \ + ; + + ttk::style configure TMenubutton -relief raised -padding "3m 1m" + + ttk::style configure TEntry -relief sunken -padding 1 -font TkTextFont + ttk::style map TEntry -fieldbackground \ + [list readonly $colors(-frame) disabled $colors(-frame)] + ttk::style configure TCombobox -padding 1 + ttk::style map TCombobox -fieldbackground \ + [list readonly $colors(-frame) disabled $colors(-frame)] + ttk::style configure ComboboxPopdownFrame \ + -relief solid -borderwidth 1 + + ttk::style configure TSpinbox -arrowsize 10 -padding {2 0 10 0} + ttk::style map TSpinbox -fieldbackground \ + [list readonly $colors(-frame) disabled $colors(-frame)] + + ttk::style configure TLabelframe -borderwidth 2 -relief groove + + ttk::style configure TScrollbar -relief raised + ttk::style map TScrollbar -relief {{pressed !disabled} sunken} + + ttk::style configure TScale -sliderrelief raised + ttk::style map TScale -sliderrelief {{pressed !disabled} sunken} + + ttk::style configure TProgressbar -background SteelBlue + ttk::style configure TNotebook.Tab \ + -padding {3m 1m} \ + -background $colors(-troughbg) + ttk::style map TNotebook.Tab -background [list selected $colors(-frame)] + + # Treeview: + ttk::style configure Heading -font TkHeadingFont -relief raised + ttk::style configure Treeview -background $colors(-window) + ttk::style map Treeview \ + -background [list disabled $colors(-frame)\ + {!disabled !selected} $colors(-window) \ + selected $colors(-selectbg)] \ + -foreground [list disabled $colors(-disabledfg) \ + {!disabled !selected} black \ + selected $colors(-selectfg)] + + # + # Toolbar buttons: + # + ttk::style configure Toolbutton -padding 2 -relief flat -shiftrelief 2 + ttk::style map Toolbutton -relief \ + {disabled flat selected sunken pressed sunken active raised} + ttk::style map Toolbutton -background \ + [list pressed $colors(-troughbg) active $colors(-activebg)] + } +} diff --git a/env/tcl/tk8.6/ttk/combobox.tcl b/env/tcl/tk8.6/ttk/combobox.tcl new file mode 100644 index 0000000..c1b6da6 --- /dev/null +++ b/env/tcl/tk8.6/ttk/combobox.tcl @@ -0,0 +1,457 @@ +# +# Combobox bindings. +# +# <>: +# +# Need to set [wm transient] just before mapping the popdown +# instead of when it's created, in case a containing frame +# has been reparented [#1818441]. +# +# On Windows: setting [wm transient] prevents the parent +# toplevel from becoming inactive when the popdown is posted +# (Tk 8.4.8+) +# +# On X11: WM_TRANSIENT_FOR on override-redirect windows +# may be used by compositing managers and by EWMH-aware +# window managers (even though the older ICCCM spec says +# it's meaningless). +# +# On OSX: [wm transient] does utterly the wrong thing. +# Instead, we use [MacWindowStyle "help" "noActivates hideOnSuspend"]. +# The "noActivates" attribute prevents the parent toplevel +# from deactivating when the popdown is posted, and is also +# necessary for "help" windows to receive mouse events. +# "hideOnSuspend" makes the popdown disappear (resp. reappear) +# when the parent toplevel is deactivated (resp. reactivated). +# (see [#1814778]). Also set [wm resizable 0 0], to prevent +# TkAqua from shrinking the scrollbar to make room for a grow box +# that isn't there. +# +# In order to work around other platform quirks in TkAqua, +# [grab] and [focus] are set in bindings instead of +# immediately after deiconifying the window. +# + +namespace eval ttk::combobox { + variable Values ;# Values($cb) is -listvariable of listbox widget + variable State + set State(entryPress) 0 +} + +### Combobox bindings. +# +# Duplicate the Entry bindings, override if needed: +# + +ttk::copyBindings TEntry TCombobox + +bind TCombobox { ttk::combobox::Post %W } +bind TCombobox { ttk::combobox::Unpost %W } + +bind TCombobox { ttk::combobox::Press "" %W %x %y } +bind TCombobox { ttk::combobox::Press "s" %W %x %y } +bind TCombobox { ttk::combobox::Press "2" %W %x %y } +bind TCombobox { ttk::combobox::Press "3" %W %x %y } +bind TCombobox { ttk::combobox::Drag %W %x } +bind TCombobox { ttk::combobox::Motion %W %x %y } + +ttk::bindMouseWheel TCombobox [list ttk::combobox::Scroll %W] + +bind TCombobox <> { ttk::combobox::TraverseIn %W } + +### Combobox listbox bindings. +# +bind ComboboxListbox { ttk::combobox::LBSelected %W } +bind ComboboxListbox { ttk::combobox::LBSelected %W } +bind ComboboxListbox { ttk::combobox::LBCancel %W } +bind ComboboxListbox { ttk::combobox::LBTab %W next } +bind ComboboxListbox <> { ttk::combobox::LBTab %W prev } +bind ComboboxListbox { ttk::combobox::LBCleanup %W } +bind ComboboxListbox { ttk::combobox::LBHover %W %x %y } +bind ComboboxListbox { focus -force %W } + +switch -- [tk windowingsystem] { + win32 { + # Dismiss listbox when user switches to a different application. + # NB: *only* do this on Windows (see #1814778) + bind ComboboxListbox { ttk::combobox::LBCancel %W } + } +} + +### Combobox popdown window bindings. +# +bind ComboboxPopdown { ttk::combobox::MapPopdown %W } +bind ComboboxPopdown { ttk::combobox::UnmapPopdown %W } +bind ComboboxPopdown \ + { ttk::combobox::Unpost [winfo parent %W] } + +### Option database settings. +# + +option add *TCombobox*Listbox.font TkTextFont widgetDefault +option add *TCombobox*Listbox.relief flat widgetDefault +option add *TCombobox*Listbox.highlightThickness 0 widgetDefault + +## Platform-specific settings. +# +switch -- [tk windowingsystem] { + x11 { + option add *TCombobox*Listbox.background white widgetDefault + } + aqua { + option add *TCombobox*Listbox.borderWidth 0 widgetDefault + } +} + +### Binding procedures. +# + +## Press $mode $x $y -- ButtonPress binding for comboboxes. +# Either post/unpost the listbox, or perform Entry widget binding, +# depending on widget state and location of button press. +# +proc ttk::combobox::Press {mode w x y} { + variable State + + $w instate disabled { return } + + set State(entryPress) [expr { + [$w instate !readonly] + && [string match *textarea [$w identify element $x $y]] + }] + + focus $w + if {$State(entryPress)} { + switch -- $mode { + s { ttk::entry::Shift-Press $w $x ; # Shift } + 2 { ttk::entry::Select $w $x word ; # Double click} + 3 { ttk::entry::Select $w $x line ; # Triple click } + "" - + default { ttk::entry::Press $w $x } + } + } else { + Post $w + } +} + +## Drag -- B1-Motion binding for comboboxes. +# If the initial ButtonPress event was handled by Entry binding, +# perform Entry widget drag binding; otherwise nothing. +# +proc ttk::combobox::Drag {w x} { + variable State + if {$State(entryPress)} { + ttk::entry::Drag $w $x + } +} + +## Motion -- +# Set cursor. +# +proc ttk::combobox::Motion {w x y} { + if { [$w identify $x $y] eq "textarea" + && [$w instate {!readonly !disabled}] + } { + ttk::setCursor $w text + } else { + ttk::setCursor $w "" + } +} + +## TraverseIn -- receive focus due to keyboard navigation +# For editable comboboxes, set the selection and insert cursor. +# +proc ttk::combobox::TraverseIn {w} { + $w instate {!readonly !disabled} { + $w selection range 0 end + $w icursor end + } +} + +## SelectEntry $cb $index -- +# Set the combobox selection in response to a user action. +# +proc ttk::combobox::SelectEntry {cb index} { + $cb current $index + $cb selection range 0 end + $cb icursor end + event generate $cb <> -when mark +} + +## Scroll -- Mousewheel binding +# +proc ttk::combobox::Scroll {cb dir} { + $cb instate disabled { return } + set max [llength [$cb cget -values]] + set current [$cb current] + incr current $dir + if {$max != 0 && $current == $current % $max} { + SelectEntry $cb $current + } +} + +## LBSelected $lb -- Activation binding for listbox +# Set the combobox value to the currently-selected listbox value +# and unpost the listbox. +# +proc ttk::combobox::LBSelected {lb} { + set cb [LBMaster $lb] + LBSelect $lb + Unpost $cb + focus $cb +} + +## LBCancel -- +# Unpost the listbox. +# +proc ttk::combobox::LBCancel {lb} { + Unpost [LBMaster $lb] +} + +## LBTab -- Tab key binding for combobox listbox. +# Set the selection, and navigate to next/prev widget. +# +proc ttk::combobox::LBTab {lb dir} { + set cb [LBMaster $lb] + switch -- $dir { + next { set newFocus [tk_focusNext $cb] } + prev { set newFocus [tk_focusPrev $cb] } + } + + if {$newFocus ne ""} { + LBSelect $lb + Unpost $cb + # The [grab release] call in [Unpost] queues events that later + # re-set the focus (@@@ NOTE: this might not be true anymore). + # Set new focus later: + after 0 [list ttk::traverseTo $newFocus] + } +} + +## LBHover -- binding for combobox listbox. +# Follow selection on mouseover. +# +proc ttk::combobox::LBHover {w x y} { + $w selection clear 0 end + $w activate @$x,$y + $w selection set @$x,$y +} + +## MapPopdown -- binding for ComboboxPopdown +# +proc ttk::combobox::MapPopdown {w} { + [winfo parent $w] state pressed + ttk::globalGrab $w +} + +## UnmapPopdown -- binding for ComboboxPopdown +# +proc ttk::combobox::UnmapPopdown {w} { + [winfo parent $w] state !pressed + ttk::releaseGrab $w +} + +### +# + +namespace eval ::ttk::combobox { + # @@@ Until we have a proper native scrollbar on Aqua, use + # @@@ the regular Tk one. Use ttk::scrollbar on other platforms. + variable scrollbar ttk::scrollbar + if {[tk windowingsystem] eq "aqua"} { + set scrollbar ::scrollbar + } +} + +## PopdownWindow -- +# Returns the popdown widget associated with a combobox, +# creating it if necessary. +# +proc ttk::combobox::PopdownWindow {cb} { + variable scrollbar + + if {![winfo exists $cb.popdown]} { + set poplevel [PopdownToplevel $cb.popdown] + set popdown [ttk::frame $poplevel.f -style ComboboxPopdownFrame] + + $scrollbar $popdown.sb \ + -orient vertical -command [list $popdown.l yview] + listbox $popdown.l \ + -listvariable ttk::combobox::Values($cb) \ + -yscrollcommand [list $popdown.sb set] \ + -exportselection false \ + -selectmode browse \ + -activestyle none \ + ; + + bindtags $popdown.l \ + [list $popdown.l ComboboxListbox Listbox $popdown all] + + grid $popdown.l -row 0 -column 0 -padx {1 0} -pady 1 -sticky nsew + grid $popdown.sb -row 0 -column 1 -padx {0 1} -pady 1 -sticky ns + grid columnconfigure $popdown 0 -weight 1 + grid rowconfigure $popdown 0 -weight 1 + + grid $popdown -sticky news -padx 0 -pady 0 + grid rowconfigure $poplevel 0 -weight 1 + grid columnconfigure $poplevel 0 -weight 1 + } + return $cb.popdown +} + +## PopdownToplevel -- Create toplevel window for the combobox popdown +# +# See also <> +# +proc ttk::combobox::PopdownToplevel {w} { + toplevel $w -class ComboboxPopdown + wm withdraw $w + switch -- [tk windowingsystem] { + default - + x11 { + $w configure -relief flat -borderwidth 0 + wm attributes $w -type combo + wm overrideredirect $w true + } + win32 { + $w configure -relief flat -borderwidth 0 + wm overrideredirect $w true + wm attributes $w -topmost 1 + } + aqua { + $w configure -relief solid -borderwidth 0 + tk::unsupported::MacWindowStyle style $w \ + help {noActivates hideOnSuspend} + wm resizable $w 0 0 + } + } + return $w +} + +## ConfigureListbox -- +# Set listbox values, selection, height, and scrollbar visibility +# from current combobox values. +# +proc ttk::combobox::ConfigureListbox {cb} { + variable Values + + set popdown [PopdownWindow $cb].f + set values [$cb cget -values] + set current [$cb current] + if {$current < 0} { + set current 0 ;# no current entry, highlight first one + } + set Values($cb) $values + $popdown.l selection clear 0 end + $popdown.l selection set $current + $popdown.l activate $current + $popdown.l see $current + set height [llength $values] + if {$height > [$cb cget -height]} { + set height [$cb cget -height] + grid $popdown.sb + grid configure $popdown.l -padx {1 0} + } else { + grid remove $popdown.sb + grid configure $popdown.l -padx 1 + } + $popdown.l configure -height $height +} + +## PlacePopdown -- +# Set popdown window geometry. +# +# @@@TODO: factor with menubutton::PostPosition +# +proc ttk::combobox::PlacePopdown {cb popdown} { + set x [winfo rootx $cb] + set y [winfo rooty $cb] + set w [winfo width $cb] + set h [winfo height $cb] + set style [$cb cget -style] + set postoffset [ttk::style lookup $style -postoffset {} {0 0 0 0}] + foreach var {x y w h} delta $postoffset { + incr $var $delta + } + + set H [winfo reqheight $popdown] + if {$y + $h + $H > [winfo screenheight $popdown]} { + set Y [expr {$y - $H}] + } else { + set Y [expr {$y + $h}] + } + wm geometry $popdown ${w}x${H}+${x}+${Y} +} + +## Post $cb -- +# Pop down the associated listbox. +# +proc ttk::combobox::Post {cb} { + # Don't do anything if disabled: + # + $cb instate disabled { return } + + # ASSERT: ![$cb instate pressed] + + # Run -postcommand callback: + # + uplevel #0 [$cb cget -postcommand] + + set popdown [PopdownWindow $cb] + ConfigureListbox $cb + update idletasks ;# needed for geometry propagation. + PlacePopdown $cb $popdown + # See <> + switch -- [tk windowingsystem] { + x11 - win32 { wm transient $popdown [winfo toplevel $cb] } + } + + # Post the listbox: + # + wm attribute $popdown -topmost 1 + wm deiconify $popdown + raise $popdown +} + +## Unpost $cb -- +# Unpost the listbox. +# +proc ttk::combobox::Unpost {cb} { + if {[winfo exists $cb.popdown]} { + wm withdraw $cb.popdown + } + grab release $cb.popdown ;# in case of stuck or unexpected grab [#1239190] +} + +## LBMaster $lb -- +# Return the combobox main widget that owns the listbox. +# +proc ttk::combobox::LBMaster {lb} { + winfo parent [winfo parent [winfo parent $lb]] +} + +## LBSelect $lb -- +# Transfer listbox selection to combobox value. +# +proc ttk::combobox::LBSelect {lb} { + set cb [LBMaster $lb] + set selection [$lb curselection] + if {[llength $selection] == 1} { + SelectEntry $cb [lindex $selection 0] + } +} + +## LBCleanup $lb -- +# binding for combobox listboxes. +# Cleans up by unsetting the linked textvariable. +# +# Note: we can't just use { unset [%W cget -listvariable] } +# because the widget command is already gone when this binding fires). +# [winfo parent] still works, fortunately. +# +proc ttk::combobox::LBCleanup {lb} { + variable Values + unset Values([LBMaster $lb]) +} + +#*EOF* diff --git a/env/tcl/tk8.6/ttk/cursors.tcl b/env/tcl/tk8.6/ttk/cursors.tcl new file mode 100644 index 0000000..75f7791 --- /dev/null +++ b/env/tcl/tk8.6/ttk/cursors.tcl @@ -0,0 +1,186 @@ +# +# Map symbolic cursor names to platform-appropriate cursors. +# +# The following cursors are defined: +# +# standard -- default cursor for most controls +# "" -- inherit cursor from parent window +# none -- no cursor +# +# text -- editable widgets (entry, text) +# link -- hyperlinks within text +# crosshair -- graphic selection, fine control +# busy -- operation in progress +# forbidden -- action not allowed +# +# hresize -- horizontal resizing +# vresize -- vertical resizing +# +# Also resize cursors for each of the compass points, +# {nw,n,ne,w,e,sw,s,se}resize. +# +# Platform notes: +# +# Windows doesn't distinguish resizing at the 8 compass points, +# only horizontal, vertical, and the two diagonals. +# +# OSX doesn't have resize cursors for nw, ne, sw, or se corners. +# We use the Tk-defined X11 fallbacks for these. +# +# X11 doesn't have a "forbidden" cursor (usually a slashed circle); +# "pirate" seems to be the conventional cursor for this purpose. +# +# Windows has an IDC_HELP cursor, but it's not available from Tk. +# +# Tk does not support "none" on Windows. +# + +namespace eval ttk { + + variable Cursors + + # Use X11 cursor names as defaults, since Tk supplies these + # on all platforms. + # + array set Cursors { + "" "" + none none + + standard left_ptr + text xterm + link hand2 + crosshair crosshair + busy watch + forbidden pirate + + hresize sb_h_double_arrow + vresize sb_v_double_arrow + + nresize top_side + sresize bottom_side + wresize left_side + eresize right_side + nwresize top_left_corner + neresize top_right_corner + swresize bottom_left_corner + seresize bottom_right_corner + move fleur + + } + + # Platform-specific overrides for Windows and OSX. + # + switch [tk windowingsystem] { + "win32" { + array set Cursors { + none {} + + standard arrow + text ibeam + link hand2 + crosshair crosshair + busy wait + forbidden no + + vresize size_ns + nresize size_ns + sresize size_ns + + wresize size_we + eresize size_we + hresize size_we + + nwresize size_nw_se + swresize size_ne_sw + + neresize size_ne_sw + seresize size_nw_se + } + } + + "aqua" { + if {[package vsatisfies [package provide Tk] 8.5]} { + # appeared 2007-04-23, Tk 8.5a6 + array set Cursors { + standard arrow + text ibeam + link pointinghand + crosshair crosshair + busy watch + forbidden notallowed + + hresize resizeleftright + vresize resizeupdown + nresize resizeup + sresize resizedown + wresize resizeleft + eresize resizeright + } + } + } + } +} + +## ttk::cursor $cursor -- +# Return platform-specific cursor for specified symbolic cursor. +# +proc ttk::cursor {name} { + variable Cursors + return $Cursors($name) +} + +## ttk::setCursor $w $cursor -- +# Set the cursor for specified window. +# +# [ttk::setCursor] should be used in bindings +# instead of directly calling [$w configure -cursor ...], +# as the latter always incurs a server round-trip and +# can lead to high CPU load (see [#1184746]) +# + +proc ttk::setCursor {w name} { + variable Cursors + if {[$w cget -cursor] ne $Cursors($name)} { + $w configure -cursor $Cursors($name) + } +} + +## Interactive test harness: +# +proc ttk::CursorSampler {f} { + ttk::frame $f + + set r 0 + foreach row { + {nwresize nresize neresize} + { wresize move eresize} + {swresize sresize seresize} + {text link crosshair} + {hresize vresize ""} + {busy forbidden ""} + {none standard ""} + } { + set c 0 + foreach cursor $row { + set w $f.${r}${c} + ttk::label $w -text $cursor -cursor [ttk::cursor $cursor] \ + -relief solid -borderwidth 1 -padding 3 + grid $w -row $r -column $c -sticky nswe + grid columnconfigure $f $c -uniform cols -weight 1 + incr c + } + grid rowconfigure $f $r -uniform rows -weight 1 + incr r + } + + return $f +} + +if {[info exists argv0] && $argv0 eq [info script]} { + wm title . "[array size ::ttk::Cursors] cursors" + pack [ttk::CursorSampler .f] -expand true -fill both + bind . [list destroy .] + focus .f +} + +#*EOF* diff --git a/env/tcl/tk8.6/ttk/defaults.tcl b/env/tcl/tk8.6/ttk/defaults.tcl new file mode 100644 index 0000000..4c1753d --- /dev/null +++ b/env/tcl/tk8.6/ttk/defaults.tcl @@ -0,0 +1,145 @@ +# +# Settings for default theme. +# + +namespace eval ttk::theme::default { + variable colors + array set colors { + -frame "#d9d9d9" + -foreground "#000000" + -window "#ffffff" + -text "#000000" + -activebg "#ececec" + -selectbg "#4a6984" + -selectfg "#ffffff" + -darker "#c3c3c3" + -disabledfg "#a3a3a3" + -indicator "#4a6984" + -disabledindicator "#a3a3a3" + -altindicator "#9fbdd8" + -disabledaltindicator "#c0c0c0" + } + + ttk::style theme settings default { + + ttk::style configure "." \ + -borderwidth 1 \ + -background $colors(-frame) \ + -foreground $colors(-foreground) \ + -troughcolor $colors(-darker) \ + -font TkDefaultFont \ + -selectborderwidth 1 \ + -selectbackground $colors(-selectbg) \ + -selectforeground $colors(-selectfg) \ + -insertwidth 1 \ + -indicatordiameter 10 \ + ; + + ttk::style map "." -background \ + [list disabled $colors(-frame) active $colors(-activebg)] + ttk::style map "." -foreground \ + [list disabled $colors(-disabledfg)] + + ttk::style configure TButton \ + -anchor center -padding "3 3" -width -9 \ + -relief raised -shiftrelief 1 + ttk::style map TButton -relief [list {!disabled pressed} sunken] + + ttk::style configure TCheckbutton \ + -indicatorcolor "#ffffff" -indicatorrelief sunken -padding 1 + ttk::style map TCheckbutton -indicatorcolor \ + [list pressed $colors(-activebg) \ + {!disabled alternate} $colors(-altindicator) \ + {disabled alternate} $colors(-disabledaltindicator) \ + {!disabled selected} $colors(-indicator) \ + {disabled selected} $colors(-disabledindicator)] + ttk::style map TCheckbutton -indicatorrelief \ + [list alternate raised] + + ttk::style configure TRadiobutton \ + -indicatorcolor "#ffffff" -indicatorrelief sunken -padding 1 + ttk::style map TRadiobutton -indicatorcolor \ + [list pressed $colors(-activebg) \ + {!disabled alternate} $colors(-altindicator) \ + {disabled alternate} $colors(-disabledaltindicator) \ + {!disabled selected} $colors(-indicator) \ + {disabled selected} $colors(-disabledindicator)] + ttk::style map TRadiobutton -indicatorrelief \ + [list alternate raised] + + ttk::style configure TMenubutton \ + -relief raised -padding "10 3" + + ttk::style configure TEntry \ + -relief sunken -fieldbackground white -padding 1 + ttk::style map TEntry -fieldbackground \ + [list readonly $colors(-frame) disabled $colors(-frame)] + + ttk::style configure TCombobox -arrowsize 12 -padding 1 + ttk::style map TCombobox -fieldbackground \ + [list readonly $colors(-frame) disabled $colors(-frame)] \ + -arrowcolor [list disabled $colors(-disabledfg)] + + ttk::style configure TSpinbox -arrowsize 10 -padding {2 0 10 0} + ttk::style map TSpinbox -fieldbackground \ + [list readonly $colors(-frame) disabled $colors(-frame)] \ + -arrowcolor [list disabled $colors(-disabledfg)] + + ttk::style configure TLabelframe \ + -relief groove -borderwidth 2 + + ttk::style configure TScrollbar \ + -width 12 -arrowsize 12 + ttk::style map TScrollbar \ + -arrowcolor [list disabled $colors(-disabledfg)] + + ttk::style configure TScale \ + -sliderrelief raised + ttk::style configure TProgressbar \ + -background $colors(-selectbg) + + ttk::style configure TNotebook.Tab \ + -padding {4 2} -background $colors(-darker) + ttk::style map TNotebook.Tab \ + -background [list selected $colors(-frame)] + + # Treeview. + # + ttk::style configure Heading -font TkHeadingFont -relief raised + ttk::style configure Treeview \ + -background $colors(-window) \ + -foreground $colors(-text) ; + ttk::style map Treeview \ + -background [list disabled $colors(-frame)\ + {!disabled !selected} $colors(-window) \ + selected $colors(-selectbg)] \ + -foreground [list disabled $colors(-disabledfg) \ + {!disabled !selected} black \ + selected $colors(-selectfg)] + + # Combobox popdown frame + ttk::style layout ComboboxPopdownFrame { + ComboboxPopdownFrame.border -sticky nswe + } + ttk::style configure ComboboxPopdownFrame \ + -borderwidth 1 -relief solid + + # + # Toolbar buttons: + # + ttk::style layout Toolbutton { + Toolbutton.border -children { + Toolbutton.padding -children { + Toolbutton.label + } + } + } + + ttk::style configure Toolbutton \ + -padding 2 -relief flat + ttk::style map Toolbutton -relief \ + [list disabled flat selected sunken pressed sunken active raised] + ttk::style map Toolbutton -background \ + [list pressed $colors(-darker) active $colors(-activebg)] + } +} diff --git a/env/tcl/tk8.6/ttk/entry.tcl b/env/tcl/tk8.6/ttk/entry.tcl new file mode 100644 index 0000000..c123bc9 --- /dev/null +++ b/env/tcl/tk8.6/ttk/entry.tcl @@ -0,0 +1,607 @@ +# +# DERIVED FROM: tk/library/entry.tcl r1.22 +# +# Copyright (c) 1992-1994 The Regents of the University of California. +# Copyright (c) 1994-1997 Sun Microsystems, Inc. +# Copyright (c) 2004, Joe English +# +# See the file "license.terms" for information on usage and redistribution +# of this file, and for a DISCLAIMER OF ALL WARRANTIES. +# + +namespace eval ttk { + namespace eval entry { + variable State + + set State(x) 0 + set State(selectMode) none + set State(anchor) 0 + set State(scanX) 0 + set State(scanIndex) 0 + set State(scanMoved) 0 + + # Button-2 scan speed is (scanNum/scanDen) characters + # per pixel of mouse movement. + # The standard Tk entry widget uses the equivalent of + # scanNum = 10, scanDen = average character width. + # I don't know why that was chosen. + # + set State(scanNum) 1 + set State(scanDen) 1 + set State(deadband) 3 ;# #pixels for mouse-moved deadband. + } +} + +### Option database settings. +# +option add *TEntry.cursor [ttk::cursor text] widgetDefault + +### Bindings. +# +# Removed the following standard Tk bindings: +# +# , , +# , : +# Ttk entry widget doesn't use selection anchor. +# : +# Inserts PRIMARY selection (on non-Windows platforms). +# This is inconsistent with typical platform bindings. +# , : +# These don't do the right thing to start with. +# , , , +# , : +# Judgment call. If happens to be assigned to the Alt key, +# these could conflict with application accelerators. +# (Plus, who has a Meta key these days?) +# : +# Another judgment call. If anyone misses this, let me know +# and I'll put it back. +# + +## Clipboard events: +# +bind TEntry <> { ttk::entry::Cut %W } +bind TEntry <> { ttk::entry::Copy %W } +bind TEntry <> { ttk::entry::Paste %W } +bind TEntry <> { ttk::entry::Clear %W } + +## Button1 bindings: +# Used for selection and navigation. +# +bind TEntry { ttk::entry::Press %W %x } +bind TEntry { ttk::entry::Shift-Press %W %x } +bind TEntry { ttk::entry::Select %W %x word } +bind TEntry { ttk::entry::Select %W %x line } +bind TEntry { ttk::entry::Drag %W %x } + +bind TEntry { ttk::entry::DragOut %W %m } +bind TEntry { ttk::entry::DragIn %W } +bind TEntry { ttk::entry::Release %W } + +bind TEntry <> { + %W instate {!readonly !disabled} { %W icursor @%x ; focus %W } +} + +## Button2 bindings: +# Used for scanning and primary transfer. +# Note: ButtonRelease-2 is mapped to <> in tk.tcl. +# +bind TEntry { ttk::entry::ScanMark %W %x } +bind TEntry { ttk::entry::ScanDrag %W %x } +bind TEntry { ttk::entry::ScanRelease %W %x } +bind TEntry <> { ttk::entry::ScanRelease %W %x } + +## Keyboard navigation bindings: +# +bind TEntry <> { ttk::entry::Move %W prevchar } +bind TEntry <> { ttk::entry::Move %W nextchar } +bind TEntry <> { ttk::entry::Move %W prevword } +bind TEntry <> { ttk::entry::Move %W nextword } +bind TEntry <> { ttk::entry::Move %W home } +bind TEntry <> { ttk::entry::Move %W end } + +bind TEntry <> { ttk::entry::Extend %W prevchar } +bind TEntry <> { ttk::entry::Extend %W nextchar } +bind TEntry <> { ttk::entry::Extend %W prevword } +bind TEntry <> { ttk::entry::Extend %W nextword } +bind TEntry <> { ttk::entry::Extend %W home } +bind TEntry <> { ttk::entry::Extend %W end } + +bind TEntry <> { %W selection range 0 end } +bind TEntry <> { %W selection clear } + +bind TEntry <> { %W selection range 0 end; %W icursor end } + +## Edit bindings: +# +bind TEntry { ttk::entry::Insert %W %A } +bind TEntry { ttk::entry::Delete %W } +bind TEntry { ttk::entry::Backspace %W } + +# Ignore all Alt, Meta, and Control keypresses unless explicitly bound. +# Otherwise, the class binding will fire and insert the character. +# Ditto for Escape, Return, and Tab. +# +bind TEntry {# nothing} +bind TEntry {# nothing} +bind TEntry {# nothing} +bind TEntry {# nothing} +bind TEntry {# nothing} +bind TEntry {# nothing} +bind TEntry {# nothing} + +# Argh. Apparently on Windows, the NumLock modifier is interpreted +# as a Command modifier. +if {[tk windowingsystem] eq "aqua"} { + bind TEntry {# nothing} +} +# Tk-on-Cocoa generates characters for these two keys. [Bug 2971663] +bind TEntry <> {# nothing} +bind TEntry <> {# nothing} + +## Additional emacs-like bindings: +# +bind TEntry { ttk::entry::Delete %W } +bind TEntry { ttk::entry::Backspace %W } +bind TEntry { %W delete insert end } + +### Clipboard procedures. +# + +## EntrySelection -- Return the selected text of the entry. +# Raises an error if there is no selection. +# +proc ttk::entry::EntrySelection {w} { + set entryString [string range [$w get] [$w index sel.first] \ + [expr {[$w index sel.last] - 1}]] + if {[$w cget -show] ne ""} { + return [string repeat [string index [$w cget -show] 0] \ + [string length $entryString]] + } + return $entryString +} + +## Paste -- Insert clipboard contents at current insert point. +# +proc ttk::entry::Paste {w} { + catch { + set clipboard [::tk::GetSelection $w CLIPBOARD] + PendingDelete $w + $w insert insert $clipboard + See $w insert + } +} + +## Copy -- Copy selection to clipboard. +# +proc ttk::entry::Copy {w} { + if {![catch {EntrySelection $w} selection]} { + clipboard clear -displayof $w + clipboard append -displayof $w $selection + } +} + +## Clear -- Delete the selection. +# +proc ttk::entry::Clear {w} { + catch { $w delete sel.first sel.last } +} + +## Cut -- Copy selection to clipboard then delete it. +# +proc ttk::entry::Cut {w} { + Copy $w; Clear $w +} + +### Navigation procedures. +# + +## ClosestGap -- Find closest boundary between characters. +# Returns the index of the character just after the boundary. +# +proc ttk::entry::ClosestGap {w x} { + set pos [$w index @$x] + set bbox [$w bbox $pos] + if {$x - [lindex $bbox 0] > [lindex $bbox 2]/2} { + incr pos + } + return $pos +} + +## See $index -- Make sure that the character at $index is visible. +# +proc ttk::entry::See {w {index insert}} { + update idletasks ;# ensure scroll data up-to-date + set c [$w index $index] + # @@@ OR: check [$w index left] / [$w index right] + if {$c < [$w index @0] || $c >= [$w index @[winfo width $w]]} { + $w xview $c + } +} + +## NextWord -- Find the next word position. +# Note: The "next word position" follows platform conventions: +# either the next end-of-word position, or the start-of-word +# position following the next end-of-word position. +# +set ::ttk::entry::State(startNext) \ + [string equal [tk windowingsystem] "win32"] + +proc ttk::entry::NextWord {w start} { + variable State + set pos [tcl_endOfWord [$w get] [$w index $start]] + if {$pos >= 0 && $State(startNext)} { + set pos [tcl_startOfNextWord [$w get] $pos] + } + if {$pos < 0} { + return end + } + return $pos +} + +## PrevWord -- Find the previous word position. +# +proc ttk::entry::PrevWord {w start} { + set pos [tcl_startOfPreviousWord [$w get] [$w index $start]] + if {$pos < 0} { + return 0 + } + return $pos +} + +## RelIndex -- Compute character/word/line-relative index. +# +proc ttk::entry::RelIndex {w where {index insert}} { + switch -- $where { + prevchar { expr {[$w index $index] - 1} } + nextchar { expr {[$w index $index] + 1} } + prevword { PrevWord $w $index } + nextword { NextWord $w $index } + home { return 0 } + end { $w index end } + default { error "Bad relative index $index" } + } +} + +## Move -- Move insert cursor to relative location. +# Also clears the selection, if any, and makes sure +# that the insert cursor is visible. +# +proc ttk::entry::Move {w where} { + $w icursor [RelIndex $w $where] + $w selection clear + See $w insert +} + +### Selection procedures. +# + +## ExtendTo -- Extend the selection to the specified index. +# +# The other end of the selection (the anchor) is determined as follows: +# +# (1) if there is no selection, the anchor is the insert cursor; +# (2) if the index is outside the selection, grow the selection; +# (3) if the insert cursor is at one end of the selection, anchor the other end +# (4) otherwise anchor the start of the selection +# +# The insert cursor is placed at the new end of the selection. +# +# Returns: selection anchor. +# +proc ttk::entry::ExtendTo {w index} { + set index [$w index $index] + set insert [$w index insert] + + # Figure out selection anchor: + if {![$w selection present]} { + set anchor $insert + } else { + set selfirst [$w index sel.first] + set sellast [$w index sel.last] + + if { ($index < $selfirst) + || ($insert == $selfirst && $index <= $sellast) + } { + set anchor $sellast + } else { + set anchor $selfirst + } + } + + # Extend selection: + if {$anchor < $index} { + $w selection range $anchor $index + } else { + $w selection range $index $anchor + } + + $w icursor $index + return $anchor +} + +## Extend -- Extend the selection to a relative position, show insert cursor +# +proc ttk::entry::Extend {w where} { + ExtendTo $w [RelIndex $w $where] + See $w +} + +### Button 1 binding procedures. +# +# Double-clicking followed by a drag enters "word-select" mode. +# Triple-clicking enters "line-select" mode. +# + +## Press -- ButtonPress-1 binding. +# Set the insertion cursor, claim the input focus, set up for +# future drag operations. +# +proc ttk::entry::Press {w x} { + variable State + + $w icursor [ClosestGap $w $x] + $w selection clear + $w instate !disabled { focus $w } + + # Set up for future drag, double-click, or triple-click. + set State(x) $x + set State(selectMode) char + set State(anchor) [$w index insert] +} + +## Shift-Press -- Shift-ButtonPress-1 binding. +# Extends the selection, sets anchor for future drag operations. +# +proc ttk::entry::Shift-Press {w x} { + variable State + + focus $w + set anchor [ExtendTo $w @$x] + + set State(x) $x + set State(selectMode) char + set State(anchor) $anchor +} + +## Select $w $x $mode -- Binding for double- and triple- clicks. +# Selects a word or line (according to mode), +# and sets the selection mode for subsequent drag operations. +# +proc ttk::entry::Select {w x mode} { + variable State + set cur [ClosestGap $w $x] + + switch -- $mode { + word { WordSelect $w $cur $cur } + line { LineSelect $w $cur $cur } + char { # no-op } + } + + set State(anchor) $cur + set State(selectMode) $mode +} + +## Drag -- Button1 motion binding. +# +proc ttk::entry::Drag {w x} { + variable State + set State(x) $x + DragTo $w $x +} + +## DragTo $w $x -- Extend selection to $x based on current selection mode. +# +proc ttk::entry::DragTo {w x} { + variable State + + set cur [ClosestGap $w $x] + switch $State(selectMode) { + char { CharSelect $w $State(anchor) $cur } + word { WordSelect $w $State(anchor) $cur } + line { LineSelect $w $State(anchor) $cur } + none { # no-op } + } +} + +## binding: +# Begin autoscroll. +# +proc ttk::entry::DragOut {w mode} { + variable State + if {$State(selectMode) ne "none" && $mode eq "NotifyNormal"} { + ttk::Repeatedly ttk::entry::AutoScroll $w + } +} + +## binding +# Suspend autoscroll. +# +proc ttk::entry::DragIn {w} { + ttk::CancelRepeat +} + +## binding +# +proc ttk::entry::Release {w} { + variable State + set State(selectMode) none + ttk::CancelRepeat ;# suspend autoscroll +} + +## AutoScroll +# Called repeatedly when the mouse is outside an entry window +# with Button 1 down. Scroll the window left or right, +# depending on where the mouse left the window, and extend +# the selection according to the current selection mode. +# +# TODO: AutoScroll should repeat faster (50ms) than normal autorepeat. +# TODO: Need a way for Repeat scripts to cancel themselves. +# +proc ttk::entry::AutoScroll {w} { + variable State + if {![winfo exists $w]} return + set x $State(x) + if {$x > [winfo width $w]} { + $w xview scroll 2 units + DragTo $w $x + } elseif {$x < 0} { + $w xview scroll -2 units + DragTo $w $x + } +} + +## CharSelect -- select characters between index $from and $to +# +proc ttk::entry::CharSelect {w from to} { + if {$to <= $from} { + $w selection range $to $from + } else { + $w selection range $from $to + } + $w icursor $to +} + +## WordSelect -- Select whole words between index $from and $to +# +proc ttk::entry::WordSelect {w from to} { + if {$to < $from} { + set first [WordBack [$w get] $to] + set last [WordForward [$w get] $from] + $w icursor $first + } else { + set first [WordBack [$w get] $from] + set last [WordForward [$w get] $to] + $w icursor $last + } + $w selection range $first $last +} + +## WordBack, WordForward -- helper routines for WordSelect. +# +proc ttk::entry::WordBack {text index} { + if {[set pos [tcl_wordBreakBefore $text $index]] < 0} { return 0 } + return $pos +} +proc ttk::entry::WordForward {text index} { + if {[set pos [tcl_wordBreakAfter $text $index]] < 0} { return end } + return $pos +} + +## LineSelect -- Select the entire line. +# +proc ttk::entry::LineSelect {w _ _} { + variable State + $w selection range 0 end + $w icursor end +} + +### Button 2 binding procedures. +# + +## ScanMark -- ButtonPress-2 binding. +# Marks the start of a scan or primary transfer operation. +# +proc ttk::entry::ScanMark {w x} { + variable State + set State(scanX) $x + set State(scanIndex) [$w index @0] + set State(scanMoved) 0 +} + +## ScanDrag -- Button2 motion binding. +# +proc ttk::entry::ScanDrag {w x} { + variable State + + set dx [expr {$State(scanX) - $x}] + if {abs($dx) > $State(deadband)} { + set State(scanMoved) 1 + } + set left [expr {$State(scanIndex) + ($dx*$State(scanNum))/$State(scanDen)}] + $w xview $left + + if {$left != [set newLeft [$w index @0]]} { + # We've scanned past one end of the entry; + # reset the mark so that the text will start dragging again + # as soon as the mouse reverses direction. + # + set State(scanX) $x + set State(scanIndex) $newLeft + } +} + +## ScanRelease -- Button2 release binding. +# Do a primary transfer if the mouse has not moved since the button press. +# +proc ttk::entry::ScanRelease {w x} { + variable State + if {!$State(scanMoved)} { + $w instate {!disabled !readonly} { + $w icursor [ClosestGap $w $x] + catch {$w insert insert [::tk::GetSelection $w PRIMARY]} + } + } +} + +### Insertion and deletion procedures. +# + +## PendingDelete -- Delete selection prior to insert. +# If the entry currently has a selection, delete it and +# set the insert position to where the selection was. +# Returns: 1 if pending delete occurred, 0 if nothing was selected. +# +proc ttk::entry::PendingDelete {w} { + if {[$w selection present]} { + $w icursor sel.first + $w delete sel.first sel.last + return 1 + } + return 0 +} + +## Insert -- Insert text into the entry widget. +# If a selection is present, the new text replaces it. +# Otherwise, the new text is inserted at the insert cursor. +# +proc ttk::entry::Insert {w s} { + if {$s eq ""} { return } + PendingDelete $w + $w insert insert $s + See $w insert +} + +## Backspace -- Backspace over the character just before the insert cursor. +# If there is a selection, delete that instead. +# If the new insert position is offscreen to the left, +# scroll to place the cursor at about the middle of the window. +# +proc ttk::entry::Backspace {w} { + if {[PendingDelete $w]} { + See $w + return + } + set x [expr {[$w index insert] - 1}] + if {$x < 0} { return } + + $w delete $x + + if {[$w index @0] >= [$w index insert]} { + set range [$w xview] + set left [lindex $range 0] + set right [lindex $range 1] + $w xview moveto [expr {$left - ($right - $left)/2.0}] + } +} + +## Delete -- Delete the character after the insert cursor. +# If there is a selection, delete that instead. +# +proc ttk::entry::Delete {w} { + if {![PendingDelete $w]} { + $w delete insert + } +} + +#*EOF* diff --git a/env/tcl/tk8.6/ttk/fonts.tcl b/env/tcl/tk8.6/ttk/fonts.tcl new file mode 100644 index 0000000..a2781c6 --- /dev/null +++ b/env/tcl/tk8.6/ttk/fonts.tcl @@ -0,0 +1,157 @@ +# +# Font specifications. +# +# This file, [source]d at initialization time, sets up the following +# symbolic fonts based on the current platform: +# +# TkDefaultFont -- default for GUI items not otherwise specified +# TkTextFont -- font for user text (entry, listbox, others) +# TkFixedFont -- standard fixed width font +# TkHeadingFont -- headings (column headings, etc) +# TkCaptionFont -- dialog captions (primary text in alert dialogs, etc.) +# TkTooltipFont -- font to use for tooltip windows +# TkIconFont -- font to use for icon captions +# TkMenuFont -- used to use for menu items +# +# In Tk 8.5, some of these fonts may be provided by the TIP#145 implementation +# (On Windows and Mac OS X as of Oct 2007). +# +# +++ Platform notes: +# +# Windows: +# The default system font changed from "MS Sans Serif" to "Tahoma" +# in Windows XP/Windows 2000. +# +# MS documentation says to use "Tahoma 8" in Windows 2000/XP, +# although many MS programs still use "MS Sans Serif 8" +# +# Should use SystemParametersInfo() instead. +# +# Mac OSX / Aqua: +# Quoth the Apple HIG: +# The _system font_ (Lucida Grande Regular 13 pt) is used for text +# in menus, dialogs, and full-size controls. +# [...] Use the _view font_ (Lucida Grande Regular 12pt) as the default +# font of text in lists and tables. +# [...] Use the _emphasized system font_ (Lucida Grande Bold 13 pt) +# sparingly. It is used for the message text in alerts. +# [...] The _small system font_ (Lucida Grande Regular 11 pt) [...] +# is also the default font for column headings in lists, for help tags, +# and for small controls. +# +# Note that the font for column headings (TkHeadingFont) is +# _smaller_ than the default font. +# +# There does not appear to be any recommendations for fixed-width fonts. +# +# X11: +# Need a way to tell if Xft is enabled or not. +# For now, assume patch #971980 applied. +# +# "Classic" look used Helvetica bold for everything except +# for entry widgets, which use Helvetica medium. +# Most other toolkits use medium weight for all UI elements, +# which is what we do now. +# +# Font size specified in pixels on X11, not points. +# This is Theoretically Wrong, but in practice works better; using +# points leads to huge inconsistencies across different servers. +# + +namespace eval ttk { + +variable tip145 [catch {font create TkDefaultFont}] +catch {font create TkTextFont} +catch {font create TkHeadingFont} +catch {font create TkCaptionFont} +catch {font create TkTooltipFont} +catch {font create TkFixedFont} +catch {font create TkIconFont} +catch {font create TkMenuFont} +catch {font create TkSmallCaptionFont} + +if {!$tip145} { +variable F ;# miscellaneous platform-specific font parameters +switch -- [tk windowingsystem] { + win32 { + # In safe interps there is no osVersion element. + if {[info exists tcl_platform(osVersion)]} { + if {$tcl_platform(osVersion) >= 5.0} { + set F(family) "Tahoma" + } else { + set F(family) "MS Sans Serif" + } + } else { + if {[lsearch -exact [font families] Tahoma] != -1} { + set F(family) "Tahoma" + } else { + set F(family) "MS Sans Serif" + } + } + set F(size) 8 + + font configure TkDefaultFont -family $F(family) -size $F(size) + font configure TkTextFont -family $F(family) -size $F(size) + font configure TkHeadingFont -family $F(family) -size $F(size) + font configure TkCaptionFont -family $F(family) -size $F(size) \ + -weight bold + font configure TkTooltipFont -family $F(family) -size $F(size) + font configure TkFixedFont -family Courier -size 10 + font configure TkIconFont -family $F(family) -size $F(size) + font configure TkMenuFont -family $F(family) -size $F(size) + font configure TkSmallCaptionFont -family $F(family) -size $F(size) + } + aqua { + set F(family) "Lucida Grande" + set F(fixed) "Monaco" + set F(menusize) 14 + set F(size) 13 + set F(viewsize) 12 + set F(smallsize) 11 + set F(labelsize) 10 + set F(fixedsize) 11 + + font configure TkDefaultFont -family $F(family) -size $F(size) + font configure TkTextFont -family $F(family) -size $F(size) + font configure TkHeadingFont -family $F(family) -size $F(smallsize) + font configure TkCaptionFont -family $F(family) -size $F(size) \ + -weight bold + font configure TkTooltipFont -family $F(family) -size $F(smallsize) + font configure TkFixedFont -family $F(fixed) -size $F(fixedsize) + font configure TkIconFont -family $F(family) -size $F(size) + font configure TkMenuFont -family $F(family) -size $F(menusize) + font configure TkSmallCaptionFont -family $F(family) -size $F(labelsize) + } + default - + x11 { + if {![catch {tk::pkgconfig get fontsystem} F(fs)] && $F(fs) eq "xft"} { + set F(family) "sans-serif" + set F(fixed) "monospace" + } else { + set F(family) "Helvetica" + set F(fixed) "courier" + } + set F(size) -12 + set F(ttsize) -10 + set F(capsize) -14 + set F(fixedsize) -12 + + font configure TkDefaultFont -family $F(family) -size $F(size) + font configure TkTextFont -family $F(family) -size $F(size) + font configure TkHeadingFont -family $F(family) -size $F(size) \ + -weight bold + font configure TkCaptionFont -family $F(family) -size $F(capsize) \ + -weight bold + font configure TkTooltipFont -family $F(family) -size $F(ttsize) + font configure TkFixedFont -family $F(fixed) -size $F(fixedsize) + font configure TkIconFont -family $F(family) -size $F(size) + font configure TkMenuFont -family $F(family) -size $F(size) + font configure TkSmallCaptionFont -family $F(family) -size $F(ttsize) + } +} +unset -nocomplain F +} + +} + +#*EOF* diff --git a/env/tcl/tk8.6/ttk/menubutton.tcl b/env/tcl/tk8.6/ttk/menubutton.tcl new file mode 100644 index 0000000..2be064c --- /dev/null +++ b/env/tcl/tk8.6/ttk/menubutton.tcl @@ -0,0 +1,169 @@ +# +# Bindings for Menubuttons. +# +# Menubuttons have three interaction modes: +# +# Pulldown: Press menubutton, drag over menu, release to activate menu entry +# Popdown: Click menubutton to post menu +# Keyboard: or accelerator key to post menu +# +# (In addition, when menu system is active, "dropdown" -- menu posts +# on mouse-over. Ttk menubuttons don't implement this). +# +# For keyboard and popdown mode, we hand off to tk_popup and let +# the built-in Tk bindings handle the rest of the interaction. +# +# ON X11: +# +# Standard Tk menubuttons use a global grab on the menubutton. +# This won't work for Ttk menubuttons in pulldown mode, +# since we need to process the final event, +# and this might be delivered to the menu. So instead we +# rely on the passive grab that occurs on events, +# and transition to popdown mode when the mouse is released +# or dragged outside the menubutton. +# +# ON WINDOWS: +# +# I'm not sure what the hell is going on here. [$menu post] apparently +# sets up some kind of internal grab for native menus. +# On this platform, just use [tk_popup] for all menu actions. +# +# ON MACOS: +# +# Same probably applies here. +# + +namespace eval ttk { + namespace eval menubutton { + variable State + array set State { + pulldown 0 + oldcursor {} + } + } +} + +bind TMenubutton { %W instate !disabled {%W state active } } +bind TMenubutton { %W state !active } +bind TMenubutton { ttk::menubutton::Popdown %W } +bind TMenubutton <> { ttk::menubutton::Popdown %W } + +if {[tk windowingsystem] eq "x11"} { + bind TMenubutton { ttk::menubutton::Pulldown %W } + bind TMenubutton { ttk::menubutton::TransferGrab %W } + bind TMenubutton { ttk::menubutton::TransferGrab %W } +} else { + bind TMenubutton \ + { %W state pressed ; ttk::menubutton::Popdown %W } + bind TMenubutton \ + { if {[winfo exists %W]} { %W state !pressed } } +} + +# PostPosition -- +# Returns the x and y coordinates where the menu +# should be posted, based on the menubutton and menu size +# and -direction option. +# +# TODO: adjust menu width to be at least as wide as the button +# for -direction above, below. +# +proc ttk::menubutton::PostPosition {mb menu} { + set x [winfo rootx $mb] + set y [winfo rooty $mb] + set dir [$mb cget -direction] + + set bw [winfo width $mb] + set bh [winfo height $mb] + set mw [winfo reqwidth $menu] + set mh [winfo reqheight $menu] + set sw [expr {[winfo screenwidth $menu] - $bw - $mw}] + set sh [expr {[winfo screenheight $menu] - $bh - $mh}] + + switch -- $dir { + above { if {$y >= $mh} { incr y -$mh } { incr y $bh } } + below { if {$y <= $sh} { incr y $bh } { incr y -$mh } } + left { if {$x >= $mw} { incr x -$mw } { incr x $bw } } + right { if {$x <= $sw} { incr x $bw } { incr x -$mw } } + flush { + # post menu atop menubutton. + # If there's a menu entry whose label matches the + # menubutton -text, assume this is an optionmenu + # and place that entry over the menubutton. + set index [FindMenuEntry $menu [$mb cget -text]] + if {$index ne ""} { + incr y -[$menu yposition $index] + } + } + } + + return [list $x $y] +} + +# Popdown -- +# Post the menu and set a grab on the menu. +# +proc ttk::menubutton::Popdown {mb} { + if {[$mb instate disabled] || [set menu [$mb cget -menu]] eq ""} { + return + } + foreach {x y} [PostPosition $mb $menu] { break } + tk_popup $menu $x $y +} + +# Pulldown (X11 only) -- +# Called when Button1 is pressed on a menubutton. +# Posts the menu; a subsequent ButtonRelease +# or Leave event will set a grab on the menu. +# +proc ttk::menubutton::Pulldown {mb} { + variable State + if {[$mb instate disabled] || [set menu [$mb cget -menu]] eq ""} { + return + } + foreach {x y} [PostPosition $mb $menu] { break } + set State(pulldown) 1 + set State(oldcursor) [$mb cget -cursor] + + $mb state pressed + $mb configure -cursor [$menu cget -cursor] + $menu post $x $y + tk_menuSetFocus $menu +} + +# TransferGrab (X11 only) -- +# Switch from pulldown mode (menubutton has an implicit grab) +# to popdown mode (menu has an explicit grab). +# +proc ttk::menubutton::TransferGrab {mb} { + variable State + if {$State(pulldown)} { + $mb configure -cursor $State(oldcursor) + $mb state {!pressed !active} + set State(pulldown) 0 + + set menu [$mb cget -menu] + tk_popup $menu [winfo rootx $menu] [winfo rooty $menu] + } +} + +# FindMenuEntry -- +# Hack to support tk_optionMenus. +# Returns the index of the menu entry with a matching -label, +# -1 if not found. +# +proc ttk::menubutton::FindMenuEntry {menu s} { + set last [$menu index last] + if {$last eq "none"} { + return "" + } + for {set i 0} {$i <= $last} {incr i} { + if {![catch {$menu entrycget $i -label} label] + && ($label eq $s)} { + return $i + } + } + return "" +} + +#*EOF* diff --git a/env/tcl/tk8.6/ttk/notebook.tcl b/env/tcl/tk8.6/ttk/notebook.tcl new file mode 100644 index 0000000..72b85e6 --- /dev/null +++ b/env/tcl/tk8.6/ttk/notebook.tcl @@ -0,0 +1,197 @@ +# +# Bindings for TNotebook widget +# + +namespace eval ttk::notebook { + variable TLNotebooks ;# See enableTraversal +} + +bind TNotebook { ttk::notebook::Press %W %x %y } +bind TNotebook { ttk::notebook::CycleTab %W 1; break } +bind TNotebook { ttk::notebook::CycleTab %W -1; break } +bind TNotebook { ttk::notebook::CycleTab %W 1; break } +bind TNotebook { ttk::notebook::CycleTab %W -1; break } +catch { +bind TNotebook { ttk::notebook::CycleTab %W -1; break } +} +bind TNotebook { ttk::notebook::Cleanup %W } + +# ActivateTab $nb $tab -- +# Select the specified tab and set focus. +# +# Desired behavior: +# + take focus when reselecting the currently-selected tab; +# + keep focus if the notebook already has it; +# + otherwise set focus to the first traversable widget +# in the newly-selected tab; +# + do not leave the focus in a deselected tab. +# +proc ttk::notebook::ActivateTab {w tab} { + set oldtab [$w select] + $w select $tab + set newtab [$w select] ;# NOTE: might not be $tab, if $tab is disabled + + if {[focus] eq $w} { return } + if {$newtab eq $oldtab} { focus $w ; return } + + update idletasks ;# needed so focus logic sees correct mapped states + if {[set f [ttk::focusFirst $newtab]] ne ""} { + ttk::traverseTo $f + } else { + focus $w + } +} + +# Press $nb $x $y -- +# ButtonPress-1 binding for notebook widgets. +# Activate the tab under the mouse cursor, if any. +# +proc ttk::notebook::Press {w x y} { + set index [$w index @$x,$y] + if {$index ne ""} { + ActivateTab $w $index + } +} + +# CycleTab -- +# Select the next/previous tab in the list. +# +proc ttk::notebook::CycleTab {w dir} { + if {[$w index end] != 0} { + set current [$w index current] + set select [expr {($current + $dir) % [$w index end]}] + while {[$w tab $select -state] != "normal" && ($select != $current)} { + set select [expr {($select + $dir) % [$w index end]}] + } + if {$select != $current} { + ActivateTab $w $select + } + } +} + +# MnemonicTab $nb $key -- +# Scan all tabs in the specified notebook for one with the +# specified mnemonic. If found, returns path name of tab; +# otherwise returns "" +# +proc ttk::notebook::MnemonicTab {nb key} { + set key [string toupper $key] + foreach tab [$nb tabs] { + set label [$nb tab $tab -text] + set underline [$nb tab $tab -underline] + set mnemonic [string toupper [string index $label $underline]] + if {$mnemonic ne "" && $mnemonic eq $key} { + return $tab + } + } + return "" +} + +# +++ Toplevel keyboard traversal. +# + +# enableTraversal -- +# Enable keyboard traversal for a notebook widget +# by adding bindings to the containing toplevel window. +# +# TLNotebooks($top) keeps track of the list of all traversal-enabled +# notebooks contained in the toplevel +# +proc ttk::notebook::enableTraversal {nb} { + variable TLNotebooks + + set top [winfo toplevel $nb] + + if {![info exists TLNotebooks($top)]} { + # Augment $top bindings: + # + bind $top {+ttk::notebook::TLCycleTab %W 1} + bind $top {+ttk::notebook::TLCycleTab %W -1} + bind $top {+ttk::notebook::TLCycleTab %W 1} + bind $top {+ttk::notebook::TLCycleTab %W -1} + catch { + bind $top {+ttk::notebook::TLCycleTab %W -1} + } + if {[tk windowingsystem] eq "aqua"} { + bind $top \ + +[list ttk::notebook::MnemonicActivation $top %K] + } else { + bind $top \ + +[list ttk::notebook::MnemonicActivation $top %K] + } + bind $top {+ttk::notebook::TLCleanup %W} + } + + lappend TLNotebooks($top) $nb +} + +# TLCleanup -- binding for traversal-enabled toplevels +# +proc ttk::notebook::TLCleanup {w} { + variable TLNotebooks + if {$w eq [winfo toplevel $w]} { + unset -nocomplain -please TLNotebooks($w) + } +} + +# Cleanup -- binding for notebooks +# +proc ttk::notebook::Cleanup {nb} { + variable TLNotebooks + set top [winfo toplevel $nb] + if {[info exists TLNotebooks($top)]} { + set index [lsearch -exact $TLNotebooks($top) $nb] + set TLNotebooks($top) [lreplace $TLNotebooks($top) $index $index] + } +} + +# EnclosingNotebook $w -- +# Return the nearest traversal-enabled notebook widget +# that contains $w. +# +# BUGS: this only works properly for tabs that are direct children +# of the notebook widget. This routine should follow the +# geometry manager hierarchy, not window ancestry, but that +# information is not available in Tk. +# +proc ttk::notebook::EnclosingNotebook {w} { + variable TLNotebooks + + set top [winfo toplevel $w] + if {![info exists TLNotebooks($top)]} { return } + + while {$w ne $top && $w ne ""} { + if {[lsearch -exact $TLNotebooks($top) $w] >= 0} { + return $w + } + set w [winfo parent $w] + } + return "" +} + +# TLCycleTab -- +# toplevel binding procedure for Control-Tab / Control-Shift-Tab +# Select the next/previous tab in the nearest ancestor notebook. +# +proc ttk::notebook::TLCycleTab {w dir} { + set nb [EnclosingNotebook $w] + if {$nb ne ""} { + CycleTab $nb $dir + return -code break + } +} + +# MnemonicActivation $nb $key -- +# Alt-KeyPress binding procedure for mnemonic activation. +# Scan all notebooks in specified toplevel for a tab with the +# the specified mnemonic. If found, activate it and return TCL_BREAK. +# +proc ttk::notebook::MnemonicActivation {top key} { + variable TLNotebooks + foreach nb $TLNotebooks($top) { + if {[set tab [MnemonicTab $nb $key]] ne ""} { + ActivateTab $nb [$nb index $tab] + return -code break + } + } +} diff --git a/env/tcl/tk8.6/ttk/panedwindow.tcl b/env/tcl/tk8.6/ttk/panedwindow.tcl new file mode 100644 index 0000000..a2e073b --- /dev/null +++ b/env/tcl/tk8.6/ttk/panedwindow.tcl @@ -0,0 +1,82 @@ +# +# Bindings for ttk::panedwindow widget. +# + +namespace eval ttk::panedwindow { + variable State + array set State { + pressed 0 + pressX - + pressY - + sash - + sashPos - + } +} + +## Bindings: +# +bind TPanedwindow { ttk::panedwindow::Press %W %x %y } +bind TPanedwindow { ttk::panedwindow::Drag %W %x %y } +bind TPanedwindow { ttk::panedwindow::Release %W %x %y } + +bind TPanedwindow { ttk::panedwindow::SetCursor %W %x %y } +bind TPanedwindow { ttk::panedwindow::SetCursor %W %x %y } +bind TPanedwindow { ttk::panedwindow::ResetCursor %W } +# See <> +bind TPanedwindow <> { ttk::panedwindow::ResetCursor %W } + +## Sash movement: +# +proc ttk::panedwindow::Press {w x y} { + variable State + + set sash [$w identify $x $y] + if {$sash eq ""} { + set State(pressed) 0 + return + } + set State(pressed) 1 + set State(pressX) $x + set State(pressY) $y + set State(sash) $sash + set State(sashPos) [$w sashpos $sash] +} + +proc ttk::panedwindow::Drag {w x y} { + variable State + if {!$State(pressed)} { return } + switch -- [$w cget -orient] { + horizontal { set delta [expr {$x - $State(pressX)}] } + vertical { set delta [expr {$y - $State(pressY)}] } + } + $w sashpos $State(sash) [expr {$State(sashPos) + $delta}] +} + +proc ttk::panedwindow::Release {w x y} { + variable State + set State(pressed) 0 + SetCursor $w $x $y +} + +## Cursor management: +# +proc ttk::panedwindow::ResetCursor {w} { + variable State + if {!$State(pressed)} { + ttk::setCursor $w {} + } +} + +proc ttk::panedwindow::SetCursor {w x y} { + set cursor "" + if {[llength [$w identify $x $y]]} { + # Assume we're over a sash. + switch -- [$w cget -orient] { + horizontal { set cursor hresize } + vertical { set cursor vresize } + } + } + ttk::setCursor $w $cursor +} + +#*EOF* diff --git a/env/tcl/tk8.6/ttk/progress.tcl b/env/tcl/tk8.6/ttk/progress.tcl new file mode 100644 index 0000000..34dce72 --- /dev/null +++ b/env/tcl/tk8.6/ttk/progress.tcl @@ -0,0 +1,49 @@ +# +# Ttk widget set: progress bar utilities. +# + +namespace eval ttk::progressbar { + variable Timers ;# Map: widget name -> after ID +} + +# Autoincrement -- +# Periodic callback procedure for autoincrement mode +# +proc ttk::progressbar::Autoincrement {pb steptime stepsize} { + variable Timers + + if {![winfo exists $pb]} { + # widget has been destroyed -- cancel timer + unset -nocomplain Timers($pb) + return + } + + set Timers($pb) [after $steptime \ + [list ttk::progressbar::Autoincrement $pb $steptime $stepsize] ] + + $pb step $stepsize +} + +# ttk::progressbar::start -- +# Start autoincrement mode. Invoked by [$pb start] widget code. +# +proc ttk::progressbar::start {pb {steptime 50} {stepsize 1}} { + variable Timers + if {![info exists Timers($pb)]} { + Autoincrement $pb $steptime $stepsize + } +} + +# ttk::progressbar::stop -- +# Cancel autoincrement mode. Invoked by [$pb stop] widget code. +# +proc ttk::progressbar::stop {pb} { + variable Timers + if {[info exists Timers($pb)]} { + after cancel $Timers($pb) + unset Timers($pb) + } + $pb configure -value 0 +} + + diff --git a/env/tcl/tk8.6/ttk/scale.tcl b/env/tcl/tk8.6/ttk/scale.tcl new file mode 100644 index 0000000..62c85bf --- /dev/null +++ b/env/tcl/tk8.6/ttk/scale.tcl @@ -0,0 +1,94 @@ +# scale.tcl - Copyright (C) 2004 Pat Thoyts +# +# Bindings for the TScale widget + +namespace eval ttk::scale { + variable State + array set State { + dragging 0 + } +} + +bind TScale { ttk::scale::Press %W %x %y } +bind TScale { ttk::scale::Drag %W %x %y } +bind TScale { ttk::scale::Release %W %x %y } + +bind TScale { ttk::scale::Jump %W %x %y } +bind TScale { ttk::scale::Drag %W %x %y } +bind TScale { ttk::scale::Release %W %x %y } + +bind TScale { ttk::scale::Jump %W %x %y } +bind TScale { ttk::scale::Drag %W %x %y } +bind TScale { ttk::scale::Release %W %x %y } + +## Keyboard navigation bindings: +# +bind TScale <> { %W set [%W cget -from] } +bind TScale <> { %W set [%W cget -to] } + +bind TScale <> { ttk::scale::Increment %W -1 } +bind TScale <> { ttk::scale::Increment %W -1 } +bind TScale <> { ttk::scale::Increment %W 1 } +bind TScale <> { ttk::scale::Increment %W 1 } +bind TScale <> { ttk::scale::Increment %W -10 } +bind TScale <> { ttk::scale::Increment %W -10 } +bind TScale <> { ttk::scale::Increment %W 10 } +bind TScale <> { ttk::scale::Increment %W 10 } + +proc ttk::scale::Press {w x y} { + variable State + set State(dragging) 0 + + switch -glob -- [$w identify $x $y] { + *track - + *trough { + set inc [expr {([$w get $x $y] <= [$w get]) ^ ([$w cget -from] > [$w cget -to]) ? -1 : 1}] + ttk::Repeatedly Increment $w $inc + } + *slider { + set State(dragging) 1 + set State(initial) [$w get] + } + } +} + +# scale::Jump -- ButtonPress-2/3 binding for scale acts like +# Press except that clicking in the trough jumps to the +# clicked position. +proc ttk::scale::Jump {w x y} { + variable State + set State(dragging) 0 + + switch -glob -- [$w identify $x $y] { + *track - + *trough { + $w set [$w get $x $y] + set State(dragging) 1 + set State(initial) [$w get] + } + *slider { + Press $w $x $y + } + } +} + +proc ttk::scale::Drag {w x y} { + variable State + if {$State(dragging)} { + $w set [$w get $x $y] + } +} + +proc ttk::scale::Release {w x y} { + variable State + set State(dragging) 0 + ttk::CancelRepeat +} + +proc ttk::scale::Increment {w delta} { + if {![winfo exists $w]} return + if {([$w cget -from] > [$w cget -to])} { + set delta [expr {-$delta}] + } + $w set [expr {[$w get] + $delta}] +} diff --git a/env/tcl/tk8.6/ttk/scrollbar.tcl b/env/tcl/tk8.6/ttk/scrollbar.tcl new file mode 100644 index 0000000..4bd5107 --- /dev/null +++ b/env/tcl/tk8.6/ttk/scrollbar.tcl @@ -0,0 +1,123 @@ +# +# Bindings for TScrollbar widget +# + +# Still don't have a working ttk::scrollbar under OSX - +# Swap in a [tk::scrollbar] on that platform, +# unless user specifies -class or -style. +# +if {[tk windowingsystem] eq "aqua"} { + rename ::ttk::scrollbar ::ttk::_scrollbar + proc ttk::scrollbar {w args} { + set constructor ::tk::scrollbar + foreach {option _} $args { + if {$option eq "-class" || $option eq "-style"} { + set constructor ::ttk::_scrollbar + break + } + } + return [$constructor $w {*}$args] + } +} + +namespace eval ttk::scrollbar { + variable State + # State(xPress) -- + # State(yPress) -- initial position of mouse at start of drag. + # State(first) -- value of -first at start of drag. +} + +bind TScrollbar { ttk::scrollbar::Press %W %x %y } +bind TScrollbar { ttk::scrollbar::Drag %W %x %y } +bind TScrollbar { ttk::scrollbar::Release %W %x %y } + +bind TScrollbar { ttk::scrollbar::Jump %W %x %y } +bind TScrollbar { ttk::scrollbar::Drag %W %x %y } +bind TScrollbar { ttk::scrollbar::Release %W %x %y } + +proc ttk::scrollbar::Scroll {w n units} { + set cmd [$w cget -command] + if {$cmd ne ""} { + uplevel #0 $cmd scroll $n $units + } +} + +proc ttk::scrollbar::Moveto {w fraction} { + set cmd [$w cget -command] + if {$cmd ne ""} { + uplevel #0 $cmd moveto $fraction + } +} + +proc ttk::scrollbar::Press {w x y} { + variable State + + set State(xPress) $x + set State(yPress) $y + + switch -glob -- [$w identify $x $y] { + *uparrow - + *leftarrow { + ttk::Repeatedly Scroll $w -1 units + } + *downarrow - + *rightarrow { + ttk::Repeatedly Scroll $w 1 units + } + *thumb { + set State(first) [lindex [$w get] 0] + } + *trough { + set f [$w fraction $x $y] + if {$f < [lindex [$w get] 0]} { + # Clicked in upper/left trough + ttk::Repeatedly Scroll $w -1 pages + } elseif {$f > [lindex [$w get] 1]} { + # Clicked in lower/right trough + ttk::Repeatedly Scroll $w 1 pages + } else { + # Clicked on thumb (???) + set State(first) [lindex [$w get] 0] + } + } + } +} + +proc ttk::scrollbar::Drag {w x y} { + variable State + if {![info exists State(first)]} { + # Initial buttonpress was not on the thumb, + # or something screwy has happened. In either case, ignore: + return; + } + set xDelta [expr {$x - $State(xPress)}] + set yDelta [expr {$y - $State(yPress)}] + Moveto $w [expr {$State(first) + [$w delta $xDelta $yDelta]}] +} + +proc ttk::scrollbar::Release {w x y} { + variable State + unset -nocomplain State(xPress) State(yPress) State(first) + ttk::CancelRepeat +} + +# scrollbar::Jump -- ButtonPress-2 binding for scrollbars. +# Behaves exactly like scrollbar::Press, except that +# clicking in the trough jumps to the the selected position. +# +proc ttk::scrollbar::Jump {w x y} { + variable State + + switch -glob -- [$w identify $x $y] { + *thumb - + *trough { + set State(first) [$w fraction $x $y] + Moveto $w $State(first) + set State(xPress) $x + set State(yPress) $y + } + default { + Press $w $x $y + } + } +} diff --git a/env/tcl/tk8.6/ttk/sizegrip.tcl b/env/tcl/tk8.6/ttk/sizegrip.tcl new file mode 100644 index 0000000..24a67c6 --- /dev/null +++ b/env/tcl/tk8.6/ttk/sizegrip.tcl @@ -0,0 +1,102 @@ +# +# Sizegrip widget bindings. +# +# Dragging a sizegrip widget resizes the containing toplevel. +# +# NOTE: the sizegrip widget must be in the lower right hand corner. +# + +switch -- [tk windowingsystem] { + x11 - + win32 { + option add *TSizegrip.cursor [ttk::cursor seresize] widgetDefault + } + aqua { + # Aqua sizegrips use default Arrow cursor. + } +} + +namespace eval ttk::sizegrip { + variable State + array set State { + pressed 0 + pressX 0 + pressY 0 + width 0 + height 0 + widthInc 1 + heightInc 1 + resizeX 1 + resizeY 1 + toplevel {} + } +} + +bind TSizegrip { ttk::sizegrip::Press %W %X %Y } +bind TSizegrip { ttk::sizegrip::Drag %W %X %Y } +bind TSizegrip { ttk::sizegrip::Release %W %X %Y } + +proc ttk::sizegrip::Press {W X Y} { + variable State + + if {[$W instate disabled]} { return } + + set top [winfo toplevel $W] + + # If the toplevel is not resizable then bail + foreach {State(resizeX) State(resizeY)} [wm resizable $top] break + if {!$State(resizeX) && !$State(resizeY)} { + return + } + + # Sanity-checks: + # If a negative X or Y position was specified for [wm geometry], + # just bail out -- there's no way to handle this cleanly. + # + if {[scan [wm geometry $top] "%dx%d+%d+%d" width height x y] != 4} { + return; + } + + # Account for gridded geometry: + # + set grid [wm grid $top] + if {[llength $grid]} { + set State(widthInc) [lindex $grid 2] + set State(heightInc) [lindex $grid 3] + } else { + set State(widthInc) [set State(heightInc) 1] + } + + set State(toplevel) $top + set State(pressX) $X + set State(pressY) $Y + set State(width) $width + set State(height) $height + set State(x) $x + set State(y) $y + set State(pressed) 1 +} + +proc ttk::sizegrip::Drag {W X Y} { + variable State + if {!$State(pressed)} { return } + set w $State(width) + set h $State(height) + if {$State(resizeX)} { + set w [expr {$w + ($X - $State(pressX))/$State(widthInc)}] + } + if {$State(resizeY)} { + set h [expr {$h + ($Y - $State(pressY))/$State(heightInc)}] + } + if {$w <= 0} { set w 1 } + if {$h <= 0} { set h 1 } + set x $State(x) ; set y $State(y) + wm geometry $State(toplevel) ${w}x${h}+${x}+${y} +} + +proc ttk::sizegrip::Release {W X Y} { + variable State + set State(pressed) 0 +} + +#*EOF* diff --git a/env/tcl/tk8.6/ttk/spinbox.tcl b/env/tcl/tk8.6/ttk/spinbox.tcl new file mode 100644 index 0000000..1aa0ccb --- /dev/null +++ b/env/tcl/tk8.6/ttk/spinbox.tcl @@ -0,0 +1,173 @@ +# +# ttk::spinbox bindings +# + +namespace eval ttk::spinbox { } + +### Spinbox bindings. +# +# Duplicate the Entry bindings, override if needed: +# + +ttk::copyBindings TEntry TSpinbox + +bind TSpinbox { ttk::spinbox::Motion %W %x %y } +bind TSpinbox { ttk::spinbox::Press %W %x %y } +bind TSpinbox { ttk::spinbox::Release %W } +bind TSpinbox { ttk::spinbox::DoubleClick %W %x %y } +bind TSpinbox {} ;# disable TEntry triple-click + +bind TSpinbox { event generate %W <> } +bind TSpinbox { event generate %W <> } + +bind TSpinbox <> { ttk::spinbox::Spin %W +1 } +bind TSpinbox <> { ttk::spinbox::Spin %W -1 } + +ttk::bindMouseWheel TSpinbox [list ttk::spinbox::MouseWheel %W] + +## Motion -- +# Sets cursor. +# +proc ttk::spinbox::Motion {w x y} { + if { [$w identify $x $y] eq "textarea" + && [$w instate {!readonly !disabled}] + } { + ttk::setCursor $w text + } else { + ttk::setCursor $w "" + } +} + +## Press -- +# +proc ttk::spinbox::Press {w x y} { + if {[$w instate disabled]} { return } + focus $w + switch -glob -- [$w identify $x $y] { + *textarea { ttk::entry::Press $w $x } + *rightarrow - + *uparrow { ttk::Repeatedly event generate $w <> } + *leftarrow - + *downarrow { ttk::Repeatedly event generate $w <> } + *spinbutton { + if {$y * 2 >= [winfo height $w]} { + set event <> + } else { + set event <> + } + ttk::Repeatedly event generate $w $event + } + } +} + +## DoubleClick -- +# Select all if over the text area; otherwise same as Press. +# +proc ttk::spinbox::DoubleClick {w x y} { + if {[$w instate disabled]} { return } + + switch -glob -- [$w identify $x $y] { + *textarea { SelectAll $w } + * { Press $w $x $y } + } +} + +proc ttk::spinbox::Release {w} { + ttk::CancelRepeat +} + +## MouseWheel -- +# Mousewheel callback. Turn these into <> (-1, up) +# or < (+1, down) events. +# +proc ttk::spinbox::MouseWheel {w dir} { + if {$dir < 0} { + event generate $w <> + } else { + event generate $w <> + } +} + +## SelectAll -- +# Select widget contents. +# +proc ttk::spinbox::SelectAll {w} { + $w selection range 0 end + $w icursor end +} + +## Limit -- +# Limit $v to lie between $min and $max +# +proc ttk::spinbox::Limit {v min max} { + if {$v < $min} { return $min } + if {$v > $max} { return $max } + return $v +} + +## Wrap -- +# Adjust $v to lie between $min and $max, wrapping if out of bounds. +# +proc ttk::spinbox::Wrap {v min max} { + if {$v < $min} { return $max } + if {$v > $max} { return $min } + return $v +} + +## Adjust -- +# Limit or wrap spinbox value depending on -wrap. +# +proc ttk::spinbox::Adjust {w v min max} { + if {[$w cget -wrap]} { + return [Wrap $v $min $max] + } else { + return [Limit $v $min $max] + } +} + +## Spin -- +# Handle <> and <> events. +# If -values is specified, cycle through the list. +# Otherwise cycle through numeric range based on +# -from, -to, and -increment. +# +proc ttk::spinbox::Spin {w dir} { + set nvalues [llength [set values [$w cget -values]]] + set value [$w get] + if {$nvalues} { + set current [lsearch -exact $values $value] + set index [Adjust $w [expr {$current + $dir}] 0 [expr {$nvalues - 1}]] + $w set [lindex $values $index] + } else { + if {[catch { + set v [expr {[scan [$w get] %f] + $dir * [$w cget -increment]}] + }]} { + set v [$w cget -from] + } + $w set [FormatValue $w [Adjust $w $v [$w cget -from] [$w cget -to]]] + } + SelectAll $w + uplevel #0 [$w cget -command] +} + +## FormatValue -- +# Reformat numeric value based on -format. +# +proc ttk::spinbox::FormatValue {w val} { + set fmt [$w cget -format] + if {$fmt eq ""} { + # Try to guess a suitable -format based on -increment. + set delta [expr {abs([$w cget -increment])}] + if {0 < $delta && $delta < 1} { + # NB: This guesses wrong if -increment has more than 1 + # significant digit itself, e.g., -increment 0.25 + set nsd [expr {int(ceil(-log10($delta)))}] + set fmt "%.${nsd}f" + } else { + set fmt "%.0f" + } + } + return [format $fmt $val] +} + +#*EOF* diff --git a/env/tcl/tk8.6/ttk/treeview.tcl b/env/tcl/tk8.6/ttk/treeview.tcl new file mode 100644 index 0000000..1ed87db --- /dev/null +++ b/env/tcl/tk8.6/ttk/treeview.tcl @@ -0,0 +1,363 @@ +# +# ttk::treeview widget bindings and utilities. +# + +namespace eval ttk::treeview { + variable State + + # Enter/Leave/Motion + # + set State(activeWidget) {} + set State(activeHeading) {} + + # Press/drag/release: + # + set State(pressMode) none + set State(pressX) 0 + + # For pressMode == "resize" + set State(resizeColumn) #0 + + # For pressmode == "heading" + set State(heading) {} +} + +### Widget bindings. +# + +bind Treeview { ttk::treeview::Motion %W %x %y } +bind Treeview { #nothing } +bind Treeview { ttk::treeview::ActivateHeading {} {}} +bind Treeview { ttk::treeview::Press %W %x %y } +bind Treeview { ttk::treeview::DoubleClick %W %x %y } +bind Treeview { ttk::treeview::Release %W %x %y } +bind Treeview { ttk::treeview::Drag %W %x %y } +bind Treeview { ttk::treeview::Keynav %W up } +bind Treeview { ttk::treeview::Keynav %W down } +bind Treeview { ttk::treeview::Keynav %W right } +bind Treeview { ttk::treeview::Keynav %W left } +bind Treeview { %W yview scroll -1 pages } +bind Treeview { %W yview scroll 1 pages } +bind Treeview { ttk::treeview::ToggleFocus %W } +bind Treeview { ttk::treeview::ToggleFocus %W } + +bind Treeview \ + { ttk::treeview::Select %W %x %y extend } +bind Treeview <> \ + { ttk::treeview::Select %W %x %y toggle } + +ttk::copyBindings TtkScrollable Treeview + +### Binding procedures. +# + +## Keynav -- Keyboard navigation +# +# @@@ TODO: verify/rewrite up and down code. +# +proc ttk::treeview::Keynav {w dir} { + set focus [$w focus] + if {$focus eq ""} { return } + + switch -- $dir { + up { + if {[set up [$w prev $focus]] eq ""} { + set focus [$w parent $focus] + } else { + while {[$w item $up -open] && [llength [$w children $up]]} { + set up [lindex [$w children $up] end] + } + set focus $up + } + } + down { + if {[$w item $focus -open] && [llength [$w children $focus]]} { + set focus [lindex [$w children $focus] 0] + } else { + set up $focus + while {$up ne "" && [set down [$w next $up]] eq ""} { + set up [$w parent $up] + } + set focus $down + } + } + left { + if {[$w item $focus -open] && [llength [$w children $focus]]} { + CloseItem $w $focus + } else { + set focus [$w parent $focus] + } + } + right { + OpenItem $w $focus + } + } + + if {$focus != {}} { + SelectOp $w $focus choose + } +} + +## Motion -- pointer motion binding. +# Sets cursor, active element ... +# +proc ttk::treeview::Motion {w x y} { + set cursor {} + set activeHeading {} + + switch -- [$w identify region $x $y] { + separator { set cursor hresize } + heading { set activeHeading [$w identify column $x $y] } + } + + ttk::setCursor $w $cursor + ActivateHeading $w $activeHeading +} + +## ActivateHeading -- track active heading element +# +proc ttk::treeview::ActivateHeading {w heading} { + variable State + + if {$w != $State(activeWidget) || $heading != $State(activeHeading)} { + if {[winfo exists $State(activeWidget)] && $State(activeHeading) != {}} { + $State(activeWidget) heading $State(activeHeading) state !active + } + if {$heading != {}} { + $w heading $heading state active + } + set State(activeHeading) $heading + set State(activeWidget) $w + } +} + +## Select $w $x $y $selectop +# Binding procedure for selection operations. +# See "Selection modes", below. +# +proc ttk::treeview::Select {w x y op} { + if {[set item [$w identify row $x $y]] ne "" } { + SelectOp $w $item $op + } +} + +## DoubleClick -- Double-ButtonPress-1 binding. +# +proc ttk::treeview::DoubleClick {w x y} { + if {[set row [$w identify row $x $y]] ne ""} { + Toggle $w $row + } else { + Press $w $x $y ;# perform single-click action + } +} + +## Press -- ButtonPress binding. +# +proc ttk::treeview::Press {w x y} { + focus $w + switch -- [$w identify region $x $y] { + nothing { } + heading { heading.press $w $x $y } + separator { resize.press $w $x $y } + tree - + cell { + set item [$w identify item $x $y] + SelectOp $w $item choose + switch -glob -- [$w identify element $x $y] { + *indicator - + *disclosure { Toggle $w $item } + } + } + } +} + +## Drag -- B1-Motion binding +# +proc ttk::treeview::Drag {w x y} { + variable State + switch $State(pressMode) { + resize { resize.drag $w $x } + heading { heading.drag $w $x $y } + } +} + +proc ttk::treeview::Release {w x y} { + variable State + switch $State(pressMode) { + resize { resize.release $w $x } + heading { heading.release $w } + } + set State(pressMode) none + Motion $w $x $y +} + +### Interactive column resizing. +# +proc ttk::treeview::resize.press {w x y} { + variable State + set State(pressMode) "resize" + set State(resizeColumn) [$w identify column $x $y] +} + +proc ttk::treeview::resize.drag {w x} { + variable State + $w drag $State(resizeColumn) $x +} + +proc ttk::treeview::resize.release {w x} { + # no-op +} + +### Heading activation. +# + +proc ttk::treeview::heading.press {w x y} { + variable State + set column [$w identify column $x $y] + set State(pressMode) "heading" + set State(heading) $column + $w heading $column state pressed +} + +proc ttk::treeview::heading.drag {w x y} { + variable State + if { [$w identify region $x $y] eq "heading" + && [$w identify column $x $y] eq $State(heading) + } { + $w heading $State(heading) state pressed + } else { + $w heading $State(heading) state !pressed + } +} + +proc ttk::treeview::heading.release {w} { + variable State + if {[lsearch -exact [$w heading $State(heading) state] pressed] >= 0} { + after 0 [$w heading $State(heading) -command] + } + $w heading $State(heading) state !pressed +} + +### Selection modes. +# + +## SelectOp $w $item [ choose | extend | toggle ] -- +# Dispatch to appropriate selection operation +# depending on current value of -selectmode. +# +proc ttk::treeview::SelectOp {w item op} { + select.$op.[$w cget -selectmode] $w $item +} + +## -selectmode none: +# +proc ttk::treeview::select.choose.none {w item} { $w focus $item } +proc ttk::treeview::select.toggle.none {w item} { $w focus $item } +proc ttk::treeview::select.extend.none {w item} { $w focus $item } + +## -selectmode browse: +# +proc ttk::treeview::select.choose.browse {w item} { BrowseTo $w $item } +proc ttk::treeview::select.toggle.browse {w item} { BrowseTo $w $item } +proc ttk::treeview::select.extend.browse {w item} { BrowseTo $w $item } + +## -selectmode multiple: +# +proc ttk::treeview::select.choose.extended {w item} { + BrowseTo $w $item +} +proc ttk::treeview::select.toggle.extended {w item} { + $w selection toggle [list $item] +} +proc ttk::treeview::select.extend.extended {w item} { + if {[set anchor [$w focus]] ne ""} { + $w selection set [between $w $anchor $item] + } else { + BrowseTo $w $item + } +} + +### Tree structure utilities. +# + +## between $tv $item1 $item2 -- +# Returns a list of all items between $item1 and $item2, +# in preorder traversal order. $item1 and $item2 may be +# in either order. +# +# NOTES: +# This routine is O(N) in the size of the tree. +# There's probably a way to do this that's O(N) in the number +# of items returned, but I'm not clever enough to figure it out. +# +proc ttk::treeview::between {tv item1 item2} { + variable between [list] + variable selectingBetween 0 + ScanBetween $tv $item1 $item2 {} + return $between +} + +## ScanBetween -- +# Recursive worker routine for ttk::treeview::between +# +proc ttk::treeview::ScanBetween {tv item1 item2 item} { + variable between + variable selectingBetween + + if {$item eq $item1 || $item eq $item2} { + lappend between $item + set selectingBetween [expr {!$selectingBetween}] + } elseif {$selectingBetween} { + lappend between $item + } + foreach child [$tv children $item] { + ScanBetween $tv $item1 $item2 $child + } +} + +### User interaction utilities. +# + +## OpenItem, CloseItem -- Set the open state of an item, generate event +# + +proc ttk::treeview::OpenItem {w item} { + $w focus $item + event generate $w <> + $w item $item -open true +} + +proc ttk::treeview::CloseItem {w item} { + $w item $item -open false + $w focus $item + event generate $w <> +} + +## Toggle -- toggle opened/closed state of item +# +proc ttk::treeview::Toggle {w item} { + if {[$w item $item -open]} { + CloseItem $w $item + } else { + OpenItem $w $item + } +} + +## ToggleFocus -- toggle opened/closed state of focus item +# +proc ttk::treeview::ToggleFocus {w} { + set item [$w focus] + if {$item ne ""} { + Toggle $w $item + } +} + +## BrowseTo -- navigate to specified item; set focus and selection +# +proc ttk::treeview::BrowseTo {w item} { + $w see $item + $w focus $item + $w selection set [list $item] +} + +#*EOF* diff --git a/env/tcl/tk8.6/ttk/ttk.tcl b/env/tcl/tk8.6/ttk/ttk.tcl new file mode 100644 index 0000000..7bae211 --- /dev/null +++ b/env/tcl/tk8.6/ttk/ttk.tcl @@ -0,0 +1,176 @@ +# +# Ttk widget set initialization script. +# + +### Source library scripts. +# + +namespace eval ::ttk { + variable library + if {![info exists library]} { + set library [file dirname [info script]] + } +} + +source [file join $::ttk::library fonts.tcl] +source [file join $::ttk::library cursors.tcl] +source [file join $::ttk::library utils.tcl] + +## ttk::deprecated $old $new -- +# Define $old command as a deprecated alias for $new command +# $old and $new must be fully namespace-qualified. +# +proc ttk::deprecated {old new} { + interp alias {} $old {} ttk::do'deprecate $old $new +} +## do'deprecate -- +# Implementation procedure for deprecated commands -- +# issue a warning (once), then re-alias old to new. +# +proc ttk::do'deprecate {old new args} { + deprecated'warning $old $new + interp alias {} $old {} $new + uplevel 1 [linsert $args 0 $new] +} + +## deprecated'warning -- +# Gripe about use of deprecated commands. +# +proc ttk::deprecated'warning {old new} { + puts stderr "$old deprecated -- use $new instead" +} + +### Backward-compatibility. +# +# +# Make [package require tile] an effective no-op; +# see SF#3016598 for discussion. +# +package ifneeded tile 0.8.6 { package provide tile 0.8.6 } + +# ttk::panedwindow used to be named ttk::paned. Keep the alias for now. +# +::ttk::deprecated ::ttk::paned ::ttk::panedwindow + +### ::ttk::ThemeChanged -- +# Called from [::ttk::style theme use]. +# Sends a <> virtual event to all widgets. +# +proc ::ttk::ThemeChanged {} { + set Q . + while {[llength $Q]} { + set QN [list] + foreach w $Q { + event generate $w <> + foreach child [winfo children $w] { + lappend QN $child + } + } + set Q $QN + } +} + +### Public API. +# + +proc ::ttk::themes {{ptn *}} { + set themes [list] + + foreach pkg [lsearch -inline -all -glob [package names] ttk::theme::$ptn] { + lappend themes [namespace tail $pkg] + } + + return $themes +} + +## ttk::setTheme $theme -- +# Set the current theme to $theme, loading it if necessary. +# +proc ::ttk::setTheme {theme} { + variable currentTheme ;# @@@ Temp -- [::ttk::style theme use] doesn't work + if {$theme ni [::ttk::style theme names]} { + package require ttk::theme::$theme + } + ::ttk::style theme use $theme + set currentTheme $theme +} + +### Load widget bindings. +# +source [file join $::ttk::library button.tcl] +source [file join $::ttk::library menubutton.tcl] +source [file join $::ttk::library scrollbar.tcl] +source [file join $::ttk::library scale.tcl] +source [file join $::ttk::library progress.tcl] +source [file join $::ttk::library notebook.tcl] +source [file join $::ttk::library panedwindow.tcl] +source [file join $::ttk::library entry.tcl] +source [file join $::ttk::library combobox.tcl] ;# dependency: entry.tcl +source [file join $::ttk::library spinbox.tcl] ;# dependency: entry.tcl +source [file join $::ttk::library treeview.tcl] +source [file join $::ttk::library sizegrip.tcl] + +## Label and Labelframe bindings: +# (not enough to justify their own file...) +# +bind TLabelframe <> { tk::TabToWindow [tk_focusNext %W] } +bind TLabel <> { tk::TabToWindow [tk_focusNext %W] } + +### Load settings for built-in themes: +# +proc ttk::LoadThemes {} { + variable library + + # "default" always present: + uplevel #0 [list source [file join $library defaults.tcl]] + + set builtinThemes [style theme names] + foreach {theme scripts} { + classic classicTheme.tcl + alt altTheme.tcl + clam clamTheme.tcl + winnative winTheme.tcl + xpnative {xpTheme.tcl vistaTheme.tcl} + aqua aquaTheme.tcl + } { + if {[lsearch -exact $builtinThemes $theme] >= 0} { + foreach script $scripts { + uplevel #0 [list source [file join $library $script]] + } + } + } +} + +ttk::LoadThemes; rename ::ttk::LoadThemes {} + +### Select platform-specific default theme: +# +# Notes: +# + On OSX, aqua theme is the default +# + On Windows, xpnative takes precedence over winnative if available. +# + On X11, users can use the X resource database to +# specify a preferred theme (*TkTheme: themeName); +# otherwise "default" is used. +# + +proc ttk::DefaultTheme {} { + set preferred [list aqua vista xpnative winnative] + + set userTheme [option get . tkTheme TkTheme] + if {$userTheme ne {} && ![catch { + uplevel #0 [list package require ttk::theme::$userTheme] + }]} { + return $userTheme + } + + foreach theme $preferred { + if {[package provide ttk::theme::$theme] ne ""} { + return $theme + } + } + return "default" +} + +ttk::setTheme [ttk::DefaultTheme] ; rename ttk::DefaultTheme {} + +#*EOF* diff --git a/env/tcl/tk8.6/ttk/utils.tcl b/env/tcl/tk8.6/ttk/utils.tcl new file mode 100644 index 0000000..7cc1bb7 --- /dev/null +++ b/env/tcl/tk8.6/ttk/utils.tcl @@ -0,0 +1,350 @@ +# +# Utilities for widget implementations. +# + +### Focus management. +# +# See also: #1516479 +# + +## ttk::takefocus -- +# This is the default value of the "-takefocus" option +# for ttk::* widgets that participate in keyboard navigation. +# +# NOTES: +# tk::FocusOK (called by tk_focusNext) tests [winfo viewable] +# if -takefocus is 1, empty, or missing; but not if it's a +# script prefix, so we have to check that here as well. +# +# +proc ttk::takefocus {w} { + expr {[$w instate !disabled] && [winfo viewable $w]} +} + +## ttk::GuessTakeFocus -- +# This routine is called as a fallback for widgets +# with a missing or empty -takefocus option. +# +# It implements the same heuristics as tk::FocusOK. +# +proc ttk::GuessTakeFocus {w} { + # Don't traverse to widgets with '-state disabled': + # + if {![catch {$w cget -state} state] && $state eq "disabled"} { + return 0 + } + + # Allow traversal to widgets with explicit key or focus bindings: + # + if {[regexp {Key|Focus} [concat [bind $w] [bind [winfo class $w]]]]} { + return 1; + } + + # Default is nontraversable: + # + return 0; +} + +## ttk::traverseTo $w -- +# Set the keyboard focus to the specified window. +# +proc ttk::traverseTo {w} { + set focus [focus] + if {$focus ne ""} { + event generate $focus <> + } + focus $w + event generate $w <> +} + +## ttk::clickToFocus $w -- +# Utility routine, used in bindings -- +# Assign keyboard focus to the specified widget if -takefocus is enabled. +# +proc ttk::clickToFocus {w} { + if {[ttk::takesFocus $w]} { focus $w } +} + +## ttk::takesFocus w -- +# Test if the widget can take keyboard focus. +# +# See the description of the -takefocus option in options(n) +# for details. +# +proc ttk::takesFocus {w} { + if {![winfo viewable $w]} { + return 0 + } elseif {[catch {$w cget -takefocus} takefocus]} { + return [GuessTakeFocus $w] + } else { + switch -- $takefocus { + "" { return [GuessTakeFocus $w] } + 0 { return 0 } + 1 { return 1 } + default { + return [expr {[uplevel #0 $takefocus [list $w]] == 1}] + } + } + } +} + +## ttk::focusFirst $w -- +# Return the first descendant of $w, in preorder traversal order, +# that can take keyboard focus, "" if none do. +# +# See also: tk_focusNext +# + +proc ttk::focusFirst {w} { + if {[ttk::takesFocus $w]} { + return $w + } + foreach child [winfo children $w] { + if {[set c [ttk::focusFirst $child]] ne ""} { + return $c + } + } + return "" +} + +### Grabs. +# +# Rules: +# Each call to [grabWindow $w] or [globalGrab $w] must be +# matched with a call to [releaseGrab $w] in LIFO order. +# +# Do not call [grabWindow $w] for a window that currently +# appears on the grab stack. +# +# See #1239190 and #1411983 for more discussion. +# +namespace eval ttk { + variable Grab ;# map: window name -> grab token + + # grab token details: + # Two-element list containing: + # 1) a script to evaluate to restore the previous grab (if any); + # 2) a script to evaluate to restore the focus (if any) +} + +## SaveGrab -- +# Record current grab and focus windows. +# +proc ttk::SaveGrab {w} { + variable Grab + + if {[info exists Grab($w)]} { + # $w is already on the grab stack. + # This should not happen, but bail out in case it does anyway: + # + return + } + + set restoreGrab [set restoreFocus ""] + + set grabbed [grab current $w] + if {[winfo exists $grabbed]} { + switch [grab status $grabbed] { + global { set restoreGrab [list grab -global $grabbed] } + local { set restoreGrab [list grab $grabbed] } + none { ;# grab window is really in a different interp } + } + } + + set focus [focus] + if {$focus ne ""} { + set restoreFocus [list focus -force $focus] + } + + set Grab($w) [list $restoreGrab $restoreFocus] +} + +## RestoreGrab -- +# Restore previous grab and focus windows. +# If called more than once without an intervening [SaveGrab $w], +# does nothing. +# +proc ttk::RestoreGrab {w} { + variable Grab + + if {![info exists Grab($w)]} { # Ignore + return; + } + + # The previous grab/focus window may have been destroyed, + # unmapped, or some other abnormal condition; ignore any errors. + # + foreach script $Grab($w) { + catch $script + } + + unset Grab($w) +} + +## ttk::grabWindow $w -- +# Records the current focus and grab windows, sets an application-modal +# grab on window $w. +# +proc ttk::grabWindow {w} { + SaveGrab $w + grab $w +} + +## ttk::globalGrab $w -- +# Same as grabWindow, but sets a global grab on $w. +# +proc ttk::globalGrab {w} { + SaveGrab $w + grab -global $w +} + +## ttk::releaseGrab -- +# Release the grab previously set by [ttk::grabWindow] +# or [ttk::globalGrab]. +# +proc ttk::releaseGrab {w} { + grab release $w + RestoreGrab $w +} + +### Auto-repeat. +# +# NOTE: repeating widgets do not have -repeatdelay +# or -repeatinterval resources as in standard Tk; +# instead a single set of settings is applied application-wide. +# (TODO: make this user-configurable) +# +# (@@@ Windows seems to use something like 500/50 milliseconds +# @@@ for -repeatdelay/-repeatinterval) +# + +namespace eval ttk { + variable Repeat + array set Repeat { + delay 300 + interval 100 + timer {} + script {} + } +} + +## ttk::Repeatedly -- +# Begin auto-repeat. +# +proc ttk::Repeatedly {args} { + variable Repeat + after cancel $Repeat(timer) + set script [uplevel 1 [list namespace code $args]] + set Repeat(script) $script + uplevel #0 $script + set Repeat(timer) [after $Repeat(delay) ttk::Repeat] +} + +## Repeat -- +# Continue auto-repeat +# +proc ttk::Repeat {} { + variable Repeat + uplevel #0 $Repeat(script) + set Repeat(timer) [after $Repeat(interval) ttk::Repeat] +} + +## ttk::CancelRepeat -- +# Halt auto-repeat. +# +proc ttk::CancelRepeat {} { + variable Repeat + after cancel $Repeat(timer) +} + +### Bindings. +# + +## ttk::copyBindings $from $to -- +# Utility routine; copies bindings from one bindtag onto another. +# +proc ttk::copyBindings {from to} { + foreach event [bind $from] { + bind $to $event [bind $from $event] + } +} + +### Mousewheel bindings. +# +# Platform inconsistencies: +# +# On X11, the server typically maps the mouse wheel to Button4 and Button5. +# +# On OSX, Tk generates sensible values for the %D field in events. +# +# On Windows, %D must be scaled by a factor of 120. +# In addition, Tk redirects mousewheel events to the window with +# keyboard focus instead of sending them to the window under the pointer. +# We do not attempt to fix that here, see also TIP#171. +# +# OSX conventionally uses Shift+MouseWheel for horizontal scrolling, +# and Option+MouseWheel for accelerated scrolling. +# +# The Shift+MouseWheel behavior is not conventional on Windows or most +# X11 toolkits, but it's useful. +# +# MouseWheel scrolling is accelerated on X11, which is conventional +# for Tk and appears to be conventional for other toolkits (although +# Gtk+ and Qt do not appear to use as large a factor). +# + +## ttk::bindMouseWheel $bindtag $command... +# Adds basic mousewheel support to $bindtag. +# $command will be passed one additional argument +# specifying the mousewheel direction (-1: up, +1: down). +# + +proc ttk::bindMouseWheel {bindtag callback} { + switch -- [tk windowingsystem] { + x11 { + bind $bindtag "$callback -1" + bind $bindtag "$callback +1" + } + win32 { + bind $bindtag [append callback { [expr {-(%D/120)}]}] + } + aqua { + bind $bindtag [append callback { [expr {-(%D)}]} ] + } + } +} + +## Mousewheel bindings for standard scrollable widgets. +# +# Usage: [ttk::copyBindings TtkScrollable $bindtag] +# +# $bindtag should be for a widget that supports the +# standard scrollbar protocol. +# + +switch -- [tk windowingsystem] { + x11 { + bind TtkScrollable { %W yview scroll -5 units } + bind TtkScrollable { %W yview scroll 5 units } + bind TtkScrollable { %W xview scroll -5 units } + bind TtkScrollable { %W xview scroll 5 units } + } + win32 { + bind TtkScrollable \ + { %W yview scroll [expr {-(%D/120)}] units } + bind TtkScrollable \ + { %W xview scroll [expr {-(%D/120)}] units } + } + aqua { + bind TtkScrollable \ + { %W yview scroll [expr {-(%D)}] units } + bind TtkScrollable \ + { %W xview scroll [expr {-(%D)}] units } + bind TtkScrollable \ + { %W yview scroll [expr {-10*(%D)}] units } + bind TtkScrollable \ + { %W xview scroll [expr {-10*(%D)}] units } + } +} + +#*EOF* diff --git a/env/tcl/tk8.6/ttk/vistaTheme.tcl b/env/tcl/tk8.6/ttk/vistaTheme.tcl new file mode 100644 index 0000000..ecb39c9 --- /dev/null +++ b/env/tcl/tk8.6/ttk/vistaTheme.tcl @@ -0,0 +1,231 @@ +# +# Settings for Microsoft Windows Vista and Server 2008 +# + +# The Vista theme can only be defined on Windows Vista and above. The theme +# is created in C due to the need to assign a theme-enabled function for +# detecting when themeing is disabled. On systems that cannot support the +# Vista theme, there will be no such theme created and we must not +# evaluate this script. + +if {"vista" ni [ttk::style theme names]} { + return +} + +namespace eval ttk::theme::vista { + + ttk::style theme settings vista { + + ttk::style configure . \ + -background SystemButtonFace \ + -foreground SystemWindowText \ + -selectforeground SystemHighlightText \ + -selectbackground SystemHighlight \ + -insertcolor SystemWindowText \ + -font TkDefaultFont \ + ; + + ttk::style map "." \ + -foreground [list disabled SystemGrayText] \ + ; + + ttk::style configure TButton -anchor center -padding {1 1} -width -11 + ttk::style configure TRadiobutton -padding 2 + ttk::style configure TCheckbutton -padding 2 + ttk::style configure TMenubutton -padding {8 4} + + ttk::style element create Menubutton.dropdown vsapi \ + TOOLBAR 4 {{selected active} 6 {selected !active} 5 + disabled 4 pressed 3 active 2 {} 1} \ + -syssize {SM_CXVSCROLL SM_CYVSCROLL} + + ttk::style configure TNotebook -tabmargins {2 2 2 0} + ttk::style map TNotebook.Tab \ + -expand [list selected {2 2 2 2}] + + # Treeview: + ttk::style configure Heading -font TkHeadingFont + ttk::style configure Treeview -background SystemWindow + ttk::style map Treeview \ + -background [list disabled SystemButtonFace \ + {!disabled !selected} SystemWindow \ + selected SystemHighlight] \ + -foreground [list disabled SystemGrayText \ + {!disabled !selected} SystemWindowText \ + selected SystemHighlightText] + + # Label and Toolbutton + ttk::style configure TLabelframe.Label -foreground SystemButtonText + + ttk::style configure Toolbutton -padding {4 4} + + # Combobox + ttk::style configure TCombobox -padding 2 + ttk::style element create Combobox.border vsapi \ + COMBOBOX 4 {disabled 4 focus 3 active 2 hover 2 {} 1} + ttk::style element create Combobox.background vsapi \ + EDIT 3 {disabled 3 readonly 5 focus 4 hover 2 {} 1} + ttk::style element create Combobox.rightdownarrow vsapi \ + COMBOBOX 6 {disabled 4 pressed 3 active 2 {} 1} \ + -syssize {SM_CXVSCROLL SM_CYVSCROLL} + ttk::style layout TCombobox { + Combobox.border -sticky nswe -border 0 -children { + Combobox.rightdownarrow -side right -sticky ns + Combobox.padding -expand 1 -sticky nswe -children { + Combobox.background -sticky nswe -children { + Combobox.focus -expand 1 -sticky nswe -children { + Combobox.textarea -sticky nswe + } + } + } + } + } + # Vista.Combobox droplist frame + ttk::style element create ComboboxPopdownFrame.background vsapi\ + LISTBOX 3 {disabled 4 active 3 focus 2 {} 1} + ttk::style layout ComboboxPopdownFrame { + ComboboxPopdownFrame.background -sticky news -border 1 -children { + ComboboxPopdownFrame.padding -sticky news + } + } + ttk::style map TCombobox \ + -selectbackground [list !focus SystemWindow] \ + -selectforeground [list !focus SystemWindowText] \ + -foreground [list \ + disabled SystemGrayText \ + {readonly focus} SystemHighlightText \ + ] \ + -focusfill [list {readonly focus} SystemHighlight] \ + ; + + # Entry + ttk::style configure TEntry -padding {1 1 1 1} ;# Needs lookup + ttk::style element create Entry.field vsapi \ + EDIT 6 {disabled 4 focus 3 hover 2 {} 1} -padding {2 2 2 2} + ttk::style element create Entry.background vsapi \ + EDIT 3 {disabled 3 readonly 3 focus 4 hover 2 {} 1} + ttk::style layout TEntry { + Entry.field -sticky news -border 0 -children { + Entry.background -sticky news -children { + Entry.padding -sticky news -children { + Entry.textarea -sticky news + } + } + } + } + ttk::style map TEntry \ + -selectbackground [list !focus SystemWindow] \ + -selectforeground [list !focus SystemWindowText] \ + ; + + # Spinbox + ttk::style configure TSpinbox -padding 0 + ttk::style element create Spinbox.field vsapi \ + EDIT 9 {disabled 4 focus 3 hover 2 {} 1} -padding {1 1 1 2} + ttk::style element create Spinbox.background vsapi \ + EDIT 3 {disabled 3 readonly 3 focus 4 hover 2 {} 1} + ttk::style element create Spinbox.innerbg vsapi \ + EDIT 3 {disabled 3 readonly 3 focus 4 hover 2 {} 1}\ + -padding {2 0 15 2} + ttk::style element create Spinbox.uparrow vsapi \ + SPIN 1 {disabled 4 pressed 3 active 2 {} 1} \ + -padding 1 -halfheight 1 \ + -syssize { SM_CXVSCROLL SM_CYVSCROLL } + ttk::style element create Spinbox.downarrow vsapi \ + SPIN 2 {disabled 4 pressed 3 active 2 {} 1} \ + -padding 1 -halfheight 1 \ + -syssize { SM_CXVSCROLL SM_CYVSCROLL } + ttk::style layout TSpinbox { + Spinbox.field -sticky nswe -children { + Spinbox.background -sticky news -children { + Spinbox.padding -sticky news -children { + Spinbox.innerbg -sticky news -children { + Spinbox.textarea -expand 1 + } + } + Spinbox.uparrow -side top -sticky ens + Spinbox.downarrow -side bottom -sticky ens + } + } + } + ttk::style map TSpinbox \ + -selectbackground [list !focus SystemWindow] \ + -selectforeground [list !focus SystemWindowText] \ + ; + + + # SCROLLBAR elements (Vista includes a state for 'hover') + ttk::style element create Vertical.Scrollbar.uparrow vsapi \ + SCROLLBAR 1 {disabled 4 pressed 3 active 2 hover 17 {} 1} \ + -syssize {SM_CXVSCROLL SM_CYVSCROLL} + ttk::style element create Vertical.Scrollbar.downarrow vsapi \ + SCROLLBAR 1 {disabled 8 pressed 7 active 6 hover 18 {} 5} \ + -syssize {SM_CXVSCROLL SM_CYVSCROLL} + ttk::style element create Vertical.Scrollbar.trough vsapi \ + SCROLLBAR 7 {disabled 4 pressed 3 active 2 hover 5 {} 1} + ttk::style element create Vertical.Scrollbar.thumb vsapi \ + SCROLLBAR 3 {disabled 4 pressed 3 active 2 hover 5 {} 1} \ + -syssize {SM_CXVSCROLL SM_CYVSCROLL} + ttk::style element create Vertical.Scrollbar.grip vsapi \ + SCROLLBAR 9 {disabled 4 pressed 3 active 2 hover 5 {} 1} \ + -syssize {SM_CXVSCROLL SM_CYVSCROLL} + ttk::style element create Horizontal.Scrollbar.leftarrow vsapi \ + SCROLLBAR 1 {disabled 12 pressed 11 active 10 hover 19 {} 9} \ + -syssize {SM_CXHSCROLL SM_CYHSCROLL} + ttk::style element create Horizontal.Scrollbar.rightarrow vsapi \ + SCROLLBAR 1 {disabled 16 pressed 15 active 14 hover 20 {} 13} \ + -syssize {SM_CXHSCROLL SM_CYHSCROLL} + ttk::style element create Horizontal.Scrollbar.trough vsapi \ + SCROLLBAR 5 {disabled 4 pressed 3 active 2 hover 5 {} 1} + ttk::style element create Horizontal.Scrollbar.thumb vsapi \ + SCROLLBAR 2 {disabled 4 pressed 3 active 2 hover 5 {} 1} \ + -syssize {SM_CXHSCROLL SM_CYHSCROLL} + ttk::style element create Horizontal.Scrollbar.grip vsapi \ + SCROLLBAR 8 {disabled 4 pressed 3 active 2 hover 5 {} 1} + + # Progressbar + ttk::style element create Horizontal.Progressbar.pbar vsapi \ + PROGRESS 3 {{} 1} -padding 8 + ttk::style layout Horizontal.TProgressbar { + Horizontal.Progressbar.trough -sticky nswe -children { + Horizontal.Progressbar.pbar -side left -sticky ns + } + } + ttk::style element create Vertical.Progressbar.pbar vsapi \ + PROGRESS 3 {{} 1} -padding 8 + ttk::style layout Vertical.TProgressbar { + Vertical.Progressbar.trough -sticky nswe -children { + Vertical.Progressbar.pbar -side bottom -sticky we + } + } + + # Scale + ttk::style element create Horizontal.Scale.slider vsapi \ + TRACKBAR 3 {disabled 5 focus 4 pressed 3 active 2 {} 1} \ + -width 6 -height 12 + ttk::style layout Horizontal.TScale { + Scale.focus -expand 1 -sticky nswe -children { + Horizontal.Scale.trough -expand 1 -sticky nswe -children { + Horizontal.Scale.track -sticky we + Horizontal.Scale.slider -side left -sticky {} + } + } + } + ttk::style element create Vertical.Scale.slider vsapi \ + TRACKBAR 6 {disabled 5 focus 4 pressed 3 active 2 {} 1} \ + -width 12 -height 6 + ttk::style layout Vertical.TScale { + Scale.focus -expand 1 -sticky nswe -children { + Vertical.Scale.trough -expand 1 -sticky nswe -children { + Vertical.Scale.track -sticky ns + Vertical.Scale.slider -side top -sticky {} + } + } + } + + # Treeview + ttk::style configure Item -padding {4 0 0 0} + + package provide ttk::theme::vista 1.0 + } +} diff --git a/env/tcl/tk8.6/ttk/winTheme.tcl b/env/tcl/tk8.6/ttk/winTheme.tcl new file mode 100644 index 0000000..a7a2c79 --- /dev/null +++ b/env/tcl/tk8.6/ttk/winTheme.tcl @@ -0,0 +1,86 @@ +# +# Settings for 'winnative' theme. +# + +namespace eval ttk::theme::winnative { + ttk::style theme settings winnative { + + ttk::style configure "." \ + -background SystemButtonFace \ + -foreground SystemWindowText \ + -selectforeground SystemHighlightText \ + -selectbackground SystemHighlight \ + -fieldbackground SystemWindow \ + -insertcolor SystemWindowText \ + -troughcolor SystemScrollbar \ + -font TkDefaultFont \ + ; + + ttk::style map "." -foreground [list disabled SystemGrayText] ; + ttk::style map "." -embossed [list disabled 1] ; + + ttk::style configure TButton \ + -anchor center -width -11 -relief raised -shiftrelief 1 + ttk::style configure TCheckbutton -padding "2 4" + ttk::style configure TRadiobutton -padding "2 4" + ttk::style configure TMenubutton \ + -padding "8 4" -arrowsize 3 -relief raised + + ttk::style map TButton -relief {{!disabled pressed} sunken} + + ttk::style configure TEntry \ + -padding 2 -selectborderwidth 0 -insertwidth 1 + ttk::style map TEntry \ + -fieldbackground \ + [list readonly SystemButtonFace disabled SystemButtonFace] \ + -selectbackground [list !focus SystemWindow] \ + -selectforeground [list !focus SystemWindowText] \ + ; + + ttk::style configure TCombobox -padding 2 + ttk::style map TCombobox \ + -selectbackground [list !focus SystemWindow] \ + -selectforeground [list !focus SystemWindowText] \ + -fieldbackground [list \ + readonly SystemButtonFace \ + disabled SystemButtonFace] \ + -foreground [list \ + disabled SystemGrayText \ + {readonly focus} SystemHighlightText \ + ] \ + -focusfill [list {readonly focus} SystemHighlight] \ + ; + + ttk::style element create ComboboxPopdownFrame.border from default + ttk::style configure ComboboxPopdownFrame \ + -borderwidth 1 -relief solid + + ttk::style configure TSpinbox -padding {2 0 16 0} + + ttk::style configure TLabelframe -borderwidth 2 -relief groove + + ttk::style configure Toolbutton -relief flat -padding {8 4} + ttk::style map Toolbutton -relief \ + {disabled flat selected sunken pressed sunken active raised} + + ttk::style configure TScale -groovewidth 4 + + ttk::style configure TNotebook -tabmargins {2 2 2 0} + ttk::style configure TNotebook.Tab -padding {3 1} -borderwidth 1 + ttk::style map TNotebook.Tab -expand [list selected {2 2 2 0}] + + # Treeview: + ttk::style configure Heading -font TkHeadingFont -relief raised + ttk::style configure Treeview -background SystemWindow + ttk::style map Treeview \ + -background [list disabled SystemButtonFace \ + {!disabled !selected} SystemWindow \ + selected SystemHighlight] \ + -foreground [list disabled SystemGrayText \ + {!disabled !selected} SystemWindowText \ + selected SystemHighlightText] + + ttk::style configure TProgressbar \ + -background SystemHighlight -borderwidth 0 ; + } +} diff --git a/env/tcl/tk8.6/ttk/xpTheme.tcl b/env/tcl/tk8.6/ttk/xpTheme.tcl new file mode 100644 index 0000000..5d8d09b --- /dev/null +++ b/env/tcl/tk8.6/ttk/xpTheme.tcl @@ -0,0 +1,76 @@ +# +# Settings for 'xpnative' theme +# + +namespace eval ttk::theme::xpnative { + + ttk::style theme settings xpnative { + + ttk::style configure . \ + -background SystemButtonFace \ + -foreground SystemWindowText \ + -selectforeground SystemHighlightText \ + -selectbackground SystemHighlight \ + -insertcolor SystemWindowText \ + -font TkDefaultFont \ + ; + + ttk::style map "." \ + -foreground [list disabled SystemGrayText] \ + ; + + ttk::style configure TButton -anchor center -padding {1 1} -width -11 + ttk::style configure TRadiobutton -padding 2 + ttk::style configure TCheckbutton -padding 2 + ttk::style configure TMenubutton -padding {8 4} + + ttk::style configure TNotebook -tabmargins {2 2 2 0} + ttk::style map TNotebook.Tab \ + -expand [list selected {2 2 2 2}] + + # Treeview: + ttk::style configure Heading -font TkHeadingFont + ttk::style configure Treeview -background SystemWindow + ttk::style map Treeview \ + -background [list selected SystemHighlight] \ + -foreground [list selected SystemHighlightText] ; + + ttk::style configure TLabelframe.Label -foreground "#0046d5" + + # OR: -padding {3 3 3 6}, which some apps seem to use. + ttk::style configure TEntry -padding {2 2 2 4} + ttk::style map TEntry \ + -selectbackground [list !focus SystemWindow] \ + -selectforeground [list !focus SystemWindowText] \ + ; + ttk::style configure TCombobox -padding 2 + ttk::style map TCombobox \ + -selectbackground [list !focus SystemWindow] \ + -selectforeground [list !focus SystemWindowText] \ + -foreground [list \ + disabled SystemGrayText \ + {readonly focus} SystemHighlightText \ + ] \ + -focusfill [list {readonly focus} SystemHighlight] \ + ; + + ttk::style configure TSpinbox -padding {2 0 14 0} + ttk::style map TSpinbox \ + -selectbackground [list !focus SystemWindow] \ + -selectforeground [list !focus SystemWindowText] \ + ; + + ttk::style configure Toolbutton -padding {4 4} + + # Treeview: + ttk::style configure Heading -font TkHeadingFont -relief raised + ttk::style configure Treeview -background SystemWindow + ttk::style map Treeview \ + -background [list disabled SystemButtonFace \ + {!disabled !selected} SystemWindow \ + selected SystemHighlight] \ + -foreground [list disabled SystemGrayText \ + {!disabled !selected} SystemWindowText \ + selected SystemHighlightText]; + } +} diff --git a/env/tcl/tk8.6/unsupported.tcl b/env/tcl/tk8.6/unsupported.tcl new file mode 100644 index 0000000..b5f404a --- /dev/null +++ b/env/tcl/tk8.6/unsupported.tcl @@ -0,0 +1,269 @@ +# unsupported.tcl -- +# +# Commands provided by Tk without official support. Use them at your +# own risk. They may change or go away without notice. +# +# See the file "license.terms" for information on usage and redistribution +# of this file, and for a DISCLAIMER OF ALL WARRANTIES. + +# ---------------------------------------------------------------------- +# Unsupported compatibility interface for folks accessing Tk's private +# commands and variable against recommended usage. +# ---------------------------------------------------------------------- + +namespace eval ::tk::unsupported { + + # Map from the old global names of Tk private commands to their + # new namespace-encapsulated names. + + variable PrivateCommands + array set PrivateCommands { + tkButtonAutoInvoke ::tk::ButtonAutoInvoke + tkButtonDown ::tk::ButtonDown + tkButtonEnter ::tk::ButtonEnter + tkButtonInvoke ::tk::ButtonInvoke + tkButtonLeave ::tk::ButtonLeave + tkButtonUp ::tk::ButtonUp + tkCancelRepeat ::tk::CancelRepeat + tkCheckRadioDown ::tk::CheckRadioDown + tkCheckRadioEnter ::tk::CheckRadioEnter + tkCheckRadioInvoke ::tk::CheckRadioInvoke + tkColorDialog ::tk::dialog::color:: + tkColorDialog_BuildDialog ::tk::dialog::color::BuildDialog + tkColorDialog_CancelCmd ::tk::dialog::color::CancelCmd + tkColorDialog_Config ::tk::dialog::color::Config + tkColorDialog_CreateSelector ::tk::dialog::color::CreateSelector + tkColorDialog_DrawColorScale ::tk::dialog::color::DrawColorScale + tkColorDialog_EnterColorBar ::tk::dialog::color::EnterColorBar + tkColorDialog_InitValues ::tk::dialog::color::InitValues + tkColorDialog_HandleRGBEntry ::tk::dialog::color::HandleRGBEntry + tkColorDialog_HandleSelEntry ::tk::dialog::color::HandleSelEntry + tkColorDialog_LeaveColorBar ::tk::dialog::color::LeaveColorBar + tkColorDialog_MoveSelector ::tk::dialog::color::MoveSelector + tkColorDialog_OkCmd ::tk::dialog::color::OkCmd + tkColorDialog_RedrawColorBars ::tk::dialog::color::RedrawColorBars + tkColorDialog_RedrawFinalColor ::tk::dialog::color::RedrawFinalColor + tkColorDialog_ReleaseMouse ::tk::dialog::color::ReleaseMouse + tkColorDialog_ResizeColorBars ::tk::dialog::color::ResizeColorBars + tkColorDialog_RgbToX ::tk::dialog::color::RgbToX + tkColorDialog_SetRGBValue ::tk::dialog::color::SetRGBValue + tkColorDialog_StartMove ::tk::dialog::color::StartMove + tkColorDialog_XToRgb ::tk::dialog::color::XToRGB + tkConsoleAbout ::tk::ConsoleAbout + tkConsoleBind ::tk::ConsoleBind + tkConsoleExit ::tk::ConsoleExit + tkConsoleHistory ::tk::ConsoleHistory + tkConsoleInit ::tk::ConsoleInit + tkConsoleInsert ::tk::ConsoleInsert + tkConsoleInvoke ::tk::ConsoleInvoke + tkConsoleOutput ::tk::ConsoleOutput + tkConsolePrompt ::tk::ConsolePrompt + tkConsoleSource ::tk::ConsoleSource + tkDarken ::tk::Darken + tkEntryAutoScan ::tk::EntryAutoScan + tkEntryBackspace ::tk::EntryBackspace + tkEntryButton1 ::tk::EntryButton1 + tkEntryClosestGap ::tk::EntryClosestGap + tkEntryGetSelection ::tk::EntryGetSelection + tkEntryInsert ::tk::EntryInsert + tkEntryKeySelect ::tk::EntryKeySelect + tkEntryMouseSelect ::tk::EntryMouseSelect + tkEntryNextWord ::tk::EntryNextWord + tkEntryPaste ::tk::EntryPaste + tkEntryPreviousWord ::tk::EntryPreviousWord + tkEntrySeeInsert ::tk::EntrySeeInsert + tkEntrySetCursor ::tk::EntrySetCursor + tkEntryTranspose ::tk::EntryTranspose + tkEventMotifBindings ::tk::EventMotifBindings + tkFDGetFileTypes ::tk::FDGetFileTypes + tkFirstMenu ::tk::FirstMenu + tkFocusGroup_BindIn ::tk::FocusGroup_BindIn + tkFocusGroup_BindOut ::tk::FocusGroup_BindOut + tkFocusGroup_Create ::tk::FocusGroup_Create + tkFocusGroup_Destroy ::tk::FocusGroup_Destroy + tkFocusGroup_In ::tk::FocusGroup_In + tkFocusGroup_Out ::tk::FocusGroup_Out + tkFocusOK ::tk::FocusOK + tkGenerateMenuSelect ::tk::GenerateMenuSelect + tkIconList ::tk::IconList + tkListbox ::tk::Listbox + tkListboxAutoScan ::tk::ListboxAutoScan + tkListboxBeginExtend ::tk::ListboxBeginExtend + tkListboxBeginSelect ::tk::ListboxBeginSelect + tkListboxBeginToggle ::tk::ListboxBeginToggle + tkListboxCancel ::tk::ListboxCancel + tkListboxDataExtend ::tk::ListboxDataExtend + tkListboxExtendUpDown ::tk::ListboxExtendUpDown + tkListboxKeyAccel_Goto ::tk::ListboxKeyAccel_Goto + tkListboxKeyAccel_Key ::tk::ListboxKeyAccel_Key + tkListboxKeyAccel_Reset ::tk::ListboxKeyAccel_Reset + tkListboxKeyAccel_Set ::tk::ListboxKeyAccel_Set + tkListboxKeyAccel_Unset ::tk::ListboxKeyAccel_Unxet + tkListboxMotion ::tk::ListboxMotion + tkListboxSelectAll ::tk::ListboxSelectAll + tkListboxUpDown ::tk::ListboxUpDown + tkListboxBeginToggle ::tk::ListboxBeginToggle + tkMbButtonUp ::tk::MbButtonUp + tkMbEnter ::tk::MbEnter + tkMbLeave ::tk::MbLeave + tkMbMotion ::tk::MbMotion + tkMbPost ::tk::MbPost + tkMenuButtonDown ::tk::MenuButtonDown + tkMenuDownArrow ::tk::MenuDownArrow + tkMenuDup ::tk::MenuDup + tkMenuEscape ::tk::MenuEscape + tkMenuFind ::tk::MenuFind + tkMenuFindName ::tk::MenuFindName + tkMenuFirstEntry ::tk::MenuFirstEntry + tkMenuInvoke ::tk::MenuInvoke + tkMenuLeave ::tk::MenuLeave + tkMenuLeftArrow ::tk::MenuLeftArrow + tkMenuMotion ::tk::MenuMotion + tkMenuNextEntry ::tk::MenuNextEntry + tkMenuNextMenu ::tk::MenuNextMenu + tkMenuRightArrow ::tk::MenuRightArrow + tkMenuUnpost ::tk::MenuUnpost + tkMenuUpArrow ::tk::MenuUpArrow + tkMessageBox ::tk::MessageBox + tkMotifFDialog ::tk::MotifFDialog + tkMotifFDialog_ActivateDList ::tk::MotifFDialog_ActivateDList + tkMotifFDialog_ActivateFList ::tk::MotifFDialog_ActivateFList + tkMotifFDialog_ActivateFEnt ::tk::MotifFDialog_ActivateFEnt + tkMotifFDialog_ActivateSEnt ::tk::MotifFDialog_ActivateSEnt + tkMotifFDialog ::tk::MotifFDialog + tkMotifFDialog_BrowseDList ::tk::MotifFDialog_BrowseDList + tkMotifFDialog_BrowseFList ::tk::MotifFDialog_BrowseFList + tkMotifFDialog_BuildUI ::tk::MotifFDialog_BuildUI + tkMotifFDialog_CancelCmd ::tk::MotifFDialog_CancelCmd + tkMotifFDialog_Config ::tk::MotifFDialog_Config + tkMotifFDialog_Create ::tk::MotifFDialog_Create + tkMotifFDialog_FileTypes ::tk::MotifFDialog_FileTypes + tkMotifFDialog_FilterCmd ::tk::MotifFDialog_FilterCmd + tkMotifFDialog_InterpFilter ::tk::MotifFDialog_InterpFilter + tkMotifFDialog_LoadFiles ::tk::MotifFDialog_LoadFiles + tkMotifFDialog_MakeSList ::tk::MotifFDialog_MakeSList + tkMotifFDialog_OkCmd ::tk::MotifFDialog_OkCmd + tkMotifFDialog_SetFilter ::tk::MotifFDialog_SetFilter + tkMotifFDialog_SetListMode ::tk::MotifFDialog_SetListMode + tkMotifFDialog_Update ::tk::MotifFDialog_Update + tkPostOverPoint ::tk::PostOverPoint + tkRecolorTree ::tk::RecolorTree + tkRestoreOldGrab ::tk::RestoreOldGrab + tkSaveGrabInfo ::tk::SaveGrabInfo + tkScaleActivate ::tk::ScaleActivate + tkScaleButtonDown ::tk::ScaleButtonDown + tkScaleButton2Down ::tk::ScaleButton2Down + tkScaleControlPress ::tk::ScaleControlPress + tkScaleDrag ::tk::ScaleDrag + tkScaleEndDrag ::tk::ScaleEndDrag + tkScaleIncrement ::tk::ScaleIncrement + tkScreenChanged ::tk::ScreenChanged + tkScrollButtonDown ::tk::ScrollButtonDown + tkScrollButton2Down ::tk::ScrollButton2Down + tkScrollButtonDrag ::tk::ScrollButtonDrag + tkScrollButtonUp ::tk::ScrollButtonUp + tkScrollByPages ::tk::ScrollByPages + tkScrollByUnits ::tk::ScrollByUnits + tkScrollEndDrag ::tk::ScrollEndDrag + tkScrollSelect ::tk::ScrollSelect + tkScrollStartDrag ::tk::ScrollStartDrag + tkScrollTopBottom ::tk::ScrollTopBottom + tkScrollToPos ::tk::ScrollToPos + tkTabToWindow ::tk::TabToWindow + tkTearOffMenu ::tk::TearOffMenu + tkTextAutoScan ::tk::TextAutoScan + tkTextButton1 ::tk::TextButton1 + tkTextClosestGap ::tk::TextClosestGap + tkTextInsert ::tk::TextInsert + tkTextKeyExtend ::tk::TextKeyExtend + tkTextKeySelect ::tk::TextKeySelect + tkTextNextPara ::tk::TextNextPara + tkTextNextPos ::tk::TextNextPos + tkTextNextWord ::tk::TextNextWord + tkTextPaste ::tk::TextPaste + tkTextPrevPara ::tk::TextPrevPara + tkTextPrevPos ::tk::TextPrevPos + tkTextPrevWord ::tk::TextPrevWord + tkTextResetAnchor ::tk::TextResetAnchor + tkTextScrollPages ::tk::TextScrollPages + tkTextSelectTo ::tk::TextSelectTo + tkTextSetCursor ::tk::TextSetCursor + tkTextTranspose ::tk::TextTranspose + tkTextUpDownLine ::tk::TextUpDownLine + tkTraverseToMenu ::tk::TraverseToMenu + tkTraverseWithinMenu ::tk::TraverseWithinMenu + unsupported1 ::tk::unsupported::MacWindowStyle + } + + # Map from the old global names of Tk private variable to their + # new namespace-encapsulated names. + + variable PrivateVariables + array set PrivateVariables { + droped_to_start ::tk::mac::Droped_to_start + histNum ::tk::HistNum + stub_location ::tk::mac::Stub_location + tkFocusIn ::tk::FocusIn + tkFocusOut ::tk::FocusOut + tkPalette ::tk::Palette + tkPriv ::tk::Priv + tkPrivMsgBox ::tk::PrivMsgBox + } +} + +# ::tk::unsupported::ExposePrivateCommand -- +# +# Expose one of Tk's private commands to be visible under its +# old global name +# +# Arguments: +# cmd Global name by which the command was once known, +# or a glob-style pattern. +# +# Results: +# None. +# +# Side effects: +# The old command name in the global namespace is aliased to the +# new private name. + +proc ::tk::unsupported::ExposePrivateCommand {cmd} { + variable PrivateCommands + set cmds [array get PrivateCommands $cmd] + if {[llength $cmds] == 0} { + return -code error -errorcode {TK EXPOSE_PRIVATE_COMMAND} \ + "No compatibility support for \[$cmd]" + } + foreach {old new} $cmds { + namespace eval :: [list interp alias {} $old {}] $new + } +} + +# ::tk::unsupported::ExposePrivateVariable -- +# +# Expose one of Tk's private variables to be visible under its +# old global name +# +# Arguments: +# var Global name by which the variable was once known, +# or a glob-style pattern. +# +# Results: +# None. +# +# Side effects: +# The old variable name in the global namespace is aliased to the +# new private name. + +proc ::tk::unsupported::ExposePrivateVariable {var} { + variable PrivateVariables + set vars [array get PrivateVariables $var] + if {[llength $vars] == 0} { + return -code error -errorcode {TK EXPOSE_PRIVATE_VARIABLE} \ + "No compatibility support for \$$var" + } + namespace eval ::tk::mac {} + foreach {old new} $vars { + namespace eval :: [list upvar "#0" $new $old] + } +} diff --git a/env/tcl/tk8.6/xmfbox.tcl b/env/tcl/tk8.6/xmfbox.tcl new file mode 100644 index 0000000..14d2be5 --- /dev/null +++ b/env/tcl/tk8.6/xmfbox.tcl @@ -0,0 +1,989 @@ +# xmfbox.tcl -- +# +# Implements the "Motif" style file selection dialog for the +# Unix platform. This implementation is used only if the +# "::tk_strictMotif" flag is set. +# +# Copyright (c) 1996 Sun Microsystems, Inc. +# Copyright (c) 1998-2000 Scriptics Corporation +# +# See the file "license.terms" for information on usage and redistribution +# of this file, and for a DISCLAIMER OF ALL WARRANTIES. + +namespace eval ::tk::dialog {} +namespace eval ::tk::dialog::file {} + + +# ::tk::MotifFDialog -- +# +# Implements a file dialog similar to the standard Motif file +# selection box. +# +# Arguments: +# type "open" or "save" +# args Options parsed by the procedure. +# +# Results: +# When -multiple is set to 0, this returns the absolute pathname +# of the selected file. (NOTE: This is not the same as a single +# element list.) +# +# When -multiple is set to > 0, this returns a Tcl list of absolute +# pathnames. The argument for -multiple is ignored, but for consistency +# with Windows it defines the maximum amount of memory to allocate for +# the returned filenames. + +proc ::tk::MotifFDialog {type args} { + variable ::tk::Priv + set dataName __tk_filedialog + upvar ::tk::dialog::file::$dataName data + + set w [MotifFDialog_Create $dataName $type $args] + + # Set a grab and claim the focus too. + + ::tk::SetFocusGrab $w $data(sEnt) + $data(sEnt) selection range 0 end + + # Wait for the user to respond, then restore the focus and + # return the index of the selected button. Restore the focus + # before deleting the window, since otherwise the window manager + # may take the focus away so we can't redirect it. Finally, + # restore any grab that was in effect. + + vwait ::tk::Priv(selectFilePath) + set result $Priv(selectFilePath) + ::tk::RestoreFocusGrab $w $data(sEnt) withdraw + + return $result +} + +# ::tk::MotifFDialog_Create -- +# +# Creates the Motif file dialog (if it doesn't exist yet) and +# initialize the internal data structure associated with the +# dialog. +# +# This procedure is used by ::tk::MotifFDialog to create the +# dialog. It's also used by the test suite to test the Motif +# file dialog implementation. User code shouldn't call this +# procedure directly. +# +# Arguments: +# dataName Name of the global "data" array for the file dialog. +# type "Save" or "Open" +# argList Options parsed by the procedure. +# +# Results: +# Pathname of the file dialog. + +proc ::tk::MotifFDialog_Create {dataName type argList} { + upvar ::tk::dialog::file::$dataName data + + MotifFDialog_Config $dataName $type $argList + + if {$data(-parent) eq "."} { + set w .$dataName + } else { + set w $data(-parent).$dataName + } + + # (re)create the dialog box if necessary + # + if {![winfo exists $w]} { + MotifFDialog_BuildUI $w + } elseif {[winfo class $w] ne "TkMotifFDialog"} { + destroy $w + MotifFDialog_BuildUI $w + } else { + set data(fEnt) $w.top.f1.ent + set data(dList) $w.top.f2.a.l + set data(fList) $w.top.f2.b.l + set data(sEnt) $w.top.f3.ent + set data(okBtn) $w.bot.ok + set data(filterBtn) $w.bot.filter + set data(cancelBtn) $w.bot.cancel + } + MotifFDialog_SetListMode $w + + # Dialog boxes should be transient with respect to their parent, + # so that they will always stay on top of their parent window. However, + # some window managers will create the window as withdrawn if the parent + # window is withdrawn or iconified. Combined with the grab we put on the + # window, this can hang the entire application. Therefore we only make + # the dialog transient if the parent is viewable. + + if {[winfo viewable [winfo toplevel $data(-parent)]] } { + wm transient $w $data(-parent) + } + + MotifFDialog_FileTypes $w + MotifFDialog_Update $w + + # Withdraw the window, then update all the geometry information + # so we know how big it wants to be, then center the window in the + # display (Motif style) and de-iconify it. + + ::tk::PlaceWindow $w + wm title $w $data(-title) + + return $w +} + +# ::tk::MotifFDialog_FileTypes -- +# +# Checks the -filetypes option. If present this adds a list of radio- +# buttons to pick the file types from. +# +# Arguments: +# w Pathname of the tk_get*File dialogue. +# +# Results: +# none + +proc ::tk::MotifFDialog_FileTypes {w} { + upvar ::tk::dialog::file::[winfo name $w] data + + set f $w.top.f3.types + destroy $f + + # No file types: use "*" as the filter and display no radio-buttons + if {$data(-filetypes) eq ""} { + set data(filter) * + return + } + + # The filetypes radiobuttons + # set data(fileType) $data(-defaulttype) + # Default type to first entry + set initialTypeName [lindex $data(origfiletypes) 0 0] + if {$data(-typevariable) ne ""} { + upvar #0 $data(-typevariable) typeVariable + if {[info exists typeVariable]} { + set initialTypeName $typeVariable + } + } + set ix 0 + set data(fileType) 0 + foreach fltr $data(origfiletypes) { + set fname [lindex $fltr 0] + if {[string first $initialTypeName $fname] == 0} { + set data(fileType) $ix + break + } + incr ix + } + + MotifFDialog_SetFilter $w [lindex $data(-filetypes) $data(fileType)] + + #don't produce radiobuttons for only one filetype + if {[llength $data(-filetypes)] == 1} { + return + } + + frame $f + set cnt 0 + if {$data(-filetypes) ne {}} { + foreach type $data(-filetypes) { + set title [lindex $type 0] + set filter [lindex $type 1] + radiobutton $f.b$cnt \ + -text $title \ + -variable ::tk::dialog::file::[winfo name $w](fileType) \ + -value $cnt \ + -command [list tk::MotifFDialog_SetFilter $w $type] + pack $f.b$cnt -side left + incr cnt + } + } + $f.b$data(fileType) invoke + + pack $f -side bottom -fill both + + return +} + +# This proc gets called whenever data(filter) is set +# +proc ::tk::MotifFDialog_SetFilter {w type} { + upvar ::tk::dialog::file::[winfo name $w] data + variable ::tk::Priv + + set data(filter) [lindex $type 1] + set Priv(selectFileType) [lindex [lindex $type 0] 0] + + MotifFDialog_Update $w +} + +# ::tk::MotifFDialog_Config -- +# +# Iterates over the optional arguments to determine the option +# values for the Motif file dialog; gives default values to +# unspecified options. +# +# Arguments: +# dataName The name of the global variable in which +# data for the file dialog is stored. +# type "Save" or "Open" +# argList Options parsed by the procedure. + +proc ::tk::MotifFDialog_Config {dataName type argList} { + upvar ::tk::dialog::file::$dataName data + + set data(type) $type + + # 1: the configuration specs + # + set specs { + {-defaultextension "" "" ""} + {-filetypes "" "" ""} + {-initialdir "" "" ""} + {-initialfile "" "" ""} + {-parent "" "" "."} + {-title "" "" ""} + {-typevariable "" "" ""} + } + if {$type eq "open"} { + lappend specs {-multiple "" "" "0"} + } + if {$type eq "save"} { + lappend specs {-confirmoverwrite "" "" "1"} + } + + set data(-multiple) 0 + set data(-confirmoverwrite) 1 + # 2: default values depending on the type of the dialog + # + if {![info exists data(selectPath)]} { + # first time the dialog has been popped up + set data(selectPath) [pwd] + set data(selectFile) "" + } + + # 3: parse the arguments + # + tclParseConfigSpec ::tk::dialog::file::$dataName $specs "" $argList + + if {$data(-title) eq ""} { + if {$type eq "open"} { + if {$data(-multiple) != 0} { + set data(-title) "[mc {Open Multiple Files}]" + } else { + set data(-title) [mc "Open"] + } + } else { + set data(-title) [mc "Save As"] + } + } + + # 4: set the default directory and selection according to the -initial + # settings + # + if {$data(-initialdir) ne ""} { + if {[file isdirectory $data(-initialdir)]} { + set data(selectPath) [lindex [glob $data(-initialdir)] 0] + } else { + set data(selectPath) [pwd] + } + + # Convert the initialdir to an absolute path name. + + set old [pwd] + cd $data(selectPath) + set data(selectPath) [pwd] + cd $old + } + set data(selectFile) $data(-initialfile) + + # 5. Parse the -filetypes option. It is not used by the motif + # file dialog, but we check for validity of the value to make sure + # the application code also runs fine with the TK file dialog. + # + set data(origfiletypes) $data(-filetypes) + set data(-filetypes) [::tk::FDGetFileTypes $data(-filetypes)] + + if {![info exists data(filter)]} { + set data(filter) * + } + if {![winfo exists $data(-parent)]} { + return -code error -errorcode [list TK LOOKUP WINDOW $data(-parent)] \ + "bad window path name \"$data(-parent)\"" + } +} + +# ::tk::MotifFDialog_BuildUI -- +# +# Builds the UI components of the Motif file dialog. +# +# Arguments: +# w Pathname of the dialog to build. +# +# Results: +# None. + +proc ::tk::MotifFDialog_BuildUI {w} { + set dataName [lindex [split $w .] end] + upvar ::tk::dialog::file::$dataName data + + # Create the dialog toplevel and internal frames. + # + toplevel $w -class TkMotifFDialog + set top [frame $w.top -relief raised -bd 1] + set bot [frame $w.bot -relief raised -bd 1] + + pack $w.bot -side bottom -fill x + pack $w.top -side top -expand yes -fill both + + set f1 [frame $top.f1] + set f2 [frame $top.f2] + set f3 [frame $top.f3] + + pack $f1 -side top -fill x + pack $f3 -side bottom -fill x + pack $f2 -expand yes -fill both + + set f2a [frame $f2.a] + set f2b [frame $f2.b] + + grid $f2a -row 0 -column 0 -rowspan 1 -columnspan 1 -padx 4 -pady 4 \ + -sticky news + grid $f2b -row 0 -column 1 -rowspan 1 -columnspan 1 -padx 4 -pady 4 \ + -sticky news + grid rowconfigure $f2 0 -minsize 0 -weight 1 + grid columnconfigure $f2 0 -minsize 0 -weight 1 + grid columnconfigure $f2 1 -minsize 150 -weight 2 + + # The Filter box + # + bind [::tk::AmpWidget label $f1.lab -text [mc "Fil&ter:"] -anchor w] \ + <> [list focus $f1.ent] + entry $f1.ent + pack $f1.lab -side top -fill x -padx 6 -pady 4 + pack $f1.ent -side top -fill x -padx 4 -pady 0 + set data(fEnt) $f1.ent + + # The file and directory lists + # + set data(dList) [MotifFDialog_MakeSList $w $f2a \ + [mc "&Directory:"] DList] + set data(fList) [MotifFDialog_MakeSList $w $f2b \ + [mc "Fi&les:"] FList] + + # The Selection box + # + bind [::tk::AmpWidget label $f3.lab -text [mc "&Selection:"] -anchor w] \ + <> [list focus $f3.ent] + entry $f3.ent + pack $f3.lab -side top -fill x -padx 6 -pady 0 + pack $f3.ent -side top -fill x -padx 4 -pady 4 + set data(sEnt) $f3.ent + + # The buttons + # + set maxWidth [::tk::mcmaxamp &OK &Filter &Cancel] + set maxWidth [expr {$maxWidth<6?6:$maxWidth}] + set data(okBtn) [::tk::AmpWidget button $bot.ok -text [mc "&OK"] \ + -width $maxWidth \ + -command [list tk::MotifFDialog_OkCmd $w]] + set data(filterBtn) [::tk::AmpWidget button $bot.filter -text [mc "&Filter"] \ + -width $maxWidth \ + -command [list tk::MotifFDialog_FilterCmd $w]] + set data(cancelBtn) [::tk::AmpWidget button $bot.cancel -text [mc "&Cancel"] \ + -width $maxWidth \ + -command [list tk::MotifFDialog_CancelCmd $w]] + + pack $bot.ok $bot.filter $bot.cancel -padx 10 -pady 10 -expand yes \ + -side left + + # Create the bindings: + # + bind $w [list ::tk::AltKeyInDialog $w %A] + + bind $data(fEnt) [list tk::MotifFDialog_ActivateFEnt $w] + bind $data(sEnt) [list tk::MotifFDialog_ActivateSEnt $w] + bind $w [list tk::MotifFDialog_CancelCmd $w] + bind $w.bot {set ::tk::Priv(selectFilePath) {}} + + wm protocol $w WM_DELETE_WINDOW [list tk::MotifFDialog_CancelCmd $w] +} + +proc ::tk::MotifFDialog_SetListMode {w} { + upvar ::tk::dialog::file::[winfo name $w] data + + if {$data(-multiple) != 0} { + set selectmode extended + } else { + set selectmode browse + } + set f $w.top.f2.b + $f.l configure -selectmode $selectmode +} + +# ::tk::MotifFDialog_MakeSList -- +# +# Create a scrolled-listbox and set the keyboard accelerator +# bindings so that the list selection follows what the user +# types. +# +# Arguments: +# w Pathname of the dialog box. +# f Frame widget inside which to create the scrolled +# listbox. This frame widget already exists. +# label The string to display on top of the listbox. +# under Sets the -under option of the label. +# cmdPrefix Specifies procedures to call when the listbox is +# browsed or activated. + +proc ::tk::MotifFDialog_MakeSList {w f label cmdPrefix} { + bind [::tk::AmpWidget label $f.lab -text $label -anchor w] \ + <> [list focus $f.l] + listbox $f.l -width 12 -height 5 -exportselection 0\ + -xscrollcommand [list $f.h set] -yscrollcommand [list $f.v set] + scrollbar $f.v -orient vertical -takefocus 0 -command [list $f.l yview] + scrollbar $f.h -orient horizontal -takefocus 0 -command [list $f.l xview] + grid $f.lab -row 0 -column 0 -sticky news -rowspan 1 -columnspan 2 \ + -padx 2 -pady 2 + grid $f.l -row 1 -column 0 -rowspan 1 -columnspan 1 -sticky news + grid $f.v -row 1 -column 1 -rowspan 1 -columnspan 1 -sticky news + grid $f.h -row 2 -column 0 -rowspan 1 -columnspan 1 -sticky news + + grid rowconfigure $f 0 -weight 0 -minsize 0 + grid rowconfigure $f 1 -weight 1 -minsize 0 + grid columnconfigure $f 0 -weight 1 -minsize 0 + + # bindings for the listboxes + # + set list $f.l + bind $list <> [list tk::MotifFDialog_Browse$cmdPrefix $w] + bind $list \ + [list tk::MotifFDialog_Activate$cmdPrefix $w] + bind $list "tk::MotifFDialog_Browse$cmdPrefix [list $w]; \ + tk::MotifFDialog_Activate$cmdPrefix [list $w]" + + bindtags $list [list Listbox $list [winfo toplevel $list] all] + ListBoxKeyAccel_Set $list + + return $f.l +} + +# ::tk::MotifFDialog_InterpFilter -- +# +# Interpret the string in the filter entry into two components: +# the directory and the pattern. If the string is a relative +# pathname, give a warning to the user and restore the pattern +# to original. +# +# Arguments: +# w pathname of the dialog box. +# +# Results: +# A list of two elements. The first element is the directory +# specified # by the filter. The second element is the filter +# pattern itself. + +proc ::tk::MotifFDialog_InterpFilter {w} { + upvar ::tk::dialog::file::[winfo name $w] data + + set text [string trim [$data(fEnt) get]] + + # Perform tilde substitution + # + set badTilde 0 + if {[string index $text 0] eq "~"} { + set list [file split $text] + set tilde [lindex $list 0] + if {[catch {set tilde [glob $tilde]}]} { + set badTilde 1 + } else { + set text [eval file join [concat $tilde [lrange $list 1 end]]] + } + } + + # If the string is a relative pathname, combine it + # with the current selectPath. + + set relative 0 + if {[file pathtype $text] eq "relative"} { + set relative 1 + } elseif {$badTilde} { + set relative 1 + } + + if {$relative} { + tk_messageBox -icon warning -type ok \ + -message "\"$text\" must be an absolute pathname" + + $data(fEnt) delete 0 end + $data(fEnt) insert 0 [::tk::dialog::file::JoinFile $data(selectPath) \ + $data(filter)] + + return [list $data(selectPath) $data(filter)] + } + + set resolved [::tk::dialog::file::JoinFile [file dirname $text] [file tail $text]] + + if {[file isdirectory $resolved]} { + set dir $resolved + set fil $data(filter) + } else { + set dir [file dirname $resolved] + set fil [file tail $resolved] + } + + return [list $dir $fil] +} + +# ::tk::MotifFDialog_Update +# +# Load the files and synchronize the "filter" and "selection" fields +# boxes. +# +# Arguments: +# w pathname of the dialog box. +# +# Results: +# None. + +proc ::tk::MotifFDialog_Update {w} { + upvar ::tk::dialog::file::[winfo name $w] data + + $data(fEnt) delete 0 end + $data(fEnt) insert 0 \ + [::tk::dialog::file::JoinFile $data(selectPath) $data(filter)] + $data(sEnt) delete 0 end + $data(sEnt) insert 0 [::tk::dialog::file::JoinFile $data(selectPath) \ + $data(selectFile)] + + MotifFDialog_LoadFiles $w +} + +# ::tk::MotifFDialog_LoadFiles -- +# +# Loads the files and directories into the two listboxes according +# to the filter setting. +# +# Arguments: +# w pathname of the dialog box. +# +# Results: +# None. + +proc ::tk::MotifFDialog_LoadFiles {w} { + upvar ::tk::dialog::file::[winfo name $w] data + + $data(dList) delete 0 end + $data(fList) delete 0 end + + set appPWD [pwd] + if {[catch {cd $data(selectPath)}]} { + cd $appPWD + + $data(dList) insert end ".." + return + } + + # Make the dir and file lists + # + # For speed we only have one glob, which reduces the file system + # calls (good for slow NFS networks). + # + # We also do two smaller sorts (files + dirs) instead of one large sort, + # which gives a small speed increase. + # + set top 0 + set dlist "" + set flist "" + foreach f [glob -nocomplain .* *] { + if {[file isdir ./$f]} { + lappend dlist $f + } else { + foreach pat $data(filter) { + if {[string match $pat $f]} { + if {[string match .* $f]} { + incr top + } + lappend flist $f + break + } + } + } + } + eval [list $data(dList) insert end] [lsort -dictionary $dlist] + eval [list $data(fList) insert end] [lsort -dictionary $flist] + + # The user probably doesn't want to see the . files. We adjust the view + # so that the listbox displays all the non-dot files + $data(fList) yview $top + + cd $appPWD +} + +# ::tk::MotifFDialog_BrowseDList -- +# +# This procedure is called when the directory list is browsed +# (clicked-over) by the user. +# +# Arguments: +# w The pathname of the dialog box. +# +# Results: +# None. + +proc ::tk::MotifFDialog_BrowseDList {w} { + upvar ::tk::dialog::file::[winfo name $w] data + + focus $data(dList) + if {[$data(dList) curselection] eq ""} { + return + } + set subdir [$data(dList) get [$data(dList) curselection]] + if {$subdir eq ""} { + return + } + + $data(fList) selection clear 0 end + + set list [MotifFDialog_InterpFilter $w] + set data(filter) [lindex $list 1] + + switch -- $subdir { + . { + set newSpec [::tk::dialog::file::JoinFile $data(selectPath) $data(filter)] + } + .. { + set newSpec [::tk::dialog::file::JoinFile [file dirname $data(selectPath)] \ + $data(filter)] + } + default { + set newSpec [::tk::dialog::file::JoinFile [::tk::dialog::file::JoinFile \ + $data(selectPath) $subdir] $data(filter)] + } + } + + $data(fEnt) delete 0 end + $data(fEnt) insert 0 $newSpec +} + +# ::tk::MotifFDialog_ActivateDList -- +# +# This procedure is called when the directory list is activated +# (double-clicked) by the user. +# +# Arguments: +# w The pathname of the dialog box. +# +# Results: +# None. + +proc ::tk::MotifFDialog_ActivateDList {w} { + upvar ::tk::dialog::file::[winfo name $w] data + + if {[$data(dList) curselection] eq ""} { + return + } + set subdir [$data(dList) get [$data(dList) curselection]] + if {$subdir eq ""} { + return + } + + $data(fList) selection clear 0 end + + switch -- $subdir { + . { + set newDir $data(selectPath) + } + .. { + set newDir [file dirname $data(selectPath)] + } + default { + set newDir [::tk::dialog::file::JoinFile $data(selectPath) $subdir] + } + } + + set data(selectPath) $newDir + MotifFDialog_Update $w + + if {$subdir ne ".."} { + $data(dList) selection set 0 + $data(dList) activate 0 + } else { + $data(dList) selection set 1 + $data(dList) activate 1 + } +} + +# ::tk::MotifFDialog_BrowseFList -- +# +# This procedure is called when the file list is browsed +# (clicked-over) by the user. +# +# Arguments: +# w The pathname of the dialog box. +# +# Results: +# None. + +proc ::tk::MotifFDialog_BrowseFList {w} { + upvar ::tk::dialog::file::[winfo name $w] data + + focus $data(fList) + set data(selectFile) "" + foreach item [$data(fList) curselection] { + lappend data(selectFile) [$data(fList) get $item] + } + if {[llength $data(selectFile)] == 0} { + return + } + + $data(dList) selection clear 0 end + + $data(fEnt) delete 0 end + $data(fEnt) insert 0 [::tk::dialog::file::JoinFile $data(selectPath) \ + $data(filter)] + $data(fEnt) xview end + + # if it's a multiple selection box, just put in the filenames + # otherwise put in the full path as usual + $data(sEnt) delete 0 end + if {$data(-multiple) != 0} { + $data(sEnt) insert 0 $data(selectFile) + } else { + $data(sEnt) insert 0 [::tk::dialog::file::JoinFile $data(selectPath) \ + [lindex $data(selectFile) 0]] + } + $data(sEnt) xview end +} + +# ::tk::MotifFDialog_ActivateFList -- +# +# This procedure is called when the file list is activated +# (double-clicked) by the user. +# +# Arguments: +# w The pathname of the dialog box. +# +# Results: +# None. + +proc ::tk::MotifFDialog_ActivateFList {w} { + upvar ::tk::dialog::file::[winfo name $w] data + + if {[$data(fList) curselection] eq ""} { + return + } + set data(selectFile) [$data(fList) get [$data(fList) curselection]] + if {$data(selectFile) eq ""} { + return + } else { + MotifFDialog_ActivateSEnt $w + } +} + +# ::tk::MotifFDialog_ActivateFEnt -- +# +# This procedure is called when the user presses Return inside +# the "filter" entry. It updates the dialog according to the +# text inside the filter entry. +# +# Arguments: +# w The pathname of the dialog box. +# +# Results: +# None. + +proc ::tk::MotifFDialog_ActivateFEnt {w} { + upvar ::tk::dialog::file::[winfo name $w] data + + set list [MotifFDialog_InterpFilter $w] + set data(selectPath) [lindex $list 0] + set data(filter) [lindex $list 1] + + MotifFDialog_Update $w +} + +# ::tk::MotifFDialog_ActivateSEnt -- +# +# This procedure is called when the user presses Return inside +# the "selection" entry. It sets the ::tk::Priv(selectFilePath) +# variable so that the vwait loop in tk::MotifFDialog will be +# terminated. +# +# Arguments: +# w The pathname of the dialog box. +# +# Results: +# None. + +proc ::tk::MotifFDialog_ActivateSEnt {w} { + variable ::tk::Priv + upvar ::tk::dialog::file::[winfo name $w] data + + set selectFilePath [string trim [$data(sEnt) get]] + + if {$selectFilePath eq ""} { + MotifFDialog_FilterCmd $w + return + } + + if {$data(-multiple) == 0} { + set selectFilePath [list $selectFilePath] + } + + if {[file isdirectory [lindex $selectFilePath 0]]} { + set data(selectPath) [lindex [glob $selectFilePath] 0] + set data(selectFile) "" + MotifFDialog_Update $w + return + } + + set newFileList "" + foreach item $selectFilePath { + if {[file pathtype $item] ne "absolute"} { + set item [file join $data(selectPath) $item] + } elseif {![file exists [file dirname $item]]} { + tk_messageBox -icon warning -type ok \ + -message [mc {Directory "%1$s" does not exist.} \ + [file dirname $item]] + return + } + + if {![file exists $item]} { + if {$data(type) eq "open"} { + tk_messageBox -icon warning -type ok \ + -message [mc {File "%1$s" does not exist.} $item] + return + } + } elseif {$data(type) eq "save" && $data(-confirmoverwrite)} { + set message [format %s%s \ + [mc "File \"%1\$s\" already exists.\n\n" $selectFilePath] \ + [mc {Replace existing file?}]] + set answer [tk_messageBox -icon warning -type yesno \ + -message $message] + if {$answer eq "no"} { + return + } + } + + lappend newFileList $item + } + + # Return selected filter + if {[info exists data(-typevariable)] && $data(-typevariable) ne "" + && [info exists data(-filetypes)] && $data(-filetypes) ne ""} { + upvar #0 $data(-typevariable) typeVariable + set typeVariable [lindex $data(origfiletypes) $data(fileType) 0] + } + + if {$data(-multiple) != 0} { + set Priv(selectFilePath) $newFileList + } else { + set Priv(selectFilePath) [lindex $newFileList 0] + } + + # Set selectFile and selectPath to first item in list + set Priv(selectFile) [file tail [lindex $newFileList 0]] + set Priv(selectPath) [file dirname [lindex $newFileList 0]] +} + + +proc ::tk::MotifFDialog_OkCmd {w} { + upvar ::tk::dialog::file::[winfo name $w] data + + MotifFDialog_ActivateSEnt $w +} + +proc ::tk::MotifFDialog_FilterCmd {w} { + upvar ::tk::dialog::file::[winfo name $w] data + + MotifFDialog_ActivateFEnt $w +} + +proc ::tk::MotifFDialog_CancelCmd {w} { + variable ::tk::Priv + + set Priv(selectFilePath) "" + set Priv(selectFile) "" + set Priv(selectPath) "" +} + +proc ::tk::ListBoxKeyAccel_Set {w} { + bind Listbox "" + bind $w [list tk::ListBoxKeyAccel_Unset $w] + bind $w [list tk::ListBoxKeyAccel_Key $w %A] +} + +proc ::tk::ListBoxKeyAccel_Unset {w} { + variable ::tk::Priv + + catch {after cancel $Priv(lbAccel,$w,afterId)} + unset -nocomplain Priv(lbAccel,$w) Priv(lbAccel,$w,afterId) +} + +# ::tk::ListBoxKeyAccel_Key-- +# +# This procedure maintains a list of recently entered keystrokes +# over a listbox widget. It arranges an idle event to move the +# selection of the listbox to the entry that begins with the +# keystrokes. +# +# Arguments: +# w The pathname of the listbox. +# key The key which the user just pressed. +# +# Results: +# None. + +proc ::tk::ListBoxKeyAccel_Key {w key} { + variable ::tk::Priv + + if { $key eq "" } { + return + } + append Priv(lbAccel,$w) $key + ListBoxKeyAccel_Goto $w $Priv(lbAccel,$w) + catch { + after cancel $Priv(lbAccel,$w,afterId) + } + set Priv(lbAccel,$w,afterId) [after 500 \ + [list tk::ListBoxKeyAccel_Reset $w]] +} + +proc ::tk::ListBoxKeyAccel_Goto {w string} { + variable ::tk::Priv + + set string [string tolower $string] + set end [$w index end] + set theIndex -1 + + for {set i 0} {$i < $end} {incr i} { + set item [string tolower [$w get $i]] + if {[string compare $string $item] >= 0} { + set theIndex $i + } + if {[string compare $string $item] <= 0} { + set theIndex $i + break + } + } + + if {$theIndex >= 0} { + $w selection clear 0 end + $w selection set $theIndex $theIndex + $w activate $theIndex + $w see $theIndex + event generate $w <> + } +} + +proc ::tk::ListBoxKeyAccel_Reset {w} { + variable ::tk::Priv + + unset -nocomplain Priv(lbAccel,$w) +} + +proc ::tk_getFileType {} { + variable ::tk::Priv + + return $Priv(selectFileType) +} + diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..54b3b4a --- /dev/null +++ b/requirements.txt @@ -0,0 +1,7 @@ +Click==7.0 +Flask==1.1.1 +gunicorn==20.0.4 +itsdangerous==1.1.0 +Jinja2==2.10.3 +MarkupSafe==1.1.1 +Werkzeug==0.16.0 diff --git a/runtime.txt b/runtime.txt new file mode 100644 index 0000000..73b1cf8 --- /dev/null +++ b/runtime.txt @@ -0,0 +1 @@ +python-3.8.0 diff --git a/templates/index.html b/templates/index.html new file mode 100644 index 0000000..ddc1cf0 --- /dev/null +++ b/templates/index.html @@ -0,0 +1,15 @@ +{% extends "layout.html" %} + +{% block title %} + Index +{% endblock %} + +{% block main %} +

    This is a website dedicated to making the lives of calculus students easier, if ever so slightly.

    +

    All function inputs will be taken assuming 'x' as your variable. All other letters will be treated as constants

    +

    That noted, you may enter terms for well known constants and they will likely be accounted for

    +

    As an example you could enter the function $sin(\pi x)$ with the notation sin(pi*x)

    +

    As a once struggling calculus student, I highly recommend this site be used either to check your work or as a tool + to understand the steps behind those problems which you failed in solving alone

    +

    Good luck!

    +{% endblock %} diff --git a/templates/layout.html b/templates/layout.html new file mode 100644 index 0000000..84b351f --- /dev/null +++ b/templates/layout.html @@ -0,0 +1,84 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + ` + + + + C$50 Math: {% block title %}{% endblock %} + + + + + +
    + + {% if get_flashed_messages() %} +
    + +
    + {% endif %} + +
    + {% block main %}{% endblock %} +
    + +
    + Huge thanks to the staff at Harvard's CS50. +
    + + + +

    4zqIdUq6uueoe-iDcS-QT!csM$hZcIW-?8- z6%B|*PAx~+DjNrVyE9k&E9kuK=F>mJ9eo2Djk?xz;o&m0;?LM!O1QoqKw4!D8mru= z=~&SHywW}7{Aj)T3PqX+ac7#lUewV!HR9kOK#Oj7@79z-7CZ_bD`V$oBcsKv_M_2k z?yCpG3s}V==c}gqyIM5Ob^A;rb|;fa>(Sgl(5|V`<_-yfpI{1XbKz?!_wAHaxwvAB zQW2o;O%&)MT%u`dyP)Tds^KS)y!213%S^KE(u+OlJvajlCKF6xWe}%eQ@Ms)5a)P} zJn1%)sIl{PA{$MOmOC2QTcH(@p`|!f))FzvX(QDAIL9HD-B^T!9ICnxEE?9e@$?Nj zFCSs`I9=3Ebx`q}8DVd6*pMqKPBj<&bbmr3WOX(PB-~;NyBg{kA1DU`!da*hhyYmv z@r2%qK4>4aIT-mW9bNPm;`IDqWEzf#C9L$Jv>6`&to%3T1#86?yTrz4n#EZWku5O} z1>Lt0G1rKIg*~J)I$<}PAsC%@z$`?OOQ*yZd9$2P59pB&@lSBK3Tsp<7#{?Wuyd`1 zL;=31dLDR!^{ap#dyLw&AbZ}lrWQ`tEN!O*B+?iso2?V#jRnjz^Sy-m{ySf=|?^?A$G z&730I1t!mrYJZYbm=V9M0;1wi9SX_|5B3hVt*g<7-k!`5Zl)21;k5Z+_K7``+lER4 zwI}_nGe42jlt}r7NLk++aiBxC7h6|FEqB`2PK6i*j*50)K_rxD?)ir3wmT}_zngbN z-$^eWGhf7hAh9s^H$@7$cS=LGIZKXi@0{x;O~MuaLbFctrAEaO&Q+vA!ACF5bMBRc zNKgk5M(+cn=1b+{K+>u5EwUsp$Ei6%9urv=?tF4i00}H9BK*OKN(qiDSSW4QoazmV z3q&*WhWS1Y_xNpUV1RnkRdc@8+^WfYHTen6eoy}@{k+S}{(FofHqd~zIbjJi44z?gkcyJ82yC0tw>;{R)C8#zhq(FvN;v*Zxm%! zxKH#K;u6y+mmZfyIJH1+ulN#g^`}+q>i;ds>fic(Z}qQe)``Zavi95f3P>J|h`;70 zGl_ihQD&(e31P{GB^fZXlzju7Cvwh_AI<}b=IRHw@DC|$^8aB3h~ZSy)bqkPSv`fq z^3@*$%Num%gwTb%nHj6?d0Zi zEL*w2<7sf37CvhBKC$@WPx=pf*tMses1p+7R10q^@tmUho#?!5>aTjpSLwe~Eu@LB zY9}Jg=ad$T{p=q_1KkqETh;?g0wc)cUhb_!{Cwq^lsg-jC&QB95XzpVn0XHv(s-y4 z!EJN?a!3%*q42=gO(k(jlH&=mDrk&Y0{ZsGC2~AbXx#3WG;U9b=$g|RTBG^x6-oPq zcwsV;78+9>Kw{eU>0!ua?iuo&4r;m!z?xKDAm0*gWDc2&j{?wld3cA1S@M82E)8|%g*Hg9 z|GG-3c;?d8RM7OW^sUi6?xp?O(*0kkY-S|@?BSOeSYkxR0SNN!tavl-PU;EYGIwtH z#9Nxh?NDia0`OLnw+n-7dZZhJkOR6mSHhA`EBtzWAudtt`rhWl+|Va zZ{j)Q-LjQmMGg%M-|T%$=00*%?r&{w(CNJJxvg?@eTKi^YyL3=T-Tb9*u39H4lNFM z3r6a`6Hv!K|E>{Wivz=1&GX^$y2&^P5?_TEoB9l8)(vJ!t-@EFRT^=Y9PIjnWPP4397`eol&gk;R)0d9`A~ z3lx*lKBM6VoxA7rMTRUmDTf{t8qp$8 z_WVL@WFX6$w>4X5^RIORhCS$gxqDur|Lb*yAua~lQuX)JuipxsxFZmGA6Q!-2xjew zX9wL21=g~idxRnIyX*Xa0odyQ;v1W7;jGQK@t%_0uRaN9;}0n`+<5>vb87Hz)?)qY zQzd}RRwXQC-uV@`01j)@j%YwD78ctq|3x9^xjF#8(+F&sTOx<&IW=D~kF81r-mRLn z;C(0HeRNyL&)u@E#ZHaz0Ik|e9MzWH9(S@mRxBKORPOxpevM^gxO_mi()eWFmMzT= z_p5Zr=i$GbK*{%tF>kZ8yww*GF4japf{8ZvtaW5SM&;;%_-{y}>oBW<{-UIO)BJ9s zM00Sef4~<2ZS;E(j05A6$lIxYT+)H0gDV9X`3Kkc|M(Fwy68F}j>7kP@*qI?-E=A1 zAU#QBn5@S|$X?tv;C5Dgj9{T`Z2a1A|A4CjD((+})}dyUXdxFw#$|-Y1^63oPlp4w zoCe5DS@}z?D-yeLs-Q@#6+#KO&G@A{orduG0Odq;*MbyCWi?xz>dA6^6B^;v_~ps= zD|RN&NgbQupp~Dj(Xr-a_J^`d1SKm!2av+^m}SJNGR#%(p)&UiB>A7+AsavTe3cZ6 z3a|O>z05~6|EKTt;X|Xj;|U?GmQ&eId1m}UKAGhy_k-|B(LfvQPQ7JQH&FC^>NFEy zIGBhDv+eih0Ajk;%q`MweD`fq6ZBPE{7lcMId|j5m7crNjPY_$NaoJ%e^<8*^RkzJ zNP2#W7uLbc-z}BD46}f_&&&UT$aG4JU~a=be?76V%Bc~8CfcF47#Ja-&OLib za3>aWxr=|DY2%OVZTGvvQ1_!~+BTtSQv!1P8?p=NeiVTWkn^19vOB~b33tHr>g)^R zS#I_ZB8LhW76hNqAj}e7<({}-ub(e>?F36+TgrW->!br)b}8Wz5YBC-DL=%TuI7)Y$L^l*)O#6Yiju zl^X<@RE2PrDlpUZ2*l<97iX9s;8~vR-*zAd#?$<1}V<51jV9tNN93FI1cNOrRYL1D6|1(9E*JKvI49ZcRv{T(t3GNDl z5WS#6TKpts+;@pG-u=wn$<6IanSoH;Amvxh(;o{fYyJtc zp}3vSJJk{;sbY4ur(uWTt#qx{jkaXB4dGY|_XY@n4rJGdPu2Zz+T%|mZT(T&0-&rE zyUYCkK^a^Kr%X&0fT1-uAVOnom^vaD8PY#9+%bsi+lO9WEe-qOf01;03)bX29e6e3tmhW#{j>8m??g4HFiV*NE0)O&72<{&<+IIWXg$A z${1?K2^2*0FP_s)lZSc9yJTq5GZ)60L1q&;dN*_e$n?##VU5H)4uA9S$EAk5JHSd) z!=bRaLo}IBh#<;*og~F_CM7KbBg?QOmf&LNS}n0<9%{ik<#w{sMXf*gIo-!~Sgpddve0h^I1J z8PR0*7JRU2RV1+jAcneQlqg?Ode+G#@IHcPfh!69UZhIdFHu;@*gI=|vf|kP_c2$| zoHF?#Qy})WXb0R+V-v}Q&J2GRh@4o4Fo_HsFRHKCWXtUVB!#NLz8=p4B0h2|pUh%s zd=R4n9LU5yla}<<-a7d$#mD>NH~X+%G}uL{q@l{uC>P+AI(bK5ii(&rkO*GcB}BcD zr$RaK_mdqeSN0Y245~#;ui_3lRSYMduQ}&E==W|bCd?AOg~e}jiYae;FnZ&!AkU9T z$0FAaXF4kT@Gua`KlcfG#&b`WtB&73q~+Wn0%mZ1$H|1OJ*^x1@90{zavv#-kpxrf{UnyViZ)He#=&8#XxEd(Jdd& zf!-Aa*8%}g*De7=l>>#AjIi_UR!$PAC^VmNN?$Qx8l_6p7{r#!b`sr7Qoo83kv%{x z2ZK6C)lJ=GX&@V*L?K7!A)ql`E!x@#!#ZvDPaFEi6 zq?~6oJTSq9WVsI_;O+>VB1Y-Y77{7>_B>PyVp=`>dcppRB-gNCMW$>p<7%L-bg;Hh z{13psd%UNi;2-~Pzvkwz`E>N<>w=^CfXzuNzCCCkAO+&`Yt$R}Z;os(O0C0`} z)y7FKrZBiyLM9Js2qY%R)zz&GMWT9FruM4(q@KX~*b}p;M$Q?x9b>9keka&=inDGqr73fAv^%5aIaE_=c z_nYorMB&91Ebn6|i@&EZlvgI0LD&^y0)W841TQGbMLH5JEl9D_HJoAEys{8lsu)SQ zZ;#1}-qXK|EMlA}#g&77{~JwUbAf1=f@o{?G`@$36k~yiwwazo#9WWp>$QS=pr<=H zU@x7cv)x1~&}a&n4>C;fj8l>CGDCL-A}`qbIXy`3&^gH?zKy2WNcsU?>K2IJ$SkmL zwwmiyQ?d9&wG5^XITF3qf2ADuusI*l8YTN#ntjo0UW>7OdO(AZWbiM1Qjoh;f}`8c zKUMIW>Kb+lkNX{S68}ZeZCf>JSxD|ByMk}=_c1Bl)2v$q9@-1aYAF>3I2>w~O?L|= zX`zoTP)Lfbm04#tjSZ+5CU7k)>R=E5!L@8aPHr&dV1;l5^rq2t8$oX=^X%P0pXb22<~RF zaA+VwuhpFyWAaw>$$Eqdky%?B?Y-dFBaX6b+kNbI;hv9unV~ZIbFTau6!|6-=FQD* zgm-|$2+e1`I?MY=eLsVDbN*J7kWkSKf6%&$L=suQ$e7D*U9f!sqaaPGY+L*(y5DKEF4w7xS+1Yll(Za{rg!;O z|5KTeLQXguy_{X-)-+SMj>GVH<#fZ{;EZpgY@)5G>{!XQKKctzo#*sZikMTx2lKdloY%ere5TsW_i+7hRUl1TRZ2n^PT^vZ>H~jBUGrp zfwtkHgNG|-?+r%2&0M}9dRroT!<4e<;x<^63oD~Tih|L~B6Afju$AV5`Ys91hL!1F z3qS><-M5oF4U|vj~ z)0ib#XP$uEBIeCrCdPI3;`*H2FDaiPPrY6mxuXCz%i#bzU)8U_?bO^UQxUyjk!*MW zYSEckVR@i3@Rbg$-hYU3)w}Z`zEMDY;21I|*z+3EAnKu`?X0NFE?R@>th;!cbV+uvtUg_8m@0svJkVuH09m>I02P_(&n3qiI#=Pt8)s0O zv*-XCkQ^gBOUF2Eri?M1TZ!2_=+4NC38x^qs%5P9h;>}EYr(!0geCecr{C zyzG;`7>dNYg|3sQi*=t3ZU{|~w=?9=sa*KvR4-(H6em0BTWz*vsh3-pdde&1)J$Y@qW*Rofmkp#vb8t- zIsV9~%-{AFs;!(xUY*}nzS}|Yz^h!4%c=qgD zy4(45bIXdE$X#==w|4`ppT!&Bhx6U6C(&Zp)P8EES+lsv+*}~aD!e7$WMbiI1VNy8 z`jpL{L?Uv&k{Hy^y?^4Ncz;E75#;s>PwHQa5C@pq<7JU01#N)aKy+SFz$rgaTqg<6 z19cVdErp&UIvAZ^WIhxJEZtXvq(t$H-)W(g6v{PB!dUSY)|RiLgz-m~l@f0KBH4(j z))C!v%r zdi;^6fO}OTM<*ZA$DL+tPj7zI6;iQO(cETD-rK3ll0BIgB9|TA73i z{GjPtUzAkBn~Nm)6R7oOH2zFY7WzuGQMRcQ1Cjcv0ljjYfT*7>U9(1xFU}dA6$a%= zjWQv)Z2XSaDv-HGRMZlQF|iQ?TQIV@<%$GLK5_234%JEu-~QZcjauuxEZ^+$U$pU! z9+SI}<3UDDP?iXVX5hzGxJKiCGnzT0+k|t#QxL>T?O_|y&}}o52q75HUnAG`N|rtl zcu9W!30aNZGVD(7q`cY*+?v+CcETAVH(RDSB~n|wFWfsYCG1g($q|EO1t^S4&X9=< zP2+El2*2%ET%m%(E`gV^ELlWdXeNx8GeS}(e5yrpr9x=9g$+_Godeb?(KxZ1vnF#N zCHIG}kMC}l$LB#=7jZezyh3Z+m1|X)pxNhvIeVI|7pL&-nBqNLJG^{Yg)aUiJVCe! zr+Y16!q0XyP>2B??-s0Wo2chnJfB=a3}2oig^X6_fJH5>@VG`yL`nWwr5WbKJC`ZE zqVWH)iw}!S7d5BkjS1b6)$(6wzM2pXUub$;UqB zECN0;12Q66ZQ^vg$$Wdh#VhCx+PYbhx;6pSf^zwFd203Ek}S4t*GN{DjCyLI)~AFv zxmLhoO9Ay*x~ZhE11oq(9)6m_i~&An?ls-j0TVHAqeXL0wM=Hv?NKhC_80Xp2gTRaY+GmDcR(q|8 zG~3PL_5$!)SC_~pLP~F(S~9<2>9c94f?4L&=>+!K+!V`sh0@34=-|)@A7Ia0Sba-4 zAVE2An%#oa1op&CgI~3k)rx=yp)kc;fD5Lk&SU@)F|i;D_Yj_tLT43IWbl@HSY94< z&}ddBt9|TP)gs8pAETn|@IpK1IDFMsk<(1qxs>Wcw{jnO3%<6|%w(^C1E&iTrxnE< zjg?9A9zrLqjc41&Lqo++TvSjZRoDT+)yGa#mNs|CAmuS4H^O6Fbyb?=hy_Nl81uXo zeYorZz31m>-DVPg3RMXHCQ%0rJ>-8ubT$5i-zu~m3e0XWH(eleBw|eHa*JTk$63=N z*C8O+ZQvzi+UP)(Fr4Yu17HtnC0zQ`P*Ho)Ha6G!Z23+x5lo)zuRA{1pY=DvzzD)A z3|uPU(Q*JuBfak3W6`9$Dx`x-U&IF)A~~V3%y}8JT|*?+IW$x_;J%T=d7*rGv!9-( z^EPb`^ETj07`Clz!L=FjPHVy8$dA@&=eBDW3TdG;O;7At^xEkPY~^dR!b^D;T}F z$c$41j-VTSX=QmL%Y_SDQfJHj|rKvXFBH66XmdifCEtd0QY?!nMT8=p;Nt>~0~Rt@MUTH!iE6c?ih#zia^$ zPO67M<(sLU8=B^iu1JhtQn382=t5{>5^IeF|AA}0kqvWENN<|@kUuNoKbTOcEZgcU zSyHeRvn`r4Jk>4HzPfYsAkv{RlDxGn)z@R|6A1_p| zm4#`oNYt0~Rvv%68Q3mP`{oI=cgtr1voTtI9r!1<0E9F42B!v{m-Z_<{yT{m63wnE zi=Ovwd307L@lX1%L$T+Ut@BkaYBN9FuH4B{gak&8SRa2nY z!m<-hYyxg+h{W0kW^P`-IDA*|}pnOPjaJC@K7K7Y`w_nmV zU>#Zf(J5^Lvl;(nP-gZI&x>})kkMq~zxBHQu+}~e)yrm23@dUg294#c#UPm1?b2bH zKk{jIFtH(6i}ilx{zoWX0mYtMQSwox`<-8;$_(e8N~J4FwPleRNvAxt zKO!B1uCu)eok;7k8KQJ|bIbcHQvLC@Al27qB#F^1K>_UkV!EX9=rPNk)0en^b>Bx~x`P@#CRZ?vw)af$8yZaz_DVNhG}Rg#i~mu*A(aU>^=a?&a_YKf5Is&%83Rlg3tqo5d-iHLUz++VFe| zY5W`7@O!Z2|4JL)VE-Q*e3VIpljWCZ8um??uKM3%c zv=|>l*L#r|RFfk29b6rRXij; zqlM#^y1&wj*|)Qw_NnB}jeHe-f1@XXfDCb{i%$Fwaol}-UA#{gdvv;PJM-Z$Ap{>|=M=BAx~%E$IVJ0znsfC_MbrIgBX1jrBl!HV_VAzgJZUcf}X*#{@f&nbgCbf%FiM zYQ-*=ZT%^WLA**ow`3-w=N&28y1YabQ!R9L+stQBFptXIgztqv>l3YRc0*-tS(A_Q z(eX!0%+ifqMk*jJs9u>vi{}sjOjkZMQrzH~0?XMol~;cqLNc%_FVp`J(Nwx5$*6fF zjm4RohS%#BEpWuLU58&ps6BKT~nGW2%h-yRp zSRxW(Oo|k5d0v{2=h1;h1#QGTNt!90H)nKSIL?Iu@MJ09J&$JrIdWTogt@|p5C^-x zETZx$sGMP7>;^G+lo9jAYP*Msj%|eCgfq%kWhmfmGgFELlot0(dT?`?m!sh7bz~_* z8W&R^k4rzm3W$6cN&JKgZpLbf%8LSP{$T$Ns+0~MQf=blijoHBuFVV)bz%^cV%83G ztzJjHTQS@p`63kZnIZcVQ=N=-(8?SCo*UP$R)Z*Qqlgq=L+KJgnyg6FQX1?2;zu^fS7>HVzA@ANj z3(^ivG5?%<^{@L37yFM>F7}ltejSW_WWc3?imZe2>K#6`@dxMH+2wmNy+}Dh~%wZHtf*id2(-b ztHC;Vex(^!Agcc}Q^C=R(=bjdoUtp7#2{^~V7Wq_{# z_}1&MJ?e#m3wUUX#eG#{GM0&>oZPSX zWuP_>Fy+!XDgOcJHs9}Er~*w)4fx>Z*8(Mt+>Q%; zRE;TI*qb=5Z3tNe#sw-QPU|{78WAYj8GesH-U;i$@8STKW&ZrB`1{C&<8~Uyt1G6? z{)8#mlmQk;5_r>Wz3J1$oXur@GEak@%YSr6cWBubxydL4jR|O8w?dOSyh)fc5j8}k zko)xa@lurASGMpFziv~zCDvVT6BR8(5;8YnmqvpFWj>!OC9G4aK-zh4t7JOg76%h> zkGwu_Gt*E!i6b|h*92c&<7iy0G+lI)Ur^3UG64ZHv6>X>rQNOg`NA^J&$sX?i8P_k z`mp@;9mRXf`AUoBUg1;=Z7#3g5h|9GnFAvK%0iJCJ&!vdx6UsZH9j-k4O6&7)2Hu< z{Z_I{SAf6RPk0$SFm&_SexV!2ULKk?c1h@pu|=UvDw%{XW3LSP#x4tGk3B7%6HGM5 zw~akT824BB7`|p~-%#(dWB9l%d@(do8oz^a{E>0QidA6%U3v`<&&)u{#`$}zMx7Jh z6CV;x)W`3Vo)P0oI+rJ%>qzI?{Z(8C;y#VG6?C_ht-_{q0VlY61WMkR|0`U8V_hwm zb)vNJnr!!I&MrttY$MOo-%cbr%-^C-Nl8WzI{)874R<$Hh2-7)i|M9AhMLd#Edauhv#Gq*YlD z8S3(?QDed*Q%px_J?iKoTnb2`2q_k@EvTz9s$3SA8 zX!ryn*LLO_r=&WEo+}T!9ojB{QYFpSW=b7B5Nq<8gtg3yMgk&E$3@5}@QI>buDOlwLqW;9W zOA9dC==JPdZZgy8UEV@G;}`Xt+^8TZVx~CcTE_o4dZZ-ZSy}YZyB{%Tg-61l_THE(t^>UhdM@ zfC+hmm27Wz>=4=!@2CWCm-&oWT~(=i@orpUP^7N~hUs0JDUN>jX zXKlOy{8NRVS#=M(vFUUfsXy)kUmcEx`5aa8@7LSBR~RV*TV#&o#Ns*5K___f4BnR&iaux|h|fn`XUw zY1XR)=TUNUD&{>t62aMQ1gPj?PI899QFx_Bvwwy{ypFAXFn~xgey48g*j2*2URVH{ zf}jWiu;EuKqG$XpxbCB@%IMX;%E7UUTB~4@LsBCuqs!q<%F&yg(bjpnb0l_(Q!Syc zR>nT2>x}*|j%Hu*2x2K&zii~336ZhwdW27l)T4gD@xD_P&HxRfNXi+3L@OE#3B3rD zJQYWvsiG*HT$?=v6;u`&Ddkr+)x0@ebR0qvoa$0a#Is-=0`39^2tZHqncOp*l^}h{ z0BX`hX4|E)g0roAWLrLbRmv(JJ~gSEcyo{ z8+`6`+-mIClDC)jt^hzr#9~q=nzL?_&=)MyO|b__aqA`8QYiF9MOiREWpWAxNvKJVT~tarf3NIhzvK94I>>@+Wo2-O_w^ zSO}{g1!(qq@^qly7~XzTFsN<+EYC2@ z(k~r!K=l`_>O3S*d$(ArbJ{!u=bp$v``xUJNFi7Y(x0fS8k?m(K`%xG!9Z5M1cm^a z;a;-JR~0+&>viujmQv?|O~@TpB_qN`X3qDyNd6EL)}Q+~i18E|Ma&4k;za?;+3@2} z60u)VhuKsk`P5UTiY(m|`7e06cL0w+;beMzDa9znkGc^~3Yr}b^sL^cbj zAKhe!g~HE8Br0>BL#eT^ysxjUZ|BOso%&bwZ9o3&?EABv>Iif4{Cn&^d`~k%ITC50 z)E^!HQqB5M5x@V(??8V4#BUzI&)2LE7y7N2fwNh>@(|7Zo2^)tsE70H7Jrsdt)XFB zUy*<9k!}Kaxu5ws7aGmUt6|u3lkd4(dLGP2D0@>z8M(m%-?HwI@(AHkpQG6bNl_!o;o$ z)Q&>HmADZyLp`6rf+yWg&TidJx`y`t1wT1z+lHpC!r^6S^_GxRb+~H&i3rTAxD+HK z{5jYI?LM2N(G0ke3j!`=T1GPt*lh7f7`HW%i2XxRU6ayYP2IrlWbvYO&Q2?6Pf&H? z?9y`fv-=G)Yes4^LPQ`r<(JiT?9woHM2OL*fy+ z5NhX^%4qwFH+QtWs_(;9EW03iQs!}h9v%;eEg14r*`SL?UsmAUyMQc#NCi=eE22>i z@i2Q+MYN_tl9kBg-2uHpG!W(`AO%Or(^PpX3PfvmOHQ5(O(sGQ#HB`Hj4hd4R`Oe^ z#;Mt$Yrwh8GFMZCD;qAyX9K!r%Uo@^B5R%SKh)0EeBxkV1Y=Z~VeV~UMuQULtQbor z==5RRB*PH*w;$=7@te8{cD*Ot+iUcW=*Re2-bA zz`hZ5sLaLv8k0>7UA*Jm_cr5lsvG#rd;1mhL)VEzgt~E)khT0g{$__HQbkT^fOGGU zr5=>{&b{63laJ#S(pofU&p3q8&h~lWxjd`dB${)5|8^O%uW5ihGbPVH`&=*2@7jht zgwCPXj-kQ)?G)=X>P&KKq;@O$sig zx)YrHHu2aY0}M|l7-j*-_H_TNc{GId%Lgpjy#E~aJAgzzQ89;VoBR&)9_fT z#7R=5#jWOf-I}4T)&V)bN0g;K7`+ejqy8LQ&DlfMPw)?N`nLyFYRLS(gHNNmpf#TmmCe5RD-1LJz8p~FD9fg_;Qij>oTwpAzI1ejsMxG@&Ktp_ZT%gw z7Eia8Ux{#-XT-Kf1~4rKkk&Z|+nmJ}?&Kno1BCYD^@~%k%CU^0eV}CBa#@&f&(ww4 zc<96oGxY%tVwlcM;a?5Q;SHP#)nnR(#dG!ieS0d1Q$hSim>Iz=Tg(~lbOxYllM6)L z+GYA_O1MoiI=lFzt$5PNH(3DW>a)4D^c#ThF&==sI_mvD9ueuydlWC;!w7q58=|S) z-d5YlQKgvBn^7%Tz_hv5Bl57;`PWgKc_3L;7m*4&IBB)CsGzxzg47H2jC3Iarr`c7 z^_1-lap&S7?QD*vXDu6F;hv>Fh2UZHBmhNk13|c z&|2CO)YLFIX=>5=|cr8raRS{wjX&kXnWDc zsa{~8x;oWU>{Bl5+w)p!d=Cp|XJ8rC z#;auBB)wi2@=*8C1Ryg%l<(Yokxl98+xel7rv?!ofS$!je+Mqtw8% z&i>-WjMz%@xu}O(yd%v;=57ErXc4hjP-F&0;%Jz)!nYqxe*KGn&5f;0COm2riZYT3 zKd|K!BPj2BGcinK9XQqV&q zJ|H7Ru{g?ll!48U=XW8oISM5xfAmrxLGPf3kRA9CJ;Fv*XBd&q!IE{$MtgKU&ks93 zT;U>2w3GM%LQeUF!qofXuu{2u4``SAvNg=L_aM*iNkfLsJ%Y$srKbc1Z>ELKimKa` zA4(+I0>|Tr`obD1#nS)?kJ~+?tPm8g>G-TrGKP|fAw;n7bXhov<_@RB_EHpP@(yOw z{C0@WVMH%nYlXKhotD#ApQBH;7j1}Q^>hjSfX`X(c9OF|F9q0;xja17MI2esc=iao6`g%%HhIApzrEGCfIlrFqekOhKzT zN$JX&6c_z$C+EKPpdhFE$NY^PZtL79vJ88dzcB4i^<#`)A0Ds|_Du8%avZv57KY>K z1;}Zj#50H}7yAaaZ<5&e@?J`ds(t%l2xXR`!WF8Lv$;=9JR~5#pn11)Z+sZM3BjUkP0<(2d~l)LN&PbmtScI zPUEF8Rr^nE?Xc8Sie$QTsj`js6r?SvbuUz!k3MDP%(Q=c>-_;WNUiavNUWVxJvup4 z;z1&EPFVho)(PV3%MAB0_70h$$FP1Wz&uJ%gSMx6W){`5==YMPAhy!ZfY)N!E8tWM zg_kC^@8(L-NT7R3g5#R_e)zX&YL#J;PO<5c@>Zgd~? zI`*}P35lCBx_7A0=&K5K%RKyvZkZ{v14iDhTSm_N*p@di>(a58Y}tY&5IEJZlEU=< z+RN}Tudy{=3%2at-imS3&MVDeV>fttv?eOJCY9?l`4Y`=84CMqy z7l_a~1zBs0Q@u&nZFDcE`bBwQIrTdzW}=8o*a=4$D3NWV#@JirapM*4mv(w&vmb>w z&Y9va9q9|Y=PS{782Ma<6OM>7R?>x~`Mvb7kp9V>3w6u-Owr2|UcXQzj_$?fNh2Ai zWLW{g%Zh84=gEt7`Fb73q|IHxaNw^&kH=Ssq?qd&3{%&i@i#2EsSHUcb zxrl-fQ4p-UY9ECDJ$9>90n)r(lDU`l*|r&`A4I@z_Ifh7ajHHp?i{0YAX21bzUMU_ zrBrfOx>~?F-}`hspS%fplIFfWjj2xVCwlQA?<9Zs488a{sMGf1od2m8A9{1$?&w}@ z@jiXRq@?xY7HL&5&|-XQRqaDpGIgHd>J~%}cjNf?;qIaG$l?6Z*^$FNLj9ut7$+($if@LCg{g(IG^|Dv! z1>c{Q4n_07&yV>L$gZ`XR>+3hHjkq7=shm=S$?Bg?}50xZW-K*HHVw~EKNGm<1t|L za+h*RDh>Wf8qBB`gmF9#NQ$>e*>z!es2e^f=69aM&n0(;a4L^}`5oOpBpYjq*qe)( z;q4gkP(qeNf^+*xi&ot_<43YN7T-i{{Z6EsgVRMmY+%2cC*GE@mZ8%iC3nfgnuO<0xOxQlRPqg6fzybGB!)^YGBa)+Dv zsR`W|iqqbFbb=_VLY_`YxR~S7YqZ_mF(!%{cb|FE7Q0?_3LF#-xNn%B+oX$v$b_Pd zxQZ6iHB`D%eY}-&yh7L8LVdjT+A8%)We-9D=vGTBV#|?wVDjp*Y(&bZMn-4CsuD8} zMM-#C^N_#nr9(#2pI>m?j-Hb2Xqh;VylFlfq!BBV%fNDcAlu zKUzmbJ7pG++wU^BeX8GthRWmsjQq{R1r3rR4&*YH_=127+k3o;hD*^c;duSO7uvyu zo|l~H=IQvbK&JyZpR7z@vc#)4y+HJ40xR9Tnx4^g)!?Ko>}5WA*6{-LaVGAXz^ZU8kw%KvW-hKsHs@(3Gfj!A(W}57hj$aDlgVjGG=rjH=^pKu72fkum1VpUdP=d1POk&@g%G zh1}uPysr>M_ZrP!SmD_E=66Gdv8Q=Q`~Fo|E}>r|{)#bC)~Ne_qxn>Fhgzmt?agan&Adonb9wEcUuW^^HCIWRUO!bj8qJ+A`ce0QnKT&fqlU}V8(-b+n%z>mT*FET1CJW90r<`tVd*mO}C+a{nTHg1nlEmb597Y z69xI{pAI0v@bIYLN2ECMHe*hF{M3&3`JKEBr%OA20(nlC^Ygyosk9JRg-L~0(mgdW zdnO$9&<9JpW|%<~Vr+?v-a(JDi5X@+Ob+7`USvdTO^DD-w@YMSm(Xbf!TlrqvaEmA z3G&)WMESf#{`X(7p53?1#>F{XZWORsKE+cs+i&>f9v00Z%ky^4-M`~06vQve=RKbj zP!F230uoj=G+ZEH?sam<5&EbD<}@N_1|mlip{{GIWE>^y7Wx8%@zMQ!ff!W^*dMpQ zE_>?|`3hezI7AOq>e!mGsPr*)OIJa-D+O<8FI&EVg0XKn#E8S!F?7-Rb|t-QxWeR5 zzY!olT;ZQsyPiYJtrStq#HsS)grB@Xd8?M|Kor{*x}Ez&YWxBCy?B`xtUJKVRjW?_lGCj*?{7Cs|SK!PjJ7!EBrnMck7Va=|?G=ABd4B2T91r8pmD5+a9 zS=?BEvqs$MS#Qo65x!%)$%U&0aV&N@GeBihO_fx0Db;Y~h-$j6$;k7n5fjV3S1~R; zH?EQ4SzCe!e}MO~;P3o2_?uu?3fc$!Ek~|zGUl4p^!)yOd2CP+M3GF0d!lQuk$DLm z{5(){z(S#aZ4oK3`@e_^d?*xlL;>eb6^d)NheY$V{HWPAUhfJK2tJvE718{!-|7kC z#cH&b2j_uxdco^@x${PtCspdj=A0xBqB_1LL;{Ma+|9g6dhudt4AACd4+Vu+j^>Z- z-;K^RnP6{weIOdWX+FQFa%?hBcS3AuKx&-yxNFaeOZusPT*viAI$e2?!~WHHcz-RH zfU`Jnj;)jDO82bd{iHhgiq5xU@Ym(liEwYPPY-XvlZHM$d!l#a!Pkm;3BCP~;JOc~ zr>XpOB+iSv`;7S2D>&{XOE8)}447C{>ecg)A`$eO%+1MqB)}ZwE1De5{wg&_j@#z> z%$ANiP^N<={&gnB^OhF~W5i!A_G&iMtYDdTS7{WwzSl>IZk58w0p zaA&fSdVxNTye*T(7{BnDe;^`jJEA{ivd+@UVq^v9MLQiJro!hw;_!urd3}Fupq;*9 zw$9LeJ7r)I>GV$^Hv$<~%7G@%blju*u*j0ajL<~sS%Fu}_Vspl47cq{{-Iuag;)D_ zFCB(a4{MrpZ7*AZTxps>*UD?D1+4qm2zMfW2SB~~XM5Yl5tJB%mb^#g82;*~dkZgU?PT_$gzNTTy{uAh=RB6r9RZ8VSD0*R)+}+C^m;{BQLPrwf+_XIONPiwa&SxhVv1Hr-bq%_jbRlew3=Nh?>zNqzLb<+5E; zipf<_7R@e^Tyt%%K2jqqD>eRpk-hk1tIcj#7Ut{U9o;{Q*G^w!7$*3Si%;n;_rr(~ z70tbX7r6)BDgQgzIMIMF;Qk=s8rhgtRQKaPjn3v$#?voI^9iCqj)xdpy+_8PgG8P!fHN=ObiB4BJ26wN-=q@m>xP$w*6S$`|_ty z{&ZD+&t}OU&7aeky*rzS>GE(H4*_`)U!A&`nB-YS~QvE*n5%9&JHDcU%lJuD7$cYp(M3fXFQTF#2_ zN!Hnq!*xqPOrF1JZbEe+kdgRD$L491bL-6@vokKzRc6+7wF7jj8+B+p8BVoQJhw>9 z$gpd|;R@m;w3JNj%h={*4tH^tE_35li|R<-Ds*OcD_=O=@>=F}wunsNt+s5WK(;mW zZ_9=*vDxA$*w2Sf0)|$2-^N-Pm6=b?`3E#5)fL(~cka0sAhl)Z-6`bKT+m(fMv*Y?)!$SYz%zfeJd7)ZdQik zD*b!D{w>wNBlT}T{oBp*J?9BVL%NC`0afe6J8-A^PzCtv!)6eGKJ0^i(1$QqOMRFs z#vCa=NicmR);{!KwfZ_e)?#z9%;`e{MoJ&PpL_^odeoGvWEa(-B#m_j(dwryG|xB+ zR$Qa{@-CrD9or=Ri(57*aDe_jQ~wT^F^4bn`14QZGsjZh@Xq_h|45&^!M*9j`_d0# zvn9tvq*6n#(D$^S%k^)C{!Q_c;${r8`{MsI_a@L$6s1 z5Rfzk>4uJg?1BnLF)Aucw*&~Aoe0gNUB+z~Hyn3I$6YaQ31JCD2!d>`;4)UzqUb0D z80hc!yY*hDvw-uR@BGjCa}MeE>eZ`Pb?esM>((wIc29Q!qTYRTUD^z3=UIqIaxsM< zwOW6-FRW1f%tzL^Y*xKExEY(G3Dn%Rj|v(N%`Sbp6eCDwf@NqaCYQa#b+|>1v}?sg zBykjI>U0n@Ms=l|tdws^othN6g=(06XmUNgwU}7GSE<&r9*E`9^)MF51gs{OV~tj; zE(i;%!}1lk>-F(3yxA0%H|E*2aW>RN;um$)dPEjFqONBzz`%h8=I>u zmz_!KU#%{d`rc_I{#MSKYW0||YicwPn{}J%x`bnzrb}#rK5euMjV9jGXkNcf4{T>E zc19GvQ)x6Dqc?gU7t|}-G8jt;Q9iW=K1^&?E71@p%a?&0G7Zy0p^7inHV*`6rS3@+ zeinu)mqWp-!2oO2rvN$UncN4v)p7P$%pTS{cpj3JI@Il=@cd#S;Mq=w;3)a4G{@{3 zAm3&zHzOZQ%OQh5^&iCW2UD*_4+vdH9%4_b)$W!u`pHBH-oJ|NI)H`=)K%>?j9%BZ z0MrR^YUo~9tIk9e0`+7Rs8eR>7nbN3PNya|X}2+X+<`hC_ffItalOzYnZ`}X_l(iO zW9Fh#Kwg{61qGp(MEOU=)f1wT7P>kxeOw)&^{OfWL1R;pR>AYXE-u%vPLwazsC9Vt z|AqIomUi~4Vzh&=)LUx`21ArZ*V=1{yurQ6QFblR9Az+j&;&<0ty~ZTv-6~#qv}}l z{{*u)U)M0JHmf%Uv%jF@O~9;tK6_lF?!&A9FEH~;JA0K2?KFhhTVNouFe?UQtAp9) z@@BPa!yYsZvwC*cbeaPpCz$3L%4~M>dzG(0Q>dByo7joXfxX*YI&_uTV^Fu9h5j|F zi+pY~VJ4VNbj2RUeOq(nAHz71S-V5G^zuZ=& zxz>Pf!nIyW1=rekeGJzEj{<8{D;eFj31kGm?4VP)6+#ZcvaX|*nis!8elh8_X_rNE zCo#aLzt7?BRaMP28v>V{U@A+b3KyYi(kFJjkuj<<->I(!|1N^aR?b;}4Wt7_8qcrB z*J5XufxmS#TV>YjgIZ0^Y(qL}?e%vVw;=QZmc(N;K0x+0k7>OP@-J>ylSuljv7fS> zMwLnsjfY_ZQCn>2Or^J&>hHltmy=V&Lc+%n{ENWZs{W~KT#Ykjq9g@`d@K~;6yjth z4ymF3djiSua2lP@d_Cz5()_JzhJL*>Qrj--q+7o5CX&moYP3A^B^i}rW>!owXJz_Y z^y?BlYp6FjjK!(bm(84#u(JUMwGv|y5*g@9`P*OqVw0L_#!_1Zr+TylP8DP4pqR0^ zr4UEIx}Jp>8QDHA8TLCaV5hp|aNG8A??Z1!MsM7G&pTM=0nHkisE!kw8v!mCY%6Lp zj`_{m=*`m!g(%_Nrb{lS6#~)qEczUh6Dq+Pb)2x~%bjryEguciwe?DYYo@;4AZGj) zUlx!dq{Kfz84VnTzZd6wb69^Q0)29D_aN_n#2qpD{Q3-d6nes93-S-%$ZphxE9&!d z%kI^rj5Pr5a}AZ?6Tsq3E+I>kID~MlI?TRQTCY}DvujP#ERH6WgU6@vZ*cj7bl`OJ zf&F~KASL8Y;t&`sK=})9H1bI>%+!ibXUF9Q^AkWOuzxmPGw>>P?PkPFl|nd3O~+hP zDnL?n$I#uXA^}5KkF5alSv=%UyhLwbNI$H(g9Z;TpooD@`&RZYZ7|4fY~4YkoXUoE z$ETETU*z#0n1)>+pYg7y#}E_8QQ z2kEMJsSBwf;=FxKT8r3MQxG^D&!HfipY~YFggB`UbiEt!mc=~%NDG^PP}RVb^>`t4 z5o=reTd19PkgOXV1qW@VJ62B;PY|%bv{`!lK6ZDj%h6jR3+Sw-y0^*70M#7;sutBF zFgKDrr6EuHl{?Fg&5G&l%!xzf!Zs3z0mxs+?M)4jHH7IMOQw!}G^B@=8$HHm5JBgP zZO#=6UvM)9;sbU}aKo3>YGXJb-^eXF=<6XXD45#gDR|<`&i+o!TvPi5vb2|AUtnY%{eID2|4q)n~7y3(Qf0xTJ4I7q=CPW zOJQp6iUU~m$gL1`t;q`x?yEj-gX3(!0J4u-jIIOP*^*_3KHUv@8Dk+6!wKXvE~EU2 zGcz|r`0dCotm%0x){CCc(OwW^u=z%ws&{$PIFfZt)u#jBieqx-q$61eP@He8IeShp zknu~dTh6iYS&v~G+3{>>37atH)IPXW6KWW$C<`T%(t*FO1Y3QnAG%l_(2V9vFN5hEF}jYKJ_&vewdDq6#B$4VKX zYYa4N=Pj8IVEEa|2`gR=MtzzIYhda71l^k!cb$|M5Z1(C6Wp?NxW9X>&xbX6fg;QHq92q+5 zmoxW)6cN-Lhwh6Piud`(q2F`6eIQ>2hHfMNr50nNL(@=(oW$|i$?sUkleqi~C&u}( zn>c@)dNKrBfqhd?Xi@z?ohAP=wmcmU_d)p$tD*3Mpnsvuo8=+hYCfTQGh3=a6~Lw6bU!OU5Sq5UXSE58HoNtCe;jX_EfQ*&P=60dZ0GrMs82DEWf}^Kj=14!Rda%kzzDrZt^7V52`wW?(b>hg2`@li3&6VC zgHgH&e^1c%b8AQ!!PI3zM5*7s9|K3{#yE|wQpebphwaDkuI2^z@xu?nE{NmD(FQ2Y zCJ;JiB0HZECfqCwnJ)DvG$*X|QnrhHC}jwOo=Dmp{1me(j7^32@NZb2jq;!*g+ z_1|<~68@wwZFFD2bjM~CVUb-CB35B_!P}6oO3p?=kH&xL7W#uaXG@*U&Nb;Wd)q?S zpjs3bSa$u;Ck+k-aO`*-;0WN{34jA|0yreW?lyvm5X0{w!U^z+2c+B^hg4BqP;(xT z@xp?J^SubGTz1mcB&Ebqbu&A$SJF8B=E>Q@+?N$cy1xwCb<44oT=V;97ruu zn-RuU6=ma*udSNUk+@A>=O~d)H1M|RL#3F&gbNK#PG7=Yq%~^zYTZURH2|#%F-sk8 zKI^rSeRh^#sqR0J z`k*D94^!4@nPd#X_u}?(d3%t*P_Mvf+7!tJh!sVBD)prnvi1tz#o9Z06}bx8>qKC2 zHj|tK_f1^RCB6{nWFhT=FPta?6bVdb*N@rQ&Nel;P@+iN5k2r_CgeE&Du-dNr(C_B z@Sd?Pv>#7oZK>mr3dlipdB!mYjJ%S1DSf4`*yhTd7Lp1=$Ioe)-6EhdIy@Vf7WHU{o5GOqJ>W8=SNBBAA z479ZR0rFQESer)~eHAN&KK>iHDCh+EJYwyTJoOIE=fPl$HZ!@t(5CEqFg%3Sw{eI9 z5@2lz9GRjjXd5Iv?opnCCm908~$-m*K|pLTzGPhI!Z2L z4X&eZykO@14!8hO1U9W3!_OlB8;-xlFRJ-k;|Y>|y@Qp+bjz8@5{o$|6VR{plb&u> z0eMBQ(5J-h0UlyUGmX@a(#X6vYV+Bc35f&+XY9Qxk{Y<5Yo{ub+V`)CaXGb)(n2(1 z)I?I#anJ5f#J&FH2K17VC>>%x*~|Ro*{A;G1nZL{@X7Z$ZIRS7tgo)c1;6?mykY$6 zOStD(zomC9n0g$a+*p#a1TXPL(1YIaB^}1`pG(s*kYMU?fgDUZO5MQ{E_+ytUPf&J z_S3vD@{`N(c1r2}FW?7>m!vQ^x%57L&y$gu+--|me4lI>Lb~z4>CfTJ1$7GwUFOLW z$WMsW-j0$Ntq-img$7S#v z=6L>&8*3c<`3f7{Bk$^T;pzrSv{)+-KE{K5W1XA|QKjbh`U&zM;9ZMpu$I3`8LKIP z=)9>y5Ztn9$_=IjtO4Ruar0WKU9o`#-1KFEa~Q}T2~YC`FWLA&qJ<)d?nwlKV&IX~ zA8<)SKNZ?4_3;_e)WxL)o;rzb66#k%3G1c}B%%*r?~HM)U2x0^vg9GN>=KR-Tji17 z^|m+>lHiLlwxC-Kj)d`uk`sb_(ATZfR}?l9r<%-}g;Akq{eorNIDK8;gr~z&8$oRUM1UAO1nkT>V=UStyW7y6{3}+bS(xW?Wl** zN~j#SZm|*UMsm0%15%jc4n8iz;>GvCp+2Dp@NCx_m`3<-u`6fWoz#s!cuhD!X*1|X zeLa*QQHvq?tp+bCzBpp{ft_s5H$E`~SV|ui&DRsZFpg5@I04{Q*`D~zc{?7rTahl8 z)9moX4`LY|S~B&9J^k9VfU&!fpAi>iqt1F%&A%B)jx!M7Lzctyv9Lb{V-(BL3%sD^ zXqm7|d+n!~fxqG2>TUf#)eQUIf63bU zJA8IwIOcL0?|LJ$DB{tbc%)i{xrqV1loCGqHsZ(PLJMvZz8!@D6taz#u`@q2g6%1QoWXjF}3)PFL?0ngB;o~@L1--^4fR)z z`kZ0;MF@vXeHI@k(zhKMwOI5}nTP`C>|)$dTJ#i8jemk>IL@MnA& zX^xQDR-@D6JpFD$LPCk-l2o&hl)hv{e=#%`Lpe$*Ygl}O9{U>5%HEOC{enfwUA%QGkhxgtiG0)lpVe%f{LV!7YJU5o{N_lR zo8oJxsXOB}t5vs{0o=%H5Le|LF_7R(zd0t}nc^s|m2Q#Ah7RJA63mjU_1I~-asWP< zcz~U9l+KrrTZW9#t-O^7O#4u0;RqE-hw5h#Q{N-Xnt&`Fho^u_Yitn@jli`#XPxga zCQP@gf!vtD>G466=@mcSaeMiH9RDsyKM(N?swr%u7TpbCARH24>^r^r4nG_l%?vRLB;Lg%DCr@^LM@{c;+z!j4xvbs17eG!RoTaSh&Q2B~v_@K;CZMYH=~0Lkx~ zNAF_&?~v9=cHtS!7w^p|WQyT*s#ua16bdlbCek3@z|8TYs~c;Du#znWQ?L89naTS= zqSQ{{HYf~sk5j3KqUlgyGgb>_J)qBq&%+z$z^c!(tq zm^40}-n{FFkkySyp&c!%#cNg7+<)D$RG^4Kq)&E5R_6j=C>zi&V;W>^{t{38;gc*9LZHfAG(&;mkWtllS=HO>h3@Q~1Y zXHkZQ`JqbP1R>Kn6vi1Xl5vf~$Ee$h;nX8=o&>7op$c)(I24QBrH2=Hum)%0ap~cC ze}ka~Vj_^XDb&kt?5))C{yZ?7>piQ7o< z5wqE73}~tG81ONS>hxo10zb@Hu6Zd$3S&|_x(sKuKPTR|2)ph!CJJJMMcnfWM-iL@ zR~nMyWWi+DI$KQD_YqGxc-SD@xNxFKtX|073QQA_^Gor@@a;`cFPdpGfEzTjCTf20 z?m%w<&7MK*7Gn>L*5F83;nB|{6KPV{nD1eND#K3#Kd?vL5Zov=65~Rj&H2B?4M612 z;HpLYP>X-TR%c$Hcm>zJx8J{F*?W74^a;9%?ch!HuH~kWU~1V2U5vFxLLmFqbJNh2sYBk4T38M+t;0?WU|4)g_2UyErDBt9 z_mXh6O6a=kxdG&AP=X;`eOpAkK+z$P3`s5wU6-^>eALkT{xcoiaZylIl(A~>%AX>J z?UDZ7<0Kmu1fjf*0oyX%tCyBikOBL#rQLv6h8%^KY`YCl%u3heGLkx_h(^KcfGrFR zRVU%Ri={vqlVM+qFNQwD>zsRVtC-0=c^s2D>oQKeVVi_{u4SoL@h7JuI*$qem3bT? zwTK)6G-c7Y`u<&GU@BgQZ3){nK;n#%E=K;rGLhiwcU>;*x`FHZIv#?ib{&q*$mYUq zz}5qI^mPU1;;n<2N4(;-atd1%CU9MLgYjuT(Xb!E8_j;u?_PQkf22R7ocuf*#!p^W zd0xEjh3mNxqMc;s;($EH&!|&%5^Q@eq#xbMzJJ=u(7i@9_fRBt@SU)hm21q>I2TDh zuZgl_zQ*+q*Dq@@_PW@-3xAl#@gp(~J3x`-i=02B_hD1X+@f}+P?z&HPdws3c|)^eX#vD_2*po013J%P6>{)XQ` z>QdA+b}vi44c}ija3ucn(;#_U)a?6!>X?U91esy|8MY31!Sr><#AZW()T_rour(^g zy-zCQJI}CPcbQ%dl>ysWT&lT?uw()@HI<)*a@HCZ{R6k*HqP74uw~a(KNpvg)NTN0 zj_q|k_qFg3O#h=h>cQ_3+Ku*mmj}*rpk$ftDLgmq%lOy!5dOBZJ;1*e%WQYxSM|J_ zlA&Yy3ciG}m2*Sabc4pc7=+V)Eh+%$E||=EA5>GRb`{ts0p)V+6Yv*1zYlAWCc+5v z);hw{ZM?jWu++eh1X6nvLk;^GXo@Swrh43qQPL6$sEWXIM&fa2PNeu=|GC%vjv<8l zL+$aOJDS%<XaRk{}GhS`!m2J{cI2tp=SLiUj6>BETjRSa3lsWgx9n9hVE4 zwW+h|$Pro&IyZ}0X)HN}`J!FSHcj6veIG-skE*UqNb;*7l_}%q=y9xYP{xJ3s~!j- z2bz%?)Tn0+@ z#c!w=wQEDiB67nRca;N|T?0>|A|Qc@MBZaL?QexV2t2lyXHW1`mTfgPAZ=F=X+VOZ zsIK6UU4gsgr!n!>@DceSHNVlj1P|VopHsbS*i!LcV7WCu-Bx^~wm4k0B|oQVD`4*r zT&(;=raNHkjy1K+7C}r75K}C%2G(D5mfAxsjpeb#Qyfo{JC#abFSmb<81z5@x2r8# zT5+R?v!%KT@#CDqvs{60@*(Om_I|5`vA3kUx}}e(t93%XmY-5DMCT0KP5APX`RB&@ zx-OZYfykS|=}6U6esNw-IbG!T+TYPa1PNVDa?kSLacD(k!{Chg08Rn}Ej8@hpOVl0 zhn2_g3^BejyzLWs&zTT30%b87I^xFo*V5q|HRQ&G4Zy|mUx&7BqggfH;sr*w2>{+-k4&qY8_HP$tq`)=% z5KD8&6&$w@kw8kVZ%>>adWZ=}A-oOU2hhQ_pj?ijdzer8({nUz0Z<5G`6>)vj*}#H z_!h>K4g^KFcF{4plo$YQv0>O#_dAh!SrkC>Z(pdK0CG8kaJV z5b<4;(-B0N={6R?M*JOJ5$5^k!dZI5Q&!^vL@|WsG6NZU zznRB6j&eqJxcV&+nzR5kNo2RkhzkM>>PaVcbES7IGf9gcQ zVd_-=!33afOiW%zCN8GZbFC%<2LMo5T|rDF%Hqn!a1fS<2Wu7pV;B{5%lbz351MIx z7Z>+tqfqPSmQA9L7ht0d=!T?Dgl-VD@0|>;mWfzutR734Fa24Bz$-4Ks2H?wK$S>p z(QTmkLHmBzul=oF{kL`f4rcwWQs0I8`0Rg{*>1uM^T+xfgU4hk^CGKH5wE>nEEvCwDM`sdIe;nsm|P;QY%ul6F?@z`hqPxH_L&bdReFtzW7jp`ubb;8Yzfix zJ>5oO3W$f>D1z?29(z1I#(o#}$(X)p?3K|TZ1{VAsRaf!|AWID`^zC!`lJG^1kCKpxEef_*xx5$yr58`fVL)nm?}FnIV`WAOUdW>yqaQc}&3H=iTXIq^dEi?;N`t#Msp03rBO zKn5{8qqy`WfYSZfi zSHVIAE+B7R^WKNuStl9Ze*|UiU5O`MIY$-_L{tS1`uu~Y#u5JFUJ4=wSZyw{Fg8=p z|5DyB_nwEjg;_GmfwMVbgwzQHb#iCX;yw)I4?B>zlqCl7Ro|?9o_UGxwMg_X}!01+b>zymE!qG$u~r+-l>jd+q^e zdg{N#Gc4{MYWz}(-7H~-IG1rvva8?w6tW$q5(H&zQIilm3uU!*6)J!ak!k#lK~a-_@uGt>VDnmLhr<_A2&vEqoF;jwC}hLz9*0DZb@ z$L{bO-PsA50_J5fr+~i1Fy9FuH>>G~_8q~_AW=1J6%lm^Aqu80N6*5oh9UP7Zr&ua zT+04!Vr#Ksc9^Ay@HQ%KMJ2qe+OXbJ{LJsz*r%=gX7&wh7*wm=IlC7k7TG=lZ(kW~ zeKA^i3oY=As(KSV^V2Z%JYsiyzVS_d)^2yjw>Y+offjex;-q=3&V+nA1Ojbvu>0a4 z+^7+NvSy-!C248R;sTo2V{Pj=5E`cS(#Ya}TQ68ER=bOGxn>)ZB%zZ$`5bagy33fC z3}FDfUG9X0;>tPZD0yC7<~8a}WS8L_JRBHCu;zgOD}fguRY@p`P!dWe6rSNZNAIfDZ;OtzxqU1^pQ}~AEhyox#c5Rd_od^^&?MivK+BG}&&WNz$JKe0%fDZ_{1q-&Vm0HUN4OmCB()9aqiXV> zSA92WbolH)Y0pTyAKQ82<7PM4`B&`&aTC|M+`sRnzr0yqVmUnmIlCMyDYLr^s>&7< z0Y|*Z6|1;5&eW@c$0fw9hG%eVAejJQ*fAh0(u}| zaNP9(#pm#ZSwWku`w z?XBVjUHp+QPO*xSB#5=2*Tt=^;v`*spDs?eifsT|v#?91Wp;n`%%^)+h=k`82{3n<9|H5XwZ{|Ziq>%$5ns|Nxg0CySd0d&fZMT+ zo#0w;K}1kzOhOpo8|2g00&>si0s<*D3uO_#JWm(i%|alva@=RFAVNkja(z#C&<3gWNJ>96T zT?W$Dst!#y>Pl_gD11X9?4Hmvs7YBTB})R5)TH}JAwT!tK+0BGD3lZGd$b&p5Y_6R zy8I%PX9RTpJ}iGgmxF-_r_IJr6HwH>cY~tNs04dSCk|wj_I@}Q!IbvsZA+Pbu|b?A z$0OLDB^%2_<)HmG5lptJP2(xbPKh32`H3fJv)>FK>ADVJ?l_BL0j}5JT5O?<@7JbG z&>>oEVGFa}A%+Ba?PEgLg;~Yuxsb_cWFV9aAtMu_ddbqCMhRK6{rhG(-FhS9t0W^= zN-T!7#bhkwIk=TK3D}04jHL(CC;<%HO96%(*J{SHQorB(6BVvF2vPX441NJt8w3j8 z3Nd(&%e2~Pg@J(TO9=alg!z16LathE10XTPf11o^9DK$qJ;)H9CY zA85oFmadlyNizA;IiRDd&a*c*;7T=IZX>~!y7UOcah&{T_1^7rb2$C9O&MKY9BORI zquOa|LcKRRBUdGpk1>)bmv&+~SUnzL#{Tl8aHplmV>wtWXU2^|p>ndl1rjEhEK%Q)>=2Rq*Bb5VFW;r3@0-|aIi-2L>88GT*{ z3G4d>=9wzwhQujO**xh^{8GSa?BYI^1@Vzl1ZLib#49BrXhg8f0OyA03uti=_-1We z5x+dCr91JHl5*egjbV;aZ%AAi5;WPh6vlf<55*f2#~GXP`A*{Rq__;l zF&wiM`h?2QpcIcQLKe$3%U4?E7SA-xy;ix!@>m`|4}AdaXZPEX2;Rs}cu>#mgjo~) zKzSdOvqnY8Vz1Ibvki$wZsQwNI3rpi$z+S>myeZnjRW5RZ&=t_ zDziWfyqXN9-pDF^&f$^okcq!=9`VTF^ zHn$A~U~YX|h<;}a2lJPX7_TW)io4P#e+pAL*a8DqgKS1Dqs$LugNyAD0tGUcpHDQ((DtZc0)7<2I)W(s{kW}ZfzMQh9sq0qNQAXn^ zJw}PuYUK9Wx)B~%PthYgICGFIs~CfXrLIOze!?20qhu`!!vDoU5vFt*x>kR%ePpnG zFxcGXec+rxHmPrlzYMiOMW_$X_h^?2-Jb&f?G(>MsFc^Howsh2WiDb3D5qAbo4)|- zJp&wQ)M6k3;)xYV|M#8DxJ1Nz5bt979@@g}+m2puGCKm!umptfmJyRaca-P=z-sjb zGQ3cnOBc*b{X#$Y4kNp|OP=|1Oo5Cj^)mk8a4M0DOf{3qrNUB*Ar}eo~R)vFYIpdWNp9!k?x%G zg*{xsq?SvHv(uN%?h4^AI~_zYBQ9>bGpiy}IX#d!HWM0+|9Da{G}V~RLZx5$+Tsfk zkanxHK8K<`lsHy^{qg7-Y*8{J>QRWE!WGUZvIUc{SDU7w*M0=B9aqL+8V93Zk)hOK znhYn&EYz4blFDSMAN+ijjBJmzzDckULl4UB zRux%=gVbRv2Y*X<1Xlx*JX!0VujfL~YLcZ_G+^mbMYDZTyU$ST>Re>jF zNCEsESGtr95e23=SB8RIpv8HMX(pVRt}c;hS{&(sPSNUHrN&GIlza0|W!>*+hqbagjt;{O%#;h&u=nq?dsu+MjibHx?$8RY|(__A=7 zAXnX^_59yC{QCw~eAl{SU$aE{asuuX_cVl8&>xo>i42Uu%0D*~^WSW^SO*;?y?{6Q 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